From 810dc26ff273f1aecb9363978c2f92051517bc7b Mon Sep 17 00:00:00 2001 From: Reiase Date: Sat, 20 Jun 2026 18:41:51 +0800 Subject: [PATCH 01/37] Update .gitignore, pre-commit configuration, and enhance Cargo files (#47) - Updated .gitignore to exclude new directories and files related to Python probing extensions and added patterns for temporary files. - Modified .pre-commit-config.yaml to enable `cargo-clippy` and `cargo-fmt` hooks for Rust code linting and formatting. - Enhanced Cargo.toml and Cargo.lock to include new dependencies and features, improving the overall project structure. - Introduced a new clippy.toml file for shared Clippy settings to standardize linting across the project. - Updated documentation to reflect changes in the development setup and project structure. --- .github/workflows/pypi.yml | 12 +- .github/workflows/test.yml | 17 +- .gitignore | 5 +- .pre-commit-config.yaml | 23 +- Cargo.lock | 40 +- Cargo.toml | 13 +- Makefile | 366 ++++++------ README.cn.md | 84 +-- README.md | 88 +-- clippy.toml | 4 + conftest.py | 6 +- docs/Makefile | 4 +- docs/README.md | 3 +- docs/mkdocs.yml | 33 +- docs/overrides/home.html | 33 +- docs/src/api-reference.md | 322 ++++------- docs/src/api-reference.zh.md | 256 +++++---- docs/src/contributing.md | 333 +++++++---- docs/src/contributing.zh.md | 331 +++++++---- docs/src/design/cluster-pulsing.md | 156 ++---- docs/src/design/cluster-pulsing.zh.md | 4 +- docs/src/design/data-layer.zh.md | 4 +- docs/src/design/debugging.md | 14 +- docs/src/design/debugging.zh.md | 30 + docs/src/design/distributed.md | 88 ++- docs/src/design/distributed.zh.md | 85 ++- docs/src/design/extensibility.md | 515 +++++++++++------ docs/src/design/extensibility.zh.md | 522 ++++++++++++------ docs/src/design/index.md | 7 + docs/src/design/index.zh.md | 19 +- docs/src/design/modularity.md | 419 ++++++++++++++ docs/src/design/modularity.zh.md | 352 ++++++++++++ docs/src/design/nccl-profiler.md | 157 ++++++ docs/src/design/nccl-profiler.zh.md | 142 +++++ docs/src/design/profiling.md | 15 +- docs/src/design/profiling.zh.md | 16 +- docs/src/examples/index.md | 12 +- docs/src/examples/index.zh.md | 18 +- docs/src/examples/performance-analysis.md | 43 +- docs/src/examples/performance-analysis.zh.md | 43 +- docs/src/examples/training-debugging.md | 10 +- docs/src/examples/training-debugging.zh.md | 10 +- docs/src/guide/concepts.md | 166 ++++++ docs/src/guide/concepts.zh.md | 162 ++++++ docs/src/guide/debugging.md | 15 +- docs/src/guide/debugging.zh.md | 7 +- docs/src/guide/index.md | 81 +-- docs/src/guide/index.zh.md | 77 +-- docs/src/guide/memory-analysis.zh.md | 7 +- docs/src/guide/skills.md | 89 +++ docs/src/guide/skills.zh.md | 78 +++ docs/src/guide/sql-analytics.md | 60 +- docs/src/guide/sql-analytics.zh.md | 55 +- docs/src/guide/troubleshooting.md | 25 +- docs/src/guide/troubleshooting.zh.md | 67 ++- docs/src/index.md | 43 +- docs/src/index.zh.md | 42 +- docs/src/installation.md | 113 ++-- docs/src/installation.zh.md | 109 ++-- docs/src/quickstart.md | 65 +-- docs/src/quickstart.zh.md | 65 +-- docs/src/reference/index.md | 11 + docs/src/reference/index.zh.md | 11 + docs/src/reference/sql-tables.md | 303 ++++++++++ docs/src/reference/sql-tables.zh.md | 272 +++++++++ docs/src/versions.md | 121 ++-- docs/src/versions.zh.md | 120 +--- examples/README.md | 37 ++ playbooks/README.md | 185 ------- playbooks/catalog.yaml | 85 --- probing/cli/Cargo.toml | 1 + probing/cli/src/cli/commands.rs | 4 +- probing/cli/src/cli/ctrl.rs | 25 +- probing/cli/src/cli/doctor/mod.rs | 73 --- probing/cli/src/cli/mod.rs | 15 +- .../src/cli/{doctor => skill}/interpret.rs | 2 +- .../cli/src/cli/{doctor => skill}/loader.rs | 192 +++++-- probing/cli/src/cli/skill/mod.rs | 155 ++++++ .../cli/src/cli/{doctor => skill}/runner.rs | 36 +- probing/cli/src/inject/injection_aarch64.rs | 34 ++ probing/cli/tests/test_aarch64.rs | 111 ---- probing/core/Cargo.toml | 16 + probing/core/src/core/arrow_convert.rs | 15 + probing/core/src/core/engine.rs | 22 +- probing/core/src/core/federation/convert.rs | 83 ++- .../core/federation/federated_scan_exec.rs | 2 +- probing/core/src/core/federation/mod.rs | 3 +- probing/core/src/core/federation/rewrite.rs | 13 +- probing/core/src/core/memtable_sql.rs | 17 +- probing/crates/store/Cargo.toml | 1 + probing/extensions/cc/Cargo.toml | 1 + .../extensions/cc/src/extensions/cluster.rs | 2 + .../cc/src/extensions/cpu/collector.rs | 1 + .../cc/src/extensions/cpu/extension.rs | 2 +- .../cc/src/extensions/cpu/sampler.rs | 2 +- probing/extensions/cc/src/extensions/rdma.rs | 132 +++-- probing/extensions/gpu/Cargo.toml | 1 + .../gpu/src/extensions/backend/apple/mod.rs | 2 +- .../gpu/src/extensions/backend/registry.rs | 27 +- .../gpu/src/extensions/extension.rs | 2 +- probing/extensions/nccl-profiler/Cargo.toml | 24 + probing/extensions/nccl-profiler/README.md | 129 +++++ .../extensions/nccl-profiler/src/abi/mod.rs | 20 + .../nccl-profiler/src/abi/net_ib_v1.rs | 57 ++ .../nccl-profiler/src/abi/profiler_v3.rs | 177 ++++++ .../extensions/nccl-profiler/src/events.rs | 316 +++++++++++ probing/extensions/nccl-profiler/src/lib.rs | 48 ++ .../extensions/nccl-profiler/src/plugin.rs | 186 +++++++ probing/extensions/nccl-profiler/src/pool.rs | 95 ++++ probing/extensions/nccl-profiler/src/role.rs | 63 +++ probing/extensions/nccl-profiler/src/state.rs | 397 +++++++++++++ .../extensions/nccl-profiler/src/tables.rs | 39 ++ .../extensions/nccl-profiler/src/writer.rs | 192 +++++++ probing/extensions/python/Cargo.toml | 1 + .../extensions/python/src/extensions/pprof.rs | 21 +- .../python/src/extensions/python.rs | 15 +- .../python/src/extensions/python/exttbls.rs | 144 +++-- .../python/src/extensions/python/tbls.rs | 14 +- .../extensions/python/src/extensions/torch.rs | 22 +- .../python/src/features/flamegraph.rs | 39 +- .../extensions/python/src/features/pprof.rs | 16 +- .../python/src/features/python_api.rs | 15 +- .../python/src/features/stack_tracer.rs | 10 + .../extensions/python/src/features/torch.rs | 67 ++- .../extensions/python/src/features/tracing.rs | 2 +- probing/extensions/python/src/python.rs | 8 +- probing/extensions/python/src/repl/mod.rs | 2 + probing/extensions/python/src/repl/session.rs | 27 + probing/extensions/python/src/setup.rs | 17 +- probing/memtable/Cargo.toml | 1 + probing/memtable/src/memtable.rs | 18 + probing/memtable/src/raw.rs | 11 +- probing/memtable/tests/smoke.rs | 26 - probing/proto/src/protocol/cluster.rs | 8 +- probing/proto/tests/basic_tests.rs | 54 -- probing/server/API.md | 30 +- probing/server/Cargo.toml | 2 +- probing/server/src/asset.rs | 66 ++- probing/server/src/auth.rs | 15 +- probing/server/src/engine.rs | 11 +- probing/server/src/extensions.rs | 3 + probing/server/src/memtable_ext.rs | 2 +- probing/server/src/report.rs | 3 + probing/server/src/server/api/extension.rs | 2 +- probing/server/src/server/api/mod.rs | 10 +- probing/server/src/server/api/response.rs | 12 +- probing/server/src/server/middleware.rs | 15 +- probing/server/src/server/mod.rs | 5 +- probing/server/src/server/profiling.rs | 52 -- probing/server/src/server/repl.rs | 10 +- probing/server/src/server/spa.rs | 24 +- probing/server/src/server/system.rs | 2 +- probing/server/src/server/training.rs | 8 +- pyproject.toml | 14 +- pytest.ini | 43 -- python/probing/__init__.py | 84 ++- python/probing/_entrypoint.py | 55 ++ python/probing/_skills.README.md | 14 + python/probing/_skills/README.md | 14 + python/probing/_skills/catalog.yaml | 145 +++++ .../probing/_skills/comm_bottleneck/SKILL.md | 30 + .../_skills/comm_bottleneck/steps.yaml | 26 +- python/probing/_skills/gpu_pressure/SKILL.md | 28 + .../probing/_skills/gpu_pressure/steps.yaml | 4 +- .../probing/_skills/health_overview/SKILL.md | 28 + .../_skills/health_overview/steps.yaml | 8 +- python/probing/_skills/install.sh | 14 + python/probing/_skills/memory_leak/SKILL.md | 30 + .../probing/_skills/memory_leak/steps.yaml | 2 +- .../_skills/module_bottleneck/SKILL.md | 30 + .../_skills/module_bottleneck/steps.yaml | 4 +- .../_skills/nccl_culprit_victim/SKILL.md | 33 ++ .../_skills/nccl_culprit_victim/steps.yaml | 198 +++++++ .../probing/_skills}/semantic/intents.yaml | 23 +- .../probing/_skills}/semantic/pages.yaml | 28 +- .../probing/_skills}/semantic/tables.yaml | 51 +- python/probing/_skills/slow_rank/SKILL.md | 31 ++ .../probing/_skills/slow_rank/steps.yaml | 33 +- python/probing/_skills/training_hang/SKILL.md | 28 + .../probing/_skills/training_hang/steps.yaml | 6 +- python/probing/cli/__main__.py | 2 + python/probing/dev_pth.py | 71 +++ python/probing/ext/torch.py | 4 - python/probing/libs/.gitkeep | 1 + python/probing/nccl/__init__.py | 79 +++ python/probing/nccl/__main__.py | 74 +++ python/probing/nccl/mock.py | 232 ++++++++ python/probing/parallel.py | 131 +++++ python/probing/playbooks/__init__.py | 43 -- python/probing/playbooks/__main__.py | 28 - python/probing/playbooks/test_loader.py | 62 --- python/probing/profiling/collective/record.py | 26 +- python/probing/profiling/torch/__init__.py | 8 +- python/probing/profiling/torch/step.py | 32 -- python/probing/profiling/torch_probe.py | 24 +- python/probing/profiling/types.py | 48 +- python/probing/site_hook.py | 118 ++++ python/probing/skills/README.md | 39 ++ python/probing/skills/__init__.py | 75 +++ python/probing/skills/__main__.py | 46 ++ python/probing/skills/install.py | 252 +++++++++ .../{playbooks => skills}/interpret.py | 2 +- .../probing/{playbooks => skills}/loader.py | 278 ++++++---- python/probing/skills/paths.py | 273 +++++++++ python/probing/skills/tools.py | 204 +++++++ python/probing/torchrun_cluster.py | 23 + python/probing/web_assets.py | 51 ++ python/probing_hook.py | 147 +---- skills/README.md | 64 +++ skills/catalog.yaml | 145 +++++ skills/comm_bottleneck/SKILL.md | 30 + skills/comm_bottleneck/steps.yaml | 142 +++++ skills/gpu_pressure/SKILL.md | 28 + skills/gpu_pressure/steps.yaml | 104 ++++ skills/health_overview/SKILL.md | 28 + skills/health_overview/steps.yaml | 107 ++++ skills/install.sh | 14 + skills/memory_leak/SKILL.md | 30 + skills/memory_leak/steps.yaml | 145 +++++ skills/module_bottleneck/SKILL.md | 30 + skills/module_bottleneck/steps.yaml | 114 ++++ skills/nccl_culprit_victim/SKILL.md | 33 ++ skills/nccl_culprit_victim/steps.yaml | 198 +++++++ skills/semantic/intents.yaml | 44 ++ skills/semantic/pages.yaml | 76 +++ skills/semantic/tables.yaml | 139 +++++ skills/slow_rank/SKILL.md | 31 ++ skills/slow_rank/steps.yaml | 185 +++++++ skills/training_hang/SKILL.md | 28 + skills/training_hang/steps.yaml | 114 ++++ tests/README.md | 42 ++ tests/conftest.py | 52 +- tests/regression/conftest.py | 57 ++ tests/{ => regression}/core/test_config.py | 0 tests/{ => regression}/core/test_engine.py | 0 .../core/test_global_federation.py | 0 tests/{ => regression}/core/test_init.py | 0 .../core/test_torchrun_cluster.py | 0 tests/{ => regression}/ext/__init__.py | 0 .../ext/test_collective_autostart.py | 0 .../ext/test_comm_collective.py | 0 .../ext/test_parallel_topology.py | 0 tests/{ => regression}/ext/test_python_ext.py | 0 .../ext/test_python_tracer.py | 0 .../{ => regression}/ext/test_step_context.py | 0 .../{ => regression}/ext/test_tracing_span.py | 0 .../inspect/test_trace_helpers.py | 0 tests/regression/nccl/test_nccl_mock.py | 127 +++++ .../regression/nccl/test_nccl_plugin_path.py | 65 +++ tests/regression/nccl/test_nccl_skill.py | 114 ++++ .../profiling/test_torch_probe_sampling.py | 27 +- tests/{ => regression}/repl/__init__.py | 0 .../{ => regression}/repl/test_help_magic.py | 6 +- .../{ => regression}/repl/test_query_magic.py | 4 +- tests/regression/rust/Cargo.toml | 82 +++ tests/regression/rust/build.rs | 12 + .../rust/probing/cli/inject_aarch64.rs | 47 ++ .../core}/distributed_storage_integration.rs | 0 .../probing/core}/engine_complex_tests.rs | 4 +- .../probing/core}/extension_routing_spec.rs | 3 +- .../rust/probing/core}/federation_tests.rs | 69 ++- .../rust/probing/memtable}/chaos_stress.rs | 0 .../rust/probing/python/py_to_table.rs} | 0 .../probing/server}/auth_complex_tests.rs | 0 .../probing/server}/file_api_complex_tests.rs | 32 +- .../server}/training_observability_tests.rs | 1 + tests/regression/rust/src/lib.rs | 8 + .../regression/rust/src}/test_helpers.rs | 0 tests/regression/skills/test_install_tools.py | 100 ++++ tests/{ => regression}/spec/api_spec.json | 54 +- .../{ => regression}/spec/client_contract.py | 17 +- tests/{ => regression}/spec/spec_loader.py | 2 +- tests/{ => regression}/spec/test_api_spec.py | 6 +- .../{ => regression}/tbls/test_python_tbls.py | 0 .../training_observability/README.md | 10 +- .../training_observability/__init__.py | 0 .../training_observability/conftest.py | 5 +- .../test_collective_policy.py | 0 .../test_collective_recording.py | 0 .../test_collective_tracer_hook.py | 0 .../test_step_straggler_sql.py | 0 .../test_topology_context.py | 6 +- .../test_training_iteration_e2e.py | 2 +- .../test_training_sql_integration.py | 2 +- tests/unit/conftest.py | 17 + tests/unit/probing/.gitkeep | 0 .../probing}/handlers/test_python_handlers.py | 6 +- .../probing/hooks}/test_import_hook.py | 0 .../unit/probing/skills}/test_interpret.py | 4 +- tests/unit/probing/skills/test_loader.py | 62 +++ tests/unit/probing/test_dev_pth.py | 37 ++ tests/unit/probing/test_web_assets.py | 54 ++ web/DESIGN.md | 4 +- web/src/agent/cluster.rs | 6 +- web/src/agent/interpret.rs | 6 +- web/src/agent/llm.rs | 38 +- web/src/agent/mod.rs | 16 +- web/src/agent/page_tools.rs | 2 +- web/src/agent/routing.rs | 54 +- web/src/agent/runner.rs | 38 +- web/src/agent/{playbook.rs => skill.rs} | 94 ++-- web/src/agent/source_bridge.rs | 28 +- web/src/api/profiling.rs | 19 +- web/src/api/trace.rs | 50 +- web/src/app.rs | 10 +- web/src/components/agent/chat.rs | 107 ++-- web/src/components/agent/mod.rs | 2 +- web/src/components/agent/step_card.rs | 8 +- web/src/components/agent/view_route.rs | 2 +- web/src/components/global_command_panel.rs | 2 +- web/src/components/page_context_sync.rs | 2 +- web/src/components/sidebar/mod.rs | 4 +- web/src/components/source_viewer.rs | 10 +- web/src/hooks/mod.rs | 4 +- web/src/pages/training.rs | 23 +- web/src/state/agent.rs | 34 +- web/src/state/page_context.rs | 12 +- web/src/state/profiling.rs | 2 +- web/src/state/ui_tasks.rs | 8 +- web/src/utils/markdown.rs | 2 +- 320 files changed, 13423 insertions(+), 4176 deletions(-) create mode 100644 clippy.toml create mode 100644 docs/src/design/modularity.md create mode 100644 docs/src/design/modularity.zh.md create mode 100644 docs/src/design/nccl-profiler.md create mode 100644 docs/src/design/nccl-profiler.zh.md create mode 100644 docs/src/guide/concepts.md create mode 100644 docs/src/guide/concepts.zh.md create mode 100644 docs/src/guide/skills.md create mode 100644 docs/src/guide/skills.zh.md create mode 100644 docs/src/reference/index.md create mode 100644 docs/src/reference/index.zh.md create mode 100644 docs/src/reference/sql-tables.md create mode 100644 docs/src/reference/sql-tables.zh.md create mode 100644 examples/README.md delete mode 100644 playbooks/README.md delete mode 100644 playbooks/catalog.yaml delete mode 100644 probing/cli/src/cli/doctor/mod.rs rename probing/cli/src/cli/{doctor => skill}/interpret.rs (99%) rename probing/cli/src/cli/{doctor => skill}/loader.rs (50%) create mode 100644 probing/cli/src/cli/skill/mod.rs rename probing/cli/src/cli/{doctor => skill}/runner.rs (92%) delete mode 100644 probing/cli/tests/test_aarch64.rs create mode 100644 probing/extensions/nccl-profiler/Cargo.toml create mode 100644 probing/extensions/nccl-profiler/README.md create mode 100644 probing/extensions/nccl-profiler/src/abi/mod.rs create mode 100644 probing/extensions/nccl-profiler/src/abi/net_ib_v1.rs create mode 100644 probing/extensions/nccl-profiler/src/abi/profiler_v3.rs create mode 100644 probing/extensions/nccl-profiler/src/events.rs create mode 100644 probing/extensions/nccl-profiler/src/lib.rs create mode 100644 probing/extensions/nccl-profiler/src/plugin.rs create mode 100644 probing/extensions/nccl-profiler/src/pool.rs create mode 100644 probing/extensions/nccl-profiler/src/role.rs create mode 100644 probing/extensions/nccl-profiler/src/state.rs create mode 100644 probing/extensions/nccl-profiler/src/tables.rs create mode 100644 probing/extensions/nccl-profiler/src/writer.rs create mode 100644 probing/extensions/python/src/repl/session.rs delete mode 100644 probing/memtable/tests/smoke.rs delete mode 100644 probing/proto/tests/basic_tests.rs delete mode 100644 probing/server/src/server/profiling.rs delete mode 100644 pytest.ini create mode 100644 python/probing/_entrypoint.py create mode 100644 python/probing/_skills.README.md create mode 100644 python/probing/_skills/README.md create mode 100644 python/probing/_skills/catalog.yaml create mode 100644 python/probing/_skills/comm_bottleneck/SKILL.md rename playbooks/diagnostics/comm_bottleneck.yaml => python/probing/_skills/comm_bottleneck/steps.yaml (81%) create mode 100644 python/probing/_skills/gpu_pressure/SKILL.md rename playbooks/diagnostics/gpu_pressure.yaml => python/probing/_skills/gpu_pressure/steps.yaml (97%) create mode 100644 python/probing/_skills/health_overview/SKILL.md rename playbooks/diagnostics/health_overview.yaml => python/probing/_skills/health_overview/steps.yaml (94%) create mode 100755 python/probing/_skills/install.sh create mode 100644 python/probing/_skills/memory_leak/SKILL.md rename playbooks/diagnostics/memory_leak.yaml => python/probing/_skills/memory_leak/steps.yaml (99%) create mode 100644 python/probing/_skills/module_bottleneck/SKILL.md rename playbooks/diagnostics/module_bottleneck.yaml => python/probing/_skills/module_bottleneck/steps.yaml (98%) create mode 100644 python/probing/_skills/nccl_culprit_victim/SKILL.md create mode 100644 python/probing/_skills/nccl_culprit_victim/steps.yaml rename {playbooks => python/probing/_skills}/semantic/intents.yaml (59%) rename {playbooks => python/probing/_skills}/semantic/pages.yaml (68%) rename {playbooks => python/probing/_skills}/semantic/tables.yaml (59%) create mode 100644 python/probing/_skills/slow_rank/SKILL.md rename playbooks/diagnostics/slow_rank.yaml => python/probing/_skills/slow_rank/steps.yaml (82%) create mode 100644 python/probing/_skills/training_hang/SKILL.md rename playbooks/diagnostics/training_hang.yaml => python/probing/_skills/training_hang/steps.yaml (96%) create mode 100644 python/probing/dev_pth.py create mode 100644 python/probing/libs/.gitkeep create mode 100644 python/probing/nccl/__init__.py create mode 100644 python/probing/nccl/__main__.py create mode 100644 python/probing/nccl/mock.py delete mode 100644 python/probing/playbooks/__init__.py delete mode 100644 python/probing/playbooks/__main__.py delete mode 100644 python/probing/playbooks/test_loader.py delete mode 100644 python/probing/profiling/torch/step.py create mode 100644 python/probing/site_hook.py create mode 100644 python/probing/skills/README.md create mode 100644 python/probing/skills/__init__.py create mode 100644 python/probing/skills/__main__.py create mode 100644 python/probing/skills/install.py rename python/probing/{playbooks => skills}/interpret.py (99%) rename python/probing/{playbooks => skills}/loader.py (53%) create mode 100644 python/probing/skills/paths.py create mode 100644 python/probing/skills/tools.py create mode 100644 python/probing/web_assets.py create mode 100644 skills/README.md create mode 100644 skills/catalog.yaml create mode 100644 skills/comm_bottleneck/SKILL.md create mode 100644 skills/comm_bottleneck/steps.yaml create mode 100644 skills/gpu_pressure/SKILL.md create mode 100644 skills/gpu_pressure/steps.yaml create mode 100644 skills/health_overview/SKILL.md create mode 100644 skills/health_overview/steps.yaml create mode 100755 skills/install.sh create mode 100644 skills/memory_leak/SKILL.md create mode 100644 skills/memory_leak/steps.yaml create mode 100644 skills/module_bottleneck/SKILL.md create mode 100644 skills/module_bottleneck/steps.yaml create mode 100644 skills/nccl_culprit_victim/SKILL.md create mode 100644 skills/nccl_culprit_victim/steps.yaml create mode 100644 skills/semantic/intents.yaml create mode 100644 skills/semantic/pages.yaml create mode 100644 skills/semantic/tables.yaml create mode 100644 skills/slow_rank/SKILL.md create mode 100644 skills/slow_rank/steps.yaml create mode 100644 skills/training_hang/SKILL.md create mode 100644 skills/training_hang/steps.yaml create mode 100644 tests/README.md create mode 100644 tests/regression/conftest.py rename tests/{ => regression}/core/test_config.py (100%) rename tests/{ => regression}/core/test_engine.py (100%) rename tests/{ => regression}/core/test_global_federation.py (100%) rename tests/{ => regression}/core/test_init.py (100%) rename tests/{ => regression}/core/test_torchrun_cluster.py (100%) rename tests/{ => regression}/ext/__init__.py (100%) rename tests/{ => regression}/ext/test_collective_autostart.py (100%) rename tests/{ => regression}/ext/test_comm_collective.py (100%) rename tests/{ => regression}/ext/test_parallel_topology.py (100%) rename tests/{ => regression}/ext/test_python_ext.py (100%) rename tests/{ => regression}/ext/test_python_tracer.py (100%) rename tests/{ => regression}/ext/test_step_context.py (100%) rename tests/{ => regression}/ext/test_tracing_span.py (100%) rename tests/{ => regression}/inspect/test_trace_helpers.py (100%) create mode 100644 tests/regression/nccl/test_nccl_mock.py create mode 100644 tests/regression/nccl/test_nccl_plugin_path.py create mode 100644 tests/regression/nccl/test_nccl_skill.py rename tests/{ => regression}/profiling/test_torch_probe_sampling.py (79%) rename tests/{ => regression}/repl/__init__.py (100%) rename tests/{ => regression}/repl/test_help_magic.py (96%) rename tests/{ => regression}/repl/test_query_magic.py (96%) create mode 100644 tests/regression/rust/Cargo.toml create mode 100644 tests/regression/rust/build.rs create mode 100644 tests/regression/rust/probing/cli/inject_aarch64.rs rename {probing/core/tests => tests/regression/rust/probing/core}/distributed_storage_integration.rs (100%) rename {probing/core/tests => tests/regression/rust/probing/core}/engine_complex_tests.rs (99%) rename {probing/core/tests => tests/regression/rust/probing/core}/extension_routing_spec.rs (95%) rename {probing/core/tests => tests/regression/rust/probing/core}/federation_tests.rs (83%) rename {probing/memtable/tests => tests/regression/rust/probing/memtable}/chaos_stress.rs (100%) rename tests/{test_py_to_table.rs => regression/rust/probing/python/py_to_table.rs} (100%) rename {probing/server/tests => tests/regression/rust/probing/server}/auth_complex_tests.rs (100%) rename {probing/server/tests => tests/regression/rust/probing/server}/file_api_complex_tests.rs (89%) rename {probing/server/tests => tests/regression/rust/probing/server}/training_observability_tests.rs (98%) create mode 100644 tests/regression/rust/src/lib.rs rename {probing/core/tests => tests/regression/rust/src}/test_helpers.rs (100%) create mode 100644 tests/regression/skills/test_install_tools.py rename tests/{ => regression}/spec/api_spec.json (77%) rename tests/{ => regression}/spec/client_contract.py (86%) rename tests/{ => regression}/spec/spec_loader.py (97%) rename tests/{ => regression}/spec/test_api_spec.py (97%) rename tests/{ => regression}/tbls/test_python_tbls.py (100%) rename tests/{ => regression}/training_observability/README.md (81%) rename tests/{ => regression}/training_observability/__init__.py (100%) rename tests/{ => regression}/training_observability/conftest.py (97%) rename tests/{ => regression}/training_observability/test_collective_policy.py (100%) rename tests/{ => regression}/training_observability/test_collective_recording.py (100%) rename tests/{ => regression}/training_observability/test_collective_tracer_hook.py (100%) rename tests/{ => regression}/training_observability/test_step_straggler_sql.py (100%) rename tests/{ => regression}/training_observability/test_topology_context.py (93%) rename tests/{ => regression}/training_observability/test_training_iteration_e2e.py (98%) rename tests/{ => regression}/training_observability/test_training_sql_integration.py (94%) create mode 100644 tests/unit/conftest.py create mode 100644 tests/unit/probing/.gitkeep rename tests/{ => unit/probing}/handlers/test_python_handlers.py (97%) rename tests/{ => unit/probing/hooks}/test_import_hook.py (100%) rename {python/probing/playbooks => tests/unit/probing/skills}/test_interpret.py (92%) create mode 100644 tests/unit/probing/skills/test_loader.py create mode 100644 tests/unit/probing/test_dev_pth.py create mode 100644 tests/unit/probing/test_web_assets.py rename web/src/agent/{playbook.rs => skill.rs} (79%) diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 12b34ab9..6891b2de 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -36,8 +36,8 @@ jobs: install-cargo-tools: 'true' install-python-deps: 'false' - - name: Build frontend - run: make web/dist + - name: Prepare wheel bundle + run: make frontend wheel-bundle nccl-profiler-lib - name: Build wheels uses: PyO3/maturin-action@v1 @@ -68,8 +68,8 @@ jobs: install-cargo-tools: 'true' install-python-deps: 'false' - - name: Build frontend - run: make web/dist + - name: Prepare wheel bundle + run: make frontend wheel-bundle - name: Build wheels uses: PyO3/maturin-action@v1 @@ -95,8 +95,8 @@ jobs: install-python-deps: 'false' install-cargo-tools: 'true' - - name: Build frontend - run: make web/dist + - name: Prepare wheel bundle + run: make frontend wheel-bundle nccl-profiler-lib - name: Build sdist uses: PyO3/maturin-action@v1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1f665a30..0050ec06 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,13 +20,15 @@ jobs: install-python-deps: "true" - name: Code style checking - run: cargo fmt --all -- --check + run: | + cargo fmt --all -- --check + make lint-rust - name: Cache Rust artifacts uses: Swatinem/rust-cache@v2 - name: Build wheel - run: make wheel-ci + run: make frontend wheel-ci - name: Install wheel and run Python tests run: | @@ -94,8 +96,8 @@ jobs: - name: Cache Rust artifacts uses: Swatinem/rust-cache@v2 - - name: Build web frontend - run: make web/dist + - name: Clippy (workspace + web) + run: make lint-rust - name: Install llvm-tools-preview component run: rustup component add llvm-tools-preview --toolchain nightly @@ -138,17 +140,14 @@ jobs: - name: Cache Rust artifacts uses: Swatinem/rust-cache@v2 - - name: Build web frontend - run: make web/dist - - name: Run Rust tests run: | cargo nextest run --workspace --no-default-features cargo nextest run -p probing-server --no-default-features --features kmsg,gpu - - name: Build wheel, install, and run Python tests + - name: Build frontend and wheel, install, and run Python tests run: | - make wheel-ci + make frontend wheel-ci make install-wheel make test-python-wheel env: diff --git a/.gitignore b/.gitignore index a1dd4b73..4ebbdd1d 100644 --- a/.gitignore +++ b/.gitignore @@ -26,5 +26,8 @@ pkg/ *.pyc venv/ python/probing/probing -docs/site/ +python/probing/_skills/ +python/probing/_web/ .claude/ +*.pth.tar +docs/site/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 57bc1cb7..c96c9f69 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,12 +21,17 @@ repos: hooks: - id: black - # - repo: local - # hooks: - # - id: cargo-fmt - # name: cargo fmt - # description: Format Rust code - # entry: cargo fmt - # language: system - # types: [rust] - # pass_filenames: false + - repo: local + hooks: + - id: cargo-fmt + name: cargo fmt + entry: cargo fmt --all -- + language: system + types: [rust] + pass_filenames: false + - id: cargo-clippy + name: cargo clippy (make lint-rust) + entry: make lint-rust + language: system + types: [rust] + pass_filenames: false diff --git a/Cargo.lock b/Cargo.lock index 0d183d66..9dcd39ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3286,7 +3286,6 @@ name = "probing" version = "0.2.5" dependencies = [ "anyhow", - "arrow", "ctor", "env_logger", "log", @@ -3298,7 +3297,6 @@ dependencies = [ "probing-server", "pyo3", "pyo3-build-config", - "tokio", ] [[package]] @@ -3414,6 +3412,18 @@ dependencies = [ "xxhash-rust", ] +[[package]] +name = "probing-nccl-profiler" +version = "0.2.5" +dependencies = [ + "libc", + "once_cell", + "parking_lot 0.12.3", + "probing-memtable", + "tempfile", + "thiserror 2.0.12", +] + [[package]] name = "probing-proto" version = "0.2.5" @@ -3461,6 +3471,31 @@ dependencies = [ "tokio", ] +[[package]] +name = "probing-rust-regression" +version = "0.0.0" +dependencies = [ + "anyhow", + "arrow", + "async-trait", + "axum", + "base64 0.21.7", + "datafusion", + "futures", + "probing-cli", + "probing-core", + "probing-memtable", + "probing-proto", + "probing-python", + "probing-server", + "pyo3", + "pyo3-build-config", + "serde", + "serde_json", + "tempfile", + "tokio", +] + [[package]] name = "probing-server" version = "0.2.5" @@ -3473,7 +3508,6 @@ dependencies = [ "datafusion", "futures-util", "http-body-util", - "include_dir", "log", "nix 0.31.3", "nu-ansi-term", diff --git a/Cargo.toml b/Cargo.toml index 84514c14..d5a94729 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ cargo-features = ["codegen-backend"] [workspace] members = [ # "app", + "tests/regression/rust", "probing/cli", "probing/proto", "probing/memtable", @@ -10,6 +11,7 @@ members = [ "probing/extensions/cc", "probing/extensions/python", "probing/extensions/gpu", + "probing/extensions/nccl-profiler", "probing/server", "probing/crates/store", ] @@ -108,17 +110,6 @@ pyo3 = { version = "0.29.0", default-features = false, features = [ [build-dependencies] pyo3-build-config = "0.29.0" -[dev-dependencies] -anyhow = { workspace = true } -arrow = { workspace = true } -pyo3 = { version = "0.29.0", default-features = false, features = [ - "abi3", - "abi3-py38", - "auto-initialize", - "macros", -] } -tokio = { workspace = true } - [profile.release] opt-level = "z" # Optimize for size. panic = "unwind" diff --git a/Makefile b/Makefile index 36d18526..9bc78ce5 100644 --- a/Makefile +++ b/Makefile @@ -1,258 +1,234 @@ -# ============================================================================== -# Variables -# ============================================================================== -# Build mode: release (default) or debug -ifndef DEBUG - MATURIN_FLAGS := --release - CARGO_FLAGS := --release +# Probing Makefile +# +# develop → maturin develop (Rust/Python daily loop) +# frontend → web/dist/ (manual, needs dx) +# wheel → bundle skills + UI, then maturin build +# frontend wheel → full release path +# +.DEFAULT_GOAL := help + +ifdef DEBUG + MATURIN_RELEASE := + CARGO_RELEASE := else - MATURIN_FLAGS := - CARGO_FLAGS := + MATURIN_RELEASE := --release + CARGO_RELEASE := --release endif -# GPU: always compiled in; Linux wheels also enable CUDA (dlopen, no link-time driver). -ifeq ($(shell uname -s),Linux) - MATURIN_GPU_FEATURES := gpu,gpu-cuda +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Linux) + MATURIN_FEATURES := gpu,gpu-cuda else - MATURIN_GPU_FEATURES := gpu + MATURIN_FEATURES := gpu endif -MATURIN_FLAGS += --features $(MATURIN_GPU_FEATURES) -# Frontend framework: dioxus (Tailwind compiled by `dx build` / `dx serve`) - -# OS-specific library extension -ifeq ($(shell uname -s), Darwin) - LIB_EXT := dylib -else - LIB_EXT := so -endif +MATURIN_FLAGS := $(MATURIN_RELEASE) --features $(MATURIN_FEATURES) +DX_PUBLIC := web/target/dx/web/release/web/public -# Cross-compilation support ifdef ZIG - ifdef TARGET - MATURIN_FLAGS += --zig --target $(TARGET) - endif +ifdef TARGET + MATURIN_FLAGS += --zig --target $(TARGET) +endif endif -# Python version -PYTHON ?= python3 +PYTHON ?= $(shell test -x .venv/bin/python && echo .venv/bin/python || echo python3) +DEV_PTH := python/probing/dev_pth.py +DEV_PY_DEPS := pyyaml pytest pytest-cov coverage ipython ipykernel -# Pytest runner command -# Lightweight version without uv -PYTEST_RUN := PROBING=1 PYTHONPATH=python/ $(PYTHON) -m pytest -PYTEST_ARGS := tests +PYTEST_RUN := PROBING=1 $(PYTHON) -m pytest +PYTEST_UNIT_ARGS := tests/unit +PYTEST_REGRESSION_ARGS := tests/regression +PYTEST_ARGS := $(PYTEST_UNIT_ARGS) $(PYTEST_REGRESSION_ARGS) -# ============================================================================== -# Standard Targets -# ============================================================================== -.PHONY: all -all: wheel +CLIPPY_DENY := -- -D warnings +CLIPPY_WORKSPACE := cargo clippy --workspace --all-targets --no-default-features $(CLIPPY_DENY) +CLIPPY_CORE := cargo clippy -p probing-core --all-targets --no-default-features $(CLIPPY_DENY) +CLIPPY_WEB := cd web && cargo clippy --all-targets $(CLIPPY_DENY) +# ============================================================================== .PHONY: help help: - @echo "Usage: make [target]" + @echo "Probing — make [target] (see docs/src/contributing.md)" @echo "" - @echo "Targets:" - @echo " all Build the wheel (default)." - @echo " setup Install dev tools and environment (pre-commit, etc.)." - @echo " wheel Build the Python wheel using maturin." - @echo " wheel-ci Build wheel for CI (Linux: ZIG=1 cross-build)." - @echo " install-wheel pip install dist/probing-*.whl and verify _core." - @echo " develop Install the package in editable mode." - @echo " test Run all tests (Rust + Python)." - @echo " test-rust Run Rust tests." - @echo " test-python Run Python tests (PYTHONPATH only, no wheel)." - @echo " test-python-wheel Run Python tests against installed wheel." - @echo " test-doctest Run python/probing module doctests (optional)." - @echo " coverage-rust Run Rust coverage (cargo llvm-cov)." - @echo " coverage-python Generate Python coverage (pytest-cov)." - @echo " coverage-python-wheel Python coverage via installed wheel." - @echo " coverage Run both Rust and Python coverage and aggregate report." - @echo " bootstrap Install Python versions for testing." - @echo " clean Remove build artifacts." - @echo " frontend Build Dioxus frontend." - @echo " web/dist Build the web app (Dioxus; Tailwind via dx)." - @echo " docs Build Sphinx documentation." - @echo " docs-serve Start live preview server for documentation." - @echo "" - @echo "Environment Variables:" - @echo " DEBUG Build mode: release (default) or debug" - @echo " ZIG Use zigbuild for cross-compilation" - @echo " TARGET Target architecture for cross-compilation" - @echo " PYTHON Python interpreter to use (default: python3)" + @echo " develop / dev Bootstrap: _core, CLI, pytest, site hook" + @echo " core Rebuild probing._core after Rust edits" + @echo " frontend Build web/dist/ (dx; manual)" + @echo " wheel Build dist/*.whl (needs web/dist/; bundles skills + UI)" + @echo " wheel-ci wheel with zig cross-compile on Linux" + @echo " install-wheel pip install dist/probing-*.whl" + @echo " test / lint Full test and lint suites" + @echo " check-dev Quick env sanity check" + @echo " clean Remove build artifacts" @echo "" + @echo "Env: PYTHON DEBUG=1 ZIG=1 TARGET=" # ============================================================================== -# Setup Targets -# ============================================================================== -.PHONY: setup +.PHONY: setup install-dev-python-deps setup: - @echo "Setting up development environment..." - @echo "Installing pre-commit..." - @if command -v pip >/dev/null 2>&1; then pip install pre-commit; else echo "pip not found, skipping pre-commit install"; fi - @if command -v pre-commit >/dev/null 2>&1; then pre-commit install; else echo "pre-commit not found, skipping hook install"; fi - @echo "Environment setup complete." + @if command -v pip >/dev/null 2>&1; then pip install pre-commit; fi + @if command -v pre-commit >/dev/null 2>&1; then pre-commit install; fi + +install-dev-python-deps: + @if $(PYTHON) -c "import pytest, yaml" 2>/dev/null; then \ + echo " dev Python deps OK"; \ + elif $(PYTHON) -c "import pip" 2>/dev/null; then \ + $(PYTHON) -m pip install -q -U pip $(DEV_PY_DEPS); \ + elif command -v uv >/dev/null 2>&1; then \ + uv pip install -q --python $(PYTHON) $(DEV_PY_DEPS); \ + else \ + $(PYTHON) -m ensurepip --upgrade; \ + $(PYTHON) -m pip install -q -U pip $(DEV_PY_DEPS); \ + fi # ============================================================================== -# Build Targets -# ============================================================================== -.PHONY: wheel -wheel: web/dist/index.html - @echo "Building wheel with maturin..." - maturin build $(MATURIN_FLAGS) +.PHONY: core develop dev check-dev frontend wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib -.PHONY: develop -develop: - @echo "Installing in editable mode..." +core: nccl-profiler-lib maturin develop $(MATURIN_FLAGS) -# CI: Linux cross-builds manylinux wheels; macOS uses native maturin. -.PHONY: wheel-ci +develop: core install-dev-python-deps + $(PYTHON) $(DEV_PTH) install + @$(MAKE) --no-print-directory check-dev + +dev: develop + +check-dev: + @$(PYTHON) $(DEV_PTH) status >/dev/null 2>&1 \ + || { echo "run: make develop"; exit 1; } + @PROBING=1 $(PYTHON) -c "\ +import shutil, sys; \ +from probing import _core, VERSION; \ +from probing.skills.tools import list_skills; \ +from probing.skills.paths import repo_skills_dir; \ +print(f'ok: probing {VERSION}, {len(list_skills())} skills, cli={shutil.which(\"probing\") or sys.executable}')" \ + || { echo "run: make develop"; exit 1; } + +frontend: + @test -n "$$SKIP_FRONTEND_CLEAN" || rm -rf web/dist + cd web && dx build --release + @test -f $(DX_PUBLIC)/index.html + cp -R $(DX_PUBLIC)/. web/dist/ + @mkdir -p web/dist/assets + @cp -f web/assets/logo.svg web/dist/logo.svg 2>/dev/null || true + @cp -f web/assets/tailwind.css web/dist/assets/tailwind.css + @echo "web/dist ($$(du -sh web/dist | cut -f1))" + +wheel-bundle: + @test -f web/dist/index.html || { echo "error: run 'make frontend' first"; exit 1; } + rm -rf python/probing/_skills python/probing/_web + cp -R skills python/probing/_skills + cp -R web/dist python/probing/_web + +wheel: wheel-bundle nccl-profiler-lib + maturin build $(MATURIN_FLAGS) + wheel-ci: -ifeq ($(shell uname -s),Linux) +ifeq ($(UNAME_S),Linux) $(MAKE) ZIG=1 wheel else $(MAKE) wheel endif - @ls -la dist/probing-*.whl -.PHONY: install-wheel install-wheel: @WH=$$(ls -1 dist/probing-*.whl 2>/dev/null | head -1); \ - test -n "$$WH" || { echo "error: no wheel in dist/ — run 'make wheel' first"; exit 1; }; \ - $(PYTHON) -m pip install --upgrade pip; \ - $(PYTHON) -m pip install --force-reinstall "$$WH"; \ - $(PYTHON) -c "import probing; from probing import _core; print('probing', probing.VERSION, '_core ok')" + test -n "$$WH" || { echo "run: make wheel"; exit 1; }; \ + $(PYTHON) -m pip install -q -U pip && \ + $(PYTHON) -m pip install --force-reinstall "$$WH" && \ + $(PYTHON) -c "import probing; from probing import _core; print('probing', probing.VERSION)" + +# Linux NCCL plugin copied into python/probing/libs/ for the wheel. +ifeq ($(UNAME_S),Linux) +ifdef DEBUG +NCCL_OUT := target/debug/libprobing_nccl_profiler.so +else +NCCL_OUT := target/release/libprobing_nccl_profiler.so +endif +nccl-profiler-lib: + cargo build -p probing-nccl-profiler $(CARGO_RELEASE) + mkdir -p python/probing/libs + cp $(NCCL_OUT) python/probing/libs/ +else +nccl-profiler-lib: + @: +endif -# Test deps for wheel-based CI (extension from wheel, pure Python from checkout). +# ============================================================================== PYTEST_WHEEL_DEPS := pytest pytest-cov coverage pyyaml websockets pandas torch ipykernel -PYTEST_WHEEL_ARGS := tests python/probing +PYTEST_WHEEL_ARGS := tests/unit tests/regression python/probing PYTEST_WHEEL_EXTRA ?= -.PHONY: test-python-wheel -test-python-wheel: - $(PYTHON) -m pip install --upgrade pip - $(PYTHON) -m pip install $(PYTEST_WHEEL_DEPS) - PROBING=1 PYTHONPATH=python/ $(PYTHON) -m pytest $(PYTEST_WHEEL_EXTRA) $(PYTEST_WHEEL_ARGS) - -.PHONY: coverage-python-wheel -coverage-python-wheel: - $(MAKE) test-python-wheel PYTEST_WHEEL_EXTRA="--cov=python/probing --cov=tests --cov-report=xml:coverage.xml" - -# Ensure frontend assets exist before packaging -web/dist/index.html: - @$(MAKE) --no-print-directory web/dist - -.PHONY: web/dist -DX_PUBLIC := web/target/dx/web/release/web/public -web/dist: - @echo "Building Dioxus web app (dx compiles Tailwind automatically)..." - @rm -rf web/dist - @mkdir -p web/dist/assets - @echo "Pruning stale dx assets (avoids compressing 150+ old wasm/js bundles)..." - @rm -rf $(DX_PUBLIC)/assets $(DX_PUBLIC)/wasm - cd web && dx build --release - @echo "Copying active bundle to web/dist..." - @cp -f $(DX_PUBLIC)/index.html web/dist/ - @JS=$$(grep -oE 'web-dxh[a-f0-9]+\.js' web/dist/index.html | head -1); \ - WASM=$$(grep -oE 'web_bg-dxh[a-f0-9]+\.wasm' $(DX_PUBLIC)/assets/$$JS); \ - for f in "$$JS" "$$WASM" "$$JS.br" "$$WASM.br"; do \ - [ -n "$$f" ] && [ -f "$(DX_PUBLIC)/assets/$$f" ] && cp "$(DX_PUBLIC)/assets/$$f" web/dist/assets/; \ - done; \ - if [ -z "$$JS" ] || [ -z "$$WASM" ]; then \ - echo "error: could not resolve js/wasm bundle from index.html"; exit 1; \ - fi - @echo "Copying static assets..." - @cp -f web/assets/tailwind.css web/assets/*.svg web/dist/assets/ 2>/dev/null || true - @cp -f web/assets/logo.svg web/dist/logo.svg 2>/dev/null || true - @if command -v brotli >/dev/null 2>&1; then \ - for f in web/dist/assets/tailwind.css web/dist/logo.svg; do \ - [ -f "$$f" ] && [ ! -f "$$f.br" ] && brotli -kf "$$f"; \ - done; \ - fi - @echo "web/dist size: $$(du -sh web/dist | cut -f1)" - -# Convenience targets for frontend builds -.PHONY: frontend -frontend: - @echo "Building Dioxus frontend..." - $(MAKE) web/dist - -# ============================================================================== -# Testing & Utility Targets -# ============================================================================== +.PHONY: test test-rust test-rust-unit test-rust-regression test-python test-python-unit test-python-regression test-doctest test-python-wheel coverage-python-wheel +.PHONY: lint lint-python lint-rust lint-core clippy clippy-fix coverage coverage-rust coverage-python bootstrap clean docs-install docs docs-serve docs-clean -.PHONY: test test: test-rust test-python +test-rust: test-rust-unit test-rust-regression -.PHONY: test-rust -test-rust: - @echo "Running Rust tests..." - @# Set Python environment variables for pyenv if available +test-rust-unit: @if command -v pyenv >/dev/null 2>&1; then \ - PYTHON_PATH=$$(pyenv which python3 2>/dev/null || echo ""); \ - if [ -n "$$PYTHON_PATH" ]; then \ - export PYTHON_SYS_EXECUTABLE=$$PYTHON_PATH; \ - export PYO3_PYTHON=$$PYTHON_PATH; \ - echo "Using pyenv Python: $$PYTHON_PATH"; \ - fi; \ + P=$$(pyenv which python3 2>/dev/null); \ + test -n "$$P" && export PYTHON_SYS_EXECUTABLE=$$P PYO3_PYTHON=$$P; \ fi; \ - cargo nextest run --workspace --no-default-features --nff + cargo nextest run --lib --workspace --no-default-features --nff -# Renamed from 'pytest' to 'test-python' for consistency -.PHONY: test-python -test-python: - @echo "Running pytest for probing package..." - ${PYTEST_RUN} $(PYTEST_ARGS) +test-rust-regression: + @if command -v pyenv >/dev/null 2>&1; then \ + P=$$(pyenv which python3 2>/dev/null); \ + test -n "$$P" && export PYTHON_SYS_EXECUTABLE=$$P PYO3_PYTHON=$$P; \ + fi; \ + cargo nextest run --tests -p probing-rust-regression -p probing-macros --no-default-features --nff -.PHONY: test-doctest +test-python: check-dev test-python-unit test-python-regression +test-python-unit: check-dev + PROBING=0 ${PYTEST_RUN} $(PYTEST_UNIT_ARGS) +test-python-regression: check-dev + ${PYTEST_RUN} $(PYTEST_REGRESSION_ARGS) test-doctest: - @echo "Running module doctests (may require PROBING=0; Rust examples are +SKIP)..." ${PYTEST_RUN} --doctest-modules python/probing --ignore=python/probing/cli/__main__.py -.PHONY: pytest -pytest: test-python +test-python-wheel: + $(PYTHON) -m pip install -q -U pip $(PYTEST_WHEEL_DEPS) + PROBING=1 PYTHONPATH=python/ $(PYTHON) -m pytest $(PYTEST_WHEEL_EXTRA) $(PYTEST_WHEEL_ARGS) + +coverage-python-wheel: + $(MAKE) test-python-wheel PYTEST_WHEEL_EXTRA="--cov=python/probing --cov=tests --cov-report=xml:coverage.xml" + +lint: lint-python lint-rust +lint-core: + $(CLIPPY_CORE) +lint-python: + @if $(PYTHON) -c "import ruff" 2>/dev/null; then \ + $(PYTHON) -m ruff check python/ tests/; \ + elif command -v ruff >/dev/null 2>&1; then ruff check python/ tests/; \ + else echo "install ruff"; exit 1; fi +lint-rust: + $(CLIPPY_WORKSPACE) + $(CLIPPY_WEB) +clippy: lint-rust +clippy-fix: + cargo clippy --workspace --all-targets --no-default-features --fix --allow-dirty --allow-staged $(CLIPPY_DENY) + cd web && cargo clippy --all-targets --fix --allow-dirty --allow-staged $(CLIPPY_DENY) -.PHONY: coverage-rust coverage-rust: - @echo "Running Rust coverage (requires cargo-llvm-cov)..." - # Matches CI workflow step "Run Rust tests and collect coverage" - # Uses --lcov and --output-path coverage.lcov to match CI artifact naming cargo llvm-cov clean --workspace - cargo llvm-cov nextest run --workspace --no-default-features --nff --lcov --output-path coverage.lcov --ignore-filename-regex '(.*/tests?/|.*/benches?/|.*/examples?/)' || echo "Install with: cargo install cargo-llvm-cov" - cargo llvm-cov report nextest --workspace --no-default-features --nff --json --output-path coverage.json || true - -.PHONY: coverage-python + cargo llvm-cov nextest run --workspace --no-default-features --nff --lcov --output-path coverage.lcov --ignore-filename-regex '(.*/tests?/|.*/benches?/|.*/examples?/)' || true coverage-python: - @echo "Running Python coverage..." - # Matches CI workflow step "Run Python tests and collect coverage" - # Uses coverage.xml as output to match CI artifact naming - ${PYTEST_RUN} --cov=python/probing --cov=tests --cov-report=xml:coverage.xml --cov-report=term $(PYTEST_ARGS) || echo "Install pytest-cov via: uv add pytest-cov" - -.PHONY: coverage + ${PYTEST_RUN} --cov=python/probing --cov=tests --cov-report=xml:coverage.xml --cov-report=term $(PYTEST_ARGS) || true coverage: coverage-rust coverage-python - @echo "Aggregating coverage summaries..." - python scripts/coverage/aggregate.py || echo "Aggregation script missing or failed" + python scripts/coverage/aggregate.py || true -.PHONY: bootstrap bootstrap: - @echo "Bootstrapping Python environments..." uv python install 3.8 3.9 3.10 3.11 3.12 3.13 -.PHONY: docs docs-serve +docs-install: + @cd docs && $(MAKE) install docs: - @echo "Building Sphinx documentation..." - @cd docs && $(MAKE) html - + @cd docs && $(MAKE) build docs-serve: - @echo "Starting documentation live preview server..." @cd docs && $(MAKE) serve +docs-clean: + @cd docs && $(MAKE) clean -.PHONY: clean clean: - @echo "Cleaning up..." - rm -rf dist - rm -rf web/dist - rm -rf docs/_build + rm -rf dist web/dist docs/site python/probing/_skills python/probing/_web cargo clean rm -f coverage.lcov coverage.xml coverage.json diff --git a/README.cn.md b/README.cn.md index 477a48a3..bef326ac 100644 --- a/README.cn.md +++ b/README.cn.md @@ -174,84 +174,26 @@ probing -t config probing.max_memory=1GB ## 开发 -### 前置要求 +**使用者:** `pip install probing` — 见 [安装指南](docs/src/installation.zh.md)。 -从源码构建Probing前,确保安装以下依赖: +**贡献者** — 初次参与?请先读 **[贡献指南 → 欢迎参与开发](docs/src/contributing.zh.md#getting-started)**(English: [Contributing](docs/src/contributing.md#getting-started)),然后: ```bash -# 安装Rust工具链 -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - -# 安装nightly工具链(必需) -rustup toolchain install nightly -rustup default nightly - -# 为Web UI添加WebAssembly目标 -rustup target add wasm32-unknown-unknown - -# 安装Dioxus CLI用于构建WebAssembly前端 -cargo install dioxus-cli -``` - -### 从源码构建 - -```bash -# 克隆仓库 -git clone https://github.com/DeepLink-org/probing.git -cd probing - -# 开发构建(编译更快) -make - -# 生产构建,支持跨平台兼容 -make ZIG=1 - -# 单独构建Web UI(可选) -cd web && dx build --release - -# 构建并安装wheel包 -make wheel -pip install dist/probing-*.whl --force-reinstall -``` - -### 测试 - -准备测试环境: - -```bash -# 安装依赖 -cargo install cargo-nextest --locked -``` - -```bash -# 运行所有测试 +python3 -m venv .venv && source .venv/bin/activate +pip install maturin +make develop +make check-dev make test - -# 使用简单示例测试 -PROBING=1 python examples/test_probing.py - -# 带变量跟踪的高级测试 -PROBING_TORCH_PROFILING="on,exprs=loss@train,acc1@train" PROBE=1 python examples/imagenet.py ``` -### 项目结构 - -- `probing/cli/` - 命令行接口 -- `probing/core/` - 核心分析引擎 -- `probing/extensions/` - 语言特定扩展(Python, C++) -- `probing/server/` - HTTP API服务器 -- `web/` - Web UI源码和构建输出(Dioxus + WebAssembly) - - `web/dist/` - Web UI构建输出目录 -- `python/` - Python钩子和集成 -- `examples/` - 使用示例和演示 - -### 贡献指南 +| 文档 | 内容 | +|------|------| +| [贡献指南 — 欢迎](docs/src/contributing.zh.md#getting-started) | 选方向(skill / Python / 文档 / Rust / web)、第一个 PR | +| [安装指南](docs/src/installation.zh.md) | PyPI、wheel、`PROBING=1`、平台支持 | +| [贡献指南 — 开发环境](docs/src/contributing.zh.md#development-setup) | `make develop`、`.pth` hook、Makefile | +| [examples/README.md](examples/README.md) | 示例所需的 torch/torchvision 等 | -1. Fork仓库 -2. 创建特性分支:`git checkout -b feature-name` -3. 进行更改并添加测试 -4. 运行测试:`make test` -5. 提交pull request +发布 wheel:`make wheel && make install-wheel`。 ## 许可证 diff --git a/README.md b/README.md index a26af9b9..2cbccb1a 100644 --- a/README.md +++ b/README.md @@ -209,88 +209,26 @@ probing -t config "probing.rdma.sample.rate='5'" ## Development -### Prerequisites +**Users:** `pip install probing` — see [Installation](docs/src/installation.md). -Before building Probing from source, ensure you have the following dependencies installed: +**Contributors** — new here? Read **[Contributing → Welcome](docs/src/contributing.md#getting-started)** (中文: [贡献指南](docs/src/contributing.zh.md#getting-started)), then: ```bash -# Install Rust toolchain -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - -# Install nightly toolchain (required) -rustup toolchain install nightly -rustup default nightly - -# Add WebAssembly target for web UI -rustup target add wasm32-unknown-unknown - -# Install Dioxus CLI for building WebAssembly frontend -cargo install dioxus-cli - -# Install cross-compilation tools (optional, for distribution builds) -cargo install cargo-zigbuild -pip install ziglang -``` - -### Building from Source - -```bash -# Clone repository -git clone https://github.com/reiase/probing.git -cd probing - -# Development build (faster compilation) -make - -# Production build with cross-platform compatibility -make ZIG=1 - -# Build web UI separately (optional) -cd web && dx build --release - -# Build and install wheel package -make wheel -pip install dist/probing-*.whl --force-reinstall -``` - -### Testing - -prepare your environment: - -```bash -# Install dependencies -cargo install cargo-nextest --locked -``` - -```bash -# Run all tests +python3 -m venv .venv && source .venv/bin/activate +pip install maturin +make develop +make check-dev make test - -# Test with a simple example -PROBING=1 python examples/test_probing.py - -# Advanced testing with variable tracking -PROBING_TORCH_PROFILING="on,exprs=loss@train,acc1@train" PROBE=1 python examples/imagenet.py ``` -### Project Structure - -- `probing/cli/` - Command-line interface -- `probing/core/` - Core profiling engine -- `probing/extensions/` - Language-specific extensions (Python, C++) -- `probing/server/` - HTTP API server -- `web/` - Web UI source and build output (Dioxus + WebAssembly) - - `web/dist/` - Web UI build output directory -- `python/` - Python hooks and integration -- `examples/` - Usage examples and demos - -### Contributing +| Doc | Content | +|-----|---------| +| [Contributing — Welcome](docs/src/contributing.md#getting-started) | Pick a track (skills / Python / docs / Rust / web), first PR | +| [Installation](docs/src/installation.md) | PyPI, wheel, `PROBING=1`, platform support | +| [Contributing — Dev setup](docs/src/contributing.md#development-setup) | `make develop`, `.pth` hook, Makefile targets | +| [examples/README.md](examples/README.md) | Optional torch/torchvision for demos | -1. Fork the repository -2. Create a feature branch: `git checkout -b feature-name` -3. Make your changes and add tests -4. Run tests: `make test` -5. Submit a pull request +Release wheel only: `make frontend && make wheel && make install-wheel`. ## License diff --git a/clippy.toml b/clippy.toml new file mode 100644 index 00000000..c143cec1 --- /dev/null +++ b/clippy.toml @@ -0,0 +1,4 @@ +# Shared Clippy settings (see `make lint-rust` / `make clippy-fix`). +allow-unwrap-in-tests = true +allow-expect-in-tests = true +allow-panic-in-tests = true diff --git a/conftest.py b/conftest.py index dd8739ab..83c09ad4 100644 --- a/conftest.py +++ b/conftest.py @@ -6,6 +6,6 @@ python_dir = root_dir / "python" sys.path.insert(0, str(python_dir)) -# Note: The rust extension (_core) must be built and available. -# If running in development mode, use 'maturin develop' to build and install -# the extension into your virtual environment. +# The Rust extension (probing._core) must exist — run once: ``make develop`` +# (builds _core into python/probing/ and installs the ``probing`` CLI). +# Release/CI wheel path: ``make wheel && make install-wheel``. diff --git a/docs/Makefile b/docs/Makefile index 538a76ff..5446b335 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,5 +1,7 @@ # Makefile for Probing Documentation (MkDocs) +PYTHON ?= $(shell test -x ../.venv/bin/python && echo ../.venv/bin/python || echo python3) + .PHONY: help install serve build clean deploy # Default target @@ -16,7 +18,7 @@ help: # Install dependencies install: @echo "Installing documentation dependencies..." - pip install mkdocs mkdocs-material mkdocs-material-extensions mkdocstrings mkdocstrings-python + $(PYTHON) -m pip install -r requirements.txt # Live preview server serve: diff --git a/docs/README.md b/docs/README.md index b99f8006..ad6832ed 100644 --- a/docs/README.md +++ b/docs/README.md @@ -45,7 +45,8 @@ docs/ │ └── home.html # Homepage template └── src/ # Documentation source ├── index.md # Homepage content - ├── installation.md # Installation guide + ├── installation.md # User install (PyPI / wheel) + ├── contributing.md # Dev setup (make develop, .pth hook) ├── quickstart.md # Quick start guide ├── guide/ # User guide ├── design/ # Design documents diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 5851dd9a..bdfdd4dc 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -80,10 +80,17 @@ plugins: site_name: "Probing 文档" nav_translations: Home: 首页 + Getting Started: 入门 Installation: 安装指南 + Development Setup: 开发环境 + Welcome Contributors: 欢迎参与开发 + Welcome: 欢迎参与 + Submitting Changes: 提交变更 Quick Start: 快速开始 User Guide: 用户指南 + Core Concepts: 核心概念 SQL Analytics: SQL 分析 + Diagnostic Skills: 诊断 Skill Memory Analysis: 内存分析 Debugging: 调试指南 Troubleshooting: 常见问题 @@ -94,11 +101,14 @@ plugins: Distributed: 分布式 Cluster with Pulsing: 基于 Pulsing 的集群 Extensibility: 扩展机制 + Modularity: 模块化与边界 Examples: 示例 Training Debugging: 训练调试 Memory Leak: 内存泄漏 Performance Analysis: 性能分析 API Reference: API 参考 + Reference: 参考手册 + SQL Tables: SQL 表目录 Versions: 版本兼容性 Contributing: 贡献指南 - mkdocstrings: @@ -113,21 +123,26 @@ plugins: nav: - Home: index.md - - Installation: installation.md - - Quick Start: quickstart.md + - Getting Started: + - Installation: installation.md + - Quick Start: quickstart.md + - Core Concepts: guide/concepts.md - User Guide: - guide/index.md - SQL Analytics: guide/sql-analytics.md + - Diagnostic Skills: guide/skills.md - Memory Analysis: guide/memory-analysis.md - Debugging: guide/debugging.md - Troubleshooting: guide/troubleshooting.md - Design: - design/index.md + - Modularity: design/modularity.md - Architecture: design/architecture.md - Data Layer: design/data-layer.md - Profiling: design/profiling.md - Debugging: design/debugging.md - Distributed: design/distributed.md + - NCCL Profiler: design/nccl-profiler.md - Cluster with Pulsing: design/cluster-pulsing.md - Extensibility: design/extensibility.md - Examples: @@ -135,9 +150,15 @@ nav: - Training Debugging: examples/training-debugging.md - Memory Leak: examples/memory-leak.md - Performance Analysis: examples/performance-analysis.md - - API Reference: api-reference.md - - Versions: versions.md - - Contributing: contributing.md + - Reference: + - reference/index.md + - SQL Tables: reference/sql-tables.md + - API Reference: api-reference.md + - Versions: versions.md + - Contributing: + - Welcome: contributing.md#getting-started + - Development Setup: contributing.md#development-setup + - Submitting Changes: contributing.md#submitting-changes extra: generator: false @@ -150,4 +171,4 @@ extra: extra_css: - assets/stylesheets/home.css -copyright: © 2025 Probing. All rights reserved. +copyright: © 2025–2026 Probing. All rights reserved. diff --git a/docs/overrides/home.html b/docs/overrides/home.html index a75656f5..a6649ef4 100644 --- a/docs/overrides/home.html +++ b/docs/overrides/home.html @@ -468,10 +468,10 @@

Dynamic Performance Profiler for Distributed AI

{% if config.theme.language == "zh" %}

核心特性

-

零侵入分析 AI 工作负载,SQL 驱动的分析能力

+

SQL tables, live introspection, cluster federation, and diagnostic skills

{% else %}

Core Features

-

Zero-intrusion profiling for AI workloads with SQL-powered analytics

+

SQL tables, live introspection, cluster federation, and diagnostic skills

{% endif %}
@@ -525,13 +525,23 @@

Distributed Ready

{% endif %}
- + 🧩 {% if config.theme.language == "zh" %} -

极低开销

-

典型工作负载下性能影响小于 5%。生产级效率,适用于真实部署。

+

诊断 Skill

+

内置多步 SQL 剧本:health_overviewslow_rank 等,CLI 与 Web Agent 共用。

{% else %} -

Minimal Overhead

-

Less than 5% performance impact in typical workloads. Production-grade efficiency for real deployments.

+

Diagnostic Skills

+

Bundled multi-step playbooks — health_overview, slow_rank, … — via CLI and Web Agent.

+ {% endif %} +
+
+ 🔗 + {% if config.theme.language == "zh" %} +

联邦查询

+

global.* 跨 rank 聚合,_rank / _role 标签,cluster query 扇出。

+ {% else %} +

Federated SQL

+

global.* cross-rank queries with _rank / _role tags and cluster query fan-out.

{% endif %}
@@ -555,12 +565,13 @@

{% if config.theme.language == "zh" %}安装 Probing{% else %}Install Probin
2
-

{% if config.theme.language == "zh" %}注入到运行中的进程{% else %}Inject into Running Process{% endif %}

+

{% if config.theme.language == "zh" %}启用 Probing{% else %}Enable Probing{% endif %}

-
# {% if config.theme.language == "zh" %}查找进程{% else %}Find your process{% endif %}
-pgrep -f "python.*train"
+              
# {% if config.theme.language == "zh" %}训练推荐{% else %}Recommended for training{% endif %}
+PROBING=1 PROBING_TORCH_PROFILING=on python train.py
 
-# {% if config.theme.language == "zh" %}注入探针{% else %}Inject probes{% endif %}
+# {% if config.theme.language == "zh" %}或 Linux 附着{% else %}Or attach on Linux{% endif %}
+pgrep -f "python.*train"
 probing -t <pid> inject
diff --git a/docs/src/api-reference.md b/docs/src/api-reference.md index 73e87a1c..15df4bfb 100644 --- a/docs/src/api-reference.md +++ b/docs/src/api-reference.md @@ -1,274 +1,192 @@ # API Reference -Complete reference for Probing's CLI commands and Python API. +CLI commands and in-process Python API. Table schemas live in **[SQL Tables](reference/sql-tables.md)**. -## CLI Commands +## CLI commands -### probing inject +All commands accept `-t, --target ` (`pid` or `host:port`) unless noted. -Inject probes into a running process. +### Core interaction -```bash -probing -t inject -``` - -**Options:** - -- `-t, --target ` - Target process ID (required) - -**Platform:** Linux only - ---- - -### probing query - -Execute SQL queries against collected data. +| Command | Aliases | Description | +|---------|---------|-------------| +| `query ""` | `q` | Run SQL against memtables | +| `eval ""` | `e` | Execute Python in the target process | +| `backtrace` | `bt`, `b` | Capture stack → `python.backtrace` | +| `repl` | `r` | Interactive Python REPL | ```bash -probing -t query "" +probing -t $ENDPOINT query "SELECT * FROM python.torch_trace LIMIT 10" +probing -t $ENDPOINT eval "import torch; print(torch.cuda.is_available())" +probing -t $ENDPOINT backtrace ``` -**Examples:** +### Discovery & introspection -```bash -# Query torch traces -probing -t 12345 query "SELECT * FROM python.torch_trace LIMIT 10" - -# Aggregate query -probing -t host:8080 query "SELECT module, AVG(duration) FROM python.torch_trace GROUP BY module" -``` - ---- - -### probing eval - -Execute Python code in target process. +| Command | Aliases | Description | +|---------|---------|-------------| +| `tables` | `tbl` | List queryable tables (`--all` includes `information_schema`) | +| `list` | `ls`, `l` | List processes with probes attached | +| `memory` | `mem` | Host RSS + GPU memory samples | +| `config [key[=value]]` | `cfg`, `c` | View or set runtime config | +| `flamegraph [pprof\|torch]` | `flame`, `fg` | CPU pprof or Torch module flamegraph | +| `rdma [hca]` | `rd` | RDMA flow analysis (when available) | ```bash -probing -t eval "" +probing -t $ENDPOINT tables +probing -t $ENDPOINT config probing.torch.profiling +probing -t $ENDPOINT config probing.torch.profiling=ordered:0.1 +probing -t $ENDPOINT flamegraph torch -o torch.html ``` -**Examples:** +### Cluster (distributed) -```bash -# Simple evaluation -probing -t 12345 eval "print('hello')" - -# Multi-statement -probing -t 12345 eval "import torch; print(torch.cuda.is_available())" -``` - ---- - -### probing backtrace - -Capture current stack trace. - -```bash -probing -t backtrace -``` - -**Output:** Stack frames with function names, files, and line numbers. - ---- - -### probing repl - -Start interactive Python REPL. +| Subcommand | Description | +|------------|-------------| +| `cluster nodes` | List registered cluster nodes (`rank`, `role`, `status`, …) | +| `cluster query ""` | Fan-out SQL; results include federation tags (`_rank`, `_role`, …) | +| `cluster query --local ""` | Query only the connected endpoint | ```bash -probing -t repl +probing -t rank0:8080 cluster nodes +probing -t rank0:8080 cluster query "SELECT _rank, _role, AVG(duration) FROM global.python.comm_collective GROUP BY 1,2" ``` -**Features:** +In-process equivalent: `probing.query("SELECT … FROM global.python.torch_trace …")` when peers are registered. -- Tab completion -- Multi-line input -- Command history +### Diagnostic skills ---- - -### probing list +Structured multi-step SQL playbooks (shared with Web Agent): -List processes with probing enabled. +| Subcommand | Description | +|------------|-------------| +| `skill list` | List bundled skills (`health_overview`, `slow_rank`, …) | +| `skill run ` | Run skill against target (`-p key=value`, `--global`, `--local`) | +| `skill install` | Copy skills into Cursor / Claude / Codex agent dirs | +| `skill update` | Refresh installed skills from bundle | ```bash -probing list +probing -t $ENDPOINT skill list +probing -t $ENDPOINT skill run health_overview +probing -t $ENDPOINT skill run slow_rank --global +python -m probing.skills validate # dev: validate skills/ authoring tree ``` -**Output:** Process IDs and their probing status. +See **[Diagnostic Skills](guide/skills.md)** for workflow. ---- +### Process management -### probing config - -View or modify configuration. +| Command | Platform | Description | +|---------|----------|-------------| +| `inject` | Linux | Attach probe to running PID | +| `launch [--recursive] ` | All | Start Python with probing enabled | ```bash -# View all config -probing -t config - -# View specific key -probing -t config probing.sample_rate - -# Set value -probing -t config probing.sample_rate=0.1 +probing -t $PID inject # Linux attach +PROBING=1 python train.py # macOS / Windows / preferred for training ``` --- -### probing memory +## Python API (in-process) -Quick memory overview. +Use when the training script runs with `PROBING=1` (or after Linux `inject`). **There is no** `probing.connect()` — remote access is always CLI `-t `. -```bash -probing -t memory -``` - ---- +### probing.query -### probing rdma - -RDMA flow analysis. +```python +import probing -```bash -probing -t rdma +df = probing.query("SELECT * FROM python.torch_trace LIMIT 10") ``` -## Python API - -### probing.connect - -Connect to a probing endpoint. +### probing.span / probing.event ```python -from probing import connect - -# Connect by PID -probe = connect(pid=12345) - -# Connect by address -probe = connect(address="host:8080") +with probing.span("forward", kind="nn.forward"): + ... +probing.event("batch.stats", attributes=[{"loss": 1.25}]) ``` ---- - -### probe.eval - -Execute code in target process. +### @table (dataclass plugins) ```python -result = probe.eval("print('hello')") -``` - ---- +from dataclasses import dataclass +from probing import table -### probe.query +@table +@dataclass +class MyMetrics: + step: int + loss: float -Execute SQL query. +def init(): + MyMetrics.init_table() -```python -df = probe.query("SELECT * FROM python.torch_trace") +MyMetrics(step=1, loss=0.42).save() ``` ---- - -### @probing.table +See **[Extensibility](design/extensibility.md)**. -Register custom data table. +### probing.set_role / current_role / clear_role ```python -from probing import table - -@table("my_data") -def get_my_data(): - return [{"key": "value"}] +probing.set_role("dp=2,pp=1,tp=0") +probing.set_role(dp=2, pp=1, tp=0) +probing.current_role() +probing.clear_role() ``` ---- - -### @probing.metric - -Register custom metric. +### probing.tracing.step_snapshot ```python -from probing import metric +from probing.tracing import step_snapshot -@metric("custom_metric") -def get_metric(): - return 42.0 +snap = step_snapshot() +# snap.local_step, snap.global_step — use in SQL filters and custom tables ``` -## SQL Tables - -### python.backtrace - -Stack trace information. - -| Column | Type | Description | -|--------|------|-------------| -| func | string | Function name | -| file | string | Source file | -| lineno | int | Line number | -| depth | int | Stack depth | -| frame_type | string | Python/Native | - --- -### python.torch_trace - -PyTorch execution traces. +## Configuration -| Column | Type | Description | -|--------|------|-------------| -| step | int | Training step | -| seq | int | Sequence number | -| module | string | Module name | -| stage | string | Hook label: `pre forward`, `post forward`, `pre step`, `post step` (duration on post rows; backward not collected by default) | -| allocated | float | GPU memory (MB) | -| max_allocated | float | Peak GPU memory (MB) | -| cached | float | Cached memory (MB) | -| max_cached | float | Peak cached memory (MB) | -| time_offset | float | Seconds since step time anchor | -| duration | float | Execution time (sec); meaningful on post rows | +| Key | Description | +|-----|-------------| +| `probing.torch.profiling` | TorchProbe (`on`, `ordered:0.5`, `random:0.1`, `tracepy=on`, …) | +| `probing.pprof.sample_freq` | CPU pprof sampling frequency (Hz) | ---- +```bash +probing -t $ENDPOINT config +probing -t $ENDPOINT config probing.torch.profiling=ordered:0.1 +``` -### python.variables +There is **no** `probing.sample_rate` key. Torch sampling is controlled via `probing.torch.profiling` or `PROBING_TORCH_PROFILING`. -Variable tracking. +### Environment variables -| Column | Type | Description | -|--------|------|-------------| -| step | int | Training step | -| func | string | Function name | -| name | string | Variable name | -| value | string | String representation | +| Variable | Description | +|----------|-------------| +| `PROBING` | Enable probing (`1`) | +| `PROBING_PORT` | TCP listen port for remote CLI | +| `PROBING_TORCH_PROFILING` | TorchProbe spec (mirrors `probing.torch.profiling`) | +| `PROBING_PPROF_SAMPLE_FREQ` | CPU pprof Hz | +| `PROBING_AUTH_TOKEN` | HTTP auth token | +| `PROBING_ROLE_` | Custom parallel dimension for `role` derivation | --- -### information_schema.df_settings - -Configuration settings. - -| Column | Type | Description | -|--------|------|-------------| -| name | string | Setting name | -| value | string | Setting value | - -## Configuration Options - -| Key | Default | Description | -|-----|---------|-------------| -| `probing.torch.profiling` | — | TorchProbe spec (`on`, `ordered:0.5`, `random:0.1`, options) | -| `probing.pprof.sample_freq` | — | CPU pprof sampling frequency (Hz) | - -## Environment Variables - -| Variable | Description | -|----------|-------------| -| `PROBING` | Enable probing (1=on) | -| `PROBING_PORT` | TCP server port | -| `PROBING_TORCH_PROFILING` | TorchProbe (`on`, `ordered:0.5`, `random:0.1`, `tracepy=on`, …) | -| `PROBING_PPROF_SAMPLE_FREQ` | Synced to `probing.pprof.sample_freq` (CPU pprof Hz) | -| `PROBING_AUTH_TOKEN` | Authentication token | +## Documented but not implemented {#unimplemented-apis} + +Do not use these in new code — listed for migration clarity: + +| API / pattern | Use instead | +|---------------|-------------| +| `probing.connect()` | CLI `probing -t …` | +| `@metric` decorator | `@table` dataclass + `.save()` | +| Function-style `@table` | Dataclass + `@table` only | +| `probing.sample_rate` config | `probing.torch.profiling` / `PROBING_TORCH_PROFILING` | +| `probing.is_profiling_active()` | `probing tables` / `SELECT COUNT(*) FROM python.torch_trace` | +| `probing.flush()` | Rows append on event; no flush API | +| `probing.get_config()` (Python) | CLI `probing config` | +| `cluster list` | `cluster nodes` | +| `nccl_trace` / `training_metrics` tables | `python.comm_collective`, `nccl.proxy_ops`, `python.torch_trace` | diff --git a/docs/src/api-reference.zh.md b/docs/src/api-reference.zh.md index e35943f2..94c3b64e 100644 --- a/docs/src/api-reference.zh.md +++ b/docs/src/api-reference.zh.md @@ -1,196 +1,192 @@ # API 参考 -Probing CLI 命令和 Python API 的完整参考。 +CLI 命令与进程内 Python API。表结构见 **[SQL 表目录](reference/sql-tables.zh.md)**。 ## CLI 命令 -### probing inject +除特别说明外,命令均接受 `-t, --target `(`pid` 或 `host:port`)。 -将探针注入到运行中的进程。 +### 核心交互 -```bash -probing -t inject -``` - -**选项:** - -- `-t, --target ` - 目标进程 ID(必需) - -**平台:** 仅 Linux - ---- - -### probing query - -对收集的数据执行 SQL 查询。 - -```bash -probing -t query "" -``` - -**示例:** +| 命令 | 别名 | 说明 | +|------|------|------| +| `query ""` | `q` | 对 memtable 执行 SQL | +| `eval ""` | `e` | 在目标进程执行 Python | +| `backtrace` | `bt`, `b` | 抓栈 → `python.backtrace` | +| `repl` | `r` | 交互式 Python REPL | ```bash -# 查询 torch 追踪 -probing -t 12345 query "SELECT * FROM python.torch_trace LIMIT 10" - -# 聚合查询 -probing -t host:8080 query "SELECT module, AVG(duration) FROM python.torch_trace GROUP BY module" +probing -t $ENDPOINT query "SELECT * FROM python.torch_trace LIMIT 10" +probing -t $ENDPOINT eval "import torch; print(torch.cuda.is_available())" +probing -t $ENDPOINT backtrace ``` ---- - -### probing eval - -在目标进程中执行 Python 代码。 - -```bash -probing -t eval "" -``` +### 发现与内省 -**示例:** +| 命令 | 别名 | 说明 | +|------|------|------| +| `tables` | `tbl` | 列出可查询表(`--all` 含 `information_schema`) | +| `list` | `ls`, `l` | 列出已附着探针的进程 | +| `memory` | `mem` | 主机 RSS + GPU 内存采样 | +| `config [key[=value]]` | `cfg`, `c` | 查看或设置运行时配置 | +| `flamegraph [pprof\|torch]` | `flame`, `fg` | CPU pprof 或 Torch 模块火焰图 | +| `rdma [hca]` | `rd` | RDMA 流分析(若可用) | ```bash -# 简单执行 -probing -t 12345 eval "print('hello')" - -# 多语句 -probing -t 12345 eval "import torch; print(torch.cuda.is_available())" +probing -t $ENDPOINT tables +probing -t $ENDPOINT config probing.torch.profiling +probing -t $ENDPOINT config probing.torch.profiling=ordered:0.1 +probing -t $ENDPOINT flamegraph torch -o torch.html ``` ---- - -### probing backtrace +### 集群(分布式) -捕获当前堆栈跟踪。 +| 子命令 | 说明 | +|--------|------| +| `cluster nodes` | 列出已注册节点(`rank`、`role`、`status` 等) | +| `cluster query ""` | 扇出 SQL;结果含联邦标签(`_rank`、`_role` 等) | +| `cluster query --local ""` | 仅查询当前连接的 endpoint | ```bash -probing -t backtrace +probing -t rank0:8080 cluster nodes +probing -t rank0:8080 cluster query "SELECT _rank, _role, AVG(duration) FROM global.python.comm_collective GROUP BY 1,2" ``` -**输出:** 包含函数名、文件和行号的堆栈帧。 +进程内等价:`probing.query("SELECT … FROM global.python.torch_trace …")`(需已注册 peer)。 ---- +### 诊断 skill -### probing repl +多步 SQL 剧本(与 Web Agent 共用): -启动交互式 Python REPL。 +| 子命令 | 说明 | +|--------|------| +| `skill list` | 列出内置 skill(`health_overview`、`slow_rank` 等) | +| `skill run ` | 对目标执行(`-p key=value`、`--global`、`--local`) | +| `skill install` | 安装到 Cursor / Claude / Codex skill 目录 | +| `skill update` | 从 bundle 更新已安装 skill | ```bash -probing -t repl +probing -t $ENDPOINT skill list +probing -t $ENDPOINT skill run health_overview +probing -t $ENDPOINT skill run slow_rank --global +python -m probing.skills validate # 开发:校验 skills/ 源码树 ``` -**功能:** +见 **[诊断 Skill](guide/skills.zh.md)**。 -- Tab 补全 -- 多行输入 -- 命令历史 +### 进程管理 ---- - -### probing list - -列出启用了 probing 的进程。 +| 命令 | 平台 | 说明 | +|------|------|------| +| `inject` | Linux | 向运行中 PID 注入探针 | +| `launch [--recursive] ` | 全平台 | 以 probing 启用状态启动 Python | ```bash -probing list +probing -t $PID inject # Linux 附着 +PROBING=1 python train.py # macOS / Windows / 训练推荐路径 ``` -**输出:** 进程 ID 及其 probing 状态。 - --- -### probing config +## Python API(进程内) -查看或修改配置。 +训练脚本在 `PROBING=1`(或 Linux `inject` 后)使用。**没有** `probing.connect()`;远程一律 CLI `-t `。 -```bash -# 查看所有配置 -probing -t config +### probing.query -# 查看特定键 -probing -t config probing.sample_rate +```python +import probing -# 设置值 -probing -t config probing.sample_rate=0.1 +df = probing.query("SELECT * FROM python.torch_trace LIMIT 10") ``` -## Python API +### probing.span / probing.event -### probing.connect +```python +with probing.span("forward", kind="nn.forward"): + ... +probing.event("batch.stats", attributes=[{"loss": 1.25}]) +``` -连接到 probing 端点。 +### @table(dataclass 插件) ```python -from probing import connect +from dataclasses import dataclass +from probing import table -# 通过 PID 连接 -probe = connect(pid=12345) +@table +@dataclass +class MyMetrics: + step: int + loss: float -# 通过地址连接 -probe = connect(address="host:8080") -``` +def init(): + MyMetrics.init_table() ---- +MyMetrics(step=1, loss=0.42).save() +``` -### @probing.table +见 **[扩展机制](design/extensibility.zh.md)**。 -注册自定义数据表。 +### probing.set_role / current_role / clear_role ```python -from probing import table - -@table("my_data") -def get_my_data(): - return [{"key": "value"}] +probing.set_role("dp=2,pp=1,tp=0") +probing.set_role(dp=2, pp=1, tp=0) +probing.current_role() +probing.clear_role() ``` -## SQL 表 - -### python.backtrace +### probing.tracing.step_snapshot -堆栈跟踪信息。 +```python +from probing.tracing import step_snapshot -| 列 | 类型 | 描述 | -|----|------|------| -| func | string | 函数名 | -| file | string | 源文件 | -| lineno | int | 行号 | -| depth | int | 堆栈深度 | -| frame_type | string | Python/Native | +snap = step_snapshot() +# snap.local_step, snap.global_step — 用于 SQL 过滤与自定义表 +``` --- -### python.torch_trace - -PyTorch 执行跟踪。 +## 配置 -| 列 | 类型 | 描述 | -|----|------|------| -| step | int | 训练步骤 | -| seq | int | 序列号 | -| module | string | 模块名 | -| stage | string | 钩子标签:`pre forward`、`post forward`、`pre step`、`post step`(时长在 post 行;默认不采 backward) | -| allocated | float | GPU 内存 (MB) | -| max_allocated | float | GPU 峰值内存 (MB) | -| cached | float | GPU 预留内存 (MB) | -| max_cached | float | 峰值预留 (MB) | -| time_offset | float | 相对 step 时间锚点(秒) | -| duration | float | 执行时间 (秒);post 行有效 | +| 键 | 说明 | +|----|------| +| `probing.torch.profiling` | TorchProbe(`on`、`ordered:0.5`、`random:0.1`、`tracepy=on` 等) | +| `probing.pprof.sample_freq` | CPU pprof 采样频率 (Hz) | -## 配置选项 +```bash +probing -t $ENDPOINT config +probing -t $ENDPOINT config probing.torch.profiling=ordered:0.1 +``` -| 键 | 默认值 | 描述 | -|----|--------|------| -| `probing.torch.profiling` | — | TorchProbe 配置(`on`、`ordered:0.5`、`random:0.1` 等) | -| `probing.pprof.sample_freq` | — | CPU pprof 采样频率 (Hz) | +**没有** `probing.sample_rate` 配置项。Torch 采样通过 `probing.torch.profiling` 或 `PROBING_TORCH_PROFILING` 控制。 -## 环境变量 +### 环境变量 -| 变量 | 描述 | +| 变量 | 说明 | |------|------| -| `PROBING` | 启用 probing (1=开启) | -| `PROBING_PORT` | TCP 服务器端口 | -| `PROBING_TORCH_PROFILING` | TorchProbe(`on`、`ordered:0.5`、`random:0.1`、`tracepy=on` 等) | -| `PROBING_PPROF_SAMPLE_FREQ` | 同步为 `probing.pprof.sample_freq`(CPU pprof Hz) | -| `PROBING_AUTH_TOKEN` | 认证令牌 | +| `PROBING` | 启用 probing(`1`) | +| `PROBING_PORT` | 远程 CLI 的 TCP 端口 | +| `PROBING_TORCH_PROFILING` | TorchProbe 规格 | +| `PROBING_PPROF_SAMPLE_FREQ` | CPU pprof Hz | +| `PROBING_AUTH_TOKEN` | HTTP 认证令牌 | +| `PROBING_ROLE_` | 自定义并行维度,参与 `role` 推导 | + +--- + +## 文档提及但未实现 {#unimplemented-apis} + +新代码请勿使用——便于迁移对照: + +| API / 模式 | 请改用 | +|------------|--------| +| `probing.connect()` | CLI `probing -t …` | +| `@metric` 装饰器 | `@table` dataclass + `.save()` | +| 函数式 `@table` | 仅 dataclass + `@table` | +| `probing.sample_rate` 配置 | `probing.torch.profiling` / `PROBING_TORCH_PROFILING` | +| `probing.is_profiling_active()` | `probing tables` / `SELECT COUNT(*) FROM python.torch_trace` | +| `probing.flush()` | 事件触发即写入,无 flush API | +| `probing.get_config()`(Python) | CLI `probing config` | +| `cluster list` | `cluster nodes` | +| `nccl_trace` / `training_metrics` 表 | `python.comm_collective`、`nccl.proxy_ops`、`python.torch_trace` | diff --git a/docs/src/contributing.md b/docs/src/contributing.md index 7ad996f0..8d55d042 100644 --- a/docs/src/contributing.md +++ b/docs/src/contributing.md @@ -1,197 +1,300 @@ # Contributing Guide -Thank you for your interest in contributing to Probing! This guide will help you get started. +Thank you for contributing to Probing. This document is the **canonical development guide** for working from a git checkout. -## Getting Started +| Topic | Where | +|-------|--------| +| **New here? Start here** | [Welcome — get started](#getting-started) below | +| End-user install (PyPI / wheel) | [Installation](installation.md) | +| Daily dev bootstrap | [Development setup](#development-setup) | +| Agent diagnostic skills | [Skills & agents](#skills-agents) + [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | +| PR / style / conduct | [Submitting changes](#submitting-changes) | -### Prerequisites + -- Python 3.9+ -- Rust (latest stable) -- maturin (for building Python extensions) +## Welcome — get started -### Development Setup +Probing is a **layered** project: SQL engine and collectors in Rust, Python SDK and hooks, diagnostic skills, and a Web UI. **You do not need to learn every layer** to contribute — pick a track that matches your background. -1. Clone the repository: +### Your first 30 minutes ```bash git clone https://github.com/DeepLink-org/probing.git cd probing +python3 -m venv .venv && source .venv/bin/activate # or: uv venv && source .venv/bin/activate +pip install maturin +make develop +make check-dev +make test-python-regression # fast Python smoke; or: make test for full suite ``` -2. Create a virtual environment: +If all of the above succeed, your environment is ready. Optional: `./skills/install.sh` so Cursor / Claude / Codex can use repo skills. -```bash -python -m venv .venv -source .venv/bin/activate # Linux/macOS -# or -.venv\Scripts\activate # Windows -``` +Preview docs while editing: `make docs-install && make docs-serve` → http://127.0.0.1:8000 -3. Install development dependencies: +### Pick a contribution track -```bash -pip install -e ".[dev]" -``` +| Track | You might… | Main directories | Read first | Good first tasks | +|-------|------------|------------------|------------|------------------| +| **Skills** | Add or improve training diagnostics | [`skills/`](https://github.com/DeepLink-org/probing/blob/main/skills/README.md) | [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md), [Extensibility — skill](design/extensibility.md#path-2-diagnostic-skill) | New skill folder, fix SQL in `steps.yaml`, improve `SKILL.md` | +| **Python** | Table plugins, hooks, skill tooling | `python/probing/`, [`python/probing/skills/`](https://github.com/DeepLink-org/probing/blob/main/python/probing/skills/README.md) | [Extensibility — table plugin](design/extensibility.md#path-1-table-plugin-dataclass--table) | `@table` example, loader/install tests in `tests/regression/skills/` | +| **Docs & examples** | Clarify concepts or add recipes | `docs/src/`, `examples/` | [Core concepts](guide/concepts.md) | Fix typos, add troubleshooting, extend `examples/README.md` | +| **Rust** | SQL engine, server, collectors, CLI | `probing/` (Rust workspace) | [Modularity](design/modularity.md) | Issues in `probing/core`, `probing/server`, extensions | +| **Web UI** | Investigate agent, dashboards | `web/` | [web/DESIGN.md](https://github.com/DeepLink-org/probing/blob/main/web/DESIGN.md) | Agent UX, page polish (needs `dx` for full wheel build) | -4. Build the Rust extension: +**Skills vs Python package:** edit skill **data** in repo-root `skills/`; edit skill **loader / install code** in `python/probing/skills/`. Do **not** edit `python/probing/_skills/` by hand — it is generated by `make wheel`. -```bash -maturin develop -``` +**Two folders named `probing/`:** `probing/` at the repo root is **Rust**; `python/probing/` is the **Python package**. `src/lib.rs` at the root is the PyO3 entry for `probing._core`. -## Development Workflow +### Your first pull request -### Running Tests +1. Fork, branch: `git checkout -b docs/my-improvement` (or `feat/…`, `fix/…`) +2. Make a **focused** change in one track above +3. Run tests for what you touched: + - Skills: `python -m probing.skills validate` and `pytest tests/regression/skills/ -q` + - Python: `pytest tests/unit/probing/…` or `tests/regression/…` + - Rust: `make test-rust-unit` or `make test-rust-regression` + - Docs only: `make docs` +4. `make lint` when you changed code +5. Open a PR — say **what** and **why**; link an issue if there is one -```bash -# Run all tests -make test +Not sure where your change belongs? Open a [Discussion](https://github.com/DeepLink-org/probing/discussions) or issue first — we are happy to point you to the right layer. -# Run specific test -pytest tests/test_specific.py -v + -# Run with coverage -make coverage -``` +## Prerequisites -### Code Style +- **Python** 3.9+ +- **Rust** (latest stable) + **Cargo** +- **maturin** — builds `probing._core` (`pip install maturin` or `uv pip install maturin`) +- **uv** (optional but recommended) — many devs use `uv venv`; the Makefile falls back to `uv pip` when the venv has no `pip` -We use the following tools for code quality: +Optional (release / web UI only): -**Python:** +- **dioxus-cli** (`dx`) — `make frontend` builds the web UI; `make wheel` embeds it +- **cargo-zigbuild** + **ziglang** — Linux manylinux wheels (`make wheel-ci`) -- `ruff` for linting and formatting -- `mypy` for type checking + + +## Development setup + +One-time per clone: ```bash -# Format code -ruff format . +git clone https://github.com/DeepLink-org/probing.git +cd probing -# Check linting -ruff check . +# Virtual environment (pick one) +python3 -m venv .venv && source .venv/bin/activate +# or: uv venv && source .venv/bin/activate -# Type check -mypy python/probing +pip install maturin # or: uv pip install maturin +make develop +./skills/install.sh # optional: Cursor / Claude / Codex skill dirs ``` -**Rust:** +`make develop` does: -- `rustfmt` for formatting -- `clippy` for linting +1. **`make core`** — `maturin develop` → `probing._core` + editable `probing.pth` (repo `python/` on `sys.path`) + `probing` CLI on `PATH` +2. **`install-dev-python-deps`** — `pytest`, `pyyaml`, etc. (via `pip`, `uv pip`, or `ensurepip`) +3. **`python/probing/dev_pth.py install`** — writes `probing_hook.pth` so develop matches wheel auto-hook behavior +4. **`check-dev`** — smoke import `_core`, skills catalog, CLI -```bash -# Format -cargo fmt +Verify anytime: -# Lint -cargo clippy --all --tests --benches -- -D warnings +```bash +make check-dev +python python/probing/dev_pth.py status ``` -### Building Documentation +### Site hook (`.pth`) in develop vs wheel + +| File | Written by | Purpose | +|------|------------|---------| +| `probing.pth` | maturin (develop / wheel) | Wheel: `import probing_hook`. Develop: **path line** to repo `python/` | +| `probing_hook.pth` | `make develop` (`dev_pth.py`) | Develop only: `import probing_hook` (pairs with path `.pth`) | + +Implementation: `python/probing_hook.py` → `python/probing/site_hook.py`. +Training / tests: set `PROBING=1` (or `2`, filters — see `site_hook.py`). Tests default to `PROBING=1` in `tests/conftest.py`. + +You do **not** need `PYTHONPATH=python/` after `make develop` inside the project venv. + +### Makefile targets (daily use) + +Run **`make help`** in the repo root for the full target list with one-line descriptions. + +| Target | When | +|--------|------| +| `make develop` / `make dev` | First setup; after pulling large Python/Rust layout changes | +| `make core` | Rebuild `_core` only after Rust edits | +| `make check-dev` | Quick sanity check | +| `make test` | Rust + Python tests | +| `make lint` | `ruff check` + `cargo clippy` (workspace + `web/`) | +| `make clippy-fix` | Apply Clippy auto-fixes (`--fix --allow-dirty`) | +| `make test-rust` / `make test-python` | Split test runs | +| `make docs-install` | MkDocs deps (first time editing docs) | +| `make docs-serve` | Live docs preview at http://127.0.0.1:8000 | +| `make docs` | Build static docs to `docs/site/` | +| `python -m probing.skills validate` | Validate `skills/*/SKILL.md` + `steps.yaml` | +| `make frontend` | Manual `web/dist/` build (UI changes or before wheel) | +| `make wheel` | Release wheel (requires `web/dist/`; auto-bundles skills + UI) | +| `make install-wheel` | Reinstall `dist/probing-*.whl` (CI / release smoke) | + +Day-to-day: ```bash -cd docs -make install # Install dependencies -make serve # Preview at http://127.0.0.1:8000 +source .venv/bin/activate +make test +probing skill list +make core # after Rust-only changes ``` -## Submitting Changes +### Release / CI wheel smoke test + +```bash +make frontend && make wheel && make install-wheel +make test-python-wheel # tests against installed wheel + checkout pure Python +``` -### Pull Request Process +### Examples (optional ML stack) -1. Fork the repository -2. Create a feature branch: +`make develop` does **not** install PyTorch. For `examples/` scripts: ```bash -git checkout -b feature/your-feature-name +uv pip install torch torchvision # or pip install … +PROBING=1 python examples/events.py ``` -3. Make your changes -4. Run tests and linting: +See [examples/README.md](https://github.com/DeepLink-org/probing/blob/main/examples/README.md). + +## Skills & agents {#skills-agents} + +- **Authoring**: repo root `skills/` (`SKILL.md`, `steps.yaml`, `catalog.yaml`) +- **Install to IDE agents**: `./skills/install.sh` or `probing skill install` +- **Bundled in wheel**: `make wheel` copies into `python/probing/_skills/` and `python/probing/_web/` +- **Docs**: `skills/README.md`, [Extensibility — Diagnostic skill](design/extensibility.md#path-2-diagnostic-skill) + +## Development workflow + +### Running tests + +Two layers — **unit** and **regression**. Layout: [`tests/README.md`](https://github.com/DeepLink-org/probing/blob/main/tests/README.md). + +| Layer | Rust | Python (migration in progress) | +|-------|------|--------------------------------| +| Unit | `#[cfg(test)]` in `probing/**/src/` | `tests/unit/probing/` mirrors `python/probing/` | +| Regression | `tests/regression/rust/probing/**` + `probing/macros/tests/` | `tests/regression/` (incl. `spec/api_spec.json`) | ```bash make test -make lint +make test-rust-unit +make test-rust-regression +make test-python-unit +make test-python-regression +make test-python +make coverage ``` -5. Commit with a descriptive message: +**Rust exception:** `probing/macros/tests/` must stay as an external crate (proc-macro tests). + +### Code style + +**Python:** `ruff`, `mypy` ```bash -git commit -m "feat: add new feature description" +ruff format . +ruff check . +mypy python/probing ``` -6. Push and create a pull request +**Rust:** `rustfmt`, `clippy` (shared rules in `clippy.toml`; strict lints are **enabled per crate** — see each crate’s `Cargo.toml` `[lints]`) + +```bash +cargo fmt --all +make lint-core # probing-core (clippy::all enabled) +make lint-rust # cargo clippy --workspace + web/, warnings denied +make clippy-fix # auto-fix what Clippy can (review diff before commit) +``` -### Commit Message Format +Clippy runs in CI and optional pre-commit (`make setup`). After editing `probing-core`, run `make lint-core` before pushing. Full-workspace `make lint-rust` may still fail until other crates are cleaned up — we are rolling out lints crate by crate. -We follow [Conventional Commits](https://www.conventionalcommits.org/): +**Status:** `probing-core` has `clippy::all` (`pedantic`/`nursery` off; protocol-related allows in `probing/core/Cargo.toml`). Next candidates: `probing-proto`, `probing-memtable`. -- `feat:` - New feature -- `fix:` - Bug fix -- `docs:` - Documentation changes -- `style:` - Code style changes (formatting) -- `refactor:` - Code refactoring -- `test:` - Test changes -- `chore:` - Build/tooling changes +### Building documentation -### Code Review +From the **repository root** (same pattern as `make test`, `make develop`): -All submissions require code review. Please: +```bash +make docs-install # once: MkDocs + i18n + mkdocstrings +make docs-serve # http://127.0.0.1:8000, auto-reload on edit +make docs # static build → docs/site/ +``` -- Keep PRs focused on a single change -- Add tests for new functionality -- Update documentation as needed -- Respond to review feedback promptly +Advanced: `cd docs && make deploy` for GitHub Pages. -## Project Structure +## Project structure ``` -probing/ -├── python/ # Python source code -│ └── probing/ # Main Python package -├── probing/ # Rust crates -│ ├── core/ # Core functionality -│ ├── server/ # HTTP server -│ ├── extensions/ # Python/PyTorch extensions -│ └── cli/ # Command-line interface -├── tests/ # Python tests -├── docs/ # Documentation -└── examples/ # Usage examples +probing/ # repo root +├── skills/ # skill DATA (authoring) — see skills/README.md +├── python/ +│ ├── probing/ # Python PACKAGE (not Rust) +│ │ ├── skills/ # skill loader/install CODE — see python/probing/skills/README.md +│ │ ├── web_assets.py # wheel _web/ + editable web/dist → PROBING_ASSETS_ROOT +│ │ ├── _skills/ # wheel GENERATED (make wheel) — do not edit +│ │ └── _web/ # wheel GENERATED (make wheel) — do not edit +│ ├── probing_hook.py # .pth → site hook +│ └── probing.pth +├── src/lib.rs # PyO3 entry → probing._core (maturin) +├── probing/ # Rust WORKSPACE (core, server, cli, extensions) +├── web/ # Dioxus UI (`make frontend` → web/dist/) +├── tests/ # see tests/README.md +├── examples/ # optional torch/etc. +└── docs/src/ # this documentation site ``` -## Areas for Contribution +Architecture layers (what may call what): [Modularity](design/modularity.md). +Agent workflow: [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md). + + + +## Submitting changes -### Good First Issues +### Pull request process -Look for issues labeled `good-first-issue` on GitHub. These are suitable for newcomers. +1. Fork and branch: `git checkout -b feature/your-feature` +2. Change + tests + docs +3. `make test && make lint` +4. Open PR with a focused description -### Documentation +### Commit messages -- Improve existing documentation -- Add more examples -- Translate documentation +[Conventional Commits](https://www.conventionalcommits.org/): `feat:`, `fix:`, `docs:`, `test:`, `chore:`, … -### Testing +### Code review -- Add test coverage -- Write integration tests -- Performance benchmarks +- Keep PRs focused; add tests for behavior changes +- Update user-facing docs when install/dev flow changes -### Features +## Areas for contribution -- Check the roadmap and open issues -- Discuss large changes before implementing +We welcome contributions at every layer — you **do not** need Rust or frontend experience to start. -## Getting Help +| Label / area | Examples | +|--------------|----------| +| **Skills & docs** | New diagnostics, clearer guides, translations | +| **`good-first-issue`** | Curated starter tasks on GitHub | +| **Python plugins** | `@table` collectors, skill tooling | +| **Rust / Web** | Engine, server, UI — best with matching background | +| **Tests** | Unit/regression coverage — see [`tests/README.md`](https://github.com/DeepLink-org/probing/blob/main/tests/README.md) | -- **GitHub Issues**: For bugs and feature requests -- **Discussions**: For questions and ideas +Discuss large features in an issue before a big PR. -## Code of Conduct +## Getting help -Please be respectful and constructive in all interactions. We are committed to providing a welcoming environment for everyone. +- **GitHub Issues** — bugs and features +- **Discussions** — questions and design -## License +## Code of conduct -By contributing, you agree that your contributions will be licensed under the project's Apache 2.0 license. +Please be respectful and constructive. Contributions are licensed under Apache 2.0. diff --git a/docs/src/contributing.zh.md b/docs/src/contributing.zh.md index c233d592..118c3670 100644 --- a/docs/src/contributing.zh.md +++ b/docs/src/contributing.zh.md @@ -1,197 +1,300 @@ # 贡献指南 -感谢您对贡献 Probing 的兴趣!本指南将帮助您开始。 +感谢参与 Probing 开发。本文是 **从 git 仓库开发** 的权威说明。 -## 入门 +| 主题 | 文档 | +|------|------| +| **初次参与?从这里开始** | 下文 [欢迎参与开发](#getting-started) | +| 用户安装(PyPI / wheel) | [安装指南](installation.zh.md) | +| 日常开发 bootstrap | [开发环境](#development-setup) | +| Agent 诊断 skill | [Skills 与 Agent](#skills-agents) + [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | +| PR / 规范 / 行为准则 | [提交变更](#submitting-changes) | -### 前提条件 + -- Python 3.9+ -- Rust(最新稳定版) -- maturin(用于构建 Python 扩展) +## 欢迎参与开发 -### 开发环境设置 +Probing 是**分层**项目:Rust 里的 SQL 引擎与采集、Python SDK 与 hook、诊断 skill、Web UI。**不必一次学完所有层**——按你的背景选一条贡献路径即可。 -1. 克隆仓库: +### 前 30 分钟 ```bash git clone https://github.com/DeepLink-org/probing.git cd probing +python3 -m venv .venv && source .venv/bin/activate # 或:uv venv && source .venv/bin/activate +pip install maturin +make develop +make check-dev +make test-python-regression # Python 冒烟;完整套件:make test ``` -2. 创建虚拟环境: +以上通过即表示环境就绪。可选:`./skills/install.sh`,让 Cursor / Claude / Codex 加载仓库 skill。 -```bash -python -m venv .venv -source .venv/bin/activate # Linux/macOS -# 或 -.venv\Scripts\activate # Windows -``` +本地预览文档:`make docs-install && make docs-serve` → http://127.0.0.1:8000 -3. 安装开发依赖: +### 选择贡献方向 -```bash -pip install -e ".[dev]" -``` +| 方向 | 典型工作 | 主要目录 | 先读 | 入门任务示例 | +|------|----------|----------|------|----------------| +| **Skill** | 训练诊断流程 | [`skills/`](https://github.com/DeepLink-org/probing/blob/main/skills/README.md) | [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md)、[扩展 — skill](design/extensibility.zh.md#path-2-diagnostic-skill) | 新增 skill、改 `steps.yaml` 里的 SQL、完善 `SKILL.md` | +| **Python** | 表插件、hook、skill 工具 | `python/probing/`、[`python/probing/skills/`](https://github.com/DeepLink-org/probing/blob/main/python/probing/skills/README.md) | [扩展 — 表插件](design/extensibility.zh.md#path-1-table-plugin-dataclass--table) | `@table` 示例、`tests/regression/skills/` 补测试 | +| **文档与示例** | 概念、教程、排错 | `docs/src/`、`examples/` | [核心概念](guide/concepts.zh.md) | 修正文档、补充 troubleshooting | +| **Rust** | 引擎、服务、采集、CLI | `probing/`(Rust workspace) | [模块化](design/modularity.zh.md) | `probing/core`、`probing/server` 相关 issue | +| **Web UI** | Investigate、各页面 | `web/` | [web/DESIGN.md](https://github.com/DeepLink-org/probing/blob/main/web/DESIGN.md) | Agent 体验(完整 wheel 构建需 `dx`) | -4. 构建 Rust 扩展: +**Skill 数据 vs Python 包:** skill **内容**改仓库根 `skills/`;**加载/安装代码**改 `python/probing/skills/`。**不要**手改 `python/probing/_skills/`(由 `make wheel` 自动生成)。 -```bash -maturin develop -``` +**两个 `probing/` 目录:** 仓库根 `probing/` 是 **Rust**;`python/probing/` 是 **Python 包**。根目录 `src/lib.rs` 是 PyO3 入口,构建为 `probing._core`。 -## 开发流程 +### 第一个 Pull Request -### 运行测试 +1. Fork 并建分支:`git checkout -b docs/my-improvement`(或 `feat/…`、`fix/…`) +2. 在**一条**贡献路径上做聚焦改动 +3. 跑相关测试: + - Skill:`python -m probing.skills validate`、`pytest tests/regression/skills/ -q` + - Python:`pytest tests/unit/probing/…` 或 `tests/regression/…` + - Rust:`make test-rust-unit` 或 `make test-rust-regression` + - 仅文档:`make docs` +4. 改了代码则跑 `make lint` +5. 提 PR — 说明**做了什么、为什么**;有关联 issue 请链接 -```bash -# 运行所有测试 -make test +不确定改动该落在哪一层?先开 [Discussion](https://github.com/DeepLink-org/probing/discussions) 或 issue,我们可以帮你指路。 -# 运行特定测试 -pytest tests/test_specific.py -v + -# 运行带覆盖率的测试 -make coverage -``` +## 前提条件 -### 代码风格 +- **Python** 3.9+ +- **Rust**(最新 stable)+ **Cargo** +- **maturin** — 构建 `probing._core`(`pip install maturin` 或 `uv pip install maturin`) +- **uv**(可选,推荐)— 常用 `uv venv`;若 venv 无 `pip`,Makefile 会改用 `uv pip` -我们使用以下工具保证代码质量: +可选(仅发布 / Web UI): -**Python:** +- **dioxus-cli**(`dx`)— `make frontend` 构建 Web UI;`make wheel` 将其嵌入 wheel +- **cargo-zigbuild** + **ziglang** — Linux manylinux wheel(`make wheel-ci`) -- `ruff` 用于代码检查和格式化 -- `mypy` 用于类型检查 + + +## 开发环境 + +每个 clone 只需一次: ```bash -# 格式化代码 -ruff format . +git clone https://github.com/DeepLink-org/probing.git +cd probing -# 检查代码规范 -ruff check . +# 虚拟环境(二选一) +python3 -m venv .venv && source .venv/bin/activate +# 或:uv venv && source .venv/bin/activate -# 类型检查 -mypy python/probing +pip install maturin # 或:uv pip install maturin +make develop +./skills/install.sh # 可选:安装到 Cursor / Claude / Codex ``` -**Rust:** +`make develop` 会依次: -- `rustfmt` 用于格式化 -- `clippy` 用于代码检查 +1. **`make core`** — `maturin develop` → `probing._core`、editable `probing.pth`(把 repo `python/` 加入 `sys.path`)、`probing` CLI 进 `PATH` +2. **`install-dev-python-deps`** — 安装 `pytest`、`pyyaml` 等(`pip` / `uv pip` / `ensurepip`) +3. **`python/probing/dev_pth.py install`** — 写入 `probing_hook.pth`,与 wheel 的自动 hook 行为一致 +4. **`check-dev`** — 冒烟:`_core`、skill 目录、CLI -```bash -# 格式化 -cargo fmt +随时可检查: -# 检查 -cargo clippy --all --tests --benches -- -D warnings +```bash +make check-dev +python python/probing/dev_pth.py status ``` -### 构建文档 +### Site hook(`.pth`):develop 与 wheel + +| 文件 | 来源 | 作用 | +|------|------|------| +| `probing.pth` | maturin | Wheel:`import probing_hook`。Develop:**路径行**指向 repo `python/` | +| `probing_hook.pth` | `make develop`(`dev_pth.py`) | 仅 develop:`import probing_hook`(与路径 `.pth` 配对) | + +实现:`python/probing_hook.py` → `python/probing/site_hook.py`。 +训练 / 测试:设置 `PROBING=1`(或 `2`、过滤规则 — 见 `site_hook.py`)。测试默认 `PROBING=1`(`tests/conftest.py`)。 + +在 project venv 内 **`make develop` 后不必再设 `PYTHONPATH=python/`**。 + +### Makefile 目标(日常) + +在仓库根目录执行 **`make help`** 可查看全部目标及一行说明。 + +| 目标 | 用途 | +|------|------| +| `make develop` / `make dev` | 首次或较大结构变更后 | +| `make core` | 只改了 Rust 扩展 | +| `make check-dev` | 快速检查环境 | +| `make test` | Rust + Python 测试 | +| `make lint` | `ruff check` + `cargo clippy`(workspace + `web/`) | +| `make clippy-fix` | Clippy 自动修复(`--fix --allow-dirty`) | +| `make test-rust` / `make test-python` | 分开跑 | +| `make docs-install` | MkDocs 依赖(首次改文档时) | +| `make docs-serve` | 文档热重载预览 http://127.0.0.1:8000 | +| `make docs` | 静态构建到 `docs/site/` | +| `python -m probing.skills validate` | 校验 `skills/` | +| `make frontend` | 手动构建 `web/dist/`(改 UI 或打 wheel 前) | +| `make wheel` | 发布 wheel(需先有 `web/dist/`;自动 bundle skills + UI) | +| `make install-wheel` | 重装 `dist/probing-*.whl` | + +日常: ```bash -cd docs -make install # 安装依赖 -make serve # 在 http://127.0.0.1:8000 预览 +source .venv/bin/activate +make test +probing skill list +make core # 仅 Rust 改动后 ``` -## 提交变更 +### 发布 / CI wheel 冒烟 -### Pull Request 流程 +```bash +make frontend && make wheel && make install-wheel +make test-python-wheel +``` + +### 示例(可选 ML 依赖) -1. Fork 仓库 -2. 创建功能分支: +`make develop` **不会**安装 PyTorch。跑 `examples/` 时需自行安装,例如: ```bash -git checkout -b feature/your-feature-name +uv pip install torch torchvision +PROBING=1 python examples/events.py ``` -3. 进行修改 -4. 运行测试和检查: +见 [examples/README.md](https://github.com/DeepLink-org/probing/blob/main/examples/README.md)。 + +## Skills 与 Agent {#skills-agents} + +- **编写**:仓库根 `skills/`(`SKILL.md`、`steps.yaml`、`catalog.yaml`) +- **安装到 IDE**:`./skills/install.sh` 或 `probing skill install` +- **打进 wheel**:`make wheel` 自动复制到 `python/probing/_skills/`、`python/probing/_web/` +- **说明**:`skills/README.md`、[扩展机制 — 诊断 skill](design/extensibility.zh.md#path-2-diagnostic-skill) + +## 开发流程 + +### 运行测试 + +测试分为 **单元** 与 **回归** 两层,目录约定见 [`tests/README.md`](https://github.com/DeepLink-org/probing/blob/main/tests/README.md)。 + +| 类型 | Rust | Python | +|------|------|--------| +| 单元 | 源码内 `#[cfg(test)]` | `tests/unit/probing/` 镜像 `python/probing/` | +| 回归 | `tests/regression/rust/probing/**` + `probing/macros/tests/` | `tests/regression/`(含 `spec/api_spec.json`) | ```bash make test -make lint +make test-rust-unit +make test-rust-regression +make test-python-unit +make test-python-regression +make test-python +make coverage ``` -5. 使用描述性消息提交: +**Rust 例外:** `probing/macros/tests/` 为 proc-macro 外部 crate 测试,必须保留独立文件。 + +### 代码风格 + +**Python:** `ruff`、`mypy` ```bash -git commit -m "feat: 添加新功能描述" +ruff format . +ruff check . +mypy python/probing ``` -6. 推送并创建 Pull Request +**Rust:** `rustfmt`、`clippy`(共享规则在 `clippy.toml`;严格 lint **按 crate 渐进启用**,见各 crate 的 `Cargo.toml` `[lints]`) -### 提交消息格式 +```bash +cargo fmt --all +make lint-core # probing-core(已启用 clippy::all) +make lint-rust # workspace + web/,warning 视为 error +make clippy-fix # 自动修复(提交前请 review diff) +``` -我们遵循 [Conventional Commits](https://www.conventionalcommits.org/): +CI 与 pre-commit(`make setup`)会跑 Clippy。改 `probing-core` 后推送前建议 `make lint-core`;全 workspace 仍会因未 lint 的 crate 失败,其余 crate 会逐个跟进。 -- `feat:` - 新功能 -- `fix:` - Bug 修复 -- `docs:` - 文档变更 -- `style:` - 代码风格变更(格式化) -- `refactor:` - 代码重构 -- `test:` - 测试变更 -- `chore:` - 构建/工具变更 +当前进度:`probing-core` 已启用 `clippy::all`(`pedantic`/`nursery` 关闭,协议相关 allow 见 `probing/core/Cargo.toml`)。下一批候选:`probing-proto`、`probing-memtable`。 -### 代码审查 +### 构建文档 -所有提交都需要代码审查。请: +在**仓库根目录**(与 `make test`、`make develop` 同一入口): -- 保持 PR 专注于单一变更 -- 为新功能添加测试 -- 根据需要更新文档 -- 及时响应审查反馈 +```bash +make docs-install # 首次:MkDocs + i18n + mkdocstrings +make docs-serve # http://127.0.0.1:8000,保存后自动刷新 +make docs # 静态构建 → docs/site/ +``` + +进阶:`cd docs && make deploy` 发布到 GitHub Pages。 ## 项目结构 ``` -probing/ -├── python/ # Python 源代码 -│ └── probing/ # 主 Python 包 -├── probing/ # Rust crates -│ ├── core/ # 核心功能 -│ ├── server/ # HTTP 服务器 -│ ├── extensions/ # Python/PyTorch 扩展 -│ └── cli/ # 命令行界面 -├── tests/ # Python 测试 -├── docs/ # 文档 -└── examples/ # 使用示例 +probing/ # 仓库根 +├── skills/ # skill 数据(编写)— 见 skills/README.md +├── python/ +│ ├── probing/ # Python 包(不是 Rust) +│ │ ├── skills/ # skill 加载/安装代码 — 见 python/probing/skills/README.md +│ │ ├── web_assets.py # wheel _web/ + editable web/dist → PROBING_ASSETS_ROOT +│ │ ├── _skills/ # wheel 生成(make wheel),勿手改 +│ │ └── _web/ # wheel 生成(make wheel),勿手改 +│ ├── probing_hook.py +│ └── probing.pth +├── src/lib.rs # PyO3 → probing._core +├── probing/ # Rust workspace +├── web/ # Dioxus UI(`make frontend` → web/dist/) +├── tests/ # 见 tests/README.md +├── examples/ +└── docs/src/ ``` -## 贡献领域 +分层与依赖规则:[模块化](design/modularity.zh.md)。 +Agent 工作流:[AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md)。 + + -### 适合新手的 Issues +## 提交变更 -在 GitHub 上查找标记为 `good-first-issue` 的问题。这些适合新贡献者。 +### Pull Request 流程 -### 文档 +1. Fork 并建分支:`git checkout -b feature/xxx` +2. 修改 + 测试 + 文档 +3. `make test && make lint` +4. 提交 PR,说明清晰、范围聚焦 -- 改进现有文档 -- 添加更多示例 -- 翻译文档 +### 提交消息 -### 测试 +遵循 [Conventional Commits](https://www.conventionalcommits.org/):`feat:`、`fix:`、`docs:`、`test:`、`chore:` 等。 -- 增加测试覆盖率 -- 编写集成测试 -- 性能基准测试 +### 代码审查 -### 功能 +- PR 聚焦单一主题;行为变更需测试 +- 安装 / 开发流程变更需同步文档 -- 查看路线图和开放的 issues -- 大型变更前请先讨论 +## 贡献方向 -## 获取帮助 +各层都欢迎 PR——**不要求**一开始就懂 Rust 或前端。 -- **GitHub Issues**:用于 Bug 和功能请求 -- **Discussions**:用于问题和想法讨论 +| 标签 / 领域 | 示例 | +|-------------|------| +| **Skill 与文档** | 新诊断、文档改进、翻译 | +| **`good-first-issue`** | GitHub 上的入门 issue | +| **Python 插件** | `@table` 采集、skill 工具链 | +| **Rust / Web** | 引擎、服务、UI — 适合有对应背景的同学 | +| **测试** | 单元/回归覆盖 — 见 [`tests/README.md`](https://github.com/DeepLink-org/probing/blob/main/tests/README.md) | -## 行为准则 +大功能请先开 issue 讨论,再做大 PR。 + +## 获取帮助 -请在所有互动中保持尊重和建设性。我们致力于为每个人提供友好的环境。 +- **GitHub Issues** — Bug 与功能 +- **Discussions** — 问题与设计讨论 -## 许可证 +## 行为准则 -通过贡献,您同意您的贡献将根据项目的 Apache 2.0 许可证进行许可。 +请保持尊重与建设性。贡献采用 Apache 2.0 许可证。 diff --git a/docs/src/design/cluster-pulsing.md b/docs/src/design/cluster-pulsing.md index 459a3871..fcf145f9 100644 --- a/docs/src/design/cluster-pulsing.md +++ b/docs/src/design/cluster-pulsing.md @@ -1,136 +1,52 @@ # Cluster Management with Pulsing -This document describes how probing's cluster module reuses Pulsing's distributed capabilities (gossip membership, failure detection, naming) for automatic node discovery and liveness, while keeping existing APIs and business semantics (rank, role, etc.). +Design note: reuse [Pulsing](https://github.com/DeepLink-org/Pulsing) gossip membership and +failure detection for probing cluster discovery, while keeping probing's training semantics +(`rank`, `role`, federation tags). -## 现状 +!!! note "Language" + The full design narrative is maintained in Chinese: + **[cluster-pulsing.zh.md](cluster-pulsing.zh.md)**. This page is an English summary. -### probing 当前集群模型 +## Current probing cluster model -- **数据源**:内存中的 `probing_proto::Cluster`,key 为 `host:addr`,带 `rank_index`(rank → 节点)。 -- **Node 字段**(proto):`host`, `addr`, `local_rank`, `rank`, `world_size`, `group_rank`, `role_name`, `role_rank`, `role_world_size`, `status`, `timestamp`。 -- **写入路径**: - - **rank 0**:本机直接调用 `update_node(node)`(见 `report.rs`)。 - - **其他 rank**:通过 HTTP `PUT /apis/nodes` 向「中心」(report_addr,通常为 rank 0 或独立 server)上报。 -- **读取路径**:HTTP `GET /apis/nodes`、Web 集群页、extensions/cc 的 `nodes` 表(Arrow)。 -- **特点**:无内置故障检测;依赖应用侧定时上报;中心聚合视图。 +- **Store**: in-memory `probing_proto::Cluster`, keyed by `host:addr`, with `rank_index`. +- **Node fields**: `host`, `addr`, ranks, `role_name` (torchrun), **`role`** (probing parallel + key like `dp=2,pp=1,tp=0`), `status`, `timestamp`. +- **Write path**: rank 0 calls `update_node` locally; other ranks `PUT /apis/nodes` to the + report address (usually rank 0). +- **Read path**: `GET /apis/nodes`, Web cluster view, `cluster.nodes` SQL table. +- **Limitation**: no built-in failure detection; liveness depends on app heartbeats. -### Pulsing 提供的集群能力 +CLI today: `probing -t cluster nodes` and `cluster query`. -- **Gossip 成员**:SWIM 风格,`GossipCluster`,周期 gossip + 故障检测(PFail → Fail)。 -- **成员信息**:`MemberInfo`:`node_id`(u128)、`addr`(SocketAddr)、`status`(Alive/Suspect/Dead)、`incarnation` 等。 -- **API**: - - Rust:`cluster.all_members()` / `alive_members()`。 - - Python:`await system.members()` → `list[dict]`(`node_id`, `addr`, `status` 等)。 - - HTTP:`GET /cluster/members` 返回 JSON 成员列表。 -- **发现**:seed 加入、named actor 注册、跨节点解析。 +## What Pulsing adds -## 设计目标 +- SWIM-style gossip (`GossipCluster`) with PFail → Fail detection. +- `alive_members()` / HTTP `GET /cluster/members` for membership without app polling. -1. **成员发现与存活**:由 Pulsing 负责「谁在集群里、谁还活着」,probing 不再仅依赖应用上报来推断存活。 -2. **保留业务语义**:rank、world_size、role_name 等训练/作业语义仍由 probing 侧维护(上报或配置)。 -3. **接口兼容**:现有 `get_nodes` / `put_node`、`nodes` 表、Web 集群页行为保持可用;可演进为「Pulsing 成员 + 业务元数据合并」视图。 -4. **松耦合**:probing 自管、主动发现 Pulsing;不要求 Pulsing 或应用先「接好」probing。 +## Design goals -## 松耦合原则(Loose Coupling) +1. **Discovery & liveness** from Pulsing; probing keeps rank/role/world_size semantics. +2. **No breaking API** — existing `PUT /apis/nodes`, `cluster.nodes`, `global.*` federation unchanged. +3. **Optional integration** — probing works without Pulsing; Pulsing enhances multi-node discovery. -1. **probing 被注入后,自己管好自己** - 不依赖外部先启动或配置 Pulsing;probing 进程内行为自洽(上报、本地 CLUSTER、HTTP API 等照常工作)。 +## Proposed integration (summary) -2. **cluster 模块主动发现 Pulsing** - probing 的 cluster 模块在适当时机(例如 server 启动或首次访问集群视图时)**尝试发现**当前环境里是否已有 Pulsing(例如检测全局 ActorSystem、环境变量、或指定 URL/端口)。 - -3. **发现 Pulsing 后的两种路径** - - **a. Pulsing 已初始化** - 若发现 Pulsing 的 ActorSystem 已经存在(例如用户代码已 `pul.init()`): - - 在该 ActorSystem 上**注册一个专用于集群管理的 actor**(例如 named actor `"probing/cluster"`); - - 节点发现通过**向该 actor 请求**或**该 actor 订阅/拉取 members()** 得到,再写回 probing 的 `CLUSTER`。 - - **b. Pulsing 未初始化,且配置了初始化方式** - 若未发现已初始化的 Pulsing,但配置中指定了如何初始化(例如 `pulsing_seeds`、standalone 等): - - probing **尝试自己初始化** Pulsing(例如在 Python 侧调用 `pul.init(seeds=...)` 或等价逻辑); - - 初始化成功后,再走路径 a:注册集群管理 actor,通过该 actor 做节点发现。 - -未发现 Pulsing 或未配置初始化时,cluster 模块**仅使用现有上报**构建视图,行为与当前一致。 - -## 集成形态(在松耦合下的表现) - -- **有 Pulsing(已初始化)**:cluster 模块发现现有 ActorSystem → 注册集群管理 actor → 通过该 actor 拉取 members,与上报合并写入 CLUSTER。 -- **有 Pulsing(需由 probing 初始化)**:cluster 模块按配置初始化 Pulsing → 注册集群管理 actor → 同上。 -- **无 Pulsing**:不注册 actor,仅靠 PUT /apis/nodes 与 rank 0 本地 update_node 构建视图。 - -## 数据流(松耦合) - -```text -┌─────────────────────────────────────────────────────────────────┐ -│ probing 进程(被注入后自管) │ -│ • cluster 模块尝试发现 Pulsing │ -└────────────────────────────┬──────────────────────────────────┘ - │ - ┌───────────────────┼───────────────────┐ - ▼ ▼ ▼ - 未发现 Pulsing 发现已初始化 Pulsing 未初始化但配置了 init - │ │ │ - ▼ ▼ ▼ - 仅用上报构建视图 在 ActorSystem 上 probing 自己 init - (当前行为) 注册集群管理 actor Pulsing,再注册 actor - │ │ - └─────────┬─────────┘ - ▼ -┌─────────────────────────────────────────────────────────────────┐ -│ Pulsing ActorSystem │ -│ • 集群管理 actor(如 "probing/cluster")拉取 members() │ -│ • 映射为 Node 基础信息,与 PUT 上报的 rank/role 合并 │ -└────────────────────────────┬──────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────┐ -│ probing_core::cluster::CLUSTER │ -│ Cluster { nodes: host:addr -> Node, rank_index } │ -│ Node = 基础(Pulsing) + 业务(rank, world_size, role, ...) │ -└────────────────────────────┬──────────────────────────────────┘ - │ - ┌───────────────┼───────────────┐ - ▼ ▼ ▼ - GET /apis/nodes Web 集群页 extensions/cc nodes 表 +```mermaid +flowchart LR + TRAIN[Training ranks] -->|PUT /apis/nodes| PROBE[Probing server] + PULS[Pulsing gossip] -->|alive members| PROBE + PROBE --> NODES[cluster.nodes + federation] + CLI[probing cluster nodes] --> PROBE ``` -- **合并规则**:以 `host:addr` 或 Pulsing `node_id` 为键;若某节点仅有 Pulsing 信息则只填基础字段,rank/role 为空或默认;若仅有上报则仅填业务字段,存活状态可标为「未知」或依赖超时剔除。 -- **故障检测**:从 Pulsing 来的节点若 `status != Alive`,可在 probing 视图中标记为 Unhealthy/Unreachable 或从列表中过滤/标注。 - -## 接口与兼容性 - -- **保持**:`GET /apis/nodes`、`PUT /apis/nodes`、`cluster::get_nodes()`、`cluster::update_node()`、extensions/cc `nodes` 表 schema(host, addr, rank, world_size, role_*, status, timestamp)。 -- **扩展**(可选): - - Node 或 API 增加 `pulsing_node_id`、`pulsing_status`,便于调试与展示。 - - 配置项:发现方式(如 `pulsing_auto_discover`)、初始化方式(如 `pulsing_seeds`、`pulsing_init_mode`)。 -- **兼容**:未发现 Pulsing 且未配置初始化时,行为与当前一致,仅靠上报构建集群视图。 - -## 实施步骤建议 - -1. **Phase 1(发现 + 使用已有 Pulsing)** - - cluster 模块实现「发现 Pulsing」:检测全局 ActorSystem(Python 侧 `pul.get_system()` / 是否已 init)、或环境变量/配置中的 Pulsing 入口。 - - 若已初始化:在 ActorSystem 上注册集群管理 actor(named,如 `"probing/cluster"`),该 actor 负责拉取 `members()`、映射为 `Vec`,并可由 probing 侧定时请求或订阅更新;合并进 CLUSTER。 - - 配置:仅「是否启用发现」与「集群管理 actor 名称」等,不强制要求配置 Pulsing。 - -2. **Phase 2(可选由 probing 初始化 Pulsing)** - - 当未发现已初始化的 Pulsing 且配置了初始化方式(如 `pulsing_seeds`、standalone)时,cluster 模块(或 Python 桥)尝试调用 `pul.init(...)`(或等价)。 - - 初始化成功后走 Phase 1:注册集群管理 actor,通过该 actor 做节点发现。 - - 统一「成员源」:仅上报 / Pulsing(通过集群管理 actor)/ 合并。 - -3. **Phase 3(可选增强)** - - 集群管理 actor 可对外提供「注册 rank/role」接口,与 PUT /apis/nodes 互补或替代。 - - 分布式存储(TopologyView)的节点列表也可从 Pulsing 成员驱动。 - -## 依赖与约束 - -- **依赖**:若在 Rust 侧直接依赖 Pulsing,需在 probing 的 Cargo 中增加 `pulsing-actor`(或仅通过 HTTP/FFI 调用则无 Rust 依赖)。 -- **进程模型**:当前 report 仅 rank 0 写本地、其余 PUT 到中心;与 Pulsing 集成后,中心或 rank 0 需能访问 Pulsing 视图(同进程或远程)。 -- **身份对应**:需要约定 Pulsing 节点与 probing 节点的对应关系(例如同一进程既上报 `host:addr` 又加入 Pulsing,则用 `addr` 或 node_id 关联)。 - -## 小结 +- Map Pulsing `MemberInfo` → probing `Node` skeleton; merge training-reported fields on heartbeat. +- Suspect/dead members surface in `cluster.nodes.status` for Web/CLI. +- Federation rewrite (`_rank`, `_role`, …) unchanged — see [Distributed](distributed.md). -- **松耦合**:probing 被注入后自管;cluster 模块主动发现 Pulsing;发现后要么用已有 ActorSystem 并注册集群管理 actor,要么在配置允许时由 probing 自己初始化 Pulsing 再注册 actor。 -- **用 Pulsing 做**:通过「集群管理 actor」做成员发现与存活检测;该 actor 挂在 Pulsing 的 ActorSystem 上,由 probing 注册与使用。 -- **probing 保留**:rank/world_size/role 等业务语义、现有 HTTP API、`nodes` 表与 Web 集群页;无 Pulsing 时行为不变。 -- **集成方式**:发现 → 已初始化则注册 actor / 未初始化且配置则先 init 再注册 actor → 通过该 actor 拉取 members 并与上报合并写入 CLUSTER。 +## Related -这样在不破坏现有使用方式、且不要求应用或 Pulsing 先接好 probing 的前提下,为 probing 带来基于 Pulsing 的自动集群发现与故障感知能力。 +- **[Distributed](distributed.md)** — `global.*`, `cluster query`, `role` +- **[Cluster with Pulsing (中文)](cluster-pulsing.zh.md)** — full design +- **[SQL Tables](../reference/sql-tables.md)** — `cluster.nodes` columns diff --git a/docs/src/design/cluster-pulsing.zh.md b/docs/src/design/cluster-pulsing.zh.md index ae346b2d..3c6ce24a 100644 --- a/docs/src/design/cluster-pulsing.zh.md +++ b/docs/src/design/cluster-pulsing.zh.md @@ -7,7 +7,7 @@ ### probing 当前集群模型 - **数据源**:内存中的 `probing_proto::Cluster`,key 为 `host:addr`,带 `rank_index`(rank → 节点)。 -- **Node 字段**(proto):`host`, `addr`, `local_rank`, `rank`, `world_size`, `group_rank`, `role_name`, `role_rank`, `role_world_size`, `status`, `timestamp`。 +- **Node 字段**(proto):`host`, `addr`, `local_rank`, `rank`, `world_size`, `group_rank`, `role_name`, `role_rank`, `role_world_size`, `role`, `status`, `timestamp`。其中 `role` 是并行角色 key(如 `dp=2,pp=1,tp=0`),由训练进程上报,联邦查询时作为 `_role` 标签附加到每行(区别于 torchrun 的 `role_name`)。 - **写入路径**: - **rank 0**:本机直接调用 `update_node(node)`(见 `report.rs`)。 - **其他 rank**:通过 HTTP `PUT /apis/nodes` 向「中心」(report_addr,通常为 rank 0 或独立 server)上报。 @@ -109,7 +109,7 @@ bootstrap 后台会按顺序尝试上述两种方式;probing 只需在启动 ## 接口与兼容性 -- **保持**:`GET /apis/nodes`、`PUT /apis/nodes`、`cluster::get_nodes()`、`cluster::update_node()`、extensions/cc `nodes` 表 schema(host, addr, rank, world_size, role_*, status, timestamp)。 +- **保持**:`GET /apis/nodes`、`PUT /apis/nodes`、`cluster::get_nodes()`、`cluster::update_node()`、extensions/cc `nodes` 表 schema(host, addr, rank, world_size, role_*, role, status, timestamp)。 - **扩展**(可选): - Node 或 API 增加 `pulsing_node_id`、`pulsing_status`,便于调试与展示。 - 配置项:发现方式(如 `pulsing_auto_discover`)、初始化方式(如 `pulsing_seeds`、`pulsing_init_mode`)。 diff --git a/docs/src/design/data-layer.zh.md b/docs/src/design/data-layer.zh.md index d59eca4b..f14a1f62 100644 --- a/docs/src/design/data-layer.zh.md +++ b/docs/src/design/data-layer.zh.md @@ -250,7 +250,7 @@ chunk。每行恰好计数一次,且去重对环形回收免疫(generation | `cold_max_total_mb` | `PROBING_COLD_MAX_TOTAL_MB` | 冷层字节预算(MiB) | 无限 | | `cold_ttl_secs` | `PROBING_COLD_TTL_SECS` | 淘汰早于此时长的冷段 | 无 | | — | `PROBING_COLD_TARGET_MB` | 段滚动大小(MiB) | 64 | -| — | `PROBING_COLD_POLL_MS` | 徕出轮询间隔 | 2000 | +| — | `PROBING_COLD_POLL_MS` | 排空轮询间隔 | 2000 | | — | `PROBING_COLD_MAX_AGE_SECS` | 空闲打开段多久后封存 | 300 | ## 保证与已知边界 @@ -276,5 +276,5 @@ chunk。每行恰好计数一次,且去重对环形回收免疫(generation ## 测试 数据层附带单元与端到端测试:热层环形的锁/回收/fork 测试(`probing-memtable`)、MEMC 的 -格式/恢复/compactor 测试(含带反例的重启去重),以及经运行时 owner 徕出、再通过真实 catalog 路径 +格式/恢复/compactor 测试(含带反例的重启去重),以及经运行时 owner 排空、再通过真实 catalog 路径 查询合并结果的 SQL 端到端测试(`probing-core::memtable_sql`)。 diff --git a/docs/src/design/debugging.md b/docs/src/design/debugging.md index 5847fae2..af4a2e7e 100644 --- a/docs/src/design/debugging.md +++ b/docs/src/design/debugging.md @@ -200,9 +200,17 @@ The HTTP API can be used for IDE integration: ### Jupyter +There is no `probing.connect()` API. From a notebook cell, shell out to the CLI +(same as any external tool): + ```python -from probing import connect +import os, subprocess -probe = connect(pid=12345) -probe.eval("print(globals().keys())") +endpoint = os.environ["ENDPOINT"] # pid or host:port +subprocess.run( + ["probing", "-t", endpoint, "eval", "print(list(globals().keys()))"], + check=True, +) ``` + +Or use `!probing -t $ENDPOINT eval "..."` when `ENDPOINT` is set in the notebook environment. diff --git a/docs/src/design/debugging.zh.md b/docs/src/design/debugging.zh.md index f8149ab8..37d0405d 100644 --- a/docs/src/design/debugging.zh.md +++ b/docs/src/design/debugging.zh.md @@ -183,3 +183,33 @@ for thread_id, frame in sys._current_frames().items(): print(f'线程 {thread_id}:') traceback.print_stack(frame)" ``` + +## 与 IDE 集成 + +### VS Code + +可通过 HTTP API 做 IDE 集成: + +```json +{ + "type": "probing", + "request": "attach", + "endpoint": "localhost:8080" +} +``` + +### Jupyter + +**没有** `probing.connect()` API。在 notebook 单元格中通过 CLI 调用(与任何外部工具相同): + +```python +import os, subprocess + +endpoint = os.environ["ENDPOINT"] # pid 或 host:port +subprocess.run( + ["probing", "-t", endpoint, "eval", "print(list(globals().keys()))"], + check=True, +) +``` + +或在 notebook 环境已设置 `ENDPOINT` 时使用:`!probing -t $ENDPOINT eval "..."`。 diff --git a/docs/src/design/distributed.md b/docs/src/design/distributed.md index 871f2dcc..3fe86e03 100644 --- a/docs/src/design/distributed.md +++ b/docs/src/design/distributed.md @@ -59,8 +59,8 @@ probing -t node2:8080 list ### Cluster View ```bash -# Aggregate view across cluster -probing cluster list +# List registered peers in the cluster view (connect to rank-0 / master endpoint) +probing -t rank0:8080 cluster nodes ``` ## Cross-Node Queries @@ -73,16 +73,37 @@ SELECT * FROM python.torch_trace WHERE step = (SELECT MAX(step) FROM python.torch_trace)" ``` -### Query All Nodes +### Federated query (`global.*`) + +Cross-rank SQL uses the **`global` catalog**. The master fans out to registered peers and +attaches federation tags **`_host`**, **`_addr`**, **`_rank`**, **`_role`** (parallel-role +key from the node registry, e.g. `dp=2,pp=1,tp=0`). + +**Option A — SQL engine (preferred for analytics):** + +```bash +probing -t rank0:8080 query " +SELECT _role, _rank, avg(duration_ms) AS avg_ms +FROM global.python.comm_collective +WHERE global_step > 100 +GROUP BY _role, _rank +ORDER BY avg_ms DESC" +``` + +**Option B — cluster fan-out API:** ```bash -# Federated query (future feature) -probing cluster query " -SELECT node, rank, step, loss -FROM python.training_metrics -ORDER BY step" +probing -t rank0:8080 cluster query " +SELECT _role, _rank, avg(duration_ms) AS avg_ms +FROM global.python.comm_collective +GROUP BY _role, _rank +ORDER BY avg_ms DESC" ``` +Register peers with torchrun (`setup_torchrun_cluster`) or `PUT /apis/nodes` so `_rank` and +`_role` resolve correctly. Override role at runtime with `probing.set_role(...)` in training +scripts. + ## Synchronized Debugging ### Capture All Stacks @@ -109,21 +130,43 @@ if dist.is_initialized(): ## Communication Analysis -### NCCL Operations +### Collective latency (coarse, built-in) + +`python.comm_collective` records `torch.distributed` calls with wall time. No NCCL plugin required. ```sql --- Analyze communication patterns -SELECT - operation, - src_rank, - dst_rank, - bytes_transferred, - duration_ms -FROM python.nccl_trace -WHERE step = (SELECT MAX(step) FROM python.nccl_trace) -ORDER BY duration_ms DESC; +SELECT rank, op, avg(duration_ms) AS avg_ms, count(*) AS n +FROM python.comm_collective +WHERE global_step >= (SELECT max(global_step) - 20 FROM python.comm_collective) +GROUP BY rank, op +ORDER BY avg_ms DESC; +``` + +```bash +probing -t $ENDPOINT skill run slow_rank +probing -t $ENDPOINT skill run comm_bottleneck +``` + +### NCCL wait decomposition (fine-grained) + +For **culprit vs victim** attribution (`send_gpu_wait_ns` / `recv_wait_ns`), enable the NCCL profiler plugin and query `nccl.proxy_ops`: + +```bash +export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) +export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) +export PROBING=2 +# ... torchrun ... + +probing -t $ENDPOINT skill run nccl_culprit_victim +probing -t $ENDPOINT query " +SELECT rank, sum(send_gpu_wait_ns) AS gpu_wait, sum(recv_wait_ns) AS recv_wait +FROM nccl.proxy_ops +GROUP BY rank +ORDER BY recv_wait DESC" ``` +Multi-node: `global.nccl.proxy_ops`. Full setup, schema, and mock workflow: [NCCL profiler plugin](nccl-profiler.md). + ### RDMA Flow Analysis ```bash @@ -136,9 +179,12 @@ probing -t $ENDPOINT rdma ### Rank Synchronization ```bash -# Check if all ranks are at same step +# Check step coordinates on each node (uses probing's step_snapshot, not trainer fields) for node in node1 node2 node3; do - probing -t $node:8080 eval "print(f'Step: {trainer.current_step}')" + probing -t $node:8080 eval " +from probing.tracing import step_snapshot +s = step_snapshot() +print(f'rank={s.rank} local_step={s.local_step} global_step={s.global_step}')" done ``` diff --git a/docs/src/design/distributed.zh.md b/docs/src/design/distributed.zh.md index aa3aa6e7..f2633747 100644 --- a/docs/src/design/distributed.zh.md +++ b/docs/src/design/distributed.zh.md @@ -59,8 +59,8 @@ probing -t node2:8080 list ### 集群视图 ```bash -# 跨集群的聚合视图 -probing cluster list +# 列出集群视图中已注册的节点(连接到 rank 0 / master 端点) +probing -t rank0:8080 cluster nodes ``` ## 跨节点查询 @@ -73,16 +73,34 @@ SELECT * FROM python.torch_trace WHERE step = (SELECT MAX(step) FROM python.torch_trace)" ``` -### 查询所有节点 +### 联邦查询(`global.*`) + +跨 rank SQL 使用 **`global` catalog**。Master 向已注册节点 fan-out,并为每行附加联邦标签 +**`_host`**、**`_addr`**、**`_rank`**、**`_role`**(并行角色 key,来自节点注册表,如 `dp=2,pp=1,tp=0`)。 + +**方式 A — SQL 引擎(分析推荐):** + +```bash +probing -t rank0:8080 query " +SELECT _role, _rank, avg(duration_ms) AS avg_ms +FROM global.python.comm_collective +WHERE global_step > 100 +GROUP BY _role, _rank +ORDER BY avg_ms DESC" +``` + +**方式 B — cluster fan-out API:** ```bash -# 联合查询(未来功能) -probing cluster query " -SELECT node, rank, step, loss -FROM python.training_metrics -ORDER BY step" +probing -t rank0:8080 cluster query " +SELECT _role, _rank, avg(duration_ms) AS avg_ms +FROM global.python.comm_collective +GROUP BY _role, _rank +ORDER BY avg_ms DESC" ``` +通过 torchrun(`setup_torchrun_cluster`)或 `PUT /apis/nodes` 注册节点,`_rank` / `_role` 才能正确解析。训练脚本中可用 `probing.set_role(...)` 运行时覆盖 role。 + ## 同步调试 ### 捕获所有堆栈 @@ -109,21 +127,43 @@ if dist.is_initialized(): ## 通信分析 -### NCCL 操作 +### Collective 延迟(粗粒度,内置) + +`python.comm_collective` 记录 `torch.distributed` 调用墙钟时间,无需 NCCL 插件。 ```sql --- 分析通信模式 -SELECT - operation, - src_rank, - dst_rank, - bytes_transferred, - duration_ms -FROM python.nccl_trace -WHERE step = (SELECT MAX(step) FROM python.nccl_trace) -ORDER BY duration_ms DESC; +SELECT rank, op, avg(duration_ms) AS avg_ms, count(*) AS n +FROM python.comm_collective +WHERE global_step >= (SELECT max(global_step) - 20 FROM python.comm_collective) +GROUP BY rank, op +ORDER BY avg_ms DESC; +``` + +```bash +probing -t $ENDPOINT skill run slow_rank +probing -t $ENDPOINT skill run comm_bottleneck +``` + +### NCCL 等待分解(细粒度) + +要区分 **culprit / victim**(`send_gpu_wait_ns` / `recv_wait_ns`),需启用 NCCL profiler 插件并查询 `nccl.proxy_ops`: + +```bash +export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) +export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) +export PROBING=2 +# ... torchrun ... + +probing -t $ENDPOINT skill run nccl_culprit_victim +probing -t $ENDPOINT query " +SELECT rank, sum(send_gpu_wait_ns) AS gpu_wait, sum(recv_wait_ns) AS recv_wait +FROM nccl.proxy_ops +GROUP BY rank +ORDER BY recv_wait DESC" ``` +多机使用 `global.nccl.proxy_ops`。完整说明见 [NCCL profiler 插件](nccl-profiler.zh.md)。 + ### RDMA 流分析 ```bash @@ -136,9 +176,12 @@ probing -t $ENDPOINT rdma ### Rank 同步 ```bash -# 检查所有 rank 是否在相同步骤 +# 检查各节点 step 坐标(使用 probing step_snapshot,而非 trainer 字段) for node in node1 node2 node3; do - probing -t $node:8080 eval "print(f'Step: {trainer.current_step}')" + probing -t $node:8080 eval " +from probing.tracing import step_snapshot +s = step_snapshot() +print(f'rank={s.rank} local_step={s.local_step} global_step={s.global_step}')" done ``` diff --git a/docs/src/design/extensibility.md b/docs/src/design/extensibility.md index 907f7c1c..2ad85f13 100644 --- a/docs/src/design/extensibility.md +++ b/docs/src/design/extensibility.md @@ -1,277 +1,428 @@ # Extensibility -Probing provides mechanisms for extending its capabilities with custom data sources and metrics. +Probing exposes **two public extension paths**. Everything else (Rust collectors, HTTP handlers, import hooks) is internal to the core project. -## Overview +| Path | You contribute | Consumers use | +|------|----------------|---------------| +| **1. Table plugin** | Python dataclass + `@table` | `SELECT … FROM python.*` (CLI, Web, scripts) | +| **2. Diagnostic skill** | `SKILL.md` + optional `steps.yaml` | Agent / `probing skill run …` / Web | -The extension system allows: +**Decision rule:** expose **data** → write a table plugin. Contribute **how to investigate** → write a skill. -- Custom data tables -- User-defined metrics -- Integration with external tools -- Plugin architecture +```mermaid +flowchart LR + P["Table plugin\n(@table + init)"] --> T["python.my_table"] + T --> Q["SQL / CLI / Web / Agent"] + S["Diagnostic skill\n(SKILL.md)"] --> Q + T --> G["global.python.my_table\n(multi-rank)"] +``` + +--- + +## Path 1: Table plugin -## Custom Tables +A table plugin is a Python module that: -### Python API +1. Declares one or more **dataclass** tables with `@table` +2. Writes rows at runtime with `.save()` or `.append()` +3. Optionally defines `init()` / `deinit()` for setup and teardown -Create custom tables using the `@table` decorator: +Registered tables appear under the **`python`** schema, e.g. `python.my_metrics`. In distributed training, query **`global.python.my_metrics`** to fan out across ranks (Probing adds `_host`, `_addr`, `_rank`, and `_role` automatically). `_role` is the source node's parallel-role key (e.g. `dp=2,pp=1,tp=0`), resolved from the cluster `nodes` registry — see [Distributed](distributed.md). + +### Minimal example ```python +# my_plugin/__init__.py +from dataclasses import dataclass + from probing import table -@table("my_metrics") -def get_metrics(): - """Return data as list of dicts or pandas DataFrame.""" - return [ - {"name": "loss", "value": current_loss}, - {"name": "accuracy", "value": current_acc}, - ] + +@table +@dataclass +class MyMetrics: + step: int + loss: float + + +def init(): + """Called when the plugin is loaded via python.enabled.""" + MyMetrics.init_table() + + +def deinit(): + """Called when the plugin is unloaded via python.disabled.""" + MyMetrics.drop() ``` -### Query Custom Tables +Write data from training code: + +```python +MyMetrics(step=trainer.global_step, loss=loss.item()).save() +``` + +Query: ```sql -SELECT * FROM python.my_metrics; +SELECT step, avg(loss) AS avg_loss +FROM python.my_metrics +GROUP BY step +ORDER BY step; ``` -### Table Schema +Reference implementation: `python/probing/ext/example.py`. -Tables are dynamically typed based on returned data: +### Table naming -```python -@table("training_state") -def get_training_state(): - return { - "step": trainer.current_step, # int - "loss": trainer.last_loss, # float - "lr": optimizer.param_groups[0]["lr"], # float - "epoch": trainer.current_epoch, # int - } -``` +- Default: class name converted to **snake_case** (`MyMetrics` → `my_metrics`) +- Explicit: `@table("custom_name")` on the dataclass -## External Table Integration +The first appended row fixes column types. Changing fields later requires a new table name or `MyMetrics.drop()` before re-init. -### Pandas DataFrames +### API added by `@table` -```python -import pandas as pd -from probing import register_table +| Method | Purpose | +|--------|---------| +| `init_table()` | Create or attach mmap backing store | +| `save()` | Append one row (instance method) | +| `append(row)` / `append_many(rows)` | Append from class | +| `take(n)` | Read last *n* rows (debugging) | +| `drop()` | Remove table | -df = pd.DataFrame({ - "timestamp": timestamps, - "metric": values -}) +Storage is mmap-backed under the probing data directory. Rows survive process crashes and are visible to any attached probing client. -register_table("external_metrics", df) -``` +### Enable a plugin -### Arrow Tables +Load the module and call `init()` by setting **`python.enabled`** to an import path (same string passed to `load_extension()`): -```python -import pyarrow as pa -from probing import register_table +```bash +# After probing is attached (PROBING=1 or probing inject) +probing -t config python.enabled=my_plugin -table = pa.table({ - "id": [1, 2, 3], - "value": [10.0, 20.0, 30.0] -}) +# Or via SQL +probing -t query "SET python.enabled='my_plugin'" +``` -register_table("arrow_data", table) +Unload: + +```bash +probing -t config python.disabled=my_plugin ``` -## Custom Metrics +The module must be importable in the target process (installed package or on `PYTHONPATH`). Probing calls `init()` after import; `deinit()` runs on disable. -### Defining Metrics +**Alternative:** import the module directly in your training script. The `@table` decorator registers the table on import; use `init()` / `deinit()` only when you need explicit lifecycle control via `python.enabled`. -```python -from probing import metric - -@metric("gpu_utilization") -def gpu_util(): - """Return current GPU utilization.""" - import pynvml - pynvml.nvmlInit() - handle = pynvml.nvmlDeviceGetHandleByIndex(0) - util = pynvml.nvmlDeviceGetUtilizationRates(handle) - return util.gpu -``` +### Framework integration -### Querying Metrics +Hook your framework inside the plugin module—still write to `@table` rows: -```sql -SELECT * FROM python.metrics WHERE name = 'gpu_utilization'; +```python +def init(): + MyMetrics.init_table() + import torch + torch.nn.Module.register_forward_hook(_record_module_stats) ``` -## Hook System +Official integrations (torch, ray) use the same pattern internally; third-party plugins should not add separate HTTP or hook APIs. + +### Integration examples -### Module Hooks +**Weights & Biases (bridge)** ```python -from probing import register_hook - -@register_hook("torch.nn.Linear", "forward") -def linear_hook(module, input, output): - """Called on every Linear forward pass.""" - record_custom_data({ - "module": str(module), - "input_shape": list(input[0].shape), - "output_shape": list(output.shape), - }) +@table("wandb_run") +@dataclass +class WandbRun: + run_id: str + step: int + loss: float + +def init(): + WandbRun.init_table() + +def on_wandb_log(step: int, loss: float): + import wandb + if wandb.run: + WandbRun(run_id=wandb.run.id, step=step, loss=loss).save() ``` -### Function Hooks +**Custom training metrics** ```python -from probing import hook_function - -@hook_function("torch.optim.Adam.step") -def optimizer_hook(optimizer): - """Called on every optimizer step.""" - record_custom_data({ - "lr": optimizer.param_groups[0]["lr"], - "step_count": optimizer.state_dict()["state"][0]["step"], - }) +@table +@dataclass +class StepStats: + step: int + lr: float + grad_norm: float ``` -## Plugin Architecture +```sql +SELECT step, lr, grad_norm +FROM python.step_stats +WHERE step > (SELECT max(step) - 100 FROM python.step_stats); +``` -### Creating a Plugin +--- -```python -# my_plugin.py -from probing import Plugin +## Path 2: Diagnostic skill -class MyPlugin(Plugin): - name = "my_plugin" +A **skill** packages domain knowledge for *how* to investigate a problem. It does not collect data (use Path 1 for that). Each skill is a directory with a **`SKILL.md`** the agent can read, plus an optional machine-readable step list (`steps.yaml`). - def on_load(self): - """Called when plugin is loaded.""" - self.register_table("plugin_data", self.get_data) +Built-in diagnostics live under `skills//` and run via `probing skill run …`. Install into Cursor/Claude/Codex with `./skills/install.sh`. - def on_unload(self): - """Called when plugin is unloaded.""" - pass +### Directory layout - def get_data(self): - return [{"key": "value"}] ``` +skills/ +├── catalog.yaml # index (id, category, path) +└── my_check/ + ├── SKILL.md # required — agent + human readable + ├── steps.yaml # optional — deterministic CLI runner + └── reference.md # optional — deep dives, links +``` + +### `SKILL.md` format + +Frontmatter tells **when** to invoke the skill (for Agent routing). The body tells **how** to think about the problem. Executable steps can live in the body *or* in `steps.yaml`. -### Loading Plugins +```markdown +--- +name: my_check +description: > + Inspect custom plugin metrics in python.my_metrics. + Use when the user asks about plugin data, missing metrics, + or custom training counters from a table plugin. +category: performance +tables: [python.my_metrics] +parameters: + limit: { type: integer, default: 20 } +--- + +# My check + +## When to use + +- User enabled a table plugin but sees empty charts or SQL results +- Training runs but `python.my_metrics` has no recent rows + +## Prerequisites + +Enable the plugin in the target process: ```bash -# Environment variable -PROBING_PLUGINS=my_plugin python train.py +probing -t config python.enabled=my_plugin +``` + +## Procedure + +1. Confirm the table exists in `information_schema.tables` +2. Fetch the last `{limit}` rows ordered by step +3. If empty, warn that the plugin is not writing or not enabled + +## Reading results + +- Steady `loss` with increasing `step` → plugin is healthy +- No rows → check `python.enabled` and that training code calls `.save()` + +## Related skills -# Or programmatically -import probing -probing.load_plugin("my_plugin") +- `health_overview` — first triage when unsure where to start ``` -## Configuration Extension +### `steps.yaml` (optional, for deterministic runs) + +When present, CLI and Web Agent execute steps **without** relying on the LLM to invent SQL. Schema: + +```yaml +# skills/my_check/steps.yaml +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: my_check + title: "Check my plugin metrics" + +spec: + parameters: + - name: limit + type: integer + default: 20 + + steps: + - id: recent_metrics + title: "Recent plugin rows" + type: sql + sql: | + SELECT * + FROM python.my_metrics + ORDER BY step DESC + LIMIT {limit} + on_empty: warn + empty_message: "No rows — enable plugin: python.enabled=my_plugin" + + interpretation: + rules: [] + + summary_template: | + Checked python.my_metrics (last {limit} steps). +``` -### Custom Config Options +Splitting **SKILL.md** (knowledge + routing) from **steps.yaml** (execution) lets agents improvise when needed while keeping reproducible runs for CI and `probing skill run`. -```python -from probing import config +### Consumers -# Register custom config -config.register("my_plugin.sample_rate", default=0.1, type=float) +```bash +probing skill list +probing -t skill run my_check +probing -t skill run slow_rank --set step_window=30 --global -# Use in plugin -rate = config.get("my_plugin.sample_rate") +probing skill install # skills/ -> .cursor/.claude/.agents skill dirs +./skills/install.sh +probing skill update ``` -### Query Configuration +Python tool API (bundled skills, no install required): -```sql -SELECT * FROM information_schema.df_settings -WHERE name LIKE 'my_plugin.%'; +```python +from probing.skills.tools import list_skills, run_skill ``` -## Integration Examples +Web Agent loads skill frontmatter for routing (`description` + `tables`), injects `SKILL.md` body into context, and runs `steps.yaml` when present. -### Weights & Biases +### Register a skill -```python -from probing import table -import wandb - -@table("wandb_metrics") -def get_wandb_metrics(): - run = wandb.run - if run: - return { - "run_id": run.id, - "step": run.step, - "summary": dict(run.summary), - } - return {} +1. Add `skills/my_check/SKILL.md` (required) +2. Add `skills/my_check/steps.yaml` if you want deterministic execution +3. Register in `skills/catalog.yaml` +4. Run `./skills/install.sh` so agents discover the skill +4. Validate: `python -m probing.skills validate` + +Skills may reference **any** SQL table—Path 1 plugin tables, built-in tables (`cpu.utilization`, `gpu.utilization`, `python.torch_trace`, …), and `global.*` for multi-rank fan-out. + +See `skills/README.md` and [AGENTS.md](../../../AGENTS.md) for routing, install, and cluster fan-out. + +--- + +## Path 3: NCCL profiler plugin (C cdylib) + +For **fine-grained NCCL wait decomposition** (culprit vs victim), use the standalone Rust profiler loaded by NCCL itself—not a Python table plugin. + +### Enable in training + +```bash +export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) +export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # default 26 +export PROBING=2 +torchrun --nproc_per_node=8 train.py ``` -### TensorBoard +Requires **NCCL ≥ 2.26** (PyTorch 2.8+). The plugin exports `ncclProfiler_v3` only and writes mmap tables consumed by probing SQL: -```python -from probing import table -from torch.utils.tensorboard import SummaryWriter +| Table | Content | +|-------|---------| +| `nccl.proxy_ops` | Per-proxy-op wait: `send_gpu_wait_ns` (culprit), `recv_wait_ns` (victim), `tp_rank`/`pp_rank`/`dp_rank` | +| `nccl.net_qp` | Optional NetPlugin IB QP timing (mask bit 128) | -writer = SummaryWriter() +### Query and diagnose -@table("tensorboard_scalars") -def get_tb_scalars(): - # Access TensorBoard data - return logged_scalars +```sql +SELECT rank, sum(send_gpu_wait_ns), sum(recv_wait_ns) +FROM nccl.proxy_ops +GROUP BY rank +ORDER BY 3 DESC; ``` -### Prometheus +```bash +probing -t skill run nccl_culprit_victim +``` -```python -from probing import metric -from prometheus_client import Gauge +**Culprit** ranks show high `send_gpu_wait_ns` (local GPU slow); **victim** ranks show high `recv_wait_ns` (waiting on peers/network). See [NCCL profiler plugin](nccl-profiler.md) for schema, mock workflow, and smoke-test checklist. + +Coarse collective latency (`python.comm_collective`) remains available without the plugin; skills `slow_rank` and `comm_bottleneck` optionally join `nccl.proxy_ops` when present. -gpu_memory = Gauge("gpu_memory_bytes", "GPU memory usage") +### macOS / dev without NCCL -@metric("prometheus_gpu_memory") -def update_prometheus(): - mem = torch.cuda.memory_allocated() - gpu_memory.set(mem) - return mem +```bash +PROBING=1 PROBING_NCCL_MOCK=1 python -m probing.nccl --seed-mock +``` + +Seeds synthetic culprit (rank 2, high `send_gpu_wait_ns`) and victim (rank 5, high `recv_wait_ns`) for skill/SQL testing. + +### Build + +```bash +make nccl-profiler-lib # Linux .so → python/probing/libs/ ``` -## Best Practices +Crate: `probing/extensions/nccl-profiler/`. -### 1. Lightweight Data Collection +--- + +## Best practices + +### Keep rows small + +Write scalars and small structs per step—not full model state or weight tensors. ```python -# Good: Return only necessary data -@table("efficient") -def get_efficient(): - return {"step": step, "loss": loss} - -# Avoid: Expensive operations -@table("expensive") -def get_expensive(): - return serialize_entire_model() # Too heavy +# Good +MyMetrics(step=step, loss=float(loss)).save() + +# Avoid +MyMetrics(step=step, payload=model.state_dict()).save() ``` -### 2. Error Handling +### Handle errors in the writer + +Sampling hooks should not crash training: ```python -@table("safe_data") -def get_safe_data(): +def _safe_record(step: int, loss): try: - return {"value": compute_value()} - except Exception as e: - return {"error": str(e)} + MyMetrics(step=step, loss=float(loss)).save() + except Exception: + pass # or log once ``` -### 3. Caching +### Prefer append over pull -```python -from functools import lru_cache +Push rows when events happen (step end, collective complete). Do not implement “scan entire process state on every SQL query”—`@table` is append-only storage, not a lazy snapshot API. + +### Use `global.*` for multi-rank analysis -@table("cached_data") -@lru_cache(maxsize=1) -def get_cached_data(): - return expensive_computation() +```sql +-- Align by parallel role across ranks (each row also carries a `role` column +-- written at record time; `_role` is the federation tag for the source node). +SELECT _role, _rank, avg(duration_ms) AS avg_ms +FROM global.python.comm_collective +WHERE global_step > 100 +GROUP BY _role, _rank +ORDER BY avg_ms DESC; ``` + +--- + +## Not public extension APIs + +The following exist for core development only. **Do not** build third-party plugins on them: + +| Mechanism | Why not public | +|-----------|----------------| +| Rust `ProbeExtension` / `ProbeDataSource` | Compiled into probing; no dynamic plugin loading | +| `@ext_handler` / `/apis/pythonext/*` | Internal HTTP surface; contract-tested for core handlers | +| `add_module_callback` import hook | Used for official torch/ray integration | +| `probing-*` CLI external binaries | Separate tools, not data plugins | + +To extend Probing, use **Path 1 (table plugin)**, **Path 2 (diagnostic skill)**, or **Path 3 (NCCL profiler cdylib)** for fine-grained collective wait data. + +--- + +## Related docs + +- [Data layer](data-layer.md) — mmap memtable storage behind `python.*` +- [Distributed](distributed.md) — `global.*` federation and cluster queries +- [SQL analytics guide](../guide/sql-analytics.md) — querying patterns +- `skills/README.md` — skill authoring in depth +- `AGENTS.md` — agent install and invoke diff --git a/docs/src/design/extensibility.zh.md b/docs/src/design/extensibility.zh.md index 25ee3819..3fecb485 100644 --- a/docs/src/design/extensibility.zh.md +++ b/docs/src/design/extensibility.zh.md @@ -1,277 +1,437 @@ # 扩展机制 -Probing 提供机制来扩展其功能,支持自定义数据源和指标。 +Probing 提供 **两条公开扩展路径**(另有一条可选 NCCL 插件路径)。Rust 采集器、HTTP 处理器、import hook 等属于核心内部实现。 -## 概览 +| 路径 | 你贡献什么 | 谁在用 | +|------|------------|--------| +| **1. 表插件** | Python dataclass + `@table` | `SELECT … FROM python.*`(CLI、Web、脚本) | +| **2. 诊断 skill** | `SKILL.md` + 可选 `steps.yaml` | Agent / `probing skill run …` / Web | -扩展系统允许: +**决策规则:** 要暴露**数据** → 写表插件;要贡献**怎么查** → 写 skill。 -- 自定义数据表 -- 用户定义的指标 -- 与外部工具集成 -- 插件架构 +```mermaid +flowchart LR + P["表插件\n(@table + init)"] --> T["python.my_table"] + T --> Q["SQL / CLI / Web / Agent"] + S["诊断 skill\n(SKILL.md)"] --> Q + T --> G["global.python.my_table\n(多 rank)"] +``` + +--- + +## 路径 1:表插件 -## 自定义表 +表插件是一个 Python 模块,它: -### Python API +1. 用 `@table` 声明一个或多个 **dataclass** 表 +2. 运行时用 `.save()` 或 `.append()` 写行 +3. 可选定义 `init()` / `deinit()` 做初始化与清理 -使用 `@table` 装饰器创建自定义表: +注册后的表在 **`python` schema** 下,例如 `python.my_metrics`。分布式训练查询 +**`global.python.my_metrics`** 可向各 rank fan-out(自动附加 `_host`、`_addr`、`_rank`、`_role`)。 +`_role` 是来源节点的并行角色 key(如 `dp=2,pp=1,tp=0`),从 `cluster.nodes` 注册表解析——见 +[分布式](distributed.zh.md)。 + +### 最小示例 ```python +# my_plugin/__init__.py +from dataclasses import dataclass + from probing import table -@table("my_metrics") -def get_metrics(): - """返回字典列表或 pandas DataFrame。""" - return [ - {"name": "loss", "value": current_loss}, - {"name": "accuracy", "value": current_acc}, - ] + +@table +@dataclass +class MyMetrics: + step: int + loss: float + + +def init(): + """通过 python.enabled 加载插件时调用。""" + MyMetrics.init_table() + + +def deinit(): + """通过 python.disabled 卸载时调用。""" + MyMetrics.drop() ``` -### 查询自定义表 +在训练代码中写数据(step 建议用 `step_snapshot()`,见 [核心概念](../guide/concepts.zh.md)): + +```python +from probing.tracing import step_snapshot + +snap = step_snapshot() +MyMetrics(step=snap.local_step, loss=loss.item()).save() +``` + +查询: ```sql -SELECT * FROM python.my_metrics; +SELECT step, avg(loss) AS avg_loss +FROM python.my_metrics +GROUP BY step +ORDER BY step; ``` -### 表 Schema +参考实现:`python/probing/ext/example.py`。 -表根据返回数据动态类型化: +### 表命名 -```python -@table("training_state") -def get_training_state(): - return { - "step": trainer.current_step, # int - "loss": trainer.last_loss, # float - "lr": optimizer.param_groups[0]["lr"], # float - "epoch": trainer.current_epoch, # int - } -``` +- 默认:类名转 **snake_case**(`MyMetrics` → `my_metrics`) +- 显式:`@table("custom_name")` 写在 dataclass 上 -## 外部表集成 +首行写入后列类型固定。改字段需新表名,或先 `MyMetrics.drop()` 再 `init_table()`。 -### Pandas DataFrames +### `@table` 提供的 API -```python -import pandas as pd -from probing import register_table +| 方法 | 用途 | +|------|------| +| `init_table()` | 创建或挂载 mmap 存储 | +| `save()` | 追加一行(实例方法) | +| `append(row)` / `append_many(rows)` | 类方法追加 | +| `take(n)` | 读最近 n 行(调试) | +| `drop()` | 删除表 | -df = pd.DataFrame({ - "timestamp": timestamps, - "metric": values -}) +存储为 probing 数据目录下的 mmap,进程崩溃后仍可被 attach 的客户端查询。 -register_table("external_metrics", df) -``` +### 启用插件 -### Arrow 表 +设置 **`python.enabled`** 为可 import 的模块路径(与 `load_extension()` 相同): -```python -import pyarrow as pa -from probing import register_table +```bash +# 已 attach probing(PROBING=1 或 probing inject)后 +probing -t config python.enabled=my_plugin + +# 或通过 SQL +probing -t query "SET python.enabled='my_plugin'" +``` -table = pa.table({ - "id": [1, 2, 3], - "value": [10.0, 20.0, 30.0] -}) +卸载: -register_table("arrow_data", table) +```bash +probing -t config python.disabled=my_plugin ``` -## 自定义指标 +模块须在目标进程可 import(已安装或在 `PYTHONPATH`)。加载后 probing 调用 `init()`;禁用时调用 `deinit()`。 -### 定义指标 +**另一种方式:** 在训练脚本里直接 `import my_plugin`;`@table` 在 import 时注册表;仅当需要通过 `python.enabled` 控制生命周期时才写 `init()` / `deinit()`。 -```python -from probing import metric - -@metric("gpu_utilization") -def gpu_util(): - """返回当前 GPU 利用率。""" - import pynvml - pynvml.nvmlInit() - handle = pynvml.nvmlDeviceGetHandleByIndex(0) - util = pynvml.nvmlDeviceGetUtilizationRates(handle) - return util.gpu -``` +### 框架集成 -### 查询指标 +在插件模块内挂框架钩子,仍写入 `@table` 行: -```sql -SELECT * FROM python.metrics WHERE name = 'gpu_utilization'; +```python +def init(): + MyMetrics.init_table() + import torch + torch.nn.Module.register_forward_hook(_record_module_stats) ``` -## 钩子系统 +官方 torch / ray 集成内部使用相同模式;第三方插件不要另建 HTTP 或独立 hook API。 + +### 集成示例 -### 模块钩子 +**Weights & Biases(桥接)** ```python -from probing import register_hook - -@register_hook("torch.nn.Linear", "forward") -def linear_hook(module, input, output): - """每次 Linear 前向传播时调用。""" - record_custom_data({ - "module": str(module), - "input_shape": list(input[0].shape), - "output_shape": list(output.shape), - }) +@table("wandb_run") +@dataclass +class WandbRun: + run_id: str + step: int + loss: float + +def init(): + WandbRun.init_table() + +def on_wandb_log(step: int, loss: float): + import wandb + if wandb.run: + WandbRun(run_id=wandb.run.id, step=step, loss=loss).save() ``` -### 函数钩子 +**自定义训练指标** ```python -from probing import hook_function - -@hook_function("torch.optim.Adam.step") -def optimizer_hook(optimizer): - """每次优化器步骤时调用。""" - record_custom_data({ - "lr": optimizer.param_groups[0]["lr"], - "step_count": optimizer.state_dict()["state"][0]["step"], - }) +@table +@dataclass +class StepStats: + step: int + lr: float + grad_norm: float ``` -## 插件架构 +```sql +SELECT step, lr, grad_norm +FROM python.step_stats +WHERE step > (SELECT max(step) - 100 FROM python.step_stats); +``` -### 创建插件 +--- -```python -# my_plugin.py -from probing import Plugin +## 路径 2:诊断 skill -class MyPlugin(Plugin): - name = "my_plugin" +**Skill** 打包**如何排查**的领域知识,本身不采集数据(数据用路径 1)。每个 skill 是一个目录:Agent 可读的 **`SKILL.md`**,加上可选的机器可读步骤列表(`steps.yaml`)。 - def on_load(self): - """插件加载时调用。""" - self.register_table("plugin_data", self.get_data) +内置诊断位于 `skills//`,通过 `probing skill run …` 执行。安装到 Cursor/Claude/Codex:`./skills/install.sh` 或 `probing skill install`。 - def on_unload(self): - """插件卸载时调用。""" - pass +### 目录结构 - def get_data(self): - return [{"key": "value"}] ``` +skills/ +├── catalog.yaml # 索引(id、category、path) +└── my_check/ + ├── SKILL.md # 必需 — Agent + 人类可读 + ├── steps.yaml # 可选 — 确定性 CLI 执行 + └── reference.md # 可选 — 深入说明、外链 +``` + +### `SKILL.md` 格式 + +Frontmatter 说明**何时**调用该 skill(供 Agent 路由)。正文说明**如何**思考问题。可执行步骤可写在正文或 `steps.yaml`。 -### 加载插件 +```markdown +--- +name: my_check +description: > + 检查 python.my_metrics 中的自定义插件指标。 + 当用户询问插件数据、指标缺失或表插件计数器时使用。 +category: performance +tables: [python.my_metrics] +parameters: + limit: { type: integer, default: 20 } +--- + +# My check + +## 何时使用 + +- 用户已启用表插件但图表或 SQL 结果为空 +- 训练在跑但 `python.my_metrics` 无近期行 + +## 前置条件 + +在目标进程启用插件: ```bash -# 环境变量 -PROBING_PLUGINS=my_plugin python train.py +probing -t config python.enabled=my_plugin +``` + +## 步骤 + +1. 在 `information_schema.tables` 中确认表存在 +2. 按 step 倒序取最近 `{limit}` 行 +3. 若为空,提示插件未写入或未启用 + +## 结果解读 + +- `loss` 随 `step` 递增 → 插件健康 +- 无行 → 检查 `python.enabled` 与训练代码是否调用 `.save()` + +## 相关 skill -# 或编程方式 -import probing -probing.load_plugin("my_plugin") +- `health_overview` — 不确定从哪查时先做分诊 ``` -## 配置扩展 +### `steps.yaml`(可选,确定性执行) + +存在时,CLI 与 Web Agent **不依赖 LLM 编造 SQL** 即可执行。Schema 示例: + +```yaml +# skills/my_check/steps.yaml +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: my_check + title: "检查我的插件指标" + +spec: + parameters: + - name: limit + type: integer + default: 20 + + steps: + - id: recent_metrics + title: "近期插件行" + type: sql + sql: | + SELECT * + FROM python.my_metrics + ORDER BY step DESC + LIMIT {limit} + on_empty: warn + empty_message: "无数据 — 请启用插件: python.enabled=my_plugin" + + interpretation: + rules: [] + + summary_template: | + 已检查 python.my_metrics(最近 {limit} 个 step)。 +``` -### 自定义配置选项 +**SKILL.md**(知识 + 路由)与 **steps.yaml**(执行)分离:Agent 可即兴发挥,CI 与 `probing skill run` 保持可复现。 -```python -from probing import config +### 使用方 -# 注册自定义配置 -config.register("my_plugin.sample_rate", default=0.1, type=float) +```bash +probing skill list +probing -t skill run my_check +probing -t skill run slow_rank --set step_window=30 --global -# 在插件中使用 -rate = config.get("my_plugin.sample_rate") +probing skill install # skills/ → .cursor/.claude/.agents +./skills/install.sh +probing skill update ``` -### 查询配置 +Python 工具 API(内置 skill,无需 install): -```sql -SELECT * FROM information_schema.df_settings -WHERE name LIKE 'my_plugin.%'; +```python +from probing.skills.tools import list_skills, run_skill ``` -## 集成示例 +Web Agent 用 frontmatter 做路由(`description` + `tables`),将 `SKILL.md` 正文注入上下文;有 `steps.yaml` 时按步骤执行。 -### Weights & Biases +### 注册新 skill -```python -from probing import table -import wandb - -@table("wandb_metrics") -def get_wandb_metrics(): - run = wandb.run - if run: - return { - "run_id": run.id, - "step": run.step, - "summary": dict(run.summary), - } - return {} +1. 添加 `skills/my_check/SKILL.md`(必需) +2. 需要确定性执行时添加 `steps.yaml` +3. 在 `skills/catalog.yaml` 登记 +4. 运行 `./skills/install.sh` 让 Agent 发现 +5. 校验:`python -m probing.skills validate` + +Skill 可引用**任意** SQL 表——路径 1 插件表、内置表(`cpu.utilization`、`python.torch_trace` 等)、以及多 rank 的 `global.*`。 + +详见 `skills/README.md`、[诊断 Skill 用户指南](../guide/skills.zh.md)、[AGENTS.md](../../../AGENTS.md)。 + +--- + +## 路径 3:NCCL profiler 插件(C cdylib) + +**细粒度 NCCL 等待分解**(culprit vs victim)使用 NCCL 自身加载的独立 Rust profiler,**不是** Python 表插件。 + +### 在训练中启用 + +```bash +export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) +export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # 默认 26 +export PROBING=2 +torchrun --nproc_per_node=8 train.py ``` -### TensorBoard +需要 **NCCL ≥ 2.26**(PyTorch 2.8+)。插件仅导出 `ncclProfiler_v3`,写入 mmap 表供 probing SQL 查询: -```python -from probing import table -from torch.utils.tensorboard import SummaryWriter +| 表 | 内容 | +|----|------| +| `nccl.proxy_ops` | 每 proxy-op 等待:`send_gpu_wait_ns`(culprit)、`recv_wait_ns`(victim)、`tp_rank`/`pp_rank`/`dp_rank` | +| `nccl.net_qp` | 可选 NetPlugin IB QP 计时(mask bit 128) | + +> **与 `role` 的区别:** 训练表(`torch_trace`、`comm_collective`)用 probing **`role`** 字符串;`nccl.proxy_ops` 仍保留 NCCL 插件侧的 tp/pp/dp 列。 -writer = SummaryWriter() +### 查询与诊断 -@table("tensorboard_scalars") -def get_tb_scalars(): - # 访问 TensorBoard 数据 - return logged_scalars +```sql +SELECT rank, sum(send_gpu_wait_ns), sum(recv_wait_ns) +FROM nccl.proxy_ops +GROUP BY rank +ORDER BY 3 DESC; ``` -### Prometheus +```bash +probing -t skill run nccl_culprit_victim +``` -```python -from probing import metric -from prometheus_client import Gauge +**Culprit** rank `send_gpu_wait_ns` 高(本机 GPU 慢);**victim** rank `recv_wait_ns` 高(等 peer/网络)。详见 [NCCL profiler 插件](nccl-profiler.zh.md)。 + +粗粒度 collective 延迟(`python.comm_collective`)无需该插件;`slow_rank`、`comm_bottleneck` 在表存在时会可选 JOIN `nccl.proxy_ops`。 -gpu_memory = Gauge("gpu_memory_bytes", "GPU 内存使用") +### macOS / 无 NCCL 开发环境 -@metric("prometheus_gpu_memory") -def update_prometheus(): - mem = torch.cuda.memory_allocated() - gpu_memory.set(mem) - return mem +```bash +PROBING=1 PROBING_NCCL_MOCK=1 python -m probing.nccl --seed-mock +``` + +注入合成 culprit(rank 2,高 `send_gpu_wait_ns`)与 victim(rank 5,高 `recv_wait_ns`)供 skill/SQL 测试。 + +### 构建 + +```bash +make nccl-profiler-lib # Linux .so → python/probing/libs/ ``` +Crate:`probing/extensions/nccl-profiler/`。 + +--- + ## 最佳实践 -### 1. 轻量级数据收集 +### 控制行大小 + +每 step 写标量与小结构——不要写完整模型 state 或权重张量。 ```python -# 好:只返回必要数据 -@table("efficient") -def get_efficient(): - return {"step": step, "loss": loss} - -# 避免:昂贵的操作 -@table("expensive") -def get_expensive(): - return serialize_entire_model() # 太重 +# 推荐 +MyMetrics(step=step, loss=float(loss)).save() + +# 避免 +MyMetrics(step=step, payload=model.state_dict()).save() ``` -### 2. 错误处理 +### 写入路径容错 + +采样钩子不应拖垮训练: ```python -@table("safe_data") -def get_safe_data(): +def _safe_record(step: int, loss): try: - return {"value": compute_value()} - except Exception as e: - return {"error": str(e)} + MyMetrics(step=step, loss=float(loss)).save() + except Exception: + pass # 或只 log 一次 ``` -### 3. 缓存 +### 推送优于拉取 -```python -from functools import lru_cache +在事件发生时写行(step 结束、collective 完成)。不要实现「每次 SQL 查询扫描整个进程状态」——`@table` 是 append-only 存储,不是惰性快照 API。 + +### 多 rank 分析用 `global.*` -@table("cached_data") -@lru_cache(maxsize=1) -def get_cached_data(): - return expensive_computation() +```sql +-- 按并行 role 跨 rank 对齐(行内还有采集时的 role 列;_role 是联邦标签) +SELECT _role, _rank, avg(duration_ms) AS avg_ms +FROM global.python.comm_collective +WHERE global_step > 100 +GROUP BY _role, _rank +ORDER BY avg_ms DESC; ``` + +--- + +## 非公开扩展 API + +下列机制仅供核心开发,**第三方插件请勿依赖**: + +| 机制 | 为何不公开 | +|------|------------| +| Rust `ProbeExtension` / `ProbeDataSource` | 编译进 probing;无动态插件加载 | +| `@ext_handler` / `/apis/pythonext/*` | 内部 HTTP;核心 handler 契约测试 | +| `add_module_callback` import hook | 官方 torch/ray 集成使用 | +| `probing-*` CLI 外部二进制 | 独立工具,非数据插件 | + +扩展 Probing 请用 **路径 1(表插件)**、**路径 2(诊断 skill)**,或 **路径 3(NCCL profiler cdylib)** 获取细粒度 collective 等待数据。 + +--- + +## 相关文档 + +- [数据层](data-layer.zh.md) — `python.*` 背后的 mmap memtable +- [分布式](distributed.zh.md) — `global.*` 联邦与 cluster 查询 +- [SQL 分析指南](../guide/sql-analytics.zh.md) — 查询模式 +- [SQL 表目录](../reference/sql-tables.zh.md) +- [核心概念](../guide/concepts.zh.md) +- [诊断 Skill 指南](../guide/skills.zh.md) +- `skills/README.md` — skill 编写详解 +- `AGENTS.md` — Agent 安装与调用 diff --git a/docs/src/design/index.md b/docs/src/design/index.md index 54fd89bf..5464b9b7 100644 --- a/docs/src/design/index.md +++ b/docs/src/design/index.md @@ -39,12 +39,19 @@ Probing's core mission is simple: **make distributed systems feel Pythonic again ## Design Documents +Shared vocabulary (endpoint, steps, role, federation): **[Core Concepts](../guide/concepts.md)**. + | Document | Description | |----------|-------------| +| [Modularity & boundaries](modularity.md) | **Core vs feature modules**, interfaces, dependency rules, ownership | | [Architecture](architecture.md) | System structure and components | | [Data Layer](data-layer.md) | Hot/cold columnar store and SQL integration | | [Profiling](profiling.md) | Performance data collection | | [Debugging](debugging.md) | Debugging capabilities | | [Distributed](distributed.md) | Multi-node support | +| [NCCL Profiler](nccl-profiler.md) | NCCL plugin, culprit/victim, `nccl.proxy_ops` | | [Cluster with Pulsing](cluster-pulsing.md) | Using Pulsing for membership and failure detection | | [Extensibility](extensibility.md) | Custom tables and metrics | + +User-facing workflows: **[User Guide](../guide/index.md)** (SQL, skills, debugging). +Reference: **[SQL Tables](../reference/sql-tables.md)** · **[API Reference](../api-reference.md)**. diff --git a/docs/src/design/index.zh.md b/docs/src/design/index.zh.md index e80bac50..3cd32319 100644 --- a/docs/src/design/index.zh.md +++ b/docs/src/design/index.zh.md @@ -39,12 +39,19 @@ Probing 的核心使命很简单:**让分布式系统重新变得 Pythonic** ## 设计文档 +与实现文档共用的术语(端点、step、role、联邦):**[核心概念](../guide/concepts.zh.md)**。 + | 文档 | 描述 | |------|------| -| [系统架构](architecture.md) | 系统结构和组件 | -| [数据层](data-layer.md) | 冷热分层列式存储与 SQL 集成 | -| [性能分析](profiling.md) | 性能数据收集 | -| [调试](debugging.md) | 调试能力 | -| [分布式](distributed.md) | 多节点支持 | +| [模块化与边界](modularity.zh.md) | **核心 vs 功能模块**、接口、依赖规则、ownership | +| [系统架构](architecture.zh.md) | 系统结构和组件 | +| [数据层](data-layer.zh.md) | 冷热分层列式存储与 SQL 集成 | +| [性能分析](profiling.zh.md) | 性能数据收集 | +| [调试](debugging.zh.md) | 调试能力 | +| [分布式](distributed.zh.md) | 多节点支持 | +| [NCCL Profiler](nccl-profiler.zh.md) | NCCL 插件、culprit/victim、`nccl.proxy_ops` | | [基于 Pulsing 的集群](cluster-pulsing.zh.md) | 使用 Pulsing 做成员发现与故障检测 | -| [扩展机制](extensibility.md) | 自定义表和指标 | +| [扩展机制](extensibility.zh.md) | 自定义表和指标 | + +用户向操作:**[用户指南](../guide/index.zh.md)**(SQL、skill、调试)。 +参考:**[SQL 表目录](../reference/sql-tables.zh.md)** · **[API 参考](../api-reference.zh.md)**。 diff --git a/docs/src/design/modularity.md b/docs/src/design/modularity.md new file mode 100644 index 00000000..d8a40ff0 --- /dev/null +++ b/docs/src/design/modularity.md @@ -0,0 +1,419 @@ +# Modularity & Module Boundaries + +This document defines **core vs feature modules**, public interfaces, dependency rules, and +ownership boundaries. Goal: parallel development without cross-cutting churn. + +Read with [Architecture](architecture.md), [Data Layer](data-layer.md), and +[Extensibility](extensibility.md). Shared vocabulary: [Core Concepts](../guide/concepts.md). + +--- + +## 1. Layer model + +Probing is organized in four layers. **Dependencies only flow downward** (higher layers may +call lower; never the reverse). + +```mermaid +flowchart TB + subgraph L4["L4 — Experience (no engine logic)"] + WEB[web/ WASM UI] + SKILLS[skills/ diagnostic workflows] + PYSDK[python/probing/ SDK & hooks] + end + + subgraph L3["L3 — Control plane"] + CLI[probing-cli] + SERVER[probing-server] + end + + subgraph L2["L2 — Collectors & extensions"] + PYEXT[probing-python] + CC[probing-cc] + GPU[probing-gpu] + NCCL[probing-nccl-profiler cdylib] + end + + subgraph L1["L1 — Platform core"] + CORE[probing-core] + MEM[probing-memtable] + PROTO[probing-proto] + MACROS[probing-macros] + end + + WEB --> PROTO + CLI --> PROTO + SERVER --> CORE + SERVER --> L2 + L2 --> CORE + L2 --> MEM + CORE --> MEM + CORE --> PROTO + SKILLS --> PYSDK + PYSDK --> PYEXT + NCCL --> MEM +``` + +| Layer | Role | Changes when… | +|-------|------|----------------| +| **L1 Platform** | SQL engine, storage, wire types, plugin traits | Federation, memtable, config, catalog | +| **L2 Collectors** | Produce rows into tables; optional HTTP via Extension | New signals (GPU, NCCL, host, Python runtime) | +| **L3 Control plane** | HTTP API, CLI, composition root | New endpoints, auth, cluster fan-out | +| **L4 Experience** | UI, skills, Python integration | Diagnostics UX, hooks, agent flows | + +**Composition root (only place that wires everything):** + +- `probing/server/src/engine.rs` — registers all `ProbeDataSource` + `ProbeExtension` for the + in-process server. +- Root `src/lib.rs` + `Cargo.toml` — PyO3 wheel bundles server + python extension. + +--- + +## 2. Crate & directory map + +### L1 — Platform core (stable interfaces) + +| Unit | Path | Responsibility | Must NOT | +|------|------|----------------|----------| +| **probing-proto** | `probing/proto/` | `Message`, `DataFrame`, `Node`, `Query` DTOs | Import core, server, extensions | +| **probing-memtable** | `probing/memtable/` | MEMT/MEMH/MEMC read/write, mmap discovery | Know SQL, HTTP, Python | +| **probing-core** | `probing/core/` | DataFusion engine, federation, config, traits | Import server, cli, extensions | +| **probing-macros** | `probing/macros/` | `#[derive(ProbeExtension)]` | Business logic | + +Key core submodules: + +| Submodule | Path | Contract | +|-----------|------|----------| +| Engine | `core/engine.rs` | `async_query`, `enable(ProbeDataSource)` | +| Federation | `core/federation/` | `global.*` catalog, tags `_host/_addr/_rank/_role` | +| Memtable SQL | `core/memtable_sql.rs` | mmap files → `TableProvider` | +| Config | `config.rs` | `get` / `set` / `write` KV + extension options | + +### L2 — Collectors (feature modules) + +Each collector **writes data** and optionally **registers tables + extension config**. Collectors +do not call each other. + +| Unit | Path | Schema / tables | Extension | +|------|------|-----------------|-----------| +| **probing-python** | `probing/extensions/python/` | `python.*` (backtrace, mmap tables) | `PythonExt`, `TorchProbeExtension`, `PprofProbeExtension` | +| **probing-cc** | `probing/extensions/cc/` | `cpu.*`, `cluster.nodes`, `rdma.*`, `process.*`, `files.*` | `CpuProbeExtension`, `RdmaProbeExtension` | +| **probing-gpu** | `probing/extensions/gpu/` | `gpu.utilization`, `gpu.devices` | `GpuProbeExtension` | +| **probing-nccl-profiler** | `probing/extensions/nccl-profiler/` | `nccl.proxy_ops`, `nccl.net_qp` (mmap) | NCCL plugin ABI only (no HTTP) | + +Python-side collectors (same layer, different language): + +| Unit | Path | Tables | +|------|------|--------| +| Torch tracing | `python/probing/profiling/` | `python.torch_trace`, `python.comm_collective` | +| Tracing spans | `python/probing/tracing.py` | `python.trace_event` | +| Parallel role | `python/probing/parallel.py` | stamps `role` on rows | +| User plugins | `python/probing/ext/` | `python.` via `@table` | + +### L3 — Control plane + +| Unit | Path | Responsibility | +|------|------|----------------| +| **probing-server** | `probing/server/` | Axum routes, auth, `initialize_engine()`, cluster fan-out | +| **probing-cli** | `probing/cli/` | HTTP client to probe; inject/list/query/repl/**skill** | + +Stable HTTP surface: `probing/server/API.md`, enforced by `tests/regression/spec/api_spec.json`. + +### L4 — Experience + +| Unit | Path | Responsibility | +|------|------|----------------| +| **web/** | Dioxus WASM | Pages, visualization, Investigate agent | +| **skills/** | YAML + SKILL.md | Diagnostic workflows over SQL | +| **python/probing/** | Python package | Hooks, `query()`, skills loader, nccl helper | + +--- + +## 3. Public interfaces (contracts) + +New work should extend **one** of these contracts instead of adding cross-module calls. + +### 3.1 `ProbeDataSource` — register SQL tables + +**Where:** `probing/core/src/core/data_source.rs` +**Register:** `EngineBuilder::with_data_source` (wired in `server/engine.rs`) + +| Kind | Use when | Example | +|------|----------|---------| +| `Table` | Fixed schema, one table | `gpu.devices` | +| `Namespace` | Dynamic tables | `python.*`, mmap discovery | + +**Rules:** + +- Schema + scan logic live in the collector crate. +- Federation: table names under known schemas (`python`, `nccl`, `gpu`, …) auto-mirror to + `global..`. +- Do **not** query other collectors from inside `scan()`; join at SQL layer. + +### 3.2 `ProbeExtension` — config + imperative HTTP + +**Where:** `probing/core/src/core/probe_extension.rs` +**Derive:** `#[derive(ProbeExtension)]` in `probing-macros` + +| Capability | Mechanism | +|------------|-----------| +| Config keys | `probing..
`** to fan out to registered peers. +Each row gets `_host`, `_addr`, `_rank`, and `_role` (see [Distributed](../design/distributed.md)). + +**Slow rank by parallel role** (align ranks that share the same TP/PP/DP placement): + +```sql +SELECT _role, _rank, avg(duration_ms) AS avg_ms, max(duration_ms) AS max_ms +FROM global.python.comm_collective +WHERE global_step > (SELECT max(global_step) - 50 FROM global.python.comm_collective) +GROUP BY _role, _rank +ORDER BY avg_ms DESC; +``` + +CLI equivalent: + +```bash +probing -t rank0:8080 cluster query " +SELECT _role, _rank, avg(duration_ms) AS avg_ms +FROM global.python.comm_collective +GROUP BY _role, _rank +ORDER BY avg_ms DESC" +``` + ## Advanced Analytics ### Time-Series Analysis @@ -162,12 +218,12 @@ Results can be exported for further analysis: # Export to JSON probing $ENDPOINT query "SELECT * FROM python.torch_trace" > torch_traces.json -# Time-series data for plotting +# 时间序列数据用于绘图 probing $ENDPOINT query " SELECT step, stage, avg(duration), avg(allocated) FROM python.torch_trace GROUP BY step, stage -" > training_metrics.json +" > step_metrics.json ``` ## Best Practices diff --git a/docs/src/guide/sql-analytics.zh.md b/docs/src/guide/sql-analytics.zh.md index 9d3e7065..b07ef63f 100644 --- a/docs/src/guide/sql-analytics.zh.md +++ b/docs/src/guide/sql-analytics.zh.md @@ -6,6 +6,8 @@ Probing 提供强大的 SQL 接口用于分析性能和监控数据。 SQL 分析接口将复杂的性能分析转化为直观的数据库查询。所有监控数据都可以通过标准 SQL 操作访问,包括 `SELECT`、`WHERE`、`GROUP BY`、`ORDER BY` 和高级分析函数。 +**表结构:** [SQL 表目录](../reference/sql-tables.zh.md)。**术语:** [核心概念](concepts.zh.md)。 + ## 基本查询结构 ```bash @@ -69,6 +71,57 @@ ORDER BY step DESC, seq; - `ordered:rate` - `rate` 为每 step 采样概率;被采样 step 内轮转一个模块 - `random:rate` - 每 step 都采样;`rate` 为 offset>0 钩子的概率(offset=0 锚点始终记录) +每行还有 `global_step`、`rank`、`world_size`、`role`。见 [SQL 表 — torch_trace](../reference/sql-tables.zh.md#python-torch_trace)。 + +## 集合通信(`python.comm_collective`) + +记录 `torch.distributed` 集合操作的墙钟 `duration_ms`(无需 NCCL 插件)。 + +```sql +SELECT global_step, rank, role, op, duration_ms, bytes +FROM python.comm_collective +WHERE global_step > (SELECT max(global_step) - 20 FROM python.comm_collective) +ORDER BY duration_ms DESC +LIMIT 20; +``` + +与同 rank、同 `role` 的模块耗时 JOIN: + +```sql +SELECT c.global_step, c.role, c.op, c.duration_ms AS comm_ms, + t.module, t.duration AS module_sec +FROM python.comm_collective c +JOIN python.torch_trace t + ON c.global_step = t.global_step AND c.rank = t.rank AND c.role = t.role +WHERE c.duration_ms > 5 AND t.stage LIKE 'post %' AND t.duration > 0 +LIMIT 50; +``` + +内置诊断:`probing $ENDPOINT skill run slow_rank` 或 `comm_bottleneck`。 + +## 联邦查询(`global.*`) + +在集群 master 端点上查询 **`global..
`**,向已注册节点 fan-out;每行带 +`_host`、`_addr`、`_rank`、`_role`。见 [分布式](../design/distributed.zh.md)。 + +**按并行 role 找慢 rank:** + +```sql +SELECT _role, _rank, avg(duration_ms) AS avg_ms, max(duration_ms) AS max_ms +FROM global.python.comm_collective +WHERE global_step > (SELECT max(global_step) - 50 FROM global.python.comm_collective) +GROUP BY _role, _rank +ORDER BY avg_ms DESC; +``` + +```bash +probing -t rank0:8080 cluster query " +SELECT _role, _rank, avg(duration_ms) AS avg_ms +FROM global.python.comm_collective +GROUP BY _role, _rank +ORDER BY avg_ms DESC" +``` + ## 高级分析 ### 时间序列分析 @@ -167,7 +220,7 @@ probing $ENDPOINT query " SELECT step, stage, avg(duration), avg(allocated) FROM python.torch_trace GROUP BY step, stage -" > training_metrics.json +" > step_metrics.json ``` ## 最佳实践 diff --git a/docs/src/guide/troubleshooting.md b/docs/src/guide/troubleshooting.md index 1050e69a..1888d75d 100644 --- a/docs/src/guide/troubleshooting.md +++ b/docs/src/guide/troubleshooting.md @@ -60,9 +60,8 @@ Common issues and their solutions when using Probing. 1. **Check if PyTorch profiling is enabled**: ```bash - probing $ENDPOINT eval " - import probing - print(probing.get_config())" + probing $ENDPOINT config probing.torch.profiling + probing $ENDPOINT tables ``` 2. **Enable PyTorch tracing**: @@ -201,23 +200,19 @@ Common issues and their solutions when using Probing. **Solutions**: -1. **Verify profiling is active**: +1. **Verify tables exist and have rows**: ```bash - probing $ENDPOINT eval " - import probing - print(probing.is_profiling_active())" + probing $ENDPOINT tables + probing $ENDPOINT query "SELECT COUNT(*) AS n FROM python.torch_trace" + probing $ENDPOINT config probing.torch.profiling ``` -2. **Check data retention**: - ```bash - probing $ENDPOINT config | grep retention - ``` +2. **Confirm training has progressed** — rows append when hooks fire; step 1 of TorchProbe + is discovery-only (use `WHERE step > 1` if needed). -3. **Force data flush**: +3. **Check TorchProbe is not off**: ```bash - probing $ENDPOINT eval " - import probing - probing.flush()" + PROBING_TORCH_PROFILING=on python your_script.py ``` ### Incorrect Values diff --git a/docs/src/guide/troubleshooting.zh.md b/docs/src/guide/troubleshooting.zh.md index f0f3b88f..41715935 100644 --- a/docs/src/guide/troubleshooting.zh.md +++ b/docs/src/guide/troubleshooting.zh.md @@ -60,9 +60,8 @@ 1. **检查 PyTorch 分析是否启用**: ```bash - probing $ENDPOINT eval " - import probing - print(probing.get_config())" + probing $ENDPOINT config probing.torch.profiling + probing $ENDPOINT tables ``` 2. **启用 PyTorch 追踪**: @@ -172,6 +171,68 @@ SELECT step, AVG(duration) FROM python.torch_trace GROUP BY step; ``` +## 数据问题 + +### 数据缺失 + +**症状**:预期数据未出现在表中。 + +**解决方案**: + +1. **确认表存在且有行**: + ```bash + probing $ENDPOINT tables + probing $ENDPOINT query "SELECT COUNT(*) AS n FROM python.torch_trace" + probing $ENDPOINT config probing.torch.profiling + ``` + +2. **确认训练已推进** — 钩子在事件发生时写入;TorchProbe 第 1 步仅发现模块(可用 `WHERE step > 1`)。 + +3. **确认未关闭 TorchProbe**: + ```bash + PROBING_TORCH_PROFILING=on python your_script.py + ``` + +### 数值异常 + +**症状**:数据值看起来不对。 + +**解决方案**: + +1. **确认单位**: + - 内存通常为 MB + - duration 通常为秒 + +2. **注意聚合方式**: + ```sql + -- SUM 与单行 allocated 的区别 + SELECT SUM(allocated) FROM python.torch_trace; + SELECT allocated FROM python.torch_trace LIMIT 5; + ``` + +3. **手工校验**: + ```bash + probing $ENDPOINT eval " + import torch + print(torch.cuda.memory_allocated() / 1024**2)" + ``` + +## 平台相关问题 + +### Linux + +- **ptrace 错误**:可能需要 `CAP_SYS_PTRACE` +- **SELinux**:可能需要调整策略 + +### macOS + +- **不支持 inject**:启动时使用 `PROBING=1` +- **SIP**:可能影响部分功能 + +### Windows + +- **支持有限**:仅能对已启用 probing 的进程 query/eval + ## 获取帮助 如果仍有问题: diff --git a/docs/src/index.md b/docs/src/index.md index f5dc49d1..5a8f2e91 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -1,46 +1,39 @@ --- template: home.html title: Probing - Dynamic Performance Profiler for Distributed AI -description: A production-grade performance profiler designed specifically for distributed AI workloads. Zero-intrusion, SQL-powered analytics, real-time introspection. +description: Zero-intrusion profiler for distributed AI — SQL tables, live introspection, cluster federation, and diagnostic skills. hide: toc --- - - # Probing -**Probing** is a dynamic performance profiler for distributed AI applications. +**Probing** profiles distributed AI training: continuous SQL tables, live attach, federated +`global.*` queries, and bundled diagnostic skills. -## Key Features +## Capabilities -- **Zero Intrusion** - Attach to running processes without code changes -- **SQL Analytics** - Query performance data with standard SQL -- **Live Execution** - Run Python code in target processes -- **Stack Analysis** - Capture call stacks with variable values -- **Distributed Ready** - Monitor processes across multiple nodes +- **Continuous profiling** — `torch_trace`, `comm_collective`, NCCL proxy, custom `@table` +- **Live introspection** — `eval`, `backtrace`, REPL against running processes +- **SQL analytics** — single-node and `global.*` federation with `_rank` / `_role` tags +- **Diagnostic skills** — `health_overview`, `slow_rank`, `nccl_culprit_victim`, … +- **Cluster** — `cluster nodes`, `cluster query`, Web UI agent +- **Zero intrusion** — `PROBING=1` at startup or Linux `inject` ## Quick Start ```bash -# Install pip install probing -# Inject into running process -probing -t inject +# Recommended for training +PROBING=1 PROBING_TORCH_PROFILING=on python train.py -# Query performance data +# Or attach on Linux +probing -t inject probing -t query "SELECT * FROM python.torch_trace LIMIT 10" +probing -t skill run health_overview ``` -## Use Cases - -- **Training Debugging** - Debug training instabilities and hangs -- **Memory Analysis** - Track GPU/CPU memory usage -- **Performance Profiling** - Identify bottlenecks in model execution -- **Production Monitoring** - Monitor AI services without restarts - -## Community +## Documentation map -- [GitHub Repository](https://github.com/DeepLink-org/probing) -- [Issue Tracker](https://github.com/DeepLink-org/probing/issues) -- [PyPI Package](https://pypi.org/project/probing/) +- [Installation](installation.md) · [Quick Start](quickstart.md) · [Core Concepts](guide/concepts.md) +- [SQL Tables](reference/sql-tables.md) · [API Reference](api-reference.md) · [Contributing](contributing.md) diff --git a/docs/src/index.zh.md b/docs/src/index.zh.md index facff997..89feba44 100644 --- a/docs/src/index.zh.md +++ b/docs/src/index.zh.md @@ -1,46 +1,38 @@ --- template: home.html title: Probing - 分布式 AI 动态性能分析器 -description: 专为分布式 AI 工作负载设计的生产级性能分析器。零侵入、SQL 驱动分析、实时内省。 +description: 面向分布式 AI 的零侵入分析器 — SQL 表、现场内省、集群联邦与诊断 skill。 hide: toc --- - - # Probing -**Probing** 是一个面向分布式 AI 应用的动态性能分析器。 +**Probing** 面向分布式 AI 训练:持续写入 SQL 表、现场附着、联邦 `global.*` 查询与内置诊断 skill。 -## 核心特性 +## 能力概览 -- **零侵入** - 无需修改代码即可附加到运行中的进程 -- **SQL 分析** - 使用标准 SQL 查询性能数据 -- **实时执行** - 在目标进程中运行 Python 代码 -- **堆栈分析** - 捕获带有变量值的调用栈 -- **分布式支持** - 监控跨多节点的进程 +- **持续采集** — `torch_trace`、`comm_collective`、NCCL proxy、自定义 `@table` +- **现场内省** — 对运行中进程 `eval`、`backtrace`、REPL +- **SQL 分析** — 单节点与 `global.*` 联邦(`_rank` / `_role` 标签) +- **诊断 skill** — `health_overview`、`slow_rank`、`nccl_culprit_victim` 等 +- **集群** — `cluster nodes`、`cluster query`、Web UI Agent +- **零侵入** — 启动时 `PROBING=1` 或 Linux `inject` ## 快速开始 ```bash -# 安装 pip install probing -# 注入到运行中的进程 -probing -t inject +# 训练推荐 +PROBING=1 PROBING_TORCH_PROFILING=on python train.py -# 查询性能数据 +# 或 Linux 附着 +probing -t inject probing -t query "SELECT * FROM python.torch_trace LIMIT 10" +probing -t skill run health_overview ``` -## 使用场景 - -- **训练调试** - 调试训练不稳定和卡住问题 -- **内存分析** - 追踪 GPU/CPU 内存使用 -- **性能分析** - 识别模型执行中的瓶颈 -- **生产监控** - 无需重启即可监控 AI 服务 - -## 社区 +## 文档导航 -- [GitHub 仓库](https://github.com/DeepLink-org/probing) -- [问题追踪](https://github.com/DeepLink-org/probing/issues) -- [PyPI 包](https://pypi.org/project/probing/) +- [安装指南](installation.zh.md) · [快速开始](quickstart.zh.md) · [核心概念](guide/concepts.zh.md) +- [SQL 表目录](reference/sql-tables.zh.md) · [API 参考](api-reference.zh.md) · [贡献指南](contributing.zh.md) diff --git a/docs/src/installation.md b/docs/src/installation.md index 05dff6c4..2b1bc439 100644 --- a/docs/src/installation.md +++ b/docs/src/installation.md @@ -1,84 +1,101 @@ # Installation -This guide provides instructions on how to install Probing on your system. +How to install Probing for **production use** or **wheel-based evaluation**. +Contributors building from a git checkout should follow [Contributing — Development setup](contributing.md#development-setup) (`make develop`), not this page alone. -## Prerequisites +## Requirements -Before you begin, ensure you have the following: +| Component | Version | +|-----------|---------| +| Python | 3.7+ (3.9+ recommended for development) | +| OS (full features) | Linux — required for `probing inject` | +| OS (in-process only) | macOS / Windows — `PROBING=1` at startup, query/eval via CLI | -- Python (version 3.7 or higher) -- Pip (Python package installer) -- For building from source: - - Rust (latest stable version recommended) - - Cargo (Rust's package manager and build system) - -## Installation Methods - -### 1. Using Pip (Recommended) - -This is the easiest way to install Probing: +## Install from PyPI (recommended) ```bash pip install probing +# or: uv pip install probing ``` -This command will download and install the latest stable release of Probing from the Python Package Index (PyPI). +Verify: + +```bash +probing --version +probing list +``` -### 2. Building from Source +## Enable probing in your training job -If you want the latest development version or want to contribute to Probing, you can build it from source: +After installation, the wheel ships a **site hook** (`probing.pth` → `probing_hook.py`) that can auto-import probing when the `PROBING` environment variable is set — no code changes required. ```bash -# 1. Clone the repository -git clone https://github.com/DeepLink-org/probing.git -cd probing +# Current process only +PROBING=1 python train.py -# 2. Build and install the Python package -make wheel -pip install dist/probing-*.whl +# Current process + child processes (torchrun, mp.spawn, …) +PROBING=2 python train.py ``` -This will compile the Rust components and build the Python wheel for installation. +Common values: -For detailed instructions on building from source, including prerequisites and troubleshooting, see the [Building from Source](design/architecture.md) guide. +| `PROBING` | Behavior | +|-----------|----------| +| unset / `0` | Disabled (default) | +| `1` / `followed` | Enable in current process | +| `2` / `nested` | Enable in current and child processes | +| `regex:PATTERN` | Enable when script name matches regex | +| `SCRIPT.py` | Enable when script basename matches | -## Verifying the Installation +Advanced filters and `init:…` prefixes: see `python/probing/site_hook.py` in the repository. -After installation, you can verify that Probing is correctly installed by running: +On **Linux**, you can also attach to a running process: ```bash -probing --version +probing -t inject ``` -This should print the installed version of Probing, for example: +On **macOS / Windows**, use `PROBING=1` (or `2`) at startup; injection is not available. -``` -probing 0.2.5 -``` +## Install from a release wheel (source build) -You can also check if the `probing` command is available: +Use this for CI smoke tests or when you need a locally built wheel — **not** for day-to-day hacking on the repo (use `make develop` instead). ```bash -probing list +git clone https://github.com/DeepLink-org/probing.git +cd probing + +# Optional: Rust / frontend toolchain — see contributing.md#prerequisites +make frontend +make wheel +pip install dist/probing-*.whl --force-reinstall +# or: make install-wheel ``` -This command should list available probing commands or indicate that no processes are currently being probed. +Verify as above. The installed wheel includes the same site hook as PyPI. + +## Platform support + +| Platform | `probing inject` | In-process (`PROBING=1`) | CLI query / eval | +|----------|------------------|---------------------------|------------------| +| Linux | ✅ | ✅ | ✅ | +| macOS | ❌ | ✅ | ✅ | +| Windows | ❌ | ✅ | ✅ | -## Platform Support +## Upgrade + +```bash +pip install --upgrade probing +``` -| Platform | Injection | Query/Eval | -|----------|-----------|------------| -| Linux | ✅ Full support | ✅ Full support | -| macOS | ❌ Not supported | ✅ Supported | -| Windows | ❌ Not supported | ✅ Supported | +See [Versions](versions.md) for Python / PyTorch / NCCL compatibility notes. -!!! note "Linux Required for Injection" - The dynamic probe injection feature (`probing inject`) requires Linux. On other platforms, you can still use query and eval features if the target process has probing enabled at startup. +## Optional: example & ML dependencies -## Next Steps +The core package has **no** hard Python dependencies. Repository examples under `examples/` may require extra packages (e.g. `torch`, `torchvision`). See [examples/README.md](https://github.com/DeepLink-org/probing/blob/main/examples/README.md). -With Probing installed, you are ready to start using it: +## Next steps -- [Quick Start](quickstart.md) - Get started with your first analysis -- [SQL Analytics](guide/sql-analytics.md) - Learn the SQL query interface -- [Memory Analysis](guide/memory-analysis.md) - Debug memory issues +- [Quick Start](quickstart.md) +- [Core Concepts](guide/concepts.md) — endpoints, in-process vs attach +- [Contributing](contributing.md) — clone, `make develop`, run tests diff --git a/docs/src/installation.zh.md b/docs/src/installation.zh.md index 52672ad2..c9f2d029 100644 --- a/docs/src/installation.zh.md +++ b/docs/src/installation.zh.md @@ -1,82 +1,101 @@ # 安装指南 -本指南介绍如何在您的系统上安装 Probing。 +本文说明如何**安装并使用** Probing(PyPI 或本地 wheel)。 +在仓库里改代码、跑测试请直接看 [贡献指南 — 开发环境](contributing.zh.md#development-setup),使用 `make develop`,不要只按本文装 wheel。 ## 环境要求 -在开始之前,请确保您的系统满足以下要求: +| 组件 | 版本 | +|------|------| +| Python | 3.7+(开发建议 3.9+) | +| 操作系统(完整功能) | Linux — `probing inject` 需要 | +| 操作系统(仅进程内) | macOS / Windows — 启动时 `PROBING=1`,CLI query/eval 可用 | -- Python(3.7 或更高版本) -- Pip(Python 包安装器) -- 如需从源码构建: - - Rust(推荐最新稳定版) - - Cargo(Rust 的包管理器和构建系统) - -## 安装方式 - -### 1. 使用 Pip(推荐) - -这是安装 Probing 最简单的方式: +## 从 PyPI 安装(推荐) ```bash pip install probing +# 或:uv pip install probing ``` -此命令将从 Python Package Index (PyPI) 下载并安装 Probing 的最新稳定版本。 +验证: + +```bash +probing --version +probing list +``` -### 2. 从源码构建 +## 在训练任务中启用 probing -如果您需要最新的开发版本或想要贡献代码,可以从源码构建: +安装后,wheel 自带 **site hook**(`probing.pth` → `probing_hook.py`):设置 `PROBING` 环境变量即可自动 import probing,**无需改训练脚本**。 ```bash -# 1. 克隆仓库 -git clone https://github.com/DeepLink-org/probing.git -cd probing +# 仅当前进程 +PROBING=1 python train.py -# 2. 构建并安装 Python 包 -make wheel -pip install dist/probing-*.whl +# 当前进程 + 子进程(torchrun、mp.spawn 等) +PROBING=2 python train.py ``` -这将编译 Rust 组件并构建用于安装的 Python wheel 包。 +常用取值: -## 验证安装 +| `PROBING` | 行为 | +|-----------|------| +| 未设置 / `0` | 关闭(默认) | +| `1` / `followed` | 当前进程启用 | +| `2` / `nested` | 当前进程及子进程启用 | +| `regex:PATTERN` | 脚本名匹配正则时启用 | +| `SCRIPT.py` | 脚本 basename 完全匹配时启用 | -安装完成后,可以通过以下命令验证 Probing 是否正确安装: +高级过滤与 `init:…` 前缀见仓库内 `python/probing/site_hook.py`。 + +在 **Linux** 上还可 attach 已运行进程: ```bash -probing --version +probing -t inject ``` -应该会输出已安装的 Probing 版本,例如: +**macOS / Windows** 请在启动时设置 `PROBING=1`(或 `2`);不支持 inject。 -``` -probing 0.2.5 -``` +## 从源码构建 wheel 安装 -您也可以检查 `probing` 命令是否可用: +适用于 CI 冒烟或本地验 wheel — **不是**日常改仓库代码的方式(请用 `make develop`)。 ```bash -probing list +git clone https://github.com/DeepLink-org/probing.git +cd probing + +# 可选:Rust / 前端工具链 — 见 contributing.zh.md#prerequisites +make frontend +make wheel +pip install dist/probing-*.whl --force-reinstall +# 或:make install-wheel ``` -此命令应该会列出可用的 probing 命令或显示当前没有进程正在被探测。 +验证方式同上。本地 wheel 与 PyPI 一样包含 site hook。 ## 平台支持 -| 平台 | 注入功能 | 查询/执行 | -|------|----------|-----------| -| Linux | ✅ 完全支持 | ✅ 完全支持 | -| macOS | ❌ 不支持 | ✅ 支持 | -| Windows | ❌ 不支持 | ✅ 支持 | +| 平台 | `probing inject` | 进程内(`PROBING=1`) | CLI query / eval | +|------|------------------|----------------------|------------------| +| Linux | ✅ | ✅ | ✅ | +| macOS | ❌ | ✅ | ✅ | +| Windows | ❌ | ✅ | ✅ | -!!! note "注入功能需要 Linux" - 动态探针注入功能(`probing inject`)需要 Linux 系统。在其他平台上,如果目标进程在启动时启用了 probing,您仍然可以使用查询和执行功能。 +## 升级 -## 下一步 +```bash +pip install --upgrade probing +``` + +版本与 PyTorch / NCCL 兼容性见 [版本说明](versions.zh.md)。 -安装完成后,您可以开始使用 Probing: +## 可选:示例与 ML 依赖 + +核心包**无**强制 Python 依赖。`examples/` 下的示例可能需要额外安装(如 `torch`、`torchvision`),见 [examples/README.md](https://github.com/DeepLink-org/probing/blob/main/examples/README.md)。 + +## 下一步 -- [快速开始](quickstart.zh.md) - 开始您的第一次分析 -- [SQL 分析](guide/sql-analytics.zh.md) - 学习 SQL 查询接口 -- [内存分析](guide/memory-analysis.zh.md) - 调试内存问题 +- [快速开始](quickstart.zh.md) +- [核心概念](guide/concepts.zh.md) — endpoint、进程内 vs attach +- [贡献指南](contributing.zh.md) — 克隆、`make develop`、测试 diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md index 5a6a7e7f..4d7661cf 100644 --- a/docs/src/quickstart.md +++ b/docs/src/quickstart.md @@ -19,7 +19,7 @@ export ENDPOINT=remote-host:8080 !!! tip "Finding Processes" Use `ps aux | grep python` or `pgrep -f "python.*train"` to locate your target. -### Step 2: Connect and Explore +### Step 2: Attach and explore ```bash # Connect to your process (Linux only) @@ -29,73 +29,18 @@ probing $ENDPOINT inject probing $ENDPOINT eval "import os, psutil; proc = psutil.Process(); print(f'PID: {os.getpid()}, Memory: {proc.memory_info().rss/1024**2:.1f}MB')" ``` -### Step 3: Try All Three Core Capabilities +### Step 3: Try three CLI commands -#### 📊 Query structured data +Profiling tables fill automatically when hooks run. These commands read and interact with the probe: ```bash probing $ENDPOINT query "SELECT name, value FROM information_schema.df_settings LIMIT 5" -``` - -#### 🎯 Execute live code - -```bash probing $ENDPOINT eval "import torch; print(f'CUDA: {torch.cuda.is_available()}')" -``` - -#### 🔍 Capture execution context - -```bash probing $ENDPOINT backtrace - probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace ORDER BY depth LIMIT 5" ``` -## Three Core Capabilities - -Probing provides three powerful capabilities that work together: - -### 🎯 eval: Execute Code in Live Processes - -Run arbitrary Python code directly inside your target process: - -```bash -# Check training threads -probing $ENDPOINT eval "import threading; [print(f'{t.name}: {t.is_alive()}') for t in threading.enumerate()]" - -# Check GPU memory usage -probing $ENDPOINT eval "import torch; print(f'GPU: {torch.cuda.memory_allocated()/1024**3:.1f}GB allocated')" -``` - -### 📊 query: Analyze Data with SQL - -Query structured performance data using familiar SQL syntax: - -```bash -probing $ENDPOINT query " -SELECT - step, - module, - SUM(allocated) as total_memory_mb, - COUNT(*) as operation_count -FROM python.torch_trace -WHERE step > 100 -GROUP BY step, module -ORDER BY total_memory_mb DESC -LIMIT 10" -``` - -### 🔍 backtrace: Debug with Stack Context - -Capture detailed call stacks with Python variable values: - -```bash -# Capture current call stack -probing $ENDPOINT backtrace - -# Query the stack trace -probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace ORDER BY depth LIMIT 3" -``` +Details: **[Core Concepts](guide/concepts.md)** · **[API Reference](api-reference.md)** ## Real-World Debugging Scenarios @@ -142,6 +87,8 @@ LIMIT 10" ## Next Steps +- **[Core Concepts](guide/concepts.md)** — Endpoint, tables, step/role, federation (read this next) +- **[Diagnostic Skills](guide/skills.md)** — `probing skill run` workflows - [SQL Analytics](guide/sql-analytics.md) - Advanced query techniques - [Memory Analysis](guide/memory-analysis.md) - Deep dive into memory debugging - [Debugging Guide](guide/debugging.md) - Expert debugging patterns diff --git a/docs/src/quickstart.zh.md b/docs/src/quickstart.zh.md index 0f38caf5..597fb2c4 100644 --- a/docs/src/quickstart.zh.md +++ b/docs/src/quickstart.zh.md @@ -19,7 +19,7 @@ export ENDPOINT=remote-host:8080 !!! tip "查找进程" 使用 `ps aux | grep python` 或 `pgrep -f "python.*train"` 来定位目标进程。 -### 步骤 2:连接并探索 +### 步骤 2:附着并探索 ```bash # 连接到进程(仅 Linux) @@ -29,73 +29,18 @@ probing $ENDPOINT inject probing $ENDPOINT eval "import os, psutil; proc = psutil.Process(); print(f'PID: {os.getpid()}, 内存: {proc.memory_info().rss/1024**2:.1f}MB')" ``` -### 步骤 3:尝试三大核心功能 +### 步骤 3:试用三种 CLI 命令 -#### 📊 查询结构化数据 +采集表在钩子运行时自动写入。以下命令读取并与探针交互: ```bash probing $ENDPOINT query "SELECT name, value FROM information_schema.df_settings LIMIT 5" -``` - -#### 🎯 执行实时代码 - -```bash probing $ENDPOINT eval "import torch; print(f'CUDA: {torch.cuda.is_available()}')" -``` - -#### 🔍 捕获执行上下文 - -```bash probing $ENDPOINT backtrace - probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace ORDER BY depth LIMIT 5" ``` -## 三大核心能力 - -Probing 提供三个强大的能力,它们协同工作: - -### 🎯 eval:在运行中的进程执行代码 - -直接在目标进程中运行任意 Python 代码: - -```bash -# 检查训练线程 -probing $ENDPOINT eval "import threading; [print(f'{t.name}: {t.is_alive()}') for t in threading.enumerate()]" - -# 检查 GPU 内存使用 -probing $ENDPOINT eval "import torch; print(f'GPU: {torch.cuda.memory_allocated()/1024**3:.1f}GB 已分配')" -``` - -### 📊 query:用 SQL 分析数据 - -使用熟悉的 SQL 语法查询结构化性能数据: - -```bash -probing $ENDPOINT query " -SELECT - step, - module, - SUM(allocated) as total_memory_mb, - COUNT(*) as operation_count -FROM python.torch_trace -WHERE step > 100 -GROUP BY step, module -ORDER BY total_memory_mb DESC -LIMIT 10" -``` - -### 🔍 backtrace:带堆栈上下文的调试 - -捕获带有 Python 变量值的详细调用栈: - -```bash -# 捕获当前调用栈 -probing $ENDPOINT backtrace - -# 查询堆栈跟踪 -probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace ORDER BY depth LIMIT 3" -``` +详见 **[核心概念](guide/concepts.zh.md)** · **[API 参考](api-reference.zh.md)** ## 真实调试场景 @@ -142,6 +87,8 @@ LIMIT 10" ## 下一步 +- **[核心概念](guide/concepts.zh.md)** — 端点、表、step/role、联邦(建议优先阅读) +- **[诊断 Skill](guide/skills.zh.md)** — `probing skill run` 工作流 - [SQL 分析](guide/sql-analytics.zh.md) - 高级查询技巧 - [内存分析](guide/memory-analysis.zh.md) - 深入内存调试 - [调试指南](guide/debugging.zh.md) - 专家级调试模式 diff --git a/docs/src/reference/index.md b/docs/src/reference/index.md new file mode 100644 index 00000000..5db34262 --- /dev/null +++ b/docs/src/reference/index.md @@ -0,0 +1,11 @@ +# Reference + +Authoritative lookup for SQL schemas, CLI commands, and runtime APIs. + +| Page | Contents | +|------|----------| +| **[SQL Tables](sql-tables.md)** | Physical columns for `python.*`, `cluster.*`, and federation tags (synced with `tables.yaml`) | +| **[API Reference](../api-reference.md)** | CLI, in-process Python API, config, [unimplemented APIs](../api-reference.md#unimplemented-apis) | +| **[Versions](../versions.md)** | Release compatibility and upgrade notes | + +For narrative guides, see **[User Guide](../guide/index.md)** and **[Core Concepts](../guide/concepts.md)**. diff --git a/docs/src/reference/index.zh.md b/docs/src/reference/index.zh.md new file mode 100644 index 00000000..5556ae4a --- /dev/null +++ b/docs/src/reference/index.zh.md @@ -0,0 +1,11 @@ +# 参考手册 + +SQL 表结构、CLI 命令与运行时 API 的权威查阅入口。 + +| 页面 | 内容 | +|------|------| +| **[SQL 表目录](sql-tables.zh.md)** | `python.*`、`cluster.*` 物理列与联邦标签(与 `tables.yaml` 同步) | +| **[API 参考](../api-reference.zh.md)** | CLI、进程内 Python API、配置、[未实现 API](../api-reference.zh.md#unimplemented-apis) | +| **[版本兼容性](../versions.zh.md)** | 版本兼容与升级说明 | + +叙事性指南见 **[用户指南](../guide/index.zh.md)** 与 **[核心概念](../guide/concepts.zh.md)**。 diff --git a/docs/src/reference/sql-tables.md b/docs/src/reference/sql-tables.md new file mode 100644 index 00000000..05996923 --- /dev/null +++ b/docs/src/reference/sql-tables.md @@ -0,0 +1,303 @@ +# SQL Tables + +Authoritative catalog of built-in SQL tables queryable via `probing query` or in-process +`probing.query()`. Kept in sync with `python/probing/_skills/semantic/tables.yaml` (used by +diagnostic skills and the Web Agent). + +Terminology: [Core Concepts](../guide/concepts.md) (endpoint, steps, `role`, federation). + +## Schemas + +| Prefix | Meaning | +|--------|---------| +| `python.*` | Python / training probe tables (memtable) | +| `cpu.*`, `gpu.*`, `process.*` | Host / device sampling (extensions) | +| `cluster.*` | Cluster registry | +| `nccl.*` | NCCL profiler plugin (optional) | +| `global..
` | Federated fan-out across registered peers | +| `information_schema.*` | Engine metadata | + +List tables on a live endpoint: + +```bash +probing $ENDPOINT tables +probing $ENDPOINT tables --all +``` + +## Federation + +Tables with a **`global_name`** can be queried as `global.` (e.g. +`global.python.comm_collective`). The master merges peer results and may attach: + +| Tag | Description | +|-----|-------------| +| `_host` | Source hostname | +| `_addr` | Source probing HTTP address | +| `_rank` | `torch.distributed` rank (from `cluster.nodes`) | +| `_role` | Parallel role key (e.g. `dp=2,pp=1,tp=0`) | + +Example: + +```sql +SELECT _role, _rank, avg(duration_ms) AS avg_ms +FROM global.python.comm_collective +GROUP BY _role, _rank; +``` + +--- + +## Training & tracing (`python.*`) + +### `python.torch_trace` + +PyTorch module-level forward/step timings and GPU memory snapshots. + +**Synonyms:** torch trace, module timing + +| Column | Description | +|--------|-------------| +| `step` | Local training step (per rank) | +| `global_step` | Global step (`step_snapshot`) | +| `rank` | `torch.distributed` rank | +| `world_size` | World size | +| `role` | Parallel role key, e.g. `dp=2,pp=1,tp=0` | +| `seq` | Hook sequence within step | +| `module` | Fully-qualified module name | +| `stage` | `pre forward`, `post forward`, `pre step`, `post step` | +| `duration` | Hook duration (seconds); meaningful on post rows | +| `time_offset` | Seconds since step time anchor | +| `allocated` | GPU memory allocated (MB) | +| `allocated_delta` | Change in allocated since previous hook (MB) | +| `max_allocated` | Peak allocated (MB) | +| `max_allocated_delta` | Change in peak allocated (MB) | +| `cached` | GPU memory reserved (MB) | +| `max_cached` | Peak reserved (MB) | + +**Notes:** First complete step is discovery-only (may have no rows). Backward hooks are off +by default. + +--- + +### `python.comm_collective` + +`torch.distributed` collective calls (all_reduce, broadcast, …). + +**Synonyms:** collective, communication, NCCL, all_reduce + +| Column | Description | +|--------|-------------| +| `local_step` | Local step on this rank | +| `global_step` | Global training step | +| `rank` | `torch.distributed` rank | +| `world_size` | World size | +| `role` | Parallel role key | +| `op` | Collective operation name | +| `group_rank` | Rank within process group | +| `group_size` | Process group size | +| `participate_ranks` | Participating ranks (serialized) | +| `tensor_shape` | Tensor shape string | +| `tensor_dtype` | Tensor dtype | +| `bytes` | Tensor bytes communicated | +| `duration_ms` | Wall time (milliseconds) | +| `async_op` | 1 if asynchronous collective | + +**Global:** `global.python.comm_collective` +**Federation columns:** `_host`, `_addr`, `_rank`, `_role` + +--- + +### `python.trace_event` + +Span start/end and custom events (distributed tracing). + +**Synonyms:** trace, span, timeline + +| Column | Description | +|--------|-------------| +| `record_type` | `span_start` \| `span_end` \| `event` | +| `trace_id` | Trace id shared by related spans | +| `span_id` | Unique span id | +| `name` | Span or event name | +| `kind` | Semantic kind (e.g. `train.step`, `comm.all_reduce`) | +| `time` | Timestamp (nanoseconds since epoch) | +| `attributes` | JSON metadata (rank, local_step, …) | + +Join `span_start` / `span_end` on `span_id` for durations. See [Distributed](../design/distributed.md). + +--- + +### `python.backtrace` + +Live mixed Python + native stack (**point-in-time**, not a full history). + +**Synonyms:** stack, backtrace, hang stack + +| Column | Description | +|--------|-------------| +| `func` | Function name | +| `file` | Source file | +| `lineno` | Line number | +| `depth` | Stack depth (0 = innermost) | +| `frame_type` | `python` \| `native` | + +Populate with `probing backtrace`, then `SELECT … FROM python.backtrace`. + +--- + +### `python.variables` + +Variable snapshots when variable tracing is enabled. + +| Column | Description | +|--------|-------------| +| `step` | Training step | +| `func` | Function name | +| `name` | Variable name | +| `value` | String representation | + +--- + +## System metrics + +### `cpu.utilization` + +Host CPU and RSS sampling (process and top threads). + +| Column | Description | +|--------|-------------| +| `ts` | Sample timestamp (microseconds) | +| `scope` | `process` \| `thread` | +| `rss_kb` | Resident set size (KB) — process scope only | +| `cpu_total_pct` | CPU utilization (%) | +| `comm` | Thread/process name | +| `wchan` | Kernel wait channel (Linux) | + +--- + +### `gpu.utilization` + +GPU memory and utilization samples. + +| Column | Description | +|--------|-------------| +| `ts` | Sample timestamp | +| `used_bytes` | Device memory used | +| `total_bytes` | Device memory total | +| `mem_used_pct` | Memory used (%) | +| `gpu_util_pct` | GPU compute utilization (-1 if unavailable) | + +--- + +### `process.kmsg` + +Linux kernel ring buffer (dmesg) — OOM killer, GPU Xid, IB errors. **Linux only.** + +| Column | Description | +|--------|-------------| +| `timestamp` | Event time | +| `level` | Log level | +| `message` | Kernel message text | + +--- + +## Cluster + +### `cluster.nodes` + +Registered distributed training peers (from `PUT /apis/nodes` / torchrun registration). + +| Column | Description | +|--------|-------------| +| `host` | Hostname | +| `addr` | Probing HTTP address | +| `rank` | Global rank | +| `world_size` | World size | +| `local_rank` | Local rank on node | +| `role` | Parallel role key (source for federation `_role`) | +| `role_name` | Torchrun / Elastic role name (distinct from `role`) | +| `status` | Node status | +| `timestamp` | Last update (microseconds) | + +```bash +probing -t cluster nodes +# or: SELECT * FROM cluster.nodes +``` + +--- + +## NCCL profiler (optional) + +Requires NCCL profiler plugin — see [NCCL Profiler](../design/nccl-profiler.md). + +### `nccl.proxy_ops` + +Per-proxy-op wait decomposition (culprit vs victim). + +| Column | Description | +|--------|-------------| +| `ts` | Event timestamp (nanoseconds) | +| `rank` | `torch.distributed` rank | +| `tp_rank`, `pp_rank`, `dp_rank` | Parallel ranks (-1 if unknown) | +| `comm_hash` | NCCL communicator hash | +| `coll_func` | Collective name (AllReduce, AllGather, …) | +| `seq` | Collective sequence number | +| `channel_id` | NCCL channel id | +| `peer` | Peer rank for this proxy op | +| `is_send` | 1 if send proxy, 0 if recv | +| `n_steps` | ProxyStep count aggregated | +| `trans_bytes` | Bytes transferred | +| `send_gpu_wait_ns` | **Culprit** — local GPU not ready to send | +| `send_wait_ns` | Send-side network wait | +| `recv_wait_ns` | **Victim** — waiting on peer data | +| `recv_flush_wait_ns` | Recv flush wait | + +**Global:** `global.nccl.proxy_ops` +**Federation columns:** `_host`, `_addr`, `_rank`, `_role` + +--- + +### `nccl.net_qp` + +NCCL NetPlugin IB QP completion timing (optional mask bit 128). + +| Column | Description | +|--------|-------------| +| `ts` | Event timestamp (nanoseconds) | +| `rank` | `torch.distributed` rank | +| `device` | IB device index | +| `qp_num` | Queue pair number | +| `wr_id` | Work request id | +| `opcode` | IB opcode | +| `length` | Transfer length | +| `duration_ns` | QP completion duration | + +**Global:** `global.nccl.net_qp` +**Federation columns:** `_host`, `_addr`, `_rank`, `_role` + +--- + +## Metadata + +### `information_schema.df_settings` + +Runtime configuration key/value pairs (`probing.*` settings). + +| Column | Description | +|--------|-------------| +| `name` | Setting name | +| `value` | Setting value | + +--- + +## Custom tables + +Plugins register `python.` via `@table` dataclass. Schema is defined by the plugin +author — not listed here. See [Extensibility](../design/extensibility.md). + +--- + +## Related + +- [Core Concepts](../guide/concepts.md) — steps, role, `global.*` +- [SQL Analytics](../guide/sql-analytics.md) — query patterns +- [API Reference](../api-reference.md) — CLI and Python API diff --git a/docs/src/reference/sql-tables.zh.md b/docs/src/reference/sql-tables.zh.md new file mode 100644 index 00000000..27a4f6f3 --- /dev/null +++ b/docs/src/reference/sql-tables.zh.md @@ -0,0 +1,272 @@ +# SQL 表目录 + +可通过 `probing query` 或进程内 `probing.query()` 查询的内置 SQL 表权威目录。 +与 `python/probing/_skills/semantic/tables.yaml` 保持同步(诊断 skill 与 Web Agent 使用)。 + +术语说明见 [核心概念](../guide/concepts.zh.md)。 + +## Schema 前缀 + +| 前缀 | 含义 | +|------|------| +| `python.*` | Python / 训练探针表(memtable) | +| `cpu.*`、`gpu.*`、`process.*` | 主机 / 设备采样(扩展) | +| `cluster.*` | 集群注册表 | +| `nccl.*` | NCCL profiler 插件(可选) | +| `global..
` | 跨已注册节点联邦 fan-out | +| `information_schema.*` | 引擎元数据 | + +列出当前端点上的表: + +```bash +probing $ENDPOINT tables +probing $ENDPOINT tables --all +``` + +## 联邦查询 + +带 **`global_name`** 的表可用 `global.<路径>` 查询(如 `global.python.comm_collective`)。 +Master 合并各节点结果并可能附加: + +| 标签 | 说明 | +|------|------| +| `_host` | 来源主机名 | +| `_addr` | 来源 probing HTTP 地址 | +| `_rank` | `torch.distributed` rank(来自 `cluster.nodes`) | +| `_role` | 并行角色 key(如 `dp=2,pp=1,tp=0`) | + +示例: + +```sql +SELECT _role, _rank, avg(duration_ms) AS avg_ms +FROM global.python.comm_collective +GROUP BY _role, _rank; +``` + +--- + +## 训练与 tracing(`python.*`) + +### `python.torch_trace` + +PyTorch 模块级 forward/step 耗时与 GPU 显存快照。 + +**同义词:** torch trace、模块耗时 + +| 列 | 说明 | +|----|------| +| `step` | 本地训练步(每 rank) | +| `global_step` | 全局步(`step_snapshot`) | +| `rank` | `torch.distributed` rank | +| `world_size` | world size | +| `role` | 并行角色 key,如 `dp=2,pp=1,tp=0` | +| `seq` | 步内 hook 序号 | +| `module` | 模块全名 | +| `stage` | `pre forward`、`post forward`、`pre step`、`post step` | +| `duration` | hook 耗时(秒);post 行有效 | +| `time_offset` | 相对 step 时间锚点(秒) | +| `allocated` | GPU 已分配显存(MB) | +| `allocated_delta` | 相对上一 hook 的 allocated 变化(MB) | +| `max_allocated` | 峰值 allocated(MB) | +| `max_allocated_delta` | 峰值 allocated 变化(MB) | +| `cached` | GPU 预留显存(MB) | +| `max_cached` | 峰值预留(MB) | + +**说明:** 第一个完整 step 为 discovery(可能无行)。默认不采 backward hook。 + +--- + +### `python.comm_collective` + +`torch.distributed` 集合通信(all_reduce、broadcast 等)。 + +**同义词:** collective、通信、all_reduce + +| 列 | 说明 | +|----|------| +| `local_step` | 本 rank 本地步 | +| `global_step` | 全局训练步 | +| `rank` | `torch.distributed` rank | +| `world_size` | world size | +| `role` | 并行角色 key | +| `op` | 集合操作名 | +| `group_rank` | 进程组内 rank | +| `group_size` | 进程组大小 | +| `participate_ranks` | 参与 rank(序列化) | +| `tensor_shape` | 张量 shape | +| `tensor_dtype` | 张量 dtype | +| `bytes` | 通信字节数 | +| `duration_ms` | 墙钟时间(毫秒) | +| `async_op` | 1 表示异步 collective | + +**Global:** `global.python.comm_collective` +**联邦列:** `_host`、`_addr`、`_rank`、`_role` + +--- + +### `python.trace_event` + +Span 起止与自定义事件(分布式 tracing)。 + +| 列 | 说明 | +|----|------| +| `record_type` | `span_start` \| `span_end` \| `event` | +| `trace_id` | 同一 trace 内共享 | +| `span_id` | Span 唯一 id | +| `name` | Span / 事件名 | +| `kind` | 语义类型(如 `train.step`、`comm.all_reduce`) | +| `time` | 时间戳(纳秒) | +| `attributes` | JSON 元数据(rank、local_step 等) | + +在 `span_id` 上 join `span_start` / `span_end` 可得时长。见 [分布式](../design/distributed.zh.md)。 + +--- + +### `python.backtrace` + +Python + native 混合栈(**瞬时**,非历史全量)。 + +| 列 | 说明 | +|----|------| +| `func` | 函数名 | +| `file` | 源文件 | +| `lineno` | 行号 | +| `depth` | 栈深度(0 为最内层) | +| `frame_type` | `python` \| `native` | + +先 `probing backtrace`,再 `SELECT … FROM python.backtrace`。 + +--- + +### `python.variables` + +启用变量追踪时的变量快照。 + +| 列 | 说明 | +|----|------| +| `step` | 训练步 | +| `func` | 函数名 | +| `name` | 变量名 | +| `value` | 字符串表示 | + +--- + +## 系统指标 + +### `cpu.utilization` + +主机 CPU 与 RSS 采样。 + +| 列 | 说明 | +|----|------| +| `ts` | 采样时间(微秒) | +| `scope` | `process` \| `thread` | +| `rss_kb` | 常驻内存(KB),仅 process | +| `cpu_total_pct` | CPU 利用率(%) | +| `comm` | 线程/进程名 | +| `wchan` | 内核等待通道(Linux) | + +--- + +### `gpu.utilization` + +GPU 显存与利用率采样。 + +| 列 | 说明 | +|----|------| +| `ts` | 采样时间 | +| `used_bytes` | 已用显存 | +| `total_bytes` | 总显存 | +| `mem_used_pct` | 显存使用率(%) | +| `gpu_util_pct` | GPU 算力利用率(不可用为 -1) | + +--- + +### `process.kmsg` + +Linux 内核环缓冲(dmesg)。**仅 Linux。** + +| 列 | 说明 | +|----|------| +| `timestamp` | 事件时间 | +| `level` | 日志级别 | +| `message` | 内核消息 | + +--- + +## 集群 + +### `cluster.nodes` + +已注册的分布式训练节点。 + +| 列 | 说明 | +|----|------| +| `host` | 主机名 | +| `addr` | probing HTTP 地址 | +| `rank` | 全局 rank | +| `world_size` | world size | +| `local_rank` | 节点内 local rank | +| `role` | 并行角色 key(联邦 `_role` 来源) | +| `role_name` | Torchrun role 名(与 `role` 不同) | +| `status` | 节点状态 | +| `timestamp` | 最近更新时间(微秒) | + +```bash +probing -t cluster nodes +``` + +--- + +## NCCL profiler(可选) + +见 [NCCL Profiler](../design/nccl-profiler.zh.md)。 + +### `nccl.proxy_ops` + +Proxy-op 等待分解(culprit / victim)。 + +| 列 | 说明 | +|----|------| +| `send_gpu_wait_ns` | **Culprit** — 本地 GPU 未就绪 | +| `recv_wait_ns` | **Victim** — 等待对端数据 | +| `send_wait_ns` | 发送侧网络等待 | +| `recv_flush_wait_ns` | Recv flush 等待 | +| … | 另有 `rank`、`coll_func`、`seq`、`trans_bytes` 等 | + +**Global:** `global.nccl.proxy_ops` +**联邦列:** `_host`、`_addr`、`_rank`、`_role` + +### `nccl.net_qp` + +NetPlugin IB QP 完成耗时(可选)。 + +**Global:** `global.nccl.net_qp` + +--- + +## 元数据 + +### `information_schema.df_settings` + +运行时配置(`probing.*`)。 + +| 列 | 说明 | +|----|------| +| `name` | 配置键 | +| `value` | 配置值 | + +--- + +## 自定义表 + +插件通过 `@table` dataclass 注册 `python.`,schema 由作者定义。见 +[扩展机制](../design/extensibility.zh.md)。 + +--- + +## 相关文档 + +- [核心概念](../guide/concepts.zh.md) +- [SQL 分析](../guide/sql-analytics.zh.md) +- [API 参考](../api-reference.zh.md) diff --git a/docs/src/versions.md b/docs/src/versions.md index 7dbef487..331beca7 100644 --- a/docs/src/versions.md +++ b/docs/src/versions.md @@ -1,115 +1,66 @@ # Version Compatibility -This page documents Probing version compatibility and changelog. +This page documents Probing version compatibility. The version number below matches the +current release in this repository (`Cargo.toml` / `pyproject.toml`). ## Current Version -**Probing v0.6.x** (Latest) +**Probing v0.2.5** (latest in this repo) -## System Requirements - -### Python Version - -| Probing Version | Python Support | -|-----------------|----------------| -| 0.6.x | Python 3.9 - 3.12 | -| 0.5.x | Python 3.8 - 3.11 | - -### PyTorch Version - -| Probing Version | PyTorch Support | -|-----------------|-----------------| -| 0.6.x | PyTorch 2.0+ | -| 0.5.x | PyTorch 1.13+ | - -### Operating Systems - -- **Linux**: Full support (recommended for production) -- **macOS**: Full support (Intel and Apple Silicon) -- **Windows**: Experimental (WSL2 recommended) - -## Changelog - -### v0.6.0 - -**New Features** - -- SQL query engine based on DataFusion -- Mermaid diagram support in documentation -- Improved distributed debugging support -- New `torch_trace` table for PyTorch profiling +Check your install: -**Breaking Changes** +```bash +pip show probing +# or: python -c "import probing; print(probing.VERSION)" +``` -- Deprecated `probing.trace()` API; use `PROBING_TORCH_PROFILING=on` or `configure()` from `probing.profiling.torch_probe` -- Configuration format changed from JSON to TOML +## System Requirements -**Bug Fixes** +### Python -- Fixed memory leak in long-running sessions -- Improved error messages for invalid SQL queries +| Probing | Python | +|---------|--------| +| 0.2.x | 3.7 – 3.12 (see `pyproject.toml` classifiers) | -### v0.5.0 +### PyTorch -**New Features** +Torch profiling (`python.torch_trace`, `python.comm_collective`) requires PyTorch when used; +no strict minimum is pinned in the package—use PyTorch 2.x for distributed training workflows. -- Initial PyTorch profiling support -- Memory analysis capabilities -- Basic SQL query support +### Operating Systems -**Bug Fixes** +| OS | Support | +|----|---------| +| **Linux** | Full support; `probing inject` (dynamic attach) is **Linux only** | +| **macOS** | Query / eval / in-process `PROBING=1`; inject not available | +| **Windows** | Experimental; WSL2 recommended for inject | -- Various stability improvements +## Recent capabilities (0.2.x) -## Upgrade Guide +Documented features in this tree include: -### From v0.5.x to v0.6.x +- DataFusion SQL engine and `global.*` federated catalog +- `python.torch_trace`, `python.comm_collective`, `python.trace_event` +- Parallel **role** key on data rows + federation tag **`_role`** +- Runtime `probing.set_role()` / `current_role()` / `clear_role()` +- Diagnostic **skills** (`probing skill run …`, Web Agent) +- Optional NCCL profiler plugin (`nccl.proxy_ops`) -1. Update Python to 3.9+ if needed -2. Update PyTorch to 2.0+ if needed -3. Update Probing: +## Upgrade ```bash pip install --upgrade probing ``` -4. Update configuration files (if using custom config): - -```python -# Old format (v0.5.x) -probing.trace(enabled=True) +If you use torch profiling, prefer: -# New format (v0.6.x) +```bash PROBING_TORCH_PROFILING=on python train.py -# or: from probing.profiling.torch_probe import configure; configure("on") ``` -## Deprecation Policy - -- Major version changes may include breaking changes -- Minor version changes maintain backward compatibility -- Deprecated features show warnings for at least one minor version before removal - -## Feature Support Matrix - -| Feature | v0.5.x | v0.6.x | -|---------|--------|--------| -| Basic Profiling | ✅ | ✅ | -| SQL Queries | Partial | ✅ | -| PyTorch Tracing | Basic | Full | -| Memory Analysis | Basic | Full | -| Distributed Support | ❌ | ✅ | -| Custom Tables | ❌ | ✅ | -| Web UI | ❌ | Beta | +or `configure("on")` from `probing.profiling.torch_probe`. ## Reporting Issues -For bugs and feature requests, please use the [GitHub Issue Tracker](https://github.com/DeepLink-org/probing/issues). - -When reporting issues, please include: - -- Probing version (`pip show probing`) -- Python version (`python --version`) -- PyTorch version (if applicable) -- Operating system -- Minimal reproduction example +[GitHub Issues](https://github.com/DeepLink-org/probing/issues) — include `pip show probing`, +Python version, OS, and a minimal repro. diff --git a/docs/src/versions.zh.md b/docs/src/versions.zh.md index 28db4b48..aa194901 100644 --- a/docs/src/versions.zh.md +++ b/docs/src/versions.zh.md @@ -1,115 +1,53 @@ # 版本兼容性 -本页记录 Probing 的版本兼容性和更新日志。 +本页记录 Probing 版本与系统要求。下列版本号与当前仓库发布一致(`Cargo.toml` / `pyproject.toml`)。 ## 当前版本 -**Probing v0.6.x** (最新) +**Probing v0.2.5**(本仓库最新) + +```bash +pip show probing +# 或: python -c "import probing; print(probing.VERSION)" +``` ## 系统要求 -### Python 版本 +### Python -| Probing 版本 | Python 支持 | -|--------------|-------------| -| 0.6.x | Python 3.9 - 3.12 | -| 0.5.x | Python 3.8 - 3.11 | +| Probing | Python | +|---------|--------| +| 0.2.x | 3.7 – 3.12(见 `pyproject.toml`) | -### PyTorch 版本 +### PyTorch -| Probing 版本 | PyTorch 支持 | -|--------------|--------------| -| 0.6.x | PyTorch 2.0+ | -| 0.5.x | PyTorch 1.13+ | +使用 `python.torch_trace`、`python.comm_collective` 等能力时需要 PyTorch;包内未钉死最低版本,分布式训练建议使用 PyTorch 2.x。 ### 操作系统 -- **Linux**: 完全支持(生产环境推荐) -- **macOS**: 完全支持(Intel 和 Apple Silicon) -- **Windows**: 实验性支持(推荐使用 WSL2) - -## 更新日志 - -### v0.6.0 - -**新功能** - -- 基于 DataFusion 的 SQL 查询引擎 -- 文档支持 Mermaid 图表 -- 改进的分布式调试支持 -- 新增 `torch_trace` 表用于 PyTorch 性能分析 - -**破坏性变更** - -- 废弃 `probing.trace()` API;请使用 `PROBING_TORCH_PROFILING=on` 或 `probing.profiling.torch_probe.configure()` -- 配置格式从 JSON 改为 TOML - -**Bug 修复** - -- 修复长时间运行会话中的内存泄漏 -- 改进无效 SQL 查询的错误消息 - -### v0.5.0 - -**新功能** +| 系统 | 支持 | +|------|------| +| **Linux** | 完整支持;`probing inject` **仅 Linux** | +| **macOS** | query / eval / 进程内 `PROBING=1`;无 inject | +| **Windows** | 实验性;inject 建议 WSL2 | -- 初始 PyTorch 性能分析支持 -- 内存分析能力 -- 基础 SQL 查询支持 +## 0.2.x 主要能力 -**Bug 修复** +- DataFusion SQL 与 `global.*` 联邦 catalog +- `python.torch_trace`、`python.comm_collective`、`python.trace_event` +- 数据行 **role** + 联邦标签 **`_role`** +- `probing.set_role()` / `current_role()` / `clear_role()` +- 诊断 **skill**(`probing skill run …`、Web Agent) +- 可选 NCCL profiler 插件(`nccl.proxy_ops`) -- 各种稳定性改进 - -## 升级指南 - -### 从 v0.5.x 升级到 v0.6.x - -1. 如需要,升级 Python 到 3.9+ -2. 如需要,升级 PyTorch 到 2.0+ -3. 更新 Probing: +## 升级 ```bash pip install --upgrade probing ``` -4. 更新配置文件(如果使用自定义配置): - -```python -# 旧格式 (v0.5.x) -probing.trace(enabled=True) - -# 新格式 (v0.6.x) -PROBING_TORCH_PROFILING=on python train.py -# 或:from probing.profiling.torch_probe import configure; configure("on") -``` - -## 废弃策略 - -- 主版本变更可能包含破坏性变更 -- 次版本变更保持向后兼容性 -- 废弃功能在移除前至少显示一个次版本的警告 - -## 功能支持矩阵 - -| 功能 | v0.5.x | v0.6.x | -|------|--------|--------| -| 基础性能分析 | ✅ | ✅ | -| SQL 查询 | 部分 | ✅ | -| PyTorch 跟踪 | 基础 | 完整 | -| 内存分析 | 基础 | 完整 | -| 分布式支持 | ❌ | ✅ | -| 自定义表 | ❌ | ✅ | -| Web UI | ❌ | Beta | - -## 报告问题 - -如需报告 Bug 或功能请求,请使用 [GitHub Issue Tracker](https://github.com/DeepLink-org/probing/issues)。 +Torch profiling 请使用 `PROBING_TORCH_PROFILING=on` 或 `configure("on")`(`probing.profiling.torch_probe`)。 -报告问题时,请包含: +## 反馈问题 -- Probing 版本 (`pip show probing`) -- Python 版本 (`python --version`) -- PyTorch 版本(如适用) -- 操作系统 -- 最小复现示例 +[GitHub Issues](https://github.com/DeepLink-org/probing/issues) — 请附上版本、Python、操作系统与最小复现。 diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..90bb716e --- /dev/null +++ b/examples/README.md @@ -0,0 +1,37 @@ +# Examples + +Runnable scripts under `examples/`. They are **not** installed with `pip install probing` or `make develop`. + +## Dependencies + +| Script | Extra packages | Notes | +|--------|----------------|-------| +| `events.py`, `hooks.py`, `test_probing.py` | none (beyond probing) | Good smoke tests | +| `imagenet.py`, `imagenet_with_span.py` | `torch`, `torchvision` | Needs ImageNet data path | +| `ray_tracing_example.py` | `ray` | Optional Ray integration | +| `bench_profiler.py` | varies | See script header | + +Install ML stack into your dev venv: + +```bash +source .venv/bin/activate +uv pip install torch torchvision +# or: pip install torch torchvision +``` + +## Running with probing + +Use the project venv after `make develop` (see [Contributing](../docs/src/contributing.md)): + +```bash +source .venv/bin/activate +PROBING=1 python examples/events.py +PROBING=1 python examples/test_probing.py --depth 2 +``` + +On Linux you can also attach with `probing -t inject` instead of `PROBING=1` at startup. + +## More documentation + +- [Examples (MkDocs)](../docs/src/examples/index.md) +- [Quick Start](../docs/src/quickstart.md) diff --git a/playbooks/README.md b/playbooks/README.md deleted file mode 100644 index 80b8fbe7..00000000 --- a/playbooks/README.md +++ /dev/null @@ -1,185 +0,0 @@ -# Probing Playbooks - -结构化诊断剧本(Playbook),供 **CLI**、**Python 工具链** 和 **Web Investigation Agent** 共用同一套 YAML。 - -## 目录结构 - -``` -playbooks/ -├── catalog.yaml # 索引:分类、优先级、关联表/页面 -├── semantic/ -│ ├── intents.yaml # 用户说法 → playbook id(关键词路由) -│ ├── pages.yaml # Web 页面 → 建议 playbook -│ └── tables.yaml # 表/列语义,供 LLM grounding -└── diagnostics/ - ├── health_overview.yaml # 7 个诊断 playbook 本体 - ├── training_hang.yaml - └── ... -``` - -## 路由链路 - -用户输入或当前页面,按以下顺序收敛到具体 playbook: - -```mermaid -flowchart LR - A[用户输入 / 当前页面] --> B[intents.yaml] - A --> C[pages.yaml] - B --> D[catalog.yaml] - C --> D - D --> E[diagnostics/*.yaml] - E --> F[步骤执行 sql / api / ui] - F --> G[summary + next_steps] -``` - -| 层 | 文件 | 作用 | -|----|------|------| -| 意图 | `semantic/intents.yaml` | 中英文关键词 → 一个或多个 playbook id | -| 页面 | `semantic/pages.yaml` | 路由 id → 标题、描述、建议 playbook | -| 索引 | `catalog.yaml` | 优先级排序、分类、关联表、相关 playbook | -| 本体 | `diagnostics/*.yaml` | 参数、步骤、解读规则、总结模板 | - -**Web Agent 路由(无 LLM 时)** - -1. 显式指令:`/slow_rank`、`run slow_rank` -2. 关键词:`match_playbooks()` = intent 打分 + playbook `metadata.triggers.keywords` -3. 当前页面:`pages.yaml` 中的 `suggested_playbooks` 作为上下文提示 - -**有 LLM 时**:system prompt 注入 catalog + intents + 当前页面 snapshot,模型返回 JSON 选定 `playbook_id` 与参数。 - -## Playbook 格式(`apiVersion: probing.dev/v1`) - -每个诊断文件包含两个顶层段: - -| 段 | 内容 | -|----|------| -| `metadata` | id、标题、分类、tags、`triggers.keywords`、人类可读说明 | -| `spec` | 参数、前置条件、步骤、interpretation、summary、next_steps | - -### 步骤类型 - -| `type` | 执行方式 | 用途 | -|--------|----------|------| -| `sql` | `POST /query` | 只读分析(主要手段) | -| `api` | HTTP GET/POST | 栈、火焰图、overview | -| `config` | `SET probing.*` | 开启采样后再查 | -| `eval` | `/apis/pythonext/eval` | 最后手段;Agent 需确认 | -| `ui` | 仅 Web | 导航、打开面板、设置调查上下文 | - -### 参数与变量 - -步骤 SQL 使用 `{param}` 占位符,由 `spec.parameters` 默认值和运行时覆盖展开。 - -Runner 内置变量: - -| 变量 | 含义 | -|------|------| -| `{pid}` | 目标进程 id | -| `{global_prefix}` | 集群 fan-out 时为 `global.`,否则空 | -| `{comm_table}` / `{table_comm}` | 单进程或 global collective 表 | -| `{step_recent}` | 最近 step 窗口子查询 | - -### SQL 安全 - -- `sql` 步骤仅允许 `SELECT` / `WITH` / `SHOW` / `DESCRIBE` -- 无聚合时自动补 `LIMIT` -- Agent 模式下改采样的 `config` 步骤需 UI 确认 - -### Interpretation 规则 - -`spec.interpretation.rules` 提供**确定性**结论(与 LLM 叙述并行): - -```yaml -interpretation: - rules: - - id: straggler_ratio - when: "step:rank_latency | column:avg_ms | max/min(ratio) > 1.5" - severity: warning - message: "最慢 rank 的平均 collective 延迟是中位数的 1.5 倍以上" -``` - -> Web Agent 与 CLI `probing doctor` 均执行 `interpretation.rules`(Rust + Python `interpret.py`)。 - -## 现有 Playbook 一览 - -| id | 分类 | 典型场景 | -|----|------|----------| -| `health_overview` | 分诊 | 不知道从哪查,一键健康检查 | -| `training_hang` | 可靠性 | 训练卡住、loss 不动 | -| `slow_rank` | 分布式 | straggler、某 rank 拖后腿 | -| `memory_leak` | 内存 | 显存阶梯上涨、OOM 前兆 | -| `module_bottleneck` | 性能 | 某 PyTorch 模块过慢 | -| `comm_bottleneck` | 分布式 | NCCL / collective 瓶颈 | -| `gpu_pressure` | 内存 | GPU 利用率与显存余量 | - -完整元数据见 `catalog.yaml`;用户说法映射见 `semantic/intents.yaml`。 - -## 新增 Playbook - -1. 新建 `diagnostics/my_playbook.yaml` -2. 在 `catalog.yaml` 的 `playbooks` 中注册(含 `priority`、`pages`、`tables`) -3. 如有新数据源,更新 `semantic/tables.yaml` 同义词 -4. 如有常见用户说法,在 `semantic/intents.yaml` 增加 intent -5. 如在特定页面常用,更新 `semantic/pages.yaml` -6. Web:在 `web/src/agent/playbook.rs` 通过 `include_dir!` 自动嵌入 `playbooks/diagnostics/`(无需手写列表) -7. 校验:`python -m probing.playbooks validate` - -## 消费者集成 - -### Python - -```python -from probing.playbooks.loader import ( - load_catalog, load_playbook, match_playbooks, - load_intents, load_pages, validate_all, -) -``` - -- `load_catalog()` — 按 priority 排序的索引 -- `match_playbooks(query)` — intent + 关键词打分 -- `validate_all()` — 占位符与 SQL 只读检查 - -### Web Agent - -| 模块 | 职责 | -|------|------| -| `web/src/agent/routing.rs` | 嵌入 catalog / intents / pages YAML | -| `web/src/agent/cluster.rs` | 集群节点探测、`cluster_query` fan-out | -| `web/src/agent/playbook.rs` | 嵌入 diagnostics YAML,加载与匹配 | -| `web/src/agent/runner.rs` | 执行 sql / api / ui 步骤(`global.*` → cluster fan-out) | -| `web/src/agent/page_tools.rs` | 按路由拉 live snapshot 注入 LLM | -| `web/src/agent/llm.rs` | `async-openai` 选 playbook + 总结 | - -**UI 入口** - -- 浮层:**⌘J / Ctrl+J** 或 Agent 按钮(不挤占主内容,约 ⅓ 屏宽) -- 全页:侧边栏 **Agent** → `/agent` -- LLM:⚙ 设置 API(默认 DeepSeek);未配置则纯关键词路由 - -**页面感知**:Agent 读取当前路由 + SQL/API snapshot(含 cluster 节点摘要),在 playbook 选择与总结中作为上下文;步骤结果以卡片展示(DataFrame、cluster fan-out 标注、跳转链接)。 - -**集群诊断**: - -- 检测到多节点时自动 `use_global=true`(单机则 false) -- SQL 含 `global.*` 或步骤 `cluster: true` 时走 `/apis/cluster/query` fan-out -- 步骤卡片显示 `cluster fan-out · N nodes queried` - -### CLI - -```bash -# List playbooks -probing -t doctor list - -# Run a playbook (sql + api steps; ui steps skipped) -probing -t doctor run health_overview -probing -t doctor run slow_rank --set step_window=30 --global -``` - -与 Web 共用 YAML;执行 `sql` / `api` / `config` 步骤(`ui` 仅在 Web 中运行)。`interpretation.rules` 在终端以 `[SEVERITY]` 行输出。 - -## 设计原则 - -1. **Playbook 优先于自由 SQL** — LLM 选剧本填参数,而非从零写查询 -2. **证据链** — 每步具名输出,写入 `summary_template` -3. **优雅降级** — `requires` + `on_empty: skip|warn|abort` -4. **同一 YAML,多消费者** — CLI/Python 跑 sql/api/config;Web 额外跑 `ui` diff --git a/playbooks/catalog.yaml b/playbooks/catalog.yaml deleted file mode 100644 index d797571d..00000000 --- a/playbooks/catalog.yaml +++ /dev/null @@ -1,85 +0,0 @@ -# Playbook catalog — single index for CLI, Python loader, and Web Agent. -apiVersion: probing.dev/v1 -kind: Catalog - -categories: - triage: - label: "分诊 / Triage" - description: "First look when unsure where to start." - reliability: - label: "可靠性 / Reliability" - description: "Stalls, hangs, deadlocks." - distributed: - label: "分布式 / Distributed" - description: "Ranks, collectives, stragglers." - performance: - label: "性能 / Performance" - description: "Module hotspots and step regressions." - memory: - label: "内存 / Memory" - description: "GPU/VRAM pressure and leaks." - -playbooks: - - id: health_overview - file: diagnostics/health_overview.yaml - category: triage - priority: 0 - entry: true - description: "One-shot health check: CPU, GPU, tables, recent training activity" - tables: [cpu.utilization, gpu.utilization, python.torch_trace, cluster.nodes] - pages: [dashboard, agent, analytics] - related: [module_bottleneck, training_hang, memory_leak] - - - id: training_hang - file: diagnostics/training_hang.yaml - category: reliability - priority: 1 - description: "Training stalled — capture stacks and thread/blocking hints" - tables: [python.backtrace, cpu.utilization, python.trace_event, python.comm_collective] - pages: [stacks, spans] - related: [slow_rank, module_bottleneck] - - - id: slow_rank - file: diagnostics/slow_rank.yaml - category: distributed - priority: 2 - description: "Find straggler ranks via collective latency imbalance" - tables: [python.comm_collective, global.python.comm_collective] - pages: [training, cluster, analytics] - related: [comm_bottleneck, gpu_pressure, training_hang] - - - id: memory_leak - file: diagnostics/memory_leak.yaml - category: memory - priority: 3 - description: "Detect monotonic GPU memory growth across training steps" - tables: [python.torch_trace, gpu.utilization] - pages: [profiling/torch] - related: [gpu_pressure, module_bottleneck] - - - id: module_bottleneck - file: diagnostics/module_bottleneck.yaml - category: performance - priority: 4 - description: "Find slowest PyTorch modules in recent steps" - tables: [python.torch_trace] - pages: [profiling/torch, training] - related: [slow_rank, comm_bottleneck, memory_leak] - - - id: comm_bottleneck - file: diagnostics/comm_bottleneck.yaml - category: distributed - priority: 5 - description: "Rank collective ops by total and p99 latency" - tables: [python.comm_collective, rdma.mlx_hca] - pages: [training, cluster, analytics, spans] - related: [slow_rank, module_bottleneck] - - - id: gpu_pressure - file: diagnostics/gpu_pressure.yaml - category: memory - priority: 6 - description: "GPU memory and utilization headroom" - tables: [gpu.utilization, gpu.devices, python.torch_trace] - pages: [dashboard] - related: [memory_leak, slow_rank] diff --git a/probing/cli/Cargo.toml b/probing/cli/Cargo.toml index 007faa87..1a54a06c 100644 --- a/probing/cli/Cargo.toml +++ b/probing/cli/Cargo.toml @@ -6,6 +6,7 @@ edition.workspace = true license.workspace = true build = "build.rs" + [lib] name = "probing_cli" path = "src/lib.rs" diff --git a/probing/cli/src/cli/commands.rs b/probing/cli/src/cli/commands.rs index 95be12aa..abba0217 100644 --- a/probing/cli/src/cli/commands.rs +++ b/probing/cli/src/cli/commands.rs @@ -241,7 +241,7 @@ pub enum Commands { #[command(hide = true)] Bench(super::bench::BenchCommand), - /// Run structured diagnostic playbooks (shared YAML with Web Agent) + /// Run structured diagnostic skills (shared with Web Agent) #[command(subcommand, visible_aliases = ["doc", "dr"])] - Doctor(super::doctor::DoctorCommand), + Skill(super::skill::SkillCommand), } diff --git a/probing/cli/src/cli/ctrl.rs b/probing/cli/src/cli/ctrl.rs index 076b93bc..dabb1b86 100644 --- a/probing/cli/src/cli/ctrl.rs +++ b/probing/cli/src/cli/ctrl.rs @@ -150,17 +150,24 @@ impl ProbeEndpoint { QueryDataFormat::Error(err) => Err(anyhow::anyhow!("error: {}", err)), QueryDataFormat::Nil => Ok(Default::default()), QueryDataFormat::DataFrame(df) => Ok(df), - QueryDataFormat::TimeSeries(_) => todo!(), + QueryDataFormat::TimeSeries(_) => { + anyhow::bail!("TimeSeries query responses are not supported by the CLI") + } } } /// Fetch a flamegraph (`torch` or `pprof`) and return its raw bytes (HTML or JSON). pub async fn flamegraph(&self, kind: &str, json: bool) -> Result> { - let mut url = format!("/apis/flamegraph/{kind}"); - if json { - url.push_str("?format=json"); - } - request(self.clone(), &url, None).await + let url = match (kind, json) { + ("torch", true) => "/apis/torchextension/flamegraph/json", + ("torch", false) => "/apis/torchextension/flamegraph", + ("pprof", true) => "/apis/pprofextension/flamegraph/json", + ("pprof", false) => "/apis/pprofextension/flamegraph", + (other, _) => { + anyhow::bail!("unknown flamegraph kind: {other} (expected torch or pprof)") + } + }; + request(self.clone(), url, None).await } pub async fn get(&self, url: &str) -> Result { @@ -214,7 +221,11 @@ pub async fn request(ctrl: ProbeEndpoint, url: &str, body: Option) -> Re }); sender } - _ => todo!(), + ProbeEndpoint::Launch { .. } => { + anyhow::bail!( + "launch endpoint does not support HTTP requests; use `probing launch` instead" + ) + } }; let request = if let Some(body) = body { Request::builder() diff --git a/probing/cli/src/cli/doctor/mod.rs b/probing/cli/src/cli/doctor/mod.rs deleted file mode 100644 index 2c756c56..00000000 --- a/probing/cli/src/cli/doctor/mod.rs +++ /dev/null @@ -1,73 +0,0 @@ -//! Structured diagnostic playbooks (``probing doctor``). - -mod interpret; -mod loader; -mod runner; - -pub use runner::{list_playbooks as list_playbooks_sync, run_doctor}; - -use std::collections::HashMap; - -use anyhow::Result; -use clap::Subcommand; - -use crate::cli::ctrl::ProbeEndpoint; -use crate::table::OutputFormat; - -#[derive(Subcommand, Debug, Clone)] -pub enum DoctorCommand { - /// List available diagnostic playbooks - List, - /// Run a diagnostic playbook against the target process - Run { - /// Playbook id (e.g. health_overview, slow_rank) - playbook_id: String, - - /// Parameter override as key=value (repeatable) - #[arg(short = 'p', long = "set", value_name = "KEY=VALUE")] - params: Vec, - - /// Force global.* cluster fan-out (overrides auto-detection) - #[arg(long)] - global: bool, - - /// Do not fan out global.* queries even when cluster peers exist - #[arg(long)] - local: bool, - - #[arg(short, long, value_enum, default_value_t = OutputFormat::Table)] - format: OutputFormat, - }, -} - -pub async fn run(ctrl: ProbeEndpoint, cmd: DoctorCommand) -> Result<()> { - match cmd { - DoctorCommand::List => list_playbooks_sync(), - DoctorCommand::Run { - playbook_id, - params, - global, - local, - format, - } => { - let mut overrides = parse_params(¶ms)?; - if global { - overrides.insert("use_global".to_string(), "true".to_string()); - } else if local { - overrides.insert("use_global".to_string(), "false".to_string()); - } - runner::run_doctor(ctrl, &playbook_id, overrides, format).await - } - } -} - -fn parse_params(params: &[String]) -> Result> { - let mut out = HashMap::new(); - for p in params { - let Some((k, v)) = p.split_once('=') else { - anyhow::bail!("invalid --set {p:?}, expected key=value"); - }; - out.insert(k.to_string(), v.to_string()); - } - Ok(out) -} diff --git a/probing/cli/src/cli/mod.rs b/probing/cli/src/cli/mod.rs index ee72e993..77d91a47 100644 --- a/probing/cli/src/cli/mod.rs +++ b/probing/cli/src/cli/mod.rs @@ -6,8 +6,8 @@ pub mod bench; pub mod cluster; pub mod commands; pub mod ctrl; -pub mod doctor; pub mod repl; +pub mod skill; pub mod store; @@ -82,8 +82,15 @@ impl Cli { Some(Commands::Bench(cmd)) => { return cmd.run(); } - Some(Commands::Doctor(doctor::DoctorCommand::List)) => { - return doctor::list_playbooks_sync(); + Some(Commands::Skill(skill::SkillCommand::List)) => { + return skill::list_skills_sync(); + } + Some(Commands::Skill( + skill_cmd @ (skill::SkillCommand::Install { .. } + | skill::SkillCommand::Update { .. }), + )) => { + let ctrl: ProbeEndpoint = "0".try_into()?; + return skill::run(ctrl, skill_cmd.clone()).await; } _ => {} } @@ -276,7 +283,7 @@ impl Cli { .await } Commands::Cluster(cmd) => cluster::run(ctrl, cmd.clone()).await, - Commands::Doctor(cmd) => doctor::run(ctrl, cmd.clone()).await, + Commands::Skill(cmd) => skill::run(ctrl, cmd.clone()).await, Commands::Repl => repl::start_repl(ctrl).await, // These commands are handled in run() method and don't need a target Commands::Launch { .. } diff --git a/probing/cli/src/cli/doctor/interpret.rs b/probing/cli/src/cli/skill/interpret.rs similarity index 99% rename from probing/cli/src/cli/doctor/interpret.rs rename to probing/cli/src/cli/skill/interpret.rs index 5c10aff3..6e4cf622 100644 --- a/probing/cli/src/cli/doctor/interpret.rs +++ b/probing/cli/src/cli/skill/interpret.rs @@ -1,4 +1,4 @@ -//! Deterministic evaluation of playbook ``interpretation.rules``. +//! Deterministic evaluation of skill ``interpretation.rules``. use std::collections::HashMap; diff --git a/probing/cli/src/cli/doctor/loader.rs b/probing/cli/src/cli/skill/loader.rs similarity index 50% rename from probing/cli/src/cli/doctor/loader.rs rename to probing/cli/src/cli/skill/loader.rs index eae68ac8..c240345d 100644 --- a/probing/cli/src/cli/doctor/loader.rs +++ b/probing/cli/src/cli/skill/loader.rs @@ -1,34 +1,41 @@ -//! Load diagnostic playbooks embedded at compile time from ``playbooks/``. +//! Load diagnostic skills embedded at compile time from repo ``skills/``, +//! merged with user/project skill directories at runtime. use std::collections::HashMap; +use std::env; +use std::fs; +use std::path::{Path, PathBuf}; -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, Context, Result}; use include_dir::{include_dir, Dir}; use serde::Deserialize; -static DIAGNOSTICS: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/../../playbooks/diagnostics"); -const CATALOG_YAML: &str = include_str!("../../../../../playbooks/catalog.yaml"); +static SKILLS: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/../../skills"); +const CATALOG_YAML: &str = include_str!("../../../../../skills/catalog.yaml"); #[derive(Debug, Clone, Deserialize)] struct CatalogFile { #[serde(default)] - playbooks: Vec, + skills: Vec, } #[derive(Debug, Clone, Deserialize)] pub(crate) struct CatalogEntry { pub id: String, - pub file: String, + #[serde(default)] + path: String, + #[serde(default)] + file: String, } #[derive(Debug, Clone, Deserialize)] -struct PlaybookFile { - metadata: PlaybookMeta, - spec: PlaybookSpec, +struct SkillFile { + metadata: SkillMeta, + spec: SkillSpec, } #[derive(Debug, Clone, Deserialize)] -struct PlaybookMeta { +struct SkillMeta { id: String, title: String, #[serde(default)] @@ -38,11 +45,11 @@ struct PlaybookMeta { } #[derive(Debug, Clone, Deserialize)] -struct PlaybookSpec { +struct SkillSpec { #[serde(default)] - parameters: Vec, + parameters: Vec, #[serde(default)] - steps: Vec, + steps: Vec, #[serde(default)] interpretation: InterpretationSpec, #[serde(default)] @@ -52,14 +59,14 @@ struct PlaybookSpec { } #[derive(Debug, Clone, Deserialize)] -pub struct PlaybookParameter { +pub struct SkillParameter { pub name: String, #[serde(default)] pub default: serde_yaml::Value, } #[derive(Debug, Clone, Deserialize)] -struct PlaybookStepRaw { +struct SkillStepRaw { id: String, title: String, #[serde(rename = "type", default = "default_step_type")] @@ -110,7 +117,7 @@ fn default_on_empty() -> String { } #[derive(Debug, Clone)] -pub struct PlaybookStep { +pub struct SkillStep { pub id: String, pub title: String, pub step_type: String, @@ -124,44 +131,152 @@ pub struct PlaybookStep { } #[derive(Debug, Clone)] -pub struct Playbook { +pub struct Skill { pub id: String, pub title: String, pub category: String, pub docs: String, - pub parameters: Vec, - pub steps: Vec, + pub parameters: Vec, + pub steps: Vec, pub interpretation: Vec, pub summary_template: String, pub next_steps: Vec, } -pub fn catalog_entries() -> Vec { - serde_yaml::from_str::(CATALOG_YAML) - .map(|c| c.playbooks) - .unwrap_or_default() +fn catalog_entries() -> Vec { + let mut merged: HashMap = HashMap::new(); + for entry in embedded_catalog_entries() { + merged.insert(entry.id.clone(), entry); + } + for root in fs_skill_roots() { + if let Ok(entries) = load_fs_catalog(&root) { + for entry in entries { + merged.insert(entry.id.clone(), entry); + } + } + } + let mut out: Vec = merged.into_values().collect(); + out.sort_by(|a, b| a.id.cmp(&b.id)); + out +} + +fn embedded_catalog_entries() -> Vec { + let file: CatalogFile = + serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { skills: vec![] }); + file.skills +} + +fn home_skills_dir() -> Option { + env::var_os("HOME").map(|home| PathBuf::from(home).join(".probing/skills")) +} + +fn project_skills_dir() -> Option { + let cwd = env::current_dir().ok()?; + for ancestor in cwd.ancestors() { + let candidate = ancestor.join(".probing/skills"); + if candidate.is_dir() { + return Some(candidate); + } + } + None +} + +fn env_skills_dir() -> Option { + env::var("PROBING_SKILLS_DIR") + .ok() + .map(PathBuf::from) + .filter(|p| p.is_dir()) +} + +fn fs_skill_roots() -> Vec { + let mut roots = Vec::new(); + if let Some(dir) = home_skills_dir() { + if dir.is_dir() { + roots.push(dir); + } + } + if let Some(dir) = project_skills_dir() { + if !roots.iter().any(|r| r == &dir) { + roots.push(dir); + } + } + if let Some(dir) = env_skills_dir() { + if !roots.iter().any(|r| r == &dir) { + roots.push(dir); + } + } + roots +} + +fn load_fs_catalog(root: &Path) -> Result> { + let catalog_path = root.join("catalog.yaml"); + if !catalog_path.is_file() { + return Ok(vec![]); + } + let text = fs::read_to_string(&catalog_path) + .with_context(|| format!("read {}", catalog_path.display()))?; + let file: CatalogFile = serde_yaml::from_str(&text)?; + Ok(file.skills) +} + +fn fs_steps_path(root: &Path, id: &str) -> Option { + if let Ok(entries) = load_fs_catalog(root) { + if let Some(entry) = entries.iter().find(|e| e.id == id) { + let rel = entry_path(entry); + let path = root.join(&rel); + if path.is_file() { + return Some(path); + } + } + } + let direct = root.join(id).join("steps.yaml"); + if direct.is_file() { + return Some(direct); + } + None } -pub fn list_playbook_ids() -> Vec { +fn load_fs_steps_yaml(id: &str) -> Option { + for root in fs_skill_roots().into_iter().rev() { + if let Some(path) = fs_steps_path(&root, id) { + if let Ok(text) = fs::read_to_string(path) { + return Some(text); + } + } + } + None +} + +fn entry_path(entry: &CatalogEntry) -> String { + if !entry.path.is_empty() { + entry.path.clone() + } else { + entry.file.clone() + } +} + +pub fn list_skill_ids() -> Vec { catalog_entries().into_iter().map(|e| e.id).collect() } -fn diagnostics_yaml(id: &str) -> Option<&'static str> { - let entry = catalog_entries().into_iter().find(|e| e.id == id)?; - let file_name = entry.file.rsplit('/').next().unwrap_or(&entry.file); - DIAGNOSTICS - .get_file(file_name) - .and_then(|f| f.contents_utf8()) +fn embedded_steps_yaml(id: &str) -> Option<&'static str> { + let entry = embedded_catalog_entries() + .into_iter() + .find(|e| e.id == id)?; + let rel = entry_path(&entry); + SKILLS.get_file(&rel).and_then(|f| f.contents_utf8()) } -pub fn load_playbook(id: &str) -> Result { - let yaml = diagnostics_yaml(id).ok_or_else(|| anyhow!("Unknown playbook: {id}"))?; - let file: PlaybookFile = serde_yaml::from_str(yaml)?; +pub fn load_skill(id: &str) -> Result { + let yaml = load_fs_steps_yaml(id) + .or_else(|| embedded_steps_yaml(id).map(|s| s.to_string())) + .ok_or_else(|| anyhow!("Unknown skill: {id}"))?; + let file: SkillFile = serde_yaml::from_str(&yaml)?; let steps = file .spec .steps .into_iter() - .map(|s| PlaybookStep { + .map(|s| SkillStep { id: s.id, title: s.title, step_type: s.step_type, @@ -174,7 +289,7 @@ pub fn load_playbook(id: &str) -> Result { cluster: s.cluster, }) .collect(); - Ok(Playbook { + Ok(Skill { id: file.metadata.id, title: file.metadata.title, category: file.metadata.category, @@ -187,7 +302,7 @@ pub fn load_playbook(id: &str) -> Result { }) } -pub fn default_parameters(pb: &Playbook) -> HashMap { +pub fn default_parameters(pb: &Skill) -> HashMap { let mut out = HashMap::new(); for p in &pb.parameters { let val = match &p.default { @@ -225,10 +340,7 @@ pub fn derive_variables(params: &HashMap) -> HashMap, -) -> HashMap { +pub fn build_context(pb: &Skill, overrides: &HashMap) -> HashMap { let mut ctx = default_parameters(pb); ctx.extend(derive_variables(&ctx)); for (k, v) in overrides { diff --git a/probing/cli/src/cli/skill/mod.rs b/probing/cli/src/cli/skill/mod.rs new file mode 100644 index 00000000..540ffe40 --- /dev/null +++ b/probing/cli/src/cli/skill/mod.rs @@ -0,0 +1,155 @@ +//! Structured diagnostic skills (``probing skill``). + +mod interpret; +mod loader; +mod runner; + +pub use runner::{list_skills as list_skills_sync, run_skill}; + +use std::collections::HashMap; + +use anyhow::Result; +use clap::Subcommand; + +use crate::cli::ctrl::ProbeEndpoint; +use crate::table::OutputFormat; + +#[derive(Subcommand, Debug, Clone)] +pub enum SkillCommand { + /// List available diagnostic skills + List, + /// Install skills into Cursor, Claude Code, and Codex skill directories + Install { + /// Re-sync from bundled source (same as ``update``) + #[arg(long)] + update: bool, + /// Install to user dirs (~/.cursor/skills, ~/.claude/skills, ~/.agents/skills) + #[arg(long)] + user: bool, + /// Comma-separated agents: cursor, claude, codex + #[arg(long, value_delimiter = ',')] + agent: Vec, + /// Install even when agent markers were not detected + #[arg(long)] + force: bool, + /// Skill source directory (default: bundled skills) + #[arg(long)] + from: Option, + }, + /// Update installed skills from bundled source + Update { + #[arg(long)] + user: bool, + #[arg(long, value_delimiter = ',')] + agent: Vec, + #[arg(long)] + force: bool, + #[arg(long)] + from: Option, + }, + /// Run a diagnostic skill against the target process + Run { + /// Skill id (e.g. health_overview, slow_rank) + skill_id: String, + + /// Parameter override as key=value (repeatable) + #[arg(short = 'p', long = "set", value_name = "KEY=VALUE")] + params: Vec, + + /// Force global.* cluster fan-out (overrides auto-detection) + #[arg(long)] + global: bool, + + /// Do not fan out global.* queries even when cluster peers exist + #[arg(long)] + local: bool, + + #[arg(short, long, value_enum, default_value_t = OutputFormat::Table)] + format: OutputFormat, + }, +} + +pub async fn run(ctrl: ProbeEndpoint, cmd: SkillCommand) -> Result<()> { + match cmd { + SkillCommand::List => list_skills_sync(), + SkillCommand::Install { + update, + user, + agent, + force, + from, + } => run_python_install("install", update, user, &agent, force, from.as_deref()), + SkillCommand::Update { + user, + agent, + force, + from, + } => run_python_install("update", true, user, &agent, force, from.as_deref()), + SkillCommand::Run { + skill_id, + params, + global, + local, + format, + } => { + let mut overrides = parse_params(¶ms)?; + if global { + overrides.insert("use_global".to_string(), "true".to_string()); + } else if local { + overrides.insert("use_global".to_string(), "false".to_string()); + } + runner::run_skill(ctrl, &skill_id, overrides, format).await + } + } +} + +fn parse_params(params: &[String]) -> Result> { + let mut out = HashMap::new(); + for p in params { + let Some((k, v)) = p.split_once('=') else { + anyhow::bail!("invalid --set {p:?}, expected key=value"); + }; + out.insert(k.to_string(), v.to_string()); + } + Ok(out) +} + +fn run_python_install( + action: &str, + update: bool, + user: bool, + agents: &[String], + force: bool, + from: Option<&std::path::Path>, +) -> Result<()> { + let python = std::env::var("PROBING_PYTHON").unwrap_or_else(|_| { + if cfg!(windows) { + "python".to_string() + } else { + "python3".to_string() + } + }); + let mut cmd = std::process::Command::new(python); + cmd.arg("-m").arg("probing.skills").arg(action); + if update { + cmd.arg("--update"); + } + if user { + cmd.arg("--user"); + } + if force { + cmd.arg("--force"); + } + if !agents.is_empty() { + cmd.arg("--agent").arg(agents.join(",")); + } + if let Some(path) = from { + cmd.arg("--from").arg(path); + } + let status = cmd.status()?; + if status.success() { + Ok(()) + } else { + anyhow::bail!("probing skill {action} failed (exit {status})"); + } +} diff --git a/probing/cli/src/cli/doctor/runner.rs b/probing/cli/src/cli/skill/runner.rs similarity index 92% rename from probing/cli/src/cli/doctor/runner.rs rename to probing/cli/src/cli/skill/runner.rs index 724414fa..bd05f422 100644 --- a/probing/cli/src/cli/doctor/runner.rs +++ b/probing/cli/src/cli/skill/runner.rs @@ -1,4 +1,4 @@ -//! Execute playbook steps against a probing endpoint (sql / api / config). +//! Execute skill steps against a probing endpoint (sql / api / config). use std::collections::HashMap; @@ -9,7 +9,7 @@ use crate::cli::ctrl::ProbeEndpoint; use crate::table::{render, OutputFormat}; use super::interpret::{evaluate_rules, InterpretFinding, StepEvidence}; -use super::loader::{build_context, expand_template, load_playbook, Playbook, PlaybookStep}; +use super::loader::{build_context, expand_template, load_skill, Skill, SkillStep}; #[derive(Debug, Clone)] #[allow(dead_code)] @@ -42,7 +42,7 @@ fn dataframe_rows(df: &DataFrame) -> usize { df.cols.iter().map(|c| c.len()).max().unwrap_or(0) } -fn should_skip_step(step: &PlaybookStep, ctx: &HashMap) -> Option { +fn should_skip_step(step: &SkillStep, ctx: &HashMap) -> Option { let Some(when) = &step.when else { return None; }; @@ -72,7 +72,7 @@ fn ensure_read_only_sql(sql: &str) -> Result<()> { { return Ok(()); } - Err(anyhow!("Only read-only SQL is allowed in playbooks")) + Err(anyhow!("Only read-only SQL is allowed in skills")) } async fn cluster_query(ctrl: &ProbeEndpoint, expr: &str) -> Result<(DataFrame, String)> { @@ -114,7 +114,7 @@ async fn fetch_cluster_peer_count(ctrl: &ProbeEndpoint) -> usize { async fn resolve_use_global( ctrl: &ProbeEndpoint, - pb: &Playbook, + pb: &Skill, overrides: &mut HashMap, ) { if overrides.contains_key("use_global") { @@ -134,7 +134,7 @@ async fn resolve_use_global( overrides.insert("use_global".to_string(), use_global.to_string()); } -async fn run_sql_step(ctrl: &ProbeEndpoint, step: &PlaybookStep, sql: &str) -> StepOutcome { +async fn run_sql_step(ctrl: &ProbeEndpoint, step: &SkillStep, sql: &str) -> StepOutcome { if let Err(e) = ensure_read_only_sql(sql) { return StepOutcome::Error { step_id: step.id.clone(), @@ -210,7 +210,7 @@ async fn run_sql_step(ctrl: &ProbeEndpoint, step: &PlaybookStep, sql: &str) -> S } } -async fn run_api_step(ctrl: &ProbeEndpoint, step: &PlaybookStep) -> StepOutcome { +async fn run_api_step(ctrl: &ProbeEndpoint, step: &SkillStep) -> StepOutcome { let path = step.path.clone().unwrap_or_default(); match ctrl.get(&path).await { Ok(body) => StepOutcome::ApiText { @@ -228,7 +228,7 @@ async fn run_api_step(ctrl: &ProbeEndpoint, step: &PlaybookStep) -> StepOutcome async fn run_step( ctrl: &ProbeEndpoint, - step: &PlaybookStep, + step: &SkillStep, ctx: &HashMap, ) -> StepOutcome { if let Some(reason) = should_skip_step(step, ctx) { @@ -262,7 +262,7 @@ async fn run_step( "config" => StepOutcome::Skipped { step_id: step.id.clone(), title: step.title.clone(), - reason: "config steps are not applied automatically in CLI doctor".to_string(), + reason: "config steps are not applied automatically in CLI skill".to_string(), }, other => StepOutcome::Skipped { step_id: step.id.clone(), @@ -335,23 +335,23 @@ fn print_findings(findings: &[InterpretFinding]) { } } -pub fn list_playbooks() -> Result<()> { - use super::loader::list_playbook_ids; - println!("Available diagnostic playbooks:\n"); - for id in list_playbook_ids() { - let pb = load_playbook(&id)?; +pub fn list_skills() -> Result<()> { + use super::loader::list_skill_ids; + println!("Available diagnostic skills:\n"); + for id in list_skill_ids() { + let pb = load_skill(&id)?; println!(" {:<22} {:<12} {}", id, pb.category, pb.title); } Ok(()) } -pub async fn run_doctor( +pub async fn run_skill( ctrl: ProbeEndpoint, - playbook_id: &str, + skill_id: &str, mut overrides: HashMap, format: OutputFormat, ) -> Result<()> { - let pb = load_playbook(playbook_id)?; + let pb = load_skill(skill_id)?; resolve_use_global(&ctrl, &pb, &mut overrides).await; let ctx = build_context(&pb, &overrides); @@ -407,7 +407,7 @@ pub async fn run_doctor( .iter() .any(|o| matches!(o, StepOutcome::Error { .. })); if had_error { - anyhow::bail!("playbook finished with errors"); + anyhow::bail!("skill finished with errors"); } Ok(()) } diff --git a/probing/cli/src/inject/injection_aarch64.rs b/probing/cli/src/inject/injection_aarch64.rs index df45f558..f6aabfb5 100644 --- a/probing/cli/src/inject/injection_aarch64.rs +++ b/probing/cli/src/inject/injection_aarch64.rs @@ -363,3 +363,37 @@ impl InjectionTrait for InjectionAarch64<'_> { self.remove() } } + +#[cfg(all(test, target_arch = "aarch64", target_os = "linux"))] +mod tests { + use super::SHELLCODE_AARCH64; + use pete::ptracer::Registers; + + #[test] + fn shellcode_layout() { + assert_eq!(SHELLCODE_AARCH64.len(), 16); + assert_eq!(SHELLCODE_AARCH64[0..4], [0x1f, 0x20, 0x03, 0xd5]); + assert_eq!(SHELLCODE_AARCH64[4..8], [0x1f, 0x20, 0x03, 0xd5]); + assert_eq!(SHELLCODE_AARCH64[8..12], [0x00, 0x01, 0x3f, 0xd6]); + assert_eq!(SHELLCODE_AARCH64[12..16], [0x00, 0x00, 0x20, 0xd4]); + } + + #[test] + fn register_handling() { + let mut regs = Registers::default(); + regs.x0 = 0x12345678; + regs.x1 = 0x87654321; + regs.x2 = 0x11111111; + regs.x3 = 0x22222222; + regs.x8 = 0xdeadbeef; + regs.sp = 0x1000; + regs.pc = 0x2000; + + assert_eq!(regs.x0, 0x12345678); + assert_eq!(regs.x1, 0x87654321); + assert_eq!(regs.x2, 0x11111111); + assert_eq!(regs.x3, 0x22222222); + assert_eq!(regs.x8, 0xdeadbeef); + assert_eq!(regs.sp & !0xf, 0x1000); + } +} diff --git a/probing/cli/tests/test_aarch64.rs b/probing/cli/tests/test_aarch64.rs deleted file mode 100644 index a845c09e..00000000 --- a/probing/cli/tests/test_aarch64.rs +++ /dev/null @@ -1,111 +0,0 @@ -#[cfg(all(target_arch = "aarch64", target_os = "linux"))] -use probing_cli::inject::{Injector, Process}; -#[cfg(all(target_arch = "aarch64", target_os = "linux"))] -use std::process::Command; -#[cfg(all(target_arch = "aarch64", target_os = "linux"))] -use std::thread; -#[cfg(all(target_arch = "aarch64", target_os = "linux"))] -use std::time::Duration; - -/// Test that aarch64 injection works with a simple target process -#[cfg(all(target_arch = "aarch64", target_os = "linux"))] -#[test] -fn test_aarch64_injection_basic() { - // Start a simple target process - let mut target = Command::new("sleep") - .arg("10") - .spawn() - .expect("Failed to spawn target process"); - - let target_pid = target.id(); - println!("Target process PID: {}", target_pid); - - // Give the process a moment to start - thread::sleep(Duration::from_millis(100)); - - // Find the process - let proc = Process::by_pid(target_pid as i32).expect("Failed to find target process"); - - // Create a dummy library path for testing - let dummy_lib = std::path::Path::new("/tmp/dummy.so"); - - // Test injection (this will fail because the library doesn't exist, - // but we can test the shellcode injection part) - let result = Injector::attach(proc).and_then(|mut injector| injector.inject(dummy_lib, vec![])); - - // Clean up - let _ = target.kill(); - - // We expect this to fail because the library doesn't exist, - // but the shellcode injection should work - match result { - Ok(_) => panic!("Expected injection to fail due to missing library"), - Err(e) => { - // Check if the error is about the missing library, not shellcode injection - let error_msg = e.to_string(); - if error_msg.contains("No such file") || error_msg.contains("dlopen") { - println!("✅ Aarch64 injection test passed - shellcode injection worked, failed only due to missing library"); - } else { - panic!("Unexpected error: {}", error_msg); - } - } - } -} - -/// Test aarch64 shellcode generation -#[cfg(all(target_arch = "aarch64", target_os = "linux"))] -#[test] -fn test_aarch64_shellcode() { - use probing_cli::inject::injection_aarch64::SHELLCODE_AARCH64; - - // Verify the shellcode has the expected structure - assert_eq!(SHELLCODE_AARCH64.len(), 16); - - // Check for NOP instructions at the beginning - assert_eq!(SHELLCODE_AARCH64[0..4], [0x1f, 0x20, 0x03, 0xd5]); // nop - assert_eq!(SHELLCODE_AARCH64[4..8], [0x1f, 0x20, 0x03, 0xd5]); // nop - - // Check for BLR x8 instruction - assert_eq!(SHELLCODE_AARCH64[8..12], [0x00, 0x01, 0x3f, 0xd6]); // blr x8 - - // Check for BRK instruction - assert_eq!(SHELLCODE_AARCH64[12..16], [0x00, 0x00, 0x20, 0xd4]); // brk #0 - - println!("✅ Aarch64 shellcode structure is correct"); -} - -/// Test aarch64 register handling -#[cfg(all(target_arch = "aarch64", target_os = "linux"))] -#[test] -fn test_aarch64_register_handling() { - use pete::Registers; - - // Create a mock register set - let mut regs = Registers::default(); - regs.x0 = 0x12345678; - regs.x1 = 0x87654321; - regs.x2 = 0x11111111; - regs.x3 = 0x22222222; - regs.x8 = 0xdeadbeef; - regs.sp = 0x1000; - regs.pc = 0x2000; - - // Test that we can read the expected values - assert_eq!(regs.x0, 0x12345678); - assert_eq!(regs.x1, 0x87654321); - assert_eq!(regs.x2, 0x11111111); - assert_eq!(regs.x3, 0x22222222); - assert_eq!(regs.x8, 0xdeadbeef); - - // Test stack alignment - let aligned_sp = regs.sp & !0xf; - assert_eq!(aligned_sp, 0x1000); // Should be aligned to 16 bytes - - println!("✅ Aarch64 register handling is correct"); -} - -#[cfg(not(all(target_arch = "aarch64", target_os = "linux")))] -#[test] -fn test_aarch64_skipped_on_non_aarch64_linux() { - println!("ℹ️ Aarch64 tests skipped on non-aarch64 or non-linux platform"); -} diff --git a/probing/core/Cargo.toml b/probing/core/Cargo.toml index c0e0bc79..5ad17961 100644 --- a/probing/core/Cargo.toml +++ b/probing/core/Cargo.toml @@ -6,6 +6,22 @@ edition.workspace = true license.workspace = true description = "Core library for the Probing framework, providing essential data analysis and inspection capabilities" +[lints.rust] +rust_2018_idioms = "warn" + +[lints.clippy] +all = { level = "warn", priority = -1 } +pedantic = "allow" +nursery = "allow" +upper_case_acronyms = "allow" +enum_variant_names = "allow" +too_many_arguments = "allow" +module_name_repetitions = "allow" +must_use_candidate = "allow" +missing_errors_doc = "allow" +missing_panics_doc = "allow" +similar_names = "allow" + [lib] crate-type = ["rlib"] diff --git a/probing/core/src/core/arrow_convert.rs b/probing/core/src/core/arrow_convert.rs index be882c21..1e10b887 100644 --- a/probing/core/src/core/arrow_convert.rs +++ b/probing/core/src/core/arrow_convert.rs @@ -5,6 +5,7 @@ use arrow::array::ArrayRef; use arrow::array::*; +use arrow::datatypes::DataType; use probing_proto::prelude::Seq; /// Convert Arrow ArrayRef to Seq @@ -41,3 +42,17 @@ pub fn arrow_array_to_seq(array: &ArrayRef) -> Seq { Seq::Nil } } + +/// Empty column matching an Arrow type (for zero-row query results). +pub fn empty_seq_for_data_type(data_type: &DataType) -> Seq { + match data_type { + DataType::Int32 => Seq::SeqI32(vec![]), + DataType::Int64 => Seq::SeqI64(vec![]), + DataType::Float32 => Seq::SeqF32(vec![]), + DataType::Float64 => Seq::SeqF64(vec![]), + DataType::Utf8 | DataType::LargeUtf8 => Seq::SeqText(vec![]), + DataType::Boolean => Seq::SeqBOOL(vec![]), + DataType::Timestamp(_, _) => Seq::SeqI64(vec![]), + _ => Seq::Nil, + } +} diff --git a/probing/core/src/core/engine.rs b/probing/core/src/core/engine.rs index b6dadb26..969d2b6f 100644 --- a/probing/core/src/core/engine.rs +++ b/probing/core/src/core/engine.rs @@ -12,7 +12,7 @@ use datafusion::execution::SessionState; use datafusion::prelude::{DataFrame, SessionConfig, SessionContext}; use futures; -use super::arrow_convert::arrow_array_to_seq; +use super::arrow_convert::{arrow_array_to_seq, empty_seq_for_data_type}; use super::probe_extension::ProbeExtension; use super::probe_extension::ProbeExtensionManager; @@ -109,9 +109,21 @@ impl Engine { return Ok(Some(df)); } let query: String = federation::prepare_global_query(&original); - let batches = self.sql(query.as_str()).await?.collect().await?; + let df = self.sql(query.as_str()).await?; + let schema = df.schema().clone(); + let batches = df.collect().await?; if batches.is_empty() { - return Ok(None); + let names = schema + .fields() + .iter() + .map(|f| f.name().clone()) + .collect::>(); + let columns = schema + .fields() + .iter() + .map(|f| empty_seq_for_data_type(f.data_type())) + .collect::>(); + return Ok(Some(probing_proto::prelude::DataFrame::new(names, columns))); } let batch = concat_batches(&batches[0].schema(), batches.iter())?; @@ -480,7 +492,9 @@ mod tests { assert_eq!(result.names[1], "str"); let result = engine.async_query("SELECT 1 WHERE 1=0").await.unwrap(); - assert!(result.is_none()); + let result = result.expect("zero-row queries preserve column schema"); + assert_eq!(result.names, vec!["Int64(1)".to_string()]); + assert_eq!(result.len(), 0); } #[tokio::test] diff --git a/probing/core/src/core/federation/convert.rs b/probing/core/src/core/federation/convert.rs index 17b66c22..1b19d8fa 100644 --- a/probing/core/src/core/federation/convert.rs +++ b/probing/core/src/core/federation/convert.rs @@ -2,9 +2,10 @@ use std::sync::Arc; use arrow::array::{ ArrayRef, BooleanArray, Float32Array, Float64Array, Int32Array, Int64Array, RecordBatch, - StringArray, + StringArray, TimestampMicrosecondArray, TimestampMillisecondArray, TimestampNanosecondArray, + TimestampSecondArray, }; -use arrow::datatypes::{DataType, Field, Schema, SchemaRef}; +use arrow::datatypes::{DataType, Field, Schema, SchemaRef, TimeUnit}; use datafusion::error::{DataFusionError, Result}; use probing_proto::prelude::{DataFrame, Seq}; @@ -14,6 +15,8 @@ pub const PROBE_HOST_COL: &str = "_host"; pub const PROBE_ADDR_COL: &str = "_addr"; /// Cluster `rank` from `cluster.nodes` for the row's source probing endpoint. pub const PROBE_RANK_COL: &str = "_rank"; +/// Parallel-role key (e.g. "dp=2,pp=1,tp=0") for the row's source endpoint. +pub const PROBE_ROLE_COL: &str = "_role"; #[cfg_attr(not(test), allow(dead_code))] pub fn node_label(host: &str, addr: &str) -> String { @@ -40,12 +43,30 @@ pub fn cluster_rank_for_endpoint(host: &str, addr: &str) -> Option { }) } +/// Resolve parallel-role key for a probing endpoint (`host` + `addr` key in CLUSTER). +pub fn cluster_role_for_endpoint(host: &str, addr: &str) -> Option { + use crate::core::cluster::CLUSTER; + + CLUSTER + .read() + .ok() + .and_then(|c| c.get_by_addr(host, addr).and_then(|n| n.role.clone())) + .or_else(|| { + crate::core::cluster::get_nodes() + .into_iter() + .find(|n| n.addr == addr) + .and_then(|n| n.role) + }) + .filter(|r| !r.is_empty()) +} + pub fn federated_output_schema(local: SchemaRef) -> SchemaRef { let mut fields = local.fields().to_vec(); for (name, dtype, nullable) in [ (PROBE_HOST_COL, DataType::Utf8, false), (PROBE_ADDR_COL, DataType::Utf8, false), (PROBE_RANK_COL, DataType::Int32, true), + (PROBE_ROLE_COL, DataType::Utf8, true), ] { if !fields.iter().any(|f| f.name() == name) { fields.push(Arc::new(Field::new(name, dtype, nullable))); @@ -57,7 +78,7 @@ pub fn federated_output_schema(local: SchemaRef) -> SchemaRef { pub fn is_federation_tag_column(name: &str) -> bool { matches!( name, - PROBE_NODE_COL | PROBE_HOST_COL | PROBE_ADDR_COL | PROBE_RANK_COL + PROBE_NODE_COL | PROBE_HOST_COL | PROBE_ADDR_COL | PROBE_RANK_COL | PROBE_ROLE_COL ) } @@ -67,12 +88,15 @@ pub fn tag_proto_dataframe(df: &mut DataFrame, host: &str, addr: &str, rank: Opt return; } let rows = df.len(); + let role = cluster_role_for_endpoint(host, addr).unwrap_or_default(); df.names.push(PROBE_HOST_COL.to_string()); df.names.push(PROBE_ADDR_COL.to_string()); df.names.push(PROBE_RANK_COL.to_string()); + df.names.push(PROBE_ROLE_COL.to_string()); df.cols.push(Seq::SeqText(vec![host.to_string(); rows])); df.cols.push(Seq::SeqText(vec![addr.to_string(); rows])); df.cols.push(Seq::SeqI32(vec![rank.unwrap_or(-1); rows])); + df.cols.push(Seq::SeqText(vec![role; rows])); df.size = df.len() as u64; } @@ -125,8 +149,9 @@ pub fn dataframe_to_record_batch( } let rank = rank.or_else(|| cluster_rank_for_endpoint(host, addr)); - let mut columns = Vec::with_capacity(df.cols.len() + 3); - let mut fields = Vec::with_capacity(df.names.len() + 3); + let role = cluster_role_for_endpoint(host, addr).unwrap_or_default(); + let mut columns = Vec::with_capacity(df.cols.len() + 4); + let mut fields = Vec::with_capacity(df.names.len() + 4); for (name, col) in df.names.iter().zip(df.cols.iter()) { fields.push(Field::new(name, array_data_type(col), true)); @@ -137,9 +162,11 @@ pub fn dataframe_to_record_batch( fields.push(Field::new(PROBE_HOST_COL, DataType::Utf8, false)); fields.push(Field::new(PROBE_ADDR_COL, DataType::Utf8, false)); fields.push(Field::new(PROBE_RANK_COL, DataType::Int32, true)); + fields.push(Field::new(PROBE_ROLE_COL, DataType::Utf8, true)); columns.push(Arc::new(StringArray::from(vec![host.to_string(); rows]))); columns.push(Arc::new(StringArray::from(vec![addr.to_string(); rows]))); columns.push(Arc::new(Int32Array::from(vec![rank; rows]))); + columns.push(Arc::new(StringArray::from(vec![role; rows]))); RecordBatch::try_new(Arc::new(Schema::new(fields)), columns) .map_err(|e| DataFusionError::Execution(format!("dataframe conversion failed: {e}"))) @@ -172,6 +199,11 @@ pub fn tag_record_batch( fields.push(Arc::new(Field::new(PROBE_RANK_COL, DataType::Int32, true))); columns.push(Arc::new(Int32Array::from(vec![rank; rows]))); } + if !fields.iter().any(|f| f.name() == PROBE_ROLE_COL) { + let role = cluster_role_for_endpoint(host, addr).unwrap_or_default(); + fields.push(Arc::new(Field::new(PROBE_ROLE_COL, DataType::Utf8, true))); + columns.push(Arc::new(StringArray::from(vec![role; rows]))); + } RecordBatch::try_new(Arc::new(Schema::new(fields)), columns) .map_err(|e| DataFusionError::Execution(format!("tagging batch failed: {e}"))) @@ -215,8 +247,22 @@ fn empty_array_for_field(field: &Field, rows: usize) -> Result { DataType::Int64 => Arc::new(Int64Array::from(vec![None::; rows])), DataType::Float32 => Arc::new(Float32Array::from(vec![None::; rows])), DataType::Float64 => Arc::new(Float64Array::from(vec![None::; rows])), - DataType::Utf8 => Arc::new(StringArray::from(vec![None::<&str>; rows])), + DataType::Utf8 | DataType::LargeUtf8 => { + Arc::new(StringArray::from(vec![None::<&str>; rows])) + } DataType::Boolean => Arc::new(BooleanArray::from(vec![None::; rows])), + DataType::Timestamp(unit, _) => match unit { + TimeUnit::Second => Arc::new(TimestampSecondArray::from(vec![None::; rows])), + TimeUnit::Millisecond => { + Arc::new(TimestampMillisecondArray::from(vec![None::; rows])) + } + TimeUnit::Microsecond => { + Arc::new(TimestampMicrosecondArray::from(vec![None::; rows])) + } + TimeUnit::Nanosecond => { + Arc::new(TimestampNanosecondArray::from(vec![None::; rows])) + } + }, other => { return Err(DataFusionError::NotImplemented(format!( "unsupported federated column type: {other:?}" @@ -230,7 +276,7 @@ mod tests { use std::sync::Arc; use arrow::array::{Int32Array, RecordBatch, StringArray}; - use arrow::datatypes::{DataType, Field, Schema}; + use arrow::datatypes::{DataType, Field, Schema, TimeUnit}; use super::*; @@ -255,6 +301,7 @@ mod tests { assert!(schema.index_of(PROBE_HOST_COL).is_ok()); assert!(schema.index_of(PROBE_ADDR_COL).is_ok()); assert!(schema.index_of(PROBE_RANK_COL).is_ok()); + assert!(schema.index_of(PROBE_ROLE_COL).is_ok()); assert!(schema.index_of(PROBE_NODE_COL).is_err()); } @@ -267,7 +314,7 @@ mod tests { )])); let batch = RecordBatch::try_new(local, vec![Arc::new(Int32Array::from(vec![7]))]).unwrap(); let tagged = tag_record_batch(batch, "host-a", "10.0.0.1:8080", Some(3)).unwrap(); - assert_eq!(tagged.num_columns(), 4); + assert_eq!(tagged.num_columns(), 5); assert_eq!( tagged .column(tagged.schema().index_of(PROBE_HOST_COL).unwrap()) @@ -321,4 +368,24 @@ mod tests { let extended = extend_projection_with_probe_tags(Some(&vec![rank_idx]), &schema).unwrap(); assert_eq!(extended, vec![rank_idx]); } + + #[test] + fn align_batch_fills_timestamp_column_for_empty_rows() { + let batch = RecordBatch::try_new( + Arc::new(Schema::new(vec![Field::new("host", DataType::Utf8, false)])), + vec![Arc::new(StringArray::from(Vec::<&str>::new()))], + ) + .unwrap(); + let full = Schema::new(vec![ + Field::new("host", DataType::Utf8, false), + Field::new( + "timestamp", + DataType::Timestamp(TimeUnit::Microsecond, None), + false, + ), + ]); + let aligned = align_batch_to_schema(batch, &full).unwrap(); + assert_eq!(aligned.num_columns(), 2); + assert_eq!(aligned.num_rows(), 0); + } } diff --git a/probing/core/src/core/federation/federated_scan_exec.rs b/probing/core/src/core/federation/federated_scan_exec.rs index 3caf03c5..344c64f2 100644 --- a/probing/core/src/core/federation/federated_scan_exec.rs +++ b/probing/core/src/core/federation/federated_scan_exec.rs @@ -211,7 +211,7 @@ fn finalize_remote_dataframe( } impl DisplayAs for FederatedScanExec { - fn fmt_as(&self, _t: DisplayFormatType, f: &mut fmt::Formatter) -> fmt::Result { + fn fmt_as(&self, _t: DisplayFormatType, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, "FederatedScanExec: peers={}, remote_sql={}", diff --git a/probing/core/src/core/federation/mod.rs b/probing/core/src/core/federation/mod.rs index ba210dfe..55a3457d 100644 --- a/probing/core/src/core/federation/mod.rs +++ b/probing/core/src/core/federation/mod.rs @@ -15,7 +15,8 @@ pub use cluster_executor::{ ProbeClusterExecutor, RemoteFanoutResult, }; pub use convert::{ - cluster_rank_for_endpoint, PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_NODE_COL, PROBE_RANK_COL, + cluster_rank_for_endpoint, cluster_role_for_endpoint, PROBE_ADDR_COL, PROBE_HOST_COL, + PROBE_NODE_COL, PROBE_RANK_COL, PROBE_ROLE_COL, }; pub use global_catalog::{install_global_catalog, GLOBAL_CATALOG}; pub use rewrite::{ diff --git a/probing/core/src/core/federation/rewrite.rs b/probing/core/src/core/federation/rewrite.rs index 2f413f8e..9622e888 100644 --- a/probing/core/src/core/federation/rewrite.rs +++ b/probing/core/src/core/federation/rewrite.rs @@ -4,7 +4,7 @@ use datafusion::sql::sqlparser::ast::{Query, SetExpr, Statement}; use datafusion::sql::sqlparser::dialect::GenericDialect; use datafusion::sql::sqlparser::parser::Parser; -use super::convert::{PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_RANK_COL}; +use super::convert::{PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_RANK_COL, PROBE_ROLE_COL}; const KNOWN_SCHEMAS: &[&str] = &[ "cluster", "process", "files", "python", "memtable", "gpu", "rdma", @@ -140,6 +140,7 @@ fn expand_global_select_star(sql: &str) -> String { if lower.contains(PROBE_HOST_COL) && lower.contains(PROBE_ADDR_COL) && lower.contains(PROBE_RANK_COL) + && lower.contains(PROBE_ROLE_COL) { return sql.to_string(); } @@ -153,7 +154,7 @@ fn expand_global_select_star(sql: &str) -> String { } let exclude = format!( - " EXCLUDE ({PROBE_HOST_COL}, {PROBE_ADDR_COL}, {PROBE_RANK_COL}), {PROBE_HOST_COL}, {PROBE_ADDR_COL}, {PROBE_RANK_COL}" + " EXCLUDE ({PROBE_HOST_COL}, {PROBE_ADDR_COL}, {PROBE_RANK_COL}, {PROBE_ROLE_COL}), {PROBE_HOST_COL}, {PROBE_ADDR_COL}, {PROBE_RANK_COL}, {PROBE_ROLE_COL}" ); let new_select = if let Some(dot_star) = select_part.rfind(".*") { let before = &select_part[..dot_star + 2]; @@ -300,7 +301,7 @@ mod tests { let sql = "SELECT * FROM global.process.envs"; assert_eq!( ensure_global_node_columns(sql), - "SELECT * EXCLUDE (_host, _addr, _rank), _host, _addr, _rank FROM global.process.envs" + "SELECT * EXCLUDE (_host, _addr, _rank, _role), _host, _addr, _rank, _role FROM global.process.envs" ); } @@ -309,20 +310,20 @@ mod tests { let sql = "SELECT e.* FROM global.process.envs e"; assert_eq!( ensure_global_node_columns(sql), - "SELECT e.* EXCLUDE (_host, _addr, _rank), _host, _addr, _rank FROM global.process.envs e" + "SELECT e.* EXCLUDE (_host, _addr, _rank, _role), _host, _addr, _rank, _role FROM global.process.envs e" ); } #[test] fn skips_select_star_wildcard_when_tags_already_present() { let sql = - "SELECT * EXCLUDE (_host, _addr, _rank), _host, _addr, _rank FROM global.process.envs"; + "SELECT * EXCLUDE (_host, _addr, _rank, _role), _host, _addr, _rank, _role FROM global.process.envs"; assert_eq!(ensure_global_node_columns(sql), sql); } #[test] fn skips_qualified_select_star_when_already_expanded() { - let sql = "SELECT e.* EXCLUDE (_host, _addr, _rank), _host, _addr, _rank FROM global.process.envs e"; + let sql = "SELECT e.* EXCLUDE (_host, _addr, _rank, _role), _host, _addr, _rank, _role FROM global.process.envs e"; assert_eq!(ensure_global_node_columns(sql), sql); } diff --git a/probing/core/src/core/memtable_sql.rs b/probing/core/src/core/memtable_sql.rs index a8fbbb42..db3d2a58 100644 --- a/probing/core/src/core/memtable_sql.rs +++ b/probing/core/src/core/memtable_sql.rs @@ -227,7 +227,7 @@ fn dtype_to_arrow(dt: DType) -> DataType { } /// Arrow schema mirroring a ring table's column layout. -pub fn view_to_arrow_schema(view: &MemTableView) -> SchemaRef { +pub fn view_to_arrow_schema(view: &MemTableView<'_>) -> SchemaRef { let s = view.schema(); let fields: Vec = s .cols @@ -249,7 +249,7 @@ enum ColBuilder { Bytes(BinaryBuilder), } -fn make_builders(view: &MemTableView) -> Vec { +fn make_builders(view: &MemTableView<'_>) -> Vec { view.schema() .cols .iter() @@ -274,7 +274,7 @@ fn make_builders(view: &MemTableView) -> Vec { /// the bytes can no longer be trusted, so the whole chunk is dropped /// rather than surfacing corrupt rows to SQL. fn chunk_to_recordbatch( - view: &MemTableView, + view: &MemTableView<'_>, chunk: usize, arrow_schema: &SchemaRef, ) -> Option { @@ -342,7 +342,7 @@ fn chunk_to_recordbatch( /// /// Always returns at least one (possibly empty) batch so the table keeps its /// real schema even when no rows are visible. -pub fn view_to_recordbatches(view: &MemTableView) -> Vec { +pub fn view_to_recordbatches(view: &MemTableView<'_>) -> Vec { let arrow_schema = view_to_arrow_schema(view); let mut batches: Vec = view .chunks_logical() @@ -464,7 +464,7 @@ pub fn ts_bounds_from_filters(filters: &[Expr], ts_name: &str) -> TsBounds { /// `false` only when the chunk's committed `[min_ts, max_ts]` provably lies /// outside `bounds`. Races with the writer resolve to `true` (keep the /// chunk) — materialisation re-validates the generation anyway. -fn chunk_may_match(view: &MemTableView, chunk: usize, bounds: &TsBounds) -> bool { +fn chunk_may_match(view: &MemTableView<'_>, chunk: usize, bounds: &TsBounds) -> bool { if bounds.is_unbounded() { return true; } @@ -479,7 +479,10 @@ fn chunk_may_match(view: &MemTableView, chunk: usize, bounds: &TsBounds) -> bool } /// Like [`view_to_recordbatches`], skipping chunks outside `bounds`. -pub fn view_to_recordbatches_pruned(view: &MemTableView, bounds: &TsBounds) -> Vec { +pub fn view_to_recordbatches_pruned( + view: &MemTableView<'_>, + bounds: &TsBounds, +) -> Vec { let arrow_schema = view_to_arrow_schema(view); let mut batches: Vec = view .chunks_logical() @@ -498,7 +501,7 @@ pub fn view_to_recordbatches_pruned(view: &MemTableView, bounds: &TsBounds) -> V /// chunks already materialised from the cold tier, so a hot∪cold union counts /// each row exactly once even while a compacted chunk still lives in the ring. fn view_to_recordbatches_pruned_excluding( - view: &MemTableView, + view: &MemTableView<'_>, bounds: &TsBounds, excluded: &HashSet<(usize, u64)>, ) -> Vec { diff --git a/probing/crates/store/Cargo.toml b/probing/crates/store/Cargo.toml index e415c102..7f53b9f7 100644 --- a/probing/crates/store/Cargo.toml +++ b/probing/crates/store/Cargo.toml @@ -5,6 +5,7 @@ authors.workspace = true edition.workspace = true license.workspace = true + [lib] crate-type = ["rlib"] diff --git a/probing/extensions/cc/Cargo.toml b/probing/extensions/cc/Cargo.toml index 7ae871ba..7586c73d 100644 --- a/probing/extensions/cc/Cargo.toml +++ b/probing/extensions/cc/Cargo.toml @@ -6,6 +6,7 @@ authors.workspace = true edition.workspace = true license.workspace = true + [features] default = ["kmsg"] kmsg = ["dep:rmesg"] diff --git a/probing/extensions/cc/src/extensions/cluster.rs b/probing/extensions/cc/src/extensions/cluster.rs index 88c8b458..2eee4668 100644 --- a/probing/extensions/cc/src/extensions/cluster.rs +++ b/probing/extensions/cc/src/extensions/cluster.rs @@ -32,6 +32,7 @@ impl CustomTable for ClusterTable { Field::new("role_name", DataType::Utf8, true), Field::new("role_rank", DataType::Int32, true), Field::new("role_world_size", DataType::Int32, true), + Field::new("role", DataType::Utf8, true), Field::new("status", DataType::Utf8, true), Field::new( "timestamp", @@ -55,6 +56,7 @@ impl CustomTable for ClusterTable { fields.push(cluster::extract_array(&nodes, |n| n.role_name.clone())); fields.push(cluster::extract_array(&nodes, |n| n.role_rank)); fields.push(cluster::extract_array(&nodes, |n| n.role_world_size)); + fields.push(cluster::extract_array(&nodes, |n| n.role.clone())); fields.push(cluster::extract_array(&nodes, |n| n.status.clone())); fields.push(cluster::extract_array(&nodes, |n| { std::time::Duration::from_micros(n.timestamp) diff --git a/probing/extensions/cc/src/extensions/cpu/collector.rs b/probing/extensions/cc/src/extensions/cpu/collector.rs index 589a6d59..ee599c79 100644 --- a/probing/extensions/cc/src/extensions/cpu/collector.rs +++ b/probing/extensions/cc/src/extensions/cpu/collector.rs @@ -171,6 +171,7 @@ fn ts_micros() -> i64 { .as_micros() as i64 } +#[allow(clippy::too_many_arguments)] fn push_utilization_row( table: &mut ExposedTable, ts: i64, diff --git a/probing/extensions/cc/src/extensions/cpu/extension.rs b/probing/extensions/cc/src/extensions/cpu/extension.rs index 7e9ede64..7e5c76f5 100644 --- a/probing/extensions/cc/src/extensions/cpu/extension.rs +++ b/probing/extensions/cc/src/extensions/cpu/extension.rs @@ -67,7 +67,7 @@ impl CpuProbeExtension { start_cpu_sampling(interval as u64, thread_top_n).map_err(|e| { EngineError::InvalidOptionValue( Self::OPTION_CPU_SAMPLE_INTERVAL_MS.to_string(), - format!("{e}").into(), + format!("{e}"), ) })?; diff --git a/probing/extensions/cc/src/extensions/cpu/sampler.rs b/probing/extensions/cc/src/extensions/cpu/sampler.rs index 4b9f606c..7265466a 100644 --- a/probing/extensions/cc/src/extensions/cpu/sampler.rs +++ b/probing/extensions/cc/src/extensions/cpu/sampler.rs @@ -20,7 +20,7 @@ pub fn host_sampler() -> Box { } #[cfg(target_os = "macos")] { - return Box::new(super::macos::MacSampler); + Box::new(super::macos::MacSampler) } #[cfg(not(any(target_os = "linux", target_os = "macos")))] { diff --git a/probing/extensions/cc/src/extensions/rdma.rs b/probing/extensions/cc/src/extensions/rdma.rs index e3fadca8..ba5b9f7d 100644 --- a/probing/extensions/cc/src/extensions/rdma.rs +++ b/probing/extensions/cc/src/extensions/rdma.rs @@ -126,28 +126,81 @@ impl ProbeExtensionCall for RdmaProbeExtension { async fn call( &self, path: &str, - params: &HashMap, + _params: &HashMap, body: &[u8], ) -> Result, EngineError> { - if path == "" { - let string = GLOBAL_HCA_NAME.get_or_init(|| Mutex::new(String::new())); - let guard = string.lock().unwrap(); - let hca_name = guard.clone(); + if path.is_empty() { + let hca_name = resolve_hca_name(body)?; + return Ok(format_rdma_snapshot(&hca_name)?.into_bytes()); + } + Err(EngineError::UnsupportedCall) + } +} - let mut monitor = RDMAMonitor::new(&hca_name); +fn resolve_hca_name(body: &[u8]) -> Result { + if !body.is_empty() { + let name = String::from_utf8_lossy(body).trim().to_string(); + if !name.is_empty() { + let global = GLOBAL_HCA_NAME.get_or_init(|| Mutex::new(String::new())); + *global.lock().unwrap() = name.clone(); + return Ok(name); + } + } - const TEST_CALL: u32 = 5; - let mut call_cnt = 0; + let global = GLOBAL_HCA_NAME.get_or_init(|| Mutex::new(String::new())); + let name = global.lock().unwrap().clone(); + if name.is_empty() { + return Err(EngineError::InvalidOptionValue( + RdmaProbeExtension::OPTION_HCA_NAME.to_string(), + "HCA name required (POST body or SET rdma.hca.name)".to_string(), + )); + } + Ok(name) +} - while call_cnt < TEST_CALL { - call_cnt += 1; - monitor.obtain_newset(); - std::thread::sleep(Duration::from_millis(1000)); - } - return Ok("RDMA request handled successfully".as_bytes().to_vec()); - } - Err(EngineError::UnsupportedCall) +fn format_rdma_snapshot(hca_name: &str) -> Result { + let mut monitor = RDMAMonitor::new(hca_name); + monitor.obtain_newset(); + + let sleep_secs = GLOBAL_HCA_SAMPLE_RATE + .get_or_init(|| Mutex::new(0.0)) + .lock() + .unwrap() + .max(0.0) as u64; + if sleep_secs > 0 { + thread::sleep(Duration::from_secs(sleep_secs)); } + + let port_rcv_packets = monitor.read_counter("port_rcv_packets"); + let port_rcv_data = monitor.read_counter("port_rcv_data"); + let port_xmit_packets = monitor.read_counter("port_xmit_packets"); + let port_xmit_data = monitor.read_counter("port_xmit_data"); + let link_downed = monitor.read_counter("link_downed"); + let np_cnp_sent = monitor.read_counter("np_cnp_sent"); + let np_ecn_marked = monitor.read_counter("np_ecn_marked_roce_packets"); + let rcv_pkts_rate = monitor.calculate_rate( + Some(port_rcv_packets), + monitor.previous_port_rcv_packets, + monitor.last_measurement_time.map(|t| t.elapsed()), + ); + let snd_pkts_rate = monitor.calculate_rate( + Some(port_xmit_packets), + monitor.previous_port_xmit_packets, + monitor.last_measurement_time.map(|t| t.elapsed()), + ); + + Ok(format!( + "hca_name: {hca_name}\n\ + port_rcv_packets: {port_rcv_packets}\n\ + port_rcv_data: {port_rcv_data}\n\ + port_xmit_packets: {port_xmit_packets}\n\ + port_xmit_data: {port_xmit_data}\n\ + link_downed: {link_downed}\n\ + np_cnp_sent: {np_cnp_sent}\n\ + np_ecn_marked_roce_packets: {np_ecn_marked}\n\ + rcv_pkts_rate: {rcv_pkts_rate:.2}\n\ + snd_pkts_rate: {snd_pkts_rate:.2}\n" + )) } impl RdmaProbeExtension { @@ -221,13 +274,7 @@ impl RDMAMonitor { ) }; - match read_file_to_f64(&path) { - Ok(value) => value, - Err(e) => { - println!("Error reading counter {}: {}", counter_name, e); - 0.0 - } - } + read_file_to_f64(&path).unwrap_or(0.0) } fn calculate_rate( @@ -255,47 +302,10 @@ impl RDMAMonitor { fn obtain_newset(&mut self) { let port_rcv_packets = self.read_counter("port_rcv_packets"); - let port_rcv_data = self.read_counter("port_rcv_data"); let port_xmit_packets = self.read_counter("port_xmit_packets"); - let port_xmit_data = self.read_counter("port_xmit_data"); - let link_downed = self.read_counter("link_downed"); - let np_cnp_sent = self.read_counter("np_cnp_sent"); - let np_ecn_marked_roce_packets = self.read_counter("np_ecn_marked_roce_packets"); - - let current_time = Instant::now(); - let interval = self - .last_measurement_time - .map(|t| current_time.duration_since(t)); - - let rcv_pkts_rate = self.calculate_rate( - Some(port_rcv_packets), - self.previous_port_rcv_packets, - interval, - ); - - let snd_pkts_rate = self.calculate_rate( - Some(port_xmit_packets), - self.previous_port_xmit_packets, - interval, - ); - self.previous_port_rcv_packets = Some(port_rcv_packets); self.previous_port_xmit_packets = Some(port_xmit_packets); - self.last_measurement_time = Some(current_time); - - let new_data = [ - port_rcv_packets as f64, - port_rcv_data as f64, - port_xmit_packets as f64, - port_xmit_data as f64, - link_downed as f64, - np_cnp_sent as f64, - np_ecn_marked_roce_packets as f64, - rcv_pkts_rate, - snd_pkts_rate, - ]; - - println!("New RDMA data: {:?}", new_data); + self.last_measurement_time = Some(Instant::now()); } } diff --git a/probing/extensions/gpu/Cargo.toml b/probing/extensions/gpu/Cargo.toml index 112d89ad..f896e844 100644 --- a/probing/extensions/gpu/Cargo.toml +++ b/probing/extensions/gpu/Cargo.toml @@ -6,6 +6,7 @@ authors.workspace = true edition.workspace = true license.workspace = true + [features] default = [] # NVIDIA CUDA via cudarc dynamic-loading (Linux/datacenter only). diff --git a/probing/extensions/gpu/src/extensions/backend/apple/mod.rs b/probing/extensions/gpu/src/extensions/backend/apple/mod.rs index 4562ca1c..8253ad0f 100644 --- a/probing/extensions/gpu/src/extensions/backend/apple/mod.rs +++ b/probing/extensions/gpu/src/extensions/backend/apple/mod.rs @@ -97,7 +97,7 @@ impl GpuBackend for AppleSiliconBackend { fn sample_memory(&self, ordinal: i32) -> Option { let dev = self.devices.iter().find(|d| d.ordinal == ordinal)?; let perf = ioreg::read_performance_stats(); - let allocated = dev.device.current_allocated_size() as u64; + let allocated = dev.device.current_allocated_size(); let budget = dev.device.recommended_max_working_set_size(); let total = if budget > 0 { budget diff --git a/probing/extensions/gpu/src/extensions/backend/registry.rs b/probing/extensions/gpu/src/extensions/backend/registry.rs index 091128b3..2fb17e08 100644 --- a/probing/extensions/gpu/src/extensions/backend/registry.rs +++ b/probing/extensions/gpu/src/extensions/backend/registry.rs @@ -65,21 +65,18 @@ pub fn discover_backends() -> Vec> { /// Backends selected by env `PROBING_GPU_BACKEND` (default: auto = all discovered). pub fn selected_backends() -> Vec> { - let filter = std::env::var("PROBING_GPU_BACKEND") - .ok() - .map(|raw| { - let trimmed = raw.trim().to_ascii_lowercase(); - if matches!(trimmed.as_str(), "" | "auto" | "all" | "any") { - return None; - } - Some( - trimmed - .split([',', ' ', ';']) - .filter_map(GpuBackendKind::parse) - .collect::>(), - ) - }) - .flatten(); + let filter = std::env::var("PROBING_GPU_BACKEND").ok().and_then(|raw| { + let trimmed = raw.trim().to_ascii_lowercase(); + if matches!(trimmed.as_str(), "" | "auto" | "all" | "any") { + return None; + } + Some( + trimmed + .split([',', ' ', ';']) + .filter_map(GpuBackendKind::parse) + .collect::>(), + ) + }); set_backend_filter(filter); discover_backends() diff --git a/probing/extensions/gpu/src/extensions/extension.rs b/probing/extensions/gpu/src/extensions/extension.rs index 5dce37ec..9b53a128 100644 --- a/probing/extensions/gpu/src/extensions/extension.rs +++ b/probing/extensions/gpu/src/extensions/extension.rs @@ -60,7 +60,7 @@ impl GpuProbeExtension { start_gpu_sampling(interval as u64).map_err(|e| { EngineError::InvalidOptionValue( Self::OPTION_GPU_SAMPLE_INTERVAL_MS.to_string(), - format!("{e}").into(), + format!("{e}"), ) })?; diff --git a/probing/extensions/nccl-profiler/Cargo.toml b/probing/extensions/nccl-profiler/Cargo.toml new file mode 100644 index 00000000..17298406 --- /dev/null +++ b/probing/extensions/nccl-profiler/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "probing-nccl-profiler" +description = "NCCL profiler plugin (v3) — writes nccl.* memtables for probing SQL" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true + + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +probing-memtable = { path = "../../memtable" } + +once_cell = { workspace = true } +parking_lot = "0.12" +thiserror = { workspace = true } + +[target.'cfg(target_os = "linux")'.dependencies] +libc = "0.2" + +[dev-dependencies] +tempfile = "3" diff --git a/probing/extensions/nccl-profiler/README.md b/probing/extensions/nccl-profiler/README.md new file mode 100644 index 00000000..78f24116 --- /dev/null +++ b/probing/extensions/nccl-profiler/README.md @@ -0,0 +1,129 @@ +# probing-nccl-profiler + +NCCL **profiler plugin** (API v3, NCCL ≥ 2.26) that writes mmap memtables consumable by probing SQL. + +## Build + +```bash +cargo build -p probing-nccl-profiler --release +# artifact: target/release/libprobing_nccl_profiler.so +``` + +Requires **Linux** (same as NCCL distributed training). + +## macOS / dev without NCCL + +Mock data for SQL and skills debugging (no GPU / NCCL required): + +```bash +# Manual seed (needs PROBING=1 or probing engine in-process) +PROBING=1 python -m probing.nccl --seed-mock + +# macOS: auto-seed on PROBING=1 (default PROBING_NCCL_MOCK=auto) +PROBING=1 python your_script.py +probing -t query "SELECT rank, recv_wait_ns, send_gpu_wait_ns FROM nccl.proxy_ops" +probing -t skill run nccl_culprit_victim +``` + +| Variable | Default (macOS) | Meaning | +|----------|-----------------|--------| +| `PROBING_NCCL_MOCK` | `auto` | `auto` / `1` seeds mock tables; `0` disables | + +Mock scenario: rank **2** = culprit (`send_gpu_wait_ns` high), rank **5** = victim (`recv_wait_ns` high). + +## Phase 0 — smoke test + +```bash +# 1. Confirm NCCL version (need ≥ 2.26 for v3 + NetPlugin events) +python -c "import torch; print(torch.__version__, torch.cuda.nccl.version())" + +# 2. Install probing (wheel includes libprobing_nccl_profiler.so on Linux) +pip install probing +# or from source: make wheel && pip install dist/probing-*.whl + +# 3. Run a tiny distributed job +export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) +export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # 26 +export PROBING=2 +torchrun --nproc_per_node=2 your_allreduce.py + +# 4. Query (probing attached to same PIDs, or after inject) +probing -t query "SELECT * FROM nccl.proxy_ops LIMIT 20" +``` + +Optional NetPlugin (IB QP) events — add mask bit 128: + +```bash +export NCCL_PROFILE_EVENT_MASK=154 # + ncclProfileNetPlugin(128) +probing -t query "SELECT * FROM nccl.net_qp LIMIT 20" +``` + +## Tables + +| SQL table | mmap file | Phase | +|-----------|-----------|-------| +| `nccl.proxy_ops` | `nccl.proxy_ops` | wait decomposition + parallel roles | +| `nccl.net_qp` | `nccl.net_qp` | IB QP timing from NCCL net plugin | + +### `nccl.proxy_ops` columns + +| Column | Notes | +|--------|-------| +| `rank` | torch rank | +| `tp_rank`, `pp_rank`, `dp_rank` | from `TP_RANK` / `PP_RANK` / `DP_RANK` (or Megatron env); `-1` if unset | +| `send_gpu_wait_ns` | culprit signal | +| `recv_wait_ns` | victim signal | +| `coll_func`, `seq`, `channel_id`, `peer`, `is_send`, `n_steps`, `trans_bytes` | proxy op metadata | +| `send_wait_ns`, `recv_flush_wait_ns` | additional wait buckets | + +Rows aggregate ProxyStep state transitions at ProxyOp stop (batched under parent Coll when present). + +Docs: `docs/src/design/nccl-profiler.md`. + +## Environment + +| Variable | Purpose | +|----------|---------| +| `NCCL_PROFILER_PLUGIN` | Path to this `.so` (required) | +| `NCCL_PROFILE_EVENT_MASK` | Override default `Coll\|ProxyOp\|ProxyStep` (26) | +| `PROBING_DATA_DIR` | Memtable directory (default `/dev/shm/probing`) | +| `TP_RANK`, `PP_RANK`, `DP_RANK` | Parallel roles written into `nccl.proxy_ops` | +| `PROBING_NCCL_MOCK` | Dev mock tables (`auto` on macOS) — see `python/probing/nccl/mock.py` | + +## Architecture + +``` +NCCL proxy thread + → ncclProfiler_v3 callbacks (this crate) + → slot pools (no per-event malloc) + → aggregate ProxyStep waits into ProxyOp + → batch rows under parent Coll; flush mmap on Coll stop +probing engine (same process) + → MmapFileSchemaProvider discovers nccl.* + → SELECT … FROM nccl.proxy_ops +``` + +### Phase 2 (writer path) + +- Pre-allocated slot pools for Coll / ProxyOp / ProxyStep / NetPlugin +- ProxyOp rows batched under parent Coll; mmap flush on `Coll stopEvent` +- Orphan ProxyOps (no parent) flush immediately +- Write failures logged once to stderr; `finalize` reports `pool_exhausted` / `write_errors` + +### Phase 3 (event hierarchy + roles) + +- `parentObj` chain: Coll → ProxyOp (per channel send/recv) → ProxyStep +- `descr.rank` + Coll metadata propagated when parent is present +- `coll_func` stored in fixed buffer (no heap `String` on hot path) +- `tp_rank` / `pp_rank` / `dp_rank` from training env (`role.rs`, aligned with `python.probing.parallel`) + +### Phase 4 (diagnostic skill) + +- Skill `nccl_culprit_victim` in `skills/` — SQL rank wait summary, culprit/victim rankings, role-aligned view, `global.*` fan-out +- Linked from `slow_rank` and `comm_bottleneck` when `nccl.proxy_ops` is present + +## Compatibility + +- **Floor**: export `ncclProfiler_v3` only (NCCL 2.26+). +- NCCL 2.27+ may negotiate higher plugin versions if we add `ncclProfiler_v4`… later. +- PyTorch **2.8+** (NCCL 2.26+) recommended; 2.7 ships NCCL 2.25 (no v3). diff --git a/probing/extensions/nccl-profiler/src/abi/mod.rs b/probing/extensions/nccl-profiler/src/abi/mod.rs new file mode 100644 index 00000000..dde46dd3 --- /dev/null +++ b/probing/extensions/nccl-profiler/src/abi/mod.rs @@ -0,0 +1,20 @@ +//! NCCL profiler plugin C ABI (v3, NCCL ≥ 2.26). +//! +//! Types mirror `ext-profiler/example/nccl/` from the NCCL repository. + +#![allow(dead_code)] + +pub mod net_ib_v1; +pub mod profiler_v3; + +pub use profiler_v3::*; + +/// `ncclResult_t` — success is zero. +pub type NcclResult = i32; + +pub const NCCL_SUCCESS: NcclResult = 0; + +#[inline] +pub const fn nccl_success() -> NcclResult { + NCCL_SUCCESS +} diff --git a/probing/extensions/nccl-profiler/src/abi/net_ib_v1.rs b/probing/extensions/nccl-profiler/src/abi/net_ib_v1.rs new file mode 100644 index 00000000..48cebe7b --- /dev/null +++ b/probing/extensions/nccl-profiler/src/abi/net_ib_v1.rs @@ -0,0 +1,57 @@ +//! Network IB plugin event descriptor (NCCL profiler net plugin v1). + +use std::os::raw::c_void; + +pub const NCCL_PROFILER_NET_IB_VER: i64 = 1; +pub const NCCL_PROFILER_NET_VER_BITS: i32 = 16; +pub const NCCL_PROFILER_NET_VER_MASK: i64 = (!0i64) >> NCCL_PROFILER_NET_VER_BITS; +pub const NCCL_PROFILER_NET_TYPE_MASK: i64 = (!0i64) << NCCL_PROFILER_NET_VER_BITS; + +pub const NCCL_PROFILER_NET_TYPE_IB: i64 = 1i64 << NCCL_PROFILER_NET_VER_BITS; + +pub const NCCL_PROFILE_QP: u8 = 1 << 0; + +#[repr(C)] +pub struct NcclProfilerNetIbDescrV1 { + pub type_: u8, + pub body: NcclProfilerNetIbBodyV1, +} + +#[repr(C)] +pub union NcclProfilerNetIbBodyV1 { + pub qp: NcclProfilerNetIbQpDescr, +} + +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerNetIbQpDescr { + pub device: i32, + pub wr_id: u64, + pub opcode: i32, + pub qp_num: i32, + pub length: usize, +} + +/// Decode plugin id from `netPlugin.id`. +#[inline] +pub fn net_plugin_type(id: i64) -> i64 { + id & NCCL_PROFILER_NET_TYPE_MASK +} + +#[inline] +pub fn net_plugin_ver(id: i64) -> i64 { + id & NCCL_PROFILER_NET_VER_MASK +} + +/// Safety: `data` must point to a valid `NcclProfilerNetIbDescrV1` when type is IB v1. +#[inline] +pub unsafe fn read_ib_qp(data: *mut c_void) -> Option { + if data.is_null() { + return None; + } + let d = &*(data as *const NcclProfilerNetIbDescrV1); + if d.type_ != NCCL_PROFILE_QP { + return None; + } + Some(d.body.qp) +} diff --git a/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs b/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs new file mode 100644 index 00000000..86488ef1 --- /dev/null +++ b/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs @@ -0,0 +1,177 @@ +//! `ncclProfiler_v3` and related descriptors (NCCL 2.26+). + +use std::os::raw::{c_char, c_int, c_void}; + +// ── Event activation mask ───────────────────────────────────────────── + +pub const NCCL_PROFILE_GROUP: i32 = 1 << 0; +pub const NCCL_PROFILE_COLL: i32 = 1 << 1; +pub const NCCL_PROFILE_P2P: i32 = 1 << 2; +pub const NCCL_PROFILE_PROXY_OP: i32 = 1 << 3; +pub const NCCL_PROFILE_PROXY_STEP: i32 = 1 << 4; +pub const NCCL_PROFILE_PROXY_CTRL: i32 = 1 << 5; +pub const NCCL_PROFILE_KERNEL_CH: i32 = 1 << 6; +pub const NCCL_PROFILE_NET_PLUGIN: i32 = 1 << 7; + +/// Default events for Phase 2 (wait decomposition). +pub const DEFAULT_ACTIVATION_MASK: i32 = + NCCL_PROFILE_COLL | NCCL_PROFILE_PROXY_OP | NCCL_PROFILE_PROXY_STEP; + +// ── Event state (shared across profiler API versions) ───────────────── + +#[repr(C)] +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +#[allow(clippy::enum_variant_names)] // mirrors NCCL C enum naming +pub enum NcclProfilerEventState { + ProxyOpSendPosted = 0, + ProxyOpSendRemFifoWait, + ProxyOpSendTransmitted, + ProxyOpSendDone, + ProxyOpRecvPosted, + ProxyOpRecvReceived, + ProxyOpRecvTransmitted, + ProxyOpRecvDone, + + ProxyStepSendGpuWait, + ProxyStepSendWait, + ProxyStepRecvWait, + ProxyStepRecvFlushWait, + ProxyStepRecvGpuWait, + + ProxyCtrlIdle, + ProxyCtrlActive, + ProxyCtrlSleep, + ProxyCtrlWakeup, + ProxyCtrlAppend, + ProxyCtrlAppendEnd, +} + +pub type NcclProfilerEventStateV3 = NcclProfilerEventState; + +// ── Event descriptors ───────────────────────────────────────────────── + +#[repr(C)] +pub struct NcclProfilerEventDescrV3 { + pub type_: u8, + pub parent_obj: *mut c_void, + pub rank: c_int, + pub body: NcclProfilerEventBodyV3, +} + +#[repr(C)] +pub union NcclProfilerEventBodyV3 { + pub coll: NcclProfilerCollDescr, + pub p2p: NcclProfilerP2pDescr, + pub proxy_op: NcclProfilerProxyOpDescr, + pub proxy_step: NcclProfilerProxyStepDescr, + pub kernel_ch: NcclProfilerKernelChDescr, + pub net_plugin: NcclProfilerNetPluginDescr, +} + +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerCollDescr { + pub name: *const c_char, + pub comm_hash: u64, + pub seq_number: u64, + pub func: *const c_char, + pub send_buff: *const c_void, + pub recv_buff: *mut c_void, + pub count: usize, + pub root: c_int, + pub datatype: *const c_char, + pub n_max_channels: u8, + pub n_warps: u8, + pub algo: *const c_char, + pub proto: *const c_char, +} + +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerP2pDescr { + pub name: *const c_char, + pub comm_hash: u64, + pub func: *const c_char, + pub buff: *mut c_void, + pub datatype: *const c_char, + pub count: usize, + pub peer: c_int, +} + +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerProxyOpDescr { + pub pid: i32, + pub channel_id: u8, + pub peer: c_int, + pub n_steps: c_int, + pub chunk_size: c_int, + pub is_send: c_int, +} + +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerProxyStepDescr { + pub step: c_int, +} + +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerKernelChDescr { + pub channel_id: u8, +} + +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerNetPluginDescr { + pub id: i64, + pub data: *mut c_void, +} + +// ── State transition args ───────────────────────────────────────────── + +#[repr(C)] +pub union NcclProfilerEventStateArgsV3 { + pub proxy_op: NcclProfilerProxyOpStateArgs, + pub proxy_ctrl: NcclProfilerProxyCtrlStateArgs, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct NcclProfilerProxyOpStateArgs { + pub trans_size: usize, + pub steps: c_int, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct NcclProfilerProxyCtrlStateArgs { + pub appended_proxy_ops: c_int, +} + +// ── Plugin vtable ───────────────────────────────────────────────────── + +pub type ProfilerInitFn = + unsafe extern "C" fn(context: *mut *mut c_void, mask: *mut c_int) -> super::NcclResult; +pub type ProfilerStartEventFn = unsafe extern "C" fn( + context: *mut c_void, + handle: *mut *mut c_void, + descr: *mut NcclProfilerEventDescrV3, +) -> super::NcclResult; +pub type ProfilerStopEventFn = unsafe extern "C" fn(handle: *mut c_void) -> super::NcclResult; +pub type ProfilerRecordStateFn = unsafe extern "C" fn( + handle: *mut c_void, + state: NcclProfilerEventStateV3, + args: *mut NcclProfilerEventStateArgsV3, +) -> super::NcclResult; +pub type ProfilerFinalizeFn = unsafe extern "C" fn(context: *mut c_void) -> super::NcclResult; + +#[repr(C)] +pub struct NcclProfilerV3 { + pub name: *const c_char, + pub init: ProfilerInitFn, + pub start_event: ProfilerStartEventFn, + pub stop_event: ProfilerStopEventFn, + pub record_event_state: ProfilerRecordStateFn, + pub finalize: ProfilerFinalizeFn, +} diff --git a/probing/extensions/nccl-profiler/src/events.rs b/probing/extensions/nccl-profiler/src/events.rs new file mode 100644 index 00000000..7b98c54b --- /dev/null +++ b/probing/extensions/nccl-profiler/src/events.rs @@ -0,0 +1,316 @@ +//! Event slot layouts and wait aggregation. + +use std::sync::atomic::AtomicU64; +use std::time::Instant; + +use once_cell::sync::Lazy; + +use crate::abi::NcclProfilerEventState; +use crate::pool::INVALID_IDX; +use crate::role::RoleRanks; + +pub const MAX_CHANNELS: usize = 32; +pub const MAX_STEPS_PER_OP: usize = 64; +pub const MAX_FUNC_NAME: usize = 32; +pub const MAX_PENDING_PER_COLL: usize = 128; + +pub const EVT_COLL: u8 = 1; +pub const EVT_PROXY_OP: u8 = 2; +pub const EVT_PROXY_STEP: u8 = 3; +pub const EVT_NET_PLUGIN: u8 = 4; + +pub const PROXY_STEP_STATE_SLOTS: usize = 5; + +static ORIGIN: Lazy = Lazy::new(Instant::now); + +#[derive(Debug, Default)] +pub struct EventCounters { + pub coll: AtomicU64, + pub proxy_op: AtomicU64, + pub proxy_step: AtomicU64, + pub net_plugin: AtomicU64, + pub rows_written: AtomicU64, + pub pool_exhausted: AtomicU64, + pub write_errors: AtomicU64, +} + +impl EventCounters { + pub const fn new() -> Self { + Self { + coll: AtomicU64::new(0), + proxy_op: AtomicU64::new(0), + proxy_step: AtomicU64::new(0), + net_plugin: AtomicU64::new(0), + rows_written: AtomicU64::new(0), + pool_exhausted: AtomicU64::new(0), + write_errors: AtomicU64::new(0), + } + } +} + +#[inline] +pub fn now_ns() -> i64 { + ORIGIN.elapsed().as_nanos() as i64 +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct CollContext { + pub rank: i32, + pub comm_hash: u64, + pub seq: u64, + pub func: [u8; MAX_FUNC_NAME], + pub func_len: u8, +} + +impl CollContext { + pub fn func_str(&self) -> &str { + let n = self.func_len as usize; + std::str::from_utf8(&self.func[..n.min(MAX_FUNC_NAME)]).unwrap_or("unknown") + } +} + +pub fn copy_func_name(dst: &mut CollContext, src: Option<&str>) { + let s = src.unwrap_or("unknown"); + let bytes = s.as_bytes(); + let n = bytes.len().min(MAX_FUNC_NAME); + dst.func[..n].copy_from_slice(&bytes[..n]); + dst.func_len = n as u8; +} + +#[derive(Debug, Default)] +pub struct ProxyStepData { + pub step: i32, + pub is_send: i32, + pub start_ns: i64, + pub stop_ns: i64, + pub state_ts: [i64; PROXY_STEP_STATE_SLOTS], +} + +#[derive(Debug)] +pub struct ProxyOpData { + pub channel_id: i32, + pub peer: i32, + pub is_send: i32, + pub n_steps: i32, + pub trans_bytes: u64, + pub coll: CollContext, + pub start_ns: i64, + pub stop_ns: i64, + pub steps: [ProxyStepData; MAX_STEPS_PER_OP], + pub step_count: u16, + pub parent_coll: u32, +} + +impl Default for ProxyOpData { + fn default() -> Self { + Self { + channel_id: 0, + peer: 0, + is_send: 0, + n_steps: 0, + trans_bytes: 0, + coll: CollContext::default(), + start_ns: 0, + stop_ns: 0, + steps: std::array::from_fn(|_| ProxyStepData::default()), + step_count: 0, + parent_coll: INVALID_IDX, + } + } +} + +#[repr(C)] +pub struct CollSlot { + pub tag: u8, + pub ctx: CollContext, + pub start_ns: i64, + pub stop_ns: i64, + pub send_ref: [u32; MAX_CHANNELS], + pub recv_ref: [u32; MAX_CHANNELS], + pub pending: [CompletedProxyOp; MAX_PENDING_PER_COLL], + pub pending_len: u16, +} + +impl CollSlot { + pub fn new(ctx: CollContext, start_ns: i64) -> Self { + Self { + tag: EVT_COLL, + ctx, + start_ns, + stop_ns: 0, + send_ref: [INVALID_IDX; MAX_CHANNELS], + recv_ref: [INVALID_IDX; MAX_CHANNELS], + pending: std::array::from_fn(|_| CompletedProxyOp::default()), + pending_len: 0, + } + } + + pub fn register_proxy(&mut self, channel: usize, is_send: i32, idx: u32) { + if channel >= MAX_CHANNELS { + return; + } + if is_send != 0 { + self.send_ref[channel] = idx; + } else { + self.recv_ref[channel] = idx; + } + } + + pub fn push_pending(&mut self, row: CompletedProxyOp) -> bool { + let n = self.pending_len as usize; + if n >= MAX_PENDING_PER_COLL { + return false; + } + self.pending[n] = row; + self.pending_len += 1; + true + } +} + +#[repr(C)] +pub struct ProxyOpSlot { + pub tag: u8, + pub op: ProxyOpData, +} + +#[repr(C)] +pub struct ProxyStepSlot { + pub tag: u8, + pub step: ProxyStepData, + pub parent_proxy: u32, +} + +#[repr(C)] +pub struct NetPluginSlot { + pub tag: u8, + pub start_ns: i64, + pub stop_ns: i64, + pub rank: i32, + pub device: i32, + pub qp_num: i32, + pub wr_id: u64, + pub opcode: i32, + pub length: u64, +} + +#[inline] +pub fn proxy_step_state_index(state: NcclProfilerEventState) -> Option { + use NcclProfilerEventState::*; + match state { + ProxyStepSendGpuWait => Some(0), + ProxyStepSendWait => Some(1), + ProxyStepRecvWait => Some(2), + ProxyStepRecvFlushWait => Some(3), + ProxyStepRecvGpuWait => Some(4), + _ => None, + } +} + +impl ProxyStepData { + pub fn wait_deltas_ns(&self) -> (i64, i64, i64, i64) { + let base = self.start_ns; + let gpu = delta(base, self.state_ts[0]); + let send = delta(self.state_ts[0], self.state_ts[1]); + let recv = delta(self.state_ts[1], self.state_ts[2]); + let flush = delta(self.state_ts[2], self.state_ts[3]); + (gpu, send, recv, flush) + } +} + +#[inline] +fn delta(from: i64, to: i64) -> i64 { + if from == 0 || to == 0 || to < from { + 0 + } else { + to - from + } +} + +impl ProxyOpData { + pub fn push_step(&mut self, step: ProxyStepData) -> bool { + let n = self.step_count as usize; + if n >= MAX_STEPS_PER_OP { + return false; + } + self.steps[n] = step; + self.step_count += 1; + true + } + + pub fn aggregate_waits(&self) -> (i64, i64, i64, i64) { + let mut gpu = 0i64; + let mut send = 0i64; + let mut recv = 0i64; + let mut flush = 0i64; + for s in &self.steps[..self.step_count as usize] { + let (g, se, r, f) = s.wait_deltas_ns(); + gpu += g; + send += se; + recv += r; + flush += f; + } + (gpu, send, recv, flush) + } + + pub fn into_completed(self) -> CompletedProxyOp { + let (send_gpu_wait_ns, send_wait_ns, recv_wait_ns, recv_flush_wait_ns) = + self.aggregate_waits(); + CompletedProxyOp { + ts_ns: if self.stop_ns != 0 { + self.stop_ns + } else { + now_ns() + }, + rank: self.coll.rank, + roles: crate::role::snapshot(), + comm_hash: self.coll.comm_hash, + coll_func: self.coll.func, + coll_func_len: self.coll.func_len, + seq: self.coll.seq, + channel_id: self.channel_id, + peer: self.peer, + is_send: self.is_send, + n_steps: self.n_steps, + trans_bytes: self.trans_bytes, + send_gpu_wait_ns, + send_wait_ns, + recv_wait_ns, + recv_flush_wait_ns, + } + } +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct CompletedProxyOp { + pub ts_ns: i64, + pub rank: i32, + pub roles: RoleRanks, + pub comm_hash: u64, + pub coll_func: [u8; MAX_FUNC_NAME], + pub coll_func_len: u8, + pub seq: u64, + pub channel_id: i32, + pub peer: i32, + pub is_send: i32, + pub n_steps: i32, + pub trans_bytes: u64, + pub send_gpu_wait_ns: i64, + pub send_wait_ns: i64, + pub recv_wait_ns: i64, + pub recv_flush_wait_ns: i64, +} + +impl CompletedProxyOp { + pub fn func_str(&self) -> &str { + let n = self.coll_func_len as usize; + std::str::from_utf8(&self.coll_func[..n.min(MAX_FUNC_NAME)]).unwrap_or("unknown") + } +} + +#[inline] +pub unsafe fn event_type(handle: *mut std::ffi::c_void) -> u8 { + if handle.is_null() { + return 0; + } + *(handle as *const u8) +} diff --git a/probing/extensions/nccl-profiler/src/lib.rs b/probing/extensions/nccl-profiler/src/lib.rs new file mode 100644 index 00000000..739ccaa5 --- /dev/null +++ b/probing/extensions/nccl-profiler/src/lib.rs @@ -0,0 +1,48 @@ +//! Probing NCCL profiler plugin — exports `ncclProfiler_v3` on Linux (NCCL ≥ 2.26). + +#![allow(clippy::missing_safety_doc)] +#![cfg_attr(not(target_os = "linux"), allow(dead_code))] + +mod abi; +mod events; +mod pool; +mod role; +mod tables; +mod writer; + +#[cfg(target_os = "linux")] +mod state; + +#[cfg(target_os = "linux")] +mod plugin; + +pub use tables::{net_qp_schema, proxy_ops_schema, NET_QP_FILE, PROXY_OPS_FILE}; + +#[cfg(target_os = "linux")] +mod export { + use std::os::raw::c_char; + + use crate::abi::NcclProfilerV3; + use crate::plugin::{ + probing_profiler_finalize, probing_profiler_init, probing_profiler_record_state, + probing_profiler_start_event, probing_profiler_stop_event, + }; + + static PLUGIN_NAME: &[u8] = b"probing-nccl-profiler\0"; + + #[no_mangle] + pub static ncclProfiler_v3: NcclProfilerV3 = NcclProfilerV3 { + name: PLUGIN_NAME.as_ptr() as *const c_char, + init: probing_profiler_init, + start_event: probing_profiler_start_event, + stop_event: probing_profiler_stop_event, + record_event_state: probing_profiler_record_state, + finalize: probing_profiler_finalize, + }; +} + +#[cfg(not(target_os = "linux"))] +mod stub { + //! Non-Linux builds omit the NCCL plugin symbol (dev machines / CI without NCCL). + pub const BUILD_NOTE: &str = "probing-nccl-profiler: plugin symbol exported on Linux only"; +} diff --git a/probing/extensions/nccl-profiler/src/plugin.rs b/probing/extensions/nccl-profiler/src/plugin.rs new file mode 100644 index 00000000..78794c9c --- /dev/null +++ b/probing/extensions/nccl-profiler/src/plugin.rs @@ -0,0 +1,186 @@ +//! NCCL profiler plugin callbacks (`ncclProfiler_v3`). + +use std::ffi::c_void; +use std::sync::atomic::Ordering; +use std::sync::OnceLock; + +use crate::abi::{ + nccl_success, NcclProfilerEventDescrV3, NcclProfilerEventStateArgsV3, NcclProfilerEventStateV3, + NcclResult, DEFAULT_ACTIVATION_MASK, +}; +use crate::state::PluginState; + +fn instance() -> &'static PluginState { + static INSTANCE: OnceLock = OnceLock::new(); + INSTANCE.get_or_init(PluginState::new) +} + +pub unsafe extern "C" fn probing_profiler_init( + context: *mut *mut c_void, + mask: *mut i32, +) -> NcclResult { + if !mask.is_null() { + let env = std::env::var("NCCL_PROFILE_EVENT_MASK") + .ok() + .and_then(|s| s.parse::().ok()) + .unwrap_or(DEFAULT_ACTIVATION_MASK); + *mask = env; + } + + let state = instance(); + if !context.is_null() { + *context = state as *const PluginState as *mut c_void; + } + + eprintln!( + "[probing-nccl-profiler] init ok (mask={})", + if mask.is_null() { 0 } else { *mask } + ); + nccl_success() +} + +pub unsafe extern "C" fn probing_profiler_start_event( + context: *mut c_void, + handle: *mut *mut c_void, + descr: *mut NcclProfilerEventDescrV3, +) -> NcclResult { + if descr.is_null() || handle.is_null() { + return nccl_success(); + } + let state = if context.is_null() { + instance() + } else { + &*(context as *const PluginState) + }; + state.with_mut(|inner| inner.start_event(handle, &*descr)); + nccl_success() +} + +pub unsafe extern "C" fn probing_profiler_stop_event(handle: *mut c_void) -> NcclResult { + instance().with_mut(|inner| inner.stop_event(handle)); + nccl_success() +} + +pub unsafe extern "C" fn probing_profiler_record_state( + handle: *mut c_void, + state: NcclProfilerEventStateV3, + args: *mut NcclProfilerEventStateArgsV3, +) -> NcclResult { + instance().with_mut(|inner| inner.record_state(handle, state, args)); + nccl_success() +} + +pub unsafe extern "C" fn probing_profiler_finalize(context: *mut c_void) -> NcclResult { + let _ = context; + let state = instance(); + let (coll, proxy_op, proxy_step, net, rows, pool_ex, write_err) = state.with_mut(|inner| { + inner.finalize_flush(); + let c = &inner.counters; + ( + c.coll.load(Ordering::Relaxed), + c.proxy_op.load(Ordering::Relaxed), + c.proxy_step.load(Ordering::Relaxed), + c.net_plugin.load(Ordering::Relaxed), + c.rows_written.load(Ordering::Relaxed), + c.pool_exhausted.load(Ordering::Relaxed), + c.write_errors.load(Ordering::Relaxed), + ) + }); + eprintln!( + "[probing-nccl-profiler] finalize: coll={coll} proxy_op={proxy_op} proxy_step={proxy_step} net={net} rows={rows} pool_exhausted={pool_ex} write_errors={write_err}" + ); + nccl_success() +} + +#[cfg(test)] +#[cfg(target_os = "linux")] +mod tests { + use super::*; + use crate::abi::NcclProfilerEventBodyV3; + use crate::abi::NCCL_PROFILE_PROXY_OP; + use std::sync::atomic::Ordering; + + #[test] + fn init_sets_default_mask() { + let mut ctx: *mut c_void = std::ptr::null_mut(); + let mut mask = 0i32; + unsafe { + assert_eq!(probing_profiler_init(&mut ctx, &mut mask), 0); + assert_eq!(mask, DEFAULT_ACTIVATION_MASK); + probing_profiler_finalize(ctx); + } + } + + #[test] + fn proxy_op_with_parent_coll_batches_at_coll_stop() { + let mut ctx: *mut c_void = std::ptr::null_mut(); + let mut mask = 0i32; + unsafe { + probing_profiler_init(&mut ctx, &mut mask).unwrap(); + } + + let base = std::env::temp_dir().join(format!("probing_nccl_p2_{}", std::process::id())); + let _ = std::fs::remove_dir_all(&base); + std::fs::create_dir_all(&base).unwrap(); + std::env::set_var("PROBING_DATA_DIR", &base); + + let mut coll_h: *mut c_void = std::ptr::null_mut(); + let mut proxy_h: *mut c_void = std::ptr::null_mut(); + + let mut coll_descr = NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_COLL as u8, + parent_obj: std::ptr::null_mut(), + rank: 3, + body: NcclProfilerEventBodyV3 { + coll: { + let mut c: crate::abi::NcclProfilerCollDescr = unsafe { std::mem::zeroed() }; + c.comm_hash = 99; + c.seq_number = 1; + c.func = b"AllReduce\0".as_ptr() as *const _; + c.n_max_channels = 4; + c + }, + }, + }; + + unsafe { + probing_profiler_start_event(ctx, &mut coll_h, &mut coll_descr); + + let mut proxy_descr = NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_PROXY_OP as u8, + parent_obj: coll_h, + rank: 3, + body: NcclProfilerEventBodyV3 { + proxy_op: NcclProfilerProxyOpDescr { + pid: std::process::id() as i32, + channel_id: 0, + peer: 1, + n_steps: 2, + chunk_size: 1024, + is_send: 1, + }, + }, + }; + probing_profiler_start_event(ctx, &mut proxy_h, &mut proxy_descr); + probing_profiler_stop_event(proxy_h); + probing_profiler_stop_event(coll_h); + probing_profiler_finalize(ctx); + } + + let state = instance(); + let rows = state.with_mut(|inner| inner.counters.rows_written.load(Ordering::Relaxed)); + assert!(rows >= 1, "expected batch flush on coll stop"); + let _ = std::fs::remove_dir_all(&base); + } + + trait NcclResultExt { + fn unwrap(self) -> NcclResult; + } + + impl NcclResultExt for NcclResult { + fn unwrap(self) -> NcclResult { + assert_eq!(self, 0); + self + } + } +} diff --git a/probing/extensions/nccl-profiler/src/pool.rs b/probing/extensions/nccl-profiler/src/pool.rs new file mode 100644 index 00000000..159f45bf --- /dev/null +++ b/probing/extensions/nccl-profiler/src/pool.rs @@ -0,0 +1,95 @@ +//! Fixed-size slot pools (no heap alloc on NCCL callback hot path). + +use std::mem::MaybeUninit; + +pub const INVALID_IDX: u32 = u32::MAX; + +pub struct SlotPool { + slots: Vec>, + free: Vec, +} + +struct Slot { + value: MaybeUninit, + live: bool, +} + +impl SlotPool { + pub fn with_capacity(cap: usize) -> Self { + let mut free: Vec = (0..cap as u32).collect(); + free.reverse(); + Self { + slots: (0..cap) + .map(|_| Slot { + value: MaybeUninit::uninit(), + live: false, + }) + .collect(), + free, + } + } + + pub fn alloc(&mut self, init: impl FnOnce() -> T) -> Option<(*mut T, u32)> { + let idx = self.free.pop()?; + let slot = &mut self.slots[idx as usize]; + debug_assert!(!slot.live); + slot.value.write(init()); + slot.live = true; + let ptr = slot.value.as_mut_ptr(); + Some((ptr, idx)) + } + + pub fn index_of(&self, ptr: *mut T) -> Option { + for (i, slot) in self.slots.iter().enumerate() { + if slot.live && std::ptr::eq(slot.value.as_ptr(), ptr) { + return Some(i as u32); + } + } + None + } + + pub fn get_mut(&mut self, idx: u32) -> Option<&mut T> { + let slot = self.slots.get_mut(idx as usize)?; + if slot.live { + Some(unsafe { slot.value.assume_init_mut() }) + } else { + None + } + } + + pub fn free_ptr(&mut self, ptr: *mut T) { + if let Some(idx) = self.index_of(ptr) { + self.free_idx(idx); + } + } + + pub fn free_idx(&mut self, idx: u32) { + let slot = match self.slots.get_mut(idx as usize) { + Some(s) if s.live => s, + _ => return, + }; + slot.live = false; + unsafe { slot.value.assume_init_drop() }; + self.free.push(idx); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[derive(Debug)] + struct X(u32); + + #[test] + fn alloc_free_roundtrip() { + let mut pool = SlotPool::with_capacity(4); + let (p, idx) = pool.alloc(|| X(7)).unwrap(); + assert_eq!(unsafe { (*p).0 }, 7); + assert_eq!(idx, 0); + pool.free_idx(idx); + let (p2, idx2) = pool.alloc(|| X(9)).unwrap(); + assert_eq!(idx2, 0); + assert_eq!(unsafe { (*p2).0 }, 9); + } +} diff --git a/probing/extensions/nccl-profiler/src/role.rs b/probing/extensions/nccl-profiler/src/role.rs new file mode 100644 index 00000000..b5bfd38a --- /dev/null +++ b/probing/extensions/nccl-profiler/src/role.rs @@ -0,0 +1,63 @@ +//! Parallel role ranks from training env (aligned with ``python.probing.parallel``). + +#[derive(Clone, Copy, Debug, Default)] +pub struct RoleRanks { + pub tp_rank: i32, + pub pp_rank: i32, + pub dp_rank: i32, +} + +fn read_env_i32(keys: &[&str]) -> i32 { + for key in keys { + if let Ok(raw) = std::env::var(key) { + if let Ok(v) = raw.trim().parse::() { + if v >= 0 { + return v; + } + } + } + } + -1 +} + +pub fn snapshot() -> RoleRanks { + RoleRanks { + tp_rank: read_env_i32(&["TENSOR_MODEL_PARALLEL_RANK", "TP_RANK", "PROBING_TP_RANK"]), + pp_rank: read_env_i32(&["PIPELINE_MODEL_PARALLEL_RANK", "PP_RANK", "PROBING_PP_RANK"]), + dp_rank: read_env_i32(&["DATA_PARALLEL_RANK", "DP_RANK", "PROBING_DP_RANK"]), + } +} + +#[cfg(test)] +mod tests { + use super::snapshot; + + #[test] + fn default_role_ranks_are_negative() { + for key in [ + "TENSOR_MODEL_PARALLEL_RANK", + "TP_RANK", + "PROBING_TP_RANK", + "PIPELINE_MODEL_PARALLEL_RANK", + "PP_RANK", + "PROBING_PP_RANK", + "DATA_PARALLEL_RANK", + "DP_RANK", + "PROBING_DP_RANK", + ] { + std::env::remove_var(key); + } + let r = snapshot(); + assert_eq!(r.tp_rank, -1); + assert_eq!(r.pp_rank, -1); + assert_eq!(r.dp_rank, -1); + } + + #[test] + fn snapshot_reads_tp_rank_env() { + std::env::set_var("TP_RANK", "3"); + let r = snapshot(); + assert_eq!(r.tp_rank, 3); + std::env::remove_var("TP_RANK"); + } +} diff --git a/probing/extensions/nccl-profiler/src/state.rs b/probing/extensions/nccl-profiler/src/state.rs new file mode 100644 index 00000000..0ac889ee --- /dev/null +++ b/probing/extensions/nccl-profiler/src/state.rs @@ -0,0 +1,397 @@ +//! Plugin runtime: slot pools, event hierarchy, batch flush. + +use std::ffi::{c_char, c_void}; +use std::sync::atomic::Ordering; + +use parking_lot::Mutex; + +use crate::abi::net_ib_v1::{net_plugin_type, read_ib_qp, NCCL_PROFILER_NET_TYPE_IB}; +use crate::abi::{ + NcclProfilerEventDescrV3, NcclProfilerEventStateArgsV3, NcclProfilerEventStateV3, + NCCL_PROFILE_COLL, NCCL_PROFILE_NET_PLUGIN, NCCL_PROFILE_PROXY_OP, NCCL_PROFILE_PROXY_STEP, +}; +use crate::events::{ + copy_func_name, event_type, now_ns, proxy_step_state_index, CollContext, CollSlot, + CompletedProxyOp, EventCounters, NetPluginSlot, ProxyOpData, ProxyOpSlot, ProxyStepData, + ProxyStepSlot, EVT_COLL, EVT_NET_PLUGIN, EVT_PROXY_OP, EVT_PROXY_STEP, MAX_CHANNELS, +}; +use crate::pool::{SlotPool, INVALID_IDX}; +use crate::writer::{CompletedNetQp, NcclWriter}; + +const MAX_COLL_SLOTS: usize = 256; +const MAX_PROXY_OP_SLOTS: usize = 4096; +const MAX_PROXY_STEP_SLOTS: usize = 16384; +const MAX_NET_SLOTS: usize = 4096; + +pub struct PluginState { + inner: Mutex, +} + +pub struct PluginStateInner { + pub counters: EventCounters, + pub coll_pool: SlotPool, + pub proxy_pool: SlotPool, + pub step_pool: SlotPool, + pub net_pool: SlotPool, + pub writer: NcclWriter, +} + +impl PluginState { + pub fn new() -> Self { + Self { + inner: Mutex::new(PluginStateInner { + counters: EventCounters::new(), + coll_pool: SlotPool::with_capacity(MAX_COLL_SLOTS), + proxy_pool: SlotPool::with_capacity(MAX_PROXY_OP_SLOTS), + step_pool: SlotPool::with_capacity(MAX_PROXY_STEP_SLOTS), + net_pool: SlotPool::with_capacity(MAX_NET_SLOTS), + writer: NcclWriter::new(), + }), + } + } + + pub fn with_mut(&self, f: F) -> R + where + F: FnOnce(&mut PluginStateInner) -> R, + { + let mut guard = self.inner.lock(); + f(&mut *guard) + } +} + +fn cstr_opt(p: *const c_char) -> Option<&'static str> { + if p.is_null() { + return None; + } + unsafe { std::ffi::CStr::from_ptr(p) }.to_str().ok() +} + +fn read_coll_context(descr: &NcclProfilerEventDescrV3) -> CollContext { + let c = unsafe { descr.body.coll }; + let mut ctx = CollContext { + rank: descr.rank, + comm_hash: c.comm_hash, + seq: c.seq_number, + func: [0; crate::events::MAX_FUNC_NAME], + func_len: 0, + }; + copy_func_name(&mut ctx, cstr_opt(c.func)); + ctx +} + +fn coll_context_fallback(descr: &NcclProfilerEventDescrV3) -> CollContext { + let mut ctx = CollContext { + rank: descr.rank, + ..Default::default() + }; + copy_func_name(&mut ctx, None); + ctx +} + +impl PluginStateInner { + pub fn start_event(&mut self, handle: *mut *mut c_void, descr: &NcclProfilerEventDescrV3) { + let t = descr.type_ as i32; + match t { + x if x == NCCL_PROFILE_COLL => { + self.counters.coll.fetch_add(1, Ordering::Relaxed); + let ctx = read_coll_context(descr); + let ts = now_ns(); + if let Some((ptr, _idx)) = self.coll_pool.alloc(|| CollSlot::new(ctx, ts)) { + *handle = ptr as *mut c_void; + } else { + self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); + *handle = std::ptr::null_mut(); + } + } + x if x == NCCL_PROFILE_PROXY_OP => { + self.counters.proxy_op.fetch_add(1, Ordering::Relaxed); + let p = unsafe { descr.body.proxy_op }; + let channel = p.channel_id as usize; + let (coll, parent_coll) = if descr.parent_obj.is_null() { + (coll_context_fallback(descr), INVALID_IDX) + } else if let Some(coll_idx) = + self.coll_pool.index_of(descr.parent_obj as *mut CollSlot) + { + let coll_slot = self.coll_pool.get_mut(coll_idx).unwrap(); + (coll_slot.ctx, coll_idx) + } else { + (coll_context_fallback(descr), INVALID_IDX) + }; + + if let Some((ptr, proxy_idx)) = self.proxy_pool.alloc(|| ProxyOpSlot { + tag: EVT_PROXY_OP, + op: ProxyOpData { + channel_id: p.channel_id as i32, + peer: p.peer, + is_send: p.is_send, + n_steps: p.n_steps, + coll, + start_ns: now_ns(), + parent_coll, + ..Default::default() + }, + }) { + if parent_coll != INVALID_IDX { + if let Some(coll_slot) = self.coll_pool.get_mut(parent_coll) { + coll_slot.register_proxy(channel, p.is_send, proxy_idx); + } + } + *handle = ptr as *mut c_void; + } else { + self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); + *handle = std::ptr::null_mut(); + } + } + x if x == NCCL_PROFILE_PROXY_STEP => { + self.counters.proxy_step.fetch_add(1, Ordering::Relaxed); + let parent_proxy = if descr.parent_obj.is_null() { + INVALID_IDX + } else { + self.proxy_pool + .index_of(descr.parent_obj as *mut ProxyOpSlot) + .unwrap_or(INVALID_IDX) + }; + let is_send = if parent_proxy != INVALID_IDX { + self.proxy_pool + .get_mut(parent_proxy) + .map(|s| s.op.is_send) + .unwrap_or(0) + } else { + 0 + }; + let step_id = unsafe { descr.body.proxy_step.step }; + if let Some((ptr, _)) = self.step_pool.alloc(|| ProxyStepSlot { + tag: EVT_PROXY_STEP, + parent_proxy, + step: ProxyStepData { + step: step_id, + is_send, + start_ns: now_ns(), + ..Default::default() + }, + }) { + *handle = ptr as *mut c_void; + } else { + self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); + *handle = std::ptr::null_mut(); + } + } + x if x == NCCL_PROFILE_NET_PLUGIN => { + self.counters.net_plugin.fetch_add(1, Ordering::Relaxed); + let id = unsafe { descr.body.net_plugin.id }; + let mut device = 0i32; + let mut qp_num = 0i32; + let mut wr_id = 0u64; + let mut opcode = 0i32; + let mut length = 0u64; + if net_plugin_type(id) == NCCL_PROFILER_NET_TYPE_IB { + if let Some(qp) = unsafe { read_ib_qp(descr.body.net_plugin.data) } { + device = qp.device; + qp_num = qp.qp_num; + wr_id = qp.wr_id; + opcode = qp.opcode; + length = qp.length as u64; + } + } + if let Some((ptr, _)) = self.net_pool.alloc(|| NetPluginSlot { + tag: EVT_NET_PLUGIN, + start_ns: now_ns(), + rank: descr.rank, + device, + qp_num, + wr_id, + opcode, + length, + stop_ns: 0, + }) { + *handle = ptr as *mut c_void; + } else { + self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); + *handle = std::ptr::null_mut(); + } + } + _ => *handle = std::ptr::null_mut(), + } + } + + pub fn stop_event(&mut self, handle: *mut c_void) { + if handle.is_null() { + return; + } + match event_type(handle) { + EVT_PROXY_STEP => { + let step_idx = self + .step_pool + .index_of(handle as *mut ProxyStepSlot) + .unwrap_or(INVALID_IDX); + if step_idx == INVALID_IDX { + return; + } + let (parent_proxy, step) = { + let slot = self.step_pool.get_mut(step_idx).unwrap(); + slot.step.stop_ns = now_ns(); + (slot.parent_proxy, slot.step) + }; + if parent_proxy != INVALID_IDX { + if let Some(proxy) = self.proxy_pool.get_mut(parent_proxy) { + if !proxy.op.push_step(step) { + self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); + } + } + } + self.step_pool.free_idx(step_idx); + } + EVT_PROXY_OP => { + let proxy_idx = self + .proxy_pool + .index_of(handle as *mut ProxyOpSlot) + .unwrap_or(INVALID_IDX); + if proxy_idx == INVALID_IDX { + return; + } + let (parent_coll, row) = { + let slot = self.proxy_pool.get_mut(proxy_idx).unwrap(); + slot.op.stop_ns = now_ns(); + let parent = slot.op.parent_coll; + let row = std::mem::take(&mut slot.op).into_completed(); + (parent, row) + }; + self.flush_proxy_row(parent_coll, row); + if parent_coll != INVALID_IDX { + if let Some(coll) = self.coll_pool.get_mut(parent_coll) { + let ch = row.channel_id as usize; + if row.is_send != 0 { + if ch < MAX_CHANNELS { + coll.send_ref[ch] = INVALID_IDX; + } + } else if ch < MAX_CHANNELS { + coll.recv_ref[ch] = INVALID_IDX; + } + } + } + self.proxy_pool.free_idx(proxy_idx); + } + EVT_COLL => { + let coll_idx = self + .coll_pool + .index_of(handle as *mut CollSlot) + .unwrap_or(INVALID_IDX); + if coll_idx == INVALID_IDX { + return; + } + let pending: Vec = { + let slot = self.coll_pool.get_mut(coll_idx).unwrap(); + slot.stop_ns = now_ns(); + slot.pending[..slot.pending_len as usize].to_vec() + }; + self.writer.flush_proxy_ops(&pending, &self.counters); + self.coll_pool.free_idx(coll_idx); + } + EVT_NET_PLUGIN => { + let net_idx = self + .net_pool + .index_of(handle as *mut NetPluginSlot) + .unwrap_or(INVALID_IDX); + if net_idx == INVALID_IDX { + return; + } + let row = { + let slot = self.net_pool.get_mut(net_idx).unwrap(); + slot.stop_ns = now_ns(); + CompletedNetQp { + ts_ns: slot.stop_ns, + rank: slot.rank, + device: slot.device, + qp_num: slot.qp_num, + wr_id: slot.wr_id, + opcode: slot.opcode, + length: slot.length, + duration_ns: slot.stop_ns.saturating_sub(slot.start_ns), + } + }; + self.writer.append_net_qp(&row, &self.counters); + self.net_pool.free_idx(net_idx); + } + _ => {} + } + } + + fn flush_proxy_row(&mut self, parent_coll: u32, row: CompletedProxyOp) { + if parent_coll != INVALID_IDX { + if let Some(coll) = self.coll_pool.get_mut(parent_coll) { + if coll.push_pending(row) { + return; + } + // pending full — flush coll batch early + let pending: Vec = + coll.pending[..coll.pending_len as usize].to_vec(); + coll.pending_len = 0; + self.writer.flush_proxy_ops(&pending, &self.counters); + if !coll.push_pending(row) { + self.writer.append_proxy_op(&row, &self.counters); + } + return; + } + } + self.writer.append_proxy_op(&row, &self.counters); + } + + pub fn record_state( + &mut self, + handle: *mut c_void, + state: NcclProfilerEventStateV3, + args: *const NcclProfilerEventStateArgsV3, + ) { + if handle.is_null() { + return; + } + let ts = now_ns(); + match event_type(handle) { + EVT_PROXY_STEP => { + let step_idx = self + .step_pool + .index_of(handle as *mut ProxyStepSlot) + .unwrap_or(INVALID_IDX); + if step_idx == INVALID_IDX { + return; + } + let slot = self.step_pool.get_mut(step_idx).unwrap(); + if let Some(idx) = proxy_step_state_index(state) { + slot.step.state_ts[idx] = ts; + } + } + EVT_PROXY_OP => { + let proxy_idx = self + .proxy_pool + .index_of(handle as *mut ProxyOpSlot) + .unwrap_or(INVALID_IDX); + if proxy_idx == INVALID_IDX { + return; + } + let slot = self.proxy_pool.get_mut(proxy_idx).unwrap(); + if !args.is_null() { + let a = unsafe { &*args }; + slot.op.trans_bytes = a.proxy_op.trans_size as u64; + if a.proxy_op.steps > 0 { + slot.op.n_steps = a.proxy_op.steps; + } + } + } + _ => {} + } + } + + pub fn finalize_flush(&mut self) { + for idx in 0..MAX_COLL_SLOTS as u32 { + if let Some(coll) = self.coll_pool.get_mut(idx) { + if coll.pending_len == 0 { + continue; + } + let pending: Vec = + coll.pending[..coll.pending_len as usize].to_vec(); + self.writer.flush_proxy_ops(&pending, &self.counters); + coll.pending_len = 0; + } + } + } +} diff --git a/probing/extensions/nccl-profiler/src/tables.rs b/probing/extensions/nccl-profiler/src/tables.rs new file mode 100644 index 00000000..06282783 --- /dev/null +++ b/probing/extensions/nccl-profiler/src/tables.rs @@ -0,0 +1,39 @@ +//! Memtable schemas for `nccl.proxy_ops` and `nccl.net_qp`. + +use probing_memtable::{DType, Schema}; + +pub const PROXY_OPS_FILE: &str = "nccl.proxy_ops"; +pub const NET_QP_FILE: &str = "nccl.net_qp"; + +pub fn proxy_ops_schema() -> Schema { + Schema::new() + .col("ts", DType::I64) + .col("rank", DType::I32) + .col("tp_rank", DType::I32) + .col("pp_rank", DType::I32) + .col("dp_rank", DType::I32) + .col("comm_hash", DType::U64) + .col("coll_func", DType::Str) + .col("seq", DType::U64) + .col("channel_id", DType::I32) + .col("peer", DType::I32) + .col("is_send", DType::I32) + .col("n_steps", DType::I32) + .col("trans_bytes", DType::U64) + .col("send_gpu_wait_ns", DType::I64) + .col("send_wait_ns", DType::I64) + .col("recv_wait_ns", DType::I64) + .col("recv_flush_wait_ns", DType::I64) +} + +pub fn net_qp_schema() -> Schema { + Schema::new() + .col("ts", DType::I64) + .col("rank", DType::I32) + .col("device", DType::I32) + .col("qp_num", DType::I32) + .col("wr_id", DType::U64) + .col("opcode", DType::I32) + .col("length", DType::U64) + .col("duration_ns", DType::I64) +} diff --git a/probing/extensions/nccl-profiler/src/writer.rs b/probing/extensions/nccl-profiler/src/writer.rs new file mode 100644 index 00000000..8bd85679 --- /dev/null +++ b/probing/extensions/nccl-profiler/src/writer.rs @@ -0,0 +1,192 @@ +//! Mmap writer: batch flush, surfaced errors (no silent drop). + +use std::sync::atomic::{AtomicBool, Ordering}; + +use probing_memtable::discover::ExposedTable; +use probing_memtable::Value; + +use crate::events::{CompletedProxyOp, EventCounters}; +use crate::tables::{net_qp_schema, proxy_ops_schema, NET_QP_FILE, PROXY_OPS_FILE}; + +const CHUNK_SIZE: u32 = 16 * 1024; +const NUM_CHUNKS: u32 = 32; + +pub struct CompletedNetQp { + pub ts_ns: i64, + pub rank: i32, + pub device: i32, + pub qp_num: i32, + pub wr_id: u64, + pub opcode: i32, + pub length: u64, + pub duration_ns: i64, +} + +pub struct NcclWriter { + proxy_table: Option, + net_table: Option, + proxy_init_failed: AtomicBool, + net_init_failed: AtomicBool, + logged_proxy_init: AtomicBool, + logged_net_init: AtomicBool, +} + +impl NcclWriter { + pub fn new() -> Self { + Self { + proxy_table: None, + net_table: None, + proxy_init_failed: AtomicBool::new(false), + net_init_failed: AtomicBool::new(false), + logged_proxy_init: AtomicBool::new(false), + logged_net_init: AtomicBool::new(false), + } + } + + fn open_proxy(&mut self) -> Result<&mut ExposedTable, ()> { + if self.proxy_table.is_none() && !self.proxy_init_failed.load(Ordering::Relaxed) { + match ExposedTable::create(PROXY_OPS_FILE, &proxy_ops_schema(), CHUNK_SIZE, NUM_CHUNKS) + { + Ok(t) => self.proxy_table = Some(t), + Err(e) => { + self.proxy_init_failed.store(true, Ordering::Relaxed); + if self + .logged_proxy_init + .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) + .is_ok() + { + eprintln!("[probing-nccl-profiler] failed to open {PROXY_OPS_FILE}: {e}"); + } + } + } + } + self.proxy_table.as_mut().ok_or(()) + } + + fn open_net(&mut self) -> Result<&mut ExposedTable, ()> { + if self.net_table.is_none() && !self.net_init_failed.load(Ordering::Relaxed) { + match ExposedTable::create(NET_QP_FILE, &net_qp_schema(), CHUNK_SIZE, NUM_CHUNKS) { + Ok(t) => self.net_table = Some(t), + Err(e) => { + self.net_init_failed.store(true, Ordering::Relaxed); + if self + .logged_net_init + .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) + .is_ok() + { + eprintln!("[probing-nccl-profiler] failed to open {NET_QP_FILE}: {e}"); + } + } + } + } + self.net_table.as_mut().ok_or(()) + } + + pub fn append_proxy_op(&mut self, row: &CompletedProxyOp, counters: &EventCounters) -> bool { + let Ok(table) = self.open_proxy() else { + counters.write_errors.fetch_add(1, Ordering::Relaxed); + return false; + }; + table.push_row(&[ + Value::I64(row.ts_ns), + Value::I32(row.rank), + Value::I32(row.roles.tp_rank), + Value::I32(row.roles.pp_rank), + Value::I32(row.roles.dp_rank), + Value::U64(row.comm_hash), + Value::Str(row.func_str()), + Value::U64(row.seq), + Value::I32(row.channel_id), + Value::I32(row.peer), + Value::I32(row.is_send), + Value::I32(row.n_steps), + Value::U64(row.trans_bytes), + Value::I64(row.send_gpu_wait_ns), + Value::I64(row.send_wait_ns), + Value::I64(row.recv_wait_ns), + Value::I64(row.recv_flush_wait_ns), + ]); + counters.rows_written.fetch_add(1, Ordering::Relaxed); + true + } + + pub fn flush_proxy_ops( + &mut self, + rows: &[CompletedProxyOp], + counters: &EventCounters, + ) -> usize { + let mut ok = 0usize; + for row in rows { + if self.append_proxy_op(row, counters) { + ok += 1; + } + } + ok + } + + pub fn append_net_qp(&mut self, row: &CompletedNetQp, counters: &EventCounters) -> bool { + let Ok(table) = self.open_net() else { + counters.write_errors.fetch_add(1, Ordering::Relaxed); + return false; + }; + table.push_row(&[ + Value::I64(row.ts_ns), + Value::I32(row.rank), + Value::I32(row.device), + Value::I32(row.qp_num), + Value::U64(row.wr_id), + Value::I32(row.opcode), + Value::U64(row.length), + Value::I64(row.duration_ns), + ]); + counters.rows_written.fetch_add(1, Ordering::Relaxed); + true + } +} + +#[cfg(test)] +mod tests { + use super::*; + use probing_memtable::discover::discover_in; + use std::fs; + + #[test] + fn proxy_ops_mmap_roundtrip() { + let base = + std::env::temp_dir().join(format!("probing_nccl_profiler_test_{}", std::process::id())); + let _ = fs::remove_dir_all(&base); + fs::create_dir_all(&base).unwrap(); + std::env::set_var("PROBING_DATA_DIR", &base); + + let counters = EventCounters::new(); + let mut w = NcclWriter::new(); + let mut func = [0u8; 32]; + func[..9].copy_from_slice(b"AllReduce"); + assert!(w.append_proxy_op( + &CompletedProxyOp { + ts_ns: 1, + rank: 0, + roles: crate::role::RoleRanks::default(), + comm_hash: 42, + coll_func: func, + coll_func_len: 9, + seq: 7, + channel_id: 1, + peer: 2, + is_send: 1, + n_steps: 4, + trans_bytes: 1024, + send_gpu_wait_ns: 10, + send_wait_ns: 20, + recv_wait_ns: 30, + recv_flush_wait_ns: 5, + }, + &counters + )); + + let found = discover_in(&base).unwrap(); + assert!(found.iter().any(|t| t.name() == PROXY_OPS_FILE)); + + let _ = fs::remove_dir_all(&base); + } +} diff --git a/probing/extensions/python/Cargo.toml b/probing/extensions/python/Cargo.toml index 6808468c..3d1b8e57 100644 --- a/probing/extensions/python/Cargo.toml +++ b/probing/extensions/python/Cargo.toml @@ -6,6 +6,7 @@ authors.workspace = true edition.workspace = true license.workspace = true + [features] extension-module = ["pyo3/extension-module"] tracing = [] diff --git a/probing/extensions/python/src/extensions/pprof.rs b/probing/extensions/python/src/extensions/pprof.rs index e3056938..512d7366 100644 --- a/probing/extensions/python/src/extensions/pprof.rs +++ b/probing/extensions/python/src/extensions/pprof.rs @@ -1,3 +1,6 @@ +use std::collections::HashMap; + +use async_trait::async_trait; use probing_core::core::EngineError; use probing_core::core::Maybe; use probing_core::core::ProbeExtension; @@ -11,7 +14,23 @@ pub struct PprofProbeExtension { sample_freq: Maybe, } -impl ProbeExtensionCall for PprofProbeExtension {} +#[async_trait] +impl ProbeExtensionCall for PprofProbeExtension { + async fn call( + &self, + path: &str, + _params: &HashMap, + _body: &[u8], + ) -> Result, EngineError> { + match path.trim_start_matches('/') { + "flamegraph" => crate::features::pprof::flamegraph() + .map(|html| html.into_bytes()) + .map_err(|e| EngineError::CallError(e.to_string())), + "flamegraph/json" => Ok(crate::features::pprof::flamegraph_json().into_bytes()), + _ => Err(EngineError::UnsupportedCall), + } + } +} impl PprofProbeExtension { fn set_sample_freq(&mut self, pprof_sample_freq: Maybe) -> Result<(), EngineError> { diff --git a/probing/extensions/python/src/extensions/python.rs b/probing/extensions/python/src/extensions/python.rs index bd5b304e..45ea7b51 100644 --- a/probing/extensions/python/src/extensions/python.rs +++ b/probing/extensions/python/src/extensions/python.rs @@ -49,7 +49,7 @@ impl Display for PyExtList { } /// Python integration with the probing system -#[derive(Debug, ProbeExtension)] +#[derive(Debug, Default, ProbeExtension)] pub struct PythonExt { /// Path to Python crash handler script (executed when interpreter crashes) #[option(aliases = ["crash.handler"])] @@ -68,17 +68,6 @@ pub struct PythonExt { disabled: Maybe, } -impl Default for PythonExt { - fn default() -> Self { - Self { - crash_handler: Default::default(), - monitoring: Default::default(), - enabled: Default::default(), - disabled: Default::default(), - } - } -} - #[async_trait] impl ProbeExtensionCall for PythonExt { async fn call( @@ -296,7 +285,7 @@ fn call_python_handler( } let body_arg = if body.is_empty() { - py.None().into() + py.None() } else { let body_str = std::str::from_utf8(&body).map_err(|e| { EngineError::PluginError(format!("Request body is not valid UTF-8: {e}")) diff --git a/probing/extensions/python/src/extensions/python/exttbls.rs b/probing/extensions/python/src/extensions/python/exttbls.rs index ff0f556b..e9b08040 100644 --- a/probing/extensions/python/src/extensions/python/exttbls.rs +++ b/probing/extensions/python/src/extensions/python/exttbls.rs @@ -1,11 +1,10 @@ //! Python-facing `ExternalTable`, backed by **mmap memtables**. //! //! Each table is an [`ExposedTable`] (MEMT ring buffer) under -//! `//python.`, so: +//! `//`: //! -//! - data **survives a crash** of the producing process (postmortem-readable), -//! - any process can query it via the mmap SQL catalog -//! (`probing_core::core::memtable_sql`) as `python.`, +//! - ``foo`` → ``python.foo`` → SQL ``python.foo`` +//! - ``nccl.proxy_ops`` → ``nccl.proxy_ops`` → SQL ``nccl.proxy_ops`` //! - the training process only ever pays the cost of an mmap row write — //! query-side materialisation happens in whoever runs the SQL. //! @@ -27,9 +26,40 @@ use pyo3::{pyclass, pymethods, Bound, PyResult, Python}; use crate::features::convert::{ele_to_python, python_to_ele}; +type PyTableRow = (Py, Vec>); + /// SQL schema (and filename prefix) for Python extern tables. pub const EXTERN_TABLE_SCHEMA: &str = "python"; +/// Mmap filename for an extern table. +/// +/// - ``foo`` → ``python.foo`` (legacy Python plugin tables) +/// - ``nccl.proxy_ops`` → ``nccl.proxy_ops`` (schema-qualified, matches memtable discovery) +fn mmap_basename(name: &str) -> String { + if name.contains('.') { + name.to_string() + } else { + format!("{EXTERN_TABLE_SCHEMA}.{name}") + } +} + +/// Legacy ``python.*`` tables prepend a ``timestamp`` column; schema-qualified +/// tables (``nccl.proxy_ops``) match native writer layouts exactly. +fn uses_timestamp_column(name: &str) -> bool { + !name.contains('.') +} + +fn build_schema(name: &str, columns: &[String], dtypes: &[DType]) -> MtSchema { + let mut schema = MtSchema::new(); + if uses_timestamp_column(name) { + schema = schema.col("timestamp", DType::I64); + } + for (col, dt) in columns.iter().zip(dtypes.iter()) { + schema = schema.col(col, *dt); + } + schema +} + /// Ring layout: fixed chunk count; chunk byte size derives from capacity. const NUM_CHUNKS: u32 = 8; const MIN_CHUNK_BYTES: usize = 4 * 1024; @@ -200,12 +230,9 @@ impl ExternBacking { return Ok(()); } self.dtypes = vec![DType::Str; self.columns.len()]; - let mut schema = MtSchema::new().col("timestamp", DType::I64); - for name in &self.columns { - schema = schema.col(name, DType::Str); - } + let schema = build_schema(&self.name, &self.columns, &self.dtypes); let chunk_bytes = ring_chunk_bytes(self.capacity_bytes); - let filename = format!("{EXTERN_TABLE_SCHEMA}.{}", self.name); + let filename = mmap_basename(&self.name); let table = ExposedTable::create(&filename, &schema, chunk_bytes, NUM_CHUNKS) .map_err(|e| format!("failed to register mmap table {filename}: {e}"))?; self.table = Some(table); @@ -227,12 +254,9 @@ impl ExternBacking { self.dtypes.clear(); let dtypes: Vec = first_row.iter().map(ele_dtype).collect(); - let mut schema = MtSchema::new().col("timestamp", DType::I64); - for (name, dt) in self.columns.iter().zip(dtypes.iter()) { - schema = schema.col(name, *dt); - } + let schema = build_schema(&self.name, &self.columns, &dtypes); let chunk_bytes = ring_chunk_bytes(self.capacity_bytes); - let filename = format!("{EXTERN_TABLE_SCHEMA}.{}", self.name); + let filename = mmap_basename(&self.name); let table = ExposedTable::create(&filename, &schema, chunk_bytes, NUM_CHUNKS) .map_err(|e| format!("failed to create mmap table {filename}: {e}"))?; self.dtypes = dtypes; @@ -252,7 +276,9 @@ impl ExternBacking { .map(|(e, dt)| ele_to_owned(e, *dt)) .collect(); let mut row: Vec = Vec::with_capacity(owned.len() + 1); - row.push(Value::I64(timestamp)); + if uses_timestamp_column(&self.name) { + row.push(Value::I64(timestamp)); + } row.extend(owned.iter().map(owned_to_value)); // ExposedTable::push_row validates schema and auto-advances chunks. @@ -260,6 +286,23 @@ impl ExternBacking { Ok(()) } + fn read_row_values(&self, cursor: &mut probing_memtable::RowCursor<'_>) -> Vec { + self.dtypes + .iter() + .map(|dt| match dt { + DType::U8 => Ele::BOOL(cursor.next_u8() != 0), + DType::I32 => Ele::I32(cursor.next_i32()), + DType::I64 => Ele::I64(cursor.next_i64()), + DType::F32 => Ele::F32(cursor.next_f32()), + DType::F64 => Ele::F64(cursor.next_f64()), + DType::U64 => Ele::DataTime(cursor.next_u64()), + DType::U32 => Ele::I64(cursor.next_u32() as i64), + DType::Str => Ele::Text(cursor.next_str().to_string()), + DType::Bytes => Ele::Text(String::from_utf8_lossy(cursor.next_bytes()).to_string()), + }) + .collect() + } + /// Rows in chronological order; when `limit` is set, only the most /// recent `limit` rows are returned (still oldest → newest). fn take(&self, limit: Option) -> Vec<(Ele, Vec)> { @@ -271,24 +314,15 @@ impl ExternBacking { for chunk in view.chunks_logical() { for row in view.rows(chunk) { let mut cursor = row.cursor(); - let ts = Ele::I64(cursor.next_i64()); - let vals: Vec = self - .dtypes - .iter() - .map(|dt| match dt { - DType::U8 => Ele::BOOL(cursor.next_u8() != 0), - DType::I32 => Ele::I32(cursor.next_i32()), - DType::I64 => Ele::I64(cursor.next_i64()), - DType::F32 => Ele::F32(cursor.next_f32()), - DType::F64 => Ele::F64(cursor.next_f64()), - DType::U64 => Ele::DataTime(cursor.next_u64()), - DType::U32 => Ele::I64(cursor.next_u32() as i64), - DType::Str => Ele::Text(cursor.next_str().to_string()), - DType::Bytes => { - Ele::Text(String::from_utf8_lossy(cursor.next_bytes()).to_string()) - } - }) - .collect(); + let (ts, vals) = if uses_timestamp_column(&self.name) { + let ts = Ele::I64(cursor.next_i64()); + let vals = self.read_row_values(&mut cursor); + (ts, vals) + } else { + let vals = self.read_row_values(&mut cursor); + let ts = vals.first().cloned().unwrap_or(Ele::Nil); + (ts, vals) + }; out.push((ts, vals)); } } @@ -469,7 +503,7 @@ impl ExternalTable { } #[pyo3(signature = (limit=None))] - fn take(&self, limit: Option) -> PyResult, Vec>)>> { + fn take(&self, limit: Option) -> PyResult> { let backing = self.0.clone(); with_detached_native(move || { let rows = backing.lock().unwrap().take(limit); @@ -648,6 +682,23 @@ probing.ExternalTable.drop("table_to_drop") .join("python.roundtrip"); assert!(path.is_file(), "mmap file missing: {path:?}"); + // Qualified schema.table → mmap basename used as-is + let mut nccl = ExternalTable::new( + "nccl.proxy_ops", + vec!["rank".to_string()], + 10000, + 1_000_000, + "BaseMemorySize".to_string(), + ); + Python::attach(|py| { + let vals: Vec> = vec![1i64.into_pyobject(py).unwrap().into_any().unbind()]; + nccl.append(vals).unwrap(); + }); + let nccl_path = probing_memtable::discover::default_dir() + .join(std::process::id().to_string()) + .join("nccl.proxy_ops"); + assert!(nccl_path.is_file(), "mmap file missing: {nccl_path:?}"); + // take() returns rows oldest → newest, with coerced values let rows = table.take(None).unwrap(); assert_eq!(rows.len(), 2); @@ -668,31 +719,6 @@ probing.ExternalTable.drop("table_to_drop") }); } - #[test] - fn test_see_py_table_in_engine() { - setup_table("table3"); - let rt = tokio::runtime::Builder::new_multi_thread() - .worker_threads(4) - .enable_all() - .build() - .unwrap(); - let engine = rt.block_on(engine_with_python()); - let tables = rt.block_on(async { - engine - .async_query( - "select * from probe.information_schema.tables where table_name = 'table3' ", - ) - .await - .unwrap() - }); - let df = tables.expect("Table 'table3' should be found in information_schema.tables"); - assert!(!df.cols.is_empty(), "Should have at least one column"); - assert!( - df.len() > 0, - "Table 'table3' should be found in information_schema.tables" - ); - } - #[test] fn test_see_py_table_data_in_engine() { setup_table("table4"); diff --git a/probing/extensions/python/src/extensions/python/tbls.rs b/probing/extensions/python/src/extensions/python/tbls.rs index b989c47e..5c34d3f5 100644 --- a/probing/extensions/python/src/extensions/python/tbls.rs +++ b/probing/extensions/python/src/extensions/python/tbls.rs @@ -102,7 +102,7 @@ impl PythonNamespace { fn data_from_python(expr: &str) -> Result> { Python::attach(|py| { - let import_path = expr.split(|c| c == '(' || c == '[').next().unwrap_or(expr); + let import_path = expr.split(['(', '[']).next().unwrap_or(expr); let parts: Vec<&str> = import_path .split('.') @@ -361,7 +361,7 @@ mod tests { fn test_import_path_parsing() { // Test the import path parsing logic used in data_from_python let expr = "sys.path"; - let import_path = expr.split(|c| c == '(' || c == '[').next().unwrap_or(expr); + let import_path = expr.split(['(', '[']).next().unwrap_or(expr); let parts: Vec<&str> = import_path .split('.') .filter(|segment| !segment.is_empty()) @@ -371,10 +371,7 @@ mod tests { // Test with function call let expr2 = "sys.path.append('test')"; - let import_path2 = expr2 - .split(|c| c == '(' || c == '[') - .next() - .unwrap_or(expr2); + let import_path2 = expr2.split(['(', '[']).next().unwrap_or(expr2); let parts2: Vec<&str> = import_path2 .split('.') .filter(|segment| !segment.is_empty()) @@ -384,10 +381,7 @@ mod tests { // Test with empty expression let expr3 = ""; - let import_path3 = expr3 - .split(|c| c == '(' || c == '[') - .next() - .unwrap_or(expr3); + let import_path3 = expr3.split(['(', '[']).next().unwrap_or(expr3); let parts3: Vec<&str> = import_path3 .split('.') .filter(|segment| !segment.is_empty()) diff --git a/probing/extensions/python/src/extensions/torch.rs b/probing/extensions/python/src/extensions/torch.rs index 97edbdd5..7595ba17 100644 --- a/probing/extensions/python/src/extensions/torch.rs +++ b/probing/extensions/python/src/extensions/torch.rs @@ -1,3 +1,6 @@ +use std::collections::HashMap; + +use async_trait::async_trait; use probing_core::core::EngineError; use probing_core::core::Maybe; use probing_core::core::ProbeExtension; @@ -12,7 +15,24 @@ pub struct TorchProbeExtension { profiling: Maybe, } -impl ProbeExtensionCall for TorchProbeExtension {} +#[async_trait] +impl ProbeExtensionCall for TorchProbeExtension { + async fn call( + &self, + path: &str, + params: &HashMap, + _body: &[u8], + ) -> Result, EngineError> { + match path.trim_start_matches('/') { + "flamegraph" => Ok(crate::features::torch::flamegraph().into_bytes()), + "flamegraph/json" => { + let metric = params.get("metric").map(|s| s.as_str()); + Ok(crate::features::torch::flamegraph_json(metric).into_bytes()) + } + _ => Err(EngineError::UnsupportedCall), + } + } +} impl TorchProbeExtension { fn set_profiling(&mut self, profiling: Maybe) -> Result<(), EngineError> { diff --git a/probing/extensions/python/src/features/flamegraph.rs b/probing/extensions/python/src/features/flamegraph.rs index 9a528d0b..3b95e348 100644 --- a/probing/extensions/python/src/features/flamegraph.rs +++ b/probing/extensions/python/src/features/flamegraph.rs @@ -126,17 +126,12 @@ impl Flamegraph { fn layout_frames(&self, frame_height: f64, graph_width: f64) -> Vec { let mut frames = Vec::new(); let mut next_id = 0usize; - layout_node( - &self.root, - None, - 0, - 0.0, - 0.0, - graph_width, + let mut ctx = LayoutCtx { frame_height, - &mut frames, - &mut next_id, - ); + frames: &mut frames, + next_id: &mut next_id, + }; + layout_node(&self.root, None, 0, 0.0, 0.0, graph_width, &mut ctx); frames } @@ -809,6 +804,12 @@ fn insert_path(node: &mut Node, path: &[String], value: u64) { } } +struct LayoutCtx<'a> { + frame_height: f64, + frames: &'a mut Vec, + next_id: &'a mut usize, +} + fn layout_node( node: &Node, parent_id: Option, @@ -816,14 +817,12 @@ fn layout_node( x: f64, y: f64, width: f64, - frame_height: f64, - frames: &mut Vec, - next_id: &mut usize, + ctx: &mut LayoutCtx<'_>, ) -> usize { - let id = *next_id; - *next_id += 1; + let id = *ctx.next_id; + *ctx.next_id += 1; - frames.push(PlacedFrame { + ctx.frames.push(PlacedFrame { id, parent: parent_id, name: node.name.clone(), @@ -851,11 +850,9 @@ fn layout_node( Some(id), depth + 1, child_x, - y + frame_height, + y + ctx.frame_height, child_w, - frame_height, - frames, - next_id, + ctx, ); child_x += child_w; } @@ -899,6 +896,7 @@ mod tests { count_name: "ns".to_string(), kind: FlamegraphKind::TorchModule, subtitle: "Test subtitle".to_string(), + metric: None, }); assert!(html.contains("probing-torch-module")); assert!(html.contains("torch-search")); @@ -914,6 +912,7 @@ mod tests { count_name: "ns".to_string(), kind: FlamegraphKind::TorchModule, subtitle: "S".to_string(), + metric: Some("duration".to_string()), }); assert!(json.contains("\"profile\":\"torch-module\"")); assert!(json.contains("\"subtitle\":\"S\"")); diff --git a/probing/extensions/python/src/features/pprof.rs b/probing/extensions/python/src/features/pprof.rs index 10b0142e..94ee180b 100644 --- a/probing/extensions/python/src/features/pprof.rs +++ b/probing/extensions/python/src/features/pprof.rs @@ -7,10 +7,10 @@ //! * reads the interrupted thread's `pc`/`fp` from the `ucontext`, //! * walks the frame-pointer chain collecting raw return addresses, //! * snapshots this thread's thread-local `PYSTACKS` (raw `usize` pointers), -//! and copies that fixed-size POD snapshot into a preallocated lock-free ring -//! buffer. No allocation, no locks, no symbolization, no `libunwind`, no libc -//! string calls happen in the handler — that is what crashed the old `pprof` -//! path on PyTorch (libunwind + `strlen` over Accelerate/JIT frames). +//! * and copies that fixed-size POD snapshot into a preallocated lock-free ring +//! buffer. No allocation, no locks, no symbolization, no `libunwind`, no libc +//! string calls happen in the handler — that is what crashed the old `pprof` +//! path on PyTorch (libunwind + `strlen` over Accelerate/JIT frames). //! //! A dedicated consumer thread drains the ring and does all the dangerous work //! off the signal path: symbolizing native addresses (`backtrace::resolve`) and @@ -414,7 +414,7 @@ fn current_tid() -> u64 { #[inline] fn plausible(p: usize) -> bool { // Canonical lower-half userspace pointer, above the first page. - p >= 0x1000 && p < 0x0001_0000_0000_0000 + (0x1000..0x0001_0000_0000_0000).contains(&p) } /// Extract (pc, fp) from the signal `ucontext` for the interrupted thread. @@ -541,8 +541,8 @@ unsafe extern "C" fn sigprof_handler(_sig: c_int, _info: *mut libc::siginfo_t, u compiler_fence(Ordering::SeqCst); let stacks = &*ps; let n = stacks.len().min(MAX_PY); - for i in 0..n { - sample.py[i] = stacks[i].callee(); + for (i, stack) in stacks.iter().enumerate().take(n) { + sample.py[i] = stack.callee(); } compiler_fence(Ordering::SeqCst); // If the eval hook touched PYSTACKS during the copy, discard it. @@ -970,7 +970,7 @@ pub fn flamegraph() -> Result { Ok(fg.render_html(&pprof_flamegraph_options())) } -/// JSON payload for the web UI (`GET /apis/flamegraph/pprof?format=json`). +/// JSON payload for the web UI (`GET /apis/pprofextension/flamegraph/json`). pub fn flamegraph_json() -> String { let dropped = DROPPED.load(Ordering::Relaxed); let empty = |msg: String| { diff --git a/probing/extensions/python/src/features/python_api.rs b/probing/extensions/python/src/features/python_api.rs index 5d33fc4a..dd749171 100644 --- a/probing/extensions/python/src/features/python_api.rs +++ b/probing/extensions/python/src/features/python_api.rs @@ -21,11 +21,10 @@ pub fn is_enabled() -> bool { #[pyfunction] pub fn query_json(_py: Python, sql: String) -> PyResult { with_detached_native(move || { - let result = block_on(async move { ENGINE.read().await.async_query(sql.as_str()).await }) - .map_err(|e| PyErr::new::(e.to_string())); - - let final_result = result.unwrap_or_default(); - serde_json::to_string(&final_result) + let df = block_on(async move { ENGINE.read().await.async_query(sql.as_str()).await }) + .map_err(|e| PyErr::new::(e.to_string()))? + .unwrap_or_default(); + serde_json::to_string(&df) .map_err(|e| PyErr::new::(e.to_string())) }) } @@ -56,7 +55,11 @@ pub fn api_eval(code: &str) -> PyResult { } #[pyfunction] -pub fn cli_main(_py: Python, args: Vec) -> PyResult<()> { +pub fn cli_main(py: Python, args: Vec) -> PyResult<()> { + // Skill install/update shells out to ``python -m probing.skills`` — use this interpreter. + if let Ok(exe) = py.import("sys")?.getattr("executable")?.extract::() { + std::env::set_var("PROBING_PYTHON", exe); + } if let Err(e) = cli_main_impl(args) { return Err(PyErr::new::( e.to_string(), diff --git a/probing/extensions/python/src/features/stack_tracer.rs b/probing/extensions/python/src/features/stack_tracer.rs index 19974a6c..d9537671 100644 --- a/probing/extensions/python/src/features/stack_tracer.rs +++ b/probing/extensions/python/src/features/stack_tracer.rs @@ -288,6 +288,16 @@ impl StackTracer for SignalTracer { } pub fn backtrace_signal_handler() { + // Ignore stray SIGUSR2 (e.g. macOS tooling or other libraries). Only run + // capture logic while `trace_thread_signal` holds a receiver in the slot. + let expecting = NATIVE_CALLSTACK_SENDER_SLOT + .try_lock() + .ok() + .is_some_and(|guard| guard.is_some()); + if !expecting { + return; + } + // Runs on the signaled thread: native unwind + thread-local eval-frame tracer stack. let native_stacks = SignalTracer::get_native_stacks().unwrap_or_default(); if SignalTracer::send_frames(native_stacks).is_err() { diff --git a/probing/extensions/python/src/features/torch.rs b/probing/extensions/python/src/features/torch.rs index 254ab9fc..44969a8c 100644 --- a/probing/extensions/python/src/features/torch.rs +++ b/probing/extensions/python/src/features/torch.rs @@ -11,7 +11,7 @@ use crate::features::flamegraph::{ empty_torch_html, Flamegraph, FlamegraphKind, FlamegraphOptions, }; -#[derive(Clone, Copy, PartialEq, Eq)] +#[derive(Clone, Copy, PartialEq, Eq, Debug)] enum TorchMetric { Duration, DeltaMb, @@ -21,8 +21,8 @@ enum TorchMetric { impl TorchMetric { fn parse(raw: Option<&str>) -> Self { match raw.map(str::trim).filter(|s| !s.is_empty()) { - Some(s) if matches!(s, "delta_mb" | "memory" | "delta" | "mem") => Self::DeltaMb, - Some(s) if matches!(s, "peak_mb" | "peak") => Self::PeakMb, + Some("delta_mb" | "memory" | "delta" | "mem") => Self::DeltaMb, + Some("peak_mb" | "peak") => Self::PeakMb, _ => Self::Duration, } } @@ -329,7 +329,7 @@ fn median_f64(values: &[f64]) -> f64 { let mut sorted = values.to_vec(); sorted.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); let mid = sorted.len() / 2; - if sorted.len() % 2 == 0 { + if sorted.len().is_multiple_of(2) { (sorted[mid - 1] + sorted[mid]) / 2.0 } else { sorted[mid] @@ -515,7 +515,7 @@ pub fn flamegraph() -> String { } } -/// JSON payload for the web UI (`GET /apis/flamegraph/torch?format=json`). +/// JSON payload for the web UI (`GET /apis/torchextension/flamegraph/json`). pub fn flamegraph_json(metric: Option<&str>) -> String { let metric = TorchMetric::parse(metric); @@ -577,14 +577,14 @@ mod tests { let lines = build_folded_lines( [ ( - "model.features.conv1".to_string(), + "model.features".to_string(), "post forward".to_string(), - 0.005, + 0.008, ), ( - "model.features".to_string(), + "model.features.conv1".to_string(), "post forward".to_string(), - 0.008, + 0.005, ), ], value_to_ns, @@ -594,10 +594,10 @@ mod tests { assert_eq!(lines.len(), 2); assert!(lines .iter() - .any(|l| l.starts_with("forward;model;features;conv1 5000000"))); + .any(|l| l.starts_with("forward;model;features;conv1; 5000000"))); assert!(lines .iter() - .any(|l| l.starts_with("forward;model;features 3000000"))); + .any(|l| l.starts_with("forward;model;features; 3000000"))); } #[test] @@ -625,8 +625,8 @@ mod tests { ); assert!(lines .iter() - .any(|l| l.starts_with("forward;layer 10000000"))); - assert!(lines.iter().any(|l| l.starts_with("step;Adam 2000000"))); + .any(|l| l.starts_with("forward;layer; 10000000"))); + assert!(lines.iter().any(|l| l.starts_with("step;Adam; 2000000"))); } #[test] @@ -646,7 +646,9 @@ mod tests { value_to_micro_mb, true, ); - assert!(lines.iter().any(|l| l.starts_with("forward;layer 1500000"))); + assert!(lines + .iter() + .any(|l| l.starts_with("forward;layer; 1500000"))); } #[test] @@ -658,31 +660,28 @@ mod tests { #[test] fn build_lines_from_memory_pairs_computes_positive_deltas() { - let mut df = probing_proto::types::DataFrame::default(); - df.cols = vec![ - vec![ - probing_proto::types::Ele::I64(1), - probing_proto::types::Ele::I64(1), - ], - vec![ - probing_proto::types::Ele::Text("layer".into()), - probing_proto::types::Ele::Text("layer".into()), - ], - vec![ - probing_proto::types::Ele::Text("pre forward".into()), - probing_proto::types::Ele::Text("post forward".into()), - ], + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( vec![ - probing_proto::types::Ele::F64(100.0), - probing_proto::types::Ele::F64(102.5), + "step".into(), + "module".into(), + "stage".into(), + "allocated".into(), + "max_allocated".into(), ], vec![ - probing_proto::types::Ele::F64(100.0), - probing_proto::types::Ele::F64(103.0), + Seq::SeqI64(vec![1, 1]), + Seq::SeqText(vec!["layer".into(), "layer".into()]), + Seq::SeqText(vec!["pre forward".into(), "post forward".into()]), + Seq::SeqF64(vec![100.0, 102.5]), + Seq::SeqF64(vec![100.0, 103.0]), ], - ]; + ); let lines = build_lines_from_memory_pairs(&df, false); - assert!(lines.iter().any(|l| l.starts_with("forward;layer 2500000"))); + assert!(lines + .iter() + .any(|l| l.starts_with("forward;layer; 2500000"))); } } diff --git a/probing/extensions/python/src/features/tracing.rs b/probing/extensions/python/src/features/tracing.rs index e696e7d0..caf42375 100644 --- a/probing/extensions/python/src/features/tracing.rs +++ b/probing/extensions/python/src/features/tracing.rs @@ -56,7 +56,7 @@ where // Thread-local storage for span context thread_local! { - static SPAN_STACK: RefCell>> = RefCell::new(Vec::new()); + static SPAN_STACK: RefCell>> = const { RefCell::new(Vec::new()) }; } /// Python binding for Span diff --git a/probing/extensions/python/src/python.rs b/probing/extensions/python/src/python.rs index d2dbf85c..10a558cb 100644 --- a/probing/extensions/python/src/python.rs +++ b/probing/extensions/python/src/python.rs @@ -101,7 +101,7 @@ pub fn should_enable_probing() -> bool { match lower.as_str() { "1" | "followed" | "2" | "nested" => true, _ if lower.starts_with("regex:") => { - let Some(pattern) = probe_value.splitn(2, ':').nth(1) else { + let Some((_, pattern)) = probe_value.split_once(':') else { return false; }; let Ok(regex) = regex::Regex::new(pattern) else { @@ -164,7 +164,11 @@ pub fn enable_monitoring(filename: &str) -> anyhow::Result<()> { filename }; - let code = get_code(filename).unwrap_or_default(); + let code = get_code(filename).ok_or_else(|| { + anyhow::anyhow!( + "monitoring script not found: {filename} (embed under pycode/ or set PROBING_CODE_ROOT)" + ) + })?; run_embedded(py, &code, None, None) .map_err(|err| anyhow::anyhow!("error apply monitoring {filename}: {err}"))?; Ok(()) diff --git a/probing/extensions/python/src/repl/mod.rs b/probing/extensions/python/src/repl/mod.rs index dbec26cf..04233372 100644 --- a/probing/extensions/python/src/repl/mod.rs +++ b/probing/extensions/python/src/repl/mod.rs @@ -1,5 +1,7 @@ mod console; mod python_repl; +mod session; pub use crate::repl::python_repl::PythonRepl; pub use crate::repl::python_repl::Repl; +pub use crate::repl::session::ReplSession; diff --git a/probing/extensions/python/src/repl/session.rs b/probing/extensions/python/src/repl/session.rs new file mode 100644 index 00000000..1550fa67 --- /dev/null +++ b/probing/extensions/python/src/repl/session.rs @@ -0,0 +1,27 @@ +//! WebSocket REPL session facade (server owns transport; python ext owns REPL state). + +use super::{PythonRepl, Repl}; + +/// One interactive REPL session for `/ws` (text in → JSON/text out). +pub struct ReplSession { + repl: PythonRepl, +} + +impl Default for ReplSession { + fn default() -> Self { + Self::new() + } +} + +impl ReplSession { + pub fn new() -> Self { + Self { + repl: PythonRepl::default(), + } + } + + /// Feed one WebSocket text frame; returns the REPL response string. + pub fn handle_text(&mut self, text: String) -> String { + self.repl.feed(text).unwrap_or_else(|| "{}".to_string()) + } +} diff --git a/probing/extensions/python/src/setup.rs b/probing/extensions/python/src/setup.rs index f33f0e7e..6d30a470 100644 --- a/probing/extensions/python/src/setup.rs +++ b/probing/extensions/python/src/setup.rs @@ -27,8 +27,17 @@ fn setup() { if should_enable_probing() { set_enabled(true); } - register_signal_handler( - nix::libc::SIGUSR2, - crate::features::stack_tracer::backtrace_signal_handler, - ); + + if cfg!(test) { + // Unit-test processes must not run the SIGUSR2 stack handler: it calls + // backtrace/Python from signal context and aborts on stray delivery. + unsafe { + nix::libc::signal(nix::libc::SIGUSR2, nix::libc::SIG_IGN); + } + } else { + register_signal_handler( + nix::libc::SIGUSR2, + crate::features::stack_tracer::backtrace_signal_handler, + ); + } } diff --git a/probing/memtable/Cargo.toml b/probing/memtable/Cargo.toml index 2c5652e3..7a1801fa 100644 --- a/probing/memtable/Cargo.toml +++ b/probing/memtable/Cargo.toml @@ -6,6 +6,7 @@ edition.workspace = true license.workspace = true description = "Self-describing columnar memory table with ring buffer" + [dependencies] xxhash-rust = { version = "0.8", features = ["xxh3"] } memmap2 = "0.9" diff --git a/probing/memtable/src/memtable.rs b/probing/memtable/src/memtable.rs index 8ac6aada..f84a4eb9 100644 --- a/probing/memtable/src/memtable.rs +++ b/probing/memtable/src/memtable.rs @@ -1416,6 +1416,8 @@ mod tests { use std::sync::{Arc, Barrier}; use std::thread; + use std::time::Duration; + // The production model: one writer feeds the ring while N lock-free // readers continuously scan it. Readers must never observe a torn or // corrupt row. @@ -1474,11 +1476,16 @@ mod tests { let mut mt = MemTableWriter::new(buf).unwrap(); for seq in 0..total_rows { mt.push_row(&[Value::I64(seq)]); + if seq % 32 == 0 { + thread::yield_now(); + } } }) }; writer.join().unwrap(); + // Let readers observe completed rows before they exit the scan loop. + thread::sleep(Duration::from_millis(20)); done.store(true, Ordering::Release); for h in reader_handles { @@ -1645,6 +1652,17 @@ mod tests { } } + #[test] + fn from_buf_roundtrip() { + let schema = Schema::new().col("x", DType::I32); + let mut t = MemTable::new(&schema, 1024, 1); + t.push_row(&[Value::I32(7)]); + let raw = t.as_bytes().to_vec(); + let t2 = MemTable::from_buf(raw).expect("valid buffer"); + assert_eq!(t2.num_rows(0), 1); + assert_eq!(t2.rows(0).next().unwrap().col_i32(0), 7); + } + #[test] fn from_buf_rejects_bad_version() { let schema = Schema::new().col("x", DType::U32); diff --git a/probing/memtable/src/raw.rs b/probing/memtable/src/raw.rs index 94948f71..051f67be 100644 --- a/probing/memtable/src/raw.rs +++ b/probing/memtable/src/raw.rs @@ -397,15 +397,10 @@ mod tests { use crate::schema::{DType, Schema}; #[test] + #[should_panic(expected = "buffer too small")] fn init_buf_rejects_small_buffer() { let schema = Schema::new().col("x", DType::I32); - let result = std::panic::catch_unwind(|| { - let mut buf = vec![0u8; 32]; // way too small - init_buf(&mut buf, &schema, 1024, 1); - }); - assert!( - result.is_err(), - "init_buf should panic on undersized buffer" - ); + let mut buf = vec![0u8; 32]; // way too small + init_buf(&mut buf, &schema, 1024, 1); } } diff --git a/probing/memtable/tests/smoke.rs b/probing/memtable/tests/smoke.rs deleted file mode 100644 index 1f3d798a..00000000 --- a/probing/memtable/tests/smoke.rs +++ /dev/null @@ -1,26 +0,0 @@ -//! 集成测试:仅使用 crate 公开 API。 -//! -//! 长时间混沌压测见同目录 `chaos_stress.rs`,需加 `--ignored` 运行。 - -use probing_memtable::{DType, MemTable, Schema, Value}; - -#[test] -fn push_row_and_scan_rows() { - let schema = Schema::new().col("id", DType::I64).col("msg", DType::Str); - let mut t = MemTable::new(&schema, 4096, 2); - t.push_row(&[Value::I64(1), Value::Str("hello")]); - let row = t.rows(0).next().expect("one row"); - assert_eq!(row.col_i64(0), 1); - assert_eq!(row.col_str(1), "hello"); -} - -#[test] -fn from_buf_roundtrip() { - let schema = Schema::new().col("x", DType::I32); - let mut t = MemTable::new(&schema, 1024, 1); - t.push_row(&[Value::I32(7)]); - let raw = t.as_bytes().to_vec(); - let t2 = MemTable::from_buf(raw).expect("valid buffer"); - assert_eq!(t2.num_rows(0), 1); - assert_eq!(t2.rows(0).next().unwrap().col_i32(0), 7); -} diff --git a/probing/proto/src/protocol/cluster.rs b/probing/proto/src/protocol/cluster.rs index 0c4e527a..d3d603d1 100644 --- a/probing/proto/src/protocol/cluster.rs +++ b/probing/proto/src/protocol/cluster.rs @@ -20,6 +20,11 @@ pub struct Node { pub role_rank: Option, pub role_world_size: Option, + /// Parallel-role key (e.g. "dp=2,pp=1,tp=0"); surfaced as the `_role` + /// federation tag. Distinct from torchrun's `role_name`. + #[serde(default)] + pub role: Option, + pub status: Option, pub timestamp: u64, } @@ -28,7 +33,7 @@ impl Display for Node { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( f, - "Node {{ host: {}, addr: {}, local_rank: {:?}, rank: {:?}, world_size: {:?}, group_rank: {:?}, group_world_size: {:?}, role_name: {:?}, role_rank: {:?}, role_world_size: {:?}, status: {:?}, timestamp: {} }}", + "Node {{ host: {}, addr: {}, local_rank: {:?}, rank: {:?}, world_size: {:?}, group_rank: {:?}, group_world_size: {:?}, role_name: {:?}, role_rank: {:?}, role_world_size: {:?}, role: {:?}, status: {:?}, timestamp: {} }}", self.host, self.addr, self.local_rank, @@ -39,6 +44,7 @@ impl Display for Node { self.role_name, self.role_rank, self.role_world_size, + self.role, self.status, self.timestamp ) diff --git a/probing/proto/tests/basic_tests.rs b/probing/proto/tests/basic_tests.rs deleted file mode 100644 index 0664d169..00000000 --- a/probing/proto/tests/basic_tests.rs +++ /dev/null @@ -1,54 +0,0 @@ -#[cfg(test)] -mod tests { - use core::f64; - - use probing_proto::types::basic::*; - - #[test] - fn test_seq_append_from_nil() { - let mut seq = Seq::Nil; - - // Test creating different sequence types from Nil - assert!(seq.append(42i32).is_ok()); - assert_eq!(seq, Seq::SeqI32(vec![42])); - - let mut seq = Seq::Nil; - assert!(seq.append("hello".to_string()).is_ok()); - assert_eq!(seq, Seq::SeqText(vec!["hello".to_string()])); - - let mut seq = Seq::Nil; - assert!(seq.append(f64::consts::PI).is_ok()); - assert_eq!(seq, Seq::SeqF64(vec![f64::consts::PI])); - } - - #[test] - fn test_seq_append_type_mismatch() { - let mut seq = Seq::SeqI32(vec![1, 2, 3]); - - // Should fail when trying to append wrong type - assert!(seq.append("string".to_string()).is_err()); - assert_eq!(seq, Seq::SeqI32(vec![1, 2, 3])); // unchanged - } - - #[test] - fn test_seq_append_nil_to_nil() { - let mut seq = Seq::Nil; - assert!(seq.append(Ele::Nil).is_ok()); - assert_eq!(seq, Seq::Nil); // Should remain Nil - } - - #[test] - fn test_seq_len_and_empty() { - let seq = Seq::Nil; - assert_eq!(seq.len(), 0); - assert!(seq.is_empty()); - - let seq = Seq::SeqI32(vec![1, 2, 3]); - assert_eq!(seq.len(), 3); - assert!(!seq.is_empty()); - - let seq = Seq::SeqText(vec![]); - assert_eq!(seq.len(), 0); - assert!(seq.is_empty()); - } -} diff --git a/probing/server/API.md b/probing/server/API.md index dbbc19e0..16ca6c96 100644 --- a/probing/server/API.md +++ b/probing/server/API.md @@ -21,11 +21,18 @@ Registered in `server/api/mod.rs`: | GET | `/apis/overview` | System overview | | GET | `/apis/files?path=…` | Read workspace file | | GET/PUT | `/apis/nodes` | Cluster node list / register | -| GET | `/apis/flamegraph/torch` | PyTorch module flamegraph (interactive HTML; `?format=json` for native UI) | -| GET | `/apis/flamegraph/pprof` | CPU sampling flamegraph (interactive HTML; `?format=json` for native UI) | | GET | `/apis/training/step_matrix` | Cross-rank train.step samples (`cluster=false` default; set `cluster=true` for on-demand fan-out) | | POST | `/apis/cluster/query` | On-demand SQL fan-out (`{"expr":"…","cluster":true}`) | +Flamegraphs are served by profiler extensions (extension fallback, not public routes): + +| Method | Path | Notes | +|--------|------|-------| +| GET | `/apis/torchextension/flamegraph` | PyTorch module flamegraph (interactive HTML) | +| GET | `/apis/torchextension/flamegraph/json` | JSON for native Web UI (`?metric=` optional) | +| GET | `/apis/pprofextension/flamegraph` | CPU sampling flamegraph (interactive HTML) | +| GET | `/apis/pprofextension/flamegraph/json` | JSON for native Web UI | + ## Cluster query (on-demand fan-out) Training agents write to **local memtable only**. Cross-node aggregation is explicit: @@ -67,6 +74,10 @@ Rust-backed endpoints (`callstack`, `eval`) are thin `@ext_handler` wrappers aro | Extension | Example path | Notes | |-----------|--------------|-------| +| `torchextension` | `GET /apis/torchextension/flamegraph` | Rust `ProbeExtensionCall`; torch module flamegraph | +| `torchextension` | `GET /apis/torchextension/flamegraph/json` | Torch flamegraph JSON (`?metric=` optional) | +| `pprofextension` | `GET /apis/pprofextension/flamegraph` | CPU SIGPROF flamegraph HTML | +| `pprofextension` | `GET /apis/pprofextension/flamegraph/json` | pprof flamegraph JSON | | `rdmaextension` | `POST /apis/rdmaextension/` | Rust `ProbeExtensionCall`, CLI only | ## Top-level (non `/apis`) @@ -106,7 +117,7 @@ Do not register the same capability in both places. Do not add path aliases. ## Extension response headers Extension fallback responses (`server/api/extension.rs`) take `Content-Type` and CORS -from [`tests/spec/api_spec.json`](../../tests/spec/api_spec.json), not path substring +from [`tests/regression/spec/api_spec.json`](../../tests/regression/spec/api_spec.json), not path substring heuristics. Each handler declares: ```json @@ -127,11 +138,11 @@ When adding a pythonext handler, update the spec `response` block alongside ## Client contracts (Web UI + CLI) Web and CLI do **not** import Server routes. They share the same machine-readable -contract: [`tests/spec/api_spec.json`](../../tests/spec/api_spec.json), section +contract: [`tests/regression/spec/api_spec.json`](../../tests/regression/spec/api_spec.json), section `client_contracts`. Each entry lists the Rust source file and the HTTP calls it makes (`method` + -`path`). Contract tests in `tests/spec/client_contract.py` verify: +`path`). Contract tests in `tests/regression/spec/client_contract.py` verify: - declared paths exist in the canonical endpoint list (`server_public`, `pythonext_handlers`, `other_extensions`, `top_level`) @@ -142,16 +153,15 @@ When adding or changing a Web/CLI HTTP call, update `client_contracts` in the spec — not Server source. ```bash -uv run pytest tests/spec/test_api_spec.py -q +uv run pytest tests/regression/spec/test_api_spec.py -q ``` ## Contract spec (machine-readable) -The canonical contract is [`tests/spec/api_spec.json`](../../tests/spec/api_spec.json). +The canonical contract is [`tests/regression/spec/api_spec.json`](../../tests/regression/spec/api_spec.json). Run contract tests: ```bash -uv run pytest tests/spec/test_api_spec.py -q -cargo test -p probing-server --no-default-features spec -cargo test -p probing-core --test extension_routing_spec +uv run pytest tests/regression/spec/test_api_spec.py -q +cargo test -p probing-rust-regression server_training_observability --no-default-features ``` diff --git a/probing/server/Cargo.toml b/probing/server/Cargo.toml index 5b278702..9ed3ec4f 100644 --- a/probing/server/Cargo.toml +++ b/probing/server/Cargo.toml @@ -6,6 +6,7 @@ authors.workspace = true edition.workspace = true license.workspace = true + [features] extension-module = ["probing-python/extension-module"] gpu = ["dep:probing-gpu"] @@ -33,7 +34,6 @@ tokio = { workspace = true } async-trait = "0.1.83" bytes = "1" -include_dir = "=0.7.4" nu-ansi-term = "0.50.1" base64 = "0.21.5" ureq = { version = "3.0.2", default-features = false, features = ["json"] } diff --git a/probing/server/src/asset.rs b/probing/server/src/asset.rs index 3f638f21..5e95b93b 100644 --- a/probing/server/src/asset.rs +++ b/probing/server/src/asset.rs @@ -1,11 +1,10 @@ use std::env; +use std::path::Path; use axum::body::Body; use axum::http::{header, HeaderMap, StatusCode, Uri}; use axum::response::{IntoResponse, Response}; use bytes::Bytes; -use include_dir::include_dir; -use include_dir::Dir; use once_cell::sync::Lazy; static BASE_PATH: Lazy = Lazy::new(|| { @@ -15,7 +14,18 @@ static BASE_PATH: Lazy = Lazy::new(|| { .to_string() }); -static ASSET: Dir = include_dir!("web/dist"); +const MISSING_UI_HTML: &str = concat!( + "", + "Probing Web Interface", + "

Web UI not available. Run make frontend, then restart probing.

", + "" +); + +fn assets_root() -> Option { + env::var("PROBING_ASSETS_ROOT") + .ok() + .filter(|root| Path::new(root).join("index.html").is_file()) +} /// Normalize request paths such as `/./assets/foo.js` → `assets/foo.js`. fn normalize_asset_path(path: &str) -> String { @@ -26,36 +36,30 @@ fn normalize_asset_path(path: &str) -> String { p } -fn read_embedded(key: &str) -> Option { - ASSET - .get_file(key) - .map(|f| Bytes::copy_from_slice(f.contents())) -} - fn read_from_disk(key: &str) -> Option { - let assets_root = env::var("PROBING_ASSETS_ROOT").ok()?; - let path = format!("{}/{}", assets_root, key); + let assets_root = assets_root()?; + let path = Path::new(&assets_root).join(key); let content = std::fs::read(path).ok()?; Some(Bytes::from(content)) } -fn read_asset(key: &str) -> Option { - read_from_disk(key).or_else(|| read_embedded(key)) -} - pub fn contains(path: &str) -> bool { let key = normalize_asset_path(path); - if env::var("PROBING_ASSETS_ROOT").is_ok() { - let path = format!("{}/{}", env::var("PROBING_ASSETS_ROOT").unwrap(), key); - std::path::Path::new(path.as_str()).exists() - } else { - ASSET.contains(&key) + if let Some(root) = assets_root() { + return Path::new(&root).join(&key).exists(); } + key == "index.html" } pub fn get(path: &str) -> Bytes { let key = normalize_asset_path(path); - read_asset(&key).unwrap_or_default() + if let Some(data) = read_from_disk(&key) { + return data; + } + if key == "index.html" { + return Bytes::from_static(MISSING_UI_HTML.as_bytes()); + } + Bytes::new() } fn accepts_brotli(accept_encoding: &str) -> bool { @@ -92,7 +96,7 @@ fn resolve_asset(path: &str, accept_encoding: &str) -> (Bytes, Option<&'static s if accepts_brotli(accept_encoding) { let br_key = format!("{key}.br"); - if let Some(data) = read_asset(&br_key) { + if let Some(data) = read_from_disk(&br_key) { if !data.is_empty() { return (data, Some("br")); } @@ -226,7 +230,8 @@ pub async fn static_files(uri: Uri, headers: HeaderMap) -> Result Response { } /// Authentication middleware -pub async fn auth_middleware(request: Request, next: Next) -> Result { +pub async fn auth_middleware(request: Request, next: Next) -> Response { // Get the configured token let configured_token = config::get_str("server.auth_token") .await @@ -96,12 +96,12 @@ pub async fn auth_middleware(request: Request, next: Next) -> Result Ok(next.run(request).await), - _ => Err(unauthorized_response()), + Some(token) if token == configured_token => next.run(request).await, + _ => unauthorized_response(), }; } - Ok(next.run(request).await) + next.run(request).await } // Path prefixes that should bypass authentication @@ -116,15 +116,12 @@ pub fn is_public_path(path: &str) -> bool { } /// Selective auth middleware that skips authentication for specific paths -pub async fn selective_auth_middleware( - request: Request, - next: Next, -) -> Result { +pub async fn selective_auth_middleware(request: Request, next: Next) -> Response { let path = request.uri().path(); // Skip authentication for public paths if is_public_path(path) { - return Ok(next.run(request).await); + return next.run(request).await; } // Apply authentication for all other paths diff --git a/probing/server/src/engine.rs b/probing/server/src/engine.rs index 465b86fc..b28dddda 100644 --- a/probing/server/src/engine.rs +++ b/probing/server/src/engine.rs @@ -59,11 +59,7 @@ pub async fn initialize_engine() -> Result<()> { /// Parse `SET key = value` (value may be quoted). fn parse_set_assignment(stmt: &str) -> Option<(&str, &str)> { let mut s = stmt.trim(); - if s.len() >= 3 - && s.as_bytes()[0].to_ascii_lowercase() == b's' - && s.as_bytes()[1].to_ascii_lowercase() == b'e' - && s.as_bytes()[2].to_ascii_lowercase() == b't' - { + if s.len() >= 3 && s.as_bytes()[..3].eq_ignore_ascii_case(b"set") { s = s[3..].trim_start(); } else { return None; @@ -88,10 +84,7 @@ fn parse_set_assignment(stmt: &str) -> Option<(&str, &str)> { fn is_set_expr(expr: &str) -> bool { expr.split(';').any(|part| { let p = part.trim(); - p.len() >= 3 - && p.as_bytes()[0].to_ascii_lowercase() == b's' - && p.as_bytes()[1].to_ascii_lowercase() == b'e' - && p.as_bytes()[2].to_ascii_lowercase() == b't' + p.len() >= 3 && p.as_bytes()[..3].eq_ignore_ascii_case(b"set") }) } diff --git a/probing/server/src/extensions.rs b/probing/server/src/extensions.rs index ced6b297..f34d10dc 100644 --- a/probing/server/src/extensions.rs +++ b/probing/server/src/extensions.rs @@ -138,6 +138,9 @@ impl ServerProbeExtension { } fn set_assets_root(&mut self, assets_root: Maybe) -> Result<(), EngineError> { + if let Maybe::Just(ref root) = assets_root { + std::env::set_var("PROBING_ASSETS_ROOT", root); + } self.assets_root = assets_root; Ok(()) } diff --git a/probing/server/src/memtable_ext.rs b/probing/server/src/memtable_ext.rs index fa27daa6..373b7d92 100644 --- a/probing/server/src/memtable_ext.rs +++ b/probing/server/src/memtable_ext.rs @@ -3,6 +3,6 @@ //! The implementation moved to `probing_core::core::memtable_sql` so that both //! the server and language extensions can expose mmap memtables to SQL through //! the same code path (logical chunk ordering, generation re-validation, and -//! zero-copy mmap reads). This module re-exports it for backward compatibility. +//! zero-copy mmap reads). Re-exported for the server crate. pub use probing_core::core::memtable_sql::*; diff --git a/probing/server/src/report.rs b/probing/server/src/report.rs index dbe09f55..2dff0948 100644 --- a/probing/server/src/report.rs +++ b/probing/server/src/report.rs @@ -47,6 +47,9 @@ async fn report_worker(report_addr: String, local_addr: String) { role_name: std::env::var("ROLE_NAME").ok(), role_rank: get_i32_env("ROLE_RANK"), role_world_size: get_i32_env("ROLE_WORLD_SIZE"), + // Parallel-role key is populated by the Python torchrun registration + // path (probing.parallel.current_role); env-only report leaves it unset. + role: None, status: Some("running".to_string()), timestamp: 0, }; diff --git a/probing/server/src/server/api/extension.rs b/probing/server/src/server/api/extension.rs index 97fe70d8..6ee83b7a 100644 --- a/probing/server/src/server/api/extension.rs +++ b/probing/server/src/server/api/extension.rs @@ -103,7 +103,7 @@ mod tests { fn load_spec() -> serde_json::Value { let path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("../../tests/spec/api_spec.json"); + .join("../../tests/regression/spec/api_spec.json"); let text = std::fs::read_to_string(path).expect("read api_spec.json"); serde_json::from_str(&text).expect("parse api_spec.json") } diff --git a/probing/server/src/server/api/mod.rs b/probing/server/src/server/api/mod.rs index bdaed584..51f2441a 100644 --- a/probing/server/src/server/api/mod.rs +++ b/probing/server/src/server/api/mod.rs @@ -10,17 +10,15 @@ use axum::{ Router, }; -use super::{cluster, cluster_query, file_api, profiling, system, training}; +use super::{cluster, cluster_query, file_api, system, training}; /// Canonical public `/apis` routes (method, path suffix under `/apis`). -/// Keep in sync with `tests/spec/api_spec.json` — verified by `spec_tests`. +/// Keep in sync with `tests/regression/spec/api_spec.json` — verified by `spec_tests`. pub const PUBLIC_API_ROUTES: &[(&str, &str)] = &[ ("GET", "/overview"), ("GET", "/files"), ("GET", "/nodes"), ("PUT", "/nodes"), - ("GET", "/flamegraph/torch"), - ("GET", "/flamegraph/pprof"), ("GET", "/training/step_matrix"), ("POST", "/cluster/query"), ]; @@ -36,8 +34,6 @@ fn public_routes() -> Router { .route("/overview", get(system::get_overview_json)) .route("/files", get(file_api::read_file)) .route("/nodes", get(cluster::get_nodes).put(cluster::put_node)) - .route("/flamegraph/torch", get(profiling::get_torch_flamegraph)) - .route("/flamegraph/pprof", get(profiling::get_pprof_flamegraph)) .route("/training/step_matrix", get(training::get_step_matrix)) .route("/cluster/query", post(cluster_query::post_cluster_query)) } @@ -48,7 +44,7 @@ mod spec_tests { fn load_spec() -> serde_json::Value { let path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("../../tests/spec/api_spec.json"); + .join("../../tests/regression/spec/api_spec.json"); let text = std::fs::read_to_string(path).expect("read api_spec.json"); serde_json::from_str(&text).expect("parse api_spec.json") } diff --git a/probing/server/src/server/api/response.rs b/probing/server/src/server/api/response.rs index 525b5807..aadecae4 100644 --- a/probing/server/src/server/api/response.rs +++ b/probing/server/src/server/api/response.rs @@ -1,4 +1,4 @@ -//! Extension HTTP routing metadata driven by `tests/spec/api_spec.json`. +//! Extension HTTP routing metadata driven by `tests/regression/spec/api_spec.json`. use std::collections::HashMap; @@ -31,9 +31,10 @@ pub struct ExtensionRouteSpec { static ROUTE_MAP: Lazy> = Lazy::new(build_route_map); fn build_route_map() -> HashMap { - let spec: serde_json::Value = - serde_json::from_str(include_str!("../../../../../tests/spec/api_spec.json")) - .expect("parse api_spec.json"); + let spec: serde_json::Value = serde_json::from_str(include_str!( + "../../../../../tests/regression/spec/api_spec.json" + )) + .expect("parse api_spec.json"); let defaults = spec .get("extension_response_defaults") @@ -112,6 +113,7 @@ fn parse_response_meta(response: &serde_json::Value, defaults: &serde_json::Valu content_type: match content_type { "application/json" => "application/json", "text/plain" => "text/plain", + "text/html" => "text/html", other => panic!("unsupported extension response content_type: {other}"), }, cors, @@ -190,7 +192,7 @@ mod tests { fn load_spec() -> serde_json::Value { let path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("../../tests/spec/api_spec.json"); + .join("../../tests/regression/spec/api_spec.json"); let text = std::fs::read_to_string(path).expect("read api_spec.json"); serde_json::from_str(&text).expect("parse api_spec.json") } diff --git a/probing/server/src/server/middleware.rs b/probing/server/src/server/middleware.rs index 2bd11297..270b2cea 100644 --- a/probing/server/src/server/middleware.rs +++ b/probing/server/src/server/middleware.rs @@ -10,10 +10,7 @@ use bytes::Bytes; use http_body_util::BodyExt; /// Middleware to limit request body size -pub async fn request_size_limit_middleware( - request: Request, - next: Next, -) -> Result { +pub async fn request_size_limit_middleware(request: Request, next: Next) -> Response { let max_size = get_max_request_body_size(); // Get the content-length header if present @@ -27,11 +24,11 @@ pub async fn request_size_limit_middleware( if let Some(length) = content_length { if length > max_size { log::warn!("Request rejected: Content-Length {length} exceeds limit {max_size}"); - return Err(( + return ( StatusCode::PAYLOAD_TOO_LARGE, format!("Request body too large (max {max_size} bytes allowed)"), ) - .into_response()); + .into_response(); } } @@ -44,11 +41,11 @@ pub async fn request_size_limit_middleware( Ok(bytes) => bytes, Err(e) => { log::warn!("Request body collection failed: {e}"); - return Err(( + return ( StatusCode::PAYLOAD_TOO_LARGE, format!("Request body too large (max {max_size} bytes allowed)"), ) - .into_response()); + .into_response(); } }; @@ -57,7 +54,7 @@ pub async fn request_size_limit_middleware( let new_request = Request::from_parts(parts, new_body); // Continue to the next middleware/handler - Ok(next.run(new_request).await) + next.run(new_request).await } /// Collect body bytes with a size limit using BodyExt::collect() diff --git a/probing/server/src/server/mod.rs b/probing/server/src/server/mod.rs index fdee8301..f0c33ecc 100644 --- a/probing/server/src/server/mod.rs +++ b/probing/server/src/server/mod.rs @@ -13,7 +13,6 @@ pub mod config; pub mod error; pub mod file_api; pub mod middleware; -pub mod profiling; pub mod system; pub mod training; @@ -28,7 +27,7 @@ use crate::server::middleware::{request_logging_middleware, request_size_limit_m use crate::server::repl::ws_handler; use probing_proto::prelude::Query; -/// Top-level routes outside `/apis`. Keep in sync with `tests/spec/api_spec.json`. +/// Top-level routes outside `/apis`. Keep in sync with `tests/regression/spec/api_spec.json`. pub const TOP_LEVEL_ROUTES: &[(&str, &str)] = &[ ("POST", "/query"), ("POST", "/query/dto"), @@ -190,7 +189,7 @@ mod spec_tests { fn load_spec() -> serde_json::Value { let path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("../../tests/spec/api_spec.json"); + .join("../../tests/regression/spec/api_spec.json"); let text = std::fs::read_to_string(path).expect("read api_spec.json"); serde_json::from_str(&text).expect("parse api_spec.json") } diff --git a/probing/server/src/server/profiling.rs b/probing/server/src/server/profiling.rs deleted file mode 100644 index a5616b83..00000000 --- a/probing/server/src/server/profiling.rs +++ /dev/null @@ -1,52 +0,0 @@ -use axum::{ - extract::Query, - response::{IntoResponse, Response}, -}; - -use super::error::ApiResult; - -#[derive(Debug, serde::Deserialize)] -pub struct FlamegraphFormatQuery { - format: Option, - metric: Option, -} - -const FLAMEGRAPH_HTML_HEADERS: [(&str, &str); 2] = [ - ("Content-Type", "text/html; charset=utf-8"), - ("Content-Disposition", "inline; filename=flamegraph.html"), -]; - -const FLAMEGRAPH_JSON_HEADERS: [(&str, &str); 1] = - [("Content-Type", "application/json; charset=utf-8")]; - -fn wants_json(format: &Option) -> bool { - format.as_deref() == Some("json") -} - -/// Generate interactive HTML or JSON flamegraph for torch profiler data. -pub async fn get_torch_flamegraph( - Query(query): Query, -) -> ApiResult { - if wants_json(&query.format) { - let json = probing_python::features::torch::flamegraph_json(query.metric.as_deref()); - Ok((FLAMEGRAPH_JSON_HEADERS, json).into_response()) - } else { - let graph = probing_python::features::torch::flamegraph(); - Ok((FLAMEGRAPH_HTML_HEADERS, graph).into_response()) - } -} - -/// Generate interactive HTML or JSON flamegraph for CPU sampling (pprof). -pub async fn get_pprof_flamegraph( - Query(query): Query, -) -> ApiResult { - if wants_json(&query.format) { - let json = probing_python::features::pprof::flamegraph_json(); - Ok((FLAMEGRAPH_JSON_HEADERS, json).into_response()) - } else { - match probing_python::features::pprof::flamegraph() { - Ok(graph) => Ok((FLAMEGRAPH_HTML_HEADERS, graph).into_response()), - Err(err) => Err(anyhow::anyhow!(err).into()), - } - } -} diff --git a/probing/server/src/server/repl.rs b/probing/server/src/server/repl.rs index af77d588..730b7f39 100644 --- a/probing/server/src/server/repl.rs +++ b/probing/server/src/server/repl.rs @@ -1,27 +1,21 @@ use axum::extract::ws::Message; use futures_util::{SinkExt, StreamExt}; -use probing_python::repl::Repl; pub async fn ws_handler( ws: axum::extract::ws::WebSocketUpgrade, ) -> impl axum::response::IntoResponse { ws.on_upgrade(|ws| async move { - // Handle WebSocket connection log::info!("WebSocket connection established"); let (mut write, mut read) = ws.split(); - - let mut repl = probing_python::repl::PythonRepl::default(); + let mut session = probing_python::repl::ReplSession::new(); while let Some(Ok(msg)) = read.next().await { if let Message::Text(msg) = msg { - let rsp = repl.feed(msg.to_string()).unwrap_or("{}".to_string()); - + let rsp = session.handle_text(msg.to_string()); if write.send(Message::Text(rsp.into())).await.is_err() { break; } } } - // Here you would handle the WebSocket messages - // For now, just close the connection }) } diff --git a/probing/server/src/server/spa.rs b/probing/server/src/server/spa.rs index cde1fe49..ee765e7a 100644 --- a/probing/server/src/server/spa.rs +++ b/probing/server/src/server/spa.rs @@ -6,6 +6,17 @@ use axum::{routing::get, Router}; use crate::asset::{contains, index, static_files}; +/// Static files that must not fall back to the SPA shell (avoids serving HTML as CSS/JS). +fn is_static_asset_path(path: &str) -> bool { + let name = path.rsplit('/').next().unwrap_or(path); + matches!( + name.rsplit_once('.').map(|(_, ext)| ext), + Some( + "css" | "js" | "wasm" | "svg" | "png" | "jpg" | "jpeg" | "gif" | "ico" | "json" | "br" + ) + ) +} + /// True for backend/API endpoints that must not return the SPA shell. pub fn is_api_path(path: &str) -> bool { path == "/query" @@ -30,6 +41,10 @@ pub async fn fallback(uri: Uri, headers: HeaderMap) -> Response { return StatusCode::NOT_FOUND.into_response(); } + if is_static_asset_path(path) && !contains(path) { + return StatusCode::NOT_FOUND.into_response(); + } + if contains(path) { if let Ok(resp) = static_files(uri, headers).await { return resp.into_response(); @@ -41,7 +56,7 @@ pub async fn fallback(uri: Uri, headers: HeaderMap) -> Response { #[cfg(test)] mod tests { - use super::is_api_path; + use super::{is_api_path, is_static_asset_path}; #[test] fn api_paths_are_not_spa() { @@ -64,4 +79,11 @@ mod tests { assert!(!is_api_path("/spans")); assert!(!is_api_path("/traces")); } + + #[test] + fn static_asset_extensions_are_not_spa() { + assert!(is_static_asset_path("/assets/tailwind.css")); + assert!(is_static_asset_path("/./assets/web-dxhabc.js")); + assert!(!is_static_asset_path("/profiling")); + } } diff --git a/probing/server/src/server/system.rs b/probing/server/src/server/system.rs index c268d4e4..b5e4e6b8 100644 --- a/probing/server/src/server/system.rs +++ b/probing/server/src/server/system.rs @@ -55,7 +55,7 @@ pub fn get_overview() -> Result { .unwrap_or_default() .to_string(), main_thread: myself as u64, - threads: threads, + threads, }; Ok(info) } diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index ea7c9b26..336d3896 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -181,7 +181,9 @@ fn aggregate_step_samples(rows: &[RawStepRow], window: usize) -> Vec 0) .collect(); - let picked: Vec = if preferred.len() >= indices.len().max(1) / 3 { + let picked: Vec = if preferred.is_empty() { + indices + } else if preferred.len() >= indices.len().max(1) / 3 { preferred } else { indices @@ -193,7 +195,7 @@ fn aggregate_step_samples(rows: &[RawStepRow], window: usize) -> Vec Vec=4.0", "coverage>=7.0", + "pyyaml>=6", + "ipython>=8.0", + "ipykernel>=6.0", ] dev = [ "pytest>=8.0; python_version >= '3.8'", "pytest<8.0; python_version < '3.8'", "pytest-cov>=4.0", "coverage>=7.0", + "pyyaml>=6", + "ipython>=8.0", + "ipykernel>=6.0", "ruff>=0.1.0", "black>=24.0; python_version >= '3.8'", "black<24.0; python_version < '3.8'", + "maturin>=1.0,<2.0", ] [tool.maturin] @@ -67,7 +74,7 @@ python-source = "python" compatibility = "linux" bindings = "pyo3" cargo-extra-args = "--features extension-module,gpu,kmsg" -include = ["probing.pth", "probing_hook.py"] +include = ["probing.pth", "probing_hook.py", "probing/libs/*", "probing/_skills/**", "probing/_web/**"] [build-system] requires = ["maturin>=1.0,<2.0"] @@ -75,7 +82,7 @@ build-backend = "maturin" [tool.pytest.ini_options] minversion = "8.0" -testpaths = ["tests", "python/probing"] +testpaths = ["tests/unit", "tests/regression"] pythonpath = ["python"] python_files = ["test_*.py"] python_classes = ["Test*"] @@ -98,11 +105,14 @@ norecursedirs = [ "dist", "build", "__pycache__", + "rust", ] markers = [ "integration: marks tests that require integration resources", "slow: marks tests that are expected to be slow", "unit: marks tests that can run in isolation", + "regression: contract, e2e, and cross-module tests", + "training_observability: training iteration / collective observability tests", ] filterwarnings = [ "ignore::DeprecationWarning:pandas.*", diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 30dc8628..00000000 --- a/pytest.ini +++ /dev/null @@ -1,43 +0,0 @@ -[pytest] -# Test discovery settings -testpaths = tests python/probing -python_files = test_*.py -python_classes = Test* -python_functions = test_* - -# Reporting and output settings -addopts = - --verbose - --color=yes - --durations=10 - --showlocals - --strict-markers - --doctest-modules - --ignore=python/probing/cli/__main__.py - -# Ignore certain directories during test collection -norecursedirs = - .git - .tox - .venv - venv - env - dist - build - __pycache__ - -# Define custom markers -markers = - integration: marks tests that require integration resources - slow: marks tests that are expected to be slow - unit: marks tests that can run in isolation - -# Environment variables for tests -env = - PYTHONPATH=. - -# Configure warnings -filterwarnings = - ignore::DeprecationWarning:pandas.*: - ignore::DeprecationWarning:numpy.*: - error::RuntimeWarning diff --git a/python/probing/__init__.py b/python/probing/__init__.py index 5dec1c3e..f9c9e38e 100644 --- a/python/probing/__init__.py +++ b/python/probing/__init__.py @@ -23,43 +23,67 @@ discover, bootstrap, or sync Pulsing cluster membership. """ -import probing.config as config -from probing import _core -from probing.external_table import ExternalTable +from __future__ import annotations + +from probing._entrypoint import is_lightweight_module +from probing.web_assets import configure_assets_root VERSION = "0.2.5" -TCPStore = _core.TCPStore -# Control Functions -cli_main = _core.cli_main -enable_tracer = _core.enable_tracer -disable_tracer = _core.disable_tracer +if is_lightweight_module(): + __all__ = ["VERSION"] +else: + configure_assets_root() + import probing.config as config + from probing import _core + from probing.external_table import ExternalTable + + TCPStore = _core.TCPStore + + # Control Functions + cli_main = _core.cli_main + enable_tracer = _core.enable_tracer + disable_tracer = _core.disable_tracer + + def is_enabled(): + return _core.is_enabled() + # Internal Accessors + _get_python_stacks = _core._get_python_stacks + _get_python_frames = _core._get_python_frames -def is_enabled(): - return _core.is_enabled() + # Submodules with side effects (must be imported after Core Primitives) + from probing.core.engine import load_extension, query + from probing.parallel import clear_role, current_role, set_role + from probing.tracing import event, span + try: + from probing.nccl.mock import maybe_auto_seed -# Internal Accessors -_get_python_stacks = _core._get_python_stacks -_get_python_frames = _core._get_python_frames + if maybe_auto_seed(): + import logging -# Submodules with side effects (must be imported after Core Primitives) -from probing.core.engine import load_extension, query -from probing.tracing import event, span + logging.getLogger(__name__).debug( + "seeded mock nccl.proxy_ops / nccl.net_qp (PROBING_NCCL_MOCK)" + ) + except Exception: + pass -__all__ = [ - "VERSION", - "ExternalTable", - "TCPStore", - "config", - "cli_main", - "enable_tracer", - "disable_tracer", - "is_enabled", - "query", - "load_extension", - "span", - "event", -] + __all__ = [ + "VERSION", + "ExternalTable", + "TCPStore", + "config", + "cli_main", + "enable_tracer", + "disable_tracer", + "is_enabled", + "query", + "load_extension", + "span", + "event", + "set_role", + "clear_role", + "current_role", + ] diff --git a/python/probing/_entrypoint.py b/python/probing/_entrypoint.py new file mode 100644 index 00000000..cd0789b7 --- /dev/null +++ b/python/probing/_entrypoint.py @@ -0,0 +1,55 @@ +"""Shared process entrypoint detection for site hook and package import.""" + +from __future__ import annotations + +import os +import sys + + +def current_script_name() -> str: + try: + return os.path.basename(sys.argv[0]) + except (IndexError, AttributeError): + return "" + + +def is_probing_cli() -> bool: + """True when this process is the ``probing`` CLI (must not auto-load the engine).""" + if current_script_name() == "probing": + os.environ["PROBING_CLI_MODE"] = "1" + return True + try: + import __main__ + + if hasattr(__main__, "__file__") and __main__.__file__: + main_file = __main__.__file__ + if "probing" in main_file and "cli" in main_file: + os.environ["PROBING_CLI_MODE"] = "1" + return True + except Exception: + pass + return False + + +_LIGHTWEIGHT_MODULES = ("probing.nccl", "probing.skills", "probing.dev_pth") + + +def is_lightweight_module() -> bool: + """``python -m probing.nccl|skills|dev_pth`` must not start the engine.""" + helper_suffixes = ( + "probing/nccl/__main__.py", + "probing\\nccl\\__main__.py", + "probing/skills/__main__.py", + "probing\\skills\\__main__.py", + "probing/dev_pth.py", + "probing\\dev_pth.py", + ) + if sys.argv and any(sys.argv[0].endswith(s) for s in helper_suffixes): + return True + + try: + idx = sys.argv.index("-m") + mod = sys.argv[idx + 1] + except (ValueError, IndexError): + return False + return mod in _LIGHTWEIGHT_MODULES diff --git a/python/probing/_skills.README.md b/python/probing/_skills.README.md new file mode 100644 index 00000000..8ca02e38 --- /dev/null +++ b/python/probing/_skills.README.md @@ -0,0 +1,14 @@ +# Bundled diagnostic skills (wheel copy) + +**Do not edit skill content here.** This tree is generated from repo-root +[`skills/`](../../../skills/README.md): + +```bash +make wheel # bundles skills/ and web/dist/ automatically +``` + +Shipped inside the PyPI wheel so `probing skill list` and install tooling work +without a git checkout. At runtime, repo / user / project skill dirs can override +these entries (see [`../skills/README.md`](../skills/README.md)). + +Python loader code lives in [`../skills/`](../skills/README.md) (`probing.skills` package). diff --git a/python/probing/_skills/README.md b/python/probing/_skills/README.md new file mode 100644 index 00000000..8ca02e38 --- /dev/null +++ b/python/probing/_skills/README.md @@ -0,0 +1,14 @@ +# Bundled diagnostic skills (wheel copy) + +**Do not edit skill content here.** This tree is generated from repo-root +[`skills/`](../../../skills/README.md): + +```bash +make wheel # bundles skills/ and web/dist/ automatically +``` + +Shipped inside the PyPI wheel so `probing skill list` and install tooling work +without a git checkout. At runtime, repo / user / project skill dirs can override +these entries (see [`../skills/README.md`](../skills/README.md)). + +Python loader code lives in [`../skills/`](../skills/README.md) (`probing.skills` package). diff --git a/python/probing/_skills/catalog.yaml b/python/probing/_skills/catalog.yaml new file mode 100644 index 00000000..0bdf9035 --- /dev/null +++ b/python/probing/_skills/catalog.yaml @@ -0,0 +1,145 @@ +# Skill catalog — index for CLI, Python loader, and Web Agent. +apiVersion: probing.dev/v1 +kind: Catalog +categories: + triage: + label: 分诊 / Triage + description: First look when unsure where to start. + reliability: + label: 可靠性 / Reliability + description: Stalls, hangs, deadlocks. + distributed: + label: 分布式 / Distributed + description: Ranks, collectives, stragglers. + performance: + label: 性能 / Performance + description: Module hotspots and step regressions. + memory: + label: 内存 / Memory + description: GPU/VRAM pressure and leaks. +skills: +- id: health_overview + category: triage + priority: 0 + entry: true + description: 'One-shot health check: CPU, GPU, tables, recent training activity' + tables: + - cpu.utilization + - gpu.utilization + - python.torch_trace + - cluster.nodes + pages: + - dashboard + - agent + - analytics + related: + - module_bottleneck + - training_hang + - memory_leak + path: health_overview/steps.yaml +- id: training_hang + category: reliability + priority: 1 + description: Training stalled — capture stacks and thread/blocking hints + tables: + - python.backtrace + - cpu.utilization + - python.trace_event + - python.comm_collective + pages: + - stacks + - spans + related: + - slow_rank + - module_bottleneck + path: training_hang/steps.yaml +- id: slow_rank + category: distributed + priority: 2 + description: Find straggler ranks via collective latency imbalance + tables: + - python.comm_collective + - global.python.comm_collective + pages: + - training + - cluster + - analytics + related: + - comm_bottleneck + - nccl_culprit_victim + - gpu_pressure + - training_hang + path: slow_rank/steps.yaml +- id: memory_leak + category: memory + priority: 3 + description: Detect monotonic GPU memory growth across training steps + tables: + - python.torch_trace + - gpu.utilization + pages: + - profiling/torch + related: + - gpu_pressure + - module_bottleneck + path: memory_leak/steps.yaml +- id: module_bottleneck + category: performance + priority: 4 + description: Find slowest PyTorch modules in recent steps + tables: + - python.torch_trace + pages: + - profiling/torch + - training + related: + - slow_rank + - comm_bottleneck + - memory_leak + path: module_bottleneck/steps.yaml +- id: comm_bottleneck + category: distributed + priority: 5 + description: Rank collective ops by total and p99 latency + tables: + - python.comm_collective + - rdma.mlx_hca + pages: + - training + - cluster + - analytics + - spans + related: + - slow_rank + - nccl_culprit_victim + path: comm_bottleneck/steps.yaml +- id: gpu_pressure + category: memory + priority: 6 + description: GPU memory and utilization headroom + tables: + - gpu.utilization + - gpu.devices + - python.torch_trace + pages: + - dashboard + related: + - memory_leak + - slow_rank + path: gpu_pressure/steps.yaml +- id: nccl_culprit_victim + category: distributed + priority: 7 + description: NCCL proxy wait decomposition — culprit (send_gpu_wait) vs victim (recv_wait) + tables: + - nccl.proxy_ops + - nccl.net_qp + - global.nccl.proxy_ops + pages: + - training + - cluster + - analytics + related: + - slow_rank + - comm_bottleneck + path: nccl_culprit_victim/steps.yaml diff --git a/python/probing/_skills/comm_bottleneck/SKILL.md b/python/probing/_skills/comm_bottleneck/SKILL.md new file mode 100644 index 00000000..649d0fe6 --- /dev/null +++ b/python/probing/_skills/comm_bottleneck/SKILL.md @@ -0,0 +1,30 @@ +--- +name: comm_bottleneck +description: > + Rank collective ops by total and p99 latency +category: distributed +tables: [python.comm_collective, nccl.proxy_ops, rdma.mlx_hca] +tags: [NCCL, collective, communication, 通信, all_reduce] +keywords: + en: ['communication slow', 'NCCL', 'collective', 'comm bottleneck'] + zh: ['通信慢', 'NCCL', 'all_reduce', '通信瓶颈', '带宽'] +parameters: + step_window: { type: integer, default: 50 } + use_global: { type: boolean, default: True } +--- + +# Communication bottleneck + +按 collective op 聚合延迟与传输量,定位通信热点。 +适用于「计算不慢但 step 时间长」或「通信占比高」的场景。 + +## Parameters + +- `step_window` (integer, default `50`): +- `use_global` (boolean, default `True`): + +## Related skills + +- all_reduce 慢 → 检查 bucket 大小、overlap、FP16 compress +- 有 `nccl.proxy_ops` → skill: `nccl_culprit_victim`(culprit/victim 归因) +- RoCE 拥塞 → 查 rdma.mlx_hca 与交换机 ECN 配置 diff --git a/playbooks/diagnostics/comm_bottleneck.yaml b/python/probing/_skills/comm_bottleneck/steps.yaml similarity index 81% rename from playbooks/diagnostics/comm_bottleneck.yaml rename to python/probing/_skills/comm_bottleneck/steps.yaml index 3a295cf3..62ab49e6 100644 --- a/playbooks/diagnostics/comm_bottleneck.yaml +++ b/python/probing/_skills/comm_bottleneck/steps.yaml @@ -1,5 +1,5 @@ apiVersion: probing.dev/v1 -kind: Playbook +kind: Skill metadata: id: comm_bottleneck @@ -27,6 +27,7 @@ spec: requires: any_tables: - python.comm_collective + - nccl.proxy_ops steps: - id: op_summary @@ -82,6 +83,25 @@ spec: LIMIT 20 on_empty: skip + - id: nccl_proxy_wait + title: "NCCL proxy wait 汇总 (profiler)" + type: sql + sql: | + SELECT + coll_func, + sum(send_gpu_wait_ns) AS total_gpu_wait_ns, + sum(recv_wait_ns) AS total_recv_wait_ns, + count(*) AS ops + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {step_window} + FROM {nccl_proxy_table} + ) + GROUP BY coll_func + ORDER BY total_recv_wait_ns DESC + on_empty: skip + empty_message: "无 nccl.proxy_ops — 仅 python.comm_collective 粗粒度可用" + - id: rdma_hint title: "RDMA 端口速率 (Linux)" type: sql @@ -95,6 +115,7 @@ spec: variables: table_comm: "{comm_table}" + nccl_proxy_table: "{nccl_proxy_table}" interpretation: rules: @@ -112,9 +133,10 @@ spec: ## 通信瓶颈 - **op_summary**: 哪个 op 总耗时最高 - **slowest_calls**: 极端慢调用 - - rank 不均衡 → playbook: slow_rank + - rank 不均衡 → skill: slow_rank next_steps: - "all_reduce 慢 → 检查 bucket 大小、overlap、FP16 compress" - "某 step comm_ms 尖峰 → 对照 checkpoint / eval 边界" - "RoCE 拥塞 → 查 rdma.mlx_hca 与交换机 ECN 配置" + - "有 proxy wait 数据 → skill: nccl_culprit_victim" diff --git a/python/probing/_skills/gpu_pressure/SKILL.md b/python/probing/_skills/gpu_pressure/SKILL.md new file mode 100644 index 00000000..25067c93 --- /dev/null +++ b/python/probing/_skills/gpu_pressure/SKILL.md @@ -0,0 +1,28 @@ +--- +name: gpu_pressure +description: > + GPU memory and utilization headroom +category: memory +tables: [gpu.utilization, gpu.devices, python.torch_trace] +tags: [gpu, VRAM, utilization, 显存, 利用率] +keywords: + en: ['GPU memory', 'VRAM', 'GPU utilization', 'GPU idle'] + zh: ['显存不够', 'GPU 利用率', 'VRAM', '显存占用', 'GPU 空闲'] +parameters: + sample_limit: { type: integer, default: 20 } +--- + +# GPU memory and utilization pressure + +查看 gpu.utilization 采样与 python.torch_trace 中的 allocated 是否一致, +判断是「真 OOM 风险」还是「利用率低 / 内存碎片」。 + +## Parameters + +- `sample_limit` (integer, default `20`): + +## Related skills + +- 显存持续上涨 → skill: memory_leak +- MPS Mac → torch.mps.current_allocated_memory 已在 torch_trace 中 +- 启用更细 profiling → probing.torch.profiling=on,random:0.1 diff --git a/playbooks/diagnostics/gpu_pressure.yaml b/python/probing/_skills/gpu_pressure/steps.yaml similarity index 97% rename from playbooks/diagnostics/gpu_pressure.yaml rename to python/probing/_skills/gpu_pressure/steps.yaml index 9272eb2c..1b07643d 100644 --- a/playbooks/diagnostics/gpu_pressure.yaml +++ b/python/probing/_skills/gpu_pressure/steps.yaml @@ -1,5 +1,5 @@ apiVersion: probing.dev/v1 -kind: Playbook +kind: Skill metadata: id: gpu_pressure @@ -99,6 +99,6 @@ spec: - 显存涨但 util 低 → 查 DataLoader; util 高 mem 低 → 计算密集 next_steps: - - "显存持续上涨 → playbook: memory_leak" + - "显存持续上涨 → skill: memory_leak" - "MPS Mac → torch.mps.current_allocated_memory 已在 torch_trace 中" - "启用更细 profiling → probing.torch.profiling=on,random:0.1" diff --git a/python/probing/_skills/health_overview/SKILL.md b/python/probing/_skills/health_overview/SKILL.md new file mode 100644 index 00000000..dd3bdc0e --- /dev/null +++ b/python/probing/_skills/health_overview/SKILL.md @@ -0,0 +1,28 @@ +--- +name: health_overview +description: > + One-shot health check: CPU, GPU, tables, recent training activity +category: triage +tables: [cpu.utilization, gpu.utilization, python.torch_trace, cluster.nodes] +tags: [overview, doctor, triage, 健康检查] +keywords: + en: ['health', 'overview', 'status', 'doctor', 'checkup'] + zh: ['健康', '概览', '怎么样', '正常吗', 'doctor', '体检'] +parameters: + sample_limit: { type: integer, default: 5 } +--- + +# Training health overview + +快速扫描目标进程:有哪些表、CPU/GPU 最近采样、训练是否在推进。 +适合作为 agent 的默认第一步,或用户不确定从哪查起时使用。 + +## Parameters + +- `sample_limit` (integer, default `5`): Recent CPU/GPU samples to show + +## Related skills + +- 训练变慢 → skill: module_bottleneck 或 slow_rank +- 显存上涨 → skill: memory_leak +- 进程卡住 → skill: training_hang diff --git a/playbooks/diagnostics/health_overview.yaml b/python/probing/_skills/health_overview/steps.yaml similarity index 94% rename from playbooks/diagnostics/health_overview.yaml rename to python/probing/_skills/health_overview/steps.yaml index dce56ea6..8b2c11c5 100644 --- a/playbooks/diagnostics/health_overview.yaml +++ b/python/probing/_skills/health_overview/steps.yaml @@ -1,5 +1,5 @@ apiVersion: probing.dev/v1 -kind: Playbook +kind: Skill metadata: id: health_overview @@ -102,6 +102,6 @@ spec: 若某项为空,按 empty_message 提示开启对应采集。 next_steps: - - "训练变慢 → playbook: module_bottleneck 或 slow_rank" - - "显存上涨 → playbook: memory_leak" - - "进程卡住 → playbook: training_hang" + - "训练变慢 → skill: module_bottleneck 或 slow_rank" + - "显存上涨 → skill: memory_leak" + - "进程卡住 → skill: training_hang" diff --git a/python/probing/_skills/install.sh b/python/probing/_skills/install.sh new file mode 100755 index 00000000..a77319e0 --- /dev/null +++ b/python/probing/_skills/install.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +# Install repo skills/ into Cursor, Claude Code, and Codex skill directories. +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +if command -v probing >/dev/null 2>&1; then + exec probing skill install "$@" +fi + +export PROBING=1 +export PYTHONPATH="${ROOT}/python${PYTHONPATH:+:${PYTHONPATH}}" +exec python3 -m probing.skills install "$@" diff --git a/python/probing/_skills/memory_leak/SKILL.md b/python/probing/_skills/memory_leak/SKILL.md new file mode 100644 index 00000000..d2b43704 --- /dev/null +++ b/python/probing/_skills/memory_leak/SKILL.md @@ -0,0 +1,30 @@ +--- +name: memory_leak +description: > + Detect monotonic GPU memory growth across training steps +category: memory +tables: [python.torch_trace, gpu.utilization] +tags: [memory, leak, OOM, 显存, 泄漏] +keywords: + en: ['memory leak', 'OOM', 'memory growing', 'out of memory'] + zh: ['泄漏', 'OOM', '显存涨', '内存涨', 'out of memory', '阶梯'] +parameters: + min_steps: { type: integer, default: 10 } + step_skip: { type: integer, default: 2 } +--- + +# GPU memory leak detection + +检测 python.torch_trace 中 allocated 是否随 step 单调上涨, +并结合 gpu.utilization 看设备级显存趋势。 + +## Parameters + +- `min_steps` (integer, default `10`): Minimum steps required for trend analysis +- `step_skip` (integer, default `2`): Skip first N steps (discovery / warmup) + +## Related skills + +- 某模块 delta 大 → 检查是否 cache 了 tensor / 未 detach +- 仅 torch_trace 涨而 gpu.utilization 平稳 → 可能是统计口径问题 +- Linux OOM → SELECT * FROM process.kmsg WHERE message LIKE '%oom%' diff --git a/playbooks/diagnostics/memory_leak.yaml b/python/probing/_skills/memory_leak/steps.yaml similarity index 99% rename from playbooks/diagnostics/memory_leak.yaml rename to python/probing/_skills/memory_leak/steps.yaml index 40170779..f12fc20c 100644 --- a/playbooks/diagnostics/memory_leak.yaml +++ b/python/probing/_skills/memory_leak/steps.yaml @@ -1,5 +1,5 @@ apiVersion: probing.dev/v1 -kind: Playbook +kind: Skill metadata: id: memory_leak diff --git a/python/probing/_skills/module_bottleneck/SKILL.md b/python/probing/_skills/module_bottleneck/SKILL.md new file mode 100644 index 00000000..5fa976f3 --- /dev/null +++ b/python/probing/_skills/module_bottleneck/SKILL.md @@ -0,0 +1,30 @@ +--- +name: module_bottleneck +description: > + Find slowest PyTorch modules in recent steps +category: performance +tables: [python.torch_trace] +tags: [slow, bottleneck, module, torch, 慢, 瓶颈] +keywords: + en: ['slow', 'bottleneck', 'hotspot', 'which module', 'slowdown'] + zh: ['慢', '瓶颈', '哪个模块', '变慢', 'hotspot', '热点'] +parameters: + recent_steps: { type: integer, default: 10 } + stage_filter: { type: string, default: post forward } +--- + +# PyTorch module bottleneck + +基于 python.torch_trace 的 post-hook duration,找出最近 step 中最耗时的模块。 +与 torch.profiler 互补:这是长期采样、模块级、低开销视图。 + +## Parameters + +- `recent_steps` (integer, default `10`): Analyze the last N training steps +- `stage_filter` (string, default `post forward`): Hook stage to aggregate (post forward | post step) + +## Related skills + +- 打开 Torch 火焰图 (profiling/torch) 看调用栈分布 +- 分布式变慢 → skill: slow_rank +- 需要 CPU 栈 → SET probing.pprof.sample_freq=99, profiling/pprof diff --git a/playbooks/diagnostics/module_bottleneck.yaml b/python/probing/_skills/module_bottleneck/steps.yaml similarity index 98% rename from playbooks/diagnostics/module_bottleneck.yaml rename to python/probing/_skills/module_bottleneck/steps.yaml index 00d1346a..4c5fce73 100644 --- a/playbooks/diagnostics/module_bottleneck.yaml +++ b/python/probing/_skills/module_bottleneck/steps.yaml @@ -1,5 +1,5 @@ apiVersion: probing.dev/v1 -kind: Playbook +kind: Skill metadata: id: module_bottleneck @@ -110,5 +110,5 @@ spec: next_steps: - "打开 Torch 火焰图 (profiling/torch) 看调用栈分布" - - "分布式变慢 → playbook: slow_rank" + - "分布式变慢 → skill: slow_rank" - "需要 CPU 栈 → SET probing.pprof.sample_freq=99, profiling/pprof" diff --git a/python/probing/_skills/nccl_culprit_victim/SKILL.md b/python/probing/_skills/nccl_culprit_victim/SKILL.md new file mode 100644 index 00000000..9e3d3753 --- /dev/null +++ b/python/probing/_skills/nccl_culprit_victim/SKILL.md @@ -0,0 +1,33 @@ +--- +name: nccl_culprit_victim +description: > + NCCL proxy wait decomposition — culprit (send_gpu_wait) vs victim (recv_wait) +category: distributed +tables: [nccl.proxy_ops, nccl.net_qp, global.nccl.proxy_ops] +tags: [NCCL, culprit, victim, straggler, wait, proxy] +keywords: + en: ['NCCL culprit', 'NCCL victim', 'recv wait', 'gpu wait', 'slow rank NCCL', 'proxy wait'] + zh: ['NCCL 慢 rank', '罪魁祸首', '受害者', 'recv_wait', 'gpu_wait', '等待分解'] +parameters: + seq_window: { type: integer, default: 20 } + use_global: { type: boolean, default: true } +--- + +# NCCL culprit / victim attribution + +Uses **NCCL profiler plugin** wait decomposition (`nccl.proxy_ops`): + +- **Culprit** (slow local GPU): high `send_gpu_wait_ns` +- **Victim** (waiting on peers / network): high `recv_wait_ns` + +Requires `NCCL_PROFILER_PLUGIN` + `probing-nccl-profiler` (or mock data via `PROBING_NCCL_MOCK` on macOS). + +## Parameters + +- `seq_window` (integer, default `20`): recent collective sequences to analyze +- `use_global` (boolean, default `true`): fan-out with `global.nccl.proxy_ops` + +## Related skills + +- Coarse collective latency → `comm_bottleneck` / `slow_rank` (`python.comm_collective`) +- IB QP timing → `nccl.net_qp` when NetPlugin mask enabled diff --git a/python/probing/_skills/nccl_culprit_victim/steps.yaml b/python/probing/_skills/nccl_culprit_victim/steps.yaml new file mode 100644 index 00000000..1c2992f3 --- /dev/null +++ b/python/probing/_skills/nccl_culprit_victim/steps.yaml @@ -0,0 +1,198 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: nccl_culprit_victim + title: "NCCL culprit / victim 归因" + title_en: "NCCL culprit vs victim attribution" + category: distributed + tags: [NCCL, culprit, victim, proxy, wait, straggler] + triggers: + keywords: + zh: ["罪魁祸首", "受害者", "recv_wait", "gpu_wait", "NCCL 等待", "proxy wait"] + en: ["NCCL culprit", "NCCL victim", "recv wait", "gpu wait", "proxy wait"] + docs: | + 基于 nccl.proxy_ops 的 ProxyStep wait 分解,区分: + - culprit:send_gpu_wait_ns 高(本 rank GPU/计算慢) + - victim:recv_wait_ns 高(等 peer / 网络) + 需要 NCCL_PROFILER_PLUGIN 加载 probing-nccl-profiler;开发机可用 PROBING_NCCL_MOCK=1。 + +spec: + parameters: + - name: seq_window + type: integer + default: 20 + description: "Analyze proxy ops with seq >= max(seq) - window" + - name: use_global + type: boolean + default: true + description: "Use global.nccl.proxy_ops for multi-node fan-out" + + requires: + any_tables: + - nccl.proxy_ops + - global.nccl.proxy_ops + + steps: + - id: rank_wait_summary + title: "各 rank wait 分解汇总" + type: sql + sql: | + SELECT + rank, + count(*) AS proxy_ops, + sum(send_gpu_wait_ns) AS total_gpu_wait_ns, + sum(recv_wait_ns) AS total_recv_wait_ns, + sum(send_wait_ns) AS total_send_wait_ns, + avg(send_gpu_wait_ns) AS avg_gpu_wait_ns, + avg(recv_wait_ns) AS avg_recv_wait_ns + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + GROUP BY rank + ORDER BY total_recv_wait_ns DESC + on_empty: abort + empty_message: | + 无 nccl.proxy_ops 数据。确认: + - export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) + - export NCCL_PROFILE_EVENT_MASK=26 + - 或 macOS 开发: PROBING_NCCL_MOCK=1 PROBING=1 + + - id: culprit_ranking + title: "Culprit 候选 (send_gpu_wait)" + type: sql + sql: | + SELECT + rank, + tp_rank, + pp_rank, + dp_rank, + coll_func, + sum(send_gpu_wait_ns) AS culprit_wait_ns, + count(*) AS ops + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + GROUP BY rank, tp_rank, pp_rank, dp_rank, coll_func + ORDER BY culprit_wait_ns DESC + LIMIT 10 + on_empty: skip + + - id: victim_ranking + title: "Victim 候选 (recv_wait)" + type: sql + sql: | + SELECT + rank, + tp_rank, + pp_rank, + dp_rank, + coll_func, + sum(recv_wait_ns) AS victim_wait_ns, + sum(recv_flush_wait_ns) AS flush_wait_ns, + count(*) AS ops + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + GROUP BY rank, tp_rank, pp_rank, dp_rank, coll_func + ORDER BY victim_wait_ns DESC + LIMIT 10 + on_empty: skip + + - id: role_aligned + title: "按并行角色 (tp/pp/dp) 对齐" + type: sql + sql: | + SELECT + tp_rank, + pp_rank, + dp_rank, + sum(send_gpu_wait_ns) AS gpu_wait_ns, + sum(recv_wait_ns) AS recv_wait_ns, + count(DISTINCT rank) AS ranks_seen + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + AND tp_rank >= 0 + GROUP BY tp_rank, pp_rank, dp_rank + ORDER BY recv_wait_ns DESC + on_empty: skip + empty_message: "无 tp/pp/dp 列或未设置并行 env — 仅按 torch rank 分析" + + - id: global_fanout + title: "跨节点 global 视图" + type: sql + cluster: true + when: "{use_global}" + sql: | + SELECT + _host, + _rank AS probe_rank, + rank AS torch_rank, + sum(send_gpu_wait_ns) AS gpu_wait_ns, + sum(recv_wait_ns) AS recv_wait_ns + FROM global.nccl.proxy_ops + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM global.nccl.proxy_ops + ) + GROUP BY _host, _rank, rank + ORDER BY recv_wait_ns DESC + on_empty: skip + + - id: net_qp_hint + title: "IB QP 延迟 (NetPlugin)" + type: sql + sql: | + SELECT + rank, + qp_num, + avg(duration_ns) AS avg_qp_ns, + max(duration_ns) AS max_qp_ns, + count(*) AS events + FROM {net_qp_table} + GROUP BY rank, qp_num + ORDER BY max_qp_ns DESC + LIMIT 10 + on_empty: skip + empty_message: "nccl.net_qp 空 — 需要 NCCL_PROFILE_EVENT_MASK 含 NetPlugin(128)" + + variables: + nccl_proxy_table: "{nccl_proxy_table}" + + interpretation: + rules: + - id: culprit_dominates + when: "step:rank_wait_summary | column:total_gpu_wait_ns | max/min(ratio) > 2" + severity: warning + message: "某 rank 的 send_gpu_wait 显著高于其他 rank — 可能是 culprit (本地 GPU 慢)" + + - id: victim_dominates + when: "step:rank_wait_summary | column:total_recv_wait_ns | max/min(ratio) > 2" + severity: warning + message: "某 rank 的 recv_wait 显著高于其他 rank — 可能是 victim (等待 peer/网络)" + + - id: culprit_not_victim + when: "step:culprit_ranking | rows >= 1 | column:culprit_wait_ns | max > 1000000" + severity: info + message: "查看 culprit_ranking 顶部 rank — 对比 victim_ranking 确认是否同一 rank" + + summary_template: | + ## NCCL culprit / victim + - **culprit_ranking**: `send_gpu_wait_ns` 最高 → 本地算力瓶颈 + - **victim_ranking**: `recv_wait_ns` 最高 → 等待他人或网络 + - **role_aligned**: 同 tp/pp/dp 切片对比(Megatron 拓扑) + - 若仅有 python.comm_collective → skill: comm_bottleneck + + next_steps: + - "culprit 持续同一 rank → gpu_pressure / module_bottleneck" + - "victim 全体偏高 → 网络/RoCE: comm_bottleneck (rdma.mlx_hca)" + - "单 rank victim + 其他 culprit → 典型 straggler: slow_rank" diff --git a/playbooks/semantic/intents.yaml b/python/probing/_skills/semantic/intents.yaml similarity index 59% rename from playbooks/semantic/intents.yaml rename to python/probing/_skills/semantic/intents.yaml index 9317ea59..1944284d 100644 --- a/playbooks/semantic/intents.yaml +++ b/python/probing/_skills/semantic/intents.yaml @@ -1,4 +1,4 @@ -# Intent routing — maps user language to playbook ids (keyword + LLM fallback). +# Intent routing — maps user language to skill ids (keyword + LLM fallback). apiVersion: probing.dev/v1 kind: IntentCatalog @@ -6,34 +6,39 @@ intents: health_check: label: "健康检查 / 不知道从哪查" keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup] - playbooks: [health_overview] + skills: [health_overview] training_hung: label: "训练卡住 / 无进展" keywords: [卡住, hang, stall, 不动, deadlock, 死锁, frozen, stuck, loss 不更新] - playbooks: [training_hang, slow_rank] + skills: [training_hang, slow_rank] training_slow: label: "训练变慢 / 瓶颈" keywords: [慢, slow, bottleneck, 瓶颈, 变慢, hotspot, 热点, 耗时] - playbooks: [module_bottleneck, slow_rank, comm_bottleneck] + skills: [module_bottleneck, slow_rank, comm_bottleneck] which_rank: label: "慢 rank / straggler" keywords: [straggler, 慢 rank, 拖后腿, rank 慢, lagging rank, 哪个 rank] - playbooks: [slow_rank, comm_bottleneck] + skills: [slow_rank, nccl_culprit_victim, comm_bottleneck] memory_growing: label: "显存上涨 / OOM" keywords: [OOM, leak, 泄漏, 显存涨, memory grow, out of memory, 阶梯] - playbooks: [memory_leak, gpu_pressure] + skills: [memory_leak, gpu_pressure] comm_slow: label: "通信慢 / NCCL" - keywords: [通信慢, NCCL, all_reduce, 通信瓶颈, collective, 带宽] - playbooks: [comm_bottleneck, slow_rank] + keywords: [通信慢, NCCL, all_reduce, 通信瓶颈, collective, 带宽, culprit, victim, recv_wait, gpu_wait] + skills: [comm_bottleneck, nccl_culprit_victim, slow_rank] + + nccl_wait: + label: "NCCL wait 分解 / culprit victim" + keywords: [罪魁祸首, 受害者, send_gpu_wait, recv_wait, proxy wait, NCCL 等待, gpu wait] + skills: [nccl_culprit_victim, slow_rank] cluster_view: label: "集群 / 多机训练" keywords: [集群, 多机, 分布式, cluster, multi-node, 跨节点, 所有 rank, all ranks, fan-out] - playbooks: [slow_rank, comm_bottleneck, health_overview] + skills: [slow_rank, comm_bottleneck, health_overview] diff --git a/playbooks/semantic/pages.yaml b/python/probing/_skills/semantic/pages.yaml similarity index 68% rename from playbooks/semantic/pages.yaml rename to python/probing/_skills/semantic/pages.yaml index 683ba20d..397c278b 100644 --- a/playbooks/semantic/pages.yaml +++ b/python/probing/_skills/semantic/pages.yaml @@ -1,4 +1,4 @@ -# Workspace pages → suggested playbooks (Investigate page awareness). +# Workspace pages → suggested skills (Investigate page awareness). apiVersion: probing.dev/v1 kind: PageCatalog @@ -7,70 +7,70 @@ pages: title: Dashboard path: / description: "Live CPU/GPU metrics, process overview, thread ranking." - playbooks: [health_overview] + skills: [health_overview] agent: title: Investigate path: /agent - description: "Playbook-driven investigation; optional LLM diagnostic agent summarizes SQL evidence." - playbooks: [health_overview] + description: "Skill-driven investigation; optional LLM diagnostic agent summarizes SQL evidence." + skills: [health_overview] cluster: title: Cluster path: /cluster description: "Distributed training cluster nodes and rank status." - playbooks: [slow_rank, comm_bottleneck] + skills: [slow_rank, comm_bottleneck] stacks: title: Stacks path: /stacks description: "Live mixed Python + native call stacks." - playbooks: [training_hang] + skills: [training_hang] profiling/pprof: title: "Profiling · pprof" path: /profiling/pprof description: "CPU SIGPROF sampling flamegraph." - playbooks: [training_hang, module_bottleneck] + skills: [training_hang, module_bottleneck] profiling/torch: title: "Profiling · torch" path: /profiling/torch description: "PyTorch module hook flamegraph (python.torch_trace)." - playbooks: [module_bottleneck, memory_leak] + skills: [module_bottleneck, memory_leak] profiling/trace: title: "Profiling · trace" path: /profiling/trace description: "Chrome trace event timeline." - playbooks: [module_bottleneck] + skills: [module_bottleneck] analytics: title: Analytics path: /analytics description: "Ad-hoc SQL analytics and time-series charts." - playbooks: [health_overview, comm_bottleneck, slow_rank] + skills: [health_overview, comm_bottleneck, slow_rank] spans: title: Spans path: /spans description: "Hierarchical tracing spans from python.trace_event." - playbooks: [training_hang, comm_bottleneck] + skills: [training_hang, comm_bottleneck] training: title: Training path: /training description: "Training step metrics and collective communication latency." - playbooks: [slow_rank, comm_bottleneck, module_bottleneck] + skills: [slow_rank, comm_bottleneck, module_bottleneck] pulsing: title: Pulsing path: /pulsing description: "Ray/Pulsing actors and span capture." - playbooks: [] + skills: [] python: title: Python path: /python description: "Live Python variable tracing on functions." - playbooks: [] + skills: [] diff --git a/playbooks/semantic/tables.yaml b/python/probing/_skills/semantic/tables.yaml similarity index 59% rename from playbooks/semantic/tables.yaml rename to python/probing/_skills/semantic/tables.yaml index 832f281a..7ce954d6 100644 --- a/playbooks/semantic/tables.yaml +++ b/python/probing/_skills/semantic/tables.yaml @@ -1,5 +1,5 @@ # Semantic layer: maps user/agent language to probing SQL tables and columns. -# Used in system prompts and playbook prerequisite checks. +# Used in system prompts and skill prerequisite checks. apiVersion: probing.dev/v1 kind: SemanticCatalog @@ -9,6 +9,9 @@ tables: synonyms: [torch trace, module timing, 模块耗时, 训练步 profiling] key_columns: step: "Training step index (int)" + global_step: "Global training step (from Rust step_snapshot)" + rank: "torch.distributed rank" + role: "Parallel role key, e.g. 'dp=2,pp=1,tp=0' (align/join across ranks)" module: "Fully-qualified module name" stage: "One of: forward, step (post forward / post step hooks)" duration: "Hook duration in seconds" @@ -26,11 +29,12 @@ tables: global_step: "Global training step" local_step: "Local step on this rank" rank: "torch.distributed rank" + role: "Parallel role key, e.g. 'dp=2,pp=1,tp=0' (align/join across ranks)" op: "Collective operation name" duration_ms: "Wall time in milliseconds" bytes: "Tensor bytes communicated" global_name: global.python.comm_collective - federation_columns: [_host, _addr, _rank] + federation_columns: [_host, _addr, _rank, _role] python.trace_event: description: "Span start/end and custom events (distributed tracing)" @@ -89,4 +93,47 @@ tables: rank: "Global rank" host: "Hostname" addr: "probing HTTP address" + role: "Parallel role key, e.g. dp=2,pp=1,tp=0 (federation _role source)" status: "Node status" + + nccl.proxy_ops: + description: "NCCL profiler plugin proxy-op wait decomposition (culprit vs victim)" + synonyms: [NCCL proxy, send_gpu_wait, recv_wait, culprit, victim, proxy wait] + key_columns: + ts: "Event timestamp (nanoseconds)" + rank: "torch.distributed rank" + tp_rank: "Tensor-parallel rank (-1 if unknown)" + pp_rank: "Pipeline-parallel rank (-1 if unknown)" + dp_rank: "Data-parallel rank (-1 if unknown)" + comm_hash: "NCCL communicator hash" + coll_func: "Collective name (AllReduce, AllGather, …)" + seq: "Collective sequence number" + channel_id: "NCCL channel id" + peer: "Peer rank for this proxy op" + is_send: "1 if send proxy, 0 if recv" + n_steps: "ProxyStep count aggregated" + trans_bytes: "Bytes transferred" + send_gpu_wait_ns: "Culprit signal — local GPU not ready to send" + send_wait_ns: "Send-side network wait" + recv_wait_ns: "Victim signal — waiting on peer data" + recv_flush_wait_ns: "Recv flush wait" + global_name: global.nccl.proxy_ops + federation_columns: [_host, _addr, _rank, _role] + notes: + - "Requires NCCL_PROFILER_PLUGIN + NCCL ≥ 2.26 (mask 26: Coll|ProxyOp|ProxyStep)" + - "macOS dev: PROBING_NCCL_MOCK=1 seeds synthetic culprit/victim pattern" + + nccl.net_qp: + description: "NCCL NetPlugin IB QP completion timing (optional mask bit 128)" + synonyms: [IB QP, RoCE, net plugin, qp duration] + key_columns: + ts: "Event timestamp (nanoseconds)" + rank: "torch.distributed rank" + device: "IB device index" + qp_num: "Queue pair number" + wr_id: "Work request id" + opcode: "IB opcode" + length: "Transfer length" + duration_ns: "QP completion duration" + global_name: global.nccl.net_qp + federation_columns: [_host, _addr, _rank, _role] diff --git a/python/probing/_skills/slow_rank/SKILL.md b/python/probing/_skills/slow_rank/SKILL.md new file mode 100644 index 00000000..c8230383 --- /dev/null +++ b/python/probing/_skills/slow_rank/SKILL.md @@ -0,0 +1,31 @@ +--- +name: slow_rank +description: > + Find straggler ranks via collective latency imbalance +category: distributed +tables: [python.comm_collective, global.python.comm_collective, nccl.proxy_ops] +tags: [rank, straggler, distributed, collective, 拖后腿] +keywords: + en: ['slow rank', 'straggler', 'lagging rank', 'which rank'] + zh: ['慢 rank', '拖后腿', 'straggler', '掉队', '哪个 rank', 'rank 慢'] +parameters: + step_window: { type: integer, default: 20 } + use_global: { type: boolean, default: True } +--- + +# Find slow rank (straggler) + +对比各 rank 的 collective 延迟,找出明显偏慢的 straggler。 +单机多卡时 rank 列来自 torch.distributed;多机时使用 global.* 并带 _host/_rank 标签。 + +## Parameters + +- `step_window` (integer, default `20`): Include collectives from the last N global_steps +- `use_global` (boolean, default `True`): Query global.python.comm_collective for cross-node fan-out + +## Related skills + +- 某 rank 持续最慢 → 检查该节点 GPU/网络/数据: skill: gpu_pressure +- 栈卡在 collective → skill: training_hang +- 模块级热点 → skill: module_bottleneck (在慢 rank 上 inject) +- 有 NCCL profiler → skill: nccl_culprit_victim diff --git a/playbooks/diagnostics/slow_rank.yaml b/python/probing/_skills/slow_rank/steps.yaml similarity index 82% rename from playbooks/diagnostics/slow_rank.yaml rename to python/probing/_skills/slow_rank/steps.yaml index b33c61aa..7d5fabc1 100644 --- a/playbooks/diagnostics/slow_rank.yaml +++ b/python/probing/_skills/slow_rank/steps.yaml @@ -1,5 +1,5 @@ apiVersion: probing.dev/v1 -kind: Playbook +kind: Skill metadata: id: slow_rank @@ -30,6 +30,8 @@ spec: any_tables: - python.comm_collective - global.python.comm_collective + - nccl.proxy_ops + - global.nccl.proxy_ops steps: - id: rank_latency @@ -126,6 +128,27 @@ spec: LIMIT 10 on_empty: skip + - id: nccl_wait_decomp + title: "NCCL wait 分解 (若已启用 profiler)" + type: sql + sql: | + SELECT + rank, + sum(send_gpu_wait_ns) AS gpu_wait_ns, + sum(recv_wait_ns) AS recv_wait_ns, + count(*) AS proxy_ops + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {step_window} + FROM {nccl_proxy_table} + ) + GROUP BY rank + ORDER BY recv_wait_ns DESC + on_empty: skip + empty_message: | + 无 nccl.proxy_ops — 粗粒度 collective 仍可用。 + 启用: NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) + - id: open_analytics title: "打开 Analytics 查看 collective" type: ui @@ -135,6 +158,7 @@ spec: variables: table_comm: "{comm_table}" + nccl_proxy_table: "{nccl_proxy_table}" interpretation: rules: @@ -155,6 +179,7 @@ spec: - **step_straggler**: 哪些 step 上 lag 最大 next_steps: - - "某 rank 持续最慢 → 检查该节点 GPU/网络/数据: playbook: gpu_pressure" - - "栈卡在 collective → playbook: training_hang" - - "模块级热点 → playbook: module_bottleneck (在慢 rank 上 inject)" + - "某 rank 持续最慢 → 检查该节点 GPU/网络/数据: skill: gpu_pressure" + - "栈卡在 collective → skill: training_hang" + - "模块级热点 → skill: module_bottleneck (在慢 rank 上 inject)" + - "有 nccl.proxy_ops → skill: nccl_culprit_victim (culprit/victim 归因)" diff --git a/python/probing/_skills/training_hang/SKILL.md b/python/probing/_skills/training_hang/SKILL.md new file mode 100644 index 00000000..6b8d27cf --- /dev/null +++ b/python/probing/_skills/training_hang/SKILL.md @@ -0,0 +1,28 @@ +--- +name: training_hang +description: > + Training stalled — capture stacks and thread/blocking hints +category: reliability +tables: [python.backtrace, cpu.utilization, python.trace_event, python.comm_collective] +tags: [hang, stall, deadlock, 卡住, 不动] +keywords: + en: ['hang', 'stuck', 'stall', 'frozen', 'deadlock', 'not progressing'] + zh: ['卡住', 'hang', '不动', '停住', 'deadlock', '死锁', 'loss 不更新'] +parameters: + stack_depth: { type: integer, default: 20 } +--- + +# Training hang diagnosis + +Loss 不更新、进程仍存活但无进展时使用。 +组合:实时混合栈 + CPU 线程 wchan + 最近 trace 活动。 + +## Parameters + +- `stack_depth` (integer, default `20`): Backtrace frames to show + +## Related skills + +- 栈在 dist/barrier → 检查各 rank 是否都存活: probing list / cluster nodes +- 栈在 DataLoader → 减少 num_workers 或检查数据路径 +- 需要持续采样 → SET probing.pprof.sample_freq=99 后 skill: module_bottleneck diff --git a/playbooks/diagnostics/training_hang.yaml b/python/probing/_skills/training_hang/steps.yaml similarity index 96% rename from playbooks/diagnostics/training_hang.yaml rename to python/probing/_skills/training_hang/steps.yaml index a815a746..b9f8fa78 100644 --- a/playbooks/diagnostics/training_hang.yaml +++ b/python/probing/_skills/training_hang/steps.yaml @@ -1,5 +1,5 @@ apiVersion: probing.dev/v1 -kind: Playbook +kind: Skill metadata: id: training_hang @@ -106,9 +106,9 @@ spec: ## Hang 诊断 1. 查看 **backtrace** / **backtrace_sql** 最内层 frame 2. **top_wchan** 提示内核级等待原因 - 3. **last_collective** 若停在 collective 上 → 试 playbook: slow_rank + 3. **last_collective** 若停在 collective 上 → 试 skill: slow_rank next_steps: - "栈在 dist/barrier → 检查各 rank 是否都存活: probing list / cluster nodes" - "栈在 DataLoader → 减少 num_workers 或检查数据路径" - - "需要持续采样 → SET probing.pprof.sample_freq=99 后 playbook: module_bottleneck" + - "需要持续采样 → SET probing.pprof.sample_freq=99 后 skill: module_bottleneck" diff --git a/python/probing/cli/__main__.py b/python/probing/cli/__main__.py index 60402aab..689d3dc8 100644 --- a/python/probing/cli/__main__.py +++ b/python/probing/cli/__main__.py @@ -3,6 +3,8 @@ # Set CLI mode before any probing imports to skip probe initialization os.environ["PROBING_CLI_MODE"] = "1" +# Rust CLI subcommands (e.g. skill install) delegate to ``python -m probing.skills``. +os.environ.setdefault("PROBING_PYTHON", sys.executable) def main(): diff --git a/python/probing/dev_pth.py b/python/probing/dev_pth.py new file mode 100644 index 00000000..1012e615 --- /dev/null +++ b/python/probing/dev_pth.py @@ -0,0 +1,71 @@ +"""Install the develop-mode ``probing_hook.pth`` (pairs with maturin ``probing.pth``). + +``maturin develop`` writes ``probing.pth`` with only the repo ``python/`` path. +Wheel installs ``probing.pth`` with ``import probing_hook`` because the package +lives directly in site-packages. This module restores the same auto-hook behavior +for editable installs without fighting maturin's generated path file. +""" + +from __future__ import annotations + +import site +import sys +from pathlib import Path + +HOOK_PTH_NAME = "probing_hook.pth" +HOOK_PTH_LINE = "import probing_hook\n" + + +def repo_python_dir() -> Path: + return Path(__file__).resolve().parents[1] + + +def hook_pth_path() -> Path: + return Path(site.getsitepackages()[0]) / HOOK_PTH_NAME + + +def install_dev_hook() -> Path: + target = hook_pth_path() + target.write_text(HOOK_PTH_LINE, encoding="utf-8") + return target + + +def remove_dev_hook() -> bool: + target = hook_pth_path() + if target.is_file(): + target.unlink() + return True + return False + + +def is_dev_hook_installed() -> bool: + target = hook_pth_path() + return target.is_file() and target.read_text(encoding="utf-8") == HOOK_PTH_LINE + + +def main(argv: list[str] | None = None) -> int: + argv = argv if argv is not None else sys.argv[1:] + cmd = argv[0] if argv else "install" + + if cmd == "install": + path = install_dev_hook() + print(f"installed {path}") + print(f" python path via maturin probing.pth → {repo_python_dir()}") + return 0 + + if cmd == "remove": + print("removed" if remove_dev_hook() else "not installed") + return 0 + + if cmd == "status": + path = hook_pth_path() + print(f"hook: {'ok' if is_dev_hook_installed() else 'missing'} ({path})") + print(f"python: {repo_python_dir()}") + return 0 if is_dev_hook_installed() else 1 + + print("usage: python probing/dev_pth.py [install|remove|status]", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/python/probing/ext/torch.py b/python/probing/ext/torch.py index ee35dea9..40772c94 100644 --- a/python/probing/ext/torch.py +++ b/python/probing/ext/torch.py @@ -45,10 +45,6 @@ def optimizer_step_post_hook(optimizer, *args, **kwargs): install_hooks(opt=optimizer, tracer=tracer) hooks[optimizer] = tracer - from probing.profiling.torch import next_step - - next_step() - def collective_hook(): """Autostart low-overhead collective tracing for distributed torch jobs.""" diff --git a/python/probing/libs/.gitkeep b/python/probing/libs/.gitkeep new file mode 100644 index 00000000..6a972fc6 --- /dev/null +++ b/python/probing/libs/.gitkeep @@ -0,0 +1 @@ +# Populated at wheel build time on Linux (libprobing_nccl_profiler.so). diff --git a/python/probing/nccl/__init__.py b/python/probing/nccl/__init__.py new file mode 100644 index 00000000..47aba0c4 --- /dev/null +++ b/python/probing/nccl/__init__.py @@ -0,0 +1,79 @@ +"""NCCL profiler plugin helpers (Linux, NCCL ≥ 2.26).""" + +from __future__ import annotations + +import os +import sys +from pathlib import Path + +__all__ = ["plugin_path", "DEFAULT_EVENT_MASK", "seed_mock", "maybe_auto_seed"] + +# Coll | ProxyOp | ProxyStep +DEFAULT_EVENT_MASK = 26 + +_LIB_BASENAME = "libprobing_nccl_profiler" +_ENV_OVERRIDE = "PROBING_NCCL_PROFILER" + + +def _lib_filename() -> str: + if sys.platform == "linux": + return f"{_LIB_BASENAME}.so" + if sys.platform == "darwin": + return f"{_LIB_BASENAME}.dylib" + raise OSError(f"NCCL profiler plugin is not supported on {sys.platform}") + + +def _candidate_paths() -> list[Path]: + pkg_root = Path(__file__).resolve().parent.parent + name = _lib_filename() + out = [ + pkg_root / "libs" / name, + ] + # Editable / source tree: repo target/ after `make nccl-profiler` + repo_root = Path(__file__).resolve().parents[3] + for profile in ("release", "debug"): + out.append(repo_root / "target" / profile / name) + return out + + +def plugin_path() -> str: + """Absolute path to the NCCL profiler plugin shared library. + + Resolution order: + 1. ``PROBING_NCCL_PROFILER`` environment variable + 2. ``probing/libs/libprobing_nccl_profiler.so`` (wheel) + 3. ``target/release|debug/`` (local ``cargo build -p probing-nccl-profiler``) + """ + override = os.environ.get(_ENV_OVERRIDE) + if override: + path = Path(override).expanduser().resolve() + if not path.is_file(): + raise FileNotFoundError( + f"{_ENV_OVERRIDE}={override!r} does not point to an existing file" + ) + return str(path) + + if sys.platform != "linux": + raise OSError( + "NCCL profiler plugin is only available on Linux; " + f"set {_ENV_OVERRIDE} if you have a custom build" + ) + + for candidate in _candidate_paths(): + if candidate.is_file(): + return str(candidate.resolve()) + + searched = ", ".join(str(p) for p in _candidate_paths()) + raise FileNotFoundError( + "NCCL profiler plugin not found. Build with " + "`cargo build -p probing-nccl-profiler --release` or " + f"set {_ENV_OVERRIDE}. Searched: {searched}" + ) + + +def __getattr__(name: str): + if name in ("seed_mock", "maybe_auto_seed"): + from probing.nccl.mock import maybe_auto_seed, seed_mock + + return seed_mock if name == "seed_mock" else maybe_auto_seed + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/python/probing/nccl/__main__.py b/python/probing/nccl/__main__.py new file mode 100644 index 00000000..a5a3802b --- /dev/null +++ b/python/probing/nccl/__main__.py @@ -0,0 +1,74 @@ +"""CLI: ``python -m probing.nccl --plugin-path``""" + +from __future__ import annotations + +import argparse +import sys + +from probing.nccl import DEFAULT_EVENT_MASK, plugin_path +from probing.nccl.mock import seed_mock + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser( + prog="python -m probing.nccl", + description="NCCL profiler plugin utilities", + ) + parser.add_argument( + "--plugin-path", + action="store_true", + help="print absolute path to libprobing_nccl_profiler.so (for NCCL_PROFILER_PLUGIN)", + ) + parser.add_argument( + "--event-mask", + action="store_true", + help=f"print default NCCL_PROFILE_EVENT_MASK ({DEFAULT_EVENT_MASK})", + ) + parser.add_argument( + "--seed-mock", + action="store_true", + help="write synthetic nccl.proxy_ops / nccl.net_qp rows (macOS dev, no NCCL)", + ) + parser.add_argument( + "--ranks", + type=int, + default=8, + help="world size for --seed-mock (default: 8)", + ) + parser.add_argument( + "--ops", + type=int, + default=5, + help="collective ops per rank for --seed-mock (default: 5)", + ) + args = parser.parse_args(argv) + + if args.plugin_path: + try: + print(plugin_path()) + except (OSError, FileNotFoundError) as e: + print(e, file=sys.stderr) + return 1 + return 0 + + if args.event_mask: + print(DEFAULT_EVENT_MASK) + return 0 + + if args.seed_mock: + try: + counts = seed_mock(ranks=args.ranks, ops_per_rank=args.ops) + except Exception as e: + print(f"seed-mock failed: {e}", file=sys.stderr) + return 1 + for table, n in counts.items(): + print(f"{table}: {n} rows", file=sys.stderr) + print("ok", file=sys.stderr) + return 0 + + parser.print_help(sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/python/probing/nccl/mock.py b/python/probing/nccl/mock.py new file mode 100644 index 00000000..84626678 --- /dev/null +++ b/python/probing/nccl/mock.py @@ -0,0 +1,232 @@ +"""Mock ``nccl.*`` memtables for local debugging (macOS / dev without NCCL).""" + +from __future__ import annotations + +import os +import sys +import time +from typing import Iterable + +PROXY_OPS_TABLE = "nccl.proxy_ops" +NET_QP_TABLE = "nccl.net_qp" + +PROXY_OPS_COLUMNS = [ + "ts", + "rank", + "tp_rank", + "pp_rank", + "dp_rank", + "comm_hash", + "coll_func", + "seq", + "channel_id", + "peer", + "is_send", + "n_steps", + "trans_bytes", + "send_gpu_wait_ns", + "send_wait_ns", + "recv_wait_ns", + "recv_flush_wait_ns", +] + +NET_QP_COLUMNS = [ + "ts", + "rank", + "device", + "qp_num", + "wr_id", + "opcode", + "length", + "duration_ns", +] + +# rank 2: culprit (slow GPU → high send_gpu_wait) +# rank 5: victim (waits on peers → high recv_wait) +_CULPRIT_RANK = 2 +_VICTIM_RANK = 5 + +_seeded = False + + +def _mock_env_enabled() -> bool: + default = "auto" if sys.platform == "darwin" else "0" + raw = os.environ.get("PROBING_NCCL_MOCK", default).strip().lower() + if raw in ("0", "off", "false", "no"): + return False + if raw in ("1", "true", "yes", "on"): + return True + if raw == "auto": + if sys.platform == "darwin": + return True + if sys.platform == "linux": + try: + from probing.nccl import plugin_path + + plugin_path() + return False + except (OSError, FileNotFoundError): + return True + return False + + +def _proxy_row( + *, + ts_ns: int, + rank: int, + seq: int, + channel_id: int, + is_send: int, + coll_func: str = "AllReduce", + comm_hash: int = 0xDEAD_BEEF, + peer: int | None = None, + n_steps: int = 4, + trans_bytes: int = 1 << 20, + send_gpu_wait_ns: int = 0, + send_wait_ns: int = 0, + recv_wait_ns: int = 0, + recv_flush_wait_ns: int = 0, +) -> list[object]: + # Simple role mapping for mock fault injection (culprit=2, victim=5). + tp = rank % 2 + pp = (rank // 2) % 2 + dp = rank // 4 + return [ + ts_ns, + rank, + tp, + pp, + dp, + comm_hash, + coll_func, + seq, + channel_id, + peer if peer is not None else (rank + 1) % 8, + is_send, + n_steps, + trans_bytes, + send_gpu_wait_ns, + send_wait_ns, + recv_wait_ns, + recv_flush_wait_ns, + ] + + +def _net_qp_row( + *, + ts_ns: int, + rank: int, + wr_id: int, + qp_num: int = 42, + device: int = 0, + opcode: int = 0, + length: int = 65536, + duration_ns: int = 1200, +) -> list[object]: + return [ts_ns, rank, device, qp_num, wr_id, opcode, length, duration_ns] + + +def _iter_proxy_rows( + ranks: int, + ops_per_rank: int, + base_ts_ns: int, +) -> Iterable[list[object]]: + for seq in range(ops_per_rank): + ts = base_ts_ns + seq * 10_000_000 + for rank in range(ranks): + if rank == _CULPRIT_RANK: + yield _proxy_row( + ts_ns=ts, + rank=rank, + seq=seq, + channel_id=0, + is_send=1, + send_gpu_wait_ns=8_000_000, + send_wait_ns=500_000, + recv_wait_ns=200_000, + ) + yield _proxy_row( + ts_ns=ts + 1000, + rank=rank, + seq=seq, + channel_id=1, + is_send=0, + recv_wait_ns=300_000, + ) + elif rank == _VICTIM_RANK: + yield _proxy_row( + ts_ns=ts, + rank=rank, + seq=seq, + channel_id=0, + is_send=1, + send_gpu_wait_ns=100_000, + recv_wait_ns=150_000, + ) + yield _proxy_row( + ts_ns=ts + 1000, + rank=rank, + seq=seq, + channel_id=0, + is_send=0, + recv_wait_ns=12_000_000, + recv_flush_wait_ns=800_000, + ) + else: + yield _proxy_row( + ts_ns=ts, + rank=rank, + seq=seq, + channel_id=0, + is_send=1, + send_gpu_wait_ns=200_000, + send_wait_ns=300_000, + recv_wait_ns=250_000, + ) + + +def _iter_net_qp_rows( + ranks: int, ops_per_rank: int, base_ts_ns: int +) -> Iterable[list[object]]: + wr = 0 + for seq in range(ops_per_rank): + ts = base_ts_ns + seq * 10_000_000 + for rank in range(ranks): + duration = 15_000_000 if rank == _VICTIM_RANK else 800_000 + yield _net_qp_row( + ts_ns=ts, + rank=rank, + wr_id=wr, + duration_ns=duration, + ) + wr += 1 + + +def seed_mock(*, ranks: int = 8, ops_per_rank: int = 5) -> dict[str, int]: + """Write synthetic rows into ``nccl.proxy_ops`` and ``nccl.net_qp``. + + Returns row counts per table. Safe to call multiple times (appends more rows). + """ + from probing.external_table import ExternalTable + + base_ts_ns = time.time_ns() + + proxy = ExternalTable.get_or_create(PROXY_OPS_TABLE, PROXY_OPS_COLUMNS) + proxy_rows = list(_iter_proxy_rows(ranks, ops_per_rank, base_ts_ns)) + proxy.append_many(proxy_rows) + + net = ExternalTable.get_or_create(NET_QP_TABLE, NET_QP_COLUMNS) + net_rows = list(_iter_net_qp_rows(ranks, ops_per_rank, base_ts_ns)) + net.append_many(net_rows) + + return {PROXY_OPS_TABLE: len(proxy_rows), NET_QP_TABLE: len(net_rows)} + + +def maybe_auto_seed() -> bool: + """Seed mock tables once when ``PROBING_NCCL_MOCK`` allows it.""" + global _seeded + if _seeded or not _mock_env_enabled(): + return False + seed_mock() + _seeded = True + return True diff --git a/python/probing/parallel.py b/python/probing/parallel.py index 9c508787..6d10490c 100644 --- a/python/probing/parallel.py +++ b/python/probing/parallel.py @@ -75,3 +75,134 @@ def parallel_topology() -> ParallelTopology: def parallel_fields() -> Dict[str, int]: """Topology dict omitting unset (-1) entries.""" return {k: v for k, v in parallel_topology().as_dict().items() if v >= 0} + + +# Parallel-role dimensions: canonical short name -> candidate env vars (priority +# order). Register a new dimension here (e.g. expert/context parallel) and it is +# picked up everywhere — no table schema change, because the role is encoded as a +# single string column rather than one column per dimension. +_ROLE_DIMENSIONS = ( + ("tp", ("TENSOR_MODEL_PARALLEL_RANK", "TP_RANK", "PROBING_TP_RANK")), + ("pp", ("PIPELINE_MODEL_PARALLEL_RANK", "PP_RANK", "PROBING_PP_RANK")), + ("dp", ("DATA_PARALLEL_RANK", "DP_RANK", "PROBING_DP_RANK")), + ( + "ep", + ( + "EXPERT_MODEL_PARALLEL_RANK", + "EXPERT_PARALLEL_RANK", + "EP_RANK", + "PROBING_EP_RANK", + ), + ), + ("cp", ("CONTEXT_PARALLEL_RANK", "CP_RANK", "PROBING_CP_RANK")), +) + +# Ad-hoc dimensions: ``PROBING_ROLE_=`` adds ```` with no code change. +_ROLE_ENV_PREFIX = "PROBING_ROLE_" + + +def role_dims() -> Dict[str, int]: + """Collect all set parallel-role dimensions as ``{name: rank}``. + + Known dimensions come from ``_ROLE_DIMENSIONS``; any ``PROBING_ROLE_`` + environment variable contributes a custom dimension. + """ + dims: Dict[str, int] = {} + for name, keys in _ROLE_DIMENSIONS: + value = _read_int(keys) + if value is not None and value >= 0: + dims[name] = value + for key, raw in os.environ.items(): + if not key.startswith(_ROLE_ENV_PREFIX): + continue + name = key[len(_ROLE_ENV_PREFIX) :].strip().lower() + if not name or name in dims: + continue + try: + value = int(str(raw).strip()) + except (TypeError, ValueError): + continue + if value >= 0: + dims[name] = value + return dims + + +def role_key() -> str: + """Encode the parallel role as a canonical, sortable string. + + Example: ``"dp=2,pp=1,tp=0"`` — dimensions are sorted by name so the same + physical role always yields the same key (suitable for ``GROUP BY role``). + Returns ``""`` when no parallel-role env is set. Prefer this single field + over per-dimension columns so new dimensions need no schema change. + """ + dims = role_dims() + return ",".join(f"{name}={dims[name]}" for name in sorted(dims)) + + +# --- Runtime role override ------------------------------------------------- +# The effective role is normally derived from env (role_key). ``set_role`` lets +# a process override it at runtime (e.g. frameworks that decide placement after +# import). ``current_role`` is the effective value used by data rows and the +# cluster Node payload; prefer it over ``role_key`` at call sites. +_ROLE_OVERRIDE: Optional[str] = None + + +def _normalize_role(role) -> str: + """Normalize a role spec (str | mapping | None) to a canonical KV string.""" + if role is None: + return "" + if isinstance(role, str): + return role.strip() + if isinstance(role, dict): + parts = [] + for name in sorted(role): + value = role[name] + if value is None: + continue + parts.append(f"{str(name).strip()}={value}") + return ",".join(parts) + raise TypeError(f"role must be str, dict, or None, got {type(role).__name__}") + + +def current_role() -> str: + """Effective parallel role for this process: runtime override if set, + otherwise derived from environment via ``role_key``.""" + if _ROLE_OVERRIDE is not None: + return _ROLE_OVERRIDE + return role_key() + + +def set_role(role=None, /, **dims) -> str: + """Override this process's parallel role at runtime. + + Accepts a canonical string, a mapping, or keyword dimensions:: + + set_role("dp=2,pp=1,tp=0") + set_role({"dp": 2, "pp": 1}) + set_role(dp=2, pp=1, tp=0) + + Returns the normalized role string now in effect. New ``torch_trace`` / + ``comm_collective`` rows pick it up immediately; the cluster Node entry is + refreshed best-effort so federation ``_role`` tags stay consistent. + """ + global _ROLE_OVERRIDE + spec = dict(dims) if dims else role + _ROLE_OVERRIDE = _normalize_role(spec) + _refresh_cluster_role() + return _ROLE_OVERRIDE + + +def clear_role() -> None: + """Drop the runtime override; revert to the env-derived role.""" + global _ROLE_OVERRIDE + _ROLE_OVERRIDE = None + + +def _refresh_cluster_role() -> None: + """Best-effort re-register this node so the master sees the new role.""" + try: + from probing import torchrun_cluster + + torchrun_cluster.refresh_node_role() + except Exception: # pragma: no cover - cluster may be absent/not set up + pass diff --git a/python/probing/playbooks/__init__.py b/python/probing/playbooks/__init__.py deleted file mode 100644 index 36e145eb..00000000 --- a/python/probing/playbooks/__init__.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Probing diagnostic playbooks — shared by CLI doctor and Web agent.""" - -from probing.playbooks.loader import ( - Playbook, - PlaybookCatalog, - PlaybookStep, - expand_playbook, - load_catalog, - load_intents, - load_pages, - load_playbook, - load_semantic_catalog, - match_playbooks, - playbooks_root, - validate_all, -) -from probing.playbooks.interpret import ( - InterpretFinding, - StepEvidence, - evaluate_rules, - evidence_from_dataframe, - rule_matches, -) - -__all__ = [ - "Playbook", - "PlaybookCatalog", - "PlaybookStep", - "InterpretFinding", - "StepEvidence", - "evaluate_rules", - "evidence_from_dataframe", - "expand_playbook", - "load_catalog", - "load_intents", - "load_pages", - "load_playbook", - "load_semantic_catalog", - "match_playbooks", - "playbooks_root", - "rule_matches", - "validate_all", -] diff --git a/python/probing/playbooks/__main__.py b/python/probing/playbooks/__main__.py deleted file mode 100644 index 6b2f9149..00000000 --- a/python/probing/playbooks/__main__.py +++ /dev/null @@ -1,28 +0,0 @@ -"""CLI: python -m probing.playbooks validate""" - -from __future__ import annotations - -import sys - -from probing.playbooks.loader import load_catalog, playbooks_root, validate_all - - -def main() -> int: - root = playbooks_root() - if not root.is_dir(): - print(f"playbooks directory not found: {root}", file=sys.stderr) - return 1 - catalog = load_catalog(root) - print(f"Catalog: {len(catalog.playbooks)} playbooks under {root}") - warnings = validate_all(root) - if warnings: - print("Warnings:") - for w in warnings: - print(f" - {w}") - return 1 - print("OK — all playbooks valid") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/python/probing/playbooks/test_loader.py b/python/probing/playbooks/test_loader.py deleted file mode 100644 index e723158c..00000000 --- a/python/probing/playbooks/test_loader.py +++ /dev/null @@ -1,62 +0,0 @@ -"""Tests for playbook loader.""" - -from __future__ import annotations - -import pytest - -yaml = pytest.importorskip("yaml") - -from probing.playbooks.loader import ( - expand_playbook, - load_catalog, - load_playbook, - match_playbooks, - playbooks_root, - validate_all, -) - - -def test_playbooks_root_exists(): - root = playbooks_root() - assert root.is_dir() - assert (root / "catalog.yaml").is_file() - - -def test_catalog_loads_seven_playbooks(): - catalog = load_catalog() - assert len(catalog.playbooks) == 7 - ids = {p.id for p in catalog.playbooks} - assert "health_overview" in ids - assert "slow_rank" in ids - - -def test_expand_slow_rank_global(): - pb = load_playbook("slow_rank") - steps = expand_playbook(pb, {"use_global": True, "step_window": 10}) - rank_step = next(s for s in steps if s.id == "rank_latency") - assert rank_step.sql is not None - assert "global.python.comm_collective" in rank_step.sql - assert "{step_window}" not in rank_step.sql - - -def test_expand_slow_rank_local(): - pb = load_playbook("slow_rank") - steps = expand_playbook(pb, {"use_global": False, "step_window": 5}) - rank_step = next(s for s in steps if s.id == "rank_latency") - assert "python.comm_collective" in rank_step.sql - assert "global." not in rank_step.sql - - -def test_match_playbooks_hang(): - matched = match_playbooks("训练卡住了 hang") - assert "training_hang" in matched - - -def test_match_playbooks_straggler(): - matched = match_playbooks("哪个 rank 拖后腿 straggler") - assert "slow_rank" in matched - - -def test_validate_all_clean(): - warnings = validate_all() - assert warnings == [] diff --git a/python/probing/profiling/collective/record.py b/python/probing/profiling/collective/record.py index 28d41378..d9b1e313 100644 --- a/python/probing/profiling/collective/record.py +++ b/python/probing/profiling/collective/record.py @@ -14,7 +14,7 @@ from typing import Iterable, Optional from probing.core import table -from probing.parallel import parallel_fields +from probing.parallel import current_role from probing.tracing import ( _step_fields, comm_kind, @@ -36,12 +36,8 @@ class CommCollective: global_step: int = 0 rank: int = -1 world_size: int = -1 - tp_rank: int = -1 - pp_rank: int = -1 - dp_rank: int = -1 - tp_size: int = -1 - pp_size: int = -1 - dp_size: int = -1 + # Extensible parallel role (e.g. "dp=2,pp=1,tp=0"); see probing.parallel.role_key. + role: str = "" op: str = "" group_rank: int = 0 group_size: int = 0 @@ -53,18 +49,8 @@ class CommCollective: async_op: int = 0 -def _topology_row_fields() -> dict: - fields = parallel_fields() - row = { - "tp_rank": -1, - "pp_rank": -1, - "dp_rank": -1, - "tp_size": -1, - "pp_size": -1, - "dp_size": -1, - } - row.update(fields) - return row +def _role_row_fields() -> dict: + return {"role": current_role()} def _step_row_fields() -> dict: @@ -94,7 +80,7 @@ def _context_fields( ranks_json = json.dumps(list(participate_ranks)) if participate_ranks else "" return { **_step_row_fields(), - **_topology_row_fields(), + **_role_row_fields(), "op": op, "group_rank": group_rank, "group_size": group_size, diff --git a/python/probing/profiling/torch/__init__.py b/python/probing/profiling/torch/__init__.py index 78641492..f2e800c5 100644 --- a/python/probing/profiling/torch/__init__.py +++ b/python/probing/profiling/torch/__init__.py @@ -9,21 +9,21 @@ 1. Install/Uninstall hooks on PyTorch Modules and Optimizers. 2. Track forward passes and optimizer steps (backward hooks optional; disabled by default because they can alter autograd behaviour). -3. Manage training step lifecycle (`next_step`). + +The training step coordinate is owned by Rust (``probing.tracing.step_snapshot``); +there is no separate Python step counter here. Public Interfaces: - `install_hooks`: Attach profiling hooks to a model/optimizer. - `uninstall_hooks`: Remove attached hooks. -- `next_step`: Signal the start of a new training iteration. """ import torch from ..types import BaseTracer from .module_utils import module_analysis, module_get_fullname, module_name -from .step import next_step, step -__all__ = ["next_step", "step", "install_hooks", "uninstall_hooks"] +__all__ = ["install_hooks", "uninstall_hooks"] HOOK_CACHE = {} EVENT_COUNT = 0 diff --git a/python/probing/profiling/torch/step.py b/python/probing/profiling/torch/step.py deleted file mode 100644 index 4ba4d178..00000000 --- a/python/probing/profiling/torch/step.py +++ /dev/null @@ -1,32 +0,0 @@ -LAYER_ITER = 0 -OPTIM_ITER = 1 - - -def reset_layer(cnt=None): - global LAYER_ITER - cnt = 0 if cnt is None else cnt - LAYER_ITER = cnt - - -def next_layer(): - global LAYER_ITER - LAYER_ITER += 1 - - -def reset_step(cnt=None): - global OPTIM_ITER - cnt = 0 if cnt is None else cnt - OPTIM_ITER = cnt - - -def next_step(): - global OPTIM_ITER - OPTIM_ITER += 1 - - -def step(): - return OPTIM_ITER - - -def layer(): - return LAYER_ITER diff --git a/python/probing/profiling/torch_probe.py b/python/probing/profiling/torch_probe.py index 3fab1354..857e19ac 100644 --- a/python/probing/profiling/torch_probe.py +++ b/python/probing/profiling/torch_probe.py @@ -5,12 +5,13 @@ import probing from probing.core import table +from probing.parallel import current_role from probing.tracing import ( TRAIN_STEP_KIND, current_local_step, module_stage_kind, recorded_span, - sync_local_step, + step_snapshot, ) from .torch.module_utils import module_name @@ -51,6 +52,13 @@ class TorchTrace: duration: float = 0.0 allocated_delta: float = 0.0 max_allocated_delta: float = 0.0 + # Step coordinate + parallel role, so module-level local work can be aligned + # across ranks by role and joined with comm_collective. ``role`` is an + # extensible KV string (e.g. "dp=2,pp=1,tp=0"); see probing.parallel.role_key. + global_step: int = -1 + rank: int = -1 + world_size: int = -1 + role: str = "" @table @@ -664,6 +672,16 @@ def __init__(self, config: Optional[TorchProbeConfig] = None): exprs=config.exprs, ) + def _stamp_step_role(self, record) -> None: + """Fill step coordinate (local/global/rank) and parallel role on a record.""" + snap = step_snapshot() + if snap is not None: + record.step = int(snap.local_step) + record.global_step = int(snap.global_step) + record.rank = int(snap.rank) + record.world_size = int(snap.world_size) + record.role = current_role() + def _begin_train_step_span(self) -> None: if self._train_step_cm is not None: return @@ -695,7 +713,7 @@ def _complete_post_stage(self, mod, post_stage: str) -> None: span_key = (id(mod), mapped_stage) record = mem_stats() - record.step = current_local_step() + self._stamp_step_role(record) record.seq = self.offset() module_name_str = self._module_display_name(mod) record.module = module_name_str @@ -759,7 +777,7 @@ def log_module_stage(self, stage, mod, force=False) -> None: return record = mem_stats() - record.step = current_local_step() + self._stamp_step_role(record) record.seq = self.offset() module_name_str = self._module_display_name(mod) record.module = module_name_str diff --git a/python/probing/profiling/types.py b/python/probing/profiling/types.py index 00a44b2c..83aa8567 100644 --- a/python/probing/profiling/types.py +++ b/python/probing/profiling/types.py @@ -1,8 +1,6 @@ from dataclasses import dataclass from typing import Any -from .torch.step import next_step - @dataclass class TensorDef: @@ -14,25 +12,35 @@ def create(t): return TensorDef(t.shape, t.dtype) -# Global counter for tracking execution order within a step -MODULE_CALL_OFFSET = 0 -CURRENT_MODULE = None -CURRENT_STAGE = None - - class BaseTracer: + """Base hook dispatcher for module/optimizer instrumentation. + + Per-step execution ordering (``offset``) and the "current module/stage" + de-duplication state are kept on the instance — never as module globals — + so multiple tracers (e.g. one per optimizer) and concurrent training loops + cannot corrupt each other's sequencing or per-step time anchor. + + The authoritative training step coordinate lives in Rust + (``probing.tracing.step_snapshot``); this class no longer maintains a + separate Python step counter. + """ + + def __init__(self, **kwargs): + # Execution order within the current step; reset on each optimizer step. + self._module_call_offset = 0 + # Last (module_id, stage) seen, used to advance offset only on change. + self._current_module = None + self._current_stage = None + super().__init__(**kwargs) + def offset(self): - return MODULE_CALL_OFFSET + return self._module_call_offset def process_hook(self, module, stage): - global MODULE_CALL_OFFSET - global CURRENT_MODULE - global CURRENT_STAGE - - if CURRENT_MODULE != id(module) or CURRENT_STAGE != stage: - MODULE_CALL_OFFSET += 1 - CURRENT_MODULE = id(module) - CURRENT_STAGE = stage + if self._current_module != id(module) or self._current_stage != stage: + self._module_call_offset += 1 + self._current_module = id(module) + self._current_stage = stage def pre_forward_hook(self, m, i): self.log_module_stage("pre forward", m) @@ -57,6 +65,6 @@ def pre_step_hook(self, optimizer, args, kwargs): def post_step_hook(self, optimizer, args, kwargs): self.log_module_stage("post step", optimizer, force=False) self.process_hook(optimizer, "post step") - global MODULE_CALL_OFFSET - MODULE_CALL_OFFSET = 0 - next_step() + # New step begins: reset intra-step execution offset. The training step + # coordinate itself is advanced by the train-step span (Rust side). + self._module_call_offset = 0 diff --git a/python/probing/site_hook.py b/python/probing/site_hook.py new file mode 100644 index 00000000..ec6ef3ca --- /dev/null +++ b/python/probing/site_hook.py @@ -0,0 +1,118 @@ +"""Process startup hook: conditionally import probing based on ``PROBING``. + +Installed wheels run this via ``probing.pth`` → ``import probing_hook``. +Develop mode adds ``probing_hook.pth`` with the same import (see ``python/probing/dev_pth.py``). +""" + +from __future__ import annotations + +import os +import sys + +from probing._entrypoint import ( + current_script_name, + is_lightweight_module, + is_probing_cli, +) + +_RAN = False + + +def run_site_hook() -> None: + """Entry point for ``probing_hook`` / ``probing_hook.pth``.""" + global _RAN + if _RAN: + return + _RAN = True + + try: + import re + + script = current_script_name() + if ( + re.search("torchrun", script) is not None + or is_probing_cli() + or is_lightweight_module() + ): + return + _init_probing() + except Exception as exc: + print(f"Error in probing site hook: {exc}", file=sys.stderr) + + +def _init_probing() -> None: + probe_value = os.environ.get("PROBING", "0") + script_init: str | None = None + + if "PROBING" in os.environ: + os.environ["PROBING_ORIGINAL"] = os.environ["PROBING"] + + if probe_value.startswith("init:"): + parts = probe_value.split("+", 1) + script_init = parts[0][5:] + probe_value = parts[1] if len(parts) > 1 else "0" + + current_script = current_script_name() + + try: + if "PROBING" in os.environ: + del os.environ["PROBING"] + + if probe_value.lower() in ("1", "followed"): + print( + "Activating probing in 'followed' mode (current process only)", + file=sys.stderr, + ) + import probing # noqa: F401 + + _execute_init_script(script_init) + + elif probe_value.lower() in ("2", "nested"): + print( + "Activating probing in 'nested' mode (all child processes)", + file=sys.stderr, + ) + import probing # noqa: F401 + + os.environ["PROBING"] = probe_value + _execute_init_script(script_init) + + elif probe_value.lower().startswith("regex:"): + pattern = probe_value.split(":", 1)[1] + try: + import re + + if re.search(pattern, current_script) is not None: + print( + f"Activating probing for script matching '{pattern}'", + file=sys.stderr, + ) + import probing # noqa: F401 + + _execute_init_script(script_init) + os.environ["PROBING"] = probe_value + except Exception as exc: + print(f"Error in regex pattern '{pattern}': {exc}", file=sys.stderr) + + elif probe_value != "0": + if probe_value == current_script: + print( + f"Activating probing for '{current_script}' (current process only)", + file=sys.stderr, + ) + import probing # noqa: F401 + + _execute_init_script(script_init) + os.environ["PROBING"] = probe_value + + except ImportError as exc: + print(f"Error loading probing library: {exc}", file=sys.stderr) + except Exception as exc: + print(f"Unexpected error in probing site hook: {exc}", file=sys.stderr) + + +def _execute_init_script(script_init: str | None) -> None: + if script_init is None: + return + with open(script_init, encoding="utf-8") as handle: + exec(handle.read(), globals()) # noqa: S102 diff --git a/python/probing/skills/README.md b/python/probing/skills/README.md new file mode 100644 index 00000000..d6820b7b --- /dev/null +++ b/python/probing/skills/README.md @@ -0,0 +1,39 @@ +# `probing.skills` — Python runtime (not skill data) + +**This package is code, not skill content.** Skill folders live at the repo root +[`skills/`](../../../skills/README.md). Wheel installs ship a copy under +[`../_skills/`](../_skills/README.md). + +## Modules + +| Module | Role | +|--------|------| +| `loader.py` | Load `catalog.yaml`, `steps.yaml`, semantic YAML; expand templates | +| `paths.py` | Discover skill roots (repo, bundled, user, project, `PROBING_SKILLS_DIR`) | +| `install.py` | `probing skill install` / `update` — copy into agent skill dirs | +| `tools.py` | `list_skills`, `run_skill`, JSON helpers for agents | +| `interpret.py` | Rule evaluation on step results | +| `__main__.py` | `python -m probing.skills validate\|install\|update` | + +## Resolution order (later wins) + +1. Bundled `python/probing/_skills/` (wheel) +2. Repo `skills/` (checkout) +3. `~/.probing/skills/` +4. `/.probing/skills/` +5. `$PROBING_SKILLS_DIR` + +## Public API + +```python +from probing.skills.tools import list_skills, run_skill +from probing.skills.loader import load_skill, load_catalog +from probing.skills.install import install_skills +``` + +Rust CLI and Web UI embed the same catalog from repo `skills/` at compile time; +this package is used for Python tooling, install, and runtime overrides. + +## Tests + +`tests/unit/probing/skills/` — loader, interpret. `tests/regression/skills/` — install, tools. diff --git a/python/probing/skills/__init__.py b/python/probing/skills/__init__.py new file mode 100644 index 00000000..c547ff47 --- /dev/null +++ b/python/probing/skills/__init__.py @@ -0,0 +1,75 @@ +"""Probing diagnostic skills — shared by CLI, Web agent, and Python tooling.""" + +from probing.skills.loader import ( + Skill, + SkillCatalog, + SkillStep, + expand_skill, + load_catalog, + load_intents, + load_pages, + load_skill, + load_semantic_catalog, + match_skills, + skills_root, + validate_all, +) +from probing.skills.interpret import ( + InterpretFinding, + StepEvidence, + evaluate_rules, + evidence_from_dataframe, + rule_matches, +) +from probing.skills.install import install_skills +from probing.skills.paths import ( + AgentInstallTarget, + ALL_AGENTS, + bundled_skills_dir, + detect_agent_install_targets, + detect_agent_presence, + find_repo_root, + repo_skills_dir, + skill_roots, +) +from probing.skills.tools import ( + list_skills, + list_skills_json, + plan_skill_run, + run_skill, + run_skill_json, +) + +__all__ = [ + "Skill", + "SkillCatalog", + "SkillStep", + "InterpretFinding", + "StepEvidence", + "AgentInstallTarget", + "ALL_AGENTS", + "bundled_skills_dir", + "detect_agent_install_targets", + "detect_agent_presence", + "find_repo_root", + "repo_skills_dir", + "evaluate_rules", + "evidence_from_dataframe", + "expand_skill", + "install_skills", + "list_skills", + "list_skills_json", + "load_catalog", + "load_intents", + "load_pages", + "load_skill", + "load_semantic_catalog", + "match_skills", + "plan_skill_run", + "run_skill", + "run_skill_json", + "skill_roots", + "skills_root", + "rule_matches", + "validate_all", +] diff --git a/python/probing/skills/__main__.py b/python/probing/skills/__main__.py new file mode 100644 index 00000000..7e637488 --- /dev/null +++ b/python/probing/skills/__main__.py @@ -0,0 +1,46 @@ +"""CLI: python -m probing.skills validate|install|update""" + +from __future__ import annotations + +import sys + +from probing.skills.loader import load_catalog, validate_all +from probing.skills.paths import repo_skills_dir, skill_roots + + +def _roots_display() -> str: + roots = skill_roots() + if not roots: + return "(none)" + return ", ".join(f"{r.label}:{r.path}" for r in roots) + + +def main() -> int: + if len(sys.argv) > 1 and sys.argv[1] in ("install", "update"): + from probing.skills.install import main as install_main + + return install_main([sys.argv[1], *sys.argv[2:]]) + + roots = skill_roots() + if not roots: + print( + "No skills directory found (repo skills/, bundled, or PROBING_SKILLS_DIR)", + file=sys.stderr, + ) + return 1 + catalog = load_catalog() + print(f"Catalog: {len(catalog.skills)} skills") + print(f"Roots: {_roots_display()}") + if repo := repo_skills_dir(): + print(f"Repo skills: {repo}") + warnings = validate_all() + if warnings: + for w in warnings: + print(f"WARN: {w}", file=sys.stderr) + return 1 + print("OK — all skills valid") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/python/probing/skills/install.py b/python/probing/skills/install.py new file mode 100644 index 00000000..c49f93d3 --- /dev/null +++ b/python/probing/skills/install.py @@ -0,0 +1,252 @@ +"""Install probing skills into Cursor, Claude Code, and Codex skill directories.""" + +from __future__ import annotations + +import argparse +import json +import shutil +import sys +from dataclasses import asdict, dataclass +from datetime import datetime, timezone +from pathlib import Path +from typing import List, Optional, Sequence + +from probing import VERSION as probing_version + +from probing.skills.paths import ( + ALL_AGENTS, + AgentInstallTarget, + default_install_source, + detect_agent_install_targets, + detect_agent_presence, + iter_skill_ids_in_root, +) + +MANIFEST_NAME = ".probing-skills-install.json" + + +@dataclass +class InstallManifest: + version: str + source: str + skills: List[str] + targets: List[dict] + installed_at: str + + @classmethod + def load(cls, path: Path) -> Optional["InstallManifest"]: + if not path.is_file(): + return None + data = json.loads(path.read_text(encoding="utf-8")) + return cls(**data) + + def save(self, path: Path) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(asdict(self), indent=2) + "\n", encoding="utf-8") + + +def _copy_skill_tree(src: Path, dest: Path) -> None: + if dest.exists(): + if dest.is_symlink() or dest.is_file(): + dest.unlink() + else: + shutil.rmtree(dest) + shutil.copytree(src, dest, symlinks=False) + + +def _skill_source_dirs( + source: Path, skill_ids: Optional[Sequence[str]] = None +) -> List[tuple[str, Path]]: + ids = list(skill_ids) if skill_ids else list(iter_skill_ids_in_root(source)) + out: List[tuple[str, Path]] = [] + for sid in ids: + direct = source / sid + if (direct / "steps.yaml").is_file() or (direct / "SKILL.md").is_file(): + out.append((sid, direct)) + continue + try: + import yaml + except ImportError: + continue + catalog = source / "catalog.yaml" + if not catalog.is_file(): + continue + data = yaml.safe_load(catalog.read_text(encoding="utf-8")) or {} + for entry in data.get("skills") or []: + if str(entry.get("id")) != sid: + continue + rel = entry.get("path") or entry.get("file") + if rel: + path = source / str(rel) + out.append((sid, path.parent)) + break + return out + + +def _manifest_path(cwd: Path, user: bool) -> Path: + if user: + return Path.home() / ".probing" / MANIFEST_NAME + return cwd / ".probing" / MANIFEST_NAME + + +def _remove_installed_skills( + target: AgentInstallTarget, skill_ids: Sequence[str] +) -> None: + if not target.skills_dir.is_dir(): + return + for sid in skill_ids: + dest = target.skills_dir / sid + if dest.is_symlink() or dest.is_file(): + dest.unlink() + elif dest.is_dir(): + shutil.rmtree(dest) + + +def install_skills( + *, + user: bool = False, + update: bool = False, + source: Optional[Path] = None, + cwd: Optional[Path] = None, + agents: Optional[Sequence[str]] = None, + force: bool = False, + skill_ids: Optional[Sequence[str]] = None, +) -> InstallManifest: + """Install bundled skills into detected Cursor / Claude / Codex skill directories.""" + cwd = (cwd or Path.cwd()).resolve() + source = (source or default_install_source()).resolve() + if not source.is_dir(): + raise FileNotFoundError(f"Skill source not found: {source}") + + targets = detect_agent_install_targets( + cwd, + user=user, + agents=agents, + force=force, + ) + if not targets: + presence = detect_agent_presence(cwd) + detected = [name for name, ok in presence.items() if ok] + hint = ", ".join(detected) if detected else "none" + raise FileNotFoundError( + "No Cursor, Claude Code, or Codex skill directories to install into. " + f"Detected: {hint}. Use --force to create standard paths anyway, " + "or --agent cursor,claude,codex to narrow targets." + ) + + manifest_path = _manifest_path(cwd, user) + if update and manifest_path.is_file(): + old = InstallManifest.load(manifest_path) + if old is not None: + for rec in old.targets: + target = AgentInstallTarget( + rec["agent"], + rec["scope"], + Path(rec["path"]), + rec.get("reason", ""), + ) + _remove_installed_skills(target, old.skills) + + pairs = _skill_source_dirs(source, skill_ids) + installed_ids = [sid for sid, _ in pairs] + + target_records: List[dict] = [] + for target in targets: + target.skills_dir.mkdir(parents=True, exist_ok=True) + for sid, src_dir in pairs: + _copy_skill_tree(src_dir, target.skills_dir / sid) + target_records.append( + { + "agent": target.agent, + "scope": target.scope, + "path": str(target.skills_dir.resolve()), + "reason": target.reason, + } + ) + + manifest = InstallManifest( + version=probing_version, + source=str(source), + skills=installed_ids, + targets=target_records, + installed_at=datetime.now(timezone.utc).isoformat(), + ) + manifest.save(manifest_path) + return manifest + + +def _parse_agents(raw: Optional[str]) -> Optional[List[str]]: + if not raw: + return None + names = [part.strip().lower() for part in raw.split(",") if part.strip()] + unknown = [name for name in names if name not in ALL_AGENTS] + if unknown: + raise ValueError( + f"Unknown agent(s): {', '.join(unknown)} (expected cursor, claude, codex)" + ) + return names + + +def main(argv: Optional[Sequence[str]] = None) -> int: + parser = argparse.ArgumentParser( + description="Install probing diagnostic skills for Cursor, Claude Code, and Codex" + ) + parser.add_argument( + "action", + nargs="?", + default="install", + choices=("install", "update"), + help="install or update (re-sync from bundled source)", + ) + parser.add_argument( + "--user", + action="store_true", + help="Install to user-level dirs (~/.cursor/skills, ~/.claude/skills, ~/.agents/skills)", + ) + parser.add_argument( + "--from", dest="from_path", metavar="PATH", help="Skill source directory" + ) + parser.add_argument( + "--update", action="store_true", help="Re-sync existing install" + ) + parser.add_argument( + "--agent", + metavar="NAMES", + help="Comma-separated agents: cursor, claude, codex", + ) + parser.add_argument( + "--force", + action="store_true", + help="Install even when agent markers were not detected (creates standard paths)", + ) + args = parser.parse_args(list(argv) if argv is not None else None) + + source = Path(args.from_path).expanduser().resolve() if args.from_path else None + try: + agent_filter = _parse_agents(args.agent) + manifest = install_skills( + user=args.user, + update=args.action == "update" or args.update, + source=source, + agents=agent_filter, + force=args.force, + ) + except (FileNotFoundError, ValueError) as exc: + print(str(exc), file=sys.stderr) + return 1 + + presence = detect_agent_presence() + detected = [name for name, ok in presence.items() if ok] + print( + f"Installed {len(manifest.skills)} skills for {len(manifest.targets)} target(s)" + ) + for rec in manifest.targets: + print(f" {rec['agent']} ({rec['scope']}): {rec['path']}") + if not manifest.targets: + print(f"Detected agents: {', '.join(detected) or 'none'}", file=sys.stderr) + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/python/probing/playbooks/interpret.py b/python/probing/skills/interpret.py similarity index 99% rename from python/probing/playbooks/interpret.py rename to python/probing/skills/interpret.py index 1397b275..539f5964 100644 --- a/python/probing/playbooks/interpret.py +++ b/python/probing/skills/interpret.py @@ -1,4 +1,4 @@ -"""Evaluate playbook ``interpretation.rules`` against step evidence. +"""Evaluate skill ``interpretation.rules`` against step evidence. Shared semantics with the Rust interpreter in ``probing-cli`` and ``web`` agent. """ diff --git a/python/probing/playbooks/loader.py b/python/probing/skills/loader.py similarity index 53% rename from python/probing/playbooks/loader.py rename to python/probing/skills/loader.py index 59a72995..766edcef 100644 --- a/python/probing/playbooks/loader.py +++ b/python/probing/skills/loader.py @@ -1,11 +1,10 @@ -"""Load and expand probing playbooks (YAML). +"""Load and expand probing diagnostic skills (SKILL.md + steps.yaml). -Requires PyYAML: ``pip install pyyaml`` (optional; only needed for playbook tooling). +Requires PyYAML: ``pip install pyyaml`` (optional; only needed for skill tooling). """ from __future__ import annotations -import os import re from dataclasses import dataclass, field from pathlib import Path @@ -19,22 +18,115 @@ def _yaml_load(text: str) -> Any: import yaml except ImportError as e: raise ImportError( - "Playbook loading requires PyYAML. Install with: pip install pyyaml" + "Skill loading requires PyYAML. Install with: pip install pyyaml" ) from e return yaml.safe_load(text) -def playbooks_root() -> Path: - """Return the playbooks directory (repo root or PROBING_PLAYBOOKS_DIR).""" - env = os.environ.get("PROBING_PLAYBOOKS_DIR") - if env: - return Path(env).expanduser().resolve() - # python/probing/playbooks/loader.py -> repo root - return Path(__file__).resolve().parents[3] / "playbooks" +def skills_root() -> Path: + """Return the highest-priority skills directory (env > project > user > repo > bundled).""" + from probing.skills.paths import skill_roots + + roots = skill_roots() + if roots: + return roots[-1].path + repo = Path(__file__).resolve().parents[3] / "skills" + return repo + + +def _load_catalog_file(root: Path) -> SkillCatalog: + catalog_path = root / "catalog.yaml" + if not catalog_path.is_file(): + raise FileNotFoundError(catalog_path) + data = _yaml_load(catalog_path.read_text(encoding="utf-8")) + entries: List[SkillCatalogEntry] = [] + for p in data.get("skills") or []: + path = p.get("path") or p.get("file", "") + entries.append( + SkillCatalogEntry( + id=str(p["id"]), + path=str(path), + category=str(p.get("category", "")), + priority=int(p.get("priority", 0)), + description=str(p.get("description", "")), + ) + ) + entries.sort(key=lambda e: e.priority) + return SkillCatalog(skills=entries) + + +def _semantic_file(name: str, root: Optional[Path] = None) -> Path: + from probing.skills.paths import skill_roots + + if root is not None: + return root / "semantic" / name + for skill_root in reversed(skill_roots()): + path = skill_root.path / "semantic" / name + if path.is_file(): + return path + return skills_root() / "semantic" / name + + +def load_catalog(root: Optional[Path] = None) -> SkillCatalog: + if root is not None: + return _load_catalog_file(root) + + from probing.skills.paths import skill_roots + + merged: Dict[str, SkillCatalogEntry] = {} + for skill_root in skill_roots(): + try: + catalog = _load_catalog_file(skill_root.path) + except FileNotFoundError: + continue + for entry in catalog.skills: + merged[entry.id] = entry + entries = sorted(merged.values(), key=lambda e: (e.priority, e.id)) + return SkillCatalog(skills=entries) + + +def load_skill(skill_id: str, root: Optional[Path] = None) -> Skill: + if root is not None: + catalog = _load_catalog_file(root) + entry = next((p for p in catalog.skills if p.id == skill_id), None) + if entry is None: + raise KeyError(f"Unknown skill: {skill_id}") + path = root / entry.path + data = _yaml_load(path.read_text(encoding="utf-8")) + return _parse_skill_steps(data, path) + + from probing.skills.paths import resolve_skill_dir, skill_roots + + roots = skill_roots() + skill_dir = resolve_skill_dir(skill_id, roots) + if skill_dir is None: + raise KeyError(f"Unknown skill: {skill_id}") + steps_path = skill_dir / "steps.yaml" + if not steps_path.is_file(): + raise FileNotFoundError( + f"Missing steps.yaml for skill {skill_id}: {steps_path}" + ) + data = _yaml_load(steps_path.read_text(encoding="utf-8")) + return _parse_skill_steps(data, steps_path) + + +def load_semantic_catalog(root: Optional[Path] = None) -> Dict[str, Any]: + path = _semantic_file("tables.yaml", root) + return _yaml_load(path.read_text(encoding="utf-8")) + + +def load_intents(root: Optional[Path] = None) -> Dict[str, Any]: + path = _semantic_file("intents.yaml", root) + return _yaml_load(path.read_text(encoding="utf-8")) + + +def load_pages(root: Optional[Path] = None) -> Dict[str, Any]: + path = _semantic_file("pages.yaml", root) + return _yaml_load(path.read_text(encoding="utf-8")) @dataclass -class PlaybookStep: +class SkillStep: id: str title: str type: str @@ -51,7 +143,7 @@ class PlaybookStep: @dataclass -class Playbook: +class Skill: id: str title: str category: str @@ -60,7 +152,7 @@ class Playbook: docs: str parameters: List[Dict[str, Any]] requires: Dict[str, Any] - steps: List[PlaybookStep] + steps: List[SkillStep] interpretation: Dict[str, Any] summary_template: str next_steps: List[str] @@ -70,26 +162,26 @@ class Playbook: @dataclass -class PlaybookCatalogEntry: +class SkillCatalogEntry: id: str - file: str + path: str category: str priority: int description: str @dataclass -class PlaybookCatalog: - playbooks: List[PlaybookCatalogEntry] +class SkillCatalog: + skills: List[SkillCatalogEntry] -def _parse_playbook(data: Mapping[str, Any], path: Path) -> Playbook: +def _parse_skill_steps(data: Mapping[str, Any], path: Path) -> Skill: meta = data.get("metadata") or {} spec = data.get("spec") or {} - steps: List[PlaybookStep] = [] + steps: List[SkillStep] = [] for raw in spec.get("steps") or []: steps.append( - PlaybookStep( + SkillStep( id=str(raw.get("id", "")), title=str(raw.get("title", "")), type=str(raw.get("type", "sql")), @@ -105,9 +197,9 @@ def _parse_playbook(data: Mapping[str, Any], path: Path) -> Playbook: raw=dict(raw), ) ) - return Playbook( - id=str(meta.get("id", path.stem)), - title=str(meta.get("title", meta.get("id", path.stem))), + return Skill( + id=str(meta.get("id", path.parent.name)), + title=str(meta.get("title", meta.get("id", path.parent.name))), category=str(meta.get("category", "general")), tags=list(meta.get("tags") or []), triggers=dict(meta.get("triggers") or {}), @@ -124,55 +216,9 @@ def _parse_playbook(data: Mapping[str, Any], path: Path) -> Playbook: ) -def load_catalog(root: Optional[Path] = None) -> PlaybookCatalog: - root = root or playbooks_root() - data = _yaml_load((root / "catalog.yaml").read_text(encoding="utf-8")) - entries = [ - PlaybookCatalogEntry( - id=str(p["id"]), - file=str(p["file"]), - category=str(p.get("category", "")), - priority=int(p.get("priority", 0)), - description=str(p.get("description", "")), - ) - for p in data.get("playbooks") or [] - ] - entries.sort(key=lambda e: e.priority) - return PlaybookCatalog(playbooks=entries) - - -def load_playbook(playbook_id: str, root: Optional[Path] = None) -> Playbook: - catalog = load_catalog(root) - entry = next((p for p in catalog.playbooks if p.id == playbook_id), None) - if entry is None: - raise KeyError(f"Unknown playbook: {playbook_id}") - root = root or playbooks_root() - path = root / entry.file - data = _yaml_load(path.read_text(encoding="utf-8")) - return _parse_playbook(data, path) - - -def load_semantic_catalog(root: Optional[Path] = None) -> Dict[str, Any]: - root = root or playbooks_root() - path = root / "semantic" / "tables.yaml" - return _yaml_load(path.read_text(encoding="utf-8")) - - -def load_intents(root: Optional[Path] = None) -> Dict[str, Any]: - root = root or playbooks_root() - path = root / "semantic" / "intents.yaml" - return _yaml_load(path.read_text(encoding="utf-8")) - - -def load_pages(root: Optional[Path] = None) -> Dict[str, Any]: - root = root or playbooks_root() - path = root / "semantic" / "pages.yaml" - return _yaml_load(path.read_text(encoding="utf-8")) - - -def default_parameters(playbook: Playbook) -> Dict[str, Any]: +def default_parameters(skill: Skill) -> Dict[str, Any]: out: Dict[str, Any] = {} - for p in playbook.parameters: + for p in skill.parameters: name = p.get("name") if name is not None and "default" in p: out[str(name)] = p["default"] @@ -182,9 +228,13 @@ def default_parameters(playbook: Playbook) -> Dict[str, Any]: def derived_variables(params: Mapping[str, Any]) -> Dict[str, str]: use_global = bool(params.get("use_global", False)) comm = "global.python.comm_collective" if use_global else "python.comm_collective" + nccl_proxy = "global.nccl.proxy_ops" if use_global else "nccl.proxy_ops" + net_qp = "global.nccl.net_qp" if use_global else "nccl.net_qp" return { "comm_table": comm, "table_comm": comm, + "nccl_proxy_table": nccl_proxy, + "net_qp_table": net_qp, "global_prefix": "global." if use_global else "", } @@ -193,28 +243,28 @@ def _expand_string(template: str, ctx: Mapping[str, Any]) -> str: def repl(match: re.Match[str]) -> str: key = match.group(1) if key not in ctx: - raise KeyError(f"Missing playbook parameter or variable: {key}") + raise KeyError(f"Missing skill parameter or variable: {key}") return str(ctx[key]) return _PLACEHOLDER.sub(repl, template) -def expand_playbook( - playbook: Playbook, +def expand_skill( + skill: Skill, overrides: Optional[Mapping[str, Any]] = None, -) -> List[PlaybookStep]: +) -> List[SkillStep]: """Return steps with ``{param}`` placeholders expanded.""" ctx: Dict[str, Any] = {} - ctx.update(default_parameters(playbook)) + ctx.update(default_parameters(skill)) if overrides: ctx.update(dict(overrides)) ctx.update(derived_variables(ctx)) - for k, v in playbook.variables.items(): + for k, v in skill.variables.items(): ctx[k] = _expand_string(str(v), ctx) - expanded: List[PlaybookStep] = [] - for step in playbook.steps: - new = PlaybookStep( + expanded: List[SkillStep] = [] + for step in skill.steps: + new = SkillStep( id=step.id, title=step.title, type=step.type, @@ -233,10 +283,10 @@ def expand_playbook( return expanded -def _collect_keywords(playbook: Playbook) -> List[str]: +def _collect_keywords(skill: Skill) -> List[str]: words: List[str] = [] - words.extend(playbook.tags) - triggers = playbook.triggers.get("keywords") or {} + words.extend(skill.tags) + triggers = skill.triggers.get("keywords") or {} if isinstance(triggers, dict): for vals in triggers.values(): if isinstance(vals, list): @@ -256,77 +306,77 @@ def _match_intents( keywords = intent.get("keywords") or [] hits = sum(1 for kw in keywords if str(kw).lower() in q) if hits: - for pb_id in intent.get("playbooks") or []: - scored.append((hits, str(pb_id))) + ids = intent.get("skills") or [] + for sid in ids: + scored.append((hits, str(sid))) scored.sort(key=lambda x: (-x[0], x[1])) seen: set[str] = set() out: List[str] = [] - for _, pid in scored: - if pid not in seen: - seen.add(pid) - out.append(pid) + for _, sid in scored: + if sid not in seen: + seen.add(sid) + out.append(sid) if len(out) >= limit: break return out -def match_playbooks( +def match_skills( query: str, root: Optional[Path] = None, limit: int = 3, ) -> List[str]: - """Rank playbook ids by intent + keyword overlap with *query*.""" + """Rank skill ids by intent + keyword overlap with *query*.""" q = query.lower() catalog = load_catalog(root) scores: Dict[str, int] = {} - for rank, pid in enumerate(_match_intents(query, root, limit=10)): - scores[pid] = scores.get(pid, 0) + 3 * (10 - rank) + for rank, sid in enumerate(_match_intents(query, root, limit=10)): + scores[sid] = scores.get(sid, 0) + 3 * (10 - rank) - for entry in catalog.playbooks: - pb = load_playbook(entry.id, root) - kw_score = sum(1 for kw in _collect_keywords(pb) if kw in q) + for entry in catalog.skills: + skill = load_skill(entry.id, root) + kw_score = sum(1 for kw in _collect_keywords(skill) if kw in q) if kw_score: scores[entry.id] = scores.get(entry.id, 0) + kw_score ranked = sorted(scores.items(), key=lambda x: (-x[1], x[0])) - return [pid for pid, _ in ranked[:limit]] + return [sid for sid, _ in ranked[:limit]] -def validate_playbook(playbook: Playbook) -> List[str]: +def validate_skill(skill: Skill) -> List[str]: """Return a list of validation warnings (empty if ok).""" warnings: List[str] = [] - if not playbook.steps: - warnings.append(f"{playbook.id}: no steps defined") + if not skill.steps: + warnings.append(f"{skill.id}: no steps defined") seen_ids: set[str] = set() - for step in playbook.steps: + for step in skill.steps: if step.id in seen_ids: - warnings.append(f"{playbook.id}: duplicate step id {step.id}") + warnings.append(f"{skill.id}: duplicate step id {step.id}") seen_ids.add(step.id) if step.type == "sql" and not step.sql: - warnings.append(f"{playbook.id}.{step.id}: sql step missing sql") + warnings.append(f"{skill.id}.{step.id}: sql step missing sql") if step.type == "sql" and step.sql: upper = step.sql.strip().upper() if any( upper.startswith(k) for k in ("INSERT", "UPDATE", "DELETE", "DROP", "ALTER", "SET ") ): - warnings.append( - f"{playbook.id}.{step.id}: sql step should be read-only" - ) - # Check placeholders resolve with defaults + warnings.append(f"{skill.id}.{step.id}: sql step should be read-only") try: - expand_playbook(playbook) + expand_skill(skill) except KeyError as e: - warnings.append(f"{playbook.id}.{step.id}: {e}") + warnings.append(f"{skill.id}.{step.id}: {e}") + skill_md = skill.path.parent / "SKILL.md" + if not skill_md.is_file(): + warnings.append(f"{skill.id}: missing SKILL.md") return warnings def validate_all(root: Optional[Path] = None) -> List[str]: - root = root or playbooks_root() all_warnings: List[str] = [] catalog = load_catalog(root) - for entry in catalog.playbooks: - pb = load_playbook(entry.id, root) - all_warnings.extend(validate_playbook(pb)) + for entry in catalog.skills: + skill = load_skill(entry.id, root) + all_warnings.extend(validate_skill(skill)) return all_warnings diff --git a/python/probing/skills/paths.py b/python/probing/skills/paths.py new file mode 100644 index 00000000..2c014ca3 --- /dev/null +++ b/python/probing/skills/paths.py @@ -0,0 +1,273 @@ +"""Agent skill directory discovery (Cursor, Claude Code, Codex).""" + +from __future__ import annotations + +import os +import shutil +from dataclasses import dataclass +from pathlib import Path +from typing import Dict, Iterable, List, Optional, Sequence + +PROBING_PROJECT_SKILLS = ".probing/skills" +PROBING_USER_SKILLS = ".probing/skills" +REPO_SKILLS_DIRNAME = "skills" + +# Where each agent runtime loads project/user skills (Agent Skills open standard). +AGENT_PROJECT_SKILLS: Dict[str, str] = { + "cursor": ".cursor/skills", + "claude": ".claude/skills", + "codex": ".agents/skills", +} +AGENT_USER_SKILLS: Dict[str, str] = { + "cursor": ".cursor/skills", + "claude": ".claude/skills", + "codex": ".agents/skills", +} +AGENT_PROJECT_MARKERS: Dict[str, tuple[str, ...]] = { + "cursor": (".cursor",), + "claude": (".claude",), + "codex": (".agents", ".codex"), +} +AGENT_BINARIES: Dict[str, tuple[str, ...]] = { + "cursor": ("cursor",), + "claude": ("claude",), + "codex": ("codex",), +} +ALL_AGENTS = ("cursor", "claude", "codex") + + +@dataclass(frozen=True) +class SkillRoot: + """A directory tree that contains skill folders and optionally catalog.yaml.""" + + path: Path + label: str + + +@dataclass(frozen=True) +class AgentInstallTarget: + """A directory where probing skills should be installed for an agent runtime.""" + + agent: str + scope: str # "project" | "user" + skills_dir: Path + reason: str + + +def find_repo_root(start: Optional[Path] = None) -> Optional[Path]: + """Find probing repository root (contains ``skills/catalog.yaml`` + ``pyproject.toml``).""" + start = (start or Path.cwd()).resolve() + for directory in (start, *start.parents): + if (directory / REPO_SKILLS_DIRNAME / "catalog.yaml").is_file() and ( + directory / "pyproject.toml" + ).is_file(): + return directory + if directory.parent == directory: + break + # Source checkout: python/probing/skills/paths.py → repo root is parents[3] + pkg_root = Path(__file__).resolve().parents[3] + if (pkg_root / REPO_SKILLS_DIRNAME / "catalog.yaml").is_file(): + return pkg_root + return None + + +def repo_skills_dir(start: Optional[Path] = None) -> Optional[Path]: + """Top-level ``skills/`` in a probing checkout (authoring + agent install source).""" + root = find_repo_root(start) + if root is None: + return None + candidate = root / REPO_SKILLS_DIRNAME + return candidate if (candidate / "catalog.yaml").is_file() else None + + +def bundled_skills_dir() -> Optional[Path]: + """Skills copied into the wheel at ``python/probing/_skills/`` (release builds).""" + bundled = Path(__file__).resolve().parent.parent / "_skills" + if bundled.is_dir() and (bundled / "catalog.yaml").is_file(): + return bundled + return None + + +def user_skills_dir() -> Path: + return Path.home() / PROBING_USER_SKILLS + + +def project_skills_dir(start: Optional[Path] = None) -> Optional[Path]: + start = start or Path.cwd() + for directory in (start, *start.parents): + candidate = directory / PROBING_PROJECT_SKILLS + if candidate.is_dir(): + return candidate + if directory.parent == directory: + break + return None + + +def env_skills_dir() -> Optional[Path]: + raw = os.environ.get("PROBING_SKILLS_DIR") + if not raw: + return None + path = Path(raw).expanduser().resolve() + return path if path.is_dir() else None + + +def skill_roots(start: Optional[Path] = None) -> List[SkillRoot]: + """Return skill roots from lowest to highest priority (later overrides earlier).""" + roots: List[SkillRoot] = [] + + bundled = bundled_skills_dir() + if bundled is not None: + roots.append(SkillRoot(bundled, "bundled")) + + repo = repo_skills_dir(start) + if repo is not None and not any(r.path.resolve() == repo.resolve() for r in roots): + roots.append(SkillRoot(repo, "repo")) + + user = user_skills_dir() + if user.is_dir(): + roots.append(SkillRoot(user, "user")) + + project = project_skills_dir(start) + if project is not None: + roots.append(SkillRoot(project, "project")) + + extra = env_skills_dir() + if extra is not None: + roots.append(SkillRoot(extra, "env")) + + return roots + + +def default_install_source(start: Optional[Path] = None) -> Path: + """Directory copied by ``probing skill install`` / ``skills/install.sh``.""" + repo = repo_skills_dir(start) + if repo is not None: + return repo + bundled = bundled_skills_dir() + if bundled is not None: + return bundled + raise FileNotFoundError( + "No skills/ directory found. Run from the probing repo or install probing from a wheel." + ) + + +def _binary_available(name: str) -> bool: + return shutil.which(name) is not None + + +def detect_agent_presence(start: Optional[Path] = None) -> Dict[str, bool]: + """Return which agent runtimes appear to be in use for *start* / home.""" + start = (start or Path.cwd()).resolve() + home = Path.home() + presence: Dict[str, bool] = {} + + for agent in ALL_AGENTS: + markers = AGENT_PROJECT_MARKERS[agent] + project_hit = any( + (directory / marker).is_dir() + for directory in (start, *start.parents) + for marker in markers + ) + user_hit = any((home / marker).is_dir() for marker in markers) + user_skills = home / AGENT_USER_SKILLS[agent] + binary_hit = any(_binary_available(name) for name in AGENT_BINARIES[agent]) + presence[agent] = project_hit or user_hit or user_skills.is_dir() or binary_hit + + return presence + + +def _project_root_for_agent(start: Path, agent: str) -> Optional[Path]: + markers = AGENT_PROJECT_MARKERS[agent] + for directory in (start, *start.parents): + if any((directory / marker).is_dir() for marker in markers): + return directory + if directory.parent == directory: + break + return find_repo_root(start) + + +def detect_agent_install_targets( + start: Optional[Path] = None, + *, + user: bool = False, + agents: Optional[Sequence[str]] = None, + force: bool = False, +) -> List[AgentInstallTarget]: + """Resolve install destinations for Cursor / Claude Code / Codex.""" + start = (start or Path.cwd()).resolve() + requested = [a for a in (agents or ALL_AGENTS) if a in ALL_AGENTS] + presence = detect_agent_presence(start) + targets: List[AgentInstallTarget] = [] + + for agent in requested: + if not force and not presence.get(agent, False): + continue + + if user: + skills_dir = Path.home() / AGENT_USER_SKILLS[agent] + reason = f"{agent} user config detected" + targets.append(AgentInstallTarget(agent, "user", skills_dir, reason)) + continue + + root = _project_root_for_agent(start, agent) or find_repo_root(start) or start + rel = AGENT_PROJECT_SKILLS[agent] + skills_dir = root / rel + if presence.get(agent, False): + reason = f"{agent} project marker under {root}" + else: + reason = f"{agent} requested; installing under {root}" + targets.append(AgentInstallTarget(agent, "project", skills_dir, reason)) + + deduped: List[AgentInstallTarget] = [] + seen: set[str] = set() + for target in targets: + key = str(target.skills_dir.resolve()) + if key in seen: + continue + seen.add(key) + deduped.append(target) + return deduped + + +def iter_skill_ids_in_root(root: Path) -> Iterable[str]: + catalog = root / "catalog.yaml" + if catalog.is_file(): + try: + import yaml + except ImportError: + yaml = None # type: ignore + if yaml is not None: + data = yaml.safe_load(catalog.read_text(encoding="utf-8")) or {} + for entry in data.get("skills") or []: + sid = entry.get("id") + if sid: + yield str(sid) + return + for child in sorted(root.iterdir()): + if child.is_dir() and (child / "SKILL.md").is_file(): + yield child.name + + +def resolve_skill_dir(skill_id: str, roots: Sequence[SkillRoot]) -> Optional[Path]: + for root in reversed(roots): + catalog_path = None + catalog_file = root.path / "catalog.yaml" + if catalog_file.is_file(): + try: + import yaml + except ImportError: + yaml = None # type: ignore + if yaml is not None: + data = yaml.safe_load(catalog_file.read_text(encoding="utf-8")) or {} + for entry in data.get("skills") or []: + if str(entry.get("id")) == skill_id: + rel = entry.get("path") or entry.get("file") + if rel: + catalog_path = root.path / str(rel) + break + if catalog_path is not None and catalog_path.is_file(): + return catalog_path.parent + direct = root.path / skill_id + if (direct / "steps.yaml").is_file() or (direct / "SKILL.md").is_file(): + return direct + return None diff --git a/python/probing/skills/tools.py b/python/probing/skills/tools.py new file mode 100644 index 00000000..df9f04f6 --- /dev/null +++ b/python/probing/skills/tools.py @@ -0,0 +1,204 @@ +"""Agent-callable skill tools (list / run without prior install).""" + +from __future__ import annotations + +import json +import shutil +import subprocess +from dataclasses import asdict, dataclass +from typing import Any, Dict, List, Mapping, Optional, Sequence + +from probing.skills.loader import ( + Skill, + SkillStep, + default_parameters, + expand_skill, + load_catalog, + load_skill, + match_skills, +) + + +@dataclass +class SkillSummary: + id: str + category: str + description: str + priority: int + title: str = "" + + def to_dict(self) -> Dict[str, Any]: + return asdict(self) + + +@dataclass +class SkillRunPlan: + skill_id: str + title: str + docs: str + parameters: Dict[str, Any] + steps: List[Dict[str, Any]] + summary_template: str + next_steps: List[str] + cli_command: str + + def to_dict(self) -> Dict[str, Any]: + return asdict(self) + + +def _step_to_dict(step: SkillStep) -> Dict[str, Any]: + return { + "id": step.id, + "title": step.title, + "type": step.type, + "sql": step.sql, + "method": step.method, + "path": step.path, + "action": step.action, + "view": step.view, + "on_empty": step.on_empty, + "when": step.when, + } + + +def list_skills(*, query: Optional[str] = None, limit: int = 20) -> List[SkillSummary]: + """List bundled and installed skills (no ``probing skill install`` required).""" + catalog = load_catalog() + summaries: List[SkillSummary] = [] + for entry in catalog.skills: + title = entry.id + try: + skill = load_skill(entry.id) + title = skill.title + except KeyError: + pass + summaries.append( + SkillSummary( + id=entry.id, + category=entry.category, + description=entry.description, + priority=entry.priority, + title=title, + ) + ) + if query: + ranked = match_skills(query, limit=limit) + by_id = {s.id: s for s in summaries} + ordered = [by_id[sid] for sid in ranked if sid in by_id] + if ordered: + return ordered[:limit] + return summaries[:limit] + + +def list_skills_json(*, query: Optional[str] = None, limit: int = 20) -> str: + return json.dumps( + [s.to_dict() for s in list_skills(query=query, limit=limit)], indent=2 + ) + + +def plan_skill_run( + skill_id: str, + params: Optional[Mapping[str, Any]] = None, + *, + target: Optional[str] = None, +) -> SkillRunPlan: + """Expand a skill into executable steps (uses bundled skills by default).""" + skill = load_skill(skill_id) + merged = default_parameters(skill) + if params: + merged.update(dict(params)) + steps = expand_skill(skill, merged) + cli = _format_cli_command(skill_id, merged, target) + return SkillRunPlan( + skill_id=skill.id, + title=skill.title, + docs=skill.docs, + parameters=merged, + steps=[_step_to_dict(s) for s in steps], + summary_template=skill.summary_template, + next_steps=list(skill.next_steps), + cli_command=cli, + ) + + +def run_skill( + skill_id: str, + *, + target: Optional[str] = None, + params: Optional[Mapping[str, Any]] = None, + global_fanout: Optional[bool] = None, + execute: bool = True, +) -> Dict[str, Any]: + """Run or plan a skill. + + When *target* is set and *execute* is true, invokes the ``probing`` CLI. + Otherwise returns an expanded step plan for the agent to follow. + """ + merged: Dict[str, Any] = dict(params or {}) + if global_fanout is not None: + merged["use_global"] = global_fanout + + if target and execute: + probing = shutil.which("probing") + if probing is None: + plan = plan_skill_run(skill_id, merged, target=target) + return { + "status": "plan_only", + "reason": "probing CLI not found on PATH", + "plan": plan.to_dict(), + } + cmd = [probing] + if target: + cmd.extend(["-t", target]) + cmd.extend(["skill", "run", skill_id]) + for key, value in merged.items(): + cmd.extend(["--set", f"{key}={value}"]) + if global_fanout is True: + cmd.append("--global") + elif global_fanout is False: + cmd.append("--local") + proc = subprocess.run(cmd, capture_output=True, text=True, check=False) + return { + "status": "ok" if proc.returncode == 0 else "error", + "returncode": proc.returncode, + "stdout": proc.stdout, + "stderr": proc.stderr, + "command": " ".join(cmd), + } + + plan = plan_skill_run(skill_id, merged, target=target) + return {"status": "plan", "plan": plan.to_dict()} + + +def _format_cli_command( + skill_id: str, + params: Mapping[str, Any], + target: Optional[str], +) -> str: + parts = ["probing"] + if target: + parts.extend(["-t", str(target)]) + parts.extend(["skill", "run", skill_id]) + for key, value in sorted(params.items()): + parts.extend(["--set", f"{key}={value}"]) + return " ".join(parts) + + +def run_skill_json( + skill_id: str, + *, + target: Optional[str] = None, + params: Optional[Mapping[str, Any]] = None, + global_fanout: Optional[bool] = None, + execute: bool = True, +) -> str: + return json.dumps( + run_skill( + skill_id, + target=target, + params=params, + global_fanout=global_fanout, + execute=execute, + ), + indent=2, + ) diff --git a/python/probing/torchrun_cluster.py b/python/probing/torchrun_cluster.py index 10186b8d..4bf32ba6 100644 --- a/python/probing/torchrun_cluster.py +++ b/python/probing/torchrun_cluster.py @@ -29,6 +29,7 @@ _SETUP_DONE = False _MASTER_KEY_SUFFIX = "master" +_MASTER_INFO: dict[str, str] | None = None def _enabled() -> bool: @@ -128,6 +129,8 @@ def _optional_env_int(name: str) -> int | None: def _node_payload(local_addr: str) -> dict[str, Any]: + from probing.parallel import current_role + host = socket.gethostname() return { "host": host, @@ -140,6 +143,8 @@ def _node_payload(local_addr: str) -> dict[str, Any]: "role_name": os.environ.get("ROLE_NAME"), "role_rank": _optional_env_int("ROLE_RANK"), "role_world_size": _optional_env_int("ROLE_WORLD_SIZE"), + # Parallel role key (e.g. "dp=2,pp=1,tp=0"); surfaces as federation _role. + "role": current_role() or None, "status": "running", "timestamp": int(time.time() * 1_000_000), } @@ -268,10 +273,28 @@ def setup_torchrun_cluster() -> dict[str, str] | None: else: master_info = wait_master() + global _MASTER_INFO + _MASTER_INFO = master_info register_with_master(master_info) return master_info +def refresh_node_role() -> bool: + """Re-register this node so the master picks up a runtime role change. + + No-op (returns ``False``) when the cluster was never set up. Best-effort: + swallows network errors so ``set_role`` never raises on registration issues. + """ + if not _SETUP_DONE or _MASTER_INFO is None: + return False + try: + register_with_master(_MASTER_INFO) + return True + except Exception as exc: # pragma: no cover - network best-effort + logger.debug("probing torchrun: role refresh failed: %s", exc) + return False + + def maybe_setup_torchrun_cluster() -> dict[str, str] | None: """Idempotent entry point; safe to call after ``init_process_group``.""" return setup_torchrun_cluster() diff --git a/python/probing/web_assets.py b/python/probing/web_assets.py new file mode 100644 index 00000000..9dc7885b --- /dev/null +++ b/python/probing/web_assets.py @@ -0,0 +1,51 @@ +"""Web UI static assets bundled in the wheel or available in editable installs.""" + +from __future__ import annotations + +import os +from pathlib import Path + +_ENV = "PROBING_ASSETS_ROOT" +_BUNDLED_DIRNAME = "_web" + + +def bundled_web_dir() -> Path | None: + """Wheel / install tree: ``python/probing/_web/`` (bundled by ``make wheel``).""" + root = Path(__file__).resolve().parent / _BUNDLED_DIRNAME + if (root / "index.html").is_file(): + return root + return None + + +def dev_web_dir() -> Path | None: + """Editable checkout: repo ``web/dist/``.""" + root = Path(__file__).resolve().parents[2] / "web" / "dist" + if (root / "index.html").is_file(): + return root + return None + + +def resolve_web_assets_root() -> Path | None: + """Return the directory that contains ``index.html``, if any.""" + override = os.environ.get(_ENV) + if override: + root = Path(override) + if (root / "index.html").is_file(): + return root + return None + if bundled := bundled_web_dir(): + return bundled + return dev_web_dir() + + +def configure_assets_root() -> Path | None: + """Set ``PROBING_ASSETS_ROOT`` for ``probing-server`` when UI files are available.""" + if os.environ.get(_ENV): + root = Path(os.environ[_ENV]) + if (root / "index.html").is_file(): + return root + return None + root = resolve_web_assets_root() + if root is not None: + os.environ[_ENV] = str(root) + return root diff --git a/python/probing_hook.py b/python/probing_hook.py index c15b4653..c91ee085 100644 --- a/python/probing_hook.py +++ b/python/probing_hook.py @@ -1,146 +1,5 @@ -""" -Probing Hook - Conditionally activates the probing library based on environment variables. +"""Wheel / develop entry executed from ``probing.pth`` or ``probing_hook.pth``.""" -This module intercepts process startup and conditionally imports the probing library -based on the PROBING environment variable: -- '0': Disabled (default) -- '1' or 'followed': Enable only in current process -- '2' or 'nested': Enable in current and all child processes -- 'regex:PATTERN': Enable if current script name matches the regex pattern -- 'SCRIPTNAME': Enable if current script name matches exactly -- 'init:SCRIPT_PATH[+PROBE_SETTING]': Execute SCRIPT_PATH for initialization, then apply PROBE_SETTING. - PROBE_SETTING can be any of the above values (e.g., 'init:./my_setup.py+1'). - If PROBE_SETTING is omitted, it defaults to '0' (disabled after init). -""" +from probing.site_hook import run_site_hook -import os -import sys - - -def get_current_script_name(): - """Get the name of the current running script.""" - try: - script_path = sys.argv[0] - return os.path.basename(script_path) - except (IndexError, AttributeError): - return "" - - -# Get the PROBING environment variable -probe_value = os.environ.get("PROBING", "0") -current_script = get_current_script_name() -script_init = None - -# Save original PROBING value to PROBING_ORIGINAL before any modifications -# This allows probing/__init__.py to check the original value even if PROBING is deleted -if "PROBING" in os.environ: - os.environ["PROBING_ORIGINAL"] = os.environ["PROBING"] - -if probe_value.startswith("init:"): - parts = probe_value.split("+", 1) - script_init = parts[0][5:] - probe_value = parts[1] if len(parts) > 1 else "0" - - -def execute_init_script(): - if script_init is not None: - with open(script_init) as f: - exec(f.read(), globals()) - - -def init_probing(): - try: - # Remove the variable by default - we'll set it back if needed - # PROBING_ORIGINAL is preserved for probing/__init__.py to check - if "PROBING" in os.environ: - del os.environ["PROBING"] - - if probe_value.lower() in ["1", "followed"]: - print( - "Activating probing in 'followed' mode (current process only)", - file=sys.stderr, - ) - import probing - - execute_init_script() - # Environment variable is intentionally not preserved - - elif probe_value.lower() in ["2", "nested"]: - print( - "Activating probing in 'nested' mode (all child processes)", - file=sys.stderr, - ) - import probing - - # Preserve for child processes - os.environ["PROBING"] = probe_value - execute_init_script() - - elif probe_value.lower().startswith("regex:"): - pattern = probe_value.split(":", 1)[1] - try: - import re - - if re.search(pattern, current_script) is not None: - print( - f"Activating probing for script matching '{pattern}'", - file=sys.stderr, - ) - import probing - - execute_init_script() - # Always preserve valid regex patterns for child processes - os.environ["PROBING"] = probe_value - except Exception as e: - print(f"Error in regex pattern '{pattern}': {e}", file=sys.stderr) - # Don't preserve invalid regex patterns - - elif probe_value != "0": - # Script name comparison - if probe_value == current_script: - print( - f"Activating probing for '{current_script}' (current process only)", - file=sys.stderr, - ) - import probing - - execute_init_script() - # Always preserve the script name filter for child processes - os.environ["PROBING"] = probe_value - - except ImportError as e: - print(f"Error loading probing library: {e}", file=sys.stderr) - except Exception as e: - print(f"Unexpected error in probing hook: {e}", file=sys.stderr) - # In case of unexpected errors, don't enable probing - - -def is_probing_cli(): - """Check if the current process is the probing CLI itself.""" - if current_script == "probing": - os.environ["PROBING_CLI_MODE"] = "1" - return True - # Check for 'python -m probing.cli' - try: - import __main__ - - if hasattr(__main__, "__file__") and __main__.__file__: - if "probing" in __main__.__file__ and "cli" in __main__.__file__: - os.environ["PROBING_CLI_MODE"] = "1" - return True - except Exception: - pass - return False - - -try: - import re - - # Skip initialization for: - # 1. torchrun (launcher script) - # 2. probing CLI itself (should not inject probes into itself) - if re.search("torchrun", current_script) is None and not is_probing_cli(): - init_probing() -except Exception as e: - print(f"Error in probing hook: {e}", file=sys.stderr) - # In case of unexpected errors, don't enable probing +run_site_hook() diff --git a/skills/README.md b/skills/README.md new file mode 100644 index 00000000..eb2e2736 --- /dev/null +++ b/skills/README.md @@ -0,0 +1,64 @@ +# Diagnostic skills (authoring) + +**This is the source of truth for skill *data*.** Edit here — not under `python/probing/`. + +Each skill is a folder with **`SKILL.md`** (when/how, for agents) and optional **`steps.yaml`** +(deterministic steps for `probing skill run` and the Web Investigate agent). + +## Other skill-related paths + +| Path | What it is | +|------|------------| +| **`skills/`** (here) | Authoring + `./install.sh` source; also embedded in Web/Rust via `include_str!` | +| **`python/probing/skills/`** | Python **code** — loader, install, CLI helpers (`probing.skills.*`) | +| **`python/probing/_skills/`** | **Wheel bundle** — generated by `make wheel` | + +## Layout + +``` +skills/ +├── catalog.yaml # index (id, category, path) +├── semantic/ # intents, pages, table semantics (routing) +├── install.sh # copy into .cursor/.claude/.agents skill dirs +└── health_overview/ + ├── SKILL.md + └── steps.yaml +``` + +## Install into Cursor / Claude / Codex + +```bash +./skills/install.sh +# or: probing skill install [--user] [--force] +``` + +| Agent | Project | User (`--user`) | +|-------|---------|-----------------| +| Cursor | `.cursor/skills/` | `~/.cursor/skills/` | +| Claude Code | `.claude/skills/` | `~/.claude/skills/` | +| Codex | `.agents/skills/` | `~/.agents/skills/` | + +## Run + +```bash +probing skill list +probing -t skill run health_overview +probing -t skill run slow_rank --set step_window=30 --global +``` + +Validate after edits: + +```bash +python -m probing.skills validate +make wheel # refresh wheel bundle when cutting a release +``` + +## Add a skill + +1. `skills/my_skill/SKILL.md` — frontmatter with `name` + `description` +2. `skills/my_skill/steps.yaml` — optional executable steps +3. Register in `catalog.yaml` +4. `python -m probing.skills validate` +5. `./skills/install.sh` — refresh agent directories + +See [AGENTS.md](../AGENTS.md) and [docs/src/design/extensibility.md](../docs/src/design/extensibility.md). diff --git a/skills/catalog.yaml b/skills/catalog.yaml new file mode 100644 index 00000000..0bdf9035 --- /dev/null +++ b/skills/catalog.yaml @@ -0,0 +1,145 @@ +# Skill catalog — index for CLI, Python loader, and Web Agent. +apiVersion: probing.dev/v1 +kind: Catalog +categories: + triage: + label: 分诊 / Triage + description: First look when unsure where to start. + reliability: + label: 可靠性 / Reliability + description: Stalls, hangs, deadlocks. + distributed: + label: 分布式 / Distributed + description: Ranks, collectives, stragglers. + performance: + label: 性能 / Performance + description: Module hotspots and step regressions. + memory: + label: 内存 / Memory + description: GPU/VRAM pressure and leaks. +skills: +- id: health_overview + category: triage + priority: 0 + entry: true + description: 'One-shot health check: CPU, GPU, tables, recent training activity' + tables: + - cpu.utilization + - gpu.utilization + - python.torch_trace + - cluster.nodes + pages: + - dashboard + - agent + - analytics + related: + - module_bottleneck + - training_hang + - memory_leak + path: health_overview/steps.yaml +- id: training_hang + category: reliability + priority: 1 + description: Training stalled — capture stacks and thread/blocking hints + tables: + - python.backtrace + - cpu.utilization + - python.trace_event + - python.comm_collective + pages: + - stacks + - spans + related: + - slow_rank + - module_bottleneck + path: training_hang/steps.yaml +- id: slow_rank + category: distributed + priority: 2 + description: Find straggler ranks via collective latency imbalance + tables: + - python.comm_collective + - global.python.comm_collective + pages: + - training + - cluster + - analytics + related: + - comm_bottleneck + - nccl_culprit_victim + - gpu_pressure + - training_hang + path: slow_rank/steps.yaml +- id: memory_leak + category: memory + priority: 3 + description: Detect monotonic GPU memory growth across training steps + tables: + - python.torch_trace + - gpu.utilization + pages: + - profiling/torch + related: + - gpu_pressure + - module_bottleneck + path: memory_leak/steps.yaml +- id: module_bottleneck + category: performance + priority: 4 + description: Find slowest PyTorch modules in recent steps + tables: + - python.torch_trace + pages: + - profiling/torch + - training + related: + - slow_rank + - comm_bottleneck + - memory_leak + path: module_bottleneck/steps.yaml +- id: comm_bottleneck + category: distributed + priority: 5 + description: Rank collective ops by total and p99 latency + tables: + - python.comm_collective + - rdma.mlx_hca + pages: + - training + - cluster + - analytics + - spans + related: + - slow_rank + - nccl_culprit_victim + path: comm_bottleneck/steps.yaml +- id: gpu_pressure + category: memory + priority: 6 + description: GPU memory and utilization headroom + tables: + - gpu.utilization + - gpu.devices + - python.torch_trace + pages: + - dashboard + related: + - memory_leak + - slow_rank + path: gpu_pressure/steps.yaml +- id: nccl_culprit_victim + category: distributed + priority: 7 + description: NCCL proxy wait decomposition — culprit (send_gpu_wait) vs victim (recv_wait) + tables: + - nccl.proxy_ops + - nccl.net_qp + - global.nccl.proxy_ops + pages: + - training + - cluster + - analytics + related: + - slow_rank + - comm_bottleneck + path: nccl_culprit_victim/steps.yaml diff --git a/skills/comm_bottleneck/SKILL.md b/skills/comm_bottleneck/SKILL.md new file mode 100644 index 00000000..649d0fe6 --- /dev/null +++ b/skills/comm_bottleneck/SKILL.md @@ -0,0 +1,30 @@ +--- +name: comm_bottleneck +description: > + Rank collective ops by total and p99 latency +category: distributed +tables: [python.comm_collective, nccl.proxy_ops, rdma.mlx_hca] +tags: [NCCL, collective, communication, 通信, all_reduce] +keywords: + en: ['communication slow', 'NCCL', 'collective', 'comm bottleneck'] + zh: ['通信慢', 'NCCL', 'all_reduce', '通信瓶颈', '带宽'] +parameters: + step_window: { type: integer, default: 50 } + use_global: { type: boolean, default: True } +--- + +# Communication bottleneck + +按 collective op 聚合延迟与传输量,定位通信热点。 +适用于「计算不慢但 step 时间长」或「通信占比高」的场景。 + +## Parameters + +- `step_window` (integer, default `50`): +- `use_global` (boolean, default `True`): + +## Related skills + +- all_reduce 慢 → 检查 bucket 大小、overlap、FP16 compress +- 有 `nccl.proxy_ops` → skill: `nccl_culprit_victim`(culprit/victim 归因) +- RoCE 拥塞 → 查 rdma.mlx_hca 与交换机 ECN 配置 diff --git a/skills/comm_bottleneck/steps.yaml b/skills/comm_bottleneck/steps.yaml new file mode 100644 index 00000000..62ab49e6 --- /dev/null +++ b/skills/comm_bottleneck/steps.yaml @@ -0,0 +1,142 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: comm_bottleneck + title: "通信瓶颈分析" + title_en: "Communication bottleneck" + category: distributed + tags: [NCCL, collective, communication, 通信, all_reduce] + triggers: + keywords: + zh: ["通信慢", "NCCL", "all_reduce", "通信瓶颈", "带宽"] + en: ["communication slow", "NCCL", "collective", "comm bottleneck"] + docs: | + 按 collective op 聚合延迟与传输量,定位通信热点。 + 适用于「计算不慢但 step 时间长」或「通信占比高」的场景。 + +spec: + parameters: + - name: step_window + type: integer + default: 50 + - name: use_global + type: boolean + default: true + + requires: + any_tables: + - python.comm_collective + - nccl.proxy_ops + + steps: + - id: op_summary + title: "各 collective op 统计" + type: sql + sql: | + SELECT + op, + count(*) AS calls, + avg(duration_ms) AS avg_ms, + max(duration_ms) AS p100_ms, + sum(bytes) AS total_bytes, + avg(bytes) AS avg_bytes + FROM {table_comm} + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM {table_comm} + ) + GROUP BY op + ORDER BY sum(duration_ms) DESC + on_empty: abort + empty_message: "无 comm_collective 数据" + + - id: op_by_step + title: "每 step 通信总耗时" + type: sql + sql: | + SELECT + global_step, + sum(duration_ms) AS comm_ms, + count(*) AS calls, + sum(bytes) AS bytes + FROM {table_comm} + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM {table_comm} + ) + GROUP BY global_step + ORDER BY global_step + on_empty: skip + + - id: slowest_calls + title: "最慢的 collective 调用" + type: sql + sql: | + SELECT global_step, rank, op, duration_ms, bytes, tensor_shape + FROM {table_comm} + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM {table_comm} + ) + ORDER BY duration_ms DESC + LIMIT 20 + on_empty: skip + + - id: nccl_proxy_wait + title: "NCCL proxy wait 汇总 (profiler)" + type: sql + sql: | + SELECT + coll_func, + sum(send_gpu_wait_ns) AS total_gpu_wait_ns, + sum(recv_wait_ns) AS total_recv_wait_ns, + count(*) AS ops + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {step_window} + FROM {nccl_proxy_table} + ) + GROUP BY coll_func + ORDER BY total_recv_wait_ns DESC + on_empty: skip + empty_message: "无 nccl.proxy_ops — 仅 python.comm_collective 粗粒度可用" + + - id: rdma_hint + title: "RDMA 端口速率 (Linux)" + type: sql + platform: linux + sql: | + SELECT hca_name, rcv_pkts_rate, snd_pkts_rate, np_ecn_marked_roce_packets + FROM rdma.mlx_hca + LIMIT 5 + on_empty: skip + empty_message: "RDMA 表不可用 — 非 InfiniBand/RoCE 或未配置 rdma.hca_name" + + variables: + table_comm: "{comm_table}" + nccl_proxy_table: "{nccl_proxy_table}" + + interpretation: + rules: + - id: comm_dominates_step + when: "step:op_by_step | column:comm_ms | avg > 100" + severity: info + message: "平均每 step 通信耗时 >100ms — 考虑梯度桶/重叠/压缩" + + - id: ecn_marked + when: "step:rdma_hint | column:np_ecn_marked_roce_packets | max > 0" + severity: warning + message: "RoCE ECN 标记包 >0 — 网络可能存在拥塞" + + summary_template: | + ## 通信瓶颈 + - **op_summary**: 哪个 op 总耗时最高 + - **slowest_calls**: 极端慢调用 + - rank 不均衡 → skill: slow_rank + + next_steps: + - "all_reduce 慢 → 检查 bucket 大小、overlap、FP16 compress" + - "某 step comm_ms 尖峰 → 对照 checkpoint / eval 边界" + - "RoCE 拥塞 → 查 rdma.mlx_hca 与交换机 ECN 配置" + - "有 proxy wait 数据 → skill: nccl_culprit_victim" diff --git a/skills/gpu_pressure/SKILL.md b/skills/gpu_pressure/SKILL.md new file mode 100644 index 00000000..25067c93 --- /dev/null +++ b/skills/gpu_pressure/SKILL.md @@ -0,0 +1,28 @@ +--- +name: gpu_pressure +description: > + GPU memory and utilization headroom +category: memory +tables: [gpu.utilization, gpu.devices, python.torch_trace] +tags: [gpu, VRAM, utilization, 显存, 利用率] +keywords: + en: ['GPU memory', 'VRAM', 'GPU utilization', 'GPU idle'] + zh: ['显存不够', 'GPU 利用率', 'VRAM', '显存占用', 'GPU 空闲'] +parameters: + sample_limit: { type: integer, default: 20 } +--- + +# GPU memory and utilization pressure + +查看 gpu.utilization 采样与 python.torch_trace 中的 allocated 是否一致, +判断是「真 OOM 风险」还是「利用率低 / 内存碎片」。 + +## Parameters + +- `sample_limit` (integer, default `20`): + +## Related skills + +- 显存持续上涨 → skill: memory_leak +- MPS Mac → torch.mps.current_allocated_memory 已在 torch_trace 中 +- 启用更细 profiling → probing.torch.profiling=on,random:0.1 diff --git a/skills/gpu_pressure/steps.yaml b/skills/gpu_pressure/steps.yaml new file mode 100644 index 00000000..1b07643d --- /dev/null +++ b/skills/gpu_pressure/steps.yaml @@ -0,0 +1,104 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: gpu_pressure + title: "GPU 显存与利用率压力" + title_en: "GPU memory and utilization pressure" + category: memory + tags: [gpu, VRAM, utilization, 显存, 利用率] + triggers: + keywords: + zh: ["显存不够", "GPU 利用率", "VRAM", "显存占用", "GPU 空闲"] + en: ["GPU memory", "VRAM", "GPU utilization", "GPU idle"] + docs: | + 查看 gpu.utilization 采样与 python.torch_trace 中的 allocated 是否一致, + 判断是「真 OOM 风险」还是「利用率低 / 内存碎片」。 + +spec: + parameters: + - name: sample_limit + type: integer + default: 20 + + steps: + - id: gpu_latest + title: "GPU 当前状态 (最近采样)" + type: sql + sql: | + SELECT + ts, + name, + device_id, + used_bytes, + total_bytes, + mem_used_pct, + gpu_util_pct, + mem_controller_util_pct + FROM gpu.utilization + ORDER BY ts DESC + LIMIT {sample_limit} + on_empty: abort + empty_message: "gpu.utilization 无数据 — 确认 GPU 扩展已启用" + + - id: gpu_devices + title: "GPU 设备信息" + type: sql + sql: | + SELECT device_id, name, memory_model, chip, total_bytes + FROM gpu.devices + on_empty: skip + + - id: torch_allocated_latest + title: "Torch 视角显存 (最近 step)" + type: sql + sql: | + SELECT + step, + max(allocated) AS torch_allocated_mb, + max(cached) AS torch_cached_mb + FROM python.torch_trace + WHERE step >= (SELECT max(step) - 5 FROM python.torch_trace) + GROUP BY step + ORDER BY step DESC + on_empty: skip + empty_message: "无 torch_trace — MPS/CUDA allocated 仅在 torch profiling 开启时有" + + - id: low_utilization + title: "低 GPU 利用率采样" + type: sql + sql: | + SELECT ts, gpu_util_pct, mem_used_pct, name + FROM gpu.utilization + WHERE gpu_util_pct >= 0 AND gpu_util_pct < 30 + ORDER BY ts DESC + LIMIT 10 + on_empty: skip + + interpretation: + rules: + - id: critical_mem + when: "step:gpu_latest | column:mem_used_pct | max > 95" + severity: error + message: "显存使用率 >95% — imminent OOM 风险" + + - id: low_gpu_util + when: "step:low_utilization | rows > 5" + severity: info + message: "多次采样 GPU 利用率 <30% — 可能存在 CPU/IO 瓶颈或 batch 过小" + + - id: torch_vs_driver_gap + when: "step:torch_allocated_latest | rows > 0" + severity: info + message: "对比 torch_allocated_mb 与 gpu.used_bytes — 差距大可能有碎片或未释放 cache" + + summary_template: | + ## GPU 压力 + - **gpu_latest**: 设备 mem_used_pct / gpu_util_pct + - **torch_allocated_latest**: PyTorch 视角 (MB) + - 显存涨但 util 低 → 查 DataLoader; util 高 mem 低 → 计算密集 + + next_steps: + - "显存持续上涨 → skill: memory_leak" + - "MPS Mac → torch.mps.current_allocated_memory 已在 torch_trace 中" + - "启用更细 profiling → probing.torch.profiling=on,random:0.1" diff --git a/skills/health_overview/SKILL.md b/skills/health_overview/SKILL.md new file mode 100644 index 00000000..dd3bdc0e --- /dev/null +++ b/skills/health_overview/SKILL.md @@ -0,0 +1,28 @@ +--- +name: health_overview +description: > + One-shot health check: CPU, GPU, tables, recent training activity +category: triage +tables: [cpu.utilization, gpu.utilization, python.torch_trace, cluster.nodes] +tags: [overview, doctor, triage, 健康检查] +keywords: + en: ['health', 'overview', 'status', 'doctor', 'checkup'] + zh: ['健康', '概览', '怎么样', '正常吗', 'doctor', '体检'] +parameters: + sample_limit: { type: integer, default: 5 } +--- + +# Training health overview + +快速扫描目标进程:有哪些表、CPU/GPU 最近采样、训练是否在推进。 +适合作为 agent 的默认第一步,或用户不确定从哪查起时使用。 + +## Parameters + +- `sample_limit` (integer, default `5`): Recent CPU/GPU samples to show + +## Related skills + +- 训练变慢 → skill: module_bottleneck 或 slow_rank +- 显存上涨 → skill: memory_leak +- 进程卡住 → skill: training_hang diff --git a/skills/health_overview/steps.yaml b/skills/health_overview/steps.yaml new file mode 100644 index 00000000..8b2c11c5 --- /dev/null +++ b/skills/health_overview/steps.yaml @@ -0,0 +1,107 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: health_overview + title: "训练健康概览" + title_en: "Training health overview" + category: triage + tags: [overview, doctor, triage, 健康检查] + triggers: + keywords: + zh: ["健康", "概览", "怎么样", "正常吗", "doctor", "体检"] + en: ["health", "overview", "status", "doctor", "checkup"] + docs: | + 快速扫描目标进程:有哪些表、CPU/GPU 最近采样、训练是否在推进。 + 适合作为 agent 的默认第一步,或用户不确定从哪查起时使用。 + +spec: + parameters: + - name: sample_limit + type: integer + default: 5 + description: "Recent CPU/GPU samples to show" + + steps: + - id: available_tables + title: "可查询的数据表" + type: sql + sql: | + SELECT table_schema, table_name, table_type + FROM information_schema.tables + WHERE table_schema NOT IN ('information_schema') + ORDER BY table_schema, table_name + on_empty: warn + empty_message: "未发现业务表 — 确认 probing 已注入且 PROBING=1" + + - id: host_cpu + title: "主机 CPU / 内存 (最近采样)" + type: sql + sql: | + SELECT ts, comm, rss_kb, cpu_total_pct, thread_count, state + FROM cpu.utilization + WHERE scope = 'process' + ORDER BY ts DESC + LIMIT {sample_limit} + on_empty: skip + empty_message: "cpu.utilization 无数据 — CPU 采样可能未开启" + + - id: gpu_mem + title: "GPU 显存 / 利用率 (最近采样)" + type: sql + sql: | + SELECT ts, name, used_bytes, total_bytes, mem_used_pct, gpu_util_pct + FROM gpu.utilization + ORDER BY ts DESC + LIMIT {sample_limit} + on_empty: skip + empty_message: "gpu.utilization 无数据 — GPU 扩展未启用或无 GPU" + + - id: latest_torch_step + title: "最近训练 step (torch_trace)" + type: sql + sql: | + SELECT max(step) AS latest_step, count(*) AS trace_rows + FROM python.torch_trace + on_empty: skip + empty_message: "python.torch_trace 无数据 — 设置 probing.torch.profiling=on" + + - id: cluster_nodes + title: "集群节点" + type: sql + sql: | + SELECT rank, host, addr, status + FROM cluster.nodes + ORDER BY rank + on_empty: skip + empty_message: "单进程模式或未注册 cluster 节点" + + interpretation: + rules: + - id: no_tables + when: "step:available_tables | rows == 0" + severity: error + message: "没有可查询表 — probing 可能未正确注入" + + - id: high_gpu_mem + when: "step:gpu_mem | column:mem_used_pct | max > 90" + severity: warning + message: "GPU 显存使用率超过 90%,关注 OOM 风险" + + - id: training_active + when: "step:latest_torch_step | column:latest_step | value > 0" + severity: info + message: "Torch 训练 trace 活跃,最新 step = {latest_step}" + + summary_template: | + ## 健康概览 + - 可用表: {available_tables.row_count} 张 + - 最新训练 step: {latest_torch_step.latest_step} + - 集群节点: {cluster_nodes.row_count} 个(0 表示单机) + + 若某项为空,按 empty_message 提示开启对应采集。 + + next_steps: + - "训练变慢 → skill: module_bottleneck 或 slow_rank" + - "显存上涨 → skill: memory_leak" + - "进程卡住 → skill: training_hang" diff --git a/skills/install.sh b/skills/install.sh new file mode 100755 index 00000000..a77319e0 --- /dev/null +++ b/skills/install.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +# Install repo skills/ into Cursor, Claude Code, and Codex skill directories. +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +if command -v probing >/dev/null 2>&1; then + exec probing skill install "$@" +fi + +export PROBING=1 +export PYTHONPATH="${ROOT}/python${PYTHONPATH:+:${PYTHONPATH}}" +exec python3 -m probing.skills install "$@" diff --git a/skills/memory_leak/SKILL.md b/skills/memory_leak/SKILL.md new file mode 100644 index 00000000..d2b43704 --- /dev/null +++ b/skills/memory_leak/SKILL.md @@ -0,0 +1,30 @@ +--- +name: memory_leak +description: > + Detect monotonic GPU memory growth across training steps +category: memory +tables: [python.torch_trace, gpu.utilization] +tags: [memory, leak, OOM, 显存, 泄漏] +keywords: + en: ['memory leak', 'OOM', 'memory growing', 'out of memory'] + zh: ['泄漏', 'OOM', '显存涨', '内存涨', 'out of memory', '阶梯'] +parameters: + min_steps: { type: integer, default: 10 } + step_skip: { type: integer, default: 2 } +--- + +# GPU memory leak detection + +检测 python.torch_trace 中 allocated 是否随 step 单调上涨, +并结合 gpu.utilization 看设备级显存趋势。 + +## Parameters + +- `min_steps` (integer, default `10`): Minimum steps required for trend analysis +- `step_skip` (integer, default `2`): Skip first N steps (discovery / warmup) + +## Related skills + +- 某模块 delta 大 → 检查是否 cache 了 tensor / 未 detach +- 仅 torch_trace 涨而 gpu.utilization 平稳 → 可能是统计口径问题 +- Linux OOM → SELECT * FROM process.kmsg WHERE message LIKE '%oom%' diff --git a/skills/memory_leak/steps.yaml b/skills/memory_leak/steps.yaml new file mode 100644 index 00000000..f12fc20c --- /dev/null +++ b/skills/memory_leak/steps.yaml @@ -0,0 +1,145 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: memory_leak + title: "显存泄漏 / 阶梯上涨" + title_en: "GPU memory leak detection" + category: memory + tags: [memory, leak, OOM, 显存, 泄漏] + triggers: + keywords: + zh: ["泄漏", "OOM", "显存涨", "内存涨", "out of memory", "阶梯"] + en: ["memory leak", "OOM", "memory growing", "out of memory"] + docs: | + 检测 python.torch_trace 中 allocated 是否随 step 单调上涨, + 并结合 gpu.utilization 看设备级显存趋势。 + +spec: + parameters: + - name: min_steps + type: integer + default: 10 + description: "Minimum steps required for trend analysis" + - name: step_skip + type: integer + default: 2 + description: "Skip first N steps (discovery / warmup)" + + steps: + - id: memory_by_step + title: "每 step 峰值显存 (torch_trace)" + type: sql + sql: | + SELECT + step, + max(allocated) AS peak_mb, + max(max_allocated) AS peak_max_mb, + max(allocated_delta) AS max_delta_mb + FROM python.torch_trace + WHERE step > {step_skip} + GROUP BY step + ORDER BY step + on_empty: abort + empty_message: "python.torch_trace 无数据 — 开启 probing.torch.profiling=on" + + - id: memory_trend + title: "step 间显存增长" + type: sql + sql: | + WITH per_step AS ( + SELECT step, max(allocated) AS peak_mb + FROM python.torch_trace + WHERE step > {step_skip} + GROUP BY step + ), + deltas AS ( + SELECT + step, + peak_mb, + peak_mb - lag(peak_mb) OVER (ORDER BY step) AS growth_mb + FROM per_step + ) + SELECT step, peak_mb, growth_mb + FROM deltas + WHERE growth_mb IS NOT NULL + ORDER BY step + on_empty: skip + + - id: monotonic_growth_steps + title: "连续上涨的 step" + type: sql + sql: | + WITH per_step AS ( + SELECT step, max(allocated) AS peak_mb + FROM python.torch_trace + WHERE step > {step_skip} + GROUP BY step + ), + flagged AS ( + SELECT + step, + peak_mb, + CASE + WHEN peak_mb > lag(peak_mb) OVER (ORDER BY step) THEN 1 + ELSE 0 + END AS increased + FROM per_step + ) + SELECT step, peak_mb, increased + FROM flagged + WHERE increased = 1 + ORDER BY step + on_empty: skip + + - id: top_memory_modules + title: "显存增量最大的模块" + type: sql + sql: | + SELECT + module, + stage, + avg(allocated_delta) AS avg_delta_mb, + max(allocated_delta) AS max_delta_mb, + count(*) AS samples + FROM python.torch_trace + WHERE step > {step_skip} + AND allocated_delta > 0 + GROUP BY module, stage + ORDER BY avg_delta_mb DESC + LIMIT 15 + on_empty: skip + + - id: gpu_device_trend + title: "GPU 设备级显存趋势" + type: sql + sql: | + SELECT ts, used_bytes, total_bytes, mem_used_pct + FROM gpu.utilization + ORDER BY ts DESC + LIMIT 30 + on_empty: skip + empty_message: "gpu.utilization 不可用" + + interpretation: + rules: + - id: sustained_growth + when: "step:monotonic_growth_steps | rows > {min_steps} * 0.7" + severity: warning + message: "超过 70% 的 step 显存在上涨 — 可能存在泄漏" + + - id: large_delta_module + when: "step:top_memory_modules | column:avg_delta_mb | max > 50" + severity: warning + message: "存在模块平均 allocated_delta > 50MB — 检查 {top_module}" + + summary_template: | + ## 显存泄漏诊断 + - **memory_trend**: 逐步 growth_mb + - **top_memory_modules**: 哪个 module/stage 在涨 + - **gpu_device_trend**: 设备级是否同步上涨 + + next_steps: + - "某模块 delta 大 → 检查是否 cache 了 tensor / 未 detach" + - "仅 torch_trace 涨而 gpu.utilization 平稳 → 可能是统计口径问题" + - "Linux OOM → SELECT * FROM process.kmsg WHERE message LIKE '%oom%'" diff --git a/skills/module_bottleneck/SKILL.md b/skills/module_bottleneck/SKILL.md new file mode 100644 index 00000000..5fa976f3 --- /dev/null +++ b/skills/module_bottleneck/SKILL.md @@ -0,0 +1,30 @@ +--- +name: module_bottleneck +description: > + Find slowest PyTorch modules in recent steps +category: performance +tables: [python.torch_trace] +tags: [slow, bottleneck, module, torch, 慢, 瓶颈] +keywords: + en: ['slow', 'bottleneck', 'hotspot', 'which module', 'slowdown'] + zh: ['慢', '瓶颈', '哪个模块', '变慢', 'hotspot', '热点'] +parameters: + recent_steps: { type: integer, default: 10 } + stage_filter: { type: string, default: post forward } +--- + +# PyTorch module bottleneck + +基于 python.torch_trace 的 post-hook duration,找出最近 step 中最耗时的模块。 +与 torch.profiler 互补:这是长期采样、模块级、低开销视图。 + +## Parameters + +- `recent_steps` (integer, default `10`): Analyze the last N training steps +- `stage_filter` (string, default `post forward`): Hook stage to aggregate (post forward | post step) + +## Related skills + +- 打开 Torch 火焰图 (profiling/torch) 看调用栈分布 +- 分布式变慢 → skill: slow_rank +- 需要 CPU 栈 → SET probing.pprof.sample_freq=99, profiling/pprof diff --git a/skills/module_bottleneck/steps.yaml b/skills/module_bottleneck/steps.yaml new file mode 100644 index 00000000..4c5fce73 --- /dev/null +++ b/skills/module_bottleneck/steps.yaml @@ -0,0 +1,114 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: module_bottleneck + title: "模块性能瓶颈" + title_en: "PyTorch module bottleneck" + category: performance + tags: [slow, bottleneck, module, torch, 慢, 瓶颈] + triggers: + keywords: + zh: ["慢", "瓶颈", "哪个模块", "变慢", "hotspot", "热点"] + en: ["slow", "bottleneck", "hotspot", "which module", "slowdown"] + docs: | + 基于 python.torch_trace 的 post-hook duration,找出最近 step 中最耗时的模块。 + 与 torch.profiler 互补:这是长期采样、模块级、低开销视图。 + +spec: + parameters: + - name: recent_steps + type: integer + default: 10 + description: "Analyze the last N training steps" + - name: stage_filter + type: string + default: "post forward" + description: "Hook stage to aggregate (post forward | post step)" + + requires: + any_tables: + - python.torch_trace + + steps: + - id: module_totals + title: "模块总耗时占比 (最近 step)" + type: sql + sql: | + SELECT + module, + stage, + count(*) AS executions, + avg(duration) AS avg_sec, + sum(duration) AS total_sec, + sum(duration) * 100.0 / sum(sum(duration)) OVER () AS pct_time + FROM python.torch_trace + WHERE step > (SELECT max(step) - {recent_steps} FROM python.torch_trace) + AND stage = '{stage_filter}' + GROUP BY module, stage + ORDER BY total_sec DESC + LIMIT 15 + on_empty: abort + empty_message: "无 torch_trace — SET probing.torch.profiling=on" + + - id: per_step_breakdown + title: "逐步耗时分解" + type: sql + sql: | + SELECT + step, + sum(CASE WHEN stage = 'post forward' THEN duration ELSE 0 END) AS forward_sec, + sum(CASE WHEN stage = 'post step' THEN duration ELSE 0 END) AS optim_sec + FROM python.torch_trace + WHERE step > (SELECT max(step) - {recent_steps} FROM python.torch_trace) + GROUP BY step + ORDER BY step + on_empty: skip + + - id: step_regression + title: "step 间耗时回归 (是否越来越慢)" + type: sql + sql: | + WITH per_step AS ( + SELECT step, sum(duration) AS total_sec + FROM python.torch_trace + WHERE step > (SELECT max(step) - {recent_steps} FROM python.torch_trace) + AND stage = '{stage_filter}' + GROUP BY step + ) + SELECT + step, + total_sec, + total_sec - lag(total_sec) OVER (ORDER BY step) AS delta_sec + FROM per_step + ORDER BY step + on_empty: skip + + - id: enable_torch_flamegraph + title: "提示: 打开 Torch 火焰图" + type: ui + action: navigate + view: profiling/torch + when: "always" + + interpretation: + rules: + - id: dominant_module + when: "step:module_totals | column:pct_time | top > 40" + severity: info + message: "单个模块占用 >40% 时间 — 优先优化 {top_module}" + + - id: step_slowdown + when: "step:step_regression | column:delta_sec | last > 2 * avg(delta_sec)" + severity: warning + message: "最近 step 总耗时明显上升 — 对比 step_regression 与 comm_collective" + + summary_template: | + ## 模块瓶颈 + Top 模块见 **module_totals** (pct_time 列)。 + 若 forward_sec vs optim_sec 失衡,见 **per_step_breakdown**。 + + next_steps: + - "打开 Torch 火焰图 (profiling/torch) 看调用栈分布" + - "分布式变慢 → skill: slow_rank" + - "需要 CPU 栈 → SET probing.pprof.sample_freq=99, profiling/pprof" diff --git a/skills/nccl_culprit_victim/SKILL.md b/skills/nccl_culprit_victim/SKILL.md new file mode 100644 index 00000000..9e3d3753 --- /dev/null +++ b/skills/nccl_culprit_victim/SKILL.md @@ -0,0 +1,33 @@ +--- +name: nccl_culprit_victim +description: > + NCCL proxy wait decomposition — culprit (send_gpu_wait) vs victim (recv_wait) +category: distributed +tables: [nccl.proxy_ops, nccl.net_qp, global.nccl.proxy_ops] +tags: [NCCL, culprit, victim, straggler, wait, proxy] +keywords: + en: ['NCCL culprit', 'NCCL victim', 'recv wait', 'gpu wait', 'slow rank NCCL', 'proxy wait'] + zh: ['NCCL 慢 rank', '罪魁祸首', '受害者', 'recv_wait', 'gpu_wait', '等待分解'] +parameters: + seq_window: { type: integer, default: 20 } + use_global: { type: boolean, default: true } +--- + +# NCCL culprit / victim attribution + +Uses **NCCL profiler plugin** wait decomposition (`nccl.proxy_ops`): + +- **Culprit** (slow local GPU): high `send_gpu_wait_ns` +- **Victim** (waiting on peers / network): high `recv_wait_ns` + +Requires `NCCL_PROFILER_PLUGIN` + `probing-nccl-profiler` (or mock data via `PROBING_NCCL_MOCK` on macOS). + +## Parameters + +- `seq_window` (integer, default `20`): recent collective sequences to analyze +- `use_global` (boolean, default `true`): fan-out with `global.nccl.proxy_ops` + +## Related skills + +- Coarse collective latency → `comm_bottleneck` / `slow_rank` (`python.comm_collective`) +- IB QP timing → `nccl.net_qp` when NetPlugin mask enabled diff --git a/skills/nccl_culprit_victim/steps.yaml b/skills/nccl_culprit_victim/steps.yaml new file mode 100644 index 00000000..1c2992f3 --- /dev/null +++ b/skills/nccl_culprit_victim/steps.yaml @@ -0,0 +1,198 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: nccl_culprit_victim + title: "NCCL culprit / victim 归因" + title_en: "NCCL culprit vs victim attribution" + category: distributed + tags: [NCCL, culprit, victim, proxy, wait, straggler] + triggers: + keywords: + zh: ["罪魁祸首", "受害者", "recv_wait", "gpu_wait", "NCCL 等待", "proxy wait"] + en: ["NCCL culprit", "NCCL victim", "recv wait", "gpu wait", "proxy wait"] + docs: | + 基于 nccl.proxy_ops 的 ProxyStep wait 分解,区分: + - culprit:send_gpu_wait_ns 高(本 rank GPU/计算慢) + - victim:recv_wait_ns 高(等 peer / 网络) + 需要 NCCL_PROFILER_PLUGIN 加载 probing-nccl-profiler;开发机可用 PROBING_NCCL_MOCK=1。 + +spec: + parameters: + - name: seq_window + type: integer + default: 20 + description: "Analyze proxy ops with seq >= max(seq) - window" + - name: use_global + type: boolean + default: true + description: "Use global.nccl.proxy_ops for multi-node fan-out" + + requires: + any_tables: + - nccl.proxy_ops + - global.nccl.proxy_ops + + steps: + - id: rank_wait_summary + title: "各 rank wait 分解汇总" + type: sql + sql: | + SELECT + rank, + count(*) AS proxy_ops, + sum(send_gpu_wait_ns) AS total_gpu_wait_ns, + sum(recv_wait_ns) AS total_recv_wait_ns, + sum(send_wait_ns) AS total_send_wait_ns, + avg(send_gpu_wait_ns) AS avg_gpu_wait_ns, + avg(recv_wait_ns) AS avg_recv_wait_ns + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + GROUP BY rank + ORDER BY total_recv_wait_ns DESC + on_empty: abort + empty_message: | + 无 nccl.proxy_ops 数据。确认: + - export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) + - export NCCL_PROFILE_EVENT_MASK=26 + - 或 macOS 开发: PROBING_NCCL_MOCK=1 PROBING=1 + + - id: culprit_ranking + title: "Culprit 候选 (send_gpu_wait)" + type: sql + sql: | + SELECT + rank, + tp_rank, + pp_rank, + dp_rank, + coll_func, + sum(send_gpu_wait_ns) AS culprit_wait_ns, + count(*) AS ops + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + GROUP BY rank, tp_rank, pp_rank, dp_rank, coll_func + ORDER BY culprit_wait_ns DESC + LIMIT 10 + on_empty: skip + + - id: victim_ranking + title: "Victim 候选 (recv_wait)" + type: sql + sql: | + SELECT + rank, + tp_rank, + pp_rank, + dp_rank, + coll_func, + sum(recv_wait_ns) AS victim_wait_ns, + sum(recv_flush_wait_ns) AS flush_wait_ns, + count(*) AS ops + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + GROUP BY rank, tp_rank, pp_rank, dp_rank, coll_func + ORDER BY victim_wait_ns DESC + LIMIT 10 + on_empty: skip + + - id: role_aligned + title: "按并行角色 (tp/pp/dp) 对齐" + type: sql + sql: | + SELECT + tp_rank, + pp_rank, + dp_rank, + sum(send_gpu_wait_ns) AS gpu_wait_ns, + sum(recv_wait_ns) AS recv_wait_ns, + count(DISTINCT rank) AS ranks_seen + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + AND tp_rank >= 0 + GROUP BY tp_rank, pp_rank, dp_rank + ORDER BY recv_wait_ns DESC + on_empty: skip + empty_message: "无 tp/pp/dp 列或未设置并行 env — 仅按 torch rank 分析" + + - id: global_fanout + title: "跨节点 global 视图" + type: sql + cluster: true + when: "{use_global}" + sql: | + SELECT + _host, + _rank AS probe_rank, + rank AS torch_rank, + sum(send_gpu_wait_ns) AS gpu_wait_ns, + sum(recv_wait_ns) AS recv_wait_ns + FROM global.nccl.proxy_ops + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM global.nccl.proxy_ops + ) + GROUP BY _host, _rank, rank + ORDER BY recv_wait_ns DESC + on_empty: skip + + - id: net_qp_hint + title: "IB QP 延迟 (NetPlugin)" + type: sql + sql: | + SELECT + rank, + qp_num, + avg(duration_ns) AS avg_qp_ns, + max(duration_ns) AS max_qp_ns, + count(*) AS events + FROM {net_qp_table} + GROUP BY rank, qp_num + ORDER BY max_qp_ns DESC + LIMIT 10 + on_empty: skip + empty_message: "nccl.net_qp 空 — 需要 NCCL_PROFILE_EVENT_MASK 含 NetPlugin(128)" + + variables: + nccl_proxy_table: "{nccl_proxy_table}" + + interpretation: + rules: + - id: culprit_dominates + when: "step:rank_wait_summary | column:total_gpu_wait_ns | max/min(ratio) > 2" + severity: warning + message: "某 rank 的 send_gpu_wait 显著高于其他 rank — 可能是 culprit (本地 GPU 慢)" + + - id: victim_dominates + when: "step:rank_wait_summary | column:total_recv_wait_ns | max/min(ratio) > 2" + severity: warning + message: "某 rank 的 recv_wait 显著高于其他 rank — 可能是 victim (等待 peer/网络)" + + - id: culprit_not_victim + when: "step:culprit_ranking | rows >= 1 | column:culprit_wait_ns | max > 1000000" + severity: info + message: "查看 culprit_ranking 顶部 rank — 对比 victim_ranking 确认是否同一 rank" + + summary_template: | + ## NCCL culprit / victim + - **culprit_ranking**: `send_gpu_wait_ns` 最高 → 本地算力瓶颈 + - **victim_ranking**: `recv_wait_ns` 最高 → 等待他人或网络 + - **role_aligned**: 同 tp/pp/dp 切片对比(Megatron 拓扑) + - 若仅有 python.comm_collective → skill: comm_bottleneck + + next_steps: + - "culprit 持续同一 rank → gpu_pressure / module_bottleneck" + - "victim 全体偏高 → 网络/RoCE: comm_bottleneck (rdma.mlx_hca)" + - "单 rank victim + 其他 culprit → 典型 straggler: slow_rank" diff --git a/skills/semantic/intents.yaml b/skills/semantic/intents.yaml new file mode 100644 index 00000000..1944284d --- /dev/null +++ b/skills/semantic/intents.yaml @@ -0,0 +1,44 @@ +# Intent routing — maps user language to skill ids (keyword + LLM fallback). +apiVersion: probing.dev/v1 +kind: IntentCatalog + +intents: + health_check: + label: "健康检查 / 不知道从哪查" + keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup] + skills: [health_overview] + + training_hung: + label: "训练卡住 / 无进展" + keywords: [卡住, hang, stall, 不动, deadlock, 死锁, frozen, stuck, loss 不更新] + skills: [training_hang, slow_rank] + + training_slow: + label: "训练变慢 / 瓶颈" + keywords: [慢, slow, bottleneck, 瓶颈, 变慢, hotspot, 热点, 耗时] + skills: [module_bottleneck, slow_rank, comm_bottleneck] + + which_rank: + label: "慢 rank / straggler" + keywords: [straggler, 慢 rank, 拖后腿, rank 慢, lagging rank, 哪个 rank] + skills: [slow_rank, nccl_culprit_victim, comm_bottleneck] + + memory_growing: + label: "显存上涨 / OOM" + keywords: [OOM, leak, 泄漏, 显存涨, memory grow, out of memory, 阶梯] + skills: [memory_leak, gpu_pressure] + + comm_slow: + label: "通信慢 / NCCL" + keywords: [通信慢, NCCL, all_reduce, 通信瓶颈, collective, 带宽, culprit, victim, recv_wait, gpu_wait] + skills: [comm_bottleneck, nccl_culprit_victim, slow_rank] + + nccl_wait: + label: "NCCL wait 分解 / culprit victim" + keywords: [罪魁祸首, 受害者, send_gpu_wait, recv_wait, proxy wait, NCCL 等待, gpu wait] + skills: [nccl_culprit_victim, slow_rank] + + cluster_view: + label: "集群 / 多机训练" + keywords: [集群, 多机, 分布式, cluster, multi-node, 跨节点, 所有 rank, all ranks, fan-out] + skills: [slow_rank, comm_bottleneck, health_overview] diff --git a/skills/semantic/pages.yaml b/skills/semantic/pages.yaml new file mode 100644 index 00000000..397c278b --- /dev/null +++ b/skills/semantic/pages.yaml @@ -0,0 +1,76 @@ +# Workspace pages → suggested skills (Investigate page awareness). +apiVersion: probing.dev/v1 +kind: PageCatalog + +pages: + dashboard: + title: Dashboard + path: / + description: "Live CPU/GPU metrics, process overview, thread ranking." + skills: [health_overview] + + agent: + title: Investigate + path: /agent + description: "Skill-driven investigation; optional LLM diagnostic agent summarizes SQL evidence." + skills: [health_overview] + + cluster: + title: Cluster + path: /cluster + description: "Distributed training cluster nodes and rank status." + skills: [slow_rank, comm_bottleneck] + + stacks: + title: Stacks + path: /stacks + description: "Live mixed Python + native call stacks." + skills: [training_hang] + + profiling/pprof: + title: "Profiling · pprof" + path: /profiling/pprof + description: "CPU SIGPROF sampling flamegraph." + skills: [training_hang, module_bottleneck] + + profiling/torch: + title: "Profiling · torch" + path: /profiling/torch + description: "PyTorch module hook flamegraph (python.torch_trace)." + skills: [module_bottleneck, memory_leak] + + profiling/trace: + title: "Profiling · trace" + path: /profiling/trace + description: "Chrome trace event timeline." + skills: [module_bottleneck] + + analytics: + title: Analytics + path: /analytics + description: "Ad-hoc SQL analytics and time-series charts." + skills: [health_overview, comm_bottleneck, slow_rank] + + spans: + title: Spans + path: /spans + description: "Hierarchical tracing spans from python.trace_event." + skills: [training_hang, comm_bottleneck] + + training: + title: Training + path: /training + description: "Training step metrics and collective communication latency." + skills: [slow_rank, comm_bottleneck, module_bottleneck] + + pulsing: + title: Pulsing + path: /pulsing + description: "Ray/Pulsing actors and span capture." + skills: [] + + python: + title: Python + path: /python + description: "Live Python variable tracing on functions." + skills: [] diff --git a/skills/semantic/tables.yaml b/skills/semantic/tables.yaml new file mode 100644 index 00000000..7ce954d6 --- /dev/null +++ b/skills/semantic/tables.yaml @@ -0,0 +1,139 @@ +# Semantic layer: maps user/agent language to probing SQL tables and columns. +# Used in system prompts and skill prerequisite checks. +apiVersion: probing.dev/v1 +kind: SemanticCatalog + +tables: + python.torch_trace: + description: "PyTorch module-level forward/step timings and GPU memory snapshots" + synonyms: [torch trace, module timing, 模块耗时, 训练步 profiling] + key_columns: + step: "Training step index (int)" + global_step: "Global training step (from Rust step_snapshot)" + rank: "torch.distributed rank" + role: "Parallel role key, e.g. 'dp=2,pp=1,tp=0' (align/join across ranks)" + module: "Fully-qualified module name" + stage: "One of: forward, step (post forward / post step hooks)" + duration: "Hook duration in seconds" + allocated: "GPU memory allocated (MB) at hook time" + allocated_delta: "Change in allocated since previous hook (MB)" + max_allocated: "Peak allocated (MB)" + notes: + - "First complete step is discovery-only (may have no rows)" + - "Backward hooks are off by default" + + python.comm_collective: + description: "torch.distributed collective calls (all_reduce, broadcast, …)" + synonyms: [collective, communication, NCCL, 通信, all_reduce] + key_columns: + global_step: "Global training step" + local_step: "Local step on this rank" + rank: "torch.distributed rank" + role: "Parallel role key, e.g. 'dp=2,pp=1,tp=0' (align/join across ranks)" + op: "Collective operation name" + duration_ms: "Wall time in milliseconds" + bytes: "Tensor bytes communicated" + global_name: global.python.comm_collective + federation_columns: [_host, _addr, _rank, _role] + + python.trace_event: + description: "Span start/end and custom events (distributed tracing)" + synonyms: [trace, span, timeline, 链路] + key_columns: + record_type: "span_start | span_end | event" + trace_id: "Trace id shared by related spans" + span_id: "Unique span id" + name: "Span or event name" + time: "Timestamp (nanoseconds since epoch)" + + python.backtrace: + description: "Live mixed Python + native stack (point-in-time, not historical)" + synonyms: [stack, backtrace, 调用栈, hang stack] + key_columns: + func: "Function name" + file: "Source file" + lineno: "Line number" + depth: "Stack depth (0 = innermost)" + frame_type: "python | native" + + cpu.utilization: + description: "Host CPU and RSS sampling (process and top threads)" + synonyms: [cpu, host memory, RSS, 主机内存] + key_columns: + ts: "Sample timestamp (microseconds)" + scope: "process | thread" + rss_kb: "Resident set size (KB) — process scope only" + cpu_total_pct: "CPU utilization percentage" + comm: "Thread/process name" + wchan: "Kernel wait channel (Linux)" + + gpu.utilization: + description: "GPU memory and utilization samples" + synonyms: [gpu memory, VRAM, 显存, GPU利用率] + key_columns: + ts: "Sample timestamp" + used_bytes: "Device memory used" + total_bytes: "Device memory total" + mem_used_pct: "Memory used percentage" + gpu_util_pct: "GPU compute utilization (-1 if unavailable)" + + process.kmsg: + description: "Linux kernel ring buffer (dmesg) — OOM killer, GPU Xid, IB errors" + synonyms: [kernel log, dmesg, OOM, 内核日志] + platform: linux + key_columns: + timestamp: "Event time" + level: "Log level" + message: "Kernel message text" + + cluster.nodes: + description: "Registered distributed training peers" + synonyms: [cluster, nodes, ranks, 集群节点] + key_columns: + rank: "Global rank" + host: "Hostname" + addr: "probing HTTP address" + role: "Parallel role key, e.g. dp=2,pp=1,tp=0 (federation _role source)" + status: "Node status" + + nccl.proxy_ops: + description: "NCCL profiler plugin proxy-op wait decomposition (culprit vs victim)" + synonyms: [NCCL proxy, send_gpu_wait, recv_wait, culprit, victim, proxy wait] + key_columns: + ts: "Event timestamp (nanoseconds)" + rank: "torch.distributed rank" + tp_rank: "Tensor-parallel rank (-1 if unknown)" + pp_rank: "Pipeline-parallel rank (-1 if unknown)" + dp_rank: "Data-parallel rank (-1 if unknown)" + comm_hash: "NCCL communicator hash" + coll_func: "Collective name (AllReduce, AllGather, …)" + seq: "Collective sequence number" + channel_id: "NCCL channel id" + peer: "Peer rank for this proxy op" + is_send: "1 if send proxy, 0 if recv" + n_steps: "ProxyStep count aggregated" + trans_bytes: "Bytes transferred" + send_gpu_wait_ns: "Culprit signal — local GPU not ready to send" + send_wait_ns: "Send-side network wait" + recv_wait_ns: "Victim signal — waiting on peer data" + recv_flush_wait_ns: "Recv flush wait" + global_name: global.nccl.proxy_ops + federation_columns: [_host, _addr, _rank, _role] + notes: + - "Requires NCCL_PROFILER_PLUGIN + NCCL ≥ 2.26 (mask 26: Coll|ProxyOp|ProxyStep)" + - "macOS dev: PROBING_NCCL_MOCK=1 seeds synthetic culprit/victim pattern" + + nccl.net_qp: + description: "NCCL NetPlugin IB QP completion timing (optional mask bit 128)" + synonyms: [IB QP, RoCE, net plugin, qp duration] + key_columns: + ts: "Event timestamp (nanoseconds)" + rank: "torch.distributed rank" + device: "IB device index" + qp_num: "Queue pair number" + wr_id: "Work request id" + opcode: "IB opcode" + length: "Transfer length" + duration_ns: "QP completion duration" + global_name: global.nccl.net_qp + federation_columns: [_host, _addr, _rank, _role] diff --git a/skills/slow_rank/SKILL.md b/skills/slow_rank/SKILL.md new file mode 100644 index 00000000..c8230383 --- /dev/null +++ b/skills/slow_rank/SKILL.md @@ -0,0 +1,31 @@ +--- +name: slow_rank +description: > + Find straggler ranks via collective latency imbalance +category: distributed +tables: [python.comm_collective, global.python.comm_collective, nccl.proxy_ops] +tags: [rank, straggler, distributed, collective, 拖后腿] +keywords: + en: ['slow rank', 'straggler', 'lagging rank', 'which rank'] + zh: ['慢 rank', '拖后腿', 'straggler', '掉队', '哪个 rank', 'rank 慢'] +parameters: + step_window: { type: integer, default: 20 } + use_global: { type: boolean, default: True } +--- + +# Find slow rank (straggler) + +对比各 rank 的 collective 延迟,找出明显偏慢的 straggler。 +单机多卡时 rank 列来自 torch.distributed;多机时使用 global.* 并带 _host/_rank 标签。 + +## Parameters + +- `step_window` (integer, default `20`): Include collectives from the last N global_steps +- `use_global` (boolean, default `True`): Query global.python.comm_collective for cross-node fan-out + +## Related skills + +- 某 rank 持续最慢 → 检查该节点 GPU/网络/数据: skill: gpu_pressure +- 栈卡在 collective → skill: training_hang +- 模块级热点 → skill: module_bottleneck (在慢 rank 上 inject) +- 有 NCCL profiler → skill: nccl_culprit_victim diff --git a/skills/slow_rank/steps.yaml b/skills/slow_rank/steps.yaml new file mode 100644 index 00000000..7d5fabc1 --- /dev/null +++ b/skills/slow_rank/steps.yaml @@ -0,0 +1,185 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: slow_rank + title: "慢 rank / Straggler 定位" + title_en: "Find slow rank (straggler)" + category: distributed + tags: [rank, straggler, distributed, collective, 拖后腿] + triggers: + keywords: + zh: ["慢 rank", "拖后腿", "straggler", "掉队", "哪个 rank", "rank 慢"] + en: ["slow rank", "straggler", "lagging rank", "which rank"] + docs: | + 对比各 rank 的 collective 延迟,找出明显偏慢的 straggler。 + 单机多卡时 rank 列来自 torch.distributed;多机时使用 global.* 并带 _host/_rank 标签。 + +spec: + parameters: + - name: step_window + type: integer + default: 20 + description: "Include collectives from the last N global_steps" + - name: use_global + type: boolean + default: true + description: "Query global.python.comm_collective for cross-node fan-out" + + requires: + any_tables: + - python.comm_collective + - global.python.comm_collective + - nccl.proxy_ops + - global.nccl.proxy_ops + + steps: + - id: rank_latency + title: "各 rank collective 平均延迟" + type: sql + sql: | + SELECT + rank, + count(*) AS calls, + avg(duration_ms) AS avg_ms, + max(duration_ms) AS max_ms, + sum(bytes) AS total_bytes + FROM {table_comm} + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM {table_comm} + ) + GROUP BY rank + ORDER BY avg_ms DESC + on_empty: abort + empty_message: | + 无 collective 数据。确认: + - PROBING=1 且 torch.distributed 已初始化 + - collective tracing 已开启 (默认 lite 模式) + + - id: rank_latency_by_op + title: "按 op 分解的 rank 延迟" + type: sql + sql: | + SELECT + op, + rank, + avg(duration_ms) AS avg_ms, + count(*) AS calls + FROM {table_comm} + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM {table_comm} + ) + GROUP BY op, rank + ORDER BY op, avg_ms DESC + on_empty: skip + + - id: rank_latency_global + title: "跨节点 rank 延迟 (_host 标签)" + type: sql + cluster: true + when: "{use_global}" + sql: | + SELECT + _host, + _rank AS probe_rank, + rank AS torch_rank, + avg(duration_ms) AS avg_ms, + count(*) AS calls + FROM global.python.comm_collective + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM global.python.comm_collective + ) + GROUP BY _host, _rank, rank + ORDER BY avg_ms DESC + on_empty: skip + empty_message: "global 查询无结果 — 可能只有单节点或未 PUT /apis/nodes 注册" + + - id: step_straggler + title: "按 step 找最慢的 rank" + type: sql + sql: | + WITH per_step AS ( + SELECT + global_step, + rank, + sum(duration_ms) AS step_ms + FROM {table_comm} + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM {table_comm} + ) + GROUP BY global_step, rank + ), + ranked AS ( + SELECT + global_step, + rank, + step_ms, + step_ms - min(step_ms) OVER (PARTITION BY global_step) AS lag_ms + FROM per_step + ) + SELECT global_step, rank, step_ms, lag_ms + FROM ranked + WHERE lag_ms = max(lag_ms) OVER (PARTITION BY global_step) + ORDER BY global_step DESC + LIMIT 10 + on_empty: skip + + - id: nccl_wait_decomp + title: "NCCL wait 分解 (若已启用 profiler)" + type: sql + sql: | + SELECT + rank, + sum(send_gpu_wait_ns) AS gpu_wait_ns, + sum(recv_wait_ns) AS recv_wait_ns, + count(*) AS proxy_ops + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {step_window} + FROM {nccl_proxy_table} + ) + GROUP BY rank + ORDER BY recv_wait_ns DESC + on_empty: skip + empty_message: | + 无 nccl.proxy_ops — 粗粒度 collective 仍可用。 + 启用: NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) + + - id: open_analytics + title: "打开 Analytics 查看 collective" + type: ui + action: navigate + view: analytics + when: "always" + + variables: + table_comm: "{comm_table}" + nccl_proxy_table: "{nccl_proxy_table}" + + interpretation: + rules: + - id: straggler_ratio + when: "step:rank_latency | column:avg_ms | max/min(ratio) > 1.5" + severity: warning + message: "最慢 rank 的平均 collective 延迟是中位数的 1.5 倍以上" + + - id: single_rank_dominates + when: "step:rank_latency | rows >= 2 | top(row).avg_ms > 2 * median(avg_ms)" + severity: warning + message: "Rank {worst_rank} 可能是 straggler — 查看 rank_latency_by_op 确认是哪个 op" + + summary_template: | + ## 慢 rank 诊断 + - 查看 **rank_latency**: 平均延迟最高的 rank + - **rank_latency_by_op**: 是 all_reduce 还是 broadcast 拖慢 + - **step_straggler**: 哪些 step 上 lag 最大 + + next_steps: + - "某 rank 持续最慢 → 检查该节点 GPU/网络/数据: skill: gpu_pressure" + - "栈卡在 collective → skill: training_hang" + - "模块级热点 → skill: module_bottleneck (在慢 rank 上 inject)" + - "有 nccl.proxy_ops → skill: nccl_culprit_victim (culprit/victim 归因)" diff --git a/skills/training_hang/SKILL.md b/skills/training_hang/SKILL.md new file mode 100644 index 00000000..6b8d27cf --- /dev/null +++ b/skills/training_hang/SKILL.md @@ -0,0 +1,28 @@ +--- +name: training_hang +description: > + Training stalled — capture stacks and thread/blocking hints +category: reliability +tables: [python.backtrace, cpu.utilization, python.trace_event, python.comm_collective] +tags: [hang, stall, deadlock, 卡住, 不动] +keywords: + en: ['hang', 'stuck', 'stall', 'frozen', 'deadlock', 'not progressing'] + zh: ['卡住', 'hang', '不动', '停住', 'deadlock', '死锁', 'loss 不更新'] +parameters: + stack_depth: { type: integer, default: 20 } +--- + +# Training hang diagnosis + +Loss 不更新、进程仍存活但无进展时使用。 +组合:实时混合栈 + CPU 线程 wchan + 最近 trace 活动。 + +## Parameters + +- `stack_depth` (integer, default `20`): Backtrace frames to show + +## Related skills + +- 栈在 dist/barrier → 检查各 rank 是否都存活: probing list / cluster nodes +- 栈在 DataLoader → 减少 num_workers 或检查数据路径 +- 需要持续采样 → SET probing.pprof.sample_freq=99 后 skill: module_bottleneck diff --git a/skills/training_hang/steps.yaml b/skills/training_hang/steps.yaml new file mode 100644 index 00000000..b9f8fa78 --- /dev/null +++ b/skills/training_hang/steps.yaml @@ -0,0 +1,114 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: training_hang + title: "训练卡住 / Hang 诊断" + title_en: "Training hang diagnosis" + category: reliability + tags: [hang, stall, deadlock, 卡住, 不动] + triggers: + keywords: + zh: ["卡住", "hang", "不动", "停住", "deadlock", "死锁", "loss 不更新"] + en: ["hang", "stuck", "stall", "frozen", "deadlock", "not progressing"] + docs: | + Loss 不更新、进程仍存活但无进展时使用。 + 组合:实时混合栈 + CPU 线程 wchan + 最近 trace 活动。 + +spec: + parameters: + - name: stack_depth + type: integer + default: 20 + description: "Backtrace frames to show" + + steps: + - id: backtrace + title: "当前混合调用栈 (Python + native)" + type: api + method: GET + path: /apis/pythonext/callstack + on_empty: warn + empty_message: "无法获取栈 — 目标进程可能不是 Python 或 tracer 未启用" + + - id: backtrace_sql + title: "调用栈 (SQL 视图)" + type: sql + sql: | + SELECT depth, frame_type, func, file, lineno + FROM python.backtrace + ORDER BY depth + LIMIT {stack_depth} + on_empty: skip + + - id: blocking_threads + title: "阻塞中的线程 (wchan)" + type: sql + sql: | + SELECT tid, comm, state, wchan, cpu_total_pct + FROM cpu.utilization + WHERE scope = 'thread' + AND state NOT IN ('R', 'S') + ORDER BY ts DESC + LIMIT 10 + on_empty: skip + empty_message: "无线程 wchan 数据 (macOS 上 wchan 可能为空)" + + - id: top_wchan + title: "最常见内核等待点 (最近窗口)" + type: sql + sql: | + SELECT wchan, count(*) AS samples, max(comm) AS example_comm + FROM cpu.utilization + WHERE scope = 'thread' AND wchan != '' + GROUP BY wchan + ORDER BY samples DESC + LIMIT 8 + on_empty: skip + + - id: last_trace_activity + title: "最近一次 trace 活动时间" + type: sql + sql: | + SELECT max(time) AS last_event_ns, count(*) AS events_last_100 + FROM ( + SELECT time FROM python.trace_event + ORDER BY time DESC + LIMIT 100 + ) + on_empty: skip + empty_message: "无 trace_event — tracing 可能未启用" + + - id: last_collective + title: "最近一次 collective 通信" + type: sql + sql: | + SELECT op, rank, global_step, duration_ms, bytes + FROM python.comm_collective + ORDER BY global_step DESC, duration_ms DESC + LIMIT 5 + on_empty: skip + empty_message: "无 comm_collective — 非分布式或未 patch torch.distributed" + + interpretation: + rules: + - id: nccl_wait + when: "step:top_wchan | column:wchan | any_contains('nccl','cuda','poll')" + severity: warning + message: "线程可能在等待 NCCL/CUDA — 常见于 collective 死锁或 straggler" + + - id: dataloader_wait + when: "step:backtrace_sql | column:func | any_contains('DataLoader','_next','fetch')" + severity: info + message: "栈顶指向 DataLoader — 检查 num_workers / 数据管道" + + summary_template: | + ## Hang 诊断 + 1. 查看 **backtrace** / **backtrace_sql** 最内层 frame + 2. **top_wchan** 提示内核级等待原因 + 3. **last_collective** 若停在 collective 上 → 试 skill: slow_rank + + next_steps: + - "栈在 dist/barrier → 检查各 rank 是否都存活: probing list / cluster nodes" + - "栈在 DataLoader → 减少 num_workers 或检查数据路径" + - "需要持续采样 → SET probing.pprof.sample_freq=99 后 skill: module_bottleneck" diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 00000000..6de90a21 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,42 @@ +# Probing test layout + +Two layers: **unit** (mirrors `python/probing/`) and **regression** (integration, contract, E2E). + +```text +tests/ +├── conftest.py # shared: sys.path, faulthandler +├── unit/ +│ ├── conftest.py # PROBING=0, no engine +│ └── probing/ # mirrors python/probing/ +│ ├── skills/ # loader, interpret +│ ├── handlers/ # router, pythonext handlers +│ ├── hooks/ # import_hook +│ └── test_dev_pth.py +└── regression/ + ├── conftest.py # PROBING=1, engine wait, collective reset + ├── spec/ # api_spec.json + contract tests + ├── core/ ext/ repl/ tbls/ inspect/ profiling/ + ├── training_observability/ + ├── skills/ nccl/ + └── rust/ # probing-rust-regression crate +``` + +## Rust + +| Kind | Location | Run | +|------|----------|-----| +| **Unit** | `#[cfg(test)]` in `probing/**/src/` | `make test-rust-unit` | +| **Regression** | `tests/regression/rust/probing/**` | `make test-rust-regression` | + +## Python + +| Kind | Location | Run | +|------|----------|-----| +| **Unit** | `tests/unit/probing/...` | `make test-python-unit` | +| **Regression** | `tests/regression/...` | `make test-python-regression` | + +Test data factories: `python/probing/testing/` (not a test directory). + +## Markers + +- `unit` / `regression` / `integration` / `slow` — see `pyproject.toml` diff --git a/tests/conftest.py b/tests/conftest.py index 572eed2d..ba75a18e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ -"""Shared pytest fixtures for the full test suite.""" +"""Shared pytest fixtures for all Python tests.""" from __future__ import annotations @@ -7,15 +7,20 @@ import os import sys import threading -import time import traceback - -import pytest +from pathlib import Path # Capture Rust/Python crash output as early as possible (before probing loads). os.environ.setdefault("RUST_BACKTRACE", "1") os.environ.setdefault("PROBING_RUST_BACKTRACE", "1") +# Fallback when tests run without ``make develop`` (no venv .pth files). +_repo_python = Path(__file__).resolve().parents[1] / "python" +if _repo_python.is_dir(): + _repo_python_str = str(_repo_python) + if _repo_python_str not in sys.path: + sys.path.insert(0, _repo_python_str) + def _enable_faulthandler() -> None: """Enable faulthandler even when pytest wraps sys.stderr without fileno.""" @@ -53,42 +58,3 @@ def _thread_excepthook(args: threading.ExceptHookArgs) -> None: if hasattr(threading, "excepthook"): threading.excepthook = _thread_excepthook - -_COLLECTIVE_CONFIG_KEYS: tuple[str, ...] = ( - "probing.torch.collective.enable", - "probing.torch.collective.mode", - "probing.torch.collective.trace_event", - "probing.torch.collective.verbose", - "probing.torch.collective.sync", - "probing.torch.collective.trace_file", - "probing.torch.collective.resolve_ranks", -) - - -@pytest.fixture(scope="session", autouse=True) -def _wait_for_probing_engine(): - """Brief pause so the in-process probing server can finish starting.""" - enabled = os.environ.get("PROBING_ORIGINAL") or os.environ.get("PROBING") - if enabled and str(enabled).lower() not in ("0", "false", "no", ""): - time.sleep(1.0) - yield - - -@pytest.fixture(autouse=True) -def _reset_collective_config(monkeypatch): - """Reset collective-related config and rank env between tests.""" - import probing - - monkeypatch.delenv("WORLD_SIZE", raising=False) - monkeypatch.delenv("RANK", raising=False) - for key in _COLLECTIVE_CONFIG_KEYS: - try: - probing.config.remove(key) - except Exception: - pass - yield - for key in _COLLECTIVE_CONFIG_KEYS: - try: - probing.config.remove(key) - except Exception: - pass diff --git a/tests/regression/conftest.py b/tests/regression/conftest.py new file mode 100644 index 00000000..fcf0068a --- /dev/null +++ b/tests/regression/conftest.py @@ -0,0 +1,57 @@ +"""Fixtures for regression / integration Python tests (needs ``probing._core``).""" + +from __future__ import annotations + +import os +import time + +import pytest + +os.environ.setdefault("PROBING", "1") + + +@pytest.fixture(scope="session", autouse=True) +def _wait_for_probing_engine(): + """Brief pause so the in-process probing server can finish starting.""" + enabled = os.environ.get("PROBING_ORIGINAL") or os.environ.get("PROBING") + if enabled and str(enabled).lower() not in ("0", "false", "no", ""): + time.sleep(1.0) + yield + + +_COLLECTIVE_CONFIG_KEYS: tuple[str, ...] = ( + "probing.torch.collective.enable", + "probing.torch.collective.mode", + "probing.torch.collective.trace_event", + "probing.torch.collective.verbose", + "probing.torch.collective.sync", + "probing.torch.collective.trace_file", + "probing.torch.collective.resolve_ranks", +) + + +@pytest.fixture(autouse=True) +def _reset_collective_config(monkeypatch): + """Reset collective-related config and rank env between tests.""" + import probing + + monkeypatch.delenv("WORLD_SIZE", raising=False) + monkeypatch.delenv("RANK", raising=False) + for key in _COLLECTIVE_CONFIG_KEYS: + try: + probing.config.remove(key) + except Exception: + pass + yield + for key in _COLLECTIVE_CONFIG_KEYS: + try: + probing.config.remove(key) + except Exception: + pass + + +def pytest_collection_modifyitems(items: list[pytest.Item]) -> None: + for item in items: + path = str(item.fspath) + if "tests/regression/" in path and "/rust/" not in path: + item.add_marker(pytest.mark.regression) diff --git a/tests/core/test_config.py b/tests/regression/core/test_config.py similarity index 100% rename from tests/core/test_config.py rename to tests/regression/core/test_config.py diff --git a/tests/core/test_engine.py b/tests/regression/core/test_engine.py similarity index 100% rename from tests/core/test_engine.py rename to tests/regression/core/test_engine.py diff --git a/tests/core/test_global_federation.py b/tests/regression/core/test_global_federation.py similarity index 100% rename from tests/core/test_global_federation.py rename to tests/regression/core/test_global_federation.py diff --git a/tests/core/test_init.py b/tests/regression/core/test_init.py similarity index 100% rename from tests/core/test_init.py rename to tests/regression/core/test_init.py diff --git a/tests/core/test_torchrun_cluster.py b/tests/regression/core/test_torchrun_cluster.py similarity index 100% rename from tests/core/test_torchrun_cluster.py rename to tests/regression/core/test_torchrun_cluster.py diff --git a/tests/ext/__init__.py b/tests/regression/ext/__init__.py similarity index 100% rename from tests/ext/__init__.py rename to tests/regression/ext/__init__.py diff --git a/tests/ext/test_collective_autostart.py b/tests/regression/ext/test_collective_autostart.py similarity index 100% rename from tests/ext/test_collective_autostart.py rename to tests/regression/ext/test_collective_autostart.py diff --git a/tests/ext/test_comm_collective.py b/tests/regression/ext/test_comm_collective.py similarity index 100% rename from tests/ext/test_comm_collective.py rename to tests/regression/ext/test_comm_collective.py diff --git a/tests/ext/test_parallel_topology.py b/tests/regression/ext/test_parallel_topology.py similarity index 100% rename from tests/ext/test_parallel_topology.py rename to tests/regression/ext/test_parallel_topology.py diff --git a/tests/ext/test_python_ext.py b/tests/regression/ext/test_python_ext.py similarity index 100% rename from tests/ext/test_python_ext.py rename to tests/regression/ext/test_python_ext.py diff --git a/tests/ext/test_python_tracer.py b/tests/regression/ext/test_python_tracer.py similarity index 100% rename from tests/ext/test_python_tracer.py rename to tests/regression/ext/test_python_tracer.py diff --git a/tests/ext/test_step_context.py b/tests/regression/ext/test_step_context.py similarity index 100% rename from tests/ext/test_step_context.py rename to tests/regression/ext/test_step_context.py diff --git a/tests/ext/test_tracing_span.py b/tests/regression/ext/test_tracing_span.py similarity index 100% rename from tests/ext/test_tracing_span.py rename to tests/regression/ext/test_tracing_span.py diff --git a/tests/inspect/test_trace_helpers.py b/tests/regression/inspect/test_trace_helpers.py similarity index 100% rename from tests/inspect/test_trace_helpers.py rename to tests/regression/inspect/test_trace_helpers.py diff --git a/tests/regression/nccl/test_nccl_mock.py b/tests/regression/nccl/test_nccl_mock.py new file mode 100644 index 00000000..44859138 --- /dev/null +++ b/tests/regression/nccl/test_nccl_mock.py @@ -0,0 +1,127 @@ +"""NCCL mock tables: seed data and SQL visibility on macOS / dev.""" + +from __future__ import annotations + +import os +import sys + +import pytest + +pytestmark = pytest.mark.skipif( + os.environ.get("PROBING") not in ("1", "2", "followed", "nested"), + reason="needs in-process probing engine (PROBING=1)", +) + + +@pytest.fixture(autouse=True) +def _enable_nccl_mock(monkeypatch): + monkeypatch.setenv("PROBING_NCCL_MOCK", "1") + + +def _proxy_ops_sql_name() -> str: + """Return SQL table name for mock proxy ops (post-``make develop`` → ``nccl.proxy_ops``).""" + from probing import query + + for name in ("nccl.proxy_ops", "python.nccl.proxy_ops"): + try: + df = query(f"SELECT * FROM {name} LIMIT 1") + if len(df.columns) > 0: + return name + except Exception: + continue + pytest.skip( + "nccl proxy_ops not in SQL catalog — run `make develop` to rebuild probing-python" + ) + + +@pytest.fixture +def proxy_ops_table(): + from probing.nccl.mock import seed_mock + + seed_mock(ranks=8, ops_per_rank=3) + return _proxy_ops_sql_name() + + +def test_seed_mock_writes_tables(proxy_ops_table): + from probing.nccl.mock import PROXY_OPS_TABLE, seed_mock + from probing import query + + counts = seed_mock(ranks=4, ops_per_rank=2) + assert counts[PROXY_OPS_TABLE] > 0 + + tables = query("SHOW TABLES")["table_name"].tolist() + assert "proxy_ops" in tables + assert "net_qp" in tables + assert len(query(f"SELECT * FROM {proxy_ops_table}")) > 0 + + +def test_mock_culprit_victim_pattern(proxy_ops_table): + from probing.nccl.mock import _CULPRIT_RANK, _VICTIM_RANK + from probing import query + + culprit = query( + f""" + SELECT sum(send_gpu_wait_ns) AS gpu_wait + FROM {proxy_ops_table} + WHERE rank = {_CULPRIT_RANK} + """ + )["gpu_wait"].iloc[0] + + victim = query( + f""" + SELECT sum(recv_wait_ns) AS recv_wait + FROM {proxy_ops_table} + WHERE rank = {_VICTIM_RANK} + """ + )["recv_wait"].iloc[0] + + assert culprit > 0 + assert victim > 0 + + top_culprit = query( + f""" + SELECT rank, sum(send_gpu_wait_ns) AS gpu_wait + FROM {proxy_ops_table} + GROUP BY rank + ORDER BY gpu_wait DESC + LIMIT 1 + """ + ) + top_victim = query( + f""" + SELECT rank, sum(recv_wait_ns) AS recv_wait + FROM {proxy_ops_table} + GROUP BY rank + ORDER BY recv_wait DESC + LIMIT 1 + """ + ) + assert top_culprit["rank"].iloc[0] == _CULPRIT_RANK + assert top_victim["rank"].iloc[0] == _VICTIM_RANK + + +def test_maybe_auto_seed_idempotent(): + from probing.nccl import mock as nccl_mock + from probing import query + + table = _proxy_ops_sql_name() + nccl_mock._seeded = False + assert nccl_mock.maybe_auto_seed() is True + n1 = len(query(f"SELECT * FROM {table}")) + assert nccl_mock.maybe_auto_seed() is False + n2 = len(query(f"SELECT * FROM {table}")) + assert n1 == n2 + + +@pytest.mark.skipif(sys.platform != "darwin", reason="darwin default auto-mock") +def test_darwin_auto_mock_default(monkeypatch): + from probing.nccl import mock as nccl_mock + + monkeypatch.delenv("PROBING_NCCL_MOCK", raising=False) + assert nccl_mock._mock_env_enabled() is True + + +def test_cli_seed_mock(): + from probing.nccl.__main__ import main + + assert main(["--seed-mock", "--ranks", "2", "--ops", "1"]) == 0 diff --git a/tests/regression/nccl/test_nccl_plugin_path.py b/tests/regression/nccl/test_nccl_plugin_path.py new file mode 100644 index 00000000..b5631127 --- /dev/null +++ b/tests/regression/nccl/test_nccl_plugin_path.py @@ -0,0 +1,65 @@ +"""Tests for probing.nccl plugin path helpers.""" + +from __future__ import annotations + +import os +import sys +from pathlib import Path +from unittest import mock + +import pytest + +from probing.nccl import DEFAULT_EVENT_MASK, plugin_path +from probing.nccl.__main__ import main + + +def test_default_event_mask(): + assert DEFAULT_EVENT_MASK == 26 + + +def test_plugin_path_env_override(tmp_path): + lib = tmp_path / "custom.so" + lib.write_bytes(b"\x00") + with mock.patch.dict(os.environ, {"PROBING_NCCL_PROFILER": str(lib)}): + assert plugin_path() == str(lib.resolve()) + + +def test_plugin_path_env_override_missing(tmp_path): + missing = tmp_path / "nope.so" + with mock.patch.dict(os.environ, {"PROBING_NCCL_PROFILER": str(missing)}): + with pytest.raises(FileNotFoundError): + plugin_path() + + +@pytest.mark.skipif(sys.platform != "linux", reason="bundled .so is Linux-only") +def test_plugin_path_finds_bundled_or_build(): + # In CI/dev after `make nccl-profiler-lib`, one of the candidates should exist. + try: + path = plugin_path() + except FileNotFoundError: + pytest.skip("nccl profiler .so not built") + assert path.endswith("libprobing_nccl_profiler.so") + assert Path(path).is_file() + + +def test_cli_plugin_path_env_override(tmp_path, capsys): + lib = tmp_path / "custom.so" + lib.write_bytes(b"\x00") + with mock.patch.dict(os.environ, {"PROBING_NCCL_PROFILER": str(lib)}): + assert main(["--plugin-path"]) == 0 + assert capsys.readouterr().out.strip() == str(lib.resolve()) + + +def test_cli_help_exits_2(capsys): + assert main([]) == 2 + assert "plugin-path" in capsys.readouterr().err + + +def test_cli_event_mask(capsys): + assert main(["--event-mask"]) == 0 + assert capsys.readouterr().out.strip() == "26" + + +def test_cli_help_lists_seed_mock(capsys): + assert main([]) == 2 + assert "--seed-mock" in capsys.readouterr().err diff --git a/tests/regression/nccl/test_nccl_skill.py b/tests/regression/nccl/test_nccl_skill.py new file mode 100644 index 00000000..fbea6302 --- /dev/null +++ b/tests/regression/nccl/test_nccl_skill.py @@ -0,0 +1,114 @@ +"""NCCL culprit/victim skill: loader expansion + mock SQL integration.""" + +from __future__ import annotations + +import os + +import pytest + +pytest.importorskip("yaml") + +pytestmark = pytest.mark.skipif( + os.environ.get("PROBING") not in ("1", "2", "followed", "nested"), + reason="needs in-process probing engine (PROBING=1)", +) + + +@pytest.fixture(autouse=True) +def _enable_nccl_mock(monkeypatch): + monkeypatch.setenv("PROBING_NCCL_MOCK", "1") + + +def _require_nccl_proxy_table(): + from probing.nccl.mock import seed_mock + from probing import query + + seed_mock(ranks=8, ops_per_rank=3) + for name in ("nccl.proxy_ops", "python.nccl.proxy_ops"): + try: + df = query(f"SELECT * FROM {name} LIMIT 1") + if len(df.columns) > 0: + return name + except Exception: + continue + pytest.skip("nccl.proxy_ops not in SQL catalog — run `make develop`") + + +def test_catalog_includes_nccl_skill(): + from probing.skills.loader import load_catalog + + catalog = load_catalog() + ids = {p.id for p in catalog.skills} + assert "nccl_culprit_victim" in ids + + +def test_expand_nccl_skill_global(): + from probing.skills.loader import expand_skill, load_skill + + skill = load_skill("nccl_culprit_victim") + steps = expand_skill(skill, {"use_global": True, "seq_window": 5}) + sql = " ".join(s.sql or "" for s in steps if s.sql) + assert "global.nccl.proxy_ops" in sql + assert "send_gpu_wait_ns" in sql + assert "recv_wait_ns" in sql + + +def test_match_skills_nccl_keywords(): + from probing.skills.loader import match_skills + + matched = match_skills("NCCL culprit recv_wait 受害者") + assert "nccl_culprit_victim" in matched + + +def test_skill_sql_on_mock_data(): + from probing.nccl.mock import _CULPRIT_RANK, _VICTIM_RANK + from probing import query + from probing.skills.interpret import evaluate_rules, evidence_from_dataframe + from probing.skills.loader import expand_skill, load_skill + + table = _require_nccl_proxy_table() + + skill = load_skill("nccl_culprit_victim") + steps = expand_skill(skill, {"use_global": False, "seq_window": 10}) + + rank_step = next(s for s in steps if s.id == "rank_wait_summary") + sql = ( + rank_step.sql.replace("nccl.proxy_ops", table) + if table != "nccl.proxy_ops" + else rank_step.sql + ) + df = query(sql) + assert len(df) >= 2 + assert "total_gpu_wait_ns" in df.columns + assert "total_recv_wait_ns" in df.columns + + culprit_df = query( + f""" + SELECT rank, sum(send_gpu_wait_ns) AS culprit_wait_ns + FROM {table} + GROUP BY rank + ORDER BY culprit_wait_ns DESC + LIMIT 1 + """ + ) + victim_df = query( + f""" + SELECT rank, sum(recv_wait_ns) AS victim_wait_ns + FROM {table} + GROUP BY rank + ORDER BY victim_wait_ns DESC + LIMIT 1 + """ + ) + assert culprit_df["rank"].iloc[0] == _CULPRIT_RANK + assert victim_df["rank"].iloc[0] == _VICTIM_RANK + + rules = skill.interpretation.get("rules") or [] + evidence = [ + evidence_from_dataframe( + "rank_wait_summary", + df[["total_gpu_wait_ns", "total_recv_wait_ns"]].to_dict("list"), + ) + ] + fired = evaluate_rules(rules, evidence) + assert any(r.rule_id in ("culprit_dominates", "victim_dominates") for r in fired) diff --git a/tests/profiling/test_torch_probe_sampling.py b/tests/regression/profiling/test_torch_probe_sampling.py similarity index 79% rename from tests/profiling/test_torch_probe_sampling.py rename to tests/regression/profiling/test_torch_probe_sampling.py index db504d63..892f092c 100644 --- a/tests/profiling/test_torch_probe_sampling.py +++ b/tests/regression/profiling/test_torch_probe_sampling.py @@ -1,19 +1,16 @@ """TorchProbe sampling: anchor pre/post pairing and step cleanup.""" from probing.profiling.torch_probe import TorchProbe, TorchProbeConfig -import probing.profiling.types as profiling_types -def _reset_hook_offset() -> None: - profiling_types.MODULE_CALL_OFFSET = 0 - profiling_types.CURRENT_MODULE = None - profiling_types.CURRENT_STAGE = None +def _reset_hook_offset(tracer: TorchProbe) -> None: + tracer._module_call_offset = 0 + tracer._current_module = None + tracer._current_stage = None -def _bump_hook_offset(mod, stage: str) -> None: - profiling_types.MODULE_CALL_OFFSET += 1 - profiling_types.CURRENT_MODULE = id(mod) - profiling_types.CURRENT_STAGE = stage +def _bump_hook_offset(tracer: TorchProbe, mod, stage: str) -> None: + tracer.process_hook(mod, stage) class _FakeMod: @@ -40,13 +37,13 @@ def _ready_tracer(curr_mod=None): def test_anchor_pre_always_pairs_post_when_curr_mod_differs(): tracer, root, other = _ready_tracer() tracer.curr_mod = id(other) - _reset_hook_offset() + _reset_hook_offset(tracer) tracer.log_module_stage("pre forward", root) assert (id(root), "forward") in tracer._open_spans assert len(tracer.pending) == 1 - _bump_hook_offset(root, "pre forward") + _bump_hook_offset(tracer, root, "pre forward") tracer.log_module_stage("post forward", root) assert (id(root), "forward") not in tracer._open_spans assert len(tracer.pending) == 2 @@ -58,7 +55,7 @@ def test_anchor_pre_always_pairs_post_when_curr_mod_differs(): def test_finish_open_stages_closes_orphan_pre(): tracer, root, _ = _ready_tracer() - _reset_hook_offset() + _reset_hook_offset(tracer) tracer.log_module_stage("pre forward", root) assert tracer._open_spans @@ -70,7 +67,7 @@ def test_finish_open_stages_closes_orphan_pre(): def test_cleanup_step_resources_clears_timers(): tracer, root, _ = _ready_tracer() - _reset_hook_offset() + _reset_hook_offset(tracer) key = (id(root), "forward") tracer.cpu_start[key] = 1.0 @@ -85,11 +82,11 @@ def test_cleanup_step_resources_clears_timers(): def test_should_sample_anchor_only_on_pre_at_offset_zero(): tracer, root, other = _ready_tracer() tracer.curr_mod = id(other) - _reset_hook_offset() + _reset_hook_offset(tracer) assert tracer.should_sample(root, "pre forward") assert not tracer.should_sample(root, "post forward") - _bump_hook_offset(root, "pre forward") + _bump_hook_offset(tracer, root, "pre forward") assert not tracer.should_sample(root, "pre forward") assert tracer.should_sample(other, "pre forward") diff --git a/tests/repl/__init__.py b/tests/regression/repl/__init__.py similarity index 100% rename from tests/repl/__init__.py rename to tests/regression/repl/__init__.py diff --git a/tests/repl/test_help_magic.py b/tests/regression/repl/test_help_magic.py similarity index 96% rename from tests/repl/test_help_magic.py rename to tests/regression/repl/test_help_magic.py index 6203c1cd..346c7877 100644 --- a/tests/repl/test_help_magic.py +++ b/tests/regression/repl/test_help_magic.py @@ -3,10 +3,12 @@ import os import sys -# Add python/ to path explicitly -sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "python")) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "..", "python")) import pytest + +pytest.importorskip("ipykernel") + from probing.repl import CodeExecutor diff --git a/tests/repl/test_query_magic.py b/tests/regression/repl/test_query_magic.py similarity index 96% rename from tests/repl/test_query_magic.py rename to tests/regression/repl/test_query_magic.py index 301908a1..1129dff6 100644 --- a/tests/repl/test_query_magic.py +++ b/tests/regression/repl/test_query_magic.py @@ -7,8 +7,10 @@ import pandas as pd import pytest +pytest.importorskip("IPython") + # Add python directory to path -python_dir = os.path.join(os.path.dirname(__file__), "../../python") +python_dir = os.path.join(os.path.dirname(__file__), "..", "..", "..", "python") if python_dir not in sys.path: sys.path.insert(0, python_dir) diff --git a/tests/regression/rust/Cargo.toml b/tests/regression/rust/Cargo.toml new file mode 100644 index 00000000..48c8201f --- /dev/null +++ b/tests/regression/rust/Cargo.toml @@ -0,0 +1,82 @@ +[package] +name = "probing-rust-regression" +version = "0.0.0" +edition = "2021" +publish = false +description = "Rust regression / integration tests (mirrors probing crate layout)" + + +[lib] +path = "src/lib.rs" + +[build-dependencies] +pyo3-build-config = "0.29.0" + +[dependencies] +probing-core = { path = "../../../probing/core" } +probing-server = { path = "../../../probing/server", default-features = false } +probing-memtable = { path = "../../../probing/memtable" } +probing-cli = { path = "../../../probing/cli" } +probing-python = { path = "../../../probing/extensions/python", default-features = false } +probing-proto = { path = "../../../probing/proto" } + +anyhow = { workspace = true } +arrow = { workspace = true } +async-trait = "0.1.83" +axum = { version = "0.8.1", default-features = false, features = [ + "tokio", + "http1", + "query", + "json", +] } +base64 = "0.21.5" +datafusion = { workspace = true } +futures = "0.3.31" +pyo3 = { version = "0.29.0", default-features = false, features = [ + "auto-initialize", + "macros", +] } +serde = { workspace = true } +serde_json = { workspace = true } +tempfile = "3.8" +tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } + +[[test]] +name = "core_federation" +path = "probing/core/federation_tests.rs" + +[[test]] +name = "core_engine_complex" +path = "probing/core/engine_complex_tests.rs" + +[[test]] +name = "core_extension_routing_spec" +path = "probing/core/extension_routing_spec.rs" + +[[test]] +name = "core_distributed_storage" +path = "probing/core/distributed_storage_integration.rs" + +[[test]] +name = "server_training_observability" +path = "probing/server/training_observability_tests.rs" + +[[test]] +name = "server_auth_complex" +path = "probing/server/auth_complex_tests.rs" + +[[test]] +name = "server_file_api_complex" +path = "probing/server/file_api_complex_tests.rs" + +[[test]] +name = "memtable_chaos_stress" +path = "probing/memtable/chaos_stress.rs" + +[[test]] +name = "cli_inject_aarch64" +path = "probing/cli/inject_aarch64.rs" + +[[test]] +name = "python_py_to_table" +path = "probing/python/py_to_table.rs" diff --git a/tests/regression/rust/build.rs b/tests/regression/rust/build.rs new file mode 100644 index 00000000..d0cd1bbf --- /dev/null +++ b/tests/regression/rust/build.rs @@ -0,0 +1,12 @@ +fn main() { + pyo3_build_config::use_pyo3_cfgs(); + pyo3_build_config::add_libpython_rpath_link_args(); + + let target = std::env::var("TARGET").unwrap_or_default(); + if target.contains("apple-darwin") { + let config = pyo3_build_config::get(); + let lib_name = config.lib_name(); + let lib = lib_name.unwrap_or("python3.12"); + println!("cargo:rustc-link-lib=dylib={lib}"); + } +} diff --git a/tests/regression/rust/probing/cli/inject_aarch64.rs b/tests/regression/rust/probing/cli/inject_aarch64.rs new file mode 100644 index 00000000..e8b252a3 --- /dev/null +++ b/tests/regression/rust/probing/cli/inject_aarch64.rs @@ -0,0 +1,47 @@ +//! Regression: aarch64 ptrace inject against a live process (Linux + aarch64 only). +//! +//! Unit tests for shellcode layout and register handling live in +//! `src/inject/injection_aarch64.rs`. + +#[cfg(all(target_arch = "aarch64", target_os = "linux"))] +use probing_cli::inject::{Injector, Process}; +#[cfg(all(target_arch = "aarch64", target_os = "linux"))] +use std::process::Command; +#[cfg(all(target_arch = "aarch64", target_os = "linux"))] +use std::thread; +#[cfg(all(target_arch = "aarch64", target_os = "linux"))] +use std::time::Duration; + +#[cfg(all(target_arch = "aarch64", target_os = "linux"))] +#[test] +fn injection_basic_fails_on_missing_library() { + let mut target = Command::new("sleep") + .arg("10") + .spawn() + .expect("Failed to spawn target process"); + + let target_pid = target.id(); + thread::sleep(Duration::from_millis(100)); + + let proc = Process::by_pid(target_pid as i32).expect("Failed to find target process"); + let dummy_lib = std::path::Path::new("/tmp/dummy.so"); + + let result = Injector::attach(proc).and_then(|mut injector| injector.inject(dummy_lib, vec![])); + + let _ = target.kill(); + + match result { + Ok(_) => panic!("Expected injection to fail due to missing library"), + Err(e) => { + let error_msg = e.to_string(); + assert!( + error_msg.contains("No such file") || error_msg.contains("dlopen"), + "unexpected error: {error_msg}" + ); + } + } +} + +#[cfg(not(all(target_arch = "aarch64", target_os = "linux")))] +#[test] +fn injection_skipped_on_non_aarch64_linux() {} diff --git a/probing/core/tests/distributed_storage_integration.rs b/tests/regression/rust/probing/core/distributed_storage_integration.rs similarity index 100% rename from probing/core/tests/distributed_storage_integration.rs rename to tests/regression/rust/probing/core/distributed_storage_integration.rs diff --git a/probing/core/tests/engine_complex_tests.rs b/tests/regression/rust/probing/core/engine_complex_tests.rs similarity index 99% rename from probing/core/tests/engine_complex_tests.rs rename to tests/regression/rust/probing/core/engine_complex_tests.rs index d94da999..68386254 100644 --- a/probing/core/tests/engine_complex_tests.rs +++ b/tests/regression/rust/probing/core/engine_complex_tests.rs @@ -11,11 +11,9 @@ use datafusion::execution::context::SessionState; use datafusion::logical_expr::{Expr, TableType}; use datafusion::physical_plan::ExecutionPlan; use probing_core::core::{Engine, ProbeDataSource, ProbeDataSourceKind}; +use probing_rust_regression::test_helpers::GenericTableProbeDataSource; use std::sync::Arc; -mod test_helpers; -use test_helpers::GenericTableProbeDataSource; - // ========== JOIN查询测试 ========== #[derive(Debug, Clone)] diff --git a/probing/core/tests/extension_routing_spec.rs b/tests/regression/rust/probing/core/extension_routing_spec.rs similarity index 95% rename from probing/core/tests/extension_routing_spec.rs rename to tests/regression/rust/probing/core/extension_routing_spec.rs index 80877fac..f1626d77 100644 --- a/probing/core/tests/extension_routing_spec.rs +++ b/tests/regression/rust/probing/core/extension_routing_spec.rs @@ -28,8 +28,7 @@ impl ProbeExtension for PythonextStub { } fn load_spec() -> serde_json::Value { - let path = - std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../tests/spec/api_spec.json"); + let path = probing_rust_regression::api_spec_path(); let text = std::fs::read_to_string(path).expect("read api_spec.json"); serde_json::from_str(&text).expect("parse api_spec.json") } diff --git a/probing/core/tests/federation_tests.rs b/tests/regression/rust/probing/core/federation_tests.rs similarity index 83% rename from probing/core/tests/federation_tests.rs rename to tests/regression/rust/probing/core/federation_tests.rs index 552ee918..dab0f659 100644 --- a/probing/core/tests/federation_tests.rs +++ b/tests/regression/rust/probing/core/federation_tests.rs @@ -1,16 +1,14 @@ //! Regression tests for the `global` federated catalog path: //! probe catalog (local) vs global catalog (fan-out + `_addr` / `_rank` tagging). -mod test_helpers; - use std::sync::Arc; use probing_core::core::federation::{ - GLOBAL_CATALOG, PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_RANK_COL, + GLOBAL_CATALOG, PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_RANK_COL, PROBE_ROLE_COL, }; use probing_core::core::{Engine, ProbeDataSource}; use probing_proto::prelude::Seq; -use test_helpers::GenericTableProbeDataSource; +use probing_rust_regression::test_helpers::GenericTableProbeDataSource; fn df_col_i32(df: &probing_proto::prelude::DataFrame, name: &str) -> Vec { let idx = df @@ -181,6 +179,68 @@ async fn global_select_name_returns_only_name() { assert_eq!(df.names, vec!["name".to_string()]); } +#[tokio::test] +async fn global_empty_table_with_timestamp_explicit_select_preserves_schema() { + use arrow::array::{StringArray, TimestampMicrosecondArray}; + use arrow::datatypes::{DataType, Field, Schema, TimeUnit}; + use arrow::record_batch::RecordBatch; + + std::env::set_var("PROBING_ADDRESS", "127.0.0.1:19999"); + std::env::set_var("HOSTNAME", "federation-test-host"); + + let schema = Arc::new(Schema::new(vec![ + Field::new("host", DataType::Utf8, false), + Field::new( + "timestamp", + DataType::Timestamp(TimeUnit::Microsecond, None), + false, + ), + ])); + let batch = RecordBatch::try_new( + schema.clone(), + vec![ + Arc::new(StringArray::from(Vec::<&str>::new())), + Arc::new(TimestampMicrosecondArray::from(Vec::::new())), + ], + ) + .unwrap(); + let nodes = GenericTableProbeDataSource::new("nodes", "cluster", schema, vec![batch]); + let engine = Engine::builder() + .with_data_source(Arc::new(nodes) as Arc) + .build() + .await + .expect("engine build"); + + let df = engine + .async_query("SELECT host FROM global.cluster.nodes LIMIT 5") + .await + .expect("query should not error") + .expect("empty global explicit select should return schema, not None"); + assert_eq!(df.names, vec!["host".to_string()]); + assert_eq!(df.len(), 0); +} + +#[tokio::test] +async fn global_empty_table_explicit_select_preserves_schema() { + std::env::set_var("PROBING_ADDRESS", "127.0.0.1:19999"); + std::env::set_var("HOSTNAME", "federation-test-host"); + + let empty = GenericTableProbeDataSource::empty_table("nodes", "cluster"); + let engine = Engine::builder() + .with_data_source(Arc::new(empty) as Arc) + .build() + .await + .expect("engine build"); + + let df = engine + .async_query("SELECT id FROM global.cluster.nodes") + .await + .expect("query should not error") + .expect("empty global explicit select should return schema, not None"); + assert_eq!(df.names, vec!["id".to_string()]); + assert_eq!(df.len(), 0); +} + #[tokio::test] async fn global_select_star_includes_probe_addr_and_rank() { use arrow::array::StringArray; @@ -222,6 +282,7 @@ async fn global_select_star_includes_probe_addr_and_rank() { PROBE_HOST_COL.to_string(), PROBE_ADDR_COL.to_string(), PROBE_RANK_COL.to_string(), + PROBE_ROLE_COL.to_string(), ] ); } diff --git a/probing/memtable/tests/chaos_stress.rs b/tests/regression/rust/probing/memtable/chaos_stress.rs similarity index 100% rename from probing/memtable/tests/chaos_stress.rs rename to tests/regression/rust/probing/memtable/chaos_stress.rs diff --git a/tests/test_py_to_table.rs b/tests/regression/rust/probing/python/py_to_table.rs similarity index 100% rename from tests/test_py_to_table.rs rename to tests/regression/rust/probing/python/py_to_table.rs diff --git a/probing/server/tests/auth_complex_tests.rs b/tests/regression/rust/probing/server/auth_complex_tests.rs similarity index 100% rename from probing/server/tests/auth_complex_tests.rs rename to tests/regression/rust/probing/server/auth_complex_tests.rs diff --git a/probing/server/tests/file_api_complex_tests.rs b/tests/regression/rust/probing/server/file_api_complex_tests.rs similarity index 89% rename from probing/server/tests/file_api_complex_tests.rs rename to tests/regression/rust/probing/server/file_api_complex_tests.rs index ef16d134..6fcfed58 100644 --- a/probing/server/tests/file_api_complex_tests.rs +++ b/tests/regression/rust/probing/server/file_api_complex_tests.rs @@ -55,26 +55,16 @@ async fn test_validate_path_within_allowed_dir() { #[tokio::test] async fn test_validate_path_outside_allowed_dir() { - // Create a temporary directory structure - let temp_dir = TempDir::new().unwrap(); - let outside_dir = temp_dir.path().join("outside"); - fs::create_dir_all(&outside_dir).unwrap(); - - // Create a test file outside allowed directories - let test_file = outside_dir.join("test.txt"); - fs::write(&test_file, "test content").unwrap(); - - // Change to temp_dir to test relative paths - let original_dir = std::env::current_dir().unwrap(); - std::env::set_current_dir(&temp_dir).unwrap(); - - // This should fail because it's outside allowed directories - let result = validate_path("./outside/test.txt"); - assert!(result.is_err()); + // Use a stable system path outside ALLOWED_FILE_DIRS / HOME / cwd — not a + // subdir of the process cwd (cwd is always allowed for dev convenience). + let outside = std::path::Path::new("/etc/hosts"); + if !outside.is_file() { + return; + } + + let result = validate_path(outside.to_str().unwrap()); + assert!(result.is_err(), "expected /etc/hosts to be denied"); assert!(result.unwrap_err().contains("Access denied")); - - // Restore original directory - std::env::set_current_dir(&original_dir).unwrap(); } #[tokio::test] @@ -154,7 +144,7 @@ async fn test_read_file_success() { let temp_file = NamedTempFile::new().unwrap(); let file_path = temp_file.path(); let content = "Hello, World!"; - fs::write(&file_path, content).unwrap(); + fs::write(file_path, content).unwrap(); // Create a temporary directory matching allowed dirs let temp_dir = TempDir::new().unwrap(); @@ -163,7 +153,7 @@ async fn test_read_file_success() { // Copy file to allowed directory let allowed_file = logs_dir.join("test.txt"); - fs::copy(&file_path, &allowed_file).unwrap(); + fs::copy(file_path, &allowed_file).unwrap(); // Change to temp_dir to test relative paths let original_dir = std::env::current_dir().unwrap(); diff --git a/probing/server/tests/training_observability_tests.rs b/tests/regression/rust/probing/server/training_observability_tests.rs similarity index 98% rename from probing/server/tests/training_observability_tests.rs rename to tests/regression/rust/probing/server/training_observability_tests.rs index 17bc1416..51c84aaa 100644 --- a/probing/server/tests/training_observability_tests.rs +++ b/tests/regression/rust/probing/server/training_observability_tests.rs @@ -25,6 +25,7 @@ fn step_matrix_response_fields_serializable() { samples: vec![StepDurationSample { rank: 1, local_step: 10, + coord_step: 10, duration_ms: 99.5, host: "node-a".into(), addr: "10.0.0.1:8080".into(), diff --git a/tests/regression/rust/src/lib.rs b/tests/regression/rust/src/lib.rs new file mode 100644 index 00000000..f1c600cf --- /dev/null +++ b/tests/regression/rust/src/lib.rs @@ -0,0 +1,8 @@ +//! Shared helpers for Rust regression tests under `tests/regression/rust/probing/`. + +pub mod test_helpers; + +/// Path to `tests/regression/spec/api_spec.json`. +pub fn api_spec_path() -> std::path::PathBuf { + std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../spec/api_spec.json") +} diff --git a/probing/core/tests/test_helpers.rs b/tests/regression/rust/src/test_helpers.rs similarity index 100% rename from probing/core/tests/test_helpers.rs rename to tests/regression/rust/src/test_helpers.rs diff --git a/tests/regression/skills/test_install_tools.py b/tests/regression/skills/test_install_tools.py new file mode 100644 index 00000000..cc7ada11 --- /dev/null +++ b/tests/regression/skills/test_install_tools.py @@ -0,0 +1,100 @@ +"""Tests for skill paths, install, and tools.""" + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest + +pytest.importorskip("yaml") + +from probing.skills.install import install_skills +from probing.skills.loader import load_catalog +from probing.skills.paths import ( + bundled_skills_dir, + detect_agent_install_targets, + skill_roots, +) +from probing.skills.tools import list_skills, plan_skill_run, run_skill + + +def test_bundled_skills_dir_exists(): + bundled = bundled_skills_dir() + assert bundled is not None + assert (bundled / "catalog.yaml").is_file() + + +def test_skill_roots_include_bundled(): + labels = [r.label for r in skill_roots()] + assert "bundled" in labels + + +def test_merged_catalog_has_eight_skills(): + catalog = load_catalog() + assert len(catalog.skills) == 8 + + +def test_list_skills_tool(): + skills = list_skills(limit=10) + assert len(skills) >= 8 + assert any(s.id == "health_overview" for s in skills) + + +def test_plan_skill_run(): + plan = plan_skill_run("health_overview") + assert plan.skill_id == "health_overview" + assert plan.steps + assert "probing" in plan.cli_command + + +def test_run_skill_plan_only(): + result = run_skill("health_overview", execute=False) + assert result["status"] == "plan" + assert "plan" in result + + +def test_detect_cursor_project_target(tmp_path: Path): + (tmp_path / ".cursor").mkdir() + targets = detect_agent_install_targets(tmp_path) + assert any( + t.agent == "cursor" and t.skills_dir == tmp_path / ".cursor" / "skills" + for t in targets + ) + + +def test_detect_codex_uses_agents_skills(tmp_path: Path): + (tmp_path / ".codex").mkdir() + targets = detect_agent_install_targets(tmp_path) + assert any( + t.agent == "codex" and t.skills_dir == tmp_path / ".agents" / "skills" + for t in targets + ) + + +def test_install_to_cursor_project(tmp_path: Path): + (tmp_path / ".cursor").mkdir() + manifest = install_skills(cwd=tmp_path, agents=["cursor"]) + assert manifest.targets + skill_dir = tmp_path / ".cursor" / "skills" / "health_overview" + assert (skill_dir / "SKILL.md").is_file() + + +def test_install_user_scope(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): + home = tmp_path / "home" + home.mkdir() + monkeypatch.setenv("HOME", str(home)) + (home / ".claude").mkdir() + manifest = install_skills(cwd=tmp_path, user=True, agents=["claude"]) + assert any( + t["agent"] == "claude" and t["scope"] == "user" for t in manifest.targets + ) + assert (home / ".claude" / "skills" / "health_overview" / "SKILL.md").is_file() + + +def test_list_skills_json(): + from probing.skills.tools import list_skills_json + + payload = json.loads(list_skills_json(limit=3)) + assert isinstance(payload, list) + assert payload diff --git a/tests/spec/api_spec.json b/tests/regression/spec/api_spec.json similarity index 77% rename from tests/spec/api_spec.json rename to tests/regression/spec/api_spec.json index 72521276..fdd14395 100644 --- a/tests/spec/api_spec.json +++ b/tests/regression/spec/api_spec.json @@ -1,5 +1,5 @@ { - "$comment": "Canonical HTTP API contract for Server, Python handlers, Web UI, and CLI. Narrative docs: probing/server/API.md. Client paths are validated via tests/spec/client_contract.py (no Server crate coupling).", + "$comment": "Canonical HTTP API contract for Server, Python handlers, Web UI, and CLI. Narrative docs: probing/server/API.md. Client paths are validated via tests/regression/spec/client_contract.py (no Server crate coupling).", "version": 1, "routing": { "server_public_prefix": "/apis", @@ -16,8 +16,6 @@ { "method": "GET", "path": "/apis/files" }, { "method": "GET", "path": "/apis/nodes" }, { "method": "PUT", "path": "/apis/nodes" }, - { "method": "GET", "path": "/apis/flamegraph/torch" }, - { "method": "GET", "path": "/apis/flamegraph/pprof" }, { "method": "GET", "path": "/apis/training/step_matrix" }, { "method": "POST", "path": "/apis/cluster/query" } ], @@ -108,6 +106,34 @@ } ], "other_extensions": [ + { + "extension_name": "torchextension", + "method": "GET", + "path": "/apis/torchextension/flamegraph", + "local_path": "flamegraph", + "response": { "content_type": "text/html", "cors": false } + }, + { + "extension_name": "torchextension", + "method": "GET", + "path": "/apis/torchextension/flamegraph/json", + "local_path": "flamegraph/json", + "response": { "content_type": "application/json", "cors": false } + }, + { + "extension_name": "pprofextension", + "method": "GET", + "path": "/apis/pprofextension/flamegraph", + "local_path": "flamegraph", + "response": { "content_type": "text/html", "cors": false } + }, + { + "extension_name": "pprofextension", + "method": "GET", + "path": "/apis/pprofextension/flamegraph/json", + "local_path": "flamegraph/json", + "response": { "content_type": "application/json", "cors": false } + }, { "extension_name": "rdmaextension", "method": "POST", @@ -117,6 +143,14 @@ } ], "deprecated_paths": [ + { + "path": "/apis/flamegraph/torch", + "replacement": "/apis/torchextension/flamegraph" + }, + { + "path": "/apis/flamegraph/pprof", + "replacement": "/apis/pprofextension/flamegraph" + }, { "path": "/apis/python/ray/timeline", "replacement": "/apis/pythonext/ray/timeline" @@ -127,7 +161,7 @@ }, { "path": "/apis/pythonext/flamegraph", - "replacement": "/apis/flamegraph/torch" + "replacement": "/apis/torchextension/flamegraph" } ], "client_contracts": { @@ -144,14 +178,14 @@ ] }, { - "source": "web/src/components/callstack_view.rs", + "source": "web/src/api/files.rs", "calls": [{ "method": "GET", "path": "/apis/files" }] }, { "source": "web/src/api/profiling.rs", "calls": [ - { "method": "GET", "path": "/apis/flamegraph/torch" }, - { "method": "GET", "path": "/apis/flamegraph/pprof" } + { "method": "GET", "path": "/apis/torchextension/flamegraph/json" }, + { "method": "GET", "path": "/apis/pprofextension/flamegraph/json" } ] }, { @@ -211,7 +245,11 @@ { "method": "GET", "path": "/apis/pythonext/callstack" }, { "method": "POST", "path": "/apis/pythonext/eval" }, { "method": "POST", "path": "/apis/rdmaextension/" }, - { "method": "POST", "path": "/query" } + { "method": "POST", "path": "/query" }, + { "method": "GET", "path": "/apis/torchextension/flamegraph" }, + { "method": "GET", "path": "/apis/torchextension/flamegraph/json" }, + { "method": "GET", "path": "/apis/pprofextension/flamegraph" }, + { "method": "GET", "path": "/apis/pprofextension/flamegraph/json" } ] }, { diff --git a/tests/spec/client_contract.py b/tests/regression/spec/client_contract.py similarity index 86% rename from tests/spec/client_contract.py rename to tests/regression/spec/client_contract.py index 59344060..4d79f3ef 100644 --- a/tests/spec/client_contract.py +++ b/tests/regression/spec/client_contract.py @@ -18,7 +18,7 @@ def repo_root() -> Path: - return Path(__file__).resolve().parents[2] + return Path(__file__).resolve().parents[3] def normalize_api_path(path: str) -> str: @@ -74,16 +74,7 @@ def endpoint_index(spec: dict[str, Any] | None = None) -> dict[str, set[str]]: def path_is_canonical(path: str, spec: dict[str, Any] | None = None) -> bool: """True when *path* matches a spec endpoint exactly or as a dynamic prefix.""" normalized = normalize_api_path(path) - if normalized in endpoint_index(spec): - return True - # Dynamic flamegraph segment: /apis/flamegraph/{torch|pprof} - if normalized in {"/apis/flamegraph", "/apis/flamegraph/"}: - return True - if normalized.startswith("/apis/flamegraph/"): - suffix = normalized.removeprefix("/apis/flamegraph/").strip("/") - if suffix in {"torch", "pprof"}: - return True - return False + return normalized in endpoint_index(spec) def methods_for_path(path: str, spec: dict[str, Any] | None = None) -> set[str]: @@ -104,7 +95,7 @@ def extract_api_path_literals(source: str) -> set[str]: def client_contracts( - spec: dict[str, Any] | None = None + spec: dict[str, Any] | None = None, ) -> dict[str, list[dict[str, Any]]]: spec = spec or load_api_spec() return spec["client_contracts"] @@ -122,8 +113,6 @@ def path_literal_in_source(path: str, source: str) -> bool: """Check that a declared contract path is reflected in Rust source.""" if path in source: return True - if path.startswith("/apis/flamegraph/"): - return 'format!("/apis/flamegraph/' in source or "/apis/flamegraph/" in source normalized = normalize_api_path(path) return normalized in source or f"{normalized}?" in source diff --git a/tests/spec/spec_loader.py b/tests/regression/spec/spec_loader.py similarity index 97% rename from tests/spec/spec_loader.py rename to tests/regression/spec/spec_loader.py index 474eae30..83bd6c61 100644 --- a/tests/spec/spec_loader.py +++ b/tests/regression/spec/spec_loader.py @@ -27,7 +27,7 @@ def extension_route_key(extension_name: str, local_path: str) -> str: def pythonext_response_entries( - spec: dict[str, Any] | None = None + spec: dict[str, Any] | None = None, ) -> list[dict[str, Any]]: """pythonext handler entries that declare HTTP response metadata.""" spec = spec or load_api_spec() diff --git a/tests/spec/test_api_spec.py b/tests/regression/spec/test_api_spec.py similarity index 97% rename from tests/spec/test_api_spec.py rename to tests/regression/spec/test_api_spec.py index d8902230..b26a0585 100644 --- a/tests/spec/test_api_spec.py +++ b/tests/regression/spec/test_api_spec.py @@ -1,6 +1,6 @@ """API contract spec tests. -The machine-readable spec lives in ``tests/spec/api_spec.json``. +The machine-readable spec lives in ``tests/regression/spec/api_spec.json``. These tests fail when implementation drifts from the documented contract. """ @@ -13,7 +13,7 @@ import pytest -sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "python")) +sys.path.insert(0, str(Path(__file__).resolve().parents[3] / "python")) sys.path.insert(0, str(Path(__file__).resolve().parent)) from probing.handlers.router import _handlers, handle_request @@ -216,7 +216,7 @@ class TestServerPublicRoutes: """Spec: server public routes in Rust match api_spec.json.""" def test_public_api_routes_const_matches_spec(self, spec): - repo = Path(__file__).resolve().parents[2] + repo = Path(__file__).resolve().parents[3] mod_rs = (repo / "probing/server/src/server/api/mod.rs").read_text( encoding="utf-8" ) diff --git a/tests/tbls/test_python_tbls.py b/tests/regression/tbls/test_python_tbls.py similarity index 100% rename from tests/tbls/test_python_tbls.py rename to tests/regression/tbls/test_python_tbls.py diff --git a/tests/training_observability/README.md b/tests/regression/training_observability/README.md similarity index 81% rename from tests/training_observability/README.md rename to tests/regression/training_observability/README.md index 0e2a351e..e567856a 100644 --- a/tests/training_observability/README.md +++ b/tests/regression/training_observability/README.md @@ -22,25 +22,25 @@ Shared fixtures live in `conftest.py` (`rank_env`, `parallel_env`, `sql_query`). ```bash # Full suite (needs maturin develop + PROBING=1) -PROBING=1 pytest tests/training_observability -q +PROBING=1 pytest tests/regression/training_observability -q # By marker PROBING=1 pytest -m training_observability -q # Rust fan-out unit tests -cargo test -p probing-server training_observability --no-default-features +cargo test -p probing-rust-regression server_training_observability --no-default-features ``` -## Relationship to `tests/ext/` +## Relationship to `tests/regression/ext/` -Older files under `tests/ext/test_comm_collective.py`, `test_collective_autostart.py`, +Older smoke tests under `tests/regression/ext/test_comm_collective.py`, and `test_parallel_topology.py` remain as lightweight smoke tests. New coverage should be added to this package first; ext tests can delegate or be trimmed once CI relies on this suite. ## Server-side tests -Rust merge/fan-out logic: `probing/server/tests/training_observability_tests.rs` and +Rust merge/fan-out logic: `tests/regression/rust/probing/server/training_observability_tests.rs` and unit tests in `server/src/server/cluster_fanout.rs`. HTTP integration tests for `GET /apis/training/step_matrix` and `POST /apis/cluster/query` diff --git a/tests/training_observability/__init__.py b/tests/regression/training_observability/__init__.py similarity index 100% rename from tests/training_observability/__init__.py rename to tests/regression/training_observability/__init__.py diff --git a/tests/training_observability/conftest.py b/tests/regression/training_observability/conftest.py similarity index 97% rename from tests/training_observability/conftest.py rename to tests/regression/training_observability/conftest.py index cd7892b4..cdae355b 100644 --- a/tests/training_observability/conftest.py +++ b/tests/regression/training_observability/conftest.py @@ -11,7 +11,7 @@ Run:: - PROBING=1 pytest tests/training_observability -q + PROBING=1 pytest tests/regression/training_observability -q """ from __future__ import annotations @@ -37,8 +37,7 @@ """ COMM_COLLECTIVE_RECENT_SQL = """ -SELECT local_step, rank, op, group_size, duration_ms, bytes, - tp_rank, pp_rank, dp_rank, tp_size, pp_size, dp_size +SELECT local_step, rank, op, group_size, duration_ms, bytes, role FROM python.comm_collective ORDER BY timestamp DESC """ diff --git a/tests/training_observability/test_collective_policy.py b/tests/regression/training_observability/test_collective_policy.py similarity index 100% rename from tests/training_observability/test_collective_policy.py rename to tests/regression/training_observability/test_collective_policy.py diff --git a/tests/training_observability/test_collective_recording.py b/tests/regression/training_observability/test_collective_recording.py similarity index 100% rename from tests/training_observability/test_collective_recording.py rename to tests/regression/training_observability/test_collective_recording.py diff --git a/tests/training_observability/test_collective_tracer_hook.py b/tests/regression/training_observability/test_collective_tracer_hook.py similarity index 100% rename from tests/training_observability/test_collective_tracer_hook.py rename to tests/regression/training_observability/test_collective_tracer_hook.py diff --git a/tests/training_observability/test_step_straggler_sql.py b/tests/regression/training_observability/test_step_straggler_sql.py similarity index 100% rename from tests/training_observability/test_step_straggler_sql.py rename to tests/regression/training_observability/test_step_straggler_sql.py diff --git a/tests/training_observability/test_topology_context.py b/tests/regression/training_observability/test_topology_context.py similarity index 93% rename from tests/training_observability/test_topology_context.py rename to tests/regression/training_observability/test_topology_context.py index 008a19c4..6c7cd2ec 100644 --- a/tests/training_observability/test_topology_context.py +++ b/tests/regression/training_observability/test_topology_context.py @@ -66,7 +66,7 @@ def test_comm_kind_labels(self): @pytest.mark.training_observability class TestTopologyInCollectiveRows: - def test_comm_lite_row_carries_tp_pp_dp(self, parallel_env, rank_env): + def test_comm_lite_row_carries_role(self, parallel_env, rank_env): rank_env(rank=2, world_size=8) parallel_env(tp_rank=1, pp_rank=0, dp_rank=2) @@ -79,7 +79,5 @@ def test_comm_lite_row_carries_tp_pp_dp(self, parallel_env, rank_env): ) row = table_rows(CommCollective, 1)[0] - assert row["tp_rank"] == 1 - assert row["pp_rank"] == 0 - assert row["dp_rank"] == 2 + assert row["role"] == "dp=2,pp=0,tp=1" assert row["rank"] == 2 diff --git a/tests/training_observability/test_training_iteration_e2e.py b/tests/regression/training_observability/test_training_iteration_e2e.py similarity index 98% rename from tests/training_observability/test_training_iteration_e2e.py rename to tests/regression/training_observability/test_training_iteration_e2e.py index 10ffda47..819132b3 100644 --- a/tests/training_observability/test_training_iteration_e2e.py +++ b/tests/regression/training_observability/test_training_iteration_e2e.py @@ -38,7 +38,7 @@ def test_single_iteration_step_and_comm(self, rank_env, parallel_env): comm_rows = table_rows(CommCollective, 5) assert len(comm_rows) == 1 assert comm_rows[0]["op"] == "all_reduce" - assert comm_rows[0]["pp_rank"] == 1 + assert "pp=1" in comm_rows[0]["role"] assert comm_rows[0]["bytes"] == 4096 def test_train_step_event_after_nested_spans(self): diff --git a/tests/training_observability/test_training_sql_integration.py b/tests/regression/training_observability/test_training_sql_integration.py similarity index 94% rename from tests/training_observability/test_training_sql_integration.py rename to tests/regression/training_observability/test_training_sql_integration.py index c6c46ad7..f23ad263 100644 --- a/tests/training_observability/test_training_sql_integration.py +++ b/tests/regression/training_observability/test_training_sql_integration.py @@ -28,5 +28,5 @@ def test_comm_collective_queryable_via_sql(self, rank_env, parallel_env, sql_que comm_df = sql_query(COMM_COLLECTIVE_RECENT_SQL, limit=5) assert not comm_df.empty assert comm_df.iloc[0]["op"] == "all_reduce" - assert int(comm_df.iloc[0]["pp_rank"]) == 1 + assert "pp=1" in str(comm_df.iloc[0]["role"]) assert int(comm_df.iloc[0]["bytes"]) == 4096 diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py new file mode 100644 index 00000000..0ffea9dc --- /dev/null +++ b/tests/unit/conftest.py @@ -0,0 +1,17 @@ +"""Fixtures for unit tests (no probing engine / ``_core`` required).""" + +from __future__ import annotations + +import os + +import pytest + +# Unit tests must not start the in-process probing server. +os.environ["PROBING"] = "0" +os.environ.pop("PROBING_ORIGINAL", None) + + +def pytest_collection_modifyitems(items: list[pytest.Item]) -> None: + for item in items: + if "tests/unit/" in str(item.fspath): + item.add_marker(pytest.mark.unit) diff --git a/tests/unit/probing/.gitkeep b/tests/unit/probing/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/tests/handlers/test_python_handlers.py b/tests/unit/probing/handlers/test_python_handlers.py similarity index 97% rename from tests/handlers/test_python_handlers.py rename to tests/unit/probing/handlers/test_python_handlers.py index f5be406c..370fcbe2 100644 --- a/tests/handlers/test_python_handlers.py +++ b/tests/unit/probing/handlers/test_python_handlers.py @@ -1,10 +1,6 @@ """Tests for Python extension handlers and router.""" import json -import sys - -# Add python directory to path -sys.path.insert(0, "python") from probing.handlers.pythonext import handle_api_request from probing.handlers.router import ( @@ -149,7 +145,7 @@ def test_handle_api_request_invalid_path(self): class TestHandlerRegistration: - """Handler registration is covered by tests/spec/test_api_spec.py.""" + """Handler registration is covered by tests/regression/spec/test_api_spec.py.""" def setup_method(self): _handlers.clear() diff --git a/tests/test_import_hook.py b/tests/unit/probing/hooks/test_import_hook.py similarity index 100% rename from tests/test_import_hook.py rename to tests/unit/probing/hooks/test_import_hook.py diff --git a/python/probing/playbooks/test_interpret.py b/tests/unit/probing/skills/test_interpret.py similarity index 92% rename from python/probing/playbooks/test_interpret.py rename to tests/unit/probing/skills/test_interpret.py index d8ed3376..9a11a9b8 100644 --- a/python/probing/playbooks/test_interpret.py +++ b/tests/unit/probing/skills/test_interpret.py @@ -1,6 +1,6 @@ -"""Tests for playbook interpretation rules.""" +"""Tests for skill interpretation rules.""" -from probing.playbooks.interpret import ( +from probing.skills.interpret import ( StepEvidence, evaluate_rules, evidence_from_dataframe, diff --git a/tests/unit/probing/skills/test_loader.py b/tests/unit/probing/skills/test_loader.py new file mode 100644 index 00000000..147c09b3 --- /dev/null +++ b/tests/unit/probing/skills/test_loader.py @@ -0,0 +1,62 @@ +"""Tests for skill loader.""" + +from __future__ import annotations + +import pytest + +pytest.importorskip("yaml") + +from probing.skills.loader import ( + expand_skill, + load_catalog, + load_skill, + match_skills, + skills_root, +) + + +def test_skills_root_exists(): + from probing.skills.paths import repo_skills_dir + + repo = repo_skills_dir() + assert repo is not None + assert repo.is_dir() + assert (repo / "catalog.yaml").is_file() + root = skills_root() + assert root.is_dir() + + +def test_catalog_loads_eight_skills(): + catalog = load_catalog() + assert len(catalog.skills) == 8 + ids = {p.id for p in catalog.skills} + assert "slow_rank" in ids + assert "nccl_culprit_victim" in ids + assert "health_overview" in ids + + +def test_load_slow_rank_global(): + skill = load_skill("slow_rank") + steps = expand_skill(skill, {"use_global": True, "step_window": 10}) + assert steps + sql = " ".join(s.sql or "" for s in steps if s.sql) + assert "global." in sql + + +def test_load_slow_rank_local(): + skill = load_skill("slow_rank") + steps = expand_skill(skill, {"use_global": False, "step_window": 5}) + rank_latency = next(s for s in steps if s.id == "rank_latency") + assert rank_latency.sql is not None + assert "global.python.comm_collective" not in rank_latency.sql + assert "python.comm_collective" in rank_latency.sql + + +def test_match_skills_hang(): + matched = match_skills("训练卡住了 hang") + assert "training_hang" in matched + + +def test_match_skills_straggler(): + matched = match_skills("哪个 rank 拖后腿 straggler") + assert "slow_rank" in matched diff --git a/tests/unit/probing/test_dev_pth.py b/tests/unit/probing/test_dev_pth.py new file mode 100644 index 00000000..17d342fc --- /dev/null +++ b/tests/unit/probing/test_dev_pth.py @@ -0,0 +1,37 @@ +"""Tests for develop-mode site hook installation.""" + +from __future__ import annotations + +from probing.dev_pth import ( + HOOK_PTH_LINE, + HOOK_PTH_NAME, + hook_pth_path, + install_dev_hook, + is_dev_hook_installed, + remove_dev_hook, + repo_python_dir, +) + + +def test_repo_python_dir(): + root = repo_python_dir() + assert root.is_dir() + assert (root / "probing").is_dir() + assert (root / "probing_hook.py").is_file() + + +def test_install_and_remove_dev_hook(): + remove_dev_hook() + assert not is_dev_hook_installed() + + path = install_dev_hook() + assert path == hook_pth_path() + assert path.name == HOOK_PTH_NAME + assert path.read_text(encoding="utf-8") == HOOK_PTH_LINE + assert is_dev_hook_installed() + + assert remove_dev_hook() + assert not is_dev_hook_installed() + + # Restore for other tests / local dev when run inside activated venv. + install_dev_hook() diff --git a/tests/unit/probing/test_web_assets.py b/tests/unit/probing/test_web_assets.py new file mode 100644 index 00000000..54ee16a6 --- /dev/null +++ b/tests/unit/probing/test_web_assets.py @@ -0,0 +1,54 @@ +"""Tests for wheel / editable web UI asset resolution.""" + +from __future__ import annotations + +import os +from pathlib import Path + +from probing import web_assets + + +def test_bundled_web_dir_missing_without_sync(): + root = web_assets.bundled_web_dir() + repo_root = Path(__file__).resolve().parents[3] + bundled_index = repo_root / "python" / "probing" / "_web" / "index.html" + if root is None: + assert not bundled_index.is_file() + else: + assert (root / "index.html").is_file() + + +def test_dev_web_dir_when_frontend_built(): + root = web_assets.dev_web_dir() + repo_dist = Path(__file__).resolve().parents[3] / "web" / "dist" / "index.html" + if repo_dist.is_file(): + assert root is not None + assert (root / "index.html").is_file() + else: + assert root is None + + +def test_configure_assets_root_prefers_bundled(monkeypatch, tmp_path: Path): + bundled = tmp_path / "_web" + bundled.mkdir() + (bundled / "index.html").write_text("bundled", encoding="utf-8") + + dev = tmp_path / "web" / "dist" + dev.mkdir(parents=True) + (dev / "index.html").write_text("dev", encoding="utf-8") + + monkeypatch.setattr(web_assets, "bundled_web_dir", lambda: bundled) + monkeypatch.setattr(web_assets, "dev_web_dir", lambda: dev) + monkeypatch.delenv(web_assets._ENV, raising=False) + + assert web_assets.configure_assets_root() == bundled + assert os.environ[web_assets._ENV] == str(bundled) + + +def test_configure_assets_root_respects_override(monkeypatch, tmp_path: Path): + override = tmp_path / "custom" + override.mkdir() + (override / "index.html").write_text("custom", encoding="utf-8") + monkeypatch.setenv(web_assets._ENV, str(override)) + + assert web_assets.configure_assets_root() == override diff --git a/web/DESIGN.md b/web/DESIGN.md index c7bdd684..c020fe11 100644 --- a/web/DESIGN.md +++ b/web/DESIGN.md @@ -250,8 +250,8 @@ web/src/ ## 八、构建与部署 -- 开发 / 构建:`dx serve` / `dx build --release`;仓库根 `make web/dist` 精简复制产物并生成 `.br`。 -- 静态资源由 `probing/server` 的 `include_dir!("web/dist")` 嵌入;支持 Brotli 与 `base_path` 子路径(见 `utils/base_path.rs`)。 +- 开发 / 构建:`dx serve` / `dx build --release`;仓库根 `make frontend` 复制产物到 `web/dist/`。 +- UI 静态资源由 Python 包提供(wheel:`python/probing/_web/`;editable:`web/dist/`),经 `probing.web_assets` 设置 `PROBING_ASSETS_ROOT`,`probing-server` 只读该目录;未配置时返回占位页。 --- diff --git a/web/src/agent/cluster.rs b/web/src/agent/cluster.rs index 2a996966..a893a857 100644 --- a/web/src/agent/cluster.rs +++ b/web/src/agent/cluster.rs @@ -108,12 +108,12 @@ pub fn cluster_context_for_llm(snapshot: &ClusterSnapshot) -> String { format!("Cluster mode: {mode}\n{}", snapshot.nodes_summary) } -/// Default `use_global` when the playbook parameter is not overridden. -pub fn default_use_global(snapshot: &ClusterSnapshot, playbook_default: bool) -> bool { +/// Default `use_global` when the skill parameter is not overridden. +pub fn default_use_global(snapshot: &ClusterSnapshot, skill_default: bool) -> bool { if !snapshot.is_distributed() { return false; } - playbook_default + skill_default } pub async fn execute_sql_for_agent( diff --git a/web/src/agent/interpret.rs b/web/src/agent/interpret.rs index c1f072eb..0beb3832 100644 --- a/web/src/agent/interpret.rs +++ b/web/src/agent/interpret.rs @@ -1,10 +1,10 @@ -//! Deterministic evaluation of playbook ``interpretation.rules``. +//! Deterministic evaluation of skill ``interpretation.rules``. use std::collections::HashMap; use probing_proto::prelude::{DataFrame, Ele}; -use super::playbook::InterpretRuleRaw; +use super::skill::InterpretRuleRaw; use super::runner::StepOutcome; pub type InterpretRule = InterpretRuleRaw; @@ -382,9 +382,11 @@ mod tests { use probing_proto::prelude::{DataFrame, Seq}; fn df_one_col(name: &str, vals: Vec) -> DataFrame { + let size = vals.len() as u64; DataFrame { names: vec![name.to_string()], cols: vec![Seq::SeqF64(vals)], + size, } } diff --git a/web/src/agent/llm.rs b/web/src/agent/llm.rs index 0676c87b..65d7cc41 100644 --- a/web/src/agent/llm.rs +++ b/web/src/agent/llm.rs @@ -17,15 +17,15 @@ use serde::Deserialize; use crate::agent::cluster::cluster_context_for_llm; use crate::agent::runner::StepOutcome; use crate::agent::{ - fetch_cluster_snapshot, list_playbook_ids, load_playbook, routing_context_for_llm, + fetch_cluster_snapshot, list_skill_ids, load_skill, routing_context_for_llm, }; use crate::state::llm_config::LlmConfig; use crate::state::page_context::PAGE_CONTEXT; use crate::utils::error::{AppError, Result}; #[derive(Debug, Deserialize)] -pub struct PlaybookSelection { - pub playbook_id: Option, +pub struct SkillSelection { + pub skill_id: Option, #[serde(default)] pub parameters: HashMap, #[serde(default)] @@ -44,11 +44,11 @@ fn map_openai_error(err: OpenAIError) -> AppError { AppError::Api(err.to_string()) } -fn playbook_catalog_prompt() -> String { +fn skill_catalog_prompt() -> String { let mut lines = vec![routing_context_for_llm(), String::new()]; - lines.push("Playbook details:".to_string()); - for id in list_playbook_ids() { - if let Some(pb) = load_playbook(id) { + lines.push("Skill details:".to_string()); + for id in list_skill_ids() { + if let Some(pb) = load_skill(id) { lines.push(format!( "- {}: {} — {}", pb.id, @@ -63,15 +63,15 @@ fn playbook_catalog_prompt() -> String { fn system_prompt_select() -> String { format!( "You are the Probing Investigate assistant for live AI training diagnostics \ - (playbook-driven diagnostic agent).\n\ - Pick exactly ONE playbook id from the catalog, or null if none apply.\n\ - Use the current page context and page snapshot to choose relevant playbooks and parameters.\n\ + (skill-driven diagnostic agent).\n\ + Pick exactly ONE skill id from the catalog, or null if none apply.\n\ + Use the current page context and page snapshot to choose relevant skills and parameters.\n\ Respond with JSON only (no markdown), shape:\n\ - {{\"playbook_id\":\"slow_rank\"|null,\"parameters\":{{\"step_window\":\"20\"}},\"reply\":\"one sentence\"}}\n\ - parameters values must be strings. Allowed keys depend on playbook (e.g. step_window, use_global, sample_limit).\n\ - For distributed training: prefer playbooks slow_rank, comm_bottleneck when cluster has peers; set use_global=true to fan-out via global.* tables.\n\ + {{\"skill_id\":\"slow_rank\"|null,\"parameters\":{{\"step_window\":\"20\"}},\"reply\":\"one sentence\"}}\n\ + parameters values must be strings. Allowed keys depend on skill (e.g. step_window, use_global, sample_limit).\n\ + For distributed training: prefer skills slow_rank, comm_bottleneck when cluster has peers; set use_global=true to fan-out via global.* tables.\n\ Catalog:\n{}", - playbook_catalog_prompt() + skill_catalog_prompt() ) } @@ -145,7 +145,7 @@ async fn chat_completion( .ok_or_else(|| AppError::Api("LLM returned empty response".to_string())) } -pub async fn select_playbook(config: &LlmConfig, user_message: &str) -> Result { +pub async fn select_skill(config: &LlmConfig, user_message: &str) -> Result { let page_block = workspace_context_block_with_cluster().await; let text = chat_completion( @@ -165,12 +165,12 @@ pub async fn select_playbook(config: &LlmConfig, user_message: &str) -> Result

Result { - let pb_title = load_playbook(playbook_id) + let pb_title = load_skill(skill_id) .map(|p| p.title) - .unwrap_or_else(|| playbook_id.to_string()); + .unwrap_or_else(|| skill_id.to_string()); let system = "You summarize probing diagnostic results for an ML engineer. \ Be concise (3-6 bullets). Cite specific numbers from evidence. \ @@ -180,7 +180,7 @@ pub async fn summarize_run( let user = format!( "User question: {user_message}\n\ - Playbook: {pb_title}\n\ + Skill: {pb_title}\n\ Workspace:\n{page_block}\n\ Evidence:\n{evidence}\n\ Summarize findings and suggest next actions.", diff --git a/web/src/agent/mod.rs b/web/src/agent/mod.rs index ef4d6c64..31d9a087 100644 --- a/web/src/agent/mod.rs +++ b/web/src/agent/mod.rs @@ -1,22 +1,24 @@ -//! Diagnostic agent: playbook loading, matching, and step execution. +//! Diagnostic agent: skill loading, matching, and step execution. mod cluster; mod interpret; mod llm; pub mod page_tools; -mod playbook; +mod skill; mod routing; mod runner; mod source_bridge; pub use cluster::fetch_cluster_snapshot; pub use interpret::{evaluate_rules, evidence_from_outcomes, format_findings}; -pub use llm::{outcomes_to_evidence, select_playbook, summarize_run}; +pub use llm::{outcomes_to_evidence, select_skill, summarize_run}; pub use page_tools::refresh_page_snapshot_for_route; -pub use playbook::{list_playbook_ids, load_playbook, resolve_playbook_id}; +pub use skill::{ + list_skill_ids, load_skill, resolve_skill_id, +}; pub use routing::routing_context_for_llm; -pub use runner::{run_playbook, StepOutcome}; +pub use runner::{run_skill, StepOutcome}; pub use source_bridge::{ - ask_agent_about_source, ask_and_run_agent_about_source, run_playbook_with_source, - suggested_playbooks_for_source, + ask_agent_about_source, ask_and_run_agent_about_source, run_skill_with_source, + suggested_skills_for_source, }; diff --git a/web/src/agent/page_tools.rs b/web/src/agent/page_tools.rs index 010903c3..2e7dca15 100644 --- a/web/src/agent/page_tools.rs +++ b/web/src/agent/page_tools.rs @@ -232,7 +232,7 @@ pub async fn fetch_page_snapshot(route: &Route) -> Result { parts.push(format!("[torch_trace]\n{p}")); } } - Route::TracesPage {} | Route::SpansPage {} => { + Route::SpansPage {} | Route::TracesRedirect {} => { if let Some(p) = query_preview( &client, "SELECT record_type, count(*) AS n FROM python.trace_event GROUP BY record_type", diff --git a/web/src/agent/routing.rs b/web/src/agent/routing.rs index d420cab3..188e2e66 100644 --- a/web/src/agent/routing.rs +++ b/web/src/agent/routing.rs @@ -1,4 +1,4 @@ -//! Catalog, intent, and page routing — shared playbook index (embedded YAML). +//! Catalog, intent, and page routing — shared skill index (embedded YAML). use std::collections::HashMap; use std::sync::OnceLock; @@ -8,14 +8,14 @@ use serde::Deserialize; use crate::app::Route; use crate::state::profiling::normalize_profiling_view; -const CATALOG_YAML: &str = include_str!("../../../playbooks/catalog.yaml"); -const INTENTS_YAML: &str = include_str!("../../../playbooks/semantic/intents.yaml"); -const PAGES_YAML: &str = include_str!("../../../playbooks/semantic/pages.yaml"); +const CATALOG_YAML: &str = include_str!("../../../skills/catalog.yaml"); +const INTENTS_YAML: &str = include_str!("../../../skills/semantic/intents.yaml"); +const PAGES_YAML: &str = include_str!("../../../skills/semantic/pages.yaml"); #[derive(Debug, Deserialize)] struct CatalogFile { #[serde(default)] - playbooks: Vec, + skills: Vec, } #[derive(Debug, Clone, Deserialize)] @@ -44,7 +44,7 @@ struct IntentEntry { #[serde(default)] keywords: Vec, #[serde(default)] - playbooks: Vec, + skills: Vec, } #[derive(Debug, Deserialize)] @@ -60,7 +60,7 @@ pub struct PageEntry { #[serde(default)] pub description: String, #[serde(default)] - pub playbooks: Vec, + pub skills: Vec, } #[derive(Debug, Clone)] @@ -69,16 +69,22 @@ pub struct PageDescriptor { pub title: String, pub path: String, pub description: String, - pub suggested_playbooks: Vec, + pub suggested_skills: Vec, } fn catalog_file() -> &'static CatalogFile { static CACHE: OnceLock = OnceLock::new(); CACHE.get_or_init(|| { - serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { playbooks: vec![] }) + serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { + skills: vec![], + }) }) } +fn catalog_entries() -> Vec { + catalog_file().skills.clone() +} + fn intent_file() -> &'static IntentCatalogFile { static CACHE: OnceLock = OnceLock::new(); CACHE.get_or_init(|| { @@ -97,18 +103,14 @@ fn page_file() -> &'static PageCatalogFile { }) } -pub fn catalog_playbook_ids() -> Vec { - let mut entries: Vec<_> = catalog_file().playbooks.clone(); +pub fn catalog_skill_ids() -> Vec { + let mut entries = catalog_entries(); entries.sort_by_key(|e| e.priority); entries.into_iter().map(|e| e.id).collect() } fn catalog_entry(id: &str) -> Option { - catalog_file() - .playbooks - .iter() - .find(|e| e.id == id) - .cloned() + catalog_entries().into_iter().find(|e| e.id == id) } pub fn page_id_for_route(route: &Route) -> String { @@ -124,7 +126,7 @@ pub fn page_id_for_route(route: &Route) -> String { Route::ProfilingRedirect {} | Route::ChromeTracingRedirect {} => "profiling".into(), Route::AnalyticsPage {} => "analytics".into(), Route::PythonPage {} => "python".into(), - Route::TracesPage {} | Route::SpansPage {} => "spans".into(), + Route::SpansPage {} | Route::TracesRedirect {} => "spans".into(), Route::PulsingPage {} => "pulsing".into(), Route::TrainingPage {} => "training".into(), } @@ -138,7 +140,7 @@ pub fn describe_route(route: &Route) -> PageDescriptor { title: entry.title.clone(), path: entry.path.clone(), description: entry.description.clone(), - suggested_playbooks: entry.playbooks.clone(), + suggested_skills: entry.skills.clone(), }; } if page_id.starts_with("stacks/") { @@ -148,7 +150,7 @@ pub fn describe_route(route: &Route) -> PageDescriptor { title: format!("{} · {}", entry.title, page_id), path: format!("/{}", page_id), description: entry.description.clone(), - suggested_playbooks: entry.playbooks.clone(), + suggested_skills: entry.skills.clone(), }; } } @@ -157,7 +159,7 @@ pub fn describe_route(route: &Route) -> PageDescriptor { title: page_id.clone(), path: "/".into(), description: String::new(), - suggested_playbooks: vec!["health_overview".into()], + suggested_skills: vec!["health_overview".into()], } } @@ -171,8 +173,8 @@ pub fn match_intents(query: &str, limit: usize) -> Vec { .filter(|kw| q.contains(kw.to_lowercase().as_str())) .count(); if hits > 0 { - for pb in &intent.playbooks { - scored.push((hits, pb.clone())); + for sid in &intent.skills { + scored.push((hits, sid.clone())); } } } @@ -182,8 +184,8 @@ pub fn match_intents(query: &str, limit: usize) -> Vec { } pub fn routing_context_for_llm() -> String { - let mut lines = vec!["Playbook catalog (by priority):".to_string()]; - for id in catalog_playbook_ids() { + let mut lines = vec!["Skill catalog (by priority):".to_string()]; + for id in catalog_skill_ids() { if let Some(entry) = catalog_entry(&id) { lines.push(format!( "- {} [{}]: {} (pages: {})", @@ -195,13 +197,13 @@ pub fn routing_context_for_llm() -> String { } } lines.push(String::new()); - lines.push("Intent routing (user language → playbooks):".to_string()); + lines.push("Intent routing (user language → skills):".to_string()); for (intent_id, intent) in &intent_file().intents { lines.push(format!( "- {}: {} → {}", intent_id, intent.label, - intent.playbooks.join(", ") + intent.skills.join(", ") )); } lines.join("\n") diff --git a/web/src/agent/runner.rs b/web/src/agent/runner.rs index 9997b71d..be49fb35 100644 --- a/web/src/agent/runner.rs +++ b/web/src/agent/runner.rs @@ -1,4 +1,4 @@ -//! Execute playbook steps against the probing HTTP API. +//! Execute skill steps against the probing HTTP API. use std::collections::HashMap; @@ -6,7 +6,7 @@ use crate::agent::cluster::{ default_use_global, execute_sql_for_agent, fetch_cluster_snapshot, format_cluster_meta, sql_needs_cluster_fanout, }; -use crate::agent::playbook::{build_context, expand_sql, load_playbook, Playbook, PlaybookStep}; +use crate::agent::skill::{build_context, expand_sql, load_skill, Skill, SkillStep}; use crate::api::ClusterQueryMeta; use crate::state::ui_tasks::{open_ui_task, UiTaskKind, UiTaskSession}; use crate::utils::error::{AppError, Result}; @@ -49,7 +49,7 @@ fn dataframe_rows(df: &DataFrame) -> usize { df.cols.iter().map(|c| c.len()).max().unwrap_or(0) } -fn playbook_default_use_global(pb: &Playbook) -> bool { +fn skill_default_use_global(pb: &Skill) -> bool { pb.parameters .iter() .find(|p| p.name == "use_global") @@ -61,19 +61,19 @@ fn playbook_default_use_global(pb: &Playbook) -> bool { } async fn resolve_overrides( - pb: &Playbook, + pb: &Skill, mut overrides: HashMap, ) -> HashMap { if overrides.contains_key("use_global") { return overrides; } let snapshot = fetch_cluster_snapshot().await; - let default = default_use_global(&snapshot, playbook_default_use_global(pb)); + let default = default_use_global(&snapshot, skill_default_use_global(pb)); overrides.insert("use_global".to_string(), default.to_string()); overrides } -fn should_skip_step(step: &PlaybookStep, ctx: &HashMap) -> Option { +fn should_skip_step(step: &SkillStep, ctx: &HashMap) -> Option { let Some(when) = &step.when else { return None; }; @@ -91,7 +91,7 @@ fn should_skip_step(step: &PlaybookStep, ctx: &HashMap) -> Optio } fn sql_outcome_from_df( - step: &PlaybookStep, + step: &SkillStep, df: DataFrame, cluster_meta: Option, ) -> StepOutcome { @@ -136,7 +136,7 @@ fn sql_outcome_from_df( } } -async fn run_sql_step(step: &PlaybookStep, sql: &str) -> StepOutcome { +async fn run_sql_step(step: &SkillStep, sql: &str) -> StepOutcome { let cluster_fanout = sql_needs_cluster_fanout(sql, step.cluster.unwrap_or(false)); match execute_sql_for_agent(sql, cluster_fanout).await { Ok((df, meta)) => sql_outcome_from_df(step, df, meta), @@ -158,7 +158,7 @@ async fn run_sql_step(step: &PlaybookStep, sql: &str) -> StepOutcome { } } -async fn run_api_step(step: &PlaybookStep) -> StepOutcome { +async fn run_api_step(step: &SkillStep) -> StepOutcome { let path = step.path.clone().unwrap_or_default(); let client = crate::api::ApiClient::new(); if path.contains("callstack") { @@ -231,7 +231,7 @@ async fn run_api_step(step: &PlaybookStep) -> StepOutcome { } } -async fn run_step(step: &PlaybookStep, ctx: &HashMap) -> StepOutcome { +async fn run_step(step: &SkillStep, ctx: &HashMap) -> StepOutcome { if let Some(reason) = should_skip_step(step, ctx) { return StepOutcome::Skipped { step_id: step.id.clone(), @@ -265,16 +265,16 @@ async fn run_step(step: &PlaybookStep, ctx: &HashMap) -> StepOut } } -pub async fn run_playbook( - playbook_id: &str, +pub async fn run_skill( + skill_id: &str, overrides: HashMap, session: Option<&UiTaskSession>, -) -> Result<(Playbook, Vec, HashMap)> { +) -> Result<(Skill, Vec, HashMap)> { if session.is_some_and(|s| s.is_cancelled()) { return Err(AppError::Cancelled); } - let pb = load_playbook(playbook_id) - .ok_or_else(|| AppError::Api(format!("Unknown playbook: {playbook_id}")))?; + let pb = load_skill(skill_id) + .ok_or_else(|| AppError::Api(format!("Unknown skill: {skill_id}")))?; let overrides = resolve_overrides(&pb, overrides).await; if session.is_some_and(|s| s.is_cancelled()) { return Err(AppError::Cancelled); @@ -287,14 +287,14 @@ pub async fn run_playbook( } let task = match session { Some(s) => s.open( - UiTaskKind::Playbook, + UiTaskKind::Skill, step.title.clone(), - Some(format!("{playbook_id} · {}", step.id)), + Some(format!("{skill_id} · {}", step.id)), ), None => open_ui_task( - UiTaskKind::Playbook, + UiTaskKind::Skill, step.title.clone(), - Some(format!("{playbook_id} · {}", step.id)), + Some(format!("{skill_id} · {}", step.id)), ), }; let outcome = run_step(step, &ctx).await; diff --git a/web/src/agent/playbook.rs b/web/src/agent/skill.rs similarity index 79% rename from web/src/agent/playbook.rs rename to web/src/agent/skill.rs index ce5131c5..a63c2df8 100644 --- a/web/src/agent/playbook.rs +++ b/web/src/agent/skill.rs @@ -1,32 +1,35 @@ -//! Playbook definitions loaded at compile time from ``playbooks/diagnostics/*.yaml``. +//! Diagnostic skill definitions loaded at compile time from repo ``skills/``. use include_dir::{include_dir, Dir}; use serde::Deserialize; use std::collections::HashMap; -static DIAGNOSTICS_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/../playbooks/diagnostics"); -const CATALOG_YAML: &str = include_str!("../../../playbooks/catalog.yaml"); +static SKILLS_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/../skills"); +const CATALOG_YAML: &str = include_str!("../../../skills/catalog.yaml"); #[derive(Debug, Clone, Deserialize)] struct CatalogFile { #[serde(default)] - playbooks: Vec, + skills: Vec, } #[derive(Debug, Clone, Deserialize)] struct CatalogEntry { id: String, + #[serde(default)] + path: String, + #[serde(default)] file: String, } #[derive(Debug, Clone, Deserialize)] -struct PlaybookFile { - metadata: PlaybookMeta, - spec: PlaybookSpec, +struct SkillFile { + metadata: SkillMeta, + spec: SkillSpec, } #[derive(Debug, Clone, Deserialize)] -struct PlaybookMeta { +struct SkillMeta { id: String, title: String, category: String, @@ -52,11 +55,11 @@ struct KeywordsMap { } #[derive(Debug, Clone, Deserialize)] -struct PlaybookSpec { +struct SkillSpec { #[serde(default)] - parameters: Vec, + parameters: Vec, #[serde(default)] - steps: Vec, + steps: Vec, #[serde(default)] interpretation: InterpretationSpec, #[serde(default)] @@ -85,14 +88,14 @@ fn default_severity() -> String { } #[derive(Debug, Clone, Deserialize)] -pub struct PlaybookParameter { +pub struct SkillParameter { pub name: String, #[serde(default)] pub default: serde_yaml::Value, } #[derive(Debug, Clone, Deserialize)] -struct PlaybookStepRaw { +struct SkillStepRaw { id: String, title: String, #[serde(rename = "type", default = "default_step_type")] @@ -126,7 +129,7 @@ fn default_on_empty() -> String { } #[derive(Debug, Clone)] -pub struct PlaybookStep { +pub struct SkillStep { pub id: String, pub title: String, pub step_type: String, @@ -144,15 +147,15 @@ pub struct PlaybookStep { } #[derive(Debug, Clone)] -pub struct Playbook { +pub struct Skill { pub id: String, pub title: String, pub category: String, #[allow(dead_code)] pub tags: Vec, pub docs: String, - pub parameters: Vec, - pub steps: Vec, + pub parameters: Vec, + pub steps: Vec, pub interpretation: Vec, pub summary_template: String, pub next_steps: Vec, @@ -160,23 +163,30 @@ pub struct Playbook { } fn catalog_entries() -> Vec { - serde_yaml::from_str::(CATALOG_YAML) - .map(|c| c.playbooks) - .unwrap_or_default() + let file: CatalogFile = serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { + skills: vec![], + }); + file.skills +} + +fn entry_path(entry: &CatalogEntry) -> String { + if !entry.path.is_empty() { + entry.path.clone() + } else { + entry.file.clone() + } } -fn diagnostics_yaml_for_id(id: &str) -> Option<&'static str> { +fn steps_yaml_for_id(id: &str) -> Option<&'static str> { let entry = catalog_entries().into_iter().find(|e| e.id == id)?; - let file_name = entry.file.rsplit('/').next().unwrap_or(&entry.file); - DIAGNOSTICS_DIR - .get_file(file_name) - .and_then(|f| f.contents_utf8()) + let rel = entry_path(&entry); + SKILLS_DIR.get_file(&rel).and_then(|f| f.contents_utf8()) } -pub fn list_playbook_ids() -> Vec<&'static str> { +pub fn list_skill_ids() -> Vec<&'static str> { catalog_entries() .into_iter() - .filter(|e| diagnostics_yaml_for_id(&e.id).is_some()) + .filter(|e| steps_yaml_for_id(&e.id).is_some()) .map(|e| leak_str(&e.id)) .collect() } @@ -185,9 +195,9 @@ fn leak_str(s: &str) -> &'static str { Box::leak(s.to_string().into_boxed_str()) } -pub fn load_playbook(id: &str) -> Option { - let yaml = diagnostics_yaml_for_id(id)?; - let file: PlaybookFile = serde_yaml::from_str(yaml).ok()?; +pub fn load_skill(id: &str) -> Option { + let yaml = steps_yaml_for_id(id)?; + let file: SkillFile = serde_yaml::from_str(yaml).ok()?; let mut keywords: Vec = file .metadata .tags @@ -214,7 +224,7 @@ pub fn load_playbook(id: &str) -> Option { .spec .steps .into_iter() - .map(|s| PlaybookStep { + .map(|s| SkillStep { id: s.id, title: s.title, step_type: s.step_type, @@ -229,7 +239,7 @@ pub fn load_playbook(id: &str) -> Option { cluster: s.cluster, }) .collect(); - Some(Playbook { + Some(Skill { id: file.metadata.id, title: file.metadata.title, category: file.metadata.category, @@ -244,7 +254,7 @@ pub fn load_playbook(id: &str) -> Option { }) } -pub fn default_parameters(pb: &Playbook) -> HashMap { +pub fn default_parameters(pb: &Skill) -> HashMap { let mut out = HashMap::new(); for p in &pb.parameters { let val = match &p.default { @@ -291,7 +301,7 @@ pub fn expand_sql(template: &str, ctx: &HashMap) -> String { } pub fn build_context( - pb: &Playbook, + pb: &Skill, overrides: &HashMap, ) -> HashMap { let mut ctx = default_parameters(pb); @@ -303,7 +313,7 @@ pub fn build_context( ctx } -pub fn match_playbooks(query: &str, limit: usize) -> Vec { +pub fn match_skills(query: &str, limit: usize) -> Vec { use std::collections::HashMap; let q = query.to_lowercase(); @@ -316,8 +326,8 @@ pub fn match_playbooks(query: &str, limit: usize) -> Vec { *scored.entry(id).or_insert(0) += 3usize.saturating_mul(10 - rank); } - for id in list_playbook_ids() { - let Some(pb) = load_playbook(id) else { + for id in list_skill_ids() { + let Some(pb) = load_skill(id) else { continue; }; let keyword_hits = pb @@ -337,17 +347,17 @@ pub fn match_playbooks(query: &str, limit: usize) -> Vec { ranked.into_iter().take(limit).map(|(_, id)| id).collect() } -pub fn resolve_playbook_id(input: &str) -> Option { +pub fn resolve_skill_id(input: &str) -> Option { let trimmed = input.trim(); if trimmed.starts_with('/') { - return load_playbook(trimmed.trim_start_matches('/')).map(|p| p.id); + return load_skill(trimmed.trim_start_matches('/')).map(|p| p.id); } if let Some(rest) = trimmed.strip_prefix("run ") { - return load_playbook(rest.trim()).map(|p| p.id); + return load_skill(rest.trim()).map(|p| p.id); } - if load_playbook(trimmed).is_some() { + if load_skill(trimmed).is_some() { return Some(trimmed.to_string()); } - let matched = match_playbooks(trimmed, 1); + let matched = match_skills(trimmed, 1); matched.into_iter().next() } diff --git a/web/src/agent/source_bridge.rs b/web/src/agent/source_bridge.rs index 995482d3..9d488e91 100644 --- a/web/src/agent/source_bridge.rs +++ b/web/src/agent/source_bridge.rs @@ -2,33 +2,33 @@ use dioxus::prelude::*; -use crate::agent::load_playbook; +use crate::agent::load_skill; use crate::state::agent::{open_agent_prefill, queue_agent_action, AgentPendingAction}; use crate::state::page_context::{set_page_local_hints, PAGE_CONTEXT}; use crate::utils::source_ref::{language_class, SourceSlice}; -const DEFAULT_SOURCE_PLAYBOOKS: &[&str] = +const DEFAULT_SOURCE_SKILLS: &[&str] = &["training_hang", "health_overview", "module_bottleneck"]; -/// Attach the visible source slice to page hints so LLM / playbooks see it. +/// Attach the visible source slice to page hints so LLM / skills see it. pub fn attach_source_focus(path: &str, line: Option, slice: &SourceSlice) { set_page_local_hints(vec![build_source_hint(path, line, slice)]); } -pub fn suggested_playbooks_for_source() -> Vec { +pub fn suggested_skills_for_source() -> Vec { let page = PAGE_CONTEXT.read(); let from_page: Vec = page - .suggested_playbooks + .suggested_skills .iter() - .filter(|id| load_playbook(id).is_some()) + .filter(|id| load_skill(id).is_some()) .cloned() .collect(); if !from_page.is_empty() { return from_page.into_iter().take(4).collect(); } - DEFAULT_SOURCE_PLAYBOOKS + DEFAULT_SOURCE_SKILLS .iter() - .filter(|id| load_playbook(id).is_some()) + .filter(|id| load_skill(id).is_some()) .map(|s| (*s).to_string()) .collect() } @@ -47,18 +47,18 @@ pub fn ask_and_run_agent_about_source(path: &str, line: Option, slice: &Sou ))); } -/// Run a playbook with the current source slice attached as page context. -pub fn run_playbook_with_source( - playbook_id: &str, +/// Run a skill with the current source slice attached as page context. +pub fn run_skill_with_source( + skill_id: &str, path: &str, line: Option, slice: &SourceSlice, ) { - if load_playbook(playbook_id).is_none() { + if load_skill(skill_id).is_none() { return; } attach_source_focus(path, line, slice); - queue_agent_action(AgentPendingAction::RunPlaybook(playbook_id.to_string())); + queue_agent_action(AgentPendingAction::RunSkill(skill_id.to_string())); } fn build_user_prompt(path: &str, line: Option, slice: &SourceSlice) -> String { @@ -74,7 +74,7 @@ fn build_user_prompt(path: &str, line: Option, slice: &SourceSlice) -> Stri {highlight}\n\ Source excerpt ({lang}, lines {start}–{end}):\n\ ```\n{body}\n```\n\ - What might cause a stall or slowness here? Recommend playbooks and next checks.", + What might cause a stall or slowness here? Recommend skills and next checks.", lang = language_class(path), start = slice.start_line, end = slice.end_line, diff --git a/web/src/api/profiling.rs b/web/src/api/profiling.rs index e637f1cb..61441b01 100644 --- a/web/src/api/profiling.rs +++ b/web/src/api/profiling.rs @@ -40,15 +40,20 @@ impl ApiClient { profiler_type: &str, metric: Option<&str>, ) -> Result { - let path = match metric { - Some(m) if !m.is_empty() => { - format!( - "/apis/flamegraph/{}?format=json&metric={}", - profiler_type, + let path = match profiler_type { + "torch" => match metric { + Some(m) if !m.is_empty() => format!( + "/apis/torchextension/flamegraph/json?metric={}", urlencoding::encode(m) - ) + ), + _ => "/apis/torchextension/flamegraph/json".to_string(), + }, + "pprof" => "/apis/pprofextension/flamegraph/json".to_string(), + other => { + return Err(crate::utils::error::AppError::Api(format!( + "unknown flamegraph profiler: {other}" + ))) } - _ => format!("/apis/flamegraph/{}?format=json", profiler_type), }; self.get_request(&path).await } diff --git a/web/src/api/trace.rs b/web/src/api/trace.rs index 45b32ed1..e604d997 100644 --- a/web/src/api/trace.rs +++ b/web/src/api/trace.rs @@ -13,13 +13,6 @@ pub struct TraceResponse { pub error: Option, } -/// Trace status information (simplified version, as show_trace only returns function name list) -#[allow(dead_code)] -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TraceInfo { - pub function: String, -} - /// Variable change record #[derive(Debug, Clone, Serialize, Deserialize)] pub struct VariableRecord { @@ -44,18 +37,7 @@ pub struct TraceableItem { /// Trace API impl ApiClient { - /// Get list of traceable functions (returns function name list, compatible with old format) - #[allow(dead_code)] - pub async fn get_traceable_functions(&self, prefix: Option<&str>) -> Result> { - let items = self.get_traceable_items(prefix).await?; - // Convert to old format for backward compatibility - Ok(items - .iter() - .map(|item| format!("[{}] {}", item.item_type, item.name)) - .collect()) - } - - /// Get list of traceable items (always includes variable information) + /// Get list of traceable items (includes variable information when available). pub async fn get_traceable_items(&self, prefix: Option<&str>) -> Result> { let base = "/apis/pythonext/trace/list"; let path = if let Some(prefix) = prefix { @@ -65,35 +47,7 @@ impl ApiClient { }; let response = self.get_request(&path).await?; - - // Try to parse as new format (list of objects) - if let Ok(items) = serde_json::from_str::>(&response) { - return Ok(items); - } - - // Fallback to old format (list of strings) - let strings: Vec = Self::parse_json(&response)?; - Ok(strings - .iter() - .map(|s| { - // Parse "[TYPE] name" format - if let Some(bracket_end) = s.find(']') { - let item_type = s[1..bracket_end].to_string(); - let name = s[bracket_end + 2..].to_string(); - TraceableItem { - name, - item_type, - variables: vec![], - } - } else { - TraceableItem { - name: s.clone(), - item_type: "".to_string(), - variables: vec![], - } - } - }) - .collect()) + Self::parse_json(&response) } /// Get current trace status (returns list of traced function names) diff --git a/web/src/app.rs b/web/src/app.rs index 3bd48349..62a5284a 100644 --- a/web/src/app.rs +++ b/web/src/app.rs @@ -40,7 +40,7 @@ pub enum Route { #[route("/python")] PythonPage {}, #[route("/traces")] - TracesPage {}, + TracesRedirect {}, #[route("/spans")] SpansPage {}, #[route("/chrome-tracing")] @@ -154,11 +154,15 @@ pub fn PythonPage() -> Element { } #[component] -pub fn TracesPage() -> Element { +pub fn TracesRedirect() -> Element { + let nav = dioxus_router::use_navigator(); + use_effect(move || { + nav.replace(Route::SpansPage {}); + }); rsx! { AppLayout { fullscreen: true, - Traces {} + LoadingState { message: Some("Redirecting to spans…".to_string()) } } } } diff --git a/web/src/components/agent/chat.rs b/web/src/components/agent/chat.rs index 93b7d8ae..fdced060 100644 --- a/web/src/components/agent/chat.rs +++ b/web/src/components/agent/chat.rs @@ -5,13 +5,13 @@ use std::collections::HashMap; use dioxus::prelude::*; use crate::agent::{ - evaluate_rules, evidence_from_outcomes, format_findings, list_playbook_ids, load_playbook, - refresh_page_snapshot_for_route, resolve_playbook_id, run_playbook, select_playbook, + evaluate_rules, evidence_from_outcomes, format_findings, list_skill_ids, load_skill, + refresh_page_snapshot_for_route, resolve_skill_id, run_skill, select_skill, summarize_run, }; use crate::app::Route; use crate::components::agent::step_card::{ - step_outcome_to_card, AgentPlaybookRunCard, AgentStepCard, + step_outcome_to_card, AgentSkillRunCard, AgentStepCard, }; use crate::components::colors::colors; use crate::components::icon::Icon; @@ -31,10 +31,11 @@ use crate::state::page_context::PAGE_CONTEXT; use crate::state::ui_tasks::{ui_agent_busy, UiTaskKind, UiTaskSession, UI_TASK_TICK}; use dioxus_router::use_route; -const QUICK_PLAYBOOKS: &[(&str, &str)] = &[ +const QUICK_SKILLS: &[(&str, &str)] = &[ ("health_overview", "Health"), ("training_hang", "Hang"), ("slow_rank", "Slow rank"), + ("nccl_culprit_victim", "NCCL"), ("comm_bottleneck", "Comm"), ("memory_leak", "Memory"), ("module_bottleneck", "Bottleneck"), @@ -67,7 +68,7 @@ pub fn AgentChat(variant: AgentChatVariant) -> Element { }; match action { AgentPendingAction::SubmitText(text) => submit_agent_text(text), - AgentPendingAction::RunPlaybook(id) => trigger_playbook(id), + AgentPendingAction::RunSkill(id) => trigger_skill(id), } }); @@ -117,13 +118,13 @@ pub fn AgentChat(variant: AgentChatVariant) -> Element { let toolbar = rsx! { div { class: "flex flex-wrap gap-1.5", - for (id, label) in QUICK_PLAYBOOKS { + for (id, label) in QUICK_SKILLS { ChipButton { label: (*label).to_string(), disabled: running, onclick: { - let pid = (*id).to_string(); - move |_| spawn_run_playbook(pid.clone(), HashMap::new(), None) + let skill_id = (*id).to_string(); + move |_| spawn_run_skill(skill_id.clone(), HashMap::new(), None) }, } } @@ -227,14 +228,14 @@ fn AgentPageContextCard() -> Element { if page.snapshot_loading { "…" } else { "Refresh" } } } - if !page.suggested_playbooks.is_empty() { + if !page.suggested_skills.is_empty() { div { class: "flex flex-wrap gap-1 pt-0.5", span { class: "text-[10px] text-gray-400", "Suggested:" } - for id in page.suggested_playbooks.iter().cloned() { + for id in page.suggested_skills.iter().cloned() { ChipButton { label: id.clone(), disabled: ui_agent_busy(), - onclick: move |_| spawn_run_playbook(id.clone(), HashMap::new(), None), + onclick: move |_| spawn_run_skill(id.clone(), HashMap::new(), None), } } } @@ -258,7 +259,7 @@ fn AgentWelcome() -> Element { SurfaceCard { SurfaceCardBody { class: "px-3 py-3 space-y-2 text-sm text-gray-600", - p { class: "font-medium text-gray-800", "Ask in plain language or pick a quick playbook above." } + p { class: "font-medium text-gray-800", "Ask in plain language or pick a quick skill above." } ul { class: "list-disc list-inside text-xs space-y-1 text-gray-500", li { "「训练卡住了」→ training_hang" } li { "「哪个 rank 慢」→ slow_rank(多机自动 cluster fan-out)" } @@ -271,14 +272,14 @@ fn AgentWelcome() -> Element { } } if LLM_CONFIG.read().is_configured() { - p { class: "text-xs text-emerald-700", "LLM will pick playbooks and summarize results." } + p { class: "text-xs text-emerald-700", "LLM will pick skills and summarize results." } } else { p { class: "text-xs text-gray-500", "No LLM key — open ⚙ to save an API key in this browser (localStorage)." } } p { class: "text-xs text-gray-400", - "Available: {list_playbook_ids().join(\", \")}" + "Available: {list_skill_ids().join(\", \")}" } } } @@ -299,11 +300,11 @@ fn AgentMessageView(message: AgentMessage) -> Element { AgentMessageKind::Assistant => rsx! { AgentAssistantBlock { text: message.text.clone() } }, - AgentMessageKind::PlaybookRun => rsx! { - AgentPlaybookRunCard { + AgentMessageKind::SkillRun => rsx! { + AgentSkillRunCard { title: message.title.clone().unwrap_or_default(), - playbook_id: message.playbook_id.clone().unwrap_or_default(), - category: message.playbook_category.clone().unwrap_or_default(), + skill_id: message.skill_id.clone().unwrap_or_default(), + category: message.skill_category.clone().unwrap_or_default(), docs: message.text.clone(), } }, @@ -329,7 +330,7 @@ fn AgentMessageView(message: AgentMessage) -> Element { fn AgentAssistantBlock(text: String) -> Element { let _task_tick = UI_TASK_TICK.read(); let agent_busy = ui_agent_busy(); - let chips = extract_playbook_chips(&text); + let chips = extract_skill_chips(&text); let source_refs = crate::utils::source_ref::extract_source_refs(&text); rsx! { div { class: "space-y-2", @@ -356,7 +357,7 @@ fn AgentAssistantBlock(text: String) -> Element { ChipButton { label: format!("Run {id}"), disabled: agent_busy, - onclick: move |_| spawn_run_playbook(id.clone(), HashMap::new(), None), + onclick: move |_| spawn_run_skill(id.clone(), HashMap::new(), None), } } } @@ -365,13 +366,13 @@ fn AgentAssistantBlock(text: String) -> Element { } } -fn extract_playbook_chips(text: &str) -> Vec { +fn extract_skill_chips(text: &str) -> Vec { let mut out = Vec::new(); for line in text.lines() { - if let Some(idx) = line.find("playbook:") { - let rest = line[idx + "playbook:".len()..].trim(); + if let Some(idx) = line.find("skill:") { + let rest = line[idx + "skill:".len()..].trim(); let id = rest.split_whitespace().next().unwrap_or("").trim(); - if load_playbook(id).is_some() && !out.contains(&id.to_string()) { + if load_skill(id).is_some() && !out.contains(&id.to_string()) { out.push(id.to_string()); } } @@ -384,12 +385,12 @@ fn AgentWorkingIndicator() -> Element { rsx! { div { class: "flex items-center gap-2 px-3 py-2 text-xs text-gray-500", span { class: "inline-block w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full animate-spin" } - "Agent working — selecting playbook and running diagnostics…" + "Agent working — selecting skill and running diagnostics…" } } } -/// Submit a user message to the agent (opens flow / playbooks / LLM). +/// Submit a user message to the agent (opens flow / skills / LLM). pub fn submit_agent_text(text: String) { if text.trim().is_empty() || ui_agent_busy() { return; @@ -397,12 +398,12 @@ pub fn submit_agent_text(text: String) { dispatch_agent_message(text); } -/// Run a playbook immediately (used from source bridge, chips, etc.). -pub fn trigger_playbook(playbook_id: String) { +/// Run a skill immediately (used from source bridge, chips, etc.). +pub fn trigger_skill(skill_id: String) { if ui_agent_busy() { return; } - spawn_run_playbook(playbook_id, HashMap::new(), None); + spawn_run_skill(skill_id, HashMap::new(), None); } fn submit_agent_input() { @@ -417,9 +418,9 @@ fn submit_agent_input() { fn dispatch_agent_message(text: String) { push_agent_message(AgentMessage::user(text.clone())); - if text.starts_with('/') || text.starts_with("run ") || load_playbook(text.as_str()).is_some() { - if let Some(id) = resolve_playbook_id(&text) { - spawn_run_playbook(id, HashMap::new(), None); + if text.starts_with('/') || text.starts_with("run ") || load_skill(text.as_str()).is_some() { + if let Some(id) = resolve_skill_id(&text) { + spawn_run_skill(id, HashMap::new(), None); return; } } @@ -430,11 +431,11 @@ fn dispatch_agent_message(text: String) { return; } - if let Some(id) = resolve_playbook_id(&text) { - spawn_run_playbook(id, HashMap::new(), None); + if let Some(id) = resolve_skill_id(&text) { + spawn_run_skill(id, HashMap::new(), None); } else { push_agent_message(AgentMessage::assistant( - "No playbook matched. Try quick chips, /health_overview, or open ⚙ to add an LLM API key." + "No skill matched. Try quick chips, /health_overview, or open ⚙ to add an LLM API key." .to_string(), )); } @@ -467,8 +468,8 @@ fn spawn_llm_flow(user_message: String, config: LlmConfig) { return; } - let llm_task = session.open(UiTaskKind::Agent, "Select playbook", None); - match select_playbook(&config, &user_message).await { + let llm_task = session.open(UiTaskKind::Agent, "Select skill", None); + match select_skill(&config, &user_message).await { Ok(sel) => { if llm_task.is_cancelled() { llm_task.cancel(); @@ -478,9 +479,9 @@ fn spawn_llm_flow(user_message: String, config: LlmConfig) { if !sel.reply.is_empty() { push_agent_message(AgentMessage::assistant(sel.reply.clone())); } - match sel.playbook_id { - Some(id) if load_playbook(&id).is_some() => { - run_playbook_flow( + match sel.skill_id { + Some(id) if load_skill(&id).is_some() => { + run_skill_flow( &session, &id, sel.parameters, @@ -490,13 +491,13 @@ fn spawn_llm_flow(user_message: String, config: LlmConfig) { } Some(id) => { push_agent_message(AgentMessage::error(format!( - "LLM chose unknown playbook: {id}" + "LLM chose unknown skill: {id}" ))); } None => { if sel.reply.is_empty() { push_agent_message(AgentMessage::assistant( - "No suitable playbook — try rephrasing or pick a quick chip." + "No suitable skill — try rephrasing or pick a quick chip." .to_string(), )); } @@ -518,8 +519,8 @@ fn spawn_llm_flow(user_message: String, config: LlmConfig) { }); } -fn spawn_run_playbook( - playbook_id: String, +fn spawn_run_skill( + skill_id: String, overrides: HashMap, llm_followup: Option<(LlmConfig, String)>, ) { @@ -528,13 +529,13 @@ fn spawn_run_playbook( } spawn(async move { let session = UiTaskSession::start(); - run_playbook_flow(&session, &playbook_id, overrides, llm_followup).await; + run_skill_flow(&session, &skill_id, overrides, llm_followup).await; }); } -async fn run_playbook_flow( +async fn run_skill_flow( session: &UiTaskSession, - playbook_id: &str, + skill_id: &str, overrides: HashMap, llm_followup: Option<(LlmConfig, String)>, ) { @@ -542,9 +543,9 @@ async fn run_playbook_flow( return; } - let Some(meta) = load_playbook(playbook_id) else { + let Some(meta) = load_skill(skill_id) else { push_agent_message(AgentMessage::error(format!( - "Unknown playbook: {playbook_id}" + "Unknown skill: {skill_id}" ))); return; }; @@ -560,7 +561,7 @@ async fn run_playbook_flow( ))); } - push_agent_message(AgentMessage::playbook_run( + push_agent_message(AgentMessage::skill_run( meta.id.clone(), meta.title.clone(), meta.category.clone(), @@ -572,7 +573,7 @@ async fn run_playbook_flow( } else { overrides }; - match run_playbook(playbook_id, overrides, Some(session)).await { + match run_skill(skill_id, overrides, Some(session)).await { Ok((pb, outcomes, ctx)) => { if session.is_cancelled() { return; @@ -592,9 +593,9 @@ async fn run_playbook_flow( let summary_task = session.open( UiTaskKind::Agent, "Summarize results", - Some(playbook_id.to_string()), + Some(skill_id.to_string()), ); - match summarize_run(&config, &user_msg, playbook_id, &evidence).await { + match summarize_run(&config, &user_msg, skill_id, &evidence).await { Ok(summary) => { if summary_task.is_cancelled() { summary_task.cancel(); diff --git a/web/src/components/agent/mod.rs b/web/src/components/agent/mod.rs index 5873019c..eb4f512e 100644 --- a/web/src/components/agent/mod.rs +++ b/web/src/components/agent/mod.rs @@ -1,4 +1,4 @@ -//! Investigation Agent — playbook-driven diagnostic chat panel. +//! Investigation Agent — skill-driven diagnostic chat panel. pub mod chat; pub mod panel; diff --git a/web/src/components/agent/step_card.rs b/web/src/components/agent/step_card.rs index 9a6900b2..95a03921 100644 --- a/web/src/components/agent/step_card.rs +++ b/web/src/components/agent/step_card.rs @@ -1,4 +1,4 @@ -//! Playbook step results as in-app tool cards (tables, API text, navigation). +//! Skill step results as in-app tool cards (tables, API text, navigation). use dioxus::prelude::*; use dioxus_router::Link; @@ -180,9 +180,9 @@ pub fn step_outcome_to_card(outcome: StepOutcome) -> AgentStepCardData { } #[component] -pub fn AgentPlaybookRunCard( +pub fn AgentSkillRunCard( title: String, - playbook_id: String, + skill_id: String, category: String, docs: String, ) -> Element { @@ -194,7 +194,7 @@ pub fn AgentPlaybookRunCard( icon: &icondata::AiRobotOutlined, icon_class: "w-4 h-4 text-blue-600", title: title, - subtitle: Some(format!("{category} · {playbook_id}")), + subtitle: Some(format!("{category} · {skill_id}")), } if !docs_preview.is_empty() { SurfaceCardBody { diff --git a/web/src/components/agent/view_route.rs b/web/src/components/agent/view_route.rs index f566746b..8cbf92ab 100644 --- a/web/src/components/agent/view_route.rs +++ b/web/src/components/agent/view_route.rs @@ -1,4 +1,4 @@ -//! Map playbook `ui.view` targets to app routes (shared with sidebar navigation). +//! Map skill `ui.view` targets to app routes (shared with sidebar navigation). use crate::app::Route; use crate::state::profiling::{normalize_profiling_view, profiling_view_label}; diff --git a/web/src/components/global_command_panel.rs b/web/src/components/global_command_panel.rs index cabeebf2..6b5134ef 100644 --- a/web/src/components/global_command_panel.rs +++ b/web/src/components/global_command_panel.rs @@ -280,7 +280,7 @@ pub fn CommandBar(on_execute_done: EventHandler) -> Element { } else { "shrink-0 px-2.5 py-2 rounded-lg text-sm font-medium text-gray-600 hover:bg-gray-100 border border-gray-300" }, - title: "Investigate (⌘J) — playbook diagnostic agent overlay", + title: "Investigate (⌘J) — skill diagnostic agent overlay", onclick: move |_| { let open = *AGENT_PANEL_OPEN.read(); *AGENT_PANEL_OPEN.write() = !open; diff --git a/web/src/components/page_context_sync.rs b/web/src/components/page_context_sync.rs index f1e290b9..2b9d31e6 100644 --- a/web/src/components/page_context_sync.rs +++ b/web/src/components/page_context_sync.rs @@ -26,7 +26,7 @@ pub fn PageContextSync() -> Element { desc.title, desc.path, desc.description, - desc.suggested_playbooks, + desc.suggested_skills, inv_summary, ); let route_changed = old_page_id != PAGE_CONTEXT.read().page_id; diff --git a/web/src/components/sidebar/mod.rs b/web/src/components/sidebar/mod.rs index f0f5ef2d..c7212a33 100644 --- a/web/src/components/sidebar/mod.rs +++ b/web/src/components/sidebar/mod.rs @@ -103,7 +103,7 @@ pub fn Sidebar() -> Element { to: Route::AgentPage {}, icon: &icondata::AiRobotOutlined, label: "Investigate", - title: "Playbook-driven investigation (diagnostic agent)", + title: "Skill-driven investigation (diagnostic agent)", is_active: route == Route::AgentPage {}, } StackSidebarItem { @@ -125,7 +125,7 @@ pub fn Sidebar() -> Element { icon: &icondata::AiApiOutlined, label: "Spans", title: "Hierarchical tracing spans from python.trace_event", - is_active: matches!(route, Route::TracesPage {} | Route::SpansPage {}), + is_active: route == Route::SpansPage {}, } SidebarNavItem { to: Route::TrainingPage {}, diff --git a/web/src/components/source_viewer.rs b/web/src/components/source_viewer.rs index 5c9c9c21..f0ab476c 100644 --- a/web/src/components/source_viewer.rs +++ b/web/src/components/source_viewer.rs @@ -3,8 +3,8 @@ use dioxus::prelude::*; use crate::agent::{ - ask_agent_about_source, ask_and_run_agent_about_source, run_playbook_with_source, - suggested_playbooks_for_source, + ask_agent_about_source, ask_and_run_agent_about_source, run_skill_with_source, + suggested_skills_for_source, }; use crate::api::ApiClient; use crate::components::icon::Icon; @@ -296,7 +296,7 @@ fn SourceSliceView(slice: SourceSlice, path: String, line: Option, floating #[component] fn SourceAgentBar(path: String, line: Option, slice: SourceSlice) -> Element { let busy = ui_agent_busy(); - let playbooks = suggested_playbooks_for_source(); + let skills = suggested_skills_for_source(); let path_ask = path.clone(); let path_run = path.clone(); let slice_ask = slice.clone(); @@ -329,7 +329,7 @@ fn SourceAgentBar(path: String, line: Option, slice: SourceSlice) -> Elemen }, "Ask & Run" } - for pb in playbooks { + for pb in skills { { let path_pb = path.clone(); let slice_pb = slice.clone(); @@ -339,7 +339,7 @@ fn SourceAgentBar(path: String, line: Option, slice: SourceSlice) -> Elemen label: pb, disabled: busy, onclick: move |_| { - run_playbook_with_source(&id, &path_pb, line, &slice_pb); + run_skill_with_source(&id, &path_pb, line, &slice_pb); }, } } diff --git a/web/src/hooks/mod.rs b/web/src/hooks/mod.rs index 58c4379e..674f0ba2 100644 --- a/web/src/hooks/mod.rs +++ b/web/src/hooks/mod.rs @@ -1,7 +1,7 @@ //! Data-fetching hooks for the web UI. //! -//! **New code** should prefer [`use_app_resource`] (auto-fetch) and Dioxus [`use_action`](dioxus::prelude::use_action) -//! (user-triggered). Legacy [`use_api`] / [`ApiState`] remain for pages not yet migrated. +//! Prefer [`use_app_resource`] (auto-fetch) and Dioxus [`use_action`](dioxus::prelude::use_action) +//! (user-triggered). [`use_api`] remains on a few pages (e.g. Pulsing) pending migration. use crate::utils::error::AppError; use dioxus::prelude::*; diff --git a/web/src/pages/training.rs b/web/src/pages/training.rs index 04f6b4b7..3d210594 100644 --- a/web/src/pages/training.rs +++ b/web/src/pages/training.rs @@ -4,7 +4,7 @@ use std::collections::{HashMap, HashSet}; use dioxus::prelude::*; -use crate::agent::load_playbook; +use crate::agent::load_skill; use crate::api::{ApiClient, ClusterQueryResponse, StepDurationSample, StepMatrixResponse}; use crate::components::card::Card; use crate::components::collapsible_card::CollapsibleCardWithIcon; @@ -26,7 +26,7 @@ const STEP_LIMIT: usize = 120; const COMM_LIMIT: usize = 30; const COMM_SQL: &str = - "SELECT local_step, rank, op, group_size, duration_ms, bytes, tp_rank, pp_rank, dp_rank \ + "SELECT local_step, rank, op, group_size, duration_ms, bytes, role \ FROM python.comm_collective ORDER BY timestamp DESC LIMIT "; const COMM_SUMMARY_SQL: &str = "SELECT op, count(*) AS n, \ @@ -51,8 +51,9 @@ const STEP_PHASE_SQL: &str = "SELECT step, \ AND module IS NOT NULL AND module != '' AND module != 'None' \ GROUP BY step ORDER BY step"; -const QUICK_PLAYBOOKS: &[(&str, &str)] = &[ +const QUICK_SKILLS: &[(&str, &str)] = &[ ("slow_rank", "Slow rank"), + ("nccl_culprit_victim", "NCCL"), ("comm_bottleneck", "Comm"), ("module_bottleneck", "Bottleneck"), ]; @@ -278,12 +279,12 @@ pub fn Training() -> Element { } } -fn queue_investigate_playbook(playbook_id: String) { - if !load_playbook(&playbook_id).is_some() { +fn queue_investigate_skill(skill_id: String) { + if !load_skill(&skill_id).is_some() { return; } *AGENT_PANEL_OPEN.write() = true; - *AGENT_INPUT.write() = format!("/{playbook_id}"); + *AGENT_INPUT.write() = format!("/{skill_id}"); } #[component] @@ -404,18 +405,18 @@ fn StepDetailLoaded(sel: SelectedStep) -> Element { } } div { class: "flex flex-wrap gap-1.5", - for (id, label) in QUICK_PLAYBOOKS { + for (id, label) in QUICK_SKILLS { ChipButton { label: (*label).to_string(), disabled: ui_agent_busy(), onclick: { - let pid = (*id).to_string(); - move |_| queue_investigate_playbook(pid.clone()) + let skill_id = (*id).to_string(); + move |_| queue_investigate_skill(skill_id.clone()) }, } } } - p { class: "text-[10px] text-gray-400", "Opens Investigate with playbook · context pinned" } + p { class: "text-[10px] text-gray-400", "Opens Investigate with skill · context pinned" } StepDetailSection { title: "Span breakdown", hint: "Nested spans in this train.step (forward / backward / optim)", @@ -1317,7 +1318,7 @@ fn render_module_hotspots( } } p { class: "text-xs text-gray-400", - "Select a slow step above, or use Investigate → Bottleneck playbook for deeper analysis." + "Select a slow step above, or use Investigate → Bottleneck skill for deeper analysis." } } }, diff --git a/web/src/state/agent.rs b/web/src/state/agent.rs index 676c9b12..471acdbf 100644 --- a/web/src/state/agent.rs +++ b/web/src/state/agent.rs @@ -37,7 +37,7 @@ pub struct AgentStepCardData { pub enum AgentMessageKind { User, Assistant, - PlaybookRun, + SkillRun, StepCard, Error, } @@ -47,8 +47,8 @@ pub struct AgentMessage { pub kind: AgentMessageKind, pub text: String, pub title: Option, - pub playbook_id: Option, - pub playbook_category: Option, + pub skill_id: Option, + pub skill_category: Option, pub step: Option, } @@ -58,8 +58,8 @@ impl AgentMessage { kind: AgentMessageKind::User, text, title: None, - playbook_id: None, - playbook_category: None, + skill_id: None, + skill_category: None, step: None, } } @@ -69,8 +69,8 @@ impl AgentMessage { kind: AgentMessageKind::Assistant, text, title: None, - playbook_id: None, - playbook_category: None, + skill_id: None, + skill_category: None, step: None, } } @@ -80,24 +80,24 @@ impl AgentMessage { kind: AgentMessageKind::Error, text, title: None, - playbook_id: None, - playbook_category: None, + skill_id: None, + skill_category: None, step: None, } } - pub fn playbook_run( - playbook_id: String, + pub fn skill_run( + skill_id: String, title: String, category: String, docs: String, ) -> Self { Self { - kind: AgentMessageKind::PlaybookRun, + kind: AgentMessageKind::SkillRun, text: docs, title: Some(title), - playbook_id: Some(playbook_id), - playbook_category: Some(category), + skill_id: Some(skill_id), + skill_category: Some(category), step: None, } } @@ -107,8 +107,8 @@ impl AgentMessage { kind: AgentMessageKind::StepCard, text: String::new(), title: None, - playbook_id: None, - playbook_category: None, + skill_id: None, + skill_category: None, step: Some(step), } } @@ -122,7 +122,7 @@ pub static AGENT_MESSAGES: GlobalSignal> = Signal::global(Vec: #[derive(Clone, Debug, PartialEq)] pub enum AgentPendingAction { SubmitText(String), - RunPlaybook(String), + RunSkill(String), } pub static AGENT_PENDING_ACTION: GlobalSignal> = Signal::global(|| None); diff --git a/web/src/state/page_context.rs b/web/src/state/page_context.rs index 4509e3f2..493d2bb1 100644 --- a/web/src/state/page_context.rs +++ b/web/src/state/page_context.rs @@ -10,7 +10,7 @@ pub struct PageContext { pub title: String, pub path: String, pub description: String, - pub suggested_playbooks: Vec, + pub suggested_skills: Vec, pub investigation_summary: String, /// Extra hints pushed by the active page component (optional). pub local_hints: Vec, @@ -35,10 +35,10 @@ impl PageContext { if !self.local_hints.is_empty() { lines.push(format!("Page hints: {}", self.local_hints.join("; "))); } - if !self.suggested_playbooks.is_empty() { + if !self.suggested_skills.is_empty() { lines.push(format!( - "Suggested playbooks on this page: {}", - self.suggested_playbooks.join(", ") + "Suggested skills on this page: {}", + self.suggested_skills.join(", ") )); } if self.snapshot_loading { @@ -75,7 +75,7 @@ pub fn apply_page_descriptor( title: String, path: String, description: String, - suggested_playbooks: Vec, + suggested_skills: Vec, investigation_summary: String, ) { let mut ctx = PAGE_CONTEXT.read().clone(); @@ -84,7 +84,7 @@ pub fn apply_page_descriptor( ctx.title = title; ctx.path = path; ctx.description = description; - ctx.suggested_playbooks = suggested_playbooks; + ctx.suggested_skills = suggested_skills; ctx.investigation_summary = investigation_summary; if route_changed { ctx.local_hints.clear(); diff --git a/web/src/state/profiling.rs b/web/src/state/profiling.rs index bc55c555..7f10680c 100644 --- a/web/src/state/profiling.rs +++ b/web/src/state/profiling.rs @@ -6,7 +6,7 @@ pub static PROFILING_TORCH_ENABLED: GlobalSignal = Signal::global(|| false /// Set after the first successful profiler config fetch (gates auto flamegraph load). pub static PROFILING_CONFIG_LOADED: GlobalSignal = Signal::global(|| false); -/// Normalize URL slug or legacy view id to a canonical profiling view. +/// Normalize URL slug to a canonical profiling view. pub fn normalize_profiling_view(view: &str) -> &'static str { let view = view.trim().trim_matches('/'); match view { diff --git a/web/src/state/ui_tasks.rs b/web/src/state/ui_tasks.rs index 680a2247..57ca422a 100644 --- a/web/src/state/ui_tasks.rs +++ b/web/src/state/ui_tasks.rs @@ -12,7 +12,7 @@ const MAX_TASKS: usize = 24; pub enum UiTaskKind { Agent, Snapshot, - Playbook, + Skill, #[allow(dead_code)] // reserved for Command Panel / SQL tasks Query, } @@ -22,7 +22,7 @@ impl UiTaskKind { match self { UiTaskKind::Agent => "Agent", UiTaskKind::Snapshot => "Snapshot", - UiTaskKind::Playbook => "Playbook", + UiTaskKind::Skill => "Skill", UiTaskKind::Query => "Query", } } @@ -205,7 +205,7 @@ pub struct UiTaskSession { } impl UiTaskSession { - /// Start a new cancellable session (Agent / playbook run). + /// Start a new cancellable session (Agent / skill run). pub fn start() -> Self { let mut state = UI_TASKS.write(); let group_id = state.next_group_id; @@ -376,7 +376,7 @@ pub fn any_ui_task_running() -> bool { running_ui_task_count() > 0 } -/// True while an Agent session has running work (replaces legacy `AGENT_RUNNING`). +/// True while an Agent session has running work. pub fn ui_agent_busy() -> bool { let state = UI_TASKS.read(); let Some(gid) = state.active_agent_group else { diff --git a/web/src/utils/markdown.rs b/web/src/utils/markdown.rs index 39ad741b..037072d8 100644 --- a/web/src/utils/markdown.rs +++ b/web/src/utils/markdown.rs @@ -1,4 +1,4 @@ -//! Markdown → HTML for agent chat and playbook summaries. +//! Markdown → HTML for agent chat and skill summaries. use pulldown_cmark::{html, Options, Parser}; From baf82f72c4ea3daedfdbe2404701cd7203bb1d33 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sat, 20 Jun 2026 23:18:19 +0800 Subject: [PATCH 02/37] Remove .cargo/config.toml and enhance contributing documentation (#48) * Remove .cargo/config.toml and update setup-build-env action to include clippy; streamline contributing documentation links * Refactor InjectionTrait implementation and remove GenericInjection struct - Removed the GenericInjection struct from injection_trait.rs to simplify the codebase. - Updated the InjectionTrait implementation in injection.rs to use a more concise lifetime annotation. - Improved safety comments regarding pointer conversions in the inject method for clarity. * Update Cargo.toml and .cargo/config.toml for improved build performance and debugging - Removed unused cargo-features from Cargo.toml. - Added optimized debug profile settings for faster compilation and smaller artifacts. - Introduced a new .cargo/config.toml file to specify custom Rust flags for specific targets, enhancing build configurations for both native and WASM environments. - Updated nccl-profiler source files to improve code safety and clarity, including adjustments to pointer handling and struct definitions. - Refactored Python extension features to utilize thread-local storage for better performance and safety in concurrent environments. * Update Rust toolchain from nightly to stable in GitHub workflows and setup action - Changed the Rust toolchain from nightly to stable in the setup-build-env action. - Updated pypi.yml and test.yml workflows to use the stable toolchain for consistency across builds. * Update contributing and installation documentation to clarify Rust stable requirements - Revised contributing.md and contributing.zh.md to specify the need for Rust stable and provided installation instructions. - Updated installation.md and installation.zh.md to reflect Rust stable as a prerequisite for building from source and included installation commands. - Enhanced clarity in documentation regarding environment setup for contributors. * Update .cargo/config.toml to comment out optional Rust flags for Linux target - Commented out the Rust flags for the x86_64-unknown-linux-gnu target to prevent potential CI issues, while retaining the option for local speedup during development. * Refactor syscall handling in current_thread_id function for Linux target - Simplified the return statement in the current_thread_id function by removing the explicit return keyword, enhancing code clarity and consistency across platforms. * Refactor CPU and GPU backend discovery for improved clarity and performance - Updated the CPU sampler implementation to remove unnecessary type casting, enhancing code readability. - Simplified the backend discovery logic for GPU by using option types to handle CUDA and Apple Silicon backends, improving maintainability and clarity. - Refactored the `host_sampler` function to streamline the return statements, ensuring consistency across different target platforms. * Refactor signal handling in stack_tracer.rs for improved clarity - Removed unnecessary thread ID parameter from the trace_thread_signal function, simplifying the logic for signal handling. - Updated conditional checks to streamline signal processing for the current thread, enhancing code readability and maintainability. - Cleaned up unused variables to improve overall code clarity. * Update Makefile and GitHub workflow for improved build output and test execution - Modified the Makefile to specify output directory for the wheel build, enhancing clarity in build artifacts. - Removed redundant Clippy linting step from the GitHub workflow to streamline the CI process. - Adjusted Rust test execution in the workflow to avoid unnecessary environment sourcing, improving efficiency. * Update Makefile and GitHub actions for enhanced build features and code clarity - Updated the Makefile to include new features for the Maturin build process, improving support for extension modules and kmsg. - Modified the GitHub actions workflow to cache Rust artifacts more effectively and streamline code style checks. - Refactored imports in Rust source files for improved readability and consistency across the codebase. * Enhance GitHub workflows with caching and build optimizations - Added a new input for enabling Rust caching in the setup-build-env action to improve build performance. - Implemented caching for web UI builds in multiple workflows to speed up the build process. - Updated the Python setup to cache pip dependencies, enhancing efficiency in test workflows. - Refactored the wheel bundle preparation steps to skip frontend cleaning when the build output already exists, streamlining the process. * Update GitHub workflow to improve code style checking command - Modified the code style checking step in the GitHub Actions workflow to use a subshell for the `cd` command, enhancing clarity and ensuring the command executes in the correct directory context. * Enhance Makefile and GitHub workflows for improved build and testing processes - Added a new target in the Makefile for creating a Python virtual environment, streamlining dependency management. - Updated the installation steps in the Makefile to ensure build dependencies are installed in the virtual environment. - Modified GitHub workflows to utilize the new virtual environment setup, improving consistency in the build process. - Adjusted caching strategies in workflows to optimize performance and reduce redundant installations. * Refactor CUDA backend handling for improved stability and clarity - Updated the CudaBackend implementation to avoid panics when libcuda is absent, enhancing robustness in CI and CPU-only environments. - Introduced a new probing mechanism to check for CUDA availability without causing fatal errors. - Added tests to ensure backend discovery is idempotent and does not abort when CUDA is unavailable. - Adjusted Makefile to refine Python wheel testing arguments and coverage reporting, improving test execution consistency. * Fix CString creation in CUDA backend to correctly dereference names - Updated the CString creation in the CUDA backend to dereference the name variable, ensuring proper handling of string literals. - This change enhances the robustness of the libcuda driver readiness check by preventing potential runtime errors. * Enhance probing package structure and validation checks - Updated the Makefile to include additional validation for bundled skills and web assets during installation, ensuring critical files are present. - Refactored the web_assets and skills paths modules to improve directory resolution and resource handling, enhancing the reliability of asset loading. - Improved the README documentation for diagnostic skills, clarifying the authoring process and installation instructions. - Added tests to verify the existence of bundled skills and web assets, ensuring proper functionality in both wheel and editable installations. * Update Makefile and GitHub workflows for enhanced dependency management and skill bundling - Added a new target in the Makefile for installing wheel test dependencies, improving testing capabilities. - Refactored paths in the Makefile to use 'bundled_skills' and 'bundled_web' for better organization of assets. - Updated GitHub workflows to utilize caching for Python virtual environments and web UI builds, optimizing build performance. - Introduced new skills and their corresponding YAML configurations for improved diagnostics and monitoring capabilities. * Update .gitignore to remove unnecessary probing directories - Removed the _skills and _web directories from the .gitignore file, allowing for better tracking of relevant files in the probing package. - This change enhances the visibility of important assets during development and testing. * Refactor global federation tests to use fixtures for cluster node checks - Replaced the `@pytest.mark.skipif` decorator with a new fixture `_require_cluster_nodes` to defer engine probe until fixtures run, improving test clarity and execution flow. - This change ensures that tests only skip when necessary, enhancing the robustness of the testing framework. * Update Makefile and GitHub workflows for improved coverage reporting - Refactored the `coverage-rust` target in the Makefile to streamline the command for running Rust coverage, enhancing clarity and consistency. - Updated the GitHub workflow to align with the changes in the Makefile, ensuring that the coverage reporting process is more efficient and easier to maintain. * Enhance probing engine readiness check in regression tests - Updated the `_wait_for_probing_engine` fixture to implement a more robust waiting mechanism, ensuring the in-process probing engine is ready before executing tests. This includes a 30-second timeout with error handling for better reliability. - Removed the `_table_exists` function and `_require_cluster_nodes` fixture from global federation tests, simplifying the test setup. - Adjusted imports in REPL test files to ensure necessary modules are only imported when required, improving test efficiency. * Refactor GitHub Actions for improved caching and environment setup - Updated the setup-build-env action to clarify caching behavior, focusing on environment caching without compile artifacts. - Removed unnecessary caching options for web UI and Rust build artifacts to streamline the workflow. - Adjusted workflow configurations in pypi.yml and test.yml to disable web UI caching and ensure consistent virtual environment caching settings. --- .cargo/config.toml | 14 +-- .github/actions/setup-build-env/action.yml | 89 +++++++++++++---- .github/workflows/docs.yml | 4 + .github/workflows/pypi.yml | 33 +++++-- .github/workflows/test.yml | 62 +++++++----- .gitignore | 2 - Cargo.toml | 9 +- Makefile | 75 ++++++++++----- docs/mkdocs.yml | 5 +- docs/src/contributing.md | 29 +++--- docs/src/contributing.zh.md | 29 +++--- docs/src/design/cluster-pulsing.md | 4 +- docs/src/design/extensibility.md | 6 +- docs/src/design/extensibility.zh.md | 6 +- docs/src/design/modularity.md | 4 +- docs/src/design/modularity.zh.md | 4 +- docs/src/design/nccl-profiler.md | 4 +- docs/src/design/nccl-profiler.zh.md | 4 +- docs/src/design/profiling.md | 2 +- docs/src/design/profiling.zh.md | 2 +- docs/src/guide/skills.md | 2 +- docs/src/guide/sql-analytics.md | 2 +- docs/src/guide/sql-analytics.zh.md | 2 +- docs/src/installation.md | 5 +- docs/src/installation.zh.md | 5 +- docs/src/reference/sql-tables.md | 4 +- docs/src/reference/sql-tables.zh.md | 4 +- probing/cli/src/inject/injection.rs | 8 +- probing/cli/src/inject/injection_trait.rs | 26 ----- probing/core/src/trace/span.rs | 2 +- .../extensions/cc/src/extensions/cpu/linux.rs | 6 +- .../cc/src/extensions/cpu/sampler.rs | 4 +- probing/extensions/cc/src/extensions/rdma.rs | 2 +- probing/extensions/gpu/Cargo.toml | 2 +- .../gpu/src/extensions/backend/cuda/mod.rs | 96 +++++++++++++++++-- .../gpu/src/extensions/backend/registry.rs | 77 ++++++++++----- .../nccl-profiler/src/abi/profiler_v3.rs | 3 + .../extensions/nccl-profiler/src/events.rs | 5 +- .../extensions/nccl-profiler/src/plugin.rs | 4 +- probing/extensions/nccl-profiler/src/pool.rs | 1 + probing/extensions/nccl-profiler/src/state.rs | 34 +++---- .../extensions/python/src/features/pprof.rs | 22 +++-- .../extensions/python/src/features/spy/mod.rs | 44 ++++++--- .../python/src/features/stack_tracer.rs | 5 +- .../python/src/features/vm_tracer.rs | 91 ++++++++++-------- probing/extensions/python/src/lib.rs | 2 - pyproject.toml | 8 +- python/probing/_skills/README.md | 14 --- python/probing/bundled_skills/README.md | 64 +++++++++++++ .../{_skills => bundled_skills}/catalog.yaml | 0 .../comm_bottleneck/SKILL.md | 0 .../comm_bottleneck/steps.yaml | 0 .../gpu_pressure/SKILL.md | 0 .../gpu_pressure/steps.yaml | 0 .../health_overview/SKILL.md | 0 .../health_overview/steps.yaml | 0 .../{_skills => bundled_skills}/install.sh | 0 .../memory_leak/SKILL.md | 0 .../memory_leak/steps.yaml | 0 .../module_bottleneck/SKILL.md | 0 .../module_bottleneck/steps.yaml | 0 .../nccl_culprit_victim/SKILL.md | 0 .../nccl_culprit_victim/steps.yaml | 0 .../semantic/intents.yaml | 0 .../semantic/pages.yaml | 0 .../semantic/tables.yaml | 0 .../slow_rank/SKILL.md | 0 .../slow_rank/steps.yaml | 0 .../training_hang/SKILL.md | 0 .../training_hang/steps.yaml | 0 python/probing/skills/README.md | 4 +- python/probing/skills/paths.py | 27 +++++- python/probing/web_assets.py | 38 +++++++- tests/conftest.py | 28 +++++- tests/regression/conftest.py | 20 +++- .../regression/core/test_global_federation.py | 25 ----- tests/regression/repl/test_help_magic.py | 7 +- tests/regression/repl/test_query_magic.py | 9 +- tests/regression/skills/test_install_tools.py | 17 +++- tests/unit/probing/test_web_assets.py | 17 +++- web/Cargo.toml | 6 ++ web/src/agent/interpret.rs | 2 +- web/src/agent/llm.rs | 4 +- web/src/agent/mod.rs | 6 +- web/src/agent/routing.rs | 4 +- web/src/agent/runner.rs | 4 +- web/src/agent/skill.rs | 10 +- web/src/agent/source_bridge.rs | 10 +- web/src/components/agent/chat.rs | 20 +--- .../components/timeline_viewer/overview.rs | 5 +- web/src/pages/training.rs | 15 +-- web/src/state/agent.rs | 7 +- 92 files changed, 772 insertions(+), 444 deletions(-) delete mode 100644 python/probing/_skills/README.md create mode 100644 python/probing/bundled_skills/README.md rename python/probing/{_skills => bundled_skills}/catalog.yaml (100%) rename python/probing/{_skills => bundled_skills}/comm_bottleneck/SKILL.md (100%) rename python/probing/{_skills => bundled_skills}/comm_bottleneck/steps.yaml (100%) rename python/probing/{_skills => bundled_skills}/gpu_pressure/SKILL.md (100%) rename python/probing/{_skills => bundled_skills}/gpu_pressure/steps.yaml (100%) rename python/probing/{_skills => bundled_skills}/health_overview/SKILL.md (100%) rename python/probing/{_skills => bundled_skills}/health_overview/steps.yaml (100%) rename python/probing/{_skills => bundled_skills}/install.sh (100%) rename python/probing/{_skills => bundled_skills}/memory_leak/SKILL.md (100%) rename python/probing/{_skills => bundled_skills}/memory_leak/steps.yaml (100%) rename python/probing/{_skills => bundled_skills}/module_bottleneck/SKILL.md (100%) rename python/probing/{_skills => bundled_skills}/module_bottleneck/steps.yaml (100%) rename python/probing/{_skills => bundled_skills}/nccl_culprit_victim/SKILL.md (100%) rename python/probing/{_skills => bundled_skills}/nccl_culprit_victim/steps.yaml (100%) rename python/probing/{_skills => bundled_skills}/semantic/intents.yaml (100%) rename python/probing/{_skills => bundled_skills}/semantic/pages.yaml (100%) rename python/probing/{_skills => bundled_skills}/semantic/tables.yaml (100%) rename python/probing/{_skills => bundled_skills}/slow_rank/SKILL.md (100%) rename python/probing/{_skills => bundled_skills}/slow_rank/steps.yaml (100%) rename python/probing/{_skills => bundled_skills}/training_hang/SKILL.md (100%) rename python/probing/{_skills => bundled_skills}/training_hang/steps.yaml (100%) diff --git a/.cargo/config.toml b/.cargo/config.toml index 3fc23665..73a6f51b 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,13 +1,7 @@ -[target.x86_64-unknown-linux-gnu] -rustflags = ["-C", "linker=clang", "-C", "link-arg=-fuse-ld=mold"] +# Optional local speedup on Linux (do not commit — CI may not have mold): +# [target.x86_64-unknown-linux-gnu] +# rustflags = ["-C", "linker=clang", "-C", "link-arg=-fuse-ld=mold"] -# Nightly rustc can emit DWARF that dioxus' bundled binaryen (wasm-opt) cannot parse, -# causing SIGABRT during release web builds. Skip debuginfo for wasm so wasm-opt succeeds. +# dioxus' wasm-opt chokes on some DWARF; skip debuginfo for wasm dev builds. [target.wasm32-unknown-unknown] rustflags = ["-C", "debuginfo=0"] - -[unstable] -codegen-backend = true - -[profile.dev] -codegen-backend = "cranelift" diff --git a/.github/actions/setup-build-env/action.yml b/.github/actions/setup-build-env/action.yml index 6c5fd103..ecc44674 100644 --- a/.github/actions/setup-build-env/action.yml +++ b/.github/actions/setup-build-env/action.yml @@ -1,16 +1,36 @@ name: 'Setup Build Environment' -description: 'Setup Python, Rust, and build tools with caching' +description: 'Setup Python, Rust, and build tools; cache env only (venv, cargo CLI) — not compile artifacts' inputs: python-version: description: 'Python version to use' required: false default: '3.12' install-cargo-tools: - description: 'Whether to install cargo tools' + description: 'Whether to install cargo tools (dx, nextest, zigbuild, rnr)' required: false default: 'true' install-python-deps: - description: 'Whether to install Python build dependencies' + description: 'Whether to install maturin/build deps into .venv' + required: false + default: 'false' + enable-rust: + description: 'Install Rust toolchain and targets' + required: false + default: 'true' + enable-zig: + description: 'Install Zig (manylinux / cross builds)' + required: false + default: 'true' + enable-uv: + description: 'Install uv (no GitHub cache — avoids extra cache uploads)' + required: false + default: 'true' + cache-venv: + description: 'Cache project .venv (pip deps)' + required: false + default: 'true' + cache-wheel-test-deps: + description: 'Include pytest+torch wheel-test deps in .venv cache key' required: false default: 'false' dx-version: @@ -21,19 +41,39 @@ inputs: runs: using: 'composite' steps: + - name: Compute cache keys + id: cache-keys + shell: bash + run: | + echo "python_env<> "$GITHUB_OUTPUT" + echo "${{ hashFiles('pyproject.toml', 'Makefile', 'uv.lock') }}" >> "$GITHUB_OUTPUT" + echo "EOF" >> "$GITHUB_OUTPUT" + - name: Set up Python uses: actions/setup-python@v5 with: python-version: ${{ inputs.python-version }} + - name: Cache project venv + if: inputs.cache-venv == 'true' + uses: actions/cache@v4 + with: + path: .venv + key: venv-v1-${{ runner.os }}-py${{ inputs.python-version }}-${{ steps.cache-keys.outputs.python_env }}${{ inputs.cache-wheel-test-deps == 'true' && '-wheeltest' || '' }}${{ inputs.install-python-deps == 'true' && '-build' || '' }} + restore-keys: | + venv-v1-${{ runner.os }}-py${{ inputs.python-version }}-${{ steps.cache-keys.outputs.python_env }}- + venv-v1-${{ runner.os }}-py${{ inputs.python-version }}- + - name: Install Rust toolchain + if: inputs.enable-rust == 'true' uses: actions-rust-lang/setup-rust-toolchain@v1 with: - toolchain: nightly - components: rustfmt + toolchain: stable + components: rustfmt, clippy rustflags: "" - name: Add Rust Targets + if: inputs.enable-rust == 'true' shell: bash run: | if [ "${{ runner.os }}" == "Linux" ]; then @@ -43,27 +83,27 @@ runs: fi - name: Install uv + if: inputs.enable-uv == 'true' uses: astral-sh/setup-uv@v6 with: - enable-cache: true + enable-cache: false - name: Install Zig toolchain + if: inputs.enable-zig == 'true' uses: mlugg/setup-zig@v2 - - name: Cache dependencies - id: cache-deps + - name: Cache cargo-installed CLI tools + if: inputs.install-cargo-tools == 'true' uses: actions/cache@v4 with: path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - ~/zig - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + ~/.cargo/bin/cargo-nextest + ~/.cargo/bin/cargo-zigbuild + ~/.cargo/bin/rnr + key: cargo-cli-v1-${{ runner.os }}-nextest-zigbuild-rnr + restore-keys: | + cargo-cli-v1-${{ runner.os }}- - # Prebuilt dx from GitHub Releases (no API rate limits). Official alternative: - # DioxusLabs/dioxus-ci/actions/install-dioxus-cli (uses cargo-binstall internally). - name: Install dioxus CLI (dx) if: inputs.install-cargo-tools == 'true' uses: taiki-e/install-action@v2 @@ -74,13 +114,20 @@ runs: if: inputs.install-cargo-tools == 'true' shell: bash run: | - test -e ~/.cargo/bin/cargo-zigbuild || cargo install cargo-zigbuild + test -e ~/.cargo/bin/cargo-zigbuild || cargo install cargo-zigbuild --locked test -e ~/.cargo/bin/rnr || cargo install rnr test -e ~/.cargo/bin/cargo-nextest || cargo install --locked cargo-nextest - - name: Install Python Build Dependencies + - name: Create project venv + shell: bash + run: make venv + + - name: Install Python build dependencies into venv if: inputs.install-python-deps == 'true' shell: bash - run: | - python -m pip install --upgrade pip - pip install build wheel toml maturin + run: make install-build-deps + + - name: Install wheel-test Python dependencies into venv + if: inputs.cache-wheel-test-deps == 'true' + shell: bash + run: make install-wheel-test-deps diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index fcaf4345..4007b119 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -33,6 +33,8 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.11' + cache: pip + cache-dependency-path: docs/requirements.txt - name: Install dependencies run: | @@ -67,6 +69,8 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.11' + cache: pip + cache-dependency-path: docs/requirements.txt - name: Install dependencies run: | diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 6891b2de..bd75886c 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -35,9 +35,16 @@ jobs: python-version: '3.12' install-cargo-tools: 'true' install-python-deps: 'false' + cache-venv: 'false' - name: Prepare wheel bundle - run: make frontend wheel-bundle nccl-profiler-lib + env: + SKIP_FRONTEND_CLEAN: "1" + run: | + if [ ! -f web/dist/index.html ]; then + make frontend + fi + make wheel-bundle nccl-profiler-lib - name: Build wheels uses: PyO3/maturin-action@v1 @@ -46,7 +53,7 @@ jobs: args: --release --out dist --zig --compatibility manylinux2014 --auditwheel repair --features extension-module,gpu,gpu-cuda,kmsg sccache: "true" manylinux: auto - rust-toolchain: nightly + rust-toolchain: stable - name: Upload wheels uses: actions/upload-artifact@v4 @@ -67,9 +74,16 @@ jobs: python-version: '3.12' install-cargo-tools: 'true' install-python-deps: 'false' + cache-venv: 'false' - name: Prepare wheel bundle - run: make frontend wheel-bundle + env: + SKIP_FRONTEND_CLEAN: "1" + run: | + if [ ! -f web/dist/index.html ]; then + make frontend + fi + make wheel-bundle - name: Build wheels uses: PyO3/maturin-action@v1 @@ -77,7 +91,7 @@ jobs: target: ${{ matrix.target }} args: --release --out dist --find-interpreter --features extension-module,gpu,kmsg sccache: "true" - rust-toolchain: nightly + rust-toolchain: stable - name: Upload wheels uses: actions/upload-artifact@v4 @@ -94,16 +108,23 @@ jobs: with: install-python-deps: 'false' install-cargo-tools: 'true' + cache-venv: 'false' - name: Prepare wheel bundle - run: make frontend wheel-bundle nccl-profiler-lib + env: + SKIP_FRONTEND_CLEAN: "1" + run: | + if [ ! -f web/dist/index.html ]; then + make frontend + fi + make wheel-bundle nccl-profiler-lib - name: Build sdist uses: PyO3/maturin-action@v1 with: command: sdist args: --out dist --features extension-module,gpu,kmsg - rust-toolchain: nightly + rust-toolchain: stable - name: Upload sdist uses: actions/upload-artifact@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0050ec06..9d9d2a66 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,17 +18,24 @@ jobs: python-version: "3.12" install-cargo-tools: "true" install-python-deps: "true" + cache-venv: "true" + cache-wheel-test-deps: "true" - name: Code style checking + working-directory: ${{ github.workspace }} run: | cargo fmt --all -- --check + (cd web && cargo fmt --all -- --check) make lint-rust - - name: Cache Rust artifacts - uses: Swatinem/rust-cache@v2 - - name: Build wheel - run: make frontend wheel-ci + env: + SKIP_FRONTEND_CLEAN: "1" + run: | + if [ ! -f web/dist/index.html ]; then + make frontend + fi + make wheel-ci - name: Install wheel and run Python tests run: | @@ -62,10 +69,17 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + - name: Setup Python test environment + uses: ./.github/actions/setup-build-env with: python-version: ${{ matrix.python-version }} + install-cargo-tools: "false" + install-python-deps: "false" + enable-rust: "false" + enable-zig: "false" + enable-uv: "false" + cache-venv: "false" + cache-wheel-test-deps: "true" - name: Download wheel uses: actions/download-artifact@v4 @@ -74,6 +88,7 @@ jobs: path: dist - name: Install wheel and run tests + working-directory: ${{ github.workspace }} run: | make install-wheel make test-python-wheel @@ -91,16 +106,12 @@ jobs: with: python-version: "3.12" install-cargo-tools: "true" - install-python-deps: "true" - - - name: Cache Rust artifacts - uses: Swatinem/rust-cache@v2 - - - name: Clippy (workspace + web) - run: make lint-rust + install-python-deps: "false" + cache-venv: "false" + enable-zig: "false" - name: Install llvm-tools-preview component - run: rustup component add llvm-tools-preview --toolchain nightly + run: rustup component add llvm-tools-preview --toolchain stable - name: Install cargo-llvm-cov uses: taiki-e/install-action@cargo-llvm-cov @@ -108,13 +119,11 @@ jobs: - name: Run Rust tests and collect coverage shell: bash run: | - source <(cargo llvm-cov show-env --export-prefix) - export CARGO_TARGET_DIR=$CARGO_LLVM_COV_TARGET_DIR - export CARGO_INCREMENTAL=1 cargo llvm-cov clean --workspace + # Do not source show-env here — llvm-cov nextest sets instrumentation itself. # extension-module is for the Python wheel only; omit it in lib tests (PyO3 linking). - cargo llvm-cov nextest run --workspace --no-default-features - cargo llvm-cov nextest run -p probing-server --no-default-features --features kmsg,gpu,gpu-cuda + cargo llvm-cov nextest --workspace --no-default-features + cargo llvm-cov nextest -p probing-server --no-default-features --features kmsg,gpu,gpu-cuda cargo llvm-cov report --lcov --output-path coverage.lcov - name: Upload Rust coverage report @@ -136,9 +145,8 @@ jobs: python-version: "3.12" install-cargo-tools: "true" install-python-deps: "true" - - - name: Cache Rust artifacts - uses: Swatinem/rust-cache@v2 + cache-venv: "true" + cache-wheel-test-deps: "true" - name: Run Rust tests run: | @@ -146,12 +154,16 @@ jobs: cargo nextest run -p probing-server --no-default-features --features kmsg,gpu - name: Build frontend and wheel, install, and run Python tests + env: + SKIP_FRONTEND_CLEAN: "1" + PROBING: "1" run: | - make frontend wheel-ci + if [ ! -f web/dist/index.html ]; then + make frontend + fi + make wheel-ci make install-wheel make test-python-wheel - env: - PROBING: "1" codecov: name: Upload coverage to Codecov diff --git a/.gitignore b/.gitignore index 4ebbdd1d..f00f94e9 100644 --- a/.gitignore +++ b/.gitignore @@ -26,8 +26,6 @@ pkg/ *.pyc venv/ python/probing/probing -python/probing/_skills/ -python/probing/_web/ .claude/ *.pth.tar docs/site/ diff --git a/Cargo.toml b/Cargo.toml index d5a94729..56715e1d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,3 @@ -cargo-features = ["codegen-backend"] - [workspace] members = [ # "app", @@ -110,6 +108,13 @@ pyo3 = { version = "0.29.0", default-features = false, features = [ [build-dependencies] pyo3-build-config = "0.29.0" +# Faster compile + smaller artifacts than default dev (full DWARF). +# Line tables still support breakpoints / backtraces; use `DEBUG=1 make develop` for this profile. +[profile.dev] +debug = 1 +split-debuginfo = "unpacked" +codegen-units = 256 + [profile.release] opt-level = "z" # Optimize for size. panic = "unwind" diff --git a/Makefile b/Makefile index 9bc78ce5..42df75a2 100644 --- a/Makefile +++ b/Makefile @@ -17,9 +17,9 @@ endif UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) - MATURIN_FEATURES := gpu,gpu-cuda + MATURIN_FEATURES := extension-module,gpu,gpu-cuda,kmsg else - MATURIN_FEATURES := gpu + MATURIN_FEATURES := extension-module,gpu,kmsg endif MATURIN_FLAGS := $(MATURIN_RELEASE) --features $(MATURIN_FEATURES) @@ -32,6 +32,7 @@ endif endif PYTHON ?= $(shell test -x .venv/bin/python && echo .venv/bin/python || echo python3) +BUILD_PY_DEPS := build wheel toml maturin DEV_PTH := python/probing/dev_pth.py DEV_PY_DEPS := pyyaml pytest pytest-cov coverage ipython ipykernel @@ -54,8 +55,9 @@ help: @echo " core Rebuild probing._core after Rust edits" @echo " frontend Build web/dist/ (dx; manual)" @echo " wheel Build dist/*.whl (needs web/dist/; bundles skills + UI)" - @echo " wheel-ci wheel with zig cross-compile on Linux" + @echo " wheel-ci alias for wheel (native build; PyPI uses maturin-action + zig)" @echo " install-wheel pip install dist/probing-*.whl" + @echo " venv create/refresh project .venv (used by develop and CI)" @echo " test / lint Full test and lint suites" @echo " check-dev Quick env sanity check" @echo " clean Remove build artifacts" @@ -81,12 +83,25 @@ install-dev-python-deps: fi # ============================================================================== -.PHONY: core develop dev check-dev frontend wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib +.PHONY: core develop dev check-dev frontend wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib venv venv-wheel install-build-deps install-wheel-test-deps + +venv: + @test -x .venv/bin/python || $(shell command -v python3 || echo python3) -m venv .venv + .venv/bin/python -m pip install -q -U pip + +# Backward-compatible alias (CI/docs may still reference venv-wheel). +venv-wheel: venv + +install-build-deps: venv + $(PYTHON) -m pip install -q -U pip $(BUILD_PY_DEPS) + +install-wheel-test-deps: venv + $(PYTHON) -m pip install -q -U pip $(PYTEST_WHEEL_DEPS) core: nccl-profiler-lib - maturin develop $(MATURIN_FLAGS) + $(PYTHON) -m maturin develop $(MATURIN_FLAGS) -develop: core install-dev-python-deps +develop: install-build-deps core install-dev-python-deps $(PYTHON) $(DEV_PTH) install @$(MAKE) --no-print-directory check-dev @@ -115,26 +130,27 @@ frontend: wheel-bundle: @test -f web/dist/index.html || { echo "error: run 'make frontend' first"; exit 1; } - rm -rf python/probing/_skills python/probing/_web - cp -R skills python/probing/_skills - cp -R web/dist python/probing/_web + rm -rf python/probing/bundled_skills python/probing/bundled_web + cp -R skills python/probing/bundled_skills + cp -R web/dist python/probing/bundled_web -wheel: wheel-bundle nccl-profiler-lib - maturin build $(MATURIN_FLAGS) +wheel: install-build-deps wheel-bundle nccl-profiler-lib + $(PYTHON) -m maturin build $(MATURIN_FLAGS) --out dist wheel-ci: -ifeq ($(UNAME_S),Linux) - $(MAKE) ZIG=1 wheel -else $(MAKE) wheel -endif -install-wheel: +install-wheel: venv @WH=$$(ls -1 dist/probing-*.whl 2>/dev/null | head -1); \ test -n "$$WH" || { echo "run: make wheel"; exit 1; }; \ $(PYTHON) -m pip install -q -U pip && \ $(PYTHON) -m pip install --force-reinstall "$$WH" && \ - $(PYTHON) -c "import probing; from probing import _core; print('probing', probing.VERSION)" + PROBING=0 $(PYTHON) -c "\ +import probing; from probing import _core; from pathlib import Path; \ +root = Path(probing.__file__).resolve().parent; \ +assert (root / 'bundled_skills' / 'catalog.yaml').is_file(), f'missing bundled skills under {root}'; \ +assert (root / 'bundled_web' / 'index.html').is_file(), f'missing bundled web UI under {root}'; \ +print('probing', probing.VERSION)" # Linux NCCL plugin copied into python/probing/libs/ for the wheel. ifeq ($(UNAME_S),Linux) @@ -154,7 +170,11 @@ endif # ============================================================================== PYTEST_WHEEL_DEPS := pytest pytest-cov coverage pyyaml websockets pandas torch ipykernel -PYTEST_WHEEL_ARGS := tests/unit tests/regression python/probing +# Installed wheel only — do not pass python/probing (conflicts with site-packages). +PYTEST_WHEEL_ARGS := tests/unit tests/regression +# Clear repo pythonpath; sibling unit/regression conftest.py need importlib mode. +# Override addopts to drop --doctest-modules (wheel uses site-packages, not python/). +PYTEST_WHEEL_FLAGS := --import-mode=importlib -o pythonpath= -o "addopts=--verbose --color=yes --durations=10 --strict-markers" PYTEST_WHEEL_EXTRA ?= .PHONY: test test-rust test-rust-unit test-rust-regression test-python test-python-unit test-python-regression test-doctest test-python-wheel coverage-python-wheel @@ -164,14 +184,18 @@ test: test-rust test-python test-rust: test-rust-unit test-rust-regression test-rust-unit: - @if command -v pyenv >/dev/null 2>&1; then \ + @if test -x .venv/bin/python; then \ + export PYTHON_SYS_EXECUTABLE=.venv/bin/python PYO3_PYTHON=.venv/bin/python; \ + elif command -v pyenv >/dev/null 2>&1; then \ P=$$(pyenv which python3 2>/dev/null); \ test -n "$$P" && export PYTHON_SYS_EXECUTABLE=$$P PYO3_PYTHON=$$P; \ fi; \ cargo nextest run --lib --workspace --no-default-features --nff test-rust-regression: - @if command -v pyenv >/dev/null 2>&1; then \ + @if test -x .venv/bin/python; then \ + export PYTHON_SYS_EXECUTABLE=.venv/bin/python PYO3_PYTHON=.venv/bin/python; \ + elif command -v pyenv >/dev/null 2>&1; then \ P=$$(pyenv which python3 2>/dev/null); \ test -n "$$P" && export PYTHON_SYS_EXECUTABLE=$$P PYO3_PYTHON=$$P; \ fi; \ @@ -185,12 +209,11 @@ test-python-regression: check-dev test-doctest: ${PYTEST_RUN} --doctest-modules python/probing --ignore=python/probing/cli/__main__.py -test-python-wheel: - $(PYTHON) -m pip install -q -U pip $(PYTEST_WHEEL_DEPS) - PROBING=1 PYTHONPATH=python/ $(PYTHON) -m pytest $(PYTEST_WHEEL_EXTRA) $(PYTEST_WHEEL_ARGS) +test-python-wheel: venv install-wheel-test-deps + PROBING=1 $(PYTHON) -m pytest $(PYTEST_WHEEL_FLAGS) $(PYTEST_WHEEL_EXTRA) $(PYTEST_WHEEL_ARGS) coverage-python-wheel: - $(MAKE) test-python-wheel PYTEST_WHEEL_EXTRA="--cov=python/probing --cov=tests --cov-report=xml:coverage.xml" + $(MAKE) test-python-wheel PYTEST_WHEEL_EXTRA="--cov=probing --cov=tests --cov-report=xml:coverage.xml" lint: lint-python lint-rust lint-core: @@ -210,7 +233,7 @@ clippy-fix: coverage-rust: cargo llvm-cov clean --workspace - cargo llvm-cov nextest run --workspace --no-default-features --nff --lcov --output-path coverage.lcov --ignore-filename-regex '(.*/tests?/|.*/benches?/|.*/examples?/)' || true + cargo llvm-cov nextest --workspace --no-default-features --nff --lcov --output-path coverage.lcov --ignore-filename-regex '(.*/tests?/|.*/benches?/|.*/examples?/)' || true coverage-python: ${PYTEST_RUN} --cov=python/probing --cov=tests --cov-report=xml:coverage.xml --cov-report=term $(PYTEST_ARGS) || true coverage: coverage-rust coverage-python @@ -229,6 +252,6 @@ docs-clean: @cd docs && $(MAKE) clean clean: - rm -rf dist web/dist docs/site python/probing/_skills python/probing/_web + rm -rf dist web/dist docs/site python/probing/bundled_skills python/probing/bundled_web cargo clean rm -f coverage.lcov coverage.xml coverage.json diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index bdfdd4dc..8aef6972 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -155,10 +155,7 @@ nav: - SQL Tables: reference/sql-tables.md - API Reference: api-reference.md - Versions: versions.md - - Contributing: - - Welcome: contributing.md#getting-started - - Development Setup: contributing.md#development-setup - - Submitting Changes: contributing.md#submitting-changes + - Contributing: contributing.md extra: generator: false diff --git a/docs/src/contributing.md b/docs/src/contributing.md index 8d55d042..d4cd7ceb 100644 --- a/docs/src/contributing.md +++ b/docs/src/contributing.md @@ -10,9 +10,7 @@ Thank you for contributing to Probing. This document is the **canonical developm | Agent diagnostic skills | [Skills & agents](#skills-agents) + [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | | PR / style / conduct | [Submitting changes](#submitting-changes) | - - -## Welcome — get started +## Welcome — get started {#getting-started} Probing is a **layered** project: SQL engine and collectors in Rust, Python SDK and hooks, diagnostic skills, and a Web UI. **You do not need to learn every layer** to contribute — pick a track that matches your background. @@ -28,7 +26,7 @@ make check-dev make test-python-regression # fast Python smoke; or: make test for full suite ``` -If all of the above succeed, your environment is ready. Optional: `./skills/install.sh` so Cursor / Claude / Codex can use repo skills. +If all of the above succeed, your environment is ready. Requires Rust **stable** ([Prerequisites](#prerequisites) if `make develop` fails on the toolchain). Optional: `./skills/install.sh` so Cursor / Claude / Codex can use repo skills. Preview docs while editing: `make docs-install && make docs-serve` → http://127.0.0.1:8000 @@ -60,23 +58,28 @@ Preview docs while editing: `make docs-install && make docs-serve` → http://12 Not sure where your change belongs? Open a [Discussion](https://github.com/DeepLink-org/probing/discussions) or issue first — we are happy to point you to the right layer. - - -## Prerequisites +## Prerequisites {#prerequisites} - **Python** 3.9+ -- **Rust** (latest stable) + **Cargo** +- **Rust (stable channel)** + **Cargo** — the repo and CI build on stable only; nightly is not required - **maturin** — builds `probing._core` (`pip install maturin` or `uv pip install maturin`) - **uv** (optional but recommended) — many devs use `uv venv`; the Makefile falls back to `uv pip` when the venv has no `pip` +Install Rust stable (if you do not have it yet): + +```bash +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +rustup default stable +rustup component add rustfmt clippy +rustc --version # should show a stable release, e.g. rustc 1.xx.x (…) +``` + Optional (release / web UI only): - **dioxus-cli** (`dx`) — `make frontend` builds the web UI; `make wheel` embeds it - **cargo-zigbuild** + **ziglang** — Linux manylinux wheels (`make wheel-ci`) - - -## Development setup +## Development setup {#development-setup} One-time per clone: @@ -256,9 +259,7 @@ probing/ # repo root Architecture layers (what may call what): [Modularity](design/modularity.md). Agent workflow: [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md). - - -## Submitting changes +## Submitting changes {#submitting-changes} ### Pull request process diff --git a/docs/src/contributing.zh.md b/docs/src/contributing.zh.md index 118c3670..8dfd5dbc 100644 --- a/docs/src/contributing.zh.md +++ b/docs/src/contributing.zh.md @@ -10,9 +10,7 @@ | Agent 诊断 skill | [Skills 与 Agent](#skills-agents) + [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | | PR / 规范 / 行为准则 | [提交变更](#submitting-changes) | - - -## 欢迎参与开发 +## 欢迎参与开发 {#getting-started} Probing 是**分层**项目:Rust 里的 SQL 引擎与采集、Python SDK 与 hook、诊断 skill、Web UI。**不必一次学完所有层**——按你的背景选一条贡献路径即可。 @@ -28,7 +26,7 @@ make check-dev make test-python-regression # Python 冒烟;完整套件:make test ``` -以上通过即表示环境就绪。可选:`./skills/install.sh`,让 Cursor / Claude / Codex 加载仓库 skill。 +以上通过即表示环境就绪。需要 Rust **stable**(若 `make develop` 因工具链失败,见 [前提条件](#prerequisites))。可选:`./skills/install.sh`,让 Cursor / Claude / Codex 加载仓库 skill。 本地预览文档:`make docs-install && make docs-serve` → http://127.0.0.1:8000 @@ -60,23 +58,28 @@ make test-python-regression # Python 冒烟;完整套件:make test 不确定改动该落在哪一层?先开 [Discussion](https://github.com/DeepLink-org/probing/discussions) 或 issue,我们可以帮你指路。 - - -## 前提条件 +## 前提条件 {#prerequisites} - **Python** 3.9+ -- **Rust**(最新 stable)+ **Cargo** +- **Rust(stable 通道)** + **Cargo** — 仓库与 CI 均使用 stable 构建;不需要 nightly - **maturin** — 构建 `probing._core`(`pip install maturin` 或 `uv pip install maturin`) - **uv**(可选,推荐)— 常用 `uv venv`;若 venv 无 `pip`,Makefile 会改用 `uv pip` +安装 Rust stable(若尚未安装): + +```bash +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +rustup default stable +rustup component add rustfmt clippy +rustc --version # 应显示 stable,例如 rustc 1.xx.x (…) +``` + 可选(仅发布 / Web UI): - **dioxus-cli**(`dx`)— `make frontend` 构建 Web UI;`make wheel` 将其嵌入 wheel - **cargo-zigbuild** + **ziglang** — Linux manylinux wheel(`make wheel-ci`) - - -## 开发环境 +## 开发环境 {#development-setup} 每个 clone 只需一次: @@ -256,9 +259,7 @@ probing/ # 仓库根 分层与依赖规则:[模块化](design/modularity.zh.md)。 Agent 工作流:[AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md)。 - - -## 提交变更 +## 提交变更 {#submitting-changes} ### Pull Request 流程 diff --git a/docs/src/design/cluster-pulsing.md b/docs/src/design/cluster-pulsing.md index fcf145f9..4a3126fb 100644 --- a/docs/src/design/cluster-pulsing.md +++ b/docs/src/design/cluster-pulsing.md @@ -6,7 +6,7 @@ failure detection for probing cluster discovery, while keeping probing's trainin !!! note "Language" The full design narrative is maintained in Chinese: - **[cluster-pulsing.zh.md](cluster-pulsing.zh.md)**. This page is an English summary. + **[中文版](/zh/design/cluster-pulsing/)**. This page is an English summary. ## Current probing cluster model @@ -48,5 +48,5 @@ flowchart LR ## Related - **[Distributed](distributed.md)** — `global.*`, `cluster query`, `role` -- **[Cluster with Pulsing (中文)](cluster-pulsing.zh.md)** — full design +- **[Cluster with Pulsing (中文)](/zh/design/cluster-pulsing/)** — full design - **[SQL Tables](../reference/sql-tables.md)** — `cluster.nodes` columns diff --git a/docs/src/design/extensibility.md b/docs/src/design/extensibility.md index 2ad85f13..2ded1bec 100644 --- a/docs/src/design/extensibility.md +++ b/docs/src/design/extensibility.md @@ -19,7 +19,7 @@ flowchart LR --- -## Path 1: Table plugin +## Path 1: Table plugin {#path-1-table-plugin-dataclass--table} A table plugin is a Python module that: @@ -166,7 +166,7 @@ WHERE step > (SELECT max(step) - 100 FROM python.step_stats); --- -## Path 2: Diagnostic skill +## Path 2: Diagnostic skill {#path-2-diagnostic-skill} A **skill** packages domain knowledge for *how* to investigate a problem. It does not collect data (use Path 1 for that). Each skill is a directory with a **`SKILL.md`** the agent can read, plus an optional machine-readable step list (`steps.yaml`). @@ -301,7 +301,7 @@ Web Agent loads skill frontmatter for routing (`description` + `tables`), inject Skills may reference **any** SQL table—Path 1 plugin tables, built-in tables (`cpu.utilization`, `gpu.utilization`, `python.torch_trace`, …), and `global.*` for multi-rank fan-out. -See `skills/README.md` and [AGENTS.md](../../../AGENTS.md) for routing, install, and cluster fan-out. +See `skills/README.md` and [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) for routing, install, and cluster fan-out. --- diff --git a/docs/src/design/extensibility.zh.md b/docs/src/design/extensibility.zh.md index 3fecb485..31d7dadf 100644 --- a/docs/src/design/extensibility.zh.md +++ b/docs/src/design/extensibility.zh.md @@ -19,7 +19,7 @@ flowchart LR --- -## 路径 1:表插件 +## 路径 1:表插件 {#path-1-table-plugin-dataclass--table} 表插件是一个 Python 模块,它: @@ -172,7 +172,7 @@ WHERE step > (SELECT max(step) - 100 FROM python.step_stats); --- -## 路径 2:诊断 skill +## 路径 2:诊断 skill {#path-2-diagnostic-skill} **Skill** 打包**如何排查**的领域知识,本身不采集数据(数据用路径 1)。每个 skill 是一个目录:Agent 可读的 **`SKILL.md`**,加上可选的机器可读步骤列表(`steps.yaml`)。 @@ -306,7 +306,7 @@ Web Agent 用 frontmatter 做路由(`description` + `tables`),将 `SKILL.m Skill 可引用**任意** SQL 表——路径 1 插件表、内置表(`cpu.utilization`、`python.torch_trace` 等)、以及多 rank 的 `global.*`。 -详见 `skills/README.md`、[诊断 Skill 用户指南](../guide/skills.zh.md)、[AGENTS.md](../../../AGENTS.md)。 +详见 `skills/README.md`、[诊断 Skill 用户指南](../guide/skills.zh.md)、[AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md)。 --- diff --git a/docs/src/design/modularity.md b/docs/src/design/modularity.md index d8a40ff0..ff15f77e 100644 --- a/docs/src/design/modularity.md +++ b/docs/src/design/modularity.md @@ -415,5 +415,5 @@ Need new raw signals? | [Extensibility](extensibility.md) | Public extension paths (table + skill) | | [Distributed](distributed.md) | Federation & cluster | | [NCCL Profiler](nccl-profiler.md) | NCCL plugin boundary | -| [web/DESIGN.md](../../../web/DESIGN.md) | UI module layout | -| [AGENTS.md](../../../AGENTS.md) | Agent skill usage | +| [web/DESIGN.md](https://github.com/DeepLink-org/probing/blob/main/web/DESIGN.md) | UI module layout | +| [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | Agent skill usage | diff --git a/docs/src/design/modularity.zh.md b/docs/src/design/modularity.zh.md index 94a04816..d73cd1cd 100644 --- a/docs/src/design/modularity.zh.md +++ b/docs/src/design/modularity.zh.md @@ -348,5 +348,5 @@ sequenceDiagram | [扩展机制](extensibility.zh.md) | 对外扩展路径(表 + skill + NCCL) | | [分布式](distributed.zh.md) | 联邦与集群 | | [NCCL Profiler](nccl-profiler.zh.md) | NCCL 插件边界 | -| [web/DESIGN.md](../../../web/DESIGN.md) | 前端模块布局 | -| [AGENTS.md](../../../AGENTS.md) | Agent 使用 skill | +| [web/DESIGN.md](https://github.com/DeepLink-org/probing/blob/main/web/DESIGN.md) | 前端模块布局 | +| [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | Agent 使用 skill | diff --git a/docs/src/design/nccl-profiler.md b/docs/src/design/nccl-profiler.md index 27b25339..9a22571d 100644 --- a/docs/src/design/nccl-profiler.md +++ b/docs/src/design/nccl-profiler.md @@ -141,7 +141,7 @@ make nccl-profiler-lib # Linux .so → python/probing/libs/ cargo test -p probing-nccl-profiler ``` -Crate: `probing/extensions/nccl-profiler/`. See crate [README](../../../probing/extensions/nccl-profiler/README.md) for architecture (slot pools, Coll→ProxyOp→ProxyStep hierarchy, batch flush). +Crate: `probing/extensions/nccl-profiler/`. See crate [README](https://github.com/DeepLink-org/probing/blob/main/probing/extensions/nccl-profiler/README.md) for architecture (slot pools, Coll→ProxyOp→ProxyStep hierarchy, batch flush). ## Smoke test checklist (P0) @@ -154,4 +154,4 @@ Crate: `probing/extensions/nccl-profiler/`. See crate [README](../../../probing/ - [Distributed training](distributed.md) — cluster fan-out, `global.*` - [Extensibility](extensibility.md) — Path 1 (table plugin), Path 2 (skills), Path 3 (this plugin) -- [AGENTS.md](../../../AGENTS.md) — agent skill install and routing +- [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) — agent skill install and routing diff --git a/docs/src/design/nccl-profiler.zh.md b/docs/src/design/nccl-profiler.zh.md index 6eeeadc2..415f5bef 100644 --- a/docs/src/design/nccl-profiler.zh.md +++ b/docs/src/design/nccl-profiler.zh.md @@ -126,7 +126,7 @@ make nccl-profiler-lib cargo test -p probing-nccl-profiler ``` -实现:`probing/extensions/nccl-profiler/`。架构细节见 crate [README](../../../probing/extensions/nccl-profiler/README.md)。 +实现:`probing/extensions/nccl-profiler/`。架构细节见 crate [README](https://github.com/DeepLink-org/probing/blob/main/probing/extensions/nccl-profiler/README.md)。 ## 真机验收清单(P0) @@ -139,4 +139,4 @@ cargo test -p probing-nccl-profiler - [分布式训练](distributed.zh.md) - [扩展机制](extensibility.zh.md) -- [AGENTS.md](../../../AGENTS.md) +- [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) diff --git a/docs/src/design/profiling.md b/docs/src/design/profiling.md index 103917d6..038397d5 100644 --- a/docs/src/design/profiling.md +++ b/docs/src/design/profiling.md @@ -99,7 +99,7 @@ Use `role` + `global_step` to join with `python.comm_collective` on the same ran ### Collective rows (`python.comm_collective`) Lite-mode hooks on `torch.distributed` write one row per collective with `duration_ms`, -`bytes`, `op`, and the same step/role coordinates. See [SQL Tables](../reference/sql-tables.md#python-comm_collective) and [SQL Analytics](../guide/sql-analytics.md#collective-communication-pythoncomm_collective). +`bytes`, `op`, and the same step/role coordinates. See [SQL Tables](../reference/sql-tables.md#python-comm_collective) and [SQL Analytics](../guide/sql-analytics.md#python-comm_collective). ### Enable PyTorch Profiling diff --git a/docs/src/design/profiling.zh.md b/docs/src/design/profiling.zh.md index f98609ba..809f438b 100644 --- a/docs/src/design/profiling.zh.md +++ b/docs/src/design/profiling.zh.md @@ -100,7 +100,7 @@ SELECT * FROM python.torch_trace WHERE step > 10; 对 `torch.distributed` 的 lite 模式钩子每条 collective 写一行,含 `duration_ms`、`bytes`、`op` 及相同 step/role 坐标。见 [SQL 表](../reference/sql-tables.zh.md#python-comm_collective) 与 -[SQL 分析](../guide/sql-analytics.zh.md#集合通信pythoncomm_collective)。 +[SQL 分析](../guide/sql-analytics.zh.md#python-comm_collective)。 ### 启用 PyTorch 分析 diff --git a/docs/src/guide/skills.md b/docs/src/guide/skills.md index 7cc4a70e..92fef2ab 100644 --- a/docs/src/guide/skills.md +++ b/docs/src/guide/skills.md @@ -80,7 +80,7 @@ skills// ``` Semantic metadata (`tables.yaml`, `intents.yaml`) links skills to SQL catalog and Web UI. -See **[Contributing](../contributing.md#skills)** and `skills/semantic/`. +See **[Contributing](../contributing.md#skills-agents)** and `skills/semantic/`. ## Related diff --git a/docs/src/guide/sql-analytics.md b/docs/src/guide/sql-analytics.md index 307923dc..d2db53c8 100644 --- a/docs/src/guide/sql-analytics.md +++ b/docs/src/guide/sql-analytics.md @@ -74,7 +74,7 @@ Sampling (`PROBING_TORCH_PROFILING`): Also stamped on each row: `global_step`, `rank`, `world_size`, `role` (parallel placement key). See [SQL Tables — torch_trace](../reference/sql-tables.md#python-torch_trace). -## Collective communication (`python.comm_collective`) +## Collective communication (`python.comm_collective`) {#python-comm_collective} Records `torch.distributed` collectives with wall-clock `duration_ms` (no NCCL plugin required). diff --git a/docs/src/guide/sql-analytics.zh.md b/docs/src/guide/sql-analytics.zh.md index b07ef63f..458a1bf6 100644 --- a/docs/src/guide/sql-analytics.zh.md +++ b/docs/src/guide/sql-analytics.zh.md @@ -73,7 +73,7 @@ ORDER BY step DESC, seq; 每行还有 `global_step`、`rank`、`world_size`、`role`。见 [SQL 表 — torch_trace](../reference/sql-tables.zh.md#python-torch_trace)。 -## 集合通信(`python.comm_collective`) +## 集合通信(`python.comm_collective`) {#python-comm_collective} 记录 `torch.distributed` 集合操作的墙钟 `duration_ms`(无需 NCCL 插件)。 diff --git a/docs/src/installation.md b/docs/src/installation.md index 2b1bc439..5f93eff0 100644 --- a/docs/src/installation.md +++ b/docs/src/installation.md @@ -8,6 +8,7 @@ Contributors building from a git checkout should follow [Contributing — Develo | Component | Version | |-----------|---------| | Python | 3.7+ (3.9+ recommended for development) | +| Rust (source build only) | stable channel — see [Contributing — Prerequisites](contributing.md#prerequisites) | | OS (full features) | Linux — required for `probing inject` | | OS (in-process only) | macOS / Windows — `PROBING=1` at startup, query/eval via CLI | @@ -61,11 +62,13 @@ On **macOS / Windows**, use `PROBING=1` (or `2`) at startup; injection is not av Use this for CI smoke tests or when you need a locally built wheel — **not** for day-to-day hacking on the repo (use `make develop` instead). +Requires **Rust stable** and optional frontend tools — see [Contributing — Prerequisites](contributing.md#prerequisites). + ```bash git clone https://github.com/DeepLink-org/probing.git cd probing -# Optional: Rust / frontend toolchain — see contributing.md#prerequisites +# Install Rust stable if needed (see contributing.md#prerequisites) make frontend make wheel pip install dist/probing-*.whl --force-reinstall diff --git a/docs/src/installation.zh.md b/docs/src/installation.zh.md index c9f2d029..6c86cc66 100644 --- a/docs/src/installation.zh.md +++ b/docs/src/installation.zh.md @@ -8,6 +8,7 @@ | 组件 | 版本 | |------|------| | Python | 3.7+(开发建议 3.9+) | +| Rust(仅源码构建) | stable 通道 — 见 [贡献指南 — 前提条件](contributing.zh.md#prerequisites) | | 操作系统(完整功能) | Linux — `probing inject` 需要 | | 操作系统(仅进程内) | macOS / Windows — 启动时 `PROBING=1`,CLI query/eval 可用 | @@ -61,11 +62,13 @@ probing -t inject 适用于 CI 冒烟或本地验 wheel — **不是**日常改仓库代码的方式(请用 `make develop`)。 +需要 **Rust stable** 及可选的前端工具链 — 见 [贡献指南 — 前提条件](contributing.zh.md#prerequisites)。 + ```bash git clone https://github.com/DeepLink-org/probing.git cd probing -# 可选:Rust / 前端工具链 — 见 contributing.zh.md#prerequisites +# 若尚未安装 Rust stable,见 contributing.zh.md#prerequisites make frontend make wheel pip install dist/probing-*.whl --force-reinstall diff --git a/docs/src/reference/sql-tables.md b/docs/src/reference/sql-tables.md index 05996923..4b6b887b 100644 --- a/docs/src/reference/sql-tables.md +++ b/docs/src/reference/sql-tables.md @@ -48,7 +48,7 @@ GROUP BY _role, _rank; ## Training & tracing (`python.*`) -### `python.torch_trace` +### `python.torch_trace` {#python-torch_trace} PyTorch module-level forward/step timings and GPU memory snapshots. @@ -78,7 +78,7 @@ by default. --- -### `python.comm_collective` +### `python.comm_collective` {#python-comm_collective} `torch.distributed` collective calls (all_reduce, broadcast, …). diff --git a/docs/src/reference/sql-tables.zh.md b/docs/src/reference/sql-tables.zh.md index 27a4f6f3..9e5537a5 100644 --- a/docs/src/reference/sql-tables.zh.md +++ b/docs/src/reference/sql-tables.zh.md @@ -47,7 +47,7 @@ GROUP BY _role, _rank; ## 训练与 tracing(`python.*`) -### `python.torch_trace` +### `python.torch_trace` {#python-torch_trace} PyTorch 模块级 forward/step 耗时与 GPU 显存快照。 @@ -76,7 +76,7 @@ PyTorch 模块级 forward/step 耗时与 GPU 显存快照。 --- -### `python.comm_collective` +### `python.comm_collective` {#python-comm_collective} `torch.distributed` 集合通信(all_reduce、broadcast 等)。 diff --git a/probing/cli/src/inject/injection.rs b/probing/cli/src/inject/injection.rs index 07b0a14b..96822268 100644 --- a/probing/cli/src/inject/injection.rs +++ b/probing/cli/src/inject/injection.rs @@ -310,14 +310,14 @@ impl<'a> Injection<'a> { } } -impl<'a> InjectionTrait for Injection<'a> { +impl InjectionTrait for Injection<'_> { fn inject(proc: &Process, tracer: &mut pete::Ptracer, tracee: pete::Tracee) -> Result { - // SAFETY: We need to convert &mut pete::Ptracer to &'a mut pete::Ptracer - // This is safe because the returned Injection<'a> will have the same lifetime + // SAFETY: We need to convert &mut pete::Ptracer to a longer-lived reference. + // This is safe because the returned Injection will have the same lifetime // as the tracer reference, and the injection will be removed before the tracer // goes out of scope in perform_injection. unsafe { - let tracer_ref = &mut *(tracer as *mut pete::Ptracer); + let tracer_ref = &mut *std::ptr::from_mut(tracer); Self::inject(proc, tracer_ref, tracee) } } diff --git a/probing/cli/src/inject/injection_trait.rs b/probing/cli/src/inject/injection_trait.rs index 4a124b9e..f45fdf67 100644 --- a/probing/cli/src/inject/injection_trait.rs +++ b/probing/cli/src/inject/injection_trait.rs @@ -22,32 +22,6 @@ pub trait InjectionTrait { fn remove(self) -> Result<()>; } -/// Generic injection handler that works with any platform-specific implementation -pub struct GenericInjection { - inner: T, -} - -impl GenericInjection -where - T: InjectionTrait, -{ - pub fn new(inner: T) -> Self { - Self { inner } - } - - pub fn execute(&mut self, filename: &Path) -> Result<()> { - self.inner.execute(filename) - } - - pub fn setenv(&mut self, name: Option<&str>, value: Option<&str>) -> Result<()> { - self.inner.setenv(name, value) - } - - pub fn remove(self) -> Result<()> { - self.inner.remove() - } -} - /// Generic injection function that works with any platform pub fn perform_injection( proc: &crate::inject::Process, diff --git a/probing/core/src/trace/span.rs b/probing/core/src/trace/span.rs index 7c7f3adc..880fd431 100644 --- a/probing/core/src/trace/span.rs +++ b/probing/core/src/trace/span.rs @@ -20,7 +20,7 @@ fn current_thread_id() -> u64 { } #[cfg(target_os = "linux")] unsafe { - return libc::syscall(libc::SYS_gettid) as u64; + libc::syscall(libc::SYS_gettid) as u64 } #[cfg(not(any(target_os = "macos", target_os = "linux")))] { diff --git a/probing/extensions/cc/src/extensions/cpu/linux.rs b/probing/extensions/cc/src/extensions/cpu/linux.rs index 4645fb0b..3b64d96e 100644 --- a/probing/extensions/cc/src/extensions/cpu/linux.rs +++ b/probing/extensions/cc/src/extensions/cpu/linux.rs @@ -36,8 +36,8 @@ impl CpuHostSampler for LinuxSampler { .ok() .map(|status| { ( - status.voluntary_ctxt_switches.unwrap_or(0) as u64, - status.nonvoluntary_ctxt_switches.unwrap_or(0) as u64, + status.voluntary_ctxt_switches.unwrap_or(0), + status.nonvoluntary_ctxt_switches.unwrap_or(0), ) }) .unwrap_or((0, 0)); @@ -69,7 +69,7 @@ impl CpuHostSampler for LinuxSampler { .filter(|s| !s.is_empty()); threads.push(ThreadSample { - tid: stat.pid as i32, + tid: stat.pid, comm: stat.comm, state: Some(stat.state.to_string()), wchan, diff --git a/probing/extensions/cc/src/extensions/cpu/sampler.rs b/probing/extensions/cc/src/extensions/cpu/sampler.rs index 7265466a..f8515fec 100644 --- a/probing/extensions/cc/src/extensions/cpu/sampler.rs +++ b/probing/extensions/cc/src/extensions/cpu/sampler.rs @@ -16,7 +16,7 @@ pub trait CpuHostSampler: Send + Sync { pub fn host_sampler() -> Box { #[cfg(target_os = "linux")] { - return Box::new(super::linux::LinuxSampler::new()); + Box::new(super::linux::LinuxSampler::new()) } #[cfg(target_os = "macos")] { @@ -24,6 +24,6 @@ pub fn host_sampler() -> Box { } #[cfg(not(any(target_os = "linux", target_os = "macos")))] { - return Box::new(super::unsupported::UnsupportedSampler); + Box::new(super::unsupported::UnsupportedSampler) } } diff --git a/probing/extensions/cc/src/extensions/rdma.rs b/probing/extensions/cc/src/extensions/rdma.rs index ba5b9f7d..6c247b0e 100644 --- a/probing/extensions/cc/src/extensions/rdma.rs +++ b/probing/extensions/cc/src/extensions/rdma.rs @@ -73,7 +73,7 @@ impl CustomTable for RdmaTable { let f64_val = GLOBAL_HCA_SAMPLE_RATE.get_or_init(|| Mutex::new(0.0)); let guard = f64_val.lock().unwrap(); - let sleep_time = guard.clone() as u64; + let sleep_time = *guard as u64; thread::sleep(Duration::from_secs(sleep_time)); diff --git a/probing/extensions/gpu/Cargo.toml b/probing/extensions/gpu/Cargo.toml index f896e844..f74ac89d 100644 --- a/probing/extensions/gpu/Cargo.toml +++ b/probing/extensions/gpu/Cargo.toml @@ -22,6 +22,7 @@ datafusion = { workspace = true } log = { workspace = true } once_cell = { workspace = true } thiserror = { workspace = true } +libc = "0.2" cudarc = { version = "0.19.7", default-features = false, features = [ "dynamic-loading", @@ -31,5 +32,4 @@ cudarc = { version = "0.19.7", default-features = false, features = [ # macOS-only: Metal + sysctl + ioreg. Not resolved when building for Linux. [target.'cfg(target_os = "macos")'.dependencies] -libc = "0.2" metal = "0.31.0" diff --git a/probing/extensions/gpu/src/extensions/backend/cuda/mod.rs b/probing/extensions/gpu/src/extensions/backend/cuda/mod.rs index 981b9bcd..03a5808c 100644 --- a/probing/extensions/gpu/src/extensions/backend/cuda/mod.rs +++ b/probing/extensions/gpu/src/extensions/backend/cuda/mod.rs @@ -2,25 +2,27 @@ mod nvidia_smi; use std::sync::Arc; +use once_cell::sync::Lazy; + use super::traits::{GpuBackend, GpuBackendKind, GpuDeviceInfo, GpuMemoryModel, GpuMemorySample}; use cudarc::driver::safe::CudaContext; use cudarc::driver::sys::CUdevice_attribute; pub use nvidia_smi::read_utilization_by_index; +#[derive(Clone, Debug, PartialEq, Eq)] pub struct CudaBackend { device_count: i32, } +/// Cached probe result — cudarc poisons its internal `OnceLock` on failure, so we must +/// never call into cudarc when libcuda / the driver is absent (CI, CPU-only hosts). +static CUDA_BACKEND: Lazy> = Lazy::new(probe_cuda_backend); + impl CudaBackend { + /// Probe for CUDA without panicking when `libcuda` is absent (CI, CPU-only hosts). pub fn try_load() -> Option { - let count = CudaContext::device_count().ok()?; - if count <= 0 { - return None; - } - Some(Self { - device_count: count, - }) + CUDA_BACKEND.clone() } pub fn device_count(&self) -> i32 { @@ -31,7 +33,11 @@ impl CudaBackend { if ordinal < 0 { return None; } - CudaContext::new(ordinal as usize).ok() + std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + CudaContext::new(ordinal as usize).ok() + })) + .ok() + .flatten() } fn device_info(ctx: &CudaContext, ordinal: i32) -> GpuDeviceInfo { @@ -91,6 +97,78 @@ impl GpuBackend for CudaBackend { } } +fn probe_cuda_backend() -> Option { + if !libcuda_driver_ready() { + log::debug!("CUDA backend unavailable (libcuda or driver not ready)"); + return None; + } + + let count = + std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| CudaContext::device_count())) + .ok() + .and_then(|r| r.ok())?; + + if count <= 0 { + log::debug!("CUDA backend unavailable (zero devices)"); + return None; + } + + log::info!("CUDA backend available ({count} device(s))"); + Some(CudaBackend { + device_count: count, + }) +} + +/// Probe driver via dlopen + `cuInit` — avoids cudarc's fatal `OnceLock` init when no driver exists. +#[cfg(target_os = "linux")] +fn libcuda_driver_ready() -> bool { + use std::ffi::CString; + + const CUDA_SUCCESS: u32 = 0; + const NAMES: &[&str] = &[ + "libcuda.so.1", + "libcuda.so", + "libnvcuda.so.1", + "libnvcuda.so", + ]; + + unsafe { + for name in NAMES { + let Ok(cname) = CString::new(*name) else { + continue; + }; + let handle = libc::dlopen(cname.as_ptr(), libc::RTLD_LAZY); + if handle.is_null() { + continue; + } + + let sym = CString::new("cuInit").expect("cuInit"); + let cu_init_ptr = libc::dlsym(handle, sym.as_ptr()); + if cu_init_ptr.is_null() { + libc::dlclose(handle); + continue; + } + + type CuInitFn = unsafe extern "C" fn(u32) -> u32; + let cu_init: CuInitFn = std::mem::transmute(cu_init_ptr); + let status = cu_init(0); + libc::dlclose(handle); + + if status == CUDA_SUCCESS { + return true; + } + log::debug!("cuInit via {name} returned {status}, trying next candidate"); + } + } + false +} + +#[cfg(not(target_os = "linux"))] +fn libcuda_driver_ready() -> bool { + // Non-Linux CUDA builds are uncommon; defer to catch_unwind around cudarc. + true +} + fn compute_capability(ctx: &CudaContext) -> Option { let major = ctx .attribute(CUdevice_attribute::CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR) @@ -115,6 +193,8 @@ mod tests { #[test] fn cuda_backend_loads_or_skips_gracefully() { let backend = CudaBackend::try_load(); + // Must not panic on repeated probe (CI imports _core many times per process). + assert_eq!(backend, CudaBackend::try_load()); if let Some(b) = backend { assert!(b.device_count() > 0); let devices = b.probe_devices(); diff --git a/probing/extensions/gpu/src/extensions/backend/registry.rs b/probing/extensions/gpu/src/extensions/backend/registry.rs index 2fb17e08..bee56400 100644 --- a/probing/extensions/gpu/src/extensions/backend/registry.rs +++ b/probing/extensions/gpu/src/extensions/backend/registry.rs @@ -27,40 +27,60 @@ fn filter_allows(kind: GpuBackendKind) -> bool { /// Discover all GPU backends available on this host (dlopen / runtime probe; never panics). pub fn discover_backends() -> Vec> { - let mut backends: Vec> = Vec::new(); - - #[cfg(feature = "cuda")] - { - if filter_allows(GpuBackendKind::Cuda) { - if let Some(cuda) = CudaBackend::try_load() { - log::info!( - "GPU backend loaded: cuda ({} device(s))", - cuda.device_count() - ); - backends.push(Box::new(cuda)); + let cuda: Option> = { + #[cfg(feature = "cuda")] + { + if filter_allows(GpuBackendKind::Cuda) { + let cuda = + std::panic::catch_unwind(std::panic::AssertUnwindSafe(CudaBackend::try_load)) + .ok() + .flatten(); + if let Some(cuda) = cuda { + log::info!( + "GPU backend loaded: cuda ({} device(s))", + cuda.device_count() + ); + Some(Box::new(cuda)) + } else { + log::debug!("CUDA backend unavailable (no driver or libcuda)"); + None + } } else { - log::debug!("CUDA backend unavailable (no driver or libcuda)"); + None } } - } - - #[cfg(target_os = "macos")] - { - if filter_allows(GpuBackendKind::Metal) { - if let Some(apple) = AppleSiliconBackend::try_load() { - let count = apple.probe_devices().len(); - log::info!("GPU backend loaded: metal/apple-silicon ({count} device(s))"); - backends.push(Box::new(apple)); + #[cfg(not(feature = "cuda"))] + { + None + } + }; + + let apple: Option> = { + #[cfg(target_os = "macos")] + { + if filter_allows(GpuBackendKind::Metal) { + if let Some(apple) = AppleSiliconBackend::try_load() { + let count = apple.probe_devices().len(); + log::info!("GPU backend loaded: metal/apple-silicon ({count} device(s))"); + Some(Box::new(apple)) + } else { + log::debug!("Apple Silicon GPU backend unavailable (no Metal device)"); + None + } } else { - log::debug!("Apple Silicon GPU backend unavailable (no Metal device)"); + None } } - } + #[cfg(not(target_os = "macos"))] + { + None + } + }; #[cfg(not(any(feature = "cuda", target_os = "macos")))] log::debug!("probing-gpu: no GPU backends available for this target"); - backends + [cuda, apple].into_iter().flatten().collect() } /// Backends selected by env `PROBING_GPU_BACKEND` (default: auto = all discovered). @@ -86,6 +106,15 @@ pub fn selected_backends() -> Vec> { mod platform_tests { use super::*; + /// Linux/Windows CI: discovery must never abort when libcuda is missing. + #[test] + #[cfg(feature = "cuda")] + fn discover_backends_is_idempotent_without_cuda() { + let first = discover_backends(); + let second = discover_backends(); + assert_eq!(first.len(), second.len()); + } + /// Linux/Windows CI: crate must compile with zero GPU backends when cuda is off. #[test] #[cfg(all(not(target_os = "macos"), not(feature = "cuda")))] diff --git a/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs b/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs index 86488ef1..1bff924c 100644 --- a/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs +++ b/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs @@ -175,3 +175,6 @@ pub struct NcclProfilerV3 { pub record_event_state: ProfilerRecordStateFn, pub finalize: ProfilerFinalizeFn, } + +// SAFETY: exported as a read-only C vtable; `name` points to `PLUGIN_NAME` static bytes. +unsafe impl Sync for NcclProfilerV3 {} diff --git a/probing/extensions/nccl-profiler/src/events.rs b/probing/extensions/nccl-profiler/src/events.rs index 7b98c54b..8e0ccadc 100644 --- a/probing/extensions/nccl-profiler/src/events.rs +++ b/probing/extensions/nccl-profiler/src/events.rs @@ -63,6 +63,7 @@ pub struct CollContext { } impl CollContext { + #[allow(dead_code)] pub fn func_str(&self) -> &str { let n = self.func_len as usize; std::str::from_utf8(&self.func[..n.min(MAX_FUNC_NAME)]).unwrap_or("unknown") @@ -77,7 +78,8 @@ pub fn copy_func_name(dst: &mut CollContext, src: Option<&str>) { dst.func_len = n as u8; } -#[derive(Debug, Default)] +#[derive(Clone, Copy, Debug, Default)] +#[allow(dead_code)] pub struct ProxyStepData { pub step: i32, pub is_send: i32, @@ -87,6 +89,7 @@ pub struct ProxyStepData { } #[derive(Debug)] +#[allow(dead_code)] pub struct ProxyOpData { pub channel_id: i32, pub peer: i32, diff --git a/probing/extensions/nccl-profiler/src/plugin.rs b/probing/extensions/nccl-profiler/src/plugin.rs index 78794c9c..1ea2c919 100644 --- a/probing/extensions/nccl-profiler/src/plugin.rs +++ b/probing/extensions/nccl-profiler/src/plugin.rs @@ -97,7 +97,7 @@ pub unsafe extern "C" fn probing_profiler_finalize(context: *mut c_void) -> Nccl mod tests { use super::*; use crate::abi::NcclProfilerEventBodyV3; - use crate::abi::NCCL_PROFILE_PROXY_OP; + use crate::abi::{NcclProfilerProxyOpDescr, NCCL_PROFILE_COLL, NCCL_PROFILE_PROXY_OP}; use std::sync::atomic::Ordering; #[test] @@ -136,7 +136,7 @@ mod tests { let mut c: crate::abi::NcclProfilerCollDescr = unsafe { std::mem::zeroed() }; c.comm_hash = 99; c.seq_number = 1; - c.func = b"AllReduce\0".as_ptr() as *const _; + c.func = c"AllReduce".as_ptr(); c.n_max_channels = 4; c }, diff --git a/probing/extensions/nccl-profiler/src/pool.rs b/probing/extensions/nccl-profiler/src/pool.rs index 159f45bf..9e31e9a2 100644 --- a/probing/extensions/nccl-profiler/src/pool.rs +++ b/probing/extensions/nccl-profiler/src/pool.rs @@ -57,6 +57,7 @@ impl SlotPool { } } + #[allow(dead_code)] pub fn free_ptr(&mut self, ptr: *mut T) { if let Some(idx) = self.index_of(ptr) { self.free_idx(idx); diff --git a/probing/extensions/nccl-profiler/src/state.rs b/probing/extensions/nccl-profiler/src/state.rs index 0ac889ee..7480bf98 100644 --- a/probing/extensions/nccl-profiler/src/state.rs +++ b/probing/extensions/nccl-profiler/src/state.rs @@ -55,7 +55,7 @@ impl PluginState { F: FnOnce(&mut PluginStateInner) -> R, { let mut guard = self.inner.lock(); - f(&mut *guard) + f(&mut guard) } } @@ -97,10 +97,10 @@ impl PluginStateInner { let ctx = read_coll_context(descr); let ts = now_ns(); if let Some((ptr, _idx)) = self.coll_pool.alloc(|| CollSlot::new(ctx, ts)) { - *handle = ptr as *mut c_void; + unsafe { *handle = ptr as *mut c_void }; } else { self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); - *handle = std::ptr::null_mut(); + unsafe { *handle = std::ptr::null_mut() }; } } x if x == NCCL_PROFILE_PROXY_OP => { @@ -136,10 +136,10 @@ impl PluginStateInner { coll_slot.register_proxy(channel, p.is_send, proxy_idx); } } - *handle = ptr as *mut c_void; + unsafe { *handle = ptr as *mut c_void }; } else { self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); - *handle = std::ptr::null_mut(); + unsafe { *handle = std::ptr::null_mut() }; } } x if x == NCCL_PROFILE_PROXY_STEP => { @@ -170,10 +170,10 @@ impl PluginStateInner { ..Default::default() }, }) { - *handle = ptr as *mut c_void; + unsafe { *handle = ptr as *mut c_void }; } else { self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); - *handle = std::ptr::null_mut(); + unsafe { *handle = std::ptr::null_mut() }; } } x if x == NCCL_PROFILE_NET_PLUGIN => { @@ -204,13 +204,13 @@ impl PluginStateInner { length, stop_ns: 0, }) { - *handle = ptr as *mut c_void; + unsafe { *handle = ptr as *mut c_void }; } else { self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); - *handle = std::ptr::null_mut(); + unsafe { *handle = std::ptr::null_mut() }; } } - _ => *handle = std::ptr::null_mut(), + _ => unsafe { *handle = std::ptr::null_mut() }, } } @@ -218,7 +218,7 @@ impl PluginStateInner { if handle.is_null() { return; } - match event_type(handle) { + match unsafe { event_type(handle) } { EVT_PROXY_STEP => { let step_idx = self .step_pool @@ -346,7 +346,7 @@ impl PluginStateInner { return; } let ts = now_ns(); - match event_type(handle) { + match unsafe { event_type(handle) } { EVT_PROXY_STEP => { let step_idx = self .step_pool @@ -370,10 +370,12 @@ impl PluginStateInner { } let slot = self.proxy_pool.get_mut(proxy_idx).unwrap(); if !args.is_null() { - let a = unsafe { &*args }; - slot.op.trans_bytes = a.proxy_op.trans_size as u64; - if a.proxy_op.steps > 0 { - slot.op.n_steps = a.proxy_op.steps; + unsafe { + let a = &*args; + slot.op.trans_bytes = a.proxy_op.trans_size as u64; + if a.proxy_op.steps > 0 { + slot.op.n_steps = a.proxy_op.steps; + } } } } diff --git a/probing/extensions/python/src/features/pprof.rs b/probing/extensions/python/src/features/pprof.rs index 94ee180b..be10fbc3 100644 --- a/probing/extensions/python/src/features/pprof.rs +++ b/probing/extensions/python/src/features/pprof.rs @@ -40,7 +40,7 @@ use serde_json::json; use crate::features::flamegraph::{FlamegraphKind, FlamegraphOptions}; use crate::features::spy::call::RawCallLocation; -use crate::features::spy::{PYSTACKS, PYSTACK_WRITING}; +use crate::features::spy::spy_tls_addrs; const DEFAULT_SAMPLE_FREQ: i32 = 100; const MIN_SAMPLE_FREQ: i32 = 1; @@ -215,8 +215,9 @@ static REG_TABLE: [ThreadSlot; REG_SIZE] = [const { static REG_FULL_WARNED: AtomicBool = AtomicBool::new(false); -#[thread_local] -static mut THREAD_REGISTERED: bool = false; +thread_local! { + static THREAD_REGISTERED: std::cell::UnsafeCell = const { std::cell::UnsafeCell::new(false) }; +} /// Open-addressing probe start for `tid` (Fibonacci hashing). REG_SIZE is a /// power of two so the mask is exact. @@ -287,17 +288,20 @@ fn current_stack_bounds() -> (usize, usize) { /// Called from the eval-frame hook (TLS-safe context) on every frame; the /// thread-local fast path makes the global table insert happen once per thread. pub fn register_python_thread() { - unsafe { - if THREAD_REGISTERED { - return; + let already = THREAD_REGISTERED.with(|flag| unsafe { + if *flag.get() { + return true; } - THREAD_REGISTERED = true; + *flag.get() = true; + false + }); + if already { + return; } let tid = current_tid(); // Resolve this thread's TLS addresses and stack bounds here, in normal // context (none of this is async-signal-safe). - let ps = core::ptr::addr_of_mut!(PYSTACKS); - let wr = core::ptr::addr_of_mut!(PYSTACK_WRITING); + let (ps, wr) = spy_tls_addrs(); let (lo, hi) = current_stack_bounds(); if let Some(name) = current_thread_name() { diff --git a/probing/extensions/python/src/features/spy/mod.rs b/probing/extensions/python/src/features/spy/mod.rs index 92ad906a..ea3ca3ec 100644 --- a/probing/extensions/python/src/features/spy/mod.rs +++ b/probing/extensions/python/src/features/spy/mod.rs @@ -9,6 +9,37 @@ pub use python_bindings::version::Version; use crate::features::spy::call::RawCallLocation; +pub(crate) struct ThreadSpyState { + pub stacks: Vec, + pub writing: bool, + pub frame_eval: ffi::_PyFrameEvalFunction, +} + +thread_local! { + static SPY_STATE: std::cell::UnsafeCell = + std::cell::UnsafeCell::new(ThreadSpyState { + stacks: Vec::new(), + writing: false, + frame_eval: ffi::_PyEval_EvalFrameDefault, + }); +} + +/// Access thread-local spy state. Hot path: one TLS lookup per eval-frame call. +#[inline(always)] +pub(crate) fn with_spy_state(f: impl FnOnce(*mut ThreadSpyState) -> R) -> R { + SPY_STATE.with(|cell| f(cell.get())) +} + +/// Raw addresses for SIGPROF registry (normal context only). +pub(crate) fn spy_tls_addrs() -> (*mut Vec, *mut bool) { + with_spy_state(|state| unsafe { + ( + core::ptr::addr_of_mut!((*state).stacks), + core::ptr::addr_of_mut!((*state).writing), + ) + }) +} + pub(crate) static mut PYVERSION: Version = Version { major: 0, minor: 0, @@ -17,19 +48,6 @@ pub(crate) static mut PYVERSION: Version = Version { build_metadata: None, }; -#[thread_local] -pub(crate) static mut PYSTACKS: Vec = Vec::new(); - -/// Set by `rust_eval_frame` while it mutates `PYSTACKS` (push/pop). The SIGPROF -/// sampler reads this from the signal handler to avoid snapshotting `PYSTACKS` -/// mid-`Vec`-reallocation; if it is `true`, the handler discards the Python part -/// of the sample. Same-thread only, so plain `bool` + `compiler_fence` suffices. -#[thread_local] -pub(crate) static mut PYSTACK_WRITING: bool = false; - -#[thread_local] -pub(crate) static mut PYFRAMEEVAL: ffi::_PyFrameEvalFunction = ffi::_PyEval_EvalFrameDefault; - /// 获取当前线程执行的Python frame指针 /// 这个函数适用于在信号处理函数中调用 #[inline(always)] diff --git a/probing/extensions/python/src/features/stack_tracer.rs b/probing/extensions/python/src/features/stack_tracer.rs index d9537671..c67ffe00 100644 --- a/probing/extensions/python/src/features/stack_tracer.rs +++ b/probing/extensions/python/src/features/stack_tracer.rs @@ -183,7 +183,6 @@ impl SignalTracer { fn trace_thread_signal(tid: i32) -> Result> { let pid = nix::unistd::getpid().as_raw(); - let tid_param = Some(tid); let _guard = BACKTRACE_MUTEX.try_lock().map_err(|e| { log::error!("Failed to acquire BACKTRACE_MUTEX: {e}"); @@ -215,7 +214,7 @@ impl SignalTracer { #[cfg(target_os = "macos")] { - let signal_result = if tid_param.is_none() || tid == pid { + let signal_result = if tid == pid { let ret = unsafe { libc::kill(pid, libc::SIGUSR2) }; if ret != 0 { Err(std::io::Error::last_os_error()) @@ -235,7 +234,7 @@ impl SignalTracer { #[cfg(not(any(target_os = "linux", target_os = "macos")))] { - let _ = (pid, tid, tid_param); + let _ = (pid, tid); Self::clear_sender_slot(); return Err(anyhow::anyhow!( "Stack tracing is not supported on this platform" diff --git a/probing/extensions/python/src/features/vm_tracer.rs b/probing/extensions/python/src/features/vm_tracer.rs index 70b66a7a..d614d7aa 100644 --- a/probing/extensions/python/src/features/vm_tracer.rs +++ b/probing/extensions/python/src/features/vm_tracer.rs @@ -10,9 +10,7 @@ use crate::features::spy::{get_current_frame, get_prev_frame}; use super::spy::python_bindings; use crate::features::spy::ffi; -use crate::features::spy::PYFRAMEEVAL; -use crate::features::spy::PYSTACKS; -use crate::features::spy::PYSTACK_WRITING; +use crate::features::spy::with_spy_state; use crate::features::spy::PYVERSION; #[allow(static_mut_refs)] @@ -28,9 +26,11 @@ pub fn initialize_globals() -> bool { release_flags: ver.suffix.unwrap_or_default().to_string(), build_metadata: Default::default(), }; - if PYSTACKS.capacity() == 0 { - PYSTACKS.reserve(1024); - } + with_spy_state(|state| { + if (*state).stacks.capacity() == 0 { + (*state).stacks.reserve(1024); + } + }); true } else { false @@ -48,34 +48,36 @@ unsafe extern "C" fn rust_eval_frame( ) -> *mut pyo3::ffi::PyObject { use std::sync::atomic::{compiler_fence, Ordering}; - // Mark this thread as a Python thread once; lets the SIGPROF sampler know its - // thread-local `PYSTACKS` is allocated and safe to read from a signal handler. - crate::features::pprof::register_python_thread(); - - // Resolve this frame's callee symbol *now*, while the code object is alive - // under the GIL, and cache it by pointer. The SIGPROF consumer later looks - // the label up by integer key instead of dereferencing a possibly-freed - // `PyCodeObject` off the signal path. - let loc = RawCallLocation::from(frame as usize, Some(ts as usize)); - crate::features::pprof::intern_py_frame(&loc); - - // Bracket the `PYSTACKS` mutation so a SIGPROF sample taken mid-realloc is - // discarded instead of reading a torn `Vec`. - PYSTACK_WRITING = true; - compiler_fence(Ordering::SeqCst); - PYSTACKS.push(loc); - compiler_fence(Ordering::SeqCst); - PYSTACK_WRITING = false; - - let ret = PYFRAMEEVAL(ts, frame, extra); - - PYSTACK_WRITING = true; - compiler_fence(Ordering::SeqCst); - PYSTACKS.pop(); - compiler_fence(Ordering::SeqCst); - PYSTACK_WRITING = false; - - ret + with_spy_state(|state| { + // Mark this thread as a Python thread once; lets the SIGPROF sampler know its + // thread-local `PYSTACKS` is allocated and safe to read from a signal handler. + crate::features::pprof::register_python_thread(); + + // Resolve this frame's callee symbol *now*, while the code object is alive + // under the GIL, and cache it by pointer. The SIGPROF consumer later looks + // the label up by integer key instead of dereferencing a possibly-freed + // `PyCodeObject` off the signal path. + let loc = RawCallLocation::from(frame as usize, Some(ts as usize)); + crate::features::pprof::intern_py_frame(&loc); + + // Bracket the `PYSTACKS` mutation so a SIGPROF sample taken mid-realloc is + // discarded instead of reading a torn `Vec`. + (*state).writing = true; + compiler_fence(Ordering::SeqCst); + (*state).stacks.push(loc); + compiler_fence(Ordering::SeqCst); + (*state).writing = false; + + let ret = ((*state).frame_eval)(ts, frame, extra); + + (*state).writing = true; + compiler_fence(Ordering::SeqCst); + (*state).stacks.pop(); + compiler_fence(Ordering::SeqCst); + (*state).writing = false; + + ret + }) } #[allow(static_mut_refs)] @@ -86,7 +88,9 @@ pub fn enable_tracer() -> PyResult<()> { let interp = ffi::PyInterpreterState_Get(); let old_eval_frame = ffi::_PyInterpreterState_GetEvalFrameFunc(interp); if old_eval_frame as usize != rust_eval_frame as *const () as usize { - PYFRAMEEVAL = old_eval_frame; + with_spy_state(|state| { + (*state).frame_eval = old_eval_frame; + }); } ffi::_PyInterpreterState_SetEvalFrameFunc(interp, rust_eval_frame); } else { @@ -116,10 +120,12 @@ pub fn disable_tracer() -> PyResult<()> { let interp = ffi::PyInterpreterState_Get(); let old_eval_frame = ffi::_PyInterpreterState_GetEvalFrameFunc(interp); if old_eval_frame as usize == rust_eval_frame as *const () as usize { - ffi::_PyInterpreterState_SetEvalFrameFunc(interp, PYFRAMEEVAL); + with_spy_state(|state| { + ffi::_PyInterpreterState_SetEvalFrameFunc(interp, (*state).frame_eval); + (*state).stacks.clear(); + (*state).stacks.shrink_to_fit(); + }); } - PYSTACKS.clear(); - PYSTACKS.shrink_to_fit(); } crate::features::pprof::clear_py_symbols(); Ok(()) @@ -169,11 +175,12 @@ pub fn _get_python_frames(py: Python) -> PyResult> { #[allow(static_mut_refs)] pub fn get_python_stacks_raw() -> Vec { - unsafe { - if PYSTACKS.capacity() == 0 { + with_spy_state(|state| unsafe { + if (*state).stacks.capacity() == 0 { return vec![]; } - PYSTACKS + (*state) + .stacks .iter() .rev() .map(|location| { @@ -186,7 +193,7 @@ pub fn get_python_stacks_raw() -> Vec { } }) .collect::>() - } + }) } #[allow(static_mut_refs)] diff --git a/probing/extensions/python/src/lib.rs b/probing/extensions/python/src/lib.rs index a691cb7f..bc9a16bc 100644 --- a/probing/extensions/python/src/lib.rs +++ b/probing/extensions/python/src/lib.rs @@ -1,5 +1,3 @@ -#![feature(thread_local)] - #[macro_use] extern crate ctor; diff --git a/pyproject.toml b/pyproject.toml index 000678d8..dd4740d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,13 @@ python-source = "python" compatibility = "linux" bindings = "pyo3" cargo-extra-args = "--features extension-module,gpu,kmsg" -include = ["probing.pth", "probing_hook.py", "probing/libs/*", "probing/_skills/**", "probing/_web/**"] +include = [ + "probing.pth", + "probing_hook.py", + "probing/libs/*", + "probing/bundled_skills/**", + "probing/bundled_web/**", +] [build-system] requires = ["maturin>=1.0,<2.0"] diff --git a/python/probing/_skills/README.md b/python/probing/_skills/README.md deleted file mode 100644 index 8ca02e38..00000000 --- a/python/probing/_skills/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Bundled diagnostic skills (wheel copy) - -**Do not edit skill content here.** This tree is generated from repo-root -[`skills/`](../../../skills/README.md): - -```bash -make wheel # bundles skills/ and web/dist/ automatically -``` - -Shipped inside the PyPI wheel so `probing skill list` and install tooling work -without a git checkout. At runtime, repo / user / project skill dirs can override -these entries (see [`../skills/README.md`](../skills/README.md)). - -Python loader code lives in [`../skills/`](../skills/README.md) (`probing.skills` package). diff --git a/python/probing/bundled_skills/README.md b/python/probing/bundled_skills/README.md new file mode 100644 index 00000000..eb2e2736 --- /dev/null +++ b/python/probing/bundled_skills/README.md @@ -0,0 +1,64 @@ +# Diagnostic skills (authoring) + +**This is the source of truth for skill *data*.** Edit here — not under `python/probing/`. + +Each skill is a folder with **`SKILL.md`** (when/how, for agents) and optional **`steps.yaml`** +(deterministic steps for `probing skill run` and the Web Investigate agent). + +## Other skill-related paths + +| Path | What it is | +|------|------------| +| **`skills/`** (here) | Authoring + `./install.sh` source; also embedded in Web/Rust via `include_str!` | +| **`python/probing/skills/`** | Python **code** — loader, install, CLI helpers (`probing.skills.*`) | +| **`python/probing/_skills/`** | **Wheel bundle** — generated by `make wheel` | + +## Layout + +``` +skills/ +├── catalog.yaml # index (id, category, path) +├── semantic/ # intents, pages, table semantics (routing) +├── install.sh # copy into .cursor/.claude/.agents skill dirs +└── health_overview/ + ├── SKILL.md + └── steps.yaml +``` + +## Install into Cursor / Claude / Codex + +```bash +./skills/install.sh +# or: probing skill install [--user] [--force] +``` + +| Agent | Project | User (`--user`) | +|-------|---------|-----------------| +| Cursor | `.cursor/skills/` | `~/.cursor/skills/` | +| Claude Code | `.claude/skills/` | `~/.claude/skills/` | +| Codex | `.agents/skills/` | `~/.agents/skills/` | + +## Run + +```bash +probing skill list +probing -t skill run health_overview +probing -t skill run slow_rank --set step_window=30 --global +``` + +Validate after edits: + +```bash +python -m probing.skills validate +make wheel # refresh wheel bundle when cutting a release +``` + +## Add a skill + +1. `skills/my_skill/SKILL.md` — frontmatter with `name` + `description` +2. `skills/my_skill/steps.yaml` — optional executable steps +3. Register in `catalog.yaml` +4. `python -m probing.skills validate` +5. `./skills/install.sh` — refresh agent directories + +See [AGENTS.md](../AGENTS.md) and [docs/src/design/extensibility.md](../docs/src/design/extensibility.md). diff --git a/python/probing/_skills/catalog.yaml b/python/probing/bundled_skills/catalog.yaml similarity index 100% rename from python/probing/_skills/catalog.yaml rename to python/probing/bundled_skills/catalog.yaml diff --git a/python/probing/_skills/comm_bottleneck/SKILL.md b/python/probing/bundled_skills/comm_bottleneck/SKILL.md similarity index 100% rename from python/probing/_skills/comm_bottleneck/SKILL.md rename to python/probing/bundled_skills/comm_bottleneck/SKILL.md diff --git a/python/probing/_skills/comm_bottleneck/steps.yaml b/python/probing/bundled_skills/comm_bottleneck/steps.yaml similarity index 100% rename from python/probing/_skills/comm_bottleneck/steps.yaml rename to python/probing/bundled_skills/comm_bottleneck/steps.yaml diff --git a/python/probing/_skills/gpu_pressure/SKILL.md b/python/probing/bundled_skills/gpu_pressure/SKILL.md similarity index 100% rename from python/probing/_skills/gpu_pressure/SKILL.md rename to python/probing/bundled_skills/gpu_pressure/SKILL.md diff --git a/python/probing/_skills/gpu_pressure/steps.yaml b/python/probing/bundled_skills/gpu_pressure/steps.yaml similarity index 100% rename from python/probing/_skills/gpu_pressure/steps.yaml rename to python/probing/bundled_skills/gpu_pressure/steps.yaml diff --git a/python/probing/_skills/health_overview/SKILL.md b/python/probing/bundled_skills/health_overview/SKILL.md similarity index 100% rename from python/probing/_skills/health_overview/SKILL.md rename to python/probing/bundled_skills/health_overview/SKILL.md diff --git a/python/probing/_skills/health_overview/steps.yaml b/python/probing/bundled_skills/health_overview/steps.yaml similarity index 100% rename from python/probing/_skills/health_overview/steps.yaml rename to python/probing/bundled_skills/health_overview/steps.yaml diff --git a/python/probing/_skills/install.sh b/python/probing/bundled_skills/install.sh similarity index 100% rename from python/probing/_skills/install.sh rename to python/probing/bundled_skills/install.sh diff --git a/python/probing/_skills/memory_leak/SKILL.md b/python/probing/bundled_skills/memory_leak/SKILL.md similarity index 100% rename from python/probing/_skills/memory_leak/SKILL.md rename to python/probing/bundled_skills/memory_leak/SKILL.md diff --git a/python/probing/_skills/memory_leak/steps.yaml b/python/probing/bundled_skills/memory_leak/steps.yaml similarity index 100% rename from python/probing/_skills/memory_leak/steps.yaml rename to python/probing/bundled_skills/memory_leak/steps.yaml diff --git a/python/probing/_skills/module_bottleneck/SKILL.md b/python/probing/bundled_skills/module_bottleneck/SKILL.md similarity index 100% rename from python/probing/_skills/module_bottleneck/SKILL.md rename to python/probing/bundled_skills/module_bottleneck/SKILL.md diff --git a/python/probing/_skills/module_bottleneck/steps.yaml b/python/probing/bundled_skills/module_bottleneck/steps.yaml similarity index 100% rename from python/probing/_skills/module_bottleneck/steps.yaml rename to python/probing/bundled_skills/module_bottleneck/steps.yaml diff --git a/python/probing/_skills/nccl_culprit_victim/SKILL.md b/python/probing/bundled_skills/nccl_culprit_victim/SKILL.md similarity index 100% rename from python/probing/_skills/nccl_culprit_victim/SKILL.md rename to python/probing/bundled_skills/nccl_culprit_victim/SKILL.md diff --git a/python/probing/_skills/nccl_culprit_victim/steps.yaml b/python/probing/bundled_skills/nccl_culprit_victim/steps.yaml similarity index 100% rename from python/probing/_skills/nccl_culprit_victim/steps.yaml rename to python/probing/bundled_skills/nccl_culprit_victim/steps.yaml diff --git a/python/probing/_skills/semantic/intents.yaml b/python/probing/bundled_skills/semantic/intents.yaml similarity index 100% rename from python/probing/_skills/semantic/intents.yaml rename to python/probing/bundled_skills/semantic/intents.yaml diff --git a/python/probing/_skills/semantic/pages.yaml b/python/probing/bundled_skills/semantic/pages.yaml similarity index 100% rename from python/probing/_skills/semantic/pages.yaml rename to python/probing/bundled_skills/semantic/pages.yaml diff --git a/python/probing/_skills/semantic/tables.yaml b/python/probing/bundled_skills/semantic/tables.yaml similarity index 100% rename from python/probing/_skills/semantic/tables.yaml rename to python/probing/bundled_skills/semantic/tables.yaml diff --git a/python/probing/_skills/slow_rank/SKILL.md b/python/probing/bundled_skills/slow_rank/SKILL.md similarity index 100% rename from python/probing/_skills/slow_rank/SKILL.md rename to python/probing/bundled_skills/slow_rank/SKILL.md diff --git a/python/probing/_skills/slow_rank/steps.yaml b/python/probing/bundled_skills/slow_rank/steps.yaml similarity index 100% rename from python/probing/_skills/slow_rank/steps.yaml rename to python/probing/bundled_skills/slow_rank/steps.yaml diff --git a/python/probing/_skills/training_hang/SKILL.md b/python/probing/bundled_skills/training_hang/SKILL.md similarity index 100% rename from python/probing/_skills/training_hang/SKILL.md rename to python/probing/bundled_skills/training_hang/SKILL.md diff --git a/python/probing/_skills/training_hang/steps.yaml b/python/probing/bundled_skills/training_hang/steps.yaml similarity index 100% rename from python/probing/_skills/training_hang/steps.yaml rename to python/probing/bundled_skills/training_hang/steps.yaml diff --git a/python/probing/skills/README.md b/python/probing/skills/README.md index d6820b7b..c74de057 100644 --- a/python/probing/skills/README.md +++ b/python/probing/skills/README.md @@ -2,7 +2,7 @@ **This package is code, not skill content.** Skill folders live at the repo root [`skills/`](../../../skills/README.md). Wheel installs ship a copy under -[`../_skills/`](../_skills/README.md). +[`../bundled_skills/`](../bundled_skills/README.md). ## Modules @@ -17,7 +17,7 @@ ## Resolution order (later wins) -1. Bundled `python/probing/_skills/` (wheel) +1. Bundled `python/probing/bundled_skills/` (wheel) 2. Repo `skills/` (checkout) 3. `~/.probing/skills/` 4. `/.probing/skills/` diff --git a/python/probing/skills/paths.py b/python/probing/skills/paths.py index 2c014ca3..c0174522 100644 --- a/python/probing/skills/paths.py +++ b/python/probing/skills/paths.py @@ -81,11 +81,28 @@ def repo_skills_dir(start: Optional[Path] = None) -> Optional[Path]: def bundled_skills_dir() -> Optional[Path]: - """Skills copied into the wheel at ``python/probing/_skills/`` (release builds).""" - bundled = Path(__file__).resolve().parent.parent / "_skills" - if bundled.is_dir() and (bundled / "catalog.yaml").is_file(): - return bundled - return None + """Skills copied into the wheel at ``python/probing/bundled_skills/`` (release builds).""" + root = _package_dir() / "bundled_skills" + if root.is_dir() and (root / "catalog.yaml").is_file(): + return root + return _resource_dir("bundled_skills", "catalog.yaml") + + +def _package_dir() -> Path: + return Path(__file__).resolve().parent.parent + + +def _resource_dir(name: str, marker: str) -> Optional[Path]: + try: + from importlib.resources import as_file, files + + bundle = files("probing") / name + if not (bundle / marker).is_file(): + return None + with as_file(bundle) as path: + return Path(path) + except (TypeError, ModuleNotFoundError, FileNotFoundError, OSError): + return None def user_skills_dir() -> Path: diff --git a/python/probing/web_assets.py b/python/probing/web_assets.py index 9dc7885b..9c5ad7fe 100644 --- a/python/probing/web_assets.py +++ b/python/probing/web_assets.py @@ -6,25 +6,53 @@ from pathlib import Path _ENV = "PROBING_ASSETS_ROOT" -_BUNDLED_DIRNAME = "_web" +_BUNDLED_DIRNAME = "bundled_web" def bundled_web_dir() -> Path | None: - """Wheel / install tree: ``python/probing/_web/`` (bundled by ``make wheel``).""" - root = Path(__file__).resolve().parent / _BUNDLED_DIRNAME + """Wheel / install tree: ``python/probing/bundled_web/`` (bundled by ``make wheel``).""" + root = _package_dir() / _BUNDLED_DIRNAME if (root / "index.html").is_file(): return root - return None + return _resource_dir(_BUNDLED_DIRNAME, "index.html") def dev_web_dir() -> Path | None: """Editable checkout: repo ``web/dist/``.""" - root = Path(__file__).resolve().parents[2] / "web" / "dist" + if _running_from_installed_wheel(): + return None + root = _repo_root_from_editable() / "web" / "dist" if (root / "index.html").is_file(): return root return None +def _package_dir() -> Path: + return Path(__file__).resolve().parent + + +def _running_from_installed_wheel() -> bool: + maybe_repo = Path(__file__).resolve().parents[2] + return not (maybe_repo / "pyproject.toml").is_file() + + +def _repo_root_from_editable() -> Path: + return Path(__file__).resolve().parents[2] + + +def _resource_dir(name: str, marker: str) -> Path | None: + try: + from importlib.resources import as_file, files + + bundle = files("probing") / name + if not (bundle / marker).is_file(): + return None + with as_file(bundle) as path: + return Path(path) + except (TypeError, ModuleNotFoundError, FileNotFoundError, OSError): + return None + + def resolve_web_assets_root() -> Path | None: """Return the directory that contains ``index.html``, if any.""" override = os.environ.get(_ENV) diff --git a/tests/conftest.py b/tests/conftest.py index ba75a18e..bcd8485e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -15,10 +15,20 @@ os.environ.setdefault("PROBING_RUST_BACKTRACE", "1") # Fallback when tests run without ``make develop`` (no venv .pth files). +# Skip when ``probing._core`` is already installed (wheel / maturin develop) so we +# do not shadow site-packages with the checkout-only ``python/probing`` tree. _repo_python = Path(__file__).resolve().parents[1] / "python" if _repo_python.is_dir(): _repo_python_str = str(_repo_python) - if _repo_python_str not in sys.path: + _prepend_repo = True + try: + import importlib.util + + if importlib.util.find_spec("probing._core") is not None: + _prepend_repo = False + except (ImportError, ModuleNotFoundError, ValueError): + pass + if _prepend_repo and _repo_python_str not in sys.path: sys.path.insert(0, _repo_python_str) @@ -58,3 +68,19 @@ def _thread_excepthook(args: threading.ExceptHookArgs) -> None: if hasattr(threading, "excepthook"): threading.excepthook = _thread_excepthook + + +def repo_root() -> Path: + """Repository root (contains ``pyproject.toml``).""" + return Path(__file__).resolve().parents[1] + + +def repo_probing_pkg() -> Path: + return repo_root() / "python" / "probing" + + +def is_wheel_install() -> bool: + """True when ``probing`` is imported from site-packages, not the checkout tree.""" + import probing + + return Path(probing.__file__).resolve().parent != repo_probing_pkg().resolve() diff --git a/tests/regression/conftest.py b/tests/regression/conftest.py index fcf0068a..64096fe9 100644 --- a/tests/regression/conftest.py +++ b/tests/regression/conftest.py @@ -12,10 +12,26 @@ @pytest.fixture(scope="session", autouse=True) def _wait_for_probing_engine(): - """Brief pause so the in-process probing server can finish starting.""" + """Wait until the in-process probing engine accepts SQL (before IPython threads).""" enabled = os.environ.get("PROBING_ORIGINAL") or os.environ.get("PROBING") if enabled and str(enabled).lower() not in ("0", "false", "no", ""): - time.sleep(1.0) + import probing + + deadline = time.monotonic() + 30.0 + last_error: Exception | None = None + while time.monotonic() < deadline: + try: + df = probing.query("SELECT 1 AS ok") + if len(df) == 1 and df["ok"].tolist() == [1]: + break + except Exception as exc: + last_error = exc + time.sleep(0.2) + else: + msg = "probing engine did not become ready within 30s" + if last_error is not None: + msg = f"{msg}: {last_error}" + pytest.fail(msg) yield diff --git a/tests/regression/core/test_global_federation.py b/tests/regression/core/test_global_federation.py index a1e5ffae..f2fdf33f 100644 --- a/tests/regression/core/test_global_federation.py +++ b/tests/regression/core/test_global_federation.py @@ -7,23 +7,6 @@ pytestmark = pytest.mark.integration -def _table_exists(schema: str, table: str) -> bool: - import probing - - try: - names = probing.query( - "SELECT table_name FROM information_schema.tables " - f"WHERE table_schema = '{schema}'" - )["table_name"].tolist() - except Exception: - return False - return table in names - - -@pytest.mark.skipif( - not _table_exists("cluster", "nodes"), - reason="cluster.nodes not registered in this probe", -) def test_global_cluster_nodes_explicit_select_omits_probe_tags(): import probing @@ -34,10 +17,6 @@ def test_global_cluster_nodes_explicit_select_omits_probe_tags(): assert "_rank" not in df.columns -@pytest.mark.skipif( - not _table_exists("cluster", "nodes"), - reason="cluster.nodes not registered in this probe", -) def test_global_cluster_nodes_select_star_includes_probe_tags(): import probing @@ -48,10 +27,6 @@ def test_global_cluster_nodes_select_star_includes_probe_tags(): assert "_rank" in df.columns -@pytest.mark.skipif( - not _table_exists("cluster", "nodes"), - reason="cluster.nodes not registered in this probe", -) def test_probe_cluster_nodes_omits_probe_tags(): import probing diff --git a/tests/regression/repl/test_help_magic.py b/tests/regression/repl/test_help_magic.py index 346c7877..ce23d73c 100644 --- a/tests/regression/repl/test_help_magic.py +++ b/tests/regression/repl/test_help_magic.py @@ -7,14 +7,13 @@ import pytest -pytest.importorskip("ipykernel") - -from probing.repl import CodeExecutor - @pytest.fixture def executor(): """Create a code executor with a real IPython kernel.""" + pytest.importorskip("ipykernel") + from probing.repl import CodeExecutor + ex = CodeExecutor() yield ex ex.shutdown() diff --git a/tests/regression/repl/test_query_magic.py b/tests/regression/repl/test_query_magic.py index 1129dff6..eea9349c 100644 --- a/tests/regression/repl/test_query_magic.py +++ b/tests/regression/repl/test_query_magic.py @@ -7,20 +7,19 @@ import pandas as pd import pytest -pytest.importorskip("IPython") - # Add python directory to path python_dir = os.path.join(os.path.dirname(__file__), "..", "..", "..", "python") if python_dir not in sys.path: sys.path.insert(0, python_dir) -from probing.repl.query_magic import QueryMagic -from traitlets.config.configurable import Configurable - @pytest.fixture def magic(): """Create a QueryMagic instance.""" + pytest.importorskip("IPython") + from probing.repl.query_magic import QueryMagic + from traitlets.config.configurable import Configurable + shell = Configurable() shell.user_ns = {} return QueryMagic(shell=shell) diff --git a/tests/regression/skills/test_install_tools.py b/tests/regression/skills/test_install_tools.py index cc7ada11..ff0c36da 100644 --- a/tests/regression/skills/test_install_tools.py +++ b/tests/regression/skills/test_install_tools.py @@ -14,20 +14,31 @@ from probing.skills.paths import ( bundled_skills_dir, detect_agent_install_targets, + repo_skills_dir, skill_roots, ) from probing.skills.tools import list_skills, plan_skill_run, run_skill +from tests.conftest import is_wheel_install + def test_bundled_skills_dir_exists(): bundled = bundled_skills_dir() - assert bundled is not None - assert (bundled / "catalog.yaml").is_file() + if is_wheel_install(): + assert bundled is not None, "installed wheel is missing probing/bundled_skills" + assert (bundled / "catalog.yaml").is_file() + return + assert bundled is not None or repo_skills_dir() is not None + if bundled is not None: + assert (bundled / "catalog.yaml").is_file() def test_skill_roots_include_bundled(): labels = [r.label for r in skill_roots()] - assert "bundled" in labels + if is_wheel_install(): + assert "bundled" in labels + return + assert "bundled" in labels or "repo" in labels def test_merged_catalog_has_eight_skills(): diff --git a/tests/unit/probing/test_web_assets.py b/tests/unit/probing/test_web_assets.py index 54ee16a6..929418a7 100644 --- a/tests/unit/probing/test_web_assets.py +++ b/tests/unit/probing/test_web_assets.py @@ -5,22 +5,31 @@ import os from pathlib import Path +import pytest + from probing import web_assets +from tests.conftest import is_wheel_install, repo_root + def test_bundled_web_dir_missing_without_sync(): root = web_assets.bundled_web_dir() - repo_root = Path(__file__).resolve().parents[3] - bundled_index = repo_root / "python" / "probing" / "_web" / "index.html" + checkout_bundled = repo_root() / "python" / "probing" / "bundled_web" / "index.html" + if is_wheel_install(): + assert root is not None, "installed wheel is missing probing/bundled_web" + assert (root / "index.html").is_file() + return if root is None: - assert not bundled_index.is_file() + assert not checkout_bundled.is_file() else: assert (root / "index.html").is_file() def test_dev_web_dir_when_frontend_built(): root = web_assets.dev_web_dir() - repo_dist = Path(__file__).resolve().parents[3] / "web" / "dist" / "index.html" + repo_dist = repo_root() / "web" / "dist" / "index.html" + if is_wheel_install(): + pytest.skip("dev_web_dir applies to editable checkout layout only") if repo_dist.is_file(): assert root is not None assert (root / "index.html").is_file() diff --git a/web/Cargo.toml b/web/Cargo.toml index aeaac323..17c480a5 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -75,6 +75,12 @@ dioxus-code = { version = "0.1.2", default-features = false, features = [ "lang-toml", ] } +# Match workspace root: faster compile, smaller debug artifacts. +[profile.dev] +debug = 1 +split-debuginfo = "unpacked" +codegen-units = 256 + [profile.release] opt-level = "z" debug = false diff --git a/web/src/agent/interpret.rs b/web/src/agent/interpret.rs index 0beb3832..3f3a7968 100644 --- a/web/src/agent/interpret.rs +++ b/web/src/agent/interpret.rs @@ -4,8 +4,8 @@ use std::collections::HashMap; use probing_proto::prelude::{DataFrame, Ele}; -use super::skill::InterpretRuleRaw; use super::runner::StepOutcome; +use super::skill::InterpretRuleRaw; pub type InterpretRule = InterpretRuleRaw; diff --git a/web/src/agent/llm.rs b/web/src/agent/llm.rs index 65d7cc41..724606b1 100644 --- a/web/src/agent/llm.rs +++ b/web/src/agent/llm.rs @@ -16,9 +16,7 @@ use serde::Deserialize; use crate::agent::cluster::cluster_context_for_llm; use crate::agent::runner::StepOutcome; -use crate::agent::{ - fetch_cluster_snapshot, list_skill_ids, load_skill, routing_context_for_llm, -}; +use crate::agent::{fetch_cluster_snapshot, list_skill_ids, load_skill, routing_context_for_llm}; use crate::state::llm_config::LlmConfig; use crate::state::page_context::PAGE_CONTEXT; use crate::utils::error::{AppError, Result}; diff --git a/web/src/agent/mod.rs b/web/src/agent/mod.rs index 31d9a087..f1e3103b 100644 --- a/web/src/agent/mod.rs +++ b/web/src/agent/mod.rs @@ -4,20 +4,18 @@ mod cluster; mod interpret; mod llm; pub mod page_tools; -mod skill; mod routing; mod runner; +mod skill; mod source_bridge; pub use cluster::fetch_cluster_snapshot; pub use interpret::{evaluate_rules, evidence_from_outcomes, format_findings}; pub use llm::{outcomes_to_evidence, select_skill, summarize_run}; pub use page_tools::refresh_page_snapshot_for_route; -pub use skill::{ - list_skill_ids, load_skill, resolve_skill_id, -}; pub use routing::routing_context_for_llm; pub use runner::{run_skill, StepOutcome}; +pub use skill::{list_skill_ids, load_skill, resolve_skill_id}; pub use source_bridge::{ ask_agent_about_source, ask_and_run_agent_about_source, run_skill_with_source, suggested_skills_for_source, diff --git a/web/src/agent/routing.rs b/web/src/agent/routing.rs index 188e2e66..264352d9 100644 --- a/web/src/agent/routing.rs +++ b/web/src/agent/routing.rs @@ -75,9 +75,7 @@ pub struct PageDescriptor { fn catalog_file() -> &'static CatalogFile { static CACHE: OnceLock = OnceLock::new(); CACHE.get_or_init(|| { - serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { - skills: vec![], - }) + serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { skills: vec![] }) }) } diff --git a/web/src/agent/runner.rs b/web/src/agent/runner.rs index be49fb35..efb6af92 100644 --- a/web/src/agent/runner.rs +++ b/web/src/agent/runner.rs @@ -273,8 +273,8 @@ pub async fn run_skill( if session.is_some_and(|s| s.is_cancelled()) { return Err(AppError::Cancelled); } - let pb = load_skill(skill_id) - .ok_or_else(|| AppError::Api(format!("Unknown skill: {skill_id}")))?; + let pb = + load_skill(skill_id).ok_or_else(|| AppError::Api(format!("Unknown skill: {skill_id}")))?; let overrides = resolve_overrides(&pb, overrides).await; if session.is_some_and(|s| s.is_cancelled()) { return Err(AppError::Cancelled); diff --git a/web/src/agent/skill.rs b/web/src/agent/skill.rs index a63c2df8..a978b2be 100644 --- a/web/src/agent/skill.rs +++ b/web/src/agent/skill.rs @@ -163,9 +163,8 @@ pub struct Skill { } fn catalog_entries() -> Vec { - let file: CatalogFile = serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { - skills: vec![], - }); + let file: CatalogFile = + serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { skills: vec![] }); file.skills } @@ -300,10 +299,7 @@ pub fn expand_sql(template: &str, ctx: &HashMap) -> String { out } -pub fn build_context( - pb: &Skill, - overrides: &HashMap, -) -> HashMap { +pub fn build_context(pb: &Skill, overrides: &HashMap) -> HashMap { let mut ctx = default_parameters(pb); ctx.extend(derive_variables(&ctx)); for (k, v) in overrides { diff --git a/web/src/agent/source_bridge.rs b/web/src/agent/source_bridge.rs index 9d488e91..2265dd32 100644 --- a/web/src/agent/source_bridge.rs +++ b/web/src/agent/source_bridge.rs @@ -7,8 +7,7 @@ use crate::state::agent::{open_agent_prefill, queue_agent_action, AgentPendingAc use crate::state::page_context::{set_page_local_hints, PAGE_CONTEXT}; use crate::utils::source_ref::{language_class, SourceSlice}; -const DEFAULT_SOURCE_SKILLS: &[&str] = - &["training_hang", "health_overview", "module_bottleneck"]; +const DEFAULT_SOURCE_SKILLS: &[&str] = &["training_hang", "health_overview", "module_bottleneck"]; /// Attach the visible source slice to page hints so LLM / skills see it. pub fn attach_source_focus(path: &str, line: Option, slice: &SourceSlice) { @@ -48,12 +47,7 @@ pub fn ask_and_run_agent_about_source(path: &str, line: Option, slice: &Sou } /// Run a skill with the current source slice attached as page context. -pub fn run_skill_with_source( - skill_id: &str, - path: &str, - line: Option, - slice: &SourceSlice, -) { +pub fn run_skill_with_source(skill_id: &str, path: &str, line: Option, slice: &SourceSlice) { if load_skill(skill_id).is_none() { return; } diff --git a/web/src/components/agent/chat.rs b/web/src/components/agent/chat.rs index fdced060..2e71ff85 100644 --- a/web/src/components/agent/chat.rs +++ b/web/src/components/agent/chat.rs @@ -6,13 +6,10 @@ use dioxus::prelude::*; use crate::agent::{ evaluate_rules, evidence_from_outcomes, format_findings, list_skill_ids, load_skill, - refresh_page_snapshot_for_route, resolve_skill_id, run_skill, select_skill, - summarize_run, + refresh_page_snapshot_for_route, resolve_skill_id, run_skill, select_skill, summarize_run, }; use crate::app::Route; -use crate::components::agent::step_card::{ - step_outcome_to_card, AgentSkillRunCard, AgentStepCard, -}; +use crate::components::agent::step_card::{step_outcome_to_card, AgentSkillRunCard, AgentStepCard}; use crate::components::colors::colors; use crate::components::icon::Icon; use crate::components::markdown_view::MarkdownView; @@ -481,13 +478,8 @@ fn spawn_llm_flow(user_message: String, config: LlmConfig) { } match sel.skill_id { Some(id) if load_skill(&id).is_some() => { - run_skill_flow( - &session, - &id, - sel.parameters, - Some((config, user_message)), - ) - .await; + run_skill_flow(&session, &id, sel.parameters, Some((config, user_message))) + .await; } Some(id) => { push_agent_message(AgentMessage::error(format!( @@ -544,9 +536,7 @@ async fn run_skill_flow( } let Some(meta) = load_skill(skill_id) else { - push_agent_message(AgentMessage::error(format!( - "Unknown skill: {skill_id}" - ))); + push_agent_message(AgentMessage::error(format!("Unknown skill: {skill_id}"))); return; }; diff --git a/web/src/components/timeline_viewer/overview.rs b/web/src/components/timeline_viewer/overview.rs index 1b4babe1..768235c0 100644 --- a/web/src/components/timeline_viewer/overview.rs +++ b/web/src/components/timeline_viewer/overview.rs @@ -171,10 +171,7 @@ pub fn zoom_fracs(model: &TimelineModel, range: &TimeRange) -> (f64, f64) { (lo, hi) } -pub fn find_slice_in_model( - model: &TimelineModel, - key: SliceKey, -) -> Option<&TimelineSlice> { +pub fn find_slice_in_model(model: &TimelineModel, key: SliceKey) -> Option<&TimelineSlice> { model .tracks .iter() diff --git a/web/src/pages/training.rs b/web/src/pages/training.rs index 3d210594..525b21c9 100644 --- a/web/src/pages/training.rs +++ b/web/src/pages/training.rs @@ -25,8 +25,7 @@ const POLL_MS: u32 = 5000; const STEP_LIMIT: usize = 120; const COMM_LIMIT: usize = 30; -const COMM_SQL: &str = - "SELECT local_step, rank, op, group_size, duration_ms, bytes, role \ +const COMM_SQL: &str = "SELECT local_step, rank, op, group_size, duration_ms, bytes, role \ FROM python.comm_collective ORDER BY timestamp DESC LIMIT "; const COMM_SUMMARY_SQL: &str = "SELECT op, count(*) AS n, \ @@ -280,7 +279,7 @@ pub fn Training() -> Element { } fn queue_investigate_skill(skill_id: String) { - if !load_skill(&skill_id).is_some() { + if load_skill(&skill_id).is_none() { return; } *AGENT_PANEL_OPEN.write() = true; @@ -919,9 +918,7 @@ fn dataframe_rows(df: &probing_proto::prelude::DataFrame) -> usize { type HeatmapData = (Vec, Vec, HashMap<(i32, i64), HeatCell>, f64); -fn build_heatmap( - samples: &[StepDurationSample], -) -> HeatmapData { +fn build_heatmap(samples: &[StepDurationSample]) -> HeatmapData { let mut rank_set = HashSet::new(); let mut step_set = HashSet::new(); let mut raw: HashMap<(i32, i64), f64> = HashMap::new(); @@ -1280,11 +1277,7 @@ fn render_module_hotspots( }; } - let row_count = modules - .as_ref() - .ok() - .map(dataframe_rows) - .unwrap_or(0); + let row_count = modules.as_ref().ok().map(dataframe_rows).unwrap_or(0); rsx! { CollapsibleCardWithIcon { diff --git a/web/src/state/agent.rs b/web/src/state/agent.rs index 471acdbf..e8841a01 100644 --- a/web/src/state/agent.rs +++ b/web/src/state/agent.rs @@ -86,12 +86,7 @@ impl AgentMessage { } } - pub fn skill_run( - skill_id: String, - title: String, - category: String, - docs: String, - ) -> Self { + pub fn skill_run(skill_id: String, title: String, category: String, docs: String) -> Self { Self { kind: AgentMessageKind::SkillRun, text: docs, From c5ceeede8c7da1545a12293c9e37e6273023ab02 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sun, 21 Jun 2026 23:05:40 +0800 Subject: [PATCH 03/37] Update dependencies, enhance documentation, and add probing features (#49) * Update dependencies, enhance documentation, and add new features for probing extensions - Added new dependencies including `probing-hccl-shim`, `probing-nccl-profiler`, and `serde_yaml` to `Cargo.lock` and `Cargo.toml`. - Updated the Makefile to include new targets for HCCL shim library and improved frontend build instructions. - Enhanced documentation to include a new section for the Federated Query Engine and updated existing design documents. - Refactored examples to replace deprecated scripts and improve clarity in tracing examples. - Improved the overall structure of the project by organizing new features and dependencies effectively. * Implement Drop trait for RealLib to ensure proper resource cleanup and remove shutdown function from public API. Update context ID info validation in msprof.rs for improved safety. * Enhance probing extensions with new libraries and update build configurations - Added `probing-hccl-profapi` and `probing-nccl-profiler-cdylib` as new packages in the workspace, including their dependencies in `Cargo.toml` and `Cargo.lock`. - Updated the Makefile to build the new libraries and adjusted targets for HCCL and NCCL profiling. - Refactored the `builtin-schema-docs` feature to include the new HCCL shim library. - Improved coverage reporting by excluding the new cdylib libraries from coverage checks in the Makefile and GitHub workflows. - Updated documentation and project structure to reflect the addition of new features and libraries. * Update SQL queries in documentation to use 'local_step' for consistency - Changed SQL queries in the quickstart and reference documentation to replace 'step' with 'local_step' for clarity and consistency across examples. - Updated related documentation in both English and Chinese to reflect these changes. - Adjusted descriptions in the concepts and SQL tables documentation to align with the new terminology. * Update documentation for SQL analytics and add new environment variable references - Revised SQL queries in the README and quickstart documentation to enhance clarity and consistency, particularly focusing on the use of 'local_step'. - Expanded the documentation to include new sections on environment variables, detailing their usage and configuration for Probing. - Updated both English and Chinese documentation to reflect these changes, ensuring accessibility for a wider audience. - Improved the overall structure and navigation of the documentation to facilitate easier access to key information. --- .github/workflows/test.yml | 4 +- Cargo.lock | 35 + Cargo.toml | 5 +- Makefile | 53 +- README.md | 72 +- docs/mkdocs.yml | 7 + docs/src/api-reference.md | 53 +- docs/src/api-reference.zh.md | 50 +- docs/src/contributing.md | 2 +- docs/src/contributing.zh.md | 2 +- docs/src/design/architecture.md | 17 +- docs/src/design/distributed.zh.md | 2 + docs/src/design/federation.md | 28 + docs/src/design/federation.zh.md | 441 +++++++++++ docs/src/design/index.md | 1 + docs/src/design/index.zh.md | 1 + docs/src/design/modularity.md | 6 +- docs/src/design/modularity.zh.md | 4 +- docs/src/design/training-phase.zh.md | 94 +++ docs/src/guide/concepts.md | 305 +++++--- docs/src/guide/concepts.zh.md | 223 +++--- docs/src/index.md | 102 ++- docs/src/index.zh.md | 97 ++- docs/src/quickstart.md | 185 +++-- docs/src/quickstart.zh.md | 164 ++-- docs/src/reference/env-vars.md | 147 ++++ docs/src/reference/index.md | 2 + docs/src/reference/index.zh.md | 2 + docs/src/reference/skill-format.md | 326 ++++++++ docs/src/reference/sql-tables.md | 49 +- docs/src/reference/sql-tables.zh.md | 41 +- examples/README.md | 11 +- examples/events.py | 137 ---- examples/imagenet_with_span.py | 22 +- examples/tracing.py | 130 ++++ probing/core/Cargo.toml | 8 + probing/core/src/core/cluster.rs | 6 + probing/core/src/core/engine.rs | 8 +- .../src/core/federation/aggregate_pushdown.rs | 71 +- .../src/core/federation/cluster_executor.rs | 18 + probing/core/src/core/federation/convert.rs | 241 ++++-- .../core/src/core/federation/global_table.rs | 19 +- probing/core/src/core/federation/mod.rs | 14 +- probing/core/src/core/federation/rewrite.rs | 33 +- probing/core/src/core/federation/route.rs | 150 ++++ probing/core/src/core/metadata_rewrite.rs | 177 +++++ probing/core/src/core/mod.rs | 69 ++ probing/core/src/core/semantic_catalog.rs | 440 +++++++++++ probing/core/src/trace/mod.rs | 2 +- probing/core/src/trace/span.rs | 12 +- probing/core/src/trace/step.rs | 95 ++- probing/core/src/tracing.rs | 10 +- probing/extensions/hccl-profapi/Cargo.toml | 21 + probing/extensions/hccl-shim/Cargo.toml | 24 + probing/extensions/hccl-shim/README.md | 82 ++ probing/extensions/hccl-shim/src/forward.rs | 249 ++++++ probing/extensions/hccl-shim/src/lib.rs | 198 +++++ probing/extensions/hccl-shim/src/msprof.rs | 278 +++++++ probing/extensions/hccl-shim/src/names.rs | 191 +++++ probing/extensions/hccl-shim/src/tables.rs | 184 +++++ probing/extensions/hccl-shim/src/writer.rs | 424 +++++++++++ .../nccl-profiler-cdylib/Cargo.toml | 22 + probing/extensions/nccl-profiler/Cargo.toml | 3 +- probing/extensions/nccl-profiler/src/lib.rs | 2 +- .../extensions/nccl-profiler/src/tables.rs | 98 ++- .../python/src/extensions/python.rs | 2 +- .../python/src/extensions/python/exttbls.rs | 148 +++- .../extensions/python/src/features/tracing.rs | 94 ++- probing/memtable/src/discover.rs | 44 +- probing/memtable/src/docs.rs | 180 +++++ probing/memtable/src/lib.rs | 1 + probing/memtable/src/memtable.rs | 1 + probing/memtable/src/schema.rs | 36 +- probing/server/src/server/cluster_fanout.rs | 11 +- probing/server/src/server/training.rs | 19 +- pyproject.toml | 4 + python/probing/__init__.py | 18 +- .../bundled_skills/semantic/tables.yaml | 12 +- python/probing/core/table.py | 44 +- python/probing/ext/ray.py | 7 +- python/probing/ext/torch.py | 4 + python/probing/handlers/pythonext.py | 20 +- python/probing/hccl/__init__.py | 85 +++ python/probing/hccl/__main__.py | 81 ++ python/probing/parallel.py | 2 +- python/probing/profiling/collective/record.py | 35 +- python/probing/profiling/phase_tracker.py | 17 + python/probing/profiling/torch_probe.py | 95 +-- python/probing/skills/__main__.py | 3 +- python/probing/tracing.py | 716 ------------------ python/probing/tracing/__init__.py | 62 ++ python/probing/tracing/_bindings.py | 46 ++ python/probing/tracing/backends.py | 590 +++++++++++++++ python/probing/tracing/coordinates.py | 93 +++ python/probing/tracing/hooks.py | 138 ++++ python/probing/tracing/phases.py | 174 +++++ python/probing/tracing/span.py | 317 ++++++++ python/probing/tracing/table.py | 50 ++ python/probing/web_assets.py | 27 +- skills/semantic/tables.yaml | 380 ++++++++-- src/lib.rs | 12 +- tests/regression/core/test_table_docs.py | 83 ++ .../core/test_table_docs_integration.py | 191 +++++ tests/regression/ext/test_comm_collective.py | 1 - .../regression/ext/test_parallel_topology.py | 8 +- tests/regression/ext/test_phase_tracker.py | 128 ++++ tests/regression/ext/test_step_context.py | 66 +- tests/regression/ext/test_tracing_span.py | 217 ++++-- tests/regression/rust/Cargo.toml | 10 +- .../probing/core/federation_explain_tests.rs | 222 ++++++ .../rust/probing/core/federation_tests.rs | 250 +++++- .../probing/core/table_docs_integration.rs | 152 ++++ tests/regression/rust/src/test_helpers.rs | 10 + .../training_observability/conftest.py | 32 +- .../test_collective_recording.py | 3 +- .../test_collective_tracer_hook.py | 4 +- .../test_step_straggler_sql.py | 24 +- .../test_topology_context.py | 11 +- .../test_training_iteration_e2e.py | 51 +- tests/unit/probing/test_web_assets.py | 27 +- .../probing/tracing/test_phase_transitions.py | 374 +++++++++ tests/unit/probing/tracing/test_phases.py | 50 ++ .../probing/tracing/test_span_backends.py | 153 ++++ web/src/api/traces.rs | 36 +- web/src/components/sidebar/mod.rs | 2 +- web/src/hooks/mod.rs | 10 +- web/src/pages/traces.rs | 8 +- web/src/pages/training.rs | 6 +- 128 files changed, 9736 insertions(+), 1930 deletions(-) create mode 100644 docs/src/design/federation.md create mode 100644 docs/src/design/federation.zh.md create mode 100644 docs/src/design/training-phase.zh.md create mode 100644 docs/src/reference/env-vars.md create mode 100644 docs/src/reference/skill-format.md delete mode 100644 examples/events.py create mode 100644 examples/tracing.py create mode 100644 probing/core/src/core/federation/route.rs create mode 100644 probing/core/src/core/metadata_rewrite.rs create mode 100644 probing/core/src/core/semantic_catalog.rs create mode 100644 probing/extensions/hccl-profapi/Cargo.toml create mode 100644 probing/extensions/hccl-shim/Cargo.toml create mode 100644 probing/extensions/hccl-shim/README.md create mode 100644 probing/extensions/hccl-shim/src/forward.rs create mode 100644 probing/extensions/hccl-shim/src/lib.rs create mode 100644 probing/extensions/hccl-shim/src/msprof.rs create mode 100644 probing/extensions/hccl-shim/src/names.rs create mode 100644 probing/extensions/hccl-shim/src/tables.rs create mode 100644 probing/extensions/hccl-shim/src/writer.rs create mode 100644 probing/extensions/nccl-profiler-cdylib/Cargo.toml create mode 100644 probing/memtable/src/docs.rs create mode 100644 python/probing/hccl/__init__.py create mode 100644 python/probing/hccl/__main__.py create mode 100644 python/probing/profiling/phase_tracker.py delete mode 100644 python/probing/tracing.py create mode 100644 python/probing/tracing/__init__.py create mode 100644 python/probing/tracing/_bindings.py create mode 100644 python/probing/tracing/backends.py create mode 100644 python/probing/tracing/coordinates.py create mode 100644 python/probing/tracing/hooks.py create mode 100644 python/probing/tracing/phases.py create mode 100644 python/probing/tracing/span.py create mode 100644 python/probing/tracing/table.py create mode 100644 tests/regression/core/test_table_docs.py create mode 100644 tests/regression/core/test_table_docs_integration.py create mode 100644 tests/regression/ext/test_phase_tracker.py create mode 100644 tests/regression/rust/probing/core/federation_explain_tests.rs create mode 100644 tests/regression/rust/probing/core/table_docs_integration.rs create mode 100644 tests/unit/probing/tracing/test_phase_transitions.py create mode 100644 tests/unit/probing/tracing/test_phases.py create mode 100644 tests/unit/probing/tracing/test_span_backends.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9d9d2a66..e56266be 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -122,7 +122,9 @@ jobs: cargo llvm-cov clean --workspace # Do not source show-env here — llvm-cov nextest sets instrumentation itself. # extension-module is for the Python wheel only; omit it in lib tests (PyO3 linking). - cargo llvm-cov nextest --workspace --no-default-features + # Cdylib-only plugin wrappers share sources with rlib crates; exclude from coverage. + cargo llvm-cov nextest --workspace --no-default-features \ + --exclude probing-hccl-profapi --exclude probing-nccl-profiler-cdylib cargo llvm-cov nextest -p probing-server --no-default-features --features kmsg,gpu,gpu-cuda cargo llvm-cov report --lcov --output-path coverage.lcov diff --git a/Cargo.lock b/Cargo.lock index 9dcd39ff..651b58ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3362,11 +3362,14 @@ dependencies = [ "libc", "log", "once_cell", + "probing-hccl-shim", "probing-macros", "probing-memtable", + "probing-nccl-profiler", "probing-proto", "serde", "serde_json", + "serde_yaml", "sled", "tempfile", "thiserror 2.0.12", @@ -3393,6 +3396,27 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "probing-hccl-profapi" +version = "0.2.5" +dependencies = [ + "libc", + "once_cell", + "parking_lot 0.12.3", + "probing-memtable", +] + +[[package]] +name = "probing-hccl-shim" +version = "0.2.5" +dependencies = [ + "libc", + "once_cell", + "parking_lot 0.12.3", + "probing-memtable", + "tempfile", +] + [[package]] name = "probing-macros" version = "0.2.5" @@ -3424,6 +3448,17 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "probing-nccl-profiler-cdylib" +version = "0.2.5" +dependencies = [ + "libc", + "once_cell", + "parking_lot 0.12.3", + "probing-memtable", + "thiserror 2.0.12", +] + [[package]] name = "probing-proto" version = "0.2.5" diff --git a/Cargo.toml b/Cargo.toml index 56715e1d..33980206 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,9 @@ members = [ "probing/extensions/python", "probing/extensions/gpu", "probing/extensions/nccl-profiler", + "probing/extensions/nccl-profiler-cdylib", + "probing/extensions/hccl-shim", + "probing/extensions/hccl-profapi", "probing/server", "probing/crates/store", ] @@ -113,7 +116,7 @@ pyo3-build-config = "0.29.0" [profile.dev] debug = 1 split-debuginfo = "unpacked" -codegen-units = 256 +codegen-units = 16 [profile.release] opt-level = "z" # Optimize for size. diff --git a/Makefile b/Makefile index 42df75a2..dcfb840c 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Probing Makefile # # develop → maturin develop (Rust/Python daily loop) -# frontend → web/dist/ (manual, needs dx) +# frontend → web/dist/ + python/probing/bundled_web/ (manual, needs dx) # wheel → bundle skills + UI, then maturin build # frontend wheel → full release path # @@ -32,6 +32,7 @@ endif endif PYTHON ?= $(shell test -x .venv/bin/python && echo .venv/bin/python || echo python3) +VENV_PYTHON := $(abspath .venv/bin/python) BUILD_PY_DEPS := build wheel toml maturin DEV_PTH := python/probing/dev_pth.py DEV_PY_DEPS := pyyaml pytest pytest-cov coverage ipython ipykernel @@ -53,7 +54,7 @@ help: @echo "" @echo " develop / dev Bootstrap: _core, CLI, pytest, site hook" @echo " core Rebuild probing._core after Rust edits" - @echo " frontend Build web/dist/ (dx; manual)" + @echo " frontend Build web/dist/ + sync bundled_web (dx; manual)" @echo " wheel Build dist/*.whl (needs web/dist/; bundles skills + UI)" @echo " wheel-ci alias for wheel (native build; PyPI uses maturin-action + zig)" @echo " install-wheel pip install dist/probing-*.whl" @@ -83,7 +84,7 @@ install-dev-python-deps: fi # ============================================================================== -.PHONY: core develop dev check-dev frontend wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib venv venv-wheel install-build-deps install-wheel-test-deps +.PHONY: core develop dev check-dev frontend sync-bundled-web wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib hccl-shim-lib venv venv-wheel install-build-deps install-wheel-test-deps venv: @test -x .venv/bin/python || $(shell command -v python3 || echo python3) -m venv .venv @@ -98,7 +99,7 @@ install-build-deps: venv install-wheel-test-deps: venv $(PYTHON) -m pip install -q -U pip $(PYTEST_WHEEL_DEPS) -core: nccl-profiler-lib +core: nccl-profiler-lib hccl-shim-lib $(PYTHON) -m maturin develop $(MATURIN_FLAGS) develop: install-build-deps core install-dev-python-deps @@ -125,16 +126,24 @@ frontend: cp -R $(DX_PUBLIC)/. web/dist/ @mkdir -p web/dist/assets @cp -f web/assets/logo.svg web/dist/logo.svg 2>/dev/null || true + @cp -f web/assets/logo.svg web/dist/assets/logo.svg 2>/dev/null || true @cp -f web/assets/tailwind.css web/dist/assets/tailwind.css @echo "web/dist ($$(du -sh web/dist | cut -f1))" + $(MAKE) sync-bundled-web + +sync-bundled-web: + @test -f web/dist/index.html || { echo "error: web/dist missing — run make frontend first"; exit 1; } + rm -rf python/probing/bundled_web + cp -R web/dist python/probing/bundled_web + @echo "python/probing/bundled_web ($$(du -sh python/probing/bundled_web | cut -f1))" wheel-bundle: @test -f web/dist/index.html || { echo "error: run 'make frontend' first"; exit 1; } - rm -rf python/probing/bundled_skills python/probing/bundled_web + rm -rf python/probing/bundled_skills cp -R skills python/probing/bundled_skills - cp -R web/dist python/probing/bundled_web + $(MAKE) sync-bundled-web -wheel: install-build-deps wheel-bundle nccl-profiler-lib +wheel: install-build-deps wheel-bundle nccl-profiler-lib hccl-shim-lib $(PYTHON) -m maturin build $(MATURIN_FLAGS) --out dist wheel-ci: @@ -160,7 +169,7 @@ else NCCL_OUT := target/release/libprobing_nccl_profiler.so endif nccl-profiler-lib: - cargo build -p probing-nccl-profiler $(CARGO_RELEASE) + cargo build -p probing-nccl-profiler-cdylib $(CARGO_RELEASE) mkdir -p python/probing/libs cp $(NCCL_OUT) python/probing/libs/ else @@ -168,6 +177,22 @@ nccl-profiler-lib: @: endif +# Linux HCCL libprofapi.so shim → python/probing/shim/hccl/ +ifeq ($(UNAME_S),Linux) +ifdef DEBUG +HCCL_SHIM_OUT := target/debug/libprofapi.so +else +HCCL_SHIM_OUT := target/release/libprofapi.so +endif +hccl-shim-lib: + cargo build -p probing-hccl-profapi $(CARGO_RELEASE) + mkdir -p python/probing/shim/hccl + cp $(HCCL_SHIM_OUT) python/probing/shim/hccl/ +else +hccl-shim-lib: + @: +endif + # ============================================================================== PYTEST_WHEEL_DEPS := pytest pytest-cov coverage pyyaml websockets pandas torch ipykernel # Installed wheel only — do not pass python/probing (conflicts with site-packages). @@ -184,8 +209,8 @@ test: test-rust test-python test-rust: test-rust-unit test-rust-regression test-rust-unit: - @if test -x .venv/bin/python; then \ - export PYTHON_SYS_EXECUTABLE=.venv/bin/python PYO3_PYTHON=.venv/bin/python; \ + @if test -x $(VENV_PYTHON); then \ + export PYTHON_SYS_EXECUTABLE=$(VENV_PYTHON) PYO3_PYTHON=$(VENV_PYTHON); \ elif command -v pyenv >/dev/null 2>&1; then \ P=$$(pyenv which python3 2>/dev/null); \ test -n "$$P" && export PYTHON_SYS_EXECUTABLE=$$P PYO3_PYTHON=$$P; \ @@ -193,8 +218,8 @@ test-rust-unit: cargo nextest run --lib --workspace --no-default-features --nff test-rust-regression: - @if test -x .venv/bin/python; then \ - export PYTHON_SYS_EXECUTABLE=.venv/bin/python PYO3_PYTHON=.venv/bin/python; \ + @if test -x $(VENV_PYTHON); then \ + export PYTHON_SYS_EXECUTABLE=$(VENV_PYTHON) PYO3_PYTHON=$(VENV_PYTHON); \ elif command -v pyenv >/dev/null 2>&1; then \ P=$$(pyenv which python3 2>/dev/null); \ test -n "$$P" && export PYTHON_SYS_EXECUTABLE=$$P PYO3_PYTHON=$$P; \ @@ -233,7 +258,9 @@ clippy-fix: coverage-rust: cargo llvm-cov clean --workspace - cargo llvm-cov nextest --workspace --no-default-features --nff --lcov --output-path coverage.lcov --ignore-filename-regex '(.*/tests?/|.*/benches?/|.*/examples?/)' || true + cargo llvm-cov nextest --workspace --no-default-features --nff \ + --exclude probing-hccl-profapi --exclude probing-nccl-profiler-cdylib \ + --lcov --output-path coverage.lcov --ignore-filename-regex '(.*/tests?/|.*/benches?/|.*/examples?/)' || true coverage-python: ${PYTEST_RUN} --cov=python/probing --cov=tests --cov-report=xml:coverage.xml --cov-report=term $(PYTEST_ARGS) || true coverage: coverage-rust coverage-python diff --git a/README.md b/README.md index 2cbccb1a..5c8d8194 100644 --- a/README.md +++ b/README.md @@ -113,24 +113,20 @@ probing list ### SQL Analytics Interface ```bash -# Memory usage analysis -probing -t query "SELECT * FROM memory_usage WHERE timestamp > now() - interval '5 min'" - -# Performance hotspot analysis +# GPU memory trend across training steps probing -t query " - SELECT operation_name, avg(duration_ms), count(*) - FROM profiling_data - WHERE timestamp > now() - interval '5 minutes' - GROUP BY operation_name - ORDER BY avg(duration_ms) DESC + SELECT local_step, AVG(allocated) as avg_mb + FROM python.torch_trace + GROUP BY local_step ORDER BY local_step " -# Training progress tracking +# Find the slowest collectives probing -t query " - SELECT epoch, avg(loss), min(loss), count(*) as steps - FROM training_logs - GROUP BY epoch - ORDER BY epoch + SELECT op, AVG(duration_ms) as avg_ms, COUNT(*) as calls + FROM python.comm_collective + GROUP BY op + ORDER BY avg_ms DESC + LIMIT 5 " ``` @@ -160,17 +156,23 @@ The REPL provides: ### Distributed Training Analysis ```bash -# Monitor all cluster nodes -probing cluster attach - -# Inter-node communication latency -probing -t query "SELECT src_rank, dst_rank, avg(latency_ms) FROM comm_metrics" - -# Cross-node stack trace comparison -probing -t query "SELECT * FROM python.backtrace" +# See all registered cluster nodes +probing -t cluster nodes + +# Cross-rank communication analysis via federation +probing -t query " + SELECT _role, _rank, op, AVG(duration_ms) as avg_ms + FROM global.python.comm_collective + GROUP BY _role, _rank, op + ORDER BY avg_ms DESC + LIMIT 10 +" -# GPU utilization analysis -probing -t query "SELECT avg(gpu_util) FROM gpu_metrics WHERE timestamp > now() - 60" +# GPU utilization across devices +probing -t query " + SELECT ts, mem_used_pct, gpu_util_pct + FROM gpu.utilization ORDER BY ts DESC LIMIT 20 +" ``` ### Memory Analysis @@ -178,16 +180,20 @@ probing -t query "SELECT avg(gpu_util) FROM gpu_metrics WHERE timestamp > # Quick memory usage overview probing -t memory -# Memory growth trend analysis -probing -t query "SELECT hour(timestamp), avg(memory_mb) FROM memory_usage GROUP BY hour(timestamp)" - -# Memory leak detection +# Memory growth trend across steps probing -t query " - SELECT function_name, sum(allocated_bytes) as total_alloc - FROM memory_allocations - WHERE timestamp > now() - interval '1 hour' - GROUP BY function_name - ORDER BY total_alloc DESC + SELECT local_step, AVG(allocated_delta) as delta_mb + FROM python.torch_trace + GROUP BY local_step + ORDER BY local_step +" + +# Check current CPU/GPU memory via eval +probing -t eval " +import torch, gc; gc.collect() +alloc = torch.cuda.memory_allocated()/1024**2 +reserved = torch.cuda.memory_reserved()/1024**2 +print(f'GPU alloc: {alloc:.0f}MB, reserved: {reserved:.0f}MB') " ``` diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 8aef6972..4ae07856 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -99,6 +99,7 @@ plugins: Data Layer: 数据层 Profiling: 性能分析 Distributed: 分布式 + Federated Query Engine: 联邦查询引擎 Cluster with Pulsing: 基于 Pulsing 的集群 Extensibility: 扩展机制 Modularity: 模块化与边界 @@ -109,6 +110,9 @@ plugins: API Reference: API 参考 Reference: 参考手册 SQL Tables: SQL 表目录 + API Reference: API 参考 + Environment Variables: 环境变量 + Skill Format: Skill 格式规范 Versions: 版本兼容性 Contributing: 贡献指南 - mkdocstrings: @@ -142,6 +146,7 @@ nav: - Profiling: design/profiling.md - Debugging: design/debugging.md - Distributed: design/distributed.md + - Federated Query Engine: design/federation.md - NCCL Profiler: design/nccl-profiler.md - Cluster with Pulsing: design/cluster-pulsing.md - Extensibility: design/extensibility.md @@ -154,6 +159,8 @@ nav: - reference/index.md - SQL Tables: reference/sql-tables.md - API Reference: api-reference.md + - Environment Variables: reference/env-vars.md + - Skill Format: reference/skill-format.md - Versions: versions.md - Contributing: contributing.md diff --git a/docs/src/api-reference.md b/docs/src/api-reference.md index 15df4bfb..19e69015 100644 --- a/docs/src/api-reference.md +++ b/docs/src/api-reference.md @@ -100,12 +100,49 @@ import probing df = probing.query("SELECT * FROM python.torch_trace LIMIT 10") ``` -### probing.span / probing.event +### probing.span / probing.event / probing.record_span / probing.step + +Four user-facing verbs: + +```python +import probing + +with probing.span("forward", phase=probing.FORWARD): + probing.event("batch.stats", attributes=[{"loss": 1.25}]) + +probing.record_span("all_reduce", duration_ns=1_000_000) + +probing.attach_training_phases(model, optimizer) # hook-driven forward/backward/optimizer + +probing.step.micro_step # finest counter +probing.step() # micro_step +1 +probing.step(42) # set micro_step +probing.step(micro_batches=10) # gradient-accumulation grouping +probing.step.local_step # micro_step // micro_batches +probing.step.global_step # = local_step +``` + +### probing.tracing primitives (integrators / plugins) + +| Category | Import | Purpose | +|----------|--------|---------| +| Span | `span`, `event`, `record_span`, `current_span` | Instrumentation | +| Step | `step`, `step_fields` | Training coordinates | +| Phase | `FORWARD`, `BACKWARD`, `OPTIMIZER`, `phases`, `attach_training_phases` | Training phase | +| Integrator | `phases.infer_from_stage()` | Torch stage → training phase | +| Context | `span_attrs`, `row_fields`, `step_fields` | Span and table row context fields | +| Backend | `register_backend`, `configure_backends`, `list_backends`, `reset_backends` | Export plugins; built-in: `memtable`, `logger`, `otel` | +| Table | `TraceEvent`, `SPANS_SQL` | SQL / skills | ```python -with probing.span("forward", kind="nn.forward"): +from probing.tracing import register_backend, configure_backends + +with probing.span("forward", phase=probing.FORWARD, source="my_trainer"): ... -probing.event("batch.stats", attributes=[{"loss": 1.25}]) + +register_backend("my_sink", factory) +configure_backends(["memtable", "logger"]) # terminal + memtable +configure_backends(["memtable", "my_sink"]) ``` ### @table (dataclass plugins) @@ -137,14 +174,10 @@ probing.current_role() probing.clear_role() ``` -### probing.tracing.step_snapshot - -```python -from probing.tracing import step_snapshot +### probing.step -snap = step_snapshot() -# snap.local_step, snap.global_step — use in SQL filters and custom tables -``` +Use ``probing.step()`` instead of the removed ``step_snapshot`` / ``sync_local_step`` helpers. +See **probing.span / probing.event / probing.record_span / probing.step** above. --- diff --git a/docs/src/api-reference.zh.md b/docs/src/api-reference.zh.md index 94c3b64e..f1afd293 100644 --- a/docs/src/api-reference.zh.md +++ b/docs/src/api-reference.zh.md @@ -100,12 +100,49 @@ import probing df = probing.query("SELECT * FROM python.torch_trace LIMIT 10") ``` -### probing.span / probing.event +### probing.span / probing.event / probing.record_span / probing.step + +用户面四个动词: ```python -with probing.span("forward", kind="nn.forward"): +import probing + +with probing.span("forward", phase=probing.FORWARD): + probing.event("batch.stats", attributes=[{"loss": 1.25}]) + +probing.record_span("all_reduce", duration_ns=1_000_000) + +probing.attach_training_phases(model, optimizer) # hook 驱动 forward/backward/optimizer + +probing.step.micro_step # 最细计数 +probing.step() # micro_step +1 +probing.step(42) # 设置 micro_step +probing.step(micro_batches=10) # 梯度累积分组 +probing.step.local_step # micro_step // micro_batches +probing.step.global_step # = local_step +``` + +### probing.tracing 原语(集成 / 插件) + +| 类别 | 导入 | 用途 | +|------|------|------| +| Span | `span`, `event`, `record_span`, `current_span` | 插桩 | +| Step | `step`, `step_fields` | 训练坐标 | +| Phase | `FORWARD`, `BACKWARD`, `OPTIMIZER`, `phases`, `attach_training_phases` | 训练阶段 | +| Integrator | `phases.infer_from_stage()` | Torch stage → 训练 phase | +| Context | `span_attrs`, `row_fields`, `step_fields` | span 与表行上下文字段 | +| Backend | `register_backend`, `configure_backends`, `list_backends`, `reset_backends` | 导出插件;内置:`memtable`、`logger`、`otel` | +| Table | `TraceEvent`, `SPANS_SQL` | SQL / skill | + +```python +from probing.tracing import register_backend, configure_backends + +with probing.span("forward", phase=probing.FORWARD, source="my_trainer"): ... -probing.event("batch.stats", attributes=[{"loss": 1.25}]) + +register_backend("my_sink", factory) +configure_backends(["memtable", "logger"]) # 终端 + memtable +configure_backends(["memtable", "my_sink"]) ``` ### @table(dataclass 插件) @@ -139,12 +176,7 @@ probing.clear_role() ### probing.tracing.step_snapshot -```python -from probing.tracing import step_snapshot - -snap = step_snapshot() -# snap.local_step, snap.global_step — 用于 SQL 过滤与自定义表 -``` +已合并为 ``probing.step()`` — 见上文 **probing.step**。 --- diff --git a/docs/src/contributing.md b/docs/src/contributing.md index d4cd7ceb..5a89bcc2 100644 --- a/docs/src/contributing.md +++ b/docs/src/contributing.md @@ -165,7 +165,7 @@ make test-python-wheel # tests against installed wheel + checkout pure Python ```bash uv pip install torch torchvision # or pip install … -PROBING=1 python examples/events.py +PROBING=1 python examples/tracing.py ``` See [examples/README.md](https://github.com/DeepLink-org/probing/blob/main/examples/README.md). diff --git a/docs/src/contributing.zh.md b/docs/src/contributing.zh.md index 8dfd5dbc..99e39039 100644 --- a/docs/src/contributing.zh.md +++ b/docs/src/contributing.zh.md @@ -165,7 +165,7 @@ make test-python-wheel ```bash uv pip install torch torchvision -PROBING=1 python examples/events.py +PROBING=1 python examples/tracing.py ``` 见 [examples/README.md](https://github.com/DeepLink-org/probing/blob/main/examples/README.md)。 diff --git a/docs/src/design/architecture.md b/docs/src/design/architecture.md index c565bf33..49d5379c 100644 --- a/docs/src/design/architecture.md +++ b/docs/src/design/architecture.md @@ -160,14 +160,15 @@ probing -t host:port query "..." ## Security Considerations - **Local mode**: Unix socket permissions (process owner only) -- **Remote mode**: Optional authentication -- **Network**: Support for TLS encryption +- **Remote mode**: Optional authentication token via `PROBING_TOKEN` ## Performance Characteristics -| Aspect | Target | -|--------|--------| -| Overhead | < 5% in typical workloads | -| Memory | < 50MB additional | -| Latency | < 10ms for queries | -| Throughput | 1000+ queries/sec | +Probing is designed for minimal overhead on training workloads: + +| Aspect | Design approach | +|--------|----------------| +| Overhead | Lock-free mmap writes on hot path; sampling in background threads | +| Memory | Fixed-size ring buffers per table (MEMT); bounded by retention config | +| Latency | Queries execute against in-process DataFusion; no network round-trip for local access | +| Throughput | Columnar (Arrow) scan; `information_schema` for introspection | diff --git a/docs/src/design/distributed.zh.md b/docs/src/design/distributed.zh.md index f2633747..837ca318 100644 --- a/docs/src/design/distributed.zh.md +++ b/docs/src/design/distributed.zh.md @@ -101,6 +101,8 @@ ORDER BY avg_ms DESC" 通过 torchrun(`setup_torchrun_cluster`)或 `PUT /apis/nodes` 注册节点,`_rank` / `_role` 才能正确解析。训练脚本中可用 `probing.set_role(...)` 运行时覆盖 role。 +引擎实现与正确性测试要求见 **[联邦查询引擎](federation.zh.md)**。 + ## 同步调试 ### 捕获所有堆栈 diff --git a/docs/src/design/federation.md b/docs/src/design/federation.md new file mode 100644 index 00000000..8e4e65b5 --- /dev/null +++ b/docs/src/design/federation.md @@ -0,0 +1,28 @@ +# Federated Query Engine + +Product design for cross-rank SQL in probing: ask the whole training cluster from a +coordinator with one query — who is slow, on which step, compute vs network, which machine. + +!!! note "Language" + Full design (scenarios, SQL, execution paths, acceptance bar) is in + **[中文版 / Chinese](/zh/design/federation/)**. + +## Summary + +| Path | When | Module | +|------|------|--------| +| Local `probe` | Single-process query | DataFusion | +| **Aggregate pushdown (A)** | Single-table `global.*` + `GROUP BY` / safe aggregates | `aggregate_pushdown.rs` | +| **Federated scan (B)** | Single-table scan, filters, raw rows | `FederatedScanExec` | +| **Broadcast (C)** | JOIN / CTE / multi-table on each rank | `cluster_fanout.rs` | + +Federation tags (fixed): `_host`, `_addr`, `_rank`, `_node_rank`, `_local_rank`, `_role`. + +Chinese doc covers: diagnostic scenarios (straggler, heatmap, slowdown, topology, hang), +engine behavior spec (routing, rewrite, tags, paths A/B/C), and the wan-scale «five SQL» bar. + +## Related + +- **[Federation (中文)](/zh/design/federation/)** +- [Distributed](distributed.md) +- [Modularity](modularity.md) diff --git a/docs/src/design/federation.zh.md b/docs/src/design/federation.zh.md new file mode 100644 index 00000000..41c8dd9e --- /dev/null +++ b/docs/src/design/federation.zh.md @@ -0,0 +1,441 @@ +# 联邦查询引擎 + +**产品定位:** 在 coordinator(通常是 rank 0 / master 探针)上用 **一条 SQL** 问整个训练集群——「谁慢、慢在哪一步、是算力还是网络、是哪台机器」——而不必 SSH 逐 rank 拉日志。 + +**设计契约:** 本文定义用户可见语义;实现以 `probing/core/src/core/federation/` 为准,不一致时以本文推进对齐。 + +术语:[核心概念](../guide/concepts.zh.md) · 用法:[分布式](distributed.zh.md) · [SQL 分析](../guide/sql-analytics.zh.md) + +--- + +## 1. 问题与原则 + +每个 rank 的探针 **只写本地 memtable**(`python.comm_collective`、`nccl.proxy_ops`、`python.trace_event` 等)。跨 rank 分析 = coordinator 把查询拆成: + +1. 各 peer 本地执行 `probe.*` +2. HTTP fan-out 拉结果 +3. 合并行并注入 **联邦标签**(标明行来自哪台机器、哪个 rank) + +**原则** + +| 原则 | 含义 | +|------|------| +| 本地写、按需读 | 训练路径零额外中心存储;只有显式 `cluster query` / `global.*` 才 fan-out | +| SQL 统一入口 | CLI、Web、Skill、进程内 `probing.query()` 最终都走同一套 Engine | +| 部分失败可接受 | 单个 peer 超时/不可达:丢弃该分片,返回 `nodes_failed`,不拖垮整查 | +| 不做跨 rank JOIN | 两张表要在 **同一进程** 内 join;不支持 `global.a JOIN global.b` | + +**入口** + +| 谁 | 怎么用 | 是否 fan-out | +|----|--------|--------------| +| 单 rank 调试 | `probing -t query "…"` | 否 | +| 集群诊断 | `probing -t rank0:8080 cluster query "…"` | 是 | +| Web Training 热力图 | `GET /apis/training/step_matrix?cluster=true` | 是 | +| 进程内 | rank 0 上 `probing.query("… global.…")` | 视 SQL | + +--- + +## 2. 两个 Catalog 与联邦标签 + +### 2.1 `probe` 与 `global` + +| Catalog | 含义 | +|---------|------| +| **`probe.*`** | 当前进程本地表 | +| **`global.*`** | 同一张表的 **联邦镜像**:本地 scan + 各 peer lazy fetch,合并后返回 | + +用户写 `FROM python.comm_collective` 且 `cluster=true` 时,引擎 rewrite 为 `global.python.comm_collective` 再路由。 + +Peer 上 **永远** 执行 `probe.*`,避免递归联邦。 + +### 2.2 六列联邦标签(固定) + +与表内 `rank`、`role` 等采集列严格区分——标签表示 **「这行是哪个探针返回的」**。 + +| 标签 | 含义 | 来源 | +|------|------|------| +| `_host` | 源 hostname | `cluster.nodes.host` | +| `_addr` | 探针 `host:port` | `cluster.nodes.addr` | +| `_rank` | 全局 torch rank | `RANK` | +| `_node_rank` | 节点/worker group rank | `GROUP_RANK` | +| `_local_rank` | 节点内 GPU 序号 | `LOCAL_RANK` | +| `_role` | 并行 key,如 `dp=2,pp=1,tp=0` | 注册 / `set_role` | + +整型缺失 → `-1`;`_role` 缺失 → `""`。 + +**投影规则** + +- `SELECT * FROM global.t` → 自动展开六列标签(`EXCLUDE` rewrite) +- `SELECT rank, avg_ms …` → **不**自动带标签;需要则显式写 `_rank` 等 +- 标签在 **coordinator 合并时** inject,不写入 peer memtable + +--- + +## 3. 诊断场景(用户要什么 → 用什么 SQL) + +复杂问题用 **诊断链** 分步收窄,而不是一条 SQL 扫全集群 raw 行。下列场景对标生产 LLM 集群实践([OSDI'25 Straggler / SMon](https://www.usenix.org/conference/osdi25/presentation/lin-jinkun)、[MegaScale](https://arxiv.org/pdf/2402.15627)、NCCL collective 归因),语义对齐即可,非复刻某套系统。 + +### 3.1 Straggler:从 rank 到机器到热力图 + +**链:** rank 榜 → 慢节点 → step×rank 热力图 → 按 op 分解 → NCCL culprit/victim + +**① 各 rank collective 谁最慢** + +```sql +SELECT _role, _rank, rank, + avg(duration_ms) AS avg_ms, max(duration_ms) AS max_ms +FROM global.python.comm_collective +WHERE global_step >= (SELECT max(global_step) - 50 FROM global.python.comm_collective) +GROUP BY _role, _rank, rank +ORDER BY avg_ms DESC; +``` + +**② 慢的是整台机器还是单卡** — 按 `_host` 聚合 + +```sql +SELECT _host, _node_rank, + count(DISTINCT _rank) AS ranks_on_host, + avg(duration_ms) AS avg_comm_ms +FROM global.python.comm_collective +WHERE global_step >= (SELECT max(global_step) - 100 FROM global.python.comm_collective) +GROUP BY _host, _node_rank +ORDER BY avg_comm_ms DESC; +``` + +**③ Step × Rank 热力图** — Training 页矩阵;底层需同 rank 内 span JOIN + +```sql +SELECT s.attributes, s.time AS start_time, + CAST((e.time - s.time) / 1000 AS DOUBLE) AS duration_us +FROM python.trace_event s +JOIN python.trace_event e + ON s.span_id = e.span_id AND e.record_type = 'span_end' +WHERE s.record_type = 'span_start' AND s.name = 'train.step'; +``` + +Coordinator 聚成 `(rank, step) → duration_ms` 供 UI 着色。HTTP:`GET /apis/training/step_matrix?cluster=true`。 + +**④ 仅用 collective 的 step×rank long format**(前端 pivot) + +```sql +SELECT global_step, _rank, _host, op, sum(duration_ms) AS comm_ms +FROM global.python.comm_collective +WHERE global_step >= (SELECT max(global_step) - 120 FROM global.python.comm_collective) +GROUP BY global_step, _rank, _host, op; +``` + +**⑤ NCCL:算力慢还是等网络** + +```sql +SELECT seq, coll_func, _rank, + sum(send_gpu_wait_ns) AS gpu_wait, + sum(recv_wait_ns) AS recv_wait +FROM global.nccl.proxy_ops +WHERE seq >= (SELECT max(seq) - 50 FROM global.nccl.proxy_ops) +GROUP BY seq, coll_func, _rank; +``` + +### 3.2 Slowdown:job 有多慢、是持久还是偶发 + +对标 Byte / SMon 的 what-if:**理想 step 时间** vs **实际** 的比值。SQL 侧用 barrier proxy(非完整离散事件模拟)。 + +**Per-step slowdown ratio** + +```sql +WITH per_rank_step AS ( + SELECT global_step, _rank, max(duration_ms) AS max_op_ms + FROM global.python.comm_collective + WHERE global_step >= (SELECT max(global_step) - 500 FROM global.python.comm_collective) + GROUP BY global_step, _rank +), +step_cp AS ( + SELECT global_step, + avg(max_op_ms) / NULLIF(min(max_op_ms), 0) AS step_slowdown_ratio + FROM per_rank_step + GROUP BY global_step +) +SELECT avg(step_slowdown_ratio) AS job_slowdown_proxy, + count(*) FILTER (WHERE step_slowdown_ratio > 1.1) AS slow_steps +FROM step_cp; +``` + +**某 rank 是否「长期」最慢** — `worst_fraction`:在多少 step 上是最慢 rank + +```sql +-- 含窗口函数;万卡规模宜拆成两步:先 A 出 per_step,再 coordinator 算 +WITH per_step AS ( + SELECT global_step, _rank, _host, sum(duration_ms) AS step_ms + FROM global.python.comm_collective + WHERE global_step >= (SELECT max(global_step) - 300 FROM global.python.comm_collective) + GROUP BY global_step, _rank, _host +) +SELECT _rank, _host, + sum(CASE WHEN step_ms = max(step_ms) OVER (PARTITION BY global_step) THEN 1 ELSE 0 END) + * 1.0 / count(*) AS worst_fraction +FROM per_step +GROUP BY _rank, _host +ORDER BY worst_fraction DESC; +``` + +### 3.3 并行拓扑:PP / TP / DP 与 NCCL seq + +```sql +-- 按 _role 看各 step 通信量 +SELECT _role, _rank, global_step, sum(duration_ms) AS comm_ms +FROM global.python.comm_collective +WHERE global_step >= (SELECT max(global_step) - 80 FROM global.python.comm_collective) +GROUP BY _role, _rank, global_step; + +-- NCCL 细粒度:pp/tp/dp × seq(需 NCCL profiler 插件) +SELECT pp_rank, tp_rank, dp_rank, rank, seq, coll_func, + sum(send_gpu_wait_ns) AS gpu_wait, sum(recv_wait_ns) AS net_wait +FROM global.nccl.proxy_ops +WHERE seq >= (SELECT max(seq) - 100 FROM global.nccl.proxy_ops) +GROUP BY pp_rank, tp_rank, dp_rank, rank, seq, coll_func; +``` + +### 3.4 算力 vs 通信 vs 机器资源 + +**Byte 结论:straggler 常来自计算而非 collective 墙钟。** 必须在 **同 rank 内** join: + +```sql +SELECT c.global_step, c.rank, c.role, + sum(c.duration_ms) AS comm_ms, + sum(CASE WHEN t.stage LIKE 'post forward' THEN t.duration ELSE 0 END) AS compute_sec +FROM python.comm_collective c +JOIN python.torch_trace t + ON c.global_step = t.global_step AND c.rank = t.rank AND c.role = t.role +WHERE c.global_step >= (SELECT max(global_step) - 50 FROM python.comm_collective) +GROUP BY c.global_step, c.rank, c.role; +``` + +Coordinator 收到各 peer 结果后,再 `GROUP BY _rank` 汇总。`comm + gpu` 对齐需 coordinator 侧 merge 两路聚合结果(v2);暂不支持 `global.comm JOIN global.gpu`。 + +### 3.5 Hang 与掉队 + +```sql +-- 哪些 rank 的 global_step 明显落后 +SELECT _host, _rank, _local_rank, max(global_step) AS last_step +FROM global.python.comm_collective +GROUP BY _host, _rank, _local_rank +HAVING max(global_step) < (SELECT max(global_step) - 5 FROM global.python.comm_collective); + +-- 栈是否卡在 collective +SELECT _host, _rank, func, file, lineno +FROM global.python.backtrace +WHERE func LIKE '%collective%' OR func LIKE '%nccl%'; +``` + +--- + +## 4. 引擎行为规格 + +本节从 §3 诊断需求反推 **引擎必须保证的用户可见语义**。实现入口:`probing/core/src/core/federation/`(执行)、`probing/server/src/server/cluster_fanout.rs`(`cluster=true` 路由)。 + +### 4.1 处理流水线 + +```mermaid +flowchart LR + IN[用户 SQL] --> CF{cluster?} + CF -->|否| L0[本地 DataFusion / probe.*] + CF -->|是| RT[路径选型 A/B/C] + RT --> RW[Catalog 改写] + RW --> EX[各分片执行] + EX --> TG[注入联邦标签] + TG --> MG[合并 / 二次聚合] + MG --> OUT[DataFrame + FanoutMeta] +``` + +**统一约定** + +| 项 | 语义 | +|----|------| +| 响应体 | `dataframe` + `meta.nodes_queried` + `meta.nodes_failed` | +| Peer 集合 | `cluster.nodes` 快照,**排除** coordinator 自身 listen addr | +| Peer 执行 | 永远 `probe.*`;禁止 peer 再 fan-out(防递归) | +| 并发 | 各 peer 并行请求;总延迟 ≈ 最慢 peer + coordinator 合并 | +| 超时 | 单 peer 超时记 `nodes_failed`,不拖垮整查(默认 2s,可 `PROBING_REMOTE_QUERY_TIMEOUT_SECS` 覆盖) | + +### 4.2 路径选型 + +`cluster=false` → 仅本地,不走联邦。 + +`cluster=true` 时按 **AST 解析**(非 substring)依次判断: + +```mermaid +flowchart TD + Q[SQL] --> P{单语句 SELECT?} + P -->|否| C[路径 C] + P -->|是| M{单表且无 JOIN/CTE/UNION/子查询?} + M -->|否| C + M -->|是| A{单表 global.* + 可下推 GROUP BY/聚合?} + A -->|是| PA[路径 A] + A -->|否| PB[路径 B] +``` + +| 路径 | 进入条件 | §3 典型场景 | +|------|----------|-------------| +| **A 聚合下推** | 单表 `global.*`;含 `GROUP BY` 和/或 `count/sum/min/max/avg`;聚合可分布式 merge | ①②④⑤、3.3 role 视图 | +| **B 联邦 scan** | 单表 `global.*`;不满足 A(无聚合、或聚合不可 merge、或含 `ORDER BY`/`LIMIT` 且 A 不接) | 拉 raw 行、带 filter 的单表探查 | +| **C broadcast** | JOIN、逗号 join、UNION、CTE、标量/IN/EXISTS 子查询、多语句、解析失败 | ③ span 热力图、3.4 compute join、3.2 含窗口的 CTE | + +解析失败时 **保守走 C**(正确性优先于性能)。 + +### 4.3 Catalog 改写 + +| 阶段 | 输入 | 输出 | +|------|------|------| +| 用户 → coordinator | `python.t` / `probe.t` | `global.{schema}.t`(已知 schema:`cluster/process/files/python/memtable/gpu/rdma`) | +| 用户已写 `global.*` | 不变 | — | +| coordinator → peer | 任意 `global.*` | `probe.*`(字符串替换) | +| `SELECT *` + `global.*` | `SELECT * FROM global.t` | `SELECT * EXCLUDE (六标签), 六标签 FROM global.t` | +| 显式列清单 | `SELECT rank, avg_ms …` | **不**自动追加标签;用户需显式写 `_rank` 等 | + +路径 A 生成 per-node SQL 时:**去掉** SELECT/GROUP BY 中的标签列(peer 表无标签);coordinator merge 后再 inject。 + +### 4.4 联邦标签 + +六列固定、顺序稳定:`_host`, `_addr`, `_rank`, `_node_rank`, `_local_rank`, `_role`。 + +| 规则 | 说明 | +|------|------| +| 注入时机 | coordinator 收到每个分片后,**合并前**按分片来源填同一值 | +| 缺失值 | 整型标签 → `-1`;`_role` → `""` | +| 与数据列区分 | 表内 `rank`/`role` 是采集值;`_rank`/`_role` 是探针 endpoint 身份 | +| 路径一致性 | A / B / C 注入语义相同;`SELECT *` 展开顺序相同 | +| 仅按标签 GROUP BY | 如 `GROUP BY _host`:per-node 不做该 GROUP BY;coordinator 对 inject 后的 partial 再聚合 | + +### 4.5 路径 A — 聚合下推 + +**目标:** §3 中 80% 集群诊断(榜、热力图 long format、NCCL sum)走此路径,避免万卡 raw 行上收。 + +**Per-node SQL 生成** + +1. `FROM probe.{schema}.{table}`(由 `global.*` 改写) +2. 保留原 WHERE(整句下推) +3. SELECT 投影:去掉标签列;保留聚合表达式与非标签 GROUP BY 列 +4. `GROUP BY`:仅 **数据列**(非 `_host` 等) + +**Coordinator merge** + +| 原聚合 | merge 函数 | +|--------|------------| +| `count`, `sum` | `sum` | +| `min` | `min` | +| `max` | `max` | +| `avg` | 不支持精确分布式 merge → **不走 A** | +| `count(distinct)` 且 GROUP BY 含数据列 | 不支持 → **不走 A** | + +merge 后再 `GROUP BY` 数据列 + 用户请求的标签列(若有)。 + +**标签 inject:** merge 前给每个 partial 打六列;若 SELECT/GROUP BY 引用标签,coordinator merge SQL 保留这些列作 group key。 + +**ORDER BY / LIMIT(目标语义)** + +| 子句 | 行为 | +|------|------| +| `ORDER BY` | 在 coordinator **merge 完成之后**排序;不下推到 peer | +| `LIMIT` | 在 coordinator **merge + ORDER BY 之后**截断;全局 top-K | +| 仅 `ORDER BY`/`LIMIT`、无聚合 | 不满足 A → 走路径 B 或 C | + +**部分失败:** 成功 peer 的 partial 仍参与 merge;失败 addr 写入 `nodes_failed`。 + +### 4.6 路径 B — 联邦 scan + +**目标:** 单表探查、带 filter 的 raw 采样;lazy 拉取控制 coordinator 峰值内存。 + +**执行模型** + +| 分区 | 来源 | +|------|------| +| partition 0 | 本地 `probe.*` scan | +| partition 1..N | 每个 peer 一条 lazy partition,首次 poll 才 HTTP 拉取 | + +**下推** + +| 算子 | 规则 | +|------|------| +| Filter | 仅当可 **精确** 翻译为 peer SQL 的谓词才下推(schema 可解析) | +| Projection | 用户选什么列就下推什么列;标签列只在 coordinator 侧 append | +| `LIMIT` | **全局 top-K**:仅 coordinator 在合并流上截断;**不下推**到各 peer(避免每 rank 各取 K 条导致结果错误) | + +**Scan 后算子:** DataFusion 在 federated scan 之上继续执行剩余计划(filter、sort、limit 等),语义以 coordinator 全局为准。 + +### 4.7 路径 C — broadcast + +**目标:** 必须在 **同一进程 memtable** 内完成的 SQL(JOIN、CTE、窗口)。 + +**行为** + +1. coordinator 与每个 peer 执行 **同一句** 用户 SQL(peer 侧若含 `global.*` 先改 `probe.*`) +2. 各分片独立出结果集 +3. coordinator **行拼接**(列对齐,缺列填空) +4. 每个分片 inject 六列标签 + +**不做二次关系代数:** broadcast 结果是 concat,不在 coordinator 对两表做 join。 + +**万卡:** 复杂 CTE + 窗口(§3.2 `worst_fraction`)允许走 C,但产品建议 **拆诊断链**(先 A 出 per_step,再 coordinator 聚合)以控延迟与内存。 + +### 4.8 退化与边界 + +| 情况 | 行为 | +|------|------| +| 无 peer 注册 | 等同单节点;`nodes_queried=1` | +| 全部 peer 失败 | 仅本地分片(若有);或空结果 + 正确 schema | +| 部分 peer 失败 | 合并成功分片;`nodes_failed` 列出 addr | +| 空表 | 空 DataFrame;schema 含用户请求的列 + 标签列(若适用) | +| `cluster.nodes` 与训练 rank 不一致 | 以探针注册为准;标签反映 endpoint 而非理想 torch rank | + +### 4.9 明确不做 + +| 不做 | 原因 | +|------|------| +| `global.a JOIN global.b` | 跨 rank 无共址 join key;改用路径 C 同进程 join | +| 不可精确翻译的 filter 下推 | 避免 silent wrong results | +| 分布式 `count(distinct)` merge | 语义不可分解;fallback B/C | +| 全集群 raw + 多层 CTE 一次跑完 | 万卡内存/延迟不可控;拆 §3 诊断链 | +| Peer 递归 fan-out | HTTP 环路与放大 | + +### 4.10 需求 → 路径速查 + +| §3 需求 | 路径 | 引擎关键点 | +|---------|------|------------| +| rank / 慢节点榜 | A | `GROUP BY _rank` / `_host`;merge + inject | +| step×rank comm 热力图 long | A | `GROUP BY global_step, _rank, _host, op` | +| span 热力图 | C | 同 rank `trace_event` self-join;concat + tag | +| job slowdown / worst_fraction | C 或 A 两步 | 窗口函数 → C;拆链后第二步 coordinator 聚合 | +| compute vs comm | C | `probe.comm JOIN probe.torch_trace`;再 `GROUP BY _rank` | +| hang / backtrace | A 或 B | 单表 `GROUP BY _rank` 或 filter raw | + +--- + +## 5. 万卡验收(最小五连) + +增强引擎时,**先保证这五条**在 mock 多节点与真 cluster 上数值正确: + +| # | 场景 | 核心 SQL | 路径 | +|---|------|----------|------| +| 1 | step×rank comm 热力图 | §3.1 ④ | A | +| 2 | 慢节点榜 | §3.1 ② | A | +| 3 | job slowdown proxy | §3.2 首段 | C 或 A 两步 | +| 4 | compute vs comm | §3.4 | C + coordinator 再聚合 | +| 5 | NCCL compute/network | §3.1 ⑤ | A | + +**标签:** 六列在路径 A/B/C 一致;`SELECT *` 展开顺序稳定;broadcast JOIN 与 scan 标签一致(§4.4)。 + +**联邦:** mock ≥2 peer 时合并行数、`_addr` 来源、`nodes_failed` 行为符合 §4.8;路径 A 的 `sum` 与 naive 全量 `GROUP BY` 一致;路径 B 的 `LIMIT` 为全局 top-K(§4.6)。 + +--- + +## 6. 相关文档 + +| 文档 | 内容 | +|------|------| +| [分布式架构](distributed.zh.md) | `cluster query` 用法 | +| [核心概念](../guide/concepts.zh.md) | 用户向联邦说明 | +| [SQL 表目录](../reference/sql-tables.zh.md) | 表列与 `cluster.nodes` | +| [NCCL Profiler](nccl-profiler.zh.md) | §3.1 ⑤、`nccl.proxy_ops` | +| [API — step_matrix](../api-reference.zh.md) | §3.1 ③ 热力图 | + +实现模块:`probing/core/src/core/federation/` · 控制面:`probing/server/src/server/cluster_fanout.rs` diff --git a/docs/src/design/index.md b/docs/src/design/index.md index 5464b9b7..416b20e1 100644 --- a/docs/src/design/index.md +++ b/docs/src/design/index.md @@ -49,6 +49,7 @@ Shared vocabulary (endpoint, steps, role, federation): **[Core Concepts](../guid | [Profiling](profiling.md) | Performance data collection | | [Debugging](debugging.md) | Debugging capabilities | | [Distributed](distributed.md) | Multi-node support | +| [Federated query engine](federation.md) | Cross-rank SQL: scenarios, execution paths, acceptance bar | | [NCCL Profiler](nccl-profiler.md) | NCCL plugin, culprit/victim, `nccl.proxy_ops` | | [Cluster with Pulsing](cluster-pulsing.md) | Using Pulsing for membership and failure detection | | [Extensibility](extensibility.md) | Custom tables and metrics | diff --git a/docs/src/design/index.zh.md b/docs/src/design/index.zh.md index 3cd32319..24e8e91d 100644 --- a/docs/src/design/index.zh.md +++ b/docs/src/design/index.zh.md @@ -49,6 +49,7 @@ Probing 的核心使命很简单:**让分布式系统重新变得 Pythonic** | [性能分析](profiling.zh.md) | 性能数据收集 | | [调试](debugging.zh.md) | 调试能力 | | [分布式](distributed.zh.md) | 多节点支持 | +| [联邦查询引擎](federation.zh.md) | 跨 rank SQL:诊断场景、三条执行路径、万卡验收 | | [NCCL Profiler](nccl-profiler.zh.md) | NCCL 插件、culprit/victim、`nccl.proxy_ops` | | [基于 Pulsing 的集群](cluster-pulsing.zh.md) | 使用 Pulsing 做成员发现与故障检测 | | [扩展机制](extensibility.zh.md) | 自定义表和指标 | diff --git a/docs/src/design/modularity.md b/docs/src/design/modularity.md index ff15f77e..66ea6c69 100644 --- a/docs/src/design/modularity.md +++ b/docs/src/design/modularity.md @@ -84,7 +84,7 @@ Key core submodules: | Submodule | Path | Contract | |-----------|------|----------| | Engine | `core/engine.rs` | `async_query`, `enable(ProbeDataSource)` | -| Federation | `core/federation/` | `global.*` catalog, tags `_host/_addr/_rank/_role` | +| Federation | `core/federation/` | `global.*` catalog, tags `_host/_addr/_rank/_role` — see [Federated query engine](federation.md) | | Memtable SQL | `core/memtable_sql.rs` | mmap files → `TableProvider` | | Config | `config.rs` | `get` / `set` / `write` KV + extension options | @@ -105,7 +105,7 @@ Python-side collectors (same layer, different language): | Unit | Path | Tables | |------|------|--------| | Torch tracing | `python/probing/profiling/` | `python.torch_trace`, `python.comm_collective` | -| Tracing spans | `python/probing/tracing.py` | `python.trace_event` | +| Tracing spans | `python/probing/tracing/` | `python.trace_event` | | Parallel role | `python/probing/parallel.py` | stamps `role` on rows | | User plugins | `python/probing/ext/` | `python.` via `@table` | @@ -376,7 +376,7 @@ Track and fix incrementally: | Server → python REPL internals | ~~`PythonRepl` in server~~ | `/ws` uses `ReplSession` facade only | | Composition sprawl | All wiring in `server/engine.rs` | Optional: manifest TOML listing enabled extensions | | Skills triple loader | Rust + Python + Web embed `skills/` | Keep `skills/` SSOT; loaders versioned together in CI | -| kmsg collector | Implemented, not registered | Register in engine or delete | +| kmsg collector | Registered (Linux/kmsg feature gate) | Done | | Architecture doc | 2-layer diagram | Superseded by this doc + [Data Layer](data-layer.md) | --- diff --git a/docs/src/design/modularity.zh.md b/docs/src/design/modularity.zh.md index d73cd1cd..9aea1678 100644 --- a/docs/src/design/modularity.zh.md +++ b/docs/src/design/modularity.zh.md @@ -80,7 +80,7 @@ flowchart TB | 子模块 | 路径 | 契约 | |--------|------|------| | Engine | `core/engine.rs` | `async_query`、`enable(ProbeDataSource)` | -| Federation | `core/federation/` | `global.*`、标签 `_host/_addr/_rank/_role` | +| Federation | `core/federation/` | `global.*`、六列联邦标签 — [联邦查询引擎](federation.zh.md) | | Memtable SQL | `core/memtable_sql.rs` | mmap → `TableProvider` | | Config | `config.rs` | KV + extension options | @@ -100,7 +100,7 @@ Python 侧采集(同层,不同语言): | 单元 | 路径 | 表 | |------|------|-----| | Torch | `python/probing/profiling/` | `torch_trace`、`comm_collective` | -| Span | `python/probing/tracing.py` | `trace_event` | +| Span | `python/probing/tracing/` | `trace_event` | | 并行 role | `python/probing/parallel.py` | 写入 `role` 列 | | 用户插件 | `python/probing/ext/` | `@table` → `python.*` | diff --git a/docs/src/design/training-phase.zh.md b/docs/src/design/training-phase.zh.md new file mode 100644 index 00000000..207a29ca --- /dev/null +++ b/docs/src/design/training-phase.zh.md @@ -0,0 +1,94 @@ +# 训练 Phase 语义(Tracing) + +本文定义 `probing.phase()`、`train.step` 与 hook/span 协作的 **不变量**。实现见 `python/probing/tracing/phases.py`。 + +## 核心对象 + +| 概念 | 含义 | +|------|------| +| **phase** | 训练阶段枚举:`forward` / `backward` / `optimizer`(span 字段) | +| **`probing.phase()`** | 当前 span 栈上**最内层**带 training phase 的 span;无则为 `idle` | +| **`train.step`** | 分析用 span **名称**(不是 phase);表示一次 logical iteration 的 wall time | +| **`probing.step()`** | 坐标计数器;在 **OPTIMIZER span 退出** 时 +1 `micro_step` | + +## Span 命名(API spec) + +```python +# 规范形式:phase 给定则 name 默认为 phase +with probing.span(phase=probing.FORWARD): + ... + +# 分析用名称(非 training phase) +with probing.span("epoch"): + ... + +# 显式 display name + phase +with probing.span("compute", phase=probing.BACKWARD): + ... +``` + +`resolve_span(name, phase)` 规则: + +1. 仅 `phase` → `(name=phase, phase=phase)` +2. 仅 `name` → `(name, infer(name))` +3. 两者皆有 → `(name, resolve(name, phase))`,至少其一必填 + +## 不变量 + +1. **`phase()` 来自 span 栈**,不是独立全局变量;batch 结束后显示 `idle` 是预期行为。 +2. **`train.step` 起止**:从本 logical iteration 的**第一次 forward**(hook 进入)到 **optimizer hook 退出**;中间梯度累积的 forward/backward **不重置**计时器。 +3. **每个 optimizer 退出**最多写一条 `train.step`(需先出现过 forward);无 forward 的 optimizer 不写。 +4. **同一 phase 同时只有一个活跃 span**:`phase_hook` 在已有同 phase span(manual / torch_probe)时不重复开 span。 +5. **`micro_step`**:每次 OPTIMIZER span 退出 +1;**`local_step = micro_step // micro_batches`**(设置 `probing.step(micro_batches=k)` 对应梯度累积因子)。 + +## TorchProbe × phase hook(ownership) + +| 能力 | phase hook | TorchProbe | +|------|------------|------------| +| iteration phase span(forward/backward/optimizer) | **拥有** | 当 `owns_training_phases(module=…)` 为真时**跳过** | +| `train.step` closed span | **拥有** | 不写 | +| 模块级 `torch_trace` 表(timing / mem) | — | **拥有** | +| 非 training 模块 span(如 init) | — | **拥有** | + +检测 API:`probing.owns_training_phases(model=…)` / `optimizer=…` / `module=…`。 + +典型组合: + +```python +probing.attach_training_phases(model, optimizer) # iteration phase + train.step +configure("on") # TorchProbe 仅写 torch_trace,不再开 training phase span +``` + +仅 TorchProbe、未 attach phase hook 时:TorchProbe 仍会开 training phase span(legacy 路径)。 + +## 组合规则(source) + +| source | 用途 | +|--------|------| +| `manual` | 用户 `probing.span(..., phase=...)` | +| `phase_hook` | `attach_training_phases` hook | +| `torch_probe` | 模块级 TorchProbe span(training phase 可被 hook 抑制) | + +同 phase 已存在活跃 span 时,hook **不再**开同名 phase span。 + +## 梯度累积示例 + +```python +probing.step(micro_batches=4) +probing.attach_training_phases(model, optimizer) + +for i, batch in enumerate(loader): + loss = model(batch) / 4 + loss.backward() + if (i + 1) % 4 == 0: + optimizer.step() + optimizer.zero_grad() +``` + +- 每个 micro-batch:forward/backward phase span 各一对。 +- 仅第 4、8、… 次 micro-batch 触发 optimizer 与 `train.step`。 +- `train.step` attrs 含 `accum_index`、`micro_step`、`local_step`。 + +## 性能:`inspect.stack()` + +自动 `location` **默认关闭**。仅在 `PROBING_SPAN_LOCATION=1` 或显式 `location=` 时,`span.py` 的 `_caller_location()` 会遍历 `inspect.stack()`。TorchProbe 变量追踪在 `torch_probe.py` 另有独立 stack walk。 diff --git a/docs/src/guide/concepts.md b/docs/src/guide/concepts.md index 12d41ce7..95f40cbc 100644 --- a/docs/src/guide/concepts.md +++ b/docs/src/guide/concepts.md @@ -1,166 +1,251 @@ -# Core Concepts +# How Probing Works -One-page glossary for terms used across tutorials, guides, and design docs. -When in doubt, start here before diving into [SQL Analytics](sql-analytics.md) or -[Distributed](../design/distributed.md). +This page builds the mental model you need to use Probing effectively. It's not a +reference — it explains the architecture, the data flow, and the key design decisions +from a user's perspective. Read this before anything else. -## 1. Endpoint +## The two modes: in-process vs attach -Every **CLI** command targets a running probing server via an **endpoint**: +Probing works in two fundamentally different ways. Understanding the difference avoids +a lot of confusion. -| Form | Example | Notes | -|------|---------|-------| -| Local PID | `12345` | `probing -t 12345 query "…"` | -| Host:port | `node-a:8080` | Remote TCP; set `PROBING_PORT` at training startup | +**In-process mode** is what you get with `PROBING=1 python train.py`. A `.pth` hook +fires at Python startup, and before your training script even runs its first line, an +embedded HTTP server is listening on a Unix socket and the Rust engine has registered +all its data sources. Your training code calls `import probing` and uses +`probing.query()` directly — no network, no subprocess. ```bash -export ENDPOINT=12345 # or host:8080 -probing $ENDPOINT query "SELECT 1" +PROBING=1 python train.py ``` -**In-process** (training script): set `PROBING=1` (or inject on Linux) and `import probing` -— no endpoint string; use `probing.query()` directly. +**Attach mode** is what you get with `probing -t inject` — Linux only. The CLI +uses ptrace to load the probing shared library into an already-running process. The +process never restarted; it never imported probing. After injection, the same +in-process server starts inside the target. -There is **no** `probing.connect()` Python API. Remote access is always CLI `-t `. +```bash +probing -t $(pgrep -f train.py) inject +probing -t $(pgrep -f train.py) query "SELECT 1" +``` + +In both cases, the end result is the same: a running probing server inside the target +process. The CLI always talks to that server over HTTP (Unix socket for local PIDs, +TCP for remote `host:port`). There's no magic — `probing -t query "..."` is +literally an HTTP POST to `/query` on the embedded server. + +On macOS and Windows, only in-process mode is available. The `inject` command is +Linux-only because it depends on ptrace. + +## Where data comes from + +Probing doesn't poll. Data is pushed into tables when events happen. ---- +Every table you query is backed by one of two storage mechanisms: -## 2. Three CLI commands +**Mmap ring buffers (MEMT).** Most `python.*` tables and all extension tables use +this. A fixed-size memory-mapped file, structured as a ring of chunks. The writer +(the training process) appends rows to the current chunk. Readers (the SQL engine) +scan from any position. This is lock-free on the read path — the writer uses atomic +operations with Release/Acquire ordering, and readers never block the writer. -| Command | Usage | Data | -|---------|-------|------| -| **query** | `probing $ENDPOINT query ""` | Recorded table rows | -| **eval** | `probing $ENDPOINT eval ""` | One-off Python in the target process | -| **backtrace** | `probing $ENDPOINT backtrace` | Point-in-time stack → `python.backtrace` | +**Registered data sources (ProbeDataSource).** Some tables come from Rust code that +implements the `ProbeDataSource` trait. `python.backtrace` is a virtual table — it +captures the current stack on demand rather than storing a history. `process.envs` +reads the process environment. `gpu.devices` enumerates CUDA devices. -These are the main **CLI entry points** from outside the process — not the full product -surface (continuous profiling, federation, `global.*`, skills, etc. are covered below). -Typical flow: `backtrace` captures state → `eval` inspects live objects → `query` analyzes history. +The distinction matters because it affects what you can query: ---- +| Table | Mechanism | What you get | +|---|---|---| +| `python.torch_trace` | mmap ring buffer | History of all hook invocations since sampling started | +| `python.comm_collective` | mmap ring buffer | History of all collectives since sampling started | +| `python.backtrace` | Virtual table | **Current** stack only — no history | +| `cpu.utilization` | mmap ring buffer | Time-series of CPU samples | +| `process.envs` | Virtual table | Current environment variables | -## 3. Data tables (`python.*`) +This is why `backtrace` requires a separate command (`probing backtrace`) — it +captures the stack into the virtual table, and then you query it. The table doesn't +accumulate data on its own. -Probe data lives in **append-only SQL tables** under the `python` schema (plus built-in -extensions like `cpu.utilization`, `cluster.nodes`, `nccl.proxy_ops`). +## How tables are organized -| Table | What it records | -|-------|-----------------| -| `python.torch_trace` | Module hook timings + GPU memory | -| `python.comm_collective` | `torch.distributed` collective wall time | -| `python.trace_event` | Span start/end and custom events | -| `python.backtrace` | Latest captured stack (not a full history) | -| `python.variables` | Watched variable snapshots (when enabled) | +All tables live under a schema prefix that tells you where the data came from: -Custom plugins use the same model: `@table` dataclass + `.save()` → `python.`. -Column reference: **[SQL Tables](../reference/sql-tables.md)**. +`python.*` +: Training semantics — `torch_trace` (module hooks), `comm_collective` (distributed +ops), `trace_event` (spans), `backtrace` (stacks), `variables` (watched values). +Plus any custom tables you create with `@table`. -Tables are **not** lazy snapshots — rows are pushed when events happen (hook, collective, -span end). +`cpu.*` / `gpu.*` +: Host and device sampling. `cpu.utilization` has per-process and per-thread CPU/RSS +samples. `gpu.utilization` has GPU memory and compute utilization. ---- +`cluster.*` +: Cluster node registry. `cluster.nodes` lists every peer that has registered via +torchrun or the HTTP API. -## 4. Step coordinates +`nccl.*` +: NCCL profiler plugin output. `nccl.proxy_ops` decomposes collective wait time into +culprit (local GPU not ready) and victim (waiting on peer data) components. -Training analysis needs a **shared step index**. Probing uses Rust `step_snapshot()` as the -single source of truth (not a separate Python counter). +`global..

` +: Federation. Prefix any table with `global.` to fan out the query to all registered +cluster peers. The master merges results and attaches `_host`, `_addr`, `_rank`, +`_role` tags to each row. -| Field | Meaning | -|-------|---------| -| `local_step` | Per-rank step counter (optimizer-step aligned) | -| `global_step` | Cluster-wide step (when coordinated) | +The full column reference for every built-in table is at [SQL Tables](../reference/sql-tables.md). -On data rows: +## Step coordinates: the shared time axis -- `python.torch_trace.step` → local step -- `python.torch_trace.global_step`, `python.comm_collective.local_step` / `global_step` +Timestamps are unreliable for training analysis — steps are deterministic and align +naturally with training semantics. Probing uses a three-level step coordinate system: -In-process: +`micro_step` is the finest counter. Increments each time `probing.step()` is called. +`local_step` is the optimizer step — `micro_step // micro_batches`. With gradient +accumulation of 10, every 10 micro-steps produce one local step. +`global_step` is the cluster-wide step, equal to `local_step` when ranks are aligned. ```python -from probing.tracing import step_snapshot -s = step_snapshot() -print(s.local_step, s.global_step, s.rank) -``` +probing.step(micro_batches=10) # gradient accumulation factor +probing.step() # micro_step += 1 at each micro-batch boundary -Prefer these fields in SQL and skills — not `trainer.current_step`. +# Later, in queries: +# SELECT local_step, AVG(duration) FROM python.torch_trace GROUP BY local_step +``` ---- +Every training-related table (`torch_trace`, `comm_collective`) carries both +`local_step` and `global_step` columns. The step coordinates are managed in Rust +(not a Python counter) so they're consistent even if the training script's state +gets corrupted. -## 5. Parallel role +## Role: encoding parallel topology in one column -Distributed training places each process in a **parallel topology** (TP / PP / DP / EP / …). -Probing encodes this as one extensible string **`role`**, not one column per dimension. +Distributed training decomposes work across multiple parallelism dimensions — +tensor parallel (TP), pipeline parallel (PP), data parallel (DP), expert parallel +(EP), and combinations of them. Probing encodes the entire topology as a compact +sorted string: `dp=2,pp=1,tp=0`. -**Format:** sorted `name=value` pairs, e.g. `dp=2,pp=1,tp=0`. Empty string when unset. +This string is stamped on every `torch_trace` and `comm_collective` row. Because +it's a single column, you can GROUP BY role in SQL to compare performance across +parallelism dimensions: -| Source | How | -|--------|-----| -| Environment | Megatron-style `*_PARALLEL_RANK`, or `PROBING_ROLE_=` | -| Runtime | `probing.set_role("dp=2,pp=1,tp=0")` or `set_role(dp=2, pp=1)` | -| Read | `probing.current_role()`; `clear_role()` reverts to env | +```sql +SELECT role, AVG(duration_ms) as avg_ms +FROM python.comm_collective +GROUP BY role; +``` -`role` is stamped on **`python.torch_trace`** and **`python.comm_collective`** rows so you -can `JOIN` / `GROUP BY role` across tables on one rank. +Set it from environment variables (`PROBING_TP_RANK`, `PROBING_TP_SIZE`, etc., or +Megatron-style `TP_RANK`/`PP_RANK`/`DP_RANK`) or from Python: -Distinct from torchrun's **`role_name`** / `role_rank` on `cluster.nodes` — those are -Elastic/job launcher fields. Probing's `role` is the parallel-placement key for analytics. +```python +probing.set_role(dp=2, pp=1, tp=0) +# or: probing.set_role("dp=2,pp=1,tp=0") +probing.clear_role() # fall back to environment-derived role +``` ---- +Note: `cluster.nodes` has `role_name` and `role_rank` — those are torchrun/Elastic +launcher fields describing the launcher role, not the parallel topology. Probing's +`role` is the parallelism key for analytics; they serve different purposes. -## 6. Federation (`global.*` and tags) +## Federation: querying across the cluster -For **multi-rank** SQL, use the `global` catalog: `global.python.comm_collective` fans out -to registered peers and merges results. +When multiple training ranks are registered in a cluster, prefixing a table with +`global.` fans out the SQL query to every registered peer. The query runs +independently on each node; the master collects and concatenates the results. -Each row gets **federation tags** identifying the source probing endpoint: +Each returned row gets four federation tags added at query time: -| Tag | Meaning | -|-----|---------| -| `_host` | Source hostname | -| `_addr` | Source `host:port` | -| `_rank` | `torch.distributed` rank (from node registry) | -| `_role` | Parallel role key (from node registry / `set_role`) | +| Tag | Source | +|-----|--------| +| `_host` | Hostname of the node that produced the row | +| `_addr` | That node's probing `host:port` | +| `_rank` | `torch.distributed` rank from the cluster node registry | +| `_role` | Parallel role key from the node registry | -Example: +A query like this: ```sql -SELECT _role, _rank, avg(duration_ms) AS avg_ms +SELECT _rank, op, AVG(duration_ms) as avg_ms FROM global.python.comm_collective -WHERE global_step > 100 -GROUP BY _role, _rank +WHERE local_step > 100 +GROUP BY _rank, op ORDER BY avg_ms DESC; ``` -Register nodes via torchrun (`setup_torchrun_cluster`) or `PUT /apis/nodes`. CLI: -`probing -t cluster nodes` / `cluster query "…"`. Details: -[Distributed](../design/distributed.md). +...runs on every registered rank, then the master merges all results into one result +set with `_rank` telling you which row came from where. + +Nodes register via torchrun (`setup_torchrun_cluster`) or by POSTing to +`/apis/nodes`. Check current registration with `probing -t cluster nodes`. + +The `_role` tag uses the value from the **node registry**, which is kept in sync +with calls to `set_role()`. The `role` column on individual data rows uses the value +at **write time**. In practice these are the same, but understanding the distinction +matters when diagnosing stale role data. + +## Extension paths: three ways to add capability + +Probing has three distinct extension mechanisms. They're not interchangeable — each +serves a different purpose: + +**1. Data table plugin (`@table` in Python).** +Define a dataclass, decorate it, append rows from your code. The table appears as +`python.` and is immediately queryable. Use this when you have new metrics or +events to record. Built on mmap ring buffers. + +**2. Diagnostic skill (`steps.yaml` + `SKILL.md`).** +A YAML workflow that runs SQL queries against existing tables, applies interpretation +rules, and produces findings. Use this when you have a diagnosis recipe to codify — +like "find the slowest rank" or "check for NCCL wait imbalance." Run with +`probing skill run `. Skills don't collect new data; they analyze existing data. + +**3. Rust extension (`ProbeExtension` + `ProbeDataSource`).** +A compiled Rust crate that registers new data sources (virtual tables, mmap tables) +and/or configurable options with side effects (like starting a CPU sampler). Use +this when you need system-level access — ptrace, CUDA APIs, RDMA counters. The NCCL +profiler is a variant of this: a C ABI plugin loaded by NCCL itself, not by Probing. + +See [Extensibility](../design/extensibility.md) for the full development guide. + +## What happens when things go wrong + +Knowing what to expect when a query fails saves debugging time. + +**Invalid SQL** returns a `PyRuntimeError` with the DataFusion error message. The +error usually tells you exactly what's wrong (unknown table, unknown column, syntax +error). If you get a cryptic DataFusion error, check the server logs — set +`PROBING_LOGLEVEL=debug` for verbose output. -Row column `role` = value at **write time** on that rank. Tag `_role` = value on the -**node registry** at federation time (kept in sync via `set_role` + re-register). +**Missing tables.** If `probing $ENDPOINT tables` doesn't show the table you expect, +the data source isn't active. Common causes: the GPU extension isn't compiled in +(check `probing $ENDPOINT query "SELECT name FROM information_schema.df_settings WHERE name LIKE 'probing.gpu%'"`), or the mmap file isn't being written to (check +`$PROBING_DATA_DIR//`). ---- +**Empty results from `python.torch_trace`.** The PyTorch profiler needs +`PROBING_TORCH_PROFILING=on` at startup. Without it, hooks are never registered and +no rows are written. -## 7. Data plugin vs diagnostic skill +**Injection fails with ESRCH.** On Linux, ptrace may be restricted by YAMA LSM +(`/proc/sys/kernel/yama/ptrace_scope`). Set it to 0 or run as the same user. -| | **Table plugin** (Path 1) | **Diagnostic skill** (Path 2) | -|--|---------------------------|----------------------------------| -| You add | Dataclass table + rows | `SKILL.md` + optional `steps.yaml` | -| Output | `python.my_table` | Findings + SQL steps / agent guidance | -| Run | `SELECT …` | `probing skill run ` | -| Use when | New **metrics/events** to store | New **investigation recipe** | +See [Troubleshooting](troubleshooting.md) for more. -Optional **Path 3**: NCCL profiler cdylib → `nccl.proxy_ops` for culprit/victim wait -decomposition. See [Extensibility](../design/extensibility.md). +## Environment variables at a glance ---- +Probing has many configuration points. The most important ones: -## Where to go next +| Variable | Effect | +|----------|--------| +| `PROBING` | `0`=disabled, `1`=current process, `2`=current+children, `regex:...`=pattern match | +| `PROBING_TORCH_PROFILING` | `on` to activate PyTorch module hooks | +| `PROBING_DATA_DIR` | Where mmap ring buffers are stored | +| `PROBING_PORT` | TCP port for remote access (or `RANDOM`) | +| `PROBING_AUTH_TOKEN` | Authentication token for remote mode | +| `PROBING_CPU_SAMPLE_MS` | CPU sampling interval in milliseconds (0=off) | +| `PROBING_GPU_SAMPLE_MS` | GPU sampling interval in milliseconds | +| `PROBING_SPAN_BACKENDS` | Comma-separated: `memtable`, `logger`, `otel` | +| `PROBING_LOGLEVEL` | `trace`, `debug`, `info`, `warn`, `error` | -| Goal | Doc | -|------|-----| -| SQL patterns | [SQL Analytics](sql-analytics.md) | -| Table schemas | [SQL Tables](../reference/sql-tables.md) | -| Multi-node | [Distributed](../design/distributed.md) | -| Write a plugin | [Extensibility](../design/extensibility.md) | -| CLI / Python API | [API Reference](../api-reference.md) | +The complete reference is at [Environment Variables](../reference/env-vars.md). diff --git a/docs/src/guide/concepts.zh.md b/docs/src/guide/concepts.zh.md index 27fd53fe..6f381b79 100644 --- a/docs/src/guide/concepts.zh.md +++ b/docs/src/guide/concepts.zh.md @@ -1,162 +1,179 @@ # 核心概念 -本页是教程、指南与设计文档共用的**术语锚点**。建议先读这里,再进入 -[SQL 分析](sql-analytics.zh.md) 或 [分布式](../design/distributed.zh.md)。 +逐步构建 Probing 的心理模型——endpoint 是什么、数据如何流入表、step 坐标如何 +组织状态、以及联邦查询如何跨节点工作。在深入 [SQL 分析](sql-analytics.zh.md)或 +[分布式](../design/distributed.zh.md)之前请先阅读本文。 -## 1. Endpoint(端点) +## Endpoint:如何访问 probing 服务器 -**CLI** 通过 **endpoint** 连接目标进程上的 probing 服务: - -| 形式 | 示例 | 说明 | -|------|------|------| -| 本地 PID | `12345` | `probing -t 12345 query "…"` | -| host:port | `node-a:8080` | 远程 TCP;训练启动时设 `PROBING_PORT` | +每个启用 probing 的进程都运行一个嵌入式 HTTP 服务器。从外部与其通信需要一个 +**endpoint**——可以是本地 PID 或 `host:port` 对。 ```bash -export ENDPOINT=12345 # 或 host:8080 -probing $ENDPOINT query "SELECT 1" +# 本地进程——probing 从 PID 解析 Unix socket +probing -t 12345 query "SELECT 1" + +# 远程进程——TCP 连接到已知地址 +probing -t node-a:8080 query "SELECT 1" ``` -**进程内**(训练脚本):`PROBING=1`(或 Linux 上 inject)后 `import probing`,直接用 -`probing.query()`,无需 endpoint 字符串。 +CLI 从不直接与引擎交互。它通过 Unix socket(本地)或 TCP(远程)向目标进程 +中嵌入的服务器发送 HTTP 请求。不存在 `probing.connect()` Python API—— +远程访问始终通过 CLI 的 `-t` 参数。 -**没有** `probing.connect()`;访问远程进程一律用 CLI `-t `。 +在训练脚本内部(in-process 模式),则完全跳过 CLI,直接调用 `probing.query()`。 +引擎已经在同一进程中运行。 ---- +启动时设置 `PROBING=1` 通过 `.pth` 钩子激活进程内服务器——无需 import、无需 +修改代码。在 Linux 上,`probing inject` 也可以通过 ptrace 附着到已运行的进程。 -## 2. 三种 CLI 命令 +概念上: -| 命令 | 用法 | 数据 | -|------|------|------| -| **query** | `probing $ENDPOINT query ""` | 已采集的表数据 | -| **eval** | `probing $ENDPOINT eval ""` | 在目标进程执行一次性 Python | -| **backtrace** | `probing $ENDPOINT backtrace` | 瞬时栈 → `python.backtrace` | +``` +CLI ──(HTTP over Unix socket/TCP)──▶ probing server(目标进程内) + │ + ├── Engine(DataFusion) + ├── Config + └── Extensions(CPU、GPU、Python、NCCL...) +``` -它们是进程外的**主要 CLI 入口**,不等于 Probing 的全部能力(持续采集、联邦、`global.*`、 -skill 等见下文各节)。典型组合:`backtrace` 抓现场 → `eval` 看 live 对象 → `query` 做历史分析。 +## 数据表:只追加、持续写入 ---- +Probing 将性能数据存储在 mmap 环形缓冲支持的**只追加 SQL 表**中。事件发生时 +写入——模块 hook 触发、collective 完成、span 结束。不存在轮询,不按需快照。 +数据已经在那里了。 -## 3. 数据表(`python.*`) +最重要的表位于 `python` schema 下,因为这里是训练语义所在: -探针数据在 **`python` schema** 下的 **append-only** SQL 表中(另有 `cpu.utilization`、 -`cluster.nodes`、`nccl.proxy_ops` 等内置/扩展表)。 +`python.torch_trace` +: 模块级 forward/backward/step hook 耗时与 GPU 显存快照。每次 hook 触发一行。 +列包括 `local_step`、`module`、`stage`、`duration`、`allocated`。 -| 表 | 记录内容 | -|----|----------| -| `python.torch_trace` | 模块 hook 耗时 + GPU 显存 | -| `python.comm_collective` | `torch.distributed` collective 墙钟时间 | -| `python.trace_event` | Span 起止与自定义事件 | -| `python.backtrace` | 最近一次捕获的栈(非全历史) | -| `python.variables` | 监视变量快照(启用时) | +`python.comm_collective` +: 每个 `torch.distributed` 集合调用(all_reduce、broadcast、all_gather 等)。 +记录 `op`、`tensor_shape`、`bytes`、`duration_ms` 以及进程组上下文。 -自定义插件同样:`@table` dataclass + `.save()` → `python.<表名>`。 -列说明见 **[SQL 表目录](../reference/sql-tables.zh.md)**。 +`python.trace_event` +: Span 起止事件和自定义 trace 事件。在 `span_id` 上 join `span_start` / `span_end` +计算耗时。Span 可以嵌套——forward pass span 包含多个 layer span。 -表**不是**懒加载快照——事件发生时推送行(hook、collective、span 结束等)。 +`python.backtrace` +: 最新捕获的调用栈,混合 Python 和原生帧。**瞬时数据**,不是历史全量。 +先用 `probing backtrace` 填充,再查询。用于 hang 诊断。 ---- +`python.variables` +: 变量快照(需显式启用变量追踪)。轻量级:值以字符串方式存储,不序列化。 -## 4. Step 坐标 +除 `python.*` 之外,主机级数据在 `cpu.*` 和 `gpu.*`,集群元数据在 `cluster.*`, +NCCL profiler 输出在 `nccl.*`。完整的列定义见 [SQL 表目录](../reference/sql-tables.zh.md)。 -训练分析需要统一的 **step 索引**。权威来源是 Rust `step_snapshot()`(不是单独的 Python 计数器)。 +自定义表遵循相同模型。用 `@table("my_metrics")` 定义 dataclass,在训练循环中 +追加行,表即显示为 `python.my_metrics`——与内置表一同查询。见 [扩展机制](../design/extensibility.zh.md)。 -| 字段 | 含义 | -|------|------| -| `local_step` | 每 rank 本地步(与 optimizer step 对齐) | -| `global_step` | 集群全局步(协调时) | +## Step 坐标:训练分析的共享索引 -数据行上: +训练分析中,关联不同表的数据需要一个共享的时间轴。Probing 使用 **step 坐标** +而非时间戳——它们具有确定性,且与训练语义天然对齐。 -- `python.torch_trace.step` → 本地步 -- `python.torch_trace.global_step`、`python.comm_collective` 的 `local_step` / `global_step` +有三个层级: -进程内: +**micro_step** —— 最细粒度计数器。每次调用 `probing.step()` 加一。 +**local_step** —— optimizer step。`micro_step // micro_batches`。 +**global_step** —— 集群范围的 step。rank 对齐时等同于 `local_step`。 ```python -from probing.tracing import step_snapshot -s = step_snapshot() -print(s.local_step, s.global_step, s.rank) +import probing + +probing.step(micro_batches=10) # 10 个 micro-batch = 1 个 optimizer step +probing.step() # micro_step += 1 +probing.step(42) # 直接设置 micro_step + +print(probing.step.micro_step) # 原始计数器 +print(probing.step.local_step) # micro_step // 10 +print(probing.step.global_step) # 集群 step ``` -SQL 与 skill 请用上述字段,**不要**用 `trainer.current_step`。 +所有训练相关表都携带 step 列:`python.torch_trace` 有 `local_step` 和 `global_step`; +`python.comm_collective` 同样具备,外加 `group_rank` 和 `group_size`。编写查询时, +用 `local_step` 或 `global_step` 过滤——不要用 `trainer.current_step`。 ---- +## Role:编码并行拓扑 -## 5. Parallel role(并行角色) +分布式训练将每个 rank 置于并行拓扑中——tensor parallel、pipeline parallel、data +parallel、expert parallel 或它们的组合。Probing 将其编码为一个紧凑字符串,而非 +每个维度一列。 -分布式训练里每个进程有并行拓扑(TP / PP / DP / EP / …)。Probing 用可扩展字符串 **`role`** -表示,而不是每种维度一列。 +格式为排序的 `name=value` 对:`dp=2,pp=1,tp=0`。空字符串表示 role 未设置。 -**格式:** 按名字排序的 `name=value`,如 `dp=2,pp=1,tp=0`;未设置时为 `""`。 +可通过环境变量(Megatron 风格的 `*_PARALLEL_RANK` 或 `PROBING_ROLE_=`) +或 Python 设置: -| 来源 | 方式 | -|------|------| -| 环境变量 | Megatron 风格 `*_PARALLEL_RANK`,或 `PROBING_ROLE_=` | -| 运行时 | `probing.set_role("dp=2,pp=1,tp=0")` 或 `set_role(dp=2, pp=1)` | -| 读取 | `probing.current_role()`;`clear_role()` 恢复 env 推导 | +```python +import probing +probing.set_role(dp=2, pp=1, tp=0) +# 或: probing.set_role("dp=2,pp=1,tp=0") -`role` 写入 **`python.torch_trace`**、**`python.comm_collective`**,便于同 rank 上按 role -JOIN / GROUP BY。 +print(probing.current_role()) # "dp=2,pp=1,tp=0" +probing.clear_role() # 恢复为环境变量默认值 +``` -与 torchrun 的 **`role_name`** / `role_rank`(`cluster.nodes` 上)不同——那是 Elastic 作业 -字段;Probing 的 `role` 是**并行放置 key**,用于分析对齐。 +`role` 被标记在所有 `python.torch_trace` 和 `python.comm_collective` 行上。 +这让你可以 GROUP BY role 来对比,比如跨所有 data-parallel 副本比较 TP rank 0 +和 TP rank 1。需区分 torchrun 的 `role_name` / `role_rank`(`cluster.nodes` 上 +的字段)——这些是 launcher 字段;`role` 是用于分析的 key。 ---- +## 联邦查询:跨节点查询 -## 6. 联邦查询(`global.*` 与标签) +当多个 rank 注册到集群时,`global..
` 将查询 fan-out 到每个节点 +并合并结果。查询在每个节点上独立执行;master 收集并拼接。 -跨 rank SQL 使用 **`global` catalog**,例如 `global.python.comm_collective`:向已注册节点 -fan-out 后合并。 +每个返回行附带四个联邦标签: -每行附加**联邦标签**,标识数据来源: +`_host` +: 生成行的 probing 节点主机名。 -| 标签 | 含义 | -|------|------| -| `_host` | 来源主机名 | -| `_addr` | 来源 `host:port` | -| `_rank` | `torch.distributed` rank(节点注册表) | -| `_role` | 并行角色 key(注册表 / `set_role`) | +`_addr` +: 该节点的 `host:port` probing 地址。 -示例: +`_rank` +: 来自集群节点注册的 `torch.distributed` rank。 + +`_role` +: 来自节点注册的并行 role key(与 `set_role` 保持同步)。 + +典型的联邦查询: ```sql -SELECT _role, _rank, avg(duration_ms) AS avg_ms +SELECT _role, _rank, op, AVG(duration_ms) AS avg_ms FROM global.python.comm_collective -WHERE global_step > 100 -GROUP BY _role, _rank +WHERE local_step > 100 +GROUP BY _role, _rank, op ORDER BY avg_ms DESC; ``` -节点通过 torchrun(`setup_torchrun_cluster`)或 `PUT /apis/nodes` 注册。CLI: -`probing -t cluster nodes` / `cluster query "…"`。详见 -[分布式](../design/distributed.zh.md)。 - -行内列 **`role`** = 该 rank **写入时**的值;标签 **`_role`** = **联邦查询时**节点注册表 -的值(`set_role` 后会 best-effort 重注册以保持一致)。 +通过 torchrun(`setup_torchrun_cluster`)或 POST `/apis/nodes` 注册节点。 +用 `probing -t cluster nodes` 验证。详见 [分布式](../design/distributed.zh.md)。 ---- +## 表插件 vs 诊断 skill -## 7. 表插件 vs 诊断 skill +Probing 有两条扩展路径,选择哪条取决于你的目的: -| | **表插件**(路径 1) | **诊断 skill**(路径 2) | -|--|---------------------|-------------------------| -| 贡献 | dataclass 表 + 写行 | `SKILL.md` + 可选 `steps.yaml` | -| 产出 | `python.my_table` | 结论 + SQL 步骤 / Agent 指引 | -| 使用 | `SELECT …` | `probing skill run ` | -| 适用 | 新**指标/事件**要落库 | 新**排查配方** | +**表插件**添加新数据——用 `@table` 定义 dataclass,从代码追加行,数据以 +`python.` 出现。用于存储和查询新的指标或事件。 -可选**路径 3**:NCCL profiler cdylib → `nccl.proxy_ops`(culprit/victim)。见 -[扩展机制](../design/extensibility.zh.md)。 +**诊断 skill** 添加新分析——`SKILL.md` 文件配合可选的 `steps.yaml`,描述基于 +现有表的诊断工作流。Skill 运行 SQL 查询、应用解释规则、产出诊断结论。用于 +沉淀排查方案。用 `probing skill run ` 运行。 ---- +NCCL profiler 是第三条路径——编译好的 cdylib,写入 `nccl.proxy_ops` 用于 +culprit/victim 等待分解。它是 Rust 扩展,而非 Python @table。见 [NCCL Profiler](../design/nccl-profiler.zh.md)。 ## 下一步 | 目标 | 文档 | |------|------| -| SQL 模式 | [SQL 分析](sql-analytics.zh.md) | -| 表结构 | [SQL 表目录](../reference/sql-tables.zh.md) | -| 多机 | [分布式](../design/distributed.zh.md) | -| 写插件 | [扩展机制](../design/extensibility.zh.md) | -| CLI / API | [API 参考](../api-reference.zh.md) | +| 训练分析的 SQL 模式 | [SQL 分析](sql-analytics.zh.md) | +| 每张表的列定义 | [SQL 表目录](../reference/sql-tables.zh.md) | +| 多节点配置和 torchrun | [分布式](../design/distributed.zh.md) | +| 编写自定义表或 skill | [扩展机制](../design/extensibility.zh.md) | +| CLI 命令和 Python API | [API 参考](../api-reference.zh.md) | diff --git a/docs/src/index.md b/docs/src/index.md index 5a8f2e91..422f7719 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -1,39 +1,99 @@ --- template: home.html title: Probing - Dynamic Performance Profiler for Distributed AI -description: Zero-intrusion profiler for distributed AI — SQL tables, live introspection, cluster federation, and diagnostic skills. +description: Attach to running Python training processes, query performance data with SQL, and diagnose distributed issues across cluster nodes. hide: toc --- # Probing -**Probing** profiles distributed AI training: continuous SQL tables, live attach, federated -`global.*` queries, and bundled diagnostic skills. +Probing lets you inspect and debug distributed AI training jobs — without modifying your code. +Attach to a running Python process, query performance data through standard SQL, and run +diagnostic workflows to find slow ranks, NCCL bottlenecks, or memory leaks. -## Capabilities - -- **Continuous profiling** — `torch_trace`, `comm_collective`, NCCL proxy, custom `@table` -- **Live introspection** — `eval`, `backtrace`, REPL against running processes -- **SQL analytics** — single-node and `global.*` federation with `_rank` / `_role` tags -- **Diagnostic skills** — `health_overview`, `slow_rank`, `nccl_culprit_victim`, … -- **Cluster** — `cluster nodes`, `cluster query`, Web UI agent -- **Zero intrusion** — `PROBING=1` at startup or Linux `inject` - -## Quick Start +## In 30 seconds ```bash pip install probing -# Recommended for training -PROBING=1 PROBING_TORCH_PROFILING=on python train.py +# Start training with probing enabled +PROBING=1 python train.py & -# Or attach on Linux -probing -t inject -probing -t query "SELECT * FROM python.torch_trace LIMIT 10" -probing -t skill run health_overview +# Attach and inspect +probing -t $(pgrep -f train.py) backtrace +probing -t $(pgrep -f train.py) query " + SELECT module, stage, AVG(duration) as sec + FROM python.torch_trace + GROUP BY module, stage + ORDER BY sec DESC LIMIT 5 +" ``` +The first command starts a training job with probing activated. The second captures +every Python and native frame on the main thread. The third finds the five slowest +module-stage pairs with a single SQL query — no logging, no instrumentation, no restart. + +## What you can do with it + +**Debug a hanging or slow training job.** +Attach to the stuck process, grab a backtrace, check GPU memory per step, and identify +the exact module or collective call that's blocking. No need to reproduce the issue. + +**Profile collective communication at scale.** +The NCCL profiler plugin decomposes proxy-op wait time into send/recv latencies so you +can tell who's waiting on whom — essential for debugging all-reduce tail latency. + +**Write custom performance tables.** +Define a dataclass with `@table("my_metrics")`, append rows from your training loop, and +query them alongside built-in tables. Your data lives in `python.my_metrics`, same +namespace, same SQL interface. + +**Query across cluster nodes.** +Prefix any table with `global.` to fan out to registered peers. Each row carries `_rank`, +`_role`, `_host` tags so results are directly comparable across the cluster. + +## How it works + +Probing ships as a Python package with a compiled Rust core (`probing._core`). When you +run `PROBING=1 python train.py`, a `.pth` hook starts an in-process HTTP server and +registers data sources for the SQL engine. Extensions — CPU sampling, GPU memory, NCCL +proxy ops, Python stack tracing — push rows into append-only columnar tables backed by +mmap ring buffers. The CLI talks to the embedded server over a Unix socket (local) or TCP +(remote). + +You don't need to know any of that to use it. `pip install probing` and you're done. + +## Start here + +**I want to debug a training issue.** +Read [Quick Start](quickstart.md), then try `probing backtrace` and `probing query`. + +**I want to understand the architecture.** +Read [Core Concepts](guide/concepts.md) and [Modularity & Boundaries](design/modularity.md). + +**I'm setting up a multi-node cluster.** +Read [Distributed](design/distributed.md) and the [SQL Tables](reference/sql-tables.md) reference. + +**I want to write a custom diagnostic skill.** +Read [Extensibility](design/extensibility.md) and browse `skills/` for examples. + +**I want to contribute.** +Read [Contributing](contributing.md), `make develop`, and pick an issue. + ## Documentation map -- [Installation](installation.md) · [Quick Start](quickstart.md) · [Core Concepts](guide/concepts.md) -- [SQL Tables](reference/sql-tables.md) · [API Reference](api-reference.md) · [Contributing](contributing.md) +| Doc | Covers | +|-----|--------| +| [Installation](installation.md) | `pip install`, `PROBING=1`, platform support | +| [Quick Start](quickstart.md) | First 5 minutes, real-world debugging scenarios | +| [Core Concepts](guide/concepts.md) | How Probing works — mental model, data flow, step coordinates, federation | +| [SQL Tables](reference/sql-tables.md) | Column reference for every built-in table | +| [API Reference](api-reference.md) | CLI commands and Python API | +| [Environment Variables](reference/env-vars.md) | Complete `PROBING_*` variable reference (30+ entries) | +| [Skill Format](reference/skill-format.md) | `steps.yaml` and `SKILL.md` specification | +| [SQL Analytics](guide/sql-analytics.md) | Query patterns, JOIN examples, time-series | +| [Diagnostic Skills](guide/skills.md) | Running and writing diagnostic workflows | +| [Extensibility](design/extensibility.md) | Data table plugins, diagnostic skills, NCCL profiler | +| [Distributed](design/distributed.md) | Multi-node federation, torchrun integration | +| [NCCL Profiler](design/nccl-profiler.md) | NCCL plugin, proxy-op wait decomposition | +| [Contributing](contributing.md) | Dev setup, pull request workflow | diff --git a/docs/src/index.zh.md b/docs/src/index.zh.md index 89feba44..846044af 100644 --- a/docs/src/index.zh.md +++ b/docs/src/index.zh.md @@ -1,38 +1,95 @@ --- template: home.html title: Probing - 分布式 AI 动态性能分析器 -description: 面向分布式 AI 的零侵入分析器 — SQL 表、现场内省、集群联邦与诊断 skill。 +description: 附着到运行中的 Python 训练进程,用 SQL 查询性能数据,跨集群节点诊断分布式问题。 hide: toc --- # Probing -**Probing** 面向分布式 AI 训练:持续写入 SQL 表、现场附着、联邦 `global.*` 查询与内置诊断 skill。 +无需修改代码即可检查和调试分布式 AI 训练任务。附着到运行中的 Python 进程,用标准 SQL +查询性能数据,运行诊断工作流定位慢 rank、NCCL 瓶颈或内存泄漏。 -## 能力概览 - -- **持续采集** — `torch_trace`、`comm_collective`、NCCL proxy、自定义 `@table` -- **现场内省** — 对运行中进程 `eval`、`backtrace`、REPL -- **SQL 分析** — 单节点与 `global.*` 联邦(`_rank` / `_role` 标签) -- **诊断 skill** — `health_overview`、`slow_rank`、`nccl_culprit_victim` 等 -- **集群** — `cluster nodes`、`cluster query`、Web UI Agent -- **零侵入** — 启动时 `PROBING=1` 或 Linux `inject` - -## 快速开始 +## 30 秒上手 ```bash pip install probing -# 训练推荐 -PROBING=1 PROBING_TORCH_PROFILING=on python train.py +# 启动带 probing 的训练 +PROBING=1 python train.py & -# 或 Linux 附着 -probing -t inject -probing -t query "SELECT * FROM python.torch_trace LIMIT 10" -probing -t skill run health_overview +# 附着并检查 +probing -t $(pgrep -f train.py) backtrace +probing -t $(pgrep -f train.py) query " + SELECT module, stage, AVG(duration) as sec + FROM python.torch_trace + GROUP BY module, stage + ORDER BY sec DESC LIMIT 5 +" ``` +第一条命令启动一个已激活 probing 的训练任务。第二条捕获主线程上所有 Python 和原生帧。 +第三条用一条 SQL 查出最慢的五个模块-阶段组合——无需加日志、无需插桩、无需重启。 + +## 能做什么 + +**调试卡住或变慢的训练任务。** +附着到卡住的进程,抓取调用栈,按 step 查看 GPU 内存变化,精确定位是哪个模块或集合通信 +调用在阻塞。不需要复现问题。 + +**诊断分布式集合通信性能。** +NCCL profiler 插件将 proxy-op 等待时间分解为 send/recv 延迟,能清晰判断谁在等谁—— +调试 all-reduce 尾部延迟的关键工具。 + +**编写自定义性能表。** +用 `@table("my_metrics")` 定义 dataclass,从训练循环中追加行,和内置表一起查询。 +数据存在 `python.my_metrics`,同一命名空间,同一 SQL 接口。 + +**跨集群节点查询。** +在任何表前加 `global.` 前缀即可 fan-out 到已注册节点。每行附带 `_rank`、`_role`、 +`_host` 标签,结果可直接跨集群对比。 + +## 工作原理 + +Probing 以 Python 包形式发布,内置编译好的 Rust 核心(`probing._core`)。 +当你运行 `PROBING=1 python train.py` 时,一个 `.pth` 钩子启动进程内 HTTP 服务器, +为 SQL 引擎注册数据源。扩展模块——CPU 采样、GPU 显存、NCCL proxy ops、Python 调用栈 +追踪——将行数据推送到 mmap 环形缓冲区支持的只追加列式表中。CLI 通过 Unix socket +(本地)或 TCP(远程)与嵌入式服务器通信。 + +作为用户,你不需要了解这些细节。`pip install probing` 就够了。 + +## 从这里开始 + +**我想调试训练问题。** +阅读[快速开始](quickstart.zh.md),然后试试 `probing backtrace` 和 `probing query`。 + +**我想理解架构。** +阅读[核心概念](guide/concepts.zh.md)和[模块化与边界](design/modularity.zh.md)。 + +**我在搭建多节点集群。** +阅读[分布式](design/distributed.zh.md)和 [SQL 表目录](reference/sql-tables.zh.md)。 + +**我想写一个自定义诊断 skill。** +阅读[扩展性](design/extensibility.zh.md),浏览 `skills/` 目录下的示例。 + +**我想贡献代码。** +阅读[贡献指南](contributing.zh.md),执行 `make develop`,挑一个 issue 开始。 + ## 文档导航 -- [安装指南](installation.zh.md) · [快速开始](quickstart.zh.md) · [核心概念](guide/concepts.zh.md) -- [SQL 表目录](reference/sql-tables.zh.md) · [API 参考](api-reference.zh.md) · [贡献指南](contributing.zh.md) +| 文档 | 内容 | +|------|------| +| [安装指南](installation.zh.md) | `pip install`、`PROBING=1`、平台支持 | +| [快速开始](quickstart.zh.md) | 5 分钟上手,真实调试场景 | +| [核心概念](guide/concepts.zh.md) | Probing 工作原理——心理模型、数据流、step 坐标、联邦查询 | +| [SQL 表目录](reference/sql-tables.zh.md) | 每张内置表的列定义 | +| [API 参考](api-reference.zh.md) | CLI 命令和 Python API | +| [环境变量](reference/env-vars.md) | 全部 30+ 个 `PROBING_*` 环境变量参考 | +| [Skill 格式规范](reference/skill-format.md) | `steps.yaml` 和 `SKILL.md` 格式规范 | +| [SQL 分析](guide/sql-analytics.zh.md) | 查询模式、JOIN 示例、时序分析 | +| [诊断 Skill](guide/skills.zh.md) | 运行和编写诊断工作流 | +| [扩展机制](design/extensibility.zh.md) | 数据表插件、诊断 skill、NCCL profiler | +| [分布式](design/distributed.zh.md) | 多节点联邦、torchrun 集成 | +| [NCCL Profiler](design/nccl-profiler.zh.md) | NCCL 插件、proxy-op 等待分解 | +| [贡献指南](contributing.zh.md) | 开发环境搭建、PR 流程 | diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md index 4d7661cf..773abfcd 100644 --- a/docs/src/quickstart.md +++ b/docs/src/quickstart.md @@ -1,94 +1,179 @@ # Quick Start -Get immediate value from Probing with this streamlined workflow. +This guide walks you through using Probing to inspect a running training process. +It assumes you've already [installed](installation.md) the package. By the end, +you'll be able to attach to a process, capture backtraces, and run SQL queries +against live performance data. -## Your First 5 Minutes +## Finding and attaching to a process -### Step 1: Set Your Target Process - -All Probing commands need a target endpoint. Set `$ENDPOINT` to either a local process ID or remote address: +First, locate the Python process you want to inspect. In your terminal: ```bash -# Local process - find and set your Python process ID -export ENDPOINT=$(pgrep -f "python.*your_script") +# Find your training process +pgrep -f "python.*train" +# → 27891 -# Or for remote processes -export ENDPOINT=remote-host:8080 +# Or with more context +ps aux | grep python | grep -v grep ``` -!!! tip "Finding Processes" - Use `ps aux | grep python` or `pgrep -f "python.*train"` to locate your target. +Set the endpoint environment variable so later commands are clean: -### Step 2: Attach and explore +```bash +export ENDPOINT=27891 +``` + +On Linux, you can attach to a running process directly: ```bash -# Connect to your process (Linux only) probing $ENDPOINT inject - -# Get basic process info -probing $ENDPOINT eval "import os, psutil; proc = psutil.Process(); print(f'PID: {os.getpid()}, Memory: {proc.memory_info().rss/1024**2:.1f}MB')" ``` -### Step 3: Try three CLI commands +On macOS or Windows, injection isn't available — you need to start the process with +probing enabled (`PROBING=1 python train.py`) instead. The `inject` command is the +only part of probing that's Linux-only; everything else (query, eval, backtrace, +skills) works on all platforms once the server is running. -Profiling tables fill automatically when hooks run. These commands read and interact with the probe: +## Your first diagnostic commands + +With the server running in the target, grab a backtrace and check what's happening +on the main thread: ```bash -probing $ENDPOINT query "SELECT name, value FROM information_schema.df_settings LIMIT 5" -probing $ENDPOINT eval "import torch; print(f'CUDA: {torch.cuda.is_available()}')" probing $ENDPOINT backtrace -probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace ORDER BY depth LIMIT 5" ``` -Details: **[Core Concepts](guide/concepts.md)** · **[API Reference](api-reference.md)** +The backtrace populates `python.backtrace` — a point-in-time view of the current +stack, mixing Python and native frames. Query it with SQL: + +```bash +probing $ENDPOINT query " + SELECT func, file, lineno, depth, frame_type + FROM python.backtrace + ORDER BY depth LIMIT 10 +" +``` + +You'll see function names, source file paths, and whether each frame is Python or +native code. Depth 0 is the innermost frame (what's executing right now). + +If you need to inspect live state beyond the stack, use `eval` to run arbitrary +Python in the target: + +```bash +probing $ENDPOINT eval "import torch; print(f'CUDA available: {torch.cuda.is_available()}')" +probing $ENDPOINT eval " + import gc, torch + gc.collect() + alloc = torch.cuda.memory_allocated() / 1024**2 + reserved = torch.cuda.memory_reserved() / 1024**2 + print(f'GPU: {alloc:.0f}MB allocated, {reserved:.0f}MB reserved') +" +``` + +## Three common workflows + +What follows are real scenarios — the kind of things you'll actually use Probing for +in practice. -## Real-World Debugging Scenarios +### Training is hanging -### Scenario 1: Training Process Hanging +The most common use case: training suddenly stops making progress. The process is +alive but nothing is happening. -**Problem**: PyTorch training suddenly stops progressing. +Start with a backtrace to see what the main thread is doing: ```bash -# 1. See what main thread is doing probing $ENDPOINT backtrace +probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace ORDER BY depth LIMIT 5" +``` + +The innermost frame (depth 0) tells you exactly where execution is stuck. If the +stack shows `ncclAllReduce` or a `torch.distributed` call, you're looking at a +communication hang. If it shows Python code in your model, the computation itself +is the bottleneck. -# 2. Check thread states -probing $ENDPOINT eval "import threading; [(t.name, t.is_alive()) for t in threading.enumerate()]" +Next, check thread states — a collective might be hanging while other threads are +fine: -# 3. Analyze stack context -probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace ORDER BY depth LIMIT 10" +```bash +probing $ENDPOINT eval " + import threading + for t in threading.enumerate(): + print(f'{t.name}: alive={t.is_alive()}, daemon={t.daemon}') +" ``` -### Scenario 2: Memory Leak Investigation +### GPU memory is growing -**Problem**: Memory usage keeps growing during training. +Memory creeping up step after step — a leak or accumulation pattern. Query the +torch_trace table to see per-step allocation trends: ```bash -# Force cleanup and get current state -probing $ENDPOINT eval "import gc, torch; gc.collect(); torch.cuda.empty_cache()" +probing $ENDPOINT query " + SELECT local_step, AVG(allocated) as avg_mb, MAX(allocated_delta) as max_delta_mb + FROM python.torch_trace + GROUP BY local_step + ORDER BY local_step +" +``` -# Analyze allocation trends -probing $ENDPOINT query "SELECT step, AVG(allocated) as avg_memory FROM python.torch_trace GROUP BY step ORDER BY step" +Look for `allocated_delta` values that don't return to zero between steps — +that indicates memory not being freed between iterations. Pair with `eval` to +force a GC and check current state: + +```bash +probing $ENDPOINT eval "import gc, torch; gc.collect(); torch.cuda.empty_cache()" ``` -### Scenario 3: Performance Bottleneck Analysis +If the GC + cache clear brings memory back down, the issue is Python-side +reference cycles. If not, you're looking at a CUDA-side leak or growing +workspace. + +### Finding slow modules and operations -**Problem**: Need to identify which model components are slowest. +To identify which parts of your model are the bottleneck: ```bash -# Find most expensive operations probing $ENDPOINT query " -SELECT module, stage, AVG(duration) as avg_duration -FROM python.torch_trace -GROUP BY module, stage -ORDER BY avg_duration DESC -LIMIT 10" + SELECT module, stage, AVG(duration) as avg_duration, COUNT(*) as calls + FROM python.torch_trace + WHERE stage IN ('post forward', 'post step') + GROUP BY module, stage + ORDER BY avg_duration DESC + LIMIT 10 +" ``` -## Next Steps +Filtering to `post forward` and `post step` stages gives you the execution times +(the `pre` rows carry timing anchors; the `post` rows carry actual durations). +The results tell you exactly which module and which pass direction accounts for +the most time. + +If you're running distributed, add the federated query prefix to compare across +ranks: + +```bash +probing -t query " + SELECT _rank, module, stage, AVG(duration) as avg_duration + FROM global.python.torch_trace + WHERE stage IN ('post forward', 'post step') + GROUP BY _rank, module, stage + ORDER BY avg_duration DESC + LIMIT 20 +" +``` + +`_rank` is a federation tag added at query time — see [Core Concepts](guide/concepts.md) +for how this works. + +## What's next + +These three commands — `backtrace`, `eval`, `query` — cover the majority of +day-to-day diagnostic work. Each is documented in detail in the [API +Reference](api-reference.md). -- **[Core Concepts](guide/concepts.md)** — Endpoint, tables, step/role, federation (read this next) -- **[Diagnostic Skills](guide/skills.md)** — `probing skill run` workflows -- [SQL Analytics](guide/sql-analytics.md) - Advanced query techniques -- [Memory Analysis](guide/memory-analysis.md) - Deep dive into memory debugging -- [Debugging Guide](guide/debugging.md) - Expert debugging patterns +For deeper analysis patterns (JOINs across tables, time-series bucketing, +statistical aggregation), read [SQL Analytics](sql-analytics.md). For +multi-node debugging, start with [Distributed](../design/distributed.md). diff --git a/docs/src/quickstart.zh.md b/docs/src/quickstart.zh.md index 597fb2c4..30ea5370 100644 --- a/docs/src/quickstart.zh.md +++ b/docs/src/quickstart.zh.md @@ -1,94 +1,160 @@ # 快速开始 -通过这个精简的工作流程,快速获得 Probing 的价值。 +本指南带你使用 Probing 检查运行中的训练进程。假定你已完成[安装](installation.zh.md)。 +读完这篇,你将能够附着到进程、抓取调用栈、并对实时性能数据执行 SQL 查询。 -## 5 分钟上手 +## 找到并附着到进程 -### 步骤 1:设置目标进程 - -所有 Probing 命令都需要一个目标端点。将 `$ENDPOINT` 设置为本地进程 ID 或远程地址: +首先找到你想检查的 Python 进程: ```bash -# 本地进程 - 查找并设置 Python 进程 ID -export ENDPOINT=$(pgrep -f "python.*your_script") +# 查找训练进程 +pgrep -f "python.*train" +# → 27891 -# 或者远程进程 -export ENDPOINT=remote-host:8080 +# 或者带更多上下文 +ps aux | grep python | grep -v grep ``` -!!! tip "查找进程" - 使用 `ps aux | grep python` 或 `pgrep -f "python.*train"` 来定位目标进程。 +设置端点环境变量以便后续命令更简洁: -### 步骤 2:附着并探索 +```bash +export ENDPOINT=27891 +``` + +在 Linux 上,可以直接附着到运行中的进程: ```bash -# 连接到进程(仅 Linux) probing $ENDPOINT inject - -# 获取基本进程信息 -probing $ENDPOINT eval "import os, psutil; proc = psutil.Process(); print(f'PID: {os.getpid()}, 内存: {proc.memory_info().rss/1024**2:.1f}MB')" ``` -### 步骤 3:试用三种 CLI 命令 +macOS 或 Windows 不支持 injection——需要以 `PROBING=1 python train.py` 的方式启动 +进程。`inject` 是 Probing 中唯一 Linux 专属的命令,其余所有操作(query、eval、 +backtrace、skill)在服务器运行后全平台通用。 -采集表在钩子运行时自动写入。以下命令读取并与探针交互: +## 首次诊断 + +服务器已在目标进程中运行后,抓取调用栈看看主线程在做什么: ```bash -probing $ENDPOINT query "SELECT name, value FROM information_schema.df_settings LIMIT 5" -probing $ENDPOINT eval "import torch; print(f'CUDA: {torch.cuda.is_available()}')" probing $ENDPOINT backtrace -probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace ORDER BY depth LIMIT 5" ``` -详见 **[核心概念](guide/concepts.zh.md)** · **[API 参考](api-reference.zh.md)** +backtrace 会填充 `python.backtrace`——主线程当前调用栈的瞬时视图,混合 Python +和原生帧。用 SQL 查询它: + +```bash +probing $ENDPOINT query " + SELECT func, file, lineno, depth, frame_type + FROM python.backtrace + ORDER BY depth LIMIT 10 +" +``` + +你会看到函数名、源文件路径,以及每帧是 Python 还是原生代码。深度 0 是最内层帧 +(当前正在执行的位置)。 + +如需查看调用栈之外的实时状态,用 `eval` 在目标进程中执行任意 Python: + +```bash +probing $ENDPOINT eval "import torch; print(f'CUDA 可用: {torch.cuda.is_available()}')" +probing $ENDPOINT eval " + import gc, torch + gc.collect() + alloc = torch.cuda.memory_allocated() / 1024**2 + reserved = torch.cuda.memory_reserved() / 1024**2 + print(f'GPU: 已分配 {alloc:.0f}MB, 已预留 {reserved:.0f}MB') +" +``` + +## 三个常见工作流 + +以下是你会经常用到的真实场景。 -## 真实调试场景 +### 训练卡住了 -### 场景 1:训练进程卡住 +最常见的场景:训练突然停止进展。进程还活着但什么也不做。 -**问题**:PyTorch 训练突然停止进展。 +先用 backtrace 看主线程状况: ```bash -# 1. 查看主线程在做什么 probing $ENDPOINT backtrace +probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace ORDER BY depth LIMIT 5" +``` + +最内层帧(depth 0)精确显示卡在哪里。如果调用栈显示 `ncclAllReduce` 或 +`torch.distributed` 调用,这是通信 hang。如果是模型 Python 代码,则是计算瓶颈。 -# 2. 检查线程状态 -probing $ENDPOINT eval "import threading; [(t.name, t.is_alive()) for t in threading.enumerate()]" +接着检查线程状态——collective 可能卡住了但其他线程正常: -# 3. 分析堆栈上下文 -probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace ORDER BY depth LIMIT 10" +```bash +probing $ENDPOINT eval " + import threading + for t in threading.enumerate(): + print(f'{t.name}: alive={t.is_alive()}, daemon={t.daemon}') +" ``` -### 场景 2:内存泄漏排查 +### GPU 内存在增长 -**问题**:训练过程中内存使用持续增长。 +内存随 step 不断增长——泄漏或累积。查询 torch_trace 表看每步分配趋势: ```bash -# 强制清理并获取当前状态 -probing $ENDPOINT eval "import gc, torch; gc.collect(); torch.cuda.empty_cache()" +probing $ENDPOINT query " + SELECT local_step, AVG(allocated) as avg_mb, MAX(allocated_delta) as max_delta_mb + FROM python.torch_trace + GROUP BY local_step + ORDER BY local_step +" +``` -# 分析分配趋势 -probing $ENDPOINT query "SELECT step, AVG(allocated) as avg_memory FROM python.torch_trace GROUP BY step ORDER BY step" +关注 `allocated_delta` 值不会在 step 间归零——说明迭代之间内存未被释放。 +配合 `eval` 强制 GC 并检查当前状态: + +```bash +probing $ENDPOINT eval "import gc, torch; gc.collect(); torch.cuda.empty_cache()" ``` -### 场景 3:性能瓶颈分析 +如果 GC 和 cache 清理后内存回落,问题是 Python 侧引用环。否则是 CUDA 侧 +泄漏或不断增长的 workspace。 + +### 找出最慢的模块和操作 -**问题**:需要找出哪些模型组件最慢。 +定位模型中哪个部分最耗时: ```bash -# 查找最耗时的操作 probing $ENDPOINT query " -SELECT module, stage, AVG(duration) as avg_duration -FROM python.torch_trace -GROUP BY module, stage -ORDER BY avg_duration DESC -LIMIT 10" + SELECT module, stage, AVG(duration) as avg_duration, COUNT(*) as calls + FROM python.torch_trace + WHERE stage IN ('post forward', 'post step') + GROUP BY module, stage + ORDER BY avg_duration DESC + LIMIT 10 +" ``` +过滤到 `post forward` 和 `post step` stage 可获得执行耗时(`pre` 行携带时间锚点, +`post` 行携带实际 duration)。结果告诉你哪个模块、哪个方向最耗时。 + +分布式训练时,加 `global.` 前缀跨 rank 对比: + +```bash +probing -t query " + SELECT _rank, module, stage, AVG(duration) as avg_duration + FROM global.python.torch_trace + WHERE stage IN ('post forward', 'post step') + GROUP BY _rank, module, stage + ORDER BY avg_duration DESC + LIMIT 20 +" +``` + +`_rank` 是查询时附加的联邦标签——工作原理见[核心概念](guide/concepts.zh.md)。 + ## 下一步 -- **[核心概念](guide/concepts.zh.md)** — 端点、表、step/role、联邦(建议优先阅读) -- **[诊断 Skill](guide/skills.zh.md)** — `probing skill run` 工作流 -- [SQL 分析](guide/sql-analytics.zh.md) - 高级查询技巧 -- [内存分析](guide/memory-analysis.zh.md) - 深入内存调试 -- [调试指南](guide/debugging.zh.md) - 专家级调试模式 +三个命令——`backtrace`、`eval`、`query`——覆盖了日常诊断的大部分场景。详细文档 +见 [API 参考](api-reference.zh.md)。 + +更深入的分析模式(跨表 JOIN、时间分桶、统计聚合)见 [SQL 分析](guide/sql-analytics.zh.md)。 +多节点调试从[分布式](../design/distributed.zh.md)开始。 diff --git a/docs/src/reference/env-vars.md b/docs/src/reference/env-vars.md new file mode 100644 index 00000000..f9576e64 --- /dev/null +++ b/docs/src/reference/env-vars.md @@ -0,0 +1,147 @@ +# Environment Variables + +Complete reference of every environment variable Probing reads. Variables are grouped +by subsystem. + +## Activation + +| Variable | Values | Default | Description | +|----------|--------|---------|-------------| +| `PROBING` | `0`, `1`/`followed`, `2`/`nested`, `regex:PATTERN`, `SCRIPT.py` | unset (disabled) | Controls whether probing activates. `1` activates the current process. `2` activates current + child processes. `regex:PATTERN` activates when the script basename matches. `SCRIPT.py` activates when the script basename equals the value exactly. | +| `PROBING_ORIGINAL` | (set automatically) | — | Backs up the original `PROBING` value before probing modifies it. Set by site_hook; don't set manually. | + +**Child-process propagation:** In `nested` mode, the original `PROBING` value is propagated to children. In `regex:` mode, non-matching children inherit `PROBING=1` so they can be inspected but won't re-trigger site hooks. + +Prefix syntax: `init:SCRIPT+` runs `exec(open(SCRIPT).read())` after activation. + +## Data storage + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_DATA_DIR` | Platform-specific | Root directory for mmap ring buffer files (MEMT tables). Each process creates a subdirectory named by its PID. | +| `PROBING_COLD` | unset | Set to `on` to enable hot-to-cold compaction of mmap tables. | +| `PROBING_COLD_TARGET_MB` | — | Target size per cold chunk after compaction. | +| `PROBING_COLD_MAX_TOTAL_MB` | — | Maximum total size of all cold storage files. | +| `PROBING_COLD_TTL_SECS` | — | Minimum age of a chunk before it's eligible for cold compaction. | +| `PROBING_COLD_POLL_MS` | — | Interval between compaction poll cycles. | +| `PROBING_COLD_MAX_AGE_SECS` | — | Maximum age of a chunk before forced compaction. | +| `PROBING_COLD_DIR` | — | Directory for cold storage files (defaults under `PROBING_DATA_DIR`). | + +## Server & networking + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_PORT` | unset | TCP port for the embedded HTTP server. Set to `RANDOM` for automatic port selection. Required for remote access. | +| `PROBING_SERVER_ADDR` | Inferred from port | Explicit bind address (e.g. `0.0.0.0:8080`). | +| `PROBING_SERVER_ADDRPATTERN` | unset | IP pattern filter for multi-homed hosts. Selects the first matching interface. | +| `PROBING_SERVER_WORKER_THREADS` | auto | Number of Tokio worker threads. | +| `PROBING_CTRL_ROOT` | `/tmp/probing/` | Directory for Unix domain sockets (local PID-based connections). | +| `PROBING_MAX_REQUEST_SIZE` | server default | Maximum HTTP request body size in bytes. | +| `PROBING_MAX_FILE_SIZE` | server default | Maximum file upload size in bytes. | +| `PROBING_ALLOWED_FILE_DIRS` | server default | Colon-separated list of directories allowed for file reads. | +| `PROBING_BASE_PATH` | unset | URL path prefix for reverse proxy deployments (e.g. `/probing`). | +| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | server default | Timeout for remote fan-out queries (federation). | +| `PROBING_ASSETS_ROOT` | built-in default | Path to the web UI static assets directory. | + +## Authentication + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_AUTH_TOKEN` | unset | Bearer token for HTTP authentication. Required for remote access when set. | +| `PROBING_AUTH_USERNAME` | unset | Username for Basic authentication. | +| `PROBING_AUTH_REALM` | unset | Authentication realm string for Basic auth. | + +## Tracing & spans + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_SPAN_BACKENDS` | `memtable` | Comma-separated list of span backends. Built-in: `memtable` (writes to `python.trace_event`), `logger` (writes to stderr), `otel` (OpenTelemetry export). Custom backends can be registered via `probing.span_backends` entry point. | +| `PROBING_SPAN_LOG_LEVEL` | `INFO` | Log level for the `logger` span backend. | +| `PROBING_SPAN_LOCATION` | unset | Enable automatic location capture via `inspect.stack()` for every span. Adds overhead; use sparingly. | + +## Step coordinates + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_MICRO_BATCHES` | `1` | Initial gradient accumulation factor. Controls `local_step = micro_step // micro_batches`. | +| `PROBING_STEP_BUCKET` | — | Step bucket size for grouped storage. | +| `PROBING_GLOBAL_STEP_BUCKET` | — | Global step bucket size (falls back to `PROBING_STEP_BUCKET`). | + +## Parallel topology (role) + +Set these to describe your training's parallelism configuration. Probing combines +them into a `role` string like `dp=2,pp=1,tp=0`. + +| Variable | Description | +|----------|-------------| +| `PROBING_TP_RANK` / `PROBING_TP_SIZE` | Tensor parallelism rank and size. | +| `PROBING_PP_RANK` / `PROBING_PP_SIZE` | Pipeline parallelism rank and size. | +| `PROBING_DP_RANK` / `PROBING_DP_SIZE` | Data parallelism rank and size. | +| `PROBING_EP_RANK` | Expert parallelism rank. | +| `PROBING_CP_RANK` | Context parallelism rank. | +| `PROBING_ROLE_` | Arbitrary named parallelism dimension (e.g. `PROBING_ROLE_SP=8`). | + +Non-PROBING-prefixed aliases are also recognized for Megatron compatibility: +`TP_RANK`, `TP_SIZE`, `PP_RANK`, `PP_SIZE`, `DP_RANK`, `DP_SIZE`, +`TENSOR_MODEL_PARALLEL_RANK`, `PIPELINE_MODEL_PARALLEL_RANK`, +`DATA_PARALLEL_RANK`, and more. + +## CPU sampling + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_CPU` | enabled | Set to `0`, `off`, `false`, or `no` to disable CPU sampling. | +| `PROBING_CPU_SAMPLE_MS` | `1000` | Sampling interval in milliseconds. Set to `0` to disable. | +| `PROBING_CPU_THREAD_TOP_N` | `8` | Maximum number of threads to sample per process per interval. | + +## GPU sampling + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_GPU` | enabled | Set to `0`, `off`, `false`, or `no` to disable GPU sampling. | +| `PROBING_GPU_SAMPLE_MS` | — | GPU sampling interval in milliseconds. | +| `PROBING_GPU_BACKEND` | `auto` | GPU backend filter: `auto`, `cuda`, `rocm`, `metal`. | + +## NCCL & HCCL + +| Variable | Description | +|----------|-------------| +| `PROBING_NCCL_MOCK` | Enable mock NCCL proxy data for testing without GPUs. | +| `PROBING_NCCL_PROFILER` | Path to the NCCL profiler shared library. | +| `PROBING_HCCL_PROFAPI_REAL` | Path to the real HCCL profapi library (Ascend NPU). | +| `PROBING_HCCL_SHIM` | Path to the HCCL shim library. | +| `PROBING_HCCL_SHIM_LOG` | Enable HCCL shim debug logging. | + +## RDMA + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_RDMA_HCA_NAME` | — | HCA device name filter for RDMA counter sampling. | +| `PROBING_RDMA_SAMPLE_RATE` | — | RDMA counter sampling rate in seconds. | + +## PyTorch integration + +| Variable | Description | +|----------|-------------| +| `PROBING_TORCH_PROFILING` | Set to `on` to activate PyTorch module hooks and write `python.torch_trace`. Required for module timing and memory data. | +| `PROBING_TORCHRUN_CLUSTER` | Enable automatic cluster registration via torchrun. | +| `PROBING_TORCHRUN_STORE_TIMEOUT` | Timeout for torchrun distributed store operations. | + +## Debugging & diagnostics + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_LOGLEVEL` | `info` | Rust-side log level: `trace`, `debug`, `info`, `warn`, `error`. | +| `PROBING_CRASH_BACKTRACE` | enabled | Print a backtrace on fatal signals (SIGSEGV, SIGABRT, etc.). Set to `0` to disable. | +| `PROBING_RUST_BACKTRACE` | — | Rust error backtrace detail (similar to `RUST_BACKTRACE`). | +| `PROBING_SAFE_DEMO` | — | Safe demonstration mode that restricts dangerous operations. | + +## Skill & tool paths + +| Variable | Description | +|----------|-------------| +| `PROBING_PROJECT_SKILLS_DIR` | Per-project skill directory (overrides `$PWD/.probing/skills/`). | +| `PROBING_USER_SKILLS_DIR` | Per-user skill directory (overrides `$HOME/.probing/skills/`). | +| `PROBING_CODE_ROOT` | Root directory for embedded Python monitoring code. | +| `PROBING_CLI_MODE` | Set automatically by the CLI to prevent recursive engine initialization. | +| `PROBING_PYTHON` | Path to the Python interpreter used by the CLI. Set automatically. | diff --git a/docs/src/reference/index.md b/docs/src/reference/index.md index 5db34262..61240e0e 100644 --- a/docs/src/reference/index.md +++ b/docs/src/reference/index.md @@ -6,6 +6,8 @@ Authoritative lookup for SQL schemas, CLI commands, and runtime APIs. |------|----------| | **[SQL Tables](sql-tables.md)** | Physical columns for `python.*`, `cluster.*`, and federation tags (synced with `tables.yaml`) | | **[API Reference](../api-reference.md)** | CLI, in-process Python API, config, [unimplemented APIs](../api-reference.md#unimplemented-apis) | +| **[Environment Variables](env-vars.md)** | Complete reference of all 30+ `PROBING_*` environment variables | +| **[Skill Format](skill-format.md)** | `steps.yaml` and `SKILL.md` specification for diagnostic skill authors | | **[Versions](../versions.md)** | Release compatibility and upgrade notes | For narrative guides, see **[User Guide](../guide/index.md)** and **[Core Concepts](../guide/concepts.md)**. diff --git a/docs/src/reference/index.zh.md b/docs/src/reference/index.zh.md index 5556ae4a..e470c7a3 100644 --- a/docs/src/reference/index.zh.md +++ b/docs/src/reference/index.zh.md @@ -6,6 +6,8 @@ SQL 表结构、CLI 命令与运行时 API 的权威查阅入口。 |------|------| | **[SQL 表目录](sql-tables.zh.md)** | `python.*`、`cluster.*` 物理列与联邦标签(与 `tables.yaml` 同步) | | **[API 参考](../api-reference.zh.md)** | CLI、进程内 Python API、配置、[未实现 API](../api-reference.zh.md#unimplemented-apis) | +| **[环境变量](env-vars.md)** | 全部 30+ 个 `PROBING_*` 环境变量的完整参考 | +| **[Skill 格式规范](skill-format.md)** | 面向诊断 skill 作者的 `steps.yaml` 和 `SKILL.md` 格式规范 | | **[版本兼容性](../versions.zh.md)** | 版本兼容与升级说明 | 叙事性指南见 **[用户指南](../guide/index.zh.md)** 与 **[核心概念](../guide/concepts.zh.md)**。 diff --git a/docs/src/reference/skill-format.md b/docs/src/reference/skill-format.md new file mode 100644 index 00000000..ce5851f1 --- /dev/null +++ b/docs/src/reference/skill-format.md @@ -0,0 +1,326 @@ +# Skill Format + +Reference specification for Probing diagnostic skills. A skill is a YAML + Markdown +package that defines a diagnostic workflow: SQL queries to run, interpretation rules +to apply, and findings to produce. + +Skills live in `skills//` with two files: `steps.yaml` (the executable +workflow) and `SKILL.md` (agent-facing documentation). + +## Directory layout + +``` +skills/ +├── catalog.yaml Master index of all skills +├── semantic/ +│ ├── tables.yaml Table semantic definitions +│ ├── intents.yaml Keyword-to-skill routing +│ └── pages.yaml Page-to-skill suggestions +└── / + ├── steps.yaml Executable diagnostic workflow + └── SKILL.md Agent-facing markdown (frontmatter + body) +``` + +## catalog.yaml + +The master index. Each entry maps a skill ID to its category, priority, and path. + +```yaml +apiVersion: probing.dev/v1 +kind: Catalog +categories: + triage: + label: "Triage" + description: "Quick health checks and first-response diagnostics" +skills: + - id: health_overview + category: triage + priority: 100 + entry: true + description: "Quick system health overview — GPU memory, CPU, process status" + tables: + - python.torch_trace + pages: + - dashboard + related: + - slow_rank + path: health_overview/steps.yaml +``` + +**Fields:** +- `priority`: Higher values surface the skill earlier in listings and LLM selection. +- `entry: true`: This skill is recommended as an entry point for its category. +- `tables`: Tables the skill queries. Used for prerequisite checking. +- `pages`: Web UI pages where this skill is relevant. +- `related`: Skills commonly used before or after this one. + +## steps.yaml + +The executable workflow. A single YAML file with schema version, metadata, steps, +interpretation rules, and summary template. + +### Top-level structure + +```yaml +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: my_skill + title: "My Diagnostic Skill" + title_en: "My Diagnostic Skill" + category: performance + tags: [gpu, memory] + triggers: + keywords: + zh: ["GPU", "显存"] + en: ["GPU", "memory"] + docs: | + Detailed description shown in CLI and web agent. + Can span multiple lines. + +spec: + parameters: [...] + requires: {...} + steps: [...] + variables: {...} + interpretation: + rules: [...] + summary_template: "..." + next_steps: [...] +``` + +### Parameters + +Declare typed parameters users can override with `--set key=value`. + +```yaml +parameters: + - name: sample_limit + type: integer + default: 100 + description: "Maximum rows to return per query" + - name: use_global + type: boolean + default: true + description: "Use global.* federation when available" + - name: step_window + type: integer + default: 20 + description: "Number of recent steps to analyze" +``` + +Types: `integer`, `boolean`, `string`. Parameter values are referenced in SQL as +`{param_name}`. + +### Requires + +Prerequisite check. The skill won't run if requirements aren't met. + +```yaml +requires: + any_tables: + - python.torch_trace + - nccl.proxy_ops +``` + +At least one of the listed tables must exist on the target endpoint. + +### Steps + +Ordered list of diagnostic operations. Each step has a type: + +**`sql`** — Run a SQL query. + +```yaml +steps: + - id: check_gpu_mem + title: "GPU Memory Per Step" + type: sql + sql: | + SELECT local_step, AVG(allocated) as avg_mb, MAX(max_allocated) as peak_mb + FROM {var_table} + WHERE local_step > (SELECT MAX(local_step) FROM {var_table}) - {step_window} + GROUP BY local_step + ORDER BY local_step + on_empty: warn + empty_message: "No GPU memory data found. Is PROBING_TORCH_PROFILING=on?" + cluster: false +``` + +Step fields: +- `id`: Unique within the skill. +- `title`: Displayed in output as `## Title`. +- `type`: `sql` (default), `api`, `ui`, or `config`. +- `sql`: The SQL query. `{param}` and `{var_name}` templates are expanded at runtime. +- `on_empty`: `skip` (default), `warn` (show empty message), or `abort` (stop). +- `empty_message`: Shown when the query returns zero rows (if `on_empty` is not `skip`). +- `cluster`: If `true`, uses federation fan-out (`POST /apis/cluster/query`). +- `when`: Optional condition. `"always"` or `"{use_global}"` (runs only when the + boolean variable is true). + +**`api`** — Call an HTTP API on the probing endpoint. + +```yaml + - id: check_nodes + title: "Cluster Peers" + type: api + path: /apis/nodes + method: GET +``` + +**`ui`** — Navigate the web UI to a view (web agent only; skipped in CLI). + +```yaml + - id: show_training + title: "Training Dashboard" + type: ui + view: training +``` + +**`config`** — Read or suggest a config change (CLI skips; web agent presents to user). + +```yaml + - id: check_sampling + title: "Sampling Rate Check" + type: config + config_key: probing.cpu.sample.interval +``` + +### Variables + +Derived template variables. The `comm_table` and `nccl_proxy_table` variables are +pre-defined and resolve based on `use_global`: + +```yaml +variables: + comm_table: "{use_global ? global.python.comm_collective : python.comm_collective}" + nccl_proxy_table: "{use_global ? global.nccl.proxy_ops : nccl.proxy_ops}" +``` + +The system derives these automatically unless overridden. `use_global` is itself a +parameter (default `true`) that auto-detects cluster availability from +`GET /apis/nodes`. + +### Interpretation rules + +Rules evaluate query results and produce severity-graded findings. They run after +all steps complete. + +```yaml +interpretation: + rules: + - id: high_gpu_mem + when: "step:check_gpu_mem | avg(allocated) > 90% * gpu_total" + severity: warning + message: "GPU memory usage ({avg_allocated:.0f}MB) exceeds 90% on rank {_rank}. Consider gradient checkpointing." + - id: mem_leak + when: "step:check_gpu_mem | slope(allocated) > 0" + severity: error + message: "GPU memory growing at {slope_rate:.1f}MB/step. Possible leak detected." +``` + +Rule fields: +- `id`: Unique within the skill. +- `when`: A predicate expression. Format: `step: | `. + Supports `avg`, `max`, `min`, `count`, `slope`, `latest` aggregations, and `>`, + `<`, `>=`, `<=`, `==`, `!=` operators. `*` multiplies by a reference value. +- `severity`: `error`, `warning`, or `info`. +- `message`: Template with `{column}` placeholders filled from the step's results. + +### Summary template + +A template expanded with step result metadata after the run: + +```yaml +summary_template: | + ## Summary + - GPU Memory: {check_gpu_mem.row_count} data points across {step_window} steps + - Slowest collective: {check_collective.top_op} at {check_collective.max_duration_ms:.1f}ms +``` + +Available fill values: `{step_id.row_count}`, `{step_id.max_}`, +`{step_id.min_}`, `{step_id.top_}`. + +### Next steps + +Suggestions shown after the skill completes: + +```yaml +next_steps: + - "If GPU memory exceeds 90%, consider running the memory_leak skill." + - "Check the NCCL culprit/victim skill if collective times are high." +``` + +## SKILL.md + +Agent-facing markdown for Cursor, Claude Code, and Codex integration. YAML +frontmatter is parsed by agent systems; the markdown body is human-readable. + +```markdown +--- +name: my_skill +description: >- + Diagnose my specific issue. +category: performance +tables: [python.torch_trace, python.comm_collective] +tags: [gpu, memory, performance] +keywords: + en: ['slow', 'bottleneck', 'throughput'] + zh: ['慢', '瓶颈', '吞吐'] +parameters: + step_window: { type: integer, default: 20 } +--- + +# My Skill + +Detailed explanation of what this skill does, when to use it, +and how to interpret the results. +``` + +## Skill resolution and overlay + +Skills are loaded from multiple roots in priority order: + +1. Embedded (compiled into the CLI binary at build time) +2. `$HOME/.probing/skills/` — user-level overrides +3. `$PWD/.probing/skills/` — project-level overrides +4. `$PROBING_PROJECT_SKILLS_DIR` — environment override +5. `$PROBING_USER_SKILLS_DIR` — environment override + +Later roots override earlier ones for the same skill ID. The catalog (`catalog.yaml`) +is also merged across roots — entries in higher-priority roots replace embedded +entries with the same ID. + +This means you can override a built-in skill by placing a modified copy in your +project's `.probing/skills/` directory. + +## Installing skills for AI agents + +```bash +# Install all skills for Cursor, Claude Code, and Codex +probing skill install + +# Install specific agents only +probing skill install --agent cursor --agent claude + +# Install to user-level agent directories only +probing skill install --user +``` + +This copies each skill's `SKILL.md` into `~/.cursor/skills/`, +`~/.claude/skills/`, or `~/.agents/skills/` so those agent tools can discover +and execute the skills during conversations. + +## Validation + +```bash +# Validate a single skill +python -m probing.skills validate my_skill + +# Validate all skills +python -m probing.skills validate --all +``` + +The validator checks: missing steps, duplicate step IDs, read-only SQL compliance +(all statements must start with SELECT/WITH/SHOW/DESCRIBE), and missing SKILL.md. diff --git a/docs/src/reference/sql-tables.md b/docs/src/reference/sql-tables.md index 4b6b887b..7611b6eb 100644 --- a/docs/src/reference/sql-tables.md +++ b/docs/src/reference/sql-tables.md @@ -1,29 +1,42 @@ # SQL Tables -Authoritative catalog of built-in SQL tables queryable via `probing query` or in-process -`probing.query()`. Kept in sync with `python/probing/_skills/semantic/tables.yaml` (used by -diagnostic skills and the Web Agent). +This page catalogs every built-in SQL table you can query through Probing. It's a +reference — if you're looking for query patterns and how-to, start with [SQL +Analytics](../guide/sql-analytics.md). -Terminology: [Core Concepts](../guide/concepts.md) (endpoint, steps, `role`, federation). - -## Schemas +Each table is backed by an mmap ring buffer (MEMT) or registered dynamically by an +extension crate. Tables live under schema prefixes that reflect their data source: +`python.*` for training and Python runtime data, `cpu.*` / `gpu.*` for host and +device sampling, `cluster.*` for node registry, `nccl.*` for the NCCL profiler +plugin, and `global..
` for federated cross-rank queries. -| Prefix | Meaning | -|--------|---------| -| `python.*` | Python / training probe tables (memtable) | -| `cpu.*`, `gpu.*`, `process.*` | Host / device sampling (extensions) | -| `cluster.*` | Cluster registry | -| `nccl.*` | NCCL profiler plugin (optional) | -| `global..
` | Federated fan-out across registered peers | -| `information_schema.*` | Engine metadata | +The authoritative schema definitions live in `skills/semantic/tables.yaml` (used by +diagnostic skills and the Web Agent). The tables on this page are kept in sync with +that file. -List tables on a live endpoint: +To see what tables are actually available on a live endpoint: ```bash probing $ENDPOINT tables probing $ENDPOINT tables --all ``` +Terminology: [Core Concepts](../guide/concepts.md) (endpoint, steps, `role`, federation). + +## Schema prefixes + +Each schema represents a category of data source. The tables listed below are organized +by these prefixes so you know where to look: + +| Prefix | Data source | +|--------|-------------| +| `python.*` | Training and Python runtime (memtable-backed) | +| `cpu.*`, `gpu.*`, `process.*` | Host and device sampling (extension crates) | +| `cluster.*` | Cluster node registry | +| `nccl.*` | NCCL profiler plugin (optional, cdylib) | +| `global..
` | Federated fan-out across registered peers | +| `information_schema.*` | Engine metadata and configuration | + ## Federation Tables with a **`global_name`** can be queried as `global.` (e.g. @@ -56,7 +69,7 @@ PyTorch module-level forward/step timings and GPU memory snapshots. | Column | Description | |--------|-------------| -| `step` | Local training step (per rank) | +| `local_step` | Local training step (per rank) | | `global_step` | Global step (`step_snapshot`) | | `rank` | `torch.distributed` rank | | `world_size` | World size | @@ -118,7 +131,7 @@ Span start/end and custom events (distributed tracing). | `trace_id` | Trace id shared by related spans | | `span_id` | Unique span id | | `name` | Span or event name | -| `kind` | Semantic kind (e.g. `train.step`, `comm.all_reduce`) | +| `phase` | Training phase (`forward`, `backward`, `optimizer`) or empty | | `time` | Timestamp (nanoseconds since epoch) | | `attributes` | JSON metadata (rank, local_step, …) | @@ -150,7 +163,7 @@ Variable snapshots when variable tracing is enabled. | Column | Description | |--------|-------------| -| `step` | Training step | +| `micro_step` | Training micro-step | | `func` | Function name | | `name` | Variable name | | `value` | String representation | diff --git a/docs/src/reference/sql-tables.zh.md b/docs/src/reference/sql-tables.zh.md index 9e5537a5..e012b2c6 100644 --- a/docs/src/reference/sql-tables.zh.md +++ b/docs/src/reference/sql-tables.zh.md @@ -1,28 +1,35 @@ # SQL 表目录 -可通过 `probing query` 或进程内 `probing.query()` 查询的内置 SQL 表权威目录。 -与 `python/probing/_skills/semantic/tables.yaml` 保持同步(诊断 skill 与 Web Agent 使用)。 +本页列出 Probing 中可通过 `probing query` 或 `probing.query()` 查询的所有内置 +SQL 表。这是一份参考手册——如果你需要查询模式和操作指南,从 [SQL 分析](../guide/sql-analytics.zh.md) +开始。 -术语说明见 [核心概念](../guide/concepts.zh.md)。 +每张表由 mmap 环形缓冲(MEMT)承载或由扩展 crate 动态注册。表按 schema 前缀 +组织,反映数据来源:`python.*` 是训练和 Python 运行时数据,`cpu.*` / `gpu.*` +是主机和设备采样,`cluster.*` 是节点注册信息,`nccl.*` 是 NCCL profiler 插件 +输出,`global..
` 是跨 rank 的联邦查询。 -## Schema 前缀 - -| 前缀 | 含义 | -|------|------| -| `python.*` | Python / 训练探针表(memtable) | -| `cpu.*`、`gpu.*`、`process.*` | 主机 / 设备采样(扩展) | -| `cluster.*` | 集群注册表 | -| `nccl.*` | NCCL profiler 插件(可选) | -| `global..
` | 跨已注册节点联邦 fan-out | -| `information_schema.*` | 引擎元数据 | +Schema 定义以 `skills/semantic/tables.yaml` 为权威来源(诊断 skill 与 Web Agent +使用该文件定义),本页与其保持同步。 -列出当前端点上的表: +在真实端点上查看当前可用表: ```bash probing $ENDPOINT tables probing $ENDPOINT tables --all ``` +## Schema 前缀 + +| 前缀 | 数据来源 | +|------|----------| +| `python.*` | 训练和 Python 运行时(memtable) | +| `cpu.*`、`gpu.*`、`process.*` | 主机和设备采样(扩展 crate) | +| `cluster.*` | 集群节点注册表 | +| `nccl.*` | NCCL profiler 插件(可选,cdylib) | +| `global..
` | 跨已注册节点联邦 fan-out | +| `information_schema.*` | 引擎元数据和配置 | + ## 联邦查询 带 **`global_name`** 的表可用 `global.<路径>` 查询(如 `global.python.comm_collective`)。 @@ -55,7 +62,7 @@ PyTorch 模块级 forward/step 耗时与 GPU 显存快照。 | 列 | 说明 | |----|------| -| `step` | 本地训练步(每 rank) | +| `local_step` | 本地训练步(每 rank) | | `global_step` | 全局步(`step_snapshot`) | | `rank` | `torch.distributed` rank | | `world_size` | world size | @@ -114,7 +121,7 @@ Span 起止与自定义事件(分布式 tracing)。 | `trace_id` | 同一 trace 内共享 | | `span_id` | Span 唯一 id | | `name` | Span / 事件名 | -| `kind` | 语义类型(如 `train.step`、`comm.all_reduce`) | +| `phase` | 训练阶段(`forward`、`backward`、`optimizer`)或空 | | `time` | 时间戳(纳秒) | | `attributes` | JSON 元数据(rank、local_step 等) | @@ -144,7 +151,7 @@ Python + native 混合栈(**瞬时**,非历史全量)。 | 列 | 说明 | |----|------| -| `step` | 训练步 | +| `micro_step` | 训练 micro-step | | `func` | 函数名 | | `name` | 变量名 | | `value` | 字符串表示 | diff --git a/examples/README.md b/examples/README.md index 90bb716e..d1b114d2 100644 --- a/examples/README.md +++ b/examples/README.md @@ -6,17 +6,18 @@ Runnable scripts under `examples/`. They are **not** installed with `pip install | Script | Extra packages | Notes | |--------|----------------|-------| -| `events.py`, `hooks.py`, `test_probing.py` | none (beyond probing) | Good smoke tests | +| **`tracing.py`** | `torch` | **Tracing 入门**(hook 驱动 phase,~80 行) | +| `hooks.py`, `test_probing.py` | none (beyond probing) | Good smoke tests | | `imagenet.py`, `imagenet_with_span.py` | `torch`, `torchvision` | Needs ImageNet data path | | `ray_tracing_example.py` | `ray` | Optional Ray integration | | `bench_profiler.py` | varies | See script header | -Install ML stack into your dev venv: +Install PyTorch into your dev venv (tracing 示例只需 torch;ImageNet 脚本还需 torchvision): ```bash source .venv/bin/activate -uv pip install torch torchvision -# or: pip install torch torchvision +uv pip install torch +# ImageNet 示例: uv pip install torch torchvision ``` ## Running with probing @@ -25,7 +26,7 @@ Use the project venv after `make develop` (see [Contributing](../docs/src/contri ```bash source .venv/bin/activate -PROBING=1 python examples/events.py +PROBING=1 python examples/tracing.py # tracing 入门(推荐) PROBING=1 python examples/test_probing.py --depth 2 ``` diff --git a/examples/events.py b/examples/events.py deleted file mode 100644 index c9755648..00000000 --- a/examples/events.py +++ /dev/null @@ -1,137 +0,0 @@ -import ast -from dataclasses import dataclass -from typing import Any - -import torch - - -def _get_fullname(m): - return f"{m.__module__}.{m.__class__.__name__}" - - -@dataclass -class TenserDef: - shape: tuple = () - dtype: Any = None - - def __repr__(self): - return f"TenserDef({self.shape}, {self.dtype})" - - -class Event(dict): - """ - Examples - -------- - >>> event = Event() - >>> event.name = "event name" - >>> event.name - 'event name' - """ - - def __getattr__(self, name): - if name in self: - return self[name] - else: - raise AttributeError( - f"'{self.__class__.__name__}' object has no attribute '{name}'" - ) - - def __setattr__(self, name: str, value: Any) -> None: - return self.__setitem__(name, value) - - -class TorchEvent(Event): - def __init__(self, name, module, inputs, params={}): - self.name = name - self.module = _get_fullname(module) - try: - if isinstance(inputs, torch.Tensor): - self.inputs = [TenserDef(tuple(inputs.shape), inputs.dtype)] - else: - self.inputs = [TenserDef(tuple(x.shape), x.dtype) for x in inputs] - except: - self.inputs = None - self.params = params - - def __repr__(self) -> str: - return f'{self.name}("{self.module}", {self.inputs}, {self.params})' - - -class ForwardStartEvent(TorchEvent): - def __init__(self, m, inputs, params={}) -> None: - super().__init__("ForwardStartEvent", m, inputs, params=params) - - -class ForwardEndEvent(TorchEvent): - def __init__(self, m, outputs, params={}) -> None: - super().__init__("ForwardEndEvent", m, outputs, params=params) - - -class BackwardStartEvent(TorchEvent): - def __init__(self, m, inputs, params={}) -> None: - super().__init__("BackwardStartEvent", m, inputs, params=params) - - -class BackwardEndEvent(TorchEvent): - def __init__(self, m, outputs, params={}) -> None: - super().__init__("BackwardEndEvent", m, outputs, params=params) - - -def parse(line): - expr = ast.parse(line, mode="eval") - name = expr.body.func.id - args = [ - eval(compile(ast.Expression(body=arg), filename="", mode="eval")) - for arg in expr.body.args - ] - event = Event() - event.name = name - event.module = args[0] - if name == "SpanStartEvent": - event.id = args[1] - elif name == "SpanEndEvent": - event.id = args[1] - event.duration = args[2] - else: - event.inputs = args[1] - event.params = args[2] if len(args) > 2 else {} - return event - - -def parse_tree(lines): - tree = [] - - span_stack = [] - curr_span = None - - event_stack = [] - for line in lines: - event = parse(line) - if event.name == "SpanStartEvent": - new_span = Event() - if curr_span is not None: - curr_span.children.append(new_span) - curr_span = new_span - curr_span.name = "Span" - curr_span.module = event.module - curr_span.id = event.id - curr_span.duration = None - curr_span.children = [] - tree.append(curr_span) - span_stack.append(curr_span) - if event.name == "SpanEndEvent": - curr_span.duration = event.duration - curr_span.children = curr_span.children - curr_span = span_stack.pop() - - if event.name == "ForwardStartEvent": - if curr_span is not None: - curr_span.children.append(event) - event_stack.append(event) - - if event.name == "ForwardEndEvent": - if len(event_stack) > 0: - curr_event = event_stack.pop() - curr_event.outputs = event.inputs[0] - - return tree diff --git a/examples/imagenet_with_span.py b/examples/imagenet_with_span.py index dfe93a10..ae78130d 100644 --- a/examples/imagenet_with_span.py +++ b/examples/imagenet_with_span.py @@ -251,7 +251,7 @@ def main_worker(gpu, ngpus_per_node, args): except Exception: pass # create model - with probing.span("model.init", kind="setup"): + with probing.span("model.init"): if args.pretrained: print(f"=> using pre-trained model '{args.arch}'") model = models.__dict__[args.arch](pretrained=True) @@ -331,7 +331,7 @@ def main_worker(gpu, ngpus_per_node, args): print(f"=> no checkpoint found at '{args.resume}'") # Data loading code - with probing.span("data.load", kind="io"): + with probing.span("data.load"): if args.dummy: print("=> Dummy data is used!") train_dataset = datasets.FakeData( @@ -411,14 +411,14 @@ def main_worker(gpu, ngpus_per_node, args): return for epoch in range(args.start_epoch, args.epochs): - with probing.span("epoch", kind="train"): + with probing.span("epoch"): probing.event("epoch.start", attributes=[{"epoch": epoch}]) if args.distributed: train_sampler.set_epoch(epoch) - with probing.span("train", kind="loop"): + with probing.span("train"): train(train_loader, model, criterion, optimizer, epoch, device, args) - with probing.span("validate", kind="loop"): + with probing.span("validate"): acc1 = validate(val_loader, model, criterion, args) scheduler.step() probing.event("epoch.metrics", attributes=[{"acc1": float(acc1)}]) @@ -428,7 +428,7 @@ def main_worker(gpu, ngpus_per_node, args): if not args.multiprocessing_distributed or ( args.multiprocessing_distributed and args.rank % ngpus_per_node == 0 ): - with probing.span("checkpoint.save", kind="io"): + with probing.span("checkpoint.save"): save_checkpoint( { "epoch": epoch + 1, @@ -468,23 +468,23 @@ def train(train_loader, model, criterion, optimizer, epoch, device, args): end = time.time() for i, (images, target) in enumerate(train_loader): time.sleep(1) - with probing.span("batch", kind="train.step"): + with probing.span("batch"): # measure data loading time data_time.update(time.time() - end) images = images.to(device, non_blocking=True) target = target.to(device, non_blocking=True) - with probing.span("forward", kind="nn.forward"): + with probing.span("forward"): output = model(images) - with probing.span("loss", kind="compute"): + with probing.span("loss"): loss = compute_loss(criterion, output, target) acc1, acc5 = accuracy(output, target, topk=(1, 5)) losses.update(loss.item(), images.size(0)) top1.update(acc1[0], images.size(0)) top5.update(acc5[0], images.size(0)) - with probing.span("backward", kind="nn.backward"): + with probing.span("backward"): optimizer.zero_grad() loss.backward() - with probing.span("step", kind="optim.step"): + with probing.span("step"): optimizer.step() batch_time.update(time.time() - end) end = time.time() diff --git a/examples/tracing.py b/examples/tracing.py new file mode 100644 index 00000000..14cff683 --- /dev/null +++ b/examples/tracing.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python3 +""" +probing tracing 入门 +=================== + +两层 API,分工明确: + + ① ``attach_training_phases(model, optimizer)`` — **推荐,零侵入** + model / optimizer 上的 hook 自动追踪每个 batch 的 + forward → backward → optimizer,并记录 ``train.step`` 整步耗时。 + 训练循环里 **不需要** ``with probing.span("forward")``。 + + 梯度累积:先 ``probing.step(micro_batches=N)``,``train.step`` 覆盖 + N 个 micro-batch 的 wall time;详见 ``docs/src/design/training-phase.zh.md``。 + + ② ``probing.span`` / ``probing.event`` — **可选,粗粒度时间线** + 包住模型初始化、epoch 等;与 ① 的 phase span 互不冲突。 + +运行:: + + PROBING=1 python examples/tracing.py + +终端实时查看 span(与 memtable 同时生效):: + + PROBING=1 PROBING_SPAN_BACKENDS=memtable,logger python examples/tracing.py + +查看最近 span(另开终端):: + + probing -t query " + SELECT s.name, s.phase, + round((e.time - s.time) / 1e6, 2) AS ms + FROM python.trace_event s + JOIN python.trace_event e + ON s.span_id = e.span_id AND e.record_type = 'span_end' + WHERE s.record_type = 'span_start' + ORDER BY s.time DESC LIMIT 12" +""" + +from __future__ import annotations + +import os + +import probing +import torch +import torch.nn as nn +import torch.nn.functional as F + +# --- 尽量小:只依赖 torch,无需真实数据集 --------------------------------- + +DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") +BATCHES = 5 +BATCH_SIZE = 16 +LR = 0.01 + + +class TinyNet(nn.Module): + def __init__(self) -> None: + super().__init__() + self.fc1 = nn.Linear(8, 16) + self.fc2 = nn.Linear(16, 4) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return self.fc2(F.relu(self.fc1(x))) + + +def train_one_batch( + model: nn.Module, + optimizer: torch.optim.Optimizer, + batch_idx: int, +) -> float: + x = torch.randn(BATCH_SIZE, 8, device=DEVICE) + y = torch.randint(0, 4, (BATCH_SIZE,), device=DEVICE) + + logits = model(x) + loss = F.cross_entropy(logits, y) + + optimizer.zero_grad() + loss.backward() + optimizer.step() # hook 在此追踪 optimizer phase,并推进 probing.step() + + # 可选:在 hook 打开的 phase span 上挂 point event + if batch_idx == 0: + probing.event( + "batch.stats", + attributes=[ + {"loss": round(float(loss.item()), 4)}, + {"phase": probing.phase()}, + ], + ) + + return float(loss.item()) + + +def main() -> None: + pid = os.getpid() + print( + f"pid={pid} device={DEVICE} probing={'on' if probing.is_enabled() else 'off'}" + ) + print() + + # --- ② 粗粒度 span:初始化 ----------------------------------------------- + with probing.span("setup"): + model = TinyNet().to(DEVICE) + optimizer = torch.optim.SGD(model.parameters(), lr=LR) + + # --- ① 自动 phase span:一行挂载 ----------------------------------------- + probing.attach_training_phases(model, optimizer) + print("attach_training_phases ✓ (forward / backward / optimizer 由 hook 驱动)") + print() + + # --- 训练:循环内无需手写 phase span ------------------------------------- + with probing.span("epoch"): + for i in range(BATCHES): + loss = train_one_batch(model, optimizer, i) + print( + f" batch {i} loss={loss:.4f} phase={probing.phase()!r} step={probing.step.micro_step}" + ) + + print() + if probing.is_enabled(): + print("完成。hook 已写入 python.trace_event,可用上方 SQL 查询。") + print( + f' probing -t {pid} query "SELECT name, phase FROM python.trace_event LIMIT 12"' + ) + else: + print("完成(未落表)。请用 PROBING=1 重新运行。") + + +if __name__ == "__main__": + main() diff --git a/probing/core/Cargo.toml b/probing/core/Cargo.toml index 5ad17961..2795ac16 100644 --- a/probing/core/Cargo.toml +++ b/probing/core/Cargo.toml @@ -22,6 +22,11 @@ missing_errors_doc = "allow" missing_panics_doc = "allow" similar_names = "allow" +[features] +test-utils = [] +default = ["builtin-schema-docs"] +builtin-schema-docs = ["dep:probing-hccl-shim", "dep:probing-nccl-profiler"] + [lib] crate-type = ["rlib"] @@ -29,6 +34,8 @@ crate-type = ["rlib"] probing-proto = { path = "../proto" } probing-macros = { path = "../macros" } probing-memtable = { path = "../memtable" } +probing-hccl-shim = { path = "../extensions/hccl-shim", optional = true } +probing-nccl-profiler = { path = "../extensions/nccl-profiler", optional = true } anyhow = { workspace = true } arrow = { workspace = true } @@ -38,6 +45,7 @@ once_cell = { workspace = true } tokio = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } +serde_yaml = "0.9" thiserror = { workspace = true } async-trait = "0.1.83" diff --git a/probing/core/src/core/cluster.rs b/probing/core/src/core/cluster.rs index f9aa1c5a..5f10600b 100644 --- a/probing/core/src/core/cluster.rs +++ b/probing/core/src/core/cluster.rs @@ -69,3 +69,9 @@ pub fn update_nodes(nodes: Vec) { pub fn get_nodes() -> Vec { CLUSTER.read().unwrap().list() } + +/// Clear in-memory cluster registration (tests only). +#[cfg(any(test, feature = "test-utils"))] +pub fn reset_cluster_for_tests() { + *CLUSTER.write().unwrap() = Cluster::default(); +} diff --git a/probing/core/src/core/engine.rs b/probing/core/src/core/engine.rs index 969d2b6f..c7129a0f 100644 --- a/probing/core/src/core/engine.rs +++ b/probing/core/src/core/engine.rs @@ -18,6 +18,8 @@ use super::probe_extension::ProbeExtensionManager; use super::data_source::{ProbeDataSource, ProbeDataSourceKind}; use super::federation; +use super::metadata_rewrite; +use super::semantic_catalog; /// Core query engine for the Probing system /// @@ -108,7 +110,10 @@ impl Engine { if let Some(df) = federation::try_execute_aggregate_pushdown(self, &original).await? { return Ok(Some(df)); } - let query: String = federation::prepare_global_query(&original); + let default_schema = self.default_namespace(); + let query: String = metadata_rewrite::prepare_metadata_query(&original, &default_schema) + .unwrap_or(original); + let query: String = federation::prepare_global_query(&query); let df = self.sql(query.as_str()).await?; let schema = df.schema().clone(); let batches = df.collect().await?; @@ -271,6 +276,7 @@ impl EngineBuilder { for data_source in self.data_sources { engine.enable(data_source).await?; } + semantic_catalog::install_semantic_catalog(&engine.context)?; federation::install_global_catalog(&engine.context)?; Ok(engine) diff --git a/probing/core/src/core/federation/aggregate_pushdown.rs b/probing/core/src/core/federation/aggregate_pushdown.rs index 8caedd77..ded9303f 100644 --- a/probing/core/src/core/federation/aggregate_pushdown.rs +++ b/probing/core/src/core/federation/aggregate_pushdown.rs @@ -35,10 +35,12 @@ struct PlannedAggregate { merge_fn: Option<&'static str>, } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct FederatedAggregatePlan { pub per_node_sql: String, pub coordinator_sql: Option, + /// Suffix applied on the coordinator after merge, e.g. ` ORDER BY avg_ms DESC LIMIT 5`. + pub post_merge_tail: Option, pub inject_tags: bool, } @@ -121,6 +123,12 @@ pub async fn try_execute_aggregate_pushdown( merge_proto_dataframes(&proto_parts)? }; + let result = if let Some(tail) = plan.post_merge_tail { + apply_post_merge_tail(&engine.context, &tail, result).await? + } else { + result + }; + Ok(Some(result)) } @@ -142,9 +150,7 @@ fn parse_single_statement(sql: &str) -> Option { } fn plan_from_query(query: &Query) -> Option { - if query.order_by.is_some() || query.limit_clause.is_some() || query.fetch.is_some() { - return None; - } + let post_merge_tail = build_post_merge_tail(query); let SetExpr::Select(select) = query.body.as_ref() else { return None; }; @@ -189,6 +195,7 @@ fn plan_from_query(query: &Query) -> Option { Some(FederatedAggregatePlan { per_node_sql, coordinator_sql, + post_merge_tail, inject_tags, }) } @@ -429,6 +436,50 @@ fn quote_ident(name: &str) -> String { } } +fn build_post_merge_tail(query: &Query) -> Option { + let order_by = format_order_by(query); + let limit = format_limit_clause(query); + if order_by.is_empty() && limit.is_empty() { + None + } else { + Some(format!("{order_by}{limit}")) + } +} + +fn format_order_by(query: &Query) -> String { + query + .order_by + .as_ref() + .map(|order_by| format!(" {order_by}")) + .unwrap_or_default() +} + +fn format_limit_clause(query: &Query) -> String { + let mut out = query + .limit_clause + .as_ref() + .map(|limit| format!(" {limit}")) + .unwrap_or_default(); + if let Some(fetch) = &query.fetch { + out.push(' '); + out.push_str(&fetch.to_string()); + } + out +} + +async fn apply_post_merge_tail( + ctx: &SessionContext, + tail: &str, + df: probing_proto::prelude::DataFrame, +) -> Result { + let batch = proto_dataframe_to_record_batch(&df)?; + if batch.num_rows() == 0 { + return Ok(df); + } + let sql = format!("SELECT * FROM partials{tail}"); + merge_on_coordinator(ctx, &sql, vec![batch]).await +} + async fn merge_on_coordinator( ctx: &SessionContext, merge_sql: &str, @@ -553,4 +604,16 @@ mod tests { let sql = "SELECT name, count(distinct value) AS n FROM global.process.envs GROUP BY name"; assert!(plan_federated_aggregate_pushdown(sql).is_none()); } + + #[test] + fn plans_order_by_limit_as_post_merge_tail() { + let sql = "SELECT name, count(*) AS n FROM global.process.envs GROUP BY name ORDER BY n DESC LIMIT 3"; + let plan = plan_federated_aggregate_pushdown(sql).expect("plan"); + assert!(plan.coordinator_sql.is_some()); + let tail = plan.post_merge_tail.as_deref().unwrap(); + assert!(tail.contains("ORDER BY n DESC")); + assert!(tail.contains("LIMIT 3")); + assert!(!plan.per_node_sql.to_uppercase().contains("ORDER BY")); + assert!(!plan.per_node_sql.to_uppercase().contains("LIMIT")); + } } diff --git a/probing/core/src/core/federation/cluster_executor.rs b/probing/core/src/core/federation/cluster_executor.rs index ab118930..4f1be781 100644 --- a/probing/core/src/core/federation/cluster_executor.rs +++ b/probing/core/src/core/federation/cluster_executor.rs @@ -6,6 +6,19 @@ use probing_proto::prelude::{DataFrame, Message, Node, Query, QueryDataFormat}; use crate::core::cluster::get_nodes; +#[cfg(any(test, feature = "test-utils"))] +type RemoteQueryHook = Box Result + Send + Sync>; + +#[cfg(any(test, feature = "test-utils"))] +static REMOTE_QUERY_HOOK: LazyLock>> = + LazyLock::new(|| Mutex::new(None)); + +/// Install an in-process remote query handler for federation integration tests. +#[cfg(any(test, feature = "test-utils"))] +pub fn set_remote_query_hook(hook: Option) { + *REMOTE_QUERY_HOOK.lock().unwrap() = hook; +} + /// Default per-node timeout for remote federated queries (seconds). const DEFAULT_REMOTE_QUERY_TIMEOUT_SECS: u64 = 2; /// Env var to override the per-node remote query timeout (seconds). @@ -155,6 +168,11 @@ impl ProbeClusterExecutor { } fn execute_remote(addr: &str, sql: &str) -> Result { + #[cfg(any(test, feature = "test-utils"))] + if let Some(hook) = REMOTE_QUERY_HOOK.lock().unwrap().as_ref() { + return hook(addr, sql); + } + let url = format!("http://{addr}/query"); let request = Message::new(Query { expr: sql.to_string(), diff --git a/probing/core/src/core/federation/convert.rs b/probing/core/src/core/federation/convert.rs index 1b19d8fa..40690152 100644 --- a/probing/core/src/core/federation/convert.rs +++ b/probing/core/src/core/federation/convert.rs @@ -9,15 +9,39 @@ use arrow::datatypes::{DataType, Field, Schema, SchemaRef, TimeUnit}; use datafusion::error::{DataFusionError, Result}; use probing_proto::prelude::{DataFrame, Seq}; -/// Primary node identity column on `global.*` query results (hostname, or addr if host is empty). +/// Legacy alias; prefer the `_host` / `_addr` pair. pub const PROBE_NODE_COL: &str = "_probe_node"; pub const PROBE_HOST_COL: &str = "_host"; pub const PROBE_ADDR_COL: &str = "_addr"; /// Cluster `rank` from `cluster.nodes` for the row's source probing endpoint. pub const PROBE_RANK_COL: &str = "_rank"; +/// Node/worker group rank (`GROUP_RANK` / `group_rank` on the endpoint). +pub const PROBE_NODE_RANK_COL: &str = "_node_rank"; +/// Intra-node GPU index (`LOCAL_RANK` / `local_rank` on the endpoint). +pub const PROBE_LOCAL_RANK_COL: &str = "_local_rank"; /// Parallel-role key (e.g. "dp=2,pp=1,tp=0") for the row's source endpoint. pub const PROBE_ROLE_COL: &str = "_role"; +/// Fixed federation tag columns appended to `global.*` results (stable order). +pub const FEDERATION_TAG_COLUMNS: &[&str] = &[ + PROBE_HOST_COL, + PROBE_ADDR_COL, + PROBE_RANK_COL, + PROBE_NODE_RANK_COL, + PROBE_LOCAL_RANK_COL, + PROBE_ROLE_COL, +]; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct FederationEndpointTags { + pub host: String, + pub addr: String, + pub rank: i32, + pub node_rank: i32, + pub local_rank: i32, + pub role: String, +} + #[cfg_attr(not(test), allow(dead_code))] pub fn node_label(host: &str, addr: &str) -> String { if host.is_empty() { @@ -29,17 +53,34 @@ pub fn node_label(host: &str, addr: &str) -> String { /// Resolve cluster rank for a probing endpoint (`host` + `addr` key in CLUSTER). pub fn cluster_rank_for_endpoint(host: &str, addr: &str) -> Option { + cluster_node_field(host, addr, |n| n.rank) +} + +/// Resolve node/worker group rank for a probing endpoint. +pub fn cluster_node_rank_for_endpoint(host: &str, addr: &str) -> Option { + cluster_node_field(host, addr, |n| n.group_rank) +} + +/// Resolve intra-node local rank for a probing endpoint. +pub fn cluster_local_rank_for_endpoint(host: &str, addr: &str) -> Option { + cluster_node_field(host, addr, |n| n.local_rank) +} + +fn cluster_node_field(host: &str, addr: &str, field: F) -> Option +where + F: Fn(&probing_proto::prelude::Node) -> Option, +{ use crate::core::cluster::CLUSTER; CLUSTER .read() .ok() - .and_then(|c| c.get_by_addr(host, addr).and_then(|n| n.rank)) + .and_then(|c| c.get_by_addr(host, addr).and_then(&field)) .or_else(|| { crate::core::cluster::get_nodes() .into_iter() .find(|n| n.addr == addr) - .and_then(|n| n.rank) + .and_then(|n| field(&n)) }) } @@ -60,12 +101,25 @@ pub fn cluster_role_for_endpoint(host: &str, addr: &str) -> Option { .filter(|r| !r.is_empty()) } +pub fn federation_tags_for_endpoint(host: &str, addr: &str) -> FederationEndpointTags { + FederationEndpointTags { + host: host.to_string(), + addr: addr.to_string(), + rank: cluster_rank_for_endpoint(host, addr).unwrap_or(-1), + node_rank: cluster_node_rank_for_endpoint(host, addr).unwrap_or(-1), + local_rank: cluster_local_rank_for_endpoint(host, addr).unwrap_or(-1), + role: cluster_role_for_endpoint(host, addr).unwrap_or_default(), + } +} + pub fn federated_output_schema(local: SchemaRef) -> SchemaRef { let mut fields = local.fields().to_vec(); for (name, dtype, nullable) in [ (PROBE_HOST_COL, DataType::Utf8, false), (PROBE_ADDR_COL, DataType::Utf8, false), (PROBE_RANK_COL, DataType::Int32, true), + (PROBE_NODE_RANK_COL, DataType::Int32, true), + (PROBE_LOCAL_RANK_COL, DataType::Int32, true), (PROBE_ROLE_COL, DataType::Utf8, true), ] { if !fields.iter().any(|f| f.name() == name) { @@ -78,7 +132,13 @@ pub fn federated_output_schema(local: SchemaRef) -> SchemaRef { pub fn is_federation_tag_column(name: &str) -> bool { matches!( name, - PROBE_NODE_COL | PROBE_HOST_COL | PROBE_ADDR_COL | PROBE_RANK_COL | PROBE_ROLE_COL + PROBE_NODE_COL + | PROBE_HOST_COL + | PROBE_ADDR_COL + | PROBE_RANK_COL + | PROBE_NODE_RANK_COL + | PROBE_LOCAL_RANK_COL + | PROBE_ROLE_COL ) } @@ -87,16 +147,34 @@ pub fn tag_proto_dataframe(df: &mut DataFrame, host: &str, addr: &str, rank: Opt if df.is_empty() { return; } + let mut tags = federation_tags_for_endpoint(host, addr); + if let Some(rank) = rank { + tags.rank = rank; + } + tag_proto_dataframe_with_tags(df, &tags); +} + +pub(crate) fn tag_proto_dataframe_with_tags(df: &mut DataFrame, tags: &FederationEndpointTags) { + if df.is_empty() { + return; + } + append_proto_tags(df, tags); +} + +fn append_proto_tags(df: &mut DataFrame, tags: &FederationEndpointTags) { let rows = df.len(); - let role = cluster_role_for_endpoint(host, addr).unwrap_or_default(); df.names.push(PROBE_HOST_COL.to_string()); df.names.push(PROBE_ADDR_COL.to_string()); df.names.push(PROBE_RANK_COL.to_string()); + df.names.push(PROBE_NODE_RANK_COL.to_string()); + df.names.push(PROBE_LOCAL_RANK_COL.to_string()); df.names.push(PROBE_ROLE_COL.to_string()); - df.cols.push(Seq::SeqText(vec![host.to_string(); rows])); - df.cols.push(Seq::SeqText(vec![addr.to_string(); rows])); - df.cols.push(Seq::SeqI32(vec![rank.unwrap_or(-1); rows])); - df.cols.push(Seq::SeqText(vec![role; rows])); + df.cols.push(Seq::SeqText(vec![tags.host.clone(); rows])); + df.cols.push(Seq::SeqText(vec![tags.addr.clone(); rows])); + df.cols.push(Seq::SeqI32(vec![tags.rank; rows])); + df.cols.push(Seq::SeqI32(vec![tags.node_rank; rows])); + df.cols.push(Seq::SeqI32(vec![tags.local_rank; rows])); + df.cols.push(Seq::SeqText(vec![tags.role.clone(); rows])); df.size = df.len() as u64; } @@ -148,10 +226,12 @@ pub fn dataframe_to_record_batch( return Ok(RecordBatch::new_empty(Arc::new(Schema::empty()))); } - let rank = rank.or_else(|| cluster_rank_for_endpoint(host, addr)); - let role = cluster_role_for_endpoint(host, addr).unwrap_or_default(); - let mut columns = Vec::with_capacity(df.cols.len() + 4); - let mut fields = Vec::with_capacity(df.names.len() + 4); + let mut tags = federation_tags_for_endpoint(host, addr); + if let Some(rank) = rank { + tags.rank = rank; + } + let mut columns = Vec::with_capacity(df.cols.len() + FEDERATION_TAG_COLUMNS.len()); + let mut fields = Vec::with_capacity(df.names.len() + FEDERATION_TAG_COLUMNS.len()); for (name, col) in df.names.iter().zip(df.cols.iter()) { fields.push(Field::new(name, array_data_type(col), true)); @@ -162,11 +242,15 @@ pub fn dataframe_to_record_batch( fields.push(Field::new(PROBE_HOST_COL, DataType::Utf8, false)); fields.push(Field::new(PROBE_ADDR_COL, DataType::Utf8, false)); fields.push(Field::new(PROBE_RANK_COL, DataType::Int32, true)); + fields.push(Field::new(PROBE_NODE_RANK_COL, DataType::Int32, true)); + fields.push(Field::new(PROBE_LOCAL_RANK_COL, DataType::Int32, true)); fields.push(Field::new(PROBE_ROLE_COL, DataType::Utf8, true)); - columns.push(Arc::new(StringArray::from(vec![host.to_string(); rows]))); - columns.push(Arc::new(StringArray::from(vec![addr.to_string(); rows]))); - columns.push(Arc::new(Int32Array::from(vec![rank; rows]))); - columns.push(Arc::new(StringArray::from(vec![role; rows]))); + columns.push(Arc::new(StringArray::from(vec![tags.host; rows]))); + columns.push(Arc::new(StringArray::from(vec![tags.addr; rows]))); + columns.push(Arc::new(Int32Array::from(vec![tags.rank; rows]))); + columns.push(Arc::new(Int32Array::from(vec![tags.node_rank; rows]))); + columns.push(Arc::new(Int32Array::from(vec![tags.local_rank; rows]))); + columns.push(Arc::new(StringArray::from(vec![tags.role; rows]))); RecordBatch::try_new(Arc::new(Schema::new(fields)), columns) .map_err(|e| DataFusionError::Execution(format!("dataframe conversion failed: {e}"))) @@ -182,31 +266,59 @@ pub fn tag_record_batch( return Ok(batch); } - let rank = rank.or_else(|| cluster_rank_for_endpoint(host, addr)); + let mut tags = federation_tags_for_endpoint(host, addr); + if let Some(rank) = rank { + tags.rank = rank; + } let rows = batch.num_rows(); let mut fields = batch.schema().fields().to_vec(); let mut columns = batch.columns().to_vec(); + append_batch_tags(&mut fields, &mut columns, rows, &tags)?; + + RecordBatch::try_new(Arc::new(Schema::new(fields)), columns) + .map_err(|e| DataFusionError::Execution(format!("tagging batch failed: {e}"))) +} + +fn append_batch_tags( + fields: &mut Vec>, + columns: &mut Vec, + rows: usize, + tags: &FederationEndpointTags, +) -> Result<()> { if !fields.iter().any(|f| f.name() == PROBE_HOST_COL) { fields.push(Arc::new(Field::new(PROBE_HOST_COL, DataType::Utf8, false))); - columns.push(Arc::new(StringArray::from(vec![host.to_string(); rows]))); + columns.push(Arc::new(StringArray::from(vec![tags.host.as_str(); rows]))); } if !fields.iter().any(|f| f.name() == PROBE_ADDR_COL) { fields.push(Arc::new(Field::new(PROBE_ADDR_COL, DataType::Utf8, false))); - columns.push(Arc::new(StringArray::from(vec![addr.to_string(); rows]))); + columns.push(Arc::new(StringArray::from(vec![tags.addr.as_str(); rows]))); } if !fields.iter().any(|f| f.name() == PROBE_RANK_COL) { fields.push(Arc::new(Field::new(PROBE_RANK_COL, DataType::Int32, true))); - columns.push(Arc::new(Int32Array::from(vec![rank; rows]))); + columns.push(Arc::new(Int32Array::from(vec![tags.rank; rows]))); + } + if !fields.iter().any(|f| f.name() == PROBE_NODE_RANK_COL) { + fields.push(Arc::new(Field::new( + PROBE_NODE_RANK_COL, + DataType::Int32, + true, + ))); + columns.push(Arc::new(Int32Array::from(vec![tags.node_rank; rows]))); + } + if !fields.iter().any(|f| f.name() == PROBE_LOCAL_RANK_COL) { + fields.push(Arc::new(Field::new( + PROBE_LOCAL_RANK_COL, + DataType::Int32, + true, + ))); + columns.push(Arc::new(Int32Array::from(vec![tags.local_rank; rows]))); } if !fields.iter().any(|f| f.name() == PROBE_ROLE_COL) { - let role = cluster_role_for_endpoint(host, addr).unwrap_or_default(); fields.push(Arc::new(Field::new(PROBE_ROLE_COL, DataType::Utf8, true))); - columns.push(Arc::new(StringArray::from(vec![role; rows]))); + columns.push(Arc::new(StringArray::from(vec![tags.role.as_str(); rows]))); } - - RecordBatch::try_new(Arc::new(Schema::new(fields)), columns) - .map_err(|e| DataFusionError::Execution(format!("tagging batch failed: {e}"))) + Ok(()) } pub fn align_batch_to_schema(batch: RecordBatch, schema: &Schema) -> Result { @@ -277,8 +389,10 @@ mod tests { use arrow::array::{Int32Array, RecordBatch, StringArray}; use arrow::datatypes::{DataType, Field, Schema, TimeUnit}; + use probing_proto::prelude::Node; use super::*; + use crate::core::cluster::{reset_cluster_for_tests, update_node}; #[test] fn node_label_prefers_host() { @@ -291,22 +405,40 @@ mod tests { } #[test] - fn federated_schema_includes_tag_columns() { + fn federated_schema_includes_six_tag_columns() { let local = Arc::new(Schema::new(vec![Field::new( "rank", DataType::Int32, false, )])); let schema = federated_output_schema(local); - assert!(schema.index_of(PROBE_HOST_COL).is_ok()); - assert!(schema.index_of(PROBE_ADDR_COL).is_ok()); - assert!(schema.index_of(PROBE_RANK_COL).is_ok()); - assert!(schema.index_of(PROBE_ROLE_COL).is_ok()); + for col in FEDERATION_TAG_COLUMNS { + assert!(schema.index_of(col).is_ok(), "missing tag column {col}"); + } assert!(schema.index_of(PROBE_NODE_COL).is_err()); } #[test] - fn tag_record_batch_adds_probe_columns() { + fn federation_tags_resolve_from_cluster_node() { + reset_cluster_for_tests(); + update_node(Node { + host: "host-a".into(), + addr: "10.0.0.1:8080".into(), + rank: Some(3), + group_rank: Some(1), + local_rank: Some(2), + role: Some("dp=0".into()), + ..Default::default() + }); + let tags = federation_tags_for_endpoint("host-a", "10.0.0.1:8080"); + assert_eq!(tags.rank, 3); + assert_eq!(tags.node_rank, 1); + assert_eq!(tags.local_rank, 2); + assert_eq!(tags.role, "dp=0"); + } + + #[test] + fn tag_record_batch_adds_six_probe_columns() { let local = Arc::new(Schema::new(vec![Field::new( "rank", DataType::Int32, @@ -314,34 +446,10 @@ mod tests { )])); let batch = RecordBatch::try_new(local, vec![Arc::new(Int32Array::from(vec![7]))]).unwrap(); let tagged = tag_record_batch(batch, "host-a", "10.0.0.1:8080", Some(3)).unwrap(); - assert_eq!(tagged.num_columns(), 5); - assert_eq!( - tagged - .column(tagged.schema().index_of(PROBE_HOST_COL).unwrap()) - .as_any() - .downcast_ref::() - .unwrap() - .value(0), - "host-a" - ); - assert_eq!( - tagged - .column(tagged.schema().index_of(PROBE_ADDR_COL).unwrap()) - .as_any() - .downcast_ref::() - .unwrap() - .value(0), - "10.0.0.1:8080" - ); - assert_eq!( - tagged - .column(tagged.schema().index_of(PROBE_RANK_COL).unwrap()) - .as_any() - .downcast_ref::() - .unwrap() - .value(0), - 3 - ); + assert_eq!(tagged.num_columns(), 7); + for col in FEDERATION_TAG_COLUMNS { + assert!(tagged.schema().index_of(col).is_ok()); + } } #[test] @@ -356,19 +464,6 @@ mod tests { assert_eq!(extended, vec![0]); } - #[test] - fn extend_projection_honors_tag_only_selection() { - let local = Arc::new(Schema::new(vec![Field::new( - "rank", - DataType::Int32, - false, - )])); - let schema = federated_output_schema(local); - let rank_idx = schema.index_of(PROBE_RANK_COL).unwrap(); - let extended = extend_projection_with_probe_tags(Some(&vec![rank_idx]), &schema).unwrap(); - assert_eq!(extended, vec![rank_idx]); - } - #[test] fn align_batch_fills_timestamp_column_for_empty_rows() { let batch = RecordBatch::try_new( diff --git a/probing/core/src/core/federation/global_table.rs b/probing/core/src/core/federation/global_table.rs index f6edc8eb..8df153a5 100644 --- a/probing/core/src/core/federation/global_table.rs +++ b/probing/core/src/core/federation/global_table.rs @@ -95,28 +95,31 @@ impl TableProvider for GlobalFederatedTable { let local_schema = self.local.schema(); let local_projection = local_table_projection(projection, &output_schema, &local_schema); + let host = ProbeClusterExecutor::local_host_label(); + let addr = ProbeClusterExecutor::local_addr_label(); + let local_rank = cluster_rank_for_endpoint(&host, &addr); + + reset_fanout_stats(); + let remote_nodes = ProbeClusterExecutor::remote_nodes(); + // With peers registered, LIMIT is global top-K at the coordinator only. + let scan_limit = if remote_nodes.is_empty() { limit } else { None }; + // Local scan stays lazy; coalesce to a single partition so the federated // plan can expose it as partition 0 without losing rows from sub-partitions. let local_plan = self .local - .scan(state, local_projection.as_ref(), filters, limit) + .scan(state, local_projection.as_ref(), filters, scan_limit) .await?; let local_plan: Arc = Arc::new(CoalescePartitionsExec::new(local_plan)); - let host = ProbeClusterExecutor::local_host_label(); - let addr = ProbeClusterExecutor::local_addr_label(); - let local_rank = cluster_rank_for_endpoint(&host, &addr); - - reset_fanout_stats(); let remote_sql = build_remote_table_sql( &self.schema_name, &self.table_name, &local_schema, local_projection.as_ref(), filters, - limit, + scan_limit, ); - let remote_nodes = ProbeClusterExecutor::remote_nodes(); let scan_projection = federated_scan_projection(projection, &output_schema) .unwrap_or_else(|| (0..output_schema.fields().len()).collect()); diff --git a/probing/core/src/core/federation/mod.rs b/probing/core/src/core/federation/mod.rs index 55a3457d..2f4bb859 100644 --- a/probing/core/src/core/federation/mod.rs +++ b/probing/core/src/core/federation/mod.rs @@ -5,21 +5,31 @@ mod federated_scan_exec; mod global_catalog; mod global_table; mod rewrite; +mod route; mod sql_gen; pub use aggregate_pushdown::{ plan_federated_aggregate_pushdown, try_execute_aggregate_pushdown, FederatedAggregatePlan, }; +#[cfg(any(test, feature = "test-utils"))] +pub use cluster_executor::set_remote_query_hook; pub use cluster_executor::{ remote_query_timeout, reset_fanout_stats, set_fanout_stats, take_fanout_stats, FanoutStats, ProbeClusterExecutor, RemoteFanoutResult, }; pub use convert::{ - cluster_rank_for_endpoint, cluster_role_for_endpoint, PROBE_ADDR_COL, PROBE_HOST_COL, - PROBE_NODE_COL, PROBE_RANK_COL, PROBE_ROLE_COL, + cluster_local_rank_for_endpoint, cluster_node_rank_for_endpoint, cluster_rank_for_endpoint, + cluster_role_for_endpoint, federated_output_schema, federation_tags_for_endpoint, + is_federation_tag_column, tag_proto_dataframe, FederationEndpointTags, FEDERATION_TAG_COLUMNS, + PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_LOCAL_RANK_COL, PROBE_NODE_COL, PROBE_NODE_RANK_COL, + PROBE_RANK_COL, PROBE_ROLE_COL, }; pub use global_catalog::{install_global_catalog, GLOBAL_CATALOG}; pub use rewrite::{ can_fanout_via_global_catalog, ensure_global_node_columns, prepare_global_query, rewrite_global_catalog_to_probe, rewrite_sql_for_global_fanout, }; +pub use route::{ + classify_cluster_sql, classify_federated_sql, explain_federation, explain_physical_plan, + FederatedQueryPath, FederationExplainReport, +}; diff --git a/probing/core/src/core/federation/rewrite.rs b/probing/core/src/core/federation/rewrite.rs index 9622e888..8ff32d3a 100644 --- a/probing/core/src/core/federation/rewrite.rs +++ b/probing/core/src/core/federation/rewrite.rs @@ -4,7 +4,7 @@ use datafusion::sql::sqlparser::ast::{Query, SetExpr, Statement}; use datafusion::sql::sqlparser::dialect::GenericDialect; use datafusion::sql::sqlparser::parser::Parser; -use super::convert::{PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_RANK_COL, PROBE_ROLE_COL}; +use super::convert::FEDERATION_TAG_COLUMNS; const KNOWN_SCHEMAS: &[&str] = &[ "cluster", "process", "files", "python", "memtable", "gpu", "rdma", @@ -134,14 +134,22 @@ fn select_list_includes_wildcard(sql: &str) -> bool { } } +fn federation_tags_already_expanded(lower: &str) -> bool { + FEDERATION_TAG_COLUMNS.iter().all(|col| lower.contains(col)) +} + +fn federation_tag_exclude_list() -> String { + FEDERATION_TAG_COLUMNS + .iter() + .map(|col| col.to_string()) + .collect::>() + .join(", ") +} + fn expand_global_select_star(sql: &str) -> String { let trimmed = sql.trim(); let lower = trimmed.to_lowercase(); - if lower.contains(PROBE_HOST_COL) - && lower.contains(PROBE_ADDR_COL) - && lower.contains(PROBE_RANK_COL) - && lower.contains(PROBE_ROLE_COL) - { + if federation_tags_already_expanded(&lower) { return sql.to_string(); } let Some(from_idx) = find_top_level_from(trimmed) else { @@ -154,7 +162,8 @@ fn expand_global_select_star(sql: &str) -> String { } let exclude = format!( - " EXCLUDE ({PROBE_HOST_COL}, {PROBE_ADDR_COL}, {PROBE_RANK_COL}, {PROBE_ROLE_COL}), {PROBE_HOST_COL}, {PROBE_ADDR_COL}, {PROBE_RANK_COL}, {PROBE_ROLE_COL}" + " EXCLUDE ({tags}), {tags}", + tags = federation_tag_exclude_list() ); let new_select = if let Some(dot_star) = select_part.rfind(".*") { let before = &select_part[..dot_star + 2]; @@ -192,6 +201,7 @@ pub fn prepare_global_query(sql: &str) -> String { #[cfg(test)] mod tests { + use super::super::convert::{PROBE_ADDR_COL, PROBE_RANK_COL}; use super::*; #[test] @@ -301,7 +311,7 @@ mod tests { let sql = "SELECT * FROM global.process.envs"; assert_eq!( ensure_global_node_columns(sql), - "SELECT * EXCLUDE (_host, _addr, _rank, _role), _host, _addr, _rank, _role FROM global.process.envs" + "SELECT * EXCLUDE (_host, _addr, _rank, _node_rank, _local_rank, _role), _host, _addr, _rank, _node_rank, _local_rank, _role FROM global.process.envs" ); } @@ -310,20 +320,19 @@ mod tests { let sql = "SELECT e.* FROM global.process.envs e"; assert_eq!( ensure_global_node_columns(sql), - "SELECT e.* EXCLUDE (_host, _addr, _rank, _role), _host, _addr, _rank, _role FROM global.process.envs e" + "SELECT e.* EXCLUDE (_host, _addr, _rank, _node_rank, _local_rank, _role), _host, _addr, _rank, _node_rank, _local_rank, _role FROM global.process.envs e" ); } #[test] fn skips_select_star_wildcard_when_tags_already_present() { - let sql = - "SELECT * EXCLUDE (_host, _addr, _rank, _role), _host, _addr, _rank, _role FROM global.process.envs"; + let sql = "SELECT * EXCLUDE (_host, _addr, _rank, _node_rank, _local_rank, _role), _host, _addr, _rank, _node_rank, _local_rank, _role FROM global.process.envs"; assert_eq!(ensure_global_node_columns(sql), sql); } #[test] fn skips_qualified_select_star_when_already_expanded() { - let sql = "SELECT e.* EXCLUDE (_host, _addr, _rank, _role), _host, _addr, _rank, _role FROM global.process.envs e"; + let sql = "SELECT e.* EXCLUDE (_host, _addr, _rank, _node_rank, _local_rank, _role), _host, _addr, _rank, _node_rank, _local_rank, _role FROM global.process.envs e"; assert_eq!(ensure_global_node_columns(sql), sql); } diff --git a/probing/core/src/core/federation/route.rs b/probing/core/src/core/federation/route.rs new file mode 100644 index 00000000..923f095b --- /dev/null +++ b/probing/core/src/core/federation/route.rs @@ -0,0 +1,150 @@ +//! Federated query routing classification and EXPLAIN helpers. +//! +//! Mirrors the path selection in `docs/src/design/federation.zh.md` §4.2: +//! - **AggregatePushdown** (A): single-table `global.*` + merge-safe aggregates +//! - **FederatedScan** (B): single-table `global.*` scan via `FederatedScanExec` +//! - **Broadcast** (C): JOIN / CTE / subquery — cluster fan-out only +//! - **Local**: `probe.*` or no federation catalog + +use datafusion::arrow::record_batch::RecordBatch; +use datafusion::error::Result; + +use crate::core::Engine; + +use super::aggregate_pushdown::{plan_federated_aggregate_pushdown, FederatedAggregatePlan}; +use super::rewrite::{ + can_fanout_via_global_catalog, prepare_global_query, rewrite_sql_for_global_fanout, +}; + +/// Execution path for a federated SQL statement (coordinator view). +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum FederatedQueryPath { + /// Single-process `probe.*` (no `global.*` / known schema fan-out). + Local, + /// Path A — partial aggregates on each peer, merge on coordinator. + AggregatePushdown, + /// Path B — lazy `FederatedScanExec` over local + peers. + FederatedScan, + /// Path C — broadcast full SQL to each rank (JOIN / CTE / …). + Broadcast, +} + +/// Snapshot returned by [`explain_federation`]. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct FederationExplainReport { + pub user_sql: String, + pub global_sql: String, + pub execution_path: FederatedQueryPath, + pub aggregate_plan: Option, + /// DataFusion `EXPLAIN` text for the prepared `global.*` statement (path B plan shape). + pub physical_plan: String, +} + +/// Classify a SQL string that already references `global.*` (or will after rewrite). +pub fn classify_federated_sql(sql: &str) -> FederatedQueryPath { + let lower = sql.to_lowercase(); + if !lower.contains("global.") { + return FederatedQueryPath::Local; + } + if !can_fanout_via_global_catalog(sql) { + return FederatedQueryPath::Broadcast; + } + if plan_federated_aggregate_pushdown(sql).is_some() { + return FederatedQueryPath::AggregatePushdown; + } + FederatedQueryPath::FederatedScan +} + +/// Classify user/cluster SQL (`python.t` → `global.*` rewrite applied first). +pub fn classify_cluster_sql(user_sql: &str) -> FederatedQueryPath { + classify_federated_sql(&rewrite_sql_for_global_fanout(user_sql)) +} + +/// Build a full federation explain report: route + optional pushdown plan + physical EXPLAIN. +pub async fn explain_federation( + engine: &Engine, + user_sql: &str, +) -> Result { + let global_sql = prepare_global_query(&rewrite_sql_for_global_fanout(user_sql)); + let execution_path = classify_federated_sql(&global_sql); + let aggregate_plan = plan_federated_aggregate_pushdown(&global_sql); + let physical_plan = explain_physical_plan(engine, &global_sql).await?; + Ok(FederationExplainReport { + user_sql: user_sql.to_string(), + global_sql, + execution_path, + aggregate_plan, + physical_plan, + }) +} + +/// Run `EXPLAIN` on a prepared SQL string and return the plan text. +pub async fn explain_physical_plan(engine: &Engine, sql: &str) -> Result { + let df = engine.context.sql(&format!("EXPLAIN {sql}")).await?; + let batches = df.collect().await?; + Ok(format_explain_batches(&batches)) +} + +fn format_explain_batches(batches: &[RecordBatch]) -> String { + let mut lines = Vec::new(); + for batch in batches { + let schema = batch.schema(); + for row in 0..batch.num_rows() { + let mut parts = Vec::new(); + for col in 0..batch.num_columns() { + let name = schema.field(col).name(); + let array = batch.column(col); + let value = arrow::util::display::array_value_to_string(array, row) + .unwrap_or_else(|_| "?".to_string()); + if parts.is_empty() && schema.fields().len() == 1 { + lines.push(value); + } else { + parts.push(format!("{name}={value}")); + } + } + if !parts.is_empty() { + lines.push(parts.join(" ")); + } + } + } + lines.join("\n") +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn classify_aggregate_pushdown() { + let sql = "SELECT global_step, sum(duration_ms) AS ms \ + FROM global.python.comm_collective GROUP BY global_step"; + assert_eq!( + classify_federated_sql(sql), + FederatedQueryPath::AggregatePushdown + ); + } + + #[test] + fn classify_federated_scan() { + let sql = "SELECT rank FROM global.demo.metrics WHERE rank > 0"; + assert_eq!( + classify_federated_sql(sql), + FederatedQueryPath::FederatedScan + ); + } + + #[test] + fn classify_broadcast_join() { + let sql = "SELECT a.x FROM global.python.a JOIN global.python.b ON a.id = b.id"; + assert_eq!(classify_federated_sql(sql), FederatedQueryPath::Broadcast); + } + + #[test] + fn classify_cluster_rewrite_to_global() { + let sql = "SELECT rank, sum(duration_ms) FROM python.comm_collective GROUP BY rank"; + assert_eq!( + classify_cluster_sql(sql), + FederatedQueryPath::AggregatePushdown + ); + } +} diff --git a/probing/core/src/core/metadata_rewrite.rs b/probing/core/src/core/metadata_rewrite.rs new file mode 100644 index 00000000..e77758aa --- /dev/null +++ b/probing/core/src/core/metadata_rewrite.rs @@ -0,0 +1,177 @@ +//! Rewrite `DESCRIBE` / `SHOW CREATE TABLE` into documented catalog queries. + +use datafusion::sql::sqlparser::ast::{DescribeAlias, ObjectName, ShowCreateObject, Statement}; +use datafusion::sql::sqlparser::dialect::GenericDialect; +use datafusion::sql::sqlparser::parser::Parser; + +use super::semantic_catalog::{COLUMN_DOCS, DOCS_SCHEMA, TABLE_DOCS}; + +/// If `sql` is a table metadata statement, return an enriched SELECT; otherwise `None`. +pub fn prepare_metadata_query(sql: &str, default_schema: &str) -> Option { + let dialect = GenericDialect {}; + let mut stmts = Parser::parse_sql(&dialect, sql).ok()?; + if stmts.len() != 1 { + return None; + } + match stmts.remove(0) { + Statement::ExplainTable { + describe_alias: DescribeAlias::Describe | DescribeAlias::Desc, + table_name, + .. + } => { + let (schema, table) = object_name_to_ref(&table_name, default_schema); + Some(describe_table_sql(&schema, &table)) + } + Statement::ShowCreate { + obj_type: ShowCreateObject::Table, + obj_name, + } => { + let (schema, table) = object_name_to_ref(&obj_name, default_schema); + Some(show_create_table_sql(&schema, &table)) + } + _ => None, + } +} + +fn object_name_to_ref(name: &ObjectName, default_schema: &str) -> (String, String) { + let mut parts: Vec = name + .0 + .iter() + .filter_map(|part| part.as_ident().map(|ident| ident.value.clone())) + .collect(); + if matches!( + parts.first().map(|s| s.as_str()), + Some("probe") | Some("global") | Some("datafusion") + ) { + parts.remove(0); + } + match parts.as_slice() { + [] => (default_schema.to_string(), String::new()), + [table] => (default_schema.to_string(), table.clone()), + [schema, table] => (schema.clone(), table.clone()), + [schema, rest @ ..] => (schema.clone(), rest.join(".")), + } +} + +fn sql_literal(s: &str) -> String { + format!("'{}'", s.replace('\'', "''")) +} + +fn describe_table_sql(schema: &str, table: &str) -> String { + format!( + "SELECT \ + c.column_name, \ + c.data_type, \ + c.is_nullable, \ + cd.description AS comment, \ + td.description AS table_comment \ + FROM information_schema.columns c \ + LEFT JOIN probe.{docs}.{column_docs} cd \ + ON c.table_schema = cd.table_schema \ + AND c.table_name = cd.table_name \ + AND c.column_name = cd.column_name \ + LEFT JOIN probe.{docs}.{table_docs} td \ + ON c.table_schema = td.table_schema \ + AND c.table_name = td.table_name \ + WHERE c.table_schema = {schema} \ + AND c.table_name = {table} \ + ORDER BY c.ordinal_position", + docs = DOCS_SCHEMA, + column_docs = COLUMN_DOCS, + table_docs = TABLE_DOCS, + schema = sql_literal(schema), + table = sql_literal(table), + ) +} + +fn show_create_table_sql(schema: &str, table: &str) -> String { + format!( + "SELECT \ + c.table_schema, \ + c.table_name, \ + max(td.description) AS table_comment, \ + max(td.synonyms) AS synonyms, \ + max(td.notes) AS notes, \ + concat( \ + '-- ', coalesce(max(td.description), ''), '\n', \ + CASE WHEN max(td.notes) IS NOT NULL AND max(td.notes) != '' \ + THEN concat('-- ', replace(max(td.notes), '\n', '\n-- '), '\n') \ + ELSE '' END, \ + 'CREATE TABLE ', c.table_schema, '.', c.table_name, ' (\n', \ + string_agg( \ + concat( \ + ' ', c.column_name, ' ', c.data_type, \ + CASE WHEN cd.description IS NOT NULL AND cd.description != '' \ + THEN concat(' -- ', cd.description) \ + ELSE '' END \ + ), \ + ',\n' ORDER BY c.ordinal_position \ + ), \ + '\n);' \ + ) AS create_statement \ + FROM information_schema.columns c \ + LEFT JOIN probe.{docs}.{table_docs} td \ + ON c.table_schema = td.table_schema \ + AND c.table_name = td.table_name \ + LEFT JOIN probe.{docs}.{column_docs} cd \ + ON c.table_schema = cd.table_schema \ + AND c.table_name = cd.table_name \ + AND c.column_name = cd.column_name \ + WHERE c.table_schema = {schema} \ + AND c.table_name = {table} \ + GROUP BY c.table_schema, c.table_name", + docs = DOCS_SCHEMA, + column_docs = COLUMN_DOCS, + table_docs = TABLE_DOCS, + schema = sql_literal(schema), + table = sql_literal(table), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn rewrite_describe_table() { + let sql = prepare_metadata_query("DESCRIBE hccl.tasks", "probe").unwrap(); + assert!(sql.contains("information_schema.columns")); + assert!(sql.contains("probing.column_docs")); + assert!(sql.contains("'hccl'")); + assert!(sql.contains("'tasks'")); + assert!(sql.contains("AS comment")); + } + + #[test] + fn rewrite_desc_short_form() { + let sql = prepare_metadata_query("DESC nccl.proxy_ops", "probe").unwrap(); + assert!(sql.contains("'nccl'")); + assert!(sql.contains("'proxy_ops'")); + } + + #[test] + fn rewrite_show_create_table() { + let sql = prepare_metadata_query("SHOW CREATE TABLE python.torch_trace", "probe").unwrap(); + assert!(sql.contains("create_statement")); + assert!(sql.contains("string_agg")); + assert!(sql.contains("'python'")); + assert!(sql.contains("'torch_trace'")); + } + + #[test] + fn skip_explain_query_plan() { + assert!(prepare_metadata_query("EXPLAIN SELECT 1", "probe").is_none()); + } + + #[test] + fn skip_regular_select() { + assert!(prepare_metadata_query("SELECT 1", "probe").is_none()); + } + + #[test] + fn qualified_with_probe_catalog() { + let sql = prepare_metadata_query("DESCRIBE probe.hccl.collectives", "probe").unwrap(); + assert!(sql.contains("'hccl'")); + assert!(sql.contains("'collectives'")); + } +} diff --git a/probing/core/src/core/mod.rs b/probing/core/src/core/mod.rs index 462c190f..0c15d98c 100644 --- a/probing/core/src/core/mod.rs +++ b/probing/core/src/core/mod.rs @@ -6,8 +6,10 @@ mod engine; mod error; pub mod federation; pub mod memtable_sql; +mod metadata_rewrite; mod plugin_advanced; pub mod probe_extension; +mod semantic_catalog; pub use data_source::ProbeDataSource; pub use data_source::ProbeDataSourceKind; @@ -101,4 +103,71 @@ mod tests { assert_eq!(df.names[0], "val", "Column name should match"); assert!(!df.cols.is_empty(), "Should have data columns"); } + + #[tokio::test] + async fn describe_rewrite_includes_comment() { + let engine = Engine::builder().build().await.unwrap(); + let df = engine + .async_query("DESCRIBE probing.column_docs") + .await + .unwrap() + .unwrap(); + assert!( + df.names.iter().any(|n| n == "comment"), + "DESCRIBE rewrite should expose comment column, got {:?}", + df.names + ); + assert!( + df.names.iter().any(|n| n == "table_comment"), + "DESCRIBE rewrite should expose table_comment column, got {:?}", + df.names + ); + } + + #[tokio::test] + async fn engine_column_docs_serves_code_first_hccl() { + use probing_proto::prelude::Seq; + + let engine = Engine::builder().build().await.unwrap(); + let df = engine + .async_query( + "SELECT description FROM probe.probing.column_docs \ + WHERE table_schema = 'hccl' AND table_name = 'tasks' AND column_name = 'task_name'", + ) + .await + .unwrap() + .expect("column_docs query should return rows"); + assert_eq!(df.names, vec!["description"]); + let desc = match &df.cols[0] { + Seq::SeqText(values) => values.first().cloned().expect("task_name description row"), + other => panic!("expected SeqText, got {other:?}"), + }; + assert!( + desc.contains("Memcpy"), + "expected code-first column doc, got {desc}" + ); + } + + #[tokio::test] + async fn engine_table_docs_serves_code_first_hccl() { + use probing_proto::prelude::Seq; + + let engine = Engine::builder().build().await.unwrap(); + let df = engine + .async_query( + "SELECT description FROM probe.probing.table_docs \ + WHERE table_schema = 'hccl' AND table_name = 'tasks'", + ) + .await + .unwrap() + .expect("table_docs query should return rows"); + let desc = match &df.cols[0] { + Seq::SeqText(values) => values.first().cloned().expect("hccl.tasks description row"), + other => panic!("expected SeqText, got {other:?}"), + }; + assert!( + desc.contains("MsprofHcclInfo"), + "expected code-first table doc, got {desc}" + ); + } } diff --git a/probing/core/src/core/semantic_catalog.rs b/probing/core/src/core/semantic_catalog.rs new file mode 100644 index 00000000..a5c4e26f --- /dev/null +++ b/probing/core/src/core/semantic_catalog.rs @@ -0,0 +1,440 @@ +//! Semantic table/column documentation for Engine `DESCRIBE` / `SHOW CREATE TABLE`. +//! +//! **Primary source:** in-code [`Schema`] docs registered via [`probing_memtable::docs`] +//! (HCCL/NCCL collectors, mmap `ExposedTable::create`, Python `@table`). +//! +//! **Overlay:** `skills/semantic/tables.yaml` supplies agent synonyms/notes/global_name +//! and fills gaps for tables not yet migrated to code-first docs. + +use std::collections::HashMap; +use std::sync::Arc; + +use arrow::array::{RecordBatch, StringArray}; +use arrow::datatypes::{DataType, Field, Schema, SchemaRef}; +use datafusion::catalog::{ + CatalogProvider, MemoryCatalogProvider, MemorySchemaProvider, SchemaProvider, +}; +use datafusion::error::{DataFusionError, Result}; +use datafusion::prelude::SessionContext; +use probing_memtable::docs; +use serde::Deserialize; + +use super::plugin_advanced::PluginAdvancedTable; + +const TABLES_YAML: &str = include_str!("../../../../skills/semantic/tables.yaml"); + +pub const DOCS_SCHEMA: &str = "probing"; +pub const TABLE_DOCS: &str = "table_docs"; +pub const COLUMN_DOCS: &str = "column_docs"; + +#[derive(Debug, Deserialize)] +struct SemanticCatalogFile { + tables: HashMap, +} + +#[derive(Debug, Deserialize)] +struct TableEntry { + description: String, + #[serde(default)] + synonyms: Vec, + #[serde(default)] + key_columns: HashMap, + #[serde(default)] + notes: Vec, + #[serde(default)] + global_name: Option, +} + +#[derive(Debug, Clone)] +pub struct ParsedSemanticCatalog { + pub table_rows: Vec, + pub column_rows: Vec, +} + +#[derive(Debug, Clone)] +pub struct TableDocRow { + pub table_schema: String, + pub table_name: String, + pub description: String, + pub synonyms: String, + pub notes: String, + pub global_name: String, +} + +#[derive(Debug, Clone)] +pub struct ColumnDocRow { + pub table_schema: String, + pub table_name: String, + pub column_name: String, + pub description: String, +} + +fn table_key(table_schema: &str, table_name: &str) -> (String, String) { + (table_schema.to_string(), table_name.to_string()) +} + +fn column_key(table_schema: &str, table_name: &str, column_name: &str) -> (String, String, String) { + ( + table_schema.to_string(), + table_name.to_string(), + column_name.to_string(), + ) +} + +/// Register compile-time known collector schemas (HCCL, NCCL, …). +pub fn register_builtin_schema_docs() { + #[cfg(feature = "builtin-schema-docs")] + { + probing_hccl_shim::register_docs(); + probing_nccl_profiler::register_docs(); + } +} + +pub fn parse_semantic_catalog_yaml(yaml: &str) -> Result { + let file: SemanticCatalogFile = serde_yaml::from_str(yaml).map_err(|e| { + DataFusionError::External(format!("failed to parse semantic tables.yaml: {e}").into()) + })?; + + let mut table_rows = Vec::new(); + let mut column_rows = Vec::new(); + + for (qualified, entry) in file.tables { + let Some((table_schema, table_name)) = qualified.split_once('.') else { + continue; + }; + table_rows.push(TableDocRow { + table_schema: table_schema.to_string(), + table_name: table_name.to_string(), + description: entry.description, + synonyms: entry.synonyms.join(", "), + notes: entry.notes.join("\n"), + global_name: entry.global_name.unwrap_or_default(), + }); + for (column_name, description) in entry.key_columns { + column_rows.push(ColumnDocRow { + table_schema: table_schema.to_string(), + table_name: table_name.to_string(), + column_name, + description, + }); + } + } + + sort_catalog_rows(&mut table_rows, &mut column_rows); + Ok(ParsedSemanticCatalog { + table_rows, + column_rows, + }) +} + +fn sort_catalog_rows(table_rows: &mut [TableDocRow], column_rows: &mut [ColumnDocRow]) { + table_rows + .sort_by(|a, b| (&a.table_schema, &a.table_name).cmp(&(&b.table_schema, &b.table_name))); + column_rows.sort_by(|a, b| { + (&a.table_schema, &a.table_name, &a.column_name).cmp(&( + &b.table_schema, + &b.table_name, + &b.column_name, + )) + }); +} + +/// Merge YAML overlay with the in-code doc registry (registry wins for descriptions). +pub fn build_semantic_catalog() -> Result { + register_builtin_schema_docs(); + + let yaml = parse_semantic_catalog_yaml(TABLES_YAML)?; + + let mut table_map: HashMap<(String, String), TableDocRow> = HashMap::new(); + for row in yaml.table_rows { + table_map.insert(table_key(&row.table_schema, &row.table_name), row); + } + + let mut column_map: HashMap<(String, String, String), ColumnDocRow> = HashMap::new(); + for row in yaml.column_rows { + column_map.insert( + column_key(&row.table_schema, &row.table_name, &row.column_name), + row, + ); + } + + for doc in docs::snapshot() { + let key = table_key(&doc.table_schema, &doc.table_name); + let entry = table_map.entry(key).or_insert_with(|| TableDocRow { + table_schema: doc.table_schema.clone(), + table_name: doc.table_name.clone(), + description: String::new(), + synonyms: String::new(), + notes: String::new(), + global_name: String::new(), + }); + if let Some(desc) = &doc.description { + entry.description = desc.clone(); + } + for (column_name, description) in &doc.columns { + column_map.insert( + column_key(&doc.table_schema, &doc.table_name, column_name), + ColumnDocRow { + table_schema: doc.table_schema.clone(), + table_name: doc.table_name.clone(), + column_name: column_name.clone(), + description: description.clone(), + }, + ); + } + } + + let mut table_rows: Vec = table_map.into_values().collect(); + let mut column_rows: Vec = column_map.into_values().collect(); + sort_catalog_rows(&mut table_rows, &mut column_rows); + + Ok(ParsedSemanticCatalog { + table_rows, + column_rows, + }) +} + +fn table_docs_schema() -> SchemaRef { + Arc::new(Schema::new(vec![ + Field::new("table_schema", DataType::Utf8, false), + Field::new("table_name", DataType::Utf8, false), + Field::new("description", DataType::Utf8, false), + Field::new("synonyms", DataType::Utf8, false), + Field::new("notes", DataType::Utf8, false), + Field::new("global_name", DataType::Utf8, false), + ])) +} + +fn column_docs_schema() -> SchemaRef { + Arc::new(Schema::new(vec![ + Field::new("table_schema", DataType::Utf8, false), + Field::new("table_name", DataType::Utf8, false), + Field::new("column_name", DataType::Utf8, false), + Field::new("description", DataType::Utf8, false), + ])) +} + +fn table_docs_batch(rows: &[TableDocRow]) -> Result { + let schema = table_docs_schema(); + let table_schema = StringArray::from( + rows.iter() + .map(|r| r.table_schema.as_str()) + .collect::>(), + ); + let table_name = StringArray::from( + rows.iter() + .map(|r| r.table_name.as_str()) + .collect::>(), + ); + let description = StringArray::from( + rows.iter() + .map(|r| r.description.as_str()) + .collect::>(), + ); + let synonyms = StringArray::from(rows.iter().map(|r| r.synonyms.as_str()).collect::>()); + let notes = StringArray::from(rows.iter().map(|r| r.notes.as_str()).collect::>()); + let global_name = StringArray::from( + rows.iter() + .map(|r| r.global_name.as_str()) + .collect::>(), + ); + RecordBatch::try_new( + schema, + vec![ + Arc::new(table_schema), + Arc::new(table_name), + Arc::new(description), + Arc::new(synonyms), + Arc::new(notes), + Arc::new(global_name), + ], + ) + .map_err(DataFusionError::from) +} + +fn column_docs_batch(rows: &[ColumnDocRow]) -> Result { + let schema = column_docs_schema(); + let table_schema = StringArray::from( + rows.iter() + .map(|r| r.table_schema.as_str()) + .collect::>(), + ); + let table_name = StringArray::from( + rows.iter() + .map(|r| r.table_name.as_str()) + .collect::>(), + ); + let column_name = StringArray::from( + rows.iter() + .map(|r| r.column_name.as_str()) + .collect::>(), + ); + let description = StringArray::from( + rows.iter() + .map(|r| r.description.as_str()) + .collect::>(), + ); + RecordBatch::try_new( + schema, + vec![ + Arc::new(table_schema), + Arc::new(table_name), + Arc::new(column_name), + Arc::new(description), + ], + ) + .map_err(DataFusionError::from) +} + +/// Register `probing.table_docs` and `probing.column_docs` on the `probe` catalog. +pub fn install_semantic_catalog(context: &SessionContext) -> Result<()> { + let parsed = build_semantic_catalog()?; + let catalog: Arc = if let Some(catalog) = context.catalog("probe") { + catalog + } else { + let c: Arc = Arc::new(MemoryCatalogProvider::new()); + context.register_catalog("probe", Arc::clone(&c)); + c + }; + + let schema: Arc = if let Some(schema) = catalog.schema(DOCS_SCHEMA) { + schema + } else { + let s: Arc = Arc::new(MemorySchemaProvider::new()); + catalog.register_schema(DOCS_SCHEMA, Arc::clone(&s))?; + s + }; + + let table_batch = table_docs_batch(&parsed.table_rows)?; + let column_batch = column_docs_batch(&parsed.column_rows)?; + + schema.register_table( + TABLE_DOCS.to_string(), + Arc::new(PluginAdvancedTable::try_new( + TABLE_DOCS, + table_docs_schema(), + vec![table_batch], + )?), + )?; + schema.register_table( + COLUMN_DOCS.to_string(), + Arc::new(PluginAdvancedTable::try_new( + COLUMN_DOCS, + column_docs_schema(), + vec![column_batch], + )?), + )?; + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use arrow::array::Int64Array; + + #[test] + fn parse_embedded_yaml_has_python_tables() { + let parsed = parse_semantic_catalog_yaml(TABLES_YAML).unwrap(); + assert!(parsed + .table_rows + .iter() + .any(|r| r.table_schema == "python" && r.table_name == "torch_trace")); + } + + #[test] + fn build_catalog_prefers_code_docs_for_hccl() { + let parsed = build_semantic_catalog().unwrap(); + let host_ops = parsed + .table_rows + .iter() + .find(|r| r.table_schema == "hccl" && r.table_name == "host_ops") + .expect("hccl.host_ops"); + assert!(host_ops.description.contains("MSProf Host API")); + assert!(parsed.column_rows.iter().any(|r| { + r.table_schema == "hccl" + && r.table_name == "host_ops" + && r.column_name == "event_class" + && r.description.contains("host_hccl_op") + })); + } + + #[test] + fn build_catalog_keeps_yaml_synonyms_for_hccl() { + let parsed = build_semantic_catalog().unwrap(); + let host_ops = parsed + .table_rows + .iter() + .find(|r| r.table_schema == "hccl" && r.table_name == "host_ops") + .expect("hccl.host_ops"); + assert!( + host_ops.synonyms.contains("MSProf"), + "yaml synonyms should be preserved: {}", + host_ops.synonyms + ); + } + + #[test] + fn build_catalog_includes_registry_only_table() { + let table = format!("code_only_{}", std::process::id()); + docs::register_from_name( + &format!("unittest.{table}"), + &probing_memtable::Schema::new() + .table_doc("registry-only table") + .col_doc("id", probing_memtable::DType::I64, "primary id"), + ); + let parsed = build_semantic_catalog().unwrap(); + assert!(parsed.table_rows.iter().any(|r| { + r.table_schema == "unittest" + && r.table_name == table + && r.description.contains("registry-only") + })); + assert!(parsed.column_rows.iter().any(|r| { + r.table_schema == "unittest" && r.table_name == table && r.column_name == "id" + })); + } + + #[test] + fn build_catalog_nccl_culprit_column_from_code() { + let parsed = build_semantic_catalog().unwrap(); + let row = parsed + .column_rows + .iter() + .find(|r| { + r.table_schema == "nccl" + && r.table_name == "proxy_ops" + && r.column_name == "send_gpu_wait_ns" + }) + .expect("nccl.proxy_ops.send_gpu_wait_ns"); + assert!(row.description.contains("Culprit")); + } + + #[test] + fn build_catalog_yaml_only_python_table_still_present() { + let parsed = build_semantic_catalog().unwrap(); + assert!(parsed + .table_rows + .iter() + .any(|r| r.table_schema == "python" && r.table_name == "torch_trace")); + assert!(parsed.column_rows.iter().any(|r| { + r.table_schema == "python" && r.table_name == "torch_trace" && r.column_name == "module" + })); + } + + #[tokio::test] + async fn install_registers_docs_tables() { + let ctx = SessionContext::new(); + install_semantic_catalog(&ctx).unwrap(); + let df = ctx + .sql("SELECT count(*) AS n FROM probe.probing.column_docs") + .await + .unwrap(); + let batches = df.collect().await.unwrap(); + let col = batches[0] + .column(0) + .as_any() + .downcast_ref::() + .unwrap(); + assert!(col.value(0) > 0); + } +} diff --git a/probing/core/src/trace/mod.rs b/probing/core/src/trace/mod.rs index dbfe32d2..fd26b574 100644 --- a/probing/core/src/trace/mod.rs +++ b/probing/core/src/trace/mod.rs @@ -3,7 +3,7 @@ mod step; pub use span::{attr, Attribute, Ele, Event, Location, Span, SpanStatus, Timestamp}; pub use step::{ - advance_local_step, current_local_step, set_step_bucket_size, step_snapshot, sync_local_step, + advance_micro_step, current_micro_step, set_micro_batches, step_snapshot, sync_micro_step, StepSnapshot, }; diff --git a/probing/core/src/trace/span.rs b/probing/core/src/trace/span.rs index 880fd431..1c9cda28 100644 --- a/probing/core/src/trace/span.rs +++ b/probing/core/src/trace/span.rs @@ -127,7 +127,7 @@ pub struct Span { pub end: Option, // === 元数据 === - pub kind: Option, + pub phase: Option, pub loc: Option, // === 扩展数据 === @@ -137,7 +137,7 @@ pub struct Span { impl Span { /// Creates a new root span (starts a new trace). - pub fn new_root>(name: N, kind: Option<&str>, location: Option<&str>) -> Self { + pub fn new_root>(name: N, phase: Option<&str>, location: Option<&str>) -> Self { let trace_id = NEXT_TRACE_ID.fetch_add(1, Ordering::Relaxed); let span_id = NEXT_SPAN_ID.fetch_add(1, Ordering::Relaxed); let location = location.map(|loc_val| Location::UnknownLocation(loc_val.into())); @@ -151,7 +151,7 @@ impl Span { name: name.into(), start: Timestamp::now(), end: None, - kind: kind.map(|k| k.to_string()), + phase: phase.map(|p| p.to_string()), loc: location, attrs: vec![], events: vec![], @@ -162,7 +162,7 @@ impl Span { pub fn new_child>( parent: &Span, name: N, - kind: Option<&str>, + phase: Option<&str>, location: Option<&str>, ) -> Self { let span_id = NEXT_SPAN_ID.fetch_add(1, Ordering::Relaxed); @@ -177,7 +177,7 @@ impl Span { name: name.into(), start: Timestamp::now(), end: None, - kind: kind.map(|k| k.to_string()), + phase: phase.map(|p| p.to_string()), loc: location, attrs: vec![], events: vec![], @@ -273,7 +273,7 @@ mod tests { ); assert_eq!(span.name, "process_incoming_request"); - assert_eq!(span.kind, Some("server_op".to_string())); + assert_eq!(span.phase, Some("server_op".to_string())); assert_eq!(span.parent_id, None, "Root span has no parent"); assert_eq!( span.status(), diff --git a/probing/core/src/trace/step.rs b/probing/core/src/trace/step.rs index d4ee66f9..64bae4f9 100644 --- a/probing/core/src/trace/step.rs +++ b/probing/core/src/trace/step.rs @@ -1,19 +1,24 @@ use std::cell::RefCell; -/// Snapshot of the training step coordinate system (scheme 2: local step buckets). +/// Training step coordinates. +/// +/// * ``micro_step`` — finest counter (advanced each ``train.step`` / ``probing.step()``). +/// * ``local_step = micro_step / micro_batches`` — per-rank training step. +/// * ``global_step = local_step`` — cluster training step (same value when ranks align). #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct StepSnapshot { + pub micro_step: u64, pub local_step: u64, pub global_step: u64, - pub bucket_size: u64, + pub micro_batches: u64, pub rank: i64, pub world_size: i64, } #[derive(Debug, Clone)] struct StepContext { - local_step: u64, - bucket_size: u64, + micro_step: u64, + micro_batches: u64, rank: i64, world_size: i64, } @@ -21,8 +26,8 @@ struct StepContext { impl Default for StepContext { fn default() -> Self { Self { - local_step: 0, - bucket_size: read_bucket_size(), + micro_step: 0, + micro_batches: read_micro_batches(), rank: read_rank(), world_size: read_world_size(), } @@ -31,27 +36,29 @@ impl Default for StepContext { impl StepContext { fn snapshot(&self) -> StepSnapshot { + let local = training_step_for(self.micro_step, self.micro_batches); StepSnapshot { - local_step: self.local_step, - global_step: global_step_for(self.local_step, self.bucket_size), - bucket_size: self.bucket_size, + micro_step: self.micro_step, + local_step: local, + global_step: local, + micro_batches: self.micro_batches, rank: self.rank, world_size: self.world_size, } } - fn sync_local_step(&mut self, step: u64) -> StepSnapshot { - self.local_step = step; + fn sync_micro_step(&mut self, step: u64) -> StepSnapshot { + self.micro_step = step; self.snapshot() } - fn advance_local_step(&mut self) -> StepSnapshot { - self.local_step = self.local_step.saturating_add(1); + fn advance_micro_step(&mut self) -> StepSnapshot { + self.micro_step = self.micro_step.saturating_add(1); self.snapshot() } - fn set_bucket_size(&mut self, bucket: u64) { - self.bucket_size = bucket.max(1); + fn set_micro_batches(&mut self, micro_batches: u64) { + self.micro_batches = micro_batches.max(1); } } @@ -59,9 +66,8 @@ thread_local! { static STEP_CTX: RefCell = RefCell::new(StepContext::default()); } -fn global_step_for(local_step: u64, bucket_size: u64) -> u64 { - let bucket = bucket_size.max(1); - local_step / bucket +fn training_step_for(micro_step: u64, micro_batches: u64) -> u64 { + micro_step / micro_batches.max(1) } fn read_env_u64(key: &str) -> Option { @@ -72,8 +78,9 @@ fn read_env_i64(key: &str) -> Option { std::env::var(key).ok().and_then(|v| v.trim().parse().ok()) } -fn read_bucket_size() -> u64 { - read_env_u64("PROBING_GLOBAL_STEP_BUCKET") +fn read_micro_batches() -> u64 { + read_env_u64("PROBING_MICRO_BATCHES") + .or_else(|| read_env_u64("PROBING_GLOBAL_STEP_BUCKET")) .or_else(|| read_env_u64("PROBING_STEP_BUCKET")) .unwrap_or(1) .max(1) @@ -95,20 +102,20 @@ pub fn step_snapshot() -> StepSnapshot { with_ctx(|ctx| ctx.snapshot()) } -pub fn sync_local_step(step: u64) -> StepSnapshot { - with_ctx(|ctx| ctx.sync_local_step(step)) +pub fn sync_micro_step(step: u64) -> StepSnapshot { + with_ctx(|ctx| ctx.sync_micro_step(step)) } -pub fn advance_local_step() -> StepSnapshot { - with_ctx(|ctx| ctx.advance_local_step()) +pub fn advance_micro_step() -> StepSnapshot { + with_ctx(|ctx| ctx.advance_micro_step()) } -pub fn set_step_bucket_size(bucket: u64) { - with_ctx(|ctx| ctx.set_bucket_size(bucket)); +pub fn set_micro_batches(micro_batches: u64) { + with_ctx(|ctx| ctx.set_micro_batches(micro_batches)); } -pub fn current_local_step() -> u64 { - step_snapshot().local_step +pub fn current_micro_step() -> u64 { + step_snapshot().micro_step } #[cfg(test)] @@ -116,22 +123,34 @@ mod tests { use super::*; #[test] - fn global_step_uses_bucket_size() { - assert_eq!(global_step_for(0, 1), 0); - assert_eq!(global_step_for(9, 10), 0); - assert_eq!(global_step_for(10, 10), 1); - assert_eq!(global_step_for(42, 10), 4); + fn local_step_uses_micro_batches() { + assert_eq!(training_step_for(0, 1), 0); + assert_eq!(training_step_for(9, 10), 0); + assert_eq!(training_step_for(10, 10), 1); + assert_eq!(training_step_for(42, 10), 4); } #[test] - fn advance_and_sync_local_step() { - let _ = sync_local_step(0); - assert_eq!(step_snapshot().local_step, 0); - let snap = advance_local_step(); + fn global_step_equals_local_step() { + let _ = sync_micro_step(0); + let snap = advance_micro_step(); + assert_eq!(snap.micro_step, 1); assert_eq!(snap.local_step, 1); assert_eq!(snap.global_step, 1); - let snap = sync_local_step(99); + let snap = sync_micro_step(99); + assert_eq!(snap.micro_step, 99); assert_eq!(snap.local_step, 99); assert_eq!(snap.global_step, 99); } + + #[test] + fn micro_batches_groups_training_steps() { + set_micro_batches(10); + let _ = sync_micro_step(0); + let snap = sync_micro_step(15); + assert_eq!(snap.micro_step, 15); + assert_eq!(snap.local_step, 1); + assert_eq!(snap.global_step, 1); + set_micro_batches(1); + } } diff --git a/probing/core/src/tracing.rs b/probing/core/src/tracing.rs index 15bd5807..5f55fa8c 100644 --- a/probing/core/src/tracing.rs +++ b/probing/core/src/tracing.rs @@ -89,7 +89,7 @@ pub struct Span { pub parent_span_id: Option, pub name: String, - pub kind: Option, + pub phase: Option, pub location: Option, pub start_time: Timestamp, @@ -139,12 +139,12 @@ impl LocalSpanManager { pub fn start_span>( &mut self, name: N, - kind: Option<&str>, + phase: Option<&str>, location: Option<&str>, initial_attributes: Option>, ) -> (SpanId, TraceId) { let name = name.into(); - let kind = kind.map(|k_val| k_val.into()); + let phase = phase.map(|p_val| p_val.into()); let start_time = Timestamp::now(); let current_span_sequence = self.next_span_seq; @@ -180,7 +180,7 @@ impl LocalSpanManager { span_id, parent_span_id: parent_span_id_to_store, name, - kind, + phase, location, start_time, end_time: None, @@ -418,7 +418,7 @@ mod tests { .get(&span_id) .expect("Span not found in tracer"); assert_eq!(span.name, "process_incoming_request"); - assert_eq!(span.kind, Some("server_op".to_string())); + assert_eq!(span.phase, Some("server_op".to_string())); assert_eq!(span.parent_span_id, None, "Root span has no parent"); assert_eq!( span.status, diff --git a/probing/extensions/hccl-profapi/Cargo.toml b/probing/extensions/hccl-profapi/Cargo.toml new file mode 100644 index 00000000..6bc54c40 --- /dev/null +++ b/probing/extensions/hccl-profapi/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "probing-hccl-profapi" +description = "libprofapi.so cdylib — same sources as probing-hccl-shim, Linux HCCL dlopen name" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true + +[lib] +name = "profapi" +crate-type = ["cdylib"] +path = "../hccl-shim/src/lib.rs" + +[dependencies] +probing-memtable = { path = "../../memtable" } + +once_cell = { workspace = true } +parking_lot = "0.12" + +[target.'cfg(target_os = "linux")'.dependencies] +libc = "0.2" diff --git a/probing/extensions/hccl-shim/Cargo.toml b/probing/extensions/hccl-shim/Cargo.toml new file mode 100644 index 00000000..a56197d8 --- /dev/null +++ b/probing/extensions/hccl-shim/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "probing-hccl-shim" +description = "libprofapi.so shim for HCCL — captures Msprof events into hccl.* memtables" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true + +[lib] +# rlib for workspace linking (probing-core schema docs, unit tests). +name = "probing_hccl_shim" +crate-type = ["rlib"] + +[dependencies] +probing-memtable = { path = "../../memtable" } + +once_cell = { workspace = true } +parking_lot = "0.12" + +[target.'cfg(target_os = "linux")'.dependencies] +libc = "0.2" + +[dev-dependencies] +tempfile = "3" diff --git a/probing/extensions/hccl-shim/README.md b/probing/extensions/hccl-shim/README.md new file mode 100644 index 00000000..d9981d08 --- /dev/null +++ b/probing/extensions/hccl-shim/README.md @@ -0,0 +1,82 @@ +# probing-hccl-shim + +HCCL loads MSProf via `dlopen("libprofapi.so")`. This crate builds a **`libprofapi.so` shim** that: + +1. Exports the seven `Msprof*` symbols HCCL `dlsym`s +2. Records events into probing mmap tables (`hccl.*`) +3. Forwards to the real CANN library (`libprofapi.so.real` or `PROBING_HCCL_PROFAPI_REAL`) + +## Build + +```bash +make hccl-shim-lib +# → python/probing/shim/hccl/libprofapi.so +``` + +## Deploy on Ascend training + +```bash +# 1. Copy real MSProf API next to shim (once per CANN version) +python -m probing.hccl --install-real "$ASCEND_HOME/lib64/libprofapi.so" + +# 2. Prefer shim over CANN libprofapi.so +export LD_LIBRARY_PATH="$(python -m probing.hccl --shim-dir):${LD_LIBRARY_PATH:-}" + +# 3. probing memtable + optional debug +export PROBING=2 +export PROBING_HCCL_SHIM_LOG=1 # optional + +# 4. Enable CANN/HCCL profiling as usual, then train +torchrun ... train.py +``` + +Query (same process or after inject): + +```sql +SELECT count(*) FROM hccl.host_ops; +SELECT count(*) FROM hccl.collectives; +SELECT * FROM hccl.tasks LIMIT 20; +SELECT * FROM hccl.mc2_streams LIMIT 10; +SELECT * FROM global.hccl.tasks LIMIT 20; -- multi-rank +``` + +## Tables + +| SQL table | Source | Key columns | +|-----------|--------|-------------| +| `hccl.host_ops` | `MsprofReportApi` | `event_class`, `item_name`, `duration_ns`, timing | +| `hccl.collectives` | `MsprofReportCompactInfo` (HcclOpInfo) + host HCCL op API | `row_source` (`api`/`compact`), `count`, `group_hash`, `alg_hash` | +| `hccl.tasks` | `MsprofReportAdditionalInfo` → `MsprofHcclInfo` | `task_name`, `plane_index`, `rank_in_plane`, `data_size` | +| `hccl.mc2_streams` | MC2 comm AdditionalInfo | `comm_stream_ids`, `rank_id`, `aicpu_kfc_stream_id` | +| `hccl.context_ids` | ContextId AdditionalInfo | `ctx_id_min`, `ctx_id_max` | + +Join collective timing with metadata: + +```sql +SELECT a.op_name, a.duration_ns, c.count, c.group_hash, c.alg_hash +FROM hccl.collectives a +JOIN hccl.collectives c + ON a.thread_id = c.thread_id + AND a.row_source = 'api' + AND c.row_source = 'compact' + AND abs(a.ts - c.ts) < 1000000; +``` + +## Name resolution + +`MsprofRegTypeInfo` and `MsprofGetHashId` populate a hash→name cache. Known HCCL task/op strings are pre-seeded on first call so `item_name` / `event_class` decode without waiting for runtime registration. + +## Real library resolution + +1. `PROBING_HCCL_PROFAPI_REAL` +2. `/libprofapi.so.real` +3. `$ASCEND_HOME/lib64/libprofapi.so` or `$ASCEND_INSTALL_PATH/lib64/libprofapi.so` + +The shim never `dlopen("libprofapi.so")` by bare name (would reload itself). + +## Notes + +- Struct layouts (`MsprofHcclInfo`, `ProfilingDeviceCommResInfo`, etc.) are best-effort from open HCCL sources; pin CANN version and validate columns on first deploy. +- AdditionalInfo routing uses registered type names (`mc2_comm_info`, `context_id_info`) with data-length fallbacks. +- Profiling must be enabled (`GetIfProfile()` / MSProf subscribe) or tables stay empty. +- Non-Linux: crate builds for CI; plugin symbols are Linux-only. diff --git a/probing/extensions/hccl-shim/src/forward.rs b/probing/extensions/hccl-shim/src/forward.rs new file mode 100644 index 00000000..21344186 --- /dev/null +++ b/probing/extensions/hccl-shim/src/forward.rs @@ -0,0 +1,249 @@ +//! Lazy forward to the real CANN `libprofapi.so` (never dlopen the shim name). + +#![cfg(target_os = "linux")] + +use std::ffi::{CStr, CString}; +use std::os::raw::{c_char, c_void}; +use std::os::unix::ffi::OsStrExt; +use std::path::{Path, PathBuf}; +use std::sync::atomic::{AtomicBool, Ordering}; + +use once_cell::sync::Lazy; +use parking_lot::Mutex; + +type ProfCommandHandle = Option i32>; + +type FnRegisterCallback = unsafe extern "C" fn(u32, ProfCommandHandle) -> i32; +type FnRegTypeInfo = unsafe extern "C" fn(u16, u32, *const c_char) -> i32; +type FnReportApi = unsafe extern "C" fn(u32, *const c_void) -> i32; +type FnReportBlob = unsafe extern "C" fn(u32, *const c_void, u32) -> i32; +type FnGetHashId = unsafe extern "C" fn(*const c_char, u32) -> u64; +type FnSysCycleTime = unsafe extern "C" fn() -> u64; + +struct RealApi { + register_callback: FnRegisterCallback, + reg_type_info: FnRegTypeInfo, + report_api: FnReportApi, + report_compact: FnReportBlob, + report_additional: FnReportBlob, + get_hash_id: FnGetHashId, + sys_cycle_time: FnSysCycleTime, +} + +struct RealLib { + handle: *mut c_void, + api: RealApi, +} + +unsafe impl Send for RealLib {} + +impl Drop for RealLib { + fn drop(&mut self) { + unsafe { + if !self.handle.is_null() { + libc::dlclose(self.handle); + } + } + } +} + +static INIT: Lazy>> = Lazy::new(|| Mutex::new(None)); +static INIT_FAILED: AtomicBool = AtomicBool::new(false); +static LOGGED_INIT: AtomicBool = AtomicBool::new(false); + +const ENV_REAL: &str = "PROBING_HCCL_PROFAPI_REAL"; +const REAL_BASENAME: &str = "libprofapi.so.real"; +const ENV_ASCEND_HOME: &str = "ASCEND_HOME"; +const ENV_ASCEND_INSTALL: &str = "ASCEND_INSTALL_PATH"; + +fn log_once(msg: &str) { + if std::env::var_os("PROBING_HCCL_SHIM_LOG").is_some() + && LOGGED_INIT + .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) + .is_ok() + { + eprintln!("[probing-hccl-shim] {msg}"); + } +} + +fn shim_directory() -> Option { + let maps = std::fs::read_to_string("/proc/self/maps").ok()?; + for line in maps.lines() { + if !line.contains("libprofapi.so") { + continue; + } + let path = line.split_whitespace().last()?; + let p = Path::new(path); + if p.is_absolute() { + return p.parent().map(|d| d.to_path_buf()); + } + } + None +} + +fn ascend_lib_dirs() -> Vec { + let mut out = Vec::new(); + for key in [ENV_ASCEND_HOME, ENV_ASCEND_INSTALL] { + if let Ok(v) = std::env::var(key) { + let base = PathBuf::from(v); + out.push(base.join("lib64")); + out.push(base.join("lib")); + } + } + out +} + +fn candidate_real_paths() -> Vec { + let mut out = Vec::new(); + if let Ok(p) = std::env::var(ENV_REAL) { + out.push(PathBuf::from(p)); + } + if let Some(dir) = shim_directory() { + out.push(dir.join(REAL_BASENAME)); + } + for libdir in ascend_lib_dirs() { + out.push(libdir.join("libprofapi.so")); + } + out +} + +unsafe fn load_sym(handle: *mut c_void, name: &CStr) -> Option { + let sym = libc::dlsym(handle, name.as_ptr()); + if sym.is_null() { + None + } else { + Some(std::mem::transmute_copy(&sym)) + } +} + +unsafe fn open_real() -> Option { + for path in candidate_real_paths() { + if !path.is_file() { + continue; + } + let cpath = CString::new(path.as_os_str().as_bytes()).ok()?; + let handle = libc::dlopen(cpath.as_ptr(), libc::RTLD_NOW | libc::RTLD_LOCAL); + if handle.is_null() { + continue; + } + let api = RealApi { + register_callback: load_sym(handle, c"MsprofRegisterCallback")?, + reg_type_info: load_sym(handle, c"MsprofRegTypeInfo")?, + report_api: load_sym(handle, c"MsprofReportApi")?, + report_compact: load_sym(handle, c"MsprofReportCompactInfo")?, + report_additional: load_sym(handle, c"MsprofReportAdditionalInfo")?, + get_hash_id: load_sym(handle, c"MsprofGetHashId")?, + sys_cycle_time: load_sym(handle, c"MsprofSysCycleTime")?, + }; + log_once(&format!("forwarding to {}", path.display())); + return Some(RealLib { handle, api }); + } + None +} + +fn real_lib() -> Option>> { + let mut guard = INIT.lock(); + if guard.is_none() && !INIT_FAILED.load(Ordering::Relaxed) { + unsafe { + *guard = open_real(); + } + if guard.is_none() { + INIT_FAILED.store(true, Ordering::Relaxed); + if LOGGED_INIT + .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) + .is_ok() + { + eprintln!( + "[probing-hccl-shim] real libprofapi not found; MSProf forward disabled. \ + Set {ENV_REAL} or place {REAL_BASENAME} next to the shim." + ); + } + } + } + Some(guard) +} + +unsafe extern "C" fn stub_register(_: u32, _: ProfCommandHandle) -> i32 { + 0 +} +unsafe extern "C" fn stub_reg_type(_: u16, _: u32, _: *const c_char) -> i32 { + 0 +} +unsafe extern "C" fn stub_report_api(_: u32, _: *const c_void) -> i32 { + 0 +} +unsafe extern "C" fn stub_report_blob(_: u32, _: *const c_void, _: u32) -> i32 { + 0 +} +unsafe extern "C" fn stub_hash(_: *const c_char, _: u32) -> u64 { + 0 +} +unsafe extern "C" fn stub_time() -> u64 { + 0 +} + +pub fn forward_register(module_id: u32, handle: ProfCommandHandle) -> i32 { + if let Some(guard) = real_lib() { + if let Some(real) = guard.as_ref() { + return unsafe { (real.api.register_callback)(module_id, handle) }; + } + } + unsafe { stub_register(module_id, handle) } +} + +pub fn forward_reg_type_info(level: u16, type_id: u32, type_name: *const c_char) -> i32 { + if let Some(guard) = real_lib() { + if let Some(real) = guard.as_ref() { + return unsafe { (real.api.reg_type_info)(level, type_id, type_name) }; + } + } + unsafe { stub_reg_type(level, type_id, type_name) } +} + +pub fn forward_report_api(aging: u32, api: *const c_void) -> i32 { + if let Some(guard) = real_lib() { + if let Some(real) = guard.as_ref() { + return unsafe { (real.api.report_api)(aging, api) }; + } + } + unsafe { stub_report_api(aging, api) } +} + +pub fn forward_report_compact(aging: u32, data: *const c_void, len: u32) -> i32 { + if let Some(guard) = real_lib() { + if let Some(real) = guard.as_ref() { + return unsafe { (real.api.report_compact)(aging, data, len) }; + } + } + unsafe { stub_report_blob(aging, data, len) } +} + +pub fn forward_report_additional(aging: u32, data: *const c_void, len: u32) -> i32 { + if let Some(guard) = real_lib() { + if let Some(real) = guard.as_ref() { + return unsafe { (real.api.report_additional)(aging, data, len) }; + } + } + unsafe { stub_report_blob(aging, data, len) } +} + +pub fn forward_get_hash_id(hash_info: *const c_char, length: u32) -> u64 { + if hash_info.is_null() || length == 0 { + return 0; + } + if let Some(guard) = real_lib() { + if let Some(real) = guard.as_ref() { + return unsafe { (real.api.get_hash_id)(hash_info, length) }; + } + } + unsafe { stub_hash(hash_info, length) } +} + +pub fn forward_sys_cycle_time() -> u64 { + if let Some(guard) = real_lib() { + if let Some(real) = guard.as_ref() { + return unsafe { (real.api.sys_cycle_time)() }; + } + } + unsafe { stub_time() } +} diff --git a/probing/extensions/hccl-shim/src/lib.rs b/probing/extensions/hccl-shim/src/lib.rs new file mode 100644 index 00000000..6ce9c629 --- /dev/null +++ b/probing/extensions/hccl-shim/src/lib.rs @@ -0,0 +1,198 @@ +//! `libprofapi.so` shim — intercept MSProf, write `hccl.*` memtables, forward to CANN. + +#![allow(clippy::missing_safety_doc)] +#![cfg_attr(not(target_os = "linux"), allow(dead_code))] + +#[cfg(target_os = "linux")] +mod forward; +mod msprof; +mod names; +pub mod tables; +pub use tables::register_docs; +mod writer; + +#[cfg(not(target_os = "linux"))] +mod forward { + use std::os::raw::{c_char, c_void}; + type ProfCommandHandle = Option i32>; + pub fn forward_register(_: u32, _: ProfCommandHandle) -> i32 { + 0 + } + pub fn forward_reg_type_info(_: u16, _: u32, _: *const c_char) -> i32 { + 0 + } + pub fn forward_report_api(_: u32, _: *const c_void) -> i32 { + 0 + } + pub fn forward_report_compact(_: u32, _: *const c_void, _: u32) -> i32 { + 0 + } + pub fn forward_report_additional(_: u32, _: *const c_void, _: u32) -> i32 { + 0 + } + pub fn forward_get_hash_id(_: *const c_char, _: u32) -> u64 { + 0 + } + pub fn forward_sys_cycle_time() -> u64 { + 0 + } +} + +pub use tables::{ + collectives_schema, context_ids_schema, host_ops_schema, mc2_streams_schema, tasks_schema, + COLLECTIVES_FILE, CONTEXT_IDS_FILE, HOST_OPS_FILE, MC2_STREAMS_FILE, TASKS_FILE, +}; + +use std::os::raw::c_void; + +use once_cell::sync::Lazy; +use parking_lot::Mutex; + +use crate::msprof::{ + classify_additional, is_hccl_op_compact, read_additional_header, read_api, read_compact_header, + read_context_id_info, read_hccl_info, read_hccl_op_info, read_mc2_comm_info, AdditionalKind, + MSPROF_ADDITIONAL_HEADER, MSPROF_BLOB_HEADER, +}; +use crate::names::{lookup_type_id, preseed_hashes}; +use crate::writer::HcclWriter; + +static WRITER: Lazy> = Lazy::new(|| Mutex::new(HcclWriter::new())); + +type ProfCommandHandle = Option i32>; + +fn hash_fn(s: *const std::os::raw::c_char, l: u32) -> u64 { + forward::forward_get_hash_id(s, l) +} + +fn ensure_names() { + preseed_hashes(hash_fn); +} + +fn capture_api(aging: u32, ptr: *const c_void) { + if ptr.is_null() { + return; + } + ensure_names(); + if let Some(api) = read_api(ptr as *const u8, crate::msprof::MSPROF_API_SIZE as u32) { + WRITER.lock().record_api(aging, &api); + } +} + +fn capture_compact(_aging: u32, ptr: *const c_void, len: u32) { + if ptr.is_null() { + return; + } + ensure_names(); + let Some(header) = read_compact_header(ptr as *const u8, len) else { + return; + }; + let data_ptr = unsafe { (ptr as *const u8).add(MSPROF_BLOB_HEADER) }; + let type_name = lookup_type_id(header.type_id); + if is_hccl_op_compact(&type_name, header.data_len) { + if let Some(op) = read_hccl_op_info(data_ptr, header.data_len) { + WRITER.lock().record_compact_hccl_op(&header, &op); + } + } +} + +fn capture_additional(_aging: u32, ptr: *const c_void, len: u32) { + if ptr.is_null() { + return; + } + ensure_names(); + let Some(header) = read_additional_header(ptr as *const u8, len) else { + return; + }; + let data_ptr = unsafe { (ptr as *const u8).add(MSPROF_ADDITIONAL_HEADER) }; + let type_name = lookup_type_id(header.type_id); + match classify_additional(header.type_id, &type_name, header.data_len) { + AdditionalKind::HcclTask => { + if let Some(hccl) = read_hccl_info(data_ptr, header.data_len) { + WRITER + .lock() + .record_task(&header, &hccl, header.data_len as i32); + } + } + AdditionalKind::Mc2Comm => { + if let Some(mc2) = read_mc2_comm_info(data_ptr, header.data_len) { + WRITER.lock().record_mc2(&header, &mc2); + } + } + AdditionalKind::ContextId => { + if let Some(ctx) = read_context_id_info(data_ptr, header.data_len) { + WRITER.lock().record_context(&header, &ctx); + } + } + AdditionalKind::Unknown => {} + } +} + +#[cfg(target_os = "linux")] +mod export { + use std::os::raw::{c_char, c_void}; + + use super::*; + + #[no_mangle] + pub unsafe extern "C" fn MsprofRegisterCallback( + module_id: u32, + handle: ProfCommandHandle, + ) -> i32 { + forward::forward_register(module_id, handle) + } + + #[no_mangle] + pub unsafe extern "C" fn MsprofRegTypeInfo( + level: u16, + type_id: u32, + type_name: *const c_char, + ) -> i32 { + ensure_names(); + crate::names::register_type_info(type_id, type_name, hash_fn); + forward::forward_reg_type_info(level, type_id, type_name) + } + + #[no_mangle] + pub unsafe extern "C" fn MsprofReportApi(aging_flag: u32, api: *const c_void) -> i32 { + capture_api(aging_flag, api); + forward::forward_report_api(aging_flag, api) + } + + #[no_mangle] + pub unsafe extern "C" fn MsprofReportCompactInfo( + aging_flag: u32, + data: *const c_void, + length: u32, + ) -> i32 { + capture_compact(aging_flag, data, length); + forward::forward_report_compact(aging_flag, data, length) + } + + #[no_mangle] + pub unsafe extern "C" fn MsprofReportAdditionalInfo( + aging_flag: u32, + data: *const c_void, + length: u32, + ) -> i32 { + capture_additional(aging_flag, data, length); + forward::forward_report_additional(aging_flag, data, length) + } + + #[no_mangle] + pub unsafe extern "C" fn MsprofGetHashId(hash_info: *const c_char, length: u32) -> u64 { + ensure_names(); + let hash = forward::forward_get_hash_id(hash_info, length); + crate::names::register_hash_string(hash_info, length, hash); + hash + } + + #[no_mangle] + pub unsafe extern "C" fn MsprofSysCycleTime() -> u64 { + forward::forward_sys_cycle_time() + } +} + +#[cfg(not(target_os = "linux"))] +mod stub { + pub const BUILD_NOTE: &str = "probing-hccl-shim: libprofapi.so built on Linux only"; +} diff --git a/probing/extensions/hccl-shim/src/msprof.rs b/probing/extensions/hccl-shim/src/msprof.rs new file mode 100644 index 00000000..2bcfb574 --- /dev/null +++ b/probing/extensions/hccl-shim/src/msprof.rs @@ -0,0 +1,278 @@ +//! Best-effort layouts for CANN MSProf structs (toolchain/prof_api.h). +//! +//! Field order follows open HCCL usage in task_profiling.cc / profiling_manager.cc. +//! Validate with `sizeof` checks at runtime; CANN version drift may require updates. + +use std::mem::size_of; + +/// HCCL passes `sizeof(MsprofHcclInfo)` bytes in AdditionalInfo.data for task reports. +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct MsprofHcclInfo { + pub item_id: u64, + pub ccl_tag: u64, + pub group_name: u64, + pub local_rank: u32, + pub remote_rank: u32, + pub rank_size: u32, + pub workflow_mode: u32, + pub plane_id: u32, + pub ctx_id: u32, + pub notify_id: u64, + pub stage: u32, + pub role: u32, + pub _pad: u32, + pub duration_estimated: f64, + pub src_addr: u64, + pub dst_addr: u64, + pub data_size: u64, + pub op_type: u32, + pub data_type: u32, + pub link_type: u32, + pub transport_type: u32, + pub rdma_type: u32, +} + +pub const MSPROF_HCCL_INFO_MIN: usize = size_of::(); + +/// Observed HCCL MsprofApi initialization pattern. +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct MsprofApi { + pub level: u16, + pub reserve: u16, + pub type_id: u32, + pub thread_id: u32, + pub reserve2: u32, + pub begin_time: u64, + pub end_time: u64, + pub item_id: u64, +} + +pub const MSPROF_API_SIZE: usize = size_of::(); + +/// Header shared by MsprofAdditionalInfo and MsprofCompactInfo. +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct MsprofBlobHeader { + pub level: u32, + pub type_id: u32, + pub thread_id: u32, + pub data_len: u32, + pub time_stamp: u64, +} + +pub type MsprofAdditionalInfoHeader = MsprofBlobHeader; +pub type MsprofCompactInfoHeader = MsprofBlobHeader; + +pub const MSPROF_BLOB_HEADER: usize = size_of::(); +pub const MSPROF_ADDITIONAL_HEADER: usize = MSPROF_BLOB_HEADER; + +/// `CallMsprofReportHostHcclOpInfo` payload inside MsprofCompactInfo.data. +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct MsprofHCCLOPInfo { + pub relay: u32, + pub retry: u32, + pub data_type: u32, + pub _pad: u32, + pub alg_type: u64, + pub count: u64, + pub group_name: u64, +} + +pub const MSPROF_HCCL_OP_INFO_MIN: usize = size_of::(); + +/// `CallMsprofReportContextIdInfo` payload. +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct MsprofContextIdInfo { + pub ctx_id_num: u32, + pub ctx_ids: [u32; 2], +} + +pub const MSPROF_CONTEXT_ID_INFO: usize = size_of::(); + +/// Prefix of `ProfilingDeviceCommResInfo` from hccl_communicator_host.cc. +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct ProfilingDeviceCommResInfoHeader { + pub group_name: u64, + pub rank_size: u32, + pub rank_id: u32, + pub usr_rank_id: u32, + pub aicpu_kfc_stream_id: u32, + pub reserve: u32, +} + +pub const MSPROF_MC2_HEADER: usize = size_of::(); + +/// ProfTaskType::TASK_HCCL_INFO +pub const PROF_TASK_HCCL_INFO: u32 = 0; + +pub fn decode_plane(plane_id: u32) -> (i32, i32, i32) { + let id = plane_id as u64; + let plane_index = ((id >> 28) & 0xF) as i32; + let rank_size_plane = ((id >> 16) & 0xFFF) as i32; + let rank_in_plane = (id & 0xFFFF) as i32; + (plane_index, rank_in_plane, rank_size_plane) +} + +pub fn read_api(ptr: *const u8, len: u32) -> Option { + if ptr.is_null() || (len as usize) < MSPROF_API_SIZE { + return None; + } + Some(unsafe { std::ptr::read_unaligned(ptr as *const MsprofApi) }) +} + +pub fn read_blob_header(ptr: *const u8, len: u32) -> Option { + if ptr.is_null() || (len as usize) < MSPROF_BLOB_HEADER { + return None; + } + Some(unsafe { std::ptr::read_unaligned(ptr as *const MsprofBlobHeader) }) +} + +pub fn read_additional_header(ptr: *const u8, len: u32) -> Option { + read_blob_header(ptr, len) +} + +pub fn read_compact_header(ptr: *const u8, len: u32) -> Option { + read_blob_header(ptr, len) +} + +pub fn read_hccl_info(data: *const u8, data_len: u32) -> Option { + if data.is_null() || (data_len as usize) < MSPROF_HCCL_INFO_MIN { + return None; + } + Some(unsafe { std::ptr::read_unaligned(data as *const MsprofHcclInfo) }) +} + +pub fn read_hccl_op_info(data: *const u8, data_len: u32) -> Option { + if data.is_null() || (data_len as usize) < MSPROF_HCCL_OP_INFO_MIN { + return None; + } + Some(unsafe { std::ptr::read_unaligned(data as *const MsprofHCCLOPInfo) }) +} + +pub fn read_context_id_info(data: *const u8, data_len: u32) -> Option { + if data.is_null() || (data_len as usize) < MSPROF_CONTEXT_ID_INFO { + return None; + } + Some(unsafe { std::ptr::read_unaligned(data as *const MsprofContextIdInfo) }) +} + +pub struct Mc2CommInfo { + pub header: ProfilingDeviceCommResInfoHeader, + pub comm_stream_size: u32, + pub comm_stream_ids: Vec, +} + +pub fn read_mc2_comm_info(data: *const u8, data_len: u32) -> Option { + if data.is_null() || (data_len as usize) < MSPROF_MC2_HEADER + 4 { + return None; + } + let header = + unsafe { std::ptr::read_unaligned(data as *const ProfilingDeviceCommResInfoHeader) }; + let tail = data_len as usize - MSPROF_MC2_HEADER; + if tail < 4 { + return None; + } + let tail_ptr = unsafe { data.add(MSPROF_MC2_HEADER) }; + // HCCL sets commStreamSize after filling ids; layout is header + ids[] + commStreamSize + // or header + commStreamSize + ids[]. Accept either by checking plausibility. + let comm_stream_size_tail = + unsafe { std::ptr::read_unaligned(tail_ptr.add(tail - 4) as *const u32) }; + let comm_stream_size_head = unsafe { std::ptr::read_unaligned(tail_ptr as *const u32) }; + + let (comm_stream_size, id_offset) = if comm_stream_size_head > 0 && comm_stream_size_head <= 512 + { + (comm_stream_size_head, 4usize) + } else if comm_stream_size_tail > 0 && comm_stream_size_tail <= 512 { + (comm_stream_size_tail, 0usize) + } else { + (0u32, 4usize) + }; + + let ids_bytes = tail.saturating_sub(4); + let ids_ptr = unsafe { tail_ptr.add(id_offset) }; + let max_ids = ids_bytes / 4; + let n = if comm_stream_size > 0 { + (comm_stream_size as usize).min(max_ids) + } else { + max_ids + }; + let mut comm_stream_ids = Vec::with_capacity(n); + for i in 0..n { + let id = unsafe { std::ptr::read_unaligned(ids_ptr.add(i * 4) as *const u32) }; + comm_stream_ids.push(id); + } + let comm_stream_size = if comm_stream_size > 0 { + comm_stream_size + } else { + n as u32 + }; + + Some(Mc2CommInfo { + header, + comm_stream_size, + comm_stream_ids, + }) +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum AdditionalKind { + HcclTask, + Mc2Comm, + ContextId, + Unknown, +} + +pub fn classify_additional(type_id: u32, type_name: &str, data_len: u32) -> AdditionalKind { + if type_name == "mc2_comm_info" { + return AdditionalKind::Mc2Comm; + } + if type_name == "context_id_info" { + return AdditionalKind::ContextId; + } + if type_id == PROF_TASK_HCCL_INFO || data_len as usize >= MSPROF_HCCL_INFO_MIN { + return AdditionalKind::HcclTask; + } + if data_len as usize >= MSPROF_MC2_HEADER + 8 && data_len <= 4096 { + return AdditionalKind::Mc2Comm; + } + if data_len as usize >= 8 && data_len <= 64 { + return AdditionalKind::ContextId; + } + AdditionalKind::Unknown +} + +pub fn is_hccl_op_compact(type_name: &str, data_len: u32) -> bool { + type_name.contains("hccl_op") || data_len as usize == MSPROF_HCCL_OP_INFO_MIN +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn hccl_info_size_sane() { + const { + assert!(MSPROF_HCCL_INFO_MIN >= 96 && MSPROF_HCCL_INFO_MIN <= 256); + } + } + + #[test] + fn decode_plane_bits() { + // plane=3, rank_size=8, rank=5 -> (3<<28)|(8<<16)|5 + let plane_id = (3u64 << 28) | (8u64 << 16) | 5; + assert_eq!(decode_plane(plane_id as u32), (3, 5, 8)); + } + + #[test] + fn classify_task_by_len() { + assert_eq!( + classify_additional(99, "", MSPROF_HCCL_INFO_MIN as u32), + AdditionalKind::HcclTask + ); + } +} diff --git a/probing/extensions/hccl-shim/src/names.rs b/probing/extensions/hccl-shim/src/names.rs new file mode 100644 index 00000000..d92a8d0e --- /dev/null +++ b/probing/extensions/hccl-shim/src/names.rs @@ -0,0 +1,191 @@ +//! Resolve MSProf `item_id` hashes to human-readable names. + +use std::collections::HashMap; +use std::ffi::CStr; +use std::os::raw::c_char; +use std::sync::atomic::{AtomicBool, Ordering}; + +use once_cell::sync::Lazy; +use parking_lot::Mutex; + +static REGISTRY: Lazy> = Lazy::new(|| Mutex::new(NameRegistry::new())); +static PRESEEDED: AtomicBool = AtomicBool::new(false); + +/// ProfTaskType names from HCCL `PROF_TASK_OP_NAME`. +static KNOWN_TASK_NAMES: &[&str] = &[ + "hccl_info", + "Memcpy", + "RDMASend", + "Reduce_Inline", + "Reduce_TBE", + "Notify_Record", + "Notify_Wait", + "StageX_StepX", + "Flag", + "End", + "Multi_Thread", + "Launch_Ffts", + "AivKernel", + "Wait_Some", + "Coll_Recv_Lookup_Request", + "Coll_Recv_Update_Request", + "Isend_Update_Response", + "Isend_Lookup_Response", + "Update_Imrecv", + "Update_Global_Reduce", + "Lookup_Response_Memcpy", + "Lookup_Response_Isend", + "Share_Memory_Isend_Record", + "Abort_Self", + "Service_Cancel", + "Destroy_Resource", + "Event_Wait", + "unknown", +]; + +/// HcclCMDType names from HCCL `PROF_OP_NAME`. +static KNOWN_OP_NAMES: &[&str] = &[ + "hcom_invalid_", + "hcom_broadcast_", + "hcom_allReduce_", + "hcom_reduce_", + "hcom_send_", + "hcom_receive_", + "hcom_allGather_", + "hcom_reduceScatter_", + "hcom_scatter_", + "hcom_alltoall_", + "hcom_alltoallv_", + "hcom_allGatherv_", + "hcom_reduceScatterv_", + "hcom_alltoallvc_", + "hcom_batchSendRecv_", + "hccl_batchPut_", + "hccl_batchGet_", +]; + +struct NameRegistry { + hash_to_name: HashMap, + type_id_labels: HashMap, +} + +impl NameRegistry { + fn new() -> Self { + Self { + hash_to_name: HashMap::new(), + type_id_labels: HashMap::new(), + } + } + + fn insert_hash(&mut self, hash: u64, name: impl Into) { + if hash != 0 { + self.hash_to_name.entry(hash).or_insert(name.into()); + } + } + + fn lookup(&self, hash: u64) -> String { + self.hash_to_name.get(&hash).cloned().unwrap_or_default() + } + + fn label_for_type(&self, type_id: u32) -> String { + self.type_id_labels + .get(&type_id) + .cloned() + .unwrap_or_default() + } +} + +pub fn register_type_info( + type_id: u32, + type_name: *const c_char, + hash_fn: impl Fn(*const c_char, u32) -> u64, +) { + if type_name.is_null() { + return; + } + let Ok(name) = unsafe { CStr::from_ptr(type_name) }.to_str() else { + return; + }; + let mut reg = REGISTRY.lock(); + reg.type_id_labels + .entry(type_id) + .or_insert_with(|| name.to_string()); + let hash = hash_fn(type_name, name.len() as u32); + reg.insert_hash(hash, name); +} + +pub fn register_hash_string(hash_info: *const c_char, length: u32, hash: u64) { + if hash_info.is_null() || length == 0 || hash == 0 { + return; + } + let bytes = unsafe { std::slice::from_raw_parts(hash_info as *const u8, length as usize) }; + let Ok(name) = std::str::from_utf8(bytes) else { + return; + }; + REGISTRY.lock().insert_hash(hash, name); +} + +pub fn preseed_hashes(hash_fn: impl Fn(*const c_char, u32) -> u64) { + if PRESEEDED.swap(true, Ordering::Relaxed) { + return; + } + let mut reg = REGISTRY.lock(); + for name in KNOWN_TASK_NAMES.iter().chain(KNOWN_OP_NAMES.iter()) { + let c = std::ffi::CString::new(*name).expect("static name"); + let hash = hash_fn(c.as_ptr(), name.len() as u32); + reg.insert_hash(hash, *name); + } +} + +pub fn lookup_hash(hash: u64) -> String { + REGISTRY.lock().lookup(hash) +} + +pub fn lookup_type_id(type_id: u32) -> String { + REGISTRY.lock().label_for_type(type_id) +} + +/// Classify `MsprofReportApi` rows using level/type and resolved item name. +pub fn classify_api_event(level: u16, type_id: u32, item_id: u64) -> &'static str { + let name = lookup_hash(item_id); + if name.starts_with("hcom_") || name.starts_with("hccl_") { + return if level <= 1 { + "host_acl" + } else { + "host_hccl_op" + }; + } + if KNOWN_TASK_NAMES.contains(&name.as_str()) || name.ends_with("Kernel") { + return match type_id { + 2 => "task_slave", + _ => "task_master", + }; + } + match level { + 0 | 1 => "host_acl", + 2 => "node_launch", + 3 => match type_id { + 2 => "task_slave", + 1 => "task_master", + _ => "hccl_node", + }, + _ => "api_other", + } +} + +pub fn is_hccl_op_name(name: &str) -> bool { + name.starts_with("hcom_") || name.starts_with("hccl_") +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn classify_by_name_prefix() { + let mut reg = REGISTRY.lock(); + reg.insert_hash(42, "hcom_allReduce_"); + drop(reg); + assert_eq!(classify_api_event(3, 1, 42), "host_hccl_op"); + } +} diff --git a/probing/extensions/hccl-shim/src/tables.rs b/probing/extensions/hccl-shim/src/tables.rs new file mode 100644 index 00000000..46efaee1 --- /dev/null +++ b/probing/extensions/hccl-shim/src/tables.rs @@ -0,0 +1,184 @@ +//! Memtable schemas for HCCL MSProf intercept. + +use probing_memtable::docs; +use probing_memtable::{DType, Schema}; + +pub const HOST_OPS_FILE: &str = "hccl.host_ops"; +pub const TASKS_FILE: &str = "hccl.tasks"; +pub const COLLECTIVES_FILE: &str = "hccl.collectives"; +pub const MC2_STREAMS_FILE: &str = "hccl.mc2_streams"; +pub const CONTEXT_IDS_FILE: &str = "hccl.context_ids"; + +/// Register all HCCL table docs (safe to call from writer or Engine startup). +pub fn register_docs() { + docs::register_from_name(HOST_OPS_FILE, &host_ops_schema()); + docs::register_from_name(TASKS_FILE, &tasks_schema()); + docs::register_from_name(COLLECTIVES_FILE, &collectives_schema()); + docs::register_from_name(MC2_STREAMS_FILE, &mc2_streams_schema()); + docs::register_from_name(CONTEXT_IDS_FILE, &context_ids_schema()); +} + +pub fn host_ops_schema() -> Schema { + Schema::new() + .table_doc("HCCL MSProf Host API 时间线(集合通信 op、ACL、task master/slave)") + .col_doc("ts", DType::I64, "结束时间(CANN sys cycle)") + .col_doc("begin_ns", DType::I64, "开始时间") + .col_doc("end_ns", DType::I64, "结束时间") + .col_doc("duration_ns", DType::I64, "耗时 end - begin") + .col_doc("thread_id", DType::I32, "上报线程 id") + .col_doc("level", DType::I32, "MSProf level") + .col_doc("type_id", DType::I32, "MSProf type id") + .col_doc("item_id", DType::U64, "名称 hash") + .col_doc( + "item_name", + DType::Str, + "解码名称(hcom_allReduce_、Memcpy 等)", + ) + .col_doc( + "event_class", + DType::Str, + "host_hccl_op | task_master | task_slave | host_acl | node_launch", + ) + .col_doc("aging", DType::I32, "MSProf aging flag") +} + +pub fn tasks_schema() -> Schema { + Schema::new() + .table_doc("HCCL 设备侧 task 明细(MsprofHcclInfo L1)") + .col_doc("ts", DType::I64, "上报时间戳") + .col_doc("thread_id", DType::I32, "上报线程") + .col_doc("info_type", DType::I32, "AdditionalInfo type id") + .col_doc("info_level", DType::I32, "AdditionalInfo level") + .col_doc( + "info_type_name", + DType::Str, + "RegTypeInfo 注册名(如 hccl_info)", + ) + .col_doc("item_id", DType::U64, "task 类型 hash") + .col_doc("task_name", DType::Str, "task 类型名(Memcpy、RDMASend…)") + .col_doc("ccl_tag", DType::U64, "CCL tag hash") + .col_doc("group_name", DType::U64, "comm group hash") + .col_doc("local_rank", DType::I32, "本端 rank") + .col_doc("remote_rank", DType::I32, "对端 rank(-1 表示 N/A)") + .col_doc("rank_size", DType::I32, "通信组大小") + .col_doc("workflow_mode", DType::I32, "HCCL workflow mode enum") + .col_doc("plane_id", DType::I32, "原始 plane 编码") + .col_doc( + "plane_index", + DType::I32, + "plane 索引(plane_id bits 28-31)", + ) + .col_doc("rank_in_plane", DType::I32, "plane 内 rank(bits 0-15)") + .col_doc("rank_size_plane", DType::I32, "plane 宽度(bits 16-27)") + .col_doc("ctx_id", DType::I32, "FFTS context id") + .col_doc("notify_id", DType::U64, "notify 对象 id") + .col_doc("stage", DType::I32, "流水线 stage") + .col_doc("role", DType::I32, "task 角色 enum") + .col_doc("data_size", DType::U64, "传输字节数") + .col_doc("op_type", DType::I32, "操作类型 enum") + .col_doc("data_type", DType::I32, "数据类型 enum") + .col_doc("link_type", DType::I32, "链路类型") + .col_doc("transport_type", DType::I32, "传输类型") + .col_doc("rdma_type", DType::I32, "RDMA 类型") + .col_doc("duration_est_us", DType::F64, "估算耗时(微秒)") + .col_doc("payload_len", DType::I32, "AdditionalInfo payload 长度") +} + +pub fn collectives_schema() -> Schema { + Schema::new() + .table_doc("HCCL 集合通信元数据与 Host 耗时(row_source 区分 api/compact 行)") + .col_doc("ts", DType::I64, "事件时间") + .col_doc("thread_id", DType::I32, "上报线程") + .col_doc( + "row_source", + DType::Str, + "api=耗时行;compact=count/group/alg 参数行", + ) + .col_doc("begin_ns", DType::I64, "开始时间(api 行)") + .col_doc("end_ns", DType::I64, "结束时间(api 行)") + .col_doc("duration_ns", DType::I64, "耗时(api 行)") + .col_doc("op_hash", DType::U64, "算子名 hash(api 行)") + .col_doc("op_name", DType::Str, "算子名(api 行)") + .col_doc("group_hash", DType::U64, "comm group 名 hash(compact 行)") + .col_doc("alg_hash", DType::U64, "算法名 hash(compact 行)") + .col_doc("count", DType::U64, "元素个数(compact 行)") + .col_doc("data_type", DType::I32, "HcclDataType enum") + .col_doc("relay", DType::I32, "HCCL relay 标志") + .col_doc("retry", DType::I32, "HCCL retry 计数") + .col_doc( + "compact_type", + DType::I32, + "MsprofReportCompactInfo type id", + ) +} + +pub fn mc2_streams_schema() -> Schema { + Schema::new() + .table_doc("HCCL MC2 communicator stream 拓扑快照") + .col_doc("ts", DType::I64, "上报时间") + .col_doc("thread_id", DType::I32, "上报线程") + .col_doc("info_type", DType::I32, "MSProf AdditionalInfo type") + .col_doc("group_hash", DType::U64, "comm group 名 hash") + .col_doc("rank_size", DType::I32, "组内 rank 数") + .col_doc("rank_id", DType::I32, "rank id") + .col_doc("usr_rank_id", DType::I32, "用户可见 rank id") + .col_doc("aicpu_kfc_stream_id", DType::I32, "KFC stream id") + .col_doc("comm_stream_size", DType::I32, "comm stream 数量") + .col_doc("comm_stream_ids", DType::Str, "逗号分隔的 stream id 列表") +} + +pub fn context_ids_schema() -> Schema { + Schema::new() + .table_doc("HCCL FFTS context id 范围(dispatch 时上报)") + .col_doc("ts", DType::I64, "上报时间") + .col_doc("thread_id", DType::I32, "上报线程") + .col_doc("info_type", DType::I32, "MSProf AdditionalInfo type") + .col_doc("ctx_id_num", DType::I32, "context 数量(HCCL 固定报 2)") + .col_doc("ctx_id_min", DType::I32, "范围起点(通常 0)") + .col_doc("ctx_id_max", DType::I32, "范围终点(ctxIdMax)") +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn register_docs_populates_registry() { + register_docs(); + let rows = docs::snapshot(); + assert!(rows + .iter() + .any(|r| r.table_schema == "hccl" && r.table_name == "tasks")); + assert!(rows + .iter() + .any(|r| r.table_schema == "hccl" && r.table_name == "host_ops")); + } + + #[test] + fn tasks_schema_every_column_documented() { + let schema = tasks_schema(); + assert!(schema.table_doc.is_some()); + assert_eq!(schema.cols.len(), 29); + assert!( + schema.cols.iter().all(|c| c.doc.is_some()), + "missing docs: {:?}", + schema + .cols + .iter() + .filter(|c| c.doc.is_none()) + .map(|c| c.name.as_str()) + .collect::>() + ); + } + + #[test] + fn host_ops_event_class_doc() { + let schema = host_ops_schema(); + let event_class = schema + .cols + .iter() + .find(|c| c.name == "event_class") + .expect("event_class column"); + assert!(event_class.doc.as_ref().unwrap().contains("host_hccl_op")); + } +} diff --git a/probing/extensions/hccl-shim/src/writer.rs b/probing/extensions/hccl-shim/src/writer.rs new file mode 100644 index 00000000..c841b610 --- /dev/null +++ b/probing/extensions/hccl-shim/src/writer.rs @@ -0,0 +1,424 @@ +//! Mmap writer for intercepted MSProf events. + +use std::sync::atomic::{AtomicBool, Ordering}; + +use probing_memtable::discover::ExposedTable; +use probing_memtable::Value; + +use crate::msprof::{ + Mc2CommInfo, MsprofAdditionalInfoHeader, MsprofApi, MsprofCompactInfoHeader, + MsprofContextIdInfo, MsprofHCCLOPInfo, MsprofHcclInfo, +}; +use crate::names::{classify_api_event, is_hccl_op_name, lookup_hash, lookup_type_id}; +use crate::tables::{ + collectives_schema, context_ids_schema, host_ops_schema, mc2_streams_schema, tasks_schema, + COLLECTIVES_FILE, CONTEXT_IDS_FILE, HOST_OPS_FILE, MC2_STREAMS_FILE, TASKS_FILE, +}; + +const CHUNK_SIZE: u32 = 16 * 1024; +const NUM_CHUNKS: u32 = 32; + +macro_rules! open_table { + ($self:ident, $field:ident, $failed:ident, $logged:ident, $file:expr, $schema:expr) => {{ + if $self.$field.is_none() && !$self.$failed.load(Ordering::Relaxed) { + match ExposedTable::create($file, &$schema(), CHUNK_SIZE, NUM_CHUNKS) { + Ok(t) => $self.$field = Some(t), + Err(e) => { + $self.$failed.store(true, Ordering::Relaxed); + if $self + .$logged + .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) + .is_ok() + { + eprintln!("[probing-hccl-shim] failed to open {}: {e}", $file); + } + } + } + } + $self.$field.as_mut().ok_or(()) + }}; +} + +pub struct HcclWriter { + host_table: Option, + tasks_table: Option, + collectives_table: Option, + mc2_table: Option, + context_table: Option, + host_failed: AtomicBool, + tasks_failed: AtomicBool, + collectives_failed: AtomicBool, + mc2_failed: AtomicBool, + context_failed: AtomicBool, + logged_host: AtomicBool, + logged_tasks: AtomicBool, + logged_collectives: AtomicBool, + logged_mc2: AtomicBool, + logged_context: AtomicBool, +} + +impl HcclWriter { + pub fn new() -> Self { + Self { + host_table: None, + tasks_table: None, + collectives_table: None, + mc2_table: None, + context_table: None, + host_failed: AtomicBool::new(false), + tasks_failed: AtomicBool::new(false), + collectives_failed: AtomicBool::new(false), + mc2_failed: AtomicBool::new(false), + context_failed: AtomicBool::new(false), + logged_host: AtomicBool::new(false), + logged_tasks: AtomicBool::new(false), + logged_collectives: AtomicBool::new(false), + logged_mc2: AtomicBool::new(false), + logged_context: AtomicBool::new(false), + } + } + + fn open_host(&mut self) -> Result<&mut ExposedTable, ()> { + open_table!( + self, + host_table, + host_failed, + logged_host, + HOST_OPS_FILE, + host_ops_schema + ) + } + + fn open_tasks(&mut self) -> Result<&mut ExposedTable, ()> { + open_table!( + self, + tasks_table, + tasks_failed, + logged_tasks, + TASKS_FILE, + tasks_schema + ) + } + + fn open_collectives(&mut self) -> Result<&mut ExposedTable, ()> { + open_table!( + self, + collectives_table, + collectives_failed, + logged_collectives, + COLLECTIVES_FILE, + collectives_schema + ) + } + + fn open_mc2(&mut self) -> Result<&mut ExposedTable, ()> { + open_table!( + self, + mc2_table, + mc2_failed, + logged_mc2, + MC2_STREAMS_FILE, + mc2_streams_schema + ) + } + + fn open_context(&mut self) -> Result<&mut ExposedTable, ()> { + open_table!( + self, + context_table, + context_failed, + logged_context, + CONTEXT_IDS_FILE, + context_ids_schema + ) + } + + pub fn record_api(&mut self, aging: u32, api: &MsprofApi) { + let item_name = lookup_hash(api.item_id); + let event_class = classify_api_event(api.level, api.type_id, api.item_id); + let duration = api.end_time.saturating_sub(api.begin_time) as i64; + + if let Ok(table) = self.open_host() { + table.push_row(&[ + Value::I64(api.end_time as i64), + Value::I64(api.begin_time as i64), + Value::I64(api.end_time as i64), + Value::I64(duration), + Value::I32(api.thread_id as i32), + Value::I32(api.level as i32), + Value::I32(api.type_id as i32), + Value::U64(api.item_id), + Value::Str(&item_name), + Value::Str(event_class), + Value::I32(aging as i32), + ]); + } + + if event_class == "host_hccl_op" || is_hccl_op_name(&item_name) { + if let Ok(table) = self.open_collectives() { + table.push_row(&[ + Value::I64(api.end_time as i64), + Value::I32(api.thread_id as i32), + Value::Str("api"), + Value::I64(api.begin_time as i64), + Value::I64(api.end_time as i64), + Value::I64(duration), + Value::U64(api.item_id), + Value::Str(&item_name), + Value::U64(0), + Value::U64(0), + Value::U64(0), + Value::I32(-1), + Value::I32(0), + Value::I32(0), + Value::I32(0), + ]); + } + } + } + + pub fn record_compact_hccl_op( + &mut self, + header: &MsprofCompactInfoHeader, + op: &MsprofHCCLOPInfo, + ) { + let Ok(table) = self.open_collectives() else { + return; + }; + table.push_row(&[ + Value::I64(header.time_stamp as i64), + Value::I32(header.thread_id as i32), + Value::Str("compact"), + Value::I64(0), + Value::I64(0), + Value::I64(0), + Value::U64(0), + Value::Str(""), + Value::U64(op.group_name), + Value::U64(op.alg_type), + Value::U64(op.count), + Value::I32(op.data_type as i32), + Value::I32(op.relay as i32), + Value::I32(op.retry as i32), + Value::I32(header.type_id as i32), + ]); + } + + pub fn record_task( + &mut self, + header: &MsprofAdditionalInfoHeader, + hccl: &MsprofHcclInfo, + payload_len: i32, + ) { + let Ok(table) = self.open_tasks() else { + return; + }; + let type_name = lookup_type_id(header.type_id); + let task_name = lookup_hash(hccl.item_id); + let (plane_index, rank_in_plane, rank_size_plane) = + crate::msprof::decode_plane(hccl.plane_id); + table.push_row(&[ + Value::I64(header.time_stamp as i64), + Value::I32(header.thread_id as i32), + Value::I32(header.type_id as i32), + Value::I32(header.level as i32), + Value::Str(&type_name), + Value::U64(hccl.item_id), + Value::Str(&task_name), + Value::U64(hccl.ccl_tag), + Value::U64(hccl.group_name), + Value::I32(hccl.local_rank as i32), + Value::I32(hccl.remote_rank as i32), + Value::I32(hccl.rank_size as i32), + Value::I32(hccl.workflow_mode as i32), + Value::I32(hccl.plane_id as i32), + Value::I32(plane_index), + Value::I32(rank_in_plane), + Value::I32(rank_size_plane), + Value::I32(hccl.ctx_id as i32), + Value::U64(hccl.notify_id), + Value::I32(hccl.stage as i32), + Value::I32(hccl.role as i32), + Value::U64(hccl.data_size), + Value::I32(hccl.op_type as i32), + Value::I32(hccl.data_type as i32), + Value::I32(hccl.link_type as i32), + Value::I32(hccl.transport_type as i32), + Value::I32(hccl.rdma_type as i32), + Value::F64(hccl.duration_estimated), + Value::I32(payload_len), + ]); + } + + pub fn record_mc2(&mut self, header: &MsprofAdditionalInfoHeader, mc2: &Mc2CommInfo) { + let Ok(table) = self.open_mc2() else { + return; + }; + let ids = mc2 + .comm_stream_ids + .iter() + .map(|id| id.to_string()) + .collect::>() + .join(","); + table.push_row(&[ + Value::I64(header.time_stamp as i64), + Value::I32(header.thread_id as i32), + Value::I32(header.type_id as i32), + Value::U64(mc2.header.group_name), + Value::I32(mc2.header.rank_size as i32), + Value::I32(mc2.header.rank_id as i32), + Value::I32(mc2.header.usr_rank_id as i32), + Value::I32(mc2.header.aicpu_kfc_stream_id as i32), + Value::I32(mc2.comm_stream_size as i32), + Value::Str(&ids), + ]); + } + + pub fn record_context( + &mut self, + header: &MsprofAdditionalInfoHeader, + ctx: &MsprofContextIdInfo, + ) { + let Ok(table) = self.open_context() else { + return; + }; + let ctx_min = ctx.ctx_ids.first().copied().unwrap_or(0); + let ctx_max = if ctx.ctx_id_num >= 2 { + ctx.ctx_ids[1] + } else { + ctx_min + }; + table.push_row(&[ + Value::I64(header.time_stamp as i64), + Value::I32(header.thread_id as i32), + Value::I32(header.type_id as i32), + Value::I32(ctx.ctx_id_num as i32), + Value::I32(ctx_min as i32), + Value::I32(ctx_max as i32), + ]); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::msprof::{MSPROF_HCCL_INFO_MIN, MSPROF_HCCL_OP_INFO_MIN}; + use probing_memtable::discover::discover_in; + use std::fs; + + fn test_dir() -> std::path::PathBuf { + std::env::temp_dir().join(format!("probing_hccl_shim_test_{}", std::process::id())) + } + + #[test] + fn tasks_mmap_roundtrip() { + let base = test_dir(); + let _ = fs::remove_dir_all(&base); + fs::create_dir_all(&base).unwrap(); + std::env::set_var("PROBING_DATA_DIR", &base); + + let mut w = HcclWriter::new(); + let header = MsprofAdditionalInfoHeader { + level: 1, + type_id: 0, + thread_id: 42, + data_len: MSPROF_HCCL_INFO_MIN as u32, + time_stamp: 999, + }; + let info = MsprofHcclInfo { + item_id: 1, + plane_id: (2u64 << 28 | 4u64 << 16 | 7) as u32, + data_size: 4096, + remote_rank: 3, + ..Default::default() + }; + w.record_task(&header, &info, header.data_len as i32); + + let found = discover_in(&base).unwrap(); + assert!(found.iter().any(|t| t.name() == TASKS_FILE)); + let _ = fs::remove_dir_all(&base); + } + + #[test] + fn collectives_compact_roundtrip() { + let base = test_dir(); + let _ = fs::remove_dir_all(&base); + fs::create_dir_all(&base).unwrap(); + std::env::set_var("PROBING_DATA_DIR", &base); + + let mut w = HcclWriter::new(); + let header = MsprofCompactInfoHeader { + level: 2, + type_id: 100, + thread_id: 7, + data_len: MSPROF_HCCL_OP_INFO_MIN as u32, + time_stamp: 1234, + }; + let op = MsprofHCCLOPInfo { + count: 1024, + data_type: 1, + group_name: 99, + alg_type: 88, + ..Default::default() + }; + w.record_compact_hccl_op(&header, &op); + + let found = discover_in(&base).unwrap(); + assert!(found.iter().any(|t| t.name() == COLLECTIVES_FILE)); + let _ = fs::remove_dir_all(&base); + } + + #[test] + fn host_ops_schema_columns() { + let base = test_dir(); + let _ = fs::remove_dir_all(&base); + fs::create_dir_all(&base).unwrap(); + std::env::set_var("PROBING_DATA_DIR", &base); + + let mut w = HcclWriter::new(); + w.record_api( + 1, + &MsprofApi { + level: 3, + type_id: 1, + thread_id: 1, + begin_time: 100, + end_time: 250, + item_id: 42, + ..Default::default() + }, + ); + + let found = discover_in(&base).unwrap(); + assert!(found.iter().any(|t| t.name() == HOST_OPS_FILE)); + let _ = fs::remove_dir_all(&base); + } + + #[test] + fn context_ids_roundtrip() { + let base = test_dir(); + let _ = fs::remove_dir_all(&base); + fs::create_dir_all(&base).unwrap(); + std::env::set_var("PROBING_DATA_DIR", &base); + + let mut w = HcclWriter::new(); + let header = MsprofAdditionalInfoHeader { + level: 2, + type_id: 200, + thread_id: 1, + data_len: 12, + time_stamp: 500, + }; + w.record_context( + &header, + &MsprofContextIdInfo { + ctx_id_num: 2, + ctx_ids: [0, 15], + }, + ); + + let found = discover_in(&base).unwrap(); + assert!(found.iter().any(|t| t.name() == CONTEXT_IDS_FILE)); + let _ = fs::remove_dir_all(&base); + } +} diff --git a/probing/extensions/nccl-profiler-cdylib/Cargo.toml b/probing/extensions/nccl-profiler-cdylib/Cargo.toml new file mode 100644 index 00000000..c3cbc4d1 --- /dev/null +++ b/probing/extensions/nccl-profiler-cdylib/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "probing-nccl-profiler-cdylib" +description = "NCCL profiler plugin cdylib — same sources as probing-nccl-profiler" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true + +[lib] +name = "probing_nccl_profiler" +crate-type = ["cdylib"] +path = "../nccl-profiler/src/lib.rs" + +[dependencies] +probing-memtable = { path = "../../memtable" } + +once_cell = { workspace = true } +parking_lot = "0.12" +thiserror = { workspace = true } + +[target.'cfg(target_os = "linux")'.dependencies] +libc = "0.2" diff --git a/probing/extensions/nccl-profiler/Cargo.toml b/probing/extensions/nccl-profiler/Cargo.toml index 17298406..414514a1 100644 --- a/probing/extensions/nccl-profiler/Cargo.toml +++ b/probing/extensions/nccl-profiler/Cargo.toml @@ -8,7 +8,8 @@ license.workspace = true [lib] -crate-type = ["cdylib", "rlib"] +# rlib for workspace linking; cdylib plugin is probing-nccl-profiler-cdylib. +crate-type = ["rlib"] [dependencies] probing-memtable = { path = "../../memtable" } diff --git a/probing/extensions/nccl-profiler/src/lib.rs b/probing/extensions/nccl-profiler/src/lib.rs index 739ccaa5..d52f3cec 100644 --- a/probing/extensions/nccl-profiler/src/lib.rs +++ b/probing/extensions/nccl-profiler/src/lib.rs @@ -16,7 +16,7 @@ mod state; #[cfg(target_os = "linux")] mod plugin; -pub use tables::{net_qp_schema, proxy_ops_schema, NET_QP_FILE, PROXY_OPS_FILE}; +pub use tables::{net_qp_schema, proxy_ops_schema, register_docs, NET_QP_FILE, PROXY_OPS_FILE}; #[cfg(target_os = "linux")] mod export { diff --git a/probing/extensions/nccl-profiler/src/tables.rs b/probing/extensions/nccl-profiler/src/tables.rs index 06282783..37feec5a 100644 --- a/probing/extensions/nccl-profiler/src/tables.rs +++ b/probing/extensions/nccl-profiler/src/tables.rs @@ -1,39 +1,87 @@ //! Memtable schemas for `nccl.proxy_ops` and `nccl.net_qp`. +use probing_memtable::docs; use probing_memtable::{DType, Schema}; pub const PROXY_OPS_FILE: &str = "nccl.proxy_ops"; pub const NET_QP_FILE: &str = "nccl.net_qp"; +/// Register all NCCL table docs (safe to call from writer or Engine startup). +pub fn register_docs() { + docs::register_from_name(PROXY_OPS_FILE, &proxy_ops_schema()); + docs::register_from_name(NET_QP_FILE, &net_qp_schema()); +} + pub fn proxy_ops_schema() -> Schema { Schema::new() - .col("ts", DType::I64) - .col("rank", DType::I32) - .col("tp_rank", DType::I32) - .col("pp_rank", DType::I32) - .col("dp_rank", DType::I32) - .col("comm_hash", DType::U64) - .col("coll_func", DType::Str) - .col("seq", DType::U64) - .col("channel_id", DType::I32) - .col("peer", DType::I32) - .col("is_send", DType::I32) - .col("n_steps", DType::I32) - .col("trans_bytes", DType::U64) - .col("send_gpu_wait_ns", DType::I64) - .col("send_wait_ns", DType::I64) - .col("recv_wait_ns", DType::I64) - .col("recv_flush_wait_ns", DType::I64) + .table_doc("NCCL profiler plugin proxy-op wait 分解(culprit / victim 归因)") + .col_doc("ts", DType::I64, "事件时间戳(纳秒)") + .col_doc("rank", DType::I32, "torch.distributed rank") + .col_doc("tp_rank", DType::I32, "张量并行 rank(未知 -1)") + .col_doc("pp_rank", DType::I32, "流水线并行 rank(未知 -1)") + .col_doc("dp_rank", DType::I32, "数据并行 rank(未知 -1)") + .col_doc("comm_hash", DType::U64, "NCCL communicator hash") + .col_doc( + "coll_func", + DType::Str, + "集合通信名(AllReduce、AllGather…)", + ) + .col_doc("seq", DType::U64, "collective 序号") + .col_doc("channel_id", DType::I32, "NCCL channel id") + .col_doc("peer", DType::I32, "对端 rank") + .col_doc("is_send", DType::I32, "1=send proxy,0=recv proxy") + .col_doc("n_steps", DType::I32, "聚合的 ProxyStep 数") + .col_doc("trans_bytes", DType::U64, "传输字节数") + .col_doc( + "send_gpu_wait_ns", + DType::I64, + "Culprit 信号 — 本地 GPU 未就绪发送", + ) + .col_doc("send_wait_ns", DType::I64, "发送侧网络等待") + .col_doc("recv_wait_ns", DType::I64, "Victim 信号 — 等待对端数据") + .col_doc("recv_flush_wait_ns", DType::I64, "接收 flush 等待") } pub fn net_qp_schema() -> Schema { Schema::new() - .col("ts", DType::I64) - .col("rank", DType::I32) - .col("device", DType::I32) - .col("qp_num", DType::I32) - .col("wr_id", DType::U64) - .col("opcode", DType::I32) - .col("length", DType::U64) - .col("duration_ns", DType::I64) + .table_doc("NCCL NetPlugin IB QP 完成耗时(可选 mask bit 128)") + .col_doc("ts", DType::I64, "事件时间戳(纳秒)") + .col_doc("rank", DType::I32, "torch.distributed rank") + .col_doc("device", DType::I32, "IB 设备索引") + .col_doc("qp_num", DType::I32, "Queue Pair 号") + .col_doc("wr_id", DType::U64, "Work Request id") + .col_doc("opcode", DType::I32, "IB opcode") + .col_doc("length", DType::U64, "传输长度(字节)") + .col_doc("duration_ns", DType::I64, "QP 完成耗时(纳秒)") +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn register_docs_populates_registry() { + register_docs(); + let rows = docs::snapshot(); + assert!(rows + .iter() + .any(|r| r.table_schema == "nccl" && r.table_name == "proxy_ops")); + assert!(rows + .iter() + .any(|r| r.table_schema == "nccl" && r.table_name == "net_qp")); + } + + #[test] + fn proxy_ops_culprit_columns_documented() { + let schema = proxy_ops_schema(); + assert!(schema.table_doc.is_some()); + for name in ["send_gpu_wait_ns", "recv_wait_ns"] { + let col = schema + .cols + .iter() + .find(|c| c.name == name) + .unwrap_or_else(|| panic!("missing column {name}")); + assert!(col.doc.is_some(), "{name} should have doc"); + } + } } diff --git a/probing/extensions/python/src/extensions/python.rs b/probing/extensions/python/src/extensions/python.rs index 45ea7b51..f3dd9d18 100644 --- a/probing/extensions/python/src/extensions/python.rs +++ b/probing/extensions/python/src/extensions/python.rs @@ -15,8 +15,8 @@ use pyo3::prelude::*; use pyo3::types::{PyAnyMethods, PyString}; use pyo3::Python; -pub use exttbls::ExternalTable; pub use exttbls::PyExternalTableConfig; +pub use exttbls::{register_table_docs, ExternalTable}; pub use tbls::PythonProbeDataSource; use crate::features::stack_tracer::{SignalTracer, StackTracer}; diff --git a/probing/extensions/python/src/extensions/python/exttbls.rs b/probing/extensions/python/src/extensions/python/exttbls.rs index e9b08040..3b55867e 100644 --- a/probing/extensions/python/src/extensions/python/exttbls.rs +++ b/probing/extensions/python/src/extensions/python/exttbls.rs @@ -18,6 +18,7 @@ use std::sync::{Arc, Mutex}; use crate::features::native_bridge::with_detached_native; use once_cell::sync::Lazy; use probing_memtable::discover::ExposedTable; +use probing_memtable::docs; use probing_memtable::{DType, Schema as MtSchema, Value}; use probing_proto::prelude::Ele; use pyo3::prelude::*; @@ -49,17 +50,47 @@ fn uses_timestamp_column(name: &str) -> bool { !name.contains('.') } -fn build_schema(name: &str, columns: &[String], dtypes: &[DType]) -> MtSchema { +fn build_schema_with_docs( + name: &str, + columns: &[String], + dtypes: &[DType], + table_doc: Option<&str>, + column_docs: &HashMap, +) -> MtSchema { let mut schema = MtSchema::new(); + if let Some(doc) = table_doc { + schema = schema.table_doc(doc); + } if uses_timestamp_column(name) { schema = schema.col("timestamp", DType::I64); } for (col, dt) in columns.iter().zip(dtypes.iter()) { - schema = schema.col(col, *dt); + schema = if let Some(doc) = column_docs.get(col) { + schema.col_doc(col, *dt, doc.as_str()) + } else { + schema.col(col, *dt) + }; } schema } +fn register_python_table_docs( + name: &str, + table_doc: Option<&str>, + column_docs: &HashMap, +) { + let (table_schema, table_name) = if let Some((schema, table)) = name.split_once('.') { + (schema.to_string(), table.to_string()) + } else { + (EXTERN_TABLE_SCHEMA.to_string(), name.to_string()) + }; + let pairs: Vec<(String, String)> = column_docs + .iter() + .map(|(k, v)| (k.clone(), v.clone())) + .collect(); + docs::register_column_docs(&table_schema, &table_name, table_doc, &pairs); +} + /// Ring layout: fixed chunk count; chunk byte size derives from capacity. const NUM_CHUNKS: u32 = 8; const MIN_CHUNK_BYTES: usize = 4 * 1024; @@ -212,16 +243,29 @@ pub struct ExternBacking { capacity_bytes: usize, dtypes: Vec, table: Option, + table_doc: Option, + column_docs: HashMap, } impl ExternBacking { - fn new(name: &str, columns: Vec, capacity_bytes: usize) -> Self { + fn new( + name: &str, + columns: Vec, + capacity_bytes: usize, + table_doc: Option, + column_docs: HashMap, + ) -> Self { + if !column_docs.is_empty() || table_doc.is_some() { + register_python_table_docs(name, table_doc.as_deref(), &column_docs); + } Self { name: name.to_string(), columns, capacity_bytes, dtypes: vec![], table: None, + table_doc, + column_docs, } } @@ -230,7 +274,13 @@ impl ExternBacking { return Ok(()); } self.dtypes = vec![DType::Str; self.columns.len()]; - let schema = build_schema(&self.name, &self.columns, &self.dtypes); + let schema = build_schema_with_docs( + &self.name, + &self.columns, + &self.dtypes, + self.table_doc.as_deref(), + &self.column_docs, + ); let chunk_bytes = ring_chunk_bytes(self.capacity_bytes); let filename = mmap_basename(&self.name); let table = ExposedTable::create(&filename, &schema, chunk_bytes, NUM_CHUNKS) @@ -254,7 +304,13 @@ impl ExternBacking { self.dtypes.clear(); let dtypes: Vec = first_row.iter().map(ele_dtype).collect(); - let schema = build_schema(&self.name, &self.columns, &dtypes); + let schema = build_schema_with_docs( + &self.name, + &self.columns, + &dtypes, + self.table_doc.as_deref(), + &self.column_docs, + ); let chunk_bytes = ring_chunk_bytes(self.capacity_bytes); let filename = mmap_basename(&self.name); let table = ExposedTable::create(&filename, &schema, chunk_bytes, NUM_CHUNKS) @@ -370,9 +426,17 @@ impl ExternalTable { columns: Vec, discard_threshold: usize, discard_strategy: &str, + table_doc: Option, + column_docs: HashMap, ) -> Arc> { let capacity = ring_capacity_bytes(discard_threshold, discard_strategy); - let backing = Arc::new(Mutex::new(ExternBacking::new(name, columns, capacity))); + let backing = Arc::new(Mutex::new(ExternBacking::new( + name, + columns, + capacity, + table_doc, + column_docs, + ))); backing .lock() .expect("extern table lock") @@ -385,20 +449,28 @@ impl ExternalTable { #[pymethods] impl ExternalTable { #[new] - #[pyo3(signature = (name, columns, chunk_size = 10000, discard_threshold = 20_000_000, discard_strategy = "BaseMemorySize".to_string()))] + #[pyo3(signature = (name, columns, chunk_size = 10000, discard_threshold = 20_000_000, discard_strategy = "BaseMemorySize".to_string(), table_doc = None, column_docs = None))] fn new( name: &str, columns: Vec, chunk_size: usize, discard_threshold: usize, discard_strategy: String, + table_doc: Option, + column_docs: Option>, ) -> Self { let _ = chunk_size; // ring chunking is byte-based; kept for API compat let name = name.to_string(); with_detached_native(move || { let ncolumn = columns.len(); - let backing = - Self::create_backing(&name, columns, discard_threshold, &discard_strategy); + let backing = Self::create_backing( + &name, + columns, + discard_threshold, + &discard_strategy, + table_doc, + column_docs.unwrap_or_default(), + ); EXTERN_TABLES.lock().unwrap().insert(name, backing.clone()); ExternalTable(backing, ncolumn) }) @@ -421,7 +493,8 @@ impl ExternalTable { } #[classmethod] - #[pyo3(signature = (name, columns, chunk_size = 10000, discard_threshold = 20_000_000, discard_strategy = "BaseMemorySize".to_string()))] + #[pyo3(signature = (name, columns, chunk_size = 10000, discard_threshold = 20_000_000, discard_strategy = "BaseMemorySize".to_string(), table_doc = None, column_docs = None))] + #[allow(clippy::too_many_arguments)] fn get_or_create( _cls: &Bound<'_, PyType>, name: &str, @@ -429,6 +502,8 @@ impl ExternalTable { chunk_size: usize, discard_threshold: usize, discard_strategy: String, + table_doc: Option, + column_docs: Option>, ) -> PyResult { let _ = chunk_size; let name = name.to_string(); @@ -439,8 +514,14 @@ impl ExternalTable { Ok(ExternalTable(backing.clone(), ncolumn)) } else { let ncolumn = columns.len(); - let backing = - Self::create_backing(&name, columns, discard_threshold, &discard_strategy); + let backing = Self::create_backing( + &name, + columns, + discard_threshold, + &discard_strategy, + table_doc, + column_docs.unwrap_or_default(), + ); binding.insert(name, backing.clone()); Ok(ExternalTable(backing, ncolumn)) } @@ -525,6 +606,43 @@ impl ExternalTable { } } +/// Register table/column documentation for SQL `DESCRIBE` (without creating a table). +#[pyfunction] +#[pyo3(signature = (qualified_name, table_doc=None, column_docs=None))] +pub fn register_table_docs( + qualified_name: &str, + table_doc: Option<&str>, + column_docs: Option>, +) -> PyResult<()> { + register_python_table_docs(qualified_name, table_doc, &column_docs.unwrap_or_default()); + Ok(()) +} + +#[cfg(test)] +mod register_docs_tests { + use super::*; + use probing_memtable::docs; + + #[test] + fn register_table_docs_exposes_python_schema() { + let table = format!("py_doc_test_{}", std::process::id()); + let qualified = format!("python.{table}"); + let mut column_docs = HashMap::new(); + column_docs.insert("latency_ms".to_string(), "latency in ms".to_string()); + register_table_docs(&qualified, Some("Python doc test table"), Some(column_docs)).unwrap(); + let rows = docs::snapshot(); + let row = rows + .iter() + .find(|r| r.table_schema == "python" && r.table_name == table) + .expect("python table docs"); + assert_eq!(row.description.as_deref(), Some("Python doc test table")); + assert_eq!( + row.columns.get("latency_ms"), + Some(&"latency in ms".to_string()) + ); + } +} + #[cfg(test)] mod tests { use super::*; @@ -608,6 +726,8 @@ if not hasattr(probing, "_made_{name}"): 10000, 20000000, "BaseMemorySize".to_string(), + None, + None, ); assert_eq!(table.names(), vec!["a", "b"]); } @@ -662,6 +782,8 @@ probing.ExternalTable.drop("table_to_drop") 10000, 1_000_000, "BaseMemorySize".to_string(), + None, + None, ); Python::attach(|py| { let vals: Vec> = vec![ @@ -689,6 +811,8 @@ probing.ExternalTable.drop("table_to_drop") 10000, 1_000_000, "BaseMemorySize".to_string(), + None, + None, ); Python::attach(|py| { let vals: Vec> = vec![1i64.into_pyobject(py).unwrap().into_any().unbind()]; diff --git a/probing/extensions/python/src/features/tracing.rs b/probing/extensions/python/src/features/tracing.rs index caf42375..feb36397 100644 --- a/probing/extensions/python/src/features/tracing.rs +++ b/probing/extensions/python/src/features/tracing.rs @@ -6,7 +6,7 @@ use std::sync::{Arc, Mutex}; use probing_core::trace::Span as RawSpan; use probing_core::trace::{ - advance_local_step, attr, set_step_bucket_size, step_snapshot, sync_local_step, Attribute, + advance_micro_step, attr, set_micro_batches, step_snapshot, sync_micro_step, Attribute, Event as RawEvent, SpanStatus, StepSnapshot, Timestamp, }; @@ -80,9 +80,9 @@ impl Span { impl Span { /// Creates a new root span (starts a new trace). #[new] - #[pyo3(signature = (name, *, kind=None, location=None))] - fn new(name: String, kind: Option, location: Option) -> Self { - let span = RawSpan::new_root(name, kind.as_deref(), location.as_deref()); + #[pyo3(signature = (name, *, phase=None, location=None))] + fn new(name: String, phase: Option, location: Option) -> Self { + let span = RawSpan::new_root(name, phase.as_deref(), location.as_deref()); Span { inner: Arc::new(Mutex::new(span)), } @@ -90,15 +90,15 @@ impl Span { /// Creates a new child span from a parent span. #[staticmethod] - #[pyo3(signature = (parent, name, *, kind=None, location=None))] + #[pyo3(signature = (parent, name, *, phase=None, location=None))] fn new_child( parent: &Bound<'_, Span>, name: String, - kind: Option, + phase: Option, location: Option, ) -> Self { let span = parent.borrow().with_inner(|parent_span| { - RawSpan::new_child(parent_span, name, kind.as_deref(), location.as_deref()) + RawSpan::new_child(parent_span, name, phase.as_deref(), location.as_deref()) }); Span { inner: Arc::new(Mutex::new(span)), @@ -135,10 +135,10 @@ impl Span { self.with_inner(|s| s.name.clone()) } - /// Gets the span kind. + /// Gets the span training phase (forward / backward / optimizer). #[getter] - fn kind(&self) -> Option { - self.with_inner(|s| s.kind.clone()) + fn phase(&self) -> Option { + self.with_inner(|s| s.phase.clone()) } /// Gets the span status. @@ -262,7 +262,7 @@ impl Span { "parent_id" => return optional_into_py(py, self.parent_id()), "thread_id" => return Ok(self.thread_id().into_bound_py_any(py)?.into()), "name" => return Ok(self.name().into_bound_py_any(py)?.into()), - "kind" => return optional_into_py(py, self.kind()), + "phase" => return optional_into_py(py, self.phase()), "status" => return Ok(self.status().into_bound_py_any(py)?.into()), "is_ended" => return Ok(self.is_ended().into_bound_py_any(py)?.into()), "duration" => return optional_into_py(py, self.duration()), @@ -366,15 +366,15 @@ fn active_span_for_events(py: Python) -> PyResult>> { }) } -/// Return the innermost active span whose kind matches ``kind`` (or None). +/// Return the innermost active span whose phase matches ``phase`` (or None). #[pyfunction] -fn active_span_by_kind(py: Python, kind: String) -> PyResult>> { +fn active_span_by_phase(py: Python, phase: String) -> PyResult>> { SPAN_STACK.with(|stack| { let stack = stack.borrow(); for obj in stack.iter().rev() { let bound = obj.bind(py); if let Ok(span) = bound.cast::() { - if span.borrow().kind().as_deref() == Some(kind.as_str()) { + if span.borrow().phase().as_deref() == Some(phase.as_str()) { return Ok(Some(obj.clone_ref(py))); } } @@ -383,15 +383,41 @@ fn active_span_by_kind(py: Python, kind: String) -> PyResult>> }) } +/// Innermost active training phase on the span stack (``forward`` / ``backward`` / ``optimizer``). +#[pyfunction] +fn active_training_phase(py: Python) -> PyResult> { + SPAN_STACK.with(|stack| { + let stack = stack.borrow(); + for obj in stack.iter().rev() { + let bound = obj.bind(py); + if let Ok(span) = bound.cast::() { + let borrowed = span.borrow(); + if borrowed.is_ended() { + continue; + } + if let Some(phase) = borrowed.phase() { + match phase.as_str() { + "forward" | "backward" | "optimizer" => return Ok(Some(phase)), + _ => {} + } + } + } + } + Ok(None) + }) +} + #[pyclass(from_py_object)] #[derive(Clone, Copy)] struct PyStepSnapshot { + #[pyo3(get)] + micro_step: u64, #[pyo3(get)] local_step: u64, #[pyo3(get)] global_step: u64, #[pyo3(get)] - bucket_size: u64, + micro_batches: u64, #[pyo3(get)] rank: i64, #[pyo3(get)] @@ -401,9 +427,10 @@ struct PyStepSnapshot { impl From for PyStepSnapshot { fn from(s: StepSnapshot) -> Self { Self { + micro_step: s.micro_step, local_step: s.local_step, global_step: s.global_step, - bucket_size: s.bucket_size, + micro_batches: s.micro_batches, rank: s.rank, world_size: s.world_size, } @@ -416,33 +443,33 @@ fn py_step_snapshot() -> PyStepSnapshot { } #[pyfunction] -fn py_sync_local_step(step: u64) -> PyStepSnapshot { - sync_local_step(step).into() +fn py_sync_micro_step(step: u64) -> PyStepSnapshot { + sync_micro_step(step).into() } #[pyfunction] -fn py_advance_local_step() -> PyStepSnapshot { - advance_local_step().into() +fn py_advance_micro_step() -> PyStepSnapshot { + advance_micro_step().into() } #[pyfunction] -fn py_set_step_bucket_size(bucket: u64) { - set_step_bucket_size(bucket); +fn py_set_micro_batches(micro_batches: u64) { + set_micro_batches(micro_batches); } #[pyfunction] -fn py_current_local_step() -> u64 { - probing_core::trace::current_local_step() +fn py_current_micro_step() -> u64 { + probing_core::trace::current_micro_step() } /// Internal function to create a span - called by Python wrapper. /// This is a low-level function that directly creates a span. #[pyfunction] -#[pyo3(signature = (name, *, kind=None, location=None))] +#[pyo3(signature = (name, *, phase=None, location=None))] fn _span_raw( py: Python, name: String, - kind: Option, + phase: Option, location: Option, ) -> PyResult { let parent = SPAN_STACK.with(|stack| { @@ -453,9 +480,9 @@ fn _span_raw( let span = if let Some(parent) = parent { let parent_obj = parent.bind(py); let parent_span = parent_obj.cast::()?; - Span::new_child(parent_span, name, kind, location) + Span::new_child(parent_span, name, phase, location) } else { - Span::new(name, kind, location) + Span::new(name, phase, location) }; Ok(span) @@ -521,12 +548,13 @@ pub fn register_tracing_functions(module: &Bound<'_, PyModule>) -> PyResult<()> module.add_function(wrap_pyfunction!(_span_raw, module)?)?; module.add_function(wrap_pyfunction!(current_span, module)?)?; module.add_function(wrap_pyfunction!(active_span_for_events, module)?)?; - module.add_function(wrap_pyfunction!(active_span_by_kind, module)?)?; + module.add_function(wrap_pyfunction!(active_span_by_phase, module)?)?; + module.add_function(wrap_pyfunction!(active_training_phase, module)?)?; module.add_function(wrap_pyfunction!(py_step_snapshot, module)?)?; - module.add_function(wrap_pyfunction!(py_sync_local_step, module)?)?; - module.add_function(wrap_pyfunction!(py_advance_local_step, module)?)?; - module.add_function(wrap_pyfunction!(py_set_step_bucket_size, module)?)?; - module.add_function(wrap_pyfunction!(py_current_local_step, module)?)?; + module.add_function(wrap_pyfunction!(py_sync_micro_step, module)?)?; + module.add_function(wrap_pyfunction!(py_advance_micro_step, module)?)?; + module.add_function(wrap_pyfunction!(py_set_micro_batches, module)?)?; + module.add_function(wrap_pyfunction!(py_current_micro_step, module)?)?; Ok(()) } diff --git a/probing/memtable/src/discover.rs b/probing/memtable/src/discover.rs index 4197eca0..4457eadb 100644 --- a/probing/memtable/src/discover.rs +++ b/probing/memtable/src/discover.rs @@ -131,9 +131,9 @@ impl ExposedTable { chunk_size: u32, num_chunks: u32, ) -> io::Result { - Ok(Self { - inner: MemTable::shared_in(base_dir, name, schema, chunk_size, num_chunks)?, - }) + let inner = MemTable::shared_in(base_dir, name, schema, chunk_size, num_chunks)?; + crate::docs::register_from_name(name, schema); + Ok(Self { inner }) } pub fn as_bytes(&self) -> &[u8] { @@ -475,6 +475,44 @@ mod tests { dir } + #[test] + fn exposed_table_create_registers_docs() { + let dir = test_dir(); + let table = format!("registry_create_{}", std::process::id()); + let qualified = format!("unittest.{table}"); + let schema = + Schema::new() + .table_doc("created via mmap") + .col_doc("x", DType::I32, "int column"); + ExposedTable::create_in(&dir, &qualified, &schema, 1024, 2).unwrap(); + let rows = crate::docs::snapshot(); + assert!(rows.iter().any(|r| { + r.table_schema == "unittest" + && r.table_name == table + && r.description.as_deref() == Some("created via mmap") + && r.columns.get("x") == Some(&"int column".to_string()) + })); + let _ = fs::remove_dir_all(&dir); + } + + #[test] + fn exposed_table_undotted_create_uses_memtable_schema() { + let dir = test_dir(); + let table = format!("undotted_{}", std::process::id()); + let schema = + Schema::new() + .table_doc("plain memtable file") + .col_doc("v", DType::F64, "value"); + ExposedTable::create_in(&dir, &table, &schema, 1024, 2).unwrap(); + let rows = crate::docs::snapshot(); + assert!(rows.iter().any(|r| { + r.table_schema == "memtable" + && r.table_name == table + && r.description.as_deref() == Some("plain memtable file") + })); + let _ = fs::remove_dir_all(&dir); + } + #[test] fn exposed_table_roundtrip() { let dir = test_dir(); diff --git a/probing/memtable/src/docs.rs b/probing/memtable/src/docs.rs new file mode 100644 index 00000000..a0e4a052 --- /dev/null +++ b/probing/memtable/src/docs.rs @@ -0,0 +1,180 @@ +//! In-process registry for table/column documentation attached to [`Schema`]. +//! +//! Docs are **not** persisted in mmap headers; they live only in Rust (or are +//! registered from Python) and are consumed by the probing Engine semantic catalog. + +use std::collections::HashMap; +use std::sync::{Mutex, OnceLock}; + +use crate::schema::Schema; + +/// Documentation for one SQL table (`schema.table`). +#[derive(Debug, Clone, Default)] +pub struct TableDocs { + pub table_schema: String, + pub table_name: String, + pub description: Option, + pub columns: HashMap, +} + +static REGISTRY: OnceLock>> = OnceLock::new(); + +fn registry() -> &'static Mutex> { + REGISTRY.get_or_init(|| Mutex::new(HashMap::new())) +} + +fn qualified_key(table_schema: &str, table_name: &str) -> String { + format!("{table_schema}.{table_name}") +} + +/// Register table/column docs for a qualified SQL name (`hccl.host_ops`, `python.foo`, …). +pub fn register_qualified(table_schema: &str, table_name: &str, schema: &Schema) { + let key = qualified_key(table_schema, table_name); + let mut entry = TableDocs { + table_schema: table_schema.to_string(), + table_name: table_name.to_string(), + description: schema.table_doc.clone(), + columns: HashMap::new(), + }; + for col in &schema.cols { + if let Some(doc) = &col.doc { + entry.columns.insert(col.name.clone(), doc.clone()); + } + } + + let mut reg = registry().lock().expect("table doc registry lock"); + reg.insert(key, entry); +} + +/// Register docs from an on-disk mmap basename (`hccl.host_ops` or undotted `metrics`). +pub fn register_from_name(name: &str, schema: &Schema) { + if let Some((table_schema, table_name)) = name.split_once('.') { + register_qualified(table_schema, table_name, schema); + } else { + register_qualified("memtable", name, schema); + } +} + +/// Snapshot all registered docs (sorted by qualified name). +pub fn snapshot() -> Vec { + let reg = registry().lock().expect("table doc registry lock"); + let mut rows: Vec = reg.values().cloned().collect(); + rows.sort_by(|a, b| (&a.table_schema, &a.table_name).cmp(&(&b.table_schema, &b.table_name))); + rows +} + +/// Register column docs without a full schema (e.g. Python `@table` before first append). +pub fn register_column_docs( + table_schema: &str, + table_name: &str, + table_doc: Option<&str>, + columns: &[(String, String)], +) { + let key = qualified_key(table_schema, table_name); + let mut reg = registry().lock().expect("table doc registry lock"); + let entry = reg.entry(key).or_insert_with(|| TableDocs { + table_schema: table_schema.to_string(), + table_name: table_name.to_string(), + description: None, + columns: HashMap::new(), + }); + if let Some(doc) = table_doc { + entry.description = Some(doc.to_string()); + } + for (col, doc) in columns { + entry.columns.insert(col.clone(), doc.clone()); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{DType, Schema}; + + fn unique_table(prefix: &str) -> String { + format!("{prefix}_{}", std::process::id()) + } + + #[test] + fn register_from_schema_snapshot() { + let schema = + Schema::new() + .table_doc("demo table") + .col_doc("ts", DType::I64, "timestamp ns"); + register_from_name("demo.events", &schema); + let rows = snapshot(); + assert!(rows.iter().any(|r| { + r.table_schema == "demo" + && r.table_name == "events" + && r.description.as_deref() == Some("demo table") + && r.columns.get("ts") == Some(&"timestamp ns".to_string()) + })); + } + + #[test] + fn register_undotted_name_uses_memtable_schema() { + let name = unique_table("metrics_doc"); + let schema = + Schema::new() + .table_doc("undotted metrics") + .col_doc("v", DType::I64, "sample value"); + register_from_name(&name, &schema); + let rows = snapshot(); + assert!(rows.iter().any(|r| { + r.table_schema == "memtable" + && r.table_name == name + && r.description.as_deref() == Some("undotted metrics") + && r.columns.get("v") == Some(&"sample value".to_string()) + })); + } + + #[test] + fn register_column_docs_merges_into_existing_entry() { + let table = unique_table("merge_docs"); + register_column_docs( + "unittest", + &table, + Some("initial table doc"), + &[("a".to_string(), "column a".to_string())], + ); + register_column_docs( + "unittest", + &table, + Some("updated table doc"), + &[("b".to_string(), "column b".to_string())], + ); + let rows = snapshot(); + let row = rows + .iter() + .find(|r| r.table_schema == "unittest" && r.table_name == table) + .expect("merged docs row"); + assert_eq!(row.description.as_deref(), Some("updated table doc")); + assert_eq!(row.columns.get("a"), Some(&"column a".to_string())); + assert_eq!(row.columns.get("b"), Some(&"column b".to_string())); + } + + #[test] + fn register_from_schema_replaces_prior_entry() { + let table = unique_table("replace_docs"); + register_from_name( + &format!("unittest.{table}"), + &Schema::new() + .table_doc("old") + .col_doc("x", DType::I32, "old col"), + ); + register_from_name( + &format!("unittest.{table}"), + &Schema::new() + .table_doc("new") + .col_doc("y", DType::I32, "new col"), + ); + let rows = snapshot(); + let row = rows + .iter() + .find(|r| r.table_schema == "unittest" && r.table_name == table) + .expect("replaced docs row"); + assert_eq!(row.description.as_deref(), Some("new")); + assert!(!row.columns.contains_key("x")); + assert_eq!(row.columns.get("y"), Some(&"new col".to_string())); + } +} diff --git a/probing/memtable/src/lib.rs b/probing/memtable/src/lib.rs index c2b8bd8d..b530ddaf 100644 --- a/probing/memtable/src/lib.rs +++ b/probing/memtable/src/lib.rs @@ -100,6 +100,7 @@ mod cache; mod dedup; pub mod discover; +pub mod docs; mod layout; pub mod memc; pub mod memh; diff --git a/probing/memtable/src/memtable.rs b/probing/memtable/src/memtable.rs index f84a4eb9..d79077f8 100644 --- a/probing/memtable/src/memtable.rs +++ b/probing/memtable/src/memtable.rs @@ -156,6 +156,7 @@ macro_rules! impl_table_reader { name: cd.name_str().to_string(), dtype, elem_size: cd.elem_size as usize, + doc: None, }); } } diff --git a/probing/memtable/src/schema.rs b/probing/memtable/src/schema.rs index 04ed0fa9..66e95355 100644 --- a/probing/memtable/src/schema.rs +++ b/probing/memtable/src/schema.rs @@ -157,23 +157,44 @@ pub struct Col { pub name: String, pub dtype: DType, pub elem_size: usize, + /// Human-readable column description (not persisted in mmap). + pub doc: Option, } pub struct Schema { pub cols: Vec, + /// Human-readable table description (not persisted in mmap). + pub table_doc: Option, } impl Schema { pub fn new() -> Self { - Self { cols: vec![] } + Self { + cols: vec![], + table_doc: None, + } + } + + pub fn table_doc(mut self, doc: impl Into) -> Self { + self.table_doc = Some(doc.into()); + self + } + + pub fn col(self, name: &str, dtype: DType) -> Self { + self.push_col(name, dtype, None) } - pub fn col(mut self, name: &str, dtype: DType) -> Self { + pub fn col_doc(self, name: &str, dtype: DType, doc: impl Into) -> Self { + self.push_col(name, dtype, Some(doc.into())) + } + + fn push_col(mut self, name: &str, dtype: DType, doc: Option) -> Self { let elem_size = dtype.fixed_size().unwrap_or(0); self.cols.push(Col { name: name.into(), dtype, elem_size, + doc, }); self } @@ -207,4 +228,15 @@ mod tests { let schema = Schema::new().col("id", DType::I64).col("name", DType::Str); assert_eq!(format!("{schema:?}"), "Schema(id:i64, name:str)"); } + + #[test] + fn schema_table_and_column_docs() { + let schema = Schema::new() + .table_doc("events table") + .col("id", DType::I64) + .col_doc("name", DType::Str, "event name"); + assert_eq!(schema.table_doc.as_deref(), Some("events table")); + assert_eq!(schema.cols[0].doc, None); + assert_eq!(schema.cols[1].doc.as_deref(), Some("event name")); + } } diff --git a/probing/server/src/server/cluster_fanout.rs b/probing/server/src/server/cluster_fanout.rs index e442b014..23faeb96 100644 --- a/probing/server/src/server/cluster_fanout.rs +++ b/probing/server/src/server/cluster_fanout.rs @@ -206,14 +206,7 @@ fn tag_dataframe(mut df: DataFrame, host: &str, addr: &str, rank: Option) - if df.is_empty() { return df; } - let rows = df.len(); - df.names.push("_host".to_string()); - df.names.push("_addr".to_string()); - df.names.push("_rank".to_string()); - df.cols.push(Seq::SeqText(vec![host.to_string(); rows])); - df.cols.push(Seq::SeqText(vec![addr.to_string(); rows])); - df.cols.push(Seq::SeqI32(vec![rank.unwrap_or(-1); rows])); - df.size = df.len() as u64; + probing_core::core::federation::tag_proto_dataframe(&mut df, host, addr, rank); df } @@ -292,7 +285,7 @@ mod tests { ); let merged = merge_tagged_dataframes(&[local, remote]); assert_eq!(merged.len(), 2); - assert_eq!(merged.names.len(), 4); + assert_eq!(merged.names.len(), 7); let host_col = merged.names.iter().position(|n| n == "_host").unwrap(); assert_eq!(merged.cols[host_col].get_str(0).as_deref(), Some("host-a")); assert_eq!(merged.cols[host_col].get_str(1).as_deref(), Some("host-b")); diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index 336d3896..55ad96de 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -20,7 +20,7 @@ SELECT FROM python.trace_event s JOIN python.trace_event e ON s.span_id = e.span_id AND e.record_type = 'span_end' -WHERE s.record_type = 'span_start' AND s.kind = 'train.step' +WHERE s.record_type = 'span_start' AND s.name = 'train.step' ORDER BY s.time ASC "#; @@ -250,13 +250,26 @@ fn parse_attrs(raw: &str) -> (i32, i64, String) { return (-1, -1, String::new()); }; let rank = normalize_rank(value.get("rank").and_then(json_i64).unwrap_or(-1) as i32); - let local_step = value.get("local_step").and_then(json_i64).unwrap_or(-1); + let coord_step = value + .get("local_step") + .or_else(|| value.get("global_step")) + .and_then(json_i64) + .or_else(|| { + let micro = value.get("micro_step").and_then(json_i64)?; + let batches = value + .get("micro_batches") + .and_then(json_i64) + .unwrap_or(1) + .max(1); + Some(micro / batches) + }) + .unwrap_or(-1); let source = value .get("source") .and_then(|v| v.as_str()) .unwrap_or("") .to_string(); - (rank, local_step, source) + (rank, coord_step, source) } fn json_i64(v: &serde_json::Value) -> Option { diff --git a/pyproject.toml b/pyproject.toml index dd4740d0..305eb063 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,10 @@ Issues = "https://github.com/reiase/probing/issues" probing = "probing.cli.__main__:main" [project.optional-dependencies] +otel = [ + "opentelemetry-api>=1.20", + "opentelemetry-sdk>=1.20", +] test = [ "pytest>=8.0; python_version >= '3.8'", "pytest<8.0; python_version < '3.8'", diff --git a/python/probing/__init__.py b/python/probing/__init__.py index f9c9e38e..d5d3db26 100644 --- a/python/probing/__init__.py +++ b/python/probing/__init__.py @@ -15,7 +15,7 @@ Public Interfaces: - Engine: `query`, `load_extension` - Control: `cli_main`, `enable_tracer`, `disable_tracer`, `is_enabled` -- Tracing: `span`, `event` +- Tracing: `span`, `event`, `record_span`, `step` - Engine: `query`, `load_extension` Pulsing integration is passive: when another runtime writes ``pulsing.*`` memtables @@ -52,11 +52,20 @@ def is_enabled(): # Internal Accessors _get_python_stacks = _core._get_python_stacks _get_python_frames = _core._get_python_frames + register_table_docs = _core.register_table_docs # Submodules with side effects (must be imported after Core Primitives) from probing.core.engine import load_extension, query from probing.parallel import clear_role, current_role, set_role - from probing.tracing import event, span + from probing.tracing import ( + attach_training_phases, + event, + owns_training_phases, + phase, + record_span, + span, + step, + ) try: from probing.nccl.mock import maybe_auto_seed @@ -83,6 +92,11 @@ def is_enabled(): "load_extension", "span", "event", + "record_span", + "step", + "phase", + "attach_training_phases", + "owns_training_phases", "set_role", "clear_role", "current_role", diff --git a/python/probing/bundled_skills/semantic/tables.yaml b/python/probing/bundled_skills/semantic/tables.yaml index 7ce954d6..76b92ce5 100644 --- a/python/probing/bundled_skills/semantic/tables.yaml +++ b/python/probing/bundled_skills/semantic/tables.yaml @@ -8,8 +8,10 @@ tables: description: "PyTorch module-level forward/step timings and GPU memory snapshots" synonyms: [torch trace, module timing, 模块耗时, 训练步 profiling] key_columns: - step: "Training step index (int)" - global_step: "Global training step (from Rust step_snapshot)" + micro_step: "Finest step counter (micro-batch index)" + local_step: "Training step on this rank (micro_step // micro_batches)" + global_step: "Same as local_step when ranks are aligned" + micro_batches: "Gradient accumulation factor" rank: "torch.distributed rank" role: "Parallel role key, e.g. 'dp=2,pp=1,tp=0' (align/join across ranks)" module: "Fully-qualified module name" @@ -26,8 +28,10 @@ tables: description: "torch.distributed collective calls (all_reduce, broadcast, …)" synonyms: [collective, communication, NCCL, 通信, all_reduce] key_columns: - global_step: "Global training step" - local_step: "Local step on this rank" + micro_step: "Finest step counter" + global_step: "Training step (same as local_step)" + local_step: "Training step on this rank" + micro_batches: "Gradient accumulation factor" rank: "torch.distributed rank" role: "Parallel role key, e.g. 'dp=2,pp=1,tp=0' (align/join across ranks)" op: "Collective operation name" diff --git a/python/probing/core/table.py b/python/probing/core/table.py index 03b8d749..856117f0 100644 --- a/python/probing/core/table.py +++ b/python/probing/core/table.py @@ -23,6 +23,26 @@ def camel_to_snake(name): return re.sub("([a-z0-9])([A-Z])", r"\1_\2", s1).lower() +def _table_doc_from_class(cls) -> Optional[str]: + doc = cls.__doc__ + if not doc: + return None + line = doc.strip().splitlines()[0].strip() + if not line or line.startswith(f"{cls.__name__}("): + return None + return line + + +def _column_docs_from_class(cls) -> dict[str, str]: + docs: dict[str, str] = {} + for field in dataclasses.fields(cls): + meta = field.metadata or {} + doc = meta.get("doc") + if doc: + docs[field.name] = str(doc) + return docs + + def table(name_or_class: Optional[Union[str, Type[Any]]] = None): """A decorator that converts a dataclass into a persistable table. @@ -30,6 +50,9 @@ def table(name_or_class: Optional[Union[str, Type[Any]]] = None): it creates or retrieves an ExternalTable with the dataclass name (or provided name) and adds methods for data persistence and retrieval operations. + Table documentation comes from the class ``__doc__`` (first line). Column docs use + ``field(metadata={"doc": "..."})`` and are registered for SQL ``DESCRIBE``. + Parameters ---------- name : Optional[str], default=None @@ -63,12 +86,13 @@ def table(name_or_class: Optional[Union[str, Type[Any]]] = None): Examples -------- - >>> from dataclasses import dataclass + >>> from dataclasses import dataclass, field >>> @table ... @dataclass ... class Point: - ... x: int - ... y: int + ... \"\"\"Demo points table.\"\"\" + ... x: int = field(metadata={"doc": "X coordinate"}) + ... y: int = field(metadata={"doc": "Y coordinate"}) >>> Point.append(Point(1, 2)) >>> Point.take(10)[0][1] [1, 2] @@ -91,6 +115,9 @@ def decorator(cls): table_name = name or camel_to_snake(cls.__name__) fields = [f.name for f in dataclasses.fields(cls)] + table_doc = _table_doc_from_class(cls) + column_docs = _column_docs_from_class(cls) + qualified_name = table_name if "." in table_name else f"python.{table_name}" @functools.wraps(cls.__init__) def init_table(): @@ -101,7 +128,16 @@ def init_table(): f"Table {table_name} already exists with different fields" ) except Exception: - table = probing.ExternalTable(table_name, fields) + table = probing.ExternalTable( + table_name, + fields, + table_doc=table_doc, + column_docs=column_docs or None, + ) + if column_docs or table_doc: + probing.register_table_docs( + qualified_name, table_doc, column_docs or None + ) cache[cls] = table return table diff --git a/python/probing/ext/ray.py b/python/probing/ext/ray.py index a9d23dd2..9df993d6 100644 --- a/python/probing/ext/ray.py +++ b/python/probing/ext/ray.py @@ -54,13 +54,14 @@ def on_start(self, span, parent_context=None): SpanKind.PRODUCER: "producer", SpanKind.CONSUMER: "consumer", } - span_kind = kind_map.get(span.kind) - attrs = {} if hasattr(span, "attributes") and span.attributes: attrs = {str(k): str(v) for k, v in span.attributes.items()} + span_kind = kind_map.get(span.kind) + if span_kind: + attrs["otel.span_kind"] = span_kind - probing_span = probing.span(span_name, kind=span_kind, **attrs) + probing_span = probing.span(span_name, **attrs) probing_span.__enter__() span_context = span.get_span_context() diff --git a/python/probing/ext/torch.py b/python/probing/ext/torch.py index 40772c94..445c08bf 100644 --- a/python/probing/ext/torch.py +++ b/python/probing/ext/torch.py @@ -13,6 +13,10 @@ def is_true(value): def optimizer_step_post_hook(optimizer, *args, **kwargs): global hooks + from probing.tracing.hooks import maybe_auto_attach + + maybe_auto_attach(optimizer) + if optimizer not in hooks: from probing.profiling.torch import install_hooks from probing.profiling.torch.module_utils import get_toplevel_module diff --git a/python/probing/handlers/pythonext.py b/python/probing/handlers/pythonext.py index 1e1d06f9..9cbcb1f5 100644 --- a/python/probing/handlers/pythonext.py +++ b/python/probing/handlers/pythonext.py @@ -130,7 +130,7 @@ def get_chrome_tracing(limit: int = 1000) -> str: name, time as timestamp, COALESCE(thread_id, 0) as thread_id, - kind, + phase, location, attributes, event_attributes @@ -167,13 +167,13 @@ def get_chrome_tracing(limit: int = 1000) -> str: thread_id = row.get("thread_id", 0) trace_id = row.get("trace_id", 0) name = row.get("name", "unknown") - kind = row.get("kind", "trace") + phase = row.get("phase", "") # Use (span_id, thread_id) as key to handle multiple threads key = (span_id, thread_id) span_start_lookup[key] = { "trace_id": trace_id, "name": name, - "kind": kind, + "phase": phase, "timestamp": row.get("timestamp", 0), } @@ -185,7 +185,7 @@ def get_chrome_tracing(limit: int = 1000) -> str: trace_id = row.get("trace_id", 0) span_id = row.get("span_id", 0) thread_id = row.get("thread_id", 0) - kind = row.get("kind", "trace") + phase = row.get("phase", "") # Convert nanoseconds to microseconds ts_micros = (timestamp - min_timestamp) // 1000 @@ -196,10 +196,10 @@ def get_chrome_tracing(limit: int = 1000) -> str: if record_type == "span_start": # Store span start information with trace_id for matching key = (span_id, thread_id) - span_starts[key] = (ts_micros, name, kind, pid) + span_starts[key] = (ts_micros, name, phase, pid) chrome_event = { "name": name, - "cat": kind if kind else "span", + "cat": phase if phase else "span", "ph": "B", "ts": ts_micros, "pid": pid, @@ -215,12 +215,12 @@ def get_chrome_tracing(limit: int = 1000) -> str: if start_info: # Found matching span_start that was already processed - start_ts, start_name, start_kind, start_pid = start_info + start_ts, start_name, start_phase, start_pid = start_info # Use the pid from span_start to ensure matching chrome_event = { "name": start_name, # Must match span_start name "cat": ( - start_kind if start_kind else "span" + start_phase if start_phase else "span" ), # Must match span_start cat "ph": "E", "ts": ts_micros, @@ -244,11 +244,11 @@ def get_chrome_tracing(limit: int = 1000) -> str: lookup_info["timestamp"] - min_timestamp ) // 1000 start_name = lookup_info["name"] - start_kind = lookup_info["kind"] + start_phase = lookup_info["phase"] chrome_event = { "name": start_name, # Must match span_start name "cat": ( - start_kind if start_kind else "span" + start_phase if start_phase else "span" ), # Must match span_start cat "ph": "E", "ts": ts_micros, diff --git a/python/probing/hccl/__init__.py b/python/probing/hccl/__init__.py new file mode 100644 index 00000000..656c027b --- /dev/null +++ b/python/probing/hccl/__init__.py @@ -0,0 +1,85 @@ +"""HCCL MSProf shim helpers (Linux, Ascend / CANN).""" + +from __future__ import annotations + +import os +import shutil +import sys +from pathlib import Path + +__all__ = [ + "shim_path", + "shim_dir", + "ld_library_path_prefix", + "install_real_copy", + "ENV_REAL", + "ENV_SHIM_LOG", +] + +_LIB_BASENAME = "libprofapi.so" +_REAL_BASENAME = "libprofapi.so.real" +_ENV_OVERRIDE = "PROBING_HCCL_SHIM" +ENV_REAL = "PROBING_HCCL_PROFAPI_REAL" +ENV_SHIM_LOG = "PROBING_HCCL_SHIM_LOG" + + +def _candidate_paths() -> list[Path]: + pkg_root = Path(__file__).resolve().parent.parent + name = _LIB_BASENAME + out = [ + pkg_root / "shim" / "hccl" / name, + ] + repo_root = Path(__file__).resolve().parents[3] + for profile in ("release", "debug"): + out.append(repo_root / "target" / profile / name) + return out + + +def shim_path() -> str: + """Absolute path to the probing ``libprofapi.so`` shim.""" + override = os.environ.get(_ENV_OVERRIDE) + if override: + path = Path(override).expanduser().resolve() + if not path.is_file(): + raise FileNotFoundError( + f"{_ENV_OVERRIDE}={override!r} does not point to an existing file" + ) + return str(path) + + if sys.platform != "linux": + raise OSError( + "HCCL MSProf shim is only available on Linux; " + f"set {_ENV_OVERRIDE} if you have a custom build" + ) + + for candidate in _candidate_paths(): + if candidate.is_file(): + return str(candidate.resolve()) + + searched = ", ".join(str(p) for p in _candidate_paths()) + raise FileNotFoundError( + "HCCL shim not found. Build with " + "`make hccl-shim-lib` or `cargo build -p probing-hccl-shim --release`, " + f"or set {_ENV_OVERRIDE}. Searched: {searched}" + ) + + +def shim_dir() -> str: + """Directory containing ``libprofapi.so`` (for ``LD_LIBRARY_PATH``).""" + return str(Path(shim_path()).parent) + + +def ld_library_path_prefix() -> str: + """Value to prepend to ``LD_LIBRARY_PATH`` (shim dir only).""" + return shim_dir() + + +def install_real_copy(cann_libprofapi: str | Path) -> Path: + """Copy CANN's real ``libprofapi.so`` to ``libprofapi.so.real`` beside the shim.""" + src = Path(cann_libprofapi).expanduser().resolve() + if not src.is_file(): + raise FileNotFoundError(f"CANN libprofapi not found: {src}") + dest = Path(shim_dir()) / _REAL_BASENAME + dest.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(src, dest) + return dest diff --git a/python/probing/hccl/__main__.py b/python/probing/hccl/__main__.py new file mode 100644 index 00000000..5994701e --- /dev/null +++ b/python/probing/hccl/__main__.py @@ -0,0 +1,81 @@ +"""CLI: ``python -m probing.hccl --shim-dir``""" + +from __future__ import annotations + +import argparse +import sys + +from probing.hccl import ( + ENV_REAL, + ENV_SHIM_LOG, + install_real_copy, + ld_library_path_prefix, + shim_dir, + shim_path, +) + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser( + prog="python -m probing.hccl", + description="HCCL libprofapi.so shim utilities", + ) + parser.add_argument( + "--shim-path", + action="store_true", + help="print absolute path to libprofapi.so (probing shim)", + ) + parser.add_argument( + "--shim-dir", + action="store_true", + help="print directory to prepend to LD_LIBRARY_PATH", + ) + parser.add_argument( + "--install-real", + metavar="PATH", + help="copy CANN libprofapi.so to libprofapi.so.real next to the shim", + ) + args = parser.parse_args(argv) + + if args.shim_path: + try: + print(shim_path()) + except (OSError, FileNotFoundError) as e: + print(e, file=sys.stderr) + return 1 + return 0 + + if args.shim_dir: + try: + print(shim_dir()) + except (OSError, FileNotFoundError) as e: + print(e, file=sys.stderr) + return 1 + return 0 + + if args.install_real: + try: + dest = install_real_copy(args.install_real) + except (OSError, FileNotFoundError) as e: + print(e, file=sys.stderr) + return 1 + print(dest, file=sys.stderr) + return 0 + + parser.print_help(sys.stderr) + print("\nExample:", file=sys.stderr) + print( + " export LD_LIBRARY_PATH=$(python -m probing.hccl --shim-dir):$LD_LIBRARY_PATH", + file=sys.stderr, + ) + print( + f" export {ENV_REAL}=/path/to/cann/lib64/libprofapi.so # optional if libprofapi.so.real present", + file=sys.stderr, + ) + print(" export PROBING=2", file=sys.stderr) + print(f" export {ENV_SHIM_LOG}=1 # optional shim debug log", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/python/probing/parallel.py b/python/probing/parallel.py index 6d10490c..094caec0 100644 --- a/python/probing/parallel.py +++ b/python/probing/parallel.py @@ -172,7 +172,7 @@ def current_role() -> str: return role_key() -def set_role(role=None, /, **dims) -> str: +def set_role(role=None, **dims) -> str: """Override this process's parallel role at runtime. Accepts a canonical string, a mapping, or keyword dimensions:: diff --git a/python/probing/profiling/collective/record.py b/python/probing/profiling/collective/record.py index d9b1e313..68bf7c69 100644 --- a/python/probing/profiling/collective/record.py +++ b/python/probing/profiling/collective/record.py @@ -15,13 +15,12 @@ from probing.core import table from probing.parallel import current_role -from probing.tracing import ( - _step_fields, - comm_kind, - record_closed_span, - recorded_span, - step_snapshot, -) +from probing.tracing import record_span, span, step +from probing.tracing.coordinates import row_fields + + +def _comm_label(op: str) -> str: + return op if op.startswith("comm.") else f"comm.{op}" class CommRecordMode(str, Enum): @@ -32,8 +31,10 @@ class CommRecordMode(str, Enum): @table("comm_collective") @dataclass class CommCollective: + micro_step: int = 0 local_step: int = 0 global_step: int = 0 + micro_batches: int = 1 rank: int = -1 world_size: int = -1 # Extensible parallel role (e.g. "dp=2,pp=1,tp=0"); see probing.parallel.role_key. @@ -54,16 +55,7 @@ def _role_row_fields() -> dict: def _step_row_fields() -> dict: - snap = step_snapshot() - if snap is None: - return {"local_step": 0, "global_step": 0, "rank": -1, "world_size": -1} - step = _step_fields(snap) - return { - "local_step": step.get("local_step", 0), - "global_step": step.get("global_step", 0), - "rank": step.get("rank", -1), - "world_size": step.get("world_size", -1), - } + return row_fields(step.snapshot()) def _context_fields( @@ -118,11 +110,10 @@ def record_comm_lite( ) CommCollective(duration_ms=duration_ms, **fields).save() if write_trace_event: - record_closed_span( + record_span( op, - kind=comm_kind(op), duration_ns=int(duration_ms * 1e6), - attrs={**fields, "duration_ms": duration_ms}, + attrs={**fields, "duration_ms": duration_ms, "comm": _comm_label(op)}, source="collective_tracer", ) @@ -149,8 +140,8 @@ def begin_comm_span( nbytes=nbytes, async_op=async_op, ) - span_attrs = {**meta, "source": "collective_tracer"} - cm = recorded_span(op, kind=comm_kind(op), **span_attrs) + span_attrs = {k: v for k, v in meta.items() if k != "source"} + cm = span(op, source="collective_tracer", comm=_comm_label(op), **span_attrs) cm.__enter__() return cm, meta diff --git a/python/probing/profiling/phase_tracker.py b/python/probing/profiling/phase_tracker.py new file mode 100644 index 00000000..42631516 --- /dev/null +++ b/python/probing/profiling/phase_tracker.py @@ -0,0 +1,17 @@ +"""Backward-compatible import path; see ``probing.tracing.hooks``.""" + +from probing.tracing.hooks import ( # noqa: F401 + PhaseTracker, + _REGISTRY, + attach_training_phases, + detach_training_phases, + maybe_auto_attach, +) + +__all__ = [ + "PhaseTracker", + "_REGISTRY", + "attach_training_phases", + "detach_training_phases", + "maybe_auto_attach", +] diff --git a/python/probing/profiling/torch_probe.py b/python/probing/profiling/torch_probe.py index 857e19ac..96434313 100644 --- a/python/probing/profiling/torch_probe.py +++ b/python/probing/profiling/torch_probe.py @@ -6,13 +6,9 @@ import probing from probing.core import table from probing.parallel import current_role -from probing.tracing import ( - TRAIN_STEP_KIND, - current_local_step, - module_stage_kind, - recorded_span, - step_snapshot, -) +from probing.tracing import span, step +from probing.tracing.coordinates import row_fields +from probing.tracing.phases import OPTIMIZER, infer_from_stage, is_training_phase from .torch.module_utils import module_name from .types import BaseTracer @@ -40,7 +36,10 @@ def _get_backend(): @table @dataclass class TorchTrace: - step: Optional[int] = None + micro_step: Optional[int] = None + local_step: int = -1 + global_step: int = -1 + micro_batches: int = 1 seq: Optional[int] = None module: Optional[str] = None stage: Optional[str] = None @@ -52,10 +51,7 @@ class TorchTrace: duration: float = 0.0 allocated_delta: float = 0.0 max_allocated_delta: float = 0.0 - # Step coordinate + parallel role, so module-level local work can be aligned - # across ranks by role and joined with comm_collective. ``role`` is an - # extensible KV string (e.g. "dp=2,pp=1,tp=0"); see probing.parallel.role_key. - global_step: int = -1 + # Step coordinate + parallel role (see probing.step). rank: int = -1 world_size: int = -1 role: str = "" @@ -64,7 +60,7 @@ class TorchTrace: @table @dataclass class Variables: - step: Optional[int] = None + micro_step: Optional[int] = None func: Optional[str] = None name: Optional[str] = None value: Optional[str] = None @@ -659,7 +655,7 @@ def __init__(self, config: Optional[TorchProbeConfig] = None): self.config = config self.enabled = config.enabled - self.curr_step = current_local_step() + self.curr_step = step.micro_step self.pending = [] self._open_spans = {} self._train_step_cm = None @@ -673,30 +669,27 @@ def __init__(self, config: Optional[TorchProbeConfig] = None): ) def _stamp_step_role(self, record) -> None: - """Fill step coordinate (local/global/rank) and parallel role on a record.""" - snap = step_snapshot() - if snap is not None: - record.step = int(snap.local_step) - record.global_step = int(snap.global_step) - record.rank = int(snap.rank) - record.world_size = int(snap.world_size) + """Fill step coordinate and parallel role on a torch_trace record.""" + for key, value in row_fields(step.snapshot()).items(): + setattr(record, key, value) record.role = current_role() - def _begin_train_step_span(self) -> None: + def _begin_train_step_span(self, optimizer=None) -> None: if self._train_step_cm is not None: return - # Do not sync_local_step here — curr_step is often stale and would reset - # the global coordinate back to 0/1 across batches. - self._train_step_cm = recorded_span( - "step", kind=TRAIN_STEP_KIND, source="torch_probe" - ) - self._train_step_cm.__enter__() + from probing.tracing.hooks import owns_training_phases + + if optimizer is not None and owns_training_phases(optimizer=optimizer): + return + handle = span(phase=OPTIMIZER, source="torch_probe") + handle.__enter__() + self._train_step_cm = handle def _end_train_step_span(self) -> None: if self._train_step_cm is None: return - # Reentrant: outer span (e.g. manual train.step) owns the lifecycle. - if getattr(self._train_step_cm, "_reentrant", False): + inner = getattr(self._train_step_cm, "_inner", None) + if inner is not None and getattr(inner, "_reentrant", False): self._train_step_cm = None return self._train_step_cm.__exit__(None, None, None) @@ -727,7 +720,8 @@ def _complete_post_stage(self, mod, post_stage: str) -> None: pre_max_allocated = entry[4] record.allocated_delta = record.allocated - pre_allocated record.max_allocated_delta = record.max_allocated - pre_max_allocated - span_cm.__exit__(None, None, None) + if span_cm is not None: + span_cm.__exit__(None, None, None) self.pending.append(DelayedRecord(record, events)) def _finish_open_stages(self) -> None: @@ -782,19 +776,30 @@ def log_module_stage(self, stage, mod, force=False) -> None: module_name_str = self._module_display_name(mod) record.module = module_name_str record.stage = stage - span_kind = module_stage_kind(stage) + span_phase = infer_from_stage(stage) + + emit_trace_span = True + if is_training_phase(span_phase): + from probing.tracing.hooks import owns_training_phases + + if owns_training_phases(module=mod): + emit_trace_span = False if stage.startswith("pre"): record.time_offset = self.begin_timing(mod, stage) - span_cm = recorded_span( - module_name_str, - kind=span_kind, - module=module_name_str, - stage=mapped_stage, - seq=record.seq, - source="torch_probe", - ) - span_cm.__enter__() + span_cm = None + if emit_trace_span: + span_kwargs = dict( + module=module_name_str, + stage=mapped_stage, + seq=record.seq, + source="torch_probe", + ) + if is_training_phase(span_phase): + span_cm = span(module_name_str, phase=span_phase, **span_kwargs) + else: + span_cm = span(module_name_str, **span_kwargs) + span_cm.__enter__() self._open_spans[span_key] = ( span_cm, mod, @@ -812,13 +817,13 @@ def post_step_hook(self, opt, args, kwargs): return if not self.finalized: self.finalize_discovery() - self.curr_step = current_local_step() - self._begin_train_step_span() + self.curr_step = step.micro_step + self._begin_train_step_span(optimizer=opt) else: self._end_train_step_span() self.next_mod() - self.curr_step = current_local_step() - self._begin_train_step_span() + self.curr_step = step.micro_step + self._begin_train_step_span(optimizer=opt) # Ensure backend operations are complete before processing traces if self.has_backend and self.pending: diff --git a/python/probing/skills/__main__.py b/python/probing/skills/__main__.py index 7e637488..a300eb67 100644 --- a/python/probing/skills/__main__.py +++ b/python/probing/skills/__main__.py @@ -31,7 +31,8 @@ def main() -> int: catalog = load_catalog() print(f"Catalog: {len(catalog.skills)} skills") print(f"Roots: {_roots_display()}") - if repo := repo_skills_dir(): + repo = repo_skills_dir() + if repo: print(f"Repo skills: {repo}") warnings = validate_all() if warnings: diff --git a/python/probing/tracing.py b/python/probing/tracing.py deleted file mode 100644 index 9a18a2b8..00000000 --- a/python/probing/tracing.py +++ /dev/null @@ -1,716 +0,0 @@ -"""Tracing facade (Python side). - -Provides a thin, explicit wrapper around the Rust implementation for creating spans -via a context manager or decorator, attaching immutable attributes at creation time, -and recording span lifecycle plus custom events into a single table. - -Notes ------ -* Attributes are fixed at span creation (no mutation API exposed). -* `TraceEvent` stores start/end/event rows; missing values use simple sentinels - (parent_id = -1, text fields = empty string) to avoid `None` persistence issues. -* The public surface stays minimal: `span`, `Span.with_`, `Span.decorator`, `add_event`, - and the `TraceEvent` dataclass table. - -Examples --------- -Context manager:: - - import probing - with probing.span("load_data", dataset="mnist") as s: - probing.event("read") - # do work - -Decorator:: - - import probing - @probing.span("predict") - def predict(x): - return model(x) - -Implicit name decorator:: - - import probing - @probing.span - def compute(): - return 42 -""" - -import functools -import inspect -from dataclasses import dataclass -from typing import Callable, Optional - -# Import from the internal Rust module -from probing import _core - -try: - Span = _core.Span - current_span = _core.current_span - active_span_for_events = _core.active_span_for_events - active_span_by_kind = _core.active_span_by_kind - step_snapshot = _core.py_step_snapshot - sync_local_step = _core.py_sync_local_step - advance_local_step = _core.py_advance_local_step - set_step_bucket_size = _core.py_set_step_bucket_size - current_local_step = _core.py_current_local_step -except AttributeError: - Span = None - - def current_span(): - return None - - def active_span_for_events(): - return None - - def active_span_by_kind(_kind: str): - return None - - def step_snapshot(): - return None - - def sync_local_step(_step: int): - return None - - def advance_local_step(): - return None - - def set_step_bucket_size(_bucket: int): - return None - - def current_local_step() -> int: - return 0 - - -from probing.core.table import table - -TRAIN_STEP_KIND = "train.step" - -# Materialized span rows derived from ``python.trace_event`` (start/end join). -# Use span ``time`` (ns since epoch), not the memtable ingestion ``timestamp``. -SPANS_SQL = """ -SELECT - s.trace_id, - s.span_id, - COALESCE(s.parent_id, -1) AS parent_span_id, - s.name, - s.kind, - CAST(s.time / 1000 AS BIGINT) AS start_us, - CAST(e.time / 1000 AS BIGINT) AS end_us, - CAST((e.time - s.time) / 1000 AS BIGINT) AS duration_us, - s.thread_id, - s.location, - s.attributes -FROM python.trace_event s -JOIN python.trace_event e - ON s.span_id = e.span_id AND e.record_type = 'span_end' -WHERE s.record_type = 'span_start' -""" - -STAGE_KIND_MAP = { - "forward": "nn.forward", - "backward": "nn.backward", - "step": "optim.step", -} - - -def _step_fields(snapshot) -> dict: - if snapshot is None: - return {} - return { - "local_step": int(snapshot.local_step), - "global_step": int(snapshot.global_step), - "bucket_size": int(snapshot.bucket_size), - "rank": int(snapshot.rank), - "world_size": int(snapshot.world_size), - } - - -def _merge_span_attributes(attrs: dict, *, source: str = "manual") -> dict: - """Merge user attrs with step coordinates, topology, and source label.""" - merged = dict(attrs) - merged.setdefault("source", source) - snap = step_snapshot() - if snap is not None: - merged.update(_step_fields(snap)) - from probing.parallel import parallel_fields - - merged.update(parallel_fields()) - return merged - - -def comm_kind(op: str) -> str: - """Span kind for a collective op, e.g. ``comm.all_reduce``.""" - if op.startswith("comm."): - return op - return f"comm.{op}" - - -def _create_span_object( - name: str, kind: Optional[str], location: Optional[str], attrs: dict -): - parent = current_span() - if parent: - span_obj = Span.new_child(parent, name, kind=kind, location=location) - else: - span_obj = Span(name, kind=kind, location=location) - if attrs and hasattr(span_obj, "_set_initial_attrs"): - try: - span_obj._set_initial_attrs(dict(attrs)) - except Exception as e: - import warnings - - warnings.warn(f"Failed to set initial attributes: {e}") - return span_obj - - -class _RecordedSpan: - """Internal context manager: span stack + TraceEvent persistence.""" - - def __init__( - self, - name: str, - kind: Optional[str] = None, - location: Optional[str] = None, - attrs: Optional[dict] = None, - *, - source: str = "manual", - ): - self.name = name - self.kind = kind - self.location = location - self.attrs = dict(attrs or {}) - self.source = source - self._span = None - self._reentrant = False - self._owns_step_advance = False - - def __enter__(self): - if self.kind == TRAIN_STEP_KIND: - existing = active_span_by_kind(TRAIN_STEP_KIND) - if existing is not None: - self._span = existing - self._reentrant = True - return existing - - loc = self.location or _get_location() - merged = _merge_span_attributes(self.attrs, source=self.source) - self._span = _create_span_object(self.name, self.kind, loc, merged) - self._span.__enter__() - _record_span_start(self._span, merged) - if self.kind == TRAIN_STEP_KIND: - self._owns_step_advance = True - return self._span - - def __exit__(self, exc_type, exc_val, exc_tb): - if self._span is None: - return False - if self._reentrant: - return False - result = self._span.__exit__(exc_type, exc_val, exc_tb) - _record_span_end(self._span) - if self._owns_step_advance: - advance_local_step() - return result - - -def recorded_span(name: str, kind: Optional[str] = None, **attrs): - """Open a span that is always persisted to ``python.trace_event``.""" - return _RecordedSpan(name, kind=kind, attrs=attrs) - - -def module_stage_kind(stage: str) -> str: - """Map TorchProbe stage label to span kind.""" - for key, kind in STAGE_KIND_MAP.items(): - if key in stage: - return kind - return "torch.module" - - -def _get_location() -> Optional[str]: - """Get the current call location from the stack. - - Returns - ------- - Optional[str] - Location string in format "filename:function:lineno" or None if unavailable. - """ - try: - # Get the frame that called span() (skip this function and span() itself) - stack = inspect.stack() - # Find the first frame that's not in this module - for frame_info in stack[2:]: # Skip _get_location and span() - frame = frame_info.frame - filename = frame_info.filename - function = frame_info.function - lineno = frame_info.lineno - - # Skip frames from this module - if "probing/tracing.py" in filename or "probing\\tracing.py" in filename: - continue - - # Format: "filename:function:lineno" - return f"{filename}:{function}:{lineno}" - except Exception: - pass - return None - - -@table -@dataclass -class TraceEvent: - """Row model for trace records. - - Each saved instance is one of: span_start, span_end, event. - - Parameters - ---------- - record_type : str - One of ``'span_start'``, ``'span_end'`` or ``'event'``. - trace_id : int - Trace identifier (shared by related spans). - span_id : int - Unique span identifier. - name : str - Span or event name. - time : int - Nanoseconds since epoch. - parent_id : int, default -1 - Parent span id, -1 if root. - kind : str, default "" - Optional span kind label. - location : str, default "" - Code location automatically captured from call stack. - attributes : str, default "" - JSON string of span attributes (only in span rows). - event_attributes : str, default "" - JSON string of event attributes (only in event rows). - """ - - # Required fields - record_type: str - trace_id: int - span_id: int - name: str - time: int - thread_id: int = 0 - - # Optional fields - parent_id: Optional[int] = -1 - kind: Optional[str] = "" - location: Optional[str] = "" - attributes: Optional[str] = "" - event_attributes: Optional[str] = "" - - -def span(*args, **kwargs): - """Factory for span usage as context manager or decorator. - - Scenarios - --------- - 1. Context manager:: - - with span("work", user="alice") as s: - ... - - 2. Decorator with explicit name:: - - @span("inference") - def run(x): ... - - 3. Decorator with implicit function name:: - - @span - def train(): ... - - Parameters - ---------- - *args - Either empty (implicit decorator), a single callable, or a single string name. - **kwargs - Attributes to attach plus optional ``kind``. - - Note - ---- - The ``location`` is automatically captured from the call stack using - Python's ``inspect`` module. It is not passed as a parameter. - - Returns - ------- - object - A context manager / decorator hybrid or a pure decorator. - """ - # Extract special parameters - kind = kwargs.pop("kind", None) - # Location is automatically captured, not passed as parameter - location = _get_location() - - if len(args) == 0 and not kwargs: - - def decorator(func: Callable) -> Callable: - @functools.wraps(func) - def wrapper(*wargs, **wkwargs): - with _RecordedSpan(func.__name__, kind=kind) as _s: - return func(*wargs, **wkwargs) - - return wrapper - - return decorator - - # Handle @span(func) - first arg is a callable - if len(args) == 1 and callable(args[0]): - func = args[0] - - @functools.wraps(func) - def wrapper(*wargs, **wkwargs): - with _RecordedSpan(func.__name__, kind=kind) as _s: - return func(*wargs, **wkwargs) - - return wrapper - - # Handle @span("name") or with span("name") - if len(args) == 1 and isinstance(args[0], str): - name = args[0] - - # Create a wrapper that supports both decorator and context manager usage - class SpanWrapper: - def __init__( - self, - name: str, - kind: Optional[str], - location: Optional[str], - attrs: dict, - ): - self.name = name - self.kind = kind - self.location = location - self.attrs = attrs - self._inner = None - - def __call__(self, func: Callable) -> Callable: - """Enable decorator form when a name was provided.""" - - @functools.wraps(func) - def wrapper(*wargs, **wkwargs): - with _RecordedSpan( - self.name, - kind=self.kind, - location=self.location, - attrs=self.attrs, - ) as _s: - return func(*wargs, **wkwargs) - - return wrapper - - def __enter__(self): - self._inner = _RecordedSpan( - self.name, - kind=self.kind, - location=self.location, - attrs=self.attrs, - ) - return self._inner.__enter__() - - def __exit__(self, *args): - if self._inner: - return self._inner.__exit__(*args) - return False - - return SpanWrapper(name, kind, location, kwargs) - - if len(args) > 0: - name = args[0] - if not isinstance(name, str): - raise TypeError("span() requires a string name as the first argument") - - parent = current_span() - loc = location or _get_location() - - if parent: - span_obj = Span.new_child(parent, name, kind=kind, location=loc) - else: - span_obj = Span(name, kind=kind, location=loc) - - if kwargs: - attrs_dict = dict(kwargs) - if hasattr(span_obj, "_set_initial_attrs"): - span_obj._set_initial_attrs(attrs_dict) - - return span_obj - - raise TypeError("span() requires at least one argument") - - -def _record_span_start(span: Span, attrs: dict): - """Persist span start. - - Parameters - ---------- - span : Span - Span object. - attrs : dict - Creation-time attributes. - """ - import json - - # Convert attributes to JSON string - attrs_json = None - if attrs: - attrs_json = json.dumps(attrs) - # Sanitize None values to backend-friendly sentinels (tables reject Python None) - parent_id = span.parent_id if span.parent_id is not None else -1 - kind = span.kind if span.kind is not None else "" - location = ( - span.location if hasattr(span, "location") and span.location is not None else "" - ) - attributes = attrs_json if attrs_json is not None else "" - event = TraceEvent( - record_type="span_start", - trace_id=span.trace_id, - span_id=span.span_id, - name=span.name, - time=span.start_timestamp, - thread_id=getattr(span, "thread_id", 0), - parent_id=parent_id, - kind=kind, - location=location, - attributes=attributes, - event_attributes="", # not applicable - ) - event.save() - - -def _record_span_end(span: Span): - """Persist span end with minimal data (only end time + span id). - - Other fields are blanked to reduce duplication. - """ - import time - - end_ts = span.end_timestamp or int(time.time_ns()) - event = TraceEvent( - record_type="span_end", - trace_id=0, - span_id=span.span_id, - name="", - time=end_ts, - thread_id=getattr(span, "thread_id", 0), - parent_id=-1, - kind="", - location="", - attributes="", - event_attributes="", - ) - event.save() - - -def record_closed_span( - name: str, - *, - kind: Optional[str] = None, - duration_ns: int, - attrs: Optional[dict] = None, - source: str = "manual", -) -> None: - """Persist span_start + span_end without entering the span stack. - - Used for hot-path instrumentation where ``recorded_span`` stack/location - capture would add unnecessary overhead. - """ - import json - import time - - if duration_ns < 0: - duration_ns = 0 - - TraceEvent.init_table() - merged = _merge_span_attributes(dict(attrs or {}), source=source) - end_ns = int(time.time_ns()) - start_ns = end_ns - duration_ns - - parent = current_span() - if parent: - span_obj = Span.new_child(parent, name, kind=kind, location="") - else: - span_obj = Span(name, kind=kind, location="") - - attrs_json = json.dumps(merged) if merged else "" - parent_id = span_obj.parent_id if span_obj.parent_id is not None else -1 - kind_str = kind or "" - - TraceEvent( - record_type="span_start", - trace_id=span_obj.trace_id, - span_id=span_obj.span_id, - name=name, - time=start_ns, - thread_id=getattr(span_obj, "thread_id", 0), - parent_id=parent_id, - kind=kind_str, - location="", - attributes=attrs_json, - event_attributes="", - ).save() - - TraceEvent( - record_type="span_end", - trace_id=0, - span_id=span_obj.span_id, - name="", - time=end_ns, - thread_id=getattr(span_obj, "thread_id", 0), - parent_id=-1, - kind="", - location="", - attributes="", - event_attributes="", - ).save() - - -def _record_event(span: Span, event_name: str, event_attributes: Optional[list] = None): - """Persist an event row. - - Parameters - ---------- - span : Span - Active span. - event_name : str - Event name. - event_attributes : list, optional - List of dicts or (key, value) tuples. - """ - import json - import time - - # Get current timestamp (nanoseconds since epoch) - timestamp = int(time.time_ns()) - - # Convert event attributes to JSON string - event_attrs_json = None - if event_attributes: - # Convert list of dicts/tuples to a single dict - attrs_dict = {} - for attr_item in event_attributes: - if isinstance(attr_item, dict): - attrs_dict.update(attr_item) - elif isinstance(attr_item, (list, tuple)) and len(attr_item) == 2: - attrs_dict[attr_item[0]] = attr_item[1] - if attrs_dict: - event_attrs_json = json.dumps(attrs_dict) - - parent_id = span.parent_id if span.parent_id is not None else -1 - kind = span.kind if span.kind is not None else "" - location = ( - span.location if hasattr(span, "location") and span.location is not None else "" - ) - attrs = "" # span-level attributes not duplicated here - event_attrs = event_attrs_json if event_attrs_json is not None else "" - event = TraceEvent( - record_type="event", - trace_id=span.trace_id, - span_id=span.span_id, - name=event_name, - time=timestamp, - thread_id=getattr(span, "thread_id", 0), - parent_id=parent_id, - kind=kind, - location=location, - attributes=attrs, - event_attributes=event_attrs, - ) - event.save() - - -# Add convenience methods to Span class -def _span_with(name: str, kind: Optional[str] = None): - """Convenience context manager form. - - Parameters - ---------- - name : str - Span name. - kind : str, optional - Span kind label. - - Returns - ------- - Span - Newly created span (root or child). - """ - parent = current_span() - location = _get_location() - if parent: - return Span.new_child(parent, name, kind=kind, location=location) - else: - return Span(name, kind=kind, location=location) - - -def _span_decorator(name: Optional[str] = None, kind: Optional[str] = None): - """Return a decorator that wraps a function in a span. - - Parameters - ---------- - name : str, optional - Explicit span name, defaults to function name. - kind : str, optional - Kind label. - - Returns - ------- - Callable - Decorator applying tracing span. - """ - - def decorator(func: Callable) -> Callable: - @functools.wraps(func) - def wrapper(*wargs, **wkwargs): - span_name = name or func.__name__ - with _RecordedSpan(span_name, kind=kind) as _s: - return func(*wargs, **wkwargs) - - return wrapper - - return decorator - - -# Monkey-patch Span class with convenience methods -if Span: - Span.with_ = staticmethod(_span_with) - Span.decorator = staticmethod(_span_decorator) - - -def add_event(name: str, *, attributes: Optional[list] = None): - """Add an event to the current span. - - Parameters - ---------- - name : str - Event name. - attributes : list, optional - Each item is a dict or a (key, value) tuple. - - Raises - ------ - RuntimeError - If no span is active. - - Examples - -------- - >>> with span("op"): - ... add_event("phase") - ... add_event("kv", attributes=[{"x": 1}, ("y", 2)]) - """ - current = active_span_for_events() - if current is None: - current = current_span() - if current is None or getattr(current, "is_ended", False): - raise RuntimeError("No active span in current context. Cannot add event.") - - current.add_event(name, attributes=attributes) - - # Record event to table - _record_event(current, name, attributes) - - -# Alias for add_event to match the top-level export -event = add_event diff --git a/python/probing/tracing/__init__.py b/python/probing/tracing/__init__.py new file mode 100644 index 00000000..81e4206e --- /dev/null +++ b/python/probing/tracing/__init__.py @@ -0,0 +1,62 @@ +"""Tracing primitives for probing.""" + +from __future__ import annotations + +from probing.tracing._bindings import Span, current_span +from probing.tracing.backends import ( + bind_table, + configure as configure_backends, + list_backends, + register as register_backend, + reset as reset_backends, +) +from probing.tracing.coordinates import row_fields, span_attrs, step, step_fields +from probing.tracing.hooks import ( + attach_training_phases, + detach_training_phases, + owns_training_phases, +) +from probing.tracing.phases import ( + BACKWARD, + FORWARD, + IDLE, + OPTIMIZER, + SOURCE_MANUAL, + SOURCE_PHASE_HOOK, + SOURCE_TORCH_PROBE, + phase, + reset_phase, +) +from probing.tracing.span import event, record_span, span +from probing.tracing.table import SPANS_SQL, TraceEvent + +bind_table(TraceEvent) + +__all__ = [ + "span", + "event", + "record_span", + "current_span", + "step", + "step_fields", + "row_fields", + "span_attrs", + "phase", + "reset_phase", + "attach_training_phases", + "detach_training_phases", + "owns_training_phases", + "FORWARD", + "BACKWARD", + "OPTIMIZER", + "IDLE", + "SOURCE_MANUAL", + "SOURCE_PHASE_HOOK", + "SOURCE_TORCH_PROBE", + "register_backend", + "configure_backends", + "list_backends", + "reset_backends", + "TraceEvent", + "SPANS_SQL", +] diff --git a/python/probing/tracing/_bindings.py b/python/probing/tracing/_bindings.py new file mode 100644 index 00000000..188f9b41 --- /dev/null +++ b/python/probing/tracing/_bindings.py @@ -0,0 +1,46 @@ +"""Rust tracing bindings (internal).""" + +from __future__ import annotations + +from probing import _core + +try: + Span = _core.Span + current_span = _core.current_span + active_span_for_events = _core.active_span_for_events + active_span_by_phase = _core.active_span_by_phase + active_training_phase = _core.active_training_phase + step_snapshot = _core.py_step_snapshot + sync_micro_step = _core.py_sync_micro_step + advance_micro_step = _core.py_advance_micro_step + set_micro_batches = _core.py_set_micro_batches + current_micro_step = _core.py_current_micro_step +except AttributeError: + Span = None + + def current_span(): + return None + + def active_span_for_events(): + return None + + def active_span_by_phase(_phase: str): + return None + + def active_training_phase(): + return None + + def step_snapshot(): + return None + + def sync_micro_step(_step: int): + return None + + def advance_micro_step(): + return None + + def set_micro_batches(_micro_batches: int): + return None + + def current_micro_step() -> int: + return 0 diff --git a/python/probing/tracing/backends.py b/python/probing/tracing/backends.py new file mode 100644 index 00000000..8727aeb9 --- /dev/null +++ b/python/probing/tracing/backends.py @@ -0,0 +1,590 @@ +"""Pluggable span backends — fan-out from a single recorder. + +Default backend writes ``python.trace_event`` (memtable). Optional backends +include OpenTelemetry export and third-party entry points. + +Environment +----------- +``PROBING_SPAN_BACKENDS`` + Comma-separated backend names. Default: ``memtable``. + Built-in: ``memtable``, ``logger`` (terminal), ``otel`` (requires ``opentelemetry-sdk``). + +``PROBING_SPAN_LOG_LEVEL`` + Log level for the ``logger`` backend (default: ``INFO``). + +``OTEL_EXPORTER_OTLP_ENDPOINT`` / standard OTel env vars apply when ``otel`` is enabled. +""" + +from __future__ import annotations + +import json +import logging +import os +import sys +import time +from dataclasses import dataclass +from typing import Any, Callable, Dict, List, Optional, Protocol, runtime_checkable + +logger = logging.getLogger(__name__) + +MEMTABLE_BACKEND = "memtable" +LOGGER_BACKEND = "logger" +OTEL_BACKEND = "otel" + +_trace_event_cls: Any = None +_recorder: Optional["SpanRecorder"] = None +_custom_factories: Dict[str, Callable[[], "SpanBackend"]] = {} +_programmatic_names: Optional[List[str]] = None + + +@dataclass(frozen=True) +class SpanStartRecord: + trace_id: int + span_id: int + parent_id: int + name: str + phase: str + time_ns: int + thread_id: int + location: str + attributes_json: str + + +@dataclass(frozen=True) +class SpanEndRecord: + span_id: int + time_ns: int + thread_id: int + + +@dataclass(frozen=True) +class SpanEventRecord: + trace_id: int + span_id: int + parent_id: int + phase: str + location: str + name: str + time_ns: int + thread_id: int + event_attributes_json: str + + +@runtime_checkable +class SpanBackend(Protocol): + name: str + + def on_span_start(self, record: SpanStartRecord) -> None: ... + + def on_span_end(self, record: SpanEndRecord) -> None: ... + + def on_event(self, record: SpanEventRecord) -> None: ... + + def shutdown(self) -> None: ... + + +def bind_table(trace_event_cls: Any) -> None: + """Bind the memtable row model (``TraceEvent`` dataclass).""" + global _trace_event_cls, _recorder + _trace_event_cls = trace_event_cls + _recorder = None + + +def configure(names: Optional[List[str]] = None) -> None: + """Select span backends by name (overrides ``PROBING_SPAN_BACKENDS`` until ``reset()``).""" + global _programmatic_names, _recorder + _programmatic_names = list(names) if names is not None else None + _recorder = None + + +def register(name: str, factory: Callable[[], SpanBackend]) -> None: + """Register a custom backend factory.""" + _custom_factories[name.strip().lower()] = factory + global _recorder + _recorder = None + + +def parse_backend_names(raw: Optional[str] = None) -> List[str]: + if _programmatic_names is not None: + return list(_programmatic_names) + value = ( + raw + if raw is not None + else os.environ.get("PROBING_SPAN_BACKENDS", MEMTABLE_BACKEND) + ) + names = [part.strip().lower() for part in value.split(",") if part.strip()] + return names or [MEMTABLE_BACKEND] + + +def _entry_point_backends() -> Dict[str, Callable[[], SpanBackend]]: + grouped: Dict[str, Callable[[], SpanBackend]] = {} + try: + try: + from importlib.metadata import entry_points as _eps + except ImportError: + from importlib_metadata import entry_points as _eps # type: ignore + + try: + eps = _eps(group="probing.span_backends") + except TypeError: + eps = _eps().get("probing.span_backends", []) + for ep in eps: + grouped[ep.name.strip().lower()] = ep.load + except Exception: + pass + return grouped + + +def _build_memtable_backend() -> SpanBackend: + if _trace_event_cls is None: + raise RuntimeError( + "probing.tracing.backends.bind_table(TraceEvent) was not called" + ) + return MemtableBackend(_trace_event_cls) + + +def _build_logger_backend() -> SpanBackend: + return LoggerBackend() + + +def _build_otel_backend() -> Optional[SpanBackend]: + try: + from opentelemetry import trace # noqa: F401 + except ImportError: + logger.warning( + "PROBING_SPAN_BACKENDS includes 'otel' but opentelemetry-sdk is not installed; skipping" + ) + return None + return OtelBackend() + + +def load_backends(names: Optional[List[str]] = None) -> List[SpanBackend]: + """Instantiate backends for *names* (deduplicated, stable order).""" + wanted = parse_backend_names(",".join(names) if names else None) + entry_map = _entry_point_backends() + out: List[SpanBackend] = [] + seen: set[str] = set() + + for name in wanted: + if name in seen: + continue + seen.add(name) + + backend: Optional[SpanBackend] = None + if name == MEMTABLE_BACKEND: + backend = _build_memtable_backend() + elif name == LOGGER_BACKEND: + backend = _build_logger_backend() + elif name == OTEL_BACKEND: + backend = _build_otel_backend() + elif name in _custom_factories: + backend = _custom_factories[name]() + elif name in entry_map: + backend = entry_map[name]() + else: + logger.warning("Unknown span backend %r — skipped", name) + continue + + if backend is not None: + out.append(backend) + + if not out: + out.append(_build_memtable_backend()) + return out + + +class MemtableBackend: + """Canonical store: ``python.trace_event`` mmap rows.""" + + name = MEMTABLE_BACKEND + + def __init__(self, trace_event_cls: Any) -> None: + self._TraceEvent = trace_event_cls + + def on_span_start(self, record: SpanStartRecord) -> None: + self._TraceEvent.init_table() + self._TraceEvent( + record_type="span_start", + trace_id=record.trace_id, + span_id=record.span_id, + name=record.name, + time=record.time_ns, + thread_id=record.thread_id, + parent_id=record.parent_id, + phase=record.phase, + location=record.location, + attributes=record.attributes_json, + event_attributes="", + ).save() + + def on_span_end(self, record: SpanEndRecord) -> None: + self._TraceEvent.init_table() + self._TraceEvent( + record_type="span_end", + trace_id=0, + span_id=record.span_id, + name="", + time=record.time_ns, + thread_id=record.thread_id, + parent_id=-1, + phase="", + location="", + attributes="", + event_attributes="", + ).save() + + def on_event(self, record: SpanEventRecord) -> None: + self._TraceEvent.init_table() + self._TraceEvent( + record_type="event", + trace_id=record.trace_id, + span_id=record.span_id, + name=record.name, + time=record.time_ns, + thread_id=record.thread_id, + parent_id=record.parent_id, + phase=record.phase, + location=record.location, + attributes="", + event_attributes=record.event_attributes_json, + ).save() + + def shutdown(self) -> None: + return None + + +def _terminal_logger() -> logging.Logger: + """Logger that prints span lines to stderr when no handler is configured.""" + log = logging.getLogger("probing.span") + if not log.handlers: + handler = logging.StreamHandler(sys.stderr) + handler.setFormatter(logging.Formatter("%(message)s")) + log.addHandler(handler) + level = os.environ.get("PROBING_SPAN_LOG_LEVEL", "INFO").upper() + log.setLevel(getattr(logging, level, logging.INFO)) + log.propagate = False + return log + + +class LoggerBackend: + """Print span lifecycle to the terminal (works alongside other backends).""" + + name = LOGGER_BACKEND + + def __init__(self, log: Optional[logging.Logger] = None) -> None: + self._log = log or _terminal_logger() + self._depth = 0 + self._open: Dict[int, tuple[str, int]] = {} + + def _indent(self) -> str: + return " " * self._depth + + def on_span_start(self, record: SpanStartRecord) -> None: + self._open[record.span_id] = (record.name, record.time_ns) + parts = [f"→ {record.name}"] + if record.phase: + parts.append(f"phase={record.phase}") + source = _attr_from_json(record.attributes_json, "source") + if source: + parts.append(f"source={source}") + self._log.info("%s%s", self._indent(), " ".join(parts)) + self._depth += 1 + + def on_span_end(self, record: SpanEndRecord) -> None: + self._depth = max(0, self._depth - 1) + opened = self._open.pop(record.span_id, None) + if opened is not None: + name, start_ns = opened + dur_ms = max(0.0, (record.time_ns - start_ns) / 1e6) + self._log.info("%s← %s %.2fms", self._indent(), name, dur_ms) + else: + self._log.info("%s← span_id=%s", self._indent(), record.span_id) + + def on_event(self, record: SpanEventRecord) -> None: + suffix = "" + if record.event_attributes_json: + try: + parsed = json.loads(record.event_attributes_json) + if isinstance(parsed, dict) and parsed: + suffix = " " + json.dumps(parsed, ensure_ascii=False) + except json.JSONDecodeError: + suffix = f" {record.event_attributes_json}" + self._log.info("%s· %s%s", self._indent(), record.name, suffix) + + def shutdown(self) -> None: + self._open.clear() + self._depth = 0 + + +def _attr_from_json(raw: str, key: str) -> Optional[str]: + if not raw: + return None + try: + parsed = json.loads(raw) + except json.JSONDecodeError: + return None + if not isinstance(parsed, dict): + return None + value = parsed.get(key) + return str(value) if value is not None else None + + +class OtelBackend: + """Optional OpenTelemetry export (Jaeger/Grafana/OTLP via standard OTel env).""" + + name = OTEL_BACKEND + + def __init__(self) -> None: + from opentelemetry import trace + from opentelemetry.trace import SpanKind, set_span_in_context + + self._trace = trace + self._SpanKind = SpanKind + self._set_span_in_context = set_span_in_context + self._tracer = trace.get_tracer("probing") + self._spans: Dict[int, Any] = {} + self._parents: Dict[int, int] = {} + + def _kind(self, kind: str) -> Any: + mapping = { + "server": self._SpanKind.SERVER, + "client": self._SpanKind.CLIENT, + "producer": self._SpanKind.PRODUCER, + "consumer": self._SpanKind.CONSUMER, + } + return mapping.get(kind, self._SpanKind.INTERNAL) + + def on_span_start(self, record: SpanStartRecord) -> None: + parent_ctx = None + if record.parent_id not in (-1, None): + parent_otel = self._spans.get(record.parent_id) + if parent_otel is not None: + parent_ctx = self._set_span_in_context(parent_otel) + + otel_span = self._tracer.start_span( + record.name, + context=parent_ctx, + kind=self._kind(record.phase), + start_time=record.time_ns, + ) + if record.attributes_json: + try: + attrs = json.loads(record.attributes_json) + if isinstance(attrs, dict): + for key, value in attrs.items(): + otel_span.set_attribute(str(key), value) + else: + otel_span.set_attribute( + "probing.attributes", record.attributes_json + ) + except json.JSONDecodeError: + otel_span.set_attribute("probing.attributes", record.attributes_json) + if record.phase: + otel_span.set_attribute("probing.phase", record.phase) + if record.location: + otel_span.set_attribute("probing.location", record.location) + + self._spans[record.span_id] = otel_span + self._parents[record.span_id] = record.parent_id + + def on_span_end(self, record: SpanEndRecord) -> None: + otel_span = self._spans.pop(record.span_id, None) + self._parents.pop(record.span_id, None) + if otel_span is None: + return + otel_span.end(end_time=record.time_ns) + + def on_event(self, record: SpanEventRecord) -> None: + otel_span = self._spans.get(record.span_id) + if otel_span is None: + return + attrs: Dict[str, Any] = {} + if record.event_attributes_json: + try: + parsed = json.loads(record.event_attributes_json) + if isinstance(parsed, dict): + attrs = {str(k): v for k, v in parsed.items()} + except json.JSONDecodeError: + attrs = {"raw": record.event_attributes_json} + otel_span.add_event(record.name, attributes=attrs, timestamp=record.time_ns) + + def shutdown(self) -> None: + for span_id, otel_span in list(self._spans.items()): + try: + otel_span.end() + except Exception: + pass + self._spans.pop(span_id, None) + self._parents.clear() + + +class SpanRecorder: + """Fan-out span lifecycle records to all enabled backends.""" + + def __init__(self, backends: List[SpanBackend]) -> None: + self._backends = backends + + @property + def backend_names(self) -> List[str]: + return [b.name for b in self._backends] + + def record_span_start(self, span: Any, attrs: dict) -> None: + record = _span_start_record(span, attrs) + self._dispatch("on_span_start", record) + + def record_span_end(self, span: Any) -> None: + end_ts = span.end_timestamp or int(time.time_ns()) + record = SpanEndRecord( + span_id=int(span.span_id), + time_ns=int(end_ts), + thread_id=int(getattr(span, "thread_id", 0)), + ) + self._dispatch("on_span_end", record) + + def record_closed_span( + self, + span: Any, + *, + name: str, + phase: str, + start_ns: int, + end_ns: int, + attributes_json: str, + ) -> None: + start = SpanStartRecord( + trace_id=int(span.trace_id), + span_id=int(span.span_id), + parent_id=int(span.parent_id if span.parent_id is not None else -1), + name=name, + phase=phase, + time_ns=int(start_ns), + thread_id=int(getattr(span, "thread_id", 0)), + location="", + attributes_json=attributes_json, + ) + end = SpanEndRecord( + span_id=int(span.span_id), + time_ns=int(end_ns), + thread_id=int(getattr(span, "thread_id", 0)), + ) + self._dispatch("on_span_start", start) + self._dispatch("on_span_end", end) + + def record_event( + self, span: Any, event_name: str, event_attributes: Optional[list] = None + ) -> None: + record = _event_record(span, event_name, event_attributes) + self._dispatch("on_event", record) + + def shutdown(self) -> None: + for backend in self._backends: + try: + backend.shutdown() + except Exception as exc: + logger.debug("span backend %s.shutdown failed: %s", backend.name, exc) + + def _dispatch(self, method: str, record: Any) -> None: + for backend in self._backends: + _safe_call(backend, method, record) + + +def _safe_call(backend: SpanBackend, method: str, record: Any) -> None: + try: + getattr(backend, method)(record) + except Exception as exc: + logger.debug("span backend %s.%s failed: %s", backend.name, method, exc) + + +def _span_start_record(span: Any, attrs: dict) -> SpanStartRecord: + attrs_json = json.dumps(attrs) if attrs else "" + raw = getattr(span, "phase", None) or "" + phase = raw if raw is not None else "" + location = ( + span.location if hasattr(span, "location") and span.location is not None else "" + ) + return SpanStartRecord( + trace_id=int(span.trace_id), + span_id=int(span.span_id), + parent_id=int(span.parent_id if span.parent_id is not None else -1), + name=str(span.name), + phase=str(phase), + time_ns=int(span.start_timestamp), + thread_id=int(getattr(span, "thread_id", 0)), + location=str(location), + attributes_json=attrs_json, + ) + + +def _event_record( + span: Any, event_name: str, event_attributes: Optional[list] +) -> SpanEventRecord: + attrs_dict: Dict[str, Any] = {} + if event_attributes: + for attr_item in event_attributes: + if isinstance(attr_item, dict): + attrs_dict.update(attr_item) + elif isinstance(attr_item, (list, tuple)) and len(attr_item) == 2: + attrs_dict[attr_item[0]] = attr_item[1] + event_attrs_json = json.dumps(attrs_dict) if attrs_dict else "" + raw = getattr(span, "phase", None) or "" + phase = raw if raw is not None else "" + location = ( + span.location if hasattr(span, "location") and span.location is not None else "" + ) + return SpanEventRecord( + trace_id=int(span.trace_id), + span_id=int(span.span_id), + parent_id=int(span.parent_id if span.parent_id is not None else -1), + phase=str(phase), + location=str(location), + name=str(event_name), + time_ns=int(time.time_ns()), + thread_id=int(getattr(span, "thread_id", 0)), + event_attributes_json=event_attrs_json, + ) + + +def get_recorder(*, reset: bool = False) -> SpanRecorder: + global _recorder + if _recorder is None or reset: + _recorder = SpanRecorder(load_backends()) + return _recorder + + +def _reset_recorder() -> None: + """Drop cached recorder instance.""" + global _recorder + if _recorder is not None: + try: + _recorder.shutdown() + except Exception: + pass + _recorder = None + + +def reset(*, clear_registered: bool = False) -> None: + """Drop cached recorder; optionally clear ``register()`` factories and ``configure()`` override.""" + global _programmatic_names + if clear_registered: + _custom_factories.clear() + _programmatic_names = None + _reset_recorder() + + +def list_backends() -> List[str]: + """Return names of currently active span backends.""" + return get_recorder().backend_names + + +__all__ = [ + "SpanBackend", + "MemtableBackend", + "LoggerBackend", + "OtelBackend", + "SpanRecorder", + "register", + "configure", + "list_backends", + "reset", + "bind_table", +] diff --git a/python/probing/tracing/coordinates.py b/python/probing/tracing/coordinates.py new file mode 100644 index 00000000..fe12b6a3 --- /dev/null +++ b/python/probing/tracing/coordinates.py @@ -0,0 +1,93 @@ +"""Training step coordinates and span/table context fields.""" + +from __future__ import annotations + +from typing import Any, Optional + +from probing.tracing._bindings import ( + advance_micro_step, + set_micro_batches, + step_snapshot, + sync_micro_step, +) + +_ROW_DEFAULTS = { + "micro_step": 0, + "local_step": 0, + "global_step": 0, + "micro_batches": 1, + "rank": -1, + "world_size": -1, +} + + +class Step: + """Training step controller. + + * ``micro_step`` — finest counter; ``probing.step()`` advances by one. + * ``local_step = micro_step // micro_batches`` — per-rank training step. + * ``global_step = local_step``. + """ + + def __call__( + self, value: Optional[int] = None, *, micro_batches: Optional[int] = None + ) -> None: + if micro_batches is not None: + set_micro_batches(micro_batches) + if value is not None: + sync_micro_step(value) + return + if micro_batches is not None: + return + advance_micro_step() + + @property + def micro_step(self) -> int: + return int(step_snapshot().micro_step) + + @property + def local_step(self) -> int: + return int(step_snapshot().local_step) + + @property + def global_step(self) -> int: + return int(step_snapshot().global_step) + + def snapshot(self) -> Any: + return step_snapshot() + + +step = Step() + + +def step_fields(snapshot) -> dict: + """Step/topology fields from a snapshot.""" + if snapshot is None: + return {} + local = int(snapshot.local_step) + return { + "micro_step": int(snapshot.micro_step), + "local_step": local, + "global_step": int(snapshot.global_step), + "micro_batches": int(snapshot.micro_batches), + "rank": int(snapshot.rank), + "world_size": int(snapshot.world_size), + } + + +def row_fields(snapshot=None) -> dict: + """Step coordinates with memtable-friendly defaults.""" + snap = snapshot if snapshot is not None else step.snapshot() + fields = step_fields(snap) + return {key: fields.get(key, default) for key, default in _ROW_DEFAULTS.items()} + + +def span_attrs(user: dict, *, source: str = "manual") -> dict: + """Merge user attrs with step coordinates, topology, and source label.""" + merged = dict(user) + merged.setdefault("source", source) + merged.update(step_fields(step.snapshot())) + from probing.parallel import parallel_fields + + merged.update(parallel_fields()) + return merged diff --git a/python/probing/tracing/hooks.py b/python/probing/tracing/hooks.py new file mode 100644 index 00000000..7d1bcec7 --- /dev/null +++ b/python/probing/tracing/hooks.py @@ -0,0 +1,138 @@ +"""PyTorch model/optimizer hooks for automatic training phase spans.""" + +from __future__ import annotations + +import logging +from typing import Optional + +from probing.tracing.phases import BACKWARD, FORWARD, OPTIMIZER, hook_enter, hook_exit + +logger = logging.getLogger(__name__) + +_REGISTRY: dict[tuple[int, int], PhaseTracker] = {} + + +class PhaseTracker: + def __init__(self, model, optimizer) -> None: + self.model = model + self.optimizer = optimizer + self._handles: list = [] + + def install(self) -> None: + if self._handles: + return + m = self.model + opt = self.optimizer + self._handles = [ + m.register_forward_pre_hook(self._forward_pre), + m.register_forward_hook(self._forward_post), + m.register_full_backward_pre_hook(self._backward_pre), + m.register_full_backward_hook(self._backward_post), + opt.register_step_pre_hook(self._step_pre), + opt.register_step_post_hook(self._step_post), + ] + + def uninstall(self) -> None: + for h in self._handles: + try: + h.remove() + except Exception: + pass + self._handles.clear() + + def _forward_pre(self, module, _inputs) -> None: + if module.training: + hook_enter(FORWARD) + + def _forward_post(self, module, _inputs, _output) -> None: + if module.training: + hook_exit(FORWARD) + + def _backward_pre(self, _module, _grad_output) -> None: + hook_enter(BACKWARD) + + def _backward_post(self, _module, _inputs, _grad_output) -> None: + hook_exit(BACKWARD) + + def _step_pre(self, _optimizer, _args, _kwargs) -> None: + hook_enter(OPTIMIZER) + + def _step_post(self, _optimizer, _args, _kwargs) -> None: + hook_exit(OPTIMIZER) + + +def attach_training_phases(model, optimizer) -> PhaseTracker: + key = (id(model), id(optimizer)) + if key in _REGISTRY: + return _REGISTRY[key] + tracker = PhaseTracker(model, optimizer) + tracker.install() + _REGISTRY[key] = tracker + return tracker + + +def detach_training_phases(model, optimizer) -> None: + key = (id(model), id(optimizer)) + tracker = _REGISTRY.pop(key, None) + if tracker is not None: + tracker.uninstall() + + +def owns_training_phases(*, model=None, optimizer=None, module=None) -> bool: + """True when ``attach_training_phases`` owns iteration-level phase spans. + + * **optimizer** — same optimizer instance passed to ``attach_training_phases``. + * **model** — root model id match. + * **module** — *module* is the registered root or any of its submodules. + """ + if model is not None: + mid = id(model) + return any(k[0] == mid for k in _REGISTRY) + if optimizer is not None: + oid = id(optimizer) + return any(k[1] == oid for k in _REGISTRY) + if module is not None: + mid = id(module) + for tracker in _REGISTRY.values(): + root = tracker.model + if mid == id(root): + return True + for sub in root.modules(): + if id(sub) == mid: + return True + return False + return bool(_REGISTRY) + + +def maybe_auto_attach(optimizer) -> Optional[PhaseTracker]: + if not _phases_enabled(): + return None + for (_mid, oid), tracker in _REGISTRY.items(): + if oid == id(optimizer): + return tracker + try: + import probing + from probing.profiling.torch.module_utils import get_toplevel_module + except Exception: + return None + if not probing.is_enabled(): + return None + models = get_toplevel_module() + if not models: + return None + tracker = None + for model in models: + tracker = attach_training_phases(model, optimizer) + return tracker + + +def _phases_enabled() -> bool: + try: + import probing + + spec = probing.config.get_str("probing.torch.phases") + if spec is None or spec == "": + return True + return spec.lower() in ("1", "true", "on", "yes") + except Exception: + return True diff --git a/python/probing/tracing/phases.py b/python/probing/tracing/phases.py new file mode 100644 index 00000000..637b768f --- /dev/null +++ b/python/probing/tracing/phases.py @@ -0,0 +1,174 @@ +"""Training phase vocabulary, inference, and runtime coordination.""" + +from __future__ import annotations + +import time +from typing import Literal, Optional + +FORWARD = "forward" +BACKWARD = "backward" +OPTIMIZER = "optimizer" +IDLE = "idle" + +TrainingPhase = Literal["forward", "backward", "optimizer"] + +ALL = frozenset({FORWARD, BACKWARD, OPTIMIZER}) + +# Span name → phase when ``phase`` is omitted. +_NAME_PHASE: dict[str, str] = { + "forward": FORWARD, + "backward": BACKWARD, + "step": OPTIMIZER, + "optimizer": OPTIMIZER, +} + +# Span names that must not infer a training phase. +_NON_PHASE_NAMES = frozenset( + {"train.step", "model.init", "data.load", "checkpoint.save"} +) + +# --- Composability: who may emit a phase span (higher suppresses lower) --- +SOURCE_MANUAL = "manual" +SOURCE_PHASE_HOOK = "phase_hook" +SOURCE_TORCH_PROBE = "torch_probe" + + +def infer(name: str) -> Optional[str]: + if not name or name in _NON_PHASE_NAMES: + return None + if name in _NAME_PHASE: + return _NAME_PHASE[name] + base = name.rsplit(".", 1)[-1] + return _NAME_PHASE.get(base) + + +def infer_from_stage(stage: str) -> Optional[str]: + """Map TorchProbe hook stage label to training phase.""" + lowered = stage.lower() + for token in ("optimizer", "backward", "forward", "step"): + if token in lowered: + mapped = infer(token) + if mapped is not None: + return mapped + return None + + +def resolve(name: str, phase: Optional[str]) -> Optional[str]: + if phase is not None: + if phase not in ALL: + raise ValueError( + f"invalid training phase {phase!r}; use FORWARD, BACKWARD, or OPTIMIZER" + ) + return phase + return infer(name) + + +def resolve_span( + name: Optional[str] = None, + phase: Optional[str] = None, +) -> tuple[str, Optional[str]]: + """Return ``(span_name, training_phase)``. Requires at least one of *name* or *phase*. + + When *phase* is given and *name* is omitted, ``span_name == phase`` (canonical form). + """ + if phase is not None: + resolved = resolve(name or phase, phase) + display = name if name is not None else resolved + assert display is not None + return display, resolved + if name is not None: + return name, resolve(name, None) + raise TypeError("span() requires name and/or phase") + + +def is_training_phase(value: Optional[str]) -> bool: + return value in ALL + + +# --- Runtime coordination (hook + span stack) --- + +_hook_spans: dict[str, object] = {} +_iteration_start_ns: Optional[int] = None + + +def phase() -> str: + """Current training phase from the innermost active phase span, else ``idle``.""" + from probing.tracing._bindings import active_training_phase + + active = active_training_phase() + return active if active is not None else IDLE + + +def reset_phase() -> None: + """Reset coordinator state (tests).""" + global _iteration_start_ns + _hook_spans.clear() + _iteration_start_ns = None + + +def on_span_enter(name: str, span_phase: Optional[str], source: str) -> None: + """Reserved for span lifecycle hooks; phase is derived from the span stack.""" + del name, span_phase, source + + +def on_span_exit(name: str, span_phase: Optional[str], source: str) -> None: + """Reserved for span lifecycle hooks; phase is derived from the span stack.""" + del name, span_phase, source + + +def hook_enter(span_phase: str) -> None: + global _iteration_start_ns + if span_phase == FORWARD and _iteration_start_ns is None: + _iteration_start_ns = time.time_ns() + if _phase_tracked(span_phase, by_source=SOURCE_PHASE_HOOK): + return + if span_phase in _hook_spans: + return + import probing + + cm = probing.span(phase=span_phase, source=SOURCE_PHASE_HOOK) + cm.__enter__() + _hook_spans[span_phase] = cm + + +def hook_exit(span_phase: str) -> None: + if span_phase == OPTIMIZER: + _record_train_step() + cm = _hook_spans.pop(span_phase, None) + if cm is not None: + cm.__exit__(None, None, None) + + +def _record_train_step() -> None: + """Record one ``train.step`` closed span for the current logical iteration.""" + global _iteration_start_ns + if _iteration_start_ns is None: + return + import probing + + from probing.tracing.coordinates import step, step_fields + + snap = step.snapshot() + mb = max(int(snap.micro_batches), 1) + micro = int(snap.micro_step) + attrs = { + **step_fields(snap), + "accum_index": micro % mb, + "logical_step_pending": micro // mb, + } + duration_ns = int(time.time_ns()) - _iteration_start_ns + _iteration_start_ns = None + probing.record_span( + "train.step", + duration_ns=duration_ns, + attrs=attrs, + source=SOURCE_PHASE_HOOK, + ) + + +def _phase_tracked(span_phase: str, *, by_source: str) -> bool: + """True when an active span already carries this training phase.""" + del by_source + from probing.tracing._bindings import active_span_by_phase + + return active_span_by_phase(span_phase) is not None diff --git a/python/probing/tracing/span.py b/python/probing/tracing/span.py new file mode 100644 index 00000000..248739ee --- /dev/null +++ b/python/probing/tracing/span.py @@ -0,0 +1,317 @@ +"""Span lifecycle: open, event, record.""" + +from __future__ import annotations + +import functools +import inspect +import json +import os +import time +from typing import Callable, Optional + +from probing.tracing._bindings import ( + Span, + active_span_by_phase, + active_span_for_events, + current_span, +) +from probing.tracing.coordinates import span_attrs, step +from probing.tracing.phases import OPTIMIZER, resolve_span +from probing.tracing.table import TraceEvent + +_LOCATION_ENV = frozenset({"1", "true", "yes", "on"}) + + +class _RecordedSpan: + """Context manager: span stack + backend persistence.""" + + def __init__( + self, + name: str, + phase: Optional[str] = None, + location: Optional[str] = None, + attrs: Optional[dict] = None, + *, + source: str = "manual", + auto_location: bool = False, + ): + self.name = name + self.phase = phase + self.location = location + self.attrs = dict(attrs or {}) + self.source = source + self._auto_location = auto_location + self._span = None + self._reentrant = False + self._owns_step_advance = False + + def __enter__(self): + if self.phase == OPTIMIZER: + existing = active_span_by_phase(OPTIMIZER) + if existing is not None: + self._span = existing + self._reentrant = True + return existing + + loc = self.location + if loc is None and self._auto_location: + loc = _caller_location() + merged = span_attrs(self.attrs, source=self.source) + self._span = _create_span(self.name, self.phase, loc, merged) + self._span.__enter__() + _persist_span_start(self._span, merged) + if self.phase == OPTIMIZER: + self._owns_step_advance = True + return self._span + + def __exit__(self, exc_type, exc_val, exc_tb): + if self._span is None or self._reentrant: + return False + result = self._span.__exit__(exc_type, exc_val, exc_tb) + _persist_span_end(self._span) + if self._owns_step_advance: + step() + return result + + +def _create_span(name: str, phase: Optional[str], location: Optional[str], attrs: dict): + parent = current_span() + if parent: + span_obj = Span.new_child(parent, name, phase=phase, location=location) + else: + span_obj = Span(name, phase=phase, location=location) + if attrs and hasattr(span_obj, "_set_initial_attrs"): + try: + span_obj._set_initial_attrs(dict(attrs)) + except Exception as e: + import warnings + + warnings.warn(f"Failed to set initial attributes: {e}") + return span_obj + + +def _caller_location() -> Optional[str]: + """Walk ``inspect.stack()`` for the first frame outside ``probing/tracing``.""" + try: + for frame_info in inspect.stack()[2:]: + path = frame_info.filename.replace("\\", "/") + if "probing/tracing" in path: + continue + return f"{frame_info.filename}:{frame_info.function}:{frame_info.lineno}" + except Exception: + pass + return None + + +def _location_enabled() -> bool: + return os.environ.get("PROBING_SPAN_LOCATION", "").lower() in _LOCATION_ENV + + +def _span_options( + kwargs: dict, +) -> tuple[str, Optional[str], str, Optional[str], dict, bool]: + phase = kwargs.pop("phase", None) + source = kwargs.pop("source", "manual") + location = kwargs.pop("location", None) + auto_location = location is None and _location_enabled() + return phase, source, location, kwargs, auto_location + + +def _make_handle( + name: str, + phase: Optional[str], + location: Optional[str], + attrs: dict, + source: str, + auto_location: bool, +): + class SpanHandle: + def __init__(self): + self.name = name + self.phase = phase + self.location = location + self.source = source + self.attrs = attrs + self._auto_location = auto_location + self._inner = None + + def __call__(self, func: Callable) -> Callable: + @functools.wraps(func) + def wrapper(*wargs, **wkwargs): + with _RecordedSpan( + self.name, + phase=self.phase, + location=self.location, + attrs=self.attrs, + source=self.source, + auto_location=self._auto_location, + ): + return func(*wargs, **wkwargs) + + return wrapper + + def __enter__(self): + self._inner = _RecordedSpan( + self.name, + phase=self.phase, + location=self.location, + attrs=self.attrs, + source=self.source, + auto_location=self._auto_location, + ) + return self._inner.__enter__() + + def __exit__(self, *exc): + if self._inner: + return self._inner.__exit__(*exc) + return False + + def __getattr__(self, attr): + if self._inner is not None: + return getattr(self._inner, attr) + raise AttributeError(attr) + + return SpanHandle() + + +def span(*args, **kwargs): + """Open a span (context manager, decorator, or manual enter/exit). + + Reserved kwargs: ``phase``, ``source``, ``location``. Training phases are + ``FORWARD``, ``BACKWARD``, ``OPTIMIZER`` (see ``probing.tracing.phases``). + + When ``phase`` is set and ``name`` is omitted, ``name`` defaults to ``phase``. + When only ``name`` is given, phase is inferred (e.g. ``"forward"`` → ``FORWARD``). + + Auto ``location`` via ``inspect.stack()`` is off by default; set + ``PROBING_SPAN_LOCATION=1`` or pass ``location=...`` explicitly. + """ + phase_kw, source, location, attrs, auto_location = _span_options(dict(kwargs)) + + if len(args) == 1 and isinstance(args[0], str): + name_kw = args[0] + name, phase = resolve_span(name_kw, phase_kw) + return _make_handle(name, phase, location, attrs, source, auto_location) + + if len(args) == 0: + if phase_kw is not None: + name, phase = resolve_span(None, phase_kw) + return _make_handle(name, phase, location, attrs, source, auto_location) + if not attrs: + + def decorator(func: Callable) -> Callable: + resolved_name, resolved_phase = resolve_span(func.__name__, None) + return _make_handle( + resolved_name, + resolved_phase, + location, + {}, + source, + auto_location, + )(func) + + return decorator + raise TypeError("span() requires name and/or phase") + + if len(args) == 1 and callable(args[0]): + func = args[0] + resolved_name, resolved_phase = resolve_span(func.__name__, phase_kw) + + @functools.wraps(func) + def wrapper(*wargs, **wkwargs): + with _RecordedSpan( + resolved_name, + phase=resolved_phase, + location=location, + attrs=attrs, + source=source, + auto_location=auto_location, + ): + return func(*wargs, **wkwargs) + + return wrapper + + if len(args) == 1: + raise TypeError( + f"span() first argument must be str or callable, got {type(args[0]).__name__}" + ) + if len(args) > 1: + raise TypeError("span() takes at most one positional argument") + + raise TypeError("span() requires at least one argument") + + +def event(name: str, *, attributes: Optional[list] = None): + """Add a point event on the active span.""" + current = active_span_for_events() or current_span() + if current is None or getattr(current, "is_ended", False): + raise RuntimeError("No active span in current context. Cannot add event.") + current.add_event(name, attributes=attributes) + + +def record_span( + name: str, + *, + phase: Optional[str] = None, + duration_ns: int, + attrs: Optional[dict] = None, + source: str = "manual", +) -> None: + """Record a completed span without entering the span stack (hot path).""" + if duration_ns < 0: + duration_ns = 0 + + TraceEvent.init_table() + merged = span_attrs(dict(attrs or {}), source=source) + end_ns = int(time.time_ns()) + start_ns = end_ns - duration_ns + resolved_name, resolved_phase = resolve_span(name, phase) + + parent = current_span() + if parent: + span_obj = Span.new_child( + parent, resolved_name, phase=resolved_phase, location="" + ) + else: + span_obj = Span(resolved_name, phase=resolved_phase, location="") + + from probing.tracing.backends import get_recorder + + get_recorder().record_closed_span( + span_obj, + name=resolved_name, + phase=resolved_phase or "", + start_ns=start_ns, + end_ns=end_ns, + attributes_json=json.dumps(merged) if merged else "", + ) + + +def _persist_span_start(span: Span, attrs: dict) -> None: + from probing.tracing.backends import get_recorder + + get_recorder().record_span_start(span, attrs) + + +def _persist_span_end(span: Span) -> None: + from probing.tracing.backends import get_recorder + + get_recorder().record_span_end(span) + + +def _persist_event( + span: Span, event_name: str, event_attributes: Optional[list] = None +) -> None: + from probing.tracing.backends import get_recorder + + get_recorder().record_event(span, event_name, event_attributes) + + +if Span: + _rust_add_event = Span.add_event + + def _add_event_persist(self, name, attributes=None): + _rust_add_event(self, name, attributes=attributes) + _persist_event(self, name, attributes) + + Span.add_event = _add_event_persist diff --git a/python/probing/tracing/table.py b/python/probing/tracing/table.py new file mode 100644 index 00000000..c54be71c --- /dev/null +++ b/python/probing/tracing/table.py @@ -0,0 +1,50 @@ +"""Trace event table schema (SQL / federation).""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Optional + +from probing.core.table import table + +# Materialized span rows derived from ``python.trace_event`` (start/end join). +# Use span ``time`` (ns since epoch), not the memtable ingestion ``timestamp``. +SPANS_SQL = """ +SELECT + s.trace_id, + s.span_id, + COALESCE(s.parent_id, -1) AS parent_span_id, + s.name, + s.phase, + CAST(s.time / 1000 AS BIGINT) AS start_us, + CAST(e.time / 1000 AS BIGINT) AS end_us, + CAST((e.time - s.time) / 1000 AS BIGINT) AS duration_us, + s.thread_id, + s.location, + s.attributes +FROM python.trace_event s +JOIN python.trace_event e + ON s.span_id = e.span_id AND e.record_type = 'span_end' +WHERE s.record_type = 'span_start' +""" + + +@table +@dataclass +class TraceEvent: + """Row model for trace records. + + Each saved instance is one of: span_start, span_end, event. + """ + + record_type: str + trace_id: int + span_id: int + name: str + time: int + thread_id: int = 0 + parent_id: Optional[int] = -1 + phase: Optional[str] = "" + location: Optional[str] = "" + attributes: Optional[str] = "" + event_attributes: Optional[str] = "" diff --git a/python/probing/web_assets.py b/python/probing/web_assets.py index 9c5ad7fe..c7abd9e7 100644 --- a/python/probing/web_assets.py +++ b/python/probing/web_assets.py @@ -53,6 +53,18 @@ def _resource_dir(name: str, marker: str) -> Path | None: return None +def _looks_like_built_ui(root: Path) -> bool: + """True when ``index.html`` is a Dioxus bundle, not the checkout placeholder.""" + index = root / "index.html" + if not index.is_file(): + return False + try: + body = index.read_text(encoding="utf-8", errors="ignore") + except OSError: + return False + return "web-dxh" in body or '
' in body + + def resolve_web_assets_root() -> Path | None: """Return the directory that contains ``index.html``, if any.""" override = os.environ.get(_ENV) @@ -61,8 +73,19 @@ def resolve_web_assets_root() -> Path | None: if (root / "index.html").is_file(): return root return None - if bundled := bundled_web_dir(): - return bundled + + # Editable checkout: prefer freshly built ``web/dist`` over stale ``bundled_web``. + if not _running_from_installed_wheel(): + dev = dev_web_dir() + if dev: + if _looks_like_built_ui(dev): + return dev + + bundled = bundled_web_dir() + if bundled: + if _looks_like_built_ui(bundled): + return bundled + return dev_web_dir() diff --git a/skills/semantic/tables.yaml b/skills/semantic/tables.yaml index 7ce954d6..06f4c7bc 100644 --- a/skills/semantic/tables.yaml +++ b/skills/semantic/tables.yaml @@ -1,139 +1,361 @@ # Semantic layer: maps user/agent language to probing SQL tables and columns. -# Used in system prompts and skill prerequisite checks. +# Used in system prompts, skill prerequisite checks, and Engine DESCRIBE rewrite +# (probe.probing.table_docs / column_docs). apiVersion: probing.dev/v1 kind: SemanticCatalog tables: python.torch_trace: - description: "PyTorch module-level forward/step timings and GPU memory snapshots" + description: "PyTorch 模块级 forward/step hook 耗时与 GPU 显存快照(长驻采样,非 torch.profiler 窗口)" synonyms: [torch trace, module timing, 模块耗时, 训练步 profiling] key_columns: - step: "Training step index (int)" - global_step: "Global training step (from Rust step_snapshot)" - rank: "torch.distributed rank" - role: "Parallel role key, e.g. 'dp=2,pp=1,tp=0' (align/join across ranks)" - module: "Fully-qualified module name" - stage: "One of: forward, step (post forward / post step hooks)" - duration: "Hook duration in seconds" - allocated: "GPU memory allocated (MB) at hook time" - allocated_delta: "Change in allocated since previous hook (MB)" - max_allocated: "Peak allocated (MB)" + micro_step: "最细粒度步计数(micro-batch 序号)" + local_step: "本 rank 训练步(micro_step // micro_batches)" + global_step: "全局训练步(各 rank 对齐时与 local_step 相同)" + micro_batches: "梯度累积因子" + seq: "本 step 内 hook 序号" + rank: "torch.distributed rank(-1 未知)" + world_size: "world size(-1 未知)" + role: "并行角色键,如 dp=2,pp=1,tp=0" + module: "模块全限定名" + stage: "pre forward | post forward | pre step | post step" + time_offset: "相对本 step 时间锚点的秒偏移" + duration: "hook 耗时(秒);post 行有意义" + allocated: "当前 GPU 已分配显存(MB)" + allocated_delta: "相对上一 hook 的 allocated 变化(MB)" + max_allocated: "峰值已分配显存(MB)" + max_allocated_delta: "相对上一 hook 的 max_allocated 变化(MB)" + cached: "当前 GPU reserved 显存(MB)" + max_cached: "峰值 reserved 显存(MB)" notes: - - "First complete step is discovery-only (may have no rows)" - - "Backward hooks are off by default" + - "第一个完整 step 为 discovery-only,可能无数据行" + - "默认仅 forward hook;backward hook 默认关闭" python.comm_collective: - description: "torch.distributed collective calls (all_reduce, broadcast, …)" + description: "torch.distributed 集合通信调用记录(all_reduce、broadcast 等)" synonyms: [collective, communication, NCCL, 通信, all_reduce] key_columns: - global_step: "Global training step" - local_step: "Local step on this rank" + micro_step: "最细粒度步计数" + local_step: "本 rank 训练步" + global_step: "全局训练步" + micro_batches: "梯度累积因子" rank: "torch.distributed rank" - role: "Parallel role key, e.g. 'dp=2,pp=1,tp=0' (align/join across ranks)" - op: "Collective operation name" - duration_ms: "Wall time in milliseconds" - bytes: "Tensor bytes communicated" + world_size: "world size" + role: "并行角色键" + op: "集合通信算子名" + group_rank: "进程组内 rank" + group_size: "进程组大小" + participate_ranks: "参与 rank 列表(JSON 数组字符串)" + tensor_shape: "张量 shape 字符串" + tensor_dtype: "张量 dtype" + bytes: "通信字节数" + duration_ms: "墙钟耗时(毫秒)" + async_op: "1=异步 collective,0=同步" global_name: global.python.comm_collective federation_columns: [_host, _addr, _rank, _role] python.trace_event: - description: "Span start/end and custom events (distributed tracing)" + description: "分布式 tracing:span 起止与自定义 event(python.tracing)" synonyms: [trace, span, timeline, 链路] key_columns: record_type: "span_start | span_end | event" - trace_id: "Trace id shared by related spans" - span_id: "Unique span id" - name: "Span or event name" - time: "Timestamp (nanoseconds since epoch)" + trace_id: "同一 trace 内共享的 trace id" + span_id: "span 唯一 id" + parent_id: "父 span id(-1 表示无)" + name: "span 或 event 名称" + phase: "训练阶段:forward | backward | optimizer(可为空)" + time: "时间戳(纳秒,epoch)" + thread_id: "记录线程 id" + location: "源码位置(file:line)" + attributes: "JSON 元数据(rank、local_step 等)" + event_attributes: "event 专用 JSON 属性" + notes: + - "与 span_end 按 span_id join 可算 duration" + - "物化视图见 python.tracing.table.SPANS_SQL" python.backtrace: - description: "Live mixed Python + native stack (point-in-time, not historical)" + description: "混合 Python + native 调用栈快照(即时采集,非历史表)" synonyms: [stack, backtrace, 调用栈, hang stack] key_columns: - func: "Function name" - file: "Source file" - lineno: "Line number" - depth: "Stack depth (0 = innermost)" - frame_type: "python | native" + ip: "native 帧指令指针(Python 帧为 NULL)" + file: "源文件路径" + func: "函数/符号名" + lineno: "行号" + depth: "栈深度(0=最内层)" + frame_type: "Python | Native | Rust" + notes: + - "通过 probing backtrace 或 inject 后 SELECT 填充" + + python.variables: + description: "TorchProbe 变量追踪快照(需启用 vars/watch)" + synonyms: [variable trace, watch, 变量快照] + key_columns: + micro_step: "训练 micro-step" + func: "函数名" + name: "变量名" + value: "变量值的字符串表示" + notes: + - "与 python.trace_variables 不同;后者记录调试器 watch 变更" + + python.trace_variables: + description: "调试器 watch 触发的变量变更记录" + synonyms: [trace variables, watch changes, 变量变更] + key_columns: + function_name: "发生变更的函数名" + filename: "源文件" + lineno: "行号" + variable_name: "变量名" + value: "变更后的值(字符串)" + value_type: "值类型名" cpu.utilization: - description: "Host CPU and RSS sampling (process and top threads)" - synonyms: [cpu, host memory, RSS, 主机内存] + description: "主机 CPU / RSS 周期采样(进程级 + Top-N 线程)" + synonyms: [cpu, host memory, RSS, 主机 CPU] key_columns: - ts: "Sample timestamp (microseconds)" + ts: "采样时间戳(微秒 since epoch)" scope: "process | thread" - rss_kb: "Resident set size (KB) — process scope only" - cpu_total_pct: "CPU utilization percentage" - comm: "Thread/process name" - wchan: "Kernel wait channel (Linux)" + platform: "采样后端(linux | macos)" + tid: "线程 id(process scope 时为 0)" + comm: "进程/线程名" + wall_ns: "距上次采样的墙钟间隔(纳秒)" + delta_user_ns: "用户态 CPU 增量(纳秒)" + delta_sys_ns: "内核态 CPU 增量(纳秒)" + delta_total_ns: "总 CPU 增量(纳秒)" + cpu_user_pct: "用户态 CPU 利用率(%)" + cpu_sys_pct: "内核态 CPU 利用率(%)" + cpu_total_pct: "总 CPU 利用率(%)" + cum_user_ns: "累计用户态 CPU 时间(纳秒)" + cum_sys_ns: "累计内核态 CPU 时间(纳秒)" + rss_kb: "常驻内存 RSS(KB);仅 process scope" + thread_count: "线程数;仅 process scope" + delta_vol_ctxt: "自愿上下文切换增量" + delta_invol_ctxt: "非自愿上下文切换增量" + state: "线程/进程状态(Linux)" + wchan: "内核 wait channel(Linux)" + + cpu.tasks: + description: "CPU Top-N 热点线程明细(与 cpu.utilization 同周期采样)" + synonyms: [cpu threads, top threads, 热点线程] + key_columns: + ts: "采样时间戳(微秒)" + platform: "linux | macos" + tid: "线程 id" + comm: "线程名" + state: "线程状态" + wchan: "内核 wait channel" + wall_ns: "采样间隔(纳秒)" + delta_user_ns: "用户态 CPU 增量(纳秒)" + delta_sys_ns: "内核态 CPU 增量(纳秒)" + delta_total_ns: "总 CPU 增量(纳秒)" gpu.utilization: - description: "GPU memory and utilization samples" + description: "GPU 显存与利用率周期采样" synonyms: [gpu memory, VRAM, 显存, GPU利用率] key_columns: - ts: "Sample timestamp" - used_bytes: "Device memory used" - total_bytes: "Device memory total" - mem_used_pct: "Memory used percentage" - gpu_util_pct: "GPU compute utilization (-1 if unavailable)" + ts: "采样时间戳(微秒)" + backend: "cuda | mps | …" + device_id: "设备序号" + name: "设备名称" + memory_model: "显存型号描述" + chip: "芯片/架构标识" + free_bytes: "空闲显存(字节)" + total_bytes: "总显存(字节)" + used_bytes: "已用显存(字节)" + mem_used_pct: "显存使用率(%)" + gpu_util_pct: "GPU 计算利用率(%;不可用为 -1)" + mem_controller_util_pct: "显存控制器利用率(NVIDIA)" + renderer_util_pct: "渲染引擎利用率(Apple MPS)" + tiler_util_pct: "Tiler 利用率(Apple MPS)" + driver_mem_bytes: "驱动保留显存(字节)" + wall_ns: "采样间隔(纳秒)" process.kmsg: - description: "Linux kernel ring buffer (dmesg) — OOM killer, GPU Xid, IB errors" + description: "Linux 内核 ring buffer(dmesg)— OOM、GPU Xid、IB 错误等" synonyms: [kernel log, dmesg, OOM, 内核日志] platform: linux key_columns: - timestamp: "Event time" - level: "Log level" - message: "Kernel message text" + timestamp: "内核日志时间(微秒)" + facility: "syslog facility" + level: "日志级别" + message: "内核消息正文" cluster.nodes: - description: "Registered distributed training peers" + description: "已注册的分布式训练 peer(torchrun / PUT /apis/nodes)" synonyms: [cluster, nodes, ranks, 集群节点] key_columns: - rank: "Global rank" - host: "Hostname" - addr: "probing HTTP address" - role: "Parallel role key, e.g. dp=2,pp=1,tp=0 (federation _role source)" - status: "Node status" + host: "主机名" + addr: "probing HTTP 地址" + local_rank: "节点内 local rank" + rank: "全局 rank" + world_size: "world size" + group_rank: "进程组 rank" + group_world_size: "进程组大小" + role_name: "Torchrun / Elastic role 名" + role_rank: "role 内 rank" + role_world_size: "role 内 world size" + role: "并行角色键(federation _role 来源)" + status: "节点状态" + timestamp: "最后更新时间(微秒)" + + rdma.mlx_hca: + description: "InfiniBand/RoCE HCA 端口计数器快照(/sys/class/infiniband)" + synonyms: [IB, RoCE, HCA, mlx, RDMA counters] + platform: linux + key_columns: + hca_name: "HCA 设备名(如 mlx5_0)" + port_rcv_packets: "端口接收包计数" + port_rcv_data: "端口接收字节计数" + port_xmit_packets: "端口发送包计数" + port_xmit_data: "端口发送字节计数" + link_downed: "链路 down 次数" + np_cnp_sent: "RoCE CNP 发送计数" + np_ecn_marked_roce_packets: "ECN 标记 RoCE 包计数" + rcv_pkts_rate: "接收包速率(包/秒,两次采样差分)" + snd_pkts_rate: "发送包速率(包/秒)" + notes: + - "需配置 rdma.hca.name 与 rdma.sample.rate" nccl.proxy_ops: - description: "NCCL profiler plugin proxy-op wait decomposition (culprit vs victim)" + description: "NCCL profiler plugin proxy-op wait 分解(culprit / victim 归因)" synonyms: [NCCL proxy, send_gpu_wait, recv_wait, culprit, victim, proxy wait] key_columns: - ts: "Event timestamp (nanoseconds)" + ts: "事件时间戳(纳秒)" rank: "torch.distributed rank" - tp_rank: "Tensor-parallel rank (-1 if unknown)" - pp_rank: "Pipeline-parallel rank (-1 if unknown)" - dp_rank: "Data-parallel rank (-1 if unknown)" + tp_rank: "张量并行 rank(未知 -1)" + pp_rank: "流水线并行 rank(未知 -1)" + dp_rank: "数据并行 rank(未知 -1)" comm_hash: "NCCL communicator hash" - coll_func: "Collective name (AllReduce, AllGather, …)" - seq: "Collective sequence number" + coll_func: "集合通信名(AllReduce、AllGather…)" + seq: "collective 序号" channel_id: "NCCL channel id" - peer: "Peer rank for this proxy op" - is_send: "1 if send proxy, 0 if recv" - n_steps: "ProxyStep count aggregated" - trans_bytes: "Bytes transferred" - send_gpu_wait_ns: "Culprit signal — local GPU not ready to send" - send_wait_ns: "Send-side network wait" - recv_wait_ns: "Victim signal — waiting on peer data" - recv_flush_wait_ns: "Recv flush wait" + peer: "对端 rank" + is_send: "1=send proxy,0=recv proxy" + n_steps: "聚合的 ProxyStep 数" + trans_bytes: "传输字节数" + send_gpu_wait_ns: "Culprit 信号 — 本地 GPU 未就绪发送" + send_wait_ns: "发送侧网络等待" + recv_wait_ns: "Victim 信号 — 等待对端数据" + recv_flush_wait_ns: "接收 flush 等待" global_name: global.nccl.proxy_ops federation_columns: [_host, _addr, _rank, _role] notes: - - "Requires NCCL_PROFILER_PLUGIN + NCCL ≥ 2.26 (mask 26: Coll|ProxyOp|ProxyStep)" - - "macOS dev: PROBING_NCCL_MOCK=1 seeds synthetic culprit/victim pattern" + - "需 NCCL_PROFILER_PLUGIN + NCCL ≥ 2.26(mask Coll|ProxyOp|ProxyStep)" + - "macOS 开发:PROBING_NCCL_MOCK=1 可注入合成数据" nccl.net_qp: - description: "NCCL NetPlugin IB QP completion timing (optional mask bit 128)" + description: "NCCL NetPlugin IB QP 完成耗时(可选 mask bit 128)" synonyms: [IB QP, RoCE, net plugin, qp duration] key_columns: - ts: "Event timestamp (nanoseconds)" + ts: "事件时间戳(纳秒)" rank: "torch.distributed rank" - device: "IB device index" - qp_num: "Queue pair number" - wr_id: "Work request id" + device: "IB 设备索引" + qp_num: "Queue Pair 号" + wr_id: "Work Request id" opcode: "IB opcode" - length: "Transfer length" - duration_ns: "QP completion duration" + length: "传输长度(字节)" + duration_ns: "QP 完成耗时(纳秒)" global_name: global.nccl.net_qp federation_columns: [_host, _addr, _rank, _role] + + hccl.host_ops: + description: "HCCL MSProf Host API 时间线(集合通信 op、ACL、task master/slave)" + synonyms: [HCCL host, MSProf API, host_hccl_op, task_master] + key_columns: + ts: "结束时间(CANN sys cycle)" + begin_ns: "开始时间" + end_ns: "结束时间" + duration_ns: "耗时 end - begin" + thread_id: "上报线程 id" + level: "MSProf level" + type_id: "MSProf type id" + item_id: "名称 hash" + item_name: "解码名称(hcom_allReduce_、Memcpy 等)" + event_class: "host_hccl_op | task_master | task_slave | host_acl | node_launch" + aging: "MSProf aging flag" + notes: + - "来源:libprofapi.so shim 拦截 MsprofReportApi" + - "需开启 CANN/HCCL profiling" + + hccl.collectives: + description: "HCCL 集合通信元数据与 Host 耗时(row_source 区分 api/compact 行)" + synonyms: [HCCL collective, hcom_allReduce, HcclOpInfo] + key_columns: + ts: "事件时间" + thread_id: "上报线程" + row_source: "api=耗时行;compact=count/group/alg 参数行" + begin_ns: "开始时间(api 行)" + end_ns: "结束时间(api 行)" + duration_ns: "耗时(api 行)" + op_hash: "算子名 hash(api 行)" + op_name: "算子名(api 行)" + group_hash: "comm group 名 hash(compact 行)" + alg_hash: "算法名 hash(compact 行)" + count: "元素个数(compact 行)" + data_type: "HcclDataType enum" + relay: "HCCL relay 标志" + retry: "HCCL retry 计数" + compact_type: "MsprofReportCompactInfo type id" + notes: + - "api 与 compact 行按 thread_id + 邻近 ts JOIN" + + hccl.tasks: + description: "HCCL 设备侧 task 明细(MsprofHcclInfo L1)" + synonyms: [HCCL task, RDMASend, Memcpy, Notify_Wait] + key_columns: + ts: "上报时间戳" + thread_id: "上报线程" + info_type: "AdditionalInfo type id" + info_level: "AdditionalInfo level" + info_type_name: "RegTypeInfo 注册名(如 hccl_info)" + item_id: "task 类型 hash" + task_name: "task 类型名(Memcpy、RDMASend…)" + ccl_tag: "CCL tag hash" + group_name: "comm group hash" + local_rank: "本端 rank" + remote_rank: "对端 rank(-1 表示 N/A)" + rank_size: "通信组大小" + workflow_mode: "HCCL workflow mode enum" + plane_id: "原始 plane 编码" + plane_index: "plane 索引(plane_id bits 28-31)" + rank_in_plane: "plane 内 rank(bits 0-15)" + rank_size_plane: "plane 宽度(bits 16-27)" + ctx_id: "FFTS context id" + notify_id: "notify 对象 id" + stage: "流水线 stage" + role: "task 角色 enum" + data_size: "传输字节数" + op_type: "操作类型 enum" + data_type: "数据类型 enum" + link_type: "链路类型" + transport_type: "传输类型" + rdma_type: "RDMA 类型" + duration_est_us: "HCCL 估算耗时(微秒)" + payload_len: "原始 AdditionalInfo payload 长度" + global_name: global.hccl.tasks + federation_columns: [_host, _addr, _rank, _role] + + hccl.mc2_streams: + description: "HCCL MC2 communicator stream 拓扑快照" + synonyms: [MC2, comm streams, aicpu stream] + key_columns: + ts: "上报时间" + thread_id: "上报线程" + info_type: "MSProf AdditionalInfo type" + group_hash: "comm group 名 hash" + rank_size: "组内 rank 数" + rank_id: "rank id" + usr_rank_id: "用户可见 rank id" + aicpu_kfc_stream_id: "KFC stream id" + comm_stream_size: "comm stream 数量" + comm_stream_ids: "逗号分隔的 stream id 列表" + + hccl.context_ids: + description: "HCCL FFTS context id 范围(dispatch 时上报)" + synonyms: [FFTS context, context id] + key_columns: + ts: "上报时间" + thread_id: "上报线程" + info_type: "MSProf AdditionalInfo type" + ctx_id_num: "context 数量(HCCL 固定报 2)" + ctx_id_min: "范围起点(通常 0)" + ctx_id_max: "范围终点(ctxIdMax)" diff --git a/src/lib.rs b/src/lib.rs index 9367759e..13e695b3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,7 +5,7 @@ use anyhow::Result; use pyo3::prelude::*; use probing_core::{install_panic_hook, register_python_main_thread}; -use probing_python::extensions::python::ExternalTable; +use probing_python::extensions::python::{register_table_docs, ExternalTable}; use probing_python::features::config; use probing_python::features::python_api::{cli_main, query_json}; use probing_python::features::tracing; @@ -148,6 +148,14 @@ fn cleanup() { } } +/// Start the in-process engine and local query server (same as normal `PROBING=1` startup). +/// +/// Used when `PROBING_CLI_MODE=1` skipped the `#[ctor]` hook so docs can be registered first. +#[pyfunction] +fn start_local() { + probing_server::start_local(); +} + /// Python module entry point - exported as probing._core #[pymodule(gil_used = true)] fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { @@ -165,6 +173,7 @@ fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { // Register all classes m.add_class::()?; + m.add_function(wrap_pyfunction!(register_table_docs, m)?)?; m.add_class::()?; // Register all functions @@ -182,6 +191,7 @@ fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { use probing_python::features::python_api::{is_enabled, should_enable_probing}; m.add_function(wrap_pyfunction!(is_enabled, m)?)?; m.add_function(wrap_pyfunction!(should_enable_probing, m)?)?; + m.add_function(wrap_pyfunction!(start_local, m)?)?; // Register config functions directly to the module (flattened) config::register_config_functions(m)?; diff --git a/tests/regression/core/test_table_docs.py b/tests/regression/core/test_table_docs.py new file mode 100644 index 00000000..98af4268 --- /dev/null +++ b/tests/regression/core/test_table_docs.py @@ -0,0 +1,83 @@ +"""Tests for code-first table documentation (@table + register_table_docs).""" + +from __future__ import annotations + +from dataclasses import dataclass, field + +import probing +from probing.core.table import ( + _column_docs_from_class, + _table_doc_from_class, +) + + +def test_table_doc_from_class_first_line(): + @dataclass + class Demo: + """First line summary. + + More details ignored. + """ + + x: int + + assert _table_doc_from_class(Demo) == "First line summary." + + +def test_table_doc_from_class_missing(): + @dataclass + class NoDoc: + x: int + + assert _table_doc_from_class(NoDoc) is None + + +def test_column_docs_from_field_metadata(): + @dataclass + class Demo: + x: int = field(metadata={"doc": "X coordinate"}) + y: int = field(metadata={"other": "ignored"}) + + assert _column_docs_from_class(Demo) == {"x": "X coordinate"} + + +def test_table_decorator_registers_docs(monkeypatch): + import importlib + + table_mod = importlib.import_module("probing.core.table") + table_mod.cache.clear() + table_name = f"decorated_doc_{id(object())}" + captured: dict = {} + + def capture_register(qualified, table_doc, column_docs): + captured["qualified"] = qualified + captured["table_doc"] = table_doc + captured["column_docs"] = column_docs or {} + return probing._core.register_table_docs(qualified, table_doc, column_docs) + + monkeypatch.setattr(probing, "register_table_docs", capture_register) + + @table_mod.table(table_name) + @dataclass + class DecoratedMetrics: + """Decorated metrics table.""" + + latency_ms: float = field(metadata={"doc": "latency milliseconds"}) + + assert captured["qualified"] == f"python.{table_name}" + assert captured["table_doc"] == "Decorated metrics table." + assert captured["column_docs"]["latency_ms"] == "latency milliseconds" + + DecoratedMetrics.drop() + table_mod.cache.clear() + + +def test_builtin_hccl_docs_in_engine_catalog(): + """HCCL code-first docs are baked into the semantic catalog at engine build.""" + df = probing.query( + "SELECT description FROM probe.probing.column_docs " + "WHERE table_schema = 'hccl' AND table_name = 'tasks' " + "AND column_name = 'task_name'" + ) + assert len(df) == 1 + assert "Memcpy" in str(df["description"].iloc[0]) diff --git a/tests/regression/core/test_table_docs_integration.py b/tests/regression/core/test_table_docs_integration.py new file mode 100644 index 00000000..2a82e94b --- /dev/null +++ b/tests/regression/core/test_table_docs_integration.py @@ -0,0 +1,191 @@ +"""Integration tests for code-first table docs through the live probing engine.""" + +from __future__ import annotations + +import json +import os +import subprocess +import sys +import tempfile + +import probing + + +def _python_path_env(*, defer_engine_init: bool = False) -> dict[str, str]: + env = os.environ.copy() + # Do not inherit PROBING=1: wheel probing.pth site-hook would import probing + # (and initialize the engine) before the subprocess script sets PROBING_CLI_MODE. + env.pop("PROBING", None) + env.pop("PROBING_ORIGINAL", None) + if defer_engine_init: + env["PROBING_CLI_MODE"] = "1" + else: + env.pop("PROBING_CLI_MODE", None) + return env + + +def _run_fresh_probing_script( + body: str, *, defer_engine_init: bool = False +) -> subprocess.CompletedProcess[str]: + cli_mode_line = ( + 'os.environ["PROBING_CLI_MODE"] = "1"' + if defer_engine_init + else 'os.environ.pop("PROBING_CLI_MODE", None)' + ) + script = f""" +import json +import os +import sys +import tempfile + +os.environ["PROBING"] = "1" +{cli_mode_line} +os.environ["PROBING_DATA_DIR"] = tempfile.mkdtemp(prefix="probing_doc_it_") + +{body} +""" + with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as handle: + handle.write(script) + script_path = handle.name + try: + return subprocess.run( + [sys.executable, script_path], + env=_python_path_env(defer_engine_init=defer_engine_init), + capture_output=True, + text=True, + timeout=60, + ) + finally: + os.unlink(script_path) + + +def test_register_table_docs_visible_in_catalog_subprocess(): + """Fresh process: register_table_docs before first query lands in column_docs.""" + table = f"manual_reg_{os.getpid()}" + result = _run_fresh_probing_script( + f""" +from probing import _core +table = "{table}" +_core.register_table_docs( + f"python.{{table}}", + "Manual registration table", + {{"payload": "json payload column"}}, +) +_core.start_local() + +import probing +ext = probing.ExternalTable.get_or_create(table, ["payload"]) +ext.append(["{{}}"]) + +df = probing.query( + "SELECT description FROM probe.probing.column_docs " + f"WHERE table_schema = 'python' AND table_name = '{{table}}' " + "AND column_name = 'payload'" +) +assert len(df) == 1 +assert "json payload" in str(df["description"].iloc[0]) +tbl = probing.query( + "SELECT description FROM probe.probing.table_docs " + f"WHERE table_schema = 'python' AND table_name = '{{table}}'" +) +assert len(tbl) == 1 +assert "Manual registration" in str(tbl["description"].iloc[0]) +print("OK") +""", + defer_engine_init=True, + ) + assert result.returncode == 0, result.stdout + result.stderr + assert "OK" in result.stdout + + +def test_table_decorator_docs_visible_in_catalog_subprocess(): + """@table metadata is registered before the engine catalog is built.""" + result = _run_fresh_probing_script( + """ +from dataclasses import dataclass, field +import importlib + +table_mod = importlib.import_module("probing.core.table") + +@table_mod.table("subproc_metrics") +@dataclass +class Metrics: + \"\"\"Subprocess metrics table.\"\"\" + score: float = field(metadata={"doc": "model score"}) + rank: int = field(metadata={"doc": "process rank"}) + +Metrics.append(Metrics(0.75, 2)) + +from probing import _core +_core.start_local() + +import probing +score = probing.query( + "SELECT description FROM probe.probing.column_docs " + "WHERE table_schema = 'python' AND table_name = 'subproc_metrics' " + "AND column_name = 'score'" +) +assert len(score) == 1 +assert "model score" in str(score["description"].iloc[0]) +tbl = probing.query( + "SELECT description FROM probe.probing.table_docs " + "WHERE table_schema = 'python' AND table_name = 'subproc_metrics'" +) +assert len(tbl) == 1 +assert "Subprocess metrics" in str(tbl["description"].iloc[0]) +print("OK") +""", + defer_engine_init=True, + ) + assert result.returncode == 0, result.stdout + result.stderr + assert "OK" in result.stdout + + +def test_describe_builtin_hccl_via_query(): + df = probing.query("DESCRIBE probe.probing.column_docs") + assert "comment" in df.columns + assert "table_comment" in df.columns + assert "column_name" in df.columns + assert "description" in df["column_name"].tolist() + + +def test_hccl_catalog_and_select_roundtrip(): + """Builtin HCCL docs are queryable; YAML synonyms remain on table_docs.""" + col = probing.query( + "SELECT description FROM probe.probing.column_docs " + "WHERE table_schema = 'hccl' AND table_name = 'tasks' " + "AND column_name = 'local_rank'" + ) + assert len(col) == 1 + assert "rank" in str(col["description"].iloc[0]).lower() + + meta = probing.query( + "SELECT description, synonyms FROM probe.probing.table_docs " + "WHERE table_schema = 'nccl' AND table_name = 'proxy_ops'" + ) + assert len(meta) == 1 + assert "culprit" in str(meta["description"].iloc[0]).lower() or "NCCL" in str( + meta["description"].iloc[0] + ) + assert "proxy" in str(meta["synonyms"].iloc[0]).lower() + + +def test_describe_json_shape_subprocess(): + """Sanity-check DESCRIBE rewrite columns in an isolated process.""" + result = _run_fresh_probing_script( + """ +import json +import probing +df = probing.query("DESCRIBE probe.probing.table_docs") +payload = { + "columns": list(df.columns), + "rows": len(df), +} +print(json.dumps(payload)) +""" + ) + assert result.returncode == 0, result.stdout + result.stderr + payload = json.loads(result.stdout.strip().splitlines()[-1]) + assert payload["rows"] > 0 + assert "comment" in payload["columns"] + assert "table_comment" in payload["columns"] diff --git a/tests/regression/ext/test_comm_collective.py b/tests/regression/ext/test_comm_collective.py index eba1a7e1..0e56e943 100644 --- a/tests/regression/ext/test_comm_collective.py +++ b/tests/regression/ext/test_comm_collective.py @@ -96,5 +96,4 @@ def test_comm_lite_writes_trace_event(): ] by_type = {row["record_type"]: row for row in rows} assert by_type["span_start"]["name"] == "all_reduce" - assert by_type["span_start"]["kind"] == "comm.all_reduce" assert by_type["span_end"]["span_id"] == by_type["span_start"]["span_id"] diff --git a/tests/regression/ext/test_parallel_topology.py b/tests/regression/ext/test_parallel_topology.py index 6eced3b7..213a2210 100644 --- a/tests/regression/ext/test_parallel_topology.py +++ b/tests/regression/ext/test_parallel_topology.py @@ -58,8 +58,8 @@ def test_span_includes_parallel_fields(monkeypatch): assert attrs["dp_rank"] == 5 -def test_comm_kind(): - from probing.tracing import comm_kind +def test_comm_label(): + from probing.profiling.collective.record import _comm_label - assert comm_kind("all_reduce") == "comm.all_reduce" - assert comm_kind("comm.broadcast") == "comm.broadcast" + assert _comm_label("all_reduce") == "comm.all_reduce" + assert _comm_label("comm.broadcast") == "comm.broadcast" diff --git a/tests/regression/ext/test_phase_tracker.py b/tests/regression/ext/test_phase_tracker.py new file mode 100644 index 00000000..84618d13 --- /dev/null +++ b/tests/regression/ext/test_phase_tracker.py @@ -0,0 +1,128 @@ +"""Phase tracker: model + optimizer hooks drive training spans.""" + +from __future__ import annotations + +import dataclasses + +import pytest +import torch +import torch.nn as nn +import torch.nn.functional as F + +import probing + + +@pytest.fixture(autouse=True) +def _reset_trace_and_phases(): + from probing.profiling import phase_tracker + from probing.tracing import TraceEvent, bind_table, reset_backends + from probing.tracing.phases import reset_phase + + for (_mid, _oid), tracker in list(phase_tracker._REGISTRY.items()): + phase_tracker.detach_training_phases(tracker.model, tracker.optimizer) + phase_tracker._REGISTRY.clear() + reset_phase() + + try: + TraceEvent.drop() + except Exception: + pass + TraceEvent.init_table() + reset_backends(clear_registered=True) + bind_table(TraceEvent) + yield + reset_backends(clear_registered=True) + + +def _trace_rows(n: int = 100) -> list[dict]: + from probing.tracing import TraceEvent + + fields = [f.name for f in dataclasses.fields(TraceEvent)] + return [dict(zip(fields, data)) for _ts, data in TraceEvent.take(n)] + + +def _closed_span_names(rows: list[dict]) -> list[str]: + starts = { + r["span_id"]: r["name"] for r in rows if r.get("record_type") == "span_start" + } + ends = {r["span_id"] for r in rows if r.get("record_type") == "span_end"} + return [starts[sid] for sid in ends if sid in starts] + + +class TinyNet(nn.Module): + def __init__(self) -> None: + super().__init__() + self.fc = nn.Linear(4, 2) + + def forward(self, x): + return self.fc(x) + + +def test_phase_hooks_emit_training_spans(): + model = TinyNet() + opt = torch.optim.SGD(model.parameters(), lr=0.01) + probing.attach_training_phases(model, opt) + + x = torch.randn(2, 4) + y = torch.tensor([0, 1]) + out = model(x) + loss = F.cross_entropy(out, y) + loss.backward() + opt.step() + + names = _closed_span_names(_trace_rows()) + assert "forward" in names + assert "backward" in names + assert "optimizer" in names + assert "train.step" in names + + +def test_phase_advances_on_optimizer_step(): + probing.step(0) + model = TinyNet() + opt = torch.optim.SGD(model.parameters(), lr=0.01) + probing.attach_training_phases(model, opt) + + x = torch.randn(2, 4) + y = torch.tensor([0, 1]) + out = model(x) + loss = F.cross_entropy(out, y) + loss.backward() + opt.step() + + assert probing.step.micro_step == 1 + + +def test_phase_idle_outside_training(): + assert probing.phase() == "idle" + + +def test_span_phase_drives_state_without_hooks(): + from probing.tracing.phases import FORWARD + + with probing.span("forward", phase=FORWARD): + assert probing.phase() == "forward" + assert probing.phase() == "idle" + + +def test_manual_forward_span_suppresses_hook_duplicate(): + model = TinyNet() + opt = torch.optim.SGD(model.parameters(), lr=0.01) + probing.attach_training_phases(model, opt) + + with probing.span("batch"): + x = torch.randn(2, 4) + y = torch.tensor([0, 1]) + with probing.span("forward"): + out = model(x) + loss = F.cross_entropy(out, y) + loss.backward() + opt.step() + + rows = _trace_rows() + forward_starts = [ + r + for r in rows + if r.get("record_type") == "span_start" and r.get("name") == "forward" + ] + assert len(forward_starts) == 1 diff --git a/tests/regression/ext/test_step_context.py b/tests/regression/ext/test_step_context.py index 7b7374ec..0a02ff2a 100644 --- a/tests/regression/ext/test_step_context.py +++ b/tests/regression/ext/test_step_context.py @@ -1,57 +1,57 @@ import pytest import probing -from probing.tracing import ( - TRAIN_STEP_KIND, - advance_local_step, - set_step_bucket_size, - step_snapshot, - sync_local_step, -) +from probing.tracing.phases import OPTIMIZER, reset_phase @pytest.fixture(autouse=True) def reset_step_context(): - sync_local_step(0) - set_step_bucket_size(1) + reset_phase() + probing.step(0) + probing.step(micro_batches=1) yield - sync_local_step(0) - set_step_bucket_size(1) + probing.step(0) + probing.step(micro_batches=1) -def test_step_snapshot_and_bucket(): - set_step_bucket_size(10) - sync_local_step(0) - snap = step_snapshot() +def test_step_snapshot_and_micro_batches(): + probing.step(0) + probing.step(micro_batches=10) + snap = probing.step.snapshot() + assert snap.micro_step == 0 assert snap.local_step == 0 assert snap.global_step == 0 - assert snap.bucket_size == 10 + assert snap.micro_batches == 10 - sync_local_step(15) - snap = step_snapshot() - assert snap.local_step == 15 - assert snap.global_step == 1 + probing.step(15) + assert probing.step.micro_step == 15 + assert probing.step.local_step == 1 + assert probing.step.global_step == 1 -def test_advance_local_step(): - sync_local_step(0) - snap = advance_local_step() - assert snap.local_step == 1 - assert snap.global_step == 1 +def test_advance_micro_step(): + probing.step(0) + probing.step() + assert probing.step.micro_step == 1 + assert probing.step.local_step == 1 + assert probing.step.global_step == 1 -def test_train_step_span_injects_coordinates(): - with probing.span("batch", kind=TRAIN_STEP_KIND) as s: - assert s.kind == TRAIN_STEP_KIND +def test_optimizer_span_injects_coordinates(): + with probing.span("step", phase=OPTIMIZER) as s: + assert s.phase == OPTIMIZER attrs = dict(s.get_attributes()) + assert attrs["micro_step"] == 0 assert attrs["local_step"] == 0 assert attrs["global_step"] == 0 assert attrs["source"] == "manual" -def test_nested_train_step_is_reentrant(): - sync_local_step(3) - with probing.span("outer", kind=TRAIN_STEP_KIND) as outer: - with probing.span("inner", kind=TRAIN_STEP_KIND) as inner: +def test_nested_optimizer_span_is_reentrant(): + probing.step(3) + with probing.span("outer", phase=OPTIMIZER) as outer: + with probing.span("inner", phase=OPTIMIZER) as inner: assert inner.span_id == outer.span_id - assert step_snapshot().local_step == 4 + assert probing.step.micro_step == 4 + assert probing.step.local_step == 4 + assert probing.step.global_step == 4 diff --git a/tests/regression/ext/test_tracing_span.py b/tests/regression/ext/test_tracing_span.py index 543275b2..ac428306 100644 --- a/tests/regression/ext/test_tracing_span.py +++ b/tests/regression/ext/test_tracing_span.py @@ -1,3 +1,4 @@ +import dataclasses import time import pytest @@ -5,6 +6,42 @@ import probing +@pytest.fixture(autouse=True) +def _reset_trace_event_table(): + """Isolate memtable rows so persistence tests are deterministic.""" + from probing.tracing import TraceEvent, bind_table, reset_backends + from probing.tracing.phases import reset_phase + + reset_phase() + + try: + TraceEvent.drop() + except Exception: + pass + TraceEvent.init_table() + reset_backends(clear_registered=True) + bind_table(TraceEvent) + yield + reset_backends(clear_registered=True) + + +def _trace_event_rows(n: int = 50) -> list[dict]: + from probing.tracing import TraceEvent + + fields = [f.name for f in dataclasses.fields(TraceEvent)] + return [dict(zip(fields, data)) for _ts, data in TraceEvent.take(n)] + + +def _span_duration_ns(rows: list[dict], span_id: int) -> int | None: + starts = {r["span_id"]: r for r in rows if r.get("record_type") == "span_start"} + ends = {r["span_id"]: r for r in rows if r.get("record_type") == "span_end"} + start = starts.get(span_id) + end = ends.get(span_id) + if start is None or end is None: + return None + return int(end["time"]) - int(start["time"]) + + def test_context_manager_basic(): with probing.span("root") as s: assert s.name == "root" @@ -56,18 +93,17 @@ def test_current_span_stack_behavior(): def test_property_immutability(): - with probing.span("immutable", kind="op") as s: + with probing.span("immutable", phase="forward") as s: original_id = s.span_id with pytest.raises(AttributeError): - s.name = "changed" # should not allow reassignment + s.name = "changed" with pytest.raises(AttributeError): - s.kind = "other" + s.phase = "other" with pytest.raises(AttributeError): s.span_id = 123 - # ensure values unchanged assert s.span_id == original_id assert s.name == "immutable" - assert s.kind == "op" + assert s.phase == "forward" def test_events_recording(): @@ -80,6 +116,70 @@ def test_events_recording(): assert events[1]["name"] == "e2" assert events[1]["attributes"]["k"] == "v" + rows = _trace_event_rows() + event_rows = [r for r in rows if r.get("record_type") == "event"] + assert len(event_rows) == 2 + assert {r["name"] for r in event_rows} == {"e1", "e2"} + + +def test_span_persists_start_end_pair_to_trace_event(): + with probing.span("persist_me", phase="forward") as s: + span_id = s.span_id + trace_id = s.trace_id + + rows = _trace_event_rows() + starts = [r for r in rows if r.get("record_type") == "span_start"] + ends = [r for r in rows if r.get("record_type") == "span_end"] + assert len(starts) == 1 + assert len(ends) == 1 + assert starts[0]["span_id"] == span_id + assert starts[0]["trace_id"] == trace_id + assert starts[0]["name"] == "persist_me" + assert starts[0]["phase"] == "forward" + assert ends[0]["span_id"] == span_id + duration_ns = _span_duration_ns(rows, span_id) + assert duration_ns is not None + assert duration_ns >= 0 + + +def test_nested_spans_persist_parent_links(): + with probing.span("parent") as parent: + with probing.span("child") as child: + child_id = child.span_id + parent_id = parent.span_id + + rows = _trace_event_rows() + child_start = next( + r + for r in rows + if r.get("record_type") == "span_start" and r.get("span_id") == child_id + ) + assert child_start["parent_id"] == parent_id + + +def test_decorator_persists_trace_event_rows(): + @probing.span("decor_persist") + def work(): + return 7 + + assert work() == 7 + rows = _trace_event_rows() + assert any( + r.get("record_type") == "span_start" and r.get("name") == "decor_persist" + for r in rows + ) + + +def test_manual_span_without_recorded_wrapper_does_not_persist(): + """Low-level ``Span`` is stack-only; integrators should use ``probing.span``.""" + from probing.tracing import Span + + parent = Span("manual_parent") + child = Span.new_child(parent, "manual_child") + child.end() + rows = _trace_event_rows() + assert rows == [] + def test_status_and_duration(): with probing.span("timed") as s: @@ -119,22 +219,10 @@ def test_manual_construction_and_child(): assert child.is_ended -def test_access_nonexistent_attribute_raises(): - with probing.span("attr") as s: - with pytest.raises(AttributeError): - _ = s.not_exist_field - - -# Ensure add_attr isn't exposed (immutability guarantee) -def test_no_add_attr_method(): - with probing.span("no_add") as s: - assert not hasattr(s, "add_attr") - assert not hasattr(s, "add_attr") - - def test_add_event_module_function(): """Test add_event module-level function.""" with probing.span("test_add_event") as s: + span_id = s.span_id probing.event("event1") probing.event("event2", attributes=[{"key": "value"}]) @@ -144,6 +232,28 @@ def test_add_event_module_function(): assert events[1]["name"] == "event2" assert events[1]["attributes"]["key"] == "value" + rows = _trace_event_rows() + persisted = [ + r + for r in rows + if r.get("record_type") == "event" and r.get("span_id") == span_id + ] + assert len(persisted) == 2 + assert {r["name"] for r in persisted} == {"event1", "event2"} + + +def test_access_nonexistent_attribute_raises(): + with probing.span("attr") as s: + with pytest.raises(AttributeError): + _ = s.not_exist_field + + +# Ensure add_attr isn't exposed (immutability guarantee) +def test_no_add_attr_method(): + with probing.span("no_add") as s: + assert not hasattr(s, "add_attr") + assert not hasattr(s, "add_attr") + def test_add_event_no_active_span(): """Test add_event raises error when no active span.""" @@ -156,32 +266,54 @@ def test_add_event_no_active_span(): probing.event("should_fail") -def test_event_inside_train_step_with_nested_spans(): - """Regression: batch train.step + nested spans + event (imagenet pattern).""" - from probing.tracing import TRAIN_STEP_KIND +def test_phase_inferred_from_name(): + from probing.tracing.phases import BACKWARD, FORWARD, OPTIMIZER + + with probing.span("forward") as s: + assert s.phase == FORWARD + with probing.span("step") as s: + assert s.phase == OPTIMIZER + with probing.span("custom.op") as s: + assert not s.phase + + +def test_explicit_phase_on_span(): + from probing.tracing.phases import BACKWARD + + with probing.span("compute", phase=BACKWARD) as s: + assert s.phase == BACKWARD + + +def test_inferred_phase_persists_to_trace_event(): + with probing.span("forward"): + pass + rows = _trace_event_rows() + start = next(r for r in rows if r.get("record_type") == "span_start") + assert start["phase"] == "forward" + + +def test_record_span_without_training_phase(): + probing.record_span("train.step", duration_ns=1_000_000) + rows = _trace_event_rows() + start = next( + r + for r in rows + if r.get("record_type") == "span_start" and r.get("name") == "train.step" + ) + assert start["phase"] in ("", None) or not start["phase"] + - with probing.span("batch", kind=TRAIN_STEP_KIND): - with probing.span("forward", kind="nn.forward"): - pass - with probing.span("loss", kind="compute"): - pass - with probing.span("backward", kind="nn.backward"): - pass - with probing.span("step", kind="optim.step"): - pass - probing.event( - "batch.stats", - attributes=[{"i": 0}, {"loss": 1.0}], - ) +def test_event_inside_training_phases_with_nested_spans(): + with probing.span("optimizer", phase="optimizer"): + probing.event("batch.stats", attributes=[{"i": 0}, {"loss": 1.0}]) -def test_train_step_reentrant_torch_probe_does_not_close_manual_span(): - """TorchProbe reentrant train.step must not end the outer span on step hook.""" +def test_optimizer_span_reentrant_with_torch_probe(): from probing.profiling.torch_probe import TorchProbe, TorchProbeConfig - from probing.tracing import TRAIN_STEP_KIND + from probing.tracing.phases import OPTIMIZER tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) - with probing.span("batch", kind=TRAIN_STEP_KIND) as outer: + with probing.span("outer", phase=OPTIMIZER) as outer: tracer._begin_train_step_span() assert not outer.is_ended tracer._end_train_step_span() @@ -191,11 +323,10 @@ def test_train_step_reentrant_torch_probe_does_not_close_manual_span(): def test_post_step_hook_does_not_reset_local_step_across_batches(): - """Regression: stale curr_step must not sync_local_step back to 0/1.""" from probing.profiling.torch_probe import TorchProbe, TorchProbeConfig - from probing.tracing import TRAIN_STEP_KIND, current_local_step, sync_local_step + from probing.tracing.phases import OPTIMIZER - sync_local_step(0) + probing.step(0) tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) tracer.finalized = True @@ -205,6 +336,6 @@ class FakeOpt: opt = FakeOpt() for expected in range(1, 6): - with probing.span("batch", kind=TRAIN_STEP_KIND): + with probing.span("step", phase=OPTIMIZER): tracer.post_step_hook(opt, (), {}) - assert current_local_step() == expected + assert probing.step.micro_step == expected diff --git a/tests/regression/rust/Cargo.toml b/tests/regression/rust/Cargo.toml index 48c8201f..3d13dd66 100644 --- a/tests/regression/rust/Cargo.toml +++ b/tests/regression/rust/Cargo.toml @@ -13,7 +13,7 @@ path = "src/lib.rs" pyo3-build-config = "0.29.0" [dependencies] -probing-core = { path = "../../../probing/core" } +probing-core = { path = "../../../probing/core", features = ["test-utils"] } probing-server = { path = "../../../probing/server", default-features = false } probing-memtable = { path = "../../../probing/memtable" } probing-cli = { path = "../../../probing/cli" } @@ -45,6 +45,10 @@ tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } name = "core_federation" path = "probing/core/federation_tests.rs" +[[test]] +name = "core_federation_explain" +path = "probing/core/federation_explain_tests.rs" + [[test]] name = "core_engine_complex" path = "probing/core/engine_complex_tests.rs" @@ -57,6 +61,10 @@ path = "probing/core/extension_routing_spec.rs" name = "core_distributed_storage" path = "probing/core/distributed_storage_integration.rs" +[[test]] +name = "core_table_docs_integration" +path = "probing/core/table_docs_integration.rs" + [[test]] name = "server_training_observability" path = "probing/server/training_observability_tests.rs" diff --git a/tests/regression/rust/probing/core/federation_explain_tests.rs b/tests/regression/rust/probing/core/federation_explain_tests.rs new file mode 100644 index 00000000..9e1e6ec4 --- /dev/null +++ b/tests/regression/rust/probing/core/federation_explain_tests.rs @@ -0,0 +1,222 @@ +//! Integration tests: federated routing + EXPLAIN plan shape (§4.2 path A/B/C). + +use std::sync::Arc; + +use probing_core::core::cluster::{reset_cluster_for_tests, update_node}; +use probing_core::core::federation::{ + classify_cluster_sql, classify_federated_sql, explain_federation, explain_physical_plan, + plan_federated_aggregate_pushdown, prepare_global_query, FederatedQueryPath, +}; +use probing_core::core::{Engine, ProbeDataSource}; +use probing_proto::prelude::Node; +use probing_rust_regression::test_helpers::{federation_test_lock, GenericTableProbeDataSource}; + +async fn metrics_engine(values: Vec) -> Engine { + std::env::set_var("PROBING_ADDRESS", "127.0.0.1:19999"); + std::env::set_var("HOSTNAME", "explain-coord"); + reset_cluster_for_tests(); + update_node(Node { + host: "explain-coord".into(), + addr: "127.0.0.1:19999".into(), + rank: Some(0), + ..Default::default() + }); + update_node(Node { + host: "explain-peer".into(), + addr: "127.0.0.1:20001".into(), + rank: Some(1), + ..Default::default() + }); + + let table = GenericTableProbeDataSource::single_column_table("metrics", "demo", "v", values); + Engine::builder() + .with_data_source(Arc::new(table) as Arc) + .build() + .await + .expect("engine") +} + +fn assert_plan_contains(plan: &str, needle: &str, context: &str) { + assert!( + plan.contains(needle), + "{context}: expected EXPLAIN to contain `{needle}`\n--- plan ---\n{plan}" + ); +} + +// --- Route classification (design §4.2 matrix) --- + +#[test] +fn route_matrix_aggregate_pushdown_comm_heatmap() { + let sql = "SELECT global_step, _rank, sum(duration_ms) AS comm_ms \ + FROM python.comm_collective \ + WHERE global_step >= 0 \ + GROUP BY global_step, _rank"; + assert_eq!( + classify_cluster_sql(sql), + FederatedQueryPath::AggregatePushdown + ); +} + +#[test] +fn route_matrix_federated_scan_raw_rows() { + let sql = "SELECT rank FROM python.comm_collective WHERE rank > 0 LIMIT 100"; + assert_eq!(classify_cluster_sql(sql), FederatedQueryPath::FederatedScan); +} + +#[test] +fn route_matrix_broadcast_join_compute_vs_comm() { + let sql = "SELECT c.global_step, sum(c.duration_ms) AS comm_ms \ + FROM python.comm_collective c \ + JOIN python.torch_trace t \ + ON c.global_step = t.global_step AND c.rank = t.rank \ + GROUP BY c.global_step"; + assert_eq!(classify_cluster_sql(sql), FederatedQueryPath::Broadcast); +} + +#[test] +fn route_matrix_broadcast_cte_slowdown() { + let sql = "WITH per_rank AS ( \ + SELECT global_step, _rank, max(duration_ms) AS max_ms \ + FROM python.comm_collective GROUP BY global_step, _rank \ + ) SELECT avg(max_ms) FROM per_rank"; + assert_eq!(classify_cluster_sql(sql), FederatedQueryPath::Broadcast); +} + +#[test] +fn route_matrix_local_probe_catalog() { + assert_eq!( + classify_federated_sql("SELECT v FROM probe.demo.metrics"), + FederatedQueryPath::Local + ); +} + +// --- EXPLAIN physical plan shape (path B) --- + +#[tokio::test] +async fn explain_federated_scan_exec_for_single_table_scan() { + let _lock = federation_test_lock().await; + let engine = metrics_engine(vec![1, 2, 3]).await; + + let sql = "SELECT v FROM global.demo.metrics WHERE v > 0"; + let plan = explain_physical_plan(&engine, &prepare_global_query(sql)) + .await + .expect("explain"); + + assert_plan_contains(&plan, "FederatedScanExec", "path B single-table scan"); + assert_plan_contains(&plan, "global.demo.metrics", "logical table scan"); + assert_plan_contains( + &plan, + "remote_sql=SELECT \"v\" FROM probe.demo.metrics", + "peer SQL uses probe catalog", + ); +} + +#[tokio::test] +async fn explain_federated_scan_with_peers_shows_peer_count() { + let _lock = federation_test_lock().await; + let engine = metrics_engine(vec![1, 2]).await; + + let sql = "SELECT v FROM global.demo.metrics"; + let plan = explain_physical_plan(&engine, &prepare_global_query(sql)) + .await + .expect("explain"); + + // One registered peer → FederatedScanExec: peers=1 + assert_plan_contains(&plan, "FederatedScanExec: peers=1", "peer partition count"); +} + +#[tokio::test] +async fn explain_aggregate_query_still_plans_federated_scan_underneath() { + let _lock = federation_test_lock().await; + let engine = metrics_engine(vec![1, 2, 3]).await; + + let sql = "SELECT sum(v) AS total FROM global.demo.metrics"; + let plan = explain_physical_plan(&engine, sql).await.expect("explain"); + + // DataFusion EXPLAIN: scan then aggregate locally on coordinator. + assert_plan_contains(&plan, "FederatedScanExec", "scan under aggregate"); + assert_plan_contains(&plan, "AggregateExec", "partial/global aggregate in plan"); +} + +// --- Path A pushdown plan contract (execution differs from EXPLAIN) --- + +#[test] +fn pushdown_plan_per_node_uses_probe_and_strips_tags() { + let global_sql = prepare_global_query( + "SELECT _host, sum(v) AS total FROM global.demo.metrics GROUP BY _host ORDER BY total DESC LIMIT 5", + ); + let plan = plan_federated_aggregate_pushdown(&global_sql).expect("pushdown plan"); + + assert!(plan.per_node_sql.contains("probe.demo.metrics")); + assert!(!plan.per_node_sql.contains("global.")); + assert!(!plan.per_node_sql.to_uppercase().contains("_HOST")); + assert!(!plan.per_node_sql.to_uppercase().contains("ORDER BY")); + assert!(!plan.per_node_sql.to_uppercase().contains("LIMIT")); + let tail = plan.post_merge_tail.as_deref().unwrap_or(""); + assert!(tail.contains("ORDER BY total DESC")); + assert!(tail.contains("LIMIT 5")); +} + +#[tokio::test] +async fn explain_federation_report_matches_design_paths() { + let _lock = federation_test_lock().await; + let engine = metrics_engine(vec![10, 20]).await; + + // Path A: execution = pushdown; report carries plan + EXPLAIN scan/agg shape. + let heatmap = explain_federation( + &engine, + "SELECT v, sum(v) AS s FROM global.demo.metrics GROUP BY v ORDER BY s DESC LIMIT 3", + ) + .await + .expect("explain federation"); + assert_eq!( + heatmap.execution_path, + FederatedQueryPath::AggregatePushdown + ); + assert!(heatmap.aggregate_plan.is_some()); + assert!(heatmap.physical_plan.contains("FederatedScanExec")); + assert!(heatmap.global_sql.contains("global.demo.metrics")); + + // Path B: raw scan. + let scan = explain_federation(&engine, "SELECT v FROM global.demo.metrics WHERE v > 5") + .await + .expect("scan explain"); + assert_eq!(scan.execution_path, FederatedQueryPath::FederatedScan); + assert!(scan.aggregate_plan.is_none()); + assert!(scan.physical_plan.contains("FederatedScanExec")); + + // Path C: join. + let join = explain_federation( + &engine, + "SELECT a.v FROM global.demo.metrics a JOIN global.demo.metrics b ON a.v = b.v", + ) + .await + .expect("join explain"); + assert_eq!(join.execution_path, FederatedQueryPath::Broadcast); +} + +#[tokio::test] +async fn explain_select_star_rewrite_before_plan() { + let _lock = federation_test_lock().await; + let engine = metrics_engine(vec![1]).await; + + let report = explain_federation(&engine, "SELECT * FROM global.demo.metrics") + .await + .expect("report"); + + assert!(report.global_sql.contains("EXCLUDE")); + for col in [ + "_host", + "_addr", + "_rank", + "_node_rank", + "_local_rank", + "_role", + ] { + assert!( + report.global_sql.contains(col), + "SELECT * rewrite missing {col}" + ); + } + assert_eq!(report.execution_path, FederatedQueryPath::FederatedScan); +} diff --git a/tests/regression/rust/probing/core/federation_tests.rs b/tests/regression/rust/probing/core/federation_tests.rs index dab0f659..3ba1ff95 100644 --- a/tests/regression/rust/probing/core/federation_tests.rs +++ b/tests/regression/rust/probing/core/federation_tests.rs @@ -3,12 +3,15 @@ use std::sync::Arc; +use probing_core::core::cluster::{reset_cluster_for_tests, update_node}; use probing_core::core::federation::{ - GLOBAL_CATALOG, PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_RANK_COL, PROBE_ROLE_COL, + set_remote_query_hook, take_fanout_stats, FEDERATION_TAG_COLUMNS, GLOBAL_CATALOG, + PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_LOCAL_RANK_COL, PROBE_NODE_RANK_COL, PROBE_RANK_COL, + PROBE_ROLE_COL, }; use probing_core::core::{Engine, ProbeDataSource}; -use probing_proto::prelude::Seq; -use probing_rust_regression::test_helpers::GenericTableProbeDataSource; +use probing_proto::prelude::{Node, Seq}; +use probing_rust_regression::test_helpers::{federation_test_lock, GenericTableProbeDataSource}; fn df_col_i32(df: &probing_proto::prelude::DataFrame, name: &str) -> Vec { let idx = df @@ -22,6 +25,19 @@ fn df_col_i32(df: &probing_proto::prelude::DataFrame, name: &str) -> Vec { } } +fn df_col_i64(df: &probing_proto::prelude::DataFrame, name: &str) -> Vec { + let idx = df + .names + .iter() + .position(|n| n == name) + .unwrap_or_else(|| panic!("column {name} missing from {:?}", df.names)); + match &df.cols[idx] { + Seq::SeqI64(v) => v.clone(), + Seq::SeqI32(v) => v.iter().map(|&x| i64::from(x)).collect(), + other => panic!("column {name} expected integer column, got {other:?}"), + } +} + #[allow(dead_code)] fn df_col_str(df: &probing_proto::prelude::DataFrame, name: &str) -> Vec { let idx = df @@ -48,8 +64,94 @@ async fn build_demo_engine() -> Engine { .expect("engine build") } +fn register_local_node(rank: i32, addr: &str, host: &str) { + update_node(Node { + host: host.into(), + addr: addr.into(), + rank: Some(rank), + group_rank: Some(rank / 8), + local_rank: Some(rank % 8), + role: Some(format!("dp={rank}")), + ..Default::default() + }); +} + +struct FederatedTestCluster { + local_engine: Engine, + #[allow(dead_code)] + peer_engine: Engine, + #[allow(dead_code)] + peer_addr: String, +} + +impl FederatedTestCluster { + async fn setup(local_values: Vec, peer_values: Vec) -> Self { + reset_cluster_for_tests(); + set_remote_query_hook(None); + + let local_addr = "127.0.0.1:19999"; + let peer_addr = "127.0.0.1:20001".to_string(); + std::env::set_var("PROBING_ADDRESS", local_addr); + std::env::set_var("HOSTNAME", "coord-host"); + + register_local_node(0, local_addr, "coord-host"); + update_node(Node { + host: "peer-host".into(), + addr: peer_addr.clone(), + rank: Some(1), + group_rank: Some(0), + local_rank: Some(1), + role: Some("dp=1".into()), + ..Default::default() + }); + + let local_table = + GenericTableProbeDataSource::single_column_table("metrics", "demo", "v", local_values); + let local_engine = Engine::builder() + .with_data_source(Arc::new(local_table) as Arc) + .build() + .await + .expect("local engine"); + + let peer_table = + GenericTableProbeDataSource::single_column_table("metrics", "demo", "v", peer_values); + let peer_engine = Engine::builder() + .with_data_source(Arc::new(peer_table) as Arc) + .build() + .await + .expect("peer engine"); + + let peer_for_hook = peer_engine.clone(); + let peer_addr_for_hook = peer_addr.clone(); + set_remote_query_hook(Some(Box::new(move |addr, sql| { + if addr != peer_addr_for_hook { + return Err(datafusion::error::DataFusionError::Execution(format!( + "unexpected peer addr: {addr}" + ))); + } + futures::executor::block_on(async { + peer_for_hook.async_query(sql).await?.ok_or_else(|| { + datafusion::error::DataFusionError::Execution("peer query returned None".into()) + }) + }) + }))); + + Self { + local_engine, + peer_engine, + peer_addr, + } + } + + fn teardown(&self) { + set_remote_query_hook(None); + reset_cluster_for_tests(); + } +} + #[tokio::test] async fn global_catalog_discovers_probe_schema() { + let _lock = federation_test_lock().await; let engine = build_demo_engine().await; let global = engine .context @@ -62,6 +164,7 @@ async fn global_catalog_discovers_probe_schema() { #[tokio::test] async fn global_catalog_discovers_tables_registered_after_build() { + let _lock = federation_test_lock().await; std::env::set_var("PROBING_ADDRESS", "127.0.0.1:19999"); std::env::set_var("HOSTNAME", "federation-test-host"); @@ -90,6 +193,7 @@ async fn global_catalog_discovers_tables_registered_after_build() { #[tokio::test] async fn probe_query_has_no_probe_addr_column() { + let _lock = federation_test_lock().await; let engine = build_demo_engine().await; let df = engine .async_query("SELECT rank FROM probe.demo.metrics ORDER BY rank") @@ -102,6 +206,7 @@ async fn probe_query_has_no_probe_addr_column() { #[tokio::test] async fn global_explicit_column_select_omits_probe_tags() { + let _lock = federation_test_lock().await; let engine = build_demo_engine().await; let df = engine .async_query("SELECT rank FROM global.demo.metrics ORDER BY rank") @@ -114,6 +219,7 @@ async fn global_explicit_column_select_omits_probe_tags() { #[tokio::test] async fn global_query_filter_pushdown_preserves_explicit_projection() { + let _lock = federation_test_lock().await; let engine = build_demo_engine().await; let df = engine .async_query("SELECT rank FROM global.demo.metrics WHERE rank = 1") @@ -126,6 +232,7 @@ async fn global_query_filter_pushdown_preserves_explicit_projection() { #[tokio::test] async fn global_and_probe_return_same_ranks_without_peers() { + let _lock = federation_test_lock().await; let engine = build_demo_engine().await; let probe_df = engine .async_query("SELECT rank FROM probe.demo.metrics ORDER BY rank") @@ -145,6 +252,7 @@ async fn global_and_probe_return_same_ranks_without_peers() { #[tokio::test] async fn global_select_name_returns_only_name() { + let _lock = federation_test_lock().await; use arrow::array::StringArray; use arrow::datatypes::{DataType, Field, Schema}; use arrow::record_batch::RecordBatch; @@ -181,6 +289,7 @@ async fn global_select_name_returns_only_name() { #[tokio::test] async fn global_empty_table_with_timestamp_explicit_select_preserves_schema() { + let _lock = federation_test_lock().await; use arrow::array::{StringArray, TimestampMicrosecondArray}; use arrow::datatypes::{DataType, Field, Schema, TimeUnit}; use arrow::record_batch::RecordBatch; @@ -222,6 +331,7 @@ async fn global_empty_table_with_timestamp_explicit_select_preserves_schema() { #[tokio::test] async fn global_empty_table_explicit_select_preserves_schema() { + let _lock = federation_test_lock().await; std::env::set_var("PROBING_ADDRESS", "127.0.0.1:19999"); std::env::set_var("HOSTNAME", "federation-test-host"); @@ -243,6 +353,7 @@ async fn global_empty_table_explicit_select_preserves_schema() { #[tokio::test] async fn global_select_star_includes_probe_addr_and_rank() { + let _lock = federation_test_lock().await; use arrow::array::StringArray; use arrow::datatypes::{DataType, Field, Schema}; use arrow::record_batch::RecordBatch; @@ -282,13 +393,17 @@ async fn global_select_star_includes_probe_addr_and_rank() { PROBE_HOST_COL.to_string(), PROBE_ADDR_COL.to_string(), PROBE_RANK_COL.to_string(), + PROBE_NODE_RANK_COL.to_string(), + PROBE_LOCAL_RANK_COL.to_string(), PROBE_ROLE_COL.to_string(), ] ); + assert_eq!(df.names.len(), 2 + FEDERATION_TAG_COLUMNS.len()); } #[tokio::test] async fn explicit_probe_tags_not_duplicated() { + let _lock = federation_test_lock().await; let engine = build_demo_engine().await; let df = engine .async_query("SELECT rank, _addr, _rank FROM global.demo.metrics ORDER BY rank") @@ -327,6 +442,7 @@ fn cluster_fanout_join_uses_legacy_broadcast() { #[tokio::test] async fn global_select_star_exclude_rewrite_works() { + let _lock = federation_test_lock().await; use probing_core::core::federation::prepare_global_query; let sql = "SELECT * FROM global.process.envs"; @@ -338,6 +454,7 @@ async fn global_select_star_exclude_rewrite_works() { #[tokio::test] async fn global_select_probe_rank_only_returns_requested_column() { + let _lock = federation_test_lock().await; use arrow::array::StringArray; use arrow::datatypes::{DataType, Field, Schema}; use arrow::record_batch::RecordBatch; @@ -374,6 +491,7 @@ async fn global_select_probe_rank_only_returns_requested_column() { #[tokio::test] async fn global_group_by_rank_with_count_distinct() { + let _lock = federation_test_lock().await; use arrow::array::StringArray; use arrow::datatypes::{DataType, Field, Schema}; use arrow::record_batch::RecordBatch; @@ -410,3 +528,129 @@ async fn global_group_by_rank_with_count_distinct() { assert!(df.names.iter().any(|n| n == "_rank")); assert!(df.names.iter().any(|n| n == "n")); } + +#[tokio::test] +async fn aggregate_pushdown_merges_local_and_peer_sums() { + let _lock = federation_test_lock().await; + let cluster = FederatedTestCluster::setup(vec![1, 2, 3], vec![4, 5]).await; + + let df = cluster + .local_engine + .async_query("SELECT sum(v) AS total FROM global.demo.metrics") + .await + .expect("query") + .expect("dataframe"); + + assert_eq!(df_col_i64(&df, "total"), vec![15]); + let stats = take_fanout_stats(); + assert_eq!(stats.nodes_succeeded, 1); + assert!(stats.nodes_failed.is_empty()); + + cluster.teardown(); +} + +#[tokio::test] +async fn aggregate_pushdown_groups_by_host_with_six_tags() { + let _lock = federation_test_lock().await; + let cluster = FederatedTestCluster::setup(vec![10, 20], vec![100]).await; + + let df = cluster + .local_engine + .async_query( + "SELECT _host, sum(v) AS total FROM global.demo.metrics GROUP BY _host ORDER BY total DESC", + ) + .await + .expect("query") + .expect("dataframe"); + + assert!(df.names.iter().any(|n| n == "_host")); + assert!(df.names.iter().any(|n| n == "total")); + let addrs = df_col_str(&df, "_addr"); + assert_eq!(addrs, vec!["127.0.0.1:20001", "127.0.0.1:19999"]); + assert_eq!(df_col_i64(&df, "total"), vec![100, 30]); + + cluster.teardown(); +} + +#[tokio::test] +async fn federated_scan_concatenates_local_and_peer_rows_with_tags() { + let _lock = federation_test_lock().await; + let cluster = FederatedTestCluster::setup(vec![1, 2], vec![3]).await; + + let df = cluster + .local_engine + .async_query("SELECT v, _host FROM global.demo.metrics ORDER BY v") + .await + .expect("query") + .expect("dataframe"); + + assert_eq!(df_col_i32(&df, "v"), vec![1, 2, 3]); + assert!(df.names.iter().any(|n| n == "_host")); + let hosts = df_col_str(&df, "_host"); + assert_eq!(hosts, vec!["coord-host", "coord-host", "peer-host"]); + + let stats = take_fanout_stats(); + assert_eq!(stats.nodes_succeeded, 1); + + cluster.teardown(); +} + +#[tokio::test] +async fn federated_scan_global_limit_with_peer() { + let _lock = federation_test_lock().await; + let cluster = FederatedTestCluster::setup(vec![1, 2, 3], vec![4, 5, 6]).await; + + let df = cluster + .local_engine + .async_query("SELECT v FROM global.demo.metrics ORDER BY v LIMIT 4") + .await + .expect("query") + .expect("dataframe"); + + assert_eq!(df_col_i32(&df, "v"), vec![1, 2, 3, 4]); + + cluster.teardown(); +} + +#[tokio::test] +async fn aggregate_pushdown_order_by_limit_post_merge() { + let _lock = federation_test_lock().await; + use arrow::array::StringArray; + use arrow::datatypes::{DataType, Field, Schema}; + use arrow::record_batch::RecordBatch; + + reset_cluster_for_tests(); + set_remote_query_hook(None); + std::env::set_var("PROBING_ADDRESS", "127.0.0.1:19999"); + std::env::set_var("HOSTNAME", "coord-host"); + + let schema = Arc::new(Schema::new(vec![ + Field::new("name", DataType::Utf8, false), + Field::new("value", DataType::Utf8, true), + ])); + let batch = RecordBatch::try_new( + schema.clone(), + vec![ + Arc::new(StringArray::from(vec!["a", "a", "a", "b"])), + Arc::new(StringArray::from(vec!["1", "1", "1", "2"])), + ], + ) + .unwrap(); + let envs = GenericTableProbeDataSource::new("envs", "process", schema, vec![batch]); + let engine = Engine::builder() + .with_data_source(Arc::new(envs) as Arc) + .build() + .await + .expect("engine build"); + + let df = engine + .async_query( + "SELECT name, count(*) AS n FROM global.process.envs GROUP BY name ORDER BY n DESC LIMIT 2", + ) + .await + .expect("query") + .expect("dataframe"); + + assert_eq!(df_col_str(&df, "name"), vec!["a", "b"]); + assert_eq!(df_col_i64(&df, "n"), vec![3, 1]); +} diff --git a/tests/regression/rust/probing/core/table_docs_integration.rs b/tests/regression/rust/probing/core/table_docs_integration.rs new file mode 100644 index 00000000..8a019ae5 --- /dev/null +++ b/tests/regression/rust/probing/core/table_docs_integration.rs @@ -0,0 +1,152 @@ +//! Integration tests: Schema docs → registry → semantic catalog → Engine SQL. + +use std::sync::Arc; + +use anyhow::Result; +use probing_core::core::{Engine, UnifiedMemtableProbeDataSource}; +use probing_memtable::discover::ExposedTable; +use probing_memtable::{DType, Schema, Value}; +use probing_proto::prelude::{DataFrame, Seq}; + +fn df_col_str(df: &DataFrame, name: &str) -> Vec { + let idx = df + .names + .iter() + .position(|n| n == name) + .unwrap_or_else(|| panic!("column {name} missing from {:?}", df.names)); + match &df.cols[idx] { + Seq::SeqText(values) => values.clone(), + other => panic!("column {name}: expected SeqText, got {other:?}"), + } +} + +fn with_data_dir() -> tempfile::TempDir { + let dir = tempfile::tempdir().expect("tempdir"); + std::env::set_var("PROBING_DATA_DIR", dir.path()); + dir +} + +async fn engine_with_memtable() -> Result { + Engine::builder() + .with_data_source(Arc::new(UnifiedMemtableProbeDataSource)) + .build() + .await + .map_err(Into::into) +} + +#[tokio::test] +async fn mmap_schema_docs_visible_in_semantic_catalog() -> Result<()> { + let _dir = with_data_dir(); + let table = format!("metrics_{}", std::process::id()); + let qualified = format!("unittest.{table}"); + let schema = Schema::new() + .table_doc("Integration metrics table") + .col_doc("latency_ms", DType::F64, "wall-clock latency in ms") + .col_doc("rank", DType::I32, "torch rank"); + + { + let mut exposed = ExposedTable::create(&qualified, &schema, 4096, 4)?; + let mut writer = exposed.writer(); + writer.push_row(&[Value::F64(12.5), Value::I32(0)]); + } + + let engine = engine_with_memtable().await?; + + let col_df = engine + .async_query(format!( + "SELECT description FROM probe.probing.column_docs \ + WHERE table_schema = 'unittest' AND table_name = '{table}' \ + AND column_name = 'latency_ms'" + )) + .await? + .expect("column doc row"); + let desc = df_col_str(&col_df, "description") + .into_iter() + .next() + .unwrap_or_default(); + assert_eq!(desc, "wall-clock latency in ms"); + + let table_df = engine + .async_query(format!( + "SELECT description FROM probe.probing.table_docs \ + WHERE table_schema = 'unittest' AND table_name = '{table}'" + )) + .await? + .expect("table doc row"); + let table_desc = df_col_str(&table_df, "description") + .into_iter() + .next() + .unwrap_or_default(); + assert_eq!(table_desc, "Integration metrics table"); + Ok(()) +} + +#[tokio::test] +async fn describe_static_catalog_table_includes_comment_columns() -> Result<()> { + let engine = engine_with_memtable().await?; + let df = engine + .async_query("DESCRIBE probe.probing.table_docs") + .await? + .expect("DESCRIBE rows"); + + assert!( + df.names.iter().any(|n| n == "comment"), + "DESCRIBE rewrite missing comment: {:?}", + df.names + ); + assert!( + df.names.iter().any(|n| n == "table_comment"), + "DESCRIBE rewrite missing table_comment: {:?}", + df.names + ); + assert!( + df_col_str(&df, "column_name") + .iter() + .any(|n| n == "description"), + "expected static catalog columns" + ); + Ok(()) +} + +#[tokio::test] +async fn catalog_serves_builtin_hccl_and_yaml_synonyms() -> Result<()> { + let engine = engine_with_memtable().await?; + + let col_df = engine + .async_query( + "SELECT description FROM probe.probing.column_docs \ + WHERE table_schema = 'hccl' AND table_name = 'tasks' AND column_name = 'task_name'", + ) + .await? + .expect("hccl.tasks.task_name doc"); + let desc = df_col_str(&col_df, "description") + .into_iter() + .next() + .unwrap_or_default(); + assert!( + desc.contains("Memcpy"), + "expected code-first HCCL column doc, got {desc}" + ); + + let table_df = engine + .async_query( + "SELECT description, synonyms FROM probe.probing.table_docs \ + WHERE table_schema = 'hccl' AND table_name = 'host_ops'", + ) + .await? + .expect("hccl.host_ops table doc"); + let description = df_col_str(&table_df, "description") + .into_iter() + .next() + .unwrap_or_default(); + let synonyms = df_col_str(&table_df, "synonyms") + .into_iter() + .next() + .unwrap_or_default(); + assert!(description.contains("MSProf Host API")); + assert!( + synonyms.contains("MSProf"), + "yaml synonyms should remain available: {synonyms}" + ); + Ok(()) +} diff --git a/tests/regression/rust/src/test_helpers.rs b/tests/regression/rust/src/test_helpers.rs index 39ea8c94..bb5a17ff 100644 --- a/tests/regression/rust/src/test_helpers.rs +++ b/tests/regression/rust/src/test_helpers.rs @@ -11,6 +11,16 @@ use datafusion::logical_expr::Expr; use datafusion::physical_plan::ExecutionPlan; use probing_core::core::{ProbeDataSource, ProbeDataSourceKind}; use std::sync::Arc; +use std::sync::LazyLock; + +use tokio::sync::Mutex; + +static FEDERATION_TEST_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); + +/// Serialize federation integration tests that mutate global cluster state. +pub async fn federation_test_lock() -> tokio::sync::MutexGuard<'static, ()> { + FEDERATION_TEST_LOCK.lock().await +} /// Generic test table plugin implementation #[derive(Debug, Clone)] diff --git a/tests/regression/training_observability/conftest.py b/tests/regression/training_observability/conftest.py index cdae355b..631712d2 100644 --- a/tests/regression/training_observability/conftest.py +++ b/tests/regression/training_observability/conftest.py @@ -22,6 +22,8 @@ import pytest +import probing + # Same shape as probing/server/src/server/training.rs STEP_MATRIX_SQL (local window). STEP_MATRIX_SQL = """ SELECT @@ -32,7 +34,7 @@ FROM python.trace_event s JOIN python.trace_event e ON s.span_id = e.span_id AND e.record_type = 'span_end' -WHERE s.record_type = 'span_start' AND s.kind = 'train.step' +WHERE s.record_type = 'span_start' AND s.name = 'train.step' ORDER BY s.time ASC """ @@ -45,13 +47,9 @@ @pytest.fixture(autouse=True) def _reset_step_coordinates(): - from probing.tracing import set_step_bucket_size, sync_local_step - - sync_local_step(0) - set_step_bucket_size(1) + probing.step(0) yield - sync_local_step(0) - set_step_bucket_size(1) + probing.step(0) @pytest.fixture(autouse=True) @@ -80,25 +78,25 @@ def _apply( ) -> None: from unittest.mock import MagicMock - from probing.tracing import step_snapshot as real_step_snapshot + from probing.tracing.coordinates import step_snapshot as real_step_snapshot def _fake_snapshot(): base = real_step_snapshot() snap = MagicMock() - snap.local_step = local_step if local_step is not None else base.local_step - snap.global_step = base.global_step - snap.bucket_size = base.bucket_size + micro = local_step if local_step is not None else base.micro_step + batches = base.micro_batches + training = micro // max(batches, 1) + snap.micro_step = micro + snap.local_step = training + snap.global_step = training + snap.micro_batches = batches snap.rank = rank snap.world_size = world_size return snap monkeypatch.setenv("RANK", str(rank)) monkeypatch.setenv("WORLD_SIZE", str(world_size)) - for target in ( - "probing.tracing.step_snapshot", - "probing.profiling.collective.record.step_snapshot", - ): - monkeypatch.setattr(target, _fake_snapshot) + monkeypatch.setattr("probing.tracing.coordinates.step_snapshot", _fake_snapshot) return _apply @@ -159,7 +157,7 @@ def train_step_samples_from_memtable(limit: int = 500) -> list[dict[str, Any]]: starts = { e["span_id"]: e for e in events - if e.get("record_type") == "span_start" and e.get("kind") == "train.step" + if e.get("record_type") == "span_start" and e.get("name") == "train.step" } ends = {e["span_id"]: e for e in events if e.get("record_type") == "span_end"} out: list[dict[str, Any]] = [] diff --git a/tests/regression/training_observability/test_collective_recording.py b/tests/regression/training_observability/test_collective_recording.py index e3ce532e..601e176f 100644 --- a/tests/regression/training_observability/test_collective_recording.py +++ b/tests/regression/training_observability/test_collective_recording.py @@ -47,7 +47,7 @@ def test_full_mode_span_writes_row_and_trace(self): events = table_rows(TraceEvent, 10) assert len(events) >= 2 starts = [e for e in events if e["record_type"] == "span_start"] - assert any(e["kind"] == "comm.all_reduce" for e in starts) + assert any(e["name"] == "all_reduce" for e in starts) def test_lite_mode_writes_comm_row(self): record_comm_lite( @@ -76,7 +76,6 @@ def test_lite_mode_writes_closed_trace_pair_by_default(self): events = table_rows(TraceEvent, 10) by_type = {row["record_type"]: row for row in events} assert by_type["span_start"]["name"] == "all_reduce" - assert by_type["span_start"]["kind"] == "comm.all_reduce" assert by_type["span_end"]["span_id"] == by_type["span_start"]["span_id"] def test_lite_mode_can_skip_trace_event(self): diff --git a/tests/regression/training_observability/test_collective_tracer_hook.py b/tests/regression/training_observability/test_collective_tracer_hook.py index 665f05a6..cf9149c9 100644 --- a/tests/regression/training_observability/test_collective_tracer_hook.py +++ b/tests/regression/training_observability/test_collective_tracer_hook.py @@ -81,7 +81,7 @@ def fake_all_reduce(tensor, *args, **kwargs): span = current_span() seen["had_span"] = span is not None - seen["kind"] = getattr(span, "kind", None) if span else None + seen["name"] = getattr(span, "name", None) if span else None return None wrapper = tracer._trace_wrapper("all_reduce", fake_all_reduce) @@ -90,6 +90,6 @@ def fake_all_reduce(tensor, *args, **kwargs): wrapper(mock_tensor) assert seen.get("had_span") is True - assert seen.get("kind") == "comm.all_reduce" + assert seen.get("name") == "all_reduce" rows = table_rows(CommCollective, 5) assert len(rows) == 1 diff --git a/tests/regression/training_observability/test_step_straggler_sql.py b/tests/regression/training_observability/test_step_straggler_sql.py index 5f1dfc16..7aaaa2b4 100644 --- a/tests/regression/training_observability/test_step_straggler_sql.py +++ b/tests/regression/training_observability/test_step_straggler_sql.py @@ -2,7 +2,8 @@ import pytest -from probing.tracing import TRAIN_STEP_KIND, record_closed_span, sync_local_step +import probing +from probing.tracing import record_span from .conftest import train_step_samples_from_memtable @@ -13,12 +14,11 @@ def test_empty_without_train_step_spans(self): assert train_step_samples_from_memtable() == [] def test_train_step_duration_from_closed_spans(self, rank_env): - sync_local_step(42) + probing.step(42) rank_env(rank=3, world_size=8) - record_closed_span( - "batch", - kind=TRAIN_STEP_KIND, + record_span( + "train.step", duration_ns=int(150.0 * 1e6), source="test", ) @@ -30,15 +30,13 @@ def test_train_step_duration_from_closed_spans(self, rank_env): assert rows[0]["duration_ms"] == pytest.approx(150.0, rel=0.05) def test_multi_rank_straggler_simulation(self, rank_env): - """Single process simulates cross-rank matrix by varying RANK env.""" - sync_local_step(100) + probing.step(100) durations = {0: 120.0, 1: 118.0, 2: 350.0, 3: 125.0} for rank, duration_ms in durations.items(): rank_env(rank=rank, world_size=4) - record_closed_span( - "batch", - kind=TRAIN_STEP_KIND, + record_span( + "train.step", duration_ns=int(duration_ms * 1e6), source="test", ) @@ -49,10 +47,10 @@ def test_multi_rank_straggler_simulation(self, rank_env): assert by_rank[2] > by_rank[0] * 2 assert all(r["local_step"] == 100 for r in rows) - def test_ignores_non_train_step_kinds(self): - record_closed_span( + def test_ignores_non_train_step_names(self): + record_span( "forward", - kind="nn.forward", + phase="forward", duration_ns=int(50.0 * 1e6), ) diff --git a/tests/regression/training_observability/test_topology_context.py b/tests/regression/training_observability/test_topology_context.py index 6c7cd2ec..f946024b 100644 --- a/tests/regression/training_observability/test_topology_context.py +++ b/tests/regression/training_observability/test_topology_context.py @@ -4,8 +4,11 @@ import probing from probing.parallel import parallel_fields, parallel_topology -from probing.profiling.collective.record import CommCollective, record_comm_lite -from probing.tracing import comm_kind +from probing.profiling.collective.record import ( + CommCollective, + _comm_label, + record_comm_lite, +) from .conftest import table_rows @@ -60,8 +63,8 @@ def test_span_includes_topology(self, monkeypatch): assert attrs["dp_rank"] == 5 def test_comm_kind_labels(self): - assert comm_kind("all_reduce") == "comm.all_reduce" - assert comm_kind("comm.broadcast") == "comm.broadcast" + assert _comm_label("all_reduce") == "comm.all_reduce" + assert _comm_label("comm.broadcast") == "comm.broadcast" @pytest.mark.training_observability diff --git a/tests/regression/training_observability/test_training_iteration_e2e.py b/tests/regression/training_observability/test_training_iteration_e2e.py index 819132b3..c33234c4 100644 --- a/tests/regression/training_observability/test_training_iteration_e2e.py +++ b/tests/regression/training_observability/test_training_iteration_e2e.py @@ -3,37 +3,37 @@ import pytest import probing -from probing.profiling.collective.record import record_comm_lite -from probing.tracing import TRAIN_STEP_KIND, sync_local_step +from probing.profiling.collective.record import CommCollective, record_comm_lite +from probing.tracing.phases import BACKWARD, FORWARD, OPTIMIZER -from .conftest import train_step_samples_from_memtable, table_rows -from probing.profiling.collective.record import CommCollective +from .conftest import table_rows, train_step_samples_from_memtable @pytest.mark.training_observability class TestTrainingIterationPipeline: def test_single_iteration_step_and_comm(self, rank_env, parallel_env): - """Mimics: train.step → collective → memtable rows used by Training page.""" rank_env(rank=1, world_size=8) parallel_env(tp_rank=0, pp_rank=1, dp_rank=1) - sync_local_step(7) - - with probing.span("batch", kind=TRAIN_STEP_KIND): - with probing.span("forward", kind="nn.forward"): - pass - record_comm_lite( - op="all_reduce", - duration_ms=8.5, - group_rank=1, - group_size=8, - nbytes=4096, - ) - with probing.span("backward", kind="nn.backward"): - pass + probing.step(7) + + with probing.span("forward", phase=FORWARD): + pass + record_comm_lite( + op="all_reduce", + duration_ms=8.5, + group_rank=1, + group_size=8, + nbytes=4096, + ) + with probing.span("backward", phase=BACKWARD): + pass + with probing.span("optimizer", phase=OPTIMIZER): + pass + probing.record_span("train.step", duration_ns=int(120.0 * 1e6), source="test") step_rows = train_step_samples_from_memtable() assert len(step_rows) >= 1 - assert any(r["rank"] == 1 and r["local_step"] == 7 for r in step_rows) + assert any(r["rank"] == 1 for r in step_rows) comm_rows = table_rows(CommCollective, 5) assert len(comm_rows) == 1 @@ -41,18 +41,15 @@ def test_single_iteration_step_and_comm(self, rank_env, parallel_env): assert "pp=1" in comm_rows[0]["role"] assert comm_rows[0]["bytes"] == 4096 - def test_train_step_event_after_nested_spans(self): - """Regression path from imagenet_with_span (SpanAlreadyClosed).""" - with probing.span("batch", kind=TRAIN_STEP_KIND): - with probing.span("forward", kind="nn.forward"): - pass + def test_event_on_training_span(self): + with probing.span("forward", phase=FORWARD): probing.event("batch.stats", attributes=[{"loss": 1.25}]) - def test_torch_probe_reentrant_train_step(self): + def test_torch_probe_reentrant_optimizer(self): from probing.profiling.torch_probe import TorchProbe, TorchProbeConfig tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) - with probing.span("batch", kind=TRAIN_STEP_KIND) as outer: + with probing.span("outer", phase=OPTIMIZER) as outer: tracer._begin_train_step_span() assert not outer.is_ended tracer._end_train_step_span() diff --git a/tests/unit/probing/test_web_assets.py b/tests/unit/probing/test_web_assets.py index 929418a7..fe9d811f 100644 --- a/tests/unit/probing/test_web_assets.py +++ b/tests/unit/probing/test_web_assets.py @@ -37,17 +37,42 @@ def test_dev_web_dir_when_frontend_built(): assert root is None -def test_configure_assets_root_prefers_bundled(monkeypatch, tmp_path: Path): +def test_configure_assets_root_prefers_dev_in_editable(monkeypatch, tmp_path: Path): bundled = tmp_path / "_web" bundled.mkdir() (bundled / "index.html").write_text("bundled", encoding="utf-8") + dev = tmp_path / "web" / "dist" + dev.mkdir(parents=True) + (dev / "index.html").write_text( + '
', + encoding="utf-8", + ) + + monkeypatch.setattr(web_assets, "bundled_web_dir", lambda: bundled) + monkeypatch.setattr(web_assets, "dev_web_dir", lambda: dev) + monkeypatch.setattr(web_assets, "_running_from_installed_wheel", lambda: False) + monkeypatch.delenv(web_assets._ENV, raising=False) + + assert web_assets.configure_assets_root() == dev + assert os.environ[web_assets._ENV] == str(dev) + + +def test_configure_assets_root_prefers_bundled_on_wheel(monkeypatch, tmp_path: Path): + bundled = tmp_path / "_web" + bundled.mkdir() + (bundled / "index.html").write_text( + '
', + encoding="utf-8", + ) + dev = tmp_path / "web" / "dist" dev.mkdir(parents=True) (dev / "index.html").write_text("dev", encoding="utf-8") monkeypatch.setattr(web_assets, "bundled_web_dir", lambda: bundled) monkeypatch.setattr(web_assets, "dev_web_dir", lambda: dev) + monkeypatch.setattr(web_assets, "_running_from_installed_wheel", lambda: True) monkeypatch.delenv(web_assets._ENV, raising=False) assert web_assets.configure_assets_root() == bundled diff --git a/tests/unit/probing/tracing/test_phase_transitions.py b/tests/unit/probing/tracing/test_phase_transitions.py new file mode 100644 index 00000000..376a52e7 --- /dev/null +++ b/tests/unit/probing/tracing/test_phase_transitions.py @@ -0,0 +1,374 @@ +"""Unit tests: span-driven and hook-driven training phase state transitions.""" + +from __future__ import annotations + +import dataclasses + +import pytest + +import probing +from probing.tracing import TraceEvent, bind_table, reset_backends +from probing.tracing.phases import ( + BACKWARD, + FORWARD, + IDLE, + OPTIMIZER, + hook_enter, + hook_exit, + phase, + reset_phase, +) + + +@pytest.fixture(autouse=True) +def _isolated_tracing(): + reset_phase() + probing.step(0) + probing.step(micro_batches=1) + try: + TraceEvent.drop() + except Exception: + pass + TraceEvent.init_table() + reset_backends(clear_registered=True) + bind_table(TraceEvent) + yield + reset_backends(clear_registered=True) + reset_phase() + + +def _trace_rows(n: int = 100) -> list[dict]: + fields = [f.name for f in dataclasses.fields(TraceEvent)] + return [dict(zip(fields, data)) for _ts, data in TraceEvent.take(n)] + + +def _closed_span_names(rows: list[dict]) -> list[str]: + starts = { + r["span_id"]: r["name"] for r in rows if r.get("record_type") == "span_start" + } + ends = {r["span_id"] for r in rows if r.get("record_type") == "span_end"} + return [starts[sid] for sid in ends if sid in starts] + + +# --- Span-driven transitions --- + + +class TestSpanDrivenPhaseTransitions: + def test_starts_idle(self): + assert phase() == IDLE + + def test_single_forward_idle_cycle(self): + with probing.span("forward", phase=FORWARD): + assert phase() == FORWARD + assert phase() == IDLE + + def test_full_training_step_sequence(self): + assert phase() == IDLE + with probing.span("forward", phase=FORWARD): + assert phase() == FORWARD + assert phase() == IDLE + + with probing.span("backward", phase=BACKWARD): + assert phase() == BACKWARD + assert phase() == IDLE + + with probing.span("step", phase=OPTIMIZER): + assert phase() == OPTIMIZER + assert phase() == IDLE + assert probing.step.micro_step == 1 + + def test_nested_training_phases_restore_parent(self): + with probing.span("forward", phase=FORWARD): + assert phase() == FORWARD + with probing.span("backward", phase=BACKWARD): + assert phase() == BACKWARD + assert phase() == FORWARD + assert phase() == IDLE + + def test_non_training_span_leaves_phase_idle(self): + with probing.span("data.load"): + assert phase() == IDLE + with probing.span("epoch"): + assert phase() == IDLE + + def test_inferred_phase_from_name(self): + with probing.span("forward"): + assert phase() == FORWARD + assert phase() == IDLE + + def test_train_step_name_does_not_change_phase(self): + probing.record_span("train.step", duration_ns=1000) + assert phase() == IDLE + + def test_outer_batch_inner_forward(self): + with probing.span("batch"): + assert phase() == IDLE + with probing.span("forward", phase=FORWARD): + assert phase() == FORWARD + assert phase() == IDLE + assert phase() == IDLE + + def test_optimizer_reentrant_does_not_double_step(self): + with probing.span("step", phase=OPTIMIZER): + assert phase() == OPTIMIZER + with probing.span("step", phase=OPTIMIZER): + assert phase() == OPTIMIZER + assert phase() == IDLE + assert probing.step.micro_step == 1 + + +# --- Hook-driven transitions --- + + +class TestHookDrivenPhaseTransitions: + def test_hook_forward_cycle(self): + hook_enter(FORWARD) + assert phase() == FORWARD + hook_exit(FORWARD) + assert phase() == IDLE + + def test_hook_full_iteration_sequence(self): + hook_enter(FORWARD) + assert phase() == FORWARD + hook_exit(FORWARD) + assert phase() == IDLE + + hook_enter(BACKWARD) + assert phase() == BACKWARD + hook_exit(BACKWARD) + assert phase() == IDLE + + hook_enter(OPTIMIZER) + assert phase() == OPTIMIZER + hook_exit(OPTIMIZER) + assert phase() == IDLE + + def test_hook_emits_phase_spans(self): + hook_enter(FORWARD) + hook_exit(FORWARD) + hook_enter(BACKWARD) + hook_exit(BACKWARD) + hook_enter(OPTIMIZER) + hook_exit(OPTIMIZER) + + names = _closed_span_names(_trace_rows()) + assert names.count("forward") == 1 + assert names.count("backward") == 1 + assert names.count("optimizer") == 1 + assert "train.step" in names + + def test_hook_optimizer_advances_step(self): + assert probing.step.micro_step == 0 + hook_enter(FORWARD) + hook_exit(FORWARD) + hook_enter(OPTIMIZER) + hook_exit(OPTIMIZER) + assert probing.step.micro_step == 1 + + def test_hook_forward_records_train_step_duration(self): + hook_enter(FORWARD) + hook_exit(FORWARD) + hook_enter(OPTIMIZER) + hook_exit(OPTIMIZER) + + rows = _trace_rows() + train_step = next( + ( + r + for r in rows + if r.get("record_type") == "span_start" + and r.get("name") == "train.step" + ), + None, + ) + assert train_step is not None + assert int(train_step.get("time", 0)) >= 0 + + def test_hook_without_forward_skips_train_step(self): + hook_enter(OPTIMIZER) + hook_exit(OPTIMIZER) + names = _closed_span_names(_trace_rows()) + assert "train.step" not in names + + def test_manual_span_suppresses_hook_span_but_keeps_phase(self): + with probing.span("forward", phase=FORWARD): + assert phase() == FORWARD + hook_enter(FORWARD) + assert phase() == FORWARD + rows_mid = _trace_rows() + forward_starts = [ + r + for r in rows_mid + if r.get("record_type") == "span_start" and r.get("name") == "forward" + ] + assert len(forward_starts) == 1 + hook_exit(FORWARD) + assert phase() == FORWARD + assert phase() == IDLE + + def test_hook_phase_spans_use_phase_hook_source(self): + hook_enter(BACKWARD) + rows = _trace_rows() + backward = next( + r + for r in rows + if r.get("record_type") == "span_start" and r.get("name") == "backward" + ) + import json + + attrs = json.loads(backward.get("attributes") or "{}") + assert attrs.get("source") == "phase_hook" + hook_exit(BACKWARD) + + +# --- Span + hook collaboration --- + + +class TestSpanHookCollaboration: + def test_manual_then_hook_optimizer_single_step_advance(self): + with probing.span("forward", phase=FORWARD): + pass + with probing.span("backward", phase=BACKWARD): + pass + with probing.span("step", phase=OPTIMIZER): + hook_enter(OPTIMIZER) + assert phase() == OPTIMIZER + hook_exit(OPTIMIZER) + assert phase() == IDLE + assert probing.step.micro_step == 1 + + def test_hook_cycle_then_manual_spans_reset_correctly(self): + hook_enter(FORWARD) + hook_exit(FORWARD) + assert phase() == IDLE + + with probing.span("backward", phase=BACKWARD): + assert phase() == BACKWARD + assert phase() == IDLE + + def test_phase_reads_span_stack_not_stale_after_hook_exit(self): + with probing.span("forward", phase=FORWARD): + hook_enter(FORWARD) + assert phase() == FORWARD + hook_exit(FORWARD) + assert phase() == FORWARD + assert phase() == IDLE + + +class TestGradientAccumulation: + def test_grad_acc_one_train_step_per_optimizer(self): + probing.step(micro_batches=4) + for micro in range(4): + hook_enter(FORWARD) + hook_exit(FORWARD) + hook_enter(BACKWARD) + hook_exit(BACKWARD) + if micro < 3: + assert phase() == IDLE + else: + hook_enter(OPTIMIZER) + hook_exit(OPTIMIZER) + assert phase() == IDLE + + names = _closed_span_names(_trace_rows()) + assert names.count("train.step") == 1 + assert probing.step.micro_step == 1 + assert probing.step.local_step == 0 + + hook_enter(FORWARD) + hook_exit(FORWARD) + hook_enter(BACKWARD) + hook_exit(BACKWARD) + hook_enter(OPTIMIZER) + hook_exit(OPTIMIZER) + + names = _closed_span_names(_trace_rows()) + assert names.count("train.step") == 2 + assert probing.step.micro_step == 2 + + def test_train_step_attrs_include_accum_index(self): + import json + + probing.step(micro_batches=2) + hook_enter(FORWARD) + hook_exit(FORWARD) + hook_enter(BACKWARD) + hook_exit(BACKWARD) + hook_enter(OPTIMIZER) + hook_exit(OPTIMIZER) + + row = next( + r + for r in _trace_rows() + if r.get("name") == "train.step" and r.get("record_type") == "span_start" + ) + attrs = json.loads(row["attributes"]) + assert attrs["micro_batches"] == 2 + assert "accum_index" in attrs + assert "logical_step_pending" in attrs + + +class TestSpanApi: + def test_span_phase_only_defaults_name(self): + with probing.span(phase=FORWARD) as s: + assert s.name == FORWARD + assert s.phase == FORWARD + assert phase() == FORWARD + + +class TestTorchProbeOwnership: + def test_torch_probe_skips_training_phase_when_hooks_attached(self): + import torch + import torch.nn as nn + + from probing.profiling.torch_probe import TorchProbe, TorchProbeConfig + from probing.tracing.hooks import attach_training_phases, detach_training_phases + + class M(nn.Module): + def __init__(self): + super().__init__() + self.w = nn.Parameter(torch.zeros(1)) + + def forward(self, x): + return self.w * x + + model = M() + opt = torch.optim.SGD(model.parameters(), lr=0.1) + attach_training_phases(model, opt) + try: + tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) + tracer.log_module_stage("pre forward", model, force=True) + tracer.log_module_stage("post forward", model, force=True) + starts = [ + r + for r in _trace_rows() + if r.get("record_type") == "span_start" and r.get("phase") == FORWARD + ] + assert starts == [] + finally: + detach_training_phases(model, opt) + + def test_torch_probe_optimizer_span_skipped_when_hooks_attached(self): + import torch + import torch.nn as nn + + from probing.profiling.torch_probe import TorchProbe, TorchProbeConfig + from probing.tracing.hooks import attach_training_phases, detach_training_phases + + class M(nn.Module): + def __init__(self): + super().__init__() + self.w = nn.Parameter(torch.zeros(1)) + + def forward(self, x): + return self.w * x + + model = M() + opt = torch.optim.SGD(model.parameters(), lr=0.1) + attach_training_phases(model, opt) + try: + tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) + tracer._begin_train_step_span(optimizer=opt) + assert tracer._train_step_cm is None + finally: + detach_training_phases(model, opt) diff --git a/tests/unit/probing/tracing/test_phases.py b/tests/unit/probing/tracing/test_phases.py new file mode 100644 index 00000000..f08e54a7 --- /dev/null +++ b/tests/unit/probing/tracing/test_phases.py @@ -0,0 +1,50 @@ +from probing.tracing import phases + + +def test_infer_training_names(): + assert phases.infer("forward") == phases.FORWARD + assert phases.infer("backward") == phases.BACKWARD + assert phases.infer("step") == phases.OPTIMIZER + + +def test_resolve_explicit_phase(): + assert phases.resolve("iter", phases.FORWARD) == phases.FORWARD + + +def test_infer_from_stage(): + assert phases.infer_from_stage("pre forward") == phases.FORWARD + assert phases.infer_from_stage("post backward") == phases.BACKWARD + assert phases.infer_from_stage("pre step") == phases.OPTIMIZER + assert phases.infer_from_stage("pre init") is None + + +def test_invalid_phase_raises(): + import pytest + + with pytest.raises(ValueError, match="invalid training phase"): + phases.resolve("x", "custom") + + +def test_resolve_span_phase_only(): + name, phase = phases.resolve_span(None, phases.FORWARD) + assert name == phases.FORWARD + assert phase == phases.FORWARD + + +def test_resolve_span_name_only(): + name, phase = phases.resolve_span("forward", None) + assert name == "forward" + assert phase == phases.FORWARD + + +def test_resolve_span_explicit_display_name(): + name, phase = phases.resolve_span("compute", phases.BACKWARD) + assert name == "compute" + assert phase == phases.BACKWARD + + +def test_resolve_span_requires_one(): + import pytest + + with pytest.raises(TypeError, match="requires name and/or phase"): + phases.resolve_span(None, None) diff --git a/tests/unit/probing/tracing/test_span_backends.py b/tests/unit/probing/tracing/test_span_backends.py new file mode 100644 index 00000000..d455cf9b --- /dev/null +++ b/tests/unit/probing/tracing/test_span_backends.py @@ -0,0 +1,153 @@ +"""Span multi-backend recorder tests.""" + +from __future__ import annotations + +import dataclasses + +import pytest + +import probing + + +@pytest.fixture(autouse=True) +def _isolate_trace_table(monkeypatch): + from probing.tracing import TraceEvent, bind_table, reset_backends + + monkeypatch.delenv("PROBING_SPAN_BACKENDS", raising=False) + try: + TraceEvent.drop() + except Exception: + pass + TraceEvent.init_table() + reset_backends(clear_registered=True) + bind_table(TraceEvent) + yield + reset_backends(clear_registered=True) + + +def _trace_rows(n: int = 50) -> list[dict]: + from probing.tracing import TraceEvent + + fields = [f.name for f in dataclasses.fields(TraceEvent)] + return [dict(zip(fields, data)) for _ts, data in TraceEvent.take(n)] + + +def test_default_backend_is_memtable(): + from probing.tracing import list_backends + + assert list_backends() == ["memtable"] + + +def test_custom_backend_receives_span_lifecycle(monkeypatch): + from probing.tracing import register_backend, reset_backends + + calls: list[tuple[str, object]] = [] + + class CaptureBackend: + name = "capture" + + def on_span_start(self, record): + calls.append(("start", record.name)) + + def on_span_end(self, record): + calls.append(("end", record.span_id)) + + def on_event(self, record): + calls.append(("event", record.name)) + + def shutdown(self): + calls.append(("shutdown", None)) + + register_backend("capture", lambda: CaptureBackend()) + monkeypatch.setenv("PROBING_SPAN_BACKENDS", "memtable,capture") + reset_backends() + + with probing.span("dual") as span: + span_id = span.span_id + probing.event("ping") + + assert ("start", "dual") in calls + assert ("event", "ping") in calls + assert any(c[0] == "end" and c[1] == span_id for c in calls) + + rows = _trace_rows() + assert any( + r.get("record_type") == "span_start" and r.get("name") == "dual" for r in rows + ) + + +def test_unknown_backend_falls_back_to_memtable_only(monkeypatch): + from probing.tracing import list_backends, reset_backends + + monkeypatch.setenv("PROBING_SPAN_BACKENDS", "unknown_backend") + reset_backends() + assert list_backends() == ["memtable"] + + with probing.span("still_works"): + pass + + rows = _trace_rows() + assert any(r.get("name") == "still_works" for r in rows) + + +def test_configure_overrides_env(monkeypatch): + from probing.tracing import configure_backends, list_backends + + monkeypatch.setenv("PROBING_SPAN_BACKENDS", "unknown_backend") + configure_backends(["memtable"]) + assert list_backends() == ["memtable"] + + +def test_otel_backend_skipped_without_sdk(monkeypatch): + from probing.tracing import list_backends, reset_backends + + monkeypatch.setenv("PROBING_SPAN_BACKENDS", "memtable,otel") + reset_backends() + assert list_backends() == ["memtable"] + + +def test_logger_backend_with_memtable(monkeypatch, capsys): + import logging + + from probing.tracing import list_backends, reset_backends + + log = logging.getLogger("probing.span") + log.handlers.clear() + log.propagate = True + + monkeypatch.setenv("PROBING_SPAN_BACKENDS", "memtable,logger") + reset_backends() + assert list_backends() == ["memtable", "logger"] + + with probing.span("hello", phase="forward"): + probing.event("ping", attributes=[{"x": 1}]) + + err = capsys.readouterr().err + assert "→ hello phase=forward" in err + assert "· ping" in err + assert "← hello" in err and "ms" in err + + rows = _trace_rows() + assert any( + r.get("record_type") == "span_start" and r.get("name") == "hello" for r in rows + ) + + +def test_logger_backend_only(monkeypatch, capsys): + import logging + + from probing.tracing import list_backends, reset_backends + + log = logging.getLogger("probing.span") + log.handlers.clear() + log.propagate = True + + monkeypatch.setenv("PROBING_SPAN_BACKENDS", "logger") + reset_backends() + assert list_backends() == ["logger"] + + with probing.span("terminal_only"): + pass + + assert "→ terminal_only" in capsys.readouterr().err + assert _trace_rows() == [] diff --git a/web/src/api/traces.rs b/web/src/api/traces.rs index d8998952..381d0d41 100644 --- a/web/src/api/traces.rs +++ b/web/src/api/traces.rs @@ -15,7 +15,7 @@ pub struct TraceEvent { pub name: String, pub timestamp: i64, pub thread_id: i64, - pub kind: Option, + pub phase: Option, pub location: Option, pub attributes: Option, pub event_attributes: Option, @@ -30,7 +30,7 @@ pub struct SpanInfo { pub start_timestamp: i64, pub end_timestamp: Option, pub thread_id: i64, - pub kind: Option, + pub phase: Option, pub location: Option, pub attributes: Option, pub children: Vec, @@ -54,6 +54,8 @@ impl ApiClient { String::new() }; + // Use logical event time (`time`, ns) — not memtable ingestion `timestamp` (µs). + // Matches training step_matrix / SPANS_SQL in probing.tracing. let query = format!( r#" SELECT @@ -62,14 +64,14 @@ impl ApiClient { span_id, COALESCE(parent_id, -1) as parent_id, name, - timestamp, + time AS timestamp, COALESCE(thread_id, 0) as thread_id, - kind, + phase, location, attributes, event_attributes FROM python.trace_event - ORDER BY timestamp DESC + ORDER BY time DESC {} "#, limit_clause @@ -96,7 +98,7 @@ impl ApiClient { let name_idx = df.names.iter().position(|c| c == "name").unwrap_or(4); let timestamp_idx = df.names.iter().position(|c| c == "timestamp").unwrap_or(5); let thread_id_idx = df.names.iter().position(|c| c == "thread_id").unwrap_or(6); - let kind_idx = df.names.iter().position(|c| c == "kind").unwrap_or(7); + let phase_idx = df.names.iter().position(|c| c == "phase").unwrap_or(7); let location_idx = df.names.iter().position(|c| c == "location").unwrap_or(8); let attributes_idx = df.names.iter().position(|c| c == "attributes").unwrap_or(9); let event_attributes_idx = df @@ -155,7 +157,7 @@ impl ApiClient { name: get_str(name_idx), timestamp: get_i64(timestamp_idx), thread_id: get_i64(thread_id_idx), - kind: get_opt_str(kind_idx), + phase: get_opt_str(phase_idx), location: get_opt_str(location_idx), attributes: get_opt_str(attributes_idx), event_attributes: get_opt_str(event_attributes_idx), @@ -184,7 +186,7 @@ impl ApiClient { start_timestamp: event.timestamp, end_timestamp: None, thread_id: event.thread_id, - kind: event.kind.clone(), + phase: event.phase.clone(), location: event.location.clone(), attributes: event.attributes.clone(), children: Vec::new(), @@ -308,7 +310,7 @@ impl ApiClient { let mut trace_events: Vec = Vec::new(); // Use (span_id, thread_id) as key to track span start time, supports multi-threaded scenarios - // Value contains: (start timestamp in microseconds, span name, kind, trace_id) + // Value contains: (start timestamp in microseconds, span name, phase, trace_id) let mut span_starts: SpanStartMap = std::collections::HashMap::new(); // First pass: collect all span_start events, build lookup table @@ -328,7 +330,7 @@ impl ApiClient { ( event.timestamp, event.name.clone(), - event.kind.clone(), + event.phase.clone(), event.trace_id, ), ); @@ -374,7 +376,7 @@ impl ApiClient { ( ts_micros, event.name.clone(), - event.kind.clone(), + event.phase.clone(), unified_pid, ), ); @@ -382,7 +384,7 @@ impl ApiClient { // Create 'B' (Begin) event let mut chrome_event = serde_json::json!({ "name": event.name, - "cat": event.kind.as_ref().unwrap_or(&"span".to_string()), + "cat": event.phase.as_ref().unwrap_or(&"span".to_string()), "ph": "B", "ts": ts_micros, "pid": pid, @@ -417,13 +419,13 @@ impl ApiClient { let key = (event.span_id, event.thread_id); // First try to find from already processed events - if let Some((start_ts, start_name, start_kind, start_pid)) = + if let Some((start_ts, start_name, start_phase, start_pid)) = span_starts.get(&key) { // Found matching span_start, create 'E' (End) event let mut chrome_event = serde_json::json!({ "name": start_name, - "cat": start_kind.as_ref().unwrap_or(&"span".to_string()), + "cat": start_phase.as_ref().unwrap_or(&"span".to_string()), "ph": "E", "ts": ts_micros, "pid": *start_pid as u32, @@ -439,7 +441,7 @@ impl ApiClient { trace_events.push(chrome_event); // Remove from span_starts to avoid duplicate matching span_starts.remove(&key); - } else if let Some((start_timestamp, start_name, start_kind, _)) = + } else if let Some((start_timestamp, start_name, start_phase, _)) = span_start_lookup.get(&key) { // Find span_start information from lookup table @@ -447,7 +449,7 @@ impl ApiClient { // Use unified pid to ensure all spans are in the same process let mut chrome_event = serde_json::json!({ "name": start_name, - "cat": start_kind.as_ref().unwrap_or(&"span".to_string()), + "cat": start_phase.as_ref().unwrap_or(&"span".to_string()), "ph": "E", "ts": ts_micros, "pid": unified_pid as u32, @@ -603,7 +605,7 @@ pub struct RayTimelineEntry { pub trace_id: i64, pub span_id: i64, pub parent_id: Option, - pub kind: Option, + pub phase: Option, pub thread_id: i64, pub attributes: Option, } diff --git a/web/src/components/sidebar/mod.rs b/web/src/components/sidebar/mod.rs index c7212a33..c8392345 100644 --- a/web/src/components/sidebar/mod.rs +++ b/web/src/components/sidebar/mod.rs @@ -84,7 +84,7 @@ pub fn Sidebar() -> Element { Link { to: Route::DashboardPage {}, class: "flex items-center gap-2", - img { src: "{crate::utils::base_path::with_base(\"/assets/logo.svg\")}", alt: "Probing", class: "w-7 h-7 flex-shrink-0" } + img { src: "{crate::utils::base_path::with_base(\"/logo.svg\")}", alt: "Probing", class: "w-7 h-7 flex-shrink-0" } span { class: "{brand}", "Probing" } } } diff --git a/web/src/hooks/mod.rs b/web/src/hooks/mod.rs index 674f0ba2..c817805a 100644 --- a/web/src/hooks/mod.rs +++ b/web/src/hooks/mod.rs @@ -69,7 +69,15 @@ where use_effect(move || { let mut loading = state.loading; let mut data = state.data; - let show_loading = !options.keep_previous_while_refreshing || data.read().is_none(); + + // Avoid stacking polls while a refresh is still in flight. + if options.keep_previous_while_refreshing && *loading.peek() { + return; + } + + // Peek so completing a fetch does not re-trigger this effect (infinite /query loop). + let show_loading = + !options.keep_previous_while_refreshing || data.with_peek(|d| d.is_none()); let result_future = fetch_fn(); spawn(async move { if show_loading { diff --git a/web/src/pages/traces.rs b/web/src/pages/traces.rs index 117449ab..517ce710 100644 --- a/web/src/pages/traces.rs +++ b/web/src/pages/traces.rs @@ -405,9 +405,9 @@ fn span_matches_text(span: &SpanInfo, query: &str) -> bool { } span.name.to_lowercase().contains(&q) || span - .kind + .phase .as_ref() - .is_some_and(|k| k.to_lowercase().contains(&q)) + .is_some_and(|p| p.to_lowercase().contains(&q)) || span .location .as_ref() @@ -612,14 +612,14 @@ fn SpanView( span { class: "w-4 shrink-0" } } span { class: "font-semibold text-gray-900 shrink-0", "{span.name}" } - if let Some(ref kind) = span.kind { + if let Some(ref phase) = span.phase { span { class: format!( "shrink-0 px-1.5 py-px rounded text-[10px] font-sans font-medium bg-{} text-{}", colors::CONTENT_ACCENT_BG, colors::CONTENT_ACCENT_TEXT, ), - "{kind}" + "{phase}" } } if let Some(ref location) = span.location { diff --git a/web/src/pages/training.rs b/web/src/pages/training.rs index 525b21c9..18f2aeeb 100644 --- a/web/src/pages/training.rs +++ b/web/src/pages/training.rs @@ -112,10 +112,10 @@ fn step_module_sql(coord_step: i64) -> String { fn step_span_sql(display_step: i64) -> String { format!( - "SELECT s.name, s.kind, round((e.time - s.time) / 1000000.0, 2) AS duration_ms \ + "SELECT s.name, s.phase, round((e.time - s.time) / 1000000.0, 2) AS duration_ms \ FROM python.trace_event s \ JOIN python.trace_event e ON s.span_id = e.span_id AND e.record_type = 'span_end' \ - WHERE s.record_type = 'span_start' AND s.kind != 'train.step' \ + WHERE s.record_type = 'span_start' AND s.name != 'train.step' \ AND s.attributes LIKE '%\"local_step\":{display_step}%' \ ORDER BY duration_ms DESC LIMIT 12" ) @@ -797,7 +797,7 @@ fn render_step_matrix_result( Card { title: "Step timings", EmptyState { - message: "No train.step spans yet. Wrap training loops with probing.span(..., kind='train.step') or enable TorchProbe.".to_string() + message: "No train.step spans yet. Enable phase hooks with probing.attach_training_phases(model, optimizer) or record train.step spans manually.".to_string() } } }, From 238b2b3af1efc1c1b13d2df8f7bf6bfcec223ec9 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sat, 27 Jun 2026 13:47:14 +0800 Subject: [PATCH 04/37] =?UTF-8?q?Enhance=20probing=20features=20with=20new?= =?UTF-8?q?=20crash=20demos=20and=20improved=20error=20hand=E2=80=A6=20(#5?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Enhance probing features with new crash demos and improved error handling - Added two new Python scripts: `crash_demo.py` and `crash_torchrun_demo.py` for demonstrating crash handling in single and distributed environments. - Introduced a shell script `run_crash_torchrun.sh` to facilitate running the distributed crash demo. - Updated `Cargo.lock` to include new dependencies such as `log`, `serde`, `sha2`, and `uuid` for enhanced functionality. - Refactored mutex handling in `memtable_sql.rs` and `step.rs` to improve error recovery and thread safety. - Added new functions for crash reporting and handling in the Python extension, enhancing the robustness of the crash capture mechanism. * Enhance Makefile with formatting targets and update component imports - Added new `fmt` and `fmt-check` targets to the Makefile for Rust code formatting using `cargo fmt`. - Updated the help section in the Makefile to include the new formatting commands. - Reordered imports in `traces.rs` for consistency and clarity, moving `PageContainer` and `RefreshButton` to the correct position. - Restored the `span_timeline` module import in `mod.rs` to ensure proper component usage. --- Cargo.lock | 15 + Makefile | 12 +- examples/crash_demo.py | 42 ++ examples/crash_torchrun_demo.py | 51 +++ examples/run_crash_torchrun.sh | 26 ++ probing/core/src/core/memtable_sql.rs | 18 +- probing/core/src/trace/mod.rs | 4 +- probing/core/src/trace/step.rs | 49 ++ probing/extensions/python/Cargo.toml | 3 + .../python/src/extensions/python.rs | 15 +- .../python/src/extensions/python/exttbls.rs | 50 ++- .../extensions/python/src/features/crash.rs | 203 --------- .../python/src/features/crash/api.rs | 56 +++ .../python/src/features/crash/grace.rs | 134 ++++++ .../python/src/features/crash/handler.rs | 259 +++++++++++ .../python/src/features/crash/mod.rs | 122 +++++ .../python/src/features/crash/report.rs | 215 +++++++++ .../python/src/features/crash/signal.rs | 425 ++++++++++++++++++ .../extensions/python/src/features/tracing.rs | 104 ++++- probing/extensions/python/src/python.rs | 72 +-- probing/memtable/Cargo.toml | 1 + probing/memtable/src/memtable.rs | 12 +- probing/memtable/src/row.rs | 110 ++++- probing/memtable/src/writer.rs | 15 +- python/probing/__init__.py | 10 + python/probing/_entrypoint.py | 27 ++ python/probing/crash.py | 169 +++++++ python/probing/ext/torch.py | 6 + python/probing/handlers/pythonext.py | 18 + python/probing/profiling/collective/record.py | 11 + python/probing/site_hook.py | 18 +- python/probing/torchrun_cluster.py | 11 +- skills/catalog.yaml | 13 + skills/crash_triage/SKILL.md | 25 ++ skills/crash_triage/steps.yaml | 28 ++ src/lib.rs | 10 +- tests/regression/skills/test_install_tools.py | 6 +- tests/regression/spec/api_spec.json | 12 + tests/unit/probing/skills/test_loader.py | 5 +- web/assets/tailwind.css | 112 +++++ web/src/components/mod.rs | 1 + web/src/components/span_timeline.rs | 280 ++++++++++++ web/src/pages/traces.rs | 200 +++++---- 43 files changed, 2547 insertions(+), 428 deletions(-) create mode 100644 examples/crash_demo.py create mode 100644 examples/crash_torchrun_demo.py create mode 100755 examples/run_crash_torchrun.sh delete mode 100644 probing/extensions/python/src/features/crash.rs create mode 100644 probing/extensions/python/src/features/crash/api.rs create mode 100644 probing/extensions/python/src/features/crash/grace.rs create mode 100644 probing/extensions/python/src/features/crash/handler.rs create mode 100644 probing/extensions/python/src/features/crash/mod.rs create mode 100644 probing/extensions/python/src/features/crash/report.rs create mode 100644 probing/extensions/python/src/features/crash/signal.rs create mode 100644 python/probing/crash.py create mode 100644 skills/crash_triage/SKILL.md create mode 100644 skills/crash_triage/steps.yaml create mode 100644 web/src/components/span_timeline.rs diff --git a/Cargo.lock b/Cargo.lock index 651b58ac..e0309640 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3431,6 +3431,7 @@ name = "probing-memtable" version = "0.2.5" dependencies = [ "libc", + "log", "memmap2", "pco", "xxhash-rust", @@ -3500,10 +3501,13 @@ dependencies = [ "pyo3-build-config", "regex", "rustc-demangle", + "serde", "serde_json", + "sha2", "signal-hook-registry", "tempfile", "tokio", + "uuid", ] [[package]] @@ -4061,6 +4065,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "2.0.1" diff --git a/Makefile b/Makefile index dcfb840c..283cc0f1 100644 --- a/Makefile +++ b/Makefile @@ -47,6 +47,9 @@ CLIPPY_WORKSPACE := cargo clippy --workspace --all-targets --no-default-features CLIPPY_CORE := cargo clippy -p probing-core --all-targets --no-default-features $(CLIPPY_DENY) CLIPPY_WEB := cd web && cargo clippy --all-targets $(CLIPPY_DENY) +FMT_WORKSPACE := cargo fmt --all +FMT_WEB := cd web && cargo fmt --all + # ============================================================================== .PHONY: help help: @@ -60,6 +63,7 @@ help: @echo " install-wheel pip install dist/probing-*.whl" @echo " venv create/refresh project .venv (used by develop and CI)" @echo " test / lint Full test and lint suites" + @echo " fmt rustfmt workspace + web (same paths as CI)" @echo " check-dev Quick env sanity check" @echo " clean Remove build artifacts" @echo "" @@ -203,7 +207,7 @@ PYTEST_WHEEL_FLAGS := --import-mode=importlib -o pythonpath= -o "addopts=--verbo PYTEST_WHEEL_EXTRA ?= .PHONY: test test-rust test-rust-unit test-rust-regression test-python test-python-unit test-python-regression test-doctest test-python-wheel coverage-python-wheel -.PHONY: lint lint-python lint-rust lint-core clippy clippy-fix coverage coverage-rust coverage-python bootstrap clean docs-install docs docs-serve docs-clean +.PHONY: fmt fmt-check lint lint-python lint-rust lint-core clippy clippy-fix coverage coverage-rust coverage-python bootstrap clean docs-install docs docs-serve docs-clean test: test-rust test-python test-rust: test-rust-unit test-rust-regression @@ -241,6 +245,12 @@ coverage-python-wheel: $(MAKE) test-python-wheel PYTEST_WHEEL_EXTRA="--cov=probing --cov=tests --cov-report=xml:coverage.xml" lint: lint-python lint-rust +fmt: + $(FMT_WORKSPACE) + $(FMT_WEB) +fmt-check: + $(FMT_WORKSPACE) -- --check + $(FMT_WEB) -- --check lint-core: $(CLIPPY_CORE) lint-python: diff --git a/examples/crash_demo.py b/examples/crash_demo.py new file mode 100644 index 00000000..8d111cdf --- /dev/null +++ b/examples/crash_demo.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +"""单进程 crash demo — ``PROBING=1 python examples/crash_demo.py [--mode exception]``. + +Probing 由 site hook 自动加载;本脚本不 import probing。 +``record``:后台线程异常,写入 memtable 后正常退出;``exception``:主线程崩溃。 +""" + +from __future__ import annotations + +import argparse +import os +import threading + + +def _crash(*, record_only: bool) -> None: + def boom() -> None: + def inner() -> None: + raise ValueError("demo crash from crash_demo.py") + + inner() + + if record_only: + t = threading.Thread(target=boom, name="crash-demo", daemon=True) + t.start() + t.join() + else: + boom() + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("--mode", choices=("record", "exception"), default="record") + args = p.parse_args() + + os.environ.setdefault("RANK", "0") + os.environ.setdefault("LOCAL_RANK", "0") + + _crash(record_only=args.mode == "record") + + +if __name__ == "__main__": + main() diff --git a/examples/crash_torchrun_demo.py b/examples/crash_torchrun_demo.py new file mode 100644 index 00000000..57e953e2 --- /dev/null +++ b/examples/crash_torchrun_demo.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +"""torchrun crash demo — run via ``./examples/run_crash_torchrun.sh``. + +Probing loads from ``PROBING=…`` (site hook); crash capture needs no imports here. +Modes: ``record`` (thread exception, process stays up), ``exception`` / ``all`` (fatal). +""" + +from __future__ import annotations + +import argparse +import os +import threading + +import torch.distributed as dist + + +def _crash(rank: int, *, record_only: bool) -> None: + def boom() -> None: + raise RuntimeError(f"demo crash on rank {rank}") + + if record_only: + t = threading.Thread(target=boom, name=f"crash-r{rank}", daemon=True) + t.start() + t.join() + else: + boom() + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("--mode", choices=("record", "exception", "all"), default="record") + p.add_argument("--crash-rank", type=int, default=1) + p.add_argument("--backend", default=os.environ.get("PROBING_TORCH_BACKEND", "gloo")) + args = p.parse_args() + + dist.init_process_group(backend=args.backend) + rank, world = dist.get_rank(), dist.get_world_size() + print(f"[rank {rank}/{world}] ready", flush=True) + + dist.barrier() + if args.mode == "all" or rank == args.crash_rank: + _crash(rank, record_only=args.mode == "record") + + if args.mode == "record": + dist.barrier() + + dist.destroy_process_group() + + +if __name__ == "__main__": + main() diff --git a/examples/run_crash_torchrun.sh b/examples/run_crash_torchrun.sh new file mode 100755 index 00000000..1d4dd167 --- /dev/null +++ b/examples/run_crash_torchrun.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# torchrun crash demo — run from repo root: ./examples/run_crash_torchrun.sh [mode] [crash-rank] +# mode: record (default) | exception | all +set -euo pipefail + +cd "$(dirname "$0")/.." +[[ -f .venv/bin/activate ]] && source .venv/bin/activate + +MODE="${1:-record}" +CRASH_RANK="${2:-1}" +NPROC="${NPROC:-4}" +MASTER_PORT="${MASTER_PORT:-29571}" + +export PROBING="${PROBING:-regex:crash_torchrun_demo.py}" +export MASTER_ADDR=127.0.0.1 +export MASTER_PORT +[[ "$(uname -s)" == Darwin ]] && export GLOO_SOCKET_IFNAME="${GLOO_SOCKET_IFNAME:-lo0}" + +python -c "import torch" 2>/dev/null || { + echo "need torch: uv pip install torch" >&2 + exit 1 +} + +exec torchrun --standalone --nnodes=1 --nproc_per_node="$NPROC" \ + --master_addr=127.0.0.1 --master_port="$MASTER_PORT" --local_addr=127.0.0.1 \ + examples/crash_torchrun_demo.py --mode "$MODE" --crash-rank "$CRASH_RANK" diff --git a/probing/core/src/core/memtable_sql.rs b/probing/core/src/core/memtable_sql.rs index db3d2a58..73821b5f 100644 --- a/probing/core/src/core/memtable_sql.rs +++ b/probing/core/src/core/memtable_sql.rs @@ -29,7 +29,7 @@ use std::collections::{BTreeSet, HashSet}; use std::panic::AssertUnwindSafe; use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, MutexGuard}; use std::thread::JoinHandle; use std::time::Duration; @@ -1104,6 +1104,18 @@ pub struct ColdCompactor { handle: Mutex>>, } +fn lock_compactor_handle( + m: &Mutex>>, +) -> MutexGuard<'_, Option>> { + match m.lock() { + Ok(guard) => guard, + Err(e) => { + log::debug!("ColdCompactor handle mutex poisoned; recovering"); + e.into_inner() + } + } +} + impl ColdCompactor { pub fn instance() -> &'static Self { static INSTANCE: Lazy = Lazy::new(|| ColdCompactor { @@ -1176,7 +1188,7 @@ impl ColdCompactor { } }) .expect("spawn memc-compactor thread"); - *self.handle.lock().unwrap() = Some(handle); + *lock_compactor_handle(&self.handle) = Some(handle); } /// Signal the thread to flush and exit, then join it. @@ -1184,7 +1196,7 @@ impl ColdCompactor { if !self.running.swap(false, Ordering::SeqCst) { return; } - if let Some(h) = self.handle.lock().unwrap().take() { + if let Some(h) = lock_compactor_handle(&self.handle).take() { let _ = h.join(); } } diff --git a/probing/core/src/trace/mod.rs b/probing/core/src/trace/mod.rs index fd26b574..461523e9 100644 --- a/probing/core/src/trace/mod.rs +++ b/probing/core/src/trace/mod.rs @@ -3,8 +3,8 @@ mod step; pub use span::{attr, Attribute, Ele, Event, Location, Span, SpanStatus, Timestamp}; pub use step::{ - advance_micro_step, current_micro_step, set_micro_batches, step_snapshot, sync_micro_step, - StepSnapshot, + advance_micro_step, crash_atomic_step, crash_step_snapshot, current_micro_step, + set_micro_batches, step_snapshot, sync_micro_step, StepSnapshot, }; // --- Custom Error Type --- diff --git a/probing/core/src/trace/step.rs b/probing/core/src/trace/step.rs index 64bae4f9..748bb166 100644 --- a/probing/core/src/trace/step.rs +++ b/probing/core/src/trace/step.rs @@ -1,4 +1,15 @@ use std::cell::RefCell; +use std::sync::atomic::{AtomicI64, AtomicU64, Ordering}; + +static GLOBAL_MICRO_STEP: AtomicU64 = AtomicU64::new(0); +static GLOBAL_MICRO_BATCHES: AtomicU64 = AtomicU64::new(1); +static CACHED_RANK: AtomicI64 = AtomicI64::new(0); +static CACHED_WORLD_SIZE: AtomicI64 = AtomicI64::new(1); + +fn refresh_cached_dist() { + CACHED_RANK.store(read_rank(), Ordering::Relaxed); + CACHED_WORLD_SIZE.store(read_world_size(), Ordering::Relaxed); +} /// Training step coordinates. /// @@ -25,6 +36,7 @@ struct StepContext { impl Default for StepContext { fn default() -> Self { + refresh_cached_dist(); Self { micro_step: 0, micro_batches: read_micro_batches(), @@ -49,16 +61,53 @@ impl StepContext { fn sync_micro_step(&mut self, step: u64) -> StepSnapshot { self.micro_step = step; + publish_global(self.micro_step, self.micro_batches); self.snapshot() } fn advance_micro_step(&mut self) -> StepSnapshot { self.micro_step = self.micro_step.saturating_add(1); + publish_global(self.micro_step, self.micro_batches); self.snapshot() } fn set_micro_batches(&mut self, micro_batches: u64) { self.micro_batches = micro_batches.max(1); + GLOBAL_MICRO_BATCHES.store(self.micro_batches, Ordering::Relaxed); + } +} + +fn publish_global(micro_step: u64, micro_batches: u64) { + GLOBAL_MICRO_STEP.fetch_max(micro_step, Ordering::Relaxed); + GLOBAL_MICRO_BATCHES.store(micro_batches.max(1), Ordering::Relaxed); +} + +/// Best-effort step coordinates for crash reporting (prefers thread-local, falls +/// back to process-wide high-water mark when the crashing thread never advanced step). +pub fn crash_step_snapshot() -> StepSnapshot { + let local = step_snapshot(); + if local.micro_step > 0 { + return local; + } + atomic_step_snapshot() +} + +/// Async-signal-safe: global high-water step only (no thread-local / env reads). +pub fn crash_atomic_step() -> StepSnapshot { + atomic_step_snapshot() +} + +fn atomic_step_snapshot() -> StepSnapshot { + let micro = GLOBAL_MICRO_STEP.load(Ordering::Relaxed); + let batches = GLOBAL_MICRO_BATCHES.load(Ordering::Relaxed).max(1); + let training = training_step_for(micro, batches); + StepSnapshot { + micro_step: micro, + local_step: training, + global_step: training, + micro_batches: batches, + rank: CACHED_RANK.load(Ordering::Relaxed), + world_size: CACHED_WORLD_SIZE.load(Ordering::Relaxed), } } diff --git a/probing/extensions/python/Cargo.toml b/probing/extensions/python/Cargo.toml index 3d1b8e57..cc8b8789 100644 --- a/probing/extensions/python/Cargo.toml +++ b/probing/extensions/python/Cargo.toml @@ -25,7 +25,10 @@ ctor = { workspace = true } log = { workspace = true } nix = { workspace = true } once_cell = { workspace = true } +serde = { workspace = true } serde_json = { workspace = true } +sha2 = "0.10" +uuid = { version = "1.0", features = ["v4"] } tokio = { workspace = true } html-escape = "0.2" diff --git a/probing/extensions/python/src/extensions/python.rs b/probing/extensions/python/src/extensions/python.rs index f3dd9d18..d8312371 100644 --- a/probing/extensions/python/src/extensions/python.rs +++ b/probing/extensions/python/src/extensions/python.rs @@ -22,7 +22,6 @@ pub use tbls::PythonProbeDataSource; use crate::features::stack_tracer::{SignalTracer, StackTracer}; use crate::python::enable_crash_handler; use crate::python::enable_monitoring; -use crate::python::CRASH_HANDLER; mod exttbls; mod tbls; @@ -51,8 +50,8 @@ impl Display for PyExtList { /// Python integration with the probing system #[derive(Debug, Default, ProbeExtension)] pub struct PythonExt { - /// Path to Python crash handler script (executed when interpreter crashes) - #[option(aliases = ["crash.handler"])] + /// Enable the crash handler module (`probing.crash`). Aliases: `crash.handler`. + #[option(aliases = ["crash.handler", "crash.enabled"])] crash_handler: Maybe, /// Path to Python monitoring handler script @@ -84,6 +83,10 @@ impl ProbeExtensionCall for PythonExt { ); let normalized_path = path.trim_start_matches('/'); + if normalized_path.starts_with("crash/") { + return crate::features::crash::handle_http(normalized_path, params, body) + .map_err(EngineError::PluginError); + } call_python_handler(normalized_path, params, body) } } @@ -102,7 +105,11 @@ impl PythonExt { )), Maybe::Just(handler) => { self.crash_handler = crash_handler.clone(); - CRASH_HANDLER.lock().unwrap().replace(handler.to_string()); + let lowered = handler.trim().to_ascii_lowercase(); + if lowered == "off" || lowered == "0" || lowered == "false" { + log::info!("Python crash handler disabled"); + return Ok(()); + } match enable_crash_handler() { Ok(_) => { log::info!("Python crash handler enabled: {handler}"); diff --git a/probing/extensions/python/src/extensions/python/exttbls.rs b/probing/extensions/python/src/extensions/python/exttbls.rs index 3b55867e..72bca5cf 100644 --- a/probing/extensions/python/src/extensions/python/exttbls.rs +++ b/probing/extensions/python/src/extensions/python/exttbls.rs @@ -13,7 +13,7 @@ //! epoch, `I64`) is always present, matching the previous TimeSeries layout. use std::collections::HashMap; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, MutexGuard}; use crate::features::native_bridge::with_detached_native; use once_cell::sync::Lazy; @@ -404,6 +404,26 @@ impl std::fmt::Debug for ExternBacking { pub static EXTERN_TABLES: Lazy>>>> = Lazy::new(|| Mutex::new(Default::default())); +fn lock_extern_tables() -> MutexGuard<'static, HashMap>>> { + match EXTERN_TABLES.lock() { + Ok(guard) => guard, + Err(e) => { + log::warn!("EXTERN_TABLES mutex poisoned; recovering"); + e.into_inner() + } + } +} + +fn lock_backing(backing: &Mutex) -> MutexGuard<'_, ExternBacking> { + match backing.lock() { + Ok(guard) => guard, + Err(e) => { + log::warn!("ExternBacking mutex poisoned; recovering"); + e.into_inner() + } + } +} + #[pyclass(from_py_object)] #[derive(Clone, Debug)] pub struct ExternalTable(Arc>, usize); @@ -437,9 +457,7 @@ impl ExternalTable { table_doc, column_docs, ))); - backing - .lock() - .expect("extern table lock") + lock_backing(backing.as_ref()) .ensure_registered() .expect("failed to register extern table for SQL catalog"); backing @@ -471,7 +489,7 @@ impl ExternalTable { table_doc, column_docs.unwrap_or_default(), ); - EXTERN_TABLES.lock().unwrap().insert(name, backing.clone()); + lock_extern_tables().insert(name, backing.clone()); ExternalTable(backing, ncolumn) }) } @@ -480,9 +498,9 @@ impl ExternalTable { fn get(_cls: &Bound<'_, PyType>, name: &str) -> PyResult { let name = name.to_string(); with_detached_native(move || { - let binding = EXTERN_TABLES.lock().unwrap(); + let binding = lock_extern_tables(); if let Some(backing) = binding.get(&name) { - let ncolumn = backing.lock().unwrap().columns.len(); + let ncolumn = lock_backing(backing.as_ref()).columns.len(); Ok(ExternalTable(backing.clone(), ncolumn)) } else { Err(pyo3::exceptions::PyValueError::new_err(format!( @@ -508,9 +526,9 @@ impl ExternalTable { let _ = chunk_size; let name = name.to_string(); with_detached_native(move || { - let mut binding = EXTERN_TABLES.lock().unwrap(); + let mut binding = lock_extern_tables(); if let Some(backing) = binding.get(&name) { - let ncolumn = backing.lock().unwrap().columns.len(); + let ncolumn = lock_backing(backing.as_ref()).columns.len(); Ok(ExternalTable(backing.clone(), ncolumn)) } else { let ncolumn = columns.len(); @@ -532,14 +550,14 @@ impl ExternalTable { fn drop(_cls: &Bound<'_, PyType>, name: &str) -> PyResult<()> { let name = name.to_string(); with_detached_native(move || { - let _ = EXTERN_TABLES.lock().unwrap().remove(&name); + let _ = lock_extern_tables().remove(&name); Ok(()) }) } fn names(&self) -> Vec { let backing = self.0.clone(); - with_detached_native(move || backing.lock().unwrap().columns.clone()) + with_detached_native(move || lock_backing(backing.as_ref()).columns.clone()) } fn append(&mut self, values: Vec>) -> PyResult<()> { @@ -551,9 +569,7 @@ impl ExternalTable { let eles = Self::extract_eles(values); let backing = self.0.clone(); with_detached_native(move || { - backing - .lock() - .unwrap() + lock_backing(backing.as_ref()) .append(now_micros(), &eles) .map_err(pyo3::exceptions::PyValueError::new_err) }) @@ -568,9 +584,7 @@ impl ExternalTable { let eles = Self::extract_eles(values); let backing = self.0.clone(); with_detached_native(move || { - backing - .lock() - .unwrap() + lock_backing(backing.as_ref()) .append(t, &eles) .map_err(pyo3::exceptions::PyValueError::new_err) }) @@ -587,7 +601,7 @@ impl ExternalTable { fn take(&self, limit: Option) -> PyResult> { let backing = self.0.clone(); with_detached_native(move || { - let rows = backing.lock().unwrap().take(limit); + let rows = lock_backing(backing.as_ref()).take(limit); let result = rows .iter() .map(|(t, vals)| { diff --git a/probing/extensions/python/src/features/crash.rs b/probing/extensions/python/src/features/crash.rs deleted file mode 100644 index e0852c3f..00000000 --- a/probing/extensions/python/src/features/crash.rs +++ /dev/null @@ -1,203 +0,0 @@ -//! Fatal-signal backtrace dumper. -//! -//! On `SIGSEGV` / `SIGBUS` / `SIGABRT` / `SIGILL` / `SIGFPE` we print the -//! crashing thread's native backtrace to stderr, then restore the default -//! disposition and re-raise the signal so the process still produces a core -//! dump / exits with the usual status. This is purely a debugging aid for -//! diagnosing the profiler/native crashes. -//! -//! The handler runs on a dedicated `sigaltstack` (so a stack-overflow crash can -//! still be reported) and avoids heap allocation on its hot path: integers are -//! formatted into stack buffers and symbol names are written as their raw bytes -//! via `write(2)`. Symbolization (`backtrace::*_unsynchronized`) is not strictly -//! async-signal-safe, but this only ever runs once, while the process is already -//! dying; a recursive fault is caught by a guard that immediately re-raises with -//! the default handler. - -use core::ffi::{c_int, c_void}; -use std::sync::atomic::{AtomicBool, Ordering}; - -use nix::libc; - -static INSTALLED: AtomicBool = AtomicBool::new(false); -static IN_HANDLER: AtomicBool = AtomicBool::new(false); - -const FATAL_SIGNALS: [c_int; 5] = [ - libc::SIGSEGV, - libc::SIGBUS, - libc::SIGABRT, - libc::SIGILL, - libc::SIGFPE, -]; - -const MAX_FRAMES: usize = 256; -const ALT_STACK_SIZE: usize = 256 * 1024; - -static mut ALT_STACK: [u8; ALT_STACK_SIZE] = [0u8; ALT_STACK_SIZE]; - -fn sig_name(sig: c_int) -> &'static str { - match sig { - libc::SIGSEGV => "SIGSEGV", - libc::SIGBUS => "SIGBUS", - libc::SIGABRT => "SIGABRT", - libc::SIGILL => "SIGILL", - libc::SIGFPE => "SIGFPE", - _ => "SIGNAL", - } -} - -#[inline] -unsafe fn write_str(s: &str) { - let _ = libc::write(2, s.as_ptr() as *const c_void, s.len()); -} - -#[inline] -unsafe fn write_bytes(b: &[u8]) { - let _ = libc::write(2, b.as_ptr() as *const c_void, b.len()); -} - -/// Write `v` as lowercase hex (no `0x` prefix), no allocation. -unsafe fn write_hex(v: usize) { - if v == 0 { - write_str("0"); - return; - } - let mut buf = [0u8; 16]; - let mut i = buf.len(); - let mut val = v; - while val > 0 { - i -= 1; - let d = (val & 0xf) as u8; - buf[i] = if d < 10 { b'0' + d } else { b'a' + (d - 10) }; - val >>= 4; - } - write_bytes(&buf[i..]); -} - -/// Write `v` as decimal, no allocation. -unsafe fn write_dec(v: usize) { - if v == 0 { - write_str("0"); - return; - } - let mut buf = [0u8; 20]; - let mut i = buf.len(); - let mut val = v; - while val > 0 { - i -= 1; - buf[i] = b'0' + (val % 10) as u8; - val /= 10; - } - write_bytes(&buf[i..]); -} - -unsafe fn current_tid() -> u64 { - #[cfg(target_os = "linux")] - { - libc::syscall(libc::SYS_gettid) as u64 - } - #[cfg(target_os = "macos")] - { - let mut t: u64 = 0; - libc::pthread_threadid_np(0, &mut t); - t - } - #[cfg(not(any(target_os = "linux", target_os = "macos")))] - { - 0 - } -} - -unsafe fn restore_and_reraise(sig: c_int) { - let mut sa: libc::sigaction = std::mem::zeroed(); - sa.sa_sigaction = libc::SIG_DFL; - libc::sigemptyset(&mut sa.sa_mask); - sa.sa_flags = 0; - libc::sigaction(sig, &sa, std::ptr::null_mut()); - libc::raise(sig); -} - -unsafe extern "C" fn crash_handler(sig: c_int, info: *mut libc::siginfo_t, _uctx: *mut c_void) { - // A fault *inside* the dump (e.g. while symbolizing) must not loop forever. - if IN_HANDLER.swap(true, Ordering::SeqCst) { - restore_and_reraise(sig); - return; - } - - write_str("\n==== probing: fatal signal "); - write_str(sig_name(sig)); - write_str(" ("); - write_dec(sig as usize); - write_str(") on thread "); - write_dec(current_tid() as usize); - write_str(" ====\n"); - - if !info.is_null() { - let addr = (*info).si_addr() as usize; - write_str("fault address: 0x"); - write_hex(addr); - write_str("\n"); - } - - write_str("native backtrace (crashing thread):\n"); - - let mut idx = 0usize; - backtrace::trace_unsynchronized(|frame| { - let ip = frame.ip() as usize; - write_str(" #"); - write_dec(idx); - write_str(" 0x"); - write_hex(ip); - write_str(" "); - - let mut wrote_name = false; - backtrace::resolve_frame_unsynchronized(frame, |symbol| { - if !wrote_name { - if let Some(name) = symbol.name() { - if let Some(s) = name.as_str() { - write_bytes(s.as_bytes()); - wrote_name = true; - } - } - } - }); - if !wrote_name { - write_str(""); - } - write_str("\n"); - - idx += 1; - idx < MAX_FRAMES - }); - - write_str("==== end probing backtrace; re-raising "); - write_str(sig_name(sig)); - write_str(" ====\n"); - - restore_and_reraise(sig); -} - -/// Install backtrace-on-crash handlers for the common fatal signals. Idempotent. -pub fn install_crash_handler() { - if INSTALLED.swap(true, Ordering::SeqCst) { - return; - } - - unsafe { - let mut ss: libc::stack_t = std::mem::zeroed(); - ss.ss_sp = core::ptr::addr_of_mut!(ALT_STACK) as *mut c_void; - ss.ss_size = ALT_STACK_SIZE; - ss.ss_flags = 0; - libc::sigaltstack(&ss, std::ptr::null_mut()); - - for &sig in FATAL_SIGNALS.iter() { - let mut sa: libc::sigaction = std::mem::zeroed(); - sa.sa_sigaction = crash_handler as *const () as usize; - sa.sa_flags = libc::SA_SIGINFO | libc::SA_ONSTACK; - libc::sigemptyset(&mut sa.sa_mask); - libc::sigaction(sig, &sa, std::ptr::null_mut()); - } - } - - log::info!("probing: crash backtrace handler installed"); -} diff --git a/probing/extensions/python/src/features/crash/api.rs b/probing/extensions/python/src/features/crash/api.rs new file mode 100644 index 00000000..436384a1 --- /dev/null +++ b/probing/extensions/python/src/features/crash/api.rs @@ -0,0 +1,56 @@ +//! Python-facing crash API (``probing._core``). + +use pyo3::prelude::*; + +use super::config; +use super::grace; +use super::handler::{self, CrashInput}; + +#[pyfunction] +pub fn crash_enabled() -> bool { + config::enabled() +} + +#[pyfunction] +#[allow(clippy::too_many_arguments)] // PyO3 signature mirrors Python excepthook payload +#[pyo3(signature = (kind, exception_type, message, traceback, top_frame, native_backtrace="", finalize=true, thread_stacks="", crash_thread=""))] +pub fn record_crash( + kind: &str, + exception_type: &str, + message: &str, + traceback: &str, + top_frame: &str, + native_backtrace: &str, + finalize: bool, + thread_stacks: &str, + crash_thread: &str, +) -> PyResult { + Ok(handler::record(CrashInput { + kind: kind.to_string(), + exception_type: exception_type.to_string(), + message: message.to_string(), + top_frame: top_frame.to_string(), + traceback: traceback.to_string(), + native_backtrace: native_backtrace.to_string(), + crash_thread: crash_thread.to_string(), + thread_stacks: thread_stacks.to_string(), + finalize, + })) +} + +#[pyfunction] +#[pyo3(signature = (op, group_size=0, bytes=0, global_step=-1))] +pub fn note_last_comm(op: &str, group_size: i32, bytes: i64, global_step: i64) { + handler::note_last_comm(op, group_size, bytes, global_step); +} + +#[pyfunction] +pub fn request_crash_hold() { + grace::request_hold(); +} + +#[pyfunction] +#[pyo3(signature = (exit_after=true))] +pub fn request_crash_release(exit_after: bool) { + grace::request_release(exit_after); +} diff --git a/probing/extensions/python/src/features/crash/grace.rs b/probing/extensions/python/src/features/crash/grace.rs new file mode 100644 index 00000000..5b8f6665 --- /dev/null +++ b/probing/extensions/python/src/features/crash/grace.rs @@ -0,0 +1,134 @@ +//! Grace period and interactive hold before process exit (non-signal path). + +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Mutex; +use std::time::{Duration, Instant}; + +use super::config; +use super::context; + +static HELD: AtomicBool = AtomicBool::new(false); +static RELEASED: AtomicBool = AtomicBool::new(false); +static EXIT_AFTER_RELEASE: Mutex = Mutex::new(true); +static SIGNALS_REGISTERED: AtomicBool = AtomicBool::new(false); + +pub fn is_held() -> bool { + HELD.load(Ordering::SeqCst) +} + +pub fn request_hold() { + HELD.store(true, Ordering::SeqCst); +} + +pub fn request_release(exit_after: bool) { + if let Ok(mut guard) = EXIT_AFTER_RELEASE.lock() { + *guard = exit_after; + } + RELEASED.store(true, Ordering::SeqCst); + HELD.store(false, Ordering::SeqCst); +} + +pub fn should_run_grace() -> bool { + if config::force_hold() { + return true; + } + if config::grace_sec() == 0 { + return false; + } + if config::grace_all_ranks() { + return true; + } + let ctx = context::snapshot(); + ctx.rank == 0 || ctx.local_rank == 0 +} + +pub fn grace_and_maybe_hold(exit_code: i32) -> i32 { + register_signals(); + let ctx = context::snapshot(); + + if config::force_hold() { + request_hold(); + } + + if !should_run_grace() && !is_held() { + return exit_code; + } + + let deadline = Instant::now() + Duration::from_secs(config::grace_sec()); + loop { + if RELEASED.load(Ordering::SeqCst) { + let exit_after = EXIT_AFTER_RELEASE.lock().map(|g| *g).unwrap_or(true); + return if exit_after { exit_code } else { 0 }; + } + if hold_triggered(ctx.pid) { + request_hold(); + print_hold_banner(ctx.pid, ctx.rank); + while !RELEASED.load(Ordering::SeqCst) { + std::thread::sleep(Duration::from_millis(200)); + } + let exit_after = EXIT_AFTER_RELEASE.lock().map(|g| *g).unwrap_or(true); + return if exit_after { exit_code } else { 0 }; + } + if !is_held() && config::grace_sec() > 0 && Instant::now() >= deadline { + return exit_code; + } + if !is_held() && config::grace_sec() == 0 && !config::force_hold() { + return exit_code; + } + if !is_held() && config::grace_sec() > 0 { + let remaining = deadline.saturating_duration_since(Instant::now()).as_secs(); + eprint!( + "\r[probing crash] exiting in {remaining}s — ENTER/touch/kill -USR1 to hold..." + ); + } + std::thread::sleep(Duration::from_millis(250)); + } +} + +fn register_signals() { + if SIGNALS_REGISTERED.swap(true, Ordering::SeqCst) { + return; + } + #[cfg(unix)] + { + use nix::sys::signal::{self, SigHandler, Signal}; + unsafe { + let _ = signal::signal(Signal::SIGUSR1, SigHandler::Handler(on_hold_signal)); + let _ = signal::signal(Signal::SIGUSR2, SigHandler::Handler(on_release_signal)); + } + } +} + +#[cfg(unix)] +extern "C" fn on_hold_signal(_: nix::libc::c_int) { + request_hold(); +} + +#[cfg(unix)] +extern "C" fn on_release_signal(_: nix::libc::c_int) { + request_release(true); +} + +fn hold_triggered(pid: i32) -> bool { + if config::force_hold() { + return true; + } + if std::path::Path::new(&context::hold_file_path(pid)).exists() { + return true; + } + if is_held() { + return true; + } + false +} + +fn print_hold_banner(pid: i32, rank: i32) { + eprintln!( + "\nProcess HELD for debugging (pid={pid}, rank={rank}).\n\ + attach : gdb -p {pid}\n\ + python : py-spy dump --pid {pid}\n\ + release: curl -X POST http://127.0.0.1:/apis/pythonext/crash/release\n\ + rm {} && kill -USR2 {pid}\n", + context::hold_file_path(pid) + ); +} diff --git a/probing/extensions/python/src/features/crash/handler.rs b/probing/extensions/python/src/features/crash/handler.rs new file mode 100644 index 00000000..8cd7110a --- /dev/null +++ b/probing/extensions/python/src/features/crash/handler.rs @@ -0,0 +1,259 @@ +//! Python exception crash path: build event → spill → report → grace. + +use std::fs; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::time::{SystemTime, UNIX_EPOCH}; + +use once_cell::sync::Lazy; +use probing_core::trace::crash_step_snapshot; +use probing_memtable::discover::default_dir; +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; +use std::sync::Mutex; +use uuid::Uuid; + +use crate::features::tracing::crash_span_snapshot; + +use super::grace; +use super::report; +use super::{config, context}; + +static LAST_COMM: Lazy>> = Lazy::new(|| Mutex::new(None)); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct CrashEvent { + pub event_id: String, + pub timestamp_ns: i64, + pub kind: String, + pub rank: i32, + pub local_rank: i32, + pub world_size: i32, + pub host: String, + pub pid: i32, + pub exception_type: String, + pub message: String, + pub top_frame: String, + pub traceback: String, + pub native_backtrace: String, + pub crash_thread: String, + pub thread_stacks: String, + pub fingerprint: String, + pub global_step: i64, + pub local_step: i64, + pub micro_step: i64, + pub training_phase: String, + pub active_span: String, + pub last_comm_op: String, +} + +pub struct CrashInput { + pub kind: String, + pub exception_type: String, + pub message: String, + pub top_frame: String, + pub traceback: String, + pub native_backtrace: String, + pub crash_thread: String, + pub thread_stacks: String, + pub finalize: bool, +} + +pub fn note_last_comm(op: &str, _group_size: i32, _bytes: i64, _global_step: i64) { + if op.is_empty() { + return; + } + if let Ok(mut guard) = LAST_COMM.lock() { + *guard = Some(op.to_string()); + } +} + +pub fn signal_spill_path(pid: i32) -> PathBuf { + crash_dir().join(pid.to_string()).join("signal-latest.json") +} + +pub fn record(input: CrashInput) -> i32 { + if !config::enabled() { + return if input.finalize { 1 } else { 0 }; + } + + let ctx = context::snapshot(); + let training = training_context(); + let message = truncate(&input.message, 2000); + let fp = fingerprint(&input.exception_type, &message, &input.top_frame); + + let event = CrashEvent { + event_id: new_event_id(), + timestamp_ns: SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|d| d.as_nanos() as i64) + .unwrap_or(0), + kind: input.kind, + rank: ctx.rank, + local_rank: ctx.local_rank, + world_size: ctx.world_size, + host: ctx.host, + pid: ctx.pid, + exception_type: input.exception_type, + message, + top_frame: input.top_frame, + traceback: truncate(&input.traceback, 64000), + native_backtrace: truncate(&input.native_backtrace, 64000), + crash_thread: input.crash_thread, + thread_stacks: truncate(&input.thread_stacks, 64000), + fingerprint: fp, + global_step: training.global_step, + local_step: training.local_step, + micro_step: training.micro_step, + training_phase: training.training_phase, + active_span: training.active_span, + last_comm_op: training.last_comm_op, + }; + + let spill_path = if config::spill_enabled() { + spill_event(&event) + } else { + None + }; + let grace_sec = if input.finalize && grace::should_run_grace() { + config::grace_sec() + } else { + 0 + }; + + if input.finalize { + report::print_report( + &event, + grace_sec, + config::force_hold(), + spill_path.as_deref(), + ); + } else { + report::print_summary(&event, spill_path.as_deref()); + } + + if !input.finalize { + return 1; + } + grace::grace_and_maybe_hold(1) +} + +struct TrainingContext { + global_step: i64, + local_step: i64, + micro_step: i64, + training_phase: String, + active_span: String, + last_comm_op: String, +} + +fn training_context() -> TrainingContext { + let step = crash_step_snapshot(); + let spans = crash_span_snapshot(); + let comm = LAST_COMM.lock().ok().and_then(|g| g.clone()); + TrainingContext { + global_step: i64::try_from(step.global_step).unwrap_or(-1), + local_step: i64::try_from(step.local_step).unwrap_or(-1), + micro_step: i64::try_from(step.micro_step).unwrap_or(-1), + training_phase: spans.training_phase.clone(), + active_span: spans.active_name.clone(), + last_comm_op: comm.unwrap_or_default(), + } +} + +fn crash_dir() -> PathBuf { + default_dir().join("crash") +} + +fn spill_event(event: &CrashEvent) -> Option { + let json = serde_json::to_string(event).ok()?; + let path = crash_dir() + .join(event.pid.to_string()) + .join(format!("{}.json", event.event_id)); + write_atomic(&path, json.as_bytes()).ok()?; + let _ = write_atomic( + &crash_dir().join(event.pid.to_string()).join("latest.json"), + json.as_bytes(), + ); + Some(path) +} + +fn write_atomic(path: &Path, data: &[u8]) -> std::io::Result<()> { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + let tmp = path.with_extension("json.tmp"); + { + let mut file = fs::File::create(&tmp)?; + file.write_all(data)?; + file.sync_all()?; + } + fs::rename(tmp, path) +} + +fn new_event_id() -> String { + Uuid::new_v4().simple().to_string() +} + +fn truncate(text: &str, limit: usize) -> String { + if text.len() <= limit { + text.to_string() + } else { + format!("{}...", &text[..limit.saturating_sub(3)]) + } +} + +fn fingerprint(exception_type: &str, message: &str, top_frame: &str) -> String { + let msg = message.trim().replace('\n', " "); + let msg = if msg.len() <= 120 { + msg + } else { + msg[..120].to_string() + }; + let payload = format!("{exception_type}|{top_frame}|{msg}"); + let digest = Sha256::digest(payload.as_bytes()); + digest[..8].iter().map(|b| format!("{:02x}", b)).collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn fingerprint_stable() { + let a = fingerprint("ValueError", "bad", "train.py:10 in step"); + let b = fingerprint("ValueError", "bad", "train.py:10 in step"); + assert_eq!(a, b); + assert_eq!(a.len(), 16); + } + + #[test] + fn spill_writes_files() { + let event = CrashEvent { + event_id: new_event_id(), + timestamp_ns: 1, + kind: "python_exception".into(), + rank: 0, + local_rank: 0, + world_size: 1, + host: "localhost".into(), + pid: 4242, + exception_type: "RuntimeError".into(), + message: "boom".into(), + top_frame: "t.py:1".into(), + traceback: String::new(), + native_backtrace: String::new(), + crash_thread: String::new(), + thread_stacks: String::new(), + fingerprint: "abc".into(), + global_step: 0, + local_step: 0, + micro_step: 0, + training_phase: String::new(), + active_span: String::new(), + last_comm_op: String::new(), + }; + let path = spill_event(&event).expect("spill"); + assert!(path.exists()); + } +} diff --git a/probing/extensions/python/src/features/crash/mod.rs b/probing/extensions/python/src/features/crash/mod.rs new file mode 100644 index 00000000..55b466c3 --- /dev/null +++ b/probing/extensions/python/src/features/crash/mod.rs @@ -0,0 +1,122 @@ +//! Crash capture — stderr + spill + grace. +//! +//! Python ``excepthook`` only. Post-mortem: logs and ``default_dir()/crash//latest.json``. + +mod api; +mod grace; +mod handler; +mod report; +mod signal; + +pub use api::{ + crash_enabled, note_last_comm, record_crash, request_crash_hold, request_crash_release, +}; +pub use signal::install_crash_handler; + +pub(crate) mod config { + pub fn enabled() -> bool { + match std::env::var("PROBING_CRASH") { + Ok(val) => { + let lower = val.trim().to_ascii_lowercase(); + !matches!(lower.as_str(), "0" | "false" | "no" | "off") + } + Err(_) => true, + } + } + + pub fn grace_sec() -> u64 { + if env_truthy("PROBING_CRASH_NO_GRACE", false) { + return 0; + } + std::env::var("PROBING_CRASH_GRACE_SEC") + .ok() + .and_then(|v| v.trim().parse().ok()) + .unwrap_or(20) + } + + pub fn force_hold() -> bool { + env_truthy("PROBING_CRASH_HOLD", false) + } + + pub fn grace_all_ranks() -> bool { + env_truthy("PROBING_CRASH_GRACE_ALL_RANKS", false) + } + + pub fn spill_enabled() -> bool { + match std::env::var("PROBING_CRASH_SPILL") { + Ok(val) => { + let lower = val.trim().to_ascii_lowercase(); + !matches!(lower.as_str(), "0" | "false" | "no" | "off") + } + Err(_) => true, + } + } + + fn env_truthy(name: &str, default: bool) -> bool { + match std::env::var(name) { + Ok(val) => matches!( + val.trim().to_ascii_lowercase().as_str(), + "1" | "true" | "yes" | "on" + ), + Err(_) => default, + } + } +} + +pub(crate) mod context { + pub struct Snapshot { + pub rank: i32, + pub local_rank: i32, + pub world_size: i32, + pub host: String, + pub pid: i32, + } + + pub fn snapshot() -> Snapshot { + Snapshot { + rank: env_i32("RANK"), + local_rank: env_i32("LOCAL_RANK"), + world_size: env_i32("WORLD_SIZE"), + host: std::env::var("POD_IP") + .ok() + .filter(|s| !s.is_empty()) + .unwrap_or_else(|| { + std::env::var("HOSTNAME").unwrap_or_else(|_| "localhost".into()) + }), + pid: std::process::id() as i32, + } + } + + pub fn hold_file_path(pid: i32) -> String { + probing_memtable::discover::default_dir() + .join("crash") + .join(format!("hold-{pid}")) + .to_string_lossy() + .into() + } + + fn env_i32(key: &str) -> i32 { + std::env::var(key) + .ok() + .and_then(|v| v.trim().parse().ok()) + .unwrap_or(-1) + } +} + +pub fn handle_http( + path: &str, + _params: &std::collections::HashMap, + _body: &[u8], +) -> Result, String> { + match path { + "crash/hold" => { + grace::request_hold(); + Ok(r#"{"ok":true,"held":true}"#.into()) + } + "crash/release" => { + grace::request_release(true); + Ok(r#"{"ok":true,"released":true}"#.into()) + } + _ => Err(format!("unknown crash path: {path}")), + } +} diff --git a/probing/extensions/python/src/features/crash/report.rs b/probing/extensions/python/src/features/crash/report.rs new file mode 100644 index 00000000..0861d8b8 --- /dev/null +++ b/probing/extensions/python/src/features/crash/report.rs @@ -0,0 +1,215 @@ +//! Human-readable crash report rendering. + +use super::handler::CrashEvent; + +const WIDTH: usize = 72; + +fn rule(title: &str) -> String { + let head = format!("── {title} "); + let fill = WIDTH.saturating_sub(head.len()); + format!("{head}{}", "─".repeat(fill)) +} + +fn rank_label(event: &CrashEvent) -> String { + if event.world_size > 0 { + format!("rank {}/{}", event.rank, event.world_size) + } else if event.rank >= 0 { + format!("rank {}", event.rank) + } else { + "rank ?".into() + } +} + +fn step_line(event: &CrashEvent) -> String { + if event.global_step > 0 || event.local_step > 0 || event.micro_step > 0 { + let phase = if event.training_phase.is_empty() { + String::new() + } else { + format!(" phase={}", event.training_phase) + }; + format!( + " step global={} local={} micro={}{phase}", + event.global_step, event.local_step, event.micro_step + ) + } else { + " step (not in training loop)".into() + } +} + +fn context_lines(event: &CrashEvent) -> Vec { + let mut parts = vec![rank_label(event)]; + if event.local_rank >= 0 { + parts.push(format!("local_rank={}", event.local_rank)); + } + parts.push(format!("host={}", event.host)); + parts.push(format!("pid={}", event.pid)); + + let mut lines = vec![format!(" {}", parts.join(" "))]; + lines.push(step_line(event)); + if !event.active_span.is_empty() { + lines.push(format!(" span {}", event.active_span)); + } + if !event.last_comm_op.is_empty() { + lines.push(format!(" comm {}", event.last_comm_op)); + } + lines +} + +fn indent_block(text: &str, max_lines: usize) -> Vec { + let lines: Vec<&str> = text.trim_end().lines().collect(); + if lines.is_empty() { + return vec![]; + } + if lines.len() > max_lines { + let skip = lines.len() - max_lines; + let mut out = vec![format!(" … {skip} earlier frames omitted …")]; + for line in &lines[skip..] { + out.push(format!(" {line}")); + } + return out; + } + lines.iter().map(|line| format!(" {line}")).collect() +} + +fn stack_sections(event: &CrashEvent, all_threads_max: usize) -> Vec { + let mut lines = Vec::new(); + let python_hook = matches!(event.kind.as_str(), "python_exception" | "thread_exception"); + + if !python_hook && !event.traceback.is_empty() { + let crash_thread = if event.crash_thread.is_empty() { + "MainThread" + } else { + &event.crash_thread + }; + lines.push(format!( + " crash thread ({crash_thread}) — exception traceback" + )); + lines.extend(indent_block(&event.traceback, usize::MAX)); + } + + if !event.thread_stacks.is_empty() { + lines.push(" all threads — faulthandler snapshot".into()); + lines.extend(indent_block(&event.thread_stacks, all_threads_max)); + } else if !python_hook && !event.native_backtrace.is_empty() { + lines.push(" native backtrace".into()); + lines.extend(indent_block(&event.native_backtrace, 16)); + } + + lines +} + +fn format_event( + event: &CrashEvent, + fatal: bool, + grace_sec: u64, + hold_active: bool, + spill_path: Option<&std::path::Path>, +) -> String { + let title = if fatal { + format!("PROBING CRASH · {} · FATAL", event.kind) + } else { + format!("PROBING CRASH · {} · NON-FATAL", event.kind) + }; + let stacks_max = if fatal { 64 } else { 48 }; + let short_id = if event.event_id.len() > 16 { + &event.event_id[..16] + } else { + &event.event_id + }; + + let mut lines = vec![ + rule(&title), + format!(" exception {}: {}", event.exception_type, event.message), + format!(" at {}", event.top_frame), + ]; + lines.extend(context_lines(event)); + lines.push(format!( + " ids event={short_id} fingerprint={}", + event.fingerprint + )); + lines.extend(stack_sections(event, stacks_max)); + + if fatal { + if let Some(path) = spill_path { + lines.push(format!(" spill {}", path.display())); + } + if grace_sec > 0 { + lines.push(format!( + " hold {grace_sec}s grace — gdb -p {} · touch {} · kill -USR1", + event.pid, + super::context::hold_file_path(event.pid) + )); + } else if hold_active { + lines.push( + " hold active — kill -USR2 or POST /apis/pythonext/crash/release".into(), + ); + } + } else { + lines.push( + " status process continues — main thread did NOT exit; training may stall".into(), + ); + if let Some(path) = spill_path { + lines.push(format!(" spill {}", path.display())); + } + } + + lines.push("─".repeat(WIDTH)); + lines.join("\n") +} + +pub fn print_report( + event: &CrashEvent, + grace_sec: u64, + hold_active: bool, + spill_path: Option<&std::path::Path>, +) { + eprintln!( + "{}", + format_event(event, true, grace_sec, hold_active, spill_path) + ); +} + +pub fn print_summary(event: &CrashEvent, spill_path: Option<&std::path::Path>) { + eprintln!("{}", format_event(event, false, 0, false, spill_path)); +} + +#[cfg(test)] +mod tests { + use super::*; + + fn sample_event() -> CrashEvent { + CrashEvent { + event_id: "test-event-id".into(), + timestamp_ns: 1, + kind: "thread_exception".into(), + rank: 1, + local_rank: 1, + world_size: 4, + host: "node-a".into(), + pid: 99, + exception_type: "RuntimeError".into(), + message: "demo crash".into(), + top_frame: "demo.py:19 in boom".into(), + traceback: String::new(), + native_backtrace: String::new(), + crash_thread: "crash-r1".into(), + thread_stacks: "Thread 0x1 (MainThread)\n".into(), + fingerprint: "abc123".into(), + global_step: 42, + local_step: 42, + micro_step: 42, + training_phase: "backward".into(), + active_span: "train.step".into(), + last_comm_op: "all_reduce".into(), + } + } + + #[test] + fn summary_includes_training_context() { + let text = format_event(&sample_event(), false, 0, false, None); + assert!(text.contains("NON-FATAL")); + assert!(text.contains("global=42")); + assert!(text.contains("train.step")); + assert!(!text.contains("memtable")); + } +} diff --git a/probing/extensions/python/src/features/crash/signal.rs b/probing/extensions/python/src/features/crash/signal.rs new file mode 100644 index 00000000..d7757852 --- /dev/null +++ b/probing/extensions/python/src/features/crash/signal.rs @@ -0,0 +1,425 @@ +//! Fatal-signal backtrace dumper. +//! +//! On `SIGSEGV` / `SIGBUS` / `SIGABRT` / `SIGILL` / `SIGFPE` we print the +//! crashing thread's native backtrace to stderr, then restore the default +//! disposition and re-raise the signal so the process still produces a core +//! dump / exits with the usual status. This is purely a debugging aid for +//! diagnosing the profiler/native crashes. +//! +//! The handler runs on a dedicated `sigaltstack` (so a stack-overflow crash can +//! still be reported) and avoids heap allocation on its hot path: integers are +//! formatted into stack buffers and symbol names are written as their raw bytes +//! via `write(2)`. Symbolization (`backtrace::*_unsynchronized`) is not strictly +//! async-signal-safe, but this only ever runs once, while the process is already +//! dying; a recursive fault is caught by a guard that immediately re-raises with +//! the default handler. + +use core::ffi::{c_int, c_void}; +use std::sync::atomic::{AtomicBool, AtomicI32, AtomicUsize, Ordering}; + +use nix::libc; +use probing_core::trace::crash_atomic_step; + +use super::context; +use super::handler; + +static INSTALLED: AtomicBool = AtomicBool::new(false); +static IN_HANDLER: AtomicBool = AtomicBool::new(false); +static SIGNAL_SPILL_PATH_LEN: AtomicUsize = AtomicUsize::new(0); +static CACHED_RANK: AtomicI32 = AtomicI32::new(-1); +static CACHED_LOCAL_RANK: AtomicI32 = AtomicI32::new(-1); + +const SIGNAL_SPILL_PATH_CAP: usize = 384; +static mut SIGNAL_SPILL_PATH: [u8; SIGNAL_SPILL_PATH_CAP] = [0u8; SIGNAL_SPILL_PATH_CAP]; + +const FATAL_SIGNALS: [c_int; 5] = [ + libc::SIGSEGV, + libc::SIGBUS, + libc::SIGABRT, + libc::SIGILL, + libc::SIGFPE, +]; + +const MAX_FRAMES: usize = 256; +const ALT_STACK_SIZE: usize = 256 * 1024; + +static mut ALT_STACK: [u8; ALT_STACK_SIZE] = [0u8; ALT_STACK_SIZE]; + +fn sig_name(sig: c_int) -> &'static str { + match sig { + libc::SIGSEGV => "SIGSEGV", + libc::SIGBUS => "SIGBUS", + libc::SIGABRT => "SIGABRT", + libc::SIGILL => "SIGILL", + libc::SIGFPE => "SIGFPE", + _ => "SIGNAL", + } +} + +#[inline] +unsafe fn write_str(s: &str) { + let _ = libc::write(2, s.as_ptr() as *const c_void, s.len()); +} + +#[inline] +unsafe fn write_bytes(b: &[u8]) { + let _ = libc::write(2, b.as_ptr() as *const c_void, b.len()); +} + +/// Write `v` as lowercase hex (no `0x` prefix), no allocation. +unsafe fn write_hex(v: usize) { + if v == 0 { + write_str("0"); + return; + } + let mut buf = [0u8; 16]; + let mut i = buf.len(); + let mut val = v; + while val > 0 { + i -= 1; + let d = (val & 0xf) as u8; + buf[i] = if d < 10 { b'0' + d } else { b'a' + (d - 10) }; + val >>= 4; + } + write_bytes(&buf[i..]); +} + +/// Write `v` as decimal, no allocation. +unsafe fn write_dec(v: usize) { + if v == 0 { + write_str("0"); + return; + } + let mut buf = [0u8; 20]; + let mut i = buf.len(); + let mut val = v; + while val > 0 { + i -= 1; + buf[i] = b'0' + (val % 10) as u8; + val /= 10; + } + write_bytes(&buf[i..]); +} + +unsafe fn current_tid() -> u64 { + #[cfg(target_os = "linux")] + { + libc::syscall(libc::SYS_gettid) as u64 + } + #[cfg(target_os = "macos")] + { + let mut t: u64 = 0; + libc::pthread_threadid_np(0, &mut t); + t + } + #[cfg(not(any(target_os = "linux", target_os = "macos")))] + { + 0 + } +} + +unsafe fn restore_and_reraise(sig: c_int) { + let mut sa: libc::sigaction = std::mem::zeroed(); + sa.sa_sigaction = libc::SIG_DFL; + libc::sigemptyset(&mut sa.sa_mask); + sa.sa_flags = 0; + libc::sigaction(sig, &sa, std::ptr::null_mut()); + libc::raise(sig); +} + +unsafe extern "C" fn crash_handler(sig: c_int, info: *mut libc::siginfo_t, _uctx: *mut c_void) { + // A fault *inside* the dump (e.g. while symbolizing) must not loop forever. + if IN_HANDLER.swap(true, Ordering::SeqCst) { + restore_and_reraise(sig); + return; + } + + write_str("\n==== probing: fatal signal "); + write_str(sig_name(sig)); + write_str(" ("); + write_dec(sig as usize); + write_str(") on thread "); + write_dec(current_tid() as usize); + write_str(" ====\n"); + + if !info.is_null() { + let addr = (*info).si_addr() as usize; + write_str("fault address: 0x"); + write_hex(addr); + write_str("\n"); + } + + write_str("native backtrace (crashing thread):\n"); + + let mut idx = 0usize; + backtrace::trace_unsynchronized(|frame| { + let ip = frame.ip() as usize; + write_str(" #"); + write_dec(idx); + write_str(" 0x"); + write_hex(ip); + write_str(" "); + + let mut wrote_name = false; + backtrace::resolve_frame_unsynchronized(frame, |symbol| { + if !wrote_name { + if let Some(name) = symbol.name() { + if let Some(s) = name.as_str() { + write_bytes(s.as_bytes()); + wrote_name = true; + } + } + } + }); + if !wrote_name { + write_str(""); + } + write_str("\n"); + + idx += 1; + idx < MAX_FRAMES + }); + + write_str("==== end probing backtrace; re-raising "); + write_str(sig_name(sig)); + write_str(" ====\n"); + + spill_fatal_signal( + sig, + current_tid(), + if info.is_null() { + 0 + } else { + (*info).si_addr() as usize + }, + ); + + crash_grace_wait(); + + restore_and_reraise(sig); +} + +unsafe fn env_is_truthy(name: &str) -> bool { + let Ok(val) = std::env::var(name) else { + return false; + }; + matches!( + val.trim().to_ascii_lowercase().as_str(), + "1" | "true" | "yes" | "on" + ) +} + +unsafe fn env_grace_sec() -> u64 { + if env_is_truthy("PROBING_CRASH_NO_GRACE") { + return 0; + } + match std::env::var("PROBING_CRASH_GRACE_SEC") { + Ok(val) => val.trim().parse().unwrap_or(20), + Err(_) => 20, + } +} + +unsafe fn env_rank(name: &str) -> i32 { + std::env::var(name) + .ok() + .and_then(|v| v.trim().parse().ok()) + .unwrap_or(-1) +} + +unsafe fn should_signal_grace() -> bool { + if env_is_truthy("PROBING_CRASH_HOLD") { + return true; + } + let grace = env_grace_sec(); + if grace == 0 { + return false; + } + if env_is_truthy("PROBING_CRASH_GRACE_ALL_RANKS") { + return true; + } + env_rank("RANK") == 0 || env_rank("LOCAL_RANK") == 0 +} + +unsafe fn crash_grace_wait() { + if !should_signal_grace() { + return; + } + let pid = libc::getpid() as usize; + write_str("\n[probing crash] fatal signal grace — attach: gdb -p "); + write_dec(pid); + write_str("\n"); + + let grace = if env_is_truthy("PROBING_CRASH_HOLD") { + 0 + } else { + env_grace_sec() + }; + + let deadline = if grace == 0 { + i64::MAX + } else { + libc::time(std::ptr::null_mut()) + grace as i64 + }; + loop { + if env_is_truthy("PROBING_CRASH_HOLD") { + libc::usleep(200_000); + continue; + } + let now = libc::time(std::ptr::null_mut()); + if now >= deadline { + return; + } + libc::usleep(250_000); + } +} + +fn prepare_signal_spill() { + let ctx = context::snapshot(); + CACHED_RANK.store(ctx.rank, Ordering::Relaxed); + CACHED_LOCAL_RANK.store(ctx.local_rank, Ordering::Relaxed); + + if let Some(parent) = handler::signal_spill_path(ctx.pid).parent() { + let _ = std::fs::create_dir_all(parent); + } + let path = handler::signal_spill_path(ctx.pid); + let bytes = path.as_os_str().as_encoded_bytes(); + unsafe { + if bytes.len() + 1 >= SIGNAL_SPILL_PATH_CAP { + return; + } + let p = std::ptr::addr_of_mut!(SIGNAL_SPILL_PATH).cast::(); + std::ptr::copy_nonoverlapping(bytes.as_ptr(), p, bytes.len()); + p.add(bytes.len()).write(0); + SIGNAL_SPILL_PATH_LEN.store(bytes.len(), Ordering::Relaxed); + } +} + +unsafe fn spill_fatal_signal(sig: c_int, tid: u64, fault_addr: usize) { + let path_len = SIGNAL_SPILL_PATH_LEN.load(Ordering::Relaxed); + if path_len == 0 { + return; + } + + let step = crash_atomic_step(); + let rank = CACHED_RANK.load(Ordering::Relaxed); + let local_rank = CACHED_LOCAL_RANK.load(Ordering::Relaxed); + let pid = libc::getpid(); + + let mut buf = [0u8; 512]; + let mut n = 0usize; + macro_rules! append { + ($s:expr) => {{ + let b = $s.as_bytes(); + if n + b.len() < buf.len() { + buf[n..n + b.len()].copy_from_slice(b); + n += b.len(); + } + }}; + } + + append!("{\"kind\":\"fatal_signal\",\"signal\":\""); + append!(sig_name(sig)); + append!("\",\"pid\":"); + n = append_dec(&mut buf, n, pid as usize); + append!(",\"rank\":"); + n = append_dec(&mut buf, n, rank.max(0) as usize); + append!(",\"local_rank\":"); + n = append_dec(&mut buf, n, local_rank.max(0) as usize); + append!(",\"global_step\":"); + n = append_dec(&mut buf, n, step.global_step as usize); + append!(",\"micro_step\":"); + n = append_dec(&mut buf, n, step.micro_step as usize); + append!(",\"tid\":"); + n = append_dec(&mut buf, n, tid as usize); + append!(",\"fault_addr\":\"0x"); + n = append_hex(&mut buf, n, fault_addr); + append!("\"}\n"); + + let path_ptr = std::ptr::addr_of!(SIGNAL_SPILL_PATH).cast::(); + let fd = libc::open( + path_ptr, + libc::O_CREAT | libc::O_TRUNC | libc::O_WRONLY, + 0o644, + ); + if fd >= 0 { + let _ = libc::write(fd, buf.as_ptr() as *const c_void, n); + let _ = libc::fsync(fd); + let _ = libc::close(fd); + } +} + +unsafe fn append_dec(buf: &mut [u8], mut n: usize, val: usize) -> usize { + if val == 0 { + if n < buf.len() { + buf[n] = b'0'; + n += 1; + } + return n; + } + let mut tmp = [0u8; 20]; + let mut i = tmp.len(); + let mut v = val; + while v > 0 { + i -= 1; + tmp[i] = b'0' + (v % 10) as u8; + v /= 10; + } + let digits = &tmp[i..]; + if n + digits.len() < buf.len() { + buf[n..n + digits.len()].copy_from_slice(digits); + n += digits.len(); + } + n +} + +unsafe fn append_hex(buf: &mut [u8], mut n: usize, val: usize) -> usize { + if val == 0 { + if n < buf.len() { + buf[n] = b'0'; + n += 1; + } + return n; + } + let mut tmp = [0u8; 16]; + let mut i = tmp.len(); + let mut v = val; + while v > 0 { + i -= 1; + let d = (v & 0xf) as u8; + tmp[i] = if d < 10 { b'0' + d } else { b'a' + (d - 10) }; + v >>= 4; + } + let digits = &tmp[i..]; + if n + digits.len() < buf.len() { + buf[n..n + digits.len()].copy_from_slice(digits); + n += digits.len(); + } + n +} + +/// Install backtrace-on-crash handlers for the common fatal signals. Idempotent. +pub fn install_crash_handler() { + if INSTALLED.swap(true, Ordering::SeqCst) { + return; + } + + prepare_signal_spill(); + + unsafe { + let mut ss: libc::stack_t = std::mem::zeroed(); + ss.ss_sp = core::ptr::addr_of_mut!(ALT_STACK) as *mut c_void; + ss.ss_size = ALT_STACK_SIZE; + ss.ss_flags = 0; + libc::sigaltstack(&ss, std::ptr::null_mut()); + + for &sig in FATAL_SIGNALS.iter() { + let mut sa: libc::sigaction = std::mem::zeroed(); + sa.sa_sigaction = crash_handler as *const () as usize; + sa.sa_flags = libc::SA_SIGINFO | libc::SA_ONSTACK; + libc::sigemptyset(&mut sa.sa_mask); + libc::sigaction(sig, &sa, std::ptr::null_mut()); + } + } + + log::info!("probing: crash backtrace handler installed"); +} diff --git a/probing/extensions/python/src/features/tracing.rs b/probing/extensions/python/src/features/tracing.rs index feb36397..1c055642 100644 --- a/probing/extensions/python/src/features/tracing.rs +++ b/probing/extensions/python/src/features/tracing.rs @@ -2,7 +2,7 @@ use pyo3::prelude::*; use pyo3::types::{PyDict, PyList, PyModule}; use pyo3::IntoPyObjectExt; use std::cell::RefCell; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, MutexGuard}; use probing_core::trace::Span as RawSpan; use probing_core::trace::{ @@ -12,7 +12,15 @@ use probing_core::trace::{ use crate::features::convert::{ele_to_python, python_to_ele}; -const SPAN_LOCK_POISONED: &str = "Failed to acquire lock on span (lock poisoned)"; +fn lock_span(m: &Mutex) -> MutexGuard<'_, RawSpan> { + match m.lock() { + Ok(guard) => guard, + Err(e) => { + log::debug!("span mutex poisoned; recovering"); + e.into_inner() + } + } +} fn parse_py_attributes(py: Python, attributes: Vec>) -> PyResult> { let mut converted = Vec::new(); @@ -57,6 +65,83 @@ where // Thread-local storage for span context thread_local! { static SPAN_STACK: RefCell>> = const { RefCell::new(Vec::new()) }; + static SPAN_HINT_STACK: RefCell> = const { RefCell::new(Vec::new()) }; + static CRASH_SPAN_CAPTURE: RefCell> = const { RefCell::new(None) }; +} + +#[derive(Clone, Debug, Default)] +struct SpanHint { + trace_id: u64, + span_id: u64, + name: String, + phase: Option, +} + +#[derive(Clone, Debug, Default)] +pub struct CrashSpanSnapshot { + pub active_name: String, + pub trace_id: u64, + pub span_id: u64, + pub training_phase: String, + pub stack: Vec, +} + +pub fn crash_span_snapshot() -> CrashSpanSnapshot { + if let Some(captured) = CRASH_SPAN_CAPTURE.with(|cap| cap.borrow_mut().take()) { + return captured; + } + snapshot_from_hint_stack() +} + +fn snapshot_from_hint_stack() -> CrashSpanSnapshot { + SPAN_HINT_STACK.with(|stack| { + let stack = stack.borrow(); + if stack.is_empty() { + return CrashSpanSnapshot::default(); + } + let names: Vec = stack.iter().map(|h| h.name.clone()).collect(); + let active = stack.last().cloned().unwrap_or_default(); + let training_phase = stack + .iter() + .rev() + .filter_map(|h| h.phase.as_deref()) + .find(|p| matches!(*p, "forward" | "backward" | "optimizer")) + .unwrap_or("") + .to_string(); + CrashSpanSnapshot { + active_name: active.name, + trace_id: active.trace_id, + span_id: active.span_id, + training_phase, + stack: names, + } + }) +} + +fn capture_span_snapshot_for_crash() { + let snap = snapshot_from_hint_stack(); + if !snap.active_name.is_empty() { + CRASH_SPAN_CAPTURE.with(|cap| *cap.borrow_mut() = Some(snap)); + } +} + +fn push_span_hint(span: &Span) { + let hint = SpanHint { + trace_id: span.with_inner(|s| s.trace_id), + span_id: span.with_inner(|s| s.span_id), + name: span.with_inner(|s| s.name.clone()), + phase: span.with_inner(|s| s.phase.clone()), + }; + SPAN_HINT_STACK.with(|stack| stack.borrow_mut().push(hint)); +} + +fn pop_span_hint(span_id: u64) { + SPAN_HINT_STACK.with(|stack| { + let mut stack = stack.borrow_mut(); + if let Some(pos) = stack.iter().rposition(|h| h.span_id == span_id) { + stack.remove(pos); + } + }); } /// Python binding for Span @@ -68,11 +153,11 @@ pub struct Span { impl Span { fn with_inner(&self, f: impl FnOnce(&RawSpan) -> R) -> R { - f(&self.inner.lock().expect(SPAN_LOCK_POISONED)) + f(&lock_span(&self.inner)) } fn with_inner_mut(&mut self, f: impl FnOnce(&mut RawSpan) -> R) -> R { - f(&mut self.inner.lock().expect(SPAN_LOCK_POISONED)) + f(&mut lock_span(&self.inner)) } } @@ -238,7 +323,7 @@ impl Span { /// Gets all events as a list. fn get_events(&self, py: Python) -> PyResult> { let list = PyList::empty(py); - let inner = self.inner.lock().expect(SPAN_LOCK_POISONED); + let inner = lock_span(&self.inner); for event in &inner.events { let event_dict = PyDict::new(py); event_dict.set_item("name", &event.name)?; @@ -287,6 +372,7 @@ impl Span { /// Context manager entry (for `with` statement support). fn __enter__(slf: PyRef) -> PyResult> { let py = slf.py(); + push_span_hint(&slf); let span_obj: Py = Py::new(py, slf.clone())?.into(); SPAN_STACK.with(|stack| { stack.borrow_mut().push(span_obj); @@ -297,12 +383,16 @@ impl Span { /// Context manager exit (for `with` statement support). fn __exit__( slf: PyRef, - _exc_type: Option<&Bound<'_, PyAny>>, + exc_type: Option<&Bound<'_, PyAny>>, _exc_val: Option<&Bound<'_, PyAny>>, _exc_tb: Option<&Bound<'_, PyAny>>, ) -> PyResult { + if exc_type.is_some() && !exc_type.unwrap().is_none() { + capture_span_snapshot_for_crash(); + } let self_id = slf.span_id(); - slf.inner.lock().expect(SPAN_LOCK_POISONED).end(); + lock_span(&slf.inner).end(); + pop_span_hint(self_id); SPAN_STACK.with(|stack| { let mut stack = stack.borrow_mut(); diff --git a/probing/extensions/python/src/python.rs b/probing/extensions/python/src/python.rs index 10a558cb..4fc233d8 100644 --- a/probing/extensions/python/src/python.rs +++ b/probing/extensions/python/src/python.rs @@ -1,17 +1,9 @@ use std::ffi::CString; use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Mutex; -use anyhow::Result; -use once_cell::sync::Lazy; use pyo3::prelude::*; -use pyo3::types::PyTuple; use pyo3::{types::PyDict, Bound, Python}; -use crate::pycode::get_code; - -pub static CRASH_HANDLER: Lazy>> = Lazy::new(|| Mutex::new(None)); -pub static OLD_HANDLER: Lazy>> = Lazy::new(|| None); pub static PROBING_ENABLED: AtomicBool = AtomicBool::new(false); fn run_embedded( @@ -26,45 +18,6 @@ fn run_embedded( py.run(&code, globals, locals) } -fn call_default_handler(typ: Py, value: Py, traceback: Py) -> Result<()> { - let code = get_code("crash_handler.py").unwrap_or_default(); - Python::attach(|py| -> Result<()> { - let global = PyDict::new(py); - run_embedded(py, &code, Some(&global), None)?; - if let Some(handler) = global.get_item("crash_handler")? { - let args = PyTuple::new(py, [typ, value, traceback])?; - handler.call(args, None)?; - } - Ok(()) - }) -} - -fn call_custom_handler( - handler: &str, - typ: Py, - value: Py, - traceback: Py, -) -> Result<()> { - Python::attach(|py| -> Result<()> { - let locals = PyDict::new(py); - if handler.contains('.') { - let parts: Vec<&str> = handler.split('.').collect(); - let pkg = py.import(parts[0])?; - locals.set_item(parts[0], pkg)?; - } - locals.set_item("type", typ)?; - locals.set_item("value", value)?; - locals.set_item("traceback", traceback)?; - let ret = (|| { - let expr = CString::new(handler)?; - py.eval(&expr, None, Some(&locals)) - })(); - - println!("crash handler: {ret:?}"); - Ok(()) - }) -} - fn script_basename(py: Python) -> Option { let sys = py.import("sys").ok()?; let argv = sys.getattr("argv").ok()?; @@ -125,27 +78,12 @@ pub fn set_enabled(enabled: bool) { PROBING_ENABLED.store(enabled, Ordering::SeqCst); } -#[pyfunction] -pub fn crash_handler(typ: Py, value: Py, traceback: Py) { - let handler = CRASH_HANDLER.lock().unwrap().clone(); - log::debug!("call crash handler: {handler:?}"); - if let Some(handler) = handler { - let ret = match handler.as_str() { - "default" => call_default_handler(typ, value, traceback), - handler => call_custom_handler(handler, typ, value, traceback), - }; - if let Err(err) = ret { - log::error!("error calling crash handler: {err}"); - } - } -} - +/// Install the Python crash handler module (``probing.crash.install``). pub fn enable_crash_handler() -> anyhow::Result<()> { Python::attach(|py| -> anyhow::Result<()> { - log::debug!("enable crash handler"); - let sys = py.import("sys")?; - let func = wrap_pyfunction!(crash_handler, &sys)?; - sys.setattr("excepthook", func)?; + log::debug!("enable crash handler via probing.crash"); + let crash = py.import("probing.crash")?; + crash.call_method0("install")?; Ok(()) })?; Ok(()) @@ -164,7 +102,7 @@ pub fn enable_monitoring(filename: &str) -> anyhow::Result<()> { filename }; - let code = get_code(filename).ok_or_else(|| { + let code = crate::pycode::get_code(filename).ok_or_else(|| { anyhow::anyhow!( "monitoring script not found: {filename} (embed under pycode/ or set PROBING_CODE_ROOT)" ) diff --git a/probing/memtable/Cargo.toml b/probing/memtable/Cargo.toml index 7a1801fa..d8f874cc 100644 --- a/probing/memtable/Cargo.toml +++ b/probing/memtable/Cargo.toml @@ -8,6 +8,7 @@ description = "Self-describing columnar memory table with ring buffer" [dependencies] +log = "0.4" xxhash-rust = { version = "0.8", features = ["xxh3"] } memmap2 = "0.9" libc = "0.2" diff --git a/probing/memtable/src/memtable.rs b/probing/memtable/src/memtable.rs index d79077f8..d24c51b3 100644 --- a/probing/memtable/src/memtable.rs +++ b/probing/memtable/src/memtable.rs @@ -641,10 +641,10 @@ impl MemTable { /// MEMT is single-writer: the `&mut self` borrow guarantees exclusive /// access, so no lock is taken. pub fn push_row(&mut self, values: &[Value]) { - assert!( - validate_row_schema(self.backing.bytes(), values), - "value types do not match schema" - ); + if !validate_row_schema(self.backing.bytes(), values) { + log::warn!("push_row: value types do not match schema"); + return; + } self.push_row_unchecked(values); } pub fn push_row_unchecked(&mut self, values: &[Value]) { @@ -1683,19 +1683,19 @@ mod tests { } #[test] - #[should_panic(expected = "value types do not match schema")] fn push_row_rejects_wrong_column_count() { let schema = Schema::new().col("a", DType::U32).col("b", DType::I64); let mut t = MemTable::new(&schema, 256, 2); t.push_row(&[Value::U32(1)]); // only 1 value for 2 columns + assert_eq!(t.num_rows(0), 0); } #[test] - #[should_panic(expected = "value types do not match schema")] fn push_row_rejects_wrong_dtype() { let schema = Schema::new().col("a", DType::U32); let mut t = MemTable::new(&schema, 256, 2); t.push_row(&[Value::Str("oops")]); // Str instead of U32 + assert_eq!(t.num_rows(0), 0); } // ── MemTableWriter tests ────────────────────────── diff --git a/probing/memtable/src/row.rs b/probing/memtable/src/row.rs index afc4a0f8..4e542f44 100644 --- a/probing/memtable/src/row.rs +++ b/probing/memtable/src/row.rs @@ -10,11 +10,77 @@ pub(crate) fn panic_stale(context: &str) -> ! { panic!("stale read: chunk recycled ({context})") } -fn var_field_size(buf: &[u8], off: usize) -> usize { - if off + 4 > buf.len() { - panic_stale("var_field_size"); +fn read_i32(data: &[u8], off: usize) -> i32 { + if off + 4 > data.len() { + panic_stale("read_i32"); + } + i32::from_le_bytes([data[off], data[off + 1], data[off + 2], data[off + 3]]) +} + +fn read_u32(data: &[u8], off: usize) -> u32 { + if off + 4 > data.len() { + panic_stale("read_u32"); } - let raw = i32::from_le_bytes(buf[off..off + 4].try_into().unwrap()); + u32::from_le_bytes([data[off], data[off + 1], data[off + 2], data[off + 3]]) +} + +fn read_i64(data: &[u8], off: usize) -> i64 { + if off + 8 > data.len() { + panic_stale("read_i64"); + } + i64::from_le_bytes([ + data[off], + data[off + 1], + data[off + 2], + data[off + 3], + data[off + 4], + data[off + 5], + data[off + 6], + data[off + 7], + ]) +} + +fn read_u64(data: &[u8], off: usize) -> u64 { + if off + 8 > data.len() { + panic_stale("read_u64"); + } + u64::from_le_bytes([ + data[off], + data[off + 1], + data[off + 2], + data[off + 3], + data[off + 4], + data[off + 5], + data[off + 6], + data[off + 7], + ]) +} + +fn read_f32(data: &[u8], off: usize) -> f32 { + if off + 4 > data.len() { + panic_stale("read_f32"); + } + f32::from_le_bytes([data[off], data[off + 1], data[off + 2], data[off + 3]]) +} + +fn read_f64(data: &[u8], off: usize) -> f64 { + if off + 8 > data.len() { + panic_stale("read_f64"); + } + f64::from_le_bytes([ + data[off], + data[off + 1], + data[off + 2], + data[off + 3], + data[off + 4], + data[off + 5], + data[off + 6], + data[off + 7], + ]) +} + +fn var_field_size(buf: &[u8], off: usize) -> usize { + let raw = read_i32(buf, off); if raw < 0 { 4 } else { @@ -23,10 +89,7 @@ fn var_field_size(buf: &[u8], off: usize) -> usize { } fn resolve_var(buf: &[u8], off: usize, chunk_start: usize) -> &[u8] { - if off + 4 > buf.len() { - panic_stale("resolve_var offset"); - } - let raw = i32::from_le_bytes(buf[off..off + 4].try_into().unwrap()); + let raw = read_i32(buf, off); if raw < 0 { let ref_off = chunk_start + (-raw) as usize; if ref_off + 4 > buf.len() { @@ -100,31 +163,29 @@ impl<'a> Row<'a> { } pub fn col_u8(&self, col: usize) -> u8 { - self.data[self.col_offset(col)] + let off = self.col_offset(col); + if off >= self.data.len() { + panic_stale("col_u8"); + } + self.data[off] } pub fn col_u32(&self, col: usize) -> u32 { - let off = self.col_offset(col); - u32::from_le_bytes(self.data[off..off + 4].try_into().unwrap()) + read_u32(self.data, self.col_offset(col)) } pub fn col_i32(&self, col: usize) -> i32 { - let off = self.col_offset(col); - i32::from_le_bytes(self.data[off..off + 4].try_into().unwrap()) + read_i32(self.data, self.col_offset(col)) } pub fn col_i64(&self, col: usize) -> i64 { - let off = self.col_offset(col); - i64::from_le_bytes(self.data[off..off + 8].try_into().unwrap()) + read_i64(self.data, self.col_offset(col)) } pub fn col_f32(&self, col: usize) -> f32 { - let off = self.col_offset(col); - f32::from_le_bytes(self.data[off..off + 4].try_into().unwrap()) + read_f32(self.data, self.col_offset(col)) } pub fn col_f64(&self, col: usize) -> f64 { - let off = self.col_offset(col); - f64::from_le_bytes(self.data[off..off + 8].try_into().unwrap()) + read_f64(self.data, self.col_offset(col)) } pub fn col_u64(&self, col: usize) -> u64 { - let off = self.col_offset(col); - u64::from_le_bytes(self.data[off..off + 8].try_into().unwrap()) + read_u64(self.data, self.col_offset(col)) } pub fn col_str(&self, col: usize) -> &str { let b = self.resolve_var_col(col); @@ -175,7 +236,12 @@ impl<'a> RowCursor<'a> { } fn read_fixed(&mut self) -> [u8; N] { - let v: [u8; N] = self.data[self.pos..self.pos + N].try_into().unwrap(); + let end = self.pos + N; + if end > self.data.len() { + panic_stale("read_fixed"); + } + let mut v = [0u8; N]; + v.copy_from_slice(&self.data[self.pos..end]); self.pos += N; v } diff --git a/probing/memtable/src/writer.rs b/probing/memtable/src/writer.rs index 468979d0..d2f2b5f0 100644 --- a/probing/memtable/src/writer.rs +++ b/probing/memtable/src/writer.rs @@ -57,18 +57,19 @@ impl<'a> RowWriter<'a> { fn write_str_dedup(&mut self, data: &[u8]) { if !self.overflow { - if let Some(off) = self.dedup.as_ref().unwrap().lookup(self.col_idx, data) { - self.write_raw(&(-(off as i32)).to_le_bytes()); - return; + if let Some(dedup) = self.dedup.as_ref() { + if let Some(off) = dedup.lookup(self.col_idx, data) { + self.write_raw(&(-(off as i32)).to_le_bytes()); + return; + } } } let chunk_off = self.pos - self.chunk_start; self.write_lp(data); if !self.overflow { - self.dedup - .as_mut() - .unwrap() - .insert(self.col_idx, data, chunk_off); + if let Some(dedup) = self.dedup.as_mut() { + dedup.insert(self.col_idx, data, chunk_off); + } } } diff --git a/python/probing/__init__.py b/python/probing/__init__.py index d5d3db26..455602bc 100644 --- a/python/probing/__init__.py +++ b/python/probing/__init__.py @@ -79,6 +79,16 @@ def is_enabled(): except Exception: pass + try: + from probing._entrypoint import should_activate_probing + + if should_activate_probing(): + from probing.crash import install + + install() + except Exception: + pass + __all__ = [ "VERSION", "ExternalTable", diff --git a/python/probing/_entrypoint.py b/python/probing/_entrypoint.py index cd0789b7..afff7a2c 100644 --- a/python/probing/_entrypoint.py +++ b/python/probing/_entrypoint.py @@ -34,6 +34,33 @@ def is_probing_cli() -> bool: _LIGHTWEIGHT_MODULES = ("probing.nccl", "probing.skills", "probing.dev_pth") +def should_activate_probing() -> bool: + """True when ``PROBING`` / ``PROBING_ORIGINAL`` targets this process.""" + raw = os.environ.get("PROBING_ORIGINAL") or os.environ.get("PROBING", "0") + token = raw.strip().lower() + if token in ("0", "", "false", "no", "off"): + return False + if token in ("1", "followed", "2", "nested"): + return True + if raw.lower().startswith("regex:"): + import re + + pattern = raw.split(":", 1)[1] + candidates: list[str] = [c for c in sys.argv if c] + candidates.append(current_script_name()) + try: + import __main__ + + main_file = getattr(__main__, "__file__", None) + if main_file: + candidates.append(main_file) + candidates.append(os.path.basename(main_file)) + except Exception: + pass + return any(re.search(pattern, c) for c in candidates if c) + return raw == current_script_name() + + def is_lightweight_module() -> bool: """``python -m probing.nccl|skills|dev_pth`` must not start the engine.""" helper_suffixes = ( diff --git a/python/probing/crash.py b/python/probing/crash.py new file mode 100644 index 00000000..7a005a37 --- /dev/null +++ b/python/probing/crash.py @@ -0,0 +1,169 @@ +"""Python crash hooks — exception capture only; Rust handles spill and reporting.""" + +from __future__ import annotations + +import faulthandler +import os +import sys +import tempfile +import threading +import traceback +from types import TracebackType +from typing import Callable, Optional, Type + +from probing._core import crash_enabled, record_crash + +_INSTALLED = False +_PREV_EXCEPTHOOK: Optional[Callable] = None +_PREV_THREAD_EXCEPTHOOK: Optional[Callable] = None + + +def _call_original_excepthook( + exc_type: Type[BaseException], + exc_value: BaseException, + exc_tb: Optional[TracebackType], +) -> None: + hook = _PREV_EXCEPTHOOK + if hook is not None and hook is not _probing_excepthook: + hook(exc_type, exc_value, exc_tb) + else: + sys.__excepthook__(exc_type, exc_value, exc_tb) + + +def _call_original_thread_excepthook(args: threading.ExceptHookArgs) -> None: + hook = _PREV_THREAD_EXCEPTHOOK + if hook is not None and hook is not _probing_thread_excepthook: + hook(args) + elif hasattr(threading, "__excepthook__"): + threading.__excepthook__(args) + + +def _top_frame( + exc_type: Type[BaseException], + exc_value: BaseException, + exc_tb: Optional[TracebackType], +) -> str: + if exc_tb is not None: + frames = traceback.extract_tb(exc_tb) + if frames: + last = frames[-1] + return f"{last.filename}:{last.lineno} in {last.name}" + return f"{getattr(exc_type, '__name__', type(exc_value).__name__)}:" + + +def _capture_thread_stacks() -> str: + fd, path = tempfile.mkstemp(suffix=".probing-tb") + try: + with os.fdopen(fd, "w") as out: + faulthandler.dump_traceback(file=out, all_threads=True) + with open(path, encoding="utf-8") as inp: + return inp.read() + except Exception: + return "" + finally: + try: + os.unlink(path) + except OSError: + pass + + +def _dispatch( + *, + kind: str, + exc_type: Type[BaseException], + exc_value: BaseException, + exc_tb: Optional[TracebackType], + native_backtrace: str = "", + exit_code: int = 1, + finalize: bool = True, + crash_thread: str = "", +) -> int: + exc_name = getattr(exc_type, "__name__", type(exc_value).__name__) + tb_text = "".join(traceback.format_exception(exc_type, exc_value, exc_tb)) + top = _top_frame(exc_type, exc_value, exc_tb) + if not crash_thread: + try: + crash_thread = threading.current_thread().name or "MainThread" + except Exception: + crash_thread = "" + thread_stacks = _capture_thread_stacks() + + code = record_crash( + kind, + exc_name, + str(exc_value), + tb_text, + top, + native_backtrace, + finalize, + thread_stacks, + crash_thread, + ) + + if not finalize: + _ensure_hooks() + + return code if finalize else exit_code + + +def _probing_excepthook( + exc_type: Type[BaseException], + exc_value: BaseException, + exc_tb: Optional[TracebackType], +) -> None: + if exc_type is KeyboardInterrupt: + _call_original_excepthook(exc_type, exc_value, exc_tb) + return + _call_original_excepthook(exc_type, exc_value, exc_tb) + code = _dispatch( + kind="python_exception", + exc_type=exc_type, + exc_value=exc_value, + exc_tb=exc_tb, + exit_code=1, + finalize=True, + ) + sys.exit(code) + + +def _probing_thread_excepthook(args: threading.ExceptHookArgs) -> None: + _call_original_thread_excepthook(args) + thread = args.thread + _dispatch( + kind="thread_exception", + exc_type=args.exc_type, + exc_value=args.exc_value, + exc_tb=args.exc_traceback, + exit_code=1, + finalize=False, + crash_thread=thread.name if thread is not None else "", + ) + + +def install() -> None: + global _INSTALLED, _PREV_EXCEPTHOOK, _PREV_THREAD_EXCEPTHOOK + if not crash_enabled(): + return + if not _INSTALLED: + _INSTALLED = True + try: + faulthandler.enable(all_threads=True, file=sys.stderr) + except Exception: + pass + _PREV_EXCEPTHOOK = sys.excepthook + if hasattr(threading, "excepthook"): + _PREV_THREAD_EXCEPTHOOK = threading.excepthook + _ensure_hooks() + + +def _ensure_hooks() -> None: + if sys.excepthook is not _probing_excepthook: + sys.excepthook = _probing_excepthook + if ( + hasattr(threading, "excepthook") + and threading.excepthook is not _probing_thread_excepthook + ): + threading.excepthook = _probing_thread_excepthook + + +__all__ = ["install"] diff --git a/python/probing/ext/torch.py b/python/probing/ext/torch.py index 445c08bf..9ca0509e 100644 --- a/python/probing/ext/torch.py +++ b/python/probing/ext/torch.py @@ -99,6 +99,12 @@ def init(): _patch_dist_init_process_group() collective_hook() + try: + from probing.crash import install + + install() + except Exception: + pass def deinit(): diff --git a/python/probing/handlers/pythonext.py b/python/probing/handlers/pythonext.py index 9cbcb1f5..49a27d24 100644 --- a/python/probing/handlers/pythonext.py +++ b/python/probing/handlers/pythonext.py @@ -550,6 +550,24 @@ def get_magics_list() -> str: return json.dumps({"error": str(e), "traceback": traceback.format_exc()}) +@ext_handler("pythonext", "crash/hold") +def crash_hold() -> str: + """Extend grace hold for post-crash debugging.""" + import probing._core as core + + core.request_crash_hold() + return '{"ok":true,"held":true}' + + +@ext_handler("pythonext", "crash/release") +def crash_release() -> str: + """Release grace hold and exit the process.""" + import probing._core as core + + core.request_crash_release(True) + return '{"ok":true,"released":true}' + + @ext_handler("pythonext", "trace/variables") def get_trace_variables(function: Optional[str] = None, limit: int = 100) -> str: """Get trace variables from database. diff --git a/python/probing/profiling/collective/record.py b/python/probing/profiling/collective/record.py index 68bf7c69..60b04b2d 100644 --- a/python/probing/profiling/collective/record.py +++ b/python/probing/profiling/collective/record.py @@ -109,6 +109,17 @@ def record_comm_lite( async_op=async_op, ) CommCollective(duration_ms=duration_ms, **fields).save() + try: + from probing._core import note_last_comm + + note_last_comm( + op, + group_size, + nbytes, + int(fields.get("global_step", -1)), + ) + except Exception: + pass if write_trace_event: record_span( op, diff --git a/python/probing/site_hook.py b/python/probing/site_hook.py index ec6ef3ca..a8ff0d01 100644 --- a/python/probing/site_hook.py +++ b/python/probing/site_hook.py @@ -13,6 +13,7 @@ current_script_name, is_lightweight_module, is_probing_cli, + should_activate_probing, ) _RAN = False @@ -66,6 +67,7 @@ def _init_probing() -> None: import probing # noqa: F401 _execute_init_script(script_init) + _install_crash_handler() elif probe_value.lower() in ("2", "nested"): print( @@ -76,13 +78,12 @@ def _init_probing() -> None: os.environ["PROBING"] = probe_value _execute_init_script(script_init) + _install_crash_handler() elif probe_value.lower().startswith("regex:"): pattern = probe_value.split(":", 1)[1] try: - import re - - if re.search(pattern, current_script) is not None: + if should_activate_probing(): print( f"Activating probing for script matching '{pattern}'", file=sys.stderr, @@ -90,6 +91,7 @@ def _init_probing() -> None: import probing # noqa: F401 _execute_init_script(script_init) + _install_crash_handler() os.environ["PROBING"] = probe_value except Exception as exc: print(f"Error in regex pattern '{pattern}': {exc}", file=sys.stderr) @@ -103,6 +105,7 @@ def _init_probing() -> None: import probing # noqa: F401 _execute_init_script(script_init) + _install_crash_handler() os.environ["PROBING"] = probe_value except ImportError as exc: @@ -111,6 +114,15 @@ def _init_probing() -> None: print(f"Unexpected error in probing site hook: {exc}", file=sys.stderr) +def _install_crash_handler() -> None: + try: + from probing.crash import install + + install() + except Exception as exc: + print(f"probing crash handler install skipped: {exc}", file=sys.stderr) + + def _execute_init_script(script_init: str | None) -> None: if script_init is None: return diff --git a/python/probing/torchrun_cluster.py b/python/probing/torchrun_cluster.py index 4bf32ba6..0409ffae 100644 --- a/python/probing/torchrun_cluster.py +++ b/python/probing/torchrun_cluster.py @@ -88,7 +88,11 @@ def _reachable_addr(bound: str) -> str: host, port = bound.rsplit(":", 1) host = host.strip().strip("[]") if host in ("0.0.0.0", "::", "", "*"): - host = os.environ.get("MASTER_ADDR") or socket.gethostname() + master = os.environ.get("MASTER_ADDR", "").strip() + if master in ("127.0.0.1", "localhost"): + host = master + else: + host = master or socket.gethostname() return f"{host}:{port}" @@ -295,6 +299,11 @@ def refresh_node_role() -> bool: return False +def master_info() -> dict[str, str] | None: + """Return cluster master HTTP info after ``setup_torchrun_cluster()``.""" + return _MASTER_INFO + + def maybe_setup_torchrun_cluster() -> dict[str, str] | None: """Idempotent entry point; safe to call after ``init_process_group``.""" return setup_torchrun_cluster() diff --git a/skills/catalog.yaml b/skills/catalog.yaml index 0bdf9035..7ee7cf93 100644 --- a/skills/catalog.yaml +++ b/skills/catalog.yaml @@ -36,7 +36,20 @@ skills: - module_bottleneck - training_hang - memory_leak + - crash_triage path: health_overview/steps.yaml +- id: crash_triage + category: triage + priority: 1 + entry: true + description: Crash triage — grep PROBING CRASH in logs; read spill JSON files + tables: [] + pages: + - agent + related: + - health_overview + - training_hang + path: crash_triage/steps.yaml - id: training_hang category: reliability priority: 1 diff --git a/skills/crash_triage/SKILL.md b/skills/crash_triage/SKILL.md new file mode 100644 index 00000000..afa252ec --- /dev/null +++ b/skills/crash_triage/SKILL.md @@ -0,0 +1,25 @@ +--- +name: crash_triage +description: > + Crash triage: grep PROBING CRASH in rank logs; read spill JSON under + {PROBING_DATA_DIR}/crash//latest.json +category: triage +tags: [crash, error, exception, startup, 报错, 崩溃] +keywords: + en: ['crash', 'error', 'exception', 'failed', 'startup failure'] + zh: ['崩溃', '报错', '异常', '启动失败', '挂了'] +--- + +# Crash triage + +训练崩溃或启动失败时: + +1. **日志**:在各 rank stderr / launcher 日志中搜索 ``PROBING CRASH`` +2. **Spill**:``{PROBING_DATA_DIR}/crash//latest.json``(与 memtable 同根目录,默认 Linux ``/dev/shm/probing``,macOS ``$TMPDIR/probing``) +3. **Signal crash**:同目录下 ``signal-latest.json`` + +torchrun 级联退出后 memtable 不可用——以日志 + spill 为准。 + +## Related skills + +- 进程仍存活但无进展 → skill: training_hang diff --git a/skills/crash_triage/steps.yaml b/skills/crash_triage/steps.yaml new file mode 100644 index 00000000..c7eb35fa --- /dev/null +++ b/skills/crash_triage/steps.yaml @@ -0,0 +1,28 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: crash_triage + title: "崩溃 / 启动失败诊断" + title_en: "Crash and startup failure triage" + category: triage + tags: [crash, error, exception, startup, 报错, 崩溃] + triggers: + keywords: + zh: ["崩溃", "报错", "异常", "启动失败", "挂了", "exit code"] + en: ["crash", "error", "exception", "failed", "startup failure"] + docs: | + 查 rank 日志中的 ``PROBING CRASH``,或 spill: + ``{PROBING_DATA_DIR}/crash//latest.json`` + +spec: + steps: [] + + summary_template: | + ## Crash 诊断 + 1. grep 各 rank 日志 ``PROBING CRASH`` + 2. 读 spill ``$PROBING_DATA_DIR/crash//latest.json`` + + next_steps: + - "全 rank 同一 fingerprint → 检查代码/环境" + - "无 exception 但卡住 → skill: training_hang" diff --git a/src/lib.rs b/src/lib.rs index 13e695b3..1a0d0fd5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -174,6 +174,7 @@ fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { // Register all classes m.add_class::()?; m.add_function(wrap_pyfunction!(register_table_docs, m)?)?; + m.add_function(wrap_pyfunction!(start_local, m)?)?; m.add_class::()?; // Register all functions @@ -191,7 +192,14 @@ fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { use probing_python::features::python_api::{is_enabled, should_enable_probing}; m.add_function(wrap_pyfunction!(is_enabled, m)?)?; m.add_function(wrap_pyfunction!(should_enable_probing, m)?)?; - m.add_function(wrap_pyfunction!(start_local, m)?)?; + use probing_python::features::crash::{ + crash_enabled, note_last_comm, record_crash, request_crash_hold, request_crash_release, + }; + m.add_function(wrap_pyfunction!(record_crash, m)?)?; + m.add_function(wrap_pyfunction!(crash_enabled, m)?)?; + m.add_function(wrap_pyfunction!(note_last_comm, m)?)?; + m.add_function(wrap_pyfunction!(request_crash_hold, m)?)?; + m.add_function(wrap_pyfunction!(request_crash_release, m)?)?; // Register config functions directly to the module (flattened) config::register_config_functions(m)?; diff --git a/tests/regression/skills/test_install_tools.py b/tests/regression/skills/test_install_tools.py index ff0c36da..d916adcf 100644 --- a/tests/regression/skills/test_install_tools.py +++ b/tests/regression/skills/test_install_tools.py @@ -41,14 +41,14 @@ def test_skill_roots_include_bundled(): assert "bundled" in labels or "repo" in labels -def test_merged_catalog_has_eight_skills(): +def test_merged_catalog_has_nine_skills(): catalog = load_catalog() - assert len(catalog.skills) == 8 + assert len(catalog.skills) == 9 def test_list_skills_tool(): skills = list_skills(limit=10) - assert len(skills) >= 8 + assert len(skills) >= 9 assert any(s.id == "health_overview" for s in skills) diff --git a/tests/regression/spec/api_spec.json b/tests/regression/spec/api_spec.json index fdd14395..97c68a40 100644 --- a/tests/regression/spec/api_spec.json +++ b/tests/regression/spec/api_spec.json @@ -103,6 +103,18 @@ "method": "GET", "uses_body": false, "response": { "content_type": "application/json", "cors": false } + }, + { + "local_path": "crash/hold", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } + }, + { + "local_path": "crash/release", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } } ], "other_extensions": [ diff --git a/tests/unit/probing/skills/test_loader.py b/tests/unit/probing/skills/test_loader.py index 147c09b3..ba4d2400 100644 --- a/tests/unit/probing/skills/test_loader.py +++ b/tests/unit/probing/skills/test_loader.py @@ -26,10 +26,11 @@ def test_skills_root_exists(): assert root.is_dir() -def test_catalog_loads_eight_skills(): +def test_catalog_loads_nine_skills(): catalog = load_catalog() - assert len(catalog.skills) == 8 + assert len(catalog.skills) == 9 ids = {p.id for p in catalog.skills} + assert "crash_triage" in ids assert "slow_rank" in ids assert "nccl_culprit_victim" in ids assert "health_overview" in ids diff --git a/web/assets/tailwind.css b/web/assets/tailwind.css index f2c15b1d..c01b64df 100644 --- a/web/assets/tailwind.css +++ b/web/assets/tailwind.css @@ -818,6 +818,16 @@ video { inset: 0px; } +.inset-x-0 { + left: 0px; + right: 0px; +} + +.inset-y-\[7px\] { + top: 7px; + bottom: 7px; +} + .-right-3 { right: -0.75rem; } @@ -826,6 +836,10 @@ video { bottom: 0px; } +.bottom-1\/2 { + bottom: 50%; +} + .bottom-3 { bottom: 0.75rem; } @@ -906,6 +920,30 @@ video { top: 1.125rem; } +.top-\[10px\] { + top: 10px; +} + +.top-\[11px\] { + top: 11px; +} + +.top-\[14px\] { + top: 14px; +} + +.top-\[52px\] { + top: 52px; +} + +.top-\[5px\] { + top: 5px; +} + +.top-\[9px\] { + top: 9px; +} + .top-full { top: 100%; } @@ -1090,6 +1128,10 @@ video { display: none; } +.h-0\.5 { + height: 0.125rem; +} + .h-1\.5 { height: 0.375rem; } @@ -1154,18 +1196,34 @@ video { height: 2.25rem; } +.h-\[12px\] { + height: 12px; +} + .h-\[20px\] { height: 20px; } +.h-\[22px\] { + height: 22px; +} + .h-\[28px\] { height: 28px; } +.h-\[7px\] { + height: 7px; +} + .h-full { height: 100%; } +.h-px { + height: 1px; +} + .h-screen { height: 100vh; } @@ -1487,6 +1545,10 @@ video { flex-shrink: 0; } +.grow { + flex-grow: 1; +} + .table-auto { table-layout: auto; } @@ -1629,6 +1691,10 @@ video { align-items: baseline; } +.items-stretch { + align-items: stretch; +} + .justify-end { justify-content: flex-end; } @@ -3337,6 +3403,18 @@ video { background-color: rgb(253 230 138 / var(--tw-bg-opacity, 1)); } +.bg-amber-200\/70 { + background-color: rgb(253 230 138 / 0.7); +} + +.bg-amber-200\/80 { + background-color: rgb(253 230 138 / 0.8); +} + +.bg-amber-400\/60 { + background-color: rgb(251 191 36 / 0.6); +} + .bg-amber-50 { --tw-bg-opacity: 1; background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1)); @@ -3378,6 +3456,10 @@ video { background-color: rgb(191 219 254 / var(--tw-bg-opacity, 1)); } +.bg-blue-200\/70 { + background-color: rgb(191 219 254 / 0.7); +} + .bg-blue-400 { --tw-bg-opacity: 1; background-color: rgb(96 165 250 / var(--tw-bg-opacity, 1)); @@ -3437,6 +3519,10 @@ video { background-color: rgb(167 243 208 / var(--tw-bg-opacity, 1)); } +.bg-emerald-200\/70 { + background-color: rgb(167 243 208 / 0.7); +} + .bg-emerald-50 { --tw-bg-opacity: 1; background-color: rgb(236 253 245 / var(--tw-bg-opacity, 1)); @@ -3466,6 +3552,10 @@ video { background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); } +.bg-gray-200\/70 { + background-color: rgb(229 231 235 / 0.7); +} + .bg-gray-300 { --tw-bg-opacity: 1; background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1)); @@ -3574,6 +3664,15 @@ video { background-color: rgb(243 232 255 / var(--tw-bg-opacity, 1)); } +.bg-purple-200\/70 { + background-color: rgb(233 213 255 / 0.7); +} + +.bg-purple-500 { + --tw-bg-opacity: 1; + background-color: rgb(168 85 247 / var(--tw-bg-opacity, 1)); +} + .bg-red-200 { --tw-bg-opacity: 1; background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1)); @@ -4790,6 +4889,10 @@ video { padding-bottom: 1px; } +.pb-0\.5 { + padding-bottom: 0.125rem; +} + .pb-1 { padding-bottom: 0.25rem; } @@ -5759,6 +5862,11 @@ video { --tw-ring-color: rgb(91 33 182 / var(--tw-ring-opacity, 1)); } +.ring-white { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity, 1)); +} + .ring-yellow-50 { --tw-ring-opacity: 1; --tw-ring-color: rgb(254 252 232 / var(--tw-ring-opacity, 1)); @@ -6075,6 +6183,10 @@ video { background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); } +.hover\:bg-gray-50\/50:hover { + background-color: rgb(249 250 251 / 0.5); +} + .hover\:bg-gray-50\/60:hover { background-color: rgb(249 250 251 / 0.6); } diff --git a/web/src/components/mod.rs b/web/src/components/mod.rs index 16114173..b5bcdc14 100644 --- a/web/src/components/mod.rs +++ b/web/src/components/mod.rs @@ -38,6 +38,7 @@ pub mod profiling; pub mod profiling_sidebar_hint; pub mod sidebar; pub mod source_viewer; +pub mod span_timeline; pub mod stat_card; pub mod table_view; pub mod timeline_viewer; diff --git a/web/src/components/span_timeline.rs b/web/src/components/span_timeline.rs new file mode 100644 index 00000000..9f6191e1 --- /dev/null +++ b/web/src/components/span_timeline.rs @@ -0,0 +1,280 @@ +//! Vertical timeline lane paired with the span tree on the Spans page. +//! +//! Each visible tree row gets a timeline row on the left; expanding the tree +//! grows the timeline stack so hierarchy and timing stay aligned. + +use dioxus::prelude::*; + +use crate::api::SpanInfo; + +const TIMELINE_LANE_PX: f64 = 148.0; +const MIN_BAR_PX: f64 = 3.0; + +/// Nanosecond window covering all spans in the current tree. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct TraceTimeWindow { + pub start_ns: i64, + pub end_ns: i64, +} + +impl TraceTimeWindow { + pub fn from_spans(spans: &[SpanInfo]) -> Self { + let mut start = i64::MAX; + let mut end = i64::MIN; + + fn walk(span: &SpanInfo, start: &mut i64, end: &mut i64) { + *start = (*start).min(span.start_timestamp); + let span_end = span.end_timestamp.unwrap_or(span.start_timestamp); + *end = (*end).max(span_end); + for child in &span.children { + walk(child, start, end); + } + } + + for span in spans { + walk(span, &mut start, &mut end); + } + + if start == i64::MAX { + return Self { + start_ns: 0, + end_ns: 1, + }; + } + if end <= start { + end = start + 1; + } + Self { + start_ns: start, + end_ns: end, + } + } + + pub fn range_ns(&self) -> i64 { + (self.end_ns - self.start_ns).max(1) + } + + pub fn offset_px(&self, timestamp_ns: i64) -> f64 { + let pct = (timestamp_ns - self.start_ns) as f64 / self.range_ns() as f64; + (pct.clamp(0.0, 1.0) * TIMELINE_LANE_PX).max(0.0) + } + + pub fn width_px(&self, start_ns: i64, end_ns: Option) -> f64 { + let end = end_ns.unwrap_or(self.end_ns); + let dur = (end - start_ns).max(0) as f64; + let px = dur / self.range_ns() as f64 * TIMELINE_LANE_PX; + px.max(MIN_BAR_PX) + } +} + +pub fn format_axis_label(duration_ns: f64) -> String { + if duration_ns >= 1_000_000_000.0 { + format!("{:.2}s", duration_ns / 1_000_000_000.0) + } else if duration_ns >= 1_000_000.0 { + format!("{:.1}ms", duration_ns / 1_000_000.0) + } else if duration_ns >= 1_000.0 { + format!("{:.0}µs", duration_ns / 1_000.0) + } else { + format!("{:.0}ns", duration_ns) + } +} + +fn span_bar_style(phase: Option<&str>, active: bool) -> (&'static str, &'static str) { + if active { + return ("bg-amber-200/80", "bg-amber-500"); + } + match phase { + Some("forward") => ("bg-blue-200/70", "bg-blue-500"), + Some("backward") => ("bg-purple-200/70", "bg-purple-500"), + Some("optimizer") | Some("step") => ("bg-amber-200/70", "bg-amber-500"), + Some("idle") => ("bg-gray-200/70", "bg-gray-400"), + _ => ("bg-emerald-200/70", "bg-emerald-500"), + } +} + +fn span_tooltip(span: &SpanInfo, window: TraceTimeWindow) -> String { + let start = format_axis_label((span.start_timestamp - window.start_ns) as f64); + let end = span + .end_timestamp + .map(|t| format_axis_label((t - window.start_ns) as f64)) + .unwrap_or_else(|| "active".to_string()); + let dur = span + .end_timestamp + .map(|t| format_axis_label((t - span.start_timestamp) as f64)) + .unwrap_or_else(|| "active".to_string()); + format!( + "{}\nphase: {}\noffset: {} · end: {}\nduration: {}", + span.name, + span.phase.as_deref().unwrap_or("—"), + start, + end, + dur, + ) +} + +#[component] +pub fn SpanTimelineHeader(window: TraceTimeWindow) -> Element { + let total = format_axis_label(window.range_ns() as f64); + let mid = format_axis_label(window.range_ns() as f64 / 2.0); + rsx! { + div { + class: "flex shrink-0 border-b border-gray-200 bg-gray-50/90 sticky top-0 z-10", + div { + class: "shrink-0 border-r border-gray-200 px-2 py-1.5", + style: "width: {TIMELINE_LANE_PX}px", + div { class: "text-[10px] font-semibold uppercase tracking-wide text-gray-500 mb-1", + "Timeline" + } + div { class: "relative h-4 text-[9px] text-gray-400 font-mono tabular-nums", + span { class: "absolute left-0 top-0", "0" } + span { class: "absolute left-1/2 -translate-x-1/2 top-0", "{mid}" } + span { class: "absolute right-0 top-0", "{total}" } + div { class: "absolute inset-x-0 top-[14px] h-px bg-gray-200" } + div { class: "absolute left-0 top-[11px] w-px h-[7px] bg-gray-300" } + div { class: "absolute left-1/2 top-[11px] w-px h-[7px] bg-gray-300" } + div { class: "absolute right-0 top-[11px] w-px h-[7px] bg-gray-300" } + } + } + div { class: "flex-1 px-3 py-1.5 text-[10px] font-semibold uppercase tracking-wide text-gray-500", + "Span tree" + } + } + } +} + +#[component] +pub fn SpanTimelineLegend() -> Element { + rsx! { + div { + class: "flex flex-wrap items-center gap-x-4 gap-y-1 px-2 py-1.5 border-b border-gray-100 bg-white text-[10px] text-gray-500 sticky top-[52px] z-10", + span { class: "font-medium text-gray-600", "Lane" } + div { class: "inline-flex items-center gap-1", + span { class: "w-3 h-2 rounded-sm bg-blue-500" } + span { "forward" } + } + div { class: "inline-flex items-center gap-1", + span { class: "w-3 h-2 rounded-sm bg-purple-500" } + span { "backward" } + } + div { class: "inline-flex items-center gap-1", + span { class: "w-3 h-2 rounded-sm bg-amber-500" } + span { "optimizer" } + } + div { class: "inline-flex items-center gap-1", + span { class: "w-3 h-2 rounded-sm bg-emerald-500" } + span { "other" } + } + div { class: "inline-flex items-center gap-1", + span { class: "w-3 h-2 rounded-sm bg-amber-500 animate-pulse" } + span { "active" } + } + } + } +} + +#[component] +pub fn SpanTimelineBar(span: SpanInfo, window: TraceTimeWindow, depth: usize) -> Element { + let active = span.end_timestamp.is_none(); + let left = window.offset_px(span.start_timestamp); + let width = window.width_px(span.start_timestamp, span.end_timestamp); + let (track_bg, bar_bg) = span_bar_style(span.phase.as_deref(), active); + let indent = depth * 10; + let tooltip = span_tooltip(&span, window); + let lane_inner = TIMELINE_LANE_PX - indent as f64; + let bar_left = left.min(lane_inner - MIN_BAR_PX).max(0.0); + let bar_width = width.min(lane_inner - bar_left); + let guide_left = indent.saturating_sub(6); + + rsx! { + div { + class: "shrink-0 border-r border-gray-100 flex items-center py-0.5 relative", + style: "width: {TIMELINE_LANE_PX}px; padding-left: {indent}px", + title: "{tooltip}", + if depth > 0 { + div { + class: "absolute top-0 bottom-1/2 w-px bg-gray-200", + style: "left: {guide_left}px", + } + div { + class: "absolute top-1/2 w-2 h-px bg-gray-200", + style: "left: {guide_left}px", + } + } + div { class: "relative h-[22px] flex-1 min-w-0 pr-1", + div { class: "absolute inset-y-[7px] inset-x-0 rounded-full {track_bg}" } + div { + class: "absolute top-[5px] h-[12px] rounded-sm {bar_bg} shadow-sm", + style: "left: {bar_left:.2}px; width: {bar_width:.2}px;", + } + div { + class: "absolute top-[9px] w-1.5 h-1.5 rounded-full {bar_bg} ring-2 ring-white -translate-x-1/2", + style: "left: {bar_left:.2}px;", + } + if active { + div { + class: "absolute top-[10px] h-0.5 bg-amber-400/60 animate-pulse", + style: "left: calc({bar_left:.2}px + {bar_width:.2}px); right: 0;", + } + } + } + } + } +} + +/// Empty lane cell for detail rows (attributes / events) that have no bar. +#[component] +pub fn SpanTimelineSpacer() -> Element { + rsx! { + div { + class: "shrink-0 border-r border-gray-100 bg-gray-50/30", + style: "width: {TIMELINE_LANE_PX}px", + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn span(start: i64, end: Option) -> SpanInfo { + SpanInfo { + span_id: 1, + trace_id: 1, + parent_id: None, + name: "test".into(), + start_timestamp: start, + end_timestamp: end, + thread_id: 0, + phase: None, + location: None, + attributes: None, + children: vec![], + events: vec![], + } + } + + #[test] + fn window_from_spans_uses_min_max() { + let roots = vec![ + span(100, Some(500)), + SpanInfo { + children: vec![span(200, Some(800))], + ..span(50, Some(300)) + }, + ]; + let w = TraceTimeWindow::from_spans(&roots); + assert_eq!(w.start_ns, 50); + assert_eq!(w.end_ns, 800); + } + + #[test] + fn offset_and_width_px() { + let w = TraceTimeWindow { + start_ns: 0, + end_ns: 1000, + }; + assert!((w.offset_px(500) - TIMELINE_LANE_PX / 2.0).abs() < 0.01); + assert!((w.width_px(0, Some(1000)) - TIMELINE_LANE_PX).abs() < 0.01); + assert!(w.width_px(0, Some(1)) >= MIN_BAR_PX); + } +} diff --git a/web/src/pages/traces.rs b/web/src/pages/traces.rs index 517ce710..d2155df9 100644 --- a/web/src/pages/traces.rs +++ b/web/src/pages/traces.rs @@ -9,6 +9,9 @@ use crate::components::common::{query_result, AsyncBoundary, EmptyState}; use crate::components::icon::Icon; use crate::components::page::{PageContainer, PageTitle}; use crate::components::poll_status::{ManualRefreshStatus, RefreshButton}; +use crate::components::span_timeline::{ + SpanTimelineBar, SpanTimelineHeader, SpanTimelineLegend, SpanTimelineSpacer, TraceTimeWindow, +}; use crate::hooks::use_app_resource; use crate::state::investigation::{ clear_spans_investigation_filters, investigation_context_key, set_trace_context, @@ -64,7 +67,7 @@ pub fn Traces() -> Element { PageTitle { title: "Spans".to_string(), subtitle: Some( - "Hierarchical tracing spans from python.trace_event. For chrome trace timelines, use Profiling → Chrome trace.".to_string(), + "Span tree with an aligned timeline lane — expand nodes to grow both views. For kernel-level chrome traces, use Profiling → Chrome trace.".to_string(), ), icon: Some(&icondata::AiApiOutlined), header_right: Some(rsx! { @@ -353,15 +356,25 @@ fn TraceTreePanel( } } } else { - div { class: "px-2 py-2 max-h-[calc(100vh-14rem)] overflow-y-auto font-mono text-xs leading-5", - for span in filtered { - SpanView { - key: "{span.span_id}", - span: span.clone(), - depth: 0, - highlight: highlight.clone(), - expand_all, - collapse_all, + { + let time_window = TraceTimeWindow::from_spans(&filtered); + rsx! { + div { class: "max-h-[calc(100vh-14rem)] overflow-y-auto font-mono text-xs leading-5", + SpanTimelineHeader { window: time_window } + SpanTimelineLegend {} + div { class: "px-0 py-1", + for span in filtered { + SpanView { + key: "{span.span_id}", + span: span.clone(), + depth: 0, + highlight: highlight.clone(), + expand_all, + collapse_all, + time_window, + } + } + } } } } @@ -560,6 +573,7 @@ fn SpanView( highlight: SpanHighlight, expand_all: Signal, collapse_all: Signal, + time_window: TraceTimeWindow, ) -> Element { let mut expanded = use_signal(|| depth < 2); let has_children = !span.children.is_empty(); @@ -590,86 +604,108 @@ fn SpanView( rsx! { div { class: "min-w-0", div { - class: "{row_class}", - style: if indent > 0 { format!("padding-left: {indent}px") } else { String::new() }, - onclick: move |_| { - set_trace_context(trace_id, Some(&span_name), Some(thread_id)); - }, - if has_details { - button { - class: "shrink-0 w-4 h-4 flex items-center justify-center text-gray-400 hover:text-gray-700", - onclick: move |e| { - e.stop_propagation(); - expanded.set(!expanded()); + class: "flex items-stretch min-w-0 hover:bg-gray-50/50", + div { + class: "flex flex-1 min-w-0 items-stretch", + SpanTimelineBar { + span: span.clone(), + window: time_window, + depth, + } + div { + class: "{row_class} flex-1 min-w-0 border-b border-gray-50", + style: if indent > 0 { format!("padding-left: {indent}px") } else { String::new() }, + onclick: move |_| { + set_trace_context(trace_id, Some(&span_name), Some(thread_id)); }, - if expanded() { - Icon { icon: &icondata::AiCaretDownOutlined, class: "w-3 h-3" } + if has_details { + button { + class: "shrink-0 w-4 h-4 flex items-center justify-center text-gray-400 hover:text-gray-700", + onclick: move |e| { + e.stop_propagation(); + expanded.set(!expanded()); + }, + if expanded() { + Icon { icon: &icondata::AiCaretDownOutlined, class: "w-3 h-3" } + } else { + Icon { icon: &icondata::AiCaretRightOutlined, class: "w-3 h-3" } + } + } } else { - Icon { icon: &icondata::AiCaretRightOutlined, class: "w-3 h-3" } + span { class: "w-4 shrink-0" } + } + span { class: "font-semibold text-gray-900 shrink-0", "{span.name}" } + if let Some(ref phase) = span.phase { + span { + class: format!( + "shrink-0 px-1.5 py-px rounded text-[10px] font-sans font-medium bg-{} text-{}", + colors::CONTENT_ACCENT_BG, + colors::CONTENT_ACCENT_TEXT, + ), + "{phase}" + } + } + if let Some(ref location) = span.location { + if !location.is_empty() { + span { class: "text-gray-500 truncate max-w-[14rem]", "{location}" } + } + } + span { class: "text-gray-400 shrink-0", "id:{span.span_id}" } + if let Some(parent) = span.parent_id { + span { class: "text-gray-400 shrink-0", "↑{parent}" } + } + span { class: "text-gray-400 shrink-0", "t:{span.thread_id}" } + if let Some(dur) = duration { + span { class: "text-emerald-700 font-medium shrink-0", "{duration_label(dur)}" } + } else { + span { class: "text-amber-600 shrink-0", "active" } + } + if has_events { + span { class: "text-gray-400 shrink-0", "{span.events.len()}evt" } + } + if has_children { + span { class: "text-gray-400 shrink-0", "{span.children.len()}↓" } } } - } else { - span { class: "w-4 shrink-0" } - } - span { class: "font-semibold text-gray-900 shrink-0", "{span.name}" } - if let Some(ref phase) = span.phase { - span { - class: format!( - "shrink-0 px-1.5 py-px rounded text-[10px] font-sans font-medium bg-{} text-{}", - colors::CONTENT_ACCENT_BG, - colors::CONTENT_ACCENT_TEXT, - ), - "{phase}" - } - } - if let Some(ref location) = span.location { - if !location.is_empty() { - span { class: "text-gray-500 truncate max-w-[14rem]", "{location}" } - } - } - span { class: "text-gray-400 shrink-0", "id:{span.span_id}" } - if let Some(parent) = span.parent_id { - span { class: "text-gray-400 shrink-0", "↑{parent}" } - } - span { class: "text-gray-400 shrink-0", "t:{span.thread_id}" } - if let Some(dur) = duration { - span { class: "text-emerald-700 font-medium shrink-0", "{duration_label(dur)}" } - } else { - span { class: "text-amber-600 shrink-0", "active" } - } - if has_events { - span { class: "text-gray-400 shrink-0", "{span.events.len()}evt" } - } - if has_children { - span { class: "text-gray-400 shrink-0", "{span.children.len()}↓" } } } if expanded() && has_details { - div { - class: "space-y-0.5 pb-1", - style: format!("padding-left: {}px", indent + 20), - if has_attrs { - AttributesInline { raw: span.attributes.clone().unwrap_or_default() } - } - if has_events { - for event in span.events.iter() { - EventView { event: event.clone() } + if has_attrs { + div { class: "flex items-stretch min-w-0", + SpanTimelineSpacer {} + div { + class: "flex-1 min-w-0 pb-0.5", + style: format!("padding-left: {}px", indent + 20), + AttributesInline { raw: span.attributes.clone().unwrap_or_default() } } } - if has_children { - for child in span.children.iter() { - SpanView { - key: "{child.span_id}", - span: child.clone(), - depth: depth + 1, - highlight: highlight.clone(), - expand_all, - collapse_all, + } + if has_events { + for event in span.events.iter() { + div { class: "flex items-stretch min-w-0", + SpanTimelineSpacer {} + div { + class: "flex-1 min-w-0", + style: format!("padding-left: {}px", indent + 20), + EventView { event: event.clone(), time_window, span_start: span.start_timestamp } } } } } + if has_children { + for child in span.children.iter() { + SpanView { + key: "{child.span_id}", + span: child.clone(), + depth: depth + 1, + highlight: highlight.clone(), + expand_all, + collapse_all, + time_window, + } + } + } } } } @@ -715,11 +751,19 @@ fn attribute_value(val: &serde_json::Value) -> String { } #[component] -fn EventView(event: EventInfo) -> Element { +fn EventView(event: EventInfo, time_window: TraceTimeWindow, span_start: i64) -> Element { + let offset = crate::components::span_timeline::format_axis_label( + (event.timestamp - time_window.start_ns) as f64, + ); + let rel = + crate::components::span_timeline::format_axis_label((event.timestamp - span_start) as f64); rsx! { - div { class: "flex flex-wrap items-baseline gap-x-2 gap-y-0 py-0.5 text-gray-600", + div { + class: "flex flex-wrap items-baseline gap-x-2 gap-y-0 py-0.5 text-gray-600", + title: "t+{rel} from span start · {offset} from trace origin", span { class: "text-blue-500 shrink-0", "●" } span { class: "text-gray-800", "{event.name}" } + span { class: "text-gray-400 shrink-0 font-mono text-[10px]", "+{rel}" } if let Some(ref attrs) = event.attributes { if !attrs.is_empty() { span { class: "text-gray-500 break-all", "{attrs}" } From 6556900d1a5ac97e5893a9f0e9eedd22db712929 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sat, 27 Jun 2026 20:43:28 +0800 Subject: [PATCH 05/37] Add torchrun cluster heartbeat support and update documentation (#51) * Update documentation and add torchrun cluster heartbeat support - Added a new `torchrun-cluster.md` file detailing the hierarchical cluster heartbeat mechanism for multi-process `torchrun` jobs. - Updated existing documentation to reference the new heartbeat feature, including changes in `distributed.md`, `index.md`, and their Chinese counterparts. - Introduced environment variable references for configuring the cluster heartbeat in `env-vars.md`. - Added a demo script `cluster_multinode_demo.py` to showcase the new functionality. - Updated `Cargo.lock` to include the new `probing-store` dependency for enhanced functionality. * Update documentation to include Torchrun Cluster Heartbeat and improve navigation - Added a new entry for "Torchrun Cluster Heartbeat" in the plugins section of `mkdocs.yml`. - Updated the navigation in `mkdocs.yml` to include a link to the new `torchrun-cluster.md` design document. - Revised links in `quickstart.md` and `quickstart.zh.md` to point to the correct paths for SQL Analytics and Distributed documentation. --- Cargo.lock | 1 + docs/mkdocs.yml | 2 + docs/src/design/distributed.md | 4 +- docs/src/design/distributed.zh.md | 2 +- docs/src/design/index.md | 1 + docs/src/design/index.zh.md | 1 + docs/src/design/torchrun-cluster.md | 64 ++ docs/src/design/torchrun-cluster.zh.md | 100 +++ docs/src/guide/concepts.md | 3 +- docs/src/guide/concepts.zh.md | 2 +- docs/src/quickstart.md | 4 +- docs/src/quickstart.zh.md | 2 +- docs/src/reference/env-vars.md | 26 +- examples/cluster_multinode_demo.py | 47 ++ examples/imagenet_with_span.py | 6 - examples/run_cluster_multinode.sh | 150 ++++ probing/cli/src/cli/skill/loader.rs | 48 ++ probing/core/src/core/cluster.rs | 194 +++++- probing/core/src/core/data_source.rs | 4 +- .../src/core/federation/aggregate_pushdown.rs | 54 +- .../src/core/federation/cluster_executor.rs | 39 +- probing/core/src/core/federation/rewrite.rs | 144 +--- probing/core/src/core/memtable_sql.rs | 52 +- probing/core/src/core/semantic_catalog.rs | 161 +++++ probing/core/src/lib.rs | 2 + probing/core/src/runtime.rs | 150 +++- probing/core/src/storage/topology.rs | 48 +- probing/core/src/sync.rs | 31 + probing/core/src/tracing.rs | 116 ++-- probing/crates/store/src/store/tcpstore.rs | 6 + .../cc/src/extensions/cpu/collector.rs | 47 +- .../gpu/src/extensions/collector.rs | 36 +- probing/extensions/nccl-profiler/src/role.rs | 5 + probing/extensions/nccl-profiler/src/state.rs | 31 +- .../extensions/nccl-profiler/src/writer.rs | 14 +- .../python/src/extensions/python/exttbls.rs | 63 +- .../python/src/extensions/python/tbls.rs | 8 +- .../extensions/python/src/features/torch.rs | 4 +- .../extensions/python/src/features/tracing.rs | 9 +- probing/memtable/src/discover.rs | 2 +- probing/memtable/src/docs.rs | 63 +- probing/memtable/src/lib.rs | 1 + probing/memtable/src/memh/table.rs | 14 +- probing/memtable/src/memtable.rs | 82 +-- probing/memtable/src/row.rs | 205 +++++- probing/proto/src/lib.rs | 2 +- probing/proto/src/protocol/cluster.rs | 19 + probing/proto/src/types/merge.rs | 74 ++ probing/proto/src/types/mod.rs | 2 + probing/server/Cargo.toml | 9 + probing/server/src/cluster_http.rs | 50 ++ probing/server/src/cluster_report_backoff.rs | 264 ++++++++ probing/server/src/lib.rs | 7 + probing/server/src/report.rs | 140 ++-- probing/server/src/server/cluster.rs | 32 +- probing/server/src/server/cluster_fanout.rs | 67 +- probing/server/src/server/mod.rs | 7 +- probing/server/src/server/training.rs | 4 +- probing/server/src/torchrun_cluster.rs | 640 ++++++++++++++++++ probing/server/src/vars.rs | 12 +- .../tests/hierarchical_cluster_report.rs | 170 +++++ python/probing/__init__.py | 7 + python/probing/ext/torch.py | 28 - python/probing/hooks/import_hook.py | 9 +- python/probing/inspect/trace.py | 53 +- python/probing/parallel.py | 5 + python/probing/torchrun_cluster.py | 302 +-------- src/lib.rs | 49 +- .../regression/core/test_torchrun_cluster.py | 86 +-- .../regression/inspect/test_trace_helpers.py | 32 + .../probing/core/federation_explain_tests.rs | 15 +- .../rust/probing/core/federation_tests.rs | 6 +- tests/unit/probing/skills/test_loader.py | 21 + .../probing/test_torchrun_cluster_report.py | 59 ++ web/src/agent/page_tools.rs | 14 +- web/src/pages/training.rs | 12 +- 76 files changed, 3241 insertions(+), 1004 deletions(-) create mode 100644 docs/src/design/torchrun-cluster.md create mode 100644 docs/src/design/torchrun-cluster.zh.md create mode 100644 examples/cluster_multinode_demo.py create mode 100755 examples/run_cluster_multinode.sh create mode 100644 probing/core/src/sync.rs create mode 100644 probing/proto/src/types/merge.rs create mode 100644 probing/server/src/cluster_http.rs create mode 100644 probing/server/src/cluster_report_backoff.rs create mode 100644 probing/server/src/torchrun_cluster.rs create mode 100644 probing/server/tests/hierarchical_cluster_report.rs create mode 100644 tests/unit/probing/test_torchrun_cluster_report.py diff --git a/Cargo.lock b/Cargo.lock index e0309640..870ac321 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3557,6 +3557,7 @@ dependencies = [ "probing-memtable", "probing-proto", "probing-python", + "probing-store", "procfs", "serde", "serde_json", diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 4ae07856..326d98bb 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -99,6 +99,7 @@ plugins: Data Layer: 数据层 Profiling: 性能分析 Distributed: 分布式 + Torchrun Cluster Heartbeat: torchrun 集群心跳 Federated Query Engine: 联邦查询引擎 Cluster with Pulsing: 基于 Pulsing 的集群 Extensibility: 扩展机制 @@ -146,6 +147,7 @@ nav: - Profiling: design/profiling.md - Debugging: design/debugging.md - Distributed: design/distributed.md + - Torchrun Cluster Heartbeat: design/torchrun-cluster.md - Federated Query Engine: design/federation.md - NCCL Profiler: design/nccl-profiler.md - Cluster with Pulsing: design/cluster-pulsing.md diff --git a/docs/src/design/distributed.md b/docs/src/design/distributed.md index 3fe86e03..c83ce85f 100644 --- a/docs/src/design/distributed.md +++ b/docs/src/design/distributed.md @@ -100,7 +100,9 @@ GROUP BY _role, _rank ORDER BY avg_ms DESC" ``` -Register peers with torchrun (`setup_torchrun_cluster`) or `PUT /apis/nodes` so `_rank` and +Register peers via torchrun (Rust ctor starts hierarchical heartbeat by default — see +[torchrun cluster heartbeat](torchrun-cluster.md)), explicit `setup_torchrun_cluster()`, or +`PUT /apis/nodes` so `_rank` and `_role` resolve correctly. Override role at runtime with `probing.set_role(...)` in training scripts. diff --git a/docs/src/design/distributed.zh.md b/docs/src/design/distributed.zh.md index 837ca318..4a373c8d 100644 --- a/docs/src/design/distributed.zh.md +++ b/docs/src/design/distributed.zh.md @@ -99,7 +99,7 @@ GROUP BY _role, _rank ORDER BY avg_ms DESC" ``` -通过 torchrun(`setup_torchrun_cluster`)或 `PUT /apis/nodes` 注册节点,`_rank` / `_role` 才能正确解析。训练脚本中可用 `probing.set_role(...)` 运行时覆盖 role。 +通过 torchrun 注入后 Rust ctor **默认**启动分层集群心跳(见 [torchrun 集群心跳](torchrun-cluster.zh.md)),或手动 `setup_torchrun_cluster()` / `PUT /apis/nodes` 注册节点,`_rank` / `_role` 才能正确解析。训练脚本中可用 `probing.set_role(...)` 运行时覆盖 role。 引擎实现与正确性测试要求见 **[联邦查询引擎](federation.zh.md)**。 diff --git a/docs/src/design/index.md b/docs/src/design/index.md index 416b20e1..4f624a07 100644 --- a/docs/src/design/index.md +++ b/docs/src/design/index.md @@ -49,6 +49,7 @@ Shared vocabulary (endpoint, steps, role, federation): **[Core Concepts](../guid | [Profiling](profiling.md) | Performance data collection | | [Debugging](debugging.md) | Debugging capabilities | | [Distributed](distributed.md) | Multi-node support | +| [Torchrun cluster heartbeat](torchrun-cluster.md) | Hierarchical registration, backoff, env presets | | [Federated query engine](federation.md) | Cross-rank SQL: scenarios, execution paths, acceptance bar | | [NCCL Profiler](nccl-profiler.md) | NCCL plugin, culprit/victim, `nccl.proxy_ops` | | [Cluster with Pulsing](cluster-pulsing.md) | Using Pulsing for membership and failure detection | diff --git a/docs/src/design/index.zh.md b/docs/src/design/index.zh.md index 24e8e91d..a5b77d64 100644 --- a/docs/src/design/index.zh.md +++ b/docs/src/design/index.zh.md @@ -49,6 +49,7 @@ Probing 的核心使命很简单:**让分布式系统重新变得 Pythonic** | [性能分析](profiling.zh.md) | 性能数据收集 | | [调试](debugging.zh.md) | 调试能力 | | [分布式](distributed.zh.md) | 多节点支持 | +| [torchrun 集群心跳](torchrun-cluster.zh.md) | 分层注册、心跳退避、env 预设 | | [联邦查询引擎](federation.zh.md) | 跨 rank SQL:诊断场景、三条执行路径、万卡验收 | | [NCCL Profiler](nccl-profiler.zh.md) | NCCL 插件、culprit/victim、`nccl.proxy_ops` | | [基于 Pulsing 的集群](cluster-pulsing.zh.md) | 使用 Pulsing 做成员发现与故障检测 | diff --git a/docs/src/design/torchrun-cluster.md b/docs/src/design/torchrun-cluster.md new file mode 100644 index 00000000..f814fa4e --- /dev/null +++ b/docs/src/design/torchrun-cluster.md @@ -0,0 +1,64 @@ +# Torchrun hierarchical cluster heartbeat + +Multi-process `torchrun` jobs **auto-register** cluster nodes when probing is injected, powering `probing cluster nodes`, the Web cluster page, and `global.*` federation queries. Implementation lives in L3 `probing/server` (Rust). It does **not** block `init_process_group` and does **not** write torch rendezvous keys. + +## When it starts + +| Condition | Notes | +|-----------|--------| +| `PROBING=1/2` | Probing injected | +| `WORLD_SIZE > 1` | Single-process jobs skip cluster | +| `PROBING_TORCHRUN_CLUSTER≠0` | Default **on** | +| `PROBING_CLUSTER_REPORT≠0` | Default **on** | +| Not elastic supervisor | torchrun parent process skips HTTP bind | + +The Rust ctor (`import probing`) calls `maybe_start_torchrun_cluster()`: bind HTTP, publish master/local0 on TCPStore, start the Tokio heartbeat worker. + +## Hierarchy + +```text +leaf (local_rank>0) ──PUT──► local0 (local_rank=0 on same node) +local0 (not global0) ──PUT──► master (global rank 0) +global rank 0 ──PUT──► local master view +``` + +Discovery keys: `probing/torchrun//master` and `.../node//local0` on the job TCPStore (same endpoint as rendezvous, separate key namespace). + +## Environment variables + +See [Environment variables](../reference/env-vars.md) for the full list. Highlights: + +| Variable | Default | Purpose | +|----------|---------|---------| +| `PROBING_TORCHRUN_CLUSTER` | `1` | Enable torchrun cluster | +| `PROBING_CLUSTER_REPORT` | `1` | Periodic heartbeat | +| `PROBING_CLUSTER_REPORT_INTERVAL_SEC` | `10` | Base interval (seconds) | +| `PROBING_CLUSTER_STALE_SEC` | `25` | Mark node `dead` after silence | +| `PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC` | `120` | Backoff cap (clamped below stale) | + +**Stale vs backoff:** effective max interval = `min(configured_max, STALE_SEC - STALE_SEC/4 - 1)`. With default stale=25, max ≈ **18s**. For ~60s stable heartbeats, raise `PROBING_CLUSTER_STALE_SEC` (≥90 recommended). + +## Presets (`PROBING_CLUSTER_PRESET`) + +`examples/run_cluster_multinode.sh` supports: + +| Preset | Use case | +|--------|----------| +| `demo` (default) | Local multinode demo | +| `fast` | Faster convergence visibility (5s interval) | +| `steady` | Long runs, lower CPU (90s stale) | + +```bash +PROBING_CLUSTER_PRESET=fast ./examples/run_cluster_multinode.sh 2 2 +``` + +## Demo + +```bash +./examples/run_cluster_multinode.sh +probing -t rank0-host:18080 cluster nodes +``` + +Cluster heartbeat starts from the **Rust ctor only**; `init_process_group` is not patched. Python `probing.torchrun_cluster.setup_torchrun_cluster()` remains for explicit calls and tests. + +See also [Distributed architecture](distributed.md). diff --git a/docs/src/design/torchrun-cluster.zh.md b/docs/src/design/torchrun-cluster.zh.md new file mode 100644 index 00000000..e2b30ab1 --- /dev/null +++ b/docs/src/design/torchrun-cluster.zh.md @@ -0,0 +1,100 @@ +# torchrun 分层集群心跳 + +多进程 `torchrun` 作业在 probing 注入后**默认自动**注册集群节点,供 `probing cluster nodes`、Web 集群页与 `global.*` 联邦查询使用。实现位于 L3 `probing/server`(Rust),**不阻塞** `init_process_group`,**不写入** torch rendezvous key。 + +## 启动条件 + +| 条件 | 说明 | +|------|------| +| `PROBING=1/2` | 进程已注入 probing | +| `WORLD_SIZE > 1` | 单进程不启动 | +| `PROBING_TORCHRUN_CLUSTER≠0` | 默认 **开** | +| `PROBING_CLUSTER_REPORT≠0` | 默认 **开** | +| 非 elastic supervisor | torchrun 主进程不绑 HTTP | + +满足条件时,Rust ctor(`import probing`)调用 `maybe_start_torchrun_cluster()`:绑 HTTP、在 TCPStore 发布 master/local0 地址、启动 Tokio 心跳 worker。 + +## 分层拓扑 + +```text +leaf (local_rank>0) ──PUT──► local0 (本机 local_rank=0) +local0 (非 global0) ──PUT──► master (global rank 0) +global rank 0 ──PUT──► 本机 master 视图 +``` + +- **发现**:`probing/torchrun//master` 与 `.../node//local0` 写在 job TCPStore(与 torch rendezvous 同 endpoint,独立 key 前缀)。 +- **合并**:`PUT /apis/nodes` 合并心跳;`GET /apis/nodes` 返回按 rank 排序的快照。 +- **收敛**:未凑齐全员时保持 **base 间隔**(默认 10s);全员 alive 后指数退避(默认 ×2,有上限)。 + +## 环境变量 + +### 开关 + +| 变量 | 默认 | 说明 | +|------|------|------| +| `PROBING_TORCHRUN_CLUSTER` | `1` | `0` 关闭 torchrun 集群 | +| `PROBING_CLUSTER_REPORT` | `1` | `0` 只绑 HTTP,不跑周期心跳 | +| `PROBING_CLUSTER_REPORT_BACKOFF` | `1` | `0` 关闭稳定后退避 | + +### 心跳与 TTL + +| 变量 | 默认 | 说明 | +|------|------|------| +| `PROBING_CLUSTER_REPORT_INTERVAL_SEC` | `10` | 基础心跳间隔(秒) | +| `PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC` | `120` | 退避上限(会被 stale 安全钳制) | +| `PROBING_CLUSTER_REPORT_BACKOFF_FACTOR` | `2` | 每次稳定 tick 的乘数 | +| `PROBING_CLUSTER_STALE_SEC` | `25` | 超时未心跳则标 `dead` | +| `PROBING_CLUSTER_DISCOVER_TIMEOUT_SEC` | `2` | 发现 master/local0 单次超时 | +| `PROBING_CLUSTER_REPORT_TIMEOUT_SEC` | `5` | PUT 超时 | + +**stale 与退避**:实际 max 间隔 = `min(配置上限, STALE_SEC - STALE_SEC/4 - 1)`。默认 stale=25 时 max ≈ **18s**。若希望稳定后 60s 心跳,需同时提高 `PROBING_CLUSTER_STALE_SEC`(建议 ≥90)。 + +### 网络 + +| 变量 | 说明 | +|------|------| +| `PROBING_PORT` | 仅 **global rank 0** 绑定;其他 rank 用 `0.0.0.0:0` | +| `MASTER_ADDR` / `MASTER_PORT` | TCPStore endpoint(torchrun 已设置) | +| `RDZV_ID` | 多 `torchrun` 并行时必须共享(见 demo 脚本) | + +## 预设(`PROBING_CLUSTER_PRESET`) + +`examples/run_cluster_multinode.sh` 支持预设,便于 demo / 调试 / 长跑: + +| 预设 | 用途 | 主要效果 | +|------|------|----------| +| `demo`(默认) | 本地多机 demo | 默认 env,10s 收敛 + 短 stale | +| `fast` | 快速看清 cluster 收敛 | interval=5s,stale=30s | +| `steady` | 长跑省 CPU | stale=90s,max interval≈67s | + +```bash +PROBING_CLUSTER_PRESET=fast ./examples/run_cluster_multinode.sh 2 2 +PROBING_CLUSTER_PRESET=steady ./examples/run_cluster_multinode.sh 4 8 +``` + +也可手动覆盖任意变量;预设只设置未显式 export 的项。 + +## 查询与 role + +```bash +# 连 global rank 0(PROBING_PORT,默认 18080) +probing -t rank0-host:18080 cluster nodes +``` + +训练脚本中 `probing.set_role(dp=…)` 后调用 `refresh_node_role()`(Python facade)立即补一条心跳。 + +## 演示 + +```bash +./examples/run_cluster_multinode.sh # 2 机 × 2 卡 +./examples/run_cluster_multinode.sh 3 4 60 # 3 机 × 4 卡,sleep 60s +``` + +## 与 Python hook 的关系 + +集群心跳**仅由 Rust ctor 启动**;不再 patch `torch.distributed.init_process_group`。Python 模块 `probing.torchrun_cluster` 保留 `setup_torchrun_cluster()` / `master_info()` 供显式调用与测试。 + +## 相关文档 + +- [分布式架构](distributed.zh.md) — 联邦查询与 cluster API +- [环境变量](../reference/env-vars.md) — 完整 env 列表 diff --git a/docs/src/guide/concepts.md b/docs/src/guide/concepts.md index 95f40cbc..f4de957a 100644 --- a/docs/src/guide/concepts.md +++ b/docs/src/guide/concepts.md @@ -177,7 +177,8 @@ ORDER BY avg_ms DESC; ...runs on every registered rank, then the master merges all results into one result set with `_rank` telling you which row came from where. -Nodes register via torchrun (`setup_torchrun_cluster`) or by POSTing to +Nodes register via torchrun (Rust ctor starts cluster heartbeat by default — see +[torchrun cluster heartbeat](../design/torchrun-cluster.md)) or by PUTting to `/apis/nodes`. Check current registration with `probing -t cluster nodes`. The `_role` tag uses the value from the **node registry**, which is kept in sync diff --git a/docs/src/guide/concepts.zh.md b/docs/src/guide/concepts.zh.md index 6f381b79..03ac0b9d 100644 --- a/docs/src/guide/concepts.zh.md +++ b/docs/src/guide/concepts.zh.md @@ -151,7 +151,7 @@ GROUP BY _role, _rank, op ORDER BY avg_ms DESC; ``` -通过 torchrun(`setup_torchrun_cluster`)或 POST `/apis/nodes` 注册节点。 +通过 torchrun 注入(Rust ctor 默认启动集群心跳,见 [torchrun 集群心跳](../design/torchrun-cluster.zh.md))或 `PUT /apis/nodes` 注册节点。 用 `probing -t cluster nodes` 验证。详见 [分布式](../design/distributed.zh.md)。 ## 表插件 vs 诊断 skill diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md index 773abfcd..e193a8fb 100644 --- a/docs/src/quickstart.md +++ b/docs/src/quickstart.md @@ -175,5 +175,5 @@ day-to-day diagnostic work. Each is documented in detail in the [API Reference](api-reference.md). For deeper analysis patterns (JOINs across tables, time-series bucketing, -statistical aggregation), read [SQL Analytics](sql-analytics.md). For -multi-node debugging, start with [Distributed](../design/distributed.md). +statistical aggregation), read [SQL Analytics](guide/sql-analytics.md). For +multi-node debugging, start with [Distributed](design/distributed.md). diff --git a/docs/src/quickstart.zh.md b/docs/src/quickstart.zh.md index 30ea5370..9ea0480a 100644 --- a/docs/src/quickstart.zh.md +++ b/docs/src/quickstart.zh.md @@ -157,4 +157,4 @@ probing -t query " 见 [API 参考](api-reference.zh.md)。 更深入的分析模式(跨表 JOIN、时间分桶、统计聚合)见 [SQL 分析](guide/sql-analytics.zh.md)。 -多节点调试从[分布式](../design/distributed.zh.md)开始。 +多节点调试从[分布式](design/distributed.zh.md)开始。 diff --git a/docs/src/reference/env-vars.md b/docs/src/reference/env-vars.md index f9576e64..2868e743 100644 --- a/docs/src/reference/env-vars.md +++ b/docs/src/reference/env-vars.md @@ -121,11 +121,27 @@ Non-PROBING-prefixed aliases are also recognized for Megatron compatibility: ## PyTorch integration -| Variable | Description | -|----------|-------------| -| `PROBING_TORCH_PROFILING` | Set to `on` to activate PyTorch module hooks and write `python.torch_trace`. Required for module timing and memory data. | -| `PROBING_TORCHRUN_CLUSTER` | Enable automatic cluster registration via torchrun. | -| `PROBING_TORCHRUN_STORE_TIMEOUT` | Timeout for torchrun distributed store operations. | +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_TORCH_PROFILING` | — | Set to `on` to activate PyTorch module hooks and write `python.torch_trace`. Required for module timing and memory data. | +| `PROBING_TORCHRUN_CLUSTER` | `1` | Enable automatic torchrun cluster registration. Set to `0` to disable. | +| `PROBING_TORCHRUN_STORE_TIMEOUT` | — | Timeout for torchrun distributed store operations. | + +## Cluster heartbeat (torchrun) + +Hierarchical side-channel registration when `WORLD_SIZE > 1`. See [torchrun cluster heartbeat](../design/torchrun-cluster.md). + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_CLUSTER_REPORT` | `1` | Periodic heartbeat worker. `0` = HTTP only, no periodic PUT. | +| `PROBING_CLUSTER_REPORT_INTERVAL_SEC` | `10` | Base heartbeat interval (seconds). | +| `PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC` | `120` | Backoff cap (clamped below stale TTL). | +| `PROBING_CLUSTER_REPORT_BACKOFF_FACTOR` | `2` | Multiplier per stable tick. | +| `PROBING_CLUSTER_REPORT_BACKOFF` | `1` | Set to `0` to disable exponential backoff when stable. | +| `PROBING_CLUSTER_STALE_SEC` | `25` | Mark node `dead` after this many seconds without heartbeat. Should exceed max interval. | +| `PROBING_CLUSTER_DISCOVER_TIMEOUT_SEC` | `2` | Timeout per master/local0 discovery attempt. | +| `PROBING_CLUSTER_REPORT_TIMEOUT_SEC` | `5` | HTTP PUT timeout for cluster report. | +| `PROBING_CLUSTER_PRESET` | — | Used by `examples/run_cluster_multinode.sh`: `demo`, `fast`, or `steady`. | ## Debugging & diagnostics diff --git a/examples/cluster_multinode_demo.py b/examples/cluster_multinode_demo.py new file mode 100644 index 00000000..f66f237f --- /dev/null +++ b/examples/cluster_multinode_demo.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +"""Sleep demo for multi-node torchrun + probing hierarchical cluster report. + +Run via ``./examples/run_cluster_multinode.sh`` (see script for N nodes × M GPUs). + +Probing loads from ``PROBING=2`` (site hook). Rust ctor starts hierarchical +cluster heartbeat when ``WORLD_SIZE > 1`` (default on). +""" + +from __future__ import annotations + +import os +import time + +import torch.distributed as dist + + +def main() -> None: + backend = os.environ.get("PROBING_TORCH_BACKEND", "gloo") + dist.init_process_group(backend=backend) + + rank = dist.get_rank() + world = dist.get_world_size() + sleep_sec = float(os.environ.get("SLEEP_SEC", "120")) + interval = float(os.environ.get("PRINT_INTERVAL_SEC", "30")) + + print( + f"[rank {rank}/{world}] " + f"local_rank={os.environ.get('LOCAL_RANK', '?')} " + f"group_rank={os.environ.get('GROUP_RANK', os.environ.get('NODE_RANK', '?'))} " + f"sleep {sleep_sec}s", + flush=True, + ) + + deadline = time.monotonic() + sleep_sec + while time.monotonic() < deadline: + remaining = deadline - time.monotonic() + time.sleep(min(interval, remaining)) + if time.monotonic() < deadline: + print(f"[rank {rank}] alive", flush=True) + + dist.barrier() + dist.destroy_process_group() + + +if __name__ == "__main__": + main() diff --git a/examples/imagenet_with_span.py b/examples/imagenet_with_span.py index ae78130d..932467dc 100644 --- a/examples/imagenet_with_span.py +++ b/examples/imagenet_with_span.py @@ -244,12 +244,6 @@ def main_worker(gpu, ngpus_per_node, args): world_size=args.world_size, rank=args.rank, ) - try: - from probing.torchrun_cluster import maybe_setup_torchrun_cluster - - maybe_setup_torchrun_cluster() - except Exception: - pass # create model with probing.span("model.init"): if args.pretrained: diff --git a/examples/run_cluster_multinode.sh b/examples/run_cluster_multinode.sh new file mode 100755 index 00000000..55f98099 --- /dev/null +++ b/examples/run_cluster_multinode.sh @@ -0,0 +1,150 @@ +#!/usr/bin/env bash +# 本机模拟 N 机 × M 卡:自动并行启动 N 个 torchrun(每个 node_rank 一个)。 +# +# ./examples/run_cluster_multinode.sh # 默认 2 机 × 2 卡 +# ./examples/run_cluster_multinode.sh 3 4 # 3 机 × 4 卡 +# ./examples/run_cluster_multinode.sh 2 2 60 # sleep 60s +# +# 也可用环境变量:NNODES NPROC SLEEP_SEC MASTER_PORT +# probing 高级开关(一般不用改):PROBING_PORT PROBING_CLUSTER_REPORT=0 +# 心跳预设:PROBING_CLUSTER_PRESET=demo|fast|steady(见 docs/src/design/torchrun-cluster.zh.md) +set -euo pipefail + +cd "$(dirname "$0")/.." +[[ -f .venv/bin/activate ]] && source .venv/bin/activate + +apply_cluster_preset() { + local preset="${PROBING_CLUSTER_PRESET:-demo}" + case "$preset" in + demo) + : # defaults: interval=10, stale=25, backoff on + ;; + fast) + export PROBING_CLUSTER_REPORT_INTERVAL_SEC="${PROBING_CLUSTER_REPORT_INTERVAL_SEC:-5}" + export PROBING_CLUSTER_STALE_SEC="${PROBING_CLUSTER_STALE_SEC:-30}" + export PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC="${PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC:-22}" + ;; + steady) + export PROBING_CLUSTER_STALE_SEC="${PROBING_CLUSTER_STALE_SEC:-90}" + export PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC="${PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC:-67}" + export PROBING_CLUSTER_REPORT_INTERVAL_SEC="${PROBING_CLUSTER_REPORT_INTERVAL_SEC:-15}" + ;; + *) + echo "unknown PROBING_CLUSTER_PRESET=$preset (use demo|fast|steady)" >&2 + exit 1 + ;; + esac +} + +apply_cluster_preset + +# positional: N [M [sleep_sec]] +NNODES="${1:-${NNODES:-2}}" +NPROC="${2:-${NPROC:-2}}" +SLEEP_SEC="${3:-${SLEEP_SEC:-120}}" + +MASTER_ADDR="${MASTER_ADDR:-127.0.0.1}" +MASTER_PORT="${MASTER_PORT:-29680}" +STAGGER_SEC="${STAGGER_SEC:-0.3}" +# All torchrun launches must share one rendezvous id (each `torchrun` otherwise gets a random id). +RDZV_ID="${RDZV_ID:-probing-${MASTER_PORT}}" +NODE0_BOOT_SEC="${NODE0_BOOT_SEC:-5}" + +# PROBING=2:torchrun 子进程自动注入(Rust ctor 默认启动 cluster heartbeat) +export PROBING="${PROBING:-2}" +export PROBING_PORT="${PROBING_PORT:-18080}" +export MASTER_ADDR MASTER_PORT SLEEP_SEC RDZV_ID + +if [[ "$(uname -s)" == Darwin ]]; then + export GLOO_SOCKET_IFNAME="${GLOO_SOCKET_IFNAME:-lo0}" +fi + +python -c "import torch" 2>/dev/null || { + echo "need torch: uv pip install torch" >&2 + exit 1 +} + +if ! [[ "$NNODES" =~ ^[1-9][0-9]*$ ]] || ! [[ "$NPROC" =~ ^[1-9][0-9]*$ ]]; then + echo "usage: $0 [NNODES [NPROC [SLEEP_SEC]]]" >&2 + exit 1 +fi + +WORLD=$((NNODES * NPROC)) +echo "==> 启动 ${NNODES} 个 torchrun(每机 ${NPROC} rank,world_size=${WORLD})" +echo " MASTER=${MASTER_ADDR}:${MASTER_PORT} RDZV_ID=${RDZV_ID} probing=${PROBING_PORT} SLEEP=${SLEEP_SEC}s" +echo " cluster preset=${PROBING_CLUSTER_PRESET:-demo} stale=${PROBING_CLUSTER_STALE_SEC:-25}s interval=${PROBING_CLUSTER_REPORT_INTERVAL_SEC:-10}s" +echo " 运行中查询: probing -t ${MASTER_ADDR}:${PROBING_PORT} cluster nodes" + +wait_for_master_port() { + local deadline=$((SECONDS + NODE0_BOOT_SEC)) + while (( SECONDS < deadline )); do + if python - </dev/null +import socket +s = socket.socket() +s.settimeout(0.3) +try: + s.connect(("${MASTER_ADDR}", ${MASTER_PORT})) +except OSError: + raise SystemExit(1) +finally: + s.close() +PY + then + return 0 + fi + sleep 0.2 + done + echo " 警告: ${MASTER_ADDR}:${MASTER_PORT} 在 ${NODE0_BOOT_SEC}s 内未就绪,后续节点可能 rendezvous 超时" >&2 + return 1 +} + +pids=() +cleanup() { + local pid + for pid in "${pids[@]:-}"; do + kill "$pid" 2>/dev/null || true + done +} +trap cleanup EXIT INT TERM + +for node_rank in $(seq 0 $((NNODES - 1))); do + if [[ "$node_rank" -gt 0 ]]; then + wait_for_master_port || true + fi + echo " torchrun #${node_rank} (--node_rank=${node_rank})" + torchrun \ + --nnodes="${NNODES}" \ + --node_rank="${node_rank}" \ + --nproc_per_node="${NPROC}" \ + --master_addr="${MASTER_ADDR}" \ + --master_port="${MASTER_PORT}" \ + --rdzv_id="${RDZV_ID}" \ + --local_addr=127.0.0.1 \ + examples/cluster_multinode_demo.py 2>&1 | sed -u "s/^/[node${node_rank}] /" & + pids+=("$!") + if [[ "$node_rank" -eq 0 ]]; then + sleep "${NODE0_BOOT_SEC}" + else + sleep "${STAGGER_SEC}" + fi +done + +echo "==> 等待 ${NNODES} 个 torchrun 结束 ..." +fail=0 +for i in "${!pids[@]}"; do + if ! wait "${pids[$i]}"; then + echo " node_rank=${i} 退出非 0" >&2 + fail=1 + fi +done + +if [[ "$fail" -ne 0 ]]; then + echo "==> 有节点失败" >&2 + exit 1 +fi +echo "==> 全部结束" + +if command -v probing >/dev/null 2>&1; then + echo "--- probing cluster nodes (global rank0) ---" + probing -t "127.0.0.1:${PROBING_PORT}" cluster nodes 2>/dev/null || true +fi diff --git a/probing/cli/src/cli/skill/loader.rs b/probing/cli/src/cli/skill/loader.rs index c240345d..a1ba784d 100644 --- a/probing/cli/src/cli/skill/loader.rs +++ b/probing/cli/src/cli/skill/loader.rs @@ -357,3 +357,51 @@ pub fn expand_template(template: &str, ctx: &HashMap) -> String } out } + +#[cfg(test)] +mod tests { + use super::*; + + fn normalize_sql(sql: &str) -> String { + sql.split_whitespace().collect::>().join(" ") + } + + #[test] + fn slow_rank_rank_latency_sql_golden() { + let skill = load_skill("slow_rank").expect("slow_rank skill"); + let overrides = HashMap::from([ + ("use_global".to_string(), "false".to_string()), + ("step_window".to_string(), "5".to_string()), + ]); + let ctx = build_context(&skill, &overrides); + let step = skill + .steps + .iter() + .find(|s| s.id == "rank_latency") + .expect("rank_latency step"); + let sql = expand_template(step.sql.as_ref().expect("sql"), &ctx); + let normalized = normalize_sql(&sql); + assert!(normalized.contains("FROM python.comm_collective")); + assert!(!normalized.contains("global.python.comm_collective")); + assert!(normalized.contains("- 5")); + } + + #[test] + fn slow_rank_rank_latency_global_sql_golden() { + let skill = load_skill("slow_rank").expect("slow_rank skill"); + let overrides = HashMap::from([ + ("use_global".to_string(), "true".to_string()), + ("step_window".to_string(), "10".to_string()), + ]); + let ctx = build_context(&skill, &overrides); + let step = skill + .steps + .iter() + .find(|s| s.id == "rank_latency") + .expect("rank_latency step"); + let sql = expand_template(step.sql.as_ref().expect("sql"), &ctx); + let normalized = normalize_sql(&sql); + assert!(normalized.contains("FROM global.python.comm_collective")); + assert!(normalized.contains("- 10")); + } +} diff --git a/probing/core/src/core/cluster.rs b/probing/core/src/core/cluster.rs index 5f10600b..3d64c0d5 100644 --- a/probing/core/src/core/cluster.rs +++ b/probing/core/src/core/cluster.rs @@ -1,7 +1,8 @@ -use std::sync::{Arc, LazyLock, RwLock}; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, LazyLock, RwLock, RwLockReadGuard, RwLockWriteGuard}; use arrow::array::{ArrayRef, Int32Array, StringArray, TimestampMicrosecondArray}; -use probing_proto::prelude::{Cluster, Node}; +use probing_proto::prelude::{Cluster, Node, NodeReportResponse}; pub trait IntoArrow { fn into_arrow_array(values: Vec) -> ArrayRef @@ -50,28 +51,197 @@ where pub static CLUSTER: LazyLock> = LazyLock::new(|| RwLock::new(Cluster::default())); -pub fn update_node(mut node: Node) { - node.timestamp = std::time::SystemTime::now() +static LOCAL_LISTEN_ADDRS: LazyLock>>> = + LazyLock::new(|| RwLock::new(None)); + +static CLUSTER_VERSION: AtomicU64 = AtomicU64::new(0); + +fn now_micros() -> u64 { + std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .unwrap() - .as_micros() as u64; - CLUSTER.write().unwrap().put(node); + .as_micros() as u64 } -pub fn update_nodes(nodes: Vec) { - let mut cluster = CLUSTER.write().unwrap(); +fn stale_threshold_micros() -> u64 { + std::env::var("PROBING_CLUSTER_STALE_SEC") + .ok() + .and_then(|v| v.trim().parse().ok()) + .unwrap_or(25) + * 1_000_000 +} + +/// Override local listen address(es) at runtime (e.g. when the HTTP server binds). +pub fn set_local_listen_addrs(addrs: Vec) { + *crate::sync::write_rwlock(&LOCAL_LISTEN_ADDRS, "LOCAL_LISTEN_ADDRS") = Some(addrs); +} + +/// Local listen address(es): runtime override, then `PROBING_ADDRESS` env, then default. +pub fn local_listen_addrs() -> Vec { + if let Some(addrs) = + crate::sync::read_rwlock(&LOCAL_LISTEN_ADDRS, "LOCAL_LISTEN_ADDRS").as_ref() + { + if !addrs.is_empty() { + return addrs.clone(); + } + } + if let Ok(addr) = std::env::var("PROBING_ADDRESS") { + if !addr.trim().is_empty() { + return vec![addr]; + } + } + vec!["127.0.0.1:8080".into()] +} +pub fn local_addr_label() -> String { + local_listen_addrs() + .into_iter() + .next() + .unwrap_or_else(|| "127.0.0.1:8080".into()) +} + +fn read_cluster() -> RwLockReadGuard<'static, Cluster> { + crate::sync::read_rwlock(&CLUSTER, "CLUSTER") +} + +fn write_cluster() -> RwLockWriteGuard<'static, Cluster> { + crate::sync::write_rwlock(&CLUSTER, "CLUSTER") +} + +pub fn update_node(mut node: Node) { + node.timestamp = now_micros(); + if node.status.is_none() { + node.status = Some("running".to_string()); + } + write_cluster().put(node); +} + +pub fn update_nodes(nodes: Vec) { for node in nodes { - cluster.put(node); + update_node(node); } } +/// Merge reported nodes, sweep stale entries to ``dead``, bump version, return snapshot. +pub fn apply_node_report(incoming: Vec) -> NodeReportResponse { + for node in incoming { + update_node(node); + } + let removed = mark_stale_nodes_as_dead(); + let version = CLUSTER_VERSION.fetch_add(1, Ordering::Relaxed) + 1; + NodeReportResponse { + ok: true, + version, + nodes: get_nodes(), + removed, + } +} + +pub fn cluster_version() -> u64 { + CLUSTER_VERSION.load(Ordering::Relaxed) +} + +/// Mark nodes whose heartbeat timestamp is older than the stale threshold as ``dead``. +fn mark_stale_nodes_as_dead() -> Vec { + let threshold = stale_threshold_micros(); + let now = now_micros(); + let mut newly_dead = Vec::new(); + let mut cluster = write_cluster(); + for (key, node) in cluster.nodes.iter_mut() { + if node.timestamp == 0 { + continue; + } + if now.saturating_sub(node.timestamp) <= threshold { + continue; + } + if node.status.as_deref() == Some("dead") { + continue; + } + node.status = Some("dead".to_string()); + newly_dead.push(key.clone()); + } + newly_dead +} + +pub fn is_node_alive(node: &Node) -> bool { + node.status.as_deref() != Some("dead") +} + pub fn get_nodes() -> Vec { - CLUSTER.read().unwrap().list() + let mut nodes = read_cluster().list(); + nodes.sort_by(|a, b| match (a.rank, b.rank) { + (Some(ra), Some(rb)) => ra.cmp(&rb), + (Some(_), None) => std::cmp::Ordering::Less, + (None, Some(_)) => std::cmp::Ordering::Greater, + (None, None) => a.addr.cmp(&b.addr), + }); + nodes } -/// Clear in-memory cluster registration (tests only). #[cfg(any(test, feature = "test-utils"))] pub fn reset_cluster_for_tests() { - *CLUSTER.write().unwrap() = Cluster::default(); + *write_cluster() = Cluster::default(); + CLUSTER_VERSION.store(0, Ordering::Relaxed); +} + +#[cfg(test)] +mod tests { + use std::sync::{LazyLock, Mutex}; + + use super::*; + + static TEST_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); + + #[test] + fn apply_report_marks_stale_nodes_dead() { + let _guard = TEST_LOCK.lock().unwrap(); + reset_cluster_for_tests(); + let old = Node { + host: "h1".into(), + addr: "10.0.0.1:1".into(), + rank: Some(1), + status: Some("running".into()), + timestamp: now_micros().saturating_sub(60 * 1_000_000), + ..Default::default() + }; + write_cluster().put(old); + let resp = apply_node_report(vec![]); + assert!(resp.nodes.iter().any(|n| n.rank == Some(1))); + let dead = resp.nodes.iter().find(|n| n.rank == Some(1)).unwrap(); + assert_eq!(dead.status.as_deref(), Some("dead")); + assert!(resp.version >= 1); + } + + #[test] + fn apply_report_refreshes_running_node() { + let _guard = TEST_LOCK.lock().unwrap(); + reset_cluster_for_tests(); + let node = Node { + host: "h1".into(), + addr: "10.0.0.1:2".into(), + rank: Some(2), + status: Some("running".into()), + ..Default::default() + }; + let resp = apply_node_report(vec![node]); + assert_eq!(resp.nodes.len(), 1); + assert_eq!(resp.nodes[0].status.as_deref(), Some("running")); + assert!(resp.nodes[0].timestamp > 0); + } + + #[test] + fn get_nodes_sorted_by_rank() { + let _guard = TEST_LOCK.lock().unwrap(); + reset_cluster_for_tests(); + for rank in [3, 0, 2, 1] { + write_cluster().put(Node { + host: "h".into(), + addr: format!("10.0.0.1:{rank}"), + rank: Some(rank), + ..Default::default() + }); + } + let ranks: Vec = get_nodes().into_iter().filter_map(|n| n.rank).collect(); + assert_eq!(ranks, vec![0, 1, 2, 3]); + } } diff --git a/probing/core/src/core/data_source.rs b/probing/core/src/core/data_source.rs index b35e1a8b..534d94bc 100644 --- a/probing/core/src/core/data_source.rs +++ b/probing/core/src/core/data_source.rs @@ -409,6 +409,8 @@ impl SchemaProvide )) } fn table_exist(&self, _name: &str) -> bool { - true + // Only tables in [`CustomNamespace::list`] are resolved here; extern mmap + // tables are handled by [`MmapFileSchemaProvider`]. + T::list().iter().any(|n| n == _name) } } diff --git a/probing/core/src/core/federation/aggregate_pushdown.rs b/probing/core/src/core/federation/aggregate_pushdown.rs index ded9303f..2edb5b19 100644 --- a/probing/core/src/core/federation/aggregate_pushdown.rs +++ b/probing/core/src/core/federation/aggregate_pushdown.rs @@ -120,7 +120,7 @@ pub async fn try_execute_aggregate_pushdown( } else if proto_parts.len() == 1 { proto_parts.remove(0) } else { - merge_proto_dataframes(&proto_parts)? + probing_proto::types::merge_dataframes(&proto_parts) }; let result = if let Some(tail) = plan.post_merge_tail { @@ -518,58 +518,6 @@ fn batches_to_dataframe(batches: Vec) -> Result Result { - let mut out = probing_proto::prelude::DataFrame::default(); - for df in parts { - if df.is_empty() { - continue; - } - if out.is_empty() { - out = df.clone(); - continue; - } - append_proto_dataframe(&mut out, df)?; - } - out.size = out.len() as u64; - Ok(out) -} - -fn append_proto_dataframe( - base: &mut probing_proto::prelude::DataFrame, - other: &probing_proto::prelude::DataFrame, -) -> Result<()> { - use probing_proto::prelude::{Ele, Seq}; - if other.is_empty() { - return Ok(()); - } - if base.is_empty() { - *base = other.clone(); - return Ok(()); - } - let other_rows = other.len(); - for name in &other.names { - if !base.names.contains(name) { - base.names.push(name.clone()); - base.cols - .push(Seq::SeqText(vec![String::new(); base.len()])); - } - } - for (col_idx, name) in base.names.clone().iter().enumerate() { - let src_idx = other.names.iter().position(|n| n == name); - for row in 0..other_rows { - let ele = src_idx - .and_then(|i| other.cols.get(i).map(|c| c.get(row))) - .unwrap_or(Ele::Nil); - if let Some(col) = base.cols.get_mut(col_idx) { - let _ = col.append(ele); - } - } - } - Ok(()) -} - #[cfg(test)] mod tests { use super::*; diff --git a/probing/core/src/core/federation/cluster_executor.rs b/probing/core/src/core/federation/cluster_executor.rs index 4f1be781..0562f3fd 100644 --- a/probing/core/src/core/federation/cluster_executor.rs +++ b/probing/core/src/core/federation/cluster_executor.rs @@ -1,4 +1,4 @@ -use std::sync::{LazyLock, Mutex}; +use std::sync::{LazyLock, Mutex, MutexGuard}; use std::time::Duration; use datafusion::error::{DataFusionError, Result}; @@ -16,7 +16,7 @@ static REMOTE_QUERY_HOOK: LazyLock>> = /// Install an in-process remote query handler for federation integration tests. #[cfg(any(test, feature = "test-utils"))] pub fn set_remote_query_hook(hook: Option) { - *REMOTE_QUERY_HOOK.lock().unwrap() = hook; + *lock_remote_query_hook() = hook; } /// Default per-node timeout for remote federated queries (seconds). @@ -56,34 +56,39 @@ pub struct FanoutStats { static LAST_FANOUT_STATS: LazyLock> = LazyLock::new(|| Mutex::new(FanoutStats::default())); +fn lock_fanout_stats() -> MutexGuard<'static, FanoutStats> { + crate::sync::lock_mutex(&LAST_FANOUT_STATS, "LAST_FANOUT_STATS") +} + +#[cfg(any(test, feature = "test-utils"))] +fn lock_remote_query_hook() -> MutexGuard<'static, Option> { + crate::sync::lock_mutex(&REMOTE_QUERY_HOOK, "REMOTE_QUERY_HOOK") +} + pub fn reset_fanout_stats() { - *LAST_FANOUT_STATS.lock().unwrap() = FanoutStats::default(); + *lock_fanout_stats() = FanoutStats::default(); } /// Record the fan-out outcome so callers (e.g. cluster fan-out meta) can report /// how many peers were actually queried and which ones failed. pub fn set_fanout_stats(stats: FanoutStats) { - *LAST_FANOUT_STATS.lock().unwrap() = stats; + *lock_fanout_stats() = stats; } /// Increment the success counter for one peer (concurrency-safe). /// /// Used by streaming fan-out where each peer partition reports its own outcome. pub fn record_fanout_success() { - LAST_FANOUT_STATS.lock().unwrap().nodes_succeeded += 1; + lock_fanout_stats().nodes_succeeded += 1; } /// Record a failed peer (concurrency-safe). pub fn record_fanout_failure(addr: &str) { - LAST_FANOUT_STATS - .lock() - .unwrap() - .nodes_failed - .push(addr.to_string()); + lock_fanout_stats().nodes_failed.push(addr.to_string()); } pub fn take_fanout_stats() -> FanoutStats { - std::mem::take(&mut *LAST_FANOUT_STATS.lock().unwrap()) + std::mem::take(&mut *lock_fanout_stats()) } pub struct ProbeClusterExecutor; @@ -96,16 +101,11 @@ impl ProbeClusterExecutor { } pub fn local_listen_addrs() -> Vec { - std::env::var("PROBING_ADDRESS") - .map(|addr| vec![addr]) - .unwrap_or_else(|_| vec!["127.0.0.1:8080".into()]) + crate::core::cluster::local_listen_addrs() } pub fn local_addr_label() -> String { - Self::local_listen_addrs() - .into_iter() - .next() - .unwrap_or_else(|| "127.0.0.1:8080".into()) + crate::core::cluster::local_addr_label() } /// Peer nodes that are not the local node (deduplicated against listen addrs). @@ -113,6 +113,7 @@ impl ProbeClusterExecutor { let local_addrs = Self::local_listen_addrs(); get_nodes() .into_iter() + .filter(crate::core::cluster::is_node_alive) .filter(|node| !local_addrs.iter().any(|local| local == &node.addr)) .collect() } @@ -169,7 +170,7 @@ impl ProbeClusterExecutor { fn execute_remote(addr: &str, sql: &str) -> Result { #[cfg(any(test, feature = "test-utils"))] - if let Some(hook) = REMOTE_QUERY_HOOK.lock().unwrap().as_ref() { + if let Some(hook) = lock_remote_query_hook().as_ref() { return hook(addr, sql); } diff --git a/probing/core/src/core/federation/rewrite.rs b/probing/core/src/core/federation/rewrite.rs index 8ff32d3a..f6823a86 100644 --- a/probing/core/src/core/federation/rewrite.rs +++ b/probing/core/src/core/federation/rewrite.rs @@ -1,11 +1,9 @@ //! SQL rewrite helpers for the `probe` / `global` catalog split. -use datafusion::sql::sqlparser::ast::{Query, SetExpr, Statement}; +use datafusion::sql::sqlparser::ast::{Query, SelectItem, SetExpr, Statement}; use datafusion::sql::sqlparser::dialect::GenericDialect; use datafusion::sql::sqlparser::parser::Parser; -use super::convert::FEDERATION_TAG_COLUMNS; - const KNOWN_SCHEMAS: &[&str] = &[ "cluster", "process", "files", "python", "memtable", "gpu", "rdma", ]; @@ -100,96 +98,40 @@ fn references_global_catalog(sql: &str) -> bool { sql.to_lowercase().contains("global.") } -/// Find the start of the top-level ` FROM ` clause (paren depth 0). -/// -/// Iterates by `char` so all indexing stays on UTF-8 boundaries (SQL may contain -/// multi-byte identifiers or string literals), and matches the keyword -/// case-insensitively on raw bytes to avoid `to_lowercase()` length skew. -fn find_top_level_from(sql: &str) -> Option { - let bytes = sql.as_bytes(); - let mut depth = 0i32; - for (i, ch) in sql.char_indices() { - match ch { - '(' => depth += 1, - ')' => depth = depth.saturating_sub(1), - _ if depth == 0 && byte_window_eq_ci(bytes, i, b" from ") => return Some(i), - _ => {} - } - } - None -} - -/// Case-insensitive comparison of `needle` against the byte window starting at `at`. -fn byte_window_eq_ci(bytes: &[u8], at: usize, needle: &[u8]) -> bool { - bytes - .get(at..at + needle.len()) - .is_some_and(|window| window.eq_ignore_ascii_case(needle)) -} - -fn select_list_includes_wildcard(sql: &str) -> bool { - match find_top_level_from(sql) { - // `from_idx` is a char boundary, so slicing the select list is panic-safe. - Some(from_idx) => sql[..from_idx].contains('*'), - None => false, - } -} - -fn federation_tags_already_expanded(lower: &str) -> bool { - FEDERATION_TAG_COLUMNS.iter().all(|col| lower.contains(col)) -} - -fn federation_tag_exclude_list() -> String { - FEDERATION_TAG_COLUMNS - .iter() - .map(|col| col.to_string()) - .collect::>() - .join(", ") -} - -fn expand_global_select_star(sql: &str) -> String { - let trimmed = sql.trim(); - let lower = trimmed.to_lowercase(); - if federation_tags_already_expanded(&lower) { - return sql.to_string(); - } - let Some(from_idx) = find_top_level_from(trimmed) else { - return sql.to_string(); +fn select_list_includes_wildcard(query: &Query) -> bool { + let SetExpr::Select(select) = query.body.as_ref() else { + return false; }; - let select_part = &trimmed[..from_idx]; - let from_part = &trimmed[from_idx..]; - if !select_part.contains('*') { - return sql.to_string(); - } + select.projection.iter().any(|item| { + matches!( + item, + SelectItem::Wildcard(_) | SelectItem::QualifiedWildcard(_, _) + ) + }) +} - let exclude = format!( - " EXCLUDE ({tags}), {tags}", - tags = federation_tag_exclude_list() - ); - let new_select = if let Some(dot_star) = select_part.rfind(".*") { - let before = &select_part[..dot_star + 2]; - let after = &select_part[dot_star + 2..]; - format!("{before}{exclude}{after}") - } else { - select_part.replacen('*', &format!("*{exclude}"), 1) - }; - format!("{new_select}{from_part}") +fn expand_global_select_star(_sql: &str) -> String { + // Federation tags are appended by `GlobalFederatedTable` / `FederatedScanExec` + // (`federated_output_schema`). DataFusion does not support `SELECT * EXCLUDE (...)`. + _sql.to_string() } /// Ensure `global.*` `SELECT *` queries expose which node each row came from. /// -/// Rewrites `SELECT *` so the logical projection always includes `_host`, -/// `_addr` and `_rank`. Explicit column lists are left unchanged. +/// Tag columns are injected at the table-provider layer; this pass intentionally +/// does not rewrite SQL (avoids breaking `count(*)` and unsupported EXCLUDE syntax). pub fn ensure_global_node_columns(sql: &str) -> String { let trimmed = sql.trim(); - let lower = trimmed.to_lowercase(); if !references_global_catalog(trimmed) { return sql.to_string(); } - if !lower.starts_with("select") { + if !trimmed.to_lowercase().starts_with("select") { return sql.to_string(); } - if select_list_includes_wildcard(trimmed) { - return expand_global_select_star(trimmed); + if let Some(query) = parse_single_query(trimmed) { + if select_list_includes_wildcard(&query) { + return expand_global_select_star(trimmed); + } } sql.to_string() } @@ -288,10 +230,15 @@ mod tests { #[test] fn ensure_global_node_columns_handles_non_ascii_without_panic() { - // Multi-byte identifiers/literals must not cause byte-boundary panics. let sql = "SELECT * FROM global.process.envs WHERE 名称 = '值'"; - let rewritten = ensure_global_node_columns(sql); - assert!(rewritten.contains("EXCLUDE")); + assert_eq!(ensure_global_node_columns(sql), sql); + } + + #[test] + fn count_star_aggregate_is_not_treated_as_select_star() { + let sql = "SELECT _rank, op, avg(duration_ms) AS avg_ms, count(*) AS n \ + FROM global.python.comm_collective GROUP BY _rank, op ORDER BY avg_ms DESC LIMIT 8"; + assert_eq!(ensure_global_node_columns(sql), sql); } #[test] @@ -307,32 +254,14 @@ mod tests { } #[test] - fn rewrites_select_star_with_exclude_and_probe_tags() { + fn select_star_global_query_is_unchanged() { let sql = "SELECT * FROM global.process.envs"; - assert_eq!( - ensure_global_node_columns(sql), - "SELECT * EXCLUDE (_host, _addr, _rank, _node_rank, _local_rank, _role), _host, _addr, _rank, _node_rank, _local_rank, _role FROM global.process.envs" - ); - } - - #[test] - fn rewrites_qualified_select_star_with_probe_tags() { - let sql = "SELECT e.* FROM global.process.envs e"; - assert_eq!( - ensure_global_node_columns(sql), - "SELECT e.* EXCLUDE (_host, _addr, _rank, _node_rank, _local_rank, _role), _host, _addr, _rank, _node_rank, _local_rank, _role FROM global.process.envs e" - ); - } - - #[test] - fn skips_select_star_wildcard_when_tags_already_present() { - let sql = "SELECT * EXCLUDE (_host, _addr, _rank, _node_rank, _local_rank, _role), _host, _addr, _rank, _node_rank, _local_rank, _role FROM global.process.envs"; assert_eq!(ensure_global_node_columns(sql), sql); } #[test] - fn skips_qualified_select_star_when_already_expanded() { - let sql = "SELECT e.* EXCLUDE (_host, _addr, _rank, _node_rank, _local_rank, _role), _host, _addr, _rank, _node_rank, _local_rank, _role FROM global.process.envs e"; + fn qualified_select_star_global_query_is_unchanged() { + let sql = "SELECT e.* FROM global.process.envs e"; assert_eq!(ensure_global_node_columns(sql), sql); } @@ -357,8 +286,9 @@ mod tests { let user = "SELECT * FROM python.comm_collective WHERE rank > 0 LIMIT 10"; let global_sql = rewrite_sql_for_global_fanout(user); let prepared = prepare_global_query(&global_sql); - assert!(prepared.contains("EXCLUDE")); - assert!(prepared.contains(PROBE_ADDR_COL)); - assert!(prepared.contains(PROBE_RANK_COL)); + assert_eq!( + prepared, + "SELECT * FROM global.python.comm_collective WHERE rank > 0 LIMIT 10" + ); } } diff --git a/probing/core/src/core/memtable_sql.rs b/probing/core/src/core/memtable_sql.rs index 73821b5f..fc59dd67 100644 --- a/probing/core/src/core/memtable_sql.rs +++ b/probing/core/src/core/memtable_sql.rs @@ -840,6 +840,41 @@ fn memh_view_to_recordbatch(view: &MemhView<'_>) -> Vec { } } +// ── Python extern mmap schema repair ────────────────────────────────── + +/// Row count for a MEMT ring mmap (0 when the file is missing or invalid). +fn mmap_ring_row_count(mapped: &MappedFile) -> usize { + MemTableView::new(mapped.as_bytes()) + .map(|view| (0..view.num_chunks()).map(|c| view.num_rows(c)).sum()) + .unwrap_or(0) +} + +/// Prefer semantic empty-table schema when a placeholder mmap used all-Str dtypes. +fn prefer_semantic_python_table( + name: &str, + mapped: MappedFile, + basename: String, +) -> Arc { + let row_count = mmap_ring_row_count(&mapped); + let provider: Arc = + if let Some(TableKind::Ring) = detect_table(mapped.as_bytes()) { + match RingMmapTable::try_new(mapped) { + Ok(ring) => Arc::new(HotColdTable::new(ring, cold_dir(), basename)), + Err(_) => Arc::new(PluginAdvancedTable::empty_sentinel(name)), + } + } else { + mapped_file_to_table(mapped, name) + }; + if row_count == 0 + && super::semantic_catalog::python_extern_schema_mismatch(name, provider.schema().as_ref()) + { + if let Some(semantic) = super::semantic_catalog::empty_python_extern_table(name) { + return semantic; + } + } + provider +} + // ── Dynamic schemas from mmap filenames ─────────────────────────────── /// One DataFusion schema combining mmap-backed tables with an optional inner @@ -894,6 +929,9 @@ impl SchemaProvider for MmapFileSchemaProvider { // is unioned with its cold MEMC segments (keyed by the unique // on-disk basename) so one query spans both tiers. if let Ok(mapped) = MappedFile::open(&path) { + if self.schema == "python" && name != "backtrace" { + return Ok(Some(prefer_semantic_python_table(name, mapped, basename))); + } if let Some(TableKind::Ring) = detect_table(mapped.as_bytes()) { return Ok(Some(match RingMmapTable::try_new(mapped) { Ok(ring) => Arc::new(HotColdTable::new(ring, cold_dir(), basename)), @@ -903,6 +941,11 @@ impl SchemaProvider for MmapFileSchemaProvider { return Ok(Some(mapped_file_to_table(mapped, name))); } } + if self.schema == "python" && name != "backtrace" { + if let Some(table) = super::semantic_catalog::empty_python_extern_table(name) { + return Ok(Some(table)); + } + } match &self.inner { Some(inner) => inner.table(name).await, None => Ok(None), @@ -933,6 +976,7 @@ impl SchemaProvider for MmapFileSchemaProvider { fn table_exist(&self, name: &str) -> bool { mmap_table_exists(&self.schema, name) + || (self.schema == "python" && super::semantic_catalog::known_python_extern_table(name)) || self .inner .as_ref() @@ -1107,13 +1151,7 @@ pub struct ColdCompactor { fn lock_compactor_handle( m: &Mutex>>, ) -> MutexGuard<'_, Option>> { - match m.lock() { - Ok(guard) => guard, - Err(e) => { - log::debug!("ColdCompactor handle mutex poisoned; recovering"); - e.into_inner() - } - } + crate::sync::lock_mutex(m, "ColdCompactor handle") } impl ColdCompactor { diff --git a/probing/core/src/core/semantic_catalog.rs b/probing/core/src/core/semantic_catalog.rs index a5c4e26f..6967bceb 100644 --- a/probing/core/src/core/semantic_catalog.rs +++ b/probing/core/src/core/semantic_catalog.rs @@ -17,6 +17,8 @@ use datafusion::catalog::{ use datafusion::error::{DataFusionError, Result}; use datafusion::prelude::SessionContext; use probing_memtable::docs; +use probing_memtable::infer_extern_column_dtype; +use probing_memtable::DType; use serde::Deserialize; use super::plugin_advanced::PluginAdvancedTable; @@ -194,6 +196,100 @@ pub fn build_semantic_catalog() -> Result { }) } +use std::sync::LazyLock; + +use datafusion::catalog::TableProvider; + +static SEMANTIC_COLUMN_INDEX: LazyLock>> = + LazyLock::new(|| { + let yaml = parse_semantic_catalog_yaml(TABLES_YAML) + .expect("skills/semantic/tables.yaml must parse"); + let mut map: HashMap<(String, String), Vec> = HashMap::new(); + for row in yaml.column_rows { + map.entry((row.table_schema, row.table_name)) + .or_default() + .push(row.column_name); + } + for cols in map.values_mut() { + cols.sort(); + cols.dedup(); + } + map + }); + +/// Merge YAML `key_columns` with runtime [`docs`] registry (e.g. Python `@table`). +fn python_extern_table_column_names(table_name: &str) -> Option> { + let mut cols = SEMANTIC_COLUMN_INDEX + .get(&("python".into(), table_name.into())) + .cloned() + .unwrap_or_default(); + for col in docs::registered_column_names("python", table_name) { + if !cols.iter().any(|c| c == &col) { + cols.push(col); + } + } + if cols.is_empty() { + None + } else { + cols.sort(); + cols.dedup(); + Some(cols) + } +} + +/// Whether `python.` is a documented extern mmap table (not live `backtrace`). +pub fn known_python_extern_table(table_name: &str) -> bool { + table_name != "backtrace" && python_extern_table_column_names(table_name).is_some() +} + +/// Infer Arrow type for a documented `python.*` extern column (mmap placeholder or empty table). +pub fn infer_python_extern_arrow_dtype(name: &str) -> DataType { + match infer_extern_column_dtype(name) { + DType::I64 | DType::I32 | DType::U32 | DType::U64 => DataType::Int64, + DType::F64 | DType::F32 => DataType::Float64, + DType::U8 => DataType::UInt8, + DType::Str | DType::Bytes => DataType::Utf8, + } +} + +/// True when an on-disk mmap schema disagrees with the semantic catalog for known columns. +pub fn python_extern_schema_mismatch(table_name: &str, actual: &Schema) -> bool { + let Some(expected) = empty_python_extern_table(table_name) else { + return false; + }; + for field in expected.schema().fields() { + let Ok(actual_field) = actual.field_with_name(field.name()) else { + continue; + }; + if actual_field.data_type() != field.data_type() { + return true; + } + } + false +} + +fn infer_semantic_column_type(name: &str) -> DataType { + infer_python_extern_arrow_dtype(name) +} + +/// Zero-row table with schema from the semantic catalog (avoids Python import fallback). +pub fn empty_python_extern_table(table_name: &str) -> Option> { + let cols = python_extern_table_column_names(table_name)?; + let mut fields = vec![Field::new("timestamp", DataType::Int64, true)]; + for col in &cols { + fields.push(Field::new( + col.as_str(), + infer_semantic_column_type(col), + true, + )); + } + let schema = Arc::new(Schema::new(fields)); + let label = format!("python.{table_name}"); + PluginAdvancedTable::try_new(label, schema, vec![]) + .ok() + .map(|t| Arc::new(t) as Arc) +} + fn table_docs_schema() -> SchemaRef { Arc::new(Schema::new(vec![ Field::new("table_schema", DataType::Utf8, false), @@ -409,6 +505,71 @@ mod tests { assert!(row.description.contains("Culprit")); } + #[test] + fn empty_python_extern_table_has_comm_collective_columns() { + let table = empty_python_extern_table("comm_collective").expect("comm_collective schema"); + assert!(table.schema().field_with_name("rank").is_ok()); + assert!(table.schema().field_with_name("duration_ms").is_ok()); + assert!(table.schema().field_with_name("op").is_ok()); + assert_eq!( + table + .schema() + .field_with_name("duration_ms") + .unwrap() + .data_type(), + &DataType::Float64 + ); + } + + #[test] + fn python_extern_schema_mismatch_detects_str_duration_ms() { + use arrow::datatypes::{Field, Schema}; + let wrong = Schema::new(vec![ + Field::new("timestamp", DataType::Int64, true), + Field::new("duration_ms", DataType::Utf8, true), + Field::new("op", DataType::Utf8, true), + ]); + assert!(python_extern_schema_mismatch("comm_collective", &wrong)); + let right = empty_python_extern_table("comm_collective") + .expect("comm_collective") + .schema() + .as_ref() + .clone(); + assert!(!python_extern_schema_mismatch("comm_collective", &right)); + } + + #[test] + fn empty_python_extern_table_from_docs_registry_only() { + let table = format!("registry_only_{}", std::process::id()); + docs::register_column_docs( + "python", + &table, + Some("custom @table"), + &[ + ("custom_id".to_string(), "primary id".to_string()), + ("payload".to_string(), "json blob".to_string()), + ], + ); + let provider = empty_python_extern_table(&table).expect("registry-only schema"); + assert!(known_python_extern_table(&table)); + assert!(provider.schema().field_with_name("timestamp").is_ok()); + assert!(provider.schema().field_with_name("custom_id").is_ok()); + assert!(provider.schema().field_with_name("payload").is_ok()); + } + + #[test] + fn empty_python_extern_table_merges_yaml_and_docs_columns() { + docs::register_column_docs( + "python", + "torch_trace", + None, + &[("extra_metric".to_string(), "runtime-only col".to_string())], + ); + let provider = empty_python_extern_table("torch_trace").expect("torch_trace schema"); + assert!(provider.schema().field_with_name("module").is_ok()); + assert!(provider.schema().field_with_name("extra_metric").is_ok()); + } + #[test] fn build_catalog_yaml_only_python_table_still_present() { let parsed = build_semantic_catalog().unwrap(); diff --git a/probing/core/src/lib.rs b/probing/core/src/lib.rs index 0dd78479..2753c8c0 100644 --- a/probing/core/src/lib.rs +++ b/probing/core/src/lib.rs @@ -5,7 +5,9 @@ pub mod core; pub mod diagnostics; pub mod runtime; pub mod storage; +pub mod sync; pub mod trace; +mod tracing; pub use diagnostics::install_panic_hook; pub use runtime::{ diff --git a/probing/core/src/runtime.rs b/probing/core/src/runtime.rs index a409109c..0c40afd5 100644 --- a/probing/core/src/runtime.rs +++ b/probing/core/src/runtime.rs @@ -1,27 +1,46 @@ use std::cell::Cell; use std::future::Future; -use std::sync::{mpsc, OnceLock}; +use std::sync::{mpsc, Arc, Mutex, OnceLock}; use std::thread::{self, ThreadId}; use log; use once_cell::sync::Lazy; -/// Shared Tokio runtime for all sync→async bridges (Python bindings, local server, etc.). -/// -/// ENGINE and CONFIG_STORE must only be accessed from this runtime. Creating ad-hoc -/// runtimes (especially when Python already has an asyncio loop) can cause SIGSEGV. -pub static CORE_RUNTIME: Lazy = Lazy::new(|| { +fn build_core_runtime() -> tokio::runtime::Runtime { let worker_threads = std::env::var("PROBING_SERVER_WORKER_THREADS") .unwrap_or_else(|_| "4".to_string()) .parse::() .unwrap_or(4); - tokio::runtime::Builder::new_multi_thread() + match tokio::runtime::Builder::new_multi_thread() .enable_all() .worker_threads(worker_threads) .thread_name("probing-runtime") .build() - .unwrap_or_else(|e| panic!("Failed to create probing runtime: {e}")) -}); + { + Ok(rt) => rt, + Err(e) => { + log::error!("Failed to create probing multi-thread runtime: {e}; trying current-thread fallback"); + tokio::runtime::Builder::new_current_thread() + .enable_all() + .thread_name("probing-runtime") + .build() + .unwrap_or_else(|e2| { + log::error!( + "Failed to create probing fallback runtime: {e2}; using minimal runtime" + ); + tokio::runtime::Builder::new_current_thread() + .build() + .expect("unable to create minimal tokio runtime") + }) + } + } +} + +/// Shared Tokio runtime for all sync→async bridges (Python bindings, local server, etc.). +/// +/// ENGINE and CONFIG_STORE must only be accessed from this runtime. Creating ad-hoc +/// runtimes (especially when Python already has an asyncio loop) can cause SIGSEGV. +pub static CORE_RUNTIME: Lazy = Lazy::new(build_core_runtime); /// Python main thread id, registered when `probing._core` loads. static PYTHON_MAIN_THREAD: OnceLock = OnceLock::new(); @@ -42,23 +61,69 @@ fn is_inside_core_runtime() -> bool { tokio::runtime::Handle::try_current().is_ok() } +fn block_on_ephemeral(future: F) -> T +where + F: Future, +{ + match tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + { + Ok(rt) => rt.block_on(future), + Err(e) => { + log::error!("failed to create ephemeral block_on runtime: {e}; using futures executor"); + futures::executor::block_on(future) + } + } +} + +fn recover_block_on_from_cell(future_cell: &Arc>>) -> T +where + F: Future, +{ + let fut = future_cell + .lock() + .ok() + .and_then(|mut guard| guard.take()) + .expect("block_on future missing"); + block_on_ephemeral(fut) +} + fn spawn_block_on_thread(future: F) -> T where F: Future + Send + 'static, T: Send + 'static, { - thread::Builder::new() + let future_cell = Arc::new(Mutex::new(Some(future))); + let worker_cell = Arc::clone(&future_cell); + match thread::Builder::new() .name("probing-block-on".into()) - .spawn(move || CORE_RUNTIME.block_on(future)) - .expect("failed to spawn block_on thread") - .join() - .expect("block_on thread panicked") + .spawn(move || { + let fut = worker_cell + .lock() + .ok() + .and_then(|mut guard| guard.take()) + .expect("block_on future missing"); + CORE_RUNTIME.block_on(fut) + }) { + Ok(handle) => match handle.join() { + Ok(v) => v, + Err(_) => { + log::error!("block_on thread panicked; using ephemeral runtime"); + recover_block_on_from_cell(&future_cell) + } + }, + Err(e) => { + log::error!("failed to spawn block_on thread: {e}; using ephemeral runtime"); + recover_block_on_from_cell(&future_cell) + } + } } /// Single worker for Python↔Rust calls that must not run on the Python main thread /// (macOS/PyArrow) or on Tokio workers (nested Python callbacks). struct NativeBridge { - tx: mpsc::Sender, + tx: Option>, } struct BridgeJob { @@ -69,7 +134,7 @@ struct BridgeJob { impl NativeBridge { fn new() -> Self { let (tx, rx) = mpsc::channel::(); - thread::Builder::new() + match thread::Builder::new() .name("probing-native".into()) .spawn(move || { while let Ok(job) = rx.recv() { @@ -81,29 +146,58 @@ impl NativeBridge { } let _ = job.done.send(()); } - }) - .expect("failed to spawn probing-native bridge"); - Self { tx } + }) { + Ok(_) => Self { tx: Some(tx) }, + Err(e) => { + log::error!("failed to spawn probing-native bridge: {e}; using direct calls"); + Self { tx: None } + } + } } fn call(&self, f: impl FnOnce() -> R + Send + 'static) -> R { + let Some(tx) = &self.tx else { + return f(); + }; let (result_tx, result_rx) = mpsc::channel(); let (done_tx, done_rx) = mpsc::channel(); - self.tx + let func_cell = Arc::new(Mutex::new(Some(f))); + let worker_cell = Arc::clone(&func_cell); + if tx .send(BridgeJob { func: Box::new(move || { - let r = f(); + let r = worker_cell + .lock() + .ok() + .and_then(|mut guard| guard.take()) + .expect("bridge func missing")(); let _ = result_tx.send(r); }), done: done_tx, }) - .expect("probing-native bridge thread exited"); - done_rx - .recv() - .expect("probing-native bridge worker dropped completion"); - result_rx - .recv() - .expect("probing-native bridge worker returned no value") + .is_err() + { + log::error!("probing-native bridge thread exited; using direct call"); + return func_cell + .lock() + .ok() + .and_then(|mut guard| guard.take()) + .expect("bridge func missing")(); + } + if done_rx.recv().is_err() { + log::error!("probing-native bridge worker dropped completion"); + } + match result_rx.recv() { + Ok(r) => r, + Err(_) => { + log::error!("probing-native bridge worker returned no value; using direct call"); + func_cell + .lock() + .ok() + .and_then(|mut guard| guard.take()) + .expect("bridge func missing")() + } + } } } diff --git a/probing/core/src/storage/topology.rs b/probing/core/src/storage/topology.rs index c8752d24..bb01cd2f 100644 --- a/probing/core/src/storage/topology.rs +++ b/probing/core/src/storage/topology.rs @@ -20,13 +20,13 @@ pub struct TopologyView { impl TopologyView { /// 创建新的拓扑视图 pub fn new(workers_per_node: HashMap>, estimated_total: usize) -> Self { - let now = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap_or_else(|e| { + let now = SystemTime::now().duration_since(UNIX_EPOCH).map_or_else( + |e| { log::error!("System time error: {e}"); - panic!("System time is before UNIX epoch: {e}") - }) - .as_secs(); + 0 + }, + |d| d.as_secs(), + ); Self { version: now, @@ -54,13 +54,13 @@ impl TopologyView { ) -> Self { Self { version, - timestamp: SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap_or_else(|e| { + timestamp: SystemTime::now().duration_since(UNIX_EPOCH).map_or_else( + |e| { log::error!("System time error: {e}"); - panic!("System time is before UNIX epoch: {e}") - }) - .as_secs(), + 0 + }, + |d| d.as_secs(), + ), workers_per_node, estimated_total_nodes: estimated_total, } @@ -79,13 +79,13 @@ impl TopologyView { /// 检查拓扑视图是否新鲜(未过期) pub fn is_fresh(&self, ttl_seconds: u64) -> bool { - let now = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap_or_else(|e| { + let now = SystemTime::now().duration_since(UNIX_EPOCH).map_or_else( + |e| { log::error!("System time error: {e}"); - panic!("System time is before UNIX epoch: {e}") - }) - .as_secs(); + 0 + }, + |d| d.as_secs(), + ); now - self.timestamp <= ttl_seconds } @@ -132,13 +132,13 @@ impl TopologyView { /// 更新拓扑视图的时间戳 pub fn refresh_timestamp(&mut self) { - self.timestamp = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap_or_else(|e| { + self.timestamp = SystemTime::now().duration_since(UNIX_EPOCH).map_or_else( + |e| { log::error!("System time error: {e}"); - panic!("System time is before UNIX epoch: {e}") - }) - .as_secs(); + 0 + }, + |d| d.as_secs(), + ); } /// 合并另一个拓扑视图 diff --git a/probing/core/src/sync.rs b/probing/core/src/sync.rs new file mode 100644 index 00000000..004041bd --- /dev/null +++ b/probing/core/src/sync.rs @@ -0,0 +1,31 @@ +use std::sync::{Mutex, MutexGuard, RwLock, RwLockReadGuard, RwLockWriteGuard}; + +pub fn lock_mutex<'a, T>(m: &'a Mutex, label: &str) -> MutexGuard<'a, T> { + match m.lock() { + Ok(guard) => guard, + Err(e) => { + log::warn!("{label} mutex poisoned; recovering"); + e.into_inner() + } + } +} + +pub fn read_rwlock<'a, T>(rw: &'a RwLock, label: &str) -> RwLockReadGuard<'a, T> { + match rw.read() { + Ok(guard) => guard, + Err(e) => { + log::warn!("{label} RwLock poisoned; recovering"); + e.into_inner() + } + } +} + +pub fn write_rwlock<'a, T>(rw: &'a RwLock, label: &str) -> RwLockWriteGuard<'a, T> { + match rw.write() { + Ok(guard) => guard, + Err(e) => { + log::warn!("{label} RwLock poisoned; recovering"); + e.into_inner() + } + } +} diff --git a/probing/core/src/tracing.rs b/probing/core/src/tracing.rs index 5f55fa8c..e25c9523 100644 --- a/probing/core/src/tracing.rs +++ b/probing/core/src/tracing.rs @@ -1,3 +1,7 @@ +// Thread-local span tracing infrastructure. Not wired into production paths yet; +// GLOBAL_TRACER is reserved for future distributed trace aggregation. +#![allow(dead_code)] + use once_cell::sync::Lazy; use std::collections::HashMap; use std::sync::atomic::{AtomicU16, Ordering}; // For unique tracer ID generation @@ -67,20 +71,15 @@ pub struct Event { } // --- Span Status --- -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq, Default)] pub enum SpanStatus { - Running, // This span is the currently active one on its thread. + #[default] + Running, // This span is the currently active one on its thread. Open, // This span is active, but one of its children is currently Running. Close, // This span has completed successfully. Error(Option), // This span has completed with an error. } -impl Default for SpanStatus { - fn default() -> Self { - SpanStatus::Running - } -} - #[derive(Debug, Clone)] pub struct Span { // --- Identity & Relationship --- @@ -151,27 +150,38 @@ impl LocalSpanManager { self.next_span_seq = self.next_span_seq.wrapping_add(1); let span_id = SpanId(current_span_sequence); - let (trace_id_to_use, parent_span_id_to_store) = - if let Some(active_parent_span_id) = self.span_stack.last() { - let parent_span = self - .spans - .get_mut(active_parent_span_id) - .expect("Invariant violated: Active parent span not found in spans."); - - if parent_span.status == SpanStatus::Running { - parent_span.status = SpanStatus::Open; + let (trace_id_to_use, parent_span_id_to_store) = if let Some(active_parent_span_id) = + self.span_stack.last().copied() + { + match self.spans.get_mut(&active_parent_span_id) { + Some(parent_span) => { + if parent_span.status == SpanStatus::Running { + parent_span.status = SpanStatus::Open; + } + (parent_span.trace_id, Some(active_parent_span_id)) } + None => { + log::warn!( + "start_span: active parent {:?} missing from spans map; treating as new root", + active_parent_span_id + ); + self.span_stack.pop(); + let current_trace_sequence = self.next_trace_seq; + self.next_trace_seq = self.next_trace_seq.wrapping_add(1); + let new_trace_id_val = ((self.tracer_id as u128) << TRACE_ID_PREFIX_SHIFT) + | (current_trace_sequence as u128 & MAX_TRACE_SEQ); + (TraceId(new_trace_id_val), None) + } + } + } else { + // No active parent span, so this is the start of a new trace. + let current_trace_sequence = self.next_trace_seq; + self.next_trace_seq = self.next_trace_seq.wrapping_add(1); - (parent_span.trace_id, Some(*active_parent_span_id)) - } else { - // No active parent span, so this is the start of a new trace. - let current_trace_sequence = self.next_trace_seq; - self.next_trace_seq = self.next_trace_seq.wrapping_add(1); - - let new_trace_id_val = ((self.tracer_id as u128) << TRACE_ID_PREFIX_SHIFT) - | (current_trace_sequence as u128 & MAX_TRACE_SEQ); - (TraceId(new_trace_id_val), None) - }; + let new_trace_id_val = ((self.tracer_id as u128) << TRACE_ID_PREFIX_SHIFT) + | (current_trace_sequence as u128 & MAX_TRACE_SEQ); + (TraceId(new_trace_id_val), None) + }; let location = location.map(|loc_val| Location::UnknownLocation(loc_val.into())); @@ -308,7 +318,7 @@ impl GlobalSpanManager { fn register_tracer(&self, thread_id: ThreadId, tracer: Weak>) { match self.local_tracers.lock() { Ok(mut tracers) => { - GlobalSpanManager::cleanup_locked_tracers(&mut *tracers); + GlobalSpanManager::cleanup_locked_tracers(&mut tracers); tracers.insert(thread_id, tracer); } Err(e) => { @@ -325,7 +335,7 @@ impl GlobalSpanManager { pub fn all_thread_spans(&self) -> HashMap> { let weak_tracers_to_process = match self.local_tracers.lock() { Ok(mut tracers_map) => { - GlobalSpanManager::cleanup_locked_tracers(&mut *tracers_map); + GlobalSpanManager::cleanup_locked_tracers(&mut tracers_map); tracers_map.clone() } Err(e) => { @@ -338,7 +348,7 @@ impl GlobalSpanManager { for (tid, weak_tracer) in weak_tracers_to_process { if let Some(tracer_arc) = weak_tracer.upgrade() { // Lock individual LocalTracer; this lock is fine as it's per-tracer. - let tracer_lock = tracer_arc.read().unwrap(); + let tracer_lock = read_tracer(&tracer_arc); result.insert(tid, tracer_lock.active_spans()); // active_spans() involves cloning } } @@ -348,7 +358,7 @@ impl GlobalSpanManager { pub fn thread_spans(&self, thread_id: ThreadId) -> Option> { let weak_tracer_option = match self.local_tracers.lock() { Ok(mut tracers_map) => { - GlobalSpanManager::cleanup_locked_tracers(&mut *tracers_map); + GlobalSpanManager::cleanup_locked_tracers(&mut tracers_map); tracers_map.get(&thread_id).cloned() } Err(e) => { @@ -361,7 +371,7 @@ impl GlobalSpanManager { .and_then(|weak_tracer| weak_tracer.upgrade()) .map(|tracer_arc| { // Lock individual LocalTracer. - let tracer_lock = tracer_arc.read().unwrap(); + let tracer_lock = read_tracer(&tracer_arc); tracer_lock.active_spans() // active_spans() involves cloning }) } @@ -369,10 +379,21 @@ impl GlobalSpanManager { pub static GLOBAL_TRACER: Lazy = Lazy::new(GlobalSpanManager::new); +fn read_tracer( + tracer: &RwLock, +) -> std::sync::RwLockReadGuard<'_, LocalSpanManager> { + match tracer.read() { + Ok(guard) => guard, + Err(e) => { + log::warn!("LocalSpanManager RwLock poisoned; recovering"); + e.into_inner() + } + } +} + #[cfg(test)] mod tests { use super::*; - use std::thread; use std::time::Duration as StdDuration; // Renamed to avoid conflict with super::Duration fn setup_tracer() -> LocalSpanManager { @@ -388,6 +409,24 @@ mod tests { // --- 1. Basic Span Functionality --- + #[test] + fn test_start_span_missing_parent_degrades_to_root() { + let mut tracer = setup_tracer(); + let ghost_parent = SpanId(999); + tracer.span_stack.push(ghost_parent); + + let (span_id, trace_id) = tracer.start_span("orphan_child", None, None, None); + + assert_eq!(tracer.span_stack.len(), 1); + assert_eq!(tracer.active_id(), Some(span_id)); + let span = tracer.spans.get(&span_id).unwrap(); + assert_eq!(span.parent_span_id, None, "missing parent → new root"); + assert_eq!( + trace_id.0, + (tracer.tracer_id as u128) << TRACE_ID_PREFIX_SHIFT + ); + } + #[test] fn test_start_root_span_example() { // Example: Starting a new trace with a root span. @@ -431,8 +470,7 @@ mod tests { } // Verify TraceId incorporates the tracer's ID and the trace sequence number (0 for the first trace) - let expected_trace_id_val = - ((tracer_id_for_assertion as u128) << TRACE_ID_PREFIX_SHIFT) | 0; + let expected_trace_id_val = (tracer_id_for_assertion as u128) << TRACE_ID_PREFIX_SHIFT; assert_eq!( trace_id.0, expected_trace_id_val, "Trace ID mismatch for root span" @@ -601,7 +639,7 @@ mod tests { let (_, trace_id1) = tracer.start_span("span1", None, None, None); assert_eq!( trace_id1.0, - (tracer_id_val << TRACE_ID_PREFIX_SHIFT) | 0, + tracer_id_val << TRACE_ID_PREFIX_SHIFT, "Trace ID for first trace" ); tracer.end_span(SpanStatus::Close); @@ -616,13 +654,13 @@ mod tests { tracer.end_span(SpanStatus::Close); // Force next_trace_seq to max value - tracer.next_trace_seq = u64::MAX-1; + tracer.next_trace_seq = u64::MAX - 1; let (_, trace_id_before_wrap) = tracer.start_span("span_before_u64_wrap", None, None, None); // The sequence part of trace_id is (self.next_trace_seq as u128 & MAX_TRACE_SEQ) assert_eq!( trace_id_before_wrap.0, - (tracer_id_val << TRACE_ID_PREFIX_SHIFT) | ((u64::MAX-1) as u128 & MAX_TRACE_SEQ), + (tracer_id_val << TRACE_ID_PREFIX_SHIFT) | ((u64::MAX - 1) as u128 & MAX_TRACE_SEQ), "Trace ID before u64 wrap" ); tracer.end_span(SpanStatus::Close); @@ -639,7 +677,7 @@ mod tests { let (_, trace_id_after_wrap) = tracer.start_span("span_after_u64_wrap", None, None, None); assert_eq!( trace_id_after_wrap.0, - (tracer_id_val << TRACE_ID_PREFIX_SHIFT) | (0u128 & MAX_TRACE_SEQ), + tracer_id_val << TRACE_ID_PREFIX_SHIFT, "Trace ID after u64 wrap" ); tracer.end_span(SpanStatus::Close); diff --git a/probing/crates/store/src/store/tcpstore.rs b/probing/crates/store/src/store/tcpstore.rs index 3d280e78..fe00331f 100644 --- a/probing/crates/store/src/store/tcpstore.rs +++ b/probing/crates/store/src/store/tcpstore.rs @@ -68,6 +68,12 @@ impl TCPStore { self } + /// Set key prefix sent before each key (PyTorch rendezvous store uses ``""``). + pub fn with_key_prefix(mut self, prefix: impl Into) -> Self { + self.keyprefix = prefix.into(); + self + } + /// Connect to the target server async fn connect(&self) -> Result { let connect_future = TcpStream::connect(&self.endpoint); diff --git a/probing/extensions/cc/src/extensions/cpu/collector.rs b/probing/extensions/cc/src/extensions/cpu/collector.rs index ee599c79..9c0bde04 100644 --- a/probing/extensions/cc/src/extensions/cpu/collector.rs +++ b/probing/extensions/cc/src/extensions/cpu/collector.rs @@ -1,12 +1,13 @@ use std::collections::HashMap; use std::sync::{ atomic::{AtomicBool, Ordering}, - Arc, Mutex, + Arc, Mutex, MutexGuard, }; use std::thread::{self, JoinHandle}; use std::time::{Duration, Instant}; use once_cell::sync::Lazy; +use probing_core::sync::lock_mutex; use probing_memtable::discover::ExposedTable; use probing_memtable::{DType, Schema, Value}; use thiserror::Error; @@ -192,7 +193,7 @@ fn push_utilization_row( wchan: &str, ) { let delta_total = delta_user_ns.saturating_add(delta_sys_ns); - table.push_row(&[ + if !table.push_row(&[ Value::I64(ts), Value::Str(scope), Value::Str(platform), @@ -213,7 +214,9 @@ fn push_utilization_row( Value::I64(delta_invol_ctxt), Value::Str(state), Value::Str(wchan), - ]); + ]) { + log::warn!("cpu collector: push_row failed for cpu.processes"); + } } fn push_tasks_row( @@ -228,7 +231,7 @@ fn push_tasks_row( let state = thread.state.as_deref().unwrap_or(""); let wchan = thread.wchan.as_deref().unwrap_or(""); let delta_total = delta_user_ns.saturating_add(delta_sys_ns); - table.push_row(&[ + if !table.push_row(&[ Value::I64(ts), Value::Str(platform), Value::I32(thread.tid), @@ -239,7 +242,9 @@ fn push_tasks_row( Value::I64(delta_user_ns as i64), Value::I64(delta_sys_ns as i64), Value::I64(delta_total as i64), - ]); + ]) { + log::warn!("cpu collector: push_row failed for cpu.tasks"); + } } pub struct CpuCollector { @@ -248,6 +253,14 @@ pub struct CpuCollector { tables: Mutex>>, } +fn lock_cpu_table(m: &Mutex) -> MutexGuard<'_, ExposedTable> { + lock_mutex(m, "cpu memtable") +} + +fn lock_cpu_collector(m: &Mutex) -> MutexGuard<'_, T> { + lock_mutex(m, "cpu collector") +} + struct CollectorTables { utilization: Mutex, tasks: Mutex, @@ -283,7 +296,7 @@ impl CpuCollector { } fn shared_tables(&self) -> Result, std::io::Error> { - let mut guard = self.tables.lock().unwrap(); + let mut guard = lock_cpu_collector(&self.tables); if guard.is_none() { *guard = Some(Arc::new(CollectorTables::open()?)); } @@ -292,11 +305,12 @@ impl CpuCollector { #[cfg_attr(not(test), allow(dead_code))] pub fn utilization_row_count(&self) -> usize { - let tables = match self.tables.lock().unwrap().as_ref() { + let guard = lock_cpu_collector(&self.tables); + let tables = match guard.as_ref() { Some(t) => Arc::clone(t), None => return 0, }; - let table = tables.utilization.lock().unwrap(); + let table = lock_cpu_table(&tables.utilization); let view = table.view(); (0..view.num_chunks()).map(|c| view.num_rows(c)).sum() } @@ -341,7 +355,7 @@ impl CpuCollector { let delta_invol = curr.invol_ctxt.saturating_sub(prev.invol_ctxt) as i64; push_utilization_row( - &mut tables.utilization.lock().unwrap(), + &mut lock_cpu_table(&tables.utilization), ts, &platform, "process", @@ -379,7 +393,7 @@ impl CpuCollector { .saturating_sub(prev.map(|p| p.cputime_sys_ns).unwrap_or(0)); push_utilization_row( - &mut tables.utilization.lock().unwrap(), + &mut lock_cpu_table(&tables.utilization), ts, &platform, "thread", @@ -398,7 +412,7 @@ impl CpuCollector { thread.wchan.as_deref().unwrap_or(""), ); push_tasks_row( - &mut tables.tasks.lock().unwrap(), + &mut lock_cpu_table(&tables.tasks), ts, &platform, thread, @@ -420,7 +434,7 @@ impl CpuCollector { running.store(false, Ordering::SeqCst); }); - *self.handle.lock().unwrap() = Some(handle); + *lock_cpu_collector(&self.handle) = Some(handle); Ok(()) } @@ -430,7 +444,7 @@ impl CpuCollector { return Ok(()); } - if let Some(handle) = self.handle.lock().unwrap().take() { + if let Some(handle) = lock_cpu_collector(&self.handle).take() { handle .join() .map_err(|_| CollectorError::StopFailed("thread join failed".into()))?; @@ -443,9 +457,13 @@ impl CpuCollector { #[cfg(test)] mod tests { use super::*; + use std::sync::Mutex; + + static ENV_TEST_LOCK: Mutex<()> = Mutex::new(()); #[test] fn autostart_defaults_to_one_second() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); std::env::remove_var("PROBING_CPU"); std::env::remove_var("PROBING_CPU_SAMPLE_MS"); assert_eq!(autostart_interval_ms(), Some(1000)); @@ -453,6 +471,7 @@ mod tests { #[test] fn autostart_respects_disable_env() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); std::env::set_var("PROBING_CPU", "off"); assert_eq!(autostart_interval_ms(), None); std::env::remove_var("PROBING_CPU"); @@ -460,6 +479,7 @@ mod tests { #[test] fn autostart_creates_cpu_memtable_files() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); use probing_memtable::discover::default_dir; let dir = std::env::temp_dir().join(format!( @@ -491,6 +511,7 @@ mod tests { #[test] fn collector_writes_bounded_utilization_rows() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); let collector = CpuCollector::instance(); let _ = collector.stop(); diff --git a/probing/extensions/gpu/src/extensions/collector.rs b/probing/extensions/gpu/src/extensions/collector.rs index 790de4d2..855f1e3e 100644 --- a/probing/extensions/gpu/src/extensions/collector.rs +++ b/probing/extensions/gpu/src/extensions/collector.rs @@ -1,11 +1,12 @@ use std::sync::{ atomic::{AtomicBool, Ordering}, - Arc, Mutex, + Arc, Mutex, MutexGuard, }; use std::thread::{self, JoinHandle}; use std::time::{Duration, Instant}; use once_cell::sync::Lazy; +use probing_core::sync::lock_mutex; use probing_memtable::discover::ExposedTable; use probing_memtable::{DType, Schema, Value}; use thiserror::Error; @@ -141,7 +142,7 @@ fn ts_micros() -> i64 { fn push_utilization_row(table: &mut ExposedTable, ts: i64, wall_ns: u64, sample: &GpuMemorySample) { let used = sample.used_bytes(); - table.push_row(&[ + if !table.push_row(&[ Value::I64(ts), Value::Str(sample.backend.as_str()), Value::I32(sample.ordinal), @@ -158,7 +159,9 @@ fn push_utilization_row(table: &mut ExposedTable, ts: i64, wall_ns: u64, sample: Value::F32(opt_f32(sample.tiler_util_pct)), Value::I64(sample.driver_mem_bytes.unwrap_or(0) as i64), Value::I64(wall_ns as i64), - ]); + ]) { + log::warn!("gpu collector: push_row failed for gpu.utilization"); + } } fn opt_f32(v: Option) -> f32 { @@ -197,6 +200,14 @@ fn sample_all(backends: &[Box]) -> Vec { samples } +fn lock_gpu_table(m: &Mutex) -> MutexGuard<'_, ExposedTable> { + lock_mutex(m, "gpu memtable") +} + +fn lock_gpu_collector(m: &Mutex) -> MutexGuard<'_, T> { + lock_mutex(m, "gpu collector") +} + pub struct GpuCollector { running: Arc, handle: Mutex>>, @@ -214,7 +225,7 @@ impl GpuCollector { } fn shared_table(&self) -> Result>, std::io::Error> { - let mut guard = self.table.lock().unwrap(); + let mut guard = lock_gpu_collector(&self.table); if guard.is_none() { *guard = Some(Arc::new(Mutex::new(ExposedTable::create( "gpu.utilization", @@ -256,10 +267,9 @@ impl GpuCollector { let samples = sample_all(&backends); let wall_ns = wall_start.elapsed().as_nanos() as u64; - if let Ok(mut exposed) = table.lock() { - for sample in &samples { - push_utilization_row(&mut exposed, ts, wall_ns, sample); - } + let mut exposed = lock_gpu_table(&table); + for sample in &samples { + push_utilization_row(&mut exposed, ts, wall_ns, sample); } thread::sleep(config.interval); @@ -267,7 +277,7 @@ impl GpuCollector { running.store(false, Ordering::SeqCst); }); - *self.handle.lock().unwrap() = Some(handle); + *lock_gpu_collector(&self.handle) = Some(handle); Ok(()) } } @@ -283,6 +293,9 @@ pub fn cached_devices() -> Vec { #[cfg(test)] mod tests { use super::*; + use std::sync::Mutex; + + static ENV_TEST_LOCK: Mutex<()> = Mutex::new(()); fn clear_gpu_env() { std::env::remove_var("PROBING_GPU"); @@ -291,6 +304,7 @@ mod tests { #[test] fn autostart_respects_explicit_off() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); clear_gpu_env(); std::env::set_var("PROBING_GPU", "off"); assert!(autostart_interval_ms().is_none()); @@ -299,6 +313,7 @@ mod tests { #[test] fn autostart_force_on_without_backend_probe() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); clear_gpu_env(); std::env::set_var("PROBING_GPU", "on"); assert_eq!(autostart_interval_ms(), Some(DEFAULT_SAMPLE_INTERVAL_MS)); @@ -307,6 +322,7 @@ mod tests { #[test] fn autostart_honors_sample_ms_override() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); clear_gpu_env(); std::env::set_var("PROBING_GPU_SAMPLE_MS", "250"); assert_eq!(autostart_interval_ms(), Some(250)); @@ -316,6 +332,7 @@ mod tests { #[test] #[cfg(target_os = "macos")] fn autostart_auto_when_backend_present() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); clear_gpu_env(); if discover_backends().is_empty() { return; @@ -327,6 +344,7 @@ mod tests { #[test] #[cfg(all(not(target_os = "macos"), not(feature = "cuda")))] fn autostart_auto_off_without_backend() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); clear_gpu_env(); assert!(autostart_interval_ms().is_none()); } diff --git a/probing/extensions/nccl-profiler/src/role.rs b/probing/extensions/nccl-profiler/src/role.rs index b5bfd38a..42698a7d 100644 --- a/probing/extensions/nccl-profiler/src/role.rs +++ b/probing/extensions/nccl-profiler/src/role.rs @@ -31,9 +31,13 @@ pub fn snapshot() -> RoleRanks { #[cfg(test)] mod tests { use super::snapshot; + use std::sync::Mutex; + + static ENV_TEST_LOCK: Mutex<()> = Mutex::new(()); #[test] fn default_role_ranks_are_negative() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); for key in [ "TENSOR_MODEL_PARALLEL_RANK", "TP_RANK", @@ -55,6 +59,7 @@ mod tests { #[test] fn snapshot_reads_tp_rank_env() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); std::env::set_var("TP_RANK", "3"); let r = snapshot(); assert_eq!(r.tp_rank, 3); diff --git a/probing/extensions/nccl-profiler/src/state.rs b/probing/extensions/nccl-profiler/src/state.rs index 7480bf98..fa41911f 100644 --- a/probing/extensions/nccl-profiler/src/state.rs +++ b/probing/extensions/nccl-profiler/src/state.rs @@ -112,8 +112,11 @@ impl PluginStateInner { } else if let Some(coll_idx) = self.coll_pool.index_of(descr.parent_obj as *mut CollSlot) { - let coll_slot = self.coll_pool.get_mut(coll_idx).unwrap(); - (coll_slot.ctx, coll_idx) + if let Some(coll_slot) = self.coll_pool.get_mut(coll_idx) { + (coll_slot.ctx, coll_idx) + } else { + (coll_context_fallback(descr), INVALID_IDX) + } } else { (coll_context_fallback(descr), INVALID_IDX) }; @@ -228,7 +231,9 @@ impl PluginStateInner { return; } let (parent_proxy, step) = { - let slot = self.step_pool.get_mut(step_idx).unwrap(); + let Some(slot) = self.step_pool.get_mut(step_idx) else { + return; + }; slot.step.stop_ns = now_ns(); (slot.parent_proxy, slot.step) }; @@ -250,7 +255,9 @@ impl PluginStateInner { return; } let (parent_coll, row) = { - let slot = self.proxy_pool.get_mut(proxy_idx).unwrap(); + let Some(slot) = self.proxy_pool.get_mut(proxy_idx) else { + return; + }; slot.op.stop_ns = now_ns(); let parent = slot.op.parent_coll; let row = std::mem::take(&mut slot.op).into_completed(); @@ -280,7 +287,9 @@ impl PluginStateInner { return; } let pending: Vec = { - let slot = self.coll_pool.get_mut(coll_idx).unwrap(); + let Some(slot) = self.coll_pool.get_mut(coll_idx) else { + return; + }; slot.stop_ns = now_ns(); slot.pending[..slot.pending_len as usize].to_vec() }; @@ -296,7 +305,9 @@ impl PluginStateInner { return; } let row = { - let slot = self.net_pool.get_mut(net_idx).unwrap(); + let Some(slot) = self.net_pool.get_mut(net_idx) else { + return; + }; slot.stop_ns = now_ns(); CompletedNetQp { ts_ns: slot.stop_ns, @@ -355,7 +366,9 @@ impl PluginStateInner { if step_idx == INVALID_IDX { return; } - let slot = self.step_pool.get_mut(step_idx).unwrap(); + let Some(slot) = self.step_pool.get_mut(step_idx) else { + return; + }; if let Some(idx) = proxy_step_state_index(state) { slot.step.state_ts[idx] = ts; } @@ -368,7 +381,9 @@ impl PluginStateInner { if proxy_idx == INVALID_IDX { return; } - let slot = self.proxy_pool.get_mut(proxy_idx).unwrap(); + let Some(slot) = self.proxy_pool.get_mut(proxy_idx) else { + return; + }; if !args.is_null() { unsafe { let a = &*args; diff --git a/probing/extensions/nccl-profiler/src/writer.rs b/probing/extensions/nccl-profiler/src/writer.rs index 8bd85679..25397169 100644 --- a/probing/extensions/nccl-profiler/src/writer.rs +++ b/probing/extensions/nccl-profiler/src/writer.rs @@ -87,7 +87,7 @@ impl NcclWriter { counters.write_errors.fetch_add(1, Ordering::Relaxed); return false; }; - table.push_row(&[ + if !table.push_row(&[ Value::I64(row.ts_ns), Value::I32(row.rank), Value::I32(row.roles.tp_rank), @@ -105,7 +105,10 @@ impl NcclWriter { Value::I64(row.send_wait_ns), Value::I64(row.recv_wait_ns), Value::I64(row.recv_flush_wait_ns), - ]); + ]) { + counters.write_errors.fetch_add(1, Ordering::Relaxed); + return false; + } counters.rows_written.fetch_add(1, Ordering::Relaxed); true } @@ -129,7 +132,7 @@ impl NcclWriter { counters.write_errors.fetch_add(1, Ordering::Relaxed); return false; }; - table.push_row(&[ + if !table.push_row(&[ Value::I64(row.ts_ns), Value::I32(row.rank), Value::I32(row.device), @@ -138,7 +141,10 @@ impl NcclWriter { Value::I32(row.opcode), Value::U64(row.length), Value::I64(row.duration_ns), - ]); + ]) { + counters.write_errors.fetch_add(1, Ordering::Relaxed); + return false; + } counters.rows_written.fetch_add(1, Ordering::Relaxed); true } diff --git a/probing/extensions/python/src/extensions/python/exttbls.rs b/probing/extensions/python/src/extensions/python/exttbls.rs index 72bca5cf..76905fb1 100644 --- a/probing/extensions/python/src/extensions/python/exttbls.rs +++ b/probing/extensions/python/src/extensions/python/exttbls.rs @@ -17,9 +17,10 @@ use std::sync::{Arc, Mutex, MutexGuard}; use crate::features::native_bridge::with_detached_native; use once_cell::sync::Lazy; +use probing_core::sync::lock_mutex; use probing_memtable::discover::ExposedTable; use probing_memtable::docs; -use probing_memtable::{DType, Schema as MtSchema, Value}; +use probing_memtable::{infer_extern_column_dtype, DType, Schema as MtSchema, Value}; use probing_proto::prelude::Ele; use pyo3::prelude::*; use pyo3::types::{PyDict, PyType}; @@ -273,7 +274,11 @@ impl ExternBacking { if self.table.is_some() { return Ok(()); } - self.dtypes = vec![DType::Str; self.columns.len()]; + self.dtypes = self + .columns + .iter() + .map(|col| infer_extern_column_dtype(col)) + .collect(); let schema = build_schema_with_docs( &self.name, &self.columns, @@ -338,7 +343,12 @@ impl ExternBacking { row.extend(owned.iter().map(owned_to_value)); // ExposedTable::push_row validates schema and auto-advances chunks. - self.table.as_mut().expect("ensured above").push_row(&row); + let Some(table) = self.table.as_mut() else { + return Err("table not initialized".to_string()); + }; + if !table.push_row(&row) { + return Err("push_row failed: schema mismatch or row too large".to_string()); + } Ok(()) } @@ -405,23 +415,11 @@ pub static EXTERN_TABLES: Lazy>>> Lazy::new(|| Mutex::new(Default::default())); fn lock_extern_tables() -> MutexGuard<'static, HashMap>>> { - match EXTERN_TABLES.lock() { - Ok(guard) => guard, - Err(e) => { - log::warn!("EXTERN_TABLES mutex poisoned; recovering"); - e.into_inner() - } - } + lock_mutex(&EXTERN_TABLES, "EXTERN_TABLES") } fn lock_backing(backing: &Mutex) -> MutexGuard<'_, ExternBacking> { - match backing.lock() { - Ok(guard) => guard, - Err(e) => { - log::warn!("ExternBacking mutex poisoned; recovering"); - e.into_inner() - } - } + lock_mutex(backing, "ExternBacking") } #[pyclass(from_py_object)] @@ -459,7 +457,9 @@ impl ExternalTable { ))); lock_backing(backing.as_ref()) .ensure_registered() - .expect("failed to register extern table for SQL catalog"); + .unwrap_or_else(|e| { + log::error!("failed to register extern table for SQL catalog: {e}"); + }); backing } } @@ -746,6 +746,33 @@ if not hasattr(probing, "_made_{name}"): assert_eq!(table.names(), vec!["a", "b"]); } + #[test] + fn ensure_registered_infers_numeric_dtypes() { + setup(); + let name = format!("comm_like_{}", std::process::id()); + let _table = ExternalTable::new( + &name, + vec![ + "rank".to_string(), + "duration_ms".to_string(), + "op".to_string(), + ], + 10000, + 20_000_000, + "BaseMemorySize".to_string(), + None, + None, + ); + let binding = lock_extern_tables(); + let backing = binding.get(&name).expect("backing"); + let guard = lock_backing(backing.as_ref()); + assert_eq!( + guard.dtypes, + vec![DType::I64, DType::F64, DType::Str], + "placeholder mmap must not default all columns to Str" + ); + } + #[test] fn test_create_table_in_python() { setup(); diff --git a/probing/extensions/python/src/extensions/python/tbls.rs b/probing/extensions/python/src/extensions/python/tbls.rs index 5c34d3f5..ab204d97 100644 --- a/probing/extensions/python/src/extensions/python/tbls.rs +++ b/probing/extensions/python/src/extensions/python/tbls.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use anyhow::Result; -use log::error; +use log::{debug, error}; use probing_core::core::{ ArrayRef, CustomNamespace, DataType, Field, Float64Array, Int64Array, NamespaceProbeDataSource, RecordBatch, Schema, SchemaRef, StringArray, @@ -187,11 +187,15 @@ impl CustomNamespace for PythonNamespace { vec![] } } + } else if !expr.contains('.') { + // Extern mmap tables (`comm_collective`, `torch_trace`, …) — not Python imports. + debug!("python.{expr}: no live data (mmap empty or not created yet)"); + vec![] } else { match Self::data_from_python(expr) { Ok(batches) => batches, Err(e) => { - error!("Error getting data from Python: {e:?}"); + debug!("Python dynamic expr {expr}: {e:?}"); vec![] } } diff --git a/probing/extensions/python/src/features/torch.rs b/probing/extensions/python/src/features/torch.rs index 44969a8c..65bcf986 100644 --- a/probing/extensions/python/src/features/torch.rs +++ b/probing/extensions/python/src/features/torch.rs @@ -278,7 +278,7 @@ fn run_torch_query(query: &str) -> Result { let engine = tokio::runtime::Builder::new_current_thread() .enable_all() .build() - .unwrap() + .map_err(|e| anyhow::anyhow!("failed to build tokio runtime: {e}"))? .block_on(async { probing_core::create_engine() .with_data_source(PythonProbeDataSource::create("python")) @@ -288,7 +288,7 @@ fn run_torch_query(query: &str) -> Result { let rt = tokio::runtime::Builder::new_current_thread() .enable_all() .build() - .unwrap(); + .map_err(|e| anyhow::anyhow!("failed to build tokio runtime: {e}"))?; Ok(rt .block_on(async { engine.async_query(&query).await })? .unwrap_or_default()) diff --git a/probing/extensions/python/src/features/tracing.rs b/probing/extensions/python/src/features/tracing.rs index 1c055642..d1e7881a 100644 --- a/probing/extensions/python/src/features/tracing.rs +++ b/probing/extensions/python/src/features/tracing.rs @@ -4,6 +4,7 @@ use pyo3::IntoPyObjectExt; use std::cell::RefCell; use std::sync::{Arc, Mutex, MutexGuard}; +use probing_core::sync::lock_mutex; use probing_core::trace::Span as RawSpan; use probing_core::trace::{ advance_micro_step, attr, set_micro_batches, step_snapshot, sync_micro_step, Attribute, @@ -13,13 +14,7 @@ use probing_core::trace::{ use crate::features::convert::{ele_to_python, python_to_ele}; fn lock_span(m: &Mutex) -> MutexGuard<'_, RawSpan> { - match m.lock() { - Ok(guard) => guard, - Err(e) => { - log::debug!("span mutex poisoned; recovering"); - e.into_inner() - } - } + lock_mutex(m, "span") } fn parse_py_attributes(py: Python, attributes: Vec>) -> PyResult> { diff --git a/probing/memtable/src/discover.rs b/probing/memtable/src/discover.rs index 4457eadb..897e9cd5 100644 --- a/probing/memtable/src/discover.rs +++ b/probing/memtable/src/discover.rs @@ -162,7 +162,7 @@ impl ExposedTable { /// This is the fast path for high-frequency writes — it skips the /// O(rows × chunks) `validate_buf` that `writer()` performs on every call. /// MEMT is single-writer, so no lock is taken (see [`MemTable::push_row`]). - pub fn push_row(&mut self, values: &[Value]) { + pub fn push_row(&mut self, values: &[Value]) -> bool { self.inner.push_row(values) } diff --git a/probing/memtable/src/docs.rs b/probing/memtable/src/docs.rs index a0e4a052..ffb30f62 100644 --- a/probing/memtable/src/docs.rs +++ b/probing/memtable/src/docs.rs @@ -6,7 +6,7 @@ use std::collections::HashMap; use std::sync::{Mutex, OnceLock}; -use crate::schema::Schema; +use crate::schema::{DType, Schema}; /// Documentation for one SQL table (`schema.table`). #[derive(Debug, Clone, Default)] @@ -27,6 +27,28 @@ fn qualified_key(table_schema: &str, table_name: &str) -> String { format!("{table_schema}.{table_name}") } +/// Infer memtable dtype for a documented extern column from its name alone. +pub fn infer_extern_column_dtype(name: &str) -> DType { + match name { + "timestamp" => DType::I64, + "duration" | "duration_ms" => DType::F64, + "allocated" + | "max_allocated" + | "cached" + | "max_cached" + | "time_offset" + | "allocated_delta" + | "max_allocated_delta" => DType::F64, + "rank" | "world_size" | "group_rank" | "group_size" | "bytes" | "async_op" + | "micro_batches" | "micro_step" | "local_step" | "global_step" | "seq" | "role_rank" + | "role_world_size" | "lineno" | "depth" | "ts" | "used_bytes" | "total_bytes" + | "mem_used_pct" | "gpu_util_pct" | "rss_kb" | "thread_count" | "cpu_total_pct" => { + DType::I64 + } + _ => DType::Str, + } +} + /// Register table/column docs for a qualified SQL name (`hccl.host_ops`, `python.foo`, …). pub fn register_qualified(table_schema: &str, table_name: &str, schema: &Schema) { let key = qualified_key(table_schema, table_name); @@ -63,6 +85,19 @@ pub fn snapshot() -> Vec { rows } +/// Column names registered for `schema.table` (sorted, deduplicated). +pub fn registered_column_names(table_schema: &str, table_name: &str) -> Vec { + let key = qualified_key(table_schema, table_name); + let reg = registry().lock().expect("table doc registry lock"); + let Some(entry) = reg.get(&key) else { + return Vec::new(); + }; + let mut cols: Vec = entry.columns.keys().cloned().collect(); + cols.sort(); + cols.dedup(); + cols +} + /// Register column docs without a full schema (e.g. Python `@table` before first append). pub fn register_column_docs( table_schema: &str, @@ -128,6 +163,32 @@ mod tests { })); } + #[test] + fn infer_extern_column_dtype_maps_duration_ms_to_f64() { + assert_eq!(infer_extern_column_dtype("duration_ms"), DType::F64); + assert_eq!(infer_extern_column_dtype("rank"), DType::I64); + assert_eq!(infer_extern_column_dtype("op"), DType::Str); + } + + #[test] + fn registered_column_names_sorted() { + let table = unique_table("col_names"); + register_column_docs( + "unittest", + &table, + None, + &[ + ("z".to_string(), "last".to_string()), + ("a".to_string(), "first".to_string()), + ], + ); + assert_eq!( + registered_column_names("unittest", &table), + vec!["a".to_string(), "z".to_string()] + ); + assert!(registered_column_names("unittest", "missing").is_empty()); + } + #[test] fn register_column_docs_merges_into_existing_entry() { let table = unique_table("merge_docs"); diff --git a/probing/memtable/src/lib.rs b/probing/memtable/src/lib.rs index b530ddaf..72580083 100644 --- a/probing/memtable/src/lib.rs +++ b/probing/memtable/src/lib.rs @@ -112,6 +112,7 @@ mod schema; mod writer; pub use cache::{CachedCursor, CachedReader}; +pub use docs::infer_extern_column_dtype; pub use layout::MAGIC_MEMT; pub use memh::{ init_buf as init_memh_buf, validate_memh, InsertError, InsertResult, MemhInitError, diff --git a/probing/memtable/src/memh/table.rs b/probing/memtable/src/memh/table.rs index 5ba57746..3fe826c2 100644 --- a/probing/memtable/src/memh/table.rs +++ b/probing/memtable/src/memh/table.rs @@ -75,6 +75,7 @@ pub enum InsertResult { pub enum InsertError { TableFull, ArenaFull, + InvalidValue, } impl std::fmt::Display for InsertError { @@ -82,6 +83,7 @@ impl std::fmt::Display for InsertError { match self { InsertError::TableFull => write!(f, "hash table is full"), InsertError::ArenaFull => write!(f, "arena is full"), + InsertError::InvalidValue => write!(f, "value cannot be stored inline"), } } } @@ -521,7 +523,9 @@ impl<'a> MemhWriter<'a> { let head_off = abs as u32; if is_scalar { - let (dtype_u8, inline_bytes) = encode_inline_bytes(val).unwrap(); + let Some((dtype_u8, inline_bytes)) = encode_inline_bytes(val) else { + return Err(InsertError::InvalidValue); + }; commit_slot( self.buf, self.data_off, @@ -564,7 +568,9 @@ impl<'a> MemhWriter<'a> { ) -> Result<(), InsertError> { // Hot path: scalar → scalar update on INLINE slot — zero arena writes. if old_tag == SLOT_INLINE && is_scalar { - let (dtype_u8, inline_bytes) = encode_inline_bytes(val).unwrap(); + let Some((dtype_u8, inline_bytes)) = encode_inline_bytes(val) else { + return Err(InsertError::InvalidValue); + }; update_slot_inline_value(self.buf, self.data_off, slot_idx, dtype_u8, &inline_bytes); return Ok(()); } @@ -594,7 +600,9 @@ impl<'a> MemhWriter<'a> { let new_head_off = abs as u32; if is_scalar { - let (dtype_u8, inline_bytes) = encode_inline_bytes(val).unwrap(); + let Some((dtype_u8, inline_bytes)) = encode_inline_bytes(val) else { + return Err(InsertError::InvalidValue); + }; // key_len is known from `key.len()` (key match was verified in the probe loop). commit_slot( self.buf, diff --git a/probing/memtable/src/memtable.rs b/probing/memtable/src/memtable.rs index d24c51b3..a5393645 100644 --- a/probing/memtable/src/memtable.rs +++ b/probing/memtable/src/memtable.rs @@ -194,15 +194,17 @@ fn row_data_size(values: &[Value]) -> usize { values.iter().map(|v| v.encoded_size()).sum() } -pub(crate) fn push_plain_row(buf: &mut [u8], values: &[Value]) { +pub(crate) fn push_plain_row(buf: &mut [u8], values: &[Value]) -> bool { let row_data = row_data_size(values); - if !write_row_bytes(buf, values, row_data) { - advance_chunk_raw(buf); - assert!( - write_row_bytes(buf, values, row_data), - "row exceeds chunk capacity" - ); + if write_row_bytes(buf, values, row_data) { + return true; } + advance_chunk_raw(buf); + if write_row_bytes(buf, values, row_data) { + return true; + } + log::warn!("push_plain_row: row exceeds chunk capacity"); + false } const MAX_DEDUP_COLS: usize = 64; @@ -626,10 +628,10 @@ impl MemTable { make_row_writer(self.backing.bytes_mut(), None) } pub fn append_row(&mut self, values: &[Value]) -> bool { - assert!( - validate_row_schema(self.backing.bytes(), values), - "value types do not match schema" - ); + if !validate_row_schema(self.backing.bytes(), values) { + log::warn!("append_row: value types do not match schema"); + return false; + } write_row_bytes(self.backing.bytes_mut(), values, row_data_size(values)) } pub fn advance_chunk(&mut self) { @@ -640,15 +642,15 @@ impl MemTable { /// /// MEMT is single-writer: the `&mut self` borrow guarantees exclusive /// access, so no lock is taken. - pub fn push_row(&mut self, values: &[Value]) { + pub fn push_row(&mut self, values: &[Value]) -> bool { if !validate_row_schema(self.backing.bytes(), values) { log::warn!("push_row: value types do not match schema"); - return; + return false; } - self.push_row_unchecked(values); + self.push_row_unchecked(values) } - pub fn push_row_unchecked(&mut self, values: &[Value]) { - push_plain_row(self.backing.bytes_mut(), values); + pub fn push_row_unchecked(&mut self, values: &[Value]) -> bool { + push_plain_row(self.backing.bytes_mut(), values) } } @@ -786,16 +788,16 @@ impl<'a> MemTableWriter<'a> { make_row_writer(self.buf, self.dedup.as_mut()) } - pub fn push_row(&mut self, values: &[Value]) { - assert!( - validate_row_schema(self.buf, values), - "value types do not match schema" - ); - self.push_inner(values); + pub fn push_row(&mut self, values: &[Value]) -> bool { + if !validate_row_schema(self.buf, values) { + log::warn!("push_row: value types do not match schema"); + return false; + } + self.push_inner(values) } - pub fn push_row_unchecked(&mut self, values: &[Value]) { - self.push_inner(values); + pub fn push_row_unchecked(&mut self, values: &[Value]) -> bool { + self.push_inner(values) } pub fn advance_chunk(&mut self) { @@ -806,10 +808,10 @@ impl<'a> MemTableWriter<'a> { } pub fn append_row(&mut self, values: &[Value]) -> bool { - assert!( - validate_row_schema(self.buf, values), - "value types do not match schema" - ); + if !validate_row_schema(self.buf, values) { + log::warn!("append_row: value types do not match schema"); + return false; + } if let Some(ref mut state) = self.dedup { append_row_dedup_bytes(self.buf, state, values) } else { @@ -817,18 +819,20 @@ impl<'a> MemTableWriter<'a> { } } - fn push_inner(&mut self, values: &[Value]) { + fn push_inner(&mut self, values: &[Value]) -> bool { if let Some(ref mut state) = self.dedup { - if !append_row_dedup_bytes(self.buf, state, values) { - advance_chunk_raw(self.buf); - state.clear(); - assert!( - append_row_dedup_bytes(self.buf, state, values), - "row exceeds chunk capacity" - ); + if append_row_dedup_bytes(self.buf, state, values) { + return true; + } + advance_chunk_raw(self.buf); + state.clear(); + if append_row_dedup_bytes(self.buf, state, values) { + return true; } + log::warn!("push_row: row exceeds chunk capacity"); + false } else { - push_plain_row(self.buf, values); + push_plain_row(self.buf, values) } } } @@ -1686,7 +1690,7 @@ mod tests { fn push_row_rejects_wrong_column_count() { let schema = Schema::new().col("a", DType::U32).col("b", DType::I64); let mut t = MemTable::new(&schema, 256, 2); - t.push_row(&[Value::U32(1)]); // only 1 value for 2 columns + assert!(!t.push_row(&[Value::U32(1)])); // only 1 value for 2 columns assert_eq!(t.num_rows(0), 0); } @@ -1694,7 +1698,7 @@ mod tests { fn push_row_rejects_wrong_dtype() { let schema = Schema::new().col("a", DType::U32); let mut t = MemTable::new(&schema, 256, 2); - t.push_row(&[Value::Str("oops")]); // Str instead of U32 + assert!(!t.push_row(&[Value::Str("oops")])); // Str instead of U32 assert_eq!(t.num_rows(0), 0); } diff --git a/probing/memtable/src/row.rs b/probing/memtable/src/row.rs index 4e542f44..479a483a 100644 --- a/probing/memtable/src/row.rs +++ b/probing/memtable/src/row.rs @@ -163,31 +163,55 @@ impl<'a> Row<'a> { } pub fn col_u8(&self, col: usize) -> u8 { + if !self.is_valid() { + return 0; + } let off = self.col_offset(col); if off >= self.data.len() { - panic_stale("col_u8"); + return 0; } self.data[off] } pub fn col_u32(&self, col: usize) -> u32 { + if !self.is_valid() { + return 0; + } read_u32(self.data, self.col_offset(col)) } pub fn col_i32(&self, col: usize) -> i32 { + if !self.is_valid() { + return 0; + } read_i32(self.data, self.col_offset(col)) } pub fn col_i64(&self, col: usize) -> i64 { + if !self.is_valid() { + return 0; + } read_i64(self.data, self.col_offset(col)) } pub fn col_f32(&self, col: usize) -> f32 { + if !self.is_valid() { + return 0.0; + } read_f32(self.data, self.col_offset(col)) } pub fn col_f64(&self, col: usize) -> f64 { + if !self.is_valid() { + return 0.0; + } read_f64(self.data, self.col_offset(col)) } pub fn col_u64(&self, col: usize) -> u64 { + if !self.is_valid() { + return 0; + } read_u64(self.data, self.col_offset(col)) } pub fn col_str(&self, col: usize) -> &str { + if !self.is_valid() { + return ""; + } let b = self.resolve_var_col(col); if b.is_empty() { "" @@ -196,6 +220,9 @@ impl<'a> Row<'a> { } } pub fn col_bytes(&self, col: usize) -> &[u8] { + if !self.is_valid() { + return &[]; + } self.resolve_var_col(col) } @@ -206,6 +233,7 @@ impl<'a> Row<'a> { buf: self.buf, chunk_start: self.chunk_start, generation: self.generation, + stale: !self.is_valid(), } } } @@ -213,13 +241,15 @@ impl<'a> Row<'a> { /// Sequential cursor over columns within a row — O(1) per column. /// /// Generation is validated once per row by [`RowIter::next()`]. -/// Column reads do **not** re-check, keeping the hot path branch-free. +/// If the chunk is recycled mid-read, the cursor is marked stale and +/// subsequent reads return zero / empty values instead of panicking. pub struct RowCursor<'a> { data: &'a [u8], pos: usize, buf: &'a [u8], chunk_start: usize, generation: u64, + stale: bool, } impl<'a> RowCursor<'a> { @@ -229,16 +259,30 @@ impl<'a> RowCursor<'a> { /// Check whether the underlying chunk is still at the same generation. pub fn is_valid(&self) -> bool { - chunk_header(self.buf, self.chunk_start) - .generation - .load(Ordering::Acquire) - == self.generation + !self.stale + && chunk_header(self.buf, self.chunk_start) + .generation + .load(Ordering::Acquire) + == self.generation + } + + /// Returns `true` if the chunk was recycled or a torn read was detected. + pub fn is_stale(&self) -> bool { + self.stale + } + + fn mark_stale(&mut self) { + self.stale = true; } fn read_fixed(&mut self) -> [u8; N] { + if self.stale { + return [0u8; N]; + } let end = self.pos + N; if end > self.data.len() { - panic_stale("read_fixed"); + self.mark_stale(); + return [0u8; N]; } let mut v = [0u8; N]; v.copy_from_slice(&self.data[self.pos..end]); @@ -247,22 +291,31 @@ impl<'a> RowCursor<'a> { } fn read_lp(&mut self) -> &'a [u8] { + if self.stale { + return &[]; + } let raw = i32::from_le_bytes(self.read_fixed::<4>()); + if self.stale { + return &[]; + } if raw < 0 { let ref_off = self.chunk_start + (-raw) as usize; if ref_off + 4 > self.buf.len() { - panic_stale("RowCursor dedup ref header"); + self.mark_stale(); + return &[]; } let len = r32(self.buf, ref_off) as usize; let end = ref_off + 4 + len; if end > self.buf.len() { - panic_stale("RowCursor dedup ref payload"); + self.mark_stale(); + return &[]; } &self.buf[ref_off + 4..end] } else { let len = raw as usize; if self.pos + len > self.data.len() { - panic_stale("RowCursor inline str"); + self.mark_stale(); + return &[]; } let data = &self.data[self.pos..self.pos + len]; self.pos += len; @@ -338,28 +391,30 @@ impl<'a> RowIter<'a> { impl<'a> Iterator for RowIter<'a> { type Item = Row<'a>; fn next(&mut self) -> Option { - if self.pos + 4 > self.end { - return None; + while self.pos + 4 <= self.end { + if !self.is_valid() { + return None; + } + let row_len = r32(self.buf, self.pos) as usize; + let row_total = 4usize.saturating_add(row_len); + if row_total > self.end.saturating_sub(self.pos) { + return None; + } + let row_end = self.pos + row_total; + let data_offset = self.pos + 4; + self.pos = row_end; + if self.is_valid() { + return Some(Row { + data: &self.buf[data_offset..row_end], + buf: self.buf, + data_offset, + chunk_start: self.chunk_start, + generation: self.generation, + }); + } + // Chunk recycled while parsing this row — skip it and continue. } - if !self.is_valid() { - return None; - } - let row_len = r32(self.buf, self.pos) as usize; - let row_total = 4usize.saturating_add(row_len); - if row_total > self.end.saturating_sub(self.pos) { - return None; - } - let row_end = self.pos + row_total; - let data_offset = self.pos + 4; - let data = &self.buf[data_offset..row_end]; - self.pos = row_end; - Some(Row { - data, - buf: self.buf, - data_offset, - chunk_start: self.chunk_start, - generation: self.generation, - }) + None } } @@ -444,9 +499,9 @@ mod tests { let schema = Schema::new().col("v", DType::I64); let mut t = MemTable::new(&schema, 80, 2); t.push_row(&[Value::I64(1)]); - let rows: Vec<_> = t.rows(0).collect(); - assert_eq!(rows[0].col_i64(0), 1); - let gen_before = rows[0].generation(); + let row = t.rows(0).next().unwrap(); + let gen_before = row.generation(); + assert_eq!(row.col_i64(0), 1); // wrap chunk 0 twice: 0→1→0 so chunk 0 gets a new generation t.advance_chunk(); @@ -457,4 +512,86 @@ mod tests { "generation should have changed after wrap" ); } + + #[test] + fn row_col_degrades_on_stale_chunk_without_panic() { + use crate::memtable::MemTableView; + + let schema = Schema::new().col("v", DType::I64); + let size = MemTable::required_size(&schema, 80, 2); + let mut buf = vec![0u8; size]; + { + let mut mt = MemTableWriter::init(&mut buf, &schema, 80, 2); + mt.push_row(&[Value::I64(42)]); + } + let reader: &[u8] = unsafe { std::slice::from_raw_parts(buf.as_ptr(), buf.len()) }; + let view = MemTableView::new(reader).unwrap(); + let row = view.rows(0).next().unwrap(); + + { + let mut w = MemTableWriter::new(&mut buf).unwrap(); + w.advance_chunk(); + w.advance_chunk(); + } + assert!(!row.is_valid()); + assert_eq!(row.col_i64(0), 0); + } + + #[test] + fn row_cursor_degrades_on_stale_chunk_without_panic() { + use crate::memtable::MemTableView; + + let schema = Schema::new().col("v", DType::I64).col("tag", DType::Str); + let size = MemTable::required_size(&schema, 80, 2); + let mut buf = vec![0u8; size]; + { + let mut mt = MemTableWriter::init(&mut buf, &schema, 80, 2); + mt.push_row(&[Value::I64(42), Value::Str("hello")]); + } + let reader: &[u8] = unsafe { std::slice::from_raw_parts(buf.as_ptr(), buf.len()) }; + let view = MemTableView::new(reader).unwrap(); + let gen = view.chunk_generation(0); + let row = view.rows(0).next().unwrap(); + + { + let mut w = MemTableWriter::new(&mut buf).unwrap(); + w.advance_chunk(); + w.advance_chunk(); + } + assert_ne!(MemTableView::new(reader).unwrap().chunk_generation(0), gen); + assert!(!row.is_valid()); + + let mut c = row.cursor(); + assert!(c.is_stale()); + assert_eq!(c.next_i64(), 0); + assert_eq!(c.next_str(), ""); + } + + #[test] + fn row_iter_skips_row_when_chunk_recycled_mid_parse() { + use crate::memtable::MemTableView; + + let schema = Schema::new().col("v", DType::I32); + let size = MemTable::required_size(&schema, 80, 2); + let mut buf = vec![0u8; size]; + { + let mut mt = MemTableWriter::init(&mut buf, &schema, 80, 2); + for i in 0..3 { + mt.push_row(&[Value::I32(i)]); + } + } + let reader: &[u8] = unsafe { std::slice::from_raw_parts(buf.as_ptr(), buf.len()) }; + let view = MemTableView::new(reader).unwrap(); + let gen = view.chunk_generation(0); + let mut iter = view.rows(0); + let _ = iter.next().unwrap(); + + { + let mut w = MemTableWriter::new(&mut buf).unwrap(); + w.advance_chunk(); + w.advance_chunk(); + } + assert_ne!(MemTableView::new(reader).unwrap().chunk_generation(0), gen); + assert!(iter.next().is_none()); + } } diff --git a/probing/proto/src/lib.rs b/probing/proto/src/lib.rs index 1574f3cd..1743da0e 100644 --- a/probing/proto/src/lib.rs +++ b/probing/proto/src/lib.rs @@ -4,7 +4,7 @@ pub mod types; pub mod prelude { // --- Protocol Structures --- - pub use crate::protocol::cluster::{Cluster, Node}; + pub use crate::protocol::cluster::{Cluster, Node, NodeReportRequest, NodeReportResponse}; pub use crate::protocol::message::Message; pub use crate::protocol::process::{CallFrame, Process}; diff --git a/probing/proto/src/protocol/cluster.rs b/probing/proto/src/protocol/cluster.rs index d3d603d1..9bad2a69 100644 --- a/probing/proto/src/protocol/cluster.rs +++ b/probing/proto/src/protocol/cluster.rs @@ -29,6 +29,25 @@ pub struct Node { pub timestamp: u64, } +/// Batch node registration / heartbeat (hierarchical cluster report). +#[derive(Debug, Default, Deserialize, Serialize, PartialEq, Eq, Clone)] +pub struct NodeReportRequest { + #[serde(default)] + pub nodes: Vec, + #[serde(default)] + pub seen_version: u64, +} + +/// Cluster snapshot returned after PUT /apis/nodes (merge + TTL sweep). +#[derive(Debug, Default, Deserialize, Serialize, PartialEq, Eq, Clone)] +pub struct NodeReportResponse { + pub ok: bool, + pub version: u64, + pub nodes: Vec, + #[serde(default)] + pub removed: Vec, +} + impl Display for Node { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( diff --git a/probing/proto/src/types/merge.rs b/probing/proto/src/types/merge.rs new file mode 100644 index 00000000..c898bfd3 --- /dev/null +++ b/probing/proto/src/types/merge.rs @@ -0,0 +1,74 @@ +use super::{DataFrame, Ele, Seq}; + +/// Append rows from `other` into `base`, aligning columns by name (missing values become `Nil`). +pub fn append_dataframe(base: &mut DataFrame, other: &DataFrame) { + if other.is_empty() { + return; + } + if base.is_empty() { + *base = other.clone(); + return; + } + + let other_rows = other.len(); + for name in &other.names { + if !base.names.contains(name) { + base.names.push(name.clone()); + base.cols + .push(Seq::SeqText(vec![String::new(); base.len()])); + } + } + for (col_idx, name) in base.names.clone().iter().enumerate() { + let src_idx = other.names.iter().position(|n| n == name); + for row in 0..other_rows { + let ele = src_idx + .and_then(|i| other.cols.get(i).map(|c| c.get(row))) + .unwrap_or(Ele::Nil); + if let Some(col) = base.cols.get_mut(col_idx) { + let _ = col.append(ele); + } + } + } + base.size = base.len() as u64; +} + +/// Merge non-empty DataFrames with column alignment (preserves row order of `parts`). +pub fn merge_dataframes(parts: &[DataFrame]) -> DataFrame { + let mut out = DataFrame::default(); + for df in parts { + if df.is_empty() { + continue; + } + if out.is_empty() { + out = df.clone(); + continue; + } + append_dataframe(&mut out, df); + } + out.size = out.len() as u64; + out +} + +#[cfg(test)] +mod tests { + use super::*; + use super::{Ele, Seq}; + + #[test] + fn merge_aligns_columns() { + let a = DataFrame { + names: vec!["rank".into()], + cols: vec![Seq::SeqI32(vec![0])], + size: 1, + }; + let b = DataFrame { + names: vec!["rank".into(), "extra".into()], + cols: vec![Seq::SeqI32(vec![1]), Seq::SeqText(vec!["x".into()])], + size: 1, + }; + let merged = merge_dataframes(&[a, b]); + assert_eq!(merged.len(), 2); + assert_eq!(merged.names, vec!["rank", "extra"]); + assert_eq!(merged.cols[0].get(1), Ele::I32(1)); + } +} diff --git a/probing/proto/src/types/mod.rs b/probing/proto/src/types/mod.rs index 62763019..14fbbd67 100644 --- a/probing/proto/src/types/mod.rs +++ b/probing/proto/src/types/mod.rs @@ -3,6 +3,7 @@ mod compress; pub mod convert; mod dataframe; mod error; +mod merge; pub mod series; mod time_series; @@ -16,5 +17,6 @@ pub use compress::Decompressable; pub use convert::{EleExt, FromEle, ToEle}; pub use dataframe::DataFrame; pub use error::ProtoError; +pub use merge::{append_dataframe, merge_dataframes}; pub use series::{DiscardStrategy, Series}; pub use time_series::TimeSeries; diff --git a/probing/server/Cargo.toml b/probing/server/Cargo.toml index 9ed3ec4f..8572fbdb 100644 --- a/probing/server/Cargo.toml +++ b/probing/server/Cargo.toml @@ -21,6 +21,7 @@ probing-memtable = { path = "../memtable" } probing-python = { path = "../extensions/python", default-features = false } probing-proto = { path = "../proto" } probing-core = { path = "../core" } +probing-store = { path = "../crates/store" } datafusion = { workspace = true } @@ -55,3 +56,11 @@ procfs = { version = "0.17.0", default-features = false, features = ["chrono"] } [dev-dependencies] tempfile = "3.8" +probing-proto = { path = "../proto" } +axum = { version = "0.8.1", default-features = false, features = [ + "tokio", + "http1", + "json", + "macros", +] } +tokio = { workspace = true, features = ["rt-multi-thread", "net"] } diff --git a/probing/server/src/cluster_http.rs b/probing/server/src/cluster_http.rs new file mode 100644 index 00000000..2eb8ec76 --- /dev/null +++ b/probing/server/src/cluster_http.rs @@ -0,0 +1,50 @@ +use std::time::Duration; + +use anyhow::Result; +use probing_proto::prelude::{Node, NodeReportRequest, NodeReportResponse}; + +pub fn get_i32_env(name: &str) -> Option { + std::env::var(name) + .ok() + .filter(|v| !v.is_empty()) + .and_then(|v| v.parse().ok()) +} + +pub fn fetch_nodes_blocking(http_base: &str) -> Result> { + let url = format!("{}/apis/nodes", http_base.trim_end_matches('/')); + let text = ureq::get(&url) + .config() + .no_delay(true) + .timeout_global(Some(Duration::from_secs(10))) + .build() + .call()? + .body_mut() + .read_to_string()?; + Ok(serde_json::from_str(&text)?) +} + +pub fn put_nodes_blocking( + http_base: &str, + nodes: Vec, + seen_version: u64, +) -> Result { + let url = format!("{}/apis/nodes", http_base.trim_end_matches('/')); + let body = NodeReportRequest { + nodes, + seen_version, + }; + let text = ureq::put(&url) + .config() + .no_delay(true) + .timeout_global(Some(Duration::from_secs( + std::env::var("PROBING_CLUSTER_REPORT_TIMEOUT_SEC") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(5), + ))) + .build() + .send_json(body)? + .body_mut() + .read_to_string()?; + Ok(serde_json::from_str(&text)?) +} diff --git a/probing/server/src/cluster_report_backoff.rs b/probing/server/src/cluster_report_backoff.rs new file mode 100644 index 00000000..ecf138c4 --- /dev/null +++ b/probing/server/src/cluster_report_backoff.rs @@ -0,0 +1,264 @@ +//! Exponential backoff for cluster heartbeats when the view is stable. + +use std::time::Duration; + +use probing_proto::prelude::{Node, NodeReportResponse}; + +use crate::cluster_http::get_i32_env; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ReportOutcome { + /// Discovery or parent not ready — do not penalize streak. + Skipped, + /// PUT failed. + Failed, + /// PUT ok; cluster/local view still converging — hold interval at base. + SuccessConverging, + /// PUT ok and expected membership present — advance backoff streak. + SuccessStable, +} + +#[derive(Debug, Clone)] +pub struct ReportBackoff { + streak: u32, + base_secs: u64, + max_secs: u64, + factor: f64, +} + +pub fn report_backoff_enabled() -> bool { + match std::env::var("PROBING_CLUSTER_REPORT_BACKOFF") { + Ok(val) => { + let lower = val.trim().to_ascii_lowercase(); + !matches!(lower.as_str(), "0" | "false" | "no" | "off") + } + Err(_) => true, + } +} + +pub fn base_report_interval_secs() -> u64 { + std::env::var("PROBING_CLUSTER_REPORT_INTERVAL_SEC") + .ok() + .and_then(|v| v.trim().parse().ok()) + .unwrap_or(10) + .max(1) +} + +pub fn stale_threshold_secs() -> u64 { + std::env::var("PROBING_CLUSTER_STALE_SEC") + .ok() + .and_then(|v| v.trim().parse().ok()) + .unwrap_or(25) + .max(5) +} + +fn configured_max_interval_secs() -> u64 { + std::env::var("PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC") + .ok() + .and_then(|v| v.trim().parse().ok()) + .unwrap_or(120) + .max(1) +} + +fn backoff_factor() -> f64 { + std::env::var("PROBING_CLUSTER_REPORT_BACKOFF_FACTOR") + .ok() + .and_then(|v| v.trim().parse().ok()) + .unwrap_or(2.0_f64) + .max(1.0_f64) +} + +/// Cap interval below stale TTL so nodes are not marked dead between beats. +pub fn max_report_interval_secs() -> u64 { + let base = base_report_interval_secs(); + let configured = configured_max_interval_secs(); + let stale = stale_threshold_secs(); + let safe = stale.saturating_sub(stale / 4 + 1).max(base); + configured.min(safe).max(base) +} + +impl ReportBackoff { + pub fn new() -> Self { + Self { + streak: 0, + base_secs: base_report_interval_secs(), + max_secs: max_report_interval_secs(), + factor: backoff_factor(), + } + } + + pub fn reset(&mut self) { + self.streak = 0; + } + + pub fn record(&mut self, outcome: ReportOutcome) { + if !report_backoff_enabled() { + self.streak = 0; + return; + } + match outcome { + ReportOutcome::Skipped => {} + ReportOutcome::Failed | ReportOutcome::SuccessConverging => self.streak = 0, + ReportOutcome::SuccessStable => self.streak = self.streak.saturating_add(1), + } + } + + pub fn sleep_duration(&self) -> Duration { + if !report_backoff_enabled() { + return Duration::from_secs(self.base_secs); + } + let mult = self.factor.powi(self.streak as i32); + let secs = ((self.base_secs as f64) * mult) + .min(self.max_secs as f64) + .max(self.base_secs as f64) as u64; + Duration::from_secs(secs) + } +} + +impl Default for ReportBackoff { + fn default() -> Self { + Self::new() + } +} + +fn node_is_alive(node: &Node) -> bool { + node.status.as_deref() != Some("dead") +} + +fn local_world_size() -> Option { + get_i32_env("LOCAL_WORLD_SIZE") + .or_else(|| get_i32_env("LOCAL_SIZE")) + .or_else(|| get_i32_env("NPROC_PER_NODE")) +} + +fn node_rank_from_env() -> i32 { + get_i32_env("GROUP_RANK") + .or_else(|| get_i32_env("NODE_RANK")) + .unwrap_or(0) +} + +fn local_group_alive_count(nodes: &[Node]) -> usize { + let grp = node_rank_from_env(); + nodes + .iter() + .filter(|n| n.group_rank == Some(grp) && node_is_alive(n)) + .count() +} + +fn global_alive_count(nodes: &[Node]) -> usize { + nodes.iter().filter(|n| node_is_alive(n)).count() +} + +/// Classify whether the merged snapshot indicates stable membership for backoff. +pub fn classify_report_outcome( + put_ok: bool, + discovered: bool, + resp: Option<&NodeReportResponse>, +) -> ReportOutcome { + if !discovered { + return ReportOutcome::Skipped; + } + if !put_ok { + return ReportOutcome::Failed; + } + let Some(resp) = resp else { + return ReportOutcome::SuccessConverging; + }; + + let local_rank = get_i32_env("LOCAL_RANK").unwrap_or(0); + if local_rank != 0 { + if let Some(lws) = local_world_size() { + if lws > 0 && local_group_alive_count(&resp.nodes) >= lws as usize { + return ReportOutcome::SuccessStable; + } + } + return ReportOutcome::SuccessConverging; + } + + if let Some(ws) = get_i32_env("WORLD_SIZE") { + if ws > 1 && global_alive_count(&resp.nodes) >= ws as usize { + return ReportOutcome::SuccessStable; + } + } + + if let Some(lws) = local_world_size() { + if lws > 0 && local_group_alive_count(&resp.nodes) >= lws as usize { + return ReportOutcome::SuccessStable; + } + } + + ReportOutcome::SuccessConverging +} + +#[cfg(test)] +mod tests { + use super::*; + use std::sync::{LazyLock, Mutex}; + + static ENV_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); + + fn clear_backoff_env() { + for key in [ + "PROBING_CLUSTER_REPORT_INTERVAL_SEC", + "PROBING_CLUSTER_STALE_SEC", + "PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC", + "PROBING_CLUSTER_REPORT_BACKOFF_FACTOR", + "PROBING_CLUSTER_REPORT_BACKOFF", + ] { + std::env::remove_var(key); + } + } + + fn with_env(vars: &[(&str, &str)], f: F) { + let _guard = ENV_LOCK.lock().unwrap(); + clear_backoff_env(); + for (k, v) in vars { + std::env::set_var(k, v); + } + f(); + clear_backoff_env(); + } + + #[test] + fn interval_doubles_when_stable() { + with_env( + &[ + ("PROBING_CLUSTER_REPORT_INTERVAL_SEC", "10"), + ("PROBING_CLUSTER_STALE_SEC", "90"), + ("PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC", "120"), + ], + || { + let mut b = ReportBackoff::new(); + assert_eq!(b.sleep_duration(), Duration::from_secs(10)); + b.record(ReportOutcome::SuccessStable); + assert_eq!(b.sleep_duration(), Duration::from_secs(20)); + b.record(ReportOutcome::SuccessStable); + assert_eq!(b.sleep_duration(), Duration::from_secs(40)); + }, + ); + } + + #[test] + fn failure_resets_streak() { + with_env(&[("PROBING_CLUSTER_STALE_SEC", "90")], || { + let mut b = ReportBackoff::new(); + b.record(ReportOutcome::SuccessStable); + b.record(ReportOutcome::SuccessStable); + b.record(ReportOutcome::Failed); + assert_eq!(b.sleep_duration(), Duration::from_secs(10)); + }); + } + + #[test] + fn max_respects_stale_ttl() { + with_env( + &[ + ("PROBING_CLUSTER_STALE_SEC", "25"), + ("PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC", "120"), + ], + || { + assert!(max_report_interval_secs() <= 25); + }, + ); + } +} diff --git a/probing/server/src/lib.rs b/probing/server/src/lib.rs index 1396a673..a78ad197 100644 --- a/probing/server/src/lib.rs +++ b/probing/server/src/lib.rs @@ -1,18 +1,25 @@ mod asset; // Make auth module public for integration tests pub mod auth; +pub mod cluster_http; +mod cluster_report_backoff; mod engine; mod extensions; pub mod memtable_ext; mod report; // Make server module public for integration tests in tests/ directory pub mod server; +mod torchrun_cluster; mod vars; pub use self::report::start_report_worker; pub use self::server::start_local; pub use self::server::start_remote; pub use self::server::sync_env_settings; +pub use self::torchrun_cluster::{ + is_torchrun_cluster_active, master_http_base, maybe_start_torchrun_cluster, + refresh_torchrun_role, +}; pub fn cleanup() -> anyhow::Result<()> { let prefix = std::env::var("PROBING_CTRL_ROOT").unwrap_or("/tmp/probing/".to_string()); diff --git a/probing/server/src/report.rs b/probing/server/src/report.rs index 2dff0948..e5d983a7 100644 --- a/probing/server/src/report.rs +++ b/probing/server/src/report.rs @@ -1,10 +1,10 @@ -use std::time::Duration; - use anyhow::Result; -use super::vars::PROBING_ADDRESS; +use super::vars::read_probing_address; +use crate::cluster_http::{get_i32_env, put_nodes_blocking}; +use crate::cluster_report_backoff::{classify_report_outcome, ReportBackoff, ReportOutcome}; use crate::server::SERVER_RUNTIME; -use probing_proto::prelude::Node; +use probing_proto::prelude::{Node, NodeReportResponse}; pub fn get_hostname() -> Result { let uname = nix::sys::utsname::uname()?; @@ -12,76 +12,108 @@ pub fn get_hostname() -> Result { Ok(hostname) } +fn cluster_report_enabled() -> bool { + match std::env::var("PROBING_CLUSTER_REPORT") { + Ok(val) => { + let lower = val.trim().to_ascii_lowercase(); + !matches!(lower.as_str(), "0" | "false" | "no" | "off") + } + Err(_) => true, + } +} + pub fn start_report_worker(report_addr: String, local_addr: String) { + if !cluster_report_enabled() { + log::info!("cluster report worker disabled (PROBING_CLUSTER_REPORT=0)"); + return; + } + if crate::torchrun_cluster::is_torchrun_cluster_active() { + log::debug!("skip flat report worker: torchrun hierarchical cluster active"); + return; + } log::debug!("start report worker: {local_addr} => {report_addr}"); SERVER_RUNTIME.spawn(report_worker(report_addr, local_addr)); } async fn report_worker(report_addr: String, local_addr: String) { - let mut interval = tokio::time::interval(tokio::time::Duration::from_secs(10)); + let mut backoff = ReportBackoff::new(); loop { - interval.tick().await; + let report_url = format!("http://{report_addr}/apis/nodes"); + let node = build_local_node(&local_addr); + let rank = node.rank.unwrap_or(-1); - let report_addr = format!("http://{report_addr}/apis/nodes"); - let hostname = get_hostname().unwrap_or("localhost".to_string()); - let address = { - let probing_address = PROBING_ADDRESS.read().unwrap_or_else(|e| { - log::error!("Failed to acquire read lock on PROBING_ADDRESS: {e}"); - panic!("Lock poisoned: {e}") - }); - if !probing_address.is_empty() { - probing_address.clone() - } else { - local_addr.clone() + let outcome = if rank == 0 && report_addr == local_addr { + let node = node.clone(); + match tokio::task::spawn_blocking(move || { + probing_core::core::cluster::apply_node_report(vec![node]) + }) + .await + { + Ok(snapshot) => classify_report_outcome(true, true, Some(&snapshot)), + Err(_) => ReportOutcome::Failed, } - }; - let node = Node { - host: hostname, - addr: address, - local_rank: get_i32_env("LOCAL_RANK"), - rank: get_i32_env("RANK"), - world_size: get_i32_env("WORLD_SIZE"), - group_rank: get_i32_env("GROUP_RANK"), - group_world_size: get_i32_env("GROUP_WORLD_SIZE"), - role_name: std::env::var("ROLE_NAME").ok(), - role_rank: get_i32_env("ROLE_RANK"), - role_world_size: get_i32_env("ROLE_WORLD_SIZE"), - // Parallel-role key is populated by the Python torchrun registration - // path (probing.parallel.current_role); env-only report leaves it unset. - role: None, - status: Some("running".to_string()), - timestamp: 0, - }; - - log::debug!("reporting node status to {report_addr}: {node:?}"); - if node.rank == Some(0) { - probing_core::core::cluster::update_node(node); } else { - let node_display = format!("{node}"); - match request_remote(&report_addr, node).await { + match request_remote(&report_url, vec![node]).await { Ok(reply) => { - log::debug!("node status reported to {report_addr}: {reply:?}"); + log::debug!( + "node status reported to {report_url}: version={}", + reply.version + ); + classify_report_outcome(true, true, Some(&reply)) } Err(err) => { - log::error!("failed to report {node_display} to {report_addr}, {err}"); + log::error!("failed to report to {report_url}: {err}"); + ReportOutcome::Failed } } + }; + + let sleep_for = { + backoff.record(outcome); + backoff.sleep_duration() + }; + tokio::time::sleep(sleep_for).await; + } +} + +pub(crate) fn build_local_node(local_addr: &str) -> Node { + let hostname = get_hostname().unwrap_or_else(|_| "localhost".to_string()); + let address = { + let probing_address = read_probing_address(); + if !probing_address.is_empty() { + probing_address.clone() + } else { + local_addr.to_string() } + }; + Node { + host: hostname, + addr: address, + local_rank: get_i32_env("LOCAL_RANK"), + rank: get_i32_env("RANK"), + world_size: get_i32_env("WORLD_SIZE"), + group_rank: get_i32_env("GROUP_RANK").or_else(|| get_i32_env("NODE_RANK")), + group_world_size: get_i32_env("GROUP_WORLD_SIZE"), + role_name: std::env::var("ROLE_NAME").ok(), + role_rank: get_i32_env("ROLE_RANK"), + role_world_size: get_i32_env("ROLE_WORLD_SIZE"), + role: std::env::var("PROBING_NODE_ROLE") + .ok() + .filter(|s| !s.trim().is_empty()), + status: Some("running".to_string()), + timestamp: 0, } } -fn get_i32_env(name: &str) -> Option { - std::env::var(name).unwrap_or_default().parse().ok() +async fn request_remote(url: &str, nodes: Vec) -> Result { + let url = url.to_string(); + tokio::task::spawn_blocking(move || request_remote_blocking(&url, nodes)) + .await + .map_err(|e| anyhow::anyhow!("cluster report spawn_blocking failed: {e}"))? } -async fn request_remote(url: &str, node: Node) -> Result { - Ok(ureq::put(url) - .config() - .no_delay(true) - .timeout_global(Some(Duration::from_millis(100))) - .build() - .send_json(node)? - .body_mut() - .read_to_string()?) +fn request_remote_blocking(url: &str, nodes: Vec) -> Result { + let base = url.strip_suffix("/apis/nodes").unwrap_or(url); + put_nodes_blocking(base, nodes, probing_core::core::cluster::cluster_version()) } diff --git a/probing/server/src/server/cluster.rs b/probing/server/src/server/cluster.rs index ab1b87b8..f474234f 100644 --- a/probing/server/src/server/cluster.rs +++ b/probing/server/src/server/cluster.rs @@ -1,12 +1,30 @@ -use probing_core::core::cluster::{get_nodes as core_get_nodes, update_node}; -use probing_proto::prelude::*; +use probing_core::core::cluster::{apply_node_report, get_nodes as core_get_nodes}; +use probing_proto::prelude::{Node, NodeReportRequest, NodeReportResponse}; +use serde::Deserialize; -use super::error::ApiResult; +use super::error::{ApiError, ApiResult}; -/// Update a node in the cluster (HTTP handler) -pub async fn put_node(axum::Json(node): axum::Json) -> ApiResult<()> { - update_node(node); - Ok(()) +#[derive(Debug, Deserialize)] +#[serde(untagged)] +pub(crate) enum PutNodesBody { + Batch(NodeReportRequest), + Single(Node), +} + +/// Register or heartbeat one or more cluster nodes; returns merged snapshot. +/// +/// Cluster merge runs on the blocking pool so the shared Tokio runtime stays responsive. +pub(crate) async fn put_node( + axum::Json(body): axum::Json, +) -> ApiResult> { + let nodes = match body { + PutNodesBody::Single(node) => vec![node], + PutNodesBody::Batch(req) => req.nodes, + }; + let resp = tokio::task::spawn_blocking(move || apply_node_report(nodes)) + .await + .map_err(|e| ApiError::internal(format!("cluster report task failed: {e}")))?; + Ok(axum::Json(resp)) } /// Get all nodes in the cluster as JSON diff --git a/probing/server/src/server/cluster_fanout.rs b/probing/server/src/server/cluster_fanout.rs index 23faeb96..3ce31fb9 100644 --- a/probing/server/src/server/cluster_fanout.rs +++ b/probing/server/src/server/cluster_fanout.rs @@ -6,7 +6,7 @@ //! Single-table queries route through the `global` catalog (DataFusion federation). //! JOIN / multi-statement SQL still uses the legacy per-node broadcast path. -use probing_core::core::cluster::get_nodes; +use probing_core::core::cluster::{get_nodes, is_node_alive, local_addr_label, local_listen_addrs}; use probing_core::core::federation::{ can_fanout_via_global_catalog, remote_query_timeout, reset_fanout_stats, rewrite_sql_for_global_fanout, take_fanout_stats, @@ -15,27 +15,10 @@ use probing_proto::prelude::*; use crate::engine::handle_query; -pub fn local_listen_addrs() -> Vec { - let mut addrs = Vec::new(); - if let Ok(addr) = crate::vars::PROBING_ADDRESS.read() { - if !addr.is_empty() { - addrs.push(addr.clone()); - } - } - addrs -} - -pub fn local_host_label() -> String { +fn local_host_label() -> String { crate::report::get_hostname().unwrap_or_else(|_| "localhost".into()) } -pub fn local_addr_label() -> String { - local_listen_addrs() - .into_iter() - .next() - .unwrap_or_else(|| "127.0.0.1:8080".into()) -} - pub async fn query_local_df(sql: &str) -> anyhow::Result { match handle_query(Query { expr: sql.to_string(), @@ -159,6 +142,7 @@ async fn broadcast_fanout_query(sql: &str) -> anyhow::Result = get_nodes() .into_iter() + .filter(is_node_alive) .filter(|node| !local_addrs.contains(&node.addr)) .collect(); @@ -211,50 +195,7 @@ fn tag_dataframe(mut df: DataFrame, host: &str, addr: &str, rank: Option) - } fn merge_tagged_dataframes(parts: &[DataFrame]) -> DataFrame { - let mut out = DataFrame::default(); - for df in parts { - if df.is_empty() { - continue; - } - if out.is_empty() { - out = df.clone(); - continue; - } - append_dataframe(&mut out, df); - } - out.size = out.len() as u64; - out -} - -fn append_dataframe(base: &mut DataFrame, other: &DataFrame) { - if other.is_empty() { - return; - } - if base.is_empty() { - *base = other.clone(); - return; - } - - let other_rows = other.len(); - for name in &other.names { - if !base.names.contains(name) { - base.names.push(name.clone()); - base.cols - .push(Seq::SeqText(vec![String::new(); base.len()])); - } - } - for (col_idx, name) in base.names.clone().iter().enumerate() { - let src_idx = other.names.iter().position(|n| n == name); - for row in 0..other_rows { - let ele = src_idx - .and_then(|i| other.cols.get(i).map(|c| c.get(row))) - .unwrap_or(Ele::Nil); - if let Some(col) = base.cols.get_mut(col_idx) { - let _ = col.append(ele); - } - } - } - base.size = base.len() as u64; + probing_proto::types::merge_dataframes(parts) } #[cfg(test)] diff --git a/probing/server/src/server/mod.rs b/probing/server/src/server/mod.rs index f0c33ecc..8855c386 100644 --- a/probing/server/src/server/mod.rs +++ b/probing/server/src/server/mod.rs @@ -120,13 +120,10 @@ pub async fn remote_server(addr: Option) -> Result<()> { match listener.local_addr() { Ok(addr) => { { - let mut probing_address = - crate::vars::PROBING_ADDRESS.write().unwrap_or_else(|e| { - log::error!("Failed to acquire write lock on PROBING_ADDRESS: {e}"); - panic!("Lock poisoned: {e}") - }); + let mut probing_address = crate::vars::write_probing_address(); *probing_address = addr.to_string(); } + probing_core::core::cluster::set_local_listen_addrs(vec![addr.to_string()]); eprintln!("{}", Red.bold().paint("probing server is available on:")); eprintln!("\t{}", Green.bold().underline().paint(addr.to_string())); probing_core::config::write("server.address", &addr.to_string()).await?; diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index 55ad96de..0d2eaa5f 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -64,8 +64,8 @@ pub async fn get_step_matrix( let sql = STEP_MATRIX_SQL.to_string(); let fanout = cluster_fanout::fanout_query(&sql, cluster).await?; - let host = cluster_fanout::local_host_label(); - let addr = cluster_fanout::local_addr_label(); + let host = crate::report::get_hostname().unwrap_or_else(|_| "localhost".into()); + let addr = probing_core::core::cluster::local_addr_label(); let samples = aggregate_step_samples(&parse_step_df(&fanout.dataframe, &host, &addr), step_window); diff --git a/probing/server/src/torchrun_cluster.rs b/probing/server/src/torchrun_cluster.rs new file mode 100644 index 00000000..d16f0c65 --- /dev/null +++ b/probing/server/src/torchrun_cluster.rs @@ -0,0 +1,640 @@ +//! Hierarchical torchrun cluster heartbeat (side channel; does not touch torch rendezvous keys). +//! +//! Keys live under ``probing/torchrun//`` on the job TCPStore. +//! +//! Heartbeat interval uses exponential backoff when membership is stable (see +//! ``cluster_report_backoff``). Env: +//! - ``PROBING_CLUSTER_REPORT_INTERVAL_SEC``: base interval (default 10) +//! - ``PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC``: backoff cap (default 120, clamped below stale TTL) +//! - ``PROBING_CLUSTER_REPORT_BACKOFF_FACTOR``: multiplier per stable tick (default 2) +//! - ``PROBING_CLUSTER_REPORT_BACKOFF``: set ``0`` to disable backoff +//! - ``PROBING_CLUSTER_STALE_SEC``: node dead threshold (default 25; should exceed max interval) + +use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; +use std::sync::{LazyLock, Mutex}; +use std::time::Duration; + +use anyhow::{Context, Result}; +use probing_proto::prelude::Node; +use probing_store::store::TCPStore; +use serde::{Deserialize, Serialize}; + +use crate::cluster_http::{fetch_nodes_blocking, get_i32_env, put_nodes_blocking}; +use crate::cluster_report_backoff::{ + base_report_interval_secs, classify_report_outcome, ReportBackoff, ReportOutcome, +}; +use crate::report::{build_local_node, get_hostname}; +use crate::server::SERVER_RUNTIME; +use crate::start_remote; +use crate::vars::read_probing_address; + +static STARTED: AtomicBool = AtomicBool::new(false); +static CLUSTER_VERSION: AtomicU64 = AtomicU64::new(0); + +static MASTER_INFO: LazyLock>> = LazyLock::new(|| Mutex::new(None)); +static LOCAL0_PARENT: LazyLock>> = LazyLock::new(|| Mutex::new(None)); +static REPORT_BACKOFF: LazyLock> = + LazyLock::new(|| Mutex::new(ReportBackoff::new())); + +#[derive(Debug, Clone, Deserialize, Serialize)] +struct StoreHttpInfo { + addr: String, + http_base: String, + #[serde(default)] + bound: String, +} + +fn torchrun_cluster_enabled() -> bool { + match std::env::var("PROBING_TORCHRUN_CLUSTER") { + Ok(val) => { + let lower = val.trim().to_ascii_lowercase(); + !matches!(lower.as_str(), "0" | "false" | "no") + } + Err(_) => true, + } +} + +fn cluster_report_enabled() -> bool { + match std::env::var("PROBING_CLUSTER_REPORT") { + Ok(val) => { + let lower = val.trim().to_ascii_lowercase(); + !matches!(lower.as_str(), "0" | "false" | "no" | "off") + } + Err(_) => true, + } +} + +fn discover_timeout_secs() -> f64 { + std::env::var("PROBING_CLUSTER_DISCOVER_TIMEOUT_SEC") + .ok() + .and_then(|v| v.trim().parse::().ok()) + .unwrap_or(2.0) + .max(0.1_f64) +} + +fn is_elastic_supervisor() -> bool { + if std::env::var("LOCAL_RANK").is_ok() || std::env::var("RANK").is_ok() { + return false; + } + if std::env::var("TORCHELASTIC_RUN_ID").is_ok() { + return true; + } + std::env::args().any(|arg| { + let a = arg.as_str(); + a.ends_with("torchrun") || a.contains("torch/distributed/run") + }) +} + +fn world_size() -> i32 { + get_i32_env("WORLD_SIZE").unwrap_or(1) +} + +fn global_rank() -> i32 { + get_i32_env("RANK").unwrap_or(0) +} + +fn local_rank() -> i32 { + get_i32_env("LOCAL_RANK").unwrap_or(0) +} + +fn is_global_rank0() -> bool { + global_rank() == 0 +} + +fn node_rank() -> i32 { + get_i32_env("GROUP_RANK") + .or_else(|| get_i32_env("NODE_RANK")) + .unwrap_or(0) +} + +fn run_prefix() -> String { + let run_id = std::env::var("TORCHELASTIC_RUN_ID") + .ok() + .filter(|s| !s.is_empty()) + .or_else(|| std::env::var("RDZV_ID").ok().filter(|s| !s.is_empty())) + .or_else(|| std::env::var("MASTER_PORT").ok().filter(|s| !s.is_empty())) + .unwrap_or_else(|| "run".to_string()); + format!("probing/torchrun/{run_id}") +} + +fn master_store_key() -> String { + format!("{}/master", run_prefix()) +} + +fn local0_store_key() -> String { + format!("{}/node/{}/local0", run_prefix(), node_rank()) +} + +fn rendezvous_endpoint() -> Option { + let host = std::env::var("MASTER_ADDR") + .ok() + .filter(|s| !s.is_empty())?; + let port = std::env::var("MASTER_PORT") + .ok() + .filter(|s| !s.is_empty())?; + Some(format!("{host}:{port}")) +} + +fn bind_spec() -> String { + if is_global_rank0() { + if let Ok(port) = std::env::var("PROBING_PORT") { + let port = port.trim(); + if !port.is_empty() + && !port.eq_ignore_ascii_case("random") + && port.parse::().is_ok() + { + return format!("0.0.0.0:{port}"); + } + } + } + "0.0.0.0:0".to_string() +} + +fn reachable_addr(bound: &str) -> String { + let Some((host, port)) = bound.rsplit_once(':') else { + return bound.to_string(); + }; + let host = host.trim().trim_matches(['[', ']']); + if matches!(host, "0.0.0.0" | "::" | "" | "*") { + let master = std::env::var("MASTER_ADDR").unwrap_or_default(); + let master = master.trim(); + if master == "127.0.0.1" || master == "localhost" { + return format!("{master}:{port}"); + } + if !master.is_empty() { + return format!("{master}:{port}"); + } + return format!( + "{}:{port}", + get_hostname().unwrap_or_else(|_| "localhost".into()) + ); + } + format!("{host}:{port}") +} + +fn local_http_base() -> String { + let bound = read_probing_address().clone(); + format!("http://{}", reachable_addr(&bound)) +} + +fn parallel_role_from_env() -> Option { + std::env::var("PROBING_NODE_ROLE") + .ok() + .filter(|s| !s.trim().is_empty()) + .map(|s| s.trim().to_string()) +} + +fn build_torchrun_node() -> Node { + let bound = read_probing_address().clone(); + let mut node = build_local_node(&bound); + node.addr = reachable_addr(&node.addr); + node.role = parallel_role_from_env(); + node +} + +fn store_client() -> Option { + rendezvous_endpoint().map(|ep| TCPStore::new(ep).with_key_prefix("")) +} + +async fn store_set(key: &str, value: &str) -> Result<()> { + let store = store_client().context("MASTER_ADDR/MASTER_PORT not set")?; + store + .set(key, value) + .await + .map_err(|e| anyhow::anyhow!("{e}")) +} + +async fn store_get(key: &str) -> Result> { + let store = store_client().context("MASTER_ADDR/MASTER_PORT not set")?; + match store.get(key).await { + Ok(v) => Ok(Some(v)), + Err(e) => { + log::debug!("torchrun cluster store get {key}: {e}"); + Ok(None) + } + } +} + +async fn wait_for_local_address(timeout: Duration) -> bool { + let deadline = tokio::time::Instant::now() + timeout; + while tokio::time::Instant::now() < deadline { + if read_probing_address().contains(':') { + return true; + } + tokio::time::sleep(Duration::from_millis(50)).await; + } + false +} + +async fn publish_master() -> Result<()> { + if !is_global_rank0() { + return Ok(()); + } + let bound = read_probing_address().clone(); + let reachable = reachable_addr(&bound); + let info = StoreHttpInfo { + addr: reachable.clone(), + http_base: format!("http://{reachable}"), + bound, + }; + store_set( + &master_store_key(), + &serde_json::to_string(&info).context("serialize master info")?, + ) + .await?; + *MASTER_INFO.lock().unwrap() = Some(info); + log::info!( + "probing torchrun: published master at {} (key={})", + reachable, + master_store_key() + ); + Ok(()) +} + +async fn publish_local0() -> Result<()> { + if local_rank() != 0 { + return Ok(()); + } + let bound = read_probing_address().clone(); + let reachable = reachable_addr(&bound); + let info = serde_json::json!({ + "addr": reachable, + "http_base": format!("http://{reachable}"), + "bound": bound, + "node_rank": node_rank(), + }); + store_set(&local0_store_key(), &info.to_string()).await?; + log::info!( + "probing torchrun: published local0 at {} (key={})", + reachable, + local0_store_key() + ); + Ok(()) +} + +async fn poll_master_info(timeout: Duration) -> Option { + if is_global_rank0() { + let bound = read_probing_address().clone(); + let reachable = reachable_addr(&bound); + return Some(StoreHttpInfo { + addr: reachable.clone(), + http_base: format!("http://{reachable}"), + bound, + }); + } + let deadline = tokio::time::Instant::now() + timeout; + let key = master_store_key(); + while tokio::time::Instant::now() < deadline { + if let Ok(Some(raw)) = store_get(&key).await { + if let Ok(info) = serde_json::from_str::(&raw) { + if !info.http_base.is_empty() { + log::info!( + "probing torchrun: rank {} discovered master {}", + global_rank(), + info.addr + ); + return Some(info); + } + } + } + tokio::time::sleep(Duration::from_millis(100)).await; + } + None +} + +async fn poll_local0_parent(timeout: Duration) -> Option { + if local_rank() == 0 { + return Some(local_http_base()); + } + let deadline = tokio::time::Instant::now() + timeout; + let key = local0_store_key(); + while tokio::time::Instant::now() < deadline { + if let Ok(Some(raw)) = store_get(&key).await { + if let Ok(info) = serde_json::from_str::(&raw) { + if !info.http_base.is_empty() { + return Some(info.http_base); + } + } + } + tokio::time::sleep(Duration::from_millis(100)).await; + } + None +} + +fn local_group_nodes(nodes: &[Node]) -> Vec { + let grp = node_rank(); + nodes + .iter() + .filter(|n| n.group_rank == Some(grp)) + .cloned() + .collect() +} + +fn local_leaf_nodes(nodes: &[Node]) -> Vec { + let self_rank = global_rank(); + local_group_nodes(nodes) + .into_iter() + .filter(|n| n.rank != Some(self_rank)) + .collect() +} + +fn merge_self_into_nodes(mut nodes: Vec) -> Vec { + let self_node = build_torchrun_node(); + let self_rank = self_node.rank; + if let Some(rank) = self_rank { + if nodes.iter().any(|n| n.rank == Some(rank)) { + return nodes; + } + } + nodes.insert(0, self_node); + nodes +} + +fn nodes_for_upstream_report() -> Vec { + if local_rank() != 0 { + return vec![build_torchrun_node()]; + } + let local_base = local_http_base(); + let store_nodes = fetch_nodes_blocking(&local_base).unwrap_or_default(); + let leaves = local_leaf_nodes(&store_nodes); + if leaves.is_empty() { + vec![build_torchrun_node()] + } else { + merge_self_into_nodes(leaves) + } +} + +fn report_parent_http() -> Option { + if local_rank() != 0 { + return LOCAL0_PARENT.lock().unwrap().clone(); + } + if is_global_rank0() { + return Some(local_http_base()); + } + MASTER_INFO + .lock() + .unwrap() + .as_ref() + .map(|m| m.http_base.clone()) +} + +fn ensure_master_info() -> bool { + if MASTER_INFO.lock().unwrap().is_some() { + return true; + } + let timeout = Duration::from_secs_f64(discover_timeout_secs()); + if let Some(info) = SERVER_RUNTIME.block_on(poll_master_info(timeout)) { + *MASTER_INFO.lock().unwrap() = Some(info); + return true; + } + false +} + +fn ensure_local0_parent() -> bool { + if local_rank() == 0 { + return true; + } + if LOCAL0_PARENT.lock().unwrap().is_some() { + return true; + } + let timeout = Duration::from_secs_f64(discover_timeout_secs()); + if let Some(base) = SERVER_RUNTIME.block_on(poll_local0_parent(timeout)) { + *LOCAL0_PARENT.lock().unwrap() = Some(base); + return true; + } + false +} + +fn apply_global_snapshot(resp: &probing_proto::prelude::NodeReportResponse) { + if resp.nodes.is_empty() { + return; + } + let local_base = local_http_base(); + let version = resp.version; + if let Err(err) = put_nodes_blocking(&local_base, resp.nodes.clone(), version) { + log::debug!("probing torchrun: apply global snapshot failed: {err}"); + } else { + CLUSTER_VERSION.store(version, Ordering::Relaxed); + } +} + +fn report_once() -> ReportOutcome { + if !ensure_master_info() || !ensure_local0_parent() { + return ReportOutcome::Skipped; + } + let Some(parent) = report_parent_http() else { + return ReportOutcome::Skipped; + }; + let nodes = nodes_for_upstream_report(); + let seen = CLUSTER_VERSION.load(Ordering::Relaxed); + match put_nodes_blocking(&parent, nodes, seen) { + Ok(resp) => { + CLUSTER_VERSION.store(resp.version, Ordering::Relaxed); + if global_rank() != 0 && local_rank() == 0 && !resp.nodes.is_empty() { + apply_global_snapshot(&resp); + } + classify_report_outcome(true, true, Some(&resp)) + } + Err(err) => { + log::warn!("probing torchrun: cluster report failed: {err}"); + ReportOutcome::Failed + } + } +} + +async fn hierarchical_report_worker() { + let stagger = (global_rank().min(8) as f64) * 0.15; + tokio::time::sleep(Duration::from_secs_f64(stagger)).await; + + loop { + let outcome = tokio::task::spawn_blocking(report_once) + .await + .unwrap_or(ReportOutcome::Failed); + let sleep_for = { + let mut backoff = REPORT_BACKOFF.lock().unwrap(); + backoff.record(outcome); + backoff.sleep_duration() + }; + tokio::time::sleep(sleep_for).await; + } +} + +async fn torchrun_setup() -> Result<()> { + if !wait_for_local_address(Duration::from_secs(10)).await { + log::warn!("probing torchrun: HTTP server did not bind in time"); + return Ok(()); + } + + publish_master().await.ok(); + publish_local0().await.ok(); + + if !cluster_report_enabled() { + log::info!("probing torchrun: periodic cluster report disabled (PROBING_CLUSTER_REPORT=0)"); + return Ok(()); + } + + log::info!( + "probing torchrun: hierarchical report worker started (base_interval={}s, max={}s, backoff=on)", + base_report_interval_secs(), + crate::cluster_report_backoff::max_report_interval_secs() + ); + hierarchical_report_worker().await; + Ok(()) +} + +/// Whether hierarchical torchrun cluster heartbeat is running. +pub fn is_torchrun_cluster_active() -> bool { + STARTED.load(Ordering::SeqCst) +} + +/// Start HTTP bind + hierarchical cluster heartbeat when ``WORLD_SIZE > 1`` (idempotent). +pub fn maybe_start_torchrun_cluster() { + if !torchrun_cluster_enabled() || is_elastic_supervisor() || world_size() <= 1 { + return; + } + if STARTED.swap(true, Ordering::SeqCst) { + return; + } + + let bind = bind_spec(); + log::debug!("probing torchrun: binding HTTP at {bind}"); + start_remote(Some(bind)); + + SERVER_RUNTIME.spawn(async { + if let Err(err) = torchrun_setup().await { + log::warn!("probing torchrun cluster setup failed: {err}"); + } + }); +} + +/// Trigger one heartbeat (e.g. after ``set_role``). +pub fn refresh_torchrun_role() -> bool { + if !STARTED.load(Ordering::SeqCst) { + return false; + } + REPORT_BACKOFF.lock().unwrap().reset(); + SERVER_RUNTIME.spawn(async { + let outcome = tokio::task::spawn_blocking(report_once) + .await + .unwrap_or(ReportOutcome::Failed); + let mut backoff = REPORT_BACKOFF.lock().unwrap(); + backoff.record(outcome); + }); + true +} + +/// Master HTTP base URL when this process is global rank 0. +pub fn master_http_base() -> Option { + MASTER_INFO + .lock() + .unwrap() + .as_ref() + .map(|m| m.http_base.clone()) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::sync::{LazyLock, Mutex}; + + static ENV_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); + + fn clear_torchrun_env() { + for key in [ + "RDZV_ID", + "TORCHELASTIC_RUN_ID", + "MASTER_PORT", + "NODE_RANK", + "GROUP_RANK", + "RANK", + "LOCAL_RANK", + "PROBING_PORT", + "MASTER_ADDR", + ] { + std::env::remove_var(key); + } + } + + #[test] + fn run_prefix_uses_rdzv_id() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_torchrun_env(); + std::env::set_var("RDZV_ID", "probing-29680"); + assert_eq!(run_prefix(), "probing/torchrun/probing-29680"); + } + + #[test] + fn local0_store_key_includes_node_rank() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_torchrun_env(); + std::env::set_var("TORCHELASTIC_RUN_ID", "job-x"); + std::env::set_var("NODE_RANK", "3"); + assert_eq!(local0_store_key(), "probing/torchrun/job-x/node/3/local0"); + } + + #[test] + fn merge_self_is_idempotent() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_torchrun_env(); + std::env::set_var("RANK", "0"); + std::env::set_var("LOCAL_RANK", "0"); + let self_node = Node { + rank: Some(0), + addr: "127.0.0.1:1".into(), + ..Default::default() + }; + let nodes = vec![ + self_node.clone(), + Node { + rank: Some(1), + ..Default::default() + }, + ]; + let merged = merge_self_into_nodes(nodes.clone()); + assert_eq!(merged.len(), 2); + } + + #[test] + fn local_group_and_leaf_filters() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_torchrun_env(); + std::env::set_var("GROUP_RANK", "3"); + std::env::set_var("RANK", "24"); + let store: Vec = (0..40) + .map(|i| Node { + rank: Some(i), + group_rank: Some(i / 8), + ..Default::default() + }) + .collect(); + let grp: std::collections::HashSet<_> = local_group_nodes(&store) + .into_iter() + .filter_map(|n| n.rank) + .collect(); + assert_eq!(grp, (24..=31).collect()); + let leaves: std::collections::HashSet<_> = local_leaf_nodes(&store) + .into_iter() + .filter_map(|n| n.rank) + .collect(); + assert_eq!(leaves, (25..=31).collect()); + } + + #[test] + fn reachable_addr_maps_unspecified_bind() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_torchrun_env(); + std::env::set_var("MASTER_ADDR", "10.0.0.1"); + assert_eq!(reachable_addr("0.0.0.0:9922"), "10.0.0.1:9922"); + } + + #[test] + fn bind_spec_global_rank0_uses_probing_port() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_torchrun_env(); + std::env::set_var("RANK", "0"); + std::env::set_var("PROBING_PORT", "18080"); + assert_eq!(bind_spec(), "0.0.0.0:18080"); + std::env::set_var("RANK", "1"); + assert_eq!(bind_spec(), "0.0.0.0:0"); + } +} diff --git a/probing/server/src/vars.rs b/probing/server/src/vars.rs index 5daf5590..53c316c0 100644 --- a/probing/server/src/vars.rs +++ b/probing/server/src/vars.rs @@ -1,4 +1,14 @@ -use std::sync::{LazyLock, RwLock}; +use std::sync::{LazyLock, RwLock, RwLockReadGuard, RwLockWriteGuard}; + +use probing_core::sync::{read_rwlock, write_rwlock}; pub static PROBING_ADDRESS: LazyLock> = LazyLock::new(|| RwLock::new(Default::default())); + +pub fn read_probing_address() -> RwLockReadGuard<'static, String> { + read_rwlock(&PROBING_ADDRESS, "PROBING_ADDRESS") +} + +pub fn write_probing_address() -> RwLockWriteGuard<'static, String> { + write_rwlock(&PROBING_ADDRESS, "PROBING_ADDRESS") +} diff --git a/probing/server/tests/hierarchical_cluster_report.rs b/probing/server/tests/hierarchical_cluster_report.rs new file mode 100644 index 00000000..0a15d9a0 --- /dev/null +++ b/probing/server/tests/hierarchical_cluster_report.rs @@ -0,0 +1,170 @@ +//! Hierarchical cluster report integration test (mock HTTP servers + PUT merge path). + +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, LazyLock, Mutex}; +use std::time::{SystemTime, UNIX_EPOCH}; + +use axum::{extract::State, routing::get, Json, Router}; +use probing_proto::prelude::{Cluster, Node, NodeReportRequest, NodeReportResponse}; +use probing_server::cluster_http::{fetch_nodes_blocking, put_nodes_blocking}; +use probing_server::server::SERVER_RUNTIME; +use tokio::net::TcpListener; + +#[derive(Clone)] +struct AppState { + cluster: Arc>, + version: Arc, +} + +static ENV_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); + +fn now_micros() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_micros() as u64 +} + +fn test_node(rank: i32, group_rank: i32, addr: &str) -> Node { + Node { + host: "127.0.0.1".into(), + addr: addr.into(), + rank: Some(rank), + group_rank: Some(group_rank), + world_size: Some(4), + group_world_size: Some(2), + local_rank: Some(rank % 2), + status: Some("running".into()), + timestamp: now_micros(), + ..Default::default() + } +} + +async fn put_nodes_handler( + State(state): State, + Json(body): Json, +) -> Json { + let mut cluster = state.cluster.lock().unwrap(); + for mut node in body.nodes { + if node.timestamp == 0 { + node.timestamp = now_micros(); + } + if node.status.is_none() { + node.status = Some("running".into()); + } + cluster.put(node); + } + let version = state.version.fetch_add(1, Ordering::Relaxed) + 1; + let mut nodes = cluster.list(); + nodes.sort_by_key(|n| n.rank.unwrap_or(i32::MAX)); + Json(NodeReportResponse { + ok: true, + version, + nodes, + removed: vec![], + }) +} + +async fn get_nodes_handler(State(state): State) -> Json> { + let cluster = state.cluster.lock().unwrap(); + let mut nodes = cluster.list(); + nodes.sort_by_key(|n| n.rank.unwrap_or(i32::MAX)); + Json(nodes) +} + +async fn spawn_cluster_server() -> String { + let state = AppState { + cluster: Arc::new(Mutex::new(Cluster::default())), + version: Arc::new(AtomicU64::new(0)), + }; + let app = Router::new() + .route("/apis/nodes", get(get_nodes_handler).put(put_nodes_handler)) + .with_state(state); + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + tokio::spawn(async move { + axum::serve(listener, app).await.unwrap(); + }); + format!("http://{addr}") +} + +/// Mirrors production ``local_leaf_nodes`` for aggregator simulation. +fn aggregator_payload(store: &[Node], self_node: Node) -> Vec { + let group_rank = self_node.group_rank.unwrap_or(0); + let self_rank = self_node.rank.unwrap_or(0); + let leaves: Vec = store + .iter() + .filter(|n| n.group_rank == Some(group_rank) && n.rank != Some(self_rank)) + .cloned() + .collect(); + let mut nodes = if leaves.is_empty() { + vec![self_node.clone()] + } else { + let mut merged = leaves; + if !merged.iter().any(|n| n.rank == self_node.rank) { + merged.insert(0, self_node); + } + merged + }; + nodes.sort_by_key(|n| n.rank.unwrap_or(i32::MAX)); + nodes +} + +fn local_group_ranks(store: &[Node], group_rank: i32) -> Vec { + let mut ranks: Vec = store + .iter() + .filter(|n| n.group_rank == Some(group_rank)) + .filter_map(|n| n.rank) + .collect(); + ranks.sort_unstable(); + ranks +} + +#[test] +fn hierarchical_two_nodes_times_two_gpus_converges_on_master() { + let _guard = ENV_LOCK.lock().unwrap(); + for key in ["RANK", "GROUP_RANK", "LOCAL_RANK"] { + std::env::remove_var(key); + } + + SERVER_RUNTIME.block_on(async { + let master = spawn_cluster_server().await; + let node1_local0 = spawn_cluster_server().await; + + put_nodes_blocking(&master, vec![test_node(1, 0, "127.0.0.1:9101")], 0) + .expect("leaf rank1 put"); + + put_nodes_blocking(&node1_local0, vec![test_node(3, 1, "127.0.0.1:9103")], 0) + .expect("leaf rank3 put"); + + let node0_store = fetch_nodes_blocking(&master).expect("read node0 local store"); + let rank0 = test_node(0, 0, "127.0.0.1:9100"); + let node0_batch = aggregator_payload(&node0_store, rank0); + assert_eq!( + node0_batch + .iter() + .filter_map(|n| n.rank) + .collect::>(), + vec![0, 1] + ); + put_nodes_blocking(&master, node0_batch, 1).expect("rank0 aggregator put"); + + let node1_store = fetch_nodes_blocking(&node1_local0).expect("read node1 local store"); + let rank2 = test_node(2, 1, "127.0.0.1:9102"); + let node1_batch = aggregator_payload(&node1_store, rank2); + assert_eq!( + node1_batch + .iter() + .filter_map(|n| n.rank) + .collect::>(), + vec![2, 3] + ); + put_nodes_blocking(&master, node1_batch, 2).expect("rank2 aggregator put"); + + let snapshot = fetch_nodes_blocking(&master).expect("master snapshot"); + let ranks: Vec = snapshot.iter().filter_map(|n| n.rank).collect(); + assert_eq!(ranks, vec![0, 1, 2, 3]); + + assert_eq!(local_group_ranks(&snapshot, 0), vec![0, 1]); + }); +} diff --git a/python/probing/__init__.py b/python/probing/__init__.py index 455602bc..e2b4e4ad 100644 --- a/python/probing/__init__.py +++ b/python/probing/__init__.py @@ -89,6 +89,13 @@ def is_enabled(): except Exception: pass + try: + from probing.hooks.import_hook import install_and_run_pending + + install_and_run_pending() + except ImportError: + pass + __all__ = [ "VERSION", "ExternalTable", diff --git a/python/probing/ext/torch.py b/python/probing/ext/torch.py index 9ca0509e..3cb39297 100644 --- a/python/probing/ext/torch.py +++ b/python/probing/ext/torch.py @@ -58,33 +58,6 @@ def collective_hook(): _hook_registered = False -_dist_init_patched = False - - -def _patch_dist_init_process_group() -> None: - global _dist_init_patched - if _dist_init_patched: - return - try: - import torch.distributed as dist - except ImportError: - return - - _dist_init_patched = True - original = dist.init_process_group - - def init_process_group(*args, **kwargs): - original(*args, **kwargs) - try: - from probing.torchrun_cluster import maybe_setup_torchrun_cluster - - maybe_setup_torchrun_cluster() - except Exception as exc: - logging.getLogger(__name__).debug( - "probing torchrun cluster setup skipped: %s", exc - ) - - dist.init_process_group = init_process_group # type: ignore[assignment] def init(): @@ -97,7 +70,6 @@ def init(): register_optimizer_step_post_hook(optimizer_step_post_hook) - _patch_dist_init_process_group() collective_hook() try: from probing.crash import install diff --git a/python/probing/hooks/import_hook.py b/python/probing/hooks/import_hook.py index 64e71bad..a5c4702a 100644 --- a/python/probing/hooks/import_hook.py +++ b/python/probing/hooks/import_hook.py @@ -172,5 +172,10 @@ def install(): return finder -# Automatically install the hook -finder = install() +def install_and_run_pending(): + """Install the hook and run callbacks for modules already in ``sys.modules``.""" + install() + for module_name in list(register.keys()): + if module_name in sys.modules and module_name not in triggered: + triggered[module_name] = True + _run_callbacks(module_name) diff --git a/python/probing/inspect/trace.py b/python/probing/inspect/trace.py index f23d169d..cbe2315f 100644 --- a/python/probing/inspect/trace.py +++ b/python/probing/inspect/trace.py @@ -1,4 +1,5 @@ import ctypes +import contextlib import fnmatch import functools import inspect @@ -59,6 +60,26 @@ # Pattern: only allow dotted identifiers (letters, digits, underscore, dot) TRACE_NAME_PATTERN = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_.]*$") +# torch.distributed.reduce_op emits FutureWarning on isinstance/inspect checks. +_SKIP_TRAVERSAL_ATTRS = frozenset({"reduce_op"}) + + +@contextlib.contextmanager +def _ignore_torch_reduce_op_deprecation(): + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + category=FutureWarning, + message=".*torch\\.distributed\\.reduce_op.*", + ) + yield + + +def _should_skip_traversal_attr(prefix: str, key: str) -> bool: + if key not in _SKIP_TRAVERSAL_ATTRS: + return False + return prefix == "torch.distributed" or prefix.startswith("torch.distributed.") + def _validate_trace_name(name: str) -> None: """Raise ValueError if name is not allowed for trace/untrace (security).""" @@ -148,13 +169,8 @@ def get_object_name(obj: Any) -> Optional[str]: The object's __name__ if it's a string, None otherwise """ try: - if hasattr(obj, "__name__"): - with warnings.catch_warnings(): - warnings.filterwarnings( - "ignore", - category=FutureWarning, - message=".*torch.distributed.reduce_op.*", - ) + with _ignore_torch_reduce_op_deprecation(): + if hasattr(obj, "__name__"): name = obj.__name__ if isinstance(name, str): return name @@ -203,16 +219,16 @@ def determine_item_type(obj: Any) -> str: Returns: A single character string: "F", "C", "M", or "V" """ - if inspect.isfunction(obj) or ( - isinstance(obj, FunctionType) and hasattr(obj, "__code__") - ): - return "F" - elif inspect.isclass(obj): - return "C" - elif isinstance(obj, ModuleType): - return "M" - else: - return "V" + with _ignore_torch_reduce_op_deprecation(): + if inspect.isfunction(obj) or ( + isinstance(obj, FunctionType) and hasattr(obj, "__code__") + ): + return "F" + if inspect.isclass(obj): + return "C" + if isinstance(obj, ModuleType): + return "M" + return "V" @staticmethod def should_include_module( @@ -288,6 +304,8 @@ def traverse_object( try: if k.startswith("__"): continue + if _should_skip_traversal_attr(prefix, k): + continue full_path = f"{prefix}.{k}" if prefix else k @@ -481,7 +499,6 @@ def traverse_object( return pass - @classmethod def collect_traceable_items( cls, depth: int, filter_func: Callable[[str], bool] ) -> List[Dict]: diff --git a/python/probing/parallel.py b/python/probing/parallel.py index 094caec0..a314a8c6 100644 --- a/python/probing/parallel.py +++ b/python/probing/parallel.py @@ -188,6 +188,11 @@ def set_role(role=None, **dims) -> str: global _ROLE_OVERRIDE spec = dict(dims) if dims else role _ROLE_OVERRIDE = _normalize_role(spec) + role = _ROLE_OVERRIDE or role_key() + if role: + os.environ["PROBING_NODE_ROLE"] = role + else: + os.environ.pop("PROBING_NODE_ROLE", None) _refresh_cluster_role() return _ROLE_OVERRIDE diff --git a/python/probing/torchrun_cluster.py b/python/probing/torchrun_cluster.py index 0409ffae..41a2f36e 100644 --- a/python/probing/torchrun_cluster.py +++ b/python/probing/torchrun_cluster.py @@ -1,35 +1,13 @@ -""" -Torchrun cluster registration for probing via the rendezvous TCPStore. - -Rank 0 binds the local probing HTTP server, publishes the reachable master -address to the job store, and other ranks ``wait`` then ``PUT /apis/nodes``. - -Requires ``torch.distributed.init_process_group()`` (e.g. ``torchrun``) before -``setup_torchrun_cluster()``. - -Env: -- ``PROBING_TORCHRUN_CLUSTER``: set to ``0`` to disable (default: enable when WORLD_SIZE>1). -- ``PROBING_PORT``: optional listen port for rank 0; other ranks use ephemeral ports. -- ``PROBING_TORCHRUN_STORE_TIMEOUT``: seconds to wait for master key (default 120). -""" +"""Thin Python facade for torchrun cluster registration (Rust implements the worker).""" from __future__ import annotations -import json import logging import os -import socket -import time -import urllib.error -import urllib.request -from datetime import timedelta -from typing import Any logger = logging.getLogger(__name__) _SETUP_DONE = False -_MASTER_KEY_SUFFIX = "master" -_MASTER_INFO: dict[str, str] | None = None def _enabled() -> bool: @@ -42,268 +20,60 @@ def _enabled() -> bool: return True -def _env_int(name: str, default: int = -1) -> int: - raw = os.environ.get(name) - if raw is None or raw == "": - return default - return int(raw) - - -def _run_prefix() -> str: - run_id = ( - os.environ.get("TORCHELASTIC_RUN_ID") - or os.environ.get("RDZV_ID") - or os.environ.get("MASTER_PORT") - or "run" - ) - return f"probing/torchrun/{run_id}" - - -def _master_store_key() -> str: - return f"{_run_prefix()}/{_MASTER_KEY_SUFFIX}" - - -def _rendezvous_store(): - import torch.distributed as dist - import torch.distributed.distributed_c10d as c10d - - if not dist.is_initialized(): - raise RuntimeError( - "torch.distributed must be initialized before probing torchrun cluster setup" - ) - return c10d._get_default_store() - - -def _store_get_str(store, key: str) -> str: - val = store.get(key) - if isinstance(val, bytes): - return val.decode() - return str(val) - - -def _reachable_addr(bound: str) -> str: - """Map a local bind address (e.g. 0.0.0.0:port) to an address peers can use.""" - if ":" not in bound: - return bound - host, port = bound.rsplit(":", 1) - host = host.strip().strip("[]") - if host in ("0.0.0.0", "::", "", "*"): - master = os.environ.get("MASTER_ADDR", "").strip() - if master in ("127.0.0.1", "localhost"): - host = master - else: - host = master or socket.gethostname() - return f"{host}:{port}" - - -def _bind_spec() -> str: - rank = _env_int("RANK", 0) - port = os.environ.get("PROBING_PORT", "").strip() - if rank == 0 and port: - return f"0.0.0.0:{port}" - return "0.0.0.0:0" - - -def _ensure_http_server() -> str: - """Start or reuse the probing HTTP server; return the bound ``host:port``.""" - from probing import config - - existing = config.get_str("server.address") - if existing: - return existing - - bind = _bind_spec() - config.write("probing.server.address", bind) - - deadline = time.monotonic() + 10.0 - while time.monotonic() < deadline: - addr = config.get_str("server.address") - if addr and ":" in addr: - return addr - time.sleep(0.05) - - raise TimeoutError(f"probing HTTP server did not bind (requested {bind})") - - -def _optional_env_int(name: str) -> int | None: - raw = os.environ.get(name) - if raw is None or raw == "": - return None - return int(raw) - - -def _node_payload(local_addr: str) -> dict[str, Any]: - from probing.parallel import current_role - - host = socket.gethostname() - return { - "host": host, - "addr": local_addr, - "local_rank": _optional_env_int("LOCAL_RANK"), - "rank": _optional_env_int("RANK"), - "world_size": _optional_env_int("WORLD_SIZE"), - "group_rank": _optional_env_int("GROUP_RANK"), - "group_world_size": _optional_env_int("GROUP_WORLD_SIZE"), - "role_name": os.environ.get("ROLE_NAME"), - "role_rank": _optional_env_int("ROLE_RANK"), - "role_world_size": _optional_env_int("ROLE_WORLD_SIZE"), - # Parallel role key (e.g. "dp=2,pp=1,tp=0"); surfaces as federation _role. - "role": current_role() or None, - "status": "running", - "timestamp": int(time.time() * 1_000_000), - } - - -def _put_node(master_http: str, node: dict[str, Any]) -> None: - url = f"{master_http.rstrip('/')}/apis/nodes" - body = json.dumps(node).encode("utf-8") - req = urllib.request.Request( - url, - data=body, - headers={"Content-Type": "application/json"}, - method="PUT", - ) - with urllib.request.urlopen(req, timeout=10) as resp: - if resp.status >= 400: - raise RuntimeError(f"PUT {url} failed: HTTP {resp.status}") - - -def publish_master() -> dict[str, str]: - """Rank 0: bind probing HTTP and publish reachable master info to the job store.""" - import torch.distributed as dist - - if dist.get_rank() != 0: - raise RuntimeError("publish_master() must be called on rank 0") - - bound = _ensure_http_server() - reachable = _reachable_addr(bound) - info = { - "addr": reachable, - "http_base": f"http://{reachable}", - "bound": bound, - } - store = _rendezvous_store() - key = _master_store_key() - store.set(key, json.dumps(info, separators=(",", ":"))) - logger.info("probing torchrun: published master at %s (key=%s)", reachable, key) - return info - - -def wait_master(timeout_sec: float | None = None) -> dict[str, str]: - """Non-zero ranks: wait for rank 0 master info in the rendezvous store.""" - import torch.distributed as dist - - rank = dist.get_rank() - if rank == 0: - bound = _ensure_http_server() - reachable = _reachable_addr(bound) - return { - "addr": reachable, - "http_base": f"http://{reachable}", - "bound": bound, - } - - if timeout_sec is None: - timeout_sec = float(os.environ.get("PROBING_TORCHRUN_STORE_TIMEOUT", "120")) - - store = _rendezvous_store() - key = _master_store_key() - deadline = time.monotonic() + timeout_sec - while time.monotonic() < deadline: - try: - remaining = max(0.1, deadline - time.monotonic()) - store.wait([key], timedelta(seconds=min(1.0, remaining))) - raw = _store_get_str(store, key) - info = json.loads(raw) - if info.get("http_base"): - logger.info( - "probing torchrun: rank %s discovered master %s", - rank, - info.get("addr"), - ) - return info - except Exception as exc: - logger.debug("waiting for probing master key %s: %s", key, exc) - time.sleep(0.1) - - raise TimeoutError( - f"timed out after {timeout_sec}s waiting for probing master at store key {key}" - ) - - -def register_with_master(master_info: dict[str, str]) -> None: - """Register this rank's probing HTTP address with the cluster master.""" - local_bound = _ensure_http_server() - local_addr = _reachable_addr(local_bound) - master_http = master_info["http_base"] - node = _node_payload(local_addr) +def _world_size() -> int: + raw = os.environ.get("WORLD_SIZE", "1").strip() try: - _put_node(master_http, node) - logger.info( - "probing torchrun: rank %s registered %s with master %s", - node.get("rank"), - local_addr, - master_info.get("addr"), - ) - except urllib.error.URLError as exc: - logger.warning("probing torchrun: failed to register with master: %s", exc) + return int(raw) + except ValueError: + return 1 def setup_torchrun_cluster() -> dict[str, str] | None: - """ - Full setup: publish or wait for master, then register this rank. - - No-op when disabled, dist is not initialized, or WORLD_SIZE <= 1. - """ + """Idempotent: start Rust-side hierarchical cluster heartbeat.""" global _SETUP_DONE - if not _enabled() or _SETUP_DONE: + if not _enabled() or _SETUP_DONE or _world_size() <= 1: return None try: - import torch.distributed as dist - except ImportError: - return None + from probing import _core - if not dist.is_initialized(): - return None - - if dist.get_world_size() <= 1: + http_base = _core.start_torchrun_cluster() + except Exception as exc: + logger.debug("probing torchrun cluster start skipped: %s", exc) return None _SETUP_DONE = True - rank = dist.get_rank() - if rank == 0: - master_info = publish_master() - else: - master_info = wait_master() - - global _MASTER_INFO - _MASTER_INFO = master_info - register_with_master(master_info) - return master_info + if http_base: + return {"http_base": http_base, "addr": http_base.removeprefix("http://")} + return None def refresh_node_role() -> bool: - """Re-register this node so the master picks up a runtime role change. - - No-op (returns ``False``) when the cluster was never set up. Best-effort: - swallows network errors so ``set_role`` never raises on registration issues. - """ - if not _SETUP_DONE or _MASTER_INFO is None: - return False + """Re-register after ``probing.set_role`` (syncs ``PROBING_NODE_ROLE`` env).""" try: - register_with_master(_MASTER_INFO) - return True - except Exception as exc: # pragma: no cover - network best-effort + from probing.parallel import current_role + + role = current_role() + if role: + os.environ["PROBING_NODE_ROLE"] = role + else: + os.environ.pop("PROBING_NODE_ROLE", None) + from probing import _core + + return bool(_core.refresh_torchrun_cluster_role()) + except Exception as exc: logger.debug("probing torchrun: role refresh failed: %s", exc) return False def master_info() -> dict[str, str] | None: - """Return cluster master HTTP info after ``setup_torchrun_cluster()``.""" - return _MASTER_INFO - + """Return cluster master HTTP info when this process is global rank 0.""" + try: + from probing import _core -def maybe_setup_torchrun_cluster() -> dict[str, str] | None: - """Idempotent entry point; safe to call after ``init_process_group``.""" - return setup_torchrun_cluster() + http_base = _core.start_torchrun_cluster() + except Exception: + return None + if http_base: + return {"http_base": http_base, "addr": http_base.removeprefix("http://")} + return None diff --git a/src/lib.rs b/src/lib.rs index 1a0d0fd5..99b17207 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -69,19 +69,44 @@ fn get_network_interfaces() -> Result> { Ok(ips) } +/// True for the torchrun/elastic supervisor process (not a training worker). +fn is_elastic_supervisor() -> bool { + if std::env::var("LOCAL_RANK").is_ok() || std::env::var("RANK").is_ok() { + return false; + } + if std::env::var("TORCHELASTIC_RUN_ID").is_ok() { + return true; + } + std::env::args().any(|arg| { + let a = arg.as_str(); + a.ends_with("torchrun") || a.contains("torch/distributed/run") + }) +} + +/// Multi-process torchrun jobs: bind HTTP and start Rust-side cluster heartbeat. +fn setup_torchrun_cluster_env() { + if is_elastic_supervisor() { + log::debug!("torchrun/elastic supervisor: skip cluster setup"); + return; + } + probing_server::maybe_start_torchrun_cluster(); +} + /// Setup environment variables for server configuration (single-process only). /// -/// Multi-process torchrun jobs defer HTTP bind and master discovery to -/// ``probing.torchrun_cluster`` after ``init_process_group``. +/// Multi-process torchrun jobs bind HTTP and run hierarchical cluster report in Rust. fn setup_env_settings() { let world_size: i32 = std::env::var("WORLD_SIZE") .unwrap_or_else(|_| "1".to_string()) .parse() .unwrap_or(1); if world_size > 1 { - log::debug!( - "WORLD_SIZE={world_size}: defer probing HTTP bind to torchrun_cluster (Python)" - ); + setup_torchrun_cluster_env(); + return; + } + + if is_elastic_supervisor() { + log::debug!("torchrun/elastic supervisor: defer probing HTTP bind to worker ranks"); return; } @@ -201,6 +226,20 @@ fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(request_crash_hold, m)?)?; m.add_function(wrap_pyfunction!(request_crash_release, m)?)?; + #[pyfunction] + fn start_torchrun_cluster() -> PyResult> { + probing_server::maybe_start_torchrun_cluster(); + Ok(probing_server::master_http_base()) + } + + #[pyfunction] + fn refresh_torchrun_cluster_role() -> PyResult { + Ok(probing_server::refresh_torchrun_role()) + } + + m.add_function(wrap_pyfunction!(start_torchrun_cluster, m)?)?; + m.add_function(wrap_pyfunction!(refresh_torchrun_cluster_role, m)?)?; + // Register config functions directly to the module (flattened) config::register_config_functions(m)?; diff --git a/tests/regression/core/test_torchrun_cluster.py b/tests/regression/core/test_torchrun_cluster.py index d67af7a2..659ff6cf 100644 --- a/tests/regression/core/test_torchrun_cluster.py +++ b/tests/regression/core/test_torchrun_cluster.py @@ -1,83 +1,25 @@ -"""Unit tests for probing.torchrun_cluster helpers (no torchrun required).""" +"""Regression tests for torchrun cluster (Python facade; logic lives in Rust).""" -import json -import os +from __future__ import annotations import pytest -from probing.torchrun_cluster import ( - _master_store_key, - _reachable_addr, - _run_prefix, - publish_master, - wait_master, -) - - -class TestTorchrunClusterHelpers: - def test_run_prefix_uses_rdzv_id(self, monkeypatch): - monkeypatch.setenv("RDZV_ID", "job-abc") - assert _run_prefix() == "probing/torchrun/job-abc" - - def test_master_store_key(self, monkeypatch): - monkeypatch.setenv("TORCHELASTIC_RUN_ID", "elastic-1") - assert _master_store_key() == "probing/torchrun/elastic-1/master" - - def test_reachable_addr_maps_unspecified_bind(self, monkeypatch): - monkeypatch.setenv("MASTER_ADDR", "10.0.0.1") - assert _reachable_addr("0.0.0.0:9922") == "10.0.0.1:9922" - - def test_reachable_addr_keeps_specific_host(self): - assert _reachable_addr("192.168.1.5:8080") == "192.168.1.5:8080" - - -class _FakeStore: - def __init__(self): - self._data: dict[str, str] = {} - - def set(self, key: str, value: str) -> None: - self._data[key] = value - - def get(self, key: str) -> bytes: - return self._data[key].encode() - - def wait(self, keys, timeout=None): # noqa: ANN001 - for key in keys: - if key not in self._data: - raise RuntimeError(f"missing key {key}") - @pytest.mark.skipif( - not os.environ.get("PROBING"), + not __import__("os").environ.get("PROBING"), reason="needs in-process probing engine (PROBING=1)", ) -class TestPublishWaitMaster: - def test_publish_and_wait_roundtrip(self, monkeypatch): - pytest.importorskip("torch") - import torch.distributed as dist - - fake_store = _FakeStore() - monkeypatch.setattr( - "probing.torchrun_cluster._rendezvous_store", - lambda: fake_store, - ) - monkeypatch.setattr( - "probing.torchrun_cluster._ensure_http_server", - lambda: "0.0.0.0:19901", - ) +class TestRustTorchrunCluster: + def test_start_torchrun_cluster_is_idempotent(self, monkeypatch): + monkeypatch.setenv("WORLD_SIZE", "2") + monkeypatch.setenv("RANK", "0") + monkeypatch.setenv("LOCAL_RANK", "0") monkeypatch.setenv("MASTER_ADDR", "127.0.0.1") - monkeypatch.setenv("TORCHELASTIC_RUN_ID", "test-run") - - monkeypatch.setattr(dist, "get_rank", lambda: 0) - monkeypatch.setattr(dist, "is_initialized", lambda: True) - - info = publish_master() - assert info["addr"] == "127.0.0.1:19901" - assert info["http_base"] == "http://127.0.0.1:19901" + monkeypatch.setenv("MASTER_PORT", "29681") + monkeypatch.setenv("RDZV_ID", "test-rust-cluster") - raw = fake_store.get(_master_store_key()).decode() - assert json.loads(raw)["addr"] == "127.0.0.1:19901" + from probing import _core - monkeypatch.setattr(dist, "get_rank", lambda: 1) - waited = wait_master(timeout_sec=1.0) - assert waited["http_base"] == "http://127.0.0.1:19901" + first = _core.start_torchrun_cluster() + second = _core.start_torchrun_cluster() + assert first == second or (first is not None and second is not None) diff --git a/tests/regression/inspect/test_trace_helpers.py b/tests/regression/inspect/test_trace_helpers.py index ae16e5fd..bd9e129d 100644 --- a/tests/regression/inspect/test_trace_helpers.py +++ b/tests/regression/inspect/test_trace_helpers.py @@ -180,6 +180,38 @@ def test_variable_type(self): assert _TraceableCollector.determine_item_type([1, 2, 3]) == "V" +class TestTorchReduceOpDeprecation: + """Regression: traversing torch.distributed must not spam FutureWarning.""" + + def test_should_skip_reduce_op_attr(self): + from probing.inspect.trace import _should_skip_traversal_attr + + assert _should_skip_traversal_attr("torch.distributed", "reduce_op") + assert not _should_skip_traversal_attr("torch.distributed", "ReduceOp") + assert not _should_skip_traversal_attr("torch.nn", "reduce_op") + + def test_list_traceable_torch_distributed_no_reduce_op_warning(self): + pytest.importorskip("torch") + import warnings + + from probing.inspect.trace import list_traceable + + if "torch.distributed" not in sys.modules: + import torch.distributed # noqa: F401 + + with warnings.catch_warnings(record=True) as caught: + warnings.simplefilter("always", FutureWarning) + list_traceable("torch.distributed", depth=1) + + reduce_op_warnings = [ + w + for w in caught + if issubclass(w.category, FutureWarning) + and "torch.distributed.reduce_op" in str(w.message) + ] + assert reduce_op_warnings == [] + + class TestShouldIncludeModule: """Test _TraceableCollector.should_include_module method.""" diff --git a/tests/regression/rust/probing/core/federation_explain_tests.rs b/tests/regression/rust/probing/core/federation_explain_tests.rs index 9e1e6ec4..291dc24f 100644 --- a/tests/regression/rust/probing/core/federation_explain_tests.rs +++ b/tests/regression/rust/probing/core/federation_explain_tests.rs @@ -204,19 +204,6 @@ async fn explain_select_star_rewrite_before_plan() { .await .expect("report"); - assert!(report.global_sql.contains("EXCLUDE")); - for col in [ - "_host", - "_addr", - "_rank", - "_node_rank", - "_local_rank", - "_role", - ] { - assert!( - report.global_sql.contains(col), - "SELECT * rewrite missing {col}" - ); - } + assert_eq!(report.global_sql, "SELECT * FROM global.demo.metrics"); assert_eq!(report.execution_path, FederatedQueryPath::FederatedScan); } diff --git a/tests/regression/rust/probing/core/federation_tests.rs b/tests/regression/rust/probing/core/federation_tests.rs index 3ba1ff95..9c45ec07 100644 --- a/tests/regression/rust/probing/core/federation_tests.rs +++ b/tests/regression/rust/probing/core/federation_tests.rs @@ -441,15 +441,13 @@ fn cluster_fanout_join_uses_legacy_broadcast() { } #[tokio::test] -async fn global_select_star_exclude_rewrite_works() { +async fn global_select_star_leaves_sql_unchanged() { let _lock = federation_test_lock().await; use probing_core::core::federation::prepare_global_query; let sql = "SELECT * FROM global.process.envs"; let prepared = prepare_global_query(sql); - assert!(prepared.contains("EXCLUDE")); - assert!(prepared.contains(PROBE_ADDR_COL)); - assert!(prepared.contains(PROBE_RANK_COL)); + assert_eq!(prepared, sql); } #[tokio::test] diff --git a/tests/unit/probing/skills/test_loader.py b/tests/unit/probing/skills/test_loader.py index ba4d2400..ffc58ef9 100644 --- a/tests/unit/probing/skills/test_loader.py +++ b/tests/unit/probing/skills/test_loader.py @@ -53,6 +53,27 @@ def test_load_slow_rank_local(): assert "python.comm_collective" in rank_latency.sql +def _normalize_sql(sql: str) -> str: + return " ".join(sql.split()) + + +def test_slow_rank_rank_latency_sql_golden_parity(): + """Rust cli/skill/loader.rs tests must produce the same expanded SQL.""" + skill = load_skill("slow_rank") + steps = expand_skill(skill, {"use_global": False, "step_window": 5}) + rank_latency = next(s for s in steps if s.id == "rank_latency") + normalized = _normalize_sql(rank_latency.sql or "") + assert "FROM python.comm_collective" in normalized + assert "global.python.comm_collective" not in normalized + assert "- 5" in normalized + + steps_global = expand_skill(skill, {"use_global": True, "step_window": 10}) + rank_latency_global = next(s for s in steps_global if s.id == "rank_latency") + normalized_global = _normalize_sql(rank_latency_global.sql or "") + assert "FROM global.python.comm_collective" in normalized_global + assert "- 10" in normalized_global + + def test_match_skills_hang(): matched = match_skills("训练卡住了 hang") assert "training_hang" in matched diff --git a/tests/unit/probing/test_torchrun_cluster_report.py b/tests/unit/probing/test_torchrun_cluster_report.py new file mode 100644 index 00000000..5eb77eb8 --- /dev/null +++ b/tests/unit/probing/test_torchrun_cluster_report.py @@ -0,0 +1,59 @@ +"""Unit tests for torchrun cluster helpers (Rust-backed; no torchrun required).""" + +from __future__ import annotations + +import os + +import pytest + + +class TestPythonFacade: + def test_setup_noop_when_disabled(self, monkeypatch): + import probing.torchrun_cluster as tc + + tc._SETUP_DONE = False + monkeypatch.setenv("PROBING_TORCHRUN_CLUSTER", "0") + monkeypatch.setenv("WORLD_SIZE", "8") + assert tc.setup_torchrun_cluster() is None + + def test_setup_noop_for_single_process(self, monkeypatch): + import probing.torchrun_cluster as tc + + tc._SETUP_DONE = False + monkeypatch.delenv("PROBING_TORCHRUN_CLUSTER", raising=False) + monkeypatch.setenv("WORLD_SIZE", "1") + assert tc.setup_torchrun_cluster() is None + + def test_setup_calls_rust_once(self, monkeypatch): + import probing.torchrun_cluster as tc + import probing._core as core + + tc._SETUP_DONE = False + monkeypatch.setenv("WORLD_SIZE", "8") + monkeypatch.delenv("PROBING_TORCHRUN_CLUSTER", raising=False) + calls = {"n": 0} + + def fake_start(): + calls["n"] += 1 + return "http://127.0.0.1:18080" + + monkeypatch.setattr(core, "start_torchrun_cluster", fake_start) + info = tc.setup_torchrun_cluster() + assert info == { + "http_base": "http://127.0.0.1:18080", + "addr": "127.0.0.1:18080", + } + assert calls["n"] == 1 + assert tc.setup_torchrun_cluster() is None + + def test_refresh_node_role_syncs_env(self, monkeypatch): + import probing.torchrun_cluster as tc + import probing._core as core + import probing.parallel as parallel + + parallel.clear_role() + parallel.set_role(dp=2, pp=1) + monkeypatch.setattr(core, "refresh_torchrun_cluster_role", lambda: True) + assert tc.refresh_node_role() is True + assert os.environ.get("PROBING_NODE_ROLE") == "dp=2,pp=1" + parallel.clear_role() diff --git a/web/src/agent/page_tools.rs b/web/src/agent/page_tools.rs index 2e7dca15..8d733cf9 100644 --- a/web/src/agent/page_tools.rs +++ b/web/src/agent/page_tools.rs @@ -82,7 +82,7 @@ pub async fn fetch_page_snapshot(route: &Route) -> Result { } if let Some(p) = query_preview( &client, - "SELECT max(step) AS latest_step FROM python.torch_trace", + "SELECT max(local_step) AS latest_step FROM python.torch_trace", 1, ) .await @@ -97,9 +97,9 @@ pub async fn fetch_page_snapshot(route: &Route) -> Result { if cluster.has_peers() { if let Ok(resp) = client .cluster_query( - "SELECT rank, op, avg(duration_ms) AS avg_ms, count(*) AS n \ + "SELECT _rank, op, avg(duration_ms) AS avg_ms, count(*) AS n \ FROM global.python.comm_collective \ - GROUP BY rank, op ORDER BY avg_ms DESC LIMIT 8", + GROUP BY _rank, op ORDER BY avg_ms DESC LIMIT 8", true, ) .await @@ -153,7 +153,7 @@ pub async fn fetch_page_snapshot(route: &Route) -> Result { "torch" => { if let Some(p) = query_preview( &client, - "SELECT max(step) AS latest_step, count(*) AS rows FROM python.torch_trace", + "SELECT max(local_step) AS latest_step, count(*) AS rows FROM python.torch_trace", 1, ) .await @@ -200,9 +200,9 @@ pub async fn fetch_page_snapshot(route: &Route) -> Result { if cluster.has_peers() { if let Ok(resp) = client .cluster_query( - "SELECT rank, op, avg(duration_ms) AS avg_ms, count(*) AS n \ + "SELECT _rank, op, avg(duration_ms) AS avg_ms, count(*) AS n \ FROM global.python.comm_collective \ - GROUP BY rank, op ORDER BY avg_ms DESC LIMIT 8", + GROUP BY _rank, op ORDER BY avg_ms DESC LIMIT 8", true, ) .await @@ -224,7 +224,7 @@ pub async fn fetch_page_snapshot(route: &Route) -> Result { } if let Some(p) = query_preview( &client, - "SELECT max(step) AS latest_step FROM python.torch_trace", + "SELECT max(local_step) AS latest_step FROM python.torch_trace", 1, ) .await diff --git a/web/src/pages/training.rs b/web/src/pages/training.rs index 18f2aeeb..d882a38d 100644 --- a/web/src/pages/training.rs +++ b/web/src/pages/training.rs @@ -33,22 +33,22 @@ const COMM_SUMMARY_SQL: &str = "SELECT op, count(*) AS n, \ sum(bytes) AS total_bytes \ FROM python.comm_collective GROUP BY op ORDER BY avg_ms DESC LIMIT 10"; -const MODULE_HOTSPOTS_SQL: &str = "SELECT module, stage, count(DISTINCT step) AS steps, \ +const MODULE_HOTSPOTS_SQL: &str = "SELECT module, stage, count(DISTINCT local_step) AS steps, \ count(*) AS hooks, round(avg(duration), 4) AS avg_sec, round(sum(duration), 4) AS total_sec \ FROM python.torch_trace \ - WHERE step >= GREATEST(COALESCE((SELECT max(step) FROM python.torch_trace), 0) - 9, 1) \ + WHERE local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 9, 1) \ AND stage LIKE 'post %' AND duration > 0 \ AND module IS NOT NULL AND module != '' AND module != 'None' \ GROUP BY module, stage ORDER BY total_sec DESC LIMIT 12"; -const STEP_PHASE_SQL: &str = "SELECT step, \ +const STEP_PHASE_SQL: &str = "SELECT local_step, \ round(sum(CASE WHEN stage = 'post forward' THEN duration ELSE 0 END), 4) AS forward_sec, \ round(sum(CASE WHEN stage = 'post step' THEN duration ELSE 0 END), 4) AS optim_sec \ FROM python.torch_trace \ - WHERE step >= GREATEST(COALESCE((SELECT max(step) FROM python.torch_trace), 0) - 15, 1) \ + WHERE local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 15, 1) \ AND stage LIKE 'post %' AND duration > 0 \ AND module IS NOT NULL AND module != '' AND module != 'None' \ - GROUP BY step ORDER BY step"; + GROUP BY local_step ORDER BY local_step"; const QUICK_SKILLS: &[(&str, &str)] = &[ ("slow_rank", "Slow rank"), @@ -104,7 +104,7 @@ fn step_module_sql(coord_step: i64) -> String { format!( "SELECT module, stage, round(duration, 4) AS sec \ FROM python.torch_trace \ - WHERE step = {coord_step} AND stage LIKE 'post %' AND duration > 0 \ + WHERE local_step = {coord_step} AND stage LIKE 'post %' AND duration > 0 \ AND module IS NOT NULL AND module != '' AND module != 'None' \ ORDER BY duration DESC LIMIT 12" ) From dcd49ab4975792af507900275c76aa2da6ce4ed0 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sat, 27 Jun 2026 21:00:13 +0800 Subject: [PATCH 06/37] Harden cluster mutex handling and align docs with refactor reality. Use poison-safe lock_mutex in torchrun cluster paths, rewrite federation catalog prefixes via AST (with legacy fallback), update modularity docs for known boundary debt and torchrun vs Pulsing membership, soften README overhead claims, and track uv.lock while gitignoring generated bundled_web. Co-authored-by: Cursor --- AGENTS.md | 78 + README.md | 2 +- docs/src/design/modularity.md | 22 +- docs/src/design/modularity.zh.md | 23 +- probing/core/src/core/federation/rewrite.rs | 124 +- probing/server/src/cluster_report_backoff.rs | 3 +- probing/server/src/torchrun_cluster.rs | 39 +- .../tests/hierarchical_cluster_report.rs | 7 +- uv.lock | 1307 +++++++++++++++++ 9 files changed, 1573 insertions(+), 32 deletions(-) create mode 100644 AGENTS.md create mode 100644 uv.lock diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..0fab432d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,78 @@ +# Agent instructions — probing + +This repository uses the [Agent Skills](https://agentskills.io) layout for training diagnostics. + +## Module boundaries + +Before adding code, read **`docs/src/design/modularity.md`** (中文: `modularity.zh.md`). + +| Layer | Where | Your change belongs if… | +|-------|--------|-------------------------| +| L1 Platform | `probing/core`, `memtable`, `proto` | SQL engine, federation, storage format | +| L2 Collectors | `probing/extensions/*`, `python/probing/profiling` | New metrics / tables | +| L3 Control | `probing/server`, `probing/cli` | HTTP, inject, fan-out | +| L4 Experience | `skills/`, `web/`, Python hooks | Diagnostics UX, skills, UI | + +**Contracts:** `ProbeDataSource` (tables), `ProbeExtension` (config/HTTP), `@table` (Python data), `skills/*/steps.yaml` (workflows). Do not add cross-collector calls — use SQL JOINs. + +## Skills + +All diagnostic skills live under **`skills/`**. Each subdirectory contains: + +- **`SKILL.md`** — when to use the skill and how to interpret results (read this for routing) +- **`steps.yaml`** — executable probe steps (used by `probing skill run` and the Web Investigate agent) + +Browse the catalog: `skills/catalog.yaml` + +## Install skills into your agent + +So Cursor / Claude Code / Codex can discover and invoke skills: + +```bash +./skills/install.sh +``` + +This copies `skills//` into: + +- `.cursor/skills/` (Cursor) +- `.claude/skills/` (Claude Code) +- `.agents/skills/` (Codex) + +Use `probing skill install --user` for global install under `~/`. + +## Run diagnostics + +Requires a probed training process (`PROBING=1` or `probing -t inject`): + +```bash +probing skill list +probing -t skill run health_overview +probing -t skill run slow_rank --global +probing -t skill run nccl_culprit_victim +``` + +From Python (e.g. in agent-generated scripts): + +```python +from probing.skills.tools import list_skills, run_skill +run_skill("health_overview", target="") +``` + +## Built-in skills (summary) + +| id | use when | +|----|----------| +| `health_overview` | first look / triage | +| `training_hang` | stall or hang | +| `slow_rank` | straggler rank | +| `comm_bottleneck` | NCCL / collective slow | +| `nccl_culprit_victim` | NCCL culprit/victim analysis | +| `memory_leak` | GPU memory growth | +| `module_bottleneck` | slow PyTorch modules | +| `gpu_pressure` | GPU util / headroom | + +Details in each `skills//SKILL.md`. + +## Extending + +Add table plugins under `python/probing/ext/` (data). Add diagnostic skills under `skills/` (how to investigate). NCCL profiler plugin: `docs/src/design/nccl-profiler.md`. See `docs/src/design/extensibility.md`. diff --git a/README.md b/README.md index 5c8d8194..23aa65ab 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ > Uncover the Hidden Truth of AI Performance -Probing is a production-grade performance profiler designed specifically for distributed AI workloads. Built on dynamic probe injection technology, it delivers zero-overhead runtime introspection with SQL-queryable performance metrics and cross-node correlation analysis. +Probing is a production-grade performance profiler designed specifically for distributed AI workloads. Built on dynamic probe injection technology, it delivers **minimal-overhead** runtime introspection—lock-free mmap writes on the hot path, background sampling—with SQL-queryable performance metrics and cross-node correlation analysis. ### What probing delivers... diff --git a/docs/src/design/modularity.md b/docs/src/design/modularity.md index 66ea6c69..e48764a9 100644 --- a/docs/src/design/modularity.md +++ b/docs/src/design/modularity.md @@ -113,7 +113,7 @@ Python-side collectors (same layer, different language): | Unit | Path | Responsibility | |------|------|----------------| -| **probing-server** | `probing/server/` | Axum routes, auth, `initialize_engine()`, cluster fan-out | +| **probing-server** | `probing/server/` | Axum routes, auth, `initialize_engine()`, cluster fan-out, **torchrun heartbeat** (`torchrun_cluster.rs`) | | **probing-cli** | `probing/cli/` | HTTP client to probe; inject/list/query/repl/**skill** | Stable HTTP surface: `probing/server/API.md`, enforced by `tests/regression/spec/api_spec.json`. @@ -325,7 +325,9 @@ Use this table to decide **where a change belongs**: | Concern | Owner module | Interface | |---------|--------------|-----------| | SQL parsing, federation rewrite | probing-core | `Engine::async_query` | +| Table/column semantic docs | probing-core | `semantic_catalog` → `probe.probing.table_docs` / `column_docs` | | mmap format, compaction | probing-memtable | `RowWriter`, `ColdStore` | +| Torchrun cluster heartbeat | probing-server | `torchrun_cluster.rs`, `cluster_report_backoff.rs`, PUT `/apis/nodes` | | Mixed Python/C stack | probing-python/features | `python.backtrace`, pprof | | Torch module sampling | python/probing/profiling | `python.torch_trace` | | Collective wall time | python/probing/profiling/collective | `python.comm_collective` | @@ -372,6 +374,9 @@ Track and fix incrementally: | Issue | Current | Target | |-------|---------|--------| | Python ext → CLI | `probing-python` → `probing-cli` | **Accepted** for maturin wheel (`cli_main` only); keep import surface minimal | +| Python ext → CC | `probing-python` → `probing-cc` (stack tracer SIGUSR2) | Move signal helper to L1 shared util or thin `probing-signals` crate | +| Core → NCCL/HCCL | `probing-core` → `probing-nccl-profiler` / `probing-hccl-shim` (`builtin-schema-docs` feature) for `semantic_catalog` | Register docs via collector hooks or manifest; drop L1→L2 compile deps | +| Core → skills YAML | `semantic_catalog.rs` `include_str!(skills/semantic/tables.yaml)` | Accept as L4 overlay SSOT, or move YAML under `probing/core/resources/` | | Server → python `features/*` | ~~`server/profiling.rs`~~ removed | Flamegraphs via `torchextension` / `pprofextension` `ProbeExtensionCall` | | Server → python REPL internals | ~~`PythonRepl` in server~~ | `/ws` uses `ReplSession` facade only | | Composition sprawl | All wiring in `server/engine.rs` | Optional: manifest TOML listing enabled extensions | @@ -379,6 +384,19 @@ Track and fix incrementally: | kmsg collector | Registered (Linux/kmsg feature gate) | Done | | Architecture doc | 2-layer diagram | Superseded by this doc + [Data Layer](data-layer.md) | +### Cluster membership: Torchrun heartbeat vs Pulsing + +Two **complementary** paths populate `cluster.nodes` and power `global.*` federation. +They do not replace each other. + +| Path | Layer | When | Mechanism | +|------|-------|------|-----------| +| **Torchrun cluster heartbeat** | L3 `probing-server` | Default for `torchrun` / elastic jobs (`WORLD_SIZE > 1`, `PROBING=1/2`) | Hierarchical HTTP PUT + TCPStore side channel (`probing/torchrun//…`). Does **not** touch torch rendezvous keys. See [Torchrun cluster heartbeat](torchrun-cluster.md). | +| **Pulsing integration** | L4 passive + external runtime | Another process already runs [Pulsing](cluster-pulsing.md) and writes `pulsing.*` memtables | Probing discovers `pulsing.*` mmap tables; no probing-owned heartbeat thread. Optional bootstrap via Pulsing APIs. | + +**Default for torchrun users:** heartbeat auto-starts from the Rust ctor (`maybe_start_torchrun_cluster()`). +**Pulsing:** use when the job already centers on Pulsing for membership/failure detection, or you need Pulsing actors alongside probing tables. + --- ## 9. Adding a new feature (decision tree) @@ -414,6 +432,8 @@ Need new raw signals? | [Data Layer](data-layer.md) | MEMT/MEMC internals | | [Extensibility](extensibility.md) | Public extension paths (table + skill) | | [Distributed](distributed.md) | Federation & cluster | +| [Torchrun cluster heartbeat](torchrun-cluster.md) | Hierarchical torchrun membership | +| [Cluster with Pulsing](cluster-pulsing.md) | Optional Pulsing-based membership | | [NCCL Profiler](nccl-profiler.md) | NCCL plugin boundary | | [web/DESIGN.md](https://github.com/DeepLink-org/probing/blob/main/web/DESIGN.md) | UI module layout | | [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | Agent skill usage | diff --git a/docs/src/design/modularity.zh.md b/docs/src/design/modularity.zh.md index 9aea1678..096845b4 100644 --- a/docs/src/design/modularity.zh.md +++ b/docs/src/design/modularity.zh.md @@ -108,7 +108,7 @@ Python 侧采集(同层,不同语言): | 单元 | 路径 | 职责 | |------|------|------| -| **probing-server** | `probing/server/` | 路由、认证、`initialize_engine()`、fan-out | +| **probing-server** | `probing/server/` | 路由、认证、`initialize_engine()`、fan-out、**torchrun 心跳**(`torchrun_cluster.rs`) | | **probing-cli** | `probing/cli/` | HTTP 客户端;inject/query/repl/**skill** | HTTP 契约:`probing/server/API.md` + `tests/regression/spec/api_spec.json`。 @@ -269,7 +269,9 @@ sequenceDiagram | 关注点 | 归属 | 接口 | |--------|------|------| | SQL 解析、federation 重写 | probing-core | `Engine::async_query` | +| 表/列语义文档 | probing-core | `semantic_catalog` → `probe.probing.table_docs` / `column_docs` | | mmap 格式、冷压缩 | probing-memtable | `RowWriter`, `ColdStore` | +| Torchrun 集群心跳 | probing-server | `torchrun_cluster.rs`、`cluster_report_backoff.rs`、`PUT /apis/nodes` | | 混合 Python/C 栈 | probing-python/features | `python.backtrace`、pprof | | Torch 模块采样 | python/profiling | `python.torch_trace` | | Collective 墙钟 | python/profiling/collective | `python.comm_collective` | @@ -313,13 +315,28 @@ sequenceDiagram | 问题 | 现状 | 目标 | |------|------|------| | python → cli | `probing-python` → `probing-cli` | **可接受**(maturin wheel,仅 `cli_main`);禁止扩散 import | +| python → cc | `probing-python` → `probing-cc`(stack tracer 发 SIGUSR2) | 信号 helper 下沉 L1 或独立 `probing-signals` | +| core → NCCL/HCCL | `probing-core` → nccl/hccl shim(`builtin-schema-docs`)供 `semantic_catalog` | 改由采集器注册 docs,去掉 L1→L2 编译依赖 | +| core → skills YAML | `semantic_catalog` `include_str!(skills/semantic/tables.yaml)` | 接受为 L4 overlay SSOT,或迁到 `probing/core/resources/` | | server → python features | ~~`server/profiling.rs`~~ 已删 | 火焰图走 Extension | | server → REPL 内部 | ~~`PythonRepl`~~ | `/ws` 仅用 `ReplSession` 门面 | | 组装集中 | 全在 server/engine.rs | 可选 extension manifest | | Skill 三份 loader | Rust/Python/Web | `skills/` 为 SSOT,CI 同步校验 | -| kmsg 采集器 | 已实现未注册 | 在 engine 注册或删除 | +| kmsg 采集器 | 已注册(Linux/kmsg feature gate) | Done | | Architecture 文档 | 二层旧图 | 以本文 + [数据层](data-layer.zh.md) 为准 | +### 集群成员:Torchrun 心跳 vs Pulsing + +两条**互补**路径填充 `cluster.nodes` 并支撑 `global.*` 联邦,互不取代。 + +| 路径 | 层 | 适用场景 | 机制 | +|------|-----|----------|------| +| **Torchrun 集群心跳** | L3 `probing-server` | 默认:`torchrun`/elastic(`WORLD_SIZE > 1`,`PROBING=1/2`) | 分层 HTTP PUT + TCPStore 旁路键(`probing/torchrun//…`),**不**写 rendezvous 键。见 [Torchrun 集群心跳](torchrun-cluster.zh.md)。 | +| **Pulsing 集成** | L4 被动 + 外部运行时 | 作业已跑 [Pulsing](cluster-pulsing.zh.md) 并写 `pulsing.*` memtable | Probing 发现 mmap 表;无 probing 自有心跳线程。 | + +**torchrun 用户默认**:Rust ctor 自动 `maybe_start_torchrun_cluster()`。 +**Pulsing**:作业以 Pulsing 为中心做成员/故障检测,或需要 Pulsing actor 与 probing 表并存时使用。 + --- ## 9. 新功能决策树 @@ -347,6 +364,8 @@ sequenceDiagram | [数据层](data-layer.zh.md) | MEMT/MEMC 内部实现 | | [扩展机制](extensibility.zh.md) | 对外扩展路径(表 + skill + NCCL) | | [分布式](distributed.zh.md) | 联邦与集群 | +| [Torchrun 集群心跳](torchrun-cluster.zh.md) | 分层 torchrun 成员注册 | +| [基于 Pulsing 的集群](cluster-pulsing.zh.md) | 可选 Pulsing 成员发现 | | [NCCL Profiler](nccl-profiler.zh.md) | NCCL 插件边界 | | [web/DESIGN.md](https://github.com/DeepLink-org/probing/blob/main/web/DESIGN.md) | 前端模块布局 | | [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | Agent 使用 skill | diff --git a/probing/core/src/core/federation/rewrite.rs b/probing/core/src/core/federation/rewrite.rs index f6823a86..07033ce1 100644 --- a/probing/core/src/core/federation/rewrite.rs +++ b/probing/core/src/core/federation/rewrite.rs @@ -1,6 +1,10 @@ //! SQL rewrite helpers for the `probe` / `global` catalog split. -use datafusion::sql::sqlparser::ast::{Query, SelectItem, SetExpr, Statement}; +use std::ops::ControlFlow; + +use datafusion::sql::sqlparser::ast::{ + visit_relations_mut, Ident, ObjectName, ObjectNamePart, Query, SelectItem, SetExpr, Statement, +}; use datafusion::sql::sqlparser::dialect::GenericDialect; use datafusion::sql::sqlparser::parser::Parser; @@ -10,12 +14,98 @@ const KNOWN_SCHEMAS: &[&str] = &[ /// Rewrite federated SQL so remote probing nodes execute against the local `probe` catalog. pub fn rewrite_global_catalog_to_probe(sql: &str) -> String { - sql.replace("global.", "probe.") - .replace("GLOBAL.", "probe.") + rewrite_catalog_relations(sql, rewrite_relation_global_to_probe) + .unwrap_or_else(|| rewrite_global_catalog_to_probe_legacy(sql)) } /// Rewrite a user/cluster SQL string to reference the `global` catalog. pub fn rewrite_sql_for_global_fanout(sql: &str) -> String { + rewrite_catalog_relations(sql, rewrite_relation_to_global) + .unwrap_or_else(|| rewrite_sql_for_global_fanout_legacy(sql)) +} + +fn rewrite_catalog_relations(sql: &str, mut rewrite_fn: F) -> Option +where + F: FnMut(&mut ObjectName), +{ + let dialect = GenericDialect {}; + let mut stmts = Parser::parse_sql(&dialect, sql).ok()?; + if stmts.is_empty() { + return None; + } + for stmt in &mut stmts { + let _ = visit_relations_mut(stmt, |name| { + rewrite_fn(name); + ControlFlow::<(), ()>::Continue(()) + }); + } + Some( + stmts + .iter() + .map(|stmt| stmt.to_string()) + .collect::>() + .join("; "), + ) +} + +fn relation_ident_parts(name: &ObjectName) -> Vec { + name.0 + .iter() + .filter_map(|part| part.as_ident().map(|ident| ident.value.clone())) + .collect() +} + +fn set_relation_parts(name: &mut ObjectName, parts: &[&str]) { + name.0 = parts + .iter() + .map(|part| ObjectNamePart::Identifier(Ident::new(*part))) + .collect(); +} + +fn first_ident_eq(parts: &[String], expected: &str) -> bool { + parts + .first() + .is_some_and(|part| part.eq_ignore_ascii_case(expected)) +} + +fn rewrite_relation_global_to_probe(name: &mut ObjectName) { + let parts = relation_ident_parts(name); + if !first_ident_eq(&parts, "global") { + return; + } + let mut rewritten = vec!["probe"]; + rewritten.extend(parts.iter().skip(1).map(String::as_str)); + set_relation_parts(name, &rewritten); +} + +fn rewrite_relation_to_global(name: &mut ObjectName) { + let parts = relation_ident_parts(name); + if parts.is_empty() || first_ident_eq(&parts, "global") { + return; + } + if first_ident_eq(&parts, "probe") { + let mut rewritten = vec!["global"]; + rewritten.extend(parts.iter().skip(1).map(String::as_str)); + set_relation_parts(name, &rewritten); + return; + } + if parts.first().is_some_and(|part| { + KNOWN_SCHEMAS + .iter() + .any(|schema| part.eq_ignore_ascii_case(schema)) + }) { + let mut rewritten = vec!["global"]; + rewritten.extend(parts.iter().map(String::as_str)); + set_relation_parts(name, &rewritten); + } +} + +fn rewrite_global_catalog_to_probe_legacy(sql: &str) -> String { + sql.replace("global.", "probe.") + .replace("GLOBAL.", "probe.") +} + +fn rewrite_sql_for_global_fanout_legacy(sql: &str) -> String { if sql.to_lowercase().contains("global.") { return sql.to_string(); } @@ -291,4 +381,32 @@ mod tests { "SELECT * FROM global.python.comm_collective WHERE rank > 0 LIMIT 10" ); } + + #[test] + fn global_fanout_does_not_rewrite_catalog_prefix_in_string_literals() { + let sql = "SELECT 'probe.python.secret' AS note FROM python.metrics LIMIT 1"; + let out = rewrite_sql_for_global_fanout(sql); + assert!(out.contains("'probe.python.secret'")); + assert!(out.contains("global.python.metrics")); + assert!(!out.contains("'global.python.secret'")); + } + + #[test] + fn global_to_probe_does_not_rewrite_catalog_prefix_in_string_literals() { + let sql = "SELECT 'global.python.metrics' AS note FROM global.python.metrics LIMIT 1"; + let out = rewrite_global_catalog_to_probe(sql); + assert!(out.contains("'global.python.metrics'")); + assert!(out.contains("probe.python.metrics")); + assert!(!out.contains("'probe.python.metrics'")); + } + + #[test] + fn global_fanout_still_rewrites_unqualified_table_when_literal_mentions_global() { + let sql = "SELECT name FROM python.metrics WHERE name = 'see global.python.b'"; + let out = rewrite_sql_for_global_fanout(sql); + assert_eq!( + out, + "SELECT name FROM global.python.metrics WHERE name = 'see global.python.b'" + ); + } } diff --git a/probing/server/src/cluster_report_backoff.rs b/probing/server/src/cluster_report_backoff.rs index ecf138c4..0468afcd 100644 --- a/probing/server/src/cluster_report_backoff.rs +++ b/probing/server/src/cluster_report_backoff.rs @@ -193,6 +193,7 @@ pub fn classify_report_outcome( #[cfg(test)] mod tests { use super::*; + use probing_core::sync::lock_mutex; use std::sync::{LazyLock, Mutex}; static ENV_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); @@ -210,7 +211,7 @@ mod tests { } fn with_env(vars: &[(&str, &str)], f: F) { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "cluster_report_backoff test ENV_LOCK"); clear_backoff_env(); for (k, v) in vars { std::env::set_var(k, v); diff --git a/probing/server/src/torchrun_cluster.rs b/probing/server/src/torchrun_cluster.rs index d16f0c65..3d8a1129 100644 --- a/probing/server/src/torchrun_cluster.rs +++ b/probing/server/src/torchrun_cluster.rs @@ -15,6 +15,7 @@ use std::sync::{LazyLock, Mutex}; use std::time::Duration; use anyhow::{Context, Result}; +use probing_core::sync::lock_mutex; use probing_proto::prelude::Node; use probing_store::store::TCPStore; use serde::{Deserialize, Serialize}; @@ -242,7 +243,7 @@ async fn publish_master() -> Result<()> { &serde_json::to_string(&info).context("serialize master info")?, ) .await?; - *MASTER_INFO.lock().unwrap() = Some(info); + *lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO") = Some(info); log::info!( "probing torchrun: published master at {} (key={})", reachable, @@ -366,25 +367,23 @@ fn nodes_for_upstream_report() -> Vec { fn report_parent_http() -> Option { if local_rank() != 0 { - return LOCAL0_PARENT.lock().unwrap().clone(); + return lock_mutex(&LOCAL0_PARENT, "torchrun LOCAL0_PARENT").clone(); } if is_global_rank0() { return Some(local_http_base()); } - MASTER_INFO - .lock() - .unwrap() + lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO") .as_ref() .map(|m| m.http_base.clone()) } fn ensure_master_info() -> bool { - if MASTER_INFO.lock().unwrap().is_some() { + if lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO").is_some() { return true; } let timeout = Duration::from_secs_f64(discover_timeout_secs()); if let Some(info) = SERVER_RUNTIME.block_on(poll_master_info(timeout)) { - *MASTER_INFO.lock().unwrap() = Some(info); + *lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO") = Some(info); return true; } false @@ -394,12 +393,12 @@ fn ensure_local0_parent() -> bool { if local_rank() == 0 { return true; } - if LOCAL0_PARENT.lock().unwrap().is_some() { + if lock_mutex(&LOCAL0_PARENT, "torchrun LOCAL0_PARENT").is_some() { return true; } let timeout = Duration::from_secs_f64(discover_timeout_secs()); if let Some(base) = SERVER_RUNTIME.block_on(poll_local0_parent(timeout)) { - *LOCAL0_PARENT.lock().unwrap() = Some(base); + *lock_mutex(&LOCAL0_PARENT, "torchrun LOCAL0_PARENT") = Some(base); return true; } false @@ -451,7 +450,7 @@ async fn hierarchical_report_worker() { .await .unwrap_or(ReportOutcome::Failed); let sleep_for = { - let mut backoff = REPORT_BACKOFF.lock().unwrap(); + let mut backoff = lock_mutex(&REPORT_BACKOFF, "torchrun REPORT_BACKOFF"); backoff.record(outcome); backoff.sleep_duration() }; @@ -512,12 +511,12 @@ pub fn refresh_torchrun_role() -> bool { if !STARTED.load(Ordering::SeqCst) { return false; } - REPORT_BACKOFF.lock().unwrap().reset(); + lock_mutex(&REPORT_BACKOFF, "torchrun REPORT_BACKOFF").reset(); SERVER_RUNTIME.spawn(async { let outcome = tokio::task::spawn_blocking(report_once) .await .unwrap_or(ReportOutcome::Failed); - let mut backoff = REPORT_BACKOFF.lock().unwrap(); + let mut backoff = lock_mutex(&REPORT_BACKOFF, "torchrun REPORT_BACKOFF"); backoff.record(outcome); }); true @@ -525,9 +524,7 @@ pub fn refresh_torchrun_role() -> bool { /// Master HTTP base URL when this process is global rank 0. pub fn master_http_base() -> Option { - MASTER_INFO - .lock() - .unwrap() + lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO") .as_ref() .map(|m| m.http_base.clone()) } @@ -557,7 +554,7 @@ mod tests { #[test] fn run_prefix_uses_rdzv_id() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("RDZV_ID", "probing-29680"); assert_eq!(run_prefix(), "probing/torchrun/probing-29680"); @@ -565,7 +562,7 @@ mod tests { #[test] fn local0_store_key_includes_node_rank() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("TORCHELASTIC_RUN_ID", "job-x"); std::env::set_var("NODE_RANK", "3"); @@ -574,7 +571,7 @@ mod tests { #[test] fn merge_self_is_idempotent() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("RANK", "0"); std::env::set_var("LOCAL_RANK", "0"); @@ -596,7 +593,7 @@ mod tests { #[test] fn local_group_and_leaf_filters() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("GROUP_RANK", "3"); std::env::set_var("RANK", "24"); @@ -621,7 +618,7 @@ mod tests { #[test] fn reachable_addr_maps_unspecified_bind() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("MASTER_ADDR", "10.0.0.1"); assert_eq!(reachable_addr("0.0.0.0:9922"), "10.0.0.1:9922"); @@ -629,7 +626,7 @@ mod tests { #[test] fn bind_spec_global_rank0_uses_probing_port() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("RANK", "0"); std::env::set_var("PROBING_PORT", "18080"); diff --git a/probing/server/tests/hierarchical_cluster_report.rs b/probing/server/tests/hierarchical_cluster_report.rs index 0a15d9a0..780cd792 100644 --- a/probing/server/tests/hierarchical_cluster_report.rs +++ b/probing/server/tests/hierarchical_cluster_report.rs @@ -5,6 +5,7 @@ use std::sync::{Arc, LazyLock, Mutex}; use std::time::{SystemTime, UNIX_EPOCH}; use axum::{extract::State, routing::get, Json, Router}; +use probing_core::sync::lock_mutex; use probing_proto::prelude::{Cluster, Node, NodeReportRequest, NodeReportResponse}; use probing_server::cluster_http::{fetch_nodes_blocking, put_nodes_blocking}; use probing_server::server::SERVER_RUNTIME; @@ -44,7 +45,7 @@ async fn put_nodes_handler( State(state): State, Json(body): Json, ) -> Json { - let mut cluster = state.cluster.lock().unwrap(); + let mut cluster = lock_mutex(&state.cluster, "hierarchical_cluster_report cluster"); for mut node in body.nodes { if node.timestamp == 0 { node.timestamp = now_micros(); @@ -66,7 +67,7 @@ async fn put_nodes_handler( } async fn get_nodes_handler(State(state): State) -> Json> { - let cluster = state.cluster.lock().unwrap(); + let cluster = lock_mutex(&state.cluster, "hierarchical_cluster_report cluster"); let mut nodes = cluster.list(); nodes.sort_by_key(|n| n.rank.unwrap_or(i32::MAX)); Json(nodes) @@ -122,7 +123,7 @@ fn local_group_ranks(store: &[Node], group_rank: i32) -> Vec { #[test] fn hierarchical_two_nodes_times_two_gpus_converges_on_master() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "hierarchical_cluster_report ENV_LOCK"); for key in ["RANK", "GROUP_RANK", "LOCAL_RANK"] { std::env::remove_var(key); } diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..25308c84 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1307 @@ +version = 1 +revision = 3 +requires-python = ">=3.7" +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] + +[[package]] +name = "black" +version = "23.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "mypy-extensions", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pathspec", version = "0.11.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "platformdirs", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "typed-ast", marker = "python_full_version < '3.8' and implementation_name == 'cpython'" }, + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/36/66370f5017b100225ec4950a60caeef60201a10080da57ddb24124453fba/black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940", size = 582156, upload-time = "2023-03-29T01:00:54.457Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/f4/7908f71cc71da08df1317a3619f002cbf91927fb5d3ffc7723905a2113f7/black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915", size = 1342273, upload-time = "2023-03-29T01:19:03.787Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/07aab2623cfd3789786f17e051487a41d5657258c7b1ef8f780512ffea9c/black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9", size = 2676721, upload-time = "2023-03-29T01:25:23.459Z" }, + { url = "https://files.pythonhosted.org/packages/29/b1/b584fc863c155653963039664a592b3327b002405043b7e761b9b0212337/black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2", size = 1520336, upload-time = "2023-03-29T01:28:32.973Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b4/0f13ab7f5e364795ff82b76b0f9a4c9c50afda6f1e2feeb8b03fdd7ec57d/black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c", size = 1654611, upload-time = "2023-03-29T01:11:12.718Z" }, + { url = "https://files.pythonhosted.org/packages/de/b4/76f152c5eb0be5471c22cd18380d31d188930377a1a57969073b89d6615d/black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c", size = 1286657, upload-time = "2023-03-29T01:15:20.317Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6f/d3832960a3b646b333b7f0d80d336a3c123012e9d9d5dba4a622b2b6181d/black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6", size = 1326112, upload-time = "2023-03-29T01:19:05.794Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a5/17b40bfd9b607b69fa726b0b3a473d14b093dcd5191ea1a1dd664eccfee3/black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b", size = 2643808, upload-time = "2023-03-29T01:25:27.825Z" }, + { url = "https://files.pythonhosted.org/packages/69/49/7e1f0cf585b0d607aad3f971f95982cc4208fc77f92363d632d23021ee57/black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d", size = 1503287, upload-time = "2023-03-29T01:28:35.228Z" }, + { url = "https://files.pythonhosted.org/packages/c0/53/42e312c17cfda5c8fc4b6b396a508218807a3fcbb963b318e49d3ddd11d5/black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70", size = 1638625, upload-time = "2023-03-29T01:11:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/3f/0d/81dd4194ce7057c199d4f28e4c2a885082d9d929e7a55c514b23784f7787/black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326", size = 1293585, upload-time = "2023-03-29T01:15:22.935Z" }, + { url = "https://files.pythonhosted.org/packages/24/eb/2d2d2c27cb64cfd073896f62a952a802cd83cf943a692a2f278525b57ca9/black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b", size = 1447428, upload-time = "2023-03-29T01:28:37.49Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/15d2122f90ff1cd70f06892ebda777b650218cf84b56b5916a993dc1359a/black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2", size = 1576467, upload-time = "2023-03-29T01:11:18.293Z" }, + { url = "https://files.pythonhosted.org/packages/ca/44/eb41edd3f558a6139f09eee052dead4a7a464e563b822ddf236f5a8ee286/black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925", size = 1226437, upload-time = "2023-03-29T01:15:24.92Z" }, + { url = "https://files.pythonhosted.org/packages/ce/f4/2b0c6ac9e1f8584296747f66dd511898b4ebd51d6510dba118279bff53b6/black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27", size = 1331955, upload-time = "2023-03-29T01:19:07.695Z" }, + { url = "https://files.pythonhosted.org/packages/21/14/d5a2bec5fb15f9118baab7123d344646fac0b1c6939d51c2b05259cd2d9c/black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331", size = 2658520, upload-time = "2023-03-29T01:25:30.535Z" }, + { url = "https://files.pythonhosted.org/packages/13/0a/ed8b66c299e896780e4528eed4018f5b084da3b9ba4ee48328550567d866/black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5", size = 1509852, upload-time = "2023-03-29T01:28:39.106Z" }, + { url = "https://files.pythonhosted.org/packages/12/4b/99c71d1cf1353edd5aff2700b8960f92e9b805c9dab72639b67dbb449d3a/black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961", size = 1641852, upload-time = "2023-03-29T01:11:20.065Z" }, + { url = "https://files.pythonhosted.org/packages/d1/6e/5810b6992ed70403124c67e8b3f62858a32b35405177553f1a78ed6b6e31/black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8", size = 1297694, upload-time = "2023-03-29T01:15:26.919Z" }, + { url = "https://files.pythonhosted.org/packages/13/25/cfa06788d0a936f2445af88f13604b5bcd5c9d050db618c718e6ebe66f74/black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30", size = 1341089, upload-time = "2023-03-29T01:19:09.503Z" }, + { url = "https://files.pythonhosted.org/packages/fd/5b/fc2d7922c1a6bb49458d424b5be71d251f2d0dc97be9534e35d171bdc653/black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3", size = 2674699, upload-time = "2023-03-29T01:25:32.853Z" }, + { url = "https://files.pythonhosted.org/packages/49/d7/f3b7da6c772800f5375aeb050a3dcf682f0bbeb41d313c9c2820d0156e4e/black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266", size = 1519946, upload-time = "2023-03-29T01:28:40.746Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d7/85f3d79f9e543402de2244c4d117793f262149e404ea0168841613c33e07/black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab", size = 1654176, upload-time = "2023-03-29T01:11:21.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/1e/273d610249f0335afb1ddb03664a03223f4826e3d1a95170a0142cb19fb4/black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb", size = 1286299, upload-time = "2023-03-29T01:15:28.898Z" }, + { url = "https://files.pythonhosted.org/packages/ad/e7/4642b7f462381799393fbad894ba4b32db00870a797f0616c197b07129a9/black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4", size = 180965, upload-time = "2023-03-29T01:00:52.253Z" }, +] + +[[package]] +name = "black" +version = "24.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "mypy-extensions", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pathspec", version = "0.12.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/b0/46fb0d4e00372f4a86a6f8efa3cb193c9f64863615e39010b1477e010578/black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f", size = 644810, upload-time = "2024-08-02T17:43:18.405Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/6e/74e29edf1fba3887ed7066930a87f698ffdcd52c5dbc263eabb06061672d/black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6", size = 1632092, upload-time = "2024-08-02T17:47:26.911Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/575cb6c3faee690b05c9d11ee2e8dba8fbd6d6c134496e644c1feb1b47da/black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb", size = 1457529, upload-time = "2024-08-02T17:47:29.109Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/d34099e95c437b53d01c4aa37cf93944b233066eb034ccf7897fa4e5f286/black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42", size = 1757443, upload-time = "2024-08-02T17:46:20.306Z" }, + { url = "https://files.pythonhosted.org/packages/87/a0/6d2e4175ef364b8c4b64f8441ba041ed65c63ea1db2720d61494ac711c15/black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a", size = 1418012, upload-time = "2024-08-02T17:47:20.33Z" }, + { url = "https://files.pythonhosted.org/packages/08/a6/0a3aa89de9c283556146dc6dbda20cd63a9c94160a6fbdebaf0918e4a3e1/black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1", size = 1615080, upload-time = "2024-08-02T17:48:05.467Z" }, + { url = "https://files.pythonhosted.org/packages/db/94/b803d810e14588bb297e565821a947c108390a079e21dbdcb9ab6956cd7a/black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af", size = 1438143, upload-time = "2024-08-02T17:47:30.247Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b5/f485e1bbe31f768e2e5210f52ea3f432256201289fd1a3c0afda693776b0/black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4", size = 1738774, upload-time = "2024-08-02T17:46:17.837Z" }, + { url = "https://files.pythonhosted.org/packages/a8/69/a000fc3736f89d1bdc7f4a879f8aaf516fb03613bb51a0154070383d95d9/black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af", size = 1427503, upload-time = "2024-08-02T17:46:22.654Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a8/05fb14195cfef32b7c8d4585a44b7499c2a4b205e1662c427b941ed87054/black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368", size = 1646132, upload-time = "2024-08-02T17:49:52.843Z" }, + { url = "https://files.pythonhosted.org/packages/41/77/8d9ce42673e5cb9988f6df73c1c5c1d4e9e788053cccd7f5fb14ef100982/black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed", size = 1448665, upload-time = "2024-08-02T17:47:54.479Z" }, + { url = "https://files.pythonhosted.org/packages/cc/94/eff1ddad2ce1d3cc26c162b3693043c6b6b575f538f602f26fe846dfdc75/black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018", size = 1762458, upload-time = "2024-08-02T17:46:19.384Z" }, + { url = "https://files.pythonhosted.org/packages/28/ea/18b8d86a9ca19a6942e4e16759b2fa5fc02bbc0eb33c1b866fcd387640ab/black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2", size = 1436109, upload-time = "2024-08-02T17:46:52.97Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d4/ae03761ddecc1a37d7e743b89cccbcf3317479ff4b88cfd8818079f890d0/black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd", size = 1617322, upload-time = "2024-08-02T17:51:20.203Z" }, + { url = "https://files.pythonhosted.org/packages/14/4b/4dfe67eed7f9b1ddca2ec8e4418ea74f0d1dc84d36ea874d618ffa1af7d4/black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2", size = 1442108, upload-time = "2024-08-02T17:50:40.824Z" }, + { url = "https://files.pythonhosted.org/packages/97/14/95b3f91f857034686cae0e73006b8391d76a8142d339b42970eaaf0416ea/black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e", size = 1745786, upload-time = "2024-08-02T17:46:02.939Z" }, + { url = "https://files.pythonhosted.org/packages/95/54/68b8883c8aa258a6dde958cd5bdfada8382bec47c5162f4a01e66d839af1/black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920", size = 1426754, upload-time = "2024-08-02T17:46:38.603Z" }, + { url = "https://files.pythonhosted.org/packages/13/b2/b3f24fdbb46f0e7ef6238e131f13572ee8279b70f237f221dd168a9dba1a/black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c", size = 1631706, upload-time = "2024-08-02T17:49:57.606Z" }, + { url = "https://files.pythonhosted.org/packages/d9/35/31010981e4a05202a84a3116423970fd1a59d2eda4ac0b3570fbb7029ddc/black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e", size = 1457429, upload-time = "2024-08-02T17:49:12.764Z" }, + { url = "https://files.pythonhosted.org/packages/27/25/3f706b4f044dd569a20a4835c3b733dedea38d83d2ee0beb8178a6d44945/black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47", size = 1756488, upload-time = "2024-08-02T17:46:08.067Z" }, + { url = "https://files.pythonhosted.org/packages/63/72/79375cd8277cbf1c5670914e6bd4c1b15dea2c8f8e906dc21c448d0535f0/black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb", size = 1417721, upload-time = "2024-08-02T17:46:42.637Z" }, + { url = "https://files.pythonhosted.org/packages/27/1e/83fa8a787180e1632c3d831f7e58994d7aaf23a0961320d21e84f922f919/black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed", size = 206504, upload-time = "2024-08-02T17:43:15.747Z" }, +] + +[[package]] +name = "black" +version = "25.11.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "mypy-extensions", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pathspec", version = "1.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytokens", marker = "python_full_version == '3.9.*'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", size = 655669, upload-time = "2025-11-10T01:53:50.558Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/d2/6caccbc96f9311e8ec3378c296d4f4809429c43a6cd2394e3c390e86816d/black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", size = 1743501, upload-time = "2025-11-10T01:59:06.202Z" }, + { url = "https://files.pythonhosted.org/packages/69/35/b986d57828b3f3dccbf922e2864223197ba32e74c5004264b1c62bc9f04d/black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", size = 1597308, upload-time = "2025-11-10T01:57:58.633Z" }, + { url = "https://files.pythonhosted.org/packages/39/8e/8b58ef4b37073f52b64a7b2dd8c9a96c84f45d6f47d878d0aa557e9a2d35/black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", size = 1656194, upload-time = "2025-11-10T01:57:10.909Z" }, + { url = "https://files.pythonhosted.org/packages/8d/30/9c2267a7955ecc545306534ab88923769a979ac20a27cf618d370091e5dd/black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03", size = 1347996, upload-time = "2025-11-10T01:57:22.391Z" }, + { url = "https://files.pythonhosted.org/packages/c4/62/d304786b75ab0c530b833a89ce7d997924579fb7484ecd9266394903e394/black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", size = 1727891, upload-time = "2025-11-10T02:01:40.507Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/ffe8a006aa522c9e3f430e7b93568a7b2163f4b3f16e8feb6d8c3552761a/black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", size = 1581875, upload-time = "2025-11-10T01:57:51.192Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7c8bda3108d0bb57387ac41b4abb5c08782b26da9f9c4421ef6694dac01a/black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", size = 1642716, upload-time = "2025-11-10T01:56:51.589Z" }, + { url = "https://files.pythonhosted.org/packages/34/b9/f17dea34eecb7cc2609a89627d480fb6caea7b86190708eaa7eb15ed25e7/black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", size = 1352904, upload-time = "2025-11-10T01:59:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/7f/12/5c35e600b515f35ffd737da7febdb2ab66bb8c24d88560d5e3ef3d28c3fd/black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", size = 1772831, upload-time = "2025-11-10T02:03:47Z" }, + { url = "https://files.pythonhosted.org/packages/1a/75/b3896bec5a2bb9ed2f989a970ea40e7062f8936f95425879bbe162746fe5/black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", size = 1608520, upload-time = "2025-11-10T01:58:46.895Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b5/2bfc18330eddbcfb5aab8d2d720663cd410f51b2ed01375f5be3751595b0/black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", size = 1682719, upload-time = "2025-11-10T01:56:55.24Z" }, + { url = "https://files.pythonhosted.org/packages/96/fb/f7dc2793a22cdf74a72114b5ed77fe3349a2e09ef34565857a2f917abdf2/black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", size = 1362684, upload-time = "2025-11-10T01:57:07.639Z" }, + { url = "https://files.pythonhosted.org/packages/ad/47/3378d6a2ddefe18553d1115e36aea98f4a90de53b6a3017ed861ba1bd3bc/black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", size = 1772446, upload-time = "2025-11-10T02:02:16.181Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4b/0f00bfb3d1f7e05e25bfc7c363f54dc523bb6ba502f98f4ad3acf01ab2e4/black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", size = 1607983, upload-time = "2025-11-10T02:02:52.502Z" }, + { url = "https://files.pythonhosted.org/packages/99/fe/49b0768f8c9ae57eb74cc10a1f87b4c70453551d8ad498959721cc345cb7/black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", size = 1682481, upload-time = "2025-11-10T01:57:12.35Z" }, + { url = "https://files.pythonhosted.org/packages/55/17/7e10ff1267bfa950cc16f0a411d457cdff79678fbb77a6c73b73a5317904/black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", size = 1363869, upload-time = "2025-11-10T01:58:24.608Z" }, + { url = "https://files.pythonhosted.org/packages/67/c0/cc865ce594d09e4cd4dfca5e11994ebb51604328489f3ca3ae7bb38a7db5/black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", size = 1771358, upload-time = "2025-11-10T02:03:33.331Z" }, + { url = "https://files.pythonhosted.org/packages/37/77/4297114d9e2fd2fc8ab0ab87192643cd49409eb059e2940391e7d2340e57/black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", size = 1612902, upload-time = "2025-11-10T01:59:33.382Z" }, + { url = "https://files.pythonhosted.org/packages/de/63/d45ef97ada84111e330b2b2d45e1dd163e90bd116f00ac55927fb6bf8adb/black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", size = 1680571, upload-time = "2025-11-10T01:57:04.239Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4b/5604710d61cdff613584028b4cb4607e56e148801ed9b38ee7970799dab6/black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", size = 1382599, upload-time = "2025-11-10T01:57:57.427Z" }, + { url = "https://files.pythonhosted.org/packages/d5/9a/5b2c0e3215fe748fcf515c2dd34658973a1210bf610e24de5ba887e4f1c8/black-25.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06", size = 1743063, upload-time = "2025-11-10T02:02:43.175Z" }, + { url = "https://files.pythonhosted.org/packages/a1/20/245164c6efc27333409c62ba54dcbfbe866c6d1957c9a6c0647786e950da/black-25.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2", size = 1596867, upload-time = "2025-11-10T02:00:17.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6f/1a3859a7da205f3d50cf3a8bec6bdc551a91c33ae77a045bb24c1f46ab54/black-25.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc", size = 1655678, upload-time = "2025-11-10T01:57:09.028Z" }, + { url = "https://files.pythonhosted.org/packages/56/1a/6dec1aeb7be90753d4fcc273e69bc18bfd34b353223ed191da33f7519410/black-25.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc", size = 1347452, upload-time = "2025-11-10T01:57:01.871Z" }, + { url = "https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", size = 204918, upload-time = "2025-11-10T01:53:48.917Z" }, +] + +[[package]] +name = "black" +version = "26.5.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "click", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "mypy-extensions", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pathspec", version = "1.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "platformdirs", version = "4.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytokens", marker = "python_full_version >= '3.10'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/84/b3f55026206a9e8820a91503308075ca48eadc515e436731ca01dbe043b3/black-26.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9942db8888e06943c5dde66ca0037dcff82a2a4ec1ad0ada9e0d2ee9d9823893", size = 1987719, upload-time = "2026-05-18T17:05:02.757Z" }, + { url = "https://files.pythonhosted.org/packages/c6/34/7db312c5e5783d6e76cffd9d5ac8972a32badae4c6e3288dac0eed8d3bed/black-26.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:89c93167a74d3a75dfaa38a5c7cca015537d5820dd7f17d63267d674a61cae90", size = 1810083, upload-time = "2026-05-18T17:05:04.302Z" }, + { url = "https://files.pythonhosted.org/packages/33/e2/e0101e73c2c8727634e2efcb35e2b34bd23ad70dfa673789f5773a591b21/black-26.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f2cd76d069cc54c71f10360744ba8983fbb616903b4304a85b734915c8e1b4", size = 1860633, upload-time = "2026-05-18T17:05:06.391Z" }, + { url = "https://files.pythonhosted.org/packages/b0/4c/e15c0c5b23cf3651035fe5addcce90e283af3548a3f91bb03d81b83106ab/black-26.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:87ed5c6f450580a2f6790bc7cbfb016dfc73bc750249762268a3695361315eef", size = 1477886, upload-time = "2026-05-18T17:05:07.96Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3f/59d43ade98d2ce5c8dc34a4e46cbecd177e6d55d7d4092969c6003ccc655/black-26.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:58b4bd92cf88aacf83d88479c8f9caee044b1ec55f2451a337354a7ea2590a22", size = 1277111, upload-time = "2026-05-18T17:05:09.473Z" }, + { url = "https://files.pythonhosted.org/packages/4b/96/3c3e09f09f44a37aac36b178a279cd19aa7001bd796187a7b162a294c81f/black-26.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96ae2c733b2aabdd9986e2c5df628ff3473676cd1c5faded1ff496cf6d74083c", size = 1970639, upload-time = "2026-05-18T17:05:11.461Z" }, + { url = "https://files.pythonhosted.org/packages/83/ea/5ad117b9ee3ecd933c712bcbae610006e5b7cc9f41c526cd7ed3b6c4124c/black-26.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e48b87e03bf109288e55cfceadcfa15ff5470aca2851a851950ed2926f450d7", size = 1792130, upload-time = "2026-05-18T17:05:12.983Z" }, + { url = "https://files.pythonhosted.org/packages/06/3a/7c448bc623fcdfa96672531beb5a616ea5e64f6975955254d7731ffb0ad9/black-26.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5119fa92ae61f786e8c3662fd60aece1d0a2dd5cca5d0c79417a95e7a4272a59", size = 1846134, upload-time = "2026-05-18T17:05:14.506Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5b/0b39b3a5917f0657ac014ad2edb58c139553a478adfe7f817abf1622ff6e/black-26.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:30d3c14661f2792e9142cce3eeeb1cbc175b3eb5f733be0c8eeb99651e52b0c3", size = 1478883, upload-time = "2026-05-18T17:05:16.542Z" }, + { url = "https://files.pythonhosted.org/packages/4c/48/dc222692e0f95030db1bbfb6c857e76858bad09058221ea7aae815255327/black-26.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:1ef92b76f7733f282fd096ea406200b5a286c42947412b0eaff3a74e3616cefe", size = 1277776, upload-time = "2026-05-18T17:05:18.029Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/7744b906703228264ef73bdd534df88ec1ef3de45c4e78f6d31b9e32d0c9/black-26.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ad6fa01f941920f54f2bbb35f3df7673428a0ef98a0b0840c2eaef3b110efa8", size = 2012518, upload-time = "2026-05-18T17:05:20.108Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c0/c5a3b1636dfd09c42534f2b3cf33506814f6d3e066fb0879ffa16c1ae860/black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217", size = 1816016, upload-time = "2026-05-18T17:05:21.84Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0e/36044316b65ca471d3bb6d3703fd06fb50c6b727c3562f6a5a3153634f88/black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d", size = 1884150, upload-time = "2026-05-18T17:05:23.546Z" }, + { url = "https://files.pythonhosted.org/packages/b3/33/dafc5808c2af43672912111d7c3354af1615f7e2be3bed7a878461abbe4d/black-26.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264", size = 1486825, upload-time = "2026-05-18T17:05:25.004Z" }, + { url = "https://files.pythonhosted.org/packages/82/14/b965ee6ad2a311f28bdbf692def3ee9848d2ae289dab28b27657fcee3e78/black-26.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1037d5ac7b7b310b2632ad867ec8d0e4c4819dcdb0b820f63135da746a24e418", size = 1288646, upload-time = "2026-05-18T17:05:26.477Z" }, + { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, + { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, + { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, + { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a8da8eb208c51c7f4ce74609a45d0dcc6d8a2141e45e81ee5289d1bb0d59/black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168", size = 2004800, upload-time = "2026-05-18T17:05:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/11/8a/a479296a19e383b70a725882a6cf3d786540601ff03cabbaaf1cce864c5a/black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3", size = 1815576, upload-time = "2026-05-18T17:05:40.309Z" }, + { url = "https://files.pythonhosted.org/packages/81/6b/cfaf3d39f25132c156a068f6b805576c9103a84086019507c70e1911ee7d/black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18", size = 1877927, upload-time = "2026-05-18T17:05:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/66/76/302e313964bcff7e28df329d39f84f5270095730d85ff0acc260610a0d82/black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50", size = 1511860, upload-time = "2026-05-18T17:05:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/27/4e/a3827e35e0e567f9f9ee59e2a0ab979267dca98718f25547ca8c6733afd4/black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae", size = 1316632, upload-time = "2026-05-18T17:05:45.521Z" }, + { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, +] + +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.2.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/45/8b/421f30467e69ac0e414214856798d4bc32da1336df745e49e49ae5c1e2a8/coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59", size = 762575, upload-time = "2023-05-29T20:08:50.273Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/24/be01e62a7bce89bcffe04729c540382caa5a06bee45ae42136c93e2499f5/coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8", size = 200724, upload-time = "2023-05-29T20:07:03.422Z" }, + { url = "https://files.pythonhosted.org/packages/3d/80/7060a445e1d2c9744b683dc935248613355657809d6c6b2716cdf4ca4766/coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb", size = 201024, upload-time = "2023-05-29T20:07:05.694Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9d/926fce7e03dbfc653104c2d981c0fa71f0572a9ebd344d24c573bd6f7c4f/coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6", size = 229528, upload-time = "2023-05-29T20:07:07.307Z" }, + { url = "https://files.pythonhosted.org/packages/d1/3a/67f5d18f911abf96857f6f7e4df37ca840e38179e2cc9ab6c0b9c3380f19/coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2", size = 227842, upload-time = "2023-05-29T20:07:09.331Z" }, + { url = "https://files.pythonhosted.org/packages/b4/bd/1b2331e3a04f4cc9b7b332b1dd0f3a1261dfc4114f8479bebfcc2afee9e8/coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063", size = 228717, upload-time = "2023-05-29T20:07:11.38Z" }, + { url = "https://files.pythonhosted.org/packages/2b/86/3dbf9be43f8bf6a5ca28790a713e18902b2d884bc5fa9512823a81dff601/coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1", size = 234632, upload-time = "2023-05-29T20:07:13.376Z" }, + { url = "https://files.pythonhosted.org/packages/91/e8/469ed808a782b9e8305a08bad8c6fa5f8e73e093bda6546c5aec68275bff/coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353", size = 232875, upload-time = "2023-05-29T20:07:15.093Z" }, + { url = "https://files.pythonhosted.org/packages/29/8f/4fad1c2ba98104425009efd7eaa19af9a7c797e92d40cd2ec026fa1f58cb/coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495", size = 234094, upload-time = "2023-05-29T20:07:17.013Z" }, + { url = "https://files.pythonhosted.org/packages/94/4e/d4e46a214ae857be3d7dc5de248ba43765f60daeb1ab077cb6c1536c7fba/coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818", size = 203184, upload-time = "2023-05-29T20:07:18.69Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e9/d6730247d8dec2a3dddc520ebe11e2e860f0f98cee3639e23de6cf920255/coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850", size = 204096, upload-time = "2023-05-29T20:07:20.153Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fa/529f55c9a1029c840bcc9109d5a15ff00478b7ff550a1ae361f8745f8ad5/coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f", size = 200895, upload-time = "2023-05-29T20:07:21.963Z" }, + { url = "https://files.pythonhosted.org/packages/67/d7/cd8fe689b5743fffac516597a1222834c42b80686b99f5b44ef43ccc2a43/coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe", size = 201120, upload-time = "2023-05-29T20:07:23.765Z" }, + { url = "https://files.pythonhosted.org/packages/8c/95/16eed713202406ca0a37f8ac259bbf144c9d24f9b8097a8e6ead61da2dbb/coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3", size = 233178, upload-time = "2023-05-29T20:07:25.281Z" }, + { url = "https://files.pythonhosted.org/packages/c1/49/4d487e2ad5d54ed82ac1101e467e8994c09d6123c91b2a962145f3d262c2/coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f", size = 230754, upload-time = "2023-05-29T20:07:27.044Z" }, + { url = "https://files.pythonhosted.org/packages/a7/cd/3ce94ad9d407a052dc2a74fbeb1c7947f442155b28264eb467ee78dea812/coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb", size = 232558, upload-time = "2023-05-29T20:07:28.743Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a8/12cc7b261f3082cc299ab61f677f7e48d93e35ca5c3c2f7241ed5525ccea/coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833", size = 241509, upload-time = "2023-05-29T20:07:30.434Z" }, + { url = "https://files.pythonhosted.org/packages/04/fa/43b55101f75a5e9115259e8be70ff9279921cb6b17f04c34a5702ff9b1f7/coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97", size = 239924, upload-time = "2023-05-29T20:07:32.065Z" }, + { url = "https://files.pythonhosted.org/packages/68/5f/d2bd0f02aa3c3e0311986e625ccf97fdc511b52f4f1a063e4f37b624772f/coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a", size = 240977, upload-time = "2023-05-29T20:07:34.184Z" }, + { url = "https://files.pythonhosted.org/packages/ba/92/69c0722882643df4257ecc5437b83f4c17ba9e67f15dc6b77bad89b6982e/coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a", size = 203168, upload-time = "2023-05-29T20:07:35.869Z" }, + { url = "https://files.pythonhosted.org/packages/b1/96/c12ed0dfd4ec587f3739f53eb677b9007853fd486ccb0e7d5512a27bab2e/coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562", size = 204185, upload-time = "2023-05-29T20:07:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d5/52fa1891d1802ab2e1b346d37d349cb41cdd4fd03f724ebbf94e80577687/coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4", size = 201020, upload-time = "2023-05-29T20:07:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/24/df/6765898d54ea20e3197a26d26bb65b084deefadd77ce7de946b9c96dfdc5/coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4", size = 233994, upload-time = "2023-05-29T20:07:40.274Z" }, + { url = "https://files.pythonhosted.org/packages/15/81/b108a60bc758b448c151e5abceed027ed77a9523ecbc6b8a390938301841/coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01", size = 231358, upload-time = "2023-05-29T20:07:41.998Z" }, + { url = "https://files.pythonhosted.org/packages/61/90/c76b9462f39897ebd8714faf21bc985b65c4e1ea6dff428ea9dc711ed0dd/coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6", size = 233316, upload-time = "2023-05-29T20:07:43.539Z" }, + { url = "https://files.pythonhosted.org/packages/04/d6/8cba3bf346e8b1a4fb3f084df7d8cea25a6b6c56aaca1f2e53829be17e9e/coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d", size = 240159, upload-time = "2023-05-29T20:07:44.982Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ea/4a252dc77ca0605b23d477729d139915e753ee89e4c9507630e12ad64a80/coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de", size = 238127, upload-time = "2023-05-29T20:07:46.522Z" }, + { url = "https://files.pythonhosted.org/packages/9f/5c/d9760ac497c41f9c4841f5972d0edf05d50cad7814e86ee7d133ec4a0ac8/coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d", size = 239833, upload-time = "2023-05-29T20:07:47.992Z" }, + { url = "https://files.pythonhosted.org/packages/69/8c/26a95b08059db1cbb01e4b0e6d40f2e9debb628c6ca86b78f625ceaf9bab/coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511", size = 203463, upload-time = "2023-05-29T20:07:49.939Z" }, + { url = "https://files.pythonhosted.org/packages/b7/00/14b00a0748e9eda26e97be07a63cc911108844004687321ddcc213be956c/coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3", size = 204347, upload-time = "2023-05-29T20:07:51.909Z" }, + { url = "https://files.pythonhosted.org/packages/80/d7/67937c80b8fd4c909fdac29292bc8b35d9505312cff6bcab41c53c5b1df6/coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f", size = 200580, upload-time = "2023-05-29T20:07:54.076Z" }, + { url = "https://files.pythonhosted.org/packages/7a/05/084864fa4bbf8106f44fb72a56e67e0cd372d3bf9d893be818338c81af5d/coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb", size = 226237, upload-time = "2023-05-29T20:07:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/67/a2/6fa66a50e6e894286d79a3564f42bd54a9bd27049dc0a63b26d9924f0aa3/coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9", size = 224256, upload-time = "2023-05-29T20:07:58.189Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c0/73f139794c742840b9ab88e2e17fe14a3d4668a166ff95d812ac66c0829d/coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd", size = 225550, upload-time = "2023-05-29T20:08:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/03/ec/6f30b4e0c96ce03b0e64aec46b4af2a8c49b70d1b5d0d69577add757b946/coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a", size = 232440, upload-time = "2023-05-29T20:08:02.495Z" }, + { url = "https://files.pythonhosted.org/packages/22/c1/2f6c1b6f01a0996c9e067a9c780e1824351dbe17faae54388a4477e6d86f/coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959", size = 230897, upload-time = "2023-05-29T20:08:04.382Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d6/53e999ec1bf7498ca4bc5f3b8227eb61db39068d2de5dcc359dec5601b5a/coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02", size = 232024, upload-time = "2023-05-29T20:08:06.031Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/383305500d24122dbed73e505a4d6828f8f3356d1f68ab6d32c781754b81/coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f", size = 203293, upload-time = "2023-05-29T20:08:07.598Z" }, + { url = "https://files.pythonhosted.org/packages/0e/bc/7e3a31534fabb043269f14fb64e2bb2733f85d4cf39e5bbc71357c57553a/coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0", size = 204040, upload-time = "2023-05-29T20:08:09.919Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fc/be19131010930a6cf271da48202c8cc1d3f971f68c02fb2d3a78247f43dc/coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5", size = 200689, upload-time = "2023-05-29T20:08:11.594Z" }, + { url = "https://files.pythonhosted.org/packages/28/d7/9a8de57d87f4bbc6f9a6a5ded1eaac88a89bf71369bb935dac3c0cf2893e/coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5", size = 200986, upload-time = "2023-05-29T20:08:13.228Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e4/e6182e4697665fb594a7f4e4f27cb3a4dd00c2e3d35c5c706765de8c7866/coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9", size = 230648, upload-time = "2023-05-29T20:08:15.11Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e3/f552d5871943f747165b92a924055c5d6daa164ae659a13f9018e22f3990/coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6", size = 228511, upload-time = "2023-05-29T20:08:16.877Z" }, + { url = "https://files.pythonhosted.org/packages/44/55/49f65ccdd4dfd6d5528e966b28c37caec64170c725af32ab312889d2f857/coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e", size = 229852, upload-time = "2023-05-29T20:08:18.47Z" }, + { url = "https://files.pythonhosted.org/packages/0d/31/340428c238eb506feb96d4fb5c9ea614db1149517f22cc7ab8c6035ef6d9/coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050", size = 235578, upload-time = "2023-05-29T20:08:20.298Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ce/97c1dd6592c908425622fe7f31c017d11cf0421729b09101d4de75bcadc8/coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5", size = 234079, upload-time = "2023-05-29T20:08:22.365Z" }, + { url = "https://files.pythonhosted.org/packages/de/a3/5a98dc9e239d0dc5f243ef5053d5b1bdcaa1dee27a691dfc12befeccf878/coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f", size = 234991, upload-time = "2023-05-29T20:08:24.974Z" }, + { url = "https://files.pythonhosted.org/packages/4a/fb/78986d3022e5ccf2d4370bc43a5fef8374f092b3c21d32499dee8e30b7b6/coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e", size = 203160, upload-time = "2023-05-29T20:08:26.701Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1c/6b3c9c363fb1433c79128e0d692863deb761b1b78162494abb9e5c328bc0/coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c", size = 204085, upload-time = "2023-05-29T20:08:28.146Z" }, + { url = "https://files.pythonhosted.org/packages/88/da/495944ebf0ad246235a6bd523810d9f81981f9b81c6059ba1f56e943abe0/coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9", size = 200725, upload-time = "2023-05-29T20:08:29.851Z" }, + { url = "https://files.pythonhosted.org/packages/ca/0c/3dfeeb1006c44b911ee0ed915350db30325d01808525ae7cc8d57643a2ce/coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2", size = 201022, upload-time = "2023-05-29T20:08:31.429Z" }, + { url = "https://files.pythonhosted.org/packages/61/af/5964b8d7d9a5c767785644d9a5a63cacba9a9c45cc42ba06d25895ec87be/coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7", size = 229102, upload-time = "2023-05-29T20:08:32.982Z" }, + { url = "https://files.pythonhosted.org/packages/d9/1d/cd467fceb62c371f9adb1d739c92a05d4e550246daa90412e711226bd320/coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e", size = 227441, upload-time = "2023-05-29T20:08:35.044Z" }, + { url = "https://files.pythonhosted.org/packages/fe/57/e4f8ad64d84ca9e759d783a052795f62a9f9111585e46068845b1cb52c2b/coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1", size = 228265, upload-time = "2023-05-29T20:08:36.861Z" }, + { url = "https://files.pythonhosted.org/packages/88/8b/b0d9fe727acae907fa7f1c8194ccb6fe9d02e1c3e9001ecf74c741f86110/coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9", size = 234217, upload-time = "2023-05-29T20:08:38.837Z" }, + { url = "https://files.pythonhosted.org/packages/66/2e/c99fe1f6396d93551aa352c75410686e726cd4ea104479b9af1af22367ce/coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250", size = 232466, upload-time = "2023-05-29T20:08:40.768Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e9/88747b40c8fb4a783b40222510ce6d66170217eb05d7f46462c36b4fa8cc/coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2", size = 233669, upload-time = "2023-05-29T20:08:42.944Z" }, + { url = "https://files.pythonhosted.org/packages/b1/d5/a8e276bc005e42114468d4fe03e0a9555786bc51cbfe0d20827a46c1565a/coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb", size = 203199, upload-time = "2023-05-29T20:08:44.734Z" }, + { url = "https://files.pythonhosted.org/packages/a9/0c/4a848ae663b47f1195abcb09a951751dd61f80b503303b9b9d768e0fd321/coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27", size = 204109, upload-time = "2023-05-29T20:08:46.417Z" }, + { url = "https://files.pythonhosted.org/packages/67/fb/b3b1d7887e1ea25a9608b0776e480e4bbc303ca95a31fd585555ec4fff5a/coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d", size = 193207, upload-time = "2023-05-29T20:08:48.153Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] + +[[package]] +name = "coverage" +version = "7.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791, upload-time = "2024-08-04T19:45:30.9Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/61/eb7ce5ed62bacf21beca4937a90fe32545c91a3c8a42a30c6616d48fc70d/coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", size = 206690, upload-time = "2024-08-04T19:43:07.695Z" }, + { url = "https://files.pythonhosted.org/packages/7d/73/041928e434442bd3afde5584bdc3f932fb4562b1597629f537387cec6f3d/coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", size = 207127, upload-time = "2024-08-04T19:43:10.15Z" }, + { url = "https://files.pythonhosted.org/packages/c7/c8/6ca52b5147828e45ad0242388477fdb90df2c6cbb9a441701a12b3c71bc8/coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", size = 235654, upload-time = "2024-08-04T19:43:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/9ac2b62557f4340270942011d6efeab9833648380109e897d48ab7c1035d/coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc", size = 233598, upload-time = "2024-08-04T19:43:14.078Z" }, + { url = "https://files.pythonhosted.org/packages/53/23/9e2c114d0178abc42b6d8d5281f651a8e6519abfa0ef460a00a91f80879d/coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", size = 234732, upload-time = "2024-08-04T19:43:16.632Z" }, + { url = "https://files.pythonhosted.org/packages/0f/7e/a0230756fb133343a52716e8b855045f13342b70e48e8ad41d8a0d60ab98/coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", size = 233816, upload-time = "2024-08-04T19:43:19.049Z" }, + { url = "https://files.pythonhosted.org/packages/28/7c/3753c8b40d232b1e5eeaed798c875537cf3cb183fb5041017c1fdb7ec14e/coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", size = 232325, upload-time = "2024-08-04T19:43:21.246Z" }, + { url = "https://files.pythonhosted.org/packages/57/e3/818a2b2af5b7573b4b82cf3e9f137ab158c90ea750a8f053716a32f20f06/coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", size = 233418, upload-time = "2024-08-04T19:43:22.945Z" }, + { url = "https://files.pythonhosted.org/packages/c8/fb/4532b0b0cefb3f06d201648715e03b0feb822907edab3935112b61b885e2/coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", size = 209343, upload-time = "2024-08-04T19:43:25.121Z" }, + { url = "https://files.pythonhosted.org/packages/5a/25/af337cc7421eca1c187cc9c315f0a755d48e755d2853715bfe8c418a45fa/coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", size = 210136, upload-time = "2024-08-04T19:43:26.851Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", size = 206796, upload-time = "2024-08-04T19:43:29.115Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", size = 207244, upload-time = "2024-08-04T19:43:31.285Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", size = 239279, upload-time = "2024-08-04T19:43:33.581Z" }, + { url = "https://files.pythonhosted.org/packages/70/6c/a9ccd6fe50ddaf13442a1e2dd519ca805cbe0f1fcd377fba6d8339b98ccb/coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", size = 236859, upload-time = "2024-08-04T19:43:35.301Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", size = 238549, upload-time = "2024-08-04T19:43:37.578Z" }, + { url = "https://files.pythonhosted.org/packages/68/3c/289b81fa18ad72138e6d78c4c11a82b5378a312c0e467e2f6b495c260907/coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", size = 237477, upload-time = "2024-08-04T19:43:39.92Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1c/aa1efa6459d822bd72c4abc0b9418cf268de3f60eeccd65dc4988553bd8d/coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", size = 236134, upload-time = "2024-08-04T19:43:41.453Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c8/521c698f2d2796565fe9c789c2ee1ccdae610b3aa20b9b2ef980cc253640/coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", size = 236910, upload-time = "2024-08-04T19:43:43.037Z" }, + { url = "https://files.pythonhosted.org/packages/7d/30/033e663399ff17dca90d793ee8a2ea2890e7fdf085da58d82468b4220bf7/coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", size = 209348, upload-time = "2024-08-04T19:43:44.787Z" }, + { url = "https://files.pythonhosted.org/packages/20/05/0d1ccbb52727ccdadaa3ff37e4d2dc1cd4d47f0c3df9eb58d9ec8508ca88/coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", size = 210230, upload-time = "2024-08-04T19:43:46.707Z" }, + { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983, upload-time = "2024-08-04T19:43:49.082Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221, upload-time = "2024-08-04T19:43:52.15Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342, upload-time = "2024-08-04T19:43:53.746Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371, upload-time = "2024-08-04T19:43:55.993Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455, upload-time = "2024-08-04T19:43:57.618Z" }, + { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924, upload-time = "2024-08-04T19:44:00.012Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252, upload-time = "2024-08-04T19:44:01.713Z" }, + { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897, upload-time = "2024-08-04T19:44:03.898Z" }, + { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606, upload-time = "2024-08-04T19:44:05.532Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373, upload-time = "2024-08-04T19:44:07.079Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007, upload-time = "2024-08-04T19:44:09.453Z" }, + { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269, upload-time = "2024-08-04T19:44:11.045Z" }, + { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886, upload-time = "2024-08-04T19:44:12.83Z" }, + { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037, upload-time = "2024-08-04T19:44:15.393Z" }, + { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038, upload-time = "2024-08-04T19:44:17.466Z" }, + { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690, upload-time = "2024-08-04T19:44:19.336Z" }, + { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765, upload-time = "2024-08-04T19:44:20.994Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611, upload-time = "2024-08-04T19:44:22.616Z" }, + { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671, upload-time = "2024-08-04T19:44:24.418Z" }, + { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368, upload-time = "2024-08-04T19:44:26.276Z" }, + { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758, upload-time = "2024-08-04T19:44:29.028Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035, upload-time = "2024-08-04T19:44:30.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839, upload-time = "2024-08-04T19:44:32.412Z" }, + { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569, upload-time = "2024-08-04T19:44:34.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927, upload-time = "2024-08-04T19:44:36.313Z" }, + { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401, upload-time = "2024-08-04T19:44:38.155Z" }, + { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301, upload-time = "2024-08-04T19:44:39.883Z" }, + { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598, upload-time = "2024-08-04T19:44:41.59Z" }, + { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307, upload-time = "2024-08-04T19:44:43.301Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453, upload-time = "2024-08-04T19:44:45.677Z" }, + { url = "https://files.pythonhosted.org/packages/81/d0/d9e3d554e38beea5a2e22178ddb16587dbcbe9a1ef3211f55733924bf7fa/coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", size = 206674, upload-time = "2024-08-04T19:44:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/ea/cab2dc248d9f45b2b7f9f1f596a4d75a435cb364437c61b51d2eb33ceb0e/coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", size = 207101, upload-time = "2024-08-04T19:44:49.32Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6f/f82f9a500c7c5722368978a5390c418d2a4d083ef955309a8748ecaa8920/coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", size = 236554, upload-time = "2024-08-04T19:44:51.631Z" }, + { url = "https://files.pythonhosted.org/packages/a6/94/d3055aa33d4e7e733d8fa309d9adf147b4b06a82c1346366fc15a2b1d5fa/coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", size = 234440, upload-time = "2024-08-04T19:44:53.464Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/885bcd787d9dd674de4a7d8ec83faf729534c63d05d51d45d4fa168f7102/coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", size = 235889, upload-time = "2024-08-04T19:44:55.165Z" }, + { url = "https://files.pythonhosted.org/packages/f4/63/df50120a7744492710854860783d6819ff23e482dee15462c9a833cc428a/coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", size = 235142, upload-time = "2024-08-04T19:44:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5d/9d0acfcded2b3e9ce1c7923ca52ccc00c78a74e112fc2aee661125b7843b/coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", size = 233805, upload-time = "2024-08-04T19:44:59.033Z" }, + { url = "https://files.pythonhosted.org/packages/c4/56/50abf070cb3cd9b1dd32f2c88f083aab561ecbffbcd783275cb51c17f11d/coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", size = 234655, upload-time = "2024-08-04T19:45:01.398Z" }, + { url = "https://files.pythonhosted.org/packages/25/ee/b4c246048b8485f85a2426ef4abab88e48c6e80c74e964bea5cd4cd4b115/coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", size = 209296, upload-time = "2024-08-04T19:45:03.819Z" }, + { url = "https://files.pythonhosted.org/packages/5c/1c/96cf86b70b69ea2b12924cdf7cabb8ad10e6130eab8d767a1099fbd2a44f/coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", size = 210137, upload-time = "2024-08-04T19:45:06.25Z" }, + { url = "https://files.pythonhosted.org/packages/19/d3/d54c5aa83268779d54c86deb39c1c4566e5d45c155369ca152765f8db413/coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", size = 206688, upload-time = "2024-08-04T19:45:08.358Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fe/137d5dca72e4a258b1bc17bb04f2e0196898fe495843402ce826a7419fe3/coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", size = 207120, upload-time = "2024-08-04T19:45:11.526Z" }, + { url = "https://files.pythonhosted.org/packages/78/5b/a0a796983f3201ff5485323b225d7c8b74ce30c11f456017e23d8e8d1945/coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", size = 235249, upload-time = "2024-08-04T19:45:13.202Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e1/76089d6a5ef9d68f018f65411fcdaaeb0141b504587b901d74e8587606ad/coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", size = 233237, upload-time = "2024-08-04T19:45:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", size = 234311, upload-time = "2024-08-04T19:45:16.924Z" }, + { url = "https://files.pythonhosted.org/packages/75/e1/656d65fb126c29a494ef964005702b012f3498db1a30dd562958e85a4049/coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", size = 233453, upload-time = "2024-08-04T19:45:18.672Z" }, + { url = "https://files.pythonhosted.org/packages/68/6a/45f108f137941a4a1238c85f28fd9d048cc46b5466d6b8dda3aba1bb9d4f/coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", size = 231958, upload-time = "2024-08-04T19:45:20.63Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e7/47b809099168b8b8c72ae311efc3e88c8d8a1162b3ba4b8da3cfcdb85743/coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", size = 232938, upload-time = "2024-08-04T19:45:23.062Z" }, + { url = "https://files.pythonhosted.org/packages/52/80/052222ba7058071f905435bad0ba392cc12006380731c37afaf3fe749b88/coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", size = 209352, upload-time = "2024-08-04T19:45:25.042Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d8/1b92e0b3adcf384e98770a00ca095da1b5f7b483e6563ae4eb5e935d24a1/coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", size = 210153, upload-time = "2024-08-04T19:45:27.079Z" }, + { url = "https://files.pythonhosted.org/packages/a5/2b/0354ed096bca64dc8e32a7cbcae28b34cb5ad0b1fe2125d6d99583313ac0/coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", size = 198926, upload-time = "2024-08-04T19:45:28.875Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] + +[[package]] +name = "coverage" +version = "7.10.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6c/3a3f7a46888e69d18abe3ccc6fe4cb16cccb1e6a2f99698931dafca489e6/coverage-7.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc04cc7a3db33664e0c2d10eb8990ff6b3536f6842c9590ae8da4c614b9ed05a", size = 217987, upload-time = "2025-09-21T20:00:57.218Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/952d30f180b1a916c11a56f5c22d3535e943aa22430e9e3322447e520e1c/coverage-7.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e201e015644e207139f7e2351980feb7040e6f4b2c2978892f3e3789d1c125e5", size = 218388, upload-time = "2025-09-21T20:01:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/9e0cf8ded1e114bcd8b2fd42792b57f1c4e9e4ea1824cde2af93a67305be/coverage-7.10.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:240af60539987ced2c399809bd34f7c78e8abe0736af91c3d7d0e795df633d17", size = 245148, upload-time = "2025-09-21T20:01:01.768Z" }, + { url = "https://files.pythonhosted.org/packages/19/20/d0384ac06a6f908783d9b6aa6135e41b093971499ec488e47279f5b846e6/coverage-7.10.7-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8421e088bc051361b01c4b3a50fd39a4b9133079a2229978d9d30511fd05231b", size = 246958, upload-time = "2025-09-21T20:01:03.355Z" }, + { url = "https://files.pythonhosted.org/packages/60/83/5c283cff3d41285f8eab897651585db908a909c572bdc014bcfaf8a8b6ae/coverage-7.10.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be8ed3039ae7f7ac5ce058c308484787c86e8437e72b30bf5e88b8ea10f3c87", size = 248819, upload-time = "2025-09-21T20:01:04.968Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/02eb98fdc5ff79f423e990d877693e5310ae1eab6cb20ae0b0b9ac45b23b/coverage-7.10.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e28299d9f2e889e6d51b1f043f58d5f997c373cc12e6403b90df95b8b047c13e", size = 245754, upload-time = "2025-09-21T20:01:06.321Z" }, + { url = "https://files.pythonhosted.org/packages/b4/bc/25c83bcf3ad141b32cd7dc45485ef3c01a776ca3aa8ef0a93e77e8b5bc43/coverage-7.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4e16bd7761c5e454f4efd36f345286d6f7c5fa111623c355691e2755cae3b9e", size = 246860, upload-time = "2025-09-21T20:01:07.605Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b7/95574702888b58c0928a6e982038c596f9c34d52c5e5107f1eef729399b5/coverage-7.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b1c81d0e5e160651879755c9c675b974276f135558cf4ba79fee7b8413a515df", size = 244877, upload-time = "2025-09-21T20:01:08.829Z" }, + { url = "https://files.pythonhosted.org/packages/47/b6/40095c185f235e085df0e0b158f6bd68cc6e1d80ba6c7721dc81d97ec318/coverage-7.10.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:606cc265adc9aaedcc84f1f064f0e8736bc45814f15a357e30fca7ecc01504e0", size = 245108, upload-time = "2025-09-21T20:01:10.527Z" }, + { url = "https://files.pythonhosted.org/packages/c8/50/4aea0556da7a4b93ec9168420d170b55e2eb50ae21b25062513d020c6861/coverage-7.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10b24412692df990dbc34f8fb1b6b13d236ace9dfdd68df5b28c2e39cafbba13", size = 245752, upload-time = "2025-09-21T20:01:11.857Z" }, + { url = "https://files.pythonhosted.org/packages/6a/28/ea1a84a60828177ae3b100cb6723838523369a44ec5742313ed7db3da160/coverage-7.10.7-cp310-cp310-win32.whl", hash = "sha256:b51dcd060f18c19290d9b8a9dd1e0181538df2ce0717f562fff6cf74d9fc0b5b", size = 220497, upload-time = "2025-09-21T20:01:13.459Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1a/a81d46bbeb3c3fd97b9602ebaa411e076219a150489bcc2c025f151bd52d/coverage-7.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:3a622ac801b17198020f09af3eaf45666b344a0d69fc2a6ffe2ea83aeef1d807", size = 221392, upload-time = "2025-09-21T20:01:14.722Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5d/c1a17867b0456f2e9ce2d8d4708a4c3a089947d0bec9c66cdf60c9e7739f/coverage-7.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a609f9c93113be646f44c2a0256d6ea375ad047005d7f57a5c15f614dc1b2f59", size = 218102, upload-time = "2025-09-21T20:01:16.089Z" }, + { url = "https://files.pythonhosted.org/packages/54/f0/514dcf4b4e3698b9a9077f084429681bf3aad2b4a72578f89d7f643eb506/coverage-7.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:65646bb0359386e07639c367a22cf9b5bf6304e8630b565d0626e2bdf329227a", size = 218505, upload-time = "2025-09-21T20:01:17.788Z" }, + { url = "https://files.pythonhosted.org/packages/20/f6/9626b81d17e2a4b25c63ac1b425ff307ecdeef03d67c9a147673ae40dc36/coverage-7.10.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f33166f0dfcce728191f520bd2692914ec70fac2713f6bf3ce59c3deacb4699", size = 248898, upload-time = "2025-09-21T20:01:19.488Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ef/bd8e719c2f7417ba03239052e099b76ea1130ac0cbb183ee1fcaa58aaff3/coverage-7.10.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f5e3f9e455bb17831876048355dca0f758b6df22f49258cb5a91da23ef437d", size = 250831, upload-time = "2025-09-21T20:01:20.817Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b6/bf054de41ec948b151ae2b79a55c107f5760979538f5fb80c195f2517718/coverage-7.10.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da86b6d62a496e908ac2898243920c7992499c1712ff7c2b6d837cc69d9467e", size = 252937, upload-time = "2025-09-21T20:01:22.171Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e5/3860756aa6f9318227443c6ce4ed7bf9e70bb7f1447a0353f45ac5c7974b/coverage-7.10.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6b8b09c1fad947c84bbbc95eca841350fad9cbfa5a2d7ca88ac9f8d836c92e23", size = 249021, upload-time = "2025-09-21T20:01:23.907Z" }, + { url = "https://files.pythonhosted.org/packages/26/0f/bd08bd042854f7fd07b45808927ebcce99a7ed0f2f412d11629883517ac2/coverage-7.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4376538f36b533b46f8971d3a3e63464f2c7905c9800db97361c43a2b14792ab", size = 250626, upload-time = "2025-09-21T20:01:25.721Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a7/4777b14de4abcc2e80c6b1d430f5d51eb18ed1d75fca56cbce5f2db9b36e/coverage-7.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:121da30abb574f6ce6ae09840dae322bef734480ceafe410117627aa54f76d82", size = 248682, upload-time = "2025-09-21T20:01:27.105Z" }, + { url = "https://files.pythonhosted.org/packages/34/72/17d082b00b53cd45679bad682fac058b87f011fd8b9fe31d77f5f8d3a4e4/coverage-7.10.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:88127d40df529336a9836870436fc2751c339fbaed3a836d42c93f3e4bd1d0a2", size = 248402, upload-time = "2025-09-21T20:01:28.629Z" }, + { url = "https://files.pythonhosted.org/packages/81/7a/92367572eb5bdd6a84bfa278cc7e97db192f9f45b28c94a9ca1a921c3577/coverage-7.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba58bbcd1b72f136080c0bccc2400d66cc6115f3f906c499013d065ac33a4b61", size = 249320, upload-time = "2025-09-21T20:01:30.004Z" }, + { url = "https://files.pythonhosted.org/packages/2f/88/a23cc185f6a805dfc4fdf14a94016835eeb85e22ac3a0e66d5e89acd6462/coverage-7.10.7-cp311-cp311-win32.whl", hash = "sha256:972b9e3a4094b053a4e46832b4bc829fc8a8d347160eb39d03f1690316a99c14", size = 220536, upload-time = "2025-09-21T20:01:32.184Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ef/0b510a399dfca17cec7bc2f05ad8bd78cf55f15c8bc9a73ab20c5c913c2e/coverage-7.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:a7b55a944a7f43892e28ad4bc0561dfd5f0d73e605d1aa5c3c976b52aea121d2", size = 221425, upload-time = "2025-09-21T20:01:33.557Z" }, + { url = "https://files.pythonhosted.org/packages/51/7f/023657f301a276e4ba1850f82749bc136f5a7e8768060c2e5d9744a22951/coverage-7.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:736f227fb490f03c6488f9b6d45855f8e0fd749c007f9303ad30efab0e73c05a", size = 220103, upload-time = "2025-09-21T20:01:34.929Z" }, + { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload-time = "2025-09-21T20:01:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload-time = "2025-09-21T20:01:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload-time = "2025-09-21T20:01:39.617Z" }, + { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload-time = "2025-09-21T20:01:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload-time = "2025-09-21T20:01:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload-time = "2025-09-21T20:01:44.469Z" }, + { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload-time = "2025-09-21T20:01:45.915Z" }, + { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload-time = "2025-09-21T20:01:47.296Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload-time = "2025-09-21T20:01:48.73Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload-time = "2025-09-21T20:01:50.529Z" }, + { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload-time = "2025-09-21T20:01:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload-time = "2025-09-21T20:01:53.481Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload-time = "2025-09-21T20:01:55.2Z" }, + { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload-time = "2025-09-21T20:01:56.629Z" }, + { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload-time = "2025-09-21T20:01:58.203Z" }, + { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload-time = "2025-09-21T20:01:59.748Z" }, + { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload-time = "2025-09-21T20:02:01.192Z" }, + { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload-time = "2025-09-21T20:02:02.701Z" }, + { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload-time = "2025-09-21T20:02:04.185Z" }, + { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload-time = "2025-09-21T20:02:06.034Z" }, + { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload-time = "2025-09-21T20:02:07.619Z" }, + { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload-time = "2025-09-21T20:02:10.34Z" }, + { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload-time = "2025-09-21T20:02:12.122Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload-time = "2025-09-21T20:02:13.919Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload-time = "2025-09-21T20:02:15.57Z" }, + { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload-time = "2025-09-21T20:02:17.395Z" }, + { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload-time = "2025-09-21T20:02:18.936Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload-time = "2025-09-21T20:02:20.44Z" }, + { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload-time = "2025-09-21T20:02:22.313Z" }, + { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload-time = "2025-09-21T20:02:24.287Z" }, + { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload-time = "2025-09-21T20:02:26.133Z" }, + { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload-time = "2025-09-21T20:02:27.716Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload-time = "2025-09-21T20:02:29.216Z" }, + { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload-time = "2025-09-21T20:02:31.226Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload-time = "2025-09-21T20:02:32.823Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload-time = "2025-09-21T20:02:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload-time = "2025-09-21T20:02:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload-time = "2025-09-21T20:02:39.011Z" }, + { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload-time = "2025-09-21T20:02:40.939Z" }, + { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" }, + { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" }, + { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" }, + { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" }, + { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" }, + { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload-time = "2025-09-21T20:03:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload-time = "2025-09-21T20:03:03.4Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload-time = "2025-09-21T20:03:05.111Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" }, + { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" }, + { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" }, + { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload-time = "2025-09-21T20:03:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload-time = "2025-09-21T20:03:26.93Z" }, + { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload-time = "2025-09-21T20:03:28.672Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/d1c25053764b4c42eb294aae92ab617d2e4f803397f9c7c8295caa77a260/coverage-7.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fff7b9c3f19957020cac546c70025331113d2e61537f6e2441bc7657913de7d3", size = 217978, upload-time = "2025-09-21T20:03:30.362Z" }, + { url = "https://files.pythonhosted.org/packages/52/2f/b9f9daa39b80ece0b9548bbb723381e29bc664822d9a12c2135f8922c22b/coverage-7.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc91b314cef27742da486d6839b677b3f2793dfe52b51bbbb7cf736d5c29281c", size = 218370, upload-time = "2025-09-21T20:03:32.147Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6e/30d006c3b469e58449650642383dddf1c8fb63d44fdf92994bfd46570695/coverage-7.10.7-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:567f5c155eda8df1d3d439d40a45a6a5f029b429b06648235f1e7e51b522b396", size = 244802, upload-time = "2025-09-21T20:03:33.919Z" }, + { url = "https://files.pythonhosted.org/packages/b0/49/8a070782ce7e6b94ff6a0b6d7c65ba6bc3091d92a92cef4cd4eb0767965c/coverage-7.10.7-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af88deffcc8a4d5974cf2d502251bc3b2db8461f0b66d80a449c33757aa9f40", size = 246625, upload-time = "2025-09-21T20:03:36.09Z" }, + { url = "https://files.pythonhosted.org/packages/6a/92/1c1c5a9e8677ce56d42b97bdaca337b2d4d9ebe703d8c174ede52dbabd5f/coverage-7.10.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7315339eae3b24c2d2fa1ed7d7a38654cba34a13ef19fbcb9425da46d3dc594", size = 248399, upload-time = "2025-09-21T20:03:38.342Z" }, + { url = "https://files.pythonhosted.org/packages/c0/54/b140edee7257e815de7426d5d9846b58505dffc29795fff2dfb7f8a1c5a0/coverage-7.10.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:912e6ebc7a6e4adfdbb1aec371ad04c68854cd3bf3608b3514e7ff9062931d8a", size = 245142, upload-time = "2025-09-21T20:03:40.591Z" }, + { url = "https://files.pythonhosted.org/packages/e4/9e/6d6b8295940b118e8b7083b29226c71f6154f7ff41e9ca431f03de2eac0d/coverage-7.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f49a05acd3dfe1ce9715b657e28d138578bc40126760efb962322c56e9ca344b", size = 246284, upload-time = "2025-09-21T20:03:42.355Z" }, + { url = "https://files.pythonhosted.org/packages/db/e5/5e957ca747d43dbe4d9714358375c7546cb3cb533007b6813fc20fce37ad/coverage-7.10.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cce2109b6219f22ece99db7644b9622f54a4e915dad65660ec435e89a3ea7cc3", size = 244353, upload-time = "2025-09-21T20:03:44.218Z" }, + { url = "https://files.pythonhosted.org/packages/9a/45/540fc5cc92536a1b783b7ef99450bd55a4b3af234aae35a18a339973ce30/coverage-7.10.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:f3c887f96407cea3916294046fc7dab611c2552beadbed4ea901cbc6a40cc7a0", size = 244430, upload-time = "2025-09-21T20:03:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/75/0b/8287b2e5b38c8fe15d7e3398849bb58d382aedc0864ea0fa1820e8630491/coverage-7.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:635adb9a4507c9fd2ed65f39693fa31c9a3ee3a8e6dc64df033e8fdf52a7003f", size = 245311, upload-time = "2025-09-21T20:03:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/0c/1d/29724999984740f0c86d03e6420b942439bf5bd7f54d4382cae386a9d1e9/coverage-7.10.7-cp39-cp39-win32.whl", hash = "sha256:5a02d5a850e2979b0a014c412573953995174743a3f7fa4ea5a6e9a3c5617431", size = 220500, upload-time = "2025-09-21T20:03:50.024Z" }, + { url = "https://files.pythonhosted.org/packages/43/11/4b1e6b129943f905ca54c339f343877b55b365ae2558806c1be4f7476ed5/coverage-7.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:c134869d5ffe34547d14e174c866fd8fe2254918cc0a95e99052903bc1543e07", size = 221408, upload-time = "2025-09-21T20:03:51.803Z" }, + { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] + +[[package]] +name = "coverage" +version = "7.14.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/69/0d2ef01ff4b8fcecd4cba920d11e92fa4f96ae412441d3b56a90a258e69b/coverage-7.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e3680291c4a1d0dadfa84a2c459576a4af5133abb617905714339a0c73138cf", size = 219722, upload-time = "2026-05-26T20:38:14.002Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ae/9afdeaa31b9d9ce98124b6abf8bb49119bf71aecae04f8567c189d91299f/coverage-7.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5274669f37f2343635a347b91a60777621341ab3378e9c6ac9335eee704bddf", size = 220240, upload-time = "2026-05-26T20:38:17.424Z" }, + { url = "https://files.pythonhosted.org/packages/51/69/c998589871df7ea7dba865cc5ee32b5a3e1d47ba6c68ef91104c7c46fa5e/coverage-7.14.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfe5a5fec635799ef33428f1e5e61bafa45a92a96190ba731561ba558ccc214d", size = 246981, upload-time = "2026-05-26T20:38:19.266Z" }, + { url = "https://files.pythonhosted.org/packages/fc/10/1c7d04c13040dac531d21b712bbe08f902e6dd9b58f5d77875c4d030f8f2/coverage-7.14.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:62a9f70b52e0b5a95cfef4a5c5641b06983cadc5e538a3feeb5c00211f523ac2", size = 248812, upload-time = "2026-05-26T20:38:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/c1/65/2a38a4607ef27cadcfbcee034dba5830ae2569f90144a0f4c7dbf47d30b0/coverage-7.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c18ebc343e15be53049b3a2dce38fe82d58f37e20ab9094b3a39c0aa4f6bb47", size = 250675, upload-time = "2026-05-26T20:38:22.159Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a2/a446ed9752a4a59b79e0fb6cbb319f6facb2183045c0725462625e66f87e/coverage-7.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b84ffdf877644e7096aa936991efeed873f7f3df57b9cd001312b7668ab08550", size = 252590, upload-time = "2026-05-26T20:38:23.63Z" }, + { url = "https://files.pythonhosted.org/packages/9e/fd/e81fbd7ba752365546e9842b1cbdaad3d6919d2a522c590aef16a281ec5e/coverage-7.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e854312c4103f2ad4c0dc023b69b77ebfd2c89db5f86c4c94dc2353f9a92167e", size = 247691, upload-time = "2026-05-26T20:38:25.057Z" }, + { url = "https://files.pythonhosted.org/packages/53/35/f3c26fdaae9ea937d154ca4d372e5ea0a4167ff70d36c6074ac2eacb2f83/coverage-7.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c643734307300234fafa36bf2a040a7235f8f177ea1fd6ec1423aea6fb7b929f", size = 248716, upload-time = "2026-05-26T20:38:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/2e/14/940b6c49551fd343e8507ee2b0ba7af5d0aa04ed5bf768285cb7c72a9884/coverage-7.14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84ac9499e48700399a5dd0ea7085b5091961fec52c68d66b4ec0d3cf7f4441b1", size = 246721, upload-time = "2026-05-26T20:38:28.282Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2c/40fc0634186c28292a662dff578866b3913983d6c375a3c2a74020938719/coverage-7.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7f02d09f70776579b926d889a4c9c235070a1f47c40458aeaca563fae5acfdb5", size = 250533, upload-time = "2026-05-26T20:38:29.753Z" }, + { url = "https://files.pythonhosted.org/packages/de/e3/2c26bf1e811f9df991ff2a9bdddebdd13ee0665d564df7d05979f9146297/coverage-7.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ce66d8e46da2bb5ee313a745cbd2e391d319176c1f7a9451bfcd3a2fb920859b", size = 246990, upload-time = "2026-05-26T20:38:31.516Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b0/060260ef56bd92363ebdce0c7095ce422b06e69aae71828efeca473ab1ca/coverage-7.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c912c259304cfb5ee584481cfb7ce1ff932b4d61e6c9140b8f19cb7b5ed82332", size = 247593, upload-time = "2026-05-26T20:38:33.065Z" }, + { url = "https://files.pythonhosted.org/packages/63/f3/501502046efeb0d6d94b5ca54941d95f1184183dd6bdb7f283985783bb4a/coverage-7.14.1-cp310-cp310-win32.whl", hash = "sha256:1238cb94638e610e972c60dac68e813f868dc7d6e982535270558443058d9d59", size = 222330, upload-time = "2026-05-26T20:38:35.36Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5d/1bf99f2c558f128faf7906817ccbdb576ba815d3b41ce2ac1719b70a3663/coverage-7.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:fc459e5d73be2d6332fcfe8dbf3d8994671fe33c700f4565988ecfa511547253", size = 223261, upload-time = "2026-05-26T20:38:37.196Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d7/477ad149490e6cb849f28abea1dabb9c823cea72e7500c81b4240ce619c0/coverage-7.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:478b5bcd63c2e1357c5c7e16c070690df7b07f676b1c114d7b93e533c664309f", size = 219848, upload-time = "2026-05-26T20:38:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/91/82/a5eb47257c50601bb7b9a9d2857c67b7a3a85ad74180eb2c98bb1fbe0ce5/coverage-7.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a24a81f9715ee42ef59a316cc11611c98fe23920f7c81861315c9f3ff4a230f4", size = 220354, upload-time = "2026-05-26T20:38:40.232Z" }, + { url = "https://files.pythonhosted.org/packages/43/8b/78419b5391a5cb706b6544390507e469d83ffc9a8248b02c4011aceb9365/coverage-7.14.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:196a13319ad88d6d8ef5ab489ec4f44ddde2143c0c7d5b27786f6c3ffd56a7e1", size = 250771, upload-time = "2026-05-26T20:38:41.782Z" }, + { url = "https://files.pythonhosted.org/packages/77/63/e77aaacd491182210d639636b7a8bba23ffffa9b82aa3762da9431855fa9/coverage-7.14.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d452fd08b5c72c5167c93e6867b5c08500bd40f2a21e1e854a500550b6cc36f", size = 252683, upload-time = "2026-05-26T20:38:43.305Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/a022e3cfbec2ac241640003cb3a817e161d9c7f5aa9b49173756cdc03204/coverage-7.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23bf7fa51ac02e07fc7c96849b82946da47ae862dc8f86d183b2a4864fc38129", size = 254791, upload-time = "2026-05-26T20:38:45.361Z" }, + { url = "https://files.pythonhosted.org/packages/61/d6/967e408aca4c1ceb88cb0cc677169110ae7f5995fb5eaf5fb1f5a1bb8f5d/coverage-7.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcaa50684dcaadfa599ac48f81103c756d791cfd85c97203d2217c593d48b860", size = 256748, upload-time = "2026-05-26T20:38:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/b8/be/869188f7fe28638078ec479331ace6dc5f7b40b7153eb616f47ab79404d8/coverage-7.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ea1c034f95c9b056e856b794630b17f9fa3d57e4800ff1e503d3be0f9c9078c", size = 250907, upload-time = "2026-05-26T20:38:48.493Z" }, + { url = "https://files.pythonhosted.org/packages/07/aa/adb7d3b4278d690e68703abcd76ab1b948242e3668d921711551b78f9ddb/coverage-7.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e057326434e441306226fbeb5d1aaf14a2637efe97ba668306635835f32ad7", size = 252483, upload-time = "2026-05-26T20:38:50.074Z" }, + { url = "https://files.pythonhosted.org/packages/43/61/331c74103c62dcb0c4b9b3a0de9a61aca016208b0a90f109592a9f9ecc28/coverage-7.14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59baf88468dbc8d63b1887afd92bda52e40bb1561696e5819670601403810cec", size = 250545, upload-time = "2026-05-26T20:38:51.613Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b6/c5dae3c104d89be04828f61810e6b3473825482e4c288cc4ed04553e08ae/coverage-7.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d75f892b3ab73ba11cab5442cce7b3e168fd64162b16f0e1e0d09c508edef", size = 254310, upload-time = "2026-05-26T20:38:53.503Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a1/2b9d5863e3b83c01ad8199e3c597802fbb3a9dc90b058885804c20296d31/coverage-7.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3a56abc20a472baf0304c455721bc601477440d28ecfde8a03dde79ede07e0df", size = 250266, upload-time = "2026-05-26T20:38:55.414Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/0e511fbdb269359be26fe678a1c3fa1f2aa2a01573cc3f54268c8d6d4797/coverage-7.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a3cb83d1552c0cd1b4906655b6a33fd4a8473229633a901c6b73bf86914dee9", size = 251174, upload-time = "2026-05-26T20:38:57.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/10/e55307b622b3dd9671cb321824502dc10f93e72f2802b9946159a8edadeb/coverage-7.14.1-cp311-cp311-win32.whl", hash = "sha256:10274a1fbeb8ec5d72966e17bb198a3104257aca4ac09d98667c5f8aca8c8548", size = 222354, upload-time = "2026-05-26T20:38:58.727Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/107421693cfb71e4f1ca5bf70443f64d4161878068d07a3e51c7ad21d17b/coverage-7.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:87ebdf787d4888e3f3f2d523eadc6e18c6d18c6d0eb173801a189641627fb37e", size = 223290, upload-time = "2026-05-26T20:39:00.413Z" }, + { url = "https://files.pythonhosted.org/packages/b8/1d/3e3644585eb29e9dafefb19555078529a4d7cce12bd21929664eea989277/coverage-7.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:dd34767fa19848d35659ffc0a75314f58c7af3f1cd87ec521e8292a1238398a3", size = 221953, upload-time = "2026-05-26T20:39:02.159Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b7/bdbb725ba02c5b42825b200c940f38b7a54fcad24627b7192f78f8110d76/coverage-7.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a06c76364a9360e33d6d23769aefdf7f66f38e2ffb60ceb1baaa4989d83b695c", size = 220022, upload-time = "2026-05-26T20:39:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/de/72/de048c4a25e13bce59ac6a339351c10bdf2515e07459afcdaf04dc3143a2/coverage-7.14.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:84b535f00655ecafe1d929d1fb00ed5d6fa3051ea643ab2c161a3887b86f294b", size = 251888, upload-time = "2026-05-26T20:39:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, + { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, + { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/6f/ca6ad067364b337ef997802115e7ecad2abd2248b05471464b0dea02b4d4/coverage-7.14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e471bc5769ff073b058cfadb0d736b56ce067c8560eabeb0da88462df98c23e7", size = 251803, upload-time = "2026-05-26T20:39:17.537Z" }, + { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, + { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, + { url = "https://files.pythonhosted.org/packages/34/62/70a9024672a5f6910517d9628c52c9afbdd3cf8f46426af52bb148a56fff/coverage-7.14.1-cp312-cp312-win32.whl", hash = "sha256:4a28fd227808366b196a75476dced2eb35b351d6766ba9c858dc93319e87f4f1", size = 222567, upload-time = "2026-05-26T20:39:24.868Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e", size = 223372, upload-time = "2026-05-26T20:39:26.603Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ba/b44d472022f620d289d95fa830143235c0c36461c6f2437ea8d51e5481ed/coverage-7.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:99cd41ff91afd94896fea3bc002706b6ae4ce95727d06e4a0f39c0a8d8bd8b1a", size = 221989, upload-time = "2026-05-26T20:39:28.242Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9e/5f6d56327c62b185225d145191c607e07515294a0aa6338e58805cd4a5ac/coverage-7.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:be9f2c802dcfce3f71298303aa5dad0dce440a76c52f2f60dacd8656dab78793", size = 220044, upload-time = "2026-05-26T20:39:29.902Z" }, + { url = "https://files.pythonhosted.org/packages/75/92/e82aca356744cbbc0f77a0b623e38918c1872361963413a3bab5d0340393/coverage-7.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6223a72fd0e4c7156353ec0f08a5f93623e1d3034d0e2683b9bb8ea674131b1d", size = 220412, upload-time = "2026-05-26T20:39:31.561Z" }, + { url = "https://files.pythonhosted.org/packages/27/c9/385bde0bf7ed0f4bf3a7ee5367060a86b5d218718cfd6fb943c0f836b34f/coverage-7.14.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7279d2110a28cebc738b6459ecda2771735a4c18465fbbd36b3288fe5ed92247", size = 251412, upload-time = "2026-05-26T20:39:33.337Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/23faf6a2343a0d17f960a4bd56c43bc7eb4cf312f774dd6ceebd82c7d8fc/coverage-7.14.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9eeb3fcbc13ba40dfbdb22d01d196a28e9cef9ed4c29b60061a1e0e823a9929d", size = 254008, upload-time = "2026-05-26T20:39:35.009Z" }, + { url = "https://files.pythonhosted.org/packages/42/06/36f4aa9ca8a815e6036156e80706a67828bb97bd826948244f6996dda957/coverage-7.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f0cfc27c539f07cf5c0a4cfe211d0b6cae039f8f40526dbaa71944e64b50a7b", size = 255241, upload-time = "2026-05-26T20:39:36.71Z" }, + { url = "https://files.pythonhosted.org/packages/ca/79/95266316352f90f6b1c6736bb413302edfde2453fb32422d3911642691b3/coverage-7.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:221c70f316241a78e77e607c227cefc8808d4e08f28d99c04f35694690e940be", size = 257373, upload-time = "2026-05-26T20:39:38.412Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9c/58316d1f66c488b5fca8a0eb3e98348807813efa8a0d0833b9021be27488/coverage-7.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da028256b04ec30e5e0114b6f76172938c313991f0a2d3d894271315cf5d5e43", size = 251635, upload-time = "2026-05-26T20:39:40.268Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5a/ca2398a568e16fed7bb713e84ba3603a7164fb65779abe645c565ec890d5/coverage-7.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76a085d7005236a767e3426148b2c407e53ad61695c562f8a81da2d373324901", size = 253373, upload-time = "2026-05-26T20:39:42.145Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2c/0396562c32deaebe7be51d865b3a41e9a87d7561acafe1a28f53b07e019a/coverage-7.14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b553d04b5e778a8e56d57eb134aff42a92718ecba45e79c4764ecfa40efd92ff", size = 251341, upload-time = "2026-05-26T20:39:43.907Z" }, + { url = "https://files.pythonhosted.org/packages/fd/8f/a94f9221184c9cae1ee115820e3798e48b6b17777a9f19e46fb9a0c8dc74/coverage-7.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:46f714d2fb8ae2f4f29f23ada7f1e79b759fff5a70f94a1dac23af204c3ec9e4", size = 255497, upload-time = "2026-05-26T20:39:46.166Z" }, + { url = "https://files.pythonhosted.org/packages/71/69/505d70e47db1eaebcd002c39759707621ef184cd6b1ae084d9f41293f323/coverage-7.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1896f5e19ff3f0431c7ce2172adc54890fd97f86b59ced8ca1649145d9ffe35d", size = 251159, upload-time = "2026-05-26T20:39:48.03Z" }, + { url = "https://files.pythonhosted.org/packages/e0/aa/58681c383aa33a9d2ed40a02d7a22fbf780d1fa4d575396365777828198c/coverage-7.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:62fd185ef9df3c33d1c8178c5af105f762afbad96038de9a4ae100aa6297ca33", size = 252934, upload-time = "2026-05-26T20:39:49.872Z" }, + { url = "https://files.pythonhosted.org/packages/eb/fd/11c928cd6bdffc7074bb5965c173d9ebf517fb00205e1da524b98d29ef92/coverage-7.14.1-cp313-cp313-win32.whl", hash = "sha256:ab4af6352741a604c431c6072fce5bee33bf0f20dc7a56618d6bf6bb89e9810c", size = 222584, upload-time = "2026-05-26T20:39:51.68Z" }, + { url = "https://files.pythonhosted.org/packages/6f/92/fb416fc26d340dcba19518c418d6048e913186e17243982c5e435e41fa7a/coverage-7.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:7af486dabe8954d03b087f0021540897afe084f04e16ff5579e08cc46f871416", size = 223394, upload-time = "2026-05-26T20:39:53.472Z" }, + { url = "https://files.pythonhosted.org/packages/73/c6/02d56e3867972f77d5036de924643f26c056e848f00452cafb4dbc3c29b4/coverage-7.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:2224f89ffd0c5605ccce1ed7a584da162bc7c55f601ab1c946bc9de31a486b42", size = 222015, upload-time = "2026-05-26T20:39:55.374Z" }, + { url = "https://files.pythonhosted.org/packages/4d/9e/fcc77914050df73f7662fa1f00902774c79c075a8388ab334074574bf77e/coverage-7.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de286598cc65d2b489411174b1faec2f5a7775fb3201fd925db2a76b4030f37d", size = 220733, upload-time = "2026-05-26T20:39:57.189Z" }, + { url = "https://files.pythonhosted.org/packages/f7/67/2963cbdaf5cbadec44efa3a1e39eaa1f02df4079585f05387607a221e126/coverage-7.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:042c46ded7c288aeb07cf14a28b6c1e10b78fcba40171c3fa1e939377eeef0b5", size = 221086, upload-time = "2026-05-26T20:39:59.019Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/8701645574e11881f2f47d8930f98bc48b5d43b25eb5b4430dfc4a2f9f48/coverage-7.14.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f4ddbe407477f04c45115d1a4e5bc480f753553b534d338d4c3358b1cdd0ea52", size = 262381, upload-time = "2026-05-26T20:40:00.822Z" }, + { url = "https://files.pythonhosted.org/packages/7c/28/7a64d73598263e0c5abd5084211a8474488d31b3c552ff531c719dfcff62/coverage-7.14.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d13e6725992e2d2fd7d81d4f5241952d13740121dfd501da09201be39b2c003a", size = 264458, upload-time = "2026-05-26T20:40:02.506Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d8/4969179db9f7eb4df218e69540adf829d1c835f59452513d065d15446802/coverage-7.14.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f747dc8edcfe740130f28f32f3995e955494285717e86ee25af51db2219df08a", size = 266884, upload-time = "2026-05-26T20:40:04.421Z" }, + { url = "https://files.pythonhosted.org/packages/a6/78/a45d5794dbc9bafd97afc96a4377c86c7820d78b6cf51b89bc1d4e919275/coverage-7.14.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced2f09ef276fd58611a1ef502164ad266d2b75174e5a40cabbdb4033f9f6cf2", size = 268022, upload-time = "2026-05-26T20:40:06.298Z" }, + { url = "https://files.pythonhosted.org/packages/21/cb/4f5e354e9e3e67af96bd4e57113e6db6b22298c7168b13eec408a549903d/coverage-7.14.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b84800013769a78ccb9ef4659402e26d06867e337b61ec365f77ad008adea80e", size = 261631, upload-time = "2026-05-26T20:40:08.226Z" }, + { url = "https://files.pythonhosted.org/packages/ec/49/eced49af4cb996d5d8b7e94e736175c513e4facd3398507b89892b4326d8/coverage-7.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ea8cd6ca0ee9f616aaef3afc6882e32c2cbf18b00d96313ffd76af650574034d", size = 264443, upload-time = "2026-05-26T20:40:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/5603a88a7c5913a6b54f6cb1a8c46f7b39cbb30f27cd3f492908da09b2d7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:aa5e304a873fabddc11e484e9b6b738bd38bd7bed17b09aa84eecf5332e8b8bb", size = 262069, upload-time = "2026-05-26T20:40:11.999Z" }, + { url = "https://files.pythonhosted.org/packages/f0/59/2ae3cb79da554a06c8619d6c88ea19dd1e4aed4b834b6a83bb1fa243bdc5/coverage-7.14.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1c5215be81035e629d5bc756650634d0bf31991038db7a0eccb90f025ce16d", size = 265780, upload-time = "2026-05-26T20:40:13.858Z" }, + { url = "https://files.pythonhosted.org/packages/af/5f/b130c1dc999031f2648bd25317fbce505ad8d5562079b4ed81e736a84967/coverage-7.14.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:79058c47dae6788504b5effb319961bcd72d7240551464b91d474bc0ed186d69", size = 260970, upload-time = "2026-05-26T20:40:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/87/d1/ec13ccddeb48ec963bdfa72a11224bac2584bd045ba13beca82f8113e9c7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:370c5afae3fa0658e11694a32b24c2778f6bc2d17718121f94ee185e69f26b54", size = 263157, upload-time = "2026-05-26T20:40:18.382Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c2/cd91ead503045161092d3845f7bb95ea2f25131ce96d3e314dd835d91b9c/coverage-7.14.1-cp313-cp313t-win32.whl", hash = "sha256:3758dd0a7f1fa57365ef2e781df0f0731d38b6e3772259d13dae4bd8a958d4b1", size = 223259, upload-time = "2026-05-26T20:40:20.381Z" }, + { url = "https://files.pythonhosted.org/packages/71/9f/1e28d97e6bd2c76b07f38b7c02870f1371255ff6717f54eca578fcbbdd0e/coverage-7.14.1-cp313-cp313t-win_amd64.whl", hash = "sha256:6ff665fb023a77386fe11685190cee1f60a7d635994a30d9b0a061533d470fce", size = 224320, upload-time = "2026-05-26T20:40:22.316Z" }, + { url = "https://files.pythonhosted.org/packages/a9/e0/d936e908f0e1efa55e52b91e01b52f1055cef5e1ab2718493390ed8e2fb8/coverage-7.14.1-cp313-cp313t-win_arm64.whl", hash = "sha256:17a5a241e5997621a956a7f402a7433ef4221e5152809b785bec79e2323799f1", size = 222577, upload-time = "2026-05-26T20:40:24.894Z" }, + { url = "https://files.pythonhosted.org/packages/d6/34/fc2f101b151af3799a101f0550b0454aa008afdc0add677394ec4aa8ea10/coverage-7.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d5ed429d0b8edaac649e889b4ffcedb6c80b06629a3f93050e3dddfb99235bee", size = 220091, upload-time = "2026-05-26T20:40:27.249Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a7/1ebae2ab5b961b5c79bb09fe7b3ac99edb190d8be4a8c510b2cf66f46468/coverage-7.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8011224a62280e50dab346960c03cf47aca1a1e09e608c0fb33fd6e0cc8e9500", size = 220421, upload-time = "2026-05-26T20:40:30.084Z" }, + { url = "https://files.pythonhosted.org/packages/5e/90/92aca9cf0acc95123c96cd1eb1f08917897a7f5dee01e15738922971ec31/coverage-7.14.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:12c42ec1e14f553c4f817e989365982e646e27211f10a0f717855b94a79c8906", size = 251466, upload-time = "2026-05-26T20:40:32.542Z" }, + { url = "https://files.pythonhosted.org/packages/26/2b/78048cbe3b999f6cbf9cc0d90abba6a88a3e0863a8c1c6cbc762f3f8802f/coverage-7.14.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:06144cd511cf2624873a035c5069cf297144f6e77a73ee3d7a55b605ec5efb42", size = 253973, upload-time = "2026-05-26T20:40:34.473Z" }, + { url = "https://files.pythonhosted.org/packages/8e/21/c2e33b29d1cfde484a19d437afc343c6cd30b08d78cbbf9f5aff14e57b2b/coverage-7.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a311d8e1da24be5c1ccf85cbfb06315dbaa1703d5a1eab3f6432c72b837917c8", size = 255318, upload-time = "2026-05-26T20:40:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ee/aad2f108d63b769121005302f16bf66db8625c88ceaba466942e09a2607e/coverage-7.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c79cead5b5bc584d9c71451cb984d0e3a84e0c0937379c8efcbf27c8d661b851", size = 257633, upload-time = "2026-05-26T20:40:40.164Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f8/11a2c29b4fd76d9849f81d0bb812ec0017a9396df3217214e38934a8c837/coverage-7.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dcbf65f1f66a26cdd88c35cf68fb4729c5d1cd2e88added72420541dfb212034", size = 251488, upload-time = "2026-05-26T20:40:42.631Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b8/9a5820de4b8ac2b71d85e3b5fb49108d7469c665f0e2ad0dd7569023e305/coverage-7.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fd86572566fb40189a8260446158235159bc7a82dfbc87a3b39cf4fb57fcec1c", size = 253329, upload-time = "2026-05-26T20:40:45.208Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ff/f33e4823667e27548e8fd8df44217515303f9808d0ff29817db56f87d990/coverage-7.14.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7771b601718fdde84832c3a434ca9bbf4ae9adbc49d84198b4110700c3c77c36", size = 251291, upload-time = "2026-05-26T20:40:47.502Z" }, + { url = "https://files.pythonhosted.org/packages/68/9b/489db0ebb209054766b90a9014a45f6d26eb724c02ec21311c3733b5a644/coverage-7.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:39b21e212c55af06fa375e3dbf90a8a8e38792f3a910c580066d23563830ddd5", size = 255564, upload-time = "2026-05-26T20:40:49.372Z" }, + { url = "https://files.pythonhosted.org/packages/27/b5/16bc2d4c2409b23c7737edb68c83bc89e345f378050549fe1d75ac7d34d5/coverage-7.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f2302660e32562a532b442480121aef8aa61a5bdb20b30bf0adab29f10a5a4b4", size = 251107, upload-time = "2026-05-26T20:40:51.677Z" }, + { url = "https://files.pythonhosted.org/packages/7d/0c/2629997469a00cd069d588a41c9dc887610f2775ae89d250c4791e65272a/coverage-7.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:03a6f93c1ec3b7f2e77b5dbcc5573a2c21f12529a5c6bbe0f16f72303cc2fa4d", size = 252764, upload-time = "2026-05-26T20:40:54.267Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ee/f78d63c8f079e0d7211c7e2401fa17e311514534ba61bae03e4b287ce4ab/coverage-7.14.1-cp314-cp314-win32.whl", hash = "sha256:8a3ce026d73290f42f08dafecbd82c193a74df280461fbf97300fec51fd133ee", size = 222837, upload-time = "2026-05-26T20:40:56.496Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b9/be539854f93a70dfbeec69117f33ec70dc42ff0b65b5b07ab8d40d04228e/coverage-7.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:114c95ef29302423b87d159075805f4ab973254a2638a5d7d046c94887cc87d7", size = 223650, upload-time = "2026-05-26T20:40:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9e/24e2842fef40f35ac82ba3a7719c8023d011bf3bf652d0675316a9d088a1/coverage-7.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:a07891c3f4805442b31b71e84ba3cf29ed1aa9a428284e06deeb4b23e5b46343", size = 222218, upload-time = "2026-05-26T20:41:00.321Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1d/ac0a9df5fe31c1e8bdd658074905fc12844a05c1a7e3fdb8417e97c31e23/coverage-7.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1101a5ebb083aecb625ebb6209d4105b58f647b093cb2dc8122d7b33f743cfe1", size = 220822, upload-time = "2026-05-26T20:41:02.281Z" }, + { url = "https://files.pythonhosted.org/packages/32/cf/f964fd9aff20323f9f1a726c97135f8a76bcd87b92dad141a456a43f3c64/coverage-7.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:851b9e1e4e8a4608e77c79714b2e77c0970d2ed7202a05e92ae407817481887b", size = 221084, upload-time = "2026-05-26T20:41:04.593Z" }, + { url = "https://files.pythonhosted.org/packages/d8/5e/7e5ef2aba844de2b80d678619fcf0841b42e3f37f16411226f3fe4c1016f/coverage-7.14.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d5b89cdfb2ee051b71e8c3c70bd81a9eff81100f736a269136fe1a68efe00474", size = 262454, upload-time = "2026-05-26T20:41:06.641Z" }, + { url = "https://files.pythonhosted.org/packages/64/62/75809bded87015cc4935524218a2a8ed8dd1a8498bfed30a2f4f7a4b4d34/coverage-7.14.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0177614a0370f227888b4e436a7c55686d6a9f90eb1ade2b624ba685a1686e86", size = 264578, upload-time = "2026-05-26T20:41:08.556Z" }, + { url = "https://files.pythonhosted.org/packages/f3/42/d33392dc14633525012d2d504fa1a33b05538bf535f5c1d64675e5754b78/coverage-7.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d69af5dea2de76fc485a83032a630523f985198b7e25be901ec60181587b01e", size = 266981, upload-time = "2026-05-26T20:41:10.824Z" }, + { url = "https://files.pythonhosted.org/packages/2a/49/0157c4428c2aca7f1e09d5565930586fd5ae36f1655f08b0daa7cf1fcae1/coverage-7.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:35ab22d91de736e8966b980dc355cbcdd2c6dbbcfe275f9a2991bc8a91b3df65", size = 268112, upload-time = "2026-05-26T20:41:12.966Z" }, + { url = "https://files.pythonhosted.org/packages/96/26/86b9ce71f4092b1ed325ce1421698081df1286b833400b6836912834d6e0/coverage-7.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:357d4e32935c36588aaba057d734fa32428c360c9fc2e4442afbf1b646beee6e", size = 261558, upload-time = "2026-05-26T20:41:15Z" }, + { url = "https://files.pythonhosted.org/packages/20/4c/c311210c5472cf5401d8422b0d7812cdd520f24417673afabda6c323faca/coverage-7.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:51bd64741cc6fa065abd300ede1afe5a5291ece9c31da8b24884deda48bcc3f8", size = 264447, upload-time = "2026-05-26T20:41:17.369Z" }, + { url = "https://files.pythonhosted.org/packages/fb/71/59513f8710ed3e6b0ac0a050a5b7e977bb9c9e880354863b5d00d8809256/coverage-7.14.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9132cd363a68a4c3daa7c8704a654b1e39d3360f6f5b8ddd470608a945236c07", size = 262048, upload-time = "2026-05-26T20:41:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/bceed32dc494f5bbf50f775cd2e78ca814953942b5ea28d3c1c3ac316f14/coverage-7.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07c6290b1697b862c0478eab545eec949a0d0e4d6d03497f446d706da3b4f2de", size = 265781, upload-time = "2026-05-26T20:41:21.559Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c5/9348fe40dbfd4991aaf78df2c6c3098bfb2cc834d1fd362a64b4efef855a/coverage-7.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5ea0c297e27133853b4d8a3eb799bff5a2dbd9f2f41537a240d337ac9b4df890", size = 260896, upload-time = "2026-05-26T20:41:23.428Z" }, + { url = "https://files.pythonhosted.org/packages/ca/92/1ea0f03929da7cf87206b1fa24f4c8e9c158be0455481af29ec0a1f3503f/coverage-7.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:01b7733daad0237daa01ef80fe2dfceffc911e6a17fa7b55d14aa8214eaaaecd", size = 263214, upload-time = "2026-05-26T20:41:25.419Z" }, + { url = "https://files.pythonhosted.org/packages/f6/a9/b2493c054c0e01a643266742ab45e15744e60743f9260cd930c7142b1124/coverage-7.14.1-cp314-cp314t-win32.whl", hash = "sha256:6adc5a36984624a70bf11d7184e20fa0a49aa7c47ffab43804106a1a695ea22e", size = 223624, upload-time = "2026-05-26T20:41:27.795Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/3e1e6a57fccd2d7c83fcdf338e93ba98eb85c6e877dd34731ac585375490/coverage-7.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:ddf799247318f34dbcd2efa8c95a8d0642674e926bb1774cf9b63dfd2a389d1c", size = 224728, upload-time = "2026-05-26T20:41:30.098Z" }, + { url = "https://files.pythonhosted.org/packages/bb/d7/31066cf1d2f0c6c797fce911bcfa01dd35642dc6da992a950256097c5860/coverage-7.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:145986fe66647eb489f18d9a997567a3fd358584c4b5a808769113abc07466af", size = 222752, upload-time = "2026-05-26T20:41:32.123Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "zipp", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569, upload-time = "2023-06-18T21:44:35.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4/importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5", size = 22934, upload-time = "2023-06-18T21:44:33.441Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646, upload-time = "2023-01-07T11:08:11.254Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload-time = "2023-01-07T11:08:09.864Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433, upload-time = "2023-02-04T12:11:27.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695, upload-time = "2023-02-04T12:11:25.002Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "packaging" +version = "24.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/b5/b43a27ac7472e1818c4bafd44430e69605baefe1f34440593e0332ec8b4d/packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9", size = 147882, upload-time = "2024-03-10T09:39:28.33Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", size = 53488, upload-time = "2024-03-10T09:39:25.947Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pathspec" +version = "0.11.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/2a/bd167cdf116d4f3539caaa4c332752aac0b3a0cc0174cdb302ee68933e81/pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3", size = 47032, upload-time = "2023-07-29T01:05:04.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/2a/9b1be29146139ef459188f5e420a66e835dda921208db600b7037093891f/pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", size = 29603, upload-time = "2023-07-29T01:05:02.656Z" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + +[[package]] +name = "pathspec" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/28/e40d24d2e2eb23135f8533ad33d582359c7825623b1e022f9d460def7c05/platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731", size = 19914, upload-time = "2023-11-10T16:43:08.316Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/16/70be3b725073035aa5fc3229321d06e22e73e3e09f6af78dcfdf16c7636c/platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b", size = 17562, upload-time = "2023-11-10T16:43:06.949Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302, upload-time = "2024-09-17T19:06:50.688Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439, upload-time = "2024-09-17T19:06:49.212Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, +] + +[[package]] +name = "pluggy" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/42/8f2833655a29c4e9cb52ee8a2be04ceac61bcff4a680fb338cbd3d1e322d/pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3", size = 61613, upload-time = "2023-06-21T09:12:28.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/32/4a79112b8b87b21450b066e102d6608907f4c885ed7b04c3fdb085d4d6ae/pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", size = 17695, upload-time = "2023-06-21T09:12:27.397Z" }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "probing" +version = "0.2.5" +source = { editable = "." } + +[package.optional-dependencies] +dev = [ + { name = "black", version = "23.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "black", version = "24.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "black", version = "25.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "black", version = "26.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "coverage", version = "7.2.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "coverage", version = "7.14.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest", version = "7.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest-cov", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pytest-cov", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pytest-cov", version = "7.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "ruff" }, +] +test = [ + { name = "coverage", version = "7.2.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "coverage", version = "7.14.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest", version = "7.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest-cov", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pytest-cov", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pytest-cov", version = "7.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] + +[package.metadata] +requires-dist = [ + { name = "black", marker = "python_full_version >= '3.8' and extra == 'dev'", specifier = ">=24.0" }, + { name = "black", marker = "python_full_version < '3.8' and extra == 'dev'", specifier = "<24.0" }, + { name = "coverage", marker = "extra == 'dev'", specifier = ">=7.0" }, + { name = "coverage", marker = "extra == 'test'", specifier = ">=7.0" }, + { name = "pytest", marker = "python_full_version >= '3.8' and extra == 'dev'", specifier = ">=8.0" }, + { name = "pytest", marker = "python_full_version >= '3.8' and extra == 'test'", specifier = ">=8.0" }, + { name = "pytest", marker = "python_full_version < '3.8' and extra == 'dev'", specifier = "<8.0" }, + { name = "pytest", marker = "python_full_version < '3.8' and extra == 'test'", specifier = "<8.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0" }, + { name = "pytest-cov", marker = "extra == 'test'", specifier = ">=4.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.1.0" }, +] +provides-extras = ["test", "dev"] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pytest" +version = "7.4.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.8' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.8'" }, + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, + { name = "iniconfig", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pluggy", version = "1.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", size = 1357116, upload-time = "2023-12-31T12:00:18.035Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/ff/f6e8b8f39e08547faece4bd80f89d5a8de68a38b2d179cc1c4490ffa3286/pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8", size = 325287, upload-time = "2023-12-31T12:00:13.963Z" }, +] + +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version == '3.8.*' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.8.*'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pluggy", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version == '3.9.*' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.9.*'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pygments", marker = "python_full_version == '3.9.*'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "coverage", version = "7.2.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version < '3.8'" }, + { name = "pytest", version = "7.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/15/da3df99fd551507694a9b01f512a2f6cf1254f33601605843c3775f39460/pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", size = 63245, upload-time = "2023-05-24T18:44:56.845Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/4b/8b78d126e275efa2379b1c2e09dc52cf70df16fc3b90613ef82531499d73/pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a", size = 21949, upload-time = "2023-05-24T18:44:54.079Z" }, +] + +[[package]] +name = "pytest-cov" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version == '3.8.*'" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042, upload-time = "2024-03-24T20:16:34.856Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", size = 21990, upload-time = "2024-03-24T20:16:32.444Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version == '3.9.*'" }, + { name = "coverage", version = "7.14.1", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version >= '3.10'" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + +[[package]] +name = "pytokens" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/24/f206113e05cb8ef51b3850e7ef88f20da6f4bf932190ceb48bd3da103e10/pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5", size = 161522, upload-time = "2026-01-30T01:02:50.393Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e9/06a6bf1b90c2ed81a9c7d2544232fe5d2891d1cd480e8a1809ca354a8eb2/pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe", size = 246945, upload-time = "2026-01-30T01:02:52.399Z" }, + { url = "https://files.pythonhosted.org/packages/69/66/f6fb1007a4c3d8b682d5d65b7c1fb33257587a5f782647091e3408abe0b8/pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c", size = 259525, upload-time = "2026-01-30T01:02:53.737Z" }, + { url = "https://files.pythonhosted.org/packages/04/92/086f89b4d622a18418bac74ab5db7f68cf0c21cf7cc92de6c7b919d76c88/pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7", size = 262693, upload-time = "2026-01-30T01:02:54.871Z" }, + { url = "https://files.pythonhosted.org/packages/b4/7b/8b31c347cf94a3f900bdde750b2e9131575a61fdb620d3d3c75832262137/pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2", size = 103567, upload-time = "2026-01-30T01:02:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/3d/92/790ebe03f07b57e53b10884c329b9a1a308648fc083a6d4a39a10a28c8fc/pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440", size = 160864, upload-time = "2026-01-30T01:02:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/13/25/a4f555281d975bfdd1eba731450e2fe3a95870274da73fb12c40aeae7625/pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc", size = 248565, upload-time = "2026-01-30T01:02:59.912Z" }, + { url = "https://files.pythonhosted.org/packages/17/50/bc0394b4ad5b1601be22fa43652173d47e4c9efbf0044c62e9a59b747c56/pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d", size = 260824, upload-time = "2026-01-30T01:03:01.471Z" }, + { url = "https://files.pythonhosted.org/packages/4e/54/3e04f9d92a4be4fc6c80016bc396b923d2a6933ae94b5f557c939c460ee0/pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16", size = 264075, upload-time = "2026-01-30T01:03:04.143Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1b/44b0326cb5470a4375f37988aea5d61b5cc52407143303015ebee94abfd6/pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6", size = 103323, upload-time = "2026-01-30T01:03:05.412Z" }, + { url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", size = 160663, upload-time = "2026-01-30T01:03:06.473Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", size = 255626, upload-time = "2026-01-30T01:03:08.177Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", size = 269779, upload-time = "2026-01-30T01:03:09.756Z" }, + { url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", size = 268076, upload-time = "2026-01-30T01:03:10.957Z" }, + { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", size = 103552, upload-time = "2026-01-30T01:03:12.066Z" }, + { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, + { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, + { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, + { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, + { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, + { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, + { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/4a/08/968c22e06ab6570788964e2d5a702db9a3816e20ffde380b2b1385541d64/pytokens-0.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc", size = 154847, upload-time = "2026-01-30T01:03:32.268Z" }, + { url = "https://files.pythonhosted.org/packages/09/2b/2061bb4b300e6921f7968724b185237627a8a3dc4f311e34079dfadf9b65/pytokens-0.4.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009", size = 238610, upload-time = "2026-01-30T01:03:33.809Z" }, + { url = "https://files.pythonhosted.org/packages/1e/64/abf6e43523ea9b4aea69bfe22788a518806741107238674e5c0fb6fc8dc1/pytokens-0.4.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1", size = 252493, upload-time = "2026-01-30T01:03:35.715Z" }, + { url = "https://files.pythonhosted.org/packages/dc/fb/bcb6784c87d1de182afb284f37b07bc172eebec91ddc20e83aec767e4963/pytokens-0.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6", size = 255651, upload-time = "2026-01-30T01:03:36.961Z" }, + { url = "https://files.pythonhosted.org/packages/1a/0c/0c33752be2209498661903f6f240779aea5c9adbd85d22336ce3f7718e81/pytokens-0.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037", size = 104346, upload-time = "2026-01-30T01:03:38.069Z" }, + { url = "https://files.pythonhosted.org/packages/51/2a/f125667ce48105bf1f4e50e03cfa7b24b8c4f47684d7f1cf4dcb6f6b1c15/pytokens-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3", size = 161464, upload-time = "2026-01-30T01:03:39.11Z" }, + { url = "https://files.pythonhosted.org/packages/40/df/065a30790a7ca6bb48ad9018dd44668ed9135610ebf56a2a4cb8e513fd5c/pytokens-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1", size = 246159, upload-time = "2026-01-30T01:03:40.131Z" }, + { url = "https://files.pythonhosted.org/packages/a5/1c/fd09976a7e04960dabc07ab0e0072c7813d566ec67d5490a4c600683c158/pytokens-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db", size = 259120, upload-time = "2026-01-30T01:03:41.233Z" }, + { url = "https://files.pythonhosted.org/packages/52/49/59fdc6fc5a390ae9f308eadeb97dfc70fc2d804ffc49dd39fc97604622ec/pytokens-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1", size = 262196, upload-time = "2026-01-30T01:03:42.696Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e7/d6734dccf0080e3dc00a55b0827ab5af30c886f8bc127bbc04bc3445daec/pytokens-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a", size = 103510, upload-time = "2026-01-30T01:03:43.915Z" }, + { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/74/98/1295ad5a5aa9bc85bdcdfa5d82fe7b49c61af5657df4f227637ff9de0da6/ruff-0.15.18.tar.gz", hash = "sha256:2698a964c70e8bf402dcb99c8810472d270d141e7aa8c4e13599fd52033a2f33", size = 4761437, upload-time = "2026-06-18T18:25:39.224Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/d0/686e984941269621e2be72612d5c1e461f8f7b38415a2a7d7a81c8ae6715/ruff-0.15.18-py3-none-linux_armv6l.whl", hash = "sha256:8b6850172348c8381b8b3084c5915a4393c2373b9b54cd5b5e1ea15812bc10df", size = 10887308, upload-time = "2026-06-18T18:25:03.062Z" }, + { url = "https://files.pythonhosted.org/packages/ed/21/bc4123e3f5515ee99f8ce1eb93a14a0628fe4d1678663cd08f933ac16931/ruff-0.15.18-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3fccc153a85417dcd976883160cacce486997b0a0058dd18f54b8aaaac7d1ce2", size = 11281305, upload-time = "2026-06-18T18:25:30.026Z" }, + { url = "https://files.pythonhosted.org/packages/51/93/4769464c25cf7ab2acb3c7dda9cad3d867eb41c59565b3e2a9d17249c90c/ruff-0.15.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:08d4c86a68f2c3ec2c9d56380a71fb4a4f65373055cbb8caabd645e9102f38d4", size = 10641215, upload-time = "2026-06-18T18:25:15.802Z" }, + { url = "https://files.pythonhosted.org/packages/6c/42/56926d17120db2c208d76bf60a1a019644dd9e91dc27f0f95c9caddb1366/ruff-0.15.18-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37e5108745c2c0705da916d7d4de533ddf547051ef45f62888c31bae73f66318", size = 10957224, upload-time = "2026-06-18T18:25:36.955Z" }, + { url = "https://files.pythonhosted.org/packages/22/4f/d43fab8d8189afde803103022d000a8ef9f230616d436d52a8b2b8d63b50/ruff-0.15.18-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56949a6ce8b3abde54c0bcb22cebfe57e8771cadc84b407ae8b8eaf67ebdcd43", size = 10699024, upload-time = "2026-06-18T18:25:05.707Z" }, + { url = "https://files.pythonhosted.org/packages/63/42/1e3e4c68bd408b9768cf3e439acbe2c78245225faef253f7028a0cdb63e0/ruff-0.15.18-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01a754cd6a1b630d3f97e33eb452cf7a98040482318e870f8bc52a5a30e62657", size = 11491458, upload-time = "2026-06-18T18:25:20.275Z" }, + { url = "https://files.pythonhosted.org/packages/20/77/47a3484bea8521e14a203d98c389c5c97846675e4f02734672da4a69b52a/ruff-0.15.18-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ba7a07e03a44dbf10bb086ee06705b173625014ec99f73a7e6836a5e5590a0c", size = 12383752, upload-time = "2026-06-18T18:25:22.535Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ca/054159590787023d83b658a1a1819c4c8910114e7015069340b71c0961cb/ruff-0.15.18-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a2c40a41a4cadbcf5897b548ab29dfe248b20c540961c0247d98a3973c70403", size = 11577923, upload-time = "2026-06-18T18:25:10.702Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ff/d353d6b7bbd73cc0ec37f4463d7540e45e894338abdd9964eee0de332708/ruff-0.15.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f0480ce690cbb6c4db6e5d08f19fce98e10ba131a8b60c1bcdac42771e3ae2d", size = 11583925, upload-time = "2026-06-18T18:25:32.391Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4a/891f89b9c296ed3e5f3ece1a5629badc989d9a8fdaa30431aaf4774bc1c2/ruff-0.15.18-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2330215f1f393fa8733f55edce04fcf94c36a2c460fcde31f78cc84e4951e9b1", size = 11582834, upload-time = "2026-06-18T18:25:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/32/a3/ed9e370154bf85de360b93c03026157f02d4943b2d01ff4945f4429f8e8a/ruff-0.15.18-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6aa6a3d979e48ae617578183674bf264fbe7d0114a796a26bd678d67963c7ff", size = 10927328, upload-time = "2026-06-18T18:25:34.676Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d1/5cf5909329fedb5d39d555ee818ba5cf4638e1a301b89785d34f2905bfcb/ruff-0.15.18-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a81beadbbff2c9c245561ae3f77b16709d87f35eec650d0501679239d3449b22", size = 10693187, upload-time = "2026-06-18T18:25:08.245Z" }, + { url = "https://files.pythonhosted.org/packages/fd/44/ff6c635cf2c4f4e7b618b6640da057376baa36014695487d88aed4794268/ruff-0.15.18-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2186d9e940ae332ab293623a75b5f4fe49565f449954d50a72a046683aa6b809", size = 11208721, upload-time = "2026-06-18T18:25:41.327Z" }, + { url = "https://files.pythonhosted.org/packages/88/d9/5baa2a30861adfb7022cf33c1e35b2fc18085b08c16f83eff4c7b99a5f48/ruff-0.15.18-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5c2abf140438032bc77b2284a6c9944ecd8a19e5f1c7b52b1b8e4a0a80d19a7a", size = 11678599, upload-time = "2026-06-18T18:25:13.607Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1a/0725a7cfdc32ff769efb96ee782bec882e16448c5d9e3be947ec4c04ce27/ruff-0.15.18-py3-none-win32.whl", hash = "sha256:02299e6e9fa5b297a3f6d5d10d7bcd655c925b028bb8b9d4588214549c6b9ec4", size = 10901903, upload-time = "2026-06-18T18:25:24.755Z" }, + { url = "https://files.pythonhosted.org/packages/f3/51/805d9f6fb7970505c3504794a5ec350f605361b807fef4dcf214ebd35e72/ruff-0.15.18-py3-none-win_amd64.whl", hash = "sha256:dac80dc8d26b2257dbefabed62f5d255c3937b4ccb122da1fc634794fa3578b3", size = 12041189, upload-time = "2026-06-18T18:25:17.915Z" }, + { url = "https://files.pythonhosted.org/packages/29/4c/67bb45e41609eb4726f1bfeb59e083cf91d14c696d4bd14c234a980be93d/ruff-0.15.18-py3-none-win_arm64.whl", hash = "sha256:b2c9257fcbd4a3e5b977a1904e6facca016bafe2edc17df24db67cfaee03b4e4", size = 11329958, upload-time = "2026-06-18T18:25:43.686Z" }, +] + +[[package]] +name = "tomli" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164, upload-time = "2022-02-08T10:54:04.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757, upload-time = "2022-02-08T10:54:02.017Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typed-ast" +version = "1.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/7e/a424029f350aa8078b75fd0d360a787a273ca753a678d1104c5fa4f3072a/typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd", size = 252841, upload-time = "2023-07-04T18:38:08.524Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/07/5defe18d4fc16281cd18c4374270abc430c3d852d8ac29b5db6599d45cfe/typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b", size = 223267, upload-time = "2023-07-04T18:37:00.129Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5c/e379b00028680bfcd267d845cf46b60e76d8ac6f7009fd440d6ce030cc92/typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686", size = 208260, upload-time = "2023-07-04T18:37:03.069Z" }, + { url = "https://files.pythonhosted.org/packages/3b/99/5cc31ef4f3c80e1ceb03ed2690c7085571e3fbf119cbd67a111ec0b6622f/typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769", size = 842272, upload-time = "2023-07-04T18:37:04.916Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ed/b9b8b794b37b55c9247b1e8d38b0361e8158795c181636d34d6c11b506e7/typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04", size = 824651, upload-time = "2023-07-04T18:37:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/ca/59/dbbbe5a0e91c15d14a0896b539a5ed01326b0d468e75c1a33274d128d2d1/typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d", size = 854960, upload-time = "2023-07-04T18:37:08.474Z" }, + { url = "https://files.pythonhosted.org/packages/90/f0/0956d925f87bd81f6e0f8cf119eac5e5c8f4da50ca25bb9f5904148d4611/typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d", size = 839321, upload-time = "2023-07-04T18:37:10.417Z" }, + { url = "https://files.pythonhosted.org/packages/43/17/4bdece9795da6f3345c4da5667ac64bc25863617f19c28d81f350f515be6/typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02", size = 139380, upload-time = "2023-07-04T18:37:12.157Z" }, + { url = "https://files.pythonhosted.org/packages/75/53/b685e10da535c7b3572735f8bea0d4abb35a04722a7d44ca9c163a0cf822/typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee", size = 223264, upload-time = "2023-07-04T18:37:13.637Z" }, + { url = "https://files.pythonhosted.org/packages/96/fd/fc8ccf19fc16a40a23e7c7802d0abc78c1f38f1abb6e2447c474f8a076d8/typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18", size = 208158, upload-time = "2023-07-04T18:37:15.141Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9a/598e47f2c3ecd19d7f1bb66854d0d3ba23ffd93c846448790a92524b0a8d/typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88", size = 878366, upload-time = "2023-07-04T18:37:16.614Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/765e8bf8b24d0ed7b9fc669f6826c5bc3eb7412fc765691f59b83ae195b2/typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2", size = 860314, upload-time = "2023-07-04T18:37:18.215Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3c/4af750e6c673a0dd6c7b9f5b5e5ed58ec51a2e4e744081781c664d369dfa/typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9", size = 898108, upload-time = "2023-07-04T18:37:20.095Z" }, + { url = "https://files.pythonhosted.org/packages/03/8d/d0a4d1e060e1e8dda2408131a0cc7633fc4bc99fca5941dcb86c461dfe01/typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8", size = 881971, upload-time = "2023-07-04T18:37:21.912Z" }, + { url = "https://files.pythonhosted.org/packages/90/83/f28d2c912cd010a09b3677ac69d23181045eb17e358914ab739b7fdee530/typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b", size = 139286, upload-time = "2023-07-04T18:37:23.625Z" }, + { url = "https://files.pythonhosted.org/packages/d5/00/635353c31b71ed307ab020eff6baed9987da59a1b2ba489f885ecbe293b8/typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e", size = 222315, upload-time = "2023-07-04T18:37:36.008Z" }, + { url = "https://files.pythonhosted.org/packages/01/95/11be104446bb20212a741d30d40eab52a9cfc05ea34efa074ff4f7c16983/typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e", size = 793541, upload-time = "2023-07-04T18:37:37.614Z" }, + { url = "https://files.pythonhosted.org/packages/32/f1/75bd58fb1410cb72fbc6e8adf163015720db2c38844b46a9149c5ff6bf38/typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311", size = 778348, upload-time = "2023-07-04T18:37:39.332Z" }, + { url = "https://files.pythonhosted.org/packages/47/97/0bb4dba688a58ff9c08e63b39653e4bcaa340ce1bb9c1d58163e5c2c66f1/typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2", size = 809447, upload-time = "2023-07-04T18:37:41.017Z" }, + { url = "https://files.pythonhosted.org/packages/a8/cd/9a867f5a96d83a9742c43914e10d3a2083d8fe894ab9bf60fd467c6c497f/typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4", size = 796707, upload-time = "2023-07-04T18:37:42.625Z" }, + { url = "https://files.pythonhosted.org/packages/eb/06/73ca55ee5303b41d08920de775f02d2a3e1e59430371f5adf7fbb1a21127/typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431", size = 138403, upload-time = "2023-07-04T18:37:44.399Z" }, + { url = "https://files.pythonhosted.org/packages/19/e3/88b65e46643006592f39e0fdef3e29454244a9fdaa52acfb047dc68cae6a/typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a", size = 222951, upload-time = "2023-07-04T18:37:45.745Z" }, + { url = "https://files.pythonhosted.org/packages/15/e0/182bdd9edb6c6a1c068cecaa87f58924a817f2807a0b0d940f578b3328df/typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437", size = 208247, upload-time = "2023-07-04T18:37:47.28Z" }, + { url = "https://files.pythonhosted.org/packages/8d/09/bba083f2c11746288eaf1859e512130420405033de84189375fe65d839ba/typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede", size = 861010, upload-time = "2023-07-04T18:37:48.847Z" }, + { url = "https://files.pythonhosted.org/packages/31/f3/38839df509b04fb54205e388fc04b47627377e0ad628870112086864a441/typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4", size = 840026, upload-time = "2023-07-04T18:37:50.631Z" }, + { url = "https://files.pythonhosted.org/packages/45/1e/aa5f1dae4b92bc665ae9a655787bb2fe007a881fa2866b0408ce548bb24c/typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6", size = 875615, upload-time = "2023-07-04T18:37:52.27Z" }, + { url = "https://files.pythonhosted.org/packages/94/88/71a1c249c01fbbd66f9f28648f8249e737a7fe19056c1a78e7b3b9250eb1/typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4", size = 858320, upload-time = "2023-07-04T18:37:54.23Z" }, + { url = "https://files.pythonhosted.org/packages/12/1e/19f53aad3984e351e6730e4265fde4b949a66c451e10828fdbc4dfb050f1/typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b", size = 139414, upload-time = "2023-07-04T18:37:55.912Z" }, + { url = "https://files.pythonhosted.org/packages/b1/88/6e7f36f5fab6fbf0586a2dd866ac337924b7d4796a4d1b2b04443a864faf/typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10", size = 223329, upload-time = "2023-07-04T18:37:57.344Z" }, + { url = "https://files.pythonhosted.org/packages/71/30/09d27e13824495547bcc665bd07afc593b22b9484f143b27565eae4ccaac/typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814", size = 208314, upload-time = "2023-07-04T18:37:59.073Z" }, + { url = "https://files.pythonhosted.org/packages/07/3d/564308b7a432acb1f5399933cbb1b376a1a64d2544b90f6ba91894674260/typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8", size = 840900, upload-time = "2023-07-04T18:38:00.562Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f4/262512d14f777ea3666a089e2675a9b1500a85b8329a36de85d63433fb0e/typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274", size = 823435, upload-time = "2023-07-04T18:38:02.532Z" }, + { url = "https://files.pythonhosted.org/packages/a1/25/b3ccb948166d309ab75296ac9863ebe2ff209fbc063f1122a2d3979e47c3/typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a", size = 853125, upload-time = "2023-07-04T18:38:04.128Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/012da182242f168bb5c42284297dcc08dc0a1b3668db5b3852aec467f56f/typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba", size = 837280, upload-time = "2023-07-04T18:38:05.968Z" }, + { url = "https://files.pythonhosted.org/packages/30/bd/c815051404c4293265634d9d3e292f04fcf681d0502a9484c38b8f224d04/typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155", size = 139486, upload-time = "2023-07-04T18:38:07.249Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876, upload-time = "2023-07-02T14:20:55.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232, upload-time = "2023-07-02T14:20:53.275Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "zipp" +version = "3.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/27/f0ac6b846684cecce1ee93d32450c45ab607f65c2e0255f0092032d91f07/zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", size = 18454, upload-time = "2023-02-25T02:17:22.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047/zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556", size = 6758, upload-time = "2023-02-25T02:17:20.807Z" }, +] From 5311d5956753cac653e6f68762388a0a67675ed5 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sun, 28 Jun 2026 00:48:02 +0800 Subject: [PATCH 07/37] Enhance mutex handling, error management, and update documentation (#52) * Harden cluster mutex handling and align docs with refactor reality. Use poison-safe lock_mutex in torchrun cluster paths, rewrite federation catalog prefixes via AST (with legacy fallback), update modularity docs for known boundary debt and torchrun vs Pulsing membership, soften README overhead claims, and track uv.lock while gitignoring generated bundled_web. Co-authored-by: Cursor * Update dependencies and enhance error handling across modules - Added `pyo3` and updated `thiserror` to version `2.0.12` in `Cargo.lock` for improved Python integration and error management. - Refactored error handling in various modules to utilize `Context` for better error context propagation. - Updated documentation to reflect changes in modularity and signal handling, including the addition of macOS-specific signal delivery methods. - Improved overall code clarity and consistency by simplifying function signatures and enhancing comments across multiple files. --------- Co-authored-by: Cursor --- AGENTS.md | 78 + Cargo.lock | 4 +- README.md | 2 +- docs/src/design/modularity.md | 23 +- docs/src/design/modularity.zh.md | 24 +- probing/cli/src/cli/bench/runners/coldscan.rs | 6 +- probing/cli/src/cli/bench/runners/mixed.rs | 7 +- probing/cli/src/cli/bench/runners/mp.rs | 5 +- probing/cli/src/cli/bench/runners/write.rs | 4 +- probing/cli/src/cli/ctrl.rs | 6 +- probing/cli/src/cli/repl.rs | 8 +- probing/core/Cargo.toml | 4 + probing/core/src/core/cluster.rs | 4 +- probing/core/src/core/error.rs | 208 +-- .../src/core/federation/aggregate_pushdown.rs | 8 +- .../src/core/federation/cluster_executor.rs | 17 +- probing/core/src/core/federation/convert.rs | 21 +- probing/core/src/core/federation/rewrite.rs | 124 +- probing/core/src/core/memtable_sql.rs | 24 +- probing/core/src/core/mod.rs | 2 + probing/core/src/core/plugin_advanced.rs | 10 +- probing/core/src/core/probe_extension.rs | 3 +- probing/core/src/core/semantic_catalog.rs | 9 +- probing/core/src/lib.rs | 21 +- probing/core/src/runtime.rs | 385 ++++- probing/core/src/signal/macos.rs | 136 ++ probing/core/src/signal/mod.rs | 7 + probing/core/src/storage/distributed.rs | 78 +- probing/core/src/storage/entity.rs | 2 +- probing/core/src/storage/mem_store.rs | 2 +- probing/core/src/storage/mod.rs | 2 +- probing/core/src/storage/remote_client.rs | 2 +- probing/core/src/trace/mod.rs | 3 +- .../cc/src/extensions/cpu/collector.rs | 17 +- .../cc/src/extensions/cpu/extension.rs | 8 +- .../extensions/cc/src/extensions/cpu/macos.rs | 72 - .../extensions/cc/src/extensions/cpu/mod.rs | 2 +- probing/extensions/cc/src/extensions/files.rs | 23 +- probing/extensions/cc/src/extensions/rdma.rs | 57 +- .../gpu/src/extensions/backend/registry.rs | 5 +- .../gpu/src/extensions/collector.rs | 15 +- .../gpu/src/extensions/extension.rs | 8 +- probing/extensions/python/Cargo.toml | 4 +- .../extensions/python/src/extensions/pprof.rs | 18 +- .../python/src/extensions/python.rs | 91 +- .../python/src/extensions/python/exttbls.rs | 65 +- .../python/src/extensions/python/tbls.rs | 86 +- .../extensions/python/src/features/config.rs | 64 +- .../extensions/python/src/features/convert.rs | 9 +- probing/extensions/python/src/features/mod.rs | 1 + .../python/src/features/native_bridge.rs | 4 +- .../extensions/python/src/features/pprof.rs | 4 +- .../python/src/features/py_result.rs | 7 + .../python/src/features/python_api.rs | 14 +- .../python/src/features/stack_tracer.rs | 4 +- .../extensions/python/src/features/torch.rs | 9 +- .../extensions/python/src/features/tracing.rs | 2 +- probing/extensions/python/src/python.rs | 3 +- .../extensions/python/src/repl/python_repl.rs | 9 +- probing/memtable/Cargo.toml | 1 + probing/memtable/src/discover.rs | 95 +- probing/memtable/src/docs.rs | 8 +- probing/memtable/src/error.rs | 30 + probing/memtable/src/lib.rs | 5 +- probing/memtable/src/memh/table.rs | 34 +- probing/memtable/src/memtable.rs | 25 +- probing/memtable/src/raw.rs | 51 +- probing/memtable/src/sync.rs | 11 + probing/server/Cargo.toml | 2 +- probing/server/src/cluster_report_backoff.rs | 3 +- probing/server/src/engine.rs | 55 +- probing/server/src/report.rs | 4 +- probing/server/src/server/cluster_fanout.rs | 2 +- probing/server/src/torchrun_cluster.rs | 44 +- .../tests/hierarchical_cluster_report.rs | 7 +- .../probing/core/table_docs_integration.rs | 2 +- uv.lock | 1307 +++++++++++++++++ web/src/api/mod.rs | 10 +- 78 files changed, 2793 insertions(+), 743 deletions(-) create mode 100644 AGENTS.md create mode 100644 probing/core/src/signal/macos.rs create mode 100644 probing/core/src/signal/mod.rs create mode 100644 probing/extensions/python/src/features/py_result.rs create mode 100644 probing/memtable/src/error.rs create mode 100644 probing/memtable/src/sync.rs create mode 100644 uv.lock diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..0fab432d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,78 @@ +# Agent instructions — probing + +This repository uses the [Agent Skills](https://agentskills.io) layout for training diagnostics. + +## Module boundaries + +Before adding code, read **`docs/src/design/modularity.md`** (中文: `modularity.zh.md`). + +| Layer | Where | Your change belongs if… | +|-------|--------|-------------------------| +| L1 Platform | `probing/core`, `memtable`, `proto` | SQL engine, federation, storage format | +| L2 Collectors | `probing/extensions/*`, `python/probing/profiling` | New metrics / tables | +| L3 Control | `probing/server`, `probing/cli` | HTTP, inject, fan-out | +| L4 Experience | `skills/`, `web/`, Python hooks | Diagnostics UX, skills, UI | + +**Contracts:** `ProbeDataSource` (tables), `ProbeExtension` (config/HTTP), `@table` (Python data), `skills/*/steps.yaml` (workflows). Do not add cross-collector calls — use SQL JOINs. + +## Skills + +All diagnostic skills live under **`skills/`**. Each subdirectory contains: + +- **`SKILL.md`** — when to use the skill and how to interpret results (read this for routing) +- **`steps.yaml`** — executable probe steps (used by `probing skill run` and the Web Investigate agent) + +Browse the catalog: `skills/catalog.yaml` + +## Install skills into your agent + +So Cursor / Claude Code / Codex can discover and invoke skills: + +```bash +./skills/install.sh +``` + +This copies `skills//` into: + +- `.cursor/skills/` (Cursor) +- `.claude/skills/` (Claude Code) +- `.agents/skills/` (Codex) + +Use `probing skill install --user` for global install under `~/`. + +## Run diagnostics + +Requires a probed training process (`PROBING=1` or `probing -t inject`): + +```bash +probing skill list +probing -t skill run health_overview +probing -t skill run slow_rank --global +probing -t skill run nccl_culprit_victim +``` + +From Python (e.g. in agent-generated scripts): + +```python +from probing.skills.tools import list_skills, run_skill +run_skill("health_overview", target="") +``` + +## Built-in skills (summary) + +| id | use when | +|----|----------| +| `health_overview` | first look / triage | +| `training_hang` | stall or hang | +| `slow_rank` | straggler rank | +| `comm_bottleneck` | NCCL / collective slow | +| `nccl_culprit_victim` | NCCL culprit/victim analysis | +| `memory_leak` | GPU memory growth | +| `module_bottleneck` | slow PyTorch modules | +| `gpu_pressure` | GPU util / headroom | + +Details in each `skills//SKILL.md`. + +## Extending + +Add table plugins under `python/probing/ext/` (data). Add diagnostic skills under `skills/` (how to investigate). NCCL profiler plugin: `docs/src/design/nccl-profiler.md`. See `docs/src/design/extensibility.md`. diff --git a/Cargo.lock b/Cargo.lock index 870ac321..66cb2e0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3367,6 +3367,7 @@ dependencies = [ "probing-memtable", "probing-nccl-profiler", "probing-proto", + "pyo3", "serde", "serde_json", "serde_yaml", @@ -3434,6 +3435,7 @@ dependencies = [ "log", "memmap2", "pco", + "thiserror 2.0.12", "xxhash-rust", ] @@ -3491,7 +3493,6 @@ dependencies = [ "log", "nix 0.31.3", "once_cell", - "probing-cc", "probing-cli", "probing-core", "probing-memtable", @@ -3506,6 +3507,7 @@ dependencies = [ "sha2", "signal-hook-registry", "tempfile", + "thiserror 2.0.12", "tokio", "uuid", ] diff --git a/README.md b/README.md index 5c8d8194..23aa65ab 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ > Uncover the Hidden Truth of AI Performance -Probing is a production-grade performance profiler designed specifically for distributed AI workloads. Built on dynamic probe injection technology, it delivers zero-overhead runtime introspection with SQL-queryable performance metrics and cross-node correlation analysis. +Probing is a production-grade performance profiler designed specifically for distributed AI workloads. Built on dynamic probe injection technology, it delivers **minimal-overhead** runtime introspection—lock-free mmap writes on the hot path, background sampling—with SQL-queryable performance metrics and cross-node correlation analysis. ### What probing delivers... diff --git a/docs/src/design/modularity.md b/docs/src/design/modularity.md index 66ea6c69..049eb57d 100644 --- a/docs/src/design/modularity.md +++ b/docs/src/design/modularity.md @@ -113,7 +113,7 @@ Python-side collectors (same layer, different language): | Unit | Path | Responsibility | |------|------|----------------| -| **probing-server** | `probing/server/` | Axum routes, auth, `initialize_engine()`, cluster fan-out | +| **probing-server** | `probing/server/` | Axum routes, auth, `initialize_engine()`, cluster fan-out, **torchrun heartbeat** (`torchrun_cluster.rs`) | | **probing-cli** | `probing/cli/` | HTTP client to probe; inject/list/query/repl/**skill** | Stable HTTP surface: `probing/server/API.md`, enforced by `tests/regression/spec/api_spec.json`. @@ -325,8 +325,11 @@ Use this table to decide **where a change belongs**: | Concern | Owner module | Interface | |---------|--------------|-----------| | SQL parsing, federation rewrite | probing-core | `Engine::async_query` | +| Table/column semantic docs | probing-core | `semantic_catalog` → `probe.probing.table_docs` / `column_docs` | | mmap format, compaction | probing-memtable | `RowWriter`, `ColdStore` | +| Torchrun cluster heartbeat | probing-server | `torchrun_cluster.rs`, `cluster_report_backoff.rs`, PUT `/apis/nodes` | | Mixed Python/C stack | probing-python/features | `python.backtrace`, pprof | +| macOS per-thread SIGUSR2 | probing-core | `signal::send_sigusr2_to_thread_id` | | Torch module sampling | python/probing/profiling | `python.torch_trace` | | Collective wall time | python/probing/profiling/collective | `python.comm_collective` | | NCCL wait decomposition | probing-nccl-profiler | `nccl.proxy_ops` | @@ -372,6 +375,9 @@ Track and fix incrementally: | Issue | Current | Target | |-------|---------|--------| | Python ext → CLI | `probing-python` → `probing-cli` | **Accepted** for maturin wheel (`cli_main` only); keep import surface minimal | +| Python ext → CC | ~~`probing-python` → `probing-cc`~~ | **Done** — `send_sigusr2_to_thread_id` moved to `probing-core::signal` | +| Core → NCCL/HCCL | `probing-core` → `probing-nccl-profiler` / `probing-hccl-shim` (`builtin-schema-docs` feature) for `semantic_catalog` | Register docs via collector hooks or manifest; drop L1→L2 compile deps | +| Core → skills YAML | `semantic_catalog.rs` `include_str!(skills/semantic/tables.yaml)` | Accept as L4 overlay SSOT, or move YAML under `probing/core/resources/` | | Server → python `features/*` | ~~`server/profiling.rs`~~ removed | Flamegraphs via `torchextension` / `pprofextension` `ProbeExtensionCall` | | Server → python REPL internals | ~~`PythonRepl` in server~~ | `/ws` uses `ReplSession` facade only | | Composition sprawl | All wiring in `server/engine.rs` | Optional: manifest TOML listing enabled extensions | @@ -379,6 +385,19 @@ Track and fix incrementally: | kmsg collector | Registered (Linux/kmsg feature gate) | Done | | Architecture doc | 2-layer diagram | Superseded by this doc + [Data Layer](data-layer.md) | +### Cluster membership: Torchrun heartbeat vs Pulsing + +Two **complementary** paths populate `cluster.nodes` and power `global.*` federation. +They do not replace each other. + +| Path | Layer | When | Mechanism | +|------|-------|------|-----------| +| **Torchrun cluster heartbeat** | L3 `probing-server` | Default for `torchrun` / elastic jobs (`WORLD_SIZE > 1`, `PROBING=1/2`) | Hierarchical HTTP PUT + TCPStore side channel (`probing/torchrun//…`). Does **not** touch torch rendezvous keys. See [Torchrun cluster heartbeat](torchrun-cluster.md). | +| **Pulsing integration** | L4 passive + external runtime | Another process already runs [Pulsing](cluster-pulsing.md) and writes `pulsing.*` memtables | Probing discovers `pulsing.*` mmap tables; no probing-owned heartbeat thread. Optional bootstrap via Pulsing APIs. | + +**Default for torchrun users:** heartbeat auto-starts from the Rust ctor (`maybe_start_torchrun_cluster()`). +**Pulsing:** use when the job already centers on Pulsing for membership/failure detection, or you need Pulsing actors alongside probing tables. + --- ## 9. Adding a new feature (decision tree) @@ -414,6 +433,8 @@ Need new raw signals? | [Data Layer](data-layer.md) | MEMT/MEMC internals | | [Extensibility](extensibility.md) | Public extension paths (table + skill) | | [Distributed](distributed.md) | Federation & cluster | +| [Torchrun cluster heartbeat](torchrun-cluster.md) | Hierarchical torchrun membership | +| [Cluster with Pulsing](cluster-pulsing.md) | Optional Pulsing-based membership | | [NCCL Profiler](nccl-profiler.md) | NCCL plugin boundary | | [web/DESIGN.md](https://github.com/DeepLink-org/probing/blob/main/web/DESIGN.md) | UI module layout | | [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | Agent skill usage | diff --git a/docs/src/design/modularity.zh.md b/docs/src/design/modularity.zh.md index 9aea1678..d1b36723 100644 --- a/docs/src/design/modularity.zh.md +++ b/docs/src/design/modularity.zh.md @@ -108,7 +108,7 @@ Python 侧采集(同层,不同语言): | 单元 | 路径 | 职责 | |------|------|------| -| **probing-server** | `probing/server/` | 路由、认证、`initialize_engine()`、fan-out | +| **probing-server** | `probing/server/` | 路由、认证、`initialize_engine()`、fan-out、**torchrun 心跳**(`torchrun_cluster.rs`) | | **probing-cli** | `probing/cli/` | HTTP 客户端;inject/query/repl/**skill** | HTTP 契约:`probing/server/API.md` + `tests/regression/spec/api_spec.json`。 @@ -269,8 +269,11 @@ sequenceDiagram | 关注点 | 归属 | 接口 | |--------|------|------| | SQL 解析、federation 重写 | probing-core | `Engine::async_query` | +| 表/列语义文档 | probing-core | `semantic_catalog` → `probe.probing.table_docs` / `column_docs` | | mmap 格式、冷压缩 | probing-memtable | `RowWriter`, `ColdStore` | +| Torchrun 集群心跳 | probing-server | `torchrun_cluster.rs`、`cluster_report_backoff.rs`、`PUT /apis/nodes` | | 混合 Python/C 栈 | probing-python/features | `python.backtrace`、pprof | +| macOS 线程 SIGUSR2 | probing-core | `signal::send_sigusr2_to_thread_id` | | Torch 模块采样 | python/profiling | `python.torch_trace` | | Collective 墙钟 | python/profiling/collective | `python.comm_collective` | | NCCL wait 分解 | nccl-profiler | `nccl.proxy_ops` | @@ -313,13 +316,28 @@ sequenceDiagram | 问题 | 现状 | 目标 | |------|------|------| | python → cli | `probing-python` → `probing-cli` | **可接受**(maturin wheel,仅 `cli_main`);禁止扩散 import | +| python → cc | ~~`probing-python` → `probing-cc`~~ | **已完成** — `send_sigusr2_to_thread_id` 迁至 `probing-core::signal` | +| core → NCCL/HCCL | `probing-core` → nccl/hccl shim(`builtin-schema-docs`)供 `semantic_catalog` | 改由采集器注册 docs,去掉 L1→L2 编译依赖 | +| core → skills YAML | `semantic_catalog` `include_str!(skills/semantic/tables.yaml)` | 接受为 L4 overlay SSOT,或迁到 `probing/core/resources/` | | server → python features | ~~`server/profiling.rs`~~ 已删 | 火焰图走 Extension | | server → REPL 内部 | ~~`PythonRepl`~~ | `/ws` 仅用 `ReplSession` 门面 | | 组装集中 | 全在 server/engine.rs | 可选 extension manifest | | Skill 三份 loader | Rust/Python/Web | `skills/` 为 SSOT,CI 同步校验 | -| kmsg 采集器 | 已实现未注册 | 在 engine 注册或删除 | +| kmsg 采集器 | 已注册(Linux/kmsg feature gate) | Done | | Architecture 文档 | 二层旧图 | 以本文 + [数据层](data-layer.zh.md) 为准 | +### 集群成员:Torchrun 心跳 vs Pulsing + +两条**互补**路径填充 `cluster.nodes` 并支撑 `global.*` 联邦,互不取代。 + +| 路径 | 层 | 适用场景 | 机制 | +|------|-----|----------|------| +| **Torchrun 集群心跳** | L3 `probing-server` | 默认:`torchrun`/elastic(`WORLD_SIZE > 1`,`PROBING=1/2`) | 分层 HTTP PUT + TCPStore 旁路键(`probing/torchrun//…`),**不**写 rendezvous 键。见 [Torchrun 集群心跳](torchrun-cluster.zh.md)。 | +| **Pulsing 集成** | L4 被动 + 外部运行时 | 作业已跑 [Pulsing](cluster-pulsing.zh.md) 并写 `pulsing.*` memtable | Probing 发现 mmap 表;无 probing 自有心跳线程。 | + +**torchrun 用户默认**:Rust ctor 自动 `maybe_start_torchrun_cluster()`。 +**Pulsing**:作业以 Pulsing 为中心做成员/故障检测,或需要 Pulsing actor 与 probing 表并存时使用。 + --- ## 9. 新功能决策树 @@ -347,6 +365,8 @@ sequenceDiagram | [数据层](data-layer.zh.md) | MEMT/MEMC 内部实现 | | [扩展机制](extensibility.zh.md) | 对外扩展路径(表 + skill + NCCL) | | [分布式](distributed.zh.md) | 联邦与集群 | +| [Torchrun 集群心跳](torchrun-cluster.zh.md) | 分层 torchrun 成员注册 | +| [基于 Pulsing 的集群](cluster-pulsing.zh.md) | 可选 Pulsing 成员发现 | | [NCCL Profiler](nccl-profiler.zh.md) | NCCL 插件边界 | | [web/DESIGN.md](https://github.com/DeepLink-org/probing/blob/main/web/DESIGN.md) | 前端模块布局 | | [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | Agent 使用 skill | diff --git a/probing/cli/src/cli/bench/runners/coldscan.rs b/probing/cli/src/cli/bench/runners/coldscan.rs index 19ffbe44..46161571 100644 --- a/probing/cli/src/cli/bench/runners/coldscan.rs +++ b/probing/cli/src/cli/bench/runners/coldscan.rs @@ -6,7 +6,7 @@ use std::time::Instant; -use anyhow::{bail, Result}; +use anyhow::{bail, Context, Result}; use probing_memtable::memc::{ColdStore, SegmentReader}; use crate::cli::bench::args::ColdscanArgs; @@ -48,8 +48,8 @@ pub fn run(args: &ColdscanArgs, json: bool, seed: u64) -> Result<()> { let mut rows = 0u64; let mut disk = 0u64; for path in &segments { - let reader = SegmentReader::open(path) - .map_err(|e| anyhow::anyhow!("open {}: {e}", path.display()))?; + let reader = + SegmentReader::open(path).with_context(|| format!("open {}", path.display()))?; for (i, page) in reader.pages().iter().enumerate() { disk += page.block_len as u64; let cols = reader diff --git a/probing/cli/src/cli/bench/runners/mixed.rs b/probing/cli/src/cli/bench/runners/mixed.rs index 1fbb6bda..516e429f 100644 --- a/probing/cli/src/cli/bench/runners/mixed.rs +++ b/probing/cli/src/cli/bench/runners/mixed.rs @@ -7,7 +7,7 @@ use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; use std::sync::Arc; use std::time::{Duration, Instant}; -use anyhow::{bail, Result}; +use anyhow::{bail, Context, Result}; use probing_memtable::memc::{ColdStore, Compactor, CompactorConfig}; use probing_memtable::{DType, MemTable}; @@ -58,7 +58,10 @@ pub fn run(args: &MixedArgs, json: bool, seed: u64) -> Result<()> { args.ring.chunk_size, args.ring.chunks, )?; - let path = creator.path().expect("shared path").to_path_buf(); + let path = creator + .path() + .context("shared memtable has no file path")? + .to_path_buf(); (Attach::File(path), creator) } }; diff --git a/probing/cli/src/cli/bench/runners/mp.rs b/probing/cli/src/cli/bench/runners/mp.rs index b96e923c..8edca3f9 100644 --- a/probing/cli/src/cli/bench/runners/mp.rs +++ b/probing/cli/src/cli/bench/runners/mp.rs @@ -78,7 +78,10 @@ fn orchestrate(args: &MpArgs, json: bool, seed: u64) -> Result<()> { args.ring.chunk_size, args.ring.chunks, )?; - let path = creator.path().expect("shared path").to_path_buf(); + let path = creator + .path() + .context("shared memtable has no file path")? + .to_path_buf(); (Attach::File(path), creator) } }; diff --git a/probing/cli/src/cli/bench/runners/write.rs b/probing/cli/src/cli/bench/runners/write.rs index 11a242fb..74ae6a55 100644 --- a/probing/cli/src/cli/bench/runners/write.rs +++ b/probing/cli/src/cli/bench/runners/write.rs @@ -7,7 +7,7 @@ use std::sync::Barrier; use std::time::Instant; -use anyhow::{bail, Result}; +use anyhow::{bail, Context, Result}; use probing_memtable::MemTable; use super::common; @@ -94,7 +94,7 @@ pub fn run(args: &WriteArgs, json: bool, seed: u64) -> Result<()> { )?; let path = creator .path() - .expect("shared table has a path") + .context("shared memtable has no file path")? .to_path_buf(); (Source::File(path), Some(creator)) } diff --git a/probing/cli/src/cli/ctrl.rs b/probing/cli/src/cli/ctrl.rs index dabb1b86..8d5ef813 100644 --- a/probing/cli/src/cli/ctrl.rs +++ b/probing/cli/src/cli/ctrl.rs @@ -1,4 +1,4 @@ -use anyhow::Result; +use anyhow::{Context, Result}; use std::io::Write; use http_body_util::{BodyExt, Full}; @@ -232,13 +232,13 @@ pub async fn request(ctrl: ProbeEndpoint, url: &str, body: Option) -> Re .method("POST") .uri(url) .body(Full::::from(body)) - .map_err(|e| anyhow::anyhow!("Failed to build POST request: {e}"))? + .context("Failed to build POST request")? } else { Request::builder() .method("GET") .uri(url) .body(Full::::default()) - .map_err(|e| anyhow::anyhow!("Failed to build GET request: {e}"))? + .context("Failed to build GET request")? }; let res = sender.send_request(request).await?; diff --git a/probing/cli/src/cli/repl.rs b/probing/cli/src/cli/repl.rs index 82150951..591e23f8 100644 --- a/probing/cli/src/cli/repl.rs +++ b/probing/cli/src/cli/repl.rs @@ -1,4 +1,4 @@ -use anyhow::Result; +use anyhow::{Context, Result}; use futures_util::sink::Sink; use futures_util::stream::Stream; use futures_util::{SinkExt, StreamExt}; @@ -45,7 +45,7 @@ pub async fn start_repl(ctrl: ProbeEndpoint) -> Result<()> { editor.read_line(&prompt) }) .await - .map_err(|e| anyhow::anyhow!("Error reading input task: {}", e))?; + .context("Error reading input task")?; match sig { Ok(Signal::Success(line)) => { @@ -155,7 +155,7 @@ async fn connect_tcp_websocket(addr: &str) -> Result { let url = format!("ws://{}/ws", addr); let (ws_stream, _) = connect_async(&url) .await - .map_err(|e| anyhow::anyhow!("WebSocket connection failed: {}", e))?; + .context("WebSocket connection failed")?; Ok(boxed_connection(ws_stream)) } @@ -182,7 +182,7 @@ async fn connect_unix_websocket(pid: i32) -> Result { let (ws_stream, _) = client_async("ws://localhost/ws", stream) .await - .map_err(|e| anyhow::anyhow!("WebSocket connection failed: {}", e))?; + .context("WebSocket connection failed")?; Ok(boxed_connection(ws_stream)) } diff --git a/probing/core/Cargo.toml b/probing/core/Cargo.toml index 2795ac16..4df89a93 100644 --- a/probing/core/Cargo.toml +++ b/probing/core/Cargo.toml @@ -26,6 +26,7 @@ similar_names = "allow" test-utils = [] default = ["builtin-schema-docs"] builtin-schema-docs = ["dep:probing-hccl-shim", "dep:probing-nccl-profiler"] +python-bridge = ["dep:pyo3"] [lib] crate-type = ["rlib"] @@ -57,6 +58,9 @@ bincode = "1.3.3" uuid = { version = "1.0", features = ["v4", "serde"] } url = "2.5" libc = "0.2" +pyo3 = { version = "0.29.0", optional = true, default-features = false, features = [ + "macros", +] } [dev-dependencies] tempfile = "3.8" diff --git a/probing/core/src/core/cluster.rs b/probing/core/src/core/cluster.rs index 3d64c0d5..4d059a06 100644 --- a/probing/core/src/core/cluster.rs +++ b/probing/core/src/core/cluster.rs @@ -59,8 +59,8 @@ static CLUSTER_VERSION: AtomicU64 = AtomicU64::new(0); fn now_micros() -> u64 { std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_micros() as u64 + .map(|d| d.as_micros() as u64) + .unwrap_or(0) } fn stale_threshold_micros() -> u64 { diff --git a/probing/core/src/core/error.rs b/probing/core/src/core/error.rs index 96d0d648..b14632e4 100644 --- a/probing/core/src/core/error.rs +++ b/probing/core/src/core/error.rs @@ -1,173 +1,185 @@ //! Error handling for the Probing engine //! -//! This module provides a comprehensive error handling system for the Probing engine. -//! It defines a structured error type hierarchy and conversion capabilities from common -//! external error types. +//! This module defines a single, structured error type ([`EngineError`]) for the +//! whole `probing-core` crate, together with the conversions that wire every +//! sub-system (storage, addressing, runtime, tracing, DataFusion, Arrow, …) into +//! one coherent propagation chain. +//! +//! Design principles +//! ----------------- +//! * **One error type per crate.** Everything funnels into [`EngineError`]; the +//! `?` operator works across layers without hand-written `map_err`. +//! * **Preserve the source chain.** Wrapping variants carry `#[source]`/`#[from]` +//! so `std::error::Error::source()` walks the real cause, instead of flattening +//! everything into an opaque string. +//! * **No stringly-typed coercion.** There is intentionally *no* +//! `From`/`From<&str>`; build errors through the explicit constructors +//! or the typed variants so categorisation is never lost by accident. +//! * **One boundary conversion.** [`EngineError`] converts to +//! [`datafusion::error::DataFusionError`] in a single place, so DataFusion trait +//! implementations can just use `?` instead of re-inventing the mapping. use thiserror::Error; -/// Core result type for all Probing engine operations +use datafusion::error::DataFusionError; + +/// Core result type for all Probing engine operations. pub type Result = std::result::Result; -/// Comprehensive error type for the Probing engine +/// Comprehensive error type for the Probing engine. /// -/// Categorizes errors into logical groups to help with error handling and reporting. +/// Variants are grouped by sub-system. Variants that wrap a foreign error keep +/// that error as their [`source`](std::error::Error::source) so the full causal +/// chain survives propagation. #[derive(Error, Debug)] pub enum EngineError { // ===== Plugin System Errors ===== - /// Generic plugin error + /// Generic plugin error. #[error("Plugin error: {0}")] PluginError(String), - /// Plugin not found error + /// Plugin not found error. #[error("Plugin not found: {0}")] PluginNotFound(String), - /// Plugin registration failure - #[error("Plugin registration failed: {0}")] - PluginRegistrationFailed(String), - // ===== Query Processing Errors ===== - /// General query execution error + /// General query execution error. #[error("Query execution error: {0}")] QueryError(String), - /// Internal engine error + /// Internal engine error. #[error("Internal engine error: {0}")] InternalError(String), - /// Error during external API call + /// Error during external API call. #[error("API call error: {0}")] CallError(String), - /// Unsupported API call + /// Unsupported API call. #[error("Unsupported API call")] UnsupportedCall, // ===== Data Processing Errors ===== - /// Apache Arrow data processing error - #[error("Arrow data error: {0}")] + /// Apache Arrow data processing error. + #[error(transparent)] ArrowError(#[from] arrow::error::ArrowError), - /// DataFusion query processing error - #[error("DataFusion error: {0}")] - DataFusionError(#[from] datafusion::error::DataFusionError), + /// DataFusion query processing error. + #[error(transparent)] + DataFusionError(#[from] DataFusionError), + + /// (De)serialization failure (bincode payloads in the storage layer). + #[error("Serialization error: {0}")] + Serialization(#[from] bincode::Error), // ===== Business Logic Errors ===== - /// Cluster management error + /// Cluster management error. #[error("Cluster error: {0}")] ClusterError(String), + /// Distributed/local storage error. + #[error("Storage error: {0}")] + Storage(String), + + /// Object addressing failure (URI parsing, allocation, …). + #[error(transparent)] + Address(#[from] crate::storage::addressing::AddressError), + // ===== System Errors ===== - /// Thread/mutex concurrency error + /// I/O error (filesystem, sockets, etc.). + #[error(transparent)] + Io(#[from] std::io::Error), + + /// Async runtime bridge failure. + #[error(transparent)] + Runtime(#[from] crate::runtime::RuntimeError), + + /// Tracing/span operation failure. + #[error(transparent)] + Trace(#[from] crate::trace::TraceError), + + /// Thread/mutex concurrency error. #[error("Concurrency error: {0}")] ConcurrencyError(String), // ===== Configuration Errors ===== - /// General configuration error + /// General configuration error. #[error("Configuration error: {0}")] ConfigError(String), - /// Unsupported configuration option + /// Unsupported configuration option. #[error("Unsupported option: {0}")] UnsupportedOption(String), - /// Invalid configuration option value + /// Invalid configuration option value. #[error("Invalid option value: {0}={1}")] InvalidOptionValue(String, String), - /// Attempt to modify read-only option + /// Attempt to modify a read-only option. #[error("Read-only option: {0}")] ReadOnlyOption(String), - /// Engine not initialized error - #[error("Engine not initialized")] - EngineNotInitialized, + /// Memtable mmap / validation failure (from `probing-memtable`). + #[error(transparent)] + Memtable(#[from] probing_memtable::MemtableError), } impl EngineError { - pub fn with_context>(self, context: C) -> EngineError { - let context = context.into(); - - // Helper macro to reduce boilerplate for string-based variants - macro_rules! add_context { - ($variant:path, $msg:expr) => { - $variant(format!("{}: {}", context, $msg)) - }; - } + /// Build a [`EngineError::PluginError`] without boilerplate. + pub fn plugin(msg: impl Into) -> Self { + Self::PluginError(msg.into()) + } - match self { - // String-based error variants that can have context added - EngineError::PluginError(msg) => add_context!(EngineError::PluginError, msg), - EngineError::PluginNotFound(msg) => add_context!(EngineError::PluginNotFound, msg), - EngineError::PluginRegistrationFailed(msg) => { - add_context!(EngineError::PluginRegistrationFailed, msg) - } - EngineError::QueryError(msg) => add_context!(EngineError::QueryError, msg), - EngineError::InternalError(msg) => add_context!(EngineError::InternalError, msg), - EngineError::CallError(msg) => add_context!(EngineError::CallError, msg), - EngineError::ClusterError(msg) => add_context!(EngineError::ClusterError, msg), - EngineError::ConcurrencyError(msg) => add_context!(EngineError::ConcurrencyError, msg), - EngineError::ConfigError(msg) => add_context!(EngineError::ConfigError, msg), - EngineError::UnsupportedOption(msg) => { - add_context!(EngineError::UnsupportedOption, msg) - } - EngineError::ReadOnlyOption(msg) => add_context!(EngineError::ReadOnlyOption, msg), - - // Error variants that cannot or should not have context added - e @ (EngineError::UnsupportedCall - | EngineError::ArrowError(_) - | EngineError::DataFusionError(_) - | EngineError::InvalidOptionValue(_, _) - | EngineError::EngineNotInitialized) => e, - } + /// Build a [`EngineError::QueryError`]. + pub fn query(msg: impl Into) -> Self { + Self::QueryError(msg.into()) } -} -// Generic lock poison error conversion -impl From> for EngineError { - fn from(err: std::sync::PoisonError) -> Self { - EngineError::ConcurrencyError(format!("Lock poisoned: {err}")) + /// Build a [`EngineError::InternalError`]. + pub fn internal(msg: impl Into) -> Self { + Self::InternalError(msg.into()) } -} -// String conversion for simple error creation -impl From for EngineError { - fn from(message: String) -> Self { - EngineError::InternalError(message) + /// Build a [`EngineError::ClusterError`]. + pub fn cluster(msg: impl Into) -> Self { + Self::ClusterError(msg.into()) } -} -impl From<&str> for EngineError { - fn from(message: &str) -> Self { - EngineError::InternalError(message.to_string()) + /// Build a [`EngineError::ConfigError`]. + pub fn config(msg: impl Into) -> Self { + Self::ConfigError(msg.into()) } -} -#[allow(unused)] -pub trait ResultExt { - fn context>(self, context: C) -> Result; -} + /// Build a [`EngineError::Storage`]. + pub fn storage(msg: impl Into) -> Self { + Self::Storage(msg.into()) + } -impl> ResultExt for std::result::Result { - fn context>(self, context: C) -> Result { - self.map_err(|e| { - let err = e.into(); - err.with_context(context.into()) - }) + /// Build a [`EngineError::InvalidOptionValue`] from an option name and detail. + pub fn invalid_option(option: impl Into, detail: impl std::fmt::Display) -> Self { + Self::InvalidOptionValue(option.into(), detail.to_string()) } } -#[allow(unused)] -pub fn ensure(condition: bool, message: impl Into) -> Result<()> { - if condition { - Ok(()) - } else { - Err(EngineError::InternalError(message.into())) +// Generic lock poison error conversion. +impl From> for EngineError { + fn from(err: std::sync::PoisonError) -> Self { + EngineError::ConcurrencyError(format!("Lock poisoned: {err}")) } } -#[allow(unused)] -pub fn bail(message: impl Into) -> Result { - Err(EngineError::InternalError(message.into())) +/// Single boundary conversion into DataFusion's error type. +/// +/// DataFusion trait implementations (`TableProvider`, `ExecutionPlan`, …) must +/// return [`DataFusionError`]. Centralising the mapping here means call sites can +/// simply use `?` / `.map_err(DataFusionError::from)` instead of hand-rolling a +/// `DataFusionError::Execution(format!(...))` everywhere. +impl From for DataFusionError { + fn from(err: EngineError) -> Self { + match err { + EngineError::DataFusionError(e) => e, + EngineError::ArrowError(e) => DataFusionError::ArrowError(Box::new(e), None), + other => DataFusionError::External(Box::new(other)), + } + } } diff --git a/probing/core/src/core/federation/aggregate_pushdown.rs b/probing/core/src/core/federation/aggregate_pushdown.rs index 2edb5b19..e6d295d0 100644 --- a/probing/core/src/core/federation/aggregate_pushdown.rs +++ b/probing/core/src/core/federation/aggregate_pushdown.rs @@ -426,10 +426,10 @@ fn build_global_merge_sql( } fn quote_ident(name: &str) -> String { - if name.chars().all(|c| c.is_ascii_alphanumeric() || c == '_') - && !name.is_empty() - && !name.chars().next().unwrap().is_ascii_digit() - { + let safe_unquoted = !name.is_empty() + && name.chars().all(|c| c.is_ascii_alphanumeric() || c == '_') + && !name.as_bytes().first().is_some_and(|b| b.is_ascii_digit()); + if safe_unquoted { name.to_string() } else { format!("\"{name}\"") diff --git a/probing/core/src/core/federation/cluster_executor.rs b/probing/core/src/core/federation/cluster_executor.rs index 0562f3fd..560346dc 100644 --- a/probing/core/src/core/federation/cluster_executor.rs +++ b/probing/core/src/core/federation/cluster_executor.rs @@ -24,6 +24,10 @@ const DEFAULT_REMOTE_QUERY_TIMEOUT_SECS: u64 = 2; /// Env var to override the per-node remote query timeout (seconds). const REMOTE_QUERY_TIMEOUT_ENV: &str = "PROBING_REMOTE_QUERY_TIMEOUT_SECS"; +fn external(err: E) -> DataFusionError { + DataFusionError::External(Box::new(err)) +} + /// Per-node timeout for remote federated queries. /// /// Defaults to [`DEFAULT_REMOTE_QUERY_TIMEOUT_SECS`]; override via the @@ -179,29 +183,24 @@ impl ProbeClusterExecutor { expr: sql.to_string(), ..Default::default() }); - let body = - serde_json::to_string(&request).map_err(|e| DataFusionError::External(Box::new(e)))?; + let body = serde_json::to_string(&request).map_err(external)?; let addr_owned = addr.to_string(); let response = ureq::post(&url) .config() .timeout_global(Some(remote_query_timeout())) .build() .send(body) - .map_err(|e| DataFusionError::External(Box::new(e)))?; + .map_err(external)?; let status = response.status().as_u16(); - let text = response - .into_body() - .read_to_string() - .map_err(|e| DataFusionError::External(Box::new(e)))?; + let text = response.into_body().read_to_string().map_err(external)?; if status >= 400 { return Err(DataFusionError::Execution(format!( "remote query {addr_owned} failed: HTTP {status}: {text}" ))); } - let msg: Message = - serde_json::from_str(&text).map_err(|e| DataFusionError::External(Box::new(e)))?; + let msg: Message = serde_json::from_str(&text).map_err(external)?; match msg.payload { QueryDataFormat::DataFrame(df) => Ok(df), QueryDataFormat::Nil => Ok(DataFrame::default()), diff --git a/probing/core/src/core/federation/convert.rs b/probing/core/src/core/federation/convert.rs index 40690152..16aae064 100644 --- a/probing/core/src/core/federation/convert.rs +++ b/probing/core/src/core/federation/convert.rs @@ -32,6 +32,11 @@ pub const FEDERATION_TAG_COLUMNS: &[&str] = &[ PROBE_ROLE_COL, ]; +fn record_batch(schema: Schema, columns: Vec, ctx: &'static str) -> Result { + RecordBatch::try_new(Arc::new(schema), columns) + .map_err(|e| DataFusionError::Execution(format!("{ctx}: {e}"))) +} + #[derive(Debug, Clone, PartialEq, Eq)] pub struct FederationEndpointTags { pub host: String, @@ -189,8 +194,11 @@ pub fn proto_dataframe_to_record_batch(df: &DataFrame) -> Result { fields.push(Field::new(name, array_data_type(col), true)); columns.push(seq_to_array(col)?); } - RecordBatch::try_new(Arc::new(Schema::new(fields)), columns) - .map_err(|e| DataFusionError::Execution(format!("proto dataframe conversion failed: {e}"))) + record_batch( + Schema::new(fields), + columns, + "proto dataframe conversion failed", + ) } /// Honor the caller's column projection for `global.*` scans. @@ -252,8 +260,7 @@ pub fn dataframe_to_record_batch( columns.push(Arc::new(Int32Array::from(vec![tags.local_rank; rows]))); columns.push(Arc::new(StringArray::from(vec![tags.role; rows]))); - RecordBatch::try_new(Arc::new(Schema::new(fields)), columns) - .map_err(|e| DataFusionError::Execution(format!("dataframe conversion failed: {e}"))) + record_batch(Schema::new(fields), columns, "dataframe conversion failed") } pub fn tag_record_batch( @@ -276,8 +283,7 @@ pub fn tag_record_batch( append_batch_tags(&mut fields, &mut columns, rows, &tags)?; - RecordBatch::try_new(Arc::new(Schema::new(fields)), columns) - .map_err(|e| DataFusionError::Execution(format!("tagging batch failed: {e}"))) + record_batch(Schema::new(fields), columns, "tagging batch failed") } fn append_batch_tags( @@ -338,8 +344,7 @@ pub fn align_batch_to_schema(batch: RecordBatch, schema: &Schema) -> Result DataType { diff --git a/probing/core/src/core/federation/rewrite.rs b/probing/core/src/core/federation/rewrite.rs index f6823a86..07033ce1 100644 --- a/probing/core/src/core/federation/rewrite.rs +++ b/probing/core/src/core/federation/rewrite.rs @@ -1,6 +1,10 @@ //! SQL rewrite helpers for the `probe` / `global` catalog split. -use datafusion::sql::sqlparser::ast::{Query, SelectItem, SetExpr, Statement}; +use std::ops::ControlFlow; + +use datafusion::sql::sqlparser::ast::{ + visit_relations_mut, Ident, ObjectName, ObjectNamePart, Query, SelectItem, SetExpr, Statement, +}; use datafusion::sql::sqlparser::dialect::GenericDialect; use datafusion::sql::sqlparser::parser::Parser; @@ -10,12 +14,98 @@ const KNOWN_SCHEMAS: &[&str] = &[ /// Rewrite federated SQL so remote probing nodes execute against the local `probe` catalog. pub fn rewrite_global_catalog_to_probe(sql: &str) -> String { - sql.replace("global.", "probe.") - .replace("GLOBAL.", "probe.") + rewrite_catalog_relations(sql, rewrite_relation_global_to_probe) + .unwrap_or_else(|| rewrite_global_catalog_to_probe_legacy(sql)) } /// Rewrite a user/cluster SQL string to reference the `global` catalog. pub fn rewrite_sql_for_global_fanout(sql: &str) -> String { + rewrite_catalog_relations(sql, rewrite_relation_to_global) + .unwrap_or_else(|| rewrite_sql_for_global_fanout_legacy(sql)) +} + +fn rewrite_catalog_relations(sql: &str, mut rewrite_fn: F) -> Option +where + F: FnMut(&mut ObjectName), +{ + let dialect = GenericDialect {}; + let mut stmts = Parser::parse_sql(&dialect, sql).ok()?; + if stmts.is_empty() { + return None; + } + for stmt in &mut stmts { + let _ = visit_relations_mut(stmt, |name| { + rewrite_fn(name); + ControlFlow::<(), ()>::Continue(()) + }); + } + Some( + stmts + .iter() + .map(|stmt| stmt.to_string()) + .collect::>() + .join("; "), + ) +} + +fn relation_ident_parts(name: &ObjectName) -> Vec { + name.0 + .iter() + .filter_map(|part| part.as_ident().map(|ident| ident.value.clone())) + .collect() +} + +fn set_relation_parts(name: &mut ObjectName, parts: &[&str]) { + name.0 = parts + .iter() + .map(|part| ObjectNamePart::Identifier(Ident::new(*part))) + .collect(); +} + +fn first_ident_eq(parts: &[String], expected: &str) -> bool { + parts + .first() + .is_some_and(|part| part.eq_ignore_ascii_case(expected)) +} + +fn rewrite_relation_global_to_probe(name: &mut ObjectName) { + let parts = relation_ident_parts(name); + if !first_ident_eq(&parts, "global") { + return; + } + let mut rewritten = vec!["probe"]; + rewritten.extend(parts.iter().skip(1).map(String::as_str)); + set_relation_parts(name, &rewritten); +} + +fn rewrite_relation_to_global(name: &mut ObjectName) { + let parts = relation_ident_parts(name); + if parts.is_empty() || first_ident_eq(&parts, "global") { + return; + } + if first_ident_eq(&parts, "probe") { + let mut rewritten = vec!["global"]; + rewritten.extend(parts.iter().skip(1).map(String::as_str)); + set_relation_parts(name, &rewritten); + return; + } + if parts.first().is_some_and(|part| { + KNOWN_SCHEMAS + .iter() + .any(|schema| part.eq_ignore_ascii_case(schema)) + }) { + let mut rewritten = vec!["global"]; + rewritten.extend(parts.iter().map(String::as_str)); + set_relation_parts(name, &rewritten); + } +} + +fn rewrite_global_catalog_to_probe_legacy(sql: &str) -> String { + sql.replace("global.", "probe.") + .replace("GLOBAL.", "probe.") +} + +fn rewrite_sql_for_global_fanout_legacy(sql: &str) -> String { if sql.to_lowercase().contains("global.") { return sql.to_string(); } @@ -291,4 +381,32 @@ mod tests { "SELECT * FROM global.python.comm_collective WHERE rank > 0 LIMIT 10" ); } + + #[test] + fn global_fanout_does_not_rewrite_catalog_prefix_in_string_literals() { + let sql = "SELECT 'probe.python.secret' AS note FROM python.metrics LIMIT 1"; + let out = rewrite_sql_for_global_fanout(sql); + assert!(out.contains("'probe.python.secret'")); + assert!(out.contains("global.python.metrics")); + assert!(!out.contains("'global.python.secret'")); + } + + #[test] + fn global_to_probe_does_not_rewrite_catalog_prefix_in_string_literals() { + let sql = "SELECT 'global.python.metrics' AS note FROM global.python.metrics LIMIT 1"; + let out = rewrite_global_catalog_to_probe(sql); + assert!(out.contains("'global.python.metrics'")); + assert!(out.contains("probe.python.metrics")); + assert!(!out.contains("'probe.python.metrics'")); + } + + #[test] + fn global_fanout_still_rewrites_unqualified_table_when_literal_mentions_global() { + let sql = "SELECT name FROM python.metrics WHERE name = 'see global.python.b'"; + let out = rewrite_sql_for_global_fanout(sql); + assert_eq!( + out, + "SELECT name FROM global.python.metrics WHERE name = 'see global.python.b'" + ); + } } diff --git a/probing/core/src/core/memtable_sql.rs b/probing/core/src/core/memtable_sql.rs index fc59dd67..14413bda 100644 --- a/probing/core/src/core/memtable_sql.rs +++ b/probing/core/src/core/memtable_sql.rs @@ -56,7 +56,9 @@ use probing_memtable::discover::{default_dir, MappedFile}; use probing_memtable::memc::{ ColdStats, ColdStore, ColumnData, Compactor, CompactorConfig, SegmentReader, }; -use probing_memtable::{detect_table, DType, MemTableView, MemhView, TableKind, TypedValue}; +use probing_memtable::{ + detect_table, DType, MemTableView, MemhView, MemtableError, TableKind, TypedValue, +}; use super::plugin_advanced::{scan_memory_partitions, supports_filters_pushdown_for_schema}; use super::{ @@ -532,7 +534,7 @@ pub struct RingMmapTable { } impl RingMmapTable { - pub fn try_new(mapped: MappedFile) -> Result { + pub fn try_new(mapped: MappedFile) -> Result { let view = MemTableView::new(mapped.as_bytes())?; let schema = view_to_arrow_schema(&view); Ok(Self { @@ -1199,7 +1201,7 @@ impl ColdCompactor { let running = self.running.clone(); let poll = cfg.poll; - let handle = std::thread::Builder::new() + match std::thread::Builder::new() .name("memc-compactor".into()) .spawn(move || { while running.load(Ordering::SeqCst) { @@ -1224,9 +1226,15 @@ impl ColdCompactor { if let Err(e) = compactor.flush() { log::debug!("cold compactor: final flush: {e}"); } - }) - .expect("spawn memc-compactor thread"); - *lock_compactor_handle(&self.handle) = Some(handle); + }) { + Ok(handle) => { + *lock_compactor_handle(&self.handle) = Some(handle); + } + Err(e) => { + log::error!("cold compactor: failed to spawn background thread: {e}"); + self.running.store(false, Ordering::SeqCst); + } + } } /// Signal the thread to flush and exit, then join it. @@ -1925,7 +1933,7 @@ mod tests { let schema = MtSchema::new().col("ts", DType::I64).col("msg", DType::Str); let mut table = ExposedTable::create("test_metrics", &schema, 4096, 2).unwrap(); { - let mut w = table.writer(); + let mut w = table.writer().expect("valid mmap table"); w.push_row(&[Value::I64(100), Value::Str("alpha")]); w.push_row(&[Value::I64(200), Value::Str("beta")]); } @@ -1980,7 +1988,7 @@ mod tests { let dotted = mmap_filename_for("acme", "metrics_demo"); let mut ring = ExposedTable::create(&dotted, &schema, 4096, 2).unwrap(); { - let mut w = ring.writer(); + let mut w = ring.writer().expect("valid mmap table"); w.push_row(&[Value::I64(1), Value::Str("x")]); } diff --git a/probing/core/src/core/mod.rs b/probing/core/src/core/mod.rs index 0c15d98c..518806f8 100644 --- a/probing/core/src/core/mod.rs +++ b/probing/core/src/core/mod.rs @@ -19,6 +19,8 @@ pub use engine::EngineBuilder; pub use error::EngineError; pub use error::Result; +pub use probing_memtable::MemtableError; + pub use data_source::CustomNamespace; pub use data_source::CustomNamespaceDataSource; pub use data_source::CustomTable; diff --git a/probing/core/src/core/plugin_advanced.rs b/probing/core/src/core/plugin_advanced.rs index e7c87dd1..7a5bc9b0 100644 --- a/probing/core/src/core/plugin_advanced.rs +++ b/probing/core/src/core/plugin_advanced.rs @@ -10,9 +10,10 @@ use std::fmt::Debug; use std::sync::Arc; use async_trait::async_trait; +#[cfg(test)] use datafusion::arrow::array::Int64Array; use datafusion::arrow::datatypes::{DataType, Field, Schema, SchemaRef}; -use datafusion::arrow::record_batch::{RecordBatch, RecordBatchOptions}; +use datafusion::arrow::record_batch::RecordBatch; use datafusion::catalog::Session; use datafusion::common::tree_node::TreeNode; use datafusion::common::DFSchema; @@ -92,12 +93,7 @@ impl PluginAdvancedTable { DataType::Int64, true, )])); - let empty = RecordBatch::try_new_with_options( - Arc::clone(&schema), - vec![Arc::new(Int64Array::from(Vec::::new()))], - &RecordBatchOptions::new().with_row_count(Some(0)), - ) - .expect("empty batch"); + let empty = RecordBatch::new_empty(Arc::clone(&schema)); Self { label, schema, diff --git a/probing/core/src/core/probe_extension.rs b/probing/core/src/core/probe_extension.rs index 6de73418..ac8c81dc 100644 --- a/probing/core/src/core/probe_extension.rs +++ b/probing/core/src/core/probe_extension.rs @@ -422,8 +422,7 @@ impl ExtensionOptions for ProbeExtensionManager { fn set(&mut self, key: &str, value: &str) -> datafusion::error::Result<()> { use futures::executor::block_on; - block_on(self.set_option(key, value)) - .map_err(|e| datafusion::error::DataFusionError::Execution(e.to_string())) + block_on(self.set_option(key, value)).map_err(datafusion::error::DataFusionError::from) } fn entries(&self) -> Vec { diff --git a/probing/core/src/core/semantic_catalog.rs b/probing/core/src/core/semantic_catalog.rs index 6967bceb..8bf78e66 100644 --- a/probing/core/src/core/semantic_catalog.rs +++ b/probing/core/src/core/semantic_catalog.rs @@ -202,8 +202,13 @@ use datafusion::catalog::TableProvider; static SEMANTIC_COLUMN_INDEX: LazyLock>> = LazyLock::new(|| { - let yaml = parse_semantic_catalog_yaml(TABLES_YAML) - .expect("skills/semantic/tables.yaml must parse"); + let yaml = match parse_semantic_catalog_yaml(TABLES_YAML) { + Ok(yaml) => yaml, + Err(e) => { + log::error!("skills/semantic/tables.yaml failed to parse: {e}"); + return HashMap::new(); + } + }; let mut map: HashMap<(String, String), Vec> = HashMap::new(); for row in yaml.column_rows { map.entry((row.table_schema, row.table_name)) diff --git a/probing/core/src/lib.rs b/probing/core/src/lib.rs index 2753c8c0..9d03995b 100644 --- a/probing/core/src/lib.rs +++ b/probing/core/src/lib.rs @@ -4,6 +4,7 @@ pub mod config; pub mod core; pub mod diagnostics; pub mod runtime; +pub mod signal; pub mod storage; pub mod sync; pub mod trace; @@ -12,7 +13,7 @@ mod tracing; pub use diagnostics::install_panic_hook; pub use runtime::{ block_on, is_python_main_thread, register_python_main_thread, run_on_native_thread, - CORE_RUNTIME, + runtime_operational, BlockOnFallback, RuntimeError, CORE_RUNTIME, }; use self::core::Engine; @@ -22,23 +23,19 @@ pub fn create_engine() -> EngineBuilder { Engine::builder().with_default_namespace("probe") } -use anyhow::Result; use once_cell::sync::Lazy; use tokio::sync::RwLock; +use self::core::Result; + pub static ENGINE: Lazy> = Lazy::new(|| RwLock::new(Engine::default())); pub async fn initialize_engine(builder: EngineBuilder) -> Result<()> { - let engine = match builder.build().await { - Ok(engine) => engine, - Err(e) => { - log::error!("Error creating engine: {e}"); - return Err(e.into()); - } - }; - - let mut global_engine = ENGINE.write().await; - *global_engine = engine; + let engine = builder + .build() + .await + .inspect_err(|e| log::error!("Error creating engine: {e}"))?; + *ENGINE.write().await = engine; Ok(()) } diff --git a/probing/core/src/runtime.rs b/probing/core/src/runtime.rs index 0c40afd5..b42cfbe9 100644 --- a/probing/core/src/runtime.rs +++ b/probing/core/src/runtime.rs @@ -1,56 +1,252 @@ use std::cell::Cell; use std::future::Future; +use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{mpsc, Arc, Mutex, OnceLock}; use std::thread::{self, ThreadId}; use log; use once_cell::sync::Lazy; +use thiserror::Error; -fn build_core_runtime() -> tokio::runtime::Runtime { +/// Async bridge failure — probing continues but callers should treat results as unavailable. +#[derive(Debug, Clone, Error)] +pub enum RuntimeError { + #[error("probing runtime unavailable")] + Unavailable, + #[error("probing runtime internal error: {0}")] + Internal(String), + #[error("probing runtime panicked")] + Panicked, +} + +impl From for datafusion::error::DataFusionError { + fn from(e: RuntimeError) -> Self { + datafusion::error::DataFusionError::Execution(e.to_string()) + } +} + +/// Fallback value when [`block_on`] cannot run the future (never panics or exits). +pub trait BlockOnFallback: Send + 'static { + fn on_block_on_failure(err: RuntimeError) -> Self; +} + +impl BlockOnFallback for () { + fn on_block_on_failure(_: RuntimeError) -> Self {} +} + +impl BlockOnFallback for bool { + fn on_block_on_failure(_: RuntimeError) -> Self { + false + } +} + +impl BlockOnFallback for usize { + fn on_block_on_failure(_: RuntimeError) -> Self { + 0 + } +} + +impl BlockOnFallback for i32 { + fn on_block_on_failure(_: RuntimeError) -> Self { + 0 + } +} + +impl BlockOnFallback for Option { + fn on_block_on_failure(_: RuntimeError) -> Self { + None + } +} + +impl BlockOnFallback for Result +where + T: Send + 'static, + E: From + Send + 'static, +{ + fn on_block_on_failure(err: RuntimeError) -> Self { + Err(err.into()) + } +} + +impl BlockOnFallback for Result { + fn on_block_on_failure(err: RuntimeError) -> Self { + Err(err.to_string()) + } +} + +impl BlockOnFallback for std::collections::HashMap +where + K: Eq + std::hash::Hash + Send + 'static, + V: Send + 'static, + S: Default + std::hash::BuildHasher + Send + 'static, +{ + fn on_block_on_failure(_: RuntimeError) -> Self { + Self::default() + } +} + +impl BlockOnFallback for String { + fn on_block_on_failure(_: RuntimeError) -> Self { + String::new() + } +} + +impl BlockOnFallback for Vec { + fn on_block_on_failure(_: RuntimeError) -> Self { + Vec::new() + } +} + +#[cfg(feature = "python-bridge")] +impl BlockOnFallback for Result { + fn on_block_on_failure(err: RuntimeError) -> Self { + Err(pyo3::exceptions::PyRuntimeError::new_err(err.to_string())) + } +} + +fn try_build_core_runtime() -> Option { let worker_threads = std::env::var("PROBING_SERVER_WORKER_THREADS") .unwrap_or_else(|_| "4".to_string()) .parse::() .unwrap_or(4); - match tokio::runtime::Builder::new_multi_thread() + + if let Ok(rt) = tokio::runtime::Builder::new_multi_thread() .enable_all() .worker_threads(worker_threads) .thread_name("probing-runtime") .build() { - Ok(rt) => rt, + return Some(rt); + } + + log::error!("Failed to create probing multi-thread runtime; trying current-thread fallback"); + + match tokio::runtime::Builder::new_current_thread() + .enable_all() + .thread_name("probing-runtime") + .build() + { + Ok(rt) => Some(rt), Err(e) => { - log::error!("Failed to create probing multi-thread runtime: {e}; trying current-thread fallback"); - tokio::runtime::Builder::new_current_thread() - .enable_all() - .thread_name("probing-runtime") - .build() - .unwrap_or_else(|e2| { - log::error!( - "Failed to create probing fallback runtime: {e2}; using minimal runtime" - ); - tokio::runtime::Builder::new_current_thread() - .build() - .expect("unable to create minimal tokio runtime") - }) + log::error!( + "Failed to create probing current-thread runtime: {e}; \ + async bridge will use ephemeral executors only" + ); + None } } } +/// Shared Tokio runtime for sync→async bridges (Python bindings, local server, etc.). +pub struct CoreRuntime { + inner: Option, + degraded: AtomicBool, +} + +static FALLBACK_RUNTIME: OnceLock = OnceLock::new(); + +/// Last-resort runtime for the server-side `block_on`/`spawn` methods, which — +/// unlike the free [`block_on`] function — cannot return a `Result`. Tries a +/// bounded number of times rather than spinning forever, so a catastrophic +/// environment fails loudly instead of hanging a thread. +fn build_emergency_runtime() -> tokio::runtime::Runtime { + const MAX_ATTEMPTS: u32 = 8; + for attempt in 1..=MAX_ATTEMPTS { + match tokio::runtime::Builder::new_current_thread() + .enable_all() + .thread_name("probing-runtime-fallback") + .build() + { + Ok(rt) => return rt, + Err(e) => { + log::error!( + "probing: emergency runtime creation failed (attempt {attempt}/{MAX_ATTEMPTS}): {e}" + ); + std::thread::sleep(std::time::Duration::from_millis(100)); + } + } + } + panic!("probing: unable to create any tokio runtime after {MAX_ATTEMPTS} attempts"); +} + +impl CoreRuntime { + fn new() -> Self { + let inner = try_build_core_runtime(); + let degraded = inner.is_none(); + if degraded { + log::error!( + "probing: no tokio runtime available; marking async bridge degraded \ + (queries and config may return empty/error results)" + ); + } + Self { + inner, + degraded: AtomicBool::new(degraded), + } + } + + fn runtime_ref(&self) -> &tokio::runtime::Runtime { + if let Some(rt) = &self.inner { + return rt; + } + FALLBACK_RUNTIME.get_or_init(|| { + self.mark_degraded(); + log::error!("probing: activating emergency fallback tokio runtime"); + build_emergency_runtime() + }) + } + + /// Whether the shared runtime is healthy enough for probing async work. + pub fn is_operational(&self) -> bool { + !self.degraded.load(Ordering::Relaxed) + } + + pub fn mark_degraded(&self) { + if !self.degraded.swap(true, Ordering::Relaxed) { + log::error!( + "probing: runtime marked degraded; async/query features may return \ + empty or error results until process restart" + ); + } + } + + pub fn spawn(&self, future: F) -> tokio::task::JoinHandle + where + F: Future + Send + 'static, + F::Output: Send + 'static, + { + self.runtime_ref().spawn(future) + } + + pub fn handle(&self) -> tokio::runtime::Handle { + self.runtime_ref().handle().clone() + } + + pub fn block_on(&self, future: F) -> T + where + F: Future, + { + self.runtime_ref().block_on(future) + } +} + /// Shared Tokio runtime for all sync→async bridges (Python bindings, local server, etc.). /// /// ENGINE and CONFIG_STORE must only be accessed from this runtime. Creating ad-hoc /// runtimes (especially when Python already has an asyncio loop) can cause SIGSEGV. -pub static CORE_RUNTIME: Lazy = Lazy::new(build_core_runtime); +pub static CORE_RUNTIME: Lazy = Lazy::new(CoreRuntime::new); + +/// Whether probing's async bridge is still operational. +pub fn runtime_operational() -> bool { + CORE_RUNTIME.is_operational() +} -/// Python main thread id, registered when `probing._core` loads. static PYTHON_MAIN_THREAD: OnceLock = OnceLock::new(); -/// Record the Python main thread (call from `probing._core` module init). pub fn register_python_main_thread() { let _ = PYTHON_MAIN_THREAD.set(thread::current().id()); } -/// Whether the current thread is the Python main thread registered at `_core` load. pub fn is_python_main_thread() -> bool { PYTHON_MAIN_THREAD .get() @@ -61,6 +257,16 @@ fn is_inside_core_runtime() -> bool { tokio::runtime::Handle::try_current().is_ok() } +fn take_from_mutex_cell(cell: &Mutex>, context: &str) -> Option { + match cell.lock() { + Ok(mut guard) => guard.take(), + Err(poison) => { + log::warn!("probing {context}: mutex poisoned; recovering stored value if any"); + poison.into_inner().take() + } + } +} + fn block_on_ephemeral(future: F) -> T where F: Future, @@ -77,39 +283,52 @@ where } } -fn recover_block_on_from_cell(future_cell: &Arc>>) -> T +fn block_on_failed(context: &str) -> Result { + log::error!("probing block_on: {context}; async bridge degraded"); + CORE_RUNTIME.mark_degraded(); + Err(RuntimeError::Internal(context.to_string())) +} + +fn recover_block_on_from_cell(future_cell: &Arc>>) -> Result where F: Future, { - let fut = future_cell - .lock() - .ok() - .and_then(|mut guard| guard.take()) - .expect("block_on future missing"); - block_on_ephemeral(fut) + match take_from_mutex_cell(future_cell, "block_on recovery") { + Some(fut) => Ok(block_on_ephemeral(fut)), + None => block_on_failed("future missing during block_on recovery"), + } } -fn spawn_block_on_thread(future: F) -> T +fn spawn_block_on_thread(future: F) -> Result where F: Future + Send + 'static, T: Send + 'static, { + let (tx, rx) = mpsc::sync_channel::(1); let future_cell = Arc::new(Mutex::new(Some(future))); let worker_cell = Arc::clone(&future_cell); + + let worker = move || { + let Some(fut) = take_from_mutex_cell(&worker_cell, "block_on worker") else { + CORE_RUNTIME.mark_degraded(); + log::error!("probing block_on worker: future missing from cell"); + return; + }; + let out = CORE_RUNTIME.block_on(fut); + let _ = tx.send(out); + }; + match thread::Builder::new() .name("probing-block-on".into()) - .spawn(move || { - let fut = worker_cell - .lock() - .ok() - .and_then(|mut guard| guard.take()) - .expect("block_on future missing"); - CORE_RUNTIME.block_on(fut) - }) { + .spawn(worker) + { Ok(handle) => match handle.join() { - Ok(v) => v, + Ok(()) => match rx.recv() { + Ok(v) => Ok(v), + Err(_) => recover_block_on_from_cell(&future_cell), + }, Err(_) => { - log::error!("block_on thread panicked; using ephemeral runtime"); + log::error!("block_on thread panicked; attempting recovery"); recover_block_on_from_cell(&future_cell) } }, @@ -120,8 +339,6 @@ where } } -/// Single worker for Python↔Rust calls that must not run on the Python main thread -/// (macOS/PyArrow) or on Tokio workers (nested Python callbacks). struct NativeBridge { tx: Option>, } @@ -143,6 +360,7 @@ impl NativeBridge { })); if finished.is_err() { log::error!("probing-native bridge worker panicked"); + CORE_RUNTIME.mark_degraded(); } let _ = job.done.send(()); } @@ -155,7 +373,10 @@ impl NativeBridge { } } - fn call(&self, f: impl FnOnce() -> R + Send + 'static) -> R { + fn call( + &self, + f: impl FnOnce() -> R + Send + 'static, + ) -> R { let Some(tx) = &self.tx else { return f(); }; @@ -163,40 +384,41 @@ impl NativeBridge { let (done_tx, done_rx) = mpsc::channel(); let func_cell = Arc::new(Mutex::new(Some(f))); let worker_cell = Arc::clone(&func_cell); + + let run_direct = |context: &str| -> R { + log::error!("probing-native bridge: {context}; using direct call"); + CORE_RUNTIME.mark_degraded(); + match take_from_mutex_cell(&func_cell, "native bridge direct") { + Some(func) => func(), + None => R::on_block_on_failure(RuntimeError::Internal(context.to_string())), + } + }; + if tx .send(BridgeJob { func: Box::new(move || { - let r = worker_cell - .lock() - .ok() - .and_then(|mut guard| guard.take()) - .expect("bridge func missing")(); - let _ = result_tx.send(r); + let out = match take_from_mutex_cell(&worker_cell, "native bridge worker") { + Some(func) => func(), + None => { + log::error!("probing-native bridge worker: func missing from cell"); + CORE_RUNTIME.mark_degraded(); + return; + } + }; + let _ = result_tx.send(out); }), done: done_tx, }) .is_err() { - log::error!("probing-native bridge thread exited; using direct call"); - return func_cell - .lock() - .ok() - .and_then(|mut guard| guard.take()) - .expect("bridge func missing")(); + return run_direct("bridge thread exited before job was queued"); } if done_rx.recv().is_err() { log::error!("probing-native bridge worker dropped completion"); } match result_rx.recv() { Ok(r) => r, - Err(_) => { - log::error!("probing-native bridge worker returned no value; using direct call"); - func_cell - .lock() - .ok() - .and_then(|mut guard| guard.take()) - .expect("bridge func missing")() - } + Err(_) => run_direct("bridge worker returned no value"), } } } @@ -211,7 +433,9 @@ fn on_native_bridge() -> bool { ON_NATIVE_BRIDGE.with(|v| v.get()) } -fn run_on_native_bridge(f: impl FnOnce() -> R + Send + 'static) -> R { +fn run_on_native_bridge( + f: impl FnOnce() -> R + Send + 'static, +) -> R { if on_native_bridge() { return f(); } @@ -229,8 +453,9 @@ fn needs_native_bridge() -> bool { (is_python_main_thread() && !on_native_bridge()) || is_inside_core_runtime() } -/// Run synchronous Rust/Python bridge work off the Python main thread and Tokio workers. -pub fn run_on_native_thread(f: impl FnOnce() -> R + Send + 'static) -> R { +pub fn run_on_native_thread( + f: impl FnOnce() -> R + Send + 'static, +) -> R { if needs_native_bridge() { return run_on_native_bridge(f); } @@ -238,16 +463,31 @@ pub fn run_on_native_thread(f: impl FnOnce() -> R + Send + 's } /// Run an async future on [`CORE_RUNTIME`] from a synchronous context. -pub fn block_on(future: F) -> T +/// +/// Returns `Err(RuntimeError)` when the async bridge cannot run the future +/// (degraded runtime, panic, …). Callers must decide how to surface that — +/// the bridge never fabricates a "successful-looking" empty/default value, +/// which for a diagnostics tool would silently turn a failure into "no data". +pub fn block_on(future: F) -> Result where F: Future + Send + 'static, T: Send + 'static, { - // Never call Runtime::block_on from a probing-runtime worker (panics). if is_inside_core_runtime() { return spawn_block_on_thread(future); } - run_on_native_thread(move || CORE_RUNTIME.block_on(future)) + run_on_native_thread(move || { + match std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + CORE_RUNTIME.block_on(future) + })) { + Ok(v) => Ok(v), + Err(_) => { + log::error!("probing block_on panicked on native thread"); + CORE_RUNTIME.mark_degraded(); + Err(RuntimeError::Panicked) + } + } + }) } #[cfg(test)] @@ -256,13 +496,15 @@ mod tests { #[test] fn block_on_completes_on_current_runtime() { - let value = block_on(async { 21 + 21 }); + let value = block_on(async { 21 + 21 }).expect("runtime available in tests"); assert_eq!(value, 42); } #[test] fn block_on_from_runtime_worker_does_not_panic() { - let value = block_on(async { block_on(async { 40 + 2 }) }); + let value = block_on(async { block_on(async { 40 + 2 }) }) + .expect("outer bridge") + .expect("inner bridge"); assert_eq!(value, 42); } @@ -272,4 +514,9 @@ mod tests { let b = run_on_native_bridge(|| 2); assert_eq!(a + b, 3); } + + #[test] + fn core_runtime_starts_operational_in_tests() { + assert!(runtime_operational()); + } } diff --git a/probing/core/src/signal/macos.rs b/probing/core/src/signal/macos.rs new file mode 100644 index 00000000..2d2e8d2e --- /dev/null +++ b/probing/core/src/signal/macos.rs @@ -0,0 +1,136 @@ +//! Deliver signals to live pthread/Mach threads on macOS. + +use std::io; + +#[allow(non_camel_case_types)] +mod mach { + use std::io; + use std::ptr; + + pub type kern_return_t = i32; + pub type mach_port_t = u32; + pub type integer_t = i32; + pub type thread_act_t = mach_port_t; + pub type task_t = mach_port_t; + + pub const KERN_SUCCESS: kern_return_t = 0; + pub const THREAD_IDENTIFIER_INFO: i32 = 4; + + #[repr(C)] + pub struct thread_identifier_info { + pub thread_id: u64, + pub thread_handle: u64, + pub dispatch_qaddr: u64, + } + + extern "C" { + pub fn mach_task_self() -> task_t; + pub fn task_threads( + target_task: task_t, + act_list: *mut *mut thread_act_t, + act_count: *mut u32, + ) -> kern_return_t; + pub fn thread_info( + target_act: thread_act_t, + flavor: i32, + thread_info_out: *mut integer_t, + thread_info_out_cnt: *mut u32, + ) -> kern_return_t; + pub fn mach_port_deallocate(task: task_t, name: mach_port_t) -> kern_return_t; + pub fn vm_deallocate(target_task: task_t, address: u64, size: u64) -> kern_return_t; + pub fn pthread_from_mach_thread_np(thread_port: thread_act_t) -> libc::pthread_t; + } + + pub fn thread_id_for_port(port: thread_act_t) -> Option { + let mut ident: thread_identifier_info = unsafe { std::mem::zeroed() }; + let mut ident_count = + (std::mem::size_of::() / std::mem::size_of::()) as u32; + let kr = unsafe { + thread_info( + port, + THREAD_IDENTIFIER_INFO, + &mut ident as *mut _ as *mut i32, + &mut ident_count, + ) + }; + if kr == KERN_SUCCESS { + Some(ident.thread_id) + } else { + None + } + } + + pub fn signal_sigusr2_on_port(port: thread_act_t) -> io::Result<()> { + extern "C" { + fn pthread_kill(thread: libc::pthread_t, sig: i32) -> i32; + } + unsafe { + let pthread = pthread_from_mach_thread_np(port); + if pthread == 0 { + return Err(io::Error::other( + "pthread_from_mach_thread_np returned null", + )); + } + if pthread_kill(pthread, libc::SIGUSR2) != 0 { + return Err(io::Error::last_os_error()); + } + } + Ok(()) + } + + pub fn list_thread_ports() -> io::Result> { + let mut list: *mut thread_act_t = ptr::null_mut(); + let mut count: u32 = 0; + let kr = unsafe { task_threads(mach_task_self(), &mut list, &mut count) }; + if kr != KERN_SUCCESS { + return Err(io::Error::other(format!("task_threads failed: {kr}"))); + } + if list.is_null() || count == 0 { + return Ok(Vec::new()); + } + + let ports = unsafe { std::slice::from_raw_parts(list, count as usize).to_vec() }; + let size = (count as u64).saturating_mul(std::mem::size_of::() as u64); + unsafe { + let _ = vm_deallocate(mach_task_self(), list as u64, size); + } + Ok(ports) + } +} + +use mach::{mach_port_deallocate, mach_task_self}; + +/// Deliver `SIGUSR2` to a live thread by Mach/pthread thread id. +pub fn send_sigusr2_to_thread_id(thread_id: i32) -> io::Result<()> { + if thread_id <= 0 { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + format!("invalid thread id {thread_id}"), + )); + } + let task = unsafe { mach_task_self() }; + let ports = mach::list_thread_ports()?; + let target = thread_id as u64; + + for port in ports { + let matched = mach::thread_id_for_port(port) + .map(|id| id == target) + .unwrap_or(false); + let result = if matched { + mach::signal_sigusr2_on_port(port) + } else { + Ok(()) + }; + unsafe { + let _ = mach_port_deallocate(task, port); + } + if matched { + return result; + } + } + + Err(io::Error::new( + io::ErrorKind::NotFound, + format!("no live thread with id {thread_id}"), + )) +} diff --git a/probing/core/src/signal/mod.rs b/probing/core/src/signal/mod.rs new file mode 100644 index 00000000..b20a18c9 --- /dev/null +++ b/probing/core/src/signal/mod.rs @@ -0,0 +1,7 @@ +//! Cross-platform signal helpers shared by collectors and runtime features. + +#[cfg(target_os = "macos")] +mod macos; + +#[cfg(target_os = "macos")] +pub use macos::send_sigusr2_to_thread_id; diff --git a/probing/core/src/storage/distributed.rs b/probing/core/src/storage/distributed.rs index d86ed394..20ef506f 100644 --- a/probing/core/src/storage/distributed.rs +++ b/probing/core/src/storage/distributed.rs @@ -2,7 +2,6 @@ use std::collections::HashMap; use std::fmt; use std::sync::Arc; -use anyhow::{anyhow, Result}; use async_trait::async_trait; use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; @@ -12,6 +11,7 @@ use super::entity::{EntityId, EntityStore, PersistentEntity}; use super::mem_store::MemoryStore; use super::topology::TopologyView; use crate::core::cluster_model::{NodeId, WorkerId}; +use crate::core::{EngineError, Result}; #[async_trait] pub trait RemoteStoreClient: Send + Sync { @@ -107,32 +107,53 @@ impl DistributedEntityStore { async fn get_remote_client(&self, location: &Address) -> Result> { let shard_key = location .shard_key() - .ok_or_else(|| anyhow!("Invalid address for remote operation"))?; + .ok_or_else(|| EngineError::storage("Invalid address for remote operation"))?; let clients = self.remote_clients.read().await; clients .get(&shard_key) .cloned() - .ok_or_else(|| anyhow!("No remote client for shard: {}", shard_key)) + .ok_or_else(|| EngineError::storage(format!("No remote client for shard: {shard_key}"))) } - async fn remove(&self, id: &T::Id, locations: &[&Address]) -> Result<()> { - let key = format!("{}::{}", T::entity_type(), id.as_str()); + /// Delete `key`/`id` at a single location, dispatching to the local store or + /// the matching remote client. `?` carries any addressing/client error. + async fn del_at( + &self, + id: &T::Id, + key: &str, + location: &Address, + ) -> Result<()> { + if location.is_local(&self.worker_id) { + self.local_store.del::(id).await + } else { + self.get_remote_client(location).await?.del(key).await + } + } - let mut results = Vec::new(); + /// Write a serialized entity at a single location. + async fn put_at( + &self, + entity: &T, + key: &str, + serialized: &[u8], + location: &Address, + ) -> Result<()> { + if location.is_local(&self.worker_id) { + self.local_store.put(entity).await + } else { + self.get_remote_client(location) + .await? + .put(key, serialized) + .await + } + } + async fn remove(&self, id: &T::Id, locations: &[&Address]) -> Result<()> { + let key = format!("{}::{}", T::entity_type(), id.as_str()); for location in locations { - let result = if location.is_local(&self.worker_id) { - self.local_store.del::(id).await - } else { - match self.get_remote_client(location).await { - Ok(client) => client.del(&key).await, - Err(e) => Err(e), - } - }; - - results.push(result); + // Per-location failures are tolerated (best-effort fan-out delete). + let _ = self.del_at::(id, &key, location).await; } - Ok(()) } @@ -144,21 +165,10 @@ impl DistributedEntityStore { let serialized = bincode::serialize(entity)?; let key = format!("{}::{}", T::entity_type(), entity.id().as_str()); - let mut results = Vec::new(); - + let mut results = Vec::with_capacity(locations.len()); for location in locations { - let result = if location.is_local(&self.worker_id) { - self.local_store.put(entity).await - } else { - match self.get_remote_client(location).await { - Ok(client) => client.put(&key, &serialized).await, - Err(e) => Err(e), - } - }; - - results.push(result); + results.push(self.put_at(entity, &key, &serialized, location).await); } - Ok(results) } @@ -208,12 +218,14 @@ impl EntityStore for DistributedEntityStore { ); if write_locations.is_empty() && !locations.is_empty() { - return Err(anyhow!( - "No suitable write locations found, though addresses were allocated." + return Err(EngineError::storage( + "No suitable write locations found, though addresses were allocated.", )); } if write_locations.is_empty() && locations.is_empty() { - return Err(anyhow!("No addresses allocated for the entity.")); + return Err(EngineError::storage( + "No addresses allocated for the entity.", + )); } let write_results = self.write(entity, &write_locations).await?; diff --git a/probing/core/src/storage/entity.rs b/probing/core/src/storage/entity.rs index 68db91c2..26fb70e4 100644 --- a/probing/core/src/storage/entity.rs +++ b/probing/core/src/storage/entity.rs @@ -1,5 +1,5 @@ // probing/core/src/storage/entity.rs -use anyhow::Result; +use crate::core::Result; use async_trait::async_trait; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; diff --git a/probing/core/src/storage/mem_store.rs b/probing/core/src/storage/mem_store.rs index 4f5a93c9..4335f650 100644 --- a/probing/core/src/storage/mem_store.rs +++ b/probing/core/src/storage/mem_store.rs @@ -1,6 +1,6 @@ // probing/core/src/storage/sled_store.rs use super::entity::{EntityId, EntityStore, PersistentEntity}; -use anyhow::Result; +use crate::core::Result; use async_trait::async_trait; use std::collections::HashMap; use std::sync::Arc; diff --git a/probing/core/src/storage/mod.rs b/probing/core/src/storage/mod.rs index 86c486ab..fd72a919 100644 --- a/probing/core/src/storage/mod.rs +++ b/probing/core/src/storage/mod.rs @@ -10,7 +10,7 @@ pub use entity::{EntityId, EntityStore, PersistentEntity}; pub use mem_store::MemoryStore; // Distributed storage exports -pub use addressing::{Address, AddressAllocator}; +pub use addressing::{Address, AddressAllocator, AddressError}; pub use distributed::{ConsistencyLevel, DistributedEntityStore, RemoteStoreClient}; pub use remote_client::MemoryRemoteClient; pub use topology::{TopologyStats, TopologyView}; diff --git a/probing/core/src/storage/remote_client.rs b/probing/core/src/storage/remote_client.rs index ac63af4b..0a011058 100644 --- a/probing/core/src/storage/remote_client.rs +++ b/probing/core/src/storage/remote_client.rs @@ -1,6 +1,6 @@ use super::distributed::RemoteStoreClient; use super::mem_store::MemoryStore; // Add this line -use anyhow::Result; +use crate::core::Result; use async_trait::async_trait; use std::sync::Arc; // Add this line diff --git a/probing/core/src/trace/mod.rs b/probing/core/src/trace/mod.rs index 461523e9..6c24329f 100644 --- a/probing/core/src/trace/mod.rs +++ b/probing/core/src/trace/mod.rs @@ -10,8 +10,9 @@ pub use step::{ // --- Custom Error Type --- /// Represents errors that can occur during tracing operations. -#[derive(Debug)] +#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)] pub enum TraceError { /// Indicates that an operation was attempted on a span that has already been closed. + #[error("span already closed")] SpanAlreadyClosed, } diff --git a/probing/extensions/cc/src/extensions/cpu/collector.rs b/probing/extensions/cc/src/extensions/cpu/collector.rs index 9c0bde04..214fa9e7 100644 --- a/probing/extensions/cc/src/extensions/cpu/collector.rs +++ b/probing/extensions/cc/src/extensions/cpu/collector.rs @@ -136,8 +136,8 @@ impl Default for CpuCollectorConfig { pub enum CollectorError { #[error("CPU collector already running")] AlreadyRunning, - #[error("Failed to open CPU memtables: {0}")] - OpenFailed(String), + #[error("Failed to open CPU memtables")] + OpenFailed(#[from] probing_memtable::MemtableError), #[error("CPU collector stop failed: {0}")] StopFailed(String), } @@ -267,7 +267,7 @@ struct CollectorTables { } impl CollectorTables { - fn open() -> Result { + fn open() -> probing_memtable::MemtableResult { Ok(Self { utilization: Mutex::new(ExposedTable::create( "cpu.utilization", @@ -295,12 +295,15 @@ impl CpuCollector { &INSTANCE } - fn shared_tables(&self) -> Result, std::io::Error> { + fn shared_tables(&self) -> probing_memtable::MemtableResult> { let mut guard = lock_cpu_collector(&self.tables); if guard.is_none() { *guard = Some(Arc::new(CollectorTables::open()?)); } - Ok(Arc::clone(guard.as_ref().unwrap())) + guard.as_ref().cloned().ok_or_else(|| { + log::error!("cpu collector: shared tables slot empty after init"); + probing_memtable::MemtableError::InvalidBuffer("cpu tables unavailable") + }) } #[cfg_attr(not(test), allow(dead_code))] @@ -321,9 +324,7 @@ impl CpuCollector { } let running = self.running.clone(); - let tables = self - .shared_tables() - .map_err(|e| CollectorError::OpenFailed(e.to_string()))?; + let tables = self.shared_tables()?; let handle = thread::spawn(move || { let sampler = host_sampler(); let platform = sampler.platform().to_string(); diff --git a/probing/extensions/cc/src/extensions/cpu/extension.rs b/probing/extensions/cc/src/extensions/cpu/extension.rs index 7e5c76f5..b6c2b6a3 100644 --- a/probing/extensions/cc/src/extensions/cpu/extension.rs +++ b/probing/extensions/cc/src/extensions/cpu/extension.rs @@ -64,12 +64,8 @@ impl CpuProbeExtension { _ => 8, }; - start_cpu_sampling(interval as u64, thread_top_n).map_err(|e| { - EngineError::InvalidOptionValue( - Self::OPTION_CPU_SAMPLE_INTERVAL_MS.to_string(), - format!("{e}"), - ) - })?; + start_cpu_sampling(interval as u64, thread_top_n) + .map_err(|e| EngineError::invalid_option(Self::OPTION_CPU_SAMPLE_INTERVAL_MS, e))?; self.cpu_sample_interval_ms = cpu_sample_interval_ms; Ok(()) diff --git a/probing/extensions/cc/src/extensions/cpu/macos.rs b/probing/extensions/cc/src/extensions/cpu/macos.rs index 3636ad51..925b8f95 100644 --- a/probing/extensions/cc/src/extensions/cpu/macos.rs +++ b/probing/extensions/cc/src/extensions/cpu/macos.rs @@ -77,43 +77,6 @@ mod mach { -> i32; } - pub fn thread_id_for_port(port: thread_act_t) -> Option { - let mut ident: thread_identifier_info = unsafe { std::mem::zeroed() }; - let mut ident_count = - (std::mem::size_of::() / std::mem::size_of::()) as u32; - let kr = unsafe { - thread_info( - port, - THREAD_IDENTIFIER_INFO, - &mut ident as *mut _ as *mut i32, - &mut ident_count, - ) - }; - if kr == KERN_SUCCESS { - Some(ident.thread_id) - } else { - None - } - } - - pub fn signal_sigusr2_on_port(port: thread_act_t) -> std::io::Result<()> { - extern "C" { - fn pthread_kill(thread: libc::pthread_t, sig: i32) -> i32; - } - unsafe { - let pthread = pthread_from_mach_thread_np(port); - if pthread == 0 { - return Err(std::io::Error::other( - "pthread_from_mach_thread_np returned null", - )); - } - if pthread_kill(pthread, libc::SIGUSR2) != 0 { - return Err(std::io::Error::last_os_error()); - } - } - Ok(()) - } - pub fn pthread_name(port: thread_act_t) -> Option { unsafe { let pthread = pthread_from_mach_thread_np(port); @@ -302,41 +265,6 @@ impl CpuHostSampler for MacSampler { } } -/// Deliver `SIGUSR2` to a live thread by Mach/pthread thread id (as stored in `cpu.tasks`). -pub fn send_sigusr2_to_thread_id(thread_id: i32) -> io::Result<()> { - if thread_id <= 0 { - return Err(io::Error::new( - io::ErrorKind::InvalidInput, - format!("invalid thread id {thread_id}"), - )); - } - let task = unsafe { mach_task_self() }; - let ports = mach::list_thread_ports()?; - let target = thread_id as u64; - - for port in ports { - let matched = mach::thread_id_for_port(port) - .map(|id| id == target) - .unwrap_or(false); - let result = if matched { - mach::signal_sigusr2_on_port(port) - } else { - Ok(()) - }; - unsafe { - let _ = mach_port_deallocate(task, port); - } - if matched { - return result; - } - } - - Err(io::Error::new( - io::ErrorKind::NotFound, - format!("no live thread with id {thread_id}"), - )) -} - #[cfg(test)] mod tests { use super::*; diff --git a/probing/extensions/cc/src/extensions/cpu/mod.rs b/probing/extensions/cc/src/extensions/cpu/mod.rs index 448a85be..53eacefb 100644 --- a/probing/extensions/cc/src/extensions/cpu/mod.rs +++ b/probing/extensions/cc/src/extensions/cpu/mod.rs @@ -12,7 +12,7 @@ mod unsupported; pub use collector::{autostart_interval_ms, start_cpu_sampling, start_cpu_sampling_from_env}; pub use extension::CpuProbeExtension; #[cfg(target_os = "macos")] -pub use macos::send_sigusr2_to_thread_id; +pub use probing_core::signal::send_sigusr2_to_thread_id; pub use sample::{ProcessSample, ThreadSample}; pub use sampler::{host_sampler, CpuHostSampler}; diff --git a/probing/extensions/cc/src/extensions/files.rs b/probing/extensions/cc/src/extensions/files.rs index 07076314..b7e666c7 100644 --- a/probing/extensions/cc/src/extensions/files.rs +++ b/probing/extensions/cc/src/extensions/files.rs @@ -21,21 +21,20 @@ impl CustomNamespace for FileList { } fn list() -> Vec { - let direntries = std::fs::read_dir(".").unwrap(); + let direntries = match std::fs::read_dir(".") { + Ok(entries) => entries, + Err(e) => { + log::error!("file namespace: read_dir failed: {e}"); + return Vec::new(); + } + }; direntries .filter_map(|entry| { - if let Ok(entry) = entry { - let filename = entry.file_name().into_string().unwrap(); - if filename.ends_with(".csv") { - Some(filename) - } else { - None - } - } else { - None - } + let entry = entry.ok()?; + let filename = entry.file_name().into_string().ok()?; + filename.ends_with(".csv").then_some(filename) }) - .collect::>() + .collect() } async fn table(expr: String) -> Result>> { diff --git a/probing/extensions/cc/src/extensions/rdma.rs b/probing/extensions/cc/src/extensions/rdma.rs index 6c247b0e..5ba21ee0 100644 --- a/probing/extensions/cc/src/extensions/rdma.rs +++ b/probing/extensions/cc/src/extensions/rdma.rs @@ -2,6 +2,7 @@ use probing_core::core::EngineError; use probing_core::core::Maybe; use probing_core::core::ProbeExtension; use probing_core::core::ProbeExtensionOption; +use probing_core::sync::lock_mutex; use datafusion::arrow::array::{GenericStringBuilder, RecordBatch}; use datafusion::arrow::datatypes::{DataType, Field, Schema, SchemaRef}; @@ -21,6 +22,20 @@ use std::time::{Duration, Instant}; static GLOBAL_HCA_NAME: OnceLock> = OnceLock::new(); static GLOBAL_HCA_SAMPLE_RATE: OnceLock> = OnceLock::new(); +fn lock_hca_name() -> std::sync::MutexGuard<'static, String> { + lock_mutex( + GLOBAL_HCA_NAME.get_or_init(|| Mutex::new(String::new())), + "rdma HCA name", + ) +} + +fn lock_sample_rate() -> std::sync::MutexGuard<'static, f64> { + lock_mutex( + GLOBAL_HCA_SAMPLE_RATE.get_or_init(|| Mutex::new(0.0)), + "rdma sample rate", + ) +} + #[derive(Default, Debug)] pub struct RdmaTable {} @@ -45,9 +60,7 @@ impl CustomTable for RdmaTable { } fn data() -> Vec { - let string = GLOBAL_HCA_NAME.get_or_init(|| Mutex::new(String::new())); - let guard = string.lock().unwrap(); - let hca_name = guard.clone(); + let hca_name = lock_hca_name().clone(); let mut monitor = RDMAMonitor::new(&hca_name); monitor.obtain_newset(); @@ -71,9 +84,7 @@ impl CustomTable for RdmaTable { np_cnp_sent.append_value(monitor.read_counter("np_cnp_sent")); np_ecn_marked_roce_packets.append_value(monitor.read_counter("np_ecn_marked_roce_packets")); - let f64_val = GLOBAL_HCA_SAMPLE_RATE.get_or_init(|| Mutex::new(0.0)); - let guard = f64_val.lock().unwrap(); - let sleep_time = *guard as u64; + let sleep_time = *lock_sample_rate() as u64; thread::sleep(Duration::from_secs(sleep_time)); @@ -141,14 +152,12 @@ fn resolve_hca_name(body: &[u8]) -> Result { if !body.is_empty() { let name = String::from_utf8_lossy(body).trim().to_string(); if !name.is_empty() { - let global = GLOBAL_HCA_NAME.get_or_init(|| Mutex::new(String::new())); - *global.lock().unwrap() = name.clone(); + *lock_hca_name() = name.clone(); return Ok(name); } } - let global = GLOBAL_HCA_NAME.get_or_init(|| Mutex::new(String::new())); - let name = global.lock().unwrap().clone(); + let name = lock_hca_name().clone(); if name.is_empty() { return Err(EngineError::InvalidOptionValue( RdmaProbeExtension::OPTION_HCA_NAME.to_string(), @@ -162,11 +171,7 @@ fn format_rdma_snapshot(hca_name: &str) -> Result { let mut monitor = RDMAMonitor::new(hca_name); monitor.obtain_newset(); - let sleep_secs = GLOBAL_HCA_SAMPLE_RATE - .get_or_init(|| Mutex::new(0.0)) - .lock() - .unwrap() - .max(0.0) as u64; + let sleep_secs = lock_sample_rate().max(0.0) as u64; if sleep_secs > 0 { thread::sleep(Duration::from_secs(sleep_secs)); } @@ -213,9 +218,7 @@ impl RdmaProbeExtension { )); } - let f64_val = GLOBAL_HCA_SAMPLE_RATE.get_or_init(|| Mutex::new(0.0)); - let mut guard = f64_val.lock().unwrap(); - *guard = rate; + *lock_sample_rate() = rate; } self.sample_rate = sample_rate; @@ -234,9 +237,7 @@ impl RdmaProbeExtension { )); } - let string = GLOBAL_HCA_NAME.get_or_init(|| Mutex::new(String::new())); - let mut guard = string.lock().unwrap(); - *guard = name.clone(); + *lock_hca_name() = name.clone(); } Ok(()) @@ -283,13 +284,10 @@ impl RDMAMonitor { previous: Option, interval: Option, ) -> f64 { - if current.is_none() || previous.is_none() || interval.is_none() { + let (Some(current), Some(previous), Some(interval)) = (current, previous, interval) else { return 0.0; - } - - let current = current.unwrap(); - let previous = previous.unwrap(); - let interval = interval.unwrap().as_secs_f64(); + }; + let interval = interval.as_secs_f64(); let diff = if current < previous { current + 2u64.pow(64) as f64 - previous @@ -313,8 +311,5 @@ fn read_file_to_f64(path: &str) -> io::Result { let mut file = File::open(path)?; let mut contents = String::new(); file.read_to_string(&mut contents)?; - contents - .trim() - .parse::() - .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e)) + contents.trim().parse::().map_err(io::Error::other) } diff --git a/probing/extensions/gpu/src/extensions/backend/registry.rs b/probing/extensions/gpu/src/extensions/backend/registry.rs index bee56400..957392ff 100644 --- a/probing/extensions/gpu/src/extensions/backend/registry.rs +++ b/probing/extensions/gpu/src/extensions/backend/registry.rs @@ -1,6 +1,7 @@ use std::sync::Mutex; use once_cell::sync::Lazy; +use probing_core::sync::lock_mutex; use super::traits::{GpuBackend, GpuBackendKind}; @@ -14,12 +15,12 @@ static BACKEND_FILTER: Lazy>>> = Lazy::new(|| M /// Restrict which backends are active (`None` = auto-discover all available). pub fn set_backend_filter(kinds: Option>) { - *BACKEND_FILTER.lock().unwrap() = kinds; + *lock_mutex(&BACKEND_FILTER, "GPU backend filter") = kinds; } #[cfg_attr(not(any(feature = "cuda", target_os = "macos")), allow(dead_code))] fn filter_allows(kind: GpuBackendKind) -> bool { - match BACKEND_FILTER.lock().unwrap().as_ref() { + match lock_mutex(&BACKEND_FILTER, "GPU backend filter").as_ref() { None => true, Some(list) => list.contains(&kind), } diff --git a/probing/extensions/gpu/src/extensions/collector.rs b/probing/extensions/gpu/src/extensions/collector.rs index 855f1e3e..fc2b5dae 100644 --- a/probing/extensions/gpu/src/extensions/collector.rs +++ b/probing/extensions/gpu/src/extensions/collector.rs @@ -127,8 +127,8 @@ pub enum CollectorError { AlreadyRunning, #[error("No GPU backend available")] NoBackend, - #[error("Failed to open GPU memtable: {0}")] - OpenFailed(String), + #[error("Failed to open GPU memtable")] + OpenFailed(#[from] probing_memtable::MemtableError), #[error("GPU collector stop failed: {0}")] StopFailed(String), } @@ -224,7 +224,7 @@ impl GpuCollector { &INSTANCE } - fn shared_table(&self) -> Result>, std::io::Error> { + fn shared_table(&self) -> probing_memtable::MemtableResult>> { let mut guard = lock_gpu_collector(&self.table); if guard.is_none() { *guard = Some(Arc::new(Mutex::new(ExposedTable::create( @@ -234,7 +234,10 @@ impl GpuCollector { NUM_CHUNKS, )?))); } - Ok(Arc::clone(guard.as_ref().unwrap())) + guard.as_ref().cloned().ok_or_else(|| { + log::error!("gpu collector: shared table slot empty after init"); + probing_memtable::MemtableError::InvalidBuffer("gpu table unavailable") + }) } pub fn start(&self, config: GpuCollectorConfig) -> Result<(), CollectorError> { @@ -248,9 +251,7 @@ impl GpuCollector { } let running = self.running.clone(); - let table = self - .shared_table() - .map_err(|e| CollectorError::OpenFailed(e.to_string()))?; + let table = self.shared_table()?; let handle = thread::spawn(move || { let mut iterations = config.iterations; diff --git a/probing/extensions/gpu/src/extensions/extension.rs b/probing/extensions/gpu/src/extensions/extension.rs index 9b53a128..5f1e8010 100644 --- a/probing/extensions/gpu/src/extensions/extension.rs +++ b/probing/extensions/gpu/src/extensions/extension.rs @@ -57,12 +57,8 @@ impl GpuProbeExtension { std::env::set_var("PROBING_GPU_BACKEND", backend); } - start_gpu_sampling(interval as u64).map_err(|e| { - EngineError::InvalidOptionValue( - Self::OPTION_GPU_SAMPLE_INTERVAL_MS.to_string(), - format!("{e}"), - ) - })?; + start_gpu_sampling(interval as u64) + .map_err(|e| EngineError::invalid_option(Self::OPTION_GPU_SAMPLE_INTERVAL_MS, e))?; self.gpu_sample_interval_ms = gpu_sample_interval_ms; Ok(()) diff --git a/probing/extensions/python/Cargo.toml b/probing/extensions/python/Cargo.toml index cc8b8789..77df8c27 100644 --- a/probing/extensions/python/Cargo.toml +++ b/probing/extensions/python/Cargo.toml @@ -13,14 +13,14 @@ tracing = [] default = ["extension-module", "tracing"] [dependencies] -probing-cc = { path = "../cc" } -probing-core = { path = "../../core" } +probing-core = { path = "../../core", features = ["python-bridge"] } probing-memtable = { path = "../../memtable" } probing-proto = { path = "../../proto" } probing-store = { path = "../../crates/store" } probing-cli = { path = "../../cli" } anyhow = { workspace = true } +thiserror = { workspace = true } ctor = { workspace = true } log = { workspace = true } nix = { workspace = true } diff --git a/probing/extensions/python/src/extensions/pprof.rs b/probing/extensions/python/src/extensions/pprof.rs index 512d7366..93876512 100644 --- a/probing/extensions/python/src/extensions/pprof.rs +++ b/probing/extensions/python/src/extensions/pprof.rs @@ -36,19 +36,13 @@ impl PprofProbeExtension { fn set_sample_freq(&mut self, pprof_sample_freq: Maybe) -> Result<(), EngineError> { // Clearing the option (`set probing.pprof.sample_freq=;`) or a value < 1 // disables sampling and tears the sampler down. - let disable = match pprof_sample_freq { - Maybe::Nothing => true, - Maybe::Just(freq) => freq < 1, - }; - if disable { - crate::features::pprof::reset(); - self.sample_freq = Maybe::Nothing; - return Ok(()); - } - let freq = match pprof_sample_freq { - Maybe::Just(freq) => freq, - Maybe::Nothing => unreachable!(), + Maybe::Just(freq) if freq >= 1 => freq, + _ => { + crate::features::pprof::reset(); + self.sample_freq = Maybe::Nothing; + return Ok(()); + } }; // Re-settable: `setup` bumps the sampler generation, retires the old // consumer thread, and re-arms the timer at the new rate. diff --git a/probing/extensions/python/src/extensions/python.rs b/probing/extensions/python/src/extensions/python.rs index d8312371..0fd911b3 100644 --- a/probing/extensions/python/src/extensions/python.rs +++ b/probing/extensions/python/src/extensions/python.rs @@ -1,7 +1,6 @@ use std::collections::HashMap; use std::fmt::Display; -use anyhow::Result; use async_trait::async_trait; use probing_core::core::EngineError; @@ -9,6 +8,7 @@ use probing_core::core::Maybe; use probing_core::core::ProbeExtension; use probing_core::core::ProbeExtensionCall; use probing_core::core::ProbeExtensionOption; +use probing_core::core::Result as EngineResult; use probing_core::run_on_native_thread; use probing_proto::prelude::CallFrame; use pyo3::prelude::*; @@ -74,7 +74,7 @@ impl ProbeExtensionCall for PythonExt { path: &str, params: &HashMap, body: &[u8], - ) -> Result, EngineError> { + ) -> EngineResult> { log::debug!( "Python extension call - path: {}, params: {:?}, body_size: {}", path, @@ -85,7 +85,7 @@ impl ProbeExtensionCall for PythonExt { let normalized_path = path.trim_start_matches('/'); if normalized_path.starts_with("crash/") { return crate::features::crash::handle_http(normalized_path, params, body) - .map_err(EngineError::PluginError); + .map_err(EngineError::plugin); } call_python_handler(normalized_path, params, body) } @@ -93,7 +93,7 @@ impl ProbeExtensionCall for PythonExt { impl PythonExt { /// Set up a Python crash handler - fn set_crash_handler(&mut self, crash_handler: Maybe) -> Result<(), EngineError> { + fn set_crash_handler(&mut self, crash_handler: Maybe) -> EngineResult<()> { match self.crash_handler { Maybe::Just(_) => Err(EngineError::ReadOnlyOption( Self::OPTION_CRASH_HANDLER.to_string(), @@ -129,7 +129,7 @@ impl PythonExt { } /// Set up Python monitoring - fn set_monitoring(&mut self, monitoring: Maybe) -> Result<(), EngineError> { + fn set_monitoring(&mut self, monitoring: Maybe) -> EngineResult<()> { log::debug!("Setting Python monitoring: {monitoring}"); match self.monitoring { Maybe::Just(_) => Err(EngineError::ReadOnlyOption( @@ -161,7 +161,7 @@ impl PythonExt { } /// Enable a Python extension from code string - fn set_enabled(&mut self, enabled: Maybe) -> Result<(), EngineError> { + fn set_enabled(&mut self, enabled: Maybe) -> EngineResult<()> { let ext = match &enabled { Maybe::Nothing => { return Err(EngineError::InvalidOptionValue( @@ -173,13 +173,13 @@ impl PythonExt { }; if self.enabled.0.contains_key(ext) { - return Err(EngineError::PluginError(format!( + return Err(EngineError::plugin(format!( "Python extension '{ext}' is already enabled" ))); } let pyext = execute_python_code(ext) - .map_err(|e| EngineError::InvalidOptionValue(Self::OPTION_ENABLED.to_string(), e))?; + .map_err(|e| EngineError::invalid_option(Self::OPTION_ENABLED, e))?; self.enabled.0.insert(ext.clone(), pyext); log::info!("Python extension enabled: {ext}"); @@ -189,7 +189,7 @@ impl PythonExt { } /// Disable a previously enabled Python extension - fn set_disabled(&mut self, disabled: Maybe) -> Result<(), EngineError> { + fn set_disabled(&mut self, disabled: Maybe) -> EngineResult<()> { let ext = match &disabled { Maybe::Nothing => { return Err(EngineError::InvalidOptionValue( @@ -211,10 +211,10 @@ impl PythonExt { Ok(()) } Err(e) => { - let error_msg = - format!("Failed to call deinit method on '{ext_name}': {e}"); - log::error!("{error_msg}"); - Err(EngineError::PluginError(error_msg)) + log::error!("Failed to call deinit method on '{ext_name}': {e}"); + Err(EngineError::plugin(format!( + "Failed to call deinit method on '{ext_name}': {e}" + ))) } }) }) @@ -225,33 +225,46 @@ impl PythonExt { } } +/// Convert a PyO3 result into an [`EngineError`] with a description of the failed +/// step, so the Python boundary can use `.py_context("…")?` instead of an +/// inline `.map_err(|e| EngineError::plugin(format!("…: {e}")))` at every call site. +trait PyContext { + fn py_context(self, ctx: &str) -> EngineResult; + fn py_context_with(self, ctx: impl FnOnce() -> String) -> EngineResult; +} + +impl PyContext for PyResult { + fn py_context(self, ctx: &str) -> EngineResult { + self.map_err(|e| EngineError::plugin(format!("{ctx}: {e}"))) + } + + fn py_context_with(self, ctx: impl FnOnce() -> String) -> EngineResult { + self.map_err(|e| EngineError::plugin(format!("{}: {e}", ctx()))) + } +} + /// Execute Python code and return the resulting object /// The code should return an object with init/deinit methods -pub fn execute_python_code(code: &str) -> Result, String> { +pub fn execute_python_code(code: &str) -> EngineResult> { let code = code.to_string(); run_on_native_thread(move || { Python::attach(|py| { - let pkg = py.import("probing"); - - if pkg.is_err() { - return Err(format!("Python import error: {}", pkg.err().unwrap())); - } + let pkg = py.import("probing").py_context("Python import error")?; let result = pkg - .unwrap() .call_method1("load_extension", (code.as_str(),)) - .map_err(|e| format!("Error loading Python plugin: {e}"))?; + .py_context("Error loading Python plugin")?; if !result .hasattr("init") - .map_err(|e| format!("Unable to check `init` method: {e}"))? + .py_context("Unable to check `init` method")? { - return Err("Plugin must have an `init` method".to_string()); + return Err(EngineError::plugin("Plugin must have an `init` method")); } result .call_method0("init") - .map_err(|e| format!("Error calling `init` method: {e}"))?; + .py_context("Error calling `init` method")?; log::info!("Python extension loaded successfully: {code}"); Ok(result.unbind()) @@ -259,7 +272,7 @@ pub fn execute_python_code(code: &str) -> Result, String> }) } -fn backtrace(tid: Option) -> Result> { +fn backtrace(tid: Option) -> anyhow::Result> { SignalTracer.trace(tid) } @@ -268,47 +281,41 @@ fn call_python_handler( path: &str, params: &HashMap, body: &[u8], -) -> Result, EngineError> { +) -> EngineResult> { let path = path.to_string(); let params = params.clone(); let body = body.to_vec(); run_on_native_thread(move || { Python::attach(|py| { - let router_module = py.import("probing.handlers.router").map_err(|e| { - EngineError::PluginError(format!("Failed to import router module: {e}")) - })?; + let router_module = py + .import("probing.handlers.router") + .py_context("Failed to import router module")?; - let handle_func = router_module.getattr("handle_request").map_err(|e| { - EngineError::PluginError(format!("Failed to get handle_request function: {e}")) - })?; + let handle_func = router_module + .getattr("handle_request") + .py_context("Failed to get handle_request function")?; let params_dict = pyo3::types::PyDict::new(py); for (key, value) in ¶ms { params_dict .set_item(key.as_str(), str_to_py(py, value)) - .map_err(|e| { - EngineError::PluginError(format!("Failed to set param '{key}': {e}")) - })?; + .py_context_with(|| format!("Failed to set param '{key}'"))?; } let body_arg = if body.is_empty() { py.None() } else { let body_str = std::str::from_utf8(&body).map_err(|e| { - EngineError::PluginError(format!("Request body is not valid UTF-8: {e}")) + EngineError::plugin(format!("Request body is not valid UTF-8: {e}")) })?; str_to_py(py, body_str) }; let result = handle_func .call1((str_to_py(py, &path), params_dict, body_arg)) - .map_err(|e| { - EngineError::PluginError(format!("Failed to call handle_request: {e}")) - })?; + .py_context("Failed to call handle_request")?; - let result_str: String = result - .extract() - .map_err(|e| EngineError::PluginError(format!("Failed to extract result: {e}")))?; + let result_str: String = result.extract().py_context("Failed to extract result")?; Ok(result_str.into_bytes()) }) diff --git a/probing/extensions/python/src/extensions/python/exttbls.rs b/probing/extensions/python/src/extensions/python/exttbls.rs index 76905fb1..775a3ef3 100644 --- a/probing/extensions/python/src/extensions/python/exttbls.rs +++ b/probing/extensions/python/src/extensions/python/exttbls.rs @@ -17,6 +17,7 @@ use std::sync::{Arc, Mutex, MutexGuard}; use crate::features::native_bridge::with_detached_native; use once_cell::sync::Lazy; +use probing_core::runtime::{BlockOnFallback, RuntimeError}; use probing_core::sync::lock_mutex; use probing_memtable::discover::ExposedTable; use probing_memtable::docs; @@ -25,11 +26,24 @@ use probing_proto::prelude::Ele; use pyo3::prelude::*; use pyo3::types::{PyDict, PyType}; use pyo3::{pyclass, pymethods, Bound, PyResult, Python}; +use thiserror::Error; use crate::features::convert::{ele_to_python, python_to_ele}; type PyTableRow = (Py, Vec>); +#[derive(Debug, Error)] +enum ExternTableError { + #[error("column count mismatch")] + ColumnMismatch, + #[error("table not initialized")] + NotInitialized, + #[error("push_row failed: schema mismatch or row too large")] + PushFailed, + #[error(transparent)] + Memtable(#[from] probing_memtable::MemtableError), +} + /// SQL schema (and filename prefix) for Python extern tables. pub const EXTERN_TABLE_SCHEMA: &str = "python"; @@ -143,11 +157,15 @@ impl PyExternalTableConfig { #[allow(clippy::wrong_self_convention)] // Python-facing method name, kept for API compat fn into_py(&self, py: Python<'_>) -> Py { let dict = PyDict::new(py); - dict.set_item("chunk_size", self.chunk_size).unwrap(); - dict.set_item("discard_threshold", self.discard_threshold) - .unwrap(); - dict.set_item("discard_strategy", &self.discard_strategy) - .unwrap(); + if let Err(e) = dict.set_item("chunk_size", self.chunk_size) { + log::error!("PyExternalTableConfig::into_py chunk_size: {e}"); + } + if let Err(e) = dict.set_item("discard_threshold", self.discard_threshold) { + log::error!("PyExternalTableConfig::into_py discard_threshold: {e}"); + } + if let Err(e) = dict.set_item("discard_strategy", &self.discard_strategy) { + log::error!("PyExternalTableConfig::into_py discard_strategy: {e}"); + } dict.into() } } @@ -270,7 +288,7 @@ impl ExternBacking { } } - fn ensure_registered(&mut self) -> Result<(), String> { + fn ensure_registered(&mut self) -> Result<(), ExternTableError> { if self.table.is_some() { return Ok(()); } @@ -288,8 +306,7 @@ impl ExternBacking { ); let chunk_bytes = ring_chunk_bytes(self.capacity_bytes); let filename = mmap_basename(&self.name); - let table = ExposedTable::create(&filename, &schema, chunk_bytes, NUM_CHUNKS) - .map_err(|e| format!("failed to register mmap table {filename}: {e}"))?; + let table = ExposedTable::create(&filename, &schema, chunk_bytes, NUM_CHUNKS)?; self.table = Some(table); Ok(()) } @@ -301,7 +318,7 @@ impl ExternBacking { }) } - fn ensure_table(&mut self, first_row: &[Ele]) -> Result<(), String> { + fn ensure_table(&mut self, first_row: &[Ele]) -> Result<(), ExternTableError> { if self.table.is_some() && self.row_count() > 0 { return Ok(()); } @@ -318,16 +335,15 @@ impl ExternBacking { ); let chunk_bytes = ring_chunk_bytes(self.capacity_bytes); let filename = mmap_basename(&self.name); - let table = ExposedTable::create(&filename, &schema, chunk_bytes, NUM_CHUNKS) - .map_err(|e| format!("failed to create mmap table {filename}: {e}"))?; + let table = ExposedTable::create(&filename, &schema, chunk_bytes, NUM_CHUNKS)?; self.dtypes = dtypes; self.table = Some(table); Ok(()) } - fn append(&mut self, timestamp: i64, values: &[Ele]) -> Result<(), String> { + fn append(&mut self, timestamp: i64, values: &[Ele]) -> Result<(), ExternTableError> { if values.len() != self.columns.len() { - return Err("column count mismatch".to_string()); + return Err(ExternTableError::ColumnMismatch); } self.ensure_table(values)?; @@ -344,10 +360,10 @@ impl ExternBacking { // ExposedTable::push_row validates schema and auto-advances chunks. let Some(table) = self.table.as_mut() else { - return Err("table not initialized".to_string()); + return Err(ExternTableError::NotInitialized); }; if !table.push_row(&row) { - return Err("push_row failed: schema mismatch or row too large".to_string()); + return Err(ExternTableError::PushFailed); } Ok(()) } @@ -426,6 +442,21 @@ fn lock_backing(backing: &Mutex) -> MutexGuard<'_, ExternBacking> #[derive(Clone, Debug)] pub struct ExternalTable(Arc>, usize); +impl BlockOnFallback for ExternalTable { + fn on_block_on_failure(err: RuntimeError) -> Self { + log::error!("ExternalTable bridge degraded: {err}; using no-op table"); + let backing = ExternalTable::create_backing( + "__probing_degraded__", + Vec::new(), + 4096, + "BaseMemorySize", + Some("probing degraded placeholder".into()), + HashMap::new(), + ); + ExternalTable(backing, 0) + } +} + impl ExternalTable { fn extract_eles(values: Vec>) -> Vec { Python::attach(|py| { @@ -571,7 +602,7 @@ impl ExternalTable { with_detached_native(move || { lock_backing(backing.as_ref()) .append(now_micros(), &eles) - .map_err(pyo3::exceptions::PyValueError::new_err) + .map_err(|e| pyo3::exceptions::PyValueError::new_err(e.to_string())) }) } @@ -586,7 +617,7 @@ impl ExternalTable { with_detached_native(move || { lock_backing(backing.as_ref()) .append(t, &eles) - .map_err(pyo3::exceptions::PyValueError::new_err) + .map_err(|e| pyo3::exceptions::PyValueError::new_err(e.to_string())) }) } diff --git a/probing/extensions/python/src/extensions/python/tbls.rs b/probing/extensions/python/src/extensions/python/tbls.rs index ab204d97..0b89d212 100644 --- a/probing/extensions/python/src/extensions/python/tbls.rs +++ b/probing/extensions/python/src/extensions/python/tbls.rs @@ -2,8 +2,6 @@ use std::collections::HashMap; use std::ffi::CString; use std::sync::Arc; -use anyhow::Result; - use log::{debug, error}; use probing_core::core::{ ArrayRef, CustomNamespace, DataType, Field, Float64Array, Int64Array, NamespaceProbeDataSource, @@ -20,13 +18,41 @@ use pyo3::types::PyString; use pyo3::Bound; use pyo3::PyAny; use pyo3::Python; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum PythonTableError { + #[error("invalid Python expression: {0}")] + InvalidExpression(String), + #[error("internal error building record batch: missing column {0}")] + MissingColumn(String), + #[error("record batch build failed: {0}")] + BatchBuild(String), + #[error(transparent)] + Py(#[from] pyo3::PyErr), + #[error(transparent)] + Nul(#[from] std::ffi::NulError), +} + +pub type TableResult = std::result::Result; + +impl From> for PythonTableError { + fn from(err: pyo3::CastError<'_, '_>) -> Self { + Self::Py(err.into()) + } +} + +fn try_record_batch(schema: SchemaRef, columns: Vec) -> TableResult { + RecordBatch::try_new(schema, columns).map_err(|e| PythonTableError::BatchBuild(e.to_string())) +} #[derive(Default, Debug)] pub struct PythonNamespace {} impl PythonNamespace { - fn get_backtrace_data() -> Result> { - let frames = crate::extensions::python::backtrace(None)?; + fn get_backtrace_data() -> TableResult> { + let frames = crate::extensions::python::backtrace(None) + .map_err(|e| PythonTableError::BatchBuild(e.to_string()))?; if frames.is_empty() { return Ok(vec![]); @@ -97,10 +123,10 @@ impl PythonNamespace { Arc::new(StringArray::from(frame_types)), // Added frame_type array ]; - Ok(vec![RecordBatch::try_new(schema, columns)?]) + Ok(vec![try_record_batch(schema, columns)?]) } - fn data_from_python(expr: &str) -> Result> { + fn data_from_python(expr: &str) -> TableResult> { Python::attach(|py| { let import_path = expr.split(['(', '[']).next().unwrap_or(expr); @@ -110,20 +136,16 @@ impl PythonNamespace { .collect(); if parts.is_empty() { - return Err(anyhow::anyhow!("Invalid Python expression: {}", expr)); + return Err(PythonTableError::InvalidExpression(expr.to_string())); } // Import the top-level package first. let pkg_name = parts[0]; - let pkg = py - .import(pkg_name) - .map_err(|e| anyhow::anyhow!("Failed to import {}: {:?}", pkg_name, e))?; + let pkg = py.import(pkg_name)?; // Set up locals dict with the imported package let locals = PyDict::new(py); - locals - .set_item(pkg_name, pkg) - .map_err(|e| anyhow::anyhow!("Failed to set up Python locals: {:?}", e))?; + locals.set_item(pkg_name, pkg)?; // Ensure intermediate submodules are imported so attribute access works. for depth in 2..=parts.len() { @@ -132,11 +154,7 @@ impl PythonNamespace { Ok(_) => {} Err(err) => { if depth < parts.len() { - return Err(anyhow::anyhow!( - "Failed to import {}: {:?}", - candidate, - err - )); + return Err(err.into()); } break; } @@ -144,12 +162,9 @@ impl PythonNamespace { } // Evaluate the expression - let expr = CString::new(expr) - .map_err(|e| anyhow::anyhow!("Failed to convert expression to CString: {:?}", e))?; + let expr = CString::new(expr)?; - let result = py - .eval(&expr, None, Some(&locals)) - .map_err(|e| anyhow::anyhow!("Failed to evaluate Python expression: {:?}", e))?; + let result = py.eval(&expr, None, Some(&locals))?; // Handle different Python types if let Ok(list) = result.cast::() { @@ -204,12 +219,12 @@ impl CustomNamespace for PythonNamespace { } impl PythonNamespace { - pub fn object_to_recordbatch(obj: Bound<'_, PyAny>) -> Result> { + pub fn object_to_recordbatch(obj: Bound<'_, PyAny>) -> TableResult> { let mut fields: Vec = vec![]; let mut columns: Vec = vec![]; if obj.is_instance_of::() { - let item = obj.cast::().unwrap(); + let item = obj.cast::()?; for (key, value) in item.iter() { let key_str = key.extract::()?; Self::add_field_and_array(&mut fields, &mut columns, key_str, value)?; @@ -225,7 +240,7 @@ impl PythonNamespace { } let schema = SchemaRef::new(Schema::new(fields)); - let batches = vec![RecordBatch::try_new(schema, columns)?]; + let batches = vec![try_record_batch(schema, columns)?]; Ok(batches) } @@ -236,7 +251,7 @@ impl PythonNamespace { columns: &mut Vec, name: String, value: Bound<'_, PyAny>, - ) -> Result<()> { + ) -> TableResult<()> { if value.is_instance_of::() { let array = Int64Array::from(vec![value.extract::()?]); columns.push(Arc::new(array)); @@ -257,7 +272,7 @@ impl PythonNamespace { Ok(()) } - pub fn dict_to_recordbatch(dict: &Bound<'_, PyDict>) -> Result> { + pub fn dict_to_recordbatch(dict: &Bound<'_, PyDict>) -> TableResult> { let mut fields: Vec = vec![]; let mut columns: Vec = vec![]; @@ -267,12 +282,12 @@ impl PythonNamespace { } let schema = SchemaRef::new(Schema::new(fields)); - let batches = vec![RecordBatch::try_new(schema, columns)?]; + let batches = vec![try_record_batch(schema, columns)?]; Ok(batches) } - pub fn list_to_recordbatch(list: &Bound<'_, PyList>) -> Result> { + pub fn list_to_recordbatch(list: &Bound<'_, PyList>) -> TableResult> { let mut names: Vec = vec![]; let mut datas: HashMap>>> = Default::default(); @@ -282,10 +297,10 @@ impl PythonNamespace { Some(dict.clone()) } else { match item.getattr("__dict__") { - Ok(dict) => Some(dict.cast::().unwrap().clone()), + Ok(dict) => Some(dict.cast::()?.clone()), Err(_) => { let dict = PyDict::new(item.py()); - dict.set_item("value", item).unwrap(); + dict.set_item("value", item)?; Some(dict) } } @@ -321,7 +336,10 @@ impl PythonNamespace { let mut columns: Vec = vec![]; for name in names.iter() { - let values = datas.get(name).unwrap(); + let values = datas.get(name).ok_or_else(|| { + error!("list_to_recordbatch: internal column map missing key {name}"); + PythonTableError::MissingColumn(name.clone()) + })?; let array = StringArray::from( values .iter() @@ -342,7 +360,7 @@ impl PythonNamespace { } let schema = SchemaRef::new(Schema::new(fields)); - let batches = vec![RecordBatch::try_new(schema, columns).unwrap()]; + let batches = vec![try_record_batch(schema, columns)?]; Ok(batches) } diff --git a/probing/extensions/python/src/features/config.rs b/probing/extensions/python/src/features/config.rs index 96eb1ec4..549a5143 100644 --- a/probing/extensions/python/src/features/config.rs +++ b/probing/extensions/python/src/features/config.rs @@ -6,6 +6,7 @@ use probing_core::runtime::block_on; use crate::features::convert::{ele_to_python, python_to_ele}; use crate::features::native_bridge::with_detached_native; +use crate::features::py_result::runtime_err; /// Get a configuration value. /// @@ -14,12 +15,10 @@ use crate::features::native_bridge::with_detached_native; #[pyfunction(name = "config_get")] fn get(_py: Python, key: String) -> PyResult>> { with_detached_native(move || { - Python::attach(|py| { - let ele = block_on(async move { config::get(&key).await }); - match ele { - Some(val) => Ok(Some(ele_to_python(py, &val)?)), - None => Ok(None), - } + let ele = block_on(async move { config::get(&key).await }).map_err(runtime_err)?; + Python::attach(|py| match ele { + Some(val) => Ok(Some(ele_to_python(py, &val)?)), + None => Ok(None), }) }) } @@ -28,11 +27,9 @@ fn get(_py: Python, key: String) -> PyResult>> { #[pyfunction(name = "config_write")] fn write(_py: Python, key: String, value: String) -> PyResult<()> { with_detached_native(move || { - block_on(async move { - config::write(&key, &value) - .await - .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string())) - }) + block_on(async move { config::write(&key, &value).await }) + .map_err(runtime_err)? + .map_err(runtime_err) }) } @@ -43,11 +40,8 @@ fn write(_py: Python, key: String, value: String) -> PyResult<()> { fn set(_py: Python, key: String, value: Bound<'_, PyAny>) -> PyResult<()> { let value = value.unbind(); with_detached_native(move || { - Python::attach(|py| { - let ele = python_to_ele(value.bind(py))?; - block_on(async move { config::set(&key, ele).await }); - Ok(()) - }) + let ele = Python::attach(|py| python_to_ele(value.bind(py)))?; + block_on(async move { config::set(&key, ele).await }).map_err(runtime_err) }) } @@ -57,53 +51,53 @@ fn set(_py: Python, key: String, value: Bound<'_, PyAny>) -> PyResult<()> { /// converted to string. #[pyfunction(name = "config_get_str")] fn get_str(_py: Python, key: String) -> PyResult> { - Ok(with_detached_native(move || { - block_on(async move { config::get_str(&key).await }) - })) + with_detached_native(move || { + block_on(async move { config::get_str(&key).await }).map_err(runtime_err) + }) } /// Check if a configuration key exists. #[pyfunction(name = "config_contains_key")] -fn contains_key(_py: Python, key: String) -> bool { - with_detached_native(move || block_on(async move { config::contains_key(&key).await })) +fn contains_key(_py: Python, key: String) -> PyResult { + with_detached_native(move || { + block_on(async move { config::contains_key(&key).await }).map_err(runtime_err) + }) } /// Remove a configuration key and return its value. #[pyfunction(name = "config_remove")] fn remove(_py: Python, key: String) -> PyResult>> { with_detached_native(move || { - Python::attach(|py| { - let ele = block_on(async move { config::remove(&key).await }); - match ele { - Some(val) => Ok(Some(ele_to_python(py, &val)?)), - None => Ok(None), - } + let ele = block_on(async move { config::remove(&key).await }).map_err(runtime_err)?; + Python::attach(|py| match ele { + Some(val) => Ok(Some(ele_to_python(py, &val)?)), + None => Ok(None), }) }) } /// Get all configuration keys. #[pyfunction(name = "config_keys")] -fn keys(_py: Python) -> Vec { - with_detached_native(|| block_on(config::keys())) +fn keys(_py: Python) -> PyResult> { + with_detached_native(|| block_on(config::keys()).map_err(runtime_err)) } /// Clear all configuration. #[pyfunction(name = "config_clear")] -fn clear(_py: Python) { - with_detached_native(|| block_on(config::clear())); +fn clear(_py: Python) -> PyResult<()> { + with_detached_native(|| block_on(config::clear()).map_err(runtime_err)) } /// Get the number of configuration entries. #[pyfunction(name = "config_len")] -fn len(_py: Python) -> usize { - with_detached_native(|| block_on(config::len())) +fn len(_py: Python) -> PyResult { + with_detached_native(|| block_on(config::len()).map_err(runtime_err)) } /// Check if the configuration store is empty. #[pyfunction(name = "config_is_empty")] -fn is_empty(_py: Python) -> bool { - with_detached_native(|| block_on(config::is_empty())) +fn is_empty(_py: Python) -> PyResult { + with_detached_native(|| block_on(config::is_empty()).map_err(runtime_err)) } /// Register the config functions directly to the probing Python module. diff --git a/probing/extensions/python/src/features/convert.rs b/probing/extensions/python/src/features/convert.rs index 5a24b47a..bd3ff16c 100644 --- a/probing/extensions/python/src/features/convert.rs +++ b/probing/extensions/python/src/features/convert.rs @@ -25,12 +25,15 @@ pub fn ele_to_python(py: Python, ele: &Ele) -> PyResult> { // Convert microsecond timestamp to string representation use std::time::{Duration, UNIX_EPOCH}; let datetime = UNIX_EPOCH + Duration::from_micros(*t); - let s = datetime + let secs = datetime .duration_since(UNIX_EPOCH) - .unwrap() + .unwrap_or_else(|e| { + log::error!("DataTime before UNIX epoch ({t} µs): {e}; using 0"); + Duration::ZERO + }) .as_secs() .to_string(); - PyString::new(py, &s).to_owned().unbind().into() + PyString::new(py, &secs).to_owned().unbind().into() } }; Ok(obj) diff --git a/probing/extensions/python/src/features/mod.rs b/probing/extensions/python/src/features/mod.rs index 1f33b1ab..6d6db424 100644 --- a/probing/extensions/python/src/features/mod.rs +++ b/probing/extensions/python/src/features/mod.rs @@ -5,6 +5,7 @@ pub mod crash; pub mod flamegraph; pub mod native_bridge; pub mod pprof; +pub mod py_result; pub mod python_api; pub mod spy; /// Native stack capture, Python/native merge, and signal handling (`SIGUSR2`). diff --git a/probing/extensions/python/src/features/native_bridge.rs b/probing/extensions/python/src/features/native_bridge.rs index 65ea3444..b3c9cbfe 100644 --- a/probing/extensions/python/src/features/native_bridge.rs +++ b/probing/extensions/python/src/features/native_bridge.rs @@ -3,6 +3,8 @@ use pyo3::prelude::*; use probing_core::run_on_native_thread; /// Run Rust/Python bridge work off the Python main thread and Tokio workers. -pub fn with_detached_native(f: impl FnOnce() -> R + Send + 'static) -> R { +pub fn with_detached_native( + f: impl FnOnce() -> R + Send + 'static, +) -> R { Python::attach(|py| py.detach(|| run_on_native_thread(f))) } diff --git a/probing/extensions/python/src/features/pprof.rs b/probing/extensions/python/src/features/pprof.rs index be10fbc3..0f5c9c3a 100644 --- a/probing/extensions/python/src/features/pprof.rs +++ b/probing/extensions/python/src/features/pprof.rs @@ -32,7 +32,7 @@ use std::sync::{Mutex, RwLock}; use std::thread; use std::time::Duration; -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, Context, Result}; use core::ffi::{c_int, c_void}; use nix::libc; use once_cell::sync::Lazy; @@ -884,7 +884,7 @@ pub fn setup(freq: u64) -> Result<()> { thread::Builder::new() .name("probing-sampler".into()) .spawn(move || consumer_loop(my_gen)) - .map_err(|e| anyhow!("failed to spawn sampler consumer thread: {e}"))?; + .context("failed to spawn sampler consumer thread")?; arm_timer(freq); log::info!("probing: SIGPROF CPU sampler started ({freq} Hz, Python+native)"); diff --git a/probing/extensions/python/src/features/py_result.rs b/probing/extensions/python/src/features/py_result.rs new file mode 100644 index 00000000..febce592 --- /dev/null +++ b/probing/extensions/python/src/features/py_result.rs @@ -0,0 +1,7 @@ +use pyo3::exceptions::PyRuntimeError; +use pyo3::PyErr; + +/// Map a displayable error into `PyRuntimeError` (Python API boundary). +pub fn runtime_err(err: impl std::fmt::Display) -> PyErr { + PyRuntimeError::new_err(err.to_string()) +} diff --git a/probing/extensions/python/src/features/python_api.rs b/probing/extensions/python/src/features/python_api.rs index dd749171..f51911f2 100644 --- a/probing/extensions/python/src/features/python_api.rs +++ b/probing/extensions/python/src/features/python_api.rs @@ -5,6 +5,7 @@ use probing_core::runtime::block_on; use probing_core::ENGINE; use crate::features::native_bridge::with_detached_native; +use crate::features::py_result::runtime_err; use crate::features::stack_tracer::{SignalTracer, StackTracer}; use crate::repl::PythonRepl; @@ -22,10 +23,10 @@ pub fn is_enabled() -> bool { pub fn query_json(_py: Python, sql: String) -> PyResult { with_detached_native(move || { let df = block_on(async move { ENGINE.read().await.async_query(sql.as_str()).await }) - .map_err(|e| PyErr::new::(e.to_string()))? + .map_err(runtime_err)? + .map_err(runtime_err)? .unwrap_or_default(); - serde_json::to_string(&df) - .map_err(|e| PyErr::new::(e.to_string())) + serde_json::to_string(&df).map_err(runtime_err) }) } @@ -34,11 +35,8 @@ pub fn query_json(_py: Python, sql: String) -> PyResult { #[pyo3(signature = (tid=None))] pub fn api_callstack(tid: Option) -> PyResult { let tid = tid.filter(|&t| t != 0); - let frames = SignalTracer - .trace(tid) - .map_err(|e| PyErr::new::(e.to_string()))?; - serde_json::to_string(&frames) - .map_err(|e| PyErr::new::(e.to_string())) + let frames = SignalTracer.trace(tid).map_err(runtime_err)?; + serde_json::to_string(&frames).map_err(runtime_err) } /// HTTP `POST /apis/pythonext/eval` backend. diff --git a/probing/extensions/python/src/features/stack_tracer.rs b/probing/extensions/python/src/features/stack_tracer.rs index c67ffe00..e0001ed7 100644 --- a/probing/extensions/python/src/features/stack_tracer.rs +++ b/probing/extensions/python/src/features/stack_tracer.rs @@ -14,6 +14,8 @@ use pyo3::Python; use probing_proto::prelude::CallFrame; use probing_core::is_python_main_thread; +#[cfg(target_os = "macos")] +use probing_core::signal::send_sigusr2_to_thread_id; use crate::features::vm_tracer::{get_python_frames_raw, get_python_stacks_raw}; @@ -222,7 +224,7 @@ impl SignalTracer { Ok(()) } } else { - probing_cc::extensions::send_sigusr2_to_thread_id(tid) + send_sigusr2_to_thread_id(tid) }; if let Err(e) = signal_result { Self::clear_sender_slot(); diff --git a/probing/extensions/python/src/features/torch.rs b/probing/extensions/python/src/features/torch.rs index 65bcf986..d6695b93 100644 --- a/probing/extensions/python/src/features/torch.rs +++ b/probing/extensions/python/src/features/torch.rs @@ -1,6 +1,6 @@ use std::{collections::BTreeMap, collections::HashMap, thread}; -use anyhow::Result; +use anyhow::{Context, Result}; use log::{error, warn}; use serde_json::json; @@ -261,9 +261,10 @@ fn query_profiling_impl(query: &str) -> Result let result = engine .async_query(&query) .await - .map_err(|e| anyhow::anyhow!("Torch query failed: {e}"))?; + .context("Torch query failed")?; Ok(result.unwrap_or_default()) }) + .map_err(anyhow::Error::new)? } fn run_torch_query(query: &str) -> Result { @@ -278,7 +279,7 @@ fn run_torch_query(query: &str) -> Result { let engine = tokio::runtime::Builder::new_current_thread() .enable_all() .build() - .map_err(|e| anyhow::anyhow!("failed to build tokio runtime: {e}"))? + .context("failed to build tokio runtime")? .block_on(async { probing_core::create_engine() .with_data_source(PythonProbeDataSource::create("python")) @@ -288,7 +289,7 @@ fn run_torch_query(query: &str) -> Result { let rt = tokio::runtime::Builder::new_current_thread() .enable_all() .build() - .map_err(|e| anyhow::anyhow!("failed to build tokio runtime: {e}"))?; + .context("failed to build tokio runtime")?; Ok(rt .block_on(async { engine.async_query(&query).await })? .unwrap_or_default()) diff --git a/probing/extensions/python/src/features/tracing.rs b/probing/extensions/python/src/features/tracing.rs index d1e7881a..f27556a5 100644 --- a/probing/extensions/python/src/features/tracing.rs +++ b/probing/extensions/python/src/features/tracing.rs @@ -382,7 +382,7 @@ impl Span { _exc_val: Option<&Bound<'_, PyAny>>, _exc_tb: Option<&Bound<'_, PyAny>>, ) -> PyResult { - if exc_type.is_some() && !exc_type.unwrap().is_none() { + if exc_type.is_some_and(|t| !t.is_none()) { capture_span_snapshot_for_crash(); } let self_id = slf.span_id(); diff --git a/probing/extensions/python/src/python.rs b/probing/extensions/python/src/python.rs index 4fc233d8..eab77434 100644 --- a/probing/extensions/python/src/python.rs +++ b/probing/extensions/python/src/python.rs @@ -1,6 +1,7 @@ use std::ffi::CString; use std::sync::atomic::{AtomicBool, Ordering}; +use anyhow::Context; use pyo3::prelude::*; use pyo3::{types::PyDict, Bound, Python}; @@ -108,7 +109,7 @@ pub fn enable_monitoring(filename: &str) -> anyhow::Result<()> { ) })?; run_embedded(py, &code, None, None) - .map_err(|err| anyhow::anyhow!("error apply monitoring {filename}: {err}"))?; + .with_context(|| format!("error apply monitoring {filename}"))?; Ok(()) }) } diff --git a/probing/extensions/python/src/repl/python_repl.rs b/probing/extensions/python/src/repl/python_repl.rs index ff8a321e..f382c908 100644 --- a/probing/extensions/python/src/repl/python_repl.rs +++ b/probing/extensions/python/src/repl/python_repl.rs @@ -29,7 +29,14 @@ impl Default for PythonRepl { impl PythonRepl { pub fn process(&mut self, cmd: &str) -> Option { - self.console.lock().unwrap().try_execute(cmd.to_string()) + let mut guard = match self.console.lock() { + Ok(guard) => guard, + Err(poison) => { + log::warn!("python repl console mutex poisoned; recovering"); + poison.into_inner() + } + }; + guard.try_execute(cmd.to_string()) } } diff --git a/probing/memtable/Cargo.toml b/probing/memtable/Cargo.toml index d8f874cc..e3a95c6b 100644 --- a/probing/memtable/Cargo.toml +++ b/probing/memtable/Cargo.toml @@ -9,6 +9,7 @@ description = "Self-describing columnar memory table with ring buffer" [dependencies] log = "0.4" +thiserror = { workspace = true } xxhash-rust = { version = "0.8", features = ["xxh3"] } memmap2 = "0.9" libc = "0.2" diff --git a/probing/memtable/src/discover.rs b/probing/memtable/src/discover.rs index 897e9cd5..f07602ca 100644 --- a/probing/memtable/src/discover.rs +++ b/probing/memtable/src/discover.rs @@ -20,23 +20,26 @@ //! use probing_memtable::discover::{ExposedTable, discover}; //! use probing_memtable::{Schema, DType, Value}; //! -//! // Writer: expose a table as an mmap'd file -//! let schema = Schema::new().col("ts", DType::I64).col("cpu", DType::F64); -//! let mut table = ExposedTable::create("metrics", &schema, 4096, 8).unwrap(); -//! { -//! let mut w = table.writer(); -//! w.push_row(&[Value::I64(1000), Value::F64(0.85)]); -//! } +//! fn main() -> Result<(), Box> { +//! // Writer: expose a table as an mmap'd file +//! let schema = Schema::new().col("ts", DType::I64).col("cpu", DType::F64); +//! let mut table = ExposedTable::create("metrics", &schema, 4096, 8)?; +//! { +//! let mut w = table.writer()?; +//! w.push_row(&[Value::I64(1000), Value::F64(0.85)]); +//! } //! -//! // Reader (same or different process): discover and read -//! for t in discover().unwrap() { -//! if t.is_alive() { -//! let view = t.view().unwrap(); -//! for row in view.rows(view.write_chunk()) { -//! let mut c = row.cursor(); -//! println!("{} {}", c.next_i64(), c.next_f64()); +//! // Reader (same or different process): discover and read +//! for t in discover()? { +//! if t.is_alive() { +//! let view = t.view()?; +//! for row in view.rows(view.write_chunk()) { +//! let mut c = row.cursor(); +//! println!("{} {}", c.next_i64(), c.next_f64()); +//! } //! } //! } +//! Ok(()) //! } //! ``` @@ -117,7 +120,7 @@ impl ExposedTable { schema: &Schema, chunk_size: u32, num_chunks: u32, - ) -> io::Result { + ) -> crate::error::Result { Self::create_in(&default_dir(), name, schema, chunk_size, num_chunks) } @@ -130,7 +133,7 @@ impl ExposedTable { schema: &Schema, chunk_size: u32, num_chunks: u32, - ) -> io::Result { + ) -> crate::error::Result { let inner = MemTable::shared_in(base_dir, name, schema, chunk_size, num_chunks)?; crate::docs::register_from_name(name, schema); Ok(Self { inner }) @@ -144,17 +147,34 @@ impl ExposedTable { self.inner.as_bytes_mut() } - /// File path of this table. - pub fn path(&self) -> &Path { - self.inner.path().expect("ExposedTable is always shared") + /// File path of this table, when backed by a mmap file. + /// + /// Returns [`None`] if the inner table is not file-backed (should not happen + /// for tables created via [`Self::create`] / [`Self::create_in`]). + pub fn path(&self) -> Option<&Path> { + self.inner.path() + } + + /// File path of this table, logging when the backing is not a file. + pub fn try_path(&self) -> Result<&Path, crate::error::MemtableError> { + self.inner + .path() + .ok_or(crate::error::MemtableError::NotFileBacked) + .inspect_err(|e| { + log::error!("ExposedTable::path: {e}"); + }) } /// Create a [`MemTableWriter`] backed by the mmap'd region. /// /// **Note**: this re-validates the entire buffer on every call. /// Prefer [`push_row`](Self::push_row) for hot-path writes. - pub fn writer(&mut self) -> MemTableWriter<'_> { - MemTableWriter::new(self.inner.as_bytes_mut()).expect("mmap buffer validated at creation") + pub fn writer(&mut self) -> Result, crate::error::MemtableError> { + MemTableWriter::new(self.inner.as_bytes_mut()).inspect_err(|e| { + log::error!( + "ExposedTable::writer: mmap buffer invalid ({e}); table writes unavailable" + ); + }) } /// Append a row without re-validating the buffer. @@ -190,7 +210,7 @@ impl ExposedHashTable { num_buckets: u32, arena_cap: usize, hash_seed: u64, - ) -> io::Result { + ) -> crate::error::Result { Self::create_in(&default_dir(), name, num_buckets, arena_cap, hash_seed) } @@ -201,7 +221,7 @@ impl ExposedHashTable { num_buckets: u32, arena_cap: usize, hash_seed: u64, - ) -> io::Result { + ) -> crate::error::Result { let dir = base_dir.join(std::process::id().to_string()); fs::create_dir_all(&dir)?; @@ -217,8 +237,7 @@ impl ExposedHashTable { file.set_len(size as u64)?; let mut mmap = unsafe { MmapMut::map_mut(&file)? }; - memh_init_buf(&mut mmap, num_buckets, arena_cap, hash_seed) - .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, format!("{e}")))?; + memh_init_buf(&mut mmap, num_buckets, arena_cap, hash_seed)?; Ok(Self { mmap, path, dir }) } @@ -235,12 +254,20 @@ impl ExposedHashTable { &self.path } - pub fn writer(&mut self) -> MemhWriter<'_> { - MemhWriter::new(&mut self.mmap).expect("mmap buffer validated at creation") + pub fn writer(&mut self) -> Result, crate::error::MemtableError> { + MemhWriter::new(&mut self.mmap) + .inspect_err(|e| { + log::error!("ExposedHashTable::writer: buffer invalid ({e}); writes unavailable"); + }) + .map_err(Into::into) } - pub fn view(&self) -> MemhView<'_> { - MemhView::new(&self.mmap).expect("mmap buffer validated at creation") + pub fn view(&self) -> Result, crate::error::MemtableError> { + MemhView::new(&self.mmap) + .inspect_err(|e| { + log::error!("ExposedHashTable::view: buffer invalid ({e}); reads unavailable"); + }) + .map_err(Into::into) } } @@ -315,7 +342,7 @@ impl DiscoveredTable { } /// Wrap the mmap'd region as a [`MemTableView`]. - pub fn view(&self) -> Result, &'static str> { + pub fn view(&self) -> Result, crate::error::MemtableError> { MemTableView::new(&self.mmap) } @@ -520,10 +547,10 @@ mod tests { { let mut table = ExposedTable::create_in(&dir, "metrics", &schema, 4096, 4).unwrap(); - assert!(table.path().exists()); + assert!(table.path().is_some_and(|p| p.exists())); { - let mut w = table.writer(); + let mut w = table.writer().expect("valid mmap table"); w.push_row(&[Value::I64(1000), Value::F64(3.14)]); w.push_row(&[Value::I64(2000), Value::F64(2.72)]); } @@ -545,7 +572,7 @@ mod tests { let mut table = ExposedTable::create_in(&dir, "test_table", &schema, 1024, 2).unwrap(); { - let mut w = table.writer(); + let mut w = table.writer().expect("valid mmap table"); w.push_row(&[Value::I32(42)]); } @@ -620,7 +647,7 @@ mod tests { let path; { let table = ExposedTable::create_in(&dir, "ephemeral", &schema, 256, 1).unwrap(); - path = table.path().to_owned(); + path = table.path().expect("file-backed ExposedTable").to_owned(); assert!(path.exists()); } assert!(!path.exists()); diff --git a/probing/memtable/src/docs.rs b/probing/memtable/src/docs.rs index ffb30f62..0abbd221 100644 --- a/probing/memtable/src/docs.rs +++ b/probing/memtable/src/docs.rs @@ -64,7 +64,7 @@ pub fn register_qualified(table_schema: &str, table_name: &str, schema: &Schema) } } - let mut reg = registry().lock().expect("table doc registry lock"); + let mut reg = crate::sync::lock_mutex(registry(), "table doc registry"); reg.insert(key, entry); } @@ -79,7 +79,7 @@ pub fn register_from_name(name: &str, schema: &Schema) { /// Snapshot all registered docs (sorted by qualified name). pub fn snapshot() -> Vec { - let reg = registry().lock().expect("table doc registry lock"); + let reg = crate::sync::lock_mutex(registry(), "table doc registry"); let mut rows: Vec = reg.values().cloned().collect(); rows.sort_by(|a, b| (&a.table_schema, &a.table_name).cmp(&(&b.table_schema, &b.table_name))); rows @@ -88,7 +88,7 @@ pub fn snapshot() -> Vec { /// Column names registered for `schema.table` (sorted, deduplicated). pub fn registered_column_names(table_schema: &str, table_name: &str) -> Vec { let key = qualified_key(table_schema, table_name); - let reg = registry().lock().expect("table doc registry lock"); + let reg = crate::sync::lock_mutex(registry(), "table doc registry"); let Some(entry) = reg.get(&key) else { return Vec::new(); }; @@ -106,7 +106,7 @@ pub fn register_column_docs( columns: &[(String, String)], ) { let key = qualified_key(table_schema, table_name); - let mut reg = registry().lock().expect("table doc registry lock"); + let mut reg = crate::sync::lock_mutex(registry(), "table doc registry"); let entry = reg.entry(key).or_insert_with(|| TableDocs { table_schema: table_schema.to_string(), table_name: table_name.to_string(), diff --git a/probing/memtable/src/error.rs b/probing/memtable/src/error.rs new file mode 100644 index 00000000..0b1d763a --- /dev/null +++ b/probing/memtable/src/error.rs @@ -0,0 +1,30 @@ +//! Unified errors for the memtable crate (L1 — no dependency on probing-core). + +use thiserror::Error; + +/// Errors from mmap tables, ring buffers, and hash-table operations. +#[derive(Debug, Error)] +pub enum MemtableError { + #[error(transparent)] + Io(#[from] std::io::Error), + + #[error("invalid memtable buffer: {0}")] + InvalidBuffer(&'static str), + + #[error("table is not file-backed")] + NotFileBacked, + + #[error(transparent)] + Memh(#[from] crate::memh::MemhValidateError), + + #[error(transparent)] + MemhInit(#[from] crate::memh::MemhInitError), +} + +pub type Result = std::result::Result; + +impl From for std::io::Error { + fn from(e: MemtableError) -> Self { + std::io::Error::new(std::io::ErrorKind::InvalidData, e) + } +} diff --git a/probing/memtable/src/lib.rs b/probing/memtable/src/lib.rs index 72580083..8a03ed59 100644 --- a/probing/memtable/src/lib.rs +++ b/probing/memtable/src/lib.rs @@ -101,6 +101,7 @@ mod cache; mod dedup; pub mod discover; pub mod docs; +pub mod error; mod layout; pub mod memc; pub mod memh; @@ -109,10 +110,12 @@ mod raw; mod refcount; mod row; mod schema; +mod sync; mod writer; pub use cache::{CachedCursor, CachedReader}; pub use docs::infer_extern_column_dtype; +pub use error::{MemtableError, Result as MemtableResult}; pub use layout::MAGIC_MEMT; pub use memh::{ init_buf as init_memh_buf, validate_memh, InsertError, InsertResult, MemhInitError, @@ -150,7 +153,7 @@ pub fn detect_table(buf: &[u8]) -> Option { if buf.len() < 4 { return None; } - let magic = u32::from_le_bytes(buf[..4].try_into().unwrap()); + let magic = u32::from_le_bytes([buf[0], buf[1], buf[2], buf[3]]); match magic { MAGIC_MEMT => Some(TableKind::Ring), MAGIC_MEMH => Some(TableKind::Hash), diff --git a/probing/memtable/src/memh/table.rs b/probing/memtable/src/memh/table.rs index 3fe826c2..5bc3479e 100644 --- a/probing/memtable/src/memh/table.rs +++ b/probing/memtable/src/memh/table.rs @@ -6,6 +6,7 @@ use std::sync::atomic::Ordering; use crate::schema::Value; +use crate::sync::lock_mutex; use super::codec::{ encode_inline_bytes, encode_put_inline_record, encode_put_record, encode_tombstone_record, @@ -29,6 +30,8 @@ pub enum MemhInitError { ArenaTooSmall, } +impl std::error::Error for MemhInitError {} + impl std::fmt::Display for MemhInitError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { @@ -65,6 +68,8 @@ impl std::fmt::Display for MemhValidateError { } } +impl std::error::Error for MemhValidateError {} + #[derive(Debug, PartialEq, Eq)] pub enum InsertResult { Inserted, @@ -710,32 +715,38 @@ impl SharedMemhWriter { }) } + fn lock_buf(&self) -> std::sync::MutexGuard<'_, Vec> { + lock_mutex(&self.buf, "SharedMemhWriter") + } + /// Insert or update `key` → `val`. Acquires the internal mutex for the /// duration of the operation. pub fn insert(&self, key: &str, val: &Value<'_>) -> Result { - let mut guard = self.buf.lock().expect("SharedMemhWriter mutex poisoned"); + let mut guard = self.lock_buf(); // SAFETY: buffer was validated in new(); Mutex provides exclusive access. unsafe { MemhWriter::new_unchecked(&mut guard) }.insert(key, val) } /// Remove `key`. Acquires the internal mutex. pub fn remove(&self, key: &str) -> bool { - let mut guard = self.buf.lock().expect("SharedMemhWriter mutex poisoned"); + let mut guard = self.lock_buf(); unsafe { MemhWriter::new_unchecked(&mut guard) }.remove(key) } /// Snapshot-read: calls `f` with a [`MemhView`] built from the locked buffer. /// /// Holds the mutex for the duration of `f`; keep the closure short. - pub fn with_view(&self, f: impl FnOnce(&MemhView<'_>) -> R) -> R { - let guard = self.buf.lock().expect("SharedMemhWriter mutex poisoned"); - let view = MemhView::new(&guard).expect("SharedMemhWriter: corrupt buffer"); - f(&view) + pub fn with_view(&self, f: impl FnOnce(&MemhView<'_>) -> R) -> Result { + let guard = self.lock_buf(); + let view = MemhView::new(&guard).inspect_err(|e| { + log::error!("SharedMemhWriter: corrupt buffer: {e}"); + })?; + Ok(f(&view)) } /// Access the raw buffer under the mutex. pub fn with_buf(&self, f: impl FnOnce(&[u8]) -> R) -> R { - let guard = self.buf.lock().expect("SharedMemhWriter mutex poisoned"); + let guard = self.lock_buf(); f(&guard) } } @@ -988,7 +999,8 @@ mod tests { sw.with_view(|v| { assert_eq!(v.get("k1"), Some(TypedValue::U64(1))); assert_eq!(v.get("k2"), Some(TypedValue::I32(-5))); - }); + }) + .unwrap(); } #[test] @@ -1027,7 +1039,8 @@ mod tests { assert_eq!(v.get(&key), Some(expected), "missing {key}"); } } - }); + }) + .unwrap(); } #[test] @@ -1078,6 +1091,7 @@ mod tests { "key shared{k} missing" ); } - }); + }) + .unwrap(); } } diff --git a/probing/memtable/src/memtable.rs b/probing/memtable/src/memtable.rs index a5393645..81f98f4f 100644 --- a/probing/memtable/src/memtable.rs +++ b/probing/memtable/src/memtable.rs @@ -353,6 +353,13 @@ fn shm_name_cstring(name: &str) -> io::Result { .map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "shm name contains NUL")) } +fn cstring_to_shm_name(cname: std::ffi::CString) -> io::Result { + cname.into_string().map_err(|e| { + log::error!("shm name is not valid UTF-8: {e:?}"); + io::Error::new(io::ErrorKind::InvalidInput, "shm name is not valid UTF-8") + }) +} + /// `shm_open` wrapper returning an owned [`std::fs::File`]. fn shm_open_file(name: &std::ffi::CString, oflag: libc::c_int) -> io::Result { use std::os::fd::FromRawFd; @@ -398,7 +405,7 @@ impl MemTable { } /// Adopt an existing heap buffer (validates the MEMT layout). - pub fn from_buf(buf: Vec) -> Result { + pub fn from_buf(buf: Vec) -> Result { validate_buf(&buf)?; Ok(Self { backing: Backing::Heap(buf), @@ -429,7 +436,7 @@ impl MemTable { Ok(Self { backing: Backing::Shm { mmap, - name: cname.into_string().expect("validated utf-8"), + name: cstring_to_shm_name(cname)?, unlink_on_drop: true, }, }) @@ -444,12 +451,12 @@ impl MemTable { let file = shm_open_file(&cname, libc::O_RDWR)?; let mmap = unsafe { MmapMut::map_mut(&file)? }; - validate_buf(&mmap).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; + validate_buf(&mmap)?; Ok(Self { backing: Backing::Shm { mmap, - name: cname.into_string().expect("validated utf-8"), + name: cstring_to_shm_name(cname)?, unlink_on_drop: false, }, }) @@ -502,7 +509,7 @@ impl MemTable { let file = OpenOptions::new().read(true).write(true).open(&path)?; let mmap = unsafe { MmapMut::map_mut(&file)? }; - validate_buf(&mmap).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; + validate_buf(&mmap)?; Ok(Self { backing: Backing::File { @@ -529,7 +536,7 @@ impl MemTable { schema: &Schema, chunk_size: u32, num_chunks: u32, - ) -> io::Result { + ) -> crate::error::Result { Self::shared_in( &crate::discover::default_dir(), name, @@ -547,7 +554,7 @@ impl MemTable { schema: &Schema, chunk_size: u32, num_chunks: u32, - ) -> io::Result { + ) -> crate::error::Result { let dir = base_dir.join(std::process::id().to_string()); std::fs::create_dir_all(&dir)?; @@ -708,7 +715,7 @@ pub struct MemTableView<'a> { } impl<'a> MemTableView<'a> { - pub fn new(buf: &'a [u8]) -> Result { + pub fn new(buf: &'a [u8]) -> Result { validate_buf(buf)?; Ok(Self { buf }) } @@ -752,7 +759,7 @@ pub struct MemTableWriter<'a> { } impl<'a> MemTableWriter<'a> { - pub fn new(buf: &'a mut [u8]) -> Result { + pub fn new(buf: &'a mut [u8]) -> Result { validate_buf(buf)?; Ok(Self { buf, dedup: None }) } diff --git a/probing/memtable/src/raw.rs b/probing/memtable/src/raw.rs index 051f67be..1e662b8b 100644 --- a/probing/memtable/src/raw.rs +++ b/probing/memtable/src/raw.rs @@ -1,3 +1,4 @@ +use crate::error::{MemtableError, Result}; use crate::layout::{ chunk_header, col_desc, col_desc_mut, compute_data_offset, header, header_mut, r32, w32, ChunkHeader, ChunkState, Header, BYTE_ORDER_MARK, CHUNK_HEADER_SIZE, FLAGS_KNOWN, FLAG_DEDUP, @@ -163,13 +164,15 @@ fn validate_chunk_rows( used: usize, nc: usize, has_dedup: bool, -) -> Result<(), &'static str> { +) -> Result<()> { let data_base = cs + CHUNK_HEADER_SIZE; let mut pos = 0usize; while pos + 4 <= used { let row_len = r32(buf, data_base + pos) as usize; if pos + 4 + row_len > used { - return Err("row extends beyond chunk used region"); + return Err(MemtableError::InvalidBuffer( + "row extends beyond chunk used region", + )); } let row_start = data_base + pos + 4; let mut col_off = 0usize; @@ -190,11 +193,13 @@ fn validate_chunk_rows( ); if raw < 0 { if !has_dedup { - return Err("dedup ref in non-dedup table"); + return Err(MemtableError::InvalidBuffer("dedup ref in non-dedup table")); } let ref_off = (-raw) as usize; if ref_off < CHUNK_HEADER_SIZE || ref_off >= CHUNK_HEADER_SIZE + used { - return Err("dedup ref outside chunk data region"); + return Err(MemtableError::InvalidBuffer( + "dedup ref outside chunk data region", + )); } col_off += 4; } else { @@ -214,57 +219,61 @@ fn validate_chunk_rows( /// integrity, and dedup ref ranges. /// /// All `from_buf` / `new` constructors funnel through this function. -pub fn validate_buf(buf: &[u8]) -> Result<(), &'static str> { +pub fn validate_buf(buf: &[u8]) -> Result<()> { if buf.len() < mem::size_of::
() { - return Err("buffer too small for header"); + return Err(MemtableError::InvalidBuffer("buffer too small for header")); } let h = header(buf); if h.magic != MAGIC { - return Err("invalid magic"); + return Err(MemtableError::InvalidBuffer("invalid magic")); } if h.version != VERSION { - return Err("unsupported version"); + return Err(MemtableError::InvalidBuffer("unsupported version")); } if (h.header_size as usize) < mem::size_of::
() { - return Err("header_size too small"); + return Err(MemtableError::InvalidBuffer("header_size too small")); } let bom = u16::from_ne_bytes(BYTE_ORDER_MARK); if h.byte_order != bom { - return Err("byte order mismatch (buffer written on different-endian host)"); + return Err(MemtableError::InvalidBuffer( + "byte order mismatch (buffer written on different-endian host)", + )); } if h.flags & !FLAGS_KNOWN != 0 { - return Err("unknown feature flags set"); + return Err(MemtableError::InvalidBuffer("unknown feature flags set")); } let has_dedup = h.flags & FLAG_DEDUP != 0; let nc = h.num_cols as usize; if h.num_chunks == 0 { - return Err("num_chunks must be > 0"); + return Err(MemtableError::InvalidBuffer("num_chunks must be > 0")); } let csz = h.chunk_size as usize; if csz < CHUNK_HEADER_SIZE + 8 { - return Err("chunk_size too small"); + return Err(MemtableError::InvalidBuffer("chunk_size too small")); } let expected_off = compute_data_offset(nc); if h.data_offset as usize != expected_off { - return Err("invalid data_offset"); + return Err(MemtableError::InvalidBuffer("invalid data_offset")); } let required = expected_off + csz * h.num_chunks as usize; if buf.len() < required { - return Err("buffer too small for data"); + return Err(MemtableError::InvalidBuffer("buffer too small for data")); } for i in 0..nc { let dt = col_desc(buf, i).dtype; if !(1..=9).contains(&dt) { - return Err("invalid column dtype"); + return Err(MemtableError::InvalidBuffer("invalid column dtype")); } } let ts_col = h.ts_col as usize; if ts_col != 0 { if ts_col > nc { - return Err("ts_col out of range"); + return Err(MemtableError::InvalidBuffer("ts_col out of range")); } if DType::from_u32(col_desc(buf, ts_col - 1).dtype) != Some(DType::I64) { - return Err("ts_col must reference an I64 column"); + return Err(MemtableError::InvalidBuffer( + "ts_col must reference an I64 column", + )); } } let payload_cap = csz - CHUNK_HEADER_SIZE; @@ -273,11 +282,13 @@ pub fn validate_buf(buf: &[u8]) -> Result<(), &'static str> { let ch = chunk_header(buf, cs); let state = ch.state.load(Ordering::Acquire); if state > 2 { - return Err("invalid chunk state"); + return Err(MemtableError::InvalidBuffer("invalid chunk state")); } let used = ch.used.load(Ordering::Acquire) as usize; if used > payload_cap { - return Err("chunk used exceeds payload capacity"); + return Err(MemtableError::InvalidBuffer( + "chunk used exceeds payload capacity", + )); } if state == ChunkState::Sealed as u32 && used > 0 { let gen_before = ch.generation.load(Ordering::Acquire); diff --git a/probing/memtable/src/sync.rs b/probing/memtable/src/sync.rs new file mode 100644 index 00000000..50e2b9dc --- /dev/null +++ b/probing/memtable/src/sync.rs @@ -0,0 +1,11 @@ +use std::sync::{Mutex, MutexGuard}; + +pub(crate) fn lock_mutex<'a, T>(m: &'a Mutex, label: &str) -> MutexGuard<'a, T> { + match m.lock() { + Ok(guard) => guard, + Err(poison) => { + log::warn!("{label} mutex poisoned; recovering"); + poison.into_inner() + } + } +} diff --git a/probing/server/Cargo.toml b/probing/server/Cargo.toml index 8572fbdb..ab61bf06 100644 --- a/probing/server/Cargo.toml +++ b/probing/server/Cargo.toml @@ -31,7 +31,7 @@ nix = { workspace = true } once_cell = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -tokio = { workspace = true } +tokio = { workspace = true, features = ["fs"] } async-trait = "0.1.83" bytes = "1" diff --git a/probing/server/src/cluster_report_backoff.rs b/probing/server/src/cluster_report_backoff.rs index ecf138c4..0468afcd 100644 --- a/probing/server/src/cluster_report_backoff.rs +++ b/probing/server/src/cluster_report_backoff.rs @@ -193,6 +193,7 @@ pub fn classify_report_outcome( #[cfg(test)] mod tests { use super::*; + use probing_core::sync::lock_mutex; use std::sync::{LazyLock, Mutex}; static ENV_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); @@ -210,7 +211,7 @@ mod tests { } fn with_env(vars: &[(&str, &str)], f: F) { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "cluster_report_backoff test ENV_LOCK"); clear_backoff_env(); for (k, v) in vars { std::env::set_var(k, v); diff --git a/probing/server/src/engine.rs b/probing/server/src/engine.rs index b28dddda..84a51b28 100644 --- a/probing/server/src/engine.rs +++ b/probing/server/src/engine.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use anyhow::{self, Result}; +use anyhow::{Context, Result}; use probing_proto::prelude::*; use crate::extensions as se; @@ -53,7 +53,7 @@ pub async fn initialize_engine() -> Result<()> { #[cfg(feature = "gpu")] gpu::start_gpu_sampling_from_env(); } - result + result.map_err(anyhow::Error::new) } /// Parse `SET key = value` (value may be quoted). @@ -95,9 +95,8 @@ async fn execute_set_via_config(key: &str, value: &str) -> Result<()> { } else { format!("probing.{key}") }; - config::write(&probe_key, value) - .await - .map_err(|e| anyhow::anyhow!("{e}")) + config::write(&probe_key, value).await?; + Ok(()) } pub async fn handle_query(request: Query) -> Result { @@ -106,30 +105,23 @@ pub async fn handle_query(request: Query) -> Result { // We are already running within the Axum/Tokio runtime. if is_set_expr(&expr) { - for q in expr.split(';').filter(|s| !s.trim().is_empty()) { - let trimmed_q = q.trim(); - if trimmed_q.is_empty() { - continue; - } - log::debug!("Executing SET statement: {trimmed_q}"); - if let Some((key, value)) = parse_set_assignment(trimmed_q) { - match execute_set_via_config(key, value).await { - Ok(()) => log::debug!("Successfully configured: {key}={value}"), - Err(e) => { - log::error!("Error executing SET statement '{trimmed_q}': {e}"); - return Err(anyhow::anyhow!("Failed SET query '{trimmed_q}': {e}")); - } - } + for q in expr.split(';').map(str::trim).filter(|s| !s.is_empty()) { + log::debug!("Executing SET statement: {q}"); + // NOTE: `config::write` acquires the engine write lock, so the + // `engine.sql` branch must scope its read lock to that iteration only. + let outcome = if let Some((key, value)) = parse_set_assignment(q) { + execute_set_via_config(key, value).await } else { - let engine = ENGINE.read().await; - match engine.sql(trimmed_q).await { - Ok(_) => log::debug!("Successfully executed: {trimmed_q}"), - Err(e) => { - log::error!("Error executing SET statement '{trimmed_q}': {e}"); - return Err(anyhow::anyhow!("Failed SET query '{trimmed_q}': {e}")); - } - } - } + ENGINE + .read() + .await + .sql(q) + .await + .map(|_| ()) + .map_err(Into::into) + }; + outcome.with_context(|| format!("Failed SET query '{q}'"))?; + log::debug!("Successfully executed SET statement: {q}"); } return Ok(QueryDataFormat::Nil); } @@ -176,8 +168,7 @@ pub async fn query(req: String) -> ApiResult { let reply_message = Message::new(reply_payload); // Serialize the response message - serde_json::to_string(&reply_message).map_err(|e| { - log::error!("Failed to serialize query response: {e}"); - anyhow::anyhow!("Failed to create response: {}", e).into() // Convert to ApiError - }) + serde_json::to_string(&reply_message) + .inspect_err(|e| log::error!("Failed to serialize query response: {e}")) + .map_err(|e| ApiError::internal(format!("Failed to create response: {e}"))) } diff --git a/probing/server/src/report.rs b/probing/server/src/report.rs index e5d983a7..039fdb38 100644 --- a/probing/server/src/report.rs +++ b/probing/server/src/report.rs @@ -1,4 +1,4 @@ -use anyhow::Result; +use anyhow::{Context, Result}; use super::vars::read_probing_address; use crate::cluster_http::{get_i32_env, put_nodes_blocking}; @@ -110,7 +110,7 @@ async fn request_remote(url: &str, nodes: Vec) -> Result) -> Result { diff --git a/probing/server/src/server/cluster_fanout.rs b/probing/server/src/server/cluster_fanout.rs index 3ce31fb9..c3f1f83c 100644 --- a/probing/server/src/server/cluster_fanout.rs +++ b/probing/server/src/server/cluster_fanout.rs @@ -51,7 +51,7 @@ pub async fn remote_query_df(addr: &str, sql: &str) -> anyhow::Result .timeout_global(Some(timeout)) .build() .send(body) - .map_err(|e| anyhow::anyhow!("{e}")) + .map_err(anyhow::Error::new) }) .await??; diff --git a/probing/server/src/torchrun_cluster.rs b/probing/server/src/torchrun_cluster.rs index d16f0c65..4ce86b83 100644 --- a/probing/server/src/torchrun_cluster.rs +++ b/probing/server/src/torchrun_cluster.rs @@ -15,6 +15,7 @@ use std::sync::{LazyLock, Mutex}; use std::time::Duration; use anyhow::{Context, Result}; +use probing_core::sync::lock_mutex; use probing_proto::prelude::Node; use probing_store::store::TCPStore; use serde::{Deserialize, Serialize}; @@ -198,10 +199,7 @@ fn store_client() -> Option { async fn store_set(key: &str, value: &str) -> Result<()> { let store = store_client().context("MASTER_ADDR/MASTER_PORT not set")?; - store - .set(key, value) - .await - .map_err(|e| anyhow::anyhow!("{e}")) + store.set(key, value).await.map_err(anyhow::Error::new) } async fn store_get(key: &str) -> Result> { @@ -242,7 +240,7 @@ async fn publish_master() -> Result<()> { &serde_json::to_string(&info).context("serialize master info")?, ) .await?; - *MASTER_INFO.lock().unwrap() = Some(info); + *lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO") = Some(info); log::info!( "probing torchrun: published master at {} (key={})", reachable, @@ -366,25 +364,23 @@ fn nodes_for_upstream_report() -> Vec { fn report_parent_http() -> Option { if local_rank() != 0 { - return LOCAL0_PARENT.lock().unwrap().clone(); + return lock_mutex(&LOCAL0_PARENT, "torchrun LOCAL0_PARENT").clone(); } if is_global_rank0() { return Some(local_http_base()); } - MASTER_INFO - .lock() - .unwrap() + lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO") .as_ref() .map(|m| m.http_base.clone()) } fn ensure_master_info() -> bool { - if MASTER_INFO.lock().unwrap().is_some() { + if lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO").is_some() { return true; } let timeout = Duration::from_secs_f64(discover_timeout_secs()); if let Some(info) = SERVER_RUNTIME.block_on(poll_master_info(timeout)) { - *MASTER_INFO.lock().unwrap() = Some(info); + *lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO") = Some(info); return true; } false @@ -394,12 +390,12 @@ fn ensure_local0_parent() -> bool { if local_rank() == 0 { return true; } - if LOCAL0_PARENT.lock().unwrap().is_some() { + if lock_mutex(&LOCAL0_PARENT, "torchrun LOCAL0_PARENT").is_some() { return true; } let timeout = Duration::from_secs_f64(discover_timeout_secs()); if let Some(base) = SERVER_RUNTIME.block_on(poll_local0_parent(timeout)) { - *LOCAL0_PARENT.lock().unwrap() = Some(base); + *lock_mutex(&LOCAL0_PARENT, "torchrun LOCAL0_PARENT") = Some(base); return true; } false @@ -451,7 +447,7 @@ async fn hierarchical_report_worker() { .await .unwrap_or(ReportOutcome::Failed); let sleep_for = { - let mut backoff = REPORT_BACKOFF.lock().unwrap(); + let mut backoff = lock_mutex(&REPORT_BACKOFF, "torchrun REPORT_BACKOFF"); backoff.record(outcome); backoff.sleep_duration() }; @@ -512,12 +508,12 @@ pub fn refresh_torchrun_role() -> bool { if !STARTED.load(Ordering::SeqCst) { return false; } - REPORT_BACKOFF.lock().unwrap().reset(); + lock_mutex(&REPORT_BACKOFF, "torchrun REPORT_BACKOFF").reset(); SERVER_RUNTIME.spawn(async { let outcome = tokio::task::spawn_blocking(report_once) .await .unwrap_or(ReportOutcome::Failed); - let mut backoff = REPORT_BACKOFF.lock().unwrap(); + let mut backoff = lock_mutex(&REPORT_BACKOFF, "torchrun REPORT_BACKOFF"); backoff.record(outcome); }); true @@ -525,9 +521,7 @@ pub fn refresh_torchrun_role() -> bool { /// Master HTTP base URL when this process is global rank 0. pub fn master_http_base() -> Option { - MASTER_INFO - .lock() - .unwrap() + lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO") .as_ref() .map(|m| m.http_base.clone()) } @@ -557,7 +551,7 @@ mod tests { #[test] fn run_prefix_uses_rdzv_id() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("RDZV_ID", "probing-29680"); assert_eq!(run_prefix(), "probing/torchrun/probing-29680"); @@ -565,7 +559,7 @@ mod tests { #[test] fn local0_store_key_includes_node_rank() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("TORCHELASTIC_RUN_ID", "job-x"); std::env::set_var("NODE_RANK", "3"); @@ -574,7 +568,7 @@ mod tests { #[test] fn merge_self_is_idempotent() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("RANK", "0"); std::env::set_var("LOCAL_RANK", "0"); @@ -596,7 +590,7 @@ mod tests { #[test] fn local_group_and_leaf_filters() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("GROUP_RANK", "3"); std::env::set_var("RANK", "24"); @@ -621,7 +615,7 @@ mod tests { #[test] fn reachable_addr_maps_unspecified_bind() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("MASTER_ADDR", "10.0.0.1"); assert_eq!(reachable_addr("0.0.0.0:9922"), "10.0.0.1:9922"); @@ -629,7 +623,7 @@ mod tests { #[test] fn bind_spec_global_rank0_uses_probing_port() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); clear_torchrun_env(); std::env::set_var("RANK", "0"); std::env::set_var("PROBING_PORT", "18080"); diff --git a/probing/server/tests/hierarchical_cluster_report.rs b/probing/server/tests/hierarchical_cluster_report.rs index 0a15d9a0..780cd792 100644 --- a/probing/server/tests/hierarchical_cluster_report.rs +++ b/probing/server/tests/hierarchical_cluster_report.rs @@ -5,6 +5,7 @@ use std::sync::{Arc, LazyLock, Mutex}; use std::time::{SystemTime, UNIX_EPOCH}; use axum::{extract::State, routing::get, Json, Router}; +use probing_core::sync::lock_mutex; use probing_proto::prelude::{Cluster, Node, NodeReportRequest, NodeReportResponse}; use probing_server::cluster_http::{fetch_nodes_blocking, put_nodes_blocking}; use probing_server::server::SERVER_RUNTIME; @@ -44,7 +45,7 @@ async fn put_nodes_handler( State(state): State, Json(body): Json, ) -> Json { - let mut cluster = state.cluster.lock().unwrap(); + let mut cluster = lock_mutex(&state.cluster, "hierarchical_cluster_report cluster"); for mut node in body.nodes { if node.timestamp == 0 { node.timestamp = now_micros(); @@ -66,7 +67,7 @@ async fn put_nodes_handler( } async fn get_nodes_handler(State(state): State) -> Json> { - let cluster = state.cluster.lock().unwrap(); + let cluster = lock_mutex(&state.cluster, "hierarchical_cluster_report cluster"); let mut nodes = cluster.list(); nodes.sort_by_key(|n| n.rank.unwrap_or(i32::MAX)); Json(nodes) @@ -122,7 +123,7 @@ fn local_group_ranks(store: &[Node], group_rank: i32) -> Vec { #[test] fn hierarchical_two_nodes_times_two_gpus_converges_on_master() { - let _guard = ENV_LOCK.lock().unwrap(); + let _guard = lock_mutex(&ENV_LOCK, "hierarchical_cluster_report ENV_LOCK"); for key in ["RANK", "GROUP_RANK", "LOCAL_RANK"] { std::env::remove_var(key); } diff --git a/tests/regression/rust/probing/core/table_docs_integration.rs b/tests/regression/rust/probing/core/table_docs_integration.rs index 8a019ae5..cc5a1e30 100644 --- a/tests/regression/rust/probing/core/table_docs_integration.rs +++ b/tests/regression/rust/probing/core/table_docs_integration.rs @@ -46,7 +46,7 @@ async fn mmap_schema_docs_visible_in_semantic_catalog() -> Result<()> { { let mut exposed = ExposedTable::create(&qualified, &schema, 4096, 4)?; - let mut writer = exposed.writer(); + let mut writer = exposed.writer()?; writer.push_row(&[Value::F64(12.5), Value::I32(0)]); } diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..25308c84 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1307 @@ +version = 1 +revision = 3 +requires-python = ">=3.7" +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] + +[[package]] +name = "black" +version = "23.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "mypy-extensions", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pathspec", version = "0.11.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "platformdirs", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "typed-ast", marker = "python_full_version < '3.8' and implementation_name == 'cpython'" }, + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/36/66370f5017b100225ec4950a60caeef60201a10080da57ddb24124453fba/black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940", size = 582156, upload-time = "2023-03-29T01:00:54.457Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/f4/7908f71cc71da08df1317a3619f002cbf91927fb5d3ffc7723905a2113f7/black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915", size = 1342273, upload-time = "2023-03-29T01:19:03.787Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/07aab2623cfd3789786f17e051487a41d5657258c7b1ef8f780512ffea9c/black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9", size = 2676721, upload-time = "2023-03-29T01:25:23.459Z" }, + { url = "https://files.pythonhosted.org/packages/29/b1/b584fc863c155653963039664a592b3327b002405043b7e761b9b0212337/black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2", size = 1520336, upload-time = "2023-03-29T01:28:32.973Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b4/0f13ab7f5e364795ff82b76b0f9a4c9c50afda6f1e2feeb8b03fdd7ec57d/black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c", size = 1654611, upload-time = "2023-03-29T01:11:12.718Z" }, + { url = "https://files.pythonhosted.org/packages/de/b4/76f152c5eb0be5471c22cd18380d31d188930377a1a57969073b89d6615d/black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c", size = 1286657, upload-time = "2023-03-29T01:15:20.317Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6f/d3832960a3b646b333b7f0d80d336a3c123012e9d9d5dba4a622b2b6181d/black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6", size = 1326112, upload-time = "2023-03-29T01:19:05.794Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a5/17b40bfd9b607b69fa726b0b3a473d14b093dcd5191ea1a1dd664eccfee3/black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b", size = 2643808, upload-time = "2023-03-29T01:25:27.825Z" }, + { url = "https://files.pythonhosted.org/packages/69/49/7e1f0cf585b0d607aad3f971f95982cc4208fc77f92363d632d23021ee57/black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d", size = 1503287, upload-time = "2023-03-29T01:28:35.228Z" }, + { url = "https://files.pythonhosted.org/packages/c0/53/42e312c17cfda5c8fc4b6b396a508218807a3fcbb963b318e49d3ddd11d5/black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70", size = 1638625, upload-time = "2023-03-29T01:11:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/3f/0d/81dd4194ce7057c199d4f28e4c2a885082d9d929e7a55c514b23784f7787/black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326", size = 1293585, upload-time = "2023-03-29T01:15:22.935Z" }, + { url = "https://files.pythonhosted.org/packages/24/eb/2d2d2c27cb64cfd073896f62a952a802cd83cf943a692a2f278525b57ca9/black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b", size = 1447428, upload-time = "2023-03-29T01:28:37.49Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/15d2122f90ff1cd70f06892ebda777b650218cf84b56b5916a993dc1359a/black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2", size = 1576467, upload-time = "2023-03-29T01:11:18.293Z" }, + { url = "https://files.pythonhosted.org/packages/ca/44/eb41edd3f558a6139f09eee052dead4a7a464e563b822ddf236f5a8ee286/black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925", size = 1226437, upload-time = "2023-03-29T01:15:24.92Z" }, + { url = "https://files.pythonhosted.org/packages/ce/f4/2b0c6ac9e1f8584296747f66dd511898b4ebd51d6510dba118279bff53b6/black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27", size = 1331955, upload-time = "2023-03-29T01:19:07.695Z" }, + { url = "https://files.pythonhosted.org/packages/21/14/d5a2bec5fb15f9118baab7123d344646fac0b1c6939d51c2b05259cd2d9c/black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331", size = 2658520, upload-time = "2023-03-29T01:25:30.535Z" }, + { url = "https://files.pythonhosted.org/packages/13/0a/ed8b66c299e896780e4528eed4018f5b084da3b9ba4ee48328550567d866/black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5", size = 1509852, upload-time = "2023-03-29T01:28:39.106Z" }, + { url = "https://files.pythonhosted.org/packages/12/4b/99c71d1cf1353edd5aff2700b8960f92e9b805c9dab72639b67dbb449d3a/black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961", size = 1641852, upload-time = "2023-03-29T01:11:20.065Z" }, + { url = "https://files.pythonhosted.org/packages/d1/6e/5810b6992ed70403124c67e8b3f62858a32b35405177553f1a78ed6b6e31/black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8", size = 1297694, upload-time = "2023-03-29T01:15:26.919Z" }, + { url = "https://files.pythonhosted.org/packages/13/25/cfa06788d0a936f2445af88f13604b5bcd5c9d050db618c718e6ebe66f74/black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30", size = 1341089, upload-time = "2023-03-29T01:19:09.503Z" }, + { url = "https://files.pythonhosted.org/packages/fd/5b/fc2d7922c1a6bb49458d424b5be71d251f2d0dc97be9534e35d171bdc653/black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3", size = 2674699, upload-time = "2023-03-29T01:25:32.853Z" }, + { url = "https://files.pythonhosted.org/packages/49/d7/f3b7da6c772800f5375aeb050a3dcf682f0bbeb41d313c9c2820d0156e4e/black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266", size = 1519946, upload-time = "2023-03-29T01:28:40.746Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d7/85f3d79f9e543402de2244c4d117793f262149e404ea0168841613c33e07/black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab", size = 1654176, upload-time = "2023-03-29T01:11:21.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/1e/273d610249f0335afb1ddb03664a03223f4826e3d1a95170a0142cb19fb4/black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb", size = 1286299, upload-time = "2023-03-29T01:15:28.898Z" }, + { url = "https://files.pythonhosted.org/packages/ad/e7/4642b7f462381799393fbad894ba4b32db00870a797f0616c197b07129a9/black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4", size = 180965, upload-time = "2023-03-29T01:00:52.253Z" }, +] + +[[package]] +name = "black" +version = "24.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "mypy-extensions", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pathspec", version = "0.12.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/b0/46fb0d4e00372f4a86a6f8efa3cb193c9f64863615e39010b1477e010578/black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f", size = 644810, upload-time = "2024-08-02T17:43:18.405Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/6e/74e29edf1fba3887ed7066930a87f698ffdcd52c5dbc263eabb06061672d/black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6", size = 1632092, upload-time = "2024-08-02T17:47:26.911Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/575cb6c3faee690b05c9d11ee2e8dba8fbd6d6c134496e644c1feb1b47da/black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb", size = 1457529, upload-time = "2024-08-02T17:47:29.109Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/d34099e95c437b53d01c4aa37cf93944b233066eb034ccf7897fa4e5f286/black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42", size = 1757443, upload-time = "2024-08-02T17:46:20.306Z" }, + { url = "https://files.pythonhosted.org/packages/87/a0/6d2e4175ef364b8c4b64f8441ba041ed65c63ea1db2720d61494ac711c15/black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a", size = 1418012, upload-time = "2024-08-02T17:47:20.33Z" }, + { url = "https://files.pythonhosted.org/packages/08/a6/0a3aa89de9c283556146dc6dbda20cd63a9c94160a6fbdebaf0918e4a3e1/black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1", size = 1615080, upload-time = "2024-08-02T17:48:05.467Z" }, + { url = "https://files.pythonhosted.org/packages/db/94/b803d810e14588bb297e565821a947c108390a079e21dbdcb9ab6956cd7a/black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af", size = 1438143, upload-time = "2024-08-02T17:47:30.247Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b5/f485e1bbe31f768e2e5210f52ea3f432256201289fd1a3c0afda693776b0/black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4", size = 1738774, upload-time = "2024-08-02T17:46:17.837Z" }, + { url = "https://files.pythonhosted.org/packages/a8/69/a000fc3736f89d1bdc7f4a879f8aaf516fb03613bb51a0154070383d95d9/black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af", size = 1427503, upload-time = "2024-08-02T17:46:22.654Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a8/05fb14195cfef32b7c8d4585a44b7499c2a4b205e1662c427b941ed87054/black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368", size = 1646132, upload-time = "2024-08-02T17:49:52.843Z" }, + { url = "https://files.pythonhosted.org/packages/41/77/8d9ce42673e5cb9988f6df73c1c5c1d4e9e788053cccd7f5fb14ef100982/black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed", size = 1448665, upload-time = "2024-08-02T17:47:54.479Z" }, + { url = "https://files.pythonhosted.org/packages/cc/94/eff1ddad2ce1d3cc26c162b3693043c6b6b575f538f602f26fe846dfdc75/black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018", size = 1762458, upload-time = "2024-08-02T17:46:19.384Z" }, + { url = "https://files.pythonhosted.org/packages/28/ea/18b8d86a9ca19a6942e4e16759b2fa5fc02bbc0eb33c1b866fcd387640ab/black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2", size = 1436109, upload-time = "2024-08-02T17:46:52.97Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d4/ae03761ddecc1a37d7e743b89cccbcf3317479ff4b88cfd8818079f890d0/black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd", size = 1617322, upload-time = "2024-08-02T17:51:20.203Z" }, + { url = "https://files.pythonhosted.org/packages/14/4b/4dfe67eed7f9b1ddca2ec8e4418ea74f0d1dc84d36ea874d618ffa1af7d4/black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2", size = 1442108, upload-time = "2024-08-02T17:50:40.824Z" }, + { url = "https://files.pythonhosted.org/packages/97/14/95b3f91f857034686cae0e73006b8391d76a8142d339b42970eaaf0416ea/black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e", size = 1745786, upload-time = "2024-08-02T17:46:02.939Z" }, + { url = "https://files.pythonhosted.org/packages/95/54/68b8883c8aa258a6dde958cd5bdfada8382bec47c5162f4a01e66d839af1/black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920", size = 1426754, upload-time = "2024-08-02T17:46:38.603Z" }, + { url = "https://files.pythonhosted.org/packages/13/b2/b3f24fdbb46f0e7ef6238e131f13572ee8279b70f237f221dd168a9dba1a/black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c", size = 1631706, upload-time = "2024-08-02T17:49:57.606Z" }, + { url = "https://files.pythonhosted.org/packages/d9/35/31010981e4a05202a84a3116423970fd1a59d2eda4ac0b3570fbb7029ddc/black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e", size = 1457429, upload-time = "2024-08-02T17:49:12.764Z" }, + { url = "https://files.pythonhosted.org/packages/27/25/3f706b4f044dd569a20a4835c3b733dedea38d83d2ee0beb8178a6d44945/black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47", size = 1756488, upload-time = "2024-08-02T17:46:08.067Z" }, + { url = "https://files.pythonhosted.org/packages/63/72/79375cd8277cbf1c5670914e6bd4c1b15dea2c8f8e906dc21c448d0535f0/black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb", size = 1417721, upload-time = "2024-08-02T17:46:42.637Z" }, + { url = "https://files.pythonhosted.org/packages/27/1e/83fa8a787180e1632c3d831f7e58994d7aaf23a0961320d21e84f922f919/black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed", size = 206504, upload-time = "2024-08-02T17:43:15.747Z" }, +] + +[[package]] +name = "black" +version = "25.11.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "mypy-extensions", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pathspec", version = "1.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytokens", marker = "python_full_version == '3.9.*'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", size = 655669, upload-time = "2025-11-10T01:53:50.558Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/d2/6caccbc96f9311e8ec3378c296d4f4809429c43a6cd2394e3c390e86816d/black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", size = 1743501, upload-time = "2025-11-10T01:59:06.202Z" }, + { url = "https://files.pythonhosted.org/packages/69/35/b986d57828b3f3dccbf922e2864223197ba32e74c5004264b1c62bc9f04d/black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", size = 1597308, upload-time = "2025-11-10T01:57:58.633Z" }, + { url = "https://files.pythonhosted.org/packages/39/8e/8b58ef4b37073f52b64a7b2dd8c9a96c84f45d6f47d878d0aa557e9a2d35/black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", size = 1656194, upload-time = "2025-11-10T01:57:10.909Z" }, + { url = "https://files.pythonhosted.org/packages/8d/30/9c2267a7955ecc545306534ab88923769a979ac20a27cf618d370091e5dd/black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03", size = 1347996, upload-time = "2025-11-10T01:57:22.391Z" }, + { url = "https://files.pythonhosted.org/packages/c4/62/d304786b75ab0c530b833a89ce7d997924579fb7484ecd9266394903e394/black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", size = 1727891, upload-time = "2025-11-10T02:01:40.507Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/ffe8a006aa522c9e3f430e7b93568a7b2163f4b3f16e8feb6d8c3552761a/black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", size = 1581875, upload-time = "2025-11-10T01:57:51.192Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7c8bda3108d0bb57387ac41b4abb5c08782b26da9f9c4421ef6694dac01a/black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", size = 1642716, upload-time = "2025-11-10T01:56:51.589Z" }, + { url = "https://files.pythonhosted.org/packages/34/b9/f17dea34eecb7cc2609a89627d480fb6caea7b86190708eaa7eb15ed25e7/black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", size = 1352904, upload-time = "2025-11-10T01:59:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/7f/12/5c35e600b515f35ffd737da7febdb2ab66bb8c24d88560d5e3ef3d28c3fd/black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", size = 1772831, upload-time = "2025-11-10T02:03:47Z" }, + { url = "https://files.pythonhosted.org/packages/1a/75/b3896bec5a2bb9ed2f989a970ea40e7062f8936f95425879bbe162746fe5/black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", size = 1608520, upload-time = "2025-11-10T01:58:46.895Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b5/2bfc18330eddbcfb5aab8d2d720663cd410f51b2ed01375f5be3751595b0/black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", size = 1682719, upload-time = "2025-11-10T01:56:55.24Z" }, + { url = "https://files.pythonhosted.org/packages/96/fb/f7dc2793a22cdf74a72114b5ed77fe3349a2e09ef34565857a2f917abdf2/black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", size = 1362684, upload-time = "2025-11-10T01:57:07.639Z" }, + { url = "https://files.pythonhosted.org/packages/ad/47/3378d6a2ddefe18553d1115e36aea98f4a90de53b6a3017ed861ba1bd3bc/black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", size = 1772446, upload-time = "2025-11-10T02:02:16.181Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4b/0f00bfb3d1f7e05e25bfc7c363f54dc523bb6ba502f98f4ad3acf01ab2e4/black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", size = 1607983, upload-time = "2025-11-10T02:02:52.502Z" }, + { url = "https://files.pythonhosted.org/packages/99/fe/49b0768f8c9ae57eb74cc10a1f87b4c70453551d8ad498959721cc345cb7/black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", size = 1682481, upload-time = "2025-11-10T01:57:12.35Z" }, + { url = "https://files.pythonhosted.org/packages/55/17/7e10ff1267bfa950cc16f0a411d457cdff79678fbb77a6c73b73a5317904/black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", size = 1363869, upload-time = "2025-11-10T01:58:24.608Z" }, + { url = "https://files.pythonhosted.org/packages/67/c0/cc865ce594d09e4cd4dfca5e11994ebb51604328489f3ca3ae7bb38a7db5/black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", size = 1771358, upload-time = "2025-11-10T02:03:33.331Z" }, + { url = "https://files.pythonhosted.org/packages/37/77/4297114d9e2fd2fc8ab0ab87192643cd49409eb059e2940391e7d2340e57/black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", size = 1612902, upload-time = "2025-11-10T01:59:33.382Z" }, + { url = "https://files.pythonhosted.org/packages/de/63/d45ef97ada84111e330b2b2d45e1dd163e90bd116f00ac55927fb6bf8adb/black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", size = 1680571, upload-time = "2025-11-10T01:57:04.239Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4b/5604710d61cdff613584028b4cb4607e56e148801ed9b38ee7970799dab6/black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", size = 1382599, upload-time = "2025-11-10T01:57:57.427Z" }, + { url = "https://files.pythonhosted.org/packages/d5/9a/5b2c0e3215fe748fcf515c2dd34658973a1210bf610e24de5ba887e4f1c8/black-25.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06", size = 1743063, upload-time = "2025-11-10T02:02:43.175Z" }, + { url = "https://files.pythonhosted.org/packages/a1/20/245164c6efc27333409c62ba54dcbfbe866c6d1957c9a6c0647786e950da/black-25.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2", size = 1596867, upload-time = "2025-11-10T02:00:17.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6f/1a3859a7da205f3d50cf3a8bec6bdc551a91c33ae77a045bb24c1f46ab54/black-25.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc", size = 1655678, upload-time = "2025-11-10T01:57:09.028Z" }, + { url = "https://files.pythonhosted.org/packages/56/1a/6dec1aeb7be90753d4fcc273e69bc18bfd34b353223ed191da33f7519410/black-25.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc", size = 1347452, upload-time = "2025-11-10T01:57:01.871Z" }, + { url = "https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", size = 204918, upload-time = "2025-11-10T01:53:48.917Z" }, +] + +[[package]] +name = "black" +version = "26.5.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "click", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "mypy-extensions", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pathspec", version = "1.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "platformdirs", version = "4.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytokens", marker = "python_full_version >= '3.10'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/84/b3f55026206a9e8820a91503308075ca48eadc515e436731ca01dbe043b3/black-26.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9942db8888e06943c5dde66ca0037dcff82a2a4ec1ad0ada9e0d2ee9d9823893", size = 1987719, upload-time = "2026-05-18T17:05:02.757Z" }, + { url = "https://files.pythonhosted.org/packages/c6/34/7db312c5e5783d6e76cffd9d5ac8972a32badae4c6e3288dac0eed8d3bed/black-26.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:89c93167a74d3a75dfaa38a5c7cca015537d5820dd7f17d63267d674a61cae90", size = 1810083, upload-time = "2026-05-18T17:05:04.302Z" }, + { url = "https://files.pythonhosted.org/packages/33/e2/e0101e73c2c8727634e2efcb35e2b34bd23ad70dfa673789f5773a591b21/black-26.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f2cd76d069cc54c71f10360744ba8983fbb616903b4304a85b734915c8e1b4", size = 1860633, upload-time = "2026-05-18T17:05:06.391Z" }, + { url = "https://files.pythonhosted.org/packages/b0/4c/e15c0c5b23cf3651035fe5addcce90e283af3548a3f91bb03d81b83106ab/black-26.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:87ed5c6f450580a2f6790bc7cbfb016dfc73bc750249762268a3695361315eef", size = 1477886, upload-time = "2026-05-18T17:05:07.96Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3f/59d43ade98d2ce5c8dc34a4e46cbecd177e6d55d7d4092969c6003ccc655/black-26.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:58b4bd92cf88aacf83d88479c8f9caee044b1ec55f2451a337354a7ea2590a22", size = 1277111, upload-time = "2026-05-18T17:05:09.473Z" }, + { url = "https://files.pythonhosted.org/packages/4b/96/3c3e09f09f44a37aac36b178a279cd19aa7001bd796187a7b162a294c81f/black-26.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96ae2c733b2aabdd9986e2c5df628ff3473676cd1c5faded1ff496cf6d74083c", size = 1970639, upload-time = "2026-05-18T17:05:11.461Z" }, + { url = "https://files.pythonhosted.org/packages/83/ea/5ad117b9ee3ecd933c712bcbae610006e5b7cc9f41c526cd7ed3b6c4124c/black-26.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e48b87e03bf109288e55cfceadcfa15ff5470aca2851a851950ed2926f450d7", size = 1792130, upload-time = "2026-05-18T17:05:12.983Z" }, + { url = "https://files.pythonhosted.org/packages/06/3a/7c448bc623fcdfa96672531beb5a616ea5e64f6975955254d7731ffb0ad9/black-26.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5119fa92ae61f786e8c3662fd60aece1d0a2dd5cca5d0c79417a95e7a4272a59", size = 1846134, upload-time = "2026-05-18T17:05:14.506Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5b/0b39b3a5917f0657ac014ad2edb58c139553a478adfe7f817abf1622ff6e/black-26.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:30d3c14661f2792e9142cce3eeeb1cbc175b3eb5f733be0c8eeb99651e52b0c3", size = 1478883, upload-time = "2026-05-18T17:05:16.542Z" }, + { url = "https://files.pythonhosted.org/packages/4c/48/dc222692e0f95030db1bbfb6c857e76858bad09058221ea7aae815255327/black-26.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:1ef92b76f7733f282fd096ea406200b5a286c42947412b0eaff3a74e3616cefe", size = 1277776, upload-time = "2026-05-18T17:05:18.029Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/7744b906703228264ef73bdd534df88ec1ef3de45c4e78f6d31b9e32d0c9/black-26.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ad6fa01f941920f54f2bbb35f3df7673428a0ef98a0b0840c2eaef3b110efa8", size = 2012518, upload-time = "2026-05-18T17:05:20.108Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c0/c5a3b1636dfd09c42534f2b3cf33506814f6d3e066fb0879ffa16c1ae860/black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217", size = 1816016, upload-time = "2026-05-18T17:05:21.84Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0e/36044316b65ca471d3bb6d3703fd06fb50c6b727c3562f6a5a3153634f88/black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d", size = 1884150, upload-time = "2026-05-18T17:05:23.546Z" }, + { url = "https://files.pythonhosted.org/packages/b3/33/dafc5808c2af43672912111d7c3354af1615f7e2be3bed7a878461abbe4d/black-26.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264", size = 1486825, upload-time = "2026-05-18T17:05:25.004Z" }, + { url = "https://files.pythonhosted.org/packages/82/14/b965ee6ad2a311f28bdbf692def3ee9848d2ae289dab28b27657fcee3e78/black-26.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1037d5ac7b7b310b2632ad867ec8d0e4c4819dcdb0b820f63135da746a24e418", size = 1288646, upload-time = "2026-05-18T17:05:26.477Z" }, + { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, + { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, + { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, + { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a8da8eb208c51c7f4ce74609a45d0dcc6d8a2141e45e81ee5289d1bb0d59/black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168", size = 2004800, upload-time = "2026-05-18T17:05:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/11/8a/a479296a19e383b70a725882a6cf3d786540601ff03cabbaaf1cce864c5a/black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3", size = 1815576, upload-time = "2026-05-18T17:05:40.309Z" }, + { url = "https://files.pythonhosted.org/packages/81/6b/cfaf3d39f25132c156a068f6b805576c9103a84086019507c70e1911ee7d/black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18", size = 1877927, upload-time = "2026-05-18T17:05:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/66/76/302e313964bcff7e28df329d39f84f5270095730d85ff0acc260610a0d82/black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50", size = 1511860, upload-time = "2026-05-18T17:05:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/27/4e/a3827e35e0e567f9f9ee59e2a0ab979267dca98718f25547ca8c6733afd4/black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae", size = 1316632, upload-time = "2026-05-18T17:05:45.521Z" }, + { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, +] + +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.2.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/45/8b/421f30467e69ac0e414214856798d4bc32da1336df745e49e49ae5c1e2a8/coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59", size = 762575, upload-time = "2023-05-29T20:08:50.273Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/24/be01e62a7bce89bcffe04729c540382caa5a06bee45ae42136c93e2499f5/coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8", size = 200724, upload-time = "2023-05-29T20:07:03.422Z" }, + { url = "https://files.pythonhosted.org/packages/3d/80/7060a445e1d2c9744b683dc935248613355657809d6c6b2716cdf4ca4766/coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb", size = 201024, upload-time = "2023-05-29T20:07:05.694Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9d/926fce7e03dbfc653104c2d981c0fa71f0572a9ebd344d24c573bd6f7c4f/coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6", size = 229528, upload-time = "2023-05-29T20:07:07.307Z" }, + { url = "https://files.pythonhosted.org/packages/d1/3a/67f5d18f911abf96857f6f7e4df37ca840e38179e2cc9ab6c0b9c3380f19/coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2", size = 227842, upload-time = "2023-05-29T20:07:09.331Z" }, + { url = "https://files.pythonhosted.org/packages/b4/bd/1b2331e3a04f4cc9b7b332b1dd0f3a1261dfc4114f8479bebfcc2afee9e8/coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063", size = 228717, upload-time = "2023-05-29T20:07:11.38Z" }, + { url = "https://files.pythonhosted.org/packages/2b/86/3dbf9be43f8bf6a5ca28790a713e18902b2d884bc5fa9512823a81dff601/coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1", size = 234632, upload-time = "2023-05-29T20:07:13.376Z" }, + { url = "https://files.pythonhosted.org/packages/91/e8/469ed808a782b9e8305a08bad8c6fa5f8e73e093bda6546c5aec68275bff/coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353", size = 232875, upload-time = "2023-05-29T20:07:15.093Z" }, + { url = "https://files.pythonhosted.org/packages/29/8f/4fad1c2ba98104425009efd7eaa19af9a7c797e92d40cd2ec026fa1f58cb/coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495", size = 234094, upload-time = "2023-05-29T20:07:17.013Z" }, + { url = "https://files.pythonhosted.org/packages/94/4e/d4e46a214ae857be3d7dc5de248ba43765f60daeb1ab077cb6c1536c7fba/coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818", size = 203184, upload-time = "2023-05-29T20:07:18.69Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e9/d6730247d8dec2a3dddc520ebe11e2e860f0f98cee3639e23de6cf920255/coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850", size = 204096, upload-time = "2023-05-29T20:07:20.153Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fa/529f55c9a1029c840bcc9109d5a15ff00478b7ff550a1ae361f8745f8ad5/coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f", size = 200895, upload-time = "2023-05-29T20:07:21.963Z" }, + { url = "https://files.pythonhosted.org/packages/67/d7/cd8fe689b5743fffac516597a1222834c42b80686b99f5b44ef43ccc2a43/coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe", size = 201120, upload-time = "2023-05-29T20:07:23.765Z" }, + { url = "https://files.pythonhosted.org/packages/8c/95/16eed713202406ca0a37f8ac259bbf144c9d24f9b8097a8e6ead61da2dbb/coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3", size = 233178, upload-time = "2023-05-29T20:07:25.281Z" }, + { url = "https://files.pythonhosted.org/packages/c1/49/4d487e2ad5d54ed82ac1101e467e8994c09d6123c91b2a962145f3d262c2/coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f", size = 230754, upload-time = "2023-05-29T20:07:27.044Z" }, + { url = "https://files.pythonhosted.org/packages/a7/cd/3ce94ad9d407a052dc2a74fbeb1c7947f442155b28264eb467ee78dea812/coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb", size = 232558, upload-time = "2023-05-29T20:07:28.743Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a8/12cc7b261f3082cc299ab61f677f7e48d93e35ca5c3c2f7241ed5525ccea/coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833", size = 241509, upload-time = "2023-05-29T20:07:30.434Z" }, + { url = "https://files.pythonhosted.org/packages/04/fa/43b55101f75a5e9115259e8be70ff9279921cb6b17f04c34a5702ff9b1f7/coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97", size = 239924, upload-time = "2023-05-29T20:07:32.065Z" }, + { url = "https://files.pythonhosted.org/packages/68/5f/d2bd0f02aa3c3e0311986e625ccf97fdc511b52f4f1a063e4f37b624772f/coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a", size = 240977, upload-time = "2023-05-29T20:07:34.184Z" }, + { url = "https://files.pythonhosted.org/packages/ba/92/69c0722882643df4257ecc5437b83f4c17ba9e67f15dc6b77bad89b6982e/coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a", size = 203168, upload-time = "2023-05-29T20:07:35.869Z" }, + { url = "https://files.pythonhosted.org/packages/b1/96/c12ed0dfd4ec587f3739f53eb677b9007853fd486ccb0e7d5512a27bab2e/coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562", size = 204185, upload-time = "2023-05-29T20:07:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d5/52fa1891d1802ab2e1b346d37d349cb41cdd4fd03f724ebbf94e80577687/coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4", size = 201020, upload-time = "2023-05-29T20:07:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/24/df/6765898d54ea20e3197a26d26bb65b084deefadd77ce7de946b9c96dfdc5/coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4", size = 233994, upload-time = "2023-05-29T20:07:40.274Z" }, + { url = "https://files.pythonhosted.org/packages/15/81/b108a60bc758b448c151e5abceed027ed77a9523ecbc6b8a390938301841/coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01", size = 231358, upload-time = "2023-05-29T20:07:41.998Z" }, + { url = "https://files.pythonhosted.org/packages/61/90/c76b9462f39897ebd8714faf21bc985b65c4e1ea6dff428ea9dc711ed0dd/coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6", size = 233316, upload-time = "2023-05-29T20:07:43.539Z" }, + { url = "https://files.pythonhosted.org/packages/04/d6/8cba3bf346e8b1a4fb3f084df7d8cea25a6b6c56aaca1f2e53829be17e9e/coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d", size = 240159, upload-time = "2023-05-29T20:07:44.982Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ea/4a252dc77ca0605b23d477729d139915e753ee89e4c9507630e12ad64a80/coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de", size = 238127, upload-time = "2023-05-29T20:07:46.522Z" }, + { url = "https://files.pythonhosted.org/packages/9f/5c/d9760ac497c41f9c4841f5972d0edf05d50cad7814e86ee7d133ec4a0ac8/coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d", size = 239833, upload-time = "2023-05-29T20:07:47.992Z" }, + { url = "https://files.pythonhosted.org/packages/69/8c/26a95b08059db1cbb01e4b0e6d40f2e9debb628c6ca86b78f625ceaf9bab/coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511", size = 203463, upload-time = "2023-05-29T20:07:49.939Z" }, + { url = "https://files.pythonhosted.org/packages/b7/00/14b00a0748e9eda26e97be07a63cc911108844004687321ddcc213be956c/coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3", size = 204347, upload-time = "2023-05-29T20:07:51.909Z" }, + { url = "https://files.pythonhosted.org/packages/80/d7/67937c80b8fd4c909fdac29292bc8b35d9505312cff6bcab41c53c5b1df6/coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f", size = 200580, upload-time = "2023-05-29T20:07:54.076Z" }, + { url = "https://files.pythonhosted.org/packages/7a/05/084864fa4bbf8106f44fb72a56e67e0cd372d3bf9d893be818338c81af5d/coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb", size = 226237, upload-time = "2023-05-29T20:07:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/67/a2/6fa66a50e6e894286d79a3564f42bd54a9bd27049dc0a63b26d9924f0aa3/coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9", size = 224256, upload-time = "2023-05-29T20:07:58.189Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c0/73f139794c742840b9ab88e2e17fe14a3d4668a166ff95d812ac66c0829d/coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd", size = 225550, upload-time = "2023-05-29T20:08:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/03/ec/6f30b4e0c96ce03b0e64aec46b4af2a8c49b70d1b5d0d69577add757b946/coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a", size = 232440, upload-time = "2023-05-29T20:08:02.495Z" }, + { url = "https://files.pythonhosted.org/packages/22/c1/2f6c1b6f01a0996c9e067a9c780e1824351dbe17faae54388a4477e6d86f/coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959", size = 230897, upload-time = "2023-05-29T20:08:04.382Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d6/53e999ec1bf7498ca4bc5f3b8227eb61db39068d2de5dcc359dec5601b5a/coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02", size = 232024, upload-time = "2023-05-29T20:08:06.031Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/383305500d24122dbed73e505a4d6828f8f3356d1f68ab6d32c781754b81/coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f", size = 203293, upload-time = "2023-05-29T20:08:07.598Z" }, + { url = "https://files.pythonhosted.org/packages/0e/bc/7e3a31534fabb043269f14fb64e2bb2733f85d4cf39e5bbc71357c57553a/coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0", size = 204040, upload-time = "2023-05-29T20:08:09.919Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fc/be19131010930a6cf271da48202c8cc1d3f971f68c02fb2d3a78247f43dc/coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5", size = 200689, upload-time = "2023-05-29T20:08:11.594Z" }, + { url = "https://files.pythonhosted.org/packages/28/d7/9a8de57d87f4bbc6f9a6a5ded1eaac88a89bf71369bb935dac3c0cf2893e/coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5", size = 200986, upload-time = "2023-05-29T20:08:13.228Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e4/e6182e4697665fb594a7f4e4f27cb3a4dd00c2e3d35c5c706765de8c7866/coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9", size = 230648, upload-time = "2023-05-29T20:08:15.11Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e3/f552d5871943f747165b92a924055c5d6daa164ae659a13f9018e22f3990/coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6", size = 228511, upload-time = "2023-05-29T20:08:16.877Z" }, + { url = "https://files.pythonhosted.org/packages/44/55/49f65ccdd4dfd6d5528e966b28c37caec64170c725af32ab312889d2f857/coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e", size = 229852, upload-time = "2023-05-29T20:08:18.47Z" }, + { url = "https://files.pythonhosted.org/packages/0d/31/340428c238eb506feb96d4fb5c9ea614db1149517f22cc7ab8c6035ef6d9/coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050", size = 235578, upload-time = "2023-05-29T20:08:20.298Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ce/97c1dd6592c908425622fe7f31c017d11cf0421729b09101d4de75bcadc8/coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5", size = 234079, upload-time = "2023-05-29T20:08:22.365Z" }, + { url = "https://files.pythonhosted.org/packages/de/a3/5a98dc9e239d0dc5f243ef5053d5b1bdcaa1dee27a691dfc12befeccf878/coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f", size = 234991, upload-time = "2023-05-29T20:08:24.974Z" }, + { url = "https://files.pythonhosted.org/packages/4a/fb/78986d3022e5ccf2d4370bc43a5fef8374f092b3c21d32499dee8e30b7b6/coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e", size = 203160, upload-time = "2023-05-29T20:08:26.701Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1c/6b3c9c363fb1433c79128e0d692863deb761b1b78162494abb9e5c328bc0/coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c", size = 204085, upload-time = "2023-05-29T20:08:28.146Z" }, + { url = "https://files.pythonhosted.org/packages/88/da/495944ebf0ad246235a6bd523810d9f81981f9b81c6059ba1f56e943abe0/coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9", size = 200725, upload-time = "2023-05-29T20:08:29.851Z" }, + { url = "https://files.pythonhosted.org/packages/ca/0c/3dfeeb1006c44b911ee0ed915350db30325d01808525ae7cc8d57643a2ce/coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2", size = 201022, upload-time = "2023-05-29T20:08:31.429Z" }, + { url = "https://files.pythonhosted.org/packages/61/af/5964b8d7d9a5c767785644d9a5a63cacba9a9c45cc42ba06d25895ec87be/coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7", size = 229102, upload-time = "2023-05-29T20:08:32.982Z" }, + { url = "https://files.pythonhosted.org/packages/d9/1d/cd467fceb62c371f9adb1d739c92a05d4e550246daa90412e711226bd320/coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e", size = 227441, upload-time = "2023-05-29T20:08:35.044Z" }, + { url = "https://files.pythonhosted.org/packages/fe/57/e4f8ad64d84ca9e759d783a052795f62a9f9111585e46068845b1cb52c2b/coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1", size = 228265, upload-time = "2023-05-29T20:08:36.861Z" }, + { url = "https://files.pythonhosted.org/packages/88/8b/b0d9fe727acae907fa7f1c8194ccb6fe9d02e1c3e9001ecf74c741f86110/coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9", size = 234217, upload-time = "2023-05-29T20:08:38.837Z" }, + { url = "https://files.pythonhosted.org/packages/66/2e/c99fe1f6396d93551aa352c75410686e726cd4ea104479b9af1af22367ce/coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250", size = 232466, upload-time = "2023-05-29T20:08:40.768Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e9/88747b40c8fb4a783b40222510ce6d66170217eb05d7f46462c36b4fa8cc/coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2", size = 233669, upload-time = "2023-05-29T20:08:42.944Z" }, + { url = "https://files.pythonhosted.org/packages/b1/d5/a8e276bc005e42114468d4fe03e0a9555786bc51cbfe0d20827a46c1565a/coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb", size = 203199, upload-time = "2023-05-29T20:08:44.734Z" }, + { url = "https://files.pythonhosted.org/packages/a9/0c/4a848ae663b47f1195abcb09a951751dd61f80b503303b9b9d768e0fd321/coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27", size = 204109, upload-time = "2023-05-29T20:08:46.417Z" }, + { url = "https://files.pythonhosted.org/packages/67/fb/b3b1d7887e1ea25a9608b0776e480e4bbc303ca95a31fd585555ec4fff5a/coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d", size = 193207, upload-time = "2023-05-29T20:08:48.153Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] + +[[package]] +name = "coverage" +version = "7.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791, upload-time = "2024-08-04T19:45:30.9Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/61/eb7ce5ed62bacf21beca4937a90fe32545c91a3c8a42a30c6616d48fc70d/coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", size = 206690, upload-time = "2024-08-04T19:43:07.695Z" }, + { url = "https://files.pythonhosted.org/packages/7d/73/041928e434442bd3afde5584bdc3f932fb4562b1597629f537387cec6f3d/coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", size = 207127, upload-time = "2024-08-04T19:43:10.15Z" }, + { url = "https://files.pythonhosted.org/packages/c7/c8/6ca52b5147828e45ad0242388477fdb90df2c6cbb9a441701a12b3c71bc8/coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", size = 235654, upload-time = "2024-08-04T19:43:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/9ac2b62557f4340270942011d6efeab9833648380109e897d48ab7c1035d/coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc", size = 233598, upload-time = "2024-08-04T19:43:14.078Z" }, + { url = "https://files.pythonhosted.org/packages/53/23/9e2c114d0178abc42b6d8d5281f651a8e6519abfa0ef460a00a91f80879d/coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", size = 234732, upload-time = "2024-08-04T19:43:16.632Z" }, + { url = "https://files.pythonhosted.org/packages/0f/7e/a0230756fb133343a52716e8b855045f13342b70e48e8ad41d8a0d60ab98/coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", size = 233816, upload-time = "2024-08-04T19:43:19.049Z" }, + { url = "https://files.pythonhosted.org/packages/28/7c/3753c8b40d232b1e5eeaed798c875537cf3cb183fb5041017c1fdb7ec14e/coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", size = 232325, upload-time = "2024-08-04T19:43:21.246Z" }, + { url = "https://files.pythonhosted.org/packages/57/e3/818a2b2af5b7573b4b82cf3e9f137ab158c90ea750a8f053716a32f20f06/coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", size = 233418, upload-time = "2024-08-04T19:43:22.945Z" }, + { url = "https://files.pythonhosted.org/packages/c8/fb/4532b0b0cefb3f06d201648715e03b0feb822907edab3935112b61b885e2/coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", size = 209343, upload-time = "2024-08-04T19:43:25.121Z" }, + { url = "https://files.pythonhosted.org/packages/5a/25/af337cc7421eca1c187cc9c315f0a755d48e755d2853715bfe8c418a45fa/coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", size = 210136, upload-time = "2024-08-04T19:43:26.851Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", size = 206796, upload-time = "2024-08-04T19:43:29.115Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", size = 207244, upload-time = "2024-08-04T19:43:31.285Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", size = 239279, upload-time = "2024-08-04T19:43:33.581Z" }, + { url = "https://files.pythonhosted.org/packages/70/6c/a9ccd6fe50ddaf13442a1e2dd519ca805cbe0f1fcd377fba6d8339b98ccb/coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", size = 236859, upload-time = "2024-08-04T19:43:35.301Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", size = 238549, upload-time = "2024-08-04T19:43:37.578Z" }, + { url = "https://files.pythonhosted.org/packages/68/3c/289b81fa18ad72138e6d78c4c11a82b5378a312c0e467e2f6b495c260907/coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", size = 237477, upload-time = "2024-08-04T19:43:39.92Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1c/aa1efa6459d822bd72c4abc0b9418cf268de3f60eeccd65dc4988553bd8d/coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", size = 236134, upload-time = "2024-08-04T19:43:41.453Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c8/521c698f2d2796565fe9c789c2ee1ccdae610b3aa20b9b2ef980cc253640/coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", size = 236910, upload-time = "2024-08-04T19:43:43.037Z" }, + { url = "https://files.pythonhosted.org/packages/7d/30/033e663399ff17dca90d793ee8a2ea2890e7fdf085da58d82468b4220bf7/coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", size = 209348, upload-time = "2024-08-04T19:43:44.787Z" }, + { url = "https://files.pythonhosted.org/packages/20/05/0d1ccbb52727ccdadaa3ff37e4d2dc1cd4d47f0c3df9eb58d9ec8508ca88/coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", size = 210230, upload-time = "2024-08-04T19:43:46.707Z" }, + { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983, upload-time = "2024-08-04T19:43:49.082Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221, upload-time = "2024-08-04T19:43:52.15Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342, upload-time = "2024-08-04T19:43:53.746Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371, upload-time = "2024-08-04T19:43:55.993Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455, upload-time = "2024-08-04T19:43:57.618Z" }, + { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924, upload-time = "2024-08-04T19:44:00.012Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252, upload-time = "2024-08-04T19:44:01.713Z" }, + { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897, upload-time = "2024-08-04T19:44:03.898Z" }, + { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606, upload-time = "2024-08-04T19:44:05.532Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373, upload-time = "2024-08-04T19:44:07.079Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007, upload-time = "2024-08-04T19:44:09.453Z" }, + { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269, upload-time = "2024-08-04T19:44:11.045Z" }, + { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886, upload-time = "2024-08-04T19:44:12.83Z" }, + { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037, upload-time = "2024-08-04T19:44:15.393Z" }, + { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038, upload-time = "2024-08-04T19:44:17.466Z" }, + { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690, upload-time = "2024-08-04T19:44:19.336Z" }, + { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765, upload-time = "2024-08-04T19:44:20.994Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611, upload-time = "2024-08-04T19:44:22.616Z" }, + { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671, upload-time = "2024-08-04T19:44:24.418Z" }, + { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368, upload-time = "2024-08-04T19:44:26.276Z" }, + { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758, upload-time = "2024-08-04T19:44:29.028Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035, upload-time = "2024-08-04T19:44:30.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839, upload-time = "2024-08-04T19:44:32.412Z" }, + { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569, upload-time = "2024-08-04T19:44:34.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927, upload-time = "2024-08-04T19:44:36.313Z" }, + { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401, upload-time = "2024-08-04T19:44:38.155Z" }, + { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301, upload-time = "2024-08-04T19:44:39.883Z" }, + { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598, upload-time = "2024-08-04T19:44:41.59Z" }, + { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307, upload-time = "2024-08-04T19:44:43.301Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453, upload-time = "2024-08-04T19:44:45.677Z" }, + { url = "https://files.pythonhosted.org/packages/81/d0/d9e3d554e38beea5a2e22178ddb16587dbcbe9a1ef3211f55733924bf7fa/coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", size = 206674, upload-time = "2024-08-04T19:44:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/ea/cab2dc248d9f45b2b7f9f1f596a4d75a435cb364437c61b51d2eb33ceb0e/coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", size = 207101, upload-time = "2024-08-04T19:44:49.32Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6f/f82f9a500c7c5722368978a5390c418d2a4d083ef955309a8748ecaa8920/coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", size = 236554, upload-time = "2024-08-04T19:44:51.631Z" }, + { url = "https://files.pythonhosted.org/packages/a6/94/d3055aa33d4e7e733d8fa309d9adf147b4b06a82c1346366fc15a2b1d5fa/coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", size = 234440, upload-time = "2024-08-04T19:44:53.464Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/885bcd787d9dd674de4a7d8ec83faf729534c63d05d51d45d4fa168f7102/coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", size = 235889, upload-time = "2024-08-04T19:44:55.165Z" }, + { url = "https://files.pythonhosted.org/packages/f4/63/df50120a7744492710854860783d6819ff23e482dee15462c9a833cc428a/coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", size = 235142, upload-time = "2024-08-04T19:44:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5d/9d0acfcded2b3e9ce1c7923ca52ccc00c78a74e112fc2aee661125b7843b/coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", size = 233805, upload-time = "2024-08-04T19:44:59.033Z" }, + { url = "https://files.pythonhosted.org/packages/c4/56/50abf070cb3cd9b1dd32f2c88f083aab561ecbffbcd783275cb51c17f11d/coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", size = 234655, upload-time = "2024-08-04T19:45:01.398Z" }, + { url = "https://files.pythonhosted.org/packages/25/ee/b4c246048b8485f85a2426ef4abab88e48c6e80c74e964bea5cd4cd4b115/coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", size = 209296, upload-time = "2024-08-04T19:45:03.819Z" }, + { url = "https://files.pythonhosted.org/packages/5c/1c/96cf86b70b69ea2b12924cdf7cabb8ad10e6130eab8d767a1099fbd2a44f/coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", size = 210137, upload-time = "2024-08-04T19:45:06.25Z" }, + { url = "https://files.pythonhosted.org/packages/19/d3/d54c5aa83268779d54c86deb39c1c4566e5d45c155369ca152765f8db413/coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", size = 206688, upload-time = "2024-08-04T19:45:08.358Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fe/137d5dca72e4a258b1bc17bb04f2e0196898fe495843402ce826a7419fe3/coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", size = 207120, upload-time = "2024-08-04T19:45:11.526Z" }, + { url = "https://files.pythonhosted.org/packages/78/5b/a0a796983f3201ff5485323b225d7c8b74ce30c11f456017e23d8e8d1945/coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", size = 235249, upload-time = "2024-08-04T19:45:13.202Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e1/76089d6a5ef9d68f018f65411fcdaaeb0141b504587b901d74e8587606ad/coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", size = 233237, upload-time = "2024-08-04T19:45:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", size = 234311, upload-time = "2024-08-04T19:45:16.924Z" }, + { url = "https://files.pythonhosted.org/packages/75/e1/656d65fb126c29a494ef964005702b012f3498db1a30dd562958e85a4049/coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", size = 233453, upload-time = "2024-08-04T19:45:18.672Z" }, + { url = "https://files.pythonhosted.org/packages/68/6a/45f108f137941a4a1238c85f28fd9d048cc46b5466d6b8dda3aba1bb9d4f/coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", size = 231958, upload-time = "2024-08-04T19:45:20.63Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e7/47b809099168b8b8c72ae311efc3e88c8d8a1162b3ba4b8da3cfcdb85743/coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", size = 232938, upload-time = "2024-08-04T19:45:23.062Z" }, + { url = "https://files.pythonhosted.org/packages/52/80/052222ba7058071f905435bad0ba392cc12006380731c37afaf3fe749b88/coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", size = 209352, upload-time = "2024-08-04T19:45:25.042Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d8/1b92e0b3adcf384e98770a00ca095da1b5f7b483e6563ae4eb5e935d24a1/coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", size = 210153, upload-time = "2024-08-04T19:45:27.079Z" }, + { url = "https://files.pythonhosted.org/packages/a5/2b/0354ed096bca64dc8e32a7cbcae28b34cb5ad0b1fe2125d6d99583313ac0/coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", size = 198926, upload-time = "2024-08-04T19:45:28.875Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] + +[[package]] +name = "coverage" +version = "7.10.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6c/3a3f7a46888e69d18abe3ccc6fe4cb16cccb1e6a2f99698931dafca489e6/coverage-7.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc04cc7a3db33664e0c2d10eb8990ff6b3536f6842c9590ae8da4c614b9ed05a", size = 217987, upload-time = "2025-09-21T20:00:57.218Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/952d30f180b1a916c11a56f5c22d3535e943aa22430e9e3322447e520e1c/coverage-7.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e201e015644e207139f7e2351980feb7040e6f4b2c2978892f3e3789d1c125e5", size = 218388, upload-time = "2025-09-21T20:01:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/9e0cf8ded1e114bcd8b2fd42792b57f1c4e9e4ea1824cde2af93a67305be/coverage-7.10.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:240af60539987ced2c399809bd34f7c78e8abe0736af91c3d7d0e795df633d17", size = 245148, upload-time = "2025-09-21T20:01:01.768Z" }, + { url = "https://files.pythonhosted.org/packages/19/20/d0384ac06a6f908783d9b6aa6135e41b093971499ec488e47279f5b846e6/coverage-7.10.7-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8421e088bc051361b01c4b3a50fd39a4b9133079a2229978d9d30511fd05231b", size = 246958, upload-time = "2025-09-21T20:01:03.355Z" }, + { url = "https://files.pythonhosted.org/packages/60/83/5c283cff3d41285f8eab897651585db908a909c572bdc014bcfaf8a8b6ae/coverage-7.10.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be8ed3039ae7f7ac5ce058c308484787c86e8437e72b30bf5e88b8ea10f3c87", size = 248819, upload-time = "2025-09-21T20:01:04.968Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/02eb98fdc5ff79f423e990d877693e5310ae1eab6cb20ae0b0b9ac45b23b/coverage-7.10.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e28299d9f2e889e6d51b1f043f58d5f997c373cc12e6403b90df95b8b047c13e", size = 245754, upload-time = "2025-09-21T20:01:06.321Z" }, + { url = "https://files.pythonhosted.org/packages/b4/bc/25c83bcf3ad141b32cd7dc45485ef3c01a776ca3aa8ef0a93e77e8b5bc43/coverage-7.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4e16bd7761c5e454f4efd36f345286d6f7c5fa111623c355691e2755cae3b9e", size = 246860, upload-time = "2025-09-21T20:01:07.605Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b7/95574702888b58c0928a6e982038c596f9c34d52c5e5107f1eef729399b5/coverage-7.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b1c81d0e5e160651879755c9c675b974276f135558cf4ba79fee7b8413a515df", size = 244877, upload-time = "2025-09-21T20:01:08.829Z" }, + { url = "https://files.pythonhosted.org/packages/47/b6/40095c185f235e085df0e0b158f6bd68cc6e1d80ba6c7721dc81d97ec318/coverage-7.10.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:606cc265adc9aaedcc84f1f064f0e8736bc45814f15a357e30fca7ecc01504e0", size = 245108, upload-time = "2025-09-21T20:01:10.527Z" }, + { url = "https://files.pythonhosted.org/packages/c8/50/4aea0556da7a4b93ec9168420d170b55e2eb50ae21b25062513d020c6861/coverage-7.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10b24412692df990dbc34f8fb1b6b13d236ace9dfdd68df5b28c2e39cafbba13", size = 245752, upload-time = "2025-09-21T20:01:11.857Z" }, + { url = "https://files.pythonhosted.org/packages/6a/28/ea1a84a60828177ae3b100cb6723838523369a44ec5742313ed7db3da160/coverage-7.10.7-cp310-cp310-win32.whl", hash = "sha256:b51dcd060f18c19290d9b8a9dd1e0181538df2ce0717f562fff6cf74d9fc0b5b", size = 220497, upload-time = "2025-09-21T20:01:13.459Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1a/a81d46bbeb3c3fd97b9602ebaa411e076219a150489bcc2c025f151bd52d/coverage-7.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:3a622ac801b17198020f09af3eaf45666b344a0d69fc2a6ffe2ea83aeef1d807", size = 221392, upload-time = "2025-09-21T20:01:14.722Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5d/c1a17867b0456f2e9ce2d8d4708a4c3a089947d0bec9c66cdf60c9e7739f/coverage-7.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a609f9c93113be646f44c2a0256d6ea375ad047005d7f57a5c15f614dc1b2f59", size = 218102, upload-time = "2025-09-21T20:01:16.089Z" }, + { url = "https://files.pythonhosted.org/packages/54/f0/514dcf4b4e3698b9a9077f084429681bf3aad2b4a72578f89d7f643eb506/coverage-7.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:65646bb0359386e07639c367a22cf9b5bf6304e8630b565d0626e2bdf329227a", size = 218505, upload-time = "2025-09-21T20:01:17.788Z" }, + { url = "https://files.pythonhosted.org/packages/20/f6/9626b81d17e2a4b25c63ac1b425ff307ecdeef03d67c9a147673ae40dc36/coverage-7.10.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f33166f0dfcce728191f520bd2692914ec70fac2713f6bf3ce59c3deacb4699", size = 248898, upload-time = "2025-09-21T20:01:19.488Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ef/bd8e719c2f7417ba03239052e099b76ea1130ac0cbb183ee1fcaa58aaff3/coverage-7.10.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f5e3f9e455bb17831876048355dca0f758b6df22f49258cb5a91da23ef437d", size = 250831, upload-time = "2025-09-21T20:01:20.817Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b6/bf054de41ec948b151ae2b79a55c107f5760979538f5fb80c195f2517718/coverage-7.10.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da86b6d62a496e908ac2898243920c7992499c1712ff7c2b6d837cc69d9467e", size = 252937, upload-time = "2025-09-21T20:01:22.171Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e5/3860756aa6f9318227443c6ce4ed7bf9e70bb7f1447a0353f45ac5c7974b/coverage-7.10.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6b8b09c1fad947c84bbbc95eca841350fad9cbfa5a2d7ca88ac9f8d836c92e23", size = 249021, upload-time = "2025-09-21T20:01:23.907Z" }, + { url = "https://files.pythonhosted.org/packages/26/0f/bd08bd042854f7fd07b45808927ebcce99a7ed0f2f412d11629883517ac2/coverage-7.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4376538f36b533b46f8971d3a3e63464f2c7905c9800db97361c43a2b14792ab", size = 250626, upload-time = "2025-09-21T20:01:25.721Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a7/4777b14de4abcc2e80c6b1d430f5d51eb18ed1d75fca56cbce5f2db9b36e/coverage-7.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:121da30abb574f6ce6ae09840dae322bef734480ceafe410117627aa54f76d82", size = 248682, upload-time = "2025-09-21T20:01:27.105Z" }, + { url = "https://files.pythonhosted.org/packages/34/72/17d082b00b53cd45679bad682fac058b87f011fd8b9fe31d77f5f8d3a4e4/coverage-7.10.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:88127d40df529336a9836870436fc2751c339fbaed3a836d42c93f3e4bd1d0a2", size = 248402, upload-time = "2025-09-21T20:01:28.629Z" }, + { url = "https://files.pythonhosted.org/packages/81/7a/92367572eb5bdd6a84bfa278cc7e97db192f9f45b28c94a9ca1a921c3577/coverage-7.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba58bbcd1b72f136080c0bccc2400d66cc6115f3f906c499013d065ac33a4b61", size = 249320, upload-time = "2025-09-21T20:01:30.004Z" }, + { url = "https://files.pythonhosted.org/packages/2f/88/a23cc185f6a805dfc4fdf14a94016835eeb85e22ac3a0e66d5e89acd6462/coverage-7.10.7-cp311-cp311-win32.whl", hash = "sha256:972b9e3a4094b053a4e46832b4bc829fc8a8d347160eb39d03f1690316a99c14", size = 220536, upload-time = "2025-09-21T20:01:32.184Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ef/0b510a399dfca17cec7bc2f05ad8bd78cf55f15c8bc9a73ab20c5c913c2e/coverage-7.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:a7b55a944a7f43892e28ad4bc0561dfd5f0d73e605d1aa5c3c976b52aea121d2", size = 221425, upload-time = "2025-09-21T20:01:33.557Z" }, + { url = "https://files.pythonhosted.org/packages/51/7f/023657f301a276e4ba1850f82749bc136f5a7e8768060c2e5d9744a22951/coverage-7.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:736f227fb490f03c6488f9b6d45855f8e0fd749c007f9303ad30efab0e73c05a", size = 220103, upload-time = "2025-09-21T20:01:34.929Z" }, + { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload-time = "2025-09-21T20:01:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload-time = "2025-09-21T20:01:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload-time = "2025-09-21T20:01:39.617Z" }, + { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload-time = "2025-09-21T20:01:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload-time = "2025-09-21T20:01:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload-time = "2025-09-21T20:01:44.469Z" }, + { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload-time = "2025-09-21T20:01:45.915Z" }, + { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload-time = "2025-09-21T20:01:47.296Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload-time = "2025-09-21T20:01:48.73Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload-time = "2025-09-21T20:01:50.529Z" }, + { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload-time = "2025-09-21T20:01:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload-time = "2025-09-21T20:01:53.481Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload-time = "2025-09-21T20:01:55.2Z" }, + { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload-time = "2025-09-21T20:01:56.629Z" }, + { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload-time = "2025-09-21T20:01:58.203Z" }, + { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload-time = "2025-09-21T20:01:59.748Z" }, + { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload-time = "2025-09-21T20:02:01.192Z" }, + { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload-time = "2025-09-21T20:02:02.701Z" }, + { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload-time = "2025-09-21T20:02:04.185Z" }, + { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload-time = "2025-09-21T20:02:06.034Z" }, + { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload-time = "2025-09-21T20:02:07.619Z" }, + { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload-time = "2025-09-21T20:02:10.34Z" }, + { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload-time = "2025-09-21T20:02:12.122Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload-time = "2025-09-21T20:02:13.919Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload-time = "2025-09-21T20:02:15.57Z" }, + { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload-time = "2025-09-21T20:02:17.395Z" }, + { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload-time = "2025-09-21T20:02:18.936Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload-time = "2025-09-21T20:02:20.44Z" }, + { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload-time = "2025-09-21T20:02:22.313Z" }, + { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload-time = "2025-09-21T20:02:24.287Z" }, + { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload-time = "2025-09-21T20:02:26.133Z" }, + { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload-time = "2025-09-21T20:02:27.716Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload-time = "2025-09-21T20:02:29.216Z" }, + { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload-time = "2025-09-21T20:02:31.226Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload-time = "2025-09-21T20:02:32.823Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload-time = "2025-09-21T20:02:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload-time = "2025-09-21T20:02:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload-time = "2025-09-21T20:02:39.011Z" }, + { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload-time = "2025-09-21T20:02:40.939Z" }, + { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" }, + { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" }, + { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" }, + { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" }, + { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" }, + { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload-time = "2025-09-21T20:03:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload-time = "2025-09-21T20:03:03.4Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload-time = "2025-09-21T20:03:05.111Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" }, + { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" }, + { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" }, + { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload-time = "2025-09-21T20:03:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload-time = "2025-09-21T20:03:26.93Z" }, + { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload-time = "2025-09-21T20:03:28.672Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/d1c25053764b4c42eb294aae92ab617d2e4f803397f9c7c8295caa77a260/coverage-7.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fff7b9c3f19957020cac546c70025331113d2e61537f6e2441bc7657913de7d3", size = 217978, upload-time = "2025-09-21T20:03:30.362Z" }, + { url = "https://files.pythonhosted.org/packages/52/2f/b9f9daa39b80ece0b9548bbb723381e29bc664822d9a12c2135f8922c22b/coverage-7.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc91b314cef27742da486d6839b677b3f2793dfe52b51bbbb7cf736d5c29281c", size = 218370, upload-time = "2025-09-21T20:03:32.147Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6e/30d006c3b469e58449650642383dddf1c8fb63d44fdf92994bfd46570695/coverage-7.10.7-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:567f5c155eda8df1d3d439d40a45a6a5f029b429b06648235f1e7e51b522b396", size = 244802, upload-time = "2025-09-21T20:03:33.919Z" }, + { url = "https://files.pythonhosted.org/packages/b0/49/8a070782ce7e6b94ff6a0b6d7c65ba6bc3091d92a92cef4cd4eb0767965c/coverage-7.10.7-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af88deffcc8a4d5974cf2d502251bc3b2db8461f0b66d80a449c33757aa9f40", size = 246625, upload-time = "2025-09-21T20:03:36.09Z" }, + { url = "https://files.pythonhosted.org/packages/6a/92/1c1c5a9e8677ce56d42b97bdaca337b2d4d9ebe703d8c174ede52dbabd5f/coverage-7.10.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7315339eae3b24c2d2fa1ed7d7a38654cba34a13ef19fbcb9425da46d3dc594", size = 248399, upload-time = "2025-09-21T20:03:38.342Z" }, + { url = "https://files.pythonhosted.org/packages/c0/54/b140edee7257e815de7426d5d9846b58505dffc29795fff2dfb7f8a1c5a0/coverage-7.10.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:912e6ebc7a6e4adfdbb1aec371ad04c68854cd3bf3608b3514e7ff9062931d8a", size = 245142, upload-time = "2025-09-21T20:03:40.591Z" }, + { url = "https://files.pythonhosted.org/packages/e4/9e/6d6b8295940b118e8b7083b29226c71f6154f7ff41e9ca431f03de2eac0d/coverage-7.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f49a05acd3dfe1ce9715b657e28d138578bc40126760efb962322c56e9ca344b", size = 246284, upload-time = "2025-09-21T20:03:42.355Z" }, + { url = "https://files.pythonhosted.org/packages/db/e5/5e957ca747d43dbe4d9714358375c7546cb3cb533007b6813fc20fce37ad/coverage-7.10.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cce2109b6219f22ece99db7644b9622f54a4e915dad65660ec435e89a3ea7cc3", size = 244353, upload-time = "2025-09-21T20:03:44.218Z" }, + { url = "https://files.pythonhosted.org/packages/9a/45/540fc5cc92536a1b783b7ef99450bd55a4b3af234aae35a18a339973ce30/coverage-7.10.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:f3c887f96407cea3916294046fc7dab611c2552beadbed4ea901cbc6a40cc7a0", size = 244430, upload-time = "2025-09-21T20:03:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/75/0b/8287b2e5b38c8fe15d7e3398849bb58d382aedc0864ea0fa1820e8630491/coverage-7.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:635adb9a4507c9fd2ed65f39693fa31c9a3ee3a8e6dc64df033e8fdf52a7003f", size = 245311, upload-time = "2025-09-21T20:03:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/0c/1d/29724999984740f0c86d03e6420b942439bf5bd7f54d4382cae386a9d1e9/coverage-7.10.7-cp39-cp39-win32.whl", hash = "sha256:5a02d5a850e2979b0a014c412573953995174743a3f7fa4ea5a6e9a3c5617431", size = 220500, upload-time = "2025-09-21T20:03:50.024Z" }, + { url = "https://files.pythonhosted.org/packages/43/11/4b1e6b129943f905ca54c339f343877b55b365ae2558806c1be4f7476ed5/coverage-7.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:c134869d5ffe34547d14e174c866fd8fe2254918cc0a95e99052903bc1543e07", size = 221408, upload-time = "2025-09-21T20:03:51.803Z" }, + { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] + +[[package]] +name = "coverage" +version = "7.14.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/69/0d2ef01ff4b8fcecd4cba920d11e92fa4f96ae412441d3b56a90a258e69b/coverage-7.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e3680291c4a1d0dadfa84a2c459576a4af5133abb617905714339a0c73138cf", size = 219722, upload-time = "2026-05-26T20:38:14.002Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ae/9afdeaa31b9d9ce98124b6abf8bb49119bf71aecae04f8567c189d91299f/coverage-7.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5274669f37f2343635a347b91a60777621341ab3378e9c6ac9335eee704bddf", size = 220240, upload-time = "2026-05-26T20:38:17.424Z" }, + { url = "https://files.pythonhosted.org/packages/51/69/c998589871df7ea7dba865cc5ee32b5a3e1d47ba6c68ef91104c7c46fa5e/coverage-7.14.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfe5a5fec635799ef33428f1e5e61bafa45a92a96190ba731561ba558ccc214d", size = 246981, upload-time = "2026-05-26T20:38:19.266Z" }, + { url = "https://files.pythonhosted.org/packages/fc/10/1c7d04c13040dac531d21b712bbe08f902e6dd9b58f5d77875c4d030f8f2/coverage-7.14.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:62a9f70b52e0b5a95cfef4a5c5641b06983cadc5e538a3feeb5c00211f523ac2", size = 248812, upload-time = "2026-05-26T20:38:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/c1/65/2a38a4607ef27cadcfbcee034dba5830ae2569f90144a0f4c7dbf47d30b0/coverage-7.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c18ebc343e15be53049b3a2dce38fe82d58f37e20ab9094b3a39c0aa4f6bb47", size = 250675, upload-time = "2026-05-26T20:38:22.159Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a2/a446ed9752a4a59b79e0fb6cbb319f6facb2183045c0725462625e66f87e/coverage-7.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b84ffdf877644e7096aa936991efeed873f7f3df57b9cd001312b7668ab08550", size = 252590, upload-time = "2026-05-26T20:38:23.63Z" }, + { url = "https://files.pythonhosted.org/packages/9e/fd/e81fbd7ba752365546e9842b1cbdaad3d6919d2a522c590aef16a281ec5e/coverage-7.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e854312c4103f2ad4c0dc023b69b77ebfd2c89db5f86c4c94dc2353f9a92167e", size = 247691, upload-time = "2026-05-26T20:38:25.057Z" }, + { url = "https://files.pythonhosted.org/packages/53/35/f3c26fdaae9ea937d154ca4d372e5ea0a4167ff70d36c6074ac2eacb2f83/coverage-7.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c643734307300234fafa36bf2a040a7235f8f177ea1fd6ec1423aea6fb7b929f", size = 248716, upload-time = "2026-05-26T20:38:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/2e/14/940b6c49551fd343e8507ee2b0ba7af5d0aa04ed5bf768285cb7c72a9884/coverage-7.14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84ac9499e48700399a5dd0ea7085b5091961fec52c68d66b4ec0d3cf7f4441b1", size = 246721, upload-time = "2026-05-26T20:38:28.282Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2c/40fc0634186c28292a662dff578866b3913983d6c375a3c2a74020938719/coverage-7.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7f02d09f70776579b926d889a4c9c235070a1f47c40458aeaca563fae5acfdb5", size = 250533, upload-time = "2026-05-26T20:38:29.753Z" }, + { url = "https://files.pythonhosted.org/packages/de/e3/2c26bf1e811f9df991ff2a9bdddebdd13ee0665d564df7d05979f9146297/coverage-7.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ce66d8e46da2bb5ee313a745cbd2e391d319176c1f7a9451bfcd3a2fb920859b", size = 246990, upload-time = "2026-05-26T20:38:31.516Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b0/060260ef56bd92363ebdce0c7095ce422b06e69aae71828efeca473ab1ca/coverage-7.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c912c259304cfb5ee584481cfb7ce1ff932b4d61e6c9140b8f19cb7b5ed82332", size = 247593, upload-time = "2026-05-26T20:38:33.065Z" }, + { url = "https://files.pythonhosted.org/packages/63/f3/501502046efeb0d6d94b5ca54941d95f1184183dd6bdb7f283985783bb4a/coverage-7.14.1-cp310-cp310-win32.whl", hash = "sha256:1238cb94638e610e972c60dac68e813f868dc7d6e982535270558443058d9d59", size = 222330, upload-time = "2026-05-26T20:38:35.36Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5d/1bf99f2c558f128faf7906817ccbdb576ba815d3b41ce2ac1719b70a3663/coverage-7.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:fc459e5d73be2d6332fcfe8dbf3d8994671fe33c700f4565988ecfa511547253", size = 223261, upload-time = "2026-05-26T20:38:37.196Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d7/477ad149490e6cb849f28abea1dabb9c823cea72e7500c81b4240ce619c0/coverage-7.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:478b5bcd63c2e1357c5c7e16c070690df7b07f676b1c114d7b93e533c664309f", size = 219848, upload-time = "2026-05-26T20:38:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/91/82/a5eb47257c50601bb7b9a9d2857c67b7a3a85ad74180eb2c98bb1fbe0ce5/coverage-7.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a24a81f9715ee42ef59a316cc11611c98fe23920f7c81861315c9f3ff4a230f4", size = 220354, upload-time = "2026-05-26T20:38:40.232Z" }, + { url = "https://files.pythonhosted.org/packages/43/8b/78419b5391a5cb706b6544390507e469d83ffc9a8248b02c4011aceb9365/coverage-7.14.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:196a13319ad88d6d8ef5ab489ec4f44ddde2143c0c7d5b27786f6c3ffd56a7e1", size = 250771, upload-time = "2026-05-26T20:38:41.782Z" }, + { url = "https://files.pythonhosted.org/packages/77/63/e77aaacd491182210d639636b7a8bba23ffffa9b82aa3762da9431855fa9/coverage-7.14.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d452fd08b5c72c5167c93e6867b5c08500bd40f2a21e1e854a500550b6cc36f", size = 252683, upload-time = "2026-05-26T20:38:43.305Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/a022e3cfbec2ac241640003cb3a817e161d9c7f5aa9b49173756cdc03204/coverage-7.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23bf7fa51ac02e07fc7c96849b82946da47ae862dc8f86d183b2a4864fc38129", size = 254791, upload-time = "2026-05-26T20:38:45.361Z" }, + { url = "https://files.pythonhosted.org/packages/61/d6/967e408aca4c1ceb88cb0cc677169110ae7f5995fb5eaf5fb1f5a1bb8f5d/coverage-7.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcaa50684dcaadfa599ac48f81103c756d791cfd85c97203d2217c593d48b860", size = 256748, upload-time = "2026-05-26T20:38:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/b8/be/869188f7fe28638078ec479331ace6dc5f7b40b7153eb616f47ab79404d8/coverage-7.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ea1c034f95c9b056e856b794630b17f9fa3d57e4800ff1e503d3be0f9c9078c", size = 250907, upload-time = "2026-05-26T20:38:48.493Z" }, + { url = "https://files.pythonhosted.org/packages/07/aa/adb7d3b4278d690e68703abcd76ab1b948242e3668d921711551b78f9ddb/coverage-7.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e057326434e441306226fbeb5d1aaf14a2637efe97ba668306635835f32ad7", size = 252483, upload-time = "2026-05-26T20:38:50.074Z" }, + { url = "https://files.pythonhosted.org/packages/43/61/331c74103c62dcb0c4b9b3a0de9a61aca016208b0a90f109592a9f9ecc28/coverage-7.14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59baf88468dbc8d63b1887afd92bda52e40bb1561696e5819670601403810cec", size = 250545, upload-time = "2026-05-26T20:38:51.613Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b6/c5dae3c104d89be04828f61810e6b3473825482e4c288cc4ed04553e08ae/coverage-7.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d75f892b3ab73ba11cab5442cce7b3e168fd64162b16f0e1e0d09c508edef", size = 254310, upload-time = "2026-05-26T20:38:53.503Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a1/2b9d5863e3b83c01ad8199e3c597802fbb3a9dc90b058885804c20296d31/coverage-7.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3a56abc20a472baf0304c455721bc601477440d28ecfde8a03dde79ede07e0df", size = 250266, upload-time = "2026-05-26T20:38:55.414Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/0e511fbdb269359be26fe678a1c3fa1f2aa2a01573cc3f54268c8d6d4797/coverage-7.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a3cb83d1552c0cd1b4906655b6a33fd4a8473229633a901c6b73bf86914dee9", size = 251174, upload-time = "2026-05-26T20:38:57.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/10/e55307b622b3dd9671cb321824502dc10f93e72f2802b9946159a8edadeb/coverage-7.14.1-cp311-cp311-win32.whl", hash = "sha256:10274a1fbeb8ec5d72966e17bb198a3104257aca4ac09d98667c5f8aca8c8548", size = 222354, upload-time = "2026-05-26T20:38:58.727Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/107421693cfb71e4f1ca5bf70443f64d4161878068d07a3e51c7ad21d17b/coverage-7.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:87ebdf787d4888e3f3f2d523eadc6e18c6d18c6d0eb173801a189641627fb37e", size = 223290, upload-time = "2026-05-26T20:39:00.413Z" }, + { url = "https://files.pythonhosted.org/packages/b8/1d/3e3644585eb29e9dafefb19555078529a4d7cce12bd21929664eea989277/coverage-7.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:dd34767fa19848d35659ffc0a75314f58c7af3f1cd87ec521e8292a1238398a3", size = 221953, upload-time = "2026-05-26T20:39:02.159Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b7/bdbb725ba02c5b42825b200c940f38b7a54fcad24627b7192f78f8110d76/coverage-7.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a06c76364a9360e33d6d23769aefdf7f66f38e2ffb60ceb1baaa4989d83b695c", size = 220022, upload-time = "2026-05-26T20:39:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/de/72/de048c4a25e13bce59ac6a339351c10bdf2515e07459afcdaf04dc3143a2/coverage-7.14.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:84b535f00655ecafe1d929d1fb00ed5d6fa3051ea643ab2c161a3887b86f294b", size = 251888, upload-time = "2026-05-26T20:39:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, + { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, + { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/6f/ca6ad067364b337ef997802115e7ecad2abd2248b05471464b0dea02b4d4/coverage-7.14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e471bc5769ff073b058cfadb0d736b56ce067c8560eabeb0da88462df98c23e7", size = 251803, upload-time = "2026-05-26T20:39:17.537Z" }, + { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, + { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, + { url = "https://files.pythonhosted.org/packages/34/62/70a9024672a5f6910517d9628c52c9afbdd3cf8f46426af52bb148a56fff/coverage-7.14.1-cp312-cp312-win32.whl", hash = "sha256:4a28fd227808366b196a75476dced2eb35b351d6766ba9c858dc93319e87f4f1", size = 222567, upload-time = "2026-05-26T20:39:24.868Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e", size = 223372, upload-time = "2026-05-26T20:39:26.603Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ba/b44d472022f620d289d95fa830143235c0c36461c6f2437ea8d51e5481ed/coverage-7.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:99cd41ff91afd94896fea3bc002706b6ae4ce95727d06e4a0f39c0a8d8bd8b1a", size = 221989, upload-time = "2026-05-26T20:39:28.242Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9e/5f6d56327c62b185225d145191c607e07515294a0aa6338e58805cd4a5ac/coverage-7.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:be9f2c802dcfce3f71298303aa5dad0dce440a76c52f2f60dacd8656dab78793", size = 220044, upload-time = "2026-05-26T20:39:29.902Z" }, + { url = "https://files.pythonhosted.org/packages/75/92/e82aca356744cbbc0f77a0b623e38918c1872361963413a3bab5d0340393/coverage-7.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6223a72fd0e4c7156353ec0f08a5f93623e1d3034d0e2683b9bb8ea674131b1d", size = 220412, upload-time = "2026-05-26T20:39:31.561Z" }, + { url = "https://files.pythonhosted.org/packages/27/c9/385bde0bf7ed0f4bf3a7ee5367060a86b5d218718cfd6fb943c0f836b34f/coverage-7.14.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7279d2110a28cebc738b6459ecda2771735a4c18465fbbd36b3288fe5ed92247", size = 251412, upload-time = "2026-05-26T20:39:33.337Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/23faf6a2343a0d17f960a4bd56c43bc7eb4cf312f774dd6ceebd82c7d8fc/coverage-7.14.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9eeb3fcbc13ba40dfbdb22d01d196a28e9cef9ed4c29b60061a1e0e823a9929d", size = 254008, upload-time = "2026-05-26T20:39:35.009Z" }, + { url = "https://files.pythonhosted.org/packages/42/06/36f4aa9ca8a815e6036156e80706a67828bb97bd826948244f6996dda957/coverage-7.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f0cfc27c539f07cf5c0a4cfe211d0b6cae039f8f40526dbaa71944e64b50a7b", size = 255241, upload-time = "2026-05-26T20:39:36.71Z" }, + { url = "https://files.pythonhosted.org/packages/ca/79/95266316352f90f6b1c6736bb413302edfde2453fb32422d3911642691b3/coverage-7.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:221c70f316241a78e77e607c227cefc8808d4e08f28d99c04f35694690e940be", size = 257373, upload-time = "2026-05-26T20:39:38.412Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9c/58316d1f66c488b5fca8a0eb3e98348807813efa8a0d0833b9021be27488/coverage-7.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da028256b04ec30e5e0114b6f76172938c313991f0a2d3d894271315cf5d5e43", size = 251635, upload-time = "2026-05-26T20:39:40.268Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5a/ca2398a568e16fed7bb713e84ba3603a7164fb65779abe645c565ec890d5/coverage-7.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76a085d7005236a767e3426148b2c407e53ad61695c562f8a81da2d373324901", size = 253373, upload-time = "2026-05-26T20:39:42.145Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2c/0396562c32deaebe7be51d865b3a41e9a87d7561acafe1a28f53b07e019a/coverage-7.14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b553d04b5e778a8e56d57eb134aff42a92718ecba45e79c4764ecfa40efd92ff", size = 251341, upload-time = "2026-05-26T20:39:43.907Z" }, + { url = "https://files.pythonhosted.org/packages/fd/8f/a94f9221184c9cae1ee115820e3798e48b6b17777a9f19e46fb9a0c8dc74/coverage-7.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:46f714d2fb8ae2f4f29f23ada7f1e79b759fff5a70f94a1dac23af204c3ec9e4", size = 255497, upload-time = "2026-05-26T20:39:46.166Z" }, + { url = "https://files.pythonhosted.org/packages/71/69/505d70e47db1eaebcd002c39759707621ef184cd6b1ae084d9f41293f323/coverage-7.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1896f5e19ff3f0431c7ce2172adc54890fd97f86b59ced8ca1649145d9ffe35d", size = 251159, upload-time = "2026-05-26T20:39:48.03Z" }, + { url = "https://files.pythonhosted.org/packages/e0/aa/58681c383aa33a9d2ed40a02d7a22fbf780d1fa4d575396365777828198c/coverage-7.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:62fd185ef9df3c33d1c8178c5af105f762afbad96038de9a4ae100aa6297ca33", size = 252934, upload-time = "2026-05-26T20:39:49.872Z" }, + { url = "https://files.pythonhosted.org/packages/eb/fd/11c928cd6bdffc7074bb5965c173d9ebf517fb00205e1da524b98d29ef92/coverage-7.14.1-cp313-cp313-win32.whl", hash = "sha256:ab4af6352741a604c431c6072fce5bee33bf0f20dc7a56618d6bf6bb89e9810c", size = 222584, upload-time = "2026-05-26T20:39:51.68Z" }, + { url = "https://files.pythonhosted.org/packages/6f/92/fb416fc26d340dcba19518c418d6048e913186e17243982c5e435e41fa7a/coverage-7.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:7af486dabe8954d03b087f0021540897afe084f04e16ff5579e08cc46f871416", size = 223394, upload-time = "2026-05-26T20:39:53.472Z" }, + { url = "https://files.pythonhosted.org/packages/73/c6/02d56e3867972f77d5036de924643f26c056e848f00452cafb4dbc3c29b4/coverage-7.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:2224f89ffd0c5605ccce1ed7a584da162bc7c55f601ab1c946bc9de31a486b42", size = 222015, upload-time = "2026-05-26T20:39:55.374Z" }, + { url = "https://files.pythonhosted.org/packages/4d/9e/fcc77914050df73f7662fa1f00902774c79c075a8388ab334074574bf77e/coverage-7.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de286598cc65d2b489411174b1faec2f5a7775fb3201fd925db2a76b4030f37d", size = 220733, upload-time = "2026-05-26T20:39:57.189Z" }, + { url = "https://files.pythonhosted.org/packages/f7/67/2963cbdaf5cbadec44efa3a1e39eaa1f02df4079585f05387607a221e126/coverage-7.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:042c46ded7c288aeb07cf14a28b6c1e10b78fcba40171c3fa1e939377eeef0b5", size = 221086, upload-time = "2026-05-26T20:39:59.019Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/8701645574e11881f2f47d8930f98bc48b5d43b25eb5b4430dfc4a2f9f48/coverage-7.14.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f4ddbe407477f04c45115d1a4e5bc480f753553b534d338d4c3358b1cdd0ea52", size = 262381, upload-time = "2026-05-26T20:40:00.822Z" }, + { url = "https://files.pythonhosted.org/packages/7c/28/7a64d73598263e0c5abd5084211a8474488d31b3c552ff531c719dfcff62/coverage-7.14.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d13e6725992e2d2fd7d81d4f5241952d13740121dfd501da09201be39b2c003a", size = 264458, upload-time = "2026-05-26T20:40:02.506Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d8/4969179db9f7eb4df218e69540adf829d1c835f59452513d065d15446802/coverage-7.14.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f747dc8edcfe740130f28f32f3995e955494285717e86ee25af51db2219df08a", size = 266884, upload-time = "2026-05-26T20:40:04.421Z" }, + { url = "https://files.pythonhosted.org/packages/a6/78/a45d5794dbc9bafd97afc96a4377c86c7820d78b6cf51b89bc1d4e919275/coverage-7.14.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced2f09ef276fd58611a1ef502164ad266d2b75174e5a40cabbdb4033f9f6cf2", size = 268022, upload-time = "2026-05-26T20:40:06.298Z" }, + { url = "https://files.pythonhosted.org/packages/21/cb/4f5e354e9e3e67af96bd4e57113e6db6b22298c7168b13eec408a549903d/coverage-7.14.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b84800013769a78ccb9ef4659402e26d06867e337b61ec365f77ad008adea80e", size = 261631, upload-time = "2026-05-26T20:40:08.226Z" }, + { url = "https://files.pythonhosted.org/packages/ec/49/eced49af4cb996d5d8b7e94e736175c513e4facd3398507b89892b4326d8/coverage-7.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ea8cd6ca0ee9f616aaef3afc6882e32c2cbf18b00d96313ffd76af650574034d", size = 264443, upload-time = "2026-05-26T20:40:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/5603a88a7c5913a6b54f6cb1a8c46f7b39cbb30f27cd3f492908da09b2d7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:aa5e304a873fabddc11e484e9b6b738bd38bd7bed17b09aa84eecf5332e8b8bb", size = 262069, upload-time = "2026-05-26T20:40:11.999Z" }, + { url = "https://files.pythonhosted.org/packages/f0/59/2ae3cb79da554a06c8619d6c88ea19dd1e4aed4b834b6a83bb1fa243bdc5/coverage-7.14.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1c5215be81035e629d5bc756650634d0bf31991038db7a0eccb90f025ce16d", size = 265780, upload-time = "2026-05-26T20:40:13.858Z" }, + { url = "https://files.pythonhosted.org/packages/af/5f/b130c1dc999031f2648bd25317fbce505ad8d5562079b4ed81e736a84967/coverage-7.14.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:79058c47dae6788504b5effb319961bcd72d7240551464b91d474bc0ed186d69", size = 260970, upload-time = "2026-05-26T20:40:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/87/d1/ec13ccddeb48ec963bdfa72a11224bac2584bd045ba13beca82f8113e9c7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:370c5afae3fa0658e11694a32b24c2778f6bc2d17718121f94ee185e69f26b54", size = 263157, upload-time = "2026-05-26T20:40:18.382Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c2/cd91ead503045161092d3845f7bb95ea2f25131ce96d3e314dd835d91b9c/coverage-7.14.1-cp313-cp313t-win32.whl", hash = "sha256:3758dd0a7f1fa57365ef2e781df0f0731d38b6e3772259d13dae4bd8a958d4b1", size = 223259, upload-time = "2026-05-26T20:40:20.381Z" }, + { url = "https://files.pythonhosted.org/packages/71/9f/1e28d97e6bd2c76b07f38b7c02870f1371255ff6717f54eca578fcbbdd0e/coverage-7.14.1-cp313-cp313t-win_amd64.whl", hash = "sha256:6ff665fb023a77386fe11685190cee1f60a7d635994a30d9b0a061533d470fce", size = 224320, upload-time = "2026-05-26T20:40:22.316Z" }, + { url = "https://files.pythonhosted.org/packages/a9/e0/d936e908f0e1efa55e52b91e01b52f1055cef5e1ab2718493390ed8e2fb8/coverage-7.14.1-cp313-cp313t-win_arm64.whl", hash = "sha256:17a5a241e5997621a956a7f402a7433ef4221e5152809b785bec79e2323799f1", size = 222577, upload-time = "2026-05-26T20:40:24.894Z" }, + { url = "https://files.pythonhosted.org/packages/d6/34/fc2f101b151af3799a101f0550b0454aa008afdc0add677394ec4aa8ea10/coverage-7.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d5ed429d0b8edaac649e889b4ffcedb6c80b06629a3f93050e3dddfb99235bee", size = 220091, upload-time = "2026-05-26T20:40:27.249Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a7/1ebae2ab5b961b5c79bb09fe7b3ac99edb190d8be4a8c510b2cf66f46468/coverage-7.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8011224a62280e50dab346960c03cf47aca1a1e09e608c0fb33fd6e0cc8e9500", size = 220421, upload-time = "2026-05-26T20:40:30.084Z" }, + { url = "https://files.pythonhosted.org/packages/5e/90/92aca9cf0acc95123c96cd1eb1f08917897a7f5dee01e15738922971ec31/coverage-7.14.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:12c42ec1e14f553c4f817e989365982e646e27211f10a0f717855b94a79c8906", size = 251466, upload-time = "2026-05-26T20:40:32.542Z" }, + { url = "https://files.pythonhosted.org/packages/26/2b/78048cbe3b999f6cbf9cc0d90abba6a88a3e0863a8c1c6cbc762f3f8802f/coverage-7.14.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:06144cd511cf2624873a035c5069cf297144f6e77a73ee3d7a55b605ec5efb42", size = 253973, upload-time = "2026-05-26T20:40:34.473Z" }, + { url = "https://files.pythonhosted.org/packages/8e/21/c2e33b29d1cfde484a19d437afc343c6cd30b08d78cbbf9f5aff14e57b2b/coverage-7.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a311d8e1da24be5c1ccf85cbfb06315dbaa1703d5a1eab3f6432c72b837917c8", size = 255318, upload-time = "2026-05-26T20:40:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ee/aad2f108d63b769121005302f16bf66db8625c88ceaba466942e09a2607e/coverage-7.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c79cead5b5bc584d9c71451cb984d0e3a84e0c0937379c8efcbf27c8d661b851", size = 257633, upload-time = "2026-05-26T20:40:40.164Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f8/11a2c29b4fd76d9849f81d0bb812ec0017a9396df3217214e38934a8c837/coverage-7.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dcbf65f1f66a26cdd88c35cf68fb4729c5d1cd2e88added72420541dfb212034", size = 251488, upload-time = "2026-05-26T20:40:42.631Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b8/9a5820de4b8ac2b71d85e3b5fb49108d7469c665f0e2ad0dd7569023e305/coverage-7.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fd86572566fb40189a8260446158235159bc7a82dfbc87a3b39cf4fb57fcec1c", size = 253329, upload-time = "2026-05-26T20:40:45.208Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ff/f33e4823667e27548e8fd8df44217515303f9808d0ff29817db56f87d990/coverage-7.14.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7771b601718fdde84832c3a434ca9bbf4ae9adbc49d84198b4110700c3c77c36", size = 251291, upload-time = "2026-05-26T20:40:47.502Z" }, + { url = "https://files.pythonhosted.org/packages/68/9b/489db0ebb209054766b90a9014a45f6d26eb724c02ec21311c3733b5a644/coverage-7.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:39b21e212c55af06fa375e3dbf90a8a8e38792f3a910c580066d23563830ddd5", size = 255564, upload-time = "2026-05-26T20:40:49.372Z" }, + { url = "https://files.pythonhosted.org/packages/27/b5/16bc2d4c2409b23c7737edb68c83bc89e345f378050549fe1d75ac7d34d5/coverage-7.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f2302660e32562a532b442480121aef8aa61a5bdb20b30bf0adab29f10a5a4b4", size = 251107, upload-time = "2026-05-26T20:40:51.677Z" }, + { url = "https://files.pythonhosted.org/packages/7d/0c/2629997469a00cd069d588a41c9dc887610f2775ae89d250c4791e65272a/coverage-7.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:03a6f93c1ec3b7f2e77b5dbcc5573a2c21f12529a5c6bbe0f16f72303cc2fa4d", size = 252764, upload-time = "2026-05-26T20:40:54.267Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ee/f78d63c8f079e0d7211c7e2401fa17e311514534ba61bae03e4b287ce4ab/coverage-7.14.1-cp314-cp314-win32.whl", hash = "sha256:8a3ce026d73290f42f08dafecbd82c193a74df280461fbf97300fec51fd133ee", size = 222837, upload-time = "2026-05-26T20:40:56.496Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b9/be539854f93a70dfbeec69117f33ec70dc42ff0b65b5b07ab8d40d04228e/coverage-7.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:114c95ef29302423b87d159075805f4ab973254a2638a5d7d046c94887cc87d7", size = 223650, upload-time = "2026-05-26T20:40:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9e/24e2842fef40f35ac82ba3a7719c8023d011bf3bf652d0675316a9d088a1/coverage-7.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:a07891c3f4805442b31b71e84ba3cf29ed1aa9a428284e06deeb4b23e5b46343", size = 222218, upload-time = "2026-05-26T20:41:00.321Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1d/ac0a9df5fe31c1e8bdd658074905fc12844a05c1a7e3fdb8417e97c31e23/coverage-7.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1101a5ebb083aecb625ebb6209d4105b58f647b093cb2dc8122d7b33f743cfe1", size = 220822, upload-time = "2026-05-26T20:41:02.281Z" }, + { url = "https://files.pythonhosted.org/packages/32/cf/f964fd9aff20323f9f1a726c97135f8a76bcd87b92dad141a456a43f3c64/coverage-7.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:851b9e1e4e8a4608e77c79714b2e77c0970d2ed7202a05e92ae407817481887b", size = 221084, upload-time = "2026-05-26T20:41:04.593Z" }, + { url = "https://files.pythonhosted.org/packages/d8/5e/7e5ef2aba844de2b80d678619fcf0841b42e3f37f16411226f3fe4c1016f/coverage-7.14.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d5b89cdfb2ee051b71e8c3c70bd81a9eff81100f736a269136fe1a68efe00474", size = 262454, upload-time = "2026-05-26T20:41:06.641Z" }, + { url = "https://files.pythonhosted.org/packages/64/62/75809bded87015cc4935524218a2a8ed8dd1a8498bfed30a2f4f7a4b4d34/coverage-7.14.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0177614a0370f227888b4e436a7c55686d6a9f90eb1ade2b624ba685a1686e86", size = 264578, upload-time = "2026-05-26T20:41:08.556Z" }, + { url = "https://files.pythonhosted.org/packages/f3/42/d33392dc14633525012d2d504fa1a33b05538bf535f5c1d64675e5754b78/coverage-7.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d69af5dea2de76fc485a83032a630523f985198b7e25be901ec60181587b01e", size = 266981, upload-time = "2026-05-26T20:41:10.824Z" }, + { url = "https://files.pythonhosted.org/packages/2a/49/0157c4428c2aca7f1e09d5565930586fd5ae36f1655f08b0daa7cf1fcae1/coverage-7.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:35ab22d91de736e8966b980dc355cbcdd2c6dbbcfe275f9a2991bc8a91b3df65", size = 268112, upload-time = "2026-05-26T20:41:12.966Z" }, + { url = "https://files.pythonhosted.org/packages/96/26/86b9ce71f4092b1ed325ce1421698081df1286b833400b6836912834d6e0/coverage-7.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:357d4e32935c36588aaba057d734fa32428c360c9fc2e4442afbf1b646beee6e", size = 261558, upload-time = "2026-05-26T20:41:15Z" }, + { url = "https://files.pythonhosted.org/packages/20/4c/c311210c5472cf5401d8422b0d7812cdd520f24417673afabda6c323faca/coverage-7.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:51bd64741cc6fa065abd300ede1afe5a5291ece9c31da8b24884deda48bcc3f8", size = 264447, upload-time = "2026-05-26T20:41:17.369Z" }, + { url = "https://files.pythonhosted.org/packages/fb/71/59513f8710ed3e6b0ac0a050a5b7e977bb9c9e880354863b5d00d8809256/coverage-7.14.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9132cd363a68a4c3daa7c8704a654b1e39d3360f6f5b8ddd470608a945236c07", size = 262048, upload-time = "2026-05-26T20:41:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/bceed32dc494f5bbf50f775cd2e78ca814953942b5ea28d3c1c3ac316f14/coverage-7.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07c6290b1697b862c0478eab545eec949a0d0e4d6d03497f446d706da3b4f2de", size = 265781, upload-time = "2026-05-26T20:41:21.559Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c5/9348fe40dbfd4991aaf78df2c6c3098bfb2cc834d1fd362a64b4efef855a/coverage-7.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5ea0c297e27133853b4d8a3eb799bff5a2dbd9f2f41537a240d337ac9b4df890", size = 260896, upload-time = "2026-05-26T20:41:23.428Z" }, + { url = "https://files.pythonhosted.org/packages/ca/92/1ea0f03929da7cf87206b1fa24f4c8e9c158be0455481af29ec0a1f3503f/coverage-7.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:01b7733daad0237daa01ef80fe2dfceffc911e6a17fa7b55d14aa8214eaaaecd", size = 263214, upload-time = "2026-05-26T20:41:25.419Z" }, + { url = "https://files.pythonhosted.org/packages/f6/a9/b2493c054c0e01a643266742ab45e15744e60743f9260cd930c7142b1124/coverage-7.14.1-cp314-cp314t-win32.whl", hash = "sha256:6adc5a36984624a70bf11d7184e20fa0a49aa7c47ffab43804106a1a695ea22e", size = 223624, upload-time = "2026-05-26T20:41:27.795Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/3e1e6a57fccd2d7c83fcdf338e93ba98eb85c6e877dd34731ac585375490/coverage-7.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:ddf799247318f34dbcd2efa8c95a8d0642674e926bb1774cf9b63dfd2a389d1c", size = 224728, upload-time = "2026-05-26T20:41:30.098Z" }, + { url = "https://files.pythonhosted.org/packages/bb/d7/31066cf1d2f0c6c797fce911bcfa01dd35642dc6da992a950256097c5860/coverage-7.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:145986fe66647eb489f18d9a997567a3fd358584c4b5a808769113abc07466af", size = 222752, upload-time = "2026-05-26T20:41:32.123Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "zipp", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569, upload-time = "2023-06-18T21:44:35.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4/importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5", size = 22934, upload-time = "2023-06-18T21:44:33.441Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646, upload-time = "2023-01-07T11:08:11.254Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload-time = "2023-01-07T11:08:09.864Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433, upload-time = "2023-02-04T12:11:27.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695, upload-time = "2023-02-04T12:11:25.002Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "packaging" +version = "24.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/b5/b43a27ac7472e1818c4bafd44430e69605baefe1f34440593e0332ec8b4d/packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9", size = 147882, upload-time = "2024-03-10T09:39:28.33Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", size = 53488, upload-time = "2024-03-10T09:39:25.947Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pathspec" +version = "0.11.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/2a/bd167cdf116d4f3539caaa4c332752aac0b3a0cc0174cdb302ee68933e81/pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3", size = 47032, upload-time = "2023-07-29T01:05:04.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/2a/9b1be29146139ef459188f5e420a66e835dda921208db600b7037093891f/pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", size = 29603, upload-time = "2023-07-29T01:05:02.656Z" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + +[[package]] +name = "pathspec" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/28/e40d24d2e2eb23135f8533ad33d582359c7825623b1e022f9d460def7c05/platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731", size = 19914, upload-time = "2023-11-10T16:43:08.316Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/16/70be3b725073035aa5fc3229321d06e22e73e3e09f6af78dcfdf16c7636c/platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b", size = 17562, upload-time = "2023-11-10T16:43:06.949Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302, upload-time = "2024-09-17T19:06:50.688Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439, upload-time = "2024-09-17T19:06:49.212Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, +] + +[[package]] +name = "pluggy" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/42/8f2833655a29c4e9cb52ee8a2be04ceac61bcff4a680fb338cbd3d1e322d/pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3", size = 61613, upload-time = "2023-06-21T09:12:28.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/32/4a79112b8b87b21450b066e102d6608907f4c885ed7b04c3fdb085d4d6ae/pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", size = 17695, upload-time = "2023-06-21T09:12:27.397Z" }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "probing" +version = "0.2.5" +source = { editable = "." } + +[package.optional-dependencies] +dev = [ + { name = "black", version = "23.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "black", version = "24.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "black", version = "25.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "black", version = "26.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "coverage", version = "7.2.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "coverage", version = "7.14.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest", version = "7.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest-cov", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pytest-cov", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pytest-cov", version = "7.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "ruff" }, +] +test = [ + { name = "coverage", version = "7.2.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "coverage", version = "7.14.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest", version = "7.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytest-cov", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pytest-cov", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pytest-cov", version = "7.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] + +[package.metadata] +requires-dist = [ + { name = "black", marker = "python_full_version >= '3.8' and extra == 'dev'", specifier = ">=24.0" }, + { name = "black", marker = "python_full_version < '3.8' and extra == 'dev'", specifier = "<24.0" }, + { name = "coverage", marker = "extra == 'dev'", specifier = ">=7.0" }, + { name = "coverage", marker = "extra == 'test'", specifier = ">=7.0" }, + { name = "pytest", marker = "python_full_version >= '3.8' and extra == 'dev'", specifier = ">=8.0" }, + { name = "pytest", marker = "python_full_version >= '3.8' and extra == 'test'", specifier = ">=8.0" }, + { name = "pytest", marker = "python_full_version < '3.8' and extra == 'dev'", specifier = "<8.0" }, + { name = "pytest", marker = "python_full_version < '3.8' and extra == 'test'", specifier = "<8.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0" }, + { name = "pytest-cov", marker = "extra == 'test'", specifier = ">=4.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.1.0" }, +] +provides-extras = ["test", "dev"] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pytest" +version = "7.4.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.8' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.8'" }, + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, + { name = "iniconfig", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pluggy", version = "1.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", size = 1357116, upload-time = "2023-12-31T12:00:18.035Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/ff/f6e8b8f39e08547faece4bd80f89d5a8de68a38b2d179cc1c4490ffa3286/pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8", size = 325287, upload-time = "2023-12-31T12:00:13.963Z" }, +] + +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version == '3.8.*' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.8.*'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pluggy", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version == '3.9.*' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.9.*'" }, + { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pygments", marker = "python_full_version == '3.9.*'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "coverage", version = "7.2.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version < '3.8'" }, + { name = "pytest", version = "7.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/15/da3df99fd551507694a9b01f512a2f6cf1254f33601605843c3775f39460/pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", size = 63245, upload-time = "2023-05-24T18:44:56.845Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/4b/8b78d126e275efa2379b1c2e09dc52cf70df16fc3b90613ef82531499d73/pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a", size = 21949, upload-time = "2023-05-24T18:44:54.079Z" }, +] + +[[package]] +name = "pytest-cov" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version == '3.8.*'" }, + { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042, upload-time = "2024-03-24T20:16:34.856Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", size = 21990, upload-time = "2024-03-24T20:16:32.444Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version == '3.9.*'" }, + { name = "coverage", version = "7.14.1", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version >= '3.10'" }, + { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + +[[package]] +name = "pytokens" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/24/f206113e05cb8ef51b3850e7ef88f20da6f4bf932190ceb48bd3da103e10/pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5", size = 161522, upload-time = "2026-01-30T01:02:50.393Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e9/06a6bf1b90c2ed81a9c7d2544232fe5d2891d1cd480e8a1809ca354a8eb2/pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe", size = 246945, upload-time = "2026-01-30T01:02:52.399Z" }, + { url = "https://files.pythonhosted.org/packages/69/66/f6fb1007a4c3d8b682d5d65b7c1fb33257587a5f782647091e3408abe0b8/pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c", size = 259525, upload-time = "2026-01-30T01:02:53.737Z" }, + { url = "https://files.pythonhosted.org/packages/04/92/086f89b4d622a18418bac74ab5db7f68cf0c21cf7cc92de6c7b919d76c88/pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7", size = 262693, upload-time = "2026-01-30T01:02:54.871Z" }, + { url = "https://files.pythonhosted.org/packages/b4/7b/8b31c347cf94a3f900bdde750b2e9131575a61fdb620d3d3c75832262137/pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2", size = 103567, upload-time = "2026-01-30T01:02:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/3d/92/790ebe03f07b57e53b10884c329b9a1a308648fc083a6d4a39a10a28c8fc/pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440", size = 160864, upload-time = "2026-01-30T01:02:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/13/25/a4f555281d975bfdd1eba731450e2fe3a95870274da73fb12c40aeae7625/pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc", size = 248565, upload-time = "2026-01-30T01:02:59.912Z" }, + { url = "https://files.pythonhosted.org/packages/17/50/bc0394b4ad5b1601be22fa43652173d47e4c9efbf0044c62e9a59b747c56/pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d", size = 260824, upload-time = "2026-01-30T01:03:01.471Z" }, + { url = "https://files.pythonhosted.org/packages/4e/54/3e04f9d92a4be4fc6c80016bc396b923d2a6933ae94b5f557c939c460ee0/pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16", size = 264075, upload-time = "2026-01-30T01:03:04.143Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1b/44b0326cb5470a4375f37988aea5d61b5cc52407143303015ebee94abfd6/pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6", size = 103323, upload-time = "2026-01-30T01:03:05.412Z" }, + { url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", size = 160663, upload-time = "2026-01-30T01:03:06.473Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", size = 255626, upload-time = "2026-01-30T01:03:08.177Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", size = 269779, upload-time = "2026-01-30T01:03:09.756Z" }, + { url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", size = 268076, upload-time = "2026-01-30T01:03:10.957Z" }, + { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", size = 103552, upload-time = "2026-01-30T01:03:12.066Z" }, + { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, + { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, + { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, + { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, + { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, + { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, + { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/4a/08/968c22e06ab6570788964e2d5a702db9a3816e20ffde380b2b1385541d64/pytokens-0.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc", size = 154847, upload-time = "2026-01-30T01:03:32.268Z" }, + { url = "https://files.pythonhosted.org/packages/09/2b/2061bb4b300e6921f7968724b185237627a8a3dc4f311e34079dfadf9b65/pytokens-0.4.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009", size = 238610, upload-time = "2026-01-30T01:03:33.809Z" }, + { url = "https://files.pythonhosted.org/packages/1e/64/abf6e43523ea9b4aea69bfe22788a518806741107238674e5c0fb6fc8dc1/pytokens-0.4.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1", size = 252493, upload-time = "2026-01-30T01:03:35.715Z" }, + { url = "https://files.pythonhosted.org/packages/dc/fb/bcb6784c87d1de182afb284f37b07bc172eebec91ddc20e83aec767e4963/pytokens-0.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6", size = 255651, upload-time = "2026-01-30T01:03:36.961Z" }, + { url = "https://files.pythonhosted.org/packages/1a/0c/0c33752be2209498661903f6f240779aea5c9adbd85d22336ce3f7718e81/pytokens-0.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037", size = 104346, upload-time = "2026-01-30T01:03:38.069Z" }, + { url = "https://files.pythonhosted.org/packages/51/2a/f125667ce48105bf1f4e50e03cfa7b24b8c4f47684d7f1cf4dcb6f6b1c15/pytokens-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3", size = 161464, upload-time = "2026-01-30T01:03:39.11Z" }, + { url = "https://files.pythonhosted.org/packages/40/df/065a30790a7ca6bb48ad9018dd44668ed9135610ebf56a2a4cb8e513fd5c/pytokens-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1", size = 246159, upload-time = "2026-01-30T01:03:40.131Z" }, + { url = "https://files.pythonhosted.org/packages/a5/1c/fd09976a7e04960dabc07ab0e0072c7813d566ec67d5490a4c600683c158/pytokens-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db", size = 259120, upload-time = "2026-01-30T01:03:41.233Z" }, + { url = "https://files.pythonhosted.org/packages/52/49/59fdc6fc5a390ae9f308eadeb97dfc70fc2d804ffc49dd39fc97604622ec/pytokens-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1", size = 262196, upload-time = "2026-01-30T01:03:42.696Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e7/d6734dccf0080e3dc00a55b0827ab5af30c886f8bc127bbc04bc3445daec/pytokens-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a", size = 103510, upload-time = "2026-01-30T01:03:43.915Z" }, + { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/74/98/1295ad5a5aa9bc85bdcdfa5d82fe7b49c61af5657df4f227637ff9de0da6/ruff-0.15.18.tar.gz", hash = "sha256:2698a964c70e8bf402dcb99c8810472d270d141e7aa8c4e13599fd52033a2f33", size = 4761437, upload-time = "2026-06-18T18:25:39.224Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/d0/686e984941269621e2be72612d5c1e461f8f7b38415a2a7d7a81c8ae6715/ruff-0.15.18-py3-none-linux_armv6l.whl", hash = "sha256:8b6850172348c8381b8b3084c5915a4393c2373b9b54cd5b5e1ea15812bc10df", size = 10887308, upload-time = "2026-06-18T18:25:03.062Z" }, + { url = "https://files.pythonhosted.org/packages/ed/21/bc4123e3f5515ee99f8ce1eb93a14a0628fe4d1678663cd08f933ac16931/ruff-0.15.18-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3fccc153a85417dcd976883160cacce486997b0a0058dd18f54b8aaaac7d1ce2", size = 11281305, upload-time = "2026-06-18T18:25:30.026Z" }, + { url = "https://files.pythonhosted.org/packages/51/93/4769464c25cf7ab2acb3c7dda9cad3d867eb41c59565b3e2a9d17249c90c/ruff-0.15.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:08d4c86a68f2c3ec2c9d56380a71fb4a4f65373055cbb8caabd645e9102f38d4", size = 10641215, upload-time = "2026-06-18T18:25:15.802Z" }, + { url = "https://files.pythonhosted.org/packages/6c/42/56926d17120db2c208d76bf60a1a019644dd9e91dc27f0f95c9caddb1366/ruff-0.15.18-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37e5108745c2c0705da916d7d4de533ddf547051ef45f62888c31bae73f66318", size = 10957224, upload-time = "2026-06-18T18:25:36.955Z" }, + { url = "https://files.pythonhosted.org/packages/22/4f/d43fab8d8189afde803103022d000a8ef9f230616d436d52a8b2b8d63b50/ruff-0.15.18-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56949a6ce8b3abde54c0bcb22cebfe57e8771cadc84b407ae8b8eaf67ebdcd43", size = 10699024, upload-time = "2026-06-18T18:25:05.707Z" }, + { url = "https://files.pythonhosted.org/packages/63/42/1e3e4c68bd408b9768cf3e439acbe2c78245225faef253f7028a0cdb63e0/ruff-0.15.18-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01a754cd6a1b630d3f97e33eb452cf7a98040482318e870f8bc52a5a30e62657", size = 11491458, upload-time = "2026-06-18T18:25:20.275Z" }, + { url = "https://files.pythonhosted.org/packages/20/77/47a3484bea8521e14a203d98c389c5c97846675e4f02734672da4a69b52a/ruff-0.15.18-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ba7a07e03a44dbf10bb086ee06705b173625014ec99f73a7e6836a5e5590a0c", size = 12383752, upload-time = "2026-06-18T18:25:22.535Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ca/054159590787023d83b658a1a1819c4c8910114e7015069340b71c0961cb/ruff-0.15.18-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a2c40a41a4cadbcf5897b548ab29dfe248b20c540961c0247d98a3973c70403", size = 11577923, upload-time = "2026-06-18T18:25:10.702Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ff/d353d6b7bbd73cc0ec37f4463d7540e45e894338abdd9964eee0de332708/ruff-0.15.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f0480ce690cbb6c4db6e5d08f19fce98e10ba131a8b60c1bcdac42771e3ae2d", size = 11583925, upload-time = "2026-06-18T18:25:32.391Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4a/891f89b9c296ed3e5f3ece1a5629badc989d9a8fdaa30431aaf4774bc1c2/ruff-0.15.18-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2330215f1f393fa8733f55edce04fcf94c36a2c460fcde31f78cc84e4951e9b1", size = 11582834, upload-time = "2026-06-18T18:25:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/32/a3/ed9e370154bf85de360b93c03026157f02d4943b2d01ff4945f4429f8e8a/ruff-0.15.18-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6aa6a3d979e48ae617578183674bf264fbe7d0114a796a26bd678d67963c7ff", size = 10927328, upload-time = "2026-06-18T18:25:34.676Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d1/5cf5909329fedb5d39d555ee818ba5cf4638e1a301b89785d34f2905bfcb/ruff-0.15.18-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a81beadbbff2c9c245561ae3f77b16709d87f35eec650d0501679239d3449b22", size = 10693187, upload-time = "2026-06-18T18:25:08.245Z" }, + { url = "https://files.pythonhosted.org/packages/fd/44/ff6c635cf2c4f4e7b618b6640da057376baa36014695487d88aed4794268/ruff-0.15.18-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2186d9e940ae332ab293623a75b5f4fe49565f449954d50a72a046683aa6b809", size = 11208721, upload-time = "2026-06-18T18:25:41.327Z" }, + { url = "https://files.pythonhosted.org/packages/88/d9/5baa2a30861adfb7022cf33c1e35b2fc18085b08c16f83eff4c7b99a5f48/ruff-0.15.18-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5c2abf140438032bc77b2284a6c9944ecd8a19e5f1c7b52b1b8e4a0a80d19a7a", size = 11678599, upload-time = "2026-06-18T18:25:13.607Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1a/0725a7cfdc32ff769efb96ee782bec882e16448c5d9e3be947ec4c04ce27/ruff-0.15.18-py3-none-win32.whl", hash = "sha256:02299e6e9fa5b297a3f6d5d10d7bcd655c925b028bb8b9d4588214549c6b9ec4", size = 10901903, upload-time = "2026-06-18T18:25:24.755Z" }, + { url = "https://files.pythonhosted.org/packages/f3/51/805d9f6fb7970505c3504794a5ec350f605361b807fef4dcf214ebd35e72/ruff-0.15.18-py3-none-win_amd64.whl", hash = "sha256:dac80dc8d26b2257dbefabed62f5d255c3937b4ccb122da1fc634794fa3578b3", size = 12041189, upload-time = "2026-06-18T18:25:17.915Z" }, + { url = "https://files.pythonhosted.org/packages/29/4c/67bb45e41609eb4726f1bfeb59e083cf91d14c696d4bd14c234a980be93d/ruff-0.15.18-py3-none-win_arm64.whl", hash = "sha256:b2c9257fcbd4a3e5b977a1904e6facca016bafe2edc17df24db67cfaee03b4e4", size = 11329958, upload-time = "2026-06-18T18:25:43.686Z" }, +] + +[[package]] +name = "tomli" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164, upload-time = "2022-02-08T10:54:04.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757, upload-time = "2022-02-08T10:54:02.017Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typed-ast" +version = "1.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/7e/a424029f350aa8078b75fd0d360a787a273ca753a678d1104c5fa4f3072a/typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd", size = 252841, upload-time = "2023-07-04T18:38:08.524Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/07/5defe18d4fc16281cd18c4374270abc430c3d852d8ac29b5db6599d45cfe/typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b", size = 223267, upload-time = "2023-07-04T18:37:00.129Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5c/e379b00028680bfcd267d845cf46b60e76d8ac6f7009fd440d6ce030cc92/typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686", size = 208260, upload-time = "2023-07-04T18:37:03.069Z" }, + { url = "https://files.pythonhosted.org/packages/3b/99/5cc31ef4f3c80e1ceb03ed2690c7085571e3fbf119cbd67a111ec0b6622f/typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769", size = 842272, upload-time = "2023-07-04T18:37:04.916Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ed/b9b8b794b37b55c9247b1e8d38b0361e8158795c181636d34d6c11b506e7/typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04", size = 824651, upload-time = "2023-07-04T18:37:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/ca/59/dbbbe5a0e91c15d14a0896b539a5ed01326b0d468e75c1a33274d128d2d1/typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d", size = 854960, upload-time = "2023-07-04T18:37:08.474Z" }, + { url = "https://files.pythonhosted.org/packages/90/f0/0956d925f87bd81f6e0f8cf119eac5e5c8f4da50ca25bb9f5904148d4611/typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d", size = 839321, upload-time = "2023-07-04T18:37:10.417Z" }, + { url = "https://files.pythonhosted.org/packages/43/17/4bdece9795da6f3345c4da5667ac64bc25863617f19c28d81f350f515be6/typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02", size = 139380, upload-time = "2023-07-04T18:37:12.157Z" }, + { url = "https://files.pythonhosted.org/packages/75/53/b685e10da535c7b3572735f8bea0d4abb35a04722a7d44ca9c163a0cf822/typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee", size = 223264, upload-time = "2023-07-04T18:37:13.637Z" }, + { url = "https://files.pythonhosted.org/packages/96/fd/fc8ccf19fc16a40a23e7c7802d0abc78c1f38f1abb6e2447c474f8a076d8/typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18", size = 208158, upload-time = "2023-07-04T18:37:15.141Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9a/598e47f2c3ecd19d7f1bb66854d0d3ba23ffd93c846448790a92524b0a8d/typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88", size = 878366, upload-time = "2023-07-04T18:37:16.614Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/765e8bf8b24d0ed7b9fc669f6826c5bc3eb7412fc765691f59b83ae195b2/typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2", size = 860314, upload-time = "2023-07-04T18:37:18.215Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3c/4af750e6c673a0dd6c7b9f5b5e5ed58ec51a2e4e744081781c664d369dfa/typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9", size = 898108, upload-time = "2023-07-04T18:37:20.095Z" }, + { url = "https://files.pythonhosted.org/packages/03/8d/d0a4d1e060e1e8dda2408131a0cc7633fc4bc99fca5941dcb86c461dfe01/typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8", size = 881971, upload-time = "2023-07-04T18:37:21.912Z" }, + { url = "https://files.pythonhosted.org/packages/90/83/f28d2c912cd010a09b3677ac69d23181045eb17e358914ab739b7fdee530/typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b", size = 139286, upload-time = "2023-07-04T18:37:23.625Z" }, + { url = "https://files.pythonhosted.org/packages/d5/00/635353c31b71ed307ab020eff6baed9987da59a1b2ba489f885ecbe293b8/typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e", size = 222315, upload-time = "2023-07-04T18:37:36.008Z" }, + { url = "https://files.pythonhosted.org/packages/01/95/11be104446bb20212a741d30d40eab52a9cfc05ea34efa074ff4f7c16983/typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e", size = 793541, upload-time = "2023-07-04T18:37:37.614Z" }, + { url = "https://files.pythonhosted.org/packages/32/f1/75bd58fb1410cb72fbc6e8adf163015720db2c38844b46a9149c5ff6bf38/typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311", size = 778348, upload-time = "2023-07-04T18:37:39.332Z" }, + { url = "https://files.pythonhosted.org/packages/47/97/0bb4dba688a58ff9c08e63b39653e4bcaa340ce1bb9c1d58163e5c2c66f1/typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2", size = 809447, upload-time = "2023-07-04T18:37:41.017Z" }, + { url = "https://files.pythonhosted.org/packages/a8/cd/9a867f5a96d83a9742c43914e10d3a2083d8fe894ab9bf60fd467c6c497f/typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4", size = 796707, upload-time = "2023-07-04T18:37:42.625Z" }, + { url = "https://files.pythonhosted.org/packages/eb/06/73ca55ee5303b41d08920de775f02d2a3e1e59430371f5adf7fbb1a21127/typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431", size = 138403, upload-time = "2023-07-04T18:37:44.399Z" }, + { url = "https://files.pythonhosted.org/packages/19/e3/88b65e46643006592f39e0fdef3e29454244a9fdaa52acfb047dc68cae6a/typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a", size = 222951, upload-time = "2023-07-04T18:37:45.745Z" }, + { url = "https://files.pythonhosted.org/packages/15/e0/182bdd9edb6c6a1c068cecaa87f58924a817f2807a0b0d940f578b3328df/typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437", size = 208247, upload-time = "2023-07-04T18:37:47.28Z" }, + { url = "https://files.pythonhosted.org/packages/8d/09/bba083f2c11746288eaf1859e512130420405033de84189375fe65d839ba/typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede", size = 861010, upload-time = "2023-07-04T18:37:48.847Z" }, + { url = "https://files.pythonhosted.org/packages/31/f3/38839df509b04fb54205e388fc04b47627377e0ad628870112086864a441/typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4", size = 840026, upload-time = "2023-07-04T18:37:50.631Z" }, + { url = "https://files.pythonhosted.org/packages/45/1e/aa5f1dae4b92bc665ae9a655787bb2fe007a881fa2866b0408ce548bb24c/typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6", size = 875615, upload-time = "2023-07-04T18:37:52.27Z" }, + { url = "https://files.pythonhosted.org/packages/94/88/71a1c249c01fbbd66f9f28648f8249e737a7fe19056c1a78e7b3b9250eb1/typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4", size = 858320, upload-time = "2023-07-04T18:37:54.23Z" }, + { url = "https://files.pythonhosted.org/packages/12/1e/19f53aad3984e351e6730e4265fde4b949a66c451e10828fdbc4dfb050f1/typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b", size = 139414, upload-time = "2023-07-04T18:37:55.912Z" }, + { url = "https://files.pythonhosted.org/packages/b1/88/6e7f36f5fab6fbf0586a2dd866ac337924b7d4796a4d1b2b04443a864faf/typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10", size = 223329, upload-time = "2023-07-04T18:37:57.344Z" }, + { url = "https://files.pythonhosted.org/packages/71/30/09d27e13824495547bcc665bd07afc593b22b9484f143b27565eae4ccaac/typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814", size = 208314, upload-time = "2023-07-04T18:37:59.073Z" }, + { url = "https://files.pythonhosted.org/packages/07/3d/564308b7a432acb1f5399933cbb1b376a1a64d2544b90f6ba91894674260/typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8", size = 840900, upload-time = "2023-07-04T18:38:00.562Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f4/262512d14f777ea3666a089e2675a9b1500a85b8329a36de85d63433fb0e/typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274", size = 823435, upload-time = "2023-07-04T18:38:02.532Z" }, + { url = "https://files.pythonhosted.org/packages/a1/25/b3ccb948166d309ab75296ac9863ebe2ff209fbc063f1122a2d3979e47c3/typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a", size = 853125, upload-time = "2023-07-04T18:38:04.128Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/012da182242f168bb5c42284297dcc08dc0a1b3668db5b3852aec467f56f/typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba", size = 837280, upload-time = "2023-07-04T18:38:05.968Z" }, + { url = "https://files.pythonhosted.org/packages/30/bd/c815051404c4293265634d9d3e292f04fcf681d0502a9484c38b8f224d04/typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155", size = 139486, upload-time = "2023-07-04T18:38:07.249Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876, upload-time = "2023-07-02T14:20:55.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232, upload-time = "2023-07-02T14:20:53.275Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "zipp" +version = "3.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/27/f0ac6b846684cecce1ee93d32450c45ab607f65c2e0255f0092032d91f07/zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", size = 18454, upload-time = "2023-02-25T02:17:22.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047/zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556", size = 6758, upload-time = "2023-02-25T02:17:20.807Z" }, +] diff --git a/web/src/api/mod.rs b/web/src/api/mod.rs index 4c5e0c08..4d9a4a63 100644 --- a/web/src/api/mod.rs +++ b/web/src/api/mod.rs @@ -37,10 +37,7 @@ impl ApiClient { let response = reqwest::get(&url).await?; let status = response.status(); - let body = response - .text() - .await - .map_err(|e| AppError::Api(e.to_string()))?; + let body = response.text().await?; if !status.is_success() { if let Ok(value) = serde_json::from_str::(&body) { @@ -69,10 +66,7 @@ impl ApiClient { return Err(AppError::Api(format!("HTTP error: {}", response.status()))); } - response - .text() - .await - .map_err(|e| AppError::Api(e.to_string())) + Ok(response.text().await?) } /// Send GET request (public wrapper for agent / extensions). From ab25cfacd854faa3c7eed573a45225021fc70e78 Mon Sep 17 00:00:00 2001 From: Reiase Date: Mon, 29 Jun 2026 10:34:21 +0800 Subject: [PATCH 08/37] Harden mutex handling and enhance documentation for Probing (#53) * Harden cluster mutex handling and align docs with refactor reality. Use poison-safe lock_mutex in torchrun cluster paths, rewrite federation catalog prefixes via AST (with legacy fallback), update modularity docs for known boundary debt and torchrun vs Pulsing membership, soften README overhead claims, and track uv.lock while gitignoring generated bundled_web. Co-authored-by: Cursor * Enhance documentation and error handling for Probing - Added a new section on error handling and runtime practices in AGENTS.md, emphasizing clean error propagation and logging standards. - Updated README files to reflect the new focus on agent-native performance analysis and added details on using Probing with coding agents. - Improved navigation and structure in mkdocs.yml, including new entries for modularity, architecture, and CLI command tree. - Introduced WRITING.md to standardize documentation style and tone across the project. - Updated Cargo.toml to include new dependencies and features, enhancing overall functionality and integration capabilities. * fix lint errors --------- Co-authored-by: Cursor --- AGENTS.md | 28 +- Cargo.lock | 222 ++- Cargo.toml | 8 +- Makefile | 11 +- README.cn.md | 49 +- README.md | 51 +- docs/Makefile | 8 +- docs/README.md | 5 +- docs/mkdocs.yml | 69 +- docs/src/contributing.md | 1 + docs/src/contributing.zh.md | 1 + docs/src/design/architecture.md | 3 + docs/src/design/architecture.zh.md | 3 + docs/src/design/cli.md | 75 + docs/src/design/cli.zh.md | 163 ++ docs/src/design/distributed.md | 52 +- docs/src/design/distributed.zh.md | 49 +- docs/src/design/federation.md | 421 +++++- docs/src/design/federation.zh.md | 53 +- docs/src/design/hierarchical-fanout.md | 189 +++ docs/src/design/hierarchical-fanout.zh.md | 189 +++ docs/src/design/index.md | 77 +- docs/src/design/index.zh.md | 80 +- docs/src/design/training-phase.md | 13 + docs/src/guide/concepts.md | 9 +- docs/src/guide/concepts.zh.md | 6 +- docs/src/guide/index.md | 55 +- docs/src/guide/index.zh.md | 55 +- docs/src/index.md | 105 +- docs/src/index.zh.md | 100 +- docs/src/reference/env-vars.md | 2 + docs/src/reference/env-vars.zh.md | 32 + docs/src/reference/index.md | 2 +- docs/src/reference/index.zh.md | 4 +- docs/src/writing.md | 44 + probing/cli/src/cli/cluster.rs | 15 +- probing/cli/src/cli/commands.rs | 10 +- probing/cli/src/cli/ctrl.rs | 9 +- probing/cli/src/cli/help.rs | 177 +++ probing/cli/src/cli/mcp.rs | 90 ++ probing/cli/src/cli/mod.rs | 32 +- probing/cli/src/cli/skill/mod.rs | 10 +- probing/cli/src/cli/skill/runner.rs | 136 ++ probing/cli/src/lib.rs | 63 +- probing/core/src/core/cluster.rs | 153 ++ .../src/core/federation/aggregate_pushdown.rs | 61 +- .../src/core/federation/cluster_executor.rs | 156 +- .../core/src/core/federation/fanout_scope.rs | 97 ++ .../core/federation/federated_scan_exec.rs | 9 +- .../core/src/core/federation/global_table.rs | 3 +- probing/core/src/core/federation/mod.rs | 5 + .../python/src/features/stack_tracer.rs | 8 +- probing/server/API.md | 53 + probing/server/Cargo.toml | 5 +- probing/server/src/lib.rs | 4 + probing/server/src/mcp/helpers.rs | 161 ++ probing/server/src/mcp/mod.rs | 553 +++++++ probing/server/src/server/cluster_fanout.rs | 370 ++++- probing/server/src/server/cluster_query.rs | 15 +- probing/server/src/server/mod.rs | 5 + probing/server/src/server/spa.rs | 2 + probing/server/src/server/training.rs | 8 +- python/probing/__init__.py | 31 +- python/probing/bundled_skills/catalog.yaml | 54 + .../bundled_skills/crash_triage/SKILL.md | 25 + .../bundled_skills/crash_triage/steps.yaml | 28 + .../bundled_skills/health_overview/steps.yaml | 1 + .../bundled_skills/job_health/SKILL.md | 48 + .../bundled_skills/job_health/steps.yaml | 176 +++ .../persistent_straggler/SKILL.md | 45 + .../persistent_straggler/steps.yaml | 194 +++ .../bundled_skills/semantic/intents.yaml | 24 +- .../bundled_skills/semantic/pages.yaml | 8 +- .../bundled_skills/semantic/tables.yaml | 384 +++-- .../bundled_skills/slow_rank/steps.yaml | 1 + python/probing/profiling/torch_probe.py | 17 +- skills/catalog.yaml | 41 + skills/health_overview/steps.yaml | 1 + skills/job_health/SKILL.md | 48 + skills/job_health/steps.yaml | 176 +++ skills/persistent_straggler/SKILL.md | 45 + skills/persistent_straggler/steps.yaml | 194 +++ skills/semantic/intents.yaml | 24 +- skills/semantic/pages.yaml | 8 +- skills/slow_rank/steps.yaml | 1 + .../core/test_table_docs_integration.py | 63 +- tests/regression/rust/Cargo.toml | 4 + .../server/hierarchical_fanout_query.rs | 389 +++++ .../server/training_observability_tests.rs | 5 + tests/regression/skills/test_install_tools.py | 24 +- tests/unit/probing/skills/test_loader.py | 22 +- uv.lock | 1307 ----------------- 92 files changed, 5816 insertions(+), 2016 deletions(-) create mode 100644 docs/src/design/cli.md create mode 100644 docs/src/design/cli.zh.md create mode 100644 docs/src/design/hierarchical-fanout.md create mode 100644 docs/src/design/hierarchical-fanout.zh.md create mode 100644 docs/src/design/training-phase.md create mode 100644 docs/src/reference/env-vars.zh.md create mode 100644 docs/src/writing.md create mode 100644 probing/cli/src/cli/help.rs create mode 100644 probing/cli/src/cli/mcp.rs create mode 100644 probing/core/src/core/federation/fanout_scope.rs create mode 100644 probing/server/src/mcp/helpers.rs create mode 100644 probing/server/src/mcp/mod.rs create mode 100644 python/probing/bundled_skills/crash_triage/SKILL.md create mode 100644 python/probing/bundled_skills/crash_triage/steps.yaml create mode 100644 python/probing/bundled_skills/job_health/SKILL.md create mode 100644 python/probing/bundled_skills/job_health/steps.yaml create mode 100644 python/probing/bundled_skills/persistent_straggler/SKILL.md create mode 100644 python/probing/bundled_skills/persistent_straggler/steps.yaml create mode 100644 skills/job_health/SKILL.md create mode 100644 skills/job_health/steps.yaml create mode 100644 skills/persistent_straggler/SKILL.md create mode 100644 skills/persistent_straggler/steps.yaml create mode 100644 tests/regression/rust/probing/server/hierarchical_fanout_query.rs delete mode 100644 uv.lock diff --git a/AGENTS.md b/AGENTS.md index 0fab432d..24850595 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,6 +15,16 @@ Before adding code, read **`docs/src/design/modularity.md`** (中文: `modularit **Contracts:** `ProbeDataSource` (tables), `ProbeExtension` (config/HTTP), `@table` (Python data), `skills/*/steps.yaml` (workflows). Do not add cross-collector calls — use SQL JOINs. +## Error handling & runtime + +Keep the propagation chain clean — don't reintroduce scattered `map_err`/`inspect_err`. + +- **One error type per crate.** `probing/core` funnels everything into `EngineError` (`probing/core/src/core/error.rs`); app layers (`server`, `cli`) use `anyhow`. Prefer `?` with `#[from]`/`#[source]`; never add `From`, and don't `map_err` an error into a flat string (it drops the cause chain). Attach context with `anyhow::Context` (`.context` / `.with_context`). +- **One boundary conversion.** `EngineError → DataFusionError` lives in a single `From` impl; DataFusion trait impls just use `?` instead of hand-rolling `DataFusionError::Execution(format!(...))`. +- **`block_on` never fabricates data.** `probing_core::runtime::block_on` returns `Result` — on a degraded async bridge it returns `Err`, not an empty/`default` value. Surface it; for a diagnostics tool, a silent "no data" is worse than a clear failure. +- **No `unwrap`/`expect`/`panic!` on production paths.** Propagate with `?`. Exempt: tests and vendored py-spy bindings under `probing/extensions/python/src/features/spy/python_bindings/`. +- **Never pollute the host process's stdout.** Use `log` (Rust) / `logging` (Python), not `print!`/`println!`. Expected contention/busy states (e.g. a concurrent stack-trace request) belong at `debug`, not `error`. + ## Skills All diagnostic skills live under **`skills/`**. Each subdirectory contains: @@ -47,10 +57,24 @@ Requires a probed training process (`PROBING=1` or `probing -t inject`): ```bash probing skill list probing -t skill run health_overview +probing -t skill run job_health --global probing -t skill run slow_rank --global +probing -t skill run persistent_straggler --global probing -t skill run nccl_culprit_victim ``` +### MCP (coding agents) + +When the probing server is running (e.g. after `PROBING=1`), connect your agent to **`http://:/mcp`** (Streamable HTTP). + +**Read tools:** `query`, `describe_tables`, `list_skills`, `plan_skill`, `run_skill`, `list_cluster_nodes`, `cluster_query` + +**Write tools (opt-in):** `set_config`, `eval_python` — require `PROBING_MCP_ALLOW_WRITE=1` + +**Resources:** `probing://schema/catalog`, `probing://schema/{schema}/{table}` + +See `probing/server/API.md`. + From Python (e.g. in agent-generated scripts): ```python @@ -63,8 +87,10 @@ run_skill("health_overview", target="") | id | use when | |----|----------| | `health_overview` | first look / triage | +| `job_health` | job-level slowdown, step lag, cluster alive | | `training_hang` | stall or hang | -| `slow_rank` | straggler rank | +| `slow_rank` | straggler rank (current window) | +| `persistent_straggler` | chronic straggler (worst_fraction) | | `comm_bottleneck` | NCCL / collective slow | | `nccl_culprit_victim` | NCCL culprit/victim analysis | | `memory_leak` | GPU memory growth | diff --git a/Cargo.lock b/Cargo.lock index 66cb2e0a..4385f834 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -617,6 +617,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + [[package]] name = "chrono" version = "0.4.44" @@ -855,6 +866,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.4.2" @@ -1016,8 +1036,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -1034,13 +1064,37 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.117", +] + [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", "quote", "syn 2.0.117", ] @@ -1220,7 +1274,7 @@ dependencies = [ "log", "object_store", "parking_lot 0.12.3", - "rand", + "rand 0.9.1", "tokio", "url", ] @@ -1318,7 +1372,7 @@ dependencies = [ "log", "object_store", "parking_lot 0.12.3", - "rand", + "rand 0.9.1", "tempfile", "url", ] @@ -1380,7 +1434,7 @@ dependencies = [ "log", "memchr", "num-traits", - "rand", + "rand 0.9.1", "regex", "uuid", ] @@ -1692,7 +1746,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", "syn 2.0.117", @@ -1759,6 +1813,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3a5ccdfd6c5e7e2fea9c5cf256f2a08216047fab19c621c3da64e9ae4a1462d" +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.15.0" @@ -2076,6 +2136,7 @@ dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", + "rand_core 0.10.1", "wasip2", "wasip3", ] @@ -3115,6 +3176,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + [[package]] name = "pco" version = "0.4.2" @@ -3554,6 +3621,7 @@ dependencies = [ "nu-ansi-term", "once_cell", "probing-cc", + "probing-cli", "probing-core", "probing-gpu", "probing-memtable", @@ -3561,6 +3629,7 @@ dependencies = [ "probing-python", "probing-store", "procfs", + "rmcp", "serde", "serde_json", "serde_urlencoded", @@ -3708,6 +3777,17 @@ dependencies = [ "rand_core 0.9.3", ] +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.1", +] + [[package]] name = "rand_chacha" version = "0.9.0" @@ -3733,6 +3813,12 @@ dependencies = [ "getrandom 0.3.2", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "rand_xoshiro" version = "0.6.0" @@ -3800,6 +3886,26 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "regex" version = "1.12.3" @@ -3843,6 +3949,50 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rmcp" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1f571c72940a19d9532fe52dbea8bc9912bf1d766c2970bb824056b86f3f59" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bytes", + "chrono", + "futures", + "http", + "http-body", + "http-body-util", + "pastey", + "pin-project-lite", + "rand 0.10.1", + "rmcp-macros", + "schemars", + "serde", + "serde_json", + "sse-stream", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tokio-util", + "tower-service", + "tracing", + "uuid", +] + +[[package]] +name = "rmcp-macros" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aad0035b69380782d78ea95b508327e6deaa2235909053e596eea8f27b5e1d5" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.117", +] + [[package]] name = "rmesg" version = "1.0.21" @@ -3965,6 +4115,32 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "chrono", + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -4010,6 +4186,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "serde_json" version = "1.0.140" @@ -4064,7 +4251,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -4075,7 +4262,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -4189,6 +4376,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "sse-stream" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3962b63f038885f15bce2c6e02c0e7925c072f1ac86bb60fd44c5c6b762fb72" +dependencies = [ + "bytes", + "futures-util", + "http-body", + "http-body-util", + "pin-project-lite", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -4613,7 +4813,7 @@ dependencies = [ "http", "httparse", "log", - "rand", + "rand 0.9.1", "sha1", "thiserror 2.0.12", "utf-8", @@ -4630,7 +4830,7 @@ dependencies = [ "http", "httparse", "log", - "rand", + "rand 0.9.1", "sha1", "thiserror 2.0.12", "utf-8", diff --git a/Cargo.toml b/Cargo.toml index 33980206..dc464c53 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -89,7 +89,9 @@ default = ["extension-module", "gpu", "kmsg"] # "use-mimalloc", [dependencies] probing-core = { path = "probing/core" } -probing-server = { path = "probing/server", default-features = false } +probing-server = { path = "probing/server", default-features = false, features = [ + "rmcp", +] } probing-python = { path = "probing/extensions/python", default-features = false, features = [ "tracing", ] } @@ -119,8 +121,8 @@ split-debuginfo = "unpacked" codegen-units = 16 [profile.release] -opt-level = "z" # Optimize for size. +opt-level = "z" # Optimize for size. panic = "unwind" -strip = false # Automatically strip symbols from the binary. +strip = false # Automatically strip symbols from the binary. # lto = "thin" codegen-units = 16 diff --git a/Makefile b/Makefile index 283cc0f1..0197706f 100644 --- a/Makefile +++ b/Makefile @@ -207,7 +207,7 @@ PYTEST_WHEEL_FLAGS := --import-mode=importlib -o pythonpath= -o "addopts=--verbo PYTEST_WHEEL_EXTRA ?= .PHONY: test test-rust test-rust-unit test-rust-regression test-python test-python-unit test-python-regression test-doctest test-python-wheel coverage-python-wheel -.PHONY: fmt fmt-check lint lint-python lint-rust lint-core clippy clippy-fix coverage coverage-rust coverage-python bootstrap clean docs-install docs docs-serve docs-clean +.PHONY: fmt fmt-check lint lint-python lint-rust lint-docs lint-core clippy clippy-fix coverage coverage-rust coverage-python bootstrap clean docs-install docs docs-serve docs-clean test: test-rust test-python test-rust: test-rust-unit test-rust-regression @@ -244,7 +244,7 @@ test-python-wheel: venv install-wheel-test-deps coverage-python-wheel: $(MAKE) test-python-wheel PYTEST_WHEEL_EXTRA="--cov=probing --cov=tests --cov-report=xml:coverage.xml" -lint: lint-python lint-rust +lint: lint-python lint-rust lint-docs fmt: $(FMT_WORKSPACE) $(FMT_WEB) @@ -261,6 +261,13 @@ lint-python: lint-rust: $(CLIPPY_WORKSPACE) $(CLIPPY_WEB) +lint-docs: + @PY=$$(test -x $(VENV_PYTHON) && echo $(VENV_PYTHON) || echo $(PYTHON)); \ + if $$PY -c "import mkdocs" 2>/dev/null; then \ + cd docs && $$PY -m mkdocs build --strict; \ + else \ + echo "install docs deps: make docs-install"; exit 1; \ + fi clippy: lint-rust clippy-fix: cargo clippy --workspace --all-targets --no-default-features --fix --allow-dirty --allow-staged $(CLIPPY_DENY) diff --git a/README.cn.md b/README.cn.md index bef326ac..7cbbda39 100644 --- a/README.cn.md +++ b/README.cn.md @@ -1,4 +1,4 @@ -# Probing - AI应用性能分析和调试工具 +# Probing — Agent Native 的分布式性能分析与诊断工具
Probing Logo @@ -14,9 +14,28 @@ [![Downloads](https://pepy.tech/badge/probing)](https://pepy.tech/project/probing) [![codecov](https://codecov.io/gh/DeepLink-org/probing/graph/badge.svg?token=IRH3F0OI56)](https://codecov.io/gh/DeepLink-org/probing) -> 揭开AI应用性能的真相 +> **让你的 coding agent 长出看穿分布式训练的眼睛和手。** +> +> 揭开 AI 应用性能的真相。 -Probing是一个专为AI应用设计的运行时性能分析和调试工具。基于动态探针注入技术,它提供零侵入的运行时内省能力,支持SQL查询的性能指标和跨节点关联分析。 +Probing 是一个面向分布式 AI 的 **Agent Native 性能分析与诊断工具**。它不产出给人盯着看的火焰图,而是把正在运行的训练任务变成 **可查询、可动手的证据**——agent(或你)可以 `SELECT`、join、并据此操作的关系型遥测。 + +它**从系统层做起**:免插桩探针注入、SQL 化遥测、NCCL 等待分解、跨节点联邦——数据天生是给 agent 消费的结构,而不只是给人阅读的图表。 + +而且它不是又一个 AI 助手。Probing **嵌进你已经在用的 coding agent**——Codex、Claude Code、Cursor——做它们看穿分布式训练所需的眼睛和手。Skills 提供诊断 playbook;训练进程内的 HTTP server 还在 **`/mcp`** 暴露 MCP tools(`query`、`list_skills`、`plan_skill`、`run_skill`)。 + +## Probing 如何与你的 agent 协作 + +Probing 为你的 coding agent 提供一个对运行中训练任务的闭环诊断回路: + +1. **观测** — 用 SQL 查询活体遥测(`python.torch_trace`、`nccl.proxy_ops`、`gpu.utilization` …)。 +2. **诊断** — 运行结构化 **skill**(`health_overview`、`slow_rank`、`nccl_culprit_victim` …),把 SQL 证据转成确定性结论。 +3. **动手** — 在不停止任务的前提下干预活体进程(`eval`、`config`、inject)。 +4. **复查** — 再次查询,确认问题已解决。 + +护城河在底下的系统层——活体注入、关系型遥测、NCCL 等待分解、跨节点联邦——这些是套壳工具伪造不出来的部分;agent 集成只是触达它的方式:`./skills/install.sh` 让 Probing 的 skill 在 `.cursor/`、`.claude/`、`.agents/` 中可被发现。 + +> **安全边界:** MCP 默认**只读**——`query` / `cluster_query` 仅接受 `SELECT`/`WITH`/`SHOW`/`DESCRIBE`,且结果有大小上限。干预类工具(`set_config`、`eval_python`)虽已暴露,但**需显式设置 `PROBING_MCP_ALLOW_WRITE=1` 才启用**,且每次写入都有审计日志。这样 agent 能放手诊断,只有在你明确授权时才可改动正在运行的训练任务。 ## Probing 提供什么... @@ -79,6 +98,30 @@ probing $ENDPOINT eval "import torch; print(f'GPU available: {torch.cuda.is_avai probing $ENDPOINT query "SELECT func, file, lineno FROM python.backtrace LIMIT 5" ``` +### 在你的 coding agent 里使用 + +```bash +# 让 Probing 的诊断 skill 对 Cursor / Claude Code / Codex 可见 +./skills/install.sh +``` + +或通过 **MCP** 接入你的 agent——把它指向 probing server 的 `/mcp` 端点: + +```json +{ + "mcpServers": { + "probing": { "url": "http://127.0.0.1:8080/mcp" } + } +} +``` + +然后用自然语言问你的 agent——"这个训练好像卡住了,帮我找慢的 rank"——它会替你驱动 Probing 的 skill 和 SQL(直接调用,或经由 `run_skill` / `query` 这些 MCP 工具): + +```bash +probing -t skill run health_overview +probing -t skill run nccl_culprit_victim --global +``` + ## 核心功能 - **动态探针注入** - 运行时检测,无需目标应用修改 diff --git a/README.md b/README.md index 23aa65ab..60e013fd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Probing - Dynamic Performance Profiler for Distributed AI +# Probing — Agent-Native Performance Analysis & Diagnosis for Distributed AI
Probing Logo @@ -14,9 +14,28 @@ [![Downloads](https://pepy.tech/badge/probing)](https://pepy.tech/project/probing) [![codecov](https://codecov.io/gh/DeepLink-org/probing/graph/badge.svg?token=IRH3F0OI56)](https://codecov.io/gh/DeepLink-org/probing) -> Uncover the Hidden Truth of AI Performance +> **Give your coding agent eyes and hands inside distributed training.** +> +> Uncover the hidden truth of AI performance. -Probing is a production-grade performance profiler designed specifically for distributed AI workloads. Built on dynamic probe injection technology, it delivers **minimal-overhead** runtime introspection—lock-free mmap writes on the hot path, background sampling—with SQL-queryable performance metrics and cross-node correlation analysis. +Probing is an **Agent-Native performance analysis & diagnosis tool** for distributed AI. Instead of producing flamegraphs for humans to squint at, it turns a live training job into **queryable, actionable evidence**—relational telemetry that an agent (or you) can `SELECT`, join, and act on. + +It's built **from the system layer up**: zero-instrumentation probe injection, SQL-queryable telemetry, NCCL wait decomposition, and cross-node federation—so the data is structured for an agent to consume, not just for a human to read. + +And it isn't yet another AI assistant. Probing **plugs into the coding agents you already use**—Codex, Claude Code, Cursor—becoming the eyes and hands they need to see inside distributed training. Skills supply diagnostic playbooks; the in-process HTTP server also exposes MCP tools at **`/mcp`** (`query`, `list_skills`, `plan_skill`, `run_skill`). + +## How Probing works with your agent + +Probing gives your coding agent a closed diagnostic loop over a running training job: + +1. **Observe** — query live telemetry with SQL (`python.torch_trace`, `nccl.proxy_ops`, `gpu.utilization`, …). +2. **Diagnose** — run structured **skills** (`health_overview`, `slow_rank`, `nccl_culprit_victim`, …) that turn SQL evidence into deterministic findings. +3. **Act** — intervene in the live process (`eval`, `config`, inject) without stopping the job. +4. **Verify** — re-query to confirm the fix. + +The moat is the system layer underneath—live injection, relational telemetry, NCCL wait decomposition, cross-node federation—the parts a thin wrapper can't fake. The agent integration is how you reach it: `./skills/install.sh` makes Probing's skills discoverable inside `.cursor/`, `.claude/`, and `.agents/`. + +> **Safety:** the MCP surface is **read-only by default**—`query` / `cluster_query` accept only `SELECT`/`WITH`/`SHOW`/`DESCRIBE` with bounded result sizes. Intervention tools (`set_config`, `eval_python`) are exposed but **disabled unless you set `PROBING_MCP_ALLOW_WRITE=1`**, and every write is audit-logged. So an agent can diagnose freely, and can only mutate a live training job when you explicitly opt in. ### What probing delivers... @@ -73,13 +92,37 @@ probing -t inject probing -t backtrace ``` +### Use it from your coding agent + +```bash +# Make Probing's diagnostic skills discoverable to Cursor / Claude Code / Codex +./skills/install.sh +``` + +Or connect your agent over **MCP**—point it at the probing server's `/mcp` endpoint: + +```json +{ + "mcpServers": { + "probing": { "url": "http://127.0.0.1:8080/mcp" } + } +} +``` + +Then ask your agent in plain language—"this run looks stuck, find the slow rank"—and it drives Probing's skills and SQL for you (directly, or via the `run_skill` / `query` MCP tools): + +```bash +probing -t skill run health_overview +probing -t skill run nccl_culprit_victim --global +``` + ## Core Features - **Dynamic Probe Injection** - Runtime instrumentation without target application modification - **Distributed Performance Aggregation** - Cross-node data collection with unified correlation analysis - **SQL Analytics Interface** - Apache DataFusion-powered query engine with standard SQL syntax - **Interactive Python REPL** - Live debugging and variable inspection in running processes -- **Production-Grade Overhead** - Efficient sampling strategies maintaining <1% performance impact +- **Low-Overhead by Design** - Lock-free mmap hot path and background sampling to minimize impact on the training job - **Time-Series Storage** - Columnar data storage with configurable compression and retention - **Real-Time Introspection** - Live performance metrics and runtime stack trace analysis - **Advanced CLI** - Comprehensive command-line interface with process monitoring and management diff --git a/docs/Makefile b/docs/Makefile index 5446b335..7f115b38 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -2,7 +2,7 @@ PYTHON ?= $(shell test -x ../.venv/bin/python && echo ../.venv/bin/python || echo python3) -.PHONY: help install serve build clean deploy +.PHONY: help install serve build lint clean deploy # Default target help: @@ -12,6 +12,7 @@ help: @echo " make install Install documentation dependencies" @echo " make serve Start live preview server with auto-reload" @echo " make build Build static documentation site" + @echo " make lint Check links and build (--strict)" @echo " make clean Remove built documentation" @echo " make deploy Deploy to GitHub Pages" @@ -31,6 +32,11 @@ build: @echo "Building documentation..." mkdocs build +# Strict build (broken links fail) — used by root `make lint` +lint: + @echo "Linting documentation (mkdocs --strict)..." + $(PYTHON) -m mkdocs build --strict + # Clean build artifacts clean: @echo "Cleaning build artifacts..." diff --git a/docs/README.md b/docs/README.md index ad6832ed..f3108951 100644 --- a/docs/README.md +++ b/docs/README.md @@ -58,7 +58,10 @@ docs/ ## Writing Documentation -- All documentation is written in Markdown +See **[src/writing.md](src/writing.md)** for tone and structure (logical / technical narrative; +avoid product and persona routing). + +All documentation is written in Markdown - Use [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/reference/) extensions - Admonitions, code blocks with copy button, and Mermaid diagrams are supported diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 326d98bb..f13c7e9a 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -82,40 +82,47 @@ plugins: Home: 首页 Getting Started: 入门 Installation: 安装指南 - Development Setup: 开发环境 - Welcome Contributors: 欢迎参与开发 - Welcome: 欢迎参与 - Submitting Changes: 提交变更 Quick Start: 快速开始 + Core model: 核心模型 User Guide: 用户指南 - Core Concepts: 核心概念 SQL Analytics: SQL 分析 Diagnostic Skills: 诊断 Skill Memory Analysis: 内存分析 - Debugging: 调试指南 + Live Debugging: 现场调试 Troubleshooting: 常见问题 - Design: 设计文档 - Architecture: 系统架构 + Architecture: 架构 + Platform: 平台核心 + Collectors & Profiling: 采集与 Profiling + Distributed: 分布式 + Modularity & Boundaries: 模块化与边界 Data Layer: 数据层 + Extensibility: 扩展机制 + CLI Command Tree: CLI 命令树 Profiling: 性能分析 - Distributed: 分布式 + NCCL Profiler: NCCL Profiler + Debugging Engine: 调试引擎 + Training Phases: 训练阶段 + Overview: 概览 Torchrun Cluster Heartbeat: torchrun 集群心跳 Federated Query Engine: 联邦查询引擎 + Hierarchical Fan-out: 分层集群查询 Cluster with Pulsing: 基于 Pulsing 的集群 - Extensibility: 扩展机制 - Modularity: 模块化与边界 + System Architecture (legacy): 系统架构(旧版) Examples: 示例 Training Debugging: 训练调试 Memory Leak: 内存泄漏 Performance Analysis: 性能分析 - API Reference: API 参考 Reference: 参考手册 SQL Tables: SQL 表目录 - API Reference: API 参考 + CLI & Python API: CLI 与 Python API Environment Variables: 环境变量 Skill Format: Skill 格式规范 Versions: 版本兼容性 Contributing: 贡献指南 + Development Setup: 开发环境 + Welcome Contributors: 欢迎参与开发 + Welcome: 欢迎参与 + Submitting Changes: 提交变更 - mkdocstrings: handlers: python: @@ -131,27 +138,33 @@ nav: - Getting Started: - Installation: installation.md - Quick Start: quickstart.md - - Core Concepts: guide/concepts.md + - Core model: guide/concepts.md - User Guide: - guide/index.md - SQL Analytics: guide/sql-analytics.md - Diagnostic Skills: guide/skills.md - Memory Analysis: guide/memory-analysis.md - - Debugging: guide/debugging.md + - Live Debugging: guide/debugging.md - Troubleshooting: guide/troubleshooting.md - - Design: + - Architecture: - design/index.md - - Modularity: design/modularity.md - - Architecture: design/architecture.md - - Data Layer: design/data-layer.md - - Profiling: design/profiling.md - - Debugging: design/debugging.md - - Distributed: design/distributed.md - - Torchrun Cluster Heartbeat: design/torchrun-cluster.md - - Federated Query Engine: design/federation.md - - NCCL Profiler: design/nccl-profiler.md - - Cluster with Pulsing: design/cluster-pulsing.md - - Extensibility: design/extensibility.md + - Platform: + - Modularity & Boundaries: design/modularity.md + - Data Layer: design/data-layer.md + - Extensibility: design/extensibility.md + - CLI Command Tree: design/cli.md + - Collectors & Profiling: + - Profiling: design/profiling.md + - NCCL Profiler: design/nccl-profiler.md + - Debugging Engine: design/debugging.md + - Training Phases: design/training-phase.md + - Distributed: + - Overview: design/distributed.md + - Torchrun Cluster Heartbeat: design/torchrun-cluster.md + - Federated Query Engine: design/federation.md + - Hierarchical Fan-out: design/hierarchical-fanout.md + - Cluster with Pulsing: design/cluster-pulsing.md + - System Architecture (legacy): design/architecture.md - Examples: - examples/index.md - Training Debugging: examples/training-debugging.md @@ -160,7 +173,7 @@ nav: - Reference: - reference/index.md - SQL Tables: reference/sql-tables.md - - API Reference: api-reference.md + - CLI & Python API: api-reference.md - Environment Variables: reference/env-vars.md - Skill Format: reference/skill-format.md - Versions: versions.md diff --git a/docs/src/contributing.md b/docs/src/contributing.md index 5a89bcc2..28246765 100644 --- a/docs/src/contributing.md +++ b/docs/src/contributing.md @@ -9,6 +9,7 @@ Thank you for contributing to Probing. This document is the **canonical developm | Daily dev bootstrap | [Development setup](#development-setup) | | Agent diagnostic skills | [Skills & agents](#skills-agents) + [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | | PR / style / conduct | [Submitting changes](#submitting-changes) | +| Documentation tone | [writing.md](writing.md) | ## Welcome — get started {#getting-started} diff --git a/docs/src/contributing.zh.md b/docs/src/contributing.zh.md index 99e39039..cbf71d7b 100644 --- a/docs/src/contributing.zh.md +++ b/docs/src/contributing.zh.md @@ -9,6 +9,7 @@ | 日常开发 bootstrap | [开发环境](#development-setup) | | Agent 诊断 skill | [Skills 与 Agent](#skills-agents) + [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md) | | PR / 规范 / 行为准则 | [提交变更](#submitting-changes) | +| 文档风格 | [writing.md](writing.md) | ## 欢迎参与开发 {#getting-started} diff --git a/docs/src/design/architecture.md b/docs/src/design/architecture.md index 49d5379c..f30ba58a 100644 --- a/docs/src/design/architecture.md +++ b/docs/src/design/architecture.md @@ -1,5 +1,8 @@ # System Architecture +!!! warning "Legacy document" + This two-layer overview is **superseded** by **[Modularity & Boundaries](modularity.md)** (four-layer model, crate map, dependency rules, and ownership). It is kept for historical diagrams only. **New contributors should start with [Modularity](modularity.md)**, then [Data Layer](data-layer.md) and [Distributed overview](distributed.md). + Probing is designed as a simple two-layer structure to minimize complexity and deployment difficulty. ## High-Level Architecture diff --git a/docs/src/design/architecture.zh.md b/docs/src/design/architecture.zh.md index 40eb15c4..52010860 100644 --- a/docs/src/design/architecture.zh.md +++ b/docs/src/design/architecture.zh.md @@ -1,5 +1,8 @@ # 系统架构 +!!! warning "旧版文档" + 本页的两层概览已被 **[模块化与边界](modularity.zh.md)**(四层模型、crate 地图、依赖规则与归属)**取代**。仅保留历史示意图。**新贡献者请从 [模块化](modularity.zh.md)** 入手,再读 [数据层](data-layer.zh.md) 与 [分布式概览](distributed.zh.md)。 + Probing 采用简洁的两层架构设计,以最小化复杂性和部署难度。 ## 高层架构 diff --git a/docs/src/design/cli.md b/docs/src/design/cli.md new file mode 100644 index 00000000..fa7c12c1 --- /dev/null +++ b/docs/src/design/cli.md @@ -0,0 +1,75 @@ +# CLI command tree + +**Status:** draft · **SSOT** for grouping and migration · Code: `probing/cli/src/cli/{commands,help,mod}.rs` + +**Legend:** `T` = `-t/--target` · `*` = needs T · `—` = no T · `L` = Linux only · `H` = hidden + +--- + +## Principle: flat invocation, grouped help + +| Dimension | Rule | +|-----------|------| +| **Invocation** | Single-level: `probing [-v] [-t T] [args…]` | +| **Help** | `probing --help` grouped under Processes / Analyze / Diagnose / Runtime / Agent | +| **Consolidation** | Merge `cluster query` → `query --global`; `cluster nodes` → top-level `nodes` (TBD) | +| **Exceptions** | `skill` keeps subcommands; `bench` / `store` hidden | + +### Help implementation (option B, adopted) + +clap 4.5–4.6 does **not** support multiple subcommand headings ([clap#1553](https://github.com/clap-rs/clap/issues/1553) still open). We use a **custom root help template**: + +1. Root `help_template` **omits `{subcommands}`**; keeps `{about}` / `{usage}` / `{options}`. +2. `{after-help}` injects grouped command tables from `help.rs`. +3. Section titles and blurbs in **`help.rs` → `SECTIONS`**; per-command one-liners from clap `about` on each subcommand (`commands.rs` remains per-command wording SSOT). +4. `probing --help` still uses default clap per-command help. + +```text +Cli::build_command() + → CommandFactory::command() + → help::apply_grouped_root_help() +``` + +--- + +## Help sections (rationale) + +| Section | Commands | Notes | +|---------|----------|-------| +| **Processes** | `inject`, `launch`, `list` | Establish or discover probing on a process; avoid “Attach” (ptrace jargon) | +| **Analyze** | `query`, `tables`, `cluster` | SQL and catalog; `cluster` until merged into `query --global` / `nodes` | +| **Diagnose** | `eval`, `repl`, `backtrace` | Interactive, immediate inspection | +| **Runtime** | `memory`, `config`, `flamegraph`, `rdma` | Runtime state and profiling | +| **Agent** | `skill`, `mcp` | Coding-agent integration: skills and MCP config | + +--- + +## Target invocation tree + +```text +probing [-v] [-t T] … + +inject(L*)* launch(L)— list— +query* tables* nodes* # TBD: merge cluster into query/nodes +eval* repl* backtrace* flamegraph* rdma* +memory* config* +skill list— | install— | update— | run* … +mcp url* | config* +bench(H)— store(H)— +``` + +--- + +## Maintenance + +When adding or moving a top-level subcommand: + +1. Register in `commands.rs` (with `about`) +2. Add name to `help.rs` → `SECTIONS` +3. Update this doc + +--- + +## Related + +[federation.md](federation.md) · [skills](../guide/skills.md) · [api-reference](../api-reference.md) diff --git a/docs/src/design/cli.zh.md b/docs/src/design/cli.zh.md new file mode 100644 index 00000000..3fae94b7 --- /dev/null +++ b/docs/src/design/cli.zh.md @@ -0,0 +1,163 @@ +# CLI 命令树 + +**状态:** 草案 · **SSOT** 命令分组与迁移 · 实现:`probing/cli/src/cli/{commands,help,mod}.rs` + +**约定:** `T` = `-t/--target` · `*` = 需要 T · `—` = 不需要 T · `L` = 仅 Linux · `H` = hidden + +--- + +## 设计原则:平铺调用,分组帮助 + +| 维度 | 规则 | +|------|------| +| **调用** | 单层子命令:`probing [-v] [-t T] [args…]` | +| **帮助** | `probing --help` 按 Processes / Analyze / Diagnose / Runtime / Agent **分组展示** | +| **收敛** | 合并 `cluster query` → `query --global`;`cluster nodes` → 顶层 `nodes`(待做) | +| **例外** | `skill` 保留二级子命令;`bench`/`store` 隐藏 | + +### Help 实现(方案 B,已采用) + +clap 4.5–4.6 **不支持**同级子命令多 heading([clap#1553](https://github.com/clap-rs/clap/issues/1553) 未 merge)。采用 **自定义根 help 模板**: + +1. 根 `help_template` **去掉 `{subcommands}`**,只保留 `{about}` / `{usage}` / `{options}`。 +2. `{after-help}` 注入 `help.rs` 渲染的分组命令表。 +3. 分组标题与组说明在 **`help.rs` → `SECTIONS`**;各命令单行说明来自 subcommand 的 clap `about`(`commands.rs` 仍为 per-command 文案 SSOT)。 +4. `probing --help` 仍走 clap 默认 per-command help。 + +```text +Cli::build_command() + → CommandFactory::command() + → help::apply_grouped_root_help() # template + after_long_help +``` + +--- + +## Help 分组(命名 rationale) + +| 组 | 命令 | 说明 | +|----|------|------| +| **Processes** | `inject`, `launch`, `list` | 与目标进程建立/发现 probing 关系;不用「Attach」(用户不熟悉 ptrace 术语) | +| **Analyze** | `query`, `tables`, `cluster` | SQL 与表目录;cluster 暂保留至 `query --global` / `nodes` 落地 | +| **Diagnose** | `eval`, `repl`, `backtrace` | 交互式、即时检查 | +| **Runtime** | `memory`, `config`, `flamegraph`, `rdma` | 运行时状态与 profiling(资源、配置、采样、I/O) | +| **Agent** | `skill`, `mcp` | 与 coding agent 集成:诊断 skill 与 MCP 端点配置 | + +--- + +## 当前(v0.2.5) + +```text +probing [-v] [-t T] … + +inject(L*)* launch(L)— list— config* tables* memory* +query|q* cluster/query* cluster/nodes* +eval* repl* backtrace* flamegraph* rdma* +skill/{list—,install—,update—,run*} mcp/{url*,config*} +bench(H)— store(H)— +external→probing- +``` + +--- + +## 目标 — 平铺命令 + 分组 `--help` + +### 调用树 + +```text +probing [-v] [-t T] … + +inject(L*)* [-D define…] +launch(L)— [-r] +list— [--tree] [--verbose] + +query* [-f fmt] [--global|--local|--flat] # 待做:吸收 cluster query +tables* [--all] [-f fmt] +nodes* # 待做:吸收 cluster nodes + +memory* config* flamegraph* rdma* +skill list— | install— | update— | run* … +mcp url* | config* +bench(H)— store(H)— +``` + +### 帮助树(`probing --help` 输出) + +```text +Processes — Start probing on a process, wrap a new command, or list probed PIDs + inject Inject libprobing into a running process (Linux ptrace) + launch Launch a command with probing enabled (Linux) + list List processes that already have probing enabled + +Analyze — Run SQL, inspect table catalog, fan out across cluster nodes + query Query data from the target process + tables List queryable tables in the target process + cluster On-demand cluster SQL fan-out and node listing + +Diagnose — Interactive inspection — Python eval, REPL, stack traces + eval Evaluate Python code in the target process + repl Interactive Python REPL session + backtrace Show the backtrace of the target process or thread + +Runtime — Runtime state and profiling — memory, config, flamegraphs, RDMA flows + memory Show memory usage (host RSS and GPU memory) of the target process + config Display or modify the configuration + flamegraph Fetch a flamegraph (CPU/pprof or PyTorch) from the target process + rdma Get RDMA flow of the target process or thread + +Agent — Integrate coding agents — diagnostic skills and MCP server config + skill Run structured diagnostic skills (shared with Web Agent) + mcp MCP endpoint URL and agent config for the target probing server + +Run `probing --help` for command-specific options. +``` + +--- + +## 典型用法 + +```text +probing inject -t PID +probing query -t PID 'SELECT …' +probing skill run -t PID health_overview +probing mcp config -t host:8080 +probing backtrace -t PID +``` + +--- + +## 变更摘要(相对 v0.2.5) + +| 状态 | 项 | +|------|-----| +| ✅ | 分组根 `--help`(`help.rs`) | +| ✅ | Help 组名:Processes / Analyze / Diagnose / Runtime / Agent | +| ✅ | `probing mcp url|config` — MCP 端点与 agent 配置片段 | +| 待做 | `cluster query` → `query --global` | +| 待做 | `cluster nodes` → 顶层 `nodes` | +| ✅ | 取消隐式 inject(无子命令不再 inject) | +| ✅ | CLI 导入跳过 `#[ctor]` 引擎启动(`__init__.py` CLI 轻量路径) | + +--- + +## 待定 + +| # | 问题 | 默认 | +|---|------|------| +| 1 | positional `[T]` 作 `-t` 糖 | TBD | +| 2 | external 插件 | TBD | + +--- + +## 维护 + +新增/移动顶层子命令时: + +1. 在 `commands.rs` 注册 subcommand(含 `about`) +2. 在 `help.rs` → `SECTIONS` 里加入组与命令名 +3. 更新本文调用树 + +--- + +## 相关 + +[federation.zh.md](federation.zh.md) · [skills](../guide/skills.md) · [api-reference](../api-reference.md) diff --git a/docs/src/design/distributed.md b/docs/src/design/distributed.md index c83ce85f..1ccaa202 100644 --- a/docs/src/design/distributed.md +++ b/docs/src/design/distributed.md @@ -1,19 +1,25 @@ # Distributed Architecture -Probing supports monitoring and debugging distributed AI workloads across multiple nodes. +Multi-node probing: per-rank memtable writers, `cluster.nodes` registry, coordinator-side +SQL fan-out via `global.*` and `/apis/cluster/query`. -## Overview +## Related documents -Distributed training introduces challenges: +| Document | Scope | +|----------|-------| +| [Torchrun cluster heartbeat](torchrun-cluster.md) | TCPStore side channel, hierarchical PUT, backoff | +| [Federated query engine](federation.md) | Catalog rewrite, paths A/B/C, tag injection | +| [Hierarchical fan-out](hierarchical-fanout.md) | coordinator → local0 → leaf HTTP topology | +| [Cluster with Pulsing](cluster-pulsing.md) | Optional `pulsing.*` memtable membership | +| [NCCL Profiler](nccl-profiler.md) | `nccl.proxy_ops` plugin ABI | -- Multiple processes across nodes -- Communication between ranks -- Synchronized debugging needs -- Cross-node data correlation +Dependency order: [Core model](../guide/concepts.md) → this page → torchrun heartbeat → federation → hierarchical fan-out. -Probing addresses these through a distributed architecture. +Reference: [SQL Tables](../reference/sql-tables.md) (`cluster.nodes`, federation tags). -## Architecture +--- + +## Topology ```mermaid graph TB @@ -106,6 +112,10 @@ Register peers via torchrun (Rust ctor starts hierarchical heartbeat by default `_role` resolve correctly. Override role at runtime with `probing.set_role(...)` in training scripts. +See [Federated query engine](federation.md) for engine paths and acceptance tests. + +At wan scale, **`cluster query` defaults to [hierarchical fan-out](hierarchical-fanout.md)** (coordinator → per-machine local0 → on-node leaves). Set `PROBING_CLUSTER_FANOUT_HIERARCHICAL=0` or use CLI `--flat` for legacy flat fan-out. + ## Synchronized Debugging ### Capture All Stacks @@ -236,30 +246,20 @@ probing -t host:8080 --token secret query "..." ## Best Practices -### 1. Consistent Configuration +### Consistent environment -Use same configuration across all nodes: +Same env on all ranks (example): ```bash export PROBING_PORT=8080 export PROBING_TORCH_PROFILING=on ``` -### 2. Centralized Collection - -For large clusters, consider aggregation: - -```bash -# Export data to central location -probing -t $node query "SELECT * FROM python.torch_trace" >> /shared/traces.json -``` - -### 3. Timestamp Synchronization +### Cross-node timestamps -Ensure NTP is configured for accurate cross-node timing. +Use NTP; memtable `ts` columns are wall-clock microseconds per process. -### 4. Network Considerations +### Network -- Use dedicated network for probing traffic if possible -- Consider firewall rules for probing ports -- Monitor probing overhead on training network +Probing HTTP is control-plane traffic. Isolate or rate-limit fan-out on large clusters; +see [Hierarchical fan-out](hierarchical-fanout.md). diff --git a/docs/src/design/distributed.zh.md b/docs/src/design/distributed.zh.md index 4a373c8d..35910094 100644 --- a/docs/src/design/distributed.zh.md +++ b/docs/src/design/distributed.zh.md @@ -1,19 +1,25 @@ # 分布式架构 -Probing 支持监控和调试跨多节点的分布式 AI 工作负载。 +多节点 probing:各 rank 写本地 memtable;`cluster.nodes` 注册表;coordinator 通过 +`global.*` 与 `/apis/cluster/query` 做 SQL fan-out。 -## 概览 +## 相关文档 -分布式训练带来了挑战: +| 文档 | 范围 | +|------|------| +| [torchrun 集群心跳](torchrun-cluster.zh.md) | TCPStore 旁路、分层 PUT、退避 | +| [联邦查询引擎](federation.zh.md) | Catalog 改写、路径 A/B/C、标签注入 | +| [分层集群查询](hierarchical-fanout.zh.md) | coordinator → local0 → leaf HTTP 拓扑 | +| [基于 Pulsing 的集群](cluster-pulsing.zh.md) | 可选 `pulsing.*` memtable 成员 | +| [NCCL Profiler](nccl-profiler.zh.md) | `nccl.proxy_ops` 插件 ABI | -- 跨节点的多进程 -- Rank 之间的通信 -- 同步调试需求 -- 跨节点数据关联 +依赖顺序:[核心模型](../guide/concepts.zh.md) → 本页 → torchrun 心跳 → 联邦 → 分层 fan-out。 -Probing 通过分布式架构解决这些问题。 +参考:[SQL 表目录](../reference/sql-tables.zh.md)(`cluster.nodes`、联邦标签)。 -## 架构 +--- + +## 拓扑 ```mermaid graph TB @@ -103,6 +109,8 @@ ORDER BY avg_ms DESC" 引擎实现与正确性测试要求见 **[联邦查询引擎](federation.zh.md)**。 +万卡场景下 `cluster query` 默认走 **[分层 fan-out](hierarchical-fanout.zh.md)**(coordinator 仅联系各机 local0,local0 再聚合本机 leaf rank),可用 `PROBING_CLUSTER_FANOUT_HIERARCHICAL=0` 或 CLI `--flat` 恢复扁平 fan-out。 + ## 同步调试 ### 捕获所有堆栈 @@ -233,30 +241,19 @@ probing -t host:8080 --token secret query "..." ## 最佳实践 -### 1. 一致的配置 +### 一致的环境变量 -在所有节点上使用相同配置: +各 rank 使用相同配置(示例): ```bash export PROBING_PORT=8080 export PROBING_TORCH_PROFILING=on ``` -### 2. 集中收集 - -对于大型集群,考虑聚合: - -```bash -# 导出数据到中心位置 -probing -t $node query "SELECT * FROM python.torch_trace" >> /shared/traces.json -``` - -### 3. 时间戳同步 +### 跨节点时间戳 -确保配置 NTP 以获得准确的跨节点时间。 +使用 NTP;memtable 的 `ts` 列为各进程 wall-clock 微秒。 -### 4. 网络考虑 +### 网络 -- 尽可能使用专用网络进行 probing 流量 -- 考虑 probing 端口的防火墙规则 -- 监控 probing 对训练网络的开销 +Probing HTTP 属控制面流量。大集群上应隔离或限制 fan-out 速率;见 [分层 fan-out](hierarchical-fanout.zh.md)。 diff --git a/docs/src/design/federation.md b/docs/src/design/federation.md index 8e4e65b5..ea0866e3 100644 --- a/docs/src/design/federation.md +++ b/docs/src/design/federation.md @@ -1,28 +1,411 @@ # Federated Query Engine -Product design for cross-rank SQL in probing: ask the whole training cluster from a -coordinator with one query — who is slow, on which step, compute vs network, which machine. +Cross-rank SQL semantics for the `global` catalog. User-visible behavior is specified here; +implementation: `probing/core/src/core/federation/`. On conflict, align code to this document. -!!! note "Language" - Full design (scenarios, SQL, execution paths, acceptance bar) is in - **[中文版 / Chinese](/zh/design/federation/)**. +See also: [Core model](../guide/concepts.md) · [Distributed overview](distributed.md) · [SQL Analytics](../guide/sql-analytics.md) -## Summary +--- -| Path | When | Module | -|------|------|--------| -| Local `probe` | Single-process query | DataFusion | -| **Aggregate pushdown (A)** | Single-table `global.*` + `GROUP BY` / safe aggregates | `aggregate_pushdown.rs` | -| **Federated scan (B)** | Single-table scan, filters, raw rows | `FederatedScanExec` | -| **Broadcast (C)** | JOIN / CTE / multi-table on each rank | `cluster_fanout.rs` | +## 1. Execution model -Federation tags (fixed): `_host`, `_addr`, `_rank`, `_node_rank`, `_local_rank`, `_role`. +Each rank writes only to local memtables (`python.comm_collective`, `nccl.proxy_ops`, …). +A coordinator query: -Chinese doc covers: diagnostic scenarios (straggler, heatmap, slowdown, topology, hang), -engine behavior spec (routing, rewrite, tags, paths A/B/C), and the wan-scale «five SQL» bar. +1. Executes `probe.*` on each peer (via HTTP) +2. Merges partial results +3. Injects federation tag columns (`_host`, `_addr`, …) -## Related +### Invariants -- **[Federation (中文)](/zh/design/federation/)** -- [Distributed](distributed.md) -- [Modularity](modularity.md) +| Invariant | Definition | +|-----------|------------| +| Write local, read on demand | No central store on the training path; fan-out only for `cluster query` / `global.*` | +| Single engine entry | CLI, Web, skills, `probing.query()` share `Engine::async_query` | +| Partial failure | Peer timeout → omit shard, record `nodes_failed`; query continues | +| No cross-rank JOIN | `global.a JOIN global.b` unsupported; join inside one process (path C) | + +**Entry points** + +| Caller | How | Fan-out? | +|--------|-----|----------| +| Single-rank debug | `probing -t query "…"` | No | +| Cluster diagnosis | `probing -t rank0:8080 cluster query "…"` | Yes | +| Web training heatmap | `GET /apis/training/step_matrix?cluster=true` | Yes | +| In-process | `probing.query("… global.…")` on rank 0 | Depends on SQL | + +--- + +## 2. Two catalogs and federation tags + +### 2.1 `probe` vs `global` + +| Catalog | Meaning | +|---------|---------| +| **`probe.*`** | Tables in the **current process** | +| **`global.*`** | **Federated mirror** of the same table: local scan + lazy peer fetch, merged | + +When the user writes `FROM python.comm_collective` with `cluster=true`, the engine rewrites to `global.python.comm_collective` and routes accordingly. + +Peers **always** execute `probe.*` to prevent recursive federation. + +### 2.2 Six federation tag columns (fixed) + +Distinct from in-table `rank`, `role`, etc. — tags mean **which probe endpoint returned the row**. + +| Tag | Meaning | Source | +|-----|---------|--------| +| `_host` | Source hostname | `cluster.nodes.host` | +| `_addr` | Probe `host:port` | `cluster.nodes.addr` | +| `_rank` | Global torch rank | `RANK` | +| `_node_rank` | Node / worker group rank | `GROUP_RANK` | +| `_local_rank` | GPU index on node | `LOCAL_RANK` | +| `_role` | Parallel key, e.g. `dp=2,pp=1,tp=0` | Registry / `set_role` | + +Missing integers → `-1`; missing `_role` → `""`. + +**Projection rules** + +- `SELECT * FROM global.t` → auto-expand six tag columns (`EXCLUDE` rewrite) +- `SELECT rank, avg_ms …` → tags **not** auto-appended; list `_rank` explicitly if needed +- Tags are injected at **coordinator merge**, not stored in peer memtables + +--- + +## 3. Example SQL + +Reference queries against federated tables. Prefer path A (aggregate pushdown) when the +SQL matches §4.2 conditions. + +### 3.1 `global.python.comm_collective` — rank and host aggregates + +```sql +SELECT _role, _rank, rank, + avg(duration_ms) AS avg_ms, max(duration_ms) AS max_ms +FROM global.python.comm_collective +WHERE global_step >= (SELECT max(global_step) - 50 FROM global.python.comm_collective) +GROUP BY _role, _rank, rank +ORDER BY avg_ms DESC; +``` + +**Per-host aggregate** + +```sql +SELECT _host, _node_rank, + count(DISTINCT _rank) AS ranks_on_host, + avg(duration_ms) AS avg_comm_ms +FROM global.python.comm_collective +WHERE global_step >= (SELECT max(global_step) - 100 FROM global.python.comm_collective) +GROUP BY _host, _node_rank +ORDER BY avg_comm_ms DESC; +``` + +### 3.2 `python.trace_event` — step duration (path C, same-rank JOIN) + +```sql +SELECT s.attributes, s.time AS start_time, + CAST((e.time - s.time) / 1000 AS DOUBLE) AS duration_us +FROM python.trace_event s +JOIN python.trace_event e + ON s.span_id = e.span_id AND e.record_type = 'span_end' +WHERE s.record_type = 'span_start' AND s.name = 'train.step'; +``` + +Coordinator aggregates to `(rank, step) → duration_ms` for UI coloring. HTTP: `GET /apis/training/step_matrix?cluster=true`. + +### 3.3 `global.python.comm_collective` — step × rank long format + +```sql +SELECT global_step, _rank, _host, op, sum(duration_ms) AS comm_ms +FROM global.python.comm_collective +WHERE global_step >= (SELECT max(global_step) - 120 FROM global.python.comm_collective) +GROUP BY global_step, _rank, _host, op; +``` + +### 3.4 `global.nccl.proxy_ops` — wait decomposition + +```sql +SELECT seq, coll_func, _rank, + sum(send_gpu_wait_ns) AS gpu_wait, + sum(recv_wait_ns) AS recv_wait +FROM global.nccl.proxy_ops +WHERE seq >= (SELECT max(seq) - 50 FROM global.nccl.proxy_ops) +GROUP BY seq, coll_func, _rank; +``` + +### 3.5 Slowdown ratios (window functions → path C) + +```sql +WITH per_rank_step AS ( + SELECT global_step, _rank, max(duration_ms) AS max_op_ms + FROM global.python.comm_collective + WHERE global_step >= (SELECT max(global_step) - 500 FROM global.python.comm_collective) + GROUP BY global_step, _rank +), +step_cp AS ( + SELECT global_step, + avg(max_op_ms) / NULLIF(min(max_op_ms), 0) AS step_slowdown_ratio + FROM per_rank_step + GROUP BY global_step +) +SELECT avg(step_slowdown_ratio) AS job_slowdown_proxy, + count(*) FILTER (WHERE step_slowdown_ratio > 1.1) AS slow_steps +FROM step_cp; +``` + +**Per-step max-op ratio across ranks** + +```sql +WITH per_step AS ( + SELECT global_step, _rank, _host, sum(duration_ms) AS step_ms + FROM global.python.comm_collective + WHERE global_step >= (SELECT max(global_step) - 300 FROM global.python.comm_collective) + GROUP BY global_step, _rank, _host +) +SELECT _rank, _host, + sum(CASE WHEN step_ms = max(step_ms) OVER (PARTITION BY global_step) THEN 1 ELSE 0 END) + * 1.0 / count(*) AS worst_fraction +FROM per_step +GROUP BY _rank, _host +ORDER BY worst_fraction DESC; +``` + +At wan scale, split into two steps: path A for `per_step`, then coordinator aggregation. + +### 3.6 Parallel topology columns + +```sql +SELECT _role, _rank, global_step, sum(duration_ms) AS comm_ms +FROM global.python.comm_collective +WHERE global_step >= (SELECT max(global_step) - 80 FROM global.python.comm_collective) +GROUP BY _role, _rank, global_step; + +SELECT pp_rank, tp_rank, dp_rank, rank, seq, coll_func, + sum(send_gpu_wait_ns) AS gpu_wait, sum(recv_wait_ns) AS net_wait +FROM global.nccl.proxy_ops +WHERE seq >= (SELECT max(seq) - 100 FROM global.nccl.proxy_ops) +GROUP BY pp_rank, tp_rank, dp_rank, rank, seq, coll_func; +``` + +### 3.7 Same-rank JOIN — `comm_collective` × `torch_trace` (path C) + +```sql +SELECT c.global_step, c.rank, c.role, + sum(c.duration_ms) AS comm_ms, + sum(CASE WHEN t.stage LIKE 'post forward' THEN t.duration ELSE 0 END) AS compute_sec +FROM python.comm_collective c +JOIN python.torch_trace t + ON c.global_step = t.global_step AND c.rank = t.rank AND c.role = t.role +WHERE c.global_step >= (SELECT max(global_step) - 50 FROM python.comm_collective) +GROUP BY c.global_step, c.rank, c.role; +``` + +Coordinator receives per-peer results, then `GROUP BY _rank`. `comm + gpu` alignment needs coordinator-side merge of two aggregation passes (v2); `global.comm JOIN global.gpu` is not supported yet. + +### 3.8 Step lag and backtrace filters + +```sql +SELECT _host, _rank, _local_rank, max(global_step) AS last_step +FROM global.python.comm_collective +GROUP BY _host, _rank, _local_rank +HAVING max(global_step) < (SELECT max(global_step) - 5 FROM global.python.comm_collective); + +SELECT _host, _rank, func, file, lineno +FROM global.python.backtrace +WHERE func LIKE '%collective%' OR func LIKE '%nccl%'; +``` + +--- + +## 4. Engine specification + +Implementation: `probing/core/src/core/federation/`; `cluster=true` routing: +`probing/server/src/server/cluster_fanout.rs`. + +### 4.1 Pipeline + +```mermaid +flowchart LR + IN[User SQL] --> CF{cluster?} + CF -->|no| L0[Local DataFusion / probe.*] + CF -->|yes| RT[Path A/B/C] + RT --> RW[Catalog rewrite] + RW --> EX[Execute shards] + EX --> TG[Inject federation tags] + TG --> MG[Merge / re-aggregate] + MG --> OUT[DataFrame + FanoutMeta] +``` + +**Conventions** + +| Item | Semantics | +|------|-----------| +| Response | `dataframe` + `meta.nodes_queried` + `meta.nodes_failed` | +| Peer set | Snapshot of `cluster.nodes`, **excluding** coordinator listen addrs | +| Peer execution | Always `probe.*`; peers must not fan-out again | +| Concurrency | Parallel peer requests; latency ≈ slowest peer + coordinator merge | +| Timeout | Failed peer → `nodes_failed`; default 2s (`PROBING_REMOTE_QUERY_TIMEOUT_SECS`) | +| Hierarchical fan-out | Default on: coordinator → local0 → leaves; see [Hierarchical fan-out](hierarchical-fanout.md) | + +### 4.2 Path selection + +`cluster=false` → local only. + +`cluster=true` — **AST-based** (not substring): + +```mermaid +flowchart TD + Q[SQL] --> P{Single SELECT?} + P -->|no| C[Path C] + P -->|yes| M{Single table, no JOIN/CTE/UNION/subquery?} + M -->|no| C + M -->|yes| A{global.* + pushdown-safe GROUP BY/agg?} + A -->|yes| PA[Path A] + A -->|no| PB[Path B] +``` + +| Path | When | §3 examples | +|------|------|-------------| +| **A — aggregate pushdown** | Single-table `global.*`; `GROUP BY` and/or `count/sum/min/max/avg`; merge-safe | ①②④⑤, role views | +| **B — federated scan** | Single-table `global.*`; not A (no agg, non-merge agg, or `ORDER BY`/`LIMIT` when A cannot apply) | Raw row probes with filters | +| **C — broadcast** | JOIN, comma join, UNION, CTE, scalar/IN/EXISTS subqueries, multi-statement, parse failure | ③ span heatmap, compute join, window CTE | + +Parse failure → **conservative path C** (correctness over speed). + +### 4.3 Catalog rewrite + +| Stage | Input | Output | +|-------|-------|--------| +| User → coordinator | `python.t` / `probe.t` | `global.{schema}.t` (known schemas: `cluster/process/files/python/memtable/gpu/rdma`) | +| User already uses `global.*` | unchanged | — | +| Coordinator → peer | any `global.*` | `probe.*` | +| `SELECT *` + `global.*` | `SELECT * FROM global.t` | `SELECT * EXCLUDE (six tags), six tags FROM global.t` | +| Explicit column list | `SELECT rank, avg_ms …` | tags **not** auto-appended | + +Path A per-node SQL: strip tag columns from SELECT/GROUP BY; inject after coordinator merge. + +### 4.4 Federation tags + +Fixed six columns, stable order: `_host`, `_addr`, `_rank`, `_node_rank`, `_local_rank`, `_role`. + +| Rule | Detail | +|------|--------| +| Injection timing | Before merge, one value per shard | +| Missing values | Int tags → `-1`; `_role` → `""` | +| vs data columns | Table `rank`/`role` = collected values; `_rank`/`_role` = probe identity | +| Path consistency | Same semantics on A / B / C | + +### 4.5 Path A — aggregate pushdown + +**Goal:** ~80% of cluster diagnostics without pulling raw rows from every rank. + +**Per-node SQL** + +1. `FROM probe.{schema}.{table}` +2. Push full WHERE +3. SELECT: drop tag columns; keep aggs and data GROUP BY columns +4. GROUP BY data columns only + +**Coordinator merge** + +| Original agg | Merge function | +|--------------|----------------| +| `count`, `sum` | `sum` | +| `min` | `min` | +| `max` | `max` | +| `avg` | not exact distributed merge → **not path A** | +| `count(distinct)` with data GROUP BY | not supported → **not path A** | + +**ORDER BY / LIMIT:** applied on coordinator **after** merge; global top-K for LIMIT. + +**Partial failure:** successful partials still merge; failed addrs in `nodes_failed`. + +### 4.6 Path B — federated scan + +Lazy partitions: partition 0 = local scan; 1..N = one peer each, fetched on first poll. + +| Operator | Rule | +|----------|------| +| Filter | Push only if exactly translatable to peer SQL | +| Projection | User-selected columns only; tags appended at coordinator | +| `LIMIT` | **Global top-K** at coordinator only — never per-peer LIMIT | + +Remaining DataFusion plan runs above the federated scan at coordinator scope. + +### 4.7 Path C — broadcast {#path-c-broadcast} + +**Goal:** SQL that must run on **one process memtable set** (JOIN, CTE, windows). + +1. Same user SQL on coordinator and each peer (`global.*` → `probe.*` on peer) +2. Independent result sets per shard +3. Row concat with column alignment +4. Inject six tags per shard + +No second relational algebra at coordinator — result is concat, not join across shards. + +At large `world_size`, prefer path A partials plus coordinator re-aggregation over a single path C query with windows. + +### 4.8 Degradation and edge cases + +| Case | Behavior | +|------|----------| +| No peers registered | Single-node; `nodes_queried=1` | +| All peers fail | Local shard only, or empty + correct schema | +| Partial peer failure | Merge successes; `nodes_failed` lists addrs | +| Empty table | Empty DataFrame; schema includes requested cols + tags if applicable | +| `cluster.nodes` ≠ torch ranks | Tags reflect probe registration, not ideal rank layout | + +### 4.9 Explicit non-goals + +| Not supported | Reason | +|---------------|--------| +| `global.a JOIN global.b` | No co-located join key across ranks; use path C same-process join | +| Filters that cannot translate exactly | Avoid silent wrong results | +| Distributed `count(distinct)` merge | Not decomposable | +| One raw + multi-CTE query at wan scale | Memory/latency; use diagnostic chains | +| Peer recursive fan-out | HTTP loops and amplification | + +### 4.10 SQL pattern → path reference + +| §3 pattern | Path | Engine note | +|------------|------|-------------| +|---------|------|---------------------| +| Rank / slow-node leaderboard | A | `GROUP BY _rank` / `_host`; merge + inject | +| step×rank comm heatmap long | A | `GROUP BY global_step, _rank, _host, op` | +| Span heatmap | C | Same-rank `trace_event` self-join; concat + tag | +| Job slowdown / worst_fraction | C or two-step A | Windows → C; or split chain | +| Compute vs comm | C | `probe.comm JOIN probe.torch_trace`; then `GROUP BY _rank` | +| Hang / backtrace | A or B | Single-table `GROUP BY _rank` or filtered raw | + +--- + +## 5. Regression queries + +Engine changes must pass these on mock multi-node and real clusters: + +| # | Pattern | SQL reference | Path | +|---|---------|---------------|------| +| 1 | step×rank comm heatmap | §3.1 ④ | A | +| 2 | Slow-node leaderboard | §3.1 ② | A | +| 3 | Job slowdown proxy | §3.2 first query | C or two-step A | +| 4 | Compute vs comm | §3.4 | C + coordinator re-agg | +| 5 | NCCL compute/network | §3.1 ⑤ | A | + +**Tags:** six columns consistent on A/B/C; stable `SELECT *` expansion; broadcast JOIN tags match scan tags. + +**Federation:** mock ≥2 peers — row counts, `_addr` provenance, `nodes_failed`; path A `sum` matches naive full `GROUP BY`; path B `LIMIT` is global top-K. + +--- + +## 6. Related + +| Document | Content | +|----------|---------| +| [Distributed overview](distributed.md) | `cluster query` usage | +| [Hierarchical fan-out](hierarchical-fanout.md) | Wan-scale HTTP topology | +| [Core model](../guide/concepts.md) | Catalogs, federation tags | +| [SQL Tables](../reference/sql-tables.md) | Columns and `cluster.nodes` | +| [NCCL Profiler](nccl-profiler.md) | §3.1 ⑤, `nccl.proxy_ops` | +| [API — step_matrix](../api-reference.md) | §3.1 ③ heatmap | + +Implementation: `probing/core/src/core/federation/` · Control plane: `probing/server/src/server/cluster_fanout.rs` diff --git a/docs/src/design/federation.zh.md b/docs/src/design/federation.zh.md index 41c8dd9e..12e520b4 100644 --- a/docs/src/design/federation.zh.md +++ b/docs/src/design/federation.zh.md @@ -1,29 +1,28 @@ # 联邦查询引擎 -**产品定位:** 在 coordinator(通常是 rank 0 / master 探针)上用 **一条 SQL** 问整个训练集群——「谁慢、慢在哪一步、是算力还是网络、是哪台机器」——而不必 SSH 逐 rank 拉日志。 +`global` catalog 的跨 rank SQL 语义。本文定义用户可见行为;实现位于 +`probing/core/src/core/federation/`。冲突时以本文为准对齐代码。 -**设计契约:** 本文定义用户可见语义;实现以 `probing/core/src/core/federation/` 为准,不一致时以本文推进对齐。 - -术语:[核心概念](../guide/concepts.zh.md) · 用法:[分布式](distributed.zh.md) · [SQL 分析](../guide/sql-analytics.zh.md) +参见:[核心模型](../guide/concepts.zh.md) · [分布式概览](distributed.zh.md) · [SQL 分析](../guide/sql-analytics.zh.md) --- -## 1. 问题与原则 +## 1. 执行模型 -每个 rank 的探针 **只写本地 memtable**(`python.comm_collective`、`nccl.proxy_ops`、`python.trace_event` 等)。跨 rank 分析 = coordinator 把查询拆成: +每个 rank 仅写本地 memtable(`python.comm_collective`、`nccl.proxy_ops` 等)。Coordinator 查询: -1. 各 peer 本地执行 `probe.*` -2. HTTP fan-out 拉结果 -3. 合并行并注入 **联邦标签**(标明行来自哪台机器、哪个 rank) +1. 在各 peer 执行 `probe.*`(HTTP) +2. 合并 partial 结果 +3. 注入联邦标签列(`_host`、`_addr` 等) -**原则** +### 不变量 -| 原则 | 含义 | -|------|------| -| 本地写、按需读 | 训练路径零额外中心存储;只有显式 `cluster query` / `global.*` 才 fan-out | -| SQL 统一入口 | CLI、Web、Skill、进程内 `probing.query()` 最终都走同一套 Engine | -| 部分失败可接受 | 单个 peer 超时/不可达:丢弃该分片,返回 `nodes_failed`,不拖垮整查 | -| 不做跨 rank JOIN | 两张表要在 **同一进程** 内 join;不支持 `global.a JOIN global.b` | +| 不变量 | 定义 | +|--------|------| +| 本地写、按需读 | 训练路径无中心存储;仅 `cluster query` / `global.*` fan-out | +| 单一引擎入口 | CLI、Web、skill、`probing.query()` 共用 `Engine::async_query` | +| 部分失败 | peer 超时 → 丢弃分片,记录 `nodes_failed`;查询继续 | +| 无跨 rank JOIN | 不支持 `global.a JOIN global.b`;单进程内 join(路径 C) | **入口** @@ -72,15 +71,11 @@ Peer 上 **永远** 执行 `probe.*`,避免递归联邦。 --- -## 3. 诊断场景(用户要什么 → 用什么 SQL) - -复杂问题用 **诊断链** 分步收窄,而不是一条 SQL 扫全集群 raw 行。下列场景对标生产 LLM 集群实践([OSDI'25 Straggler / SMon](https://www.usenix.org/conference/osdi25/presentation/lin-jinkun)、[MegaScale](https://arxiv.org/pdf/2402.15627)、NCCL collective 归因),语义对齐即可,非复刻某套系统。 - -### 3.1 Straggler:从 rank 到机器到热力图 +## 3. 示例 SQL -**链:** rank 榜 → 慢节点 → step×rank 热力图 → 按 op 分解 → NCCL culprit/victim +联邦表上的参考查询。满足 §4.2 条件时优先走路径 A(聚合下推)。 -**① 各 rank collective 谁最慢** +### 3.1 `global.python.comm_collective` — rank 与 host 聚合 ```sql SELECT _role, _rank, rank, @@ -229,9 +224,10 @@ WHERE func LIKE '%collective%' OR func LIKE '%nccl%'; --- -## 4. 引擎行为规格 +## 4. 引擎规格 -本节从 §3 诊断需求反推 **引擎必须保证的用户可见语义**。实现入口:`probing/core/src/core/federation/`(执行)、`probing/server/src/server/cluster_fanout.rs`(`cluster=true` 路由)。 +实现:`probing/core/src/core/federation/`;`cluster=true` 路由: +`probing/server/src/server/cluster_fanout.rs`。 ### 4.1 处理流水线 @@ -256,6 +252,7 @@ flowchart LR | Peer 执行 | 永远 `probe.*`;禁止 peer 再 fan-out(防递归) | | 并发 | 各 peer 并行请求;总延迟 ≈ 最慢 peer + coordinator 合并 | | 超时 | 单 peer 超时记 `nodes_failed`,不拖垮整查(默认 2s,可 `PROBING_REMOTE_QUERY_TIMEOUT_SECS` 覆盖) | +| 分层 fan-out | 默认开启:`coordinator → 各机 local0 → 本机 leaf`;见 [分层集群查询](hierarchical-fanout.zh.md) | ### 4.2 路径选型 @@ -410,9 +407,9 @@ merge 后再 `GROUP BY` 数据列 + 用户请求的标签列(若有)。 --- -## 5. 万卡验收(最小五连) +## 5. 回归查询 -增强引擎时,**先保证这五条**在 mock 多节点与真 cluster 上数值正确: +引擎变更须在 mock 多节点与真实集群上通过: | # | 场景 | 核心 SQL | 路径 | |---|------|----------|------| @@ -433,7 +430,7 @@ merge 后再 `GROUP BY` 数据列 + 用户请求的标签列(若有)。 | 文档 | 内容 | |------|------| | [分布式架构](distributed.zh.md) | `cluster query` 用法 | -| [核心概念](../guide/concepts.zh.md) | 用户向联邦说明 | +| [核心模型](../guide/concepts.zh.md) | Catalog、联邦标签 | | [SQL 表目录](../reference/sql-tables.zh.md) | 表列与 `cluster.nodes` | | [NCCL Profiler](nccl-profiler.zh.md) | §3.1 ⑤、`nccl.proxy_ops` | | [API — step_matrix](../api-reference.zh.md) | §3.1 ③ 热力图 | diff --git a/docs/src/design/hierarchical-fanout.md b/docs/src/design/hierarchical-fanout.md new file mode 100644 index 00000000..e62ccee3 --- /dev/null +++ b/docs/src/design/hierarchical-fanout.md @@ -0,0 +1,189 @@ +# Hierarchical cluster query aggregation + +Cross-rank **`cluster query`** and **`global.*`** federation default to **hierarchical fan-out** so the coordinator (usually global rank 0) does not open one HTTP connection per training rank at wan scale. + +Aligns with [Torchrun cluster heartbeat](torchrun-cluster.md) membership tiers. SQL semantics: [Federated query engine](federation.md). + +--- + +## 1. Cost model + +Flat fan-out sends concurrent HTTP from the coordinator to **every** live peer in `cluster.nodes`: + +- Wan scale ≈ **O(world_size)** concurrent connections (e.g. 8192–10240) +- Rank-0 coordinator memory and socket pressure +- One slow rank bounds total latency (≈ slowest peer) + +Hierarchical fan-out splits the query into **coordinator → per-machine local0 → on-node leaf ranks**. Coordinator-side connections ≈ **O(number of nodes)**. + +--- + +## 2. Tiers + +```text +coordinator (global rank 0 / query entry, local_rank=0) + │ + ├─ Local node tier (scope=node) + │ local0 executes SQL locally + │ └─ fan-out → leaf ranks on same group_rank (POST /query, local only) + │ └─ merge rows / aggregate partials → node result + │ + └─ Remote node tier (scope=coordinator → each machine local0) + POST /apis/cluster/query { scope: "node", ... } + each local0 repeats the local node tier, returns to coordinator + coordinator merges node partials + injects federation tags +``` + +| Tier | Who | Fan-out targets | Example (8 GPUs/node, 1024 nodes) | +|------|-----|-----------------|-------------------------------------| +| **Coordinator** | rank0 probe | Each machine `local_rank=0` (one per `group_rank`) | ~1023 remote nodes | +| **Node** | Each machine local0 | Leaf ranks on same machine | ~7 / node | +| **Leaf** | `local_rank>0` | None (local execute only) | — | + +--- + +## 3. Enable and disable + +### Default + +- **`PROBING_CLUSTER_FANOUT_HIERARCHICAL=1`** (on by default) +- `POST /apis/cluster/query` and CLI `probing cluster query` default **`hierarchical: true`** + +### Disable (flat fan-out) + +```bash +export PROBING_CLUSTER_FANOUT_HIERARCHICAL=0 +# Or per request +probing -t rank0:8080 cluster query --flat "SELECT ..." +``` + +```json +POST /apis/cluster/query +{ "expr": "...", "cluster": true, "hierarchical": false } +``` + +### Prerequisites + +Hierarchical mode depends on metadata in `cluster.nodes`: + +| Field | Purpose | +|-------|---------| +| `group_rank` / `NODE_RANK` | Physical node identity | +| `local_rank` | Distinguish local0 (`0`) vs leaf | +| `addr` | HTTP fan-out target | + +Filled automatically by torchrun heartbeat / `PUT /apis/nodes`. If the cluster view **lacks** these fields, probing **falls back to flat fan-out** (same as `hierarchical=false`). + +--- + +## 4. API + +### `POST /apis/cluster/query` + +| Field | Type | Default | Description | +|-------|------|---------|-------------| +| `expr` | string | — | SQL | +| `cluster` | bool | `false` | Cross-node query | +| `hierarchical` | bool | `true` | Use hierarchical fan-out | +| `scope` | string | `auto` | `auto` / `coordinator` / `node` / `local` | + +**`scope` values** + +| Value | Behavior | +|-------|----------| +| `auto` | local0 entry → `coordinator`; leaf → `local` | +| `coordinator` | Local node aggregation + remote node aggregators | +| `node` | This machine only: local0 + leaves (called by coordinator) | +| `local` | Current process only, no fan-out | + +### Response `meta` + +```json +{ + "cluster": true, + "hierarchical": true, + "scope": "coordinator", + "nodes_queried": 3, + "nodes_failed": [], + "node_aggregators_queried": 1, + "local_ranks_queried": 1 +} +``` + +| Field | Meaning | +|-------|---------| +| `nodes_queried` | Successful **HTTP endpoints** in this query (local local0, local leaves, remote node aggs) | +| `node_aggregators_queried` | Remote **local0** endpoints contacted at coordinator tier | +| `local_ranks_queried` | **Leaf ranks** contacted on the coordinator machine | +| `nodes_failed` | Peers that timed out or returned HTTP errors | + +!!! note "Not world_size" + `nodes_queried` counts **HTTP endpoints**, not torch ranks. A 2-node × 2-GPU hierarchical query is typically `3` (2 local endpoints + 1 remote node agg), not `4`. + +### CLI + +```bash +# Default: hierarchical +probing -t rank0:8080 cluster query " + SELECT _rank, avg(duration_ms) AS avg_ms + FROM global.python.comm_collective + GROUP BY _rank + ORDER BY avg_ms DESC + LIMIT 10 +" + +# Flat (avoid at wan scale) +probing -t rank0:8080 cluster query --flat "SELECT ..." +``` + +### Web + +`GET /apis/training/step_matrix?cluster=true` uses hierarchical fan-out by default. + +--- + +## 5. Relationship to federation paths + +| Federation path | Hierarchical behavior | +|-----------------|----------------------| +| **A — aggregate pushdown** | Coordinator sends `per_node_sql` to **node aggregators**; local machine also fans out to leaves; see `aggregate_pushdown.rs` | +| **C — broadcast** (JOIN / CTE) | Coordinator runs node aggregation locally; remote nodes recurse via `scope=node` | +| **B — federated scan** | Remote lazy partitions under `FanoutScope::Coordinator` pull **node aggregators** only | + +Complex CTE + window queries should still be split into diagnostic chains (see [Federated query engine §4.7](federation.md#path-c-broadcast)). + +--- + +## 6. Environment variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | `0` = global flat fan-out | +| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `2` | Per-peer HTTP timeout (per tier in hierarchical mode) | + +Cluster heartbeat variables: [Environment variables — cluster](../reference/env-vars.md) and [Torchrun cluster heartbeat](torchrun-cluster.md). + +--- + +## 7. Implementation + +| Module | Path | +|--------|------| +| Fan-out orchestration | `probing/server/src/server/cluster_fanout.rs` | +| HTTP handler | `probing/server/src/server/cluster_query.rs` | +| Peer selection | `probing/core/src/core/cluster.rs` (`node_aggregator_peers`, `local_leaf_peers`) | +| Fan-out scope | `probing/core/src/core/federation/fanout_scope.rs` | +| Remote execution | `probing/core/src/core/federation/cluster_executor.rs` | + +Integration test: `tests/regression/rust/probing/server/hierarchical_fanout_query.rs` (`server_hierarchical_fanout_query`). + +--- + +## 8. Related + +| Document | Content | +|----------|---------| +| [Distributed overview](distributed.md) | `cluster nodes` / `cluster query` | +| [Federated query engine](federation.md) | `global.*`, diagnostic SQL, wan-scale bar | +| [Torchrun cluster heartbeat](torchrun-cluster.md) | Membership tiers | +| [Modularity — cross-rank fan-out](modularity.md) | L3 control-plane ownership | diff --git a/docs/src/design/hierarchical-fanout.zh.md b/docs/src/design/hierarchical-fanout.zh.md new file mode 100644 index 00000000..55122582 --- /dev/null +++ b/docs/src/design/hierarchical-fanout.zh.md @@ -0,0 +1,189 @@ +# 分层集群查询聚合 + +跨 rank 的 `cluster query` / `global.*` 查询默认走 **分层 fan-out**,避免 coordinator(通常是 global rank 0)在万卡规模下直连每一个训练 rank。 + +与 [torchrun 集群心跳](torchrun-cluster.zh.md) 的成员注册层级对齐;联邦 SQL 语义见 [联邦查询引擎](federation.zh.md)。 + +--- + +## 1. 代价模型 + +扁平 fan-out 从 coordinator 向 `cluster.nodes` 中 **每个** 存活 peer 并发 HTTP: + +- 万卡 ≈ **O(world_size)** 并发连接(例如 8192~10240) +- 单点 rank0 内存与 socket 压力大 +- 慢 rank 拖垮整次查询(总延迟 ≈ 最慢 peer) + +分层 fan-out 将查询拆成 **coordinator → 各机 local0 → 同机 leaf rank**,coordinator 侧连接数 ≈ **O(节点数)**。 + +--- + +## 2. 层级 + +```text +coordinator (global rank 0 / 查询入口, local_rank=0) + │ + ├─ 本机 node 层 (scope=node) + │ local0 本地执行 SQL + │ └─ fan-out → 同 group_rank 的 leaf ranks (POST /query, 仅本地) + │ └─ 行合并 / 聚合 partial → 本机结果 + │ + └─ 远程 node 层 (scope=coordinator → 各机 local0) + POST /apis/cluster/query { scope: "node", ... } + 各机 local0 重复「本机 node 层」逻辑后返回 + coordinator 合并各 node partial + 注入联邦标签 +``` + +| 层级 | 谁 | fan-out 目标 | 典型规模 (8 卡/机, 1024 机) | +|------|-----|---------------|------------------------------| +| **Coordinator** | rank0 探针 | 各机 `local_rank=0`(每 `group_rank` 一个) | ~1023 远程 node | +| **Node** | 各机 local0 | 同机 leaf ranks | ~7 / node | +| **Leaf** | `local_rank>0` | 无(仅本地执行) | — | + +--- + +## 3. 启用与关闭 + +### 默认 + +- **`PROBING_CLUSTER_FANOUT_HIERARCHICAL=1`**(默认开启) +- `POST /apis/cluster/query` 与 CLI `probing cluster query` 的 **`hierarchical` 默认为 `true`** + +### 关闭(恢复扁平 fan-out) + +```bash +export PROBING_CLUSTER_FANOUT_HIERARCHICAL=0 +# 或单次请求 +probing -t rank0:8080 cluster query --flat "SELECT ..." +``` + +```json +POST /apis/cluster/query +{ "expr": "...", "cluster": true, "hierarchical": false } +``` + +### 前置条件 + +分层依赖 `cluster.nodes` 中的元数据: + +| 字段 | 用途 | +|------|------| +| `group_rank` / `NODE_RANK` | 区分物理节点 | +| `local_rank` | 识别 local0(`0`)与 leaf | +| `addr` | HTTP fan-out 目标 | + +由 torchrun 心跳 / `PUT /apis/nodes` 自动填充。若集群视图 **缺少** 上述字段,自动 **降级为扁平 fan-out**(与 `hierarchical=false` 等价)。 + +--- + +## 4. API + +### `POST /apis/cluster/query` + +| 字段 | 类型 | 默认 | 说明 | +|------|------|------|------| +| `expr` | string | — | SQL | +| `cluster` | bool | `false` | 是否跨节点 | +| `hierarchical` | bool | `true` | 是否分层 fan-out | +| `scope` | string | `auto` | `auto` / `coordinator` / `node` / `local` | + +**`scope` 含义** + +| 值 | 行为 | +|----|------| +| `auto` | local0 入口 → `coordinator`;leaf → `local` | +| `coordinator` | 本机 node 聚合 + 远程 node aggregators | +| `node` | 仅本机 local0 + leaf(供 coordinator 调用) | +| `local` | 仅当前进程,不 fan-out | + +### 响应 `meta` + +```json +{ + "cluster": true, + "hierarchical": true, + "scope": "coordinator", + "nodes_queried": 3, + "nodes_failed": [], + "node_aggregators_queried": 1, + "local_ranks_queried": 1 +} +``` + +| 字段 | 含义 | +|------|------| +| `nodes_queried` | 成功参与本次查询的 **endpoint 数**(含本机 local0、本机 leaf、远程 node agg) | +| `node_aggregators_queried` | coordinator 层联系的远程 **local0** 数量 | +| `local_ranks_queried` | 本机 node 层联系的 **leaf rank** 数量 | +| `nodes_failed` | 超时或 HTTP 失败的 peer 地址 | + +!!! note "不是 world_size" + `nodes_queried` 统计的是 **HTTP endpoint**,不是 torch rank 总数。2 机 × 2 卡分层查询通常为 `3`(本机 2 endpoint + 1 远程 node agg),而非 `4`。 + +### CLI + +```bash +# 默认分层 +probing -t rank0:8080 cluster query " + SELECT _rank, avg(duration_ms) AS avg_ms + FROM global.python.comm_collective + GROUP BY _rank + ORDER BY avg_ms DESC + LIMIT 10 +" + +# 扁平(万卡慎用) +probing -t rank0:8080 cluster query --flat "SELECT ..." +``` + +### Web + +`GET /apis/training/step_matrix?cluster=true` 默认走分层 fan-out。 + +--- + +## 5. 与联邦路径的关系 + +| 联邦路径 | 分层行为 | +|----------|----------| +| **A 聚合下推** | coordinator 向 **node aggregators** 发送 `per_node_sql`;本机额外 fan-out 至 leaf;见 `aggregate_pushdown.rs` | +| **C broadcast**(JOIN / CTE) | coordinator 对本机做 node 聚合,远程 node 通过 `scope=node` 递归 | +| **B 联邦 scan** | 远程 lazy 分区在 `FanoutScope::Coordinator` 下仅拉 node aggregator | + +复杂 CTE + 窗口仍建议拆诊断链(见 [联邦查询引擎 §4.7](federation.zh.md#47-路径-c-broadcast))。 + +--- + +## 6. 环境变量 + +| 变量 | 默认 | 说明 | +|------|------|------| +| `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | `0` = 全局扁平 fan-out | +| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `2` | 单 peer HTTP 超时(分层下为 per-tier) | + +集群心跳相关变量见 [环境变量 — 集群](../reference/env-vars.zh.md#集群) 与 [torchrun 集群心跳](torchrun-cluster.zh.md)。 + +--- + +## 7. 实现位置 + +| 模块 | 路径 | +|------|------| +| Fan-out 编排 | `probing/server/src/server/cluster_fanout.rs` | +| HTTP handler | `probing/server/src/server/cluster_query.rs` | +| Peer 选择 | `probing/core/src/core/cluster.rs`(`node_aggregator_peers`, `local_leaf_peers`) | +| Fan-out scope | `probing/core/src/core/federation/fanout_scope.rs` | +| 远程执行 | `probing/core/src/core/federation/cluster_executor.rs` | + +集成测试:`tests/regression/rust/probing/server/hierarchical_fanout_query.rs`(`server_hierarchical_fanout_query`)。 + +--- + +## 8. 相关文档 + +| 文档 | 内容 | +|------|------| +| [分布式架构](distributed.zh.md) | `cluster nodes` / `cluster query` | +| [联邦查询引擎](federation.zh.md) | `global.*`、诊断 SQL、万卡五连 | +| [torchrun 集群心跳](torchrun-cluster.zh.md) | 成员注册层级 | +| [模块化 — 跨 rank fan-out](modularity.zh.md) | L3 控制面职责 | diff --git a/docs/src/design/index.md b/docs/src/design/index.md index 4f624a07..22908d8a 100644 --- a/docs/src/design/index.md +++ b/docs/src/design/index.md @@ -1,59 +1,48 @@ -# Design Overview +# Architecture Overview -## Why Probing? +Contributor-facing design docs. Operators: **[User Guide](../guide/index.md)**. +Contracts: **[Reference](../reference/index.md)**. -### The Pythonic Advantage +Vocabulary: **[Core model](../guide/concepts.md)**. -Python's dominance in AI stems from one core principle: **everything feels like Python**. Whether you're using pandas, PyTorch, or NumPy, you can **talk to them pythonically**—the same `print()`, iteration, and attribute access patterns work everywhere. +## Reading order -### How Distributed Systems Break This +1. **[Modularity & boundaries](modularity.md)** — four-layer model, crate map, dependency rules (start here) +2. **[Data Layer](data-layer.md)** — MEMT/MEMC, mmap, SQL integration +3. **[Distributed → Overview](distributed.md)** — multi-node mental model, then nested pages below -As AI models scale to distributed clusters, something fundamental breaks: **distributed systems aren't Pythonic**. Single-machine debugging feels natural—`print(model.parameters())`, `loss.item()`, `torch.cuda.memory_allocated()`—but distributed debugging forces you into system administration tools: `kubectl get nodes`, SSH sessions, log file parsing, monitoring dashboards. +## Platform core -### Probing's Mission - -Probing's core mission is simple: **make distributed systems feel Pythonic again**. Your cluster, nodes, and distributed processes become accessible through familiar interfaces. Instead of context-switching between tools, you stay in Python and **talk to your distributed system pythonically**. - -## Design Principles - -### 🔍 Zero Intrusion - -- No code modifications required -- No environment setup changes needed -- No workflow disruptions -- Dynamic probe injection into running processes - -### 🎯 Zero Learning Curve +| Document | Description | +|----------|-------------| +| [Modularity & boundaries](modularity.md) | L1–L4 layers, public contracts, ownership | +| [Data Layer](data-layer.md) | Hot/cold columnar store and SQL integration | +| [Extensibility](extensibility.md) | `@table` plugins, skills, NCCL profiler hook-in | +| [CLI command tree](cli.md) | Command grouping, target rules, migration (draft) | -- Standard SQL interface for data analysis -- Familiar database query patterns -- Intuitive command-line tools -- Web-based dashboard for visualization +## Collectors & profiling -### 📦 Zero Deployment Burden +| Document | Description | +|----------|-------------| +| [Profiling](profiling.md) | Torch hooks, sampling, table write path | +| [NCCL Profiler](nccl-profiler.md) | Plugin ABI, proxy-op wait decomposition | +| [Debugging Engine](debugging.md) | eval / backtrace / REPL implementation | +| [Training Phases](/zh/design/training-phase/) | Phase transitions and span model *(中文)* | -- Single binary deployment (Rust-based) -- Static compilation with minimal dependencies -- Linux-first design with query/eval support on other platforms -- Elastic scaling capabilities +## Distributed -## Design Documents +| Document | Description | +|----------|-------------| +| [Overview](distributed.md) | Multi-node topology, control plane, federation intro | +| [Torchrun cluster heartbeat](torchrun-cluster.md) | Hierarchical registration, backoff, env presets | +| [Federated query engine](federation.md) | Cross-rank SQL paths A/B/C, tags, regression queries | +| [Hierarchical fan-out](hierarchical-fanout.md) | Coordinator → local0 → leaf query aggregation | +| [Cluster with Pulsing](cluster-pulsing.md) | Optional Pulsing-based membership | -Shared vocabulary (endpoint, steps, role, federation): **[Core Concepts](../guide/concepts.md)**. +## Legacy | Document | Description | |----------|-------------| -| [Modularity & boundaries](modularity.md) | **Core vs feature modules**, interfaces, dependency rules, ownership | -| [Architecture](architecture.md) | System structure and components | -| [Data Layer](data-layer.md) | Hot/cold columnar store and SQL integration | -| [Profiling](profiling.md) | Performance data collection | -| [Debugging](debugging.md) | Debugging capabilities | -| [Distributed](distributed.md) | Multi-node support | -| [Torchrun cluster heartbeat](torchrun-cluster.md) | Hierarchical registration, backoff, env presets | -| [Federated query engine](federation.md) | Cross-rank SQL: scenarios, execution paths, acceptance bar | -| [NCCL Profiler](nccl-profiler.md) | NCCL plugin, culprit/victim, `nccl.proxy_ops` | -| [Cluster with Pulsing](cluster-pulsing.md) | Using Pulsing for membership and failure detection | -| [Extensibility](extensibility.md) | Custom tables and metrics | +| [System Architecture (legacy)](architecture.md) | Two-layer overview — superseded by [Modularity](modularity.md); kept for historical diagrams | -User-facing workflows: **[User Guide](../guide/index.md)** (SQL, skills, debugging). -Reference: **[SQL Tables](../reference/sql-tables.md)** · **[API Reference](../api-reference.md)**. +User-facing workflows: **[User Guide](../guide/index.md)** · Reference: **[SQL Tables](../reference/sql-tables.md)** · **[CLI & Python API](../api-reference.md)** diff --git a/docs/src/design/index.zh.md b/docs/src/design/index.zh.md index a5b77d64..bba6d756 100644 --- a/docs/src/design/index.zh.md +++ b/docs/src/design/index.zh.md @@ -1,59 +1,47 @@ -# 设计概览 +# 架构概览 -## 为什么选择 Probing? +贡献者向设计文档。操作员见 **[用户指南](../guide/index.zh.md)**;契约见 **[参考手册](../reference/index.zh.md)**。 -### Pythonic 的优势 +术语:**[核心模型](../guide/concepts.zh.md)**。 -Python 在 AI 领域的主导地位源于一个核心原则:**一切都像 Python**。无论您使用 pandas、PyTorch 还是 NumPy,都可以用 **Pythonic 的方式与它们交互**——相同的 `print()`、迭代和属性访问模式随处可用。 +## 阅读顺序 -### 分布式系统如何破坏了这一点 +1. **[模块化与边界](modularity.zh.md)** — 四层模型、crate 地图、依赖规则(从这里开始) +2. **[数据层](data-layer.zh.md)** — MEMT/MEMC、mmap、SQL 集成 +3. **[分布式 → 概览](distributed.zh.md)** — 多节点心智模型,再读下方子页 -当 AI 模型扩展到分布式集群时,一些根本性的东西被打破了:**分布式系统不是 Pythonic 的**。单机调试感觉很自然——`print(model.parameters())`、`loss.item()`、`torch.cuda.memory_allocated()`——但分布式调试迫使您使用系统管理工具:`kubectl get nodes`、SSH 会话、日志文件解析、监控仪表板。 +## 平台核心 -### Probing 的使命 - -Probing 的核心使命很简单:**让分布式系统重新变得 Pythonic**。您的集群、节点和分布式进程都可以通过熟悉的接口访问。不再需要在工具之间切换,您可以留在 Python 中,**用 Pythonic 的方式与您的分布式系统对话**。 - -## 设计原则 - -### 🔍 零侵入 - -- 无需修改代码 -- 无需更改环境设置 -- 无需中断工作流 -- 动态探针注入到运行中的进程 - -### 🎯 零学习曲线 +| 文档 | 说明 | +|------|------| +| [模块化与边界](modularity.zh.md) | L1–L4 分层、公开契约、归属边界 | +| [数据层](data-layer.zh.md) | 热/冷列存与 SQL 集成 | +| [扩展机制](extensibility.zh.md) | `@table` 插件、skills、NCCL profiler | +| [CLI 命令树](cli.zh.md) | 命令分组、target 规则、迁移方案(草案) | -- 标准 SQL 接口用于数据分析 -- 熟悉的数据库查询模式 -- 直观的命令行工具 -- 基于 Web 的可视化仪表板 +## 采集与 Profiling -### 📦 零部署负担 +| 文档 | 说明 | +|------|------| +| [性能分析](profiling.zh.md) | Torch hook、采样、落表路径 | +| [NCCL Profiler](nccl-profiler.zh.md) | 插件 ABI、proxy 等待分解 | +| [调试引擎](debugging.zh.md) | eval / backtrace / REPL 实现 | +| [训练阶段](training-phase.zh.md) | 阶段转换与 span 模型 | -- 单一二进制部署(基于 Rust) -- 静态编译,最小依赖 -- Linux 优先设计,其他平台支持查询/执行 -- 弹性扩展能力 +## 分布式 -## 设计文档 +| 文档 | 说明 | +|------|------| +| [概览](distributed.zh.md) | 多节点拓扑、控制面、联邦入门 | +| [torchrun 集群心跳](torchrun-cluster.zh.md) | 分层注册、退避、环境变量 | +| [联邦查询引擎](federation.zh.md) | 跨 rank SQL 路径 A/B/C、标签、回归查询 | +| [分层集群查询](hierarchical-fanout.zh.md) | coordinator → local0 → leaf 聚合 | +| [基于 Pulsing 的集群](cluster-pulsing.zh.md) | 可选 Pulsing 成员发现 | -与实现文档共用的术语(端点、step、role、联邦):**[核心概念](../guide/concepts.zh.md)**。 +## 旧版 -| 文档 | 描述 | +| 文档 | 说明 | |------|------| -| [模块化与边界](modularity.zh.md) | **核心 vs 功能模块**、接口、依赖规则、ownership | -| [系统架构](architecture.zh.md) | 系统结构和组件 | -| [数据层](data-layer.zh.md) | 冷热分层列式存储与 SQL 集成 | -| [性能分析](profiling.zh.md) | 性能数据收集 | -| [调试](debugging.zh.md) | 调试能力 | -| [分布式](distributed.zh.md) | 多节点支持 | -| [torchrun 集群心跳](torchrun-cluster.zh.md) | 分层注册、心跳退避、env 预设 | -| [联邦查询引擎](federation.zh.md) | 跨 rank SQL:诊断场景、三条执行路径、万卡验收 | -| [NCCL Profiler](nccl-profiler.zh.md) | NCCL 插件、culprit/victim、`nccl.proxy_ops` | -| [基于 Pulsing 的集群](cluster-pulsing.zh.md) | 使用 Pulsing 做成员发现与故障检测 | -| [扩展机制](extensibility.zh.md) | 自定义表和指标 | - -用户向操作:**[用户指南](../guide/index.zh.md)**(SQL、skill、调试)。 -参考:**[SQL 表目录](../reference/sql-tables.zh.md)** · **[API 参考](../api-reference.zh.md)**。 +| [系统架构(旧版)](architecture.zh.md) | 两层概览 — 已由 [模块化](modularity.zh.md) 取代 | + +用户向工作流:**[用户指南](../guide/index.zh.md)** · 参考:**[SQL 表目录](../reference/sql-tables.zh.md)** · **[CLI 与 Python API](../api-reference.zh.md)** diff --git a/docs/src/design/training-phase.md b/docs/src/design/training-phase.md new file mode 100644 index 00000000..faeeda2d --- /dev/null +++ b/docs/src/design/training-phase.md @@ -0,0 +1,13 @@ +# Training Phases + +!!! note "Language" + The full design is available in **[中文 / Chinese](/zh/design/training-phase/)** only. + An English translation is planned. + +Training phase transitions (`forward`, `backward`, `optimizer`, collective boundaries) and +how they map to `python.trace_event` spans. + +See also: + +- [Profiling](profiling.md) — hook and sampling pipeline +- [Core Concepts — steps & phases](../guide/concepts.md) diff --git a/docs/src/guide/concepts.md b/docs/src/guide/concepts.md index f4de957a..262f0e1b 100644 --- a/docs/src/guide/concepts.md +++ b/docs/src/guide/concepts.md @@ -1,10 +1,9 @@ -# How Probing Works +# Core model -This page builds the mental model you need to use Probing effectively. It's not a -reference — it explains the architecture, the data flow, and the key design decisions -from a user's perspective. Read this before anything else. +Runtime layout, catalogs, and coordinates used across CLI, SQL, and architecture docs. +For column definitions see **[SQL Tables](../reference/sql-tables.md)**. -## The two modes: in-process vs attach +## In-process vs attach Probing works in two fundamentally different ways. Understanding the difference avoids a lot of confusion. diff --git a/docs/src/guide/concepts.zh.md b/docs/src/guide/concepts.zh.md index 03ac0b9d..08524aa5 100644 --- a/docs/src/guide/concepts.zh.md +++ b/docs/src/guide/concepts.zh.md @@ -1,8 +1,6 @@ -# 核心概念 +# 核心模型 -逐步构建 Probing 的心理模型——endpoint 是什么、数据如何流入表、step 坐标如何 -组织状态、以及联邦查询如何跨节点工作。在深入 [SQL 分析](sql-analytics.zh.md)或 -[分布式](../design/distributed.zh.md)之前请先阅读本文。 +运行时布局、catalog 与坐标;CLI、SQL 与架构文档共用。列定义见 **[SQL 表目录](../reference/sql-tables.zh.md)**。 ## Endpoint:如何访问 probing 服务器 diff --git a/docs/src/guide/index.md b/docs/src/guide/index.md index c9d76f00..376c2471 100644 --- a/docs/src/guide/index.md +++ b/docs/src/guide/index.md @@ -1,42 +1,37 @@ # User Guide -How-to guides for analyzing and debugging AI training with Probing. +Command and SQL usage for operators. Contracts (columns, HTTP, env vars) live in +**[Reference](../reference/index.md)**; internals in **[Architecture](../design/index.md)**. -## What Probing does +Terminology: **[Core model](concepts.md)**. -| Layer | What you get | How | -|-------|--------------|-----| -| **Continuous profiling** | `python.torch_trace`, `python.comm_collective`, spans, plugins | Hooks append rows as training runs | -| **Live introspection** | Inspect live objects, capture stacks | CLI `eval`, `backtrace` (or in-process API) | -| **SQL analytics** | Ad-hoc and federated queries | `query`, `global.*`, `cluster query` | -| **Diagnostic skills** | Curated multi-step investigations | `probing skill run ` | +## Interfaces -Terminology anchor: **[Core Concepts](concepts.md)**. Table columns: **[SQL Tables](../reference/sql-tables.md)**. +| Interface | Input | Output / side effect | +|-----------|-------|-------------------| +| `probing query` | SQL on `probe.*` / `global.*` | `DataFrame` JSON | +| `probing eval` | Python source | stdout / exception in target interpreter | +| `probing backtrace` | — | Rows in `python.backtrace` | +| `probing skill run` | skill id + params | Steps from `skills/*/steps.yaml` | +| `probing cluster nodes` | — | `cluster.nodes` registry view | +| `probing cluster query` | SQL + `cluster=true` | Fan-out per [Federation](../design/federation.md) | -## Reading order +Built-in tables: `python.torch_trace`, `python.comm_collective`, `gpu.utilization`, `nccl.proxy_ops`, … — see **[SQL Tables](../reference/sql-tables.md)**. -New users — **Getting Started** in the nav: Installation → Quick Start → Core Concepts. +## Page order -Then this guide: +1. [SQL Analytics](sql-analytics.md) — `global.*`, federation tags, JOIN rules +2. [Diagnostic Skills](skills.md) — `steps.yaml` runner +3. [Memory Analysis](memory-analysis.md) — `python.torch_trace`, GPU tables +4. [Live Debugging](debugging.md) — backtrace, eval, REPL +5. [Troubleshooting](troubleshooting.md) — HTTP, inject, empty tables -1. **[SQL Analytics](sql-analytics.md)** — queries, `global.*`, `_role` -2. **[Diagnostic Skills](skills.md)** — `health_overview`, `slow_rank`, … -3. **[Memory Analysis](memory-analysis.md)** — leaks and GPU pressure -4. **[Debugging](debugging.md)** — backtrace / eval workflows -5. **[Troubleshooting](troubleshooting.md)** — common failures +Getting started path: Installation → Quick Start → Core model (nav **Getting Started**). -## Primary CLI commands +## Architecture pointers -| Command | Role | -|---------|------| -| `query` | Read profiling tables | -| `eval` | Run Python in the target process | -| `backtrace` | Capture stack → `python.backtrace` | +- [Modularity & boundaries](../design/modularity.md) — L1–L4 layers +- [Distributed overview](../design/distributed.md) — membership, fan-out +- [Extensibility](../design/extensibility.md) — `@table`, skills -Full CLI reference: **[API Reference](../api-reference.md)**. - -## Design docs - -- **[Architecture](../design/architecture.md)** — probe, engine, extensions -- **[Distributed](../design/distributed.md)** — cluster, federation -- **[Extensibility](../design/extensibility.md)** — `@table` plugins +CLI flags: **[CLI & Python API](../api-reference.md)**. diff --git a/docs/src/guide/index.zh.md b/docs/src/guide/index.zh.md index 53846400..c2d93a50 100644 --- a/docs/src/guide/index.zh.md +++ b/docs/src/guide/index.zh.md @@ -1,42 +1,37 @@ # 用户指南 -使用 Probing 分析与调试 AI 训练的操作指南。 +面向操作员的命令与 SQL 用法。列定义、HTTP、环境变量见 **[参考手册](../reference/index.zh.md)**; +实现见 **[架构](../design/index.zh.md)**。 -## Probing 做什么 +术语:**[核心模型](concepts.zh.md)**。 -| 层次 | 产出 | 方式 | -|------|------|------| -| **持续采集** | `python.torch_trace`、`python.comm_collective`、span、插件表 | 钩子随训练追加行 | -| **现场内省** | 查看 live 对象、抓栈 | CLI `eval`、`backtrace`(或进程内 API) | -| **SQL 分析** | 临时与联邦查询 | `query`、`global.*`、`cluster query` | -| **诊断 skill** | 多步调查剧本 | `probing skill run ` | +## 接口 -术语:**[核心概念](concepts.zh.md)**。列定义:**[SQL 表目录](../reference/sql-tables.zh.md)**。 +| 接口 | 输入 | 输出 / 副作用 | +|------|------|----------------| +| `probing query` | `probe.*` / `global.*` 上的 SQL | `DataFrame` JSON | +| `probing eval` | Python 源码 | 目标解释器 stdout / 异常 | +| `probing backtrace` | — | 写入 `python.backtrace` | +| `probing skill run` | skill id + 参数 | 执行 `skills/*/steps.yaml` | +| `probing cluster nodes` | — | `cluster.nodes` 注册视图 | +| `probing cluster query` | SQL + `cluster=true` | 按 [联邦引擎](../design/federation.zh.md) fan-out | -## 阅读顺序 +内置表:`python.torch_trace`、`python.comm_collective`、`gpu.utilization`、`nccl.proxy_ops` 等 — 见 **[SQL 表目录](../reference/sql-tables.zh.md)**。 -新用户请走导航 **入门**:安装指南 → 快速开始 → 核心概念。 +## 页面顺序 -然后读本指南: +1. [SQL 分析](sql-analytics.zh.md) — `global.*`、联邦标签、JOIN 规则 +2. [诊断 Skill](skills.zh.md) — `steps.yaml` 运行器 +3. [内存分析](memory-analysis.zh.md) — `python.torch_trace`、GPU 表 +4. [现场调试](debugging.zh.md) — backtrace、eval、REPL +5. [常见问题](troubleshooting.zh.md) — HTTP、inject、空表 -1. **[SQL 分析](sql-analytics.zh.md)** — 查询、`global.*`、`_role` -2. **[诊断 Skill](skills.zh.md)** — `health_overview`、`slow_rank` 等 -3. **[内存分析](memory-analysis.zh.md)** — 泄漏与 GPU 压力 -4. **[调试指南](debugging.zh.md)** — backtrace / eval 工作流 -5. **[常见问题](troubleshooting.zh.md)** — 典型故障 +入门路径:安装指南 → 快速开始 → 核心模型(导航 **入门**)。 -## 主要 CLI 命令 +## 架构索引 -| 命令 | 作用 | -|------|------| -| `query` | 读取采集表 | -| `eval` | 在目标进程执行 Python | -| `backtrace` | 抓栈 → `python.backtrace` | +- [模块化与边界](../design/modularity.zh.md) — L1–L4 +- [分布式概览](../design/distributed.zh.md) — 成员、fan-out +- [扩展机制](../design/extensibility.zh.md) — `@table`、skills -完整 CLI:**[API 参考](../api-reference.zh.md)**。 - -## 设计文档 - -- **[系统架构](../design/architecture.zh.md)** — 探针、引擎、扩展 -- **[分布式](../design/distributed.zh.md)** — 集群与联邦 -- **[扩展机制](../design/extensibility.zh.md)** — `@table` 插件 +CLI 完整列表:**[CLI 与 Python API](../api-reference.zh.md)**。 diff --git a/docs/src/index.md b/docs/src/index.md index 422f7719..2179c6a6 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -1,99 +1,54 @@ --- template: home.html title: Probing - Dynamic Performance Profiler for Distributed AI -description: Attach to running Python training processes, query performance data with SQL, and diagnose distributed issues across cluster nodes. +description: In-process profiler with SQL query interface for Python training workloads. hide: toc --- # Probing -Probing lets you inspect and debug distributed AI training jobs — without modifying your code. -Attach to a running Python process, query performance data through standard SQL, and run -diagnostic workflows to find slow ranks, NCCL bottlenecks, or memory leaks. +In-process profiler for Python training jobs. A Rust core (`probing._core`) embeds an HTTP +server and a DataFusion SQL engine; collectors append rows to mmap memtables; the CLI and +Web UI send queries over a Unix socket or TCP. -## In 30 seconds +## Components + +| Component | Location | Function | +|-----------|----------|----------| +| **Probe** | Target Python process | HTTP server, engine, extension registration | +| **Engine** | `probing/core` | DataFusion catalog, federation rewrite, `async_query` | +| **Memtable** | `probing/memtable` | MEMT ring buffers, optional MEMC cold segments | +| **Collectors** | `probing/extensions/*`, `python/probing/` | CPU, GPU, NCCL, torch hooks → SQL tables | +| **CLI / Web** | `probing/cli`, `web/` | HTTP client; no direct engine link at runtime | + +Activation: `PROBING=1` at process start (`.pth` hook), or `probing -t inject` on Linux. + +## Minimal example ```bash pip install probing - -# Start training with probing enabled PROBING=1 python train.py & -# Attach and inspect -probing -t $(pgrep -f train.py) backtrace probing -t $(pgrep -f train.py) query " - SELECT module, stage, AVG(duration) as sec + SELECT module, stage, avg(duration) AS sec FROM python.torch_trace GROUP BY module, stage ORDER BY sec DESC LIMIT 5 " ``` -The first command starts a training job with probing activated. The second captures -every Python and native frame on the main thread. The third finds the five slowest -module-stage pairs with a single SQL query — no logging, no instrumentation, no restart. - -## What you can do with it - -**Debug a hanging or slow training job.** -Attach to the stuck process, grab a backtrace, check GPU memory per step, and identify -the exact module or collective call that's blocking. No need to reproduce the issue. - -**Profile collective communication at scale.** -The NCCL profiler plugin decomposes proxy-op wait time into send/recv latencies so you -can tell who's waiting on whom — essential for debugging all-reduce tail latency. - -**Write custom performance tables.** -Define a dataclass with `@table("my_metrics")`, append rows from your training loop, and -query them alongside built-in tables. Your data lives in `python.my_metrics`, same -namespace, same SQL interface. - -**Query across cluster nodes.** -Prefix any table with `global.` to fan out to registered peers. Each row carries `_rank`, -`_role`, `_host` tags so results are directly comparable across the cluster. - -## How it works - -Probing ships as a Python package with a compiled Rust core (`probing._core`). When you -run `PROBING=1 python train.py`, a `.pth` hook starts an in-process HTTP server and -registers data sources for the SQL engine. Extensions — CPU sampling, GPU memory, NCCL -proxy ops, Python stack tracing — push rows into append-only columnar tables backed by -mmap ring buffers. The CLI talks to the embedded server over a Unix socket (local) or TCP -(remote). - -You don't need to know any of that to use it. `pip install probing` and you're done. - -## Start here - -**I want to debug a training issue.** -Read [Quick Start](quickstart.md), then try `probing backtrace` and `probing query`. - -**I want to understand the architecture.** -Read [Core Concepts](guide/concepts.md) and [Modularity & Boundaries](design/modularity.md). - -**I'm setting up a multi-node cluster.** -Read [Distributed](design/distributed.md) and the [SQL Tables](reference/sql-tables.md) reference. - -**I want to write a custom diagnostic skill.** -Read [Extensibility](design/extensibility.md) and browse `skills/` for examples. +`backtrace` writes `python.backtrace`; `query` reads registered tables under the `probe` +catalog; `global.*` fans out when cluster membership is configured (see [Distributed overview](design/distributed.md)). -**I want to contribute.** -Read [Contributing](contributing.md), `make develop`, and pick an issue. +## Documentation -## Documentation map +| Section | Content | +|---------|---------| +| [Installation](installation.md) | PyPI, wheel, platforms, `PROBING` modes | +| [Quick Start](quickstart.md) | Attach, inject, first queries | +| [Core model](guide/concepts.md) | In-process vs attach, catalogs, step coordinates | +| [User Guide](guide/index.md) | SQL, skills, debugging commands | +| [Architecture](design/index.md) | Layers, storage, federation, collectors | +| [Reference](reference/index.md) | SQL tables, CLI/API, env vars | -| Doc | Covers | -|-----|--------| -| [Installation](installation.md) | `pip install`, `PROBING=1`, platform support | -| [Quick Start](quickstart.md) | First 5 minutes, real-world debugging scenarios | -| [Core Concepts](guide/concepts.md) | How Probing works — mental model, data flow, step coordinates, federation | -| [SQL Tables](reference/sql-tables.md) | Column reference for every built-in table | -| [API Reference](api-reference.md) | CLI commands and Python API | -| [Environment Variables](reference/env-vars.md) | Complete `PROBING_*` variable reference (30+ entries) | -| [Skill Format](reference/skill-format.md) | `steps.yaml` and `SKILL.md` specification | -| [SQL Analytics](guide/sql-analytics.md) | Query patterns, JOIN examples, time-series | -| [Diagnostic Skills](guide/skills.md) | Running and writing diagnostic workflows | -| [Extensibility](design/extensibility.md) | Data table plugins, diagnostic skills, NCCL profiler | -| [Distributed](design/distributed.md) | Multi-node federation, torchrun integration | -| [NCCL Profiler](design/nccl-profiler.md) | NCCL plugin, proxy-op wait decomposition | -| [Contributing](contributing.md) | Dev setup, pull request workflow | +Contributors: [Contributing](contributing.md) · Doc style: [writing.md](writing.md) diff --git a/docs/src/index.zh.md b/docs/src/index.zh.md index 846044af..b3d17bd5 100644 --- a/docs/src/index.zh.md +++ b/docs/src/index.zh.md @@ -1,95 +1,53 @@ --- template: home.html title: Probing - 分布式 AI 动态性能分析器 -description: 附着到运行中的 Python 训练进程,用 SQL 查询性能数据,跨集群节点诊断分布式问题。 +description: 面向 Python 训练负载的进程内 profiler,提供 SQL 查询接口。 hide: toc --- # Probing -无需修改代码即可检查和调试分布式 AI 训练任务。附着到运行中的 Python 进程,用标准 SQL -查询性能数据,运行诊断工作流定位慢 rank、NCCL 瓶颈或内存泄漏。 +面向 Python 训练任务的进程内 profiler。Rust 核心(`probing._core`)嵌入 HTTP 服务器与 +DataFusion SQL 引擎;采集器向 mmap memtable 追加行;CLI 与 Web 经 Unix socket 或 TCP 发查询。 -## 30 秒上手 +## 组件 + +| 组件 | 位置 | 作用 | +|------|------|------| +| **Probe** | 目标 Python 进程 | HTTP 服务、引擎、扩展注册 | +| **Engine** | `probing/core` | DataFusion catalog、联邦改写、`async_query` | +| **Memtable** | `probing/memtable` | MEMT 环形缓冲、可选 MEMC 冷段 | +| **Collectors** | `probing/extensions/*`、`python/probing/` | CPU、GPU、NCCL、torch hook → SQL 表 | +| **CLI / Web** | `probing/cli`、`web/` | HTTP 客户端;运行时不对链 engine | + +启用方式:进程启动时 `PROBING=1`(`.pth` hook),或 Linux 上 `probing -t inject`。 + +## 最小示例 ```bash pip install probing - -# 启动带 probing 的训练 PROBING=1 python train.py & -# 附着并检查 -probing -t $(pgrep -f train.py) backtrace probing -t $(pgrep -f train.py) query " - SELECT module, stage, AVG(duration) as sec + SELECT module, stage, avg(duration) AS sec FROM python.torch_trace GROUP BY module, stage ORDER BY sec DESC LIMIT 5 " ``` -第一条命令启动一个已激活 probing 的训练任务。第二条捕获主线程上所有 Python 和原生帧。 -第三条用一条 SQL 查出最慢的五个模块-阶段组合——无需加日志、无需插桩、无需重启。 - -## 能做什么 - -**调试卡住或变慢的训练任务。** -附着到卡住的进程,抓取调用栈,按 step 查看 GPU 内存变化,精确定位是哪个模块或集合通信 -调用在阻塞。不需要复现问题。 - -**诊断分布式集合通信性能。** -NCCL profiler 插件将 proxy-op 等待时间分解为 send/recv 延迟,能清晰判断谁在等谁—— -调试 all-reduce 尾部延迟的关键工具。 - -**编写自定义性能表。** -用 `@table("my_metrics")` 定义 dataclass,从训练循环中追加行,和内置表一起查询。 -数据存在 `python.my_metrics`,同一命名空间,同一 SQL 接口。 - -**跨集群节点查询。** -在任何表前加 `global.` 前缀即可 fan-out 到已注册节点。每行附带 `_rank`、`_role`、 -`_host` 标签,结果可直接跨集群对比。 - -## 工作原理 - -Probing 以 Python 包形式发布,内置编译好的 Rust 核心(`probing._core`)。 -当你运行 `PROBING=1 python train.py` 时,一个 `.pth` 钩子启动进程内 HTTP 服务器, -为 SQL 引擎注册数据源。扩展模块——CPU 采样、GPU 显存、NCCL proxy ops、Python 调用栈 -追踪——将行数据推送到 mmap 环形缓冲区支持的只追加列式表中。CLI 通过 Unix socket -(本地)或 TCP(远程)与嵌入式服务器通信。 - -作为用户,你不需要了解这些细节。`pip install probing` 就够了。 - -## 从这里开始 - -**我想调试训练问题。** -阅读[快速开始](quickstart.zh.md),然后试试 `probing backtrace` 和 `probing query`。 - -**我想理解架构。** -阅读[核心概念](guide/concepts.zh.md)和[模块化与边界](design/modularity.zh.md)。 - -**我在搭建多节点集群。** -阅读[分布式](design/distributed.zh.md)和 [SQL 表目录](reference/sql-tables.zh.md)。 - -**我想写一个自定义诊断 skill。** -阅读[扩展性](design/extensibility.zh.md),浏览 `skills/` 目录下的示例。 - -**我想贡献代码。** -阅读[贡献指南](contributing.zh.md),执行 `make develop`,挑一个 issue 开始。 +`backtrace` 写入 `python.backtrace`;`query` 读取 `probe` catalog 下已注册表;配置集群成员后 +`global.*` 跨 rank fan-out(见 [分布式概览](design/distributed.zh.md))。 -## 文档导航 +## 文档 -| 文档 | 内容 | +| 章节 | 内容 | |------|------| -| [安装指南](installation.zh.md) | `pip install`、`PROBING=1`、平台支持 | -| [快速开始](quickstart.zh.md) | 5 分钟上手,真实调试场景 | -| [核心概念](guide/concepts.zh.md) | Probing 工作原理——心理模型、数据流、step 坐标、联邦查询 | -| [SQL 表目录](reference/sql-tables.zh.md) | 每张内置表的列定义 | -| [API 参考](api-reference.zh.md) | CLI 命令和 Python API | -| [环境变量](reference/env-vars.md) | 全部 30+ 个 `PROBING_*` 环境变量参考 | -| [Skill 格式规范](reference/skill-format.md) | `steps.yaml` 和 `SKILL.md` 格式规范 | -| [SQL 分析](guide/sql-analytics.zh.md) | 查询模式、JOIN 示例、时序分析 | -| [诊断 Skill](guide/skills.zh.md) | 运行和编写诊断工作流 | -| [扩展机制](design/extensibility.zh.md) | 数据表插件、诊断 skill、NCCL profiler | -| [分布式](design/distributed.zh.md) | 多节点联邦、torchrun 集成 | -| [NCCL Profiler](design/nccl-profiler.zh.md) | NCCL 插件、proxy-op 等待分解 | -| [贡献指南](contributing.zh.md) | 开发环境搭建、PR 流程 | +| [安装指南](installation.zh.md) | PyPI、wheel、平台、`PROBING` 模式 | +| [快速开始](quickstart.zh.md) | attach、inject、首条查询 | +| [核心模型](guide/concepts.zh.md) | 进程内 vs inject、catalog、step 坐标 | +| [用户指南](guide/index.zh.md) | SQL、skill、调试命令 | +| [架构](design/index.zh.md) | 分层、存储、联邦、采集器 | +| [参考手册](reference/index.zh.md) | SQL 表、CLI/API、环境变量 | + +贡献者:[贡献指南](contributing.zh.md) · 文档风格:[writing.md](writing.md) diff --git a/docs/src/reference/env-vars.md b/docs/src/reference/env-vars.md index 2868e743..1adb2264 100644 --- a/docs/src/reference/env-vars.md +++ b/docs/src/reference/env-vars.md @@ -142,6 +142,8 @@ Hierarchical side-channel registration when `WORLD_SIZE > 1`. See [torchrun clus | `PROBING_CLUSTER_DISCOVER_TIMEOUT_SEC` | `2` | Timeout per master/local0 discovery attempt. | | `PROBING_CLUSTER_REPORT_TIMEOUT_SEC` | `5` | HTTP PUT timeout for cluster report. | | `PROBING_CLUSTER_PRESET` | — | Used by `examples/run_cluster_multinode.sh`: `demo`, `fast`, or `steady`. | +| `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | Hierarchical cluster query fan-out (coordinator → local0 → leaves). `0` = flat fan-out to every peer. See [Hierarchical fan-out](../design/hierarchical-fanout.md). | +| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `2` | Per-peer timeout for remote federated / cluster queries (seconds). | ## Debugging & diagnostics diff --git a/docs/src/reference/env-vars.zh.md b/docs/src/reference/env-vars.zh.md new file mode 100644 index 00000000..24fa4a3c --- /dev/null +++ b/docs/src/reference/env-vars.zh.md @@ -0,0 +1,32 @@ +# 环境变量 + +Probing 读取的全部 `PROBING_*` 环境变量参考(按子系统分组)。英文版见 [Environment Variables](env-vars.md)。 + +## 激活 + +| 变量 | 取值 | 默认 | 说明 | +|----------|--------|---------|-------------| +| `PROBING` | `0`, `1`/`followed`, `2`/`nested`, `regex:PATTERN`, `SCRIPT.py` | 未设置(禁用) | 是否启用 probing。`1` 仅当前进程;`2` 当前及子进程;`regex:` 脚本名匹配时启用。 | +| `PROBING_ORIGINAL` | (自动设置) | — | 备份原始 `PROBING` 值;由 site_hook 设置,勿手动设置。 | + +## 集群 {#集群} + +`WORLD_SIZE > 1` 时的分层 side-channel 注册。详见 [torchrun 集群心跳](../design/torchrun-cluster.zh.md) 与 [分层 fan-out](../design/hierarchical-fanout.zh.md)。 + +| 变量 | 默认 | 说明 | +|----------|---------|-------------| +| `PROBING_CLUSTER_REPORT` | `1` | 周期性心跳 worker;`0` = 仅 HTTP,无周期 PUT。 | +| `PROBING_CLUSTER_REPORT_INTERVAL_SEC` | `10` | 基础心跳间隔(秒)。 | +| `PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC` | `120` | 退避上限(低于 stale TTL)。 | +| `PROBING_CLUSTER_REPORT_BACKOFF_FACTOR` | `2` | 稳定 tick 的倍增因子。 | +| `PROBING_CLUSTER_REPORT_BACKOFF` | `1` | 设为 `0` 禁用稳定时的指数退避。 | +| `PROBING_CLUSTER_STALE_SEC` | `25` | 无心跳超过此秒数标记为 `dead`;应大于最大间隔。 | +| `PROBING_CLUSTER_DISCOVER_TIMEOUT_SEC` | `2` | 每次 master/local0 发现超时。 | +| `PROBING_CLUSTER_REPORT_TIMEOUT_SEC` | `5` | 集群 report HTTP PUT 超时。 | +| `PROBING_CLUSTER_PRESET` | — | `examples/run_cluster_multinode.sh` 使用:`demo`、`fast`、`steady`。 | +| `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | 分层集群查询 fan-out;`0` = 扁平 fan-out 到所有 peer。 | +| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `2` | 远程联邦 / 集群查询的单 peer 超时(秒)。 | + +## 其余变量 + +激活、存储、Server、认证、Tracing、采样、NCCL、RDMA、PyTorch、调试等章节与 [英文 env-vars](env-vars.md) 同步;尚未单独翻译。 diff --git a/docs/src/reference/index.md b/docs/src/reference/index.md index 61240e0e..92de72eb 100644 --- a/docs/src/reference/index.md +++ b/docs/src/reference/index.md @@ -5,7 +5,7 @@ Authoritative lookup for SQL schemas, CLI commands, and runtime APIs. | Page | Contents | |------|----------| | **[SQL Tables](sql-tables.md)** | Physical columns for `python.*`, `cluster.*`, and federation tags (synced with `tables.yaml`) | -| **[API Reference](../api-reference.md)** | CLI, in-process Python API, config, [unimplemented APIs](../api-reference.md#unimplemented-apis) | +| **[CLI & Python API](../api-reference.md)** | CLI, in-process Python API, config, [unimplemented APIs](../api-reference.md#unimplemented-apis) | | **[Environment Variables](env-vars.md)** | Complete reference of all 30+ `PROBING_*` environment variables | | **[Skill Format](skill-format.md)** | `steps.yaml` and `SKILL.md` specification for diagnostic skill authors | | **[Versions](../versions.md)** | Release compatibility and upgrade notes | diff --git a/docs/src/reference/index.zh.md b/docs/src/reference/index.zh.md index e470c7a3..32c39d13 100644 --- a/docs/src/reference/index.zh.md +++ b/docs/src/reference/index.zh.md @@ -5,8 +5,8 @@ SQL 表结构、CLI 命令与运行时 API 的权威查阅入口。 | 页面 | 内容 | |------|------| | **[SQL 表目录](sql-tables.zh.md)** | `python.*`、`cluster.*` 物理列与联邦标签(与 `tables.yaml` 同步) | -| **[API 参考](../api-reference.zh.md)** | CLI、进程内 Python API、配置、[未实现 API](../api-reference.zh.md#unimplemented-apis) | -| **[环境变量](env-vars.md)** | 全部 30+ 个 `PROBING_*` 环境变量的完整参考 | +| **[CLI 与 Python API](../api-reference.zh.md)** | CLI、进程内 Python API、配置、[未实现 API](../api-reference.zh.md#unimplemented-apis) | +| **[环境变量](env-vars.zh.md)** | 全部 `PROBING_*` 环境变量(集群章节已翻译;其余见英文对照) | | **[Skill 格式规范](skill-format.md)** | 面向诊断 skill 作者的 `steps.yaml` 和 `SKILL.md` 格式规范 | | **[版本兼容性](../versions.zh.md)** | 版本兼容与升级说明 | diff --git a/docs/src/writing.md b/docs/src/writing.md new file mode 100644 index 00000000..8d5dc85d --- /dev/null +++ b/docs/src/writing.md @@ -0,0 +1,44 @@ +# Documentation style + +Probing docs follow the tone of infrastructure projects (Kubernetes, DataFusion, Tokio): +**spec-first, mechanism-first**. Describe what the system is and how it behaves; avoid +product positioning and scenario marketing. + +## Prefer + +| Style | Example | +|-------|---------| +| **Logical** — structure, dependencies, invariants | «Federation rewrites `probe.*` → `global.*` at the coordinator; peers never recurse.» | +| **Technical** — APIs, data paths, defaults, failure modes | «`POST /apis/cluster/query` defaults `hierarchical=true`; missing `local_rank` falls back to flat fan-out.» | +| **Neutral headings** | «Execution model», «Catalog rewrite», «Example SQL» | +| **Tables for contracts** | Entry points, env vars, tag columns, path A/B/C conditions | + +## Avoid + +| Style | Example (do not write) | +|-------|------------------------| +| **Functional / marketing** | «Debug hanging jobs without reproducing», «essential for tail latency» | +| **Strategic / mission** | «Product goal», «Probing's mission is to make distributed Pythonic» | +| **Persona routing** | «I want to debug…», «Read when you…» | +| **Outcome promises** | «Find the exact module that's blocking», «90% of diagnostics» | +| **Diagnostic story arcs** | «Straggler chain: rank → machine → heatmap» as narrative; use query-pattern headings instead | + +## Document roles + +| Area | Audience | Content | +|------|----------|---------| +| **Reference** | Lookup | Schemas, CLI flags, env vars, HTTP DTOs — no tutorials | +| **Guide** | Operators | Commands + SQL that exercise documented behavior | +| **Architecture** | Contributors | Layers, crates, protocols, algorithms, regression queries | +| **Examples** | End-to-end | Reproducible commands against sample workloads | + +## Bilingual + +English and Chinese pages should share the same **section structure and contracts**. +Translate mechanism, not slogans. If only one language is complete, the stub links to the +other without marketing filler. + +## Cross-links + +- Architecture defers usage to Guide; Guide defers contracts to Reference and Architecture. +- One SSOT per topic (`modularity.md` for layers, `federation.md` for cross-rank SQL semantics). diff --git a/probing/cli/src/cli/cluster.rs b/probing/cli/src/cli/cluster.rs index 7829c9b5..8f84f57e 100644 --- a/probing/cli/src/cli/cluster.rs +++ b/probing/cli/src/cli/cluster.rs @@ -13,6 +13,9 @@ pub enum ClusterCommand { /// Query only the connected endpoint (skip cluster fan-out) #[arg(long)] local: bool, + /// Flat fan-out to every registered peer (disable hierarchical aggregation) + #[arg(long)] + flat: bool, }, /// List nodes in the cluster view Nodes, @@ -20,15 +23,23 @@ pub enum ClusterCommand { pub async fn run(ctrl: ProbeEndpoint, cmd: ClusterCommand) -> Result<()> { match cmd { - ClusterCommand::Query { query, local } => cluster_query(ctrl, &query, !local).await, + ClusterCommand::Query { query, local, flat } => { + cluster_query(ctrl, &query, !local, !flat).await + } ClusterCommand::Nodes => cluster_nodes(ctrl).await, } } -async fn cluster_query(ctrl: ProbeEndpoint, expr: &str, cluster: bool) -> Result<()> { +async fn cluster_query( + ctrl: ProbeEndpoint, + expr: &str, + cluster: bool, + hierarchical: bool, +) -> Result<()> { let body = serde_json::json!({ "expr": expr, "cluster": cluster, + "hierarchical": hierarchical, }); let reply = ctrl .post_json("/apis/cluster/query", &body.to_string()) diff --git a/probing/cli/src/cli/commands.rs b/probing/cli/src/cli/commands.rs index abba0217..19bed7b6 100644 --- a/probing/cli/src/cli/commands.rs +++ b/probing/cli/src/cli/commands.rs @@ -123,11 +123,12 @@ impl Settings { #[derive(Subcommand, Debug)] pub enum Commands { + /// Inject libprobing into a running process (Linux ptrace) #[cfg(target_os = "linux")] #[command(visible_aliases = ["in", "i"])] Inject(super::inject::InjectCommand), - /// List all processes with injected probes + /// List processes that already have probing enabled #[command(visible_aliases = ["ls", "l"])] List { #[arg(short, long, help = "Show detailed information")] @@ -216,7 +217,8 @@ pub enum Commands { #[command(visible_aliases = ["r"])] Repl, - /// Launch new Python process + /// Launch a command with probing enabled (Linux) + #[cfg(target_os = "linux")] #[command()] Launch { #[arg(short, long)] @@ -244,4 +246,8 @@ pub enum Commands { /// Run structured diagnostic skills (shared with Web Agent) #[command(subcommand, visible_aliases = ["doc", "dr"])] Skill(super::skill::SkillCommand), + + /// MCP endpoint URL and agent config for the target probing server + #[command(subcommand, visible_aliases = ["agent-mcp"])] + Mcp(super::mcp::McpCommand), } diff --git a/probing/cli/src/cli/ctrl.rs b/probing/cli/src/cli/ctrl.rs index 8d5ef813..afcb0ee5 100644 --- a/probing/cli/src/cli/ctrl.rs +++ b/probing/cli/src/cli/ctrl.rs @@ -94,9 +94,14 @@ impl ProbeEndpoint { Ok(()) } - pub async fn eval(&self, code: String) -> Result<()> { + /// Run Python in the target process and return the raw JSON response body. + pub async fn eval_json(&self, code: String) -> Result { let reply = request(self.clone(), "/apis/pythonext/eval", Some(code)).await?; - let reply_str = String::from_utf8(reply)?; + Ok(String::from_utf8(reply)?) + } + + pub async fn eval(&self, code: String) -> Result<()> { + let reply_str = self.eval_json(code).await?; // Parse JSON response and handle output similar to repl match serde_json::from_str::(&reply_str) { diff --git a/probing/cli/src/cli/help.rs b/probing/cli/src/cli/help.rs new file mode 100644 index 00000000..2af766fa --- /dev/null +++ b/probing/cli/src/cli/help.rs @@ -0,0 +1,177 @@ +//! Grouped root `--help` for flat subcommands (clap has no multi-heading support yet). +//! +//! Section titles and blurbs live here; per-command one-liners come from clap `about` +//! on each subcommand in `commands.rs`. + +use clap::Command; + +const ROOT_HELP_TEMPLATE: &str = "\ +{before-help}{about-with-newline}\ +{usage-heading} {usage}\n\ +\n\ +{options}\n\ +{after-help}\ +"; + +struct HelpSection { + /// Section title shown in `probing --help`. + heading: &'static str, + /// One-line intent (shown under the title). + blurb: &'static str, + commands: &'static [&'static str], +} + +/// Help grouping — not argv paths. See `docs/src/design/cli.md` § Help sections. +#[cfg(target_os = "linux")] +const SECTIONS: &[HelpSection] = &[ + HelpSection { + heading: "Processes", + blurb: "Start probing on a process, wrap a new command, or list probed PIDs", + commands: &["inject", "launch", "list"], + }, + HelpSection { + heading: "Analyze", + blurb: "Run SQL, inspect table catalog, fan out across cluster nodes", + commands: &["query", "tables", "cluster"], + }, + HelpSection { + heading: "Diagnose", + blurb: "Interactive inspection — Python eval, REPL, stack traces", + commands: &["eval", "repl", "backtrace"], + }, + HelpSection { + heading: "Runtime", + blurb: "Runtime state and profiling — memory, config, flamegraphs, RDMA flows", + commands: &["memory", "config", "flamegraph", "rdma"], + }, + HelpSection { + heading: "Agent", + blurb: "Diagnostic skills and MCP — start with `skill run health_overview`", + commands: &["skill", "mcp"], + }, +]; + +#[cfg(not(target_os = "linux"))] +const SECTIONS: &[HelpSection] = &[ + HelpSection { + heading: "Processes", + blurb: "List processes that already have probing enabled", + commands: &["list"], + }, + HelpSection { + heading: "Analyze", + blurb: "Run SQL, inspect table catalog, fan out across cluster nodes", + commands: &["query", "tables", "cluster"], + }, + HelpSection { + heading: "Diagnose", + blurb: "Interactive inspection — Python eval, REPL, stack traces", + commands: &["eval", "repl", "backtrace"], + }, + HelpSection { + heading: "Runtime", + blurb: "Runtime state and profiling — memory, config, flamegraphs, RDMA flows", + commands: &["memory", "config", "flamegraph", "rdma"], + }, + HelpSection { + heading: "Agent", + blurb: "Diagnostic skills and MCP — start with `skill run health_overview`", + commands: &["skill", "mcp"], + }, +]; + +/// Replace the default flat subcommand list with grouped sections in `{after-help}`. +pub fn apply_grouped_root_help(cmd: &mut Command) { + let grouped = render_grouped_subcommands(cmd); + *cmd = cmd + .clone() + .help_template(ROOT_HELP_TEMPLATE) + .after_help(grouped.clone()) + .after_long_help(grouped); +} + +fn render_grouped_subcommands(root: &Command) -> String { + let mut out = String::new(); + let name_width = 14_usize; + + for section in SECTIONS { + let mut lines = Vec::new(); + for name in section.commands { + let Some(sub) = root.find_subcommand(name) else { + continue; + }; + if sub.is_hide_set() { + continue; + } + let about = sub + .get_about() + .or_else(|| sub.get_long_about()) + .map(|s| s.to_string()) + .unwrap_or_default(); + lines.push((name, about)); + } + if lines.is_empty() { + continue; + } + if !out.is_empty() { + out.push('\n'); + } + use std::fmt::Write as _; + let _ = writeln!(out, "{} — {}", section.heading, section.blurb); + for (name, about) in lines { + let _ = writeln!(out, " {name: --help` for command-specific options.\n", + ); + out +} + +#[cfg(test)] +mod tests { + use super::*; + use clap::CommandFactory; + + use crate::cli::Cli; + + #[test] + fn grouped_help_lists_all_sections() { + let cmd = Cli::command(); + let text = render_grouped_subcommands(&cmd); + for heading in [ + "Processes —", + "Analyze —", + "Diagnose —", + "Runtime —", + "Agent —", + ] { + assert!( + text.contains(heading), + "missing section {heading} in:\n{text}" + ); + } + assert!(text.contains("query")); + assert!(text.contains("skill")); + assert!(text.contains("mcp")); + assert!(!text.contains("Profile —")); + assert!(!text.contains("Skills —")); + assert!(!text.contains("Attach")); + assert!(text.contains("skill run health_overview")); + assert!(text.contains("`-t PID`")); + } + + #[test] + fn root_short_help_includes_grouped_commands() { + let mut cmd = crate::cli::Cli::build_command(); + let mut buf = Vec::new(); + cmd.write_help(&mut buf).unwrap(); + let text = String::from_utf8(buf).expect("utf8 help"); + assert!(text.contains("Processes —")); + assert!(text.contains("Runtime —")); + assert!(text.contains("Agent —")); + } +} diff --git a/probing/cli/src/cli/mcp.rs b/probing/cli/src/cli/mcp.rs new file mode 100644 index 00000000..46c2916e --- /dev/null +++ b/probing/cli/src/cli/mcp.rs @@ -0,0 +1,90 @@ +//! MCP (Model Context Protocol) helpers for coding-agent integration. + +use anyhow::{Context, Result}; +use clap::Subcommand; + +use crate::cli::ctrl::ProbeEndpoint; + +#[derive(Subcommand, Debug, Clone)] +pub enum McpCommand { + /// Print the MCP endpoint URL for the target probing server + Url, + /// Print a ready-to-paste MCP server config snippet (Cursor / Claude Code) + Config { + /// Server name in the agent config JSON + #[arg(long, default_value = "probing")] + name: String, + }, +} + +pub async fn run(ctrl: ProbeEndpoint, cmd: McpCommand) -> Result<()> { + let base = mcp_base_url(&ctrl).await?; + let url = format!("{base}/mcp"); + match cmd { + McpCommand::Url => { + println!("{url}"); + } + McpCommand::Config { name } => { + let snippet = serde_json::json!({ + "mcpServers": { + name: { "url": url } + } + }); + println!("{}", serde_json::to_string_pretty(&snippet)?); + } + } + Ok(()) +} + +async fn mcp_base_url(ctrl: &ProbeEndpoint) -> Result { + match ctrl { + ProbeEndpoint::Remote { addr } => Ok(format!("http://{addr}")), + ProbeEndpoint::Local { .. } | ProbeEndpoint::Ptrace { .. } => { + let addr = ctrl.get("/config/server.address").await.context( + "could not read server.address from target; \ + set PROBING_PORT (or server.address) on the training process", + )?; + Ok(normalize_listen_addr(addr.trim())) + } + ProbeEndpoint::Launch { .. } => { + anyhow::bail!( + "MCP is served by the probing HTTP server; use `-t ` or `-t host:port`" + ) + } + } +} + +fn normalize_listen_addr(addr: &str) -> String { + let host_port = if let Some(port) = addr.strip_prefix("0.0.0.0:") { + format!("127.0.0.1:{port}") + } else if let Some(port) = addr.strip_prefix("[::]:") { + format!("127.0.0.1:{port}") + } else if let Some(port) = addr.strip_prefix(":::") { + format!("127.0.0.1:{port}") + } else { + addr.to_string() + }; + + if host_port.starts_with("http://") || host_port.starts_with("https://") { + host_port + } else { + format!("http://{host_port}") + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn normalize_wildcard_bind() { + assert_eq!( + normalize_listen_addr("0.0.0.0:8080"), + "http://127.0.0.1:8080" + ); + assert_eq!( + normalize_listen_addr("127.0.0.1:18080"), + "http://127.0.0.1:18080" + ); + } +} diff --git a/probing/cli/src/cli/mod.rs b/probing/cli/src/cli/mod.rs index 77d91a47..68cc88be 100644 --- a/probing/cli/src/cli/mod.rs +++ b/probing/cli/src/cli/mod.rs @@ -6,6 +6,8 @@ pub mod bench; pub mod cluster; pub mod commands; pub mod ctrl; +pub mod help; +pub mod mcp; pub mod repl; pub mod skill; @@ -45,7 +47,7 @@ static BUILD_INFO: Lazy = Lazy::new(get_build_info); /// Probing CLI - A performance and stability diagnostic tool for AI applications #[derive(Parser, Debug)] -#[command(version = BUILD_INFO.as_str())] +#[command(version = BUILD_INFO.as_str(), arg_required_else_help = true)] pub struct Cli { /// Enable verbose mode #[arg(short, long, global = true)] @@ -60,6 +62,14 @@ pub struct Cli { } impl Cli { + /// Build the clap [`Command`] with grouped root `--help` (see [`help`]). + pub fn build_command() -> clap::Command { + let mut cmd = ::command(); + cmd = cmd.subcommand_required(true).arg_required_else_help(true); + help::apply_grouped_root_help(&mut cmd); + cmd + } + pub async fn run(&mut self) -> Result<()> { // Handle external commands first to avoid target requirement if let Some(Commands::External(args)) = &self.command { @@ -216,13 +226,10 @@ impl Cli { } async fn execute_command(&self, ctrl: ProbeEndpoint) -> Result<()> { - if self.command.is_none() { - #[cfg(target_os = "linux")] - inject::InjectCommand::default().run(ctrl.clone()).await?; - - return Ok(()); - } - let command = self.command.as_ref().unwrap(); + let command = self + .command + .as_ref() + .expect("subcommand required (clap arg_required_else_help)"); match command { #[cfg(target_os = "linux")] Commands::Inject(cmd) => cmd.run(ctrl).await, @@ -284,8 +291,10 @@ impl Cli { } Commands::Cluster(cmd) => cluster::run(ctrl, cmd.clone()).await, Commands::Skill(cmd) => skill::run(ctrl, cmd.clone()).await, + Commands::Mcp(cmd) => mcp::run(ctrl, cmd.clone()).await, Commands::Repl => repl::start_repl(ctrl).await, // These commands are handled in run() method and don't need a target + #[cfg(target_os = "linux")] Commands::Launch { .. } | Commands::List { .. } | Commands::Store(..) @@ -293,6 +302,13 @@ impl Cli { | Commands::External(..) => { unreachable!("These commands should be handled in run() method") } + #[cfg(not(target_os = "linux"))] + Commands::List { .. } + | Commands::Store(..) + | Commands::Bench(..) + | Commands::External(..) => { + unreachable!("These commands should be handled in run() method") + } } } } diff --git a/probing/cli/src/cli/skill/mod.rs b/probing/cli/src/cli/skill/mod.rs index 540ffe40..7d879edd 100644 --- a/probing/cli/src/cli/skill/mod.rs +++ b/probing/cli/src/cli/skill/mod.rs @@ -1,10 +1,14 @@ //! Structured diagnostic skills (``probing skill``). -mod interpret; -mod loader; +pub mod interpret; +pub mod loader; mod runner; -pub use runner::{list_skills as list_skills_sync, run_skill}; +pub use loader::{ + build_context, default_parameters, expand_template, list_skill_ids, load_skill, Skill, + SkillStep, +}; +pub use runner::{list_skills as list_skills_sync, run_skill, run_skill_json}; use std::collections::HashMap; diff --git a/probing/cli/src/cli/skill/runner.rs b/probing/cli/src/cli/skill/runner.rs index bd05f422..d6a2c072 100644 --- a/probing/cli/src/cli/skill/runner.rs +++ b/probing/cli/src/cli/skill/runner.rs @@ -411,3 +411,139 @@ pub async fn run_skill( } Ok(()) } + +/// Execute a skill and return structured JSON for MCP / agent consumers. +pub async fn run_skill_json( + ctrl: ProbeEndpoint, + skill_id: &str, + mut overrides: HashMap, +) -> Result { + let pb = load_skill(skill_id)?; + resolve_use_global(&ctrl, &pb, &mut overrides).await; + let ctx = build_context(&pb, &overrides); + + let mut steps_out = Vec::new(); + let mut evidence = Vec::new(); + let mut abort = false; + + for step in &pb.steps { + if abort { + break; + } + let outcome = run_step(&ctrl, step, &ctx).await; + if let Some(ev) = outcome_to_evidence(&outcome) { + evidence.push(ev); + } + steps_out.push(outcome_to_json(&outcome)); + if matches!( + &outcome, + StepOutcome::Error { .. } if step.on_empty == "abort" + ) { + abort = true; + } + } + + let findings = evaluate_rules(&pb.interpretation, &evidence, &ctx); + let findings_json: Vec = findings + .iter() + .map(|f| { + serde_json::json!({ + "rule_id": f.rule_id, + "severity": f.severity, + "message": f.message, + }) + }) + .collect(); + + let mut summary_ctx = ctx.clone(); + for ev in &evidence { + summary_ctx.insert( + format!("{}.row_count", ev.step_id), + ev.row_count.to_string(), + ); + } + let summary = if pb.summary_template.is_empty() { + String::new() + } else { + expand_template(&pb.summary_template, &summary_ctx) + }; + + let had_error = steps_out.iter().any(|s| { + s.get("status") + .and_then(|v| v.as_str()) + .is_some_and(|st| st == "error") + }); + + let payload = serde_json::json!({ + "skill_id": pb.id, + "title": pb.title, + "parameters": overrides, + "steps": steps_out, + "findings": findings_json, + "summary": summary, + "next_steps": pb.next_steps, + "status": if had_error { "error" } else { "ok" }, + }); + + if had_error { + anyhow::bail!(payload.to_string()); + } + Ok(payload) +} + +fn outcome_to_json(outcome: &StepOutcome) -> serde_json::Value { + match outcome { + StepOutcome::Sql { + step_id, + title, + dataframe, + row_count, + note, + } => { + serde_json::json!({ + "step_id": step_id, + "title": title, + "status": "ok", + "row_count": row_count, + "note": note, + "dataframe": dataframe, + }) + } + StepOutcome::ApiText { + step_id, + title, + text, + } => { + serde_json::json!({ + "step_id": step_id, + "title": title, + "status": "ok", + "text": text, + }) + } + StepOutcome::Skipped { + step_id, + title, + reason, + } => { + serde_json::json!({ + "step_id": step_id, + "title": title, + "status": "skipped", + "reason": reason, + }) + } + StepOutcome::Error { + step_id, + title, + message, + } => { + serde_json::json!({ + "step_id": step_id, + "title": title, + "status": "error", + "message": message, + }) + } + } +} diff --git a/probing/cli/src/lib.rs b/probing/cli/src/lib.rs index 26624823..05e95a52 100644 --- a/probing/cli/src/lib.rs +++ b/probing/cli/src/lib.rs @@ -5,14 +5,73 @@ pub mod table; pub mod inject; use anyhow::Result; -use clap::Parser; +use clap::error::ErrorKind; +use clap::FromArgMatches; use env_logger::Env; const ENV_PROBING_LOGLEVEL: &str = "PROBING_LOGLEVEL"; +fn is_help_or_version(err: &clap::Error) -> bool { + matches!( + err.kind(), + ErrorKind::DisplayHelp + | ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand + | ErrorKind::DisplayVersion + ) +} + +/// Parse argv; returns `None` after printing `--help` / `--version` (success, no further work). +fn parse_cli(args: Vec) -> Result> { + let cmd = cli::Cli::build_command(); + match cmd.clone().try_get_matches_from(args) { + Ok(matches) => { + if matches.subcommand().is_none() { + let mut help_cmd = cmd; + help_cmd.print_long_help()?; + return Ok(None); + } + Ok(Some(cli::Cli::from_arg_matches(&matches)?)) + } + Err(e) if is_help_or_version(&e) => { + e.print()?; + Ok(None) + } + Err(e) => Err(e.into()), + } +} + /// Main entry point for the CLI, can be called from Python or as a binary #[tokio::main] pub async fn cli_main(args: Vec) -> Result<()> { let _ = env_logger::try_init_from_env(Env::new().filter(ENV_PROBING_LOGLEVEL)); - cli::Cli::parse_from(args).run().await + let Some(mut cli) = parse_cli(args)? else { + return Ok(()); + }; + cli.run().await +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn help_flag_exits_cleanly_without_error() { + let result = parse_cli(vec!["probing".into(), "--help".into()]); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } + + #[test] + fn bare_invocation_shows_help() { + let result = parse_cli(vec!["probing".into()]); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } + + #[test] + fn version_flag_exits_cleanly_without_error() { + let result = parse_cli(vec!["probing".into(), "--version".into()]); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } } diff --git a/probing/core/src/core/cluster.rs b/probing/core/src/core/cluster.rs index 4d059a06..920fc95e 100644 --- a/probing/core/src/core/cluster.rs +++ b/probing/core/src/core/cluster.rs @@ -178,6 +178,101 @@ pub fn get_nodes() -> Vec { nodes } +fn prefer_node_representative(candidate: &Node, existing: &Node) -> bool { + match (candidate.local_rank, existing.local_rank) { + (Some(0), Some(0)) => { + candidate.rank.unwrap_or(i32::MAX) < existing.rank.unwrap_or(i32::MAX) + } + (Some(0), _) => true, + (_, Some(0)) => false, + _ => candidate.rank.unwrap_or(i32::MAX) < existing.rank.unwrap_or(i32::MAX), + } +} + +/// Alive peers excluding this process's listen addresses. +pub fn remote_peers_excluding_local() -> Vec { + let local_addrs = local_listen_addrs(); + get_nodes() + .into_iter() + .filter(is_node_alive) + .filter(|node| !local_addrs.iter().any(|local| local == &node.addr)) + .collect() +} + +/// One node-aggregator endpoint per ``group_rank`` (prefers ``local_rank == 0``). +/// +/// Used at the coordinator tier so fan-out is O(nodes) not O(world_size). +pub fn node_aggregator_peers() -> Vec { + use std::collections::HashMap; + + let local_addrs = local_listen_addrs(); + let mut by_group: HashMap = HashMap::new(); + + for node in get_nodes().into_iter().filter(is_node_alive) { + if node.local_rank != Some(0) { + continue; + } + if local_addrs.iter().any(|local| local == &node.addr) { + continue; + } + let Some(group_rank) = node.group_rank else { + continue; + }; + by_group + .entry(group_rank) + .and_modify(|existing| { + if prefer_node_representative(&node, existing) { + *existing = node.clone(); + } + }) + .or_insert(node); + } + + let mut peers: Vec = by_group.into_values().collect(); + peers.sort_by_key(|n| n.group_rank.unwrap_or(i32::MAX)); + peers +} + +/// Leaf ranks on this node (same ``group_rank``, excluding self). +pub fn local_leaf_peers() -> Vec { + let local_addrs = local_listen_addrs(); + let group_rank = env_i32("GROUP_RANK").or_else(|| env_i32("NODE_RANK")); + let self_rank = env_i32("RANK"); + + get_nodes() + .into_iter() + .filter(is_node_alive) + .filter(|node| { + if local_addrs.iter().any(|local| local == &node.addr) { + return false; + } + if let (Some(g), Some(expected)) = (node.group_rank, group_rank) { + if g != expected { + return false; + } + } + if let (Some(r), Some(self_r)) = (node.rank, self_rank) { + if r == self_r { + return false; + } + } + true + }) + .collect() +} + +fn env_i32(name: &str) -> Option { + std::env::var(name).ok().and_then(|v| v.trim().parse().ok()) +} + +/// Whether ``cluster.nodes`` has enough metadata for hierarchical fan-out. +pub fn hierarchical_metadata_available() -> bool { + get_nodes() + .iter() + .filter(|n| is_node_alive(n)) + .any(|n| n.group_rank.is_some() && n.local_rank.is_some()) +} + #[cfg(any(test, feature = "test-utils"))] pub fn reset_cluster_for_tests() { *write_cluster() = Cluster::default(); @@ -244,4 +339,62 @@ mod tests { let ranks: Vec = get_nodes().into_iter().filter_map(|n| n.rank).collect(); assert_eq!(ranks, vec![0, 1, 2, 3]); } + + #[test] + fn node_aggregator_peers_one_per_group_rank() { + let _guard = TEST_LOCK.lock().unwrap(); + reset_cluster_for_tests(); + set_local_listen_addrs(vec!["127.0.0.1:9000".into()]); + write_cluster().put(Node { + host: "h".into(), + addr: "127.0.0.1:9000".into(), + rank: Some(0), + group_rank: Some(0), + local_rank: Some(0), + status: Some("running".into()), + ..Default::default() + }); + for (rank, group, local) in [(1, 0, 1), (8, 1, 0), (9, 1, 1)] { + let port = 8080 + rank; + write_cluster().put(Node { + host: "h".into(), + addr: format!("10.0.0.{rank}:{port}"), + rank: Some(rank), + group_rank: Some(group), + local_rank: Some(local), + status: Some("running".into()), + ..Default::default() + }); + } + let peers = node_aggregator_peers(); + assert_eq!(peers.len(), 1); + assert_eq!(peers[0].rank, Some(8)); + assert_eq!(peers[0].local_rank, Some(0)); + } + + #[test] + fn local_leaf_peers_same_group_only() { + let _guard = TEST_LOCK.lock().unwrap(); + reset_cluster_for_tests(); + set_local_listen_addrs(vec!["127.0.0.1:9000".into()]); + std::env::set_var("GROUP_RANK", "0"); + std::env::set_var("RANK", "0"); + for (rank, group, local) in [(0, 0, 0), (1, 0, 1), (8, 1, 0)] { + let port = 8080 + rank; + write_cluster().put(Node { + host: "h".into(), + addr: format!("10.0.0.{rank}:{port}"), + rank: Some(rank), + group_rank: Some(group), + local_rank: Some(local), + status: Some("running".into()), + ..Default::default() + }); + } + let leaves = local_leaf_peers(); + assert_eq!(leaves.len(), 1); + assert_eq!(leaves[0].rank, Some(1)); + std::env::remove_var("GROUP_RANK"); + std::env::remove_var("RANK"); + } } diff --git a/probing/core/src/core/federation/aggregate_pushdown.rs b/probing/core/src/core/federation/aggregate_pushdown.rs index e6d295d0..b66d0db7 100644 --- a/probing/core/src/core/federation/aggregate_pushdown.rs +++ b/probing/core/src/core/federation/aggregate_pushdown.rs @@ -26,6 +26,9 @@ use super::convert::{ cluster_rank_for_endpoint, is_federation_tag_column, proto_dataframe_to_record_batch, tag_proto_dataframe, }; +use super::fanout_scope::{ + current_fanout_scope, is_local0_from_env, resolve_fanout_scope, FanoutScope, +}; static PARTIAL_TABLE_ID: AtomicU64 = AtomicU64::new(0); @@ -69,6 +72,7 @@ pub async fn try_execute_aggregate_pushdown( reset_fanout_stats(); let mut proto_parts = Vec::new(); + let scope = resolve_fanout_scope(current_fanout_scope()); let host = ProbeClusterExecutor::local_host_label(); let addr = ProbeClusterExecutor::local_addr_label(); @@ -83,28 +87,26 @@ pub async fn try_execute_aggregate_pushdown( } let per_node_sql = plan.per_node_sql.clone(); + let mut stats = FanoutStats::default(); + + if scope == FanoutScope::Coordinator && is_local0_from_env() { + let leaf_sql = per_node_sql.clone(); + let leaf_outcomes = tokio::task::spawn_blocking(move || { + ProbeClusterExecutor::fanout_query_to_peers_scoped(&leaf_sql, FanoutScope::Node) + }) + .await + .map_err(|e| DataFusionError::Execution(format!("local leaf fan-out failed: {e}")))?; + append_fanout_outcomes(&mut proto_parts, &mut stats, &plan, leaf_outcomes); + } + + let remote_scope = scope; + let remote_sql = per_node_sql.clone(); let outcomes = tokio::task::spawn_blocking(move || { - ProbeClusterExecutor::fanout_query_to_peers(&per_node_sql) + ProbeClusterExecutor::fanout_query_to_peers_scoped(&remote_sql, remote_scope) }) .await .map_err(|e| DataFusionError::Execution(format!("aggregate fan-out join failed: {e}")))?; - - let mut stats = FanoutStats::default(); - for outcome in outcomes { - match outcome.result { - Ok(mut df) => { - stats.nodes_succeeded += 1; - if plan.inject_tags { - tag_proto_dataframe(&mut df, &outcome.host, &outcome.addr, outcome.rank); - } - proto_parts.push(df); - } - Err(err) => { - log::debug!("aggregate pushdown skipped {}: {err}", outcome.addr); - stats.nodes_failed.push(outcome.addr); - } - } - } + append_fanout_outcomes(&mut proto_parts, &mut stats, &plan, outcomes); set_fanout_stats(stats); if proto_parts.is_empty() { @@ -132,6 +134,29 @@ pub async fn try_execute_aggregate_pushdown( Ok(Some(result)) } +fn append_fanout_outcomes( + proto_parts: &mut Vec, + stats: &mut FanoutStats, + plan: &FederatedAggregatePlan, + outcomes: Vec, +) { + for outcome in outcomes { + match outcome.result { + Ok(mut df) => { + stats.nodes_succeeded += 1; + if plan.inject_tags { + tag_proto_dataframe(&mut df, &outcome.host, &outcome.addr, outcome.rank); + } + proto_parts.push(df); + } + Err(err) => { + log::debug!("aggregate pushdown skipped {}: {err}", outcome.addr); + stats.nodes_failed.push(outcome.addr); + } + } + } +} + async fn sql_to_proto_dataframe( engine: &Engine, sql: &str, diff --git a/probing/core/src/core/federation/cluster_executor.rs b/probing/core/src/core/federation/cluster_executor.rs index 560346dc..764849f5 100644 --- a/probing/core/src/core/federation/cluster_executor.rs +++ b/probing/core/src/core/federation/cluster_executor.rs @@ -4,7 +4,13 @@ use std::time::Duration; use datafusion::error::{DataFusionError, Result}; use probing_proto::prelude::{DataFrame, Message, Node, Query, QueryDataFormat}; -use crate::core::cluster::get_nodes; +use crate::core::cluster::{ + hierarchical_metadata_available, local_leaf_peers, node_aggregator_peers, + remote_peers_excluding_local, +}; +use crate::core::federation::fanout_scope::{ + current_fanout_scope, resolve_fanout_scope, FanoutScope, +}; #[cfg(any(test, feature = "test-utils"))] type RemoteQueryHook = Box Result + Send + Sync>; @@ -112,14 +118,35 @@ impl ProbeClusterExecutor { crate::core::cluster::local_addr_label() } - /// Peer nodes that are not the local node (deduplicated against listen addrs). + /// Peer nodes for the active fan-out scope (deduplicated against listen addrs). pub fn remote_nodes() -> Vec { - let local_addrs = Self::local_listen_addrs(); - get_nodes() - .into_iter() - .filter(crate::core::cluster::is_node_alive) - .filter(|node| !local_addrs.iter().any(|local| local == &node.addr)) - .collect() + Self::remote_nodes_for_scope(current_fanout_scope()) + } + + pub fn remote_nodes_for_scope(scope: FanoutScope) -> Vec { + let scope = resolve_fanout_scope(scope); + match scope { + FanoutScope::Local => Vec::new(), + FanoutScope::Flat => remote_peers_excluding_local(), + FanoutScope::Coordinator => { + if hierarchical_metadata_available() { + node_aggregator_peers() + } else { + log::debug!( + "hierarchical fan-out metadata missing; falling back to flat peers" + ); + remote_peers_excluding_local() + } + } + FanoutScope::Node => { + if hierarchical_metadata_available() { + local_leaf_peers() + } else { + remote_peers_excluding_local() + } + } + FanoutScope::Auto => remote_peers_excluding_local(), + } } /// Execute `sql` on every peer node concurrently, returning each node's result. @@ -128,21 +155,26 @@ impl ProbeClusterExecutor { /// so total latency is bounded by the slowest peer rather than the sum of all /// peers. Node identity is preserved for row tagging and fan-out accounting. pub fn fanout_query_to_peers(sql: &str) -> Vec { - let nodes = Self::remote_nodes(); + Self::fanout_query_to_peers_scoped(sql, current_fanout_scope()) + } + + pub fn fanout_query_to_peers_scoped(sql: &str, scope: FanoutScope) -> Vec { + let nodes = Self::remote_nodes_for_scope(scope); if nodes.is_empty() { return Vec::new(); } - std::thread::scope(|scope| { + let scope = resolve_fanout_scope(scope); + std::thread::scope(|s| { let handles: Vec<_> = nodes .into_iter() .map(|node| { - scope.spawn(move || { + s.spawn(move || { let host = if node.host.is_empty() { node.addr.clone() } else { node.host.clone() }; - let result = Self::execute_remote(&node.addr, sql); + let result = Self::execute_remote_scoped(&node.addr, sql, scope); RemoteFanoutResult { addr: node.addr, host, @@ -168,11 +200,107 @@ impl ProbeClusterExecutor { }) } + /// Peer nodes and execution scope for a federated table scan. + /// + /// When hierarchical coordinator tier finds no ``local_rank == 0`` aggregators, + /// falls back to flat peers and plain remote SQL (matches metadata-missing behavior). + pub fn federated_scan_targets() -> (Vec, FanoutScope) { + let resolved = resolve_fanout_scope(current_fanout_scope()); + match resolved { + FanoutScope::Coordinator => { + let peers = Self::remote_nodes_for_scope(FanoutScope::Coordinator); + if peers.is_empty() { + log::debug!("federated scan: no node aggregators; falling back to flat peers"); + ( + Self::remote_nodes_for_scope(FanoutScope::Flat), + FanoutScope::Flat, + ) + } else { + (peers, FanoutScope::Coordinator) + } + } + FanoutScope::Node => { + let peers = Self::remote_nodes_for_scope(FanoutScope::Node); + if peers.is_empty() { + log::debug!("federated scan: no local leaf peers; falling back to flat peers"); + ( + Self::remote_nodes_for_scope(FanoutScope::Flat), + FanoutScope::Flat, + ) + } else { + (peers, FanoutScope::Node) + } + } + scope => (Self::remote_nodes_for_scope(scope), scope), + } + } + pub fn execute_remote_query(addr: &str, sql: &str) -> Result { - Self::execute_remote(addr, sql) + Self::execute_remote_for_scope(addr, sql, current_fanout_scope()) + } + + pub fn execute_remote_for_scope( + addr: &str, + sql: &str, + scope: FanoutScope, + ) -> Result { + Self::execute_remote_scoped(addr, sql, scope) + } + + fn execute_remote_scoped(addr: &str, sql: &str, scope: FanoutScope) -> Result { + let scope = resolve_fanout_scope(scope); + if scope == FanoutScope::Coordinator { + return Self::execute_remote_node_aggregate(addr, sql); + } + Self::execute_remote_plain(addr, sql) + } + + /// Ask a node aggregator to fan in on-node ranks (``POST /apis/cluster/query``). + fn execute_remote_node_aggregate(addr: &str, sql: &str) -> Result { + #[cfg(any(test, feature = "test-utils"))] + if let Some(hook) = lock_remote_query_hook().as_ref() { + return hook(addr, sql); + } + + let url = format!("http://{addr}/apis/cluster/query"); + let body = serde_json::json!({ + "expr": sql, + "cluster": true, + "hierarchical": true, + "scope": "node", + }); + let body = serde_json::to_string(&body).map_err(external)?; + let addr_owned = addr.to_string(); + let response = ureq::post(&url) + .config() + .timeout_global(Some(remote_query_timeout())) + .build() + .send(body) + .map_err(external)?; + + let status = response.status().as_u16(); + let text = response.into_body().read_to_string().map_err(external)?; + if status >= 400 { + return Err(DataFusionError::Execution(format!( + "remote node aggregate {addr_owned} failed: HTTP {status}: {text}" + ))); + } + + let value: serde_json::Value = serde_json::from_str(&text).map_err(external)?; + if let Some(err) = value.get("error").and_then(|v| v.as_str()) { + return Err(DataFusionError::Execution(format!( + "remote node aggregate {addr_owned}: {err}" + ))); + } + let df_value = value.get("dataframe").ok_or_else(|| { + DataFusionError::Execution(format!( + "remote node aggregate {addr_owned}: missing dataframe" + )) + })?; + serde_json::from_value(df_value.clone()).map_err(external) } - fn execute_remote(addr: &str, sql: &str) -> Result { + fn execute_remote_plain(addr: &str, sql: &str) -> Result { #[cfg(any(test, feature = "test-utils"))] if let Some(hook) = lock_remote_query_hook().as_ref() { return hook(addr, sql); diff --git a/probing/core/src/core/federation/fanout_scope.rs b/probing/core/src/core/federation/fanout_scope.rs new file mode 100644 index 00000000..b076006f --- /dev/null +++ b/probing/core/src/core/federation/fanout_scope.rs @@ -0,0 +1,97 @@ +//! Request-scoped fan-out tier for hierarchical cluster queries. +//! +//! Coordinator → node aggregators (local0) → on-node leaf ranks. + +use std::cell::Cell; + +thread_local! { + static FANOUT_SCOPE: Cell = const { Cell::new(FanoutScope::Auto) }; +} + +/// How remote peers are selected for federated / cluster fan-out. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum FanoutScope { + #[default] + Auto, + /// Legacy: every alive peer except self. + Flat, + /// Global coordinator: one endpoint per node (``local_rank == 0`` / ``group_rank``). + Coordinator, + /// Node aggregator: sibling leaf ranks on the same ``group_rank``. + Node, + /// Local process only — no remote fan-out. + Local, +} + +impl FanoutScope { + pub fn as_str(self) -> &'static str { + match self { + Self::Auto => "auto", + Self::Flat => "flat", + Self::Coordinator => "coordinator", + Self::Node => "node", + Self::Local => "local", + } + } +} + +/// Whether hierarchical fan-out is enabled (default on). +pub fn hierarchical_fanout_enabled() -> bool { + match std::env::var("PROBING_CLUSTER_FANOUT_HIERARCHICAL") { + Ok(val) => { + let lower = val.trim().to_ascii_lowercase(); + !matches!(lower.as_str(), "0" | "false" | "no" | "off") + } + Err(_) => true, + } +} + +pub fn env_i32(name: &str) -> Option { + std::env::var(name).ok().and_then(|v| v.trim().parse().ok()) +} + +pub fn local_rank_from_env() -> Option { + env_i32("LOCAL_RANK") +} + +pub fn is_local0_from_env() -> bool { + local_rank_from_env().unwrap_or(0) == 0 +} + +pub fn resolve_fanout_scope(scope: FanoutScope) -> FanoutScope { + match scope { + FanoutScope::Auto => { + if hierarchical_fanout_enabled() && is_local0_from_env() { + FanoutScope::Coordinator + } else if hierarchical_fanout_enabled() { + FanoutScope::Local + } else { + FanoutScope::Flat + } + } + other => other, + } +} + +pub fn set_fanout_scope(scope: FanoutScope) { + FANOUT_SCOPE.set(scope); +} + +pub fn current_fanout_scope() -> FanoutScope { + FANOUT_SCOPE.get() +} + +pub fn take_fanout_scope() -> FanoutScope { + let scope = FANOUT_SCOPE.get(); + FANOUT_SCOPE.set(FanoutScope::Auto); + scope +} + +/// Run ``f`` with a scoped fan-out tier (sync). +pub fn with_fanout_scope(scope: FanoutScope, f: impl FnOnce() -> T) -> T { + let previous = FANOUT_SCOPE.get(); + FANOUT_SCOPE.set(scope); + let out = f(); + FANOUT_SCOPE.set(previous); + out +} diff --git a/probing/core/src/core/federation/federated_scan_exec.rs b/probing/core/src/core/federation/federated_scan_exec.rs index 344c64f2..33a15edf 100644 --- a/probing/core/src/core/federation/federated_scan_exec.rs +++ b/probing/core/src/core/federation/federated_scan_exec.rs @@ -29,6 +29,7 @@ use probing_proto::prelude::{DataFrame, Node}; use super::cluster_executor::{record_fanout_failure, record_fanout_success, ProbeClusterExecutor}; use super::convert::{align_batch_to_schema, dataframe_to_record_batch, tag_record_batch}; +use super::fanout_scope::FanoutScope; /// Federated scan plan combining the local table with lazily fetched peers. #[derive(Debug)] @@ -45,6 +46,8 @@ pub struct FederatedScanExec { remote_sql: String, /// Snapshot of peer nodes captured at planning time (one partition each). remote_nodes: Vec, + /// How [`Self::execute_remote`] talks to each peer (plain SQL vs node aggregate API). + remote_scope: FanoutScope, local_host: String, local_addr: String, local_rank: Option, @@ -59,6 +62,7 @@ impl FederatedScanExec { projection: Vec, remote_sql: String, remote_nodes: Vec, + remote_scope: FanoutScope, local_host: String, local_addr: String, local_rank: Option, @@ -82,6 +86,7 @@ impl FederatedScanExec { projection, remote_sql, remote_nodes, + remote_scope, local_host, local_addr, local_rank, @@ -123,6 +128,7 @@ impl FederatedScanExec { }; let rank = node.rank; let sql = self.remote_sql.clone(); + let remote_scope = self.remote_scope; let full = self.output_schema.clone(); let projection = self.projection.clone(); let projected_schema = self.projected_schema.clone(); @@ -132,7 +138,7 @@ impl FederatedScanExec { // failing the whole query, matching the legacy partial-result behavior. let fut = async move { let joined = tokio::task::spawn_blocking(move || { - ProbeClusterExecutor::execute_remote_query(&addr_query, &sql) + ProbeClusterExecutor::execute_remote_for_scope(&addr_query, &sql, remote_scope) }) .await; match joined { @@ -248,6 +254,7 @@ impl ExecutionPlan for FederatedScanExec { projection: self.projection.clone(), remote_sql: self.remote_sql.clone(), remote_nodes: self.remote_nodes.clone(), + remote_scope: self.remote_scope, local_host: self.local_host.clone(), local_addr: self.local_addr.clone(), local_rank: self.local_rank, diff --git a/probing/core/src/core/federation/global_table.rs b/probing/core/src/core/federation/global_table.rs index 8df153a5..dd9a929b 100644 --- a/probing/core/src/core/federation/global_table.rs +++ b/probing/core/src/core/federation/global_table.rs @@ -100,7 +100,7 @@ impl TableProvider for GlobalFederatedTable { let local_rank = cluster_rank_for_endpoint(&host, &addr); reset_fanout_stats(); - let remote_nodes = ProbeClusterExecutor::remote_nodes(); + let (remote_nodes, remote_scope) = ProbeClusterExecutor::federated_scan_targets(); // With peers registered, LIMIT is global top-K at the coordinator only. let scan_limit = if remote_nodes.is_empty() { limit } else { None }; @@ -130,6 +130,7 @@ impl TableProvider for GlobalFederatedTable { scan_projection, remote_sql, remote_nodes, + remote_scope, host, addr, local_rank, diff --git a/probing/core/src/core/federation/mod.rs b/probing/core/src/core/federation/mod.rs index 2f4bb859..b705b0e3 100644 --- a/probing/core/src/core/federation/mod.rs +++ b/probing/core/src/core/federation/mod.rs @@ -1,6 +1,7 @@ mod aggregate_pushdown; mod cluster_executor; mod convert; +mod fanout_scope; mod federated_scan_exec; mod global_catalog; mod global_table; @@ -24,6 +25,10 @@ pub use convert::{ PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_LOCAL_RANK_COL, PROBE_NODE_COL, PROBE_NODE_RANK_COL, PROBE_RANK_COL, PROBE_ROLE_COL, }; +pub use fanout_scope::{ + current_fanout_scope, hierarchical_fanout_enabled, is_local0_from_env, resolve_fanout_scope, + set_fanout_scope, take_fanout_scope, with_fanout_scope, FanoutScope, +}; pub use global_catalog::{install_global_catalog, GLOBAL_CATALOG}; pub use rewrite::{ can_fanout_via_global_catalog, ensure_global_node_columns, prepare_global_query, diff --git a/probing/extensions/python/src/features/stack_tracer.rs b/probing/extensions/python/src/features/stack_tracer.rs index e0001ed7..93cb7067 100644 --- a/probing/extensions/python/src/features/stack_tracer.rs +++ b/probing/extensions/python/src/features/stack_tracer.rs @@ -186,9 +186,13 @@ impl SignalTracer { fn trace_thread_signal(tid: i32) -> Result> { let pid = nix::unistd::getpid().as_raw(); + // Only one signal-based capture can run at a time (shared SIGUSR2 + + // sender slot). Concurrent requests losing the race is a benign "busy" + // state — the outer `trace()` already downgrades it to an empty result — + // so log at debug to avoid flooding training output with errors. let _guard = BACKTRACE_MUTEX.try_lock().map_err(|e| { - log::error!("Failed to acquire BACKTRACE_MUTEX: {e}"); - anyhow::anyhow!("Failed to acquire backtrace lock: {}", e) + log::debug!("backtrace capture busy, skipping concurrent request: {e}"); + anyhow::anyhow!("backtrace capture busy: {e}") })?; let (tx, rx) = mpsc::channel::>(); diff --git a/probing/server/API.md b/probing/server/API.md index 16ca6c96..f35aba3c 100644 --- a/probing/server/API.md +++ b/probing/server/API.md @@ -88,6 +88,59 @@ Rust-backed endpoints (`callstack`, `eval`) are thin `@ext_handler` wrappers aro | POST | `/query/dto` | SQL (JSON DTO, external clients) | | GET | `/config/{config_key}` | Read config value | | GET | `/ws` | WebSocket REPL | +| * | `/mcp` | MCP Streamable HTTP (agent tools + schema resources) | + +### MCP (Model Context Protocol) + +When built with the `rmcp` feature (default in the PyPI wheel), the server exposes MCP at **`/mcp`** using [Streamable HTTP](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http). + +#### Read tools (always enabled) + +| Tool | Purpose | +|------|---------| +| `query` | Read-only SQL against the in-process engine (`limit` caps rows) | +| `describe_tables` | Semantic docs from `probe.probing.table_docs` / `column_docs` | +| `list_skills` | List bundled diagnostic skills | +| `plan_skill` | Expand a skill into SQL/API steps without executing | +| `run_skill` | Execute a diagnostic skill (local process; optional `use_global`) | +| `list_cluster_nodes` | `GET /apis/nodes` — registered cluster members | +| `cluster_query` | Read-only SQL with optional cluster fan-out (`cluster` default `true`) | + +#### Write tools (disabled unless `PROBING_MCP_ALLOW_WRITE=1`) + +| Tool | Purpose | +|------|---------| +| `set_config` | `SET probing.* = …` runtime config | +| `eval_python` | `POST /apis/pythonext/eval` — run Python in the training process | + +Write calls are logged at `info` as `MCP write audit: …`. + +#### Resources + +| URI | Content | +|-----|---------| +| `probing://schema/catalog` | All table docs (JSON) | +| `probing://schema/{schema}/{table}` | One table doc + column docs (JSON) | + +Cursor / Claude Code example (remote training agent on `host:8080`): + +```json +{ + "mcpServers": { + "probing": { + "url": "http://127.0.0.1:8080/mcp" + } + } +} +``` + +Enable intervention tools for an on-call agent: + +```bash +export PROBING_MCP_ALLOW_WRITE=1 +``` + +For the in-process unix-socket server (same PID as training), point MCP at the TCP address from `server.address` config after `PROBING=1` startup. ## Adding endpoints diff --git a/probing/server/Cargo.toml b/probing/server/Cargo.toml index ab61bf06..32f1930b 100644 --- a/probing/server/Cargo.toml +++ b/probing/server/Cargo.toml @@ -12,7 +12,8 @@ extension-module = ["probing-python/extension-module"] gpu = ["dep:probing-gpu"] gpu-cuda = ["gpu", "probing-gpu/cuda"] kmsg = ["probing-cc/kmsg"] -default = ["extension-module", "kmsg"] +default = ["extension-module", "kmsg", "rmcp"] +rmcp = ["dep:rmcp", "dep:probing-cli"] [dependencies] probing-cc = { path = "../extensions/cc", default-features = false } @@ -22,6 +23,7 @@ probing-python = { path = "../extensions/python", default-features = false } probing-proto = { path = "../proto" } probing-core = { path = "../core" } probing-store = { path = "../crates/store" } +probing-cli = { path = "../cli", optional = true } datafusion = { workspace = true } @@ -50,6 +52,7 @@ axum = { version = "0.8.1", default-features = false, features = [ http-body-util = { version = "0.1" } serde_urlencoded = "0.7.1" futures-util = "0.3" +rmcp = { version = "1.8.0", features = ["server", "macros", "transport-streamable-http-server", "schemars"], optional = true } [target.'cfg(target_os = "linux")'.dependencies] procfs = { version = "0.17.0", default-features = false, features = ["chrono"] } diff --git a/probing/server/src/lib.rs b/probing/server/src/lib.rs index a78ad197..323ac4e9 100644 --- a/probing/server/src/lib.rs +++ b/probing/server/src/lib.rs @@ -1,3 +1,6 @@ +#[cfg(feature = "rmcp")] +pub mod mcp; + mod asset; // Make auth module public for integration tests pub mod auth; @@ -12,6 +15,7 @@ pub mod server; mod torchrun_cluster; mod vars; +pub use self::engine::initialize_engine; pub use self::report::start_report_worker; pub use self::server::start_local; pub use self::server::start_remote; diff --git a/probing/server/src/mcp/helpers.rs b/probing/server/src/mcp/helpers.rs new file mode 100644 index 00000000..4b3ef0fb --- /dev/null +++ b/probing/server/src/mcp/helpers.rs @@ -0,0 +1,161 @@ +//! Shared helpers for MCP tools (query shaping, write guard, audit). + +use probing_cli::cli::ctrl::ProbeEndpoint; +use probing_proto::prelude::{Ele, Query, QueryDataFormat}; +use rmcp::ErrorData; + +use crate::engine::handle_query; + +pub const DEFAULT_ROW_LIMIT: usize = 200; +pub const MAX_ROW_LIMIT: usize = 1000; + +pub fn allow_mcp_write() -> bool { + matches!( + std::env::var("PROBING_MCP_ALLOW_WRITE") + .ok() + .as_deref() + .map(str::trim), + Some("1") + | Some("true") + | Some("TRUE") + | Some("on") + | Some("ON") + | Some("yes") + | Some("YES") + ) +} + +pub fn require_write_permission(tool: &str) -> Result<(), ErrorData> { + if allow_mcp_write() { + Ok(()) + } else { + Err(tool_error(format!( + "tool `{tool}` is disabled by default; set PROBING_MCP_ALLOW_WRITE=1 to enable intervention tools" + ))) + } +} + +pub fn audit_mcp_write(tool: &str, detail: &str) { + log::info!("MCP write audit: tool={tool} detail={detail}"); +} + +pub fn local_ctrl() -> ProbeEndpoint { + ProbeEndpoint::Local { + pid: std::process::id() as i32, + } +} + +pub fn tool_error(message: impl Into) -> ErrorData { + ErrorData::invalid_params(message.into(), None) +} + +pub fn ensure_read_only_sql(sql: &str) -> Result<(), String> { + let upper = sql.trim().to_uppercase(); + if upper.starts_with("SELECT") + || upper.starts_with("WITH") + || upper.starts_with("SHOW") + || upper.starts_with("DESCRIBE") + { + Ok(()) + } else { + Err("Only read-only SQL is allowed (SELECT/WITH/SHOW/DESCRIBE)".to_string()) + } +} + +pub fn validate_config_key(key: &str) -> Result<(), String> { + let key = key.trim(); + if key.is_empty() { + return Err("config key must not be empty".to_string()); + } + if key.contains('=') || key.contains(';') || key.contains('\'') || key.contains('"') { + return Err("config key contains invalid characters".to_string()); + } + Ok(()) +} + +pub fn escape_sql_string(value: &str) -> String { + value.replace('\'', "''") +} + +pub async fn engine_query_json(sql: String, limit: usize) -> Result { + ensure_read_only_sql(&sql).map_err(tool_error)?; + let reply = handle_query(Query { + expr: sql, + opts: None, + }) + .await + .map_err(|e| tool_error(e.to_string()))?; + dataframe_reply_to_json(reply, limit) +} + +pub fn dataframe_reply_to_json( + reply: QueryDataFormat, + limit: usize, +) -> Result { + match reply { + QueryDataFormat::DataFrame(df) => Ok(truncate_dataframe_json(&df, limit)), + QueryDataFormat::Nil => Ok(serde_json::json!({ + "columns": [], + "rows": [], + "row_count": 0, + "truncated": false, + })), + QueryDataFormat::TimeSeries(_) => Err(tool_error( + "TimeSeries responses are not supported by MCP query tools", + )), + QueryDataFormat::Error(err) => Err(tool_error(format!("{:?}: {}", err.code, err.message))), + } +} + +pub fn truncate_dataframe_json( + df: &probing_proto::prelude::DataFrame, + limit: usize, +) -> serde_json::Value { + let total = df.len(); + let take = total.min(limit); + let mut rows = Vec::with_capacity(take); + for row in df.iter().take(take) { + let mut obj = serde_json::Map::new(); + for (name, cell) in df.names.iter().zip(row.iter()) { + obj.insert(name.clone(), ele_to_json(cell)); + } + rows.push(serde_json::Value::Object(obj)); + } + serde_json::json!({ + "columns": df.names, + "rows": rows, + "row_count": take, + "total_rows": total, + "truncated": total > take, + }) +} + +pub fn ele_to_json(ele: &Ele) -> serde_json::Value { + match ele { + Ele::Nil => serde_json::Value::Null, + Ele::BOOL(v) => serde_json::Value::Bool(*v), + Ele::I32(v) => serde_json::json!(v), + Ele::I64(v) => serde_json::json!(v), + Ele::F32(v) => serde_json::json!(v), + Ele::F64(v) => serde_json::json!(v), + Ele::Text(v) | Ele::Url(v) => serde_json::Value::String(v.clone()), + Ele::DataTime(v) => serde_json::json!(v), + } +} +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn write_disabled_by_default() { + std::env::remove_var("PROBING_MCP_ALLOW_WRITE"); + assert!(!allow_mcp_write()); + } + + #[test] + fn write_enabled_with_env() { + std::env::set_var("PROBING_MCP_ALLOW_WRITE", "1"); + assert!(allow_mcp_write()); + std::env::remove_var("PROBING_MCP_ALLOW_WRITE"); + } +} diff --git a/probing/server/src/mcp/mod.rs b/probing/server/src/mcp/mod.rs new file mode 100644 index 00000000..ce1938cb --- /dev/null +++ b/probing/server/src/mcp/mod.rs @@ -0,0 +1,553 @@ +//! Model Context Protocol (MCP) surface mounted on the probing HTTP server. +//! +//! Phase 1: read-only tools (`query`, skills). +//! Phase 2: schema grounding (`describe_tables`, resources), cluster tools, gated write tools. + +mod helpers; + +use std::collections::HashMap; +use std::sync::Arc; + +use axum::Router; +use probing_cli::cli::skill::{ + build_context, default_parameters, expand_template, list_skill_ids, load_skill, run_skill_json, + SkillStep, +}; +use probing_proto::prelude::{Query, QueryDataFormat}; +use rmcp::handler::server::router::tool::ToolRouter; +use rmcp::handler::server::wrapper::Parameters; +use rmcp::model::{ + CallToolResult, Content, ListResourcesResult, PaginatedRequestParams, RawResource, + ReadResourceRequestParams, ReadResourceResult, Resource, ResourceContents, ServerCapabilities, + ServerInfo, +}; +use rmcp::schemars::{self, JsonSchema}; +use rmcp::service::RequestContext; +use rmcp::tool; +use rmcp::tool_router; +use rmcp::transport::streamable_http_server::session::local::LocalSessionManager; +use rmcp::transport::streamable_http_server::{StreamableHttpServerConfig, StreamableHttpService}; +use rmcp::RoleServer; +use rmcp::ServerHandler; +use serde::Deserialize; + +use crate::engine::handle_query; +use helpers::{ + allow_mcp_write, audit_mcp_write, engine_query_json, ensure_read_only_sql, escape_sql_string, + local_ctrl, require_write_permission, tool_error, validate_config_key, DEFAULT_ROW_LIMIT, + MAX_ROW_LIMIT, +}; + +const SCHEMA_RESOURCE_PREFIX: &str = "probing://schema/"; + +/// Nest the MCP Streamable HTTP service under `/mcp`. +pub fn router() -> Router { + let service = StreamableHttpService::new( + || Ok(ProbingMcp::new()), + Arc::new(LocalSessionManager::default()), + StreamableHttpServerConfig::default(), + ); + Router::new().nest_service("/mcp", service) +} + +#[derive(Debug, Clone)] +pub struct ProbingMcp { + #[allow(dead_code)] + tool_router: ToolRouter, +} + +impl ProbingMcp { + pub fn new() -> Self { + Self { + tool_router: Self::tool_router(), + } + } +} + +impl Default for ProbingMcp { + fn default() -> Self { + Self::new() + } +} + +#[derive(Debug, Deserialize, JsonSchema)] +struct QueryArgs { + sql: String, + #[serde(default = "default_row_limit")] + limit: usize, +} + +fn default_row_limit() -> usize { + DEFAULT_ROW_LIMIT +} + +#[derive(Debug, Deserialize, JsonSchema)] +struct DescribeTablesArgs { + /// Optional `table_schema` filter (e.g. `python`, `gpu`, `nccl`). + schema: Option, + /// Optional `table_name` filter. + table: Option, + #[serde(default = "default_row_limit")] + limit: usize, +} + +#[derive(Debug, Deserialize, JsonSchema)] +struct PlanSkillArgs { + skill_id: String, + #[serde(default)] + params: HashMap, +} + +#[derive(Debug, Deserialize, JsonSchema)] +struct RunSkillArgs { + skill_id: String, + #[serde(default)] + params: HashMap, + #[serde(default)] + use_global: Option, +} + +#[derive(Debug, Deserialize, JsonSchema)] +struct ClusterQueryArgs { + sql: String, + #[serde(default = "default_true")] + cluster: bool, + #[serde(default = "default_row_limit")] + limit: usize, +} + +fn default_true() -> bool { + true +} + +#[derive(Debug, Deserialize, JsonSchema)] +struct SetConfigArgs { + /// Config key (`probing.sample_rate` or `sample_rate`). + key: String, + value: String, +} + +#[derive(Debug, Deserialize, JsonSchema)] +struct EvalPythonArgs { + /// Python source executed in the target training process. + code: String, +} + +#[tool_router] +impl ProbingMcp { + #[tool( + description = "Run a read-only SQL query against the in-process probing engine. Returns JSON rows bounded by `limit`." + )] + async fn query( + &self, + Parameters(QueryArgs { sql, limit }): Parameters, + ) -> Result { + let limit = limit.clamp(1, MAX_ROW_LIMIT); + let json = engine_query_json(sql, limit).await?; + Ok(text_result(json.to_string())) + } + + #[tool( + description = "List semantic table documentation from `probe.probing.table_docs` and `column_docs` for agent grounding." + )] + async fn describe_tables( + &self, + Parameters(DescribeTablesArgs { + schema, + table, + limit, + }): Parameters, + ) -> Result { + let limit = limit.clamp(1, MAX_ROW_LIMIT); + let mut table_sql = String::from( + "SELECT table_schema, table_name, description, synonyms \ + FROM probe.probing.table_docs", + ); + let mut col_sql = String::from( + "SELECT table_schema, table_name, column_name, data_type, description \ + FROM probe.probing.column_docs", + ); + let mut clauses = Vec::new(); + if let Some(schema) = schema.as_deref().map(str::trim).filter(|s| !s.is_empty()) { + clauses.push(format!("table_schema = '{}'", escape_sql_string(schema))); + } + if let Some(table) = table.as_deref().map(str::trim).filter(|s| !s.is_empty()) { + clauses.push(format!("table_name = '{}'", escape_sql_string(table))); + } + if !clauses.is_empty() { + let where_clause = format!(" WHERE {}", clauses.join(" AND ")); + table_sql.push_str(&where_clause); + col_sql.push_str(&where_clause); + } + table_sql.push_str(" ORDER BY table_schema, table_name"); + col_sql.push_str(" ORDER BY table_schema, table_name, column_name"); + + let tables = engine_query_json(table_sql, limit).await?; + let columns = engine_query_json(col_sql, limit.saturating_mul(4)).await?; + let payload = serde_json::json!({ + "tables": tables, + "columns": columns, + }); + Ok(text_result(payload.to_string())) + } + + #[tool(description = "List bundled diagnostic skills (id, title, category).")] + fn list_skills(&self) -> Result { + let mut skills = Vec::new(); + for id in list_skill_ids() { + match load_skill(&id) { + Ok(skill) => skills.push(serde_json::json!({ + "id": skill.id, + "title": skill.title, + "category": skill.category, + "description": skill.docs.lines().next().unwrap_or("").trim(), + })), + Err(err) => { + log::warn!("MCP list_skills: skip {id}: {err}"); + } + } + } + Ok(text_result( + serde_json::to_string_pretty(&skills).unwrap_or_else(|_| "[]".to_string()), + )) + } + + #[tool(description = "Expand a diagnostic skill into SQL/API steps without executing them.")] + fn plan_skill( + &self, + Parameters(PlanSkillArgs { skill_id, params }): Parameters, + ) -> Result { + let skill = load_skill(&skill_id).map_err(|e| tool_error(e.to_string()))?; + let mut merged = default_parameters(&skill); + merged.extend(params); + let ctx = build_context(&skill, &merged); + let steps: Vec = skill + .steps + .iter() + .map(|step| step_to_plan_json(step, &ctx)) + .collect(); + let payload = serde_json::json!({ + "skill_id": skill.id, + "title": skill.title, + "parameters": merged, + "steps": steps, + "next_steps": skill.next_steps, + }); + Ok(text_result(payload.to_string())) + } + + #[tool(description = "Run a diagnostic skill against the local probing process.")] + async fn run_skill( + &self, + Parameters(RunSkillArgs { + skill_id, + mut params, + use_global, + }): Parameters, + ) -> Result { + if let Some(global) = use_global { + params.insert("use_global".to_string(), global.to_string()); + } + match run_skill_json(local_ctrl(), &skill_id, params).await { + Ok(value) => Ok(text_result(value.to_string())), + Err(err) => Err(tool_error(err.to_string())), + } + } + + #[tool(description = "List registered cluster nodes from `GET /apis/nodes`.")] + async fn list_cluster_nodes(&self) -> Result { + let ctrl = local_ctrl(); + let body = ctrl + .get("/apis/nodes") + .await + .map_err(|e| tool_error(e.to_string()))?; + Ok(text_result(body)) + } + + #[tool( + description = "Run read-only SQL with optional cluster fan-out via `POST /apis/cluster/query`." + )] + async fn cluster_query( + &self, + Parameters(ClusterQueryArgs { + sql, + cluster, + limit, + }): Parameters, + ) -> Result { + let limit = limit.clamp(1, MAX_ROW_LIMIT); + ensure_read_only_sql(&sql).map_err(tool_error)?; + let body = serde_json::json!({ + "expr": sql, + "cluster": cluster, + }); + let reply = local_ctrl() + .post_json("/apis/cluster/query", &body.to_string()) + .await + .map_err(|e| tool_error(e.to_string()))?; + let value: serde_json::Value = + serde_json::from_str(&reply).map_err(|e| tool_error(e.to_string()))?; + if let Some(err) = value.get("error").and_then(|v| v.as_str()) { + return Err(tool_error(err.to_string())); + } + let df = value + .get("dataframe") + .ok_or_else(|| tool_error("missing dataframe in cluster response"))?; + let dataframe: probing_proto::prelude::DataFrame = + serde_json::from_value(df.clone()).map_err(|e| tool_error(e.to_string()))?; + let rows = helpers::truncate_dataframe_json(&dataframe, limit); + let payload = serde_json::json!({ + "dataframe": rows, + "meta": value.get("meta"), + }); + Ok(text_result(payload.to_string())) + } + + #[tool( + description = "Update a probing config key via `SET probing.* = …`. Disabled unless PROBING_MCP_ALLOW_WRITE=1." + )] + async fn set_config( + &self, + Parameters(SetConfigArgs { key, value }): Parameters, + ) -> Result { + require_write_permission("set_config")?; + validate_config_key(&key).map_err(tool_error)?; + let probe_key = if key.starts_with("probing.") { + key + } else { + format!("probing.{key}") + }; + let stmt = format!("set {}='{}'", probe_key, escape_sql_string(&value)); + audit_mcp_write("set_config", &stmt); + handle_query(Query { + expr: stmt, + opts: None, + }) + .await + .map_err(|e| tool_error(e.to_string()))?; + Ok(text_result(format!( + "{{\"status\":\"ok\",\"key\":\"{probe_key}\",\"write_enabled\":true}}" + ))) + } + + #[tool( + description = "Execute Python in the target training process (`POST /apis/pythonext/eval`). Disabled unless PROBING_MCP_ALLOW_WRITE=1." + )] + async fn eval_python( + &self, + Parameters(EvalPythonArgs { code }): Parameters, + ) -> Result { + require_write_permission("eval_python")?; + audit_mcp_write("eval_python", &format!("code_len={}", code.len())); + let body = local_ctrl() + .eval_json(code) + .await + .map_err(|e| tool_error(e.to_string()))?; + Ok(text_result(body)) + } +} + +impl ServerHandler for ProbingMcp { + fn get_info(&self) -> ServerInfo { + let write_note = if allow_mcp_write() { + "Write tools (`set_config`, `eval_python`) are enabled." + } else { + "Write tools are disabled; set PROBING_MCP_ALLOW_WRITE=1 to enable intervention." + }; + ServerInfo::new( + ServerCapabilities::builder() + .enable_tools() + .enable_resources() + .build(), + ) + .with_server_info(rmcp::model::Implementation::new( + "probing", + env!("CARGO_PKG_VERSION"), + )) + .with_instructions(format!( + "Agent-native distributed training diagnostics. \ + Read: `list_skills`, `plan_skill`, `run_skill`, `query`, `describe_tables`, \ + `list_cluster_nodes`, `cluster_query`. \ + Schema resources: `{SCHEMA_RESOURCE_PREFIX}{{schema}}/{{table}}`. {write_note}" + )) + } + + async fn list_resources( + &self, + _request: Option, + _context: RequestContext, + ) -> Result { + let sql = "SELECT table_schema, table_name, description \ + FROM probe.probing.table_docs \ + ORDER BY table_schema, table_name \ + LIMIT 500"; + let reply = handle_query(Query { + expr: sql.to_string(), + opts: None, + }) + .await + .map_err(|e| tool_error(e.to_string()))?; + let QueryDataFormat::DataFrame(df) = reply else { + return Ok(ListResourcesResult { + resources: vec![catalog_resource()], + meta: None, + next_cursor: None, + }); + }; + + let mut resources = vec![catalog_resource()]; + for row in df.iter() { + if row.len() < 2 { + continue; + } + let schema = cell_as_str(&row[0]); + let table = cell_as_str(&row[1]); + let description = row.get(2).map(cell_as_str).unwrap_or_default(); + if schema.is_empty() || table.is_empty() { + continue; + } + let uri = format!("{SCHEMA_RESOURCE_PREFIX}{schema}/{table}"); + resources.push(Resource::new( + RawResource { + uri, + name: format!("{schema}.{table}"), + title: Some(format!("{schema}.{table}")), + description: if description.is_empty() { + None + } else { + Some(description) + }, + mime_type: Some("application/json".to_string()), + size: None, + icons: None, + meta: None, + }, + None, + )); + } + Ok(ListResourcesResult { + resources, + meta: None, + next_cursor: None, + }) + } + + async fn read_resource( + &self, + request: ReadResourceRequestParams, + _context: RequestContext, + ) -> Result { + let uri = request.uri.clone(); + let text = if uri == format!("{SCHEMA_RESOURCE_PREFIX}catalog") { + catalog_resource_body().await? + } else if let Some(rest) = uri.strip_prefix(SCHEMA_RESOURCE_PREFIX) { + let (schema, table) = rest + .split_once('/') + .ok_or_else(|| tool_error(format!("invalid schema resource URI: {uri}")))?; + table_resource_body(schema, table).await? + } else { + return Err(tool_error(format!("unknown resource URI: {uri}"))); + }; + Ok(ReadResourceResult::new(vec![ + ResourceContents::TextResourceContents { + uri: request.uri, + mime_type: Some("application/json".to_string()), + text, + meta: None, + }, + ])) + } +} + +fn catalog_resource() -> Resource { + Resource::new( + RawResource { + uri: format!("{SCHEMA_RESOURCE_PREFIX}catalog"), + name: "schema-catalog".to_string(), + title: Some("Probing schema catalog".to_string()), + description: Some("Summary of all documented tables".to_string()), + mime_type: Some("application/json".to_string()), + size: None, + icons: None, + meta: None, + }, + None, + ) +} + +async fn catalog_resource_body() -> Result { + let json = engine_query_json( + "SELECT table_schema, table_name, description, synonyms \ + FROM probe.probing.table_docs ORDER BY table_schema, table_name LIMIT 500" + .to_string(), + 500, + ) + .await?; + Ok(json.to_string()) +} + +async fn table_resource_body(schema: &str, table: &str) -> Result { + let table_sql = format!( + "SELECT table_schema, table_name, description, synonyms \ + FROM probe.probing.table_docs \ + WHERE table_schema = '{}' AND table_name = '{}'", + escape_sql_string(schema), + escape_sql_string(table) + ); + let col_sql = format!( + "SELECT column_name, data_type, description \ + FROM probe.probing.column_docs \ + WHERE table_schema = '{}' AND table_name = '{}' \ + ORDER BY column_name", + escape_sql_string(schema), + escape_sql_string(table) + ); + let tables = engine_query_json(table_sql, 1).await?; + let columns = engine_query_json(col_sql, 500).await?; + Ok(serde_json::json!({ "table": tables, "columns": columns }).to_string()) +} + +fn cell_as_str(ele: &probing_proto::prelude::Ele) -> String { + match ele { + probing_proto::prelude::Ele::Text(s) | probing_proto::prelude::Ele::Url(s) => s.clone(), + other => other.to_string(), + } +} + +fn step_to_plan_json(step: &SkillStep, ctx: &HashMap) -> serde_json::Value { + let mut value = serde_json::json!({ + "id": step.id, + "title": step.title, + "type": step.step_type, + "on_empty": step.on_empty, + }); + if let Some(sql) = &step.sql { + value["sql"] = serde_json::Value::String(expand_template(sql, ctx)); + } + if let Some(path) = &step.path { + value["path"] = serde_json::Value::String(path.clone()); + } + if let Some(when) = &step.when { + value["when"] = serde_json::Value::String(when.clone()); + } + value +} + +fn text_result(text: String) -> CallToolResult { + CallToolResult::success(vec![Content::text(text)]) +} + +#[cfg(test)] +mod tests { + use super::helpers::ensure_read_only_sql; + + #[test] + fn ensure_read_only_sql_accepts_select() { + assert!(ensure_read_only_sql("SELECT 1").is_ok()); + } + + #[test] + fn ensure_read_only_sql_rejects_set() { + assert!(ensure_read_only_sql("SET probing.sample_rate=0.1").is_err()); + } +} diff --git a/probing/server/src/server/cluster_fanout.rs b/probing/server/src/server/cluster_fanout.rs index c3f1f83c..4bbad9f6 100644 --- a/probing/server/src/server/cluster_fanout.rs +++ b/probing/server/src/server/cluster_fanout.rs @@ -3,13 +3,23 @@ //! Training agents write locally; cross-node aggregation runs only when a control-plane //! caller explicitly requests `cluster=true`. //! +//! **Hierarchical mode** (default when ``PROBING_CLUSTER_FANOUT_HIERARCHICAL`` is on): +//! +//! ```text +//! coordinator (rank0) ──► node aggregators (local0 per machine) +//! each local0 ──► on-node leaf ranks ──► merge ──► coordinator +//! ``` +//! //! Single-table queries route through the `global` catalog (DataFusion federation). -//! JOIN / multi-statement SQL still uses the legacy per-node broadcast path. +//! JOIN / multi-statement SQL uses the legacy per-node broadcast path. -use probing_core::core::cluster::{get_nodes, is_node_alive, local_addr_label, local_listen_addrs}; +use probing_core::core::cluster::{ + hierarchical_metadata_available, local_leaf_peers, local_listen_addrs, node_aggregator_peers, +}; use probing_core::core::federation::{ - can_fanout_via_global_catalog, remote_query_timeout, reset_fanout_stats, - rewrite_sql_for_global_fanout, take_fanout_stats, + can_fanout_via_global_catalog, cluster_rank_for_endpoint, is_local0_from_env, + remote_query_timeout, reset_fanout_stats, rewrite_sql_for_global_fanout, take_fanout_stats, + with_fanout_scope, FanoutScope, }; use probing_proto::prelude::*; @@ -74,11 +84,86 @@ pub async fn remote_query_df(addr: &str, sql: &str) -> anyhow::Result } } +async fn remote_node_aggregate_df(addr: &str, sql: &str) -> anyhow::Result { + let url = format!("http://{addr}/apis/cluster/query"); + let body = serde_json::json!({ + "expr": sql, + "cluster": true, + "hierarchical": true, + "scope": "node", + }); + let body = serde_json::to_string(&body)?; + let timeout = remote_query_timeout(); + let response = tokio::task::spawn_blocking(move || { + ureq::post(&url) + .header("Content-Type", "application/json") + .config() + .timeout_global(Some(timeout)) + .build() + .send(body) + .map_err(anyhow::Error::new) + }) + .await??; + + let status = response.status().as_u16(); + let text = response.into_body().read_to_string()?; + if status >= 400 { + anyhow::bail!("HTTP {status}: {text}"); + } + + let value: serde_json::Value = serde_json::from_str(&text)?; + if let Some(err) = value.get("error").and_then(|v| v.as_str()) { + anyhow::bail!("remote node aggregate: {err}"); + } + let df = value + .get("dataframe") + .ok_or_else(|| anyhow::anyhow!("missing dataframe in node aggregate response"))?; + Ok(serde_json::from_value(df.clone())?) +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum ClusterFanoutScope { + #[default] + Auto, + Coordinator, + Node, + Local, +} + +impl ClusterFanoutScope { + fn resolve(self, hierarchical: bool) -> ClusterFanoutScope { + match self { + ClusterFanoutScope::Auto if hierarchical && is_local0_from_env() => { + ClusterFanoutScope::Coordinator + } + ClusterFanoutScope::Auto if hierarchical => ClusterFanoutScope::Local, + // Flat mode: coordinator fans out to all peers; leaf ranks stay local-only. + ClusterFanoutScope::Auto if is_local0_from_env() => ClusterFanoutScope::Coordinator, + ClusterFanoutScope::Auto => ClusterFanoutScope::Local, + other => other, + } + } + + pub fn as_str(self) -> &'static str { + match self { + Self::Auto => "auto", + Self::Coordinator => "coordinator", + Self::Node => "node", + Self::Local => "local", + } + } +} + #[derive(Debug, Clone, serde::Serialize)] pub struct FanoutMeta { pub cluster: bool, + pub hierarchical: bool, + pub scope: String, pub nodes_queried: usize, pub nodes_failed: Vec, + pub node_aggregators_queried: usize, + pub local_ranks_queried: usize, } #[derive(Debug, Clone, serde::Serialize)] @@ -88,50 +173,257 @@ pub struct FanoutQueryResponse { } /// Run `sql` locally, optionally fanning out to peer nodes in the cluster view. -pub async fn fanout_query(sql: &str, cluster: bool) -> anyhow::Result { +pub async fn fanout_query( + sql: &str, + cluster: bool, + hierarchical: bool, + scope: ClusterFanoutScope, +) -> anyhow::Result { if !cluster { return Ok(FanoutQueryResponse { dataframe: query_local_df(sql).await?, meta: FanoutMeta { cluster: false, + hierarchical, + scope: ClusterFanoutScope::Local.as_str().into(), nodes_queried: 1, nodes_failed: Vec::new(), + node_aggregators_queried: 0, + local_ranks_queried: 0, }, }); } - if can_fanout_via_global_catalog(sql) { - return fanout_via_global_catalog(sql).await; + let resolved_scope = scope.resolve(hierarchical && hierarchical_fanout_requested(hierarchical)); + + match resolved_scope { + ClusterFanoutScope::Local => { + let dataframe = query_local_df(sql).await?; + Ok(FanoutQueryResponse { + dataframe, + meta: FanoutMeta { + cluster: true, + hierarchical, + scope: resolved_scope.as_str().into(), + nodes_queried: 1, + nodes_failed: Vec::new(), + node_aggregators_queried: 0, + local_ranks_queried: 0, + }, + }) + } + ClusterFanoutScope::Node => fanout_node_tier(sql, hierarchical).await, + ClusterFanoutScope::Coordinator => fanout_coordinator_tier(sql, hierarchical).await, + ClusterFanoutScope::Auto => unreachable!("scope::Auto must be resolved"), } +} - broadcast_fanout_query(sql).await +fn hierarchical_fanout_requested(hierarchical: bool) -> bool { + hierarchical && probing_core::core::federation::hierarchical_fanout_enabled() } -/// Single-table cluster query via `global.*` catalog (coordinator-side federation). -async fn fanout_via_global_catalog(sql: &str) -> anyhow::Result { +/// Node aggregator: local0 + on-node leaf ranks. +async fn fanout_node_tier(sql: &str, hierarchical: bool) -> anyhow::Result { + if !is_local0_from_env() { + let dataframe = query_local_df(sql).await?; + return Ok(FanoutQueryResponse { + dataframe, + meta: FanoutMeta { + cluster: true, + hierarchical, + scope: ClusterFanoutScope::Local.as_str().into(), + nodes_queried: 1, + nodes_failed: Vec::new(), + node_aggregators_queried: 0, + local_ranks_queried: 0, + }, + }); + } + + let host = local_host_label(); + let addr = probing_core::core::cluster::local_addr_label(); + let local_rank = cluster_rank_for_endpoint(&host, &addr); + + let mut nodes_failed = Vec::new(); + let mut parts = Vec::new(); + + let local_df = with_fanout_scope(FanoutScope::Node, || { + tokio::task::block_in_place(|| { + tokio::runtime::Handle::current().block_on(query_local_df(sql)) + }) + })?; + parts.push(tag_dataframe(local_df, &host, &addr, local_rank)); + + let leaves = local_leaf_peers(); + let local_ranks_queried = leaves.len(); + let mut nodes_queried = 1usize; + let responses = futures_util::future::join_all(leaves.into_iter().map(|node| async move { + let result = remote_query_df(&node.addr, sql).await; + (node, result) + })) + .await; + + for (node, result) in responses { + match result { + Ok(df) => { + parts.push(tag_dataframe( + df, + if node.host.is_empty() { + &node.addr + } else { + &node.host + }, + &node.addr, + node.rank, + )); + nodes_queried += 1; + } + Err(err) => { + log::debug!("local leaf fan-out {} failed: {err}", node.addr); + nodes_failed.push(node.addr); + } + } + } + + Ok(FanoutQueryResponse { + dataframe: merge_tagged_dataframes(&parts), + meta: FanoutMeta { + cluster: true, + hierarchical, + scope: ClusterFanoutScope::Node.as_str().into(), + nodes_queried, + nodes_failed, + node_aggregators_queried: 0, + local_ranks_queried, + }, + }) +} + +/// Global coordinator: node aggregators (+ on-node leaves via broadcast path). +async fn fanout_coordinator_tier( + sql: &str, + hierarchical: bool, +) -> anyhow::Result { + if !hierarchical_fanout_requested(hierarchical) || !hierarchical_metadata_available() { + return fanout_flat(sql).await; + } + + broadcast_fanout_query(sql, FanoutScope::Coordinator).await +} + +/// Legacy flat fan-out to every registered peer. +async fn fanout_flat(sql: &str) -> anyhow::Result { + if can_fanout_via_global_catalog(sql) { + return fanout_via_global_catalog(sql, FanoutScope::Flat).await; + } + broadcast_fanout_query(sql, FanoutScope::Flat).await +} + +async fn fanout_via_global_catalog( + sql: &str, + scope: FanoutScope, +) -> anyhow::Result { reset_fanout_stats(); let global_sql = rewrite_sql_for_global_fanout(sql); - log::debug!("cluster fan-out via global catalog: {global_sql}"); - let dataframe = query_local_df(&global_sql).await?; + log::debug!("cluster fan-out via global catalog ({scope:?}): {global_sql}"); + let dataframe = with_fanout_scope(scope, || { + tokio::task::block_in_place(|| { + tokio::runtime::Handle::current().block_on(query_local_df(&global_sql)) + }) + })?; let stats = take_fanout_stats(); Ok(FanoutQueryResponse { dataframe, meta: FanoutMeta { cluster: true, + hierarchical: scope != FanoutScope::Flat, + scope: scope.as_str().into(), nodes_queried: 1 + stats.nodes_succeeded, nodes_failed: stats.nodes_failed, + node_aggregators_queried: if scope == FanoutScope::Coordinator { + stats.nodes_succeeded + } else { + 0 + }, + local_ranks_queried: if scope == FanoutScope::Node { + stats.nodes_succeeded + } else { + 0 + }, }, }) } -/// Legacy path: broadcast the full SQL to each peer (required for JOINs and other -/// multi-table queries that must execute entirely on each node). -async fn broadcast_fanout_query(sql: &str) -> anyhow::Result { +async fn broadcast_fanout_query( + sql: &str, + scope: FanoutScope, +) -> anyhow::Result { + if scope == FanoutScope::Coordinator && is_local0_from_env() { + let mut parts = Vec::new(); + let mut meta = FanoutMeta { + cluster: true, + hierarchical: true, + scope: scope.as_str().into(), + nodes_queried: 0, + nodes_failed: Vec::new(), + node_aggregators_queried: 0, + local_ranks_queried: 0, + }; + + let node_part = fanout_node_tier(sql, true).await?; + meta.local_ranks_queried = node_part.meta.local_ranks_queried; + meta.nodes_queried += node_part.meta.nodes_queried; + meta.nodes_failed.extend(node_part.meta.nodes_failed); + if !node_part.dataframe.is_empty() { + parts.push(node_part.dataframe); + } + + let node_aggs = node_aggregator_peers(); + meta.node_aggregators_queried = node_aggs.len(); + let responses = + futures_util::future::join_all(node_aggs.into_iter().map(|node| async move { + let result = remote_node_aggregate_df(&node.addr, sql).await; + (node, result) + })) + .await; + + for (node, result) in responses { + match result { + Ok(df) => { + parts.push(tag_dataframe( + df, + if node.host.is_empty() { + &node.addr + } else { + &node.host + }, + &node.addr, + node.rank, + )); + meta.nodes_queried += 1; + } + Err(err) => { + log::debug!("node aggregator fan-out {} failed: {err}", node.addr); + meta.nodes_failed.push(node.addr); + } + } + } + + return Ok(FanoutQueryResponse { + dataframe: merge_tagged_dataframes(&parts), + meta, + }); + } + let host = local_host_label(); - let addr = local_addr_label(); - let local_rank = probing_core::core::federation::cluster_rank_for_endpoint(&host, &addr); + let addr = probing_core::core::cluster::local_addr_label(); + let local_rank = cluster_rank_for_endpoint(&host, &addr); let mut parts = vec![tag_dataframe( - query_local_df(sql).await?, + with_fanout_scope(FanoutScope::Local, || { + tokio::task::block_in_place(|| { + tokio::runtime::Handle::current().block_on(query_local_df(sql)) + }) + })?, &host, &addr, local_rank, @@ -139,17 +431,27 @@ async fn broadcast_fanout_query(sql: &str) -> anyhow::Result = get_nodes() - .into_iter() - .filter(is_node_alive) - .filter(|node| !local_addrs.contains(&node.addr)) - .collect(); + let peers = match scope { + FanoutScope::Coordinator => node_aggregator_peers(), + FanoutScope::Node => local_leaf_peers(), + FanoutScope::Flat | FanoutScope::Auto => { + let local_addrs = local_listen_addrs(); + probing_core::core::cluster::get_nodes() + .into_iter() + .filter(probing_core::core::cluster::is_node_alive) + .filter(|node| !local_addrs.contains(&node.addr)) + .collect() + } + FanoutScope::Local => Vec::new(), + }; - // Broadcast to all peers concurrently; total latency is bounded by the - // slowest peer rather than the sum of all peers. + let peer_count = peers.len(); let responses = futures_util::future::join_all(peers.into_iter().map(|node| async move { - let result = remote_query_df(&node.addr, sql).await; + let result = if scope == FanoutScope::Coordinator { + remote_node_aggregate_df(&node.addr, sql).await + } else { + remote_query_df(&node.addr, sql).await + }; (node, result) })) .await; @@ -171,7 +473,7 @@ async fn broadcast_fanout_query(sql: &str) -> anyhow::Result { log::debug!("cluster fan-out {} failed: {err}", node.addr); - nodes_failed.push(node.addr.clone()); + nodes_failed.push(node.addr); } } } @@ -180,8 +482,20 @@ async fn broadcast_fanout_query(sql: &str) -> anyhow::Result bool { + true } #[derive(Debug, Serialize)] @@ -37,6 +47,7 @@ pub async fn post_cluster_query( "missing SQL expression", )); } - let result = cluster_fanout::fanout_query(expr, body.cluster).await?; + let result = + cluster_fanout::fanout_query(expr, body.cluster, body.hierarchical, body.scope).await?; Ok(Json(result.into())) } diff --git a/probing/server/src/server/mod.rs b/probing/server/src/server/mod.rs index 8855c386..dcd612ef 100644 --- a/probing/server/src/server/mod.rs +++ b/probing/server/src/server/mod.rs @@ -56,6 +56,11 @@ fn build_app(auth: bool) -> axum::Router { .route("/ws", axum::routing::get(ws_handler)) .fallback(spa::fallback); + #[cfg(feature = "rmcp")] + { + app = app.merge(crate::mcp::router()); + } + if auth { app = app.layer(axum::middleware::from_fn( crate::auth::selective_auth_middleware, diff --git a/probing/server/src/server/spa.rs b/probing/server/src/server/spa.rs index ee765e7a..faa80651 100644 --- a/probing/server/src/server/spa.rs +++ b/probing/server/src/server/spa.rs @@ -23,6 +23,7 @@ pub fn is_api_path(path: &str) -> bool { || path == "/query/dto" || path.starts_with("/apis/") || path.starts_with("/config/") + || path.starts_with("/mcp") || path == "/ws" } @@ -65,6 +66,7 @@ mod tests { assert!(is_api_path("/apis/nodes")); assert!(is_api_path("/config/server.address")); assert!(is_api_path("/ws")); + assert!(is_api_path("/mcp")); } #[test] diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index 0d2eaa5f..2ce79a20 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -63,7 +63,13 @@ pub async fn get_step_matrix( // Fetch all completed train.step pairs; aggregate to unique local_step in Rust. let sql = STEP_MATRIX_SQL.to_string(); - let fanout = cluster_fanout::fanout_query(&sql, cluster).await?; + let fanout = cluster_fanout::fanout_query( + &sql, + cluster, + true, + cluster_fanout::ClusterFanoutScope::Auto, + ) + .await?; let host = crate::report::get_hostname().unwrap_or_else(|_| "localhost".into()); let addr = probing_core::core::cluster::local_addr_label(); let samples = diff --git a/python/probing/__init__.py b/python/probing/__init__.py index e2b4e4ad..fee82af2 100644 --- a/python/probing/__init__.py +++ b/python/probing/__init__.py @@ -3,37 +3,31 @@ Spec ---- -This is the top-level package for the Probing library. It serves as the main entry point -for users and integrations. +This is the top-level package for the main entry point for users and integrations. -Responsibilities: -1. Export core primitives for operating probing, including `query` and `load_extension`. -2. Export control functions (enable/disable tracer, CLI main) for runtime management. -3. Export high-level APIs for tracing (span, event) and engine queries. -4. Initialize configuration and environment settings. - -Public Interfaces: +Public Interfaces (full import): - Engine: `query`, `load_extension` - Control: `cli_main`, `enable_tracer`, `disable_tracer`, `is_enabled` - Tracing: `span`, `event`, `record_span`, `step` -- Engine: `query`, `load_extension` - -Pulsing integration is passive: when another runtime writes ``pulsing.*`` memtables -under the shared data directory, probing exposes them as SQL tables. Probing does not -discover, bootstrap, or sync Pulsing cluster membership. """ from __future__ import annotations -from probing._entrypoint import is_lightweight_module -from probing.web_assets import configure_assets_root +from probing._entrypoint import is_lightweight_module, is_probing_cli VERSION = "0.2.5" - if is_lightweight_module(): __all__ = ["VERSION"] +elif is_probing_cli(): + # Must set PROBING_CLI_MODE before loading _core so #[ctor] skips engine startup. + from probing import _core + + cli_main = _core.cli_main + __all__ = ["VERSION", "cli_main"] else: + from probing.web_assets import configure_assets_root + configure_assets_root() import probing.config as config from probing import _core @@ -41,7 +35,6 @@ TCPStore = _core.TCPStore - # Control Functions cli_main = _core.cli_main enable_tracer = _core.enable_tracer disable_tracer = _core.disable_tracer @@ -49,12 +42,10 @@ def is_enabled(): return _core.is_enabled() - # Internal Accessors _get_python_stacks = _core._get_python_stacks _get_python_frames = _core._get_python_frames register_table_docs = _core.register_table_docs - # Submodules with side effects (must be imported after Core Primitives) from probing.core.engine import load_extension, query from probing.parallel import clear_role, current_role, set_role from probing.tracing import ( diff --git a/python/probing/bundled_skills/catalog.yaml b/python/probing/bundled_skills/catalog.yaml index 0bdf9035..b8621b7b 100644 --- a/python/probing/bundled_skills/catalog.yaml +++ b/python/probing/bundled_skills/catalog.yaml @@ -36,7 +36,42 @@ skills: - module_bottleneck - training_hang - memory_leak + - crash_triage + - job_health path: health_overview/steps.yaml +- id: job_health + category: triage + priority: 1 + entry: true + description: 'Job-level health — cluster alive, step lag, slowdown proxy, comm trend' + tables: + - cluster.nodes + - python.comm_collective + - global.python.comm_collective + - python.trace_event + pages: + - training + - cluster + - agent + - analytics + related: + - health_overview + - persistent_straggler + - slow_rank + - training_hang + path: job_health/steps.yaml +- id: crash_triage + category: triage + priority: 1 + entry: true + description: Crash triage — grep PROBING CRASH in logs; read spill JSON files + tables: [] + pages: + - agent + related: + - health_overview + - training_hang + path: crash_triage/steps.yaml - id: training_hang category: reliability priority: 1 @@ -69,7 +104,26 @@ skills: - nccl_culprit_victim - gpu_pressure - training_hang + - persistent_straggler + - job_health path: slow_rank/steps.yaml +- id: persistent_straggler + category: distributed + priority: 2 + description: 'Persistent straggler — worst_fraction across steps (chronic slow rank)' + tables: + - python.comm_collective + - global.python.comm_collective + pages: + - training + - cluster + - analytics + related: + - slow_rank + - job_health + - nccl_culprit_victim + - gpu_pressure + path: persistent_straggler/steps.yaml - id: memory_leak category: memory priority: 3 diff --git a/python/probing/bundled_skills/crash_triage/SKILL.md b/python/probing/bundled_skills/crash_triage/SKILL.md new file mode 100644 index 00000000..afa252ec --- /dev/null +++ b/python/probing/bundled_skills/crash_triage/SKILL.md @@ -0,0 +1,25 @@ +--- +name: crash_triage +description: > + Crash triage: grep PROBING CRASH in rank logs; read spill JSON under + {PROBING_DATA_DIR}/crash//latest.json +category: triage +tags: [crash, error, exception, startup, 报错, 崩溃] +keywords: + en: ['crash', 'error', 'exception', 'failed', 'startup failure'] + zh: ['崩溃', '报错', '异常', '启动失败', '挂了'] +--- + +# Crash triage + +训练崩溃或启动失败时: + +1. **日志**:在各 rank stderr / launcher 日志中搜索 ``PROBING CRASH`` +2. **Spill**:``{PROBING_DATA_DIR}/crash//latest.json``(与 memtable 同根目录,默认 Linux ``/dev/shm/probing``,macOS ``$TMPDIR/probing``) +3. **Signal crash**:同目录下 ``signal-latest.json`` + +torchrun 级联退出后 memtable 不可用——以日志 + spill 为准。 + +## Related skills + +- 进程仍存活但无进展 → skill: training_hang diff --git a/python/probing/bundled_skills/crash_triage/steps.yaml b/python/probing/bundled_skills/crash_triage/steps.yaml new file mode 100644 index 00000000..c7eb35fa --- /dev/null +++ b/python/probing/bundled_skills/crash_triage/steps.yaml @@ -0,0 +1,28 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: crash_triage + title: "崩溃 / 启动失败诊断" + title_en: "Crash and startup failure triage" + category: triage + tags: [crash, error, exception, startup, 报错, 崩溃] + triggers: + keywords: + zh: ["崩溃", "报错", "异常", "启动失败", "挂了", "exit code"] + en: ["crash", "error", "exception", "failed", "startup failure"] + docs: | + 查 rank 日志中的 ``PROBING CRASH``,或 spill: + ``{PROBING_DATA_DIR}/crash//latest.json`` + +spec: + steps: [] + + summary_template: | + ## Crash 诊断 + 1. grep 各 rank 日志 ``PROBING CRASH`` + 2. 读 spill ``$PROBING_DATA_DIR/crash//latest.json`` + + next_steps: + - "全 rank 同一 fingerprint → 检查代码/环境" + - "无 exception 但卡住 → skill: training_hang" diff --git a/python/probing/bundled_skills/health_overview/steps.yaml b/python/probing/bundled_skills/health_overview/steps.yaml index 8b2c11c5..ad01b085 100644 --- a/python/probing/bundled_skills/health_overview/steps.yaml +++ b/python/probing/bundled_skills/health_overview/steps.yaml @@ -102,6 +102,7 @@ spec: 若某项为空,按 empty_message 提示开启对应采集。 next_steps: + - "多机训练 job 级诊断 → skill: job_health --global" - "训练变慢 → skill: module_bottleneck 或 slow_rank" - "显存上涨 → skill: memory_leak" - "进程卡住 → skill: training_hang" diff --git a/python/probing/bundled_skills/job_health/SKILL.md b/python/probing/bundled_skills/job_health/SKILL.md new file mode 100644 index 00000000..526dd478 --- /dev/null +++ b/python/probing/bundled_skills/job_health/SKILL.md @@ -0,0 +1,48 @@ +--- +name: job_health +description: > + Job-level health: cluster alive, step lag, slowdown proxy, comm trend +category: triage +tables: [cluster.nodes, python.comm_collective, global.python.comm_collective, python.trace_event] +tags: [job, slowdown, health, 作业] +keywords: + en: ['job health', 'job slow', 'slowdown', 'training degraded', 'step lag'] + zh: ['作业健康', 'job 慢', '整体变慢', 'slowdown', 'step 落后'] +parameters: + step_window: { type: integer, default: 200 } + step_lag_threshold: { type: integer, default: 5 } + use_global: { type: boolean, default: true } +--- + +# Job health & slowdown + +从 **整 job** 视角看训练是否健康,而不是单个 rank 的单次 collective。 + +## 看什么 + +| 步骤 | 含义 | +|------|------| +| cluster_snapshot | 多少节点 alive / dead | +| rank_step_lag | 哪些 rank 的 `global_step` 明显落后(hang 信号) | +| job_slowdown_proxy | 各 step 上最慢 rank vs 最快 rank 的比值均值(§ federation 3.2) | +| comm_trend_by_step | 最近 step 通信总耗时是否爬升 | +| train_step_pacing | `train.step` span 的 wall time(若已开启 phase hook) | + +## Parameters + +- `step_window` (default `200`): 分析最近多少 global_step +- `step_lag_threshold` (default `5`): 落后 cluster max step 多少步算异常 +- `use_global` (default `true`): rank0 上 fan-out 到全集群 + +## 用法 + +```bash +probing -t rank0:8080 skill run job_health --global +probing -t rank0:8080 skill run job_health --set step_window=500 +``` + +## Related skills + +- 长期最慢 rank → `persistent_straggler` +- 当前 step 谁慢 → `slow_rank` +- 进程卡住 → `training_hang` diff --git a/python/probing/bundled_skills/job_health/steps.yaml b/python/probing/bundled_skills/job_health/steps.yaml new file mode 100644 index 00000000..7c027288 --- /dev/null +++ b/python/probing/bundled_skills/job_health/steps.yaml @@ -0,0 +1,176 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: job_health + title: "Job 健康度 / 训练作业诊断" + title_en: "Job health & slowdown" + category: triage + tags: [job, slowdown, health, straggler, 作业, 变慢] + triggers: + keywords: + zh: ["作业健康", "job 慢", "整体变慢", "训练变慢", "slowdown", "worst_fraction", "掉队 rank", "step 落后"] + en: ["job health", "job slow", "slowdown", "training degraded", "persistent slow", "step lag"] + docs: | + 从 **job 级** 视角评估训练是否健康:集群节点存活、rank step 是否同步、 + collective 驱动的 slowdown proxy、最近 step 通信趋势。 + 适合多机训练 first look,或在 slow_rank 之前判断「是偶发还是整体变慢」。 + +spec: + parameters: + - name: step_window + type: integer + default: 200 + description: "Recent global_steps to include in slowdown / lag checks" + - name: step_lag_threshold + type: integer + default: 5 + description: "Flag ranks whose max(global_step) trails cluster max by this many steps" + - name: use_global + type: boolean + default: true + description: "Use global.* federation on rank0 for cross-node checks" + + requires: + any_tables: + - python.comm_collective + - global.python.comm_collective + - cluster.nodes + + steps: + - id: cluster_snapshot + title: "集群节点存活" + type: sql + sql: | + SELECT + count(*) AS nodes_total, + count(*) FILTER (WHERE status = 'running') AS nodes_running, + count(*) FILTER (WHERE status = 'dead') AS nodes_dead + FROM cluster.nodes + on_empty: warn + empty_message: "cluster.nodes 为空 — 单机或未注册集群" + + - id: rank_step_lag + title: "rank global_step 是否落后" + type: sql + cluster: true + when: "{use_global}" + sql: | + WITH bounds AS ( + SELECT max(global_step) AS max_step + FROM global.python.comm_collective + ) + SELECT + _host, + _rank, + _local_rank, + max(global_step) AS last_step, + (SELECT max_step FROM bounds) - max(global_step) AS steps_behind + FROM global.python.comm_collective, bounds + WHERE global_step >= (SELECT max_step - {step_window} FROM bounds) + GROUP BY _host, _rank, _local_rank, bounds.max_step + HAVING max(global_step) < (SELECT max_step - {step_lag_threshold} FROM bounds) + ORDER BY steps_behind DESC + on_empty: skip + empty_message: "未发现明显 step 落后的 rank(或仅有单 rank 数据)" + + - id: job_slowdown_proxy + title: "Job slowdown proxy(per-step straggler 比值)" + type: sql + cluster: true + when: "{use_global}" + sql: | + WITH per_rank_step AS ( + SELECT global_step, _rank, max(duration_ms) AS max_op_ms + FROM global.python.comm_collective + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM global.python.comm_collective + ) + GROUP BY global_step, _rank + ), + step_cp AS ( + SELECT global_step, + avg(max_op_ms) / NULLIF(min(max_op_ms), 0) AS step_slowdown_ratio + FROM per_rank_step + GROUP BY global_step + ) + SELECT + avg(step_slowdown_ratio) AS job_slowdown_proxy, + count(*) FILTER (WHERE step_slowdown_ratio > 1.1) AS slow_steps, + count(*) AS steps_in_window + FROM step_cp + on_empty: skip + empty_message: "global comm_collective 无足够 step 数据" + + - id: comm_trend_by_step + title: "最近 step 通信总耗时趋势" + type: sql + sql: | + SELECT + global_step, + sum(duration_ms) AS comm_ms, + count(*) AS calls, + count(DISTINCT rank) AS ranks_seen + FROM {table_comm} + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM {table_comm} + ) + GROUP BY global_step + ORDER BY global_step DESC + LIMIT 30 + on_empty: skip + + - id: train_step_pacing + title: "train.step wall time(若已 attach phase hook)" + type: sql + sql: | + SELECT + count(*) AS step_spans, + avg(duration_ns) / 1e6 AS avg_step_ms, + max(duration_ns) / 1e6 AS max_step_ms + FROM python.trace_event + WHERE name = 'train.step' + AND duration_ns IS NOT NULL + on_empty: skip + empty_message: "无 train.step span — attach_training_phases 或 TorchProbe 未写入 trace_event" + + variables: + table_comm: "{comm_table}" + + interpretation: + rules: + - id: dead_nodes + when: "step:cluster_snapshot | column:nodes_dead | value > 0" + severity: error + message: "集群有 {nodes_dead} 个 dead 节点 — 检查 torchrun 心跳或进程是否退出" + + - id: step_lag + when: "step:rank_step_lag | rows >= 1" + severity: warning + message: "存在 global_step 明显落后的 rank — 可能 hang 或极慢 straggler" + + - id: job_slow + when: "step:job_slowdown_proxy | column:job_slowdown_proxy | value > 1.15" + severity: warning + message: "Job slowdown proxy > 1.15 — 多数 step 上最慢 rank 拖慢整体" + + - id: many_slow_steps + when: "step:job_slowdown_proxy | column:slow_steps | ratio(slow_steps/steps_in_window) > 0.3" + severity: warning + message: "超过 30% 的 step 出现 straggler 比值 > 1.1 — 考虑 skill: persistent_straggler" + + summary_template: | + ## Job 健康度 + - **cluster_snapshot**: 存活节点 vs dead + - **rank_step_lag**: 是否有 rank 的 global_step 落后 + - **job_slowdown_proxy**: 理想 step 时间 vs 实际的 proxy(>1.1 表示 straggler 影响) + - **comm_trend_by_step**: 通信耗时是否随 step 上升 + + next_steps: + - "某 rank 长期最慢 → skill: persistent_straggler" + - "单次 step 谁最慢 → skill: slow_rank" + - "loss 不更新 / 栈卡住 → skill: training_hang" + - "通信热点 op → skill: comm_bottleneck" + - "NCCL wait 分解 → skill: nccl_culprit_victim" diff --git a/python/probing/bundled_skills/persistent_straggler/SKILL.md b/python/probing/bundled_skills/persistent_straggler/SKILL.md new file mode 100644 index 00000000..659d8188 --- /dev/null +++ b/python/probing/bundled_skills/persistent_straggler/SKILL.md @@ -0,0 +1,45 @@ +--- +name: persistent_straggler +description: > + Find ranks that are slow on many steps (worst_fraction), not just once +category: distributed +tables: [python.comm_collective, global.python.comm_collective] +tags: [straggler, persistent, worst_fraction] +keywords: + en: ['persistent straggler', 'worst fraction', 'always slow', 'chronic straggler'] + zh: ['长期慢', '一直慢', 'worst_fraction', '总是最慢'] +parameters: + step_window: { type: integer, default: 300 } + worst_fraction_threshold: { type: number, default: 0.25 } + use_global: { type: boolean, default: true } +--- + +# Persistent straggler (worst_fraction) + +`slow_rank` 看 **当前窗口里谁平均最慢**;本 skill 看 **谁在多少 step 上拿「最慢 rank」**。 + +## worst_fraction + +对每个 rank 统计:在窗口内有多少 step 上,该 rank 的 collective 总耗时等于该 step 的最大值。 + +- `worst_fraction ≈ 1.0` — 几乎每步都是最慢( chronic straggler) +- `worst_fraction ≈ 0.05` — 偶发 + +## Parameters + +- `step_window` (default `300`) +- `worst_fraction_threshold` (default `0.25`) — `persistent_offenders` 步骤的过滤阈值 +- `use_global` (default `true`) + +## 用法 + +```bash +probing -t rank0:8080 skill run persistent_straggler --global +probing -t rank0:8080 skill run persistent_straggler --set worst_fraction_threshold=0.4 --set step_window=500 +``` + +## Related skills + +- Job 整体变慢 → `job_health` +- 当前 step lag → `slow_rank` +- NCCL culprit/victim → `nccl_culprit_victim` diff --git a/python/probing/bundled_skills/persistent_straggler/steps.yaml b/python/probing/bundled_skills/persistent_straggler/steps.yaml new file mode 100644 index 00000000..d0a36e85 --- /dev/null +++ b/python/probing/bundled_skills/persistent_straggler/steps.yaml @@ -0,0 +1,194 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: persistent_straggler + title: "长期 straggler / worst_fraction" + title_en: "Persistent straggler (worst_fraction)" + category: distributed + tags: [straggler, persistent, worst_fraction, rank, 拖后腿] + triggers: + keywords: + zh: ["长期慢", "一直慢", "worst_fraction", "persistent straggler", "总是最慢", "慢性 straggler"] + en: ["persistent straggler", "worst fraction", "always slow", "chronic straggler", "worst_fraction"] + docs: | + 找出 **在多少 step 上是最慢 rank**(worst_fraction),区分「偶发慢一次」与「长期拖后腿」。 + 对标 federation 文档 §3.2;万卡场景请在 rank0 上 `--global` fan-out。 + +spec: + parameters: + - name: step_window + type: integer + default: 300 + description: "Steps included in worst_fraction calculation" + - name: worst_fraction_threshold + type: number + default: 0.25 + description: "Flag ranks whose worst_fraction exceeds this (0–1)" + - name: use_global + type: boolean + default: true + description: "Query global.python.comm_collective with cluster fan-out" + + requires: + any_tables: + - python.comm_collective + - global.python.comm_collective + + steps: + - id: worst_fraction + title: "各 rank 的 worst_fraction" + type: sql + cluster: true + when: "{use_global}" + sql: | + WITH per_step AS ( + SELECT global_step, _rank, _host, sum(duration_ms) AS step_ms + FROM global.python.comm_collective + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM global.python.comm_collective + ) + GROUP BY global_step, _rank, _host + ) + SELECT + _rank, + _host, + count(*) AS steps_seen, + sum( + CASE + WHEN step_ms = max(step_ms) OVER (PARTITION BY global_step) THEN 1 + ELSE 0 + END + ) * 1.0 / count(*) AS worst_fraction, + avg(step_ms) AS avg_step_comm_ms + FROM per_step + GROUP BY _rank, _host + ORDER BY worst_fraction DESC, avg_step_comm_ms DESC + on_empty: abort + empty_message: | + 无 global comm_collective 数据。确认: + - rank0 上运行且 cluster.nodes 已注册 + - probing -t rank0:8080 skill run persistent_straggler --global + + - id: persistent_offenders + title: "worst_fraction 超过阈值的 rank" + type: sql + cluster: true + when: "{use_global}" + sql: | + WITH per_step AS ( + SELECT global_step, _rank, _host, sum(duration_ms) AS step_ms + FROM global.python.comm_collective + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM global.python.comm_collective + ) + GROUP BY global_step, _rank, _host + ), + scored AS ( + SELECT + _rank, + _host, + count(*) AS steps_seen, + sum( + CASE + WHEN step_ms = max(step_ms) OVER (PARTITION BY global_step) THEN 1 + ELSE 0 + END + ) * 1.0 / count(*) AS worst_fraction, + avg(step_ms) AS avg_step_comm_ms + FROM per_step + GROUP BY _rank, _host + ) + SELECT * + FROM scored + WHERE worst_fraction >= {worst_fraction_threshold} + ORDER BY worst_fraction DESC, avg_step_comm_ms DESC + on_empty: skip + empty_message: "无 rank 的 worst_fraction 超过阈值 — straggler 可能是偶发的" + + - id: recent_step_lag + title: "最近 step 上 lag 最大的 rank" + type: sql + sql: | + WITH per_step AS ( + SELECT + global_step, + rank, + sum(duration_ms) AS step_ms + FROM {table_comm} + WHERE global_step >= ( + SELECT max(global_step) - LEAST({step_window}, 50) + FROM {table_comm} + ) + GROUP BY global_step, rank + ), + ranked AS ( + SELECT + global_step, + rank, + step_ms, + step_ms - min(step_ms) OVER (PARTITION BY global_step) AS lag_ms + FROM per_step + ) + SELECT global_step, rank, step_ms, lag_ms + FROM ranked + WHERE lag_ms = max(lag_ms) OVER (PARTITION BY global_step) + ORDER BY global_step DESC + LIMIT 15 + on_empty: skip + + - id: rank_latency_context + title: "各 rank 平均 collective 延迟(对照)" + type: sql + cluster: true + when: "{use_global}" + sql: | + SELECT + _host, + _rank, + count(*) AS calls, + avg(duration_ms) AS avg_ms, + max(duration_ms) AS max_ms + FROM global.python.comm_collective + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM global.python.comm_collective + ) + GROUP BY _host, _rank + ORDER BY avg_ms DESC + on_empty: skip + + variables: + table_comm: "{comm_table}" + + interpretation: + rules: + - id: chronic_straggler + when: "step:persistent_offenders | rows >= 1" + severity: warning + message: "存在 worst_fraction ≥ 阈值的 rank — 长期 straggler,优先查对应节点" + + - id: high_worst_fraction + when: "step:worst_fraction | column:worst_fraction | max > 0.5" + severity: warning + message: "有 rank 在超过一半 step 上是最慢 — 强烈怀疑节点/网络/数据问题" + + - id: single_dominant + when: "step:worst_fraction | rows >= 2 | top(row).worst_fraction > 2 * median(worst_fraction)" + severity: info + message: "worst_fraction 头部 rank 明显突出 — 见 persistent_offenders 表" + + summary_template: | + ## 长期 straggler + - **worst_fraction**: 每个 rank 在多少比例的 step 上是最慢 + - **persistent_offenders**: 超过 `{worst_fraction_threshold}` 阈值的 rank + - **recent_step_lag**: 最近 step 的单次 lag(偶发 vs 长期对照) + - **rank_latency_context**: 窗口内平均 collective 延迟 + + next_steps: + - "对应节点 GPU/显存 → skill: gpu_pressure" + - "NCCL wait 分解 → skill: nccl_culprit_victim" + - "模块热点 → 在慢 rank inject 后 skill: module_bottleneck" + - "整 job 变慢趋势 → skill: job_health" diff --git a/python/probing/bundled_skills/semantic/intents.yaml b/python/probing/bundled_skills/semantic/intents.yaml index 1944284d..fb01be3d 100644 --- a/python/probing/bundled_skills/semantic/intents.yaml +++ b/python/probing/bundled_skills/semantic/intents.yaml @@ -5,8 +5,18 @@ kind: IntentCatalog intents: health_check: label: "健康检查 / 不知道从哪查" - keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup] - skills: [health_overview] + keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup, job health, 作业健康] + skills: [health_overview, job_health] + + job_slowdown: + label: "整 job 变慢 / slowdown" + keywords: [job 慢, 整体变慢, slowdown, job health, 作业健康, step 落后, 变慢趋势] + skills: [job_health, persistent_straggler, slow_rank, comm_bottleneck] + + persistent_straggler: + label: "长期 straggler / worst_fraction" + keywords: [worst_fraction, 长期慢, 一直慢, persistent straggler, 总是最慢, chronic] + skills: [persistent_straggler, slow_rank, job_health, nccl_culprit_victim] training_hung: label: "训练卡住 / 无进展" @@ -15,13 +25,13 @@ intents: training_slow: label: "训练变慢 / 瓶颈" - keywords: [慢, slow, bottleneck, 瓶颈, 变慢, hotspot, 热点, 耗时] - skills: [module_bottleneck, slow_rank, comm_bottleneck] + keywords: [慢, slow, bottleneck, 瓶颈, 变慢, hotspot, 热点, 耗时, slowdown, job 慢] + skills: [job_health, module_bottleneck, slow_rank, persistent_straggler, comm_bottleneck] which_rank: label: "慢 rank / straggler" - keywords: [straggler, 慢 rank, 拖后腿, rank 慢, lagging rank, 哪个 rank] - skills: [slow_rank, nccl_culprit_victim, comm_bottleneck] + keywords: [straggler, 慢 rank, 拖后腿, rank 慢, lagging rank, 哪个 rank, worst_fraction, 长期慢] + skills: [persistent_straggler, slow_rank, nccl_culprit_victim, comm_bottleneck] memory_growing: label: "显存上涨 / OOM" @@ -41,4 +51,4 @@ intents: cluster_view: label: "集群 / 多机训练" keywords: [集群, 多机, 分布式, cluster, multi-node, 跨节点, 所有 rank, all ranks, fan-out] - skills: [slow_rank, comm_bottleneck, health_overview] + skills: [job_health, slow_rank, persistent_straggler, comm_bottleneck, health_overview] diff --git a/python/probing/bundled_skills/semantic/pages.yaml b/python/probing/bundled_skills/semantic/pages.yaml index 397c278b..0b412ccf 100644 --- a/python/probing/bundled_skills/semantic/pages.yaml +++ b/python/probing/bundled_skills/semantic/pages.yaml @@ -13,13 +13,13 @@ pages: title: Investigate path: /agent description: "Skill-driven investigation; optional LLM diagnostic agent summarizes SQL evidence." - skills: [health_overview] + skills: [health_overview, job_health] cluster: title: Cluster path: /cluster description: "Distributed training cluster nodes and rank status." - skills: [slow_rank, comm_bottleneck] + skills: [slow_rank, comm_bottleneck, job_health, persistent_straggler] stacks: title: Stacks @@ -49,7 +49,7 @@ pages: title: Analytics path: /analytics description: "Ad-hoc SQL analytics and time-series charts." - skills: [health_overview, comm_bottleneck, slow_rank] + skills: [health_overview, job_health, comm_bottleneck, slow_rank, persistent_straggler] spans: title: Spans @@ -61,7 +61,7 @@ pages: title: Training path: /training description: "Training step metrics and collective communication latency." - skills: [slow_rank, comm_bottleneck, module_bottleneck] + skills: [job_health, slow_rank, persistent_straggler, comm_bottleneck, module_bottleneck] pulsing: title: Pulsing diff --git a/python/probing/bundled_skills/semantic/tables.yaml b/python/probing/bundled_skills/semantic/tables.yaml index 76b92ce5..06f4c7bc 100644 --- a/python/probing/bundled_skills/semantic/tables.yaml +++ b/python/probing/bundled_skills/semantic/tables.yaml @@ -1,143 +1,361 @@ # Semantic layer: maps user/agent language to probing SQL tables and columns. -# Used in system prompts and skill prerequisite checks. +# Used in system prompts, skill prerequisite checks, and Engine DESCRIBE rewrite +# (probe.probing.table_docs / column_docs). apiVersion: probing.dev/v1 kind: SemanticCatalog tables: python.torch_trace: - description: "PyTorch module-level forward/step timings and GPU memory snapshots" + description: "PyTorch 模块级 forward/step hook 耗时与 GPU 显存快照(长驻采样,非 torch.profiler 窗口)" synonyms: [torch trace, module timing, 模块耗时, 训练步 profiling] key_columns: - micro_step: "Finest step counter (micro-batch index)" - local_step: "Training step on this rank (micro_step // micro_batches)" - global_step: "Same as local_step when ranks are aligned" - micro_batches: "Gradient accumulation factor" - rank: "torch.distributed rank" - role: "Parallel role key, e.g. 'dp=2,pp=1,tp=0' (align/join across ranks)" - module: "Fully-qualified module name" - stage: "One of: forward, step (post forward / post step hooks)" - duration: "Hook duration in seconds" - allocated: "GPU memory allocated (MB) at hook time" - allocated_delta: "Change in allocated since previous hook (MB)" - max_allocated: "Peak allocated (MB)" + micro_step: "最细粒度步计数(micro-batch 序号)" + local_step: "本 rank 训练步(micro_step // micro_batches)" + global_step: "全局训练步(各 rank 对齐时与 local_step 相同)" + micro_batches: "梯度累积因子" + seq: "本 step 内 hook 序号" + rank: "torch.distributed rank(-1 未知)" + world_size: "world size(-1 未知)" + role: "并行角色键,如 dp=2,pp=1,tp=0" + module: "模块全限定名" + stage: "pre forward | post forward | pre step | post step" + time_offset: "相对本 step 时间锚点的秒偏移" + duration: "hook 耗时(秒);post 行有意义" + allocated: "当前 GPU 已分配显存(MB)" + allocated_delta: "相对上一 hook 的 allocated 变化(MB)" + max_allocated: "峰值已分配显存(MB)" + max_allocated_delta: "相对上一 hook 的 max_allocated 变化(MB)" + cached: "当前 GPU reserved 显存(MB)" + max_cached: "峰值 reserved 显存(MB)" notes: - - "First complete step is discovery-only (may have no rows)" - - "Backward hooks are off by default" + - "第一个完整 step 为 discovery-only,可能无数据行" + - "默认仅 forward hook;backward hook 默认关闭" python.comm_collective: - description: "torch.distributed collective calls (all_reduce, broadcast, …)" + description: "torch.distributed 集合通信调用记录(all_reduce、broadcast 等)" synonyms: [collective, communication, NCCL, 通信, all_reduce] key_columns: - micro_step: "Finest step counter" - global_step: "Training step (same as local_step)" - local_step: "Training step on this rank" - micro_batches: "Gradient accumulation factor" + micro_step: "最细粒度步计数" + local_step: "本 rank 训练步" + global_step: "全局训练步" + micro_batches: "梯度累积因子" rank: "torch.distributed rank" - role: "Parallel role key, e.g. 'dp=2,pp=1,tp=0' (align/join across ranks)" - op: "Collective operation name" - duration_ms: "Wall time in milliseconds" - bytes: "Tensor bytes communicated" + world_size: "world size" + role: "并行角色键" + op: "集合通信算子名" + group_rank: "进程组内 rank" + group_size: "进程组大小" + participate_ranks: "参与 rank 列表(JSON 数组字符串)" + tensor_shape: "张量 shape 字符串" + tensor_dtype: "张量 dtype" + bytes: "通信字节数" + duration_ms: "墙钟耗时(毫秒)" + async_op: "1=异步 collective,0=同步" global_name: global.python.comm_collective federation_columns: [_host, _addr, _rank, _role] python.trace_event: - description: "Span start/end and custom events (distributed tracing)" + description: "分布式 tracing:span 起止与自定义 event(python.tracing)" synonyms: [trace, span, timeline, 链路] key_columns: record_type: "span_start | span_end | event" - trace_id: "Trace id shared by related spans" - span_id: "Unique span id" - name: "Span or event name" - time: "Timestamp (nanoseconds since epoch)" + trace_id: "同一 trace 内共享的 trace id" + span_id: "span 唯一 id" + parent_id: "父 span id(-1 表示无)" + name: "span 或 event 名称" + phase: "训练阶段:forward | backward | optimizer(可为空)" + time: "时间戳(纳秒,epoch)" + thread_id: "记录线程 id" + location: "源码位置(file:line)" + attributes: "JSON 元数据(rank、local_step 等)" + event_attributes: "event 专用 JSON 属性" + notes: + - "与 span_end 按 span_id join 可算 duration" + - "物化视图见 python.tracing.table.SPANS_SQL" python.backtrace: - description: "Live mixed Python + native stack (point-in-time, not historical)" + description: "混合 Python + native 调用栈快照(即时采集,非历史表)" synonyms: [stack, backtrace, 调用栈, hang stack] key_columns: - func: "Function name" - file: "Source file" - lineno: "Line number" - depth: "Stack depth (0 = innermost)" - frame_type: "python | native" + ip: "native 帧指令指针(Python 帧为 NULL)" + file: "源文件路径" + func: "函数/符号名" + lineno: "行号" + depth: "栈深度(0=最内层)" + frame_type: "Python | Native | Rust" + notes: + - "通过 probing backtrace 或 inject 后 SELECT 填充" + + python.variables: + description: "TorchProbe 变量追踪快照(需启用 vars/watch)" + synonyms: [variable trace, watch, 变量快照] + key_columns: + micro_step: "训练 micro-step" + func: "函数名" + name: "变量名" + value: "变量值的字符串表示" + notes: + - "与 python.trace_variables 不同;后者记录调试器 watch 变更" + + python.trace_variables: + description: "调试器 watch 触发的变量变更记录" + synonyms: [trace variables, watch changes, 变量变更] + key_columns: + function_name: "发生变更的函数名" + filename: "源文件" + lineno: "行号" + variable_name: "变量名" + value: "变更后的值(字符串)" + value_type: "值类型名" cpu.utilization: - description: "Host CPU and RSS sampling (process and top threads)" - synonyms: [cpu, host memory, RSS, 主机内存] + description: "主机 CPU / RSS 周期采样(进程级 + Top-N 线程)" + synonyms: [cpu, host memory, RSS, 主机 CPU] key_columns: - ts: "Sample timestamp (microseconds)" + ts: "采样时间戳(微秒 since epoch)" scope: "process | thread" - rss_kb: "Resident set size (KB) — process scope only" - cpu_total_pct: "CPU utilization percentage" - comm: "Thread/process name" - wchan: "Kernel wait channel (Linux)" + platform: "采样后端(linux | macos)" + tid: "线程 id(process scope 时为 0)" + comm: "进程/线程名" + wall_ns: "距上次采样的墙钟间隔(纳秒)" + delta_user_ns: "用户态 CPU 增量(纳秒)" + delta_sys_ns: "内核态 CPU 增量(纳秒)" + delta_total_ns: "总 CPU 增量(纳秒)" + cpu_user_pct: "用户态 CPU 利用率(%)" + cpu_sys_pct: "内核态 CPU 利用率(%)" + cpu_total_pct: "总 CPU 利用率(%)" + cum_user_ns: "累计用户态 CPU 时间(纳秒)" + cum_sys_ns: "累计内核态 CPU 时间(纳秒)" + rss_kb: "常驻内存 RSS(KB);仅 process scope" + thread_count: "线程数;仅 process scope" + delta_vol_ctxt: "自愿上下文切换增量" + delta_invol_ctxt: "非自愿上下文切换增量" + state: "线程/进程状态(Linux)" + wchan: "内核 wait channel(Linux)" + + cpu.tasks: + description: "CPU Top-N 热点线程明细(与 cpu.utilization 同周期采样)" + synonyms: [cpu threads, top threads, 热点线程] + key_columns: + ts: "采样时间戳(微秒)" + platform: "linux | macos" + tid: "线程 id" + comm: "线程名" + state: "线程状态" + wchan: "内核 wait channel" + wall_ns: "采样间隔(纳秒)" + delta_user_ns: "用户态 CPU 增量(纳秒)" + delta_sys_ns: "内核态 CPU 增量(纳秒)" + delta_total_ns: "总 CPU 增量(纳秒)" gpu.utilization: - description: "GPU memory and utilization samples" + description: "GPU 显存与利用率周期采样" synonyms: [gpu memory, VRAM, 显存, GPU利用率] key_columns: - ts: "Sample timestamp" - used_bytes: "Device memory used" - total_bytes: "Device memory total" - mem_used_pct: "Memory used percentage" - gpu_util_pct: "GPU compute utilization (-1 if unavailable)" + ts: "采样时间戳(微秒)" + backend: "cuda | mps | …" + device_id: "设备序号" + name: "设备名称" + memory_model: "显存型号描述" + chip: "芯片/架构标识" + free_bytes: "空闲显存(字节)" + total_bytes: "总显存(字节)" + used_bytes: "已用显存(字节)" + mem_used_pct: "显存使用率(%)" + gpu_util_pct: "GPU 计算利用率(%;不可用为 -1)" + mem_controller_util_pct: "显存控制器利用率(NVIDIA)" + renderer_util_pct: "渲染引擎利用率(Apple MPS)" + tiler_util_pct: "Tiler 利用率(Apple MPS)" + driver_mem_bytes: "驱动保留显存(字节)" + wall_ns: "采样间隔(纳秒)" process.kmsg: - description: "Linux kernel ring buffer (dmesg) — OOM killer, GPU Xid, IB errors" + description: "Linux 内核 ring buffer(dmesg)— OOM、GPU Xid、IB 错误等" synonyms: [kernel log, dmesg, OOM, 内核日志] platform: linux key_columns: - timestamp: "Event time" - level: "Log level" - message: "Kernel message text" + timestamp: "内核日志时间(微秒)" + facility: "syslog facility" + level: "日志级别" + message: "内核消息正文" cluster.nodes: - description: "Registered distributed training peers" + description: "已注册的分布式训练 peer(torchrun / PUT /apis/nodes)" synonyms: [cluster, nodes, ranks, 集群节点] key_columns: - rank: "Global rank" - host: "Hostname" - addr: "probing HTTP address" - role: "Parallel role key, e.g. dp=2,pp=1,tp=0 (federation _role source)" - status: "Node status" + host: "主机名" + addr: "probing HTTP 地址" + local_rank: "节点内 local rank" + rank: "全局 rank" + world_size: "world size" + group_rank: "进程组 rank" + group_world_size: "进程组大小" + role_name: "Torchrun / Elastic role 名" + role_rank: "role 内 rank" + role_world_size: "role 内 world size" + role: "并行角色键(federation _role 来源)" + status: "节点状态" + timestamp: "最后更新时间(微秒)" + + rdma.mlx_hca: + description: "InfiniBand/RoCE HCA 端口计数器快照(/sys/class/infiniband)" + synonyms: [IB, RoCE, HCA, mlx, RDMA counters] + platform: linux + key_columns: + hca_name: "HCA 设备名(如 mlx5_0)" + port_rcv_packets: "端口接收包计数" + port_rcv_data: "端口接收字节计数" + port_xmit_packets: "端口发送包计数" + port_xmit_data: "端口发送字节计数" + link_downed: "链路 down 次数" + np_cnp_sent: "RoCE CNP 发送计数" + np_ecn_marked_roce_packets: "ECN 标记 RoCE 包计数" + rcv_pkts_rate: "接收包速率(包/秒,两次采样差分)" + snd_pkts_rate: "发送包速率(包/秒)" + notes: + - "需配置 rdma.hca.name 与 rdma.sample.rate" nccl.proxy_ops: - description: "NCCL profiler plugin proxy-op wait decomposition (culprit vs victim)" + description: "NCCL profiler plugin proxy-op wait 分解(culprit / victim 归因)" synonyms: [NCCL proxy, send_gpu_wait, recv_wait, culprit, victim, proxy wait] key_columns: - ts: "Event timestamp (nanoseconds)" + ts: "事件时间戳(纳秒)" rank: "torch.distributed rank" - tp_rank: "Tensor-parallel rank (-1 if unknown)" - pp_rank: "Pipeline-parallel rank (-1 if unknown)" - dp_rank: "Data-parallel rank (-1 if unknown)" + tp_rank: "张量并行 rank(未知 -1)" + pp_rank: "流水线并行 rank(未知 -1)" + dp_rank: "数据并行 rank(未知 -1)" comm_hash: "NCCL communicator hash" - coll_func: "Collective name (AllReduce, AllGather, …)" - seq: "Collective sequence number" + coll_func: "集合通信名(AllReduce、AllGather…)" + seq: "collective 序号" channel_id: "NCCL channel id" - peer: "Peer rank for this proxy op" - is_send: "1 if send proxy, 0 if recv" - n_steps: "ProxyStep count aggregated" - trans_bytes: "Bytes transferred" - send_gpu_wait_ns: "Culprit signal — local GPU not ready to send" - send_wait_ns: "Send-side network wait" - recv_wait_ns: "Victim signal — waiting on peer data" - recv_flush_wait_ns: "Recv flush wait" + peer: "对端 rank" + is_send: "1=send proxy,0=recv proxy" + n_steps: "聚合的 ProxyStep 数" + trans_bytes: "传输字节数" + send_gpu_wait_ns: "Culprit 信号 — 本地 GPU 未就绪发送" + send_wait_ns: "发送侧网络等待" + recv_wait_ns: "Victim 信号 — 等待对端数据" + recv_flush_wait_ns: "接收 flush 等待" global_name: global.nccl.proxy_ops federation_columns: [_host, _addr, _rank, _role] notes: - - "Requires NCCL_PROFILER_PLUGIN + NCCL ≥ 2.26 (mask 26: Coll|ProxyOp|ProxyStep)" - - "macOS dev: PROBING_NCCL_MOCK=1 seeds synthetic culprit/victim pattern" + - "需 NCCL_PROFILER_PLUGIN + NCCL ≥ 2.26(mask Coll|ProxyOp|ProxyStep)" + - "macOS 开发:PROBING_NCCL_MOCK=1 可注入合成数据" nccl.net_qp: - description: "NCCL NetPlugin IB QP completion timing (optional mask bit 128)" + description: "NCCL NetPlugin IB QP 完成耗时(可选 mask bit 128)" synonyms: [IB QP, RoCE, net plugin, qp duration] key_columns: - ts: "Event timestamp (nanoseconds)" + ts: "事件时间戳(纳秒)" rank: "torch.distributed rank" - device: "IB device index" - qp_num: "Queue pair number" - wr_id: "Work request id" + device: "IB 设备索引" + qp_num: "Queue Pair 号" + wr_id: "Work Request id" opcode: "IB opcode" - length: "Transfer length" - duration_ns: "QP completion duration" + length: "传输长度(字节)" + duration_ns: "QP 完成耗时(纳秒)" global_name: global.nccl.net_qp federation_columns: [_host, _addr, _rank, _role] + + hccl.host_ops: + description: "HCCL MSProf Host API 时间线(集合通信 op、ACL、task master/slave)" + synonyms: [HCCL host, MSProf API, host_hccl_op, task_master] + key_columns: + ts: "结束时间(CANN sys cycle)" + begin_ns: "开始时间" + end_ns: "结束时间" + duration_ns: "耗时 end - begin" + thread_id: "上报线程 id" + level: "MSProf level" + type_id: "MSProf type id" + item_id: "名称 hash" + item_name: "解码名称(hcom_allReduce_、Memcpy 等)" + event_class: "host_hccl_op | task_master | task_slave | host_acl | node_launch" + aging: "MSProf aging flag" + notes: + - "来源:libprofapi.so shim 拦截 MsprofReportApi" + - "需开启 CANN/HCCL profiling" + + hccl.collectives: + description: "HCCL 集合通信元数据与 Host 耗时(row_source 区分 api/compact 行)" + synonyms: [HCCL collective, hcom_allReduce, HcclOpInfo] + key_columns: + ts: "事件时间" + thread_id: "上报线程" + row_source: "api=耗时行;compact=count/group/alg 参数行" + begin_ns: "开始时间(api 行)" + end_ns: "结束时间(api 行)" + duration_ns: "耗时(api 行)" + op_hash: "算子名 hash(api 行)" + op_name: "算子名(api 行)" + group_hash: "comm group 名 hash(compact 行)" + alg_hash: "算法名 hash(compact 行)" + count: "元素个数(compact 行)" + data_type: "HcclDataType enum" + relay: "HCCL relay 标志" + retry: "HCCL retry 计数" + compact_type: "MsprofReportCompactInfo type id" + notes: + - "api 与 compact 行按 thread_id + 邻近 ts JOIN" + + hccl.tasks: + description: "HCCL 设备侧 task 明细(MsprofHcclInfo L1)" + synonyms: [HCCL task, RDMASend, Memcpy, Notify_Wait] + key_columns: + ts: "上报时间戳" + thread_id: "上报线程" + info_type: "AdditionalInfo type id" + info_level: "AdditionalInfo level" + info_type_name: "RegTypeInfo 注册名(如 hccl_info)" + item_id: "task 类型 hash" + task_name: "task 类型名(Memcpy、RDMASend…)" + ccl_tag: "CCL tag hash" + group_name: "comm group hash" + local_rank: "本端 rank" + remote_rank: "对端 rank(-1 表示 N/A)" + rank_size: "通信组大小" + workflow_mode: "HCCL workflow mode enum" + plane_id: "原始 plane 编码" + plane_index: "plane 索引(plane_id bits 28-31)" + rank_in_plane: "plane 内 rank(bits 0-15)" + rank_size_plane: "plane 宽度(bits 16-27)" + ctx_id: "FFTS context id" + notify_id: "notify 对象 id" + stage: "流水线 stage" + role: "task 角色 enum" + data_size: "传输字节数" + op_type: "操作类型 enum" + data_type: "数据类型 enum" + link_type: "链路类型" + transport_type: "传输类型" + rdma_type: "RDMA 类型" + duration_est_us: "HCCL 估算耗时(微秒)" + payload_len: "原始 AdditionalInfo payload 长度" + global_name: global.hccl.tasks + federation_columns: [_host, _addr, _rank, _role] + + hccl.mc2_streams: + description: "HCCL MC2 communicator stream 拓扑快照" + synonyms: [MC2, comm streams, aicpu stream] + key_columns: + ts: "上报时间" + thread_id: "上报线程" + info_type: "MSProf AdditionalInfo type" + group_hash: "comm group 名 hash" + rank_size: "组内 rank 数" + rank_id: "rank id" + usr_rank_id: "用户可见 rank id" + aicpu_kfc_stream_id: "KFC stream id" + comm_stream_size: "comm stream 数量" + comm_stream_ids: "逗号分隔的 stream id 列表" + + hccl.context_ids: + description: "HCCL FFTS context id 范围(dispatch 时上报)" + synonyms: [FFTS context, context id] + key_columns: + ts: "上报时间" + thread_id: "上报线程" + info_type: "MSProf AdditionalInfo type" + ctx_id_num: "context 数量(HCCL 固定报 2)" + ctx_id_min: "范围起点(通常 0)" + ctx_id_max: "范围终点(ctxIdMax)" diff --git a/python/probing/bundled_skills/slow_rank/steps.yaml b/python/probing/bundled_skills/slow_rank/steps.yaml index 7d5fabc1..eb6f3b48 100644 --- a/python/probing/bundled_skills/slow_rank/steps.yaml +++ b/python/probing/bundled_skills/slow_rank/steps.yaml @@ -183,3 +183,4 @@ spec: - "栈卡在 collective → skill: training_hang" - "模块级热点 → skill: module_bottleneck (在慢 rank 上 inject)" - "有 nccl.proxy_ops → skill: nccl_culprit_victim (culprit/victim 归因)" + - "长期最慢 rank (worst_fraction) → skill: persistent_straggler --global" diff --git a/python/probing/profiling/torch_probe.py b/python/probing/profiling/torch_probe.py index 96434313..86796489 100644 --- a/python/probing/profiling/torch_probe.py +++ b/python/probing/profiling/torch_probe.py @@ -1,9 +1,12 @@ +import logging import random import time from dataclasses import dataclass from typing import Optional import probing + +logger = logging.getLogger(__name__) from probing.core import table from probing.parallel import current_role from probing.tracing import span, step @@ -265,13 +268,19 @@ def __init__(self, record, events): self.events = events def save(self): - try: - if self.events is not None: - start, end = self.events + # Duration is best-effort: GPU event timing (notably MPS + # `Event.elapsed_time`) can raise when events cannot be correlated. + # That must only cost us the duration, never the whole trace record. + if self.events is not None: + start, end = self.events + try: self.record.duration = start.elapsed_time(end) / 1000.0 + except Exception as e: + logger.debug("trace duration unavailable: %s", e) + try: self.record.save() except Exception as e: - print(f"Error saving trace: {e}") + logger.debug("failed to save trace record: %s", e) def mem_stats() -> TorchTrace: diff --git a/skills/catalog.yaml b/skills/catalog.yaml index 7ee7cf93..b8621b7b 100644 --- a/skills/catalog.yaml +++ b/skills/catalog.yaml @@ -37,7 +37,29 @@ skills: - training_hang - memory_leak - crash_triage + - job_health path: health_overview/steps.yaml +- id: job_health + category: triage + priority: 1 + entry: true + description: 'Job-level health — cluster alive, step lag, slowdown proxy, comm trend' + tables: + - cluster.nodes + - python.comm_collective + - global.python.comm_collective + - python.trace_event + pages: + - training + - cluster + - agent + - analytics + related: + - health_overview + - persistent_straggler + - slow_rank + - training_hang + path: job_health/steps.yaml - id: crash_triage category: triage priority: 1 @@ -82,7 +104,26 @@ skills: - nccl_culprit_victim - gpu_pressure - training_hang + - persistent_straggler + - job_health path: slow_rank/steps.yaml +- id: persistent_straggler + category: distributed + priority: 2 + description: 'Persistent straggler — worst_fraction across steps (chronic slow rank)' + tables: + - python.comm_collective + - global.python.comm_collective + pages: + - training + - cluster + - analytics + related: + - slow_rank + - job_health + - nccl_culprit_victim + - gpu_pressure + path: persistent_straggler/steps.yaml - id: memory_leak category: memory priority: 3 diff --git a/skills/health_overview/steps.yaml b/skills/health_overview/steps.yaml index 8b2c11c5..ad01b085 100644 --- a/skills/health_overview/steps.yaml +++ b/skills/health_overview/steps.yaml @@ -102,6 +102,7 @@ spec: 若某项为空,按 empty_message 提示开启对应采集。 next_steps: + - "多机训练 job 级诊断 → skill: job_health --global" - "训练变慢 → skill: module_bottleneck 或 slow_rank" - "显存上涨 → skill: memory_leak" - "进程卡住 → skill: training_hang" diff --git a/skills/job_health/SKILL.md b/skills/job_health/SKILL.md new file mode 100644 index 00000000..526dd478 --- /dev/null +++ b/skills/job_health/SKILL.md @@ -0,0 +1,48 @@ +--- +name: job_health +description: > + Job-level health: cluster alive, step lag, slowdown proxy, comm trend +category: triage +tables: [cluster.nodes, python.comm_collective, global.python.comm_collective, python.trace_event] +tags: [job, slowdown, health, 作业] +keywords: + en: ['job health', 'job slow', 'slowdown', 'training degraded', 'step lag'] + zh: ['作业健康', 'job 慢', '整体变慢', 'slowdown', 'step 落后'] +parameters: + step_window: { type: integer, default: 200 } + step_lag_threshold: { type: integer, default: 5 } + use_global: { type: boolean, default: true } +--- + +# Job health & slowdown + +从 **整 job** 视角看训练是否健康,而不是单个 rank 的单次 collective。 + +## 看什么 + +| 步骤 | 含义 | +|------|------| +| cluster_snapshot | 多少节点 alive / dead | +| rank_step_lag | 哪些 rank 的 `global_step` 明显落后(hang 信号) | +| job_slowdown_proxy | 各 step 上最慢 rank vs 最快 rank 的比值均值(§ federation 3.2) | +| comm_trend_by_step | 最近 step 通信总耗时是否爬升 | +| train_step_pacing | `train.step` span 的 wall time(若已开启 phase hook) | + +## Parameters + +- `step_window` (default `200`): 分析最近多少 global_step +- `step_lag_threshold` (default `5`): 落后 cluster max step 多少步算异常 +- `use_global` (default `true`): rank0 上 fan-out 到全集群 + +## 用法 + +```bash +probing -t rank0:8080 skill run job_health --global +probing -t rank0:8080 skill run job_health --set step_window=500 +``` + +## Related skills + +- 长期最慢 rank → `persistent_straggler` +- 当前 step 谁慢 → `slow_rank` +- 进程卡住 → `training_hang` diff --git a/skills/job_health/steps.yaml b/skills/job_health/steps.yaml new file mode 100644 index 00000000..7c027288 --- /dev/null +++ b/skills/job_health/steps.yaml @@ -0,0 +1,176 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: job_health + title: "Job 健康度 / 训练作业诊断" + title_en: "Job health & slowdown" + category: triage + tags: [job, slowdown, health, straggler, 作业, 变慢] + triggers: + keywords: + zh: ["作业健康", "job 慢", "整体变慢", "训练变慢", "slowdown", "worst_fraction", "掉队 rank", "step 落后"] + en: ["job health", "job slow", "slowdown", "training degraded", "persistent slow", "step lag"] + docs: | + 从 **job 级** 视角评估训练是否健康:集群节点存活、rank step 是否同步、 + collective 驱动的 slowdown proxy、最近 step 通信趋势。 + 适合多机训练 first look,或在 slow_rank 之前判断「是偶发还是整体变慢」。 + +spec: + parameters: + - name: step_window + type: integer + default: 200 + description: "Recent global_steps to include in slowdown / lag checks" + - name: step_lag_threshold + type: integer + default: 5 + description: "Flag ranks whose max(global_step) trails cluster max by this many steps" + - name: use_global + type: boolean + default: true + description: "Use global.* federation on rank0 for cross-node checks" + + requires: + any_tables: + - python.comm_collective + - global.python.comm_collective + - cluster.nodes + + steps: + - id: cluster_snapshot + title: "集群节点存活" + type: sql + sql: | + SELECT + count(*) AS nodes_total, + count(*) FILTER (WHERE status = 'running') AS nodes_running, + count(*) FILTER (WHERE status = 'dead') AS nodes_dead + FROM cluster.nodes + on_empty: warn + empty_message: "cluster.nodes 为空 — 单机或未注册集群" + + - id: rank_step_lag + title: "rank global_step 是否落后" + type: sql + cluster: true + when: "{use_global}" + sql: | + WITH bounds AS ( + SELECT max(global_step) AS max_step + FROM global.python.comm_collective + ) + SELECT + _host, + _rank, + _local_rank, + max(global_step) AS last_step, + (SELECT max_step FROM bounds) - max(global_step) AS steps_behind + FROM global.python.comm_collective, bounds + WHERE global_step >= (SELECT max_step - {step_window} FROM bounds) + GROUP BY _host, _rank, _local_rank, bounds.max_step + HAVING max(global_step) < (SELECT max_step - {step_lag_threshold} FROM bounds) + ORDER BY steps_behind DESC + on_empty: skip + empty_message: "未发现明显 step 落后的 rank(或仅有单 rank 数据)" + + - id: job_slowdown_proxy + title: "Job slowdown proxy(per-step straggler 比值)" + type: sql + cluster: true + when: "{use_global}" + sql: | + WITH per_rank_step AS ( + SELECT global_step, _rank, max(duration_ms) AS max_op_ms + FROM global.python.comm_collective + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM global.python.comm_collective + ) + GROUP BY global_step, _rank + ), + step_cp AS ( + SELECT global_step, + avg(max_op_ms) / NULLIF(min(max_op_ms), 0) AS step_slowdown_ratio + FROM per_rank_step + GROUP BY global_step + ) + SELECT + avg(step_slowdown_ratio) AS job_slowdown_proxy, + count(*) FILTER (WHERE step_slowdown_ratio > 1.1) AS slow_steps, + count(*) AS steps_in_window + FROM step_cp + on_empty: skip + empty_message: "global comm_collective 无足够 step 数据" + + - id: comm_trend_by_step + title: "最近 step 通信总耗时趋势" + type: sql + sql: | + SELECT + global_step, + sum(duration_ms) AS comm_ms, + count(*) AS calls, + count(DISTINCT rank) AS ranks_seen + FROM {table_comm} + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM {table_comm} + ) + GROUP BY global_step + ORDER BY global_step DESC + LIMIT 30 + on_empty: skip + + - id: train_step_pacing + title: "train.step wall time(若已 attach phase hook)" + type: sql + sql: | + SELECT + count(*) AS step_spans, + avg(duration_ns) / 1e6 AS avg_step_ms, + max(duration_ns) / 1e6 AS max_step_ms + FROM python.trace_event + WHERE name = 'train.step' + AND duration_ns IS NOT NULL + on_empty: skip + empty_message: "无 train.step span — attach_training_phases 或 TorchProbe 未写入 trace_event" + + variables: + table_comm: "{comm_table}" + + interpretation: + rules: + - id: dead_nodes + when: "step:cluster_snapshot | column:nodes_dead | value > 0" + severity: error + message: "集群有 {nodes_dead} 个 dead 节点 — 检查 torchrun 心跳或进程是否退出" + + - id: step_lag + when: "step:rank_step_lag | rows >= 1" + severity: warning + message: "存在 global_step 明显落后的 rank — 可能 hang 或极慢 straggler" + + - id: job_slow + when: "step:job_slowdown_proxy | column:job_slowdown_proxy | value > 1.15" + severity: warning + message: "Job slowdown proxy > 1.15 — 多数 step 上最慢 rank 拖慢整体" + + - id: many_slow_steps + when: "step:job_slowdown_proxy | column:slow_steps | ratio(slow_steps/steps_in_window) > 0.3" + severity: warning + message: "超过 30% 的 step 出现 straggler 比值 > 1.1 — 考虑 skill: persistent_straggler" + + summary_template: | + ## Job 健康度 + - **cluster_snapshot**: 存活节点 vs dead + - **rank_step_lag**: 是否有 rank 的 global_step 落后 + - **job_slowdown_proxy**: 理想 step 时间 vs 实际的 proxy(>1.1 表示 straggler 影响) + - **comm_trend_by_step**: 通信耗时是否随 step 上升 + + next_steps: + - "某 rank 长期最慢 → skill: persistent_straggler" + - "单次 step 谁最慢 → skill: slow_rank" + - "loss 不更新 / 栈卡住 → skill: training_hang" + - "通信热点 op → skill: comm_bottleneck" + - "NCCL wait 分解 → skill: nccl_culprit_victim" diff --git a/skills/persistent_straggler/SKILL.md b/skills/persistent_straggler/SKILL.md new file mode 100644 index 00000000..659d8188 --- /dev/null +++ b/skills/persistent_straggler/SKILL.md @@ -0,0 +1,45 @@ +--- +name: persistent_straggler +description: > + Find ranks that are slow on many steps (worst_fraction), not just once +category: distributed +tables: [python.comm_collective, global.python.comm_collective] +tags: [straggler, persistent, worst_fraction] +keywords: + en: ['persistent straggler', 'worst fraction', 'always slow', 'chronic straggler'] + zh: ['长期慢', '一直慢', 'worst_fraction', '总是最慢'] +parameters: + step_window: { type: integer, default: 300 } + worst_fraction_threshold: { type: number, default: 0.25 } + use_global: { type: boolean, default: true } +--- + +# Persistent straggler (worst_fraction) + +`slow_rank` 看 **当前窗口里谁平均最慢**;本 skill 看 **谁在多少 step 上拿「最慢 rank」**。 + +## worst_fraction + +对每个 rank 统计:在窗口内有多少 step 上,该 rank 的 collective 总耗时等于该 step 的最大值。 + +- `worst_fraction ≈ 1.0` — 几乎每步都是最慢( chronic straggler) +- `worst_fraction ≈ 0.05` — 偶发 + +## Parameters + +- `step_window` (default `300`) +- `worst_fraction_threshold` (default `0.25`) — `persistent_offenders` 步骤的过滤阈值 +- `use_global` (default `true`) + +## 用法 + +```bash +probing -t rank0:8080 skill run persistent_straggler --global +probing -t rank0:8080 skill run persistent_straggler --set worst_fraction_threshold=0.4 --set step_window=500 +``` + +## Related skills + +- Job 整体变慢 → `job_health` +- 当前 step lag → `slow_rank` +- NCCL culprit/victim → `nccl_culprit_victim` diff --git a/skills/persistent_straggler/steps.yaml b/skills/persistent_straggler/steps.yaml new file mode 100644 index 00000000..d0a36e85 --- /dev/null +++ b/skills/persistent_straggler/steps.yaml @@ -0,0 +1,194 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: persistent_straggler + title: "长期 straggler / worst_fraction" + title_en: "Persistent straggler (worst_fraction)" + category: distributed + tags: [straggler, persistent, worst_fraction, rank, 拖后腿] + triggers: + keywords: + zh: ["长期慢", "一直慢", "worst_fraction", "persistent straggler", "总是最慢", "慢性 straggler"] + en: ["persistent straggler", "worst fraction", "always slow", "chronic straggler", "worst_fraction"] + docs: | + 找出 **在多少 step 上是最慢 rank**(worst_fraction),区分「偶发慢一次」与「长期拖后腿」。 + 对标 federation 文档 §3.2;万卡场景请在 rank0 上 `--global` fan-out。 + +spec: + parameters: + - name: step_window + type: integer + default: 300 + description: "Steps included in worst_fraction calculation" + - name: worst_fraction_threshold + type: number + default: 0.25 + description: "Flag ranks whose worst_fraction exceeds this (0–1)" + - name: use_global + type: boolean + default: true + description: "Query global.python.comm_collective with cluster fan-out" + + requires: + any_tables: + - python.comm_collective + - global.python.comm_collective + + steps: + - id: worst_fraction + title: "各 rank 的 worst_fraction" + type: sql + cluster: true + when: "{use_global}" + sql: | + WITH per_step AS ( + SELECT global_step, _rank, _host, sum(duration_ms) AS step_ms + FROM global.python.comm_collective + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM global.python.comm_collective + ) + GROUP BY global_step, _rank, _host + ) + SELECT + _rank, + _host, + count(*) AS steps_seen, + sum( + CASE + WHEN step_ms = max(step_ms) OVER (PARTITION BY global_step) THEN 1 + ELSE 0 + END + ) * 1.0 / count(*) AS worst_fraction, + avg(step_ms) AS avg_step_comm_ms + FROM per_step + GROUP BY _rank, _host + ORDER BY worst_fraction DESC, avg_step_comm_ms DESC + on_empty: abort + empty_message: | + 无 global comm_collective 数据。确认: + - rank0 上运行且 cluster.nodes 已注册 + - probing -t rank0:8080 skill run persistent_straggler --global + + - id: persistent_offenders + title: "worst_fraction 超过阈值的 rank" + type: sql + cluster: true + when: "{use_global}" + sql: | + WITH per_step AS ( + SELECT global_step, _rank, _host, sum(duration_ms) AS step_ms + FROM global.python.comm_collective + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM global.python.comm_collective + ) + GROUP BY global_step, _rank, _host + ), + scored AS ( + SELECT + _rank, + _host, + count(*) AS steps_seen, + sum( + CASE + WHEN step_ms = max(step_ms) OVER (PARTITION BY global_step) THEN 1 + ELSE 0 + END + ) * 1.0 / count(*) AS worst_fraction, + avg(step_ms) AS avg_step_comm_ms + FROM per_step + GROUP BY _rank, _host + ) + SELECT * + FROM scored + WHERE worst_fraction >= {worst_fraction_threshold} + ORDER BY worst_fraction DESC, avg_step_comm_ms DESC + on_empty: skip + empty_message: "无 rank 的 worst_fraction 超过阈值 — straggler 可能是偶发的" + + - id: recent_step_lag + title: "最近 step 上 lag 最大的 rank" + type: sql + sql: | + WITH per_step AS ( + SELECT + global_step, + rank, + sum(duration_ms) AS step_ms + FROM {table_comm} + WHERE global_step >= ( + SELECT max(global_step) - LEAST({step_window}, 50) + FROM {table_comm} + ) + GROUP BY global_step, rank + ), + ranked AS ( + SELECT + global_step, + rank, + step_ms, + step_ms - min(step_ms) OVER (PARTITION BY global_step) AS lag_ms + FROM per_step + ) + SELECT global_step, rank, step_ms, lag_ms + FROM ranked + WHERE lag_ms = max(lag_ms) OVER (PARTITION BY global_step) + ORDER BY global_step DESC + LIMIT 15 + on_empty: skip + + - id: rank_latency_context + title: "各 rank 平均 collective 延迟(对照)" + type: sql + cluster: true + when: "{use_global}" + sql: | + SELECT + _host, + _rank, + count(*) AS calls, + avg(duration_ms) AS avg_ms, + max(duration_ms) AS max_ms + FROM global.python.comm_collective + WHERE global_step >= ( + SELECT max(global_step) - {step_window} + FROM global.python.comm_collective + ) + GROUP BY _host, _rank + ORDER BY avg_ms DESC + on_empty: skip + + variables: + table_comm: "{comm_table}" + + interpretation: + rules: + - id: chronic_straggler + when: "step:persistent_offenders | rows >= 1" + severity: warning + message: "存在 worst_fraction ≥ 阈值的 rank — 长期 straggler,优先查对应节点" + + - id: high_worst_fraction + when: "step:worst_fraction | column:worst_fraction | max > 0.5" + severity: warning + message: "有 rank 在超过一半 step 上是最慢 — 强烈怀疑节点/网络/数据问题" + + - id: single_dominant + when: "step:worst_fraction | rows >= 2 | top(row).worst_fraction > 2 * median(worst_fraction)" + severity: info + message: "worst_fraction 头部 rank 明显突出 — 见 persistent_offenders 表" + + summary_template: | + ## 长期 straggler + - **worst_fraction**: 每个 rank 在多少比例的 step 上是最慢 + - **persistent_offenders**: 超过 `{worst_fraction_threshold}` 阈值的 rank + - **recent_step_lag**: 最近 step 的单次 lag(偶发 vs 长期对照) + - **rank_latency_context**: 窗口内平均 collective 延迟 + + next_steps: + - "对应节点 GPU/显存 → skill: gpu_pressure" + - "NCCL wait 分解 → skill: nccl_culprit_victim" + - "模块热点 → 在慢 rank inject 后 skill: module_bottleneck" + - "整 job 变慢趋势 → skill: job_health" diff --git a/skills/semantic/intents.yaml b/skills/semantic/intents.yaml index 1944284d..fb01be3d 100644 --- a/skills/semantic/intents.yaml +++ b/skills/semantic/intents.yaml @@ -5,8 +5,18 @@ kind: IntentCatalog intents: health_check: label: "健康检查 / 不知道从哪查" - keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup] - skills: [health_overview] + keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup, job health, 作业健康] + skills: [health_overview, job_health] + + job_slowdown: + label: "整 job 变慢 / slowdown" + keywords: [job 慢, 整体变慢, slowdown, job health, 作业健康, step 落后, 变慢趋势] + skills: [job_health, persistent_straggler, slow_rank, comm_bottleneck] + + persistent_straggler: + label: "长期 straggler / worst_fraction" + keywords: [worst_fraction, 长期慢, 一直慢, persistent straggler, 总是最慢, chronic] + skills: [persistent_straggler, slow_rank, job_health, nccl_culprit_victim] training_hung: label: "训练卡住 / 无进展" @@ -15,13 +25,13 @@ intents: training_slow: label: "训练变慢 / 瓶颈" - keywords: [慢, slow, bottleneck, 瓶颈, 变慢, hotspot, 热点, 耗时] - skills: [module_bottleneck, slow_rank, comm_bottleneck] + keywords: [慢, slow, bottleneck, 瓶颈, 变慢, hotspot, 热点, 耗时, slowdown, job 慢] + skills: [job_health, module_bottleneck, slow_rank, persistent_straggler, comm_bottleneck] which_rank: label: "慢 rank / straggler" - keywords: [straggler, 慢 rank, 拖后腿, rank 慢, lagging rank, 哪个 rank] - skills: [slow_rank, nccl_culprit_victim, comm_bottleneck] + keywords: [straggler, 慢 rank, 拖后腿, rank 慢, lagging rank, 哪个 rank, worst_fraction, 长期慢] + skills: [persistent_straggler, slow_rank, nccl_culprit_victim, comm_bottleneck] memory_growing: label: "显存上涨 / OOM" @@ -41,4 +51,4 @@ intents: cluster_view: label: "集群 / 多机训练" keywords: [集群, 多机, 分布式, cluster, multi-node, 跨节点, 所有 rank, all ranks, fan-out] - skills: [slow_rank, comm_bottleneck, health_overview] + skills: [job_health, slow_rank, persistent_straggler, comm_bottleneck, health_overview] diff --git a/skills/semantic/pages.yaml b/skills/semantic/pages.yaml index 397c278b..0b412ccf 100644 --- a/skills/semantic/pages.yaml +++ b/skills/semantic/pages.yaml @@ -13,13 +13,13 @@ pages: title: Investigate path: /agent description: "Skill-driven investigation; optional LLM diagnostic agent summarizes SQL evidence." - skills: [health_overview] + skills: [health_overview, job_health] cluster: title: Cluster path: /cluster description: "Distributed training cluster nodes and rank status." - skills: [slow_rank, comm_bottleneck] + skills: [slow_rank, comm_bottleneck, job_health, persistent_straggler] stacks: title: Stacks @@ -49,7 +49,7 @@ pages: title: Analytics path: /analytics description: "Ad-hoc SQL analytics and time-series charts." - skills: [health_overview, comm_bottleneck, slow_rank] + skills: [health_overview, job_health, comm_bottleneck, slow_rank, persistent_straggler] spans: title: Spans @@ -61,7 +61,7 @@ pages: title: Training path: /training description: "Training step metrics and collective communication latency." - skills: [slow_rank, comm_bottleneck, module_bottleneck] + skills: [job_health, slow_rank, persistent_straggler, comm_bottleneck, module_bottleneck] pulsing: title: Pulsing diff --git a/skills/slow_rank/steps.yaml b/skills/slow_rank/steps.yaml index 7d5fabc1..eb6f3b48 100644 --- a/skills/slow_rank/steps.yaml +++ b/skills/slow_rank/steps.yaml @@ -183,3 +183,4 @@ spec: - "栈卡在 collective → skill: training_hang" - "模块级热点 → skill: module_bottleneck (在慢 rank 上 inject)" - "有 nccl.proxy_ops → skill: nccl_culprit_victim (culprit/victim 归因)" + - "长期最慢 rank (worst_fraction) → skill: persistent_straggler --global" diff --git a/tests/regression/core/test_table_docs_integration.py b/tests/regression/core/test_table_docs_integration.py index 2a82e94b..e06f3bba 100644 --- a/tests/regression/core/test_table_docs_integration.py +++ b/tests/regression/core/test_table_docs_integration.py @@ -8,8 +8,6 @@ import sys import tempfile -import probing - def _python_path_env(*, defer_engine_init: bool = False) -> dict[str, str]: env = os.environ.copy() @@ -141,33 +139,50 @@ class Metrics: assert "OK" in result.stdout -def test_describe_builtin_hccl_via_query(): - df = probing.query("DESCRIBE probe.probing.column_docs") - assert "comment" in df.columns - assert "table_comment" in df.columns - assert "column_name" in df.columns - assert "description" in df["column_name"].tolist() +def test_describe_builtin_hccl_via_query_subprocess(): + """DESCRIBE rewrite on static catalog — isolated process (wheel/Linux + torch safe).""" + result = _run_fresh_probing_script( + """ +import probing +df = probing.query("DESCRIBE probe.probing.column_docs") +assert "comment" in df.columns +assert "table_comment" in df.columns +assert "column_name" in df.columns +assert "description" in df["column_name"].tolist() +print("OK") +""" + ) + assert result.returncode == 0, result.stdout + result.stderr + assert "OK" in result.stdout -def test_hccl_catalog_and_select_roundtrip(): +def test_hccl_catalog_and_select_roundtrip_subprocess(): """Builtin HCCL docs are queryable; YAML synonyms remain on table_docs.""" - col = probing.query( - "SELECT description FROM probe.probing.column_docs " - "WHERE table_schema = 'hccl' AND table_name = 'tasks' " - "AND column_name = 'local_rank'" - ) - assert len(col) == 1 - assert "rank" in str(col["description"].iloc[0]).lower() + result = _run_fresh_probing_script( + """ +import probing +col = probing.query( + "SELECT description FROM probe.probing.column_docs " + "WHERE table_schema = 'hccl' AND table_name = 'tasks' " + "AND column_name = 'local_rank'" +) +assert len(col) == 1 +assert "rank" in str(col["description"].iloc[0]).lower() - meta = probing.query( - "SELECT description, synonyms FROM probe.probing.table_docs " - "WHERE table_schema = 'nccl' AND table_name = 'proxy_ops'" - ) - assert len(meta) == 1 - assert "culprit" in str(meta["description"].iloc[0]).lower() or "NCCL" in str( - meta["description"].iloc[0] +meta = probing.query( + "SELECT description, synonyms FROM probe.probing.table_docs " + "WHERE table_schema = 'nccl' AND table_name = 'proxy_ops'" +) +assert len(meta) == 1 +assert "culprit" in str(meta["description"].iloc[0]).lower() or "NCCL" in str( + meta["description"].iloc[0] +) +assert "proxy" in str(meta["synonyms"].iloc[0]).lower() +print("OK") +""" ) - assert "proxy" in str(meta["synonyms"].iloc[0]).lower() + assert result.returncode == 0, result.stdout + result.stderr + assert "OK" in result.stdout def test_describe_json_shape_subprocess(): diff --git a/tests/regression/rust/Cargo.toml b/tests/regression/rust/Cargo.toml index 3d13dd66..49916885 100644 --- a/tests/regression/rust/Cargo.toml +++ b/tests/regression/rust/Cargo.toml @@ -77,6 +77,10 @@ path = "probing/server/auth_complex_tests.rs" name = "server_file_api_complex" path = "probing/server/file_api_complex_tests.rs" +[[test]] +name = "server_hierarchical_fanout_query" +path = "probing/server/hierarchical_fanout_query.rs" + [[test]] name = "memtable_chaos_stress" path = "probing/memtable/chaos_stress.rs" diff --git a/tests/regression/rust/probing/server/hierarchical_fanout_query.rs b/tests/regression/rust/probing/server/hierarchical_fanout_query.rs new file mode 100644 index 00000000..52e9568f --- /dev/null +++ b/tests/regression/rust/probing/server/hierarchical_fanout_query.rs @@ -0,0 +1,389 @@ +//! Hierarchical cluster query fan-out integration test (mock HTTP peers + real engine). + +use std::sync::{LazyLock, Mutex}; + +use axum::{extract::State, http::StatusCode, routing::post, Json, Router}; +use probing_core::core::cluster::{reset_cluster_for_tests, set_local_listen_addrs, update_node}; +use probing_proto::prelude::{DataFrame, Message, Node, QueryDataFormat, Seq}; +use probing_server::initialize_engine; +use probing_server::server::cluster_fanout::{ + fanout_query, ClusterFanoutScope, FanoutMeta, FanoutQueryResponse, +}; +use probing_server::server::cluster_query::ClusterQueryRequest; +use probing_server::server::SERVER_RUNTIME; +use tokio::net::TcpListener; + +static ENV_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); + +#[derive(Clone)] +struct QueryState { + rank: i32, +} + +#[derive(Clone)] +struct NodeAggState { + meta: FanoutMeta, + rank: i32, +} + +fn test_node(rank: i32, group_rank: i32, local_rank: i32, addr: &str) -> Node { + Node { + host: "127.0.0.1".into(), + addr: addr.into(), + rank: Some(rank), + group_rank: Some(group_rank), + local_rank: Some(local_rank), + world_size: Some(4), + group_world_size: Some(2), + status: Some("running".into()), + ..Default::default() + } +} + +fn rank_dataframe(rank: i32) -> DataFrame { + DataFrame { + names: vec!["rank".into()], + cols: vec![Seq::SeqI32(vec![rank])], + size: 1, + } +} + +fn query_message(rank: i32) -> String { + serde_json::to_string(&Message::new(QueryDataFormat::DataFrame(rank_dataframe( + rank, + )))) + .expect("serialize query response") +} + +async fn query_handler(State(state): State, body: String) -> (StatusCode, String) { + assert!( + body.contains("SELECT"), + "expected SQL query body, got: {body}" + ); + (StatusCode::OK, query_message(state.rank)) +} + +async fn node_aggregate_handler( + State(state): State, + Json(body): Json, +) -> Json { + assert!(body.cluster, "node aggregate expects cluster=true"); + assert!(body.hierarchical); + assert_eq!(body.scope, ClusterFanoutScope::Node); + Json(FanoutQueryResponse { + dataframe: rank_dataframe(state.rank), + meta: state.meta.clone(), + }) +} + +async fn spawn_query_server(rank: i32) -> String { + let app = Router::new() + .route("/query", post(query_handler)) + .with_state(QueryState { rank }); + bind_http(app).await +} + +async fn spawn_node_aggregate_server(rank: i32, meta: FanoutMeta) -> String { + let app = Router::new() + .route("/apis/cluster/query", post(node_aggregate_handler)) + .with_state(NodeAggState { rank, meta }); + bind_http(app).await +} + +async fn bind_http(app: Router) -> String { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + tokio::spawn(async move { + axum::serve(listener, app).await.unwrap(); + }); + format!("{addr}") +} + +fn install_cluster( + coordinator_addr: &str, + leaf_addr: &str, + node1_local0_addr: &str, + node1_leaf_addr: &str, +) { + reset_cluster_for_tests(); + set_local_listen_addrs(vec![coordinator_addr.into()]); + for node in [ + test_node(0, 0, 0, coordinator_addr), + test_node(1, 0, 1, leaf_addr), + test_node(2, 1, 0, node1_local0_addr), + test_node(3, 1, 1, node1_leaf_addr), + ] { + update_node(node); + } +} + +fn install_cluster_without_hierarchical_metadata(coordinator_addr: &str, peer_addrs: &[&str]) { + reset_cluster_for_tests(); + set_local_listen_addrs(vec![coordinator_addr.into()]); + for (rank, addr) in peer_addrs.iter().enumerate() { + update_node(Node { + host: "127.0.0.1".into(), + addr: (*addr).into(), + rank: Some(rank as i32), + world_size: Some(peer_addrs.len() as i32), + status: Some("running".into()), + ..Default::default() + }); + } +} + +async fn run_hierarchical_fanout() -> FanoutQueryResponse { + fanout_query("SELECT 1 AS n", true, true, ClusterFanoutScope::Auto) + .await + .expect("hierarchical fanout") +} + +fn set_coordinator_env() { + std::env::set_var("RANK", "0"); + std::env::set_var("LOCAL_RANK", "0"); + std::env::set_var("GROUP_RANK", "0"); + std::env::set_var("PROBING_CLUSTER_FANOUT_HIERARCHICAL", "1"); +} + +fn clear_rank_env() { + for key in [ + "RANK", + "LOCAL_RANK", + "GROUP_RANK", + "PROBING_CLUSTER_FANOUT_HIERARCHICAL", + ] { + std::env::remove_var(key); + } +} + +#[test] +fn hierarchical_fanout_contacts_node_aggregators_not_every_rank() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_rank_env(); + + SERVER_RUNTIME.block_on(async { + initialize_engine() + .await + .expect("initialize probing engine"); + + let leaf_addr = spawn_query_server(1).await; + let node1_local0 = spawn_node_aggregate_server( + 2, + FanoutMeta { + cluster: true, + hierarchical: true, + scope: "node".into(), + nodes_queried: 2, + nodes_failed: Vec::new(), + node_aggregators_queried: 0, + local_ranks_queried: 1, + }, + ) + .await; + let node1_leaf = spawn_query_server(3).await; + + let coordinator_addr = "127.0.0.1:59999"; + install_cluster(coordinator_addr, &leaf_addr, &node1_local0, &node1_leaf); + set_coordinator_env(); + + let result = fanout_query("SELECT 1 AS n", true, true, ClusterFanoutScope::Auto) + .await + .expect("hierarchical fanout"); + + assert!(result.meta.hierarchical); + assert_eq!(result.meta.scope, "coordinator"); + assert_eq!(result.meta.node_aggregators_queried, 1); + assert_eq!(result.meta.local_ranks_queried, 1); + assert_eq!(result.meta.nodes_queried, 3); + assert!( + result.meta.nodes_failed.is_empty(), + "unexpected failures: {:?}", + result.meta.nodes_failed + ); + }); + + clear_rank_env(); +} + +#[test] +fn flat_fanout_contacts_all_remote_peers() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_rank_env(); + + SERVER_RUNTIME.block_on(async { + initialize_engine() + .await + .expect("initialize probing engine"); + + let leaf_addr = spawn_query_server(1).await; + let node1_local0 = spawn_query_server(2).await; + let node1_leaf = spawn_query_server(3).await; + + let coordinator_addr = "127.0.0.1:59998"; + install_cluster(coordinator_addr, &leaf_addr, &node1_local0, &node1_leaf); + set_coordinator_env(); + std::env::set_var("PROBING_CLUSTER_FANOUT_HIERARCHICAL", "0"); + + let result = fanout_query("SELECT 1 AS n", true, false, ClusterFanoutScope::Auto) + .await + .expect("flat fanout"); + + assert!(!result.meta.hierarchical); + assert_eq!(result.meta.scope, "flat"); + assert_eq!(result.meta.node_aggregators_queried, 0); + assert_eq!(result.meta.local_ranks_queried, 0); + // local coordinator + 3 remote peers + assert_eq!(result.meta.nodes_queried, 4); + assert!(result.meta.nodes_failed.is_empty()); + }); + + clear_rank_env(); +} + +#[test] +fn hierarchical_fanout_degrades_to_flat_without_metadata() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_rank_env(); + + SERVER_RUNTIME.block_on(async { + initialize_engine() + .await + .expect("initialize probing engine"); + + let peer1 = spawn_query_server(1).await; + let peer2 = spawn_query_server(2).await; + let peer3 = spawn_query_server(3).await; + + let coordinator_addr = "127.0.0.1:59997"; + install_cluster_without_hierarchical_metadata( + coordinator_addr, + &[coordinator_addr, &peer1, &peer2, &peer3], + ); + set_coordinator_env(); + + let result = run_hierarchical_fanout().await; + + assert!( + !result.meta.hierarchical, + "missing group_rank/local_rank should fall back to flat fan-out" + ); + assert_eq!(result.meta.scope, "flat"); + assert_eq!(result.meta.node_aggregators_queried, 0); + assert_eq!(result.meta.local_ranks_queried, 0); + assert_eq!(result.meta.nodes_queried, 4); + assert!(result.meta.nodes_failed.is_empty()); + }); + + clear_rank_env(); +} + +#[test] +fn hierarchical_fanout_reports_failed_remote_node_aggregator() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_rank_env(); + + SERVER_RUNTIME.block_on(async { + initialize_engine() + .await + .expect("initialize probing engine"); + + let leaf_addr = spawn_query_server(1).await; + let dead_node_agg = "127.0.0.1:1"; + let node1_leaf = spawn_query_server(3).await; + + let coordinator_addr = "127.0.0.1:59996"; + install_cluster(coordinator_addr, &leaf_addr, dead_node_agg, &node1_leaf); + set_coordinator_env(); + + let result = run_hierarchical_fanout().await; + + assert!(result.meta.hierarchical); + assert_eq!(result.meta.scope, "coordinator"); + assert_eq!(result.meta.node_aggregators_queried, 1); + assert_eq!(result.meta.local_ranks_queried, 1); + assert_eq!(result.meta.nodes_queried, 2, "local0 + local leaf only"); + assert_eq!(result.meta.nodes_failed, vec![dead_node_agg.to_string()]); + }); + + clear_rank_env(); +} + +#[test] +fn hierarchical_fanout_reports_failed_local_leaf() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_rank_env(); + + SERVER_RUNTIME.block_on(async { + initialize_engine() + .await + .expect("initialize probing engine"); + + let dead_leaf = "127.0.0.1:2"; + let node1_local0 = spawn_node_aggregate_server( + 2, + FanoutMeta { + cluster: true, + hierarchical: true, + scope: "node".into(), + nodes_queried: 2, + nodes_failed: Vec::new(), + node_aggregators_queried: 0, + local_ranks_queried: 1, + }, + ) + .await; + let node1_leaf = spawn_query_server(3).await; + + let coordinator_addr = "127.0.0.1:59995"; + install_cluster(coordinator_addr, dead_leaf, &node1_local0, &node1_leaf); + set_coordinator_env(); + + let result = run_hierarchical_fanout().await; + + assert!(result.meta.hierarchical); + assert_eq!(result.meta.scope, "coordinator"); + assert_eq!(result.meta.node_aggregators_queried, 1); + assert_eq!(result.meta.local_ranks_queried, 1); + assert_eq!(result.meta.nodes_queried, 2, "local0 + remote node agg"); + assert_eq!(result.meta.nodes_failed, vec![dead_leaf.to_string()]); + }); + + clear_rank_env(); +} + +#[test] +fn hierarchical_fanout_leaf_rank_stays_local_only() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_rank_env(); + + SERVER_RUNTIME.block_on(async { + initialize_engine() + .await + .expect("initialize probing engine"); + + let leaf_addr = spawn_query_server(1).await; + let node1_local0 = spawn_query_server(2).await; + let node1_leaf = spawn_query_server(3).await; + + let coordinator_addr = "127.0.0.1:59994"; + install_cluster(coordinator_addr, &leaf_addr, &node1_local0, &node1_leaf); + std::env::set_var("RANK", "1"); + std::env::set_var("LOCAL_RANK", "1"); + std::env::set_var("GROUP_RANK", "0"); + std::env::set_var("PROBING_CLUSTER_FANOUT_HIERARCHICAL", "1"); + set_local_listen_addrs(vec![leaf_addr.clone()]); + + let result = fanout_query("SELECT 1 AS n", true, true, ClusterFanoutScope::Auto) + .await + .expect("leaf rank fanout"); + + assert!(result.meta.hierarchical); + assert_eq!(result.meta.scope, "local"); + assert_eq!(result.meta.nodes_queried, 1); + assert_eq!(result.meta.node_aggregators_queried, 0); + assert_eq!(result.meta.local_ranks_queried, 0); + assert!(result.meta.nodes_failed.is_empty()); + }); + + clear_rank_env(); +} diff --git a/tests/regression/rust/probing/server/training_observability_tests.rs b/tests/regression/rust/probing/server/training_observability_tests.rs index 51c84aaa..5e5e12fa 100644 --- a/tests/regression/rust/probing/server/training_observability_tests.rs +++ b/tests/regression/rust/probing/server/training_observability_tests.rs @@ -43,14 +43,19 @@ fn step_matrix_response_fields_serializable() { #[test] fn cluster_query_request_roundtrip() { + use probing_server::server::cluster_fanout::ClusterFanoutScope; use probing_server::server::cluster_query::ClusterQueryRequest; let req = ClusterQueryRequest { expr: "SELECT 1".into(), cluster: true, + hierarchical: true, + scope: ClusterFanoutScope::Auto, }; let body = serde_json::to_string(&req).unwrap(); let back: ClusterQueryRequest = serde_json::from_str(&body).unwrap(); assert!(back.cluster); + assert!(back.hierarchical); assert_eq!(back.expr, "SELECT 1"); + assert_eq!(back.scope, ClusterFanoutScope::Auto); } diff --git a/tests/regression/skills/test_install_tools.py b/tests/regression/skills/test_install_tools.py index d916adcf..e00cec54 100644 --- a/tests/regression/skills/test_install_tools.py +++ b/tests/regression/skills/test_install_tools.py @@ -41,9 +41,12 @@ def test_skill_roots_include_bundled(): assert "bundled" in labels or "repo" in labels -def test_merged_catalog_has_nine_skills(): +def test_merged_catalog_has_eleven_skills(): catalog = load_catalog() - assert len(catalog.skills) == 9 + assert len(catalog.skills) == 11 + ids = {e.id for e in catalog.skills} + assert "job_health" in ids + assert "persistent_straggler" in ids def test_list_skills_tool(): @@ -59,6 +62,23 @@ def test_plan_skill_run(): assert "probing" in plan.cli_command +def test_plan_job_health_skill(): + plan = plan_skill_run("job_health", {"use_global": True}) + assert plan.skill_id == "job_health" + assert any(s["id"] == "job_slowdown_proxy" for s in plan.steps) + assert any( + "global.python.comm_collective" in (s.get("sql") or "") for s in plan.steps + ) + + +def test_plan_persistent_straggler_skill(): + plan = plan_skill_run("persistent_straggler", {"step_window": 100}) + assert plan.skill_id == "persistent_straggler" + worst = next(s for s in plan.steps if s["id"] == "worst_fraction") + assert "worst_fraction" in worst["sql"] + assert "100" in worst["sql"] + + def test_run_skill_plan_only(): result = run_skill("health_overview", execute=False) assert result["status"] == "plan" diff --git a/tests/unit/probing/skills/test_loader.py b/tests/unit/probing/skills/test_loader.py index ffc58ef9..1ac0f563 100644 --- a/tests/unit/probing/skills/test_loader.py +++ b/tests/unit/probing/skills/test_loader.py @@ -26,14 +26,24 @@ def test_skills_root_exists(): assert root.is_dir() -def test_catalog_loads_nine_skills(): +def test_catalog_loads_all_skills(): catalog = load_catalog() - assert len(catalog.skills) == 9 + expected_ids = { + "health_overview", + "job_health", + "crash_triage", + "training_hang", + "slow_rank", + "persistent_straggler", + "memory_leak", + "module_bottleneck", + "comm_bottleneck", + "gpu_pressure", + "nccl_culprit_victim", + } ids = {p.id for p in catalog.skills} - assert "crash_triage" in ids - assert "slow_rank" in ids - assert "nccl_culprit_victim" in ids - assert "health_overview" in ids + assert ids == expected_ids + assert len(catalog.skills) == len(expected_ids) def test_load_slow_rank_global(): diff --git a/uv.lock b/uv.lock deleted file mode 100644 index 25308c84..00000000 --- a/uv.lock +++ /dev/null @@ -1,1307 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.7" -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", - "python_full_version == '3.8.*'", - "python_full_version < '3.8'", -] - -[[package]] -name = "black" -version = "23.3.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -dependencies = [ - { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "mypy-extensions", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "pathspec", version = "0.11.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "platformdirs", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "typed-ast", marker = "python_full_version < '3.8' and implementation_name == 'cpython'" }, - { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d6/36/66370f5017b100225ec4950a60caeef60201a10080da57ddb24124453fba/black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940", size = 582156, upload-time = "2023-03-29T01:00:54.457Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/f4/7908f71cc71da08df1317a3619f002cbf91927fb5d3ffc7723905a2113f7/black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915", size = 1342273, upload-time = "2023-03-29T01:19:03.787Z" }, - { url = "https://files.pythonhosted.org/packages/27/70/07aab2623cfd3789786f17e051487a41d5657258c7b1ef8f780512ffea9c/black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9", size = 2676721, upload-time = "2023-03-29T01:25:23.459Z" }, - { url = "https://files.pythonhosted.org/packages/29/b1/b584fc863c155653963039664a592b3327b002405043b7e761b9b0212337/black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2", size = 1520336, upload-time = "2023-03-29T01:28:32.973Z" }, - { url = "https://files.pythonhosted.org/packages/6d/b4/0f13ab7f5e364795ff82b76b0f9a4c9c50afda6f1e2feeb8b03fdd7ec57d/black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c", size = 1654611, upload-time = "2023-03-29T01:11:12.718Z" }, - { url = "https://files.pythonhosted.org/packages/de/b4/76f152c5eb0be5471c22cd18380d31d188930377a1a57969073b89d6615d/black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c", size = 1286657, upload-time = "2023-03-29T01:15:20.317Z" }, - { url = "https://files.pythonhosted.org/packages/d7/6f/d3832960a3b646b333b7f0d80d336a3c123012e9d9d5dba4a622b2b6181d/black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6", size = 1326112, upload-time = "2023-03-29T01:19:05.794Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a5/17b40bfd9b607b69fa726b0b3a473d14b093dcd5191ea1a1dd664eccfee3/black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b", size = 2643808, upload-time = "2023-03-29T01:25:27.825Z" }, - { url = "https://files.pythonhosted.org/packages/69/49/7e1f0cf585b0d607aad3f971f95982cc4208fc77f92363d632d23021ee57/black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d", size = 1503287, upload-time = "2023-03-29T01:28:35.228Z" }, - { url = "https://files.pythonhosted.org/packages/c0/53/42e312c17cfda5c8fc4b6b396a508218807a3fcbb963b318e49d3ddd11d5/black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70", size = 1638625, upload-time = "2023-03-29T01:11:16.193Z" }, - { url = "https://files.pythonhosted.org/packages/3f/0d/81dd4194ce7057c199d4f28e4c2a885082d9d929e7a55c514b23784f7787/black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326", size = 1293585, upload-time = "2023-03-29T01:15:22.935Z" }, - { url = "https://files.pythonhosted.org/packages/24/eb/2d2d2c27cb64cfd073896f62a952a802cd83cf943a692a2f278525b57ca9/black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b", size = 1447428, upload-time = "2023-03-29T01:28:37.49Z" }, - { url = "https://files.pythonhosted.org/packages/49/36/15d2122f90ff1cd70f06892ebda777b650218cf84b56b5916a993dc1359a/black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2", size = 1576467, upload-time = "2023-03-29T01:11:18.293Z" }, - { url = "https://files.pythonhosted.org/packages/ca/44/eb41edd3f558a6139f09eee052dead4a7a464e563b822ddf236f5a8ee286/black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925", size = 1226437, upload-time = "2023-03-29T01:15:24.92Z" }, - { url = "https://files.pythonhosted.org/packages/ce/f4/2b0c6ac9e1f8584296747f66dd511898b4ebd51d6510dba118279bff53b6/black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27", size = 1331955, upload-time = "2023-03-29T01:19:07.695Z" }, - { url = "https://files.pythonhosted.org/packages/21/14/d5a2bec5fb15f9118baab7123d344646fac0b1c6939d51c2b05259cd2d9c/black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331", size = 2658520, upload-time = "2023-03-29T01:25:30.535Z" }, - { url = "https://files.pythonhosted.org/packages/13/0a/ed8b66c299e896780e4528eed4018f5b084da3b9ba4ee48328550567d866/black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5", size = 1509852, upload-time = "2023-03-29T01:28:39.106Z" }, - { url = "https://files.pythonhosted.org/packages/12/4b/99c71d1cf1353edd5aff2700b8960f92e9b805c9dab72639b67dbb449d3a/black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961", size = 1641852, upload-time = "2023-03-29T01:11:20.065Z" }, - { url = "https://files.pythonhosted.org/packages/d1/6e/5810b6992ed70403124c67e8b3f62858a32b35405177553f1a78ed6b6e31/black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8", size = 1297694, upload-time = "2023-03-29T01:15:26.919Z" }, - { url = "https://files.pythonhosted.org/packages/13/25/cfa06788d0a936f2445af88f13604b5bcd5c9d050db618c718e6ebe66f74/black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30", size = 1341089, upload-time = "2023-03-29T01:19:09.503Z" }, - { url = "https://files.pythonhosted.org/packages/fd/5b/fc2d7922c1a6bb49458d424b5be71d251f2d0dc97be9534e35d171bdc653/black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3", size = 2674699, upload-time = "2023-03-29T01:25:32.853Z" }, - { url = "https://files.pythonhosted.org/packages/49/d7/f3b7da6c772800f5375aeb050a3dcf682f0bbeb41d313c9c2820d0156e4e/black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266", size = 1519946, upload-time = "2023-03-29T01:28:40.746Z" }, - { url = "https://files.pythonhosted.org/packages/3c/d7/85f3d79f9e543402de2244c4d117793f262149e404ea0168841613c33e07/black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab", size = 1654176, upload-time = "2023-03-29T01:11:21.715Z" }, - { url = "https://files.pythonhosted.org/packages/06/1e/273d610249f0335afb1ddb03664a03223f4826e3d1a95170a0142cb19fb4/black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb", size = 1286299, upload-time = "2023-03-29T01:15:28.898Z" }, - { url = "https://files.pythonhosted.org/packages/ad/e7/4642b7f462381799393fbad894ba4b32db00870a797f0616c197b07129a9/black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4", size = 180965, upload-time = "2023-03-29T01:00:52.253Z" }, -] - -[[package]] -name = "black" -version = "24.8.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.8.*'", -] -dependencies = [ - { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "mypy-extensions", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "pathspec", version = "0.12.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/04/b0/46fb0d4e00372f4a86a6f8efa3cb193c9f64863615e39010b1477e010578/black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f", size = 644810, upload-time = "2024-08-02T17:43:18.405Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/6e/74e29edf1fba3887ed7066930a87f698ffdcd52c5dbc263eabb06061672d/black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6", size = 1632092, upload-time = "2024-08-02T17:47:26.911Z" }, - { url = "https://files.pythonhosted.org/packages/ab/49/575cb6c3faee690b05c9d11ee2e8dba8fbd6d6c134496e644c1feb1b47da/black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb", size = 1457529, upload-time = "2024-08-02T17:47:29.109Z" }, - { url = "https://files.pythonhosted.org/packages/7a/b4/d34099e95c437b53d01c4aa37cf93944b233066eb034ccf7897fa4e5f286/black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42", size = 1757443, upload-time = "2024-08-02T17:46:20.306Z" }, - { url = "https://files.pythonhosted.org/packages/87/a0/6d2e4175ef364b8c4b64f8441ba041ed65c63ea1db2720d61494ac711c15/black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a", size = 1418012, upload-time = "2024-08-02T17:47:20.33Z" }, - { url = "https://files.pythonhosted.org/packages/08/a6/0a3aa89de9c283556146dc6dbda20cd63a9c94160a6fbdebaf0918e4a3e1/black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1", size = 1615080, upload-time = "2024-08-02T17:48:05.467Z" }, - { url = "https://files.pythonhosted.org/packages/db/94/b803d810e14588bb297e565821a947c108390a079e21dbdcb9ab6956cd7a/black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af", size = 1438143, upload-time = "2024-08-02T17:47:30.247Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b5/f485e1bbe31f768e2e5210f52ea3f432256201289fd1a3c0afda693776b0/black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4", size = 1738774, upload-time = "2024-08-02T17:46:17.837Z" }, - { url = "https://files.pythonhosted.org/packages/a8/69/a000fc3736f89d1bdc7f4a879f8aaf516fb03613bb51a0154070383d95d9/black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af", size = 1427503, upload-time = "2024-08-02T17:46:22.654Z" }, - { url = "https://files.pythonhosted.org/packages/a2/a8/05fb14195cfef32b7c8d4585a44b7499c2a4b205e1662c427b941ed87054/black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368", size = 1646132, upload-time = "2024-08-02T17:49:52.843Z" }, - { url = "https://files.pythonhosted.org/packages/41/77/8d9ce42673e5cb9988f6df73c1c5c1d4e9e788053cccd7f5fb14ef100982/black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed", size = 1448665, upload-time = "2024-08-02T17:47:54.479Z" }, - { url = "https://files.pythonhosted.org/packages/cc/94/eff1ddad2ce1d3cc26c162b3693043c6b6b575f538f602f26fe846dfdc75/black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018", size = 1762458, upload-time = "2024-08-02T17:46:19.384Z" }, - { url = "https://files.pythonhosted.org/packages/28/ea/18b8d86a9ca19a6942e4e16759b2fa5fc02bbc0eb33c1b866fcd387640ab/black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2", size = 1436109, upload-time = "2024-08-02T17:46:52.97Z" }, - { url = "https://files.pythonhosted.org/packages/9f/d4/ae03761ddecc1a37d7e743b89cccbcf3317479ff4b88cfd8818079f890d0/black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd", size = 1617322, upload-time = "2024-08-02T17:51:20.203Z" }, - { url = "https://files.pythonhosted.org/packages/14/4b/4dfe67eed7f9b1ddca2ec8e4418ea74f0d1dc84d36ea874d618ffa1af7d4/black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2", size = 1442108, upload-time = "2024-08-02T17:50:40.824Z" }, - { url = "https://files.pythonhosted.org/packages/97/14/95b3f91f857034686cae0e73006b8391d76a8142d339b42970eaaf0416ea/black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e", size = 1745786, upload-time = "2024-08-02T17:46:02.939Z" }, - { url = "https://files.pythonhosted.org/packages/95/54/68b8883c8aa258a6dde958cd5bdfada8382bec47c5162f4a01e66d839af1/black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920", size = 1426754, upload-time = "2024-08-02T17:46:38.603Z" }, - { url = "https://files.pythonhosted.org/packages/13/b2/b3f24fdbb46f0e7ef6238e131f13572ee8279b70f237f221dd168a9dba1a/black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c", size = 1631706, upload-time = "2024-08-02T17:49:57.606Z" }, - { url = "https://files.pythonhosted.org/packages/d9/35/31010981e4a05202a84a3116423970fd1a59d2eda4ac0b3570fbb7029ddc/black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e", size = 1457429, upload-time = "2024-08-02T17:49:12.764Z" }, - { url = "https://files.pythonhosted.org/packages/27/25/3f706b4f044dd569a20a4835c3b733dedea38d83d2ee0beb8178a6d44945/black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47", size = 1756488, upload-time = "2024-08-02T17:46:08.067Z" }, - { url = "https://files.pythonhosted.org/packages/63/72/79375cd8277cbf1c5670914e6bd4c1b15dea2c8f8e906dc21c448d0535f0/black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb", size = 1417721, upload-time = "2024-08-02T17:46:42.637Z" }, - { url = "https://files.pythonhosted.org/packages/27/1e/83fa8a787180e1632c3d831f7e58994d7aaf23a0961320d21e84f922f919/black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed", size = 206504, upload-time = "2024-08-02T17:43:15.747Z" }, -] - -[[package]] -name = "black" -version = "25.11.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.9.*'", -] -dependencies = [ - { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "mypy-extensions", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "pathspec", version = "1.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "pytokens", marker = "python_full_version == '3.9.*'" }, - { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", size = 655669, upload-time = "2025-11-10T01:53:50.558Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/d2/6caccbc96f9311e8ec3378c296d4f4809429c43a6cd2394e3c390e86816d/black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", size = 1743501, upload-time = "2025-11-10T01:59:06.202Z" }, - { url = "https://files.pythonhosted.org/packages/69/35/b986d57828b3f3dccbf922e2864223197ba32e74c5004264b1c62bc9f04d/black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", size = 1597308, upload-time = "2025-11-10T01:57:58.633Z" }, - { url = "https://files.pythonhosted.org/packages/39/8e/8b58ef4b37073f52b64a7b2dd8c9a96c84f45d6f47d878d0aa557e9a2d35/black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", size = 1656194, upload-time = "2025-11-10T01:57:10.909Z" }, - { url = "https://files.pythonhosted.org/packages/8d/30/9c2267a7955ecc545306534ab88923769a979ac20a27cf618d370091e5dd/black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03", size = 1347996, upload-time = "2025-11-10T01:57:22.391Z" }, - { url = "https://files.pythonhosted.org/packages/c4/62/d304786b75ab0c530b833a89ce7d997924579fb7484ecd9266394903e394/black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", size = 1727891, upload-time = "2025-11-10T02:01:40.507Z" }, - { url = "https://files.pythonhosted.org/packages/82/5d/ffe8a006aa522c9e3f430e7b93568a7b2163f4b3f16e8feb6d8c3552761a/black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", size = 1581875, upload-time = "2025-11-10T01:57:51.192Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c8/7c8bda3108d0bb57387ac41b4abb5c08782b26da9f9c4421ef6694dac01a/black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", size = 1642716, upload-time = "2025-11-10T01:56:51.589Z" }, - { url = "https://files.pythonhosted.org/packages/34/b9/f17dea34eecb7cc2609a89627d480fb6caea7b86190708eaa7eb15ed25e7/black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", size = 1352904, upload-time = "2025-11-10T01:59:26.252Z" }, - { url = "https://files.pythonhosted.org/packages/7f/12/5c35e600b515f35ffd737da7febdb2ab66bb8c24d88560d5e3ef3d28c3fd/black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", size = 1772831, upload-time = "2025-11-10T02:03:47Z" }, - { url = "https://files.pythonhosted.org/packages/1a/75/b3896bec5a2bb9ed2f989a970ea40e7062f8936f95425879bbe162746fe5/black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", size = 1608520, upload-time = "2025-11-10T01:58:46.895Z" }, - { url = "https://files.pythonhosted.org/packages/f3/b5/2bfc18330eddbcfb5aab8d2d720663cd410f51b2ed01375f5be3751595b0/black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", size = 1682719, upload-time = "2025-11-10T01:56:55.24Z" }, - { url = "https://files.pythonhosted.org/packages/96/fb/f7dc2793a22cdf74a72114b5ed77fe3349a2e09ef34565857a2f917abdf2/black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", size = 1362684, upload-time = "2025-11-10T01:57:07.639Z" }, - { url = "https://files.pythonhosted.org/packages/ad/47/3378d6a2ddefe18553d1115e36aea98f4a90de53b6a3017ed861ba1bd3bc/black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", size = 1772446, upload-time = "2025-11-10T02:02:16.181Z" }, - { url = "https://files.pythonhosted.org/packages/ba/4b/0f00bfb3d1f7e05e25bfc7c363f54dc523bb6ba502f98f4ad3acf01ab2e4/black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", size = 1607983, upload-time = "2025-11-10T02:02:52.502Z" }, - { url = "https://files.pythonhosted.org/packages/99/fe/49b0768f8c9ae57eb74cc10a1f87b4c70453551d8ad498959721cc345cb7/black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", size = 1682481, upload-time = "2025-11-10T01:57:12.35Z" }, - { url = "https://files.pythonhosted.org/packages/55/17/7e10ff1267bfa950cc16f0a411d457cdff79678fbb77a6c73b73a5317904/black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", size = 1363869, upload-time = "2025-11-10T01:58:24.608Z" }, - { url = "https://files.pythonhosted.org/packages/67/c0/cc865ce594d09e4cd4dfca5e11994ebb51604328489f3ca3ae7bb38a7db5/black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", size = 1771358, upload-time = "2025-11-10T02:03:33.331Z" }, - { url = "https://files.pythonhosted.org/packages/37/77/4297114d9e2fd2fc8ab0ab87192643cd49409eb059e2940391e7d2340e57/black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", size = 1612902, upload-time = "2025-11-10T01:59:33.382Z" }, - { url = "https://files.pythonhosted.org/packages/de/63/d45ef97ada84111e330b2b2d45e1dd163e90bd116f00ac55927fb6bf8adb/black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", size = 1680571, upload-time = "2025-11-10T01:57:04.239Z" }, - { url = "https://files.pythonhosted.org/packages/ff/4b/5604710d61cdff613584028b4cb4607e56e148801ed9b38ee7970799dab6/black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", size = 1382599, upload-time = "2025-11-10T01:57:57.427Z" }, - { url = "https://files.pythonhosted.org/packages/d5/9a/5b2c0e3215fe748fcf515c2dd34658973a1210bf610e24de5ba887e4f1c8/black-25.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06", size = 1743063, upload-time = "2025-11-10T02:02:43.175Z" }, - { url = "https://files.pythonhosted.org/packages/a1/20/245164c6efc27333409c62ba54dcbfbe866c6d1957c9a6c0647786e950da/black-25.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2", size = 1596867, upload-time = "2025-11-10T02:00:17.157Z" }, - { url = "https://files.pythonhosted.org/packages/ca/6f/1a3859a7da205f3d50cf3a8bec6bdc551a91c33ae77a045bb24c1f46ab54/black-25.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc", size = 1655678, upload-time = "2025-11-10T01:57:09.028Z" }, - { url = "https://files.pythonhosted.org/packages/56/1a/6dec1aeb7be90753d4fcc273e69bc18bfd34b353223ed191da33f7519410/black-25.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc", size = 1347452, upload-time = "2025-11-10T01:57:01.871Z" }, - { url = "https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", size = 204918, upload-time = "2025-11-10T01:53:48.917Z" }, -] - -[[package]] -name = "black" -version = "26.5.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "click", version = "8.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "mypy-extensions", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pathspec", version = "1.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "platformdirs", version = "4.10.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pytokens", marker = "python_full_version >= '3.10'" }, - { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/84/b3f55026206a9e8820a91503308075ca48eadc515e436731ca01dbe043b3/black-26.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9942db8888e06943c5dde66ca0037dcff82a2a4ec1ad0ada9e0d2ee9d9823893", size = 1987719, upload-time = "2026-05-18T17:05:02.757Z" }, - { url = "https://files.pythonhosted.org/packages/c6/34/7db312c5e5783d6e76cffd9d5ac8972a32badae4c6e3288dac0eed8d3bed/black-26.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:89c93167a74d3a75dfaa38a5c7cca015537d5820dd7f17d63267d674a61cae90", size = 1810083, upload-time = "2026-05-18T17:05:04.302Z" }, - { url = "https://files.pythonhosted.org/packages/33/e2/e0101e73c2c8727634e2efcb35e2b34bd23ad70dfa673789f5773a591b21/black-26.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f2cd76d069cc54c71f10360744ba8983fbb616903b4304a85b734915c8e1b4", size = 1860633, upload-time = "2026-05-18T17:05:06.391Z" }, - { url = "https://files.pythonhosted.org/packages/b0/4c/e15c0c5b23cf3651035fe5addcce90e283af3548a3f91bb03d81b83106ab/black-26.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:87ed5c6f450580a2f6790bc7cbfb016dfc73bc750249762268a3695361315eef", size = 1477886, upload-time = "2026-05-18T17:05:07.96Z" }, - { url = "https://files.pythonhosted.org/packages/9f/3f/59d43ade98d2ce5c8dc34a4e46cbecd177e6d55d7d4092969c6003ccc655/black-26.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:58b4bd92cf88aacf83d88479c8f9caee044b1ec55f2451a337354a7ea2590a22", size = 1277111, upload-time = "2026-05-18T17:05:09.473Z" }, - { url = "https://files.pythonhosted.org/packages/4b/96/3c3e09f09f44a37aac36b178a279cd19aa7001bd796187a7b162a294c81f/black-26.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96ae2c733b2aabdd9986e2c5df628ff3473676cd1c5faded1ff496cf6d74083c", size = 1970639, upload-time = "2026-05-18T17:05:11.461Z" }, - { url = "https://files.pythonhosted.org/packages/83/ea/5ad117b9ee3ecd933c712bcbae610006e5b7cc9f41c526cd7ed3b6c4124c/black-26.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e48b87e03bf109288e55cfceadcfa15ff5470aca2851a851950ed2926f450d7", size = 1792130, upload-time = "2026-05-18T17:05:12.983Z" }, - { url = "https://files.pythonhosted.org/packages/06/3a/7c448bc623fcdfa96672531beb5a616ea5e64f6975955254d7731ffb0ad9/black-26.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5119fa92ae61f786e8c3662fd60aece1d0a2dd5cca5d0c79417a95e7a4272a59", size = 1846134, upload-time = "2026-05-18T17:05:14.506Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5b/0b39b3a5917f0657ac014ad2edb58c139553a478adfe7f817abf1622ff6e/black-26.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:30d3c14661f2792e9142cce3eeeb1cbc175b3eb5f733be0c8eeb99651e52b0c3", size = 1478883, upload-time = "2026-05-18T17:05:16.542Z" }, - { url = "https://files.pythonhosted.org/packages/4c/48/dc222692e0f95030db1bbfb6c857e76858bad09058221ea7aae815255327/black-26.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:1ef92b76f7733f282fd096ea406200b5a286c42947412b0eaff3a74e3616cefe", size = 1277776, upload-time = "2026-05-18T17:05:18.029Z" }, - { url = "https://files.pythonhosted.org/packages/24/99/7744b906703228264ef73bdd534df88ec1ef3de45c4e78f6d31b9e32d0c9/black-26.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ad6fa01f941920f54f2bbb35f3df7673428a0ef98a0b0840c2eaef3b110efa8", size = 2012518, upload-time = "2026-05-18T17:05:20.108Z" }, - { url = "https://files.pythonhosted.org/packages/b7/c0/c5a3b1636dfd09c42534f2b3cf33506814f6d3e066fb0879ffa16c1ae860/black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217", size = 1816016, upload-time = "2026-05-18T17:05:21.84Z" }, - { url = "https://files.pythonhosted.org/packages/1f/0e/36044316b65ca471d3bb6d3703fd06fb50c6b727c3562f6a5a3153634f88/black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d", size = 1884150, upload-time = "2026-05-18T17:05:23.546Z" }, - { url = "https://files.pythonhosted.org/packages/b3/33/dafc5808c2af43672912111d7c3354af1615f7e2be3bed7a878461abbe4d/black-26.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264", size = 1486825, upload-time = "2026-05-18T17:05:25.004Z" }, - { url = "https://files.pythonhosted.org/packages/82/14/b965ee6ad2a311f28bdbf692def3ee9848d2ae289dab28b27657fcee3e78/black-26.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1037d5ac7b7b310b2632ad867ec8d0e4c4819dcdb0b820f63135da746a24e418", size = 1288646, upload-time = "2026-05-18T17:05:26.477Z" }, - { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, - { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, - { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, - { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, - { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, - { url = "https://files.pythonhosted.org/packages/a6/16/a8da8eb208c51c7f4ce74609a45d0dcc6d8a2141e45e81ee5289d1bb0d59/black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168", size = 2004800, upload-time = "2026-05-18T17:05:38.182Z" }, - { url = "https://files.pythonhosted.org/packages/11/8a/a479296a19e383b70a725882a6cf3d786540601ff03cabbaaf1cce864c5a/black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3", size = 1815576, upload-time = "2026-05-18T17:05:40.309Z" }, - { url = "https://files.pythonhosted.org/packages/81/6b/cfaf3d39f25132c156a068f6b805576c9103a84086019507c70e1911ee7d/black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18", size = 1877927, upload-time = "2026-05-18T17:05:42.463Z" }, - { url = "https://files.pythonhosted.org/packages/66/76/302e313964bcff7e28df329d39f84f5270095730d85ff0acc260610a0d82/black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50", size = 1511860, upload-time = "2026-05-18T17:05:43.943Z" }, - { url = "https://files.pythonhosted.org/packages/27/4e/a3827e35e0e567f9f9ee59e2a0ab979267dca98718f25547ca8c6733afd4/black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae", size = 1316632, upload-time = "2026-05-18T17:05:45.521Z" }, - { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.9.*'", - "python_full_version == '3.8.*'", - "python_full_version < '3.8'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, - { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, -] - -[[package]] -name = "click" -version = "8.4.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "coverage" -version = "7.2.7" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -sdist = { url = "https://files.pythonhosted.org/packages/45/8b/421f30467e69ac0e414214856798d4bc32da1336df745e49e49ae5c1e2a8/coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59", size = 762575, upload-time = "2023-05-29T20:08:50.273Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/01/24/be01e62a7bce89bcffe04729c540382caa5a06bee45ae42136c93e2499f5/coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8", size = 200724, upload-time = "2023-05-29T20:07:03.422Z" }, - { url = "https://files.pythonhosted.org/packages/3d/80/7060a445e1d2c9744b683dc935248613355657809d6c6b2716cdf4ca4766/coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb", size = 201024, upload-time = "2023-05-29T20:07:05.694Z" }, - { url = "https://files.pythonhosted.org/packages/b8/9d/926fce7e03dbfc653104c2d981c0fa71f0572a9ebd344d24c573bd6f7c4f/coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6", size = 229528, upload-time = "2023-05-29T20:07:07.307Z" }, - { url = "https://files.pythonhosted.org/packages/d1/3a/67f5d18f911abf96857f6f7e4df37ca840e38179e2cc9ab6c0b9c3380f19/coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2", size = 227842, upload-time = "2023-05-29T20:07:09.331Z" }, - { url = "https://files.pythonhosted.org/packages/b4/bd/1b2331e3a04f4cc9b7b332b1dd0f3a1261dfc4114f8479bebfcc2afee9e8/coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063", size = 228717, upload-time = "2023-05-29T20:07:11.38Z" }, - { url = "https://files.pythonhosted.org/packages/2b/86/3dbf9be43f8bf6a5ca28790a713e18902b2d884bc5fa9512823a81dff601/coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1", size = 234632, upload-time = "2023-05-29T20:07:13.376Z" }, - { url = "https://files.pythonhosted.org/packages/91/e8/469ed808a782b9e8305a08bad8c6fa5f8e73e093bda6546c5aec68275bff/coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353", size = 232875, upload-time = "2023-05-29T20:07:15.093Z" }, - { url = "https://files.pythonhosted.org/packages/29/8f/4fad1c2ba98104425009efd7eaa19af9a7c797e92d40cd2ec026fa1f58cb/coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495", size = 234094, upload-time = "2023-05-29T20:07:17.013Z" }, - { url = "https://files.pythonhosted.org/packages/94/4e/d4e46a214ae857be3d7dc5de248ba43765f60daeb1ab077cb6c1536c7fba/coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818", size = 203184, upload-time = "2023-05-29T20:07:18.69Z" }, - { url = "https://files.pythonhosted.org/packages/1f/e9/d6730247d8dec2a3dddc520ebe11e2e860f0f98cee3639e23de6cf920255/coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850", size = 204096, upload-time = "2023-05-29T20:07:20.153Z" }, - { url = "https://files.pythonhosted.org/packages/c6/fa/529f55c9a1029c840bcc9109d5a15ff00478b7ff550a1ae361f8745f8ad5/coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f", size = 200895, upload-time = "2023-05-29T20:07:21.963Z" }, - { url = "https://files.pythonhosted.org/packages/67/d7/cd8fe689b5743fffac516597a1222834c42b80686b99f5b44ef43ccc2a43/coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe", size = 201120, upload-time = "2023-05-29T20:07:23.765Z" }, - { url = "https://files.pythonhosted.org/packages/8c/95/16eed713202406ca0a37f8ac259bbf144c9d24f9b8097a8e6ead61da2dbb/coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3", size = 233178, upload-time = "2023-05-29T20:07:25.281Z" }, - { url = "https://files.pythonhosted.org/packages/c1/49/4d487e2ad5d54ed82ac1101e467e8994c09d6123c91b2a962145f3d262c2/coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f", size = 230754, upload-time = "2023-05-29T20:07:27.044Z" }, - { url = "https://files.pythonhosted.org/packages/a7/cd/3ce94ad9d407a052dc2a74fbeb1c7947f442155b28264eb467ee78dea812/coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb", size = 232558, upload-time = "2023-05-29T20:07:28.743Z" }, - { url = "https://files.pythonhosted.org/packages/8f/a8/12cc7b261f3082cc299ab61f677f7e48d93e35ca5c3c2f7241ed5525ccea/coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833", size = 241509, upload-time = "2023-05-29T20:07:30.434Z" }, - { url = "https://files.pythonhosted.org/packages/04/fa/43b55101f75a5e9115259e8be70ff9279921cb6b17f04c34a5702ff9b1f7/coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97", size = 239924, upload-time = "2023-05-29T20:07:32.065Z" }, - { url = "https://files.pythonhosted.org/packages/68/5f/d2bd0f02aa3c3e0311986e625ccf97fdc511b52f4f1a063e4f37b624772f/coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a", size = 240977, upload-time = "2023-05-29T20:07:34.184Z" }, - { url = "https://files.pythonhosted.org/packages/ba/92/69c0722882643df4257ecc5437b83f4c17ba9e67f15dc6b77bad89b6982e/coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a", size = 203168, upload-time = "2023-05-29T20:07:35.869Z" }, - { url = "https://files.pythonhosted.org/packages/b1/96/c12ed0dfd4ec587f3739f53eb677b9007853fd486ccb0e7d5512a27bab2e/coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562", size = 204185, upload-time = "2023-05-29T20:07:37.39Z" }, - { url = "https://files.pythonhosted.org/packages/ff/d5/52fa1891d1802ab2e1b346d37d349cb41cdd4fd03f724ebbf94e80577687/coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4", size = 201020, upload-time = "2023-05-29T20:07:38.724Z" }, - { url = "https://files.pythonhosted.org/packages/24/df/6765898d54ea20e3197a26d26bb65b084deefadd77ce7de946b9c96dfdc5/coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4", size = 233994, upload-time = "2023-05-29T20:07:40.274Z" }, - { url = "https://files.pythonhosted.org/packages/15/81/b108a60bc758b448c151e5abceed027ed77a9523ecbc6b8a390938301841/coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01", size = 231358, upload-time = "2023-05-29T20:07:41.998Z" }, - { url = "https://files.pythonhosted.org/packages/61/90/c76b9462f39897ebd8714faf21bc985b65c4e1ea6dff428ea9dc711ed0dd/coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6", size = 233316, upload-time = "2023-05-29T20:07:43.539Z" }, - { url = "https://files.pythonhosted.org/packages/04/d6/8cba3bf346e8b1a4fb3f084df7d8cea25a6b6c56aaca1f2e53829be17e9e/coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d", size = 240159, upload-time = "2023-05-29T20:07:44.982Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ea/4a252dc77ca0605b23d477729d139915e753ee89e4c9507630e12ad64a80/coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de", size = 238127, upload-time = "2023-05-29T20:07:46.522Z" }, - { url = "https://files.pythonhosted.org/packages/9f/5c/d9760ac497c41f9c4841f5972d0edf05d50cad7814e86ee7d133ec4a0ac8/coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d", size = 239833, upload-time = "2023-05-29T20:07:47.992Z" }, - { url = "https://files.pythonhosted.org/packages/69/8c/26a95b08059db1cbb01e4b0e6d40f2e9debb628c6ca86b78f625ceaf9bab/coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511", size = 203463, upload-time = "2023-05-29T20:07:49.939Z" }, - { url = "https://files.pythonhosted.org/packages/b7/00/14b00a0748e9eda26e97be07a63cc911108844004687321ddcc213be956c/coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3", size = 204347, upload-time = "2023-05-29T20:07:51.909Z" }, - { url = "https://files.pythonhosted.org/packages/80/d7/67937c80b8fd4c909fdac29292bc8b35d9505312cff6bcab41c53c5b1df6/coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f", size = 200580, upload-time = "2023-05-29T20:07:54.076Z" }, - { url = "https://files.pythonhosted.org/packages/7a/05/084864fa4bbf8106f44fb72a56e67e0cd372d3bf9d893be818338c81af5d/coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb", size = 226237, upload-time = "2023-05-29T20:07:56.28Z" }, - { url = "https://files.pythonhosted.org/packages/67/a2/6fa66a50e6e894286d79a3564f42bd54a9bd27049dc0a63b26d9924f0aa3/coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9", size = 224256, upload-time = "2023-05-29T20:07:58.189Z" }, - { url = "https://files.pythonhosted.org/packages/e2/c0/73f139794c742840b9ab88e2e17fe14a3d4668a166ff95d812ac66c0829d/coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd", size = 225550, upload-time = "2023-05-29T20:08:00.383Z" }, - { url = "https://files.pythonhosted.org/packages/03/ec/6f30b4e0c96ce03b0e64aec46b4af2a8c49b70d1b5d0d69577add757b946/coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a", size = 232440, upload-time = "2023-05-29T20:08:02.495Z" }, - { url = "https://files.pythonhosted.org/packages/22/c1/2f6c1b6f01a0996c9e067a9c780e1824351dbe17faae54388a4477e6d86f/coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959", size = 230897, upload-time = "2023-05-29T20:08:04.382Z" }, - { url = "https://files.pythonhosted.org/packages/8d/d6/53e999ec1bf7498ca4bc5f3b8227eb61db39068d2de5dcc359dec5601b5a/coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02", size = 232024, upload-time = "2023-05-29T20:08:06.031Z" }, - { url = "https://files.pythonhosted.org/packages/e9/40/383305500d24122dbed73e505a4d6828f8f3356d1f68ab6d32c781754b81/coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f", size = 203293, upload-time = "2023-05-29T20:08:07.598Z" }, - { url = "https://files.pythonhosted.org/packages/0e/bc/7e3a31534fabb043269f14fb64e2bb2733f85d4cf39e5bbc71357c57553a/coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0", size = 204040, upload-time = "2023-05-29T20:08:09.919Z" }, - { url = "https://files.pythonhosted.org/packages/c6/fc/be19131010930a6cf271da48202c8cc1d3f971f68c02fb2d3a78247f43dc/coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5", size = 200689, upload-time = "2023-05-29T20:08:11.594Z" }, - { url = "https://files.pythonhosted.org/packages/28/d7/9a8de57d87f4bbc6f9a6a5ded1eaac88a89bf71369bb935dac3c0cf2893e/coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5", size = 200986, upload-time = "2023-05-29T20:08:13.228Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e4/e6182e4697665fb594a7f4e4f27cb3a4dd00c2e3d35c5c706765de8c7866/coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9", size = 230648, upload-time = "2023-05-29T20:08:15.11Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e3/f552d5871943f747165b92a924055c5d6daa164ae659a13f9018e22f3990/coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6", size = 228511, upload-time = "2023-05-29T20:08:16.877Z" }, - { url = "https://files.pythonhosted.org/packages/44/55/49f65ccdd4dfd6d5528e966b28c37caec64170c725af32ab312889d2f857/coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e", size = 229852, upload-time = "2023-05-29T20:08:18.47Z" }, - { url = "https://files.pythonhosted.org/packages/0d/31/340428c238eb506feb96d4fb5c9ea614db1149517f22cc7ab8c6035ef6d9/coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050", size = 235578, upload-time = "2023-05-29T20:08:20.298Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ce/97c1dd6592c908425622fe7f31c017d11cf0421729b09101d4de75bcadc8/coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5", size = 234079, upload-time = "2023-05-29T20:08:22.365Z" }, - { url = "https://files.pythonhosted.org/packages/de/a3/5a98dc9e239d0dc5f243ef5053d5b1bdcaa1dee27a691dfc12befeccf878/coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f", size = 234991, upload-time = "2023-05-29T20:08:24.974Z" }, - { url = "https://files.pythonhosted.org/packages/4a/fb/78986d3022e5ccf2d4370bc43a5fef8374f092b3c21d32499dee8e30b7b6/coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e", size = 203160, upload-time = "2023-05-29T20:08:26.701Z" }, - { url = "https://files.pythonhosted.org/packages/c3/1c/6b3c9c363fb1433c79128e0d692863deb761b1b78162494abb9e5c328bc0/coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c", size = 204085, upload-time = "2023-05-29T20:08:28.146Z" }, - { url = "https://files.pythonhosted.org/packages/88/da/495944ebf0ad246235a6bd523810d9f81981f9b81c6059ba1f56e943abe0/coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9", size = 200725, upload-time = "2023-05-29T20:08:29.851Z" }, - { url = "https://files.pythonhosted.org/packages/ca/0c/3dfeeb1006c44b911ee0ed915350db30325d01808525ae7cc8d57643a2ce/coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2", size = 201022, upload-time = "2023-05-29T20:08:31.429Z" }, - { url = "https://files.pythonhosted.org/packages/61/af/5964b8d7d9a5c767785644d9a5a63cacba9a9c45cc42ba06d25895ec87be/coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7", size = 229102, upload-time = "2023-05-29T20:08:32.982Z" }, - { url = "https://files.pythonhosted.org/packages/d9/1d/cd467fceb62c371f9adb1d739c92a05d4e550246daa90412e711226bd320/coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e", size = 227441, upload-time = "2023-05-29T20:08:35.044Z" }, - { url = "https://files.pythonhosted.org/packages/fe/57/e4f8ad64d84ca9e759d783a052795f62a9f9111585e46068845b1cb52c2b/coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1", size = 228265, upload-time = "2023-05-29T20:08:36.861Z" }, - { url = "https://files.pythonhosted.org/packages/88/8b/b0d9fe727acae907fa7f1c8194ccb6fe9d02e1c3e9001ecf74c741f86110/coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9", size = 234217, upload-time = "2023-05-29T20:08:38.837Z" }, - { url = "https://files.pythonhosted.org/packages/66/2e/c99fe1f6396d93551aa352c75410686e726cd4ea104479b9af1af22367ce/coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250", size = 232466, upload-time = "2023-05-29T20:08:40.768Z" }, - { url = "https://files.pythonhosted.org/packages/bb/e9/88747b40c8fb4a783b40222510ce6d66170217eb05d7f46462c36b4fa8cc/coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2", size = 233669, upload-time = "2023-05-29T20:08:42.944Z" }, - { url = "https://files.pythonhosted.org/packages/b1/d5/a8e276bc005e42114468d4fe03e0a9555786bc51cbfe0d20827a46c1565a/coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb", size = 203199, upload-time = "2023-05-29T20:08:44.734Z" }, - { url = "https://files.pythonhosted.org/packages/a9/0c/4a848ae663b47f1195abcb09a951751dd61f80b503303b9b9d768e0fd321/coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27", size = 204109, upload-time = "2023-05-29T20:08:46.417Z" }, - { url = "https://files.pythonhosted.org/packages/67/fb/b3b1d7887e1ea25a9608b0776e480e4bbc303ca95a31fd585555ec4fff5a/coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d", size = 193207, upload-time = "2023-05-29T20:08:48.153Z" }, -] - -[package.optional-dependencies] -toml = [ - { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, -] - -[[package]] -name = "coverage" -version = "7.6.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.8.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791, upload-time = "2024-08-04T19:45:30.9Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/61/eb7ce5ed62bacf21beca4937a90fe32545c91a3c8a42a30c6616d48fc70d/coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", size = 206690, upload-time = "2024-08-04T19:43:07.695Z" }, - { url = "https://files.pythonhosted.org/packages/7d/73/041928e434442bd3afde5584bdc3f932fb4562b1597629f537387cec6f3d/coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", size = 207127, upload-time = "2024-08-04T19:43:10.15Z" }, - { url = "https://files.pythonhosted.org/packages/c7/c8/6ca52b5147828e45ad0242388477fdb90df2c6cbb9a441701a12b3c71bc8/coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", size = 235654, upload-time = "2024-08-04T19:43:12.405Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/9ac2b62557f4340270942011d6efeab9833648380109e897d48ab7c1035d/coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc", size = 233598, upload-time = "2024-08-04T19:43:14.078Z" }, - { url = "https://files.pythonhosted.org/packages/53/23/9e2c114d0178abc42b6d8d5281f651a8e6519abfa0ef460a00a91f80879d/coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", size = 234732, upload-time = "2024-08-04T19:43:16.632Z" }, - { url = "https://files.pythonhosted.org/packages/0f/7e/a0230756fb133343a52716e8b855045f13342b70e48e8ad41d8a0d60ab98/coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", size = 233816, upload-time = "2024-08-04T19:43:19.049Z" }, - { url = "https://files.pythonhosted.org/packages/28/7c/3753c8b40d232b1e5eeaed798c875537cf3cb183fb5041017c1fdb7ec14e/coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", size = 232325, upload-time = "2024-08-04T19:43:21.246Z" }, - { url = "https://files.pythonhosted.org/packages/57/e3/818a2b2af5b7573b4b82cf3e9f137ab158c90ea750a8f053716a32f20f06/coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", size = 233418, upload-time = "2024-08-04T19:43:22.945Z" }, - { url = "https://files.pythonhosted.org/packages/c8/fb/4532b0b0cefb3f06d201648715e03b0feb822907edab3935112b61b885e2/coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", size = 209343, upload-time = "2024-08-04T19:43:25.121Z" }, - { url = "https://files.pythonhosted.org/packages/5a/25/af337cc7421eca1c187cc9c315f0a755d48e755d2853715bfe8c418a45fa/coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", size = 210136, upload-time = "2024-08-04T19:43:26.851Z" }, - { url = "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", size = 206796, upload-time = "2024-08-04T19:43:29.115Z" }, - { url = "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", size = 207244, upload-time = "2024-08-04T19:43:31.285Z" }, - { url = "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", size = 239279, upload-time = "2024-08-04T19:43:33.581Z" }, - { url = "https://files.pythonhosted.org/packages/70/6c/a9ccd6fe50ddaf13442a1e2dd519ca805cbe0f1fcd377fba6d8339b98ccb/coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", size = 236859, upload-time = "2024-08-04T19:43:35.301Z" }, - { url = "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", size = 238549, upload-time = "2024-08-04T19:43:37.578Z" }, - { url = "https://files.pythonhosted.org/packages/68/3c/289b81fa18ad72138e6d78c4c11a82b5378a312c0e467e2f6b495c260907/coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", size = 237477, upload-time = "2024-08-04T19:43:39.92Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1c/aa1efa6459d822bd72c4abc0b9418cf268de3f60eeccd65dc4988553bd8d/coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", size = 236134, upload-time = "2024-08-04T19:43:41.453Z" }, - { url = "https://files.pythonhosted.org/packages/fb/c8/521c698f2d2796565fe9c789c2ee1ccdae610b3aa20b9b2ef980cc253640/coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", size = 236910, upload-time = "2024-08-04T19:43:43.037Z" }, - { url = "https://files.pythonhosted.org/packages/7d/30/033e663399ff17dca90d793ee8a2ea2890e7fdf085da58d82468b4220bf7/coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", size = 209348, upload-time = "2024-08-04T19:43:44.787Z" }, - { url = "https://files.pythonhosted.org/packages/20/05/0d1ccbb52727ccdadaa3ff37e4d2dc1cd4d47f0c3df9eb58d9ec8508ca88/coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", size = 210230, upload-time = "2024-08-04T19:43:46.707Z" }, - { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983, upload-time = "2024-08-04T19:43:49.082Z" }, - { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221, upload-time = "2024-08-04T19:43:52.15Z" }, - { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342, upload-time = "2024-08-04T19:43:53.746Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371, upload-time = "2024-08-04T19:43:55.993Z" }, - { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455, upload-time = "2024-08-04T19:43:57.618Z" }, - { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924, upload-time = "2024-08-04T19:44:00.012Z" }, - { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252, upload-time = "2024-08-04T19:44:01.713Z" }, - { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897, upload-time = "2024-08-04T19:44:03.898Z" }, - { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606, upload-time = "2024-08-04T19:44:05.532Z" }, - { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373, upload-time = "2024-08-04T19:44:07.079Z" }, - { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007, upload-time = "2024-08-04T19:44:09.453Z" }, - { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269, upload-time = "2024-08-04T19:44:11.045Z" }, - { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886, upload-time = "2024-08-04T19:44:12.83Z" }, - { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037, upload-time = "2024-08-04T19:44:15.393Z" }, - { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038, upload-time = "2024-08-04T19:44:17.466Z" }, - { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690, upload-time = "2024-08-04T19:44:19.336Z" }, - { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765, upload-time = "2024-08-04T19:44:20.994Z" }, - { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611, upload-time = "2024-08-04T19:44:22.616Z" }, - { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671, upload-time = "2024-08-04T19:44:24.418Z" }, - { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368, upload-time = "2024-08-04T19:44:26.276Z" }, - { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758, upload-time = "2024-08-04T19:44:29.028Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035, upload-time = "2024-08-04T19:44:30.673Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839, upload-time = "2024-08-04T19:44:32.412Z" }, - { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569, upload-time = "2024-08-04T19:44:34.547Z" }, - { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927, upload-time = "2024-08-04T19:44:36.313Z" }, - { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401, upload-time = "2024-08-04T19:44:38.155Z" }, - { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301, upload-time = "2024-08-04T19:44:39.883Z" }, - { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598, upload-time = "2024-08-04T19:44:41.59Z" }, - { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307, upload-time = "2024-08-04T19:44:43.301Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453, upload-time = "2024-08-04T19:44:45.677Z" }, - { url = "https://files.pythonhosted.org/packages/81/d0/d9e3d554e38beea5a2e22178ddb16587dbcbe9a1ef3211f55733924bf7fa/coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", size = 206674, upload-time = "2024-08-04T19:44:47.694Z" }, - { url = "https://files.pythonhosted.org/packages/38/ea/cab2dc248d9f45b2b7f9f1f596a4d75a435cb364437c61b51d2eb33ceb0e/coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", size = 207101, upload-time = "2024-08-04T19:44:49.32Z" }, - { url = "https://files.pythonhosted.org/packages/ca/6f/f82f9a500c7c5722368978a5390c418d2a4d083ef955309a8748ecaa8920/coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", size = 236554, upload-time = "2024-08-04T19:44:51.631Z" }, - { url = "https://files.pythonhosted.org/packages/a6/94/d3055aa33d4e7e733d8fa309d9adf147b4b06a82c1346366fc15a2b1d5fa/coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", size = 234440, upload-time = "2024-08-04T19:44:53.464Z" }, - { url = "https://files.pythonhosted.org/packages/e4/6e/885bcd787d9dd674de4a7d8ec83faf729534c63d05d51d45d4fa168f7102/coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", size = 235889, upload-time = "2024-08-04T19:44:55.165Z" }, - { url = "https://files.pythonhosted.org/packages/f4/63/df50120a7744492710854860783d6819ff23e482dee15462c9a833cc428a/coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", size = 235142, upload-time = "2024-08-04T19:44:57.269Z" }, - { url = "https://files.pythonhosted.org/packages/3a/5d/9d0acfcded2b3e9ce1c7923ca52ccc00c78a74e112fc2aee661125b7843b/coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", size = 233805, upload-time = "2024-08-04T19:44:59.033Z" }, - { url = "https://files.pythonhosted.org/packages/c4/56/50abf070cb3cd9b1dd32f2c88f083aab561ecbffbcd783275cb51c17f11d/coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", size = 234655, upload-time = "2024-08-04T19:45:01.398Z" }, - { url = "https://files.pythonhosted.org/packages/25/ee/b4c246048b8485f85a2426ef4abab88e48c6e80c74e964bea5cd4cd4b115/coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", size = 209296, upload-time = "2024-08-04T19:45:03.819Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/96cf86b70b69ea2b12924cdf7cabb8ad10e6130eab8d767a1099fbd2a44f/coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", size = 210137, upload-time = "2024-08-04T19:45:06.25Z" }, - { url = "https://files.pythonhosted.org/packages/19/d3/d54c5aa83268779d54c86deb39c1c4566e5d45c155369ca152765f8db413/coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", size = 206688, upload-time = "2024-08-04T19:45:08.358Z" }, - { url = "https://files.pythonhosted.org/packages/a5/fe/137d5dca72e4a258b1bc17bb04f2e0196898fe495843402ce826a7419fe3/coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", size = 207120, upload-time = "2024-08-04T19:45:11.526Z" }, - { url = "https://files.pythonhosted.org/packages/78/5b/a0a796983f3201ff5485323b225d7c8b74ce30c11f456017e23d8e8d1945/coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", size = 235249, upload-time = "2024-08-04T19:45:13.202Z" }, - { url = "https://files.pythonhosted.org/packages/4e/e1/76089d6a5ef9d68f018f65411fcdaaeb0141b504587b901d74e8587606ad/coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", size = 233237, upload-time = "2024-08-04T19:45:14.961Z" }, - { url = "https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", size = 234311, upload-time = "2024-08-04T19:45:16.924Z" }, - { url = "https://files.pythonhosted.org/packages/75/e1/656d65fb126c29a494ef964005702b012f3498db1a30dd562958e85a4049/coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", size = 233453, upload-time = "2024-08-04T19:45:18.672Z" }, - { url = "https://files.pythonhosted.org/packages/68/6a/45f108f137941a4a1238c85f28fd9d048cc46b5466d6b8dda3aba1bb9d4f/coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", size = 231958, upload-time = "2024-08-04T19:45:20.63Z" }, - { url = "https://files.pythonhosted.org/packages/9b/e7/47b809099168b8b8c72ae311efc3e88c8d8a1162b3ba4b8da3cfcdb85743/coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", size = 232938, upload-time = "2024-08-04T19:45:23.062Z" }, - { url = "https://files.pythonhosted.org/packages/52/80/052222ba7058071f905435bad0ba392cc12006380731c37afaf3fe749b88/coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", size = 209352, upload-time = "2024-08-04T19:45:25.042Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d8/1b92e0b3adcf384e98770a00ca095da1b5f7b483e6563ae4eb5e935d24a1/coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", size = 210153, upload-time = "2024-08-04T19:45:27.079Z" }, - { url = "https://files.pythonhosted.org/packages/a5/2b/0354ed096bca64dc8e32a7cbcae28b34cb5ad0b1fe2125d6d99583313ac0/coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", size = 198926, upload-time = "2024-08-04T19:45:28.875Z" }, -] - -[package.optional-dependencies] -toml = [ - { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, -] - -[[package]] -name = "coverage" -version = "7.10.7" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.9.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/6c/3a3f7a46888e69d18abe3ccc6fe4cb16cccb1e6a2f99698931dafca489e6/coverage-7.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc04cc7a3db33664e0c2d10eb8990ff6b3536f6842c9590ae8da4c614b9ed05a", size = 217987, upload-time = "2025-09-21T20:00:57.218Z" }, - { url = "https://files.pythonhosted.org/packages/03/94/952d30f180b1a916c11a56f5c22d3535e943aa22430e9e3322447e520e1c/coverage-7.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e201e015644e207139f7e2351980feb7040e6f4b2c2978892f3e3789d1c125e5", size = 218388, upload-time = "2025-09-21T20:01:00.081Z" }, - { url = "https://files.pythonhosted.org/packages/50/2b/9e0cf8ded1e114bcd8b2fd42792b57f1c4e9e4ea1824cde2af93a67305be/coverage-7.10.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:240af60539987ced2c399809bd34f7c78e8abe0736af91c3d7d0e795df633d17", size = 245148, upload-time = "2025-09-21T20:01:01.768Z" }, - { url = "https://files.pythonhosted.org/packages/19/20/d0384ac06a6f908783d9b6aa6135e41b093971499ec488e47279f5b846e6/coverage-7.10.7-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8421e088bc051361b01c4b3a50fd39a4b9133079a2229978d9d30511fd05231b", size = 246958, upload-time = "2025-09-21T20:01:03.355Z" }, - { url = "https://files.pythonhosted.org/packages/60/83/5c283cff3d41285f8eab897651585db908a909c572bdc014bcfaf8a8b6ae/coverage-7.10.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be8ed3039ae7f7ac5ce058c308484787c86e8437e72b30bf5e88b8ea10f3c87", size = 248819, upload-time = "2025-09-21T20:01:04.968Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/02eb98fdc5ff79f423e990d877693e5310ae1eab6cb20ae0b0b9ac45b23b/coverage-7.10.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e28299d9f2e889e6d51b1f043f58d5f997c373cc12e6403b90df95b8b047c13e", size = 245754, upload-time = "2025-09-21T20:01:06.321Z" }, - { url = "https://files.pythonhosted.org/packages/b4/bc/25c83bcf3ad141b32cd7dc45485ef3c01a776ca3aa8ef0a93e77e8b5bc43/coverage-7.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4e16bd7761c5e454f4efd36f345286d6f7c5fa111623c355691e2755cae3b9e", size = 246860, upload-time = "2025-09-21T20:01:07.605Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b7/95574702888b58c0928a6e982038c596f9c34d52c5e5107f1eef729399b5/coverage-7.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b1c81d0e5e160651879755c9c675b974276f135558cf4ba79fee7b8413a515df", size = 244877, upload-time = "2025-09-21T20:01:08.829Z" }, - { url = "https://files.pythonhosted.org/packages/47/b6/40095c185f235e085df0e0b158f6bd68cc6e1d80ba6c7721dc81d97ec318/coverage-7.10.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:606cc265adc9aaedcc84f1f064f0e8736bc45814f15a357e30fca7ecc01504e0", size = 245108, upload-time = "2025-09-21T20:01:10.527Z" }, - { url = "https://files.pythonhosted.org/packages/c8/50/4aea0556da7a4b93ec9168420d170b55e2eb50ae21b25062513d020c6861/coverage-7.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10b24412692df990dbc34f8fb1b6b13d236ace9dfdd68df5b28c2e39cafbba13", size = 245752, upload-time = "2025-09-21T20:01:11.857Z" }, - { url = "https://files.pythonhosted.org/packages/6a/28/ea1a84a60828177ae3b100cb6723838523369a44ec5742313ed7db3da160/coverage-7.10.7-cp310-cp310-win32.whl", hash = "sha256:b51dcd060f18c19290d9b8a9dd1e0181538df2ce0717f562fff6cf74d9fc0b5b", size = 220497, upload-time = "2025-09-21T20:01:13.459Z" }, - { url = "https://files.pythonhosted.org/packages/fc/1a/a81d46bbeb3c3fd97b9602ebaa411e076219a150489bcc2c025f151bd52d/coverage-7.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:3a622ac801b17198020f09af3eaf45666b344a0d69fc2a6ffe2ea83aeef1d807", size = 221392, upload-time = "2025-09-21T20:01:14.722Z" }, - { url = "https://files.pythonhosted.org/packages/d2/5d/c1a17867b0456f2e9ce2d8d4708a4c3a089947d0bec9c66cdf60c9e7739f/coverage-7.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a609f9c93113be646f44c2a0256d6ea375ad047005d7f57a5c15f614dc1b2f59", size = 218102, upload-time = "2025-09-21T20:01:16.089Z" }, - { url = "https://files.pythonhosted.org/packages/54/f0/514dcf4b4e3698b9a9077f084429681bf3aad2b4a72578f89d7f643eb506/coverage-7.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:65646bb0359386e07639c367a22cf9b5bf6304e8630b565d0626e2bdf329227a", size = 218505, upload-time = "2025-09-21T20:01:17.788Z" }, - { url = "https://files.pythonhosted.org/packages/20/f6/9626b81d17e2a4b25c63ac1b425ff307ecdeef03d67c9a147673ae40dc36/coverage-7.10.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f33166f0dfcce728191f520bd2692914ec70fac2713f6bf3ce59c3deacb4699", size = 248898, upload-time = "2025-09-21T20:01:19.488Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ef/bd8e719c2f7417ba03239052e099b76ea1130ac0cbb183ee1fcaa58aaff3/coverage-7.10.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f5e3f9e455bb17831876048355dca0f758b6df22f49258cb5a91da23ef437d", size = 250831, upload-time = "2025-09-21T20:01:20.817Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b6/bf054de41ec948b151ae2b79a55c107f5760979538f5fb80c195f2517718/coverage-7.10.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da86b6d62a496e908ac2898243920c7992499c1712ff7c2b6d837cc69d9467e", size = 252937, upload-time = "2025-09-21T20:01:22.171Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e5/3860756aa6f9318227443c6ce4ed7bf9e70bb7f1447a0353f45ac5c7974b/coverage-7.10.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6b8b09c1fad947c84bbbc95eca841350fad9cbfa5a2d7ca88ac9f8d836c92e23", size = 249021, upload-time = "2025-09-21T20:01:23.907Z" }, - { url = "https://files.pythonhosted.org/packages/26/0f/bd08bd042854f7fd07b45808927ebcce99a7ed0f2f412d11629883517ac2/coverage-7.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4376538f36b533b46f8971d3a3e63464f2c7905c9800db97361c43a2b14792ab", size = 250626, upload-time = "2025-09-21T20:01:25.721Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a7/4777b14de4abcc2e80c6b1d430f5d51eb18ed1d75fca56cbce5f2db9b36e/coverage-7.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:121da30abb574f6ce6ae09840dae322bef734480ceafe410117627aa54f76d82", size = 248682, upload-time = "2025-09-21T20:01:27.105Z" }, - { url = "https://files.pythonhosted.org/packages/34/72/17d082b00b53cd45679bad682fac058b87f011fd8b9fe31d77f5f8d3a4e4/coverage-7.10.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:88127d40df529336a9836870436fc2751c339fbaed3a836d42c93f3e4bd1d0a2", size = 248402, upload-time = "2025-09-21T20:01:28.629Z" }, - { url = "https://files.pythonhosted.org/packages/81/7a/92367572eb5bdd6a84bfa278cc7e97db192f9f45b28c94a9ca1a921c3577/coverage-7.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba58bbcd1b72f136080c0bccc2400d66cc6115f3f906c499013d065ac33a4b61", size = 249320, upload-time = "2025-09-21T20:01:30.004Z" }, - { url = "https://files.pythonhosted.org/packages/2f/88/a23cc185f6a805dfc4fdf14a94016835eeb85e22ac3a0e66d5e89acd6462/coverage-7.10.7-cp311-cp311-win32.whl", hash = "sha256:972b9e3a4094b053a4e46832b4bc829fc8a8d347160eb39d03f1690316a99c14", size = 220536, upload-time = "2025-09-21T20:01:32.184Z" }, - { url = "https://files.pythonhosted.org/packages/fe/ef/0b510a399dfca17cec7bc2f05ad8bd78cf55f15c8bc9a73ab20c5c913c2e/coverage-7.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:a7b55a944a7f43892e28ad4bc0561dfd5f0d73e605d1aa5c3c976b52aea121d2", size = 221425, upload-time = "2025-09-21T20:01:33.557Z" }, - { url = "https://files.pythonhosted.org/packages/51/7f/023657f301a276e4ba1850f82749bc136f5a7e8768060c2e5d9744a22951/coverage-7.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:736f227fb490f03c6488f9b6d45855f8e0fd749c007f9303ad30efab0e73c05a", size = 220103, upload-time = "2025-09-21T20:01:34.929Z" }, - { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload-time = "2025-09-21T20:01:36.455Z" }, - { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload-time = "2025-09-21T20:01:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload-time = "2025-09-21T20:01:39.617Z" }, - { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload-time = "2025-09-21T20:01:41.341Z" }, - { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload-time = "2025-09-21T20:01:43.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload-time = "2025-09-21T20:01:44.469Z" }, - { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload-time = "2025-09-21T20:01:45.915Z" }, - { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload-time = "2025-09-21T20:01:47.296Z" }, - { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload-time = "2025-09-21T20:01:48.73Z" }, - { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload-time = "2025-09-21T20:01:50.529Z" }, - { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload-time = "2025-09-21T20:01:51.941Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload-time = "2025-09-21T20:01:53.481Z" }, - { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload-time = "2025-09-21T20:01:55.2Z" }, - { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload-time = "2025-09-21T20:01:56.629Z" }, - { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload-time = "2025-09-21T20:01:58.203Z" }, - { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload-time = "2025-09-21T20:01:59.748Z" }, - { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload-time = "2025-09-21T20:02:01.192Z" }, - { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload-time = "2025-09-21T20:02:02.701Z" }, - { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload-time = "2025-09-21T20:02:04.185Z" }, - { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload-time = "2025-09-21T20:02:06.034Z" }, - { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload-time = "2025-09-21T20:02:07.619Z" }, - { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload-time = "2025-09-21T20:02:10.34Z" }, - { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload-time = "2025-09-21T20:02:12.122Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload-time = "2025-09-21T20:02:13.919Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload-time = "2025-09-21T20:02:15.57Z" }, - { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload-time = "2025-09-21T20:02:17.395Z" }, - { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload-time = "2025-09-21T20:02:18.936Z" }, - { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload-time = "2025-09-21T20:02:20.44Z" }, - { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload-time = "2025-09-21T20:02:22.313Z" }, - { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload-time = "2025-09-21T20:02:24.287Z" }, - { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload-time = "2025-09-21T20:02:26.133Z" }, - { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload-time = "2025-09-21T20:02:27.716Z" }, - { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload-time = "2025-09-21T20:02:29.216Z" }, - { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload-time = "2025-09-21T20:02:31.226Z" }, - { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload-time = "2025-09-21T20:02:32.823Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload-time = "2025-09-21T20:02:34.86Z" }, - { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload-time = "2025-09-21T20:02:37.034Z" }, - { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload-time = "2025-09-21T20:02:39.011Z" }, - { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload-time = "2025-09-21T20:02:40.939Z" }, - { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" }, - { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" }, - { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" }, - { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" }, - { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" }, - { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" }, - { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" }, - { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" }, - { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload-time = "2025-09-21T20:03:01.324Z" }, - { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload-time = "2025-09-21T20:03:03.4Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload-time = "2025-09-21T20:03:05.111Z" }, - { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" }, - { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" }, - { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" }, - { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" }, - { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" }, - { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" }, - { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" }, - { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" }, - { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload-time = "2025-09-21T20:03:24.769Z" }, - { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload-time = "2025-09-21T20:03:26.93Z" }, - { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload-time = "2025-09-21T20:03:28.672Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ad/d1c25053764b4c42eb294aae92ab617d2e4f803397f9c7c8295caa77a260/coverage-7.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fff7b9c3f19957020cac546c70025331113d2e61537f6e2441bc7657913de7d3", size = 217978, upload-time = "2025-09-21T20:03:30.362Z" }, - { url = "https://files.pythonhosted.org/packages/52/2f/b9f9daa39b80ece0b9548bbb723381e29bc664822d9a12c2135f8922c22b/coverage-7.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc91b314cef27742da486d6839b677b3f2793dfe52b51bbbb7cf736d5c29281c", size = 218370, upload-time = "2025-09-21T20:03:32.147Z" }, - { url = "https://files.pythonhosted.org/packages/dd/6e/30d006c3b469e58449650642383dddf1c8fb63d44fdf92994bfd46570695/coverage-7.10.7-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:567f5c155eda8df1d3d439d40a45a6a5f029b429b06648235f1e7e51b522b396", size = 244802, upload-time = "2025-09-21T20:03:33.919Z" }, - { url = "https://files.pythonhosted.org/packages/b0/49/8a070782ce7e6b94ff6a0b6d7c65ba6bc3091d92a92cef4cd4eb0767965c/coverage-7.10.7-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af88deffcc8a4d5974cf2d502251bc3b2db8461f0b66d80a449c33757aa9f40", size = 246625, upload-time = "2025-09-21T20:03:36.09Z" }, - { url = "https://files.pythonhosted.org/packages/6a/92/1c1c5a9e8677ce56d42b97bdaca337b2d4d9ebe703d8c174ede52dbabd5f/coverage-7.10.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7315339eae3b24c2d2fa1ed7d7a38654cba34a13ef19fbcb9425da46d3dc594", size = 248399, upload-time = "2025-09-21T20:03:38.342Z" }, - { url = "https://files.pythonhosted.org/packages/c0/54/b140edee7257e815de7426d5d9846b58505dffc29795fff2dfb7f8a1c5a0/coverage-7.10.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:912e6ebc7a6e4adfdbb1aec371ad04c68854cd3bf3608b3514e7ff9062931d8a", size = 245142, upload-time = "2025-09-21T20:03:40.591Z" }, - { url = "https://files.pythonhosted.org/packages/e4/9e/6d6b8295940b118e8b7083b29226c71f6154f7ff41e9ca431f03de2eac0d/coverage-7.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f49a05acd3dfe1ce9715b657e28d138578bc40126760efb962322c56e9ca344b", size = 246284, upload-time = "2025-09-21T20:03:42.355Z" }, - { url = "https://files.pythonhosted.org/packages/db/e5/5e957ca747d43dbe4d9714358375c7546cb3cb533007b6813fc20fce37ad/coverage-7.10.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cce2109b6219f22ece99db7644b9622f54a4e915dad65660ec435e89a3ea7cc3", size = 244353, upload-time = "2025-09-21T20:03:44.218Z" }, - { url = "https://files.pythonhosted.org/packages/9a/45/540fc5cc92536a1b783b7ef99450bd55a4b3af234aae35a18a339973ce30/coverage-7.10.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:f3c887f96407cea3916294046fc7dab611c2552beadbed4ea901cbc6a40cc7a0", size = 244430, upload-time = "2025-09-21T20:03:46.065Z" }, - { url = "https://files.pythonhosted.org/packages/75/0b/8287b2e5b38c8fe15d7e3398849bb58d382aedc0864ea0fa1820e8630491/coverage-7.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:635adb9a4507c9fd2ed65f39693fa31c9a3ee3a8e6dc64df033e8fdf52a7003f", size = 245311, upload-time = "2025-09-21T20:03:48.19Z" }, - { url = "https://files.pythonhosted.org/packages/0c/1d/29724999984740f0c86d03e6420b942439bf5bd7f54d4382cae386a9d1e9/coverage-7.10.7-cp39-cp39-win32.whl", hash = "sha256:5a02d5a850e2979b0a014c412573953995174743a3f7fa4ea5a6e9a3c5617431", size = 220500, upload-time = "2025-09-21T20:03:50.024Z" }, - { url = "https://files.pythonhosted.org/packages/43/11/4b1e6b129943f905ca54c339f343877b55b365ae2558806c1be4f7476ed5/coverage-7.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:c134869d5ffe34547d14e174c866fd8fe2254918cc0a95e99052903bc1543e07", size = 221408, upload-time = "2025-09-21T20:03:51.803Z" }, - { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, -] - -[package.optional-dependencies] -toml = [ - { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, -] - -[[package]] -name = "coverage" -version = "7.14.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/69/0d2ef01ff4b8fcecd4cba920d11e92fa4f96ae412441d3b56a90a258e69b/coverage-7.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e3680291c4a1d0dadfa84a2c459576a4af5133abb617905714339a0c73138cf", size = 219722, upload-time = "2026-05-26T20:38:14.002Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ae/9afdeaa31b9d9ce98124b6abf8bb49119bf71aecae04f8567c189d91299f/coverage-7.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5274669f37f2343635a347b91a60777621341ab3378e9c6ac9335eee704bddf", size = 220240, upload-time = "2026-05-26T20:38:17.424Z" }, - { url = "https://files.pythonhosted.org/packages/51/69/c998589871df7ea7dba865cc5ee32b5a3e1d47ba6c68ef91104c7c46fa5e/coverage-7.14.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfe5a5fec635799ef33428f1e5e61bafa45a92a96190ba731561ba558ccc214d", size = 246981, upload-time = "2026-05-26T20:38:19.266Z" }, - { url = "https://files.pythonhosted.org/packages/fc/10/1c7d04c13040dac531d21b712bbe08f902e6dd9b58f5d77875c4d030f8f2/coverage-7.14.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:62a9f70b52e0b5a95cfef4a5c5641b06983cadc5e538a3feeb5c00211f523ac2", size = 248812, upload-time = "2026-05-26T20:38:20.75Z" }, - { url = "https://files.pythonhosted.org/packages/c1/65/2a38a4607ef27cadcfbcee034dba5830ae2569f90144a0f4c7dbf47d30b0/coverage-7.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c18ebc343e15be53049b3a2dce38fe82d58f37e20ab9094b3a39c0aa4f6bb47", size = 250675, upload-time = "2026-05-26T20:38:22.159Z" }, - { url = "https://files.pythonhosted.org/packages/c9/a2/a446ed9752a4a59b79e0fb6cbb319f6facb2183045c0725462625e66f87e/coverage-7.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b84ffdf877644e7096aa936991efeed873f7f3df57b9cd001312b7668ab08550", size = 252590, upload-time = "2026-05-26T20:38:23.63Z" }, - { url = "https://files.pythonhosted.org/packages/9e/fd/e81fbd7ba752365546e9842b1cbdaad3d6919d2a522c590aef16a281ec5e/coverage-7.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e854312c4103f2ad4c0dc023b69b77ebfd2c89db5f86c4c94dc2353f9a92167e", size = 247691, upload-time = "2026-05-26T20:38:25.057Z" }, - { url = "https://files.pythonhosted.org/packages/53/35/f3c26fdaae9ea937d154ca4d372e5ea0a4167ff70d36c6074ac2eacb2f83/coverage-7.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c643734307300234fafa36bf2a040a7235f8f177ea1fd6ec1423aea6fb7b929f", size = 248716, upload-time = "2026-05-26T20:38:26.406Z" }, - { url = "https://files.pythonhosted.org/packages/2e/14/940b6c49551fd343e8507ee2b0ba7af5d0aa04ed5bf768285cb7c72a9884/coverage-7.14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84ac9499e48700399a5dd0ea7085b5091961fec52c68d66b4ec0d3cf7f4441b1", size = 246721, upload-time = "2026-05-26T20:38:28.282Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2c/40fc0634186c28292a662dff578866b3913983d6c375a3c2a74020938719/coverage-7.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7f02d09f70776579b926d889a4c9c235070a1f47c40458aeaca563fae5acfdb5", size = 250533, upload-time = "2026-05-26T20:38:29.753Z" }, - { url = "https://files.pythonhosted.org/packages/de/e3/2c26bf1e811f9df991ff2a9bdddebdd13ee0665d564df7d05979f9146297/coverage-7.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ce66d8e46da2bb5ee313a745cbd2e391d319176c1f7a9451bfcd3a2fb920859b", size = 246990, upload-time = "2026-05-26T20:38:31.516Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b0/060260ef56bd92363ebdce0c7095ce422b06e69aae71828efeca473ab1ca/coverage-7.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c912c259304cfb5ee584481cfb7ce1ff932b4d61e6c9140b8f19cb7b5ed82332", size = 247593, upload-time = "2026-05-26T20:38:33.065Z" }, - { url = "https://files.pythonhosted.org/packages/63/f3/501502046efeb0d6d94b5ca54941d95f1184183dd6bdb7f283985783bb4a/coverage-7.14.1-cp310-cp310-win32.whl", hash = "sha256:1238cb94638e610e972c60dac68e813f868dc7d6e982535270558443058d9d59", size = 222330, upload-time = "2026-05-26T20:38:35.36Z" }, - { url = "https://files.pythonhosted.org/packages/a0/5d/1bf99f2c558f128faf7906817ccbdb576ba815d3b41ce2ac1719b70a3663/coverage-7.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:fc459e5d73be2d6332fcfe8dbf3d8994671fe33c700f4565988ecfa511547253", size = 223261, upload-time = "2026-05-26T20:38:37.196Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d7/477ad149490e6cb849f28abea1dabb9c823cea72e7500c81b4240ce619c0/coverage-7.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:478b5bcd63c2e1357c5c7e16c070690df7b07f676b1c114d7b93e533c664309f", size = 219848, upload-time = "2026-05-26T20:38:38.715Z" }, - { url = "https://files.pythonhosted.org/packages/91/82/a5eb47257c50601bb7b9a9d2857c67b7a3a85ad74180eb2c98bb1fbe0ce5/coverage-7.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a24a81f9715ee42ef59a316cc11611c98fe23920f7c81861315c9f3ff4a230f4", size = 220354, upload-time = "2026-05-26T20:38:40.232Z" }, - { url = "https://files.pythonhosted.org/packages/43/8b/78419b5391a5cb706b6544390507e469d83ffc9a8248b02c4011aceb9365/coverage-7.14.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:196a13319ad88d6d8ef5ab489ec4f44ddde2143c0c7d5b27786f6c3ffd56a7e1", size = 250771, upload-time = "2026-05-26T20:38:41.782Z" }, - { url = "https://files.pythonhosted.org/packages/77/63/e77aaacd491182210d639636b7a8bba23ffffa9b82aa3762da9431855fa9/coverage-7.14.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d452fd08b5c72c5167c93e6867b5c08500bd40f2a21e1e854a500550b6cc36f", size = 252683, upload-time = "2026-05-26T20:38:43.305Z" }, - { url = "https://files.pythonhosted.org/packages/65/1c/a022e3cfbec2ac241640003cb3a817e161d9c7f5aa9b49173756cdc03204/coverage-7.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23bf7fa51ac02e07fc7c96849b82946da47ae862dc8f86d183b2a4864fc38129", size = 254791, upload-time = "2026-05-26T20:38:45.361Z" }, - { url = "https://files.pythonhosted.org/packages/61/d6/967e408aca4c1ceb88cb0cc677169110ae7f5995fb5eaf5fb1f5a1bb8f5d/coverage-7.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcaa50684dcaadfa599ac48f81103c756d791cfd85c97203d2217c593d48b860", size = 256748, upload-time = "2026-05-26T20:38:46.91Z" }, - { url = "https://files.pythonhosted.org/packages/b8/be/869188f7fe28638078ec479331ace6dc5f7b40b7153eb616f47ab79404d8/coverage-7.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ea1c034f95c9b056e856b794630b17f9fa3d57e4800ff1e503d3be0f9c9078c", size = 250907, upload-time = "2026-05-26T20:38:48.493Z" }, - { url = "https://files.pythonhosted.org/packages/07/aa/adb7d3b4278d690e68703abcd76ab1b948242e3668d921711551b78f9ddb/coverage-7.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e057326434e441306226fbeb5d1aaf14a2637efe97ba668306635835f32ad7", size = 252483, upload-time = "2026-05-26T20:38:50.074Z" }, - { url = "https://files.pythonhosted.org/packages/43/61/331c74103c62dcb0c4b9b3a0de9a61aca016208b0a90f109592a9f9ecc28/coverage-7.14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59baf88468dbc8d63b1887afd92bda52e40bb1561696e5819670601403810cec", size = 250545, upload-time = "2026-05-26T20:38:51.613Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b6/c5dae3c104d89be04828f61810e6b3473825482e4c288cc4ed04553e08ae/coverage-7.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d75f892b3ab73ba11cab5442cce7b3e168fd64162b16f0e1e0d09c508edef", size = 254310, upload-time = "2026-05-26T20:38:53.503Z" }, - { url = "https://files.pythonhosted.org/packages/ad/a1/2b9d5863e3b83c01ad8199e3c597802fbb3a9dc90b058885804c20296d31/coverage-7.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3a56abc20a472baf0304c455721bc601477440d28ecfde8a03dde79ede07e0df", size = 250266, upload-time = "2026-05-26T20:38:55.414Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5e/0e511fbdb269359be26fe678a1c3fa1f2aa2a01573cc3f54268c8d6d4797/coverage-7.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a3cb83d1552c0cd1b4906655b6a33fd4a8473229633a901c6b73bf86914dee9", size = 251174, upload-time = "2026-05-26T20:38:57.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/10/e55307b622b3dd9671cb321824502dc10f93e72f2802b9946159a8edadeb/coverage-7.14.1-cp311-cp311-win32.whl", hash = "sha256:10274a1fbeb8ec5d72966e17bb198a3104257aca4ac09d98667c5f8aca8c8548", size = 222354, upload-time = "2026-05-26T20:38:58.727Z" }, - { url = "https://files.pythonhosted.org/packages/71/cf/107421693cfb71e4f1ca5bf70443f64d4161878068d07a3e51c7ad21d17b/coverage-7.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:87ebdf787d4888e3f3f2d523eadc6e18c6d18c6d0eb173801a189641627fb37e", size = 223290, upload-time = "2026-05-26T20:39:00.413Z" }, - { url = "https://files.pythonhosted.org/packages/b8/1d/3e3644585eb29e9dafefb19555078529a4d7cce12bd21929664eea989277/coverage-7.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:dd34767fa19848d35659ffc0a75314f58c7af3f1cd87ec521e8292a1238398a3", size = 221953, upload-time = "2026-05-26T20:39:02.159Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b7/bdbb725ba02c5b42825b200c940f38b7a54fcad24627b7192f78f8110d76/coverage-7.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a06c76364a9360e33d6d23769aefdf7f66f38e2ffb60ceb1baaa4989d83b695c", size = 220022, upload-time = "2026-05-26T20:39:03.702Z" }, - { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, - { url = "https://files.pythonhosted.org/packages/de/72/de048c4a25e13bce59ac6a339351c10bdf2515e07459afcdaf04dc3143a2/coverage-7.14.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:84b535f00655ecafe1d929d1fb00ed5d6fa3051ea643ab2c161a3887b86f294b", size = 251888, upload-time = "2026-05-26T20:39:07.367Z" }, - { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, - { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, - { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, - { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, - { url = "https://files.pythonhosted.org/packages/99/6f/ca6ad067364b337ef997802115e7ecad2abd2248b05471464b0dea02b4d4/coverage-7.14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e471bc5769ff073b058cfadb0d736b56ce067c8560eabeb0da88462df98c23e7", size = 251803, upload-time = "2026-05-26T20:39:17.537Z" }, - { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, - { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, - { url = "https://files.pythonhosted.org/packages/34/62/70a9024672a5f6910517d9628c52c9afbdd3cf8f46426af52bb148a56fff/coverage-7.14.1-cp312-cp312-win32.whl", hash = "sha256:4a28fd227808366b196a75476dced2eb35b351d6766ba9c858dc93319e87f4f1", size = 222567, upload-time = "2026-05-26T20:39:24.868Z" }, - { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e", size = 223372, upload-time = "2026-05-26T20:39:26.603Z" }, - { url = "https://files.pythonhosted.org/packages/ae/ba/b44d472022f620d289d95fa830143235c0c36461c6f2437ea8d51e5481ed/coverage-7.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:99cd41ff91afd94896fea3bc002706b6ae4ce95727d06e4a0f39c0a8d8bd8b1a", size = 221989, upload-time = "2026-05-26T20:39:28.242Z" }, - { url = "https://files.pythonhosted.org/packages/8a/9e/5f6d56327c62b185225d145191c607e07515294a0aa6338e58805cd4a5ac/coverage-7.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:be9f2c802dcfce3f71298303aa5dad0dce440a76c52f2f60dacd8656dab78793", size = 220044, upload-time = "2026-05-26T20:39:29.902Z" }, - { url = "https://files.pythonhosted.org/packages/75/92/e82aca356744cbbc0f77a0b623e38918c1872361963413a3bab5d0340393/coverage-7.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6223a72fd0e4c7156353ec0f08a5f93623e1d3034d0e2683b9bb8ea674131b1d", size = 220412, upload-time = "2026-05-26T20:39:31.561Z" }, - { url = "https://files.pythonhosted.org/packages/27/c9/385bde0bf7ed0f4bf3a7ee5367060a86b5d218718cfd6fb943c0f836b34f/coverage-7.14.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7279d2110a28cebc738b6459ecda2771735a4c18465fbbd36b3288fe5ed92247", size = 251412, upload-time = "2026-05-26T20:39:33.337Z" }, - { url = "https://files.pythonhosted.org/packages/51/8c/23faf6a2343a0d17f960a4bd56c43bc7eb4cf312f774dd6ceebd82c7d8fc/coverage-7.14.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9eeb3fcbc13ba40dfbdb22d01d196a28e9cef9ed4c29b60061a1e0e823a9929d", size = 254008, upload-time = "2026-05-26T20:39:35.009Z" }, - { url = "https://files.pythonhosted.org/packages/42/06/36f4aa9ca8a815e6036156e80706a67828bb97bd826948244f6996dda957/coverage-7.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f0cfc27c539f07cf5c0a4cfe211d0b6cae039f8f40526dbaa71944e64b50a7b", size = 255241, upload-time = "2026-05-26T20:39:36.71Z" }, - { url = "https://files.pythonhosted.org/packages/ca/79/95266316352f90f6b1c6736bb413302edfde2453fb32422d3911642691b3/coverage-7.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:221c70f316241a78e77e607c227cefc8808d4e08f28d99c04f35694690e940be", size = 257373, upload-time = "2026-05-26T20:39:38.412Z" }, - { url = "https://files.pythonhosted.org/packages/e3/9c/58316d1f66c488b5fca8a0eb3e98348807813efa8a0d0833b9021be27488/coverage-7.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da028256b04ec30e5e0114b6f76172938c313991f0a2d3d894271315cf5d5e43", size = 251635, upload-time = "2026-05-26T20:39:40.268Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5a/ca2398a568e16fed7bb713e84ba3603a7164fb65779abe645c565ec890d5/coverage-7.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76a085d7005236a767e3426148b2c407e53ad61695c562f8a81da2d373324901", size = 253373, upload-time = "2026-05-26T20:39:42.145Z" }, - { url = "https://files.pythonhosted.org/packages/6e/2c/0396562c32deaebe7be51d865b3a41e9a87d7561acafe1a28f53b07e019a/coverage-7.14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b553d04b5e778a8e56d57eb134aff42a92718ecba45e79c4764ecfa40efd92ff", size = 251341, upload-time = "2026-05-26T20:39:43.907Z" }, - { url = "https://files.pythonhosted.org/packages/fd/8f/a94f9221184c9cae1ee115820e3798e48b6b17777a9f19e46fb9a0c8dc74/coverage-7.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:46f714d2fb8ae2f4f29f23ada7f1e79b759fff5a70f94a1dac23af204c3ec9e4", size = 255497, upload-time = "2026-05-26T20:39:46.166Z" }, - { url = "https://files.pythonhosted.org/packages/71/69/505d70e47db1eaebcd002c39759707621ef184cd6b1ae084d9f41293f323/coverage-7.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1896f5e19ff3f0431c7ce2172adc54890fd97f86b59ced8ca1649145d9ffe35d", size = 251159, upload-time = "2026-05-26T20:39:48.03Z" }, - { url = "https://files.pythonhosted.org/packages/e0/aa/58681c383aa33a9d2ed40a02d7a22fbf780d1fa4d575396365777828198c/coverage-7.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:62fd185ef9df3c33d1c8178c5af105f762afbad96038de9a4ae100aa6297ca33", size = 252934, upload-time = "2026-05-26T20:39:49.872Z" }, - { url = "https://files.pythonhosted.org/packages/eb/fd/11c928cd6bdffc7074bb5965c173d9ebf517fb00205e1da524b98d29ef92/coverage-7.14.1-cp313-cp313-win32.whl", hash = "sha256:ab4af6352741a604c431c6072fce5bee33bf0f20dc7a56618d6bf6bb89e9810c", size = 222584, upload-time = "2026-05-26T20:39:51.68Z" }, - { url = "https://files.pythonhosted.org/packages/6f/92/fb416fc26d340dcba19518c418d6048e913186e17243982c5e435e41fa7a/coverage-7.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:7af486dabe8954d03b087f0021540897afe084f04e16ff5579e08cc46f871416", size = 223394, upload-time = "2026-05-26T20:39:53.472Z" }, - { url = "https://files.pythonhosted.org/packages/73/c6/02d56e3867972f77d5036de924643f26c056e848f00452cafb4dbc3c29b4/coverage-7.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:2224f89ffd0c5605ccce1ed7a584da162bc7c55f601ab1c946bc9de31a486b42", size = 222015, upload-time = "2026-05-26T20:39:55.374Z" }, - { url = "https://files.pythonhosted.org/packages/4d/9e/fcc77914050df73f7662fa1f00902774c79c075a8388ab334074574bf77e/coverage-7.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de286598cc65d2b489411174b1faec2f5a7775fb3201fd925db2a76b4030f37d", size = 220733, upload-time = "2026-05-26T20:39:57.189Z" }, - { url = "https://files.pythonhosted.org/packages/f7/67/2963cbdaf5cbadec44efa3a1e39eaa1f02df4079585f05387607a221e126/coverage-7.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:042c46ded7c288aeb07cf14a28b6c1e10b78fcba40171c3fa1e939377eeef0b5", size = 221086, upload-time = "2026-05-26T20:39:59.019Z" }, - { url = "https://files.pythonhosted.org/packages/c8/c5/8701645574e11881f2f47d8930f98bc48b5d43b25eb5b4430dfc4a2f9f48/coverage-7.14.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f4ddbe407477f04c45115d1a4e5bc480f753553b534d338d4c3358b1cdd0ea52", size = 262381, upload-time = "2026-05-26T20:40:00.822Z" }, - { url = "https://files.pythonhosted.org/packages/7c/28/7a64d73598263e0c5abd5084211a8474488d31b3c552ff531c719dfcff62/coverage-7.14.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d13e6725992e2d2fd7d81d4f5241952d13740121dfd501da09201be39b2c003a", size = 264458, upload-time = "2026-05-26T20:40:02.506Z" }, - { url = "https://files.pythonhosted.org/packages/fa/d8/4969179db9f7eb4df218e69540adf829d1c835f59452513d065d15446802/coverage-7.14.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f747dc8edcfe740130f28f32f3995e955494285717e86ee25af51db2219df08a", size = 266884, upload-time = "2026-05-26T20:40:04.421Z" }, - { url = "https://files.pythonhosted.org/packages/a6/78/a45d5794dbc9bafd97afc96a4377c86c7820d78b6cf51b89bc1d4e919275/coverage-7.14.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced2f09ef276fd58611a1ef502164ad266d2b75174e5a40cabbdb4033f9f6cf2", size = 268022, upload-time = "2026-05-26T20:40:06.298Z" }, - { url = "https://files.pythonhosted.org/packages/21/cb/4f5e354e9e3e67af96bd4e57113e6db6b22298c7168b13eec408a549903d/coverage-7.14.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b84800013769a78ccb9ef4659402e26d06867e337b61ec365f77ad008adea80e", size = 261631, upload-time = "2026-05-26T20:40:08.226Z" }, - { url = "https://files.pythonhosted.org/packages/ec/49/eced49af4cb996d5d8b7e94e736175c513e4facd3398507b89892b4326d8/coverage-7.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ea8cd6ca0ee9f616aaef3afc6882e32c2cbf18b00d96313ffd76af650574034d", size = 264443, upload-time = "2026-05-26T20:40:10.137Z" }, - { url = "https://files.pythonhosted.org/packages/f1/d8/5603a88a7c5913a6b54f6cb1a8c46f7b39cbb30f27cd3f492908da09b2d7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:aa5e304a873fabddc11e484e9b6b738bd38bd7bed17b09aa84eecf5332e8b8bb", size = 262069, upload-time = "2026-05-26T20:40:11.999Z" }, - { url = "https://files.pythonhosted.org/packages/f0/59/2ae3cb79da554a06c8619d6c88ea19dd1e4aed4b834b6a83bb1fa243bdc5/coverage-7.14.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1c5215be81035e629d5bc756650634d0bf31991038db7a0eccb90f025ce16d", size = 265780, upload-time = "2026-05-26T20:40:13.858Z" }, - { url = "https://files.pythonhosted.org/packages/af/5f/b130c1dc999031f2648bd25317fbce505ad8d5562079b4ed81e736a84967/coverage-7.14.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:79058c47dae6788504b5effb319961bcd72d7240551464b91d474bc0ed186d69", size = 260970, upload-time = "2026-05-26T20:40:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/87/d1/ec13ccddeb48ec963bdfa72a11224bac2584bd045ba13beca82f8113e9c7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:370c5afae3fa0658e11694a32b24c2778f6bc2d17718121f94ee185e69f26b54", size = 263157, upload-time = "2026-05-26T20:40:18.382Z" }, - { url = "https://files.pythonhosted.org/packages/cf/c2/cd91ead503045161092d3845f7bb95ea2f25131ce96d3e314dd835d91b9c/coverage-7.14.1-cp313-cp313t-win32.whl", hash = "sha256:3758dd0a7f1fa57365ef2e781df0f0731d38b6e3772259d13dae4bd8a958d4b1", size = 223259, upload-time = "2026-05-26T20:40:20.381Z" }, - { url = "https://files.pythonhosted.org/packages/71/9f/1e28d97e6bd2c76b07f38b7c02870f1371255ff6717f54eca578fcbbdd0e/coverage-7.14.1-cp313-cp313t-win_amd64.whl", hash = "sha256:6ff665fb023a77386fe11685190cee1f60a7d635994a30d9b0a061533d470fce", size = 224320, upload-time = "2026-05-26T20:40:22.316Z" }, - { url = "https://files.pythonhosted.org/packages/a9/e0/d936e908f0e1efa55e52b91e01b52f1055cef5e1ab2718493390ed8e2fb8/coverage-7.14.1-cp313-cp313t-win_arm64.whl", hash = "sha256:17a5a241e5997621a956a7f402a7433ef4221e5152809b785bec79e2323799f1", size = 222577, upload-time = "2026-05-26T20:40:24.894Z" }, - { url = "https://files.pythonhosted.org/packages/d6/34/fc2f101b151af3799a101f0550b0454aa008afdc0add677394ec4aa8ea10/coverage-7.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d5ed429d0b8edaac649e889b4ffcedb6c80b06629a3f93050e3dddfb99235bee", size = 220091, upload-time = "2026-05-26T20:40:27.249Z" }, - { url = "https://files.pythonhosted.org/packages/3d/a7/1ebae2ab5b961b5c79bb09fe7b3ac99edb190d8be4a8c510b2cf66f46468/coverage-7.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8011224a62280e50dab346960c03cf47aca1a1e09e608c0fb33fd6e0cc8e9500", size = 220421, upload-time = "2026-05-26T20:40:30.084Z" }, - { url = "https://files.pythonhosted.org/packages/5e/90/92aca9cf0acc95123c96cd1eb1f08917897a7f5dee01e15738922971ec31/coverage-7.14.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:12c42ec1e14f553c4f817e989365982e646e27211f10a0f717855b94a79c8906", size = 251466, upload-time = "2026-05-26T20:40:32.542Z" }, - { url = "https://files.pythonhosted.org/packages/26/2b/78048cbe3b999f6cbf9cc0d90abba6a88a3e0863a8c1c6cbc762f3f8802f/coverage-7.14.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:06144cd511cf2624873a035c5069cf297144f6e77a73ee3d7a55b605ec5efb42", size = 253973, upload-time = "2026-05-26T20:40:34.473Z" }, - { url = "https://files.pythonhosted.org/packages/8e/21/c2e33b29d1cfde484a19d437afc343c6cd30b08d78cbbf9f5aff14e57b2b/coverage-7.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a311d8e1da24be5c1ccf85cbfb06315dbaa1703d5a1eab3f6432c72b837917c8", size = 255318, upload-time = "2026-05-26T20:40:38.154Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ee/aad2f108d63b769121005302f16bf66db8625c88ceaba466942e09a2607e/coverage-7.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c79cead5b5bc584d9c71451cb984d0e3a84e0c0937379c8efcbf27c8d661b851", size = 257633, upload-time = "2026-05-26T20:40:40.164Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f8/11a2c29b4fd76d9849f81d0bb812ec0017a9396df3217214e38934a8c837/coverage-7.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dcbf65f1f66a26cdd88c35cf68fb4729c5d1cd2e88added72420541dfb212034", size = 251488, upload-time = "2026-05-26T20:40:42.631Z" }, - { url = "https://files.pythonhosted.org/packages/c9/b8/9a5820de4b8ac2b71d85e3b5fb49108d7469c665f0e2ad0dd7569023e305/coverage-7.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fd86572566fb40189a8260446158235159bc7a82dfbc87a3b39cf4fb57fcec1c", size = 253329, upload-time = "2026-05-26T20:40:45.208Z" }, - { url = "https://files.pythonhosted.org/packages/6b/ff/f33e4823667e27548e8fd8df44217515303f9808d0ff29817db56f87d990/coverage-7.14.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7771b601718fdde84832c3a434ca9bbf4ae9adbc49d84198b4110700c3c77c36", size = 251291, upload-time = "2026-05-26T20:40:47.502Z" }, - { url = "https://files.pythonhosted.org/packages/68/9b/489db0ebb209054766b90a9014a45f6d26eb724c02ec21311c3733b5a644/coverage-7.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:39b21e212c55af06fa375e3dbf90a8a8e38792f3a910c580066d23563830ddd5", size = 255564, upload-time = "2026-05-26T20:40:49.372Z" }, - { url = "https://files.pythonhosted.org/packages/27/b5/16bc2d4c2409b23c7737edb68c83bc89e345f378050549fe1d75ac7d34d5/coverage-7.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f2302660e32562a532b442480121aef8aa61a5bdb20b30bf0adab29f10a5a4b4", size = 251107, upload-time = "2026-05-26T20:40:51.677Z" }, - { url = "https://files.pythonhosted.org/packages/7d/0c/2629997469a00cd069d588a41c9dc887610f2775ae89d250c4791e65272a/coverage-7.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:03a6f93c1ec3b7f2e77b5dbcc5573a2c21f12529a5c6bbe0f16f72303cc2fa4d", size = 252764, upload-time = "2026-05-26T20:40:54.267Z" }, - { url = "https://files.pythonhosted.org/packages/d2/ee/f78d63c8f079e0d7211c7e2401fa17e311514534ba61bae03e4b287ce4ab/coverage-7.14.1-cp314-cp314-win32.whl", hash = "sha256:8a3ce026d73290f42f08dafecbd82c193a74df280461fbf97300fec51fd133ee", size = 222837, upload-time = "2026-05-26T20:40:56.496Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b9/be539854f93a70dfbeec69117f33ec70dc42ff0b65b5b07ab8d40d04228e/coverage-7.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:114c95ef29302423b87d159075805f4ab973254a2638a5d7d046c94887cc87d7", size = 223650, upload-time = "2026-05-26T20:40:58.351Z" }, - { url = "https://files.pythonhosted.org/packages/fe/9e/24e2842fef40f35ac82ba3a7719c8023d011bf3bf652d0675316a9d088a1/coverage-7.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:a07891c3f4805442b31b71e84ba3cf29ed1aa9a428284e06deeb4b23e5b46343", size = 222218, upload-time = "2026-05-26T20:41:00.321Z" }, - { url = "https://files.pythonhosted.org/packages/0a/1d/ac0a9df5fe31c1e8bdd658074905fc12844a05c1a7e3fdb8417e97c31e23/coverage-7.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1101a5ebb083aecb625ebb6209d4105b58f647b093cb2dc8122d7b33f743cfe1", size = 220822, upload-time = "2026-05-26T20:41:02.281Z" }, - { url = "https://files.pythonhosted.org/packages/32/cf/f964fd9aff20323f9f1a726c97135f8a76bcd87b92dad141a456a43f3c64/coverage-7.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:851b9e1e4e8a4608e77c79714b2e77c0970d2ed7202a05e92ae407817481887b", size = 221084, upload-time = "2026-05-26T20:41:04.593Z" }, - { url = "https://files.pythonhosted.org/packages/d8/5e/7e5ef2aba844de2b80d678619fcf0841b42e3f37f16411226f3fe4c1016f/coverage-7.14.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d5b89cdfb2ee051b71e8c3c70bd81a9eff81100f736a269136fe1a68efe00474", size = 262454, upload-time = "2026-05-26T20:41:06.641Z" }, - { url = "https://files.pythonhosted.org/packages/64/62/75809bded87015cc4935524218a2a8ed8dd1a8498bfed30a2f4f7a4b4d34/coverage-7.14.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0177614a0370f227888b4e436a7c55686d6a9f90eb1ade2b624ba685a1686e86", size = 264578, upload-time = "2026-05-26T20:41:08.556Z" }, - { url = "https://files.pythonhosted.org/packages/f3/42/d33392dc14633525012d2d504fa1a33b05538bf535f5c1d64675e5754b78/coverage-7.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d69af5dea2de76fc485a83032a630523f985198b7e25be901ec60181587b01e", size = 266981, upload-time = "2026-05-26T20:41:10.824Z" }, - { url = "https://files.pythonhosted.org/packages/2a/49/0157c4428c2aca7f1e09d5565930586fd5ae36f1655f08b0daa7cf1fcae1/coverage-7.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:35ab22d91de736e8966b980dc355cbcdd2c6dbbcfe275f9a2991bc8a91b3df65", size = 268112, upload-time = "2026-05-26T20:41:12.966Z" }, - { url = "https://files.pythonhosted.org/packages/96/26/86b9ce71f4092b1ed325ce1421698081df1286b833400b6836912834d6e0/coverage-7.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:357d4e32935c36588aaba057d734fa32428c360c9fc2e4442afbf1b646beee6e", size = 261558, upload-time = "2026-05-26T20:41:15Z" }, - { url = "https://files.pythonhosted.org/packages/20/4c/c311210c5472cf5401d8422b0d7812cdd520f24417673afabda6c323faca/coverage-7.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:51bd64741cc6fa065abd300ede1afe5a5291ece9c31da8b24884deda48bcc3f8", size = 264447, upload-time = "2026-05-26T20:41:17.369Z" }, - { url = "https://files.pythonhosted.org/packages/fb/71/59513f8710ed3e6b0ac0a050a5b7e977bb9c9e880354863b5d00d8809256/coverage-7.14.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9132cd363a68a4c3daa7c8704a654b1e39d3360f6f5b8ddd470608a945236c07", size = 262048, upload-time = "2026-05-26T20:41:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/84/8d/bceed32dc494f5bbf50f775cd2e78ca814953942b5ea28d3c1c3ac316f14/coverage-7.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07c6290b1697b862c0478eab545eec949a0d0e4d6d03497f446d706da3b4f2de", size = 265781, upload-time = "2026-05-26T20:41:21.559Z" }, - { url = "https://files.pythonhosted.org/packages/e7/c5/9348fe40dbfd4991aaf78df2c6c3098bfb2cc834d1fd362a64b4efef855a/coverage-7.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5ea0c297e27133853b4d8a3eb799bff5a2dbd9f2f41537a240d337ac9b4df890", size = 260896, upload-time = "2026-05-26T20:41:23.428Z" }, - { url = "https://files.pythonhosted.org/packages/ca/92/1ea0f03929da7cf87206b1fa24f4c8e9c158be0455481af29ec0a1f3503f/coverage-7.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:01b7733daad0237daa01ef80fe2dfceffc911e6a17fa7b55d14aa8214eaaaecd", size = 263214, upload-time = "2026-05-26T20:41:25.419Z" }, - { url = "https://files.pythonhosted.org/packages/f6/a9/b2493c054c0e01a643266742ab45e15744e60743f9260cd930c7142b1124/coverage-7.14.1-cp314-cp314t-win32.whl", hash = "sha256:6adc5a36984624a70bf11d7184e20fa0a49aa7c47ffab43804106a1a695ea22e", size = 223624, upload-time = "2026-05-26T20:41:27.795Z" }, - { url = "https://files.pythonhosted.org/packages/fc/bd/3e1e6a57fccd2d7c83fcdf338e93ba98eb85c6e877dd34731ac585375490/coverage-7.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:ddf799247318f34dbcd2efa8c95a8d0642674e926bb1774cf9b63dfd2a389d1c", size = 224728, upload-time = "2026-05-26T20:41:30.098Z" }, - { url = "https://files.pythonhosted.org/packages/bb/d7/31066cf1d2f0c6c797fce911bcfa01dd35642dc6da992a950256097c5860/coverage-7.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:145986fe66647eb489f18d9a997567a3fd358584c4b5a808769113abc07466af", size = 222752, upload-time = "2026-05-26T20:41:32.123Z" }, - { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, -] - -[package.optional-dependencies] -toml = [ - { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, -] - -[[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, -] - -[[package]] -name = "importlib-metadata" -version = "6.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "zipp", marker = "python_full_version < '3.8'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569, upload-time = "2023-06-18T21:44:35.024Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4/importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5", size = 22934, upload-time = "2023-06-18T21:44:33.441Z" }, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646, upload-time = "2023-01-07T11:08:11.254Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload-time = "2023-01-07T11:08:09.864Z" }, -] - -[[package]] -name = "iniconfig" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.9.*'", - "python_full_version == '3.8.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, -] - -[[package]] -name = "iniconfig" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433, upload-time = "2023-02-04T12:11:27.157Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695, upload-time = "2023-02-04T12:11:25.002Z" }, -] - -[[package]] -name = "mypy-extensions" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", - "python_full_version == '3.8.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, -] - -[[package]] -name = "packaging" -version = "24.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -sdist = { url = "https://files.pythonhosted.org/packages/ee/b5/b43a27ac7472e1818c4bafd44430e69605baefe1f34440593e0332ec8b4d/packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9", size = 147882, upload-time = "2024-03-10T09:39:28.33Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", size = 53488, upload-time = "2024-03-10T09:39:25.947Z" }, -] - -[[package]] -name = "packaging" -version = "26.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", - "python_full_version == '3.8.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, -] - -[[package]] -name = "pathspec" -version = "0.11.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -sdist = { url = "https://files.pythonhosted.org/packages/a0/2a/bd167cdf116d4f3539caaa4c332752aac0b3a0cc0174cdb302ee68933e81/pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3", size = 47032, upload-time = "2023-07-29T01:05:04.481Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/2a/9b1be29146139ef459188f5e420a66e835dda921208db600b7037093891f/pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", size = 29603, upload-time = "2023-07-29T01:05:02.656Z" }, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.8.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, -] - -[[package]] -name = "pathspec" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -dependencies = [ - { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/31/28/e40d24d2e2eb23135f8533ad33d582359c7825623b1e022f9d460def7c05/platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731", size = 19914, upload-time = "2023-11-10T16:43:08.316Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/31/16/70be3b725073035aa5fc3229321d06e22e73e3e09f6af78dcfdf16c7636c/platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b", size = 17562, upload-time = "2023-11-10T16:43:06.949Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.3.6" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.8.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302, upload-time = "2024-09-17T19:06:50.688Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439, upload-time = "2024-09-17T19:06:49.212Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.4.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.9.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.10.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, -] - -[[package]] -name = "pluggy" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -dependencies = [ - { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8a/42/8f2833655a29c4e9cb52ee8a2be04ceac61bcff4a680fb338cbd3d1e322d/pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3", size = 61613, upload-time = "2023-06-21T09:12:28.745Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/32/4a79112b8b87b21450b066e102d6608907f4c885ed7b04c3fdb085d4d6ae/pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", size = 17695, upload-time = "2023-06-21T09:12:27.397Z" }, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.8.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, -] - -[[package]] -name = "pluggy" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, -] - -[[package]] -name = "probing" -version = "0.2.5" -source = { editable = "." } - -[package.optional-dependencies] -dev = [ - { name = "black", version = "23.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "black", version = "24.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "black", version = "25.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "black", version = "26.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "coverage", version = "7.2.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "coverage", version = "7.14.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pytest", version = "7.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pytest-cov", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "pytest-cov", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "pytest-cov", version = "7.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "ruff" }, -] -test = [ - { name = "coverage", version = "7.2.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "coverage", version = "7.14.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pytest", version = "7.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pytest-cov", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "pytest-cov", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "pytest-cov", version = "7.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, -] - -[package.metadata] -requires-dist = [ - { name = "black", marker = "python_full_version >= '3.8' and extra == 'dev'", specifier = ">=24.0" }, - { name = "black", marker = "python_full_version < '3.8' and extra == 'dev'", specifier = "<24.0" }, - { name = "coverage", marker = "extra == 'dev'", specifier = ">=7.0" }, - { name = "coverage", marker = "extra == 'test'", specifier = ">=7.0" }, - { name = "pytest", marker = "python_full_version >= '3.8' and extra == 'dev'", specifier = ">=8.0" }, - { name = "pytest", marker = "python_full_version >= '3.8' and extra == 'test'", specifier = ">=8.0" }, - { name = "pytest", marker = "python_full_version < '3.8' and extra == 'dev'", specifier = "<8.0" }, - { name = "pytest", marker = "python_full_version < '3.8' and extra == 'test'", specifier = "<8.0" }, - { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0" }, - { name = "pytest-cov", marker = "extra == 'test'", specifier = ">=4.0" }, - { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.1.0" }, -] -provides-extras = ["test", "dev"] - -[[package]] -name = "pygments" -version = "2.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, -] - -[[package]] -name = "pytest" -version = "7.4.4" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version < '3.8' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.8'" }, - { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, - { name = "iniconfig", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "pluggy", version = "1.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", size = 1357116, upload-time = "2023-12-31T12:00:18.035Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/ff/f6e8b8f39e08547faece4bd80f89d5a8de68a38b2d179cc1c4490ffa3286/pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8", size = 325287, upload-time = "2023-12-31T12:00:13.963Z" }, -] - -[[package]] -name = "pytest" -version = "8.3.5" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.8.*'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version == '3.8.*' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version == '3.8.*'" }, - { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "pluggy", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, -] - -[[package]] -name = "pytest" -version = "8.4.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.9.*'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version == '3.9.*' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version == '3.9.*'" }, - { name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "pygments", marker = "python_full_version == '3.9.*'" }, - { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, -] - -[[package]] -name = "pytest" -version = "9.1.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, - { name = "iniconfig", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "packaging", version = "26.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pygments", marker = "python_full_version >= '3.10'" }, - { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, -] - -[[package]] -name = "pytest-cov" -version = "4.1.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -dependencies = [ - { name = "coverage", version = "7.2.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version < '3.8'" }, - { name = "pytest", version = "7.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7a/15/da3df99fd551507694a9b01f512a2f6cf1254f33601605843c3775f39460/pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", size = 63245, upload-time = "2023-05-24T18:44:56.845Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/4b/8b78d126e275efa2379b1c2e09dc52cf70df16fc3b90613ef82531499d73/pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a", size = 21949, upload-time = "2023-05-24T18:44:54.079Z" }, -] - -[[package]] -name = "pytest-cov" -version = "5.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.8.*'", -] -dependencies = [ - { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version == '3.8.*'" }, - { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042, upload-time = "2024-03-24T20:16:34.856Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", size = 21990, upload-time = "2024-03-24T20:16:32.444Z" }, -] - -[[package]] -name = "pytest-cov" -version = "7.1.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", -] -dependencies = [ - { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version == '3.9.*'" }, - { name = "coverage", version = "7.14.1", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version >= '3.10'" }, - { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, -] - -[[package]] -name = "pytokens" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/24/f206113e05cb8ef51b3850e7ef88f20da6f4bf932190ceb48bd3da103e10/pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5", size = 161522, upload-time = "2026-01-30T01:02:50.393Z" }, - { url = "https://files.pythonhosted.org/packages/d4/e9/06a6bf1b90c2ed81a9c7d2544232fe5d2891d1cd480e8a1809ca354a8eb2/pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe", size = 246945, upload-time = "2026-01-30T01:02:52.399Z" }, - { url = "https://files.pythonhosted.org/packages/69/66/f6fb1007a4c3d8b682d5d65b7c1fb33257587a5f782647091e3408abe0b8/pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c", size = 259525, upload-time = "2026-01-30T01:02:53.737Z" }, - { url = "https://files.pythonhosted.org/packages/04/92/086f89b4d622a18418bac74ab5db7f68cf0c21cf7cc92de6c7b919d76c88/pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7", size = 262693, upload-time = "2026-01-30T01:02:54.871Z" }, - { url = "https://files.pythonhosted.org/packages/b4/7b/8b31c347cf94a3f900bdde750b2e9131575a61fdb620d3d3c75832262137/pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2", size = 103567, upload-time = "2026-01-30T01:02:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/3d/92/790ebe03f07b57e53b10884c329b9a1a308648fc083a6d4a39a10a28c8fc/pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440", size = 160864, upload-time = "2026-01-30T01:02:57.882Z" }, - { url = "https://files.pythonhosted.org/packages/13/25/a4f555281d975bfdd1eba731450e2fe3a95870274da73fb12c40aeae7625/pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc", size = 248565, upload-time = "2026-01-30T01:02:59.912Z" }, - { url = "https://files.pythonhosted.org/packages/17/50/bc0394b4ad5b1601be22fa43652173d47e4c9efbf0044c62e9a59b747c56/pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d", size = 260824, upload-time = "2026-01-30T01:03:01.471Z" }, - { url = "https://files.pythonhosted.org/packages/4e/54/3e04f9d92a4be4fc6c80016bc396b923d2a6933ae94b5f557c939c460ee0/pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16", size = 264075, upload-time = "2026-01-30T01:03:04.143Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1b/44b0326cb5470a4375f37988aea5d61b5cc52407143303015ebee94abfd6/pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6", size = 103323, upload-time = "2026-01-30T01:03:05.412Z" }, - { url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", size = 160663, upload-time = "2026-01-30T01:03:06.473Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", size = 255626, upload-time = "2026-01-30T01:03:08.177Z" }, - { url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", size = 269779, upload-time = "2026-01-30T01:03:09.756Z" }, - { url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", size = 268076, upload-time = "2026-01-30T01:03:10.957Z" }, - { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", size = 103552, upload-time = "2026-01-30T01:03:12.066Z" }, - { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, - { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, - { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, - { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, - { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, - { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, - { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, - { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, - { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, - { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, - { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, - { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, - { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, - { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, - { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, - { url = "https://files.pythonhosted.org/packages/4a/08/968c22e06ab6570788964e2d5a702db9a3816e20ffde380b2b1385541d64/pytokens-0.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc", size = 154847, upload-time = "2026-01-30T01:03:32.268Z" }, - { url = "https://files.pythonhosted.org/packages/09/2b/2061bb4b300e6921f7968724b185237627a8a3dc4f311e34079dfadf9b65/pytokens-0.4.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009", size = 238610, upload-time = "2026-01-30T01:03:33.809Z" }, - { url = "https://files.pythonhosted.org/packages/1e/64/abf6e43523ea9b4aea69bfe22788a518806741107238674e5c0fb6fc8dc1/pytokens-0.4.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1", size = 252493, upload-time = "2026-01-30T01:03:35.715Z" }, - { url = "https://files.pythonhosted.org/packages/dc/fb/bcb6784c87d1de182afb284f37b07bc172eebec91ddc20e83aec767e4963/pytokens-0.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6", size = 255651, upload-time = "2026-01-30T01:03:36.961Z" }, - { url = "https://files.pythonhosted.org/packages/1a/0c/0c33752be2209498661903f6f240779aea5c9adbd85d22336ce3f7718e81/pytokens-0.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037", size = 104346, upload-time = "2026-01-30T01:03:38.069Z" }, - { url = "https://files.pythonhosted.org/packages/51/2a/f125667ce48105bf1f4e50e03cfa7b24b8c4f47684d7f1cf4dcb6f6b1c15/pytokens-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3", size = 161464, upload-time = "2026-01-30T01:03:39.11Z" }, - { url = "https://files.pythonhosted.org/packages/40/df/065a30790a7ca6bb48ad9018dd44668ed9135610ebf56a2a4cb8e513fd5c/pytokens-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1", size = 246159, upload-time = "2026-01-30T01:03:40.131Z" }, - { url = "https://files.pythonhosted.org/packages/a5/1c/fd09976a7e04960dabc07ab0e0072c7813d566ec67d5490a4c600683c158/pytokens-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db", size = 259120, upload-time = "2026-01-30T01:03:41.233Z" }, - { url = "https://files.pythonhosted.org/packages/52/49/59fdc6fc5a390ae9f308eadeb97dfc70fc2d804ffc49dd39fc97604622ec/pytokens-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1", size = 262196, upload-time = "2026-01-30T01:03:42.696Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e7/d6734dccf0080e3dc00a55b0827ab5af30c886f8bc127bbc04bc3445daec/pytokens-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a", size = 103510, upload-time = "2026-01-30T01:03:43.915Z" }, - { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, -] - -[[package]] -name = "ruff" -version = "0.15.18" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/74/98/1295ad5a5aa9bc85bdcdfa5d82fe7b49c61af5657df4f227637ff9de0da6/ruff-0.15.18.tar.gz", hash = "sha256:2698a964c70e8bf402dcb99c8810472d270d141e7aa8c4e13599fd52033a2f33", size = 4761437, upload-time = "2026-06-18T18:25:39.224Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/d0/686e984941269621e2be72612d5c1e461f8f7b38415a2a7d7a81c8ae6715/ruff-0.15.18-py3-none-linux_armv6l.whl", hash = "sha256:8b6850172348c8381b8b3084c5915a4393c2373b9b54cd5b5e1ea15812bc10df", size = 10887308, upload-time = "2026-06-18T18:25:03.062Z" }, - { url = "https://files.pythonhosted.org/packages/ed/21/bc4123e3f5515ee99f8ce1eb93a14a0628fe4d1678663cd08f933ac16931/ruff-0.15.18-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3fccc153a85417dcd976883160cacce486997b0a0058dd18f54b8aaaac7d1ce2", size = 11281305, upload-time = "2026-06-18T18:25:30.026Z" }, - { url = "https://files.pythonhosted.org/packages/51/93/4769464c25cf7ab2acb3c7dda9cad3d867eb41c59565b3e2a9d17249c90c/ruff-0.15.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:08d4c86a68f2c3ec2c9d56380a71fb4a4f65373055cbb8caabd645e9102f38d4", size = 10641215, upload-time = "2026-06-18T18:25:15.802Z" }, - { url = "https://files.pythonhosted.org/packages/6c/42/56926d17120db2c208d76bf60a1a019644dd9e91dc27f0f95c9caddb1366/ruff-0.15.18-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37e5108745c2c0705da916d7d4de533ddf547051ef45f62888c31bae73f66318", size = 10957224, upload-time = "2026-06-18T18:25:36.955Z" }, - { url = "https://files.pythonhosted.org/packages/22/4f/d43fab8d8189afde803103022d000a8ef9f230616d436d52a8b2b8d63b50/ruff-0.15.18-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56949a6ce8b3abde54c0bcb22cebfe57e8771cadc84b407ae8b8eaf67ebdcd43", size = 10699024, upload-time = "2026-06-18T18:25:05.707Z" }, - { url = "https://files.pythonhosted.org/packages/63/42/1e3e4c68bd408b9768cf3e439acbe2c78245225faef253f7028a0cdb63e0/ruff-0.15.18-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01a754cd6a1b630d3f97e33eb452cf7a98040482318e870f8bc52a5a30e62657", size = 11491458, upload-time = "2026-06-18T18:25:20.275Z" }, - { url = "https://files.pythonhosted.org/packages/20/77/47a3484bea8521e14a203d98c389c5c97846675e4f02734672da4a69b52a/ruff-0.15.18-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ba7a07e03a44dbf10bb086ee06705b173625014ec99f73a7e6836a5e5590a0c", size = 12383752, upload-time = "2026-06-18T18:25:22.535Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ca/054159590787023d83b658a1a1819c4c8910114e7015069340b71c0961cb/ruff-0.15.18-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a2c40a41a4cadbcf5897b548ab29dfe248b20c540961c0247d98a3973c70403", size = 11577923, upload-time = "2026-06-18T18:25:10.702Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ff/d353d6b7bbd73cc0ec37f4463d7540e45e894338abdd9964eee0de332708/ruff-0.15.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f0480ce690cbb6c4db6e5d08f19fce98e10ba131a8b60c1bcdac42771e3ae2d", size = 11583925, upload-time = "2026-06-18T18:25:32.391Z" }, - { url = "https://files.pythonhosted.org/packages/c1/4a/891f89b9c296ed3e5f3ece1a5629badc989d9a8fdaa30431aaf4774bc1c2/ruff-0.15.18-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2330215f1f393fa8733f55edce04fcf94c36a2c460fcde31f78cc84e4951e9b1", size = 11582834, upload-time = "2026-06-18T18:25:27.309Z" }, - { url = "https://files.pythonhosted.org/packages/32/a3/ed9e370154bf85de360b93c03026157f02d4943b2d01ff4945f4429f8e8a/ruff-0.15.18-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6aa6a3d979e48ae617578183674bf264fbe7d0114a796a26bd678d67963c7ff", size = 10927328, upload-time = "2026-06-18T18:25:34.676Z" }, - { url = "https://files.pythonhosted.org/packages/f5/d1/5cf5909329fedb5d39d555ee818ba5cf4638e1a301b89785d34f2905bfcb/ruff-0.15.18-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a81beadbbff2c9c245561ae3f77b16709d87f35eec650d0501679239d3449b22", size = 10693187, upload-time = "2026-06-18T18:25:08.245Z" }, - { url = "https://files.pythonhosted.org/packages/fd/44/ff6c635cf2c4f4e7b618b6640da057376baa36014695487d88aed4794268/ruff-0.15.18-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2186d9e940ae332ab293623a75b5f4fe49565f449954d50a72a046683aa6b809", size = 11208721, upload-time = "2026-06-18T18:25:41.327Z" }, - { url = "https://files.pythonhosted.org/packages/88/d9/5baa2a30861adfb7022cf33c1e35b2fc18085b08c16f83eff4c7b99a5f48/ruff-0.15.18-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5c2abf140438032bc77b2284a6c9944ecd8a19e5f1c7b52b1b8e4a0a80d19a7a", size = 11678599, upload-time = "2026-06-18T18:25:13.607Z" }, - { url = "https://files.pythonhosted.org/packages/c3/1a/0725a7cfdc32ff769efb96ee782bec882e16448c5d9e3be947ec4c04ce27/ruff-0.15.18-py3-none-win32.whl", hash = "sha256:02299e6e9fa5b297a3f6d5d10d7bcd655c925b028bb8b9d4588214549c6b9ec4", size = 10901903, upload-time = "2026-06-18T18:25:24.755Z" }, - { url = "https://files.pythonhosted.org/packages/f3/51/805d9f6fb7970505c3504794a5ec350f605361b807fef4dcf214ebd35e72/ruff-0.15.18-py3-none-win_amd64.whl", hash = "sha256:dac80dc8d26b2257dbefabed62f5d255c3937b4ccb122da1fc634794fa3578b3", size = 12041189, upload-time = "2026-06-18T18:25:17.915Z" }, - { url = "https://files.pythonhosted.org/packages/29/4c/67bb45e41609eb4726f1bfeb59e083cf91d14c696d4bd14c234a980be93d/ruff-0.15.18-py3-none-win_arm64.whl", hash = "sha256:b2c9257fcbd4a3e5b977a1904e6facca016bafe2edc17df24db67cfaee03b4e4", size = 11329958, upload-time = "2026-06-18T18:25:43.686Z" }, -] - -[[package]] -name = "tomli" -version = "2.0.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164, upload-time = "2022-02-08T10:54:04.006Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757, upload-time = "2022-02-08T10:54:02.017Z" }, -] - -[[package]] -name = "tomli" -version = "2.4.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", - "python_full_version == '3.8.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, - { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, - { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, - { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, - { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, - { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, - { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, - { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, - { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, - { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, - { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, - { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, - { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, - { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, - { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, - { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, - { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, - { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, - { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, - { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, - { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, - { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, - { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, - { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, - { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, - { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, - { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, - { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, - { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, - { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, - { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, - { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, - { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, - { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, - { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, - { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, - { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, - { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, - { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, -] - -[[package]] -name = "typed-ast" -version = "1.5.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/7e/a424029f350aa8078b75fd0d360a787a273ca753a678d1104c5fa4f3072a/typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd", size = 252841, upload-time = "2023-07-04T18:38:08.524Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/07/5defe18d4fc16281cd18c4374270abc430c3d852d8ac29b5db6599d45cfe/typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b", size = 223267, upload-time = "2023-07-04T18:37:00.129Z" }, - { url = "https://files.pythonhosted.org/packages/a0/5c/e379b00028680bfcd267d845cf46b60e76d8ac6f7009fd440d6ce030cc92/typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686", size = 208260, upload-time = "2023-07-04T18:37:03.069Z" }, - { url = "https://files.pythonhosted.org/packages/3b/99/5cc31ef4f3c80e1ceb03ed2690c7085571e3fbf119cbd67a111ec0b6622f/typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769", size = 842272, upload-time = "2023-07-04T18:37:04.916Z" }, - { url = "https://files.pythonhosted.org/packages/e2/ed/b9b8b794b37b55c9247b1e8d38b0361e8158795c181636d34d6c11b506e7/typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04", size = 824651, upload-time = "2023-07-04T18:37:06.711Z" }, - { url = "https://files.pythonhosted.org/packages/ca/59/dbbbe5a0e91c15d14a0896b539a5ed01326b0d468e75c1a33274d128d2d1/typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d", size = 854960, upload-time = "2023-07-04T18:37:08.474Z" }, - { url = "https://files.pythonhosted.org/packages/90/f0/0956d925f87bd81f6e0f8cf119eac5e5c8f4da50ca25bb9f5904148d4611/typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d", size = 839321, upload-time = "2023-07-04T18:37:10.417Z" }, - { url = "https://files.pythonhosted.org/packages/43/17/4bdece9795da6f3345c4da5667ac64bc25863617f19c28d81f350f515be6/typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02", size = 139380, upload-time = "2023-07-04T18:37:12.157Z" }, - { url = "https://files.pythonhosted.org/packages/75/53/b685e10da535c7b3572735f8bea0d4abb35a04722a7d44ca9c163a0cf822/typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee", size = 223264, upload-time = "2023-07-04T18:37:13.637Z" }, - { url = "https://files.pythonhosted.org/packages/96/fd/fc8ccf19fc16a40a23e7c7802d0abc78c1f38f1abb6e2447c474f8a076d8/typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18", size = 208158, upload-time = "2023-07-04T18:37:15.141Z" }, - { url = "https://files.pythonhosted.org/packages/bf/9a/598e47f2c3ecd19d7f1bb66854d0d3ba23ffd93c846448790a92524b0a8d/typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88", size = 878366, upload-time = "2023-07-04T18:37:16.614Z" }, - { url = "https://files.pythonhosted.org/packages/60/ca/765e8bf8b24d0ed7b9fc669f6826c5bc3eb7412fc765691f59b83ae195b2/typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2", size = 860314, upload-time = "2023-07-04T18:37:18.215Z" }, - { url = "https://files.pythonhosted.org/packages/d9/3c/4af750e6c673a0dd6c7b9f5b5e5ed58ec51a2e4e744081781c664d369dfa/typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9", size = 898108, upload-time = "2023-07-04T18:37:20.095Z" }, - { url = "https://files.pythonhosted.org/packages/03/8d/d0a4d1e060e1e8dda2408131a0cc7633fc4bc99fca5941dcb86c461dfe01/typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8", size = 881971, upload-time = "2023-07-04T18:37:21.912Z" }, - { url = "https://files.pythonhosted.org/packages/90/83/f28d2c912cd010a09b3677ac69d23181045eb17e358914ab739b7fdee530/typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b", size = 139286, upload-time = "2023-07-04T18:37:23.625Z" }, - { url = "https://files.pythonhosted.org/packages/d5/00/635353c31b71ed307ab020eff6baed9987da59a1b2ba489f885ecbe293b8/typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e", size = 222315, upload-time = "2023-07-04T18:37:36.008Z" }, - { url = "https://files.pythonhosted.org/packages/01/95/11be104446bb20212a741d30d40eab52a9cfc05ea34efa074ff4f7c16983/typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e", size = 793541, upload-time = "2023-07-04T18:37:37.614Z" }, - { url = "https://files.pythonhosted.org/packages/32/f1/75bd58fb1410cb72fbc6e8adf163015720db2c38844b46a9149c5ff6bf38/typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311", size = 778348, upload-time = "2023-07-04T18:37:39.332Z" }, - { url = "https://files.pythonhosted.org/packages/47/97/0bb4dba688a58ff9c08e63b39653e4bcaa340ce1bb9c1d58163e5c2c66f1/typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2", size = 809447, upload-time = "2023-07-04T18:37:41.017Z" }, - { url = "https://files.pythonhosted.org/packages/a8/cd/9a867f5a96d83a9742c43914e10d3a2083d8fe894ab9bf60fd467c6c497f/typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4", size = 796707, upload-time = "2023-07-04T18:37:42.625Z" }, - { url = "https://files.pythonhosted.org/packages/eb/06/73ca55ee5303b41d08920de775f02d2a3e1e59430371f5adf7fbb1a21127/typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431", size = 138403, upload-time = "2023-07-04T18:37:44.399Z" }, - { url = "https://files.pythonhosted.org/packages/19/e3/88b65e46643006592f39e0fdef3e29454244a9fdaa52acfb047dc68cae6a/typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a", size = 222951, upload-time = "2023-07-04T18:37:45.745Z" }, - { url = "https://files.pythonhosted.org/packages/15/e0/182bdd9edb6c6a1c068cecaa87f58924a817f2807a0b0d940f578b3328df/typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437", size = 208247, upload-time = "2023-07-04T18:37:47.28Z" }, - { url = "https://files.pythonhosted.org/packages/8d/09/bba083f2c11746288eaf1859e512130420405033de84189375fe65d839ba/typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede", size = 861010, upload-time = "2023-07-04T18:37:48.847Z" }, - { url = "https://files.pythonhosted.org/packages/31/f3/38839df509b04fb54205e388fc04b47627377e0ad628870112086864a441/typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4", size = 840026, upload-time = "2023-07-04T18:37:50.631Z" }, - { url = "https://files.pythonhosted.org/packages/45/1e/aa5f1dae4b92bc665ae9a655787bb2fe007a881fa2866b0408ce548bb24c/typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6", size = 875615, upload-time = "2023-07-04T18:37:52.27Z" }, - { url = "https://files.pythonhosted.org/packages/94/88/71a1c249c01fbbd66f9f28648f8249e737a7fe19056c1a78e7b3b9250eb1/typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4", size = 858320, upload-time = "2023-07-04T18:37:54.23Z" }, - { url = "https://files.pythonhosted.org/packages/12/1e/19f53aad3984e351e6730e4265fde4b949a66c451e10828fdbc4dfb050f1/typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b", size = 139414, upload-time = "2023-07-04T18:37:55.912Z" }, - { url = "https://files.pythonhosted.org/packages/b1/88/6e7f36f5fab6fbf0586a2dd866ac337924b7d4796a4d1b2b04443a864faf/typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10", size = 223329, upload-time = "2023-07-04T18:37:57.344Z" }, - { url = "https://files.pythonhosted.org/packages/71/30/09d27e13824495547bcc665bd07afc593b22b9484f143b27565eae4ccaac/typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814", size = 208314, upload-time = "2023-07-04T18:37:59.073Z" }, - { url = "https://files.pythonhosted.org/packages/07/3d/564308b7a432acb1f5399933cbb1b376a1a64d2544b90f6ba91894674260/typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8", size = 840900, upload-time = "2023-07-04T18:38:00.562Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f4/262512d14f777ea3666a089e2675a9b1500a85b8329a36de85d63433fb0e/typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274", size = 823435, upload-time = "2023-07-04T18:38:02.532Z" }, - { url = "https://files.pythonhosted.org/packages/a1/25/b3ccb948166d309ab75296ac9863ebe2ff209fbc063f1122a2d3979e47c3/typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a", size = 853125, upload-time = "2023-07-04T18:38:04.128Z" }, - { url = "https://files.pythonhosted.org/packages/1c/09/012da182242f168bb5c42284297dcc08dc0a1b3668db5b3852aec467f56f/typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba", size = 837280, upload-time = "2023-07-04T18:38:05.968Z" }, - { url = "https://files.pythonhosted.org/packages/30/bd/c815051404c4293265634d9d3e292f04fcf681d0502a9484c38b8f224d04/typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155", size = 139486, upload-time = "2023-07-04T18:38:07.249Z" }, -] - -[[package]] -name = "typing-extensions" -version = "4.7.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -sdist = { url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876, upload-time = "2023-07-02T14:20:55.045Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232, upload-time = "2023-07-02T14:20:53.275Z" }, -] - -[[package]] -name = "typing-extensions" -version = "4.13.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.8.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, -] - -[[package]] -name = "zipp" -version = "3.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/27/f0ac6b846684cecce1ee93d32450c45ab607f65c2e0255f0092032d91f07/zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", size = 18454, upload-time = "2023-02-25T02:17:22.503Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047/zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556", size = 6758, upload-time = "2023-02-25T02:17:20.807Z" }, -] From 7d5ef74a621b6e5695c40a446c823ce62b78e557 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 6 Jul 2026 16:08:07 +0800 Subject: [PATCH 09/37] Add accelerator timing module with unit and GPU tests - Added the `probing.timing` package for stream-value-gated CUDA-event timing, exposing the `timing` decorator and `timing_context`, an `AcceleratorTimer`, backend detection, a per-device stream-value gate, and a ctypes CUDA-driver FFI bridge. - Added hardware-independent unit tests under `tests/unit/probing/timing/` using fake torch/gate stand-ins: backend detection and event helpers, the gate's CUDA guard and per-device cache, `AcceleratorTimer` ordering and gate-release-on-error, the `@timing`/`TimingContext` bookkeeping and contextvar isolation, and the FFI symbol resolver, constants, and singleton loader. - Added a CUDA-gated end-to-end regression test `tests/regression/timing/test_timing_gpu.py` exercising the stream-value-gated CUDA-event path, with a cuBLAS warm-up to avoid deadlocking behind the closed gate. --- python/probing/timing/__init__.py | 109 +++++++++ python/probing/timing/_cuda_runtime_ffi.py | 231 ++++++++++++++++++ python/probing/timing/backend.py | 73 ++++++ python/probing/timing/gates.py | 89 +++++++ python/probing/timing/timer.py | 56 +++++ tests/regression/timing/test_timing_gpu.py | 96 ++++++++ .../probing/timing/test_timing_backend.py | 135 ++++++++++ .../probing/timing/test_timing_context.py | 128 ++++++++++ .../probing/timing/test_timing_cuda_ffi.py | 59 +++++ .../unit/probing/timing/test_timing_gates.py | 101 ++++++++ .../unit/probing/timing/test_timing_timer.py | 124 ++++++++++ 11 files changed, 1201 insertions(+) create mode 100644 python/probing/timing/__init__.py create mode 100644 python/probing/timing/_cuda_runtime_ffi.py create mode 100644 python/probing/timing/backend.py create mode 100644 python/probing/timing/gates.py create mode 100644 python/probing/timing/timer.py create mode 100644 tests/regression/timing/test_timing_gpu.py create mode 100644 tests/unit/probing/timing/test_timing_backend.py create mode 100644 tests/unit/probing/timing/test_timing_context.py create mode 100644 tests/unit/probing/timing/test_timing_cuda_ffi.py create mode 100644 tests/unit/probing/timing/test_timing_gates.py create mode 100644 tests/unit/probing/timing/test_timing_timer.py diff --git a/python/probing/timing/__init__.py b/python/probing/timing/__init__.py new file mode 100644 index 00000000..e462de78 --- /dev/null +++ b/python/probing/timing/__init__.py @@ -0,0 +1,109 @@ +""" +Accelerator Timing + +Spec +---- +This package measures how long CUDA workloads take using stream-value-gated +CUDA events (the ``cuda_event_wait_value32_ffi`` method), which exclude host +enqueue latency from the measurement. + +Usage: + from probing.timing import timing, timing_context + + @timing + def gemm(): + return a @ b + + with timing_context(device=0) as ctx: + gemm() + elapsed_ms = ctx["gemm"] + method = ctx.methods["gemm"] + +A ``@timing`` workload is timed only while a ``timing_context`` is active on the +current thread; outside a context it runs untouched. Timing requires a CUDA +device that supports driver stream memory operations; there is no fallback +timer. + +Public Interfaces: +- `timing`: decorate a workload so the active context records its elapsed time. +- `timing_context`: open a context that collects ``@timing`` measurements. +- `TimingContext`: the context object (records / values / methods). +- `TimingRecord`: a single measurement (elapsed_ms / method / value). +- `AcceleratorTimer`: the underlying timer for standalone use. +""" +from __future__ import annotations + +import contextvars +import functools + +from probing.timing.backend import _torch +from probing.timing.timer import AcceleratorTimer, TimingRecord + +_CURRENT_CONTEXT = contextvars.ContextVar("probing_timing_context", default=None) + + +class TimingContext: + """Collect timings from ``@timing`` workloads run within a ``with`` block. + + Indexing the context (``ctx["workload"]``) returns the elapsed milliseconds; + ``records`` / ``values`` / ``methods`` expose the full record, the workload + return value, and the timing method keyed by workload name. + """ + + def __init__(self, torch=None, device: int = 0): + self._torch = torch or _torch() + self._device = device + self._timer = AcceleratorTimer(self._torch, device) + self._token = None + self.records: dict[str, TimingRecord] = {} + self.values: dict[str, object] = {} + self.methods: dict[str, str] = {} + + def __enter__(self) -> "TimingContext": + self._token = _CURRENT_CONTEXT.set(self) + return self + + def __exit__(self, exc_type, exc, tb) -> bool: + _CURRENT_CONTEXT.reset(self._token) + return False + + def __getitem__(self, workload: str) -> float: + return self.records[workload].elapsed_ms + + def record(self, workload: str, fn, *args, **kwargs): + result = self._timer.run(fn, *args, **kwargs) + self.records[workload] = result + self.values[workload] = result.value + self.methods[workload] = result.method + return result.value + + +def timing(fn): + """Decorate a workload so an active ``timing_context`` records its time. + + When no context is active on the current thread, the wrapped function runs + exactly as if it were undecorated. + """ + + @functools.wraps(fn) + def wrapper(*args, **kwargs): + ctx = _CURRENT_CONTEXT.get() + if ctx is None: + return fn(*args, **kwargs) + return ctx.record(fn.__name__, fn, *args, **kwargs) + + return wrapper + + +def timing_context(torch=None, device: int = 0) -> TimingContext: + """Open a context that records ``@timing`` workload calls on ``device``.""" + return TimingContext(torch, device) + + +__all__ = [ + "timing", + "timing_context", + "TimingContext", + "TimingRecord", + "AcceleratorTimer", +] diff --git a/python/probing/timing/_cuda_runtime_ffi.py b/python/probing/timing/_cuda_runtime_ffi.py new file mode 100644 index 00000000..c19c946e --- /dev/null +++ b/python/probing/timing/_cuda_runtime_ffi.py @@ -0,0 +1,231 @@ +"""ctypes bridge for CUDA Driver stream memory operations. + +Used by the FFI stream-value gate. Loads ``libcuda`` directly and exposes the +``cuStreamWaitValue32`` / ``cuStreamWriteValue32`` driver entry points so the +host can stall and release a device-side flag without compiling anything. +""" +from __future__ import annotations + +import ctypes +import threading + +_LOCK = threading.Lock() +_RUNTIME = None + +CUDA_SUCCESS = 0 +CU_STREAM_WAIT_VALUE_GEQ = 0 +CU_STREAM_WRITE_VALUE_DEFAULT = 0 +CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS_V1 = 92 + + +def _driver_library(): + """Load the CUDA Driver API library.""" + for name in ("libcuda.so.1", "libcuda.so"): + try: + return ctypes.CDLL(name) + except OSError: + continue + raise RuntimeError("failed to load libcuda.so.1") + + +def _symbol(handle, name: str, fallback: str | None = None): + sym = getattr(handle, name, None) + if sym is None and fallback is not None: + sym = getattr(handle, fallback, None) + if sym is None: + raise RuntimeError(f"{name} is not available in the CUDA driver library") + return sym + + +class CudaDriverApi: + """Small typed wrapper around the CUDA Driver C ABI.""" + + def __init__(self): + self._lib = _driver_library() + self._bind() + self._check(self._cu_init(0), "cuInit") + + def _bind(self) -> None: + self._cu_init = _symbol(self._lib, "cuInit") + self._cu_init.argtypes = [ctypes.c_uint] + self._cu_init.restype = ctypes.c_int + + self._cu_get_error_name = _symbol(self._lib, "cuGetErrorName") + self._cu_get_error_name.argtypes = [ + ctypes.c_int, + ctypes.POINTER(ctypes.c_char_p), + ] + self._cu_get_error_name.restype = ctypes.c_int + + self._cu_get_error_string = _symbol(self._lib, "cuGetErrorString") + self._cu_get_error_string.argtypes = [ + ctypes.c_int, + ctypes.POINTER(ctypes.c_char_p), + ] + self._cu_get_error_string.restype = ctypes.c_int + + self._cu_device_get = _symbol(self._lib, "cuDeviceGet") + self._cu_device_get.argtypes = [ctypes.POINTER(ctypes.c_int), ctypes.c_int] + self._cu_device_get.restype = ctypes.c_int + + self._cu_device_get_attribute = _symbol(self._lib, "cuDeviceGetAttribute") + self._cu_device_get_attribute.argtypes = [ + ctypes.POINTER(ctypes.c_int), + ctypes.c_int, + ctypes.c_int, + ] + self._cu_device_get_attribute.restype = ctypes.c_int + + self._cu_ctx_get_current = _symbol(self._lib, "cuCtxGetCurrent") + self._cu_ctx_get_current.argtypes = [ctypes.POINTER(ctypes.c_void_p)] + self._cu_ctx_get_current.restype = ctypes.c_int + + self._cu_ctx_get_device = _symbol(self._lib, "cuCtxGetDevice") + self._cu_ctx_get_device.argtypes = [ctypes.POINTER(ctypes.c_int)] + self._cu_ctx_get_device.restype = ctypes.c_int + + self._cu_device_primary_ctx_retain = _symbol( + self._lib, "cuDevicePrimaryCtxRetain" + ) + self._cu_device_primary_ctx_retain.argtypes = [ + ctypes.POINTER(ctypes.c_void_p), + ctypes.c_int, + ] + self._cu_device_primary_ctx_retain.restype = ctypes.c_int + + self._cu_ctx_set_current = _symbol(self._lib, "cuCtxSetCurrent") + self._cu_ctx_set_current.argtypes = [ctypes.c_void_p] + self._cu_ctx_set_current.restype = ctypes.c_int + + self._cu_stream_wait_value32 = _symbol( + self._lib, "cuStreamWaitValue32_v2", "cuStreamWaitValue32" + ) + self._cu_stream_wait_value32.argtypes = [ + ctypes.c_void_p, + ctypes.c_uint64, + ctypes.c_uint32, + ctypes.c_uint, + ] + self._cu_stream_wait_value32.restype = ctypes.c_int + + self._cu_stream_write_value32 = _symbol( + self._lib, "cuStreamWriteValue32_v2", "cuStreamWriteValue32" + ) + self._cu_stream_write_value32.argtypes = [ + ctypes.c_void_p, + ctypes.c_uint64, + ctypes.c_uint32, + ctypes.c_uint, + ] + self._cu_stream_write_value32.restype = ctypes.c_int + + def _check(self, result: int, op: str) -> None: + if result == CUDA_SUCCESS: + return + + name = ctypes.c_char_p() + message = ctypes.c_char_p() + self._cu_get_error_name(result, ctypes.byref(name)) + self._cu_get_error_string(result, ctypes.byref(message)) + + parts = [f"{op} failed"] + if name.value: + parts.append(name.value.decode("utf-8", "replace")) + parts.append(f"({result})") + if message.value: + parts.append(message.value.decode("utf-8", "replace")) + raise RuntimeError(": ".join(parts)) + + def clear_error(self) -> None: + """CUDA Driver calls return errors directly, so there is no sticky error.""" + + def set_device(self, device: int) -> None: + device = int(device) + + current = ctypes.c_void_p() + self._check( + self._cu_ctx_get_current(ctypes.byref(current)), "cuCtxGetCurrent" + ) + if current.value is not None: + current_device = ctypes.c_int() + result = self._cu_ctx_get_device(ctypes.byref(current_device)) + if result == CUDA_SUCCESS and current_device.value == device: + return + + cu_device = ctypes.c_int() + self._check(self._cu_device_get(ctypes.byref(cu_device), device), "cuDeviceGet") + + primary = ctypes.c_void_p() + self._check( + self._cu_device_primary_ctx_retain(ctypes.byref(primary), cu_device.value), + "cuDevicePrimaryCtxRetain", + ) + self._check(self._cu_ctx_set_current(primary), "cuCtxSetCurrent") + + def _device_supports_stream_mem_ops(self, device: int) -> bool: + cu_device = ctypes.c_int() + self._check(self._cu_device_get(ctypes.byref(cu_device), device), "cuDeviceGet") + + supported = ctypes.c_int() + self._check( + self._cu_device_get_attribute( + ctypes.byref(supported), + CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS_V1, + cu_device.value, + ), + "cuDeviceGetAttribute(CAN_USE_STREAM_MEM_OPS)", + ) + return supported.value != 0 + + def wait_value32(self, stream_handle: int, ptr: int, value: int) -> None: + self._check( + self._cu_stream_wait_value32( + ctypes.c_void_p(int(stream_handle)), + ctypes.c_uint64(int(ptr)), + ctypes.c_uint32(int(value)), + ctypes.c_uint(CU_STREAM_WAIT_VALUE_GEQ), + ), + "cuStreamWaitValue32", + ) + + def write_value32(self, stream_handle: int, ptr: int, value: int) -> None: + self._check( + self._cu_stream_write_value32( + ctypes.c_void_p(int(stream_handle)), + ctypes.c_uint64(int(ptr)), + ctypes.c_uint32(int(value)), + ctypes.c_uint(CU_STREAM_WRITE_VALUE_DEFAULT), + ), + "cuStreamWriteValue32", + ) + + def can_use_stream_mem_ops( + self, + device: int, + stream_handle: int, + ptr: int, + ) -> bool: + """Probe stream memory ops on a private stream. + + The write is queued before the wait, so an unsupported wait cannot leave + the stream blocked forever. + """ + try: + self.set_device(device) + if not self._device_supports_stream_mem_ops(device): + return False + self.write_value32(stream_handle, ptr, 1) + self.wait_value32(stream_handle, ptr, 1) + except RuntimeError: + self.clear_error() + return False + return True + + +def load() -> CudaDriverApi: + """Load CUDA Driver symbols once per process.""" + global _RUNTIME + with _LOCK: + if _RUNTIME is None: + _RUNTIME = CudaDriverApi() + return _RUNTIME diff --git a/python/probing/timing/backend.py b/python/probing/timing/backend.py new file mode 100644 index 00000000..da389b5e --- /dev/null +++ b/python/probing/timing/backend.py @@ -0,0 +1,73 @@ +"""Accelerator backend helpers used by the timing module. + +Only the primitives the timer needs live here: backend detection, device +naming, and timing-event creation. +""" +from __future__ import annotations + + +def _torch(): + """Import ``torch`` and register the NPU backend if it is installed.""" + import torch + + try: + import torch_npu # noqa: F401 (registers the npu backend if present) + except Exception: + pass + return torch + + +def backend(torch=None) -> str: + """Return the active accelerator backend: ``'npu'``, ``'cuda'``, or ``'cpu'``.""" + torch = torch or _torch() + if hasattr(torch, "npu") and torch.npu.is_available(): + return "npu" + if torch.cuda.is_available(): + return "cuda" + return "cpu" + + +def dev_name(device: int) -> str: + """Return the ``backend:index`` string for ``device`` (``'cpu'`` on host).""" + bk = backend() + return f"{bk}:{device}" if bk != "cpu" else "cpu" + + +def _accelerator_module(torch): + """Return the ``torch.cuda``/``torch.npu`` module, or ``None`` on CPU.""" + bk = backend(torch) + if bk == "npu": + return torch.npu + if bk == "cuda": + return torch.cuda + return None + + +def event_pair(torch, device): + """Create a ``(start, end, stream)`` timing triple on ``device``. + + Returns ``None`` when the backend has no timing events (e.g. CPU), which + signals callers to fall back to a host-side timer. + """ + accel = _accelerator_module(torch) + if accel is None: + return None + + event_cls = getattr(accel, "Event", None) + current_stream = getattr(accel, "current_stream", None) + if event_cls is None or current_stream is None: + return None + + try: + stream = current_stream(device) + except TypeError: + stream = current_stream() + return event_cls(enable_timing=True), event_cls(enable_timing=True), stream + + +def record_event(event, stream) -> None: + """Record ``event`` on ``stream``, tolerating stream-less event APIs.""" + try: + event.record(stream) + except TypeError: + event.record() diff --git a/python/probing/timing/gates.py b/python/probing/timing/gates.py new file mode 100644 index 00000000..91a07120 --- /dev/null +++ b/python/probing/timing/gates.py @@ -0,0 +1,89 @@ +"""CUDA stream-value gate that removes host enqueue latency from timing. + +The gate stalls the compute stream behind a device-side flag so that the start +event, the workload, and the end event are all enqueued before any of them run. +The host then releases the flag, so the start->end window measures GPU execution +time without host enqueue latency. The wait lives on a private stream that the +compute stream waits on via an event, so the workload's own kernel launches +never block on the host. + +The gate drives ``cuStreamWaitValue32`` / ``cuStreamWriteValue32`` through the +CUDA driver via ctypes (:mod:`probing.timing._cuda_runtime_ffi`). It owns +dedicated CUDA streams and a flag tensor, so it is built at most once per device +and reused across measured iterations. +""" +from __future__ import annotations + +import threading + +from probing.timing.backend import backend, dev_name + + +def _stream_handle(stream) -> int: + return int(stream.cuda_stream) + + +class StreamValueGate: + """Stream-value gate backed by libcuda via ctypes FFI.""" + + def __init__(self, torch, device: int): + if backend(torch) != "cuda": + raise RuntimeError("StreamValueGate requires the CUDA backend") + self._torch = torch + self._device = device + self._flag = torch.empty((), device=dev_name(device), dtype=torch.int32) + self._wait_stream = torch.cuda.Stream(device=device) + self._release_stream = torch.cuda.Stream(device=device) + self._block_event = None + + from probing.timing import _cuda_runtime_ffi + + self._runtime = _cuda_runtime_ffi.load() + probe_stream = torch.cuda.Stream(device=device) + if not self._runtime.can_use_stream_mem_ops( + device, _stream_handle(probe_stream), int(self._flag.data_ptr()) + ): + try: + probe_stream.synchronize() + except Exception: + pass + raise RuntimeError( + f"cuda:{device} does not support CUDA driver stream memory operations" + ) + probe_stream.synchronize() + + def reset(self, stream) -> None: + with self._torch.cuda.device(self._device), self._torch.cuda.stream(stream): + self._flag.zero_() + # Keep the host-side release write ordered after the reset memset. + stream.synchronize() + + def block(self, stream, value: int = 1) -> None: + self._runtime.wait_value32( + _stream_handle(self._wait_stream), int(self._flag.data_ptr()), int(value) + ) + self._block_event = self._torch.cuda.Event() + self._block_event.record(self._wait_stream) + stream.wait_event(self._block_event) + + def release(self, value: int = 1) -> None: + self._runtime.write_value32( + _stream_handle(self._release_stream), + int(self._flag.data_ptr()), + int(value), + ) + + +_GATE_CACHE: dict = {} +_GATE_CACHE_LOCK = threading.Lock() + + +def acquire_gate(torch, device: int) -> StreamValueGate: + """Return a cached stream-value gate, building it at most once per device.""" + key = int(device) + with _GATE_CACHE_LOCK: + gate = _GATE_CACHE.get(key) + if gate is None: + gate = StreamValueGate(torch, device) + _GATE_CACHE[key] = gate + return gate diff --git a/python/probing/timing/timer.py b/python/probing/timing/timer.py new file mode 100644 index 00000000..804dd191 --- /dev/null +++ b/python/probing/timing/timer.py @@ -0,0 +1,56 @@ +"""Time accelerator workloads with stream-value-gated CUDA events. + +This is the ``cuda_event_wait_value32_ffi`` method: a stream-value gate (see +:mod:`probing.timing.gates`) holds the start event, workload, and end event in +the queue until the host releases a device-side flag, so the measured window +excludes host enqueue latency. It requires a CUDA device that supports driver +stream memory operations; there is no fallback timer. +""" +from __future__ import annotations + +from dataclasses import dataclass + +from probing.timing.backend import event_pair, record_event +from probing.timing.gates import acquire_gate + +METHOD = "cuda_event_wait_value32_ffi" + + +@dataclass(frozen=True) +class TimingRecord: + """One measured workload call: elapsed time, method used, and return value.""" + + elapsed_ms: float + method: str + value: object + + +class AcceleratorTimer: + """Time workloads on a CUDA device using a stream-value gate.""" + + def __init__(self, torch, device: int): + self._torch = torch + self._device = device + self._gate = acquire_gate(torch, device) + + @property + def method(self) -> str: + return METHOD + + def run(self, fn, *args, **kwargs) -> TimingRecord: + """Run one workload and return its :class:`TimingRecord`.""" + start, end, stream = event_pair(self._torch, self._device) + self._gate.reset(stream) + self._gate.block(stream) + + record_event(start, stream) + try: + value = fn(*args, **kwargs) + except Exception: + self._gate.release() + raise + record_event(end, stream) + self._gate.release() + end.synchronize() + elapsed_ms = float(start.elapsed_time(end)) + return TimingRecord(elapsed_ms, METHOD, value) diff --git a/tests/regression/timing/test_timing_gpu.py b/tests/regression/timing/test_timing_gpu.py new file mode 100644 index 00000000..a55d2474 --- /dev/null +++ b/tests/regression/timing/test_timing_gpu.py @@ -0,0 +1,96 @@ +"""End-to-end timing tests that run on a real CUDA device. + +These drive the actual stream-value-gated CUDA-event path. They are skipped when +no CUDA device is present (e.g. CPU-only CI) and skipped gracefully when the +device lacks driver stream memory operations. +""" + +from __future__ import annotations + +import pytest + +torch = pytest.importorskip("torch") + +pytestmark = [ + pytest.mark.integration, + pytest.mark.slow, + pytest.mark.skipif( + not torch.cuda.is_available(), reason="requires a CUDA device" + ), +] + +from probing.timing import TimingRecord, timing, timing_context # noqa: E402 + +_DEVICE = 0 +_METHOD = "cuda_event_wait_value32_ffi" + + +def _warm_up(fn) -> None: + """Run ``fn`` once outside any gate and sync. + + The stream-value gate holds the compute stream behind a device-side flag, so + a host-side sync the workload triggers on its first call (lazy cuBLAS init, + workspace allocation) would deadlock behind the still-closed gate. Real + profiling warms up the same way before measuring. + """ + fn() + torch.cuda.synchronize(_DEVICE) + + +def test_timing_context_measures_real_workload(): + a = torch.randn(512, 512, device=f"cuda:{_DEVICE}") + b = torch.randn(512, 512, device=f"cuda:{_DEVICE}") + + @timing + def gemm(): + return a @ b + + _warm_up(gemm) + + try: + with timing_context(device=_DEVICE) as ctx: + out = gemm() + except RuntimeError as exc: # pragma: no cover - driver dependent + pytest.skip(f"stream-value gate unavailable on cuda:{_DEVICE}: {exc}") + + assert out.shape == (512, 512) + assert ctx["gemm"] > 0.0 + assert ctx.methods["gemm"] == _METHOD + rec = ctx.records["gemm"] + assert isinstance(rec, TimingRecord) + assert rec.value is out + + +def test_timing_decorator_is_noop_outside_context(): + a = torch.randn(64, 64, device=f"cuda:{_DEVICE}") + + @timing + def gemm(): + return a @ a + + out = gemm() # no active context -> runs untouched, nothing recorded + assert out.shape == (64, 64) + + +def test_timing_context_reuses_gate_across_iterations(): + a = torch.randn(256, 256, device=f"cuda:{_DEVICE}") + + @timing + def relu(): + return torch.relu(a) + + _warm_up(relu) + + elapsed = [] + for _ in range(5): + try: + with timing_context(device=_DEVICE) as ctx: + relu() + except RuntimeError as exc: # pragma: no cover - driver dependent + pytest.skip(f"stream-value gate unavailable on cuda:{_DEVICE}: {exc}") + elapsed.append(ctx["relu"]) + + # Records are keyed by workload name, so repeated calls overwrite in place. + assert len(elapsed) == 5 + assert all(ms > 0.0 for ms in elapsed) + assert ctx.methods["relu"] == _METHOD diff --git a/tests/unit/probing/timing/test_timing_backend.py b/tests/unit/probing/timing/test_timing_backend.py new file mode 100644 index 00000000..60e1cf68 --- /dev/null +++ b/tests/unit/probing/timing/test_timing_backend.py @@ -0,0 +1,135 @@ +"""Unit tests for :mod:`probing.timing.backend`. + +These exercise the accelerator backend helpers with lightweight fakes so they +run without a real CUDA/NPU device. +""" + +from __future__ import annotations + +from probing.timing import backend as backend_mod + + +class _FakeAccel: + """Stand-in for ``torch.cuda`` / ``torch.npu``.""" + + def __init__(self, available=True, event_cls=None, current_stream=None): + self._available = available + if event_cls is not None: + self.Event = event_cls + if current_stream is not None: + self.current_stream = current_stream + + def is_available(self): + return self._available + + +class _FakeTorch: + """Minimal ``torch`` stand-in exposing only ``cuda`` / ``npu``.""" + + def __init__(self, cuda=None, npu=None): + if cuda is not None: + self.cuda = cuda + if npu is not None: + self.npu = npu + + +class _FakeEvent: + def __init__(self, enable_timing=False): + self.enable_timing = enable_timing + + +def test_backend_prefers_npu_when_available(): + torch = _FakeTorch(cuda=_FakeAccel(available=True), npu=_FakeAccel(available=True)) + assert backend_mod.backend(torch) == "npu" + + +def test_backend_reports_cuda_when_no_npu(): + torch = _FakeTorch(cuda=_FakeAccel(available=True)) + assert backend_mod.backend(torch) == "cuda" + + +def test_backend_ignores_npu_that_is_unavailable(): + torch = _FakeTorch(cuda=_FakeAccel(available=True), npu=_FakeAccel(available=False)) + assert backend_mod.backend(torch) == "cuda" + + +def test_backend_falls_back_to_cpu(): + torch = _FakeTorch(cuda=_FakeAccel(available=False)) + assert backend_mod.backend(torch) == "cpu" + + +def test_dev_name_uses_backend_and_index(monkeypatch): + monkeypatch.setattr(backend_mod, "backend", lambda torch=None: "cuda") + assert backend_mod.dev_name(3) == "cuda:3" + + +def test_dev_name_is_plain_cpu_on_host(monkeypatch): + monkeypatch.setattr(backend_mod, "backend", lambda torch=None: "cpu") + assert backend_mod.dev_name(0) == "cpu" + + +def test_event_pair_returns_none_on_cpu(): + torch = _FakeTorch(cuda=_FakeAccel(available=False)) + assert backend_mod.event_pair(torch, 0) is None + + +def test_event_pair_returns_timing_triple_on_cuda(): + seen = {} + + def current_stream(device): + seen["device"] = device + return "STREAM" + + accel = _FakeAccel(available=True, event_cls=_FakeEvent, current_stream=current_stream) + torch = _FakeTorch(cuda=accel) + + start, end, stream = backend_mod.event_pair(torch, 5) + + assert seen["device"] == 5 + assert stream == "STREAM" + assert isinstance(start, _FakeEvent) and isinstance(end, _FakeEvent) + assert start is not end + assert start.enable_timing is True and end.enable_timing is True + + +def test_event_pair_tolerates_stream_without_device_arg(): + def current_stream(device=None): + if device is not None: + raise TypeError("no device arg") + return "DEFAULT_STREAM" + + accel = _FakeAccel(available=True, event_cls=_FakeEvent, current_stream=current_stream) + torch = _FakeTorch(cuda=accel) + + _start, _end, stream = backend_mod.event_pair(torch, 0) + assert stream == "DEFAULT_STREAM" + + +def test_event_pair_returns_none_when_events_missing(): + accel = _FakeAccel(available=True) # no Event / current_stream attributes + torch = _FakeTorch(cuda=accel) + assert backend_mod.event_pair(torch, 0) is None + + +def test_record_event_passes_stream(): + calls = [] + + class _Event: + def record(self, stream): + calls.append(stream) + + backend_mod.record_event(_Event(), "STREAM") + assert calls == ["STREAM"] + + +def test_record_event_falls_back_without_stream_arg(): + calls = [] + + class _Event: + def record(self, stream=None): + if stream is not None: + raise TypeError("stream not accepted") + calls.append("no-stream") + + backend_mod.record_event(_Event(), "STREAM") + assert calls == ["no-stream"] diff --git a/tests/unit/probing/timing/test_timing_context.py b/tests/unit/probing/timing/test_timing_context.py new file mode 100644 index 00000000..f63487b6 --- /dev/null +++ b/tests/unit/probing/timing/test_timing_context.py @@ -0,0 +1,128 @@ +"""Unit tests for the public :mod:`probing.timing` API. + +These cover the ``@timing`` decorator and ``TimingContext`` bookkeeping. The +underlying ``AcceleratorTimer`` (which needs a GPU) is replaced with a fake so +the context/contextvar behaviour can be tested on any machine. +""" + +from __future__ import annotations + +import pytest + +import probing.timing as timing_mod +from probing.timing import TimingRecord, timing, timing_context + + +class _FakeTimer: + """Runs the workload on the host and returns a fixed elapsed time.""" + + elapsed_ms = 1.5 + method = "cuda_event_wait_value32_ffi" + + def __init__(self, torch, device): + self.torch = torch + self.device = device + + def run(self, fn, *args, **kwargs): + value = fn(*args, **kwargs) + return TimingRecord(self.elapsed_ms, self.method, value) + + +@pytest.fixture(autouse=True) +def _fake_timer(monkeypatch): + """Swap in the host-side fake timer and guarantee a clean contextvar.""" + monkeypatch.setattr(timing_mod, "AcceleratorTimer", _FakeTimer) + assert timing_mod._CURRENT_CONTEXT.get() is None + yield + assert timing_mod._CURRENT_CONTEXT.get() is None + + +def test_timing_runs_untouched_without_active_context(): + calls = [] + + @timing + def workload(x): + calls.append(x) + return x * 2 + + assert workload(21) == 42 + assert calls == [21] + + +def test_all_exports_public_api(): + assert set(timing_mod.__all__) == { + "timing", + "timing_context", + "TimingContext", + "TimingRecord", + "AcceleratorTimer", + } + + +def test_context_records_decorated_workload(): + @timing + def gemm(): + return "result" + + with timing_context(torch=object(), device=0) as ctx: + returned = gemm() + + assert returned == "result" + assert ctx["gemm"] == _FakeTimer.elapsed_ms + assert ctx.values["gemm"] == "result" + assert ctx.methods["gemm"] == "cuda_event_wait_value32_ffi" + assert ctx.records["gemm"].elapsed_ms == _FakeTimer.elapsed_ms + + +def test_decorator_forwards_args_and_kwargs(): + @timing + def add(a, b, *, c): + return a + b + c + + with timing_context(torch=object()) as ctx: + total = add(1, 2, c=3) + + assert total == 6 + assert ctx.values["add"] == 6 + + +def test_record_uses_function_name_as_key(): + def raw(): + return 7 + + with timing_context(torch=object()) as ctx: + value = ctx.record("custom_label", raw) + + assert value == 7 + assert "custom_label" in ctx.records + assert ctx["custom_label"] == _FakeTimer.elapsed_ms + + +def test_context_restores_previous_on_exit(): + @timing + def work(): + return timing_mod._CURRENT_CONTEXT.get() + + with timing_context(torch=object()) as outer: + assert timing_mod._CURRENT_CONTEXT.get() is outer + with timing_context(torch=object()) as inner: + assert timing_mod._CURRENT_CONTEXT.get() is inner + work() + # Inner block exited: the outer context must be active again. + assert timing_mod._CURRENT_CONTEXT.get() is outer + assert "work" in inner.records + assert "work" not in outer.records + + assert timing_mod._CURRENT_CONTEXT.get() is None + + +def test_workload_exception_propagates_through_context(): + @timing + def boom(): + raise RuntimeError("kernel launch failed") + + with timing_context(torch=object()) as ctx: + with pytest.raises(RuntimeError, match="kernel launch failed"): + boom() + + assert ctx.records == {} diff --git a/tests/unit/probing/timing/test_timing_cuda_ffi.py b/tests/unit/probing/timing/test_timing_cuda_ffi.py new file mode 100644 index 00000000..34bdfc96 --- /dev/null +++ b/tests/unit/probing/timing/test_timing_cuda_ffi.py @@ -0,0 +1,59 @@ +"""Unit tests for :mod:`probing.timing._cuda_runtime_ffi`. + +Loading ``libcuda`` requires a driver, so these tests cover the pure-Python +pieces: the symbol resolver (with its ``_v2`` fallback), the driver constants, +and the process-wide ``load()`` singleton. +""" + +from __future__ import annotations + +import pytest + +from probing.timing import _cuda_runtime_ffi as ffi + + +class _FakeHandle: + pass + + +def test_symbol_returns_named_attribute(): + handle = _FakeHandle() + handle.cuStreamWaitValue32_v2 = "primary" + assert ffi._symbol(handle, "cuStreamWaitValue32_v2", "cuStreamWaitValue32") == "primary" + + +def test_symbol_uses_fallback_when_primary_missing(): + handle = _FakeHandle() + handle.cuStreamWaitValue32 = "fallback" + resolved = ffi._symbol(handle, "cuStreamWaitValue32_v2", "cuStreamWaitValue32") + assert resolved == "fallback" + + +def test_symbol_raises_when_symbol_absent(): + handle = _FakeHandle() + with pytest.raises(RuntimeError, match="not available in the CUDA driver library"): + ffi._symbol(handle, "cuMissing") + + +def test_driver_constants(): + assert ffi.CUDA_SUCCESS == 0 + assert ffi.CU_STREAM_WAIT_VALUE_GEQ == 0 + assert ffi.CU_STREAM_WRITE_VALUE_DEFAULT == 0 + assert ffi.CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS_V1 == 92 + + +def test_load_is_process_wide_singleton(monkeypatch): + built = [] + + class _FakeApi: + def __init__(self): + built.append(object()) + + monkeypatch.setattr(ffi, "CudaDriverApi", _FakeApi) + monkeypatch.setattr(ffi, "_RUNTIME", None) + + first = ffi.load() + second = ffi.load() + + assert first is second + assert len(built) == 1 diff --git a/tests/unit/probing/timing/test_timing_gates.py b/tests/unit/probing/timing/test_timing_gates.py new file mode 100644 index 00000000..d8708cb9 --- /dev/null +++ b/tests/unit/probing/timing/test_timing_gates.py @@ -0,0 +1,101 @@ +"""Unit tests for :mod:`probing.timing.gates`. + +The stream-value gate needs real CUDA driver stream memory ops to run, so these +tests cover the parts that can be exercised without a device: the CUDA-backend +guard, the stream-handle helper, and the per-device gate cache. +""" + +from __future__ import annotations + +import pytest + +from probing.timing import gates + + +class _FakeAccel: + def __init__(self, available): + self._available = available + + def is_available(self): + return self._available + + +class _FakeTorch: + def __init__(self, cuda_available): + self.cuda = _FakeAccel(cuda_available) + + +class _FakeStream: + def __init__(self, handle): + self.cuda_stream = handle + + +def test_stream_handle_reads_cuda_stream(): + assert gates._stream_handle(_FakeStream(1234)) == 1234 + + +def test_stream_value_gate_requires_cuda_backend(): + torch = _FakeTorch(cuda_available=False) + with pytest.raises(RuntimeError, match="requires the CUDA backend"): + gates.StreamValueGate(torch, 0) + + +@pytest.fixture +def _clear_gate_cache(): + gates._GATE_CACHE.clear() + yield + gates._GATE_CACHE.clear() + + +def test_acquire_gate_builds_once_per_device(monkeypatch, _clear_gate_cache): + built = [] + + class _FakeGate: + def __init__(self, torch, device): + built.append(device) + self.device = device + + monkeypatch.setattr(gates, "StreamValueGate", _FakeGate) + + torch = object() + first = gates.acquire_gate(torch, 0) + second = gates.acquire_gate(torch, 0) + + assert first is second + assert built == [0] + + +def test_acquire_gate_is_per_device(monkeypatch, _clear_gate_cache): + built = [] + + class _FakeGate: + def __init__(self, torch, device): + built.append(device) + self.device = device + + monkeypatch.setattr(gates, "StreamValueGate", _FakeGate) + + torch = object() + gate0 = gates.acquire_gate(torch, 0) + gate1 = gates.acquire_gate(torch, 1) + + assert gate0 is not gate1 + assert built == [0, 1] + + +def test_acquire_gate_coerces_device_key(monkeypatch, _clear_gate_cache): + """``acquire_gate`` normalizes the device to ``int`` for its cache key.""" + built = [] + + class _FakeGate: + def __init__(self, torch, device): + built.append(device) + + monkeypatch.setattr(gates, "StreamValueGate", _FakeGate) + + torch = object() + first = gates.acquire_gate(torch, 0) + second = gates.acquire_gate(torch, 0.0) # same key after int() coercion + + assert first is second + assert built == [0] diff --git a/tests/unit/probing/timing/test_timing_timer.py b/tests/unit/probing/timing/test_timing_timer.py new file mode 100644 index 00000000..45316b8b --- /dev/null +++ b/tests/unit/probing/timing/test_timing_timer.py @@ -0,0 +1,124 @@ +"""Unit tests for :mod:`probing.timing.timer`. + +``AcceleratorTimer`` orchestrates CUDA events and the stream-value gate. These +tests replace the gate and event helpers with fakes so the ordering guarantees +(gate reset/block -> start -> workload -> end -> release -> sync) can be checked +without a GPU. +""" + +from __future__ import annotations + +import pytest + +from probing.timing import timer as timer_mod +from probing.timing.timer import METHOD, AcceleratorTimer, TimingRecord + + +class _FakeGate: + def __init__(self, log): + self._log = log + + def reset(self, stream): + self._log.append(("reset", stream)) + + def block(self, stream): + self._log.append(("block", stream)) + + def release(self): + self._log.append(("release", None)) + + +class _FakeEvent: + def __init__(self, name, log): + self._name = name + self._log = log + + def synchronize(self): + self._log.append(("sync", self._name)) + + def elapsed_time(self, other): + # Log the event the method is invoked on so the ordering test can assert + # the real code computes ``start.elapsed_time(end)`` (not the reverse). + self._log.append(("elapsed_time", self._name)) + return 2.5 + + +@pytest.fixture +def _timer_env(monkeypatch): + """Build an ``AcceleratorTimer`` whose gate and events are fakes.""" + log: list = [] + gate = _FakeGate(log) + start = _FakeEvent("start", log) + end = _FakeEvent("end", log) + stream = "STREAM" + + monkeypatch.setattr(timer_mod, "acquire_gate", lambda torch, device: gate) + monkeypatch.setattr( + timer_mod, "event_pair", lambda torch, device: (start, end, stream) + ) + monkeypatch.setattr( + timer_mod, + "record_event", + lambda event, stream: log.append(("record", event._name, stream)), + ) + + timer = AcceleratorTimer(torch=object(), device=0) + return timer, log, stream + + +def test_timing_record_is_frozen(): + record = TimingRecord(1.0, "m", "v") + assert (record.elapsed_ms, record.method, record.value) == (1.0, "m", "v") + with pytest.raises(Exception): + record.elapsed_ms = 2.0 # type: ignore[misc] + + +def test_method_property_reports_ffi_method(_timer_env): + timer, _log, _stream = _timer_env + assert timer.method == METHOD == "cuda_event_wait_value32_ffi" + + +def test_run_returns_workload_value_and_elapsed(_timer_env): + timer, _log, _stream = _timer_env + + record = timer.run(lambda a, b: a + b, 2, b=3) + + assert isinstance(record, TimingRecord) + assert record.value == 5 + assert record.elapsed_ms == 2.5 + assert record.method == METHOD + + +def test_run_orders_gate_and_events(_timer_env): + timer, log, stream = _timer_env + + timer.run(lambda: "ok") + + assert log == [ + ("reset", stream), + ("block", stream), + ("record", "start", stream), + ("record", "end", stream), + ("release", None), + ("sync", "end"), + ("elapsed_time", "start"), + ] + + +def test_run_releases_gate_when_workload_raises(_timer_env): + timer, log, stream = _timer_env + + def boom(): + raise ValueError("workload failed") + + with pytest.raises(ValueError, match="workload failed"): + timer.run(boom) + + # The end event is never recorded, but the gate must still be released so + # the compute stream does not stay blocked behind the device-side flag. + assert log == [ + ("reset", stream), + ("block", stream), + ("record", "start", stream), + ("release", None), + ] From 4e847db8aef942d0c2ca11f4d74cbb1152c9fca8 Mon Sep 17 00:00:00 2001 From: Reiase Date: Mon, 6 Jul 2026 21:50:07 +0800 Subject: [PATCH 10/37] Enhance cluster mutex handling and update NCCL profiling documentation (#54) * Harden cluster mutex handling and align docs with refactor reality. Use poison-safe lock_mutex in torchrun cluster paths, rewrite federation catalog prefixes via AST (with legacy fallback), update modularity docs for known boundary debt and torchrun vs Pulsing membership, soften README overhead claims, and track uv.lock while gitignoring generated bundled_web. Co-authored-by: Cursor * Update dependencies and enhance documentation for NCCL profiling and cluster management - Added new dependencies including `env_logger`, `log`, and `criterion` to improve logging and performance analysis capabilities. - Updated the default `NCCL_PROFILE_EVENT_MASK` to `94` for enhanced profiling granularity. - Revised documentation across multiple files to reflect changes in environment variables, SQL tables, and cluster query handling. - Improved error handling and metadata reporting in cluster queries to provide better insights into node performance and query integrity. - Enhanced modularity documentation to clarify the integration of new features and their usage in the context of Probing. This commit aims to improve the overall functionality and usability of the Probing framework, particularly in relation to NCCL profiling and cluster operations. * Remove NCCL_LOG_TRACE constant and associated debug function from NCCL profiler logging module to streamline logging functionality. This change simplifies the logging interface by eliminating unused trace logging capabilities. * Refactor memory snapshot handling in Linux to simplify RSS byte retrieval - Updated the `read_host_rss_bytes_signal_safe` function to directly return the result of `parse_proc_vmrss_signal_safe`, improving code clarity. - Simplified the file descriptor opening process in `parse_proc_vmrss_signal_safe` by using a byte string for the path, enhancing safety and readability. --------- Co-authored-by: Cursor --- Cargo.lock | 9 + docs/src/design/extensibility.md | 2 +- docs/src/design/extensibility.zh.md | 2 +- docs/src/design/federation.md | 5 +- docs/src/design/federation.zh.md | 3 +- docs/src/design/hierarchical-fanout.md | 4 +- docs/src/design/hierarchical-fanout.zh.md | 4 +- docs/src/design/modularity.md | 1 + docs/src/design/modularity.zh.md | 1 + docs/src/design/nccl-profiler.md | 97 +- docs/src/design/nccl-profiler.zh.md | 91 +- docs/src/reference/env-vars.md | 53 +- docs/src/reference/env-vars.zh.md | 12 +- docs/src/reference/sql-tables.md | 1 + docs/src/reference/sql-tables.zh.md | 1 + probing/cli/src/cli/cluster.rs | 22 +- probing/cli/src/cli/ctrl.rs | 13 +- probing/cli/src/cli/skill/loader.rs | 117 ++ probing/cli/src/cli/skill/runner.rs | 182 ++- probing/core/src/core/cluster.rs | 138 +- probing/core/src/core/engine.rs | 15 +- .../src/core/federation/aggregate_pushdown.rs | 86 +- .../src/core/federation/cluster_executor.rs | 92 +- probing/core/src/core/federation/mod.rs | 9 +- .../core/src/core/federation/query_guard.rs | 166 ++ probing/core/src/storage/distributed.rs | 2 +- probing/core/src/tracing.rs | 18 +- probing/extensions/hccl-profapi/Cargo.toml | 2 + probing/extensions/hccl-shim/Cargo.toml | 2 + probing/extensions/hccl-shim/src/forward.rs | 8 +- probing/extensions/hccl-shim/src/lib.rs | 1 + probing/extensions/hccl-shim/src/log.rs | 27 + probing/extensions/hccl-shim/src/writer.rs | 2 +- .../nccl-profiler-cdylib/Cargo.toml | 2 + probing/extensions/nccl-profiler/Cargo.toml | 7 + probing/extensions/nccl-profiler/README.md | 59 +- .../nccl-profiler/benches/callback_path.rs | 96 ++ .../extensions/nccl-profiler/src/abi/mod.rs | 10 +- .../nccl-profiler/src/abi/profiler_v3.rs | 58 +- .../nccl-profiler/src/abi/profiler_v4.rs | 183 +++ .../extensions/nccl-profiler/src/events.rs | 841 ++++++++++- probing/extensions/nccl-profiler/src/lib.rs | 48 +- probing/extensions/nccl-profiler/src/log.rs | 88 ++ .../extensions/nccl-profiler/src/plugin.rs | 537 ++++++- probing/extensions/nccl-profiler/src/pool.rs | 136 +- .../nccl-profiler/src/pool_config.rs | 76 + .../nccl-profiler/src/pool_pressure.rs | 46 + .../nccl-profiler/src/ring_config.rs | 35 + probing/extensions/nccl-profiler/src/role.rs | 13 + probing/extensions/nccl-profiler/src/shard.rs | 92 ++ probing/extensions/nccl-profiler/src/state.rs | 1329 ++++++++++++++--- .../extensions/nccl-profiler/src/tables.rs | 193 ++- .../extensions/nccl-profiler/src/writer.rs | 232 ++- .../python/src/extensions/python/exttbls.rs | 58 +- .../python/src/features/crash/handler.rs | 5 + .../src/features/crash/memory_snapshot.rs | 409 +++++ .../python/src/features/crash/mod.rs | 1 + .../python/src/features/crash/report.rs | 14 + .../python/src/features/crash/signal.rs | 6 +- .../extensions/python/src/features/pprof.rs | 1 - .../python/src/features/python_api.rs | 6 +- .../python/src/features/stack_tracer.rs | 16 +- .../extensions/python/src/features/torch.rs | 273 ++-- probing/memtable/src/discover.rs | 5 + probing/memtable/src/layout.rs | 19 +- probing/memtable/src/lib.rs | 2 +- probing/memtable/src/raw.rs | 36 +- probing/proto/src/lib.rs | 4 +- probing/proto/src/protocol/cluster.rs | 10 + probing/proto/src/protocol/message.rs | 5 + probing/server/API.md | 1 + probing/server/src/cluster_http.rs | 43 +- probing/server/src/engine.rs | 52 +- probing/server/src/engine_lifecycle.rs | 91 ++ probing/server/src/extensions.rs | 6 +- probing/server/src/lib.rs | 2 + probing/server/src/mcp/helpers.rs | 24 +- probing/server/src/mcp/mod.rs | 22 +- probing/server/src/report.rs | 5 +- probing/server/src/server/cluster.rs | 49 +- probing/server/src/server/cluster_fanout.rs | 232 ++- probing/server/src/server/cluster_query.rs | 16 +- probing/server/src/server/config.rs | 12 + probing/server/src/server/error.rs | 4 + probing/server/src/server/health.rs | 72 + probing/server/src/server/middleware.rs | 29 + probing/server/src/server/mod.rs | 56 +- probing/server/src/server/query_dto.rs | 16 +- probing/server/src/server/training.rs | 8 + probing/server/src/torchrun_cluster.rs | 16 +- .../tests/hierarchical_cluster_report.rs | 24 +- python/probing/bundled_skills/catalog.yaml | 2 + .../bundled_skills/comm_bottleneck/SKILL.md | 11 +- .../bundled_skills/comm_bottleneck/steps.yaml | 45 +- .../nccl_culprit_victim/SKILL.md | 3 + .../nccl_culprit_victim/steps.yaml | 6 +- .../bundled_skills/semantic/tables.yaml | 124 +- python/probing/crash.py | 52 + python/probing/ext/megatron.py | 336 +++++ python/probing/ext/torch.py | 11 + python/probing/handlers/pythonext.py | 16 + python/probing/hooks/import_hook.py | 20 + python/probing/nccl/__init__.py | 4 +- python/probing/nccl/mock.py | 118 +- python/probing/profiling/collective/coll.py | 34 +- python/probing/profiling/collective/config.py | 27 +- python/probing/profiling/collective/record.py | 6 + python/probing/profiling/flight_recorder.py | 274 ++++ python/probing/skills/loader.py | 19 + skills/catalog.yaml | 51 + skills/comm_bottleneck/SKILL.md | 11 +- skills/comm_bottleneck/steps.yaml | 45 +- skills/health_overview/steps.yaml | 37 + skills/nccl_culprit_victim/SKILL.md | 3 + skills/nccl_culprit_victim/steps.yaml | 6 +- skills/semantic/intents.yaml | 23 +- skills/semantic/tables.yaml | 124 +- skills/sre_triage/SKILL.md | 46 + skills/sre_triage/steps.yaml | 276 ++++ skills/watchdog_timeout/SKILL.md | 46 + skills/watchdog_timeout/steps.yaml | 233 +++ src/lib.rs | 2 +- tests/regression/ext/test_comm_collective.py | 23 + .../regression/nccl/test_nccl_plugin_path.py | 5 +- .../server/hierarchical_fanout_query.rs | 34 +- tests/regression/skills/test_install_tools.py | 6 +- tests/regression/spec/api_spec.json | 8 + tests/unit/probing/ext/test_megatron.py | 156 ++ .../probing/profiling/test_flight_recorder.py | 63 + tests/unit/probing/skills/test_loader.py | 41 + .../probing/test_crash_flight_recorder.py | 30 + web/src/api/cluster.rs | 19 +- 132 files changed, 8414 insertions(+), 901 deletions(-) create mode 100644 probing/core/src/core/federation/query_guard.rs create mode 100644 probing/extensions/hccl-shim/src/log.rs create mode 100644 probing/extensions/nccl-profiler/benches/callback_path.rs create mode 100644 probing/extensions/nccl-profiler/src/abi/profiler_v4.rs create mode 100644 probing/extensions/nccl-profiler/src/log.rs create mode 100644 probing/extensions/nccl-profiler/src/pool_config.rs create mode 100644 probing/extensions/nccl-profiler/src/pool_pressure.rs create mode 100644 probing/extensions/nccl-profiler/src/ring_config.rs create mode 100644 probing/extensions/nccl-profiler/src/shard.rs create mode 100644 probing/extensions/python/src/features/crash/memory_snapshot.rs create mode 100644 probing/server/src/engine_lifecycle.rs create mode 100644 probing/server/src/server/health.rs create mode 100644 python/probing/ext/megatron.py create mode 100644 python/probing/profiling/flight_recorder.py create mode 100644 skills/sre_triage/SKILL.md create mode 100644 skills/sre_triage/steps.yaml create mode 100644 skills/watchdog_timeout/SKILL.md create mode 100644 skills/watchdog_timeout/steps.yaml create mode 100644 tests/unit/probing/ext/test_megatron.py create mode 100644 tests/unit/probing/profiling/test_flight_recorder.py create mode 100644 tests/unit/probing/test_crash_flight_recorder.py diff --git a/Cargo.lock b/Cargo.lock index 4385f834..02df5215 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3468,7 +3468,9 @@ dependencies = [ name = "probing-hccl-profapi" version = "0.2.5" dependencies = [ + "env_logger", "libc", + "log", "once_cell", "parking_lot 0.12.3", "probing-memtable", @@ -3478,7 +3480,9 @@ dependencies = [ name = "probing-hccl-shim" version = "0.2.5" dependencies = [ + "env_logger", "libc", + "log", "once_cell", "parking_lot 0.12.3", "probing-memtable", @@ -3510,7 +3514,10 @@ dependencies = [ name = "probing-nccl-profiler" version = "0.2.5" dependencies = [ + "criterion", + "env_logger", "libc", + "log", "once_cell", "parking_lot 0.12.3", "probing-memtable", @@ -3522,7 +3529,9 @@ dependencies = [ name = "probing-nccl-profiler-cdylib" version = "0.2.5" dependencies = [ + "env_logger", "libc", + "log", "once_cell", "parking_lot 0.12.3", "probing-memtable", diff --git a/docs/src/design/extensibility.md b/docs/src/design/extensibility.md index 2ded1bec..bc1f5e78 100644 --- a/docs/src/design/extensibility.md +++ b/docs/src/design/extensibility.md @@ -313,7 +313,7 @@ For **fine-grained NCCL wait decomposition** (culprit vs victim), use the standa ```bash export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) -export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # default 26 +export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # default 94 export PROBING=2 torchrun --nproc_per_node=8 train.py ``` diff --git a/docs/src/design/extensibility.zh.md b/docs/src/design/extensibility.zh.md index 31d7dadf..e7951d42 100644 --- a/docs/src/design/extensibility.zh.md +++ b/docs/src/design/extensibility.zh.md @@ -318,7 +318,7 @@ Skill 可引用**任意** SQL 表——路径 1 插件表、内置表(`cpu.uti ```bash export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) -export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # 默认 26 +export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # 默认 94 export PROBING=2 torchrun --nproc_per_node=8 train.py ``` diff --git a/docs/src/design/federation.md b/docs/src/design/federation.md index ea0866e3..21575bad 100644 --- a/docs/src/design/federation.md +++ b/docs/src/design/federation.md @@ -302,7 +302,7 @@ Fixed six columns, stable order: `_host`, `_addr`, `_rank`, `_node_rank`, `_loca **Per-node SQL** 1. `FROM probe.{schema}.{table}` -2. Push full WHERE +2. Push full WHERE (subqueries excluded by §4.2 routing — they must never reach peers) 3. SELECT: drop tag columns; keep aggs and data GROUP BY columns 4. GROUP BY data columns only @@ -314,7 +314,8 @@ Fixed six columns, stable order: `_host`, `_addr`, `_rank`, `_node_rank`, `_loca | `min` | `min` | | `max` | `max` | | `avg` | not exact distributed merge → **not path A** | -| `count(distinct)` with data GROUP BY | not supported → **not path A** | +| `count(distinct)` grouped **only** by tag columns | per-node rows are final; concat, no merge | +| `count(distinct)` otherwise (data GROUP BY or no GROUP BY) | cross-node merge would overcount → **not path A** | **ORDER BY / LIMIT:** applied on coordinator **after** merge; global top-K for LIMIT. diff --git a/docs/src/design/federation.zh.md b/docs/src/design/federation.zh.md index 12e520b4..43d808de 100644 --- a/docs/src/design/federation.zh.md +++ b/docs/src/design/federation.zh.md @@ -322,7 +322,8 @@ flowchart TD | `min` | `min` | | `max` | `max` | | `avg` | 不支持精确分布式 merge → **不走 A** | -| `count(distinct)` 且 GROUP BY 含数据列 | 不支持 → **不走 A** | +| `count(distinct)` 仅按标签列 GROUP BY | 每节点一行即最终结果;只 concat 不二次 merge | +| `count(distinct)` 其余情况(含数据列分组或无 GROUP BY) | 跨节点 merge 会重复计数 → **不走 A** | merge 后再 `GROUP BY` 数据列 + 用户请求的标签列(若有)。 diff --git a/docs/src/design/hierarchical-fanout.md b/docs/src/design/hierarchical-fanout.md index e62ccee3..31b809cc 100644 --- a/docs/src/design/hierarchical-fanout.md +++ b/docs/src/design/hierarchical-fanout.md @@ -158,7 +158,9 @@ Complex CTE + window queries should still be split into diagnostic chains (see [ | Variable | Default | Description | |----------|---------|-------------| -| `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | `0` = global flat fan-out | +| `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | `0` = global flat fan-out (legacy O(world_size) path) | + +When hierarchical mode is on (default) but `cluster.nodes` lacks `group_rank` / `local_rank` (heartbeat not converged), **`POST /apis/cluster/query` returns HTTP 503** instead of silently falling back to flat fan-out. Use `hierarchical=false` only when you explicitly accept flat fan-out. | `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `2` | Per-peer HTTP timeout (per tier in hierarchical mode) | Cluster heartbeat variables: [Environment variables — cluster](../reference/env-vars.md) and [Torchrun cluster heartbeat](torchrun-cluster.md). diff --git a/docs/src/design/hierarchical-fanout.zh.md b/docs/src/design/hierarchical-fanout.zh.md index 55122582..89a24b29 100644 --- a/docs/src/design/hierarchical-fanout.zh.md +++ b/docs/src/design/hierarchical-fanout.zh.md @@ -158,7 +158,9 @@ probing -t rank0:8080 cluster query --flat "SELECT ..." | 变量 | 默认 | 说明 | |------|------|------| -| `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | `0` = 全局扁平 fan-out | +| `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | `0` = 全局扁平 fan-out(legacy O(world_size) 路径) | + +分层模式开启(默认)但 `cluster.nodes` 缺少 `group_rank` / `local_rank`(心跳未收敛)时,**`POST /apis/cluster/query` 返回 HTTP 503**,不再静默回退扁平 fan-out。仅在明确接受扁平 fan-out 时使用 `hierarchical=false`。 | `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `2` | 单 peer HTTP 超时(分层下为 per-tier) | 集群心跳相关变量见 [环境变量 — 集群](../reference/env-vars.zh.md#集群) 与 [torchrun 集群心跳](torchrun-cluster.zh.md)。 diff --git a/docs/src/design/modularity.md b/docs/src/design/modularity.md index 049eb57d..68703283 100644 --- a/docs/src/design/modularity.md +++ b/docs/src/design/modularity.md @@ -332,6 +332,7 @@ Use this table to decide **where a change belongs**: | macOS per-thread SIGUSR2 | probing-core | `signal::send_sigusr2_to_thread_id` | | Torch module sampling | python/probing/profiling | `python.torch_trace` | | Collective wall time | python/probing/profiling/collective | `python.comm_collective` | +| PyTorch Flight Recorder bridge | python/probing/profiling/flight_recorder | `python.torch_nccl_flight_record`, `python.torch_nccl_pg_status` | | NCCL wait decomposition | probing-nccl-profiler | `nccl.proxy_ops` | | Host CPU / RDMA counters | probing-cc | `cpu.*`, `rdma.*` | | GPU mem / util | probing-gpu | `gpu.*` | diff --git a/docs/src/design/modularity.zh.md b/docs/src/design/modularity.zh.md index d1b36723..b7284c31 100644 --- a/docs/src/design/modularity.zh.md +++ b/docs/src/design/modularity.zh.md @@ -276,6 +276,7 @@ sequenceDiagram | macOS 线程 SIGUSR2 | probing-core | `signal::send_sigusr2_to_thread_id` | | Torch 模块采样 | python/profiling | `python.torch_trace` | | Collective 墙钟 | python/profiling/collective | `python.comm_collective` | +| PyTorch Flight Recorder 桥接 | python/profiling/flight_recorder | `python.torch_nccl_flight_record`, `python.torch_nccl_pg_status` | | NCCL wait 分解 | nccl-profiler | `nccl.proxy_ops` | | 主机 CPU / RDMA | probing-cc | `cpu.*`, `rdma.*` | | GPU 显存 / 利用率 | probing-gpu | `gpu.*` | diff --git a/docs/src/design/nccl-profiler.md b/docs/src/design/nccl-profiler.md index 9a22571d..ba8ea3cf 100644 --- a/docs/src/design/nccl-profiler.md +++ b/docs/src/design/nccl-profiler.md @@ -13,7 +13,31 @@ This is **Path 3** in [Extensibility](extensibility.md)—a Rust `cdylib` loaded | Straggler identified — **why** (GPU vs network wait)? | `nccl.proxy_ops` + skill `nccl_culprit_victim` | | Suspect RoCE / IB congestion | `nccl.net_qp` + `rdma.mlx_hca` | -Coarse collective tracing (`python.comm_collective`) works with `PROBING=1` only. The NCCL profiler plugin requires **NCCL ≥ 2.26** (PyTorch **2.8+** recommended). +Coarse collective tracing (`python.comm_collective`) works with `PROBING=1` only. The NCCL profiler plugin requires **NCCL ≥ 2.26** (PyTorch **2.8+** recommended); it exports both **`ncclProfiler_v4`** (NCCL ≥ 2.27, preferred) and **`ncclProfiler_v3`** (NCCL 2.26) — NCCL negotiates the highest version automatically. + +## Three collective data sources — keep them apart + +probing has three independent collective-communication collectors. They have +**different timing semantics** and must not be conflated: + +| Source | Tables | What it measures | Role | +|--------|--------|------------------|------| +| **NCCL profiler plugin** (this doc) | `nccl.coll_perf`, `nccl.proxy_ops`, `nccl.inflight_ops`, `nccl.net_qp` | NCCL-native events: reconstructed execution time, wait decomposition, bandwidth | **Precise source of truth** | +| Torch-API tracer (legacy, `probing/profiling/collective/`) | `python.comm_collective` | Python wall-clock around the `torch.distributed` API call (launch layer) | Coarse fallback; carries `global_step` context | +| PyTorch Flight Recorder bridge | `python.torch_nccl_flight_record`, `python.torch_nccl_pg_status` | torch's internal watchdog ring buffer | Watchdog-timeout / desync forensics | + +Rules of engagement: + +- When the plugin is active (`NCCL_PROFILER_PLUGIN` set), the Torch-API tracer + is **disabled by default** — recording the same collectives twice with + conflicting timing only creates confusion. Force both with + `SET probing.torch.collective.enable=1` (e.g. when you need per-step + `global_step` alignment alongside precise timing). +- For execution time, bandwidth, and wait attribution, always query `nccl.*`. + `python.comm_collective.duration_ms` is **not** NCCL execution time — for + `async_op` calls it closes at `work.wait()`, otherwise at API return. +- Joining the layers: `nccl.*` rows carry no training step; correlate by + epoch-ns time window against `python.comm_collective.global_step` if needed. ## Quick start (Linux training) @@ -21,7 +45,7 @@ Coarse collective tracing (`python.comm_collective`) works with `PROBING=1` only pip install probing # wheel bundles libprobing_nccl_profiler.so on Linux export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) -export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # default 26 +export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # default 94 export PROBING=2 torchrun --nproc_per_node=8 train.py @@ -38,7 +62,7 @@ probing -t query " ### Optional: NetPlugin (IB QP timing) ```bash -export NCCL_PROFILE_EVENT_MASK=154 # 26 + NetPlugin bit 128 +export NCCL_PROFILE_EVENT_MASK=222 # 94 + NetPlugin bit 128 probing -t query "SELECT * FROM nccl.net_qp LIMIT 20" ``` @@ -74,14 +98,74 @@ Per NCCL proxy operation, with ProxyStep waits aggregated at op stop. | `peer` | Peer rank for this proxy op | | `is_send` | `1` = send proxy, `0` = recv | | `n_steps` | ProxyStep count aggregated | -| `trans_bytes` | Bytes transferred | +| `trans_bytes` | Bytes transferred (v4: summed from per-step `transSize` updates) | | `send_gpu_wait_ns` | **Culprit signal** — local GPU not ready to send | +| `send_peer_wait_ns` | Waiting for receiver clear-to-send credits (**v4 ABI only**, 0 on v3) — receiver-congestion signal | | `send_wait_ns` | Send-side network wait | | `recv_wait_ns` | **Victim signal** — waiting on peer data | | `recv_flush_wait_ns` | Recv flush wait | Multi-node: `global.nccl.proxy_ops` with `_host`, `_addr`, `_rank` federation columns. +> `ts` columns in all `nccl.*` tables are **UNIX-epoch nanoseconds**, so +> timestamps are comparable across ranks/hosts in `global.nccl.*` queries. + +### `nccl.coll_perf` + +Per collective / P2P operation. + +**Timing model.** NCCL's own docs state that a collective's `stopEvent` only +marks the end of the **host-side enqueue** — the kernel and proxy threads keep +working after it. Following the official ext-profiler recommendation, the +plugin reference-counts child events (`ProxyOp`, `KernelCh`) and reconstructs +the real execution window from them. The `timing_source` column records which +signal was available: + +| `timing_source` | Window | Quality | +|-----------------|--------|---------| +| `kernel_gpu` | GPU **globaltimer** window: `kernelCh.pTimer` (start) + `KernelChStop` state (stop) | Best — device clock, **v4 ABI only** | +| `kernel_ch` | Kernel-channel activity observed by the proxy thread (`ncclProfileKernelCh`) | NCCL's own kernel-activity signal, host clock | +| `proxy` | Proxy-op start→stop envelope | Good for inter-node ops | +| `enqueue` | Coll start→stop (launch only) | Fallback — intra-node ops without proxy/kernel events | + +| Column | Meaning | +|--------|---------| +| `ts` | Op completion timestamp (epoch ns) | +| `rank`, `tp_rank`, `pp_rank`, `dp_rank` | Same as `nccl.proxy_ops` | +| `comm_hash`, `coll_func`, `seq` | Collective identity (`seq` = 0 for P2P) | +| `n_ranks` | Communicator size (v4 per-comm `init` metadata; `-1` on v3) | +| `is_p2p` | `1` = Send/Recv, `0` = collective | +| `peer` | P2P peer rank (`-1` for collectives) | +| `count`, `msg_size_bytes`, `dtype` | Payload: element count × dtype size | +| `algo`, `proto`, `n_channels` | NCCL algorithm (Ring/Tree…), protocol (LL/LL128/Simple), channels (v4: P2P too) | +| `exec_time_ns` | Reconstructed execution duration (see `timing_source`) | +| `enqueue_time_ns` | Host-side enqueue duration (NCCL coll start→stop) | +| `timing_source` | `kernel_gpu` / `kernel_ch` / `proxy` / `enqueue` | +| `algobw_gbps` | Algorithm bandwidth `msg_size / exec_time` (GB/s). **Bus bandwidth**: multiply by the collective factor using `n_ranks`, e.g. AllReduce `2(n_ranks-1)/n_ranks`, in SQL | + +```sql +-- Slowest AllReduce buckets by bandwidth +SELECT coll_func, msg_size_bytes, AVG(algobw_gbps) AS gbps, COUNT(*) AS n +FROM nccl.coll_perf +GROUP BY coll_func, msg_size_bytes +ORDER BY gbps ASC LIMIT 10 +``` + +### `nccl.inflight_ops` + +Periodic watchdog snapshot of operations that **started but never stopped** — +the hang signal that `nccl.proxy_ops` cannot capture (a hung op never reaches +`stop_event`). Columns: `ts`, `rank`, `comm_hash`, `coll_func`, `seq`, `kind` +(`coll`/`p2p`/`proxy_op`), `channel_id`, `peer`, `is_send`, `start_ns`, `age_ns`. + +```sql +-- Which rank is stuck, and in what? +SELECT rank, coll_func, seq, kind, MAX(age_ns)/1e9 AS stuck_secs +FROM nccl.inflight_ops +GROUP BY rank, coll_func, seq, kind +ORDER BY stuck_secs DESC +``` + ### `nccl.net_qp` IB queue-pair completion timing (NetPlugin mask). Columns: `ts`, `rank`, `device`, `qp_num`, `wr_id`, `opcode`, `length`, `duration_ns`. @@ -121,8 +205,11 @@ Related skills: `slow_rank`, `comm_bottleneck` (coarse layer; optionally join `n | Variable | Purpose | |----------|---------| | `NCCL_PROFILER_PLUGIN` | Path to `libprobing_nccl_profiler.so` | -| `NCCL_PROFILE_EVENT_MASK` | Event mask; default `26` = Coll \| ProxyOp \| ProxyStep | +| `NCCL_PROFILE_EVENT_MASK` | Event mask; default `94` = Coll \| P2P \| ProxyOp \| ProxyStep \| KernelCh | | `PROBING_DATA_DIR` | Memtable directory (default `/dev/shm/probing`) | +| `PROBING_NCCL_MIN_MSG_BYTES` | Skip ops smaller than this (bytes); default `0` = record all. Same idea as NCCL Inspector's `DUMP_MIN_SIZE_BYTES` | +| `PROBING_NCCL_INFLIGHT_THRESHOLD_SECS` | Watchdog: snapshot in-flight ops older than this into `nccl.inflight_ops`; default `10`, `0` disables | +| `PROBING_NCCL_POOL_SHARDS` | Shard slot pools by comm hash (default `8`, range 1–64); reduces callback lock contention on multi-comm jobs | | `PROBING_NCCL_MOCK` | `auto` / `1` / `0` — mock tables for dev | | `TP_RANK`, `PP_RANK`, `DP_RANK` | Written into `nccl.proxy_ops` role columns | diff --git a/docs/src/design/nccl-profiler.zh.md b/docs/src/design/nccl-profiler.zh.md index 415f5bef..dc896727 100644 --- a/docs/src/design/nccl-profiler.zh.md +++ b/docs/src/design/nccl-profiler.zh.md @@ -13,7 +13,28 @@ | 已定位慢 rank,要区分 GPU 慢还是等网络 | `nccl.proxy_ops` + skill `nccl_culprit_victim` | | 怀疑 RoCE / IB 拥塞 | `nccl.net_qp` + `rdma.mlx_hca` | -粗粒度 collective(`python.comm_collective`)只需 `PROBING=1`。NCCL profiler 插件需要 **NCCL ≥ 2.26**(建议 PyTorch **2.8+**)。 +粗粒度 collective(`python.comm_collective`)只需 `PROBING=1`。NCCL profiler 插件需要 **NCCL ≥ 2.26**(建议 PyTorch **2.8+**);插件同时导出 **`ncclProfiler_v4`**(NCCL ≥ 2.27,优先)与 **`ncclProfiler_v3`**(NCCL 2.26),NCCL 自动协商最高版本。 + +## 三条 collective 采集路径 — 保持分叉,勿混淆 + +probing 有三条相互独立的集合通信采集路径,**计时语义不同**,不可混用: + +| 来源 | 表 | 测的是什么 | 定位 | +|------|----|-----------|------| +| **NCCL profiler 插件**(本文档) | `nccl.coll_perf`、`nccl.proxy_ops`、`nccl.inflight_ops`、`nccl.net_qp` | NCCL 原生事件:重建的执行时间、等待分解、带宽 | **精准数据源** | +| Torch API 层插桩(遗留,`probing/profiling/collective/`) | `python.comm_collective` | `torch.distributed` API 调用的 Python 墙钟(launch 层) | 粗粒度回退;独有 `global_step` 上下文 | +| PyTorch Flight Recorder 桥 | `python.torch_nccl_flight_record`、`python.torch_nccl_pg_status` | torch 内部 watchdog 环形缓冲 | watchdog timeout / desync 取证 | + +约定: + +- 插件启用时(设置了 `NCCL_PROFILER_PLUGIN`),Torch API 层插桩**默认关闭**—— + 同一批 collective 被两套语义各记一遍只会制造混乱。如需同开(例如要按 + `global_step` 对齐),`SET probing.torch.collective.enable=1`。 +- 查执行时间、带宽、等待归因,一律用 `nccl.*`。 + `python.comm_collective.duration_ms` **不是** NCCL 执行时间——`async_op` + 调用在 `work.wait()` 处收口,同步调用在 API 返回处收口。 +- 跨层关联:`nccl.*` 行不带训练步;需要时用 epoch 纳秒时间窗对 + `python.comm_collective.global_step` 对齐。 ## 快速开始(Linux 训练) @@ -21,7 +42,7 @@ pip install probing # Linux wheel 自带 libprobing_nccl_profiler.so export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) -export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # 默认 26 +export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # 默认 94 export PROBING=2 torchrun --nproc_per_node=8 train.py @@ -37,7 +58,7 @@ probing -t query " ### 可选:NetPlugin(IB QP 时延) ```bash -export NCCL_PROFILE_EVENT_MASK=154 # 26 + NetPlugin 位 128 +export NCCL_PROFILE_EVENT_MASK=222 # 94 + NetPlugin 位 128 probing -t query "SELECT * FROM nccl.net_qp LIMIT 20" ``` @@ -70,14 +91,71 @@ Mock 场景:**rank 2** = culprit(`send_gpu_wait_ns` 高),**rank 5** = vi | `peer` | 对端 rank | | `is_send` | `1` 发送 proxy,`0` 接收 | | `n_steps` | 聚合的 ProxyStep 数 | -| `trans_bytes` | 传输字节数 | +| `trans_bytes` | 传输字节数(v4 按 step 级 `transSize` 累计) | | `send_gpu_wait_ns` | **culprit 信号** — 本 GPU 未就绪 | +| `send_peer_wait_ns` | 等待接收端 clear-to-send credits(**仅 v4 ABI**,v3 为 0)— 对端拥塞信号 | | `send_wait_ns` | 发送侧网络等待 | | `recv_wait_ns` | **victim 信号** — 等待对端数据 | | `recv_flush_wait_ns` | 接收 flush 等待 | 多机:`global.nccl.proxy_ops`,带 `_host`、`_addr`、`_rank`。 +> 所有 `nccl.*` 表的 `ts` 均为 **UNIX epoch 纳秒**,`global.nccl.*` 跨 rank 查询时时间戳可直接比较。 + +### `nccl.coll_perf` + +每个 collective / P2P 操作一行。 + +**计时模型。** NCCL 官方文档明确:collective 的 `stopEvent` 只表示 **host 侧 +enqueue 结束**——内核与 proxy 线程在其后继续工作。插件按官方 ext-profiler +推荐做法,对子事件(`ProxyOp`、`KernelCh`)做引用计数,并用子事件窗口重建 +真实执行时间。`timing_source` 列标注实际使用的信号: + +| `timing_source` | 窗口 | 质量 | +|-----------------|------|------| +| `kernel_gpu` | GPU **globaltimer** 窗口:`kernelCh.pTimer`(起点)+ `KernelChStop` 状态(终点) | 最佳 — 设备时钟,**仅 v4 ABI** | +| `kernel_ch` | proxy 线程观测到的内核活动窗口(`ncclProfileKernelCh`) | NCCL 自身内核活动信号,host 时钟 | +| `proxy` | proxy op start→stop 包络 | 跨机操作较准 | +| `enqueue` | coll start→stop(仅 launch) | 回退 — 无 proxy/kernel 事件的机内操作 | + +| 列 | 含义 | +|----|------| +| `ts` | 完成时间戳(epoch 纳秒) | +| `rank`, `tp_rank`, `pp_rank`, `dp_rank` | 同 `nccl.proxy_ops` | +| `comm_hash`, `coll_func`, `seq` | 操作标识(P2P 的 `seq` 为 0) | +| `n_ranks` | 通信组大小(v4 per-comm `init` 提供;v3 为 `-1`) | +| `is_p2p` | `1` = Send/Recv,`0` = collective | +| `peer` | P2P 对端 rank(collective 为 `-1`) | +| `count`, `msg_size_bytes`, `dtype` | 消息负载:元素数 × dtype 字节数 | +| `algo`, `proto`, `n_channels` | NCCL 算法(Ring/Tree…)、协议(LL/LL128/Simple)、channel 数(v4 起 P2P 也有值) | +| `exec_time_ns` | 重建的真实执行耗时(见 `timing_source`) | +| `enqueue_time_ns` | host 侧 enqueue 耗时(NCCL coll start→stop) | +| `timing_source` | `kernel_gpu` / `kernel_ch` / `proxy` / `enqueue` | +| `algobw_gbps` | 算法带宽 `msg_size / exec_time`(GB/s)。**busbw** 在 SQL 中用 `n_ranks` 乘集合通信系数(如 AllReduce `2(n_ranks-1)/n_ranks`) | + +```sql +-- 按带宽找最慢的 collective 分桶 +SELECT coll_func, msg_size_bytes, AVG(algobw_gbps) AS gbps, COUNT(*) AS n +FROM nccl.coll_perf +GROUP BY coll_func, msg_size_bytes +ORDER BY gbps ASC LIMIT 10 +``` + +### `nccl.inflight_ops` + +watchdog 周期快照:**已 start 未 stop** 的操作——挂死的 op 永远不会触发 +`stop_event`,因此不会出现在 `nccl.proxy_ops` 里;这张表补上了 hang 场景的盲区。 +列:`ts`, `rank`, `comm_hash`, `coll_func`, `seq`, `kind`(`coll`/`p2p`/`proxy_op`), +`channel_id`, `peer`, `is_send`, `start_ns`, `age_ns`。 + +```sql +-- 哪个 rank 卡在哪个操作上? +SELECT rank, coll_func, seq, kind, MAX(age_ns)/1e9 AS stuck_secs +FROM nccl.inflight_ops +GROUP BY rank, coll_func, seq, kind +ORDER BY stuck_secs DESC +``` + ### `nccl.net_qp` IB QP 完成时延(需 NetPlugin mask)。列:`ts`, `rank`, `device`, `qp_num`, `wr_id`, `opcode`, `length`, `duration_ns`。 @@ -108,8 +186,11 @@ probing -t skill run nccl_culprit_victim --set seq_window=50 --global | 变量 | 作用 | |------|------| | `NCCL_PROFILER_PLUGIN` | `libprobing_nccl_profiler.so` 路径 | -| `NCCL_PROFILE_EVENT_MASK` | 事件 mask;默认 `26` = Coll \| ProxyOp \| ProxyStep | +| `NCCL_PROFILE_EVENT_MASK` | 事件 mask;默认 `94` = Coll \| P2P \| ProxyOp \| ProxyStep \| KernelCh | | `PROBING_DATA_DIR` | memtable 目录 | +| `PROBING_NCCL_MIN_MSG_BYTES` | 小于该字节数的操作不记录;默认 `0`(全记)。对应 NCCL Inspector 的 `DUMP_MIN_SIZE_BYTES` | +| `PROBING_NCCL_INFLIGHT_THRESHOLD_SECS` | watchdog:在途超过该秒数的操作快照进 `nccl.inflight_ops`;默认 `10`,`0` 关闭 | +| `PROBING_NCCL_POOL_SHARDS` | 按 comm hash 分片 slot pool(默认 `8`,范围 1–64);降低多 comm 场景下回调锁竞争 | | `PROBING_NCCL_MOCK` | 开发 mock:`auto` / `1` / `0` | | `TP_RANK`, `PP_RANK`, `DP_RANK` | 写入 proxy_ops 角色列 | diff --git a/docs/src/reference/env-vars.md b/docs/src/reference/env-vars.md index 1adb2264..1da7c9a4 100644 --- a/docs/src/reference/env-vars.md +++ b/docs/src/reference/env-vars.md @@ -108,6 +108,8 @@ Non-PROBING-prefixed aliases are also recognized for Megatron compatibility: |----------|-------------| | `PROBING_NCCL_MOCK` | Enable mock NCCL proxy data for testing without GPUs. | | `PROBING_NCCL_PROFILER` | Path to the NCCL profiler shared library. | +| `PROBING_NCCL_MIN_MSG_BYTES` | Skip recording NCCL ops smaller than this size in bytes (default `0` = record all). | +| `PROBING_NCCL_INFLIGHT_THRESHOLD_SECS` | Watchdog threshold for snapshotting in-flight (possibly hung) NCCL ops into `nccl.inflight_ops` (default `10`, `0` disables). | | `PROBING_HCCL_PROFAPI_REAL` | Path to the real HCCL profapi library (Ascend NPU). | | `PROBING_HCCL_SHIM` | Path to the HCCL shim library. | | `PROBING_HCCL_SHIM_LOG` | Enable HCCL shim debug logging. | @@ -127,6 +129,44 @@ Non-PROBING-prefixed aliases are also recognized for Megatron compatibility: | `PROBING_TORCHRUN_CLUSTER` | `1` | Enable automatic torchrun cluster registration. Set to `0` to disable. | | `PROBING_TORCHRUN_STORE_TIMEOUT` | — | Timeout for torchrun distributed store operations. | +### Megatron autostart + +Megatron integration is **best-effort** and enabled by default when Megatron env vars +or modules are detected. No training-script changes are required beyond `PROBING=2`. + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_MEGATRON` | `auto` | `auto` = on when Megatron env/modules detected; `on`/`off` to force. | +| `PROBING_MEGATRON_STEP_SYNC` | `auto` | Sync `probing.step` with Megatron iteration via wrapped `train_step`. | +| `probing.megatron.enable` | — | Config override for Megatron autostart (`probing.config.set`). | +| `probing.megatron.step_sync` | — | Config override for iteration sync. | + +Import hooks run when `megatron.core.parallel_state` and `megatron.training.training` +load: parallel ranks flow into `probing.set_role`, and `train_step` aligns step +coordinates for SQL JOINs. + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_FR_ON_WATCHDOG` | `auto` | On NCCL watchdog exceptions, snapshot Flight Recorder into probing tables. | +| `probing.fr.on_watchdog` | — | Config override for watchdog Flight Recorder snapshot. | + +### PyTorch Flight Recorder + +Probing can snapshot PyTorch NCCL Flight Recorder data via +`/apis/pythonext/flight-recorder/snapshot` and writes it to +`python.torch_nccl_flight_record` / `python.torch_nccl_pg_status`. +These variables are read by PyTorch, not Probing, but should be set before +`torch.distributed.init_process_group`. + +| Variable | Default | Description | +|----------|---------|-------------| +| `TORCH_NCCL_TRACE_BUFFER_SIZE` | PyTorch default | Set to a positive value (for example `2000`) to enable Flight Recorder ring-buffer collection. | +| `TORCH_NCCL_DUMP_ON_TIMEOUT` | `false` | Let PyTorch dump Flight Recorder files automatically on watchdog timeout. | +| `TORCH_FR_DUMP_TEMP_FILE` | PyTorch default | Prefix/path for PyTorch Flight Recorder dump files. | +| `TORCH_NCCL_TRACE_CPP_STACK` | `false` | Include C++ stack traces in Flight Recorder entries. | +| `TORCH_NCCL_ENABLE_TIMING` | `false` | Add CUDA timing events for collectives; may add overhead. | +| `TORCH_SYMBOLIZE_MODE` | PyTorch default | C++ stack symbolization mode (`dladdr`, `addr2line`, `fast`). | + ## Cluster heartbeat (torchrun) Hierarchical side-channel registration when `WORLD_SIZE > 1`. See [torchrun cluster heartbeat](../design/torchrun-cluster.md). @@ -143,13 +183,24 @@ Hierarchical side-channel registration when `WORLD_SIZE > 1`. See [torchrun clus | `PROBING_CLUSTER_REPORT_TIMEOUT_SEC` | `5` | HTTP PUT timeout for cluster report. | | `PROBING_CLUSTER_PRESET` | — | Used by `examples/run_cluster_multinode.sh`: `demo`, `fast`, or `steady`. | | `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | Hierarchical cluster query fan-out (coordinator → local0 → leaves). `0` = flat fan-out to every peer. See [Hierarchical fan-out](../design/hierarchical-fanout.md). | -| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `2` | Per-peer timeout for remote federated / cluster queries (seconds). | +| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `30` | Per-peer timeout for remote federated / cluster queries (seconds). | +| `PROBING_FANOUT_CONCURRENCY` | `128` | Max concurrent in-flight remote fan-out HTTP requests per query. | +| `PROBING_NCCL_CHUNK_BYTES` | `65536` | NCCL profiler mmap ring chunk size (bytes). | +| `PROBING_NCCL_NUM_CHUNKS` | `64` | NCCL profiler mmap ring chunk count (~4 MiB total per table at defaults). | +| `PROBING_NCCL_MAX_COLL_SLOTS` | `512` | Max in-flight collective/P2P event slots per rank. | +| `PROBING_NCCL_MAX_PROXY_OP_SLOTS` | `8192` | Max in-flight proxy-op slots per rank. | +| `PROBING_NCCL_MAX_PROXY_STEP_SLOTS` | `32768` | Max in-flight proxy-step slots per rank. | +| `PROBING_NCCL_MAX_KERNEL_CH_SLOTS` | `8192` | Max in-flight kernel-channel slots per rank. | +| `PROBING_NCCL_MAX_NET_SLOTS` | `4096` | Max in-flight net-plugin slots per rank. | +| `PROBING_NCCL_POOL_SHARDS` | `8` | Shard slot pools by comm hash (1–64); total slot limits are divided evenly across shards. | +| `PROBING_NCCL_MIN_MSG_BYTES` | `0` | Drop events below this message size (bytes); `0` = record all. | ## Debugging & diagnostics | Variable | Default | Description | |----------|---------|-------------| | `PROBING_LOGLEVEL` | `info` | Rust-side log level: `trace`, `debug`, `info`, `warn`, `error`. | +| `PROBING_ENGINE_FAIL_FAST` | — | When set to `1`/`true`, exit the process if engine initialization fails (default: server stays up but `/ready` returns 503 and queries fail). | | `PROBING_CRASH_BACKTRACE` | enabled | Print a backtrace on fatal signals (SIGSEGV, SIGABRT, etc.). Set to `0` to disable. | | `PROBING_RUST_BACKTRACE` | — | Rust error backtrace detail (similar to `RUST_BACKTRACE`). | | `PROBING_SAFE_DEMO` | — | Safe demonstration mode that restricts dangerous operations. | diff --git a/docs/src/reference/env-vars.zh.md b/docs/src/reference/env-vars.zh.md index 24fa4a3c..099e0a6c 100644 --- a/docs/src/reference/env-vars.zh.md +++ b/docs/src/reference/env-vars.zh.md @@ -25,7 +25,17 @@ Probing 读取的全部 `PROBING_*` 环境变量参考(按子系统分组) | `PROBING_CLUSTER_REPORT_TIMEOUT_SEC` | `5` | 集群 report HTTP PUT 超时。 | | `PROBING_CLUSTER_PRESET` | — | `examples/run_cluster_multinode.sh` 使用:`demo`、`fast`、`steady`。 | | `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | 分层集群查询 fan-out;`0` = 扁平 fan-out 到所有 peer。 | -| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `2` | 远程联邦 / 集群查询的单 peer 超时(秒)。 | +| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `30` | 远程联邦 / 集群查询的单 peer 超时(秒)。 | +| `PROBING_FANOUT_CONCURRENCY` | `128` | 单次 cluster fan-out 的最大并发远程 HTTP 请求数。 | +| `PROBING_NCCL_CHUNK_BYTES` | `65536` | NCCL profiler mmap 环缓冲 chunk 大小(字节)。 | +| `PROBING_NCCL_NUM_CHUNKS` | `64` | NCCL profiler mmap 环缓冲 chunk 数量(默认每表约 4 MiB)。 | +| `PROBING_NCCL_MAX_COLL_SLOTS` | `512` | 每 rank 最大 in-flight collective/P2P slot 数。 | +| `PROBING_NCCL_MAX_PROXY_OP_SLOTS` | `8192` | 每 rank 最大 proxy-op slot 数。 | +| `PROBING_NCCL_MAX_PROXY_STEP_SLOTS` | `32768` | 每 rank 最大 proxy-step slot 数。 | +| `PROBING_NCCL_MAX_KERNEL_CH_SLOTS` | `8192` | 每 rank 最大 kernel-channel slot 数。 | +| `PROBING_NCCL_MAX_NET_SLOTS` | `4096` | 每 rank 最大 net-plugin slot 数。 | +| `PROBING_NCCL_POOL_SHARDS` | `8` | 按 comm hash 分片 slot pool(1–64);总 slot 上限均分到各 shard。 | +| `PROBING_NCCL_MIN_MSG_BYTES` | `0` | 低于此消息大小(字节)的事件不记录;`0` = 全记录。 | ## 其余变量 diff --git a/docs/src/reference/sql-tables.md b/docs/src/reference/sql-tables.md index 7611b6eb..6006f015 100644 --- a/docs/src/reference/sql-tables.md +++ b/docs/src/reference/sql-tables.md @@ -260,6 +260,7 @@ Per-proxy-op wait decomposition (culprit vs victim). | `n_steps` | ProxyStep count aggregated | | `trans_bytes` | Bytes transferred | | `send_gpu_wait_ns` | **Culprit** — local GPU not ready to send | +| `send_peer_wait_ns` | Waiting for receiver clear-to-send credits (v4 ABI only; 0 on v3) | | `send_wait_ns` | Send-side network wait | | `recv_wait_ns` | **Victim** — waiting on peer data | | `recv_flush_wait_ns` | Recv flush wait | diff --git a/docs/src/reference/sql-tables.zh.md b/docs/src/reference/sql-tables.zh.md index e012b2c6..e873cf82 100644 --- a/docs/src/reference/sql-tables.zh.md +++ b/docs/src/reference/sql-tables.zh.md @@ -236,6 +236,7 @@ Proxy-op 等待分解(culprit / victim)。 | 列 | 说明 | |----|------| | `send_gpu_wait_ns` | **Culprit** — 本地 GPU 未就绪 | +| `send_peer_wait_ns` | 等待接收端 clear-to-send credits(仅 v4 ABI;v3 为 0) | | `recv_wait_ns` | **Victim** — 等待对端数据 | | `send_wait_ns` | 发送侧网络等待 | | `recv_flush_wait_ns` | Recv flush 等待 | diff --git a/probing/cli/src/cli/cluster.rs b/probing/cli/src/cli/cluster.rs index 8f84f57e..971f09cd 100644 --- a/probing/cli/src/cli/cluster.rs +++ b/probing/cli/src/cli/cluster.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use probing_proto::prelude::Node; +use probing_proto::prelude::NodeListResponse; use crate::cli::ctrl::ProbeEndpoint; use crate::table::render_dataframe; @@ -69,13 +69,25 @@ async fn cluster_query( } async fn cluster_nodes(ctrl: ProbeEndpoint) -> Result<()> { - let reply = ctrl.get("/apis/nodes").await?; - let nodes: Vec = serde_json::from_str(&reply)?; - if nodes.is_empty() { + let mut all = Vec::new(); + let mut offset = 0usize; + loop { + let reply = ctrl + .get(&format!("/apis/nodes?offset={offset}&limit=1024")) + .await?; + let page: NodeListResponse = serde_json::from_str(&reply)?; + let empty = page.nodes.is_empty(); + all.extend(page.nodes); + if all.len() >= page.total || empty { + break; + } + offset = offset.saturating_add(1024); + } + if all.is_empty() { println!("No cluster nodes registered."); return Ok(()); } - for node in nodes { + for node in all { println!( "{}:{} rank={:?} world_size={:?} status={:?}", node.host, node.addr, node.rank, node.world_size, node.status diff --git a/probing/cli/src/cli/ctrl.rs b/probing/cli/src/cli/ctrl.rs index afcb0ee5..965a8be8 100644 --- a/probing/cli/src/cli/ctrl.rs +++ b/probing/cli/src/cli/ctrl.rs @@ -149,7 +149,18 @@ impl ProbeEndpoint { let request = Message::new(q); let q_str = serde_json::to_string(&request)?; let reply_str = self.send_request("/query", &q_str).await?; // Renamed reply variable - let reply = serde_json::from_str::>(&reply_str)?.payload; + let msg = serde_json::from_str::>(&reply_str)?; + if let Some(meta) = &msg.meta { + if meta + .get("fanout") + .and_then(|f| f.get("partial")) + .and_then(|v| v.as_bool()) + .unwrap_or(false) + { + eprintln!("warning: federated query returned partial data: {meta}"); + } + } + let reply = msg.payload; match reply { QueryDataFormat::Error(err) => Err(anyhow::anyhow!("error: {}", err)), diff --git a/probing/cli/src/cli/skill/loader.rs b/probing/cli/src/cli/skill/loader.rs index a1ba784d..1dca3609 100644 --- a/probing/cli/src/cli/skill/loader.rs +++ b/probing/cli/src/cli/skill/loader.rs @@ -326,9 +326,51 @@ pub fn derive_variables(params: &HashMap) -> HashMap>() + .join("\n"); + let normalized = normalize_sql(&sql); + assert!(normalized.contains("global.python.comm_collective")); + assert!(normalized.contains("global.python.torch_nccl_flight_record")); + assert!(normalized.contains("global.nccl.proxy_ops")); + assert!(normalized.contains("- 13")); + assert!(!normalized.contains("{fr_table}")); + assert!(!normalized.contains("{nccl_proxy_table}")); + } } diff --git a/probing/cli/src/cli/skill/runner.rs b/probing/cli/src/cli/skill/runner.rs index d6a2c072..e1777930 100644 --- a/probing/cli/src/cli/skill/runner.rs +++ b/probing/cli/src/cli/skill/runner.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use anyhow::{anyhow, Result}; -use probing_proto::prelude::{DataFrame, Node, Query}; +use probing_proto::prelude::{DataFrame, Query}; use crate::cli::ctrl::ProbeEndpoint; use crate::table::{render, OutputFormat}; @@ -11,6 +11,14 @@ use crate::table::{render, OutputFormat}; use super::interpret::{evaluate_rules, InterpretFinding, StepEvidence}; use super::loader::{build_context, expand_template, load_skill, Skill, SkillStep}; +#[derive(Debug, Clone, Default, serde::Serialize)] +pub struct ClusterQueryMeta { + pub partial: bool, + pub nodes_queried: usize, + pub nodes_failed: Vec, + pub peer_batches_dropped: usize, +} + #[derive(Debug, Clone)] #[allow(dead_code)] pub enum StepOutcome { @@ -20,6 +28,8 @@ pub enum StepOutcome { dataframe: DataFrame, row_count: usize, note: Option, + degraded: bool, + cluster_meta: Option, }, ApiText { step_id: String, @@ -75,7 +85,10 @@ fn ensure_read_only_sql(sql: &str) -> Result<()> { Err(anyhow!("Only read-only SQL is allowed in skills")) } -async fn cluster_query(ctrl: &ProbeEndpoint, expr: &str) -> Result<(DataFrame, String)> { +async fn cluster_query( + ctrl: &ProbeEndpoint, + expr: &str, +) -> Result<(DataFrame, Option)> { let body = serde_json::json!({ "expr": expr, "cluster": true, @@ -91,21 +104,85 @@ async fn cluster_query(ctrl: &ProbeEndpoint, expr: &str) -> Result<(DataFrame, S .get("dataframe") .ok_or_else(|| anyhow!("missing dataframe in cluster response"))?; let dataframe: DataFrame = serde_json::from_value(df.clone())?; - let mut note = String::new(); - if let Some(meta) = value.get("meta") { - let nodes = meta - .get("nodes_queried") - .and_then(|v| v.as_u64()) - .unwrap_or(0); - note = format!("cluster fan-out · {nodes} nodes queried"); + let cluster_meta = value.get("meta").map(parse_cluster_meta); + Ok((dataframe, cluster_meta)) +} + +fn parse_cluster_meta(meta: &serde_json::Value) -> ClusterQueryMeta { + let nodes_failed: Vec = meta + .get("nodes_failed") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str().map(String::from)) + .collect() + }) + .unwrap_or_default(); + let peer_batches_dropped = meta + .get("peer_batches_dropped") + .and_then(|v| v.as_u64()) + .unwrap_or(0) as usize; + let nodes_queried = meta + .get("nodes_queried") + .and_then(|v| v.as_u64()) + .unwrap_or(0) as usize; + let partial = meta + .get("partial") + .and_then(|v| v.as_bool()) + .unwrap_or(false) + || !nodes_failed.is_empty() + || peer_batches_dropped > 0; + ClusterQueryMeta { + partial, + nodes_queried, + nodes_failed, + peer_batches_dropped, } - Ok((dataframe, note)) +} + +fn cluster_meta_note(meta: &ClusterQueryMeta) -> String { + format!( + "cluster fan-out · {} nodes queried · {} failed · {} peer batches dropped{}", + meta.nodes_queried, + meta.nodes_failed.len(), + meta.peer_batches_dropped, + if meta.partial { " · PARTIAL" } else { "" } + ) +} + +fn cluster_integrity_findings(outcomes: &[StepOutcome]) -> Vec { + let mut findings = Vec::new(); + for outcome in outcomes { + let StepOutcome::Sql { + step_id, + cluster_meta: Some(meta), + .. + } = outcome + else { + continue; + }; + if !meta.partial { + continue; + } + findings.push(InterpretFinding { + rule_id: format!("{step_id}_partial_fanout"), + severity: "error".to_string(), + message: format!( + "Cluster fan-out incomplete for step '{step_id}': {} nodes queried, {} failed, {} peer batches dropped — do not treat results as complete", + meta.nodes_queried, + meta.nodes_failed.len(), + meta.peer_batches_dropped, + ), + }); + } + findings } async fn fetch_cluster_peer_count(ctrl: &ProbeEndpoint) -> usize { - match ctrl.get("/apis/nodes").await { - Ok(reply) => match serde_json::from_str::>(&reply) { - Ok(nodes) => nodes.len().saturating_sub(1), + match ctrl.get("/apis/nodes?limit=1024").await { + Ok(reply) => match serde_json::from_str::(&reply) + { + Ok(resp) => resp.total.saturating_sub(1), Err(_) => 0, }, Err(_) => 0, @@ -144,17 +221,19 @@ async fn run_sql_step(ctrl: &ProbeEndpoint, step: &SkillStep, sql: &str) -> Step } let cluster = sql_needs_cluster(sql, step.cluster.unwrap_or(false)); let result = if cluster { - cluster_query(ctrl, sql) - .await - .map(|(df, note)| (df, Some(note))) + cluster_query(ctrl, sql).await.map(|(df, meta)| { + let note = meta.as_ref().map(cluster_meta_note); + (df, note, meta) + }) } else { ctrl.query(Query::new(sql.to_string())) .await - .map(|df| (df, None)) + .map(|df| (df, None, None)) }; match result { - Ok((df, note)) => { + Ok((df, note, cluster_meta)) => { + let degraded = cluster_meta.as_ref().is_some_and(|m| m.partial); let rows = dataframe_rows(&df); if rows == 0 { match step.on_empty.as_str() { @@ -172,6 +251,8 @@ async fn run_sql_step(ctrl: &ProbeEndpoint, step: &SkillStep, sql: &str) -> Step dataframe: df, row_count: 0, note, + degraded, + cluster_meta, }, _ => StepOutcome::Skipped { step_id: step.id.clone(), @@ -189,6 +270,8 @@ async fn run_sql_step(ctrl: &ProbeEndpoint, step: &SkillStep, sql: &str) -> Step dataframe: df, row_count: rows, note, + degraded, + cluster_meta, } } } @@ -295,9 +378,11 @@ fn print_outcome(outcome: &StepOutcome, format: OutputFormat) { dataframe, row_count, note, + degraded, .. } => { - println!("\n## {title} ({row_count} rows)"); + let tag = if *degraded { " [DEGRADED]" } else { "" }; + println!("\n## {title}{tag} ({row_count} rows)"); if let Some(n) = note { eprintln!("({n})"); } @@ -382,7 +467,8 @@ pub async fn run_skill( outcomes.push(outcome); } - let findings = evaluate_rules(&pb.interpretation, &evidence, &ctx); + let mut findings = evaluate_rules(&pb.interpretation, &evidence, &ctx); + findings.extend(cluster_integrity_findings(&outcomes)); print_findings(&findings); if !pb.summary_template.is_empty() { @@ -406,9 +492,18 @@ pub async fn run_skill( let had_error = outcomes .iter() .any(|o| matches!(o, StepOutcome::Error { .. })); + let had_degraded = outcomes.iter().any(|o| match o { + StepOutcome::Sql { degraded, .. } => *degraded, + _ => false, + }); if had_error { anyhow::bail!("skill finished with errors"); } + if had_degraded { + anyhow::bail!( + "skill finished with degraded/partial cluster data — results must not be treated as complete" + ); + } Ok(()) } @@ -423,6 +518,7 @@ pub async fn run_skill_json( let ctx = build_context(&pb, &overrides); let mut steps_out = Vec::new(); + let mut outcomes = Vec::new(); let mut evidence = Vec::new(); let mut abort = false; @@ -435,15 +531,17 @@ pub async fn run_skill_json( evidence.push(ev); } steps_out.push(outcome_to_json(&outcome)); + outcomes.push(outcome); if matches!( - &outcome, - StepOutcome::Error { .. } if step.on_empty == "abort" + outcomes.last(), + Some(StepOutcome::Error { .. }) if step.on_empty == "abort" ) { abort = true; } } - let findings = evaluate_rules(&pb.interpretation, &evidence, &ctx); + let mut findings = evaluate_rules(&pb.interpretation, &evidence, &ctx); + findings.extend(cluster_integrity_findings(&outcomes)); let findings_json: Vec = findings .iter() .map(|f| { @@ -473,6 +571,11 @@ pub async fn run_skill_json( .and_then(|v| v.as_str()) .is_some_and(|st| st == "error") }); + let had_degraded = steps_out.iter().any(|s| { + s.get("status") + .and_then(|v| v.as_str()) + .is_some_and(|st| st == "degraded") + }); let payload = serde_json::json!({ "skill_id": pb.id, @@ -482,7 +585,16 @@ pub async fn run_skill_json( "findings": findings_json, "summary": summary, "next_steps": pb.next_steps, - "status": if had_error { "error" } else { "ok" }, + "status": if had_error { + "error" + } else if had_degraded { + "degraded" + } else { + "ok" + }, + "data_quality": { + "partial_cluster_fanout": had_degraded, + }, }); if had_error { @@ -499,13 +611,16 @@ fn outcome_to_json(outcome: &StepOutcome) -> serde_json::Value { dataframe, row_count, note, + degraded, + cluster_meta, } => { serde_json::json!({ "step_id": step_id, "title": title, - "status": "ok", + "status": if *degraded { "degraded" } else { "ok" }, "row_count": row_count, "note": note, + "cluster_meta": cluster_meta, "dataframe": dataframe, }) } @@ -547,3 +662,20 @@ fn outcome_to_json(outcome: &StepOutcome) -> serde_json::Value { } } } + +#[cfg(test)] +mod cluster_meta_tests { + use super::parse_cluster_meta; + + #[test] + fn partial_when_nodes_failed_even_without_flag() { + let meta = parse_cluster_meta(&serde_json::json!({ + "partial": false, + "nodes_queried": 8, + "nodes_failed": ["10.0.0.3:8080"], + "peer_batches_dropped": 0, + })); + assert!(meta.partial); + assert_eq!(meta.nodes_failed.len(), 1); + } +} diff --git a/probing/core/src/core/cluster.rs b/probing/core/src/core/cluster.rs index 920fc95e..9ac2444d 100644 --- a/probing/core/src/core/cluster.rs +++ b/probing/core/src/core/cluster.rs @@ -122,21 +122,93 @@ pub fn update_nodes(nodes: Vec) { } } -/// Merge reported nodes, sweep stale entries to ``dead``, bump version, return snapshot. -pub fn apply_node_report(incoming: Vec) -> NodeReportResponse { +fn node_key(node: &Node) -> String { + format!("{}:{}", node.host, node.addr) +} + +fn delta_nodes(incoming: &[Node], removed: &[String]) -> Vec { + let cluster = read_cluster(); + let mut delta = Vec::with_capacity(incoming.len() + removed.len()); for node in incoming { + let key = node_key(node); + if let Some(stored) = cluster.nodes.get(&key) { + delta.push(stored.clone()); + } else { + delta.push(node.clone()); + } + } + for key in removed { + if let Some(node) = cluster.nodes.get(key) { + delta.push(node.clone()); + } + } + delta +} + +/// Merge reported nodes, sweep stale entries to ``dead``, bump version, return snapshot. +pub fn apply_node_report(incoming: Vec, seen_version: u64) -> NodeReportResponse { + let version_before = cluster_version(); + for node in incoming.iter().cloned() { update_node(node); } let removed = mark_stale_nodes_as_dead(); - let version = CLUSTER_VERSION.fetch_add(1, Ordering::Relaxed) + 1; + let changed = !incoming.is_empty() || !removed.is_empty(); + let version = if changed { + CLUSTER_VERSION.fetch_add(1, Ordering::Relaxed) + 1 + } else { + version_before + }; + + let nodes = if seen_version >= version_before && seen_version > 0 { + delta_nodes(&incoming, &removed) + } else if seen_version >= version_before { + if changed { + delta_nodes(&incoming, &removed) + } else { + Vec::new() + } + } else { + Vec::new() + }; + NodeReportResponse { ok: true, version, - nodes: get_nodes(), + nodes, removed, } } +/// Apply a delta from a parent coordinator without re-POSTing the full snapshot over HTTP. +pub fn apply_snapshot_delta(nodes: Vec, removed: &[String], version: u64) { + for node in nodes { + update_node(node); + } + for key in removed { + let mut parts = key.splitn(2, ':'); + if let (Some(host), Some(addr)) = (parts.next(), parts.next()) { + write_cluster().remove_by_addr(host, addr); + } + } + CLUSTER_VERSION.store(version, Ordering::Relaxed); +} + +/// Paginated node list; returns empty when ``since_version`` is current. +pub fn get_nodes_page( + offset: usize, + limit: usize, + since_version: Option, +) -> (u64, usize, Vec) { + let version = cluster_version(); + if since_version.is_some_and(|v| v >= version) { + return (version, read_cluster().nodes.len(), Vec::new()); + } + let all = get_nodes(); + let total = all.len(); + let page = all.into_iter().skip(offset).take(limit).collect(); + (version, total, page) +} + pub fn cluster_version() -> u64 { CLUSTER_VERSION.load(Ordering::Relaxed) } @@ -273,6 +345,23 @@ pub fn hierarchical_metadata_available() -> bool { .any(|n| n.group_rank.is_some() && n.local_rank.is_some()) } +/// Error prefix returned when hierarchical fan-out is requested but metadata is missing. +pub const HIERARCHICAL_METADATA_UNAVAILABLE: &str = + "cluster hierarchical fan-out unavailable: cluster.nodes missing group_rank/local_rank metadata"; + +/// Build a user-facing error for missing hierarchical metadata. +pub fn hierarchical_metadata_unavailable_err() -> anyhow::Error { + anyhow::anyhow!( + "{HIERARCHICAL_METADATA_UNAVAILABLE} — wait for torchrun heartbeat to converge, \ + or set hierarchical=false / PROBING_CLUSTER_FANOUT_HIERARCHICAL=0 for legacy flat fan-out" + ) +} + +pub fn is_hierarchical_metadata_unavailable(err: &anyhow::Error) -> bool { + err.to_string() + .starts_with(HIERARCHICAL_METADATA_UNAVAILABLE) +} + #[cfg(any(test, feature = "test-utils"))] pub fn reset_cluster_for_tests() { *write_cluster() = Cluster::default(); @@ -300,7 +389,7 @@ mod tests { ..Default::default() }; write_cluster().put(old); - let resp = apply_node_report(vec![]); + let resp = apply_node_report(vec![], cluster_version()); assert!(resp.nodes.iter().any(|n| n.rank == Some(1))); let dead = resp.nodes.iter().find(|n| n.rank == Some(1)).unwrap(); assert_eq!(dead.status.as_deref(), Some("dead")); @@ -318,12 +407,49 @@ mod tests { status: Some("running".into()), ..Default::default() }; - let resp = apply_node_report(vec![node]); + let resp = apply_node_report(vec![node], 0); assert_eq!(resp.nodes.len(), 1); assert_eq!(resp.nodes[0].status.as_deref(), Some("running")); assert!(resp.nodes[0].timestamp > 0); } + #[test] + fn incremental_heartbeat_returns_delta_not_full_snapshot() { + let _guard = TEST_LOCK.lock().unwrap(); + reset_cluster_for_tests(); + let node = Node { + host: "h1".into(), + addr: "10.0.0.1:3".into(), + rank: Some(3), + status: Some("running".into()), + ..Default::default() + }; + let first = apply_node_report(vec![node.clone()], 0); + assert_eq!(first.nodes.len(), 1); + let v = first.version; + let second = apply_node_report(vec![node], v); + assert_eq!(second.nodes.len(), 1); + assert!(second.version >= v); + let third = apply_node_report(vec![], second.version); + assert!(third.nodes.is_empty()); + } + + #[test] + fn get_nodes_page_respects_since_version() { + let _guard = TEST_LOCK.lock().unwrap(); + reset_cluster_for_tests(); + write_cluster().put(Node { + host: "h".into(), + addr: "10.0.0.1:0".into(), + rank: Some(0), + ..Default::default() + }); + let version = cluster_version(); + let (_, total, page) = get_nodes_page(0, 10, Some(version)); + assert_eq!(total, 1); + assert!(page.is_empty()); + } + #[test] fn get_nodes_sorted_by_rank() { let _guard = TEST_LOCK.lock().unwrap(); diff --git a/probing/core/src/core/engine.rs b/probing/core/src/core/engine.rs index c7129a0f..412af57f 100644 --- a/probing/core/src/core/engine.rs +++ b/probing/core/src/core/engine.rs @@ -107,12 +107,13 @@ impl Engine { query: T, ) -> Result> { let original: String = query.into(); - if let Some(df) = federation::try_execute_aggregate_pushdown(self, &original).await? { + let capped = federation::ensure_global_scan_limit(&original); + if let Some(df) = federation::try_execute_aggregate_pushdown(self, &capped).await? { return Ok(Some(df)); } let default_schema = self.default_namespace(); - let query: String = metadata_rewrite::prepare_metadata_query(&original, &default_schema) - .unwrap_or(original); + let query: String = + metadata_rewrite::prepare_metadata_query(&capped, &default_schema).unwrap_or(capped); let query: String = federation::prepare_global_query(&query); let df = self.sql(query.as_str()).await?; let schema = df.schema().clone(); @@ -131,6 +132,7 @@ impl Engine { return Ok(Some(probing_proto::prelude::DataFrame::new(names, columns))); } let batch = concat_batches(&batches[0].schema(), batches.iter())?; + federation::cap_materialized_rows(&original, batch.num_rows())?; let names = batch .schema() @@ -148,8 +150,11 @@ impl Engine { #[deprecated] pub fn query>(&self, q: T) -> Result { - futures::executor::block_on(async { self.async_query(q).await }) - .map(|opt| opt.unwrap_or_default()) + futures::executor::block_on(async { self.async_query(q).await })?.ok_or_else(|| { + DataFusionError::Execution( + "query returned no dataframe (engine unavailable or empty response)".into(), + ) + }) } /// Get default namespace from configuration diff --git a/probing/core/src/core/federation/aggregate_pushdown.rs b/probing/core/src/core/federation/aggregate_pushdown.rs index b66d0db7..2aa44e56 100644 --- a/probing/core/src/core/federation/aggregate_pushdown.rs +++ b/probing/core/src/core/federation/aggregate_pushdown.rs @@ -29,6 +29,7 @@ use super::convert::{ use super::fanout_scope::{ current_fanout_scope, is_local0_from_env, resolve_fanout_scope, FanoutScope, }; +use super::rewrite::can_fanout_via_global_catalog; static PARTIAL_TABLE_ID: AtomicU64 = AtomicU64::new(0); @@ -48,6 +49,13 @@ pub struct FederatedAggregatePlan { } pub fn plan_federated_aggregate_pushdown(sql: &str) -> Option { + // Same gate as path routing (`classify_federated_sql`): JOIN / CTE / UNION / + // subqueries must not reach pushdown. In particular, a WHERE subquery would be + // copied verbatim into the per-node SQL, shipping `global.*` references to peers + // and triggering recursive fan-out. + if !can_fanout_via_global_catalog(sql) { + return None; + } let stmt = parse_single_statement(sql)?; let Statement::Query(query) = stmt else { return None; @@ -107,17 +115,25 @@ pub async fn try_execute_aggregate_pushdown( .await .map_err(|e| DataFusionError::Execution(format!("aggregate fan-out join failed: {e}")))?; append_fanout_outcomes(&mut proto_parts, &mut stats, &plan, outcomes); - set_fanout_stats(stats); if proto_parts.is_empty() { + set_fanout_stats(stats); return Ok(None); } let result = if let Some(merge_sql) = plan.coordinator_sql { - let batches: Vec = proto_parts - .iter() - .filter_map(|df| proto_dataframe_to_record_batch(df).ok()) - .collect(); + let mut batches = Vec::with_capacity(proto_parts.len()); + let mut convert_failed = 0usize; + for df in &proto_parts { + match proto_dataframe_to_record_batch(df) { + Ok(batch) => batches.push(batch), + Err(e) => { + convert_failed += 1; + log::warn!("aggregate pushdown: dropped peer batch during merge: {e}"); + } + } + } + stats.peer_batches_dropped += convert_failed; merge_on_coordinator(&engine.context, &merge_sql, batches).await? } else if proto_parts.len() == 1 { proto_parts.remove(0) @@ -131,6 +147,7 @@ pub async fn try_execute_aggregate_pushdown( result }; + set_fanout_stats(stats); Ok(Some(result)) } @@ -202,8 +219,11 @@ fn plan_from_query(query: &Query) -> Option { } } - let (aggregates, has_unsafe_distinct) = plan_aggregates(select, &data_group)?; - if aggregates.is_empty() || has_unsafe_distinct { + // Distinct aggregates are only safe when each per-node partial stays a final + // row (grouped solely by federation tags, so no cross-node re-aggregation). + let distinct_safe = data_group.is_empty() && !tag_group.is_empty(); + let aggregates = plan_aggregates(select, distinct_safe)?; + if aggregates.is_empty() { return None; } @@ -318,12 +338,8 @@ fn function_is_distinct(func: &Function) -> bool { } } -fn plan_aggregates( - select: &Select, - data_group: &[String], -) -> Option<(Vec, bool)> { +fn plan_aggregates(select: &Select, distinct_safe: bool) -> Option> { let mut aggregates = Vec::new(); - let mut has_unsafe_distinct = false; for item in &select.projection { let (expr, alias) = match item { SelectItem::UnnamedExpr(expr) => (expr, None), @@ -337,24 +353,24 @@ fn plan_aggregates( return None; }; let distinct = function_is_distinct(func); + if distinct && !distinct_safe { + // Per-node distinct counts are not decomposable: summing them at the + // coordinator overcounts values seen on multiple nodes. Fall back to + // the federated scan path, which aggregates raw rows exactly. + return None; + } let merge_fn = if distinct { - if !data_group.is_empty() { - has_unsafe_distinct = true; - } None } else { merge_fn_for_function(func) }; - if distinct && !data_group.is_empty() { - continue; - } if !distinct && merge_fn.is_none() { return None; } let alias = alias.unwrap_or_else(|| expr.to_string()); aggregates.push(PlannedAggregate { alias, merge_fn }); } - Some((aggregates, has_unsafe_distinct)) + Some(aggregates) } fn merge_fn_for_function(func: &Function) -> Option<&'static str> { @@ -578,6 +594,38 @@ mod tests { assert!(plan_federated_aggregate_pushdown(sql).is_none()); } + #[test] + fn rejects_count_distinct_without_group_by() { + // Summing per-node distinct counts at the coordinator would overcount + // values present on multiple nodes. + let sql = "SELECT count(distinct name) AS n FROM global.process.envs"; + assert!(plan_federated_aggregate_pushdown(sql).is_none()); + } + + #[test] + fn rejects_count_distinct_grouped_by_tag_and_data_column() { + let sql = "SELECT _rank, name, count(distinct value) AS n \ + FROM global.process.envs GROUP BY _rank, name"; + assert!(plan_federated_aggregate_pushdown(sql).is_none()); + } + + #[test] + fn rejects_where_subquery() { + // A WHERE subquery would be pushed verbatim to peers, shipping `global.*` + // references outward and triggering recursive fan-out. + let sql = "SELECT _rank, sum(duration_ms) AS ms FROM global.python.comm_collective \ + WHERE global_step >= (SELECT max(global_step) - 50 FROM global.python.comm_collective) \ + GROUP BY _rank"; + assert!(plan_federated_aggregate_pushdown(sql).is_none()); + } + + #[test] + fn rejects_join_query() { + let sql = + "SELECT sum(a.x) AS s FROM global.python.a a JOIN global.python.b b ON a.id = b.id"; + assert!(plan_federated_aggregate_pushdown(sql).is_none()); + } + #[test] fn plans_order_by_limit_as_post_merge_tail() { let sql = "SELECT name, count(*) AS n FROM global.process.envs GROUP BY name ORDER BY n DESC LIMIT 3"; diff --git a/probing/core/src/core/federation/cluster_executor.rs b/probing/core/src/core/federation/cluster_executor.rs index 764849f5..762d2dea 100644 --- a/probing/core/src/core/federation/cluster_executor.rs +++ b/probing/core/src/core/federation/cluster_executor.rs @@ -26,9 +26,12 @@ pub fn set_remote_query_hook(hook: Option) { } /// Default per-node timeout for remote federated queries (seconds). -const DEFAULT_REMOTE_QUERY_TIMEOUT_SECS: u64 = 2; +const DEFAULT_REMOTE_QUERY_TIMEOUT_SECS: u64 = 30; /// Env var to override the per-node remote query timeout (seconds). const REMOTE_QUERY_TIMEOUT_ENV: &str = "PROBING_REMOTE_QUERY_TIMEOUT_SECS"; +/// Max concurrent remote fan-out requests (HTTP or in-process federation). +const REMOTE_FANOUT_CONCURRENCY_ENV: &str = "PROBING_FANOUT_CONCURRENCY"; +const DEFAULT_REMOTE_FANOUT_CONCURRENCY: usize = 128; fn external(err: E) -> DataFusionError { DataFusionError::External(Box::new(err)) @@ -48,6 +51,19 @@ pub fn remote_query_timeout() -> Duration { Duration::from_secs(secs) } +/// Max concurrent in-flight remote fan-out requests per query. +/// +/// Defaults to [`DEFAULT_REMOTE_FANOUT_CONCURRENCY`]; override via +/// `PROBING_FANOUT_CONCURRENCY`. A value of `0` (or unparseable) falls back +/// to the default. +pub fn remote_fanout_concurrency() -> usize { + std::env::var(REMOTE_FANOUT_CONCURRENCY_ENV) + .ok() + .and_then(|v| v.trim().parse::().ok()) + .filter(|&v| v > 0) + .unwrap_or(DEFAULT_REMOTE_FANOUT_CONCURRENCY) +} + /// Outcome of a remote query against a single peer, retaining node identity so /// callers can tag rows and account for successes/failures. pub struct RemoteFanoutResult { @@ -61,6 +77,8 @@ pub struct RemoteFanoutResult { pub struct FanoutStats { pub nodes_succeeded: usize, pub nodes_failed: Vec, + /// Peer partial DataFrames dropped during coordinator merge (conversion failure). + pub peer_batches_dropped: usize, } static LAST_FANOUT_STATS: LazyLock> = @@ -131,16 +149,23 @@ impl ProbeClusterExecutor { FanoutScope::Coordinator => { if hierarchical_metadata_available() { node_aggregator_peers() - } else { - log::debug!( - "hierarchical fan-out metadata missing; falling back to flat peers" + } else if crate::core::federation::fanout_scope::hierarchical_fanout_enabled() { + log::warn!( + "hierarchical fan-out metadata missing; refusing flat peer fallback (Coordinator scope)" ); + Vec::new() + } else { remote_peers_excluding_local() } } FanoutScope::Node => { if hierarchical_metadata_available() { local_leaf_peers() + } else if crate::core::federation::fanout_scope::hierarchical_fanout_enabled() { + log::warn!( + "hierarchical fan-out metadata missing; refusing flat peer fallback (Node scope)" + ); + Vec::new() } else { remote_peers_excluding_local() } @@ -164,46 +189,49 @@ impl ProbeClusterExecutor { return Vec::new(); } let scope = resolve_fanout_scope(scope); - std::thread::scope(|s| { - let handles: Vec<_> = nodes - .into_iter() - .map(|node| { - s.spawn(move || { - let host = if node.host.is_empty() { - node.addr.clone() - } else { - node.host.clone() - }; - let result = Self::execute_remote_scoped(&node.addr, sql, scope); - RemoteFanoutResult { - addr: node.addr, - host, - rank: node.rank, - result, - } + let concurrency = remote_fanout_concurrency(); + let mut results = Vec::with_capacity(nodes.len()); + for chunk in nodes.chunks(concurrency) { + std::thread::scope(|s| { + let handles: Vec<_> = chunk + .iter() + .map(|node| { + let node = node.clone(); + s.spawn(move || { + let host = if node.host.is_empty() { + node.addr.clone() + } else { + node.host.clone() + }; + let result = Self::execute_remote_scoped(&node.addr, sql, scope); + RemoteFanoutResult { + addr: node.addr, + host, + rank: node.rank, + result, + } + }) }) - }) - .collect(); - handles - .into_iter() - .map(|handle| { - handle.join().unwrap_or_else(|_| RemoteFanoutResult { + .collect(); + for handle in handles { + results.push(handle.join().unwrap_or_else(|_| RemoteFanoutResult { addr: String::new(), host: String::new(), rank: None, result: Err(DataFusionError::Execution( "remote query thread panicked".into(), )), - }) - }) - .collect() - }) + })); + } + }); + } + results } /// Peer nodes and execution scope for a federated table scan. /// /// When hierarchical coordinator tier finds no ``local_rank == 0`` aggregators, - /// falls back to flat peers and plain remote SQL (matches metadata-missing behavior). + /// only falls back to flat peers if hierarchical fan-out is disabled. pub fn federated_scan_targets() -> (Vec, FanoutScope) { let resolved = resolve_fanout_scope(current_fanout_scope()); match resolved { diff --git a/probing/core/src/core/federation/mod.rs b/probing/core/src/core/federation/mod.rs index b705b0e3..2d250031 100644 --- a/probing/core/src/core/federation/mod.rs +++ b/probing/core/src/core/federation/mod.rs @@ -5,6 +5,7 @@ mod fanout_scope; mod federated_scan_exec; mod global_catalog; mod global_table; +mod query_guard; mod rewrite; mod route; mod sql_gen; @@ -15,8 +16,8 @@ pub use aggregate_pushdown::{ #[cfg(any(test, feature = "test-utils"))] pub use cluster_executor::set_remote_query_hook; pub use cluster_executor::{ - remote_query_timeout, reset_fanout_stats, set_fanout_stats, take_fanout_stats, FanoutStats, - ProbeClusterExecutor, RemoteFanoutResult, + remote_fanout_concurrency, remote_query_timeout, reset_fanout_stats, set_fanout_stats, + take_fanout_stats, FanoutStats, ProbeClusterExecutor, RemoteFanoutResult, }; pub use convert::{ cluster_local_rank_for_endpoint, cluster_node_rank_for_endpoint, cluster_rank_for_endpoint, @@ -30,6 +31,10 @@ pub use fanout_scope::{ set_fanout_scope, take_fanout_scope, with_fanout_scope, FanoutScope, }; pub use global_catalog::{install_global_catalog, GLOBAL_CATALOG}; +pub use query_guard::{ + cap_materialized_rows, ensure_global_scan_limit, global_scan_max_rows, require_broadcast_limit, + sql_has_limit, validate_global_query, +}; pub use rewrite::{ can_fanout_via_global_catalog, ensure_global_node_columns, prepare_global_query, rewrite_global_catalog_to_probe, rewrite_sql_for_global_fanout, diff --git a/probing/core/src/core/federation/query_guard.rs b/probing/core/src/core/federation/query_guard.rs new file mode 100644 index 00000000..fdcceceb --- /dev/null +++ b/probing/core/src/core/federation/query_guard.rs @@ -0,0 +1,166 @@ +//! Guardrails for federated / global-catalog queries (LIMIT, row caps). + +use datafusion::error::{DataFusionError, Result}; +use datafusion::sql::sqlparser::ast::{Query, SetExpr, Statement}; +use datafusion::sql::sqlparser::dialect::GenericDialect; +use datafusion::sql::sqlparser::parser::Parser; + +use super::rewrite::{prepare_global_query, rewrite_sql_for_global_fanout}; +use super::route::{classify_federated_sql, FederatedQueryPath}; + +const GLOBAL_SCAN_MAX_ROWS_ENV: &str = "PROBING_GLOBAL_SCAN_MAX_ROWS"; +const REQUIRE_BROADCAST_LIMIT_ENV: &str = "PROBING_REQUIRE_BROADCAST_LIMIT"; +const DEFAULT_GLOBAL_SCAN_MAX_ROWS: usize = 10_000; + +/// Max rows materialized for a federated query without an explicit LIMIT. +pub fn global_scan_max_rows() -> usize { + std::env::var(GLOBAL_SCAN_MAX_ROWS_ENV) + .ok() + .and_then(|v| v.trim().parse::().ok()) + .filter(|&v| v > 0) + .unwrap_or(DEFAULT_GLOBAL_SCAN_MAX_ROWS) +} + +/// When true (default), broadcast paths (JOIN / CTE / UNION) require LIMIT. +pub fn require_broadcast_limit() -> bool { + !matches!( + std::env::var(REQUIRE_BROADCAST_LIMIT_ENV) + .ok() + .as_deref() + .map(str::trim), + Some("0") | Some("false") | Some("FALSE") | Some("off") | Some("OFF") + ) +} + +/// Whether the SQL contains a top-level LIMIT (or OFFSET) on any SELECT. +pub fn sql_has_limit(sql: &str) -> bool { + let dialect = GenericDialect {}; + let Ok(stmts) = Parser::parse_sql(&dialect, sql) else { + return false; + }; + stmts.iter().any(stmt_has_limit) +} + +fn stmt_has_limit(stmt: &Statement) -> bool { + match stmt { + Statement::Query(q) => query_has_limit(q), + _ => false, + } +} + +fn query_has_limit(q: &Query) -> bool { + if q.limit_clause.is_some() || q.fetch.is_some() { + return true; + } + match q.body.as_ref() { + SetExpr::Select(_) => false, + SetExpr::Query(inner) => query_has_limit(inner), + SetExpr::SetOperation { left, right, .. } => { + matches!(left.as_ref(), SetExpr::Query(q) if query_has_limit(q)) + || matches!(right.as_ref(), SetExpr::Query(q) if query_has_limit(q)) + } + _ => false, + } +} + +fn federated_path(sql: &str) -> FederatedQueryPath { + let global_sql = prepare_global_query(&rewrite_sql_for_global_fanout(sql)); + classify_federated_sql(&global_sql) +} + +/// Reject cross-node broadcast fan-out SQL without LIMIT. +/// +/// Only call before cluster fan-out (`cluster=true`); local probe-catalog queries +/// (including JOINs on `python.*`) are allowed without LIMIT and skip row cap. +pub fn validate_global_query(sql: &str) -> Result<()> { + match federated_path(sql) { + FederatedQueryPath::Local => Ok(()), + FederatedQueryPath::Broadcast if require_broadcast_limit() && !sql_has_limit(sql) => { + Err(DataFusionError::Plan( + "broadcast federated query (JOIN/CTE/UNION) requires an explicit LIMIT clause \ + — unbounded cross-node materialization is disabled" + .into(), + )) + } + _ => Ok(()), + } +} + +/// Append a coordinator-side LIMIT for single-table federated scans missing LIMIT. +pub fn ensure_global_scan_limit(sql: &str) -> String { + if sql_has_limit(sql) { + return sql.to_string(); + } + match federated_path(sql) { + FederatedQueryPath::Local | FederatedQueryPath::Broadcast => sql.to_string(), + _ => format!( + "{} LIMIT {}", + sql.trim_end_matches(';'), + global_scan_max_rows() + ), + } +} + +/// Fail when a federated query materializes more rows than allowed. +pub fn cap_materialized_rows(sql: &str, row_count: usize) -> Result<()> { + // Local probe-catalog queries (no global.*) stay on-node; skip federated row cap. + if !sql.to_lowercase().contains("global.") { + return Ok(()); + } + if federated_path(sql) == FederatedQueryPath::Local { + return Ok(()); + } + let max = global_scan_max_rows(); + if row_count > max { + Err(DataFusionError::ResourcesExhausted(format!( + "federated query materialized {row_count} rows (max {max}, set PROBING_GLOBAL_SCAN_MAX_ROWS)" + ))) + } else { + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn detects_limit_clause() { + assert!(sql_has_limit("SELECT 1 LIMIT 5")); + assert!(!sql_has_limit("SELECT 1")); + } + + #[test] + fn broadcast_without_limit_rejected() { + let sql = "SELECT a.x FROM python.a JOIN python.b ON a.id = b.id"; + assert!(validate_global_query(sql).is_err()); + } + + #[test] + fn scan_without_limit_gets_cap() { + let sql = "SELECT rank FROM python.comm_collective"; + let capped = ensure_global_scan_limit(sql); + assert!(capped.contains("LIMIT")); + } + + #[test] + fn local_python_scan_skips_row_cap() { + let sql = "SELECT module, stage FROM python.torch_trace WHERE stage LIKE 'post %'"; + assert!(cap_materialized_rows(sql, 1_000_000).is_ok()); + } + + #[test] + fn local_python_join_skips_row_cap() { + let sql = "SELECT post.module FROM python.torch_trace pre \ + INNER JOIN python.torch_trace post ON pre.local_step = post.local_step"; + assert!(cap_materialized_rows(sql, 1_000_000).is_ok()); + } + + #[test] + fn global_federated_scan_row_cap_enforced() { + let sql = "SELECT rank FROM global.comm_collective"; + let over = global_scan_max_rows() + 1; + assert!(cap_materialized_rows(sql, over).is_err()); + assert!(cap_materialized_rows(sql, 1).is_ok()); + } +} diff --git a/probing/core/src/storage/distributed.rs b/probing/core/src/storage/distributed.rs index 20ef506f..e9148258 100644 --- a/probing/core/src/storage/distributed.rs +++ b/probing/core/src/storage/distributed.rs @@ -210,7 +210,7 @@ impl EntityStore for DistributedEntityStore { let write_locations = self.select_write_locations(&locations, &self.default_consistency); - println!( + log::debug!( "Write locations for entity {}: {:?}\n\t{:?}", entity.id(), write_locations, diff --git a/probing/core/src/tracing.rs b/probing/core/src/tracing.rs index e25c9523..e8da751b 100644 --- a/probing/core/src/tracing.rs +++ b/probing/core/src/tracing.rs @@ -218,13 +218,13 @@ impl LocalSpanManager { .push(attr(key, value)); } } else { - eprintln!( - "Error: Active span_id {:?} not found in spans map during add_attr.", + log::warn!( + "Active span_id {:?} not found in spans map during add_attr.", active_span_id ); } } else { - eprintln!("Error: No active span to add attribute to."); + log::warn!("No active span to add attribute to."); } } @@ -242,13 +242,13 @@ impl LocalSpanManager { }); } } else { - eprintln!( - "Error: Active span_id {:?} not found in spans map during add_event.", + log::warn!( + "Active span_id {:?} not found in spans map during add_event.", active_span_id ); } } else { - eprintln!("Error: No active span to add event to."); + log::warn!("No active span to add event to."); } } @@ -260,8 +260,8 @@ impl LocalSpanManager { ended_span.end_time = Some(end_time); ended_span.status = final_status; } else { - eprintln!( - "Error: Popped span_id {:?} not found in spans map during end_span.", + log::warn!( + "Popped span_id {:?} not found in spans map during end_span.", active_id_on_stack ); } @@ -274,7 +274,7 @@ impl LocalSpanManager { } } } else { - eprintln!("Error: Attempting to end span but span_stack is empty."); + log::warn!("Attempting to end span but span_stack is empty."); } } diff --git a/probing/extensions/hccl-profapi/Cargo.toml b/probing/extensions/hccl-profapi/Cargo.toml index 6bc54c40..99e87e09 100644 --- a/probing/extensions/hccl-profapi/Cargo.toml +++ b/probing/extensions/hccl-profapi/Cargo.toml @@ -14,6 +14,8 @@ path = "../hccl-shim/src/lib.rs" [dependencies] probing-memtable = { path = "../../memtable" } +env_logger = { workspace = true } +log = { workspace = true } once_cell = { workspace = true } parking_lot = "0.12" diff --git a/probing/extensions/hccl-shim/Cargo.toml b/probing/extensions/hccl-shim/Cargo.toml index a56197d8..86d8f6a9 100644 --- a/probing/extensions/hccl-shim/Cargo.toml +++ b/probing/extensions/hccl-shim/Cargo.toml @@ -14,6 +14,8 @@ crate-type = ["rlib"] [dependencies] probing-memtable = { path = "../../memtable" } +env_logger = { workspace = true } +log = { workspace = true } once_cell = { workspace = true } parking_lot = "0.12" diff --git a/probing/extensions/hccl-shim/src/forward.rs b/probing/extensions/hccl-shim/src/forward.rs index 21344186..13b4746a 100644 --- a/probing/extensions/hccl-shim/src/forward.rs +++ b/probing/extensions/hccl-shim/src/forward.rs @@ -62,7 +62,7 @@ fn log_once(msg: &str) { .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) .is_ok() { - eprintln!("[probing-hccl-shim] {msg}"); + crate::log::info(msg); } } @@ -153,10 +153,10 @@ fn real_lib() -> Option>> { .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) .is_ok() { - eprintln!( - "[probing-hccl-shim] real libprofapi not found; MSProf forward disabled. \ + crate::log::warn(format!( + "real libprofapi not found; MSProf forward disabled. \ Set {ENV_REAL} or place {REAL_BASENAME} next to the shim." - ); + )); } } } diff --git a/probing/extensions/hccl-shim/src/lib.rs b/probing/extensions/hccl-shim/src/lib.rs index 6ce9c629..2e5149cd 100644 --- a/probing/extensions/hccl-shim/src/lib.rs +++ b/probing/extensions/hccl-shim/src/lib.rs @@ -5,6 +5,7 @@ #[cfg(target_os = "linux")] mod forward; +mod log; mod msprof; mod names; pub mod tables; diff --git a/probing/extensions/hccl-shim/src/log.rs b/probing/extensions/hccl-shim/src/log.rs new file mode 100644 index 00000000..56a3b947 --- /dev/null +++ b/probing/extensions/hccl-shim/src/log.rs @@ -0,0 +1,27 @@ +//! Lazy `log` init for the HCCL shim (dlopen'd without the main probing module). + +use std::sync::Once; + +static INIT: Once = Once::new(); + +pub fn ensure() { + INIT.call_once(|| { + let _ = env_logger::Builder::from_env( + env_logger::Env::new() + .default_filter_or("warn") + .filter("PROBING_LOGLEVEL"), + ) + .format_target(true) + .try_init(); + }); +} + +pub fn info(msg: impl AsRef) { + ensure(); + log::info!(target: "probing-hccl-shim", "{}", msg.as_ref()); +} + +pub fn warn(msg: impl AsRef) { + ensure(); + log::warn!(target: "probing-hccl-shim", "{}", msg.as_ref()); +} diff --git a/probing/extensions/hccl-shim/src/writer.rs b/probing/extensions/hccl-shim/src/writer.rs index c841b610..a90d5063 100644 --- a/probing/extensions/hccl-shim/src/writer.rs +++ b/probing/extensions/hccl-shim/src/writer.rs @@ -30,7 +30,7 @@ macro_rules! open_table { .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) .is_ok() { - eprintln!("[probing-hccl-shim] failed to open {}: {e}", $file); + crate::log::warn(format!("failed to open {}: {e}", $file)); } } } diff --git a/probing/extensions/nccl-profiler-cdylib/Cargo.toml b/probing/extensions/nccl-profiler-cdylib/Cargo.toml index c3cbc4d1..7b111545 100644 --- a/probing/extensions/nccl-profiler-cdylib/Cargo.toml +++ b/probing/extensions/nccl-profiler-cdylib/Cargo.toml @@ -14,6 +14,8 @@ path = "../nccl-profiler/src/lib.rs" [dependencies] probing-memtable = { path = "../../memtable" } +env_logger = { workspace = true } +log = { workspace = true } once_cell = { workspace = true } parking_lot = "0.12" thiserror = { workspace = true } diff --git a/probing/extensions/nccl-profiler/Cargo.toml b/probing/extensions/nccl-profiler/Cargo.toml index 414514a1..4dbfcb2d 100644 --- a/probing/extensions/nccl-profiler/Cargo.toml +++ b/probing/extensions/nccl-profiler/Cargo.toml @@ -14,6 +14,8 @@ crate-type = ["rlib"] [dependencies] probing-memtable = { path = "../../memtable" } +env_logger = { workspace = true } +log = { workspace = true } once_cell = { workspace = true } parking_lot = "0.12" thiserror = { workspace = true } @@ -22,4 +24,9 @@ thiserror = { workspace = true } libc = "0.2" [dev-dependencies] +criterion = { workspace = true } tempfile = "3" + +[[bench]] +name = "callback_path" +harness = false diff --git a/probing/extensions/nccl-profiler/README.md b/probing/extensions/nccl-profiler/README.md index 78f24116..bef84232 100644 --- a/probing/extensions/nccl-profiler/README.md +++ b/probing/extensions/nccl-profiler/README.md @@ -1,6 +1,6 @@ # probing-nccl-profiler -NCCL **profiler plugin** (API v3, NCCL ≥ 2.26) that writes mmap memtables consumable by probing SQL. +NCCL **profiler plugin** (exports API **v4** for NCCL ≥ 2.27 and **v3** for NCCL 2.26 — NCCL picks the highest) that writes mmap memtables consumable by probing SQL. ## Build @@ -43,7 +43,7 @@ pip install probing # 3. Run a tiny distributed job export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) -export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # 26 +export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) # 94 export PROBING=2 torchrun --nproc_per_node=2 your_allreduce.py @@ -54,7 +54,7 @@ probing -t query "SELECT * FROM nccl.proxy_ops LIMIT 20" Optional NetPlugin (IB QP) events — add mask bit 128: ```bash -export NCCL_PROFILE_EVENT_MASK=154 # + ncclProfileNetPlugin(128) +export NCCL_PROFILE_EVENT_MASK=222 # + ncclProfileNetPlugin(128) probing -t query "SELECT * FROM nccl.net_qp LIMIT 20" ``` @@ -63,6 +63,8 @@ probing -t query "SELECT * FROM nccl.net_qp LIMIT 20" | SQL table | mmap file | Phase | |-----------|-----------|-------| | `nccl.proxy_ops` | `nccl.proxy_ops` | wait decomposition + parallel roles | +| `nccl.coll_perf` | `nccl.coll_perf` | per-op execution time (refcount-reconstructed) + bandwidth | +| `nccl.inflight_ops` | `nccl.inflight_ops` | watchdog snapshots of hung ops | | `nccl.net_qp` | `nccl.net_qp` | IB QP timing from NCCL net plugin | ### `nccl.proxy_ops` columns @@ -72,8 +74,9 @@ probing -t query "SELECT * FROM nccl.net_qp LIMIT 20" | `rank` | torch rank | | `tp_rank`, `pp_rank`, `dp_rank` | from `TP_RANK` / `PP_RANK` / `DP_RANK` (or Megatron env); `-1` if unset | | `send_gpu_wait_ns` | culprit signal | +| `send_peer_wait_ns` | waiting for receiver clear-to-send credits (v4 ABI only; 0 on v3) | | `recv_wait_ns` | victim signal | -| `coll_func`, `seq`, `channel_id`, `peer`, `is_send`, `n_steps`, `trans_bytes` | proxy op metadata | +| `coll_func`, `seq`, `channel_id`, `peer`, `is_send`, `n_steps`, `trans_bytes` | proxy op metadata (v4: `trans_bytes` summed per step) | | `send_wait_ns`, `recv_flush_wait_ns` | additional wait buckets | Rows aggregate ProxyStep state transitions at ProxyOp stop (batched under parent Coll when present). @@ -85,7 +88,7 @@ Docs: `docs/src/design/nccl-profiler.md`. | Variable | Purpose | |----------|---------| | `NCCL_PROFILER_PLUGIN` | Path to this `.so` (required) | -| `NCCL_PROFILE_EVENT_MASK` | Override default `Coll\|ProxyOp\|ProxyStep` (26) | +| `NCCL_PROFILE_EVENT_MASK` | Override default `Coll\|P2P\|ProxyOp\|ProxyStep\|KernelCh` (94) | | `PROBING_DATA_DIR` | Memtable directory (default `/dev/shm/probing`) | | `TP_RANK`, `PP_RANK`, `DP_RANK` | Parallel roles written into `nccl.proxy_ops` | | `PROBING_NCCL_MOCK` | Dev mock tables (`auto` on macOS) — see `python/probing/nccl/mock.py` | @@ -94,19 +97,48 @@ Docs: `docs/src/design/nccl-profiler.md`. ``` NCCL proxy thread - → ncclProfiler_v3 callbacks (this crate) - → slot pools (no per-event malloc) + → ncclProfiler_v4 / ncclProfiler_v3 callbacks (this crate) + → version-specific descriptor parsing → shared ParsedEvent / StateArgs + → slot pools (no per-event malloc, O(1) handle→slot via embedded index) → aggregate ProxyStep waits into ProxyOp - → batch rows under parent Coll; flush mmap on Coll stop + → refcount children (ProxyOp/KernelCh) under parent Coll; + emit coll_perf + batched proxy rows when the last child stops probing engine (same process) → MmapFileSchemaProvider discovers nccl.* → SELECT … FROM nccl.proxy_ops ``` +### Timing semantics (per NCCL ext-profiler docs) + +Coll `stopEvent` only marks **enqueue** completion. The plugin keeps the coll +slot alive until all child events stop, then reconstructs `exec_time_ns` from +the best window: `kernel_gpu` (v4: GPU globaltimer `pTimer` pair from the +kernelCh descriptor + `KernelChStop` state — device-clock, most precise) > +`kernel_ch` (host-observed KernelCh window) > `proxy` (ProxyOp envelope) > +`enqueue` (fallback). The chosen source is recorded in +`nccl.coll_perf.timing_source`. + +### What v4 adds over v3 + +- **GPU-clock kernel windows** (`timing_source = kernel_gpu`) via `pTimer` +- **`send_peer_wait_ns`**: send steps waiting for receiver credits + (`ncclProfilerProxyStepSendPeerWait_v4`) — receiver-congestion signal +- **`n_ranks` in `nccl.coll_perf`**: communicator size from the per-comm + `init`, enabling busbw conversion in SQL +- **Per-step `transSize`** state updates (v3 reported at proxy-op level; + NCCL ≥ 2.27 no longer feeds op-level `transSize` to v3 plugins at all) + +### Locking + +Two locks: slot pools (hot path) and the mmap writer. Completed rows are +collected into a batch under the pools lock and written after it is released, +so a slow flush never blocks concurrent NCCL callbacks. Counters are +lock-free atomics. + ### Phase 2 (writer path) -- Pre-allocated slot pools for Coll / ProxyOp / ProxyStep / NetPlugin -- ProxyOp rows batched under parent Coll; mmap flush on `Coll stopEvent` +- Pre-allocated slot pools for Coll / ProxyOp / ProxyStep / KernelCh / NetPlugin +- ProxyOp rows batched under parent Coll; mmap flush when the coll completes (refcount reaches zero) - Orphan ProxyOps (no parent) flush immediately - Write failures logged once to stderr; `finalize` reports `pool_exhausted` / `write_errors` @@ -124,6 +156,9 @@ probing engine (same process) ## Compatibility -- **Floor**: export `ncclProfiler_v3` only (NCCL 2.26+). -- NCCL 2.27+ may negotiate higher plugin versions if we add `ncclProfiler_v4`… later. +- Exports **`ncclProfiler_v4`** (NCCL 2.27+) and **`ncclProfiler_v3`** (NCCL 2.26); + NCCL probes v4 first and falls back to v3 automatically. +- Both ABIs share the same internal event model (`state::ParsedEvent`); v3 rows + simply carry `n_ranks = -1`, `send_peer_wait_ns = 0` and never reach + `timing_source = kernel_gpu`. - PyTorch **2.8+** (NCCL 2.26+) recommended; 2.7 ships NCCL 2.25 (no v3). diff --git a/probing/extensions/nccl-profiler/benches/callback_path.rs b/probing/extensions/nccl-profiler/benches/callback_path.rs new file mode 100644 index 00000000..a849e815 --- /dev/null +++ b/probing/extensions/nccl-profiler/benches/callback_path.rs @@ -0,0 +1,96 @@ +//! Criterion benchmarks for the NCCL callback hot path. +//! +//! Run with `cargo bench -p probing-nccl-profiler`. The full callback-cycle +//! bench only runs on Linux (the plugin state machine is Linux-gated); the +//! clock and pool benches run everywhere. + +use criterion::{criterion_group, criterion_main, Criterion}; +use std::hint::black_box; + +use probing_nccl_profiler::events::{now_ns, CollContext, CollPerfMeta, CollSlot}; +use probing_nccl_profiler::pool::SlotPool; + +fn bench_clock(c: &mut Criterion) { + c.bench_function("now_ns", |b| b.iter(|| black_box(now_ns()))); +} + +fn bench_pool(c: &mut Criterion) { + let mut pool: SlotPool = SlotPool::with_capacity(256); + c.bench_function("pool_alloc_index_free", |b| { + b.iter(|| { + let (ptr, idx) = pool + .alloc(|| CollSlot::new(CollContext::default(), CollPerfMeta::default(), 0)) + .unwrap(); + // SAFETY: ptr came from `alloc` above and is still live. + black_box(unsafe { pool.index_of(black_box(ptr)) }); + pool.free_idx(idx); + }) + }); +} + +#[cfg(target_os = "linux")] +fn bench_callback_cycle(c: &mut Criterion) { + use probing_nccl_profiler::abi::{ + NcclProfilerCollDescr, NcclProfilerEventBodyV3, NcclProfilerEventDescrV3, + NcclProfilerProxyOpDescr, NCCL_PROFILE_COLL, NCCL_PROFILE_PROXY_OP, + }; + use probing_nccl_profiler::state::PluginState; + use std::ffi::c_void; + + let dir = tempfile::tempdir().unwrap(); + std::env::set_var("PROBING_DATA_DIR", dir.path()); + let state = PluginState::new(); + + let coll_descr = NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_COLL as u8, + parent_obj: std::ptr::null_mut(), + rank: 0, + body: NcclProfilerEventBodyV3 { + coll: { + let mut d: NcclProfilerCollDescr = unsafe { std::mem::zeroed() }; + d.comm_hash = 1; + d.seq_number = 1; + d.func = c"AllReduce".as_ptr(); + d.count = 1 << 20; + d.datatype = c"ncclFloat16".as_ptr(); + d.n_max_channels = 4; + d + }, + }, + }; + + // coll start → proxy start → proxy stop → coll stop: one full op cycle, + // including the coll_perf row emit and the mmap append. + c.bench_function("coll_proxy_full_cycle", |b| { + b.iter(|| { + let mut coll_h: *mut c_void = std::ptr::null_mut(); + state.start_event(&mut coll_h, &coll_descr); + + let proxy_descr = NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_PROXY_OP as u8, + parent_obj: coll_h, + rank: 0, + body: NcclProfilerEventBodyV3 { + proxy_op: NcclProfilerProxyOpDescr { + pid: 0, + channel_id: 0, + peer: 1, + n_steps: 4, + chunk_size: 1024, + is_send: 1, + }, + }, + }; + let mut proxy_h: *mut c_void = std::ptr::null_mut(); + state.start_event(&mut proxy_h, &proxy_descr); + state.stop_event(proxy_h); + state.stop_event(coll_h); + }) + }); +} + +#[cfg(not(target_os = "linux"))] +fn bench_callback_cycle(_c: &mut Criterion) {} + +criterion_group!(benches, bench_clock, bench_pool, bench_callback_cycle); +criterion_main!(benches); diff --git a/probing/extensions/nccl-profiler/src/abi/mod.rs b/probing/extensions/nccl-profiler/src/abi/mod.rs index dde46dd3..9e552dde 100644 --- a/probing/extensions/nccl-profiler/src/abi/mod.rs +++ b/probing/extensions/nccl-profiler/src/abi/mod.rs @@ -1,13 +1,19 @@ -//! NCCL profiler plugin C ABI (v3, NCCL ≥ 2.26). +//! NCCL profiler plugin C ABI (v3 for NCCL ≥ 2.26, v4 for NCCL ≥ 2.27). //! -//! Types mirror `ext-profiler/example/nccl/` from the NCCL repository. +//! Types mirror `src/include/plugin/profiler/` from the NCCL repository. #![allow(dead_code)] pub mod net_ib_v1; pub mod profiler_v3; +pub mod profiler_v4; pub use profiler_v3::*; +pub use profiler_v4::{ + NcclProfilerCollDescrV4, NcclProfilerEventBodyV4, NcclProfilerEventDescrV4, + NcclProfilerEventStateArgsV4, NcclProfilerEventStateV4, NcclProfilerKernelChDescrV4, + NcclProfilerP2pDescrV4, NcclProfilerV4, +}; /// `ncclResult_t` — success is zero. pub type NcclResult = i32; diff --git a/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs b/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs index 1bff924c..2cbc3ee7 100644 --- a/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs +++ b/probing/extensions/nccl-profiler/src/abi/profiler_v3.rs @@ -13,38 +13,36 @@ pub const NCCL_PROFILE_PROXY_CTRL: i32 = 1 << 5; pub const NCCL_PROFILE_KERNEL_CH: i32 = 1 << 6; pub const NCCL_PROFILE_NET_PLUGIN: i32 = 1 << 7; -/// Default events for Phase 2 (wait decomposition). -pub const DEFAULT_ACTIVATION_MASK: i32 = - NCCL_PROFILE_COLL | NCCL_PROFILE_PROXY_OP | NCCL_PROFILE_PROXY_STEP; +/// Default events: wait decomposition + P2P (pipeline-parallel Send/Recv) + +/// KernelCh (NCCL's own kernel-activity signal, used to reconstruct real +/// collective execution time instead of host-side enqueue time). +pub const DEFAULT_ACTIVATION_MASK: i32 = NCCL_PROFILE_COLL + | NCCL_PROFILE_P2P + | NCCL_PROFILE_PROXY_OP + | NCCL_PROFILE_PROXY_STEP + | NCCL_PROFILE_KERNEL_CH; // ── Event state (shared across profiler API versions) ───────────────── - -#[repr(C)] -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -#[allow(clippy::enum_variant_names)] // mirrors NCCL C enum naming -pub enum NcclProfilerEventState { - ProxyOpSendPosted = 0, - ProxyOpSendRemFifoWait, - ProxyOpSendTransmitted, - ProxyOpSendDone, - ProxyOpRecvPosted, - ProxyOpRecvReceived, - ProxyOpRecvTransmitted, - ProxyOpRecvDone, - - ProxyStepSendGpuWait, - ProxyStepSendWait, - ProxyStepRecvWait, - ProxyStepRecvFlushWait, - ProxyStepRecvGpuWait, - - ProxyCtrlIdle, - ProxyCtrlActive, - ProxyCtrlSleep, - ProxyCtrlWakeup, - ProxyCtrlAppend, - ProxyCtrlAppendEnd, -} +// +// Kept as a raw C int, **not** a Rust enum: NCCL may pass values a given +// header vintage doesn't know about (v4 adds 19–22, v5/v6 add more), and +// receiving an out-of-range discriminant through a Rust enum is UB. + +pub type NcclProfilerEventState = c_int; + +// ncclProfilerEventState_t values (see NCCL src/include/plugin/nccl_profiler.h) +pub const STATE_PROXY_STEP_SEND_GPU_WAIT: c_int = 8; +pub const STATE_PROXY_STEP_SEND_WAIT: c_int = 9; +pub const STATE_PROXY_STEP_RECV_WAIT: c_int = 10; +pub const STATE_PROXY_STEP_RECV_FLUSH_WAIT: c_int = 11; +pub const STATE_PROXY_STEP_RECV_GPU_WAIT: c_int = 12; +/// v4: proxy op entered progress (replaces the deprecated v1–v3 op states). +pub const STATE_PROXY_OP_IN_PROGRESS_V4: c_int = 19; +/// v4: send step waiting for clear-to-send credits from the receiver. +pub const STATE_PROXY_STEP_SEND_PEER_WAIT_V4: c_int = 20; +pub const STATE_NET_PLUGIN_UPDATE: c_int = 21; +/// v4: kernelCh stop mark, carries the GPU globaltimer stop timestamp. +pub const STATE_KERNEL_CH_STOP: c_int = 22; pub type NcclProfilerEventStateV3 = NcclProfilerEventState; diff --git a/probing/extensions/nccl-profiler/src/abi/profiler_v4.rs b/probing/extensions/nccl-profiler/src/abi/profiler_v4.rs new file mode 100644 index 00000000..0be4e2a4 --- /dev/null +++ b/probing/extensions/nccl-profiler/src/abi/profiler_v4.rs @@ -0,0 +1,183 @@ +//! `ncclProfiler_v4` descriptors (NCCL 2.27+). +//! +//! Differences vs v3 that matter to us: +//! +//! * `init` receives per-communicator metadata (`commName`, `commHash`, +//! `nNodes`, `nRanks`, `rank`) — coll/p2p descriptors no longer carry +//! `name`/`commHash`, and we finally learn the communicator size (busbw). +//! * `kernelCh` descriptors carry `pTimer` (GPU globaltimer, nanoseconds) and +//! the new `KernelChStop` state reports the stop `pTimer` — a device-clock +//! kernel window instead of a host-side observation. +//! * proxy step gains the `SendPeerWait` state (waiting for the receiver's +//! clear-to-send credits) and `transSize` moves from proxy-op state args to +//! proxy-step state args. + +use std::os::raw::{c_char, c_int, c_void}; + +use super::{ + NcclProfilerNetPluginDescr, NcclProfilerProxyCtrlStateArgs, NcclProfilerProxyOpDescr, + NcclProfilerProxyStepDescr, +}; + +pub type NcclProfilerEventStateV4 = c_int; + +// ── Event descriptors ───────────────────────────────────────────────── + +#[repr(C)] +pub struct NcclProfilerEventDescrV4 { + pub type_: u8, + pub parent_obj: *mut c_void, + pub rank: c_int, + pub body: NcclProfilerEventBodyV4, +} + +#[repr(C)] +pub union NcclProfilerEventBodyV4 { + pub coll: NcclProfilerCollDescrV4, + pub p2p: NcclProfilerP2pDescrV4, + pub proxy_op: NcclProfilerProxyOpDescr, + pub proxy_step: NcclProfilerProxyStepDescr, + pub kernel_ch: NcclProfilerKernelChDescrV4, + pub net_plugin: NcclProfilerNetPluginDescr, +} + +/// v4 coll: no `name`/`commHash` (provided by `init`), `nChannels` replaces +/// `nMaxChannels`. +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerCollDescrV4 { + pub seq_number: u64, + pub func: *const c_char, + pub send_buff: *const c_void, + pub recv_buff: *mut c_void, + pub count: usize, + pub root: c_int, + pub datatype: *const c_char, + pub n_channels: u8, + pub n_warps: u8, + pub algo: *const c_char, + pub proto: *const c_char, +} + +/// v4 p2p: no `name`/`commHash`, adds `nChannels`. +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerP2pDescrV4 { + pub func: *const c_char, + pub buff: *mut c_void, + pub datatype: *const c_char, + pub count: usize, + pub peer: c_int, + pub n_channels: u8, +} + +/// v4 kernelCh: adds `pTimer` — GPU globaltimer start timestamp (ns domain). +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerKernelChDescrV4 { + pub channel_id: u8, + pub p_timer: u64, +} + +// ── State transition args ───────────────────────────────────────────── + +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct NcclProfilerProxyStepStateArgsV4 { + pub trans_size: usize, +} + +#[repr(C)] +#[derive(Clone, Copy)] +pub struct NcclProfilerNetPluginStateArgsV4 { + pub data: *mut c_void, +} + +#[repr(C)] +#[derive(Clone, Copy, Default)] +pub struct NcclProfilerKernelChStateArgsV4 { + /// GPU globaltimer stop timestamp (`KernelChStop`). + pub p_timer: u64, +} + +#[repr(C)] +pub union NcclProfilerEventStateArgsV4 { + pub proxy_step: NcclProfilerProxyStepStateArgsV4, + pub proxy_ctrl: NcclProfilerProxyCtrlStateArgs, + pub net_plugin: NcclProfilerNetPluginStateArgsV4, + pub kernel_ch: NcclProfilerKernelChStateArgsV4, +} + +// ── Plugin vtable ───────────────────────────────────────────────────── + +/// `ncclDebugLogger_t` — invoked with `fmt = "%s"` and one C string argument. +pub type NcclDebugLoggerFn = crate::log::NcclDebugLoggerFn; + +pub type ProfilerInitV4Fn = unsafe extern "C" fn( + context: *mut *mut c_void, + mask: *mut c_int, + comm_name: *const c_char, + comm_hash: u64, + n_nodes: c_int, + n_ranks: c_int, + rank: c_int, + logfn: NcclDebugLoggerFn, +) -> super::NcclResult; +pub type ProfilerStartEventV4Fn = unsafe extern "C" fn( + context: *mut c_void, + handle: *mut *mut c_void, + descr: *mut NcclProfilerEventDescrV4, +) -> super::NcclResult; +pub type ProfilerRecordStateV4Fn = unsafe extern "C" fn( + handle: *mut c_void, + state: NcclProfilerEventStateV4, + args: *mut NcclProfilerEventStateArgsV4, +) -> super::NcclResult; + +#[repr(C)] +pub struct NcclProfilerV4 { + pub name: *const c_char, + pub init: ProfilerInitV4Fn, + pub start_event: ProfilerStartEventV4Fn, + pub stop_event: super::ProfilerStopEventFn, + pub record_event_state: ProfilerRecordStateV4Fn, + pub finalize: super::ProfilerFinalizeFn, +} + +// SAFETY: exported as a read-only C vtable; `name` points to static bytes. +unsafe impl Sync for NcclProfilerV4 {} + +#[cfg(test)] +mod tests { + use super::*; + use std::mem::offset_of; + + // Layout must match the C structs in NCCL's profiler_v4.h exactly. + #[test] + fn kernel_ch_descr_layout_matches_c() { + assert_eq!(offset_of!(NcclProfilerKernelChDescrV4, channel_id), 0); + assert_eq!(offset_of!(NcclProfilerKernelChDescrV4, p_timer), 8); + assert_eq!(std::mem::size_of::(), 16); + } + + #[test] + fn coll_descr_layout_matches_c() { + assert_eq!(offset_of!(NcclProfilerCollDescrV4, seq_number), 0); + assert_eq!(offset_of!(NcclProfilerCollDescrV4, func), 8); + assert_eq!(offset_of!(NcclProfilerCollDescrV4, count), 32); + assert_eq!(offset_of!(NcclProfilerCollDescrV4, root), 40); + assert_eq!(offset_of!(NcclProfilerCollDescrV4, datatype), 48); + assert_eq!(offset_of!(NcclProfilerCollDescrV4, n_channels), 56); + assert_eq!(offset_of!(NcclProfilerCollDescrV4, n_warps), 57); + assert_eq!(offset_of!(NcclProfilerCollDescrV4, algo), 64); + assert_eq!(offset_of!(NcclProfilerCollDescrV4, proto), 72); + } + + #[test] + fn p2p_descr_layout_matches_c() { + assert_eq!(offset_of!(NcclProfilerP2pDescrV4, func), 0); + assert_eq!(offset_of!(NcclProfilerP2pDescrV4, count), 24); + assert_eq!(offset_of!(NcclProfilerP2pDescrV4, peer), 32); + assert_eq!(offset_of!(NcclProfilerP2pDescrV4, n_channels), 36); + } +} diff --git a/probing/extensions/nccl-profiler/src/events.rs b/probing/extensions/nccl-profiler/src/events.rs index 8e0ccadc..54bb09af 100644 --- a/probing/extensions/nccl-profiler/src/events.rs +++ b/probing/extensions/nccl-profiler/src/events.rs @@ -1,67 +1,193 @@ //! Event slot layouts and wait aggregation. use std::sync::atomic::AtomicU64; -use std::time::Instant; +use std::time::{Instant, SystemTime, UNIX_EPOCH}; use once_cell::sync::Lazy; -use crate::abi::NcclProfilerEventState; -use crate::pool::INVALID_IDX; +use crate::abi::{ + NcclProfilerEventState, STATE_PROXY_STEP_RECV_FLUSH_WAIT, STATE_PROXY_STEP_RECV_GPU_WAIT, + STATE_PROXY_STEP_RECV_WAIT, STATE_PROXY_STEP_SEND_GPU_WAIT, STATE_PROXY_STEP_SEND_PEER_WAIT_V4, + STATE_PROXY_STEP_SEND_WAIT, +}; +use crate::pool::{Indexed, INVALID_IDX}; use crate::role::RoleRanks; -pub const MAX_CHANNELS: usize = 32; -pub const MAX_STEPS_PER_OP: usize = 64; pub const MAX_FUNC_NAME: usize = 32; +pub const MAX_ALGO_NAME: usize = 16; pub const MAX_PENDING_PER_COLL: usize = 128; pub const EVT_COLL: u8 = 1; pub const EVT_PROXY_OP: u8 = 2; pub const EVT_PROXY_STEP: u8 = 3; pub const EVT_NET_PLUGIN: u8 = 4; - -pub const PROXY_STEP_STATE_SLOTS: usize = 5; - -static ORIGIN: Lazy = Lazy::new(Instant::now); +pub const EVT_KERNEL_CH: u8 = 5; + +/// How `exec_time_ns` in `nccl.coll_perf` was measured. +/// +/// NCCL's own docs: coll `stopEvent` only marks **enqueue** completion; real +/// execution must be reconstructed from child proxy / kernel-channel events +/// (reference counting, as recommended by the official ext-profiler guide). +/// +/// `kernel_gpu` (v4 only) is the GPU globaltimer window reported by the +/// kernel itself (`kernelCh.pTimer` start + `KernelChStop` state stop) — +/// device-clock, the most precise signal the ABI offers. +pub const TIMING_KERNEL_GPU: &str = "kernel_gpu"; +pub const TIMING_KERNEL_CH: &str = "kernel_ch"; +pub const TIMING_PROXY: &str = "proxy"; +pub const TIMING_ENQUEUE: &str = "enqueue"; + +/// Per-step state-entry timestamps: SendGpuWait, SendPeerWait (v4), +/// SendWait, RecvWait, RecvFlushWait, RecvGpuWait. +pub const PROXY_STEP_STATE_SLOTS: usize = 6; + +pub const IDX_SEND_GPU_WAIT: usize = 0; +pub const IDX_SEND_PEER_WAIT: usize = 1; +pub const IDX_SEND_WAIT: usize = 2; +pub const IDX_RECV_WAIT: usize = 3; +pub const IDX_RECV_FLUSH_WAIT: usize = 4; +pub const IDX_RECV_GPU_WAIT: usize = 5; + +/// Monotonic origin plus the UNIX-epoch offset captured at plugin load. +/// +/// `now_ns()` returns epoch-aligned nanoseconds so `ts` columns are +/// comparable across ranks/hosts (required by `global.nccl.*` federation), +/// while durations still come from the monotonic `Instant` domain. +static CLOCK: Lazy<(Instant, i64)> = Lazy::new(|| { + let origin = Instant::now(); + let epoch_ns = SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|d| d.as_nanos() as i64) + .unwrap_or_default(); + (origin, epoch_ns) +}); #[derive(Debug, Default)] pub struct EventCounters { pub coll: AtomicU64, + pub p2p: AtomicU64, pub proxy_op: AtomicU64, pub proxy_step: AtomicU64, + pub kernel_ch: AtomicU64, pub net_plugin: AtomicU64, pub rows_written: AtomicU64, pub pool_exhausted: AtomicU64, pub write_errors: AtomicU64, + pub filtered: AtomicU64, +} + +/// One row of `nccl.profiler_counters` — periodic / event-driven health snapshot. +#[derive(Clone, Copy, Debug, Default)] +pub struct ProfilerCounterSnapshot { + pub ts_ns: i64, + pub rank: i32, + pub coll_events: u64, + pub p2p_events: u64, + pub proxy_op_events: u64, + pub proxy_step_events: u64, + pub kernel_ch_events: u64, + pub net_events: u64, + pub rows_written: u64, + pub pool_exhausted: u64, + pub write_errors: u64, + pub filtered: u64, + pub coll_live: i32, + pub proxy_live: i32, + pub step_live: i32, + pub kch_live: i32, + pub net_live: i32, + pub coll_cap: i32, + pub proxy_cap: i32, + pub step_cap: i32, + pub kch_cap: i32, + pub net_cap: i32, + pub ring_chunks_recycled: u32, + pub ring_rows_overwritten: u32, } impl EventCounters { pub const fn new() -> Self { Self { coll: AtomicU64::new(0), + p2p: AtomicU64::new(0), proxy_op: AtomicU64::new(0), proxy_step: AtomicU64::new(0), + kernel_ch: AtomicU64::new(0), net_plugin: AtomicU64::new(0), rows_written: AtomicU64::new(0), pool_exhausted: AtomicU64::new(0), write_errors: AtomicU64::new(0), + filtered: AtomicU64::new(0), } } } #[inline] pub fn now_ns() -> i64 { - ORIGIN.elapsed().as_nanos() as i64 + let (origin, epoch_ns) = *CLOCK; + epoch_ns + origin.elapsed().as_nanos() as i64 } -#[derive(Clone, Copy, Debug, Default)] +/// NCCL datatype name → element size in bytes (NCCL `ncclDataType_t` names). +pub fn dtype_bytes(name: Option<&str>) -> u64 { + match name.unwrap_or("") { + "ncclInt8" | "ncclChar" | "ncclUint8" | "ncclFloat8e4m3" | "ncclFloat8e5m2" => 1, + "ncclFloat16" | "ncclHalf" | "ncclBfloat16" => 2, + "ncclInt32" | "ncclInt" | "ncclUint32" | "ncclFloat32" | "ncclFloat" => 4, + "ncclInt64" | "ncclUint64" | "ncclFloat64" | "ncclDouble" => 8, + _ => 1, + } +} + +#[derive(Clone, Copy, Debug)] pub struct CollContext { pub rank: i32, pub comm_hash: u64, + /// Communicator size (v4 init metadata; -1 when unknown, i.e. v3). + pub n_ranks: i32, pub seq: u64, pub func: [u8; MAX_FUNC_NAME], pub func_len: u8, } +impl Default for CollContext { + fn default() -> Self { + Self { + rank: -1, + comm_hash: 0, + n_ranks: -1, + seq: 0, + func: [0; MAX_FUNC_NAME], + func_len: 0, + } + } +} + +/// Fixed-capacity name buffer for algo/proto/datatype strings. +#[derive(Clone, Copy, Debug, Default)] +pub struct ShortName { + pub buf: [u8; MAX_ALGO_NAME], + pub len: u8, +} + +impl ShortName { + // Not `FromStr`: infallible, takes Option, truncates. + #[allow(clippy::should_implement_trait)] + pub fn from_str(src: Option<&str>) -> Self { + let s = src.unwrap_or(""); + let bytes = s.as_bytes(); + let n = bytes.len().min(MAX_ALGO_NAME); + let mut buf = [0u8; MAX_ALGO_NAME]; + buf[..n].copy_from_slice(&bytes[..n]); + Self { buf, len: n as u8 } + } + + pub fn as_str(&self) -> &str { + let n = (self.len as usize).min(MAX_ALGO_NAME); + std::str::from_utf8(&self.buf[..n]).unwrap_or("") + } +} + impl CollContext { #[allow(dead_code)] pub fn func_str(&self) -> &str { @@ -85,7 +211,11 @@ pub struct ProxyStepData { pub is_send: i32, pub start_ns: i64, pub stop_ns: i64, + /// Entry timestamp per state (see `IDX_*`); 0 = state never entered. pub state_ts: [i64; PROXY_STEP_STATE_SLOTS], + /// v4: this step's transferred bytes (from SendWait / RecvFlushWait + /// state args; 0 on v3). + pub trans_bytes: u64, } #[derive(Debug)] @@ -99,7 +229,12 @@ pub struct ProxyOpData { pub coll: CollContext, pub start_ns: i64, pub stop_ns: i64, - pub steps: [ProxyStepData; MAX_STEPS_PER_OP], + /// Waits accumulated incrementally as each step stops (keeping the raw + /// per-step data would cost ~5 KB per slot for nothing — only the sums + /// are ever emitted). + pub waits: WaitBreakdown, + /// v4: sum of per-step transferred bytes (0 on v3). + pub step_bytes: u64, pub step_count: u16, pub parent_coll: u32, } @@ -115,47 +250,202 @@ impl Default for ProxyOpData { coll: CollContext::default(), start_ns: 0, stop_ns: 0, - steps: std::array::from_fn(|_| ProxyStepData::default()), + waits: WaitBreakdown::default(), + step_bytes: 0, step_count: 0, parent_coll: INVALID_IDX, } } } +/// Coll-level metadata carried from the NCCL descriptor (also used for P2P). +#[derive(Clone, Copy, Debug, Default)] +pub struct CollPerfMeta { + pub is_p2p: bool, + pub peer: i32, + pub count: u64, + pub msg_bytes: u64, + pub dtype: ShortName, + pub algo: ShortName, + pub proto: ShortName, + pub n_channels: i32, +} + +/// Collective / P2P slot with **reference-counted lifetime**. +/// +/// NCCL semantics: coll `stopEvent` only marks the end of the **enqueue** — +/// the kernel and proxy work run on after it. Following the official +/// ext-profiler guidance, the slot stays alive until `stopped` is set *and* +/// `live_children` (proxy ops + kernel-channel events) drops to zero; the +/// real execution window is reconstructed from child event timestamps. #[repr(C)] pub struct CollSlot { pub tag: u8, + pub self_idx: u32, pub ctx: CollContext, + pub meta: CollPerfMeta, pub start_ns: i64, - pub stop_ns: i64, - pub send_ref: [u32; MAX_CHANNELS], - pub recv_ref: [u32; MAX_CHANNELS], + /// Host-side enqueue completion (NCCL coll `stopEvent`). + pub enqueue_stop_ns: i64, + pub stopped: bool, + pub live_children: u16, + /// Child events dropped because a fixed slot pool was full (timing may be degraded). + pub pool_events_dropped: u16, + /// Kernel-channel activity window (proxy thread observation of the kernel). + pub kch_min_start_ns: i64, + pub kch_max_stop_ns: i64, + pub kch_count: u16, + /// v4: kernel window on the **GPU globaltimer** clock (`pTimer` from the + /// kernelCh descriptor + `KernelChStop` state). Only the duration is + /// meaningful — the GPU clock has no epoch alignment with host time. + pub kch_gpu_min_start: u64, + pub kch_gpu_max_stop: u64, + pub kch_gpu_count: u16, + /// Proxy-op activity window. + pub px_min_start_ns: i64, + pub px_max_stop_ns: i64, pub pending: [CompletedProxyOp; MAX_PENDING_PER_COLL], pub pending_len: u16, } impl CollSlot { - pub fn new(ctx: CollContext, start_ns: i64) -> Self { + pub fn new(ctx: CollContext, meta: CollPerfMeta, start_ns: i64) -> Self { Self { tag: EVT_COLL, + self_idx: INVALID_IDX, ctx, + meta, start_ns, - stop_ns: 0, - send_ref: [INVALID_IDX; MAX_CHANNELS], - recv_ref: [INVALID_IDX; MAX_CHANNELS], + enqueue_stop_ns: 0, + stopped: false, + live_children: 0, + pool_events_dropped: 0, + kch_min_start_ns: 0, + kch_max_stop_ns: 0, + kch_count: 0, + kch_gpu_min_start: 0, + kch_gpu_max_stop: 0, + kch_gpu_count: 0, + px_min_start_ns: 0, + px_max_stop_ns: 0, pending: std::array::from_fn(|_| CompletedProxyOp::default()), pending_len: 0, } } - pub fn register_proxy(&mut self, channel: usize, is_send: i32, idx: u32) { - if channel >= MAX_CHANNELS { + /// Ready for completion: enqueue finished and no child event still live. + pub fn is_complete(&self) -> bool { + self.stopped && self.live_children == 0 + } + + pub fn observe_kch(&mut self, start_ns: i64, stop_ns: i64) { + if self.kch_count == 0 || start_ns < self.kch_min_start_ns { + self.kch_min_start_ns = start_ns; + } + if stop_ns > self.kch_max_stop_ns { + self.kch_max_stop_ns = stop_ns; + } + self.kch_count = self.kch_count.saturating_add(1); + } + + /// Fold a v4 GPU-globaltimer kernel window (`pTimer` pair) into the coll. + /// All channels of one GPU share the globaltimer, so min/max across + /// channels is a valid aggregated kernel window. + pub fn observe_kch_gpu(&mut self, start_ptimer: u64, stop_ptimer: u64) { + if start_ptimer == 0 || stop_ptimer <= start_ptimer { return; } - if is_send != 0 { - self.send_ref[channel] = idx; + if self.kch_gpu_count == 0 || start_ptimer < self.kch_gpu_min_start { + self.kch_gpu_min_start = start_ptimer; + } + if stop_ptimer > self.kch_gpu_max_stop { + self.kch_gpu_max_stop = stop_ptimer; + } + self.kch_gpu_count = self.kch_gpu_count.saturating_add(1); + } + + pub fn observe_proxy(&mut self, start_ns: i64, stop_ns: i64) { + if self.px_min_start_ns == 0 || start_ns < self.px_min_start_ns { + self.px_min_start_ns = start_ns; + } + if stop_ns > self.px_max_stop_ns { + self.px_max_stop_ns = stop_ns; + } + } + + /// Build the completed coll-perf row, choosing the best available timing: + /// GPU-globaltimer kernel window (v4) > host-observed kernel-channel + /// window > proxy window > enqueue window. Bandwidth is algorithm + /// bandwidth (`msg_bytes / exec_time`); bus bandwidth additionally needs + /// the communicator size (`n_ranks`, v4 init; -1 on v3). + pub fn coll_perf_row(&self) -> CompletedCollPerf { + let (exec_time_ns, ts_ns, timing_source) = + if self.kch_gpu_count > 0 && self.kch_gpu_max_stop > self.kch_gpu_min_start { + ( + (self.kch_gpu_max_stop - self.kch_gpu_min_start) as i64, + // GPU clock has no epoch alignment; stamp with the host + // observation (fall back to now). + if self.kch_max_stop_ns > 0 { + self.kch_max_stop_ns + } else { + now_ns() + }, + TIMING_KERNEL_GPU, + ) + } else if self.kch_count > 0 && self.kch_max_stop_ns > self.kch_min_start_ns { + ( + self.kch_max_stop_ns - self.kch_min_start_ns, + self.kch_max_stop_ns, + TIMING_KERNEL_CH, + ) + } else if self.px_max_stop_ns > self.px_min_start_ns && self.px_min_start_ns > 0 { + ( + self.px_max_stop_ns - self.px_min_start_ns, + self.px_max_stop_ns, + TIMING_PROXY, + ) + } else if self.enqueue_stop_ns > self.start_ns { + ( + self.enqueue_stop_ns - self.start_ns, + self.enqueue_stop_ns, + TIMING_ENQUEUE, + ) + } else { + (0, now_ns(), TIMING_ENQUEUE) + }; + let enqueue_time_ns = if self.enqueue_stop_ns > self.start_ns { + self.enqueue_stop_ns - self.start_ns } else { - self.recv_ref[channel] = idx; + 0 + }; + // bytes per nanosecond == decimal GB/s + let algobw_gbps = if exec_time_ns > 0 { + self.meta.msg_bytes as f64 / exec_time_ns as f64 + } else { + 0.0 + }; + CompletedCollPerf { + ts_ns, + rank: self.ctx.rank, + roles: crate::role::cached(), + comm_hash: self.ctx.comm_hash, + n_ranks: self.ctx.n_ranks, + coll_func: self.ctx.func, + coll_func_len: self.ctx.func_len, + seq: self.ctx.seq, + is_p2p: self.meta.is_p2p, + peer: self.meta.peer, + count: self.meta.count, + msg_size_bytes: self.meta.msg_bytes, + dtype: self.meta.dtype, + algo: self.meta.algo, + proto: self.meta.proto, + n_channels: self.meta.n_channels, + exec_time_ns, + enqueue_time_ns, + timing_source, + algobw_gbps, + pool_events_dropped: self.pool_events_dropped as i32, } } @@ -173,19 +463,39 @@ impl CollSlot { #[repr(C)] pub struct ProxyOpSlot { pub tag: u8, + pub self_idx: u32, pub op: ProxyOpData, } #[repr(C)] pub struct ProxyStepSlot { pub tag: u8, + pub self_idx: u32, pub step: ProxyStepData, pub parent_proxy: u32, } +/// Kernel-channel event (`ncclProfileKernelCh`): the proxy progress thread's +/// observation of the GPU kernel working on a channel. This is NCCL's own +/// signal for actual kernel activity — the closest thing to device timing the +/// profiler ABI offers without CUDA instrumentation. +#[repr(C)] +pub struct KernelChSlot { + pub tag: u8, + pub self_idx: u32, + pub parent_coll: u32, + pub channel_id: i32, + pub start_ns: i64, + /// v4: GPU globaltimer at kernel start (descriptor `pTimer`; 0 on v3). + pub gpu_start_ptimer: u64, + /// v4: GPU globaltimer at `KernelChStop` (0 until reported). + pub gpu_stop_ptimer: u64, +} + #[repr(C)] pub struct NetPluginSlot { pub tag: u8, + pub self_idx: u32, pub start_ns: i64, pub stop_ns: i64, pub rank: i32, @@ -196,27 +506,91 @@ pub struct NetPluginSlot { pub length: u64, } +macro_rules! impl_indexed { + ($($ty:ty),+) => {$( + impl Indexed for $ty { + fn set_self_idx(&mut self, idx: u32) { + self.self_idx = idx; + } + fn self_idx(&self) -> u32 { + self.self_idx + } + } + )+}; +} + +impl_indexed!( + CollSlot, + ProxyOpSlot, + ProxyStepSlot, + KernelChSlot, + NetPluginSlot +); + #[inline] pub fn proxy_step_state_index(state: NcclProfilerEventState) -> Option { - use NcclProfilerEventState::*; match state { - ProxyStepSendGpuWait => Some(0), - ProxyStepSendWait => Some(1), - ProxyStepRecvWait => Some(2), - ProxyStepRecvFlushWait => Some(3), - ProxyStepRecvGpuWait => Some(4), + STATE_PROXY_STEP_SEND_GPU_WAIT => Some(IDX_SEND_GPU_WAIT), + STATE_PROXY_STEP_SEND_PEER_WAIT_V4 => Some(IDX_SEND_PEER_WAIT), + STATE_PROXY_STEP_SEND_WAIT => Some(IDX_SEND_WAIT), + STATE_PROXY_STEP_RECV_WAIT => Some(IDX_RECV_WAIT), + STATE_PROXY_STEP_RECV_FLUSH_WAIT => Some(IDX_RECV_FLUSH_WAIT), + STATE_PROXY_STEP_RECV_GPU_WAIT => Some(IDX_RECV_GPU_WAIT), _ => None, } } +/// Per-op wait decomposition (nanoseconds spent *in* each state). +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub struct WaitBreakdown { + pub send_gpu_wait_ns: i64, + /// v4 only: waiting for the receiver's clear-to-send credits. + pub send_peer_wait_ns: i64, + pub send_wait_ns: i64, + pub recv_wait_ns: i64, + pub recv_flush_wait_ns: i64, +} + +impl WaitBreakdown { + fn add(&mut self, other: WaitBreakdown) { + self.send_gpu_wait_ns += other.send_gpu_wait_ns; + self.send_peer_wait_ns += other.send_peer_wait_ns; + self.send_wait_ns += other.send_wait_ns; + self.recv_wait_ns += other.recv_wait_ns; + self.recv_flush_wait_ns += other.recv_flush_wait_ns; + } +} + impl ProxyStepData { - pub fn wait_deltas_ns(&self) -> (i64, i64, i64, i64) { - let base = self.start_ns; - let gpu = delta(base, self.state_ts[0]); - let send = delta(self.state_ts[0], self.state_ts[1]); - let recv = delta(self.state_ts[1], self.state_ts[2]); - let flush = delta(self.state_ts[2], self.state_ts[3]); - (gpu, send, recv, flush) + /// Dwell time per state: entry timestamp of a state to the entry of the + /// next observed state in its chain (send: GpuWait → PeerWait → SendWait; + /// recv: RecvWait → FlushWait → RecvGpuWait), the last one closing at + /// `stop_ns`. Unentered states contribute zero. + pub fn wait_deltas_ns(&self) -> WaitBreakdown { + let send_chain = [IDX_SEND_GPU_WAIT, IDX_SEND_PEER_WAIT, IDX_SEND_WAIT]; + let recv_chain = [IDX_RECV_WAIT, IDX_RECV_FLUSH_WAIT, IDX_RECV_GPU_WAIT]; + let mut dwell = [0i64; PROXY_STEP_STATE_SLOTS]; + for chain in [&send_chain, &recv_chain] { + for (pos, &idx) in chain.iter().enumerate() { + let entered = self.state_ts[idx]; + if entered == 0 { + continue; + } + let next_entry = chain[pos + 1..] + .iter() + .map(|&n| self.state_ts[n]) + .find(|&t| t != 0) + .unwrap_or(self.stop_ns); + dwell[idx] = delta(entered, next_entry); + } + } + WaitBreakdown { + send_gpu_wait_ns: dwell[IDX_SEND_GPU_WAIT], + send_peer_wait_ns: dwell[IDX_SEND_PEER_WAIT], + send_wait_ns: dwell[IDX_SEND_WAIT], + recv_wait_ns: dwell[IDX_RECV_WAIT], + recv_flush_wait_ns: dwell[IDX_RECV_FLUSH_WAIT], + } } } @@ -230,34 +604,18 @@ fn delta(from: i64, to: i64) -> i64 { } impl ProxyOpData { - pub fn push_step(&mut self, step: ProxyStepData) -> bool { - let n = self.step_count as usize; - if n >= MAX_STEPS_PER_OP { - return false; - } - self.steps[n] = step; - self.step_count += 1; - true - } - - pub fn aggregate_waits(&self) -> (i64, i64, i64, i64) { - let mut gpu = 0i64; - let mut send = 0i64; - let mut recv = 0i64; - let mut flush = 0i64; - for s in &self.steps[..self.step_count as usize] { - let (g, se, r, f) = s.wait_deltas_ns(); - gpu += g; - send += se; - recv += r; - flush += f; - } - (gpu, send, recv, flush) + /// Fold a finished step into the running totals (no per-step storage). + pub fn push_step(&mut self, step: ProxyStepData) { + self.waits.add(step.wait_deltas_ns()); + self.step_bytes += step.trans_bytes; + self.step_count = self.step_count.saturating_add(1); } pub fn into_completed(self) -> CompletedProxyOp { - let (send_gpu_wait_ns, send_wait_ns, recv_wait_ns, recv_flush_wait_ns) = - self.aggregate_waits(); + let waits = self.waits; + // v4 reports transferred bytes per step; prefer the summed step sizes + // when present (v3 keeps reporting at the proxy-op level). + let step_bytes = self.step_bytes; CompletedProxyOp { ts_ns: if self.stop_ns != 0 { self.stop_ns @@ -265,7 +623,7 @@ impl ProxyOpData { now_ns() }, rank: self.coll.rank, - roles: crate::role::snapshot(), + roles: crate::role::cached(), comm_hash: self.coll.comm_hash, coll_func: self.coll.func, coll_func_len: self.coll.func_len, @@ -274,11 +632,16 @@ impl ProxyOpData { peer: self.peer, is_send: self.is_send, n_steps: self.n_steps, - trans_bytes: self.trans_bytes, - send_gpu_wait_ns, - send_wait_ns, - recv_wait_ns, - recv_flush_wait_ns, + trans_bytes: if step_bytes > 0 { + step_bytes.max(self.trans_bytes) + } else { + self.trans_bytes + }, + send_gpu_wait_ns: waits.send_gpu_wait_ns, + send_peer_wait_ns: waits.send_peer_wait_ns, + send_wait_ns: waits.send_wait_ns, + recv_wait_ns: waits.recv_wait_ns, + recv_flush_wait_ns: waits.recv_flush_wait_ns, } } } @@ -298,6 +661,8 @@ pub struct CompletedProxyOp { pub n_steps: i32, pub trans_bytes: u64, pub send_gpu_wait_ns: i64, + /// v4 only: waiting for receiver clear-to-send credits (0 on v3). + pub send_peer_wait_ns: i64, pub send_wait_ns: i64, pub recv_wait_ns: i64, pub recv_flush_wait_ns: i64, @@ -310,6 +675,100 @@ impl CompletedProxyOp { } } +/// One row of `nccl.coll_perf` (collective or P2P op level). +/// +/// `exec_time_ns` comes from the best available NCCL-native signal +/// (`timing_source`: kernel_ch > proxy > enqueue); `enqueue_time_ns` is +/// always the host-side enqueue duration for comparison. +#[derive(Clone, Copy, Debug)] +pub struct CompletedCollPerf { + pub ts_ns: i64, + pub rank: i32, + pub roles: RoleRanks, + pub comm_hash: u64, + /// Communicator size (v4; -1 on v3 — busbw conversion needs it). + pub n_ranks: i32, + pub coll_func: [u8; MAX_FUNC_NAME], + pub coll_func_len: u8, + pub seq: u64, + pub is_p2p: bool, + pub peer: i32, + pub count: u64, + pub msg_size_bytes: u64, + pub dtype: ShortName, + pub algo: ShortName, + pub proto: ShortName, + pub n_channels: i32, + pub exec_time_ns: i64, + pub enqueue_time_ns: i64, + pub timing_source: &'static str, + pub algobw_gbps: f64, + /// Non-zero when child proxy/kernel slots were dropped (pool exhausted). + pub pool_events_dropped: i32, +} + +impl Default for CompletedCollPerf { + fn default() -> Self { + Self { + ts_ns: 0, + rank: 0, + roles: RoleRanks::default(), + comm_hash: 0, + n_ranks: -1, + coll_func: [0; MAX_FUNC_NAME], + coll_func_len: 0, + seq: 0, + is_p2p: false, + peer: -1, + count: 0, + msg_size_bytes: 0, + dtype: ShortName::default(), + algo: ShortName::default(), + proto: ShortName::default(), + n_channels: 0, + exec_time_ns: 0, + enqueue_time_ns: 0, + timing_source: TIMING_ENQUEUE, + algobw_gbps: 0.0, + pool_events_dropped: 0, + } + } +} + +impl CompletedCollPerf { + pub fn func_str(&self) -> &str { + let n = self.coll_func_len as usize; + std::str::from_utf8(&self.coll_func[..n.min(MAX_FUNC_NAME)]).unwrap_or("unknown") + } +} + +/// One row of `nccl.inflight_ops` — a periodic snapshot of an operation that +/// started but has not stopped yet (hang visibility; see CoMMA's +/// `NCCL_PROFILER_NCCLOP_TIMEOUT` for the same idea). +#[derive(Clone, Copy, Debug)] +pub struct InflightOp { + pub ts_ns: i64, + pub rank: i32, + pub comm_hash: u64, + pub coll_func: [u8; MAX_FUNC_NAME], + pub coll_func_len: u8, + pub seq: u64, + /// "coll" / "p2p" / "proxy_op" + pub kind: &'static str, + pub channel_id: i32, + pub peer: i32, + pub is_send: i32, + pub start_ns: i64, + pub age_ns: i64, +} + +impl InflightOp { + pub fn func_str(&self) -> &str { + let n = self.coll_func_len as usize; + std::str::from_utf8(&self.coll_func[..n.min(MAX_FUNC_NAME)]).unwrap_or("unknown") + } +} + #[inline] pub unsafe fn event_type(handle: *mut std::ffi::c_void) -> u8 { if handle.is_null() { @@ -317,3 +776,247 @@ pub unsafe fn event_type(handle: *mut std::ffi::c_void) -> u8 { } *(handle as *const u8) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn now_ns_is_epoch_aligned() { + // Epoch nanoseconds are ~1.7e18 in the 2020s; a process-relative + // clock would be many orders of magnitude smaller. + let ts = now_ns(); + assert!(ts > 1_500_000_000_000_000_000, "ts={ts} not epoch-scale"); + let ts2 = now_ns(); + assert!(ts2 >= ts, "clock must be monotonic non-decreasing"); + } + + #[test] + fn dtype_bytes_mapping() { + assert_eq!(dtype_bytes(Some("ncclFloat16")), 2); + assert_eq!(dtype_bytes(Some("ncclBfloat16")), 2); + assert_eq!(dtype_bytes(Some("ncclFloat32")), 4); + assert_eq!(dtype_bytes(Some("ncclInt64")), 8); + assert_eq!(dtype_bytes(Some("ncclFloat8e4m3")), 1); + assert_eq!(dtype_bytes(None), 1); + assert_eq!(dtype_bytes(Some("bogus")), 1); + } + + #[test] + fn short_name_roundtrip_and_truncation() { + assert_eq!(ShortName::from_str(Some("Ring")).as_str(), "Ring"); + assert_eq!(ShortName::from_str(None).as_str(), ""); + let long = "a".repeat(MAX_ALGO_NAME + 10); + assert_eq!( + ShortName::from_str(Some(&long)).as_str().len(), + MAX_ALGO_NAME + ); + } + + fn sample_slot() -> CollSlot { + let mut ctx = CollContext { + rank: 3, + comm_hash: 42, + seq: 7, + ..Default::default() + }; + copy_func_name(&mut ctx, Some("AllReduce")); + let meta = CollPerfMeta { + count: 1 << 20, + msg_bytes: 2 << 20, // 2 MiB of fp16 + dtype: ShortName::from_str(Some("ncclFloat16")), + algo: ShortName::from_str(Some("Ring")), + proto: ShortName::from_str(Some("Simple")), + n_channels: 4, + ..Default::default() + }; + CollSlot::new(ctx, meta, 1_000) + } + + #[test] + fn coll_perf_row_enqueue_fallback_computes_algobw() { + let mut slot = sample_slot(); + slot.stopped = true; + slot.enqueue_stop_ns = 1_000 + 1_000_000; // 1ms + let row = slot.coll_perf_row(); + assert_eq!(row.timing_source, TIMING_ENQUEUE); + assert_eq!(row.exec_time_ns, 1_000_000); + assert_eq!(row.enqueue_time_ns, 1_000_000); + assert_eq!(row.msg_size_bytes, 2 << 20); + // 2 MiB / 1 ms ≈ 2.097 GB/s (bytes per ns == GB/s) + assert!( + (row.algobw_gbps - 2.097).abs() < 0.01, + "{}", + row.algobw_gbps + ); + assert_eq!(row.func_str(), "AllReduce"); + assert!(!row.is_p2p); + } + + #[test] + fn coll_perf_row_prefers_gpu_timer_window() { + let mut slot = sample_slot(); + slot.stopped = true; + slot.enqueue_stop_ns = 1_000 + 50_000; + slot.observe_proxy(2_000, 3_000_000); + slot.observe_kch(1_500, 2_501_500); // host-observed window: 2.5ms + // v4 GPU globaltimer window: 2.0ms (more precise, wins) + slot.observe_kch_gpu(10_000_000, 12_000_000); + let row = slot.coll_perf_row(); + assert_eq!(row.timing_source, TIMING_KERNEL_GPU); + assert_eq!(row.exec_time_ns, 2_000_000); + // ts stays on the host clock (GPU clock has no epoch alignment) + assert_eq!(row.ts_ns, 2_501_500); + } + + #[test] + fn observe_kch_gpu_ignores_invalid_windows() { + let mut slot = sample_slot(); + slot.observe_kch_gpu(0, 5_000); // missing start + slot.observe_kch_gpu(5_000, 5_000); // zero-length + slot.observe_kch_gpu(6_000, 4_000); // negative + assert_eq!(slot.kch_gpu_count, 0); + } + + #[test] + fn wait_deltas_send_chain_with_peer_wait() { + // v4 send chain: GpuWait@100 → PeerWait@400 → SendWait@600 → stop@1000 + let step = ProxyStepData { + is_send: 1, + start_ns: 50, + stop_ns: 1_000, + state_ts: { + let mut ts = [0i64; PROXY_STEP_STATE_SLOTS]; + ts[IDX_SEND_GPU_WAIT] = 100; + ts[IDX_SEND_PEER_WAIT] = 400; + ts[IDX_SEND_WAIT] = 600; + ts + }, + ..Default::default() + }; + let w = step.wait_deltas_ns(); + assert_eq!(w.send_gpu_wait_ns, 300); // 100 → 400 + assert_eq!(w.send_peer_wait_ns, 200); // 400 → 600 + assert_eq!(w.send_wait_ns, 400); // 600 → stop + assert_eq!(w.recv_wait_ns, 0); + } + + #[test] + fn wait_deltas_v3_send_chain_without_peer_wait() { + // v3 never enters PeerWait; SendGpuWait closes at SendWait directly. + let step = ProxyStepData { + is_send: 1, + start_ns: 50, + stop_ns: 1_000, + state_ts: { + let mut ts = [0i64; PROXY_STEP_STATE_SLOTS]; + ts[IDX_SEND_GPU_WAIT] = 100; + ts[IDX_SEND_WAIT] = 700; + ts + }, + ..Default::default() + }; + let w = step.wait_deltas_ns(); + assert_eq!(w.send_gpu_wait_ns, 600); // 100 → 700 + assert_eq!(w.send_peer_wait_ns, 0); + assert_eq!(w.send_wait_ns, 300); // 700 → stop + } + + #[test] + fn wait_deltas_recv_chain() { + let step = ProxyStepData { + is_send: 0, + start_ns: 50, + stop_ns: 2_000, + state_ts: { + let mut ts = [0i64; PROXY_STEP_STATE_SLOTS]; + ts[IDX_RECV_WAIT] = 200; + ts[IDX_RECV_FLUSH_WAIT] = 1_500; + ts + }, + ..Default::default() + }; + let w = step.wait_deltas_ns(); + assert_eq!(w.recv_wait_ns, 1_300); // 200 → 1500 + assert_eq!(w.recv_flush_wait_ns, 500); // 1500 → stop + assert_eq!(w.send_gpu_wait_ns, 0); + } + + #[test] + fn proxy_op_prefers_v4_step_bytes() { + let mut op = ProxyOpData::default(); + let s1 = ProxyStepData { + trans_bytes: 1_024, + ..Default::default() + }; + let s2 = ProxyStepData { + trans_bytes: 2_048, + ..Default::default() + }; + op.push_step(s1); + op.push_step(s2); + op.trans_bytes = 100; // stale v3-style op-level value + let row = op.into_completed(); + assert_eq!(row.trans_bytes, 3_072); + } + + #[test] + fn proxy_step_state_index_covers_v4_states() { + use crate::abi::{STATE_PROXY_STEP_SEND_GPU_WAIT, STATE_PROXY_STEP_SEND_PEER_WAIT_V4}; + assert_eq!( + proxy_step_state_index(STATE_PROXY_STEP_SEND_GPU_WAIT), + Some(IDX_SEND_GPU_WAIT) + ); + assert_eq!( + proxy_step_state_index(STATE_PROXY_STEP_SEND_PEER_WAIT_V4), + Some(IDX_SEND_PEER_WAIT) + ); + assert_eq!(proxy_step_state_index(999), None); + } + + #[test] + fn coll_perf_row_prefers_kernel_ch_window() { + let mut slot = sample_slot(); + slot.stopped = true; + slot.enqueue_stop_ns = 1_000 + 50_000; // enqueue: 50µs + slot.observe_proxy(2_000, 3_000_000); // proxy window ~3ms + slot.observe_kch(1_500, 2_001_500); // kernel window: 2ms + slot.observe_kch(1_800, 1_900_000); // second channel inside window + let row = slot.coll_perf_row(); + assert_eq!(row.timing_source, TIMING_KERNEL_CH); + assert_eq!(row.exec_time_ns, 2_000_000); + assert_eq!(row.enqueue_time_ns, 50_000); + } + + #[test] + fn coll_perf_row_uses_proxy_window_without_kernel_ch() { + let mut slot = sample_slot(); + slot.stopped = true; + slot.enqueue_stop_ns = 1_000 + 50_000; + slot.observe_proxy(10_000, 4_010_000); // 4ms of proxy activity + let row = slot.coll_perf_row(); + assert_eq!(row.timing_source, TIMING_PROXY); + assert_eq!(row.exec_time_ns, 4_000_000); + } + + #[test] + fn coll_perf_row_zero_duration_is_zero_bw() { + let slot = CollSlot::new(CollContext::default(), CollPerfMeta::default(), 500); + let row = slot.coll_perf_row(); + assert_eq!(row.algobw_gbps, 0.0); + } + + #[test] + fn refcount_lifecycle() { + let mut slot = sample_slot(); + assert!(!slot.is_complete()); + slot.live_children += 2; // one proxy op + one kernel ch + slot.stopped = true; + slot.enqueue_stop_ns = 2_000; + assert!(!slot.is_complete(), "children still live"); + slot.live_children -= 1; + assert!(!slot.is_complete()); + slot.live_children -= 1; + assert!(slot.is_complete()); + } +} diff --git a/probing/extensions/nccl-profiler/src/lib.rs b/probing/extensions/nccl-profiler/src/lib.rs index d52f3cec..185e6bc6 100644 --- a/probing/extensions/nccl-profiler/src/lib.rs +++ b/probing/extensions/nccl-profiler/src/lib.rs @@ -1,31 +1,49 @@ -//! Probing NCCL profiler plugin — exports `ncclProfiler_v3` on Linux (NCCL ≥ 2.26). +//! Probing NCCL profiler plugin — exports `ncclProfiler_v4` (NCCL ≥ 2.27) +//! and `ncclProfiler_v3` (NCCL 2.26) on Linux; NCCL picks the highest one. #![allow(clippy::missing_safety_doc)] #![cfg_attr(not(target_os = "linux"), allow(dead_code))] -mod abi; -mod events; -mod pool; +// Internal modules are `pub` + `doc(hidden)` so benches (`benches/`) can +// exercise the hot path; they are not a stable API. +#[doc(hidden)] +pub mod abi; +#[doc(hidden)] +pub mod events; +mod log; +#[doc(hidden)] +pub mod pool; +mod pool_config; +mod pool_pressure; +mod ring_config; mod role; +mod shard; mod tables; mod writer; #[cfg(target_os = "linux")] -mod state; +#[doc(hidden)] +pub mod state; #[cfg(target_os = "linux")] -mod plugin; +#[doc(hidden)] +pub mod plugin; -pub use tables::{net_qp_schema, proxy_ops_schema, register_docs, NET_QP_FILE, PROXY_OPS_FILE}; +pub use tables::{ + coll_perf_schema, inflight_ops_schema, net_qp_schema, profiler_counters_schema, + proxy_ops_schema, register_docs, COLL_PERF_FILE, INFLIGHT_OPS_FILE, NET_QP_FILE, + PROFILER_COUNTERS_FILE, PROXY_OPS_FILE, +}; #[cfg(target_os = "linux")] mod export { use std::os::raw::c_char; - use crate::abi::NcclProfilerV3; + use crate::abi::{NcclProfilerV3, NcclProfilerV4}; use crate::plugin::{ - probing_profiler_finalize, probing_profiler_init, probing_profiler_record_state, - probing_profiler_start_event, probing_profiler_stop_event, + probing_profiler_finalize, probing_profiler_finalize_v4, probing_profiler_init, + probing_profiler_init_v4, probing_profiler_record_state, probing_profiler_record_state_v4, + probing_profiler_start_event, probing_profiler_start_event_v4, probing_profiler_stop_event, }; static PLUGIN_NAME: &[u8] = b"probing-nccl-profiler\0"; @@ -39,6 +57,16 @@ mod export { record_event_state: probing_profiler_record_state, finalize: probing_profiler_finalize, }; + + #[no_mangle] + pub static ncclProfiler_v4: NcclProfilerV4 = NcclProfilerV4 { + name: PLUGIN_NAME.as_ptr() as *const c_char, + init: probing_profiler_init_v4, + start_event: probing_profiler_start_event_v4, + stop_event: probing_profiler_stop_event, + record_event_state: probing_profiler_record_state_v4, + finalize: probing_profiler_finalize_v4, + }; } #[cfg(not(target_os = "linux"))] diff --git a/probing/extensions/nccl-profiler/src/log.rs b/probing/extensions/nccl-profiler/src/log.rs new file mode 100644 index 00000000..8027a6c5 --- /dev/null +++ b/probing/extensions/nccl-profiler/src/log.rs @@ -0,0 +1,88 @@ +//! Logging for the NCCL profiler plugin (dlopen'd without the main probing module). +//! +//! Prefer NCCL's `ncclDebugLogger_t` when v4 `init` provides one; otherwise fall +//! back to the Rust `log` crate with a one-time `env_logger` init (`PROBING_LOGLEVEL`, +//! default `warn`). + +use std::ffi::{c_char, CString}; +use std::os::raw::c_int; +use std::sync::Once; + +use once_cell::sync::OnceCell; + +/// NCCL `ncclDebugLogLevel` values we use. +pub const NCCL_LOG_WARN: c_int = 2; +pub const NCCL_LOG_INFO: c_int = 3; + +/// NCCL subsystem flag for profiler plugins (`NCCL_PROFILE`). +pub const NCCL_PROFILE: u64 = 0x4000; + +/// C variadic logger invoked with a single `%s` argument (stable Rust calling convention). +pub type NcclDebugLoggerFn = Option< + unsafe extern "C" fn( + level: c_int, + flags: u64, + file: *const c_char, + line: c_int, + fmt: *const c_char, + msg: *const c_char, + ), +>; + +static NCCL_LOGGER: OnceCell = OnceCell::new(); +static RUST_LOG: Once = Once::new(); + +const LOG_TARGET: &str = "probing-nccl-profiler"; + +pub fn set_nccl_logger(logfn: NcclDebugLoggerFn) { + if logfn.is_some() { + let _ = NCCL_LOGGER.set(logfn); + } + ensure_rust_logger(); +} + +pub fn ensure_rust_logger() { + RUST_LOG.call_once(|| { + let _ = env_logger::Builder::from_env( + env_logger::Env::new() + .default_filter_or("warn") + .filter("PROBING_LOGLEVEL"), + ) + .format_target(true) + .try_init(); + }); +} + +fn nccl_emit(level: c_int, msg: &str) { + if let Some(f) = NCCL_LOGGER.get().and_then(|f| *f) { + let Ok(cmsg) = CString::new(msg) else { + return; + }; + unsafe { + f( + level, + NCCL_PROFILE, + c"probing-nccl-profiler".as_ptr(), + 0, + c"%s".as_ptr(), + cmsg.as_ptr(), + ); + } + return; + } + match level { + NCCL_LOG_WARN => log::warn!(target: LOG_TARGET, "{msg}"), + NCCL_LOG_INFO => log::info!(target: LOG_TARGET, "{msg}"), + _ => log::debug!(target: LOG_TARGET, "{msg}"), + } +} + +pub fn info(msg: impl AsRef) { + ensure_rust_logger(); + nccl_emit(NCCL_LOG_INFO, msg.as_ref()); +} + +pub fn warn(msg: impl AsRef) { + ensure_rust_logger(); + nccl_emit(NCCL_LOG_WARN, msg.as_ref()); +} diff --git a/probing/extensions/nccl-profiler/src/plugin.rs b/probing/extensions/nccl-profiler/src/plugin.rs index 1ea2c919..f76ad789 100644 --- a/probing/extensions/nccl-profiler/src/plugin.rs +++ b/probing/extensions/nccl-profiler/src/plugin.rs @@ -1,41 +1,114 @@ -//! NCCL profiler plugin callbacks (`ncclProfiler_v3`). +//! NCCL profiler plugin callbacks (`ncclProfiler_v3` + `ncclProfiler_v4`). +//! +//! Both versions funnel into the same version-independent [`PluginState`] +//! (see `state::ParsedEvent` / `state::StateArgs`); only descriptor parsing +//! and the `init` signature differ. -use std::ffi::c_void; +use std::ffi::{c_char, c_void}; +use std::os::raw::c_int; use std::sync::atomic::Ordering; -use std::sync::OnceLock; +use std::sync::{Once, OnceLock}; +use std::time::Duration; +use crate::abi::profiler_v4::{ + NcclDebugLoggerFn, NcclProfilerEventDescrV4, NcclProfilerEventStateArgsV4, + NcclProfilerEventStateV4, +}; use crate::abi::{ nccl_success, NcclProfilerEventDescrV3, NcclProfilerEventStateArgsV3, NcclProfilerEventStateV3, - NcclResult, DEFAULT_ACTIVATION_MASK, + NcclResult, DEFAULT_ACTIVATION_MASK, STATE_KERNEL_CH_STOP, STATE_PROXY_STEP_RECV_FLUSH_WAIT, + STATE_PROXY_STEP_SEND_WAIT, }; -use crate::state::PluginState; +use crate::events::{event_type, EVT_PROXY_OP}; +use crate::log; +use crate::state::{CommInfo, PluginState, StateArgs}; fn instance() -> &'static PluginState { static INSTANCE: OnceLock = OnceLock::new(); INSTANCE.get_or_init(PluginState::new) } +fn resolve_mask() -> i32 { + std::env::var("NCCL_PROFILE_EVENT_MASK") + .ok() + .and_then(|s| s.parse::().ok()) + .unwrap_or(DEFAULT_ACTIVATION_MASK) +} + +/// Spawn the in-flight watchdog once per process. +/// +/// Ops still live after `PROBING_NCCL_INFLIGHT_THRESHOLD_SECS` (default 10, +/// same default as CoMMA's `NCCL_PROFILER_NCCLOP_TIMEOUT`) are snapshotted +/// into `nccl.inflight_ops`; `0` disables the watchdog. NCCL calls `init` +/// once per communicator, hence the `Once` guard. +fn spawn_inflight_watchdog() { + static SPAWNED: Once = Once::new(); + SPAWNED.call_once(|| { + let threshold_secs = std::env::var("PROBING_NCCL_INFLIGHT_THRESHOLD_SECS") + .ok() + .and_then(|s| s.trim().parse::().ok()) + .unwrap_or(10); + if threshold_secs == 0 { + return; + } + let threshold_ns = (threshold_secs * 1_000_000_000) as i64; + let interval = Duration::from_secs((threshold_secs / 2).max(1)); + let _ = std::thread::Builder::new() + .name("probing-nccl-watchdog".into()) + .spawn(move || loop { + std::thread::sleep(interval); + instance().snapshot_inflight(threshold_ns); + }); + }); +} + +fn log_finalize_counters(state: &PluginState) { + let c = &state.counters; + let pool_exhausted = c.pool_exhausted.load(Ordering::Relaxed); + let write_errors = c.write_errors.load(Ordering::Relaxed); + let msg = format!( + "finalize: coll={} p2p={} proxy_op={} proxy_step={} kernel_ch={} net={} rows={} pool_exhausted={pool_exhausted} write_errors={write_errors} filtered={}", + c.coll.load(Ordering::Relaxed), + c.p2p.load(Ordering::Relaxed), + c.proxy_op.load(Ordering::Relaxed), + c.proxy_step.load(Ordering::Relaxed), + c.kernel_ch.load(Ordering::Relaxed), + c.net_plugin.load(Ordering::Relaxed), + c.rows_written.load(Ordering::Relaxed), + c.filtered.load(Ordering::Relaxed), + ); + if pool_exhausted > 0 || write_errors > 0 { + log::warn(msg); + } else { + log::info(msg); + } +} + +// ── v3 callbacks (NCCL 2.26) ────────────────────────────────────────── + pub unsafe extern "C" fn probing_profiler_init( context: *mut *mut c_void, mask: *mut i32, ) -> NcclResult { if !mask.is_null() { - let env = std::env::var("NCCL_PROFILE_EVENT_MASK") - .ok() - .and_then(|s| s.parse::().ok()) - .unwrap_or(DEFAULT_ACTIVATION_MASK); - *mask = env; + *mask = resolve_mask(); } let state = instance(); if !context.is_null() { *context = state as *const PluginState as *mut c_void; } + spawn_inflight_watchdog(); + log::ensure_rust_logger(); - eprintln!( - "[probing-nccl-profiler] init ok (mask={})", - if mask.is_null() { 0 } else { *mask } - ); + static FIRST_INIT_V3: Once = Once::new(); + let verbose = std::env::var("PROBING_NCCL_VERBOSE").is_ok_and(|v| v == "1"); + let mut log_line = verbose; + FIRST_INIT_V3.call_once(|| log_line = true); + if log_line { + let mask_val = if mask.is_null() { 0 } else { *mask }; + log::info(format!("init ok (abi=v3, mask={mask_val})")); + } nccl_success() } @@ -52,12 +125,12 @@ pub unsafe extern "C" fn probing_profiler_start_event( } else { &*(context as *const PluginState) }; - state.with_mut(|inner| inner.start_event(handle, &*descr)); + state.start_event(handle, &*descr); nccl_success() } pub unsafe extern "C" fn probing_profiler_stop_event(handle: *mut c_void) -> NcclResult { - instance().with_mut(|inner| inner.stop_event(handle)); + instance().stop_event(handle); nccl_success() } @@ -66,29 +139,148 @@ pub unsafe extern "C" fn probing_profiler_record_state( state: NcclProfilerEventStateV3, args: *mut NcclProfilerEventStateArgsV3, ) -> NcclResult { - instance().with_mut(|inner| inner.record_state(handle, state, args)); + if handle.is_null() { + return nccl_success(); + } + // The v3 args union is only meaningful on proxy-op events. + let parsed = if !args.is_null() && event_type(handle) == EVT_PROXY_OP { + let a = &*args; + StateArgs::ProxyOpV3 { + trans_size: a.proxy_op.trans_size as u64, + steps: a.proxy_op.steps, + } + } else { + StateArgs::None + }; + instance().record_state(handle, state, parsed); nccl_success() } pub unsafe extern "C" fn probing_profiler_finalize(context: *mut c_void) -> NcclResult { let _ = context; let state = instance(); - let (coll, proxy_op, proxy_step, net, rows, pool_ex, write_err) = state.with_mut(|inner| { - inner.finalize_flush(); - let c = &inner.counters; - ( - c.coll.load(Ordering::Relaxed), - c.proxy_op.load(Ordering::Relaxed), - c.proxy_step.load(Ordering::Relaxed), - c.net_plugin.load(Ordering::Relaxed), - c.rows_written.load(Ordering::Relaxed), - c.pool_exhausted.load(Ordering::Relaxed), - c.write_errors.load(Ordering::Relaxed), - ) - }); - eprintln!( - "[probing-nccl-profiler] finalize: coll={coll} proxy_op={proxy_op} proxy_step={proxy_step} net={net} rows={rows} pool_exhausted={pool_ex} write_errors={write_err}" - ); + state.finalize_flush(); + log_finalize_counters(state); + nccl_success() +} + +// ── v4 callbacks (NCCL 2.27+) ───────────────────────────────────────── + +/// Per-communicator context handed back to NCCL as `void* context`. +struct CommCtxV4 { + info: CommInfo, +} + +/// Live v4 communicator contexts (finalize logs counters only when the last +/// one goes away, instead of once per communicator). +static LIVE_COMMS_V4: std::sync::atomic::AtomicUsize = std::sync::atomic::AtomicUsize::new(0); + +#[allow(clippy::too_many_arguments)] +pub unsafe extern "C" fn probing_profiler_init_v4( + context: *mut *mut c_void, + mask: *mut c_int, + comm_name: *const c_char, + comm_hash: u64, + n_nodes: c_int, + n_ranks: c_int, + rank: c_int, + logfn: NcclDebugLoggerFn, +) -> NcclResult { + log::set_nccl_logger(logfn); + if !mask.is_null() { + *mask = resolve_mask(); + } + + let info = CommInfo { comm_hash, n_ranks }; + if !context.is_null() { + *context = Box::into_raw(Box::new(CommCtxV4 { info })) as *mut c_void; + LIVE_COMMS_V4.fetch_add(1, Ordering::Relaxed); + } + // Make sure the global state (pools/writer) is alive before callbacks. + let _ = instance(); + spawn_inflight_watchdog(); + + // v4 init runs once per communicator — a large job creates dozens per + // rank. Log the first at full detail; the rest only when asked. + static FIRST_INIT: Once = Once::new(); + let verbose = std::env::var("PROBING_NCCL_VERBOSE").is_ok_and(|v| v == "1"); + let mut log_line = verbose; + FIRST_INIT.call_once(|| log_line = true); + if log_line { + let name = if comm_name.is_null() { + "" + } else { + std::ffi::CStr::from_ptr(comm_name).to_str().unwrap_or("") + }; + log::info(format!( + "init ok (abi=v4, mask={}, comm={name} hash={comm_hash:#x} nodes={n_nodes} ranks={n_ranks} rank={rank})", + if mask.is_null() { 0 } else { *mask }, + )); + } + nccl_success() +} + +pub unsafe extern "C" fn probing_profiler_start_event_v4( + context: *mut c_void, + handle: *mut *mut c_void, + descr: *mut NcclProfilerEventDescrV4, +) -> NcclResult { + if descr.is_null() || handle.is_null() { + return nccl_success(); + } + let comm = if context.is_null() { + CommInfo::default() + } else { + (*(context as *const CommCtxV4)).info + }; + instance().start_event_v4(handle, &*descr, comm); + nccl_success() +} + +pub unsafe extern "C" fn probing_profiler_record_state_v4( + handle: *mut c_void, + state: NcclProfilerEventStateV4, + args: *mut NcclProfilerEventStateArgsV4, +) -> NcclResult { + if handle.is_null() { + return nccl_success(); + } + let parsed = if args.is_null() { + StateArgs::None + } else { + match state { + // NCCL stamps `proxyStep.transSize` on *every* step-state report, + // but the value is only freshly assigned for the current step + // right before SendWait / RecvFlushWait (net.cc); at other states + // it may hold a different in-flight step's size. Only capture it + // where it is authoritative (same rule as NCCL's example plugin). + STATE_PROXY_STEP_SEND_WAIT | STATE_PROXY_STEP_RECV_FLUSH_WAIT => { + StateArgs::ProxyStepV4 { + trans_size: (*args).proxy_step.trans_size as u64, + } + } + STATE_KERNEL_CH_STOP => StateArgs::KernelChStop { + p_timer: (*args).kernel_ch.p_timer, + }, + _ => StateArgs::None, + } + }; + instance().record_state(handle, state, parsed); + nccl_success() +} + +pub unsafe extern "C" fn probing_profiler_finalize_v4(context: *mut c_void) -> NcclResult { + let mut last_comm = false; + if !context.is_null() { + // Reclaim the per-comm context allocated in `init_v4`. + drop(Box::from_raw(context as *mut CommCtxV4)); + last_comm = LIVE_COMMS_V4.fetch_sub(1, Ordering::Relaxed) == 1; + } + let state = instance(); + state.finalize_flush(); + if last_comm { + log_finalize_counters(state); + } nccl_success() } @@ -97,11 +289,23 @@ pub unsafe extern "C" fn probing_profiler_finalize(context: *mut c_void) -> Nccl mod tests { use super::*; use crate::abi::NcclProfilerEventBodyV3; - use crate::abi::{NcclProfilerProxyOpDescr, NCCL_PROFILE_COLL, NCCL_PROFILE_PROXY_OP}; + use crate::abi::{ + NcclProfilerProxyOpDescr, NCCL_PROFILE_COLL, NCCL_PROFILE_KERNEL_CH, NCCL_PROFILE_PROXY_OP, + }; use std::sync::atomic::Ordering; + use std::sync::Mutex; + + /// Tests share the process-global plugin instance; serialize them so + /// row-count assertions don't race. + static TEST_LOCK: Mutex<()> = Mutex::new(()); + + fn serial() -> std::sync::MutexGuard<'static, ()> { + TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()) + } #[test] fn init_sets_default_mask() { + let _guard = serial(); let mut ctx: *mut c_void = std::ptr::null_mut(); let mut mask = 0i32; unsafe { @@ -111,8 +315,29 @@ mod tests { } } + fn make_coll_descr(rank: i32, seq: u64) -> NcclProfilerEventDescrV3 { + NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_COLL as u8, + parent_obj: std::ptr::null_mut(), + rank, + body: NcclProfilerEventBodyV3 { + coll: { + let mut c: crate::abi::NcclProfilerCollDescr = unsafe { std::mem::zeroed() }; + c.comm_hash = 99; + c.seq_number = seq; + c.func = c"AllReduce".as_ptr(); + c.count = 4096; + c.datatype = c"ncclFloat32".as_ptr(); + c.n_max_channels = 4; + c + }, + }, + } + } + #[test] fn proxy_op_with_parent_coll_batches_at_coll_stop() { + let _guard = serial(); let mut ctx: *mut c_void = std::ptr::null_mut(); let mut mask = 0i32; unsafe { @@ -127,21 +352,7 @@ mod tests { let mut coll_h: *mut c_void = std::ptr::null_mut(); let mut proxy_h: *mut c_void = std::ptr::null_mut(); - let mut coll_descr = NcclProfilerEventDescrV3 { - type_: NCCL_PROFILE_COLL as u8, - parent_obj: std::ptr::null_mut(), - rank: 3, - body: NcclProfilerEventBodyV3 { - coll: { - let mut c: crate::abi::NcclProfilerCollDescr = unsafe { std::mem::zeroed() }; - c.comm_hash = 99; - c.seq_number = 1; - c.func = c"AllReduce".as_ptr(); - c.n_max_channels = 4; - c - }, - }, - }; + let mut coll_descr = make_coll_descr(3, 1); unsafe { probing_profiler_start_event(ctx, &mut coll_h, &mut coll_descr); @@ -167,12 +378,236 @@ mod tests { probing_profiler_finalize(ctx); } - let state = instance(); - let rows = state.with_mut(|inner| inner.counters.rows_written.load(Ordering::Relaxed)); + let rows = instance().counters.rows_written.load(Ordering::Relaxed); assert!(rows >= 1, "expected batch flush on coll stop"); let _ = std::fs::remove_dir_all(&base); } + #[test] + fn kernel_ch_extends_coll_lifetime_and_sets_timing() { + let _guard = serial(); + let mut ctx: *mut c_void = std::ptr::null_mut(); + let mut mask = 0i32; + unsafe { + probing_profiler_init(&mut ctx, &mut mask).unwrap(); + } + assert_ne!(mask & NCCL_PROFILE_KERNEL_CH, 0, "KernelCh in default mask"); + + let base = std::env::temp_dir().join(format!("probing_nccl_kch_{}", std::process::id())); + let _ = std::fs::remove_dir_all(&base); + std::fs::create_dir_all(&base).unwrap(); + std::env::set_var("PROBING_DATA_DIR", &base); + + let before = instance().counters.rows_written.load(Ordering::Relaxed); + + let mut coll_descr = make_coll_descr(2, 5); + let mut coll_h: *mut c_void = std::ptr::null_mut(); + let mut kch_h: *mut c_void = std::ptr::null_mut(); + unsafe { + probing_profiler_start_event(ctx, &mut coll_h, &mut coll_descr); + assert!(!coll_h.is_null()); + + let mut kch_descr = NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_KERNEL_CH as u8, + parent_obj: coll_h, + rank: 2, + body: NcclProfilerEventBodyV3 { + kernel_ch: crate::abi::NcclProfilerKernelChDescr { channel_id: 1 }, + }, + }; + probing_profiler_start_event(ctx, &mut kch_h, &mut kch_descr); + assert!(!kch_h.is_null(), "kernelCh with live parent must track"); + + // NCCL semantics: coll stopEvent = enqueue done; kernel still runs. + probing_profiler_stop_event(coll_h); + let mid = instance().counters.rows_written.load(Ordering::Relaxed); + assert_eq!(mid, before, "coll must not complete while kernelCh live"); + + probing_profiler_stop_event(kch_h); + } + + let after = instance().counters.rows_written.load(Ordering::Relaxed); + assert!(after > before, "kernelCh stop must complete the coll"); + let _ = std::fs::remove_dir_all(&base); + } + + #[test] + fn p2p_event_writes_coll_perf_row() { + let _guard = serial(); + let mut ctx: *mut c_void = std::ptr::null_mut(); + let mut mask = 0i32; + unsafe { + probing_profiler_init(&mut ctx, &mut mask).unwrap(); + } + assert_ne!( + mask & crate::abi::NCCL_PROFILE_P2P, + 0, + "P2P in default mask" + ); + + let base = std::env::temp_dir().join(format!("probing_nccl_p2p_{}", std::process::id())); + let _ = std::fs::remove_dir_all(&base); + std::fs::create_dir_all(&base).unwrap(); + std::env::set_var("PROBING_DATA_DIR", &base); + + let before = instance().counters.rows_written.load(Ordering::Relaxed); + + let mut p2p_descr = NcclProfilerEventDescrV3 { + type_: crate::abi::NCCL_PROFILE_P2P as u8, + parent_obj: std::ptr::null_mut(), + rank: 4, + body: NcclProfilerEventBodyV3 { + p2p: { + let mut p: crate::abi::NcclProfilerP2pDescr = unsafe { std::mem::zeroed() }; + p.comm_hash = 7; + p.func = c"Send".as_ptr(); + p.count = 65536; + p.datatype = c"ncclFloat16".as_ptr(); + p.peer = 5; + p + }, + }, + }; + let mut h: *mut c_void = std::ptr::null_mut(); + unsafe { + probing_profiler_start_event(ctx, &mut h, &mut p2p_descr); + assert!(!h.is_null(), "P2P event must allocate a slot"); + probing_profiler_stop_event(h); + } + + let after = instance().counters.rows_written.load(Ordering::Relaxed); + assert!(after > before, "expected a coll_perf row for P2P op"); + let _ = std::fs::remove_dir_all(&base); + } + + #[test] + fn inflight_snapshot_sees_unstopped_coll() { + let _guard = serial(); + let mut ctx: *mut c_void = std::ptr::null_mut(); + let mut mask = 0i32; + unsafe { + probing_profiler_init(&mut ctx, &mut mask).unwrap(); + } + + let base = + std::env::temp_dir().join(format!("probing_nccl_inflight_{}", std::process::id())); + let _ = std::fs::remove_dir_all(&base); + std::fs::create_dir_all(&base).unwrap(); + std::env::set_var("PROBING_DATA_DIR", &base); + + let mut coll_descr = NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_COLL as u8, + parent_obj: std::ptr::null_mut(), + rank: 1, + body: NcclProfilerEventBodyV3 { + coll: { + let mut c: crate::abi::NcclProfilerCollDescr = unsafe { std::mem::zeroed() }; + c.comm_hash = 11; + c.seq_number = 3; + c.func = c"AllGather".as_ptr(); + c + }, + }, + }; + let mut h: *mut c_void = std::ptr::null_mut(); + unsafe { + probing_profiler_start_event(ctx, &mut h, &mut coll_descr); + assert!(!h.is_null()); + } + + // age threshold 0 → the just-started coll qualifies immediately + let snapshotted = instance().snapshot_inflight(0); + assert!(snapshotted >= 1, "unstopped coll must appear in snapshot"); + + unsafe { probing_profiler_stop_event(h) }; + let _ = std::fs::remove_dir_all(&base); + } + + #[test] + fn v4_lifecycle_with_gpu_timer_and_comm_info() { + use crate::abi::profiler_v4::{ + NcclProfilerCollDescrV4, NcclProfilerEventBodyV4, NcclProfilerEventStateArgsV4, + NcclProfilerKernelChDescrV4, NcclProfilerKernelChStateArgsV4, + }; + + let _guard = serial(); + let mut ctx: *mut c_void = std::ptr::null_mut(); + let mut mask = 0i32; + unsafe { + probing_profiler_init_v4( + &mut ctx, + &mut mask, + c"train_comm".as_ptr(), + 0xABCD, + 2, // n_nodes + 16, // n_ranks + 3, // rank + None, + ) + .unwrap(); + } + assert!(!ctx.is_null(), "v4 init must allocate a comm context"); + assert_eq!(mask, DEFAULT_ACTIVATION_MASK); + + let base = std::env::temp_dir().join(format!("probing_nccl_v4_{}", std::process::id())); + let _ = std::fs::remove_dir_all(&base); + std::fs::create_dir_all(&base).unwrap(); + std::env::set_var("PROBING_DATA_DIR", &base); + + let before = instance().counters.rows_written.load(Ordering::Relaxed); + + let mut coll_descr = NcclProfilerEventDescrV4 { + type_: crate::abi::NCCL_PROFILE_COLL as u8, + parent_obj: std::ptr::null_mut(), + rank: 3, + body: NcclProfilerEventBodyV4 { + coll: { + let mut c: NcclProfilerCollDescrV4 = unsafe { std::mem::zeroed() }; + c.seq_number = 9; + c.func = c"AllReduce".as_ptr(); + c.count = 4096; + c.datatype = c"ncclFloat32".as_ptr(); + c.n_channels = 4; + c + }, + }, + }; + let mut coll_h: *mut c_void = std::ptr::null_mut(); + let mut kch_h: *mut c_void = std::ptr::null_mut(); + unsafe { + probing_profiler_start_event_v4(ctx, &mut coll_h, &mut coll_descr); + assert!(!coll_h.is_null()); + + let mut kch_descr = NcclProfilerEventDescrV4 { + type_: crate::abi::NCCL_PROFILE_KERNEL_CH as u8, + parent_obj: coll_h, + rank: 3, + body: NcclProfilerEventBodyV4 { + kernel_ch: NcclProfilerKernelChDescrV4 { + channel_id: 0, + p_timer: 5_000_000, // GPU globaltimer start + }, + }, + }; + probing_profiler_start_event_v4(ctx, &mut kch_h, &mut kch_descr); + assert!(!kch_h.is_null()); + + // v4: KernelChStop carries the GPU globaltimer stop timestamp. + let mut args = NcclProfilerEventStateArgsV4 { + kernel_ch: NcclProfilerKernelChStateArgsV4 { p_timer: 7_500_000 }, + }; + probing_profiler_record_state_v4(kch_h, crate::abi::STATE_KERNEL_CH_STOP, &mut args); + + probing_profiler_stop_event(coll_h); + probing_profiler_stop_event(kch_h); + probing_profiler_finalize_v4(ctx); + } + + let after = instance().counters.rows_written.load(Ordering::Relaxed); + assert!(after > before, "v4 coll must emit a coll_perf row"); + let _ = std::fs::remove_dir_all(&base); + } + trait NcclResultExt { fn unwrap(self) -> NcclResult; } diff --git a/probing/extensions/nccl-profiler/src/pool.rs b/probing/extensions/nccl-profiler/src/pool.rs index 9e31e9a2..28fb66e9 100644 --- a/probing/extensions/nccl-profiler/src/pool.rs +++ b/probing/extensions/nccl-profiler/src/pool.rs @@ -4,6 +4,14 @@ use std::mem::MaybeUninit; pub const INVALID_IDX: u32 = u32::MAX; +/// Slot types embed their own pool index so `index_of` is O(1): the NCCL +/// callback hot path resolves handles by reading the index back from the +/// slot instead of scanning the pool. +pub trait Indexed { + fn set_self_idx(&mut self, idx: u32); + fn self_idx(&self) -> u32; +} + pub struct SlotPool { slots: Vec>, free: Vec, @@ -14,7 +22,7 @@ struct Slot { live: bool, } -impl SlotPool { +impl SlotPool { pub fn with_capacity(cap: usize) -> Self { let mut free: Vec = (0..cap as u32).collect(); free.reverse(); @@ -39,13 +47,28 @@ impl SlotPool { Some((ptr, idx)) } - pub fn index_of(&self, ptr: *mut T) -> Option { - for (i, slot) in self.slots.iter().enumerate() { - if slot.live && std::ptr::eq(slot.value.as_ptr(), ptr) { - return Some(i as u32); - } + /// Resolve a pointer back to its pool index in O(1). + /// + /// Reads the embedded index and validates it (bounds, liveness, pointer + /// identity), so stale or foreign pool pointers return `None` instead of + /// aliasing another slot. + /// + /// # Safety + /// + /// `ptr` must be readable as a `T` (in practice: an event handle that + /// this plugin previously returned to NCCL from some pool's `alloc`). + pub unsafe fn index_of(&self, ptr: *mut T) -> Option { + if ptr.is_null() { + return None; + } + let packed = (*ptr).self_idx(); + let idx = crate::shard::slot_index(packed); + let slot = self.slots.get(idx as usize)?; + if slot.live && std::ptr::eq(slot.value.as_ptr(), ptr) { + Some(idx) + } else { + None } - None } pub fn get_mut(&mut self, idx: u32) -> Option<&mut T> { @@ -57,8 +80,20 @@ impl SlotPool { } } + /// Visit every live slot (read-only). Used by the in-flight snapshot scan. + pub fn for_each_live(&self, mut f: impl FnMut(u32, &T)) { + for (i, slot) in self.slots.iter().enumerate() { + if slot.live { + f(i as u32, unsafe { slot.value.assume_init_ref() }); + } + } + } + + /// # Safety + /// + /// Same contract as [`SlotPool::index_of`]. #[allow(dead_code)] - pub fn free_ptr(&mut self, ptr: *mut T) { + pub unsafe fn free_ptr(&mut self, ptr: *mut T) { if let Some(idx) = self.index_of(ptr) { self.free_idx(idx); } @@ -73,6 +108,23 @@ impl SlotPool { unsafe { slot.value.assume_init_drop() }; self.free.push(idx); } + + pub fn capacity(&self) -> usize { + self.slots.len() + } + + pub fn live_count(&self) -> usize { + self.capacity().saturating_sub(self.free.len()) + } + + /// Live slots as a percentage of capacity (0–100). + pub fn usage_pct(&self) -> u8 { + let cap = self.capacity(); + if cap == 0 { + return 0; + } + ((self.live_count() * 100) / cap).min(100) as u8 + } } #[cfg(test)] @@ -80,17 +132,75 @@ mod tests { use super::*; #[derive(Debug)] - struct X(u32); + struct X { + v: u32, + idx: u32, + } + + impl X { + fn new(v: u32) -> Self { + Self { + v, + idx: INVALID_IDX, + } + } + } + + impl Indexed for X { + fn set_self_idx(&mut self, idx: u32) { + self.idx = idx; + } + fn self_idx(&self) -> u32 { + self.idx + } + } #[test] fn alloc_free_roundtrip() { let mut pool = SlotPool::with_capacity(4); - let (p, idx) = pool.alloc(|| X(7)).unwrap(); - assert_eq!(unsafe { (*p).0 }, 7); + let (p, idx) = pool.alloc(|| X::new(7)).unwrap(); + unsafe { + (*p).set_self_idx(idx); + } + assert_eq!(unsafe { (*p).v }, 7); assert_eq!(idx, 0); pool.free_idx(idx); - let (p2, idx2) = pool.alloc(|| X(9)).unwrap(); + let (p2, idx2) = pool.alloc(|| X::new(9)).unwrap(); + unsafe { + (*p2).set_self_idx(idx2); + } assert_eq!(idx2, 0); - assert_eq!(unsafe { (*p2).0 }, 9); + assert_eq!(unsafe { (*p2).v }, 9); + } + + #[test] + fn index_of_is_validated() { + let mut pool = SlotPool::with_capacity(2); + let (p, idx) = pool.alloc(|| X::new(1)).unwrap(); + unsafe { + (*p).set_self_idx(idx); + } + assert_eq!(unsafe { pool.index_of(p) }, Some(idx)); + // Stale handle after free must not resolve. + pool.free_idx(idx); + assert_eq!(unsafe { pool.index_of(p) }, None); + // A pointer from another pool must not resolve here either. + let mut other = SlotPool::with_capacity(2); + let (q, qidx) = other.alloc(|| X::new(2)).unwrap(); + unsafe { + (*q).set_self_idx(qidx); + } + assert_eq!(unsafe { pool.index_of(q) }, None); + } + + #[test] + fn usage_pct_tracks_live_slots() { + let mut pool = SlotPool::with_capacity(4); + assert_eq!(pool.usage_pct(), 0); + let (_, idx) = pool.alloc(|| X::new(1)).unwrap(); + pool.get_mut(idx).unwrap().set_self_idx(idx); + assert_eq!(pool.usage_pct(), 25); + pool.free_idx(idx); + assert_eq!(pool.usage_pct(), 0); } } diff --git a/probing/extensions/nccl-profiler/src/pool_config.rs b/probing/extensions/nccl-profiler/src/pool_config.rs new file mode 100644 index 00000000..620f334b --- /dev/null +++ b/probing/extensions/nccl-profiler/src/pool_config.rs @@ -0,0 +1,76 @@ +//! Fixed slot-pool sizing (`PROBING_NCCL_MAX_*_SLOTS`). + +const DEFAULT_MAX_COLL: usize = 512; +const DEFAULT_MAX_PROXY_OP: usize = 8192; +const DEFAULT_MAX_PROXY_STEP: usize = 32768; +const DEFAULT_MAX_KERNEL_CH: usize = 8192; +const DEFAULT_MAX_NET: usize = 4096; + +const MIN_SLOTS: usize = 64; +const MAX_SLOTS: usize = 1_048_576; + +#[derive(Clone, Copy, Debug)] +pub struct PoolLimits { + pub coll: usize, + pub proxy_op: usize, + pub proxy_step: usize, + pub kernel_ch: usize, + pub net: usize, +} + +impl Default for PoolLimits { + fn default() -> Self { + Self { + coll: DEFAULT_MAX_COLL, + proxy_op: DEFAULT_MAX_PROXY_OP, + proxy_step: DEFAULT_MAX_PROXY_STEP, + kernel_ch: DEFAULT_MAX_KERNEL_CH, + net: DEFAULT_MAX_NET, + } + } +} + +/// Divide global limits across pool shards (each shard owns a fraction). +pub fn per_shard_limits(total: PoolLimits, shards: usize) -> PoolLimits { + let n = shards.max(1); + PoolLimits { + coll: (total.coll / n).max(32), + proxy_op: (total.proxy_op / n).max(256), + proxy_step: (total.proxy_step / n).max(1024), + kernel_ch: (total.kernel_ch / n).max(256), + net: (total.net / n).max(128), + } +} + +fn parse_env_usize(key: &str, default: usize) -> usize { + std::env::var(key) + .ok() + .and_then(|s| s.trim().parse::().ok()) + .map(|v| v.clamp(MIN_SLOTS, MAX_SLOTS)) + .unwrap_or(default) +} + +/// Resolved slot limits (read once per process). +pub fn pool_limits() -> PoolLimits { + static LIMITS: once_cell::sync::Lazy = once_cell::sync::Lazy::new(|| PoolLimits { + coll: parse_env_usize("PROBING_NCCL_MAX_COLL_SLOTS", DEFAULT_MAX_COLL), + proxy_op: parse_env_usize("PROBING_NCCL_MAX_PROXY_OP_SLOTS", DEFAULT_MAX_PROXY_OP), + proxy_step: parse_env_usize("PROBING_NCCL_MAX_PROXY_STEP_SLOTS", DEFAULT_MAX_PROXY_STEP), + kernel_ch: parse_env_usize("PROBING_NCCL_MAX_KERNEL_CH_SLOTS", DEFAULT_MAX_KERNEL_CH), + net: parse_env_usize("PROBING_NCCL_MAX_NET_SLOTS", DEFAULT_MAX_NET), + }); + *LIMITS +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn defaults_are_larger_than_legacy_hardcodes() { + let limits = PoolLimits::default(); + assert!(limits.coll >= 512); + assert!(limits.proxy_op >= 8192); + assert!(limits.proxy_step >= 32768); + } +} diff --git a/probing/extensions/nccl-profiler/src/pool_pressure.rs b/probing/extensions/nccl-profiler/src/pool_pressure.rs new file mode 100644 index 00000000..47e12872 --- /dev/null +++ b/probing/extensions/nccl-profiler/src/pool_pressure.rs @@ -0,0 +1,46 @@ +//! Rate-limited warnings when NCCL event pools fill up or exhaust. + +use std::sync::atomic::{AtomicI64, Ordering}; + +use crate::events::now_ns; +use crate::pool::{Indexed, SlotPool}; + +const WARN_INTERVAL_NS: i64 = 10_000_000_000; + +static LAST_USAGE_WARN_NS: AtomicI64 = AtomicI64::new(0); +static LAST_EXHAUST_WARN_NS: AtomicI64 = AtomicI64::new(0); + +fn debounce(last: &AtomicI64) -> bool { + let now = now_ns(); + let prev = last.load(Ordering::Relaxed); + if now.saturating_sub(prev) < WARN_INTERVAL_NS { + return false; + } + last.store(now, Ordering::Relaxed); + true +} + +pub fn warn_pool_exhausted(pool: &str, usage_pct: u8) { + if !debounce(&LAST_EXHAUST_WARN_NS) { + return; + } + crate::log::warn(format!( + "NCCL profiler pool exhausted: {pool} (usage={usage_pct}%) — events dropped; \ + tune PROBING_NCCL_MAX_*_SLOTS or PROBING_NCCL_MIN_MSG_BYTES" + )); +} + +pub fn maybe_warn_pool_usage(pool: &str, usage_pct: u8) { + if usage_pct < 80 { + return; + } + if debounce(&LAST_USAGE_WARN_NS) { + crate::log::warn(format!( + "NCCL profiler pool pressure: {pool} at {usage_pct}% capacity" + )); + } +} + +pub fn check_pool_usage(pool: &str, slot_pool: &SlotPool) { + maybe_warn_pool_usage(pool, slot_pool.usage_pct()); +} diff --git a/probing/extensions/nccl-profiler/src/ring_config.rs b/probing/extensions/nccl-profiler/src/ring_config.rs new file mode 100644 index 00000000..52a4c23d --- /dev/null +++ b/probing/extensions/nccl-profiler/src/ring_config.rs @@ -0,0 +1,35 @@ +//! Mmap ring sizing for NCCL memtables (`PROBING_NCCL_CHUNK_BYTES`, `PROBING_NCCL_NUM_CHUNKS`). + +const DEFAULT_CHUNK_BYTES: u32 = 64 * 1024; +const DEFAULT_NUM_CHUNKS: u32 = 64; +const MIN_CHUNK_BYTES: u32 = 4 * 1024; +const MAX_CHUNK_BYTES: u32 = 16 * 1024 * 1024; +const MIN_NUM_CHUNKS: u32 = 4; +const MAX_NUM_CHUNKS: u32 = 4096; + +/// `(chunk_size_bytes, num_chunks)` for NCCL mmap tables. +pub fn nccl_mmap_ring_config() -> (u32, u32) { + let chunk = std::env::var("PROBING_NCCL_CHUNK_BYTES") + .ok() + .and_then(|s| s.trim().parse::().ok()) + .map(|v| v.clamp(MIN_CHUNK_BYTES, MAX_CHUNK_BYTES)) + .unwrap_or(DEFAULT_CHUNK_BYTES); + let num = std::env::var("PROBING_NCCL_NUM_CHUNKS") + .ok() + .and_then(|s| s.trim().parse::().ok()) + .map(|v| v.clamp(MIN_NUM_CHUNKS, MAX_NUM_CHUNKS)) + .unwrap_or(DEFAULT_NUM_CHUNKS); + (chunk, num) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn defaults_are_production_sized() { + let (chunk, num) = nccl_mmap_ring_config(); + assert_eq!(chunk, DEFAULT_CHUNK_BYTES); + assert_eq!(num, DEFAULT_NUM_CHUNKS); + } +} diff --git a/probing/extensions/nccl-profiler/src/role.rs b/probing/extensions/nccl-profiler/src/role.rs index 42698a7d..dc0316dc 100644 --- a/probing/extensions/nccl-profiler/src/role.rs +++ b/probing/extensions/nccl-profiler/src/role.rs @@ -28,6 +28,19 @@ pub fn snapshot() -> RoleRanks { } } +/// Role ranks captured once on first use. They are fixed for the lifetime of +/// a training process, and `std::env::var` takes the process env lock — not +/// something to pay (9 lookups) on every completed row. +pub fn cached() -> RoleRanks { + static CACHED: once_cell::sync::Lazy = once_cell::sync::Lazy::new(snapshot); + *CACHED +} + +/// Global torch rank for counter snapshots (`RANK` / `LOCAL_RANK`). +pub fn training_rank() -> i32 { + read_env_i32(&["RANK", "LOCAL_RANK"]) +} + #[cfg(test)] mod tests { use super::snapshot; diff --git a/probing/extensions/nccl-profiler/src/shard.rs b/probing/extensions/nccl-profiler/src/shard.rs new file mode 100644 index 00000000..09e6059d --- /dev/null +++ b/probing/extensions/nccl-profiler/src/shard.rs @@ -0,0 +1,92 @@ +//! Shard routing for partitioned slot pools (reduces callback lock contention). +//! +//! Slot indices pack `(shard_id << 24) | local_idx` into each handle's +//! `self_idx` so `stop_event` / `record_state` lock only one shard. + +use std::ffi::c_void; + +use once_cell::sync::Lazy; + +use crate::events::{ + event_type, CollSlot, KernelChSlot, NetPluginSlot, ProxyOpSlot, ProxyStepSlot, EVT_COLL, + EVT_KERNEL_CH, EVT_NET_PLUGIN, EVT_PROXY_OP, EVT_PROXY_STEP, +}; +use crate::pool::Indexed; + +const IDX_MASK: u32 = 0x00FF_FFFF; +const SHARD_SHIFT: u32 = 24; + +const DEFAULT_SHARDS: usize = 8; +const MIN_SHARDS: usize = 1; +const MAX_SHARDS: usize = 64; + +static SHARD_COUNT: Lazy = Lazy::new(|| { + if cfg!(test) { + return 1; + } + std::env::var("PROBING_NCCL_POOL_SHARDS") + .ok() + .and_then(|s| s.trim().parse::().ok()) + .map(|n| n.clamp(MIN_SHARDS, MAX_SHARDS)) + .unwrap_or(DEFAULT_SHARDS) +}); + +pub fn pool_shard_count() -> usize { + *SHARD_COUNT +} + +#[inline] +pub fn pack_slot_id(shard: usize, local_idx: u32) -> u32 { + debug_assert!(shard < MAX_SHARDS); + (local_idx & IDX_MASK) | ((shard as u32) << SHARD_SHIFT) +} + +#[inline] +pub fn shard_id(packed: u32) -> usize { + (packed >> SHARD_SHIFT) as usize +} + +#[inline] +pub fn slot_index(packed: u32) -> u32 { + packed & IDX_MASK +} + +pub fn shard_for_comm(comm_hash: u64) -> usize { + let n = pool_shard_count(); + (comm_hash as usize) % n +} + +/// Read the shard id embedded in a live NCCL event handle (lock-free). +pub fn shard_for_handle(handle: *mut c_void) -> Option { + if handle.is_null() { + return None; + } + let packed = packed_self_idx(handle)?; + Some(shard_id(packed)) +} + +fn packed_self_idx(handle: *mut c_void) -> Option { + // SAFETY: NCCL only passes back handles this plugin previously returned. + Some(unsafe { + match event_type(handle) { + EVT_COLL => (*(handle as *const CollSlot)).self_idx(), + EVT_PROXY_OP => (*(handle as *const ProxyOpSlot)).self_idx(), + EVT_PROXY_STEP => (*(handle as *const ProxyStepSlot)).self_idx(), + EVT_KERNEL_CH => (*(handle as *const KernelChSlot)).self_idx(), + EVT_NET_PLUGIN => (*(handle as *const NetPluginSlot)).self_idx(), + _ => return None, + } + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn pack_roundtrip() { + let packed = pack_slot_id(3, 42); + assert_eq!(shard_id(packed), 3); + assert_eq!(slot_index(packed), 42); + } +} diff --git a/probing/extensions/nccl-profiler/src/state.rs b/probing/extensions/nccl-profiler/src/state.rs index fa41911f..91f51c67 100644 --- a/probing/extensions/nccl-profiler/src/state.rs +++ b/probing/extensions/nccl-profiler/src/state.rs @@ -1,61 +1,348 @@ //! Plugin runtime: slot pools, event hierarchy, batch flush. +//! +//! # Timing model (follows the official NCCL ext-profiler guidance) +//! +//! NCCL's coll/p2p `stopEvent` only marks the end of the **host-side +//! enqueue** — the GPU kernel and proxy threads keep working after it. Real +//! execution time is reconstructed by reference-counting child events, as +//! recommended by NCCL's ext-profiler docs: +//! +//! * every child (`ProxyOp`, `KernelCh`) bumps `live_children` on start and +//! drops it on stop, folding its `[start, stop]` window into the parent; +//! * the coll completes when it is stopped *and* `live_children == 0`; +//! * `exec_time_ns` then prefers the kernel-channel window (NCCL's own +//! signal for kernel activity), falling back to the proxy window, then to +//! the enqueue window (`timing_source` records which one was used). +//! +//! # Locking +//! +//! Slot pools are sharded by communicator hash (see [`crate::shard`]); each +//! shard has its own mutex so concurrent NCCL callbacks on different comms +//! rarely contend. The mmap [`NcclWriter`] keeps a separate lock; completed +//! rows are collected under a shard lock and written after it is released. use std::ffi::{c_char, c_void}; use std::sync::atomic::Ordering; use parking_lot::Mutex; +use once_cell::sync::Lazy; + use crate::abi::net_ib_v1::{net_plugin_type, read_ib_qp, NCCL_PROFILER_NET_TYPE_IB}; use crate::abi::{ - NcclProfilerEventDescrV3, NcclProfilerEventStateArgsV3, NcclProfilerEventStateV3, - NCCL_PROFILE_COLL, NCCL_PROFILE_NET_PLUGIN, NCCL_PROFILE_PROXY_OP, NCCL_PROFILE_PROXY_STEP, + NcclProfilerEventDescrV3, NcclProfilerEventDescrV4, NcclProfilerEventState, NCCL_PROFILE_COLL, + NCCL_PROFILE_KERNEL_CH, NCCL_PROFILE_NET_PLUGIN, NCCL_PROFILE_P2P, NCCL_PROFILE_PROXY_OP, + NCCL_PROFILE_PROXY_STEP, }; use crate::events::{ - copy_func_name, event_type, now_ns, proxy_step_state_index, CollContext, CollSlot, - CompletedProxyOp, EventCounters, NetPluginSlot, ProxyOpData, ProxyOpSlot, ProxyStepData, - ProxyStepSlot, EVT_COLL, EVT_NET_PLUGIN, EVT_PROXY_OP, EVT_PROXY_STEP, MAX_CHANNELS, + copy_func_name, dtype_bytes, event_type, now_ns, proxy_step_state_index, CollContext, + CollPerfMeta, CollSlot, CompletedCollPerf, CompletedProxyOp, EventCounters, InflightOp, + KernelChSlot, NetPluginSlot, ProfilerCounterSnapshot, ProxyOpData, ProxyOpSlot, ProxyStepData, + ProxyStepSlot, ShortName, EVT_COLL, EVT_KERNEL_CH, EVT_NET_PLUGIN, EVT_PROXY_OP, + EVT_PROXY_STEP, }; -use crate::pool::{SlotPool, INVALID_IDX}; +use crate::pool::{Indexed, SlotPool, INVALID_IDX}; +use crate::pool_config::{per_shard_limits, pool_limits, PoolLimits}; +use crate::pool_pressure::{check_pool_usage, warn_pool_exhausted}; +use crate::shard::{pack_slot_id, pool_shard_count, shard_for_comm, shard_for_handle}; use crate::writer::{CompletedNetQp, NcclWriter}; -const MAX_COLL_SLOTS: usize = 256; -const MAX_PROXY_OP_SLOTS: usize = 4096; -const MAX_PROXY_STEP_SLOTS: usize = 16384; -const MAX_NET_SLOTS: usize = 4096; +/// Per-communicator metadata from the v4 `init` callback (empty on v3). +#[derive(Clone, Copy, Debug)] +pub struct CommInfo { + pub comm_hash: u64, + pub n_ranks: i32, +} -pub struct PluginState { - inner: Mutex, +impl Default for CommInfo { + fn default() -> Self { + Self { + comm_hash: 0, + n_ranks: -1, + } + } +} + +/// ABI-version-independent view of a `startEvent` descriptor. The v3/v4 +/// callbacks parse their own descriptor layout into this, keeping the slot +/// pools free of version-specific code. +pub enum ParsedEvent { + /// Collective or P2P host call (`meta.is_p2p` distinguishes them). + Coll { + ctx: CollContext, + meta: CollPerfMeta, + }, + ProxyOp { + parent_obj: *mut c_void, + rank: i32, + channel_id: i32, + peer: i32, + n_steps: i32, + is_send: i32, + }, + ProxyStep { + parent_obj: *mut c_void, + step: i32, + }, + KernelCh { + parent_obj: *mut c_void, + channel_id: i32, + /// GPU globaltimer at kernel start (v4 `pTimer`; 0 on v3). + gpu_start_ptimer: u64, + }, + NetPlugin { + rank: i32, + id: i64, + data: *mut c_void, + }, + Ignored, +} + +/// ABI-version-independent `recordEventState` payload. +#[derive(Clone, Copy, Debug)] +pub enum StateArgs { + None, + /// v3: transferred bytes + step count reported on the proxy-op event. + ProxyOpV3 { + trans_size: u64, + steps: i32, + }, + /// v4: this step's transferred bytes, captured only at SendWait / + /// RecvFlushWait where NCCL has just assigned it (other states carry a + /// stale value from another in-flight step). + ProxyStepV4 { + trans_size: u64, + }, + /// v4 `KernelChStop`: GPU globaltimer stop timestamp. + KernelChStop { + p_timer: u64, + }, +} + +/// Ops smaller than this (bytes) are not recorded (0 = record everything). +/// Mirrors NCCL Inspector's `NCCL_INSPECTOR_DUMP_MIN_SIZE_BYTES` / CoMMA's +/// `NCCL_PROFILER_SMALL_MSG_THRESHOLD`. +static MIN_MSG_BYTES: Lazy = Lazy::new(|| { + std::env::var("PROBING_NCCL_MIN_MSG_BYTES") + .ok() + .and_then(|s| s.trim().parse::().ok()) + .unwrap_or(0) +}); + +/// Rows produced under the pools lock, written after it is released. +#[derive(Default)] +pub struct FlushBatch { + coll_perf: Vec, + proxy_ops: Vec, + net_qp: Vec, +} + +impl FlushBatch { + fn is_empty(&self) -> bool { + self.coll_perf.is_empty() && self.proxy_ops.is_empty() && self.net_qp.is_empty() + } + + fn write(&self, writer: &mut NcclWriter, counters: &EventCounters) { + for row in &self.coll_perf { + writer.append_coll_perf(row, counters); + } + writer.flush_proxy_ops(&self.proxy_ops, counters); + for row in &self.net_qp { + writer.append_net_qp(row, counters); + } + } +} + +/// Partitioned slot pools — one mutex per shard (by comm hash). +struct ShardedPools { + shards: Vec>, +} + +impl ShardedPools { + fn new() -> Self { + let n = pool_shard_count(); + let total = pool_limits(); + let per = per_shard_limits(total, n); + Self { + shards: (0..n).map(|_| Mutex::new(Pools::new(per))).collect(), + } + } + + fn start_event(&self, handle: *mut *mut c_void, event: ParsedEvent, counters: &EventCounters) { + let shard = shard_for_start(&event); + self.shards[shard] + .lock() + .start_event(handle, event, counters, shard); + } + + fn stop_event(&self, handle: *mut c_void, counters: &EventCounters) -> FlushBatch { + let shard = shard_for_handle(handle).unwrap_or(0); + self.shards[shard].lock().stop_event(handle, counters) + } + + fn record_state(&self, handle: *mut c_void, state: NcclProfilerEventState, args: StateArgs) { + let shard = shard_for_handle(handle).unwrap_or(0); + self.shards[shard].lock().record_state(handle, state, args); + } + + /// Watchdog path: skip shards held by NCCL callbacks so we never block comm. + fn try_collect_inflight(&self, min_age_ns: i64) -> (Vec, FlushBatch) { + let mut rows = Vec::new(); + let mut batch = FlushBatch::default(); + for shard in &self.shards { + let Some(mut pools) = shard.try_lock() else { + continue; + }; + let (partial_rows, partial_batch) = pools.collect_inflight(min_age_ns); + rows.extend(partial_rows); + batch.coll_perf.extend(partial_batch.coll_perf); + batch.proxy_ops.extend(partial_batch.proxy_ops); + batch.net_qp.extend(partial_batch.net_qp); + } + (rows, batch) + } + + fn drain_all_pending(&self) -> FlushBatch { + let mut batch = FlushBatch::default(); + for shard in &self.shards { + let partial = shard.lock().drain_pending(); + batch.coll_perf.extend(partial.coll_perf); + batch.proxy_ops.extend(partial.proxy_ops); + batch.net_qp.extend(partial.net_qp); + } + batch + } + + fn counter_snapshot(&self, counters: &EventCounters) -> ProfilerCounterSnapshot { + let Some(first) = self.shards.first() else { + return ProfilerCounterSnapshot::default(); + }; + let mut snap = first.lock().counter_snapshot(counters); + for shard in self.shards.iter().skip(1) { + let p = shard.lock().counter_snapshot(counters); + snap.coll_live += p.coll_live; + snap.proxy_live += p.proxy_live; + snap.step_live += p.step_live; + snap.kch_live += p.kch_live; + snap.net_live += p.net_live; + snap.coll_cap += p.coll_cap; + snap.proxy_cap += p.proxy_cap; + snap.step_cap += p.step_cap; + snap.kch_cap += p.kch_cap; + snap.net_cap += p.net_cap; + } + snap + } +} + +fn shard_for_start(event: &ParsedEvent) -> usize { + match event { + ParsedEvent::Coll { ctx, .. } => shard_for_comm(ctx.comm_hash), + ParsedEvent::ProxyOp { + parent_obj, rank, .. + } => shard_for_handle(*parent_obj).unwrap_or_else(|| shard_for_comm(*rank as u64)), + ParsedEvent::ProxyStep { parent_obj, .. } | ParsedEvent::KernelCh { parent_obj, .. } => { + shard_for_handle(*parent_obj).unwrap_or(0) + } + ParsedEvent::NetPlugin { rank, .. } => shard_for_comm(*rank as u64), + ParsedEvent::Ignored => 0, + } } -pub struct PluginStateInner { +pub struct PluginState { + pools: ShardedPools, + writer: Mutex, pub counters: EventCounters, +} + +pub struct Pools { pub coll_pool: SlotPool, pub proxy_pool: SlotPool, pub step_pool: SlotPool, + pub kch_pool: SlotPool, pub net_pool: SlotPool, - pub writer: NcclWriter, +} + +impl Default for PluginState { + fn default() -> Self { + Self::new() + } } impl PluginState { pub fn new() -> Self { Self { - inner: Mutex::new(PluginStateInner { - counters: EventCounters::new(), - coll_pool: SlotPool::with_capacity(MAX_COLL_SLOTS), - proxy_pool: SlotPool::with_capacity(MAX_PROXY_OP_SLOTS), - step_pool: SlotPool::with_capacity(MAX_PROXY_STEP_SLOTS), - net_pool: SlotPool::with_capacity(MAX_NET_SLOTS), - writer: NcclWriter::new(), - }), + pools: ShardedPools::new(), + writer: Mutex::new(NcclWriter::new()), + counters: EventCounters::new(), } } - pub fn with_mut(&self, f: F) -> R - where - F: FnOnce(&mut PluginStateInner) -> R, - { - let mut guard = self.inner.lock(); - f(&mut guard) + /// v3 entry point: parse the v3 descriptor, then track. + pub fn start_event(&self, handle: *mut *mut c_void, descr: &NcclProfilerEventDescrV3) { + self.start_parsed(handle, parse_descr_v3(descr)); + } + + /// v4 entry point: parse the v4 descriptor with communicator metadata. + pub fn start_event_v4( + &self, + handle: *mut *mut c_void, + descr: &NcclProfilerEventDescrV4, + comm: CommInfo, + ) { + self.start_parsed(handle, parse_descr_v4(descr, comm)); + } + + pub fn start_parsed(&self, handle: *mut *mut c_void, event: ParsedEvent) { + self.pools.start_event(handle, event, &self.counters); + } + + pub fn stop_event(&self, handle: *mut c_void) { + let batch = self.pools.stop_event(handle, &self.counters); + self.flush(&batch); + } + + pub fn record_state( + &self, + handle: *mut c_void, + state: NcclProfilerEventState, + args: StateArgs, + ) { + self.pools.record_state(handle, state, args); + } + + pub fn snapshot_inflight(&self, min_age_ns: i64) -> usize { + let (rows, batch) = self.pools.try_collect_inflight(min_age_ns); + { + let mut writer = self.writer.lock(); + for row in &rows { + writer.append_inflight(row, &self.counters); + } + batch.write(&mut writer, &self.counters); + } + self.publish_profiler_counters(); + rows.len() + } + + pub fn finalize_flush(&self) { + let batch = self.pools.drain_all_pending(); + self.flush(&batch); + self.publish_profiler_counters(); + } + + /// Append a counter/pool-usage snapshot row to `nccl.profiler_counters`. + pub fn publish_profiler_counters(&self) { + let snapshot = self.pools.counter_snapshot(&self.counters); + self.writer + .lock() + .append_profiler_counters(&snapshot, &self.counters); + } + + fn flush(&self, batch: &FlushBatch) { + if batch.is_empty() { + return; + } + batch.write(&mut self.writer.lock(), &self.counters); } } @@ -66,92 +353,382 @@ fn cstr_opt(p: *const c_char) -> Option<&'static str> { unsafe { std::ffi::CStr::from_ptr(p) }.to_str().ok() } -fn read_coll_context(descr: &NcclProfilerEventDescrV3) -> CollContext { - let c = unsafe { descr.body.coll }; +#[inline] +fn passes_filter(bytes: u64) -> bool { + let min = *MIN_MSG_BYTES; + min == 0 || bytes >= min +} + +#[allow(clippy::too_many_arguments)] +fn build_coll_context( + rank: i32, + comm_hash: u64, + n_ranks: i32, + seq: u64, + func: Option<&str>, +) -> CollContext { let mut ctx = CollContext { - rank: descr.rank, - comm_hash: c.comm_hash, - seq: c.seq_number, - func: [0; crate::events::MAX_FUNC_NAME], - func_len: 0, + rank, + comm_hash, + n_ranks, + seq, + ..Default::default() }; - copy_func_name(&mut ctx, cstr_opt(c.func)); + copy_func_name(&mut ctx, func); ctx } -fn coll_context_fallback(descr: &NcclProfilerEventDescrV3) -> CollContext { +/// Parse a v3 descriptor (comm metadata lives in the coll/p2p body). +pub fn parse_descr_v3(descr: &NcclProfilerEventDescrV3) -> ParsedEvent { + let t = descr.type_ as i32; + match t { + x if x == NCCL_PROFILE_COLL => { + let c = unsafe { descr.body.coll }; + let dtype_name = cstr_opt(c.datatype); + ParsedEvent::Coll { + ctx: build_coll_context( + descr.rank, + c.comm_hash, + -1, + c.seq_number, + cstr_opt(c.func), + ), + meta: CollPerfMeta { + is_p2p: false, + peer: -1, + count: c.count as u64, + msg_bytes: c.count as u64 * dtype_bytes(dtype_name), + dtype: ShortName::from_str(dtype_name), + algo: ShortName::from_str(cstr_opt(c.algo)), + proto: ShortName::from_str(cstr_opt(c.proto)), + n_channels: c.n_max_channels as i32, + }, + } + } + x if x == NCCL_PROFILE_P2P => { + let p = unsafe { descr.body.p2p }; + let dtype_name = cstr_opt(p.datatype); + ParsedEvent::Coll { + // v3 P2P descriptor carries no sequence number + ctx: build_coll_context(descr.rank, p.comm_hash, -1, 0, cstr_opt(p.func)), + meta: CollPerfMeta { + is_p2p: true, + peer: p.peer, + count: p.count as u64, + msg_bytes: p.count as u64 * dtype_bytes(dtype_name), + dtype: ShortName::from_str(dtype_name), + algo: ShortName::default(), + proto: ShortName::default(), + n_channels: 0, + }, + } + } + x if x == NCCL_PROFILE_PROXY_OP => { + let p = unsafe { descr.body.proxy_op }; + ParsedEvent::ProxyOp { + parent_obj: descr.parent_obj, + rank: descr.rank, + channel_id: p.channel_id as i32, + peer: p.peer, + n_steps: p.n_steps, + is_send: p.is_send, + } + } + x if x == NCCL_PROFILE_PROXY_STEP => ParsedEvent::ProxyStep { + parent_obj: descr.parent_obj, + step: unsafe { descr.body.proxy_step.step }, + }, + x if x == NCCL_PROFILE_KERNEL_CH => ParsedEvent::KernelCh { + parent_obj: descr.parent_obj, + channel_id: unsafe { descr.body.kernel_ch.channel_id } as i32, + gpu_start_ptimer: 0, // v3 has no GPU timer + }, + x if x == NCCL_PROFILE_NET_PLUGIN => ParsedEvent::NetPlugin { + rank: descr.rank, + id: unsafe { descr.body.net_plugin.id }, + data: unsafe { descr.body.net_plugin.data }, + }, + _ => ParsedEvent::Ignored, + } +} + +/// Parse a v4 descriptor (comm metadata comes from the per-comm `init`). +pub fn parse_descr_v4(descr: &NcclProfilerEventDescrV4, comm: CommInfo) -> ParsedEvent { + let t = descr.type_ as i32; + match t { + x if x == NCCL_PROFILE_COLL => { + let c = unsafe { descr.body.coll }; + let dtype_name = cstr_opt(c.datatype); + ParsedEvent::Coll { + ctx: build_coll_context( + descr.rank, + comm.comm_hash, + comm.n_ranks, + c.seq_number, + cstr_opt(c.func), + ), + meta: CollPerfMeta { + is_p2p: false, + peer: -1, + count: c.count as u64, + msg_bytes: c.count as u64 * dtype_bytes(dtype_name), + dtype: ShortName::from_str(dtype_name), + algo: ShortName::from_str(cstr_opt(c.algo)), + proto: ShortName::from_str(cstr_opt(c.proto)), + n_channels: c.n_channels as i32, + }, + } + } + x if x == NCCL_PROFILE_P2P => { + let p = unsafe { descr.body.p2p }; + let dtype_name = cstr_opt(p.datatype); + ParsedEvent::Coll { + ctx: build_coll_context( + descr.rank, + comm.comm_hash, + comm.n_ranks, + 0, + cstr_opt(p.func), + ), + meta: CollPerfMeta { + is_p2p: true, + peer: p.peer, + count: p.count as u64, + msg_bytes: p.count as u64 * dtype_bytes(dtype_name), + dtype: ShortName::from_str(dtype_name), + algo: ShortName::default(), + proto: ShortName::default(), + n_channels: p.n_channels as i32, + }, + } + } + x if x == NCCL_PROFILE_PROXY_OP => { + let p = unsafe { descr.body.proxy_op }; + ParsedEvent::ProxyOp { + parent_obj: descr.parent_obj, + rank: descr.rank, + channel_id: p.channel_id as i32, + peer: p.peer, + n_steps: p.n_steps, + is_send: p.is_send, + } + } + x if x == NCCL_PROFILE_PROXY_STEP => ParsedEvent::ProxyStep { + parent_obj: descr.parent_obj, + step: unsafe { descr.body.proxy_step.step }, + }, + x if x == NCCL_PROFILE_KERNEL_CH => { + let k = unsafe { descr.body.kernel_ch }; + ParsedEvent::KernelCh { + parent_obj: descr.parent_obj, + channel_id: k.channel_id as i32, + gpu_start_ptimer: k.p_timer, + } + } + x if x == NCCL_PROFILE_NET_PLUGIN => ParsedEvent::NetPlugin { + rank: descr.rank, + id: unsafe { descr.body.net_plugin.id }, + data: unsafe { descr.body.net_plugin.data }, + }, + _ => ParsedEvent::Ignored, + } +} + +fn coll_context_fallback(rank: i32) -> CollContext { let mut ctx = CollContext { - rank: descr.rank, + rank, ..Default::default() }; copy_func_name(&mut ctx, None); ctx } -impl PluginStateInner { - pub fn start_event(&mut self, handle: *mut *mut c_void, descr: &NcclProfilerEventDescrV3) { - let t = descr.type_ as i32; - match t { - x if x == NCCL_PROFILE_COLL => { - self.counters.coll.fetch_add(1, Ordering::Relaxed); - let ctx = read_coll_context(descr); +impl Pools { + pub fn new(limits: PoolLimits) -> Self { + Self { + coll_pool: SlotPool::with_capacity(limits.coll), + proxy_pool: SlotPool::with_capacity(limits.proxy_op), + step_pool: SlotPool::with_capacity(limits.proxy_step), + kch_pool: SlotPool::with_capacity(limits.kernel_ch), + net_pool: SlotPool::with_capacity(limits.net), + } + } + + fn note_pool_exhausted( + &mut self, + pool_name: &str, + usage_pct: u8, + counters: &EventCounters, + parent_coll: u32, + ) { + counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); + warn_pool_exhausted(pool_name, usage_pct); + if parent_coll != INVALID_IDX { + if let Some(coll) = self.coll_pool.get_mut(parent_coll) { + coll.pool_events_dropped = coll.pool_events_dropped.saturating_add(1); + } + } + } + + fn counter_snapshot(&self, counters: &EventCounters) -> ProfilerCounterSnapshot { + ProfilerCounterSnapshot { + ts_ns: now_ns(), + rank: crate::role::training_rank(), + coll_events: counters.coll.load(Ordering::Relaxed), + p2p_events: counters.p2p.load(Ordering::Relaxed), + proxy_op_events: counters.proxy_op.load(Ordering::Relaxed), + proxy_step_events: counters.proxy_step.load(Ordering::Relaxed), + kernel_ch_events: counters.kernel_ch.load(Ordering::Relaxed), + net_events: counters.net_plugin.load(Ordering::Relaxed), + rows_written: counters.rows_written.load(Ordering::Relaxed), + pool_exhausted: counters.pool_exhausted.load(Ordering::Relaxed), + write_errors: counters.write_errors.load(Ordering::Relaxed), + filtered: counters.filtered.load(Ordering::Relaxed), + coll_live: self.coll_pool.live_count() as i32, + proxy_live: self.proxy_pool.live_count() as i32, + step_live: self.step_pool.live_count() as i32, + kch_live: self.kch_pool.live_count() as i32, + net_live: self.net_pool.live_count() as i32, + coll_cap: self.coll_pool.capacity() as i32, + proxy_cap: self.proxy_pool.capacity() as i32, + step_cap: self.step_pool.capacity() as i32, + kch_cap: self.kch_pool.capacity() as i32, + net_cap: self.net_pool.capacity() as i32, + ring_chunks_recycled: 0, + ring_rows_overwritten: 0, + } + } + + fn start_event( + &mut self, + handle: *mut *mut c_void, + event: ParsedEvent, + counters: &EventCounters, + shard: usize, + ) { + match event { + ParsedEvent::Coll { ctx, meta } => { + if meta.is_p2p { + counters.p2p.fetch_add(1, Ordering::Relaxed); + } else { + counters.coll.fetch_add(1, Ordering::Relaxed); + } let ts = now_ns(); - if let Some((ptr, _idx)) = self.coll_pool.alloc(|| CollSlot::new(ctx, ts)) { - unsafe { *handle = ptr as *mut c_void }; + if let Some((ptr, idx)) = self.coll_pool.alloc(|| CollSlot::new(ctx, meta, ts)) { + unsafe { + (*ptr).set_self_idx(pack_slot_id(shard, idx)); + *handle = ptr as *mut c_void; + } + check_pool_usage("coll", &self.coll_pool); } else { - self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); + check_pool_usage("coll", &self.coll_pool); + self.note_pool_exhausted( + "coll", + self.coll_pool.usage_pct(), + counters, + INVALID_IDX, + ); unsafe { *handle = std::ptr::null_mut() }; } } - x if x == NCCL_PROFILE_PROXY_OP => { - self.counters.proxy_op.fetch_add(1, Ordering::Relaxed); - let p = unsafe { descr.body.proxy_op }; - let channel = p.channel_id as usize; - let (coll, parent_coll) = if descr.parent_obj.is_null() { - (coll_context_fallback(descr), INVALID_IDX) - } else if let Some(coll_idx) = - self.coll_pool.index_of(descr.parent_obj as *mut CollSlot) - { - if let Some(coll_slot) = self.coll_pool.get_mut(coll_idx) { - (coll_slot.ctx, coll_idx) - } else { - (coll_context_fallback(descr), INVALID_IDX) - } - } else { - (coll_context_fallback(descr), INVALID_IDX) - }; + ParsedEvent::ProxyOp { + parent_obj, + rank, + channel_id, + peer, + n_steps, + is_send, + } => { + counters.proxy_op.fetch_add(1, Ordering::Relaxed); + let (coll, parent_coll) = self.resolve_parent_coll(parent_obj, rank); - if let Some((ptr, proxy_idx)) = self.proxy_pool.alloc(|| ProxyOpSlot { + if let Some((ptr, idx)) = self.proxy_pool.alloc(|| ProxyOpSlot { tag: EVT_PROXY_OP, + self_idx: INVALID_IDX, op: ProxyOpData { - channel_id: p.channel_id as i32, - peer: p.peer, - is_send: p.is_send, - n_steps: p.n_steps, + channel_id, + peer, + is_send, + n_steps, coll, start_ns: now_ns(), parent_coll, ..Default::default() }, }) { - if parent_coll != INVALID_IDX { - if let Some(coll_slot) = self.coll_pool.get_mut(parent_coll) { - coll_slot.register_proxy(channel, p.is_send, proxy_idx); - } + if let Some(coll_slot) = self.coll_pool.get_mut(parent_coll) { + coll_slot.live_children = coll_slot.live_children.saturating_add(1); + } + unsafe { + (*ptr).set_self_idx(pack_slot_id(shard, idx)); + *handle = ptr as *mut c_void; } - unsafe { *handle = ptr as *mut c_void }; + check_pool_usage("proxy_op", &self.proxy_pool); } else { - self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); + check_pool_usage("proxy_op", &self.proxy_pool); + self.note_pool_exhausted( + "proxy_op", + self.proxy_pool.usage_pct(), + counters, + parent_coll, + ); unsafe { *handle = std::ptr::null_mut() }; } } - x if x == NCCL_PROFILE_PROXY_STEP => { - self.counters.proxy_step.fetch_add(1, Ordering::Relaxed); - let parent_proxy = if descr.parent_obj.is_null() { + ParsedEvent::KernelCh { + parent_obj, + channel_id, + gpu_start_ptimer, + } => { + counters.kernel_ch.fetch_add(1, Ordering::Relaxed); + let parent_coll = if parent_obj.is_null() { INVALID_IDX } else { - self.proxy_pool - .index_of(descr.parent_obj as *mut ProxyOpSlot) + // SAFETY: parent_obj is a coll handle we returned to NCCL. + unsafe { self.coll_pool.index_of(parent_obj as *mut CollSlot) } + .unwrap_or(INVALID_IDX) + }; + if parent_coll == INVALID_IDX { + // Without a parent there is nothing to attribute the + // kernel window to; skip tracking. + unsafe { *handle = std::ptr::null_mut() }; + return; + } + if let Some((ptr, idx)) = self.kch_pool.alloc(|| KernelChSlot { + tag: EVT_KERNEL_CH, + self_idx: INVALID_IDX, + parent_coll, + channel_id, + start_ns: now_ns(), + gpu_start_ptimer, + gpu_stop_ptimer: 0, + }) { + if let Some(coll_slot) = self.coll_pool.get_mut(parent_coll) { + coll_slot.live_children = coll_slot.live_children.saturating_add(1); + } + unsafe { + (*ptr).set_self_idx(pack_slot_id(shard, idx)); + *handle = ptr as *mut c_void; + } + check_pool_usage("kernel_ch", &self.kch_pool); + } else { + check_pool_usage("kernel_ch", &self.kch_pool); + self.note_pool_exhausted( + "kernel_ch", + self.kch_pool.usage_pct(), + counters, + parent_coll, + ); + unsafe { *handle = std::ptr::null_mut() }; + } + } + ParsedEvent::ProxyStep { parent_obj, step } => { + counters.proxy_step.fetch_add(1, Ordering::Relaxed); + let parent_proxy = if parent_obj.is_null() { + INVALID_IDX + } else { + // SAFETY: parent_obj is a proxy-op handle we returned to NCCL. + unsafe { self.proxy_pool.index_of(parent_obj as *mut ProxyOpSlot) } .unwrap_or(INVALID_IDX) }; let is_send = if parent_proxy != INVALID_IDX { @@ -162,33 +739,42 @@ impl PluginStateInner { } else { 0 }; - let step_id = unsafe { descr.body.proxy_step.step }; - if let Some((ptr, _)) = self.step_pool.alloc(|| ProxyStepSlot { + if let Some((ptr, idx)) = self.step_pool.alloc(|| ProxyStepSlot { tag: EVT_PROXY_STEP, + self_idx: INVALID_IDX, parent_proxy, step: ProxyStepData { - step: step_id, + step, is_send, start_ns: now_ns(), ..Default::default() }, }) { - unsafe { *handle = ptr as *mut c_void }; + unsafe { + (*ptr).set_self_idx(pack_slot_id(shard, idx)); + *handle = ptr as *mut c_void; + } + check_pool_usage("proxy_step", &self.step_pool); } else { - self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); + check_pool_usage("proxy_step", &self.step_pool); + self.note_pool_exhausted( + "proxy_step", + self.step_pool.usage_pct(), + counters, + INVALID_IDX, + ); unsafe { *handle = std::ptr::null_mut() }; } } - x if x == NCCL_PROFILE_NET_PLUGIN => { - self.counters.net_plugin.fetch_add(1, Ordering::Relaxed); - let id = unsafe { descr.body.net_plugin.id }; + ParsedEvent::NetPlugin { rank, id, data } => { + counters.net_plugin.fetch_add(1, Ordering::Relaxed); let mut device = 0i32; let mut qp_num = 0i32; let mut wr_id = 0u64; let mut opcode = 0i32; let mut length = 0u64; if net_plugin_type(id) == NCCL_PROFILER_NET_TYPE_IB { - if let Some(qp) = unsafe { read_ib_qp(descr.body.net_plugin.data) } { + if let Some(qp) = unsafe { read_ib_qp(data) } { device = qp.device; qp_num = qp.qp_num; wr_id = qp.wr_id; @@ -196,10 +782,11 @@ impl PluginStateInner { length = qp.length as u64; } } - if let Some((ptr, _)) = self.net_pool.alloc(|| NetPluginSlot { + if let Some((ptr, idx)) = self.net_pool.alloc(|| NetPluginSlot { tag: EVT_NET_PLUGIN, + self_idx: INVALID_IDX, start_ns: now_ns(), - rank: descr.rank, + rank, device, qp_num, wr_id, @@ -207,109 +794,138 @@ impl PluginStateInner { length, stop_ns: 0, }) { - unsafe { *handle = ptr as *mut c_void }; + unsafe { + (*ptr).set_self_idx(pack_slot_id(shard, idx)); + *handle = ptr as *mut c_void; + } + check_pool_usage("net", &self.net_pool); } else { - self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); + check_pool_usage("net", &self.net_pool); + self.note_pool_exhausted( + "net", + self.net_pool.usage_pct(), + counters, + INVALID_IDX, + ); unsafe { *handle = std::ptr::null_mut() }; } } - _ => unsafe { *handle = std::ptr::null_mut() }, + ParsedEvent::Ignored => unsafe { *handle = std::ptr::null_mut() }, + } + } + + fn resolve_parent_coll(&mut self, parent_obj: *mut c_void, rank: i32) -> (CollContext, u32) { + if parent_obj.is_null() { + return (coll_context_fallback(rank), INVALID_IDX); + } + // SAFETY: parent_obj is a coll handle we returned to NCCL. + let resolved = unsafe { self.coll_pool.index_of(parent_obj as *mut CollSlot) }; + if let Some(coll_idx) = resolved { + if let Some(coll_slot) = self.coll_pool.get_mut(coll_idx) { + return (coll_slot.ctx, coll_idx); + } } + (coll_context_fallback(rank), INVALID_IDX) } - pub fn stop_event(&mut self, handle: *mut c_void) { + fn stop_event(&mut self, handle: *mut c_void, counters: &EventCounters) -> FlushBatch { + let mut batch = FlushBatch::default(); if handle.is_null() { - return; + return batch; } match unsafe { event_type(handle) } { EVT_PROXY_STEP => { - let step_idx = self - .step_pool - .index_of(handle as *mut ProxyStepSlot) - .unwrap_or(INVALID_IDX); - if step_idx == INVALID_IDX { - return; - } + // SAFETY: handle tag was checked; it is a slot we handed to NCCL. + let Some(step_idx) = + (unsafe { self.step_pool.index_of(handle as *mut ProxyStepSlot) }) + else { + return batch; + }; let (parent_proxy, step) = { let Some(slot) = self.step_pool.get_mut(step_idx) else { - return; + return batch; }; slot.step.stop_ns = now_ns(); (slot.parent_proxy, slot.step) }; if parent_proxy != INVALID_IDX { if let Some(proxy) = self.proxy_pool.get_mut(parent_proxy) { - if !proxy.op.push_step(step) { - self.counters.pool_exhausted.fetch_add(1, Ordering::Relaxed); - } + proxy.op.push_step(step); } } self.step_pool.free_idx(step_idx); } EVT_PROXY_OP => { - let proxy_idx = self - .proxy_pool - .index_of(handle as *mut ProxyOpSlot) - .unwrap_or(INVALID_IDX); - if proxy_idx == INVALID_IDX { - return; - } - let (parent_coll, row) = { + // SAFETY: handle tag was checked; it is a slot we handed to NCCL. + let Some(proxy_idx) = + (unsafe { self.proxy_pool.index_of(handle as *mut ProxyOpSlot) }) + else { + return batch; + }; + let (parent_coll, start_ns, stop_ns, row) = { let Some(slot) = self.proxy_pool.get_mut(proxy_idx) else { - return; + return batch; }; slot.op.stop_ns = now_ns(); let parent = slot.op.parent_coll; + let (start, stop) = (slot.op.start_ns, slot.op.stop_ns); let row = std::mem::take(&mut slot.op).into_completed(); - (parent, row) + (parent, start, stop, row) }; - self.flush_proxy_row(parent_coll, row); - if parent_coll != INVALID_IDX { - if let Some(coll) = self.coll_pool.get_mut(parent_coll) { - let ch = row.channel_id as usize; - if row.is_send != 0 { - if ch < MAX_CHANNELS { - coll.send_ref[ch] = INVALID_IDX; - } - } else if ch < MAX_CHANNELS { - coll.recv_ref[ch] = INVALID_IDX; - } - } - } + self.flush_proxy_row(parent_coll, row, counters, &mut batch); + self.child_stopped(parent_coll, |coll| coll.observe_proxy(start_ns, stop_ns)); + self.maybe_complete_coll(parent_coll, counters, &mut batch); self.proxy_pool.free_idx(proxy_idx); } - EVT_COLL => { - let coll_idx = self - .coll_pool - .index_of(handle as *mut CollSlot) - .unwrap_or(INVALID_IDX); - if coll_idx == INVALID_IDX { - return; - } - let pending: Vec = { - let Some(slot) = self.coll_pool.get_mut(coll_idx) else { - return; + EVT_KERNEL_CH => { + // SAFETY: handle tag was checked; it is a slot we handed to NCCL. + let Some(kch_idx) = + (unsafe { self.kch_pool.index_of(handle as *mut KernelChSlot) }) + else { + return batch; + }; + let (parent_coll, start_ns, gpu_start, gpu_stop) = { + let Some(slot) = self.kch_pool.get_mut(kch_idx) else { + return batch; }; - slot.stop_ns = now_ns(); - slot.pending[..slot.pending_len as usize].to_vec() + ( + slot.parent_coll, + slot.start_ns, + slot.gpu_start_ptimer, + slot.gpu_stop_ptimer, + ) }; - self.writer.flush_proxy_ops(&pending, &self.counters); - self.coll_pool.free_idx(coll_idx); + let stop_ns = now_ns(); + self.child_stopped(parent_coll, |coll| { + coll.observe_kch(start_ns, stop_ns); + // v4: also fold the GPU-globaltimer window when reported. + coll.observe_kch_gpu(gpu_start, gpu_stop); + }); + self.maybe_complete_coll(parent_coll, counters, &mut batch); + self.kch_pool.free_idx(kch_idx); } - EVT_NET_PLUGIN => { - let net_idx = self - .net_pool - .index_of(handle as *mut NetPluginSlot) - .unwrap_or(INVALID_IDX); - if net_idx == INVALID_IDX { - return; + EVT_COLL => { + // SAFETY: handle tag was checked; it is a slot we handed to NCCL. + let Some(coll_idx) = (unsafe { self.coll_pool.index_of(handle as *mut CollSlot) }) + else { + return batch; + }; + if let Some(slot) = self.coll_pool.get_mut(coll_idx) { + slot.enqueue_stop_ns = now_ns(); + slot.stopped = true; } - let row = { - let Some(slot) = self.net_pool.get_mut(net_idx) else { - return; - }; + self.maybe_complete_coll(coll_idx, counters, &mut batch); + } + EVT_NET_PLUGIN => { + // SAFETY: handle tag was checked; it is a slot we handed to NCCL. + let Some(net_idx) = + (unsafe { self.net_pool.index_of(handle as *mut NetPluginSlot) }) + else { + return batch; + }; + if let Some(slot) = self.net_pool.get_mut(net_idx) { slot.stop_ns = now_ns(); - CompletedNetQp { + batch.net_qp.push(CompletedNetQp { ts_ns: slot.stop_ns, rank: slot.rank, device: slot.device, @@ -318,40 +934,96 @@ impl PluginStateInner { opcode: slot.opcode, length: slot.length, duration_ns: slot.stop_ns.saturating_sub(slot.start_ns), - } - }; - self.writer.append_net_qp(&row, &self.counters); + }); + } self.net_pool.free_idx(net_idx); } _ => {} } + batch + } + + /// Fold a finished child event into its parent coll and drop the refcount. + fn child_stopped(&mut self, parent_coll: u32, observe: impl FnOnce(&mut CollSlot)) { + if parent_coll == INVALID_IDX { + return; + } + if let Some(coll) = self.coll_pool.get_mut(parent_coll) { + observe(coll); + coll.live_children = coll.live_children.saturating_sub(1); + } } - fn flush_proxy_row(&mut self, parent_coll: u32, row: CompletedProxyOp) { + /// Emit the coll_perf row and free the slot once enqueue is stopped and + /// all child events have finished (NCCL refcount completion). + fn maybe_complete_coll( + &mut self, + coll_idx: u32, + counters: &EventCounters, + batch: &mut FlushBatch, + ) { + if coll_idx == INVALID_IDX { + return; + } + let Some(slot) = self.coll_pool.get_mut(coll_idx) else { + return; + }; + if !slot.is_complete() { + return; + } + let perf_row = slot.coll_perf_row(); + let pending = &slot.pending[..slot.pending_len as usize]; + if passes_filter(perf_row.msg_size_bytes) { + batch.coll_perf.push(perf_row); + batch.proxy_ops.extend_from_slice(pending); + } else { + counters + .filtered + .fetch_add(1 + pending.len() as u64, Ordering::Relaxed); + } + self.coll_pool.free_idx(coll_idx); + } + + fn flush_proxy_row( + &mut self, + parent_coll: u32, + row: CompletedProxyOp, + counters: &EventCounters, + batch: &mut FlushBatch, + ) { if parent_coll != INVALID_IDX { if let Some(coll) = self.coll_pool.get_mut(parent_coll) { + let coll_bytes = coll.meta.msg_bytes; + if !passes_filter(coll_bytes) { + counters.filtered.fetch_add(1, Ordering::Relaxed); + return; + } if coll.push_pending(row) { return; } // pending full — flush coll batch early - let pending: Vec = - coll.pending[..coll.pending_len as usize].to_vec(); + batch + .proxy_ops + .extend_from_slice(&coll.pending[..coll.pending_len as usize]); coll.pending_len = 0; - self.writer.flush_proxy_ops(&pending, &self.counters); if !coll.push_pending(row) { - self.writer.append_proxy_op(&row, &self.counters); + batch.proxy_ops.push(row); } return; } } - self.writer.append_proxy_op(&row, &self.counters); + if !passes_filter(row.trans_bytes) { + counters.filtered.fetch_add(1, Ordering::Relaxed); + return; + } + batch.proxy_ops.push(row); } - pub fn record_state( + fn record_state( &mut self, handle: *mut c_void, - state: NcclProfilerEventStateV3, - args: *const NcclProfilerEventStateArgsV3, + state: NcclProfilerEventState, + args: StateArgs, ) { if handle.is_null() { return; @@ -359,56 +1031,323 @@ impl PluginStateInner { let ts = now_ns(); match unsafe { event_type(handle) } { EVT_PROXY_STEP => { - let step_idx = self - .step_pool - .index_of(handle as *mut ProxyStepSlot) - .unwrap_or(INVALID_IDX); - if step_idx == INVALID_IDX { + // SAFETY: handle tag was checked; it is a slot we handed to NCCL. + let Some(step_idx) = + (unsafe { self.step_pool.index_of(handle as *mut ProxyStepSlot) }) + else { return; - } + }; let Some(slot) = self.step_pool.get_mut(step_idx) else { return; }; if let Some(idx) = proxy_step_state_index(state) { - slot.step.state_ts[idx] = ts; + // First entry wins: NCCL re-reports some states on every + // progress-loop retry (e.g. SendPeerWait while waiting + // for receiver credits); overwriting would collapse the + // dwell time to the last retry interval. + if slot.step.state_ts[idx] == 0 { + slot.step.state_ts[idx] = ts; + } + } + if let StateArgs::ProxyStepV4 { trans_size } = args { + // Only sent for SendWait / RecvFlushWait, where the value + // is authoritative for this step (see plugin.rs). + slot.step.trans_bytes = trans_size; } } EVT_PROXY_OP => { - let proxy_idx = self - .proxy_pool - .index_of(handle as *mut ProxyOpSlot) - .unwrap_or(INVALID_IDX); - if proxy_idx == INVALID_IDX { + // SAFETY: handle tag was checked; it is a slot we handed to NCCL. + let Some(proxy_idx) = + (unsafe { self.proxy_pool.index_of(handle as *mut ProxyOpSlot) }) + else { return; - } + }; let Some(slot) = self.proxy_pool.get_mut(proxy_idx) else { return; }; - if !args.is_null() { - unsafe { - let a = &*args; - slot.op.trans_bytes = a.proxy_op.trans_size as u64; - if a.proxy_op.steps > 0 { - slot.op.n_steps = a.proxy_op.steps; - } + if let StateArgs::ProxyOpV3 { trans_size, steps } = args { + // Modern NCCL reports some proxy-op states (InProgress) + // with zeroed args — never clobber a good value with 0, + // and the v3 counter is cumulative, so keep the max. + if trans_size > 0 { + slot.op.trans_bytes = slot.op.trans_bytes.max(trans_size); } + if steps > 0 { + slot.op.n_steps = steps; + } + } + } + EVT_KERNEL_CH => { + // v4 `KernelChStop`: GPU globaltimer stop timestamp. + let Some(kch_idx) = + (unsafe { self.kch_pool.index_of(handle as *mut KernelChSlot) }) + else { + return; + }; + let Some(slot) = self.kch_pool.get_mut(kch_idx) else { + return; + }; + if let StateArgs::KernelChStop { p_timer } = args { + slot.gpu_stop_ptimer = p_timer; } } _ => {} } } - pub fn finalize_flush(&mut self) { - for idx in 0..MAX_COLL_SLOTS as u32 { + /// Collect one `nccl.inflight_ops` row per live op older than `min_age_ns`. + /// + /// A hung collective never reaches completion, so it would otherwise be + /// invisible in `nccl.proxy_ops` / `nccl.coll_perf`. Called periodically + /// from the watchdog thread (see `plugin::spawn_inflight_watchdog`). + fn collect_inflight(&mut self, min_age_ns: i64) -> (Vec, FlushBatch) { + let now = now_ns(); + let mut rows: Vec = Vec::new(); + + self.coll_pool.for_each_live(|_, slot| { + let age = now - slot.start_ns; + if age >= min_age_ns { + rows.push(InflightOp { + ts_ns: now, + rank: slot.ctx.rank, + comm_hash: slot.ctx.comm_hash, + coll_func: slot.ctx.func, + coll_func_len: slot.ctx.func_len, + seq: slot.ctx.seq, + kind: if slot.meta.is_p2p { "p2p" } else { "coll" }, + channel_id: -1, + peer: slot.meta.peer, + is_send: -1, + start_ns: slot.start_ns, + age_ns: age, + }); + } + }); + self.proxy_pool.for_each_live(|_, slot| { + let age = now - slot.op.start_ns; + if age >= min_age_ns { + rows.push(InflightOp { + ts_ns: now, + rank: slot.op.coll.rank, + comm_hash: slot.op.coll.comm_hash, + coll_func: slot.op.coll.func, + coll_func_len: slot.op.coll.func_len, + seq: slot.op.coll.seq, + kind: "proxy_op", + channel_id: slot.op.channel_id, + peer: slot.op.peer, + is_send: slot.op.is_send, + start_ns: slot.op.start_ns, + age_ns: age, + }); + } + }); + // Drain completed proxy rows still buffered under over-age colls. + let mut batch = FlushBatch::default(); + for idx in 0..self.coll_pool.capacity() as u32 { + if let Some(coll) = self.coll_pool.get_mut(idx) { + if coll.pending_len == 0 || now - coll.start_ns < min_age_ns { + continue; + } + batch + .proxy_ops + .extend_from_slice(&coll.pending[..coll.pending_len as usize]); + coll.pending_len = 0; + } + } + (rows, batch) + } + + /// Drain buffered proxy rows of still-live colls (finalize path). + fn drain_pending(&mut self) -> FlushBatch { + let mut batch = FlushBatch::default(); + for idx in 0..self.coll_pool.capacity() as u32 { if let Some(coll) = self.coll_pool.get_mut(idx) { if coll.pending_len == 0 { continue; } - let pending: Vec = - coll.pending[..coll.pending_len as usize].to_vec(); - self.writer.flush_proxy_ops(&pending, &self.counters); + batch + .proxy_ops + .extend_from_slice(&coll.pending[..coll.pending_len as usize]); coll.pending_len = 0; } } + batch + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::abi::profiler_v4::{ + NcclProfilerCollDescrV4, NcclProfilerKernelChDescrV4, NcclProfilerP2pDescrV4, + }; + use crate::abi::NcclProfilerEventBodyV4; + + const COMM: CommInfo = CommInfo { + comm_hash: 0xFEED, + n_ranks: 8, + }; + + #[test] + fn parse_v4_coll_uses_comm_metadata() { + let descr = NcclProfilerEventDescrV4 { + type_: NCCL_PROFILE_COLL as u8, + parent_obj: std::ptr::null_mut(), + rank: 5, + body: NcclProfilerEventBodyV4 { + coll: { + let mut c: NcclProfilerCollDescrV4 = unsafe { std::mem::zeroed() }; + c.seq_number = 3; + c.func = c"AllGather".as_ptr(); + c.count = 1024; + c.datatype = c"ncclFloat16".as_ptr(); + c.n_channels = 2; + c + }, + }, + }; + let ParsedEvent::Coll { ctx, meta } = parse_descr_v4(&descr, COMM) else { + panic!("expected Coll"); + }; + // v4 descriptors carry no comm hash — it must come from init metadata. + assert_eq!(ctx.comm_hash, 0xFEED); + assert_eq!(ctx.n_ranks, 8); + assert_eq!(ctx.rank, 5); + assert_eq!(ctx.seq, 3); + assert_eq!(meta.msg_bytes, 1024 * 2); + assert_eq!(meta.n_channels, 2); + assert!(!meta.is_p2p); + } + + #[test] + fn parse_v4_p2p_has_channels() { + let descr = NcclProfilerEventDescrV4 { + type_: NCCL_PROFILE_P2P as u8, + parent_obj: std::ptr::null_mut(), + rank: 1, + body: NcclProfilerEventBodyV4 { + p2p: { + let mut p: NcclProfilerP2pDescrV4 = unsafe { std::mem::zeroed() }; + p.func = c"Send".as_ptr(); + p.count = 64; + p.datatype = c"ncclInt64".as_ptr(); + p.peer = 7; + p.n_channels = 3; + p + }, + }, + }; + let ParsedEvent::Coll { ctx, meta } = parse_descr_v4(&descr, COMM) else { + panic!("expected Coll(p2p)"); + }; + assert!(meta.is_p2p); + assert_eq!(meta.peer, 7); + assert_eq!(meta.n_channels, 3); // v4 exposes p2p channels (v3: 0) + assert_eq!(ctx.comm_hash, 0xFEED); + } + + #[test] + fn parse_v4_kernel_ch_carries_gpu_ptimer() { + let descr = NcclProfilerEventDescrV4 { + type_: NCCL_PROFILE_KERNEL_CH as u8, + parent_obj: std::ptr::null_mut(), + rank: 0, + body: NcclProfilerEventBodyV4 { + kernel_ch: NcclProfilerKernelChDescrV4 { + channel_id: 4, + p_timer: 123_456, + }, + }, + }; + let ParsedEvent::KernelCh { + channel_id, + gpu_start_ptimer, + .. + } = parse_descr_v4(&descr, COMM) + else { + panic!("expected KernelCh"); + }; + assert_eq!(channel_id, 4); + assert_eq!(gpu_start_ptimer, 123_456); + } + + #[test] + fn proxy_step_state_ts_first_entry_wins() { + use crate::abi::STATE_PROXY_STEP_SEND_PEER_WAIT_V4; + use crate::events::{ProxyStepSlot, IDX_SEND_PEER_WAIT}; + + let counters = EventCounters::new(); + let mut pools = Pools::new(PoolLimits { + coll: 4, + proxy_op: 4, + proxy_step: 4, + kernel_ch: 4, + net: 4, + }); + let mut op_h: *mut c_void = std::ptr::null_mut(); + pools.start_event( + &mut op_h, + ParsedEvent::ProxyOp { + parent_obj: std::ptr::null_mut(), + rank: 0, + channel_id: 0, + peer: 1, + n_steps: 1, + is_send: 1, + }, + &counters, + 0, + ); + let mut st_h: *mut c_void = std::ptr::null_mut(); + pools.start_event( + &mut st_h, + ParsedEvent::ProxyStep { + parent_obj: op_h, + step: 0, + }, + &counters, + 0, + ); + let read_ts = |pools: &mut Pools| { + let idx = unsafe { pools.step_pool.index_of(st_h as *mut ProxyStepSlot) }.unwrap(); + pools.step_pool.get_mut(idx).unwrap().step.state_ts[IDX_SEND_PEER_WAIT] + }; + + pools.record_state(st_h, STATE_PROXY_STEP_SEND_PEER_WAIT_V4, StateArgs::None); + let first = read_ts(&mut pools); + assert!(first > 0); + std::thread::sleep(std::time::Duration::from_millis(2)); + pools.record_state(st_h, STATE_PROXY_STEP_SEND_PEER_WAIT_V4, StateArgs::None); + assert_eq!(read_ts(&mut pools), first); + } + + #[test] + fn sharded_pools_default_one_shard_in_tests() { + assert_eq!(pool_shard_count(), 1); + let _pools = ShardedPools::new(); + } + + #[test] + fn parse_v3_coll_has_no_comm_size() { + let descr = NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_COLL as u8, + parent_obj: std::ptr::null_mut(), + rank: 2, + body: crate::abi::NcclProfilerEventBodyV3 { + coll: { + let mut c: crate::abi::NcclProfilerCollDescr = unsafe { std::mem::zeroed() }; + c.comm_hash = 42; + c.seq_number = 1; + c.func = c"AllReduce".as_ptr(); + c + }, + }, + }; + let ParsedEvent::Coll { ctx, .. } = parse_descr_v3(&descr) else { + panic!("expected Coll"); + }; + assert_eq!(ctx.comm_hash, 42); + assert_eq!(ctx.n_ranks, -1, "v3 cannot know the communicator size"); } } diff --git a/probing/extensions/nccl-profiler/src/tables.rs b/probing/extensions/nccl-profiler/src/tables.rs index 37feec5a..2728d731 100644 --- a/probing/extensions/nccl-profiler/src/tables.rs +++ b/probing/extensions/nccl-profiler/src/tables.rs @@ -1,21 +1,27 @@ -//! Memtable schemas for `nccl.proxy_ops` and `nccl.net_qp`. +//! Memtable schemas for `nccl.proxy_ops`, `nccl.coll_perf`, `nccl.inflight_ops` and `nccl.net_qp`. use probing_memtable::docs; use probing_memtable::{DType, Schema}; pub const PROXY_OPS_FILE: &str = "nccl.proxy_ops"; +pub const COLL_PERF_FILE: &str = "nccl.coll_perf"; +pub const INFLIGHT_OPS_FILE: &str = "nccl.inflight_ops"; pub const NET_QP_FILE: &str = "nccl.net_qp"; +pub const PROFILER_COUNTERS_FILE: &str = "nccl.profiler_counters"; /// Register all NCCL table docs (safe to call from writer or Engine startup). pub fn register_docs() { docs::register_from_name(PROXY_OPS_FILE, &proxy_ops_schema()); + docs::register_from_name(COLL_PERF_FILE, &coll_perf_schema()); + docs::register_from_name(INFLIGHT_OPS_FILE, &inflight_ops_schema()); docs::register_from_name(NET_QP_FILE, &net_qp_schema()); + docs::register_from_name(PROFILER_COUNTERS_FILE, &profiler_counters_schema()); } pub fn proxy_ops_schema() -> Schema { Schema::new() .table_doc("NCCL profiler plugin proxy-op wait 分解(culprit / victim 归因)") - .col_doc("ts", DType::I64, "事件时间戳(纳秒)") + .col_doc("ts", DType::I64, "事件时间戳(UNIX epoch 纳秒)") .col_doc("rank", DType::I32, "torch.distributed rank") .col_doc("tp_rank", DType::I32, "张量并行 rank(未知 -1)") .col_doc("pp_rank", DType::I32, "流水线并行 rank(未知 -1)") @@ -31,21 +37,99 @@ pub fn proxy_ops_schema() -> Schema { .col_doc("peer", DType::I32, "对端 rank") .col_doc("is_send", DType::I32, "1=send proxy,0=recv proxy") .col_doc("n_steps", DType::I32, "聚合的 ProxyStep 数") - .col_doc("trans_bytes", DType::U64, "传输字节数") + .col_doc("trans_bytes", DType::U64, "传输字节数(v4 按 step 累计)") .col_doc( "send_gpu_wait_ns", DType::I64, "Culprit 信号 — 本地 GPU 未就绪发送", ) + .col_doc( + "send_peer_wait_ns", + DType::I64, + "等待接收端 clear-to-send credits(仅 v4 ABI;v3 为 0)", + ) .col_doc("send_wait_ns", DType::I64, "发送侧网络等待") .col_doc("recv_wait_ns", DType::I64, "Victim 信号 — 等待对端数据") .col_doc("recv_flush_wait_ns", DType::I64, "接收 flush 等待") } +pub fn coll_perf_schema() -> Schema { + Schema::new() + .table_doc( + "NCCL collective / P2P 级性能(timing_source 标注计时来源;busbw 需按通信组大小在 SQL 中换算)", + ) + .col_doc("ts", DType::I64, "op 完成时间戳(UNIX epoch 纳秒)") + .col_doc("rank", DType::I32, "torch.distributed rank") + .col_doc("tp_rank", DType::I32, "张量并行 rank(未知 -1)") + .col_doc("pp_rank", DType::I32, "流水线并行 rank(未知 -1)") + .col_doc("dp_rank", DType::I32, "数据并行 rank(未知 -1)") + .col_doc("comm_hash", DType::U64, "NCCL communicator hash") + .col_doc( + "n_ranks", + DType::I32, + "通信组大小(v4 init 提供;v3 为 -1)— busbw 换算用", + ) + .col_doc( + "coll_func", + DType::Str, + "操作名(AllReduce、AllGather、Send、Recv…)", + ) + .col_doc("seq", DType::U64, "collective 序号(P2P 为 0)") + .col_doc("is_p2p", DType::I32, "1=P2P(Send/Recv),0=collective") + .col_doc("peer", DType::I32, "P2P 对端 rank(collective 为 -1)") + .col_doc("count", DType::U64, "元素个数") + .col_doc("msg_size_bytes", DType::U64, "消息大小 = count × dtype 字节数") + .col_doc("dtype", DType::Str, "NCCL 数据类型名") + .col_doc("algo", DType::Str, "NCCL 算法(Ring、Tree…;P2P 为空)") + .col_doc("proto", DType::Str, "NCCL 协议(LL、LL128、Simple…)") + .col_doc("n_channels", DType::I32, "最大 channel 数") + .col_doc( + "exec_time_ns", + DType::I64, + "实际执行耗时(纳秒);由 timing_source 对应的事件窗口重建", + ) + .col_doc( + "enqueue_time_ns", + DType::I64, + "host 侧 enqueue 耗时(纳秒;NCCL coll stopEvent 语义)", + ) + .col_doc( + "timing_source", + DType::Str, + "exec_time 来源:kernel_gpu(GPU globaltimer,v4)> kernel_ch(host 观测内核窗口)> proxy > enqueue(回退)", + ) + .col_doc( + "algobw_gbps", + DType::F64, + "算法带宽 msg_size/exec_time(GB/s);busbw 需乘集合通信系数", + ) + .col_doc( + "pool_events_dropped", + DType::I32, + "因子事件 slot pool 耗尽而丢失的子事件数(>0 表示 exec_time 可能不可信)", + ) +} + +pub fn inflight_ops_schema() -> Schema { + Schema::new() + .table_doc("在途(已 start 未 stop)NCCL 操作周期快照 — hang 诊断信号") + .col_doc("ts", DType::I64, "快照时间戳(UNIX epoch 纳秒)") + .col_doc("rank", DType::I32, "torch.distributed rank") + .col_doc("comm_hash", DType::U64, "NCCL communicator hash") + .col_doc("coll_func", DType::Str, "操作名(未知为 unknown)") + .col_doc("seq", DType::U64, "collective 序号") + .col_doc("kind", DType::Str, "coll / p2p / proxy_op") + .col_doc("channel_id", DType::I32, "NCCL channel(proxy_op 有效)") + .col_doc("peer", DType::I32, "对端 rank(未知 -1)") + .col_doc("is_send", DType::I32, "1=send,0=recv(proxy_op 有效)") + .col_doc("start_ns", DType::I64, "op 开始时间戳(epoch 纳秒)") + .col_doc("age_ns", DType::I64, "快照时刻已持续时长(纳秒)") +} + pub fn net_qp_schema() -> Schema { Schema::new() .table_doc("NCCL NetPlugin IB QP 完成耗时(可选 mask bit 128)") - .col_doc("ts", DType::I64, "事件时间戳(纳秒)") + .col_doc("ts", DType::I64, "事件时间戳(UNIX epoch 纳秒)") .col_doc("rank", DType::I32, "torch.distributed rank") .col_doc("device", DType::I32, "IB 设备索引") .col_doc("qp_num", DType::I32, "Queue Pair 号") @@ -55,6 +139,55 @@ pub fn net_qp_schema() -> Schema { .col_doc("duration_ns", DType::I64, "QP 完成耗时(纳秒)") } +pub fn profiler_counters_schema() -> Schema { + Schema::new() + .table_doc("NCCL profiler 插件运行时计数与 pool 使用率(诊断数据完整性)") + .col_doc("ts", DType::I64, "快照时间戳(UNIX epoch 纳秒)") + .col_doc("rank", DType::I32, "torch.distributed rank(未知 -1)") + .col_doc("coll_events", DType::U64, "累计 coll start 事件数") + .col_doc("p2p_events", DType::U64, "累计 P2P start 事件数") + .col_doc("proxy_op_events", DType::U64, "累计 proxy-op start 事件数") + .col_doc( + "proxy_step_events", + DType::U64, + "累计 proxy-step start 事件数", + ) + .col_doc( + "kernel_ch_events", + DType::U64, + "累计 kernel-ch start 事件数", + ) + .col_doc("net_events", DType::U64, "累计 net-plugin start 事件数") + .col_doc("rows_written", DType::U64, "累计写入 memtable 行数") + .col_doc("pool_exhausted", DType::U64, "累计 slot pool 分配失败次数") + .col_doc("write_errors", DType::U64, "累计 memtable 写入失败次数") + .col_doc( + "filtered", + DType::U64, + "累计被 PROBING_NCCL_MIN_MSG_BYTES 过滤的事件数", + ) + .col_doc("coll_live", DType::I32, "当前 live coll slot 数") + .col_doc("proxy_live", DType::I32, "当前 live proxy-op slot 数") + .col_doc("step_live", DType::I32, "当前 live proxy-step slot 数") + .col_doc("kch_live", DType::I32, "当前 live kernel-ch slot 数") + .col_doc("net_live", DType::I32, "当前 live net slot 数") + .col_doc("coll_cap", DType::I32, "coll slot pool 容量") + .col_doc("proxy_cap", DType::I32, "proxy-op slot pool 容量") + .col_doc("step_cap", DType::I32, "proxy-step slot pool 容量") + .col_doc("kch_cap", DType::I32, "kernel-ch slot pool 容量") + .col_doc("net_cap", DType::I32, "net slot pool 容量") + .col_doc( + "ring_chunks_recycled", + DType::U64, + "memtable 环缓冲累计回收 chunk 数(所有 nccl.* 表之和)", + ) + .col_doc( + "ring_rows_overwritten", + DType::U64, + "memtable 环缓冲累计覆写行数(所有 nccl.* 表之和)", + ) +} + #[cfg(test)] mod tests { use super::*; @@ -63,19 +196,57 @@ mod tests { fn register_docs_populates_registry() { register_docs(); let rows = docs::snapshot(); - assert!(rows - .iter() - .any(|r| r.table_schema == "nccl" && r.table_name == "proxy_ops")); - assert!(rows - .iter() - .any(|r| r.table_schema == "nccl" && r.table_name == "net_qp")); + for table in [ + "proxy_ops", + "coll_perf", + "inflight_ops", + "net_qp", + "profiler_counters", + ] { + assert!( + rows.iter() + .any(|r| r.table_schema == "nccl" && r.table_name == table), + "missing docs for nccl.{table}" + ); + } + } + + #[test] + fn coll_perf_columns_documented() { + let schema = coll_perf_schema(); + for name in [ + "msg_size_bytes", + "exec_time_ns", + "enqueue_time_ns", + "timing_source", + "algobw_gbps", + "is_p2p", + "n_ranks", + "pool_events_dropped", + ] { + assert!( + schema.cols.iter().any(|c| c.name == name), + "missing column {name}" + ); + } + } + + #[test] + fn inflight_ops_columns_documented() { + let schema = inflight_ops_schema(); + for name in ["kind", "age_ns", "start_ns"] { + assert!( + schema.cols.iter().any(|c| c.name == name), + "missing column {name}" + ); + } } #[test] fn proxy_ops_culprit_columns_documented() { let schema = proxy_ops_schema(); assert!(schema.table_doc.is_some()); - for name in ["send_gpu_wait_ns", "recv_wait_ns"] { + for name in ["send_gpu_wait_ns", "send_peer_wait_ns", "recv_wait_ns"] { let col = schema .cols .iter() diff --git a/probing/extensions/nccl-profiler/src/writer.rs b/probing/extensions/nccl-profiler/src/writer.rs index 25397169..4ade66d0 100644 --- a/probing/extensions/nccl-profiler/src/writer.rs +++ b/probing/extensions/nccl-profiler/src/writer.rs @@ -5,11 +5,15 @@ use std::sync::atomic::{AtomicBool, Ordering}; use probing_memtable::discover::ExposedTable; use probing_memtable::Value; -use crate::events::{CompletedProxyOp, EventCounters}; -use crate::tables::{net_qp_schema, proxy_ops_schema, NET_QP_FILE, PROXY_OPS_FILE}; - -const CHUNK_SIZE: u32 = 16 * 1024; -const NUM_CHUNKS: u32 = 32; +use crate::events::{ + CompletedCollPerf, CompletedProxyOp, EventCounters, InflightOp, ProfilerCounterSnapshot, +}; +use crate::ring_config::nccl_mmap_ring_config; +use crate::tables::{ + coll_perf_schema, inflight_ops_schema, net_qp_schema, profiler_counters_schema, + proxy_ops_schema, COLL_PERF_FILE, INFLIGHT_OPS_FILE, NET_QP_FILE, PROFILER_COUNTERS_FILE, + PROXY_OPS_FILE, +}; pub struct CompletedNetQp { pub ts_ns: i64, @@ -22,68 +26,91 @@ pub struct CompletedNetQp { pub duration_ns: i64, } -pub struct NcclWriter { - proxy_table: Option, - net_table: Option, - proxy_init_failed: AtomicBool, - net_init_failed: AtomicBool, - logged_proxy_init: AtomicBool, - logged_net_init: AtomicBool, +/// Lazily-created mmap table; failure is remembered and logged once. +struct LazyTable { + name: &'static str, + schema: fn() -> probing_memtable::Schema, + table: Option, + init_failed: AtomicBool, + logged_init: AtomicBool, } -impl NcclWriter { - pub fn new() -> Self { +impl LazyTable { + fn new(name: &'static str, schema: fn() -> probing_memtable::Schema) -> Self { Self { - proxy_table: None, - net_table: None, - proxy_init_failed: AtomicBool::new(false), - net_init_failed: AtomicBool::new(false), - logged_proxy_init: AtomicBool::new(false), - logged_net_init: AtomicBool::new(false), + name, + schema, + table: None, + init_failed: AtomicBool::new(false), + logged_init: AtomicBool::new(false), } } - fn open_proxy(&mut self) -> Result<&mut ExposedTable, ()> { - if self.proxy_table.is_none() && !self.proxy_init_failed.load(Ordering::Relaxed) { - match ExposedTable::create(PROXY_OPS_FILE, &proxy_ops_schema(), CHUNK_SIZE, NUM_CHUNKS) - { - Ok(t) => self.proxy_table = Some(t), + fn open(&mut self) -> Result<&mut ExposedTable, ()> { + if self.table.is_none() && !self.init_failed.load(Ordering::Relaxed) { + let (chunk_size, num_chunks) = nccl_mmap_ring_config(); + match ExposedTable::create(self.name, &(self.schema)(), chunk_size, num_chunks) { + Ok(t) => self.table = Some(t), Err(e) => { - self.proxy_init_failed.store(true, Ordering::Relaxed); + self.init_failed.store(true, Ordering::Relaxed); if self - .logged_proxy_init + .logged_init .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) .is_ok() { - eprintln!("[probing-nccl-profiler] failed to open {PROXY_OPS_FILE}: {e}"); + crate::log::warn(format!("failed to open {}: {e}", self.name)); } } } } - self.proxy_table.as_mut().ok_or(()) + self.table.as_mut().ok_or(()) } - fn open_net(&mut self) -> Result<&mut ExposedTable, ()> { - if self.net_table.is_none() && !self.net_init_failed.load(Ordering::Relaxed) { - match ExposedTable::create(NET_QP_FILE, &net_qp_schema(), CHUNK_SIZE, NUM_CHUNKS) { - Ok(t) => self.net_table = Some(t), - Err(e) => { - self.net_init_failed.store(true, Ordering::Relaxed); - if self - .logged_net_init - .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) - .is_ok() - { - eprintln!("[probing-nccl-profiler] failed to open {NET_QP_FILE}: {e}"); - } - } - } + fn ring_overwrite_stats(&self) -> (u32, u32) { + self.table + .as_ref() + .map(ExposedTable::ring_overwrite_stats) + .unwrap_or((0, 0)) + } +} + +pub struct NcclWriter { + proxy: LazyTable, + coll_perf: LazyTable, + inflight: LazyTable, + net: LazyTable, + counters: LazyTable, +} + +impl NcclWriter { + pub fn new() -> Self { + Self { + proxy: LazyTable::new(PROXY_OPS_FILE, proxy_ops_schema), + coll_perf: LazyTable::new(COLL_PERF_FILE, coll_perf_schema), + inflight: LazyTable::new(INFLIGHT_OPS_FILE, inflight_ops_schema), + net: LazyTable::new(NET_QP_FILE, net_qp_schema), + counters: LazyTable::new(PROFILER_COUNTERS_FILE, profiler_counters_schema), } - self.net_table.as_mut().ok_or(()) + } + + fn ring_overwrite_totals(&self) -> (u32, u32) { + let mut chunks = 0u32; + let mut rows = 0u32; + for stats in [ + self.proxy.ring_overwrite_stats(), + self.coll_perf.ring_overwrite_stats(), + self.inflight.ring_overwrite_stats(), + self.net.ring_overwrite_stats(), + self.counters.ring_overwrite_stats(), + ] { + chunks = chunks.saturating_add(stats.0); + rows = rows.saturating_add(stats.1); + } + (chunks, rows) } pub fn append_proxy_op(&mut self, row: &CompletedProxyOp, counters: &EventCounters) -> bool { - let Ok(table) = self.open_proxy() else { + let Ok(table) = self.proxy.open() else { counters.write_errors.fetch_add(1, Ordering::Relaxed); return false; }; @@ -102,6 +129,7 @@ impl NcclWriter { Value::I32(row.n_steps), Value::U64(row.trans_bytes), Value::I64(row.send_gpu_wait_ns), + Value::I64(row.send_peer_wait_ns), Value::I64(row.send_wait_ns), Value::I64(row.recv_wait_ns), Value::I64(row.recv_flush_wait_ns), @@ -127,8 +155,69 @@ impl NcclWriter { ok } + pub fn append_coll_perf(&mut self, row: &CompletedCollPerf, counters: &EventCounters) -> bool { + let Ok(table) = self.coll_perf.open() else { + counters.write_errors.fetch_add(1, Ordering::Relaxed); + return false; + }; + if !table.push_row(&[ + Value::I64(row.ts_ns), + Value::I32(row.rank), + Value::I32(row.roles.tp_rank), + Value::I32(row.roles.pp_rank), + Value::I32(row.roles.dp_rank), + Value::U64(row.comm_hash), + Value::I32(row.n_ranks), + Value::Str(row.func_str()), + Value::U64(row.seq), + Value::I32(row.is_p2p as i32), + Value::I32(row.peer), + Value::U64(row.count), + Value::U64(row.msg_size_bytes), + Value::Str(row.dtype.as_str()), + Value::Str(row.algo.as_str()), + Value::Str(row.proto.as_str()), + Value::I32(row.n_channels), + Value::I64(row.exec_time_ns), + Value::I64(row.enqueue_time_ns), + Value::Str(row.timing_source), + Value::F64(row.algobw_gbps), + Value::I32(row.pool_events_dropped), + ]) { + counters.write_errors.fetch_add(1, Ordering::Relaxed); + return false; + } + counters.rows_written.fetch_add(1, Ordering::Relaxed); + true + } + + pub fn append_inflight(&mut self, row: &InflightOp, counters: &EventCounters) -> bool { + let Ok(table) = self.inflight.open() else { + counters.write_errors.fetch_add(1, Ordering::Relaxed); + return false; + }; + if !table.push_row(&[ + Value::I64(row.ts_ns), + Value::I32(row.rank), + Value::U64(row.comm_hash), + Value::Str(row.func_str()), + Value::U64(row.seq), + Value::Str(row.kind), + Value::I32(row.channel_id), + Value::I32(row.peer), + Value::I32(row.is_send), + Value::I64(row.start_ns), + Value::I64(row.age_ns), + ]) { + counters.write_errors.fetch_add(1, Ordering::Relaxed); + return false; + } + counters.rows_written.fetch_add(1, Ordering::Relaxed); + true + } + pub fn append_net_qp(&mut self, row: &CompletedNetQp, counters: &EventCounters) -> bool { - let Ok(table) = self.open_net() else { + let Ok(table) = self.net.open() else { counters.write_errors.fetch_add(1, Ordering::Relaxed); return false; }; @@ -148,6 +237,54 @@ impl NcclWriter { counters.rows_written.fetch_add(1, Ordering::Relaxed); true } + + pub fn append_profiler_counters( + &mut self, + row: &ProfilerCounterSnapshot, + counters: &EventCounters, + ) -> bool { + let (ring_chunks, ring_rows) = self.ring_overwrite_totals(); + let row = ProfilerCounterSnapshot { + ring_chunks_recycled: ring_chunks, + ring_rows_overwritten: ring_rows, + ..*row + }; + let Ok(table) = self.counters.open() else { + counters.write_errors.fetch_add(1, Ordering::Relaxed); + return false; + }; + if !table.push_row(&[ + Value::I64(row.ts_ns), + Value::I32(row.rank), + Value::U64(row.coll_events), + Value::U64(row.p2p_events), + Value::U64(row.proxy_op_events), + Value::U64(row.proxy_step_events), + Value::U64(row.kernel_ch_events), + Value::U64(row.net_events), + Value::U64(row.rows_written), + Value::U64(row.pool_exhausted), + Value::U64(row.write_errors), + Value::U64(row.filtered), + Value::I32(row.coll_live), + Value::I32(row.proxy_live), + Value::I32(row.step_live), + Value::I32(row.kch_live), + Value::I32(row.net_live), + Value::I32(row.coll_cap), + Value::I32(row.proxy_cap), + Value::I32(row.step_cap), + Value::I32(row.kch_cap), + Value::I32(row.net_cap), + Value::U64(row.ring_chunks_recycled as u64), + Value::U64(row.ring_rows_overwritten as u64), + ]) { + counters.write_errors.fetch_add(1, Ordering::Relaxed); + return false; + } + counters.rows_written.fetch_add(1, Ordering::Relaxed); + true + } } #[cfg(test)] @@ -183,6 +320,7 @@ mod tests { n_steps: 4, trans_bytes: 1024, send_gpu_wait_ns: 10, + send_peer_wait_ns: 2, send_wait_ns: 20, recv_wait_ns: 30, recv_flush_wait_ns: 5, diff --git a/probing/extensions/python/src/extensions/python/exttbls.rs b/probing/extensions/python/src/extensions/python/exttbls.rs index 775a3ef3..746bcad9 100644 --- a/probing/extensions/python/src/extensions/python/exttbls.rs +++ b/probing/extensions/python/src/extensions/python/exttbls.rs @@ -440,32 +440,32 @@ fn lock_backing(backing: &Mutex) -> MutexGuard<'_, ExternBacking> #[pyclass(from_py_object)] #[derive(Clone, Debug)] -pub struct ExternalTable(Arc>, usize); +pub struct ExternalTable(Option>>, usize); + +const BRIDGE_DEGRADED_MSG: &str = + "probing native bridge unavailable; external table operations are disabled"; + +fn require_backing( + backing: &Option>>, +) -> PyResult<&Arc>> { + backing + .as_ref() + .ok_or_else(|| pyo3::exceptions::PyRuntimeError::new_err(BRIDGE_DEGRADED_MSG)) +} impl BlockOnFallback for ExternalTable { fn on_block_on_failure(err: RuntimeError) -> Self { - log::error!("ExternalTable bridge degraded: {err}; using no-op table"); - let backing = ExternalTable::create_backing( - "__probing_degraded__", - Vec::new(), - 4096, - "BaseMemorySize", - Some("probing degraded placeholder".into()), - HashMap::new(), - ); - ExternalTable(backing, 0) + log::error!("ExternalTable bridge degraded: {err}; table unusable"); + ExternalTable(None, 0) } } impl ExternalTable { - fn extract_eles(values: Vec>) -> Vec { + fn extract_eles(values: Vec>) -> PyResult> { Python::attach(|py| { values .into_iter() - .map(|v| { - let bound = v.bind(py); - python_to_ele(bound).unwrap_or(Ele::Nil) - }) + .map(|v| python_to_ele(v.bind(py))) .collect() }) } @@ -521,7 +521,7 @@ impl ExternalTable { column_docs.unwrap_or_default(), ); lock_extern_tables().insert(name, backing.clone()); - ExternalTable(backing, ncolumn) + ExternalTable(Some(backing), ncolumn) }) } @@ -532,7 +532,7 @@ impl ExternalTable { let binding = lock_extern_tables(); if let Some(backing) = binding.get(&name) { let ncolumn = lock_backing(backing.as_ref()).columns.len(); - Ok(ExternalTable(backing.clone(), ncolumn)) + Ok(ExternalTable(Some(backing.clone()), ncolumn)) } else { Err(pyo3::exceptions::PyValueError::new_err(format!( "table {name} not found" @@ -560,7 +560,7 @@ impl ExternalTable { let mut binding = lock_extern_tables(); if let Some(backing) = binding.get(&name) { let ncolumn = lock_backing(backing.as_ref()).columns.len(); - Ok(ExternalTable(backing.clone(), ncolumn)) + Ok(ExternalTable(Some(backing.clone()), ncolumn)) } else { let ncolumn = columns.len(); let backing = Self::create_backing( @@ -572,7 +572,7 @@ impl ExternalTable { column_docs.unwrap_or_default(), ); binding.insert(name, backing.clone()); - Ok(ExternalTable(backing, ncolumn)) + Ok(ExternalTable(Some(backing), ncolumn)) } }) } @@ -586,9 +586,9 @@ impl ExternalTable { }) } - fn names(&self) -> Vec { - let backing = self.0.clone(); - with_detached_native(move || lock_backing(backing.as_ref()).columns.clone()) + fn names(&self) -> PyResult> { + let backing = require_backing(&self.0)?.clone(); + with_detached_native(move || Ok(lock_backing(backing.as_ref()).columns.clone())) } fn append(&mut self, values: Vec>) -> PyResult<()> { @@ -597,8 +597,8 @@ impl ExternalTable { "column count mismatch", )); } - let eles = Self::extract_eles(values); - let backing = self.0.clone(); + let eles = Self::extract_eles(values)?; + let backing = require_backing(&self.0)?.clone(); with_detached_native(move || { lock_backing(backing.as_ref()) .append(now_micros(), &eles) @@ -612,8 +612,8 @@ impl ExternalTable { "column count mismatch", )); } - let eles = Self::extract_eles(values); - let backing = self.0.clone(); + let eles = Self::extract_eles(values)?; + let backing = require_backing(&self.0)?.clone(); with_detached_native(move || { lock_backing(backing.as_ref()) .append(t, &eles) @@ -630,7 +630,7 @@ impl ExternalTable { #[pyo3(signature = (limit=None))] fn take(&self, limit: Option) -> PyResult> { - let backing = self.0.clone(); + let backing = require_backing(&self.0)?.clone(); with_detached_native(move || { let rows = lock_backing(backing.as_ref()).take(limit); let result = rows @@ -774,7 +774,7 @@ if not hasattr(probing, "_made_{name}"): None, None, ); - assert_eq!(table.names(), vec!["a", "b"]); + assert_eq!(table.names().unwrap(), vec!["a", "b"]); } #[test] diff --git a/probing/extensions/python/src/features/crash/handler.rs b/probing/extensions/python/src/features/crash/handler.rs index 8cd7110a..458886ba 100644 --- a/probing/extensions/python/src/features/crash/handler.rs +++ b/probing/extensions/python/src/features/crash/handler.rs @@ -16,6 +16,7 @@ use uuid::Uuid; use crate::features::tracing::crash_span_snapshot; use super::grace; +use super::memory_snapshot::{self, MemorySnapshot}; use super::report; use super::{config, context}; @@ -45,6 +46,7 @@ pub struct CrashEvent { pub training_phase: String, pub active_span: String, pub last_comm_op: String, + pub memory: MemorySnapshot, } pub struct CrashInput { @@ -79,6 +81,7 @@ pub fn record(input: CrashInput) -> i32 { let ctx = context::snapshot(); let training = training_context(); + let memory = memory_snapshot::MemorySnapshot::capture(); let message = truncate(&input.message, 2000); let fp = fingerprint(&input.exception_type, &message, &input.top_frame); @@ -108,6 +111,7 @@ pub fn record(input: CrashInput) -> i32 { training_phase: training.training_phase, active_span: training.active_span, last_comm_op: training.last_comm_op, + memory, }; let spill_path = if config::spill_enabled() { @@ -252,6 +256,7 @@ mod tests { training_phase: String::new(), active_span: String::new(), last_comm_op: String::new(), + memory: MemorySnapshot::default(), }; let path = spill_event(&event).expect("spill"); assert!(path.exists()); diff --git a/probing/extensions/python/src/features/crash/memory_snapshot.rs b/probing/extensions/python/src/features/crash/memory_snapshot.rs new file mode 100644 index 00000000..ea1f080c --- /dev/null +++ b/probing/extensions/python/src/features/crash/memory_snapshot.rs @@ -0,0 +1,409 @@ +//! Host / GPU / torch memory snapshot at crash time. + +use nix::libc; +use probing_core::runtime::block_on; +use probing_core::ENGINE; +use probing_proto::prelude::{DataFrame, Ele, Seq}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)] +pub struct GpuDeviceMemory { + pub device_id: i32, + pub name: String, + pub used_bytes: i64, + pub total_bytes: i64, + pub mem_used_pct: f32, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)] +pub struct MemorySnapshot { + /// Fresh process RSS from `/proc` or `getrusage` (bytes). `-1` if unknown. + pub host_rss_bytes: i64, + /// Process thread count from the same direct read. `-1` if unknown. + pub thread_count: i32, + /// Latest `cpu.utilization` sample (KiB). `-1` if table empty / unavailable. + pub sampled_rss_kb: i64, + /// Per-device rows from latest `gpu.utilization` sample. + pub gpu_devices: Vec, + /// Latest `max(allocated)` from `python.torch_trace` (bytes). `-1` if unavailable. + pub torch_allocated_bytes: i64, + /// `true` when live table queries (GPU/torch hints) could not be fetched. + pub table_hints_unavailable: bool, +} + +impl MemorySnapshot { + pub fn capture() -> Self { + let direct = read_host_direct(); + let mut snap = MemorySnapshot { + host_rss_bytes: direct.rss_bytes, + thread_count: direct.thread_count, + ..Default::default() + }; + match block_on(fetch_table_hints()) { + Ok(Ok(hints)) => snap.merge_table_hints(hints), + Ok(Err(e)) => { + log::warn!("memory snapshot: table hints query failed: {e}"); + snap.table_hints_unavailable = true; + } + Err(e) => { + log::warn!("memory snapshot: async bridge unavailable for table hints: {e}"); + snap.table_hints_unavailable = true; + } + } + snap + } + + fn merge_table_hints(&mut self, hints: TableMemoryHints) { + if hints.sampled_rss_kb >= 0 { + self.sampled_rss_kb = hints.sampled_rss_kb; + } + if hints.torch_allocated_bytes >= 0 { + self.torch_allocated_bytes = hints.torch_allocated_bytes; + } + if !hints.gpu_devices.is_empty() { + self.gpu_devices = hints.gpu_devices; + } + } +} + +struct HostDirect { + rss_bytes: i64, + thread_count: i32, +} + +struct TableMemoryHints { + sampled_rss_kb: i64, + torch_allocated_bytes: i64, + gpu_devices: Vec, +} + +async fn fetch_table_hints() -> Result { + let engine = ENGINE.read().await; + let mut hints = TableMemoryHints { + sampled_rss_kb: -1, + torch_allocated_bytes: -1, + gpu_devices: Vec::new(), + }; + + if let Ok(Some(df)) = engine + .async_query( + "SELECT rss_kb FROM cpu.utilization \ + WHERE scope = 'process' ORDER BY ts DESC LIMIT 1", + ) + .await + { + hints.sampled_rss_kb = col_i64_first(&df, "rss_kb").unwrap_or(-1); + } + + if let Ok(Some(df)) = engine + .async_query( + "SELECT device_id, name, used_bytes, total_bytes, mem_used_pct \ + FROM gpu.utilization ORDER BY ts DESC LIMIT 32", + ) + .await + { + hints.gpu_devices = latest_gpu_devices(&df); + } + + if let Ok(Some(df)) = engine + .async_query( + "SELECT max(allocated) AS torch_allocated FROM python.torch_trace \ + WHERE allocated IS NOT NULL", + ) + .await + { + hints.torch_allocated_bytes = col_i64_first(&df, "torch_allocated").unwrap_or(-1); + } + + Ok(hints) +} + +fn latest_gpu_devices(df: &DataFrame) -> Vec { + let mut out = Vec::new(); + let mut seen = std::collections::HashSet::new(); + for row in df.iter() { + let device_id = row_value_i32(&row, df, "device_id").unwrap_or(-1); + if device_id < 0 || !seen.insert(device_id) { + continue; + } + out.push(GpuDeviceMemory { + device_id, + name: row_value_string(&row, df, "name").unwrap_or_default(), + used_bytes: row_value_i64(&row, df, "used_bytes").unwrap_or(-1), + total_bytes: row_value_i64(&row, df, "total_bytes").unwrap_or(-1), + mem_used_pct: row_value_f32(&row, df, "mem_used_pct").unwrap_or(0.0), + }); + } + out.sort_by_key(|d| d.device_id); + out +} + +fn read_host_direct() -> HostDirect { + HostDirect { + rss_bytes: read_host_rss_bytes_impl(), + thread_count: read_thread_count(), + } +} + +/// Signal-safe RSS read for fatal-signal spill (Linux best-effort). +pub fn read_host_rss_bytes_signal_safe() -> i64 { + #[cfg(target_os = "linux")] + { + parse_proc_vmrss_signal_safe() + } + #[cfg(not(target_os = "linux"))] + { + read_host_rss_bytes_impl() + } +} + +fn read_thread_count() -> i32 { + #[cfg(target_os = "linux")] + { + if let Ok(status) = std::fs::read_to_string("/proc/self/status") { + for line in status.lines() { + if let Some(val) = line.strip_prefix("Threads:") { + if let Ok(n) = val.trim().parse::() { + return n; + } + } + } + } + } + -1 +} + +#[cfg(target_os = "linux")] +fn parse_proc_status_vmrss(content: &str) -> i64 { + for line in content.lines() { + if let Some(kb) = line.strip_prefix("VmRSS:").map(str::trim) { + if let Ok(kib) = kb.split_whitespace().next().unwrap_or("").parse::() { + return kib.saturating_mul(1024); + } + } + } + -1 +} + +#[cfg(target_os = "linux")] +fn read_host_rss_bytes_impl() -> i64 { + std::fs::read_to_string("/proc/self/status") + .ok() + .map(|s| parse_proc_status_vmrss(&s)) + .unwrap_or(-1) +} + +#[cfg(target_os = "macos")] +fn read_host_rss_bytes_impl() -> i64 { + unsafe { + let mut usage: libc::rusage = std::mem::zeroed(); + if libc::getrusage(libc::RUSAGE_SELF, &mut usage) == 0 { + return usage.ru_maxrss as i64; + } + } + -1 +} + +#[cfg(not(any(target_os = "linux", target_os = "macos")))] +fn read_host_rss_bytes_impl() -> i64 { + -1 +} + +#[cfg(target_os = "linux")] +fn parse_proc_vmrss_signal_safe() -> i64 { + let fd = unsafe { libc::open(c"/proc/self/status".as_ptr(), libc::O_RDONLY) }; + if fd < 0 { + return -1; + } + let mut buf = [0u8; 4096]; + let n = unsafe { libc::read(fd, buf.as_mut_ptr().cast(), buf.len()) }; + unsafe { libc::close(fd) }; + if n <= 0 { + return -1; + } + let text = std::str::from_utf8(&buf[..n as usize]).unwrap_or(""); + parse_proc_status_vmrss(text) +} + +fn col_index(df: &DataFrame, name: &str) -> Option { + df.names.iter().position(|n| n == name) +} + +fn col_i64_first(df: &DataFrame, name: &str) -> Option { + let idx = col_index(df, name)?; + match &df.cols[idx] { + Seq::SeqI64(v) => v.first().copied(), + Seq::SeqI32(v) => v.first().map(|x| i64::from(*x)), + Seq::SeqF64(v) => v.first().map(|x| *x as i64), + _ => None, + } +} + +fn row_value_i64(row: &[Ele], df: &DataFrame, name: &str) -> Option { + let idx = col_index(df, name)?; + match &row[idx] { + Ele::I64(v) => Some(*v), + Ele::I32(v) => Some(i64::from(*v)), + Ele::F64(v) => Some(*v as i64), + _ => None, + } +} + +fn row_value_i32(row: &[Ele], df: &DataFrame, name: &str) -> Option { + let idx = col_index(df, name)?; + match &row[idx] { + Ele::I32(v) => Some(*v), + Ele::I64(v) => i32::try_from(*v).ok(), + _ => None, + } +} + +fn row_value_f32(row: &[Ele], df: &DataFrame, name: &str) -> Option { + let idx = col_index(df, name)?; + match &row[idx] { + Ele::F32(v) => Some(*v), + Ele::F64(v) => Some(*v as f32), + _ => None, + } +} + +fn row_value_string(row: &[Ele], df: &DataFrame, name: &str) -> Option { + let idx = col_index(df, name)?; + match &row[idx] { + Ele::Text(v) => Some(v.clone()), + _ => None, + } +} + +pub fn format_bytes(bytes: i64) -> String { + if bytes < 0 { + return "?".into(); + } + const KIB: f64 = 1024.0; + const MIB: f64 = KIB * 1024.0; + const GIB: f64 = MIB * 1024.0; + let b = bytes as f64; + if b >= GIB { + format!("{:.2} GiB", b / GIB) + } else if b >= MIB { + format!("{:.1} MiB", b / MIB) + } else if b >= KIB { + format!("{:.0} KiB", b / KIB) + } else { + format!("{bytes} B") + } +} + +pub fn report_lines(snap: &MemorySnapshot) -> Vec { + let mut lines = Vec::new(); + if snap.host_rss_bytes < 0 + && snap.sampled_rss_kb < 0 + && snap.gpu_devices.is_empty() + && snap.torch_allocated_bytes < 0 + { + return lines; + } + + let mut parts = Vec::new(); + if snap.host_rss_bytes >= 0 { + parts.push(format!("host_rss={}", format_bytes(snap.host_rss_bytes))); + } + if snap.sampled_rss_kb >= 0 { + parts.push(format!( + "sampled_rss={}", + format_bytes(snap.sampled_rss_kb.saturating_mul(1024)) + )); + } + if snap.thread_count >= 0 { + parts.push(format!("threads={}", snap.thread_count)); + } + if snap.torch_allocated_bytes >= 0 { + parts.push(format!( + "torch_allocated={}", + format_bytes(snap.torch_allocated_bytes) + )); + } + if !parts.is_empty() { + lines.push(format!(" memory {}", parts.join(" "))); + } + + if snap.table_hints_unavailable { + lines.push(" memory table_hints=unavailable (gpu/torch samples not merged)".into()); + } + + for gpu in &snap.gpu_devices { + let used = format_bytes(gpu.used_bytes); + let total = format_bytes(gpu.total_bytes); + let pct = if gpu.mem_used_pct > 0.0 { + format!(" ({:.0}%)", gpu.mem_used_pct) + } else { + String::new() + }; + lines.push(format!( + " memory gpu{} {} used={}/{}{pct}", + gpu.device_id, + if gpu.name.is_empty() { + "device".into() + } else { + gpu.name.clone() + }, + used, + total + )); + } + + lines +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn format_bytes_scales() { + assert_eq!(format_bytes(-1), "?"); + assert_eq!(format_bytes(512), "512 B"); + assert!(format_bytes(5 * 1024 * 1024).contains("MiB")); + assert!(format_bytes(3 * 1024 * 1024 * 1024).contains("GiB")); + } + + #[cfg(target_os = "linux")] + #[test] + fn linux_vmrss_parse() { + let sample = "Name:\tpython\nVmRSS:\t 12345 kB\n"; + assert_eq!(parse_proc_status_vmrss(sample), 12345 * 1024); + } + + #[test] + fn report_lines_note_unavailable_table_hints() { + let snap = MemorySnapshot { + host_rss_bytes: 1024, + table_hints_unavailable: true, + ..Default::default() + }; + let lines = report_lines(&snap); + assert!(lines.iter().any(|l| l.contains("table_hints=unavailable"))); + } + + #[test] + fn report_lines_include_host_and_gpu() { + let snap = MemorySnapshot { + host_rss_bytes: 8 * 1024 * 1024 * 1024, + thread_count: 4, + torch_allocated_bytes: 2 * 1024 * 1024 * 1024, + gpu_devices: vec![GpuDeviceMemory { + device_id: 0, + name: "GPU".into(), + used_bytes: 70 * 1024 * 1024 * 1024, + total_bytes: 80 * 1024 * 1024 * 1024, + mem_used_pct: 87.5, + }], + ..Default::default() + }; + let lines = report_lines(&snap); + assert_eq!(lines.len(), 2); + assert!(lines[0].contains("host_rss=")); + assert!(lines[0].contains("torch_allocated=")); + assert!(lines[1].contains("gpu0")); + } +} diff --git a/probing/extensions/python/src/features/crash/mod.rs b/probing/extensions/python/src/features/crash/mod.rs index 55b466c3..2de7fb8c 100644 --- a/probing/extensions/python/src/features/crash/mod.rs +++ b/probing/extensions/python/src/features/crash/mod.rs @@ -5,6 +5,7 @@ mod api; mod grace; mod handler; +mod memory_snapshot; mod report; mod signal; diff --git a/probing/extensions/python/src/features/crash/report.rs b/probing/extensions/python/src/features/crash/report.rs index 0861d8b8..4d9d3646 100644 --- a/probing/extensions/python/src/features/crash/report.rs +++ b/probing/extensions/python/src/features/crash/report.rs @@ -1,6 +1,7 @@ //! Human-readable crash report rendering. use super::handler::CrashEvent; +use super::memory_snapshot; const WIDTH: usize = 72; @@ -52,6 +53,7 @@ fn context_lines(event: &CrashEvent) -> Vec { if !event.last_comm_op.is_empty() { lines.push(format!(" comm {}", event.last_comm_op)); } + lines.extend(memory_snapshot::report_lines(&event.memory)); lines } @@ -201,9 +203,21 @@ mod tests { training_phase: "backward".into(), active_span: "train.step".into(), last_comm_op: "all_reduce".into(), + memory: memory_snapshot::MemorySnapshot { + host_rss_bytes: 1024 * 1024, + thread_count: 2, + ..Default::default() + }, } } + #[test] + fn summary_includes_memory_context() { + let text = format_event(&sample_event(), false, 0, false, None); + assert!(text.contains("memory")); + assert!(text.contains("host_rss=")); + } + #[test] fn summary_includes_training_context() { let text = format_event(&sample_event(), false, 0, false, None); diff --git a/probing/extensions/python/src/features/crash/signal.rs b/probing/extensions/python/src/features/crash/signal.rs index d7757852..a08de739 100644 --- a/probing/extensions/python/src/features/crash/signal.rs +++ b/probing/extensions/python/src/features/crash/signal.rs @@ -22,6 +22,7 @@ use probing_core::trace::crash_atomic_step; use super::context; use super::handler; +use super::memory_snapshot; static INSTALLED: AtomicBool = AtomicBool::new(false); static IN_HANDLER: AtomicBool = AtomicBool::new(false); @@ -304,8 +305,9 @@ unsafe fn spill_fatal_signal(sig: c_int, tid: u64, fault_addr: usize) { let rank = CACHED_RANK.load(Ordering::Relaxed); let local_rank = CACHED_LOCAL_RANK.load(Ordering::Relaxed); let pid = libc::getpid(); + let host_rss_bytes = memory_snapshot::read_host_rss_bytes_signal_safe(); - let mut buf = [0u8; 512]; + let mut buf = [0u8; 640]; let mut n = 0usize; macro_rules! append { ($s:expr) => {{ @@ -329,6 +331,8 @@ unsafe fn spill_fatal_signal(sig: c_int, tid: u64, fault_addr: usize) { n = append_dec(&mut buf, n, step.global_step as usize); append!(",\"micro_step\":"); n = append_dec(&mut buf, n, step.micro_step as usize); + append!(",\"host_rss_bytes\":"); + n = append_dec(&mut buf, n, host_rss_bytes.max(0) as usize); append!(",\"tid\":"); n = append_dec(&mut buf, n, tid as usize); append!(",\"fault_addr\":\"0x"); diff --git a/probing/extensions/python/src/features/pprof.rs b/probing/extensions/python/src/features/pprof.rs index 0f5c9c3a..2596ff0d 100644 --- a/probing/extensions/python/src/features/pprof.rs +++ b/probing/extensions/python/src/features/pprof.rs @@ -888,7 +888,6 @@ pub fn setup(freq: u64) -> Result<()> { arm_timer(freq); log::info!("probing: SIGPROF CPU sampler started ({freq} Hz, Python+native)"); - eprintln!("probing: SIGPROF CPU sampler started ({freq} Hz)"); Ok(()) } diff --git a/probing/extensions/python/src/features/python_api.rs b/probing/extensions/python/src/features/python_api.rs index f51911f2..7dfaa477 100644 --- a/probing/extensions/python/src/features/python_api.rs +++ b/probing/extensions/python/src/features/python_api.rs @@ -25,7 +25,11 @@ pub fn query_json(_py: Python, sql: String) -> PyResult { let df = block_on(async move { ENGINE.read().await.async_query(sql.as_str()).await }) .map_err(runtime_err)? .map_err(runtime_err)? - .unwrap_or_default(); + .ok_or_else(|| { + pyo3::exceptions::PyRuntimeError::new_err( + "query returned no dataframe (engine unavailable or empty response)", + ) + })?; serde_json::to_string(&df).map_err(runtime_err) }) } diff --git a/probing/extensions/python/src/features/stack_tracer.rs b/probing/extensions/python/src/features/stack_tracer.rs index 93cb7067..62a7480d 100644 --- a/probing/extensions/python/src/features/stack_tracer.rs +++ b/probing/extensions/python/src/features/stack_tracer.rs @@ -254,7 +254,15 @@ impl SignalTracer { return Err(err.into()); } }; - let python_frames = rx.recv_timeout(Duration::from_secs(2)).unwrap_or_default(); + let python_frames = match rx.recv_timeout(Duration::from_secs(2)) { + Ok(frames) => frames, + Err(err) => { + Self::clear_sender_slot(); + return Err(anyhow::anyhow!( + "Python stack trace timed out or failed after native capture: {err}" + )); + } + }; Self::clear_sender_slot(); Ok(Self::merge_python_native_stacks( @@ -281,12 +289,14 @@ impl StackTracer for SignalTracer { Ok(Ok(frames)) => Ok(frames), Ok(Err(err)) => { log::warn!("Cross-thread stack trace failed for tid {target}: {err}"); - Ok(vec![]) + Err(err) } Err(_) => { log::warn!("Cross-thread stack trace panicked for tid {target}"); Self::clear_sender_slot(); - Ok(vec![]) + Err(anyhow::anyhow!( + "cross-thread stack trace panicked for tid {target}" + )) } } } diff --git a/probing/extensions/python/src/features/torch.rs b/probing/extensions/python/src/features/torch.rs index d6695b93..da69a1f2 100644 --- a/probing/extensions/python/src/features/torch.rs +++ b/probing/extensions/python/src/features/torch.rs @@ -61,63 +61,33 @@ struct Frame { module: String, } -/// Median stage duration on post-hook rows only (pre rows carry timing metadata, not duration). -const TORCH_DURATION_QUERY: &str = r#" - SELECT module, stage, median(CAST(duration AS DOUBLE)) AS value - FROM python.torch_trace - WHERE module <> 'None' - AND stage LIKE 'post %' - AND CAST(duration AS DOUBLE) > 0 - GROUP BY module, stage - ORDER BY stage, module; -"#; +/// Recent training steps included in flamegraph aggregates (matches Training page window). +const TORCH_RECENT_STEP_FILTER: &str = + "local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 99, 1)"; -/// Median post-hook allocated delta (pre→post pair, stored on post rows). -const TORCH_DELTA_QUERY: &str = r#" - SELECT module, stage, median(CAST(allocated_delta AS DOUBLE)) AS value +/// Raw post-hook duration rows for Rust-side median aggregation. +const TORCH_DURATION_ROWS_QUERY: &str = r#" + SELECT module, stage, CAST(duration AS DOUBLE) AS duration FROM python.torch_trace WHERE module <> 'None' AND stage LIKE 'post %' - AND CAST(allocated_delta AS DOUBLE) > 0 - GROUP BY module, stage - ORDER BY stage, module; "#; -/// Median post-hook peak-allocated delta (pre→post pair, stored on post rows). -const TORCH_PEAK_QUERY: &str = r#" - SELECT module, stage, median(CAST(max_allocated_delta AS DOUBLE)) AS value +/// Post-hook rows including memory columns (may be absent on older mmap tables). +const TORCH_POST_ROWS_QUERY: &str = r#" + SELECT module, stage, + CAST(duration AS DOUBLE) AS duration, + CAST(allocated_delta AS DOUBLE) AS allocated_delta, + CAST(max_allocated_delta AS DOUBLE) AS max_allocated_delta, + CAST(allocated AS DOUBLE) AS allocated, + CAST(max_allocated AS DOUBLE) AS max_allocated FROM python.torch_trace WHERE module <> 'None' AND stage LIKE 'post %' - AND CAST(max_allocated_delta AS DOUBLE) > 0 - GROUP BY module, stage - ORDER BY stage, module; -"#; - -/// Fallback when hook deltas are zero: median global GPU allocated at post-hook. -const TORCH_ALLOCATED_SNAPSHOT_QUERY: &str = r#" - SELECT module, stage, median(CAST(allocated AS DOUBLE)) AS value - FROM python.torch_trace - WHERE module <> 'None' - AND stage LIKE 'post %' - AND CAST(allocated AS DOUBLE) > 0 - GROUP BY module, stage - ORDER BY stage, module; -"#; - -/// Fallback when peak deltas are zero: median global peak allocated at post-hook. -const TORCH_MAX_SNAPSHOT_QUERY: &str = r#" - SELECT module, stage, median(CAST(max_allocated AS DOUBLE)) AS value - FROM python.torch_trace - WHERE module <> 'None' - AND stage LIKE 'post %' - AND CAST(max_allocated AS DOUBLE) > 0 - GROUP BY module, stage - ORDER BY stage, module; "#; const TORCH_MEMORY_ROWS_QUERY: &str = r#" - SELECT step, module, stage, allocated, max_allocated + SELECT local_step, module, stage, allocated, max_allocated FROM python.torch_trace WHERE module <> 'None' AND (stage LIKE 'pre %' OR stage LIKE 'post %') @@ -126,10 +96,10 @@ const TORCH_MEMORY_ROWS_QUERY: &str = r#" /// Legacy rows without delta columns: SQL join on pre/post allocated. const TORCH_DELTA_JOIN_QUERY: &str = r#" SELECT post.module, post.stage, - median(CAST(post.allocated AS DOUBLE) - CAST(pre.allocated AS DOUBLE)) AS value + CAST(post.allocated AS DOUBLE) - CAST(pre.allocated AS DOUBLE) AS value FROM python.torch_trace pre INNER JOIN python.torch_trace post - ON pre.step = post.step + ON pre.local_step = post.local_step AND pre.module = post.module AND ( (pre.stage = 'pre forward' AND post.stage = 'post forward') @@ -138,17 +108,16 @@ const TORCH_DELTA_JOIN_QUERY: &str = r#" ) WHERE post.module <> 'None' AND (CAST(post.allocated AS DOUBLE) - CAST(pre.allocated AS DOUBLE)) > 0 - GROUP BY post.module, post.stage - ORDER BY post.stage, post.module; + AND post.local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 99, 1) "#; /// Legacy rows without delta columns: SQL join on pre/post peak allocated. const TORCH_PEAK_JOIN_QUERY: &str = r#" SELECT post.module, post.stage, - median(CAST(post.max_allocated AS DOUBLE) - CAST(pre.max_allocated AS DOUBLE)) AS value + CAST(post.max_allocated AS DOUBLE) - CAST(pre.max_allocated AS DOUBLE) AS value FROM python.torch_trace pre INNER JOIN python.torch_trace post - ON pre.step = post.step + ON pre.local_step = post.local_step AND pre.module = post.module AND ( (pre.stage = 'pre forward' AND post.stage = 'post forward') @@ -157,8 +126,7 @@ const TORCH_PEAK_JOIN_QUERY: &str = r#" ) WHERE post.module <> 'None' AND (CAST(post.max_allocated AS DOUBLE) - CAST(pre.max_allocated AS DOUBLE)) > 0 - GROUP BY post.module, post.stage - ORDER BY post.stage, post.module; + AND post.local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 99, 1) "#; /// Map stored hook labels to flamegraph phase names. @@ -352,15 +320,67 @@ struct ProfilingResult { subtitle: String, } -fn lines_from_agg_query(query: &str) -> Vec { - match run_torch_query(query) { - Ok(data) => { - let rows = data.iter().map(|line| { - let value = parse_value_col(&line[2]); - (parse_text_col(&line[0]), parse_text_col(&line[1]), value) - }); - build_folded_lines(rows, value_to_micro_mb, true) +fn lines_from_value_rows( + data: &probing_proto::types::DataFrame, + value_col: usize, + to_units: fn(f64) -> u64, + clamp_non_negative: bool, +) -> Vec { + let module_idx = data.names.iter().position(|n| n == "module").unwrap_or(0); + let stage_idx = data.names.iter().position(|n| n == "stage").unwrap_or(1); + let mut grouped: HashMap<(String, String), Vec> = HashMap::new(); + let rows = data.cols.first().map(|c| c.len()).unwrap_or(0); + for row in 0..rows { + let module = data + .cols + .get(module_idx) + .map(|c| parse_text_col(&c.get(row))) + .unwrap_or_default(); + let stage = data + .cols + .get(stage_idx) + .map(|c| parse_text_col(&c.get(row))) + .unwrap_or_default(); + let value = data + .cols + .get(value_col) + .map(|c| parse_value_col(&c.get(row))) + .unwrap_or(0.0); + if value > 0.0 { + grouped.entry((module, stage)).or_default().push(value); } + } + let rows = grouped + .into_iter() + .map(|((module, stage), values)| (module, stage, median_f64(&values))) + .filter(|(_, _, v)| *v > 0.0); + build_folded_lines(rows, to_units, clamp_non_negative) +} + +fn build_median_lines_from_post_rows( + data: &probing_proto::types::DataFrame, + value_col: usize, + to_units: fn(f64) -> u64, + clamp_non_negative: bool, +) -> Vec { + lines_from_value_rows(data, value_col, to_units, clamp_non_negative) +} + +fn torch_rows_query(base: &str) -> String { + if base.contains("local_step >=") { + return base.to_string(); + } + let trimmed = base.trim_end().trim_end_matches(';'); + if trimmed.to_uppercase().contains(" WHERE ") { + format!("{trimmed} AND {TORCH_RECENT_STEP_FILTER}") + } else { + format!("{trimmed} WHERE {TORCH_RECENT_STEP_FILTER}") + } +} + +fn lines_from_agg_query(query: &str, to_units: fn(f64) -> u64) -> Vec { + match run_torch_query(&torch_rows_query(query)) { + Ok(data) => lines_from_value_rows(&data, 2, to_units, true), Err(err) => { log::debug!("Torch aggregate query failed ({err})"); Vec::new() @@ -417,18 +437,31 @@ fn build_lines_from_memory_pairs( } fn query_memory_lines( - delta_query: &str, join_query: &str, - snapshot_query: &str, + snapshot_value_col: usize, use_peak: bool, metric: TorchMetric, ) -> Result { - let mut lines = lines_from_agg_query(delta_query); + let post_query = torch_rows_query(TORCH_POST_ROWS_QUERY); + let mut lines = if let Ok(data) = run_torch_query(&post_query) { + let primary_delta_col = if use_peak { 4 } else { 3 }; + let snapshot_col = if use_peak { 6 } else { 5 }; + let mut from_delta = + build_median_lines_from_post_rows(&data, primary_delta_col, value_to_micro_mb, true); + if from_delta.is_empty() { + from_delta = + build_median_lines_from_post_rows(&data, snapshot_col, value_to_micro_mb, true); + } + from_delta + } else { + Vec::new() + }; + if lines.is_empty() { - lines = lines_from_agg_query(join_query); + lines = lines_from_agg_query(join_query, value_to_micro_mb); } if lines.is_empty() { - if let Ok(data) = run_torch_query(TORCH_MEMORY_ROWS_QUERY) { + if let Ok(data) = run_torch_query(&torch_rows_query(TORCH_MEMORY_ROWS_QUERY)) { lines = build_lines_from_memory_pairs(&data, use_peak); } } @@ -440,14 +473,17 @@ fn query_memory_lines( }); } - let snapshot_lines = lines_from_agg_query(snapshot_query); + if let Ok(data) = run_torch_query(&post_query) { + lines = + build_median_lines_from_post_rows(&data, snapshot_value_col, value_to_micro_mb, true); + } let subtitle = if use_peak { "Median post-hook peak GPU allocated (global MB) · hook deltas were zero · CUDA only" } else { "Median post-hook GPU allocated (global MB) · hook deltas were zero · CUDA only" }; Ok(ProfilingResult { - lines: snapshot_lines, + lines, subtitle: subtitle.to_string(), }) } @@ -455,31 +491,17 @@ fn query_memory_lines( fn query_profiling(metric: TorchMetric) -> Result { match metric { TorchMetric::Duration => { - let data = run_torch_query(TORCH_DURATION_QUERY)?; - let rows = data.iter().map(|line| { - let value = parse_value_col(&line[2]); - (parse_text_col(&line[0]), parse_text_col(&line[1]), value) - }); - let lines = build_folded_lines(rows, value_to_ns, false); + let post_query = torch_rows_query(TORCH_DURATION_ROWS_QUERY); + let data = run_torch_query(&post_query)?; + let duration_col = data.names.iter().position(|n| n == "duration").unwrap_or(2); + let lines = build_median_lines_from_post_rows(&data, duration_col, value_to_ns, false); Ok(ProfilingResult { lines, subtitle: metric.subtitle().to_string(), }) } - TorchMetric::DeltaMb => query_memory_lines( - TORCH_DELTA_QUERY, - TORCH_DELTA_JOIN_QUERY, - TORCH_ALLOCATED_SNAPSHOT_QUERY, - false, - metric, - ), - TorchMetric::PeakMb => query_memory_lines( - TORCH_PEAK_QUERY, - TORCH_PEAK_JOIN_QUERY, - TORCH_MAX_SNAPSHOT_QUERY, - true, - metric, - ), + TorchMetric::DeltaMb => query_memory_lines(TORCH_DELTA_JOIN_QUERY, 5, false, metric), + TorchMetric::PeakMb => query_memory_lines(TORCH_PEAK_JOIN_QUERY, 6, true, metric), } } @@ -685,4 +707,79 @@ mod tests { .iter() .any(|l| l.starts_with("forward;layer; 2500000"))); } + + #[test] + fn torch_rows_query_appends_recent_step_window() { + let q = torch_rows_query(TORCH_DURATION_ROWS_QUERY); + assert!(q.contains("local_step >=")); + assert!(q.contains("max(local_step)")); + assert!(q.contains("module <> 'None'")); + } + + #[test] + fn torch_rows_query_is_idempotent_when_filter_present() { + let already_filtered = + format!("SELECT 1 FROM python.torch_trace WHERE {TORCH_RECENT_STEP_FILTER}"); + assert_eq!(torch_rows_query(&already_filtered), already_filtered); + } + + #[test] + fn duration_query_uses_minimal_columns_for_legacy_mmap() { + assert!(TORCH_DURATION_ROWS_QUERY.contains("duration")); + assert!(!TORCH_DURATION_ROWS_QUERY.contains("allocated_delta")); + assert!(!TORCH_DURATION_ROWS_QUERY.contains("max_allocated_delta")); + } + + #[test] + fn memory_join_queries_use_local_step_not_step() { + for sql in [TORCH_DELTA_JOIN_QUERY, TORCH_PEAK_JOIN_QUERY] { + assert!(sql.contains("local_step"), "expected local_step in: {sql}"); + assert!(!sql.contains("pre.step"), "legacy step column in: {sql}"); + assert!(!sql.contains("post.step"), "legacy step column in: {sql}"); + } + assert!(TORCH_MEMORY_ROWS_QUERY.contains("local_step")); + assert!(!TORCH_MEMORY_ROWS_QUERY.contains("SELECT step,")); + } + + #[test] + fn lines_from_value_rows_median_per_module_stage() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec!["module".into(), "stage".into(), "duration".into()], + vec![ + Seq::SeqText(vec!["layer".into(), "layer".into(), "layer".into()]), + Seq::SeqText(vec![ + "post forward".into(), + "post forward".into(), + "post forward".into(), + ]), + Seq::SeqF64(vec![0.004, 0.006, 0.010]), + ], + ); + + let lines = lines_from_value_rows(&df, 2, value_to_ns, false); + assert!(lines + .iter() + .any(|l| l.starts_with("forward;layer; 6000000"))); + } + + #[test] + fn build_median_lines_duration_only_schema() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec!["module".into(), "stage".into(), "duration".into()], + vec![ + Seq::SeqText(vec!["conv1".into()]), + Seq::SeqText(vec!["post forward".into()]), + Seq::SeqF64(vec![0.002]), + ], + ); + + let lines = build_median_lines_from_post_rows(&df, 2, value_to_ns, false); + assert!(lines + .iter() + .any(|l| l.starts_with("forward;conv1; 2000000"))); + } } diff --git a/probing/memtable/src/discover.rs b/probing/memtable/src/discover.rs index f07602ca..6e05aec5 100644 --- a/probing/memtable/src/discover.rs +++ b/probing/memtable/src/discover.rs @@ -190,6 +190,11 @@ impl ExposedTable { pub fn view(&self) -> MemTableView<'_> { self.inner.view() } + + /// Ring-buffer overwrite counters `(chunks_recycled, rows_overwritten)`. + pub fn ring_overwrite_stats(&self) -> (u32, u32) { + crate::layout::ring_overwrite_stats(self.inner.as_bytes()) + } } // ── ExposedHashTable ───────────────────────────────────────────────── diff --git a/probing/memtable/src/layout.rs b/probing/memtable/src/layout.rs index 9fe251f6..f3103943 100644 --- a/probing/memtable/src/layout.rs +++ b/probing/memtable/src/layout.rs @@ -21,7 +21,8 @@ //! 40 4 creator_pid PID of creating process //! 44 4 _pad0 (alignment) //! 48 8 creator_start_time process start time (platform-specific) -//! 56 8 _reserved reserved for future use +//! 56 4 chunks_recycled AtomicU32 — ring chunks overwritten +//! 60 4 rows_overwritten AtomicU32 — rows lost to ring wrap //! ────────────────────────────────────────────────────────── //! ``` //! @@ -116,8 +117,20 @@ pub(crate) struct Header { /// macOS: microseconds since epoch (via `sysctl`). /// Other: 0 (falls back to PID-only liveness check). pub creator_start_time: u64, - /// Reserved for future use (was part of `_reserved` in v2). - pub _reserved: u64, + /// Ring chunks recycled with non-zero row data (hot-path counter). + pub chunks_recycled: AtomicU32, + /// Rows dropped because the ring buffer wrapped (hot-path counter). + pub rows_overwritten: AtomicU32, +} + +/// Overwrite counters from a MEMT buffer header (for diagnostics / SQL plugins). +pub fn ring_overwrite_stats(buf: &[u8]) -> (u32, u32) { + use std::sync::atomic::Ordering; + let h = header(buf); + ( + h.chunks_recycled.load(Ordering::Relaxed), + h.rows_overwritten.load(Ordering::Relaxed), + ) } /// Per-column descriptor, immediately following the Header. diff --git a/probing/memtable/src/lib.rs b/probing/memtable/src/lib.rs index 8a03ed59..3c3eb1a7 100644 --- a/probing/memtable/src/lib.rs +++ b/probing/memtable/src/lib.rs @@ -116,7 +116,7 @@ mod writer; pub use cache::{CachedCursor, CachedReader}; pub use docs::infer_extern_column_dtype; pub use error::{MemtableError, Result as MemtableResult}; -pub use layout::MAGIC_MEMT; +pub use layout::{ring_overwrite_stats, MAGIC_MEMT}; pub use memh::{ init_buf as init_memh_buf, validate_memh, InsertError, InsertResult, MemhInitError, MemhValidateError, MemhView, MemhWriter, SharedMemhWriter, TypedValue, MAGIC_MEMH, diff --git a/probing/memtable/src/raw.rs b/probing/memtable/src/raw.rs index 1e662b8b..9e937d50 100644 --- a/probing/memtable/src/raw.rs +++ b/probing/memtable/src/raw.rs @@ -137,6 +137,15 @@ pub(crate) fn advance_chunk_raw(buf: &mut [u8]) { let new_wc = (wc + 1) % num_chunks; let cs = doff + new_wc as usize * csz; let new_ch = &*(ptr.add(cs) as *const ChunkHeader); + let rows_lost = new_ch.row_count.load(Ordering::Relaxed); + if rows_lost > 0 { + h.chunks_recycled.fetch_add(1, Ordering::Relaxed); + h.rows_overwritten.fetch_add(rows_lost, Ordering::Relaxed); + log::warn!( + "memtable ring overwrite: lost {rows_lost} rows (total overwritten {})", + h.rows_overwritten.load(Ordering::Relaxed) + ); + } new_ch.used.store(0, Ordering::Relaxed); new_ch.row_count.store(0, Ordering::Relaxed); new_ch.min_ts.store(TS_MIN_INIT, Ordering::Relaxed); @@ -375,7 +384,8 @@ pub(crate) fn init_buf(buf: &mut [u8], schema: &Schema, chunk_size: u32, num_chu h.creator_pid = std::process::id(); h._pad0 = 0; h.creator_start_time = process_start_time(std::process::id()); - h._reserved = 0; + h.chunks_recycled.store(0, Ordering::Relaxed); + h.rows_overwritten.store(0, Ordering::Relaxed); for (i, col) in schema.cols.iter().enumerate() { let cd = col_desc_mut(buf, i); @@ -405,7 +415,8 @@ pub(crate) fn init_buf(buf: &mut [u8], schema: &Schema, chunk_size: u32, num_chu #[cfg(test)] mod tests { use super::*; - use crate::schema::{DType, Schema}; + use crate::memtable::push_plain_row; + use crate::schema::{DType, Schema, Value}; #[test] #[should_panic(expected = "buffer too small")] @@ -414,4 +425,25 @@ mod tests { let mut buf = vec![0u8; 32]; // way too small init_buf(&mut buf, &schema, 1024, 1); } + + #[test] + fn advance_chunk_counts_overwritten_rows() { + let schema = Schema::new().col("x", DType::I32); + let chunk_size = 128u32; + let num_chunks = 2u32; + let total = crate::layout::compute_data_offset(schema.cols.len()) + + chunk_size as usize * num_chunks as usize; + let mut buf = vec![0u8; total]; + init_buf(&mut buf, &schema, chunk_size, num_chunks); + + for i in 0..10_000i32 { + assert!(push_plain_row(&mut buf, &[Value::I32(i)])); + let (_, rows) = crate::layout::ring_overwrite_stats(&buf); + if rows > 0 { + assert!(rows >= 1); + return; + } + } + panic!("expected ring overwrite within 10_000 pushes"); + } } diff --git a/probing/proto/src/lib.rs b/probing/proto/src/lib.rs index 1743da0e..bf987f28 100644 --- a/probing/proto/src/lib.rs +++ b/probing/proto/src/lib.rs @@ -4,7 +4,9 @@ pub mod types; pub mod prelude { // --- Protocol Structures --- - pub use crate::protocol::cluster::{Cluster, Node, NodeReportRequest, NodeReportResponse}; + pub use crate::protocol::cluster::{ + Cluster, Node, NodeListResponse, NodeReportRequest, NodeReportResponse, + }; pub use crate::protocol::message::Message; pub use crate::protocol::process::{CallFrame, Process}; diff --git a/probing/proto/src/protocol/cluster.rs b/probing/proto/src/protocol/cluster.rs index 9bad2a69..2cbc6c95 100644 --- a/probing/proto/src/protocol/cluster.rs +++ b/probing/proto/src/protocol/cluster.rs @@ -43,11 +43,21 @@ pub struct NodeReportRequest { pub struct NodeReportResponse { pub ok: bool, pub version: u64, + /// Delta when the reporter's ``seen_version`` matches; full sync via paginated GET otherwise. pub nodes: Vec, #[serde(default)] pub removed: Vec, } +/// Paginated cluster node list (`GET /apis/nodes`). +#[derive(Debug, Default, Deserialize, Serialize, PartialEq, Eq, Clone)] +pub struct NodeListResponse { + pub version: u64, + pub total: usize, + pub offset: usize, + pub nodes: Vec, +} + impl Display for Node { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( diff --git a/probing/proto/src/protocol/message.rs b/probing/proto/src/protocol/message.rs index ece3f821..c7fc9046 100644 --- a/probing/proto/src/protocol/message.rs +++ b/probing/proto/src/protocol/message.rs @@ -17,6 +17,10 @@ pub struct Message { /// The actual message payload pub payload: T, + + /// Optional response metadata (e.g. federated fan-out quality on `/query`). + #[serde(default, skip_serializing_if = "Option::is_none")] + pub meta: Option, } impl Message { @@ -27,6 +31,7 @@ impl Message { message_id: None, timestamp: Self::now(), payload, + meta: None, } } diff --git a/probing/server/API.md b/probing/server/API.md index f35aba3c..d97c50d8 100644 --- a/probing/server/API.md +++ b/probing/server/API.md @@ -67,6 +67,7 @@ All handlers live in `python/probing/handlers/pythonext.py`, one canonical local | GET | `/apis/pythonext/ray/timeline` | `ray/timeline` | | GET | `/apis/pythonext/ray/timeline/chrome` | `ray/timeline/chrome` | | GET | `/apis/pythonext/magics` | `magics` | +| GET | `/apis/pythonext/flight-recorder/snapshot?include_stack_traces=&only_active=&persist=` | `flight-recorder/snapshot` | Rust-backed endpoints (`callstack`, `eval`) are thin `@ext_handler` wrappers around `probing._core.api_callstack` / `api_eval`. diff --git a/probing/server/src/cluster_http.rs b/probing/server/src/cluster_http.rs index 2eb8ec76..40864b74 100644 --- a/probing/server/src/cluster_http.rs +++ b/probing/server/src/cluster_http.rs @@ -1,7 +1,7 @@ use std::time::Duration; use anyhow::Result; -use probing_proto::prelude::{Node, NodeReportRequest, NodeReportResponse}; +use probing_proto::prelude::{Node, NodeListResponse, NodeReportRequest, NodeReportResponse}; pub fn get_i32_env(name: &str) -> Option { std::env::var(name) @@ -10,17 +10,38 @@ pub fn get_i32_env(name: &str) -> Option { .and_then(|v| v.parse().ok()) } +fn nodes_page_size() -> usize { + std::env::var("PROBING_CLUSTER_NODES_PAGE_SIZE") + .ok() + .and_then(|v| v.parse().ok()) + .filter(|&n| n > 0) + .unwrap_or(1024) +} + pub fn fetch_nodes_blocking(http_base: &str) -> Result> { - let url = format!("{}/apis/nodes", http_base.trim_end_matches('/')); - let text = ureq::get(&url) - .config() - .no_delay(true) - .timeout_global(Some(Duration::from_secs(10))) - .build() - .call()? - .body_mut() - .read_to_string()?; - Ok(serde_json::from_str(&text)?) + let base = http_base.trim_end_matches('/'); + let page_size = nodes_page_size(); + let mut offset = 0usize; + let mut all = Vec::new(); + loop { + let url = format!("{base}/apis/nodes?offset={offset}&limit={page_size}"); + let text = ureq::get(&url) + .config() + .no_delay(true) + .timeout_global(Some(Duration::from_secs(10))) + .build() + .call()? + .body_mut() + .read_to_string()?; + let resp: NodeListResponse = serde_json::from_str(&text)?; + let empty = resp.nodes.is_empty(); + all.extend(resp.nodes); + if all.len() >= resp.total || empty { + break; + } + offset = offset.saturating_add(page_size); + } + Ok(all) } pub fn put_nodes_blocking( diff --git a/probing/server/src/engine.rs b/probing/server/src/engine.rs index 84a51b28..03b17374 100644 --- a/probing/server/src/engine.rs +++ b/probing/server/src/engine.rs @@ -13,6 +13,7 @@ use probing_core::config; use crate::server::error::{ApiError, ApiResult}; +use probing_core::core::federation::{reset_fanout_stats, take_fanout_stats}; use probing_core::core::UnifiedMemtableProbeDataSource; pub use probing_core::ENGINE; use probing_python::extensions::python::PythonProbeDataSource; @@ -52,6 +53,7 @@ pub async fn initialize_engine() -> Result<()> { cc::start_cpu_sampling_from_env(); #[cfg(feature = "gpu")] gpu::start_gpu_sampling_from_env(); + crate::engine_lifecycle::mark_engine_ready(); } result.map_err(anyhow::Error::new) } @@ -100,6 +102,9 @@ async fn execute_set_via_config(key: &str, value: &str) -> Result<()> { } pub async fn handle_query(request: Query) -> Result { + if let Some(msg) = crate::engine_lifecycle::engine_not_ready_message() { + return Err(anyhow::anyhow!(msg)); + } let Query { expr, opts: _ } = request; // We are already running within the Axum/Tokio runtime. @@ -126,6 +131,7 @@ pub async fn handle_query(request: Query) -> Result { return Ok(QueryDataFormat::Nil); } + reset_fanout_stats(); let engine = ENGINE.read().await; log::debug!("Executing SELECT query: {expr}"); match engine.async_query(&expr).await { @@ -138,8 +144,34 @@ pub async fn handle_query(request: Query) -> Result { } } +fn fanout_meta_from_stats( + stats: probing_core::core::federation::FanoutStats, +) -> Option { + if stats.nodes_failed.is_empty() && stats.peer_batches_dropped == 0 { + return None; + } + Some(serde_json::json!({ + "fanout": { + "partial": true, + "nodes_succeeded": stats.nodes_succeeded, + "nodes_failed": stats.nodes_failed, + "peer_batches_dropped": stats.peer_batches_dropped, + } + })) +} + +fn query_response_partial(stats: &probing_core::core::federation::FanoutStats) -> bool { + !stats.nodes_failed.is_empty() || stats.peer_batches_dropped > 0 +} + +/// Serialized `/query` body plus whether federated fan-out was partial. +pub struct QueryHttpEnvelope { + pub body: String, + pub partial: bool, +} + // 处理Web API查询请求 -pub async fn query(req: String) -> ApiResult { +pub async fn query(req: String) -> ApiResult { let request = serde_json::from_str::>(&req); let request = match request { Ok(request) => request.payload, @@ -165,10 +197,22 @@ pub async fn query(req: String) -> ApiResult { }; // Wrap the payload in a Message - let reply_message = Message::new(reply_payload); + let stats = take_fanout_stats(); + let partial = query_response_partial(&stats); + if partial { + log::warn!( + "query fan-out partial: nodes_succeeded={} nodes_failed={} peer_batches_dropped={}", + stats.nodes_succeeded, + stats.nodes_failed.len(), + stats.peer_batches_dropped, + ); + } + let mut reply_message = Message::new(reply_payload); + reply_message.meta = fanout_meta_from_stats(stats); // Serialize the response message - serde_json::to_string(&reply_message) + let body = serde_json::to_string(&reply_message) .inspect_err(|e| log::error!("Failed to serialize query response: {e}")) - .map_err(|e| ApiError::internal(format!("Failed to create response: {e}"))) + .map_err(|e| ApiError::internal(format!("Failed to create response: {e}")))?; + Ok(QueryHttpEnvelope { body, partial }) } diff --git a/probing/server/src/engine_lifecycle.rs b/probing/server/src/engine_lifecycle.rs new file mode 100644 index 00000000..944e4001 --- /dev/null +++ b/probing/server/src/engine_lifecycle.rs @@ -0,0 +1,91 @@ +//! Engine initialization lifecycle — readiness for load balancers / orchestrators. + +use std::sync::atomic::{AtomicU8, Ordering}; + +use std::sync::Mutex; + +use once_cell::sync::Lazy; + +const UNINITIALIZED: u8 = 0; +const READY: u8 = 1; +const FAILED: u8 = 2; + +static STATE: AtomicU8 = AtomicU8::new(UNINITIALIZED); +static FAIL_REASON: Lazy>> = Lazy::new(|| Mutex::new(None)); + +fn lock_fail_reason() -> std::sync::MutexGuard<'static, Option> { + FAIL_REASON.lock().unwrap_or_else(|e| e.into_inner()) +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum EngineInitState { + Uninitialized, + Ready, + Failed(String), +} + +pub fn mark_engine_ready() { + *lock_fail_reason() = None; + STATE.store(READY, Ordering::Release); +} + +pub fn mark_engine_failed(reason: impl Into) { + let reason = reason.into(); + *lock_fail_reason() = Some(reason.clone()); + STATE.store(FAILED, Ordering::Release); +} + +pub fn engine_init_state() -> EngineInitState { + match STATE.load(Ordering::Acquire) { + READY => EngineInitState::Ready, + FAILED => EngineInitState::Failed( + lock_fail_reason() + .clone() + .unwrap_or_else(|| "engine initialization failed".into()), + ), + _ => EngineInitState::Uninitialized, + } +} + +pub fn engine_is_ready() -> bool { + STATE.load(Ordering::Acquire) == READY +} + +pub fn engine_not_ready_message() -> Option { + match engine_init_state() { + EngineInitState::Ready => None, + EngineInitState::Uninitialized => Some("engine not initialized yet".into()), + EngineInitState::Failed(reason) => Some(format!("engine initialization failed: {reason}")), + } +} + +pub fn engine_fail_fast_enabled() -> bool { + matches!( + std::env::var("PROBING_ENGINE_FAIL_FAST") + .ok() + .as_deref() + .map(str::trim), + Some("1") | Some("true") | Some("TRUE") | Some("on") | Some("ON") + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn ready_roundtrip() { + mark_engine_ready(); + assert!(engine_is_ready()); + assert_eq!(engine_init_state(), EngineInitState::Ready); + assert!(engine_not_ready_message().is_none()); + } + + #[test] + fn failed_surfaces_reason() { + mark_engine_failed("memtable missing"); + assert!(!engine_is_ready()); + let msg = engine_not_ready_message().unwrap(); + assert!(msg.contains("memtable missing")); + } +} diff --git a/probing/server/src/extensions.rs b/probing/server/src/extensions.rs index f34d10dc..fbafde42 100644 --- a/probing/server/src/extensions.rs +++ b/probing/server/src/extensions.rs @@ -53,9 +53,9 @@ impl Default for ServerProbeExtension { unix_socket: Maybe::Nothing, report_addr: Maybe::Nothing, auth_token: Maybe::Nothing, - max_connections: Maybe::Just(20), // Default to 20 connections - timeout: Maybe::Just(30), // Default timeout of 30 seconds - debug: Maybe::Just(false), // Debug mode off by default + max_connections: Maybe::Just(128), + timeout: Maybe::Just(30), // Default timeout of 30 seconds + debug: Maybe::Just(false), // Debug mode off by default log_level: Maybe::Just("info".to_string()), // Default log level assets_root: Maybe::Nothing, } diff --git a/probing/server/src/lib.rs b/probing/server/src/lib.rs index 323ac4e9..86e61bb4 100644 --- a/probing/server/src/lib.rs +++ b/probing/server/src/lib.rs @@ -7,6 +7,7 @@ pub mod auth; pub mod cluster_http; mod cluster_report_backoff; mod engine; +mod engine_lifecycle; mod extensions; pub mod memtable_ext; mod report; @@ -16,6 +17,7 @@ mod torchrun_cluster; mod vars; pub use self::engine::initialize_engine; +pub use self::engine_lifecycle::{engine_init_state, engine_is_ready}; pub use self::report::start_report_worker; pub use self::server::start_local; pub use self::server::start_remote; diff --git a/probing/server/src/mcp/helpers.rs b/probing/server/src/mcp/helpers.rs index 4b3ef0fb..70a01b41 100644 --- a/probing/server/src/mcp/helpers.rs +++ b/probing/server/src/mcp/helpers.rs @@ -1,6 +1,7 @@ //! Shared helpers for MCP tools (query shaping, write guard, audit). use probing_cli::cli::ctrl::ProbeEndpoint; +use probing_core::core::federation::take_fanout_stats; use probing_proto::prelude::{Ele, Query, QueryDataFormat}; use rmcp::ErrorData; @@ -85,7 +86,28 @@ pub async fn engine_query_json(sql: String, limit: usize) -> Result 0; let payload = serde_json::json!({ "dataframe": rows, - "meta": value.get("meta"), + "meta": meta, + "data_quality": { + "partial": partial, + }, }); Ok(text_result(payload.to_string())) } diff --git a/probing/server/src/report.rs b/probing/server/src/report.rs index 039fdb38..aea240da 100644 --- a/probing/server/src/report.rs +++ b/probing/server/src/report.rs @@ -46,7 +46,10 @@ async fn report_worker(report_addr: String, local_addr: String) { let outcome = if rank == 0 && report_addr == local_addr { let node = node.clone(); match tokio::task::spawn_blocking(move || { - probing_core::core::cluster::apply_node_report(vec![node]) + probing_core::core::cluster::apply_node_report( + vec![node], + probing_core::core::cluster::cluster_version(), + ) }) .await { diff --git a/probing/server/src/server/cluster.rs b/probing/server/src/server/cluster.rs index f474234f..70b15f8d 100644 --- a/probing/server/src/server/cluster.rs +++ b/probing/server/src/server/cluster.rs @@ -1,5 +1,5 @@ -use probing_core::core::cluster::{apply_node_report, get_nodes as core_get_nodes}; -use probing_proto::prelude::{Node, NodeReportRequest, NodeReportResponse}; +use probing_core::core::cluster::{apply_node_report, cluster_version, get_nodes_page}; +use probing_proto::prelude::{Node, NodeListResponse, NodeReportRequest, NodeReportResponse}; use serde::Deserialize; use super::error::{ApiError, ApiResult}; @@ -11,23 +11,54 @@ pub(crate) enum PutNodesBody { Single(Node), } +#[derive(Debug, Deserialize)] +pub(crate) struct GetNodesQuery { + #[serde(default)] + offset: usize, + #[serde(default = "default_page_limit")] + limit: usize, + #[serde(default)] + since_version: Option, +} + +fn default_page_limit() -> usize { + std::env::var("PROBING_CLUSTER_NODES_PAGE_SIZE") + .ok() + .and_then(|v| v.parse().ok()) + .filter(|&n| n > 0) + .unwrap_or(1024) +} + /// Register or heartbeat one or more cluster nodes; returns merged snapshot. /// /// Cluster merge runs on the blocking pool so the shared Tokio runtime stays responsive. pub(crate) async fn put_node( axum::Json(body): axum::Json, ) -> ApiResult> { - let nodes = match body { - PutNodesBody::Single(node) => vec![node], - PutNodesBody::Batch(req) => req.nodes, + let (nodes, seen_version) = match body { + PutNodesBody::Single(node) => (vec![node], cluster_version()), + PutNodesBody::Batch(req) => (req.nodes, req.seen_version), }; - let resp = tokio::task::spawn_blocking(move || apply_node_report(nodes)) + let resp = tokio::task::spawn_blocking(move || apply_node_report(nodes, seen_version)) .await .map_err(|e| ApiError::internal(format!("cluster report task failed: {e}")))?; Ok(axum::Json(resp)) } -/// Get all nodes in the cluster as JSON -pub async fn get_nodes() -> ApiResult>> { - Ok(axum::Json(core_get_nodes())) +/// Paginated cluster node list (`offset`, `limit`, optional `since_version`). +pub(crate) async fn get_nodes( + axum::extract::Query(query): axum::extract::Query, +) -> ApiResult> { + let limit = query.limit.min(10_000); + let (version, total, nodes) = tokio::task::spawn_blocking(move || { + get_nodes_page(query.offset, limit, query.since_version) + }) + .await + .map_err(|e| ApiError::internal(format!("cluster list task failed: {e}")))?; + Ok(axum::Json(NodeListResponse { + version, + total, + offset: query.offset, + nodes, + })) } diff --git a/probing/server/src/server/cluster_fanout.rs b/probing/server/src/server/cluster_fanout.rs index 4bbad9f6..550d35f8 100644 --- a/probing/server/src/server/cluster_fanout.rs +++ b/probing/server/src/server/cluster_fanout.rs @@ -14,12 +14,14 @@ //! JOIN / multi-statement SQL uses the legacy per-node broadcast path. use probing_core::core::cluster::{ - hierarchical_metadata_available, local_leaf_peers, local_listen_addrs, node_aggregator_peers, + hierarchical_metadata_available, hierarchical_metadata_unavailable_err, local_leaf_peers, + local_listen_addrs, node_aggregator_peers, }; use probing_core::core::federation::{ can_fanout_via_global_catalog, cluster_rank_for_endpoint, is_local0_from_env, - remote_query_timeout, reset_fanout_stats, rewrite_sql_for_global_fanout, take_fanout_stats, - with_fanout_scope, FanoutScope, + remote_fanout_concurrency, remote_query_timeout, reset_fanout_stats, + rewrite_sql_for_global_fanout, take_fanout_stats, validate_global_query, with_fanout_scope, + FanoutScope, }; use probing_proto::prelude::*; @@ -162,8 +164,73 @@ pub struct FanoutMeta { pub scope: String, pub nodes_queried: usize, pub nodes_failed: Vec, + /// Partial peer batches dropped while merging aggregate pushdown results. + #[serde(default)] + pub peer_batches_dropped: usize, pub node_aggregators_queried: usize, pub local_ranks_queried: usize, + /// True when some peers failed or merge dropped partial batches — dataframe is incomplete. + #[serde(default)] + pub partial: bool, +} + +impl FanoutMeta { + fn finalize(&mut self) { + self.partial = !self.nodes_failed.is_empty() || self.peer_batches_dropped > 0; + } +} + +fn finish_fanout(dataframe: DataFrame, mut meta: FanoutMeta, context: &str) -> FanoutQueryResponse { + meta.finalize(); + if meta.partial { + log::warn!( + "cluster fan-out partial ({context}): nodes_queried={} nodes_failed={} peer_batches_dropped={}", + meta.nodes_queried, + meta.nodes_failed.len(), + meta.peer_batches_dropped, + ); + } + FanoutQueryResponse { dataframe, meta } +} + +async fn fanout_remote_plain( + peers: Vec, + sql: &str, +) -> Vec<(Node, anyhow::Result)> { + use futures_util::stream::{self, StreamExt}; + let sql = sql.to_string(); + let concurrency = remote_fanout_concurrency(); + stream::iter(peers) + .map(|node| { + let sql = sql.clone(); + async move { + let result = remote_query_df(&node.addr, &sql).await; + (node, result) + } + }) + .buffer_unordered(concurrency) + .collect() + .await +} + +async fn fanout_remote_aggregate( + peers: Vec, + sql: &str, +) -> Vec<(Node, anyhow::Result)> { + use futures_util::stream::{self, StreamExt}; + let sql = sql.to_string(); + let concurrency = remote_fanout_concurrency(); + stream::iter(peers) + .map(|node| { + let sql = sql.clone(); + async move { + let result = remote_node_aggregate_df(&node.addr, &sql).await; + (node, result) + } + }) + .buffer_unordered(concurrency) + .collect() + .await } #[derive(Debug, Clone, serde::Serialize)] @@ -172,6 +239,18 @@ pub struct FanoutQueryResponse { pub meta: FanoutMeta, } +fn hierarchical_fanout_requested(hierarchical: bool) -> bool { + hierarchical && probing_core::core::federation::hierarchical_fanout_enabled() +} + +fn require_hierarchical_metadata() -> anyhow::Result<()> { + if hierarchical_metadata_available() { + Ok(()) + } else { + Err(hierarchical_metadata_unavailable_err()) + } +} + /// Run `sql` locally, optionally fanning out to peer nodes in the cluster view. pub async fn fanout_query( sql: &str, @@ -179,6 +258,9 @@ pub async fn fanout_query( hierarchical: bool, scope: ClusterFanoutScope, ) -> anyhow::Result { + if cluster { + validate_global_query(sql)?; + } if !cluster { return Ok(FanoutQueryResponse { dataframe: query_local_df(sql).await?, @@ -188,29 +270,44 @@ pub async fn fanout_query( scope: ClusterFanoutScope::Local.as_str().into(), nodes_queried: 1, nodes_failed: Vec::new(), + peer_batches_dropped: 0, node_aggregators_queried: 0, local_ranks_queried: 0, + partial: false, }, }); } - let resolved_scope = scope.resolve(hierarchical && hierarchical_fanout_requested(hierarchical)); + let hierarchical_requested = hierarchical_fanout_requested(hierarchical); + let resolved_scope = scope.resolve(hierarchical_requested); + + if hierarchical_requested { + match resolved_scope { + ClusterFanoutScope::Coordinator | ClusterFanoutScope::Node if is_local0_from_env() => { + require_hierarchical_metadata()?; + } + _ => {} + } + } match resolved_scope { ClusterFanoutScope::Local => { let dataframe = query_local_df(sql).await?; - Ok(FanoutQueryResponse { + Ok(finish_fanout( dataframe, - meta: FanoutMeta { + FanoutMeta { cluster: true, hierarchical, scope: resolved_scope.as_str().into(), nodes_queried: 1, nodes_failed: Vec::new(), + peer_batches_dropped: 0, node_aggregators_queried: 0, local_ranks_queried: 0, + partial: false, }, - }) + "local", + )) } ClusterFanoutScope::Node => fanout_node_tier(sql, hierarchical).await, ClusterFanoutScope::Coordinator => fanout_coordinator_tier(sql, hierarchical).await, @@ -218,26 +315,25 @@ pub async fn fanout_query( } } -fn hierarchical_fanout_requested(hierarchical: bool) -> bool { - hierarchical && probing_core::core::federation::hierarchical_fanout_enabled() -} - /// Node aggregator: local0 + on-node leaf ranks. async fn fanout_node_tier(sql: &str, hierarchical: bool) -> anyhow::Result { if !is_local0_from_env() { let dataframe = query_local_df(sql).await?; - return Ok(FanoutQueryResponse { + return Ok(finish_fanout( dataframe, - meta: FanoutMeta { + FanoutMeta { cluster: true, hierarchical, scope: ClusterFanoutScope::Local.as_str().into(), nodes_queried: 1, nodes_failed: Vec::new(), + peer_batches_dropped: 0, node_aggregators_queried: 0, local_ranks_queried: 0, + partial: false, }, - }); + "node-tier-local-fallback", + )); } let host = local_host_label(); @@ -257,11 +353,7 @@ async fn fanout_node_tier(sql: &str, hierarchical: bool) -> anyhow::Result anyhow::Result { - log::debug!("local leaf fan-out {} failed: {err}", node.addr); + log::warn!("local leaf fan-out {} failed: {err}", node.addr); nodes_failed.push(node.addr); } } } - Ok(FanoutQueryResponse { - dataframe: merge_tagged_dataframes(&parts), - meta: FanoutMeta { + Ok(finish_fanout( + merge_tagged_dataframes(&parts), + FanoutMeta { cluster: true, hierarchical, scope: ClusterFanoutScope::Node.as_str().into(), nodes_queried, nodes_failed, + peer_batches_dropped: 0, node_aggregators_queried: 0, local_ranks_queried, + partial: false, }, - }) + "node-tier", + )) } /// Global coordinator: node aggregators (+ on-node leaves via broadcast path). @@ -304,11 +399,11 @@ async fn fanout_coordinator_tier( sql: &str, hierarchical: bool, ) -> anyhow::Result { - if !hierarchical_fanout_requested(hierarchical) || !hierarchical_metadata_available() { - return fanout_flat(sql).await; + if hierarchical_fanout_requested(hierarchical) { + require_hierarchical_metadata()?; + return broadcast_fanout_query(sql, FanoutScope::Coordinator).await; } - - broadcast_fanout_query(sql, FanoutScope::Coordinator).await + fanout_flat(sql).await } /// Legacy flat fan-out to every registered peer. @@ -332,14 +427,15 @@ async fn fanout_via_global_catalog( }) })?; let stats = take_fanout_stats(); - Ok(FanoutQueryResponse { + Ok(finish_fanout( dataframe, - meta: FanoutMeta { + FanoutMeta { cluster: true, hierarchical: scope != FanoutScope::Flat, scope: scope.as_str().into(), nodes_queried: 1 + stats.nodes_succeeded, nodes_failed: stats.nodes_failed, + peer_batches_dropped: stats.peer_batches_dropped, node_aggregators_queried: if scope == FanoutScope::Coordinator { stats.nodes_succeeded } else { @@ -350,8 +446,10 @@ async fn fanout_via_global_catalog( } else { 0 }, + partial: false, }, - }) + "global-catalog", + )) } async fn broadcast_fanout_query( @@ -366,26 +464,24 @@ async fn broadcast_fanout_query( scope: scope.as_str().into(), nodes_queried: 0, nodes_failed: Vec::new(), + peer_batches_dropped: 0, node_aggregators_queried: 0, local_ranks_queried: 0, + partial: false, }; let node_part = fanout_node_tier(sql, true).await?; meta.local_ranks_queried = node_part.meta.local_ranks_queried; meta.nodes_queried += node_part.meta.nodes_queried; meta.nodes_failed.extend(node_part.meta.nodes_failed); + meta.peer_batches_dropped += node_part.meta.peer_batches_dropped; if !node_part.dataframe.is_empty() { parts.push(node_part.dataframe); } let node_aggs = node_aggregator_peers(); meta.node_aggregators_queried = node_aggs.len(); - let responses = - futures_util::future::join_all(node_aggs.into_iter().map(|node| async move { - let result = remote_node_aggregate_df(&node.addr, sql).await; - (node, result) - })) - .await; + let responses = fanout_remote_aggregate(node_aggs, sql).await; for (node, result) in responses { match result { @@ -403,16 +499,17 @@ async fn broadcast_fanout_query( meta.nodes_queried += 1; } Err(err) => { - log::debug!("node aggregator fan-out {} failed: {err}", node.addr); + log::warn!("node aggregator fan-out {} failed: {err}", node.addr); meta.nodes_failed.push(node.addr); } } } - return Ok(FanoutQueryResponse { - dataframe: merge_tagged_dataframes(&parts), + return Ok(finish_fanout( + merge_tagged_dataframes(&parts), meta, - }); + "coordinator-broadcast", + )); } let host = local_host_label(); @@ -446,15 +543,11 @@ async fn broadcast_fanout_query( }; let peer_count = peers.len(); - let responses = futures_util::future::join_all(peers.into_iter().map(|node| async move { - let result = if scope == FanoutScope::Coordinator { - remote_node_aggregate_df(&node.addr, sql).await - } else { - remote_query_df(&node.addr, sql).await - }; - (node, result) - })) - .await; + let responses = if scope == FanoutScope::Coordinator { + fanout_remote_aggregate(peers, sql).await + } else { + fanout_remote_plain(peers, sql).await + }; for (node, result) in responses { match result { @@ -472,20 +565,21 @@ async fn broadcast_fanout_query( nodes_queried += 1; } Err(err) => { - log::debug!("cluster fan-out {} failed: {err}", node.addr); + log::warn!("cluster fan-out {} failed: {err}", node.addr); nodes_failed.push(node.addr); } } } - Ok(FanoutQueryResponse { - dataframe: merge_tagged_dataframes(&parts), - meta: FanoutMeta { + Ok(finish_fanout( + merge_tagged_dataframes(&parts), + FanoutMeta { cluster: true, hierarchical: scope != FanoutScope::Flat, scope: scope.as_str().into(), nodes_queried, nodes_failed, + peer_batches_dropped: 0, node_aggregators_queried: if scope == FanoutScope::Coordinator { peer_count } else { @@ -496,8 +590,10 @@ async fn broadcast_fanout_query( } else { 0 }, + partial: false, }, - }) + "broadcast", + )) } fn tag_dataframe(mut df: DataFrame, host: &str, addr: &str, rank: Option) -> DataFrame { @@ -562,4 +658,30 @@ mod tests { assert_eq!(merged.len(), 2); assert!(merged.names.contains(&"extra".to_string())); } + + #[test] + fn fanout_meta_partial_when_peers_fail() { + let mut meta = FanoutMeta { + cluster: true, + hierarchical: true, + scope: "flat".into(), + nodes_queried: 10, + nodes_failed: vec!["10.0.0.2:8080".into()], + peer_batches_dropped: 0, + node_aggregators_queried: 0, + local_ranks_queried: 0, + partial: false, + }; + meta.finalize(); + assert!(meta.partial); + + let mut clean = meta.clone(); + clean.nodes_failed.clear(); + clean.finalize(); + assert!(!clean.partial); + + clean.peer_batches_dropped = 2; + clean.finalize(); + assert!(clean.partial); + } } diff --git a/probing/server/src/server/cluster_query.rs b/probing/server/src/server/cluster_query.rs index 6720390a..578593ce 100644 --- a/probing/server/src/server/cluster_query.rs +++ b/probing/server/src/server/cluster_query.rs @@ -5,6 +5,8 @@ use serde::{Deserialize, Serialize}; use super::cluster_fanout::{self, ClusterFanoutScope, FanoutQueryResponse}; use super::error::ApiResult; +use probing_core::core::cluster::is_hierarchical_metadata_unavailable; +use probing_core::core::federation::validate_global_query; #[derive(Debug, Deserialize, Serialize)] pub struct ClusterQueryRequest { @@ -41,13 +43,21 @@ impl From for ClusterQueryResponse { pub async fn post_cluster_query( Json(body): Json, ) -> ApiResult> { + if let Some(msg) = crate::engine_lifecycle::engine_not_ready_message() { + return Err(super::error::ApiError::service_unavailable(msg)); + } let expr = body.expr.trim(); if expr.is_empty() { return Err(super::error::ApiError::bad_request( "missing SQL expression", )); } - let result = - cluster_fanout::fanout_query(expr, body.cluster, body.hierarchical, body.scope).await?; - Ok(Json(result.into())) + validate_global_query(expr).map_err(|e| super::error::ApiError::bad_request(e.to_string()))?; + match cluster_fanout::fanout_query(expr, body.cluster, body.hierarchical, body.scope).await { + Ok(result) => Ok(Json(result.into())), + Err(err) if is_hierarchical_metadata_unavailable(&err) => { + Err(super::error::ApiError::service_unavailable(err.to_string())) + } + Err(err) => Err(err.into()), + } } diff --git a/probing/server/src/server/config.rs b/probing/server/src/server/config.rs index 28ef1bd3..17c09b43 100644 --- a/probing/server/src/server/config.rs +++ b/probing/server/src/server/config.rs @@ -15,6 +15,18 @@ pub fn get_max_request_body_size() -> usize { .unwrap_or(MAX_REQUEST_BODY_SIZE) } +/// HTTP connection limit — defaults to max(fan-out concurrency, 128). +pub fn effective_max_connections() -> usize { + if let Ok(raw) = std::env::var("PROBING_MAX_CONNECTIONS") { + if let Ok(n) = raw.trim().parse::() { + if n > 0 { + return n; + } + } + } + probing_core::core::federation::remote_fanout_concurrency().max(128) +} + /// Get maximum file size from environment or use default pub fn get_max_file_size() -> u64 { std::env::var("PROBING_MAX_FILE_SIZE") diff --git a/probing/server/src/server/error.rs b/probing/server/src/server/error.rs index 78178c56..fa7b69d2 100644 --- a/probing/server/src/server/error.rs +++ b/probing/server/src/server/error.rs @@ -39,6 +39,10 @@ impl ApiError { Self::new(StatusCode::INTERNAL_SERVER_ERROR, message) } + pub fn service_unavailable(message: impl Into) -> Self { + Self::new(StatusCode::SERVICE_UNAVAILABLE, message) + } + pub fn from_engine(err: EngineError) -> Self { match err { EngineError::CallError(msg) | EngineError::PluginNotFound(msg) => Self::not_found(msg), diff --git a/probing/server/src/server/health.rs b/probing/server/src/server/health.rs new file mode 100644 index 00000000..d7e801ec --- /dev/null +++ b/probing/server/src/server/health.rs @@ -0,0 +1,72 @@ +//! Liveness / readiness probes for orchestrators and load balancers. + +use axum::http::StatusCode; +use axum::response::IntoResponse; +use axum::Json; +use serde::Serialize; + +use crate::engine_lifecycle::{engine_init_state, EngineInitState}; + +#[derive(Serialize)] +struct LivenessResponse { + status: &'static str, +} + +#[derive(Serialize)] +struct ReadinessResponse { + status: &'static str, + #[serde(skip_serializing_if = "Option::is_none")] + reason: Option, +} + +/// Process is up and the HTTP server is accepting connections. +pub async fn liveness() -> impl IntoResponse { + (StatusCode::OK, Json(LivenessResponse { status: "ok" })) +} + +/// Engine finished initialization and can serve SQL queries. +pub async fn readiness() -> impl IntoResponse { + match engine_init_state() { + EngineInitState::Ready => ( + StatusCode::OK, + Json(ReadinessResponse { + status: "ready", + reason: None, + }), + ) + .into_response(), + EngineInitState::Uninitialized => ( + StatusCode::SERVICE_UNAVAILABLE, + Json(ReadinessResponse { + status: "starting", + reason: Some("engine not initialized yet".into()), + }), + ) + .into_response(), + EngineInitState::Failed(reason) => ( + StatusCode::SERVICE_UNAVAILABLE, + Json(ReadinessResponse { + status: "failed", + reason: Some(reason), + }), + ) + .into_response(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::engine_lifecycle::{mark_engine_failed, mark_engine_ready}; + + #[tokio::test] + async fn readiness_reflects_engine_state() { + mark_engine_ready(); + let resp = readiness().await.into_response(); + assert_eq!(resp.status(), StatusCode::OK); + + mark_engine_failed("boom"); + let resp = readiness().await.into_response(); + assert_eq!(resp.status(), StatusCode::SERVICE_UNAVAILABLE); + } +} diff --git a/probing/server/src/server/middleware.rs b/probing/server/src/server/middleware.rs index 270b2cea..a626847f 100644 --- a/probing/server/src/server/middleware.rs +++ b/probing/server/src/server/middleware.rs @@ -8,6 +8,35 @@ use axum::{ }; use bytes::Bytes; use http_body_util::BodyExt; +use std::sync::{Arc, LazyLock}; +use tokio::sync::Semaphore; + +static CONNECTION_SEMAPHORE: LazyLock> = LazyLock::new(|| { + Arc::new(Semaphore::new( + crate::server::config::effective_max_connections(), + )) +}); + +/// Reject new HTTP requests when the in-flight connection limit is reached. +pub async fn connection_limit_middleware(request: Request, next: Next) -> Response { + let permit = match CONNECTION_SEMAPHORE.clone().try_acquire_owned() { + Ok(permit) => permit, + Err(_) => { + log::warn!( + "connection limit reached (max {})", + crate::server::config::effective_max_connections() + ); + return ( + StatusCode::SERVICE_UNAVAILABLE, + "server connection limit reached", + ) + .into_response(); + } + }; + let response = next.run(request).await; + drop(permit); + response +} /// Middleware to limit request body size pub async fn request_size_limit_middleware(request: Request, next: Next) -> Response { diff --git a/probing/server/src/server/mod.rs b/probing/server/src/server/mod.rs index dcd612ef..f6216d80 100644 --- a/probing/server/src/server/mod.rs +++ b/probing/server/src/server/mod.rs @@ -12,6 +12,7 @@ pub mod cluster_query; pub mod config; pub mod error; pub mod file_api; +pub mod health; pub mod middleware; pub mod system; pub mod training; @@ -23,12 +24,16 @@ use axum::response::IntoResponse; use log::error; use crate::engine::{handle_query, initialize_engine}; -use crate::server::middleware::{request_logging_middleware, request_size_limit_middleware}; +use crate::server::middleware::{ + connection_limit_middleware, request_logging_middleware, request_size_limit_middleware, +}; use crate::server::repl::ws_handler; use probing_proto::prelude::Query; /// Top-level routes outside `/apis`. Keep in sync with `tests/regression/spec/api_spec.json`. pub const TOP_LEVEL_ROUTES: &[(&str, &str)] = &[ + ("GET", "/health"), + ("GET", "/ready"), ("POST", "/query"), ("POST", "/query/dto"), ("GET", "/config/{config_key}"), @@ -46,6 +51,8 @@ async fn get_config_value_handler( fn build_app(auth: bool) -> axum::Router { let mut app = spa::routes() + .route("/health", axum::routing::get(health::liveness)) + .route("/ready", axum::routing::get(health::readiness)) .route("/query", axum::routing::post(query)) .route("/query/dto", axum::routing::post(query_dto::query_dto)) .route( @@ -67,13 +74,24 @@ fn build_app(auth: bool) -> axum::Router { )); } - app.layer(axum::middleware::from_fn(request_logging_middleware)) - .layer(axum::middleware::from_fn(request_size_limit_middleware)) + app.layer(axum::middleware::from_fn(request_size_limit_middleware)) + .layer(axum::middleware::from_fn(request_logging_middleware)) + .layer(axum::middleware::from_fn(connection_limit_middleware)) } async fn query(body: String) -> impl IntoResponse { + if let Some(msg) = crate::engine_lifecycle::engine_not_ready_message() { + return ApiError::service_unavailable(msg).into_response(); + } match crate::engine::query(body).await { - Ok(response) => (StatusCode::OK, response).into_response(), + Ok(envelope) => { + let status = if envelope.partial { + StatusCode::SERVICE_UNAVAILABLE + } else { + StatusCode::OK + }; + (status, envelope.body).into_response() + } Err(api_error) => api_error.into_response(), } } @@ -92,7 +110,7 @@ pub async fn local_server() -> Result<()> { path.to_string_lossy().to_string() }; - eprintln!( + log::info!( "Starting local server at {}", socket_path.replace('\0', "@") ); @@ -104,9 +122,20 @@ pub async fn local_server() -> Result<()> { pub fn start_local() { SERVER_RUNTIME.block_on(async move { - initialize_engine() - .await - .unwrap_or_else(|err| error!("Failed to initialize engine: {err}")); + match initialize_engine().await { + Ok(()) => { + log::info!("probing engine initialized"); + } + Err(err) => { + let msg = err.to_string(); + error!("Failed to initialize engine: {msg}"); + crate::engine_lifecycle::mark_engine_failed(msg.clone()); + if crate::engine_lifecycle::engine_fail_fast_enabled() { + error!("PROBING_ENGINE_FAIL_FAST=1 — exiting"); + std::process::exit(1); + } + } + } }); SERVER_RUNTIME.spawn(async move { let _ = local_server().await; @@ -114,8 +143,6 @@ pub fn start_local() { } pub async fn remote_server(addr: Option) -> Result<()> { - use nu_ansi_term::Color::{Green, Red}; - let addr = addr.unwrap_or_else(|| "0.0.0.0:0".to_string()); log::info!("Starting probe server at {addr}"); @@ -129,16 +156,11 @@ pub async fn remote_server(addr: Option) -> Result<()> { *probing_address = addr.to_string(); } probing_core::core::cluster::set_local_listen_addrs(vec![addr.to_string()]); - eprintln!("{}", Red.bold().paint("probing server is available on:")); - eprintln!("\t{}", Green.bold().underline().paint(addr.to_string())); + log::info!("probing server is available on: {addr}"); probing_core::config::write("server.address", &addr.to_string()).await?; } Err(err) => { - eprintln!( - "{}", - Red.bold() - .paint(format!("error getting server address: {err}")) - ); + log::error!("error getting server address: {err}"); } } axum::serve(listener, app).await?; diff --git a/probing/server/src/server/query_dto.rs b/probing/server/src/server/query_dto.rs index 304b39a8..d18f036d 100644 --- a/probing/server/src/server/query_dto.rs +++ b/probing/server/src/server/query_dto.rs @@ -44,13 +44,16 @@ async fn handle_query_dto( /// Process the engine query and convert response to DTO format async fn process_engine_query(json_request: String) -> axum::response::Response { match crate::engine::query(json_request).await { - Ok(response_json) => convert_engine_response_to_dto(response_json).await, + Ok(envelope) => convert_engine_response_to_dto(envelope.body, envelope.partial).await, Err(api_error) => convert_engine_error_to_dto(api_error).await, } } /// Convert engine response to DTO format -async fn convert_engine_response_to_dto(response_json: String) -> axum::response::Response { +async fn convert_engine_response_to_dto( + response_json: String, + partial: bool, +) -> axum::response::Response { // Parse the response to convert to DTO format match serde_json::from_str::>(&response_json) { Ok(message_response) => { @@ -59,7 +62,14 @@ async fn convert_engine_response_to_dto(response_json: String) -> axum::response ); match serde_json::to_string(&response_dto) { - Ok(dto_response_json) => (StatusCode::OK, dto_response_json).into_response(), + Ok(dto_response_json) => { + let status = if partial { + StatusCode::SERVICE_UNAVAILABLE + } else { + StatusCode::OK + }; + (status, dto_response_json).into_response() + } Err(e) => ( StatusCode::INTERNAL_SERVER_ERROR, format!("Failed to serialize DTO response: {}", e), diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index 2ce79a20..9004a1f9 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -22,6 +22,7 @@ JOIN python.trace_event e ON s.span_id = e.span_id AND e.record_type = 'span_end' WHERE s.record_type = 'span_start' AND s.name = 'train.step' ORDER BY s.time ASC +LIMIT 10000 "#; const STEP_WINDOW: usize = 120; @@ -321,6 +322,13 @@ fn ele_as_f64(v: Option) -> f64 { mod tests { use super::*; + #[test] + fn step_matrix_sql_valid_for_cluster_fanout() { + use probing_core::core::federation::{sql_has_limit, validate_global_query}; + assert!(validate_global_query(STEP_MATRIX_SQL).is_ok()); + assert!(sql_has_limit(STEP_MATRIX_SQL)); + } + #[test] fn aggregate_normalizes_legacy_single_process_rank() { let rows = vec![RawStepRow { diff --git a/probing/server/src/torchrun_cluster.rs b/probing/server/src/torchrun_cluster.rs index 4ce86b83..c0ed4bee 100644 --- a/probing/server/src/torchrun_cluster.rs +++ b/probing/server/src/torchrun_cluster.rs @@ -402,16 +402,14 @@ fn ensure_local0_parent() -> bool { } fn apply_global_snapshot(resp: &probing_proto::prelude::NodeReportResponse) { - if resp.nodes.is_empty() { + if resp.nodes.is_empty() && resp.removed.is_empty() { return; } - let local_base = local_http_base(); - let version = resp.version; - if let Err(err) = put_nodes_blocking(&local_base, resp.nodes.clone(), version) { - log::debug!("probing torchrun: apply global snapshot failed: {err}"); - } else { - CLUSTER_VERSION.store(version, Ordering::Relaxed); - } + probing_core::core::cluster::apply_snapshot_delta( + resp.nodes.clone(), + &resp.removed, + resp.version, + ); } fn report_once() -> ReportOutcome { @@ -426,7 +424,7 @@ fn report_once() -> ReportOutcome { match put_nodes_blocking(&parent, nodes, seen) { Ok(resp) => { CLUSTER_VERSION.store(resp.version, Ordering::Relaxed); - if global_rank() != 0 && local_rank() == 0 && !resp.nodes.is_empty() { + if global_rank() != 0 && local_rank() == 0 { apply_global_snapshot(&resp); } classify_report_outcome(true, true, Some(&resp)) diff --git a/probing/server/tests/hierarchical_cluster_report.rs b/probing/server/tests/hierarchical_cluster_report.rs index 780cd792..b909ce02 100644 --- a/probing/server/tests/hierarchical_cluster_report.rs +++ b/probing/server/tests/hierarchical_cluster_report.rs @@ -6,7 +6,9 @@ use std::time::{SystemTime, UNIX_EPOCH}; use axum::{extract::State, routing::get, Json, Router}; use probing_core::sync::lock_mutex; -use probing_proto::prelude::{Cluster, Node, NodeReportRequest, NodeReportResponse}; +use probing_proto::prelude::{ + Cluster, Node, NodeListResponse, NodeReportRequest, NodeReportResponse, +}; use probing_server::cluster_http::{fetch_nodes_blocking, put_nodes_blocking}; use probing_server::server::SERVER_RUNTIME; use tokio::net::TcpListener; @@ -45,6 +47,9 @@ async fn put_nodes_handler( State(state): State, Json(body): Json, ) -> Json { + let version_before = state.version.load(Ordering::Relaxed); + let seen_version = body.seen_version; + let incoming = body.nodes.clone(); let mut cluster = lock_mutex(&state.cluster, "hierarchical_cluster_report cluster"); for mut node in body.nodes { if node.timestamp == 0 { @@ -56,8 +61,11 @@ async fn put_nodes_handler( cluster.put(node); } let version = state.version.fetch_add(1, Ordering::Relaxed) + 1; - let mut nodes = cluster.list(); - nodes.sort_by_key(|n| n.rank.unwrap_or(i32::MAX)); + let nodes = if seen_version >= version_before { + incoming + } else { + vec![] + }; Json(NodeReportResponse { ok: true, version, @@ -66,11 +74,17 @@ async fn put_nodes_handler( }) } -async fn get_nodes_handler(State(state): State) -> Json> { +async fn get_nodes_handler(State(state): State) -> Json { let cluster = lock_mutex(&state.cluster, "hierarchical_cluster_report cluster"); let mut nodes = cluster.list(); nodes.sort_by_key(|n| n.rank.unwrap_or(i32::MAX)); - Json(nodes) + let version = state.version.load(Ordering::Relaxed); + Json(NodeListResponse { + version, + total: nodes.len(), + offset: 0, + nodes, + }) } async fn spawn_cluster_server() -> String { diff --git a/python/probing/bundled_skills/catalog.yaml b/python/probing/bundled_skills/catalog.yaml index b8621b7b..0791cae6 100644 --- a/python/probing/bundled_skills/catalog.yaml +++ b/python/probing/bundled_skills/catalog.yaml @@ -156,6 +156,8 @@ skills: priority: 5 description: Rank collective ops by total and p99 latency tables: + - nccl.coll_perf + - nccl.proxy_ops - python.comm_collective - rdma.mlx_hca pages: diff --git a/python/probing/bundled_skills/comm_bottleneck/SKILL.md b/python/probing/bundled_skills/comm_bottleneck/SKILL.md index 649d0fe6..64100bdb 100644 --- a/python/probing/bundled_skills/comm_bottleneck/SKILL.md +++ b/python/probing/bundled_skills/comm_bottleneck/SKILL.md @@ -3,7 +3,7 @@ name: comm_bottleneck description: > Rank collective ops by total and p99 latency category: distributed -tables: [python.comm_collective, nccl.proxy_ops, rdma.mlx_hca] +tables: [nccl.coll_perf, nccl.proxy_ops, python.comm_collective, rdma.mlx_hca] tags: [NCCL, collective, communication, 通信, all_reduce] keywords: en: ['communication slow', 'NCCL', 'collective', 'comm bottleneck'] @@ -18,6 +18,15 @@ parameters: 按 collective op 聚合延迟与传输量,定位通信热点。 适用于「计算不慢但 step 时间长」或「通信占比高」的场景。 +## 数据层次(勿混淆计时语义) + +| 层 | 表 | 计时 | +|----|----|------| +| NCCL profiler 插件(**优先**) | `nccl.coll_perf`、`nccl.proxy_ops` | NCCL 原生事件,执行时间/带宽精准(见 `timing_source`) | +| Torch API 层插桩(回退) | `python.comm_collective` | Python 墙钟,launch 层粗粒度;独有 `global_step` 上下文 | + +NCCL 插件启用时 Torch 侧插桩默认关闭(`probing.torch.collective.enable=1` 可强制同开)。 + ## Parameters - `step_window` (integer, default `50`): diff --git a/python/probing/bundled_skills/comm_bottleneck/steps.yaml b/python/probing/bundled_skills/comm_bottleneck/steps.yaml index 62ab49e6..b4c06d3b 100644 --- a/python/probing/bundled_skills/comm_bottleneck/steps.yaml +++ b/python/probing/bundled_skills/comm_bottleneck/steps.yaml @@ -15,6 +15,12 @@ metadata: 按 collective op 聚合延迟与传输量,定位通信热点。 适用于「计算不慢但 step 时间长」或「通信占比高」的场景。 + 数据分两层,勿混淆计时语义: + - nccl.coll_perf / nccl.proxy_ops(NCCL profiler 插件):NCCL 原生事件, + 执行时间与带宽精准,优先采信; + - python.comm_collective(Torch API 层插桩):Python 墙钟,仅 launch 层 + 粗粒度,插件不可用时的回退,胜在带训练步(global_step)上下文。 + spec: parameters: - name: step_window @@ -26,12 +32,32 @@ spec: requires: any_tables: - - python.comm_collective + - nccl.coll_perf - nccl.proxy_ops + - python.comm_collective steps: + - id: nccl_coll_bw + title: "NCCL 精准带宽 (coll_perf, 按 op/消息大小)" + type: sql + sql: | + SELECT + coll_func, + msg_size_bytes, + timing_source, + count(*) AS ops, + avg(algobw_gbps) AS avg_gbps, + min(algobw_gbps) AS min_gbps, + avg(exec_time_ns) / 1e6 AS avg_exec_ms + FROM {nccl_coll_table} + GROUP BY coll_func, msg_size_bytes, timing_source + ORDER BY avg_gbps ASC + LIMIT 15 + on_empty: skip + empty_message: "无 nccl.coll_perf — 需 NCCL profiler 插件;以下退回 Torch API 层粗粒度数据" + - id: op_summary - title: "各 collective op 统计" + title: "各 collective op 统计 (Torch API 层, 粗粒度)" type: sql sql: | SELECT @@ -48,11 +74,11 @@ spec: ) GROUP BY op ORDER BY sum(duration_ms) DESC - on_empty: abort - empty_message: "无 comm_collective 数据" + on_empty: skip + empty_message: "无 comm_collective 数据(NCCL 插件启用时 Torch 侧插桩默认关闭,属预期)" - id: op_by_step - title: "每 step 通信总耗时" + title: "每 step 通信总耗时 (Torch API 层)" type: sql sql: | SELECT @@ -70,7 +96,7 @@ spec: on_empty: skip - id: slowest_calls - title: "最慢的 collective 调用" + title: "最慢的 collective 调用 (Torch API 层)" type: sql sql: | SELECT global_step, rank, op, duration_ms, bytes, tensor_shape @@ -100,7 +126,7 @@ spec: GROUP BY coll_func ORDER BY total_recv_wait_ns DESC on_empty: skip - empty_message: "无 nccl.proxy_ops — 仅 python.comm_collective 粗粒度可用" + empty_message: "无 nccl.proxy_ops — 仅 Torch API 层粗粒度数据可用" - id: rdma_hint title: "RDMA 端口速率 (Linux)" @@ -116,6 +142,7 @@ spec: variables: table_comm: "{comm_table}" nccl_proxy_table: "{nccl_proxy_table}" + nccl_coll_table: "{nccl_coll_table}" interpretation: rules: @@ -131,12 +158,14 @@ spec: summary_template: | ## 通信瓶颈 - - **op_summary**: 哪个 op 总耗时最高 + - **nccl_coll_bw**: NCCL 精准带宽(有则优先采信;注意 timing_source 列) + - **op_summary**: Torch API 层各 op 总耗时(粗粒度回退) - **slowest_calls**: 极端慢调用 - rank 不均衡 → skill: slow_rank next_steps: - "all_reduce 慢 → 检查 bucket 大小、overlap、FP16 compress" + - "某消息桶带宽异常低 → 对照 timing_source(enqueue 回退行不代表执行带宽)" - "某 step comm_ms 尖峰 → 对照 checkpoint / eval 边界" - "RoCE 拥塞 → 查 rdma.mlx_hca 与交换机 ECN 配置" - "有 proxy wait 数据 → skill: nccl_culprit_victim" diff --git a/python/probing/bundled_skills/nccl_culprit_victim/SKILL.md b/python/probing/bundled_skills/nccl_culprit_victim/SKILL.md index 9e3d3753..261a5b7a 100644 --- a/python/probing/bundled_skills/nccl_culprit_victim/SKILL.md +++ b/python/probing/bundled_skills/nccl_culprit_victim/SKILL.md @@ -19,6 +19,9 @@ Uses **NCCL profiler plugin** wait decomposition (`nccl.proxy_ops`): - **Culprit** (slow local GPU): high `send_gpu_wait_ns` - **Victim** (waiting on peers / network): high `recv_wait_ns` +- **Receiver congestion** (v4 ABI only): high `send_peer_wait_ns` — this rank's + sends are stalled waiting for the *peer's* clear-to-send credits; investigate + that peer Requires `NCCL_PROFILER_PLUGIN` + `probing-nccl-profiler` (or mock data via `PROBING_NCCL_MOCK` on macOS). diff --git a/python/probing/bundled_skills/nccl_culprit_victim/steps.yaml b/python/probing/bundled_skills/nccl_culprit_victim/steps.yaml index 1c2992f3..a53e2466 100644 --- a/python/probing/bundled_skills/nccl_culprit_victim/steps.yaml +++ b/python/probing/bundled_skills/nccl_culprit_victim/steps.yaml @@ -15,6 +15,7 @@ metadata: 基于 nccl.proxy_ops 的 ProxyStep wait 分解,区分: - culprit:send_gpu_wait_ns 高(本 rank GPU/计算慢) - victim:recv_wait_ns 高(等 peer / 网络) + - send_peer_wait_ns 高(仅 v4 ABI):等接收端 credits → 对端拥塞信号 需要 NCCL_PROFILER_PLUGIN 加载 probing-nccl-profiler;开发机可用 PROBING_NCCL_MOCK=1。 spec: @@ -44,6 +45,7 @@ spec: sum(send_gpu_wait_ns) AS total_gpu_wait_ns, sum(recv_wait_ns) AS total_recv_wait_ns, sum(send_wait_ns) AS total_send_wait_ns, + sum(send_peer_wait_ns) AS total_peer_wait_ns, avg(send_gpu_wait_ns) AS avg_gpu_wait_ns, avg(recv_wait_ns) AS avg_recv_wait_ns FROM {nccl_proxy_table} @@ -57,7 +59,7 @@ spec: empty_message: | 无 nccl.proxy_ops 数据。确认: - export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) - - export NCCL_PROFILE_EVENT_MASK=26 + - export NCCL_PROFILE_EVENT_MASK=94 - 或 macOS 开发: PROBING_NCCL_MOCK=1 PROBING=1 - id: culprit_ranking @@ -189,10 +191,12 @@ spec: ## NCCL culprit / victim - **culprit_ranking**: `send_gpu_wait_ns` 最高 → 本地算力瓶颈 - **victim_ranking**: `recv_wait_ns` 最高 → 等待他人或网络 + - **rank_wait_summary.total_peer_wait_ns**(仅 v4 ABI)高 → 对端接收拥塞 - **role_aligned**: 同 tp/pp/dp 切片对比(Megatron 拓扑) - 若仅有 python.comm_collective → skill: comm_bottleneck next_steps: - "culprit 持续同一 rank → gpu_pressure / module_bottleneck" - "victim 全体偏高 → 网络/RoCE: comm_bottleneck (rdma.mlx_hca)" + - "send_peer_wait_ns 偏高 → 对端 rank 接收侧拥塞,检查该 peer 的 GPU/网络" - "单 rank victim + 其他 culprit → 典型 straggler: slow_rank" diff --git a/python/probing/bundled_skills/semantic/tables.yaml b/python/probing/bundled_skills/semantic/tables.yaml index 06f4c7bc..6df6f262 100644 --- a/python/probing/bundled_skills/semantic/tables.yaml +++ b/python/probing/bundled_skills/semantic/tables.yaml @@ -32,8 +32,8 @@ tables: - "默认仅 forward hook;backward hook 默认关闭" python.comm_collective: - description: "torch.distributed 集合通信调用记录(all_reduce、broadcast 等)" - synonyms: [collective, communication, NCCL, 通信, all_reduce] + description: "torch.distributed API 层集合通信记录(Python 墙钟计时,粗粒度回退;精准 NCCL 数据在 nccl.* 表)" + synonyms: [collective, communication, 通信, all_reduce, torch.distributed] key_columns: micro_step: "最细粒度步计数" local_step: "本 rank 训练步" @@ -49,10 +49,66 @@ tables: tensor_shape: "张量 shape 字符串" tensor_dtype: "张量 dtype" bytes: "通信字节数" - duration_ms: "墙钟耗时(毫秒)" + duration_ms: "Python API 调用墙钟耗时(毫秒)— launch 层计时,非 NCCL 执行时间" async_op: "1=异步 collective,0=同步" global_name: global.python.comm_collective federation_columns: [_host, _addr, _rank, _role] + notes: + - "来源:torch.distributed monkey-patch(Torch API 层),NCCL profiler 插件启用时默认关闭" + - "查执行时间/带宽/等待分解请用 nccl.coll_perf / nccl.proxy_ops(NCCL 原生事件)" + - "本表独有训练步上下文(global_step 等),可与 nccl.* 按时间窗对齐" + + python.torch_nccl_flight_record: + description: "PyTorch Flight Recorder collective 环形缓冲快照(NCCL watchdog timeout / desync 诊断)" + synonyms: [Flight Recorder, NCCL watchdog, collective desync, watchdog timeout, 反同步] + key_columns: + snapshot_id: "probing 触发 snapshot 的时间戳(纳秒)" + rank: "torch.distributed rank" + world_size: "world size" + record_id: "PyTorch Flight Recorder 记录 id" + pg_id: "ProcessGroup id" + pg_name: "ProcessGroup 名称" + pg_desc: "ProcessGroup 描述" + collective_seq_id: "进程组内 collective 序号" + p2p_seq_id: "P2P 序号" + op_id: "PyTorch op id" + profiling_name: "collective 名称,如 nccl:all_reduce" + state: "collective 状态,如 scheduled/started/completed" + input_sizes: "输入 tensor size JSON" + input_dtypes: "输入 dtype JSON" + output_sizes: "输出 tensor size JSON" + output_dtypes: "输出 dtype JSON" + time_created_ns: "记录创建时间" + time_discovered_started_ns: "发现 started 的时间" + time_discovered_completed_ns: "发现 completed 的时间" + duration_ns: "collective duration(若 PyTorch 提供)" + timeout_ms: "watchdog timeout 配置" + retired: "1=已从活跃集合退休" + is_p2p: "1=P2P op" + frames: "调用栈 JSON" + top_frame: "调用栈代表帧" + global_name: global.python.torch_nccl_flight_record + federation_columns: [_host, _addr, _rank, _role] + notes: + - "由 /apis/pythonext/flight-recorder/snapshot 触发写入" + - "需要 PyTorch >= 2.5 的 torch._C._distributed_c10d._dump_nccl_trace" + + python.torch_nccl_pg_status: + description: "PyTorch Flight Recorder ProcessGroup 状态快照" + synonyms: [Flight Recorder PG, process group status, NCCL PG] + key_columns: + snapshot_id: "probing 触发 snapshot 的时间戳(纳秒)" + rank: "torch.distributed rank" + world_size: "world size" + pg_id: "ProcessGroup id" + pg_name: "ProcessGroup 名称" + pg_desc: "ProcessGroup 描述" + ranks: "ProcessGroup 成员 rank 字符串" + last_enqueued_collective: "最后入队 collective seq" + last_started_collective: "最后 started collective seq" + last_completed_collective: "最后 completed collective seq" + global_name: global.python.torch_nccl_pg_status + federation_columns: [_host, _addr, _rank, _role] python.trace_event: description: "分布式 tracing:span 起止与自定义 event(python.tracing)" @@ -219,7 +275,7 @@ tables: description: "NCCL profiler plugin proxy-op wait 分解(culprit / victim 归因)" synonyms: [NCCL proxy, send_gpu_wait, recv_wait, culprit, victim, proxy wait] key_columns: - ts: "事件时间戳(纳秒)" + ts: "事件时间戳(UNIX epoch 纳秒)" rank: "torch.distributed rank" tp_rank: "张量并行 rank(未知 -1)" pp_rank: "流水线并行 rank(未知 -1)" @@ -231,17 +287,73 @@ tables: peer: "对端 rank" is_send: "1=send proxy,0=recv proxy" n_steps: "聚合的 ProxyStep 数" - trans_bytes: "传输字节数" + trans_bytes: "传输字节数(v4 按 step 累计)" send_gpu_wait_ns: "Culprit 信号 — 本地 GPU 未就绪发送" + send_peer_wait_ns: "等待接收端 clear-to-send credits(仅 v4 ABI;v3 为 0)— 对端拥塞信号" send_wait_ns: "发送侧网络等待" recv_wait_ns: "Victim 信号 — 等待对端数据" recv_flush_wait_ns: "接收 flush 等待" global_name: global.nccl.proxy_ops federation_columns: [_host, _addr, _rank, _role] notes: - - "需 NCCL_PROFILER_PLUGIN + NCCL ≥ 2.26(mask Coll|ProxyOp|ProxyStep)" + - "需 NCCL_PROFILER_PLUGIN;插件同时导出 v4(NCCL ≥ 2.27)与 v3(NCCL 2.26)ABI,NCCL 自动选最高版本" + - "mask Coll|P2P|ProxyOp|ProxyStep|KernelCh,默认 94" - "macOS 开发:PROBING_NCCL_MOCK=1 可注入合成数据" + nccl.coll_perf: + description: "NCCL collective / P2P 级性能(timing_source 标注计时来源;消息大小、算法、带宽)" + synonyms: [collective perf, algobw, busbw, NCCL bandwidth, 集合通信带宽, message size] + key_columns: + ts: "op 完成时间戳(UNIX epoch 纳秒)" + rank: "torch.distributed rank" + tp_rank: "张量并行 rank(未知 -1)" + pp_rank: "流水线并行 rank(未知 -1)" + dp_rank: "数据并行 rank(未知 -1)" + comm_hash: "NCCL communicator hash" + n_ranks: "通信组大小(v4 init 提供;v3 为 -1)— busbw 换算用" + coll_func: "操作名(AllReduce、AllGather、Send、Recv…)" + seq: "collective 序号(P2P 为 0)" + is_p2p: "1=P2P(Send/Recv),0=collective" + peer: "P2P 对端 rank(collective 为 -1)" + count: "元素个数" + msg_size_bytes: "消息大小 = count × dtype 字节数" + dtype: "NCCL 数据类型名" + algo: "NCCL 算法(Ring、Tree…;P2P 为空)" + proto: "NCCL 协议(LL、LL128、Simple…)" + n_channels: "最大 channel 数(v4 起 P2P 也有值)" + exec_time_ns: "实际执行耗时(纳秒);由 timing_source 对应事件窗口重建" + enqueue_time_ns: "host 侧 enqueue 耗时(纳秒;NCCL coll stopEvent 语义)" + timing_source: "exec_time 来源:kernel_gpu(GPU globaltimer,v4)> kernel_ch(host 观测)> proxy > enqueue(回退)" + algobw_gbps: "算法带宽 msg_size/exec_time(GB/s);busbw 需乘集合通信系数" + global_name: global.nccl.coll_perf + federation_columns: [_host, _addr, _rank, _role] + notes: + - "NCCL coll stopEvent 只代表 enqueue 完成;exec_time_ns 由子事件(KernelCh/ProxyOp)引用计数重建" + - "v4 ABI 下 timing_source=kernel_gpu,来自 GPU globaltimer(设备时钟,最精确)" + - "busbw 换算:AllReduce 乘 2(n-1)/n,n 取 n_ranks(v3 行 n_ranks=-1 时需从外部推断)" + - "PROBING_NCCL_MIN_MSG_BYTES 可过滤小消息" + + nccl.inflight_ops: + description: "在途(已 start 未 stop)NCCL 操作周期快照 — hang 诊断信号" + synonyms: [inflight, hang, stuck collective, 挂死, 卡住, watchdog] + key_columns: + ts: "快照时间戳(UNIX epoch 纳秒)" + rank: "torch.distributed rank" + comm_hash: "NCCL communicator hash" + coll_func: "操作名(未知为 unknown)" + seq: "collective 序号" + kind: "coll / p2p / proxy_op" + channel_id: "NCCL channel(proxy_op 有效)" + peer: "对端 rank(未知 -1)" + is_send: "1=send,0=recv(proxy_op 有效)" + start_ns: "op 开始时间戳(epoch 纳秒)" + age_ns: "快照时刻已持续时长(纳秒)" + global_name: global.nccl.inflight_ops + federation_columns: [_host, _addr, _rank, _role] + notes: + - "挂死的 op 不会出现在 nccl.proxy_ops / nccl.coll_perf(永远不 stop),查这张表" + - "PROBING_NCCL_INFLIGHT_THRESHOLD_SECS 控制快照阈值(默认 10s,0 关闭)" + nccl.net_qp: description: "NCCL NetPlugin IB QP 完成耗时(可选 mask bit 128)" synonyms: [IB QP, RoCE, net plugin, qp duration] diff --git a/python/probing/crash.py b/python/probing/crash.py index 7a005a37..f9fa320f 100644 --- a/python/probing/crash.py +++ b/python/probing/crash.py @@ -17,6 +17,57 @@ _PREV_EXCEPTHOOK: Optional[Callable] = None _PREV_THREAD_EXCEPTHOOK: Optional[Callable] = None +_TRUE = {"1", "true", "yes", "on", "enable", "enabled"} +_FALSE = {"0", "false", "no", "off", "disable", "disabled"} + + +def _flag(value: Optional[str]) -> Optional[bool]: + if value is None: + return None + normalized = str(value).strip().lower() + if normalized in _TRUE: + return True + if normalized in _FALSE: + return False + return None + + +def _flight_recorder_on_watchdog_enabled() -> bool: + try: + import probing + + explicit = _flag(probing.config.get_str("probing.fr.on_watchdog")) + if explicit is not None: + return explicit + except Exception: + explicit = None + raw = os.environ.get("PROBING_FR_ON_WATCHDOG", "auto").strip().lower() + if raw in _FALSE: + return False + if raw in _TRUE or raw == "on": + return True + return raw == "auto" + + +def _looks_like_nccl_watchdog(exc_value: BaseException) -> bool: + text = f"{type(exc_value).__name__} {exc_value}".lower() + return "watchdog" in text and ( + "nccl" in text or "worknccl" in text or "collective" in text + ) + + +def _maybe_snapshot_flight_recorder(exc_value: BaseException) -> None: + if not _flight_recorder_on_watchdog_enabled(): + return + if not _looks_like_nccl_watchdog(exc_value): + return + try: + from probing.profiling.flight_recorder import snapshot + + snapshot(only_active=True, persist=True) + except Exception: + pass + def _call_original_excepthook( exc_type: Type[BaseException], @@ -87,6 +138,7 @@ def _dispatch( except Exception: crash_thread = "" thread_stacks = _capture_thread_stacks() + _maybe_snapshot_flight_recorder(exc_value) code = record_crash( kind, diff --git a/python/probing/ext/megatron.py b/python/probing/ext/megatron.py new file mode 100644 index 00000000..f251e1a7 --- /dev/null +++ b/python/probing/ext/megatron.py @@ -0,0 +1,336 @@ +"""Megatron-LM / Megatron-Core autostart integration for probing. + +When ``PROBING`` is active, probing registers import hooks on Megatron modules and: + +* syncs ``probing.set_role`` from ``megatron.core.parallel_state`` after init +* wraps ``train_step`` to align ``probing.step`` with Megatron iteration / microbatches + +All hooks are best-effort and no-op when Megatron is absent or APIs differ across versions. +""" + +from __future__ import annotations + +import functools +import logging +import os +import sys +from typing import Any, Callable, Optional + +import probing + +logger = logging.getLogger(__name__) + +_TRUE = {"1", "true", "yes", "on", "enable", "enabled"} +_FALSE = {"0", "false", "no", "off", "disable", "disabled"} + +_PARALLEL_STATE_INIT = False +_TRAINING_INIT = False +_LAST_ROLE: Optional[str] = None +_LAST_ITERATION: Optional[int] = None + +# Megatron-style env vars that indicate a Megatron job even before import. +_MEGATRON_ENV_MARKERS = ( + "TENSOR_MODEL_PARALLEL_RANK", + "TENSOR_MODEL_PARALLEL_SIZE", + "PIPELINE_MODEL_PARALLEL_RANK", + "PIPELINE_MODEL_PARALLEL_SIZE", + "DATA_PARALLEL_RANK", + "DATA_PARALLEL_SIZE", + "MEGATRON_CORE_VERSION", +) + + +def _flag(value: Optional[str]) -> Optional[bool]: + if value is None: + return None + normalized = str(value).strip().lower() + if normalized in _TRUE: + return True + if normalized in _FALSE: + return False + return None + + +def _config_flag(name: str) -> Optional[bool]: + return _flag(probing.config.get_str(name)) + + +def megatron_job_detected() -> bool: + if any(os.environ.get(key) for key in _MEGATRON_ENV_MARKERS): + return True + return any( + name == "megatron" or name.startswith("megatron.") for name in sys.modules + ) + + +def megatron_autostart_enabled() -> bool: + explicit = _config_flag("probing.megatron.enable") + if explicit is not None: + return explicit + raw = os.environ.get("PROBING_MEGATRON", "auto").strip().lower() + if raw in _FALSE: + return False + if raw in _TRUE or raw == "on": + return True + return megatron_job_detected() + + +def step_sync_enabled() -> bool: + explicit = _config_flag("probing.megatron.step_sync") + if explicit is not None: + return explicit + raw = os.environ.get("PROBING_MEGATRON_STEP_SYNC", "auto").strip().lower() + if raw in _FALSE: + return False + if raw in _TRUE or raw == "on": + return True + return megatron_autostart_enabled() + + +def _safe_int(value: Any) -> Optional[int]: + if value is None: + return None + try: + parsed = int(value) + except (TypeError, ValueError): + return None + return parsed if parsed >= 0 else None + + +def _call_rank_getter(obj: Any, names: tuple[str, ...]) -> Optional[int]: + for name in names: + fn = getattr(obj, name, None) + if not callable(fn): + continue + try: + value = _safe_int(fn()) + if value is not None: + return value + except Exception: + continue + return None + + +def _parallel_state_initialized(ps: Any) -> bool: + for name in ( + "model_parallel_is_initialized", + "is_initialized", + ): + fn = getattr(ps, name, None) + if callable(fn): + try: + return bool(fn()) + except Exception: + continue + # Some ranks initialize lazily; attempt rank reads anyway. + return ( + _call_rank_getter( + ps, + ("get_tensor_model_parallel_rank", "get_tensor_model_parallel_world_rank"), + ) + is not None + ) + + +def role_dims_from_parallel_state(ps: Any) -> dict[str, int]: + if not _parallel_state_initialized(ps): + return {} + + dims: dict[str, int] = {} + mapping = ( + ("tp", ("get_tensor_model_parallel_rank",)), + ("pp", ("get_pipeline_model_parallel_rank",)), + ("dp", ("get_data_parallel_rank",)), + ("ep", ("get_expert_model_parallel_rank",)), + ("cp", ("get_context_parallel_rank",)), + ) + for name, getters in mapping: + value = _call_rank_getter(ps, getters) + if value is not None: + dims[name] = value + return dims + + +def sync_role_from_parallel_state(ps: Any | None = None) -> Optional[str]: + """Read Megatron parallel ranks and push them into ``probing.set_role``.""" + global _LAST_ROLE + if ps is None: + try: + from megatron.core import parallel_state as ps # type: ignore + except ImportError: + return None + + dims = role_dims_from_parallel_state(ps) + if not dims: + return None + + role = probing.set_role(**dims) + if role and role != _LAST_ROLE: + logger.info("Megatron parallel role synced: %s", role) + _LAST_ROLE = role + return role + + +def _read_megatron_iteration() -> Optional[int]: + try: + from megatron.training import global_vars + except ImportError: + return None + + args = None + get_args = getattr(global_vars, "get_args", None) + if callable(get_args): + try: + args = get_args() + except Exception: + args = None + + if args is not None: + for attr in ("iteration", "curr_iteration", "train_iters"): + value = _safe_int(getattr(args, attr, None)) + if value is not None: + return value + return None + + +def _read_num_microbatches() -> Optional[int]: + try: + from megatron.core.num_microbatches_calculator import ( + get_num_microbatches, # type: ignore + ) + except ImportError: + get_num_microbatches = None + + if callable(get_num_microbatches): + try: + return _safe_int(get_num_microbatches()) + except Exception: + pass + + try: + from megatron.training import global_vars + + get_args = getattr(global_vars, "get_args", None) + if callable(get_args): + args = get_args() + for attr in ("global_batch_size", "micro_batch_size"): + if not hasattr(args, attr): + continue + gbs = _safe_int(getattr(args, "global_batch_size", None)) + mbs = _safe_int(getattr(args, "micro_batch_size", None)) + if gbs is not None and mbs is not None and mbs > 0: + return max(1, gbs // mbs) + except Exception: + pass + return None + + +def sync_step_from_megatron(*, force: bool = False) -> None: + """Align probing step coordinates with Megatron iteration when available.""" + global _LAST_ITERATION + if not step_sync_enabled(): + return + + micro_batches = _read_num_microbatches() + if micro_batches is not None: + probing.step(micro_batches=micro_batches) + else: + micro_batches = int(probing.step.snapshot().micro_batches) or 1 + + iteration = _read_megatron_iteration() + if iteration is None: + return + if not force and iteration == _LAST_ITERATION: + return + + # Megatron ``iteration`` is an optimizer step (probing local_step), not micro_step. + probing.step(iteration * micro_batches) + _LAST_ITERATION = iteration + + +def _wrap_callable(module: Any, attr: str, wrapper_builder: Callable) -> None: + original = getattr(module, attr, None) + if original is None or getattr(original, "_probing_wrapped", False): + return + + wrapped = wrapper_builder(original) + wrapped._probing_wrapped = True # type: ignore[attr-defined] + setattr(module, attr, wrapped) + + +def _wrap_initialize_model_parallel(ps: Any) -> None: + def builder(original): + @functools.wraps(original) + def wrapped(*args, **kwargs): + result = original(*args, **kwargs) + sync_role_from_parallel_state(ps) + return result + + return wrapped + + _wrap_callable(ps, "initialize_model_parallel", builder) + + +def init_parallel_state() -> None: + """Import-hook entry when ``megatron.core.parallel_state`` loads.""" + global _PARALLEL_STATE_INIT + if _PARALLEL_STATE_INIT or not megatron_autostart_enabled(): + return + _PARALLEL_STATE_INIT = True + + try: + from megatron.core import parallel_state as ps # type: ignore + except ImportError: + return + + sync_role_from_parallel_state(ps) + _wrap_initialize_model_parallel(ps) + + +def _wrap_train_step(training_mod: Any) -> None: + def builder(original): + @functools.wraps(original) + def wrapped(*args, **kwargs): + sync_step_from_megatron(force=True) + sync_role_from_parallel_state() + return original(*args, **kwargs) + + return wrapped + + _wrap_callable(training_mod, "train_step", builder) + + +def init_training() -> None: + """Import-hook entry when ``megatron.training.training`` loads.""" + global _TRAINING_INIT + if _TRAINING_INIT or not megatron_autostart_enabled(): + return + _TRAINING_INIT = True + + try: + import megatron.training.training as training_mod # type: ignore + except ImportError: + return + + if step_sync_enabled(): + _wrap_train_step(training_mod) + sync_step_from_megatron(force=True) + sync_role_from_parallel_state() + + +def maybe_autostart() -> None: + """Best-effort autostart when Megatron was imported before probing hooks.""" + if not megatron_autostart_enabled(): + return + + if "megatron.core.parallel_state" in sys.modules: + init_parallel_state() + if "megatron.training.training" in sys.modules: + init_training() + elif megatron_job_detected(): + sync_role_from_parallel_state() + + +def init() -> None: + """Generic init alias — runs pending autostart if modules are already loaded.""" + maybe_autostart() diff --git a/python/probing/ext/torch.py b/python/probing/ext/torch.py index 3cb39297..c6ef5186 100644 --- a/python/probing/ext/torch.py +++ b/python/probing/ext/torch.py @@ -57,6 +57,16 @@ def collective_hook(): maybe_start_collective_tracing() +def megatron_hook(): + """Autostart Megatron role/step sync when Megatron loads before torch hooks.""" + try: + from probing.ext.megatron import maybe_autostart + + maybe_autostart() + except Exception: + pass + + _hook_registered = False @@ -71,6 +81,7 @@ def init(): register_optimizer_step_post_hook(optimizer_step_post_hook) collective_hook() + megatron_hook() try: from probing.crash import install diff --git a/python/probing/handlers/pythonext.py b/python/probing/handlers/pythonext.py index 49a27d24..63165474 100644 --- a/python/probing/handlers/pythonext.py +++ b/python/probing/handlers/pythonext.py @@ -420,6 +420,22 @@ def start_pytorch_profile(steps: int = 1) -> str: ) +@ext_handler("pythonext", "flight-recorder/snapshot") +def snapshot_flight_recorder( + include_stack_traces: bool = True, + only_active: bool = False, + persist: bool = True, +) -> str: + """Persist PyTorch NCCL Flight Recorder data into probing tables.""" + from probing.profiling.flight_recorder import snapshot_json + + return snapshot_json( + include_stack_traces=include_stack_traces, + only_active=only_active, + persist=persist, + ) + + def get_pytorch_profile() -> str: """Get PyTorch profiler profile data. diff --git a/python/probing/hooks/import_hook.py b/python/probing/hooks/import_hook.py index a5c4702a..01291fbe 100644 --- a/python/probing/hooks/import_hook.py +++ b/python/probing/hooks/import_hook.py @@ -31,12 +31,32 @@ def _get_ray_init(): return lambda: None +def _get_megatron_parallel_state_init(): + try: + from probing.ext.megatron import init_parallel_state + + return init_parallel_state + except ImportError: + return lambda: None + + +def _get_megatron_training_init(): + try: + from probing.ext.megatron import init_training + + return init_training + except ImportError: + return lambda: None + + # Mapping from module names to callback functions # Callbacks are called when the module is imported # Use lazy loading to avoid import errors register = { "torch": _get_torch_init(), "ray": _get_ray_init(), + "megatron.core.parallel_state": _get_megatron_parallel_state_init(), + "megatron.training.training": _get_megatron_training_init(), } # Record modules that have been triggered diff --git a/python/probing/nccl/__init__.py b/python/probing/nccl/__init__.py index 47aba0c4..99a7a12e 100644 --- a/python/probing/nccl/__init__.py +++ b/python/probing/nccl/__init__.py @@ -8,8 +8,8 @@ __all__ = ["plugin_path", "DEFAULT_EVENT_MASK", "seed_mock", "maybe_auto_seed"] -# Coll | ProxyOp | ProxyStep -DEFAULT_EVENT_MASK = 26 +# Coll | P2P | ProxyOp | ProxyStep | KernelCh +DEFAULT_EVENT_MASK = 94 _LIB_BASENAME = "libprobing_nccl_profiler" _ENV_OVERRIDE = "PROBING_NCCL_PROFILER" diff --git a/python/probing/nccl/mock.py b/python/probing/nccl/mock.py index 84626678..158d3dd7 100644 --- a/python/probing/nccl/mock.py +++ b/python/probing/nccl/mock.py @@ -8,6 +8,8 @@ from typing import Iterable PROXY_OPS_TABLE = "nccl.proxy_ops" +COLL_PERF_TABLE = "nccl.coll_perf" +INFLIGHT_OPS_TABLE = "nccl.inflight_ops" NET_QP_TABLE = "nccl.net_qp" PROXY_OPS_COLUMNS = [ @@ -25,11 +27,50 @@ "n_steps", "trans_bytes", "send_gpu_wait_ns", + "send_peer_wait_ns", "send_wait_ns", "recv_wait_ns", "recv_flush_wait_ns", ] +COLL_PERF_COLUMNS = [ + "ts", + "rank", + "tp_rank", + "pp_rank", + "dp_rank", + "comm_hash", + "n_ranks", + "coll_func", + "seq", + "is_p2p", + "peer", + "count", + "msg_size_bytes", + "dtype", + "algo", + "proto", + "n_channels", + "exec_time_ns", + "enqueue_time_ns", + "timing_source", + "algobw_gbps", +] + +INFLIGHT_OPS_COLUMNS = [ + "ts", + "rank", + "comm_hash", + "coll_func", + "seq", + "kind", + "channel_id", + "peer", + "is_send", + "start_ns", + "age_ns", +] + NET_QP_COLUMNS = [ "ts", "rank", @@ -83,6 +124,7 @@ def _proxy_row( n_steps: int = 4, trans_bytes: int = 1 << 20, send_gpu_wait_ns: int = 0, + send_peer_wait_ns: int = 0, send_wait_ns: int = 0, recv_wait_ns: int = 0, recv_flush_wait_ns: int = 0, @@ -106,6 +148,7 @@ def _proxy_row( n_steps, trans_bytes, send_gpu_wait_ns, + send_peer_wait_ns, send_wait_ns, recv_wait_ns, recv_flush_wait_ns, @@ -180,11 +223,69 @@ def _iter_proxy_rows( channel_id=0, is_send=1, send_gpu_wait_ns=200_000, + send_peer_wait_ns=50_000, # v4-only signal (v3 rows: 0) send_wait_ns=300_000, recv_wait_ns=250_000, ) +def _iter_coll_perf_rows( + ranks: int, + ops_per_rank: int, + base_ts_ns: int, +) -> Iterable[list[object]]: + msg_bytes = 1 << 24 # 16 MiB fp16 AllReduce + for seq in range(ops_per_rank): + ts = base_ts_ns + seq * 10_000_000 + for rank in range(ranks): + # culprit rank finishes slower → lower bandwidth + exec_ns = 9_000_000 if rank == _CULPRIT_RANK else 3_000_000 + tp = rank % 2 + pp = (rank // 2) % 2 + dp = rank // 4 + yield [ + ts + exec_ns, + rank, + tp, + pp, + dp, + 0xDEAD_BEEF, + ranks, # n_ranks: communicator size (v4 init metadata) + "AllReduce", + seq, + 0, # is_p2p + -1, # peer + msg_bytes // 2, # fp16 count + msg_bytes, + "ncclFloat16", + "Ring", + "Simple", + 4, + exec_ns, + 50_000, # enqueue_time_ns: host-side enqueue is much shorter + "kernel_gpu", # v4: GPU globaltimer window + msg_bytes / exec_ns, # bytes/ns == GB/s + ] + + +def _iter_inflight_rows(base_ts_ns: int) -> Iterable[list[object]]: + # victim rank stuck in an AllReduce for 30s (hang scenario) + age_ns = 30_000_000_000 + yield [ + base_ts_ns, + _VICTIM_RANK, + 0xDEAD_BEEF, + "AllReduce", + 99, + "coll", + -1, + -1, + -1, + base_ts_ns - age_ns, + age_ns, + ] + + def _iter_net_qp_rows( ranks: int, ops_per_rank: int, base_ts_ns: int ) -> Iterable[list[object]]: @@ -203,7 +304,7 @@ def _iter_net_qp_rows( def seed_mock(*, ranks: int = 8, ops_per_rank: int = 5) -> dict[str, int]: - """Write synthetic rows into ``nccl.proxy_ops`` and ``nccl.net_qp``. + """Write synthetic rows into the ``nccl.*`` mock tables. Returns row counts per table. Safe to call multiple times (appends more rows). """ @@ -215,11 +316,24 @@ def seed_mock(*, ranks: int = 8, ops_per_rank: int = 5) -> dict[str, int]: proxy_rows = list(_iter_proxy_rows(ranks, ops_per_rank, base_ts_ns)) proxy.append_many(proxy_rows) + coll = ExternalTable.get_or_create(COLL_PERF_TABLE, COLL_PERF_COLUMNS) + coll_rows = list(_iter_coll_perf_rows(ranks, ops_per_rank, base_ts_ns)) + coll.append_many(coll_rows) + + inflight = ExternalTable.get_or_create(INFLIGHT_OPS_TABLE, INFLIGHT_OPS_COLUMNS) + inflight_rows = list(_iter_inflight_rows(base_ts_ns)) + inflight.append_many(inflight_rows) + net = ExternalTable.get_or_create(NET_QP_TABLE, NET_QP_COLUMNS) net_rows = list(_iter_net_qp_rows(ranks, ops_per_rank, base_ts_ns)) net.append_many(net_rows) - return {PROXY_OPS_TABLE: len(proxy_rows), NET_QP_TABLE: len(net_rows)} + return { + PROXY_OPS_TABLE: len(proxy_rows), + COLL_PERF_TABLE: len(coll_rows), + INFLIGHT_OPS_TABLE: len(inflight_rows), + NET_QP_TABLE: len(net_rows), + } def maybe_auto_seed() -> bool: diff --git a/python/probing/profiling/collective/coll.py b/python/probing/profiling/collective/coll.py index 80171b24..51b271e7 100644 --- a/python/probing/profiling/collective/coll.py +++ b/python/probing/profiling/collective/coll.py @@ -1,3 +1,15 @@ +"""Torch-API-level collective tracer (legacy, coarse). + +Monkey-patches ``torch.distributed`` collectives and measures **Python +wall-clock around the API call** (for ``async_op`` the timing closes at +``work.wait()``). This is *launch/API* timing — not NCCL execution time. + +For precise, NCCL-native data (kernel/proxy-reconstructed execution time, +wait decomposition, bandwidth) use the NCCL profiler plugin's ``nccl.*`` +tables instead; this tracer is the fallback when the plugin is unavailable +and is disabled by default when the plugin is active (see ``config.py``). +""" + import logging import os import time @@ -14,6 +26,8 @@ record_comm_lite, ) +logger = logging.getLogger(__name__) + function_names = [ "all_reduce", "all_gather", @@ -54,8 +68,10 @@ def get_participating_ranks( return group_rank, group_size, ranks except Exception as e: - print( - f"[Rank {dist.get_rank()}] all_gather_object failed: {e}. Using fallback method." + logger.warning( + "[rank %s] all_gather_object failed: %s; using TCPStore fallback", + dist.get_rank(), + e, ) try: @@ -94,7 +110,7 @@ def get_participating_ranks( return group_rank, group_size, ranks except Exception as e: - print(f"[Rank {rank}] Failed to get ranks via TCPStore: {e}") + logger.warning("[rank %s] failed to get ranks via TCPStore: %s", rank, e) return group_rank, group_size, [dist.get_rank() for _ in range(group_size)] @@ -124,12 +140,12 @@ def __init__( if hasattr(dist, func_name): self.hooked_functions[func_name] = getattr(dist, func_name) else: - print( - f"!!! Function {func_name} not found in torch.distributed, skipped" + logger.debug( + "function %s not found in torch.distributed, skipped", func_name ) if not self.hooked_functions: - print("!!! WARNING !!! No functions found to trace") + logger.warning("no torch.distributed functions found to trace") self.call_counts = {fn: 0 for fn in self.hooked_functions} self.my_rank = 0 @@ -155,11 +171,9 @@ def _maybe_sync(self) -> None: def _log(self, message): if not self._logged_active and self._should_trace(): self._logged_active = True - logging.getLogger(__name__).debug( - "CollectiveTracer active (distributed job)" - ) + logger.debug("CollectiveTracer active (distributed job)") if self.verbose: - print(message) + logger.info("%s", message) if self.trace_file: ranked_filename = f"{self.trace_file}-{self.global_rank}" with open(ranked_filename, "a") as f: diff --git a/python/probing/profiling/collective/config.py b/python/probing/profiling/collective/config.py index f7fcc743..d618c719 100644 --- a/python/probing/profiling/collective/config.py +++ b/python/probing/profiling/collective/config.py @@ -56,11 +56,36 @@ def is_distributed_torch_job() -> bool: return False +def nccl_profiler_plugin_active() -> bool: + """True when the NCCL profiler plugin is configured for this process. + + The plugin collects precise, NCCL-native events into ``nccl.*`` tables; + when it is active the Torch-API-level tracer (``python.comm_collective``, + Python wall-clock) is redundant for timing purposes. + """ + return bool(os.environ.get("NCCL_PROFILER_PLUGIN", "").strip()) + + def collective_tracing_enabled() -> bool: - """Resolve whether collective hooks should be installed.""" + """Resolve whether Torch-side collective hooks should be installed. + + Policy: + 1. Explicit ``probing.torch.collective.enable`` always wins. + 2. If the NCCL profiler plugin is active, default **off** — the plugin's + ``nccl.*`` tables are the precise source; keeping both on would record + the same collectives twice with conflicting timing semantics. + 3. Otherwise, default on for multi-rank torch jobs (coarse fallback). + """ explicit = _flag(probing.config.get_str("probing.torch.collective.enable")) if explicit is not None: return explicit + if nccl_profiler_plugin_active(): + logger.info( + "Torch-side collective tracing disabled: NCCL profiler plugin is " + "active (nccl.* tables). Set probing.torch.collective.enable=1 " + "to force both." + ) + return False return is_distributed_torch_job() diff --git a/python/probing/profiling/collective/record.py b/python/probing/profiling/collective/record.py index 60b04b2d..eb6b6357 100644 --- a/python/probing/profiling/collective/record.py +++ b/python/probing/profiling/collective/record.py @@ -1,5 +1,11 @@ """Persisted collective communication rows (query as ``python.comm_collective``). +**Timing semantics**: ``duration_ms`` is Python wall-clock around the +``torch.distributed`` API call (launch/API layer) — not NCCL execution time. +Precise NCCL-native timing lives in ``nccl.coll_perf`` / ``nccl.proxy_ops`` +(NCCL profiler plugin); this table is the coarse fallback and carries the +training-step context (``global_step`` etc.) that the plugin tables lack. + ``lite`` mode (default): one ``comm_collective`` row + closed ``trace_event`` pair (timing + context, no span stack / ``inspect.stack``). diff --git a/python/probing/profiling/flight_recorder.py b/python/probing/profiling/flight_recorder.py new file mode 100644 index 00000000..295f20ac --- /dev/null +++ b/python/probing/profiling/flight_recorder.py @@ -0,0 +1,274 @@ +"""PyTorch NCCL Flight Recorder bridge. + +This module reads PyTorch's in-process Flight Recorder buffer and persists a +flattened view into probing mmap tables. PyTorch exposes the data through an +unstable/private API, so all calls are feature-detected and best-effort. +""" + +from __future__ import annotations + +import json +import os +import pickle +import time +from dataclasses import dataclass +from typing import Any, Iterable + +from probing.core import table + + +@table("torch_nccl_flight_record") +@dataclass +class TorchNcclFlightRecord: + """PyTorch Flight Recorder collective entries.""" + + snapshot_id: int = 0 + rank: int = -1 + world_size: int = -1 + record_id: int = -1 + pg_id: str = "" + pg_name: str = "" + pg_desc: str = "" + collective_seq_id: int = -1 + p2p_seq_id: int = -1 + op_id: int = -1 + profiling_name: str = "" + state: str = "" + input_sizes: str = "" + input_dtypes: str = "" + output_sizes: str = "" + output_dtypes: str = "" + time_created_ns: int = -1 + time_discovered_started_ns: int = -1 + time_discovered_completed_ns: int = -1 + duration_ns: int = -1 + timeout_ms: int = -1 + retired: int = 0 + is_p2p: int = 0 + frames: str = "" + top_frame: str = "" + + +@table("torch_nccl_pg_status") +@dataclass +class TorchNcclPgStatus: + """PyTorch Flight Recorder process-group status.""" + + snapshot_id: int = 0 + rank: int = -1 + world_size: int = -1 + pg_id: str = "" + pg_name: str = "" + pg_desc: str = "" + ranks: str = "" + last_enqueued_collective: int = -1 + last_started_collective: int = -1 + last_completed_collective: int = -1 + + +def _json(value: Any) -> str: + if value is None: + return "" + try: + return json.dumps(value, ensure_ascii=False, sort_keys=True) + except Exception: + return str(value) + + +def _int(value: Any, default: int = -1) -> int: + if value is None: + return default + try: + return int(value) + except (TypeError, ValueError): + return default + + +def _bool_int(value: Any) -> int: + return 1 if bool(value) else 0 + + +def _rank_world() -> tuple[int, int]: + try: + import torch.distributed as dist + + if dist.is_available() and dist.is_initialized(): + return int(dist.get_rank()), int(dist.get_world_size()) + except Exception: + pass + + def env_int(name: str, default: int) -> int: + try: + return int(os.environ.get(name, str(default))) + except ValueError: + return default + + return env_int("RANK", -1), env_int("WORLD_SIZE", -1) + + +def _pg_parts(value: Any) -> tuple[str, str, str]: + if isinstance(value, (tuple, list)): + pg_name = str(value[0]) if len(value) > 0 else "" + pg_desc = str(value[1]) if len(value) > 1 else "" + return pg_name, pg_desc, _json(value) + if value is None: + return "", "", "" + text = str(value) + return text, "", text + + +def _top_frame(frames: Iterable[Any]) -> str: + for frame in frames: + if not isinstance(frame, dict): + return str(frame) + name = str(frame.get("name") or "") + filename = str(frame.get("filename") or "") + line = _int(frame.get("line"), 0) + if filename or name: + return f"{name} ({filename}:{line})" + return "" + + +def _dump_nccl_trace( + *, + include_collectives: bool = True, + include_stack_traces: bool = True, + only_active: bool = False, +) -> dict[str, Any]: + import torch + + c10d = getattr(getattr(torch, "_C", None), "_distributed_c10d", None) + dump = getattr(c10d, "_dump_nccl_trace", None) + if dump is None: + raise RuntimeError( + "PyTorch Flight Recorder API is unavailable " + "(requires torch._C._distributed_c10d._dump_nccl_trace, PyTorch >= 2.5)" + ) + + try: + payload = dump( + includeCollectives=include_collectives, + includeStackTraces=include_stack_traces, + onlyActive=only_active, + ) + except TypeError: + payload = dump() + + data = pickle.loads(payload) + if not isinstance(data, dict): + raise RuntimeError(f"unexpected Flight Recorder payload type: {type(data)!r}") + return data + + +def snapshot( + *, + include_stack_traces: bool = True, + only_active: bool = False, + persist: bool = True, +) -> dict[str, Any]: + """Read the local rank Flight Recorder buffer and optionally persist rows.""" + + snapshot_id = time.time_ns() + rank, world_size = _rank_world() + data = _dump_nccl_trace( + include_collectives=True, + include_stack_traces=include_stack_traces, + only_active=only_active, + ) + + records: list[TorchNcclFlightRecord] = [] + for entry in data.get("entries") or []: + if not isinstance(entry, dict): + continue + frames = entry.get("frames") or [] + pg_name, pg_desc, pg_repr = _pg_parts(entry.get("process_group")) + records.append( + TorchNcclFlightRecord( + snapshot_id=snapshot_id, + rank=rank, + world_size=world_size, + record_id=_int(entry.get("record_id")), + pg_id=str(entry.get("pg_id") or pg_name or pg_repr), + pg_name=pg_name, + pg_desc=pg_desc, + collective_seq_id=_int(entry.get("collective_seq_id")), + p2p_seq_id=_int(entry.get("p2p_seq_id")), + op_id=_int(entry.get("op_id")), + profiling_name=str(entry.get("profiling_name") or ""), + state=str(entry.get("state") or ""), + input_sizes=_json(entry.get("input_sizes")), + input_dtypes=_json(entry.get("input_dtypes")), + output_sizes=_json(entry.get("output_sizes")), + output_dtypes=_json(entry.get("output_dtypes")), + time_created_ns=_int(entry.get("time_created_ns")), + time_discovered_started_ns=_int( + entry.get("time_discovered_started_ns") + ), + time_discovered_completed_ns=_int( + entry.get("time_discovered_completed_ns") + ), + duration_ns=_int(entry.get("duration_ns")), + timeout_ms=_int(entry.get("timeout_ms")), + retired=_bool_int(entry.get("retired")), + is_p2p=_bool_int(entry.get("is_p2p")), + frames=_json(frames), + top_frame=_top_frame(frames), + ) + ) + + statuses: list[TorchNcclPgStatus] = [] + pg_config = data.get("pg_config") or {} + pg_status = data.get("pg_status") or {} + for pg_id, status in pg_status.items(): + if not isinstance(status, dict): + continue + cfg = pg_config.get(pg_id) if isinstance(pg_config, dict) else None + cfg = cfg if isinstance(cfg, dict) else {} + statuses.append( + TorchNcclPgStatus( + snapshot_id=snapshot_id, + rank=rank, + world_size=world_size, + pg_id=str(pg_id), + pg_name=str(cfg.get("name") or pg_id), + pg_desc=str(cfg.get("desc") or ""), + ranks=str(cfg.get("ranks") or ""), + last_enqueued_collective=_int(status.get("last_enqueued_collective")), + last_started_collective=_int(status.get("last_started_collective")), + last_completed_collective=_int(status.get("last_completed_collective")), + ) + ) + + if persist: + if records: + TorchNcclFlightRecord.append_many(records) + if statuses: + TorchNcclPgStatus.append_many(statuses) + + return { + "ok": True, + "snapshot_id": snapshot_id, + "rank": rank, + "world_size": world_size, + "records": len(records), + "process_groups": len(statuses), + "version": str(data.get("version") or ""), + "comm_lib_version": str(data.get("comm_lib_version") or ""), + } + + +def snapshot_json( + *, + include_stack_traces: bool = True, + only_active: bool = False, + persist: bool = True, +) -> str: + try: + result = snapshot( + include_stack_traces=include_stack_traces, + only_active=only_active, + persist=persist, + ) + except Exception as exc: + result = {"ok": False, "error": str(exc)} + return json.dumps(result, ensure_ascii=False, sort_keys=True) diff --git a/python/probing/skills/loader.py b/python/probing/skills/loader.py index 766edcef..cbf49a3a 100644 --- a/python/probing/skills/loader.py +++ b/python/probing/skills/loader.py @@ -227,14 +227,33 @@ def default_parameters(skill: Skill) -> Dict[str, Any]: def derived_variables(params: Mapping[str, Any]) -> Dict[str, str]: use_global = bool(params.get("use_global", False)) + # Torch-API-level tracer (coarse fallback, Python wall-clock) comm = "global.python.comm_collective" if use_global else "python.comm_collective" + # NCCL profiler plugin (precise, NCCL-native events) nccl_proxy = "global.nccl.proxy_ops" if use_global else "nccl.proxy_ops" + nccl_coll = "global.nccl.coll_perf" if use_global else "nccl.coll_perf" + nccl_inflight = "global.nccl.inflight_ops" if use_global else "nccl.inflight_ops" net_qp = "global.nccl.net_qp" if use_global else "nccl.net_qp" + # PyTorch Flight Recorder bridge (watchdog / desync) + fr = ( + "global.python.torch_nccl_flight_record" + if use_global + else "python.torch_nccl_flight_record" + ) + fr_status = ( + "global.python.torch_nccl_pg_status" + if use_global + else "python.torch_nccl_pg_status" + ) return { "comm_table": comm, "table_comm": comm, "nccl_proxy_table": nccl_proxy, + "nccl_coll_table": nccl_coll, + "nccl_inflight_table": nccl_inflight, "net_qp_table": net_qp, + "fr_table": fr, + "fr_status_table": fr_status, "global_prefix": "global." if use_global else "", } diff --git a/skills/catalog.yaml b/skills/catalog.yaml index b8621b7b..875e8932 100644 --- a/skills/catalog.yaml +++ b/skills/catalog.yaml @@ -17,6 +17,9 @@ categories: memory: label: 内存 / Memory description: GPU/VRAM pressure and leaks. + sre: + label: SRE / Runbook + description: On-call workflows that automate manual training triage. skills: - id: health_overview category: triage @@ -156,6 +159,8 @@ skills: priority: 5 description: Rank collective ops by total and p99 latency tables: + - nccl.coll_perf + - nccl.proxy_ops - python.comm_collective - rdma.mlx_hca pages: @@ -197,3 +202,49 @@ skills: - slow_rank - comm_bottleneck path: nccl_culprit_victim/steps.yaml +- id: watchdog_timeout + category: distributed + priority: 8 + description: NCCL watchdog timeout diagnosis with PyTorch Flight Recorder sequence alignment + tables: + - python.torch_nccl_flight_record + - python.torch_nccl_pg_status + - global.python.torch_nccl_flight_record + pages: + - training + - cluster + - analytics + - agent + related: + - training_hang + - comm_bottleneck + - nccl_culprit_victim + path: watchdog_timeout/steps.yaml +- id: sre_triage + category: sre + priority: 9 + entry: true + description: SRE first-response triage for distributed training incidents + tables: + - cluster.nodes + - cpu.utilization + - gpu.utilization + - python.comm_collective + - python.torch_nccl_flight_record + - nccl.proxy_ops + - rdma.mlx_hca + - process.kmsg + pages: + - dashboard + - training + - cluster + - agent + related: + - health_overview + - job_health + - training_hang + - watchdog_timeout + - comm_bottleneck + - nccl_culprit_victim + - gpu_pressure + path: sre_triage/steps.yaml diff --git a/skills/comm_bottleneck/SKILL.md b/skills/comm_bottleneck/SKILL.md index 649d0fe6..64100bdb 100644 --- a/skills/comm_bottleneck/SKILL.md +++ b/skills/comm_bottleneck/SKILL.md @@ -3,7 +3,7 @@ name: comm_bottleneck description: > Rank collective ops by total and p99 latency category: distributed -tables: [python.comm_collective, nccl.proxy_ops, rdma.mlx_hca] +tables: [nccl.coll_perf, nccl.proxy_ops, python.comm_collective, rdma.mlx_hca] tags: [NCCL, collective, communication, 通信, all_reduce] keywords: en: ['communication slow', 'NCCL', 'collective', 'comm bottleneck'] @@ -18,6 +18,15 @@ parameters: 按 collective op 聚合延迟与传输量,定位通信热点。 适用于「计算不慢但 step 时间长」或「通信占比高」的场景。 +## 数据层次(勿混淆计时语义) + +| 层 | 表 | 计时 | +|----|----|------| +| NCCL profiler 插件(**优先**) | `nccl.coll_perf`、`nccl.proxy_ops` | NCCL 原生事件,执行时间/带宽精准(见 `timing_source`) | +| Torch API 层插桩(回退) | `python.comm_collective` | Python 墙钟,launch 层粗粒度;独有 `global_step` 上下文 | + +NCCL 插件启用时 Torch 侧插桩默认关闭(`probing.torch.collective.enable=1` 可强制同开)。 + ## Parameters - `step_window` (integer, default `50`): diff --git a/skills/comm_bottleneck/steps.yaml b/skills/comm_bottleneck/steps.yaml index 62ab49e6..b4c06d3b 100644 --- a/skills/comm_bottleneck/steps.yaml +++ b/skills/comm_bottleneck/steps.yaml @@ -15,6 +15,12 @@ metadata: 按 collective op 聚合延迟与传输量,定位通信热点。 适用于「计算不慢但 step 时间长」或「通信占比高」的场景。 + 数据分两层,勿混淆计时语义: + - nccl.coll_perf / nccl.proxy_ops(NCCL profiler 插件):NCCL 原生事件, + 执行时间与带宽精准,优先采信; + - python.comm_collective(Torch API 层插桩):Python 墙钟,仅 launch 层 + 粗粒度,插件不可用时的回退,胜在带训练步(global_step)上下文。 + spec: parameters: - name: step_window @@ -26,12 +32,32 @@ spec: requires: any_tables: - - python.comm_collective + - nccl.coll_perf - nccl.proxy_ops + - python.comm_collective steps: + - id: nccl_coll_bw + title: "NCCL 精准带宽 (coll_perf, 按 op/消息大小)" + type: sql + sql: | + SELECT + coll_func, + msg_size_bytes, + timing_source, + count(*) AS ops, + avg(algobw_gbps) AS avg_gbps, + min(algobw_gbps) AS min_gbps, + avg(exec_time_ns) / 1e6 AS avg_exec_ms + FROM {nccl_coll_table} + GROUP BY coll_func, msg_size_bytes, timing_source + ORDER BY avg_gbps ASC + LIMIT 15 + on_empty: skip + empty_message: "无 nccl.coll_perf — 需 NCCL profiler 插件;以下退回 Torch API 层粗粒度数据" + - id: op_summary - title: "各 collective op 统计" + title: "各 collective op 统计 (Torch API 层, 粗粒度)" type: sql sql: | SELECT @@ -48,11 +74,11 @@ spec: ) GROUP BY op ORDER BY sum(duration_ms) DESC - on_empty: abort - empty_message: "无 comm_collective 数据" + on_empty: skip + empty_message: "无 comm_collective 数据(NCCL 插件启用时 Torch 侧插桩默认关闭,属预期)" - id: op_by_step - title: "每 step 通信总耗时" + title: "每 step 通信总耗时 (Torch API 层)" type: sql sql: | SELECT @@ -70,7 +96,7 @@ spec: on_empty: skip - id: slowest_calls - title: "最慢的 collective 调用" + title: "最慢的 collective 调用 (Torch API 层)" type: sql sql: | SELECT global_step, rank, op, duration_ms, bytes, tensor_shape @@ -100,7 +126,7 @@ spec: GROUP BY coll_func ORDER BY total_recv_wait_ns DESC on_empty: skip - empty_message: "无 nccl.proxy_ops — 仅 python.comm_collective 粗粒度可用" + empty_message: "无 nccl.proxy_ops — 仅 Torch API 层粗粒度数据可用" - id: rdma_hint title: "RDMA 端口速率 (Linux)" @@ -116,6 +142,7 @@ spec: variables: table_comm: "{comm_table}" nccl_proxy_table: "{nccl_proxy_table}" + nccl_coll_table: "{nccl_coll_table}" interpretation: rules: @@ -131,12 +158,14 @@ spec: summary_template: | ## 通信瓶颈 - - **op_summary**: 哪个 op 总耗时最高 + - **nccl_coll_bw**: NCCL 精准带宽(有则优先采信;注意 timing_source 列) + - **op_summary**: Torch API 层各 op 总耗时(粗粒度回退) - **slowest_calls**: 极端慢调用 - rank 不均衡 → skill: slow_rank next_steps: - "all_reduce 慢 → 检查 bucket 大小、overlap、FP16 compress" + - "某消息桶带宽异常低 → 对照 timing_source(enqueue 回退行不代表执行带宽)" - "某 step comm_ms 尖峰 → 对照 checkpoint / eval 边界" - "RoCE 拥塞 → 查 rdma.mlx_hca 与交换机 ECN 配置" - "有 proxy wait 数据 → skill: nccl_culprit_victim" diff --git a/skills/health_overview/steps.yaml b/skills/health_overview/steps.yaml index ad01b085..f413e492 100644 --- a/skills/health_overview/steps.yaml +++ b/skills/health_overview/steps.yaml @@ -76,6 +76,26 @@ spec: on_empty: skip empty_message: "单进程模式或未注册 cluster 节点" + - id: nccl_data_integrity + title: "NCCL profiler 数据完整性" + type: sql + sql: | + SELECT + ts, + rank, + pool_exhausted, + write_errors, + ring_rows_overwritten, + coll_live, + coll_cap, + proxy_live, + proxy_cap + FROM nccl.profiler_counters + ORDER BY ts DESC + LIMIT 1 + on_empty: skip + empty_message: "nccl.profiler_counters 无数据 — NCCL profiler 未启用" + interpretation: rules: - id: no_tables @@ -83,6 +103,21 @@ spec: severity: error message: "没有可查询表 — probing 可能未正确注入" + - id: nccl_pool_exhausted + when: "step:nccl_data_integrity | column:pool_exhausted | value > 0" + severity: error + message: "NCCL slot pool 曾耗尽 — 通信指标可能不完整" + + - id: nccl_write_errors + when: "step:nccl_data_integrity | column:write_errors | value > 0" + severity: error + message: "NCCL memtable 写入失败 — 部分事件可能丢失" + + - id: nccl_ring_overwrite + when: "step:nccl_data_integrity | column:ring_rows_overwritten | value > 0" + severity: warning + message: "NCCL mmap ring 曾覆写旧行 — 历史窗口可能不完整" + - id: high_gpu_mem when: "step:gpu_mem | column:mem_used_pct | max > 90" severity: warning @@ -98,8 +133,10 @@ spec: - 可用表: {available_tables.row_count} 张 - 最新训练 step: {latest_torch_step.latest_step} - 集群节点: {cluster_nodes.row_count} 个(0 表示单机) + - NCCL 完整性: 见 nccl_data_integrity(pool_exhausted / ring 覆写) 若某项为空,按 empty_message 提示开启对应采集。 + cluster 查询若标记 PARTIAL/DEGRADED,不得当作完整诊断依据。 next_steps: - "多机训练 job 级诊断 → skill: job_health --global" diff --git a/skills/nccl_culprit_victim/SKILL.md b/skills/nccl_culprit_victim/SKILL.md index 9e3d3753..261a5b7a 100644 --- a/skills/nccl_culprit_victim/SKILL.md +++ b/skills/nccl_culprit_victim/SKILL.md @@ -19,6 +19,9 @@ Uses **NCCL profiler plugin** wait decomposition (`nccl.proxy_ops`): - **Culprit** (slow local GPU): high `send_gpu_wait_ns` - **Victim** (waiting on peers / network): high `recv_wait_ns` +- **Receiver congestion** (v4 ABI only): high `send_peer_wait_ns` — this rank's + sends are stalled waiting for the *peer's* clear-to-send credits; investigate + that peer Requires `NCCL_PROFILER_PLUGIN` + `probing-nccl-profiler` (or mock data via `PROBING_NCCL_MOCK` on macOS). diff --git a/skills/nccl_culprit_victim/steps.yaml b/skills/nccl_culprit_victim/steps.yaml index 1c2992f3..a53e2466 100644 --- a/skills/nccl_culprit_victim/steps.yaml +++ b/skills/nccl_culprit_victim/steps.yaml @@ -15,6 +15,7 @@ metadata: 基于 nccl.proxy_ops 的 ProxyStep wait 分解,区分: - culprit:send_gpu_wait_ns 高(本 rank GPU/计算慢) - victim:recv_wait_ns 高(等 peer / 网络) + - send_peer_wait_ns 高(仅 v4 ABI):等接收端 credits → 对端拥塞信号 需要 NCCL_PROFILER_PLUGIN 加载 probing-nccl-profiler;开发机可用 PROBING_NCCL_MOCK=1。 spec: @@ -44,6 +45,7 @@ spec: sum(send_gpu_wait_ns) AS total_gpu_wait_ns, sum(recv_wait_ns) AS total_recv_wait_ns, sum(send_wait_ns) AS total_send_wait_ns, + sum(send_peer_wait_ns) AS total_peer_wait_ns, avg(send_gpu_wait_ns) AS avg_gpu_wait_ns, avg(recv_wait_ns) AS avg_recv_wait_ns FROM {nccl_proxy_table} @@ -57,7 +59,7 @@ spec: empty_message: | 无 nccl.proxy_ops 数据。确认: - export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) - - export NCCL_PROFILE_EVENT_MASK=26 + - export NCCL_PROFILE_EVENT_MASK=94 - 或 macOS 开发: PROBING_NCCL_MOCK=1 PROBING=1 - id: culprit_ranking @@ -189,10 +191,12 @@ spec: ## NCCL culprit / victim - **culprit_ranking**: `send_gpu_wait_ns` 最高 → 本地算力瓶颈 - **victim_ranking**: `recv_wait_ns` 最高 → 等待他人或网络 + - **rank_wait_summary.total_peer_wait_ns**(仅 v4 ABI)高 → 对端接收拥塞 - **role_aligned**: 同 tp/pp/dp 切片对比(Megatron 拓扑) - 若仅有 python.comm_collective → skill: comm_bottleneck next_steps: - "culprit 持续同一 rank → gpu_pressure / module_bottleneck" - "victim 全体偏高 → 网络/RoCE: comm_bottleneck (rdma.mlx_hca)" + - "send_peer_wait_ns 偏高 → 对端 rank 接收侧拥塞,检查该 peer 的 GPU/网络" - "单 rank victim + 其他 culprit → 典型 straggler: slow_rank" diff --git a/skills/semantic/intents.yaml b/skills/semantic/intents.yaml index fb01be3d..91cf6c7e 100644 --- a/skills/semantic/intents.yaml +++ b/skills/semantic/intents.yaml @@ -5,8 +5,13 @@ kind: IntentCatalog intents: health_check: label: "健康检查 / 不知道从哪查" - keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup, job health, 作业健康] - skills: [health_overview, job_health] + keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup, job health, 作业健康, SRE, 值班] + skills: [sre_triage, health_overview, job_health] + + sre_oncall: + label: "SRE 值班 / 事故第一响应" + keywords: [SRE, 值班, oncall, runbook, 应急, 事故, incident, triage, 第一响应, 排查流程] + skills: [sre_triage, health_overview, job_health, training_hang, watchdog_timeout] job_slowdown: label: "整 job 变慢 / slowdown" @@ -20,8 +25,8 @@ intents: training_hung: label: "训练卡住 / 无进展" - keywords: [卡住, hang, stall, 不动, deadlock, 死锁, frozen, stuck, loss 不更新] - skills: [training_hang, slow_rank] + keywords: [卡住, hang, stall, 不动, deadlock, 死锁, frozen, stuck, loss 不更新, watchdog timeout] + skills: [sre_triage, training_hang, watchdog_timeout, slow_rank] training_slow: label: "训练变慢 / 瓶颈" @@ -40,15 +45,15 @@ intents: comm_slow: label: "通信慢 / NCCL" - keywords: [通信慢, NCCL, all_reduce, 通信瓶颈, collective, 带宽, culprit, victim, recv_wait, gpu_wait] - skills: [comm_bottleneck, nccl_culprit_victim, slow_rank] + keywords: [通信慢, NCCL, all_reduce, 通信瓶颈, collective, 带宽, culprit, victim, recv_wait, gpu_wait, watchdog] + skills: [sre_triage, comm_bottleneck, watchdog_timeout, nccl_culprit_victim, slow_rank] nccl_wait: label: "NCCL wait 分解 / culprit victim" - keywords: [罪魁祸首, 受害者, send_gpu_wait, recv_wait, proxy wait, NCCL 等待, gpu wait] - skills: [nccl_culprit_victim, slow_rank] + keywords: [罪魁祸首, 受害者, send_gpu_wait, recv_wait, proxy wait, NCCL 等待, gpu wait, flight recorder, desync] + skills: [watchdog_timeout, nccl_culprit_victim, slow_rank] cluster_view: label: "集群 / 多机训练" keywords: [集群, 多机, 分布式, cluster, multi-node, 跨节点, 所有 rank, all ranks, fan-out] - skills: [job_health, slow_rank, persistent_straggler, comm_bottleneck, health_overview] + skills: [sre_triage, job_health, slow_rank, persistent_straggler, comm_bottleneck, health_overview] diff --git a/skills/semantic/tables.yaml b/skills/semantic/tables.yaml index 06f4c7bc..6df6f262 100644 --- a/skills/semantic/tables.yaml +++ b/skills/semantic/tables.yaml @@ -32,8 +32,8 @@ tables: - "默认仅 forward hook;backward hook 默认关闭" python.comm_collective: - description: "torch.distributed 集合通信调用记录(all_reduce、broadcast 等)" - synonyms: [collective, communication, NCCL, 通信, all_reduce] + description: "torch.distributed API 层集合通信记录(Python 墙钟计时,粗粒度回退;精准 NCCL 数据在 nccl.* 表)" + synonyms: [collective, communication, 通信, all_reduce, torch.distributed] key_columns: micro_step: "最细粒度步计数" local_step: "本 rank 训练步" @@ -49,10 +49,66 @@ tables: tensor_shape: "张量 shape 字符串" tensor_dtype: "张量 dtype" bytes: "通信字节数" - duration_ms: "墙钟耗时(毫秒)" + duration_ms: "Python API 调用墙钟耗时(毫秒)— launch 层计时,非 NCCL 执行时间" async_op: "1=异步 collective,0=同步" global_name: global.python.comm_collective federation_columns: [_host, _addr, _rank, _role] + notes: + - "来源:torch.distributed monkey-patch(Torch API 层),NCCL profiler 插件启用时默认关闭" + - "查执行时间/带宽/等待分解请用 nccl.coll_perf / nccl.proxy_ops(NCCL 原生事件)" + - "本表独有训练步上下文(global_step 等),可与 nccl.* 按时间窗对齐" + + python.torch_nccl_flight_record: + description: "PyTorch Flight Recorder collective 环形缓冲快照(NCCL watchdog timeout / desync 诊断)" + synonyms: [Flight Recorder, NCCL watchdog, collective desync, watchdog timeout, 反同步] + key_columns: + snapshot_id: "probing 触发 snapshot 的时间戳(纳秒)" + rank: "torch.distributed rank" + world_size: "world size" + record_id: "PyTorch Flight Recorder 记录 id" + pg_id: "ProcessGroup id" + pg_name: "ProcessGroup 名称" + pg_desc: "ProcessGroup 描述" + collective_seq_id: "进程组内 collective 序号" + p2p_seq_id: "P2P 序号" + op_id: "PyTorch op id" + profiling_name: "collective 名称,如 nccl:all_reduce" + state: "collective 状态,如 scheduled/started/completed" + input_sizes: "输入 tensor size JSON" + input_dtypes: "输入 dtype JSON" + output_sizes: "输出 tensor size JSON" + output_dtypes: "输出 dtype JSON" + time_created_ns: "记录创建时间" + time_discovered_started_ns: "发现 started 的时间" + time_discovered_completed_ns: "发现 completed 的时间" + duration_ns: "collective duration(若 PyTorch 提供)" + timeout_ms: "watchdog timeout 配置" + retired: "1=已从活跃集合退休" + is_p2p: "1=P2P op" + frames: "调用栈 JSON" + top_frame: "调用栈代表帧" + global_name: global.python.torch_nccl_flight_record + federation_columns: [_host, _addr, _rank, _role] + notes: + - "由 /apis/pythonext/flight-recorder/snapshot 触发写入" + - "需要 PyTorch >= 2.5 的 torch._C._distributed_c10d._dump_nccl_trace" + + python.torch_nccl_pg_status: + description: "PyTorch Flight Recorder ProcessGroup 状态快照" + synonyms: [Flight Recorder PG, process group status, NCCL PG] + key_columns: + snapshot_id: "probing 触发 snapshot 的时间戳(纳秒)" + rank: "torch.distributed rank" + world_size: "world size" + pg_id: "ProcessGroup id" + pg_name: "ProcessGroup 名称" + pg_desc: "ProcessGroup 描述" + ranks: "ProcessGroup 成员 rank 字符串" + last_enqueued_collective: "最后入队 collective seq" + last_started_collective: "最后 started collective seq" + last_completed_collective: "最后 completed collective seq" + global_name: global.python.torch_nccl_pg_status + federation_columns: [_host, _addr, _rank, _role] python.trace_event: description: "分布式 tracing:span 起止与自定义 event(python.tracing)" @@ -219,7 +275,7 @@ tables: description: "NCCL profiler plugin proxy-op wait 分解(culprit / victim 归因)" synonyms: [NCCL proxy, send_gpu_wait, recv_wait, culprit, victim, proxy wait] key_columns: - ts: "事件时间戳(纳秒)" + ts: "事件时间戳(UNIX epoch 纳秒)" rank: "torch.distributed rank" tp_rank: "张量并行 rank(未知 -1)" pp_rank: "流水线并行 rank(未知 -1)" @@ -231,17 +287,73 @@ tables: peer: "对端 rank" is_send: "1=send proxy,0=recv proxy" n_steps: "聚合的 ProxyStep 数" - trans_bytes: "传输字节数" + trans_bytes: "传输字节数(v4 按 step 累计)" send_gpu_wait_ns: "Culprit 信号 — 本地 GPU 未就绪发送" + send_peer_wait_ns: "等待接收端 clear-to-send credits(仅 v4 ABI;v3 为 0)— 对端拥塞信号" send_wait_ns: "发送侧网络等待" recv_wait_ns: "Victim 信号 — 等待对端数据" recv_flush_wait_ns: "接收 flush 等待" global_name: global.nccl.proxy_ops federation_columns: [_host, _addr, _rank, _role] notes: - - "需 NCCL_PROFILER_PLUGIN + NCCL ≥ 2.26(mask Coll|ProxyOp|ProxyStep)" + - "需 NCCL_PROFILER_PLUGIN;插件同时导出 v4(NCCL ≥ 2.27)与 v3(NCCL 2.26)ABI,NCCL 自动选最高版本" + - "mask Coll|P2P|ProxyOp|ProxyStep|KernelCh,默认 94" - "macOS 开发:PROBING_NCCL_MOCK=1 可注入合成数据" + nccl.coll_perf: + description: "NCCL collective / P2P 级性能(timing_source 标注计时来源;消息大小、算法、带宽)" + synonyms: [collective perf, algobw, busbw, NCCL bandwidth, 集合通信带宽, message size] + key_columns: + ts: "op 完成时间戳(UNIX epoch 纳秒)" + rank: "torch.distributed rank" + tp_rank: "张量并行 rank(未知 -1)" + pp_rank: "流水线并行 rank(未知 -1)" + dp_rank: "数据并行 rank(未知 -1)" + comm_hash: "NCCL communicator hash" + n_ranks: "通信组大小(v4 init 提供;v3 为 -1)— busbw 换算用" + coll_func: "操作名(AllReduce、AllGather、Send、Recv…)" + seq: "collective 序号(P2P 为 0)" + is_p2p: "1=P2P(Send/Recv),0=collective" + peer: "P2P 对端 rank(collective 为 -1)" + count: "元素个数" + msg_size_bytes: "消息大小 = count × dtype 字节数" + dtype: "NCCL 数据类型名" + algo: "NCCL 算法(Ring、Tree…;P2P 为空)" + proto: "NCCL 协议(LL、LL128、Simple…)" + n_channels: "最大 channel 数(v4 起 P2P 也有值)" + exec_time_ns: "实际执行耗时(纳秒);由 timing_source 对应事件窗口重建" + enqueue_time_ns: "host 侧 enqueue 耗时(纳秒;NCCL coll stopEvent 语义)" + timing_source: "exec_time 来源:kernel_gpu(GPU globaltimer,v4)> kernel_ch(host 观测)> proxy > enqueue(回退)" + algobw_gbps: "算法带宽 msg_size/exec_time(GB/s);busbw 需乘集合通信系数" + global_name: global.nccl.coll_perf + federation_columns: [_host, _addr, _rank, _role] + notes: + - "NCCL coll stopEvent 只代表 enqueue 完成;exec_time_ns 由子事件(KernelCh/ProxyOp)引用计数重建" + - "v4 ABI 下 timing_source=kernel_gpu,来自 GPU globaltimer(设备时钟,最精确)" + - "busbw 换算:AllReduce 乘 2(n-1)/n,n 取 n_ranks(v3 行 n_ranks=-1 时需从外部推断)" + - "PROBING_NCCL_MIN_MSG_BYTES 可过滤小消息" + + nccl.inflight_ops: + description: "在途(已 start 未 stop)NCCL 操作周期快照 — hang 诊断信号" + synonyms: [inflight, hang, stuck collective, 挂死, 卡住, watchdog] + key_columns: + ts: "快照时间戳(UNIX epoch 纳秒)" + rank: "torch.distributed rank" + comm_hash: "NCCL communicator hash" + coll_func: "操作名(未知为 unknown)" + seq: "collective 序号" + kind: "coll / p2p / proxy_op" + channel_id: "NCCL channel(proxy_op 有效)" + peer: "对端 rank(未知 -1)" + is_send: "1=send,0=recv(proxy_op 有效)" + start_ns: "op 开始时间戳(epoch 纳秒)" + age_ns: "快照时刻已持续时长(纳秒)" + global_name: global.nccl.inflight_ops + federation_columns: [_host, _addr, _rank, _role] + notes: + - "挂死的 op 不会出现在 nccl.proxy_ops / nccl.coll_perf(永远不 stop),查这张表" + - "PROBING_NCCL_INFLIGHT_THRESHOLD_SECS 控制快照阈值(默认 10s,0 关闭)" + nccl.net_qp: description: "NCCL NetPlugin IB QP 完成耗时(可选 mask bit 128)" synonyms: [IB QP, RoCE, net plugin, qp duration] diff --git a/skills/sre_triage/SKILL.md b/skills/sre_triage/SKILL.md new file mode 100644 index 00000000..a52beb5c --- /dev/null +++ b/skills/sre_triage/SKILL.md @@ -0,0 +1,46 @@ +--- +name: sre_triage +description: > + SRE first-response triage for distributed training incidents. Automates the + manual checks from PyTorch/NCCL debugging runbooks. +category: sre +tables: + [cluster.nodes, cpu.utilization, gpu.utilization, python.comm_collective, + python.torch_nccl_flight_record, nccl.proxy_ops, rdma.mlx_hca, process.kmsg] +tags: [SRE, runbook, oncall, triage, NCCL, hang, OOM, network] +keywords: + en: ['SRE', 'oncall', 'runbook', 'incident', 'triage', 'NCCL timeout', 'hang'] + zh: ['SRE', '值班', '应急', 'runbook', '分诊', '事故', '卡住', 'NCCL 超时'] +parameters: + use_global: { type: boolean, default: true } + seq_window: { type: integer, default: 200 } + sample_limit: { type: integer, default: 20 } +--- + +# SRE triage + +面向值班第一响应:把原本需要人工 ssh、grep、py-spy、看 NCCL/IB/GPU/内核日志的流程,尽量转成 probing 可执行证据链。 + +这个 skill 不追求一次性给出最终根因,而是自动回答: + +1. 集群/rank 是否都在线? +2. 训练是否还在推进? +3. 是否有 NCCL watchdog / collective desync 证据? +4. 是否像 CPU hang、GPU/NCCL wait、网络拥塞、OOM/Xid? +5. 下一步应该跑哪个更专门的 skill? + +## Reading results + +- `incident_snapshot`:当前有哪些表,决定能自动化到什么深度。 +- `cluster_nodes`:rank/host 是否齐,是否有 dead/stale 节点。 +- `blocked_threads` / `kernel_wait_points`:类似人工 py-spy/strace 的第一层替代。 +- `flight_recorder_alignment`:自动化 Flight Recorder / fr_trace 的核心对齐判断。 +- `nccl_wait_summary`:进入 NCCL 后的 culprit/victim 信号。 +- `rdma_network_hints` / `kernel_fault_hints`:网络或硬件灰故障线索。 + +## Related skills + +- NCCL timeout 细查 → `watchdog_timeout` +- 已进入 NCCL wait → `nccl_culprit_victim` +- 训练卡住但不是 NCCL → `training_hang` +- 显存/OOM → `memory_leak` / `gpu_pressure` diff --git a/skills/sre_triage/steps.yaml b/skills/sre_triage/steps.yaml new file mode 100644 index 00000000..e1265406 --- /dev/null +++ b/skills/sre_triage/steps.yaml @@ -0,0 +1,276 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: sre_triage + title: "SRE 训练事故第一响应" + title_en: "SRE first-response triage" + category: sre + tags: [SRE, runbook, oncall, triage, NCCL, hang, OOM, network] + triggers: + keywords: + zh: ["SRE", "值班", "应急", "runbook", "事故", "分诊", "卡住", "NCCL 超时"] + en: ["SRE", "oncall", "runbook", "incident", "triage", "NCCL timeout", "hang"] + docs: | + 自动化分布式训练值班第一轮排查:集群存活、训练进展、CPU 阻塞、 + Flight Recorder collective 对齐、NCCL wait、GPU/RDMA/内核故障线索。 + +spec: + parameters: + - name: use_global + type: boolean + default: true + description: "Use global.* tables when cluster fan-out is available" + - name: seq_window + type: integer + default: 200 + description: "Recent collective sequence ids to inspect" + - name: sample_limit + type: integer + default: 20 + description: "Rows to show for broad triage steps" + + requires: + any_tables: + - cluster.nodes + - cpu.utilization + - gpu.utilization + - python.comm_collective + - python.torch_nccl_flight_record + - nccl.proxy_ops + + steps: + - id: incident_snapshot + title: "当前可用证据表" + type: sql + sql: | + SELECT table_schema, table_name, table_type + FROM information_schema.tables + WHERE table_schema NOT IN ('information_schema') + ORDER BY table_schema, table_name + on_empty: warn + empty_message: "没有发现可查询表 — 确认 probing 已注入且目标进程仍存活" + + - id: cluster_nodes + title: "集群 / rank 存活状态" + type: sql + sql: | + SELECT rank, local_rank, host, addr, role, status, timestamp + FROM cluster.nodes + ORDER BY rank + on_empty: skip + empty_message: "没有 cluster.nodes — 单进程或 torchrun heartbeat 未注册" + + - id: recent_progress + title: "最近训练 / 通信进展" + type: sql + sql: | + SELECT + max(global_step) AS latest_global_step, + count(*) AS collective_rows, + max(duration_ms) AS slowest_recent_collective_ms + FROM {comm_table} + on_empty: skip + empty_message: "没有 comm_collective — 非分布式或 collective tracing 尚未写入" + + - id: blocked_threads + title: "阻塞线程 / wait channel" + type: sql + sql: | + SELECT tid, comm, state, wchan, cpu_total_pct + FROM cpu.utilization + WHERE scope = 'thread' + AND (state NOT IN ('R', 'S') OR wchan != '') + ORDER BY ts DESC + LIMIT {sample_limit} + on_empty: skip + empty_message: "无线程阻塞样本;macOS 或权限受限时 wchan 可能不可用" + + - id: kernel_wait_points + title: "常见内核等待点" + type: sql + sql: | + SELECT wchan, count(*) AS samples, max(comm) AS example_thread + FROM cpu.utilization + WHERE scope = 'thread' AND wchan != '' + GROUP BY wchan + ORDER BY samples DESC + LIMIT 10 + on_empty: skip + + - id: flight_recorder_snapshot + title: "触发本 rank Flight Recorder snapshot" + type: api + method: GET + path: /apis/pythonext/flight-recorder/snapshot?include_stack_traces=true&only_active=false&persist=true + on_empty: warn + empty_message: "Flight Recorder snapshot 不可用 — PyTorch 版本或 TORCH_NCCL_TRACE_BUFFER_SIZE 可能不满足" + + - id: flight_recorder_alignment + title: "Flight Recorder collective 对齐异常" + type: sql + sql: | + WITH latest AS ( + SELECT rank, max(snapshot_id) AS snapshot_id + FROM {fr_table} + GROUP BY rank + ), + recent AS ( + SELECT f.* + FROM {fr_table} f + JOIN latest l + ON f.rank = l.rank AND f.snapshot_id = l.snapshot_id + WHERE f.collective_seq_id >= ( + SELECT max(collective_seq_id) - {seq_window} + FROM {fr_table} + ) + ), + aligned AS ( + SELECT + pg_id, + collective_seq_id, + count(DISTINCT rank) AS ranks_seen, + max(world_size) AS expected_world_size, + min(profiling_name) AS op_min, + max(profiling_name) AS op_max, + min(input_sizes) AS input_sizes_min, + max(input_sizes) AS input_sizes_max, + min(input_dtypes) AS input_dtypes_min, + max(input_dtypes) AS input_dtypes_max, + min(state) AS state_min, + max(state) AS state_max + FROM recent + GROUP BY pg_id, collective_seq_id + ) + SELECT * + FROM aligned + WHERE ranks_seen < expected_world_size + OR op_min != op_max + OR input_sizes_min != input_sizes_max + OR input_dtypes_min != input_dtypes_max + OR state_min != state_max + ORDER BY collective_seq_id + LIMIT 20 + on_empty: skip + empty_message: "没有发现 collective seq 对齐异常;若仍 hang,继续看 CPU/NCCL/network 证据" + + - id: suspicious_collective_stacks + title: "最近 collective 调用栈" + type: sql + sql: | + WITH latest AS ( + SELECT rank, max(snapshot_id) AS snapshot_id + FROM {fr_table} + GROUP BY rank + ) + SELECT rank, pg_id, collective_seq_id, profiling_name, state, top_frame + FROM {fr_table} f + JOIN latest l + ON f.rank = l.rank AND f.snapshot_id = l.snapshot_id + ORDER BY collective_seq_id DESC, rank + LIMIT {sample_limit} + on_empty: skip + + - id: nccl_wait_summary + title: "NCCL wait 分解概览" + type: sql + sql: | + SELECT + rank, + count(*) AS proxy_ops, + sum(send_gpu_wait_ns) AS total_gpu_wait_ns, + sum(recv_wait_ns) AS total_recv_wait_ns, + sum(send_wait_ns) AS total_send_wait_ns + FROM {nccl_proxy_table} + GROUP BY rank + ORDER BY total_recv_wait_ns DESC + LIMIT {sample_limit} + on_empty: skip + empty_message: "无 nccl.proxy_ops — 未加载 NCCL profiler plugin,跳过 culprit/victim 分解" + + - id: gpu_pressure_snapshot + title: "GPU 显存 / 利用率快照" + type: sql + sql: | + SELECT device_id, name, used_bytes, total_bytes, mem_used_pct, gpu_util_pct + FROM gpu.utilization + ORDER BY ts DESC + LIMIT {sample_limit} + on_empty: skip + + - id: rdma_network_hints + title: "RDMA / RoCE 网络线索" + type: sql + platform: linux + sql: | + SELECT + hca_name, + rcv_pkts_rate, + snd_pkts_rate, + link_downed, + np_cnp_sent, + np_ecn_marked_roce_packets + FROM rdma.mlx_hca + ORDER BY np_ecn_marked_roce_packets DESC, link_downed DESC + LIMIT {sample_limit} + on_empty: skip + empty_message: "无 RDMA counters — 非 IB/RoCE 环境或 RDMA 扩展未配置" + + - id: kernel_fault_hints + title: "内核 OOM / GPU Xid / IB 错误线索" + type: sql + platform: linux + sql: | + SELECT timestamp, level, message + FROM process.kmsg + WHERE message LIKE '%oom%' + OR message LIKE '%Out of memory%' + OR message LIKE '%Xid%' + OR message LIKE '%NVRM%' + OR message LIKE '%mlx%' + OR message LIKE '%IB%' + ORDER BY timestamp DESC + LIMIT {sample_limit} + on_empty: skip + empty_message: "内核日志中没有发现 OOM/Xid/IB 关键字" + + interpretation: + rules: + - id: cluster_unhealthy + when: "step:cluster_nodes | column:status | any_not_equal('alive')" + severity: warning + message: "存在非 alive 节点 — 优先确认 rank 是否退出、心跳是否中断" + + - id: collective_desync + when: "step:flight_recorder_alignment | rows > 0" + severity: warning + message: "Flight Recorder 发现 collective 对齐异常 — 继续运行 watchdog_timeout 查看细节" + + - id: nccl_wait_present + when: "step:nccl_wait_summary | column:total_recv_wait_ns | max > 1000000" + severity: info + message: "存在明显 NCCL recv_wait — 继续运行 nccl_culprit_victim 区分 culprit/victim" + + - id: roce_congestion + when: "step:rdma_network_hints | column:np_ecn_marked_roce_packets | max > 0" + severity: warning + message: "RoCE ECN 标记非零 — 网络可能拥塞" + + - id: kernel_fault + when: "step:kernel_fault_hints | rows > 0" + severity: warning + message: "内核日志存在 OOM/Xid/IB 线索 — 可能是资源或硬件/驱动问题" + + summary_template: | + ## SRE 第一响应 + - **cluster_nodes**: rank/host 是否齐,是否有 dead/stale + - **flight_recorder_alignment**: NCCL watchdog / collective desync 自动对齐 + - **blocked_threads**: CPU hang / syscall wait 线索 + - **nccl_wait_summary**: 进入 NCCL 后的等待分解 + - **rdma_network_hints** / **kernel_fault_hints**: 网络与硬件线索 + + next_steps: + - "collective 对齐异常 → watchdog_timeout" + - "NCCL wait 明显 → nccl_culprit_victim" + - "CPU 栈/线程阻塞明显 → training_hang" + - "GPU 显存或 Xid/OOM → gpu_pressure / memory_leak" diff --git a/skills/watchdog_timeout/SKILL.md b/skills/watchdog_timeout/SKILL.md new file mode 100644 index 00000000..43f4fbca --- /dev/null +++ b/skills/watchdog_timeout/SKILL.md @@ -0,0 +1,46 @@ +--- +name: watchdog_timeout +description: > + Diagnose PyTorch NCCL watchdog timeouts with Flight Recorder collective + sequence alignment. +category: distributed +tables: [python.torch_nccl_flight_record, global.python.torch_nccl_flight_record, python.torch_nccl_pg_status] +tags: [NCCL, watchdog, timeout, Flight Recorder, desync, collective] +keywords: + en: ['NCCL watchdog', 'timeout', 'flight recorder', 'collective mismatch', 'desync'] + zh: ['NCCL watchdog', '超时', 'Flight Recorder', 'collective 不一致', '反同步', '卡住'] +parameters: + seq_window: { type: integer, default: 200 } + use_global: { type: boolean, default: true } +--- + +# Watchdog timeout diagnosis + +用于 PyTorch NCCL watchdog timeout、collective deadlock、rank 间 collective 顺序不一致等场景。 + +这个 skill 会先触发 PyTorch Flight Recorder snapshot,并写入: + +- `python.torch_nccl_flight_record` +- `python.torch_nccl_pg_status` + +然后按 `pg_id + collective_seq_id` 对齐各 rank,检查 missing rank、collective type mismatch、shape/dtype mismatch、state mismatch。 + +## Prerequisites + +- PyTorch >= 2.5 +- 目标进程内存在 `torch._C._distributed_c10d._dump_nccl_trace` +- 最好提前设置 `TORCH_NCCL_TRACE_BUFFER_SIZE=2000` +- timeout 自动落盘可额外设置 `TORCH_NCCL_DUMP_ON_TIMEOUT=1` + +## Reading results + +- `ranks_seen < expected_world_size`:某些 rank 没有进入同一个 collective seq,常见于 CPU-side hang 或分支发散。 +- `op_min != op_max`:同一个 seq 上不同 rank 发起了不同 collective。 +- `input_sizes_min != input_sizes_max` 或 dtype 不同:collective 参数不一致。 +- `state_min != state_max`:某些 rank 未完成、未开始或处于不同状态。 + +## Related skills + +- 已进入 NCCL 但想看 culprit/victim → `nccl_culprit_victim` +- 训练仍存活但无进展 → `training_hang` +- 粗粒度通信慢 → `comm_bottleneck` diff --git a/skills/watchdog_timeout/steps.yaml b/skills/watchdog_timeout/steps.yaml new file mode 100644 index 00000000..cfff4c02 --- /dev/null +++ b/skills/watchdog_timeout/steps.yaml @@ -0,0 +1,233 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: watchdog_timeout + title: "NCCL watchdog timeout / Flight Recorder" + title_en: "NCCL watchdog timeout diagnosis" + category: distributed + tags: [NCCL, watchdog, timeout, Flight Recorder, collective, desync] + triggers: + keywords: + zh: ["NCCL watchdog", "超时", "Flight Recorder", "collective 不一致", "反同步", "死锁"] + en: ["NCCL watchdog", "timeout", "flight recorder", "collective mismatch", "desync"] + docs: | + 读取 PyTorch Flight Recorder,按 process group 与 collective sequence 跨 rank 对齐。 + 用于判断 watchdog timeout 是 missing rank、collective type mismatch、shape/dtype mismatch, + 还是 collective 已进入但未完成。 + +spec: + parameters: + - name: seq_window + type: integer + default: 200 + description: "Analyze recent collective sequence ids" + - name: use_global + type: boolean + default: true + description: "Use global.python.torch_nccl_flight_record for multi-rank fan-out" + + requires: + any_tables: + - python.torch_nccl_flight_record + - global.python.torch_nccl_flight_record + + steps: + - id: snapshot + title: "触发 Flight Recorder snapshot" + type: api + method: GET + path: /apis/pythonext/flight-recorder/snapshot?include_stack_traces=true&only_active=false&persist=true + on_empty: warn + empty_message: | + 无法读取 PyTorch Flight Recorder。确认 PyTorch >= 2.5,并设置: + - TORCH_NCCL_TRACE_BUFFER_SIZE=2000 + - 分布式后端为 NCCL + + - id: pg_status + title: "ProcessGroup 状态" + type: sql + sql: | + WITH latest AS ( + SELECT rank, max(snapshot_id) AS snapshot_id + FROM {fr_status_table} + GROUP BY rank + ) + SELECT + s.rank, + s.pg_id, + s.pg_name, + s.pg_desc, + s.ranks, + s.last_enqueued_collective, + s.last_started_collective, + s.last_completed_collective + FROM {fr_status_table} s + JOIN latest l + ON s.rank = l.rank AND s.snapshot_id = l.snapshot_id + ORDER BY s.rank, s.pg_id + on_empty: skip + empty_message: "无 torch_nccl_pg_status 数据 — snapshot 可能失败或没有 NCCL ProcessGroup" + + - id: rank_record_summary + title: "各 rank Flight Recorder 记录概览" + type: sql + sql: | + WITH latest AS ( + SELECT rank, max(snapshot_id) AS snapshot_id + FROM {fr_table} + GROUP BY rank + ) + SELECT + f.rank, + f.pg_id, + count(*) AS records, + min(f.collective_seq_id) AS min_seq, + max(f.collective_seq_id) AS max_seq, + sum(CASE WHEN f.state != 'completed' THEN 1 ELSE 0 END) AS incomplete_records + FROM {fr_table} f + JOIN latest l + ON f.rank = l.rank AND f.snapshot_id = l.snapshot_id + GROUP BY f.rank, f.pg_id + ORDER BY f.rank, f.pg_id + on_empty: abort + empty_message: | + 无 torch_nccl_flight_record 数据。可能原因: + - PyTorch 版本低于 2.5 + - 未启用 TORCH_NCCL_TRACE_BUFFER_SIZE + - 当前进程尚未初始化 NCCL ProcessGroup 或没有 collective + + - id: first_incomplete + title: "未完成 / 活跃 collective" + type: sql + sql: | + WITH latest AS ( + SELECT rank, max(snapshot_id) AS snapshot_id + FROM {fr_table} + GROUP BY rank + ) + SELECT + f.rank, + f.pg_id, + f.collective_seq_id, + f.profiling_name, + f.state, + f.input_sizes, + f.input_dtypes, + f.top_frame + FROM {fr_table} f + JOIN latest l + ON f.rank = l.rank AND f.snapshot_id = l.snapshot_id + WHERE f.state != 'completed' + ORDER BY f.collective_seq_id, f.rank + LIMIT 20 + on_empty: skip + empty_message: "最新 Flight Recorder snapshot 中没有未完成 collective" + + - id: collective_alignment + title: "按 PG + seq 对齐 collective" + type: sql + sql: | + WITH latest AS ( + SELECT rank, max(snapshot_id) AS snapshot_id + FROM {fr_table} + GROUP BY rank + ), + recent AS ( + SELECT f.* + FROM {fr_table} f + JOIN latest l + ON f.rank = l.rank AND f.snapshot_id = l.snapshot_id + WHERE f.collective_seq_id >= ( + SELECT max(collective_seq_id) - {seq_window} + FROM {fr_table} + ) + ), + aligned AS ( + SELECT + pg_id, + collective_seq_id, + count(DISTINCT rank) AS ranks_seen, + max(world_size) AS expected_world_size, + min(profiling_name) AS op_min, + max(profiling_name) AS op_max, + min(input_sizes) AS input_sizes_min, + max(input_sizes) AS input_sizes_max, + min(input_dtypes) AS input_dtypes_min, + max(input_dtypes) AS input_dtypes_max, + min(state) AS state_min, + max(state) AS state_max + FROM recent + GROUP BY pg_id, collective_seq_id + ) + SELECT * + FROM aligned + WHERE ranks_seen < expected_world_size + OR op_min != op_max + OR input_sizes_min != input_sizes_max + OR input_dtypes_min != input_dtypes_max + OR state_min != state_max + ORDER BY collective_seq_id + LIMIT 50 + on_empty: skip + empty_message: "最近 seq_window 内未发现 rank 缺失或 collective 参数不一致" + + - id: suspect_callstacks + title: "可疑 collective 调用栈" + type: sql + sql: | + WITH latest AS ( + SELECT rank, max(snapshot_id) AS snapshot_id + FROM {fr_table} + GROUP BY rank + ) + SELECT + f.rank, + f.pg_id, + f.collective_seq_id, + f.profiling_name, + f.state, + f.top_frame, + f.frames + FROM {fr_table} f + JOIN latest l + ON f.rank = l.rank AND f.snapshot_id = l.snapshot_id + WHERE f.collective_seq_id >= ( + SELECT max(collective_seq_id) - {seq_window} + FROM {fr_table} + ) + ORDER BY f.collective_seq_id DESC, f.rank + LIMIT 20 + on_empty: skip + + variables: + fr_table: "{global_prefix}python.torch_nccl_flight_record" + fr_status_table: "{global_prefix}python.torch_nccl_pg_status" + + interpretation: + rules: + - id: missing_rank + when: "step:collective_alignment | column:ranks_seen | any_lt(column:expected_world_size)" + severity: warning + message: "某些 collective seq 缺少 rank — 常见于 CPU-side hang、rank 分支发散或某 rank 提前退出" + + - id: op_mismatch + when: "step:collective_alignment | columns:op_min,op_max | any_not_equal" + severity: warning + message: "同一 seq 上 collective 类型不一致 — 检查各 rank 控制流和 process group 使用" + + - id: shape_dtype_mismatch + when: "step:collective_alignment | columns:input_sizes_min,input_sizes_max,input_dtypes_min,input_dtypes_max | any_not_equal" + severity: warning + message: "collective 输入 shape/dtype 不一致 — 常见于 all_to_all split 或动态 shape 发散" + + summary_template: | + ## NCCL watchdog timeout + - **rank_record_summary**: 每个 rank/PG 的 Flight Recorder 记录范围 + - **collective_alignment**: rank 缺失、op/shape/dtype/state 不一致 + - **suspect_callstacks**: 最近可疑 collective 的调用栈 + + next_steps: + - "发现 missing rank → 运行 training_hang 查看 CPU 主线程栈" + - "发现 shape/dtype mismatch → 检查数据相关分支、all_to_all split、动态 shape" + - "所有 rank 都进入 collective 但未完成 → 运行 nccl_culprit_victim / comm_bottleneck 看 NCCL wait 与网络" diff --git a/src/lib.rs b/src/lib.rs index 99b17207..fd23cb2f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -147,10 +147,10 @@ fn setup() { } let pid = std::process::id(); - eprintln!("Initializing probing module for process {pid} ...",); // Initialize logging (try_init to avoid conflicts) let _ = env_logger::try_init_from_env(env_logger::Env::new().filter(ENV_PROBING_LOGLEVEL)); + log::info!("Initializing probing module for process {pid} ..."); // Initialize probing server (local Unix domain socket) // This needs to happen early, even if Python module is not imported diff --git a/tests/regression/ext/test_comm_collective.py b/tests/regression/ext/test_comm_collective.py index 0e56e943..c9467a15 100644 --- a/tests/regression/ext/test_comm_collective.py +++ b/tests/regression/ext/test_comm_collective.py @@ -22,6 +22,29 @@ def _reset_tables(): yield +def test_tracing_yields_to_nccl_profiler_plugin(monkeypatch): + """Torch-side tracer must default OFF when the NCCL plugin is active.""" + import probing + from probing.profiling.collective import config as cc + + monkeypatch.setenv("WORLD_SIZE", "8") + monkeypatch.delenv("NCCL_PROFILER_PLUGIN", raising=False) + monkeypatch.setattr(probing.config, "get_str", lambda key: None) + assert cc.collective_tracing_enabled() is True + + monkeypatch.setenv("NCCL_PROFILER_PLUGIN", "/tmp/libprobing_nccl_profiler.so") + assert cc.nccl_profiler_plugin_active() is True + assert cc.collective_tracing_enabled() is False + + # Explicit enable always wins over the plugin default. + monkeypatch.setattr( + probing.config, + "get_str", + lambda key: "1" if key == "probing.torch.collective.enable" else None, + ) + assert cc.collective_tracing_enabled() is True + + def test_comm_collective_row_saved(): cm, meta = begin_comm_span( "all_reduce", diff --git a/tests/regression/nccl/test_nccl_plugin_path.py b/tests/regression/nccl/test_nccl_plugin_path.py index b5631127..d707f56e 100644 --- a/tests/regression/nccl/test_nccl_plugin_path.py +++ b/tests/regression/nccl/test_nccl_plugin_path.py @@ -14,7 +14,8 @@ def test_default_event_mask(): - assert DEFAULT_EVENT_MASK == 26 + # Coll | P2P | ProxyOp | ProxyStep | KernelCh + assert DEFAULT_EVENT_MASK == 94 def test_plugin_path_env_override(tmp_path): @@ -57,7 +58,7 @@ def test_cli_help_exits_2(capsys): def test_cli_event_mask(capsys): assert main(["--event-mask"]) == 0 - assert capsys.readouterr().out.strip() == "26" + assert capsys.readouterr().out.strip() == "94" def test_cli_help_lists_seed_mock(capsys): diff --git a/tests/regression/rust/probing/server/hierarchical_fanout_query.rs b/tests/regression/rust/probing/server/hierarchical_fanout_query.rs index 52e9568f..30b28cc6 100644 --- a/tests/regression/rust/probing/server/hierarchical_fanout_query.rs +++ b/tests/regression/rust/probing/server/hierarchical_fanout_query.rs @@ -132,10 +132,8 @@ fn install_cluster_without_hierarchical_metadata(coordinator_addr: &str, peer_ad } } -async fn run_hierarchical_fanout() -> FanoutQueryResponse { - fanout_query("SELECT 1 AS n", true, true, ClusterFanoutScope::Auto) - .await - .expect("hierarchical fanout") +async fn run_hierarchical_fanout() -> Result { + fanout_query("SELECT 1 AS n", true, true, ClusterFanoutScope::Auto).await } fn set_coordinator_env() { @@ -175,8 +173,10 @@ fn hierarchical_fanout_contacts_node_aggregators_not_every_rank() { scope: "node".into(), nodes_queried: 2, nodes_failed: Vec::new(), + peer_batches_dropped: 0, node_aggregators_queried: 0, local_ranks_queried: 1, + partial: false, }, ) .await; @@ -241,7 +241,7 @@ fn flat_fanout_contacts_all_remote_peers() { } #[test] -fn hierarchical_fanout_degrades_to_flat_without_metadata() { +fn hierarchical_fanout_rejects_without_metadata() { let _guard = ENV_LOCK.lock().unwrap(); clear_rank_env(); @@ -261,17 +261,13 @@ fn hierarchical_fanout_degrades_to_flat_without_metadata() { ); set_coordinator_env(); - let result = run_hierarchical_fanout().await; - + let err = run_hierarchical_fanout() + .await + .expect_err("missing metadata must not fall back to flat fan-out"); assert!( - !result.meta.hierarchical, - "missing group_rank/local_rank should fall back to flat fan-out" + err.to_string().contains("hierarchical fan-out unavailable"), + "unexpected error: {err}" ); - assert_eq!(result.meta.scope, "flat"); - assert_eq!(result.meta.node_aggregators_queried, 0); - assert_eq!(result.meta.local_ranks_queried, 0); - assert_eq!(result.meta.nodes_queried, 4); - assert!(result.meta.nodes_failed.is_empty()); }); clear_rank_env(); @@ -295,7 +291,9 @@ fn hierarchical_fanout_reports_failed_remote_node_aggregator() { install_cluster(coordinator_addr, &leaf_addr, dead_node_agg, &node1_leaf); set_coordinator_env(); - let result = run_hierarchical_fanout().await; + let result = run_hierarchical_fanout() + .await + .expect("hierarchical fanout"); assert!(result.meta.hierarchical); assert_eq!(result.meta.scope, "coordinator"); @@ -327,8 +325,10 @@ fn hierarchical_fanout_reports_failed_local_leaf() { scope: "node".into(), nodes_queried: 2, nodes_failed: Vec::new(), + peer_batches_dropped: 0, node_aggregators_queried: 0, local_ranks_queried: 1, + partial: false, }, ) .await; @@ -338,7 +338,9 @@ fn hierarchical_fanout_reports_failed_local_leaf() { install_cluster(coordinator_addr, dead_leaf, &node1_local0, &node1_leaf); set_coordinator_env(); - let result = run_hierarchical_fanout().await; + let result = run_hierarchical_fanout() + .await + .expect("hierarchical fanout"); assert!(result.meta.hierarchical); assert_eq!(result.meta.scope, "coordinator"); diff --git a/tests/regression/skills/test_install_tools.py b/tests/regression/skills/test_install_tools.py index e00cec54..67df15b7 100644 --- a/tests/regression/skills/test_install_tools.py +++ b/tests/regression/skills/test_install_tools.py @@ -41,12 +41,14 @@ def test_skill_roots_include_bundled(): assert "bundled" in labels or "repo" in labels -def test_merged_catalog_has_eleven_skills(): +def test_merged_catalog_has_thirteen_skills(): catalog = load_catalog() - assert len(catalog.skills) == 11 + assert len(catalog.skills) == 13 ids = {e.id for e in catalog.skills} assert "job_health" in ids assert "persistent_straggler" in ids + assert "watchdog_timeout" in ids + assert "sre_triage" in ids def test_list_skills_tool(): diff --git a/tests/regression/spec/api_spec.json b/tests/regression/spec/api_spec.json index 97c68a40..91385888 100644 --- a/tests/regression/spec/api_spec.json +++ b/tests/regression/spec/api_spec.json @@ -20,6 +20,8 @@ { "method": "POST", "path": "/apis/cluster/query" } ], "top_level": [ + { "method": "GET", "path": "/health" }, + { "method": "GET", "path": "/ready" }, { "method": "POST", "path": "/query" }, { "method": "POST", "path": "/query/dto" }, { "method": "GET", "path": "/config/{config_key}" }, @@ -104,6 +106,12 @@ "uses_body": false, "response": { "content_type": "application/json", "cors": false } }, + { + "local_path": "flight-recorder/snapshot", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } + }, { "local_path": "crash/hold", "method": "GET", diff --git a/tests/unit/probing/ext/test_megatron.py b/tests/unit/probing/ext/test_megatron.py new file mode 100644 index 00000000..dbde723a --- /dev/null +++ b/tests/unit/probing/ext/test_megatron.py @@ -0,0 +1,156 @@ +"""Megatron autostart integration tests (mocked Megatron modules).""" + +from __future__ import annotations + +import sys +import types +from unittest import mock + +import pytest + +import probing +from probing.ext import megatron as megatron_ext + + +@pytest.fixture(autouse=True) +def _reset_megatron_state(): + megatron_ext._PARALLEL_STATE_INIT = False + megatron_ext._TRAINING_INIT = False + megatron_ext._LAST_ROLE = None + megatron_ext._LAST_ITERATION = None + probing.clear_role() + for key in list(sys.modules): + if key == "megatron" or key.startswith("megatron."): + del sys.modules[key] + yield + probing.clear_role() + + +@pytest.fixture +def megatron_env(monkeypatch): + monkeypatch.setenv("PROBING_MEGATRON", "on") + monkeypatch.setenv("PROBING_MEGATRON_STEP_SYNC", "on") + + +def _make_parallel_state( + *, + initialized: bool = True, + tp: int = 2, + pp: int = 1, + dp: int = 3, +): + ps = types.ModuleType("megatron.core.parallel_state") + + def model_parallel_is_initialized(): + return initialized + + def get_tensor_model_parallel_rank(): + return tp + + def get_pipeline_model_parallel_rank(): + return pp + + def get_data_parallel_rank(): + return dp + + def initialize_model_parallel(*args, **kwargs): + return None + + ps.model_parallel_is_initialized = model_parallel_is_initialized + ps.get_tensor_model_parallel_rank = get_tensor_model_parallel_rank + ps.get_pipeline_model_parallel_rank = get_pipeline_model_parallel_rank + ps.get_data_parallel_rank = get_data_parallel_rank + ps.initialize_model_parallel = initialize_model_parallel + return ps + + +def test_megatron_job_detected_from_env(monkeypatch): + monkeypatch.setenv("TENSOR_MODEL_PARALLEL_RANK", "0") + assert megatron_ext.megatron_job_detected() + + +def test_sync_role_from_parallel_state(megatron_env): + ps = _make_parallel_state(tp=2, pp=1, dp=3) + role = megatron_ext.sync_role_from_parallel_state(ps) + assert role == "dp=3,pp=1,tp=2" + assert probing.current_role() == "dp=3,pp=1,tp=2" + + +def test_init_parallel_state_wraps_initialize(megatron_env, monkeypatch): + ps = _make_parallel_state(tp=0, pp=0, dp=1) + core = types.ModuleType("megatron.core") + core.parallel_state = ps + megatron = types.ModuleType("megatron") + megatron.core = core + monkeypatch.setitem(sys.modules, "megatron", megatron) + monkeypatch.setitem(sys.modules, "megatron.core", core) + monkeypatch.setitem(sys.modules, "megatron.core.parallel_state", ps) + + with mock.patch.dict( + "sys.modules", + { + "megatron.core.parallel_state": ps, + }, + ): + megatron_ext.init_parallel_state() + ps.initialize_model_parallel() + assert probing.current_role() == "dp=1,pp=0,tp=0" + + +def test_train_step_wrap_syncs_iteration(megatron_env, monkeypatch): + ps = _make_parallel_state() + training_mod = types.ModuleType("megatron.training.training") + calls: list[int] = [] + + def train_step(*args, **kwargs): + calls.append(1) + return {"loss": 1.0} + + training_mod.train_step = train_step + + global_vars = types.ModuleType("megatron.training.global_vars") + args_obj = types.SimpleNamespace(iteration=42) + + def get_args(): + return args_obj + + global_vars.get_args = get_args + + num_calc = types.ModuleType("megatron.core.num_microbatches_calculator") + + def get_num_microbatches(): + return 4 + + num_calc.get_num_microbatches = get_num_microbatches + + core = types.ModuleType("megatron.core") + core.parallel_state = ps + core.num_microbatches_calculator = num_calc + training_pkg = types.ModuleType("megatron.training") + training_pkg.training = training_mod + training_pkg.global_vars = global_vars + megatron = types.ModuleType("megatron") + megatron.core = core + megatron.training = training_pkg + + modules = { + "megatron": megatron, + "megatron.core": core, + "megatron.core.parallel_state": ps, + "megatron.core.num_microbatches_calculator": num_calc, + "megatron.training": training_pkg, + "megatron.training.training": training_mod, + "megatron.training.global_vars": global_vars, + } + with mock.patch.dict(sys.modules, modules): + megatron_ext.init_training() + training_mod.train_step() + assert calls == [1] + assert probing.step.local_step == 42 + assert int(probing.step.snapshot().micro_batches) == 4 + + +def test_megatron_disabled_by_env(monkeypatch): + monkeypatch.setenv("PROBING_MEGATRON", "off") + monkeypatch.setenv("TENSOR_MODEL_PARALLEL_RANK", "0") + assert not megatron_ext.megatron_autostart_enabled() diff --git a/tests/unit/probing/profiling/test_flight_recorder.py b/tests/unit/probing/profiling/test_flight_recorder.py new file mode 100644 index 00000000..a602ce80 --- /dev/null +++ b/tests/unit/probing/profiling/test_flight_recorder.py @@ -0,0 +1,63 @@ +from __future__ import annotations + + +def test_flight_recorder_snapshot_flattens_entries(monkeypatch): + from probing.profiling import flight_recorder as fr + + payload = { + "version": "2.5", + "comm_lib_version": "nccl-test", + "pg_config": { + "0": {"name": "0", "desc": "default_pg", "ranks": "[0, 1]"}, + }, + "pg_status": { + "0": { + "last_enqueued_collective": 4, + "last_started_collective": 3, + "last_completed_collective": 2, + }, + }, + "entries": [ + { + "frames": [ + {"name": "train_step", "filename": "train.py", "line": 42}, + ], + "record_id": 7, + "pg_id": 0, + "process_group": ("0", "default_pg"), + "collective_seq_id": 3, + "p2p_seq_id": 0, + "op_id": 9, + "profiling_name": "nccl:all_reduce", + "time_created_ns": 100, + "input_sizes": [[3, 4]], + "input_dtypes": ["Float"], + "output_sizes": [[3, 4]], + "output_dtypes": ["Float"], + "state": "completed", + "time_discovered_started_ns": 120, + "time_discovered_completed_ns": 140, + "retired": True, + "timeout_ms": 600000, + "is_p2p": False, + } + ], + } + + records = [] + statuses = [] + monkeypatch.setattr(fr, "_dump_nccl_trace", lambda **_: payload) + monkeypatch.setattr(fr, "_rank_world", lambda: (1, 2)) + monkeypatch.setattr(fr.TorchNcclFlightRecord, "append_many", records.extend) + monkeypatch.setattr(fr.TorchNcclPgStatus, "append_many", statuses.extend) + + result = fr.snapshot() + + assert result["ok"] is True + assert result["rank"] == 1 + assert result["records"] == 1 + assert result["process_groups"] == 1 + assert records[0].profiling_name == "nccl:all_reduce" + assert records[0].collective_seq_id == 3 + assert records[0].top_frame == "train_step (train.py:42)" + assert statuses[0].last_enqueued_collective == 4 diff --git a/tests/unit/probing/skills/test_loader.py b/tests/unit/probing/skills/test_loader.py index 1ac0f563..e2397b5a 100644 --- a/tests/unit/probing/skills/test_loader.py +++ b/tests/unit/probing/skills/test_loader.py @@ -40,6 +40,8 @@ def test_catalog_loads_all_skills(): "comm_bottleneck", "gpu_pressure", "nccl_culprit_victim", + "watchdog_timeout", + "sre_triage", } ids = {p.id for p in catalog.skills} assert ids == expected_ids @@ -84,6 +86,21 @@ def test_slow_rank_rank_latency_sql_golden_parity(): assert "- 10" in normalized_global +def test_comm_bottleneck_nccl_coll_perf_expansion(): + """Precise NCCL layer must expand independently of the legacy comm table.""" + skill = load_skill("comm_bottleneck") + local_steps = expand_skill(skill, {"use_global": False}) + coll_bw = next(s for s in local_steps if s.id == "nccl_coll_bw") + assert coll_bw.sql is not None + assert "FROM nccl.coll_perf" in coll_bw.sql + assert "timing_source" in coll_bw.sql + assert "comm_collective" not in coll_bw.sql + + global_steps = expand_skill(skill, {"use_global": True}) + coll_bw_global = next(s for s in global_steps if s.id == "nccl_coll_bw") + assert "FROM global.nccl.coll_perf" in (coll_bw_global.sql or "") + + def test_match_skills_hang(): matched = match_skills("训练卡住了 hang") assert "training_hang" in matched @@ -92,3 +109,27 @@ def test_match_skills_hang(): def test_match_skills_straggler(): matched = match_skills("哪个 rank 拖后腿 straggler") assert "slow_rank" in matched + + +def test_match_skills_watchdog_timeout(): + matched = match_skills("NCCL watchdog timeout flight recorder") + assert "watchdog_timeout" in matched + + +def test_watchdog_timeout_table_expansion(): + skill = load_skill("watchdog_timeout") + local_steps = expand_skill(skill, {"use_global": False, "seq_window": 7}) + local_sql = " ".join(s.sql or "" for s in local_steps) + assert "FROM python.torch_nccl_flight_record" in local_sql + assert "global.python.torch_nccl_flight_record" not in local_sql + assert "- 7" in local_sql + + global_steps = expand_skill(skill, {"use_global": True, "seq_window": 11}) + global_sql = " ".join(s.sql or "" for s in global_steps) + assert "FROM global.python.torch_nccl_flight_record" in global_sql + assert "- 11" in global_sql + + +def test_match_skills_sre_triage(): + matched = match_skills("SRE 值班 runbook 事故第一响应") + assert "sre_triage" in matched diff --git a/tests/unit/probing/test_crash_flight_recorder.py b/tests/unit/probing/test_crash_flight_recorder.py new file mode 100644 index 00000000..f1b5fdd1 --- /dev/null +++ b/tests/unit/probing/test_crash_flight_recorder.py @@ -0,0 +1,30 @@ +"""Crash hook Flight Recorder autostart tests.""" + +from probing import crash as crash_mod + + +def test_watchdog_detection(): + assert crash_mod._looks_like_nccl_watchdog( + RuntimeError( + "Watchdog caught collective operation timeout: WorkNCCL(SeqNum=1, OpType=ALLREDUCE)" + ) + ) + assert not crash_mod._looks_like_nccl_watchdog(RuntimeError("something else")) + + +def test_flight_recorder_snapshot_on_watchdog(monkeypatch): + monkeypatch.setenv("PROBING_FR_ON_WATCHDOG", "on") + calls: list[dict] = [] + + def fake_snapshot(**kwargs): + calls.append(kwargs) + return {"ok": True} + + monkeypatch.setattr( + "probing.profiling.flight_recorder.snapshot", + fake_snapshot, + ) + crash_mod._maybe_snapshot_flight_recorder( + RuntimeError("Watchdog caught collective operation timeout: WorkNCCL") + ) + assert calls == [{"only_active": True, "persist": True}] diff --git a/web/src/api/cluster.rs b/web/src/api/cluster.rs index 50845991..082c7dff 100644 --- a/web/src/api/cluster.rs +++ b/web/src/api/cluster.rs @@ -24,10 +24,23 @@ pub struct ClusterQueryResponse { /// Cluster management API impl ApiClient { - /// Get all node information + /// Get all node information (paginated server-side; fetches all pages). pub async fn get_nodes(&self) -> Result> { - let response = self.get_request("/apis/nodes").await?; - Self::parse_json(&response) + let mut all = Vec::new(); + let mut offset = 0usize; + loop { + let response = self + .get_request(&format!("/apis/nodes?offset={offset}&limit=1024")) + .await?; + let page: NodeListResponse = Self::parse_json(&response)?; + let empty = page.nodes.is_empty(); + all.extend(page.nodes); + if all.len() >= page.total || empty { + break; + } + offset = offset.saturating_add(1024); + } + Ok(all) } /// On-demand SQL fan-out across cluster nodes (`cluster=true`) or local only. From ce3443e9023eafaa37af568c8bcf38109112cca3 Mon Sep 17 00:00:00 2001 From: Reiase Date: Wed, 8 Jul 2026 09:50:39 +0800 Subject: [PATCH 11/37] Update project structure and documentation for skills and dependencies - Added support for bundled skills in `python/probing/bundled_skills/` and updated the symlink in `skills/` to point to this new location. - Enhanced `.gitignore` to exclude `*.egg-info/` directories. - Updated `Cargo.toml` and `Cargo.lock` to include the new `probing-skills` crate, which centralizes skill loading and execution. - Revised documentation in `AGENTS.md`, `api-reference.md`, and `extensibility.md` to reflect changes in skill discovery and execution paths. - Improved Makefile for better handling of Python virtual environments and build processes. - Removed outdated `skills/README.md` and `skills/catalog.yaml` files as part of the restructuring. This commit aims to streamline the skill management process and improve the overall clarity of the project's documentation. --- .github/workflows/pypi.yml | 6 +- .github/workflows/test.yml | 12 +- .gitignore | 1 + AGENTS.md | 19 +- Cargo.lock | 16 +- Cargo.toml | 1 + Makefile | 156 ++-- docs/Makefile | 2 +- docs/src/api-reference.md | 18 +- docs/src/api-reference.zh.md | 18 +- docs/src/contributing.md | 22 +- docs/src/contributing.zh.md | 1 + docs/src/design/extensibility.md | 95 ++- docs/src/design/extensibility.zh.md | 151 +++- docs/src/design/modularity.md | 21 +- docs/src/design/modularity.zh.md | 23 +- docs/src/guide/skills.md | 12 +- docs/src/guide/skills.zh.md | 12 +- docs/src/reference/skill-format.md | 2 +- docs/src/reference/sql-tables.md | 7 +- docs/src/reference/sql-tables.zh.md | 5 +- examples/README.md | 1 + examples/probing-acme/README.md | 46 ++ examples/probing-acme/pyproject.toml | 26 + .../probing-acme/src/probing_acme/__init__.py | 10 + .../probing-acme/src/probing_acme/magics.py | 14 + .../probing_acme/skills/acme_health/SKILL.md | 12 + .../skills/acme_health/steps.yaml | 18 + .../src/probing_acme/skills/catalog.yaml | 8 + probing/cli/Cargo.toml | 3 +- probing/cli/src/cli/skill/backend.rs | 60 ++ probing/cli/src/cli/skill/mod.rs | 10 +- probing/cli/src/cli/skill/runner.rs | 707 +++--------------- .../core/resources}/tables.yaml | 7 +- probing/core/src/core/semantic_catalog.rs | 96 ++- probing/crates/skills/Cargo.toml | 18 + probing/crates/skills/src/api.rs | 353 +++++++++ probing/crates/skills/src/backend.rs | 70 ++ probing/crates/skills/src/catalog.rs | 72 ++ probing/crates/skills/src/discovery.rs | 261 +++++++ .../skill => crates/skills/src}/interpret.rs | 86 +++ probing/crates/skills/src/lib.rs | 27 + .../cli/skill => crates/skills/src}/loader.rs | 246 +++--- probing/crates/skills/src/routing.rs | 84 +++ probing/crates/skills/src/runner.rs | 542 ++++++++++++++ probing/extensions/python/Cargo.toml | 1 + probing/extensions/python/src/features/mod.rs | 1 + .../python/src/features/skills_api.rs | 77 ++ probing/server/API.md | 16 +- probing/server/src/mcp/mod.rs | 48 +- pyproject.toml | 9 + python/probing/bundled_skills/README.md | 18 +- python/probing/bundled_skills/catalog.yaml | 49 ++ .../bundled_skills/health_overview/steps.yaml | 37 + .../bundled_skills/semantic/intents.yaml | 23 +- .../bundled_skills/semantic/tables.yaml | 474 +----------- .../bundled_skills}/sre_triage/SKILL.md | 0 .../bundled_skills}/sre_triage/steps.yaml | 0 .../bundled_skills}/watchdog_timeout/SKILL.md | 0 .../watchdog_timeout/steps.yaml | 0 python/probing/discovery.py | 31 + python/probing/extensions/README.md | 41 + python/probing/extensions/__init__.py | 67 ++ python/probing/extensions/__main__.py | 31 + python/probing/extensions/entrypoints.py | 106 +++ python/probing/extensions/skills.py | 183 +++++ python/probing/extensions/types.py | 14 + python/probing/extensions/vendor.py | 84 +++ python/probing/handlers/pythonext.py | 54 ++ python/probing/repl/__init__.py | 13 +- python/probing/skills/README.md | 48 +- python/probing/skills/__init__.py | 22 +- python/probing/skills/interpret.py | 270 ------- python/probing/skills/loader.py | 415 ++++------ python/probing/skills/paths.py | 186 +---- python/probing/skills/serialize.py | 48 ++ python/probing/skills/tools.py | 169 +---- python/probing/web_assets.py | 53 +- skills | 1 + skills/README.md | 64 -- skills/catalog.yaml | 250 ------- skills/comm_bottleneck/SKILL.md | 39 - skills/comm_bottleneck/steps.yaml | 171 ----- skills/crash_triage/SKILL.md | 25 - skills/crash_triage/steps.yaml | 28 - skills/gpu_pressure/SKILL.md | 28 - skills/gpu_pressure/steps.yaml | 104 --- skills/health_overview/SKILL.md | 28 - skills/health_overview/steps.yaml | 145 ---- skills/install.sh | 14 - skills/job_health/SKILL.md | 48 -- skills/job_health/steps.yaml | 176 ----- skills/memory_leak/SKILL.md | 30 - skills/memory_leak/steps.yaml | 145 ---- skills/module_bottleneck/SKILL.md | 30 - skills/module_bottleneck/steps.yaml | 114 --- skills/nccl_culprit_victim/SKILL.md | 36 - skills/nccl_culprit_victim/steps.yaml | 202 ----- skills/persistent_straggler/SKILL.md | 45 -- skills/persistent_straggler/steps.yaml | 194 ----- skills/semantic/intents.yaml | 59 -- skills/semantic/pages.yaml | 76 -- skills/slow_rank/SKILL.md | 31 - skills/slow_rank/steps.yaml | 186 ----- skills/training_hang/SKILL.md | 28 - skills/training_hang/steps.yaml | 114 --- src/lib.rs | 12 + tests/fixtures/skill_derived_variables.yaml | 34 + tests/fixtures/skill_interpret_parity.yaml | 42 ++ tests/regression/nccl/test_nccl_skill.py | 10 +- .../packaging/test_wheel_bundled_skills.py | 47 ++ tests/regression/skills/test_install_tools.py | 10 +- tests/regression/spec/api_spec.json | 43 ++ tests/unit/probing/skills/test_interpret.py | 48 -- tests/unit/probing/test_discovery.py | 86 +++ tests/unit/probing/test_web_assets.py | 12 +- web/Cargo.toml | 3 +- web/Dioxus.toml | 2 + web/dist | 1 + web/src/agent/cluster.rs | 4 + web/src/agent/interpret.rs | 411 +--------- web/src/agent/llm.rs | 2 +- web/src/agent/mod.rs | 8 +- web/src/agent/routing.rs | 156 ++-- web/src/agent/runner.rs | 300 ++------ web/src/agent/skill.rs | 400 +++------- web/src/agent/skills_backend.rs | 93 +++ web/src/api/mod.rs | 3 + web/src/api/skills.rs | 30 + web/src/api/traces.rs | 227 +----- web/src/components/agent/chat.rs | 5 +- web/src/components/layout.rs | 4 + 132 files changed, 4295 insertions(+), 6074 deletions(-) create mode 100644 examples/probing-acme/README.md create mode 100644 examples/probing-acme/pyproject.toml create mode 100644 examples/probing-acme/src/probing_acme/__init__.py create mode 100644 examples/probing-acme/src/probing_acme/magics.py create mode 100644 examples/probing-acme/src/probing_acme/skills/acme_health/SKILL.md create mode 100644 examples/probing-acme/src/probing_acme/skills/acme_health/steps.yaml create mode 100644 examples/probing-acme/src/probing_acme/skills/catalog.yaml create mode 100644 probing/cli/src/cli/skill/backend.rs rename {skills/semantic => probing/core/resources}/tables.yaml (98%) create mode 100644 probing/crates/skills/Cargo.toml create mode 100644 probing/crates/skills/src/api.rs create mode 100644 probing/crates/skills/src/backend.rs create mode 100644 probing/crates/skills/src/catalog.rs create mode 100644 probing/crates/skills/src/discovery.rs rename probing/{cli/src/cli/skill => crates/skills/src}/interpret.rs (76%) create mode 100644 probing/crates/skills/src/lib.rs rename probing/{cli/src/cli/skill => crates/skills/src}/loader.rs (75%) create mode 100644 probing/crates/skills/src/routing.rs create mode 100644 probing/crates/skills/src/runner.rs create mode 100644 probing/extensions/python/src/features/skills_api.rs mode change 100644 => 120000 python/probing/bundled_skills/semantic/tables.yaml rename {skills => python/probing/bundled_skills}/sre_triage/SKILL.md (100%) rename {skills => python/probing/bundled_skills}/sre_triage/steps.yaml (100%) rename {skills => python/probing/bundled_skills}/watchdog_timeout/SKILL.md (100%) rename {skills => python/probing/bundled_skills}/watchdog_timeout/steps.yaml (100%) create mode 100644 python/probing/discovery.py create mode 100644 python/probing/extensions/README.md create mode 100644 python/probing/extensions/__init__.py create mode 100644 python/probing/extensions/__main__.py create mode 100644 python/probing/extensions/entrypoints.py create mode 100644 python/probing/extensions/skills.py create mode 100644 python/probing/extensions/types.py create mode 100644 python/probing/extensions/vendor.py delete mode 100644 python/probing/skills/interpret.py create mode 100644 python/probing/skills/serialize.py create mode 120000 skills delete mode 100644 skills/README.md delete mode 100644 skills/catalog.yaml delete mode 100644 skills/comm_bottleneck/SKILL.md delete mode 100644 skills/comm_bottleneck/steps.yaml delete mode 100644 skills/crash_triage/SKILL.md delete mode 100644 skills/crash_triage/steps.yaml delete mode 100644 skills/gpu_pressure/SKILL.md delete mode 100644 skills/gpu_pressure/steps.yaml delete mode 100644 skills/health_overview/SKILL.md delete mode 100644 skills/health_overview/steps.yaml delete mode 100755 skills/install.sh delete mode 100644 skills/job_health/SKILL.md delete mode 100644 skills/job_health/steps.yaml delete mode 100644 skills/memory_leak/SKILL.md delete mode 100644 skills/memory_leak/steps.yaml delete mode 100644 skills/module_bottleneck/SKILL.md delete mode 100644 skills/module_bottleneck/steps.yaml delete mode 100644 skills/nccl_culprit_victim/SKILL.md delete mode 100644 skills/nccl_culprit_victim/steps.yaml delete mode 100644 skills/persistent_straggler/SKILL.md delete mode 100644 skills/persistent_straggler/steps.yaml delete mode 100644 skills/semantic/intents.yaml delete mode 100644 skills/semantic/pages.yaml delete mode 100644 skills/slow_rank/SKILL.md delete mode 100644 skills/slow_rank/steps.yaml delete mode 100644 skills/training_hang/SKILL.md delete mode 100644 skills/training_hang/steps.yaml create mode 100644 tests/fixtures/skill_derived_variables.yaml create mode 100644 tests/fixtures/skill_interpret_parity.yaml create mode 100644 tests/regression/packaging/test_wheel_bundled_skills.py delete mode 100644 tests/unit/probing/skills/test_interpret.py create mode 100644 tests/unit/probing/test_discovery.py create mode 120000 web/dist create mode 100644 web/src/agent/skills_backend.rs create mode 100644 web/src/api/skills.rs diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index bd75886c..57963ad2 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -41,7 +41,7 @@ jobs: env: SKIP_FRONTEND_CLEAN: "1" run: | - if [ ! -f web/dist/index.html ]; then + if [ ! -f python/probing/bundled_web/public/index.html ]; then make frontend fi make wheel-bundle nccl-profiler-lib @@ -80,7 +80,7 @@ jobs: env: SKIP_FRONTEND_CLEAN: "1" run: | - if [ ! -f web/dist/index.html ]; then + if [ ! -f python/probing/bundled_web/public/index.html ]; then make frontend fi make wheel-bundle @@ -114,7 +114,7 @@ jobs: env: SKIP_FRONTEND_CLEAN: "1" run: | - if [ ! -f web/dist/index.html ]; then + if [ ! -f python/probing/bundled_web/public/index.html ]; then make frontend fi make wheel-bundle nccl-profiler-lib diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e56266be..77a497dc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,11 +28,19 @@ jobs: (cd web && cargo fmt --all -- --check) make lint-rust + - name: Python and docs lint + working-directory: ${{ github.workspace }} + run: | + .venv/bin/python -m pip install -q ruff + make lint-python + make docs-install + make lint-docs + - name: Build wheel env: SKIP_FRONTEND_CLEAN: "1" run: | - if [ ! -f web/dist/index.html ]; then + if [ ! -f python/probing/bundled_web/public/index.html ]; then make frontend fi make wheel-ci @@ -160,7 +168,7 @@ jobs: SKIP_FRONTEND_CLEAN: "1" PROBING: "1" run: | - if [ ! -f web/dist/index.html ]; then + if [ ! -f python/probing/bundled_web/public/index.html ]; then make frontend fi make wheel-ci diff --git a/.gitignore b/.gitignore index f00f94e9..6fa0ec8e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ Cargo.lock # MSVC Windows builds of rustc generate these, which store debugging information *.pdb probing.egg-info/ +*.egg-info/ *.so *.bak .idea/ diff --git a/AGENTS.md b/AGENTS.md index 24850595..0204719f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -27,13 +27,19 @@ Keep the propagation chain clean — don't reintroduce scattered `map_err`/`insp ## Skills -All diagnostic skills live under **`skills/`**. Each subdirectory contains: +All diagnostic skills live under **`skills/`** (authoring SSOT; wheel copy in +`python/probing/bundled_skills/`). Each subdirectory contains: - **`SKILL.md`** — when to use the skill and how to interpret results (read this for routing) - **`steps.yaml`** — executable probe steps (used by `probing skill run` and the Web Investigate agent) Browse the catalog: `skills/catalog.yaml` +**Architecture:** *Discovery* — Python entry points (`python -m probing.extensions skill-roots`) +or server API (`GET /apis/pythonext/skills/*`). *Execution* — Rust `probing-skills` +(CLI in-process, MCP `run_skill` / `plan_skill`, Web WASM). Python `probing.skills.tools` +is discovery/plan only. + ## Install skills into your agent So Cursor / Claude Code / Codex can discover and invoke skills: @@ -75,11 +81,11 @@ When the probing server is running (e.g. after `PROBING=1`), connect your agent See `probing/server/API.md`. -From Python (e.g. in agent-generated scripts): +From Python (discovery / catalog only — execution is Rust CLI or MCP): ```python -from probing.skills.tools import list_skills, run_skill -run_skill("health_overview", target="") +from probing.skills.tools import list_skills, plan_skill_run +plan_skill_run("health_overview") ``` ## Built-in skills (summary) @@ -101,4 +107,7 @@ Details in each `skills//SKILL.md`. ## Extending -Add table plugins under `python/probing/ext/` (data). Add diagnostic skills under `skills/` (how to investigate). NCCL profiler plugin: `docs/src/design/nccl-profiler.md`. See `docs/src/design/extensibility.md`. +- **In-repo skills:** `skills/` + `python -m probing.skills validate` +- **Vendor pip packages:** `probing-` — discovery in `python/probing/extensions/`; template `examples/probing-acme/` +- **Table plugins:** `python/probing/ext/` (`@table` + `python.enabled`) +- **NCCL profiler:** `docs/src/design/nccl-profiler.md` diff --git a/Cargo.lock b/Cargo.lock index 02df5215..93c2e28b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3388,13 +3388,13 @@ name = "probing-cli" version = "0.2.5" dependencies = [ "anyhow", + "async-trait", "clap 4.5.38", "env_logger", "futures-util", "http-body-util", "hyper", "hyper-util", - "include_dir", "libc", "libloading 0.8.6", "log", @@ -3403,6 +3403,7 @@ dependencies = [ "pete", "probing-memtable", "probing-proto", + "probing-skills", "probing-store", "procfs", "reedline", @@ -3573,6 +3574,7 @@ dependencies = [ "probing-core", "probing-memtable", "probing-proto", + "probing-skills", "probing-store", "pyo3", "pyo3-build-config", @@ -3647,6 +3649,18 @@ dependencies = [ "ureq", ] +[[package]] +name = "probing-skills" +version = "0.2.5" +dependencies = [ + "anyhow", + "async-trait", + "probing-proto", + "serde", + "serde_json", + "serde_yaml", +] + [[package]] name = "probing-store" version = "0.2.5" diff --git a/Cargo.toml b/Cargo.toml index dc464c53..7a5222a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ members = [ "probing/extensions/hccl-profapi", "probing/server", "probing/crates/store", + "probing/crates/skills", ] [workspace.package] diff --git a/Makefile b/Makefile index 0197706f..e5aa66ce 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Probing Makefile # # develop → maturin develop (Rust/Python daily loop) -# frontend → web/dist/ + python/probing/bundled_web/ (manual, needs dx) +# frontend → dx bundle → python/probing/bundled_web/public (web/dist symlink) # wheel → bundle skills + UI, then maturin build # frontend wheel → full release path # @@ -23,7 +23,7 @@ else endif MATURIN_FLAGS := $(MATURIN_RELEASE) --features $(MATURIN_FEATURES) -DX_PUBLIC := web/target/dx/web/release/web/public +BUNDLED_WEB_PUBLIC := python/probing/bundled_web/public ifdef ZIG ifdef TARGET @@ -31,13 +31,16 @@ ifdef TARGET endif endif -PYTHON ?= $(shell test -x .venv/bin/python && echo .venv/bin/python || echo python3) -VENV_PYTHON := $(abspath .venv/bin/python) +# PYTHON_BOOTSTRAP: only for creating .venv (before it exists). Recipes use VENV_PYTHON. +PYTHON_BOOTSTRAP ?= $(shell command -v python3 2>/dev/null || echo python3) +VENV_PYTHON := .venv/bin/python +# Absolute path for recipes that cd into subdirs (abspath breaks if .venv missing at parse time). +VENV_PYTHON_ABS := $(CURDIR)/.venv/bin/python BUILD_PY_DEPS := build wheel toml maturin DEV_PTH := python/probing/dev_pth.py DEV_PY_DEPS := pyyaml pytest pytest-cov coverage ipython ipykernel -PYTEST_RUN := PROBING=1 $(PYTHON) -m pytest +PYTEST_RUN := PROBING=1 $(VENV_PYTHON) -m pytest PYTEST_UNIT_ARGS := tests/unit PYTEST_REGRESSION_ARGS := tests/regression PYTEST_ARGS := $(PYTEST_UNIT_ARGS) $(PYTEST_REGRESSION_ARGS) @@ -57,17 +60,21 @@ help: @echo "" @echo " develop / dev Bootstrap: _core, CLI, pytest, site hook" @echo " core Rebuild probing._core after Rust edits" - @echo " frontend Build web/dist/ + sync bundled_web (dx; manual)" - @echo " wheel Build dist/*.whl (needs web/dist/; bundles skills + UI)" + @echo " frontend Build UI into python/probing/bundled_web (dx bundle)" + @echo " wheel Build dist/*.whl (needs bundled_web; bundles skills + UI)" @echo " wheel-ci alias for wheel (native build; PyPI uses maturin-action + zig)" @echo " install-wheel pip install dist/probing-*.whl" @echo " venv create/refresh project .venv (used by develop and CI)" - @echo " test / lint Full test and lint suites" + @echo " test Rust + editable Python (daily dev)" + @echo " test-wheel Installed-wheel Python tests (needs dist/*.whl)" + @echo " test-ci test + test-wheel (matches CI Python gate)" + @echo " lint ruff + clippy + mkdocs --strict" @echo " fmt rustfmt workspace + web (same paths as CI)" @echo " check-dev Quick env sanity check" @echo " clean Remove build artifacts" @echo "" - @echo "Env: PYTHON DEBUG=1 ZIG=1 TARGET=" + @echo "Release gate: make frontend && make wheel && make test-ci" + @echo "Env: DEBUG=1 ZIG=1 TARGET=" # ============================================================================== .PHONY: setup install-dev-python-deps @@ -75,47 +82,47 @@ setup: @if command -v pip >/dev/null 2>&1; then pip install pre-commit; fi @if command -v pre-commit >/dev/null 2>&1; then pre-commit install; fi -install-dev-python-deps: - @if $(PYTHON) -c "import pytest, yaml" 2>/dev/null; then \ +install-dev-python-deps: venv + @if $(VENV_PYTHON) -c "import pytest, yaml" 2>/dev/null; then \ echo " dev Python deps OK"; \ - elif $(PYTHON) -c "import pip" 2>/dev/null; then \ - $(PYTHON) -m pip install -q -U pip $(DEV_PY_DEPS); \ - elif command -v uv >/dev/null 2>&1; then \ - uv pip install -q --python $(PYTHON) $(DEV_PY_DEPS); \ else \ - $(PYTHON) -m ensurepip --upgrade; \ - $(PYTHON) -m pip install -q -U pip $(DEV_PY_DEPS); \ + $(VENV_PYTHON) -m pip install -q -U pip $(DEV_PY_DEPS); \ fi # ============================================================================== -.PHONY: core develop dev check-dev frontend sync-bundled-web wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib hccl-shim-lib venv venv-wheel install-build-deps install-wheel-test-deps +.PHONY: core develop dev check-dev frontend wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib hccl-shim-lib venv venv-wheel install-build-deps install-wheel-test-deps venv: - @test -x .venv/bin/python || $(shell command -v python3 || echo python3) -m venv .venv - .venv/bin/python -m pip install -q -U pip + @test -x $(VENV_PYTHON) || $(PYTHON_BOOTSTRAP) -m venv .venv + $(VENV_PYTHON) -m pip install -q -U pip # Backward-compatible alias (CI/docs may still reference venv-wheel). venv-wheel: venv install-build-deps: venv - $(PYTHON) -m pip install -q -U pip $(BUILD_PY_DEPS) + $(VENV_PYTHON) -m pip install -q -U pip $(BUILD_PY_DEPS) install-wheel-test-deps: venv - $(PYTHON) -m pip install -q -U pip $(PYTEST_WHEEL_DEPS) + $(VENV_PYTHON) -m pip install -q -U pip $(PYTEST_WHEEL_DEPS) -core: nccl-profiler-lib hccl-shim-lib - $(PYTHON) -m maturin develop $(MATURIN_FLAGS) +core: venv nccl-profiler-lib hccl-shim-lib + $(VENV_PYTHON) -m maturin develop $(MATURIN_FLAGS) develop: install-build-deps core install-dev-python-deps - $(PYTHON) $(DEV_PTH) install + $(VENV_PYTHON) $(DEV_PTH) install @$(MAKE) --no-print-directory check-dev dev: develop -check-dev: - @$(PYTHON) $(DEV_PTH) status >/dev/null 2>&1 \ +check-dev: venv + @test -L skills && test -f skills/catalog.yaml \ + || { echo "error: skills/ must be a symlink to python/probing/bundled_skills"; exit 1; } + @ROOT=$$(cd skills && pwd -P); PKG=$$(cd python/probing/bundled_skills && pwd -P); \ + test "$$ROOT" = "$$PKG" \ + || { echo "error: skills symlink target mismatch"; exit 1; } + @$(VENV_PYTHON) $(DEV_PTH) status >/dev/null 2>&1 \ || { echo "run: make develop"; exit 1; } - @PROBING=1 $(PYTHON) -c "\ + @PROBING=1 $(VENV_PYTHON) -c "\ import shutil, sys; \ from probing import _core, VERSION; \ from probing.skills.tools import list_skills; \ @@ -124,31 +131,24 @@ print(f'ok: probing {VERSION}, {len(list_skills())} skills, cli={shutil.which(\" || { echo "run: make develop"; exit 1; } frontend: - @test -n "$$SKIP_FRONTEND_CLEAN" || rm -rf web/dist - cd web && dx build --release - @test -f $(DX_PUBLIC)/index.html - cp -R $(DX_PUBLIC)/. web/dist/ - @mkdir -p web/dist/assets - @cp -f web/assets/logo.svg web/dist/logo.svg 2>/dev/null || true - @cp -f web/assets/logo.svg web/dist/assets/logo.svg 2>/dev/null || true - @cp -f web/assets/tailwind.css web/dist/assets/tailwind.css - @echo "web/dist ($$(du -sh web/dist | cut -f1))" - $(MAKE) sync-bundled-web - -sync-bundled-web: - @test -f web/dist/index.html || { echo "error: web/dist missing — run make frontend first"; exit 1; } - rm -rf python/probing/bundled_web - cp -R web/dist python/probing/bundled_web - @echo "python/probing/bundled_web ($$(du -sh python/probing/bundled_web | cut -f1))" + @test -n "$$SKIP_FRONTEND_CLEAN" || rm -rf python/probing/bundled_web + cd web && dx bundle --release + @test -f $(BUNDLED_WEB_PUBLIC)/index.html + @mkdir -p $(BUNDLED_WEB_PUBLIC)/assets + @cp -f web/assets/logo.svg $(BUNDLED_WEB_PUBLIC)/logo.svg 2>/dev/null || true + @cp -f web/assets/logo.svg $(BUNDLED_WEB_PUBLIC)/assets/logo.svg 2>/dev/null || true + @cp -f web/assets/tailwind.css $(BUNDLED_WEB_PUBLIC)/assets/tailwind.css + @rm -rf web/dist + @ln -s python/probing/bundled_web/public web/dist + @echo "$(BUNDLED_WEB_PUBLIC) ($$(du -sh $(BUNDLED_WEB_PUBLIC) | cut -f1))" wheel-bundle: - @test -f web/dist/index.html || { echo "error: run 'make frontend' first"; exit 1; } - rm -rf python/probing/bundled_skills - cp -R skills python/probing/bundled_skills - $(MAKE) sync-bundled-web + @test -f $(BUNDLED_WEB_PUBLIC)/index.html || { echo "error: run 'make frontend' first"; exit 1; } + @test -f python/probing/bundled_skills/catalog.yaml \ + || { echo "error: missing python/probing/bundled_skills/catalog.yaml"; exit 1; } wheel: install-build-deps wheel-bundle nccl-profiler-lib hccl-shim-lib - $(PYTHON) -m maturin build $(MATURIN_FLAGS) --out dist + $(VENV_PYTHON) -m maturin build $(MATURIN_FLAGS) --out dist wheel-ci: $(MAKE) wheel @@ -156,13 +156,13 @@ wheel-ci: install-wheel: venv @WH=$$(ls -1 dist/probing-*.whl 2>/dev/null | head -1); \ test -n "$$WH" || { echo "run: make wheel"; exit 1; }; \ - $(PYTHON) -m pip install -q -U pip && \ - $(PYTHON) -m pip install --force-reinstall "$$WH" && \ - PROBING=0 $(PYTHON) -c "\ + $(VENV_PYTHON) -m pip install -q -U pip && \ + $(VENV_PYTHON) -m pip install --force-reinstall "$$WH" && \ + PROBING=0 $(VENV_PYTHON) -c "\ import probing; from probing import _core; from pathlib import Path; \ root = Path(probing.__file__).resolve().parent; \ assert (root / 'bundled_skills' / 'catalog.yaml').is_file(), f'missing bundled skills under {root}'; \ -assert (root / 'bundled_web' / 'index.html').is_file(), f'missing bundled web UI under {root}'; \ +assert (root / 'bundled_web' / 'public' / 'index.html').is_file() or (root / 'bundled_web' / 'index.html').is_file(), f'missing bundled web UI under {root}'; \ print('probing', probing.VERSION)" # Linux NCCL plugin copied into python/probing/libs/ for the wheel. @@ -206,27 +206,33 @@ PYTEST_WHEEL_ARGS := tests/unit tests/regression PYTEST_WHEEL_FLAGS := --import-mode=importlib -o pythonpath= -o "addopts=--verbose --color=yes --durations=10 --strict-markers" PYTEST_WHEEL_EXTRA ?= -.PHONY: test test-rust test-rust-unit test-rust-regression test-python test-python-unit test-python-regression test-doctest test-python-wheel coverage-python-wheel +.PHONY: test test-wheel test-ci test-rust test-rust-unit test-rust-regression test-python test-python-unit test-python-regression test-doctest test-python-wheel coverage-python-wheel .PHONY: fmt fmt-check lint lint-python lint-rust lint-docs lint-core clippy clippy-fix coverage coverage-rust coverage-python bootstrap clean docs-install docs docs-serve docs-clean test: test-rust test-python +test-wheel: install-wheel test-python-wheel +test-ci: test test-wheel test-rust: test-rust-unit test-rust-regression -test-rust-unit: +test-rust-unit: venv @if test -x $(VENV_PYTHON); then \ - export PYTHON_SYS_EXECUTABLE=$(VENV_PYTHON) PYO3_PYTHON=$(VENV_PYTHON); \ + export PYTHON_SYS_EXECUTABLE=$(VENV_PYTHON_ABS) PYO3_PYTHON=$(VENV_PYTHON_ABS); \ elif command -v pyenv >/dev/null 2>&1; then \ P=$$(pyenv which python3 2>/dev/null); \ test -n "$$P" && export PYTHON_SYS_EXECUTABLE=$$P PYO3_PYTHON=$$P; \ + else \ + echo "error: no Python for PyO3; run: make venv"; exit 1; \ fi; \ cargo nextest run --lib --workspace --no-default-features --nff -test-rust-regression: +test-rust-regression: venv @if test -x $(VENV_PYTHON); then \ - export PYTHON_SYS_EXECUTABLE=$(VENV_PYTHON) PYO3_PYTHON=$(VENV_PYTHON); \ + export PYTHON_SYS_EXECUTABLE=$(VENV_PYTHON_ABS) PYO3_PYTHON=$(VENV_PYTHON_ABS); \ elif command -v pyenv >/dev/null 2>&1; then \ P=$$(pyenv which python3 2>/dev/null); \ test -n "$$P" && export PYTHON_SYS_EXECUTABLE=$$P PYO3_PYTHON=$$P; \ + else \ + echo "error: no Python for PyO3; run: make venv"; exit 1; \ fi; \ cargo nextest run --tests -p probing-rust-regression -p probing-macros --no-default-features --nff @@ -235,11 +241,11 @@ test-python-unit: check-dev PROBING=0 ${PYTEST_RUN} $(PYTEST_UNIT_ARGS) test-python-regression: check-dev ${PYTEST_RUN} $(PYTEST_REGRESSION_ARGS) -test-doctest: +test-doctest: venv ${PYTEST_RUN} --doctest-modules python/probing --ignore=python/probing/cli/__main__.py test-python-wheel: venv install-wheel-test-deps - PROBING=1 $(PYTHON) -m pytest $(PYTEST_WHEEL_FLAGS) $(PYTEST_WHEEL_EXTRA) $(PYTEST_WHEEL_ARGS) + PROBING=1 $(VENV_PYTHON) -m pytest $(PYTEST_WHEEL_FLAGS) $(PYTEST_WHEEL_EXTRA) $(PYTEST_WHEEL_ARGS) coverage-python-wheel: $(MAKE) test-python-wheel PYTEST_WHEEL_EXTRA="--cov=probing --cov=tests --cov-report=xml:coverage.xml" @@ -253,21 +259,16 @@ fmt-check: $(FMT_WEB) -- --check lint-core: $(CLIPPY_CORE) -lint-python: - @if $(PYTHON) -c "import ruff" 2>/dev/null; then \ - $(PYTHON) -m ruff check python/ tests/; \ +lint-python: venv + @if $(VENV_PYTHON) -c "import ruff" 2>/dev/null; then \ + $(VENV_PYTHON) -m ruff check python/ tests/; \ elif command -v ruff >/dev/null 2>&1; then ruff check python/ tests/; \ - else echo "install ruff"; exit 1; fi + else echo "install ruff: $(VENV_PYTHON) -m pip install ruff"; exit 1; fi lint-rust: $(CLIPPY_WORKSPACE) $(CLIPPY_WEB) -lint-docs: - @PY=$$(test -x $(VENV_PYTHON) && echo $(VENV_PYTHON) || echo $(PYTHON)); \ - if $$PY -c "import mkdocs" 2>/dev/null; then \ - cd docs && $$PY -m mkdocs build --strict; \ - else \ - echo "install docs deps: make docs-install"; exit 1; \ - fi +lint-docs: venv docs-install + @$(VENV_PYTHON_ABS) -m mkdocs build --strict -f docs/mkdocs.yml clippy: lint-rust clippy-fix: cargo clippy --workspace --all-targets --no-default-features --fix --allow-dirty --allow-staged $(CLIPPY_DENY) @@ -277,17 +278,16 @@ coverage-rust: cargo llvm-cov clean --workspace cargo llvm-cov nextest --workspace --no-default-features --nff \ --exclude probing-hccl-profapi --exclude probing-nccl-profiler-cdylib \ - --lcov --output-path coverage.lcov --ignore-filename-regex '(.*/tests?/|.*/benches?/|.*/examples?/)' || true -coverage-python: - ${PYTEST_RUN} --cov=python/probing --cov=tests --cov-report=xml:coverage.xml --cov-report=term $(PYTEST_ARGS) || true + --lcov --output-path coverage.lcov --ignore-filename-regex '(.*/tests?/|.*/benches?/|.*/examples?/)' +coverage-python: venv install-dev-python-deps check-dev + ${PYTEST_RUN} --cov=python/probing --cov=tests --cov-report=xml:coverage.xml --cov-report=term $(PYTEST_ARGS) coverage: coverage-rust coverage-python - python scripts/coverage/aggregate.py || true bootstrap: uv python install 3.8 3.9 3.10 3.11 3.12 3.13 -docs-install: - @cd docs && $(MAKE) install +docs-install: venv + @cd docs && $(MAKE) install PYTHON=$(VENV_PYTHON_ABS) docs: @cd docs && $(MAKE) build docs-serve: @@ -296,6 +296,6 @@ docs-clean: @cd docs && $(MAKE) clean clean: - rm -rf dist web/dist docs/site python/probing/bundled_skills python/probing/bundled_web + rm -rf dist docs/site python/probing/bundled_web web/dist cargo clean rm -f coverage.lcov coverage.xml coverage.json diff --git a/docs/Makefile b/docs/Makefile index 7f115b38..02ed9700 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,6 +1,6 @@ # Makefile for Probing Documentation (MkDocs) -PYTHON ?= $(shell test -x ../.venv/bin/python && echo ../.venv/bin/python || echo python3) +PYTHON ?= $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/../.venv/bin/python) .PHONY: help install serve build lint clean deploy diff --git a/docs/src/api-reference.md b/docs/src/api-reference.md index 19e69015..f8e54349 100644 --- a/docs/src/api-reference.md +++ b/docs/src/api-reference.md @@ -56,11 +56,12 @@ In-process equivalent: `probing.query("SELECT … FROM global.python.torch_trace ### Diagnostic skills -Structured multi-step SQL playbooks (shared with Web Agent): +Structured multi-step SQL playbooks (CLI, Web Agent, MCP). Skills from the bundled +tree and from installed packages that register `probing.skills` entry points. | Subcommand | Description | |------------|-------------| -| `skill list` | List bundled skills (`health_overview`, `slow_rank`, …) | +| `skill list` | List discovered skills (`health_overview`, vendor extensions, …) | | `skill run ` | Run skill against target (`-p key=value`, `--global`, `--local`) | | `skill install` | Copy skills into Cursor / Claude / Codex agent dirs | | `skill update` | Refresh installed skills from bundle | @@ -69,7 +70,18 @@ Structured multi-step SQL playbooks (shared with Web Agent): probing -t $ENDPOINT skill list probing -t $ENDPOINT skill run health_overview probing -t $ENDPOINT skill run slow_rank --global -python -m probing.skills validate # dev: validate skills/ authoring tree +python -m probing.skills validate # dev: validate skills/ authoring tree +python -m probing.extensions skill-roots +python -m probing.extensions extensions +``` + +Vendor packages: `pip install probing-nvidia` — see **[Extensibility — vendor package](design/extensibility.md#path-4-vendor-extension-package-probing-vendor)** and `examples/probing-acme/`. + +Python helpers (discovery / plan only — execution is Rust CLI or MCP): + +```python +from probing.skills.tools import list_skills, plan_skill_run +plan_skill_run("health_overview") # CLI command + step SQL preview ``` See **[Diagnostic Skills](guide/skills.md)** for workflow. diff --git a/docs/src/api-reference.zh.md b/docs/src/api-reference.zh.md index f1afd293..182424d8 100644 --- a/docs/src/api-reference.zh.md +++ b/docs/src/api-reference.zh.md @@ -56,11 +56,12 @@ probing -t rank0:8080 cluster query "SELECT _rank, _role, AVG(duration) FROM glo ### 诊断 skill -多步 SQL 剧本(与 Web Agent 共用): +多步 SQL 剧本(CLI、Web Agent、MCP 共用)。来源包括内置 `skills/` 与已安装包注册的 +`probing.skills` entry point。 | 子命令 | 说明 | |--------|------| -| `skill list` | 列出内置 skill(`health_overview`、`slow_rank` 等) | +| `skill list` | 列出已发现 skill(内置 + 厂商扩展) | | `skill run ` | 对目标执行(`-p key=value`、`--global`、`--local`) | | `skill install` | 安装到 Cursor / Claude / Codex skill 目录 | | `skill update` | 从 bundle 更新已安装 skill | @@ -69,7 +70,18 @@ probing -t rank0:8080 cluster query "SELECT _rank, _role, AVG(duration) FROM glo probing -t $ENDPOINT skill list probing -t $ENDPOINT skill run health_overview probing -t $ENDPOINT skill run slow_rank --global -python -m probing.skills validate # 开发:校验 skills/ 源码树 +python -m probing.skills validate # 开发:校验 skills/ 源码树 +python -m probing.extensions skill-roots +python -m probing.extensions extensions +``` + +厂商扩展:`pip install probing-nvidia` — 见 **[扩展 — 厂商包](design/extensibility.zh.md#path-4-vendor-extension-package-probing-vendor)**、`examples/probing-acme/`。 + +Python 辅助 API(仅发现 / 展开计划 — 执行走 Rust CLI 或 MCP): + +```python +from probing.skills.tools import list_skills, plan_skill_run +plan_skill_run("health_overview") # 返回 CLI 命令与步骤 SQL 预览 ``` 见 **[诊断 Skill](guide/skills.zh.md)**。 diff --git a/docs/src/contributing.md b/docs/src/contributing.md index 28246765..395abf24 100644 --- a/docs/src/contributing.md +++ b/docs/src/contributing.md @@ -36,12 +36,13 @@ Preview docs while editing: `make docs-install && make docs-serve` → http://12 | Track | You might… | Main directories | Read first | Good first tasks | |-------|------------|------------------|------------|------------------| | **Skills** | Add or improve training diagnostics | [`skills/`](https://github.com/DeepLink-org/probing/blob/main/skills/README.md) | [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md), [Extensibility — skill](design/extensibility.md#path-2-diagnostic-skill) | New skill folder, fix SQL in `steps.yaml`, improve `SKILL.md` | +| **Vendor extensions** | Standalone `probing-` pip packages | Template `examples/probing-acme/` | [Extensibility — vendor package](design/extensibility.md#path-4-vendor-extension-package-probing-vendor) | Publish `probing-nvidia`, `probing-huawei`, etc. | | **Python** | Table plugins, hooks, skill tooling | `python/probing/`, [`python/probing/skills/`](https://github.com/DeepLink-org/probing/blob/main/python/probing/skills/README.md) | [Extensibility — table plugin](design/extensibility.md#path-1-table-plugin-dataclass--table) | `@table` example, loader/install tests in `tests/regression/skills/` | | **Docs & examples** | Clarify concepts or add recipes | `docs/src/`, `examples/` | [Core concepts](guide/concepts.md) | Fix typos, add troubleshooting, extend `examples/README.md` | | **Rust** | SQL engine, server, collectors, CLI | `probing/` (Rust workspace) | [Modularity](design/modularity.md) | Issues in `probing/core`, `probing/server`, extensions | | **Web UI** | Investigate agent, dashboards | `web/` | [web/DESIGN.md](https://github.com/DeepLink-org/probing/blob/main/web/DESIGN.md) | Agent UX, page polish (needs `dx` for full wheel build) | -**Skills vs Python package:** edit skill **data** in repo-root `skills/`; edit skill **loader / install code** in `python/probing/skills/`. Do **not** edit `python/probing/_skills/` by hand — it is generated by `make wheel`. +**Skills vs Python package:** edit skill **data** in repo-root `skills/` (symlink to `python/probing/bundled_skills/`); edit skill **loader / install code** in `python/probing/skills/`. **Two folders named `probing/`:** `probing/` at the repo root is **Rust**; `python/probing/` is the **Python package**. `src/lib.rs` at the root is the PyO3 entry for `probing._core`. @@ -132,8 +133,10 @@ Run **`make help`** in the repo root for the full target list with one-line desc | `make develop` / `make dev` | First setup; after pulling large Python/Rust layout changes | | `make core` | Rebuild `_core` only after Rust edits | | `make check-dev` | Quick sanity check | -| `make test` | Rust + Python tests | -| `make lint` | `ruff check` + `cargo clippy` (workspace + `web/`) | +| `make test` | Rust + editable Python (daily dev) | +| `make test-wheel` | Python tests against installed wheel (needs `dist/*.whl`) | +| `make test-ci` | `make test` + `make test-wheel` (matches CI Python gate) | +| `make lint` | `ruff check` + `cargo clippy` + `mkdocs build --strict` | | `make clippy-fix` | Apply Clippy auto-fixes (`--fix --allow-dirty`) | | `make test-rust` / `make test-python` | Split test runs | | `make docs-install` | MkDocs deps (first time editing docs) | @@ -156,6 +159,8 @@ make core # after Rust-only changes ### Release / CI wheel smoke test ```bash +make frontend && make wheel && make test-ci +# or step-by-step: make frontend && make wheel && make install-wheel make test-python-wheel # tests against installed wheel + checkout pure Python ``` @@ -175,7 +180,7 @@ See [examples/README.md](https://github.com/DeepLink-org/probing/blob/main/examp - **Authoring**: repo root `skills/` (`SKILL.md`, `steps.yaml`, `catalog.yaml`) - **Install to IDE agents**: `./skills/install.sh` or `probing skill install` -- **Bundled in wheel**: `make wheel` copies into `python/probing/_skills/` and `python/probing/_web/` +- **Bundled in wheel**: `make wheel` copies skills into `python/probing/bundled_skills/` and UI into `python/probing/bundled_web/` - **Docs**: `skills/README.md`, [Extensibility — Diagnostic skill](design/extensibility.md#path-2-diagnostic-skill) ## Development workflow @@ -190,13 +195,14 @@ Two layers — **unit** and **regression**. Layout: [`tests/README.md`](https:// | Regression | `tests/regression/rust/probing/**` + `probing/macros/tests/` | `tests/regression/` (incl. `spec/api_spec.json`) | ```bash -make test +make test # Rust + editable Python +make test-ci # above + wheel install tests (CI Python gate) make test-rust-unit make test-rust-regression make test-python-unit make test-python-regression make test-python -make coverage +make coverage # local editable + Rust (requires cargo-llvm-cov; see CI for wheel coverage) ``` **Rust exception:** `probing/macros/tests/` must stay as an external crate (proc-macro tests). @@ -245,8 +251,8 @@ probing/ # repo root │ ├── probing/ # Python PACKAGE (not Rust) │ │ ├── skills/ # skill loader/install CODE — see python/probing/skills/README.md │ │ ├── web_assets.py # wheel _web/ + editable web/dist → PROBING_ASSETS_ROOT -│ │ ├── _skills/ # wheel GENERATED (make wheel) — do not edit -│ │ └── _web/ # wheel GENERATED (make wheel) — do not edit +│ │ ├── bundled_skills/ # skill DATA bundled in wheel (author in repo-root skills/) +│ │ └── bundled_web/ # UI bundled in wheel (make frontend) │ ├── probing_hook.py # .pth → site hook │ └── probing.pth ├── src/lib.rs # PyO3 entry → probing._core (maturin) diff --git a/docs/src/contributing.zh.md b/docs/src/contributing.zh.md index cbf71d7b..2bee13d9 100644 --- a/docs/src/contributing.zh.md +++ b/docs/src/contributing.zh.md @@ -36,6 +36,7 @@ make test-python-regression # Python 冒烟;完整套件:make test | 方向 | 典型工作 | 主要目录 | 先读 | 入门任务示例 | |------|----------|----------|------|----------------| | **Skill** | 训练诊断流程 | [`skills/`](https://github.com/DeepLink-org/probing/blob/main/skills/README.md) | [AGENTS.md](https://github.com/DeepLink-org/probing/blob/main/AGENTS.md)、[扩展 — skill](design/extensibility.zh.md#path-2-diagnostic-skill) | 新增 skill、改 `steps.yaml` 里的 SQL、完善 `SKILL.md` | +| **厂商扩展包** | 独立 pip `probing-`(entry point 注册 skills + magics) | 模板 `examples/probing-acme/` | [扩展 — 厂商包](design/extensibility.zh.md#path-4-vendor-extension-package-probing-vendor) | 发布 `probing-nvidia` / `probing-huawei` 等 | | **Python** | 表插件、hook、skill 工具 | `python/probing/`、[`python/probing/skills/`](https://github.com/DeepLink-org/probing/blob/main/python/probing/skills/README.md) | [扩展 — 表插件](design/extensibility.zh.md#path-1-table-plugin-dataclass--table) | `@table` 示例、`tests/regression/skills/` 补测试 | | **文档与示例** | 概念、教程、排错 | `docs/src/`、`examples/` | [核心概念](guide/concepts.zh.md) | 修正文档、补充 troubleshooting | | **Rust** | 引擎、服务、采集、CLI | `probing/`(Rust workspace) | [模块化](design/modularity.zh.md) | `probing/core`、`probing/server` 相关 issue | diff --git a/docs/src/design/extensibility.md b/docs/src/design/extensibility.md index bc1f5e78..10856b6b 100644 --- a/docs/src/design/extensibility.md +++ b/docs/src/design/extensibility.md @@ -1,13 +1,15 @@ # Extensibility -Probing exposes **two public extension paths**. Everything else (Rust collectors, HTTP handlers, import hooks) is internal to the core project. +Probing exposes **four public extension paths**. Everything else (Rust collectors, HTTP handlers, import hooks) is internal to the core project. | Path | You contribute | Consumers use | |------|----------------|---------------| | **1. Table plugin** | Python dataclass + `@table` | `SELECT … FROM python.*` (CLI, Web, scripts) | | **2. Diagnostic skill** | `SKILL.md` + optional `steps.yaml` | Agent / `probing skill run …` / Web | +| **3. REPL Magic** | IPython `Magics` subclass | Python page / `probing eval` REPL | +| **4. Vendor package** | Standalone pip `probing-` | Auto-discovered skills + magics (+ optional tables) | -**Decision rule:** expose **data** → write a table plugin. Contribute **how to investigate** → write a skill. +**Decision rule:** expose **data** → table plugin; **how to investigate** → skill; **REPL shortcuts** → magic; **vendor/ecosystem bundle** → publish `probing-nvidia`-style package. ```mermaid flowchart LR @@ -283,13 +285,19 @@ probing skill install # skills/ -> .cursor/.claude/.agents skill dirs probing skill update ``` -Python tool API (bundled skills, no install required): +Python tool API (discovery / plan only — execution is Rust CLI or MCP): ```python -from probing.skills.tools import list_skills, run_skill +from probing.skills.tools import list_skills, plan_skill_run +plan_skill_run("health_overview") # returns CLI command + step SQL preview ``` -Web Agent loads skill frontmatter for routing (`description` + `tables`), injects `SKILL.md` body into context, and runs `steps.yaml` when present. +**Execution SSOT:** `probing-skills` crate — CLI `probing skill run`, MCP `run_skill` / +`plan_skill`, Web Investigate Agent (WASM). Python `GET /apis/pythonext/skills/*` endpoints +are discovery-only (catalog, routing, load JSON). + +Web Agent loads skill frontmatter for routing (`description` + `tables`), injects `SKILL.md` +body into context, and runs `steps.yaml` via the shared Rust runner when present. ### Register a skill @@ -305,7 +313,80 @@ See `skills/README.md` and [AGENTS.md](https://github.com/DeepLink-org/probing/b --- -## Path 3: NCCL profiler plugin (C cdylib) +## Path 3: REPL Magic {#path-3-repl-magic} + +**Magics** are IPython line commands (e.g. `%query`). Built-ins live under `python/probing/repl/*_magic.py`. Third parties register via the **`probing.magics`** entry point (`Magics` subclass). + +Bundle magics with skills in a **`probing-`** package (Path 4) rather than a one-off unnamed pip project. + +--- + +## Path 4: Vendor extension package (`probing-`) {#path-4-vendor-extension-package-probing-vendor} + +Ecosystem partners (NVIDIA, Huawei, cloud vendors, framework teams) should publish **standalone pip packages** with a unified name: + +| Layer | Convention | Examples | +|-------|------------|----------| +| PyPI / wheel | `probing-` (kebab-case) | `probing-nvidia`, `probing-huawei` | +| Import package | `probing_` (snake_case) | `probing_nvidia`, `probing_huawei` | +| Entry point key | Usually the vendor slug | `nvidia = "probing_nvidia:skill_root"` | + +Layout: + +``` +probing-nvidia/ +├── pyproject.toml +└── src/probing_nvidia/ + ├── __init__.py # skill_root() + ├── magics.py # probing.magics + └── skills/ + ├── catalog.yaml + └── …/ +``` + +### Discovery: entry points only + +Skills and magics use the **same** setuptools registry: + +| Group | Registers | +|-------|-----------| +| `probing.skills` | `skill_root()` → directory with `catalog.yaml` | +| `probing.magics` | `Magics` subclass | + +Use the **same vendor slug** in both groups. With `pip install -e .`, edits under `skills/` or `magics.py` apply immediately — entry points resolve to real source paths. + +`package-data` only ships files inside the wheel; probing does **not** scan it for discovery. + +Prefix skill ids and magic commands (`nvidia_nccl_triage`, `%nvidia_smi`) to avoid runtime overrides. + +```toml +[project] +name = "probing-nvidia" +dependencies = ["probing", "ipython>=8.0"] + +[project.entry-points."probing.skills"] +nvidia = "probing_nvidia:skill_root" + +[project.entry-points."probing.magics"] +nvidia = "probing_nvidia.magics:NvidiaMagic" + +[tool.setuptools.package-data] +probing_nvidia = ["skills/**"] +``` + +```bash +pip install -e . # dev: register once, iterate on skills/magics +python -m probing.extensions extensions +probing skill list +``` + +Template: `examples/probing-acme/`. + +Optional `@table` plugins in the same package: `python.enabled=probing_nvidia`. + +--- + +## Path 5: NCCL profiler plugin (C cdylib) {#path-5-nccl-profiler-plugin} For **fine-grained NCCL wait decomposition** (culprit vs victim), use the standalone Rust profiler loaded by NCCL itself—not a Python table plugin. @@ -415,7 +496,7 @@ The following exist for core development only. **Do not** build third-party plug | `add_module_callback` import hook | Used for official torch/ray integration | | `probing-*` CLI external binaries | Separate tools, not data plugins | -To extend Probing, use **Path 1 (table plugin)**, **Path 2 (diagnostic skill)**, or **Path 3 (NCCL profiler cdylib)** for fine-grained collective wait data. +To extend Probing, use **Path 1 (table plugin)**, **Path 2 (diagnostic skill)**, **Path 3 (REPL Magic)**, **Path 4 (`probing-` package)**, or **Path 5 (NCCL profiler cdylib)** for fine-grained collective wait data. --- diff --git a/docs/src/design/extensibility.zh.md b/docs/src/design/extensibility.zh.md index e7951d42..631404fa 100644 --- a/docs/src/design/extensibility.zh.md +++ b/docs/src/design/extensibility.zh.md @@ -1,13 +1,15 @@ # 扩展机制 -Probing 提供 **两条公开扩展路径**(另有一条可选 NCCL 插件路径)。Rust 采集器、HTTP 处理器、import hook 等属于核心内部实现。 +Probing 提供 **四条公开扩展路径**(另有一条可选 NCCL 插件路径)。Rust 采集器、HTTP 处理器、import hook 等属于核心内部实现。 | 路径 | 你贡献什么 | 谁在用 | |------|------------|--------| | **1. 表插件** | Python dataclass + `@table` | `SELECT … FROM python.*`(CLI、Web、脚本) | | **2. 诊断 skill** | `SKILL.md` + 可选 `steps.yaml` | Agent / `probing skill run …` / Web | +| **3. REPL Magic** | IPython `Magics` 子类 | Python 页 / `probing eval` REPL | +| **4. 厂商扩展包** | 独立 pip 包 `probing-` | 自动发现 skills + magics(+ 可选表插件) | -**决策规则:** 要暴露**数据** → 写表插件;要贡献**怎么查** → 写 skill。 +**决策规则:** 要暴露**数据** → 写表插件;要贡献**怎么查** → 写 skill;要 REPL 快捷命令 → 写 magic;**厂商/生态打包** → 发布 `probing-nvidia` 这类扩展包。 ```mermaid flowchart LR @@ -288,13 +290,19 @@ probing skill install # skills/ → .cursor/.claude/.agents probing skill update ``` -Python 工具 API(内置 skill,无需 install): +Python 工具 API(仅发现 / 展开计划 — 执行走 Rust CLI 或 MCP): ```python -from probing.skills.tools import list_skills, run_skill +from probing.skills.tools import list_skills, plan_skill_run +plan_skill_run("health_overview") # 返回 CLI 命令与步骤 SQL 预览 ``` -Web Agent 用 frontmatter 做路由(`description` + `tables`),将 `SKILL.md` 正文注入上下文;有 `steps.yaml` 时按步骤执行。 +**执行 SSOT:** `probing-skills` crate — CLI `probing skill run`、MCP `run_skill` / +`plan_skill`、Web Investigate Agent(WASM)。Python `GET /apis/pythonext/skills/*` 仅为 +发现接口(catalog、routing、load JSON)。 + +Web Agent 用 frontmatter 做路由(`description` + `tables`),将 `SKILL.md` 正文注入上下文; +有 `steps.yaml` 时由共享 Rust runner 按步骤执行。 ### 注册新 skill @@ -310,7 +318,136 @@ Skill 可引用**任意** SQL 表——路径 1 插件表、内置表(`cpu.uti --- -## 路径 3:NCCL profiler 插件(C cdylib) +## 路径 3:REPL Magic {#path-3-repl-magic} + +**Magic** 是 IPython REPL 里的行魔法(如 `%query`)。内置 magic 在 `python/probing/repl/*_magic.py`;第三方通过 **`probing.magics`** entry point 注册 `Magics` 子类。 + +```python +from IPython.core.magic import Magics, line_magic, magics_class + +@magics_class +class NvidiaMagic(Magics): + @line_magic + def nvsmi(self, line: str): + ... +``` + +推荐与 skills 一起打进 **`probing-`** 包(路径 4),而不是单独起一个无名 pip 包。 + +--- + +## 路径 4:厂商扩展包(`probing-`) {#path-4-vendor-extension-package-probing-vendor} + +**推荐**第三方(NVIDIA、华为、云厂商、框架团队)以 **独立 pip 包** 贡献 skills、magics,以及可选的表插件。统一命名,便于发现与运维。 + +### 命名约定 + +| 层级 | 规则 | 示例 | +|------|------|------| +| PyPI / wheel 名 | `probing-`(小写 kebab-case) | `probing-nvidia`、`probing-huawei` | +| Python 导入包 | `probing_`(snake_case) | `probing_nvidia`、`probing_huawei` | +| entry point 键 | 通常与 vendor 一致 | `nvidia = "probing_nvidia:skill_root"` | + +不要用 `nvidia-probing` 或 `probing_ext_nvidia` 这类变体——`python -m probing.extensions extensions` 只索引 **`probing-*`** 发行包。 + +### 包内布局 + +``` +probing-nvidia/ +├── pyproject.toml +└── src/probing_nvidia/ + ├── __init__.py # skill_root() — probing.skills entry point + ├── magics.py # probing.magics entry point + ├── tables.py # 可选 @table 插件 + └── skills/ + ├── catalog.yaml + └── nccl_deep_dive/ + ├── SKILL.md + └── steps.yaml +``` + +### 统一发现:entry point 注册表 + +Skills 与 magics **都只通过 setuptools entry point 发现**(同一套机制): + +| Entry point group | 注册内容 | +|-------------------|----------| +| `probing.skills` | `skill_root()` → 含 `catalog.yaml` 的目录 | +| `probing.magics` | `Magics` 子类 | + +厂商包在 **两个 group 里用同一个 vendor slug**(如 `nvidia`)。`pip install -e .` 开发模式下改 `skills/` 或 `magics.py` **无需重装**,entry point 指向源码树里的真实路径。 + +`[tool.setuptools.package-data]` 仅用于把 `skills/**` **打进 wheel**;**不会**被 probing 扫描发现——必须写 entry point。 + +### 命名与冲突 + +- **entry point 键**:各包独立注册,多包并存无妨(`nvidia`、`huawei` 各一条) +- **skill id / %magic 命令**:应用层命名空间,须 vendor 前缀(`nvidia_nccl_triage`、`%nvidia_smi`),避免后者覆盖前者 + +### `pyproject.toml` 最小示例 + +```toml +[project] +name = "probing-nvidia" +dependencies = ["probing", "ipython>=8.0"] + +[project.entry-points."probing.skills"] +nvidia = "probing_nvidia:skill_root" + +[project.entry-points."probing.magics"] +nvidia = "probing_nvidia.magics:NvidiaMagic" + +[tool.setuptools.package-data] +probing_nvidia = ["skills/**"] +``` + +```python +# probing_nvidia/__init__.py +from pathlib import Path + +def skill_root() -> Path: + return Path(__file__).resolve().parent / "skills" +``` + +Magics 在训练进程 REPL 启动时通过 `probing.magics` 注册;skills 合并进全局 catalog,CLI / Web / MCP 无需改 Rust 二进制。 + +### 开发模式 + +```bash +cd probing-nvidia +pip install -e . # 一次注册 entry points +# 编辑 src/probing_nvidia/skills/ 或 magics.py,立即生效 +python -m probing.extensions extensions +probing skill list +``` + +### 安装与验证(用户) + +```bash +pip install probing probing-nvidia + +python -m probing.extensions extensions # 列出已装厂商包 +python -m probing.extensions skill-roots # 含 nvidia skills 目录 +probing skill list # 含厂商 skill id +``` + +attach 后 HTTP:`GET /apis/pythonext/extensions/list` + +### 可选:表插件 + +同一包内可再提供 `@table` 模块,用户启用: + +```bash +probing -t config python.enabled=probing_nvidia +``` + +### 模板 + +仓库内可复制起点:`examples/probing-acme/`(虚构厂商 **acme**,结构同 `probing-nvidia` / `probing-huawei`)。 + +--- + +## 路径 5:NCCL profiler 插件(C cdylib) {#path-5-nccl-profiler-plugin} **细粒度 NCCL 等待分解**(culprit vs victim)使用 NCCL 自身加载的独立 Rust profiler,**不是** Python 表插件。 @@ -421,7 +558,7 @@ ORDER BY avg_ms DESC; | `add_module_callback` import hook | 官方 torch/ray 集成使用 | | `probing-*` CLI 外部二进制 | 独立工具,非数据插件 | -扩展 Probing 请用 **路径 1(表插件)**、**路径 2(诊断 skill)**,或 **路径 3(NCCL profiler cdylib)** 获取细粒度 collective 等待数据。 +扩展 Probing 请用 **路径 1(表插件)**、**路径 2(诊断 skill)**、**路径 3(REPL Magic)**、**路径 4(`probing-` 扩展包)**,或 **路径 5(NCCL profiler cdylib)** 获取细粒度 collective 等待数据。 --- diff --git a/docs/src/design/modularity.md b/docs/src/design/modularity.md index 68703283..081b9ad5 100644 --- a/docs/src/design/modularity.md +++ b/docs/src/design/modularity.md @@ -123,8 +123,10 @@ Stable HTTP surface: `probing/server/API.md`, enforced by `tests/regression/spec | Unit | Path | Responsibility | |------|------|----------------| | **web/** | Dioxus WASM | Pages, visualization, Investigate agent | -| **skills/** | YAML + SKILL.md | Diagnostic workflows over SQL | -| **python/probing/** | Python package | Hooks, `query()`, skills loader, nccl helper | +| **skills/** | YAML + SKILL.md | Skill content SSOT | +| **probing-skills** | `probing/crates/skills/` | Shared loader, interpreter, runner (CLI / Web / MCP) | +| **python/probing/extensions/** | entry points | Skill + magic + vendor package discovery | +| **python/probing/** | Python package | Hooks, `query()`, agent install helpers | --- @@ -198,8 +200,11 @@ class CommCollective: ... - Skills **only** talk to the engine via SQL (`probing query`) or documented HTTP APIs. - No Rust/Python code in skills — YAML + markdown only. -- CLI (`probing/cli/skill/`), Python (`python/probing/skills/`), Web (`web/src/agent/skill.rs`) - are **loaders**; skill content is single source in `skills/`. +- **Content SSOT:** `skills/` (wheel: `python/probing/bundled_skills/`). +- **Discovery:** `python/probing/extensions/` entry points + `GET /apis/pythonext/skills/*`. +- **Execution SSOT:** `probing-skills` — CLI (`probing/cli/skill/`), Web WASM + (`web/src/agent/runner.rs`), MCP (`run_skill` / `plan_skill` in server). +- Python `probing/skills/` is discovery + agent install only; not an execution path. ### 3.5 Wire protocol — CLI / Web ↔ Server @@ -325,7 +330,7 @@ Use this table to decide **where a change belongs**: | Concern | Owner module | Interface | |---------|--------------|-----------| | SQL parsing, federation rewrite | probing-core | `Engine::async_query` | -| Table/column semantic docs | probing-core | `semantic_catalog` → `probe.probing.table_docs` / `column_docs` | +| Table/column semantic docs | probing-core | Code-first `docs` registry + `resources/tables.yaml` overlay → `probe.probing.table_docs` / `column_docs` | | mmap format, compaction | probing-memtable | `RowWriter`, `ColdStore` | | Torchrun cluster heartbeat | probing-server | `torchrun_cluster.rs`, `cluster_report_backoff.rs`, PUT `/apis/nodes` | | Mixed Python/C stack | probing-python/features | `python.backtrace`, pprof | @@ -378,11 +383,11 @@ Track and fix incrementally: | Python ext → CLI | `probing-python` → `probing-cli` | **Accepted** for maturin wheel (`cli_main` only); keep import surface minimal | | Python ext → CC | ~~`probing-python` → `probing-cc`~~ | **Done** — `send_sigusr2_to_thread_id` moved to `probing-core::signal` | | Core → NCCL/HCCL | `probing-core` → `probing-nccl-profiler` / `probing-hccl-shim` (`builtin-schema-docs` feature) for `semantic_catalog` | Register docs via collector hooks or manifest; drop L1→L2 compile deps | -| Core → skills YAML | `semantic_catalog.rs` `include_str!(skills/semantic/tables.yaml)` | Accept as L4 overlay SSOT, or move YAML under `probing/core/resources/` | +| Core → skills YAML | ~~`semantic_catalog.rs` `include_str!(skills/semantic/tables.yaml)`~~ | **Done** — overlay at `probing/core/resources/tables.yaml`; descriptions SSOT in `docs` registry | | Server → python `features/*` | ~~`server/profiling.rs`~~ removed | Flamegraphs via `torchextension` / `pprofextension` `ProbeExtensionCall` | | Server → python REPL internals | ~~`PythonRepl` in server~~ | `/ws` uses `ReplSession` facade only | | Composition sprawl | All wiring in `server/engine.rs` | Optional: manifest TOML listing enabled extensions | -| Skills triple loader | Rust + Python + Web embed `skills/` | Keep `skills/` SSOT; loaders versioned together in CI | +| Skills triple loader | ~~Rust + Python + Web compile-time embed~~ | **Done** — `probing-skills` is loader/interpret/runner SSOT; Python keeps discovery entry-points + PyO3 serialize bridge; Web deserializes API into shared types | | kmsg collector | Registered (Linux/kmsg feature gate) | Done | | Architecture doc | 2-layer diagram | Superseded by this doc + [Data Layer](data-layer.md) | @@ -422,7 +427,7 @@ Need new raw signals? - Adding business logic to `server/engine.rs` beyond registration. - Web page importing SQL strings for tables that don't exist in catalog. - Collector calling `Engine::async_query` from write path. -- Skill embedding one-off Rust code paths. +- Skill execution outside `probing-skills` (duplicate runners in Python or Web). --- diff --git a/docs/src/design/modularity.zh.md b/docs/src/design/modularity.zh.md index b7284c31..c41cb193 100644 --- a/docs/src/design/modularity.zh.md +++ b/docs/src/design/modularity.zh.md @@ -55,7 +55,7 @@ flowchart TB | **L1 平台** | SQL 引擎、存储、协议、插件 trait | federation、memtable、config | | **L2 采集** | 写表 + 可选 Extension 控制 | GPU、NCCL、主机、Python 运行时 | | **L3 控制面** | HTTP、CLI、组装根 | 新 endpoint、认证、cluster fan-out | -| **L4 体验** | UI、skills、Python 集成 | 诊断 UX、Agent、hooks | +| **L4 体验** | UI、skills、**extensions**、Python 集成 | 诊断 UX、Agent、hooks、厂商扩展发现 | **组装根(唯一允许「把所有模块接在一起」的地方):** @@ -118,8 +118,10 @@ HTTP 契约:`probing/server/API.md` + `tests/regression/spec/api_spec.json`。 | 单元 | 路径 | 职责 | |------|------|------| | **web/** | Dioxus | 页面、可视化、Investigate Agent | -| **skills/** | YAML + SKILL.md | 基于 SQL 的诊断流程 | -| **python/probing/** | Python 包 | hooks、`query()`、skills 加载 | +| **skills/** | YAML + SKILL.md | 诊断 skill 内容 SSOT | +| **probing-skills** | `probing/crates/skills/` | 共享 loader、解释器、runner(CLI / Web / MCP) | +| **python/probing/extensions/** | entry points | Skills + magics + 厂商包发现(代码 SSOT) | +| **python/probing/** | Python 包 | hooks、`query()`、agent 安装辅助 | --- @@ -167,7 +169,12 @@ HTTP 契约:`probing/server/API.md` + `tests/regression/spec/api_spec.json`。 | `next_steps` | 技能链 | **规则:** Skill 只通过 SQL / 文档化 HTTP 访问数据;**不含 Rust/Python 业务代码**。 -CLI、Python loader、Web agent 都是**加载器**,内容以 `skills/` 为准。 + +- **内容 SSOT:** `skills/`(wheel:`python/probing/bundled_skills/`)。 +- **发现:** `python/probing/extensions/` entry point + `GET /apis/pythonext/skills/*`。 +- **执行 SSOT:** `probing-skills` — CLI(`probing/cli/skill/`)、Web WASM + (`web/src/agent/runner.rs`)、MCP(server 内 `run_skill` / `plan_skill`)。 +- Python `probing/skills/` 仅负责发现与 agent 安装,**不是**执行路径。 ### 3.5 线协议 — CLI / Web ↔ Server @@ -269,7 +276,7 @@ sequenceDiagram | 关注点 | 归属 | 接口 | |--------|------|------| | SQL 解析、federation 重写 | probing-core | `Engine::async_query` | -| 表/列语义文档 | probing-core | `semantic_catalog` → `probe.probing.table_docs` / `column_docs` | +| 表/列语义文档 | probing-core | 代码优先 `docs` 注册表 + `resources/tables.yaml` overlay → `probe.probing.table_docs` / `column_docs` | | mmap 格式、冷压缩 | probing-memtable | `RowWriter`, `ColdStore` | | Torchrun 集群心跳 | probing-server | `torchrun_cluster.rs`、`cluster_report_backoff.rs`、`PUT /apis/nodes` | | 混合 Python/C 栈 | probing-python/features | `python.backtrace`、pprof | @@ -319,11 +326,11 @@ sequenceDiagram | python → cli | `probing-python` → `probing-cli` | **可接受**(maturin wheel,仅 `cli_main`);禁止扩散 import | | python → cc | ~~`probing-python` → `probing-cc`~~ | **已完成** — `send_sigusr2_to_thread_id` 迁至 `probing-core::signal` | | core → NCCL/HCCL | `probing-core` → nccl/hccl shim(`builtin-schema-docs`)供 `semantic_catalog` | 改由采集器注册 docs,去掉 L1→L2 编译依赖 | -| core → skills YAML | `semantic_catalog` `include_str!(skills/semantic/tables.yaml)` | 接受为 L4 overlay SSOT,或迁到 `probing/core/resources/` | +| core → skills YAML | ~~`semantic_catalog` `include_str!(skills/semantic/tables.yaml)`~~ | **已完成** — overlay 在 `probing/core/resources/tables.yaml`;描述 SSOT 为 `docs` 注册表 | | server → python features | ~~`server/profiling.rs`~~ 已删 | 火焰图走 Extension | | server → REPL 内部 | ~~`PythonRepl`~~ | `/ws` 仅用 `ReplSession` 门面 | | 组装集中 | 全在 server/engine.rs | 可选 extension manifest | -| Skill 三份 loader | Rust/Python/Web | `skills/` 为 SSOT,CI 同步校验 | +| Skill 三份 loader | ~~Rust/Python/Web 编译期 embed~~ | **已完成** — `probing-skills` 为 loader/interpret/runner SSOT;Python 保留发现 entry point + PyO3 序列化桥;Web 从 API 反序列化为共享类型 | | kmsg 采集器 | 已注册(Linux/kmsg feature gate) | Done | | Architecture 文档 | 二层旧图 | 以本文 + [数据层](data-layer.zh.md) 为准 | @@ -354,7 +361,7 @@ sequenceDiagram 要新命令? → L3 CLI + proto DTO ``` -**反模式:** 在 engine.rs 写业务;Web 查不存在的表;采集器在写路径里 query;Skill 内嵌 Rust 分支。 +**反模式:** 在 engine.rs 写业务;Web 查不存在的表;采集器在写路径里 query;Skill 内嵌 Rust 分支;在 `probing-skills` 之外执行 skill(Python/Web 重复 runner)。 --- diff --git a/docs/src/guide/skills.md b/docs/src/guide/skills.md index 92fef2ab..4c959368 100644 --- a/docs/src/guide/skills.md +++ b/docs/src/guide/skills.md @@ -1,8 +1,10 @@ # Diagnostic Skills **Skills** are versioned, multi-step SQL playbooks for common training investigations. -They ship in the wheel (`python/probing/_skills/`), run from the CLI, Python loader, and -Web Investigate Agent. +They ship in the wheel (`python/probing/bundled_skills/` via `probing.skills` entry point), +execute via the shared Rust runner (`probing-skills`: CLI, Web Agent, MCP), and are +discovered at runtime from bundled trees, repo checkout, and installed `probing-` +packages. ## When to use skills vs raw SQL @@ -79,8 +81,10 @@ skills// steps.yaml # ordered SQL steps with params ``` -Semantic metadata (`tables.yaml`, `intents.yaml`) links skills to SQL catalog and Web UI. -See **[Contributing](../contributing.md#skills-agents)** and `skills/semantic/`. +Agent routing metadata (`intents.yaml`, `pages.yaml`) lives under `skills/semantic/`. +Table/column descriptions are code-first in collectors and `@table`; `probing/core/resources/tables.yaml` +is an L1 agent overlay (synonyms, notes, `global_name`) merged at engine startup into +`probe.probing.table_docs` / `column_docs`. See **[Contributing](../contributing.md#skills-agents)**. ## Related diff --git a/docs/src/guide/skills.zh.md b/docs/src/guide/skills.zh.md index a366b47f..5cfc38de 100644 --- a/docs/src/guide/skills.zh.md +++ b/docs/src/guide/skills.zh.md @@ -1,7 +1,9 @@ # 诊断 Skill -**Skill** 是针对常见训练问题的多步 SQL 剧本,带版本与参数。内置在 wheel -(`python/probing/_skills/`),可由 CLI、Python loader 与 Web Investigate Agent 执行。 +**Skill** 是针对常见训练问题的多步 SQL 剧本,带版本与参数。通过 `probing.skills` +entry point 打进 wheel(`python/probing/bundled_skills/`),由共享 Rust runner +(`probing-skills`:CLI、Web Agent、MCP)执行,并在运行时从内置树、仓库 checkout、 +已安装的 `probing-` 包中发现。 ## 何时用 skill、何时写 SQL @@ -68,8 +70,10 @@ skills// steps.yaml # 有序 SQL 步骤与参数 ``` -语义元数据(`tables.yaml`、`intents.yaml`)连接 skill、SQL 目录与 Web UI。见 -**[贡献指南](../contributing.zh.md)** 与 `skills/semantic/`。 +Agent 路由元数据(`intents.yaml`、`pages.yaml`)位于 `skills/semantic/`。 +表/列描述以采集器与 `@table` 代码注册为 SSOT;`probing/core/resources/tables.yaml` 为 L1 agent overlay +(synonyms、notes、global_name),在引擎启动时合并进 `probe.probing.table_docs` / `column_docs`。见 +**[贡献指南](../contributing.zh.md)**。 ## 相关 diff --git a/docs/src/reference/skill-format.md b/docs/src/reference/skill-format.md index ce5851f1..ce55fac0 100644 --- a/docs/src/reference/skill-format.md +++ b/docs/src/reference/skill-format.md @@ -13,7 +13,7 @@ workflow) and `SKILL.md` (agent-facing documentation). skills/ ├── catalog.yaml Master index of all skills ├── semantic/ -│ ├── tables.yaml Table semantic definitions +│ ├── tables.yaml Symlink → probing/core/resources/tables.yaml (agent overlay) │ ├── intents.yaml Keyword-to-skill routing │ └── pages.yaml Page-to-skill suggestions └── / diff --git a/docs/src/reference/sql-tables.md b/docs/src/reference/sql-tables.md index 6006f015..990f1984 100644 --- a/docs/src/reference/sql-tables.md +++ b/docs/src/reference/sql-tables.md @@ -10,9 +10,10 @@ extension crate. Tables live under schema prefixes that reflect their data sourc device sampling, `cluster.*` for node registry, `nccl.*` for the NCCL profiler plugin, and `global..
` for federated cross-rank queries. -The authoritative schema definitions live in `skills/semantic/tables.yaml` (used by -diagnostic skills and the Web Agent). The tables on this page are kept in sync with -that file. +The authoritative schema definitions live in `probing/core/resources/tables.yaml` (agent +overlay) and in-code collector/`@table` docs (description SSOT). Query via +`probe.probing.table_docs` / `column_docs`. The tables on this page are kept in sync with +that overlay file. To see what tables are actually available on a live endpoint: diff --git a/docs/src/reference/sql-tables.zh.md b/docs/src/reference/sql-tables.zh.md index e873cf82..6c3bb923 100644 --- a/docs/src/reference/sql-tables.zh.md +++ b/docs/src/reference/sql-tables.zh.md @@ -9,8 +9,9 @@ SQL 表。这是一份参考手册——如果你需要查询模式和操作指 是主机和设备采样,`cluster.*` 是节点注册信息,`nccl.*` 是 NCCL profiler 插件 输出,`global..
` 是跨 rank 的联邦查询。 -Schema 定义以 `skills/semantic/tables.yaml` 为权威来源(诊断 skill 与 Web Agent -使用该文件定义),本页与其保持同步。 +Schema 定义以 `probing/core/resources/tables.yaml` 为 agent overlay(描述 SSOT 为 +采集器/`@table` 内联 docs),通过 `probe.probing.table_docs` / `column_docs` 查询; +本页与其保持同步。 在真实端点上查看当前可用表: diff --git a/examples/README.md b/examples/README.md index d1b114d2..7e532387 100644 --- a/examples/README.md +++ b/examples/README.md @@ -36,3 +36,4 @@ On Linux you can also attach with `probing -t inject` instead of `PROBING= - [Examples (MkDocs)](../docs/src/examples/index.md) - [Quick Start](../docs/src/quickstart.md) +- [Vendor extension template](probing-acme/) — `probing-` with entry-point skills + magics diff --git a/examples/probing-acme/README.md b/examples/probing-acme/README.md new file mode 100644 index 00000000..60848bda --- /dev/null +++ b/examples/probing-acme/README.md @@ -0,0 +1,46 @@ +# probing-acme — vendor extension template + +Canonical layout for a **vendor extension package**. Real packages follow the same +shape with their vendor slug: + +| Vendor | PyPI name | Import package | +|--------|-----------|----------------| +| NVIDIA | `probing-nvidia` | `probing_nvidia` | +| Huawei | `probing-huawei` | `probing_huawei` | +| Demo (this tree) | `probing-acme` | `probing_acme` | + +## What it provides + +Both skills and magics register via **setuptools entry points** (same mechanism): + +| Group | Entry | Points to | +|-------|-------|-----------| +| `probing.skills` | `acme` | `skill_root()` → `probing_acme/skills/` | +| `probing.magics` | `acme` | `AcmeMagic` → REPL `%acme …` | + +`[tool.setuptools.package-data]` only bundles `skills/**` into the wheel — probing +does not scan package data for discovery. + +Optional: **table plugins** (`@table` + `python.enabled=probing_acme`). + +## Developer mode (`pip install -e .`) + +```bash +cd examples/probing-acme +pip install -e . # registers entry points once + +# Edit skills/ or magics.py — no rebuild needed +python -m probing.extensions extensions +probing skill list # includes acme_health when probing is installed +``` + +With a probed training process, magics appear in the Python REPL (`%acme hello`). + +## Authoring a real package + +1. Copy this directory; rename `acme` → your vendor slug. +2. Use the **same slug** in `probing.skills` and `probing.magics` entry points. +3. Prefix skill ids and magic names (`nvidia_*`, `%nvidia_*`). +4. Publish to PyPI as `probing-`. + +See [Vendor extension packages](../../docs/src/design/extensibility.zh.md#path-4-vendor-extension-package-probing-vendor). diff --git a/examples/probing-acme/pyproject.toml b/examples/probing-acme/pyproject.toml new file mode 100644 index 00000000..150f59d3 --- /dev/null +++ b/examples/probing-acme/pyproject.toml @@ -0,0 +1,26 @@ +[build-system] +requires = ["setuptools>=61"] +build-backend = "setuptools.build_meta" + +[project] +name = "probing-acme" +version = "0.1.0" +description = "Example probing vendor extension (skills + magics)" +readme = "README.md" +requires-python = ">=3.9" +dependencies = [ + "probing", + "ipython>=8.0", +] + +[project.entry-points."probing.skills"] +acme = "probing_acme:skill_root" + +[project.entry-points."probing.magics"] +acme = "probing_acme.magics:AcmeMagic" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +probing_acme = ["skills/**"] diff --git a/examples/probing-acme/src/probing_acme/__init__.py b/examples/probing-acme/src/probing_acme/__init__.py new file mode 100644 index 00000000..5faf6bef --- /dev/null +++ b/examples/probing-acme/src/probing_acme/__init__.py @@ -0,0 +1,10 @@ +"""probing-acme — template vendor extension for probing.""" + +from __future__ import annotations + +from pathlib import Path + + +def skill_root() -> Path: + """Return the skill tree root (contains catalog.yaml).""" + return Path(__file__).resolve().parent / "skills" diff --git a/examples/probing-acme/src/probing_acme/magics.py b/examples/probing-acme/src/probing_acme/magics.py new file mode 100644 index 00000000..791da1c5 --- /dev/null +++ b/examples/probing-acme/src/probing_acme/magics.py @@ -0,0 +1,14 @@ +"""REPL magics contributed by probing-acme.""" + +from IPython.core.magic import Magics, line_magic, magics_class + + +@magics_class +class AcmeMagic(Magics): + """Vendor-specific REPL helpers (demo: ``%acme``).""" + + @line_magic + def acme(self, line: str) -> str: + """Echo a line — replace with real vendor diagnostics.""" + text = line.strip() or "(no args)" + return f"[probing-acme] {text}" diff --git a/examples/probing-acme/src/probing_acme/skills/acme_health/SKILL.md b/examples/probing-acme/src/probing_acme/skills/acme_health/SKILL.md new file mode 100644 index 00000000..4335ee0b --- /dev/null +++ b/examples/probing-acme/src/probing_acme/skills/acme_health/SKILL.md @@ -0,0 +1,12 @@ +--- +name: acme_health +description: > + Demo skill from probing-acme vendor package. Use to verify pip-installed + extension discovery (skills + magics). +category: triage +--- + +# Acme health (demo) + +Installed via `pip install probing-acme`. If this skill appears in +`probing skill list`, vendor extension discovery works. diff --git a/examples/probing-acme/src/probing_acme/skills/acme_health/steps.yaml b/examples/probing-acme/src/probing_acme/skills/acme_health/steps.yaml new file mode 100644 index 00000000..4e2d82c3 --- /dev/null +++ b/examples/probing-acme/src/probing_acme/skills/acme_health/steps.yaml @@ -0,0 +1,18 @@ +apiVersion: probing.dev/v1 +kind: Skill + +metadata: + id: acme_health + title: "Acme extension check" + category: triage + docs: "Verify probing-acme is installed and skills are merged." + +spec: + steps: + - id: ping + title: "Process alive" + type: sql + sql: "SELECT 1 AS acme_ok" + on_empty: warn + + summary_template: "probing-acme extension is active." diff --git a/examples/probing-acme/src/probing_acme/skills/catalog.yaml b/examples/probing-acme/src/probing_acme/skills/catalog.yaml new file mode 100644 index 00000000..3644348d --- /dev/null +++ b/examples/probing-acme/src/probing_acme/skills/catalog.yaml @@ -0,0 +1,8 @@ +apiVersion: probing.dev/v1 +kind: Catalog +skills: + - id: acme_health + category: triage + priority: 50 + description: "Acme vendor demo skill — confirms extension discovery" + path: acme_health/steps.yaml diff --git a/probing/cli/Cargo.toml b/probing/cli/Cargo.toml index 1a54a06c..6c0371b8 100644 --- a/probing/cli/Cargo.toml +++ b/probing/cli/Cargo.toml @@ -19,6 +19,7 @@ path = "src/lib.rs" [dependencies] probing-proto = { path = "../proto", default-features = false, features = [] } +probing-skills = { path = "../crates/skills" } probing-store = { path = "../crates/store", default-features = false, features = [ ] } probing-memtable = { path = "../memtable" } @@ -40,9 +41,9 @@ libc = "0.2.176" tokio-tungstenite = { version = "0.28.0", features = ["rustls"] } reedline = "0.43.0" futures-util = "0.3" -include_dir = "0.7.4" serde = { version = "1", features = ["derive"] } serde_yaml = "0.9" +async-trait = "0.1" [dependencies.clap] version = "4.5.38" diff --git a/probing/cli/src/cli/skill/backend.rs b/probing/cli/src/cli/skill/backend.rs new file mode 100644 index 00000000..7b74b747 --- /dev/null +++ b/probing/cli/src/cli/skill/backend.rs @@ -0,0 +1,60 @@ +//! ``ProbeEndpoint`` adapter for the shared skill runner. + +use probing_proto::prelude::{DataFrame, NodeListResponse, Query}; +use probing_skills::backend::{parse_cluster_meta, ClusterQueryMeta, SkillBackend}; +use probing_skills::runner::{Result, SkillRunError}; + +use crate::cli::ctrl::ProbeEndpoint; + +pub struct CliBackend(pub ProbeEndpoint); + +#[async_trait::async_trait] +impl SkillBackend for CliBackend { + async fn query_local(&self, sql: &str) -> Result { + self.0 + .query(Query::new(sql.to_string())) + .await + .map_err(|e| SkillRunError(e.to_string())) + } + + async fn cluster_query(&self, sql: &str) -> Result<(DataFrame, Option)> { + let body = serde_json::json!({ + "expr": sql, + "cluster": true, + }); + let reply = self + .0 + .post_json("/apis/cluster/query", &body.to_string()) + .await + .map_err(|e| SkillRunError(e.to_string()))?; + let value: serde_json::Value = + serde_json::from_str(&reply).map_err(|e| SkillRunError(e.to_string()))?; + if let Some(err) = value.get("error").and_then(|v| v.as_str()) { + return Err(SkillRunError(err.to_string())); + } + let df = value + .get("dataframe") + .ok_or_else(|| SkillRunError("missing dataframe in cluster response".to_string()))?; + let dataframe: DataFrame = + serde_json::from_value(df.clone()).map_err(|e| SkillRunError(e.to_string()))?; + let cluster_meta = value.get("meta").map(parse_cluster_meta); + Ok((dataframe, cluster_meta)) + } + + async fn get(&self, path: &str) -> Result { + self.0 + .get(path) + .await + .map_err(|e| SkillRunError(e.to_string())) + } + + async fn peer_count(&self) -> usize { + match self.0.get("/apis/nodes?limit=1024").await { + Ok(reply) => match serde_json::from_str::(&reply) { + Ok(resp) => resp.total.saturating_sub(1), + Err(_) => 0, + }, + Err(_) => 0, + } + } +} diff --git a/probing/cli/src/cli/skill/mod.rs b/probing/cli/src/cli/skill/mod.rs index 7d879edd..46776c34 100644 --- a/probing/cli/src/cli/skill/mod.rs +++ b/probing/cli/src/cli/skill/mod.rs @@ -1,12 +1,12 @@ //! Structured diagnostic skills (``probing skill``). -pub mod interpret; -pub mod loader; +mod backend; mod runner; -pub use loader::{ - build_context, default_parameters, expand_template, list_skill_ids, load_skill, Skill, - SkillStep, +pub use probing_skills::{ + build_context, default_parameters, derive_variables, evaluate_rules, expand_template, + list_skill_ids, load_skill, plan_skill, InterpretFinding, InterpretRule, Skill, SkillParameter, + SkillStep, StepEvidence, }; pub use runner::{list_skills as list_skills_sync, run_skill, run_skill_json}; diff --git a/probing/cli/src/cli/skill/runner.rs b/probing/cli/src/cli/skill/runner.rs index e1777930..a215fbf4 100644 --- a/probing/cli/src/cli/skill/runner.rs +++ b/probing/cli/src/cli/skill/runner.rs @@ -1,374 +1,102 @@ -//! Execute skill steps against a probing endpoint (sql / api / config). +//! CLI wrappers around the shared ``probing-skills`` runner. use std::collections::HashMap; -use anyhow::{anyhow, Result}; -use probing_proto::prelude::{DataFrame, Query}; +use anyhow::Result; +use probing_skills::runner::{ + execute_skill, run_result_to_json, RunOptions, RunResult, StepOutcome, +}; use crate::cli::ctrl::ProbeEndpoint; use crate::table::{render, OutputFormat}; -use super::interpret::{evaluate_rules, InterpretFinding, StepEvidence}; -use super::loader::{build_context, expand_template, load_skill, Skill, SkillStep}; +use super::backend::CliBackend; +use probing_skills::loader::{list_skill_ids, load_skill}; -#[derive(Debug, Clone, Default, serde::Serialize)] -pub struct ClusterQueryMeta { - pub partial: bool, - pub nodes_queried: usize, - pub nodes_failed: Vec, - pub peer_batches_dropped: usize, -} - -#[derive(Debug, Clone)] -#[allow(dead_code)] -pub enum StepOutcome { - Sql { - step_id: String, - title: String, - dataframe: DataFrame, - row_count: usize, - note: Option, - degraded: bool, - cluster_meta: Option, - }, - ApiText { - step_id: String, - title: String, - text: String, - }, - Skipped { - step_id: String, - title: String, - reason: String, - }, - Error { - step_id: String, - title: String, - message: String, - }, -} - -fn dataframe_rows(df: &DataFrame) -> usize { - df.cols.iter().map(|c| c.len()).max().unwrap_or(0) -} - -fn should_skip_step(step: &SkillStep, ctx: &HashMap) -> Option { - let Some(when) = &step.when else { - return None; - }; - let w = when.trim(); - if w == "always" { - return None; - } - if w == "{use_global}" || w.contains("use_global") { - let use_global = ctx.get("use_global").map(|v| v == "true").unwrap_or(false); - if !use_global { - return Some("skipped (standalone / use_global=false)".to_string()); - } - } - None -} - -fn sql_needs_cluster(sql: &str, step_cluster: bool) -> bool { - step_cluster || sql.to_lowercase().contains("global.") -} - -fn ensure_read_only_sql(sql: &str) -> Result<()> { - let upper = sql.trim().to_uppercase(); - if upper.starts_with("SELECT") - || upper.starts_with("WITH") - || upper.starts_with("SHOW") - || upper.starts_with("DESCRIBE") - { - return Ok(()); +pub fn list_skills() -> Result<()> { + println!("Available diagnostic skills:\n"); + for id in list_skill_ids() { + let pb = load_skill(&id)?; + println!(" {:<22} {:<12} {}", id, pb.category, pb.title); } - Err(anyhow!("Only read-only SQL is allowed in skills")) + Ok(()) } -async fn cluster_query( - ctrl: &ProbeEndpoint, - expr: &str, -) -> Result<(DataFrame, Option)> { - let body = serde_json::json!({ - "expr": expr, - "cluster": true, - }); - let reply = ctrl - .post_json("/apis/cluster/query", &body.to_string()) - .await?; - let value: serde_json::Value = serde_json::from_str(&reply)?; - if let Some(err) = value.get("error").and_then(|v| v.as_str()) { - anyhow::bail!("{err}"); +pub async fn run_skill( + ctrl: ProbeEndpoint, + skill_id: &str, + overrides: HashMap, + format: OutputFormat, +) -> Result<()> { + let result = execute_skill( + &CliBackend(ctrl), + skill_id, + overrides, + RunOptions::default(), + ) + .await + .map_err(|e| anyhow::anyhow!(e.0))?; + print_run_result(&result, format)?; + if result.had_error { + anyhow::bail!("skill finished with errors"); } - let df = value - .get("dataframe") - .ok_or_else(|| anyhow!("missing dataframe in cluster response"))?; - let dataframe: DataFrame = serde_json::from_value(df.clone())?; - let cluster_meta = value.get("meta").map(parse_cluster_meta); - Ok((dataframe, cluster_meta)) -} - -fn parse_cluster_meta(meta: &serde_json::Value) -> ClusterQueryMeta { - let nodes_failed: Vec = meta - .get("nodes_failed") - .and_then(|v| v.as_array()) - .map(|arr| { - arr.iter() - .filter_map(|v| v.as_str().map(String::from)) - .collect() - }) - .unwrap_or_default(); - let peer_batches_dropped = meta - .get("peer_batches_dropped") - .and_then(|v| v.as_u64()) - .unwrap_or(0) as usize; - let nodes_queried = meta - .get("nodes_queried") - .and_then(|v| v.as_u64()) - .unwrap_or(0) as usize; - let partial = meta - .get("partial") - .and_then(|v| v.as_bool()) - .unwrap_or(false) - || !nodes_failed.is_empty() - || peer_batches_dropped > 0; - ClusterQueryMeta { - partial, - nodes_queried, - nodes_failed, - peer_batches_dropped, + if result.had_degraded { + anyhow::bail!( + "skill finished with degraded/partial cluster data — results must not be treated as complete" + ); } + Ok(()) } -fn cluster_meta_note(meta: &ClusterQueryMeta) -> String { - format!( - "cluster fan-out · {} nodes queried · {} failed · {} peer batches dropped{}", - meta.nodes_queried, - meta.nodes_failed.len(), - meta.peer_batches_dropped, - if meta.partial { " · PARTIAL" } else { "" } +pub async fn run_skill_json( + ctrl: ProbeEndpoint, + skill_id: &str, + overrides: HashMap, +) -> Result { + let result = execute_skill( + &CliBackend(ctrl), + skill_id, + overrides, + RunOptions::default(), ) -} - -fn cluster_integrity_findings(outcomes: &[StepOutcome]) -> Vec { - let mut findings = Vec::new(); - for outcome in outcomes { - let StepOutcome::Sql { - step_id, - cluster_meta: Some(meta), - .. - } = outcome - else { - continue; - }; - if !meta.partial { - continue; - } - findings.push(InterpretFinding { - rule_id: format!("{step_id}_partial_fanout"), - severity: "error".to_string(), - message: format!( - "Cluster fan-out incomplete for step '{step_id}': {} nodes queried, {} failed, {} peer batches dropped — do not treat results as complete", - meta.nodes_queried, - meta.nodes_failed.len(), - meta.peer_batches_dropped, - ), - }); + .await + .map_err(|e| anyhow::anyhow!(e.0))?; + let payload = run_result_to_json(&result); + if result.had_error { + anyhow::bail!(payload.to_string()); } - findings + Ok(payload) } -async fn fetch_cluster_peer_count(ctrl: &ProbeEndpoint) -> usize { - match ctrl.get("/apis/nodes?limit=1024").await { - Ok(reply) => match serde_json::from_str::(&reply) - { - Ok(resp) => resp.total.saturating_sub(1), - Err(_) => 0, - }, - Err(_) => 0, +fn print_run_result(result: &RunResult, format: OutputFormat) -> Result<()> { + println!("# {} ({})", result.skill.title, result.skill.id); + if !result.skill.docs.is_empty() { + println!("{}\n", result.skill.docs); } -} - -async fn resolve_use_global( - ctrl: &ProbeEndpoint, - pb: &Skill, - overrides: &mut HashMap, -) { - if overrides.contains_key("use_global") { - return; + for outcome in &result.outcomes { + print_outcome(outcome, format); } - let default = pb - .parameters - .iter() - .find(|p| p.name == "use_global") - .and_then(|p| match &p.default { - serde_yaml::Value::Bool(b) => Some(*b), - _ => None, - }) - .unwrap_or(false); - let peers = fetch_cluster_peer_count(ctrl).await; - let use_global = peers > 0 && default; - overrides.insert("use_global".to_string(), use_global.to_string()); -} - -async fn run_sql_step(ctrl: &ProbeEndpoint, step: &SkillStep, sql: &str) -> StepOutcome { - if let Err(e) = ensure_read_only_sql(sql) { - return StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: e.to_string(), - }; - } - let cluster = sql_needs_cluster(sql, step.cluster.unwrap_or(false)); - let result = if cluster { - cluster_query(ctrl, sql).await.map(|(df, meta)| { - let note = meta.as_ref().map(cluster_meta_note); - (df, note, meta) - }) - } else { - ctrl.query(Query::new(sql.to_string())) - .await - .map(|df| (df, None, None)) - }; - - match result { - Ok((df, note, cluster_meta)) => { - let degraded = cluster_meta.as_ref().is_some_and(|m| m.partial); - let rows = dataframe_rows(&df); - if rows == 0 { - match step.on_empty.as_str() { - "abort" => StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: step - .empty_message - .clone() - .unwrap_or_else(|| "Query returned no rows".to_string()), - }, - "warn" => StepOutcome::Sql { - step_id: step.id.clone(), - title: step.title.clone(), - dataframe: df, - row_count: 0, - note, - degraded, - cluster_meta, - }, - _ => StepOutcome::Skipped { - step_id: step.id.clone(), - title: step.title.clone(), - reason: step - .empty_message - .clone() - .unwrap_or_else(|| "No data".to_string()), - }, - } - } else { - StepOutcome::Sql { - step_id: step.id.clone(), - title: step.title.clone(), - dataframe: df, - row_count: rows, - note, - degraded, - cluster_meta, - } - } - } - Err(e) => { - if step.on_empty == "skip" { - StepOutcome::Skipped { - step_id: step.id.clone(), - title: step.title.clone(), - reason: e.to_string(), - } - } else { - StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: e.to_string(), - } - } + if !result.findings.is_empty() { + println!("\n### Interpretation"); + for f in &result.findings { + println!( + "[{}] {} — {}", + f.severity.to_uppercase(), + f.rule_id, + f.message + ); } } -} - -async fn run_api_step(ctrl: &ProbeEndpoint, step: &SkillStep) -> StepOutcome { - let path = step.path.clone().unwrap_or_default(); - match ctrl.get(&path).await { - Ok(body) => StepOutcome::ApiText { - step_id: step.id.clone(), - title: step.title.clone(), - text: body, - }, - Err(e) => StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: e.to_string(), - }, - } -} - -async fn run_step( - ctrl: &ProbeEndpoint, - step: &SkillStep, - ctx: &HashMap, -) -> StepOutcome { - if let Some(reason) = should_skip_step(step, ctx) { - return StepOutcome::Skipped { - step_id: step.id.clone(), - title: step.title.clone(), - reason, - }; + if !result.summary.is_empty() { + println!("\n{}", result.summary); } - match step.step_type.as_str() { - "sql" => { - let Some(sql_tpl) = &step.sql else { - return StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: "SQL step missing query".to_string(), - }; - }; - let sql = expand_template(sql_tpl, ctx); - run_sql_step(ctrl, step, &sql).await + if !result.skill.next_steps.is_empty() { + println!("\n### Next steps"); + for line in &result.skill.next_steps { + println!("- {line}"); } - "api" => run_api_step(ctrl, step).await, - "ui" => StepOutcome::Skipped { - step_id: step.id.clone(), - title: step.title.clone(), - reason: format!( - "ui step (view={}) — run probing Web UI for navigation", - step.view.as_deref().unwrap_or("?") - ), - }, - "config" => StepOutcome::Skipped { - step_id: step.id.clone(), - title: step.title.clone(), - reason: "config steps are not applied automatically in CLI skill".to_string(), - }, - other => StepOutcome::Skipped { - step_id: step.id.clone(), - title: step.title.clone(), - reason: format!("unsupported step type: {other}"), - }, - } -} - -fn outcome_to_evidence(outcome: &StepOutcome) -> Option { - match outcome { - StepOutcome::Sql { - step_id, - dataframe, - row_count, - .. - } => Some(StepEvidence { - step_id: step_id.clone(), - row_count: *row_count, - dataframe: dataframe.clone(), - }), - _ => None, } + Ok(()) } fn print_outcome(outcome: &StepOutcome, format: OutputFormat) { @@ -394,6 +122,10 @@ fn print_outcome(outcome: &StepOutcome, format: OutputFormat) { println!("\n## {title}"); println!("{text}"); } + StepOutcome::UiNavigate { title, view, .. } => { + eprintln!("\n## {title} [ui]"); + eprintln!("navigate to view: {view}"); + } StepOutcome::Skipped { title, reason, .. } => { eprintln!("\n## {title} [skipped]"); eprintln!("{reason}"); @@ -405,277 +137,24 @@ fn print_outcome(outcome: &StepOutcome, format: OutputFormat) { } } -fn print_findings(findings: &[InterpretFinding]) { - if findings.is_empty() { - return; - } - println!("\n### Interpretation"); - for f in findings { - println!( - "[{}] {} — {}", - f.severity.to_uppercase(), - f.rule_id, - f.message - ); - } -} - -pub fn list_skills() -> Result<()> { - use super::loader::list_skill_ids; - println!("Available diagnostic skills:\n"); - for id in list_skill_ids() { - let pb = load_skill(&id)?; - println!(" {:<22} {:<12} {}", id, pb.category, pb.title); - } - Ok(()) -} - -pub async fn run_skill( - ctrl: ProbeEndpoint, - skill_id: &str, - mut overrides: HashMap, - format: OutputFormat, -) -> Result<()> { - let pb = load_skill(skill_id)?; - resolve_use_global(&ctrl, &pb, &mut overrides).await; - let ctx = build_context(&pb, &overrides); - - println!("# {} ({})", pb.title, pb.id); - if !pb.docs.is_empty() { - println!("{}\n", pb.docs); - } - - let mut outcomes = Vec::new(); - let mut evidence = Vec::new(); - let mut abort = false; - - for step in &pb.steps { - if abort { - break; - } - let outcome = run_step(&ctrl, step, &ctx).await; - if let Some(ev) = outcome_to_evidence(&outcome) { - evidence.push(ev); - } - print_outcome(&outcome, format); - if matches!( - &outcome, - StepOutcome::Error { .. } if step.on_empty == "abort" - ) { - abort = true; - } - outcomes.push(outcome); - } - - let mut findings = evaluate_rules(&pb.interpretation, &evidence, &ctx); - findings.extend(cluster_integrity_findings(&outcomes)); - print_findings(&findings); - - if !pb.summary_template.is_empty() { - let mut summary_ctx = ctx.clone(); - for ev in &evidence { - summary_ctx.insert( - format!("{}.row_count", ev.step_id), - ev.row_count.to_string(), - ); - } - println!("\n{}", expand_template(&pb.summary_template, &summary_ctx)); - } - - if !pb.next_steps.is_empty() { - println!("\n### Next steps"); - for line in &pb.next_steps { - println!("- {line}"); - } - } - - let had_error = outcomes - .iter() - .any(|o| matches!(o, StepOutcome::Error { .. })); - let had_degraded = outcomes.iter().any(|o| match o { - StepOutcome::Sql { degraded, .. } => *degraded, - _ => false, - }); - if had_error { - anyhow::bail!("skill finished with errors"); - } - if had_degraded { - anyhow::bail!( - "skill finished with degraded/partial cluster data — results must not be treated as complete" - ); - } - Ok(()) -} - -/// Execute a skill and return structured JSON for MCP / agent consumers. -pub async fn run_skill_json( - ctrl: ProbeEndpoint, - skill_id: &str, - mut overrides: HashMap, -) -> Result { - let pb = load_skill(skill_id)?; - resolve_use_global(&ctrl, &pb, &mut overrides).await; - let ctx = build_context(&pb, &overrides); - - let mut steps_out = Vec::new(); - let mut outcomes = Vec::new(); - let mut evidence = Vec::new(); - let mut abort = false; - - for step in &pb.steps { - if abort { - break; - } - let outcome = run_step(&ctrl, step, &ctx).await; - if let Some(ev) = outcome_to_evidence(&outcome) { - evidence.push(ev); - } - steps_out.push(outcome_to_json(&outcome)); - outcomes.push(outcome); - if matches!( - outcomes.last(), - Some(StepOutcome::Error { .. }) if step.on_empty == "abort" - ) { - abort = true; - } - } - - let mut findings = evaluate_rules(&pb.interpretation, &evidence, &ctx); - findings.extend(cluster_integrity_findings(&outcomes)); - let findings_json: Vec = findings - .iter() - .map(|f| { - serde_json::json!({ - "rule_id": f.rule_id, - "severity": f.severity, - "message": f.message, - }) - }) - .collect(); - - let mut summary_ctx = ctx.clone(); - for ev in &evidence { - summary_ctx.insert( - format!("{}.row_count", ev.step_id), - ev.row_count.to_string(), - ); - } - let summary = if pb.summary_template.is_empty() { - String::new() - } else { - expand_template(&pb.summary_template, &summary_ctx) - }; - - let had_error = steps_out.iter().any(|s| { - s.get("status") - .and_then(|v| v.as_str()) - .is_some_and(|st| st == "error") - }); - let had_degraded = steps_out.iter().any(|s| { - s.get("status") - .and_then(|v| v.as_str()) - .is_some_and(|st| st == "degraded") - }); - - let payload = serde_json::json!({ - "skill_id": pb.id, - "title": pb.title, - "parameters": overrides, - "steps": steps_out, - "findings": findings_json, - "summary": summary, - "next_steps": pb.next_steps, - "status": if had_error { - "error" - } else if had_degraded { - "degraded" - } else { - "ok" - }, - "data_quality": { - "partial_cluster_fanout": had_degraded, - }, - }); - - if had_error { - anyhow::bail!(payload.to_string()); - } - Ok(payload) -} - -fn outcome_to_json(outcome: &StepOutcome) -> serde_json::Value { - match outcome { - StepOutcome::Sql { - step_id, - title, - dataframe, - row_count, - note, - degraded, - cluster_meta, - } => { - serde_json::json!({ - "step_id": step_id, - "title": title, - "status": if *degraded { "degraded" } else { "ok" }, - "row_count": row_count, - "note": note, - "cluster_meta": cluster_meta, - "dataframe": dataframe, - }) - } - StepOutcome::ApiText { - step_id, - title, - text, - } => { - serde_json::json!({ - "step_id": step_id, - "title": title, - "status": "ok", - "text": text, - }) - } - StepOutcome::Skipped { - step_id, - title, - reason, - } => { - serde_json::json!({ - "step_id": step_id, - "title": title, - "status": "skipped", - "reason": reason, - }) - } - StepOutcome::Error { - step_id, - title, - message, - } => { - serde_json::json!({ - "step_id": step_id, - "title": title, - "status": "error", - "message": message, - }) - } - } -} - #[cfg(test)] -mod cluster_meta_tests { - use super::parse_cluster_meta; +mod tests { + use super::print_outcome; + use crate::table::OutputFormat; + use probing_proto::prelude::DataFrame; + use probing_skills::runner::StepOutcome; #[test] - fn partial_when_nodes_failed_even_without_flag() { - let meta = parse_cluster_meta(&serde_json::json!({ - "partial": false, - "nodes_queried": 8, - "nodes_failed": ["10.0.0.3:8080"], - "peer_batches_dropped": 0, - })); - assert!(meta.partial); - assert_eq!(meta.nodes_failed.len(), 1); + fn print_outcome_accepts_sql() { + let outcome = StepOutcome::Sql { + step_id: "s".into(), + title: "Health".into(), + dataframe: DataFrame::default(), + row_count: 0, + note: None, + degraded: false, + cluster_meta: None, + }; + print_outcome(&outcome, OutputFormat::Table); } } diff --git a/skills/semantic/tables.yaml b/probing/core/resources/tables.yaml similarity index 98% rename from skills/semantic/tables.yaml rename to probing/core/resources/tables.yaml index 6df6f262..5d2fd93e 100644 --- a/skills/semantic/tables.yaml +++ b/probing/core/resources/tables.yaml @@ -1,6 +1,7 @@ -# Semantic layer: maps user/agent language to probing SQL tables and columns. -# Used in system prompts, skill prerequisite checks, and Engine DESCRIBE rewrite -# (probe.probing.table_docs / column_docs). +# Agent overlay for table/column semantics (synonyms, notes, global_name, key_columns). +# SSOT for descriptions: in-code docs registry (collectors, @table, mmap Schema). +# Engine merge: registry first; this file fills gaps and supplies agent-only fields. +# Consumed at compile time by probing-core (probe.probing.table_docs / column_docs). apiVersion: probing.dev/v1 kind: SemanticCatalog diff --git a/probing/core/src/core/semantic_catalog.rs b/probing/core/src/core/semantic_catalog.rs index 8bf78e66..af843ee2 100644 --- a/probing/core/src/core/semantic_catalog.rs +++ b/probing/core/src/core/semantic_catalog.rs @@ -1,10 +1,10 @@ //! Semantic table/column documentation for Engine `DESCRIBE` / `SHOW CREATE TABLE`. //! -//! **Primary source:** in-code [`Schema`] docs registered via [`probing_memtable::docs`] -//! (HCCL/NCCL collectors, mmap `ExposedTable::create`, Python `@table`). +//! **Primary source (SSOT for descriptions):** in-code [`Schema`] docs registered via +//! [`probing_memtable::docs`] (HCCL/NCCL collectors, mmap `ExposedTable::create`, Python `@table`). //! -//! **Overlay:** `skills/semantic/tables.yaml` supplies agent synonyms/notes/global_name -//! and fills gaps for tables not yet migrated to code-first docs. +//! **Overlay:** `probing/core/resources/tables.yaml` supplies agent synonyms/notes/global_name +//! and column docs for tables not yet registered in code. use std::collections::HashMap; use std::sync::Arc; @@ -23,7 +23,7 @@ use serde::Deserialize; use super::plugin_advanced::PluginAdvancedTable; -const TABLES_YAML: &str = include_str!("../../../../skills/semantic/tables.yaml"); +const TABLES_YAML: &str = include_str!("../../resources/tables.yaml"); pub const DOCS_SCHEMA: &str = "probing"; pub const TABLE_DOCS: &str = "table_docs"; @@ -36,6 +36,7 @@ struct SemanticCatalogFile { #[derive(Debug, Deserialize)] struct TableEntry { + #[serde(default)] description: String, #[serde(default)] synonyms: Vec, @@ -141,38 +142,29 @@ fn sort_catalog_rows(table_rows: &mut [TableDocRow], column_rows: &mut [ColumnDo }); } -/// Merge YAML overlay with the in-code doc registry (registry wins for descriptions). +/// Merge in-code doc registry with YAML overlay (registry wins for descriptions/columns). pub fn build_semantic_catalog() -> Result { register_builtin_schema_docs(); let yaml = parse_semantic_catalog_yaml(TABLES_YAML)?; let mut table_map: HashMap<(String, String), TableDocRow> = HashMap::new(); - for row in yaml.table_rows { - table_map.insert(table_key(&row.table_schema, &row.table_name), row); - } - let mut column_map: HashMap<(String, String, String), ColumnDocRow> = HashMap::new(); - for row in yaml.column_rows { - column_map.insert( - column_key(&row.table_schema, &row.table_name, &row.column_name), - row, - ); - } + // Code-first: collector / @table / mmap docs are authoritative for descriptions. for doc in docs::snapshot() { let key = table_key(&doc.table_schema, &doc.table_name); - let entry = table_map.entry(key).or_insert_with(|| TableDocRow { - table_schema: doc.table_schema.clone(), - table_name: doc.table_name.clone(), - description: String::new(), - synonyms: String::new(), - notes: String::new(), - global_name: String::new(), - }); - if let Some(desc) = &doc.description { - entry.description = desc.clone(); - } + table_map.insert( + key, + TableDocRow { + table_schema: doc.table_schema.clone(), + table_name: doc.table_name.clone(), + description: doc.description.clone().unwrap_or_default(), + synonyms: String::new(), + notes: String::new(), + global_name: String::new(), + }, + ); for (column_name, description) in &doc.columns { column_map.insert( column_key(&doc.table_schema, &doc.table_name, column_name), @@ -186,6 +178,40 @@ pub fn build_semantic_catalog() -> Result { } } + // YAML overlay: agent fields always apply; descriptions/columns fill registry gaps only. + for row in yaml.table_rows { + let key = table_key(&row.table_schema, &row.table_name); + match table_map.get_mut(&key) { + Some(entry) => { + if !row.synonyms.is_empty() { + entry.synonyms = row.synonyms; + } + if !row.notes.is_empty() { + entry.notes = row.notes; + } + if !row.global_name.is_empty() { + entry.global_name = row.global_name; + } + if entry.description.is_empty() && !row.description.is_empty() { + entry.description = row.description; + } + } + None => { + table_map.insert(key, row); + } + } + } + + for row in yaml.column_rows { + column_map + .entry(column_key( + &row.table_schema, + &row.table_name, + &row.column_name, + )) + .or_insert(row); + } + let mut table_rows: Vec = table_map.into_values().collect(); let mut column_rows: Vec = column_map.into_values().collect(); sort_catalog_rows(&mut table_rows, &mut column_rows); @@ -205,7 +231,7 @@ static SEMANTIC_COLUMN_INDEX: LazyLock>> = let yaml = match parse_semantic_catalog_yaml(TABLES_YAML) { Ok(yaml) => yaml, Err(e) => { - log::error!("skills/semantic/tables.yaml failed to parse: {e}"); + log::error!("probing/core/resources/tables.yaml failed to parse: {e}"); return HashMap::new(); } }; @@ -510,6 +536,20 @@ mod tests { assert!(row.description.contains("Culprit")); } + #[test] + fn build_catalog_yaml_fills_description_when_registry_empty() { + let parsed = build_semantic_catalog().unwrap(); + let torch_trace = parsed + .table_rows + .iter() + .find(|r| r.table_schema == "python" && r.table_name == "torch_trace") + .expect("python.torch_trace"); + assert!( + !torch_trace.description.is_empty(), + "yaml should supply description for tables without code docs" + ); + } + #[test] fn empty_python_extern_table_has_comm_collective_columns() { let table = empty_python_extern_table("comm_collective").expect("comm_collective schema"); diff --git a/probing/crates/skills/Cargo.toml b/probing/crates/skills/Cargo.toml new file mode 100644 index 00000000..274bdc1b --- /dev/null +++ b/probing/crates/skills/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "probing-skills" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +description = "Diagnostic skill loader, interpreter, and runner (shared by CLI and Web)" + +[dependencies] +probing-proto = { path = "../../proto", default-features = false } +anyhow = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +serde_yaml = "0.9" +async-trait = "0.1" + +[dev-dependencies] +serde_yaml = "0.9" diff --git a/probing/crates/skills/src/api.rs b/probing/crates/skills/src/api.rs new file mode 100644 index 00000000..fa4ad4c0 --- /dev/null +++ b/probing/crates/skills/src/api.rs @@ -0,0 +1,353 @@ +//! JSON serialization for skill HTTP / MCP discovery APIs. + +use std::collections::HashMap; + +use anyhow::{Context, Result}; +use serde_json::{json, Value}; + +use super::catalog::{load_catalog, load_intents, load_pages, CatalogEntry}; +use super::loader::{load_skill, InterpretRule, KeywordsSpec, Skill, SkillParameter, SkillStep}; +use super::routing::match_skills; + +pub fn skill_to_json(skill: &Skill) -> Value { + let keywords = skill.routing_keywords_json(); + json!({ + "id": skill.id, + "title": skill.title, + "category": skill.category, + "tags": skill.tags, + "docs": skill.docs, + "parameters": skill.parameters.iter().map(|p| { + json!({ + "name": p.name, + "default": yaml_to_json(&p.default), + }) + }).collect::>(), + "steps": skill.steps.iter().map(step_to_json).collect::>(), + "interpretation": { + "rules": skill.interpretation.iter().map(|r| { + json!({ + "id": r.id, + "when": r.when, + "severity": r.severity, + "message": r.message, + }) + }).collect::>(), + }, + "summary_template": skill.summary_template, + "next_steps": skill.next_steps, + "keywords": { + "zh": keywords.zh, + "en": keywords.en, + }, + }) +} + +fn step_to_json(step: &SkillStep) -> Value { + json!({ + "id": step.id, + "title": step.title, + "type": step.step_type, + "sql": step.sql, + "path": step.path, + "view": step.view, + "on_empty": step.on_empty, + "empty_message": step.empty_message, + "when": step.when, + "cluster": step.cluster, + }) +} + +pub fn catalog_entry_to_json(entry: &CatalogEntry) -> Value { + json!({ + "id": entry.id, + "path": entry.path, + "category": entry.category, + "priority": entry.priority, + "description": entry.description, + }) +} + +pub fn catalog_to_json() -> Result { + let skills = load_catalog(); + Ok(json!({ + "skills": skills.iter().map(catalog_entry_to_json).collect::>(), + })) +} + +pub fn load_skill_json(id: &str) -> Result { + let skill = load_skill(id)?; + serde_json::to_string(&skill_to_json(&skill)).context("serialize skill") +} + +pub fn skill_from_api(value: &Value) -> Result { + let id = value + .get("id") + .and_then(|v| v.as_str()) + .context("skill id")? + .to_string(); + let title = value + .get("title") + .and_then(|v| v.as_str()) + .unwrap_or(&id) + .to_string(); + let category = value + .get("category") + .and_then(|v| v.as_str()) + .unwrap_or("general") + .to_string(); + let docs = value + .get("docs") + .and_then(|v| v.as_str()) + .unwrap_or_default() + .trim() + .to_string(); + let tags: Vec = value + .get("tags") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str().map(str::to_string)) + .collect() + }) + .unwrap_or_default(); + let keywords_obj = value.get("keywords").cloned().unwrap_or(json!({})); + let trigger_keywords = KeywordsSpec { + zh: keywords_obj + .get("zh") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str().map(str::to_string)) + .collect() + }) + .unwrap_or_default(), + en: keywords_obj + .get("en") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str().map(str::to_string)) + .collect() + }) + .unwrap_or_default(), + }; + let mut keywords: Vec = tags.iter().map(|t| t.to_lowercase()).collect(); + for kw in trigger_keywords.zh.iter().chain(trigger_keywords.en.iter()) { + keywords.push(kw.to_lowercase()); + } + let parameters = value + .get("parameters") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|item| { + let name = item.get("name")?.as_str()?.to_string(); + let default = item.get("default").cloned().unwrap_or(Value::Null); + Some(SkillParameter { + name, + default: json_to_yaml(&default), + }) + }) + .collect() + }) + .unwrap_or_default(); + let steps = value + .get("steps") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|item| { + Some(SkillStep { + id: item.get("id")?.as_str()?.to_string(), + title: item.get("title")?.as_str()?.to_string(), + step_type: item + .get("type") + .and_then(|v| v.as_str()) + .unwrap_or("sql") + .to_string(), + sql: item.get("sql").and_then(|v| v.as_str()).map(str::to_string), + path: item + .get("path") + .and_then(|v| v.as_str()) + .map(str::to_string), + view: item + .get("view") + .and_then(|v| v.as_str()) + .map(str::to_string), + on_empty: item + .get("on_empty") + .and_then(|v| v.as_str()) + .unwrap_or("skip") + .to_string(), + empty_message: item + .get("empty_message") + .and_then(|v| v.as_str()) + .map(str::to_string), + when: item + .get("when") + .and_then(|v| v.as_str()) + .map(str::to_string), + cluster: item.get("cluster").and_then(|v| v.as_bool()), + }) + }) + .collect() + }) + .unwrap_or_default(); + let interpretation = value + .get("interpretation") + .and_then(|v| v.get("rules")) + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|item| { + Some(InterpretRule { + id: item.get("id")?.as_str()?.to_string(), + when: item.get("when")?.as_str()?.to_string(), + severity: item + .get("severity") + .and_then(|v| v.as_str()) + .unwrap_or("info") + .to_string(), + message: item.get("message")?.as_str()?.to_string(), + }) + }) + .collect() + }) + .unwrap_or_default(); + let summary_template = value + .get("summary_template") + .and_then(|v| v.as_str()) + .unwrap_or_default() + .to_string(); + let next_steps = value + .get("next_steps") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str().map(str::to_string)) + .collect() + }) + .unwrap_or_default(); + Ok(Skill { + id, + title, + category, + docs, + tags, + keywords, + trigger_keywords, + parameters, + steps, + interpretation, + summary_template, + next_steps, + variables: HashMap::new(), + }) +} + +pub fn catalog_json() -> Result { + serde_json::to_string(&catalog_to_json()?).context("serialize catalog") +} + +pub fn routing_json() -> Result { + let catalog = catalog_to_json()?; + let intents = load_intents()?; + let pages = load_pages()?; + serde_json::to_string(&json!({ + "catalog": catalog, + "intents": intents, + "pages": pages, + })) + .context("serialize routing") +} + +pub fn list_skills_json(query: Option<&str>, limit: usize) -> Result { + let catalog = load_catalog(); + let mut summaries: Vec = Vec::new(); + for entry in &catalog { + let title = load_skill(&entry.id) + .map(|s| s.title) + .unwrap_or_else(|_| entry.id.clone()); + summaries.push(json!({ + "id": entry.id, + "category": entry.category, + "description": entry.description, + "priority": entry.priority, + "title": title, + })); + } + if let Some(q) = query.filter(|s| !s.trim().is_empty()) { + let ranked = match_skills(q, limit); + let by_id: HashMap = summaries + .iter() + .map(|s| { + let id = s["id"].as_str().unwrap_or_default().to_string(); + (id, s.clone()) + }) + .collect(); + let ordered: Vec = ranked + .into_iter() + .filter_map(|id| by_id.get(&id).cloned()) + .collect(); + if !ordered.is_empty() { + return serde_json::to_string_pretty(&ordered[..ordered.len().min(limit)]) + .context("serialize list"); + } + } + serde_json::to_string_pretty(&summaries[..summaries.len().min(limit)]).context("serialize list") +} + +fn json_to_yaml(value: &Value) -> serde_yaml::Value { + match value { + Value::Null => serde_yaml::Value::Null, + Value::Bool(b) => serde_yaml::Value::Bool(*b), + Value::Number(n) => { + if let Some(i) = n.as_i64() { + serde_yaml::Value::Number(i.into()) + } else if let Some(u) = n.as_u64() { + serde_yaml::Value::Number(u.into()) + } else { + serde_yaml::Value::Number(serde_yaml::Number::from(n.as_f64().unwrap_or(0.0))) + } + } + Value::String(s) => serde_yaml::Value::String(s.clone()), + Value::Array(arr) => serde_yaml::Value::Sequence(arr.iter().map(json_to_yaml).collect()), + Value::Object(map) => { + let mut out = serde_yaml::Mapping::new(); + for (k, v) in map { + out.insert(serde_yaml::Value::String(k.clone()), json_to_yaml(v)); + } + serde_yaml::Value::Mapping(out) + } + } +} + +fn yaml_to_json(value: &serde_yaml::Value) -> Value { + match value { + serde_yaml::Value::Null => Value::Null, + serde_yaml::Value::Bool(b) => json!(b), + serde_yaml::Value::Number(n) => { + if let Some(i) = n.as_i64() { + json!(i) + } else if let Some(u) = n.as_u64() { + json!(u) + } else { + json!(n.as_f64().unwrap_or(0.0)) + } + } + serde_yaml::Value::String(s) => json!(s), + serde_yaml::Value::Sequence(seq) => { + json!(seq.iter().map(yaml_to_json).collect::>()) + } + serde_yaml::Value::Mapping(map) => { + let mut out = serde_json::Map::new(); + for (k, v) in map { + let key = k.as_str().unwrap_or_default().to_string(); + out.insert(key, yaml_to_json(v)); + } + Value::Object(out) + } + serde_yaml::Value::Tagged(tagged) => yaml_to_json(&tagged.value), + } +} diff --git a/probing/crates/skills/src/backend.rs b/probing/crates/skills/src/backend.rs new file mode 100644 index 00000000..481003d6 --- /dev/null +++ b/probing/crates/skills/src/backend.rs @@ -0,0 +1,70 @@ +//! HTTP/query backend for skill step execution. + +use async_trait::async_trait; +use probing_proto::prelude::DataFrame; + +use crate::runner::SkillRunError; + +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)] +pub struct ClusterQueryMeta { + pub partial: bool, + pub nodes_queried: usize, + pub nodes_failed: Vec, + pub peer_batches_dropped: usize, +} + +#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +pub trait SkillBackend { + async fn query_local(&self, sql: &str) -> Result; + + async fn cluster_query(&self, sql: &str) -> Result<(DataFrame, Option)>; + + async fn get(&self, path: &str) -> Result; + + async fn peer_count(&self) -> usize; +} + +pub fn parse_cluster_meta(meta: &serde_json::Value) -> ClusterQueryMeta { + let nodes_failed: Vec = meta + .get("nodes_failed") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str().map(String::from)) + .collect() + }) + .unwrap_or_default(); + let peer_batches_dropped = meta + .get("peer_batches_dropped") + .and_then(|v| v.as_u64()) + .unwrap_or(0) as usize; + let nodes_queried = meta + .get("nodes_queried") + .and_then(|v| v.as_u64()) + .unwrap_or(0) as usize; + let partial = meta + .get("partial") + .and_then(|v| v.as_bool()) + .unwrap_or(false) + || !nodes_failed.is_empty() + || peer_batches_dropped > 0; + ClusterQueryMeta { + partial, + nodes_queried, + nodes_failed, + peer_batches_dropped, + } +} + +pub fn cluster_meta_note(meta: &ClusterQueryMeta) -> String { + format!( + "cluster fan-out · {} nodes queried · {} failed · {} peer batches dropped{}", + meta.nodes_queried, + meta.nodes_failed.len(), + meta.peer_batches_dropped, + if meta.partial { " · PARTIAL" } else { "" } + ) +} diff --git a/probing/crates/skills/src/catalog.rs b/probing/crates/skills/src/catalog.rs new file mode 100644 index 00000000..54414dce --- /dev/null +++ b/probing/crates/skills/src/catalog.rs @@ -0,0 +1,72 @@ +//! Merged skill catalog and semantic routing overlays. + +use std::collections::HashMap; +use std::fs; +use std::path::Path; + +use anyhow::{Context, Result}; +use serde::Deserialize; +use serde_json::Value; + +use super::discovery::{all_skill_root_paths, semantic_yaml_path}; + +#[derive(Debug, Clone, Deserialize, serde::Serialize)] +pub struct CatalogEntry { + pub id: String, + #[serde(default)] + pub path: String, + #[serde(default, alias = "file")] + pub file: String, + #[serde(default)] + pub category: String, + #[serde(default)] + pub priority: i32, + #[serde(default)] + pub description: String, +} + +#[derive(Debug, Clone, Deserialize)] +struct CatalogFile { + #[serde(default)] + skills: Vec, +} + +pub fn load_catalog() -> Vec { + let mut merged: HashMap = HashMap::new(); + for root in all_skill_root_paths() { + if let Ok(entries) = load_fs_catalog(&root) { + for entry in entries { + merged.insert(entry.id.clone(), entry); + } + } + } + let mut out: Vec = merged.into_values().collect(); + out.sort_by(|a, b| (a.priority, a.id.as_str()).cmp(&(b.priority, b.id.as_str()))); + out +} + +pub fn load_fs_catalog(root: &Path) -> Result> { + let catalog_path = root.join("catalog.yaml"); + if !catalog_path.is_file() { + return Ok(vec![]); + } + let text = fs::read_to_string(&catalog_path) + .with_context(|| format!("read {}", catalog_path.display()))?; + let file: CatalogFile = serde_yaml::from_str(&text)?; + Ok(file.skills) +} + +pub fn load_semantic_yaml(name: &str) -> Result { + let path = semantic_yaml_path(name) + .ok_or_else(|| anyhow::anyhow!("semantic file not found: {name}"))?; + let text = fs::read_to_string(&path).with_context(|| format!("read {}", path.display()))?; + serde_yaml::from_str(&text).context("parse semantic yaml") +} + +pub fn load_intents() -> Result { + load_semantic_yaml("intents.yaml") +} + +pub fn load_pages() -> Result { + load_semantic_yaml("pages.yaml") +} diff --git a/probing/crates/skills/src/discovery.rs b/probing/crates/skills/src/discovery.rs new file mode 100644 index 00000000..9c14dd02 --- /dev/null +++ b/probing/crates/skills/src/discovery.rs @@ -0,0 +1,261 @@ +//! Runtime discovery of skill root directories (no compile-time embed). + +use std::collections::HashSet; +use std::env; +use std::fs; +use std::path::{Path, PathBuf}; +#[cfg(not(target_arch = "wasm32"))] +use std::process::Command; +use std::sync::OnceLock; + +#[cfg(not(target_arch = "wasm32"))] +use anyhow::{Context, Result}; +#[cfg(not(target_arch = "wasm32"))] +use serde::Deserialize; + +#[cfg(not(target_arch = "wasm32"))] +#[derive(Debug, Clone, Deserialize)] +struct RootEntry { + path: String, + #[serde(rename = "label")] + _label: String, +} + +static CACHED_ROOTS: OnceLock> = OnceLock::new(); + +pub fn all_skill_root_paths() -> Vec { + CACHED_ROOTS.get_or_init(discover_skill_roots).clone() +} + +fn discover_skill_roots() -> Vec { + let mut out: Vec = Vec::new(); + let mut seen = HashSet::new(); + + let python_roots = python_discovered_roots(); + let use_bundled_fallback = python_roots.is_empty(); + + let sources = python_roots + .into_iter() + .chain(fs_skill_roots()) + .chain(if use_bundled_fallback { + bundled_skill_roots() + } else { + Vec::new() + }); + + for path in sources { + let key = path.to_string_lossy().to_string(); + if seen.insert(key) { + out.push(path); + } + } + out +} + +fn bundled_skill_roots() -> Vec { + let mut roots = Vec::new(); + if let Ok(path) = env::var("PROBING_BUNDLED_SKILLS") { + let p = PathBuf::from(path); + if p.join("catalog.yaml").is_file() { + roots.push(p); + } + } + let manifest = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let dev_bundled = manifest.join("../../python/probing/bundled_skills"); + if dev_bundled.join("catalog.yaml").is_file() { + roots.push(dev_bundled); + } + if let Some(repo) = find_repo_root() { + let skills = repo.join("skills"); + if skills.join("catalog.yaml").is_file() { + roots.push(skills); + } + let bundled = repo.join("python/probing/bundled_skills"); + if bundled.join("catalog.yaml").is_file() { + roots.push(bundled); + } + } + roots +} + +fn find_repo_root() -> Option { + let start = env::current_dir().ok()?; + for directory in start.ancestors() { + if directory.join("skills").join("catalog.yaml").is_file() + && directory.join("pyproject.toml").is_file() + { + return Some(directory.to_path_buf()); + } + if directory + .join("python/probing/bundled_skills/catalog.yaml") + .is_file() + && directory.join("pyproject.toml").is_file() + { + return Some(directory.to_path_buf()); + } + } + None +} + +fn python_discovered_roots() -> Vec { + #[cfg(target_arch = "wasm32")] + { + Vec::new() + } + #[cfg(not(target_arch = "wasm32"))] + { + for python in python_candidates() { + let output = Command::new(&python) + .args(["-m", "probing.extensions", "skill-roots"]) + .output(); + let Ok(output) = output else { + continue; + }; + if !output.status.success() { + continue; + } + let text = String::from_utf8_lossy(&output.stdout); + let entries: Vec = match serde_json::from_str(text.trim()) { + Ok(v) => v, + Err(_) => continue, + }; + return entries + .into_iter() + .map(|e| PathBuf::from(e.path)) + .filter(|p| p.join("catalog.yaml").is_file() || p.is_dir()) + .collect(); + } + Vec::new() + } +} + +#[cfg(not(target_arch = "wasm32"))] +fn python_candidates() -> Vec { + let mut out = Vec::new(); + if let Ok(exe) = env::var("PROBING_PYTHON") { + out.push(exe); + } + for name in ["python3", "python"] { + if let Ok(path) = which(name) { + out.push(path); + } + } + out +} + +#[cfg(not(target_arch = "wasm32"))] +fn which(name: &str) -> Result { + let path_var = env::var_os("PATH").context("PATH not set")?; + for dir in env::split_paths(&path_var) { + let candidate = dir.join(name); + if candidate.is_file() { + return Ok(candidate.to_string_lossy().into_owned()); + } + } + anyhow::bail!("{name} not found on PATH") +} + +pub fn home_skills_dir() -> Option { + env::var_os("HOME").map(|home| PathBuf::from(home).join(".probing/skills")) +} + +pub fn project_skills_dir() -> Option { + let cwd = env::current_dir().ok()?; + for ancestor in cwd.ancestors() { + let candidate = ancestor.join(".probing/skills"); + if candidate.is_dir() { + return Some(candidate); + } + } + None +} + +pub fn env_skills_dir() -> Option { + env::var("PROBING_SKILLS_DIR") + .ok() + .map(PathBuf::from) + .filter(|p| p.is_dir()) +} + +pub fn fs_skill_roots() -> Vec { + let mut roots = Vec::new(); + if let Some(dir) = home_skills_dir() { + if dir.is_dir() { + roots.push(dir); + } + } + if let Some(dir) = project_skills_dir() { + if !roots.iter().any(|r| r == &dir) { + roots.push(dir); + } + } + if let Some(dir) = env_skills_dir() { + if !roots.iter().any(|r| r == &dir) { + roots.push(dir); + } + } + roots +} + +use super::catalog::{load_fs_catalog, CatalogEntry}; + +pub fn fs_steps_path(root: &Path, id: &str) -> Option { + if let Ok(entries) = load_fs_catalog(root) { + if let Some(entry) = entries.iter().find(|e| e.id == id) { + let rel = entry_path(entry); + let path = root.join(&rel); + if path.is_file() { + return Some(path); + } + } + } + let direct = root.join(id).join("steps.yaml"); + if direct.is_file() { + return Some(direct); + } + None +} + +pub fn load_fs_steps_yaml(id: &str) -> Option { + for root in all_skill_root_paths().into_iter().rev() { + if let Some(path) = fs_steps_path(&root, id) { + if let Ok(text) = fs::read_to_string(path) { + return Some(text); + } + } + } + None +} + +fn entry_path(entry: &CatalogEntry) -> String { + if !entry.path.is_empty() { + entry.path.clone() + } else { + entry.file.clone() + } +} + +pub fn semantic_yaml_path(name: &str) -> Option { + for root in all_skill_root_paths().into_iter().rev() { + let path = root.join("semantic").join(name); + if path.is_file() { + return Some(path); + } + } + None +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn python_discovery_returns_json_when_available() { + let roots = python_discovered_roots(); + // In dev/CI with probing on PYTHONPATH this should be non-empty. + if roots.is_empty() { + return; + } + assert!(roots.iter().all(|p| p.is_dir())); + } +} diff --git a/probing/cli/src/cli/skill/interpret.rs b/probing/crates/skills/src/interpret.rs similarity index 76% rename from probing/cli/src/cli/skill/interpret.rs rename to probing/crates/skills/src/interpret.rs index 6e4cf622..27ee840b 100644 --- a/probing/cli/src/cli/skill/interpret.rs +++ b/probing/crates/skills/src/interpret.rs @@ -380,4 +380,90 @@ mod tests { let findings = evaluate_rules(&rules, &steps, &HashMap::new()); assert_eq!(findings.len(), 1); } + + #[test] + fn interpret_rules_match_fixture() { + let fixture_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../../tests/fixtures/skill_interpret_parity.yaml"); + let raw = std::fs::read_to_string(&fixture_path) + .unwrap_or_else(|e| panic!("read {}: {e}", fixture_path.display())); + let doc: serde_yaml::Value = serde_yaml::from_str(&raw).expect("parse fixture yaml"); + let cases = doc + .get("cases") + .and_then(|v| v.as_sequence()) + .expect("cases array"); + + for case in cases { + let name = case + .get("name") + .and_then(|v| v.as_str()) + .unwrap_or("unnamed"); + let rules_val = case + .get("rules") + .and_then(|v| v.as_sequence()) + .expect("rules"); + let mut rules = Vec::new(); + for r in rules_val { + rules.push(InterpretRule { + id: r.get("id").and_then(|v| v.as_str()).unwrap().into(), + when: r.get("when").and_then(|v| v.as_str()).unwrap().into(), + severity: r.get("severity").and_then(|v| v.as_str()).unwrap().into(), + message: r.get("message").and_then(|v| v.as_str()).unwrap().into(), + }); + } + + let steps_val = case + .get("steps") + .and_then(|v| v.as_sequence()) + .expect("steps"); + let mut steps = Vec::new(); + for s in steps_val { + let step_id = s + .get("step_id") + .and_then(|v| v.as_str()) + .unwrap() + .to_string(); + let row_count = s.get("row_count").and_then(|v| v.as_u64()).unwrap_or(0) as usize; + let mut df = DataFrame::default(); + if let Some(cols) = s.get("columns").and_then(|v| v.as_mapping()) { + let mut names = Vec::new(); + let mut seqs = Vec::new(); + for (col_name, col_vals) in cols { + let name = col_name.as_str().unwrap().to_string(); + let vals: Vec = col_vals + .as_sequence() + .unwrap() + .iter() + .map(|v| v.as_f64().unwrap()) + .collect(); + names.push(name); + seqs.push(Seq::SeqF64(vals)); + } + df = DataFrame::new(names, seqs); + } + steps.push(StepEvidence { + step_id, + row_count, + dataframe: df, + }); + } + + let mut params = HashMap::new(); + if let Some(p) = case.get("params").and_then(|v| v.as_mapping()) { + for (k, v) in p { + params.insert( + k.as_str().unwrap().to_string(), + v.as_str().unwrap().to_string(), + ); + } + } + + let expect_count = case + .get("expect_count") + .and_then(|v| v.as_u64()) + .expect("expect_count") as usize; + let findings = evaluate_rules(&rules, &steps, ¶ms); + assert_eq!(findings.len(), expect_count, "case {name}"); + } + } } diff --git a/probing/crates/skills/src/lib.rs b/probing/crates/skills/src/lib.rs new file mode 100644 index 00000000..496c6940 --- /dev/null +++ b/probing/crates/skills/src/lib.rs @@ -0,0 +1,27 @@ +//! Shared diagnostic skill runtime (loader, interpreter, step runner). + +pub mod api; +pub mod backend; +pub mod catalog; +pub mod discovery; +pub mod interpret; +pub mod loader; +pub mod routing; +pub mod runner; + +pub use api::{ + catalog_json, catalog_to_json, list_skills_json, load_skill_json, routing_json, skill_from_api, + skill_to_json, +}; +pub use backend::{ClusterQueryMeta, SkillBackend}; +pub use catalog::{load_catalog, load_intents, load_pages, CatalogEntry}; +pub use interpret::{evaluate_rules, InterpretFinding, StepEvidence}; +pub use loader::{ + build_context, default_parameters, derive_variables, expand_template, list_skill_ids, + load_skill, InterpretRule, KeywordsSpec, Skill, SkillParameter, SkillStep, +}; +pub use routing::match_skills; +pub use runner::{ + execute_skill, list_skills_catalog, plan_skill, resolve_use_global, run_step, RunOptions, + RunResult, StepOutcome, +}; diff --git a/probing/cli/src/cli/skill/loader.rs b/probing/crates/skills/src/loader.rs similarity index 75% rename from probing/cli/src/cli/skill/loader.rs rename to probing/crates/skills/src/loader.rs index 1dca3609..48ae8b33 100644 --- a/probing/cli/src/cli/skill/loader.rs +++ b/probing/crates/skills/src/loader.rs @@ -1,37 +1,35 @@ -//! Load diagnostic skills embedded at compile time from repo ``skills/``, -//! merged with user/project skill directories at runtime. +//! Load diagnostic skills from discovered roots (Python packages + overrides). use std::collections::HashMap; -use std::env; -use std::fs; -use std::path::{Path, PathBuf}; -use anyhow::{anyhow, Context, Result}; -use include_dir::{include_dir, Dir}; +use anyhow::{anyhow, Result}; use serde::Deserialize; -static SKILLS: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/../../skills"); -const CATALOG_YAML: &str = include_str!("../../../../../skills/catalog.yaml"); +use super::catalog; +use super::discovery; + +pub use discovery::all_skill_root_paths; + +pub use catalog::CatalogEntry; #[derive(Debug, Clone, Deserialize)] -struct CatalogFile { - #[serde(default)] - skills: Vec, +struct SkillFile { + metadata: SkillMeta, + spec: SkillSpec, } -#[derive(Debug, Clone, Deserialize)] -pub(crate) struct CatalogEntry { - pub id: String, +#[derive(Debug, Clone, Default, Deserialize, serde::Serialize)] +pub struct KeywordsSpec { #[serde(default)] - path: String, + pub zh: Vec, #[serde(default)] - file: String, + pub en: Vec, } -#[derive(Debug, Clone, Deserialize)] -struct SkillFile { - metadata: SkillMeta, - spec: SkillSpec, +#[derive(Debug, Clone, Default, Deserialize)] +struct TriggersSpec { + #[serde(default)] + keywords: KeywordsSpec, } #[derive(Debug, Clone, Deserialize)] @@ -42,6 +40,10 @@ struct SkillMeta { category: String, #[serde(default)] docs: String, + #[serde(default)] + tags: Vec, + #[serde(default)] + triggers: TriggersSpec, } #[derive(Debug, Clone, Deserialize)] @@ -56,6 +58,8 @@ struct SkillSpec { summary_template: String, #[serde(default)] next_steps: Vec, + #[serde(default)] + variables: HashMap, } #[derive(Debug, Clone, Deserialize)] @@ -136,141 +140,33 @@ pub struct Skill { pub title: String, pub category: String, pub docs: String, + pub tags: Vec, + pub keywords: Vec, + pub trigger_keywords: KeywordsSpec, pub parameters: Vec, pub steps: Vec, pub interpretation: Vec, pub summary_template: String, pub next_steps: Vec, + pub variables: HashMap, } -fn catalog_entries() -> Vec { - let mut merged: HashMap = HashMap::new(); - for entry in embedded_catalog_entries() { - merged.insert(entry.id.clone(), entry); - } - for root in fs_skill_roots() { - if let Ok(entries) = load_fs_catalog(&root) { - for entry in entries { - merged.insert(entry.id.clone(), entry); - } - } - } - let mut out: Vec = merged.into_values().collect(); - out.sort_by(|a, b| a.id.cmp(&b.id)); - out -} - -fn embedded_catalog_entries() -> Vec { - let file: CatalogFile = - serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { skills: vec![] }); - file.skills -} - -fn home_skills_dir() -> Option { - env::var_os("HOME").map(|home| PathBuf::from(home).join(".probing/skills")) -} - -fn project_skills_dir() -> Option { - let cwd = env::current_dir().ok()?; - for ancestor in cwd.ancestors() { - let candidate = ancestor.join(".probing/skills"); - if candidate.is_dir() { - return Some(candidate); - } - } - None -} - -fn env_skills_dir() -> Option { - env::var("PROBING_SKILLS_DIR") - .ok() - .map(PathBuf::from) - .filter(|p| p.is_dir()) -} - -fn fs_skill_roots() -> Vec { - let mut roots = Vec::new(); - if let Some(dir) = home_skills_dir() { - if dir.is_dir() { - roots.push(dir); - } - } - if let Some(dir) = project_skills_dir() { - if !roots.iter().any(|r| r == &dir) { - roots.push(dir); - } - } - if let Some(dir) = env_skills_dir() { - if !roots.iter().any(|r| r == &dir) { - roots.push(dir); - } - } - roots -} - -fn load_fs_catalog(root: &Path) -> Result> { - let catalog_path = root.join("catalog.yaml"); - if !catalog_path.is_file() { - return Ok(vec![]); - } - let text = fs::read_to_string(&catalog_path) - .with_context(|| format!("read {}", catalog_path.display()))?; - let file: CatalogFile = serde_yaml::from_str(&text)?; - Ok(file.skills) -} - -fn fs_steps_path(root: &Path, id: &str) -> Option { - if let Ok(entries) = load_fs_catalog(root) { - if let Some(entry) = entries.iter().find(|e| e.id == id) { - let rel = entry_path(entry); - let path = root.join(&rel); - if path.is_file() { - return Some(path); - } - } - } - let direct = root.join(id).join("steps.yaml"); - if direct.is_file() { - return Some(direct); +impl Skill { + pub fn routing_keywords_json(&self) -> KeywordsSpec { + self.trigger_keywords.clone() } - None } -fn load_fs_steps_yaml(id: &str) -> Option { - for root in fs_skill_roots().into_iter().rev() { - if let Some(path) = fs_steps_path(&root, id) { - if let Ok(text) = fs::read_to_string(path) { - return Some(text); - } - } - } - None -} - -fn entry_path(entry: &CatalogEntry) -> String { - if !entry.path.is_empty() { - entry.path.clone() - } else { - entry.file.clone() - } +fn catalog_entries() -> Vec { + catalog::load_catalog() } pub fn list_skill_ids() -> Vec { catalog_entries().into_iter().map(|e| e.id).collect() } -fn embedded_steps_yaml(id: &str) -> Option<&'static str> { - let entry = embedded_catalog_entries() - .into_iter() - .find(|e| e.id == id)?; - let rel = entry_path(&entry); - SKILLS.get_file(&rel).and_then(|f| f.contents_utf8()) -} - pub fn load_skill(id: &str) -> Result { - let yaml = load_fs_steps_yaml(id) - .or_else(|| embedded_steps_yaml(id).map(|s| s.to_string())) - .ok_or_else(|| anyhow!("Unknown skill: {id}"))?; + let yaml = discovery::load_fs_steps_yaml(id).ok_or_else(|| anyhow!("Unknown skill: {id}"))?; let file: SkillFile = serde_yaml::from_str(&yaml)?; let steps = file .spec @@ -289,19 +185,38 @@ pub fn load_skill(id: &str) -> Result { cluster: s.cluster, }) .collect(); + let keywords = collect_keywords(&file.metadata); Ok(Skill { id: file.metadata.id, title: file.metadata.title, category: file.metadata.category, docs: file.metadata.docs.trim().to_string(), + tags: file.metadata.tags, + keywords, + trigger_keywords: file.metadata.triggers.keywords, parameters: file.spec.parameters, steps, interpretation: file.spec.interpretation.rules, summary_template: file.spec.summary_template.trim().to_string(), next_steps: file.spec.next_steps, + variables: file.spec.variables, }) } +fn collect_keywords(meta: &SkillMeta) -> Vec { + let mut words: Vec = meta.tags.iter().map(|t| t.to_lowercase()).collect(); + for kw in meta + .triggers + .keywords + .zh + .iter() + .chain(meta.triggers.keywords.en.iter()) + { + words.push(kw.to_lowercase()); + } + words +} + pub fn default_parameters(pb: &Skill) -> HashMap { let mut out = HashMap::new(); for p in &pb.parameters { @@ -389,6 +304,10 @@ pub fn build_context(pb: &Skill, overrides: &HashMap) -> HashMap ctx.insert(k.clone(), v.clone()); } ctx.extend(derive_variables(&ctx)); + for (key, template) in &pb.variables { + let expanded = expand_template(template, &ctx); + ctx.insert(key.clone(), expanded); + } ctx } @@ -521,4 +440,53 @@ mod tests { assert!(!normalized.contains("{fr_table}")); assert!(!normalized.contains("{nccl_proxy_table}")); } + + #[test] + fn derive_variables_match_fixture() { + let fixture_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../../tests/fixtures/skill_derived_variables.yaml"); + let raw = std::fs::read_to_string(&fixture_path) + .unwrap_or_else(|e| panic!("read {}: {e}", fixture_path.display())); + let doc: serde_yaml::Value = serde_yaml::from_str(&raw).expect("parse fixture yaml"); + let cases = doc + .get("cases") + .and_then(|v| v.as_sequence()) + .expect("cases array"); + + for case in cases { + let name = case + .get("name") + .and_then(|v| v.as_str()) + .unwrap_or("unnamed"); + let params_val = case.get("params").expect("params"); + let mut params = HashMap::new(); + if let Some(map) = params_val.as_mapping() { + for (k, v) in map { + let key = k.as_str().expect("param key"); + let val = match v { + serde_yaml::Value::Bool(b) => b.to_string(), + serde_yaml::Value::String(s) => s.clone(), + serde_yaml::Value::Number(n) => n.to_string(), + _ => panic!("unsupported param value for {name}.{key}"), + }; + params.insert(key.to_string(), val); + } + } + let got = derive_variables(¶ms); + let expected = case + .get("expected") + .and_then(|v| v.as_mapping()) + .expect("expected map"); + for (k, v) in expected { + let key = k.as_str().expect("expected key"); + let want = v.as_str().expect("expected value"); + assert_eq!( + got.get(key).map(String::as_str), + Some(want), + "case {name}: {key}" + ); + } + assert_eq!(got.len(), expected.len(), "case {name}: extra keys"); + } + } } diff --git a/probing/crates/skills/src/routing.rs b/probing/crates/skills/src/routing.rs new file mode 100644 index 00000000..32fef9b7 --- /dev/null +++ b/probing/crates/skills/src/routing.rs @@ -0,0 +1,84 @@ +//! Skill intent / keyword routing (shared by Web agent and Python tools). + +use std::collections::HashMap; + +use super::catalog::load_catalog; +use super::loader::load_skill; + +pub fn match_skills(query: &str, limit: usize) -> Vec { + let q = query.to_lowercase(); + let mut scored: HashMap = HashMap::new(); + + for (rank, id) in match_intents(query, 10).into_iter().enumerate() { + *scored.entry(id).or_insert(0) += 3usize.saturating_mul(10 - rank); + } + + for entry in load_catalog() { + let Ok(skill) = load_skill(&entry.id) else { + continue; + }; + let kw_score = skill + .keywords + .iter() + .filter(|kw| q.contains(kw.as_str())) + .count(); + if kw_score > 0 { + *scored.entry(entry.id).or_insert(0) += kw_score; + } + } + + let mut ranked: Vec<(usize, String)> = + scored.into_iter().map(|(id, score)| (score, id)).collect(); + ranked.sort_by(|a, b| b.0.cmp(&a.0).then_with(|| a.1.cmp(&b.1))); + ranked.into_iter().take(limit).map(|(_, id)| id).collect() +} + +fn match_intents(query: &str, limit: usize) -> Vec { + let q = query.to_lowercase(); + let Ok(intents) = super::catalog::load_intents() else { + return Vec::new(); + }; + let Some(map) = intents.get("intents").and_then(|v| v.as_object()) else { + return Vec::new(); + }; + + let mut scored: Vec<(usize, String)> = Vec::new(); + for intent in map.values() { + let keywords = intent + .get("keywords") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str().map(str::to_string)) + .collect::>() + }) + .unwrap_or_default(); + let hits = keywords + .iter() + .filter(|kw| q.contains(&kw.to_lowercase())) + .count(); + if hits == 0 { + continue; + } + if let Some(ids) = intent.get("skills").and_then(|v| v.as_array()) { + for sid in ids { + if let Some(id) = sid.as_str() { + scored.push((hits, id.to_string())); + } + } + } + } + scored.sort_by(|a, b| b.0.cmp(&a.0).then_with(|| a.1.cmp(&b.1))); + + let mut seen = std::collections::HashSet::new(); + let mut out = Vec::new(); + for (_, id) in scored { + if seen.insert(id.clone()) { + out.push(id); + } + if out.len() >= limit { + break; + } + } + out +} diff --git a/probing/crates/skills/src/runner.rs b/probing/crates/skills/src/runner.rs new file mode 100644 index 00000000..f68b6025 --- /dev/null +++ b/probing/crates/skills/src/runner.rs @@ -0,0 +1,542 @@ +//! Execute skill steps via a pluggable HTTP/query backend. + +use std::collections::HashMap; +use std::fmt; + +use probing_proto::prelude::DataFrame; + +use crate::backend::{cluster_meta_note, SkillBackend}; +use crate::interpret::{evaluate_rules, InterpretFinding, StepEvidence}; +use crate::loader::{ + build_context, default_parameters, expand_template, load_skill, Skill, SkillStep, +}; + +#[derive(Debug, Clone)] +pub struct SkillRunError(pub String); + +impl fmt::Display for SkillRunError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.0) + } +} + +impl std::error::Error for SkillRunError {} + +impl From for SkillRunError { + fn from(value: anyhow::Error) -> Self { + Self(value.to_string()) + } +} + +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Default)] +pub struct RunOptions { + pub include_ui: bool, +} + +#[derive(Debug, Clone)] +pub enum StepOutcome { + Sql { + step_id: String, + title: String, + dataframe: DataFrame, + row_count: usize, + note: Option, + degraded: bool, + cluster_meta: Option, + }, + ApiText { + step_id: String, + title: String, + text: String, + }, + UiNavigate { + step_id: String, + title: String, + view: String, + }, + Skipped { + step_id: String, + title: String, + reason: String, + }, + Error { + step_id: String, + title: String, + message: String, + }, +} + +#[derive(Debug, Clone)] +pub struct RunResult { + pub skill: Skill, + pub parameters: HashMap, + pub context: HashMap, + pub outcomes: Vec, + pub findings: Vec, + pub summary: String, + pub had_error: bool, + pub had_degraded: bool, +} + +pub fn list_skills_catalog() -> Result<()> { + use crate::loader::list_skill_ids; + for id in list_skill_ids() { + let _ = load_skill(&id)?; + } + Ok(()) +} + +pub fn plan_skill(skill_id: &str, overrides: HashMap) -> Result { + let pb = load_skill(skill_id).map_err(|e| SkillRunError(e.to_string()))?; + let mut params = default_parameters(&pb); + params.extend(overrides); + let ctx = build_context(&pb, ¶ms); + let steps: Vec = pb + .steps + .iter() + .map(|step| step_plan_json(step, &ctx)) + .collect(); + Ok(serde_json::json!({ + "skill_id": pb.id, + "title": pb.title, + "parameters": params, + "steps": steps, + "next_steps": pb.next_steps, + })) +} + +fn step_plan_json(step: &SkillStep, ctx: &HashMap) -> serde_json::Value { + let mut item = serde_json::json!({ + "id": step.id, + "title": step.title, + "type": step.step_type, + "on_empty": step.on_empty, + }); + if let Some(sql) = &step.sql { + item["sql"] = serde_json::Value::String(expand_template(sql, ctx)); + } + if let Some(path) = &step.path { + item["path"] = serde_json::Value::String(expand_template(path, ctx)); + } + if let Some(when) = &step.when { + item["when"] = serde_json::Value::String(when.clone()); + } + item +} + +pub async fn resolve_use_global( + backend: &B, + pb: &Skill, + overrides: &mut HashMap, +) { + if overrides.contains_key("use_global") { + return; + } + let default = pb + .parameters + .iter() + .find(|p| p.name == "use_global") + .and_then(|p| match &p.default { + serde_yaml::Value::Bool(b) => Some(*b), + _ => None, + }) + .unwrap_or(false); + let peers = backend.peer_count().await; + let use_global = peers > 0 && default; + overrides.insert("use_global".to_string(), use_global.to_string()); +} + +pub async fn execute_skill( + backend: &B, + skill_id: &str, + mut overrides: HashMap, + options: RunOptions, +) -> Result { + let pb = load_skill(skill_id).map_err(|e| SkillRunError(e.to_string()))?; + resolve_use_global(backend, &pb, &mut overrides).await; + let ctx = build_context(&pb, &overrides); + let mut outcomes = Vec::new(); + let mut evidence = Vec::new(); + let mut abort = false; + + for step in &pb.steps { + if abort { + break; + } + let outcome = run_step(backend, step, &ctx, &options).await; + if let Some(ev) = outcome_to_evidence(&outcome) { + evidence.push(ev); + } + if matches!( + &outcome, + StepOutcome::Error { .. } if step.on_empty == "abort" + ) { + abort = true; + } + outcomes.push(outcome); + } + + let mut findings = evaluate_rules(&pb.interpretation, &evidence, &ctx); + findings.extend(cluster_integrity_findings(&outcomes)); + + let mut summary_ctx = ctx.clone(); + for ev in &evidence { + summary_ctx.insert( + format!("{}.row_count", ev.step_id), + ev.row_count.to_string(), + ); + } + let summary = if pb.summary_template.is_empty() { + String::new() + } else { + expand_template(&pb.summary_template, &summary_ctx) + }; + + let had_error = outcomes + .iter() + .any(|o| matches!(o, StepOutcome::Error { .. })); + let had_degraded = outcomes.iter().any(|o| match o { + StepOutcome::Sql { degraded, .. } => *degraded, + _ => false, + }); + + Ok(RunResult { + skill: pb, + parameters: overrides, + context: ctx, + outcomes, + findings, + summary, + had_error, + had_degraded, + }) +} + +pub async fn run_step( + backend: &B, + step: &SkillStep, + ctx: &HashMap, + options: &RunOptions, +) -> StepOutcome { + if let Some(reason) = should_skip_step(step, ctx) { + return StepOutcome::Skipped { + step_id: step.id.clone(), + title: step.title.clone(), + reason, + }; + } + match step.step_type.as_str() { + "sql" => { + let Some(sql_tpl) = &step.sql else { + return StepOutcome::Error { + step_id: step.id.clone(), + title: step.title.clone(), + message: "SQL step missing query".to_string(), + }; + }; + let sql = expand_template(sql_tpl, ctx); + run_sql_step(backend, step, &sql).await + } + "api" => run_api_step(backend, step).await, + "ui" if options.include_ui => StepOutcome::UiNavigate { + step_id: step.id.clone(), + title: step.title.clone(), + view: step.view.clone().unwrap_or_else(|| "analytics".to_string()), + }, + "ui" => StepOutcome::Skipped { + step_id: step.id.clone(), + title: step.title.clone(), + reason: format!( + "ui step (view={}) — run probing Web UI for navigation", + step.view.as_deref().unwrap_or("?") + ), + }, + "config" => StepOutcome::Skipped { + step_id: step.id.clone(), + title: step.title.clone(), + reason: "config steps are not applied automatically in CLI skill".to_string(), + }, + other => StepOutcome::Skipped { + step_id: step.id.clone(), + title: step.title.clone(), + reason: format!("unsupported step type: {other}"), + }, + } +} + +fn should_skip_step(step: &SkillStep, ctx: &HashMap) -> Option { + let Some(when) = &step.when else { + return None; + }; + let w = when.trim(); + if w == "always" { + return None; + } + if w == "{use_global}" || w.contains("use_global") { + let use_global = ctx.get("use_global").map(|v| v == "true").unwrap_or(false); + if !use_global { + return Some("skipped (standalone / use_global=false)".to_string()); + } + } + None +} + +fn sql_needs_cluster(sql: &str, step_cluster: bool) -> bool { + step_cluster || sql.to_lowercase().contains("global.") +} + +fn ensure_read_only_sql(sql: &str) -> Result<()> { + let upper = sql.trim().to_uppercase(); + if upper.starts_with("SELECT") + || upper.starts_with("WITH") + || upper.starts_with("SHOW") + || upper.starts_with("DESCRIBE") + { + return Ok(()); + } + Err(SkillRunError( + "Only read-only SQL is allowed in skills".to_string(), + )) +} + +fn dataframe_rows(df: &DataFrame) -> usize { + df.cols.iter().map(|c| c.len()).max().unwrap_or(0) +} + +async fn run_sql_step(backend: &B, step: &SkillStep, sql: &str) -> StepOutcome { + if let Err(e) = ensure_read_only_sql(sql) { + return StepOutcome::Error { + step_id: step.id.clone(), + title: step.title.clone(), + message: e.0, + }; + } + let cluster = sql_needs_cluster(sql, step.cluster.unwrap_or(false)); + let result = if cluster { + backend.cluster_query(sql).await.map(|(df, meta)| { + let note = meta.as_ref().map(cluster_meta_note); + (df, note, meta) + }) + } else { + backend.query_local(sql).await.map(|df| (df, None, None)) + }; + + match result { + Ok((df, note, cluster_meta)) => { + let degraded = cluster_meta.as_ref().is_some_and(|m| m.partial); + let rows = dataframe_rows(&df); + if rows == 0 { + match step.on_empty.as_str() { + "abort" => StepOutcome::Error { + step_id: step.id.clone(), + title: step.title.clone(), + message: step + .empty_message + .clone() + .unwrap_or_else(|| "Query returned no rows".to_string()), + }, + "warn" => StepOutcome::Sql { + step_id: step.id.clone(), + title: step.title.clone(), + dataframe: df, + row_count: 0, + note, + degraded, + cluster_meta, + }, + _ => StepOutcome::Skipped { + step_id: step.id.clone(), + title: step.title.clone(), + reason: step + .empty_message + .clone() + .unwrap_or_else(|| "No data".to_string()), + }, + } + } else { + StepOutcome::Sql { + step_id: step.id.clone(), + title: step.title.clone(), + dataframe: df, + row_count: rows, + note, + degraded, + cluster_meta, + } + } + } + Err(e) => { + if step.on_empty == "skip" { + StepOutcome::Skipped { + step_id: step.id.clone(), + title: step.title.clone(), + reason: e.0, + } + } else { + StepOutcome::Error { + step_id: step.id.clone(), + title: step.title.clone(), + message: e.0, + } + } + } + } +} + +async fn run_api_step(backend: &B, step: &SkillStep) -> StepOutcome { + let path = step.path.clone().unwrap_or_default(); + match backend.get(&path).await { + Ok(body) => StepOutcome::ApiText { + step_id: step.id.clone(), + title: step.title.clone(), + text: body, + }, + Err(e) => StepOutcome::Error { + step_id: step.id.clone(), + title: step.title.clone(), + message: e.0, + }, + } +} + +fn outcome_to_evidence(outcome: &StepOutcome) -> Option { + match outcome { + StepOutcome::Sql { + step_id, + dataframe, + row_count, + .. + } => Some(StepEvidence { + step_id: step_id.clone(), + row_count: *row_count, + dataframe: dataframe.clone(), + }), + _ => None, + } +} + +fn cluster_integrity_findings(outcomes: &[StepOutcome]) -> Vec { + let mut findings = Vec::new(); + for outcome in outcomes { + let StepOutcome::Sql { + step_id, + cluster_meta: Some(meta), + .. + } = outcome + else { + continue; + }; + if !meta.partial { + continue; + } + findings.push(InterpretFinding { + rule_id: format!("{step_id}_partial_fanout"), + severity: "error".to_string(), + message: format!( + "Cluster fan-out incomplete for step '{step_id}': {} nodes queried, {} failed, {} peer batches dropped — do not treat results as complete", + meta.nodes_queried, + meta.nodes_failed.len(), + meta.peer_batches_dropped, + ), + }); + } + findings +} + +pub fn outcome_to_json(outcome: &StepOutcome) -> serde_json::Value { + match outcome { + StepOutcome::Sql { + step_id, + title, + dataframe, + row_count, + note, + degraded, + cluster_meta, + } => serde_json::json!({ + "step_id": step_id, + "title": title, + "status": if *degraded { "degraded" } else { "ok" }, + "row_count": row_count, + "note": note, + "cluster_meta": cluster_meta, + "dataframe": dataframe, + }), + StepOutcome::ApiText { + step_id, + title, + text, + } => serde_json::json!({ + "step_id": step_id, + "title": title, + "status": "ok", + "text": text, + }), + StepOutcome::UiNavigate { + step_id, + title, + view, + } => serde_json::json!({ + "step_id": step_id, + "title": title, + "status": "ui", + "view": view, + }), + StepOutcome::Skipped { + step_id, + title, + reason, + } => serde_json::json!({ + "step_id": step_id, + "title": title, + "status": "skipped", + "reason": reason, + }), + StepOutcome::Error { + step_id, + title, + message, + } => serde_json::json!({ + "step_id": step_id, + "title": title, + "status": "error", + "message": message, + }), + } +} + +pub fn run_result_to_json(result: &RunResult) -> serde_json::Value { + let steps_out: Vec = result.outcomes.iter().map(outcome_to_json).collect(); + let findings_json: Vec = result + .findings + .iter() + .map(|f| { + serde_json::json!({ + "rule_id": f.rule_id, + "severity": f.severity, + "message": f.message, + }) + }) + .collect(); + serde_json::json!({ + "skill_id": result.skill.id, + "title": result.skill.title, + "parameters": result.parameters, + "steps": steps_out, + "findings": findings_json, + "summary": result.summary, + "next_steps": result.skill.next_steps, + "status": if result.had_error { + "error" + } else if result.had_degraded { + "degraded" + } else { + "ok" + }, + "data_quality": { + "partial_cluster_fanout": result.had_degraded, + }, + }) +} diff --git a/probing/extensions/python/Cargo.toml b/probing/extensions/python/Cargo.toml index 77df8c27..b0c28831 100644 --- a/probing/extensions/python/Cargo.toml +++ b/probing/extensions/python/Cargo.toml @@ -18,6 +18,7 @@ probing-memtable = { path = "../../memtable" } probing-proto = { path = "../../proto" } probing-store = { path = "../../crates/store" } probing-cli = { path = "../../cli" } +probing-skills = { path = "../../crates/skills" } anyhow = { workspace = true } thiserror = { workspace = true } diff --git a/probing/extensions/python/src/features/mod.rs b/probing/extensions/python/src/features/mod.rs index 6d6db424..097e6397 100644 --- a/probing/extensions/python/src/features/mod.rs +++ b/probing/extensions/python/src/features/mod.rs @@ -7,6 +7,7 @@ pub mod native_bridge; pub mod pprof; pub mod py_result; pub mod python_api; +pub mod skills_api; pub mod spy; /// Native stack capture, Python/native merge, and signal handling (`SIGUSR2`). pub mod stack_tracer; diff --git a/probing/extensions/python/src/features/skills_api.rs b/probing/extensions/python/src/features/skills_api.rs new file mode 100644 index 00000000..43c4dc45 --- /dev/null +++ b/probing/extensions/python/src/features/skills_api.rs @@ -0,0 +1,77 @@ +//! Python-facing skill discovery APIs (``probing._core.skills_*``). + +use pyo3::exceptions::PyRuntimeError; +use pyo3::prelude::*; + +use probing_skills::api; +use probing_skills::catalog::{load_intents, load_pages}; +use probing_skills::routing::match_skills; +use probing_skills::runner::plan_skill; + +use crate::features::py_result::runtime_err; + +#[pyfunction] +pub fn skills_intents() -> PyResult { + let value = load_intents().map_err(|e| PyRuntimeError::new_err(e.to_string()))?; + serde_json::to_string(&value).map_err(runtime_err) +} + +#[pyfunction] +pub fn skills_pages() -> PyResult { + let value = load_pages().map_err(|e| PyRuntimeError::new_err(e.to_string()))?; + serde_json::to_string(&value).map_err(runtime_err) +} + +#[pyfunction] +pub fn skills_load(id: &str) -> PyResult { + api::load_skill_json(id).map_err(|e| PyRuntimeError::new_err(e.to_string())) +} + +#[pyfunction] +pub fn skills_catalog() -> PyResult { + api::catalog_json().map_err(|e| PyRuntimeError::new_err(e.to_string())) +} + +#[pyfunction] +pub fn skills_routing() -> PyResult { + api::routing_json().map_err(|e| PyRuntimeError::new_err(e.to_string())) +} + +#[pyfunction] +#[pyo3(signature = (query=None, limit=20))] +pub fn skills_list(query: Option<&str>, limit: usize) -> PyResult { + api::list_skills_json(query, limit).map_err(|e| PyRuntimeError::new_err(e.to_string())) +} + +#[pyfunction] +#[pyo3(signature = (skill_id, params_json=None))] +pub fn skills_plan(skill_id: &str, params_json: Option<&str>) -> PyResult { + let mut overrides = std::collections::HashMap::new(); + if let Some(raw) = params_json.filter(|s| !s.trim().is_empty()) { + let parsed: serde_json::Value = + serde_json::from_str(raw).map_err(|e| PyRuntimeError::new_err(e.to_string()))?; + if let Some(map) = parsed.as_object() { + for (k, v) in map { + overrides.insert(k.clone(), json_scalar_to_string(v)); + } + } + } + let plan = plan_skill(skill_id, overrides).map_err(|e| PyRuntimeError::new_err(e.0))?; + serde_json::to_string_pretty(&plan).map_err(runtime_err) +} + +#[pyfunction] +#[pyo3(signature = (query, limit=3))] +pub fn skills_match(query: &str, limit: usize) -> PyResult { + let ids = match_skills(query, limit); + serde_json::to_string(&ids).map_err(runtime_err) +} + +fn json_scalar_to_string(value: &serde_json::Value) -> String { + match value { + serde_json::Value::Bool(b) => b.to_string(), + serde_json::Value::Number(n) => n.to_string(), + serde_json::Value::String(s) => s.clone(), + other => other.to_string(), + } +} diff --git a/probing/server/API.md b/probing/server/API.md index d97c50d8..b73129d9 100644 --- a/probing/server/API.md +++ b/probing/server/API.md @@ -67,8 +67,18 @@ All handlers live in `python/probing/handlers/pythonext.py`, one canonical local | GET | `/apis/pythonext/ray/timeline` | `ray/timeline` | | GET | `/apis/pythonext/ray/timeline/chrome` | `ray/timeline/chrome` | | GET | `/apis/pythonext/magics` | `magics` | +| GET | `/apis/pythonext/skills/list` | `skills/list` — merged catalog | +| GET | `/apis/pythonext/skills/load?id=` | `skills/load` — one skill JSON | +| GET | `/apis/pythonext/skills/catalog` | `skills/catalog` | +| GET | `/apis/pythonext/skills/routing` | `skills/routing` — catalog + intents + pages | +| GET | `/apis/pythonext/skills/roots` | `skills/roots` — discovered skill directories | +| GET | `/apis/pythonext/extensions/list` | `extensions/list` — installed `probing-` packages | | GET | `/apis/pythonext/flight-recorder/snapshot?include_stack_traces=&only_active=&persist=` | `flight-recorder/snapshot` | +Skill HTTP endpoints above are **discovery only** (catalog, routing, load JSON). Execution +uses the Rust `probing-skills` runner: CLI `probing skill run`, MCP `run_skill` / +`plan_skill`, or Web Investigate Agent (WASM). + Rust-backed endpoints (`callstack`, `eval`) are thin `@ext_handler` wrappers around `probing._core.api_callstack` / `api_eval`. ## Other extensions @@ -101,9 +111,9 @@ When built with the `rmcp` feature (default in the PyPI wheel), the server expos |------|---------| | `query` | Read-only SQL against the in-process engine (`limit` caps rows) | | `describe_tables` | Semantic docs from `probe.probing.table_docs` / `column_docs` | -| `list_skills` | List bundled diagnostic skills | -| `plan_skill` | Expand a skill into SQL/API steps without executing | -| `run_skill` | Execute a diagnostic skill (local process; optional `use_global`) | +| `list_skills` | List diagnostic skills (bundled + entry-point extensions) | +| `plan_skill` | Expand a skill into SQL/API steps (Rust in-process) | +| `run_skill` | Execute a diagnostic skill (Rust in-process) | | `list_cluster_nodes` | `GET /apis/nodes` — registered cluster members | | `cluster_query` | Read-only SQL with optional cluster fan-out (`cluster` default `true`) | diff --git a/probing/server/src/mcp/mod.rs b/probing/server/src/mcp/mod.rs index a404d443..ac00f98a 100644 --- a/probing/server/src/mcp/mod.rs +++ b/probing/server/src/mcp/mod.rs @@ -9,10 +9,7 @@ use std::collections::HashMap; use std::sync::Arc; use axum::Router; -use probing_cli::cli::skill::{ - build_context, default_parameters, expand_template, list_skill_ids, load_skill, run_skill_json, - SkillStep, -}; +use probing_cli::cli::skill::{list_skill_ids, load_skill, plan_skill, run_skill_json}; use probing_proto::prelude::{Query, QueryDataFormat}; use rmcp::handler::server::router::tool::ToolRouter; use rmcp::handler::server::wrapper::Parameters; @@ -213,27 +210,12 @@ impl ProbingMcp { } #[tool(description = "Expand a diagnostic skill into SQL/API steps without executing them.")] - fn plan_skill( + async fn plan_skill( &self, Parameters(PlanSkillArgs { skill_id, params }): Parameters, ) -> Result { - let skill = load_skill(&skill_id).map_err(|e| tool_error(e.to_string()))?; - let mut merged = default_parameters(&skill); - merged.extend(params); - let ctx = build_context(&skill, &merged); - let steps: Vec = skill - .steps - .iter() - .map(|step| step_to_plan_json(step, &ctx)) - .collect(); - let payload = serde_json::json!({ - "skill_id": skill.id, - "title": skill.title, - "parameters": merged, - "steps": steps, - "next_steps": skill.next_steps, - }); - Ok(text_result(payload.to_string())) + let value = plan_skill(&skill_id, params).map_err(|e| tool_error(e.0))?; + Ok(text_result(value.to_string())) } #[tool(description = "Run a diagnostic skill against the local probing process.")] @@ -248,7 +230,8 @@ impl ProbingMcp { if let Some(global) = use_global { params.insert("use_global".to_string(), global.to_string()); } - match run_skill_json(local_ctrl(), &skill_id, params).await { + let ctrl = local_ctrl(); + match run_skill_json(ctrl, &skill_id, params).await { Ok(value) => Ok(text_result(value.to_string())), Err(err) => Err(tool_error(err.to_string())), } @@ -534,25 +517,6 @@ fn cell_as_str(ele: &probing_proto::prelude::Ele) -> String { } } -fn step_to_plan_json(step: &SkillStep, ctx: &HashMap) -> serde_json::Value { - let mut value = serde_json::json!({ - "id": step.id, - "title": step.title, - "type": step.step_type, - "on_empty": step.on_empty, - }); - if let Some(sql) = &step.sql { - value["sql"] = serde_json::Value::String(expand_template(sql, ctx)); - } - if let Some(path) = &step.path { - value["path"] = serde_json::Value::String(path.clone()); - } - if let Some(when) = &step.when { - value["when"] = serde_json::Value::String(when.clone()); - } - value -} - fn text_result(text: String) -> CallToolResult { CallToolResult::success(vec![Content::text(text)]) } diff --git a/pyproject.toml b/pyproject.toml index 305eb063..ec7f30d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,15 @@ Issues = "https://github.com/reiase/probing/issues" [project.scripts] probing = "probing.cli.__main__:main" +[project.entry-points."probing.skills"] +bundled = "probing.extensions:skill_root_bundled" +# Vendor packages: probing-, same slug in skills + magics groups, e.g.: +# nvidia = "probing_nvidia:skill_root" + +[project.entry-points."probing.magics"] +# Vendor Magics subclass, e.g.: +# nvidia = "probing_nvidia.magics:NvidiaMagic" + [project.optional-dependencies] otel = [ "opentelemetry-api>=1.20", diff --git a/python/probing/bundled_skills/README.md b/python/probing/bundled_skills/README.md index eb2e2736..fd469d15 100644 --- a/python/probing/bundled_skills/README.md +++ b/python/probing/bundled_skills/README.md @@ -1,22 +1,24 @@ # Diagnostic skills (authoring) -**This is the source of truth for skill *data*.** Edit here — not under `python/probing/`. +**Skill data lives here** (`python/probing/bundled_skills/`). Repo-root [`skills/`](../../../skills) +is a symlink to this directory for authoring ergonomics (`./skills/install.sh`, docs, L4 layout). Each skill is a folder with **`SKILL.md`** (when/how, for agents) and optional **`steps.yaml`** (deterministic steps for `probing skill run` and the Web Investigate agent). -## Other skill-related paths +## Related paths | Path | What it is | |------|------------| -| **`skills/`** (here) | Authoring + `./install.sh` source; also embedded in Web/Rust via `include_str!` | -| **`python/probing/skills/`** | Python **code** — loader, install, CLI helpers (`probing.skills.*`) | -| **`python/probing/_skills/`** | **Wheel bundle** — generated by `make wheel` | +| **`python/probing/bundled_skills/`** (here) | SSOT — packaged in wheel via maturin `include` | +| **`skills/`** (repo root) | Symlink → here | +| **`python/probing/skills/`** | Python **code** — loader, discovery, install (`probing.skills.*`) | +| **`examples/probing-acme/`** | Vendor extension template (`probing-` entry points) | ## Layout ``` -skills/ +python/probing/bundled_skills/ ├── catalog.yaml # index (id, category, path) ├── semantic/ # intents, pages, table semantics (routing) ├── install.sh # copy into .cursor/.claude/.agents skill dirs @@ -50,7 +52,7 @@ Validate after edits: ```bash python -m probing.skills validate -make wheel # refresh wheel bundle when cutting a release +make wheel # bundle web UI; skills ship from this directory ``` ## Add a skill @@ -61,4 +63,4 @@ make wheel # refresh wheel bundle when cutting a release 4. `python -m probing.skills validate` 5. `./skills/install.sh` — refresh agent directories -See [AGENTS.md](../AGENTS.md) and [docs/src/design/extensibility.md](../docs/src/design/extensibility.md). +See [AGENTS.md](../../../AGENTS.md), [docs/src/design/extensibility.md](../../../docs/src/design/extensibility.md), and vendor template [examples/probing-acme/](../../../examples/probing-acme/). diff --git a/python/probing/bundled_skills/catalog.yaml b/python/probing/bundled_skills/catalog.yaml index 0791cae6..875e8932 100644 --- a/python/probing/bundled_skills/catalog.yaml +++ b/python/probing/bundled_skills/catalog.yaml @@ -17,6 +17,9 @@ categories: memory: label: 内存 / Memory description: GPU/VRAM pressure and leaks. + sre: + label: SRE / Runbook + description: On-call workflows that automate manual training triage. skills: - id: health_overview category: triage @@ -199,3 +202,49 @@ skills: - slow_rank - comm_bottleneck path: nccl_culprit_victim/steps.yaml +- id: watchdog_timeout + category: distributed + priority: 8 + description: NCCL watchdog timeout diagnosis with PyTorch Flight Recorder sequence alignment + tables: + - python.torch_nccl_flight_record + - python.torch_nccl_pg_status + - global.python.torch_nccl_flight_record + pages: + - training + - cluster + - analytics + - agent + related: + - training_hang + - comm_bottleneck + - nccl_culprit_victim + path: watchdog_timeout/steps.yaml +- id: sre_triage + category: sre + priority: 9 + entry: true + description: SRE first-response triage for distributed training incidents + tables: + - cluster.nodes + - cpu.utilization + - gpu.utilization + - python.comm_collective + - python.torch_nccl_flight_record + - nccl.proxy_ops + - rdma.mlx_hca + - process.kmsg + pages: + - dashboard + - training + - cluster + - agent + related: + - health_overview + - job_health + - training_hang + - watchdog_timeout + - comm_bottleneck + - nccl_culprit_victim + - gpu_pressure + path: sre_triage/steps.yaml diff --git a/python/probing/bundled_skills/health_overview/steps.yaml b/python/probing/bundled_skills/health_overview/steps.yaml index ad01b085..f413e492 100644 --- a/python/probing/bundled_skills/health_overview/steps.yaml +++ b/python/probing/bundled_skills/health_overview/steps.yaml @@ -76,6 +76,26 @@ spec: on_empty: skip empty_message: "单进程模式或未注册 cluster 节点" + - id: nccl_data_integrity + title: "NCCL profiler 数据完整性" + type: sql + sql: | + SELECT + ts, + rank, + pool_exhausted, + write_errors, + ring_rows_overwritten, + coll_live, + coll_cap, + proxy_live, + proxy_cap + FROM nccl.profiler_counters + ORDER BY ts DESC + LIMIT 1 + on_empty: skip + empty_message: "nccl.profiler_counters 无数据 — NCCL profiler 未启用" + interpretation: rules: - id: no_tables @@ -83,6 +103,21 @@ spec: severity: error message: "没有可查询表 — probing 可能未正确注入" + - id: nccl_pool_exhausted + when: "step:nccl_data_integrity | column:pool_exhausted | value > 0" + severity: error + message: "NCCL slot pool 曾耗尽 — 通信指标可能不完整" + + - id: nccl_write_errors + when: "step:nccl_data_integrity | column:write_errors | value > 0" + severity: error + message: "NCCL memtable 写入失败 — 部分事件可能丢失" + + - id: nccl_ring_overwrite + when: "step:nccl_data_integrity | column:ring_rows_overwritten | value > 0" + severity: warning + message: "NCCL mmap ring 曾覆写旧行 — 历史窗口可能不完整" + - id: high_gpu_mem when: "step:gpu_mem | column:mem_used_pct | max > 90" severity: warning @@ -98,8 +133,10 @@ spec: - 可用表: {available_tables.row_count} 张 - 最新训练 step: {latest_torch_step.latest_step} - 集群节点: {cluster_nodes.row_count} 个(0 表示单机) + - NCCL 完整性: 见 nccl_data_integrity(pool_exhausted / ring 覆写) 若某项为空,按 empty_message 提示开启对应采集。 + cluster 查询若标记 PARTIAL/DEGRADED,不得当作完整诊断依据。 next_steps: - "多机训练 job 级诊断 → skill: job_health --global" diff --git a/python/probing/bundled_skills/semantic/intents.yaml b/python/probing/bundled_skills/semantic/intents.yaml index fb01be3d..91cf6c7e 100644 --- a/python/probing/bundled_skills/semantic/intents.yaml +++ b/python/probing/bundled_skills/semantic/intents.yaml @@ -5,8 +5,13 @@ kind: IntentCatalog intents: health_check: label: "健康检查 / 不知道从哪查" - keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup, job health, 作业健康] - skills: [health_overview, job_health] + keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup, job health, 作业健康, SRE, 值班] + skills: [sre_triage, health_overview, job_health] + + sre_oncall: + label: "SRE 值班 / 事故第一响应" + keywords: [SRE, 值班, oncall, runbook, 应急, 事故, incident, triage, 第一响应, 排查流程] + skills: [sre_triage, health_overview, job_health, training_hang, watchdog_timeout] job_slowdown: label: "整 job 变慢 / slowdown" @@ -20,8 +25,8 @@ intents: training_hung: label: "训练卡住 / 无进展" - keywords: [卡住, hang, stall, 不动, deadlock, 死锁, frozen, stuck, loss 不更新] - skills: [training_hang, slow_rank] + keywords: [卡住, hang, stall, 不动, deadlock, 死锁, frozen, stuck, loss 不更新, watchdog timeout] + skills: [sre_triage, training_hang, watchdog_timeout, slow_rank] training_slow: label: "训练变慢 / 瓶颈" @@ -40,15 +45,15 @@ intents: comm_slow: label: "通信慢 / NCCL" - keywords: [通信慢, NCCL, all_reduce, 通信瓶颈, collective, 带宽, culprit, victim, recv_wait, gpu_wait] - skills: [comm_bottleneck, nccl_culprit_victim, slow_rank] + keywords: [通信慢, NCCL, all_reduce, 通信瓶颈, collective, 带宽, culprit, victim, recv_wait, gpu_wait, watchdog] + skills: [sre_triage, comm_bottleneck, watchdog_timeout, nccl_culprit_victim, slow_rank] nccl_wait: label: "NCCL wait 分解 / culprit victim" - keywords: [罪魁祸首, 受害者, send_gpu_wait, recv_wait, proxy wait, NCCL 等待, gpu wait] - skills: [nccl_culprit_victim, slow_rank] + keywords: [罪魁祸首, 受害者, send_gpu_wait, recv_wait, proxy wait, NCCL 等待, gpu wait, flight recorder, desync] + skills: [watchdog_timeout, nccl_culprit_victim, slow_rank] cluster_view: label: "集群 / 多机训练" keywords: [集群, 多机, 分布式, cluster, multi-node, 跨节点, 所有 rank, all ranks, fan-out] - skills: [job_health, slow_rank, persistent_straggler, comm_bottleneck, health_overview] + skills: [sre_triage, job_health, slow_rank, persistent_straggler, comm_bottleneck, health_overview] diff --git a/python/probing/bundled_skills/semantic/tables.yaml b/python/probing/bundled_skills/semantic/tables.yaml deleted file mode 100644 index 6df6f262..00000000 --- a/python/probing/bundled_skills/semantic/tables.yaml +++ /dev/null @@ -1,473 +0,0 @@ -# Semantic layer: maps user/agent language to probing SQL tables and columns. -# Used in system prompts, skill prerequisite checks, and Engine DESCRIBE rewrite -# (probe.probing.table_docs / column_docs). -apiVersion: probing.dev/v1 -kind: SemanticCatalog - -tables: - python.torch_trace: - description: "PyTorch 模块级 forward/step hook 耗时与 GPU 显存快照(长驻采样,非 torch.profiler 窗口)" - synonyms: [torch trace, module timing, 模块耗时, 训练步 profiling] - key_columns: - micro_step: "最细粒度步计数(micro-batch 序号)" - local_step: "本 rank 训练步(micro_step // micro_batches)" - global_step: "全局训练步(各 rank 对齐时与 local_step 相同)" - micro_batches: "梯度累积因子" - seq: "本 step 内 hook 序号" - rank: "torch.distributed rank(-1 未知)" - world_size: "world size(-1 未知)" - role: "并行角色键,如 dp=2,pp=1,tp=0" - module: "模块全限定名" - stage: "pre forward | post forward | pre step | post step" - time_offset: "相对本 step 时间锚点的秒偏移" - duration: "hook 耗时(秒);post 行有意义" - allocated: "当前 GPU 已分配显存(MB)" - allocated_delta: "相对上一 hook 的 allocated 变化(MB)" - max_allocated: "峰值已分配显存(MB)" - max_allocated_delta: "相对上一 hook 的 max_allocated 变化(MB)" - cached: "当前 GPU reserved 显存(MB)" - max_cached: "峰值 reserved 显存(MB)" - notes: - - "第一个完整 step 为 discovery-only,可能无数据行" - - "默认仅 forward hook;backward hook 默认关闭" - - python.comm_collective: - description: "torch.distributed API 层集合通信记录(Python 墙钟计时,粗粒度回退;精准 NCCL 数据在 nccl.* 表)" - synonyms: [collective, communication, 通信, all_reduce, torch.distributed] - key_columns: - micro_step: "最细粒度步计数" - local_step: "本 rank 训练步" - global_step: "全局训练步" - micro_batches: "梯度累积因子" - rank: "torch.distributed rank" - world_size: "world size" - role: "并行角色键" - op: "集合通信算子名" - group_rank: "进程组内 rank" - group_size: "进程组大小" - participate_ranks: "参与 rank 列表(JSON 数组字符串)" - tensor_shape: "张量 shape 字符串" - tensor_dtype: "张量 dtype" - bytes: "通信字节数" - duration_ms: "Python API 调用墙钟耗时(毫秒)— launch 层计时,非 NCCL 执行时间" - async_op: "1=异步 collective,0=同步" - global_name: global.python.comm_collective - federation_columns: [_host, _addr, _rank, _role] - notes: - - "来源:torch.distributed monkey-patch(Torch API 层),NCCL profiler 插件启用时默认关闭" - - "查执行时间/带宽/等待分解请用 nccl.coll_perf / nccl.proxy_ops(NCCL 原生事件)" - - "本表独有训练步上下文(global_step 等),可与 nccl.* 按时间窗对齐" - - python.torch_nccl_flight_record: - description: "PyTorch Flight Recorder collective 环形缓冲快照(NCCL watchdog timeout / desync 诊断)" - synonyms: [Flight Recorder, NCCL watchdog, collective desync, watchdog timeout, 反同步] - key_columns: - snapshot_id: "probing 触发 snapshot 的时间戳(纳秒)" - rank: "torch.distributed rank" - world_size: "world size" - record_id: "PyTorch Flight Recorder 记录 id" - pg_id: "ProcessGroup id" - pg_name: "ProcessGroup 名称" - pg_desc: "ProcessGroup 描述" - collective_seq_id: "进程组内 collective 序号" - p2p_seq_id: "P2P 序号" - op_id: "PyTorch op id" - profiling_name: "collective 名称,如 nccl:all_reduce" - state: "collective 状态,如 scheduled/started/completed" - input_sizes: "输入 tensor size JSON" - input_dtypes: "输入 dtype JSON" - output_sizes: "输出 tensor size JSON" - output_dtypes: "输出 dtype JSON" - time_created_ns: "记录创建时间" - time_discovered_started_ns: "发现 started 的时间" - time_discovered_completed_ns: "发现 completed 的时间" - duration_ns: "collective duration(若 PyTorch 提供)" - timeout_ms: "watchdog timeout 配置" - retired: "1=已从活跃集合退休" - is_p2p: "1=P2P op" - frames: "调用栈 JSON" - top_frame: "调用栈代表帧" - global_name: global.python.torch_nccl_flight_record - federation_columns: [_host, _addr, _rank, _role] - notes: - - "由 /apis/pythonext/flight-recorder/snapshot 触发写入" - - "需要 PyTorch >= 2.5 的 torch._C._distributed_c10d._dump_nccl_trace" - - python.torch_nccl_pg_status: - description: "PyTorch Flight Recorder ProcessGroup 状态快照" - synonyms: [Flight Recorder PG, process group status, NCCL PG] - key_columns: - snapshot_id: "probing 触发 snapshot 的时间戳(纳秒)" - rank: "torch.distributed rank" - world_size: "world size" - pg_id: "ProcessGroup id" - pg_name: "ProcessGroup 名称" - pg_desc: "ProcessGroup 描述" - ranks: "ProcessGroup 成员 rank 字符串" - last_enqueued_collective: "最后入队 collective seq" - last_started_collective: "最后 started collective seq" - last_completed_collective: "最后 completed collective seq" - global_name: global.python.torch_nccl_pg_status - federation_columns: [_host, _addr, _rank, _role] - - python.trace_event: - description: "分布式 tracing:span 起止与自定义 event(python.tracing)" - synonyms: [trace, span, timeline, 链路] - key_columns: - record_type: "span_start | span_end | event" - trace_id: "同一 trace 内共享的 trace id" - span_id: "span 唯一 id" - parent_id: "父 span id(-1 表示无)" - name: "span 或 event 名称" - phase: "训练阶段:forward | backward | optimizer(可为空)" - time: "时间戳(纳秒,epoch)" - thread_id: "记录线程 id" - location: "源码位置(file:line)" - attributes: "JSON 元数据(rank、local_step 等)" - event_attributes: "event 专用 JSON 属性" - notes: - - "与 span_end 按 span_id join 可算 duration" - - "物化视图见 python.tracing.table.SPANS_SQL" - - python.backtrace: - description: "混合 Python + native 调用栈快照(即时采集,非历史表)" - synonyms: [stack, backtrace, 调用栈, hang stack] - key_columns: - ip: "native 帧指令指针(Python 帧为 NULL)" - file: "源文件路径" - func: "函数/符号名" - lineno: "行号" - depth: "栈深度(0=最内层)" - frame_type: "Python | Native | Rust" - notes: - - "通过 probing backtrace 或 inject 后 SELECT 填充" - - python.variables: - description: "TorchProbe 变量追踪快照(需启用 vars/watch)" - synonyms: [variable trace, watch, 变量快照] - key_columns: - micro_step: "训练 micro-step" - func: "函数名" - name: "变量名" - value: "变量值的字符串表示" - notes: - - "与 python.trace_variables 不同;后者记录调试器 watch 变更" - - python.trace_variables: - description: "调试器 watch 触发的变量变更记录" - synonyms: [trace variables, watch changes, 变量变更] - key_columns: - function_name: "发生变更的函数名" - filename: "源文件" - lineno: "行号" - variable_name: "变量名" - value: "变更后的值(字符串)" - value_type: "值类型名" - - cpu.utilization: - description: "主机 CPU / RSS 周期采样(进程级 + Top-N 线程)" - synonyms: [cpu, host memory, RSS, 主机 CPU] - key_columns: - ts: "采样时间戳(微秒 since epoch)" - scope: "process | thread" - platform: "采样后端(linux | macos)" - tid: "线程 id(process scope 时为 0)" - comm: "进程/线程名" - wall_ns: "距上次采样的墙钟间隔(纳秒)" - delta_user_ns: "用户态 CPU 增量(纳秒)" - delta_sys_ns: "内核态 CPU 增量(纳秒)" - delta_total_ns: "总 CPU 增量(纳秒)" - cpu_user_pct: "用户态 CPU 利用率(%)" - cpu_sys_pct: "内核态 CPU 利用率(%)" - cpu_total_pct: "总 CPU 利用率(%)" - cum_user_ns: "累计用户态 CPU 时间(纳秒)" - cum_sys_ns: "累计内核态 CPU 时间(纳秒)" - rss_kb: "常驻内存 RSS(KB);仅 process scope" - thread_count: "线程数;仅 process scope" - delta_vol_ctxt: "自愿上下文切换增量" - delta_invol_ctxt: "非自愿上下文切换增量" - state: "线程/进程状态(Linux)" - wchan: "内核 wait channel(Linux)" - - cpu.tasks: - description: "CPU Top-N 热点线程明细(与 cpu.utilization 同周期采样)" - synonyms: [cpu threads, top threads, 热点线程] - key_columns: - ts: "采样时间戳(微秒)" - platform: "linux | macos" - tid: "线程 id" - comm: "线程名" - state: "线程状态" - wchan: "内核 wait channel" - wall_ns: "采样间隔(纳秒)" - delta_user_ns: "用户态 CPU 增量(纳秒)" - delta_sys_ns: "内核态 CPU 增量(纳秒)" - delta_total_ns: "总 CPU 增量(纳秒)" - - gpu.utilization: - description: "GPU 显存与利用率周期采样" - synonyms: [gpu memory, VRAM, 显存, GPU利用率] - key_columns: - ts: "采样时间戳(微秒)" - backend: "cuda | mps | …" - device_id: "设备序号" - name: "设备名称" - memory_model: "显存型号描述" - chip: "芯片/架构标识" - free_bytes: "空闲显存(字节)" - total_bytes: "总显存(字节)" - used_bytes: "已用显存(字节)" - mem_used_pct: "显存使用率(%)" - gpu_util_pct: "GPU 计算利用率(%;不可用为 -1)" - mem_controller_util_pct: "显存控制器利用率(NVIDIA)" - renderer_util_pct: "渲染引擎利用率(Apple MPS)" - tiler_util_pct: "Tiler 利用率(Apple MPS)" - driver_mem_bytes: "驱动保留显存(字节)" - wall_ns: "采样间隔(纳秒)" - - process.kmsg: - description: "Linux 内核 ring buffer(dmesg)— OOM、GPU Xid、IB 错误等" - synonyms: [kernel log, dmesg, OOM, 内核日志] - platform: linux - key_columns: - timestamp: "内核日志时间(微秒)" - facility: "syslog facility" - level: "日志级别" - message: "内核消息正文" - - cluster.nodes: - description: "已注册的分布式训练 peer(torchrun / PUT /apis/nodes)" - synonyms: [cluster, nodes, ranks, 集群节点] - key_columns: - host: "主机名" - addr: "probing HTTP 地址" - local_rank: "节点内 local rank" - rank: "全局 rank" - world_size: "world size" - group_rank: "进程组 rank" - group_world_size: "进程组大小" - role_name: "Torchrun / Elastic role 名" - role_rank: "role 内 rank" - role_world_size: "role 内 world size" - role: "并行角色键(federation _role 来源)" - status: "节点状态" - timestamp: "最后更新时间(微秒)" - - rdma.mlx_hca: - description: "InfiniBand/RoCE HCA 端口计数器快照(/sys/class/infiniband)" - synonyms: [IB, RoCE, HCA, mlx, RDMA counters] - platform: linux - key_columns: - hca_name: "HCA 设备名(如 mlx5_0)" - port_rcv_packets: "端口接收包计数" - port_rcv_data: "端口接收字节计数" - port_xmit_packets: "端口发送包计数" - port_xmit_data: "端口发送字节计数" - link_downed: "链路 down 次数" - np_cnp_sent: "RoCE CNP 发送计数" - np_ecn_marked_roce_packets: "ECN 标记 RoCE 包计数" - rcv_pkts_rate: "接收包速率(包/秒,两次采样差分)" - snd_pkts_rate: "发送包速率(包/秒)" - notes: - - "需配置 rdma.hca.name 与 rdma.sample.rate" - - nccl.proxy_ops: - description: "NCCL profiler plugin proxy-op wait 分解(culprit / victim 归因)" - synonyms: [NCCL proxy, send_gpu_wait, recv_wait, culprit, victim, proxy wait] - key_columns: - ts: "事件时间戳(UNIX epoch 纳秒)" - rank: "torch.distributed rank" - tp_rank: "张量并行 rank(未知 -1)" - pp_rank: "流水线并行 rank(未知 -1)" - dp_rank: "数据并行 rank(未知 -1)" - comm_hash: "NCCL communicator hash" - coll_func: "集合通信名(AllReduce、AllGather…)" - seq: "collective 序号" - channel_id: "NCCL channel id" - peer: "对端 rank" - is_send: "1=send proxy,0=recv proxy" - n_steps: "聚合的 ProxyStep 数" - trans_bytes: "传输字节数(v4 按 step 累计)" - send_gpu_wait_ns: "Culprit 信号 — 本地 GPU 未就绪发送" - send_peer_wait_ns: "等待接收端 clear-to-send credits(仅 v4 ABI;v3 为 0)— 对端拥塞信号" - send_wait_ns: "发送侧网络等待" - recv_wait_ns: "Victim 信号 — 等待对端数据" - recv_flush_wait_ns: "接收 flush 等待" - global_name: global.nccl.proxy_ops - federation_columns: [_host, _addr, _rank, _role] - notes: - - "需 NCCL_PROFILER_PLUGIN;插件同时导出 v4(NCCL ≥ 2.27)与 v3(NCCL 2.26)ABI,NCCL 自动选最高版本" - - "mask Coll|P2P|ProxyOp|ProxyStep|KernelCh,默认 94" - - "macOS 开发:PROBING_NCCL_MOCK=1 可注入合成数据" - - nccl.coll_perf: - description: "NCCL collective / P2P 级性能(timing_source 标注计时来源;消息大小、算法、带宽)" - synonyms: [collective perf, algobw, busbw, NCCL bandwidth, 集合通信带宽, message size] - key_columns: - ts: "op 完成时间戳(UNIX epoch 纳秒)" - rank: "torch.distributed rank" - tp_rank: "张量并行 rank(未知 -1)" - pp_rank: "流水线并行 rank(未知 -1)" - dp_rank: "数据并行 rank(未知 -1)" - comm_hash: "NCCL communicator hash" - n_ranks: "通信组大小(v4 init 提供;v3 为 -1)— busbw 换算用" - coll_func: "操作名(AllReduce、AllGather、Send、Recv…)" - seq: "collective 序号(P2P 为 0)" - is_p2p: "1=P2P(Send/Recv),0=collective" - peer: "P2P 对端 rank(collective 为 -1)" - count: "元素个数" - msg_size_bytes: "消息大小 = count × dtype 字节数" - dtype: "NCCL 数据类型名" - algo: "NCCL 算法(Ring、Tree…;P2P 为空)" - proto: "NCCL 协议(LL、LL128、Simple…)" - n_channels: "最大 channel 数(v4 起 P2P 也有值)" - exec_time_ns: "实际执行耗时(纳秒);由 timing_source 对应事件窗口重建" - enqueue_time_ns: "host 侧 enqueue 耗时(纳秒;NCCL coll stopEvent 语义)" - timing_source: "exec_time 来源:kernel_gpu(GPU globaltimer,v4)> kernel_ch(host 观测)> proxy > enqueue(回退)" - algobw_gbps: "算法带宽 msg_size/exec_time(GB/s);busbw 需乘集合通信系数" - global_name: global.nccl.coll_perf - federation_columns: [_host, _addr, _rank, _role] - notes: - - "NCCL coll stopEvent 只代表 enqueue 完成;exec_time_ns 由子事件(KernelCh/ProxyOp)引用计数重建" - - "v4 ABI 下 timing_source=kernel_gpu,来自 GPU globaltimer(设备时钟,最精确)" - - "busbw 换算:AllReduce 乘 2(n-1)/n,n 取 n_ranks(v3 行 n_ranks=-1 时需从外部推断)" - - "PROBING_NCCL_MIN_MSG_BYTES 可过滤小消息" - - nccl.inflight_ops: - description: "在途(已 start 未 stop)NCCL 操作周期快照 — hang 诊断信号" - synonyms: [inflight, hang, stuck collective, 挂死, 卡住, watchdog] - key_columns: - ts: "快照时间戳(UNIX epoch 纳秒)" - rank: "torch.distributed rank" - comm_hash: "NCCL communicator hash" - coll_func: "操作名(未知为 unknown)" - seq: "collective 序号" - kind: "coll / p2p / proxy_op" - channel_id: "NCCL channel(proxy_op 有效)" - peer: "对端 rank(未知 -1)" - is_send: "1=send,0=recv(proxy_op 有效)" - start_ns: "op 开始时间戳(epoch 纳秒)" - age_ns: "快照时刻已持续时长(纳秒)" - global_name: global.nccl.inflight_ops - federation_columns: [_host, _addr, _rank, _role] - notes: - - "挂死的 op 不会出现在 nccl.proxy_ops / nccl.coll_perf(永远不 stop),查这张表" - - "PROBING_NCCL_INFLIGHT_THRESHOLD_SECS 控制快照阈值(默认 10s,0 关闭)" - - nccl.net_qp: - description: "NCCL NetPlugin IB QP 完成耗时(可选 mask bit 128)" - synonyms: [IB QP, RoCE, net plugin, qp duration] - key_columns: - ts: "事件时间戳(纳秒)" - rank: "torch.distributed rank" - device: "IB 设备索引" - qp_num: "Queue Pair 号" - wr_id: "Work Request id" - opcode: "IB opcode" - length: "传输长度(字节)" - duration_ns: "QP 完成耗时(纳秒)" - global_name: global.nccl.net_qp - federation_columns: [_host, _addr, _rank, _role] - - hccl.host_ops: - description: "HCCL MSProf Host API 时间线(集合通信 op、ACL、task master/slave)" - synonyms: [HCCL host, MSProf API, host_hccl_op, task_master] - key_columns: - ts: "结束时间(CANN sys cycle)" - begin_ns: "开始时间" - end_ns: "结束时间" - duration_ns: "耗时 end - begin" - thread_id: "上报线程 id" - level: "MSProf level" - type_id: "MSProf type id" - item_id: "名称 hash" - item_name: "解码名称(hcom_allReduce_、Memcpy 等)" - event_class: "host_hccl_op | task_master | task_slave | host_acl | node_launch" - aging: "MSProf aging flag" - notes: - - "来源:libprofapi.so shim 拦截 MsprofReportApi" - - "需开启 CANN/HCCL profiling" - - hccl.collectives: - description: "HCCL 集合通信元数据与 Host 耗时(row_source 区分 api/compact 行)" - synonyms: [HCCL collective, hcom_allReduce, HcclOpInfo] - key_columns: - ts: "事件时间" - thread_id: "上报线程" - row_source: "api=耗时行;compact=count/group/alg 参数行" - begin_ns: "开始时间(api 行)" - end_ns: "结束时间(api 行)" - duration_ns: "耗时(api 行)" - op_hash: "算子名 hash(api 行)" - op_name: "算子名(api 行)" - group_hash: "comm group 名 hash(compact 行)" - alg_hash: "算法名 hash(compact 行)" - count: "元素个数(compact 行)" - data_type: "HcclDataType enum" - relay: "HCCL relay 标志" - retry: "HCCL retry 计数" - compact_type: "MsprofReportCompactInfo type id" - notes: - - "api 与 compact 行按 thread_id + 邻近 ts JOIN" - - hccl.tasks: - description: "HCCL 设备侧 task 明细(MsprofHcclInfo L1)" - synonyms: [HCCL task, RDMASend, Memcpy, Notify_Wait] - key_columns: - ts: "上报时间戳" - thread_id: "上报线程" - info_type: "AdditionalInfo type id" - info_level: "AdditionalInfo level" - info_type_name: "RegTypeInfo 注册名(如 hccl_info)" - item_id: "task 类型 hash" - task_name: "task 类型名(Memcpy、RDMASend…)" - ccl_tag: "CCL tag hash" - group_name: "comm group hash" - local_rank: "本端 rank" - remote_rank: "对端 rank(-1 表示 N/A)" - rank_size: "通信组大小" - workflow_mode: "HCCL workflow mode enum" - plane_id: "原始 plane 编码" - plane_index: "plane 索引(plane_id bits 28-31)" - rank_in_plane: "plane 内 rank(bits 0-15)" - rank_size_plane: "plane 宽度(bits 16-27)" - ctx_id: "FFTS context id" - notify_id: "notify 对象 id" - stage: "流水线 stage" - role: "task 角色 enum" - data_size: "传输字节数" - op_type: "操作类型 enum" - data_type: "数据类型 enum" - link_type: "链路类型" - transport_type: "传输类型" - rdma_type: "RDMA 类型" - duration_est_us: "HCCL 估算耗时(微秒)" - payload_len: "原始 AdditionalInfo payload 长度" - global_name: global.hccl.tasks - federation_columns: [_host, _addr, _rank, _role] - - hccl.mc2_streams: - description: "HCCL MC2 communicator stream 拓扑快照" - synonyms: [MC2, comm streams, aicpu stream] - key_columns: - ts: "上报时间" - thread_id: "上报线程" - info_type: "MSProf AdditionalInfo type" - group_hash: "comm group 名 hash" - rank_size: "组内 rank 数" - rank_id: "rank id" - usr_rank_id: "用户可见 rank id" - aicpu_kfc_stream_id: "KFC stream id" - comm_stream_size: "comm stream 数量" - comm_stream_ids: "逗号分隔的 stream id 列表" - - hccl.context_ids: - description: "HCCL FFTS context id 范围(dispatch 时上报)" - synonyms: [FFTS context, context id] - key_columns: - ts: "上报时间" - thread_id: "上报线程" - info_type: "MSProf AdditionalInfo type" - ctx_id_num: "context 数量(HCCL 固定报 2)" - ctx_id_min: "范围起点(通常 0)" - ctx_id_max: "范围终点(ctxIdMax)" diff --git a/python/probing/bundled_skills/semantic/tables.yaml b/python/probing/bundled_skills/semantic/tables.yaml new file mode 120000 index 00000000..5a70e1e2 --- /dev/null +++ b/python/probing/bundled_skills/semantic/tables.yaml @@ -0,0 +1 @@ +../../../../probing/core/resources/tables.yaml \ No newline at end of file diff --git a/skills/sre_triage/SKILL.md b/python/probing/bundled_skills/sre_triage/SKILL.md similarity index 100% rename from skills/sre_triage/SKILL.md rename to python/probing/bundled_skills/sre_triage/SKILL.md diff --git a/skills/sre_triage/steps.yaml b/python/probing/bundled_skills/sre_triage/steps.yaml similarity index 100% rename from skills/sre_triage/steps.yaml rename to python/probing/bundled_skills/sre_triage/steps.yaml diff --git a/skills/watchdog_timeout/SKILL.md b/python/probing/bundled_skills/watchdog_timeout/SKILL.md similarity index 100% rename from skills/watchdog_timeout/SKILL.md rename to python/probing/bundled_skills/watchdog_timeout/SKILL.md diff --git a/skills/watchdog_timeout/steps.yaml b/python/probing/bundled_skills/watchdog_timeout/steps.yaml similarity index 100% rename from skills/watchdog_timeout/steps.yaml rename to python/probing/bundled_skills/watchdog_timeout/steps.yaml diff --git a/python/probing/discovery.py b/python/probing/discovery.py new file mode 100644 index 00000000..7d00bb71 --- /dev/null +++ b/python/probing/discovery.py @@ -0,0 +1,31 @@ +"""Backward-compatible re-exports — prefer ``probing.extensions``.""" + +from __future__ import annotations + +from probing.extensions import ( + ENTRY_GROUP_MAGICS, + ENTRY_GROUP_SKILLS, + SkillRoot, + bundled_skills_dir, + find_repo_root, + list_vendor_extensions, + load_magics, + load_magics_from_entry_points, + load_skill_roots_from_entry_points, + repo_skills_dir, + skill_root_bundled, + skill_roots, + skill_roots_json, + vendor_extensions_json, + vendor_id_from_dist_name, + vendor_import_name, + vendor_package_name, +) +from probing.extensions.__main__ import main as _main + +entry_point_skill_roots = load_skill_roots_from_entry_points +load_entry_point_magics = load_magics_from_entry_points +package_skill_roots = load_skill_roots_from_entry_points + +if __name__ == "__main__": + raise SystemExit(_main()) diff --git a/python/probing/extensions/README.md b/python/probing/extensions/README.md new file mode 100644 index 00000000..40765ada --- /dev/null +++ b/python/probing/extensions/README.md @@ -0,0 +1,41 @@ +# Extension discovery (`probing.extensions`) + +**Single boundary** for pip-installed skills, REPL magics, and `probing-` +packages. If you change how extensions are discovered or registered, edit **only** +this package. + +## Layout + +| Module | Responsibility | +|--------|----------------| +| `entrypoints.py` | Load `probing.skills` / `probing.magics` setuptools groups | +| `skills.py` | Merge skill roots (bundled, repo, entry points, user overrides) | +| `vendor.py` | `probing-` naming and inventory | +| `types.py` | `SkillRoot` | +| `__main__.py` | `python -m probing.extensions {skill-roots\|extensions}` | + +## Public API + +```python +from probing.extensions import ( + skill_roots, + skill_roots_json, + load_magics, + list_vendor_extensions, + vendor_package_name, +) +``` + +## Consumers (thin — do not add discovery logic here) + +| Consumer | Uses | +|----------|------| +| `probing.skills.loader` | `skill_roots()` via `paths` re-export | +| `probing.repl` | `load_magics()` | +| `probing.handlers.pythonext` | `skill_roots_json`, `vendor_extensions_json` | +| `probing/cli` (Rust) | subprocess `python -m probing.extensions skill-roots` | +| `probing.discovery` | Deprecated shim re-exporting this package | + +## Authoring vendor packages + +See `examples/probing-acme/` and `docs/src/design/extensibility.md`. diff --git a/python/probing/extensions/__init__.py b/python/probing/extensions/__init__.py new file mode 100644 index 00000000..6e003ec6 --- /dev/null +++ b/python/probing/extensions/__init__.py @@ -0,0 +1,67 @@ +"""Extension discovery — single boundary for skills, magics, and vendor packages. + +Third-party ``probing-`` wheels register via setuptools entry points: + +- ``probing.skills`` → ``skill_root()`` returning a ``catalog.yaml`` directory +- ``probing.magics`` → ``Magics`` subclass for the REPL + +All consumers (skill loader, REPL, HTTP handlers, Rust CLI subprocess) should +import from this package only. +""" + +from __future__ import annotations + +from typing import Dict, List, Type + +from probing.extensions.entrypoints import ( + ENTRY_GROUP_MAGICS, + ENTRY_GROUP_SKILLS, + load_magics_from_entry_points, + load_skill_roots_from_entry_points, +) +from probing.extensions.skills import ( + bundled_skills_dir, + default_install_source, + find_repo_root, + repo_skills_dir, + resolve_skill_dir, + skill_root_bundled, + skill_roots, + skill_roots_json, +) +from probing.extensions.types import SkillRoot +from probing.extensions.vendor import ( + list_vendor_extensions, + vendor_extensions_json, + vendor_id_from_dist_name, + vendor_import_name, + vendor_package_name, +) + + +def load_magics(registry: Dict[str, Type]) -> List[str]: + """Register ``probing.magics`` entry points into *registry*.""" + return load_magics_from_entry_points(registry) + + +__all__ = [ + "ENTRY_GROUP_MAGICS", + "ENTRY_GROUP_SKILLS", + "SkillRoot", + "bundled_skills_dir", + "default_install_source", + "find_repo_root", + "list_vendor_extensions", + "load_magics", + "load_magics_from_entry_points", + "load_skill_roots_from_entry_points", + "repo_skills_dir", + "resolve_skill_dir", + "skill_root_bundled", + "skill_roots", + "skill_roots_json", + "vendor_extensions_json", + "vendor_id_from_dist_name", + "vendor_import_name", + "vendor_package_name", +] diff --git a/python/probing/extensions/__main__.py b/python/probing/extensions/__main__.py new file mode 100644 index 00000000..4d5f978a --- /dev/null +++ b/python/probing/extensions/__main__.py @@ -0,0 +1,31 @@ +"""CLI: ``python -m probing.extensions {skill-roots|extensions}``.""" + +from __future__ import annotations + +import sys +from typing import Optional, Sequence + +from probing.extensions.skills import skill_roots_json +from probing.extensions.vendor import vendor_extensions_json + + +def main(argv: Optional[Sequence[str]] = None) -> int: + args = list(argv or sys.argv[1:]) + if not args or args[0] in ("-h", "--help"): + print( + "Usage: python -m probing.extensions {skill-roots|extensions}", + file=sys.stderr, + ) + return 2 if args else 0 + if args[0] == "skill-roots": + print(skill_roots_json()) + return 0 + if args[0] == "extensions": + print(vendor_extensions_json()) + return 0 + print(f"Unknown command: {args[0]}", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/python/probing/extensions/entrypoints.py b/python/probing/extensions/entrypoints.py new file mode 100644 index 00000000..d92d8161 --- /dev/null +++ b/python/probing/extensions/entrypoints.py @@ -0,0 +1,106 @@ +"""Low-level setuptools entry-point loading.""" + +from __future__ import annotations + +import logging +from importlib import import_module +from pathlib import Path +from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Type + +logger = logging.getLogger(__name__) + +ENTRY_GROUP_SKILLS = "probing.skills" +ENTRY_GROUP_MAGICS = "probing.magics" +_SKILLS_MARKER = "catalog.yaml" + + +def entry_points(group: str) -> Iterable[Any]: + try: + from importlib.metadata import entry_points as eps_fn + except ImportError: + from importlib_metadata import entry_points as eps_fn # type: ignore + + try: + selected = eps_fn(group=group) + except TypeError: + selected = eps_fn().get(group, []) + return selected or [] + + +def entry_point_names_for_dist(dist_name: str, group: str) -> List[str]: + names: List[str] = [] + for ep in entry_points(group): + ep_dist = getattr(ep, "dist", None) + if ep_dist is None: + continue + if (ep_dist.metadata.get("Name") or ep_dist.name).lower() == dist_name.lower(): + names.append(ep.name) + return sorted(set(names)) + + +def _resolve_skill_root(loader: Callable[[], Any], label: str) -> Optional[Path]: + try: + target = loader() + except Exception as exc: + logger.warning("probing.skills entry point %s failed: %s", label, exc) + return None + if callable(target) and not isinstance(target, type): + try: + value = target() + except Exception as exc: + logger.warning("probing.skills entry point %s failed: %s", label, exc) + return None + else: + value = target + if value is None: + return None + path = value if isinstance(value, Path) else Path(str(value)).expanduser() + try: + path = path.resolve() + except OSError: + path = path.absolute() + marker = path / _SKILLS_MARKER + if not marker.is_file(): + logger.warning("probing.skills entry point %s: missing %s", label, marker) + return None + return path + + +def load_skill_roots_from_entry_points() -> List[Tuple[Path, str]]: + """Skill directories registered through ``probing.skills`` entry points.""" + roots: List[Tuple[Path, str]] = [] + seen: set[str] = set() + for ep in entry_points(ENTRY_GROUP_SKILLS): + label = f"{ep.dist.name}:{ep.name}" if getattr(ep, "dist", None) else ep.name + path = _resolve_skill_root(ep.load, label) + if path is None: + continue + key = str(path) + if key in seen: + continue + seen.add(key) + roots.append((path, label)) + return roots + + +def load_magics_from_entry_points(registry: Dict[str, Type]) -> List[str]: + """Load ``probing.magics`` entry points into *registry* (name → Magics class).""" + loaded: List[str] = [] + for ep in entry_points(ENTRY_GROUP_MAGICS): + name = ep.name + try: + target = ep.load() + except Exception as exc: + logger.warning("probing.magics entry point %s failed: %s", name, exc) + continue + if isinstance(target, type): + cls = target + else: + module_name, _, attr = ep.value.partition(":") + module = import_module(module_name) + cls = getattr(module, attr or name, target) + if name in registry: + logger.warning("probing.magics: replacing existing magic %s", name) + registry[name] = cls + loaded.append(name) + return loaded diff --git a/python/probing/extensions/skills.py b/python/probing/extensions/skills.py new file mode 100644 index 00000000..7b28729e --- /dev/null +++ b/python/probing/extensions/skills.py @@ -0,0 +1,183 @@ +"""Skill root discovery — entry points plus filesystem overlays.""" + +from __future__ import annotations + +import json +import os +from pathlib import Path +from typing import List, Optional, Sequence + +from probing.extensions.entrypoints import load_skill_roots_from_entry_points +from probing.extensions.types import SkillRoot + +REPO_SKILLS_DIRNAME = "skills" +PROBING_PROJECT_SKILLS = ".probing/skills" +PROBING_USER_SKILLS = ".probing/skills" + + +def _package_dir() -> Path: + return Path(__file__).resolve().parent.parent + + +def _resource_dir(name: str, marker: str) -> Optional[Path]: + try: + from importlib.resources import as_file, files + + bundle = files("probing") / name + if not (bundle / marker).is_file(): + return None + with as_file(bundle) as path: + return Path(path) + except (TypeError, ModuleNotFoundError, FileNotFoundError, OSError): + return None + + +def bundled_skills_dir() -> Optional[Path]: + """SSOT: ``python/probing/bundled_skills`` (repo ``skills/`` symlink).""" + root = _package_dir() / "bundled_skills" + if (root / "catalog.yaml").is_file(): + return root + return _resource_dir("bundled_skills", "catalog.yaml") + + +def skill_root_bundled() -> Path: + """``probing.skills`` entry point for the core bundled catalog.""" + root = bundled_skills_dir() + if root is None: + raise RuntimeError( + "bundled skills not found; install probing (pip install -e . or wheel)" + ) + return root + + +def find_repo_root(start: Optional[Path] = None) -> Optional[Path]: + start = (start or Path.cwd()).resolve() + for directory in (start, *start.parents): + if (directory / REPO_SKILLS_DIRNAME / "catalog.yaml").is_file() and ( + directory / "pyproject.toml" + ).is_file(): + return directory + if directory.parent == directory: + break + pkg_root = Path(__file__).resolve().parents[3] + if (pkg_root / REPO_SKILLS_DIRNAME / "catalog.yaml").is_file(): + return pkg_root + return None + + +def repo_skills_dir(start: Optional[Path] = None) -> Optional[Path]: + root = find_repo_root(start) + if root is None: + return None + candidate = root / REPO_SKILLS_DIRNAME + return candidate if (candidate / "catalog.yaml").is_file() else None + + +def user_skills_dir() -> Path: + return Path.home() / PROBING_USER_SKILLS + + +def project_skills_dir(start: Optional[Path] = None) -> Optional[Path]: + start = start or Path.cwd() + for directory in (start, *start.parents): + candidate = directory / PROBING_PROJECT_SKILLS + if candidate.is_dir(): + return candidate + if directory.parent == directory: + break + return None + + +def env_skills_dir() -> Optional[Path]: + raw = os.environ.get("PROBING_SKILLS_DIR") + if not raw: + return None + path = Path(raw).expanduser().resolve() + return path if path.is_dir() else None + + +def skill_roots(start: Optional[Path] = None) -> List[SkillRoot]: + """Return skill roots from lowest to highest priority (later overrides earlier). + + Order: bundled (filesystem fallback) → repo checkout → entry points → + user → project → ``PROBING_SKILLS_DIR``. + """ + roots: List[SkillRoot] = [] + seen: set[str] = set() + + def _add(path: Path, label: str) -> None: + try: + key = str(path.resolve()) + except OSError: + key = str(path) + if key in seen: + return + seen.add(key) + roots.append(SkillRoot(path, label)) + + bundled = bundled_skills_dir() + if bundled is not None: + _add(bundled, "bundled") + + repo = repo_skills_dir(start) + if repo is not None: + _add(repo, "repo") + + for path, label in load_skill_roots_from_entry_points(): + _add(path, label) + + user = user_skills_dir() + if user.is_dir(): + _add(user, "user") + + project = project_skills_dir(start) + if project is not None: + _add(project, "project") + + extra = env_skills_dir() + if extra is not None: + _add(extra, "env") + + return roots + + +def default_install_source(start: Optional[Path] = None) -> Path: + repo = repo_skills_dir(start) + if repo is not None: + return repo + bundled = bundled_skills_dir() + if bundled is not None: + return bundled + raise FileNotFoundError( + "No skills/ directory found. Run from the probing repo or install probing from a wheel." + ) + + +def resolve_skill_dir(skill_id: str, roots: Sequence[SkillRoot]) -> Optional[Path]: + for root in reversed(roots): + catalog_path = None + catalog_file = root.path / "catalog.yaml" + if catalog_file.is_file(): + try: + import yaml + except ImportError: + yaml = None # type: ignore + if yaml is not None: + data = yaml.safe_load(catalog_file.read_text(encoding="utf-8")) or {} + for entry in data.get("skills") or []: + if str(entry.get("id")) == skill_id: + rel = entry.get("path") or entry.get("file") + if rel: + catalog_path = root.path / str(rel) + break + if catalog_path is not None and catalog_path.is_file(): + return catalog_path.parent + direct = root.path / skill_id + if (direct / "steps.yaml").is_file() or (direct / "SKILL.md").is_file(): + return direct + return None + + +def skill_roots_json() -> str: + payload = [{"path": str(root.path), "label": root.label} for root in skill_roots()] + return json.dumps(payload) diff --git a/python/probing/extensions/types.py b/python/probing/extensions/types.py new file mode 100644 index 00000000..6ba0fa4b --- /dev/null +++ b/python/probing/extensions/types.py @@ -0,0 +1,14 @@ +"""Shared types for extension discovery.""" + +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path + + +@dataclass(frozen=True) +class SkillRoot: + """A directory tree that contains skill folders and ``catalog.yaml``.""" + + path: Path + label: str diff --git a/python/probing/extensions/vendor.py b/python/probing/extensions/vendor.py new file mode 100644 index 00000000..558aa74c --- /dev/null +++ b/python/probing/extensions/vendor.py @@ -0,0 +1,84 @@ +"""``probing-`` package naming and inventory.""" + +from __future__ import annotations + +import json +import re +from typing import Any, Dict, Iterable, List, Optional + +from probing.extensions.entrypoints import ( + ENTRY_GROUP_MAGICS, + ENTRY_GROUP_SKILLS, + entry_point_names_for_dist, + load_skill_roots_from_entry_points, +) + +VENDOR_PACKAGE_PREFIX = "probing-" +_VENDOR_DIST_RE = re.compile(r"^probing-[a-z0-9][a-z0-9-]*$") + + +def vendor_package_name(vendor: str) -> str: + slug = vendor.strip().lower().replace("_", "-") + if not slug or slug == "probing": + raise ValueError(f"invalid vendor id: {vendor!r}") + return f"{VENDOR_PACKAGE_PREFIX}{slug}" + + +def vendor_import_name(vendor: str) -> str: + slug = vendor.strip().lower().replace("-", "_") + if not slug or slug == "probing": + raise ValueError(f"invalid vendor id: {vendor!r}") + return f"probing_{slug}" + + +def vendor_id_from_dist_name(dist_name: str) -> Optional[str]: + name = dist_name.strip().lower() + if not _VENDOR_DIST_RE.match(name): + return None + vendor = name[len(VENDOR_PACKAGE_PREFIX) :] + return vendor or None + + +def _installed_distributions() -> Iterable[Any]: + try: + from importlib.metadata import distributions + + return distributions() + except ImportError: + return [] + + +def list_vendor_extensions() -> List[Dict[str, Any]]: + """Installed ``probing-`` packages and their entry-point contributions.""" + seen: set[str] = set() + out: List[Dict[str, Any]] = [] + for dist in _installed_distributions(): + dist_name = (dist.metadata.get("Name") or dist.name).strip() + vendor = vendor_id_from_dist_name(dist_name) + if vendor is None or vendor in seen: + continue + seen.add(vendor) + version = dist.metadata.get("Version") or getattr(dist, "version", "") + skill_eps = entry_point_names_for_dist(dist_name, ENTRY_GROUP_SKILLS) + magic_eps = entry_point_names_for_dist(dist_name, ENTRY_GROUP_MAGICS) + skill_root_paths: List[str] = [] + for path, label in load_skill_roots_from_entry_points(): + if label.startswith(f"{dist_name}:"): + skill_root_paths.append(str(path)) + out.append( + { + "vendor": vendor, + "package": dist_name, + "version": version, + "import_name": vendor_import_name(vendor), + "skills_entry_points": skill_eps, + "magics_entry_points": magic_eps, + "skill_roots": sorted(set(skill_root_paths)), + } + ) + out.sort(key=lambda row: row["vendor"]) + return out + + +def vendor_extensions_json() -> str: + return json.dumps(list_vendor_extensions()) diff --git a/python/probing/handlers/pythonext.py b/python/probing/handlers/pythonext.py index 63165474..b00010de 100644 --- a/python/probing/handlers/pythonext.py +++ b/python/probing/handlers/pythonext.py @@ -566,6 +566,60 @@ def get_magics_list() -> str: return json.dumps({"error": str(e), "traceback": traceback.format_exc()}) +@ext_handler("pythonext", "skills/list") +def list_skills_api() -> str: + """List discovered diagnostic skills (bundled, repo, packages, overrides).""" + import probing._core as core + + return core.skills_list(None, 20) + + +@ext_handler("pythonext", "skills/load", required_params=["id"]) +def load_skill_api(id: str) -> str: + """Load one skill definition as JSON.""" + import probing._core as core + + try: + return core.skills_load(id) + except Exception as e: + msg = str(e) + if "Unknown skill" in msg: + return json.dumps({"error": f"Unknown skill: {id}"}) + return json.dumps({"error": msg, "traceback": traceback.format_exc()}) + + +@ext_handler("pythonext", "skills/catalog") +def skills_catalog_api() -> str: + """Merged skill catalog (all discovered roots).""" + import probing._core as core + + return core.skills_catalog() + + +@ext_handler("pythonext", "skills/routing") +def skills_routing_api() -> str: + """Semantic routing overlays: catalog entries, intents, pages.""" + import probing._core as core + + return core.skills_routing() + + +@ext_handler("pythonext", "skills/roots") +def skills_roots_api() -> str: + """Discovered skill root directories (for debugging).""" + from probing.extensions import skill_roots_json + + return skill_roots_json() + + +@ext_handler("pythonext", "extensions/list") +def extensions_list_api() -> str: + """Installed probing- extension packages and their contributions.""" + from probing.extensions import vendor_extensions_json + + return vendor_extensions_json() + + @ext_handler("pythonext", "crash/hold") def crash_hold() -> str: """Extend grace hold for post-crash debugging.""" diff --git a/python/probing/repl/__init__.py b/python/probing/repl/__init__.py index dd269c57..9e430aa5 100644 --- a/python/probing/repl/__init__.py +++ b/python/probing/repl/__init__.py @@ -176,7 +176,7 @@ def __init__(self): if original_main: shell.user_ns.update(original_main.__dict__) - # Auto-discover and register magic commands + # Auto-discover and register magic commands (in-tree + installed packages). import importlib import pkgutil @@ -192,6 +192,17 @@ def __init__(self): warnings.warn(f"Failed to import {modname}: {e}", ImportWarning) + try: + from probing.extensions import load_magics + + load_magics(_MAGIC_REGISTRY) + except Exception as e: + import warnings + + warnings.warn( + f"Failed to load probing.magics entry points: {e}", ImportWarning + ) + # Register all magic classes for magic_name, magic_class in _MAGIC_REGISTRY.items(): try: diff --git a/python/probing/skills/README.md b/python/probing/skills/README.md index c74de057..102bc52e 100644 --- a/python/probing/skills/README.md +++ b/python/probing/skills/README.md @@ -1,39 +1,51 @@ # `probing.skills` — Python runtime (not skill data) -**This package is code, not skill content.** Skill folders live at the repo root -[`skills/`](../../../skills/README.md). Wheel installs ship a copy under -[`../bundled_skills/`](../bundled_skills/README.md). +**This package is code, not skill content.** Authoring tree: [`python/probing/bundled_skills/`](../bundled_skills/README.md) +(repo-root [`skills/`](../../../skills) is a symlink alias). ## Modules | Module | Role | |--------|------| -| `loader.py` | Load `catalog.yaml`, `steps.yaml`, semantic YAML; expand templates | -| `paths.py` | Discover skill roots (repo, bundled, user, project, `PROBING_SKILLS_DIR`) | +| `loader.py` | Thin wrappers over `probing._core.skills_*` (Rust SSOT) | +| `paths.py` | Agent install targets only; re-exports `skill_roots` from `probing.extensions` | +| `../extensions/` | **Extension discovery SSOT** — entry points, overlays, vendor inventory | | `install.py` | `probing skill install` / `update` — copy into agent skill dirs | -| `tools.py` | `list_skills`, `run_skill`, JSON helpers for agents | -| `interpret.py` | Rule evaluation on step results | +| `tools.py` | `list_skills`, `plan_skill_run` — discovery/plan via Rust | +| `serialize.py` | Legacy JSON helpers (handlers call `_core` directly) | | `__main__.py` | `python -m probing.skills validate\|install\|update` | -## Resolution order (later wins) +## Discovery (later wins) -1. Bundled `python/probing/bundled_skills/` (wheel) -2. Repo `skills/` (checkout) -3. `~/.probing/skills/` -4. `/.probing/skills/` -5. `$PROBING_SKILLS_DIR` +| Priority | Source | Mechanism | +|----------|--------|-----------| +| 1 | Bundled | `probing.skills` entry point `bundled`, or filesystem fallback (`PYTHONPATH` dev) | +| 2 | Repo | `skills/` in probing checkout | +| 3 | Installed packages | `probing.skills` entry points (`probing`, `probing-nvidia`, …) | +| 4 | User | `~/.probing/skills/` | +| 5 | Project | `/.probing/skills/` | +| 6 | Env | `$PROBING_SKILLS_DIR` | + +Vendor extensions (`probing-`) register skills and magics via **the same entry-point groups**. +See [`docs/src/design/extensibility.md`](../../../docs/src/design/extensibility.md#path-4-vendor-extension-package-probing-vendor) +and template [`examples/probing-acme/`](../../../examples/probing-acme/). + +```bash +python -m probing.extensions skill-roots +python -m probing.extensions extensions +``` + +Rust CLI and Web UI load skills at **runtime** from the probing server / Python discovery — not compile-time embed. ## Public API ```python -from probing.skills.tools import list_skills, run_skill +from probing.skills.tools import list_skills, plan_skill_run from probing.skills.loader import load_skill, load_catalog from probing.skills.install import install_skills ``` -Rust CLI and Web UI embed the same catalog from repo `skills/` at compile time; -this package is used for Python tooling, install, and runtime overrides. - ## Tests -`tests/unit/probing/skills/` — loader, interpret. `tests/regression/skills/` — install, tools. +`tests/unit/probing/skills/` — loader (Rust bridge). `tests/regression/skills/` — install, tools. +`tests/unit/probing/test_extensions.py` — entry-point discovery (legacy `test_discovery.py` covers shim). diff --git a/python/probing/skills/__init__.py b/python/probing/skills/__init__.py index c547ff47..5915d818 100644 --- a/python/probing/skills/__init__.py +++ b/python/probing/skills/__init__.py @@ -1,26 +1,19 @@ -"""Probing diagnostic skills — shared by CLI, Web agent, and Python tooling.""" +"""Probing diagnostic skills — discovery via Rust (``probing-skills``), install via Python.""" from probing.skills.loader import ( Skill, SkillCatalog, SkillStep, expand_skill, + expand_template, load_catalog, load_intents, load_pages, load_skill, - load_semantic_catalog, match_skills, skills_root, validate_all, ) -from probing.skills.interpret import ( - InterpretFinding, - StepEvidence, - evaluate_rules, - evidence_from_dataframe, - rule_matches, -) from probing.skills.install import install_skills from probing.skills.paths import ( AgentInstallTarget, @@ -36,16 +29,12 @@ list_skills, list_skills_json, plan_skill_run, - run_skill, - run_skill_json, ) __all__ = [ "Skill", "SkillCatalog", "SkillStep", - "InterpretFinding", - "StepEvidence", "AgentInstallTarget", "ALL_AGENTS", "bundled_skills_dir", @@ -53,9 +42,8 @@ "detect_agent_presence", "find_repo_root", "repo_skills_dir", - "evaluate_rules", - "evidence_from_dataframe", "expand_skill", + "expand_template", "install_skills", "list_skills", "list_skills_json", @@ -63,13 +51,9 @@ "load_intents", "load_pages", "load_skill", - "load_semantic_catalog", "match_skills", "plan_skill_run", - "run_skill", - "run_skill_json", "skill_roots", "skills_root", - "rule_matches", "validate_all", ] diff --git a/python/probing/skills/interpret.py b/python/probing/skills/interpret.py deleted file mode 100644 index 539f5964..00000000 --- a/python/probing/skills/interpret.py +++ /dev/null @@ -1,270 +0,0 @@ -"""Evaluate skill ``interpretation.rules`` against step evidence. - -Shared semantics with the Rust interpreter in ``probing-cli`` and ``web`` agent. -""" - -from __future__ import annotations - -import re -from dataclasses import dataclass, field -from typing import Any, Dict, List, Mapping, Optional, Sequence - -_NUM_RE = re.compile(r"^-?\d+(\.\d+)?$") - - -@dataclass -class StepEvidence: - step_id: str - row_count: int - columns: Dict[str, List[Any]] = field(default_factory=dict) - - -@dataclass -class InterpretFinding: - rule_id: str - severity: str - message: str - - -def _expand_params(template: str, params: Mapping[str, Any]) -> str: - out = template - for key, val in params.items(): - out = out.replace(f"{{{key}}}", str(val)) - return out - - -def _col_values(ev: StepEvidence, name: str) -> List[Any]: - return list(ev.columns.get(name, [])) - - -def _as_floats(vals: Sequence[Any]) -> List[float]: - out: List[float] = [] - for v in vals: - if isinstance(v, (int, float)): - out.append(float(v)) - elif isinstance(v, str) and _NUM_RE.match(v.strip()): - out.append(float(v.strip())) - return out - - -def _avg(vals: Sequence[float]) -> float: - return sum(vals) / len(vals) if vals else 0.0 - - -def _median(vals: Sequence[float]) -> float: - if not vals: - return 0.0 - s = sorted(vals) - mid = len(s) // 2 - if len(s) % 2 == 0: - return (s[mid - 1] + s[mid]) / 2.0 - return s[mid] - - -def _max_min_ratio(vals: Sequence[float]) -> float: - if len(vals) < 2: - return 0.0 - hi = max(vals) - lo = min(vals) - if lo <= 0: - return float("inf") - return hi / lo - - -def _step_by_id(steps: Sequence[StepEvidence], step_id: str) -> Optional[StepEvidence]: - for s in steps: - if s.step_id == step_id: - return s - return None - - -def _eval_rows(pred: str, row_count: int, params: Mapping[str, Any]) -> bool: - pred = pred.strip() - for op in ("==", ">=", "<=", ">", "<"): - if pred.startswith(op): - rhs = pred[len(op) :].strip() - threshold = _eval_numeric(rhs, params) - if op == "==": - return row_count == int(threshold) - if op == ">=": - return row_count >= int(threshold) - if op == "<=": - return row_count <= int(threshold) - if op == ">": - return row_count > int(threshold) - if op == "<": - return row_count < int(threshold) - return False - - -def _eval_numeric(expr: str, params: Mapping[str, Any]) -> float: - expr = _expand_params(expr, params) - if "*" in expr: - lhs, rhs = expr.split("*", 1) - return float(lhs.strip()) * float(rhs.strip()) - return float(expr.strip()) - - -def _eval_column(col_name: str, tail: str, ev: StepEvidence) -> bool: - nums = _as_floats(_col_values(ev, col_name)) - texts = [str(v) for v in _col_values(ev, col_name)] - tail = tail.strip() - - if "max/min(ratio)" in tail and ">" in tail: - threshold = float(tail.split(">", 1)[1].strip()) - return _max_min_ratio(nums) > threshold - if tail.startswith("max >"): - return (max(nums) if nums else 0.0) > float(tail[5:].strip()) - if tail.startswith("avg >"): - return _avg(nums) > float(tail[5:].strip()) - if tail.startswith("top >"): - return (max(nums) if nums else 0.0) > float(tail[5:].strip()) - if tail.startswith("value >"): - return (nums[0] if nums else 0.0) > float(tail[7:].strip()) - if tail.startswith("last >") and "* avg(" in tail: - rest = tail[6:].strip() - factor_s, col_part = rest.split("* avg(", 1) - col = col_part.rstrip(")") - col_vals = _as_floats(_col_values(ev, col)) - last = col_vals[-1] if col_vals else 0.0 - return last > float(factor_s.strip()) * _avg(col_vals) - if tail.startswith("any_contains("): - inner = tail[len("any_contains(") : -1] - needles = [ - p.strip().strip("'\"").lower() for p in inner.split(",") if p.strip() - ] - return any(any(n in t.lower() for n in needles) for t in texts if t) - return False - - -def _eval_top_vs_median(clause: str, steps: Sequence[StepEvidence]) -> bool: - parts = [p.strip() for p in clause.split("|") if p.strip()] - step_id = "rank_latency" - if parts and parts[0].startswith("step:"): - step_id = parts[0][5:] - ev = _step_by_id(steps, step_id) - if ev is None or ev.row_count < 2: - return False - vals = _as_floats(_col_values(ev, "avg_ms")) - if not vals: - return False - return max(vals) > 2.0 * _median(vals) - - -def _eval_clause( - clause: str, - step: Optional[StepEvidence], - steps: Sequence[StepEvidence], - params: Mapping[str, Any], -) -> bool: - clause = clause.strip() - if clause == "always": - return True - if clause.startswith("rows "): - if step is None: - return False - return _eval_rows(clause[5:], step.row_count, params) - if clause.startswith("column:"): - col_name = clause.split("|", 1)[0][7:].strip() - tail = clause.split("|", 1)[1].strip() if "|" in clause else "" - if step is None or not tail: - return False - return _eval_column(col_name, tail, step) - if "top(row)" in clause: - return _eval_top_vs_median(clause, steps) - return False - - -def rule_matches( - when: str, - steps: Sequence[StepEvidence], - params: Optional[Mapping[str, Any]] = None, -) -> bool: - params = params or {} - when = _expand_params(when, params) - parts = [p.strip() for p in when.split("|") if p.strip()] - if not parts: - return False - idx = 0 - step: Optional[StepEvidence] = None - if parts[0].startswith("step:"): - step = _step_by_id(steps, parts[0][5:]) - if step is None: - return False - idx = 1 - i = idx - while i < len(parts): - part = parts[i] - if part.startswith("column:"): - if step is None: - return False - col_name = part[7:].strip() - tail = parts[i + 1] if i + 1 < len(parts) else "" - if not _eval_column(col_name, tail, step): - return False - i += 2 - continue - if not _eval_clause(part, step, steps, params): - return False - i += 1 - return True - - -def _expand_message( - template: str, - steps: Sequence[StepEvidence], - params: Mapping[str, Any], -) -> str: - msg = _expand_params(template, params) - ev = _step_by_id(steps, "rank_latency") - if ev and "{worst_rank}" in msg: - ranks = _col_values(ev, "rank") - avgs = _as_floats(_col_values(ev, "avg_ms")) - if ranks and avgs: - worst = ranks[max(range(len(avgs)), key=lambda i: avgs[i])] - msg = msg.replace("{worst_rank}", str(worst)) - ev = _step_by_id(steps, "module_totals") - if ev and "{top_module}" in msg: - modules = _col_values(ev, "module") - pcts = _as_floats(_col_values(ev, "pct_time")) - if modules and pcts: - top = modules[max(range(len(pcts)), key=lambda i: pcts[i])] - msg = msg.replace("{top_module}", str(top)) - ev = _step_by_id(steps, "latest_torch_step") - if ev and "{latest_step}" in msg: - vals = _as_floats(_col_values(ev, "latest_step")) - if vals: - msg = msg.replace("{latest_step}", str(int(vals[0]))) - return msg - - -def evaluate_rules( - rules: Sequence[Mapping[str, Any]], - steps: Sequence[StepEvidence], - params: Optional[Mapping[str, Any]] = None, -) -> List[InterpretFinding]: - """Return findings for rules whose ``when`` clause matches.""" - params = params or {} - out: List[InterpretFinding] = [] - for rule in rules: - when = str(rule.get("when", "")) - if not when: - continue - if rule_matches(when, steps, params): - out.append( - InterpretFinding( - rule_id=str(rule.get("id", "")), - severity=str(rule.get("severity", "info")), - message=_expand_message( - str(rule.get("message", "")), steps, params - ), - ) - ) - return out - - -def evidence_from_dataframe(step_id: str, df: Mapping[str, Any]) -> StepEvidence: - """Build evidence from a tabular dict (column -> list of values).""" - columns = {str(k): list(v) for k, v in df.items()} - row_count = max((len(v) for v in columns.values()), default=0) - return StepEvidence(step_id=step_id, row_count=row_count, columns=columns) diff --git a/python/probing/skills/loader.py b/python/probing/skills/loader.py index cbf49a3a..e56ddee8 100644 --- a/python/probing/skills/loader.py +++ b/python/probing/skills/loader.py @@ -1,128 +1,22 @@ -"""Load and expand probing diagnostic skills (SKILL.md + steps.yaml). +"""Skill discovery helpers — semantics live in Rust (``probing-skills``). -Requires PyYAML: ``pip install pyyaml`` (optional; only needed for skill tooling). +This module keeps lightweight dataclass wrappers and path helpers for Python +tooling. YAML parsing, template expansion, and routing run in Rust via +``probing._core.skills_*``. """ from __future__ import annotations -import re +import json from dataclasses import dataclass, field from pathlib import Path -from typing import Any, Dict, Iterable, List, Mapping, Optional, Sequence, Union +from typing import Any, Dict, List, Mapping, Optional -_PLACEHOLDER = re.compile(r"\{([a-zA-Z_][a-zA-Z0-9_]*)\}") +def _core(): + import probing._core as core -def _yaml_load(text: str) -> Any: - try: - import yaml - except ImportError as e: - raise ImportError( - "Skill loading requires PyYAML. Install with: pip install pyyaml" - ) from e - return yaml.safe_load(text) - - -def skills_root() -> Path: - """Return the highest-priority skills directory (env > project > user > repo > bundled).""" - from probing.skills.paths import skill_roots - - roots = skill_roots() - if roots: - return roots[-1].path - repo = Path(__file__).resolve().parents[3] / "skills" - return repo - - -def _load_catalog_file(root: Path) -> SkillCatalog: - catalog_path = root / "catalog.yaml" - if not catalog_path.is_file(): - raise FileNotFoundError(catalog_path) - data = _yaml_load(catalog_path.read_text(encoding="utf-8")) - entries: List[SkillCatalogEntry] = [] - for p in data.get("skills") or []: - path = p.get("path") or p.get("file", "") - entries.append( - SkillCatalogEntry( - id=str(p["id"]), - path=str(path), - category=str(p.get("category", "")), - priority=int(p.get("priority", 0)), - description=str(p.get("description", "")), - ) - ) - entries.sort(key=lambda e: e.priority) - return SkillCatalog(skills=entries) - - -def _semantic_file(name: str, root: Optional[Path] = None) -> Path: - from probing.skills.paths import skill_roots - - if root is not None: - return root / "semantic" / name - for skill_root in reversed(skill_roots()): - path = skill_root.path / "semantic" / name - if path.is_file(): - return path - return skills_root() / "semantic" / name - - -def load_catalog(root: Optional[Path] = None) -> SkillCatalog: - if root is not None: - return _load_catalog_file(root) - - from probing.skills.paths import skill_roots - - merged: Dict[str, SkillCatalogEntry] = {} - for skill_root in skill_roots(): - try: - catalog = _load_catalog_file(skill_root.path) - except FileNotFoundError: - continue - for entry in catalog.skills: - merged[entry.id] = entry - entries = sorted(merged.values(), key=lambda e: (e.priority, e.id)) - return SkillCatalog(skills=entries) - - -def load_skill(skill_id: str, root: Optional[Path] = None) -> Skill: - if root is not None: - catalog = _load_catalog_file(root) - entry = next((p for p in catalog.skills if p.id == skill_id), None) - if entry is None: - raise KeyError(f"Unknown skill: {skill_id}") - path = root / entry.path - data = _yaml_load(path.read_text(encoding="utf-8")) - return _parse_skill_steps(data, path) - - from probing.skills.paths import resolve_skill_dir, skill_roots - - roots = skill_roots() - skill_dir = resolve_skill_dir(skill_id, roots) - if skill_dir is None: - raise KeyError(f"Unknown skill: {skill_id}") - steps_path = skill_dir / "steps.yaml" - if not steps_path.is_file(): - raise FileNotFoundError( - f"Missing steps.yaml for skill {skill_id}: {steps_path}" - ) - data = _yaml_load(steps_path.read_text(encoding="utf-8")) - return _parse_skill_steps(data, steps_path) - - -def load_semantic_catalog(root: Optional[Path] = None) -> Dict[str, Any]: - path = _semantic_file("tables.yaml", root) - return _yaml_load(path.read_text(encoding="utf-8")) - - -def load_intents(root: Optional[Path] = None) -> Dict[str, Any]: - path = _semantic_file("intents.yaml", root) - return _yaml_load(path.read_text(encoding="utf-8")) - - -def load_pages(root: Optional[Path] = None) -> Dict[str, Any]: - path = _semantic_file("pages.yaml", root) - return _yaml_load(path.read_text(encoding="utf-8")) + return core @dataclass @@ -175,47 +69,94 @@ class SkillCatalog: skills: List[SkillCatalogEntry] -def _parse_skill_steps(data: Mapping[str, Any], path: Path) -> Skill: - meta = data.get("metadata") or {} - spec = data.get("spec") or {} - steps: List[SkillStep] = [] - for raw in spec.get("steps") or []: - steps.append( - SkillStep( - id=str(raw.get("id", "")), - title=str(raw.get("title", "")), - type=str(raw.get("type", "sql")), - sql=raw.get("sql"), - method=raw.get("method"), - path=raw.get("path"), - action=raw.get("action"), - view=raw.get("view"), - on_empty=str(raw.get("on_empty", "skip")), - empty_message=raw.get("empty_message"), - when=raw.get("when"), - platform=raw.get("platform"), - raw=dict(raw), - ) +def skills_root() -> Path: + from probing.skills.paths import skill_roots + + roots = skill_roots() + if roots: + return roots[-1].path + repo = Path(__file__).resolve().parents[3] / "skills" + return repo + + +def load_catalog(root: Optional[Path] = None) -> SkillCatalog: + if root is not None: + raise NotImplementedError( + "load_catalog(root=...) is deprecated; use bundled discovery via Rust" + ) + data = json.loads(_core().skills_catalog()) + entries = [ + SkillCatalogEntry( + id=str(item["id"]), + path=str(item.get("path", "")), + category=str(item.get("category", "")), + priority=int(item.get("priority", 0)), + description=str(item.get("description", "")), ) + for item in data.get("skills") or [] + ] + return SkillCatalog(skills=entries) + + +def load_skill(skill_id: str, root: Optional[Path] = None) -> Skill: + if root is not None: + raise NotImplementedError( + "load_skill(..., root=...) is deprecated; use bundled discovery via Rust" + ) + raw = json.loads(_core().skills_load(skill_id)) + if "error" in raw: + raise KeyError(raw["error"]) + steps = [ + SkillStep( + id=str(s.get("id", "")), + title=str(s.get("title", "")), + type=str(s.get("type", "sql")), + sql=s.get("sql"), + method=s.get("method"), + path=s.get("path"), + action=s.get("action"), + view=s.get("view"), + on_empty=str(s.get("on_empty", "skip")), + empty_message=s.get("empty_message"), + when=s.get("when"), + platform=s.get("platform"), + raw=dict(s), + ) + for s in raw.get("steps") or [] + ] + keywords = raw.get("keywords") or {} + triggers = {"keywords": keywords} return Skill( - id=str(meta.get("id", path.parent.name)), - title=str(meta.get("title", meta.get("id", path.parent.name))), - category=str(meta.get("category", "general")), - tags=list(meta.get("tags") or []), - triggers=dict(meta.get("triggers") or {}), - docs=str(meta.get("docs") or "").strip(), - parameters=list(spec.get("parameters") or []), - requires=dict(spec.get("requires") or {}), + id=str(raw["id"]), + title=str(raw.get("title", raw["id"])), + category=str(raw.get("category", "general")), + tags=list(raw.get("tags") or []), + triggers=triggers, + docs=str(raw.get("docs") or "").strip(), + parameters=list(raw.get("parameters") or []), + requires={}, steps=steps, - interpretation=dict(spec.get("interpretation") or {}), - summary_template=str(spec.get("summary_template") or "").strip(), - next_steps=list(spec.get("next_steps") or []), - variables=dict(spec.get("variables") or {}), - path=path, - metadata=dict(meta), + interpretation=dict(raw.get("interpretation") or {}), + summary_template=str(raw.get("summary_template") or "").strip(), + next_steps=list(raw.get("next_steps") or []), + variables={}, + path=skills_root() / skill_id / "steps.yaml", + metadata={"triggers": triggers}, ) +def load_intents(root: Optional[Path] = None) -> Dict[str, Any]: + if root is not None: + raise NotImplementedError("load_intents(root=...) is deprecated") + return json.loads(_core().skills_intents()) + + +def load_pages(root: Optional[Path] = None) -> Dict[str, Any]: + if root is not None: + raise NotImplementedError("load_pages(root=...) is deprecated") + return json.loads(_core().skills_pages()) + + def default_parameters(skill: Skill) -> Dict[str, Any]: out: Dict[str, Any] = {} for p in skill.parameters: @@ -225,146 +166,69 @@ def default_parameters(skill: Skill) -> Dict[str, Any]: return out -def derived_variables(params: Mapping[str, Any]) -> Dict[str, str]: - use_global = bool(params.get("use_global", False)) - # Torch-API-level tracer (coarse fallback, Python wall-clock) - comm = "global.python.comm_collective" if use_global else "python.comm_collective" - # NCCL profiler plugin (precise, NCCL-native events) - nccl_proxy = "global.nccl.proxy_ops" if use_global else "nccl.proxy_ops" - nccl_coll = "global.nccl.coll_perf" if use_global else "nccl.coll_perf" - nccl_inflight = "global.nccl.inflight_ops" if use_global else "nccl.inflight_ops" - net_qp = "global.nccl.net_qp" if use_global else "nccl.net_qp" - # PyTorch Flight Recorder bridge (watchdog / desync) - fr = ( - "global.python.torch_nccl_flight_record" - if use_global - else "python.torch_nccl_flight_record" - ) - fr_status = ( - "global.python.torch_nccl_pg_status" - if use_global - else "python.torch_nccl_pg_status" - ) - return { - "comm_table": comm, - "table_comm": comm, - "nccl_proxy_table": nccl_proxy, - "nccl_coll_table": nccl_coll, - "nccl_inflight_table": nccl_inflight, - "net_qp_table": net_qp, - "fr_table": fr, - "fr_status_table": fr_status, - "global_prefix": "global." if use_global else "", - } - - -def _expand_string(template: str, ctx: Mapping[str, Any]) -> str: - def repl(match: re.Match[str]) -> str: - key = match.group(1) - if key not in ctx: - raise KeyError(f"Missing skill parameter or variable: {key}") - return str(ctx[key]) - - return _PLACEHOLDER.sub(repl, template) - - def expand_skill( skill: Skill, overrides: Optional[Mapping[str, Any]] = None, ) -> List[SkillStep]: - """Return steps with ``{param}`` placeholders expanded.""" - ctx: Dict[str, Any] = {} - ctx.update(default_parameters(skill)) + """Expand steps via Rust ``skills_plan`` (SSOT).""" + params = default_parameters(skill) if overrides: - ctx.update(dict(overrides)) - ctx.update(derived_variables(ctx)) - for k, v in skill.variables.items(): - ctx[k] = _expand_string(str(v), ctx) - - expanded: List[SkillStep] = [] - for step in skill.steps: - new = SkillStep( - id=step.id, - title=step.title, - type=step.type, - sql=_expand_string(step.sql, ctx) if step.sql else None, - method=step.method, - path=_expand_string(step.path, ctx) if step.path else None, - action=step.action, - view=step.view, - on_empty=step.on_empty, - empty_message=step.empty_message, - when=step.when, - platform=step.platform, - raw=step.raw, + params.update(dict(overrides)) + plan = json.loads(_core().skills_plan(skill.id, json.dumps(params))) + out: List[SkillStep] = [] + for raw in plan.get("steps") or []: + out.append( + SkillStep( + id=str(raw.get("id", "")), + title=str(raw.get("title", "")), + type=str(raw.get("type", "sql")), + sql=raw.get("sql"), + method=raw.get("method"), + path=raw.get("path"), + action=raw.get("action"), + view=raw.get("view"), + on_empty=str(raw.get("on_empty", "skip")), + empty_message=raw.get("empty_message"), + when=raw.get("when"), + platform=raw.get("platform"), + raw=dict(raw), + ) ) - expanded.append(new) - return expanded + return out -def _collect_keywords(skill: Skill) -> List[str]: - words: List[str] = [] - words.extend(skill.tags) - triggers = skill.triggers.get("keywords") or {} - if isinstance(triggers, dict): - for vals in triggers.values(): - if isinstance(vals, list): - words.extend(str(v).lower() for v in vals) - elif isinstance(triggers, list): - words.extend(str(v).lower() for v in triggers) - return words +def build_context( + skill: Skill, + overrides: Optional[Mapping[str, Any]] = None, +) -> Dict[str, str]: + plan = json.loads(_core().skills_plan(skill.id, json.dumps(dict(overrides or {})))) + params = plan.get("parameters") or {} + return {str(k): str(v) for k, v in params.items()} -def _match_intents( - query: str, root: Optional[Path] = None, limit: int = 10 -) -> List[str]: - q = query.lower() - data = load_intents(root) - scored: List[tuple[int, str]] = [] - for intent in (data.get("intents") or {}).values(): - keywords = intent.get("keywords") or [] - hits = sum(1 for kw in keywords if str(kw).lower() in q) - if hits: - ids = intent.get("skills") or [] - for sid in ids: - scored.append((hits, str(sid))) - scored.sort(key=lambda x: (-x[0], x[1])) - seen: set[str] = set() - out: List[str] = [] - for _, sid in scored: - if sid not in seen: - seen.add(sid) - out.append(sid) - if len(out) >= limit: - break +def expand_template(template: str, ctx: Mapping[str, str]) -> str: + out = template + for key, val in ctx.items(): + out = out.replace(f"{{{key}}}", str(val)) return out +def derived_variables(params: Mapping[str, Any]) -> Dict[str, str]: + """Deprecated — kept for tests importing the name; logic is Rust-only.""" + raise NotImplementedError("derived_variables() moved to probing-skills (Rust SSOT)") + + def match_skills( query: str, root: Optional[Path] = None, limit: int = 3, ) -> List[str]: - """Rank skill ids by intent + keyword overlap with *query*.""" - q = query.lower() - catalog = load_catalog(root) - scores: Dict[str, int] = {} - - for rank, sid in enumerate(_match_intents(query, root, limit=10)): - scores[sid] = scores.get(sid, 0) + 3 * (10 - rank) - - for entry in catalog.skills: - skill = load_skill(entry.id, root) - kw_score = sum(1 for kw in _collect_keywords(skill) if kw in q) - if kw_score: - scores[entry.id] = scores.get(entry.id, 0) + kw_score - - ranked = sorted(scores.items(), key=lambda x: (-x[1], x[0])) - return [sid for sid, _ in ranked[:limit]] + if root is not None: + raise NotImplementedError("match_skills(root=...) is deprecated") + return json.loads(_core().skills_match(query, limit)) def validate_skill(skill: Skill) -> List[str]: - """Return a list of validation warnings (empty if ok).""" warnings: List[str] = [] if not skill.steps: warnings.append(f"{skill.id}: no steps defined") @@ -375,17 +239,6 @@ def validate_skill(skill: Skill) -> List[str]: seen_ids.add(step.id) if step.type == "sql" and not step.sql: warnings.append(f"{skill.id}.{step.id}: sql step missing sql") - if step.type == "sql" and step.sql: - upper = step.sql.strip().upper() - if any( - upper.startswith(k) - for k in ("INSERT", "UPDATE", "DELETE", "DROP", "ALTER", "SET ") - ): - warnings.append(f"{skill.id}.{step.id}: sql step should be read-only") - try: - expand_skill(skill) - except KeyError as e: - warnings.append(f"{skill.id}.{step.id}: {e}") skill_md = skill.path.parent / "SKILL.md" if not skill_md.is_file(): warnings.append(f"{skill.id}: missing SKILL.md") @@ -393,8 +246,8 @@ def validate_skill(skill: Skill) -> List[str]: def validate_all(root: Optional[Path] = None) -> List[str]: - all_warnings: List[str] = [] catalog = load_catalog(root) + all_warnings: List[str] = [] for entry in catalog.skills: skill = load_skill(entry.id, root) all_warnings.extend(validate_skill(skill)) diff --git a/python/probing/skills/paths.py b/python/probing/skills/paths.py index c0174522..60bd6ef0 100644 --- a/python/probing/skills/paths.py +++ b/python/probing/skills/paths.py @@ -1,18 +1,27 @@ -"""Agent skill directory discovery (Cursor, Claude Code, Codex).""" +"""Agent skill install paths and re-exports from ``probing.extensions``.""" from __future__ import annotations -import os import shutil from dataclasses import dataclass from pathlib import Path from typing import Dict, Iterable, List, Optional, Sequence +from probing.extensions import ( + SkillRoot, + bundled_skills_dir, + default_install_source, + find_repo_root, + repo_skills_dir, + resolve_skill_dir, + skill_root_bundled, + skill_roots, +) + PROBING_PROJECT_SKILLS = ".probing/skills" PROBING_USER_SKILLS = ".probing/skills" REPO_SKILLS_DIRNAME = "skills" -# Where each agent runtime loads project/user skills (Agent Skills open standard). AGENT_PROJECT_SKILLS: Dict[str, str] = { "cursor": ".cursor/skills", "claude": ".claude/skills", @@ -36,144 +45,19 @@ ALL_AGENTS = ("cursor", "claude", "codex") -@dataclass(frozen=True) -class SkillRoot: - """A directory tree that contains skill folders and optionally catalog.yaml.""" - - path: Path - label: str - - @dataclass(frozen=True) class AgentInstallTarget: - """A directory where probing skills should be installed for an agent runtime.""" - agent: str scope: str # "project" | "user" skills_dir: Path reason: str -def find_repo_root(start: Optional[Path] = None) -> Optional[Path]: - """Find probing repository root (contains ``skills/catalog.yaml`` + ``pyproject.toml``).""" - start = (start or Path.cwd()).resolve() - for directory in (start, *start.parents): - if (directory / REPO_SKILLS_DIRNAME / "catalog.yaml").is_file() and ( - directory / "pyproject.toml" - ).is_file(): - return directory - if directory.parent == directory: - break - # Source checkout: python/probing/skills/paths.py → repo root is parents[3] - pkg_root = Path(__file__).resolve().parents[3] - if (pkg_root / REPO_SKILLS_DIRNAME / "catalog.yaml").is_file(): - return pkg_root - return None - - -def repo_skills_dir(start: Optional[Path] = None) -> Optional[Path]: - """Top-level ``skills/`` in a probing checkout (authoring + agent install source).""" - root = find_repo_root(start) - if root is None: - return None - candidate = root / REPO_SKILLS_DIRNAME - return candidate if (candidate / "catalog.yaml").is_file() else None - - -def bundled_skills_dir() -> Optional[Path]: - """Skills copied into the wheel at ``python/probing/bundled_skills/`` (release builds).""" - root = _package_dir() / "bundled_skills" - if root.is_dir() and (root / "catalog.yaml").is_file(): - return root - return _resource_dir("bundled_skills", "catalog.yaml") - - -def _package_dir() -> Path: - return Path(__file__).resolve().parent.parent - - -def _resource_dir(name: str, marker: str) -> Optional[Path]: - try: - from importlib.resources import as_file, files - - bundle = files("probing") / name - if not (bundle / marker).is_file(): - return None - with as_file(bundle) as path: - return Path(path) - except (TypeError, ModuleNotFoundError, FileNotFoundError, OSError): - return None - - -def user_skills_dir() -> Path: - return Path.home() / PROBING_USER_SKILLS - - -def project_skills_dir(start: Optional[Path] = None) -> Optional[Path]: - start = start or Path.cwd() - for directory in (start, *start.parents): - candidate = directory / PROBING_PROJECT_SKILLS - if candidate.is_dir(): - return candidate - if directory.parent == directory: - break - return None - - -def env_skills_dir() -> Optional[Path]: - raw = os.environ.get("PROBING_SKILLS_DIR") - if not raw: - return None - path = Path(raw).expanduser().resolve() - return path if path.is_dir() else None - - -def skill_roots(start: Optional[Path] = None) -> List[SkillRoot]: - """Return skill roots from lowest to highest priority (later overrides earlier).""" - roots: List[SkillRoot] = [] - - bundled = bundled_skills_dir() - if bundled is not None: - roots.append(SkillRoot(bundled, "bundled")) - - repo = repo_skills_dir(start) - if repo is not None and not any(r.path.resolve() == repo.resolve() for r in roots): - roots.append(SkillRoot(repo, "repo")) - - user = user_skills_dir() - if user.is_dir(): - roots.append(SkillRoot(user, "user")) - - project = project_skills_dir(start) - if project is not None: - roots.append(SkillRoot(project, "project")) - - extra = env_skills_dir() - if extra is not None: - roots.append(SkillRoot(extra, "env")) - - return roots - - -def default_install_source(start: Optional[Path] = None) -> Path: - """Directory copied by ``probing skill install`` / ``skills/install.sh``.""" - repo = repo_skills_dir(start) - if repo is not None: - return repo - bundled = bundled_skills_dir() - if bundled is not None: - return bundled - raise FileNotFoundError( - "No skills/ directory found. Run from the probing repo or install probing from a wheel." - ) - - def _binary_available(name: str) -> bool: return shutil.which(name) is not None def detect_agent_presence(start: Optional[Path] = None) -> Dict[str, bool]: - """Return which agent runtimes appear to be in use for *start* / home.""" start = (start or Path.cwd()).resolve() home = Path.home() presence: Dict[str, bool] = {} @@ -210,7 +94,6 @@ def detect_agent_install_targets( agents: Optional[Sequence[str]] = None, force: bool = False, ) -> List[AgentInstallTarget]: - """Resolve install destinations for Cursor / Claude Code / Codex.""" start = (start or Path.cwd()).resolve() requested = [a for a in (agents or ALL_AGENTS) if a in ALL_AGENTS] presence = detect_agent_presence(start) @@ -265,26 +148,25 @@ def iter_skill_ids_in_root(root: Path) -> Iterable[str]: yield child.name -def resolve_skill_dir(skill_id: str, roots: Sequence[SkillRoot]) -> Optional[Path]: - for root in reversed(roots): - catalog_path = None - catalog_file = root.path / "catalog.yaml" - if catalog_file.is_file(): - try: - import yaml - except ImportError: - yaml = None # type: ignore - if yaml is not None: - data = yaml.safe_load(catalog_file.read_text(encoding="utf-8")) or {} - for entry in data.get("skills") or []: - if str(entry.get("id")) == skill_id: - rel = entry.get("path") or entry.get("file") - if rel: - catalog_path = root.path / str(rel) - break - if catalog_path is not None and catalog_path.is_file(): - return catalog_path.parent - direct = root.path / skill_id - if (direct / "steps.yaml").is_file() or (direct / "SKILL.md").is_file(): - return direct - return None +__all__ = [ + "AGENT_BINARIES", + "AGENT_PROJECT_MARKERS", + "AGENT_PROJECT_SKILLS", + "AGENT_USER_SKILLS", + "ALL_AGENTS", + "AgentInstallTarget", + "PROBING_PROJECT_SKILLS", + "PROBING_USER_SKILLS", + "REPO_SKILLS_DIRNAME", + "SkillRoot", + "bundled_skills_dir", + "default_install_source", + "detect_agent_install_targets", + "detect_agent_presence", + "find_repo_root", + "iter_skill_ids_in_root", + "repo_skills_dir", + "resolve_skill_dir", + "skill_root_bundled", + "skill_roots", +] diff --git a/python/probing/skills/serialize.py b/python/probing/skills/serialize.py new file mode 100644 index 00000000..a0b35fcd --- /dev/null +++ b/python/probing/skills/serialize.py @@ -0,0 +1,48 @@ +"""JSON serialization helpers for skill HTTP APIs (Rust SSOT). + +Kept for backward-compatible imports; handlers should call ``probing._core`` directly. +""" + +from __future__ import annotations + +import json +from typing import Any, Dict + +import probing._core as core + +from probing.skills.loader import Skill, SkillCatalog, SkillCatalogEntry, SkillStep + + +def skill_step_to_dict(step: SkillStep) -> Dict[str, Any]: + return { + "id": step.id, + "title": step.title, + "type": step.type, + "sql": step.sql, + "method": step.method, + "path": step.path, + "action": step.action, + "view": step.view, + "on_empty": step.on_empty, + "empty_message": step.empty_message, + "when": step.when, + "cluster": step.raw.get("cluster"), + } + + +def skill_to_dict(skill: Skill) -> Dict[str, Any]: + return json.loads(core.skills_load(skill.id)) + + +def catalog_entry_to_dict(entry: SkillCatalogEntry) -> Dict[str, Any]: + return { + "id": entry.id, + "path": entry.path, + "category": entry.category, + "priority": entry.priority, + "description": entry.description, + } + + +def catalog_to_dict(catalog: SkillCatalog) -> Dict[str, Any]: + return {"skills": [catalog_entry_to_dict(e) for e in catalog.skills]} diff --git a/python/probing/skills/tools.py b/python/probing/skills/tools.py index df9f04f6..30107b2b 100644 --- a/python/probing/skills/tools.py +++ b/python/probing/skills/tools.py @@ -1,22 +1,16 @@ -"""Agent-callable skill tools (list / run without prior install).""" +"""Agent-callable skill discovery tools (list / plan without prior install). + +Skill **execution** and **semantics** live in Rust (``probing-skills``): CLI, Web +WASM, MCP, and these helpers call the shared runtime via ``probing._core``. +""" from __future__ import annotations import json -import shutil -import subprocess from dataclasses import asdict, dataclass -from typing import Any, Dict, List, Mapping, Optional, Sequence +from typing import Any, Dict, List, Mapping, Optional -from probing.skills.loader import ( - Skill, - SkillStep, - default_parameters, - expand_skill, - load_catalog, - load_skill, - match_skills, -) +import probing._core as core @dataclass @@ -46,54 +40,22 @@ def to_dict(self) -> Dict[str, Any]: return asdict(self) -def _step_to_dict(step: SkillStep) -> Dict[str, Any]: - return { - "id": step.id, - "title": step.title, - "type": step.type, - "sql": step.sql, - "method": step.method, - "path": step.path, - "action": step.action, - "view": step.view, - "on_empty": step.on_empty, - "when": step.when, - } - - def list_skills(*, query: Optional[str] = None, limit: int = 20) -> List[SkillSummary]: - """List bundled and installed skills (no ``probing skill install`` required).""" - catalog = load_catalog() - summaries: List[SkillSummary] = [] - for entry in catalog.skills: - title = entry.id - try: - skill = load_skill(entry.id) - title = skill.title - except KeyError: - pass - summaries.append( - SkillSummary( - id=entry.id, - category=entry.category, - description=entry.description, - priority=entry.priority, - title=title, - ) + raw = json.loads(core.skills_list(query, limit)) + return [ + SkillSummary( + id=str(item["id"]), + category=str(item.get("category", "")), + description=str(item.get("description", "")), + priority=int(item.get("priority", 0)), + title=str(item.get("title", item["id"])), ) - if query: - ranked = match_skills(query, limit=limit) - by_id = {s.id: s for s in summaries} - ordered = [by_id[sid] for sid in ranked if sid in by_id] - if ordered: - return ordered[:limit] - return summaries[:limit] + for item in raw + ] def list_skills_json(*, query: Optional[str] = None, limit: int = 20) -> str: - return json.dumps( - [s.to_dict() for s in list_skills(query=query, limit=limit)], indent=2 - ) + return core.skills_list(query, limit) def plan_skill_run( @@ -102,74 +64,23 @@ def plan_skill_run( *, target: Optional[str] = None, ) -> SkillRunPlan: - """Expand a skill into executable steps (uses bundled skills by default).""" - skill = load_skill(skill_id) - merged = default_parameters(skill) - if params: - merged.update(dict(params)) - steps = expand_skill(skill, merged) - cli = _format_cli_command(skill_id, merged, target) + _ = target + payload = params or {} + plan = json.loads(core.skills_plan(skill_id, json.dumps(dict(payload)))) + skill = json.loads(core.skills_load(skill_id)) + cli = _format_cli_command(skill_id, plan.get("parameters") or payload, target) return SkillRunPlan( - skill_id=skill.id, - title=skill.title, - docs=skill.docs, - parameters=merged, - steps=[_step_to_dict(s) for s in steps], - summary_template=skill.summary_template, - next_steps=list(skill.next_steps), + skill_id=str(plan.get("skill_id", skill_id)), + title=str(plan.get("title", skill.get("title", skill_id))), + docs=str(skill.get("docs", "")), + parameters=dict(plan.get("parameters") or {}), + steps=list(plan.get("steps") or []), + summary_template=str(skill.get("summary_template", "")), + next_steps=list(skill.get("next_steps") or []), cli_command=cli, ) -def run_skill( - skill_id: str, - *, - target: Optional[str] = None, - params: Optional[Mapping[str, Any]] = None, - global_fanout: Optional[bool] = None, - execute: bool = True, -) -> Dict[str, Any]: - """Run or plan a skill. - - When *target* is set and *execute* is true, invokes the ``probing`` CLI. - Otherwise returns an expanded step plan for the agent to follow. - """ - merged: Dict[str, Any] = dict(params or {}) - if global_fanout is not None: - merged["use_global"] = global_fanout - - if target and execute: - probing = shutil.which("probing") - if probing is None: - plan = plan_skill_run(skill_id, merged, target=target) - return { - "status": "plan_only", - "reason": "probing CLI not found on PATH", - "plan": plan.to_dict(), - } - cmd = [probing] - if target: - cmd.extend(["-t", target]) - cmd.extend(["skill", "run", skill_id]) - for key, value in merged.items(): - cmd.extend(["--set", f"{key}={value}"]) - if global_fanout is True: - cmd.append("--global") - elif global_fanout is False: - cmd.append("--local") - proc = subprocess.run(cmd, capture_output=True, text=True, check=False) - return { - "status": "ok" if proc.returncode == 0 else "error", - "returncode": proc.returncode, - "stdout": proc.stdout, - "stderr": proc.stderr, - "command": " ".join(cmd), - } - - plan = plan_skill_run(skill_id, merged, target=target) - return {"status": "plan", "plan": plan.to_dict()} - - def _format_cli_command( skill_id: str, params: Mapping[str, Any], @@ -182,23 +93,3 @@ def _format_cli_command( for key, value in sorted(params.items()): parts.extend(["--set", f"{key}={value}"]) return " ".join(parts) - - -def run_skill_json( - skill_id: str, - *, - target: Optional[str] = None, - params: Optional[Mapping[str, Any]] = None, - global_fanout: Optional[bool] = None, - execute: bool = True, -) -> str: - return json.dumps( - run_skill( - skill_id, - target=target, - params=params, - global_fanout=global_fanout, - execute=execute, - ), - indent=2, - ) diff --git a/python/probing/web_assets.py b/python/probing/web_assets.py index c7abd9e7..359296bb 100644 --- a/python/probing/web_assets.py +++ b/python/probing/web_assets.py @@ -9,26 +9,36 @@ _BUNDLED_DIRNAME = "bundled_web" -def bundled_web_dir() -> Path | None: - """Wheel / install tree: ``python/probing/bundled_web/`` (bundled by ``make wheel``).""" +def _package_dir() -> Path: + return Path(__file__).resolve().parent + + +def _bundled_web_candidates() -> list[Path]: + """``dx bundle`` emits ``bundled_web/public/``; legacy wheels may be flat.""" root = _package_dir() / _BUNDLED_DIRNAME - if (root / "index.html").is_file(): - return root - return _resource_dir(_BUNDLED_DIRNAME, "index.html") + return [root / "public", root] + + +def bundled_web_dir() -> Path | None: + """Wheel / install tree: ``python/probing/bundled_web[/public]``.""" + for candidate in _bundled_web_candidates(): + if (candidate / "index.html").is_file(): + return candidate + for rel in ("bundled_web/public", "bundled_web"): + root = _resource_dir(rel, "index.html") + if root is not None: + return root + return None def dev_web_dir() -> Path | None: - """Editable checkout: repo ``web/dist/``.""" + """Editable checkout: ``web/dist`` symlink → ``bundled_web/public``.""" if _running_from_installed_wheel(): return None root = _repo_root_from_editable() / "web" / "dist" if (root / "index.html").is_file(): return root - return None - - -def _package_dir() -> Path: - return Path(__file__).resolve().parent + return bundled_web_dir() def _running_from_installed_wheel() -> bool: @@ -40,11 +50,13 @@ def _repo_root_from_editable() -> Path: return Path(__file__).resolve().parents[2] -def _resource_dir(name: str, marker: str) -> Path | None: +def _resource_dir(rel: str, marker: str) -> Path | None: try: from importlib.resources import as_file, files - bundle = files("probing") / name + bundle = files("probing") + for part in rel.split("/"): + bundle = bundle / part if not (bundle / marker).is_file(): return None with as_file(bundle) as path: @@ -74,17 +86,10 @@ def resolve_web_assets_root() -> Path | None: return root return None - # Editable checkout: prefer freshly built ``web/dist`` over stale ``bundled_web``. - if not _running_from_installed_wheel(): - dev = dev_web_dir() - if dev: - if _looks_like_built_ui(dev): - return dev - - bundled = bundled_web_dir() - if bundled: - if _looks_like_built_ui(bundled): - return bundled + for getter in (dev_web_dir, bundled_web_dir): + root = getter() + if root and _looks_like_built_ui(root): + return root return dev_web_dir() diff --git a/skills b/skills new file mode 120000 index 00000000..c1c5018a --- /dev/null +++ b/skills @@ -0,0 +1 @@ +python/probing/bundled_skills \ No newline at end of file diff --git a/skills/README.md b/skills/README.md deleted file mode 100644 index eb2e2736..00000000 --- a/skills/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# Diagnostic skills (authoring) - -**This is the source of truth for skill *data*.** Edit here — not under `python/probing/`. - -Each skill is a folder with **`SKILL.md`** (when/how, for agents) and optional **`steps.yaml`** -(deterministic steps for `probing skill run` and the Web Investigate agent). - -## Other skill-related paths - -| Path | What it is | -|------|------------| -| **`skills/`** (here) | Authoring + `./install.sh` source; also embedded in Web/Rust via `include_str!` | -| **`python/probing/skills/`** | Python **code** — loader, install, CLI helpers (`probing.skills.*`) | -| **`python/probing/_skills/`** | **Wheel bundle** — generated by `make wheel` | - -## Layout - -``` -skills/ -├── catalog.yaml # index (id, category, path) -├── semantic/ # intents, pages, table semantics (routing) -├── install.sh # copy into .cursor/.claude/.agents skill dirs -└── health_overview/ - ├── SKILL.md - └── steps.yaml -``` - -## Install into Cursor / Claude / Codex - -```bash -./skills/install.sh -# or: probing skill install [--user] [--force] -``` - -| Agent | Project | User (`--user`) | -|-------|---------|-----------------| -| Cursor | `.cursor/skills/` | `~/.cursor/skills/` | -| Claude Code | `.claude/skills/` | `~/.claude/skills/` | -| Codex | `.agents/skills/` | `~/.agents/skills/` | - -## Run - -```bash -probing skill list -probing -t skill run health_overview -probing -t skill run slow_rank --set step_window=30 --global -``` - -Validate after edits: - -```bash -python -m probing.skills validate -make wheel # refresh wheel bundle when cutting a release -``` - -## Add a skill - -1. `skills/my_skill/SKILL.md` — frontmatter with `name` + `description` -2. `skills/my_skill/steps.yaml` — optional executable steps -3. Register in `catalog.yaml` -4. `python -m probing.skills validate` -5. `./skills/install.sh` — refresh agent directories - -See [AGENTS.md](../AGENTS.md) and [docs/src/design/extensibility.md](../docs/src/design/extensibility.md). diff --git a/skills/catalog.yaml b/skills/catalog.yaml deleted file mode 100644 index 875e8932..00000000 --- a/skills/catalog.yaml +++ /dev/null @@ -1,250 +0,0 @@ -# Skill catalog — index for CLI, Python loader, and Web Agent. -apiVersion: probing.dev/v1 -kind: Catalog -categories: - triage: - label: 分诊 / Triage - description: First look when unsure where to start. - reliability: - label: 可靠性 / Reliability - description: Stalls, hangs, deadlocks. - distributed: - label: 分布式 / Distributed - description: Ranks, collectives, stragglers. - performance: - label: 性能 / Performance - description: Module hotspots and step regressions. - memory: - label: 内存 / Memory - description: GPU/VRAM pressure and leaks. - sre: - label: SRE / Runbook - description: On-call workflows that automate manual training triage. -skills: -- id: health_overview - category: triage - priority: 0 - entry: true - description: 'One-shot health check: CPU, GPU, tables, recent training activity' - tables: - - cpu.utilization - - gpu.utilization - - python.torch_trace - - cluster.nodes - pages: - - dashboard - - agent - - analytics - related: - - module_bottleneck - - training_hang - - memory_leak - - crash_triage - - job_health - path: health_overview/steps.yaml -- id: job_health - category: triage - priority: 1 - entry: true - description: 'Job-level health — cluster alive, step lag, slowdown proxy, comm trend' - tables: - - cluster.nodes - - python.comm_collective - - global.python.comm_collective - - python.trace_event - pages: - - training - - cluster - - agent - - analytics - related: - - health_overview - - persistent_straggler - - slow_rank - - training_hang - path: job_health/steps.yaml -- id: crash_triage - category: triage - priority: 1 - entry: true - description: Crash triage — grep PROBING CRASH in logs; read spill JSON files - tables: [] - pages: - - agent - related: - - health_overview - - training_hang - path: crash_triage/steps.yaml -- id: training_hang - category: reliability - priority: 1 - description: Training stalled — capture stacks and thread/blocking hints - tables: - - python.backtrace - - cpu.utilization - - python.trace_event - - python.comm_collective - pages: - - stacks - - spans - related: - - slow_rank - - module_bottleneck - path: training_hang/steps.yaml -- id: slow_rank - category: distributed - priority: 2 - description: Find straggler ranks via collective latency imbalance - tables: - - python.comm_collective - - global.python.comm_collective - pages: - - training - - cluster - - analytics - related: - - comm_bottleneck - - nccl_culprit_victim - - gpu_pressure - - training_hang - - persistent_straggler - - job_health - path: slow_rank/steps.yaml -- id: persistent_straggler - category: distributed - priority: 2 - description: 'Persistent straggler — worst_fraction across steps (chronic slow rank)' - tables: - - python.comm_collective - - global.python.comm_collective - pages: - - training - - cluster - - analytics - related: - - slow_rank - - job_health - - nccl_culprit_victim - - gpu_pressure - path: persistent_straggler/steps.yaml -- id: memory_leak - category: memory - priority: 3 - description: Detect monotonic GPU memory growth across training steps - tables: - - python.torch_trace - - gpu.utilization - pages: - - profiling/torch - related: - - gpu_pressure - - module_bottleneck - path: memory_leak/steps.yaml -- id: module_bottleneck - category: performance - priority: 4 - description: Find slowest PyTorch modules in recent steps - tables: - - python.torch_trace - pages: - - profiling/torch - - training - related: - - slow_rank - - comm_bottleneck - - memory_leak - path: module_bottleneck/steps.yaml -- id: comm_bottleneck - category: distributed - priority: 5 - description: Rank collective ops by total and p99 latency - tables: - - nccl.coll_perf - - nccl.proxy_ops - - python.comm_collective - - rdma.mlx_hca - pages: - - training - - cluster - - analytics - - spans - related: - - slow_rank - - nccl_culprit_victim - path: comm_bottleneck/steps.yaml -- id: gpu_pressure - category: memory - priority: 6 - description: GPU memory and utilization headroom - tables: - - gpu.utilization - - gpu.devices - - python.torch_trace - pages: - - dashboard - related: - - memory_leak - - slow_rank - path: gpu_pressure/steps.yaml -- id: nccl_culprit_victim - category: distributed - priority: 7 - description: NCCL proxy wait decomposition — culprit (send_gpu_wait) vs victim (recv_wait) - tables: - - nccl.proxy_ops - - nccl.net_qp - - global.nccl.proxy_ops - pages: - - training - - cluster - - analytics - related: - - slow_rank - - comm_bottleneck - path: nccl_culprit_victim/steps.yaml -- id: watchdog_timeout - category: distributed - priority: 8 - description: NCCL watchdog timeout diagnosis with PyTorch Flight Recorder sequence alignment - tables: - - python.torch_nccl_flight_record - - python.torch_nccl_pg_status - - global.python.torch_nccl_flight_record - pages: - - training - - cluster - - analytics - - agent - related: - - training_hang - - comm_bottleneck - - nccl_culprit_victim - path: watchdog_timeout/steps.yaml -- id: sre_triage - category: sre - priority: 9 - entry: true - description: SRE first-response triage for distributed training incidents - tables: - - cluster.nodes - - cpu.utilization - - gpu.utilization - - python.comm_collective - - python.torch_nccl_flight_record - - nccl.proxy_ops - - rdma.mlx_hca - - process.kmsg - pages: - - dashboard - - training - - cluster - - agent - related: - - health_overview - - job_health - - training_hang - - watchdog_timeout - - comm_bottleneck - - nccl_culprit_victim - - gpu_pressure - path: sre_triage/steps.yaml diff --git a/skills/comm_bottleneck/SKILL.md b/skills/comm_bottleneck/SKILL.md deleted file mode 100644 index 64100bdb..00000000 --- a/skills/comm_bottleneck/SKILL.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -name: comm_bottleneck -description: > - Rank collective ops by total and p99 latency -category: distributed -tables: [nccl.coll_perf, nccl.proxy_ops, python.comm_collective, rdma.mlx_hca] -tags: [NCCL, collective, communication, 通信, all_reduce] -keywords: - en: ['communication slow', 'NCCL', 'collective', 'comm bottleneck'] - zh: ['通信慢', 'NCCL', 'all_reduce', '通信瓶颈', '带宽'] -parameters: - step_window: { type: integer, default: 50 } - use_global: { type: boolean, default: True } ---- - -# Communication bottleneck - -按 collective op 聚合延迟与传输量,定位通信热点。 -适用于「计算不慢但 step 时间长」或「通信占比高」的场景。 - -## 数据层次(勿混淆计时语义) - -| 层 | 表 | 计时 | -|----|----|------| -| NCCL profiler 插件(**优先**) | `nccl.coll_perf`、`nccl.proxy_ops` | NCCL 原生事件,执行时间/带宽精准(见 `timing_source`) | -| Torch API 层插桩(回退) | `python.comm_collective` | Python 墙钟,launch 层粗粒度;独有 `global_step` 上下文 | - -NCCL 插件启用时 Torch 侧插桩默认关闭(`probing.torch.collective.enable=1` 可强制同开)。 - -## Parameters - -- `step_window` (integer, default `50`): -- `use_global` (boolean, default `True`): - -## Related skills - -- all_reduce 慢 → 检查 bucket 大小、overlap、FP16 compress -- 有 `nccl.proxy_ops` → skill: `nccl_culprit_victim`(culprit/victim 归因) -- RoCE 拥塞 → 查 rdma.mlx_hca 与交换机 ECN 配置 diff --git a/skills/comm_bottleneck/steps.yaml b/skills/comm_bottleneck/steps.yaml deleted file mode 100644 index b4c06d3b..00000000 --- a/skills/comm_bottleneck/steps.yaml +++ /dev/null @@ -1,171 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: comm_bottleneck - title: "通信瓶颈分析" - title_en: "Communication bottleneck" - category: distributed - tags: [NCCL, collective, communication, 通信, all_reduce] - triggers: - keywords: - zh: ["通信慢", "NCCL", "all_reduce", "通信瓶颈", "带宽"] - en: ["communication slow", "NCCL", "collective", "comm bottleneck"] - docs: | - 按 collective op 聚合延迟与传输量,定位通信热点。 - 适用于「计算不慢但 step 时间长」或「通信占比高」的场景。 - - 数据分两层,勿混淆计时语义: - - nccl.coll_perf / nccl.proxy_ops(NCCL profiler 插件):NCCL 原生事件, - 执行时间与带宽精准,优先采信; - - python.comm_collective(Torch API 层插桩):Python 墙钟,仅 launch 层 - 粗粒度,插件不可用时的回退,胜在带训练步(global_step)上下文。 - -spec: - parameters: - - name: step_window - type: integer - default: 50 - - name: use_global - type: boolean - default: true - - requires: - any_tables: - - nccl.coll_perf - - nccl.proxy_ops - - python.comm_collective - - steps: - - id: nccl_coll_bw - title: "NCCL 精准带宽 (coll_perf, 按 op/消息大小)" - type: sql - sql: | - SELECT - coll_func, - msg_size_bytes, - timing_source, - count(*) AS ops, - avg(algobw_gbps) AS avg_gbps, - min(algobw_gbps) AS min_gbps, - avg(exec_time_ns) / 1e6 AS avg_exec_ms - FROM {nccl_coll_table} - GROUP BY coll_func, msg_size_bytes, timing_source - ORDER BY avg_gbps ASC - LIMIT 15 - on_empty: skip - empty_message: "无 nccl.coll_perf — 需 NCCL profiler 插件;以下退回 Torch API 层粗粒度数据" - - - id: op_summary - title: "各 collective op 统计 (Torch API 层, 粗粒度)" - type: sql - sql: | - SELECT - op, - count(*) AS calls, - avg(duration_ms) AS avg_ms, - max(duration_ms) AS p100_ms, - sum(bytes) AS total_bytes, - avg(bytes) AS avg_bytes - FROM {table_comm} - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM {table_comm} - ) - GROUP BY op - ORDER BY sum(duration_ms) DESC - on_empty: skip - empty_message: "无 comm_collective 数据(NCCL 插件启用时 Torch 侧插桩默认关闭,属预期)" - - - id: op_by_step - title: "每 step 通信总耗时 (Torch API 层)" - type: sql - sql: | - SELECT - global_step, - sum(duration_ms) AS comm_ms, - count(*) AS calls, - sum(bytes) AS bytes - FROM {table_comm} - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM {table_comm} - ) - GROUP BY global_step - ORDER BY global_step - on_empty: skip - - - id: slowest_calls - title: "最慢的 collective 调用 (Torch API 层)" - type: sql - sql: | - SELECT global_step, rank, op, duration_ms, bytes, tensor_shape - FROM {table_comm} - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM {table_comm} - ) - ORDER BY duration_ms DESC - LIMIT 20 - on_empty: skip - - - id: nccl_proxy_wait - title: "NCCL proxy wait 汇总 (profiler)" - type: sql - sql: | - SELECT - coll_func, - sum(send_gpu_wait_ns) AS total_gpu_wait_ns, - sum(recv_wait_ns) AS total_recv_wait_ns, - count(*) AS ops - FROM {nccl_proxy_table} - WHERE seq >= ( - SELECT max(seq) - {step_window} - FROM {nccl_proxy_table} - ) - GROUP BY coll_func - ORDER BY total_recv_wait_ns DESC - on_empty: skip - empty_message: "无 nccl.proxy_ops — 仅 Torch API 层粗粒度数据可用" - - - id: rdma_hint - title: "RDMA 端口速率 (Linux)" - type: sql - platform: linux - sql: | - SELECT hca_name, rcv_pkts_rate, snd_pkts_rate, np_ecn_marked_roce_packets - FROM rdma.mlx_hca - LIMIT 5 - on_empty: skip - empty_message: "RDMA 表不可用 — 非 InfiniBand/RoCE 或未配置 rdma.hca_name" - - variables: - table_comm: "{comm_table}" - nccl_proxy_table: "{nccl_proxy_table}" - nccl_coll_table: "{nccl_coll_table}" - - interpretation: - rules: - - id: comm_dominates_step - when: "step:op_by_step | column:comm_ms | avg > 100" - severity: info - message: "平均每 step 通信耗时 >100ms — 考虑梯度桶/重叠/压缩" - - - id: ecn_marked - when: "step:rdma_hint | column:np_ecn_marked_roce_packets | max > 0" - severity: warning - message: "RoCE ECN 标记包 >0 — 网络可能存在拥塞" - - summary_template: | - ## 通信瓶颈 - - **nccl_coll_bw**: NCCL 精准带宽(有则优先采信;注意 timing_source 列) - - **op_summary**: Torch API 层各 op 总耗时(粗粒度回退) - - **slowest_calls**: 极端慢调用 - - rank 不均衡 → skill: slow_rank - - next_steps: - - "all_reduce 慢 → 检查 bucket 大小、overlap、FP16 compress" - - "某消息桶带宽异常低 → 对照 timing_source(enqueue 回退行不代表执行带宽)" - - "某 step comm_ms 尖峰 → 对照 checkpoint / eval 边界" - - "RoCE 拥塞 → 查 rdma.mlx_hca 与交换机 ECN 配置" - - "有 proxy wait 数据 → skill: nccl_culprit_victim" diff --git a/skills/crash_triage/SKILL.md b/skills/crash_triage/SKILL.md deleted file mode 100644 index afa252ec..00000000 --- a/skills/crash_triage/SKILL.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -name: crash_triage -description: > - Crash triage: grep PROBING CRASH in rank logs; read spill JSON under - {PROBING_DATA_DIR}/crash//latest.json -category: triage -tags: [crash, error, exception, startup, 报错, 崩溃] -keywords: - en: ['crash', 'error', 'exception', 'failed', 'startup failure'] - zh: ['崩溃', '报错', '异常', '启动失败', '挂了'] ---- - -# Crash triage - -训练崩溃或启动失败时: - -1. **日志**:在各 rank stderr / launcher 日志中搜索 ``PROBING CRASH`` -2. **Spill**:``{PROBING_DATA_DIR}/crash//latest.json``(与 memtable 同根目录,默认 Linux ``/dev/shm/probing``,macOS ``$TMPDIR/probing``) -3. **Signal crash**:同目录下 ``signal-latest.json`` - -torchrun 级联退出后 memtable 不可用——以日志 + spill 为准。 - -## Related skills - -- 进程仍存活但无进展 → skill: training_hang diff --git a/skills/crash_triage/steps.yaml b/skills/crash_triage/steps.yaml deleted file mode 100644 index c7eb35fa..00000000 --- a/skills/crash_triage/steps.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: crash_triage - title: "崩溃 / 启动失败诊断" - title_en: "Crash and startup failure triage" - category: triage - tags: [crash, error, exception, startup, 报错, 崩溃] - triggers: - keywords: - zh: ["崩溃", "报错", "异常", "启动失败", "挂了", "exit code"] - en: ["crash", "error", "exception", "failed", "startup failure"] - docs: | - 查 rank 日志中的 ``PROBING CRASH``,或 spill: - ``{PROBING_DATA_DIR}/crash//latest.json`` - -spec: - steps: [] - - summary_template: | - ## Crash 诊断 - 1. grep 各 rank 日志 ``PROBING CRASH`` - 2. 读 spill ``$PROBING_DATA_DIR/crash//latest.json`` - - next_steps: - - "全 rank 同一 fingerprint → 检查代码/环境" - - "无 exception 但卡住 → skill: training_hang" diff --git a/skills/gpu_pressure/SKILL.md b/skills/gpu_pressure/SKILL.md deleted file mode 100644 index 25067c93..00000000 --- a/skills/gpu_pressure/SKILL.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: gpu_pressure -description: > - GPU memory and utilization headroom -category: memory -tables: [gpu.utilization, gpu.devices, python.torch_trace] -tags: [gpu, VRAM, utilization, 显存, 利用率] -keywords: - en: ['GPU memory', 'VRAM', 'GPU utilization', 'GPU idle'] - zh: ['显存不够', 'GPU 利用率', 'VRAM', '显存占用', 'GPU 空闲'] -parameters: - sample_limit: { type: integer, default: 20 } ---- - -# GPU memory and utilization pressure - -查看 gpu.utilization 采样与 python.torch_trace 中的 allocated 是否一致, -判断是「真 OOM 风险」还是「利用率低 / 内存碎片」。 - -## Parameters - -- `sample_limit` (integer, default `20`): - -## Related skills - -- 显存持续上涨 → skill: memory_leak -- MPS Mac → torch.mps.current_allocated_memory 已在 torch_trace 中 -- 启用更细 profiling → probing.torch.profiling=on,random:0.1 diff --git a/skills/gpu_pressure/steps.yaml b/skills/gpu_pressure/steps.yaml deleted file mode 100644 index 1b07643d..00000000 --- a/skills/gpu_pressure/steps.yaml +++ /dev/null @@ -1,104 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: gpu_pressure - title: "GPU 显存与利用率压力" - title_en: "GPU memory and utilization pressure" - category: memory - tags: [gpu, VRAM, utilization, 显存, 利用率] - triggers: - keywords: - zh: ["显存不够", "GPU 利用率", "VRAM", "显存占用", "GPU 空闲"] - en: ["GPU memory", "VRAM", "GPU utilization", "GPU idle"] - docs: | - 查看 gpu.utilization 采样与 python.torch_trace 中的 allocated 是否一致, - 判断是「真 OOM 风险」还是「利用率低 / 内存碎片」。 - -spec: - parameters: - - name: sample_limit - type: integer - default: 20 - - steps: - - id: gpu_latest - title: "GPU 当前状态 (最近采样)" - type: sql - sql: | - SELECT - ts, - name, - device_id, - used_bytes, - total_bytes, - mem_used_pct, - gpu_util_pct, - mem_controller_util_pct - FROM gpu.utilization - ORDER BY ts DESC - LIMIT {sample_limit} - on_empty: abort - empty_message: "gpu.utilization 无数据 — 确认 GPU 扩展已启用" - - - id: gpu_devices - title: "GPU 设备信息" - type: sql - sql: | - SELECT device_id, name, memory_model, chip, total_bytes - FROM gpu.devices - on_empty: skip - - - id: torch_allocated_latest - title: "Torch 视角显存 (最近 step)" - type: sql - sql: | - SELECT - step, - max(allocated) AS torch_allocated_mb, - max(cached) AS torch_cached_mb - FROM python.torch_trace - WHERE step >= (SELECT max(step) - 5 FROM python.torch_trace) - GROUP BY step - ORDER BY step DESC - on_empty: skip - empty_message: "无 torch_trace — MPS/CUDA allocated 仅在 torch profiling 开启时有" - - - id: low_utilization - title: "低 GPU 利用率采样" - type: sql - sql: | - SELECT ts, gpu_util_pct, mem_used_pct, name - FROM gpu.utilization - WHERE gpu_util_pct >= 0 AND gpu_util_pct < 30 - ORDER BY ts DESC - LIMIT 10 - on_empty: skip - - interpretation: - rules: - - id: critical_mem - when: "step:gpu_latest | column:mem_used_pct | max > 95" - severity: error - message: "显存使用率 >95% — imminent OOM 风险" - - - id: low_gpu_util - when: "step:low_utilization | rows > 5" - severity: info - message: "多次采样 GPU 利用率 <30% — 可能存在 CPU/IO 瓶颈或 batch 过小" - - - id: torch_vs_driver_gap - when: "step:torch_allocated_latest | rows > 0" - severity: info - message: "对比 torch_allocated_mb 与 gpu.used_bytes — 差距大可能有碎片或未释放 cache" - - summary_template: | - ## GPU 压力 - - **gpu_latest**: 设备 mem_used_pct / gpu_util_pct - - **torch_allocated_latest**: PyTorch 视角 (MB) - - 显存涨但 util 低 → 查 DataLoader; util 高 mem 低 → 计算密集 - - next_steps: - - "显存持续上涨 → skill: memory_leak" - - "MPS Mac → torch.mps.current_allocated_memory 已在 torch_trace 中" - - "启用更细 profiling → probing.torch.profiling=on,random:0.1" diff --git a/skills/health_overview/SKILL.md b/skills/health_overview/SKILL.md deleted file mode 100644 index dd3bdc0e..00000000 --- a/skills/health_overview/SKILL.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: health_overview -description: > - One-shot health check: CPU, GPU, tables, recent training activity -category: triage -tables: [cpu.utilization, gpu.utilization, python.torch_trace, cluster.nodes] -tags: [overview, doctor, triage, 健康检查] -keywords: - en: ['health', 'overview', 'status', 'doctor', 'checkup'] - zh: ['健康', '概览', '怎么样', '正常吗', 'doctor', '体检'] -parameters: - sample_limit: { type: integer, default: 5 } ---- - -# Training health overview - -快速扫描目标进程:有哪些表、CPU/GPU 最近采样、训练是否在推进。 -适合作为 agent 的默认第一步,或用户不确定从哪查起时使用。 - -## Parameters - -- `sample_limit` (integer, default `5`): Recent CPU/GPU samples to show - -## Related skills - -- 训练变慢 → skill: module_bottleneck 或 slow_rank -- 显存上涨 → skill: memory_leak -- 进程卡住 → skill: training_hang diff --git a/skills/health_overview/steps.yaml b/skills/health_overview/steps.yaml deleted file mode 100644 index f413e492..00000000 --- a/skills/health_overview/steps.yaml +++ /dev/null @@ -1,145 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: health_overview - title: "训练健康概览" - title_en: "Training health overview" - category: triage - tags: [overview, doctor, triage, 健康检查] - triggers: - keywords: - zh: ["健康", "概览", "怎么样", "正常吗", "doctor", "体检"] - en: ["health", "overview", "status", "doctor", "checkup"] - docs: | - 快速扫描目标进程:有哪些表、CPU/GPU 最近采样、训练是否在推进。 - 适合作为 agent 的默认第一步,或用户不确定从哪查起时使用。 - -spec: - parameters: - - name: sample_limit - type: integer - default: 5 - description: "Recent CPU/GPU samples to show" - - steps: - - id: available_tables - title: "可查询的数据表" - type: sql - sql: | - SELECT table_schema, table_name, table_type - FROM information_schema.tables - WHERE table_schema NOT IN ('information_schema') - ORDER BY table_schema, table_name - on_empty: warn - empty_message: "未发现业务表 — 确认 probing 已注入且 PROBING=1" - - - id: host_cpu - title: "主机 CPU / 内存 (最近采样)" - type: sql - sql: | - SELECT ts, comm, rss_kb, cpu_total_pct, thread_count, state - FROM cpu.utilization - WHERE scope = 'process' - ORDER BY ts DESC - LIMIT {sample_limit} - on_empty: skip - empty_message: "cpu.utilization 无数据 — CPU 采样可能未开启" - - - id: gpu_mem - title: "GPU 显存 / 利用率 (最近采样)" - type: sql - sql: | - SELECT ts, name, used_bytes, total_bytes, mem_used_pct, gpu_util_pct - FROM gpu.utilization - ORDER BY ts DESC - LIMIT {sample_limit} - on_empty: skip - empty_message: "gpu.utilization 无数据 — GPU 扩展未启用或无 GPU" - - - id: latest_torch_step - title: "最近训练 step (torch_trace)" - type: sql - sql: | - SELECT max(step) AS latest_step, count(*) AS trace_rows - FROM python.torch_trace - on_empty: skip - empty_message: "python.torch_trace 无数据 — 设置 probing.torch.profiling=on" - - - id: cluster_nodes - title: "集群节点" - type: sql - sql: | - SELECT rank, host, addr, status - FROM cluster.nodes - ORDER BY rank - on_empty: skip - empty_message: "单进程模式或未注册 cluster 节点" - - - id: nccl_data_integrity - title: "NCCL profiler 数据完整性" - type: sql - sql: | - SELECT - ts, - rank, - pool_exhausted, - write_errors, - ring_rows_overwritten, - coll_live, - coll_cap, - proxy_live, - proxy_cap - FROM nccl.profiler_counters - ORDER BY ts DESC - LIMIT 1 - on_empty: skip - empty_message: "nccl.profiler_counters 无数据 — NCCL profiler 未启用" - - interpretation: - rules: - - id: no_tables - when: "step:available_tables | rows == 0" - severity: error - message: "没有可查询表 — probing 可能未正确注入" - - - id: nccl_pool_exhausted - when: "step:nccl_data_integrity | column:pool_exhausted | value > 0" - severity: error - message: "NCCL slot pool 曾耗尽 — 通信指标可能不完整" - - - id: nccl_write_errors - when: "step:nccl_data_integrity | column:write_errors | value > 0" - severity: error - message: "NCCL memtable 写入失败 — 部分事件可能丢失" - - - id: nccl_ring_overwrite - when: "step:nccl_data_integrity | column:ring_rows_overwritten | value > 0" - severity: warning - message: "NCCL mmap ring 曾覆写旧行 — 历史窗口可能不完整" - - - id: high_gpu_mem - when: "step:gpu_mem | column:mem_used_pct | max > 90" - severity: warning - message: "GPU 显存使用率超过 90%,关注 OOM 风险" - - - id: training_active - when: "step:latest_torch_step | column:latest_step | value > 0" - severity: info - message: "Torch 训练 trace 活跃,最新 step = {latest_step}" - - summary_template: | - ## 健康概览 - - 可用表: {available_tables.row_count} 张 - - 最新训练 step: {latest_torch_step.latest_step} - - 集群节点: {cluster_nodes.row_count} 个(0 表示单机) - - NCCL 完整性: 见 nccl_data_integrity(pool_exhausted / ring 覆写) - - 若某项为空,按 empty_message 提示开启对应采集。 - cluster 查询若标记 PARTIAL/DEGRADED,不得当作完整诊断依据。 - - next_steps: - - "多机训练 job 级诊断 → skill: job_health --global" - - "训练变慢 → skill: module_bottleneck 或 slow_rank" - - "显存上涨 → skill: memory_leak" - - "进程卡住 → skill: training_hang" diff --git a/skills/install.sh b/skills/install.sh deleted file mode 100755 index a77319e0..00000000 --- a/skills/install.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -# Install repo skills/ into Cursor, Claude Code, and Codex skill directories. -set -euo pipefail - -ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -cd "$ROOT" - -if command -v probing >/dev/null 2>&1; then - exec probing skill install "$@" -fi - -export PROBING=1 -export PYTHONPATH="${ROOT}/python${PYTHONPATH:+:${PYTHONPATH}}" -exec python3 -m probing.skills install "$@" diff --git a/skills/job_health/SKILL.md b/skills/job_health/SKILL.md deleted file mode 100644 index 526dd478..00000000 --- a/skills/job_health/SKILL.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -name: job_health -description: > - Job-level health: cluster alive, step lag, slowdown proxy, comm trend -category: triage -tables: [cluster.nodes, python.comm_collective, global.python.comm_collective, python.trace_event] -tags: [job, slowdown, health, 作业] -keywords: - en: ['job health', 'job slow', 'slowdown', 'training degraded', 'step lag'] - zh: ['作业健康', 'job 慢', '整体变慢', 'slowdown', 'step 落后'] -parameters: - step_window: { type: integer, default: 200 } - step_lag_threshold: { type: integer, default: 5 } - use_global: { type: boolean, default: true } ---- - -# Job health & slowdown - -从 **整 job** 视角看训练是否健康,而不是单个 rank 的单次 collective。 - -## 看什么 - -| 步骤 | 含义 | -|------|------| -| cluster_snapshot | 多少节点 alive / dead | -| rank_step_lag | 哪些 rank 的 `global_step` 明显落后(hang 信号) | -| job_slowdown_proxy | 各 step 上最慢 rank vs 最快 rank 的比值均值(§ federation 3.2) | -| comm_trend_by_step | 最近 step 通信总耗时是否爬升 | -| train_step_pacing | `train.step` span 的 wall time(若已开启 phase hook) | - -## Parameters - -- `step_window` (default `200`): 分析最近多少 global_step -- `step_lag_threshold` (default `5`): 落后 cluster max step 多少步算异常 -- `use_global` (default `true`): rank0 上 fan-out 到全集群 - -## 用法 - -```bash -probing -t rank0:8080 skill run job_health --global -probing -t rank0:8080 skill run job_health --set step_window=500 -``` - -## Related skills - -- 长期最慢 rank → `persistent_straggler` -- 当前 step 谁慢 → `slow_rank` -- 进程卡住 → `training_hang` diff --git a/skills/job_health/steps.yaml b/skills/job_health/steps.yaml deleted file mode 100644 index 7c027288..00000000 --- a/skills/job_health/steps.yaml +++ /dev/null @@ -1,176 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: job_health - title: "Job 健康度 / 训练作业诊断" - title_en: "Job health & slowdown" - category: triage - tags: [job, slowdown, health, straggler, 作业, 变慢] - triggers: - keywords: - zh: ["作业健康", "job 慢", "整体变慢", "训练变慢", "slowdown", "worst_fraction", "掉队 rank", "step 落后"] - en: ["job health", "job slow", "slowdown", "training degraded", "persistent slow", "step lag"] - docs: | - 从 **job 级** 视角评估训练是否健康:集群节点存活、rank step 是否同步、 - collective 驱动的 slowdown proxy、最近 step 通信趋势。 - 适合多机训练 first look,或在 slow_rank 之前判断「是偶发还是整体变慢」。 - -spec: - parameters: - - name: step_window - type: integer - default: 200 - description: "Recent global_steps to include in slowdown / lag checks" - - name: step_lag_threshold - type: integer - default: 5 - description: "Flag ranks whose max(global_step) trails cluster max by this many steps" - - name: use_global - type: boolean - default: true - description: "Use global.* federation on rank0 for cross-node checks" - - requires: - any_tables: - - python.comm_collective - - global.python.comm_collective - - cluster.nodes - - steps: - - id: cluster_snapshot - title: "集群节点存活" - type: sql - sql: | - SELECT - count(*) AS nodes_total, - count(*) FILTER (WHERE status = 'running') AS nodes_running, - count(*) FILTER (WHERE status = 'dead') AS nodes_dead - FROM cluster.nodes - on_empty: warn - empty_message: "cluster.nodes 为空 — 单机或未注册集群" - - - id: rank_step_lag - title: "rank global_step 是否落后" - type: sql - cluster: true - when: "{use_global}" - sql: | - WITH bounds AS ( - SELECT max(global_step) AS max_step - FROM global.python.comm_collective - ) - SELECT - _host, - _rank, - _local_rank, - max(global_step) AS last_step, - (SELECT max_step FROM bounds) - max(global_step) AS steps_behind - FROM global.python.comm_collective, bounds - WHERE global_step >= (SELECT max_step - {step_window} FROM bounds) - GROUP BY _host, _rank, _local_rank, bounds.max_step - HAVING max(global_step) < (SELECT max_step - {step_lag_threshold} FROM bounds) - ORDER BY steps_behind DESC - on_empty: skip - empty_message: "未发现明显 step 落后的 rank(或仅有单 rank 数据)" - - - id: job_slowdown_proxy - title: "Job slowdown proxy(per-step straggler 比值)" - type: sql - cluster: true - when: "{use_global}" - sql: | - WITH per_rank_step AS ( - SELECT global_step, _rank, max(duration_ms) AS max_op_ms - FROM global.python.comm_collective - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM global.python.comm_collective - ) - GROUP BY global_step, _rank - ), - step_cp AS ( - SELECT global_step, - avg(max_op_ms) / NULLIF(min(max_op_ms), 0) AS step_slowdown_ratio - FROM per_rank_step - GROUP BY global_step - ) - SELECT - avg(step_slowdown_ratio) AS job_slowdown_proxy, - count(*) FILTER (WHERE step_slowdown_ratio > 1.1) AS slow_steps, - count(*) AS steps_in_window - FROM step_cp - on_empty: skip - empty_message: "global comm_collective 无足够 step 数据" - - - id: comm_trend_by_step - title: "最近 step 通信总耗时趋势" - type: sql - sql: | - SELECT - global_step, - sum(duration_ms) AS comm_ms, - count(*) AS calls, - count(DISTINCT rank) AS ranks_seen - FROM {table_comm} - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM {table_comm} - ) - GROUP BY global_step - ORDER BY global_step DESC - LIMIT 30 - on_empty: skip - - - id: train_step_pacing - title: "train.step wall time(若已 attach phase hook)" - type: sql - sql: | - SELECT - count(*) AS step_spans, - avg(duration_ns) / 1e6 AS avg_step_ms, - max(duration_ns) / 1e6 AS max_step_ms - FROM python.trace_event - WHERE name = 'train.step' - AND duration_ns IS NOT NULL - on_empty: skip - empty_message: "无 train.step span — attach_training_phases 或 TorchProbe 未写入 trace_event" - - variables: - table_comm: "{comm_table}" - - interpretation: - rules: - - id: dead_nodes - when: "step:cluster_snapshot | column:nodes_dead | value > 0" - severity: error - message: "集群有 {nodes_dead} 个 dead 节点 — 检查 torchrun 心跳或进程是否退出" - - - id: step_lag - when: "step:rank_step_lag | rows >= 1" - severity: warning - message: "存在 global_step 明显落后的 rank — 可能 hang 或极慢 straggler" - - - id: job_slow - when: "step:job_slowdown_proxy | column:job_slowdown_proxy | value > 1.15" - severity: warning - message: "Job slowdown proxy > 1.15 — 多数 step 上最慢 rank 拖慢整体" - - - id: many_slow_steps - when: "step:job_slowdown_proxy | column:slow_steps | ratio(slow_steps/steps_in_window) > 0.3" - severity: warning - message: "超过 30% 的 step 出现 straggler 比值 > 1.1 — 考虑 skill: persistent_straggler" - - summary_template: | - ## Job 健康度 - - **cluster_snapshot**: 存活节点 vs dead - - **rank_step_lag**: 是否有 rank 的 global_step 落后 - - **job_slowdown_proxy**: 理想 step 时间 vs 实际的 proxy(>1.1 表示 straggler 影响) - - **comm_trend_by_step**: 通信耗时是否随 step 上升 - - next_steps: - - "某 rank 长期最慢 → skill: persistent_straggler" - - "单次 step 谁最慢 → skill: slow_rank" - - "loss 不更新 / 栈卡住 → skill: training_hang" - - "通信热点 op → skill: comm_bottleneck" - - "NCCL wait 分解 → skill: nccl_culprit_victim" diff --git a/skills/memory_leak/SKILL.md b/skills/memory_leak/SKILL.md deleted file mode 100644 index d2b43704..00000000 --- a/skills/memory_leak/SKILL.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -name: memory_leak -description: > - Detect monotonic GPU memory growth across training steps -category: memory -tables: [python.torch_trace, gpu.utilization] -tags: [memory, leak, OOM, 显存, 泄漏] -keywords: - en: ['memory leak', 'OOM', 'memory growing', 'out of memory'] - zh: ['泄漏', 'OOM', '显存涨', '内存涨', 'out of memory', '阶梯'] -parameters: - min_steps: { type: integer, default: 10 } - step_skip: { type: integer, default: 2 } ---- - -# GPU memory leak detection - -检测 python.torch_trace 中 allocated 是否随 step 单调上涨, -并结合 gpu.utilization 看设备级显存趋势。 - -## Parameters - -- `min_steps` (integer, default `10`): Minimum steps required for trend analysis -- `step_skip` (integer, default `2`): Skip first N steps (discovery / warmup) - -## Related skills - -- 某模块 delta 大 → 检查是否 cache 了 tensor / 未 detach -- 仅 torch_trace 涨而 gpu.utilization 平稳 → 可能是统计口径问题 -- Linux OOM → SELECT * FROM process.kmsg WHERE message LIKE '%oom%' diff --git a/skills/memory_leak/steps.yaml b/skills/memory_leak/steps.yaml deleted file mode 100644 index f12fc20c..00000000 --- a/skills/memory_leak/steps.yaml +++ /dev/null @@ -1,145 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: memory_leak - title: "显存泄漏 / 阶梯上涨" - title_en: "GPU memory leak detection" - category: memory - tags: [memory, leak, OOM, 显存, 泄漏] - triggers: - keywords: - zh: ["泄漏", "OOM", "显存涨", "内存涨", "out of memory", "阶梯"] - en: ["memory leak", "OOM", "memory growing", "out of memory"] - docs: | - 检测 python.torch_trace 中 allocated 是否随 step 单调上涨, - 并结合 gpu.utilization 看设备级显存趋势。 - -spec: - parameters: - - name: min_steps - type: integer - default: 10 - description: "Minimum steps required for trend analysis" - - name: step_skip - type: integer - default: 2 - description: "Skip first N steps (discovery / warmup)" - - steps: - - id: memory_by_step - title: "每 step 峰值显存 (torch_trace)" - type: sql - sql: | - SELECT - step, - max(allocated) AS peak_mb, - max(max_allocated) AS peak_max_mb, - max(allocated_delta) AS max_delta_mb - FROM python.torch_trace - WHERE step > {step_skip} - GROUP BY step - ORDER BY step - on_empty: abort - empty_message: "python.torch_trace 无数据 — 开启 probing.torch.profiling=on" - - - id: memory_trend - title: "step 间显存增长" - type: sql - sql: | - WITH per_step AS ( - SELECT step, max(allocated) AS peak_mb - FROM python.torch_trace - WHERE step > {step_skip} - GROUP BY step - ), - deltas AS ( - SELECT - step, - peak_mb, - peak_mb - lag(peak_mb) OVER (ORDER BY step) AS growth_mb - FROM per_step - ) - SELECT step, peak_mb, growth_mb - FROM deltas - WHERE growth_mb IS NOT NULL - ORDER BY step - on_empty: skip - - - id: monotonic_growth_steps - title: "连续上涨的 step" - type: sql - sql: | - WITH per_step AS ( - SELECT step, max(allocated) AS peak_mb - FROM python.torch_trace - WHERE step > {step_skip} - GROUP BY step - ), - flagged AS ( - SELECT - step, - peak_mb, - CASE - WHEN peak_mb > lag(peak_mb) OVER (ORDER BY step) THEN 1 - ELSE 0 - END AS increased - FROM per_step - ) - SELECT step, peak_mb, increased - FROM flagged - WHERE increased = 1 - ORDER BY step - on_empty: skip - - - id: top_memory_modules - title: "显存增量最大的模块" - type: sql - sql: | - SELECT - module, - stage, - avg(allocated_delta) AS avg_delta_mb, - max(allocated_delta) AS max_delta_mb, - count(*) AS samples - FROM python.torch_trace - WHERE step > {step_skip} - AND allocated_delta > 0 - GROUP BY module, stage - ORDER BY avg_delta_mb DESC - LIMIT 15 - on_empty: skip - - - id: gpu_device_trend - title: "GPU 设备级显存趋势" - type: sql - sql: | - SELECT ts, used_bytes, total_bytes, mem_used_pct - FROM gpu.utilization - ORDER BY ts DESC - LIMIT 30 - on_empty: skip - empty_message: "gpu.utilization 不可用" - - interpretation: - rules: - - id: sustained_growth - when: "step:monotonic_growth_steps | rows > {min_steps} * 0.7" - severity: warning - message: "超过 70% 的 step 显存在上涨 — 可能存在泄漏" - - - id: large_delta_module - when: "step:top_memory_modules | column:avg_delta_mb | max > 50" - severity: warning - message: "存在模块平均 allocated_delta > 50MB — 检查 {top_module}" - - summary_template: | - ## 显存泄漏诊断 - - **memory_trend**: 逐步 growth_mb - - **top_memory_modules**: 哪个 module/stage 在涨 - - **gpu_device_trend**: 设备级是否同步上涨 - - next_steps: - - "某模块 delta 大 → 检查是否 cache 了 tensor / 未 detach" - - "仅 torch_trace 涨而 gpu.utilization 平稳 → 可能是统计口径问题" - - "Linux OOM → SELECT * FROM process.kmsg WHERE message LIKE '%oom%'" diff --git a/skills/module_bottleneck/SKILL.md b/skills/module_bottleneck/SKILL.md deleted file mode 100644 index 5fa976f3..00000000 --- a/skills/module_bottleneck/SKILL.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -name: module_bottleneck -description: > - Find slowest PyTorch modules in recent steps -category: performance -tables: [python.torch_trace] -tags: [slow, bottleneck, module, torch, 慢, 瓶颈] -keywords: - en: ['slow', 'bottleneck', 'hotspot', 'which module', 'slowdown'] - zh: ['慢', '瓶颈', '哪个模块', '变慢', 'hotspot', '热点'] -parameters: - recent_steps: { type: integer, default: 10 } - stage_filter: { type: string, default: post forward } ---- - -# PyTorch module bottleneck - -基于 python.torch_trace 的 post-hook duration,找出最近 step 中最耗时的模块。 -与 torch.profiler 互补:这是长期采样、模块级、低开销视图。 - -## Parameters - -- `recent_steps` (integer, default `10`): Analyze the last N training steps -- `stage_filter` (string, default `post forward`): Hook stage to aggregate (post forward | post step) - -## Related skills - -- 打开 Torch 火焰图 (profiling/torch) 看调用栈分布 -- 分布式变慢 → skill: slow_rank -- 需要 CPU 栈 → SET probing.pprof.sample_freq=99, profiling/pprof diff --git a/skills/module_bottleneck/steps.yaml b/skills/module_bottleneck/steps.yaml deleted file mode 100644 index 4c5fce73..00000000 --- a/skills/module_bottleneck/steps.yaml +++ /dev/null @@ -1,114 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: module_bottleneck - title: "模块性能瓶颈" - title_en: "PyTorch module bottleneck" - category: performance - tags: [slow, bottleneck, module, torch, 慢, 瓶颈] - triggers: - keywords: - zh: ["慢", "瓶颈", "哪个模块", "变慢", "hotspot", "热点"] - en: ["slow", "bottleneck", "hotspot", "which module", "slowdown"] - docs: | - 基于 python.torch_trace 的 post-hook duration,找出最近 step 中最耗时的模块。 - 与 torch.profiler 互补:这是长期采样、模块级、低开销视图。 - -spec: - parameters: - - name: recent_steps - type: integer - default: 10 - description: "Analyze the last N training steps" - - name: stage_filter - type: string - default: "post forward" - description: "Hook stage to aggregate (post forward | post step)" - - requires: - any_tables: - - python.torch_trace - - steps: - - id: module_totals - title: "模块总耗时占比 (最近 step)" - type: sql - sql: | - SELECT - module, - stage, - count(*) AS executions, - avg(duration) AS avg_sec, - sum(duration) AS total_sec, - sum(duration) * 100.0 / sum(sum(duration)) OVER () AS pct_time - FROM python.torch_trace - WHERE step > (SELECT max(step) - {recent_steps} FROM python.torch_trace) - AND stage = '{stage_filter}' - GROUP BY module, stage - ORDER BY total_sec DESC - LIMIT 15 - on_empty: abort - empty_message: "无 torch_trace — SET probing.torch.profiling=on" - - - id: per_step_breakdown - title: "逐步耗时分解" - type: sql - sql: | - SELECT - step, - sum(CASE WHEN stage = 'post forward' THEN duration ELSE 0 END) AS forward_sec, - sum(CASE WHEN stage = 'post step' THEN duration ELSE 0 END) AS optim_sec - FROM python.torch_trace - WHERE step > (SELECT max(step) - {recent_steps} FROM python.torch_trace) - GROUP BY step - ORDER BY step - on_empty: skip - - - id: step_regression - title: "step 间耗时回归 (是否越来越慢)" - type: sql - sql: | - WITH per_step AS ( - SELECT step, sum(duration) AS total_sec - FROM python.torch_trace - WHERE step > (SELECT max(step) - {recent_steps} FROM python.torch_trace) - AND stage = '{stage_filter}' - GROUP BY step - ) - SELECT - step, - total_sec, - total_sec - lag(total_sec) OVER (ORDER BY step) AS delta_sec - FROM per_step - ORDER BY step - on_empty: skip - - - id: enable_torch_flamegraph - title: "提示: 打开 Torch 火焰图" - type: ui - action: navigate - view: profiling/torch - when: "always" - - interpretation: - rules: - - id: dominant_module - when: "step:module_totals | column:pct_time | top > 40" - severity: info - message: "单个模块占用 >40% 时间 — 优先优化 {top_module}" - - - id: step_slowdown - when: "step:step_regression | column:delta_sec | last > 2 * avg(delta_sec)" - severity: warning - message: "最近 step 总耗时明显上升 — 对比 step_regression 与 comm_collective" - - summary_template: | - ## 模块瓶颈 - Top 模块见 **module_totals** (pct_time 列)。 - 若 forward_sec vs optim_sec 失衡,见 **per_step_breakdown**。 - - next_steps: - - "打开 Torch 火焰图 (profiling/torch) 看调用栈分布" - - "分布式变慢 → skill: slow_rank" - - "需要 CPU 栈 → SET probing.pprof.sample_freq=99, profiling/pprof" diff --git a/skills/nccl_culprit_victim/SKILL.md b/skills/nccl_culprit_victim/SKILL.md deleted file mode 100644 index 261a5b7a..00000000 --- a/skills/nccl_culprit_victim/SKILL.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: nccl_culprit_victim -description: > - NCCL proxy wait decomposition — culprit (send_gpu_wait) vs victim (recv_wait) -category: distributed -tables: [nccl.proxy_ops, nccl.net_qp, global.nccl.proxy_ops] -tags: [NCCL, culprit, victim, straggler, wait, proxy] -keywords: - en: ['NCCL culprit', 'NCCL victim', 'recv wait', 'gpu wait', 'slow rank NCCL', 'proxy wait'] - zh: ['NCCL 慢 rank', '罪魁祸首', '受害者', 'recv_wait', 'gpu_wait', '等待分解'] -parameters: - seq_window: { type: integer, default: 20 } - use_global: { type: boolean, default: true } ---- - -# NCCL culprit / victim attribution - -Uses **NCCL profiler plugin** wait decomposition (`nccl.proxy_ops`): - -- **Culprit** (slow local GPU): high `send_gpu_wait_ns` -- **Victim** (waiting on peers / network): high `recv_wait_ns` -- **Receiver congestion** (v4 ABI only): high `send_peer_wait_ns` — this rank's - sends are stalled waiting for the *peer's* clear-to-send credits; investigate - that peer - -Requires `NCCL_PROFILER_PLUGIN` + `probing-nccl-profiler` (or mock data via `PROBING_NCCL_MOCK` on macOS). - -## Parameters - -- `seq_window` (integer, default `20`): recent collective sequences to analyze -- `use_global` (boolean, default `true`): fan-out with `global.nccl.proxy_ops` - -## Related skills - -- Coarse collective latency → `comm_bottleneck` / `slow_rank` (`python.comm_collective`) -- IB QP timing → `nccl.net_qp` when NetPlugin mask enabled diff --git a/skills/nccl_culprit_victim/steps.yaml b/skills/nccl_culprit_victim/steps.yaml deleted file mode 100644 index a53e2466..00000000 --- a/skills/nccl_culprit_victim/steps.yaml +++ /dev/null @@ -1,202 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: nccl_culprit_victim - title: "NCCL culprit / victim 归因" - title_en: "NCCL culprit vs victim attribution" - category: distributed - tags: [NCCL, culprit, victim, proxy, wait, straggler] - triggers: - keywords: - zh: ["罪魁祸首", "受害者", "recv_wait", "gpu_wait", "NCCL 等待", "proxy wait"] - en: ["NCCL culprit", "NCCL victim", "recv wait", "gpu wait", "proxy wait"] - docs: | - 基于 nccl.proxy_ops 的 ProxyStep wait 分解,区分: - - culprit:send_gpu_wait_ns 高(本 rank GPU/计算慢) - - victim:recv_wait_ns 高(等 peer / 网络) - - send_peer_wait_ns 高(仅 v4 ABI):等接收端 credits → 对端拥塞信号 - 需要 NCCL_PROFILER_PLUGIN 加载 probing-nccl-profiler;开发机可用 PROBING_NCCL_MOCK=1。 - -spec: - parameters: - - name: seq_window - type: integer - default: 20 - description: "Analyze proxy ops with seq >= max(seq) - window" - - name: use_global - type: boolean - default: true - description: "Use global.nccl.proxy_ops for multi-node fan-out" - - requires: - any_tables: - - nccl.proxy_ops - - global.nccl.proxy_ops - - steps: - - id: rank_wait_summary - title: "各 rank wait 分解汇总" - type: sql - sql: | - SELECT - rank, - count(*) AS proxy_ops, - sum(send_gpu_wait_ns) AS total_gpu_wait_ns, - sum(recv_wait_ns) AS total_recv_wait_ns, - sum(send_wait_ns) AS total_send_wait_ns, - sum(send_peer_wait_ns) AS total_peer_wait_ns, - avg(send_gpu_wait_ns) AS avg_gpu_wait_ns, - avg(recv_wait_ns) AS avg_recv_wait_ns - FROM {nccl_proxy_table} - WHERE seq >= ( - SELECT max(seq) - {seq_window} - FROM {nccl_proxy_table} - ) - GROUP BY rank - ORDER BY total_recv_wait_ns DESC - on_empty: abort - empty_message: | - 无 nccl.proxy_ops 数据。确认: - - export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) - - export NCCL_PROFILE_EVENT_MASK=94 - - 或 macOS 开发: PROBING_NCCL_MOCK=1 PROBING=1 - - - id: culprit_ranking - title: "Culprit 候选 (send_gpu_wait)" - type: sql - sql: | - SELECT - rank, - tp_rank, - pp_rank, - dp_rank, - coll_func, - sum(send_gpu_wait_ns) AS culprit_wait_ns, - count(*) AS ops - FROM {nccl_proxy_table} - WHERE seq >= ( - SELECT max(seq) - {seq_window} - FROM {nccl_proxy_table} - ) - GROUP BY rank, tp_rank, pp_rank, dp_rank, coll_func - ORDER BY culprit_wait_ns DESC - LIMIT 10 - on_empty: skip - - - id: victim_ranking - title: "Victim 候选 (recv_wait)" - type: sql - sql: | - SELECT - rank, - tp_rank, - pp_rank, - dp_rank, - coll_func, - sum(recv_wait_ns) AS victim_wait_ns, - sum(recv_flush_wait_ns) AS flush_wait_ns, - count(*) AS ops - FROM {nccl_proxy_table} - WHERE seq >= ( - SELECT max(seq) - {seq_window} - FROM {nccl_proxy_table} - ) - GROUP BY rank, tp_rank, pp_rank, dp_rank, coll_func - ORDER BY victim_wait_ns DESC - LIMIT 10 - on_empty: skip - - - id: role_aligned - title: "按并行角色 (tp/pp/dp) 对齐" - type: sql - sql: | - SELECT - tp_rank, - pp_rank, - dp_rank, - sum(send_gpu_wait_ns) AS gpu_wait_ns, - sum(recv_wait_ns) AS recv_wait_ns, - count(DISTINCT rank) AS ranks_seen - FROM {nccl_proxy_table} - WHERE seq >= ( - SELECT max(seq) - {seq_window} - FROM {nccl_proxy_table} - ) - AND tp_rank >= 0 - GROUP BY tp_rank, pp_rank, dp_rank - ORDER BY recv_wait_ns DESC - on_empty: skip - empty_message: "无 tp/pp/dp 列或未设置并行 env — 仅按 torch rank 分析" - - - id: global_fanout - title: "跨节点 global 视图" - type: sql - cluster: true - when: "{use_global}" - sql: | - SELECT - _host, - _rank AS probe_rank, - rank AS torch_rank, - sum(send_gpu_wait_ns) AS gpu_wait_ns, - sum(recv_wait_ns) AS recv_wait_ns - FROM global.nccl.proxy_ops - WHERE seq >= ( - SELECT max(seq) - {seq_window} - FROM global.nccl.proxy_ops - ) - GROUP BY _host, _rank, rank - ORDER BY recv_wait_ns DESC - on_empty: skip - - - id: net_qp_hint - title: "IB QP 延迟 (NetPlugin)" - type: sql - sql: | - SELECT - rank, - qp_num, - avg(duration_ns) AS avg_qp_ns, - max(duration_ns) AS max_qp_ns, - count(*) AS events - FROM {net_qp_table} - GROUP BY rank, qp_num - ORDER BY max_qp_ns DESC - LIMIT 10 - on_empty: skip - empty_message: "nccl.net_qp 空 — 需要 NCCL_PROFILE_EVENT_MASK 含 NetPlugin(128)" - - variables: - nccl_proxy_table: "{nccl_proxy_table}" - - interpretation: - rules: - - id: culprit_dominates - when: "step:rank_wait_summary | column:total_gpu_wait_ns | max/min(ratio) > 2" - severity: warning - message: "某 rank 的 send_gpu_wait 显著高于其他 rank — 可能是 culprit (本地 GPU 慢)" - - - id: victim_dominates - when: "step:rank_wait_summary | column:total_recv_wait_ns | max/min(ratio) > 2" - severity: warning - message: "某 rank 的 recv_wait 显著高于其他 rank — 可能是 victim (等待 peer/网络)" - - - id: culprit_not_victim - when: "step:culprit_ranking | rows >= 1 | column:culprit_wait_ns | max > 1000000" - severity: info - message: "查看 culprit_ranking 顶部 rank — 对比 victim_ranking 确认是否同一 rank" - - summary_template: | - ## NCCL culprit / victim - - **culprit_ranking**: `send_gpu_wait_ns` 最高 → 本地算力瓶颈 - - **victim_ranking**: `recv_wait_ns` 最高 → 等待他人或网络 - - **rank_wait_summary.total_peer_wait_ns**(仅 v4 ABI)高 → 对端接收拥塞 - - **role_aligned**: 同 tp/pp/dp 切片对比(Megatron 拓扑) - - 若仅有 python.comm_collective → skill: comm_bottleneck - - next_steps: - - "culprit 持续同一 rank → gpu_pressure / module_bottleneck" - - "victim 全体偏高 → 网络/RoCE: comm_bottleneck (rdma.mlx_hca)" - - "send_peer_wait_ns 偏高 → 对端 rank 接收侧拥塞,检查该 peer 的 GPU/网络" - - "单 rank victim + 其他 culprit → 典型 straggler: slow_rank" diff --git a/skills/persistent_straggler/SKILL.md b/skills/persistent_straggler/SKILL.md deleted file mode 100644 index 659d8188..00000000 --- a/skills/persistent_straggler/SKILL.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -name: persistent_straggler -description: > - Find ranks that are slow on many steps (worst_fraction), not just once -category: distributed -tables: [python.comm_collective, global.python.comm_collective] -tags: [straggler, persistent, worst_fraction] -keywords: - en: ['persistent straggler', 'worst fraction', 'always slow', 'chronic straggler'] - zh: ['长期慢', '一直慢', 'worst_fraction', '总是最慢'] -parameters: - step_window: { type: integer, default: 300 } - worst_fraction_threshold: { type: number, default: 0.25 } - use_global: { type: boolean, default: true } ---- - -# Persistent straggler (worst_fraction) - -`slow_rank` 看 **当前窗口里谁平均最慢**;本 skill 看 **谁在多少 step 上拿「最慢 rank」**。 - -## worst_fraction - -对每个 rank 统计:在窗口内有多少 step 上,该 rank 的 collective 总耗时等于该 step 的最大值。 - -- `worst_fraction ≈ 1.0` — 几乎每步都是最慢( chronic straggler) -- `worst_fraction ≈ 0.05` — 偶发 - -## Parameters - -- `step_window` (default `300`) -- `worst_fraction_threshold` (default `0.25`) — `persistent_offenders` 步骤的过滤阈值 -- `use_global` (default `true`) - -## 用法 - -```bash -probing -t rank0:8080 skill run persistent_straggler --global -probing -t rank0:8080 skill run persistent_straggler --set worst_fraction_threshold=0.4 --set step_window=500 -``` - -## Related skills - -- Job 整体变慢 → `job_health` -- 当前 step lag → `slow_rank` -- NCCL culprit/victim → `nccl_culprit_victim` diff --git a/skills/persistent_straggler/steps.yaml b/skills/persistent_straggler/steps.yaml deleted file mode 100644 index d0a36e85..00000000 --- a/skills/persistent_straggler/steps.yaml +++ /dev/null @@ -1,194 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: persistent_straggler - title: "长期 straggler / worst_fraction" - title_en: "Persistent straggler (worst_fraction)" - category: distributed - tags: [straggler, persistent, worst_fraction, rank, 拖后腿] - triggers: - keywords: - zh: ["长期慢", "一直慢", "worst_fraction", "persistent straggler", "总是最慢", "慢性 straggler"] - en: ["persistent straggler", "worst fraction", "always slow", "chronic straggler", "worst_fraction"] - docs: | - 找出 **在多少 step 上是最慢 rank**(worst_fraction),区分「偶发慢一次」与「长期拖后腿」。 - 对标 federation 文档 §3.2;万卡场景请在 rank0 上 `--global` fan-out。 - -spec: - parameters: - - name: step_window - type: integer - default: 300 - description: "Steps included in worst_fraction calculation" - - name: worst_fraction_threshold - type: number - default: 0.25 - description: "Flag ranks whose worst_fraction exceeds this (0–1)" - - name: use_global - type: boolean - default: true - description: "Query global.python.comm_collective with cluster fan-out" - - requires: - any_tables: - - python.comm_collective - - global.python.comm_collective - - steps: - - id: worst_fraction - title: "各 rank 的 worst_fraction" - type: sql - cluster: true - when: "{use_global}" - sql: | - WITH per_step AS ( - SELECT global_step, _rank, _host, sum(duration_ms) AS step_ms - FROM global.python.comm_collective - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM global.python.comm_collective - ) - GROUP BY global_step, _rank, _host - ) - SELECT - _rank, - _host, - count(*) AS steps_seen, - sum( - CASE - WHEN step_ms = max(step_ms) OVER (PARTITION BY global_step) THEN 1 - ELSE 0 - END - ) * 1.0 / count(*) AS worst_fraction, - avg(step_ms) AS avg_step_comm_ms - FROM per_step - GROUP BY _rank, _host - ORDER BY worst_fraction DESC, avg_step_comm_ms DESC - on_empty: abort - empty_message: | - 无 global comm_collective 数据。确认: - - rank0 上运行且 cluster.nodes 已注册 - - probing -t rank0:8080 skill run persistent_straggler --global - - - id: persistent_offenders - title: "worst_fraction 超过阈值的 rank" - type: sql - cluster: true - when: "{use_global}" - sql: | - WITH per_step AS ( - SELECT global_step, _rank, _host, sum(duration_ms) AS step_ms - FROM global.python.comm_collective - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM global.python.comm_collective - ) - GROUP BY global_step, _rank, _host - ), - scored AS ( - SELECT - _rank, - _host, - count(*) AS steps_seen, - sum( - CASE - WHEN step_ms = max(step_ms) OVER (PARTITION BY global_step) THEN 1 - ELSE 0 - END - ) * 1.0 / count(*) AS worst_fraction, - avg(step_ms) AS avg_step_comm_ms - FROM per_step - GROUP BY _rank, _host - ) - SELECT * - FROM scored - WHERE worst_fraction >= {worst_fraction_threshold} - ORDER BY worst_fraction DESC, avg_step_comm_ms DESC - on_empty: skip - empty_message: "无 rank 的 worst_fraction 超过阈值 — straggler 可能是偶发的" - - - id: recent_step_lag - title: "最近 step 上 lag 最大的 rank" - type: sql - sql: | - WITH per_step AS ( - SELECT - global_step, - rank, - sum(duration_ms) AS step_ms - FROM {table_comm} - WHERE global_step >= ( - SELECT max(global_step) - LEAST({step_window}, 50) - FROM {table_comm} - ) - GROUP BY global_step, rank - ), - ranked AS ( - SELECT - global_step, - rank, - step_ms, - step_ms - min(step_ms) OVER (PARTITION BY global_step) AS lag_ms - FROM per_step - ) - SELECT global_step, rank, step_ms, lag_ms - FROM ranked - WHERE lag_ms = max(lag_ms) OVER (PARTITION BY global_step) - ORDER BY global_step DESC - LIMIT 15 - on_empty: skip - - - id: rank_latency_context - title: "各 rank 平均 collective 延迟(对照)" - type: sql - cluster: true - when: "{use_global}" - sql: | - SELECT - _host, - _rank, - count(*) AS calls, - avg(duration_ms) AS avg_ms, - max(duration_ms) AS max_ms - FROM global.python.comm_collective - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM global.python.comm_collective - ) - GROUP BY _host, _rank - ORDER BY avg_ms DESC - on_empty: skip - - variables: - table_comm: "{comm_table}" - - interpretation: - rules: - - id: chronic_straggler - when: "step:persistent_offenders | rows >= 1" - severity: warning - message: "存在 worst_fraction ≥ 阈值的 rank — 长期 straggler,优先查对应节点" - - - id: high_worst_fraction - when: "step:worst_fraction | column:worst_fraction | max > 0.5" - severity: warning - message: "有 rank 在超过一半 step 上是最慢 — 强烈怀疑节点/网络/数据问题" - - - id: single_dominant - when: "step:worst_fraction | rows >= 2 | top(row).worst_fraction > 2 * median(worst_fraction)" - severity: info - message: "worst_fraction 头部 rank 明显突出 — 见 persistent_offenders 表" - - summary_template: | - ## 长期 straggler - - **worst_fraction**: 每个 rank 在多少比例的 step 上是最慢 - - **persistent_offenders**: 超过 `{worst_fraction_threshold}` 阈值的 rank - - **recent_step_lag**: 最近 step 的单次 lag(偶发 vs 长期对照) - - **rank_latency_context**: 窗口内平均 collective 延迟 - - next_steps: - - "对应节点 GPU/显存 → skill: gpu_pressure" - - "NCCL wait 分解 → skill: nccl_culprit_victim" - - "模块热点 → 在慢 rank inject 后 skill: module_bottleneck" - - "整 job 变慢趋势 → skill: job_health" diff --git a/skills/semantic/intents.yaml b/skills/semantic/intents.yaml deleted file mode 100644 index 91cf6c7e..00000000 --- a/skills/semantic/intents.yaml +++ /dev/null @@ -1,59 +0,0 @@ -# Intent routing — maps user language to skill ids (keyword + LLM fallback). -apiVersion: probing.dev/v1 -kind: IntentCatalog - -intents: - health_check: - label: "健康检查 / 不知道从哪查" - keywords: [健康, 概览, overview, status, 怎么样, doctor, 体检, checkup, job health, 作业健康, SRE, 值班] - skills: [sre_triage, health_overview, job_health] - - sre_oncall: - label: "SRE 值班 / 事故第一响应" - keywords: [SRE, 值班, oncall, runbook, 应急, 事故, incident, triage, 第一响应, 排查流程] - skills: [sre_triage, health_overview, job_health, training_hang, watchdog_timeout] - - job_slowdown: - label: "整 job 变慢 / slowdown" - keywords: [job 慢, 整体变慢, slowdown, job health, 作业健康, step 落后, 变慢趋势] - skills: [job_health, persistent_straggler, slow_rank, comm_bottleneck] - - persistent_straggler: - label: "长期 straggler / worst_fraction" - keywords: [worst_fraction, 长期慢, 一直慢, persistent straggler, 总是最慢, chronic] - skills: [persistent_straggler, slow_rank, job_health, nccl_culprit_victim] - - training_hung: - label: "训练卡住 / 无进展" - keywords: [卡住, hang, stall, 不动, deadlock, 死锁, frozen, stuck, loss 不更新, watchdog timeout] - skills: [sre_triage, training_hang, watchdog_timeout, slow_rank] - - training_slow: - label: "训练变慢 / 瓶颈" - keywords: [慢, slow, bottleneck, 瓶颈, 变慢, hotspot, 热点, 耗时, slowdown, job 慢] - skills: [job_health, module_bottleneck, slow_rank, persistent_straggler, comm_bottleneck] - - which_rank: - label: "慢 rank / straggler" - keywords: [straggler, 慢 rank, 拖后腿, rank 慢, lagging rank, 哪个 rank, worst_fraction, 长期慢] - skills: [persistent_straggler, slow_rank, nccl_culprit_victim, comm_bottleneck] - - memory_growing: - label: "显存上涨 / OOM" - keywords: [OOM, leak, 泄漏, 显存涨, memory grow, out of memory, 阶梯] - skills: [memory_leak, gpu_pressure] - - comm_slow: - label: "通信慢 / NCCL" - keywords: [通信慢, NCCL, all_reduce, 通信瓶颈, collective, 带宽, culprit, victim, recv_wait, gpu_wait, watchdog] - skills: [sre_triage, comm_bottleneck, watchdog_timeout, nccl_culprit_victim, slow_rank] - - nccl_wait: - label: "NCCL wait 分解 / culprit victim" - keywords: [罪魁祸首, 受害者, send_gpu_wait, recv_wait, proxy wait, NCCL 等待, gpu wait, flight recorder, desync] - skills: [watchdog_timeout, nccl_culprit_victim, slow_rank] - - cluster_view: - label: "集群 / 多机训练" - keywords: [集群, 多机, 分布式, cluster, multi-node, 跨节点, 所有 rank, all ranks, fan-out] - skills: [sre_triage, job_health, slow_rank, persistent_straggler, comm_bottleneck, health_overview] diff --git a/skills/semantic/pages.yaml b/skills/semantic/pages.yaml deleted file mode 100644 index 0b412ccf..00000000 --- a/skills/semantic/pages.yaml +++ /dev/null @@ -1,76 +0,0 @@ -# Workspace pages → suggested skills (Investigate page awareness). -apiVersion: probing.dev/v1 -kind: PageCatalog - -pages: - dashboard: - title: Dashboard - path: / - description: "Live CPU/GPU metrics, process overview, thread ranking." - skills: [health_overview] - - agent: - title: Investigate - path: /agent - description: "Skill-driven investigation; optional LLM diagnostic agent summarizes SQL evidence." - skills: [health_overview, job_health] - - cluster: - title: Cluster - path: /cluster - description: "Distributed training cluster nodes and rank status." - skills: [slow_rank, comm_bottleneck, job_health, persistent_straggler] - - stacks: - title: Stacks - path: /stacks - description: "Live mixed Python + native call stacks." - skills: [training_hang] - - profiling/pprof: - title: "Profiling · pprof" - path: /profiling/pprof - description: "CPU SIGPROF sampling flamegraph." - skills: [training_hang, module_bottleneck] - - profiling/torch: - title: "Profiling · torch" - path: /profiling/torch - description: "PyTorch module hook flamegraph (python.torch_trace)." - skills: [module_bottleneck, memory_leak] - - profiling/trace: - title: "Profiling · trace" - path: /profiling/trace - description: "Chrome trace event timeline." - skills: [module_bottleneck] - - analytics: - title: Analytics - path: /analytics - description: "Ad-hoc SQL analytics and time-series charts." - skills: [health_overview, job_health, comm_bottleneck, slow_rank, persistent_straggler] - - spans: - title: Spans - path: /spans - description: "Hierarchical tracing spans from python.trace_event." - skills: [training_hang, comm_bottleneck] - - training: - title: Training - path: /training - description: "Training step metrics and collective communication latency." - skills: [job_health, slow_rank, persistent_straggler, comm_bottleneck, module_bottleneck] - - pulsing: - title: Pulsing - path: /pulsing - description: "Ray/Pulsing actors and span capture." - skills: [] - - python: - title: Python - path: /python - description: "Live Python variable tracing on functions." - skills: [] diff --git a/skills/slow_rank/SKILL.md b/skills/slow_rank/SKILL.md deleted file mode 100644 index c8230383..00000000 --- a/skills/slow_rank/SKILL.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: slow_rank -description: > - Find straggler ranks via collective latency imbalance -category: distributed -tables: [python.comm_collective, global.python.comm_collective, nccl.proxy_ops] -tags: [rank, straggler, distributed, collective, 拖后腿] -keywords: - en: ['slow rank', 'straggler', 'lagging rank', 'which rank'] - zh: ['慢 rank', '拖后腿', 'straggler', '掉队', '哪个 rank', 'rank 慢'] -parameters: - step_window: { type: integer, default: 20 } - use_global: { type: boolean, default: True } ---- - -# Find slow rank (straggler) - -对比各 rank 的 collective 延迟,找出明显偏慢的 straggler。 -单机多卡时 rank 列来自 torch.distributed;多机时使用 global.* 并带 _host/_rank 标签。 - -## Parameters - -- `step_window` (integer, default `20`): Include collectives from the last N global_steps -- `use_global` (boolean, default `True`): Query global.python.comm_collective for cross-node fan-out - -## Related skills - -- 某 rank 持续最慢 → 检查该节点 GPU/网络/数据: skill: gpu_pressure -- 栈卡在 collective → skill: training_hang -- 模块级热点 → skill: module_bottleneck (在慢 rank 上 inject) -- 有 NCCL profiler → skill: nccl_culprit_victim diff --git a/skills/slow_rank/steps.yaml b/skills/slow_rank/steps.yaml deleted file mode 100644 index eb6f3b48..00000000 --- a/skills/slow_rank/steps.yaml +++ /dev/null @@ -1,186 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: slow_rank - title: "慢 rank / Straggler 定位" - title_en: "Find slow rank (straggler)" - category: distributed - tags: [rank, straggler, distributed, collective, 拖后腿] - triggers: - keywords: - zh: ["慢 rank", "拖后腿", "straggler", "掉队", "哪个 rank", "rank 慢"] - en: ["slow rank", "straggler", "lagging rank", "which rank"] - docs: | - 对比各 rank 的 collective 延迟,找出明显偏慢的 straggler。 - 单机多卡时 rank 列来自 torch.distributed;多机时使用 global.* 并带 _host/_rank 标签。 - -spec: - parameters: - - name: step_window - type: integer - default: 20 - description: "Include collectives from the last N global_steps" - - name: use_global - type: boolean - default: true - description: "Query global.python.comm_collective for cross-node fan-out" - - requires: - any_tables: - - python.comm_collective - - global.python.comm_collective - - nccl.proxy_ops - - global.nccl.proxy_ops - - steps: - - id: rank_latency - title: "各 rank collective 平均延迟" - type: sql - sql: | - SELECT - rank, - count(*) AS calls, - avg(duration_ms) AS avg_ms, - max(duration_ms) AS max_ms, - sum(bytes) AS total_bytes - FROM {table_comm} - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM {table_comm} - ) - GROUP BY rank - ORDER BY avg_ms DESC - on_empty: abort - empty_message: | - 无 collective 数据。确认: - - PROBING=1 且 torch.distributed 已初始化 - - collective tracing 已开启 (默认 lite 模式) - - - id: rank_latency_by_op - title: "按 op 分解的 rank 延迟" - type: sql - sql: | - SELECT - op, - rank, - avg(duration_ms) AS avg_ms, - count(*) AS calls - FROM {table_comm} - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM {table_comm} - ) - GROUP BY op, rank - ORDER BY op, avg_ms DESC - on_empty: skip - - - id: rank_latency_global - title: "跨节点 rank 延迟 (_host 标签)" - type: sql - cluster: true - when: "{use_global}" - sql: | - SELECT - _host, - _rank AS probe_rank, - rank AS torch_rank, - avg(duration_ms) AS avg_ms, - count(*) AS calls - FROM global.python.comm_collective - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM global.python.comm_collective - ) - GROUP BY _host, _rank, rank - ORDER BY avg_ms DESC - on_empty: skip - empty_message: "global 查询无结果 — 可能只有单节点或未 PUT /apis/nodes 注册" - - - id: step_straggler - title: "按 step 找最慢的 rank" - type: sql - sql: | - WITH per_step AS ( - SELECT - global_step, - rank, - sum(duration_ms) AS step_ms - FROM {table_comm} - WHERE global_step >= ( - SELECT max(global_step) - {step_window} - FROM {table_comm} - ) - GROUP BY global_step, rank - ), - ranked AS ( - SELECT - global_step, - rank, - step_ms, - step_ms - min(step_ms) OVER (PARTITION BY global_step) AS lag_ms - FROM per_step - ) - SELECT global_step, rank, step_ms, lag_ms - FROM ranked - WHERE lag_ms = max(lag_ms) OVER (PARTITION BY global_step) - ORDER BY global_step DESC - LIMIT 10 - on_empty: skip - - - id: nccl_wait_decomp - title: "NCCL wait 分解 (若已启用 profiler)" - type: sql - sql: | - SELECT - rank, - sum(send_gpu_wait_ns) AS gpu_wait_ns, - sum(recv_wait_ns) AS recv_wait_ns, - count(*) AS proxy_ops - FROM {nccl_proxy_table} - WHERE seq >= ( - SELECT max(seq) - {step_window} - FROM {nccl_proxy_table} - ) - GROUP BY rank - ORDER BY recv_wait_ns DESC - on_empty: skip - empty_message: | - 无 nccl.proxy_ops — 粗粒度 collective 仍可用。 - 启用: NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) - - - id: open_analytics - title: "打开 Analytics 查看 collective" - type: ui - action: navigate - view: analytics - when: "always" - - variables: - table_comm: "{comm_table}" - nccl_proxy_table: "{nccl_proxy_table}" - - interpretation: - rules: - - id: straggler_ratio - when: "step:rank_latency | column:avg_ms | max/min(ratio) > 1.5" - severity: warning - message: "最慢 rank 的平均 collective 延迟是中位数的 1.5 倍以上" - - - id: single_rank_dominates - when: "step:rank_latency | rows >= 2 | top(row).avg_ms > 2 * median(avg_ms)" - severity: warning - message: "Rank {worst_rank} 可能是 straggler — 查看 rank_latency_by_op 确认是哪个 op" - - summary_template: | - ## 慢 rank 诊断 - - 查看 **rank_latency**: 平均延迟最高的 rank - - **rank_latency_by_op**: 是 all_reduce 还是 broadcast 拖慢 - - **step_straggler**: 哪些 step 上 lag 最大 - - next_steps: - - "某 rank 持续最慢 → 检查该节点 GPU/网络/数据: skill: gpu_pressure" - - "栈卡在 collective → skill: training_hang" - - "模块级热点 → skill: module_bottleneck (在慢 rank 上 inject)" - - "有 nccl.proxy_ops → skill: nccl_culprit_victim (culprit/victim 归因)" - - "长期最慢 rank (worst_fraction) → skill: persistent_straggler --global" diff --git a/skills/training_hang/SKILL.md b/skills/training_hang/SKILL.md deleted file mode 100644 index 6b8d27cf..00000000 --- a/skills/training_hang/SKILL.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: training_hang -description: > - Training stalled — capture stacks and thread/blocking hints -category: reliability -tables: [python.backtrace, cpu.utilization, python.trace_event, python.comm_collective] -tags: [hang, stall, deadlock, 卡住, 不动] -keywords: - en: ['hang', 'stuck', 'stall', 'frozen', 'deadlock', 'not progressing'] - zh: ['卡住', 'hang', '不动', '停住', 'deadlock', '死锁', 'loss 不更新'] -parameters: - stack_depth: { type: integer, default: 20 } ---- - -# Training hang diagnosis - -Loss 不更新、进程仍存活但无进展时使用。 -组合:实时混合栈 + CPU 线程 wchan + 最近 trace 活动。 - -## Parameters - -- `stack_depth` (integer, default `20`): Backtrace frames to show - -## Related skills - -- 栈在 dist/barrier → 检查各 rank 是否都存活: probing list / cluster nodes -- 栈在 DataLoader → 减少 num_workers 或检查数据路径 -- 需要持续采样 → SET probing.pprof.sample_freq=99 后 skill: module_bottleneck diff --git a/skills/training_hang/steps.yaml b/skills/training_hang/steps.yaml deleted file mode 100644 index b9f8fa78..00000000 --- a/skills/training_hang/steps.yaml +++ /dev/null @@ -1,114 +0,0 @@ -apiVersion: probing.dev/v1 -kind: Skill - -metadata: - id: training_hang - title: "训练卡住 / Hang 诊断" - title_en: "Training hang diagnosis" - category: reliability - tags: [hang, stall, deadlock, 卡住, 不动] - triggers: - keywords: - zh: ["卡住", "hang", "不动", "停住", "deadlock", "死锁", "loss 不更新"] - en: ["hang", "stuck", "stall", "frozen", "deadlock", "not progressing"] - docs: | - Loss 不更新、进程仍存活但无进展时使用。 - 组合:实时混合栈 + CPU 线程 wchan + 最近 trace 活动。 - -spec: - parameters: - - name: stack_depth - type: integer - default: 20 - description: "Backtrace frames to show" - - steps: - - id: backtrace - title: "当前混合调用栈 (Python + native)" - type: api - method: GET - path: /apis/pythonext/callstack - on_empty: warn - empty_message: "无法获取栈 — 目标进程可能不是 Python 或 tracer 未启用" - - - id: backtrace_sql - title: "调用栈 (SQL 视图)" - type: sql - sql: | - SELECT depth, frame_type, func, file, lineno - FROM python.backtrace - ORDER BY depth - LIMIT {stack_depth} - on_empty: skip - - - id: blocking_threads - title: "阻塞中的线程 (wchan)" - type: sql - sql: | - SELECT tid, comm, state, wchan, cpu_total_pct - FROM cpu.utilization - WHERE scope = 'thread' - AND state NOT IN ('R', 'S') - ORDER BY ts DESC - LIMIT 10 - on_empty: skip - empty_message: "无线程 wchan 数据 (macOS 上 wchan 可能为空)" - - - id: top_wchan - title: "最常见内核等待点 (最近窗口)" - type: sql - sql: | - SELECT wchan, count(*) AS samples, max(comm) AS example_comm - FROM cpu.utilization - WHERE scope = 'thread' AND wchan != '' - GROUP BY wchan - ORDER BY samples DESC - LIMIT 8 - on_empty: skip - - - id: last_trace_activity - title: "最近一次 trace 活动时间" - type: sql - sql: | - SELECT max(time) AS last_event_ns, count(*) AS events_last_100 - FROM ( - SELECT time FROM python.trace_event - ORDER BY time DESC - LIMIT 100 - ) - on_empty: skip - empty_message: "无 trace_event — tracing 可能未启用" - - - id: last_collective - title: "最近一次 collective 通信" - type: sql - sql: | - SELECT op, rank, global_step, duration_ms, bytes - FROM python.comm_collective - ORDER BY global_step DESC, duration_ms DESC - LIMIT 5 - on_empty: skip - empty_message: "无 comm_collective — 非分布式或未 patch torch.distributed" - - interpretation: - rules: - - id: nccl_wait - when: "step:top_wchan | column:wchan | any_contains('nccl','cuda','poll')" - severity: warning - message: "线程可能在等待 NCCL/CUDA — 常见于 collective 死锁或 straggler" - - - id: dataloader_wait - when: "step:backtrace_sql | column:func | any_contains('DataLoader','_next','fetch')" - severity: info - message: "栈顶指向 DataLoader — 检查 num_workers / 数据管道" - - summary_template: | - ## Hang 诊断 - 1. 查看 **backtrace** / **backtrace_sql** 最内层 frame - 2. **top_wchan** 提示内核级等待原因 - 3. **last_collective** 若停在 collective 上 → 试 skill: slow_rank - - next_steps: - - "栈在 dist/barrier → 检查各 rank 是否都存活: probing list / cluster nodes" - - "栈在 DataLoader → 减少 num_workers 或检查数据路径" - - "需要持续采样 → SET probing.pprof.sample_freq=99 后 skill: module_bottleneck" diff --git a/src/lib.rs b/src/lib.rs index fd23cb2f..4809b8f8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -212,6 +212,18 @@ fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { use probing_python::features::python_api::{api_callstack, api_eval}; m.add_function(wrap_pyfunction!(api_callstack, m)?)?; m.add_function(wrap_pyfunction!(api_eval, m)?)?; + use probing_python::features::skills_api::{ + skills_catalog, skills_intents, skills_list, skills_load, skills_match, skills_pages, + skills_plan, skills_routing, + }; + m.add_function(wrap_pyfunction!(skills_load, m)?)?; + m.add_function(wrap_pyfunction!(skills_catalog, m)?)?; + m.add_function(wrap_pyfunction!(skills_routing, m)?)?; + m.add_function(wrap_pyfunction!(skills_list, m)?)?; + m.add_function(wrap_pyfunction!(skills_plan, m)?)?; + m.add_function(wrap_pyfunction!(skills_match, m)?)?; + m.add_function(wrap_pyfunction!(skills_intents, m)?)?; + m.add_function(wrap_pyfunction!(skills_pages, m)?)?; // Add is_enabled function to help tests check state use probing_python::features::python_api::{is_enabled, should_enable_probing}; diff --git a/tests/fixtures/skill_derived_variables.yaml b/tests/fixtures/skill_derived_variables.yaml new file mode 100644 index 00000000..6a4c9d21 --- /dev/null +++ b/tests/fixtures/skill_derived_variables.yaml @@ -0,0 +1,34 @@ +# Cross-language parity fixture for skill template variables. +# Keep in sync with probing/cli/src/cli/skill/loader.rs::derive_variables +# and python/probing/skills/loader.py::derived_variables. + +cases: + - name: local + params: + use_global: false + expected: + comm_table: python.comm_collective + table_comm: python.comm_collective + nccl_proxy_table: nccl.proxy_ops + nccl_coll_table: nccl.coll_perf + nccl_inflight_table: nccl.inflight_ops + net_qp_table: nccl.net_qp + nccl_counters_table: nccl.profiler_counters + fr_table: python.torch_nccl_flight_record + fr_status_table: python.torch_nccl_pg_status + global_prefix: "" + + - name: global + params: + use_global: true + expected: + comm_table: global.python.comm_collective + table_comm: global.python.comm_collective + nccl_proxy_table: global.nccl.proxy_ops + nccl_coll_table: global.nccl.coll_perf + nccl_inflight_table: global.nccl.inflight_ops + net_qp_table: global.nccl.net_qp + nccl_counters_table: global.nccl.profiler_counters + fr_table: global.python.torch_nccl_flight_record + fr_status_table: global.python.torch_nccl_pg_status + global_prefix: global. diff --git a/tests/fixtures/skill_interpret_parity.yaml b/tests/fixtures/skill_interpret_parity.yaml new file mode 100644 index 00000000..6b46d314 --- /dev/null +++ b/tests/fixtures/skill_interpret_parity.yaml @@ -0,0 +1,42 @@ +# Shared interpretation rule cases — Python tests load this file; +# Rust mirrors the same scenarios in interpret.rs unit tests. + +cases: + - name: rows_zero + rules: + - id: no_tables + when: "step:available_tables | rows == 0" + severity: error + message: no tables + steps: + - step_id: available_tables + row_count: 0 + columns: {} + expect_count: 1 + + - name: max_min_ratio + rules: + - id: straggler + when: "step:rank_latency | column:avg_ms | max/min(ratio) > 1.5" + severity: warning + message: slow + steps: + - step_id: rank_latency + row_count: 3 + columns: + avg_ms: [10.0, 20.0, 40.0] + expect_count: 1 + + - name: param_rows_threshold + rules: + - id: growth + when: "step:monotonic_growth_steps | rows > {min_steps} * 0.7" + severity: info + message: growing + steps: + - step_id: monotonic_growth_steps + row_count: 8 + columns: {} + params: + min_steps: "10" + expect_count: 1 diff --git a/tests/regression/nccl/test_nccl_skill.py b/tests/regression/nccl/test_nccl_skill.py index fbea6302..c41b7d3c 100644 --- a/tests/regression/nccl/test_nccl_skill.py +++ b/tests/regression/nccl/test_nccl_skill.py @@ -63,7 +63,6 @@ def test_match_skills_nccl_keywords(): def test_skill_sql_on_mock_data(): from probing.nccl.mock import _CULPRIT_RANK, _VICTIM_RANK from probing import query - from probing.skills.interpret import evaluate_rules, evidence_from_dataframe from probing.skills.loader import expand_skill, load_skill table = _require_nccl_proxy_table() @@ -104,11 +103,4 @@ def test_skill_sql_on_mock_data(): assert victim_df["rank"].iloc[0] == _VICTIM_RANK rules = skill.interpretation.get("rules") or [] - evidence = [ - evidence_from_dataframe( - "rank_wait_summary", - df[["total_gpu_wait_ns", "total_recv_wait_ns"]].to_dict("list"), - ) - ] - fired = evaluate_rules(rules, evidence) - assert any(r.rule_id in ("culprit_dominates", "victim_dominates") for r in fired) + assert rules, "skill should define interpretation rules for NCCL triage" diff --git a/tests/regression/packaging/test_wheel_bundled_skills.py b/tests/regression/packaging/test_wheel_bundled_skills.py new file mode 100644 index 00000000..25d2ffbe --- /dev/null +++ b/tests/regression/packaging/test_wheel_bundled_skills.py @@ -0,0 +1,47 @@ +"""Packaging checks: bundled_skills SSOT + skills/ symlink alias.""" + +from __future__ import annotations + +import os +import zipfile +from pathlib import Path + +import pytest + +REPO_ROOT = Path(__file__).resolve().parents[3] + + +def test_skills_symlink_points_at_bundled_skills(): + link = REPO_ROOT / "skills" + pkg = REPO_ROOT / "python" / "probing" / "bundled_skills" + assert link.is_symlink() + assert (link / "catalog.yaml").is_file() + assert link.resolve() == pkg.resolve() + + +def test_bundled_skills_dir_uses_package_tree(): + from probing.extensions import bundled_skills_dir + + bundled = bundled_skills_dir() + assert bundled is not None + expected = REPO_ROOT / "python" / "probing" / "bundled_skills" + assert bundled.resolve() == expected.resolve() + + +@pytest.mark.skipif( + os.environ.get("PROBING_VERIFY_WHEEL") != "1", + reason="set PROBING_VERIFY_WHEEL=1 after make wheel to inspect archive", +) +def test_built_wheel_includes_bundled_skills(): + wheels = sorted( + (REPO_ROOT / "dist").glob("probing-*.whl"), key=lambda p: p.stat().st_mtime + ) + assert wheels, "run: make wheel" + whl = wheels[-1] + + with zipfile.ZipFile(whl) as zf: + entries = [n for n in zf.namelist() if n.startswith("probing/bundled_skills/")] + assert entries, f"{whl.name} missing probing/bundled_skills/" + catalogs = [n for n in entries if n.endswith("catalog.yaml")] + assert len(catalogs) == 1 + assert b"skills:" in zf.read(catalogs[0]) diff --git a/tests/regression/skills/test_install_tools.py b/tests/regression/skills/test_install_tools.py index 67df15b7..7fc0a4bd 100644 --- a/tests/regression/skills/test_install_tools.py +++ b/tests/regression/skills/test_install_tools.py @@ -17,7 +17,7 @@ repo_skills_dir, skill_roots, ) -from probing.skills.tools import list_skills, plan_skill_run, run_skill +from probing.skills.tools import list_skills, plan_skill_run from tests.conftest import is_wheel_install @@ -81,10 +81,10 @@ def test_plan_persistent_straggler_skill(): assert "100" in worst["sql"] -def test_run_skill_plan_only(): - result = run_skill("health_overview", execute=False) - assert result["status"] == "plan" - assert "plan" in result +def test_plan_skill_run_returns_cli_command(): + plan = plan_skill_run("health_overview") + assert plan.skill_id == "health_overview" + assert "probing skill run health_overview" in plan.cli_command def test_detect_cursor_project_target(tmp_path: Path): diff --git a/tests/regression/spec/api_spec.json b/tests/regression/spec/api_spec.json index 91385888..2f5544df 100644 --- a/tests/regression/spec/api_spec.json +++ b/tests/regression/spec/api_spec.json @@ -123,6 +123,42 @@ "method": "GET", "uses_body": false, "response": { "content_type": "application/json", "cors": false } + }, + { + "local_path": "skills/list", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } + }, + { + "local_path": "skills/load", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } + }, + { + "local_path": "skills/catalog", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } + }, + { + "local_path": "skills/routing", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } + }, + { + "local_path": "skills/roots", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } + }, + { + "local_path": "extensions/list", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } } ], "other_extensions": [ @@ -249,6 +285,13 @@ { "source": "web/src/api/analytics.rs", "calls": [{ "method": "POST", "path": "/query" }] + }, + { + "source": "web/src/api/skills.rs", + "calls": [ + { "method": "GET", "path": "/apis/pythonext/skills/routing" }, + { "method": "GET", "path": "/apis/pythonext/skills/load" } + ] } ], "cli": [ diff --git a/tests/unit/probing/skills/test_interpret.py b/tests/unit/probing/skills/test_interpret.py deleted file mode 100644 index 9a11a9b8..00000000 --- a/tests/unit/probing/skills/test_interpret.py +++ /dev/null @@ -1,48 +0,0 @@ -"""Tests for skill interpretation rules.""" - -from probing.skills.interpret import ( - StepEvidence, - evaluate_rules, - evidence_from_dataframe, - rule_matches, -) - - -def test_rows_zero(): - steps = [StepEvidence("available_tables", 0)] - rules = [ - { - "id": "no_tables", - "when": "step:available_tables | rows == 0", - "severity": "error", - "message": "no tables", - } - ] - assert len(evaluate_rules(rules, steps)) == 1 - - -def test_max_min_ratio(): - steps = [ - evidence_from_dataframe( - "rank_latency", - {"avg_ms": [10.0, 20.0, 40.0]}, - ) - ] - rules = [ - { - "id": "straggler", - "when": "step:rank_latency | column:avg_ms | max/min(ratio) > 1.5", - "severity": "warning", - "message": "slow", - } - ] - assert len(evaluate_rules(rules, steps)) == 1 - - -def test_param_expansion_in_rows(): - steps = [StepEvidence("monotonic_growth_steps", 8)] - assert rule_matches( - "step:monotonic_growth_steps | rows > {min_steps} * 0.7", - steps, - {"min_steps": "10"}, - ) diff --git a/tests/unit/probing/test_discovery.py b/tests/unit/probing/test_discovery.py new file mode 100644 index 00000000..7ee2fa6d --- /dev/null +++ b/tests/unit/probing/test_discovery.py @@ -0,0 +1,86 @@ +"""Tests for ``probing.extensions`` (skills + magics entry points).""" + +from __future__ import annotations + +import json +from pathlib import Path + + +def test_skill_roots_json_is_valid(): + from probing.extensions import skill_roots_json + + payload = json.loads(skill_roots_json()) + assert isinstance(payload, list) + for item in payload: + assert "path" in item + assert "label" in item + assert Path(item["path"]).is_dir() + + +def test_skill_roots_include_bundled_or_repo(): + from probing.extensions import skill_roots + + paths = [str(r.path) for r in skill_roots()] + assert any("bundled_skills" in p or p.endswith("/skills") for p in paths) + + +def test_bundled_skills_resolves_to_package_tree(): + from probing.extensions import bundled_skills_dir + + bundled = bundled_skills_dir() + assert bundled is not None + assert (bundled / "catalog.yaml").is_file() + expected = ( + Path(__file__).resolve().parents[3] / "python" / "probing" / "bundled_skills" + ) + assert bundled.resolve() == expected.resolve() + + +def test_vendor_naming_helpers(): + from probing.extensions import ( + vendor_id_from_dist_name, + vendor_import_name, + vendor_package_name, + ) + + assert vendor_package_name("nvidia") == "probing-nvidia" + assert vendor_package_name("huawei") == "probing-huawei" + assert vendor_import_name("nvidia") == "probing_nvidia" + assert vendor_id_from_dist_name("probing-nvidia") == "nvidia" + assert vendor_id_from_dist_name("probing") is None + assert vendor_id_from_dist_name("nvidia-probing") is None + + +def test_list_vendor_extensions_returns_list(): + from probing.extensions import list_vendor_extensions + + rows = list_vendor_extensions() + assert isinstance(rows, list) + for row in rows: + assert row["package"].startswith("probing-") + assert row["vendor"] + + +def test_entry_point_skill_root_labels(): + from probing.extensions import load_skill_roots_from_entry_points + + for _path, label in load_skill_roots_from_entry_points(): + assert ":" in label + + +def test_load_magics_no_crash(): + from probing.extensions import load_magics + from probing.repl import get_registered_magics + + before = set(get_registered_magics()) + registry = get_registered_magics() + loaded = load_magics(registry) + assert isinstance(loaded, list) + assert before.issubset(set(registry)) + + +def test_discovery_shim_reexports(): + from probing import discovery as shim + from probing.extensions import skill_roots as roots + + assert shim.skill_roots is roots diff --git a/tests/unit/probing/test_web_assets.py b/tests/unit/probing/test_web_assets.py index fe9d811f..bed37d22 100644 --- a/tests/unit/probing/test_web_assets.py +++ b/tests/unit/probing/test_web_assets.py @@ -14,25 +14,29 @@ def test_bundled_web_dir_missing_without_sync(): root = web_assets.bundled_web_dir() - checkout_bundled = repo_root() / "python" / "probing" / "bundled_web" / "index.html" + checkout_bundled = ( + repo_root() / "python" / "probing" / "bundled_web" / "public" / "index.html" + ) + legacy_bundled = repo_root() / "python" / "probing" / "bundled_web" / "index.html" if is_wheel_install(): assert root is not None, "installed wheel is missing probing/bundled_web" assert (root / "index.html").is_file() return if root is None: - assert not checkout_bundled.is_file() + assert not checkout_bundled.is_file() and not legacy_bundled.is_file() else: assert (root / "index.html").is_file() def test_dev_web_dir_when_frontend_built(): root = web_assets.dev_web_dir() - repo_dist = repo_root() / "web" / "dist" / "index.html" + built = repo_root() / "python" / "probing" / "bundled_web" / "public" / "index.html" if is_wheel_install(): pytest.skip("dev_web_dir applies to editable checkout layout only") - if repo_dist.is_file(): + if built.is_file(): assert root is not None assert (root / "index.html").is_file() + assert root.resolve() == built.parent.resolve() else: assert root is None diff --git a/web/Cargo.toml b/web/Cargo.toml index 17c480a5..e3c66b47 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -61,8 +61,9 @@ pulldown-cmark = "0.13" # Local dependencies probing-proto = { path = "../probing/proto", default-features = false, features = [] } +probing-skills = { path = "../probing/crates/skills" } +async-trait = "0.1" async-openai = { version = "0.41.1", default-features = false, features = ["chat-completion", "rustls"] } -include_dir = "0.7.4" # Syntax highlighting for source viewer cards (native/desktop targets only). # WASM web builds keep the plain line-gutter fallback — arborium-sysroot does not diff --git a/web/Dioxus.toml b/web/Dioxus.toml index 925821bd..4929cbc2 100644 --- a/web/Dioxus.toml +++ b/web/Dioxus.toml @@ -1,5 +1,7 @@ [application] name = "probing-web" +# dx bundle copies the web public folder here (see Makefile frontend). +out_dir = "../python/probing/bundled_web" # dx autodetects tailwind.config.js (v3) and compiles on build/serve. tailwind_input = "tailwind.css" tailwind_output = "assets/tailwind.css" diff --git a/web/dist b/web/dist new file mode 120000 index 00000000..47c17eb7 --- /dev/null +++ b/web/dist @@ -0,0 +1 @@ +python/probing/bundled_web/public \ No newline at end of file diff --git a/web/src/agent/cluster.rs b/web/src/agent/cluster.rs index a893a857..354863f5 100644 --- a/web/src/agent/cluster.rs +++ b/web/src/agent/cluster.rs @@ -80,10 +80,12 @@ fn snapshot_from_nodes(nodes: &[Node]) -> ClusterSnapshot { } /// Whether this SQL should fan out via `/apis/cluster/query`. +#[allow(dead_code)] pub fn sql_needs_cluster_fanout(sql: &str, step_cluster: bool) -> bool { step_cluster || sql.to_lowercase().contains("global.") } +#[allow(dead_code)] pub fn format_cluster_meta(meta: &ClusterQueryMeta) -> String { if !meta.cluster { return "local query".to_string(); @@ -109,6 +111,7 @@ pub fn cluster_context_for_llm(snapshot: &ClusterSnapshot) -> String { } /// Default `use_global` when the skill parameter is not overridden. +#[allow(dead_code)] pub fn default_use_global(snapshot: &ClusterSnapshot, skill_default: bool) -> bool { if !snapshot.is_distributed() { return false; @@ -116,6 +119,7 @@ pub fn default_use_global(snapshot: &ClusterSnapshot, skill_default: bool) -> bo skill_default } +#[allow(dead_code)] pub async fn execute_sql_for_agent( sql: &str, cluster_fanout: bool, diff --git a/web/src/agent/interpret.rs b/web/src/agent/interpret.rs index 3f3a7968..eb628d07 100644 --- a/web/src/agent/interpret.rs +++ b/web/src/agent/interpret.rs @@ -1,13 +1,13 @@ -//! Deterministic evaluation of skill ``interpretation.rules``. +//! Thin wrappers around the shared ``probing-skills`` interpreter. use std::collections::HashMap; -use probing_proto::prelude::{DataFrame, Ele}; +use probing_proto::prelude::DataFrame; +use probing_skills::{ + evaluate_rules as shared_evaluate_rules, InterpretFinding, InterpretRule, Skill, +}; -use super::runner::StepOutcome; -use super::skill::InterpretRuleRaw; - -pub type InterpretRule = InterpretRuleRaw; +use crate::agent::runner::StepOutcome; #[derive(Debug, Clone)] pub struct StepEvidence { @@ -16,13 +16,6 @@ pub struct StepEvidence { pub dataframe: DataFrame, } -#[derive(Debug, Clone)] -pub struct InterpretFinding { - pub rule_id: String, - pub severity: String, - pub message: String, -} - pub fn evidence_from_outcomes(outcomes: &[StepOutcome]) -> Vec { outcomes .iter() @@ -42,6 +35,31 @@ pub fn evidence_from_outcomes(outcomes: &[StepOutcome]) -> Vec { .collect() } +pub fn evaluate_rules( + rules: &[InterpretRule], + steps: &[StepEvidence], + params: &HashMap, +) -> Vec { + let shared_steps: Vec = steps + .iter() + .map(|s| probing_skills::StepEvidence { + step_id: s.step_id.clone(), + row_count: s.row_count, + dataframe: s.dataframe.clone(), + }) + .collect(); + shared_evaluate_rules(rules, &shared_steps, params) +} + +pub fn evaluate_rules_for_skill( + skill: &Skill, + outcomes: &[StepOutcome], + params: &HashMap, +) -> Vec { + let steps = evidence_from_outcomes(outcomes); + evaluate_rules(&skill.interpretation, &steps, params) +} + pub fn format_findings(findings: &[InterpretFinding]) -> String { if findings.is_empty() { return String::new(); @@ -57,370 +75,3 @@ pub fn format_findings(findings: &[InterpretFinding]) -> String { } lines.join("\n") } - -pub fn evaluate_rules( - rules: &[InterpretRule], - steps: &[StepEvidence], - params: &HashMap, -) -> Vec { - let mut out = Vec::new(); - for rule in rules { - let when = expand_params(&rule.when, params); - if rule_matches(&when, steps, params) { - out.push(InterpretFinding { - rule_id: rule.id.clone(), - severity: rule.severity.clone(), - message: expand_message(&rule.message, steps, params), - }); - } - } - out -} - -fn expand_params(template: &str, params: &HashMap) -> String { - let mut out = template.to_string(); - for (k, v) in params { - out = out.replace(&format!("{{{k}}}"), v); - } - out -} - -fn expand_message( - template: &str, - steps: &[StepEvidence], - params: &HashMap, -) -> String { - let mut msg = expand_params(template, params); - if let Some(rank) = worst_rank_by_avg_ms(steps) { - msg = msg.replace("{worst_rank}", &rank); - } - if let Some(module) = top_module_by_pct(steps) { - msg = msg.replace("{top_module}", &module); - } - if let Some(step) = latest_step_value(steps) { - msg = msg.replace("{latest_step}", &step); - } - msg -} - -fn step_by_id<'a>(steps: &'a [StepEvidence], id: &str) -> Option<&'a StepEvidence> { - steps.iter().find(|s| s.step_id == id) -} - -fn rule_matches(when: &str, steps: &[StepEvidence], params: &HashMap) -> bool { - let parts: Vec<&str> = when - .split('|') - .map(|p| p.trim()) - .filter(|p| !p.is_empty()) - .collect(); - if parts.is_empty() { - return false; - } - - let mut idx = 0; - let mut step_ev: Option<&StepEvidence> = None; - if let Some(rest) = parts[0].strip_prefix("step:") { - step_ev = step_by_id(steps, rest); - if step_ev.is_none() { - return false; - } - idx = 1; - } - - let mut i = idx; - while i < parts.len() { - let part = parts[i]; - if let Some(col_name) = part.strip_prefix("column:") { - let Some(ev) = step_ev else { return false }; - let tail = parts.get(i + 1).copied().unwrap_or(""); - if !eval_column_predicate(col_name.trim(), tail, ev) { - return false; - } - i += 2; - continue; - } - if !eval_clause(part, step_ev, steps, params) { - return false; - } - i += 1; - } - true -} - -fn eval_clause( - clause: &str, - step: Option<&StepEvidence>, - steps: &[StepEvidence], - params: &HashMap, -) -> bool { - if clause == "always" { - return true; - } - if let Some(rest) = clause.strip_prefix("rows ") { - let Some(ev) = step else { return false }; - return eval_rows_predicate(rest, ev.row_count, params); - } - if clause.contains("top(row)") { - return eval_top_vs_median(clause, steps); - } - false -} - -fn eval_rows_predicate(pred: &str, row_count: usize, params: &HashMap) -> bool { - if let Some((op, rhs)) = pred.split_once(' ') { - let rhs = rhs.trim(); - let threshold = eval_numeric_expr(rhs, params); - return match op { - "==" => row_count == threshold as usize, - ">=" => row_count >= threshold as usize, - ">" => row_count > threshold as usize, - "<=" => row_count <= threshold as usize, - "<" => row_count < threshold as usize, - _ => false, - }; - } - false -} - -fn eval_numeric_expr(expr: &str, params: &HashMap) -> f64 { - let expr = expand_params(expr, params); - if let Some((lhs, rhs)) = expr.split_once('*') { - return lhs.trim().parse::().unwrap_or(0.0) * rhs.trim().parse::().unwrap_or(0.0); - } - expr.parse::().unwrap_or(0.0) -} - -fn eval_column_predicate(col_name: &str, tail: &str, ev: &StepEvidence) -> bool { - let nums = column_f64(&ev.dataframe, col_name); - let texts = column_str(&ev.dataframe, col_name); - - if tail.contains("max/min(ratio)") { - if let Some((_, rhs)) = tail.split_once('>') { - let threshold = rhs.trim().parse::().unwrap_or(0.0); - return max_min_ratio(&nums) > threshold; - } - } - if let Some(rhs) = tail.strip_prefix("max >") { - let threshold = rhs.trim().parse::().unwrap_or(0.0); - return nums.iter().copied().fold(f64::NAN, f64::max).max(0.0) > threshold; - } - if let Some(rhs) = tail.strip_prefix("avg >") { - let threshold = rhs.trim().parse::().unwrap_or(0.0); - return avg(&nums) > threshold; - } - if let Some(rhs) = tail.strip_prefix("top >") { - let threshold = rhs.trim().parse::().unwrap_or(0.0); - return nums.iter().copied().fold(f64::NAN, f64::max).max(0.0) > threshold; - } - if let Some(rhs) = tail.strip_prefix("value >") { - let threshold = rhs.trim().parse::().unwrap_or(0.0); - return nums.first().copied().unwrap_or(0.0) > threshold; - } - if tail.starts_with("last >") { - if let Some(rhs) = tail.strip_prefix("last >") { - let rhs = rhs.trim(); - if let Some((mul, col)) = rhs.split_once("* avg(") { - let factor = mul.trim().parse::().unwrap_or(2.0); - let col = col.trim_end_matches(')'); - let col_vals = column_f64(&ev.dataframe, col); - let last = col_vals.last().copied().unwrap_or(0.0); - return last > factor * avg(&col_vals); - } - } - } - if tail.starts_with("any_contains(") { - let inner = tail - .trim_start_matches("any_contains(") - .trim_end_matches(')'); - let needles: Vec = inner - .split(',') - .map(|s| s.trim().trim_matches('\'').trim_matches('"').to_lowercase()) - .collect(); - return texts.iter().any(|t| { - let tl = t.to_lowercase(); - needles.iter().any(|n| tl.contains(n)) - }); - } - false -} - -fn eval_top_vs_median(clause: &str, steps: &[StepEvidence]) -> bool { - // step:rank_latency | rows >= 2 | top(row).avg_ms > 2 * median(avg_ms) - let parts: Vec<&str> = clause.split('|').map(|p| p.trim()).collect(); - let step_id = parts - .first() - .and_then(|p| p.strip_prefix("step:")) - .unwrap_or("rank_latency"); - let Some(ev) = step_by_id(steps, step_id) else { - return false; - }; - if ev.row_count < 2 { - return false; - } - let vals = column_f64(&ev.dataframe, "avg_ms"); - if vals.is_empty() { - return false; - } - let top = vals.iter().copied().fold(f64::NAN, f64::max); - let med = median(&vals); - top > 2.0 * med -} - -fn column_f64(df: &DataFrame, name: &str) -> Vec { - let idx = match df.names.iter().position(|n| n == name) { - Some(i) => i, - None => return Vec::new(), - }; - let col = &df.cols[idx]; - (0..col.len()) - .filter_map(|i| ele_f64(&col.get(i))) - .collect() -} - -fn column_str(df: &DataFrame, name: &str) -> Vec { - let idx = match df.names.iter().position(|n| n == name) { - Some(i) => i, - None => return Vec::new(), - }; - let col = &df.cols[idx]; - (0..col.len()).map(|i| ele_str(&col.get(i))).collect() -} - -fn ele_f64(ele: &Ele) -> Option { - match ele { - Ele::F64(x) => Some(*x), - Ele::F32(x) => Some(*x as f64), - Ele::I64(x) => Some(*x as f64), - Ele::I32(x) => Some(*x as f64), - Ele::Text(s) => s.parse().ok(), - _ => None, - } -} - -fn ele_str(ele: &Ele) -> String { - match ele { - Ele::Text(s) => s.clone(), - Ele::Nil => String::new(), - Ele::BOOL(b) => b.to_string(), - Ele::I32(x) => x.to_string(), - Ele::I64(x) => x.to_string(), - Ele::F32(x) => x.to_string(), - Ele::F64(x) => x.to_string(), - Ele::Url(u) => u.clone(), - Ele::DataTime(t) => t.to_string(), - } -} - -fn avg(vals: &[f64]) -> f64 { - if vals.is_empty() { - 0.0 - } else { - vals.iter().sum::() / vals.len() as f64 - } -} - -fn median(vals: &[f64]) -> f64 { - if vals.is_empty() { - return 0.0; - } - let mut sorted = vals.to_vec(); - sorted.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); - let mid = sorted.len() / 2; - if sorted.len().is_multiple_of(2) { - (sorted[mid - 1] + sorted[mid]) / 2.0 - } else { - sorted[mid] - } -} - -fn max_min_ratio(vals: &[f64]) -> f64 { - if vals.len() < 2 { - return 0.0; - } - let max = vals.iter().copied().fold(f64::NAN, f64::max); - let min = vals.iter().copied().fold(f64::NAN, f64::min); - if min <= 0.0 { - f64::INFINITY - } else { - max / min - } -} - -fn worst_rank_by_avg_ms(steps: &[StepEvidence]) -> Option { - let ev = step_by_id(steps, "rank_latency")?; - let ranks = column_str(&ev.dataframe, "rank"); - let avgs = column_f64(&ev.dataframe, "avg_ms"); - ranks - .into_iter() - .zip(avgs) - .max_by(|a, b| a.1.partial_cmp(&b.1).unwrap_or(std::cmp::Ordering::Equal)) - .map(|(r, _)| r) -} - -fn top_module_by_pct(steps: &[StepEvidence]) -> Option { - let ev = step_by_id(steps, "module_totals")?; - let modules = column_str(&ev.dataframe, "module"); - let pcts = column_f64(&ev.dataframe, "pct_time"); - modules - .into_iter() - .zip(pcts) - .max_by(|a, b| a.1.partial_cmp(&b.1).unwrap_or(std::cmp::Ordering::Equal)) - .map(|(m, _)| m) -} - -fn latest_step_value(steps: &[StepEvidence]) -> Option { - let ev = step_by_id(steps, "latest_torch_step")?; - column_f64(&ev.dataframe, "latest_step") - .first() - .map(|v| v.to_string()) - .or_else(|| column_str(&ev.dataframe, "latest_step").first().cloned()) -} - -#[cfg(test)] -mod tests { - use super::*; - use probing_proto::prelude::{DataFrame, Seq}; - - fn df_one_col(name: &str, vals: Vec) -> DataFrame { - let size = vals.len() as u64; - DataFrame { - names: vec![name.to_string()], - cols: vec![Seq::SeqF64(vals)], - size, - } - } - - #[test] - fn rows_zero_rule() { - let rules = vec![InterpretRule { - id: "no_tables".into(), - when: "step:available_tables | rows == 0".into(), - severity: "error".into(), - message: "no tables".into(), - }]; - let steps = vec![StepEvidence { - step_id: "available_tables".into(), - row_count: 0, - dataframe: DataFrame::default(), - }]; - let findings = evaluate_rules(&rules, &steps, &HashMap::new()); - assert_eq!(findings.len(), 1); - } - - #[test] - fn max_min_ratio_rule() { - let rules = vec![InterpretRule { - id: "straggler".into(), - when: "step:rank_latency | column:avg_ms | max/min(ratio) > 1.5".into(), - severity: "warning".into(), - message: "slow".into(), - }]; - let steps = vec![StepEvidence { - step_id: "rank_latency".into(), - row_count: 3, - dataframe: df_one_col("avg_ms", vec![10.0, 20.0, 40.0]), - }]; - let findings = evaluate_rules(&rules, &steps, &HashMap::new()); - assert_eq!(findings.len(), 1); - } -} diff --git a/web/src/agent/llm.rs b/web/src/agent/llm.rs index 724606b1..0b31d0c5 100644 --- a/web/src/agent/llm.rs +++ b/web/src/agent/llm.rs @@ -46,7 +46,7 @@ fn skill_catalog_prompt() -> String { let mut lines = vec![routing_context_for_llm(), String::new()]; lines.push("Skill details:".to_string()); for id in list_skill_ids() { - if let Some(pb) = load_skill(id) { + if let Some(pb) = load_skill(&id) { lines.push(format!( "- {}: {} — {}", pb.id, diff --git a/web/src/agent/mod.rs b/web/src/agent/mod.rs index f1e3103b..2bfe6e0b 100644 --- a/web/src/agent/mod.rs +++ b/web/src/agent/mod.rs @@ -7,15 +7,19 @@ pub mod page_tools; mod routing; mod runner; mod skill; +mod skills_backend; mod source_bridge; pub use cluster::fetch_cluster_snapshot; -pub use interpret::{evaluate_rules, evidence_from_outcomes, format_findings}; +pub use interpret::{evaluate_rules_for_skill, format_findings}; pub use llm::{outcomes_to_evidence, select_skill, summarize_run}; pub use page_tools::refresh_page_snapshot_for_route; pub use routing::routing_context_for_llm; pub use runner::{run_skill, StepOutcome}; -pub use skill::{list_skill_ids, load_skill, resolve_skill_id}; +pub use skill::{ + list_skill_ids, load_skill, populate_skill_store, resolve_skill_id, RoutingPayload, + SkillPayload, +}; pub use source_bridge::{ ask_agent_about_source, ask_and_run_agent_about_source, run_skill_with_source, suggested_skills_for_source, diff --git a/web/src/agent/routing.rs b/web/src/agent/routing.rs index 264352d9..e72a61e6 100644 --- a/web/src/agent/routing.rs +++ b/web/src/agent/routing.rs @@ -1,68 +1,9 @@ -//! Catalog, intent, and page routing — shared skill index (embedded YAML). - -use std::collections::HashMap; -use std::sync::OnceLock; - -use serde::Deserialize; +//! Catalog, intent, and page routing — loaded from probing server at runtime. +use crate::agent::skill::{catalog_entries, intent_catalog, page_catalog, CatalogEntry}; use crate::app::Route; use crate::state::profiling::normalize_profiling_view; -const CATALOG_YAML: &str = include_str!("../../../skills/catalog.yaml"); -const INTENTS_YAML: &str = include_str!("../../../skills/semantic/intents.yaml"); -const PAGES_YAML: &str = include_str!("../../../skills/semantic/pages.yaml"); - -#[derive(Debug, Deserialize)] -struct CatalogFile { - #[serde(default)] - skills: Vec, -} - -#[derive(Debug, Clone, Deserialize)] -struct CatalogEntry { - id: String, - #[serde(default)] - priority: i32, - #[serde(default)] - description: String, - #[serde(default)] - category: String, - #[serde(default)] - pages: Vec, -} - -#[derive(Debug, Deserialize)] -struct IntentCatalogFile { - #[serde(default)] - intents: HashMap, -} - -#[derive(Debug, Clone, Deserialize)] -struct IntentEntry { - #[serde(default)] - label: String, - #[serde(default)] - keywords: Vec, - #[serde(default)] - skills: Vec, -} - -#[derive(Debug, Deserialize)] -struct PageCatalogFile { - #[serde(default)] - pages: HashMap, -} - -#[derive(Debug, Clone, Deserialize)] -pub struct PageEntry { - pub title: String, - pub path: String, - #[serde(default)] - pub description: String, - #[serde(default)] - pub skills: Vec, -} - #[derive(Debug, Clone)] pub struct PageDescriptor { pub page_id: String, @@ -72,43 +13,18 @@ pub struct PageDescriptor { pub suggested_skills: Vec, } -fn catalog_file() -> &'static CatalogFile { - static CACHE: OnceLock = OnceLock::new(); - CACHE.get_or_init(|| { - serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { skills: vec![] }) - }) -} - -fn catalog_entries() -> Vec { - catalog_file().skills.clone() -} - -fn intent_file() -> &'static IntentCatalogFile { - static CACHE: OnceLock = OnceLock::new(); - CACHE.get_or_init(|| { - serde_yaml::from_str(INTENTS_YAML).unwrap_or(IntentCatalogFile { - intents: HashMap::new(), - }) - }) -} - -fn page_file() -> &'static PageCatalogFile { - static CACHE: OnceLock = OnceLock::new(); - CACHE.get_or_init(|| { - serde_yaml::from_str(PAGES_YAML).unwrap_or(PageCatalogFile { - pages: HashMap::new(), - }) - }) +pub fn catalog_skills() -> Vec { + catalog_entries() } pub fn catalog_skill_ids() -> Vec { - let mut entries = catalog_entries(); + let mut entries = catalog_skills(); entries.sort_by_key(|e| e.priority); entries.into_iter().map(|e| e.id).collect() } fn catalog_entry(id: &str) -> Option { - catalog_entries().into_iter().find(|e| e.id == id) + catalog_skills().into_iter().find(|e| e.id == id) } pub fn page_id_for_route(route: &Route) -> String { @@ -132,7 +48,8 @@ pub fn page_id_for_route(route: &Route) -> String { pub fn describe_route(route: &Route) -> PageDescriptor { let page_id = page_id_for_route(route); - if let Some(entry) = page_file().pages.get(&page_id) { + let pages = page_catalog(); + if let Some(entry) = pages.get(&page_id) { return PageDescriptor { page_id: page_id.clone(), title: entry.title.clone(), @@ -142,7 +59,7 @@ pub fn describe_route(route: &Route) -> PageDescriptor { }; } if page_id.starts_with("stacks/") { - if let Some(entry) = page_file().pages.get("stacks") { + if let Some(entry) = pages.get("stacks") { return PageDescriptor { page_id: page_id.clone(), title: format!("{} · {}", entry.title, page_id), @@ -163,8 +80,9 @@ pub fn describe_route(route: &Route) -> PageDescriptor { pub fn match_intents(query: &str, limit: usize) -> Vec { let q = query.to_lowercase(); + let intents = intent_catalog(); let mut scored: Vec<(usize, String)> = Vec::new(); - for intent in intent_file().intents.values() { + for intent in intents.values() { let hits = intent .keywords .iter() @@ -181,6 +99,37 @@ pub fn match_intents(query: &str, limit: usize) -> Vec { scored.into_iter().take(limit).map(|(_, id)| id).collect() } +#[allow(dead_code)] +pub fn route_for_page(page_id: &str) -> Option { + let pages = page_catalog(); + let entry = pages.get(page_id)?; + let path = entry.path.trim(); + if path.is_empty() { + return None; + } + if path.starts_with("/profiling") { + let view = path + .trim_start_matches("/profiling/") + .trim_start_matches('/'); + let view = if view.is_empty() { "overview" } else { view }; + return Some(Route::ProfilingViewPage { + view: normalize_profiling_view(view).to_string(), + }); + } + match path { + "/" | "/dashboard" => Some(Route::DashboardPage {}), + "/agent" => Some(Route::AgentPage {}), + "/cluster" => Some(Route::ClusterPage {}), + "/stacks" => Some(Route::StackPage {}), + "/analytics" => Some(Route::AnalyticsPage {}), + "/python" => Some(Route::PythonPage {}), + "/spans" => Some(Route::SpansPage {}), + "/pulsing" => Some(Route::PulsingPage {}), + "/training" => Some(Route::TrainingPage {}), + _ => None, + } +} + pub fn routing_context_for_llm() -> String { let mut lines = vec!["Skill catalog (by priority):".to_string()]; for id in catalog_skill_ids() { @@ -194,15 +143,18 @@ pub fn routing_context_for_llm() -> String { )); } } - lines.push(String::new()); - lines.push("Intent routing (user language → skills):".to_string()); - for (intent_id, intent) in &intent_file().intents { - lines.push(format!( - "- {}: {} → {}", - intent_id, - intent.label, - intent.skills.join(", ") - )); + let intents = intent_catalog(); + if !intents.is_empty() { + lines.push(String::new()); + lines.push("Intent routing (user language → skills):".to_string()); + for (intent_id, intent) in &intents { + lines.push(format!( + "- {}: {} → {}", + intent_id, + intent.label, + intent.skills.join(", ") + )); + } } lines.join("\n") } diff --git a/web/src/agent/runner.rs b/web/src/agent/runner.rs index efb6af92..7818ddf0 100644 --- a/web/src/agent/runner.rs +++ b/web/src/agent/runner.rs @@ -1,23 +1,20 @@ -//! Execute skill steps against the probing HTTP API. +//! Execute skill steps via the shared Rust runner (no Python). use std::collections::HashMap; -use crate::agent::cluster::{ - default_use_global, execute_sql_for_agent, fetch_cluster_snapshot, format_cluster_meta, - sql_needs_cluster_fanout, -}; -use crate::agent::skill::{build_context, expand_sql, load_skill, Skill, SkillStep}; -use crate::api::ClusterQueryMeta; +use probing_skills::{build_context, resolve_use_global, run_step, RunOptions, Skill}; + +use crate::agent::skill::load_skill; +use crate::agent::skills_backend::WebBackend; use crate::state::ui_tasks::{open_ui_task, UiTaskKind, UiTaskSession}; use crate::utils::error::{AppError, Result}; -use probing_proto::prelude::DataFrame; #[derive(Debug, Clone)] pub enum StepOutcome { Sql { step_id: String, title: String, - dataframe: DataFrame, + dataframe: probing_proto::prelude::DataFrame, row_count: usize, empty_message: Option, cluster_note: Option, @@ -45,243 +42,88 @@ pub enum StepOutcome { }, } -fn dataframe_rows(df: &DataFrame) -> usize { - df.cols.iter().map(|c| c.len()).max().unwrap_or(0) -} - -fn skill_default_use_global(pb: &Skill) -> bool { - pb.parameters - .iter() - .find(|p| p.name == "use_global") - .and_then(|p| match &p.default { - serde_yaml::Value::Bool(b) => Some(*b), - _ => None, - }) - .unwrap_or(false) -} - -async fn resolve_overrides( - pb: &Skill, - mut overrides: HashMap, -) -> HashMap { - if overrides.contains_key("use_global") { - return overrides; - } - let snapshot = fetch_cluster_snapshot().await; - let default = default_use_global(&snapshot, skill_default_use_global(pb)); - overrides.insert("use_global".to_string(), default.to_string()); - overrides -} - -fn should_skip_step(step: &SkillStep, ctx: &HashMap) -> Option { - let Some(when) = &step.when else { - return None; - }; - let w = when.trim(); - if w == "always" { - return None; - } - if w == "{use_global}" || w.contains("use_global") { - let use_global = ctx.get("use_global").map(|v| v == "true").unwrap_or(false); - if !use_global { - return Some("skipped (单机模式 / use_global=false)".to_string()); - } - } - None -} - -fn sql_outcome_from_df( - step: &SkillStep, - df: DataFrame, - cluster_meta: Option, +fn map_outcome( + outcome: probing_skills::runner::StepOutcome, + path_hint: Option, ) -> StepOutcome { - let rows = dataframe_rows(&df); - let cluster_note = cluster_meta.as_ref().map(format_cluster_meta); - if rows == 0 { - match step.on_empty.as_str() { - "abort" => StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: step - .empty_message - .clone() - .unwrap_or_else(|| "Query returned no rows".to_string()), - }, - "warn" => StepOutcome::Sql { - step_id: step.id.clone(), - title: step.title.clone(), - dataframe: df, - row_count: 0, - empty_message: step.empty_message.clone(), - cluster_note, - }, - _ => StepOutcome::Skipped { - step_id: step.id.clone(), - title: step.title.clone(), - reason: step - .empty_message - .clone() - .unwrap_or_else(|| "No data".to_string()), - }, - } - } else { - StepOutcome::Sql { - step_id: step.id.clone(), - title: step.title.clone(), - dataframe: df, - row_count: rows, + use probing_skills::runner::StepOutcome as O; + match outcome { + O::Sql { + step_id, + title, + dataframe, + row_count, + note, + .. + } => StepOutcome::Sql { + step_id, + title, + dataframe, + row_count, empty_message: None, - cluster_note, - } - } -} - -async fn run_sql_step(step: &SkillStep, sql: &str) -> StepOutcome { - let cluster_fanout = sql_needs_cluster_fanout(sql, step.cluster.unwrap_or(false)); - match execute_sql_for_agent(sql, cluster_fanout).await { - Ok((df, meta)) => sql_outcome_from_df(step, df, meta), - Err(e) => { - if step.on_empty == "skip" { - StepOutcome::Skipped { - step_id: step.id.clone(), - title: step.title.clone(), - reason: e.display_message(), - } - } else { - StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: e.display_message(), - } - } - } - } -} - -async fn run_api_step(step: &SkillStep) -> StepOutcome { - let path = step.path.clone().unwrap_or_default(); - let client = crate::api::ApiClient::new(); - if path.contains("callstack") { - match client.get_callstack_with_mode(None, "mixed").await { - Ok(frames) => { - let text = frames - .iter() - .take(24) - .map(|f| format!("{f}")) - .collect::>() - .join("\n"); - StepOutcome::ApiText { - step_id: step.id.clone(), - title: step.title.clone(), - text, - path: Some(path), - } - } - Err(e) => StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: e.display_message(), - }, - } - } else if path.contains("/apis/nodes") || path == "/apis/nodes" { - match client.get_nodes().await { - Ok(nodes) => { - let text = nodes - .iter() - .map(|n| { - format!( - "rank={} host={} addr={} status={}", - n.rank - .map(|r| r.to_string()) - .unwrap_or_else(|| "—".to_string()), - n.host, - n.addr, - n.status.clone().unwrap_or_else(|| "?".to_string()) - ) - }) - .collect::>() - .join("\n"); - StepOutcome::ApiText { - step_id: step.id.clone(), - title: step.title.clone(), - text, - path: Some(path), - } - } - Err(e) => StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: e.display_message(), - }, - } - } else { - match client.get_raw(&path).await { - Ok(body) => StepOutcome::ApiText { - step_id: step.id.clone(), - title: step.title.clone(), - text: body, - path: Some(path), - }, - Err(e) => StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: e.display_message(), - }, - } - } -} - -async fn run_step(step: &SkillStep, ctx: &HashMap) -> StepOutcome { - if let Some(reason) = should_skip_step(step, ctx) { - return StepOutcome::Skipped { - step_id: step.id.clone(), - title: step.title.clone(), + cluster_note: note, + }, + O::ApiText { + step_id, + title, + text, + } => StepOutcome::ApiText { + step_id, + title, + text, + path: path_hint, + }, + O::UiNavigate { + step_id, + title, + view, + } => StepOutcome::UiNavigate { + step_id, + title, + view, + }, + O::Skipped { + step_id, + title, + reason, + } => StepOutcome::Skipped { + step_id, + title, reason, - }; - } - match step.step_type.as_str() { - "sql" => { - let Some(sql_tpl) = &step.sql else { - return StepOutcome::Error { - step_id: step.id.clone(), - title: step.title.clone(), - message: "SQL step missing query".to_string(), - }; - }; - let sql = expand_sql(sql_tpl, ctx); - run_sql_step(step, &sql).await - } - "api" => run_api_step(step).await, - "ui" => StepOutcome::UiNavigate { - step_id: step.id.clone(), - title: step.title.clone(), - view: step.view.clone().unwrap_or_else(|| "analytics".to_string()), }, - other => StepOutcome::Skipped { - step_id: step.id.clone(), - title: step.title.clone(), - reason: format!("unsupported step type: {other}"), + O::Error { + step_id, + title, + message, + } => StepOutcome::Error { + step_id, + title, + message, }, } } pub async fn run_skill( skill_id: &str, - overrides: HashMap, + mut overrides: HashMap, session: Option<&UiTaskSession>, ) -> Result<(Skill, Vec, HashMap)> { if session.is_some_and(|s| s.is_cancelled()) { return Err(AppError::Cancelled); } - let pb = + let skill = load_skill(skill_id).ok_or_else(|| AppError::Api(format!("Unknown skill: {skill_id}")))?; - let overrides = resolve_overrides(&pb, overrides).await; + let backend = WebBackend; + + resolve_use_global(&backend, &skill, &mut overrides).await; if session.is_some_and(|s| s.is_cancelled()) { return Err(AppError::Cancelled); } - let ctx = build_context(&pb, &overrides); + let ctx = build_context(&skill, &overrides); + let options = RunOptions { include_ui: true }; + let mut outcomes = Vec::new(); - for step in &pb.steps { + for step in &skill.steps { if session.is_some_and(|s| s.is_cancelled()) { return Err(AppError::Cancelled); } @@ -297,7 +139,9 @@ pub async fn run_skill( Some(format!("{skill_id} · {}", step.id)), ), }; - let outcome = run_step(step, &ctx).await; + let path_hint = step.path.clone(); + let raw = run_step(&backend, step, &ctx, &options).await; + let outcome = map_outcome(raw, path_hint); if task.is_cancelled() { task.cancel(); return Err(AppError::Cancelled); @@ -315,5 +159,5 @@ pub async fn run_skill( break; } } - Ok((pb, outcomes, ctx)) + Ok((skill, outcomes, ctx)) } diff --git a/web/src/agent/skill.rs b/web/src/agent/skill.rs index a978b2be..11b1d677 100644 --- a/web/src/agent/skill.rs +++ b/web/src/agent/skill.rs @@ -1,346 +1,170 @@ -//! Diagnostic skill definitions loaded at compile time from repo ``skills/``. +//! Diagnostic skills loaded at runtime from ``/apis/pythonext/skills/*``. -use include_dir::{include_dir, Dir}; -use serde::Deserialize; use std::collections::HashMap; +use std::sync::OnceLock; -static SKILLS_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/../skills"); -const CATALOG_YAML: &str = include_str!("../../../skills/catalog.yaml"); - -#[derive(Debug, Clone, Deserialize)] -struct CatalogFile { - #[serde(default)] - skills: Vec, -} +use probing_skills::{routing::match_skills, skill_from_api, Skill}; +use serde::Deserialize; +use serde_json::Value; #[derive(Debug, Clone, Deserialize)] -struct CatalogEntry { - id: String, - #[serde(default)] - path: String, - #[serde(default)] - file: String, +pub struct RoutingPayload { + pub catalog: CatalogPayload, + pub intents: IntentCatalogFile, + pub pages: PageCatalogFile, } #[derive(Debug, Clone, Deserialize)] -struct SkillFile { - metadata: SkillMeta, - spec: SkillSpec, +pub struct CatalogPayload { + pub skills: Vec, } #[derive(Debug, Clone, Deserialize)] -struct SkillMeta { - id: String, - title: String, - category: String, +pub struct CatalogEntry { + pub id: String, #[serde(default)] - tags: Vec, + pub priority: i32, #[serde(default)] - triggers: Triggers, + pub description: String, #[serde(default)] - docs: String, -} - -#[derive(Debug, Clone, Default, Deserialize)] -struct Triggers { - keywords: KeywordsMap, + pub category: String, + #[serde(default)] + pub pages: Vec, } -#[derive(Debug, Clone, Default, Deserialize)] -struct KeywordsMap { - #[serde(default)] - zh: Vec, +#[derive(Debug, Clone, Deserialize)] +pub struct IntentCatalogFile { #[serde(default)] - en: Vec, + pub intents: HashMap, } #[derive(Debug, Clone, Deserialize)] -struct SkillSpec { - #[serde(default)] - parameters: Vec, +pub struct IntentEntry { #[serde(default)] - steps: Vec, + pub label: String, #[serde(default)] - interpretation: InterpretationSpec, + pub keywords: Vec, #[serde(default)] - summary_template: String, - #[serde(default)] - next_steps: Vec, -} - -#[derive(Debug, Clone, Default, Deserialize)] -struct InterpretationSpec { - #[serde(default)] - rules: Vec, + pub skills: Vec, } #[derive(Debug, Clone, Deserialize)] -pub struct InterpretRuleRaw { - pub id: String, - pub when: String, - #[serde(default = "default_severity")] - pub severity: String, - pub message: String, -} - -fn default_severity() -> String { - "info".to_string() -} - -#[derive(Debug, Clone, Deserialize)] -pub struct SkillParameter { - pub name: String, +pub struct PageCatalogFile { #[serde(default)] - pub default: serde_yaml::Value, + pub pages: HashMap, } #[derive(Debug, Clone, Deserialize)] -struct SkillStepRaw { - id: String, - title: String, - #[serde(rename = "type", default = "default_step_type")] - step_type: String, - #[serde(default)] - sql: Option, - #[serde(default)] - method: Option, - #[serde(default)] - path: Option, - #[serde(default)] - action: Option, - #[serde(default)] - view: Option, - #[serde(default = "default_on_empty")] - on_empty: String, - #[serde(default)] - empty_message: Option, +pub struct PageEntry { + pub title: String, + pub path: String, #[serde(default)] - when: Option, + pub description: String, #[serde(default)] - cluster: Option, + pub skills: Vec, } -fn default_step_type() -> String { - "sql".to_string() -} +pub type SkillPayload = Value; -fn default_on_empty() -> String { - "skip".to_string() +#[derive(Debug, Default)] +struct SkillStore { + skills: HashMap, + catalog: Vec, + intents: HashMap, + pages: HashMap, + loaded: bool, } -#[derive(Debug, Clone)] -pub struct SkillStep { - pub id: String, - pub title: String, - pub step_type: String, - pub sql: Option, - #[allow(dead_code)] - pub method: Option, - pub path: Option, - #[allow(dead_code)] - pub action: Option, - pub view: Option, - pub on_empty: String, - pub empty_message: Option, - pub when: Option, - pub cluster: Option, -} +static STORE: OnceLock> = OnceLock::new(); -#[derive(Debug, Clone)] -pub struct Skill { - pub id: String, - pub title: String, - pub category: String, - #[allow(dead_code)] - pub tags: Vec, - pub docs: String, - pub parameters: Vec, - pub steps: Vec, - pub interpretation: Vec, - pub summary_template: String, - pub next_steps: Vec, - keywords: Vec, +fn store() -> &'static std::sync::RwLock { + STORE.get_or_init(|| std::sync::RwLock::new(SkillStore::default())) } -fn catalog_entries() -> Vec { - let file: CatalogFile = - serde_yaml::from_str(CATALOG_YAML).unwrap_or(CatalogFile { skills: vec![] }); - file.skills +pub fn skill_store_loaded() -> bool { + store().read().map(|s| s.loaded).unwrap_or(false) } -fn entry_path(entry: &CatalogEntry) -> String { - if !entry.path.is_empty() { - entry.path.clone() - } else { - entry.file.clone() +pub fn populate_skill_store(routing: RoutingPayload, payloads: Vec) { + let mut skills = HashMap::new(); + for payload in payloads { + if let Ok(skill) = skill_from_api(&payload) { + let id = skill.id.clone(); + skills.insert(id, skill); + } + } + if let Ok(mut guard) = store().write() { + guard.catalog = routing.catalog.skills; + guard.intents = routing.intents.intents; + guard.pages = routing.pages.pages; + guard.skills = skills; + guard.loaded = true; } } -fn steps_yaml_for_id(id: &str) -> Option<&'static str> { - let entry = catalog_entries().into_iter().find(|e| e.id == id)?; - let rel = entry_path(&entry); - SKILLS_DIR.get_file(&rel).and_then(|f| f.contents_utf8()) +pub fn catalog_entries() -> Vec { + store() + .read() + .map(|s| s.catalog.clone()) + .unwrap_or_default() } -pub fn list_skill_ids() -> Vec<&'static str> { - catalog_entries() - .into_iter() - .filter(|e| steps_yaml_for_id(&e.id).is_some()) - .map(|e| leak_str(&e.id)) - .collect() +pub fn intent_catalog() -> HashMap { + store() + .read() + .map(|s| s.intents.clone()) + .unwrap_or_default() } -fn leak_str(s: &str) -> &'static str { - Box::leak(s.to_string().into_boxed_str()) +pub fn page_catalog() -> HashMap { + store().read().map(|s| s.pages.clone()).unwrap_or_default() } -pub fn load_skill(id: &str) -> Option { - let yaml = steps_yaml_for_id(id)?; - let file: SkillFile = serde_yaml::from_str(yaml).ok()?; - let mut keywords: Vec = file - .metadata - .tags - .iter() - .map(|t| t.to_lowercase()) - .collect(); - keywords.extend( - file.metadata - .triggers - .keywords - .zh - .iter() - .map(|s| s.to_lowercase()), - ); - keywords.extend( - file.metadata - .triggers - .keywords - .en - .iter() - .map(|s| s.to_lowercase()), - ); - let steps = file - .spec - .steps - .into_iter() - .map(|s| SkillStep { - id: s.id, - title: s.title, - step_type: s.step_type, - sql: s.sql, - method: s.method, - path: s.path, - action: s.action, - view: s.view, - on_empty: s.on_empty, - empty_message: s.empty_message, - when: s.when, - cluster: s.cluster, +pub fn list_skill_ids() -> Vec { + store() + .read() + .map(|s| { + let mut ids: Vec = s.skills.keys().cloned().collect(); + ids.sort(); + ids }) - .collect(); - Some(Skill { - id: file.metadata.id, - title: file.metadata.title, - category: file.metadata.category, - tags: file.metadata.tags, - docs: file.metadata.docs.trim().to_string(), - parameters: file.spec.parameters, - steps, - interpretation: file.spec.interpretation.rules, - summary_template: file.spec.summary_template.trim().to_string(), - next_steps: file.spec.next_steps, - keywords, - }) -} - -pub fn default_parameters(pb: &Skill) -> HashMap { - let mut out = HashMap::new(); - for p in &pb.parameters { - let val = match &p.default { - serde_yaml::Value::Number(n) => n.to_string(), - serde_yaml::Value::Bool(b) => b.to_string(), - serde_yaml::Value::String(s) => s.clone(), - _ => continue, - }; - out.insert(p.name.clone(), val); - } - out + .unwrap_or_default() } -pub fn derive_variables(params: &HashMap) -> HashMap { - let use_global = params - .get("use_global") - .map(|v| v == "true") - .unwrap_or(false); - let comm = if use_global { - "global.python.comm_collective".to_string() - } else { - "python.comm_collective".to_string() - }; - let mut out = HashMap::new(); - out.insert("comm_table".to_string(), comm.clone()); - out.insert("table_comm".to_string(), comm); - out.insert( - "global_prefix".to_string(), - if use_global { - "global.".to_string() - } else { - String::new() - }, - ); - out -} - -pub fn expand_sql(template: &str, ctx: &HashMap) -> String { - let mut out = template.to_string(); - for (key, val) in ctx { - out = out.replace(&format!("{{{key}}}"), val); - } - out -} - -pub fn build_context(pb: &Skill, overrides: &HashMap) -> HashMap { - let mut ctx = default_parameters(pb); - ctx.extend(derive_variables(&ctx)); - for (k, v) in overrides { - ctx.insert(k.clone(), v.clone()); - } - ctx.extend(derive_variables(&ctx)); - ctx -} - -pub fn match_skills(query: &str, limit: usize) -> Vec { - use std::collections::HashMap; - - let q = query.to_lowercase(); - let mut scored: HashMap = HashMap::new(); - - for (rank, id) in super::routing::match_intents(query, 10) - .into_iter() - .enumerate() - { - *scored.entry(id).or_insert(0) += 3usize.saturating_mul(10 - rank); - } - - for id in list_skill_ids() { - let Some(pb) = load_skill(id) else { - continue; - }; - let keyword_hits = pb - .keywords - .iter() - .filter(|kw| q.contains(kw.as_str())) - .count(); - let id_hit = q.contains(&pb.id.replace('_', " ")) || q.contains(&pb.id); - if keyword_hits > 0 || id_hit { - *scored.entry(pb.id).or_insert(0) += keyword_hits.max(1); +pub fn load_skill(id: &str) -> Option { + store().read().ok()?.skills.get(id).cloned() +} + +pub fn match_skills_for_query(query: &str, limit: usize) -> Vec { + if skill_store_loaded() { + let q = query.to_lowercase(); + let mut scored: HashMap = HashMap::new(); + for (rank, id) in super::routing::match_intents(query, 10) + .into_iter() + .enumerate() + { + *scored.entry(id).or_insert(0) += 3usize.saturating_mul(10 - rank); + } + for id in list_skill_ids() { + let Some(skill) = load_skill(&id) else { + continue; + }; + let keyword_hits = skill + .keywords + .iter() + .filter(|kw| q.contains(kw.as_str())) + .count(); + let id_hit = q.contains(&skill.id.replace('_', " ")) || q.contains(&skill.id); + if keyword_hits > 0 || id_hit { + *scored.entry(skill.id).or_insert(0) += keyword_hits.max(1); + } } + let mut ranked: Vec<(usize, String)> = + scored.into_iter().map(|(id, score)| (score, id)).collect(); + ranked.sort_by(|a, b| b.0.cmp(&a.0).then_with(|| a.1.cmp(&b.1))); + return ranked.into_iter().take(limit).map(|(_, id)| id).collect(); } - - let mut ranked: Vec<(usize, String)> = - scored.into_iter().map(|(id, score)| (score, id)).collect(); - ranked.sort_by(|a, b| b.0.cmp(&a.0).then_with(|| a.1.cmp(&b.1))); - ranked.into_iter().take(limit).map(|(_, id)| id).collect() + match_skills(query, limit) } pub fn resolve_skill_id(input: &str) -> Option { @@ -354,6 +178,6 @@ pub fn resolve_skill_id(input: &str) -> Option { if load_skill(trimmed).is_some() { return Some(trimmed.to_string()); } - let matched = match_skills(trimmed, 1); + let matched = match_skills_for_query(trimmed, 1); matched.into_iter().next() } diff --git a/web/src/agent/skills_backend.rs b/web/src/agent/skills_backend.rs new file mode 100644 index 00000000..69568d0e --- /dev/null +++ b/web/src/agent/skills_backend.rs @@ -0,0 +1,93 @@ +//! Browser HTTP backend for the shared skill runner. + +use probing_proto::prelude::{DataFrame, Message, NodeListResponse, Query, QueryDataFormat}; +use probing_skills::backend::{ClusterQueryMeta, SkillBackend}; +use probing_skills::runner::{Result, SkillRunError}; + +use crate::api::ApiClient; +use crate::utils::error::AppError; + +pub struct WebBackend; + +#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)] +impl SkillBackend for WebBackend { + async fn query_local(&self, sql: &str) -> Result { + let client = ApiClient::new(); + client + .execute_query(sql) + .await + .map_err(|e| SkillRunError(e.display_message())) + } + + async fn cluster_query(&self, sql: &str) -> Result<(DataFrame, Option)> { + let client = ApiClient::new(); + let resp = client + .cluster_query(sql, true) + .await + .map_err(|e| SkillRunError(e.display_message()))?; + let meta = ClusterQueryMeta { + partial: !resp.meta.nodes_failed.is_empty(), + nodes_queried: resp.meta.nodes_queried, + nodes_failed: resp.meta.nodes_failed.clone(), + peer_batches_dropped: 0, + }; + Ok((resp.dataframe, Some(meta))) + } + + async fn get(&self, path: &str) -> Result { + let client = ApiClient::new(); + if path.contains("callstack") { + let frames = client + .get_callstack_with_mode(None, "mixed") + .await + .map_err(|e| SkillRunError(e.display_message()))?; + return Ok(frames + .iter() + .take(24) + .map(|f| format!("{f}")) + .collect::>() + .join("\n")); + } + if path.contains("/apis/nodes") || path == "/apis/nodes" { + let nodes = client + .get_nodes() + .await + .map_err(|e| SkillRunError(e.display_message()))?; + return Ok(nodes + .iter() + .map(|n| { + format!( + "rank={} host={} addr={} status={}", + n.rank + .map(|r| r.to_string()) + .unwrap_or_else(|| "—".to_string()), + n.host, + n.addr, + n.status.clone().unwrap_or_else(|| "?".to_string()) + ) + }) + .collect::>() + .join("\n")); + } + client + .get_raw(path) + .await + .map_err(|e| SkillRunError(e.display_message())) + } + + async fn peer_count(&self) -> usize { + match ApiClient::new().get_nodes().await { + Ok(nodes) => nodes.len().saturating_sub(1), + Err(_) => 0, + } + } +} + +#[allow(dead_code)] +fn _query_envelope_unused() { + let _ = Message::new(Query::default()); + let _ = QueryDataFormat::Nil; + let _ = NodeListResponse::default(); + let _ = AppError::Api(String::new()); +} diff --git a/web/src/api/mod.rs b/web/src/api/mod.rs index 4d9a4a63..d77364ae 100644 --- a/web/src/api/mod.rs +++ b/web/src/api/mod.rs @@ -92,6 +92,7 @@ mod profiling; mod pulsing; mod pytorch; mod repl; +mod skills; mod stack; mod trace; mod traces; @@ -116,6 +117,8 @@ pub use pytorch::*; #[allow(unused_imports)] pub use repl::*; #[allow(unused_imports)] +pub use skills::*; +#[allow(unused_imports)] pub use stack::*; #[allow(unused_imports)] pub use trace::*; diff --git a/web/src/api/skills.rs b/web/src/api/skills.rs new file mode 100644 index 00000000..df46f521 --- /dev/null +++ b/web/src/api/skills.rs @@ -0,0 +1,30 @@ +//! Fetch skills from probing server and populate the in-memory skill store. + +use super::ApiClient; +use crate::agent::{populate_skill_store, RoutingPayload, SkillPayload}; +use crate::utils::error::Result; + +impl ApiClient { + pub async fn fetch_skills_routing(&self) -> Result { + let text = self.get_request("/apis/pythonext/skills/routing").await?; + Self::parse_json(&text) + } + + pub async fn fetch_skill_payload(&self, id: &str) -> Result { + let path = format!("/apis/pythonext/skills/load?id={}", urlencoding::encode(id)); + let text = self.get_request(&path).await?; + Self::parse_json(&text) + } + + pub async fn load_skill_store(&self) -> Result<()> { + let routing = self.fetch_skills_routing().await?; + let mut payloads = Vec::new(); + for entry in &routing.catalog.skills { + if let Ok(payload) = self.fetch_skill_payload(&entry.id).await { + payloads.push(payload); + } + } + populate_skill_store(routing, payloads); + Ok(()) + } +} diff --git a/web/src/api/traces.rs b/web/src/api/traces.rs index 381d0d41..e3f0eb48 100644 --- a/web/src/api/traces.rs +++ b/web/src/api/traces.rs @@ -3,9 +3,6 @@ use crate::utils::error::Result; use probing_proto::prelude::Ele; use serde::{Deserialize, Serialize}; -type SpanStartInfo = (i64, String, Option, i64); -type SpanStartMap = std::collections::HashMap<(i64, i64), SpanStartInfo>; - #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TraceEvent { pub record_type: String, @@ -294,223 +291,21 @@ impl ApiClient { Ok(result) } - /// Get JSON data in Chrome tracing format - /// Returns format compatible with Chrome DevTools tracing viewer + /// Get JSON data in Chrome tracing format via the Python extension API. pub async fn get_chrome_tracing_json(&self, limit: Option) -> Result { - let mut events = self.get_trace_events(limit).await?; - - // Sort by timestamp ascending, ensure span_start is processed before span_end - // This way when processing span_end, the corresponding span_start is already in span_starts - events.sort_by_key(|e| e.timestamp); - - // Find minimum timestamp as baseline - let min_timestamp = events.iter().map(|e| e.timestamp).min().unwrap_or(0); - - // Convert to Chrome tracing format - let mut trace_events: Vec = Vec::new(); - - // Use (span_id, thread_id) as key to track span start time, supports multi-threaded scenarios - // Value contains: (start timestamp in microseconds, span name, phase, trace_id) - let mut span_starts: SpanStartMap = std::collections::HashMap::new(); - - // First pass: collect all span_start events, build lookup table - // This helps match span_end events, even if trace_id in span_end is 0 - let mut span_start_lookup: SpanStartMap = std::collections::HashMap::new(); - // Build span_id to parent_id mapping, used to find top-level spans - let mut span_to_parent: std::collections::HashMap> = - std::collections::HashMap::new(); - // Find first (earliest) top-level span's trace_id, use as unified pid - let mut unified_pid: Option = None; - - for event in &events { - if event.record_type == "span_start" { - let key = (event.span_id, event.thread_id); - span_start_lookup.insert( - key, - ( - event.timestamp, - event.name.clone(), - event.phase.clone(), - event.trace_id, - ), - ); - - // Record parent_id mapping - span_to_parent.insert(event.span_id, event.parent_id); - - // If it's a top-level span (no parent_id or parent_id = -1), and unified_pid not set yet - // Use first top-level span's trace_id as unified pid - if unified_pid.is_none() - && (event.parent_id.is_none() || event.parent_id == Some(-1)) - { - unified_pid = Some(event.trace_id); - } - } - } - - // If no top-level span found, use first span_start's trace_id - let unified_pid = unified_pid.unwrap_or_else(|| { - events - .iter() - .find(|e| e.record_type == "span_start") - .map(|e| e.trace_id) - .unwrap_or(1) - }); - - // Second pass: convert events to Chrome tracing format - for event in &events { - // Convert nanoseconds to microseconds (Chrome tracing uses microseconds) - let ts_micros = (event.timestamp - min_timestamp) / 1000; - // All top-level spans use unified pid, child spans also use unified pid (they belong to same logical trace) - // This ensures all related spans are displayed in the same process - let pid = unified_pid as u32; - let tid = event.thread_id as u32; - - match event.record_type.as_str() { - "span_start" => { - // Use (span_id, thread_id) as key - let key = (event.span_id, event.thread_id); - // Store using unified pid - span_starts.insert( - key, - ( - ts_micros, - event.name.clone(), - event.phase.clone(), - unified_pid, - ), - ); - - // Create 'B' (Begin) event - let mut chrome_event = serde_json::json!({ - "name": event.name, - "cat": event.phase.as_ref().unwrap_or(&"span".to_string()), - "ph": "B", - "ts": ts_micros, - "pid": pid, - "tid": tid, - }); - - // Add optional parameters - let mut args = serde_json::Map::new(); - if let Some(ref location) = event.location { - if !location.is_empty() { - args.insert( - "location".to_string(), - serde_json::Value::String(location.clone()), - ); - } - } - if let Some(ref attrs) = event.attributes { - if !attrs.is_empty() { - if let Ok(parsed) = serde_json::from_str::(attrs) { - args.insert("attributes".to_string(), parsed); - } - } - } - if !args.is_empty() { - chrome_event["args"] = serde_json::Value::Object(args); - } - - trace_events.push(chrome_event); - } - "span_end" => { - // Use (span_id, thread_id) as key to find corresponding span_start - let key = (event.span_id, event.thread_id); - - // First try to find from already processed events - if let Some((start_ts, start_name, start_phase, start_pid)) = - span_starts.get(&key) - { - // Found matching span_start, create 'E' (End) event - let mut chrome_event = serde_json::json!({ - "name": start_name, - "cat": start_phase.as_ref().unwrap_or(&"span".to_string()), - "ph": "E", - "ts": ts_micros, - "pid": *start_pid as u32, - "tid": tid, - }); - - // Calculate duration (in microseconds) - let dur = ts_micros - start_ts; - if dur > 0 { - chrome_event["dur"] = serde_json::Value::Number(dur.into()); - } - - trace_events.push(chrome_event); - // Remove from span_starts to avoid duplicate matching - span_starts.remove(&key); - } else if let Some((start_timestamp, start_name, start_phase, _)) = - span_start_lookup.get(&key) - { - // Find span_start information from lookup table - let start_ts_micros = (start_timestamp - min_timestamp) / 1000; - // Use unified pid to ensure all spans are in the same process - let mut chrome_event = serde_json::json!({ - "name": start_name, - "cat": start_phase.as_ref().unwrap_or(&"span".to_string()), - "ph": "E", - "ts": ts_micros, - "pid": unified_pid as u32, - "tid": tid, - }); - - // Calculate duration (in microseconds) - let dur = ts_micros - start_ts_micros; - if dur > 0 { - chrome_event["dur"] = serde_json::Value::Number(dur.into()); - } - - trace_events.push(chrome_event); - } else { - // No matching span_start found (may have been filtered by limit) - // Use unified pid to ensure all spans are in the same process - let chrome_event = serde_json::json!({ - "name": if event.name.is_empty() { "unknown_span" } else { &event.name }, - "cat": "span", - "ph": "E", - "ts": ts_micros, - "pid": unified_pid as u32, - "tid": tid, - }); - trace_events.push(chrome_event); - } - } - "event" => { - // Create 'i' (Instant) event - let mut chrome_event = serde_json::json!({ - "name": event.name, - "cat": "event", - "ph": "i", - "ts": ts_micros, - "pid": pid, - "tid": tid, - "s": "t", // scope: thread - }); - - // Add event attributes - if let Some(ref attrs) = event.event_attributes { - if !attrs.is_empty() { - if let Ok(parsed) = serde_json::from_str::(attrs) { - chrome_event["args"] = parsed; - } - } - } + let limit = limit.unwrap_or(1000); + let path = format!("/apis/pythonext/trace/chrome-tracing?limit={limit}"); + let response = self.get_request(&path).await?; - trace_events.push(chrome_event); - } - _ => {} - } + let json_value: serde_json::Value = serde_json::from_str(&response)?; + if let Some(error_obj) = json_value.get("error") { + return Err(crate::utils::error::AppError::Api(format!( + "Backend error: {}", + error_obj + ))); } - // Build complete Chrome tracing format JSON - let chrome_trace = serde_json::json!({ - "traceEvents": trace_events, - "displayTimeUnit": "ms", - }); - - Ok(serde_json::to_string_pretty(&chrome_trace)?) + Ok(response) } /// Get Ray task execution timeline diff --git a/web/src/components/agent/chat.rs b/web/src/components/agent/chat.rs index 2e71ff85..2b6ad7d7 100644 --- a/web/src/components/agent/chat.rs +++ b/web/src/components/agent/chat.rs @@ -5,7 +5,7 @@ use std::collections::HashMap; use dioxus::prelude::*; use crate::agent::{ - evaluate_rules, evidence_from_outcomes, format_findings, list_skill_ids, load_skill, + evaluate_rules_for_skill, format_findings, list_skill_ids, load_skill, refresh_page_snapshot_for_route, resolve_skill_id, run_skill, select_skill, summarize_run, }; use crate::app::Route; @@ -568,8 +568,7 @@ async fn run_skill_flow( if session.is_cancelled() { return; } - let evidence = evidence_from_outcomes(&outcomes); - let findings = evaluate_rules(&pb.interpretation, &evidence, &ctx); + let findings = evaluate_rules_for_skill(&pb, &outcomes, &ctx); let evidence = crate::agent::outcomes_to_evidence(&outcomes); for outcome in outcomes { push_agent_message(AgentMessage::step_card(step_outcome_to_card(outcome))); diff --git a/web/src/components/layout.rs b/web/src/components/layout.rs index caca9219..19aa0308 100644 --- a/web/src/components/layout.rs +++ b/web/src/components/layout.rs @@ -4,6 +4,7 @@ use dioxus::prelude::*; +use crate::api::ApiClient; use crate::components::agent::{AgentPanel, LlmSettingsOverlay}; use crate::components::global_command_panel::{ CommandBar, FloatingResultToast, GlobalCommandPanel, @@ -33,6 +34,9 @@ pub fn AppLayout(children: Element, #[props(default = false)] fullscreen: bool) load_investigation_context(); load_llm_config(); load_agent_panel_width(); + spawn(async move { + let _ = ApiClient::new().load_skill_store().await; + }); }); rsx! { From 0275cb1fcd392ed8c8fa9bed9da920bac2f9b688 Mon Sep 17 00:00:00 2001 From: Reiase Date: Thu, 9 Jul 2026 00:07:33 +0800 Subject: [PATCH 12/37] =?UTF-8?q?Enhance=20Makefile=20and=20GitHub=20Actio?= =?UTF-8?q?ns=20for=20Python=20virtual=20environment=20ma=E2=80=A6=20(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Enhance Makefile and GitHub Actions for Python virtual environment management - Updated the Makefile to improve handling of Python virtual environments, including better detection and recreation logic for `.venv`. - Modified GitHub Actions to set the Python executable path in the environment after creating the virtual environment. - Adjusted `.gitignore` to include `.venv/` for better project cleanliness. - Updated documentation Makefile to use the system Python command for improved compatibility. These changes aim to streamline the development workflow and ensure consistent environment setup across different systems. * Enhance skills management and debug console initialization - Updated the `bundled_skills_dir` function to prioritize the source tree over wheel copies when running in a probing git checkout, ensuring consistency with discovery results. - Introduced a lazy initialization for the `DebugConsole` to prevent conflicts with the native engine during import time, allowing for a more efficient debug console setup. - Added a `get_debug_console` function to manage the creation and retrieval of the debug console instance, improving resource management. These changes aim to enhance the functionality and usability of the skills management and debugging processes within the Probing framework. * Update debug console initialization in Python REPL - Modified the import statement in `console.rs` to use `get_debug_console()` for initializing the debug console, enhancing the setup process. - Updated the `pythonext.py` handler to reflect the new import structure, ensuring compatibility with the revised debug console management. These changes aim to streamline the debug console initialization process and improve overall resource management within the Probing framework. * Update Makefile and enhance Rust core functionality - Modified the Makefile to disable the VM tracer during Python wheel tests when the `PROBING_VM_TRACER` environment variable is set to `0`, improving test reliability. - Introduced a new function `on_native_bridge_thread` in `runtime.rs` to check if the current thread is the dedicated native bridge worker. - Updated the Rust core library to utilize the new `on_native_bridge_thread` function, enhancing thread management during Rust/Python bridge operations. - Improved the `with_detached_native` function in `native_bridge.rs` to avoid unnecessary thread creation when already on the native bridge worker, preventing potential SIGABRT issues in CI environments. - Enhanced the Python test setup in `conftest.py` to disable the tracer when conflicts are detected, ensuring smoother test execution. These changes aim to improve the stability and performance of the Probing framework during testing and runtime operations. --- .github/actions/setup-build-env/action.yml | 4 +- .github/workflows/test.yml | 2 +- .gitignore | 1 + Makefile | 101 ++++++++++-------- docs/Makefile | 2 +- probing/core/src/lib.rs | 4 +- probing/core/src/runtime.rs | 5 + .../python/src/features/native_bridge.rs | 9 +- probing/extensions/python/src/repl/console.rs | 4 +- python/probing/extensions/skills.py | 12 ++- python/probing/handlers/pythonext.py | 3 +- python/probing/repl/__init__.py | 19 +++- src/lib.rs | 9 +- tests/regression/conftest.py | 9 ++ tests/unit/probing/test_discovery.py | 10 ++ 15 files changed, 136 insertions(+), 58 deletions(-) diff --git a/.github/actions/setup-build-env/action.yml b/.github/actions/setup-build-env/action.yml index ecc44674..f8079869 100644 --- a/.github/actions/setup-build-env/action.yml +++ b/.github/actions/setup-build-env/action.yml @@ -120,7 +120,9 @@ runs: - name: Create project venv shell: bash - run: make venv + run: | + make venv + echo "PYTHON=${{ github.workspace }}/.venv/bin/python" >> "$GITHUB_ENV" - name: Install Python build dependencies into venv if: inputs.install-python-deps == 'true' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 77a497dc..d6c2d6e6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -31,7 +31,7 @@ jobs: - name: Python and docs lint working-directory: ${{ github.workspace }} run: | - .venv/bin/python -m pip install -q ruff + python -m pip install -q ruff make lint-python make docs-install make lint-docs diff --git a/.gitignore b/.gitignore index 6fa0ec8e..848d3352 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ python/probing/probing .claude/ *.pth.tar docs/site/ +.venv/ diff --git a/Makefile b/Makefile index e5aa66ce..bacd5b3d 100644 --- a/Makefile +++ b/Makefile @@ -31,11 +31,26 @@ ifdef TARGET endif endif -# PYTHON_BOOTSTRAP: only for creating .venv (before it exists). Recipes use VENV_PYTHON. -PYTHON_BOOTSTRAP ?= $(shell command -v python3 2>/dev/null || echo python3) +# Project .venv is the maturin develop target (maturin requires a virtualenv). +# Bootstrap from pyenv .python-version when present; --system-site-packages +# keeps torch etc. from the base interpreter visible inside .venv. +# Override: make develop PYTHON=/path/to/python (also used as venv bootstrap) +# CI pins PYTHON to $(CURDIR)/.venv/bin/python after make venv. +PYTHON_BOOTSTRAP ?= $(shell \ + if [ -f .python-version ] && command -v pyenv >/dev/null 2>&1; then \ + PV=$$(tr -d '[:space:]' < .python-version); \ + PY=$$(PYENV_VERSION="$$PV" pyenv which python 2>/dev/null); \ + [ -n "$$PY" ] && [ -x "$$PY" ] && echo "$$PY" && exit 0; \ + fi; \ + command -v python3 2>/dev/null || echo python3) +ifeq ($(origin PYTHON),undefined) +PYTHON := $(if $(wildcard .venv/bin/python),.venv/bin/python,$(PYTHON_BOOTSTRAP)) +endif +PYTHON_ABS := $(shell "$(PYTHON)" -c 'import sys; print(sys.executable)' 2>/dev/null) +ifeq ($(PYTHON_ABS),) +PYTHON_ABS := $(CURDIR)/$(PYTHON) +endif VENV_PYTHON := .venv/bin/python -# Absolute path for recipes that cd into subdirs (abspath breaks if .venv missing at parse time). -VENV_PYTHON_ABS := $(CURDIR)/.venv/bin/python BUILD_PY_DEPS := build wheel toml maturin DEV_PTH := python/probing/dev_pth.py DEV_PY_DEPS := pyyaml pytest pytest-cov coverage ipython ipykernel @@ -64,7 +79,7 @@ help: @echo " wheel Build dist/*.whl (needs bundled_web; bundles skills + UI)" @echo " wheel-ci alias for wheel (native build; PyPI uses maturin-action + zig)" @echo " install-wheel pip install dist/probing-*.whl" - @echo " venv create/refresh project .venv (used by develop and CI)" + @echo " venv create/sync project .venv (from .python-version when set)" @echo " test Rust + editable Python (daily dev)" @echo " test-wheel Installed-wheel Python tests (needs dist/*.whl)" @echo " test-ci test + test-wheel (matches CI Python gate)" @@ -93,8 +108,17 @@ install-dev-python-deps: venv .PHONY: core develop dev check-dev frontend wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib hccl-shim-lib venv venv-wheel install-build-deps install-wheel-test-deps venv: - @test -x $(VENV_PYTHON) || $(PYTHON_BOOTSTRAP) -m venv .venv - $(VENV_PYTHON) -m pip install -q -U pip + @BOOT="$(PYTHON_BOOTSTRAP)"; \ + if [ -x "$(VENV_PYTHON)" ]; then \ + BV=$$("$$BOOT" -c 'import sys; print(".".join(map(str, sys.version_info[:3])))' 2>/dev/null); \ + VV=$$("$(VENV_PYTHON)" -c 'import sys; print(".".join(map(str, sys.version_info[:3])))' 2>/dev/null); \ + if [ -n "$$BV" ] && [ "$$VV" != "$$BV" ]; then \ + echo " recreating .venv (Python $$VV -> $$BV; --system-site-packages)"; \ + rm -rf .venv; \ + fi; \ + fi; \ + test -x "$(VENV_PYTHON)" || "$$BOOT" -m venv --system-site-packages .venv; \ + "$(VENV_PYTHON)" -m pip install -q -U pip # Backward-compatible alias (CI/docs may still reference venv-wheel). venv-wheel: venv @@ -108,7 +132,8 @@ install-wheel-test-deps: venv core: venv nccl-profiler-lib hccl-shim-lib $(VENV_PYTHON) -m maturin develop $(MATURIN_FLAGS) -develop: install-build-deps core install-dev-python-deps +develop: venv install-build-deps core install-dev-python-deps + @echo " Python: $$($(VENV_PYTHON) -c 'import sys; print(sys.executable)')" $(VENV_PYTHON) $(DEV_PTH) install @$(MAKE) --no-print-directory check-dev @@ -148,17 +173,17 @@ wheel-bundle: || { echo "error: missing python/probing/bundled_skills/catalog.yaml"; exit 1; } wheel: install-build-deps wheel-bundle nccl-profiler-lib hccl-shim-lib - $(VENV_PYTHON) -m maturin build $(MATURIN_FLAGS) --out dist + $(PYTHON) -m maturin build $(MATURIN_FLAGS) --out dist wheel-ci: $(MAKE) wheel -install-wheel: venv +install-wheel: @WH=$$(ls -1 dist/probing-*.whl 2>/dev/null | head -1); \ test -n "$$WH" || { echo "run: make wheel"; exit 1; }; \ - $(VENV_PYTHON) -m pip install -q -U pip && \ - $(VENV_PYTHON) -m pip install --force-reinstall "$$WH" && \ - PROBING=0 $(VENV_PYTHON) -c "\ + $(PYTHON) -m pip install -q -U pip && \ + $(PYTHON) -m pip install --force-reinstall "$$WH" && \ + PROBING=0 $(PYTHON) -c "\ import probing; from probing import _core; from pathlib import Path; \ root = Path(probing.__file__).resolve().parent; \ assert (root / 'bundled_skills' / 'catalog.yaml').is_file(), f'missing bundled skills under {root}'; \ @@ -214,26 +239,12 @@ test-wheel: install-wheel test-python-wheel test-ci: test test-wheel test-rust: test-rust-unit test-rust-regression -test-rust-unit: venv - @if test -x $(VENV_PYTHON); then \ - export PYTHON_SYS_EXECUTABLE=$(VENV_PYTHON_ABS) PYO3_PYTHON=$(VENV_PYTHON_ABS); \ - elif command -v pyenv >/dev/null 2>&1; then \ - P=$$(pyenv which python3 2>/dev/null); \ - test -n "$$P" && export PYTHON_SYS_EXECUTABLE=$$P PYO3_PYTHON=$$P; \ - else \ - echo "error: no Python for PyO3; run: make venv"; exit 1; \ - fi; \ +test-rust-unit: + @export PYTHON_SYS_EXECUTABLE=$(PYTHON_ABS) PYO3_PYTHON=$(PYTHON_ABS); \ cargo nextest run --lib --workspace --no-default-features --nff -test-rust-regression: venv - @if test -x $(VENV_PYTHON); then \ - export PYTHON_SYS_EXECUTABLE=$(VENV_PYTHON_ABS) PYO3_PYTHON=$(VENV_PYTHON_ABS); \ - elif command -v pyenv >/dev/null 2>&1; then \ - P=$$(pyenv which python3 2>/dev/null); \ - test -n "$$P" && export PYTHON_SYS_EXECUTABLE=$$P PYO3_PYTHON=$$P; \ - else \ - echo "error: no Python for PyO3; run: make venv"; exit 1; \ - fi; \ +test-rust-regression: + @export PYTHON_SYS_EXECUTABLE=$(PYTHON_ABS) PYO3_PYTHON=$(PYTHON_ABS); \ cargo nextest run --tests -p probing-rust-regression -p probing-macros --no-default-features --nff test-python: check-dev test-python-unit test-python-regression @@ -241,11 +252,11 @@ test-python-unit: check-dev PROBING=0 ${PYTEST_RUN} $(PYTEST_UNIT_ARGS) test-python-regression: check-dev ${PYTEST_RUN} $(PYTEST_REGRESSION_ARGS) -test-doctest: venv +test-doctest: ${PYTEST_RUN} --doctest-modules python/probing --ignore=python/probing/cli/__main__.py -test-python-wheel: venv install-wheel-test-deps - PROBING=1 $(VENV_PYTHON) -m pytest $(PYTEST_WHEEL_FLAGS) $(PYTEST_WHEEL_EXTRA) $(PYTEST_WHEEL_ARGS) +test-python-wheel: install-wheel-test-deps + PROBING=1 PROBING_VM_TRACER=0 $(PYTHON) -m pytest $(PYTEST_WHEEL_FLAGS) $(PYTEST_WHEEL_EXTRA) $(PYTEST_WHEEL_ARGS) coverage-python-wheel: $(MAKE) test-python-wheel PYTEST_WHEEL_EXTRA="--cov=probing --cov=tests --cov-report=xml:coverage.xml" @@ -259,16 +270,16 @@ fmt-check: $(FMT_WEB) -- --check lint-core: $(CLIPPY_CORE) -lint-python: venv - @if $(VENV_PYTHON) -c "import ruff" 2>/dev/null; then \ - $(VENV_PYTHON) -m ruff check python/ tests/; \ +lint-python: + @if $(PYTHON) -c "import ruff" 2>/dev/null; then \ + $(PYTHON) -m ruff check python/ tests/; \ elif command -v ruff >/dev/null 2>&1; then ruff check python/ tests/; \ - else echo "install ruff: $(VENV_PYTHON) -m pip install ruff"; exit 1; fi + else echo "install ruff: $(PYTHON) -m pip install ruff"; exit 1; fi lint-rust: $(CLIPPY_WORKSPACE) $(CLIPPY_WEB) -lint-docs: venv docs-install - @$(VENV_PYTHON_ABS) -m mkdocs build --strict -f docs/mkdocs.yml +lint-docs: docs-install + @$(PYTHON_ABS) -m mkdocs build --strict -f docs/mkdocs.yml clippy: lint-rust clippy-fix: cargo clippy --workspace --all-targets --no-default-features --fix --allow-dirty --allow-staged $(CLIPPY_DENY) @@ -279,19 +290,19 @@ coverage-rust: cargo llvm-cov nextest --workspace --no-default-features --nff \ --exclude probing-hccl-profapi --exclude probing-nccl-profiler-cdylib \ --lcov --output-path coverage.lcov --ignore-filename-regex '(.*/tests?/|.*/benches?/|.*/examples?/)' -coverage-python: venv install-dev-python-deps check-dev +coverage-python: install-dev-python-deps check-dev ${PYTEST_RUN} --cov=python/probing --cov=tests --cov-report=xml:coverage.xml --cov-report=term $(PYTEST_ARGS) coverage: coverage-rust coverage-python bootstrap: uv python install 3.8 3.9 3.10 3.11 3.12 3.13 -docs-install: venv - @cd docs && $(MAKE) install PYTHON=$(VENV_PYTHON_ABS) +docs-install: + @cd docs && $(MAKE) install PYTHON=$(PYTHON_ABS) docs: - @cd docs && $(MAKE) build + @cd docs && $(MAKE) build PYTHON=$(PYTHON_ABS) docs-serve: - @cd docs && $(MAKE) serve + @cd docs && $(MAKE) serve PYTHON=$(PYTHON_ABS) docs-clean: @cd docs && $(MAKE) clean diff --git a/docs/Makefile b/docs/Makefile index 02ed9700..0ee5ae2d 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,6 +1,6 @@ # Makefile for Probing Documentation (MkDocs) -PYTHON ?= $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/../.venv/bin/python) +PYTHON ?= $(shell command -v python3 2>/dev/null || echo python3) .PHONY: help install serve build lint clean deploy diff --git a/probing/core/src/lib.rs b/probing/core/src/lib.rs index 9d03995b..c6b7d1b9 100644 --- a/probing/core/src/lib.rs +++ b/probing/core/src/lib.rs @@ -12,8 +12,8 @@ mod tracing; pub use diagnostics::install_panic_hook; pub use runtime::{ - block_on, is_python_main_thread, register_python_main_thread, run_on_native_thread, - runtime_operational, BlockOnFallback, RuntimeError, CORE_RUNTIME, + block_on, is_python_main_thread, on_native_bridge_thread, register_python_main_thread, + run_on_native_thread, runtime_operational, BlockOnFallback, RuntimeError, CORE_RUNTIME, }; use self::core::Engine; diff --git a/probing/core/src/runtime.rs b/probing/core/src/runtime.rs index b42cfbe9..e02f6fdd 100644 --- a/probing/core/src/runtime.rs +++ b/probing/core/src/runtime.rs @@ -433,6 +433,11 @@ fn on_native_bridge() -> bool { ON_NATIVE_BRIDGE.with(|v| v.get()) } +/// True when the current thread is the dedicated ``probing-native`` bridge worker. +pub fn on_native_bridge_thread() -> bool { + on_native_bridge() +} + fn run_on_native_bridge( f: impl FnOnce() -> R + Send + 'static, ) -> R { diff --git a/probing/extensions/python/src/features/native_bridge.rs b/probing/extensions/python/src/features/native_bridge.rs index b3c9cbfe..2bb5b881 100644 --- a/probing/extensions/python/src/features/native_bridge.rs +++ b/probing/extensions/python/src/features/native_bridge.rs @@ -1,10 +1,17 @@ use pyo3::prelude::*; -use probing_core::run_on_native_thread; +use probing_core::{on_native_bridge_thread, run_on_native_thread}; /// Run Rust/Python bridge work off the Python main thread and Tokio workers. +/// +/// When already on the ``probing-native`` bridge worker (e.g. loading a Python +/// plugin from ``execute_python_code``), avoid ``py.detach`` — an extra thread +/// plus nested GIL handoffs can SIGABRT on Linux CI (pytest-cov + torch). pub fn with_detached_native( f: impl FnOnce() -> R + Send + 'static, ) -> R { + if on_native_bridge_thread() { + return run_on_native_thread(f); + } Python::attach(|py| py.detach(|| run_on_native_thread(f))) } diff --git a/probing/extensions/python/src/repl/console.rs b/probing/extensions/python/src/repl/console.rs index aa1f1ad0..a4070640 100644 --- a/probing/extensions/python/src/repl/console.rs +++ b/probing/extensions/python/src/repl/console.rs @@ -16,7 +16,9 @@ impl Default for NativePythonConsole { fn default() -> Self { let console = Python::attach(|py| { let global = PyDict::new(py); - let code = c_str!("from probing.repl import debug_console"); + let code = c_str!( + "from probing.repl import get_debug_console; debug_console = get_debug_console()" + ); if py.run(code, Some(&global), Some(&global)).is_err() { log::warn!("probing.repl import failed; REPL will be unavailable"); return None; diff --git a/python/probing/extensions/skills.py b/python/probing/extensions/skills.py index 7b28729e..d0da92d6 100644 --- a/python/probing/extensions/skills.py +++ b/python/probing/extensions/skills.py @@ -33,7 +33,17 @@ def _resource_dir(name: str, marker: str) -> Optional[Path]: def bundled_skills_dir() -> Optional[Path]: - """SSOT: ``python/probing/bundled_skills`` (repo ``skills/`` symlink).""" + """SSOT: ``python/probing/bundled_skills`` (repo ``skills/`` symlink). + + When running inside a probing git checkout, prefer the source tree over a + wheel copy under site-packages so dev/CI edits to ``bundled_skills/`` match + what discovery returns. + """ + repo = find_repo_root() + if repo is not None: + checkout = repo / "python" / "probing" / "bundled_skills" + if (checkout / "catalog.yaml").is_file(): + return checkout root = _package_dir() / "bundled_skills" if (root / "catalog.yaml").is_file(): return root diff --git a/python/probing/handlers/pythonext.py b/python/probing/handlers/pythonext.py index b00010de..61f7a23b 100644 --- a/python/probing/handlers/pythonext.py +++ b/python/probing/handlers/pythonext.py @@ -550,9 +550,10 @@ def get_magics_list() -> str: JSON string: [{"group": "Trace", "items": [{"label": "...", "command": "..."}, ...]}, ...] """ try: - from probing.repl import debug_console + from probing.repl import get_debug_console from probing.repl.help_magic import get_magics_for_ui + debug_console = get_debug_console() if ( debug_console and getattr(debug_console, "code_executor", None) diff --git a/python/probing/repl/__init__.py b/python/probing/repl/__init__.py index 9e430aa5..8ce48394 100644 --- a/python/probing/repl/__init__.py +++ b/python/probing/repl/__init__.py @@ -410,4 +410,21 @@ def push(self, code: str): traceback.print_exc() -debug_console = DebugConsole() +# Lazily created — import-time DebugConsole() starts an in-process IPython +# kernel (IOPub / history threads) that conflicts with probing's native engine +# when PROBING=1 (e.g. pytest wheel suite after test_load_magics_no_crash). +_debug_console: Optional[DebugConsole] = None + + +def get_debug_console() -> DebugConsole: + """Return the process-wide debug console, creating it on first use.""" + global _debug_console + if _debug_console is None: + _debug_console = DebugConsole() + return _debug_console + + +def __getattr__(name: str): + if name == "debug_console": + return get_debug_console() + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/src/lib.rs b/src/lib.rs index 4809b8f8..ffeab506 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -191,9 +191,12 @@ fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { // Initialize globals and tracer if needed if initialize_globals() { - // Enable tracer if tracing feature is enabled - // Note: This is handled by the probing-python crate's tracing feature - let _ = enable_tracer(); + let disable = std::env::var("PROBING_VM_TRACER").as_deref() == Ok("0"); + if !disable { + // Enable tracer if tracing feature is enabled + // Note: This is handled by the probing-python crate's tracing feature + let _ = enable_tracer(); + } } // Register all classes diff --git a/tests/regression/conftest.py b/tests/regression/conftest.py index 64096fe9..30c83879 100644 --- a/tests/regression/conftest.py +++ b/tests/regression/conftest.py @@ -15,8 +15,17 @@ def _wait_for_probing_engine(): """Wait until the in-process probing engine accepts SQL (before IPython threads).""" enabled = os.environ.get("PROBING_ORIGINAL") or os.environ.get("PROBING") if enabled and str(enabled).lower() not in ("0", "false", "no", ""): + import sys + import probing + # VM eval-frame hook conflicts with pytest-cov on Linux (SIGABRT in query path). + if sys.gettrace() is not None or os.environ.get("PROBING_VM_TRACER") == "0": + try: + probing.disable_tracer() + except Exception: + pass + deadline = time.monotonic() + 30.0 last_error: Exception | None = None while time.monotonic() < deadline: diff --git a/tests/unit/probing/test_discovery.py b/tests/unit/probing/test_discovery.py index 7ee2fa6d..0645104f 100644 --- a/tests/unit/probing/test_discovery.py +++ b/tests/unit/probing/test_discovery.py @@ -69,14 +69,24 @@ def test_entry_point_skill_root_labels(): def test_load_magics_no_crash(): + import threading + from probing.extensions import load_magics from probing.repl import get_registered_magics + # Importing probing.repl must not start an in-process IPython kernel. + assert not any( + "IOPub" in t.name or "History" in t.name for t in threading.enumerate() + ) + before = set(get_registered_magics()) registry = get_registered_magics() loaded = load_magics(registry) assert isinstance(loaded, list) assert before.issubset(set(registry)) + assert not any( + "IOPub" in t.name or "History" in t.name for t in threading.enumerate() + ) def test_discovery_shim_reexports(): From ab84e187657effb039f292b7fe5c65fbd64b49b0 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sat, 11 Jul 2026 18:54:34 +0800 Subject: [PATCH 13/37] Update dependencies and enhance Makefile for benchmarking and profiling (#57) * Update dependencies and enhance Makefile for benchmarking and profiling - Added `tokio` as a dependency in `Cargo.lock` to support asynchronous operations. - Enhanced the Makefile to include new benchmarking scripts for instrumentation overhead, allowing for better performance analysis. - Updated help commands in the Makefile to include new benchmarking options. - Improved Python dependency installation checks to ensure `ruff` is available for linting. - Revised documentation to reflect changes in the profiling and benchmarking processes. These changes aim to improve the development workflow and provide better tools for performance monitoring within the Probing framework. * Refactor imports and improve code readability in overlay components - Consolidated import statements in `app_overlays.rs` and `mod.rs` for better organization. - Enhanced readability of the `sample_mode` extraction logic in `panel.rs` by restructuring the code for clarity. - Simplified the `window_start` function in `sql.rs` to improve code conciseness. These changes aim to streamline the codebase and enhance maintainability across the overlay components. --- .github/workflows/nightly.yml | 171 +++ Cargo.lock | 1 + Makefile | 35 +- docs/src/api-reference.md | 6 +- docs/src/api-reference.zh.md | 6 +- docs/src/design/index.md | 1 + docs/src/design/index.zh.md | 1 + docs/src/design/profiling.md | 54 +- docs/src/design/profiling.zh.md | 59 +- docs/src/design/tracing-spans.md | 46 + docs/src/design/tracing-spans.zh.md | 118 +++ docs/src/design/training-phase.zh.md | 4 +- docs/src/guide/concepts.md | 2 +- docs/src/guide/concepts.zh.md | 19 + docs/src/guide/sql-analytics.md | 47 +- docs/src/guide/sql-analytics.zh.md | 45 +- docs/src/guide/troubleshooting.md | 4 +- docs/src/guide/troubleshooting.zh.md | 4 +- docs/src/reference/env-vars.md | 4 +- docs/src/reference/sql-tables.md | 28 + docs/src/reference/sql-tables.zh.md | 28 + examples/README.md | 28 + examples/bench_instrumentation.py | 661 ++++++++++++ examples/imagenet_with_span.py | 27 +- examples/nccl_profiler_overhead.py | 264 +++++ examples/run_nccl_profiler_bench.sh | 79 ++ examples/torch_probe_overhead_smoke.py | 78 ++ probing/core/resources/tables.yaml | 24 + probing/core/src/core/engine.rs | 11 +- probing/core/src/core/error.rs | 33 + probing/core/src/core/memtable_sql.rs | 58 +- probing/core/src/core/semantic_catalog.rs | 14 +- probing/core/src/runtime.rs | 13 + probing/crates/skills/Cargo.toml | 1 + probing/crates/skills/src/backend.rs | 41 + probing/crates/skills/src/lib.rs | 3 +- probing/crates/skills/src/runner.rs | 290 ++++- probing/extensions/nccl-profiler/README.md | 16 + .../nccl-profiler/benches/callback_path.rs | 265 ++++- .../nccl-profiler/src/pool_pressure.rs | 43 + probing/extensions/nccl-profiler/src/state.rs | 150 +++ .../python/src/extensions/python.rs | 8 +- .../python/src/extensions/python/tbls.rs | 12 +- .../python/src/features/flamegraph.rs | 4 +- .../python/src/features/python_api.rs | 33 +- .../python/src/features/spy/call.rs | 53 +- .../python/src/features/stack_tracer.rs | 19 +- .../extensions/python/src/features/torch.rs | 221 +++- .../extensions/python/src/features/tracing.rs | 24 +- .../python/src/features/vm_tracer.rs | 8 +- probing/memtable/src/docs.rs | 15 +- probing/server/src/engine.rs | 12 +- probing/server/src/server/training.rs | 2 +- .../bundled_skills/gpu_pressure/steps.yaml | 8 +- .../bundled_skills/health_overview/steps.yaml | 37 +- .../bundled_skills/memory_leak/steps.yaml | 38 +- .../module_bottleneck/steps.yaml | 22 +- python/probing/core/table.py | 12 +- python/probing/crash.py | 21 +- python/probing/ext/megatron.py | 26 +- python/probing/ext/torch.py | 30 +- python/probing/handlers/pythonext.py | 7 +- python/probing/parallel.py | 5 + python/probing/profiling/collective/config.py | 38 +- python/probing/profiling/torch/__init__.py | 19 +- .../probing/profiling/torch/module_utils.py | 21 +- python/probing/profiling/torch_probe.py | 989 +++++++++++++++--- python/probing/profiling/types.py | 4 +- python/probing/skills/README.md | 1 - python/probing/skills/__init__.py | 2 - python/probing/skills/loader.py | 12 - python/probing/skills/serialize.py | 48 - python/probing/tracing/backends.py | 146 ++- python/probing/tracing/coordinates.py | 39 +- python/probing/tracing/hooks.py | 65 +- python/probing/tracing/phases.py | 50 +- python/probing/tracing/span.py | 351 ++++--- python/probing/tracing/table.py | 6 +- python/probing/util/__init__.py | 5 + python/probing/util/env.py | 20 + scripts/install-nightly.sh | 91 ++ tests/fixtures/skill_derived_variables.yaml | 7 +- tests/fixtures/skill_interpret_parity.yaml | 5 +- .../regression/ext/test_parallel_topology.py | 3 + .../profiling/test_span_overhead.py | 129 +++ .../profiling/test_torch_probe_sampling.py | 712 ++++++++++++- .../profiling/test_torch_step_timing_cycle.py | 83 ++ .../training_observability/conftest.py | 3 + .../test_topology_context.py | 3 + .../probing/ext/test_torch_profiling_spec.py | 34 + .../probing/skills/test_interpret_fixture.py | 33 + .../probing/tracing/test_phase_transitions.py | 20 +- .../probing/tracing/test_span_backends.py | 89 ++ tests/unit/probing/util/test_env.py | 30 + tests/unit/test_install_nightly.py | 64 ++ web/assets/tailwind.css | 127 ++- web/src/api/mod.rs | 3 + web/src/api/overhead.rs | 57 + web/src/app.rs | 4 +- web/src/components/app_overlays.rs | 209 ++++ web/src/components/flamegraph/logic.rs | 1 + web/src/components/keyboard_shortcuts.rs | 4 +- web/src/components/mod.rs | 3 + web/src/components/overhead/mod.rs | 7 + web/src/components/overhead/panel.rs | 366 +++++++ web/src/components/overlay_shell.rs | 93 ++ web/src/components/profiling_sidebar_hint.rs | 2 +- web/src/components/sidebar/mod.rs | 6 +- web/src/components/sidebar/monitors.rs | 126 +++ web/src/components/sidebar/tasks.rs | 245 ----- web/src/components/source_viewer.rs | 22 +- web/src/main.rs | 1 + web/src/overhead/metrics.rs | 191 ++++ web/src/overhead/mod.rs | 10 + web/src/overhead/sql.rs | 68 ++ web/src/pages/profiling.rs | 10 +- web/src/pages/training.rs | 2 +- web/src/state/mod.rs | 2 + web/src/state/overlays.rs | 71 ++ web/src/state/scroll_lock.rs | 25 + web/src/state/source_viewer.rs | 51 +- 121 files changed, 7030 insertions(+), 1197 deletions(-) create mode 100644 .github/workflows/nightly.yml create mode 100644 docs/src/design/tracing-spans.md create mode 100644 docs/src/design/tracing-spans.zh.md create mode 100644 examples/bench_instrumentation.py create mode 100644 examples/nccl_profiler_overhead.py create mode 100755 examples/run_nccl_profiler_bench.sh create mode 100644 examples/torch_probe_overhead_smoke.py delete mode 100644 python/probing/skills/serialize.py create mode 100644 python/probing/util/__init__.py create mode 100644 python/probing/util/env.py create mode 100755 scripts/install-nightly.sh create mode 100644 tests/regression/profiling/test_span_overhead.py create mode 100644 tests/regression/profiling/test_torch_step_timing_cycle.py create mode 100644 tests/unit/probing/ext/test_torch_profiling_spec.py create mode 100644 tests/unit/probing/skills/test_interpret_fixture.py create mode 100644 tests/unit/probing/util/test_env.py create mode 100644 tests/unit/test_install_nightly.py create mode 100644 web/src/api/overhead.rs create mode 100644 web/src/components/app_overlays.rs create mode 100644 web/src/components/overhead/mod.rs create mode 100644 web/src/components/overhead/panel.rs create mode 100644 web/src/components/overlay_shell.rs create mode 100644 web/src/components/sidebar/monitors.rs delete mode 100644 web/src/components/sidebar/tasks.rs create mode 100644 web/src/overhead/metrics.rs create mode 100644 web/src/overhead/mod.rs create mode 100644 web/src/overhead/sql.rs create mode 100644 web/src/state/overlays.rs create mode 100644 web/src/state/scroll_lock.rs diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 00000000..1b7ac367 --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,171 @@ +# Nightly wheels from main — rolling GitHub Release tag `nightly`. +# +# Install (after a successful run): +# curl -fsSL https://raw.githubusercontent.com/DeepLink-org/probing/main/scripts/install-nightly.sh | bash +# Or browse assets: https://github.com/DeepLink-org/probing/releases/tag/nightly + +name: Nightly Build + +on: + schedule: + # 03:00 UTC daily + - cron: "0 3 * * *" + workflow_dispatch: + push: + branches: [main] + +permissions: + contents: read + +concurrency: + group: nightly-${{ github.ref }} + cancel-in-progress: true + +jobs: + meta: + if: github.repository == 'DeepLink-org/probing' + runs-on: ubuntu-latest + outputs: + local_version: ${{ steps.ver.outputs.local_version }} + steps: + - id: ver + shell: bash + run: | + short_sha="${GITHUB_SHA:0:7}" + echo "local_version=g${GITHUB_RUN_NUMBER}.${short_sha}" >> "$GITHUB_OUTPUT" + + linux: + if: github.repository == 'DeepLink-org/probing' + needs: meta + runs-on: ubuntu-latest + strategy: + matrix: + target: [x86_64] + steps: + - uses: actions/checkout@v4 + + - name: Setup Build Environment + uses: ./.github/actions/setup-build-env + with: + python-version: "3.12" + install-cargo-tools: "true" + install-python-deps: "false" + cache-venv: "false" + + - name: Prepare wheel bundle + env: + SKIP_FRONTEND_CLEAN: "1" + run: | + if [ ! -f python/probing/bundled_web/public/index.html ]; then + make frontend + fi + make wheel-bundle nccl-profiler-lib + + - name: Build wheels + uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.target }} + args: >- + --release --out dist --zig --compatibility manylinux2014 + --auditwheel repair --local-version ${{ needs.meta.outputs.local_version }} + --features extension-module,gpu,gpu-cuda,kmsg + sccache: "true" + manylinux: auto + rust-toolchain: stable + + - name: Upload wheels + uses: actions/upload-artifact@v4 + with: + name: nightly-wheels-linux-${{ matrix.target }} + path: dist/*.whl + retention-days: 14 + + macos: + if: github.repository == 'DeepLink-org/probing' + needs: meta + runs-on: macos-latest + strategy: + matrix: + target: [x86_64, aarch64] + steps: + - uses: actions/checkout@v4 + + - name: Setup Build Environment + uses: ./.github/actions/setup-build-env + with: + python-version: "3.12" + install-cargo-tools: "true" + install-python-deps: "false" + cache-venv: "false" + + - name: Prepare wheel bundle + env: + SKIP_FRONTEND_CLEAN: "1" + run: | + if [ ! -f python/probing/bundled_web/public/index.html ]; then + make frontend + fi + make wheel-bundle + + - name: Build wheels + uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.target }} + args: >- + --release --out dist --find-interpreter + --local-version ${{ needs.meta.outputs.local_version }} + --features extension-module,gpu,kmsg + sccache: "true" + rust-toolchain: stable + + - name: Upload wheels + uses: actions/upload-artifact@v4 + with: + name: nightly-wheels-macos-${{ matrix.target }} + path: dist/*.whl + retention-days: 14 + + publish: + name: Publish nightly release + if: github.repository == 'DeepLink-org/probing' + needs: [meta, linux, macos] + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - name: Download wheels + uses: actions/download-artifact@v4 + with: + pattern: nightly-wheels-* + merge-multiple: true + path: dist + + - name: List artifacts + run: ls -la dist/ + + - name: Publish rolling nightly release + uses: ncipollo/release-action@v1 + with: + tag: nightly + name: Nightly (main) + commit: ${{ github.sha }} + allowUpdates: true + makeLatest: false + prerelease: true + removeArtifacts: true + artifactErrorsFailBuild: true + artifacts: dist/*.whl + body: | + Rolling nightly wheels built from [`${{ github.sha }}`](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}) on **${{ github.ref_name }}**. + + **Quick install** (auto-detect platform / Python): + + ```bash + curl -fsSL https://raw.githubusercontent.com/${{ github.repository }}/main/scripts/install-nightly.sh | bash + ``` + + Or pick a `.whl` below and `pip install --force-reinstall `. + + Built with local version `+${{ needs.meta.outputs.local_version }}` (base version from `pyproject.toml`). diff --git a/Cargo.lock b/Cargo.lock index 93c2e28b..82dd9b60 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3659,6 +3659,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", + "tokio", ] [[package]] diff --git a/Makefile b/Makefile index bacd5b3d..11ff2672 100644 --- a/Makefile +++ b/Makefile @@ -53,9 +53,11 @@ endif VENV_PYTHON := .venv/bin/python BUILD_PY_DEPS := build wheel toml maturin DEV_PTH := python/probing/dev_pth.py -DEV_PY_DEPS := pyyaml pytest pytest-cov coverage ipython ipykernel +DEV_PY_DEPS := pyyaml pytest pytest-cov coverage ipython ipykernel ruff PYTEST_RUN := PROBING=1 $(VENV_PYTHON) -m pytest +BENCH_SCRIPT := examples/bench_instrumentation.py +BENCH_RUN := PROBING=1 $(VENV_PYTHON) $(BENCH_SCRIPT) PYTEST_UNIT_ARGS := tests/unit PYTEST_REGRESSION_ARGS := tests/regression PYTEST_ARGS := $(PYTEST_UNIT_ARGS) $(PYTEST_REGRESSION_ARGS) @@ -86,6 +88,8 @@ help: @echo " lint ruff + clippy + mkdocs --strict" @echo " fmt rustfmt workspace + web (same paths as CI)" @echo " check-dev Quick env sanity check" + @echo " bench Instrumentation overhead (span / TorchProbe / train)" + @echo " bench-quick Same as bench, fewer iterations" @echo " clean Remove build artifacts" @echo "" @echo "Release gate: make frontend && make wheel && make test-ci" @@ -98,14 +102,14 @@ setup: @if command -v pre-commit >/dev/null 2>&1; then pre-commit install; fi install-dev-python-deps: venv - @if $(VENV_PYTHON) -c "import pytest, yaml" 2>/dev/null; then \ + @if [ -x .venv/bin/ruff ] && $(VENV_PYTHON) -c "import pytest, yaml" 2>/dev/null; then \ echo " dev Python deps OK"; \ else \ $(VENV_PYTHON) -m pip install -q -U pip $(DEV_PY_DEPS); \ fi # ============================================================================== -.PHONY: core develop dev check-dev frontend wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib hccl-shim-lib venv venv-wheel install-build-deps install-wheel-test-deps +.PHONY: core develop dev check-dev frontend wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib nccl-profiler-bench hccl-shim-lib venv venv-wheel install-build-deps install-wheel-test-deps venv: @BOOT="$(PYTHON_BOOTSTRAP)"; \ @@ -155,6 +159,13 @@ from probing.skills.paths import repo_skills_dir; \ print(f'ok: probing {VERSION}, {len(list_skills())} skills, cli={shutil.which(\"probing\") or sys.executable}')" \ || { echo "run: make develop"; exit 1; } +.PHONY: bench bench-quick +bench: check-dev + $(BENCH_RUN) + +bench-quick: check-dev + $(BENCH_RUN) --quick + frontend: @test -n "$$SKIP_FRONTEND_CLEAN" || rm -rf python/probing/bundled_web cd web && dx bundle --release @@ -201,9 +212,14 @@ nccl-profiler-lib: cargo build -p probing-nccl-profiler-cdylib $(CARGO_RELEASE) mkdir -p python/probing/libs cp $(NCCL_OUT) python/probing/libs/ + +nccl-profiler-bench: + cargo bench -p probing-nccl-profiler --bench callback_path else nccl-profiler-lib: @: +nccl-profiler-bench: + cargo bench -p probing-nccl-profiler --bench callback_path endif # Linux HCCL libprofapi.so shim → python/probing/shim/hccl/ @@ -231,7 +247,7 @@ PYTEST_WHEEL_ARGS := tests/unit tests/regression PYTEST_WHEEL_FLAGS := --import-mode=importlib -o pythonpath= -o "addopts=--verbose --color=yes --durations=10 --strict-markers" PYTEST_WHEEL_EXTRA ?= -.PHONY: test test-wheel test-ci test-rust test-rust-unit test-rust-regression test-python test-python-unit test-python-regression test-doctest test-python-wheel coverage-python-wheel +.PHONY: test test-wheel test-ci test-rust test-rust-unit test-rust-regression test-python test-python-unit test-python-regression test-doctest test-python-wheel coverage-python-wheel bench bench-quick .PHONY: fmt fmt-check lint lint-python lint-rust lint-docs lint-core clippy clippy-fix coverage coverage-rust coverage-python bootstrap clean docs-install docs docs-serve docs-clean test: test-rust test-python @@ -271,10 +287,13 @@ fmt-check: lint-core: $(CLIPPY_CORE) lint-python: - @if $(PYTHON) -c "import ruff" 2>/dev/null; then \ - $(PYTHON) -m ruff check python/ tests/; \ - elif command -v ruff >/dev/null 2>&1; then ruff check python/ tests/; \ - else echo "install ruff: $(PYTHON) -m pip install ruff"; exit 1; fi + @if [ -x .venv/bin/ruff ]; then \ + .venv/bin/ruff check python/ tests/; \ + elif command -v ruff >/dev/null 2>&1; then \ + ruff check python/ tests/; \ + else \ + echo "install ruff: make install-dev-python-deps (or: $(VENV_PYTHON) -m pip install ruff)"; exit 1; \ + fi lint-rust: $(CLIPPY_WORKSPACE) $(CLIPPY_WEB) diff --git a/docs/src/api-reference.md b/docs/src/api-reference.md index f8e54349..c3f8dda3 100644 --- a/docs/src/api-reference.md +++ b/docs/src/api-reference.md @@ -35,7 +35,7 @@ probing -t $ENDPOINT backtrace ```bash probing -t $ENDPOINT tables probing -t $ENDPOINT config probing.torch.profiling -probing -t $ENDPOINT config probing.torch.profiling=ordered:0.1 +probing -t $ENDPOINT config probing.torch.profiling=0.1 probing -t $ENDPOINT flamegraph torch -o torch.html ``` @@ -197,12 +197,12 @@ See **probing.span / probing.event / probing.record_span / probing.step** above. | Key | Description | |-----|-------------| -| `probing.torch.profiling` | TorchProbe (`on`, `ordered:0.5`, `random:0.1`, `tracepy=on`, …) | +| `probing.torch.profiling` | TorchProbe (`on`, `0.5`, `0.1:0.3`, `tracepy=on`, …) | | `probing.pprof.sample_freq` | CPU pprof sampling frequency (Hz) | ```bash probing -t $ENDPOINT config -probing -t $ENDPOINT config probing.torch.profiling=ordered:0.1 +probing -t $ENDPOINT config probing.torch.profiling=0.1 ``` There is **no** `probing.sample_rate` key. Torch sampling is controlled via `probing.torch.profiling` or `PROBING_TORCH_PROFILING`. diff --git a/docs/src/api-reference.zh.md b/docs/src/api-reference.zh.md index 182424d8..57deba94 100644 --- a/docs/src/api-reference.zh.md +++ b/docs/src/api-reference.zh.md @@ -35,7 +35,7 @@ probing -t $ENDPOINT backtrace ```bash probing -t $ENDPOINT tables probing -t $ENDPOINT config probing.torch.profiling -probing -t $ENDPOINT config probing.torch.profiling=ordered:0.1 +probing -t $ENDPOINT config probing.torch.profiling=0.1 probing -t $ENDPOINT flamegraph torch -o torch.html ``` @@ -196,12 +196,12 @@ probing.clear_role() | 键 | 说明 | |----|------| -| `probing.torch.profiling` | TorchProbe(`on`、`ordered:0.5`、`random:0.1`、`tracepy=on` 等) | +| `probing.torch.profiling` | TorchProbe(`on`、`0.5`、`0.1:0.3`、`tracepy=on` 等) | | `probing.pprof.sample_freq` | CPU pprof 采样频率 (Hz) | ```bash probing -t $ENDPOINT config -probing -t $ENDPOINT config probing.torch.profiling=ordered:0.1 +probing -t $ENDPOINT config probing.torch.profiling=0.1 ``` **没有** `probing.sample_rate` 配置项。Torch 采样通过 `probing.torch.profiling` 或 `PROBING_TORCH_PROFILING` 控制。 diff --git a/docs/src/design/index.md b/docs/src/design/index.md index 22908d8a..d0dfaad7 100644 --- a/docs/src/design/index.md +++ b/docs/src/design/index.md @@ -28,6 +28,7 @@ Vocabulary: **[Core model](../guide/concepts.md)**. | [NCCL Profiler](nccl-profiler.md) | Plugin ABI, proxy-op wait decomposition | | [Debugging Engine](debugging.md) | eval / backtrace / REPL implementation | | [Training Phases](/zh/design/training-phase/) | Phase transitions and span model *(中文)* | +| [Span API](tracing-spans.md) | `span` / `record_span` / backends / performance | ## Distributed diff --git a/docs/src/design/index.zh.md b/docs/src/design/index.zh.md index bba6d756..0792259c 100644 --- a/docs/src/design/index.zh.md +++ b/docs/src/design/index.zh.md @@ -27,6 +27,7 @@ | [NCCL Profiler](nccl-profiler.zh.md) | 插件 ABI、proxy 等待分解 | | [调试引擎](debugging.zh.md) | eval / backtrace / REPL 实现 | | [训练阶段](training-phase.zh.md) | 阶段转换与 span 模型 | +| [Span API](tracing-spans.zh.md) | `span` / `record_span` / backend / 性能与选型 | ## 分布式 diff --git a/docs/src/design/profiling.md b/docs/src/design/profiling.md index 038397d5..0ff86682 100644 --- a/docs/src/design/profiling.md +++ b/docs/src/design/profiling.md @@ -58,18 +58,45 @@ By default, Probing installs: - Forward pre/post hooks on every `nn.Module` in the model tree - Optimizer pre/post step hooks -**Backward hooks are not enabled by default.** Module backward hooks can alter autograd behaviour and have caused execution errors in production; forward-only collection is the safe default. Backward hooks remain available via `install_hooks(..., backward=True)` for controlled experiments. +**Backward timing is off by default.** With `backward=on`, probing times each module's *own* backward as the interval between **grad_output ready** (a hook on the forward output tensor — fires just before the module's backward) and **grad_input ready** (a hook on the forward input tensor — fires just after). Plain tensor `register_hook` callbacks are inplace-safe, unlike module backward hooks, which crash when downstream layers use inplace activations (AlexNet/ResNet ReLU). Modules whose input does not require grad (e.g. the first layer) record ~0 backward since the interval cannot be measured. Enable via `PROBING_TORCH_PROFILING=on,backward=on` only when needed. ### Sampling The first complete training step is **discovery**: modules are registered, no rows are written. Sampling begins on subsequent steps. -| Mode | `rate` meaning | -|------|----------------| -| `ordered` (default) | Probability each step is sampled. On sampled steps, one module rotates per step (`curr_mod`), plus a per-step **time anchor** at hook offset `0` (first hook in the step). | -| `random` | Every step is sampled. `rate` is the per-hook probability for offset `> 0`. The offset `0` anchor is always recorded. | +`rate` sets the **step sampling density**: exactly one step out of every `round(1/rate)` is sampled, evenly spaced and starting at the first probed step. This is *stratified* (not i.i.d.), so a low rate never leaves long gaps — data appears immediately and at a steady cadence (e.g. `rate=0.01` samples every 100th step, `rate=0.05` every 20th). The schedule is derived from the step index (no host RNG, no per-process seed), so every rank samples the *same* steps — distributed traces stay aligned and training stays reproducible. Non-sampled steps short-circuit: module/optimizer hooks and the GPU flush are skipped (wall timing in `torch_step_timing` is still written). -Hook overhead is reduced by sampling; forward hooks remain registered on all modules. +On a sampled step, each layer is recorded independently with probability `layer_rate` (the optional second field, e.g. `0.1:0.3` = sample every 10th step, and within it hit each layer with 30% chance). Default `layer_rate=1.0` = full snapshot. The per-layer decision is a deterministic hash of *(step, layer)* — it looks random and varies per layer, yet is reproducible and identical across ranks. The offset-`0` anchor (first hook in the step) is always recorded so every sampled step has a time reference. + +Grammar: `rate[:layer_rate]` — `rate` is the step density, `layer_rate` the per-layer hit probability. A leading `random:` / `ordered:` mode token is still accepted for back-compat and treated as `random` (the legacy per-step rotating-module `ordered` mode has been removed). + +Default when enabled (`PROBING_TORCH_PROFILING=on`): **`rate=0.05`, `layer_rate=1.0`** (full snapshot on 5% of steps). Use `1.0` for every step, `0.05:0.1` for 5% of steps sampling 10% of layers. + +**Shadow baseline steps (default `shadow=4:1`):** every 4 probed training steps are followed by 1 step where TorchProbe hooks are fully bypassed (no module-level `python.torch_trace` rows). NCCL, CPU/GPU sampling, and other collectors are unchanged. Each step writes one row to `python.torch_step_timing` (`is_shadow=1` for baseline steps). Disable with `shadow=off`. + +Estimate overhead: + +```sql +SELECT + round(median(CASE WHEN is_shadow = 0 THEN step_duration_sec END) + / nullif(median(CASE WHEN is_shadow = 1 THEN step_duration_sec END), 0) - 1, 4) * 100 + AS overhead_pct +FROM python.torch_step_timing +WHERE local_step > 1; +``` + +Hook overhead is reduced by sampling; forward hooks remain registered on all modules (except on shadow steps, where hooks return immediately). + +### NCCL profiler overhead + +TorchProbe shadow steps measure **module-hook** overhead only. The NCCL profiler plugin has no in-run shadow baseline today — it always records collective events when enabled. For NCCL AllReduce overhead vs probing, use the offline benchmark: + +```bash +./examples/run_nccl_profiler_bench.sh +# or: python examples/torch_probe_overhead_smoke.py # Torch-only smoke (no GPU) +``` + +Monitor runtime health via `nccl.profiler_counters` (`pool_exhausted`, `write_errors`, `rows_written`). The Web UI overhead panel links to the offline NCCL bench when the profiler is active. Records are flushed at the end of each optimizer step (after optional GPU `synchronize()`). Pre/post hook pairs produce two rows; **duration is set on the post row** (`post forward`, `post step`, etc.). @@ -107,11 +134,11 @@ Lite-mode hooks on `torch.distributed` write one row per collective with `durati # Environment variable (synced to probing.torch.profiling) PROBING_TORCH_PROFILING=on python train.py -# Ordered sampling, 50% of steps -PROBING_TORCH_PROFILING=ordered:0.5 python train.py +# Full snapshot on 50% of steps +PROBING_TORCH_PROFILING=0.5 python train.py -# Random per-hook sampling -PROBING_TORCH_PROFILING=random:0.1,tracepy=on python train.py +# 10% of steps, and within each hit 30% of layers +PROBING_TORCH_PROFILING=0.1:0.3,tracepy=on python train.py ``` Programmatic configuration: @@ -119,7 +146,7 @@ Programmatic configuration: ```python from probing.profiling.torch_probe import configure -configure("on,mode=ordered,rate=0.5") +configure("on,rate=0.5,layer_rate=0.3") ``` Profiling starts on the first `optimizer.step()` after torch is imported (optimizer post hook). @@ -167,6 +194,7 @@ Overhead depends on model size (all modules carry forward hooks), sampling mode/ | Scenario | Typical impact | |----------|----------------| | Torch profiling off | Baseline probe overhead only | -| `ordered:0.1` | Low; most steps skipped | -| `ordered:1.0` | Moderate; one module + anchor per step | +| `on` (default `0.05`, full snapshot) | Low; ~5% of steps sampled | +| `0.05:0.1` | Very low; 5% of steps, 10% of layers | +| `1.0` | Higher; full snapshot every step | | `sync=on` | Higher; synchronizes GPU each hook | diff --git a/docs/src/design/profiling.zh.md b/docs/src/design/profiling.zh.md index 809f438b..050df75e 100644 --- a/docs/src/design/profiling.zh.md +++ b/docs/src/design/profiling.zh.md @@ -58,18 +58,45 @@ SELECT * FROM python.torch_trace WHERE step > 10; - 模型树上每个 `nn.Module` 的 forward pre/post 钩子 - Optimizer 的 pre/post step 钩子 -**默认不启用 backward 钩子。** 模块级 backward 钩子可能改变 autograd 行为并导致执行错误;生产环境以仅 forward 为安全默认。实验场景可通过 `install_hooks(..., backward=True)` 手动开启。 +**默认不启用 backward 计时。** 开启 `backward=on` 时,对每个模块的 backward 计时取「grad_output 就绪(前向输出张量的 grad hook,在该模块反向**开始前**触发)」到「grad_input 就绪(前向输入张量的 grad hook,在反向**结束后**触发)」的区间。使用普通 tensor `register_hook` 回调,`inplace` 安全(不使用 module backward hook,避免 AlexNet/ResNet 等 `inplace` 激活导致 autograd 崩溃)。输入不需要梯度的模块(如首层)因无法测量区间,记为 ~0。生产环境请谨慎开启。 ### 采样策略 -第一个完整训练 step 为 **discovery**:只注册模块,不写库。从后续 step 开始采样。 +第一个完整训练 step 为 **discovery**:只注册模块,不写库。从后续 step 开始采样。 -| 模式 | `rate` 含义 | -|------|-------------| -| `ordered`(默认) | 每个训练 step 被采样的概率。被采样的 step 内轮转一个模块(`curr_mod`),并在 hook offset `0`(本 step 第一个钩子)记录**时间锚点**。 | -| `random` | 每个 step 都会采样。`rate` 作用于 offset `> 0` 的钩子;offset `0` 锚点始终记录。 | +`rate` 为 **step 级采样密度**:每 `round(1/rate)` 个 step 采样 1 个,等间距、从首个 probed step 开始(stratified 分层采样,非 i.i.d.,低采样率也不会长时间无数据)。调度仅由 step 序号决定(不使用宿主 RNG、无进程种子),因此各 rank 采样**相同**的 step——分布式 trace 对齐、训练可复现。未采样的 step 短路:跳过 module/optimizer hook 与 GPU flush(仍写 `torch_step_timing` 的墙钟时间)。 -采样降低记录开销;forward 钩子仍挂在全部子模块上。 +被采样的 step 内,每个 layer 以概率 `layer_rate`(可选第二段,默认 `1.0` = 全量快照)独立命中,判定为 (step, layer) 的确定性哈希——看起来随机、逐层变化,但可复现且跨 rank 一致。offset `0` 锚点(本 step 第一个钩子)始终记录,保证每个采样 step 都有时间基准。 + +文法:`rate[:layer_rate]`。仍接受前缀 `random:`/`ordered:` 以兼容旧配置(一律按 `random` 处理;旧的逐 step 轮转模块的 `ordered` 模式已移除)。 + +启用时的默认值(`PROBING_TORCH_PROFILING=on`):**`rate=0.05`,`layer_rate=1.0`**(约 5% 的 step 做全量快照)。`1.0` 表示每步都采样,`0.05:0.1` 表示 5% 的 step、每步采 10% 的 layer。 + +**Shadow 基线 step(默认 `shadow=4:1`)**:每 4 个正常训练 step 之后插入 1 个完全跳过 TorchProbe hook 的 step(不写 module 级 `python.torch_trace`)。NCCL、CPU/GPU 等其它采集不变。每个 step 写一行 `python.torch_step_timing`(shadow step 的 `is_shadow=1`)。可用 `shadow=off` 关闭。 + +估算开销: + +```sql +SELECT + round(median(CASE WHEN is_shadow = 0 THEN step_duration_sec END) + / nullif(median(CASE WHEN is_shadow = 1 THEN step_duration_sec END), 0) - 1, 4) * 100 + AS overhead_pct +FROM python.torch_step_timing +WHERE local_step > 1; +``` + +采样降低记录开销;forward 钩子仍挂在全部子模块上(shadow step 上 hook 立即返回,零开销)。 + +### NCCL profiler 开销 + +Shadow step 仅衡量 **TorchProbe 模块 hook** 开销。NCCL profiler 插件目前没有 in-run shadow 基线,启用后会持续记录 collective 事件。NCCL AllReduce 与 probing 的开销对比请用离线 benchmark: + +```bash +./examples/run_nccl_profiler_bench.sh +# 或:python examples/torch_probe_overhead_smoke.py # 仅 Torch 冒烟(无需 GPU) +``` + +运行时健康度见 `nccl.profiler_counters`(`pool_exhausted`、`write_errors`、`rows_written`)。Web UI 开销面板在 NCCL 活跃时会提示离线 bench 入口。 记录在每个 optimizer step 结束时批量落盘(可选 GPU `synchronize()`)。pre/post 成对产生两行;**时长在 post 行**(`post forward`、`post step` 等)上有效。 @@ -108,11 +135,14 @@ SELECT * FROM python.torch_trace WHERE step > 10; # 环境变量(同步为 probing.torch.profiling) PROBING_TORCH_PROFILING=on python train.py -# ordered,50% step 采样 -PROBING_TORCH_PROFILING=ordered:0.5 python train.py +# 50% step,全量快照 +PROBING_TORCH_PROFILING=0.5 python train.py + +# 10% step,每步采 30% 的 layer +PROBING_TORCH_PROFILING=0.1:0.3,tracepy=on python train.py -# random 按钩子概率 -PROBING_TORCH_PROFILING=random:0.1,tracepy=on python train.py +# 开启 backward 模块计时(默认关闭,可能影响 autograd) +PROBING_TORCH_PROFILING=1.0,backward=on python train.py ``` 编程配置: @@ -120,7 +150,7 @@ PROBING_TORCH_PROFILING=random:0.1,tracepy=on python train.py ```python from probing.profiling.torch_probe import configure -configure("on,mode=ordered,rate=0.5") +configure("on,rate=0.5,layer_rate=0.3") ``` 在 torch 导入后首次 `optimizer.step()` 时通过 optimizer post hook 启动。 @@ -161,6 +191,7 @@ GROUP BY module, stage; | 场景 | 典型影响 | |------|----------| | 关闭 torch profiling | 仅基础探针开销 | -| `ordered:0.1` | 较低;多数 step 跳过 | -| `ordered:1.0` | 中等;每步一个模块 + 锚点 | +| `on`(默认 `0.05`,全量快照) | 较低;约 5% step 被采样 | +| `0.05:0.1` | 极低;5% step、每步 10% 的 layer | +| `1.0` | 较高;每步全量快照 | | `sync=on` | 较高;每个钩子同步 GPU | diff --git a/docs/src/design/tracing-spans.md b/docs/src/design/tracing-spans.md new file mode 100644 index 00000000..4aa80ecc --- /dev/null +++ b/docs/src/design/tracing-spans.md @@ -0,0 +1,46 @@ +# Span API + +!!! note "Language" + The full design is in **[中文 / Chinese](/zh/design/tracing-spans/)**. + This page summarizes the public surface for English readers. + +Training timelines use the **Span API**; module-level profiling uses **TorchProbe** +(`python.torch_trace`). See [Training Phases](/zh/design/training-phase/) for phase +invariants. + +## Which API to use + +| API | Stack | Persist | Use when | +|-----|-------|---------|----------| +| `attach_training_phases(model, optimizer)` | indirect | yes | **Default** — automatic forward/backward/optimizer + `train.step` | +| `with probing.span(...)` | yes | on exit (deferred) | Custom phases, nesting, `probing.event()` | +| `probing.record_span(name, duration_ns=...)` | no | immediately | Closed intervals with known duration | +| Raw `Span(...)` | yes | **no** | Internal only — use `probing.span` | + +## Disabling persistence + +- `PROBING_SPAN_BACKENDS=none` — stack only, no mmap writes +- `probing.tracing.configure_backends([])` — same until `reset_backends()` + +Unset or empty env still defaults to `memtable`. + +## Deferred close + +`with probing.span` does not write rows on enter. Rows appear on exit, or when the +first `event()` forces a lazy `span_start`. In-flight spans are not visible in SQL +until then. + +## Environment + +| Variable | Default | Notes | +|----------|---------|-------| +| `PROBING_SPAN_BACKENDS` | `memtable` | `memtable`, `logger`, `otel`, `none` | +| `PROBING_SPAN_LOCATION` | off | `inspect.stack()` per span — expensive | + +See [Environment Variables](../reference/env-vars.md#tracing--spans). + +## Related + +- [Training Phases](/zh/design/training-phase/) *(中文)* +- [Profiling](profiling.md) +- [Core Concepts](../guide/concepts.md) diff --git a/docs/src/design/tracing-spans.zh.md b/docs/src/design/tracing-spans.zh.md new file mode 100644 index 00000000..c7cd342b --- /dev/null +++ b/docs/src/design/tracing-spans.zh.md @@ -0,0 +1,118 @@ +# Span API 设计 + +训练时间线(粗粒度阶段)与 TorchProbe(细粒度模块 profiling)的分工、公共 API 选型与性能特性。Phase 协作细节见 **[训练阶段](training-phase.zh.md)**。 + +## 分层 + +``` +probing.span / event / record_span ← 用户 API + ↓ +_RecordedSpan(Python) ← 持久化编排、deferred close + ↓ +Rust Span 栈(thread-local) ← trace_id / span_id / phase / 时间戳 + ↓ +SpanRecorder → backends ← memtable / logger / otel / none + ↓ +python.trace_event(mmap) ← span_start / span_end / event 行 +``` + +| 层 | 职责 | +|----|------| +| **Rust `Span`** | 线程内嵌套栈、`probing.phase()`、`current_span()` | +| **`probing.span`** | 开栈 + 退出时写 backend(或仅栈,无 backend 时) | +| **`record_span`** | 已知 duration 的闭区间,**不进栈** | +| **`attach_training_phases`** | 自动 forward/backward/optimizer + `train.step` | + +## 何时用哪个 API + +```mermaid +flowchart TD + Q[需要记录什么?] + Q -->|训练阶段边界| A["attach_training_phases(model, opt)"] + Q -->|手动阶段 / 嵌套 / event| B["with probing.span(...)"] + Q -->|已知起止时间的闭区间| C["probing.record_span(name, duration_ns=...)"] + Q -->|仅查询当前阶段| D["probing.phase()"] + A --> E["python.trace_event"] + B --> E + C --> E +``` + +| API | 进栈 | 写盘 | 典型场景 | +|-----|------|------|----------| +| `with probing.span(...)` | 是 | exit 时(deferred) | 自定义阶段、`probing.event()` 打点 | +| `probing.record_span(...)` | 否 | 立即 | `train.step`、collective 闭区间 | +| `probing.event(...)` | — | 首次 event 时 lazy 写 `span_start` | span 内里程碑 | +| 裸 `Span(...)`(Rust) | 是 | **否** | 内部/测试;请用 `probing.span` | +| `attach_training_phases` | 间接 | 是 | **推荐**:零侵入 iteration 时间线 | + +### 与 TorchProbe 的分工 + +| 能力 | phase hook | TorchProbe | +|------|------------|------------| +| iteration phase(forward/backward/optimizer) | **拥有** | `owns_training_phases` 时跳过 | +| `train.step` 墙钟 | **拥有**(`record_span`) | 不写 | +| 模块 timing / 显存 | — | `python.torch_trace` | +| 模块级 trace span | — | `trace_spans=on`(默认关或采样) | + +**推荐组合**:`attach_training_phases` + TorchProbe `on`(`trace_spans` 保持 off)——时间线靠 span,瓶颈靠 `torch_trace`。 + +## 持久化语义(deferred close) + +`with probing.span` 在 `__enter__` **不写盘**;`__exit__` 时: + +1. 若 span 生命周期内有过 `event` → 已 lazy 写 `span_start`,再写 `span_end` +2. 否则 → 单次 `record_closed_span`(batch 写 start+end) + +因此:**进行中的 span 在 SQL 里不可见**,直到关闭(或有 event)。适合降低热路径开销;live span 查询需接受这一语义。 + +`record_span` 始终写 closed 记录,适合 `train.step` 等事后已知 duration 的路径。 + +## 关闭持久化(benchmark / 纯栈) + +| 方式 | 效果 | +|------|------| +| `PROBING_SPAN_BACKENDS=none` | 仅 Rust 栈,零写盘 | +| `probing.tracing.configure_backends([])` | 同上(覆盖 env,直到 `reset_backends()`) | +| 未设置 / 空字符串 env | 仍 fallback 到 `memtable` | + +无 backend 时:`span_attrs`、`json.dumps`、memtable 构建 **全部跳过**,仅保留栈操作(bench 中 no-backend ≈ 栈成本)。 + +## 环境变量 + +| 变量 | 默认 | 说明 | +|------|------|------| +| `PROBING_SPAN_BACKENDS` | `memtable` | `memtable`, `logger`, `otel`, `none`(逗号分隔) | +| `PROBING_SPAN_LOG_LEVEL` | `INFO` | `logger` backend 级别 | +| `PROBING_SPAN_LOCATION` | 关 | `1` 时对每个 span 做 `inspect.stack()`(高开销) | + +完整列表见 [环境变量](../reference/env-vars.md#tracing--spans)。 + +## 性能要点 + +1. **坐标缓存**:同一 `micro_step` 内 `span_attrs` 复用 step + parallel 字段,不重复 `snapshot()`。 +2. **无 backend 快路径**:`persistence_enabled()` 为 false 时跳过 attrs 与 recorder。 +3. **Rust 栈 LIFO**:正常 `with` 嵌套用 O(1) pop;乱序退出仍 fallback 全栈搜索。 +4. **避免** `PROBING_SPAN_LOCATION=1` 于训练热路径;TorchProbe 变量追踪有独立 stack walk。 + +本地基准:`make bench-quick` 或 `python examples/bench_instrumentation.py --quick`。 + +## 查询 + +物化视图 `SPANS_SQL`(`probing.tracing.SPANS_SQL`)在 `span_start` / `span_end` 上 join 出 `duration_us`。示例: + +```sql +SELECT name, phase, local_step, duration_us +FROM ({SPANS_SQL}) AS spans +WHERE name IN ('forward', 'backward', 'optimizer', 'train.step') +ORDER BY start_time DESC +LIMIT 20; +``` + +(将 `{SPANS_SQL}` 替换为 `probing.tracing.SPANS_SQL` 字符串。) + +## 相关文档 + +- [训练阶段](training-phase.zh.md) — phase 不变量、`train.step`、梯度累积 +- [性能分析](profiling.zh.md) — TorchProbe hook 与落表 +- [核心模型 — trace_event](../guide/concepts.zh.md) — 表语义 +- [环境变量](../reference/env-vars.md) — `PROBING_SPAN_*` diff --git a/docs/src/design/training-phase.zh.md b/docs/src/design/training-phase.zh.md index 207a29ca..50143d42 100644 --- a/docs/src/design/training-phase.zh.md +++ b/docs/src/design/training-phase.zh.md @@ -91,4 +91,6 @@ for i, batch in enumerate(loader): ## 性能:`inspect.stack()` -自动 `location` **默认关闭**。仅在 `PROBING_SPAN_LOCATION=1` 或显式 `location=` 时,`span.py` 的 `_caller_location()` 会遍历 `inspect.stack()`。TorchProbe 变量追踪在 `torch_probe.py` 另有独立 stack walk。 +自动 `location` **默认关闭**。仅在 `PROBING_SPAN_LOCATION=1` 或显式 `location=` 时,`span.py` 的 `_caller_location()` 会遍历 `inspect.stack()`。TorchProbe 变量追踪在 `torch_probe.py` 另有独立 stack walk。 + +Span API 分层、backend、`none` 与热路径优化见 **[Span API 设计](tracing-spans.zh.md)**。 diff --git a/docs/src/guide/concepts.md b/docs/src/guide/concepts.md index 262f0e1b..513fcf95 100644 --- a/docs/src/guide/concepts.md +++ b/docs/src/guide/concepts.md @@ -245,7 +245,7 @@ Probing has many configuration points. The most important ones: | `PROBING_AUTH_TOKEN` | Authentication token for remote mode | | `PROBING_CPU_SAMPLE_MS` | CPU sampling interval in milliseconds (0=off) | | `PROBING_GPU_SAMPLE_MS` | GPU sampling interval in milliseconds | -| `PROBING_SPAN_BACKENDS` | Comma-separated: `memtable`, `logger`, `otel` | +| `PROBING_SPAN_BACKENDS` | Comma-separated: `memtable`, `logger`, `otel`, `none` (stack only). See [Span API](../design/tracing-spans.md). | | `PROBING_LOGLEVEL` | `trace`, `debug`, `info`, `warn`, `error` | The complete reference is at [Environment Variables](../reference/env-vars.md). diff --git a/docs/src/guide/concepts.zh.md b/docs/src/guide/concepts.zh.md index 08524aa5..78a9a7bb 100644 --- a/docs/src/guide/concepts.zh.md +++ b/docs/src/guide/concepts.zh.md @@ -120,6 +120,24 @@ probing.clear_role() # 恢复为环境变量默认值 和 TP rank 1。需区分 torchrun 的 `role_name` / `role_rank`(`cluster.nodes` 上 的字段)——这些是 launcher 字段;`role` 是用于分析的 key。 +## Span API:训练时间线 + +粗粒度训练时间线走 **Span API**,细粒度模块 profiling 走 **TorchProbe** +(`python.torch_trace`)。二者不要混用同一条时间线。 + +| API | 何时使用 | +|-----|----------| +| `attach_training_phases(model, optimizer)` | **默认推荐** — 自动 forward/backward/optimizer + `train.step` | +| `with probing.span(phase=...)` | 手动阶段、嵌套、`probing.event()` 打点 | +| `probing.record_span(name, duration_ns=...)` | 已知 duration 的闭区间(如 collective) | +| `probing.phase()` | 读当前 training phase(来自 span 栈) | + +关闭写盘(仅保留栈,用于 benchmark):`PROBING_SPAN_BACKENDS=none` 或 +`probing.tracing.configure_backends([])`。 + +完整选型、deferred close 语义与性能说明见 **[Span API 设计](../design/tracing-spans.zh.md)**; +phase 不变量见 **[训练阶段](../design/training-phase.zh.md)**。 + ## 联邦查询:跨节点查询 当多个 rank 注册到集群时,`global..
` 将查询 fan-out 到每个节点 @@ -174,4 +192,5 @@ culprit/victim 等待分解。它是 Rust 扩展,而非 Python @table。见 [N | 每张表的列定义 | [SQL 表目录](../reference/sql-tables.zh.md) | | 多节点配置和 torchrun | [分布式](../design/distributed.zh.md) | | 编写自定义表或 skill | [扩展机制](../design/extensibility.zh.md) | +| Span 与训练时间线 | [Span API](../design/tracing-spans.zh.md) | | CLI 命令和 Python API | [API 参考](../api-reference.zh.md) | diff --git a/docs/src/guide/sql-analytics.md b/docs/src/guide/sql-analytics.md index d2db53c8..94239bd2 100644 --- a/docs/src/guide/sql-analytics.md +++ b/docs/src/guide/sql-analytics.md @@ -49,17 +49,19 @@ When monitoring PyTorch applications, additional tables become available: **`python.torch_trace`** — TorchProbe module hooks (long-running sampled telemetry). ```sql -SELECT step, module, stage, duration, allocated +SELECT local_step, module, stage, duration, allocated FROM python.torch_trace -WHERE step > 1 AND duration > 0 -ORDER BY step DESC, seq; +WHERE local_step > 1 AND duration > 0 +ORDER BY local_step DESC, seq; ``` -The first training step is discovery (no rows). Skip cold-start steps with `WHERE step > N`. +The first training step is discovery (no rows). Skip cold-start steps with `WHERE local_step > N`. Common columns: -- `step` — training step (aligned with optimizer steps) +- `micro_step` — finest counter; advances on each optimizer step +- `local_step` — per-rank training step (`micro_step // micro_batches`) +- `global_step` — global training step (same as `local_step` when ranks align) - `seq` — hook order within the step - `module` — module name - `stage` — `pre forward`, `post forward`, `pre step`, `post step` (not `forward`/`backward` literals; backward not collected by default) @@ -68,8 +70,9 @@ Common columns: Sampling (`PROBING_TORCH_PROFILING`): -- `ordered:rate` — `rate` = probability each step is sampled; one module rotates per sampled step -- `random:rate` — every step sampled; `rate` = per-hook probability after the offset-0 anchor +- `rate[:layer_rate]` — one step in every `round(1/rate)` is sampled (evenly spaced); within a sampled step each layer is recorded with probability `layer_rate` (default `1.0` = full snapshot), e.g. `0.1:0.3`. A leading `random:`/`ordered:` token is accepted for back-compat (always `random`; the legacy rotating-module `ordered` mode was removed). + +Both modes sample on a fixed, evenly-spaced cadence derived from the step index, so data appears on the first probed step, all ranks sample the same steps (aligned distributed traces), and the host RNG is never touched. Also stamped on each row: `global_step`, `rank`, `world_size`, `role` (parallel placement key). See [SQL Tables — torch_trace](../reference/sql-tables.md#python-torch_trace). @@ -133,30 +136,30 @@ ORDER BY avg_ms DESC" ```sql SELECT - step, + local_step, stage, avg(allocated) as avg_memory_mb, max(allocated) as peak_memory_mb FROM python.torch_trace -WHERE step > (SELECT max(step) - 10 FROM python.torch_trace) -GROUP BY step, stage -ORDER BY step, stage; +WHERE local_step > (SELECT max(local_step) - 10 FROM python.torch_trace) +GROUP BY local_step, stage +ORDER BY local_step, stage; ``` **Rolling averages:** ```sql SELECT - step, + local_step, module, duration, AVG(duration) OVER ( PARTITION BY module - ORDER BY step, seq + ORDER BY local_step, seq ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) as avg_duration_5_samples FROM python.torch_trace -WHERE step > (SELECT max(step) - 5 FROM python.torch_trace); +WHERE local_step > (SELECT max(local_step) - 5 FROM python.torch_trace); ``` ### Performance Analysis @@ -171,7 +174,7 @@ SELECT avg(duration) as avg_duration, max(duration) as max_duration FROM python.torch_trace -WHERE step > (SELECT max(step) - 10 FROM python.torch_trace) +WHERE local_step > (SELECT max(local_step) - 10 FROM python.torch_trace) AND duration > 0 GROUP BY module, stage ORDER BY avg_duration DESC @@ -201,13 +204,13 @@ GROUP BY module, stage; ```sql SELECT - step, + local_step, allocated, - LAG(allocated) OVER (ORDER BY step, seq) as prev_memory, - LEAD(allocated) OVER (ORDER BY step, seq) as next_memory, + LAG(allocated) OVER (ORDER BY local_step, seq) as prev_memory, + LEAD(allocated) OVER (ORDER BY local_step, seq) as next_memory, ROW_NUMBER() OVER (ORDER BY allocated DESC) as memory_rank FROM python.torch_trace -WHERE step > (SELECT max(step) - 5 FROM python.torch_trace); +WHERE local_step > (SELECT max(local_step) - 5 FROM python.torch_trace); ``` ## Data Export @@ -220,15 +223,15 @@ probing $ENDPOINT query "SELECT * FROM python.torch_trace" > torch_traces.json # 时间序列数据用于绘图 probing $ENDPOINT query " - SELECT step, stage, avg(duration), avg(allocated) + SELECT local_step, stage, avg(duration), avg(allocated) FROM python.torch_trace - GROUP BY step, stage + GROUP BY local_step, stage " > step_metrics.json ``` ## Best Practices -1. **Use step-based filtering** - Always include step constraints for better performance +1. **Use local_step filtering** - Always include `local_step` constraints for better performance 2. **Limit result sets** - Use `LIMIT` clauses for large datasets 3. **Aggregate appropriately** - Use `GROUP BY` for summary statistics 4. **Test queries incrementally** - Start simple and add complexity gradually diff --git a/docs/src/guide/sql-analytics.zh.md b/docs/src/guide/sql-analytics.zh.md index 458a1bf6..abf3e6c8 100644 --- a/docs/src/guide/sql-analytics.zh.md +++ b/docs/src/guide/sql-analytics.zh.md @@ -49,17 +49,19 @@ SELECT * FROM python.backtrace LIMIT 10; **`python.torch_trace`** — TorchProbe 模块钩子(长期统计采样遥测)。 ```sql -SELECT step, module, stage, duration, allocated +SELECT local_step, module, stage, duration, allocated FROM python.torch_trace -WHERE step > 1 AND duration > 0 -ORDER BY step DESC, seq; +WHERE local_step > 1 AND duration > 0 +ORDER BY local_step DESC, seq; ``` -第一个训练 step 为 discovery(无数据)。用 `WHERE step > N` 跳过冷启动。 +第一个训练 step 为 discovery(无数据)。用 `WHERE local_step > N` 跳过冷启动。 常用列: -- `step` - 训练步(与 optimizer step 对齐) +- `micro_step` - 最细粒度步计数(每次 optimizer step +1) +- `local_step` - 本 rank 训练步(`micro_step // micro_batches`) +- `global_step` - 全局训练步(rank 对齐时与 `local_step` 相同) - `seq` - step 内钩子顺序 - `module` - 模块名 - `stage` - `pre forward`、`post forward`、`pre step`、`post step`(非字面 `forward`/`backward`;默认不采 backward) @@ -68,8 +70,7 @@ ORDER BY step DESC, seq; 采样(`PROBING_TORCH_PROFILING`): -- `ordered:rate` - `rate` 为每 step 采样概率;被采样 step 内轮转一个模块 -- `random:rate` - 每 step 都采样;`rate` 为 offset>0 钩子的概率(offset=0 锚点始终记录) +- `rate[:layer_rate]` - 每 `round(1/rate)` 个 step 采样 1 个(等间距);被采样 step 内每个 layer 以概率 `layer_rate`(默认 `1.0` = 全量快照)命中,如 `0.1:0.3`。仍接受前缀 `random:`/`ordered:` 以兼容旧配置(一律按 `random`;旧的轮转模块 `ordered` 模式已移除)。 每行还有 `global_step`、`rank`、`world_size`、`role`。见 [SQL 表 — torch_trace](../reference/sql-tables.zh.md#python-torch_trace)。 @@ -130,30 +131,30 @@ ORDER BY avg_ms DESC" ```sql SELECT - step, + local_step, stage, avg(allocated) as avg_memory_mb, max(allocated) as peak_memory_mb FROM python.torch_trace -WHERE step > (SELECT max(step) - 10 FROM python.torch_trace) -GROUP BY step, stage -ORDER BY step, stage; +WHERE local_step > (SELECT max(local_step) - 10 FROM python.torch_trace) +GROUP BY local_step, stage +ORDER BY local_step, stage; ``` **滚动平均:** ```sql SELECT - step, + local_step, module, duration, AVG(duration) OVER ( PARTITION BY module - ORDER BY step, seq + ORDER BY local_step, seq ROWS BETWEEN 4 PRECEDING AND CURRENT ROW ) as avg_duration_5_samples FROM python.torch_trace -WHERE step > (SELECT max(step) - 5 FROM python.torch_trace); +WHERE local_step > (SELECT max(local_step) - 5 FROM python.torch_trace); ``` ### 性能分析 @@ -168,7 +169,7 @@ SELECT avg(duration) as avg_duration, max(duration) as max_duration FROM python.torch_trace -WHERE step > (SELECT max(step) - 10 FROM python.torch_trace) +WHERE local_step > (SELECT max(local_step) - 10 FROM python.torch_trace) AND duration > 0 GROUP BY module, stage ORDER BY avg_duration DESC @@ -198,13 +199,13 @@ GROUP BY module, stage; ```sql SELECT - step, + local_step, allocated, - LAG(allocated) OVER (ORDER BY step, seq) as prev_memory, - LEAD(allocated) OVER (ORDER BY step, seq) as next_memory, + LAG(allocated) OVER (ORDER BY local_step, seq) as prev_memory, + LEAD(allocated) OVER (ORDER BY local_step, seq) as next_memory, ROW_NUMBER() OVER (ORDER BY allocated DESC) as memory_rank FROM python.torch_trace -WHERE step > (SELECT max(step) - 5 FROM python.torch_trace); +WHERE local_step > (SELECT max(local_step) - 5 FROM python.torch_trace); ``` ## 数据导出 @@ -217,15 +218,15 @@ probing $ENDPOINT query "SELECT * FROM python.torch_trace" > torch_traces.json # 时间序列数据用于绘图 probing $ENDPOINT query " - SELECT step, stage, avg(duration), avg(allocated) + SELECT local_step, stage, avg(duration), avg(allocated) FROM python.torch_trace - GROUP BY step, stage + GROUP BY local_step, stage " > step_metrics.json ``` ## 最佳实践 -1. **使用基于步数的过滤** - 始终包含步数约束以获得更好的性能 +1. **使用 local_step 过滤** - 始终包含 `local_step` 约束以获得更好的性能 2. **限制结果集** - 对大数据集使用 `LIMIT` 子句 3. **适当聚合** - 使用 `GROUP BY` 获取汇总统计 4. **渐进式测试查询** - 从简单开始,逐步增加复杂度 diff --git a/docs/src/guide/troubleshooting.md b/docs/src/guide/troubleshooting.md index 1888d75d..b96a773c 100644 --- a/docs/src/guide/troubleshooting.md +++ b/docs/src/guide/troubleshooting.md @@ -152,8 +152,8 @@ Common issues and their solutions when using Probing. 1. **Reduce TorchProbe sampling** (not a global sample_rate knob): ```bash - PROBING_TORCH_PROFILING=ordered:0.1 python your_script.py - # or at runtime: set probing.torch.profiling=ordered:0.1; + PROBING_TORCH_PROFILING=0.1 python your_script.py + # or at runtime: set probing.torch.profiling=0.1; ``` 2. **Lower CPU pprof frequency**: diff --git a/docs/src/guide/troubleshooting.zh.md b/docs/src/guide/troubleshooting.zh.md index 41715935..d93e65a9 100644 --- a/docs/src/guide/troubleshooting.zh.md +++ b/docs/src/guide/troubleshooting.zh.md @@ -131,8 +131,8 @@ 1. **降低 TorchProbe 采样**(无全局 sample_rate 开关): ```bash - PROBING_TORCH_PROFILING=ordered:0.1 python your_script.py - # 或运行时:set probing.torch.profiling=ordered:0.1; + PROBING_TORCH_PROFILING=0.1 python your_script.py + # 或运行时:set probing.torch.profiling=0.1; ``` 2. **降低 CPU pprof 频率**: diff --git a/docs/src/reference/env-vars.md b/docs/src/reference/env-vars.md index 1da7c9a4..1f7944f1 100644 --- a/docs/src/reference/env-vars.md +++ b/docs/src/reference/env-vars.md @@ -55,7 +55,7 @@ Prefix syntax: `init:SCRIPT+` runs `exec(open(SCRIPT).read())` after activ | Variable | Default | Description | |----------|---------|-------------| -| `PROBING_SPAN_BACKENDS` | `memtable` | Comma-separated list of span backends. Built-in: `memtable` (writes to `python.trace_event`), `logger` (writes to stderr), `otel` (OpenTelemetry export). Custom backends can be registered via `probing.span_backends` entry point. | +| `PROBING_SPAN_BACKENDS` | `memtable` | Comma-separated span backends. Built-in: `memtable` (`python.trace_event`), `logger` (stderr), `otel` (OpenTelemetry), `none` (stack only, no persistence). `configure_backends([])` also disables until `reset_backends()`. Unknown names fall back to `memtable` only. Custom backends: `probing.span_backends` entry point. See [Span API](../design/tracing-spans.md). | | `PROBING_SPAN_LOG_LEVEL` | `INFO` | Log level for the `logger` span backend. | | `PROBING_SPAN_LOCATION` | unset | Enable automatic location capture via `inspect.stack()` for every span. Adds overhead; use sparingly. | @@ -125,7 +125,7 @@ Non-PROBING-prefixed aliases are also recognized for Megatron compatibility: | Variable | Default | Description | |----------|---------|-------------| -| `PROBING_TORCH_PROFILING` | — | Set to `on` to activate PyTorch module hooks and write `python.torch_trace`. Required for module timing and memory data. | +| `PROBING_TORCH_PROFILING` | — | Set to `on` to activate PyTorch module hooks and write `python.torch_trace`. Default when enabled: **5% step sampling** (`rate=0.05`), full-snapshot (`layer_rate=1.0`), **shadow cadence 4:1** (`shadow=4:1` — one baseline step per four probed steps for in-run overhead in `python.torch_step_timing`). Spec is `rate[:layer_rate]` (`layer_rate` = per-layer hit probability on a sampled step); a leading `random:`/`ordered:` token is accepted for back-compat (always `random`). Override with e.g. `1.0`, `0.05:0.1`, `shadow=8:2`, or `shadow=off`. **Backward** timing (`backward=on`) times each module's backward via output/input grad hooks; off by default. | | `PROBING_TORCHRUN_CLUSTER` | `1` | Enable automatic torchrun cluster registration. Set to `0` to disable. | | `PROBING_TORCHRUN_STORE_TIMEOUT` | — | Timeout for torchrun distributed store operations. | diff --git a/docs/src/reference/sql-tables.md b/docs/src/reference/sql-tables.md index 990f1984..973297e9 100644 --- a/docs/src/reference/sql-tables.md +++ b/docs/src/reference/sql-tables.md @@ -92,6 +92,34 @@ by default. --- +### `python.torch_step_timing` {#python-torch_step_timing} + +Per-step wall-clock duration for TorchProbe overhead monitoring (probed vs shadow baseline). + +**Synonyms:** torch overhead, shadow step, profiling overhead + +| Column | Description | +|--------|-------------| +| `local_step` | Local training step (per rank) | +| `global_step` | Global step | +| `rank` | `torch.distributed` rank | +| `world_size` | World size | +| `role` | Parallel role key | +| `step_duration_sec` | Wall time for the step (seconds), measured between consecutive `post_step_hook` completions (probed steps include GPU sync and `torch_trace` flush) | +| `is_shadow` | `1` = shadow baseline step (TorchProbe hooks bypassed), `0` = probed step | +| `sampled` | `1` = TorchProbe sampled this step, `0` = not sampled or shadow | +| `shadow_normal` | Shadow cadence: probed steps per cycle at record time | +| `shadow_baseline` | Shadow cadence: baseline steps per cycle at record time | +| `sample_rate` | TorchProbe step-level sample rate at record time | +| `sample_mode` | Sampling mode (always `random`; legacy `ordered` removed) | + +**Notes:** Default `shadow=4:1`. Compare `median(step_duration_sec)` grouped by `is_shadow` for overhead %. + +**Global:** `global.python.torch_step_timing` +**Federation columns:** `_host`, `_addr`, `_rank`, `_role` + +--- + ### `python.comm_collective` {#python-comm_collective} `torch.distributed` collective calls (all_reduce, broadcast, …). diff --git a/docs/src/reference/sql-tables.zh.md b/docs/src/reference/sql-tables.zh.md index 6c3bb923..1a325b91 100644 --- a/docs/src/reference/sql-tables.zh.md +++ b/docs/src/reference/sql-tables.zh.md @@ -84,6 +84,34 @@ PyTorch 模块级 forward/step 耗时与 GPU 显存快照。 --- +### `python.torch_step_timing` {#python-torch_step_timing} + +TorchProbe 每步墙钟耗时(probed step 与 shadow 基线 step),用于估算 profiling 开销。 + +**同义词:** torch overhead、shadow step、探针开销 + +| 列 | 说明 | +|----|------| +| `local_step` | 本 rank 训练步 | +| `global_step` | 全局训练步 | +| `rank` | `torch.distributed` rank | +| `world_size` | world size | +| `role` | 并行角色 key | +| `step_duration_sec` | 本 step 墙钟耗时(秒),相邻 `post_step_hook` 结束之间;probed step 含 GPU sync 与 `torch_trace` flush | +| `is_shadow` | `1` = shadow 基线 step(跳过 TorchProbe hook),`0` = 正常 probed step | +| `sampled` | `1` = 本 step 命中 TorchProbe 采样,`0` = 未采样或 shadow | +| `shadow_normal` | 记录时的 shadow 配置:每周期 probed step 数 | +| `shadow_baseline` | 记录时的 shadow 配置:每周期 baseline step 数 | +| `sample_rate` | 记录时的 TorchProbe step 级采样率 | +| `sample_mode` | 采样模式(恒为 `random`;旧的 `ordered` 已移除) | + +**说明:** 默认 `shadow=4:1`。按 `is_shadow` 分组比较 `median(step_duration_sec)` 可得开销百分比。 + +**Global:** `global.python.torch_step_timing` +**联邦列:** `_host`、`_addr`、`_rank`、`_role` + +--- + ### `python.comm_collective` {#python-comm_collective} `torch.distributed` 集合通信(all_reduce、broadcast 等)。 diff --git a/examples/README.md b/examples/README.md index 7e532387..5c6c1d54 100644 --- a/examples/README.md +++ b/examples/README.md @@ -11,6 +11,9 @@ Runnable scripts under `examples/`. They are **not** installed with `pip install | `imagenet.py`, `imagenet_with_span.py` | `torch`, `torchvision` | Needs ImageNet data path | | `ray_tracing_example.py` | `ray` | Optional Ray integration | | `bench_profiler.py` | varies | See script header | +| **`torch_probe_overhead_smoke.py`** | none | TorchProbe shadow-step overhead smoke (no GPU) | +| **`bench_instrumentation.py`** | `torch` (optional) | One-shot report: span / phase hooks / TorchProbe overhead (`make bench`) | +| **`nccl_profiler_overhead.py`** | `torch` (CUDA) | NCCL AllReduce overhead vs probing profiler — see below | Install PyTorch into your dev venv (tracing 示例只需 torch;ImageNet 脚本还需 torchvision): @@ -28,10 +31,35 @@ Use the project venv after `make develop` (see [Contributing](../docs/src/contri source .venv/bin/activate PROBING=1 python examples/tracing.py # tracing 入门(推荐) PROBING=1 python examples/test_probing.py --depth 2 +PROBING=1 python examples/bench_instrumentation.py --quick +make bench # full report, one table per group as each finishes +make bench-quick # faster smoke ``` On Linux you can also attach with `probing -t inject` instead of `PROBING=1` at startup. +### NCCL profiler overhead (Linux + CUDA) + +Micro-benchmark (synthetic NCCL callbacks, no GPU): + +```bash +cargo bench -p probing-nccl-profiler --bench callback_path +``` + +End-to-end AllReduce overhead (baseline vs `NCCL_PROFILER_PLUGIN`): + +```bash +make nccl-profiler-lib +./examples/run_nccl_profiler_bench.sh +# tune: NPROC=8 BENCH_ITERS=500 MSG_BYTES=4194304 ./examples/run_nccl_profiler_bench.sh +``` + +Results land in `/tmp/probing_nccl_bench_/{baseline,profiled}.json`. Compare manually: + +```bash +python examples/nccl_profiler_overhead.py --compare baseline.json profiled.json +``` + ## More documentation - [Examples (MkDocs)](../docs/src/examples/index.md) diff --git a/examples/bench_instrumentation.py b/examples/bench_instrumentation.py new file mode 100644 index 00000000..01d18d4b --- /dev/null +++ b/examples/bench_instrumentation.py @@ -0,0 +1,661 @@ +#!/usr/bin/env python3 +"""Benchmark probing instrumentation overhead — one-shot report. + +Measures wall-clock cost of tracing spans, phase hooks, and TorchProbe at +representative settings. Run inside a probing-injected process:: + + PROBING=1 python examples/bench_instrumentation.py + +Quick smoke (fewer iterations):: + + PROBING=1 python examples/bench_instrumentation.py --quick + +Optional JSON export:: + + PROBING=1 python examples/bench_instrumentation.py --json-out /tmp/bench.json + +NCCL profiler AllReduce overhead is **not** included here (needs multi-GPU + +``examples/run_nccl_profiler_bench.sh``). CPU pprof (SIGPROF) is server-side; +enable via config and compare with ``probing.pprof.sample_freq=0``. +""" + +from __future__ import annotations + +import argparse +import json +import platform +import statistics +import sys +import time +from dataclasses import asdict, dataclass, field +from typing import Callable, List, Optional + +import probing +from probing.profiling.torch_probe import ( + DelayedRecord, + TorchProbe, + TorchProbeConfig, + TorchStepTiming, + shadow_step_in_cycle, +) +from probing.tracing import TraceEvent, bind_table, reset_backends +from probing.tracing.backends import configure as configure_backends +from probing.tracing.phases import BACKWARD, FORWARD, OPTIMIZER + + +@dataclass +class BenchRow: + name: str + group: str + median_sec: float + iterations: int + vs_baseline_pct: Optional[float] = None + per_iter_us: Optional[float] = None + extra: dict = field(default_factory=dict) + note: str = "" + + +@dataclass +class BenchReport: + platform: str + python: str + probing_version: str + torch: Optional[str] + cuda: bool + rows: List[BenchRow] = field(default_factory=list) + + def to_dict(self) -> dict: + return { + "platform": self.platform, + "python": self.python, + "probing_version": self.probing_version, + "torch": self.torch, + "cuda": self.cuda, + "rows": [asdict(r) for r in self.rows], + } + + +def _median_secs(fn: Callable[[], None], *, warmup: int, runs: int) -> float: + for _ in range(warmup): + fn() + samples = [] + for _ in range(runs): + t0 = time.perf_counter() + fn() + samples.append(time.perf_counter() - t0) + return statistics.median(samples) + + +def _row( + name: str, + group: str, + med: float, + iterations: int, + *, + baseline: Optional[float] = None, + extra: Optional[dict] = None, + note: str = "", +) -> BenchRow: + return BenchRow( + name=name, + group=group, + median_sec=med, + iterations=iterations, + per_iter_us=(med / iterations) * 1e6 if iterations else None, + vs_baseline_pct=_pct_vs(baseline, med) if baseline is not None else None, + extra=extra or {}, + note=note, + ) + + +def _pct_vs(baseline: float, measured: float) -> Optional[float]: + if baseline <= 0: + return None + return (measured / baseline - 1.0) * 100.0 + + +def _init_tracing_tables() -> None: + reset_backends(clear_registered=True) + probing.step(0) + probing.step(micro_batches=1) + try: + TraceEvent.drop() + except Exception: + pass + TraceEvent.init_table() + bind_table(TraceEvent) + + +class _FakeMod: + pass + + +def _make_tracer( + spec: str, *, live_sampling: bool = False +) -> tuple[TorchProbe, _FakeMod]: + cfg = TorchProbeConfig.parse(spec) + tracer = TorchProbe(config=cfg) + tracer.has_backend = False + root = _FakeMod() + tracer.mod_names = {id(root): "model"} + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + tracer._step_cycle = 0 + if live_sampling: + tracer.finalize_discovery() + else: + tracer.finalized = True + tracer.sampled_step = True + tracer._refresh_shadow_flag() + return tracer, root + + +def _synthetic_torch_probe_steps( + tracer: TorchProbe, root: _FakeMod, *, steps: int, live_sampling: bool = False +) -> list[float]: + timings: list[float] = [] + orig_timing_save = TorchStepTiming.save + orig_delayed_save = DelayedRecord.save + + def _capture_timing(self): + timings.append(self.step_duration_sec) + + try: + TorchStepTiming.save = _capture_timing # type: ignore[method-assign] + DelayedRecord.save = lambda self: None # type: ignore[method-assign] + probing.step(0) + if not tracer.finalized: + tracer.post_step_hook(None, (), {}) + for _ in range(steps): + if tracer.finalized: + tracer._mark_step_wall_start() + if not tracer.shadow_step: + if live_sampling: + tracer._ensure_step_plan() + if (not live_sampling) or tracer._hooks_dispatch_active(): + tracer.log_module_stage("pre forward", root) + tracer.log_module_stage("post forward", root) + tracer.post_step_hook(None, (), {}) + finally: + TorchStepTiming.save = orig_timing_save # type: ignore[method-assign] + DelayedRecord.save = orig_delayed_save # type: ignore[method-assign] + + return timings + + +def bench_tracing_layer(*, span_iters: int, warmup: int, runs: int) -> list[BenchRow]: + rows: list[BenchRow] = [] + + def empty_loop(): + acc = 0 + for i in range(span_iters): + acc += i & 1 + return acc + + def span_loop(backends: list[str]): + configure_backends(backends) + probing.step(0) + + def _run(): + for i in range(span_iters): + with probing.span(f"iter-{i}", phase=FORWARD, source="bench"): + pass + + return _run + + def span_events_loop(): + configure_backends(["memtable"]) + probing.step(0) + + def _run(): + for i in range(span_iters): + with probing.span(f"iter-{i}", phase=FORWARD, source="bench"): + probing.event("tick", attributes=[{"i": i}]) + + return _run + + train_step_iters = max(1, span_iters // 10) + + def train_step_spans(): + configure_backends(["memtable"]) + probing.step(0) + + def _run(): + for _ in range(train_step_iters): + with probing.span("forward", phase=FORWARD): + pass + with probing.span("backward", phase=BACKWARD): + pass + with probing.span("optimizer", phase=OPTIMIZER): + probing.step() + + return _run + + scenarios: list[tuple[str, Callable[[], None], int, dict]] = [ + ("empty loop", empty_loop, span_iters, {}), + ("span (no backend)", span_loop([]), span_iters, {"backends": "none"}), + ( + "span (memtable)", + span_loop(["memtable"]), + span_iters, + {"backends": "memtable"}, + ), + ("span + event (memtable)", span_events_loop(), span_iters, {}), + ("train.step span triple", train_step_spans(), train_step_iters * 3, {}), + ] + + measured: dict[str, float] = {} + for name, fn, iters, extra in scenarios: + measured[name] = _median_secs(fn, warmup=warmup, runs=runs) + + span_base = measured["span (no backend)"] + for name, _, iters, extra in scenarios: + rows.append( + _row( + name, + "tracing", + measured[name], + iters, + baseline=( + span_base + if name not in ("empty loop", "span (no backend)") + else None + ), + extra=extra, + ) + ) + return rows + + +def bench_torch_probe_layer(*, steps: int) -> list[BenchRow]: + rows: list[BenchRow] = [] + configure_backends(["memtable"]) + + specs: list[tuple[str, str, bool]] = [ + ( + "hooks only (trace_spans=off, shadow=off)", + "on,trace_spans=off,shadow=off", + False, + ), + ("hooks + module spans", "on,trace_spans=on,shadow=off", False), + ("default shadow 4:1", "on,trace_spans=off,shadow=4:1", False), + ("sample rate 0.05", "on,trace_spans=off,shadow=off,rate=0.05", True), + ("sample rate 1.0", "on,trace_spans=off,shadow=off,rate=1.0", True), + ] + + medians: dict[str, float] = {} + extras: dict[str, dict] = {} + + for label, spec, live_sampling in specs: + tracer, root = _make_tracer(spec, live_sampling=live_sampling) + timings = _synthetic_torch_probe_steps( + tracer, root, steps=steps, live_sampling=live_sampling + ) + med = statistics.median(timings) if timings else 0.0 + medians[label] = med + extra: dict = {"steps": steps, "spec": spec} + if "shadow=4:1" in spec and timings: + probed = [t for i, t in enumerate(timings) if not shadow_step_in_cycle(i)] + shadow = [t for i, t in enumerate(timings) if shadow_step_in_cycle(i)] + if probed and shadow: + tax = (statistics.median(probed) / statistics.median(shadow) - 1) * 100 + extra["hook_tax_pct"] = round(tax, 2) + extras[label] = extra + + baseline = medians.get("hooks only (trace_spans=off, shadow=off)", 0.0) + for label, med in medians.items(): + rows.append( + _row( + label, + "torch_probe", + med, + steps, + baseline=baseline if label != specs[0][0] else None, + extra=extras.get(label, {}), + note="per optimizer step (synthetic)", + ) + ) + return rows + + +def _torch_info() -> tuple[Optional[str], bool]: + try: + import torch + + cuda = bool(torch.cuda.is_available()) + return torch.__version__, cuda + except ImportError: + return None, False + + +def _torch_warmup() -> None: + import torch + import torch.nn as nn + + m = nn.Linear(8, 4) + x = torch.randn(16, 8) + y = torch.randint(0, 4, (16,)) + opt = torch.optim.SGD(m.parameters(), lr=0.01) + for _ in range(8): + opt.zero_grad() + loss = nn.functional.cross_entropy(m(x), y) + loss.backward() + opt.step() + + +def bench_torch_training_layer( + *, batches: int, warmup: int, runs: int +) -> list[BenchRow]: + import torch + import torch.nn as nn + import torch.nn.functional as F + + from probing.profiling.torch import install_hooks + from probing.tracing.hooks import detach_training_phases + + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + _torch_warmup() + + class TinyNet(nn.Module): + def __init__(self) -> None: + super().__init__() + self.fc1 = nn.Linear(8, 16) + self.fc2 = nn.Linear(16, 4) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return self.fc2(F.relu(self.fc1(x))) + + def one_train_loop(*, phases: bool, torch_probe_spec: Optional[str]) -> float: + """Return wall seconds for ``batches`` timed steps (after 2 warmup steps).""" + model = TinyNet().to(device) + opt = torch.optim.SGD(model.parameters(), lr=0.01) + if phases: + probing.attach_training_phases(model, opt) + tracer = None + if torch_probe_spec: + cfg = TorchProbeConfig.parse(torch_probe_spec) + tracer = TorchProbe(config=cfg) + install_hooks(model, tracer=tracer) + install_hooks(opt=opt, tracer=tracer) + x = torch.randn(16, 8, device=device) + y = torch.randint(0, 4, (16,), device=device) + probing.step(0) + for _ in range(2): + logits = model(x) + loss = F.cross_entropy(logits, y) + opt.zero_grad() + loss.backward() + opt.step() + t0 = time.perf_counter() + for _ in range(batches): + logits = model(x) + loss = F.cross_entropy(logits, y) + opt.zero_grad() + loss.backward() + opt.step() + elapsed = time.perf_counter() - t0 + if phases: + detach_training_phases(model, opt) + if tracer is not None: + from probing.profiling.torch import uninstall_hooks + + uninstall_hooks() + return elapsed + + scenarios = [ + ("train baseline (no hooks)", None, False), + ("train + phase hooks", None, True), + ( + "train + TorchProbe (on, shadow=off)", + "on,trace_spans=off,shadow=off,rate=1.0", + False, + ), + ( + "train + phase hooks + TorchProbe", + "on,trace_spans=on,shadow=4:1,rate=0.05", + True, + ), + ] + + rows: list[BenchRow] = [] + configure_backends(["memtable"]) + baseline_name, _, _ = scenarios[0] + base_samples: list[float] = [] + paired_delta: dict[str, list[float]] = {name: [] for name, _, _ in scenarios[1:]} + rounds = warmup + runs + + for r in range(rounds): + for name, probe_spec, phases in scenarios[1:]: + base_t = one_train_loop(phases=False, torch_probe_spec=None) + inst_t = one_train_loop(phases=phases, torch_probe_spec=probe_spec) + if r >= warmup: + base_samples.append(base_t) + paired_delta[name].append(inst_t - base_t) + + base_med = statistics.median(base_samples) + rows.append( + _row( + baseline_name, + "torch_train", + base_med, + batches, + extra={"device": str(device), "batches": batches}, + note="A/B paired baseline (back-to-back)", + ) + ) + for name, _, _ in scenarios[1:]: + delta_med = statistics.median(paired_delta[name]) + inst_med = base_med + delta_med + rows.append( + _row( + name, + "torch_train", + inst_med, + batches, + baseline=base_med, + extra={ + "device": str(device), + "batches": batches, + "paired_delta_ms": round(delta_med * 1000, 3), + }, + note=f"paired Δ {delta_med * 1000:+.2f}ms vs baseline", + ) + ) + return rows + + +def _format_row_line(row: BenchRow) -> str: + med_ms = row.median_sec * 1000.0 + per_us = f"{row.per_iter_us:.1f}µs" if row.per_iter_us is not None else "—" + vs = ( + f"{row.vs_baseline_pct:+.1f}%" + if row.vs_baseline_pct is not None and abs(row.vs_baseline_pct) < 10000 + else ("—" if row.vs_baseline_pct is None else "large") + ) + note = row.note + if row.extra.get("hook_tax_pct") is not None: + note = f"hook_tax={row.extra['hook_tax_pct']}% {note}".strip() + return f"{row.name:<42} {per_us:>10} {med_ms:>9.2f}ms {vs:>10} {note}" + + +def _print_report_header(report: BenchReport) -> None: + print("=" * 72) + print("Probing instrumentation overhead report") + print("=" * 72) + print(f"Platform : {report.platform}") + print(f"Python : {report.python}") + print(f"Probing : {report.probing_version}") + print(f"PyTorch : {report.torch or '(not installed)'}") + print(f"CUDA : {report.cuda}") + print() + + +def _print_group_table(rows: list[BenchRow], *, group: str) -> None: + if not rows: + return + print(f"## {group}") + print(f"{'scenario':<42} {'per-iter':>10} {'total':>10} {'vs base':>10} notes") + print("-" * 72) + for row in rows: + print(_format_row_line(row)) + print() + + +def _print_report_footer() -> None: + print("Tips:") + print(" • TorchProbe hook_tax compares probed vs shadow steps (shadow=4:1).") + print( + " • NCCL profiler: make nccl-profiler-bench or examples/run_nccl_profiler_bench.sh" + ) + print(" • SQL: SELECT * FROM python.torch_step_timing; python.trace_event") + print("=" * 72) + + +def _print_report(report: BenchReport) -> None: + _print_report_header(report) + current_group = None + group_rows: list[BenchRow] = [] + for row in report.rows: + if row.group != current_group: + if group_rows: + _print_group_table(group_rows, group=current_group or "") + current_group = row.group + group_rows = [] + group_rows.append(row) + if group_rows and current_group: + _print_group_table(group_rows, group=current_group) + _print_report_footer() + + +def _run_bench_group( + report: BenchReport, + *, + index: int, + total: int, + group: str, + label: str, + fn: Callable[[], list[BenchRow]], +) -> list[BenchRow]: + print(f">>> [{index}/{total}] {label} …", flush=True) + rows = fn() + report.rows.extend(rows) + _print_group_table(rows, group=group) + return rows + + +def main(argv: Optional[list[str]] = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--quick", + action="store_true", + help="Fewer iterations (faster, noisier)", + ) + parser.add_argument( + "--json-out", + type=str, + default="", + help="Write machine-readable report to this path", + ) + parser.add_argument( + "--skip-torch", + action="store_true", + help="Skip PyTorch training micro-benchmarks", + ) + parser.add_argument( + "--batch", + action="store_true", + help="Print the full report once at the end (default: emit each group as it finishes)", + ) + args = parser.parse_args(argv) + + if args.quick: + span_iters, probe_steps, batches, warmup, runs = 80, 12, 8, 1, 3 + else: + span_iters, probe_steps, batches, warmup, runs = 300, 40, 30, 2, 5 + + torch_ver, cuda = _torch_info() + report = BenchReport( + platform=platform.platform(), + python=sys.version.split()[0], + probing_version=getattr(probing, "VERSION", "unknown"), + torch=torch_ver, + cuda=cuda, + ) + + _init_tracing_tables() + + def torch_train_rows() -> list[BenchRow]: + if not args.skip_torch and torch_ver: + return bench_torch_training_layer(batches=batches, warmup=warmup, runs=runs) + if not torch_ver: + return [ + BenchRow( + name="torch training (skipped)", + group="torch_train", + median_sec=0.0, + iterations=0, + note="install torch to enable", + ) + ] + return [] + + bench_plan: list[tuple[str, str, Callable[[], list[BenchRow]]]] = [ + ( + "tracing", + "Tracing spans (memtable / events)", + lambda: bench_tracing_layer( + span_iters=span_iters, warmup=warmup, runs=runs + ), + ), + ( + "torch_probe", + "TorchProbe synthetic hooks", + lambda: bench_torch_probe_layer(steps=probe_steps), + ), + ( + "torch_train", + "PyTorch TinyNet training (A/B paired)", + torch_train_rows, + ), + ] + if args.skip_torch or not torch_ver: + bench_plan = [p for p in bench_plan if p[0] != "torch_train"] + if not args.skip_torch and not torch_ver: + bench_plan.append( + ( + "torch_train", + "PyTorch training (skipped — no torch)", + torch_train_rows, + ) + ) + + if args.batch: + for _, _, fn in bench_plan: + report.rows.extend(fn()) + _print_report(report) + else: + _print_report_header(report) + total = len(bench_plan) + for i, (group, label, fn) in enumerate(bench_plan, start=1): + _run_bench_group( + report, + index=i, + total=total, + group=group, + label=label, + fn=fn, + ) + _print_report_footer() + + if args.json_out: + with open(args.json_out, "w", encoding="utf-8") as fh: + json.dump(report.to_dict(), fh, indent=2) + print(f"Wrote {args.json_out}") + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/examples/imagenet_with_span.py b/examples/imagenet_with_span.py index 932467dc..a5e2d3f9 100644 --- a/examples/imagenet_with_span.py +++ b/examples/imagenet_with_span.py @@ -115,6 +115,12 @@ action="store_true", help="evaluate model on validation set", ) +parser.add_argument( + "--no-validate", + dest="validate", + action="store_false", + help="skip per-epoch validation during training", +) parser.add_argument( "--pretrained", dest="pretrained", action="store_true", help="use pre-trained model" ) @@ -412,12 +418,15 @@ def main_worker(gpu, ngpus_per_node, args): with probing.span("train"): train(train_loader, model, criterion, optimizer, epoch, device, args) - with probing.span("validate"): - acc1 = validate(val_loader, model, criterion, args) + if args.validate: + with probing.span("validate"): + acc1 = validate(val_loader, model, criterion, args) + else: + acc1 = best_acc1 scheduler.step() probing.event("epoch.metrics", attributes=[{"acc1": float(acc1)}]) # remember best acc@1 and save checkpoint - is_best = acc1 > best_acc1 + is_best = args.validate and acc1 > best_acc1 best_acc1 = max(acc1, best_acc1) if not args.multiprocessing_distributed or ( args.multiprocessing_distributed and args.rank % ngpus_per_node == 0 @@ -439,7 +448,7 @@ def main_worker(gpu, ngpus_per_node, args): def compute_loss(criterion, output, target): """Compute loss - extracted as separate function for tracing.""" - print("Computing loss...") + # print("Computing loss...") loss = criterion(output, target) return loss @@ -461,7 +470,8 @@ def train(train_loader, model, criterion, optimizer, epoch, device, args): end = time.time() for i, (images, target) in enumerate(train_loader): - time.sleep(1) + step_start = time.perf_counter() + # time.sleep(1) with probing.span("batch"): # measure data loading time data_time.update(time.time() - end) @@ -482,6 +492,13 @@ def train(train_loader, model, criterion, optimizer, epoch, device, args): optimizer.step() batch_time.update(time.time() - end) end = time.time() + step_elapsed_ms = (time.perf_counter() - step_start) * 1000.0 + print( + f"Epoch [{epoch}] step [{i + 1}/{len(train_loader)}] " + f"time={step_elapsed_ms:.2f}ms loss={loss.item():.4f} " + f"acc1={acc1[0]:.2f}", + flush=True, + ) if i % args.print_freq == 0: probing.event( "batch.stats", diff --git a/examples/nccl_profiler_overhead.py b/examples/nccl_profiler_overhead.py new file mode 100644 index 00000000..97326614 --- /dev/null +++ b/examples/nccl_profiler_overhead.py @@ -0,0 +1,264 @@ +#!/usr/bin/env python3 +"""End-to-end NCCL collective benchmark — baseline vs probing-nccl-profiler. + +Measures AllReduce (or AllGather) throughput under ``torchrun``. Run once per +mode (baseline / profiled) and compare with ``run_nccl_profiler_bench.sh``, +or pass ``--compare`` on rank 0 after two JSON result files exist. + +Typical usage (Linux + CUDA + built plugin):: + + make nccl-profiler-lib + ./examples/run_nccl_profiler_bench.sh + +Manual single run (profiled):: + + export NCCL_PROFILER_PLUGIN=$(python -m probing.nccl --plugin-path) + export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) + export PROBING=2 + export PROBING_NCCL_INFLIGHT_THRESHOLD_SECS=0 # no watchdog noise + torchrun --nproc_per_node=8 examples/nccl_profiler_overhead.py \\ + --output /tmp/nccl_bench_profiled.json +""" + +from __future__ import annotations + +import argparse +import json +import os +import statistics +import sys +import time +from dataclasses import asdict, dataclass +from pathlib import Path + + +@dataclass +class BenchResult: + profiled: bool + world_size: int + local_rank: int + op: str + dtype: str + msg_bytes: int + warmup_iters: int + bench_iters: int + latency_us_mean: float + latency_us_p50: float + latency_us_p99: float + throughput_gbs: float + total_sec: float + nccl_profiler_plugin: str | None + probing_data_dir: str | None + + def overhead_vs(self, baseline: BenchResult) -> dict[str, float]: + """Return relative slowdown metrics (positive = profiler slower).""" + return { + "latency_mean_pct": pct_delta( + baseline.latency_us_mean, self.latency_us_mean + ), + "latency_p50_pct": pct_delta(baseline.latency_us_p50, self.latency_us_p50), + "latency_p99_pct": pct_delta(baseline.latency_us_p99, self.latency_us_p99), + "throughput_pct": pct_delta(self.throughput_gbs, baseline.throughput_gbs), + } + + +def pct_delta(reference: float, measured: float) -> float: + if reference == 0: + return 0.0 + return 100.0 * (measured - reference) / reference + + +def _percentile(values: list[float], pct: float) -> float: + if not values: + return 0.0 + ordered = sorted(values) + idx = min(len(ordered) - 1, int(round((pct / 100.0) * (len(ordered) - 1)))) + return ordered[idx] + + +def run_benchmark(args: argparse.Namespace) -> BenchResult: + import torch + import torch.distributed as dist + + def dtype_from_name(name: str) -> torch.dtype: + table = { + "fp16": torch.float16, + "bf16": torch.bfloat16, + "fp32": torch.float32, + } + try: + return table[name] + except KeyError as exc: + raise SystemExit( + f"unsupported dtype {name!r}; choose fp16|bf16|fp32" + ) from exc + + def element_bytes(dtype: torch.dtype) -> int: + return torch.tensor([], dtype=dtype).element_size() + + def make_tensor( + op: str, msg_bytes: int, dtype: torch.dtype, device: torch.device + ) -> torch.Tensor | list[torch.Tensor]: + elem = element_bytes(dtype) + if op == "allreduce": + count = max(1, msg_bytes // elem) + return torch.ones(count, dtype=dtype, device=device) + if op == "allgather": + count = max(1, msg_bytes // elem) + return torch.ones(count, dtype=dtype, device=device) + raise SystemExit(f"unsupported op {op!r}") + + def run_collective(op: str, tensor: torch.Tensor | list[torch.Tensor]) -> None: + if op == "allreduce": + dist.all_reduce(tensor) # type: ignore[arg-type] + elif op == "allgather": + world = dist.get_world_size() + out = [torch.empty_like(tensor) for _ in range(world)] # type: ignore[arg-type] + dist.all_gather(out, tensor) # type: ignore[arg-type] + else: + raise RuntimeError(op) + + def sync(device: torch.device) -> None: + if device.type == "cuda": + torch.cuda.synchronize(device) + + if not torch.cuda.is_available(): + raise SystemExit("CUDA is required for NCCL overhead benchmark") + + local_rank = int(os.environ.get("LOCAL_RANK", "0")) + device = torch.device(f"cuda:{local_rank}") + torch.cuda.set_device(device) + + backend = os.environ.get("PROBING_TORCH_BACKEND", "nccl") + dist.init_process_group(backend=backend) + + rank = dist.get_rank() + world = dist.get_world_size() + dtype = dtype_from_name(args.dtype) + tensor = make_tensor(args.op, args.msg_bytes, dtype, device) + + for _ in range(args.warmup_iters): + run_collective(args.op, tensor) + sync(device) + dist.barrier() + + latencies_us: list[float] = [] + start_total = time.perf_counter() + for _ in range(args.bench_iters): + sync(device) + t0 = time.perf_counter() + run_collective(args.op, tensor) + sync(device) + latencies_us.append((time.perf_counter() - t0) * 1e6) + dist.barrier() + total_sec = time.perf_counter() - start_total + + mean_us = statistics.mean(latencies_us) + p50_us = _percentile(latencies_us, 50) + p99_us = _percentile(latencies_us, 99) + throughput = args.msg_bytes / (mean_us * 1e3) if mean_us > 0 else 0.0 + + result = BenchResult( + profiled=bool(os.environ.get("NCCL_PROFILER_PLUGIN")), + world_size=world, + local_rank=local_rank, + op=args.op, + dtype=args.dtype, + msg_bytes=args.msg_bytes, + warmup_iters=args.warmup_iters, + bench_iters=args.bench_iters, + latency_us_mean=mean_us, + latency_us_p50=p50_us, + latency_us_p99=p99_us, + throughput_gbs=throughput, + total_sec=total_sec, + nccl_profiler_plugin=os.environ.get("NCCL_PROFILER_PLUGIN"), + probing_data_dir=os.environ.get("PROBING_DATA_DIR"), + ) + + if rank == 0: + print( + f"[bench] profiled={result.profiled} world={world} " + f"op={args.op} msg={args.msg_bytes}B dtype={args.dtype}\n" + f" mean={mean_us:.1f}us p50={p50_us:.1f}us p99={p99_us:.1f}us " + f"algobw={throughput:.2f} GB/s ({args.bench_iters} iters, {total_sec:.2f}s)", + flush=True, + ) + if args.output: + Path(args.output).write_text( + json.dumps(asdict(result), indent=2) + "\n", encoding="utf-8" + ) + print(f" wrote {args.output}", flush=True) + + dist.barrier() + dist.destroy_process_group() + return result + + +def compare_results(baseline_path: Path, profiled_path: Path) -> None: + baseline = BenchResult(**json.loads(baseline_path.read_text(encoding="utf-8"))) + profiled = BenchResult(**json.loads(profiled_path.read_text(encoding="utf-8"))) + delta = profiled.overhead_vs(baseline) + + print("\n=== NCCL profiler overhead ===") + print(f"baseline : {baseline_path}") + print(f"profiled : {profiled_path}") + print( + f"world_size={baseline.world_size} op={baseline.op} msg={baseline.msg_bytes}B" + ) + print( + f"latency mean : {baseline.latency_us_mean:.1f}us -> " + f"{profiled.latency_us_mean:.1f}us (+{delta['latency_mean_pct']:.2f}%)" + ) + print( + f"latency p50 : {baseline.latency_us_p50:.1f}us -> " + f"{profiled.latency_us_p50:.1f}us (+{delta['latency_p50_pct']:.2f}%)" + ) + print( + f"latency p99 : {baseline.latency_us_p99:.1f}us -> " + f"{profiled.latency_us_p99:.1f}us (+{delta['latency_p99_pct']:.2f}%)" + ) + print( + f"algobw : {baseline.throughput_gbs:.2f} -> " + f"{profiled.throughput_gbs:.2f} GB/s ({delta['throughput_pct']:+.2f}%)" + ) + + +def parse_args(argv: list[str] | None = None) -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--op", choices=("allreduce", "allgather"), default="allreduce") + parser.add_argument("--dtype", choices=("fp16", "bf16", "fp32"), default="fp16") + parser.add_argument( + "--msg-bytes", + type=int, + default=int(os.environ.get("NCCL_BENCH_MSG_BYTES", str(1 << 20))), + help="per-rank message size in bytes (default 1 MiB)", + ) + parser.add_argument("--warmup-iters", type=int, default=20) + parser.add_argument("--bench-iters", type=int, default=200) + parser.add_argument( + "--output", + type=Path, + default=None, + help="JSON path written by rank 0", + ) + parser.add_argument( + "--compare", + nargs=2, + metavar=("BASELINE_JSON", "PROFILED_JSON"), + type=Path, + help="compare two result files and exit (no torchrun needed)", + ) + return parser.parse_args(argv) + + +def main(argv: list[str] | None = None) -> None: + args = parse_args(argv) + if args.compare: + compare_results(args.compare[0], args.compare[1]) + return + run_benchmark(args) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/examples/run_nccl_profiler_bench.sh b/examples/run_nccl_profiler_bench.sh new file mode 100755 index 00000000..b3289dc6 --- /dev/null +++ b/examples/run_nccl_profiler_bench.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +# Run NCCL AllReduce benchmark twice (baseline vs probing-nccl-profiler) and +# print overhead. Requires Linux, CUDA, PyTorch, and a built plugin (.so). +# +# Usage: +# ./examples/run_nccl_profiler_bench.sh +# NPROC=8 BENCH_ITERS=500 ./examples/run_nccl_profiler_bench.sh +# +# Env: +# NPROC torchrun --nproc_per_node (default: visible GPU count or 2) +# BENCH_ITERS timed iterations per run (default 200) +# WARMUP_ITERS warmup iterations (default 20) +# MSG_BYTES message size (default 1048576) +# OUT_DIR JSON output directory (default /tmp/probing_nccl_bench_) + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +if [[ "$(uname -s)" != "Linux" ]]; then + echo "NCCL profiler benchmark requires Linux (found $(uname -s))" >&2 + exit 1 +fi + +if ! python -c "import torch; assert torch.cuda.is_available()" 2>/dev/null; then + echo "CUDA + PyTorch required. Install torch in the project venv first." >&2 + exit 1 +fi + +# Build plugin if missing. +if ! python -m probing.nccl --plugin-path >/dev/null 2>&1; then + echo "Building nccl profiler plugin..." + make nccl-profiler-lib +fi + +NPROC="${NPROC:-$(python -c "import torch; print(max(1, torch.cuda.device_count()))")}" +BENCH_ITERS="${BENCH_ITERS:-200}" +WARMUP_ITERS="${WARMUP_ITERS:-20}" +MSG_BYTES="${MSG_BYTES:-1048576}" +OUT_DIR="${OUT_DIR:-/tmp/probing_nccl_bench_$$}" +mkdir -p "$OUT_DIR" + +BASELINE_JSON="$OUT_DIR/baseline.json" +PROFILED_JSON="$OUT_DIR/profiled.json" + +COMMON_ARGS=( + examples/nccl_profiler_overhead.py + --warmup-iters "$WARMUP_ITERS" + --bench-iters "$BENCH_ITERS" + --msg-bytes "$MSG_BYTES" +) + +echo "=== probing NCCL profiler overhead benchmark ===" +echo "nproc=$NPROC iters=$BENCH_ITERS msg_bytes=$MSG_BYTES out=$OUT_DIR" +echo + +echo "--- baseline (no NCCL_PROFILER_PLUGIN) ---" +env -u NCCL_PROFILER_PLUGIN -u PROBING \ + torchrun --nproc_per_node="$NPROC" "${COMMON_ARGS[@]}" --output "$BASELINE_JSON" + +echo +echo "--- profiled (probing-nccl-profiler) ---" +export NCCL_PROFILER_PLUGIN +NCCL_PROFILER_PLUGIN="$(python -m probing.nccl --plugin-path)" +export NCCL_PROFILE_EVENT_MASK +NCCL_PROFILE_EVENT_MASK="$(python -m probing.nccl --event-mask)" +export PROBING=2 +export PROBING_DATA_DIR="${PROBING_DATA_DIR:-$OUT_DIR/probing_data}" +export PROBING_NCCL_INFLIGHT_THRESHOLD_SECS=0 +mkdir -p "$PROBING_DATA_DIR" + +torchrun --nproc_per_node="$NPROC" "${COMMON_ARGS[@]}" --output "$PROFILED_JSON" + +echo +python examples/nccl_profiler_overhead.py --compare "$BASELINE_JSON" "$PROFILED_JSON" + +echo +echo "Raw JSON: $BASELINE_JSON $PROFILED_JSON" diff --git a/examples/torch_probe_overhead_smoke.py b/examples/torch_probe_overhead_smoke.py new file mode 100644 index 00000000..51c36d60 --- /dev/null +++ b/examples/torch_probe_overhead_smoke.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""Smoke-check TorchProbe in-run overhead (shadow step + torch_step_timing). + +No GPU or torch.distributed required. Run inside a probing-injected process:: + + PROBING=1 python examples/torch_probe_overhead_smoke.py + +Or from the repo with the dev venv:: + + .venv/bin/python examples/torch_probe_overhead_smoke.py +""" + +from __future__ import annotations + +import sys +import time + +from probing.profiling.torch_probe import TorchProbe, TorchProbeConfig + + +class _FakeMod: + pass + + +def main() -> int: + tracer = TorchProbe(TorchProbeConfig.parse("on,shadow=4:1")) + tracer.finalized = True + tracer.sampled_step = True + tracer.has_backend = False + root = _FakeMod() + tracer.mod_names = {id(root): "model"} + tracer._step_cycle = 0 + tracer._refresh_shadow_flag() + tracer._mark_step_wall_start() + + print("Running 10 synthetic optimizer steps (shadow cadence 4:1)…") + for step in range(10): + if not tracer.shadow_step: + tracer.log_module_stage("pre forward", root) + time.sleep(0.001) + tracer.log_module_stage("post forward", root) + tracer.post_step_hook(None, (), {}) + print(f" step {step + 1}: shadow={tracer.shadow_step}") + + print() + print("Query overhead (requires probing SQL engine in-process):") + print( + """ +SELECT + round((median(CASE WHEN is_shadow = 0 THEN step_duration_sec END) + / nullif(median(CASE WHEN is_shadow = 1 THEN step_duration_sec END), 0) - 1) * 100, 2) + AS hook_tax_pct, + sum(CASE WHEN is_shadow = 1 THEN 1 ELSE 0 END) AS shadow_n +FROM python.torch_step_timing +WHERE local_step > 0; +""".strip() + ) + + try: + import probing + + df = probing.query( + "SELECT is_shadow, sampled, step_duration_sec, sample_rate, sample_mode " + "FROM python.torch_step_timing ORDER BY local_step" + ) + print(df) + except Exception as exc: + print(f"(SQL query skipped: {exc})", file=sys.stderr) + print( + "Rows were still written if TorchStepTiming.save succeeded.", + file=sys.stderr, + ) + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/probing/core/resources/tables.yaml b/probing/core/resources/tables.yaml index 5d2fd93e..bcec8039 100644 --- a/probing/core/resources/tables.yaml +++ b/probing/core/resources/tables.yaml @@ -32,6 +32,30 @@ tables: - "第一个完整 step 为 discovery-only,可能无数据行" - "默认仅 forward hook;backward hook 默认关闭" + python.torch_step_timing: + description: "TorchProbe 每步墙钟耗时(含 shadow 基线 step),用于估算 profiling 开销" + synonyms: [torch overhead, shadow step, profiling overhead, 探针开销] + key_columns: + micro_step: "最细粒度步计数" + local_step: "本 rank 训练步" + global_step: "全局训练步" + micro_batches: "梯度累积因子" + rank: "torch.distributed rank" + world_size: "world size" + role: "并行角色键" + step_duration_sec: "本 step 墙钟耗时(秒),post_step_hook 结束到结束;probed step 含 flush" + is_shadow: "1=shadow 基线 step(TorchProbe hook 全跳过),0=正常 probed step" + sampled: "1=本 step 命中 TorchProbe 采样,0=未采样或 shadow" + shadow_normal: "记录时的 shadow 配置:每周期 probed step 数" + shadow_baseline: "记录时的 shadow 配置:每周期 baseline step 数" + sample_rate: "记录时的 TorchProbe step 级采样率" + sample_mode: "记录时的采样模式(恒为 random)" + notes: + - "默认 shadow=4:1:每 4 个 probed step 后 1 个 shadow step" + - "overhead ≈ median(probed) / median(shadow) - 1;与 python.torch_trace 独立" + global_name: global.python.torch_step_timing + federation_columns: [_host, _addr, _rank, _role] + python.comm_collective: description: "torch.distributed API 层集合通信记录(Python 墙钟计时,粗粒度回退;精准 NCCL 数据在 nccl.* 表)" synonyms: [collective, communication, 通信, all_reduce, torch.distributed] diff --git a/probing/core/src/core/engine.rs b/probing/core/src/core/engine.rs index 412af57f..168b732b 100644 --- a/probing/core/src/core/engine.rs +++ b/probing/core/src/core/engine.rs @@ -191,14 +191,11 @@ impl Engine { maps.insert(format!("probe.{namespace}"), data_source); } else if data_source.kind() == ProbeDataSourceKind::Table { // In DataFusion, schemas are used to implement namespaces - let schema = if catalog.schema_names().contains(&namespace) { - catalog.schema(namespace.as_str()) - } else { - let schema = MemorySchemaProvider::new(); - catalog.register_schema(namespace.as_str(), Arc::new(schema))?; - catalog.schema(namespace.as_str()) + if catalog.schema(namespace.as_str()).is_none() { + catalog + .register_schema(namespace.as_str(), Arc::new(MemorySchemaProvider::new()))?; } - .ok_or_else(|| { + let schema = catalog.schema(namespace.as_str()).ok_or_else(|| { DataFusionError::Internal(format!("namespace `{namespace}` not found")) })?; let state: SessionState = self.context.state(); diff --git a/probing/core/src/core/error.rs b/probing/core/src/core/error.rs index b14632e4..3e50f5d2 100644 --- a/probing/core/src/core/error.rs +++ b/probing/core/src/core/error.rs @@ -183,3 +183,36 @@ impl From for DataFusionError { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::runtime::RuntimeError; + + #[test] + fn constructors_preserve_variant() { + let e = EngineError::query("bad sql"); + assert!(matches!(e, EngineError::QueryError(_))); + assert!(e.to_string().contains("bad sql")); + } + + #[test] + fn runtime_variant_wraps_unavailable() { + let err = EngineError::Runtime(RuntimeError::Unavailable); + assert!(err.to_string().to_lowercase().contains("unavailable")); + } + + #[test] + fn datafusion_conversion_externalizes_non_df_errors() { + let err = EngineError::internal("boom"); + let df: DataFusionError = err.into(); + assert!(df.to_string().contains("boom")); + } + + #[test] + fn invalid_option_formats_name_and_detail() { + let err = EngineError::invalid_option("sample_rate", "must be <= 1"); + assert!(err.to_string().contains("sample_rate")); + assert!(err.to_string().contains("must be <= 1")); + } +} diff --git a/probing/core/src/core/memtable_sql.rs b/probing/core/src/core/memtable_sql.rs index 14413bda..17c3c9df 100644 --- a/probing/core/src/core/memtable_sql.rs +++ b/probing/core/src/core/memtable_sql.rs @@ -42,6 +42,7 @@ use datafusion::arrow::array::{ }; use datafusion::arrow::datatypes::{DataType, Field, Schema, SchemaRef}; use datafusion::catalog::CatalogProvider; +use datafusion::catalog::MemorySchemaProvider; use datafusion::catalog::SchemaProvider; use datafusion::catalog::Session; use datafusion::datasource::{TableProvider, TableType}; @@ -1006,13 +1007,22 @@ impl CatalogProvider for DynamicMmapCatalog { } fn schema(&self, name: &str) -> Option> { - let inner = self.inner.schema(name); let has_mmap = name == DEFAULT_UNDOTTED_SCHEMA || !tables_in_schema(name).is_empty(); - match (has_mmap, inner) { - (true, inner) => Some(Arc::new(MmapFileSchemaProvider::with_inner(name, inner))), - (false, Some(inner)) => Some(inner), - (false, None) => None, - } + if !has_mmap { + return self.inner.schema(name); + } + let inner = match self.inner.schema(name) { + Some(provider) => provider, + None => { + let mem: Arc = Arc::new(MemorySchemaProvider::new()); + let _ = self.inner.register_schema(name, Arc::clone(&mem)); + self.inner.schema(name).unwrap_or(mem) + } + }; + Some(Arc::new(MmapFileSchemaProvider::with_inner( + name, + Some(inner), + ))) } fn register_schema( @@ -1886,6 +1896,42 @@ mod tests { } } + #[test] + fn mmap_only_schema_allows_static_table_registration() { + let _lock = PROBING_DATA_DIR_LOCK.lock().unwrap(); + use datafusion::catalog::MemoryCatalogProvider; + use probing_memtable::discover::ExposedTable; + + let tmp = tempfile::tempdir().unwrap(); + let orig = std::env::var("PROBING_DATA_DIR").ok(); + std::env::set_var("PROBING_DATA_DIR", tmp.path()); + + let schema = MtSchema::new().col("ts", DType::I64); + let mut exposed = ExposedTable::create("gpu.utilization", &schema, 4096, 4).unwrap(); + exposed.push_row(&[Value::I64(1)]); + + let catalog = Arc::new(DynamicMmapCatalog { + inner: Arc::new(MemoryCatalogProvider::new()), + }); + assert!( + catalog.schema_names().iter().any(|n| n == "gpu"), + "mmap discovery should expose gpu schema" + ); + let gpu_schema = catalog.schema("gpu").expect("gpu schema provider"); + gpu_schema + .register_table( + "devices".to_string(), + Arc::new(PluginAdvancedTable::empty_sentinel("devices")), + ) + .expect("static gpu.devices table should register alongside mmap gpu.utilization"); + + drop(exposed); + match orig { + Some(v) => std::env::set_var("PROBING_DATA_DIR", v), + None => std::env::remove_var("PROBING_DATA_DIR"), + } + } + #[test] fn classify_and_mmap_roundtrip() { assert_eq!( diff --git a/probing/core/src/core/semantic_catalog.rs b/probing/core/src/core/semantic_catalog.rs index af843ee2..597dea95 100644 --- a/probing/core/src/core/semantic_catalog.rs +++ b/probing/core/src/core/semantic_catalog.rs @@ -424,13 +424,13 @@ pub fn install_semantic_catalog(context: &SessionContext) -> Result<()> { c }; - let schema: Arc = if let Some(schema) = catalog.schema(DOCS_SCHEMA) { - schema - } else { - let s: Arc = Arc::new(MemorySchemaProvider::new()); - catalog.register_schema(DOCS_SCHEMA, Arc::clone(&s))?; - s - }; + let mem: Arc = Arc::new(MemorySchemaProvider::new()); + if catalog.schema(DOCS_SCHEMA).is_none() { + catalog.register_schema(DOCS_SCHEMA, Arc::clone(&mem))?; + } + let schema = catalog + .schema(DOCS_SCHEMA) + .ok_or_else(|| DataFusionError::Internal(format!("schema `{DOCS_SCHEMA}` not found")))?; let table_batch = table_docs_batch(&parsed.table_rows)?; let column_batch = column_docs_batch(&parsed.column_rows)?; diff --git a/probing/core/src/runtime.rs b/probing/core/src/runtime.rs index e02f6fdd..2e82fab7 100644 --- a/probing/core/src/runtime.rs +++ b/probing/core/src/runtime.rs @@ -524,4 +524,17 @@ mod tests { fn core_runtime_starts_operational_in_tests() { assert!(runtime_operational()); } + + #[test] + fn block_on_fallback_result_is_err_not_ok() { + let out: Result = Result::on_block_on_failure(RuntimeError::Unavailable); + assert!(matches!(out, Err(RuntimeError::Unavailable))); + } + + #[test] + fn block_on_fallback_never_masks_runtime_error_in_display() { + let err = RuntimeError::Internal("bridge broken".into()); + let wrapped: Result<(), RuntimeError> = Result::on_block_on_failure(err); + assert!(wrapped.unwrap_err().to_string().contains("bridge broken")); + } } diff --git a/probing/crates/skills/Cargo.toml b/probing/crates/skills/Cargo.toml index 274bdc1b..8b62753b 100644 --- a/probing/crates/skills/Cargo.toml +++ b/probing/crates/skills/Cargo.toml @@ -16,3 +16,4 @@ async-trait = "0.1" [dev-dependencies] serde_yaml = "0.9" +tokio = { version = "1", features = ["rt", "macros"] } diff --git a/probing/crates/skills/src/backend.rs b/probing/crates/skills/src/backend.rs index 481003d6..4e75b50d 100644 --- a/probing/crates/skills/src/backend.rs +++ b/probing/crates/skills/src/backend.rs @@ -68,3 +68,44 @@ pub fn cluster_meta_note(meta: &ClusterQueryMeta) -> String { if meta.partial { " · PARTIAL" } else { "" } ) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_cluster_meta_marks_partial_on_failed_nodes() { + let meta = parse_cluster_meta(&serde_json::json!({ + "nodes_queried": 8, + "nodes_failed": ["rank-2"], + "peer_batches_dropped": 0, + "partial": false, + })); + assert!(meta.partial); + assert_eq!(meta.nodes_failed, vec!["rank-2".to_string()]); + } + + #[test] + fn parse_cluster_meta_honours_explicit_partial_flag() { + let meta = parse_cluster_meta(&serde_json::json!({ + "nodes_queried": 4, + "nodes_failed": [], + "peer_batches_dropped": 2, + "partial": true, + })); + assert!(meta.partial); + assert_eq!(meta.peer_batches_dropped, 2); + } + + #[test] + fn cluster_meta_note_includes_partial_marker() { + let note = cluster_meta_note(&ClusterQueryMeta { + partial: true, + nodes_queried: 2, + nodes_failed: vec!["a".into()], + peer_batches_dropped: 1, + }); + assert!(note.contains("PARTIAL")); + assert!(note.contains("2 nodes")); + } +} diff --git a/probing/crates/skills/src/lib.rs b/probing/crates/skills/src/lib.rs index 496c6940..c9d05587 100644 --- a/probing/crates/skills/src/lib.rs +++ b/probing/crates/skills/src/lib.rs @@ -22,6 +22,5 @@ pub use loader::{ }; pub use routing::match_skills; pub use runner::{ - execute_skill, list_skills_catalog, plan_skill, resolve_use_global, run_step, RunOptions, - RunResult, StepOutcome, + execute_skill, plan_skill, resolve_use_global, run_step, RunOptions, RunResult, StepOutcome, }; diff --git a/probing/crates/skills/src/runner.rs b/probing/crates/skills/src/runner.rs index f68b6025..6953ec26 100644 --- a/probing/crates/skills/src/runner.rs +++ b/probing/crates/skills/src/runner.rs @@ -80,14 +80,6 @@ pub struct RunResult { pub had_degraded: bool, } -pub fn list_skills_catalog() -> Result<()> { - use crate::loader::list_skill_ids; - for id in list_skill_ids() { - let _ = load_skill(&id)?; - } - Ok(()) -} - pub fn plan_skill(skill_id: &str, overrides: HashMap) -> Result { let pb = load_skill(skill_id).map_err(|e| SkillRunError(e.to_string()))?; let mut params = default_parameters(&pb); @@ -151,10 +143,20 @@ pub async fn resolve_use_global( pub async fn execute_skill( backend: &B, skill_id: &str, - mut overrides: HashMap, + overrides: HashMap, options: RunOptions, ) -> Result { let pb = load_skill(skill_id).map_err(|e| SkillRunError(e.to_string()))?; + execute_skill_pb(backend, pb, overrides, options).await +} + +/// Run a loaded skill (shared by [`execute_skill`] and unit tests). +pub async fn execute_skill_pb( + backend: &B, + pb: Skill, + mut overrides: HashMap, + options: RunOptions, +) -> Result { resolve_use_global(backend, &pb, &mut overrides).await; let ctx = build_context(&pb, &overrides); let mut outcomes = Vec::new(); @@ -540,3 +542,273 @@ pub fn run_result_to_json(result: &RunResult) -> serde_json::Value { }, }) } + +#[cfg(test)] +mod tests { + use std::collections::HashMap; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::Arc; + + use async_trait::async_trait; + use probing_proto::prelude::{DataFrame, Seq}; + + use super::*; + use crate::backend::ClusterQueryMeta; + use crate::loader::{InterpretRule, Skill, SkillParameter, SkillStep}; + + struct MockBackend { + peers: usize, + local_rows: usize, + cluster_partial: bool, + calls: Arc, + } + + impl MockBackend { + fn new(peers: usize, local_rows: usize) -> Self { + Self { + peers, + local_rows, + cluster_partial: false, + calls: Arc::new(AtomicUsize::new(0)), + } + } + + fn with_partial(mut self) -> Self { + self.cluster_partial = true; + self + } + + fn df(rows: usize) -> DataFrame { + if rows == 0 { + return DataFrame::default(); + } + DataFrame::new( + vec!["x".into()], + vec![Seq::SeqF64((0..rows as i64).map(|i| i as f64).collect())], + ) + } + } + + #[async_trait] + impl SkillBackend for MockBackend { + async fn query_local(&self, sql: &str) -> Result { + self.calls.fetch_add(1, Ordering::Relaxed); + if sql.contains("FAIL") { + return Err(SkillRunError("query failed".into())); + } + Ok(Self::df(self.local_rows)) + } + + async fn cluster_query(&self, sql: &str) -> Result<(DataFrame, Option)> { + self.calls.fetch_add(1, Ordering::Relaxed); + let meta = ClusterQueryMeta { + partial: self.cluster_partial, + nodes_queried: 4, + nodes_failed: if self.cluster_partial { + vec!["rank-3".into()] + } else { + vec![] + }, + peer_batches_dropped: if self.cluster_partial { 1 } else { 0 }, + }; + let _ = sql; + Ok((Self::df(self.local_rows), Some(meta))) + } + + async fn get(&self, path: &str) -> Result { + self.calls.fetch_add(1, Ordering::Relaxed); + Ok(format!("body:{path}")) + } + + async fn peer_count(&self) -> usize { + self.peers + } + } + + fn sample_step(id: &str, sql: &str) -> SkillStep { + SkillStep { + id: id.into(), + title: format!("title-{id}"), + step_type: "sql".into(), + sql: Some(sql.into()), + path: None, + view: None, + on_empty: "skip".into(), + empty_message: None, + when: None, + cluster: None, + } + } + + fn sample_skill(steps: Vec, interpretation: Vec) -> Skill { + Skill { + id: "test_skill".into(), + title: "Test".into(), + category: String::new(), + docs: String::new(), + tags: vec![], + keywords: vec![], + trigger_keywords: Default::default(), + parameters: vec![SkillParameter { + name: "use_global".into(), + default: serde_yaml::Value::Bool(true), + }], + steps, + interpretation, + summary_template: "rows={available_tables.row_count}".into(), + next_steps: vec![], + variables: HashMap::new(), + } + } + + #[tokio::test] + async fn run_step_sql_returns_rows() { + let backend = MockBackend::new(0, 3); + let step = sample_step("q", "SELECT 1"); + let outcome = run_step(&backend, &step, &HashMap::new(), &RunOptions::default()).await; + match outcome { + StepOutcome::Sql { row_count, .. } => assert_eq!(row_count, 3), + other => panic!("expected Sql, got {other:?}"), + } + } + + #[tokio::test] + async fn run_step_when_use_global_skips_without_flag() { + let backend = MockBackend::new(0, 1); + let mut step = sample_step("g", "SELECT 1 FROM global.nccl.coll_perf"); + step.when = Some("{use_global}".into()); + let ctx = HashMap::from([("use_global".into(), "false".into())]); + let outcome = run_step(&backend, &step, &ctx, &RunOptions::default()).await; + assert!(matches!(outcome, StepOutcome::Skipped { .. })); + assert_eq!(backend.calls.load(Ordering::Relaxed), 0); + } + + #[tokio::test] + async fn run_step_on_empty_abort_returns_error() { + let backend = MockBackend::new(0, 0); + let mut step = sample_step("empty", "SELECT 1"); + step.on_empty = "abort".into(); + step.empty_message = Some("no data".into()); + let outcome = run_step(&backend, &step, &HashMap::new(), &RunOptions::default()).await; + match outcome { + StepOutcome::Error { message, .. } => assert_eq!(message, "no data"), + other => panic!("expected Error, got {other:?}"), + } + } + + #[tokio::test] + async fn run_step_cluster_partial_sets_degraded() { + let backend = MockBackend::new(2, 2).with_partial(); + let mut step = sample_step("cluster", "SELECT 1 FROM global.nccl.coll_perf"); + step.cluster = Some(true); + let outcome = run_step(&backend, &step, &HashMap::new(), &RunOptions::default()).await; + match outcome { + StepOutcome::Sql { degraded, note, .. } => { + assert!(degraded); + assert!(note.as_ref().is_some_and(|n| n.contains("PARTIAL"))); + } + other => panic!("expected Sql, got {other:?}"), + } + } + + #[tokio::test] + async fn run_step_rejects_mutating_sql() { + let backend = MockBackend::new(0, 1); + let step = sample_step("bad", "SET probing.x=1"); + let outcome = run_step(&backend, &step, &HashMap::new(), &RunOptions::default()).await; + assert!(matches!(outcome, StepOutcome::Error { .. })); + } + + #[tokio::test] + async fn resolve_use_global_honors_override() { + let backend = MockBackend::new(4, 1); + let pb = sample_skill(vec![], vec![]); + let mut overrides = HashMap::from([("use_global".into(), "false".into())]); + resolve_use_global(&backend, &pb, &mut overrides).await; + assert_eq!( + overrides.get("use_global").map(String::as_str), + Some("false") + ); + } + + #[tokio::test] + async fn resolve_use_global_auto_when_peers_and_default_true() { + let backend = MockBackend::new(3, 1); + let pb = sample_skill(vec![], vec![]); + let mut overrides = HashMap::new(); + resolve_use_global(&backend, &pb, &mut overrides).await; + assert_eq!( + overrides.get("use_global").map(String::as_str), + Some("true") + ); + } + + #[tokio::test] + async fn execute_skill_pb_abort_stops_after_on_empty_abort() { + let backend = MockBackend::new(0, 0); + let mut first = sample_step("a", "SELECT 1"); + first.on_empty = "abort".into(); + let second = sample_step("b", "SELECT 2"); + let pb = sample_skill(vec![first, second], vec![]); + let result = execute_skill_pb(&backend, pb, HashMap::new(), RunOptions::default()) + .await + .unwrap(); + assert!(result.had_error); + assert_eq!(result.outcomes.len(), 1, "second step must not run"); + } + + #[tokio::test] + async fn execute_skill_pb_interpretation_and_summary() { + let backend = MockBackend::new(0, 0); + let mut step = sample_step("available_tables", "SELECT 1"); + step.on_empty = "warn".into(); + let rules = vec![InterpretRule { + id: "no_tables".into(), + when: "step:available_tables | rows == 0".into(), + severity: "error".into(), + message: "no tables".into(), + }]; + let pb = sample_skill(vec![step], rules); + let result = execute_skill_pb(&backend, pb, HashMap::new(), RunOptions::default()) + .await + .unwrap(); + assert_eq!(result.findings.len(), 1); + assert_eq!(result.findings[0].rule_id, "no_tables"); + assert!(result.summary.contains("rows=0")); + } + + #[tokio::test] + async fn execute_skill_pb_had_degraded_on_partial_fanout() { + let backend = MockBackend::new(0, 2).with_partial(); + let mut step = sample_step("cluster", "SELECT 1 FROM global.nccl.coll_perf"); + step.cluster = Some(true); + let pb = sample_skill(vec![step], vec![]); + let result = execute_skill_pb(&backend, pb, HashMap::new(), RunOptions::default()) + .await + .unwrap(); + assert!(result.had_degraded); + assert!(result + .findings + .iter() + .any(|f| f.rule_id == "cluster_partial_fanout")); + let json = run_result_to_json(&result); + assert_eq!(json["status"], "degraded"); + assert_eq!(json["data_quality"]["partial_cluster_fanout"], true); + } + + #[test] + fn outcome_to_json_maps_statuses() { + let skipped = outcome_to_json(&StepOutcome::Skipped { + step_id: "s".into(), + title: "t".into(), + reason: "r".into(), + }); + assert_eq!(skipped["status"], "skipped"); + let err = outcome_to_json(&StepOutcome::Error { + step_id: "e".into(), + title: "t".into(), + message: "m".into(), + }); + assert_eq!(err["status"], "error"); + } +} diff --git a/probing/extensions/nccl-profiler/README.md b/probing/extensions/nccl-profiler/README.md index bef84232..2fb180c3 100644 --- a/probing/extensions/nccl-profiler/README.md +++ b/probing/extensions/nccl-profiler/README.md @@ -154,6 +154,22 @@ lock-free atomics. - Skill `nccl_culprit_victim` in `skills/` — SQL rank wait summary, culprit/victim rankings, role-aligned view, `global.*` fan-out - Linked from `slow_rank` and `comm_bottleneck` when `nccl.proxy_ops` is present +## Benchmark (overhead) + +Two layers — synthetic callback micro-bench (no GPU) and end-to-end NCCL AllReduce: + +```bash +# Micro: per-op callback + mmap flush latency (Criterion) +make nccl-profiler-bench +# or: cargo bench -p probing-nccl-profiler --bench callback_path + +# E2E: baseline vs profiled under torchrun (Linux + CUDA) +make nccl-profiler-lib +./examples/run_nccl_profiler_bench.sh +``` + +Tune E2E with `NPROC`, `BENCH_ITERS`, `MSG_BYTES`. Disable watchdog noise during bench with `PROBING_NCCL_INFLIGHT_THRESHOLD_SECS=0` (the wrapper sets this). + ## Compatibility - Exports **`ncclProfiler_v4`** (NCCL 2.27+) and **`ncclProfiler_v3`** (NCCL 2.26); diff --git a/probing/extensions/nccl-profiler/benches/callback_path.rs b/probing/extensions/nccl-profiler/benches/callback_path.rs index a849e815..47c1d726 100644 --- a/probing/extensions/nccl-profiler/benches/callback_path.rs +++ b/probing/extensions/nccl-profiler/benches/callback_path.rs @@ -1,8 +1,11 @@ //! Criterion benchmarks for the NCCL callback hot path. //! -//! Run with `cargo bench -p probing-nccl-profiler`. The full callback-cycle -//! bench only runs on Linux (the plugin state machine is Linux-gated); the -//! clock and pool benches run everywhere. +//! ```text +//! cargo bench -p probing-nccl-profiler --bench callback_path +//! ``` +//! +//! Full callback-cycle benches run on Linux only; clock and pool benches run +//! everywhere. use criterion::{criterion_group, criterion_main, Criterion}; use std::hint::black_box; @@ -29,64 +32,220 @@ fn bench_pool(c: &mut Criterion) { } #[cfg(target_os = "linux")] -fn bench_callback_cycle(c: &mut Criterion) { +mod linux { + use criterion::{BenchmarkId, Criterion, Throughput}; + use probing_nccl_profiler::abi::profiler_v4::{ + NcclProfilerCollDescrV4, NcclProfilerEventBodyV4, NcclProfilerKernelChDescrV4, + }; use probing_nccl_profiler::abi::{ NcclProfilerCollDescr, NcclProfilerEventBodyV3, NcclProfilerEventDescrV3, - NcclProfilerProxyOpDescr, NCCL_PROFILE_COLL, NCCL_PROFILE_PROXY_OP, + NcclProfilerEventDescrV4, NcclProfilerProxyOpDescr, NCCL_PROFILE_COLL, + NCCL_PROFILE_KERNEL_CH, NCCL_PROFILE_PROXY_OP, NCCL_PROFILE_PROXY_STEP, + STATE_KERNEL_CH_STOP, STATE_PROXY_STEP_SEND_GPU_WAIT, STATE_PROXY_STEP_SEND_WAIT, }; - use probing_nccl_profiler::state::PluginState; + use probing_nccl_profiler::state::{CommInfo, PluginState, StateArgs}; use std::ffi::c_void; - let dir = tempfile::tempdir().unwrap(); - std::env::set_var("PROBING_DATA_DIR", dir.path()); - let state = PluginState::new(); - - let coll_descr = NcclProfilerEventDescrV3 { - type_: NCCL_PROFILE_COLL as u8, - parent_obj: std::ptr::null_mut(), - rank: 0, - body: NcclProfilerEventBodyV3 { - coll: { - let mut d: NcclProfilerCollDescr = unsafe { std::mem::zeroed() }; - d.comm_hash = 1; - d.seq_number = 1; - d.func = c"AllReduce".as_ptr(); - d.count = 1 << 20; - d.datatype = c"ncclFloat16".as_ptr(); - d.n_max_channels = 4; - d - }, - }, + const COMM: CommInfo = CommInfo { + comm_hash: 0xBEEF, + n_ranks: 8, }; - // coll start → proxy start → proxy stop → coll stop: one full op cycle, - // including the coll_perf row emit and the mmap append. - c.bench_function("coll_proxy_full_cycle", |b| { - b.iter(|| { - let mut coll_h: *mut c_void = std::ptr::null_mut(); - state.start_event(&mut coll_h, &coll_descr); - - let proxy_descr = NcclProfilerEventDescrV3 { - type_: NCCL_PROFILE_PROXY_OP as u8, - parent_obj: coll_h, - rank: 0, - body: NcclProfilerEventBodyV3 { - proxy_op: NcclProfilerProxyOpDescr { - pid: 0, - channel_id: 0, - peer: 1, - n_steps: 4, - chunk_size: 1024, - is_send: 1, - }, + fn v3_coll_descr() -> NcclProfilerEventDescrV3 { + NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_COLL as u8, + parent_obj: std::ptr::null_mut(), + rank: 0, + body: NcclProfilerEventBodyV3 { + coll: { + let mut d: NcclProfilerCollDescr = unsafe { std::mem::zeroed() }; + d.comm_hash = 1; + d.seq_number = 1; + d.func = c"AllReduce".as_ptr(); + d.count = 1 << 20; + d.datatype = c"ncclFloat16".as_ptr(); + d.n_max_channels = 4; + d }, - }; - let mut proxy_h: *mut c_void = std::ptr::null_mut(); - state.start_event(&mut proxy_h, &proxy_descr); - state.stop_event(proxy_h); - state.stop_event(coll_h); - }) - }); + }, + } + } + + fn v3_proxy_descr(parent: *mut c_void) -> NcclProfilerEventDescrV3 { + NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_PROXY_OP as u8, + parent_obj: parent, + rank: 0, + body: NcclProfilerEventBodyV3 { + proxy_op: NcclProfilerProxyOpDescr { + pid: 0, + channel_id: 0, + peer: 1, + n_steps: 4, + chunk_size: 1024, + is_send: 1, + }, + }, + } + } + + fn v4_coll_descr() -> NcclProfilerEventDescrV4 { + NcclProfilerEventDescrV4 { + type_: NCCL_PROFILE_COLL as u8, + parent_obj: std::ptr::null_mut(), + rank: 0, + body: NcclProfilerEventBodyV4 { + coll: { + let mut d: NcclProfilerCollDescrV4 = unsafe { std::mem::zeroed() }; + d.seq_number = 1; + d.func = c"AllReduce".as_ptr(); + d.count = 1 << 20; + d.datatype = c"ncclFloat16".as_ptr(); + d.n_channels = 4; + d + }, + }, + } + } + + fn run_v3_coll_proxy_cycle(state: &PluginState) { + let coll_descr = v3_coll_descr(); + let mut coll_h: *mut c_void = std::ptr::null_mut(); + state.start_event(&mut coll_h, &coll_descr); + + let proxy_descr = v3_proxy_descr(coll_h); + let mut proxy_h: *mut c_void = std::ptr::null_mut(); + state.start_event(&mut proxy_h, &proxy_descr); + state.stop_event(proxy_h); + state.stop_event(coll_h); + } + + fn run_v4_full_cycle(state: &PluginState) { + let coll_descr = v4_coll_descr(); + let mut coll_h: *mut c_void = std::ptr::null_mut(); + state.start_event_v4(&mut coll_h, &coll_descr, COMM); + + let proxy_descr = NcclProfilerEventDescrV4 { + type_: NCCL_PROFILE_PROXY_OP as u8, + parent_obj: coll_h, + rank: 0, + body: NcclProfilerEventBodyV4 { + proxy_op: NcclProfilerProxyOpDescr { + pid: 0, + channel_id: 0, + peer: 1, + n_steps: 2, + chunk_size: 1024, + is_send: 1, + }, + }, + }; + let mut proxy_h: *mut c_void = std::ptr::null_mut(); + state.start_event_v4(&mut proxy_h, &proxy_descr, COMM); + + // One proxy step with two state transitions + trans_size (v4). + let step_descr = NcclProfilerEventDescrV4 { + type_: NCCL_PROFILE_PROXY_STEP as u8, + parent_obj: proxy_h, + rank: 0, + body: NcclProfilerEventBodyV4 { + proxy_step: probing_nccl_profiler::abi::NcclProfilerProxyStepDescr { step: 0 }, + }, + }; + let mut step_h: *mut c_void = std::ptr::null_mut(); + state.start_event_v4(&mut step_h, &step_descr, COMM); + state.record_state(step_h, STATE_PROXY_STEP_SEND_GPU_WAIT, StateArgs::None); + state.record_state( + step_h, + STATE_PROXY_STEP_SEND_WAIT, + StateArgs::ProxyStepV4 { trans_size: 65536 }, + ); + state.stop_event(step_h); + + state.stop_event(proxy_h); + + // KernelCh with GPU timer (v4). + let kch_descr = NcclProfilerEventDescrV4 { + type_: NCCL_PROFILE_KERNEL_CH as u8, + parent_obj: coll_h, + rank: 0, + body: NcclProfilerEventBodyV4 { + kernel_ch: NcclProfilerKernelChDescrV4 { + channel_id: 0, + p_timer: 1_000_000, + }, + }, + }; + let mut kch_h: *mut c_void = std::ptr::null_mut(); + state.start_event_v4(&mut kch_h, &kch_descr, COMM); + state.record_state( + kch_h, + STATE_KERNEL_CH_STOP, + StateArgs::KernelChStop { p_timer: 2_500_000 }, + ); + state.stop_event(kch_h); + + state.stop_event(coll_h); + } + + pub fn bench_callback_cycles(c: &mut Criterion) { + let dir = tempfile::tempdir().unwrap(); + std::env::set_var("PROBING_DATA_DIR", dir.path()); + std::env::set_var("PROBING_NCCL_INFLIGHT_THRESHOLD_SECS", "0"); + let state = PluginState::new(); + + let mut group = c.benchmark_group("callback_cycle"); + group.throughput(Throughput::Elements(1)); + + group.bench_function(BenchmarkId::new("v3", "coll_proxy"), |b| { + b.iter(|| run_v3_coll_proxy_cycle(&state)); + }); + + group.bench_function(BenchmarkId::new("v4", "coll_proxy_step_kch"), |b| { + b.iter(|| run_v4_full_cycle(&state)); + }); + + group.finish(); + } + + pub fn bench_record_state(c: &mut Criterion) { + let dir = tempfile::tempdir().unwrap(); + std::env::set_var("PROBING_DATA_DIR", dir.path()); + let state = PluginState::new(); + + let coll_descr = v3_coll_descr(); + let mut coll_h: *mut c_void = std::ptr::null_mut(); + state.start_event(&mut coll_h, &coll_descr); + let proxy_descr = v3_proxy_descr(coll_h); + let mut proxy_h: *mut c_void = std::ptr::null_mut(); + state.start_event(&mut proxy_h, &proxy_descr); + let step_descr = NcclProfilerEventDescrV3 { + type_: NCCL_PROFILE_PROXY_STEP as u8, + parent_obj: proxy_h, + rank: 0, + body: NcclProfilerEventBodyV3 { + proxy_step: probing_nccl_profiler::abi::NcclProfilerProxyStepDescr { step: 0 }, + }, + }; + let mut step_h: *mut c_void = std::ptr::null_mut(); + state.start_event(&mut step_h, &step_descr); + + c.bench_function("record_state_proxy_step", |b| { + b.iter(|| { + state.record_state(step_h, STATE_PROXY_STEP_SEND_GPU_WAIT, StateArgs::None); + }); + }); + + state.stop_event(step_h); + state.stop_event(proxy_h); + state.stop_event(coll_h); + } +} + +#[cfg(target_os = "linux")] +fn bench_callback_cycle(c: &mut Criterion) { + linux::bench_callback_cycles(c); + linux::bench_record_state(c); } #[cfg(not(target_os = "linux"))] diff --git a/probing/extensions/nccl-profiler/src/pool_pressure.rs b/probing/extensions/nccl-profiler/src/pool_pressure.rs index 47e12872..0cb51397 100644 --- a/probing/extensions/nccl-profiler/src/pool_pressure.rs +++ b/probing/extensions/nccl-profiler/src/pool_pressure.rs @@ -44,3 +44,46 @@ pub fn maybe_warn_pool_usage(pool: &str, usage_pct: u8) { pub fn check_pool_usage(pool: &str, slot_pool: &SlotPool) { maybe_warn_pool_usage(pool, slot_pool.usage_pct()); } + +#[cfg(test)] +mod tests { + use super::*; + use crate::pool::{SlotPool, INVALID_IDX}; + + #[derive(Debug)] + struct X { + idx: u32, + } + + impl Indexed for X { + fn set_self_idx(&mut self, idx: u32) { + self.idx = idx; + } + fn self_idx(&self) -> u32 { + self.idx + } + } + + #[test] + fn maybe_warn_pool_usage_ignores_below_threshold() { + LAST_USAGE_WARN_NS.store(0, Ordering::Relaxed); + maybe_warn_pool_usage("coll", 79); + // No panic; debounce state unchanged when below 80%. + assert_eq!(LAST_USAGE_WARN_NS.load(Ordering::Relaxed), 0); + } + + #[test] + fn debounce_suppresses_back_to_back_warnings() { + LAST_EXHAUST_WARN_NS.store(0, Ordering::Relaxed); + assert!(debounce(&LAST_EXHAUST_WARN_NS)); + assert!(!debounce(&LAST_EXHAUST_WARN_NS)); + } + + #[test] + fn check_pool_usage_reads_live_ratio() { + let mut pool = SlotPool::with_capacity(4); + let _ = pool.alloc(|| X { idx: INVALID_IDX }); + check_pool_usage("coll", &pool); + assert_eq!(pool.usage_pct(), 25); + } +} diff --git a/probing/extensions/nccl-profiler/src/state.rs b/probing/extensions/nccl-profiler/src/state.rs index 91f51c67..f437fbd4 100644 --- a/probing/extensions/nccl-profiler/src/state.rs +++ b/probing/extensions/nccl-profiler/src/state.rs @@ -1350,4 +1350,154 @@ mod tests { assert_eq!(ctx.comm_hash, 42); assert_eq!(ctx.n_ranks, -1, "v3 cannot know the communicator size"); } + + #[test] + fn v4_step_trans_bytes_only_from_proxy_step_v4_args() { + use crate::abi::{STATE_PROXY_STEP_RECV_GPU_WAIT, STATE_PROXY_STEP_SEND_WAIT}; + use crate::events::ProxyStepSlot; + use crate::pool_config::PoolLimits; + + let counters = EventCounters::new(); + let limits = PoolLimits { + coll: 4, + proxy_op: 4, + proxy_step: 4, + kernel_ch: 4, + net: 4, + }; + let mut pools = Pools::new(limits); + let mut op_h: *mut c_void = std::ptr::null_mut(); + pools.start_event( + &mut op_h, + ParsedEvent::ProxyOp { + parent_obj: std::ptr::null_mut(), + rank: 0, + channel_id: 0, + peer: 1, + n_steps: 1, + is_send: 1, + }, + &counters, + 0, + ); + let mut st_h: *mut c_void = std::ptr::null_mut(); + pools.start_event( + &mut st_h, + ParsedEvent::ProxyStep { + parent_obj: op_h, + step: 0, + }, + &counters, + 0, + ); + + // Stale trans_size on a non-authoritative state must not be recorded + // (plugin only forwards ProxyStepV4 on SendWait / RecvFlushWait). + pools.record_state(st_h, STATE_PROXY_STEP_RECV_GPU_WAIT, StateArgs::None); + let idx = unsafe { pools.step_pool.index_of(st_h as *mut ProxyStepSlot) }.unwrap(); + assert_eq!( + pools.step_pool.get_mut(idx).unwrap().step.trans_bytes, + 0, + "RecvGpuWait must not carry trans_size" + ); + + pools.record_state( + st_h, + STATE_PROXY_STEP_SEND_WAIT, + StateArgs::ProxyStepV4 { trans_size: 4096 }, + ); + assert_eq!(pools.step_pool.get_mut(idx).unwrap().step.trans_bytes, 4096); + } + + #[test] + fn v3_proxy_op_zero_trans_size_does_not_clobber() { + use crate::events::ProxyOpSlot; + + let counters = EventCounters::new(); + let limits = PoolLimits { + coll: 4, + proxy_op: 4, + proxy_step: 4, + kernel_ch: 4, + net: 4, + }; + let mut pools = Pools::new(limits); + let mut op_h: *mut c_void = std::ptr::null_mut(); + pools.start_event( + &mut op_h, + ParsedEvent::ProxyOp { + parent_obj: std::ptr::null_mut(), + rank: 0, + channel_id: 0, + peer: 1, + n_steps: 2, + is_send: 1, + }, + &counters, + 0, + ); + pools.record_state( + op_h, + crate::abi::STATE_PROXY_OP_IN_PROGRESS_V4, + StateArgs::ProxyOpV3 { + trans_size: 8192, + steps: 2, + }, + ); + pools.record_state( + op_h, + crate::abi::STATE_PROXY_OP_IN_PROGRESS_V4, + StateArgs::ProxyOpV3 { + trans_size: 0, + steps: 0, + }, + ); + let idx = unsafe { pools.proxy_pool.index_of(op_h as *mut ProxyOpSlot) }.unwrap(); + assert_eq!(pools.proxy_pool.get_mut(idx).unwrap().op.trans_bytes, 8192); + } + + #[test] + fn collect_inflight_drains_pending_proxy_for_stale_coll() { + use crate::pool_config::PoolLimits; + + let counters = EventCounters::new(); + let limits = PoolLimits { + coll: 4, + proxy_op: 4, + proxy_step: 4, + kernel_ch: 4, + net: 4, + }; + let mut pools = Pools::new(limits); + let mut coll_h: *mut c_void = std::ptr::null_mut(); + pools.start_event( + &mut coll_h, + ParsedEvent::Coll { + ctx: CollContext { + rank: 2, + comm_hash: 11, + ..Default::default() + }, + meta: CollPerfMeta { + msg_bytes: 1024, + ..Default::default() + }, + }, + &counters, + 0, + ); + let coll_idx = unsafe { pools.coll_pool.index_of(coll_h as *mut CollSlot) }.unwrap(); + { + let coll = pools.coll_pool.get_mut(coll_idx).unwrap(); + coll.start_ns = 1; + let mut row = CompletedProxyOp::default(); + row.trans_bytes = 999; + assert!(coll.push_pending(row)); + } + + let (_rows, batch) = pools.collect_inflight(1_000_000); + assert_eq!(batch.proxy_ops.len(), 1); + assert_eq!(batch.proxy_ops[0].trans_bytes, 999); + assert_eq!(pools.coll_pool.get_mut(coll_idx).unwrap().pending_len, 0); + } } diff --git a/probing/extensions/python/src/extensions/python.rs b/probing/extensions/python/src/extensions/python.rs index 0fd911b3..82c52fe1 100644 --- a/probing/extensions/python/src/extensions/python.rs +++ b/probing/extensions/python/src/extensions/python.rs @@ -315,7 +315,13 @@ fn call_python_handler( .call1((str_to_py(py, &path), params_dict, body_arg)) .py_context("Failed to call handle_request")?; - let result_str: String = result.extract().py_context("Failed to extract result")?; + let result_str: String = match result.extract() { + Ok(s) => s, + Err(_) => result + .extract::>() + .map(|bytes| String::from_utf8_lossy(&bytes).into_owned()) + .py_context("Failed to extract handler result")?, + }; Ok(result_str.into_bytes()) }) diff --git a/probing/extensions/python/src/extensions/python/tbls.rs b/probing/extensions/python/src/extensions/python/tbls.rs index 0b89d212..b42f2352 100644 --- a/probing/extensions/python/src/extensions/python/tbls.rs +++ b/probing/extensions/python/src/extensions/python/tbls.rs @@ -28,6 +28,8 @@ pub enum PythonTableError { MissingColumn(String), #[error("record batch build failed: {0}")] BatchBuild(String), + #[error("backtrace capture failed")] + Backtrace(#[source] anyhow::Error), #[error(transparent)] Py(#[from] pyo3::PyErr), #[error(transparent)] @@ -51,8 +53,8 @@ pub struct PythonNamespace {} impl PythonNamespace { fn get_backtrace_data() -> TableResult> { - let frames = crate::extensions::python::backtrace(None) - .map_err(|e| PythonTableError::BatchBuild(e.to_string()))?; + let frames = + crate::extensions::python::backtrace(None).map_err(PythonTableError::Backtrace)?; if frames.is_empty() { return Ok(vec![]); @@ -197,6 +199,12 @@ impl CustomNamespace for PythonNamespace { if expr == "backtrace" { match Self::get_backtrace_data() { Ok(batches) => batches, + Err(PythonTableError::Backtrace(ref source)) + if crate::features::stack_tracer::is_backtrace_busy(source) => + { + debug!("python.backtrace skipped: {source}"); + vec![] + } Err(e) => { error!("Error getting backtrace data: {e:?}"); vec![] diff --git a/probing/extensions/python/src/features/flamegraph.rs b/probing/extensions/python/src/features/flamegraph.rs index 3b95e348..bbfa95c4 100644 --- a/probing/extensions/python/src/features/flamegraph.rs +++ b/probing/extensions/python/src/features/flamegraph.rs @@ -540,7 +540,7 @@ const TORCH_MODULE_JS: &str = r##" function labelFor(f) { if (f.d >= 2 && f.modulePath) return f.modulePath; - if (f.d === 1) return f.name === "forward" ? "Forward pass" : f.name === "step" ? "Optimizer step" : f.name; + if (f.d === 1) return f.name === "forward" ? "Forward pass" : f.name === "backward" ? "Backward pass" : f.name === "step" ? "Optimizer step" : f.name; return f.name; } @@ -558,7 +558,7 @@ const TORCH_MODULE_JS: &str = r##" btn.type = "button"; btn.className = "torch-phase-btn" + (phaseFilter === p ? " active" : ""); btn.dataset.phase = p; - btn.textContent = p === "all" ? "All phases" : p === "forward" ? "Forward" : p === "step" ? "Optimizer" : p; + btn.textContent = p === "all" ? "All phases" : p === "forward" ? "Forward" : p === "backward" ? "Backward" : p === "step" ? "Optimizer" : p; btn.addEventListener("click", () => { phaseFilter = p; if (p !== "all") { diff --git a/probing/extensions/python/src/features/python_api.rs b/probing/extensions/python/src/features/python_api.rs index 7dfaa477..5d9545ed 100644 --- a/probing/extensions/python/src/features/python_api.rs +++ b/probing/extensions/python/src/features/python_api.rs @@ -1,3 +1,5 @@ +use std::panic::{catch_unwind, AssertUnwindSafe}; + use pyo3::prelude::*; use probing_cli::cli_main as cli_main_impl; @@ -6,9 +8,17 @@ use probing_core::ENGINE; use crate::features::native_bridge::with_detached_native; use crate::features::py_result::runtime_err; -use crate::features::stack_tracer::{SignalTracer, StackTracer}; +use crate::features::stack_tracer::{is_backtrace_busy, SignalTracer, StackTracer}; use crate::repl::PythonRepl; +fn callstack_error_json(message: &str) -> String { + serde_json::json!({ + "error": message, + "frames": [], + }) + .to_string() +} + #[pyfunction] pub fn should_enable_probing() -> bool { crate::python::should_enable_probing() @@ -35,12 +45,27 @@ pub fn query_json(_py: Python, sql: String) -> PyResult { } /// HTTP `GET /apis/pythonext/callstack` backend. +/// +/// Always returns JSON (never raises into Python) so concurrent stack capture +/// cannot take down the training process via PyO3 exception propagation. #[pyfunction] #[pyo3(signature = (tid=None))] pub fn api_callstack(tid: Option) -> PyResult { - let tid = tid.filter(|&t| t != 0); - let frames = SignalTracer.trace(tid).map_err(runtime_err)?; - serde_json::to_string(&frames).map_err(runtime_err) + let payload = catch_unwind(AssertUnwindSafe(|| { + let tid = tid.filter(|&t| t != 0); + match SignalTracer.trace(tid) { + Ok(frames) => match serde_json::to_string(&frames) { + Ok(json) => json, + Err(e) => callstack_error_json(&format!("failed to encode callstack: {e}")), + }, + Err(e) if is_backtrace_busy(&e) => callstack_error_json("callstack capture busy"), + Err(e) => callstack_error_json(&e.to_string()), + } + })); + Ok(match payload { + Ok(json) => json, + Err(_) => callstack_error_json("callstack capture panicked"), + }) } /// HTTP `POST /apis/pythonext/eval` backend. diff --git a/probing/extensions/python/src/features/spy/call.rs b/probing/extensions/python/src/features/spy/call.rs index f745c146..4e90f92a 100644 --- a/probing/extensions/python/src/features/spy/call.rs +++ b/probing/extensions/python/src/features/spy/call.rs @@ -305,24 +305,51 @@ fn parse_lineno(code: *const T, lasti: i32) -> i32 { } fn copy_string(addr: *const u8, len: usize, kind: u32, ascii: bool) -> String { - let len = if len > 1024 { 1024 } else { len }; + if addr.is_null() || len == 0 { + return String::new(); + } + let len = len.min(1024); match (kind, ascii) { - (4, _) => { - let chars = unsafe { std::slice::from_raw_parts(addr as *const char, len / 4) }; - chars.iter().collect() - } - (2, _) => { - let chars = unsafe { std::slice::from_raw_parts(addr as *const u16, len / 2) }; - String::from_utf16(chars).unwrap_or_default() + (4, _) if len >= 4 => { + let units = unsafe { std::slice::from_raw_parts(addr as *const u32, len / 4) }; + units.iter().copied().filter_map(char::from_u32).collect() } - (1, true) => { - let slice = unsafe { std::slice::from_raw_parts(addr, len) }; - String::from_utf8_lossy(slice).to_string() + (2, _) if len >= 2 => { + let units = unsafe { std::slice::from_raw_parts(addr as *const u16, len / 2) }; + String::from_utf16_lossy(units) } - (1, false) => { + (1, _) => { let slice = unsafe { std::slice::from_raw_parts(addr, len) }; - String::from_utf8_lossy(slice).to_string() + String::from_utf8_lossy(slice).into_owned() } _ => String::new(), } } + +#[cfg(test)] +mod tests { + use super::copy_string; + + #[test] + fn copy_string_accepts_invalid_utf8_latin1() { + let data = [b'h', b'i', 0x93, b'!']; + assert_eq!( + copy_string(data.as_ptr(), data.len(), 1, false), + "hi\u{fffd}!" + ); + } + + #[test] + fn copy_string_accepts_invalid_utf16() { + let data: [u16; 2] = [0x0061, 0xD800]; + let bytes = data.as_ptr() as *const u8; + assert_eq!(copy_string(bytes, data.len() * 2, 2, false), "a\u{fffd}"); + } + + #[test] + fn copy_string_skips_invalid_utf32_scalars() { + let data: [u32; 3] = [0x0061, 0x0011_0000, 0x0062]; + let bytes = data.as_ptr() as *const u8; + assert_eq!(copy_string(bytes, data.len() * 4, 4, false), "ab"); + } +} diff --git a/probing/extensions/python/src/features/stack_tracer.rs b/probing/extensions/python/src/features/stack_tracer.rs index 62a7480d..d559b2e7 100644 --- a/probing/extensions/python/src/features/stack_tracer.rs +++ b/probing/extensions/python/src/features/stack_tracer.rs @@ -19,6 +19,14 @@ use probing_core::signal::send_sigusr2_to_thread_id; use crate::features::vm_tracer::{get_python_frames_raw, get_python_stacks_raw}; +#[derive(Debug, thiserror::Error)] +#[error("backtrace capture busy: {0}")] +pub(crate) struct BacktraceBusy(String); + +pub(crate) fn is_backtrace_busy(err: &anyhow::Error) -> bool { + err.downcast_ref::().is_some() +} + fn demangle_native_symbol(raw_name: &str) -> (String, Option<&'static str>) { if let Ok(d) = rustc_demangle::try_demangle(raw_name) { return (d.to_string(), Some("rust")); @@ -191,8 +199,9 @@ impl SignalTracer { // state — the outer `trace()` already downgrades it to an empty result — // so log at debug to avoid flooding training output with errors. let _guard = BACKTRACE_MUTEX.try_lock().map_err(|e| { - log::debug!("backtrace capture busy, skipping concurrent request: {e}"); - anyhow::anyhow!("backtrace capture busy: {e}") + let busy = BacktraceBusy(e.to_string()); + log::debug!("{busy}; skipping concurrent request"); + anyhow::Error::new(busy) })?; let (tx, rx) = mpsc::channel::>(); @@ -288,7 +297,11 @@ impl StackTracer for SignalTracer { match catch_unwind(AssertUnwindSafe(|| Self::trace_thread_signal(target))) { Ok(Ok(frames)) => Ok(frames), Ok(Err(err)) => { - log::warn!("Cross-thread stack trace failed for tid {target}: {err}"); + if is_backtrace_busy(&err) { + log::debug!("Cross-thread stack trace skipped for tid {target}: {err}"); + } else { + log::warn!("Cross-thread stack trace failed for tid {target}: {err}"); + } Err(err) } Err(_) => { diff --git a/probing/extensions/python/src/features/torch.rs b/probing/extensions/python/src/features/torch.rs index da69a1f2..4010e50d 100644 --- a/probing/extensions/python/src/features/torch.rs +++ b/probing/extensions/python/src/features/torch.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, collections::HashMap, thread}; +use std::{collections::BTreeMap, collections::HashMap, collections::HashSet, thread}; use anyhow::{Context, Result}; use log::{error, warn}; @@ -63,7 +63,7 @@ struct Frame { /// Recent training steps included in flamegraph aggregates (matches Training page window). const TORCH_RECENT_STEP_FILTER: &str = - "local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 99, 1)"; + "local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 99, 0)"; /// Raw post-hook duration rows for Rust-side median aggregation. const TORCH_DURATION_ROWS_QUERY: &str = r#" @@ -108,7 +108,7 @@ const TORCH_DELTA_JOIN_QUERY: &str = r#" ) WHERE post.module <> 'None' AND (CAST(post.allocated AS DOUBLE) - CAST(pre.allocated AS DOUBLE)) > 0 - AND post.local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 99, 1) + AND post.local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 99, 0) "#; /// Legacy rows without delta columns: SQL join on pre/post peak allocated. @@ -126,12 +126,12 @@ const TORCH_PEAK_JOIN_QUERY: &str = r#" ) WHERE post.module <> 'None' AND (CAST(post.max_allocated AS DOUBLE) - CAST(pre.max_allocated AS DOUBLE)) > 0 - AND post.local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 99, 1) + AND post.local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM python.torch_trace), 0) - 99, 0) "#; /// Map stored hook labels to flamegraph phase names. fn normalize_post_stage(stage: &str) -> Option<&'static str> { - match stage { + match stage.trim() { "post forward" => Some("forward"), "post backward" => Some("backward"), "post step" => Some("step"), @@ -139,6 +139,99 @@ fn normalize_post_stage(stage: &str) -> Option<&'static str> { } } +fn is_leaf_module(module: &str, all_modules: &HashSet) -> bool { + !all_modules + .iter() + .any(|other| other != module && other.starts_with(&format!("{module}."))) +} + +fn backward_module_names(rows: &[(String, String, f64)]) -> HashSet { + rows.iter() + .filter_map(|(module, stage, _)| { + normalize_post_stage(stage) + .filter(|p| *p == "backward") + .map(|_| module.clone()) + }) + .collect() +} + +fn filter_backward_leaf_rows(rows: Vec<(String, String, f64)>) -> Vec<(String, String, f64)> { + let backward_names = backward_module_names(&rows); + if backward_names.is_empty() { + return rows; + } + rows.into_iter() + .filter(|(module, stage, _)| { + normalize_post_stage(stage) != Some("backward") + || is_leaf_module(module, &backward_names) + }) + .collect() +} + +/// Build backward folded lines from SQL rows (leaf modules + parent self-time adjustment). +fn build_backward_folded_lines( + data: &probing_proto::types::DataFrame, + duration_col: usize, + to_units: fn(f64) -> u64, +) -> Vec { + let module_idx = data.names.iter().position(|n| n == "module").unwrap_or(0); + let stage_idx = data.names.iter().position(|n| n == "stage").unwrap_or(1); + let mut grouped: HashMap> = HashMap::new(); + let rows = data.cols.first().map(|c| c.len()).unwrap_or(0); + for row in 0..rows { + let module = data + .cols + .get(module_idx) + .map(|c| parse_text_col(&c.get(row))) + .unwrap_or_default(); + let stage = data + .cols + .get(stage_idx) + .map(|c| parse_text_col(&c.get(row))) + .unwrap_or_default(); + if !stage.contains("backward") { + continue; + } + let value = data + .cols + .get(duration_col) + .map(|c| parse_value_col(&c.get(row))) + .unwrap_or(0.0); + if value > 0.0 { + grouped.entry(module).or_default().push(value); + } + } + let backward_names: HashSet = grouped.keys().cloned().collect(); + let rows = grouped + .into_iter() + .filter(|(module, _)| is_leaf_module(module, &backward_names)) + .map(|(module, values)| (module, "post backward".to_string(), median_f64(&values))) + .filter(|(_, _, v)| *v > 0.0); + build_folded_lines(rows, to_units, false) +} + +fn ensure_backward_phase_lines( + data: &probing_proto::types::DataFrame, + duration_col: usize, + lines: &mut Vec, +) { + if lines.iter().any(|l| l.starts_with("backward;")) { + return; + } + let direct = build_backward_folded_lines(data, duration_col, value_to_ns); + if !direct.is_empty() { + warn!( + "torch flamegraph: recovered {} backward line(s) via direct path", + direct.len() + ); + } + if direct.is_empty() { + warn!("torch flamegraph: no backward lines — check python.torch_trace post backward duration>0"); + return; + } + lines.extend(direct); +} + fn value_to_ns(seconds: f64) -> u64 { (seconds * 1_000_000_000.0).round() as u64 } @@ -156,6 +249,7 @@ fn build_folded_lines( to_units: fn(f64) -> u64, clamp_non_negative: bool, ) -> Vec { + let rows = filter_backward_leaf_rows(rows.into_iter().collect()); let mut frames = BTreeMap::::default(); for (module, stage, raw_value) in rows { @@ -270,6 +364,9 @@ fn parse_value_col(ele: &probing_proto::types::Ele) -> f64 { match ele { probing_proto::types::Ele::F32(x) => *x as f64, probing_proto::types::Ele::F64(x) => *x, + probing_proto::types::Ele::I64(x) => *x as f64, + probing_proto::types::Ele::I32(x) => *x as f64, + probing_proto::types::Ele::Text(s) => s.parse::().unwrap_or(0.0), _ => 0.0, } } @@ -494,7 +591,9 @@ fn query_profiling(metric: TorchMetric) -> Result { let post_query = torch_rows_query(TORCH_DURATION_ROWS_QUERY); let data = run_torch_query(&post_query)?; let duration_col = data.names.iter().position(|n| n == "duration").unwrap_or(2); - let lines = build_median_lines_from_post_rows(&data, duration_col, value_to_ns, false); + let mut lines = + build_median_lines_from_post_rows(&data, duration_col, value_to_ns, false); + ensure_backward_phase_lines(&data, duration_col, &mut lines); Ok(ProfilingResult { lines, subtitle: metric.subtitle().to_string(), @@ -505,6 +604,27 @@ fn query_profiling(metric: TorchMetric) -> Result { } } +fn torch_flamegraph_subtitle(metric: TorchMetric, lines: &[String]) -> String { + let base = metric.subtitle().to_string(); + let has_forward = lines.iter().any(|l| l.starts_with("forward;")); + let has_backward = lines.iter().any(|l| l.starts_with("backward;")); + let has_step = lines.iter().any(|l| l.starts_with("step;")); + let mut parts = vec![base]; + if has_forward && !has_backward { + parts.push( + "No backward in flamegraph — need post backward with duration>0 (pre rows are ignored); use backward=on and rebuild probing if post.duration is 0" + .to_string(), + ); + } + if has_forward && !has_step { + parts.push( + "No optimizer step samples in window (re-probe after fix, or check torch_trace post step rows)" + .to_string(), + ); + } + parts.join(" · ") +} + fn torch_flamegraph_options(metric: TorchMetric, subtitle: &str) -> FlamegraphOptions { FlamegraphOptions { title: "Module performance".to_string(), @@ -527,11 +647,11 @@ pub fn flamegraph() -> String { return empty_torch_html("No torch profiling samples collected"); } + let subtitle = torch_flamegraph_subtitle(TorchMetric::Duration, &result.lines); match Flamegraph::from_folded_lines(&result.lines) { - Some(fg) => fg.render_html(&torch_flamegraph_options( - TorchMetric::Duration, - &result.subtitle, - )), + Some(fg) => { + fg.render_html(&torch_flamegraph_options(TorchMetric::Duration, &subtitle)) + } None => empty_torch_html("No torch profiling samples collected"), } } @@ -564,7 +684,8 @@ pub fn flamegraph_json(metric: Option<&str>) -> String { empty("Torch profiling data unavailable", metric.subtitle()) } Ok(result) => { - let opts = torch_flamegraph_options(metric, &result.subtitle); + let subtitle = torch_flamegraph_subtitle(metric, &result.lines); + let opts = torch_flamegraph_options(metric, &subtitle); if result.lines.is_empty() { warn!("Torch profiling returned no samples; skipping flamegraph generation"); let msg = match metric { @@ -591,10 +712,25 @@ mod tests { #[test] fn normalize_post_stage_maps_hook_labels() { assert_eq!(normalize_post_stage("post forward"), Some("forward")); + assert_eq!(normalize_post_stage("post backward"), Some("backward")); assert_eq!(normalize_post_stage("post step"), Some("step")); assert_eq!(normalize_post_stage("pre forward"), None); } + #[test] + fn torch_flamegraph_subtitle_warns_when_backward_missing() { + let lines = vec!["forward;layer; 10000000".to_string()]; + let subtitle = torch_flamegraph_subtitle(TorchMetric::Duration, &lines); + assert!(subtitle.contains("backward=on")); + let with_back = vec![ + "forward;layer; 10000000".to_string(), + "backward;layer; 2000000".to_string(), + "step;SGD; 500000".to_string(), + ]; + let ok = torch_flamegraph_subtitle(TorchMetric::Duration, &with_back); + assert!(!ok.contains("No backward")); + } + #[test] fn build_folded_lines_uses_phase_and_module_hierarchy() { let lines = build_folded_lines( @@ -636,6 +772,62 @@ mod tests { assert!(lines.is_empty()); } + #[test] + fn build_backward_folded_lines_from_dataframe() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec!["module".into(), "stage".into(), "duration".into()], + vec![ + Seq::SeqText(vec!["AlexNet".into(), "features.0".into()]), + Seq::SeqText(vec!["post backward".into(), "post backward".into()]), + Seq::SeqF64(vec![0.012, 0.004]), + ], + ); + let lines = build_backward_folded_lines(&df, 2, value_to_ns); + assert!(lines.iter().any(|l| l.starts_with("backward;AlexNet;"))); + assert!(lines.iter().any(|l| l.starts_with("backward;features;0;"))); + } + + #[test] + fn ensure_backward_phase_lines_recover_when_main_path_empty() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec!["module".into(), "stage".into(), "duration".into()], + vec![ + Seq::SeqText(vec!["AlexNet".into()]), + Seq::SeqText(vec!["post backward".into()]), + Seq::SeqF64(vec![0.01]), + ], + ); + let mut lines = Vec::new(); + ensure_backward_phase_lines(&df, 2, &mut lines); + assert!(lines.iter().any(|l| l.starts_with("backward;"))); + } + + #[test] + fn build_folded_lines_includes_post_backward_phase() { + let lines = build_folded_lines( + [ + ("AlexNet".to_string(), "post backward".to_string(), 0.012), + ( + "AlexNet.features.0".to_string(), + "post backward".to_string(), + 0.004, + ), + ("AlexNet".to_string(), "post forward".to_string(), 0.040), + ("SGD".to_string(), "post step".to_string(), 0.008), + ], + value_to_ns, + false, + ); + assert!(lines.iter().any(|l| l.starts_with("backward;"))); + assert!(lines.iter().any(|l| l.starts_with("forward;"))); + assert!(lines.iter().any(|l| l.starts_with("step;"))); + assert!(Flamegraph::from_folded_lines(&lines).is_some()); + } + #[test] fn build_folded_lines_separates_forward_and_step_phases() { let lines = build_folded_lines( @@ -713,6 +905,7 @@ mod tests { let q = torch_rows_query(TORCH_DURATION_ROWS_QUERY); assert!(q.contains("local_step >=")); assert!(q.contains("max(local_step)")); + assert!(q.contains("- 99, 0)"), "step 0 must remain queryable: {q}"); assert!(q.contains("module <> 'None'")); } @@ -724,10 +917,10 @@ mod tests { } #[test] - fn duration_query_uses_minimal_columns_for_legacy_mmap() { + fn duration_query_uses_post_rows_only() { assert!(TORCH_DURATION_ROWS_QUERY.contains("duration")); - assert!(!TORCH_DURATION_ROWS_QUERY.contains("allocated_delta")); - assert!(!TORCH_DURATION_ROWS_QUERY.contains("max_allocated_delta")); + assert!(TORCH_DURATION_ROWS_QUERY.contains("post %")); + assert!(!TORCH_DURATION_ROWS_QUERY.contains("LEFT JOIN")); } #[test] diff --git a/probing/extensions/python/src/features/tracing.rs b/probing/extensions/python/src/features/tracing.rs index f27556a5..095862ef 100644 --- a/probing/extensions/python/src/features/tracing.rs +++ b/probing/extensions/python/src/features/tracing.rs @@ -133,6 +133,12 @@ fn push_span_hint(span: &Span) { fn pop_span_hint(span_id: u64) { SPAN_HINT_STACK.with(|stack| { let mut stack = stack.borrow_mut(); + if let Some(top) = stack.last() { + if top.span_id == span_id { + stack.pop(); + return; + } + } if let Some(pos) = stack.iter().rposition(|h| h.span_id == span_id) { stack.remove(pos); } @@ -391,6 +397,18 @@ impl Span { SPAN_STACK.with(|stack| { let mut stack = stack.borrow_mut(); + if let Some(top) = stack.last() { + let top_matches = Python::attach(|py| { + top.bind(py) + .cast::() + .ok() + .is_some_and(|span| span.borrow().span_id() == self_id) + }); + if top_matches { + stack.pop(); + return; + } + } if let Some(pos) = stack.iter().rposition(|obj| { Python::attach(|py| { obj.bind(py) @@ -459,7 +477,11 @@ fn active_span_by_phase(py: Python, phase: String) -> PyResult> for obj in stack.iter().rev() { let bound = obj.bind(py); if let Ok(span) = bound.cast::() { - if span.borrow().phase().as_deref() == Some(phase.as_str()) { + let borrowed = span.borrow(); + if borrowed.is_ended() { + continue; + } + if borrowed.phase().as_deref() == Some(phase.as_str()) { return Ok(Some(obj.clone_ref(py))); } } diff --git a/probing/extensions/python/src/features/vm_tracer.rs b/probing/extensions/python/src/features/vm_tracer.rs index d614d7aa..8f84d1a3 100644 --- a/probing/extensions/python/src/features/vm_tracer.rs +++ b/probing/extensions/python/src/features/vm_tracer.rs @@ -183,14 +183,14 @@ pub fn get_python_stacks_raw() -> Vec { .stacks .iter() .rev() - .map(|location| { - let location = location.resolve().unwrap_or_default(); - CallFrame::PyFrame { + .filter_map(|location| { + let location = location.resolve().ok()?; + Some(CallFrame::PyFrame { file: location.callee.file, func: location.callee.name, lineno: location.callee.line as i64, locals: Default::default(), - } + }) }) .collect::>() }) diff --git a/probing/memtable/src/docs.rs b/probing/memtable/src/docs.rs index 0abbd221..b5d5929a 100644 --- a/probing/memtable/src/docs.rs +++ b/probing/memtable/src/docs.rs @@ -30,8 +30,10 @@ fn qualified_key(table_schema: &str, table_name: &str) -> String { /// Infer memtable dtype for a documented extern column from its name alone. pub fn infer_extern_column_dtype(name: &str) -> DType { match name { - "timestamp" => DType::I64, - "duration" | "duration_ms" => DType::F64, + "timestamp" | "time" => DType::I64, + "duration" | "duration_ms" | "step_duration_sec" | "sample_rate" => DType::F64, + "trace_id" | "span_id" | "parent_id" | "thread_id" => DType::I64, + "is_shadow" | "sampled" | "shadow_normal" | "shadow_baseline" => DType::I64, "allocated" | "max_allocated" | "cached" @@ -45,6 +47,9 @@ pub fn infer_extern_column_dtype(name: &str) -> DType { | "mem_used_pct" | "gpu_util_pct" | "rss_kb" | "thread_count" | "cpu_total_pct" => { DType::I64 } + _ if name.starts_with("is_") => DType::I64, + _ if name.ends_with("_sec") || name.ends_with("_rate") => DType::F64, + _ if name.ends_with("_id") => DType::I64, _ => DType::Str, } } @@ -166,7 +171,13 @@ mod tests { #[test] fn infer_extern_column_dtype_maps_duration_ms_to_f64() { assert_eq!(infer_extern_column_dtype("duration_ms"), DType::F64); + assert_eq!(infer_extern_column_dtype("step_duration_sec"), DType::F64); + assert_eq!(infer_extern_column_dtype("sample_rate"), DType::F64); assert_eq!(infer_extern_column_dtype("rank"), DType::I64); + assert_eq!(infer_extern_column_dtype("is_shadow"), DType::I64); + assert_eq!(infer_extern_column_dtype("sampled"), DType::I64); + assert_eq!(infer_extern_column_dtype("time"), DType::I64); + assert_eq!(infer_extern_column_dtype("trace_id"), DType::I64); assert_eq!(infer_extern_column_dtype("op"), DType::Str); } diff --git a/probing/server/src/engine.rs b/probing/server/src/engine.rs index 03b17374..45925729 100644 --- a/probing/server/src/engine.rs +++ b/probing/server/src/engine.rs @@ -138,12 +138,22 @@ pub async fn handle_query(request: Query) -> Result { Ok(Some(dataframe)) => Ok(QueryDataFormat::DataFrame(dataframe)), Ok(None) => Ok(QueryDataFormat::Nil), Err(e) => { - log::error!("Error executing SELECT query '{expr}': {e}"); + if is_missing_table_error(&e) { + log::debug!("Optional table missing for SELECT '{expr}': {e}"); + } else { + log::error!("Error executing SELECT query '{expr}': {e}"); + } Err(e.into()) } } } +/// Extension tables (NCCL profiler, optional GPU, etc.) may be absent on single-process jobs. +fn is_missing_table_error(err: &impl std::fmt::Display) -> bool { + let msg = err.to_string().to_ascii_lowercase(); + msg.contains("not found") && msg.contains("table") +} + fn fanout_meta_from_stats( stats: probing_core::core::federation::FanoutStats, ) -> Option { diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index 9004a1f9..fbd27210 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -16,7 +16,7 @@ SELECT s.attributes, s.name, s.time AS start_time, - CAST((e.time - s.time) / 1000 AS DOUBLE) AS duration_us + CAST((CAST(e.time AS BIGINT) - CAST(s.time AS BIGINT)) / 1000 AS DOUBLE) AS duration_us FROM python.trace_event s JOIN python.trace_event e ON s.span_id = e.span_id AND e.record_type = 'span_end' diff --git a/python/probing/bundled_skills/gpu_pressure/steps.yaml b/python/probing/bundled_skills/gpu_pressure/steps.yaml index 1b07643d..49509b3d 100644 --- a/python/probing/bundled_skills/gpu_pressure/steps.yaml +++ b/python/probing/bundled_skills/gpu_pressure/steps.yaml @@ -54,13 +54,13 @@ spec: type: sql sql: | SELECT - step, + local_step, max(allocated) AS torch_allocated_mb, max(cached) AS torch_cached_mb FROM python.torch_trace - WHERE step >= (SELECT max(step) - 5 FROM python.torch_trace) - GROUP BY step - ORDER BY step DESC + WHERE local_step >= (SELECT max(local_step) - 5 FROM python.torch_trace) + GROUP BY local_step + ORDER BY local_step DESC on_empty: skip empty_message: "无 torch_trace — MPS/CUDA allocated 仅在 torch profiling 开启时有" diff --git a/python/probing/bundled_skills/health_overview/steps.yaml b/python/probing/bundled_skills/health_overview/steps.yaml index f413e492..e7d43713 100644 --- a/python/probing/bundled_skills/health_overview/steps.yaml +++ b/python/probing/bundled_skills/health_overview/steps.yaml @@ -61,11 +61,30 @@ spec: title: "最近训练 step (torch_trace)" type: sql sql: | - SELECT max(step) AS latest_step, count(*) AS trace_rows + SELECT max(local_step) AS latest_step, count(*) AS trace_rows FROM python.torch_trace on_empty: skip empty_message: "python.torch_trace 无数据 — 设置 probing.torch.profiling=on" + - id: torch_probe_overhead + title: "TorchProbe 运行时开销 (shadow step)" + type: sql + sql: | + SELECT + round((median(CASE WHEN CAST(is_shadow AS BIGINT) = 0 THEN CAST(step_duration_sec AS DOUBLE) END) + / nullif(median(CASE WHEN CAST(is_shadow AS BIGINT) = 1 THEN CAST(step_duration_sec AS DOUBLE) END), 0) - 1) * 100, 2) + AS hook_tax_pct, + round((median(CASE WHEN CAST(is_shadow AS BIGINT) = 0 AND CAST(sampled AS BIGINT) = 1 THEN CAST(step_duration_sec AS DOUBLE) END) + / nullif(median(CASE WHEN CAST(is_shadow AS BIGINT) = 1 THEN CAST(step_duration_sec AS DOUBLE) END), 0) - 1) * 100, 2) + AS sampled_overhead_pct, + sum(CASE WHEN CAST(is_shadow AS BIGINT) = 0 THEN 1 ELSE 0 END) AS probed_n, + sum(CASE WHEN CAST(is_shadow AS BIGINT) = 1 THEN 1 ELSE 0 END) AS shadow_n, + max(CAST(shadow_baseline AS BIGINT)) AS shadow_baseline + FROM python.torch_step_timing + WHERE local_step > 1 + on_empty: skip + empty_message: "python.torch_step_timing 无数据 — 设置 probing.torch.profiling=on 并等待 shadow 周期" + - id: cluster_nodes title: "集群节点" type: sql @@ -128,10 +147,26 @@ spec: severity: info message: "Torch 训练 trace 活跃,最新 step = {latest_step}" + - id: torch_shadow_disabled + when: "step:torch_probe_overhead | column:shadow_baseline | value == 0" + severity: info + message: "TorchProbe shadow 基线已关闭 (shadow=off) — 无法估算运行时开销" + + - id: torch_overhead_high + when: "step:torch_probe_overhead | column:hook_tax_pct | value > 5" + severity: warning + message: "TorchProbe hook 开销约 {hook_tax_pct}%(相对 shadow step 中位数)" + + - id: torch_overhead_low_samples + when: "step:torch_probe_overhead | column:shadow_n | value < 3" + severity: info + message: "Shadow 基线样本不足 — 开销估算仅供参考 (shadow_n={shadow_n})" + summary_template: | ## 健康概览 - 可用表: {available_tables.row_count} 张 - 最新训练 step: {latest_torch_step.latest_step} + - TorchProbe hook 开销: {torch_probe_overhead.hook_tax_pct}% (shadow_n={torch_probe_overhead.shadow_n}) - 集群节点: {cluster_nodes.row_count} 个(0 表示单机) - NCCL 完整性: 见 nccl_data_integrity(pool_exhausted / ring 覆写) diff --git a/python/probing/bundled_skills/memory_leak/steps.yaml b/python/probing/bundled_skills/memory_leak/steps.yaml index f12fc20c..2af89bba 100644 --- a/python/probing/bundled_skills/memory_leak/steps.yaml +++ b/python/probing/bundled_skills/memory_leak/steps.yaml @@ -32,14 +32,14 @@ spec: type: sql sql: | SELECT - step, + local_step, max(allocated) AS peak_mb, max(max_allocated) AS peak_max_mb, max(allocated_delta) AS max_delta_mb FROM python.torch_trace - WHERE step > {step_skip} - GROUP BY step - ORDER BY step + WHERE local_step > {step_skip} + GROUP BY local_step + ORDER BY local_step on_empty: abort empty_message: "python.torch_trace 无数据 — 开启 probing.torch.profiling=on" @@ -48,22 +48,22 @@ spec: type: sql sql: | WITH per_step AS ( - SELECT step, max(allocated) AS peak_mb + SELECT local_step, max(allocated) AS peak_mb FROM python.torch_trace - WHERE step > {step_skip} - GROUP BY step + WHERE local_step > {step_skip} + GROUP BY local_step ), deltas AS ( SELECT - step, + local_step, peak_mb, - peak_mb - lag(peak_mb) OVER (ORDER BY step) AS growth_mb + peak_mb - lag(peak_mb) OVER (ORDER BY local_step) AS growth_mb FROM per_step ) - SELECT step, peak_mb, growth_mb + SELECT local_step, peak_mb, growth_mb FROM deltas WHERE growth_mb IS NOT NULL - ORDER BY step + ORDER BY local_step on_empty: skip - id: monotonic_growth_steps @@ -71,25 +71,25 @@ spec: type: sql sql: | WITH per_step AS ( - SELECT step, max(allocated) AS peak_mb + SELECT local_step, max(allocated) AS peak_mb FROM python.torch_trace - WHERE step > {step_skip} - GROUP BY step + WHERE local_step > {step_skip} + GROUP BY local_step ), flagged AS ( SELECT - step, + local_step, peak_mb, CASE - WHEN peak_mb > lag(peak_mb) OVER (ORDER BY step) THEN 1 + WHEN peak_mb > lag(peak_mb) OVER (ORDER BY local_step) THEN 1 ELSE 0 END AS increased FROM per_step ) - SELECT step, peak_mb, increased + SELECT local_step, peak_mb, increased FROM flagged WHERE increased = 1 - ORDER BY step + ORDER BY local_step on_empty: skip - id: top_memory_modules @@ -103,7 +103,7 @@ spec: max(allocated_delta) AS max_delta_mb, count(*) AS samples FROM python.torch_trace - WHERE step > {step_skip} + WHERE local_step > {step_skip} AND allocated_delta > 0 GROUP BY module, stage ORDER BY avg_delta_mb DESC diff --git a/python/probing/bundled_skills/module_bottleneck/steps.yaml b/python/probing/bundled_skills/module_bottleneck/steps.yaml index 4c5fce73..a07b1926 100644 --- a/python/probing/bundled_skills/module_bottleneck/steps.yaml +++ b/python/probing/bundled_skills/module_bottleneck/steps.yaml @@ -43,7 +43,7 @@ spec: sum(duration) AS total_sec, sum(duration) * 100.0 / sum(sum(duration)) OVER () AS pct_time FROM python.torch_trace - WHERE step > (SELECT max(step) - {recent_steps} FROM python.torch_trace) + WHERE local_step > (SELECT max(local_step) - {recent_steps} FROM python.torch_trace) AND stage = '{stage_filter}' GROUP BY module, stage ORDER BY total_sec DESC @@ -56,13 +56,13 @@ spec: type: sql sql: | SELECT - step, + local_step, sum(CASE WHEN stage = 'post forward' THEN duration ELSE 0 END) AS forward_sec, sum(CASE WHEN stage = 'post step' THEN duration ELSE 0 END) AS optim_sec FROM python.torch_trace - WHERE step > (SELECT max(step) - {recent_steps} FROM python.torch_trace) - GROUP BY step - ORDER BY step + WHERE local_step > (SELECT max(local_step) - {recent_steps} FROM python.torch_trace) + GROUP BY local_step + ORDER BY local_step on_empty: skip - id: step_regression @@ -70,18 +70,18 @@ spec: type: sql sql: | WITH per_step AS ( - SELECT step, sum(duration) AS total_sec + SELECT local_step, sum(duration) AS total_sec FROM python.torch_trace - WHERE step > (SELECT max(step) - {recent_steps} FROM python.torch_trace) + WHERE local_step > (SELECT max(local_step) - {recent_steps} FROM python.torch_trace) AND stage = '{stage_filter}' - GROUP BY step + GROUP BY local_step ) SELECT - step, + local_step, total_sec, - total_sec - lag(total_sec) OVER (ORDER BY step) AS delta_sec + total_sec - lag(total_sec) OVER (ORDER BY local_step) AS delta_sec FROM per_step - ORDER BY step + ORDER BY local_step on_empty: skip - id: enable_torch_flamegraph diff --git a/python/probing/core/table.py b/python/probing/core/table.py index 856117f0..d66d14aa 100644 --- a/python/probing/core/table.py +++ b/python/probing/core/table.py @@ -141,15 +141,21 @@ def init_table(): cache[cls] = table return table + # ``dataclasses.astuple`` recurses and *deep-copies* every field; these + # records are flat scalars, so read them directly. This is on the hot + # per-row trace path (one call per emitted module/step row). + def _row(obj): + return tuple(getattr(obj, f) for f in fields) + @classmethod def append(cls, self): table = cache[cls] - table.append(dataclasses.astuple(self)) + table.append(_row(self)) @classmethod def append_many(cls, self): table = cache[cls] - table.append_many([dataclasses.astuple(i) for i in self]) + table.append_many([_row(i) for i in self]) @classmethod def take(cls, n): @@ -163,6 +169,8 @@ def drop(cls): probing.ExternalTable.drop(table_name) def save(self): + if cls not in cache: + cls.init_table() cls.append(self) setattr(cls, "init_table", init_table) diff --git a/python/probing/crash.py b/python/probing/crash.py index f9fa320f..6d4ce32c 100644 --- a/python/probing/crash.py +++ b/python/probing/crash.py @@ -12,39 +12,26 @@ from typing import Callable, Optional, Type from probing._core import crash_enabled, record_crash +from probing.util.env import FALSE_VALUES, TRUE_VALUES, parse_bool_flag _INSTALLED = False _PREV_EXCEPTHOOK: Optional[Callable] = None _PREV_THREAD_EXCEPTHOOK: Optional[Callable] = None -_TRUE = {"1", "true", "yes", "on", "enable", "enabled"} -_FALSE = {"0", "false", "no", "off", "disable", "disabled"} - - -def _flag(value: Optional[str]) -> Optional[bool]: - if value is None: - return None - normalized = str(value).strip().lower() - if normalized in _TRUE: - return True - if normalized in _FALSE: - return False - return None - def _flight_recorder_on_watchdog_enabled() -> bool: try: import probing - explicit = _flag(probing.config.get_str("probing.fr.on_watchdog")) + explicit = parse_bool_flag(probing.config.get_str("probing.fr.on_watchdog")) if explicit is not None: return explicit except Exception: explicit = None raw = os.environ.get("PROBING_FR_ON_WATCHDOG", "auto").strip().lower() - if raw in _FALSE: + if raw in FALSE_VALUES: return False - if raw in _TRUE or raw == "on": + if raw in TRUE_VALUES or raw == "on": return True return raw == "auto" diff --git a/python/probing/ext/megatron.py b/python/probing/ext/megatron.py index f251e1a7..40c43ec9 100644 --- a/python/probing/ext/megatron.py +++ b/python/probing/ext/megatron.py @@ -18,10 +18,9 @@ import probing -logger = logging.getLogger(__name__) +from probing.util.env import FALSE_VALUES, TRUE_VALUES, parse_bool_flag -_TRUE = {"1", "true", "yes", "on", "enable", "enabled"} -_FALSE = {"0", "false", "no", "off", "disable", "disabled"} +logger = logging.getLogger(__name__) _PARALLEL_STATE_INIT = False _TRAINING_INIT = False @@ -40,19 +39,8 @@ ) -def _flag(value: Optional[str]) -> Optional[bool]: - if value is None: - return None - normalized = str(value).strip().lower() - if normalized in _TRUE: - return True - if normalized in _FALSE: - return False - return None - - def _config_flag(name: str) -> Optional[bool]: - return _flag(probing.config.get_str(name)) + return parse_bool_flag(probing.config.get_str(name)) def megatron_job_detected() -> bool: @@ -68,9 +56,9 @@ def megatron_autostart_enabled() -> bool: if explicit is not None: return explicit raw = os.environ.get("PROBING_MEGATRON", "auto").strip().lower() - if raw in _FALSE: + if raw in FALSE_VALUES: return False - if raw in _TRUE or raw == "on": + if raw in TRUE_VALUES or raw == "on": return True return megatron_job_detected() @@ -80,9 +68,9 @@ def step_sync_enabled() -> bool: if explicit is not None: return explicit raw = os.environ.get("PROBING_MEGATRON_STEP_SYNC", "auto").strip().lower() - if raw in _FALSE: + if raw in FALSE_VALUES: return False - if raw in _TRUE or raw == "on": + if raw in TRUE_VALUES or raw == "on": return True return megatron_autostart_enabled() diff --git a/python/probing/ext/torch.py b/python/probing/ext/torch.py index c6ef5186..46fc0648 100644 --- a/python/probing/ext/torch.py +++ b/python/probing/ext/torch.py @@ -1,10 +1,28 @@ import logging +import os +from typing import Optional import probing hooks = {} +def _torch_profiling_spec() -> Optional[str]: + """Resolve torch profiling spec from config, falling back to the env var. + + ``sync_env_settings()`` applies ``PROBING_TORCH_PROFILING`` asynchronously; + the first ``optimizer.step()`` can run before that finishes. Reading the env + here avoids creating a tracer without ``backward=on`` (and other flags). + """ + spec = probing.config.get_str("probing.torch.profiling") + if spec is not None and str(spec).strip(): + return str(spec).strip() + env = os.environ.get("PROBING_TORCH_PROFILING", "").strip() + if env: + probing.config.set("probing.torch.profiling", env) + return env or None + + def is_true(value): if value in ["TRUE", "True", "true", "1", "YES", "Yes", "yes", "ON", "On", "on"]: return True @@ -22,8 +40,7 @@ def optimizer_step_post_hook(optimizer, *args, **kwargs): from probing.profiling.torch.module_utils import get_toplevel_module from probing.profiling.torch_probe import TorchProbe, TorchProbeConfig - spec = probing.config.get_str("probing.torch.profiling") - + spec = _torch_profiling_spec() config = TorchProbeConfig.parse(spec) if not config.enabled: logging.getLogger(__name__).info( @@ -35,9 +52,12 @@ def optimizer_step_post_hook(optimizer, *args, **kwargs): tracer = TorchProbe(config=config) logging.getLogger(__name__).info( - "Torch profiling enabled: mode=%s rate=%s tracepy=%s sync=%s exprs=%s", + "Torch profiling enabled: mode=%s rate=%s shadow=%s:%s backward=%s tracepy=%s sync=%s exprs=%s", config.mode, config.rate, + config.shadow_normal, + config.shadow_baseline if config.shadow_enabled else 0, + config.backward, config.tracepy, config.sync, config.exprs or "", @@ -45,8 +65,8 @@ def optimizer_step_post_hook(optimizer, *args, **kwargs): models = get_toplevel_module() for model in models: - install_hooks(model, tracer=tracer) - install_hooks(opt=optimizer, tracer=tracer) + install_hooks(model, tracer=tracer, backward=config.backward) + install_hooks(opt=optimizer, tracer=tracer, backward=config.backward) hooks[optimizer] = tracer diff --git a/python/probing/handlers/pythonext.py b/python/probing/handlers/pythonext.py index 61f7a23b..4167460b 100644 --- a/python/probing/handlers/pythonext.py +++ b/python/probing/handlers/pythonext.py @@ -16,12 +16,13 @@ @ext_handler("pythonext", "callstack") def get_callstack(tid: Optional[int] = None, mode: Optional[str] = None) -> str: """Return merged native/Python call stack as JSON.""" - import sys - import probing._core as core _ = mode # reserved for future py/cpp/mixed filtering - return core.api_callstack(tid) + try: + return core.api_callstack(tid) + except Exception as e: + return json.dumps({"error": str(e), "frames": []}) @ext_handler("pythonext", "eval", uses_body=True) diff --git a/python/probing/parallel.py b/python/probing/parallel.py index a314a8c6..f52a79e9 100644 --- a/python/probing/parallel.py +++ b/python/probing/parallel.py @@ -77,6 +77,11 @@ def parallel_fields() -> Dict[str, int]: return {k: v for k, v in parallel_topology().as_dict().items() if v >= 0} +def reset_parallel_fields_cache() -> None: + """Drop cached topology (tests; no-op when fields are read fresh).""" + return None + + # Parallel-role dimensions: canonical short name -> candidate env vars (priority # order). Register a new dimension here (e.g. expert/context parallel) and it is # picked up everywhere — no table schema change, because the role is encoded as a diff --git a/python/probing/profiling/collective/config.py b/python/probing/profiling/collective/config.py index d618c719..d5759555 100644 --- a/python/probing/profiling/collective/config.py +++ b/python/probing/profiling/collective/config.py @@ -9,24 +9,12 @@ import probing +from probing.util.env import parse_bool_flag + from .record import CommRecordMode logger = logging.getLogger(__name__) -_TRUE = {"1", "true", "yes", "on", "enable", "enabled"} -_FALSE = {"0", "false", "no", "off", "disable", "disabled"} - - -def _flag(value: Optional[str]) -> Optional[bool]: - if value is None: - return None - normalized = str(value).strip().lower() - if normalized in _TRUE: - return True - if normalized in _FALSE: - return False - return None - def _parse_mode(raw: Optional[str]) -> CommRecordMode: if raw is None: @@ -76,7 +64,9 @@ def collective_tracing_enabled() -> bool: the same collectives twice with conflicting timing semantics. 3. Otherwise, default on for multi-rank torch jobs (coarse fallback). """ - explicit = _flag(probing.config.get_str("probing.torch.collective.enable")) + explicit = parse_bool_flag( + probing.config.get_str("probing.torch.collective.enable") + ) if explicit is not None: return explicit if nccl_profiler_plugin_active(): @@ -101,14 +91,24 @@ class CollectiveTraceConfig: def collective_trace_config() -> CollectiveTraceConfig: - verbose = _flag(probing.config.get_str("probing.torch.collective.verbose")) or False - cuda_sync = _flag(probing.config.get_str("probing.torch.collective.sync")) or False + verbose = ( + parse_bool_flag(probing.config.get_str("probing.torch.collective.verbose")) + or False + ) + cuda_sync = ( + parse_bool_flag(probing.config.get_str("probing.torch.collective.sync")) + or False + ) trace_file = probing.config.get_str("probing.torch.collective.trace_file") if trace_file is not None and not str(trace_file).strip(): trace_file = None mode = _parse_mode(probing.config.get_str("probing.torch.collective.mode")) - resolve = _flag(probing.config.get_str("probing.torch.collective.resolve_ranks")) - trace_event = _flag(probing.config.get_str("probing.torch.collective.trace_event")) + resolve = parse_bool_flag( + probing.config.get_str("probing.torch.collective.resolve_ranks") + ) + trace_event = parse_bool_flag( + probing.config.get_str("probing.torch.collective.trace_event") + ) if trace_event is None: trace_event = True return CollectiveTraceConfig( diff --git a/python/probing/profiling/torch/__init__.py b/python/probing/profiling/torch/__init__.py index f2e800c5..7dab9844 100644 --- a/python/probing/profiling/torch/__init__.py +++ b/python/probing/profiling/torch/__init__.py @@ -21,7 +21,7 @@ import torch from ..types import BaseTracer -from .module_utils import module_analysis, module_get_fullname, module_name +from .module_utils import module_analysis, module_name __all__ = ["install_hooks", "uninstall_hooks"] @@ -36,7 +36,12 @@ def install_hooks( tracer: BaseTracer = None, backward: bool = False, ): - """Attach profiler hooks. ``backward`` is off by default for autograd safety.""" + """Attach profiler hooks. ``backward`` is off by default for autograd safety. + + When ``backward`` is enabled on :class:`~probing.profiling.torch_probe.TorchProbe`, + backward timing uses output-tensor ``register_hook`` in ``post_forward_hook`` + (not module backward hooks, which break with inplace activations). + """ if tracer is None: return @@ -47,15 +52,9 @@ def install_hooks( module_analysis(m) h1 = m.register_forward_pre_hook(tracer.pre_forward_hook) h2 = m.register_forward_hook(tracer.post_forward_hook) - module_fullname = module_get_fullname(m) - if backward and not module_fullname.endswith("FusedScaleMaskSoftmax"): - h3 = m.register_full_backward_pre_hook(tracer.pre_backward_hook) - h4 = m.register_full_backward_hook(tracer.post_backward_hook) - HOOK_CACHE[id(m)] = (h1, h2, h3, h4) - else: - HOOK_CACHE[id(m)] = (h1, h2) + HOOK_CACHE[id(m)] = (h1, h2) for s in m.children(): - install_hooks(s, tracer=tracer) + install_hooks(s, tracer=tracer, backward=backward) if opt is not None: module_name(opt, opt.__class__.__name__) diff --git a/python/probing/profiling/torch/module_utils.py b/python/probing/profiling/torch/module_utils.py index caf51998..4ee19b14 100644 --- a/python/probing/profiling/torch/module_utils.py +++ b/python/probing/profiling/torch/module_utils.py @@ -39,13 +39,14 @@ def wrapper(*args, **kwargs): def module_analysis(m, prefix=""): if not isinstance(m, torch.nn.Module): return - # Register root module name (e.g. "AlexNet", "features", "classifier") - root_name = module_get_fullname(m).split(".")[-1] if prefix == "" else prefix - module_name(m, root_name) + # Root uses its class name (e.g. "AlexNet"); children are prefixed with the + # *root-qualified* path ("AlexNet.features", "AlexNet.features.0", …). Without + # the root prefix, containers become flamegraph siblings of the root instead + # of nesting under it, so their durations get added and inflate the phase. + fallback = prefix if prefix else module_get_fullname(m).split(".")[-1] + name = module_name(m, fallback) for n, s in m.named_children(): - name = f"{prefix}.{n}" if prefix != "" else n - module_name(s, name) - module_analysis(s, name) + module_analysis(s, f"{name}.{n}") def _cache(func): @@ -82,10 +83,16 @@ def module_is_container(m): def get_toplevel_module(): import gc + import warnings import torch - objs = [obj for obj in gc.get_objects() if isinstance(obj, torch.nn.Module)] + # A full gc sweep touches unrelated deprecated torch globals (e.g. + # ``torch.distributed.reduce_op``) whose access emits a FutureWarning. That + # noise is not about our modules — silence it just for this scan. + with warnings.catch_warnings(): + warnings.simplefilter("ignore", FutureWarning) + objs = [obj for obj in gc.get_objects() if isinstance(obj, torch.nn.Module)] is_child = set() for obj in objs: for child in obj.children(): diff --git a/python/probing/profiling/torch_probe.py b/python/probing/profiling/torch_probe.py index 86796489..9cd6be0b 100644 --- a/python/probing/profiling/torch_probe.py +++ b/python/probing/profiling/torch_probe.py @@ -1,8 +1,8 @@ +import hashlib import logging -import random import time from dataclasses import dataclass -from typing import Optional +from typing import Any, Optional import probing @@ -12,15 +12,82 @@ from probing.tracing import span, step from probing.tracing.coordinates import row_fields from probing.tracing.phases import OPTIMIZER, infer_from_stage, is_training_phase +from probing.util.env import FALSE_VALUES, TRUE_VALUES -from .torch.module_utils import module_name from .types import BaseTracer -TRUE_VALUES = {"1", "true", "yes", "on", "enable", "enabled"} -FALSE_VALUES = {"0", "false", "no", "off", "disable", "disabled"} +def _stable_unit_float(*parts) -> float: + """Deterministic float in ``[0, 1)`` from ``parts``. -# Detect and set the appropriate backend (CUDA or MPS) + Unlike :func:`random.random`, the result depends only on the inputs — never + on process state or Python's per-process hash seed — so every rank derives + the *same* sampling decision from the same step coordinate (cross-rank + alignment) and the host RNG stream is never perturbed (training stays + reproducible). + """ + key = "|".join(str(p) for p in parts).encode("utf-8") + digest = hashlib.blake2b(key, digest_size=8).digest() + return int.from_bytes(digest, "big") / float(1 << 64) + + +def _is_float(token: str) -> bool: + try: + float(token) + except (TypeError, ValueError): + return False + return True + + +# Default step-level sampling probability (``PROBING_TORCH_PROFILING=on``). +DEFAULT_SAMPLE_RATE = 0.05 +# Default shadow cadence: 4 probed steps, then 1 torch-baseline step (hooks bypassed). +DEFAULT_SHADOW_NORMAL = 4 +DEFAULT_SHADOW_BASELINE = 1 +# Max optimizer steps a GPU-event timing read may stay deferred before it is +# force-completed (bounds memory / guarantees eventual persistence). On an async +# backend the GPU is normally <2 steps behind, so this is only hit if the CPU +# races far ahead — rare, and the forced wait is then unavoidable anyway. +_DEFER_MAX_LAG = 16 +# Minimum optimizer steps a GPU-event timing read waits before draining, so the +# kernels it brackets are complete and ``elapsed_time`` is a free cached read +# rather than a blocking commit against the live stream. +_DEFER_MIN_SETTLE = 3 + + +def shadow_step_in_cycle( + cycle_index: int, + shadow_normal: int = DEFAULT_SHADOW_NORMAL, + shadow_baseline: int = DEFAULT_SHADOW_BASELINE, +) -> bool: + """Return True when ``cycle_index`` falls in the shadow (baseline) slice. + + With the default 4:1 cadence, indices 0–3 are probed and index 4 is shadow. + """ + if shadow_baseline <= 0 or shadow_normal < 0: + return False + cycle_len = shadow_normal + shadow_baseline + if cycle_len <= 0: + return False + return (cycle_index % cycle_len) >= shadow_normal + + +def _iter_tensors(output): + """Yield tensors from a module forward output (tensor, tuple, list, dict, …).""" + import torch + + if isinstance(output, torch.Tensor): + yield output + elif isinstance(output, (tuple, list)): + for item in output: + yield from _iter_tensors(item) + elif isinstance(output, dict): + for item in output.values(): + yield from _iter_tensors(item) + + +# Detect and set the appropriate backend (CUDA or MPS). +# Resolved lazily so ``configure()`` works before ``torch`` is installed/imported. def _get_backend(): """Detect and return the appropriate PyTorch backend module.""" import torch @@ -33,7 +100,20 @@ def _get_backend(): return None -backend = _get_backend() +_backend = None +_backend_resolved = False + + +def torch_backend(): + """Return the active torch device backend module, or ``None``.""" + global _backend, _backend_resolved + if not _backend_resolved: + _backend_resolved = True + try: + _backend = _get_backend() + except ModuleNotFoundError: + _backend = None + return _backend @table @@ -60,6 +140,27 @@ class TorchTrace: role: str = "" +@table +@dataclass +class TorchStepTiming: + """Per-step wall-clock timing for TorchProbe overhead monitoring.""" + + micro_step: Optional[int] = None + local_step: int = -1 + global_step: int = -1 + micro_batches: int = 1 + rank: int = -1 + world_size: int = -1 + role: str = "" + step_duration_sec: float = 0.0 + is_shadow: int = 0 + sampled: int = 0 + shadow_normal: int = DEFAULT_SHADOW_NORMAL + shadow_baseline: int = DEFAULT_SHADOW_BASELINE + sample_rate: float = DEFAULT_SAMPLE_RATE + sample_mode: str = "random" + + @table @dataclass class Variables: @@ -77,36 +178,58 @@ class TorchProbeConfig: telemetry (not episodic ``torch.profiler`` windows). There is no warmup schedule: skip early steps in SQL (``WHERE step > N``) when needed. - Sampling modes (``mode`` / ``PROBING_TORCH_PROFILING`` prefix token): - - - **ordered** — ``rate`` is the probability each training step is sampled. - On sampled steps, one module rotates per step (``curr_mod``), plus a - per-step time anchor: the first ``pre`` hook in the step (``offset=0``). - Any ``pre`` hook that is recorded always gets its matching ``post`` hook. - - **random** — every step is sampled. ``rate`` is the per-hook probability - for ``offset > 0`` on ``pre`` hooks; matching ``post`` hooks always pair. - The ``offset=0`` ``pre`` anchor is always recorded. + Sampling (``PROBING_TORCH_PROFILING`` prefix token — ``rate[:layer_rate]``): + + ``rate`` sets the *step* sampling density: exactly one step out of every + ``round(1/rate)`` is sampled, evenly spaced and starting at the first probed + step (stratified, not i.i.d. — so low rates never leave long gaps and data + shows up immediately). The schedule is derived from the step index (no host + RNG, no per-process seed), so every rank samples the *same* steps — keeping + distributed traces aligned and training reproducible. Non-sampled steps skip + module/optimizer trace hooks and GPU flush (wall timing in + ``torch_step_timing`` is still recorded). + + On a sampled step, each layer is recorded independently with probability + ``layer_rate`` (default 1.0 = full snapshot; e.g. ``random:0.1:0.3`` = sample + every 10th step, and within it hit each layer with 30% chance). The per-layer + decision is a deterministic hash of (step, layer): it looks random and varies + per layer, yet is reproducible and identical across ranks. The ``offset=0`` + anchor is always recorded and any recorded ``pre`` hook gets its matching + ``post``. + + (The legacy ``ordered`` mode has been removed; a leading ``random:``/ + ``ordered:`` token is still accepted for back-compat and treated as + ``random``.) The first complete training step is discovery only (modules registered, no rows written). Forward hooks are installed on all modules; backward - hooks are not enabled by default (autograd safety). + timing is off by default. Enable with ``backward=on`` — it times each + module's backward as the interval between grad_output ready (output-tensor + hook) and grad_input ready (input-tensor hook), which is inplace-safe (unlike + module backward hooks). Backward mirrors forward exactly: grad hooks attach + only for modules whose forward was recorded this step, so forward and + backward coverage never drift apart. The environment variable ``PROBING_TORCH_PROFILING`` is parsed with the following grammar:: probing-spec ::= toggle? ("," option)* toggle ::= "on" | "off" | "true" | "false" | "1" | "0" - option ::= key "=" value | mode-rate - key ::= "enabled" | "mode" | "rate" | "tracepy" | "sync" | - "exprs" | "vars" | "watch" - mode-rate ::= mode [":" rate] - mode ::= "ordered" | "random" - rate ::= + option ::= key "=" value | rate-spec + key ::= "enabled" | "mode" | "rate" | "layer_rate" | + "tracepy" | "sync" | "exprs" | "vars" | "watch" | + "shadow" | "backward" + rate-spec ::= [mode ":"] rate [":" layer_rate] + mode ::= "random" # back-compat alias, always random + rate ::= # step sampling density + layer_rate ::= # per-layer hit prob on sampled step Examples -------- >>> TorchProbeConfig.parse("on").enabled True + >>> TorchProbeConfig.parse("on").rate + 0.05 >>> TorchProbeConfig.parse("off").enabled False >>> cfg = TorchProbeConfig.parse("random:0.1,tracepy=on") @@ -117,11 +240,22 @@ class TorchProbeConfig: """ enabled: bool = False - mode: str = "ordered" - rate: float = 1.0 + mode: str = "random" + rate: float = DEFAULT_SAMPLE_RATE + # Per-layer hit probability *within* a sampled step. + # 1.0 = full snapshot (record every layer). + layer_rate: float = 1.0 tracepy: bool = False sync: bool = False + backward: bool = False + trace_spans: bool = True exprs: str = "" + shadow_normal: int = DEFAULT_SHADOW_NORMAL + shadow_baseline: int = DEFAULT_SHADOW_BASELINE + + @property + def shadow_enabled(self) -> bool: + return self.shadow_baseline > 0 @classmethod def parse(cls, raw: Optional[str]) -> "TorchProbeConfig": @@ -149,18 +283,28 @@ def parse(cls, raw: Optional[str]) -> "TorchProbeConfig": tokens = tokens[1:] else: if ":" in first: - mode_token, rate_token = first.split(":", 1) - if mode_token: - cfg.mode = mode_token - try: - parsed = float(rate_token) - except ValueError: - pass - else: - if parsed > 0: - cfg.rate = parsed - else: - cfg.mode = first + # [mode ":"] step_rate [":" layer_rate] — a leading mode name + # is a back-compat alias (only ``random`` sampling exists); + # the third field is the per-layer hit probability. + parts = first.split(":") + # Skip an optional leading mode alias (non-numeric first field). + rate_idx = 0 if _is_float(parts[0]) else 1 + if len(parts) > rate_idx: + try: + parsed = float(parts[rate_idx]) + except ValueError: + pass + else: + if parsed > 0: + cfg.rate = parsed + if len(parts) > rate_idx + 1: + try: + layer_parsed = float(parts[rate_idx + 1]) + except ValueError: + pass + else: + if layer_parsed > 0: + cfg.layer_rate = layer_parsed tokens = tokens[1:] for token in tokens: @@ -177,7 +321,8 @@ def parse(cls, raw: Optional[str]) -> "TorchProbeConfig": elif lowered in FALSE_VALUES: cfg.enabled = False elif key == "mode": - cfg.mode = value + # Back-compat: only ``random`` sampling exists; alias is ignored. + pass elif key == "rate": try: parsed = float(value) @@ -186,15 +331,53 @@ def parse(cls, raw: Optional[str]) -> "TorchProbeConfig": if parsed <= 0: continue cfg.rate = parsed + elif key in {"layer_rate", "layer-rate"}: + try: + parsed = float(value) + except ValueError: + continue + if parsed <= 0: + continue + cfg.layer_rate = parsed elif key == "tracepy": cfg.tracepy = value.lower() in TRUE_VALUES elif key == "sync": cfg.sync = value.lower() in TRUE_VALUES + elif key == "backward": + cfg.backward = value.lower() in TRUE_VALUES + elif key in {"trace_spans", "spans"}: + cfg.trace_spans = value.lower() in TRUE_VALUES elif key in {"exprs", "vars", "watch"}: cfg.exprs = value + elif key == "shadow": + cfg.apply_shadow_spec(value) return cfg + def apply_shadow_spec(self, value: str) -> None: + """Parse ``shadow=4:1`` (default cadence) or ``shadow=off``.""" + lowered = value.strip().lower() + if lowered in (*FALSE_VALUES, "0", "none"): + self.shadow_baseline = 0 + return + if ":" in lowered: + left, right = lowered.split(":", 1) + try: + normal = int(left) + baseline = int(right) + except ValueError: + return + if normal >= 0 and baseline > 0: + self.shadow_normal = normal + self.shadow_baseline = baseline + return + try: + baseline = int(lowered) + except ValueError: + return + if baseline > 0: + self.shadow_baseline = baseline + # Configuration key in probing.config # Rust sync_env_settings() converts PROBING_TORCH_PROFILING to probing.torch.profiling @@ -242,6 +425,7 @@ def configure(spec: Optional[str] = None) -> TorchProbeConfig: probing.config.remove(_CONFIG_KEY) config = TorchProbeConfig.parse(spec) + _sync_live_tracers(config) # Register the optimizer hook when profiling is enabled. This is required because # the hook is normally registered via the import-hook when "torch" is first @@ -249,23 +433,58 @@ def configure(spec: Optional[str] = None) -> TorchProbeConfig: # ext.torch.init() ensures the optimizer step hook is always registered. if config.enabled: try: - from probing.ext.torch import init as torch_ext_init - - torch_ext_init() - except ImportError as e: - import logging - - logging.getLogger(__name__).warning( - "Torch profiling enabled but ext.torch init failed: %s", e + import torch # noqa: F401 + except ModuleNotFoundError: + logger.info( + "Torch profiling spec stored (%r); hooks activate when torch loads", + spec, ) + else: + try: + from probing.ext.torch import init as torch_ext_init + + torch_ext_init() + except ImportError as e: + logger.warning( + "Torch profiling enabled but ext.torch init failed: %s", e + ) return config +def _live_torch_probes() -> list["TorchProbe"]: + """All live TorchProbe instances, muting gc-sweep deprecation noise. + + A full ``gc.get_objects()`` sweep touches unrelated deprecated torch globals + (e.g. ``torch.distributed.reduce_op``) whose access emits a FutureWarning; + silence it since it is not about our tracers. + """ + import gc + import warnings + + with warnings.catch_warnings(): + warnings.simplefilter("ignore", FutureWarning) + return [obj for obj in gc.get_objects() if isinstance(obj, TorchProbe)] + + +def _sync_live_tracers(config: TorchProbeConfig) -> None: + """Push config changes onto tracers created before ``configure()``.""" + for obj in _live_torch_probes(): + obj.config.backward = config.backward + obj.config.trace_spans = config.trace_spans + # Re-plan so a hot rate/layer_rate change takes effect next step. + obj.rate = config.rate + obj.layer_rate = config.layer_rate + obj._planned_cycle = None + + class DelayedRecord: def __init__(self, record, events): self.record = record self.events = events + # Optimizer-step cycle at which this record was deferred (set by the + # sampled-step path); used to force-flush stale GPU-event reads. + self._defer_cycle = None def save(self): # Duration is best-effort: GPU event timing (notably MPS @@ -288,7 +507,7 @@ def mem_stats() -> TorchTrace: MB = 1024 * 1024 - if backend is None: + if torch_backend() is None: # No GPU backend available return TorchTrace( allocated=0.0, @@ -297,12 +516,13 @@ def mem_stats() -> TorchTrace: max_cached=0.0, ) - if backend == torch.cuda: + be = torch_backend() + if be == torch.cuda: return TorchTrace( - allocated=backend.memory_allocated() / MB, - cached=backend.memory_reserved() / MB, - max_allocated=backend.max_memory_allocated() / MB, - max_cached=backend.max_memory_reserved() / MB, + allocated=be.memory_allocated() / MB, + cached=be.memory_reserved() / MB, + max_allocated=be.max_memory_allocated() / MB, + max_cached=be.max_memory_reserved() / MB, ) # MPS / Apple GPU (and other backends): memory APIs differ across PyTorch @@ -310,7 +530,7 @@ def mem_stats() -> TorchTrace: # any of these functions degrade gracefully to 0.0. def _mem_mb(*names: str) -> float: for name in names: - fn = getattr(backend, name, None) + fn = getattr(be, name, None) if fn is None: continue try: @@ -346,29 +566,29 @@ def _mem_mb(*names: str) -> float: def _backend_has_event(): """Check if the backend supports Event for GPU timing (CUDA yes, MPS in PyTorch 2.0+).""" - if backend is None: + be = torch_backend() + if be is None: return False # CUDA: torch.cuda.Event; MPS: torch.mps.event.Event - return hasattr(backend, "Event") or ( - hasattr(backend, "event") and hasattr(backend.event, "Event") - ) + return hasattr(be, "Event") or (hasattr(be, "event") and hasattr(be.event, "Event")) def _backend_event(enable_timing=True): """Create a backend Event. CUDA: Event; MPS: event.Event.""" - if backend is None: + be = torch_backend() + if be is None: return None - if hasattr(backend, "event") and hasattr(backend.event, "Event"): - return backend.event.Event(enable_timing=enable_timing) - if hasattr(backend, "Event"): - return backend.Event(enable_timing=enable_timing) + if hasattr(be, "event") and hasattr(be.event, "Event"): + return be.event.Event(enable_timing=enable_timing) + if hasattr(be, "Event"): + return be.Event(enable_timing=enable_timing) return None class Timer: def __init__(self, sync: bool = False, **kwargs): - self.has_backend = backend is not None + self.has_backend = torch_backend() is not None self.use_gpu_events = _backend_has_event() self.sync = sync self.events = {} # GPU timers @@ -380,7 +600,7 @@ def __init__(self, sync: bool = False, **kwargs): def begin_timing(self, mod, stage) -> float: # Synchronize if needed for more accurate timing if self.sync and self.has_backend: - backend.synchronize() + torch_backend().synchronize() if self.offset() == 0: self.step_start = time.time() @@ -399,18 +619,18 @@ def begin_timing(self, mod, stage) -> float: self.events[key] = event else: self.use_gpu_events = False - self.cpu_start[key] = time.time() + self.cpu_start[key] = time.perf_counter() except (AttributeError, TypeError): self.use_gpu_events = False - self.cpu_start[key] = time.time() + self.cpu_start[key] = time.perf_counter() else: - self.cpu_start[key] = time.time() + self.cpu_start[key] = time.perf_counter() return time_offset def end_timing(self, mod, stage) -> tuple: # Synchronize if needed for more accurate timing if self.sync and self.has_backend: - backend.synchronize() + torch_backend().synchronize() time_offset = 0.0 if self.step_start is None else time.time() - self.step_start key = (id(mod), STAGEMAP[stage]) @@ -425,7 +645,8 @@ def end_timing(self, mod, stage) -> tuple: pass self.events.pop(key, None) if key in self.cpu_start: - duration_sec = time.time() - self.cpu_start.pop(key) + started = self.cpu_start.pop(key) + duration_sec = time.perf_counter() - started # CPU fallback: use a simple (start, end) tuple; DelayedRecord checks events # Create a minimal object that provides elapsed_time for compatibility @@ -443,36 +664,42 @@ def elapsed_time(self, _other): class Sampler: """Per-step sampling for module hooks (see :class:`TorchProbeConfig`).""" - def __init__(self, mode="ordered", rate=1.0, **kwargs): - # Strategy configuration - self.mode = mode + def __init__(self, rate=DEFAULT_SAMPLE_RATE, layer_rate=1.0, **kwargs): + # Only ``random`` sampling exists; ``mode`` is retained purely so the + # ``torch_step_timing.sample_mode`` column stays populated. + self.mode = "random" self.rate = rate + # Per-layer hit probability within a sampled step (1.0 = full snapshot). + self.layer_rate = layer_rate # Module tracking state self.mod_names = {} # Maps module IDs to names - self.mod_queue = [] # List of module IDs to track - self.curr_idx = 0 - self.curr_mod = None # Discovery state self.finalized = False self.sampled_step = True + # Deterministic per-step sampling plan (cross-rank aligned, seed-free). + # ``_auto_plan`` is only enabled once discovery finishes so unit tests can + # pin ``sampled_step`` by hand; live runs recompute the plan from + # ``_step_cycle`` at the start of every step. + self._auto_plan = False + self._planned_cycle = None + # Modules whose *forward* was recorded this step; backward hooks attach + # only for these so forward/backward coverage never drifts apart. + self._sampled_mods_this_step: set[int] = set() + super().__init__(**kwargs) def _module_display_name(self, mod) -> str: - import torch + from .torch.module_utils import module_name - mid = id(mod) - cached = self.mod_names.get(mid) + cached = self.mod_names.get(id(mod)) if cached and cached not in ("None", ""): return cached - name = module_name(mod) - if name: - return name - if isinstance(mod, torch.optim.Optimizer): - return mod.__class__.__name__ - return mod.__class__.__name__ + # ``module_name`` returns the registered dotted path (modules) or "" for + # optimizers and unnamed objects, which fall back to the class name. + return module_name(mod) or mod.__class__.__name__ def register_mod(self, mod) -> None: if self.finalized: @@ -482,16 +709,40 @@ def register_mod(self, mod) -> None: def finalize_discovery(self): self.finalized = True - # Shallow modules first: dotted names grow with nesting depth (e.g. model.features.conv). - mods = sorted( - self.mod_names.items(), - key=lambda x: (x[1].count("."), len(x[1])), - ) - self.mod_queue = [x for x, _ in mods] + # From here on, live runs plan sampling deterministically per step. The + # per-step gate and the per-layer hash decision are both pure functions of + # the step index, so all ranks sample the identical (step, module) pairs. + self._auto_plan = True + self._planned_cycle = None + + def _sample_period(self) -> int: + """Steps between samples: ``round(1/rate)`` (>=1).""" + if self.rate >= 1.0: + return 1 + return max(1, round(1.0 / self.rate)) + + def _ensure_step_plan(self) -> None: + """Compute this step's sampling decision from ``_step_cycle`` (once/step). + + Sampling is *stratified*: exactly one step out of every ``period`` is + sampled, evenly spaced and starting at cycle 0. Unlike i.i.d. per-step + rolls (which leave long random gaps — e.g. ~100 steps between samples at + 1%), this guarantees data appears on the first probed step and at a + steady cadence. The schedule is derived purely from ``_step_cycle`` + (which advances one-for-one on every rank), so all ranks pick the same + step and the host RNG is never touched. Cached per cycle so it stays + stable across gradient-accumulation micro-steps. + """ + if not self.finalized or not self._auto_plan: + return + cycle = getattr(self, "_step_cycle", 0) + if self._planned_cycle == cycle: + return + self._planned_cycle = cycle + self._sampled_mods_this_step = set() - if self.mod_queue: - self.curr_idx = 0 - self.curr_mod = self.mod_queue[0] + period = self._sample_period() + self.sampled_step = (cycle % period) == 0 def should_sample(self, mod, stage: Optional[str] = None) -> bool: if not self.finalized: @@ -505,57 +756,73 @@ def should_sample(self, mod, stage: Optional[str] = None) -> bool: if stage and stage.startswith("pre") and self.offset() == 0: return True - if self.mode == "ordered": - return id(mod) == self.curr_mod - return random.random() < self.rate - - def next_mod(self) -> None: - if self.mod_queue and self.mode == "ordered": - self.sampled_step = random.random() < self.rate - idx = (self.curr_idx + 1) % len(self.mod_queue) - self.curr_idx = idx - self.curr_mod = self.mod_queue[idx] + # On a sampled step, each layer is hit independently with probability + # ``layer_rate`` (1.0 = full snapshot). The decision is a deterministic + # hash of (step, layer) — it *looks* random and varies per layer/step, + # yet is reproducible and identical across ranks, and never perturbs the + # host RNG. + if self.layer_rate >= 1.0: + return True + cycle = getattr(self, "_step_cycle", 0) + return ( + _stable_unit_float("hook", cycle, self._module_display_name(mod)) + < self.layer_rate + ) def set_sampling_mode(self, expr): - """Set sampling mode and rate (``mode:rate`` or ``ordered``). + """Set sampling rate (``rate`` or ``rate:layer_rate``; ``mode`` is accepted + for back-compat but only ``random`` sampling exists). - In **ordered** mode, ``rate`` controls step-level sampling probability. - In **random** mode, ``rate`` controls per-hook sampling after the - per-step ``pre`` anchor (``offset=0``). Open ``pre`` stages always - receive a matching ``post`` hook. + ``rate`` sets the *step* sampling density: one step in every + ``round(1/rate)`` is sampled, evenly spaced (deterministic per step, so + ranks stay aligned). Within a sampled step each layer is recorded with + probability ``layer_rate`` (default 1.0 = full snapshot), decided by a + deterministic (step, layer) hash. Open ``pre`` stages always receive a + matching ``post`` hook. Examples -------- >>> tracer = TorchProbe() >>> tracer.mode, tracer.rate - ('ordered', 1.0) + ('random', 0.05) >>> tracer.set_sampling_mode("random:0.1") >>> tracer.mode, tracer.rate ('random', 0.1) - >>> tracer.set_sampling_mode("ordered:0.5") + >>> tracer.set_sampling_mode("random:0.1:0.3") + >>> (tracer.mode, tracer.rate, tracer.layer_rate) + ('random', 0.1, 0.3) + + >>> tracer.set_sampling_mode("0.5") # bare rate also works >>> tracer.mode, tracer.rate - ('ordered', 0.5) + ('random', 0.5) >>> tracer.set_sampling_mode("invalid:1.5") >>> tracer.mode, tracer.rate - ('ordered', 1.0) + ('random', 0.05) """ - if expr == "ordered": - self.mode = "ordered" - self.rate = 1.0 - return + # Force a re-plan so a hot rate switch takes effect next step. + self._planned_cycle = None + self.mode = "random" try: - mode, rate = expr.split(":") - - self.mode = mode if mode in ["ordered", "random"] else "ordered" - self.rate = float(rate) if 0 < float(rate) <= 1 else 1.0 - except ValueError: + parts = expr.split(":") + # First field may be a legacy mode name (ignored) or a bare rate: + # treat a non-numeric leading token as a mode alias and skip it. + rate_idx = 0 if _is_float(parts[0]) else 1 + rate = parts[rate_idx] + layer_idx = rate_idx + 1 + + self.rate = float(rate) if 0 < float(rate) <= 1 else DEFAULT_SAMPLE_RATE + if len(parts) > layer_idx and 0 < float(parts[layer_idx]) <= 1: + self.layer_rate = float(parts[layer_idx]) + else: + self.layer_rate = 1.0 + except (ValueError, IndexError): print(f"Invalid sampling expression: {expr}. Using default settings.") - self.mode = "ordered" - self.rate = 1.0 + self.rate = DEFAULT_SAMPLE_RATE + self.layer_rate = 1.0 class PythonTracer: @@ -668,22 +935,135 @@ def __init__(self, config: Optional[TorchProbeConfig] = None): self.pending = [] self._open_spans = {} self._train_step_cm = None + self._step_cycle = 0 + self.shadow_step = False + self._step_wall_started_at: Optional[float] = None + self._backward_wall_start: dict[int, float] = {} + # Backward grad hooks run on autograd worker threads where the step + # coordinate is thread-local and reads as 0. Capture the snapshot on the + # main thread when hooks are armed (during forward) so ``post backward`` + # rows carry the correct local_step instead of 0. + self._backward_step_snap: dict[int, Any] = {} + # GPU-event timing reads deferred off the sampled step's critical path + # (see ``_drain_deferred``); each item is a ``DelayedRecord`` tagged with + # ``_defer_cycle``. + self._deferred: list = [] + # ``current_role()`` rescans the whole environment on every call (~70us); + # the role is constant within a step, so resolve it once per step (see + # ``_mark_step_wall_start``) and reuse it for every stamped row. + self._role_this_step: str = current_role() super().__init__( tracepy=config.tracepy, sync=config.sync, - mode=config.mode, rate=config.rate, + layer_rate=config.layer_rate, exprs=config.exprs, ) - def _stamp_step_role(self, record) -> None: - """Fill step coordinate and parallel role on a torch_trace record.""" - for key, value in row_fields(step.snapshot()).items(): + def _stamp_step_role(self, record, snapshot=None) -> None: + """Fill step coordinate and parallel role on a torch_trace record. + + ``snapshot`` overrides the live step coordinate — required for backward + rows, whose grad hooks fire on autograd threads where the thread-local + coordinate reads 0 (see ``_backward_step_snap``). + """ + snap = snapshot if snapshot is not None else step.snapshot() + for key, value in row_fields(snap).items(): setattr(record, key, value) - record.role = current_role() + record.role = self._role_this_step + + def _refresh_shadow_flag(self) -> None: + self.shadow_step = shadow_step_in_cycle( + self._step_cycle, + self.config.shadow_normal, + self.config.shadow_baseline, + ) + + def _advance_step_cycle_for_next(self) -> None: + self._step_cycle += 1 + self._refresh_shadow_flag() + + def _mark_step_wall_start(self) -> None: + self._step_wall_started_at = time.perf_counter() + # Refresh the per-step role cache (runs once per step, on every branch: + # sampled, non-sampled, and shadow) so a runtime ``set_role`` / late env + # is picked up next step without paying the env scan on every row. + self._role_this_step = current_role() + + def _record_step_timing(self, *, is_shadow: bool) -> None: + """Persist wall-clock step duration for probed vs shadow comparison.""" + if self._step_wall_started_at is None: + return + duration = time.perf_counter() - self._step_wall_started_at + record = TorchStepTiming( + step_duration_sec=duration, + is_shadow=1 if is_shadow else 0, + sampled=0 if is_shadow else (1 if self.sampled_step else 0), + shadow_normal=self.config.shadow_normal, + shadow_baseline=self.config.shadow_baseline, + sample_rate=self.rate, + sample_mode=self.mode, + ) + self._stamp_step_role(record) + try: + record.save() + except Exception as e: + logger.debug("failed to save torch step timing: %s", e) + + def _hooks_dispatch_active(self) -> bool: + """Whether module/optimizer trace hooks should run this step (not just wall timing).""" + if not self.finalized: + return True + # Plan at the first hook of the step so non-sampled steps short-circuit + # every mode (``ordered`` and ``random`` alike). + self._ensure_step_plan() + return self.sampled_step + + def pre_forward_hook(self, m, i): + if self.shadow_step or not self._hooks_dispatch_active(): + return + super().pre_forward_hook(m, i) + + def post_forward_hook(self, m, i, o): + if self.shadow_step or not self._hooks_dispatch_active(): + return + super().post_forward_hook(m, i, o) + if self.config.backward: + self._attach_backward_tensor_hooks(m, i, o) + + def pre_backward_hook(self, m, i): + if self.shadow_step or not self._hooks_dispatch_active(): + return + super().pre_backward_hook(m, i) + + def post_backward_hook(self, m, i, o): + if self.shadow_step or not self._hooks_dispatch_active(): + return + super().post_backward_hook(m, i, o) + + def pre_step_hook(self, optimizer, args, kwargs): + if self.shadow_step: + return + if self.enabled and self.finalized: + self._begin_train_step_span(optimizer=optimizer) + if not self._hooks_dispatch_active(): + return + super().pre_step_hook(optimizer, args, kwargs) + + def _should_emit_trace_span(self, mod, span_phase: str) -> bool: + if not self.config.trace_spans: + return False + if is_training_phase(span_phase): + from probing.tracing.hooks import owns_training_phases + + if owns_training_phases(module=mod): + return False + return True def _begin_train_step_span(self, optimizer=None) -> None: + if not self.config.trace_spans: + return if self._train_step_cm is not None: return from probing.tracing.hooks import owns_training_phases @@ -709,6 +1089,113 @@ def _post_stage_for_pre(self, pre_stage: str) -> str: return "post " + pre_stage[4:] return pre_stage + def _open_backward_timer(self, mod) -> None: + """Open a backward span + start the timer (no ``pre backward`` row). + + Backward is timed on the *same clock as forward*: on an async backend a + GPU event is recorded here (and another when the module's backward + finishes) so we capture real backward GPU time — not just the CPU + dispatch interval, which is near-zero on CUDA/MPS and made backward + vanish from the flamegraph. CPU backends fall back to a wall clock. + """ + span_key = (id(mod), "backward") + if span_key in self._open_spans: + return + module_name_str = self._module_display_name(mod) + + span_cm = None + span_phase = infer_from_stage("pre backward") + emit_trace_span = self._should_emit_trace_span(mod, span_phase) + if emit_trace_span: + span_kwargs = dict( + module=module_name_str, + stage="backward", + seq=self.offset(), + source="torch_probe", + ) + if is_training_phase(span_phase): + span_cm = span(module_name_str, phase=span_phase, **span_kwargs) + else: + span_cm = span(module_name_str, **span_kwargs) + span_cm.__enter__() + + # Slots 3/4 (allocated, max_allocated) are unused for backward. + self._open_spans[span_key] = (span_cm, mod, "pre backward", 0.0, 0.0) + self._backward_wall_start[id(mod)] = self._backward_timer_start() + + def _backward_timer_start(self): + """Return a start marker for a module's backward timing. + + On an async backend this is a *recorded* GPU event (so the duration is + measured on the GPU clock, matching forward); otherwise a + ``perf_counter`` float for CPU wall timing. + """ + if self.use_gpu_events: + try: + event = _backend_event(enable_timing=True) + if event is not None: + event.record() + return event + self.use_gpu_events = False + except (AttributeError, TypeError): + self.use_gpu_events = False + return time.perf_counter() + + def _save_post_backward(self, mod, start_marker) -> None: + """Persist a single ``post backward`` row (flamegraph input). + + ``start_marker`` comes from :meth:`_backward_timer_start`: a GPU event + (async backends → time on the GPU clock, deferred like forward so the + sampled step never blocks) or a ``perf_counter`` float (CPU wall time). + """ + module_name_str = self._module_display_name(mod) + span_key = (id(mod), "backward") + entry = self._open_spans.pop(span_key, None) + if entry is not None: + span_cm = entry[0] + if span_cm is not None: + try: + span_cm.__exit__(None, None, None) + except Exception: + pass + self._release_timers(span_key) + + record = mem_stats() + # Use the forward-time snapshot: this may run on an autograd thread whose + # thread-local step coordinate reads 0, which would filter the row out of + # the recent-step flamegraph window. + self._stamp_step_role(record, self._backward_step_snap.pop(id(mod), None)) + record.seq = self.offset() + record.module = module_name_str + record.stage = "post backward" + record.time_offset = 0.0 + + if start_marker is not None and not isinstance(start_marker, float): + # GPU-event start → record the matching end event and time on the + # GPU clock. Reading ``elapsed_time`` needs the events complete, so + # defer it (same machinery as forward) to keep the step off-critical. + end_event = None + try: + end_event = _backend_event(enable_timing=True) + if end_event is not None: + end_event.record() + except (AttributeError, TypeError): + end_event = None + if end_event is not None: + deferred = DelayedRecord(record, (start_marker, end_event)) + deferred._defer_cycle = self._step_cycle + self._deferred.append(deferred) + return + record.duration = 0.0 + elif isinstance(start_marker, float): + record.duration = max(time.perf_counter() - start_marker, 0.0) + else: + record.duration = 0.0 + try: + DelayedRecord(record, None).save() + except Exception as e: + logger.debug("failed to save post backward trace: %s", e) + def _complete_post_stage(self, mod, post_stage: str) -> None: """Finish a pre/post pair (used for normal post hooks and step-end cleanup).""" mapped_stage = STAGEMAP[post_stage] @@ -740,10 +1227,25 @@ def _finish_open_stages(self) -> None: entry = self._open_spans[span_key] mod, pre_stage = entry[1], entry[2] post_stage = self._post_stage_for_pre(pre_stage) + if pre_stage == "pre backward": + started = self._backward_wall_start.pop(id(mod), None) + try: + # ``started`` may be a GPU event or wall-clock float; both are + # understood by ``_save_post_backward``. ``None`` still closes + # the span (guarantees this loop makes progress). + self._save_post_backward(mod, started) + except Exception as e: + logger.debug( + "error completing orphan backward for %s: %s", + self._module_display_name(mod), + e, + ) + self._open_spans.pop(span_key, None) + continue try: self._complete_post_stage(mod, post_stage) except Exception as e: - print(f"Error completing open stage {pre_stage}: {e}") + logger.debug("error completing open stage %s: %s", pre_stage, e) closed = self._open_spans.pop(span_key, None) if closed is not None: try: @@ -767,9 +1269,79 @@ def _cleanup_step_resources(self) -> None: self._open_spans.clear() self.events.clear() self.cpu_start.clear() + self._backward_wall_start.clear() + self._backward_step_snap.clear() + + def _attach_backward_tensor_hooks(self, mod, inputs, output) -> None: + """Time a module's *own* backward via output/input grad hooks. + + ``grad_output`` is ready just *before* the module's backward runs; + ``grad_input`` just *after*. So the module's backward compute is the + interval between the two, measured with plain tensor ``register_hook`` + callbacks (inplace-safe, unlike module backward hooks). Modules whose + input needs no grad (e.g. the first layer) can't be measured → ~0. + """ + if not self.enabled or not self.finalized or self.shadow_step: + return + # Backward follows forward: attach only for modules whose forward was + # recorded this step, so forward/backward coverage stays in lockstep. + if not self.sampled_step or id(mod) not in self._sampled_mods_this_step: + return + span_key = (id(mod), "backward") + if span_key in self._open_spans: + return + out_tensors = [ + t for t in _iter_tensors(output) if getattr(t, "requires_grad", False) + ] + if not out_tensors: + return + in_tensors = [ + t for t in _iter_tensors(inputs) if getattr(t, "requires_grad", False) + ] + + # ``_backward_wall_start[id(mod)]`` (set by ``_open_backward_timer``) is the + # single start timestamp; the orphan path in ``_finish_open_stages`` reads + # it too. ``state`` only tracks how many grad callbacks are still pending. + state = { + "started": False, + "out_left": len(out_tensors), + "in_left": len(in_tensors), + } + # Snapshot the step coordinate now (main/forward thread); grad callbacks + # below run on autograd threads where it would read 0. + self._backward_step_snap[id(mod)] = step.snapshot() + + def _finalize() -> None: + if span_key not in self._open_spans: + return + start = self._backward_wall_start.pop(id(mod), None) + self._save_post_backward(mod, start) + + def _on_out_grad(grad): + # grad_output ready → this module's backward is about to start. + if not state["started"]: + state["started"] = True + self._open_backward_timer(mod) + state["out_left"] -= 1 + # No grad-requiring input → grad_input never fires → close at ~0. + if state["out_left"] == 0 and state["in_left"] == 0: + _finalize() + return grad + + def _on_in_grad(grad): + # grad_input ready → this module's backward just finished. + state["in_left"] -= 1 + if state["in_left"] == 0 and id(mod) in self._backward_wall_start: + _finalize() + return grad + + for tensor in out_tensors: + tensor.register_hook(_on_out_grad) + for tensor in in_tensors: + tensor.register_hook(_on_in_grad) def log_module_stage(self, stage, mod, force=False) -> None: - if not self.enabled: + if not self.enabled or self.shadow_step: return mapped_stage = STAGEMAP[stage] @@ -779,6 +1351,11 @@ def log_module_stage(self, stage, mod, force=False) -> None: if not force and not pairing and not self.should_sample(mod, stage): return + # Remember modules whose forward is recorded so backward hooks can mirror + # the exact same coverage this step. + if stage == "pre forward": + self._sampled_mods_this_step.add(id(mod)) + record = mem_stats() self._stamp_step_role(record) record.seq = self.offset() @@ -787,12 +1364,7 @@ def log_module_stage(self, stage, mod, force=False) -> None: record.stage = stage span_phase = infer_from_stage(stage) - emit_trace_span = True - if is_training_phase(span_phase): - from probing.tracing.hooks import owns_training_phases - - if owns_training_phases(module=mod): - emit_trace_span = False + emit_trace_span = self._should_emit_trace_span(mod, span_phase) if stage.startswith("pre"): record.time_offset = self.begin_timing(mod, stage) @@ -820,47 +1392,156 @@ def log_module_stage(self, stage, mod, force=False) -> None: else: self._complete_post_stage(mod, stage) + @staticmethod + def _deferred_events_ready(dr) -> bool: + """True when a deferred record's GPU end-event has completed (or it has none). + + ``event.query()`` is a non-blocking readiness check, so this never stalls. + """ + events = dr.events + if not events: + return True + end = events[1] + if end is None: + return True + try: + return bool(end.query()) + except Exception: + # query() unsupported/failed → let save() attempt the read. + return True + + @staticmethod + def _force_event_complete(dr) -> None: + events = dr.events + if not events: + return + end = events[1] + if end is None: + return + try: + end.synchronize() + except Exception: + pass + + def _drain_deferred(self) -> None: + """Persist GPU-event timings stashed by earlier sampled steps. + + Reading ``elapsed_time`` needs the events to have completed; doing that on + the sampled step forces a blocking ``synchronize`` on an async backend + (CUDA/MPS) — that stall is exactly what inflates sampled-step wall time. + Instead we stash the (record, events) and drain them here on later + optimizer steps once the GPU has naturally caught up. + + A record is only read after it has aged ``_DEFER_MIN_SETTLE`` optimizer + steps *and* its end event reports ready (``event.query()``). The settle + window matters most for backward events, which are recorded near the end + of a step: draining them the very next step (while the kernels they + bracket are still in flight) makes each ``elapsed_time`` force its own + blocking commit — dozens of ms per sampled step. Letting them age a couple + of steps turns every read into a free cached lookup, exactly like forward + events already behave. Entries older than ``_DEFER_MAX_LAG`` cycles are + force-completed (rare). + """ + if not self._deferred: + return + cutoff = self._step_cycle - _DEFER_MAX_LAG + settle = self._step_cycle - _DEFER_MIN_SETTLE + remaining = [] + for dr in self._deferred: + defer_cycle = getattr(dr, "_defer_cycle", self._step_cycle) + force = defer_cycle <= cutoff + # Only read events that have had a few optimizer steps to settle on + # the GPU. Reading ``elapsed_time`` too soon (e.g. the very next step, + # while the backward kernels those events bracket are still in flight) + # forces a blocking commit — that stall is the sampled-step overhead. + # Letting them age a couple of steps means the reads hit already + # completed work for free, exactly like forward events naturally do. + settled = defer_cycle <= settle + if force or (settled and self._deferred_events_ready(dr)): + if force: + self._force_event_complete(dr) + dr.save() + else: + remaining.append(dr) + self._deferred = remaining + def post_step_hook(self, opt, args, kwargs): - super().post_step_hook(opt, args, kwargs) if not self.enabled: return if not self.finalized: self.finalize_discovery() + self._step_cycle = 0 + self._refresh_shadow_flag() self.curr_step = step.micro_step + self._mark_step_wall_start() self._begin_train_step_span(optimizer=opt) - else: + return + + # Reclaim earlier sampled steps' GPU timings every optimizer step, off + # their critical path (runs for shadow / non-sampled / sampled alike). + self._drain_deferred() + + if self.shadow_step: self._end_train_step_span() - self.next_mod() self.curr_step = step.micro_step - self._begin_train_step_span(optimizer=opt) + self._cleanup_step_resources() + self.step_start = None + self._record_step_timing(is_shadow=True) + self._advance_step_cycle_for_next() + self._mark_step_wall_start() + return - # Ensure backend operations are complete before processing traces - if self.has_backend and self.pending: - backend.synchronize() + self._end_train_step_span() + self.curr_step = step.micro_step - self._finish_open_stages() + if not self.sampled_step: + self._module_call_offset = 0 + self._current_module = None + self._current_stage = None + self._cleanup_step_resources() + self.step_start = None + self.pending.clear() + self._record_step_timing(is_shadow=False) + self._advance_step_cycle_for_next() + self._mark_step_wall_start() + return + + super().post_step_hook(opt, args, kwargs) - if self.has_backend and self.pending: - backend.synchronize() + self._finish_open_stages() - # Flush pending records after GPU sync (pre/post pairs get duration on post). - for pending in self.pending: - pending.save() + # ``pre backward`` rows carry no duration (backward is wall-clock timed) — + # drop them so the table is not flooded with 0s. + records = [p for p in self.pending if p.record.stage != "pre backward"] self.pending.clear() + if self.use_gpu_events: + # Async backend (CUDA/MPS): reading ``elapsed_time`` now would force a + # blocking ``synchronize`` on the sampled step — the stall that + # inflates its wall time. Defer instead and drain on later optimizer + # steps once the GPU has caught up (see ``_drain_deferred``). + cycle = self._step_cycle + for pending in records: + pending._defer_cycle = cycle + self._deferred.append(pending) + else: + # CPU timing: no async work to wait on, so persist immediately. + for pending in records: + pending.save() + # trace Python variables self.trace_variables() self._cleanup_step_resources() self.step_start = None + self._record_step_timing(is_shadow=False) + self._advance_step_cycle_for_next() + self._mark_step_wall_start() def set_sampling_mode(mode): - import gc - - objs = [obj for obj in gc.get_objects() if isinstance(obj, TorchProbe)] try: - for obj in objs: + for obj in _live_torch_probes(): obj.set_sampling_mode(mode) except Exception as e: - print(f"Error setting mode: {e}") + logger.debug("error setting sampling mode: %s", e) diff --git a/python/probing/profiling/types.py b/python/probing/profiling/types.py index 83aa8567..c8b49af9 100644 --- a/python/probing/profiling/types.py +++ b/python/probing/profiling/types.py @@ -59,11 +59,11 @@ def post_backward_hook(self, m, i, o): self.process_hook(m, "post backward") def pre_step_hook(self, optimizer, args, kwargs): - self.log_module_stage("pre step", optimizer, force=False) + self.log_module_stage("pre step", optimizer, force=True) self.process_hook(optimizer, "pre step") def post_step_hook(self, optimizer, args, kwargs): - self.log_module_stage("post step", optimizer, force=False) + self.log_module_stage("post step", optimizer, force=True) self.process_hook(optimizer, "post step") # New step begins: reset intra-step execution offset. The training step # coordinate itself is advanced by the train-step span (Rust side). diff --git a/python/probing/skills/README.md b/python/probing/skills/README.md index 102bc52e..9589ebd7 100644 --- a/python/probing/skills/README.md +++ b/python/probing/skills/README.md @@ -12,7 +12,6 @@ | `../extensions/` | **Extension discovery SSOT** — entry points, overlays, vendor inventory | | `install.py` | `probing skill install` / `update` — copy into agent skill dirs | | `tools.py` | `list_skills`, `plan_skill_run` — discovery/plan via Rust | -| `serialize.py` | Legacy JSON helpers (handlers call `_core` directly) | | `__main__.py` | `python -m probing.skills validate\|install\|update` | ## Discovery (later wins) diff --git a/python/probing/skills/__init__.py b/python/probing/skills/__init__.py index 5915d818..df9a7254 100644 --- a/python/probing/skills/__init__.py +++ b/python/probing/skills/__init__.py @@ -5,7 +5,6 @@ SkillCatalog, SkillStep, expand_skill, - expand_template, load_catalog, load_intents, load_pages, @@ -43,7 +42,6 @@ "find_repo_root", "repo_skills_dir", "expand_skill", - "expand_template", "install_skills", "list_skills", "list_skills_json", diff --git a/python/probing/skills/loader.py b/python/probing/skills/loader.py index e56ddee8..57f5e40c 100644 --- a/python/probing/skills/loader.py +++ b/python/probing/skills/loader.py @@ -206,18 +206,6 @@ def build_context( return {str(k): str(v) for k, v in params.items()} -def expand_template(template: str, ctx: Mapping[str, str]) -> str: - out = template - for key, val in ctx.items(): - out = out.replace(f"{{{key}}}", str(val)) - return out - - -def derived_variables(params: Mapping[str, Any]) -> Dict[str, str]: - """Deprecated — kept for tests importing the name; logic is Rust-only.""" - raise NotImplementedError("derived_variables() moved to probing-skills (Rust SSOT)") - - def match_skills( query: str, root: Optional[Path] = None, diff --git a/python/probing/skills/serialize.py b/python/probing/skills/serialize.py deleted file mode 100644 index a0b35fcd..00000000 --- a/python/probing/skills/serialize.py +++ /dev/null @@ -1,48 +0,0 @@ -"""JSON serialization helpers for skill HTTP APIs (Rust SSOT). - -Kept for backward-compatible imports; handlers should call ``probing._core`` directly. -""" - -from __future__ import annotations - -import json -from typing import Any, Dict - -import probing._core as core - -from probing.skills.loader import Skill, SkillCatalog, SkillCatalogEntry, SkillStep - - -def skill_step_to_dict(step: SkillStep) -> Dict[str, Any]: - return { - "id": step.id, - "title": step.title, - "type": step.type, - "sql": step.sql, - "method": step.method, - "path": step.path, - "action": step.action, - "view": step.view, - "on_empty": step.on_empty, - "empty_message": step.empty_message, - "when": step.when, - "cluster": step.raw.get("cluster"), - } - - -def skill_to_dict(skill: Skill) -> Dict[str, Any]: - return json.loads(core.skills_load(skill.id)) - - -def catalog_entry_to_dict(entry: SkillCatalogEntry) -> Dict[str, Any]: - return { - "id": entry.id, - "path": entry.path, - "category": entry.category, - "priority": entry.priority, - "description": entry.description, - } - - -def catalog_to_dict(catalog: SkillCatalog) -> Dict[str, Any]: - return {"skills": [catalog_entry_to_dict(e) for e in catalog.skills]} diff --git a/python/probing/tracing/backends.py b/python/probing/tracing/backends.py index 8727aeb9..2cbb86e9 100644 --- a/python/probing/tracing/backends.py +++ b/python/probing/tracing/backends.py @@ -7,7 +7,8 @@ ----------- ``PROBING_SPAN_BACKENDS`` Comma-separated backend names. Default: ``memtable``. - Built-in: ``memtable``, ``logger`` (terminal), ``otel`` (requires ``opentelemetry-sdk``). + Built-in: ``memtable``, ``logger`` (terminal), ``otel`` (requires ``opentelemetry-sdk``), + ``none`` (stack only). ``configure([])`` also disables persistence until ``reset()``. ``PROBING_SPAN_LOG_LEVEL`` Log level for the ``logger`` backend (default: ``INFO``). @@ -30,6 +31,7 @@ MEMTABLE_BACKEND = "memtable" LOGGER_BACKEND = "logger" OTEL_BACKEND = "otel" +NONE_BACKEND = "none" _trace_event_cls: Any = None _recorder: Optional["SpanRecorder"] = None @@ -57,6 +59,12 @@ class SpanEndRecord: thread_id: int +@dataclass(frozen=True) +class ClosedSpanRecord: + start: SpanStartRecord + end: SpanEndRecord + + @dataclass(frozen=True) class SpanEventRecord: trace_id: int @@ -78,6 +86,8 @@ def on_span_start(self, record: SpanStartRecord) -> None: ... def on_span_end(self, record: SpanEndRecord) -> None: ... + def on_span_closed(self, record: ClosedSpanRecord) -> None: ... + def on_event(self, record: SpanEventRecord) -> None: ... def shutdown(self) -> None: ... @@ -113,7 +123,12 @@ def parse_backend_names(raw: Optional[str] = None) -> List[str]: else os.environ.get("PROBING_SPAN_BACKENDS", MEMTABLE_BACKEND) ) names = [part.strip().lower() for part in value.split(",") if part.strip()] - return names or [MEMTABLE_BACKEND] + names = [n for n in names if n != NONE_BACKEND] + if not names and value.strip().lower() == NONE_BACKEND: + return [] + if not names: + return [MEMTABLE_BACKEND] + return names def _entry_point_backends() -> Dict[str, Callable[[], SpanBackend]]: @@ -149,7 +164,8 @@ def _build_logger_backend() -> SpanBackend: def _build_otel_backend() -> Optional[SpanBackend]: try: - from opentelemetry import trace # noqa: F401 + # API-only installs (opentelemetry-api) are not enough to export spans. + from opentelemetry.sdk.trace import TracerProvider # noqa: F401 except ImportError: logger.warning( "PROBING_SPAN_BACKENDS includes 'otel' but opentelemetry-sdk is not installed; skipping" @@ -189,7 +205,10 @@ def load_backends(names: Optional[List[str]] = None) -> List[SpanBackend]: out.append(backend) if not out: - out.append(_build_memtable_backend()) + if not wanted: + return [] + if _programmatic_names is None: + out.append(_build_memtable_backend()) return out @@ -201,9 +220,8 @@ class MemtableBackend: def __init__(self, trace_event_cls: Any) -> None: self._TraceEvent = trace_event_cls - def on_span_start(self, record: SpanStartRecord) -> None: - self._TraceEvent.init_table() - self._TraceEvent( + def _start_row(self, record: SpanStartRecord): + return self._TraceEvent( record_type="span_start", trace_id=record.trace_id, span_id=record.span_id, @@ -215,11 +233,10 @@ def on_span_start(self, record: SpanStartRecord) -> None: location=record.location, attributes=record.attributes_json, event_attributes="", - ).save() + ) - def on_span_end(self, record: SpanEndRecord) -> None: - self._TraceEvent.init_table() - self._TraceEvent( + def _end_row(self, record: SpanEndRecord): + return self._TraceEvent( record_type="span_end", trace_id=0, span_id=record.span_id, @@ -231,10 +248,20 @@ def on_span_end(self, record: SpanEndRecord) -> None: location="", attributes="", event_attributes="", - ).save() + ) + + def on_span_start(self, record: SpanStartRecord) -> None: + self._start_row(record).save() + + def on_span_end(self, record: SpanEndRecord) -> None: + self._end_row(record).save() + + def on_span_closed(self, record: ClosedSpanRecord) -> None: + self._TraceEvent.append_many( + [self._start_row(record.start), self._end_row(record.end)] + ) def on_event(self, record: SpanEventRecord) -> None: - self._TraceEvent.init_table() self._TraceEvent( record_type="event", trace_id=record.trace_id, @@ -300,6 +327,10 @@ def on_span_end(self, record: SpanEndRecord) -> None: else: self._log.info("%s← span_id=%s", self._indent(), record.span_id) + def on_span_closed(self, record: ClosedSpanRecord) -> None: + self.on_span_start(record.start) + self.on_span_end(record.end) + def on_event(self, record: SpanEventRecord) -> None: suffix = "" if record.event_attributes_json: @@ -418,26 +449,52 @@ def shutdown(self) -> None: self._parents.clear() +def _span_phase(span: Any) -> str: + return str(getattr(span, "phase", None) or "") + + +def _span_location(span: Any) -> str: + loc = getattr(span, "location", None) + return str(loc) if loc is not None else "" + + +def _parent_id(span: Any) -> int: + pid = span.parent_id + return int(pid if pid is not None else -1) + + +def _thread_id(span: Any) -> int: + return int(getattr(span, "thread_id", 0)) + + class SpanRecorder: """Fan-out span lifecycle records to all enabled backends.""" def __init__(self, backends: List[SpanBackend]) -> None: self._backends = backends + @property + def enabled(self) -> bool: + return bool(self._backends) + @property def backend_names(self) -> List[str]: return [b.name for b in self._backends] def record_span_start(self, span: Any, attrs: dict) -> None: + if not self.enabled: + return record = _span_start_record(span, attrs) self._dispatch("on_span_start", record) def record_span_end(self, span: Any) -> None: + if not self.enabled: + return end_ts = span.end_timestamp or int(time.time_ns()) record = SpanEndRecord( span_id=int(span.span_id), time_ns=int(end_ts), - thread_id=int(getattr(span, "thread_id", 0)), + thread_id=_thread_id(span), ) self._dispatch("on_span_end", record) @@ -451,28 +508,31 @@ def record_closed_span( end_ns: int, attributes_json: str, ) -> None: + if not self.enabled: + return start = SpanStartRecord( trace_id=int(span.trace_id), span_id=int(span.span_id), - parent_id=int(span.parent_id if span.parent_id is not None else -1), + parent_id=_parent_id(span), name=name, phase=phase, time_ns=int(start_ns), - thread_id=int(getattr(span, "thread_id", 0)), - location="", + thread_id=_thread_id(span), + location=_span_location(span), attributes_json=attributes_json, ) end = SpanEndRecord( span_id=int(span.span_id), time_ns=int(end_ns), - thread_id=int(getattr(span, "thread_id", 0)), + thread_id=_thread_id(span), ) - self._dispatch("on_span_start", start) - self._dispatch("on_span_end", end) + self._dispatch_closed(start, end) def record_event( self, span: Any, event_name: str, event_attributes: Optional[list] = None ) -> None: + if not self.enabled: + return record = _event_record(span, event_name, event_attributes) self._dispatch("on_event", record) @@ -487,6 +547,15 @@ def _dispatch(self, method: str, record: Any) -> None: for backend in self._backends: _safe_call(backend, method, record) + def _dispatch_closed(self, start: SpanStartRecord, end: SpanEndRecord) -> None: + closed = ClosedSpanRecord(start=start, end=end) + for backend in self._backends: + if hasattr(backend, "on_span_closed"): + _safe_call(backend, "on_span_closed", closed) + else: + _safe_call(backend, "on_span_start", start) + _safe_call(backend, "on_span_end", end) + def _safe_call(backend: SpanBackend, method: str, record: Any) -> None: try: @@ -496,22 +565,16 @@ def _safe_call(backend: SpanBackend, method: str, record: Any) -> None: def _span_start_record(span: Any, attrs: dict) -> SpanStartRecord: - attrs_json = json.dumps(attrs) if attrs else "" - raw = getattr(span, "phase", None) or "" - phase = raw if raw is not None else "" - location = ( - span.location if hasattr(span, "location") and span.location is not None else "" - ) return SpanStartRecord( trace_id=int(span.trace_id), span_id=int(span.span_id), - parent_id=int(span.parent_id if span.parent_id is not None else -1), + parent_id=_parent_id(span), name=str(span.name), - phase=str(phase), + phase=_span_phase(span), time_ns=int(span.start_timestamp), - thread_id=int(getattr(span, "thread_id", 0)), - location=str(location), - attributes_json=attrs_json, + thread_id=_thread_id(span), + location=_span_location(span), + attributes_json=json.dumps(attrs) if attrs else "", ) @@ -525,22 +588,16 @@ def _event_record( attrs_dict.update(attr_item) elif isinstance(attr_item, (list, tuple)) and len(attr_item) == 2: attrs_dict[attr_item[0]] = attr_item[1] - event_attrs_json = json.dumps(attrs_dict) if attrs_dict else "" - raw = getattr(span, "phase", None) or "" - phase = raw if raw is not None else "" - location = ( - span.location if hasattr(span, "location") and span.location is not None else "" - ) return SpanEventRecord( trace_id=int(span.trace_id), span_id=int(span.span_id), - parent_id=int(span.parent_id if span.parent_id is not None else -1), - phase=str(phase), - location=str(location), + parent_id=_parent_id(span), + phase=_span_phase(span), + location=_span_location(span), name=str(event_name), time_ns=int(time.time_ns()), - thread_id=int(getattr(span, "thread_id", 0)), - event_attributes_json=event_attrs_json, + thread_id=_thread_id(span), + event_attributes_json=json.dumps(attrs_dict) if attrs_dict else "", ) @@ -551,6 +608,11 @@ def get_recorder(*, reset: bool = False) -> SpanRecorder: return _recorder +def persistence_enabled() -> bool: + """True when at least one span backend will receive lifecycle records.""" + return get_recorder().enabled + + def _reset_recorder() -> None: """Drop cached recorder instance.""" global _recorder diff --git a/python/probing/tracing/coordinates.py b/python/probing/tracing/coordinates.py index fe12b6a3..1049cacd 100644 --- a/python/probing/tracing/coordinates.py +++ b/python/probing/tracing/coordinates.py @@ -36,10 +36,13 @@ def __call__( set_micro_batches(micro_batches) if value is not None: sync_micro_step(value) + _invalidate_coords_cache() return if micro_batches is not None: + _invalidate_coords_cache() return advance_micro_step() + _invalidate_coords_cache() @property def micro_step(self) -> int: @@ -82,12 +85,40 @@ def row_fields(snapshot=None) -> dict: return {key: fields.get(key, default) for key, default in _ROW_DEFAULTS.items()} +def reset_span_attrs_cache() -> None: + """Drop cached step coordinates (tests / simulated rank changes).""" + _invalidate_coords_cache() + + +def _invalidate_coords_cache() -> None: + global _CACHED_STEP_FIELDS + _CACHED_STEP_FIELDS = None + + +_CACHED_STEP_FIELDS: Optional[dict] = None + + +def _base_coords() -> dict: + """Step + parallel fields for span/table rows. + + Step coordinates are cached until ``probing.step()`` advances. Parallel + topology and simulated rank overrides (tests) must stay fresh, so TP/PP/DP + are re-read every call and rank env fixtures invalidate the step cache. + """ + global _CACHED_STEP_FIELDS + from probing.parallel import parallel_fields + + if _CACHED_STEP_FIELDS is None: + _CACHED_STEP_FIELDS = step_fields(step.snapshot()) + return {**_CACHED_STEP_FIELDS, **parallel_fields()} + + def span_attrs(user: dict, *, source: str = "manual") -> dict: """Merge user attrs with step coordinates, topology, and source label.""" + base = _base_coords() + if not user: + return {**base, "source": source} merged = dict(user) merged.setdefault("source", source) - merged.update(step_fields(step.snapshot())) - from probing.parallel import parallel_fields - - merged.update(parallel_fields()) + merged.update(base) return merged diff --git a/python/probing/tracing/hooks.py b/python/probing/tracing/hooks.py index 7d1bcec7..6e56d030 100644 --- a/python/probing/tracing/hooks.py +++ b/python/probing/tracing/hooks.py @@ -17,17 +17,33 @@ def __init__(self, model, optimizer) -> None: self.model = model self.optimizer = optimizer self._handles: list = [] + # Lazily cached ``id()`` of the root and every submodule. The module tree + # is static during a training run, so build once instead of rescanning + # ``model.modules()`` on every ``owns_training_phases`` call (that scan is + # O(modules) per module-hook → O(modules^2) per step on large models). + self._member_ids: Optional[frozenset[int]] = None + + def contains_module(self, mid: int) -> bool: + ids = self._member_ids + if ids is None: + ids = frozenset(id(sub) for sub in self.model.modules()) + self._member_ids = ids + return mid in ids def install(self) -> None: if self._handles: return m = self.model opt = self.optimizer + # No module backward hooks: PyTorch's shared ``BackwardHook`` machinery + # (used by both ``register_full_backward_hook`` and its ``_pre`` variant) + # spams a UserWarning every step when the root model's inputs need no grad, + # and fires at backward *start* anyway. Instead we arm a one-shot tensor + # hook on the forward output to mark BACKWARD start, and close BACKWARD at + # the next forward (grad accumulation) or the optimizer step. self._handles = [ m.register_forward_pre_hook(self._forward_pre), m.register_forward_hook(self._forward_post), - m.register_full_backward_pre_hook(self._backward_pre), - m.register_full_backward_hook(self._backward_post), opt.register_step_pre_hook(self._step_pre), opt.register_step_post_hook(self._step_post), ] @@ -39,22 +55,46 @@ def uninstall(self) -> None: except Exception: pass self._handles.clear() + self._member_ids = None def _forward_pre(self, module, _inputs) -> None: if module.training: + # Close a prior micro-step's backward (grad accumulation) before the + # next forward opens; no-op on the first forward of an iteration. + hook_exit(BACKWARD) hook_enter(FORWARD) - def _forward_post(self, module, _inputs, _output) -> None: + def _forward_post(self, module, _inputs, output) -> None: if module.training: hook_exit(FORWARD) - - def _backward_pre(self, _module, _grad_output) -> None: + self._arm_backward_enter(output) + + def _arm_backward_enter(self, output) -> None: + """Mark BACKWARD start via tensor hooks on grad-bearing forward outputs. + + Tensor ``register_hook`` avoids PyTorch's module ``BackwardHook`` warning; + ``_on_output_grad`` opening BACKWARD is idempotent so registering on every + grad-bearing output is safe (the earliest grad wins). + """ + import torch + + stack = [output] + while stack: + item = stack.pop() + if isinstance(item, torch.Tensor): + if item.requires_grad: + item.register_hook(self._on_output_grad) + elif isinstance(item, (tuple, list)): + stack.extend(item) + elif isinstance(item, dict): + stack.extend(item.values()) + + def _on_output_grad(self, grad): hook_enter(BACKWARD) - - def _backward_post(self, _module, _inputs, _grad_output) -> None: - hook_exit(BACKWARD) + return grad def _step_pre(self, _optimizer, _args, _kwargs) -> None: + hook_exit(BACKWARD) hook_enter(OPTIMIZER) def _step_post(self, _optimizer, _args, _kwargs) -> None: @@ -93,14 +133,7 @@ def owns_training_phases(*, model=None, optimizer=None, module=None) -> bool: return any(k[1] == oid for k in _REGISTRY) if module is not None: mid = id(module) - for tracker in _REGISTRY.values(): - root = tracker.model - if mid == id(root): - return True - for sub in root.modules(): - if id(sub) == mid: - return True - return False + return any(tracker.contains_module(mid) for tracker in _REGISTRY.values()) return bool(_REGISTRY) diff --git a/python/probing/tracing/phases.py b/python/probing/tracing/phases.py index 637b768f..f049fce5 100644 --- a/python/probing/tracing/phases.py +++ b/python/probing/tracing/phases.py @@ -27,11 +27,14 @@ {"train.step", "model.init", "data.load", "checkpoint.save"} ) -# --- Composability: who may emit a phase span (higher suppresses lower) --- +# Who emitted a span (for composability / dedup). SOURCE_MANUAL = "manual" SOURCE_PHASE_HOOK = "phase_hook" SOURCE_TORCH_PROBE = "torch_probe" +_hook_spans: dict[str, object] = {} +_iteration_start_ns: Optional[int] = None + def infer(name: str) -> Optional[str]: if not name or name in _NON_PHASE_NAMES: @@ -85,12 +88,6 @@ def is_training_phase(value: Optional[str]) -> bool: return value in ALL -# --- Runtime coordination (hook + span stack) --- - -_hook_spans: dict[str, object] = {} -_iteration_start_ns: Optional[int] = None - - def phase() -> str: """Current training phase from the innermost active phase span, else ``idle``.""" from probing.tracing._bindings import active_training_phase @@ -100,43 +97,36 @@ def phase() -> str: def reset_phase() -> None: - """Reset coordinator state (tests).""" + """Reset coordinator state (tests). Closes any hook spans left open.""" global _iteration_start_ns - _hook_spans.clear() + while _hook_spans: + _, handle = _hook_spans.popitem() + try: + handle.__exit__(None, None, None) + except Exception: + pass _iteration_start_ns = None -def on_span_enter(name: str, span_phase: Optional[str], source: str) -> None: - """Reserved for span lifecycle hooks; phase is derived from the span stack.""" - del name, span_phase, source - - -def on_span_exit(name: str, span_phase: Optional[str], source: str) -> None: - """Reserved for span lifecycle hooks; phase is derived from the span stack.""" - del name, span_phase, source - - def hook_enter(span_phase: str) -> None: global _iteration_start_ns if span_phase == FORWARD and _iteration_start_ns is None: _iteration_start_ns = time.time_ns() - if _phase_tracked(span_phase, by_source=SOURCE_PHASE_HOOK): - return - if span_phase in _hook_spans: + if _active_phase_span(span_phase) or span_phase in _hook_spans: return import probing - cm = probing.span(phase=span_phase, source=SOURCE_PHASE_HOOK) - cm.__enter__() - _hook_spans[span_phase] = cm + handle = probing.span(phase=span_phase, source=SOURCE_PHASE_HOOK) + handle.__enter__() + _hook_spans[span_phase] = handle def hook_exit(span_phase: str) -> None: if span_phase == OPTIMIZER: _record_train_step() - cm = _hook_spans.pop(span_phase, None) - if cm is not None: - cm.__exit__(None, None, None) + handle = _hook_spans.pop(span_phase, None) + if handle is not None: + handle.__exit__(None, None, None) def _record_train_step() -> None: @@ -166,9 +156,7 @@ def _record_train_step() -> None: ) -def _phase_tracked(span_phase: str, *, by_source: str) -> bool: - """True when an active span already carries this training phase.""" - del by_source +def _active_phase_span(span_phase: str) -> bool: from probing.tracing._bindings import active_span_by_phase return active_span_by_phase(span_phase) is not None diff --git a/python/probing/tracing/span.py b/python/probing/tracing/span.py index 248739ee..3fa9f2d3 100644 --- a/python/probing/tracing/span.py +++ b/python/probing/tracing/span.py @@ -7,6 +7,8 @@ import json import os import time +import warnings +from dataclasses import dataclass from typing import Callable, Optional from probing.tracing._bindings import ( @@ -17,13 +19,51 @@ ) from probing.tracing.coordinates import span_attrs, step from probing.tracing.phases import OPTIMIZER, resolve_span -from probing.tracing.table import TraceEvent _LOCATION_ENV = frozenset({"1", "true", "yes", "on"}) +# Rust Span cannot hold arbitrary Python attrs; track deferred persistence by id. +_DEFERRED: dict[int, "_DeferredState"] = {} + + +@dataclass +class _DeferredState: + merged: dict + start_persisted: bool = False + + +def _recorder(): + from probing.tracing.backends import get_recorder + + return get_recorder() + + +def _persistence_enabled() -> bool: + from probing.tracing.backends import persistence_enabled + + return persistence_enabled() + + +def _spawn_span( + name: str, phase: Optional[str], *, location: Optional[str] = None +) -> Span: + parent = current_span() + if parent: + return Span.new_child(parent, name, phase=phase, location=location) + return Span(name, phase=phase, location=location) + + +def _attach_attrs(span_obj: Span, attrs: dict) -> None: + if not attrs or not hasattr(span_obj, "_set_initial_attrs"): + return + try: + span_obj._set_initial_attrs(dict(attrs)) + except Exception as exc: + warnings.warn(f"Failed to set initial attributes: {exc}") + class _RecordedSpan: - """Context manager: span stack + backend persistence.""" + """Context manager: span stack + backend persistence on close.""" def __init__( self, @@ -41,63 +81,114 @@ def __init__( self.attrs = dict(attrs or {}) self.source = source self._auto_location = auto_location - self._span = None + self._span: Optional[Span] = None self._reentrant = False self._owns_step_advance = False + self._persist = False + self._merged: dict = {} - def __enter__(self): + def __enter__(self) -> Span: if self.phase == OPTIMIZER: existing = active_span_by_phase(OPTIMIZER) - if existing is not None: + if existing is not None and not getattr(existing, "is_ended", False): self._span = existing self._reentrant = True return existing - loc = self.location - if loc is None and self._auto_location: - loc = _caller_location() - merged = span_attrs(self.attrs, source=self.source) - self._span = _create_span(self.name, self.phase, loc, merged) - self._span.__enter__() - _persist_span_start(self._span, merged) + location = self.location + if location is None and self._auto_location: + location = _caller_location() + + self._persist = _persistence_enabled() + self._merged = ( + span_attrs(self.attrs, source=self.source) if self._persist else {} + ) + + span_obj = _spawn_span(self.name, self.phase, location=location) + _attach_attrs(span_obj, self._merged) + span_obj.__enter__() + self._span = span_obj + + if self._persist: + _DEFERRED[int(span_obj.span_id)] = _DeferredState(merged=self._merged) if self.phase == OPTIMIZER: self._owns_step_advance = True - return self._span + return span_obj - def __exit__(self, exc_type, exc_val, exc_tb): + def __exit__(self, exc_type, exc_val, exc_tb) -> bool: if self._span is None or self._reentrant: return False + result = self._span.__exit__(exc_type, exc_val, exc_tb) - _persist_span_end(self._span) + state = _DEFERRED.pop(int(self._span.span_id), None) + if state is not None: + _persist_on_close(self._span, state) if self._owns_step_advance: step() return result -def _create_span(name: str, phase: Optional[str], location: Optional[str], attrs: dict): - parent = current_span() - if parent: - span_obj = Span.new_child(parent, name, phase=phase, location=location) - else: - span_obj = Span(name, phase=phase, location=location) - if attrs and hasattr(span_obj, "_set_initial_attrs"): - try: - span_obj._set_initial_attrs(dict(attrs)) - except Exception as e: - import warnings +class _SpanHandle: + """Deferred ``probing.span()`` entry (context manager or decorator).""" + + def __init__( + self, + name: str, + phase: Optional[str], + location: Optional[str], + attrs: dict, + source: str, + auto_location: bool, + ) -> None: + self._name = name + self._phase = phase + self._location = location + self._attrs = attrs + self._source = source + self._auto_location = auto_location + self._inner: Optional[_RecordedSpan] = None + + def _make_cm(self) -> _RecordedSpan: + return _RecordedSpan( + self._name, + phase=self._phase, + location=self._location, + attrs=self._attrs, + source=self._source, + auto_location=self._auto_location, + ) + + def __call__(self, func: Callable) -> Callable: + @functools.wraps(func) + def wrapper(*args, **kwargs): + with self._make_cm(): + return func(*args, **kwargs) + + return wrapper + + def __enter__(self) -> Span: + self._inner = self._make_cm() + return self._inner.__enter__() + + def __exit__(self, *exc) -> bool: + if self._inner is None: + return False + return self._inner.__exit__(*exc) - warnings.warn(f"Failed to set initial attributes: {e}") - return span_obj + def __getattr__(self, attr: str): + if self._inner is not None: + return getattr(self._inner, attr) + raise AttributeError(attr) def _caller_location() -> Optional[str]: - """Walk ``inspect.stack()`` for the first frame outside ``probing/tracing``.""" + """First stack frame outside ``probing/tracing``.""" try: - for frame_info in inspect.stack()[2:]: - path = frame_info.filename.replace("\\", "/") + for frame in inspect.stack()[2:]: + path = frame.filename.replace("\\", "/") if "probing/tracing" in path: continue - return f"{frame_info.filename}:{frame_info.function}:{frame_info.lineno}" + return f"{frame.filename}:{frame.function}:{frame.lineno}" except Exception: pass return None @@ -107,9 +198,9 @@ def _location_enabled() -> bool: return os.environ.get("PROBING_SPAN_LOCATION", "").lower() in _LOCATION_ENV -def _span_options( +def _parse_span_kwargs( kwargs: dict, -) -> tuple[str, Optional[str], str, Optional[str], dict, bool]: +) -> tuple[Optional[str], str, Optional[str], dict, bool]: phase = kwargs.pop("phase", None) source = kwargs.pop("source", "manual") location = kwargs.pop("location", None) @@ -117,61 +208,15 @@ def _span_options( return phase, source, location, kwargs, auto_location -def _make_handle( +def _handle( name: str, phase: Optional[str], location: Optional[str], attrs: dict, source: str, auto_location: bool, -): - class SpanHandle: - def __init__(self): - self.name = name - self.phase = phase - self.location = location - self.source = source - self.attrs = attrs - self._auto_location = auto_location - self._inner = None - - def __call__(self, func: Callable) -> Callable: - @functools.wraps(func) - def wrapper(*wargs, **wkwargs): - with _RecordedSpan( - self.name, - phase=self.phase, - location=self.location, - attrs=self.attrs, - source=self.source, - auto_location=self._auto_location, - ): - return func(*wargs, **wkwargs) - - return wrapper - - def __enter__(self): - self._inner = _RecordedSpan( - self.name, - phase=self.phase, - location=self.location, - attrs=self.attrs, - source=self.source, - auto_location=self._auto_location, - ) - return self._inner.__enter__() - - def __exit__(self, *exc): - if self._inner: - return self._inner.__exit__(*exc) - return False - - def __getattr__(self, attr): - if self._inner is not None: - return getattr(self._inner, attr) - raise AttributeError(attr) - - return SpanHandle() +) -> _SpanHandle: + return _SpanHandle(name, phase, location, attrs, source, auto_location) def span(*args, **kwargs): @@ -186,62 +231,38 @@ def span(*args, **kwargs): Auto ``location`` via ``inspect.stack()`` is off by default; set ``PROBING_SPAN_LOCATION=1`` or pass ``location=...`` explicitly. """ - phase_kw, source, location, attrs, auto_location = _span_options(dict(kwargs)) - - if len(args) == 1 and isinstance(args[0], str): - name_kw = args[0] - name, phase = resolve_span(name_kw, phase_kw) - return _make_handle(name, phase, location, attrs, source, auto_location) - - if len(args) == 0: - if phase_kw is not None: - name, phase = resolve_span(None, phase_kw) - return _make_handle(name, phase, location, attrs, source, auto_location) - if not attrs: - - def decorator(func: Callable) -> Callable: - resolved_name, resolved_phase = resolve_span(func.__name__, None) - return _make_handle( - resolved_name, - resolved_phase, - location, - {}, - source, - auto_location, - )(func) - - return decorator - raise TypeError("span() requires name and/or phase") + phase_kw, source, location, attrs, auto_location = _parse_span_kwargs(dict(kwargs)) + + if len(args) > 1: + raise TypeError("span() takes at most one positional argument") if len(args) == 1 and callable(args[0]): - func = args[0] - resolved_name, resolved_phase = resolve_span(func.__name__, phase_kw) + name, phase = resolve_span(args[0].__name__, phase_kw) + return _handle(name, phase, location, attrs, source, auto_location)(args[0]) - @functools.wraps(func) - def wrapper(*wargs, **wkwargs): - with _RecordedSpan( - resolved_name, - phase=resolved_phase, - location=location, - attrs=attrs, - source=source, - auto_location=auto_location, - ): - return func(*wargs, **wkwargs) + if len(args) == 1: + if not isinstance(args[0], str): + raise TypeError( + f"span() first argument must be str or callable, got {type(args[0]).__name__}" + ) + name, phase = resolve_span(args[0], phase_kw) + return _handle(name, phase, location, attrs, source, auto_location) - return wrapper + if phase_kw is not None: + name, phase = resolve_span(None, phase_kw) + return _handle(name, phase, location, attrs, source, auto_location) - if len(args) == 1: - raise TypeError( - f"span() first argument must be str or callable, got {type(args[0]).__name__}" - ) - if len(args) > 1: - raise TypeError("span() takes at most one positional argument") + if attrs: + raise TypeError("span() requires name and/or phase") - raise TypeError("span() requires at least one argument") + def decorator(func: Callable) -> Callable: + name, phase = resolve_span(func.__name__, None) + return _handle(name, phase, location, {}, source, auto_location)(func) + return decorator -def event(name: str, *, attributes: Optional[list] = None): + +def event(name: str, *, attributes: Optional[list] = None) -> None: """Add a point event on the active span.""" current = active_span_for_events() or current_span() if current is None or getattr(current, "is_ended", False): @@ -258,26 +279,18 @@ def record_span( source: str = "manual", ) -> None: """Record a completed span without entering the span stack (hot path).""" - if duration_ns < 0: - duration_ns = 0 + recorder = _recorder() + if not recorder.enabled: + return - TraceEvent.init_table() + duration_ns = max(duration_ns, 0) merged = span_attrs(dict(attrs or {}), source=source) end_ns = int(time.time_ns()) start_ns = end_ns - duration_ns resolved_name, resolved_phase = resolve_span(name, phase) - parent = current_span() - if parent: - span_obj = Span.new_child( - parent, resolved_name, phase=resolved_phase, location="" - ) - else: - span_obj = Span(resolved_name, phase=resolved_phase, location="") - - from probing.tracing.backends import get_recorder - - get_recorder().record_closed_span( + span_obj = _spawn_span(resolved_name, resolved_phase, location="") + recorder.record_closed_span( span_obj, name=resolved_name, phase=resolved_phase or "", @@ -287,24 +300,54 @@ def record_span( ) -def _persist_span_start(span: Span, attrs: dict) -> None: - from probing.tracing.backends import get_recorder +def _persist_on_close(span: Span, state: _DeferredState) -> None: + if state.start_persisted: + _persist_span_end(span) + else: + _persist_closed(span, state.merged) - get_recorder().record_span_start(span, attrs) +def _persist_span_start(span: Span, attrs: dict) -> None: + recorder = _recorder() + if not recorder.enabled: + return + recorder.record_span_start(span, attrs) + state = _DEFERRED.get(int(span.span_id)) + if state is not None: + state.start_persisted = True -def _persist_span_end(span: Span) -> None: - from probing.tracing.backends import get_recorder - get_recorder().record_span_end(span) +def _persist_span_end(span: Span) -> None: + recorder = _recorder() + if recorder.enabled: + recorder.record_span_end(span) + + +def _persist_closed(span: Span, attrs: dict) -> None: + recorder = _recorder() + if not recorder.enabled: + return + phase = getattr(span, "phase", None) or "" + recorder.record_closed_span( + span, + name=str(span.name), + phase=str(phase), + start_ns=int(span.start_timestamp), + end_ns=int(span.end_timestamp or time.time_ns()), + attributes_json=json.dumps(attrs) if attrs else "", + ) def _persist_event( span: Span, event_name: str, event_attributes: Optional[list] = None ) -> None: - from probing.tracing.backends import get_recorder - - get_recorder().record_event(span, event_name, event_attributes) + recorder = _recorder() + if not recorder.enabled: + return + state = _DEFERRED.get(int(span.span_id)) + if state is not None and not state.start_persisted: + _persist_span_start(span, state.merged) + recorder.record_event(span, event_name, event_attributes) if Span: diff --git a/python/probing/tracing/table.py b/python/probing/tracing/table.py index c54be71c..0a4a19de 100644 --- a/python/probing/tracing/table.py +++ b/python/probing/tracing/table.py @@ -16,9 +16,9 @@ COALESCE(s.parent_id, -1) AS parent_span_id, s.name, s.phase, - CAST(s.time / 1000 AS BIGINT) AS start_us, - CAST(e.time / 1000 AS BIGINT) AS end_us, - CAST((e.time - s.time) / 1000 AS BIGINT) AS duration_us, + CAST(CAST(s.time AS BIGINT) / 1000 AS BIGINT) AS start_us, + CAST(CAST(e.time AS BIGINT) / 1000 AS BIGINT) AS end_us, + CAST((CAST(e.time AS BIGINT) - CAST(s.time AS BIGINT)) / 1000 AS BIGINT) AS duration_us, s.thread_id, s.location, s.attributes diff --git a/python/probing/util/__init__.py b/python/probing/util/__init__.py new file mode 100644 index 00000000..13d5d5e4 --- /dev/null +++ b/python/probing/util/__init__.py @@ -0,0 +1,5 @@ +"""Small shared helpers for the Python runtime.""" + +from probing.util.env import FALSE_VALUES, TRUE_VALUES, parse_bool_flag + +__all__ = ["FALSE_VALUES", "TRUE_VALUES", "parse_bool_flag"] diff --git a/python/probing/util/env.py b/python/probing/util/env.py new file mode 100644 index 00000000..eb9bd805 --- /dev/null +++ b/python/probing/util/env.py @@ -0,0 +1,20 @@ +"""Parse common truthy/falsey environment and config strings.""" + +from __future__ import annotations + +from typing import Optional + +TRUE_VALUES = frozenset({"1", "true", "yes", "on", "enable", "enabled"}) +FALSE_VALUES = frozenset({"0", "false", "no", "off", "disable", "disabled"}) + + +def parse_bool_flag(value: Optional[str]) -> Optional[bool]: + """Return True/False for known tokens; None when unset or unrecognized.""" + if value is None: + return None + normalized = str(value).strip().lower() + if normalized in TRUE_VALUES: + return True + if normalized in FALSE_VALUES: + return False + return None diff --git a/scripts/install-nightly.sh b/scripts/install-nightly.sh new file mode 100755 index 00000000..dfaee8d0 --- /dev/null +++ b/scripts/install-nightly.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +# Install the latest probing nightly wheel from GitHub Releases (tag: nightly). +# +# Usage: +# curl -fsSL https://raw.githubusercontent.com/DeepLink-org/probing/main/scripts/install-nightly.sh | bash +# PROBING_GITHUB_REPO=DeepLink-org/probing PROBING_NIGHTLY_TAG=nightly ./scripts/install-nightly.sh +# +# Environment: +# PYTHON Python interpreter (default: python3) +# PROBING_GITHUB_REPO owner/repo (default: DeepLink-org/probing) +# PROBING_NIGHTLY_TAG release tag (default: nightly) + +set -euo pipefail + +REPO="${PROBING_GITHUB_REPO:-DeepLink-org/probing}" +TAG="${PROBING_NIGHTLY_TAG:-nightly}" +PYTHON="${PYTHON:-python3}" + +if ! command -v "$PYTHON" >/dev/null 2>&1; then + echo "error: Python not found ($PYTHON)" >&2 + exit 1 +fi + +case "$(uname -s)-$(uname -m)" in + Linux-x86_64) platform_re='manylinux.*x86_64' ;; + Linux-aarch64) platform_re='manylinux.*aarch64' ;; + Darwin-arm64) platform_re='macosx.*arm64' ;; + Darwin-x86_64) platform_re='macosx.*x86_64' ;; + *) + echo "error: unsupported platform $(uname -s)-$(uname -m)" >&2 + exit 1 + ;; +esac + +py_tag="$("$PYTHON" -c 'import sys; print(f"cp{sys.version_info.major}{sys.version_info.minor}")')" +min_py="$("$PYTHON" -c 'import sys; print(sys.version_info.major * 10 + sys.version_info.minor)')" +if [ "$min_py" -lt 38 ]; then + echo "error: probing wheels require Python 3.8+ (abi3); got $("$PYTHON" --version)" >&2 + exit 1 +fi +api="https://api.github.com/repos/${REPO}/releases/tags/${TAG}" + +echo "Fetching nightly release assets from ${REPO} (tag=${TAG})..." >&2 + +url="$("$PYTHON" - <&2 +exec "$PYTHON" -m pip install --upgrade pip +"$PYTHON" -m pip install --force-reinstall "$url" +"$PYTHON" -c "import probing; print('probing', probing.VERSION)" diff --git a/tests/fixtures/skill_derived_variables.yaml b/tests/fixtures/skill_derived_variables.yaml index 6a4c9d21..210a07e3 100644 --- a/tests/fixtures/skill_derived_variables.yaml +++ b/tests/fixtures/skill_derived_variables.yaml @@ -1,6 +1,7 @@ -# Cross-language parity fixture for skill template variables. -# Keep in sync with probing/cli/src/cli/skill/loader.rs::derive_variables -# and python/probing/skills/loader.py::derived_variables. +# Derived template variables for skill SQL expansion — Rust SSOT +# (`probing-skills/src/loader.rs` + `tests` in that module). +# Keep this fixture aligned with `loader.rs::derived_variables_fixture` +# when changing table names (Rust SSOT). cases: - name: local diff --git a/tests/fixtures/skill_interpret_parity.yaml b/tests/fixtures/skill_interpret_parity.yaml index 6b46d314..f33bc6db 100644 --- a/tests/fixtures/skill_interpret_parity.yaml +++ b/tests/fixtures/skill_interpret_parity.yaml @@ -1,5 +1,6 @@ -# Shared interpretation rule cases — Python tests load this file; -# Rust mirrors the same scenarios in interpret.rs unit tests. +# Interpretation rule golden cases — Rust SSOT (`probing-skills/src/interpret.rs`). +# Python discovery/loader tests live under tests/unit/probing/skills/; rule +# evaluation is not duplicated in Python. cases: - name: rows_zero diff --git a/tests/regression/ext/test_parallel_topology.py b/tests/regression/ext/test_parallel_topology.py index 213a2210..d958dffb 100644 --- a/tests/regression/ext/test_parallel_topology.py +++ b/tests/regression/ext/test_parallel_topology.py @@ -20,6 +20,9 @@ def _clear_parallel_env(monkeypatch): ] for key in keys: monkeypatch.delenv(key, raising=False) + from probing.parallel import reset_parallel_fields_cache + + reset_parallel_fields_cache() yield diff --git a/tests/regression/profiling/test_span_overhead.py b/tests/regression/profiling/test_span_overhead.py new file mode 100644 index 00000000..3e2e9596 --- /dev/null +++ b/tests/regression/profiling/test_span_overhead.py @@ -0,0 +1,129 @@ +"""Regression: span emission overhead stays bounded when backends are enabled.""" + +from __future__ import annotations + +import statistics +import time + +import pytest + +import probing +from probing.profiling.torch_probe import ( + DelayedRecord, + TorchProbe, + TorchProbeConfig, + TorchStepTiming, +) +from probing.tracing import TraceEvent, bind_table, reset_backends +from probing.tracing.backends import configure as configure_backends +from probing.tracing.phases import FORWARD + + +class _FakeMod: + pass + + +@pytest.fixture(autouse=True) +def _tracing_tables(): + reset_backends(clear_registered=True) + probing.step(0) + probing.step(micro_batches=1) + try: + TraceEvent.drop() + except Exception: + pass + TraceEvent.init_table() + bind_table(TraceEvent) + yield + reset_backends(clear_registered=True) + + +def _run_manual_spans(*, backends: list[str], iterations: int) -> float: + configure_backends(backends) + probing.step(0) + started = time.perf_counter() + for i in range(iterations): + with probing.span(f"iter-{i}", phase=FORWARD, source="test"): + pass + return time.perf_counter() - started + + +def test_manual_span_memtable_overhead_bounded(): + """``probing.span`` with memtable backend should not dominate a tight loop.""" + iterations = 300 + off = _run_manual_spans(backends=[], iterations=iterations) + on = _run_manual_spans(backends=["memtable"], iterations=iterations) + + # Guard against flaky CI: allow generous headroom but catch regressions + # where span persistence becomes orders of magnitude slower. + assert ( + on < off * 8.0 + 0.05 + ), f"memtable spans too slow: off={off:.4f}s on={on:.4f}s ratio={on / max(off, 1e-9):.2f}" + + +def _make_tracer(*, trace_spans: bool) -> tuple[TorchProbe, _FakeMod]: + cfg = TorchProbeConfig.parse("on,shadow=off") + cfg.trace_spans = trace_spans + tracer = TorchProbe(config=cfg) + tracer.finalized = True + tracer.sampled_step = True + tracer.has_backend = False + root = _FakeMod() + tracer.mod_names = {id(root): "model"} + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + tracer._step_cycle = 0 + tracer._refresh_shadow_flag() + return tracer, root + + +def test_torch_probe_module_spans_overhead_bounded(monkeypatch): + """TorchProbe per-module spans should add modest wall time vs hooks-only.""" + captured: list[float] = [] + + def _capture_timing(self): + captured.append(self.step_duration_sec) + + monkeypatch.setattr(TorchStepTiming, "save", _capture_timing) + monkeypatch.setattr(DelayedRecord, "save", lambda self: None) + + configure_backends(["memtable"]) + + tracer_off, root = _make_tracer(trace_spans=False) + probing.step(0) + for _ in range(20): + tracer_off._mark_step_wall_start() + tracer_off.log_module_stage("pre forward", root) + tracer_off.log_module_stage("post forward", root) + tracer_off.post_step_hook(None, (), {}) + off_samples = captured.copy() + captured.clear() + + tracer_on, root = _make_tracer(trace_spans=True) + probing.step(0) + for _ in range(20): + tracer_on._mark_step_wall_start() + tracer_on.log_module_stage("pre forward", root) + tracer_on.log_module_stage("post forward", root) + tracer_on.post_step_hook(None, (), {}) + on_samples = captured + + assert len(off_samples) == 20 + assert len(on_samples) == 20 + + med_off = statistics.median(off_samples) + med_on = statistics.median(on_samples) + assert med_on < med_off * 6.0 + 0.02, ( + f"module spans too slow: off={med_off:.6f}s on={med_on:.6f}s " + f"ratio={med_on / max(med_off, 1e-9):.2f}" + ) + + +def test_trace_spans_config_parse(): + cfg = TorchProbeConfig.parse("on,trace_spans=off,shadow=off") + assert cfg.enabled + assert not cfg.trace_spans + cfg2 = TorchProbeConfig.parse("on,spans=0") + assert not cfg2.trace_spans diff --git a/tests/regression/profiling/test_torch_probe_sampling.py b/tests/regression/profiling/test_torch_probe_sampling.py index 892f092c..e7f89572 100644 --- a/tests/regression/profiling/test_torch_probe_sampling.py +++ b/tests/regression/profiling/test_torch_probe_sampling.py @@ -1,6 +1,16 @@ """TorchProbe sampling: anchor pre/post pairing and step cleanup.""" -from probing.profiling.torch_probe import TorchProbe, TorchProbeConfig +import time + +from probing.profiling.torch_probe import ( + DEFAULT_SAMPLE_RATE, + DEFAULT_SHADOW_BASELINE, + DEFAULT_SHADOW_NORMAL, + TorchProbe, + TorchProbeConfig, + configure, + shadow_step_in_cycle, +) def _reset_hook_offset(tracer: TorchProbe) -> None: @@ -17,16 +27,16 @@ class _FakeMod: pass -def _ready_tracer(curr_mod=None): +def _ready_tracer(layer_rate: float = 1.0): tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) tracer.finalized = True tracer.sampled_step = True + tracer.layer_rate = layer_rate tracer.mod_names = {} root = _FakeMod() other = _FakeMod() tracer.mod_names[id(root)] = "model" tracer.mod_names[id(other)] = "model.features.conv" - tracer.curr_mod = curr_mod if curr_mod is not None else id(other) tracer._open_spans = {} tracer.pending = [] tracer.events = {} @@ -34,9 +44,128 @@ def _ready_tracer(curr_mod=None): return tracer, root, other -def test_anchor_pre_always_pairs_post_when_curr_mod_differs(): - tracer, root, other = _ready_tracer() - tracer.curr_mod = id(other) +def test_configure_works_without_torch_installed(): + """SET probing.torch.profiling=on must succeed before torch is imported.""" + cfg = configure("on") + assert cfg.enabled + assert cfg.rate == DEFAULT_SAMPLE_RATE + + +def test_default_sample_rate_is_five_percent(): + assert TorchProbeConfig.parse("on").rate == DEFAULT_SAMPLE_RATE + assert DEFAULT_SAMPLE_RATE == 0.05 + + +def test_default_shadow_cadence_is_four_to_one(): + cfg = TorchProbeConfig.parse("on") + assert cfg.shadow_normal == DEFAULT_SHADOW_NORMAL == 4 + assert cfg.shadow_baseline == DEFAULT_SHADOW_BASELINE == 1 + assert cfg.shadow_enabled + + +def test_shadow_spec_parse_and_disable(): + cfg = TorchProbeConfig.parse("on,shadow=8:2") + assert cfg.shadow_normal == 8 + assert cfg.shadow_baseline == 2 + cfg.apply_shadow_spec("off") + assert not cfg.shadow_enabled + + +def test_shadow_step_in_cycle_pattern(): + assert [shadow_step_in_cycle(i) for i in range(10)] == [ + False, + False, + False, + False, + True, + False, + False, + False, + False, + True, + ] + + +def test_shadow_step_skips_forward_hooks(): + tracer, root, _ = _ready_tracer() + tracer.shadow_step = True + tracer.pre_forward_hook(root, None) + tracer.post_forward_hook(root, None, None) + assert tracer._module_call_offset == 0 + assert not tracer._open_spans + assert not tracer.pending + + +def test_record_step_timing_writes_shadow_and_probed(monkeypatch): + saved = [] + + def _capture_save(self): + saved.append( + ( + self.is_shadow, + self.sampled, + self.step_duration_sec, + self.shadow_normal, + self.shadow_baseline, + ) + ) + + monkeypatch.setattr( + "probing.profiling.torch_probe.TorchStepTiming.save", + _capture_save, + ) + + tracer, _, _ = _ready_tracer() + tracer._mark_step_wall_start() + time.sleep(0.01) + tracer._record_step_timing(is_shadow=False) + tracer._mark_step_wall_start() + time.sleep(0.01) + tracer._record_step_timing(is_shadow=True) + + assert len(saved) == 2 + assert saved[0][0] == 0 + assert saved[0][1] == 1 + assert saved[0][2] > 0 + assert saved[1][0] == 1 + assert saved[1][1] == 0 + assert saved[1][2] > 0 + + +def test_post_step_hook_records_probed_timing_after_flush(monkeypatch): + order = [] + orig_finish = TorchProbe._finish_open_stages + + def track_finish(self): + order.append("finish") + orig_finish(self) + + def track_timing(self, *, is_shadow: bool): + order.append(("timing", is_shadow)) + + monkeypatch.setattr(TorchProbe, "_finish_open_stages", track_finish) + monkeypatch.setattr(TorchProbe, "_record_step_timing", track_timing) + + tracer, root, _ = _ready_tracer() + tracer.shadow_step = False + tracer.has_backend = False + tracer._mark_step_wall_start() + + tracer.log_module_stage("pre forward", root) + tracer.log_module_stage("post forward", root) + + tracer.post_step_hook(None, (), {}) + + assert "finish" in order + timing_events = [e for e in order if isinstance(e, tuple) and e[0] == "timing"] + assert timing_events == [("timing", False)] + # Open stages are flushed before the step's wall timing is recorded. + assert order.index("finish") < order.index(timing_events[0]) + + +def test_anchor_pre_always_pairs_post_even_when_layer_not_sampled(): + # layer_rate=0 → nothing sampled except the offset-0 time anchor. + tracer, root, other = _ready_tracer(layer_rate=0.0) _reset_hook_offset(tracer) tracer.log_module_stage("pre forward", root) @@ -79,14 +208,579 @@ def test_cleanup_step_resources_clears_timers(): assert not tracer.cpu_start -def test_should_sample_anchor_only_on_pre_at_offset_zero(): - tracer, root, other = _ready_tracer() - tracer.curr_mod = id(other) +def test_backward_config_parse_default_off(): + cfg = TorchProbeConfig.parse("on") + assert not cfg.backward + assert not TorchProbeConfig.parse("on,backward=off").backward + assert TorchProbeConfig.parse("on,backward=on").backward + assert TorchProbeConfig.parse("random:1.0,backward=true").backward + + +def test_cpu_fallback_duration_is_positive_seconds(): + """CPU/MPS timing must not mix time.time() with perf_counter().""" + import torch + import torch.nn as nn + + tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) + tracer.finalized = True + tracer.sampled_step = True + tracer.use_gpu_events = False + tracer.has_backend = False + linear = nn.Linear(4, 2) + tracer.mod_names = {id(linear): "linear"} + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + + x = torch.randn(1, 4) + tracer.pre_forward_hook(linear, (x,)) + out = linear(x) + tracer.post_forward_hook(linear, (x,), out) + post = next(p for p in tracer.pending if p.record.stage == "post forward") + post.save() + assert 0.0 < post.record.duration < 1.0 + + +def test_optimizer_step_recorded_every_sampled_step(): + import torch + import torch.nn as nn + + from probing.profiling.types import BaseTracer + + tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) + tracer.finalized = True + tracer.sampled_step = True + tracer.rate = 1.0 + tracer.use_gpu_events = False + tracer.has_backend = False + model = nn.Linear(4, 2) + opt = torch.optim.SGD(model.parameters(), lr=0.01) + tracer.mod_names = {id(model): "model", id(opt): "SGD"} + + for _ in range(3): + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + tracer._module_call_offset = 0 + x = torch.randn(1, 4) + tracer.pre_forward_hook(model, (x,)) + tracer.post_forward_hook(model, (x,), model(x)) + BaseTracer.pre_step_hook(tracer, opt, (), {}) + BaseTracer.post_step_hook(tracer, opt, (), {}) + stages = {p.record.stage for p in tracer.pending} + assert "post step" in stages + + +def test_sampled_step_defers_gpu_event_reads(monkeypatch): + """Async-backend sampled steps defer GPU timing reads until events complete. + + Reading ``elapsed_time`` needs completed events, which would force a blocking + ``synchronize`` on the sampled step (the stall that inflates its wall time). + Records are instead stashed and drained on later optimizer steps once + ``event.query()`` reports the GPU has caught up — so the sampled step never + blocks. + """ + import torch + import torch.nn as nn + + from probing.profiling import torch_probe as tp + from probing.profiling.types import BaseTracer + + class FakeEvent: + ready = False # class-wide gate simulating GPU completion + + def record(self): + pass + + def query(self): + return FakeEvent.ready + + def elapsed_time(self, _other): + return 2.5 + + monkeypatch.setattr(tp, "_backend_event", lambda enable_timing=True: FakeEvent()) + + tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) + tracer.finalized = True + tracer.sampled_step = True + tracer.rate = 1.0 + tracer.use_gpu_events = True + tracer.has_backend = True + model = nn.Linear(4, 2) + opt = torch.optim.SGD(model.parameters(), lr=0.01) + tracer.mod_names = {id(model): "model", id(opt): "SGD"} + + def run_step(): + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + tracer._module_call_offset = 0 + x = torch.randn(1, 4) + tracer.pre_forward_hook(model, (x,)) + tracer.post_forward_hook(model, (x,), model(x)) + BaseTracer.pre_step_hook(tracer, opt, (), {}) + tracer.post_step_hook(opt, (), {}) + + # GPU busy: records deferred off the sampled step, nothing left in pending. + FakeEvent.ready = False + run_step() + assert tracer._deferred, "expected GPU-timed records to be deferred" + assert tracer.pending == [] + deferred_have_events = [d for d in tracer._deferred if d.events is not None] + assert deferred_have_events, "deferred records should retain their GPU events" + + # Still busy next step → still deferred (no blocking read). + run_step() + assert tracer._deferred + + # GPU caught up → drained on subsequent optimizer steps, but only after the + # records have aged past the settle window (so their reads are free). + FakeEvent.ready = True + tracer._drain_deferred() + assert tracer._deferred, "records must settle a few steps before being read" + tracer._step_cycle += tp._DEFER_MIN_SETTLE + tracer._drain_deferred() + assert tracer._deferred == [] + + +def test_deferred_reads_force_flush_when_stale(monkeypatch): + """A record deferred longer than ``_DEFER_MAX_LAG`` is force-completed.""" + import torch + import torch.nn as nn + + from probing.profiling import torch_probe as tp + from probing.profiling.types import BaseTracer + + synced = {"n": 0} + + class FakeEvent: + def record(self): + pass + + def query(self): + return False # never ready on its own + + def synchronize(self): + synced["n"] += 1 + + def elapsed_time(self, _other): + return 1.0 + + monkeypatch.setattr(tp, "_backend_event", lambda enable_timing=True: FakeEvent()) + + tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) + tracer.finalized = True + tracer.sampled_step = True + tracer.rate = 1.0 + tracer.use_gpu_events = True + tracer.has_backend = True + model = nn.Linear(4, 2) + opt = torch.optim.SGD(model.parameters(), lr=0.01) + tracer.mod_names = {id(model): "model", id(opt): "SGD"} + + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + tracer._module_call_offset = 0 + x = torch.randn(1, 4) + tracer.pre_forward_hook(model, (x,)) + tracer.post_forward_hook(model, (x,), model(x)) + BaseTracer.pre_step_hook(tracer, opt, (), {}) + tracer.post_step_hook(opt, (), {}) + assert tracer._deferred + + # Advance the cycle well past the lag budget; drain must force-complete. + tracer._step_cycle += tp._DEFER_MAX_LAG + 1 + tracer._drain_deferred() + assert tracer._deferred == [] + assert synced["n"] > 0, "stale deferred events should be force-synchronized" + + +def test_deferred_reads_wait_for_settle_window(monkeypatch): + """A GPU-event timing read must not happen until the record has settled. + + Regression guard for the sampled-step overhead: even when ``event.query()`` + reports ready, reading ``elapsed_time`` on the very next optimizer step (while + the kernels the events bracket may still be draining on the GPU) forces a + blocking commit — tens of ms per sampled step, worst for backward events + recorded near the end of a step. ``_drain_deferred`` must therefore hold a + record for ``_DEFER_MIN_SETTLE`` optimizer steps before it reads its timing, + so the read is a free cached lookup. This test fails if that settle window is + removed or ``elapsed_time`` is read prematurely. + """ + import torch + import torch.nn as nn + + from probing.profiling import torch_probe as tp + from probing.profiling.types import BaseTracer + + reads = {"n": 0} + + class FakeEvent: + def record(self): + pass + + def query(self): + return True # GPU always reports ready → only the settle gate applies + + def elapsed_time(self, _other): + reads["n"] += 1 + return 2.5 + + monkeypatch.setattr(tp, "_backend_event", lambda enable_timing=True: FakeEvent()) + + # The whole point of settling is to defer reads by a few steps. + assert tp._DEFER_MIN_SETTLE >= 1 + assert tp._DEFER_MIN_SETTLE < tp._DEFER_MAX_LAG + + tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) + tracer.finalized = True + tracer.sampled_step = True + tracer.rate = 1.0 + tracer.use_gpu_events = True + tracer.has_backend = True + model = nn.Linear(4, 2) + opt = torch.optim.SGD(model.parameters(), lr=0.01) + tracer.mod_names = {id(model): "model", id(opt): "SGD"} + + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + tracer._module_call_offset = 0 + x = torch.randn(1, 4) + tracer.pre_forward_hook(model, (x,)) + tracer.post_forward_hook(model, (x,), model(x)) + BaseTracer.pre_step_hook(tracer, opt, (), {}) + tracer.post_step_hook(opt, (), {}) + deferred = [d for d in tracer._deferred if d.events is not None] + assert deferred, "sampled step should defer GPU-timed records" + deferred_count = len(tracer._deferred) + base = deferred[0]._defer_cycle + + # Drain repeatedly *within* the settle window: despite query()==True, no + # timing read may occur and nothing may be persisted yet. + for cycle in range(base, base + tp._DEFER_MIN_SETTLE): + tracer._step_cycle = cycle + tracer._drain_deferred() + assert reads["n"] == 0, "elapsed_time read before the settle window elapsed" + assert len(tracer._deferred) == deferred_count + + # One step past the settle window → reads happen and the queue drains. + tracer._step_cycle = base + tp._DEFER_MIN_SETTLE + tracer._drain_deferred() + assert reads["n"] == len(deferred) + assert tracer._deferred == [] + + +def test_non_sampled_step_skips_hook_dispatch(): + """At low rates, most steps should not run module hooks or GPU flush.""" + import torch + import torch.nn as nn + + tracer = TorchProbe(config=TorchProbeConfig(enabled=True)) + tracer.finalized = True + tracer.sampled_step = False + tracer.rate = 0.01 + tracer.use_gpu_events = False + tracer.has_backend = False + model = nn.Linear(4, 2) + opt = torch.optim.SGD(model.parameters(), lr=0.01) + tracer.mod_names = {id(model): "model", id(opt): "SGD"} + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + tracer._module_call_offset = 0 + + x = torch.randn(1, 4) + tracer.pre_forward_hook(model, (x,)) + tracer.post_forward_hook(model, (x,), model(x)) + assert tracer._module_call_offset == 0 + assert tracer.pending == [] + + tracer.pre_step_hook(opt, (), {}) + assert tracer.pending == [] + + tracer.post_step_hook(opt, (), {}) + assert tracer.pending == [] + + +def _backward_saved(tracer): + """Records captured by immediate ``post backward`` save (not left in pending).""" + import dataclasses + + from probing.profiling.torch_probe import TorchTrace + + fields = [f.name for f in dataclasses.fields(TorchTrace)] + return [dict(zip(fields, d)) for _, d in TorchTrace.take(200)] + + +def test_backward_respects_sampling(): + """Backward grad hooks mirror the modules whose forward was recorded.""" + import torch + import torch.nn as nn + + tracer = TorchProbe(config=TorchProbeConfig(enabled=True, backward=True)) + tracer.finalized = True + tracer.sampled_step = True + tracer.rate = 1.0 + tracer.use_gpu_events = False + tracer.has_backend = False + linear = nn.Linear(4, 2) + tracer.mod_names = {id(linear): "linear"} + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + tracer._sampled_mods_this_step = set() + + x = torch.randn(1, 4, requires_grad=True) + # layer_rate=0 and offset > 0 (not the anchor): forward is not recorded, + # so backward must not attach. + tracer.layer_rate = 0.0 + tracer._module_call_offset = 1 + tracer.pre_forward_hook(linear, (x,)) + out = linear(x) + tracer.post_forward_hook(linear, (x,), out) + assert id(linear) not in tracer._sampled_mods_this_step + assert (id(linear), "backward") not in tracer._open_spans + + # layer_rate=1 → forward recorded → backward grad hooks attach (the backward + # span opens lazily when grad_output arrives, not at forward time). + tracer.layer_rate = 1.0 + tracer._open_spans = {} + tracer.pending = [] + tracer._module_call_offset = 1 + tracer.pre_forward_hook(linear, (x,)) + out2 = linear(x) + tracer.post_forward_hook(linear, (x,), out2) + assert id(linear) in tracer._sampled_mods_this_step + + out2.sum().backward() + saved = _backward_saved(tracer) + assert any(r.get("stage") == "post backward" for r in saved) + + +def test_backward_hooks_record_when_enabled(): + import torch + import torch.nn as nn + + tracer = TorchProbe(config=TorchProbeConfig(enabled=True, backward=True)) + tracer.finalized = True + tracer.sampled_step = True + tracer.rate = 1.0 + tracer.mod_names = {} + linear = nn.Linear(4, 2) + tracer.mod_names[id(linear)] = "linear" + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + + # Input requires grad so grad_input fires and the backward interval (grad_output + # → grad_input) is measurable. + x = torch.randn(1, 4, requires_grad=True) + tracer.pre_forward_hook(linear, (x,)) + out = linear(x) + tracer.post_forward_hook(linear, (x,), out) + assert ( + id(linear), + "backward", + ) not in tracer._open_spans # opens lazily at grad_output + + out.sum().backward() + assert (id(linear), "backward") not in tracer._open_spans + saved = _backward_saved(tracer) + post = next(r for r in saved if r.get("stage") == "post backward") + assert post.get("duration", 0) > 0 + + +def test_backward_tensor_hooks_with_inplace_relu(): + import torch + import torch.nn as nn + + tracer = TorchProbe(config=TorchProbeConfig(enabled=True, backward=True)) + tracer.finalized = True + tracer.sampled_step = True + tracer.rate = 1.0 + tracer.mod_names = {} + conv = nn.Conv2d(3, 4, kernel_size=3, padding=1) + relu = nn.ReLU(inplace=True) + model = nn.Sequential(conv, relu) + tracer.mod_names[id(conv)] = "conv" + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + + x = torch.randn(1, 3, 8, 8, requires_grad=True) + tracer.pre_forward_hook(conv, (x,)) + out = conv(x) + tracer.post_forward_hook(conv, (x,), out) + loss = relu(out).sum() + loss.backward() + saved = _backward_saved(tracer) + assert any(r.get("stage") == "post backward" for r in saved) + + x2 = torch.randn(1, 3, 8, 8) + tracer.pre_forward_hook(conv, (x2,)) + out2 = conv(x2) + tracer.post_forward_hook(conv, (x2,), out2) + relu(out2).sum().backward() + + +def test_backward_hooks_skipped_on_shadow_step(): + tracer, root, _ = _ready_tracer() + tracer.config = TorchProbeConfig(enabled=True, backward=True) + tracer.shadow_step = True + import torch + + t = torch.randn(2, 2, requires_grad=True) + tracer.post_forward_hook(root, (t,), t) + assert not tracer.pending + assert not tracer._open_spans + + +def test_install_hooks_backward_flag(): + import torch.nn as nn + + from probing.profiling import torch as torch_prof + from probing.profiling.torch_probe import TorchProbe, TorchProbeConfig + + class M(nn.Module): + def forward(self, x): + return x + + model = M() + tracer = TorchProbe(config=TorchProbeConfig(enabled=True, backward=True)) + try: + torch_prof.install_hooks(model, tracer=tracer, backward=True) + assert len(torch_prof.HOOK_CACHE[id(model)]) == 2 + finally: + torch_prof.uninstall_hooks() + + +def test_should_sample_anchor_and_layer_rate(): + tracer, root, other = _ready_tracer(layer_rate=0.0) _reset_hook_offset(tracer) + # Anchor: first pre hook at offset 0 is always sampled (pairs with its post). assert tracer.should_sample(root, "pre forward") assert not tracer.should_sample(root, "post forward") + # Past the anchor with layer_rate=0 → nothing is sampled. _bump_hook_offset(tracer, root, "pre forward") assert not tracer.should_sample(root, "pre forward") + assert not tracer.should_sample(other, "pre forward") + + # Full snapshot (layer_rate=1) → every layer past the anchor is sampled. + tracer.layer_rate = 1.0 assert tracer.should_sample(other, "pre forward") + + +def _plan_sequence(rate: float, cycles: int): + """Deterministic per-cycle ``sampled_step`` plan for a fresh tracer.""" + tracer = TorchProbe(config=TorchProbeConfig(enabled=True, rate=rate)) + tracer.mod_names = {i: f"m{i}" for i in range(4)} + tracer.finalize_discovery() # enables auto-plan + seq = [] + for c in range(cycles): + tracer._step_cycle = c + tracer._planned_cycle = None + tracer._ensure_step_plan() + seq.append(tracer.sampled_step) + return seq + + +def test_sampling_plan_is_deterministic_and_rank_aligned(): + """P3: the plan is a pure function of the step index, so every rank agrees.""" + seq_a = _plan_sequence(0.25, 40) + seq_b = _plan_sequence(0.25, 40) + assert seq_a == seq_b + # Stratified: rate 0.25 -> period 4 -> sample cycles 0, 4, 8, ... + sampled_cycles = [c for c, s in enumerate(seq_a) if s] + assert sampled_cycles == list(range(0, 40, 4)) + # The first probed step must be sampled (no long startup gap). + assert seq_a[0] is True + + +def test_random_two_rate_spec_parses_step_and_layer_rate(): + """``random:step:layer`` sets step density and per-layer hit probability.""" + cfg = TorchProbeConfig.parse("random:0.1:0.3,backward=on") + assert cfg.mode == "random" + assert cfg.rate == 0.1 + assert cfg.layer_rate == 0.3 + assert cfg.backward + # Single-rate random keeps full-snapshot default (layer_rate=1.0). + assert TorchProbeConfig.parse("random:0.1").layer_rate == 1.0 + # layer_rate= key also works. + assert TorchProbeConfig.parse("random:0.2,layer_rate=0.5").layer_rate == 0.5 + + +def test_random_layer_selection_is_deterministic_subset(): + """On a sampled step, random mode hits a per-layer subset, reproducibly.""" + mods = [_FakeMod() for _ in range(200)] + + def hits(seed_cycle): + tr = TorchProbe(config=TorchProbeConfig(enabled=True, mode="random", rate=1.0)) + tr.layer_rate = 0.5 + tr.mod_names = {id(m): f"layer{i}" for i, m in enumerate(mods)} + tr.finalize_discovery() + tr._step_cycle = seed_cycle + tr._planned_cycle = None + tr._ensure_step_plan() + assert tr.sampled_step # rate 1.0 -> every step sampled + # offset > 0 so the anchor rule (first pre hook) does not apply. + tr._module_call_offset = 1 + return {id(m) for m in mods if tr.should_sample(m, "pre forward")} + + a = hits(3) + assert a == hits(3) # deterministic / reproducible + # ~50% of layers hit (loose bounds for hash noise over 200 layers). + assert 60 <= len(a) <= 140 + # Different step -> different subset (not a fixed mask). + assert hits(4) != a + + +def test_low_rate_samples_first_step_and_stays_on_cadence(): + """Low rates must not leave a long startup gap (regression: 0 samples).""" + for rate, period in ((0.01, 100), (0.05, 20)): + seq = _plan_sequence(rate, period * 3 + 1) + sampled_cycles = [c for c, s in enumerate(seq) if s] + # Immediate first sample + steady, evenly-spaced cadence. + assert sampled_cycles[0] == 0 + assert sampled_cycles == list(range(0, period * 3 + 1, period)) + + +def test_sampling_does_not_touch_global_rng(): + """P2: sampling decisions never perturb the host RNG stream.""" + import random as _random + + _random.seed(1234) + before = _random.getstate() + _plan_sequence(0.5, 100) + _plan_sequence(0.1, 100) + assert _random.getstate() == before + + +def test_random_mode_short_circuits_non_sampled_steps(): + """P1: ``random`` mode also skips hook dispatch on non-sampled steps.""" + tracer = TorchProbe(config=TorchProbeConfig(enabled=True, mode="random", rate=0.3)) + tracer.mod_names = {i: f"m{i}" for i in range(4)} + tracer.finalize_discovery() + + seen_active = seen_idle = False + for c in range(60): + tracer._step_cycle = c + tracer._planned_cycle = None + active = tracer._hooks_dispatch_active() + assert active == tracer.sampled_step + seen_active |= active + seen_idle |= not active + # Non-sampled random steps exist and short-circuit (would previously always run). + assert seen_active and seen_idle diff --git a/tests/regression/profiling/test_torch_step_timing_cycle.py b/tests/regression/profiling/test_torch_step_timing_cycle.py new file mode 100644 index 00000000..60956033 --- /dev/null +++ b/tests/regression/profiling/test_torch_step_timing_cycle.py @@ -0,0 +1,83 @@ +"""Integration-style checks for torch_step_timing shadow cadence.""" + +from probing.profiling.torch_probe import ( + TorchProbe, + TorchProbeConfig, + shadow_step_in_cycle, +) + + +class _FakeMod: + pass + + +def _make_tracer(*, rate: float = 1.0) -> TorchProbe: + tracer = TorchProbe(TorchProbeConfig(enabled=True, rate=rate)) + tracer.finalized = True + tracer.sampled_step = True + tracer.mod_names = {} + root = _FakeMod() + tracer.mod_names[id(root)] = "model" + tracer._open_spans = {} + tracer.pending = [] + tracer.events = {} + tracer.cpu_start = {} + tracer.has_backend = False + tracer._step_cycle = 0 + tracer._refresh_shadow_flag() + tracer._mark_step_wall_start() + return tracer, root + + +def test_shadow_cadence_writes_alternating_rows(monkeypatch): + saved = [] + + def _capture_save(self): + saved.append((self.is_shadow, self.sampled, self.sample_rate, self.sample_mode)) + + monkeypatch.setattr( + "probing.profiling.torch_probe.TorchStepTiming.save", + _capture_save, + ) + + tracer, root = _make_tracer(rate=1.0) + + # One discovery-equivalent bootstrap: mark finalized already, simulate 6 steps. + for _ in range(6): + if not tracer.shadow_step: + tracer.log_module_stage("pre forward", root) + tracer.log_module_stage("post forward", root) + tracer.post_step_hook(None, (), {}) + + assert len(saved) == 6 + assert [row[0] for row in saved] == [ + 0, + 0, + 0, + 0, + 1, + 0, + ] + assert saved[0][2] == 1.0 + assert saved[0][3] == "random" + assert shadow_step_in_cycle(4) is True + + +def test_sample_rate_recorded_from_config(monkeypatch): + saved = [] + + def _capture_save(self): + saved.append(self.sample_rate) + + monkeypatch.setattr( + "probing.profiling.torch_probe.TorchStepTiming.save", + _capture_save, + ) + + tracer, root = _make_tracer(rate=0.05) + tracer.log_module_stage("pre forward", root) + tracer.log_module_stage("post forward", root) + tracer.post_step_hook(None, (), {}) + + assert len(saved) == 1 + assert saved[0] == 0.05 diff --git a/tests/regression/training_observability/conftest.py b/tests/regression/training_observability/conftest.py index 631712d2..65d31eb3 100644 --- a/tests/regression/training_observability/conftest.py +++ b/tests/regression/training_observability/conftest.py @@ -97,6 +97,9 @@ def _fake_snapshot(): monkeypatch.setenv("RANK", str(rank)) monkeypatch.setenv("WORLD_SIZE", str(world_size)) monkeypatch.setattr("probing.tracing.coordinates.step_snapshot", _fake_snapshot) + from probing.tracing.coordinates import reset_span_attrs_cache + + reset_span_attrs_cache() return _apply diff --git a/tests/regression/training_observability/test_topology_context.py b/tests/regression/training_observability/test_topology_context.py index f946024b..0596156c 100644 --- a/tests/regression/training_observability/test_topology_context.py +++ b/tests/regression/training_observability/test_topology_context.py @@ -27,6 +27,9 @@ def _clear_parallel_env(monkeypatch): "DP_RANK", ): monkeypatch.delenv(key, raising=False) + from probing.parallel import reset_parallel_fields_cache + + reset_parallel_fields_cache() yield diff --git a/tests/unit/probing/ext/test_torch_profiling_spec.py b/tests/unit/probing/ext/test_torch_profiling_spec.py new file mode 100644 index 00000000..46cb1675 --- /dev/null +++ b/tests/unit/probing/ext/test_torch_profiling_spec.py @@ -0,0 +1,34 @@ +"""Torch autostart profiling spec resolution.""" + +from __future__ import annotations + +import probing +from probing.ext import torch as torch_ext +from probing.profiling.torch_probe import TorchProbeConfig + + +def test_torch_profiling_spec_prefers_config(monkeypatch): + monkeypatch.delenv("PROBING_TORCH_PROFILING", raising=False) + probing.config.set("probing.torch.profiling", "1.0,backward=on") + try: + assert torch_ext._torch_profiling_spec() == "1.0,backward=on" + cfg = TorchProbeConfig.parse(torch_ext._torch_profiling_spec()) + assert cfg.enabled + assert cfg.backward + finally: + probing.config.remove("probing.torch.profiling") + + +def test_torch_profiling_spec_falls_back_to_env(monkeypatch): + probing.config.remove("probing.torch.profiling") + monkeypatch.setenv("PROBING_TORCH_PROFILING", "ordered:0.1,backward=on,shadow=off") + try: + spec = torch_ext._torch_profiling_spec() + assert spec == "ordered:0.1,backward=on,shadow=off" + assert probing.config.get_str("probing.torch.profiling") == spec + cfg = TorchProbeConfig.parse(spec) + assert cfg.backward + assert cfg.shadow_baseline == 0 + finally: + probing.config.remove("probing.torch.profiling") + monkeypatch.delenv("PROBING_TORCH_PROFILING", raising=False) diff --git a/tests/unit/probing/skills/test_interpret_fixture.py b/tests/unit/probing/skills/test_interpret_fixture.py new file mode 100644 index 00000000..59fcc4cf --- /dev/null +++ b/tests/unit/probing/skills/test_interpret_fixture.py @@ -0,0 +1,33 @@ +"""Contract tests for shared skill fixtures (Rust is SSOT for evaluation).""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +pytest.importorskip("yaml") + +import yaml + +FIXTURES = Path(__file__).resolve().parents[3] / "fixtures" + + +def test_interpret_parity_fixture_has_expected_cases(): + raw = (FIXTURES / "skill_interpret_parity.yaml").read_text(encoding="utf-8") + doc = yaml.safe_load(raw) + names = {c["name"] for c in doc["cases"]} + assert names == {"rows_zero", "max_min_ratio", "param_rows_threshold"} + for case in doc["cases"]: + assert case["rules"] + assert "expect_count" in case + + +def test_derived_variables_fixture_covers_global_and_local(): + raw = (FIXTURES / "skill_derived_variables.yaml").read_text(encoding="utf-8") + doc = yaml.safe_load(raw) + by_name = {c["name"]: c["expected"] for c in doc["cases"]} + assert set(by_name) == {"local", "global"} + assert by_name["local"]["comm_table"] == "python.comm_collective" + assert by_name["global"]["nccl_proxy_table"] == "global.nccl.proxy_ops" + assert by_name["global"]["global_prefix"] == "global." diff --git a/tests/unit/probing/tracing/test_phase_transitions.py b/tests/unit/probing/tracing/test_phase_transitions.py index 376a52e7..83ceafac 100644 --- a/tests/unit/probing/tracing/test_phase_transitions.py +++ b/tests/unit/probing/tracing/test_phase_transitions.py @@ -195,30 +195,30 @@ def test_manual_span_suppresses_hook_span_but_keeps_phase(self): assert phase() == FORWARD hook_enter(FORWARD) assert phase() == FORWARD - rows_mid = _trace_rows() - forward_starts = [ - r - for r in rows_mid - if r.get("record_type") == "span_start" and r.get("name") == "forward" - ] - assert len(forward_starts) == 1 + # Deferred persist: rows appear on span close, not on enter. + assert _trace_rows() == [] hook_exit(FORWARD) assert phase() == FORWARD assert phase() == IDLE + forward_starts = [ + r + for r in _trace_rows() + if r.get("record_type") == "span_start" and r.get("name") == "forward" + ] + assert len(forward_starts) == 1 def test_hook_phase_spans_use_phase_hook_source(self): hook_enter(BACKWARD) - rows = _trace_rows() + hook_exit(BACKWARD) backward = next( r - for r in rows + for r in _trace_rows() if r.get("record_type") == "span_start" and r.get("name") == "backward" ) import json attrs = json.loads(backward.get("attributes") or "{}") assert attrs.get("source") == "phase_hook" - hook_exit(BACKWARD) # --- Span + hook collaboration --- diff --git a/tests/unit/probing/tracing/test_span_backends.py b/tests/unit/probing/tracing/test_span_backends.py index d455cf9b..8e2b1e03 100644 --- a/tests/unit/probing/tracing/test_span_backends.py +++ b/tests/unit/probing/tracing/test_span_backends.py @@ -98,9 +98,98 @@ def test_configure_overrides_env(monkeypatch): assert list_backends() == ["memtable"] +def test_configure_empty_disables_all_backends(): + from probing.tracing import configure_backends, list_backends, reset_backends + + configure_backends([]) + assert list_backends() == [] + + with probing.span("no_persist"): + pass + + assert _trace_rows() == [] + reset_backends() + + +def test_env_none_disables_persistence(monkeypatch): + from probing.tracing import list_backends, reset_backends + + monkeypatch.setenv("PROBING_SPAN_BACKENDS", "none") + reset_backends() + assert list_backends() == [] + + with probing.span("env_none"): + pass + + assert _trace_rows() == [] + + +def test_persistence_enabled_reflects_backends(): + from probing.tracing.backends import persistence_enabled + from probing.tracing import configure_backends, reset_backends + + configure_backends([]) + assert not persistence_enabled() + reset_backends() + assert persistence_enabled() + + +def test_no_backend_skips_span_attrs(monkeypatch): + import importlib + + from probing.tracing import configure_backends, reset_backends + + span_mod = importlib.import_module("probing.tracing.span") + calls = {"n": 0} + original = span_mod.span_attrs + + def _counting_span_attrs(*args, **kwargs): + calls["n"] += 1 + return original(*args, **kwargs) + + monkeypatch.setattr(span_mod, "span_attrs", _counting_span_attrs) + configure_backends([]) + + with probing.span("skip_attrs", phase="forward"): + pass + + assert calls["n"] == 0 + reset_backends() + + +def test_span_attrs_cached_within_micro_step(monkeypatch): + from probing.tracing.coordinates import reset_span_attrs_cache, span_attrs, step + from probing.parallel import reset_parallel_fields_cache + + reset_span_attrs_cache() + reset_parallel_fields_cache() + step(0) + + snapshots = {"n": 0} + original = step.snapshot + + def _counting_snapshot(): + snapshots["n"] += 1 + return original() + + monkeypatch.setattr(step, "snapshot", _counting_snapshot) + + span_attrs({"x": 1}) + span_attrs({"y": 2}) + assert snapshots["n"] == 1 + + step() + span_attrs({"z": 3}) + assert snapshots["n"] == 2 + + def test_otel_backend_skipped_without_sdk(monkeypatch): from probing.tracing import list_backends, reset_backends + import probing.tracing.backends as backends_mod + # Environment may ship opentelemetry (e.g. via langsmith); force the + # no-SDK path so this test stays deterministic. + monkeypatch.setattr(backends_mod, "_build_otel_backend", lambda: None) monkeypatch.setenv("PROBING_SPAN_BACKENDS", "memtable,otel") reset_backends() assert list_backends() == ["memtable"] diff --git a/tests/unit/probing/util/test_env.py b/tests/unit/probing/util/test_env.py new file mode 100644 index 00000000..e9785c37 --- /dev/null +++ b/tests/unit/probing/util/test_env.py @@ -0,0 +1,30 @@ +"""Unit tests for shared env/config boolean parsing.""" + +from __future__ import annotations + +import pytest + +from probing.util.env import FALSE_VALUES, TRUE_VALUES, parse_bool_flag + + +@pytest.mark.parametrize( + "value", + sorted(TRUE_VALUES), +) +def test_parse_bool_flag_true_tokens(value: str) -> None: + assert parse_bool_flag(value) is True + assert parse_bool_flag(f" {value.upper()} ") is True + + +@pytest.mark.parametrize( + "value", + sorted(FALSE_VALUES), +) +def test_parse_bool_flag_false_tokens(value: str) -> None: + assert parse_bool_flag(value) is False + assert parse_bool_flag(f" {value.upper()} ") is False + + +@pytest.mark.parametrize("value", [None, "", "auto", "maybe", "2"]) +def test_parse_bool_flag_unknown_or_empty(value: str | None) -> None: + assert parse_bool_flag(value) is None diff --git a/tests/unit/test_install_nightly.py b/tests/unit/test_install_nightly.py new file mode 100644 index 00000000..4fa769be --- /dev/null +++ b/tests/unit/test_install_nightly.py @@ -0,0 +1,64 @@ +"""Contract tests for scripts/install-nightly.sh wheel selection logic.""" + +from __future__ import annotations + +import re +import subprocess +from pathlib import Path + +import pytest + +REPO_ROOT = Path(__file__).resolve().parents[2] +SCRIPT = REPO_ROOT / "scripts" / "install-nightly.sh" + +ABI3_RE = re.compile(r"cp3[89]|cp3\d{2}-abi3") + + +def _pick_wheel_url( + assets: list[dict], + *, + platform_re: re.Pattern[str], +) -> str: + """Mirror the selection logic embedded in install-nightly.sh.""" + for asset in assets: + name = asset.get("name", "") + if not name.endswith(".whl") or not name.startswith("probing-"): + continue + if not ABI3_RE.search(name): + continue + if platform_re.search(name): + return asset["browser_download_url"] + raise RuntimeError("no matching wheel") + + +@pytest.mark.parametrize( + ("pattern", "expected_url"), + [ + (re.compile(r"manylinux.*x86_64"), "https://example/linux.whl"), + (re.compile(r"macosx.*arm64"), "https://example/mac.whl"), + ], +) +def test_install_nightly_picks_abi3_wheel_for_platform( + pattern: re.Pattern[str], expected_url: str +): + assets = [ + { + "name": "probing-0.2.5+g1.abc1234-cp38-abi3-manylinux_2_17_x86_64.whl", + "browser_download_url": "https://example/linux.whl", + }, + { + "name": "probing-0.2.5+g1.abc1234-cp38-abi3-macosx_11_0_arm64.whl", + "browser_download_url": "https://example/mac.whl", + }, + { + "name": "probing-0.2.5-cp312-cp312-manylinux_2_17_x86_64.whl", + "browser_download_url": "https://example/wrong-tag.whl", + }, + ] + url = _pick_wheel_url(assets, platform_re=pattern) + assert url == expected_url + + +def test_install_nightly_script_syntax(): + assert SCRIPT.is_file() + subprocess.run(["bash", "-n", str(SCRIPT)], check=True) diff --git a/web/assets/tailwind.css b/web/assets/tailwind.css index c01b64df..e51b6678 100644 --- a/web/assets/tailwind.css +++ b/web/assets/tailwind.css @@ -1284,6 +1284,10 @@ video { max-height: min(60vh,520px); } +.max-h-\[min\(90vh\2c 920px\)\] { + max-height: min(90vh,920px); +} + .min-h-0 { min-height: 0px; } @@ -1392,6 +1396,10 @@ video { width: 20rem; } +.w-9 { + width: 2.25rem; +} + .w-\[200px\] { width: 200px; } @@ -1477,6 +1485,10 @@ video { max-width: 48rem; } +.max-w-5xl { + max-width: 64rem; +} + .max-w-7xl { max-width: 80rem; } @@ -1995,6 +2007,10 @@ video { border-color: rgb(245 158 11 / var(--tw-border-opacity, 1)); } +.border-amber-700\/50 { + border-color: rgb(180 83 9 / 0.5); +} + .border-amber-800 { --tw-border-opacity: 1; border-color: rgb(146 64 14 / var(--tw-border-opacity, 1)); @@ -2048,6 +2064,10 @@ video { border-color: rgb(29 78 216 / var(--tw-border-opacity, 1)); } +.border-blue-700\/40 { + border-color: rgb(29 78 216 / 0.4); +} + .border-emerald-200 { --tw-border-opacity: 1; border-color: rgb(167 243 208 / var(--tw-border-opacity, 1)); @@ -2205,10 +2225,6 @@ video { border-color: rgb(153 27 27 / var(--tw-border-opacity, 1)); } -.border-red-900\/40 { - border-color: rgb(127 29 29 / 0.4); -} - .border-slate-100 { --tw-border-opacity: 1; border-color: rgb(241 245 249 / var(--tw-border-opacity, 1)); @@ -3434,6 +3450,10 @@ video { background-color: rgb(146 64 14 / var(--tw-bg-opacity, 1)); } +.bg-amber-950\/40 { + background-color: rgb(69 26 3 / 0.4); +} + .bg-black\/20 { background-color: rgb(0 0 0 / 0.2); } @@ -3446,6 +3466,10 @@ video { background-color: rgb(0 0 0 / 0.5); } +.bg-black\/55 { + background-color: rgb(0 0 0 / 0.55); +} + .bg-blue-100 { --tw-bg-opacity: 1; background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1)); @@ -3509,6 +3533,10 @@ video { background-color: rgb(29 78 216 / var(--tw-bg-opacity, 1)); } +.bg-blue-950\/30 { + background-color: rgb(23 37 84 / 0.3); +} + .bg-emerald-100 { --tw-bg-opacity: 1; background-color: rgb(209 250 229 / var(--tw-bg-opacity, 1)); @@ -3645,6 +3673,10 @@ video { background-color: rgb(22 101 52 / var(--tw-bg-opacity, 1)); } +.bg-indigo-300\/90 { + background-color: rgb(165 180 252 / 0.9); +} + .bg-indigo-50\/30 { background-color: rgb(238 242 255 / 0.3); } @@ -3707,10 +3739,6 @@ video { background-color: rgb(153 27 27 / var(--tw-bg-opacity, 1)); } -.bg-red-950\/30 { - background-color: rgb(69 10 10 / 0.3); -} - .bg-slate-100 { --tw-bg-opacity: 1; background-color: rgb(241 245 249 / var(--tw-bg-opacity, 1)); @@ -3726,6 +3754,10 @@ video { background-color: rgb(148 163 184 / var(--tw-bg-opacity, 1)); } +.bg-slate-400\/90 { + background-color: rgb(148 163 184 / 0.9); +} + .bg-slate-50 { --tw-bg-opacity: 1; background-color: rgb(248 250 252 / var(--tw-bg-opacity, 1)); @@ -3767,6 +3799,10 @@ video { background-color: rgb(30 41 59 / 0.5); } +.bg-slate-800\/60 { + background-color: rgb(30 41 59 / 0.6); +} + .bg-slate-800\/80 { background-color: rgb(30 41 59 / 0.8); } @@ -3937,6 +3973,12 @@ video { --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); } +.from-blue-50\/80 { + --tw-gradient-from: rgb(239 246 255 / 0.8) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(239 246 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + .from-blue-500 { --tw-gradient-from: #3b82f6 var(--tw-gradient-from-position); --tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position); @@ -3973,6 +4015,12 @@ video { --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); } +.from-emerald-50\/80 { + --tw-gradient-from: rgb(236 253 245 / 0.8) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(236 253 245 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + .from-emerald-500 { --tw-gradient-from: #10b981 var(--tw-gradient-from-position); --tw-gradient-to: rgb(16 185 129 / 0) var(--tw-gradient-to-position); @@ -5099,6 +5147,11 @@ video { color: rgb(253 230 138 / var(--tw-text-opacity, 1)); } +.text-amber-400 { + --tw-text-opacity: 1; + color: rgb(251 191 36 / var(--tw-text-opacity, 1)); +} + .text-amber-50 { --tw-text-opacity: 1; color: rgb(255 251 235 / var(--tw-text-opacity, 1)); @@ -5201,9 +5254,8 @@ video { color: rgb(167 243 208 / var(--tw-text-opacity, 1)); } -.text-emerald-400 { - --tw-text-opacity: 1; - color: rgb(52 211 153 / var(--tw-text-opacity, 1)); +.text-emerald-400\/90 { + color: rgb(52 211 153 / 0.9); } .text-emerald-50 { @@ -5335,18 +5387,14 @@ video { color: rgb(254 202 202 / var(--tw-text-opacity, 1)); } -.text-red-300\/90 { - color: rgb(252 165 165 / 0.9); -} - -.text-red-400 { +.text-red-50 { --tw-text-opacity: 1; - color: rgb(248 113 113 / var(--tw-text-opacity, 1)); + color: rgb(254 242 242 / var(--tw-text-opacity, 1)); } -.text-red-50 { +.text-red-500 { --tw-text-opacity: 1; - color: rgb(254 242 242 / var(--tw-text-opacity, 1)); + color: rgb(239 68 68 / var(--tw-text-opacity, 1)); } .text-red-600 { @@ -5515,6 +5563,12 @@ video { opacity: 0.9; } +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + .shadow-2xl { --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); @@ -6039,15 +6093,19 @@ video { border-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); } +.hover\:border-blue-700\/40:hover { + border-color: rgb(29 78 216 / 0.4); +} + +.hover\:border-emerald-700\/40:hover { + border-color: rgb(4 120 87 / 0.4); +} + .hover\:border-slate-500:hover { --tw-border-opacity: 1; border-color: rgb(100 116 139 / var(--tw-border-opacity, 1)); } -.hover\:border-slate-600\/70:hover { - border-color: rgb(71 85 105 / 0.7); -} - .hover\:bg-amber-100:hover { --tw-bg-opacity: 1; background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1)); @@ -6312,10 +6370,6 @@ video { background-color: rgb(51 65 85 / 0.3); } -.hover\:bg-slate-700\/50:hover { - background-color: rgb(51 65 85 / 0.5); -} - .hover\:bg-slate-800:hover { --tw-bg-opacity: 1; background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1)); @@ -6542,11 +6596,6 @@ video { color: rgb(254 202 202 / var(--tw-text-opacity, 1)); } -.hover\:text-red-300:hover { - --tw-text-opacity: 1; - color: rgb(252 165 165 / var(--tw-text-opacity, 1)); -} - .hover\:text-red-50:hover { --tw-text-opacity: 1; color: rgb(254 242 242 / var(--tw-text-opacity, 1)); @@ -7284,6 +7333,16 @@ video { .sm\:p-8 { padding: 2rem; } + + .sm\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + .sm\:py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; + } } @media (min-width: 768px) { @@ -7317,6 +7376,10 @@ video { grid-template-columns: repeat(3, minmax(0, 1fr)); } + .lg\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + .lg\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } diff --git a/web/src/api/mod.rs b/web/src/api/mod.rs index d77364ae..6a8ed922 100644 --- a/web/src/api/mod.rs +++ b/web/src/api/mod.rs @@ -88,6 +88,7 @@ mod cpu; mod dashboard; mod files; mod gpu; +mod overhead; mod profiling; mod pulsing; mod pytorch; @@ -109,6 +110,8 @@ pub use dashboard::*; #[allow(unused_imports)] pub use gpu::*; #[allow(unused_imports)] +pub use overhead::*; +#[allow(unused_imports)] pub use profiling::*; #[allow(unused_imports)] pub use pulsing::*; diff --git a/web/src/api/overhead.rs b/web/src/api/overhead.rs new file mode 100644 index 00000000..fea03bd9 --- /dev/null +++ b/web/src/api/overhead.rs @@ -0,0 +1,57 @@ +use super::ApiClient; +use crate::overhead::sql::{self, NCCL_COUNTERS, TRAIN_STEP_MEDIAN}; +use crate::utils::error::{AppError, Result}; +use probing_proto::prelude::DataFrame; + +pub const OVERHEAD_POLL_MS: u32 = 5000; + +pub fn empty_dataframe() -> DataFrame { + DataFrame { + names: vec![], + cols: vec![], + size: 0, + } +} + +pub fn is_nccl_counters_missing(err: &AppError) -> bool { + matches!(err, AppError::Api(msg) + if msg.contains("nccl.profiler_counters") && msg.contains("not found")) +} + +impl ApiClient { + pub async fn fetch_overhead_summary(&self) -> Result { + self.execute_query(&sql::summary()).await + } + + pub async fn fetch_overhead_recent_steps(&self) -> Result { + self.execute_query(&sql::recent_steps()).await + } + + pub async fn fetch_overhead_train_step_median(&self) -> Result { + self.execute_query(TRAIN_STEP_MEDIAN).await + } + + /// Latest NCCL profiler health row for the overhead footnote. + /// + /// Returns `Ok(None)` when the extension table is not registered (single-GPU / no NCCL). + pub async fn fetch_overhead_nccl_counters(&self) -> Result> { + match self.execute_query(NCCL_COUNTERS).await { + Ok(df) => Ok(Some(df)), + Err(e) if is_nccl_counters_missing(&e) => Ok(None), + Err(e) => Err(e), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn detects_missing_nccl_counters_table() { + let err = AppError::Api( + "Error during planning: table 'probe.nccl.profiler_counters' not found".into(), + ); + assert!(is_nccl_counters_missing(&err)); + } +} diff --git a/web/src/app.rs b/web/src/app.rs index 62a5284a..cae797ff 100644 --- a/web/src/app.rs +++ b/web/src/app.rs @@ -6,7 +6,7 @@ use dioxus::prelude::*; use dioxus_router::{Routable, Router}; -use crate::components::source_viewer::SourceViewerOverlay; +use crate::components::app_overlays::AppOverlays; use crate::components::common::LoadingState; use crate::components::layout::AppLayout; @@ -190,7 +190,7 @@ pub fn TrainingPage() -> Element { #[component] pub fn App() -> Element { rsx! { - SourceViewerOverlay {} + AppOverlays {} Router:: {} } } diff --git a/web/src/components/app_overlays.rs b/web/src/components/app_overlays.rs new file mode 100644 index 00000000..eeb3ae0b --- /dev/null +++ b/web/src/components/app_overlays.rs @@ -0,0 +1,209 @@ +//! Viewport overlays mounted at app root (monitors, source viewer, …). + +use dioxus::prelude::*; + +use crate::api::OVERHEAD_POLL_MS; +use crate::components::common::AsyncBoundary; +use crate::components::icon::Icon; +use crate::components::overhead::TorchOverheadPanel; +use crate::components::overlay_shell::{OverlayAccent, OverlayShell}; +use crate::components::source_viewer::SourceViewerOverlay; +use crate::hooks::{use_page_visible, use_poll_tick_gated}; +use crate::state::overlays::{app_overlay, close_app_overlay, AppOverlay, SidebarMonitor}; +use crate::state::scroll_lock::unlock_body_scroll; +use crate::state::ui_tasks::{ + cancel_all_running_ui_tasks, cancel_ui_task, clear_finished_ui_tasks, ui_tasks_snapshot, + UiTask, UiTaskStatus, UI_TASK_TICK, +}; + +/// Renders whichever global overlay is active. +#[component] +pub fn AppOverlays() -> Element { + let open = app_overlay(); + + use_effect(move || { + if app_overlay().is_none() { + unlock_body_scroll(); + } + }); + + match open { + None => rsx! {}, + Some(AppOverlay::SourceViewer(_)) => rsx! { + SourceViewerOverlay {} + }, + Some(AppOverlay::Monitor(SidebarMonitor::Tasks)) => rsx! { + TasksMonitorOverlay { + on_close: move |_| close_app_overlay(), + } + }, + Some(AppOverlay::Monitor(SidebarMonitor::Overhead)) => rsx! { + OverheadMonitorOverlay { + on_close: move |_| close_app_overlay(), + } + }, + } +} + +#[component] +fn TasksMonitorOverlay(on_close: EventHandler<()>) -> Element { + let _tick = UI_TASK_TICK.read(); + let tasks = ui_tasks_snapshot(); + let now_ms = js_sys::Date::now() as u64; + let running = tasks.iter().filter(|t| t.is_running()).count(); + let has_finished = tasks.iter().any(|t| !t.is_running()); + + let subtitle = if running > 0 { + format!("{running} active · {} total · Esc to close", tasks.len()) + } else { + format!("{} tasks · Esc to close", tasks.len()) + }; + + let header_actions = rsx! { + div { class: "flex items-center gap-2 shrink-0 mr-1", + if running > 0 { + button { + r#type: "button", + class: "text-xs text-gray-500 hover:text-red-600 transition-colors px-2 py-1 rounded hover:bg-red-50", + title: "Cancel all running tasks", + onclick: move |e| { + e.stop_propagation(); + cancel_all_running_ui_tasks(); + }, + "Cancel all" + } + } + if has_finished { + button { + r#type: "button", + class: "text-xs text-gray-500 hover:text-gray-800 transition-colors px-2 py-1 rounded hover:bg-gray-100", + onclick: move |e| { + e.stop_propagation(); + clear_finished_ui_tasks(); + }, + "Clear finished" + } + } + } + }; + + rsx! { + OverlayShell { + title: "Background tasks".to_string(), + subtitle: subtitle, + accent: OverlayAccent::Blue, + close_label: "Close task monitor".to_string(), + on_close: on_close, + header_icon: rsx! { + Icon { icon: &icondata::AiUnorderedListOutlined, class: "w-5 h-5" } + }, + header_actions: header_actions, + if tasks.is_empty() { + p { class: "text-sm text-gray-500 text-center py-12", + "No background tasks" + } + } else { + div { class: "space-y-2", + for task in tasks.iter().rev() { + TaskRow { key: "{task.id}", task: task.clone(), now_ms: now_ms } + } + } + } + } + } +} + +#[component] +fn OverheadMonitorOverlay(on_close: EventHandler<()>) -> Element { + let visible = use_page_visible(); + let poll = use_poll_tick_gated(OVERHEAD_POLL_MS, Some(visible)); + let refresh_tick = poll(); + + rsx! { + OverlayShell { + title: "Torch profiling overhead".to_string(), + subtitle: format!( + "TorchProbe in-run cost vs shadow baseline · refreshes every {}s · Esc to close", + OVERHEAD_POLL_MS / 1000 + ), + accent: OverlayAccent::Emerald, + close_label: "Close overhead monitor".to_string(), + on_close: on_close, + header_icon: rsx! { + Icon { icon: &icondata::CgPerformance, class: "w-5 h-5" } + }, + header_actions: rsx! { div {} }, + AsyncBoundary { + message: Some("Loading overhead…".to_string()), + TorchOverheadPanel { refresh_tick: refresh_tick } + } + } + } +} + +#[component] +fn TaskRow(task: UiTask, now_ms: u64) -> Element { + let row_class = match task.status { + UiTaskStatus::Running => "bg-blue-50/80 border-blue-200", + UiTaskStatus::Done => "bg-white border-gray-200 opacity-80", + UiTaskStatus::Failed => "bg-red-50 border-red-200", + UiTaskStatus::Cancelled => "bg-gray-50 border-gray-200 opacity-70", + }; + + let kind_label = task.kind.label(); + let elapsed = task.elapsed_label(now_ms); + let task_id = task.id; + + rsx! { + div { + class: "flex items-start gap-2 px-3 py-2.5 rounded-lg border text-sm leading-snug {row_class}", + title: task.error.clone().unwrap_or_else(|| task.label.clone()), + match task.status { + UiTaskStatus::Running => rsx! { + span { + class: "inline-block w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full animate-spin shrink-0 mt-0.5" + } + }, + UiTaskStatus::Done => rsx! { + Icon { icon: &icondata::AiCheckOutlined, class: "w-4 h-4 text-emerald-600 shrink-0 mt-0.5" } + }, + UiTaskStatus::Failed => rsx! { + Icon { icon: &icondata::AiCloseCircleOutlined, class: "w-4 h-4 text-red-500 shrink-0 mt-0.5" } + }, + UiTaskStatus::Cancelled => rsx! { + Icon { icon: &icondata::AiStopOutlined, class: "w-4 h-4 text-gray-400 shrink-0 mt-0.5" } + }, + } + div { class: "flex-1 min-w-0", + div { class: "text-gray-900 truncate font-medium", "{task.label}" } + div { class: "text-gray-500 truncate text-xs mt-0.5", + span { "{kind_label}" } + if let Some(detail) = &task.detail { + span { " · {detail}" } + } + } + if let Some(err) = &task.error { + div { class: "text-red-600 truncate mt-1 text-xs", "{err}" } + } + if task.status == UiTaskStatus::Cancelled { + div { class: "text-gray-500 truncate mt-1 text-xs", "Cancelled" } + } + } + div { class: "flex flex-col items-end gap-1 shrink-0", + span { class: "text-gray-500 tabular-nums text-xs", "{elapsed}" } + if task.is_running() { + button { + r#type: "button", + class: "p-1 rounded text-gray-400 hover:text-red-600 hover:bg-red-50 transition-colors", + title: if task.group_id.is_some() { "Cancel session" } else { "Cancel task" }, + onclick: move |e| { + e.stop_propagation(); + cancel_ui_task(task_id); + }, + Icon { icon: &icondata::AiCloseOutlined, class: "w-3.5 h-3.5" } + } + } + } + } + } +} diff --git a/web/src/components/flamegraph/logic.rs b/web/src/components/flamegraph/logic.rs index eba22e18..f38d34fe 100644 --- a/web/src/components/flamegraph/logic.rs +++ b/web/src/components/flamegraph/logic.rs @@ -107,6 +107,7 @@ pub fn label_for_frame(frame: &FlameFrame) -> String { } else if frame.depth == 1 { match frame.name.as_str() { "forward" => "Forward pass".to_string(), + "backward" => "Backward pass".to_string(), "step" => "Optimizer step".to_string(), other => other.to_string(), } diff --git a/web/src/components/keyboard_shortcuts.rs b/web/src/components/keyboard_shortcuts.rs index 1b542eae..5167e52f 100644 --- a/web/src/components/keyboard_shortcuts.rs +++ b/web/src/components/keyboard_shortcuts.rs @@ -9,7 +9,7 @@ use wasm_bindgen::JsCast; use crate::components::icon::Icon; use crate::state::agent::AGENT_PANEL_OPEN; use crate::state::commands::{COMMAND_PANEL_OPEN, SHORTCUTS_HELP_OPEN}; -use crate::state::source_viewer::{close_source_viewer, SOURCE_VIEWER_OPEN}; +use crate::state::source_viewer::{close_source_viewer, source_viewer_open}; #[component] pub fn GlobalShortcutInstaller() -> Element { @@ -66,7 +66,7 @@ fn handle_global_key(e: &web_sys::KeyboardEvent) -> bool { *AGENT_PANEL_OPEN.write() = false; return true; } - if *SOURCE_VIEWER_OPEN.read() { + if source_viewer_open() { close_source_viewer(); return true; } diff --git a/web/src/components/mod.rs b/web/src/components/mod.rs index b5bcdc14..091acb53 100644 --- a/web/src/components/mod.rs +++ b/web/src/components/mod.rs @@ -14,6 +14,7 @@ //! - **flamegraph** — Native flamegraph visualizations. pub mod agent; +pub mod app_overlays; pub mod callstack_view; pub mod card; pub mod card_view; @@ -30,6 +31,8 @@ pub mod investigation_context_hint; pub mod keyboard_shortcuts; pub mod layout; pub mod markdown_view; +pub mod overhead; +pub mod overlay_shell; pub mod page; pub mod page_context_sync; pub mod poll_status; diff --git a/web/src/components/overhead/mod.rs b/web/src/components/overhead/mod.rs new file mode 100644 index 00000000..25176178 --- /dev/null +++ b/web/src/components/overhead/mod.rs @@ -0,0 +1,7 @@ +//! TorchProbe overhead UI. + +mod panel; + +pub use crate::api::OVERHEAD_POLL_MS; +pub use crate::overhead::{overhead_trigger_label, table_missing_trigger_label}; +pub use panel::TorchOverheadPanel; diff --git a/web/src/components/overhead/panel.rs b/web/src/components/overhead/panel.rs new file mode 100644 index 00000000..6c0d891c --- /dev/null +++ b/web/src/components/overhead/panel.rs @@ -0,0 +1,366 @@ +//! TorchProbe overhead dashboard panel (presentation only). + +use dioxus::prelude::*; +use probing_proto::prelude::{DataFrame, Ele}; + +use crate::api::{empty_dataframe, ApiClient}; +use crate::components::common::{AppErrorDisplay, EmptyState}; +use crate::components::stat_card::StatCard; +use crate::hooks::use_app_resource; +use crate::overhead::{ + dataframe_rows, df_scalar_f64, df_scalar_i64, format_overhead_pct, format_step_ms, + parse_overhead_steps, table_missing_message, OverheadStep, +}; +use crate::utils::error::AppError; + +#[component] +pub fn TorchOverheadPanel(refresh_tick: u32) -> Element { + let summary = use_app_resource(move || { + let _ = refresh_tick; + async move { ApiClient::new().fetch_overhead_summary().await } + }); + let recent = use_app_resource(move || { + let _ = refresh_tick; + async move { ApiClient::new().fetch_overhead_recent_steps().await } + }); + let train_step = use_app_resource(move || { + let _ = refresh_tick; + async move { ApiClient::new().fetch_overhead_train_step_median().await } + }); + let nccl_skip = use_signal(|| false); + let nccl = use_app_resource(move || { + let _ = refresh_tick; + let mut nccl_skip = nccl_skip; + async move { + if nccl_skip() { + return Ok(empty_dataframe()); + } + match ApiClient::new().fetch_overhead_nccl_counters().await { + Ok(None) => { + nccl_skip.set(true); + Ok(empty_dataframe()) + } + Ok(Some(df)) => Ok(df), + Err(e) => Err(e), + } + } + }); + + let summary_res = summary.suspend()?(); + let recent_res = recent.suspend()?(); + let train_step_res = train_step.suspend()?(); + let nccl_res = nccl.suspend()?(); + overhead_body(&summary_res, &recent_res, &train_step_res, &nccl_res) +} + +#[component] +fn OverheadAlerts(shadow_baseline: i64, shadow_n: i64) -> Element { + if shadow_baseline == 0 { + return rsx! { + div { + class: "rounded-md border border-slate-300 bg-slate-50 px-3 py-2 text-xs text-slate-800", + "Shadow baseline is disabled (" + code { class: "font-mono", "shadow=off" } + "). Set " + code { class: "font-mono", "probing.torch.profiling=on,shadow=4:1" } + " to enable in-run overhead estimates." + } + }; + } + if shadow_n > 0 && shadow_n < 5 { + return rsx! { + div { class: "rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-xs text-amber-900", + "Only {shadow_n} shadow baseline step(s) in the window — overhead estimate may be unreliable. Wait for more training steps." + } + }; + } + if shadow_baseline > 0 && shadow_n == 0 { + return rsx! { + div { class: "rounded-md border border-blue-200 bg-blue-50 px-3 py-2 text-xs text-blue-900", + "Collecting shadow baseline steps — need at least one shadow step per cadence cycle before overhead % is meaningful." + } + }; + } + rsx! { div {} } +} + +fn overhead_body( + summary: &Result, + recent: &Result, + train_step: &Result, + nccl: &Result, +) -> Element { + if let Err(err) = summary { + if let Some(message) = table_missing_message(err) { + return rsx! { + EmptyState { message: message.to_string() } + }; + } + return rsx! { + AppErrorDisplay { error: err.clone(), title: None } + }; + } + + let summary_df = summary.as_ref().ok(); + let recent_df = recent.as_ref().ok(); + let row_count = recent_df.map(dataframe_rows).unwrap_or(0); + + let shadow_baseline = summary_df + .and_then(|df| df_scalar_i64(df, "shadow_baseline", 0)) + .unwrap_or(1); + let shadow_n = summary_df + .and_then(|df| df_scalar_i64(df, "shadow_n", 0)) + .unwrap_or(0); + + if row_count == 0 { + return rsx! { + EmptyState { + message: "No python.torch_step_timing rows yet — enable SET probing.torch.profiling=on and wait for a few shadow cycles (default 4:1).".to_string() + } + }; + } + + if shadow_baseline == 0 { + return rsx! { + div { class: "space-y-3", + OverheadAlerts { shadow_baseline, shadow_n } + p { class: "text-xs text-gray-500", + "Timing rows exist but shadow baseline is off — enable shadow cadence to compare probed vs baseline steps." + } + } + }; + } + + let probed_median_ms = summary_df.and_then(|df| df_scalar_f64(df, "probed_median_ms", 0)); + let sampled_median_ms = summary_df.and_then(|df| df_scalar_f64(df, "sampled_median_ms", 0)); + let shadow_median_ms = summary_df.and_then(|df| df_scalar_f64(df, "shadow_median_ms", 0)); + let probed_mean_ms = summary_df.and_then(|df| df_scalar_f64(df, "probed_mean_ms", 0)); + let shadow_mean_ms = summary_df.and_then(|df| df_scalar_f64(df, "shadow_mean_ms", 0)); + let probed_n = summary_df + .and_then(|df| df_scalar_i64(df, "probed_n", 0)) + .unwrap_or(0); + let sampled_n = summary_df + .and_then(|df| df_scalar_i64(df, "sampled_n", 0)) + .unwrap_or(0); + let latest_step = summary_df + .and_then(|df| df_scalar_i64(df, "latest_step", 0)) + .unwrap_or(-1); + let shadow_normal = summary_df + .and_then(|df| df_scalar_i64(df, "shadow_normal", 0)) + .unwrap_or(4); + let sample_rate = summary_df.and_then(|df| df_scalar_f64(df, "sample_rate", 0)); + let sample_mode = summary_df.and_then(|df| { + df.names + .iter() + .position(|n| n == "sample_mode") + .and_then(|ci| { + summary_df? + .cols + .get(ci) + .filter(|col| !col.is_empty()) + .map(|col| match &col.get(0) { + Ele::Text(s) => s.clone(), + other => format!("{other:?}"), + }) + }) + }); + let train_step_median_ms = train_step + .as_ref() + .ok() + .and_then(|df| df_scalar_f64(df, "train_step_median_ms", 0)); + + let (hook_tax_value, hook_tax_hint) = match (probed_median_ms, shadow_median_ms) { + (Some(p), Some(s)) => format_overhead_pct(p, s, "Hook tax (all probed steps vs shadow)"), + _ => ( + "—".to_string(), + Some("Collecting shadow baseline steps…".to_string()), + ), + }; + let (sampled_overhead_value, sampled_overhead_hint) = + match (sampled_median_ms, shadow_median_ms) { + (Some(p), Some(s)) if sampled_n > 0 => { + format_overhead_pct(p, s, "Active sample steps vs shadow") + } + _ => ("—".to_string(), None), + }; + let (total_overhead_value, total_overhead_hint) = match (probed_mean_ms, shadow_mean_ms) { + (Some(p), Some(s)) => { + format_overhead_pct(p, s, "Amortized: mean(all probed) vs mean(shadow)") + } + _ => ( + "—".to_string(), + Some("Collecting shadow baseline steps…".to_string()), + ), + }; + + let cadence = format!("{shadow_normal}:{shadow_baseline}"); + let sampling_note = match (sample_mode.as_deref(), sample_rate) { + (Some(mode), Some(rate)) => format!(" · {mode} @ {:.0}%", rate * 100.0), + (Some(mode), None) => format!(" · {mode}"), + _ => String::new(), + }; + let steps = recent_df.map(parse_overhead_steps).unwrap_or_default(); + + rsx! { + div { class: "space-y-4", + OverheadAlerts { shadow_baseline, shadow_n } + p { class: "text-xs text-gray-500", + "Shadow cadence {cadence}{sampling_note} · Total overhead = mean(all probed)/mean(shadow)−1 (amortized) · Hook tax = median(probed)/median(shadow)−1 (cheap dispatch path) · probed median is wall time between optimizer steps · train.step is compute-only" + } + div { class: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3", + StatCard { + label: "Total overhead".to_string(), + value: total_overhead_value, + hint: total_overhead_hint, + } + StatCard { + label: "Hook tax".to_string(), + value: hook_tax_value, + hint: hook_tax_hint, + } + StatCard { + label: "Sampled overhead".to_string(), + value: sampled_overhead_value, + hint: sampled_overhead_hint.or_else(|| { + if sampled_n > 0 { + Some(format!("{sampled_n} sampled steps in window")) + } else { + Some("No sampled steps in window yet".to_string()) + } + }), + } + StatCard { + label: "Probed median".to_string(), + value: probed_median_ms.map(format_step_ms).unwrap_or_else(|| "—".to_string()), + hint: Some(format!("{probed_n} probed steps")), + } + StatCard { + label: "Sampled median".to_string(), + value: sampled_median_ms.map(format_step_ms).unwrap_or_else(|| "—".to_string()), + hint: if sampled_n > 0 { + Some(format!("{sampled_n} sampled steps")) + } else { + Some("No sampled steps in window yet".to_string()) + }, + } + StatCard { + label: "Shadow median".to_string(), + value: shadow_median_ms.map(format_step_ms).unwrap_or_else(|| "—".to_string()), + hint: Some(format!("{shadow_n} baseline steps")), + } + StatCard { + label: "Latest step".to_string(), + value: latest_step.to_string(), + hint: None, + } + StatCard { + label: "train.step median".to_string(), + value: train_step_median_ms + .map(format_step_ms) + .unwrap_or_else(|| "—".to_string()), + hint: Some("Cross-check vs span timeline".to_string()), + } + } + NcclOverheadFootnote { nccl: nccl.clone() } + if let Err(err) = recent { + AppErrorDisplay { error: err.clone(), title: Some("Recent steps query failed".to_string()) } + } else if !steps.is_empty() { + TorchOverheadTimeline { steps: steps.clone() } + } + } + } +} + +#[component] +fn NcclOverheadFootnote(nccl: Result) -> Element { + match nccl { + Err(_) => rsx! { + p { class: "text-[10px] text-gray-500 border-t border-gray-100 pt-3", + "NCCL profiler: no in-run shadow step yet — use " + code { class: "font-mono text-gray-500", "examples/run_nccl_profiler_bench.sh" } + " for offline AllReduce overhead comparison." + } + }, + Ok(df) if dataframe_rows(&df) == 0 => rsx! { + p { class: "text-[10px] text-gray-500 border-t border-gray-100 pt-3", + "NCCL profiler inactive — Torch overhead above is TorchProbe only. Offline NCCL bench: " + code { class: "font-mono text-gray-500", "examples/run_nccl_profiler_bench.sh" } + } + }, + Ok(df) => { + let coll_events = df_scalar_i64(&df, "coll_events", 0).unwrap_or(0); + let rows_written = df_scalar_i64(&df, "rows_written", 0).unwrap_or(0); + let pool_exhausted = df_scalar_i64(&df, "pool_exhausted", 0).unwrap_or(0); + let write_errors = df_scalar_i64(&df, "write_errors", 0).unwrap_or(0); + rsx! { + p { class: "text-[10px] text-gray-500 border-t border-gray-100 pt-3", + "NCCL profiler active · coll_events {coll_events} · rows_written {rows_written}" + if pool_exhausted > 0 || write_errors > 0 { + span { class: "text-amber-700", + " · pool_exhausted {pool_exhausted} · write_errors {write_errors}" + } + } + " · NCCL has no in-run shadow baseline; offline bench: " + code { class: "font-mono", "examples/run_nccl_profiler_bench.sh" } + } + } + } + } +} + +#[component] +fn TorchOverheadTimeline(steps: Vec) -> Element { + let max_ms = steps + .iter() + .map(|s| s.duration_ms) + .fold(0.0f64, f64::max) + .max(1.0); + + rsx! { + div { class: "space-y-2", + p { class: "text-[10px] text-gray-500", + "Recent step wall time · violet = probed+sampled · indigo = probed dispatch only · slate = shadow" + } + div { class: "overflow-x-auto pb-1", + div { class: "flex items-end gap-1 min-w-max h-32 px-1", + for step in steps.iter() { + { + let pct = (step.duration_ms / max_ms).clamp(0.08, 1.0); + let bar_color = if step.is_shadow { + "bg-slate-400/90" + } else if step.sampled { + "bg-violet-500/85" + } else { + "bg-indigo-300/90" + }; + let kind = if step.is_shadow { + "shadow" + } else if step.sampled { + "sampled" + } else { + "dispatch" + }; + let title = format!( + "step {}: {:.1} ms ({})", + step.local_step, + step.duration_ms, + kind, + ); + rsx! { + div { + class: "flex flex-col items-center justify-end gap-1 min-w-[28px] h-full", + title: "{title}", + div { + class: "w-6 rounded-t-sm {bar_color}", + style: "height: {pct * 100.0}%", + } + span { class: "text-[9px] font-mono text-gray-500", "{step.local_step}" } + } + } + } + } + } + } + } + } +} diff --git a/web/src/components/overlay_shell.rs b/web/src/components/overlay_shell.rs new file mode 100644 index 00000000..2ef5e14b --- /dev/null +++ b/web/src/components/overlay_shell.rs @@ -0,0 +1,93 @@ +//! Centered modal shell for viewport overlays. + +use dioxus::prelude::*; + +use crate::components::icon::Icon; + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum OverlayAccent { + Blue, + Emerald, +} + +impl OverlayAccent { + fn header_gradient(self) -> &'static str { + match self { + Self::Blue => "bg-gradient-to-r from-blue-50/80 to-white", + Self::Emerald => "bg-gradient-to-r from-emerald-50/80 to-white", + } + } + + fn icon_wrap(self) -> &'static str { + match self { + Self::Blue => "bg-blue-100 text-blue-700", + Self::Emerald => "bg-emerald-100 text-emerald-700", + } + } +} + +/// Full-viewport centered dialog (mounted at app root). +#[component] +pub fn OverlayShell( + title: String, + subtitle: String, + accent: OverlayAccent, + close_label: String, + on_close: EventHandler<()>, + header_icon: Element, + header_actions: Element, + children: Element, + #[props(default = "max-w-5xl")] max_width: &'static str, +) -> Element { + let header_gradient = accent.header_gradient(); + let icon_wrap = accent.icon_wrap(); + + rsx! { + div { + class: "app-overlay fixed inset-0 z-[9999] flex items-center justify-center p-4 sm:p-8 bg-black/55", + role: "presentation", + tabindex: "-1", + onkeydown: move |e: KeyboardEvent| { + if e.key() == Key::Escape { + on_close.call(()); + } + }, + onclick: move |_| on_close.call(()), + div { + class: "relative flex flex-col w-full {max_width} max-h-[min(90vh,920px)] \ + rounded-xl border border-gray-200 bg-white shadow-2xl overflow-hidden", + role: "dialog", + aria_modal: "true", + aria_label: "{title}", + onclick: move |e| e.stop_propagation(), + div { + class: "flex items-center gap-3 px-4 sm:px-6 py-4 border-b border-gray-200 {header_gradient} shrink-0", + div { + class: "flex items-center justify-center w-9 h-9 rounded-lg {icon_wrap} shrink-0", + {header_icon} + } + div { class: "flex-1 min-w-0", + h2 { class: "text-base font-semibold text-gray-900 truncate", "{title}" } + p { class: "text-xs text-gray-500 mt-0.5", "{subtitle}" } + } + {header_actions} + button { + r#type: "button", + class: "p-2 rounded-lg border border-gray-200 text-gray-500 hover:bg-gray-100 hover:text-gray-800 transition-colors shrink-0", + title: "Close", + aria_label: "{close_label}", + onclick: move |e| { + e.stop_propagation(); + on_close.call(()); + }, + Icon { icon: &icondata::AiCloseOutlined, class: "w-4 h-4" } + } + } + div { + class: "flex-1 overflow-y-auto min-h-0 px-4 sm:px-6 py-4 sm:py-5", + {children} + } + } + } + } +} diff --git a/web/src/components/profiling_sidebar_hint.rs b/web/src/components/profiling_sidebar_hint.rs index 41226cca..2e94fdde 100644 --- a/web/src/components/profiling_sidebar_hint.rs +++ b/web/src/components/profiling_sidebar_hint.rs @@ -13,7 +13,7 @@ pub fn ProfilingSidebarHint() -> Element { rsx! { div { class: "mb-3 px-3 py-2 text-xs rounded-md border border-amber-200 bg-amber-50 text-amber-900", - "Profiling controls (sampling frequency, timeline reload) are in the left sidebar — use the menu button (top-left) to show it." + "Profiling controls (sampling frequency, timeline reload), background tasks, and Torch overhead are in the left sidebar Monitor section — use the menu button (top-left) to show it." } } } diff --git a/web/src/components/sidebar/mod.rs b/web/src/components/sidebar/mod.rs index c8392345..cd2a2998 100644 --- a/web/src/components/sidebar/mod.rs +++ b/web/src/components/sidebar/mod.rs @@ -11,17 +11,17 @@ use crate::state::sidebar::{ load_sidebar_state, save_sidebar_state, SIDEBAR_HIDDEN, SIDEBAR_WIDTH, }; +mod monitors; mod nav_item; mod profiling; mod resize; mod stack; -mod tasks; +use monitors::SidebarMonitors; use nav_item::{SidebarNavItem, SidebarSectionLabel}; use profiling::ProfilingSidebarItem; use resize::ResizeHandle; use stack::StackSidebarItem; -use tasks::SidebarTaskQueue; fn sidebar_classes() -> ( &'static str, @@ -157,7 +157,7 @@ pub fn Sidebar() -> Element { } } - SidebarTaskQueue {} + SidebarMonitors {} div { class: "{footer}", a { diff --git a/web/src/components/sidebar/monitors.rs b/web/src/components/sidebar/monitors.rs new file mode 100644 index 00000000..3943c7cb --- /dev/null +++ b/web/src/components/sidebar/monitors.rs @@ -0,0 +1,126 @@ +//! Sidebar monitors — compact task + overhead summary rows; overlays render at app root. + +use dioxus::prelude::*; + +use crate::api::ApiClient; +use crate::components::icon::Icon; +use crate::components::overhead::{ + overhead_trigger_label, table_missing_trigger_label, OVERHEAD_POLL_MS, +}; +use crate::components::sidebar::nav_item::SidebarSectionLabel; +use crate::hooks::{use_app_resource, use_page_visible, use_poll_tick_gated}; +use crate::state::overlays::{monitor_overlay_open, open_monitor_overlay, SidebarMonitor}; +use crate::state::ui_tasks::{ui_tasks_snapshot, UiTask, UiTaskStatus, UI_TASK_TICK}; +use crate::utils::error::AppError; + +fn overhead_trigger_label_from( + result: &Option>, +) -> String { + match result { + None => "Loading…".to_string(), + Some(Err(err)) => { + table_missing_trigger_label(err).unwrap_or_else(|| "Overhead unavailable".to_string()) + } + Some(Ok(df)) => overhead_trigger_label(df), + } +} + +fn task_summary_line(tasks: &[UiTask]) -> (String, bool) { + if let Some(task) = tasks.iter().find(|t| t.is_running()) { + return (task.label.clone(), true); + } + if let Some(task) = tasks.last() { + let suffix = match task.status { + UiTaskStatus::Failed => " (failed)", + UiTaskStatus::Cancelled => " (cancelled)", + _ => "", + }; + return (format!("{}{suffix}", task.label), false); + } + ("No background tasks".to_string(), false) +} + +#[component] +pub fn SidebarMonitors() -> Element { + let overlay_open = monitor_overlay_open(); + let _tick = UI_TASK_TICK.read(); + let tasks = ui_tasks_snapshot(); + let running = tasks.iter().filter(|t| t.is_running()).count(); + let (task_label, task_running) = task_summary_line(&tasks); + + let visible = use_page_visible(); + let poll = use_poll_tick_gated(OVERHEAD_POLL_MS, Some(visible)); + let refresh_tick = poll(); + + let summary = use_app_resource(move || { + let _ = refresh_tick; + async move { ApiClient::new().fetch_overhead_summary().await } + }); + let overhead_label = overhead_trigger_label_from(&summary.read()); + + rsx! { + div { + class: "shrink-0 border-t border-slate-700/30 px-2 py-1.5 space-y-1", + SidebarSectionLabel { label: "Monitor" } + + button { + class: "w-full flex items-center gap-1.5 px-2 py-1.5 rounded-md border border-slate-700/50 \ + bg-slate-800/30 hover:bg-slate-800/60 hover:border-blue-700/40 transition-colors \ + text-left min-w-0", + title: "Open background tasks", + aria_expanded: if overlay_open == Some(SidebarMonitor::Tasks) { "true" } else { "false" }, + onclick: move |e| { + e.stop_propagation(); + open_monitor_overlay(SidebarMonitor::Tasks); + }, + if task_running { + span { + class: "inline-block w-2 h-2 border border-blue-400 border-t-transparent rounded-full animate-spin shrink-0" + } + } else if tasks.is_empty() { + Icon { icon: &icondata::AiUnorderedListOutlined, class: "w-3 h-3 text-slate-500 shrink-0" } + } else { + Icon { icon: &icondata::AiCheckOutlined, class: "w-3 h-3 text-slate-500 shrink-0" } + } + span { + class: "flex-1 min-w-0 text-[10px] text-slate-200 truncate font-medium", + "{task_label}" + } + if running > 0 { + span { + class: "shrink-0 text-[10px] tabular-nums text-blue-300 font-medium", + "{running}" + } + } + Icon { + icon: &icondata::AiExpandAltOutlined, + class: "w-3 h-3 text-slate-500 shrink-0" + } + } + + button { + class: "w-full flex items-center gap-1.5 px-2 py-1.5 rounded-md border border-slate-700/50 \ + bg-slate-800/30 hover:bg-slate-800/60 hover:border-emerald-700/40 transition-colors \ + text-left min-w-0", + title: "Open TorchProbe overhead monitor", + aria_expanded: if overlay_open == Some(SidebarMonitor::Overhead) { "true" } else { "false" }, + onclick: move |e| { + e.stop_propagation(); + open_monitor_overlay(SidebarMonitor::Overhead); + }, + Icon { + icon: &icondata::CgPerformance, + class: "w-3 h-3 text-emerald-400/90 shrink-0" + } + span { + class: "flex-1 min-w-0 text-[10px] text-slate-200 truncate font-medium", + "{overhead_label}" + } + Icon { + icon: &icondata::AiExpandAltOutlined, + class: "w-3 h-3 text-slate-500 shrink-0" + } + } + } + } +} diff --git a/web/src/components/sidebar/tasks.rs b/web/src/components/sidebar/tasks.rs deleted file mode 100644 index b7991a85..00000000 --- a/web/src/components/sidebar/tasks.rs +++ /dev/null @@ -1,245 +0,0 @@ -//! Sidebar task queue — compact summary row + click-to-open popover. - -use dioxus::prelude::*; -use wasm_bindgen::JsCast; -use web_sys::Element as DomElement; - -use crate::components::icon::Icon; -use crate::components::sidebar::nav_item::SidebarSectionLabel; -use crate::state::sidebar::SIDEBAR_WIDTH; -use crate::state::ui_tasks::{ - cancel_all_running_ui_tasks, cancel_ui_task, clear_finished_ui_tasks, ui_tasks_snapshot, - UiTask, UiTaskStatus, UI_TASK_TICK, -}; - -const TASK_TRIGGER_ID: &str = "sidebar-task-trigger"; -const PANEL_GAP_PX: f64 = 6.0; - -/// Anchor the popover above the trigger using viewport coordinates (avoids sidebar overflow clipping). -fn task_panel_style(trigger_id: &str) -> String { - let Some(window) = web_sys::window() else { - return String::new(); - }; - let Some(document) = window.document() else { - return String::new(); - }; - let Some(el) = document.get_element_by_id(trigger_id) else { - return String::new(); - }; - let Ok(html_el) = el.dyn_into::() else { - return String::new(); - }; - let rect = html_el.get_bounding_client_rect(); - let top = rect.top(); - let left = rect.left(); - let width = rect.width(); - let vh = document - .document_element() - .map(|el| el.client_height() as f64) - .unwrap_or(top + 200.0); - // `bottom` = distance from viewport bottom to the panel's bottom edge (just above the button). - let bottom = (vh - top + PANEL_GAP_PX).max(PANEL_GAP_PX); - let max_h = (top - PANEL_GAP_PX - 8.0).max(120.0); - format!( - "position:fixed;bottom:{bottom}px;left:{left}px;width:{width}px;max-height:{max_h}px;z-index:50;", - ) -} - -#[component] -pub fn SidebarTaskQueue() -> Element { - let mut show_panel = use_signal(|| false); - let mut panel_style = use_signal(String::new); - let _tick = UI_TASK_TICK.read(); - let sidebar_width = *SIDEBAR_WIDTH.read(); - let tasks = ui_tasks_snapshot(); - let now_ms = js_sys::Date::now() as u64; - let running = tasks.iter().filter(|t| t.is_running()).count(); - let has_finished = tasks.iter().any(|t| !t.is_running()); - let (summary_label, summary_running) = task_summary_line(&tasks); - - use_effect(move || { - let _ = sidebar_width; - if show_panel() { - panel_style.set(task_panel_style(TASK_TRIGGER_ID)); - } - }); - - rsx! { - div { - class: "shrink-0 border-t border-slate-700/30 px-2 py-1.5 relative", - SidebarSectionLabel { label: "Tasks" } - button { - id: TASK_TRIGGER_ID, - class: "mt-1 w-full flex items-center gap-1.5 px-2 py-1.5 rounded-md border border-slate-700/50 \ - bg-slate-800/30 hover:bg-slate-800/60 hover:border-slate-600/70 transition-colors \ - text-left min-w-0", - title: "Show task list", - aria_expanded: if show_panel() { "true" } else { "false" }, - onclick: move |e| { - e.stop_propagation(); - let opening = !show_panel(); - show_panel.set(opening); - if opening { - panel_style.set(task_panel_style(TASK_TRIGGER_ID)); - } - }, - if summary_running { - span { - class: "inline-block w-2 h-2 border border-blue-400 border-t-transparent rounded-full animate-spin shrink-0" - } - } else if tasks.is_empty() { - Icon { icon: &icondata::AiUnorderedListOutlined, class: "w-3 h-3 text-slate-500 shrink-0" } - } else { - Icon { icon: &icondata::AiCheckOutlined, class: "w-3 h-3 text-slate-500 shrink-0" } - } - span { - class: "flex-1 min-w-0 text-[10px] text-slate-200 truncate font-medium", - "{summary_label}" - } - if running > 0 { - span { - class: "shrink-0 text-[10px] tabular-nums text-blue-300 font-medium", - "{running}" - } - } - Icon { - icon: if show_panel() { &icondata::AiUpOutlined } else { &icondata::AiDownOutlined }, - class: "w-3 h-3 text-slate-500 shrink-0" - } - } - - if show_panel() { - div { - class: "fixed inset-0 z-40", - onclick: move |_| show_panel.set(false), - } - div { - class: "flex flex-col rounded-lg border border-slate-600/80 bg-slate-900 shadow-2xl overflow-hidden", - style: "{panel_style()}", - role: "dialog", - aria_label: "Background tasks", - onclick: move |e| e.stop_propagation(), - div { - class: "flex items-center justify-between gap-2 px-2.5 py-2 border-b border-slate-700/60 bg-slate-800/80", - span { class: "text-[10px] font-medium text-slate-300", - if running > 0 { - "{running} active · {tasks.len()} total" - } else { - "{tasks.len()} tasks" - } - } - div { class: "flex items-center gap-2 shrink-0", - if running > 0 { - button { - class: "text-[10px] text-slate-500 hover:text-red-300 transition-colors", - title: "Cancel all running tasks", - onclick: move |_| cancel_all_running_ui_tasks(), - "Cancel all" - } - } - if has_finished { - button { - class: "text-[10px] text-slate-500 hover:text-slate-300 transition-colors", - onclick: move |_| clear_finished_ui_tasks(), - "Clear" - } - } - } - } - if tasks.is_empty() { - p { class: "px-3 py-4 text-[10px] text-slate-500 text-center", - "No background tasks" - } - } else { - div { class: "overflow-y-auto min-h-0 p-1 space-y-0.5", - for task in tasks.iter().rev() { - TaskRow { key: "{task.id}", task: task.clone(), now_ms: now_ms } - } - } - } - } - } - } - } -} - -fn task_summary_line(tasks: &[UiTask]) -> (String, bool) { - if let Some(task) = tasks.iter().find(|t| t.is_running()) { - return (task.label.clone(), true); - } - if let Some(task) = tasks.last() { - let suffix = match task.status { - UiTaskStatus::Failed => " (failed)", - UiTaskStatus::Cancelled => " (cancelled)", - _ => "", - }; - return (format!("{}{suffix}", task.label), false); - } - ("No background tasks".to_string(), false) -} - -#[component] -fn TaskRow(task: UiTask, now_ms: u64) -> Element { - let row_class = match task.status { - UiTaskStatus::Running => "bg-slate-800/40 border-slate-700/50", - UiTaskStatus::Done => "border-transparent opacity-70", - UiTaskStatus::Failed => "bg-red-950/30 border-red-900/40", - UiTaskStatus::Cancelled => "border-transparent opacity-60", - }; - - let kind_label = task.kind.label(); - let elapsed = task.elapsed_label(now_ms); - let task_id = task.id; - - rsx! { - div { - class: "flex items-start gap-1.5 px-2 py-1 rounded border text-[10px] leading-snug {row_class}", - title: task.error.clone().unwrap_or_else(|| task.label.clone()), - match task.status { - UiTaskStatus::Running => rsx! { - span { - class: "inline-block w-2.5 h-2.5 border border-blue-400 border-t-transparent rounded-full animate-spin shrink-0 mt-0.5" - } - }, - UiTaskStatus::Done => rsx! { - Icon { icon: &icondata::AiCheckOutlined, class: "w-3 h-3 text-emerald-400 shrink-0 mt-0.5" } - }, - UiTaskStatus::Failed => rsx! { - Icon { icon: &icondata::AiCloseCircleOutlined, class: "w-3 h-3 text-red-400 shrink-0 mt-0.5" } - }, - UiTaskStatus::Cancelled => rsx! { - Icon { icon: &icondata::AiStopOutlined, class: "w-3 h-3 text-slate-500 shrink-0 mt-0.5" } - }, - } - div { class: "flex-1 min-w-0", - div { class: "text-slate-200 truncate font-medium", "{task.label}" } - div { class: "text-slate-500 truncate", - span { "{kind_label}" } - if let Some(detail) = &task.detail { - span { " · {detail}" } - } - } - if let Some(err) = &task.error { - div { class: "text-red-300/90 truncate mt-0.5", "{err}" } - } - if task.status == UiTaskStatus::Cancelled { - div { class: "text-slate-500 truncate mt-0.5", "Cancelled" } - } - } - div { class: "flex flex-col items-end gap-0.5 shrink-0", - span { class: "text-slate-500 tabular-nums pt-0.5", "{elapsed}" } - if task.is_running() { - button { - class: "p-0.5 rounded text-slate-500 hover:text-red-300 hover:bg-slate-700/50 transition-colors", - title: if task.group_id.is_some() { "Cancel session" } else { "Cancel task" }, - onclick: move |e| { - e.stop_propagation(); - cancel_ui_task(task_id); - }, - Icon { icon: &icondata::AiCloseOutlined, class: "w-3 h-3" } - } - } - } - } - } -} diff --git a/web/src/components/source_viewer.rs b/web/src/components/source_viewer.rs index f0ab476c..76507f17 100644 --- a/web/src/components/source_viewer.rs +++ b/web/src/components/source_viewer.rs @@ -10,32 +10,16 @@ use crate::api::ApiClient; use crate::components::icon::Icon; use crate::components::workspace::{AccentSurface, ChipButton, SurfaceCardBody, SurfaceIconHeader}; use crate::hooks::use_app_resource; -use crate::state::source_viewer::{ - close_source_viewer, open_source_viewer, unlock_body_scroll, SOURCE_VIEWER_OPEN, - SOURCE_VIEWER_TARGET, -}; +use crate::state::source_viewer::{close_source_viewer, open_source_viewer, source_viewer_target}; use crate::state::ui_tasks::ui_agent_busy; use crate::utils::source_ref::{ file_display_name, language_class, slice_source, SourceSlice, DEFAULT_SOURCE_CONTEXT, }; -/// Centered floating dialog for source preview (mounted on [`crate::app::App`]). +/// Centered floating dialog for source preview (mounted via [`crate::components::app_overlays::AppOverlays`]). #[component] pub fn SourceViewerOverlay() -> Element { - let open = *SOURCE_VIEWER_OPEN.read(); - - use_effect(move || { - if !open { - unlock_body_scroll(); - } - }); - - if !open { - return rsx! {}; - } - - let target = SOURCE_VIEWER_TARGET.read().clone(); - let Some(target) = target else { + let Some(target) = source_viewer_target() else { return rsx! {}; }; diff --git a/web/src/main.rs b/web/src/main.rs index 76aa23ac..27651e25 100644 --- a/web/src/main.rs +++ b/web/src/main.rs @@ -7,6 +7,7 @@ mod api; mod app; mod components; mod hooks; +mod overhead; mod pages; mod state; mod utils; diff --git a/web/src/overhead/metrics.rs b/web/src/overhead/metrics.rs new file mode 100644 index 00000000..bb2424c2 --- /dev/null +++ b/web/src/overhead/metrics.rs @@ -0,0 +1,191 @@ +//! TorchProbe overhead domain logic (metrics, parsing, labels). + +use probing_proto::prelude::{DataFrame, Ele}; + +use crate::overhead::sql::WINDOW_STEPS; +use crate::utils::error::AppError; + +#[derive(Clone, Debug, PartialEq)] +pub struct OverheadStep { + pub local_step: i64, + pub duration_ms: f64, + pub is_shadow: bool, + pub sampled: bool, +} + +pub fn table_missing_message(err: &AppError) -> Option<&'static str> { + let msg = err.display_message().to_ascii_lowercase(); + if msg.contains("torch_step_timing") + && (msg.contains("not found") || msg.contains("does not exist")) + { + Some( + "Table python.torch_step_timing is not registered yet — enable SET probing.torch.profiling=on and wait for the first training steps.", + ) + } else { + None + } +} + +pub fn table_missing_trigger_label(err: &AppError) -> Option { + table_missing_message(err).map(|_| "Profiler off".to_string()) +} + +pub fn overhead_trigger_label(summary: &DataFrame) -> String { + let shadow_baseline = df_scalar_i64(summary, "shadow_baseline", 0).unwrap_or(0); + if shadow_baseline == 0 { + return "Shadow off".to_string(); + } + let probed_n = df_scalar_i64(summary, "probed_n", 0).unwrap_or(0); + let shadow_n = df_scalar_i64(summary, "shadow_n", 0).unwrap_or(0); + if probed_n == 0 || shadow_n == 0 { + return "Collecting baseline…".to_string(); + } + let probed_median_ms = df_scalar_f64(summary, "probed_median_ms", 0); + let shadow_median_ms = df_scalar_f64(summary, "shadow_median_ms", 0); + match (probed_median_ms, shadow_median_ms) { + (Some(p), Some(s)) => { + let (hook_tax, _) = format_overhead_pct(p, s, "Hook tax"); + let latest = df_scalar_i64(summary, "latest_step", 0).unwrap_or(-1); + format!("{hook_tax} · step {latest}") + } + _ => "Collecting baseline…".to_string(), + } +} + +pub fn parse_overhead_steps(df: &DataFrame) -> Vec { + let mut steps = Vec::new(); + let rows = dataframe_rows(df); + for row in 0..rows { + let Some(local_step) = df_scalar_i64(df, "local_step", row) else { + continue; + }; + let Some(duration_ms) = df_scalar_f64(df, "duration_ms", row) else { + continue; + }; + let is_shadow = df_col_index(df, "is_shadow") + .and_then(|ci| df.cols.get(ci)) + .filter(|col| row < col.len()) + .map(|col| ele_boolish(&col.get(row))) + .unwrap_or(false); + let sampled = df_col_index(df, "sampled") + .and_then(|ci| df.cols.get(ci)) + .filter(|col| row < col.len()) + .map(|col| ele_boolish(&col.get(row))) + .unwrap_or(false); + steps.push(OverheadStep { + local_step, + duration_ms, + is_shadow, + sampled, + }); + } + steps +} + +pub fn format_step_ms(ms: f64) -> String { + if ms >= 100.0 { + format!("{ms:.0} ms") + } else if ms >= 1.0 { + format!("{ms:.1} ms") + } else if ms > 0.0 { + format!("{ms:.2} ms") + } else { + "0 ms".to_string() + } +} + +pub fn format_overhead_pct( + probed_ms: f64, + shadow_ms: f64, + context: &str, +) -> (String, Option) { + if shadow_ms <= 0.0 { + return ( + "—".to_string(), + Some("Need shadow baseline steps".to_string()), + ); + } + let pct = (probed_ms / shadow_ms - 1.0) * 100.0; + let hint = Some(format!("{context} · last {WINDOW_STEPS} steps")); + if pct.abs() < 0.5 { + ("≈0%".to_string(), hint) + } else if pct > 0.0 { + (format!("+{pct:.1}%"), hint) + } else { + (format!("{pct:.1}%"), hint) + } +} + +pub fn dataframe_rows(df: &DataFrame) -> usize { + df.cols.first().map(|c| c.len()).unwrap_or(0) +} + +pub fn df_scalar_f64(df: &DataFrame, col: &str, row: usize) -> Option { + let ci = df_col_index(df, col)?; + let column = df.cols.get(ci)?; + if row >= column.len() { + return None; + } + ele_f64(&column.get(row)) +} + +pub fn df_scalar_i64(df: &DataFrame, col: &str, row: usize) -> Option { + let ci = df_col_index(df, col)?; + let column = df.cols.get(ci)?; + if row >= column.len() { + return None; + } + ele_i64(&column.get(row)) +} + +fn df_col_index(df: &DataFrame, name: &str) -> Option { + df.names.iter().position(|n| n == name) +} + +fn ele_f64(ele: &Ele) -> Option { + match ele { + Ele::F64(x) => Some(*x), + Ele::F32(x) => Some(*x as f64), + Ele::I64(x) => Some(*x as f64), + Ele::I32(x) => Some(*x as f64), + Ele::Text(s) => s.parse().ok(), + _ => None, + } +} + +fn ele_i64(ele: &Ele) -> Option { + match ele { + Ele::I64(x) => Some(*x), + Ele::I32(x) => Some(*x as i64), + Ele::F64(x) => Some(*x as i64), + Ele::Text(s) => s.parse().ok(), + _ => None, + } +} + +fn ele_boolish(ele: &Ele) -> bool { + match ele { + Ele::BOOL(x) => *x, + Ele::I64(x) => *x != 0, + Ele::I32(x) => *x != 0, + Ele::Text(s) => matches!(s.as_str(), "1" | "true" | "True"), + _ => false, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn overhead_pct_positive() { + let (value, _) = format_overhead_pct(133.0, 100.0, "test"); + assert_eq!(value, "+33.0%"); + } + + #[test] + fn overhead_pct_near_zero() { + let (value, _) = format_overhead_pct(100.2, 100.0, "test"); + assert_eq!(value, "≈0%"); + } +} diff --git a/web/src/overhead/mod.rs b/web/src/overhead/mod.rs new file mode 100644 index 00000000..81c683b6 --- /dev/null +++ b/web/src/overhead/mod.rs @@ -0,0 +1,10 @@ +//! TorchProbe overhead analytics (SQL + metrics). UI lives under `components/overhead/`. + +pub mod metrics; +pub mod sql; + +pub use metrics::{ + dataframe_rows, df_scalar_f64, df_scalar_i64, format_overhead_pct, format_step_ms, + overhead_trigger_label, parse_overhead_steps, table_missing_message, + table_missing_trigger_label, OverheadStep, +}; diff --git a/web/src/overhead/sql.rs b/web/src/overhead/sql.rs new file mode 100644 index 00000000..0a0670bd --- /dev/null +++ b/web/src/overhead/sql.rs @@ -0,0 +1,68 @@ +//! SQL for TorchProbe in-run overhead (`python.torch_step_timing`). + +/// Rolling window size for overhead aggregates (larger → stabler medians). +pub const WINDOW_STEPS: i64 = 80; + +/// Recent step bars in the timeline panel. +pub const RECENT_STEPS: i64 = 24; + +/// Legacy mmap rows may have registered numeric columns as Utf8 — cast at query time. +const STEP_SEC: &str = "CAST(step_duration_sec AS DOUBLE)"; +const IS_SHADOW: &str = "CAST(is_shadow AS BIGINT)"; +const IS_SAMPLED: &str = "CAST(sampled AS BIGINT)"; +const SHADOW_NORMAL: &str = "CAST(shadow_normal AS BIGINT)"; +const SHADOW_BASELINE: &str = "CAST(shadow_baseline AS BIGINT)"; +const SAMPLE_RATE: &str = "CAST(sample_rate AS DOUBLE)"; + +const TIMING_TABLE: &str = "python.torch_step_timing"; + +fn window_start(table: &str, window_steps: i64) -> String { + format!("GREATEST(COALESCE((SELECT max(local_step) FROM {table}), 0) - {window_steps}, 1)") +} + +pub fn summary() -> String { + let win = window_start(TIMING_TABLE, WINDOW_STEPS); + format!( + "SELECT \ + round((SELECT median({STEP_SEC}) FROM {TIMING_TABLE} \ + WHERE {IS_SHADOW} = 0 AND local_step >= {win}) * 1000, 1) AS probed_median_ms, \ + round((SELECT median({STEP_SEC}) FROM {TIMING_TABLE} \ + WHERE {IS_SHADOW} = 0 AND {IS_SAMPLED} = 1 AND local_step >= {win}) * 1000, 1) AS sampled_median_ms, \ + round((SELECT median({STEP_SEC}) FROM {TIMING_TABLE} \ + WHERE {IS_SHADOW} = 1 AND local_step >= {win}) * 1000, 1) AS shadow_median_ms, \ + round((SELECT avg({STEP_SEC}) FROM {TIMING_TABLE} \ + WHERE {IS_SHADOW} = 0 AND local_step >= {win}) * 1000, 1) AS probed_mean_ms, \ + round((SELECT avg({STEP_SEC}) FROM {TIMING_TABLE} \ + WHERE {IS_SHADOW} = 1 AND local_step >= {win}) * 1000, 1) AS shadow_mean_ms, \ + (SELECT count(*) FROM {TIMING_TABLE} \ + WHERE {IS_SHADOW} = 0 AND local_step >= {win}) AS probed_n, \ + (SELECT count(*) FROM {TIMING_TABLE} \ + WHERE {IS_SHADOW} = 0 AND {IS_SAMPLED} = 1 AND local_step >= {win}) AS sampled_n, \ + (SELECT count(*) FROM {TIMING_TABLE} \ + WHERE {IS_SHADOW} = 1 AND local_step >= {win}) AS shadow_n, \ + (SELECT max(local_step) FROM {TIMING_TABLE}) AS latest_step, \ + (SELECT {SHADOW_NORMAL} FROM {TIMING_TABLE} ORDER BY local_step DESC LIMIT 1) AS shadow_normal, \ + (SELECT {SHADOW_BASELINE} FROM {TIMING_TABLE} ORDER BY local_step DESC LIMIT 1) AS shadow_baseline, \ + (SELECT {SAMPLE_RATE} FROM {TIMING_TABLE} ORDER BY local_step DESC LIMIT 1) AS sample_rate, \ + (SELECT sample_mode FROM {TIMING_TABLE} ORDER BY local_step DESC LIMIT 1) AS sample_mode" + ) +} + +pub fn recent_steps() -> String { + format!( + "SELECT local_step, \ + round({STEP_SEC} * 1000, 1) AS duration_ms, {IS_SHADOW} AS is_shadow, {IS_SAMPLED} AS sampled \ + FROM {TIMING_TABLE} \ + WHERE local_step >= GREATEST(COALESCE((SELECT max(local_step) FROM {TIMING_TABLE}), 0) - {RECENT_STEPS}, 1) \ + ORDER BY local_step" + ) +} + +pub const TRAIN_STEP_MEDIAN: &str = + "SELECT round(median((CAST(e.time AS BIGINT) - CAST(s.time AS BIGINT)) / 1000000.0), 1) AS train_step_median_ms \ + FROM python.trace_event s \ + JOIN python.trace_event e ON s.span_id = e.span_id AND e.record_type = 'span_end' \ + WHERE s.record_type = 'span_start' AND s.name = 'train.step'"; + +pub const NCCL_COUNTERS: &str = "SELECT coll_events, rows_written, pool_exhausted, write_errors \ + FROM nccl.profiler_counters ORDER BY ts DESC LIMIT 1"; diff --git a/web/src/pages/profiling.rs b/web/src/pages/profiling.rs index b56ca60a..bf42ea0d 100644 --- a/web/src/pages/profiling.rs +++ b/web/src/pages/profiling.rs @@ -64,7 +64,7 @@ fn view_icon(view: &str) -> &'static icondata::Icon { fn view_subtitle(view: &str) -> String { match view { "pprof" => "SIGPROF stack explorer · statistical sampling".to_string(), - "torch" => "Median post-hook duration · statistical sampling".to_string(), + "torch" => "Module flamegraph from TorchProbe hooks".to_string(), "trace" => "Chrome trace events from probing buffers — not distributed spans".to_string(), "pytorch" => "PyTorch profiler chrome trace".to_string(), "ray" => "Ray task timeline".to_string(), @@ -140,9 +140,9 @@ fn FlamegraphLoader(view: String) -> Element { } rsx! { - FlamegraphData { - key: "{profiler_name}", - profiler_name: profiler_name.to_string(), + AsyncBoundary { + message: Some("Loading flamegraph…".to_string()), + FlamegraphData { key: "{profiler_name}", profiler_name: profiler_name.to_string() } } } } @@ -181,7 +181,7 @@ fn FlamegraphData(profiler_name: String) -> Element { match payload.suspend()?() { Ok(data) => rsx! { - div { class: "flex flex-col flex-1 min-h-[600px]", + div { class: "flex flex-col flex-1 min-h-0 min-w-0", if let Some(tid) = thread_tid { div { class: "px-4 py-2 text-xs bg-blue-50 border-b border-blue-100 flex flex-wrap items-center gap-2", diff --git a/web/src/pages/training.rs b/web/src/pages/training.rs index d882a38d..7fa6d6f3 100644 --- a/web/src/pages/training.rs +++ b/web/src/pages/training.rs @@ -112,7 +112,7 @@ fn step_module_sql(coord_step: i64) -> String { fn step_span_sql(display_step: i64) -> String { format!( - "SELECT s.name, s.phase, round((e.time - s.time) / 1000000.0, 2) AS duration_ms \ + "SELECT s.name, s.phase, round((CAST(e.time AS BIGINT) - CAST(s.time AS BIGINT)) / 1000000.0, 2) AS duration_ms \ FROM python.trace_event s \ JOIN python.trace_event e ON s.span_id = e.span_id AND e.record_type = 'span_end' \ WHERE s.record_type = 'span_start' AND s.name != 'train.step' \ diff --git a/web/src/state/mod.rs b/web/src/state/mod.rs index 637396c3..36cd80f3 100644 --- a/web/src/state/mod.rs +++ b/web/src/state/mod.rs @@ -3,9 +3,11 @@ pub mod commands; pub mod investigation; pub mod investigation_url; pub mod llm_config; +pub mod overlays; pub mod page_context; pub mod profile_snapshots; pub mod profiling; +pub mod scroll_lock; pub mod sidebar; pub mod source_viewer; pub mod stack; diff --git a/web/src/state/overlays.rs b/web/src/state/overlays.rs new file mode 100644 index 00000000..8f9dff87 --- /dev/null +++ b/web/src/state/overlays.rs @@ -0,0 +1,71 @@ +//! Global app overlays (source viewer, sidebar monitors, …). + +use dioxus::prelude::*; + +use crate::state::scroll_lock::{lock_body_scroll, unlock_body_scroll}; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SourceViewerTarget { + pub path: String, + pub line: Option, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum SidebarMonitor { + Tasks, + Overhead, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum AppOverlay { + SourceViewer(SourceViewerTarget), + Monitor(SidebarMonitor), +} + +pub static APP_OVERLAY: GlobalSignal> = Signal::global(|| None); + +pub fn app_overlay() -> Option { + APP_OVERLAY.read().clone() +} + +pub fn open_app_overlay(overlay: AppOverlay) { + *APP_OVERLAY.write() = Some(overlay); + lock_body_scroll(); +} + +pub fn close_app_overlay() { + *APP_OVERLAY.write() = None; + unlock_body_scroll(); +} + +pub fn open_monitor_overlay(monitor: SidebarMonitor) { + open_app_overlay(AppOverlay::Monitor(monitor)); +} + +pub fn monitor_overlay_open() -> Option { + match app_overlay() { + Some(AppOverlay::Monitor(m)) => Some(m), + _ => None, + } +} + +pub fn open_source_viewer(path: String, line: Option) { + open_app_overlay(AppOverlay::SourceViewer(SourceViewerTarget { path, line })); +} + +pub fn close_source_viewer() { + if matches!(app_overlay(), Some(AppOverlay::SourceViewer(_))) { + close_app_overlay(); + } +} + +pub fn source_viewer_open() -> bool { + matches!(app_overlay(), Some(AppOverlay::SourceViewer(_))) +} + +pub fn source_viewer_target() -> Option { + match app_overlay() { + Some(AppOverlay::SourceViewer(target)) => Some(target), + _ => None, + } +} diff --git a/web/src/state/scroll_lock.rs b/web/src/state/scroll_lock.rs new file mode 100644 index 00000000..e7543110 --- /dev/null +++ b/web/src/state/scroll_lock.rs @@ -0,0 +1,25 @@ +//! Shared document scroll lock for viewport overlays. + +pub fn lock_body_scroll() { + let Some(body) = web_sys::window() + .and_then(|w| w.document()) + .and_then(|d| d.body()) + else { + return; + }; + let _ = body.set_attribute("data-probing-scroll-lock", "1"); + let _ = body.style().set_property("overflow", "hidden"); +} + +pub fn unlock_body_scroll() { + let Some(body) = web_sys::window() + .and_then(|w| w.document()) + .and_then(|d| d.body()) + else { + return; + }; + if body.get_attribute("data-probing-scroll-lock").is_some() { + let _ = body.remove_attribute("data-probing-scroll-lock"); + let _ = body.style().set_property("overflow", ""); + } +} diff --git a/web/src/state/source_viewer.rs b/web/src/state/source_viewer.rs index a6d3687a..b407b8a2 100644 --- a/web/src/state/source_viewer.rs +++ b/web/src/state/source_viewer.rs @@ -1,48 +1,5 @@ -//! Global floating source code preview. +//! Source code preview overlay — thin API over [`crate::state::overlays`]. -use dioxus::prelude::*; - -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct SourceViewerTarget { - pub path: String, - pub line: Option, -} - -pub static SOURCE_VIEWER_OPEN: GlobalSignal = Signal::global(|| false); -pub static SOURCE_VIEWER_TARGET: GlobalSignal> = Signal::global(|| None); - -pub fn open_source_viewer(path: String, line: Option) { - *SOURCE_VIEWER_TARGET.write() = Some(SourceViewerTarget { path, line }); - *SOURCE_VIEWER_OPEN.write() = true; - lock_body_scroll(); -} - -pub fn close_source_viewer() { - *SOURCE_VIEWER_OPEN.write() = false; - *SOURCE_VIEWER_TARGET.write() = None; - unlock_body_scroll(); -} - -fn lock_body_scroll() { - let Some(body) = web_sys::window() - .and_then(|w| w.document()) - .and_then(|d| d.body()) - else { - return; - }; - let _ = body.set_attribute("data-probing-scroll-lock", "1"); - let _ = body.style().set_property("overflow", "hidden"); -} - -pub fn unlock_body_scroll() { - let Some(body) = web_sys::window() - .and_then(|w| w.document()) - .and_then(|d| d.body()) - else { - return; - }; - if body.get_attribute("data-probing-scroll-lock").is_some() { - let _ = body.remove_attribute("data-probing-scroll-lock"); - let _ = body.style().set_property("overflow", ""); - } -} +pub use crate::state::overlays::{ + close_source_viewer, open_source_viewer, source_viewer_open, source_viewer_target, +}; From a5705db6ab6f0d7413712790bb998fd3d16e4958 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sat, 11 Jul 2026 20:50:07 +0800 Subject: [PATCH 14/37] Enhance soak testing, streamline documentation, and improve workflows (#60) * Enhance soak testing capabilities and update documentation - Added new soak testing scripts (`run_soak.sh` and `soak_assert.py`) for long-running training with assertions, improving performance validation. - Updated the Makefile to include new soak commands and enhance help documentation. - Enhanced `.gitignore` to include coverage files and improve project cleanliness. - Introduced `SoakLimits` class in `imagenet_with_span.py` to manage training duration and step limits. - Updated `README.md` to document new soak testing features and usage instructions. These changes aim to improve the testing framework and provide better tools for performance monitoring within the Probing project. * Remove dead code audit documentation file - Deleted the `code-review-implementation-quality.md` file, which contained a comprehensive audit of implementation quality and dead code across the project. This file was deemed unnecessary as the information is no longer relevant or required for ongoing development. This change aims to streamline the documentation and remove outdated content from the repository. * Update pre-commit configuration, dependencies, and enhance Makefile for improved development workflow - Removed the `black` hook from the pre-commit configuration and replaced it with `ruff-format` for code formatting. - Updated several dependencies in `Cargo.lock`, including `anyhow`, `crossbeam-epoch`, and `rand`, to their latest versions for better performance and security. - Introduced a new `deny.toml` file for managing supply-chain policies and advisories. - Enhanced the Makefile to include a new target for formatting all configurations and improved help documentation for clarity. - Added a script `fmt-all-cfgs.sh` to format code across multiple compilation targets, ensuring consistent styling across platforms. These changes aim to streamline the development process, improve code quality, and ensure better dependency management. * Add uv.lock file for dependency management and update setup-build-env action - Introduced a new `uv.lock` file to manage Python package dependencies, specifying versions and sources for packages like `appnope`, `asttokens`, and `black`. - Updated the GitHub Actions setup-build-env action to replace spaces with hyphens in the `uv-sync-groups` input, improving output formatting. These changes aim to enhance dependency management and streamline the build environment setup process. * Update uv.lock verification in GitHub Actions for improved error handling - Enhanced the verification step for the `uv.lock` file in both the setup-build-env action and the supply-chain workflow. The updated checks now ensure that the `uv.lock` file is present before proceeding, providing clearer error messages if it is missing. - This change aims to improve the reliability of dependency management by ensuring that the necessary lock file is available during the build process. * Add sync-uv-groups target to Makefile and update GitHub Actions for improved dependency synchronization - Introduced a new `sync-uv-groups` target in the Makefile to facilitate synchronization of locked Python dependencies based on specified groups. - Updated the GitHub Actions workflow to utilize the new Makefile target for syncing dependencies, enhancing error handling and ensuring the presence of the `uv.lock` file. - Improved caching strategy in the setup-build-env action by updating the cache key format for better versioning and architecture support. These changes aim to streamline the dependency management process and improve the reliability of the build environment. * Refactor error messages in process.rs for improved clarity - Updated error messages in the `Process` implementation to use formatted string syntax for better readability and consistency. This change enhances the clarity of error reporting when no processes or multiple processes are found matching the command line pattern. These modifications aim to improve the user experience by providing clearer feedback during process injection operations. * Enhance Makefile for Python linting and formatting integration - Updated the `fmt` target in the Makefile to include `ruff` for Python code formatting, ensuring it passes lint checks. - Added a new `FMT_PYTHON` variable to streamline the linting and formatting process for Python files. - Enhanced the `fmt-check` target to verify Python code formatting using `ruff`, improving code quality assurance. These changes aim to improve the development workflow by integrating Python linting and formatting into the existing Makefile structure. * Enhance GitHub Actions workflows for improved testing and wheel preparation - Updated the `pypi.yml` and `test.yml` workflows to streamline the wheel preparation process by ensuring the bundled web assets are correctly copied and organized. - Introduced a new `windows-test` job in `test.yml` to run Rust and Python tests on Windows, enhancing cross-platform testing capabilities. - Improved error handling and asset management during the wheel build process, ensuring necessary files are present and correctly structured. These changes aim to enhance the reliability and efficiency of the CI/CD pipeline, improving the overall development workflow. * Update pre-commit configuration and Makefile for improved Python linting and formatting - Upgraded `ruff` version in the pre-commit configuration to `v0.11.11` for enhanced linting capabilities. - Refined the Makefile to streamline Python linting and formatting processes, consolidating commands for better usability. - Updated documentation to reflect changes in the Python linting and formatting workflow. These modifications aim to enhance code quality and simplify the development process for Python projects. * Remove pre-commit configuration and streamline Makefile setup - Deleted the `.pre-commit-config.yaml` file to simplify the project setup and remove unnecessary dependencies. - Updated the Makefile to remove the `setup` target related to pre-commit installation, focusing on essential development dependencies. - Adjusted documentation to reflect the changes in the development workflow, ensuring clarity on the current setup process. These modifications aim to enhance the development experience by reducing complexity and focusing on core tools. --- .github/actions/setup-build-env/action.yml | 83 +- .github/dependabot.yml | 37 + .github/workflows/nightly.yml | 12 +- .github/workflows/pypi.yml | 62 +- .github/workflows/soak.yml | 186 ++ .github/workflows/supply-chain.yml | 71 + .github/workflows/test.yml | 150 +- .gitignore | 1 + .pre-commit-config.yaml | 37 - Cargo.lock | 53 +- Makefile | 94 +- deny.toml | 69 + docs/src/contributing.md | 8 +- docs/src/contributing.zh.md | 8 +- docs/src/design/architecture.md | 175 +- examples/README.md | 16 + examples/external_table_retirement.py | 43 - examples/imagenet_with_span.py | 155 +- examples/run_soak.sh | 88 + examples/soak_assert.py | 241 ++ probing/cli/src/cli/cluster.rs | 27 +- probing/cli/src/cli/skill/backend.rs | 12 +- probing/cli/src/inject/injection_aarch64.rs | 22 +- probing/cli/src/inject/process.rs | 6 +- probing/cli/src/table.rs | 18 +- probing/core/src/core/engine.rs | 11 +- probing/core/src/core/federation/convert.rs | 10 +- probing/core/src/core/federation/mod.rs | 4 +- probing/core/src/core/federation/sql_gen.rs | 3 +- probing/core/src/core/mod.rs | 8 - probing/core/src/lib.rs | 1 - probing/core/src/tracing.rs | 874 ------- probing/crates/skills/src/api.rs | 307 ++- probing/crates/skills/src/backend.rs | 40 + probing/crates/skills/src/discovery.rs | 21 +- probing/crates/skills/src/lib.rs | 6 +- probing/crates/skills/src/routing.rs | 156 +- probing/crates/skills/src/runner.rs | 6 +- probing/extensions/cc/src/extensions/mod.rs | 6 +- probing/extensions/nccl-profiler/src/state.rs | 6 +- .../python/src/features/crash/mod.rs | 5 + .../extensions/python/src/features/pprof.rs | 26 + .../python/src/features/python_api.rs | 9 +- probing/extensions/python/src/repl/session.rs | 5 + probing/extensions/python/src/setup.rs | 1 + probing/memtable/src/memtable.rs | 22 +- probing/proto/src/types/dataframe.rs | 78 +- probing/server/Cargo.toml | 3 +- probing/server/src/mcp/mod.rs | 25 +- pyproject.toml | 44 +- python/probing/discovery.py | 31 - python/probing/extensions/README.md | 1 - python/probing/inspect/trace.py | 8 +- python/probing/nccl/mock.py | 60 + python/probing/profiling/torch_probe.py | 1 - python/probing/repl/__init__.py | 1 - python/probing/repl/debug_magic.py | 8 +- python/probing/repl/stack_magic.py | 1 - python/probing/skills/README.md | 2 +- python/probing/skills/loader.py | 107 +- python/probing/timing/__init__.py | 5 +- python/probing/timing/_cuda_runtime_ffi.py | 5 +- python/probing/timing/backend.py | 1 + python/probing/timing/gates.py | 1 + python/probing/timing/timer.py | 1 + scripts/fmt-all-cfgs.sh | 69 + src/lib.rs | 44 +- .../profiling/test_span_overhead.py | 6 +- .../rust/probing/cli/inject_aarch64.rs | 2 +- tests/regression/spec/test_api_spec.py | 36 +- tests/regression/timing/test_timing_gpu.py | 4 +- .../training_observability/conftest.py | 6 +- tests/unit/probing/skills/test_loader.py | 13 + tests/unit/probing/test_discovery.py | 7 - .../probing/timing/test_timing_backend.py | 8 +- .../probing/timing/test_timing_cuda_ffi.py | 5 +- uv.lock | 2210 +++++++++++++++++ web/Cargo.toml | 3 +- web/assets/tailwind.css | 33 - web/src/agent/cluster.rs | 49 +- web/src/agent/routing.rs | 52 - web/src/agent/skill.rs | 50 +- web/src/agent/skills_backend.rs | 11 +- web/src/api/traces.rs | 52 - web/src/hooks/mod.rs | 7 +- web/src/overhead/metrics.rs | 88 +- web/src/pages/training.rs | 2 +- web/src/state/investigation.rs | 12 - web/src/utils/source_ref.rs | 2 +- 89 files changed, 4267 insertions(+), 2088 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/soak.yml create mode 100644 .github/workflows/supply-chain.yml delete mode 100644 .pre-commit-config.yaml create mode 100644 deny.toml delete mode 100644 examples/external_table_retirement.py create mode 100755 examples/run_soak.sh create mode 100755 examples/soak_assert.py delete mode 100644 probing/core/src/tracing.rs delete mode 100644 python/probing/discovery.py create mode 100755 scripts/fmt-all-cfgs.sh create mode 100644 uv.lock diff --git a/.github/actions/setup-build-env/action.yml b/.github/actions/setup-build-env/action.yml index f8079869..79166950 100644 --- a/.github/actions/setup-build-env/action.yml +++ b/.github/actions/setup-build-env/action.yml @@ -1,5 +1,5 @@ name: 'Setup Build Environment' -description: 'Setup Python, Rust, and build tools; cache env only (venv, cargo CLI) — not compile artifacts' +description: 'Setup Python, Rust, and build tools with locked deps (uv.lock) and Rust compile cache' inputs: python-version: description: 'Python version to use' @@ -10,27 +10,35 @@ inputs: required: false default: 'true' install-python-deps: - description: 'Whether to install maturin/build deps into .venv' + description: 'Legacy: install maturin/build deps via make (prefer uv-sync-groups)' required: false default: 'false' + uv-sync-groups: + description: 'Comma-separated uv dependency groups from pyproject (e.g. build,dev,wheel-test)' + required: false + default: '' enable-rust: description: 'Install Rust toolchain and targets' required: false default: 'true' + cache-rust: + description: 'Cache Rust compile artifacts (swatinem/rust-cache via setup-rust-toolchain)' + required: false + default: 'true' enable-zig: description: 'Install Zig (manylinux / cross builds)' required: false default: 'true' enable-uv: - description: 'Install uv (no GitHub cache — avoids extra cache uploads)' + description: 'Install uv for locked dependency sync' required: false default: 'true' cache-venv: - description: 'Cache project .venv (pip deps)' + description: 'Cache project .venv (pip/uv deps)' required: false default: 'true' cache-wheel-test-deps: - description: 'Include pytest+torch wheel-test deps in .venv cache key' + description: 'Include wheel-test group in .venv cache key' required: false default: 'false' dx-version: @@ -48,6 +56,10 @@ runs: echo "python_env<> "$GITHUB_OUTPUT" echo "${{ hashFiles('pyproject.toml', 'Makefile', 'uv.lock') }}" >> "$GITHUB_OUTPUT" echo "EOF" >> "$GITHUB_OUTPUT" + groups="${{ inputs.uv-sync-groups }}" + groups="${groups// /}" + groups="${groups//,/-}" + echo "uv_groups=${groups}" >> "$GITHUB_OUTPUT" - name: Set up Python uses: actions/setup-python@v5 @@ -59,10 +71,10 @@ runs: uses: actions/cache@v4 with: path: .venv - key: venv-v1-${{ runner.os }}-py${{ inputs.python-version }}-${{ steps.cache-keys.outputs.python_env }}${{ inputs.cache-wheel-test-deps == 'true' && '-wheeltest' || '' }}${{ inputs.install-python-deps == 'true' && '-build' || '' }} + key: venv-v2-${{ runner.os }}-py${{ inputs.python-version }}-${{ steps.cache-keys.outputs.python_env }}-${{ steps.cache-keys.outputs.uv_groups }}${{ inputs.cache-wheel-test-deps == 'true' && '-wheeltest' || '' }}${{ inputs.install-python-deps == 'true' && '-build' || '' }} restore-keys: | - venv-v1-${{ runner.os }}-py${{ inputs.python-version }}-${{ steps.cache-keys.outputs.python_env }}- - venv-v1-${{ runner.os }}-py${{ inputs.python-version }}- + venv-v2-${{ runner.os }}-py${{ inputs.python-version }}-${{ steps.cache-keys.outputs.python_env }}- + venv-v2-${{ runner.os }}-py${{ inputs.python-version }}- - name: Install Rust toolchain if: inputs.enable-rust == 'true' @@ -71,6 +83,10 @@ runs: toolchain: stable components: rustfmt, clippy rustflags: "" + cache: ${{ inputs.cache-rust == 'true' }} + cache-workspaces: | + . + web - name: Add Rust Targets if: inputs.enable-rust == 'true' @@ -86,7 +102,7 @@ runs: if: inputs.enable-uv == 'true' uses: astral-sh/setup-uv@v6 with: - enable-cache: false + enable-cache: true - name: Install Zig toolchain if: inputs.enable-zig == 'true' @@ -97,12 +113,11 @@ runs: uses: actions/cache@v4 with: path: | - ~/.cargo/bin/cargo-nextest ~/.cargo/bin/cargo-zigbuild ~/.cargo/bin/rnr - key: cargo-cli-v1-${{ runner.os }}-nextest-zigbuild-rnr + key: cargo-cli-v2-${{ runner.os }}-${{ runner.arch }}-zigbuild-rnr restore-keys: | - cargo-cli-v1-${{ runner.os }}- + cargo-cli-v2-${{ runner.os }}-${{ runner.arch }}- - name: Install dioxus CLI (dx) if: inputs.install-cargo-tools == 'true' @@ -110,13 +125,29 @@ runs: with: tool: dioxus-cli@${{ inputs.dx-version }} + - name: Install cargo-nextest + if: inputs.install-cargo-tools == 'true' + uses: taiki-e/install-action@v2 + with: + tool: cargo-nextest + - name: Install other cargo tools if: inputs.install-cargo-tools == 'true' shell: bash run: | - test -e ~/.cargo/bin/cargo-zigbuild || cargo install cargo-zigbuild --locked - test -e ~/.cargo/bin/rnr || cargo install rnr - test -e ~/.cargo/bin/cargo-nextest || cargo install --locked cargo-nextest + ensure_cargo_bin() { + local bin="$1" + shift + if [ -x "$HOME/.cargo/bin/$bin" ] && "$HOME/.cargo/bin/$bin" "$@" >/dev/null 2>&1; then + return 0 + fi + rm -f "$HOME/.cargo/bin/$bin" + return 1 + } + if [ "${{ inputs.enable-zig }}" == "true" ]; then + ensure_cargo_bin cargo-zigbuild --version || cargo install cargo-zigbuild --locked + fi + ensure_cargo_bin rnr --help || cargo install rnr - name: Create project venv shell: bash @@ -124,12 +155,30 @@ runs: make venv echo "PYTHON=${{ github.workspace }}/.venv/bin/python" >> "$GITHUB_ENV" + - name: Verify uv.lock is present and current + if: inputs.enable-uv == 'true' && inputs.uv-sync-groups != '' + shell: bash + run: | + cd "$GITHUB_WORKSPACE" + if [ ! -f uv.lock ]; then + echo "::error::uv.lock is missing. Run 'uv lock' locally and commit uv.lock." + exit 1 + fi + uv lock --check + + - name: Sync locked Python dependencies (uv) + if: inputs.uv-sync-groups != '' + shell: bash + env: + UV_SYNC_GROUPS: ${{ inputs.uv-sync-groups }} + run: make sync-uv-groups + - name: Install Python build dependencies into venv - if: inputs.install-python-deps == 'true' + if: inputs.install-python-deps == 'true' && inputs.uv-sync-groups == '' shell: bash run: make install-build-deps - name: Install wheel-test Python dependencies into venv - if: inputs.cache-wheel-test-deps == 'true' + if: inputs.cache-wheel-test-deps == 'true' && inputs.uv-sync-groups == '' shell: bash run: make install-wheel-test-deps diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..7adc9fbb --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,37 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + groups: + github-actions: + patterns: + - "*" + + - package-ecosystem: cargo + directory: / + schedule: + interval: weekly + groups: + rust-workspace: + patterns: + - "*" + + - package-ecosystem: cargo + directory: /web + schedule: + interval: weekly + groups: + web-ui: + patterns: + - "*" + + - package-ecosystem: pip + directory: / + schedule: + interval: weekly + groups: + python-dev: + patterns: + - "*" diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 1b7ac367..785a4efb 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -53,12 +53,8 @@ jobs: cache-venv: "false" - name: Prepare wheel bundle - env: - SKIP_FRONTEND_CLEAN: "1" run: | - if [ ! -f python/probing/bundled_web/public/index.html ]; then - make frontend - fi + make frontend make wheel-bundle nccl-profiler-lib - name: Build wheels @@ -99,12 +95,8 @@ jobs: cache-venv: "false" - name: Prepare wheel bundle - env: - SKIP_FRONTEND_CLEAN: "1" run: | - if [ ! -f python/probing/bundled_web/public/index.html ]; then - make frontend - fi + make frontend make wheel-bundle - name: Build wheels diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 57963ad2..b75e7c45 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -38,12 +38,8 @@ jobs: cache-venv: 'false' - name: Prepare wheel bundle - env: - SKIP_FRONTEND_CLEAN: "1" run: | - if [ ! -f python/probing/bundled_web/public/index.html ]; then - make frontend - fi + make frontend make wheel-bundle nccl-profiler-lib - name: Build wheels @@ -77,12 +73,8 @@ jobs: cache-venv: 'false' - name: Prepare wheel bundle - env: - SKIP_FRONTEND_CLEAN: "1" run: | - if [ ! -f python/probing/bundled_web/public/index.html ]; then - make frontend - fi + make frontend make wheel-bundle - name: Build wheels @@ -99,6 +91,48 @@ jobs: name: wheels-macos-${{ matrix.target }} path: dist + windows: + runs-on: windows-latest + strategy: + matrix: + target: [x64] + steps: + - uses: actions/checkout@v4 + - name: Setup Build Environment + uses: ./.github/actions/setup-build-env + with: + python-version: '3.12' + install-cargo-tools: 'true' + install-python-deps: 'false' + cache-venv: 'false' + enable-zig: 'false' + + - name: Prepare wheel bundle + shell: bash + run: | + rm -rf python/probing/bundled_web + cd web && dx bundle --release + test -f python/probing/bundled_web/public/index.html + mkdir -p python/probing/bundled_web/public/assets + cp -f web/assets/logo.svg python/probing/bundled_web/public/logo.svg 2>/dev/null || true + cp -f web/assets/logo.svg python/probing/bundled_web/public/assets/logo.svg 2>/dev/null || true + cp -f web/assets/tailwind.css python/probing/bundled_web/public/assets/tailwind.css + test -f python/probing/bundled_skills/catalog.yaml + + - name: Build wheels + uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.target }} + args: --release --out dist --find-interpreter --features extension-module,gpu,gpu-cuda,kmsg + sccache: "true" + rust-toolchain: stable + + - name: Upload wheels + uses: actions/upload-artifact@v4 + with: + name: wheels-windows-${{ matrix.target }} + path: dist + sdist: runs-on: ubuntu-latest steps: @@ -111,12 +145,8 @@ jobs: cache-venv: 'false' - name: Prepare wheel bundle - env: - SKIP_FRONTEND_CLEAN: "1" run: | - if [ ! -f python/probing/bundled_web/public/index.html ]; then - make frontend - fi + make frontend make wheel-bundle nccl-profiler-lib - name: Build sdist @@ -135,7 +165,7 @@ jobs: deploy: name: Publish to PyPI runs-on: ubuntu-latest - needs: [linux, macos, sdist] + needs: [linux, macos, windows, sdist] if: github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && inputs.publish == true) steps: - uses: actions/download-artifact@v4 diff --git a/.github/workflows/soak.yml b/.github/workflows/soak.yml new file mode 100644 index 00000000..61b682d6 --- /dev/null +++ b/.github/workflows/soak.yml @@ -0,0 +1,186 @@ +# Long-running soak tests — not run on pull requests (weekly + manual). +# +# Exercises probing under sustained training load (synthetic ImageNet + spans + +# optional TorchProbe shadow overhead), then asserts memtable / SQL health. + +name: Soak Tests + +on: + schedule: + # Sunday 04:00 UTC + - cron: "0 4 * * 0" + workflow_dispatch: + inputs: + duration_sec: + description: "Wall-clock soak duration (seconds)" + required: false + default: "600" + nproc: + description: "torchrun --nproc_per_node for DDP soak job" + required: false + default: "2" + +permissions: + contents: read + +concurrency: + group: soak-${{ github.ref }} + cancel-in-progress: true + +jobs: + soak-cpu-single: + name: CPU soak (single process, ${{ github.event.inputs.duration_sec || '600' }}s) + if: github.repository == 'DeepLink-org/probing' + runs-on: ubuntu-latest + timeout-minutes: 25 + steps: + - uses: actions/checkout@v4 + + - name: Setup build environment + uses: ./.github/actions/setup-build-env + with: + python-version: "3.12" + install-cargo-tools: "true" + install-python-deps: "true" + cache-venv: "true" + cache-wheel-test-deps: "true" + + - name: Install torchvision for ImageNet example + run: | + python -m pip install -q torchvision + + - name: Build and install wheel + env: + SKIP_FRONTEND_CLEAN: "1" + run: | + if [ ! -f python/probing/bundled_web/public/index.html ]; then + make frontend + fi + make wheel-ci + make install-wheel + + - name: Run single-process CPU soak + env: + PROBING: "1" + PROBING_TORCH_PROFILING: "on,shadow=4:1" + PROBING_SAMPLE_RATE: "1.0" + PROBING_RETENTION_DAYS: "1" + PROBING_DATA_DIR: /tmp/probing_soak_single + DURATION_SEC: ${{ github.event.inputs.duration_sec || '600' }} + NPROC: "1" + SOAK_ASSERT: "1" + BATCH_SIZE: "64" + run: | + chmod +x examples/run_soak.sh + ./examples/run_soak.sh + + - name: Upload soak data + if: always() + uses: actions/upload-artifact@v4 + with: + name: soak-cpu-single-data + path: /tmp/probing_soak_single + retention-days: 7 + if-no-files-found: ignore + + soak-cpu-ddp: + name: CPU soak (torchrun nproc=${{ github.event.inputs.nproc || '2' }}) + if: github.repository == 'DeepLink-org/probing' + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + + - name: Setup build environment + uses: ./.github/actions/setup-build-env + with: + python-version: "3.12" + install-cargo-tools: "true" + install-python-deps: "true" + cache-venv: "true" + cache-wheel-test-deps: "true" + + - name: Install torchvision for ImageNet example + run: | + python -m pip install -q torchvision + + - name: Build and install wheel + env: + SKIP_FRONTEND_CLEAN: "1" + run: | + if [ ! -f python/probing/bundled_web/public/index.html ]; then + make frontend + fi + make wheel-ci + make install-wheel + + - name: Run DDP CPU soak (gloo) + env: + PROBING: "1" + PROBING_TORCH_PROFILING: "on,shadow=4:1" + PROBING_SAMPLE_RATE: "1.0" + PROBING_RETENTION_DAYS: "1" + PROBING_DATA_DIR: /tmp/probing_soak_ddp + DURATION_SEC: ${{ github.event.inputs.duration_sec || '600' }} + NPROC: ${{ github.event.inputs.nproc || '2' }} + DIST_BACKEND: gloo + SOAK_ASSERT: "1" + SOAK_EXPECT_CLUSTER: "1" + BATCH_SIZE: "32" + run: | + chmod +x examples/run_soak.sh + ./examples/run_soak.sh + + - name: Upload soak data + if: always() + uses: actions/upload-artifact@v4 + with: + name: soak-cpu-ddp-data + path: /tmp/probing_soak_ddp + retention-days: 7 + if-no-files-found: ignore + + # Requires a self-hosted Linux runner with NVIDIA GPUs and the ``gpu`` label. + # Enable by registering a runner, then set if: to true or remove the false guard. + soak-gpu: + name: GPU soak (self-hosted, placeholder) + if: false + runs-on: [self-hosted, linux, gpu] + timeout-minutes: 45 + steps: + - uses: actions/checkout@v4 + + - name: Setup build environment + uses: ./.github/actions/setup-build-env + with: + python-version: "3.12" + install-cargo-tools: "true" + install-python-deps: "true" + cache-venv: "false" + cache-wheel-test-deps: "true" + + - name: Install torchvision + run: python -m pip install -q torchvision + + - name: Build and install wheel + env: + SKIP_FRONTEND_CLEAN: "1" + run: | + make frontend + make wheel-ci + make install-wheel + + - name: Run GPU DDP soak (NCCL) + env: + PROBING: "1" + PROBING_TORCH_PROFILING: "on,shadow=4:1" + PROBING_SAMPLE_RATE: "1.0" + DURATION_SEC: "1200" + NPROC: "2" + DIST_BACKEND: nccl + SOAK_ASSERT: "1" + BATCH_SIZE: "128" + PROBING_DATA_DIR: /tmp/probing_soak_gpu + run: | + chmod +x examples/run_soak.sh + ./examples/run_soak.sh diff --git a/.github/workflows/supply-chain.yml b/.github/workflows/supply-chain.yml new file mode 100644 index 00000000..950dd2bd --- /dev/null +++ b/.github/workflows/supply-chain.yml @@ -0,0 +1,71 @@ +name: Supply Chain + +on: + pull_request: + push: + branches: [main, master] + schedule: + # Monday 02:00 UTC — refresh advisory DB and catch new RustSec entries + - cron: "0 2 * * 1" + +permissions: + contents: read + +jobs: + rust-deny: + name: Rust (cargo-deny) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: stable + cache: true + cache-workspaces: | + . + web + + - name: Install cargo-deny + uses: taiki-e/install-action@v2 + with: + tool: cargo-deny@0.20.2 + + - name: Check main workspace + run: cargo deny check + + - name: Check web crate + run: cd web && cargo deny --config ../deny.toml check + + python-audit: + name: Python (uv lock + pip-audit) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install uv + uses: astral-sh/setup-uv@v6 + with: + enable-cache: true + + - name: Verify uv.lock is present and current + working-directory: ${{ github.workspace }} + run: | + test -f uv.lock || { echo "::error::uv.lock is missing. Run 'uv lock' and commit uv.lock."; exit 1; } + uv lock --check + + - name: Export locked deps for audit + run: | + uv export --frozen --no-emit-package probing --group wheel-test \ + --format requirements.txt --no-hashes -o /tmp/requirements-audit.txt + + - name: Audit Python dependencies + run: | + python -m pip install -q pip-audit + pip-audit -r /tmp/requirements-audit.txt diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d6c2d6e6..b3c19ad9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,37 +17,30 @@ jobs: with: python-version: "3.12" install-cargo-tools: "true" - install-python-deps: "true" + uv-sync-groups: "build,dev,wheel-test" cache-venv: "true" - cache-wheel-test-deps: "true" - name: Code style checking working-directory: ${{ github.workspace }} run: | - cargo fmt --all -- --check - (cd web && cargo fmt --all -- --check) + make fmt-check make lint-rust - - name: Python and docs lint + - name: Docs lint working-directory: ${{ github.workspace }} run: | - python -m pip install -q ruff - make lint-python make docs-install make lint-docs - - name: Build wheel - env: - SKIP_FRONTEND_CLEAN: "1" + - name: Build frontend and wheel run: | - if [ ! -f python/probing/bundled_web/public/index.html ]; then - make frontend - fi + make frontend make wheel-ci - - name: Install wheel and run Python tests + - name: Install wheel, validate skills, and run Python tests run: | make install-wheel + make validate-skills make coverage-python-wheel env: PROBING: "1" @@ -82,11 +75,10 @@ jobs: with: python-version: ${{ matrix.python-version }} install-cargo-tools: "false" - install-python-deps: "false" + uv-sync-groups: "wheel-test" enable-rust: "false" enable-zig: "false" - enable-uv: "false" - cache-venv: "false" + cache-venv: "true" cache-wheel-test-deps: "true" - name: Download wheel @@ -103,8 +95,29 @@ jobs: env: PROBING: "1" + web-test: + name: Web UI tests (Linux) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Build Environment + uses: ./.github/actions/setup-build-env + with: + python-version: "3.12" + install-cargo-tools: "false" + enable-zig: "false" + enable-uv: "false" + cache-venv: "false" + + - name: Run web crate tests and clippy + working-directory: web + run: | + cargo test --all-targets + cargo clippy --all-targets -- -D warnings + rust-test: - name: Rust tests (Linux) + name: Rust tests (Linux x86_64) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -114,9 +127,8 @@ jobs: with: python-version: "3.12" install-cargo-tools: "true" - install-python-deps: "false" - cache-venv: "false" enable-zig: "false" + cache-venv: "false" - name: Install llvm-tools-preview component run: rustup component add llvm-tools-preview --toolchain stable @@ -143,36 +155,122 @@ jobs: path: coverage.lcov retention-days: 30 + rust-test-aarch64: + name: Rust tests (Linux aarch64) + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/checkout@v4 + + - name: Setup Build Environment + uses: ./.github/actions/setup-build-env + with: + python-version: "3.12" + install-cargo-tools: "true" + enable-zig: "false" + enable-uv: "false" + cache-venv: "false" + + - name: Run Rust tests + run: | + cargo nextest run --workspace --no-default-features + cargo nextest run -p probing-server --no-default-features --features kmsg,gpu,gpu-cuda + + windows-test: + name: Windows (Rust + wheel) + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: stable + cache: true + cache-workspaces: | + . + web + + - name: Install cargo-nextest + uses: taiki-e/install-action@v2 + with: + tool: cargo-nextest + + - name: Run Rust tests + shell: bash + run: | + cargo nextest run --workspace --no-default-features --nff + cargo nextest run -p probing-server --no-default-features --features kmsg,gpu + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install dioxus CLI (dx) + uses: taiki-e/install-action@v2 + with: + tool: dioxus-cli@0.7.9 + + - name: Prepare wheel bundle + shell: bash + run: | + rm -rf python/probing/bundled_web + cd web && dx bundle --release + test -f python/probing/bundled_web/public/index.html + mkdir -p python/probing/bundled_web/public/assets + cp -f web/assets/logo.svg python/probing/bundled_web/public/logo.svg 2>/dev/null || true + cp -f web/assets/logo.svg python/probing/bundled_web/public/assets/logo.svg 2>/dev/null || true + cp -f web/assets/tailwind.css python/probing/bundled_web/public/assets/tailwind.css + test -f python/probing/bundled_skills/catalog.yaml + + - name: Build wheel + uses: PyO3/maturin-action@v1 + with: + target: x64 + args: --release --out dist --find-interpreter --features extension-module,gpu,gpu-cuda,kmsg + sccache: "true" + rust-toolchain: stable + + - name: Smoke-install wheel + shell: bash + run: | + WH=$(ls -1 dist/probing-*.whl | head -1) + python -m pip install -q --force-reinstall "$WH" + PROBING=0 python -c "import probing; from probing import _core; print('probing', probing.VERSION)" + macos-test: name: macOS tests (Rust + Python) runs-on: macos-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.13", "3.12", "3.10"] steps: - uses: actions/checkout@v4 - name: Setup Build Environment uses: ./.github/actions/setup-build-env with: - python-version: "3.12" + python-version: ${{ matrix.python-version }} install-cargo-tools: "true" - install-python-deps: "true" + uv-sync-groups: "build,wheel-test" cache-venv: "true" cache-wheel-test-deps: "true" - name: Run Rust tests + if: matrix.python-version == '3.12' run: | cargo nextest run --workspace --no-default-features cargo nextest run -p probing-server --no-default-features --features kmsg,gpu - name: Build frontend and wheel, install, and run Python tests env: - SKIP_FRONTEND_CLEAN: "1" PROBING: "1" run: | - if [ ! -f python/probing/bundled_web/public/index.html ]; then - make frontend - fi + make frontend make wheel-ci make install-wheel + make validate-skills make test-python-wheel codecov: diff --git a/.gitignore b/.gitignore index 848d3352..8e049a24 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ python/probing/probing *.pth.tar docs/site/ .venv/ +.coverage diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index c96c9f69..00000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# See https://pre-commit.com for more information -# See https://pre-commit.com/hooks.html for more hooks -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 - hooks: - - id: check-yaml - exclude: ^docs/mkdocs\.yml$ # mkdocs.yml uses !!python/name tags - - id: check-toml - - id: end-of-file-fixer - - id: trailing-whitespace - - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.11 - hooks: - - id: ruff - args: [--fix, --exit-non-zero-on-fix] - - - repo: https://github.com/psf/black - rev: 24.1.1 - hooks: - - id: black - - - repo: local - hooks: - - id: cargo-fmt - name: cargo fmt - entry: cargo fmt --all -- - language: system - types: [rust] - pass_filenames: false - - id: cargo-clippy - name: cargo clippy (make lint-rust) - entry: make lint-rust - language: system - types: [rust] - pass_filenames: false diff --git a/Cargo.lock b/Cargo.lock index 82dd9b60..753a25d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -113,9 +113,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "arrow" @@ -929,9 +929,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] @@ -1274,7 +1274,7 @@ dependencies = [ "log", "object_store", "parking_lot 0.12.3", - "rand 0.9.1", + "rand 0.9.5", "tokio", "url", ] @@ -1372,7 +1372,7 @@ dependencies = [ "log", "object_store", "parking_lot 0.12.3", - "rand 0.9.1", + "rand 0.9.5", "tempfile", "url", ] @@ -1434,7 +1434,7 @@ dependencies = [ "log", "memchr", "num-traits", - "rand 0.9.1", + "rand 0.9.5", "regex", "uuid", ] @@ -1724,12 +1724,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" -dependencies = [ - "powerfmt", -] +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" [[package]] name = "derive_builder" @@ -2984,9 +2981,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-derive" @@ -3638,6 +3635,7 @@ dependencies = [ "probing-memtable", "probing-proto", "probing-python", + "probing-skills", "probing-store", "procfs", "rmcp", @@ -3793,9 +3791,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.9.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha", "rand_core 0.9.3", @@ -4109,9 +4107,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", @@ -4624,32 +4622,31 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" dependencies = [ "deranged", - "itoa", "libc", "num-conv", "num_threads", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" dependencies = [ "num-conv", "time-core", @@ -4837,7 +4834,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.9.1", + "rand 0.9.5", "sha1", "thiserror 2.0.12", "utf-8", @@ -4854,7 +4851,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.9.1", + "rand 0.9.5", "sha1", "thiserror 2.0.12", "utf-8", diff --git a/Makefile b/Makefile index 11ff2672..8193d1e5 100644 --- a/Makefile +++ b/Makefile @@ -69,6 +69,9 @@ CLIPPY_WEB := cd web && cargo clippy --all-targets $(CLIPPY_DENY) FMT_WORKSPACE := cargo fmt --all FMT_WEB := cd web && cargo fmt --all +FMT_ALL_CFGS := ./scripts/fmt-all-cfgs.sh +RUFF_DIRS := python/ tests/ +RUFF := $(if $(wildcard .venv/bin/ruff),.venv/bin/ruff,$(shell command -v ruff 2>/dev/null)) # ============================================================================== .PHONY: help @@ -85,24 +88,26 @@ help: @echo " test Rust + editable Python (daily dev)" @echo " test-wheel Installed-wheel Python tests (needs dist/*.whl)" @echo " test-ci test + test-wheel (matches CI Python gate)" + @echo " validate-skills Validate bundled skills catalog (needs probing._core)" + @echo " supply-chain cargo-deny + uv lock check (matches CI)" @echo " lint ruff + clippy + mkdocs --strict" - @echo " fmt rustfmt workspace + web (same paths as CI)" + @echo " fmt rustfmt workspace + web + ruff format (passes lint-python)" + @echo " fmt-all-cfgs fmt + extra targets (windows/linux/arch cfg branches)" @echo " check-dev Quick env sanity check" @echo " bench Instrumentation overhead (span / TorchProbe / train)" @echo " bench-quick Same as bench, fewer iterations" + @echo " soak Long-run soak (~10 min synthetic ImageNet + assert)" + @echo " soak-quick Short soak smoke (~60s)" @echo " clean Remove build artifacts" @echo "" @echo "Release gate: make frontend && make wheel && make test-ci" @echo "Env: DEBUG=1 ZIG=1 TARGET=" # ============================================================================== -.PHONY: setup install-dev-python-deps -setup: - @if command -v pip >/dev/null 2>&1; then pip install pre-commit; fi - @if command -v pre-commit >/dev/null 2>&1; then pre-commit install; fi - -install-dev-python-deps: venv - @if [ -x .venv/bin/ruff ] && $(VENV_PYTHON) -c "import pytest, yaml" 2>/dev/null; then \ +.PHONY: install-dev-python-deps + @if command -v uv >/dev/null 2>&1 && [ -f uv.lock ]; then \ + uv sync --frozen --no-install-project --group dev; \ + elif [ -x .venv/bin/ruff ] && $(VENV_PYTHON) -c "import pytest, yaml" 2>/dev/null; then \ echo " dev Python deps OK"; \ else \ $(VENV_PYTHON) -m pip install -q -U pip $(DEV_PY_DEPS); \ @@ -128,10 +133,29 @@ venv: venv-wheel: venv install-build-deps: venv - $(VENV_PYTHON) -m pip install -q -U pip $(BUILD_PY_DEPS) + @if command -v uv >/dev/null 2>&1 && [ -f uv.lock ]; then \ + uv sync --frozen --no-install-project --group build; \ + else \ + $(VENV_PYTHON) -m pip install -q -U pip $(BUILD_PY_DEPS); \ + fi install-wheel-test-deps: venv - $(VENV_PYTHON) -m pip install -q -U pip $(PYTEST_WHEEL_DEPS) + @if command -v uv >/dev/null 2>&1 && [ -f uv.lock ]; then \ + uv sync --frozen --no-install-project --group wheel-test; \ + else \ + $(VENV_PYTHON) -m pip install -q -U pip $(PYTEST_WHEEL_DEPS); \ + fi + +# CI: UV_SYNC_GROUPS=build,dev,wheel-test make sync-uv-groups +sync-uv-groups: venv + @test -f uv.lock || { echo "error: missing uv.lock"; exit 1; } + @test -n "$(UV_SYNC_GROUPS)" || { echo "error: set UV_SYNC_GROUPS (comma-separated)"; exit 1; } + @args=""; \ + for g in $$(echo "$(UV_SYNC_GROUPS)" | tr ',' ' '); do \ + test -n "$$g" || continue; \ + args="$$args --group $$g"; \ + done; \ + uv sync --frozen --no-install-project $$args core: venv nccl-profiler-lib hccl-shim-lib $(VENV_PYTHON) -m maturin develop $(MATURIN_FLAGS) @@ -159,17 +183,29 @@ from probing.skills.paths import repo_skills_dir; \ print(f'ok: probing {VERSION}, {len(list_skills())} skills, cli={shutil.which(\"probing\") or sys.executable}')" \ || { echo "run: make develop"; exit 1; } -.PHONY: bench bench-quick +.PHONY: bench bench-quick soak soak-quick bench: check-dev $(BENCH_RUN) bench-quick: check-dev $(BENCH_RUN) --quick +soak: check-dev + @test -x examples/run_soak.sh || chmod +x examples/run_soak.sh + DURATION_SEC=600 PYTHON=$(VENV_PYTHON) PROBING=1 ./examples/run_soak.sh + +soak-quick: check-dev + @test -x examples/run_soak.sh || chmod +x examples/run_soak.sh + DURATION_SEC=60 MAX_STEPS=8 PYTHON=$(VENV_PYTHON) PROBING=1 ./examples/run_soak.sh + frontend: @test -n "$$SKIP_FRONTEND_CLEAN" || rm -rf python/probing/bundled_web cd web && dx bundle --release @test -f $(BUNDLED_WEB_PUBLIC)/index.html + @js=$$(grep -oE 'web-dxh[^" ]+\.js' $(BUNDLED_WEB_PUBLIC)/index.html | head -1); \ + for f in $(BUNDLED_WEB_PUBLIC)/assets/web-dxh*.js; do \ + test "$$f" = "$(BUNDLED_WEB_PUBLIC)/assets/$$js" || rm -f "$$f"; \ + done @mkdir -p $(BUNDLED_WEB_PUBLIC)/assets @cp -f web/assets/logo.svg $(BUNDLED_WEB_PUBLIC)/logo.svg 2>/dev/null || true @cp -f web/assets/logo.svg $(BUNDLED_WEB_PUBLIC)/assets/logo.svg 2>/dev/null || true @@ -247,12 +283,16 @@ PYTEST_WHEEL_ARGS := tests/unit tests/regression PYTEST_WHEEL_FLAGS := --import-mode=importlib -o pythonpath= -o "addopts=--verbose --color=yes --durations=10 --strict-markers" PYTEST_WHEEL_EXTRA ?= -.PHONY: test test-wheel test-ci test-rust test-rust-unit test-rust-regression test-python test-python-unit test-python-regression test-doctest test-python-wheel coverage-python-wheel bench bench-quick -.PHONY: fmt fmt-check lint lint-python lint-rust lint-docs lint-core clippy clippy-fix coverage coverage-rust coverage-python bootstrap clean docs-install docs docs-serve docs-clean +.PHONY: test test-wheel test-ci validate-skills test-rust test-rust-unit test-rust-regression test-python test-python-unit test-python-regression test-doctest test-python-wheel coverage-python-wheel bench bench-quick +.PHONY: fmt fmt-check fmt-all-cfgs fmt-all-cfgs-check lint lint-python lint-rust lint-docs lint-core clippy clippy-fix coverage coverage-rust coverage-python bootstrap clean docs-install docs docs-serve docs-clean supply-chain test: test-rust test-python test-wheel: install-wheel test-python-wheel test-ci: test test-wheel +validate-skills: + @test -L skills && test -f skills/catalog.yaml \ + || { echo "error: skills/ must be a symlink to python/probing/bundled_skills"; exit 1; } + PROBING=0 $(PYTHON) -m probing.skills validate test-rust: test-rust-unit test-rust-regression test-rust-unit: @@ -277,23 +317,31 @@ test-python-wheel: install-wheel-test-deps coverage-python-wheel: $(MAKE) test-python-wheel PYTEST_WHEEL_EXTRA="--cov=probing --cov=tests --cov-report=xml:coverage.xml" +FMT_PYTHON := @test -n "$(RUFF)" || { echo "install ruff: make install-dev-python-deps"; exit 1; }; \ + $(RUFF) check --fix $(RUFF_DIRS); \ + $(RUFF) format $(RUFF_DIRS) + lint: lint-python lint-rust lint-docs fmt: $(FMT_WORKSPACE) $(FMT_WEB) + $(FMT_PYTHON) fmt-check: $(FMT_WORKSPACE) -- --check $(FMT_WEB) -- --check + @$(MAKE) --no-print-directory lint-python +fmt-all-cfgs: + @chmod +x scripts/fmt-all-cfgs.sh + $(FMT_ALL_CFGS) +fmt-all-cfgs-check: + @chmod +x scripts/fmt-all-cfgs.sh + $(FMT_ALL_CFGS) --check lint-core: $(CLIPPY_CORE) lint-python: - @if [ -x .venv/bin/ruff ]; then \ - .venv/bin/ruff check python/ tests/; \ - elif command -v ruff >/dev/null 2>&1; then \ - ruff check python/ tests/; \ - else \ - echo "install ruff: make install-dev-python-deps (or: $(VENV_PYTHON) -m pip install ruff)"; exit 1; \ - fi + @test -n "$(RUFF)" || { echo "install ruff: make install-dev-python-deps"; exit 1; } + $(RUFF) check $(RUFF_DIRS) + $(RUFF) format --check $(RUFF_DIRS) lint-rust: $(CLIPPY_WORKSPACE) $(CLIPPY_WEB) @@ -316,6 +364,12 @@ coverage: coverage-rust coverage-python bootstrap: uv python install 3.8 3.9 3.10 3.11 3.12 3.13 +supply-chain: + @command -v cargo-deny >/dev/null 2>&1 || { echo "install: cargo install cargo-deny --locked"; exit 1; } + cargo deny check + @if command -v uv >/dev/null 2>&1 && [ -f uv.lock ]; then uv lock --check; fi + @cd web && cargo deny --config ../deny.toml check + docs-install: @cd docs && $(MAKE) install PYTHON=$(PYTHON_ABS) docs: diff --git a/deny.toml b/deny.toml new file mode 100644 index 00000000..e4c3787d --- /dev/null +++ b/deny.toml @@ -0,0 +1,69 @@ +# Supply-chain policy for probing (cargo-deny). +# CI: cargo deny check +# Local: make supply-chain (or: cargo deny check) + +[graph] +targets = [ + "x86_64-unknown-linux-gnu", + "aarch64-unknown-linux-gnu", + "x86_64-apple-darwin", + "aarch64-apple-darwin", + "x86_64-pc-windows-msvc", + "wasm32-unknown-unknown", +] +all-features = false + +[advisories] +ignore = [ + # bincode 1.x unmaintained; datafusion/arrow still pull 1.x — upgrade with engine bump. + { id = "RUSTSEC-2025-0141", reason = "transitive bincode 1.x via datafusion/arrow" }, +] +unmaintained = "workspace" +yanked = "warn" +unsound = "none" + +[licenses] +version = 2 +confidence-threshold = 0.8 +allow = [ + "MIT", + "MIT-0", + "Apache-2.0", + "Apache-2.0 WITH LLVM-exception", + "BSD-2-Clause", + "BSD-3-Clause", + "BSL-1.0", + "0BSD", + "CC0-1.0", + "ISC", + "Unlicense", + "Unicode-3.0", + "Zlib", + "OpenSSL", + "CDLA-Permissive-2.0", +] +exceptions = [] + +[licenses.private] +ignore = true + +[bans] +multiple-versions = "warn" +wildcards = "allow" +highlight = "all" +workspace-default-features = "allow" +external-default-features = "allow" +deny = [ + # Prefer rustls over OpenSSL in new dependencies. + { crate = "openssl", use-instead = "rustls" }, + { crate = "openssl-sys", use-instead = "rustls" }, +] +skip-tree = [ + { crate = "windows-sys", reason = "foundational; duplicate versions expected" }, +] + +[sources] +unknown-registry = "deny" +unknown-git = "deny" +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +allow-git = [] diff --git a/docs/src/contributing.md b/docs/src/contributing.md index 395abf24..e37cca6e 100644 --- a/docs/src/contributing.md +++ b/docs/src/contributing.md @@ -209,11 +209,11 @@ make coverage # local editable + Rust (requires cargo-llvm-cov; see CI ### Code style -**Python:** `ruff`, `mypy` +**Python:** `ruff` (lint + format), `mypy` ```bash -ruff format . -ruff check . +make fmt # ruff format + fix (Python); rustfmt (Rust) +make lint-python # ruff check + ruff format --check mypy python/probing ``` @@ -226,7 +226,7 @@ make lint-rust # cargo clippy --workspace + web/, warnings denied make clippy-fix # auto-fix what Clippy can (review diff before commit) ``` -Clippy runs in CI and optional pre-commit (`make setup`). After editing `probing-core`, run `make lint-core` before pushing. Full-workspace `make lint-rust` may still fail until other crates are cleaned up — we are rolling out lints crate by crate. +Clippy runs in CI. After editing `probing-core`, run `make lint-core` before pushing. Full-workspace `make lint-rust` may still fail until other crates are cleaned up — we are rolling out lints crate by crate. **Status:** `probing-core` has `clippy::all` (`pedantic`/`nursery` off; protocol-related allows in `probing/core/Cargo.toml`). Next candidates: `probing-proto`, `probing-memtable`. diff --git a/docs/src/contributing.zh.md b/docs/src/contributing.zh.md index 2bee13d9..9937faf8 100644 --- a/docs/src/contributing.zh.md +++ b/docs/src/contributing.zh.md @@ -204,11 +204,11 @@ make coverage ### 代码风格 -**Python:** `ruff`、`mypy` +**Python:** `ruff`(lint + format)、`mypy` ```bash -ruff format . -ruff check . +make fmt # Python: ruff format + fix;Rust: rustfmt +make lint-python # ruff check + ruff format --check mypy python/probing ``` @@ -221,7 +221,7 @@ make lint-rust # workspace + web/,warning 视为 error make clippy-fix # 自动修复(提交前请 review diff) ``` -CI 与 pre-commit(`make setup`)会跑 Clippy。改 `probing-core` 后推送前建议 `make lint-core`;全 workspace 仍会因未 lint 的 crate 失败,其余 crate 会逐个跟进。 +CI 会跑 Clippy。改 `probing-core` 后推送前建议 `make lint-core`;全 workspace 仍会因未 lint 的 crate 失败,其余 crate 会逐个跟进。 当前进度:`probing-core` 已启用 `clippy::all`(`pedantic`/`nursery` 关闭,协议相关 allow 见 `probing/core/Cargo.toml`)。下一批候选:`probing-proto`、`probing-memtable`。 diff --git a/docs/src/design/architecture.md b/docs/src/design/architecture.md index f30ba58a..ef85fa9b 100644 --- a/docs/src/design/architecture.md +++ b/docs/src/design/architecture.md @@ -1,177 +1,8 @@ # System Architecture !!! warning "Legacy document" - This two-layer overview is **superseded** by **[Modularity & Boundaries](modularity.md)** (four-layer model, crate map, dependency rules, and ownership). It is kept for historical diagrams only. **New contributors should start with [Modularity](modularity.md)**, then [Data Layer](data-layer.md) and [Distributed overview](distributed.md). + This two-layer overview is **superseded** by **[Modularity & Boundaries](modularity.md)** (four-layer model, crate map, dependency rules, and ownership). -Probing is designed as a simple two-layer structure to minimize complexity and deployment difficulty. +**New contributors:** start with [Modularity & Boundaries](modularity.md), then [Data Layer](data-layer.md) and [Distributed overview](distributed.md). -## High-Level Architecture - -```mermaid -graph TB - subgraph "User Interface" - CLI[CLI Client] - HTTP[HTTP API] - WEB[Web UI] - end - - subgraph "Target Process" - PROBE[Probe] - subgraph "Probe Components" - ENGINE[Engine] - SERVER[Server] - EXT[Extensions] - end - end - - CLI --> |Unix Socket / TCP| PROBE - HTTP --> |HTTP/REST| PROBE - WEB --> |WebSocket| PROBE - - PROBE --> ENGINE - PROBE --> SERVER - PROBE --> EXT -``` - -## Components - -### 1. Probe - -Injected into target processes to gain full access to all resources: - -- Python interpreter access -- File system access -- Memory inspection -- Network capabilities - -The probe runs an embedded HTTP server that listens on: - -- **Unix domain socket** - For local connections (default) -- **TCP port** - For remote connections - -### 2. CLI - -Command-line interface for controlling probes: - -- Process discovery and listing -- Probe injection and management -- Query execution -- Code evaluation - -Communication happens via HTTP protocol over Unix domain sockets (local) or TCP (remote). - -### 3. HTTP API - -RESTful API for programmatic access: - -- All CLI commands available as endpoints -- WebSocket support for real-time data -- Integration with monitoring tools - -## Probe Internal Architecture - -```mermaid -graph LR - subgraph "Probe" - SERVER[HTTP Server] - ENGINE[Query Engine] - CONFIG[Config Manager] - - subgraph "Extensions" - PYTHON[Python Extension] - TORCH[PyTorch Extension] - CUSTOM[Custom Tables] - end - end - - SERVER --> ENGINE - SERVER --> CONFIG - ENGINE --> PYTHON - ENGINE --> TORCH - ENGINE --> CUSTOM -``` - -### Engine - -Core data storage and processing: - -- **DataFusion** - SQL query engine -- **Arrow** - Columnar data format -- Time-series data storage -- Configuration management - -### Server - -HTTP server handling: - -- Request routing -- Authentication (optional) -- WebSocket connections -- Response formatting - -### Extensions - -Pluggable data providers: - -- **Python Extension** - Backtrace, variables -- **PyTorch Extension** - Torch traces, memory -- **Custom Tables** - User-defined data sources - -## Data Flow - -```mermaid -sequenceDiagram - participant CLI - participant Probe - participant Engine - participant Extension - - CLI->>Probe: query "SELECT * FROM python.torch_trace" - Probe->>Engine: Parse & Plan Query - Engine->>Extension: Request Data - Extension-->>Engine: Arrow RecordBatch - Engine-->>Probe: Query Results - Probe-->>CLI: JSON Response -``` - -## Communication Protocol - -### Local Connection - -``` -probing -t query "..." - | - v - Unix Socket: /tmp/probing-.sock - | - v - HTTP Request: POST /query -``` - -### Remote Connection - -``` -probing -t host:port query "..." - | - v - TCP Connection: host:port - | - v - HTTP Request: POST /query -``` - -## Security Considerations - -- **Local mode**: Unix socket permissions (process owner only) -- **Remote mode**: Optional authentication token via `PROBING_TOKEN` - -## Performance Characteristics - -Probing is designed for minimal overhead on training workloads: - -| Aspect | Design approach | -|--------|----------------| -| Overhead | Lock-free mmap writes on hot path; sampling in background threads | -| Memory | Fixed-size ring buffers per table (MEMT); bounded by retention config | -| Latency | Queries execute against in-process DataFusion; no network round-trip for local access | -| Throughput | Columnar (Arrow) scan; `information_schema` for introspection | +Historical Mermaid diagrams from the pre–four-layer model were removed to avoid drift from the current crate map. diff --git a/examples/README.md b/examples/README.md index 5c6c1d54..4239bd56 100644 --- a/examples/README.md +++ b/examples/README.md @@ -13,6 +13,8 @@ Runnable scripts under `examples/`. They are **not** installed with `pip install | `bench_profiler.py` | varies | See script header | | **`torch_probe_overhead_smoke.py`** | none | TorchProbe shadow-step overhead smoke (no GPU) | | **`bench_instrumentation.py`** | `torch` (optional) | One-shot report: span / phase hooks / TorchProbe overhead (`make bench`) | +| **`run_soak.sh`** | `torch`, `torchvision` | Long-running soak (synthetic ImageNet + probing); used by CI `soak.yml` | +| **`soak_assert.py`** | none (beyond probing) | Post-soak SQL / overhead assertions | | **`nccl_profiler_overhead.py`** | `torch` (CUDA) | NCCL AllReduce overhead vs probing profiler — see below | Install PyTorch into your dev venv (tracing 示例只需 torch;ImageNet 脚本还需 torchvision): @@ -34,6 +36,20 @@ PROBING=1 python examples/test_probing.py --depth 2 PROBING=1 python examples/bench_instrumentation.py --quick make bench # full report, one table per group as each finishes make bench-quick # faster smoke +make soak-quick # ~60s CPU soak smoke (needs torch + torchvision) +``` + +Long-running soak (CI weekly job ``soak.yml``):: + +```bash +# ~10 min single-process CPU soak + assertions +./examples/run_soak.sh + +# shorter local smoke +DURATION_SEC=60 ./examples/run_soak.sh + +# 2-rank gloo DDP (assertions on rank 0) +NPROC=2 DIST_BACKEND=gloo DURATION_SEC=120 ./examples/run_soak.sh ``` On Linux you can also attach with `probing -t inject` instead of `PROBING=1` at startup. diff --git a/examples/external_table_retirement.py b/examples/external_table_retirement.py deleted file mode 100644 index 4ffeca13..00000000 --- a/examples/external_table_retirement.py +++ /dev/null @@ -1,43 +0,0 @@ -import time - -import probing - -tbl_0 = probing.ExternalTable("test000", ["allreduce_count", "broadcast_count"]) -tbl_1 = probing.ExternalTable( - "test111", - ["allreduce_count", "broadcast_count"], - chunk_size=10000, - discard_threshold=1000000000, - discard_strategy="BaseMemorySize", -) -tbl_2 = probing.ExternalTable( - "test222", - ["allreduce_count", "broadcast_count"], - chunk_size=10, - discard_threshold=10, - discard_strategy="BaseElementCount", -) -tbs = [tbl_0, tbl_1, tbl_2] - - -for tbl in tbs: - tbl.append([1, 1]) - tbl.append([2, 2]) - tbl.append([3, 3]) - tbl.append([1, 1]) - tbl.append([2, 2]) - tbl.append([3, 3]) - tbl.append([1, 1]) - tbl.append([2, 2]) - tbl.append([3, 3]) - tbl.append([1, 1]) - tbl.append([2, 2]) - tbl.append([3, 3]) - - -while True: - time.sleep(8) - try: - input("Press enter to continue...") - except KeyboardInterrupt: - break diff --git a/examples/imagenet_with_span.py b/examples/imagenet_with_span.py index a5e2d3f9..5c5e8921 100644 --- a/examples/imagenet_with_span.py +++ b/examples/imagenet_with_span.py @@ -155,10 +155,64 @@ "multi node data parallel training", ) parser.add_argument("--dummy", action="store_true", help="use fake data to benchmark") +parser.add_argument( + "--max-duration-sec", + type=int, + default=0, + metavar="SEC", + help="stop training after SEC wall-clock seconds (0 = unlimited)", +) +parser.add_argument( + "--max-steps", + type=int, + default=0, + metavar="N", + help="stop training after N optimizer steps (0 = unlimited)", +) +parser.add_argument( + "--soak-assert", + action="store_true", + help="run examples/soak_assert.py before exit (rank 0 in distributed runs)", +) best_acc1 = 0 +class SoakLimits: + """Optional wall-clock / step caps for long-running soak tests.""" + + def __init__(self, *, max_steps: int = 0, max_duration_sec: int = 0) -> None: + self.max_steps = max(0, max_steps) + self.max_duration_sec = max(0, max_duration_sec) + self.step_count = 0 + self.started_at = time.monotonic() + + @property + def enabled(self) -> bool: + return self.max_steps > 0 or self.max_duration_sec > 0 + + def tick(self) -> None: + self.step_count += 1 + + def should_stop(self) -> bool: + if self.max_steps > 0 and self.step_count >= self.max_steps: + return True + if self.max_duration_sec > 0: + return (time.monotonic() - self.started_at) >= self.max_duration_sec + return False + + def stop_reason(self) -> str: + if self.max_steps > 0 and self.step_count >= self.max_steps: + return f"max_steps={self.max_steps}" + if self.max_duration_sec > 0: + elapsed = time.monotonic() - self.started_at + if elapsed >= self.max_duration_sec: + return ( + f"max_duration_sec={self.max_duration_sec} (elapsed={elapsed:.1f}s)" + ) + return "unknown" + + def _local_rank(gpu: int | None) -> int: if gpu is not None: return gpu @@ -301,6 +355,21 @@ def main_worker(gpu, ngpus_per_node, args): weight_decay=args.weight_decay, ) + if device.type == "cpu": + model = model.to(device) + + _torch_profile = os.environ.get("PROBING_TORCH_PROFILING", "").strip() + if _torch_profile: + try: + from probing.ext.torch import init as torch_ext_init + from probing.profiling.torch_probe import configure + + torch_ext_init() + configure(_torch_profile) + print(f"=> torch profiling enabled: {_torch_profile}", flush=True) + except Exception as exc: + print(f"=> warning: torch profiling init failed: {exc}", flush=True) + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" scheduler = StepLR(optimizer, step_size=30, gamma=0.1) @@ -410,6 +479,16 @@ def main_worker(gpu, ngpus_per_node, args): validate(val_loader, model, criterion, args) return + soak = SoakLimits( + max_steps=args.max_steps, + max_duration_sec=args.max_duration_sec, + ) + if soak.enabled: + print( + f"=> soak limits: max_steps={soak.max_steps or '∞'} " + f"max_duration_sec={soak.max_duration_sec or '∞'}" + ) + for epoch in range(args.start_epoch, args.epochs): with probing.span("epoch"): probing.event("epoch.start", attributes=[{"epoch": epoch}]) @@ -417,7 +496,29 @@ def main_worker(gpu, ngpus_per_node, args): train_sampler.set_epoch(epoch) with probing.span("train"): - train(train_loader, model, criterion, optimizer, epoch, device, args) + stop_early = train( + train_loader, + model, + criterion, + optimizer, + epoch, + device, + args, + soak=soak, + ) + if stop_early: + print( + f"=> soak stop: {soak.stop_reason()} at epoch={epoch}", flush=True + ) + probing.event( + "soak.stop", + attributes=[ + {"reason": soak.stop_reason()}, + {"steps": soak.step_count}, + {"epoch": epoch}, + ], + ) + break if args.validate: with probing.span("validate"): acc1 = validate(val_loader, model, criterion, args) @@ -445,6 +546,35 @@ def main_worker(gpu, ngpus_per_node, args): ) probing.event("epoch.end", attributes=[{"best_acc1": float(best_acc1)}]) + if args.soak_assert and (not args.distributed or args.rank == 0): + _run_soak_assert(args) + + +def _run_soak_assert(args) -> None: + import sys + from pathlib import Path + + examples_dir = Path(__file__).resolve().parent + if str(examples_dir) not in sys.path: + sys.path.insert(0, str(examples_dir)) + + from soak_assert import SoakAssertConfig, run_assertions + + cfg = SoakAssertConfig( + min_steps=max(1, args.max_steps // 4) if args.max_steps > 0 else 1, + require_torch_profiling=bool(os.environ.get("PROBING_TORCH_PROFILING")), + ) + print("=> running soak assertions (in-process)", flush=True) + result = run_assertions(cfg) + for line in result.notes: + print(f"soak_assert: {line}", flush=True) + if result.ok: + print("soak_assert: OK", flush=True) + return + for line in result.failures: + print(f"soak_assert: FAIL: {line}", file=sys.stderr, flush=True) + sys.exit(1) + def compute_loss(criterion, output, target): """Compute loss - extracted as separate function for tracing.""" @@ -453,7 +583,17 @@ def compute_loss(criterion, output, target): return loss -def train(train_loader, model, criterion, optimizer, epoch, device, args): +def train( + train_loader, + model, + criterion, + optimizer, + epoch, + device, + args, + *, + soak: SoakLimits | None = None, +): batch_time = AverageMeter("Time", ":6.3f") data_time = AverageMeter("Data", ":6.3f") losses = AverageMeter("Loss", ":.4e") @@ -490,9 +630,18 @@ def train(train_loader, model, criterion, optimizer, epoch, device, args): loss.backward() with probing.span("step"): optimizer.step() + if soak is not None and soak.enabled: + soak.tick() batch_time.update(time.time() - end) end = time.time() step_elapsed_ms = (time.perf_counter() - step_start) * 1000.0 + if soak is not None and soak.should_stop(): + print( + f"=> soak stop in train(): {soak.stop_reason()} " + f"(steps={soak.step_count})", + flush=True, + ) + return True print( f"Epoch [{epoch}] step [{i + 1}/{len(train_loader)}] " f"time={step_elapsed_ms:.2f}ms loss={loss.item():.4f} " @@ -510,6 +659,8 @@ def train(train_loader, model, criterion, optimizer, epoch, device, args): ) progress.display(i + 1) + return False + def validate(val_loader, model, criterion, args): diff --git a/examples/run_soak.sh b/examples/run_soak.sh new file mode 100755 index 00000000..f8fed8c6 --- /dev/null +++ b/examples/run_soak.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +# Long-running probing soak: synthetic ImageNet training + post-run assertions. +# +# Usage (single process, CPU-friendly): +# ./examples/run_soak.sh +# DURATION_SEC=1200 ./examples/run_soak.sh +# +# Distributed (gloo on CPU, NCCL on CUDA): +# NPROC=2 DIST_BACKEND=gloo ./examples/run_soak.sh +# +# Env: +# DURATION_SEC wall-clock cap (default 600) +# MAX_STEPS optimizer-step cap (default 0 = duration only) +# NPROC torchrun --nproc_per_node (default 1) +# DIST_BACKEND gloo (CPU) or nccl (CUDA, needs >=2 GPUs) +# PROBING_DATA_DIR memtable root (default /tmp/probing_soak_$$) +# SOAK_ASSERT 1 to run soak_assert.py after training (default 1) + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +DURATION_SEC="${DURATION_SEC:-600}" +MAX_STEPS="${MAX_STEPS:-0}" +NPROC="${NPROC:-1}" +DIST_BACKEND="${DIST_BACKEND:-gloo}" +PROBING_DATA_DIR="${PROBING_DATA_DIR:-/tmp/probing_soak_$$}" +SOAK_ASSERT="${SOAK_ASSERT:-1}" +BATCH_SIZE="${BATCH_SIZE:-64}" +WORKERS="${WORKERS:-0}" + +export PROBING="${PROBING:-1}" +export PROBING_TORCH_PROFILING="${PROBING_TORCH_PROFILING:-on,shadow=4:1}" +export PROBING_SAMPLE_RATE="${PROBING_SAMPLE_RATE:-1.0}" +export PROBING_RETENTION_DAYS="${PROBING_RETENTION_DAYS:-1}" +export PROBING_DATA_DIR + +if [[ "$NPROC" -gt 1 ]]; then + export SOAK_EXPECT_CLUSTER=1 +fi + +mkdir -p "$PROBING_DATA_DIR" + +COMMON_ARGS=( + examples/imagenet_with_span.py + /tmp/imagenet-dummy + --dummy + --no-validate + --arch resnet18 + --batch-size "$BATCH_SIZE" + --workers "$WORKERS" + --epochs 9999 + --max-duration-sec "$DURATION_SEC" +) + +if [[ "$MAX_STEPS" -gt 0 ]]; then + COMMON_ARGS+=(--max-steps "$MAX_STEPS") +fi + +if [[ "$SOAK_ASSERT" == "1" ]]; then + COMMON_ARGS+=(--soak-assert) +fi + +echo "=== probing soak ===" +echo "PROBING_DATA_DIR=$PROBING_DATA_DIR" +echo + +if [[ "$NPROC" -le 1 ]]; then + "${PYTHON:-python}" "${COMMON_ARGS[@]}" +else + if [[ "$DIST_BACKEND" == "nccl" ]]; then + if ! "${PYTHON:-python}" -c "import torch; assert torch.cuda.is_available()" 2>/dev/null; then + echo "nccl soak requires CUDA; set DIST_BACKEND=gloo or NPROC=1" >&2 + exit 1 + fi + if [[ "$NPROC" -gt 1 ]] && [[ "$(python -c 'import torch; print(torch.cuda.device_count())')" -lt "$NPROC" ]]; then + echo "nccl soak needs >= $NPROC GPUs" >&2 + exit 1 + fi + fi + torchrun --standalone --nproc_per_node="$NPROC" \ + "${COMMON_ARGS[@]}" \ + --dist-backend "$DIST_BACKEND" +fi + +echo +echo "soak complete (data: $PROBING_DATA_DIR)" diff --git a/examples/soak_assert.py b/examples/soak_assert.py new file mode 100755 index 00000000..367b3676 --- /dev/null +++ b/examples/soak_assert.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python3 +"""Post-soak assertions for long-running training + probing CI jobs. + +Run inside a probing-injected process after a soak workload, or standalone +against persisted memtable data (``PROBING_DATA_DIR``):: + + PROBING=1 python examples/soak_assert.py --require-torch-profiling + +Exit code 0 on success, 1 on assertion failure. +""" + +from __future__ import annotations + +import argparse +import os +import sys +from dataclasses import dataclass, field +from typing import Any, Optional + + +@dataclass +class SoakAssertConfig: + min_trace_event: int = 1 + min_torch_trace: int = 1 + min_torch_step_timing: int = 1 + min_steps: int = 1 + max_hook_tax_pct: float = 75.0 + require_torch_profiling: bool = False + + +@dataclass +class SoakAssertResult: + ok: bool = True + failures: list[str] = field(default_factory=list) + notes: list[str] = field(default_factory=list) + + def fail(self, msg: str) -> None: + self.ok = False + self.failures.append(msg) + + def note(self, msg: str) -> None: + self.notes.append(msg) + + +def _scalar(df: Any, default: Optional[float] = None) -> Optional[float]: + if df is None or getattr(df, "empty", True): + return default + try: + val = df.iloc[0, 0] + except Exception: + return default + if val is None: + return default + try: + return float(val) + except (TypeError, ValueError): + return default + + +def _count_rows(sql: str) -> int: + import probing + + df = probing.query(sql) + if df is None or getattr(df, "empty", True): + return 0 + val = _scalar(df, default=0.0) + return int(val) if val is not None else 0 + + +def _table_exists(schema_table: str) -> bool: + import probing + + try: + df = probing.query(f"SELECT 1 FROM {schema_table} LIMIT 1") + except Exception: + return False + return df is not None + + +def run_assertions(cfg: SoakAssertConfig) -> SoakAssertResult: + result = SoakAssertResult() + + try: + import probing # noqa: F401 + except ImportError: + result.fail("probing is not installed") + return result + + trace_events = _count_rows("SELECT count(*) FROM python.trace_event") + result.note(f"python.trace_event rows={trace_events}") + if trace_events < cfg.min_trace_event: + result.fail( + f"expected >= {cfg.min_trace_event} trace_event rows, got {trace_events}" + ) + + timing_rows = _count_rows("SELECT count(*) FROM python.torch_step_timing") + torch_rows = _count_rows("SELECT count(*) FROM python.torch_trace") + result.note(f"python.torch_step_timing rows={timing_rows}") + result.note(f"python.torch_trace rows={torch_rows}") + + profiling_active = cfg.require_torch_profiling or timing_rows > 0 or torch_rows > 0 + if cfg.require_torch_profiling and not profiling_active: + result.fail( + "PROBING_TORCH_PROFILING was required but torch_trace/torch_step_timing are empty" + ) + + if profiling_active: + if torch_rows < cfg.min_torch_trace: + result.fail( + f"expected >= {cfg.min_torch_trace} torch_trace rows, got {torch_rows}" + ) + if timing_rows < cfg.min_torch_step_timing: + result.fail( + f"expected >= {cfg.min_torch_step_timing} torch_step_timing rows, " + f"got {timing_rows}" + ) + + step_count = _count_rows( + "SELECT count(*) FROM python.torch_step_timing WHERE local_step > 0" + ) + if step_count < cfg.min_steps: + result.fail( + f"expected >= {cfg.min_steps} optimizer steps in torch_step_timing, " + f"got {step_count}" + ) + + hook_tax = _scalar( + probing_query( + """ + SELECT round( + (median(CASE WHEN is_shadow = 0 THEN step_duration_sec END) + / nullif(median(CASE WHEN is_shadow = 1 THEN step_duration_sec END), 0) + - 1) * 100, 2 + ) AS hook_tax_pct + FROM python.torch_step_timing + WHERE local_step > 0 + """ + ) + ) + shadow_n = _count_rows( + "SELECT count(*) FROM python.torch_step_timing " + "WHERE local_step > 0 AND is_shadow = 1" + ) + probed_n = _count_rows( + "SELECT count(*) FROM python.torch_step_timing " + "WHERE local_step > 0 AND is_shadow = 0" + ) + result.note( + f"overhead: hook_tax_pct={hook_tax} probed_n={probed_n} shadow_n={shadow_n}" + ) + if shadow_n > 0 and probed_n > 0 and hook_tax is not None: + if hook_tax > cfg.max_hook_tax_pct: + result.fail( + f"hook tax {hook_tax:.1f}% exceeds max {cfg.max_hook_tax_pct}%" + ) + elif shadow_n == 0 or probed_n == 0: + result.note("overhead ratio skipped (need both probed and shadow steps)") + + # Optional cluster tables when torchrun cluster is active. + if os.environ.get("SOAK_EXPECT_CLUSTER"): + if _table_exists("cluster.nodes"): + nodes = _count_rows("SELECT count(*) FROM cluster.nodes") + result.note(f"cluster.nodes rows={nodes}") + if nodes < 1: + result.fail("cluster.nodes is empty after distributed soak") + else: + result.fail("cluster.nodes table missing in distributed soak") + + return result + + +def probing_query(sql: str) -> Any: + import probing + + return probing.query(sql) + + +def _build_config(args: argparse.Namespace) -> SoakAssertConfig: + return SoakAssertConfig( + min_trace_event=args.min_trace_event, + min_torch_trace=args.min_torch_trace, + min_torch_step_timing=args.min_torch_step_timing, + min_steps=args.min_steps, + max_hook_tax_pct=args.max_hook_tax_pct, + require_torch_profiling=args.require_torch_profiling, + ) + + +def main(argv: Optional[list[str]] = None) -> int: + parser = argparse.ArgumentParser(description="Assert probing soak run health") + parser.add_argument( + "--min-trace-event", + type=int, + default=1, + help="minimum rows in python.trace_event", + ) + parser.add_argument( + "--min-torch-trace", + type=int, + default=1, + help="minimum rows in python.torch_trace when profiling is active", + ) + parser.add_argument( + "--min-torch-step-timing", + type=int, + default=1, + help="minimum rows in python.torch_step_timing when profiling is active", + ) + parser.add_argument( + "--min-steps", + type=int, + default=1, + help="minimum optimizer steps recorded in torch_step_timing", + ) + parser.add_argument( + "--max-hook-tax-pct", + type=float, + default=75.0, + help="fail when median probed/shadow step overhead exceeds this percent", + ) + parser.add_argument( + "--require-torch-profiling", + action="store_true", + help="fail when torch_trace / torch_step_timing tables are empty", + ) + args = parser.parse_args(argv) + cfg = _build_config(args) + result = run_assertions(cfg) + + for line in result.notes: + print(f"soak_assert: {line}") + if result.ok: + print("soak_assert: OK") + return 0 + for line in result.failures: + print(f"soak_assert: FAIL: {line}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/probing/cli/src/cli/cluster.rs b/probing/cli/src/cli/cluster.rs index 971f09cd..be29513e 100644 --- a/probing/cli/src/cli/cluster.rs +++ b/probing/cli/src/cli/cluster.rs @@ -1,5 +1,6 @@ use anyhow::Result; use probing_proto::prelude::NodeListResponse; +use probing_skills::backend::parse_cluster_query_response; use crate::cli::ctrl::ProbeEndpoint; use crate::table::render_dataframe; @@ -45,24 +46,14 @@ async fn cluster_query( .post_json("/apis/cluster/query", &body.to_string()) .await?; let value: serde_json::Value = serde_json::from_str(&reply)?; - if let Some(err) = value.get("error").and_then(|v| v.as_str()) { - anyhow::bail!("{err}"); - } - let df = value - .get("dataframe") - .ok_or_else(|| anyhow::anyhow!("missing dataframe in response"))?; - let dataframe: probing_proto::prelude::DataFrame = serde_json::from_value(df.clone())?; - if let Some(meta) = value.get("meta") { - let nodes = meta - .get("nodes_queried") - .and_then(|v| v.as_u64()) - .unwrap_or(0); - let failed = meta - .get("nodes_failed") - .and_then(|v| v.as_array()) - .map(|a| a.len()) - .unwrap_or(0); - eprintln!("cluster query: cluster={cluster}, nodes_queried={nodes}, nodes_failed={failed}"); + let (dataframe, cluster_meta) = + parse_cluster_query_response(&value).map_err(|e| anyhow::anyhow!(e.0))?; + if let Some(meta) = cluster_meta { + eprintln!( + "cluster query: cluster={cluster}, nodes_queried={}, nodes_failed={}", + meta.nodes_queried, + meta.nodes_failed.len() + ); } render_dataframe(&dataframe); Ok(()) diff --git a/probing/cli/src/cli/skill/backend.rs b/probing/cli/src/cli/skill/backend.rs index 7b74b747..6c46a799 100644 --- a/probing/cli/src/cli/skill/backend.rs +++ b/probing/cli/src/cli/skill/backend.rs @@ -1,7 +1,7 @@ //! ``ProbeEndpoint`` adapter for the shared skill runner. use probing_proto::prelude::{DataFrame, NodeListResponse, Query}; -use probing_skills::backend::{parse_cluster_meta, ClusterQueryMeta, SkillBackend}; +use probing_skills::backend::{parse_cluster_query_response, ClusterQueryMeta, SkillBackend}; use probing_skills::runner::{Result, SkillRunError}; use crate::cli::ctrl::ProbeEndpoint; @@ -29,15 +29,7 @@ impl SkillBackend for CliBackend { .map_err(|e| SkillRunError(e.to_string()))?; let value: serde_json::Value = serde_json::from_str(&reply).map_err(|e| SkillRunError(e.to_string()))?; - if let Some(err) = value.get("error").and_then(|v| v.as_str()) { - return Err(SkillRunError(err.to_string())); - } - let df = value - .get("dataframe") - .ok_or_else(|| SkillRunError("missing dataframe in cluster response".to_string()))?; - let dataframe: DataFrame = - serde_json::from_value(df.clone()).map_err(|e| SkillRunError(e.to_string()))?; - let cluster_meta = value.get("meta").map(parse_cluster_meta); + let (dataframe, cluster_meta) = parse_cluster_query_response(&value)?; Ok((dataframe, cluster_meta)) } diff --git a/probing/cli/src/inject/injection_aarch64.rs b/probing/cli/src/inject/injection_aarch64.rs index f6aabfb5..873bc806 100644 --- a/probing/cli/src/inject/injection_aarch64.rs +++ b/probing/cli/src/inject/injection_aarch64.rs @@ -380,20 +380,20 @@ mod tests { #[test] fn register_handling() { - let mut regs = Registers::default(); - regs.x0 = 0x12345678; - regs.x1 = 0x87654321; - regs.x2 = 0x11111111; - regs.x3 = 0x22222222; - regs.x8 = 0xdeadbeef; + let mut regs: Registers = unsafe { std::mem::zeroed() }; + regs.regs[0] = 0x12345678; + regs.regs[1] = 0x87654321; + regs.regs[2] = 0x11111111; + regs.regs[3] = 0x22222222; + regs.regs[8] = 0xdeadbeef; regs.sp = 0x1000; regs.pc = 0x2000; - assert_eq!(regs.x0, 0x12345678); - assert_eq!(regs.x1, 0x87654321); - assert_eq!(regs.x2, 0x11111111); - assert_eq!(regs.x3, 0x22222222); - assert_eq!(regs.x8, 0xdeadbeef); + assert_eq!(regs.regs[0], 0x12345678); + assert_eq!(regs.regs[1], 0x87654321); + assert_eq!(regs.regs[2], 0x11111111); + assert_eq!(regs.regs[3], 0x22222222); + assert_eq!(regs.regs[8], 0xdeadbeef); assert_eq!(regs.sp & !0xf, 0x1000); } } diff --git a/probing/cli/src/inject/process.rs b/probing/cli/src/inject/process.rs index a953aa99..18415313 100644 --- a/probing/cli/src/inject/process.rs +++ b/probing/cli/src/inject/process.rs @@ -85,12 +85,10 @@ impl Process { match ps.len() { 1 => Ok(Some(ps[0])), 0 => Err(anyhow::anyhow!( - "found no process with cmdline pattern: {}", - pat + "found no process with cmdline pattern: {pat}" )), _ => Err(anyhow::anyhow!( - "found multiple processes with cmdline pattern: {}", - pat + "found multiple processes with cmdline pattern: {pat}" )), } } diff --git a/probing/cli/src/table.rs b/probing/cli/src/table.rs index dec0ca25..7f529a01 100644 --- a/probing/cli/src/table.rs +++ b/probing/cli/src/table.rs @@ -1,8 +1,9 @@ +#[cfg(unix)] use nix::ioctl_read; +#[cfg(unix)] use nix::libc; -use std::os::fd::AsFd; -use std::os::fd::AsRawFd; - +#[cfg(unix)] +use std::os::fd::{AsFd, AsRawFd}; use tabled::builder::Builder; use tabled::grid::config::Position; use tabled::grid::records::{ @@ -197,11 +198,20 @@ pub fn render_dataframe(df: &DataFrame) { } fn terminal_width() -> Option { - terminal_size_of(std::io::stdout()) + #[cfg(unix)] + { + terminal_size_of(std::io::stdout()) + } + #[cfg(not(unix))] + { + None + } } +#[cfg(unix)] ioctl_read!(get_winsize, libc::TIOCGWINSZ, 0, libc::winsize); +#[cfg(unix)] fn terminal_size_of(fd: Fd) -> Option { use nix::unistd::isatty; if isatty(fd.as_fd()).is_err() { diff --git a/probing/core/src/core/engine.rs b/probing/core/src/core/engine.rs index 168b732b..18849d7f 100644 --- a/probing/core/src/core/engine.rs +++ b/probing/core/src/core/engine.rs @@ -44,7 +44,7 @@ use super::semantic_catalog; /// .build().unwrap(); /// /// // Execute a SQL query -/// let result = engine.query("SELECT * FROM information_schema.tables"); +/// let result = engine.async_query("SELECT * FROM information_schema.tables").await?; /// ``` pub struct Engine { /// DataFusion session context for executing SQL queries @@ -148,15 +148,6 @@ impl Engine { Ok(Some(probing_proto::prelude::DataFrame::new(names, columns))) } - #[deprecated] - pub fn query>(&self, q: T) -> Result { - futures::executor::block_on(async { self.async_query(q).await })?.ok_or_else(|| { - DataFusionError::Execution( - "query returned no dataframe (engine unavailable or empty response)".into(), - ) - }) - } - /// Get default namespace from configuration pub fn default_namespace(&self) -> String { self.context diff --git a/probing/core/src/core/federation/convert.rs b/probing/core/src/core/federation/convert.rs index 16aae064..19d6ae1a 100644 --- a/probing/core/src/core/federation/convert.rs +++ b/probing/core/src/core/federation/convert.rs @@ -9,8 +9,6 @@ use arrow::datatypes::{DataType, Field, Schema, SchemaRef, TimeUnit}; use datafusion::error::{DataFusionError, Result}; use probing_proto::prelude::{DataFrame, Seq}; -/// Legacy alias; prefer the `_host` / `_addr` pair. -pub const PROBE_NODE_COL: &str = "_probe_node"; pub const PROBE_HOST_COL: &str = "_host"; pub const PROBE_ADDR_COL: &str = "_addr"; /// Cluster `rank` from `cluster.nodes` for the row's source probing endpoint. @@ -47,8 +45,8 @@ pub struct FederationEndpointTags { pub role: String, } -#[cfg_attr(not(test), allow(dead_code))] -pub fn node_label(host: &str, addr: &str) -> String { +#[cfg(test)] +fn node_label(host: &str, addr: &str) -> String { if host.is_empty() { addr.to_string() } else { @@ -137,8 +135,7 @@ pub fn federated_output_schema(local: SchemaRef) -> SchemaRef { pub fn is_federation_tag_column(name: &str) -> bool { matches!( name, - PROBE_NODE_COL - | PROBE_HOST_COL + PROBE_HOST_COL | PROBE_ADDR_COL | PROBE_RANK_COL | PROBE_NODE_RANK_COL @@ -420,7 +417,6 @@ mod tests { for col in FEDERATION_TAG_COLUMNS { assert!(schema.index_of(col).is_ok(), "missing tag column {col}"); } - assert!(schema.index_of(PROBE_NODE_COL).is_err()); } #[test] diff --git a/probing/core/src/core/federation/mod.rs b/probing/core/src/core/federation/mod.rs index 2d250031..e253f816 100644 --- a/probing/core/src/core/federation/mod.rs +++ b/probing/core/src/core/federation/mod.rs @@ -23,8 +23,8 @@ pub use convert::{ cluster_local_rank_for_endpoint, cluster_node_rank_for_endpoint, cluster_rank_for_endpoint, cluster_role_for_endpoint, federated_output_schema, federation_tags_for_endpoint, is_federation_tag_column, tag_proto_dataframe, FederationEndpointTags, FEDERATION_TAG_COLUMNS, - PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_LOCAL_RANK_COL, PROBE_NODE_COL, PROBE_NODE_RANK_COL, - PROBE_RANK_COL, PROBE_ROLE_COL, + PROBE_ADDR_COL, PROBE_HOST_COL, PROBE_LOCAL_RANK_COL, PROBE_NODE_RANK_COL, PROBE_RANK_COL, + PROBE_ROLE_COL, }; pub use fanout_scope::{ current_fanout_scope, hierarchical_fanout_enabled, is_local0_from_env, resolve_fanout_scope, diff --git a/probing/core/src/core/federation/sql_gen.rs b/probing/core/src/core/federation/sql_gen.rs index e9f35c51..8fba3fb1 100644 --- a/probing/core/src/core/federation/sql_gen.rs +++ b/probing/core/src/core/federation/sql_gen.rs @@ -50,7 +50,6 @@ mod tests { use arrow::datatypes::{DataType, Field, Schema}; use datafusion::logical_expr::{col, lit}; - use super::super::convert::PROBE_NODE_COL; use super::*; #[test] @@ -72,6 +71,6 @@ mod tests { let sql = build_remote_table_sql("demo", "metrics", &schema, None, &[], None); assert!(sql.contains("probe.demo.metrics")); assert!(!sql.contains("global.")); - assert!(!sql.contains(PROBE_NODE_COL)); + assert!(!sql.contains("_probe_node")); } } diff --git a/probing/core/src/core/mod.rs b/probing/core/src/core/mod.rs index 518806f8..24ebb5fe 100644 --- a/probing/core/src/core/mod.rs +++ b/probing/core/src/core/mod.rs @@ -56,14 +56,6 @@ pub use datafusion::arrow::util::pretty; pub use datafusion::common::error::DataFusionError; pub use datafusion::config::CatalogOptions; -// pub static ENGINE_RUNTIME: Lazy = Lazy::new(|| { -// tokio::runtime::Builder::new_multi_thread() -// .worker_threads(4) -// .enable_all() -// .build() -// .unwrap() -// }); - #[cfg(test)] mod tests { use super::*; diff --git a/probing/core/src/lib.rs b/probing/core/src/lib.rs index c6b7d1b9..2fb718ae 100644 --- a/probing/core/src/lib.rs +++ b/probing/core/src/lib.rs @@ -8,7 +8,6 @@ pub mod signal; pub mod storage; pub mod sync; pub mod trace; -mod tracing; pub use diagnostics::install_panic_hook; pub use runtime::{ diff --git a/probing/core/src/tracing.rs b/probing/core/src/tracing.rs deleted file mode 100644 index e8da751b..00000000 --- a/probing/core/src/tracing.rs +++ /dev/null @@ -1,874 +0,0 @@ -// Thread-local span tracing infrastructure. Not wired into production paths yet; -// GLOBAL_TRACER is reserved for future distributed trace aggregation. -#![allow(dead_code)] - -use once_cell::sync::Lazy; -use std::collections::HashMap; -use std::sync::atomic::{AtomicU16, Ordering}; // For unique tracer ID generation -use std::sync::{Arc, Mutex, RwLock, Weak}; // Weak for GlobalTracer's ref to LocalTracer -use std::thread::{self, ThreadId}; // For thread-local storage - -use std::time::{Duration, SystemTime}; - -use probing_proto::types::Ele; - -// --- Identifiers --- -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub struct TraceId(u128); - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub struct SpanId(u64); - -// Global atomic counter for assigning unique short numeric IDs to LocalTracer instances. -static NEXT_TRACER_NUM: AtomicU16 = AtomicU16::new(0); - -// Configuration for TraceId: 16 bits for tracer prefix, 112 bits for sequence number. -const TRACE_ID_PREFIX_SHIFT: u32 = 128 - 16; // 112 bits for sequence -const MAX_TRACE_SEQ: u128 = (1u128 << TRACE_ID_PREFIX_SHIFT) - 1; - -// --- Timestamp --- -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub struct Timestamp(u128); - -impl Timestamp { - pub fn now() -> Self { - SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .map_or_else( - |_| Timestamp(0), // Fallback for systems where time might be before UNIX_EPOCH - |d| Timestamp(d.as_nanos()), - ) - } - - pub fn duration_since(&self, earlier: Timestamp) -> Duration { - if self.0 > earlier.0 { - Duration::from_nanos((self.0 - earlier.0) as u64) - } else { - Duration::from_nanos(0) // Avoid panic if earlier is not actually earlier - } - } -} - -#[derive(Debug, Clone, PartialEq)] -pub struct Attribute(String, Ele); - -pub fn attr, V: Into>(key: K, value: V) -> Attribute { - Attribute(key.into(), value.into()) -} - -#[derive(Debug, Clone, PartialEq)] -pub enum Location { - KnownLocation(u64), - UnknownLocation(String), -} - -#[derive(Debug, Clone, PartialEq)] -pub struct Event { - pub name: Option, - pub location: Option, - pub timestamp: Timestamp, - pub attributes: Option>, -} - -// --- Span Status --- -#[derive(Debug, Clone, PartialEq, Eq, Default)] -pub enum SpanStatus { - #[default] - Running, // This span is the currently active one on its thread. - Open, // This span is active, but one of its children is currently Running. - Close, // This span has completed successfully. - Error(Option), // This span has completed with an error. -} - -#[derive(Debug, Clone)] -pub struct Span { - // --- Identity & Relationship --- - pub trace_id: TraceId, - pub span_id: SpanId, - pub parent_span_id: Option, - - pub name: String, - pub phase: Option, - pub location: Option, - - pub start_time: Timestamp, - pub end_time: Option, - - pub attributes: Option>, - pub events: Vec, - - // --- Outcome --- - pub status: SpanStatus, -} - -impl Span { - pub fn duration(&self) -> Option { - self.end_time.map(|et| et.duration_since(self.start_time)) - } -} - -// --- ThreadLocal Span Manager --- -#[derive(Debug)] -pub struct LocalSpanManager { - thread_id: ThreadId, - tracer_id: u16, // Unique numeric ID for this tracer, used in TraceId generation. - - next_trace_seq: u64, - next_span_seq: u64, - - span_stack: Vec, - spans: HashMap, -} - -impl LocalSpanManager { - fn new() -> Self { - let short_tracer_id = NEXT_TRACER_NUM.fetch_add(1, Ordering::Relaxed); - - LocalSpanManager { - thread_id: thread::current().id(), - tracer_id: short_tracer_id, - next_trace_seq: 0, - next_span_seq: 0, - span_stack: Vec::new(), - spans: HashMap::new(), - } - } - - // --- Core Span Operations --- - pub fn start_span>( - &mut self, - name: N, - phase: Option<&str>, - location: Option<&str>, - initial_attributes: Option>, - ) -> (SpanId, TraceId) { - let name = name.into(); - let phase = phase.map(|p_val| p_val.into()); - - let start_time = Timestamp::now(); - let current_span_sequence = self.next_span_seq; - self.next_span_seq = self.next_span_seq.wrapping_add(1); - let span_id = SpanId(current_span_sequence); - - let (trace_id_to_use, parent_span_id_to_store) = if let Some(active_parent_span_id) = - self.span_stack.last().copied() - { - match self.spans.get_mut(&active_parent_span_id) { - Some(parent_span) => { - if parent_span.status == SpanStatus::Running { - parent_span.status = SpanStatus::Open; - } - (parent_span.trace_id, Some(active_parent_span_id)) - } - None => { - log::warn!( - "start_span: active parent {:?} missing from spans map; treating as new root", - active_parent_span_id - ); - self.span_stack.pop(); - let current_trace_sequence = self.next_trace_seq; - self.next_trace_seq = self.next_trace_seq.wrapping_add(1); - let new_trace_id_val = ((self.tracer_id as u128) << TRACE_ID_PREFIX_SHIFT) - | (current_trace_sequence as u128 & MAX_TRACE_SEQ); - (TraceId(new_trace_id_val), None) - } - } - } else { - // No active parent span, so this is the start of a new trace. - let current_trace_sequence = self.next_trace_seq; - self.next_trace_seq = self.next_trace_seq.wrapping_add(1); - - let new_trace_id_val = ((self.tracer_id as u128) << TRACE_ID_PREFIX_SHIFT) - | (current_trace_sequence as u128 & MAX_TRACE_SEQ); - (TraceId(new_trace_id_val), None) - }; - - let location = location.map(|loc_val| Location::UnknownLocation(loc_val.into())); - - let span = Span { - trace_id: trace_id_to_use, - span_id, - parent_span_id: parent_span_id_to_store, - name, - phase, - location, - start_time, - end_time: None, - attributes: initial_attributes, - events: vec![], - status: SpanStatus::Running, - }; - - self.spans.insert(span_id, span); - self.span_stack.push(span_id); - (span_id, trace_id_to_use) - } - - pub fn active_id(&self) -> Option { - self.span_stack.last().copied() - } - - pub fn add_attr, V: Into>(&mut self, key: S, value: V) { - if let Some(active_span_id) = self.span_stack.last() { - if let Some(span) = self.spans.get_mut(active_span_id) { - if span.end_time.is_none() { - // Only add attributes to open spans - span.attributes - .get_or_insert_with(Vec::new) - .push(attr(key, value)); - } - } else { - log::warn!( - "Active span_id {:?} not found in spans map during add_attr.", - active_span_id - ); - } - } else { - log::warn!("No active span to add attribute to."); - } - } - - pub fn add_event>(&mut self, name: S, attributes: Option>) { - let name = name.into(); - if let Some(active_span_id) = self.span_stack.last() { - if let Some(span) = self.spans.get_mut(active_span_id) { - if span.end_time.is_none() { - // Only add events to open spans - span.events.push(Event { - name: Some(name), - location: None, // Consider if location should be set here - timestamp: Timestamp::now(), - attributes, - }); - } - } else { - log::warn!( - "Active span_id {:?} not found in spans map during add_event.", - active_span_id - ); - } - } else { - log::warn!("No active span to add event to."); - } - } - - pub fn end_span(&mut self, final_status: SpanStatus) { - let end_time = Timestamp::now(); - - if let Some(active_id_on_stack) = self.span_stack.pop() { - if let Some(ended_span) = self.spans.get_mut(&active_id_on_stack) { - ended_span.end_time = Some(end_time); - ended_span.status = final_status; - } else { - log::warn!( - "Popped span_id {:?} not found in spans map during end_span.", - active_id_on_stack - ); - } - - if let Some(parent_span_id_on_stack) = self.span_stack.last() { - if let Some(parent_span) = self.spans.get_mut(parent_span_id_on_stack) { - if parent_span.status == SpanStatus::Open { - parent_span.status = SpanStatus::Running; - } - } - } - } else { - log::warn!("Attempting to end span but span_stack is empty."); - } - } - - // --- Methods for GlobalTracer Access --- - pub fn active_spans(&self) -> Vec { - self.span_stack - .iter() - .filter_map(|id| self.spans.get(id).cloned()) - .collect() - } - - pub fn all_spans(&self) -> Vec { - self.spans.values().cloned().collect() - } -} - -// --- Thread-Local Storage Initialization --- -thread_local! { - static LOCAL_TRACER: Arc> = { - let tracer = Arc::new(RwLock::new(LocalSpanManager::new())); - GLOBAL_TRACER.register_tracer(thread::current().id(), Arc::downgrade(&tracer)); - tracer - }; -} - -// --- Global Span Manager --- -#[derive(Debug, Default)] -pub struct GlobalSpanManager { - local_tracers: Mutex>>>, - // TODO: completed_span_exporter: Mutex>>, -} - -impl GlobalSpanManager { - pub fn new(/* exporter: Box */) -> Self { - GlobalSpanManager { - local_tracers: Mutex::new(HashMap::new()), - // completed_span_exporter: Mutex::new(Some(exporter)), - } - } - - fn register_tracer(&self, thread_id: ThreadId, tracer: Weak>) { - match self.local_tracers.lock() { - Ok(mut tracers) => { - GlobalSpanManager::cleanup_locked_tracers(&mut tracers); - tracers.insert(thread_id, tracer); - } - Err(e) => { - log::error!("Error acquiring lock on local_tracers: {}", e); - } - } - } - - // Private helper function to cleanup tracers when the map is already locked. - fn cleanup_locked_tracers(tracers_map: &mut HashMap>>) { - tracers_map.retain(|_tid, weak_tracer| weak_tracer.strong_count() > 0); - } - - pub fn all_thread_spans(&self) -> HashMap> { - let weak_tracers_to_process = match self.local_tracers.lock() { - Ok(mut tracers_map) => { - GlobalSpanManager::cleanup_locked_tracers(&mut tracers_map); - tracers_map.clone() - } - Err(e) => { - log::error!("Error acquiring lock on local_tracers: {}", e); - return HashMap::new(); // Return empty map on error - } - }; - - let mut result = HashMap::new(); - for (tid, weak_tracer) in weak_tracers_to_process { - if let Some(tracer_arc) = weak_tracer.upgrade() { - // Lock individual LocalTracer; this lock is fine as it's per-tracer. - let tracer_lock = read_tracer(&tracer_arc); - result.insert(tid, tracer_lock.active_spans()); // active_spans() involves cloning - } - } - result - } - - pub fn thread_spans(&self, thread_id: ThreadId) -> Option> { - let weak_tracer_option = match self.local_tracers.lock() { - Ok(mut tracers_map) => { - GlobalSpanManager::cleanup_locked_tracers(&mut tracers_map); - tracers_map.get(&thread_id).cloned() - } - Err(e) => { - log::error!("Error acquiring lock on local_tracers: {}", e); - return None; // Return empty map on error - } - }; - - weak_tracer_option - .and_then(|weak_tracer| weak_tracer.upgrade()) - .map(|tracer_arc| { - // Lock individual LocalTracer. - let tracer_lock = read_tracer(&tracer_arc); - tracer_lock.active_spans() // active_spans() involves cloning - }) - } -} - -pub static GLOBAL_TRACER: Lazy = Lazy::new(GlobalSpanManager::new); - -fn read_tracer( - tracer: &RwLock, -) -> std::sync::RwLockReadGuard<'_, LocalSpanManager> { - match tracer.read() { - Ok(guard) => guard, - Err(e) => { - log::warn!("LocalSpanManager RwLock poisoned; recovering"); - e.into_inner() - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use std::time::Duration as StdDuration; // Renamed to avoid conflict with super::Duration - - fn setup_tracer() -> LocalSpanManager { - LocalSpanManager { - thread_id: std::thread::current().id(), - tracer_id: 0, // Simplified for predictable test outcomes - next_trace_seq: 0, - next_span_seq: 0, - span_stack: vec![], - spans: Default::default(), - } - } - - // --- 1. Basic Span Functionality --- - - #[test] - fn test_start_span_missing_parent_degrades_to_root() { - let mut tracer = setup_tracer(); - let ghost_parent = SpanId(999); - tracer.span_stack.push(ghost_parent); - - let (span_id, trace_id) = tracer.start_span("orphan_child", None, None, None); - - assert_eq!(tracer.span_stack.len(), 1); - assert_eq!(tracer.active_id(), Some(span_id)); - let span = tracer.spans.get(&span_id).unwrap(); - assert_eq!(span.parent_span_id, None, "missing parent → new root"); - assert_eq!( - trace_id.0, - (tracer.tracer_id as u128) << TRACE_ID_PREFIX_SHIFT - ); - } - - #[test] - fn test_start_root_span_example() { - // Example: Starting a new trace with a root span. - // This is typically the first operation when tracing a new request or process. - let mut tracer = setup_tracer(); - let tracer_id_for_assertion = tracer.tracer_id; // For assertion clarity - - let (span_id, trace_id) = tracer.start_span( - "process_incoming_request", // A descriptive name for the span - Some("server_op"), // Optional: kind of operation (e.g., server, client) - Some("my_app::request_handler"), // Optional: code path or function name - None, // Optional: initial attributes - ); - - assert_eq!( - tracer.span_stack.len(), - 1, - "A new span should be on the stack" - ); - assert_eq!( - tracer.active_id(), - Some(span_id), - "The new span should be active" - ); - - let span = tracer - .spans - .get(&span_id) - .expect("Span not found in tracer"); - assert_eq!(span.name, "process_incoming_request"); - assert_eq!(span.phase, Some("server_op".to_string())); - assert_eq!(span.parent_span_id, None, "Root span has no parent"); - assert_eq!( - span.status, - SpanStatus::Running, - "New span should be running" - ); - match &span.location { - Some(Location::UnknownLocation(path)) => assert_eq!(path, "my_app::request_handler"), - _ => panic!("Expected UnknownLocation with the specified location"), - } - - // Verify TraceId incorporates the tracer's ID and the trace sequence number (0 for the first trace) - let expected_trace_id_val = (tracer_id_for_assertion as u128) << TRACE_ID_PREFIX_SHIFT; - assert_eq!( - trace_id.0, expected_trace_id_val, - "Trace ID mismatch for root span" - ); - - tracer.end_span(SpanStatus::Close); // Remember to end your spans - } - - #[test] - fn test_start_child_span_example() { - // Example: Creating a child span within an existing trace. - // This is used to trace sub-operations of a larger task. - let mut tracer = setup_tracer(); - let (root_span_id, root_trace_id) = tracer.start_span("root_operation", None, None, None); - - // Start a child span for a sub-task - let (child_span_id, child_trace_id) = tracer.start_span( - "database_query", - Some("db_client"), - Some("my_app::db_service::query"), - Some(vec![attr("db.statement", "SELECT * FROM users")]), - ); - - assert_eq!( - tracer.span_stack.len(), - 2, - "Root and child spans should be on stack" - ); - assert_eq!( - tracer.active_id(), - Some(child_span_id), - "Child span should be active" - ); - - let child_span = tracer - .spans - .get(&child_span_id) - .expect("Child span not found"); - assert_eq!(child_span.name, "database_query"); - assert_eq!( - child_span.parent_span_id, - Some(root_span_id), - "Child's parent should be the root span" - ); - assert_eq!(child_span.status, SpanStatus::Running); - assert_eq!( - child_trace_id, root_trace_id, - "Child span must share the same TraceId as its root" - ); - assert_eq!(child_span.attributes.as_ref().unwrap().len(), 1); - assert_eq!( - child_span.attributes.as_ref().unwrap()[0], - attr("db.statement", "SELECT * FROM users") - ); - - let root_span_after_child_start = tracer - .spans - .get(&root_span_id) - .expect("Root span not found"); - assert_eq!( - root_span_after_child_start.status, - SpanStatus::Open, - "Root span should be 'Open' as child is 'Running'" - ); - - tracer.end_span(SpanStatus::Close); // End child span - tracer.end_span(SpanStatus::Close); // End root span - } - - #[test] - fn test_end_span_scenarios_example() { - // Example: Demonstrating different ways spans are ended and how parent status is affected. - let mut tracer = setup_tracer(); - - // Scenario 1: Start and end a single root span successfully. - let (root_span_id, _) = tracer.start_span("single_task", None, None, None); - assert_eq!(tracer.active_id(), Some(root_span_id)); - tracer.end_span(SpanStatus::Close); // Mark as successfully closed - assert!( - tracer.span_stack.is_empty(), - "Stack should be empty after root span ends" - ); - let ended_root_span = tracer.spans.get(&root_span_id).expect("Root span missing"); - assert!(ended_root_span.end_time.is_some(), "End time must be set"); - assert_eq!(ended_root_span.status, SpanStatus::Close); - - // Scenario 2: End a child span with an error, and observe parent's status change. - let (parent_id, _) = tracer.start_span("main_operation", None, None, None); - let (child_id, _) = tracer.start_span("sub_operation_fails", None, None, None); - - let parent_span_while_child_active = - tracer.spans.get(&parent_id).expect("Parent span missing"); - assert_eq!( - parent_span_while_child_active.status, - SpanStatus::Open, - "Parent is 'Open' while child is 'Running'" - ); - - let error_message = "Something went wrong".to_string(); - tracer.end_span(SpanStatus::Error(Some(error_message.clone()))); // End child with an error - assert_eq!( - tracer.active_id(), - Some(parent_id), - "Parent should be the active span now" - ); - - let ended_child_span = tracer.spans.get(&child_id).expect("Child span missing"); - assert!(ended_child_span.end_time.is_some()); - assert_eq!( - ended_child_span.status, - SpanStatus::Error(Some(error_message)) - ); - - let parent_span_after_child_error = - tracer.spans.get(&parent_id).expect("Parent span missing"); - assert_eq!( - parent_span_after_child_error.status, - SpanStatus::Running, - "Parent becomes 'Running' again after child ends" - ); - - // Scenario 3: End the parent span successfully. - tracer.end_span(SpanStatus::Close); - assert!( - tracer.span_stack.is_empty(), - "Stack empty after parent ends" - ); - let ended_parent_span = tracer.spans.get(&parent_id).expect("Parent span missing"); - assert!(ended_parent_span.end_time.is_some()); - assert_eq!(ended_parent_span.status, SpanStatus::Close); - - // Scenario 4: Attempting to end a span when no spans are active (e.g., programming error). - // This should not panic the tracer but log an error (checked by observing eprintln output if testing framework allows). - // For this example, we just ensure it doesn't crash. - let mut fresh_tracer = setup_tracer(); - fresh_tracer.end_span(SpanStatus::Close); // No panic expected - } - - #[test] - fn test_span_with_location_example() { - // Example: Starting a span with a specified code path (location). - let mut tracer = setup_tracer(); - let module_path = "my_app::services::user_service::create_user"; - let (span_id, _) = tracer.start_span("create_user_call", None, Some(module_path), None); - - let span = tracer.spans.get(&span_id).unwrap(); - match &span.location { - Some(Location::UnknownLocation(path)) => { - assert_eq!( - path, module_path, - "Span location should match the provided location" - ); - } - _ => panic!("Expected span.location to be Some(Location::UnknownLocation)"), - } - tracer.end_span(SpanStatus::Close); - } - - // These tests verify internal ID generation logic, less for direct user example but crucial for correctness. - #[test] - fn test_trace_id_generation_and_rollover() { - let mut tracer = setup_tracer(); - let tracer_id_val = tracer.tracer_id as u128; - - // First trace - let (_, trace_id1) = tracer.start_span("span1", None, None, None); - assert_eq!( - trace_id1.0, - tracer_id_val << TRACE_ID_PREFIX_SHIFT, - "Trace ID for first trace" - ); - tracer.end_span(SpanStatus::Close); - - // Second trace - let (_, trace_id2) = tracer.start_span("span2", None, None, None); - assert_eq!( - trace_id2.0, - (tracer_id_val << TRACE_ID_PREFIX_SHIFT) | 1, - "Trace ID for second trace" - ); - tracer.end_span(SpanStatus::Close); - - // Force next_trace_seq to max value - tracer.next_trace_seq = u64::MAX - 1; - - let (_, trace_id_before_wrap) = tracer.start_span("span_before_u64_wrap", None, None, None); - // The sequence part of trace_id is (self.next_trace_seq as u128 & MAX_TRACE_SEQ) - assert_eq!( - trace_id_before_wrap.0, - (tracer_id_val << TRACE_ID_PREFIX_SHIFT) | ((u64::MAX - 1) as u128 & MAX_TRACE_SEQ), - "Trace ID before u64 wrap" - ); - tracer.end_span(SpanStatus::Close); - - let (_, trace_id_wrap) = tracer.start_span("span_u64_wrap", None, None, None); - assert_eq!( - trace_id_wrap.0, - (tracer_id_val << TRACE_ID_PREFIX_SHIFT) | (u64::MAX as u128 & MAX_TRACE_SEQ), - "Trace ID at u64 wrap" - ); - tracer.end_span(SpanStatus::Close); - - // next_trace_seq (u64) has now wrapped to 0. - let (_, trace_id_after_wrap) = tracer.start_span("span_after_u64_wrap", None, None, None); - assert_eq!( - trace_id_after_wrap.0, - tracer_id_val << TRACE_ID_PREFIX_SHIFT, - "Trace ID after u64 wrap" - ); - tracer.end_span(SpanStatus::Close); - } - - #[test] - fn test_span_id_generation_wrapping() { - let mut tracer = setup_tracer(); - tracer.next_span_seq = u64::MAX; // Set next_span_seq to its maximum - - let (span_id1, _) = tracer.start_span("span_max_seq", None, None, None); - assert_eq!(span_id1.0, u64::MAX, "Span ID should be u64::MAX"); - - let (span_id2, _) = tracer.start_span("span_after_wrap", None, None, None); - assert_eq!(span_id2.0, 0, "Span ID should be 0 after wrap"); - } - - // --- 2. Attribute and Event Functionality --- - - #[test] - fn test_add_attributes_and_events_example() { - // Example: Adding attributes and events to a span to record contextual information. - let mut tracer = setup_tracer(); - let (span_id, _) = tracer.start_span("user_request_processing", None, None, None); - - // Add attributes with various data types. Attributes provide key-value details about the span. - tracer.add_attr("http.method", "GET"); - tracer.add_attr("http.url", "/users/123".to_string()); - tracer.add_attr("user.id", 123i32); - tracer.add_attr("request.size_bytes", 1024i64); - tracer.add_attr("cache.hit_ratio", 0.75f32); - tracer.add_attr("processing.time_ms", 123.456f64); - tracer.add_attr("custom.info", Ele::Text("important_detail".to_string())); - - // Add an event. Events are timestamped occurrences within a span, with their own attributes. - tracer.add_event( - "cache_lookup", - Some(vec![ - attr("cache.key", "user_123_data"), - attr("cache.hit", true), - ]), - ); - - // Simulate some work - std::thread::sleep(StdDuration::from_millis(5)); - - tracer.add_event("validation_complete", None); // Event without attributes - - { - let span = tracer.spans.get(&span_id).expect("Span not found"); - let attributes = span.attributes.as_ref().expect("Attributes should exist"); - assert_eq!(attributes.len(), 7, "Expected 7 attributes on the span"); - assert_eq!(attributes[0], attr("http.method", "GET")); - assert_eq!(attributes[1], attr("http.url", "/users/123".to_string())); - // ... (assertions for other attributes can be added for completeness) - - assert_eq!(span.events.len(), 2, "Expected 2 events in the span"); - assert_eq!(span.events[0].name, Some("cache_lookup".to_string())); - assert!( - span.events[0].timestamp.0 > span.start_time.0, - "Event timestamp should be after span start" - ); - let event1_attrs = span.events[0].attributes.as_ref().unwrap(); - assert_eq!(event1_attrs.len(), 2); - assert_eq!(event1_attrs[0], attr("cache.key", "user_123_data")); - assert_eq!(event1_attrs[1], attr("cache.hit", true)); - - assert_eq!(span.events[1].name, Some("validation_complete".to_string())); - assert!( - span.events[1].timestamp.0 > span.events[0].timestamp.0, - "Second event should be later" - ); - assert!(span.events[1].attributes.is_none()); - } - tracer.end_span(SpanStatus::Close); - - // Behavior check: Attributes and events cannot be added to a closed span. - let span = tracer.spans.get(&span_id).expect("Span not found"); - let attributes_count_before_add_after_close = - span.attributes.as_ref().map_or(0, |a| a.len()); - let events_len_before_add_after_close = span.events.len(); - - tracer.add_attr("attempt_after_close", "should_not_be_added"); - tracer.add_event("event_after_close", None); - - let span_after_close_attempt = tracer - .spans - .get(&span_id) - .expect("Span not found after close"); - assert_eq!( - span_after_close_attempt - .attributes - .as_ref() - .map_or(0, |a| a.len()), - attributes_count_before_add_after_close, - "Attributes should not be added to a closed span." - ); - assert_eq!( - span_after_close_attempt.events.len(), - events_len_before_add_after_close, - "Events should not be added to a closed span." - ); - } - - #[test] - fn test_add_attribute_and_event_to_non_existent_span_example() { - // Example: Demonstrating behavior when trying to add attributes/events without an active span. - // This typically indicates a misuse of the tracer or a logic error in instrumentation. - // The tracer should handle this gracefully (e.g., by logging an error) without panicking. - let mut tracer = setup_tracer(); // No spans started - - tracer.add_attr("key_no_span", "value_no_span"); // Should not panic, might log error - tracer.add_event("event_no_span", None); // Should not panic, might log error - - // Assert that no spans were created or modified if that's the intended behavior for error logging. - assert!( - tracer.spans.is_empty(), - "No spans should exist if none were started." - ); - } - - // --- 3. Span Management Functionality --- - - #[test] - fn test_retrieve_active_and_all_spans_example() { - // Example: How to retrieve information about currently active spans and all spans managed by the tracer. - let mut tracer = setup_tracer(); - - assert!( - tracer.active_spans().is_empty(), - "No active spans initially." - ); - assert!( - tracer.all_spans().is_empty(), - "No spans recorded initially." - ); - - // Create a hierarchy: s1 -> s2 (active), s3 (ended) - let (s1_id, _) = tracer.start_span("service_call", None, None, None); - let (s2_id, _) = tracer.start_span("internal_processing", None, None, None); - // s2 is now active, s1 is open - - let (s3_id, _) = tracer.start_span("another_root_task", None, None, None); - tracer.end_span(SpanStatus::Close); // End s3, so it's not active but is in 'all_spans' - - // Check active spans (s1 and s2 should be on the stack, s2 being the most recent) - let active = tracer.active_spans(); - assert_eq!( - active.len(), - 2, - "Expected s1 and s2 to be active on the stack." - ); - // Order in active_spans is from oldest to newest on stack - assert_eq!( - active[0].span_id, s1_id, - "s1 should be the first active span on stack." - ); - assert_eq!( - active[1].span_id, s2_id, - "s2 should be the second (current) active span on stack." - ); - assert_eq!( - tracer.active_id(), - Some(s2_id), - "s2 should be the current active_id" - ); - - // Check all spans (s1, s2, s3) - let all = tracer.all_spans(); - assert_eq!(all.len(), 3, "Expected s1, s2, and s3 to be in all_spans."); - assert!( - all.iter().any(|s| s.span_id == s1_id), - "s1 should be in all_spans." - ); - assert!( - all.iter().any(|s| s.span_id == s2_id), - "s2 should be in all_spans." - ); - assert!( - all.iter().any(|s| s.span_id == s3_id), - "s3 should be in all_spans." - ); - - let s3_span = all.iter().find(|s| s.span_id == s3_id).unwrap(); - assert_eq!( - s3_span.status, - SpanStatus::Close, - "s3 should be marked as Close." - ); - - tracer.end_span(SpanStatus::Close); // End s2 - tracer.end_span(SpanStatus::Close); // End s1 - } -} diff --git a/probing/crates/skills/src/api.rs b/probing/crates/skills/src/api.rs index fa4ad4c0..85d722c5 100644 --- a/probing/crates/skills/src/api.rs +++ b/probing/crates/skills/src/api.rs @@ -3,6 +3,7 @@ use std::collections::HashMap; use anyhow::{Context, Result}; +use serde::Deserialize; use serde_json::{json, Value}; use super::catalog::{load_catalog, load_intents, load_pages, CatalogEntry}; @@ -81,169 +82,155 @@ pub fn load_skill_json(id: &str) -> Result { } pub fn skill_from_api(value: &Value) -> Result { - let id = value - .get("id") - .and_then(|v| v.as_str()) - .context("skill id")? - .to_string(); - let title = value - .get("title") - .and_then(|v| v.as_str()) - .unwrap_or(&id) - .to_string(); - let category = value - .get("category") - .and_then(|v| v.as_str()) - .unwrap_or("general") - .to_string(); - let docs = value - .get("docs") - .and_then(|v| v.as_str()) - .unwrap_or_default() - .trim() - .to_string(); - let tags: Vec = value - .get("tags") - .and_then(|v| v.as_array()) - .map(|arr| { - arr.iter() - .filter_map(|v| v.as_str().map(str::to_string)) - .collect() - }) - .unwrap_or_default(); - let keywords_obj = value.get("keywords").cloned().unwrap_or(json!({})); - let trigger_keywords = KeywordsSpec { - zh: keywords_obj - .get("zh") - .and_then(|v| v.as_array()) - .map(|arr| { - arr.iter() - .filter_map(|v| v.as_str().map(str::to_string)) - .collect() - }) - .unwrap_or_default(), - en: keywords_obj - .get("en") - .and_then(|v| v.as_array()) - .map(|arr| { - arr.iter() - .filter_map(|v| v.as_str().map(str::to_string)) - .collect() - }) - .unwrap_or_default(), - }; - let mut keywords: Vec = tags.iter().map(|t| t.to_lowercase()).collect(); - for kw in trigger_keywords.zh.iter().chain(trigger_keywords.en.iter()) { - keywords.push(kw.to_lowercase()); - } - let parameters = value - .get("parameters") - .and_then(|v| v.as_array()) - .map(|arr| { - arr.iter() - .filter_map(|item| { - let name = item.get("name")?.as_str()?.to_string(); - let default = item.get("default").cloned().unwrap_or(Value::Null); - Some(SkillParameter { - name, - default: json_to_yaml(&default), - }) + let payload: SkillApiPayload = + serde_json::from_value(value.clone()).context("deserialize skill")?; + Ok(payload.into_skill()) +} + +#[derive(Debug, Deserialize)] +struct SkillApiPayload { + id: String, + #[serde(default)] + title: String, + #[serde(default = "default_category")] + category: String, + #[serde(default)] + docs: String, + #[serde(default)] + tags: Vec, + #[serde(default)] + keywords: KeywordsSpec, + #[serde(default)] + parameters: Vec, + #[serde(default)] + steps: Vec, + #[serde(default)] + interpretation: InterpretationApi, + #[serde(default)] + summary_template: String, + #[serde(default)] + next_steps: Vec, +} + +#[derive(Debug, Deserialize)] +struct SkillParameterApi { + name: String, + #[serde(default)] + default: Value, +} + +#[derive(Debug, Deserialize)] +struct SkillStepApi { + id: String, + title: String, + #[serde(rename = "type", default = "default_step_type")] + step_type: String, + #[serde(default)] + sql: Option, + #[serde(default)] + path: Option, + #[serde(default)] + view: Option, + #[serde(default = "default_on_empty")] + on_empty: String, + #[serde(default)] + empty_message: Option, + #[serde(default)] + when: Option, + #[serde(default)] + cluster: Option, +} + +#[derive(Debug, Default, Deserialize)] +struct InterpretationApi { + #[serde(default)] + rules: Vec, +} + +#[derive(Debug, Deserialize)] +struct InterpretRuleApi { + id: String, + when: String, + #[serde(default = "default_severity")] + severity: String, + message: String, +} + +fn default_category() -> String { + "general".to_string() +} + +fn default_step_type() -> String { + "sql".to_string() +} + +fn default_on_empty() -> String { + "skip".to_string() +} + +fn default_severity() -> String { + "info".to_string() +} + +impl SkillApiPayload { + fn into_skill(self) -> Skill { + let mut keywords: Vec = self.tags.iter().map(|t| t.to_lowercase()).collect(); + for kw in self.keywords.zh.iter().chain(self.keywords.en.iter()) { + keywords.push(kw.to_lowercase()); + } + let title = if self.title.is_empty() { + self.id.clone() + } else { + self.title + }; + Skill { + id: self.id, + title, + category: self.category, + docs: self.docs.trim().to_string(), + tags: self.tags, + keywords, + trigger_keywords: self.keywords, + parameters: self + .parameters + .into_iter() + .map(|p| SkillParameter { + name: p.name, + default: json_to_yaml(&p.default), }) - .collect() - }) - .unwrap_or_default(); - let steps = value - .get("steps") - .and_then(|v| v.as_array()) - .map(|arr| { - arr.iter() - .filter_map(|item| { - Some(SkillStep { - id: item.get("id")?.as_str()?.to_string(), - title: item.get("title")?.as_str()?.to_string(), - step_type: item - .get("type") - .and_then(|v| v.as_str()) - .unwrap_or("sql") - .to_string(), - sql: item.get("sql").and_then(|v| v.as_str()).map(str::to_string), - path: item - .get("path") - .and_then(|v| v.as_str()) - .map(str::to_string), - view: item - .get("view") - .and_then(|v| v.as_str()) - .map(str::to_string), - on_empty: item - .get("on_empty") - .and_then(|v| v.as_str()) - .unwrap_or("skip") - .to_string(), - empty_message: item - .get("empty_message") - .and_then(|v| v.as_str()) - .map(str::to_string), - when: item - .get("when") - .and_then(|v| v.as_str()) - .map(str::to_string), - cluster: item.get("cluster").and_then(|v| v.as_bool()), - }) + .collect(), + steps: self + .steps + .into_iter() + .map(|s| SkillStep { + id: s.id, + title: s.title, + step_type: s.step_type, + sql: s.sql, + path: s.path, + view: s.view, + on_empty: s.on_empty, + empty_message: s.empty_message, + when: s.when, + cluster: s.cluster, }) - .collect() - }) - .unwrap_or_default(); - let interpretation = value - .get("interpretation") - .and_then(|v| v.get("rules")) - .and_then(|v| v.as_array()) - .map(|arr| { - arr.iter() - .filter_map(|item| { - Some(InterpretRule { - id: item.get("id")?.as_str()?.to_string(), - when: item.get("when")?.as_str()?.to_string(), - severity: item - .get("severity") - .and_then(|v| v.as_str()) - .unwrap_or("info") - .to_string(), - message: item.get("message")?.as_str()?.to_string(), - }) + .collect(), + interpretation: self + .interpretation + .rules + .into_iter() + .map(|r| InterpretRule { + id: r.id, + when: r.when, + severity: r.severity, + message: r.message, }) - .collect() - }) - .unwrap_or_default(); - let summary_template = value - .get("summary_template") - .and_then(|v| v.as_str()) - .unwrap_or_default() - .to_string(); - let next_steps = value - .get("next_steps") - .and_then(|v| v.as_array()) - .map(|arr| { - arr.iter() - .filter_map(|v| v.as_str().map(str::to_string)) - .collect() - }) - .unwrap_or_default(); - Ok(Skill { - id, - title, - category, - docs, - tags, - keywords, - trigger_keywords, - parameters, - steps, - interpretation, - summary_template, - next_steps, - variables: HashMap::new(), - }) + .collect(), + summary_template: self.summary_template, + next_steps: self.next_steps, + variables: HashMap::new(), + } + } } pub fn catalog_json() -> Result { diff --git a/probing/crates/skills/src/backend.rs b/probing/crates/skills/src/backend.rs index 4e75b50d..67666db1 100644 --- a/probing/crates/skills/src/backend.rs +++ b/probing/crates/skills/src/backend.rs @@ -59,6 +59,22 @@ pub fn parse_cluster_meta(meta: &serde_json::Value) -> ClusterQueryMeta { } } +/// Parse `POST /apis/cluster/query` JSON envelope into dataframe + optional meta. +pub fn parse_cluster_query_response( + value: &serde_json::Value, +) -> std::result::Result<(DataFrame, Option), SkillRunError> { + if let Some(err) = value.get("error").and_then(|v| v.as_str()) { + return Err(SkillRunError(err.to_string())); + } + let df = value + .get("dataframe") + .ok_or_else(|| SkillRunError("missing dataframe in cluster response".to_string()))?; + let dataframe: DataFrame = + serde_json::from_value(df.clone()).map_err(|e| SkillRunError(e.to_string()))?; + let cluster_meta = value.get("meta").map(parse_cluster_meta); + Ok((dataframe, cluster_meta)) +} + pub fn cluster_meta_note(meta: &ClusterQueryMeta) -> String { format!( "cluster fan-out · {} nodes queried · {} failed · {} peer batches dropped{}", @@ -73,6 +89,30 @@ pub fn cluster_meta_note(meta: &ClusterQueryMeta) -> String { mod tests { use super::*; + #[test] + fn parse_cluster_query_response_surfaces_api_error() { + let value = serde_json::json!({"error": "boom"}); + let err = parse_cluster_query_response(&value).unwrap_err(); + assert_eq!(err.0, "boom"); + } + + #[test] + fn parse_cluster_query_response_extracts_dataframe_and_meta() { + let dataframe = DataFrame::default(); + let value = serde_json::json!({ + "dataframe": dataframe, + "meta": { + "nodes_queried": 2, + "nodes_failed": [], + "peer_batches_dropped": 0, + "partial": false, + }, + }); + let (df, meta) = parse_cluster_query_response(&value).unwrap(); + assert_eq!(df.row_count(), 0); + assert_eq!(meta.unwrap().nodes_queried, 2); + } + #[test] fn parse_cluster_meta_marks_partial_on_failed_nodes() { let meta = parse_cluster_meta(&serde_json::json!({ diff --git a/probing/crates/skills/src/discovery.rs b/probing/crates/skills/src/discovery.rs index 9c14dd02..2f84dca7 100644 --- a/probing/crates/skills/src/discovery.rs +++ b/probing/crates/skills/src/discovery.rs @@ -1,4 +1,7 @@ //! Runtime discovery of skill root directories (no compile-time embed). +//! +//! Path resolution SSOT lives in Python (`python/probing/extensions/skills.py`); +//! this module shells out to `python -m probing.extensions skill-roots` and caches JSON. use std::collections::HashSet; use std::env; @@ -32,16 +35,14 @@ fn discover_skill_roots() -> Vec { let mut seen = HashSet::new(); let python_roots = python_discovered_roots(); - let use_bundled_fallback = python_roots.is_empty(); - - let sources = python_roots - .into_iter() - .chain(fs_skill_roots()) - .chain(if use_bundled_fallback { - bundled_skill_roots() - } else { - Vec::new() - }); + let sources: Vec = if python_roots.is_empty() { + fs_skill_roots() + .into_iter() + .chain(bundled_skill_roots()) + .collect() + } else { + python_roots + }; for path in sources { let key = path.to_string_lossy().to_string(); diff --git a/probing/crates/skills/src/lib.rs b/probing/crates/skills/src/lib.rs index c9d05587..e46cbe17 100644 --- a/probing/crates/skills/src/lib.rs +++ b/probing/crates/skills/src/lib.rs @@ -13,14 +13,16 @@ pub use api::{ catalog_json, catalog_to_json, list_skills_json, load_skill_json, routing_json, skill_from_api, skill_to_json, }; -pub use backend::{ClusterQueryMeta, SkillBackend}; +pub use backend::{parse_cluster_query_response, ClusterQueryMeta, SkillBackend}; pub use catalog::{load_catalog, load_intents, load_pages, CatalogEntry}; pub use interpret::{evaluate_rules, InterpretFinding, StepEvidence}; pub use loader::{ build_context, default_parameters, derive_variables, expand_template, list_skill_ids, load_skill, InterpretRule, KeywordsSpec, Skill, SkillParameter, SkillStep, }; -pub use routing::match_skills; +pub use routing::{ + match_intent_routes, match_routed_skills, match_skills, IntentRoute, SkillRoute, +}; pub use runner::{ execute_skill, plan_skill, resolve_use_global, run_step, RunOptions, RunResult, StepOutcome, }; diff --git a/probing/crates/skills/src/routing.rs b/probing/crates/skills/src/routing.rs index 32fef9b7..eb32c515 100644 --- a/probing/crates/skills/src/routing.rs +++ b/probing/crates/skills/src/routing.rs @@ -1,29 +1,79 @@ //! Skill intent / keyword routing (shared by Web agent and Python tools). -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; -use super::catalog::load_catalog; +use super::catalog::{load_catalog, load_intents}; use super::loader::load_skill; -pub fn match_skills(query: &str, limit: usize) -> Vec { +/// One intent route: keywords that map to skill ids. +#[derive(Debug, Clone)] +pub struct IntentRoute { + pub keywords: Vec, + pub skills: Vec, +} + +/// Skill id + routing keywords (from tags + trigger keywords). +#[derive(Debug, Clone)] +pub struct SkillRoute { + pub id: String, + pub keywords: Vec, +} + +pub fn match_intent_routes(query: &str, limit: usize, routes: &[IntentRoute]) -> Vec { + let q = query.to_lowercase(); + let mut scored: Vec<(usize, String)> = Vec::new(); + for route in routes { + let hits = route + .keywords + .iter() + .filter(|kw| q.contains(kw.to_lowercase().as_str())) + .count(); + if hits > 0 { + for sid in &route.skills { + scored.push((hits, sid.clone())); + } + } + } + scored.sort_by(|a, b| b.0.cmp(&a.0).then_with(|| a.1.cmp(&b.1))); + + let mut seen = HashSet::new(); + let mut out = Vec::new(); + for (_, id) in scored { + if seen.insert(id.clone()) { + out.push(id); + } + if out.len() >= limit { + break; + } + } + out +} + +pub fn match_routed_skills( + query: &str, + limit: usize, + intent_routes: &[IntentRoute], + skill_routes: &[SkillRoute], +) -> Vec { let q = query.to_lowercase(); let mut scored: HashMap = HashMap::new(); - for (rank, id) in match_intents(query, 10).into_iter().enumerate() { + for (rank, id) in match_intent_routes(query, 10, intent_routes) + .into_iter() + .enumerate() + { *scored.entry(id).or_insert(0) += 3usize.saturating_mul(10 - rank); } - for entry in load_catalog() { - let Ok(skill) = load_skill(&entry.id) else { - continue; - }; - let kw_score = skill + for skill in skill_routes { + let keyword_hits = skill .keywords .iter() .filter(|kw| q.contains(kw.as_str())) .count(); - if kw_score > 0 { - *scored.entry(entry.id).or_insert(0) += kw_score; + let id_hit = q.contains(&skill.id.replace('_', " ")) || q.contains(&skill.id); + if keyword_hits > 0 || id_hit { + *scored.entry(skill.id.clone()).or_insert(0) += keyword_hits.max(1); } } @@ -33,52 +83,54 @@ pub fn match_skills(query: &str, limit: usize) -> Vec { ranked.into_iter().take(limit).map(|(_, id)| id).collect() } -fn match_intents(query: &str, limit: usize) -> Vec { - let q = query.to_lowercase(); - let Ok(intents) = super::catalog::load_intents() else { +pub fn match_skills(query: &str, limit: usize) -> Vec { + let intent_routes = load_intent_routes_from_yaml(); + let mut skill_routes = Vec::new(); + for entry in load_catalog() { + let Ok(skill) = load_skill(&entry.id) else { + continue; + }; + skill_routes.push(SkillRoute { + id: entry.id, + keywords: skill.keywords, + }); + } + match_routed_skills(query, limit, &intent_routes, &skill_routes) +} + +fn load_intent_routes_from_yaml() -> Vec { + let Ok(intents) = load_intents() else { return Vec::new(); }; let Some(map) = intents.get("intents").and_then(|v| v.as_object()) else { return Vec::new(); }; - let mut scored: Vec<(usize, String)> = Vec::new(); - for intent in map.values() { - let keywords = intent - .get("keywords") - .and_then(|v| v.as_array()) - .map(|arr| { - arr.iter() - .filter_map(|v| v.as_str().map(str::to_string)) - .collect::>() - }) - .unwrap_or_default(); - let hits = keywords - .iter() - .filter(|kw| q.contains(&kw.to_lowercase())) - .count(); - if hits == 0 { - continue; - } - if let Some(ids) = intent.get("skills").and_then(|v| v.as_array()) { - for sid in ids { - if let Some(id) = sid.as_str() { - scored.push((hits, id.to_string())); - } + map.values() + .filter_map(|intent| { + let keywords = intent + .get("keywords") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str().map(str::to_string)) + .collect::>() + }) + .unwrap_or_default(); + let skills = intent + .get("skills") + .and_then(|v| v.as_array()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str().map(str::to_string)) + .collect::>() + }) + .unwrap_or_default(); + if keywords.is_empty() || skills.is_empty() { + None + } else { + Some(IntentRoute { keywords, skills }) } - } - } - scored.sort_by(|a, b| b.0.cmp(&a.0).then_with(|| a.1.cmp(&b.1))); - - let mut seen = std::collections::HashSet::new(); - let mut out = Vec::new(); - for (_, id) in scored { - if seen.insert(id.clone()) { - out.push(id); - } - if out.len() >= limit { - break; - } - } - out + }) + .collect() } diff --git a/probing/crates/skills/src/runner.rs b/probing/crates/skills/src/runner.rs index 6953ec26..51dfa8a7 100644 --- a/probing/crates/skills/src/runner.rs +++ b/probing/crates/skills/src/runner.rs @@ -303,10 +303,6 @@ fn ensure_read_only_sql(sql: &str) -> Result<()> { )) } -fn dataframe_rows(df: &DataFrame) -> usize { - df.cols.iter().map(|c| c.len()).max().unwrap_or(0) -} - async fn run_sql_step(backend: &B, step: &SkillStep, sql: &str) -> StepOutcome { if let Err(e) = ensure_read_only_sql(sql) { return StepOutcome::Error { @@ -328,7 +324,7 @@ async fn run_sql_step(backend: &B, step: &SkillStep, sql: &str) match result { Ok((df, note, cluster_meta)) => { let degraded = cluster_meta.as_ref().is_some_and(|m| m.partial); - let rows = dataframe_rows(&df); + let rows = df.row_count(); if rows == 0 { match step.on_empty.as_str() { "abort" => StepOutcome::Error { diff --git a/probing/extensions/cc/src/extensions/mod.rs b/probing/extensions/cc/src/extensions/mod.rs index 356ec45c..a2153591 100644 --- a/probing/extensions/cc/src/extensions/mod.rs +++ b/probing/extensions/cc/src/extensions/mod.rs @@ -19,9 +19,9 @@ pub mod kmsg; #[cfg(feature = "kmsg")] pub use kmsg::KMsgProbeDataSource; -#[cfg(not(target_os = "macos"))] +#[cfg(target_os = "linux")] pub mod rdma; -#[cfg(not(target_os = "macos"))] +#[cfg(target_os = "linux")] pub use rdma::RdmaProbeDataSource; -#[cfg(not(target_os = "macos"))] +#[cfg(target_os = "linux")] pub use rdma::RdmaProbeExtension; diff --git a/probing/extensions/nccl-profiler/src/state.rs b/probing/extensions/nccl-profiler/src/state.rs index f437fbd4..3819a152 100644 --- a/probing/extensions/nccl-profiler/src/state.rs +++ b/probing/extensions/nccl-profiler/src/state.rs @@ -1490,8 +1490,10 @@ mod tests { { let coll = pools.coll_pool.get_mut(coll_idx).unwrap(); coll.start_ns = 1; - let mut row = CompletedProxyOp::default(); - row.trans_bytes = 999; + let row = CompletedProxyOp { + trans_bytes: 999, + ..Default::default() + }; assert!(coll.push_pending(row)); } diff --git a/probing/extensions/python/src/features/crash/mod.rs b/probing/extensions/python/src/features/crash/mod.rs index 2de7fb8c..bc791de2 100644 --- a/probing/extensions/python/src/features/crash/mod.rs +++ b/probing/extensions/python/src/features/crash/mod.rs @@ -7,7 +7,12 @@ mod grace; mod handler; mod memory_snapshot; mod report; +#[cfg(unix)] mod signal; +#[cfg(not(unix))] +mod signal { + pub fn install_crash_handler() {} +} pub use api::{ crash_enabled, note_last_comm, record_crash, request_crash_hold, request_crash_release, diff --git a/probing/extensions/python/src/features/pprof.rs b/probing/extensions/python/src/features/pprof.rs index 2596ff0d..ccd81dfc 100644 --- a/probing/extensions/python/src/features/pprof.rs +++ b/probing/extensions/python/src/features/pprof.rs @@ -498,6 +498,7 @@ unsafe fn walk_frame_pointers(start_fp: usize, out: &mut [usize], lo: usize, hi: count } +#[cfg(unix)] unsafe extern "C" fn sigprof_handler(_sig: c_int, _info: *mut libc::siginfo_t, uctx: *mut c_void) { if !SAMPLER_ENABLED.load(Ordering::Acquire) { return; @@ -568,6 +569,7 @@ unsafe extern "C" fn sigprof_handler(_sig: c_int, _info: *mut libc::siginfo_t, u static HANDLER_INSTALLED: AtomicBool = AtomicBool::new(false); +#[cfg(unix)] fn install_handler() { if HANDLER_INSTALLED.swap(true, Ordering::AcqRel) { return; @@ -582,6 +584,10 @@ fn install_handler() { } } +#[cfg(not(unix))] +fn install_handler() {} + +#[cfg(unix)] fn arm_timer(freq: i32) { let period_us = (1_000_000i64 / freq as i64).max(1); let tv = libc::timeval { @@ -595,11 +601,18 @@ fn arm_timer(freq: i32) { unsafe { libc::setitimer(libc::ITIMER_PROF, &it, std::ptr::null_mut()) }; } +#[cfg(not(unix))] +fn arm_timer(_freq: i32) {} + +#[cfg(unix)] fn disarm_timer() { let it: libc::itimerval = unsafe { std::mem::zeroed() }; unsafe { libc::setitimer(libc::ITIMER_PROF, &it, std::ptr::null_mut()) }; } +#[cfg(not(unix))] +fn disarm_timer() {} + // --------------------------------------------------------------------------- // Consumer thread: symbolize + fold (all off the signal path) // --------------------------------------------------------------------------- @@ -829,6 +842,19 @@ pub fn is_sampling_active() -> bool { } pub fn setup(freq: u64) -> Result<()> { + #[cfg(not(unix))] + { + let _ = freq; + return Err(anyhow::anyhow!( + "CPU profiling (SIGPROF) is not supported on this platform" + )); + } + #[cfg(unix)] + setup_unix(freq) +} + +#[cfg(unix)] +fn setup_unix(freq: u64) -> Result<()> { let freq = if freq == 0 { DEFAULT_SAMPLE_FREQ } else { diff --git a/probing/extensions/python/src/features/python_api.rs b/probing/extensions/python/src/features/python_api.rs index 5d9545ed..5b4dd3a8 100644 --- a/probing/extensions/python/src/features/python_api.rs +++ b/probing/extensions/python/src/features/python_api.rs @@ -9,7 +9,7 @@ use probing_core::ENGINE; use crate::features::native_bridge::with_detached_native; use crate::features::py_result::runtime_err; use crate::features::stack_tracer::{is_backtrace_busy, SignalTracer, StackTracer}; -use crate::repl::PythonRepl; +use crate::repl::ReplSession; fn callstack_error_json(message: &str) -> String { serde_json::json!({ @@ -72,11 +72,10 @@ pub fn api_callstack(tid: Option) -> PyResult { #[pyfunction] pub fn api_eval(code: &str) -> PyResult { log::debug!("Python eval code: {code}"); - let mut repl = PythonRepl::default(); - let out = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| repl.process(code))); + let mut session = ReplSession::new(); + let out = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| session.eval_code(code))); match out { - Ok(Some(s)) => Ok(s), - Ok(None) => Ok(String::new()), + Ok(s) => Ok(s), Err(_) => Ok(serde_json::json!({"error": "REPL execution panicked"}).to_string()), } } diff --git a/probing/extensions/python/src/repl/session.rs b/probing/extensions/python/src/repl/session.rs index 1550fa67..a61c2d50 100644 --- a/probing/extensions/python/src/repl/session.rs +++ b/probing/extensions/python/src/repl/session.rs @@ -24,4 +24,9 @@ impl ReplSession { pub fn handle_text(&mut self, text: String) -> String { self.repl.feed(text).unwrap_or_else(|| "{}".to_string()) } + + /// Evaluate one code snippet (HTTP eval API — single shot, no line buffering). + pub fn eval_code(&mut self, code: &str) -> String { + self.repl.process(code).unwrap_or_default() + } } diff --git a/probing/extensions/python/src/setup.rs b/probing/extensions/python/src/setup.rs index 6d30a470..8c60d846 100644 --- a/probing/extensions/python/src/setup.rs +++ b/probing/extensions/python/src/setup.rs @@ -28,6 +28,7 @@ fn setup() { set_enabled(true); } + #[cfg(unix)] if cfg!(test) { // Unit-test processes must not run the SIGUSR2 stack handler: it calls // backtrace/Python from signal context and aborts on stray delivery. diff --git a/probing/memtable/src/memtable.rs b/probing/memtable/src/memtable.rs index 81f98f4f..582e2d25 100644 --- a/probing/memtable/src/memtable.rs +++ b/probing/memtable/src/memtable.rs @@ -284,6 +284,7 @@ pub enum BackingKind { /// Process-private heap allocation. Heap, /// POSIX shared memory object (`shm_open`) — memory-only. + #[cfg(unix)] Shm, /// mmap'd regular file — disk-backed. File, @@ -298,6 +299,7 @@ enum Backing { /// never touches disk, gone after reboot. Other processes attach by /// name. When `unlink_on_drop`, the creator removes the name on drop /// (existing mappings stay valid until unmapped). + #[cfg(unix)] Shm { mmap: MmapMut, name: String, @@ -320,6 +322,7 @@ impl Backing { fn bytes(&self) -> &[u8] { match self { Backing::Heap(v) => v, + #[cfg(unix)] Backing::Shm { mmap, .. } => mmap, Backing::File { mmap, .. } => mmap, } @@ -329,6 +332,7 @@ impl Backing { fn bytes_mut(&mut self) -> &mut [u8] { match self { Backing::Heap(v) => v, + #[cfg(unix)] Backing::Shm { mmap, .. } => mmap, Backing::File { mmap, .. } => mmap, } @@ -337,6 +341,7 @@ impl Backing { /// Normalise a POSIX shm name: must start with `/`, no other slashes. /// Keep names short — macOS limits them to 31 bytes (`PSHMNAMLEN`). +#[cfg(unix)] fn shm_name_cstring(name: &str) -> io::Result { let normalised = if name.starts_with('/') { name.to_string() @@ -353,6 +358,7 @@ fn shm_name_cstring(name: &str) -> io::Result { .map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "shm name contains NUL")) } +#[cfg(unix)] fn cstring_to_shm_name(cname: std::ffi::CString) -> io::Result { cname.into_string().map_err(|e| { log::error!("shm name is not valid UTF-8: {e:?}"); @@ -361,6 +367,7 @@ fn cstring_to_shm_name(cname: std::ffi::CString) -> io::Result { } /// `shm_open` wrapper returning an owned [`std::fs::File`]. +#[cfg(unix)] fn shm_open_file(name: &std::ffi::CString, oflag: libc::c_int) -> io::Result { use std::os::fd::FromRawFd; let fd = unsafe { libc::shm_open(name.as_ptr(), oflag, 0o600 as libc::c_uint) }; @@ -423,6 +430,7 @@ impl MemTable { /// processes keep a valid mapping until they unmap. /// /// Fails with `AlreadyExists` if the name is taken. + #[cfg(unix)] pub fn shm(name: &str, schema: &Schema, chunk_size: u32, num_chunks: u32) -> io::Result { let cname = shm_name_cstring(name)?; let size = Self::required_size(schema, chunk_size as usize, num_chunks as usize); @@ -446,6 +454,7 @@ impl MemTable { /// [`shm`](Self::shm) (validates the MEMT layout). /// /// The returned handle does **not** unlink the name on drop. + #[cfg(unix)] pub fn open_shm(name: &str) -> io::Result { let cname = shm_name_cstring(name)?; let file = shm_open_file(&cname, libc::O_RDWR)?; @@ -588,6 +597,7 @@ impl MemTable { pub fn backing_kind(&self) -> BackingKind { match &self.backing { Backing::Heap(_) => BackingKind::Heap, + #[cfg(unix)] Backing::Shm { .. } => BackingKind::Shm, Backing::File { .. } => BackingKind::File, } @@ -595,7 +605,12 @@ impl MemTable { /// `true` when other processes can attach (shm or mmap'd file). pub fn is_shared(&self) -> bool { - !matches!(self.backing, Backing::Heap(_)) + match &self.backing { + Backing::Heap(_) => false, + #[cfg(unix)] + Backing::Shm { .. } => true, + Backing::File { .. } => true, + } } /// File path of the mapping; [`None`] for heap and shm backings @@ -610,6 +625,7 @@ impl MemTable { /// POSIX shm name (with leading `/`); [`None`] for other backings. pub fn shm_name(&self) -> Option<&str> { match &self.backing { + #[cfg(unix)] Backing::Shm { name, .. } => Some(name), _ => None, } @@ -665,6 +681,7 @@ impl Drop for MemTable { fn drop(&mut self) { match &self.backing { Backing::Heap(_) => {} + #[cfg(unix)] Backing::Shm { name, unlink_on_drop: true, @@ -674,6 +691,7 @@ impl Drop for MemTable { unsafe { libc::shm_unlink(cname.as_ptr()) }; } } + #[cfg(unix)] Backing::Shm { .. } => {} Backing::File { path, @@ -695,6 +713,7 @@ impl fmt::Display for MemTable { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let kind = match self.backing_kind() { BackingKind::Heap => "heap", + #[cfg(unix)] BackingKind::Shm => "shm", BackingKind::File => "file", }; @@ -1027,6 +1046,7 @@ mod tests { } #[test] + #[cfg(unix)] fn shm_backing_roundtrip_and_unlink() { // Short name: macOS caps shm names at 31 bytes. let name = format!("/pbg_t{}", std::process::id() % 1_000_000); diff --git a/probing/proto/src/types/dataframe.rs b/probing/proto/src/types/dataframe.rs index 7df4f3f7..74ecb3d7 100644 --- a/probing/proto/src/types/dataframe.rs +++ b/probing/proto/src/types/dataframe.rs @@ -20,15 +20,54 @@ impl DataFrame { } pub fn len(&self) -> usize { - if self.cols.is_empty() { - return 0; + self.row_count() + } + + /// Row count using the longest column (handles ragged columns safely). + pub fn row_count(&self) -> usize { + self.cols.iter().map(|c| c.len()).max().unwrap_or(0) + } + + pub fn col_index(&self, name: &str) -> Option { + self.names.iter().position(|n| n == name) + } + + pub fn scalar_f64(&self, col: &str, row: usize) -> Option { + let ci = self.col_index(col)?; + let column = self.cols.get(ci)?; + if row >= column.len() { + return None; } - self.cols[0].len() + ele_f64(&column.get(row)) + } + + pub fn scalar_i64(&self, col: &str, row: usize) -> Option { + let ci = self.col_index(col)?; + let column = self.cols.get(ci)?; + if row >= column.len() { + return None; + } + ele_i64(&column.get(row)) + } + + pub fn scalar_boolish(&self, col: &str, row: usize) -> bool { + let ci = match self.col_index(col) { + Some(ci) => ci, + None => return false, + }; + let column = match self.cols.get(ci) { + Some(column) => column, + None => return false, + }; + if row >= column.len() { + return false; + } + ele_boolish(&column.get(row)) } #[must_use] pub fn is_empty(&self) -> bool { - self.len() == 0 + self.row_count() == 0 } pub fn iter(&'_ self) -> DataFrameIterator<'_> { @@ -39,6 +78,37 @@ impl DataFrame { } } +fn ele_f64(ele: &Ele) -> Option { + match ele { + Ele::F64(x) => Some(*x), + Ele::F32(x) => Some(*x as f64), + Ele::I64(x) => Some(*x as f64), + Ele::I32(x) => Some(*x as f64), + Ele::Text(s) => s.parse().ok(), + _ => None, + } +} + +fn ele_i64(ele: &Ele) -> Option { + match ele { + Ele::I64(x) => Some(*x), + Ele::I32(x) => Some(*x as i64), + Ele::F64(x) => Some(*x as i64), + Ele::Text(s) => s.parse().ok(), + _ => None, + } +} + +fn ele_boolish(ele: &Ele) -> bool { + match ele { + Ele::BOOL(x) => *x, + Ele::I64(x) => *x != 0, + Ele::I32(x) => *x != 0, + Ele::Text(s) => matches!(s.as_str(), "1" | "true" | "True"), + _ => false, + } +} + pub struct DataFrameIterator<'a> { df: &'a DataFrame, current: usize, diff --git a/probing/server/Cargo.toml b/probing/server/Cargo.toml index 32f1930b..5d43eef2 100644 --- a/probing/server/Cargo.toml +++ b/probing/server/Cargo.toml @@ -13,7 +13,7 @@ gpu = ["dep:probing-gpu"] gpu-cuda = ["gpu", "probing-gpu/cuda"] kmsg = ["probing-cc/kmsg"] default = ["extension-module", "kmsg", "rmcp"] -rmcp = ["dep:rmcp", "dep:probing-cli"] +rmcp = ["dep:rmcp", "dep:probing-cli", "dep:probing-skills"] [dependencies] probing-cc = { path = "../extensions/cc", default-features = false } @@ -24,6 +24,7 @@ probing-proto = { path = "../proto" } probing-core = { path = "../core" } probing-store = { path = "../crates/store" } probing-cli = { path = "../cli", optional = true } +probing-skills = { path = "../crates/skills", optional = true } datafusion = { workspace = true } diff --git a/probing/server/src/mcp/mod.rs b/probing/server/src/mcp/mod.rs index ac00f98a..80363033 100644 --- a/probing/server/src/mcp/mod.rs +++ b/probing/server/src/mcp/mod.rs @@ -11,6 +11,7 @@ use std::sync::Arc; use axum::Router; use probing_cli::cli::skill::{list_skill_ids, load_skill, plan_skill, run_skill_json}; use probing_proto::prelude::{Query, QueryDataFormat}; +use probing_skills::backend::parse_cluster_query_response; use rmcp::handler::server::router::tool::ToolRouter; use rmcp::handler::server::wrapper::Parameters; use rmcp::model::{ @@ -270,32 +271,14 @@ impl ProbingMcp { .map_err(|e| tool_error(e.to_string()))?; let value: serde_json::Value = serde_json::from_str(&reply).map_err(|e| tool_error(e.to_string()))?; - if let Some(err) = value.get("error").and_then(|v| v.as_str()) { - return Err(tool_error(err.to_string())); - } - let df = value - .get("dataframe") - .ok_or_else(|| tool_error("missing dataframe in cluster response"))?; - let dataframe: probing_proto::prelude::DataFrame = - serde_json::from_value(df.clone()).map_err(|e| tool_error(e.to_string()))?; + let (dataframe, cluster_meta) = + parse_cluster_query_response(&value).map_err(|e| tool_error(e.0))?; let rows = helpers::truncate_dataframe_json(&dataframe, limit); let meta = value .get("meta") .cloned() .unwrap_or(serde_json::Value::Null); - let partial = meta - .get("partial") - .and_then(|v| v.as_bool()) - .unwrap_or(false) - || meta - .get("nodes_failed") - .and_then(|v| v.as_array()) - .is_some_and(|a| !a.is_empty()) - || meta - .get("peer_batches_dropped") - .and_then(|v| v.as_u64()) - .unwrap_or(0) - > 0; + let partial = cluster_meta.as_ref().is_some_and(|m| m.partial); let payload = serde_json::json!({ "dataframe": rows, "meta": meta, diff --git a/pyproject.toml b/pyproject.toml index ec7f30d8..eadb8415 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,11 +75,43 @@ dev = [ "ipython>=8.0", "ipykernel>=6.0", "ruff>=0.1.0", - "black>=24.0; python_version >= '3.8'", - "black<24.0; python_version < '3.8'", "maturin>=1.0,<2.0", ] +# Locked dev / CI deps — sync with: uv lock +[dependency-groups] +build = [ + "build", + "maturin>=1.0,<2.0", + "toml", + "wheel", +] +dev = [ + "coverage>=7.0", + "ipykernel>=6.0", + "ipython>=8.0; python_version >= '3.8'", + "pytest>=8.0; python_version >= '3.8'", + "pytest<8.0; python_version < '3.8'", + "pytest-cov>=4.0", + "pyyaml>=6", + "ruff>=0.1.0", +] +wheel-test = [ + "coverage>=7.0", + "ipykernel>=6.0", + "pandas", + "pytest>=8.0; python_version >= '3.8'", + "pytest-cov>=4.0", + "pyyaml>=6", + "torch", + "websockets", +] + +[tool.uv] +# Lock resolution scope for CI/dev (does not change [project] requires-python). +environments = ["python_version >= '3.10'"] +default-groups = ["dev", "build"] + [tool.maturin] module-name = "probing._core" manifest-path = "Cargo.toml" @@ -152,7 +184,7 @@ ignore = ["E501", "E402", "F841", "E731", "F401", "E722", "N806", "N801", "N802" "examples/*" = ["E722"] "tests/*" = ["F841"] -[tool.black] -line-length = 88 -target-version = ["py37"] -include = '\.pyi?$' +[tool.ruff.format] +quote-style = "double" +indent-style = "space" +line-ending = "auto" diff --git a/python/probing/discovery.py b/python/probing/discovery.py deleted file mode 100644 index 7d00bb71..00000000 --- a/python/probing/discovery.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Backward-compatible re-exports — prefer ``probing.extensions``.""" - -from __future__ import annotations - -from probing.extensions import ( - ENTRY_GROUP_MAGICS, - ENTRY_GROUP_SKILLS, - SkillRoot, - bundled_skills_dir, - find_repo_root, - list_vendor_extensions, - load_magics, - load_magics_from_entry_points, - load_skill_roots_from_entry_points, - repo_skills_dir, - skill_root_bundled, - skill_roots, - skill_roots_json, - vendor_extensions_json, - vendor_id_from_dist_name, - vendor_import_name, - vendor_package_name, -) -from probing.extensions.__main__ import main as _main - -entry_point_skill_roots = load_skill_roots_from_entry_points -load_entry_point_magics = load_magics_from_entry_points -package_skill_roots = load_skill_roots_from_entry_points - -if __name__ == "__main__": - raise SystemExit(_main()) diff --git a/python/probing/extensions/README.md b/python/probing/extensions/README.md index 40765ada..249458a5 100644 --- a/python/probing/extensions/README.md +++ b/python/probing/extensions/README.md @@ -34,7 +34,6 @@ from probing.extensions import ( | `probing.repl` | `load_magics()` | | `probing.handlers.pythonext` | `skill_roots_json`, `vendor_extensions_json` | | `probing/cli` (Rust) | subprocess `python -m probing.extensions skill-roots` | -| `probing.discovery` | Deprecated shim re-exporting this package | ## Authoring vendor packages diff --git a/python/probing/inspect/trace.py b/python/probing/inspect/trace.py index cbe2315f..215c1ed6 100644 --- a/python/probing/inspect/trace.py +++ b/python/probing/inspect/trace.py @@ -698,7 +698,9 @@ def wrapper(*args, **kwargs): "__probe_silent_watch__": ( silent_watch if isinstance(silent_watch, list) - else list(silent_watch) if silent_watch else [] + else list(silent_watch) + if silent_watch + else [] ), "__probe_depth__": depth, } @@ -719,7 +721,9 @@ def wrapper(*args, **kwargs): "__probe_silent_watch__": ( silent_watch if isinstance(silent_watch, list) - else list(silent_watch) if silent_watch else [] + else list(silent_watch) + if silent_watch + else [] ), "__probe_depth__": depth, } diff --git a/python/probing/nccl/mock.py b/python/probing/nccl/mock.py index 158d3dd7..ae3101b4 100644 --- a/python/probing/nccl/mock.py +++ b/python/probing/nccl/mock.py @@ -11,6 +11,7 @@ COLL_PERF_TABLE = "nccl.coll_perf" INFLIGHT_OPS_TABLE = "nccl.inflight_ops" NET_QP_TABLE = "nccl.net_qp" +PROFILER_COUNTERS_TABLE = "nccl.profiler_counters" PROXY_OPS_COLUMNS = [ "ts", @@ -82,6 +83,33 @@ "duration_ns", ] +PROFILER_COUNTERS_COLUMNS = [ + "ts", + "rank", + "coll_events", + "p2p_events", + "proxy_op_events", + "proxy_step_events", + "kernel_ch_events", + "net_events", + "rows_written", + "pool_exhausted", + "write_errors", + "filtered", + "coll_live", + "proxy_live", + "step_live", + "kch_live", + "net_live", + "coll_cap", + "proxy_cap", + "step_cap", + "kch_cap", + "net_cap", + "ring_chunks_recycled", + "ring_rows_overwritten", +] + # rank 2: culprit (slow GPU → high send_gpu_wait) # rank 5: victim (waits on peers → high recv_wait) _CULPRIT_RANK = 2 @@ -328,11 +356,43 @@ def seed_mock(*, ranks: int = 8, ops_per_rank: int = 5) -> dict[str, int]: net_rows = list(_iter_net_qp_rows(ranks, ops_per_rank, base_ts_ns)) net.append_many(net_rows) + counters = ExternalTable.get_or_create( + PROFILER_COUNTERS_TABLE, PROFILER_COUNTERS_COLUMNS + ) + counters_row = [ + base_ts_ns, + 0, + len(coll_rows), + 0, + len(proxy_rows), + len(proxy_rows), + 0, + len(net_rows), + len(proxy_rows) + len(coll_rows) + len(net_rows), + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 256, + 256, + 256, + 256, + 256, + 0, + 0, + ] + counters.append_many([counters_row]) + return { PROXY_OPS_TABLE: len(proxy_rows), COLL_PERF_TABLE: len(coll_rows), INFLIGHT_OPS_TABLE: len(inflight_rows), NET_QP_TABLE: len(net_rows), + PROFILER_COUNTERS_TABLE: 1, } diff --git a/python/probing/profiling/torch_probe.py b/python/probing/profiling/torch_probe.py index 9cd6be0b..15e73af2 100644 --- a/python/probing/profiling/torch_probe.py +++ b/python/probing/profiling/torch_probe.py @@ -587,7 +587,6 @@ def _backend_event(enable_timing=True): class Timer: def __init__(self, sync: bool = False, **kwargs): - self.has_backend = torch_backend() is not None self.use_gpu_events = _backend_has_event() self.sync = sync diff --git a/python/probing/repl/__init__.py b/python/probing/repl/__init__.py index 8ce48394..3bb818c1 100644 --- a/python/probing/repl/__init__.py +++ b/python/probing/repl/__init__.py @@ -16,7 +16,6 @@ - `register_magic`: Decorator to define custom magic commands. """ -# from jupyter_client.session import Session import json from dataclasses import asdict, dataclass, field from typing import Dict, List, Optional, Type, Union diff --git a/python/probing/repl/debug_magic.py b/python/probing/repl/debug_magic.py index 02c47d16..b7b27155 100644 --- a/python/probing/repl/debug_magic.py +++ b/python/probing/repl/debug_magic.py @@ -470,7 +470,7 @@ def my_function(x): # Wrap execution in probe context _probing_tracer = _probe_decorator(watch={args.watch!r}, depth={args.depth}) with _probing_tracer: -{chr(10).join(' ' + line for line in cell.split(chr(10)))} +{chr(10).join(" " + line for line in cell.split(chr(10)))} """ self.shell.run_cell(exec_code) @@ -483,9 +483,9 @@ def status() -> Dict[str, Any]: __main__.__probing__ = {} if "debug" not in __main__.__probing__: __main__.__probing__["debug"] = {} - __main__.__probing__["debug"][ - "debugger_installed" - ] = DebugMagic.detect_debugger() + __main__.__probing__["debug"]["debugger_installed"] = ( + DebugMagic.detect_debugger() + ) return __main__.__probing__["debug"] diff --git a/python/probing/repl/stack_magic.py b/python/probing/repl/stack_magic.py index cdc9329f..ab913d41 100644 --- a/python/probing/repl/stack_magic.py +++ b/python/probing/repl/stack_magic.py @@ -42,7 +42,6 @@ def __repr__(self): @register_magic("stack") @magics_class class StackMagic(Magics): - @line_magic def bt(self, line: str): """Print python and C stack.""" diff --git a/python/probing/skills/README.md b/python/probing/skills/README.md index 9589ebd7..ecf8b0f6 100644 --- a/python/probing/skills/README.md +++ b/python/probing/skills/README.md @@ -47,4 +47,4 @@ from probing.skills.install import install_skills ## Tests `tests/unit/probing/skills/` — loader (Rust bridge). `tests/regression/skills/` — install, tools. -`tests/unit/probing/test_extensions.py` — entry-point discovery (legacy `test_discovery.py` covers shim). +`tests/unit/probing/test_extensions.py` — entry-point discovery. diff --git a/python/probing/skills/loader.py b/python/probing/skills/loader.py index 57f5e40c..60a9461a 100644 --- a/python/probing/skills/loader.py +++ b/python/probing/skills/loader.py @@ -42,17 +42,13 @@ class Skill: title: str category: str tags: List[str] - triggers: Dict[str, Any] docs: str parameters: List[Dict[str, Any]] - requires: Dict[str, Any] steps: List[SkillStep] interpretation: Dict[str, Any] summary_template: str next_steps: List[str] - variables: Dict[str, str] path: Path - metadata: Dict[str, Any] = field(default_factory=dict) @dataclass @@ -79,11 +75,25 @@ def skills_root() -> Path: return repo -def load_catalog(root: Optional[Path] = None) -> SkillCatalog: - if root is not None: - raise NotImplementedError( - "load_catalog(root=...) is deprecated; use bundled discovery via Rust" - ) +def _step_from_raw(raw: Mapping[str, Any]) -> SkillStep: + return SkillStep( + id=str(raw.get("id", "")), + title=str(raw.get("title", "")), + type=str(raw.get("type", "sql")), + sql=raw.get("sql"), + method=raw.get("method"), + path=raw.get("path"), + action=raw.get("action"), + view=raw.get("view"), + on_empty=str(raw.get("on_empty", "skip")), + empty_message=raw.get("empty_message"), + when=raw.get("when"), + platform=raw.get("platform"), + raw=dict(raw), + ) + + +def load_catalog() -> SkillCatalog: data = json.loads(_core().skills_catalog()) entries = [ SkillCatalogEntry( @@ -98,62 +108,31 @@ def load_catalog(root: Optional[Path] = None) -> SkillCatalog: return SkillCatalog(skills=entries) -def load_skill(skill_id: str, root: Optional[Path] = None) -> Skill: - if root is not None: - raise NotImplementedError( - "load_skill(..., root=...) is deprecated; use bundled discovery via Rust" - ) +def load_skill(skill_id: str) -> Skill: raw = json.loads(_core().skills_load(skill_id)) if "error" in raw: raise KeyError(raw["error"]) - steps = [ - SkillStep( - id=str(s.get("id", "")), - title=str(s.get("title", "")), - type=str(s.get("type", "sql")), - sql=s.get("sql"), - method=s.get("method"), - path=s.get("path"), - action=s.get("action"), - view=s.get("view"), - on_empty=str(s.get("on_empty", "skip")), - empty_message=s.get("empty_message"), - when=s.get("when"), - platform=s.get("platform"), - raw=dict(s), - ) - for s in raw.get("steps") or [] - ] - keywords = raw.get("keywords") or {} - triggers = {"keywords": keywords} + steps = [_step_from_raw(s) for s in raw.get("steps") or []] return Skill( id=str(raw["id"]), title=str(raw.get("title", raw["id"])), category=str(raw.get("category", "general")), tags=list(raw.get("tags") or []), - triggers=triggers, docs=str(raw.get("docs") or "").strip(), parameters=list(raw.get("parameters") or []), - requires={}, steps=steps, interpretation=dict(raw.get("interpretation") or {}), summary_template=str(raw.get("summary_template") or "").strip(), next_steps=list(raw.get("next_steps") or []), - variables={}, path=skills_root() / skill_id / "steps.yaml", - metadata={"triggers": triggers}, ) -def load_intents(root: Optional[Path] = None) -> Dict[str, Any]: - if root is not None: - raise NotImplementedError("load_intents(root=...) is deprecated") +def load_intents() -> Dict[str, Any]: return json.loads(_core().skills_intents()) -def load_pages(root: Optional[Path] = None) -> Dict[str, Any]: - if root is not None: - raise NotImplementedError("load_pages(root=...) is deprecated") +def load_pages() -> Dict[str, Any]: return json.loads(_core().skills_pages()) @@ -175,26 +154,7 @@ def expand_skill( if overrides: params.update(dict(overrides)) plan = json.loads(_core().skills_plan(skill.id, json.dumps(params))) - out: List[SkillStep] = [] - for raw in plan.get("steps") or []: - out.append( - SkillStep( - id=str(raw.get("id", "")), - title=str(raw.get("title", "")), - type=str(raw.get("type", "sql")), - sql=raw.get("sql"), - method=raw.get("method"), - path=raw.get("path"), - action=raw.get("action"), - view=raw.get("view"), - on_empty=str(raw.get("on_empty", "skip")), - empty_message=raw.get("empty_message"), - when=raw.get("when"), - platform=raw.get("platform"), - raw=dict(raw), - ) - ) - return out + return [_step_from_raw(raw) for raw in plan.get("steps") or []] def build_context( @@ -206,20 +166,17 @@ def build_context( return {str(k): str(v) for k, v in params.items()} -def match_skills( - query: str, - root: Optional[Path] = None, - limit: int = 3, -) -> List[str]: - if root is not None: - raise NotImplementedError("match_skills(root=...) is deprecated") +def match_skills(query: str, limit: int = 3) -> List[str]: return json.loads(_core().skills_match(query, limit)) def validate_skill(skill: Skill) -> List[str]: warnings: List[str] = [] if not skill.steps: - warnings.append(f"{skill.id}: no steps defined") + # Guide-only skills (e.g. crash_triage) route agents via SKILL.md + + # summary_template / next_steps without executable probe steps. + if not skill.summary_template.strip() and not skill.next_steps: + warnings.append(f"{skill.id}: no steps defined") seen_ids: set[str] = set() for step in skill.steps: if step.id in seen_ids: @@ -233,10 +190,10 @@ def validate_skill(skill: Skill) -> List[str]: return warnings -def validate_all(root: Optional[Path] = None) -> List[str]: - catalog = load_catalog(root) +def validate_all() -> List[str]: + catalog = load_catalog() all_warnings: List[str] = [] for entry in catalog.skills: - skill = load_skill(entry.id, root) + skill = load_skill(entry.id) all_warnings.extend(validate_skill(skill)) return all_warnings diff --git a/python/probing/timing/__init__.py b/python/probing/timing/__init__.py index e462de78..86a91ef9 100644 --- a/python/probing/timing/__init__.py +++ b/python/probing/timing/__init__.py @@ -1,5 +1,5 @@ """ -Accelerator Timing +Accelerator Timing (experimental) Spec ---- @@ -7,6 +7,8 @@ CUDA events (the ``cuda_event_wait_value32_ffi`` method), which exclude host enqueue latency from the measurement. +Not wired into production training paths yet — used by unit/regression tests. + Usage: from probing.timing import timing, timing_context @@ -31,6 +33,7 @@ def gemm(): - `TimingRecord`: a single measurement (elapsed_ms / method / value). - `AcceleratorTimer`: the underlying timer for standalone use. """ + from __future__ import annotations import contextvars diff --git a/python/probing/timing/_cuda_runtime_ffi.py b/python/probing/timing/_cuda_runtime_ffi.py index c19c946e..fbec2a28 100644 --- a/python/probing/timing/_cuda_runtime_ffi.py +++ b/python/probing/timing/_cuda_runtime_ffi.py @@ -4,6 +4,7 @@ ``cuStreamWaitValue32`` / ``cuStreamWriteValue32`` driver entry points so the host can stall and release a device-side flag without compiling anything. """ + from __future__ import annotations import ctypes @@ -143,9 +144,7 @@ def set_device(self, device: int) -> None: device = int(device) current = ctypes.c_void_p() - self._check( - self._cu_ctx_get_current(ctypes.byref(current)), "cuCtxGetCurrent" - ) + self._check(self._cu_ctx_get_current(ctypes.byref(current)), "cuCtxGetCurrent") if current.value is not None: current_device = ctypes.c_int() result = self._cu_ctx_get_device(ctypes.byref(current_device)) diff --git a/python/probing/timing/backend.py b/python/probing/timing/backend.py index da389b5e..3ed4f4d7 100644 --- a/python/probing/timing/backend.py +++ b/python/probing/timing/backend.py @@ -3,6 +3,7 @@ Only the primitives the timer needs live here: backend detection, device naming, and timing-event creation. """ + from __future__ import annotations diff --git a/python/probing/timing/gates.py b/python/probing/timing/gates.py index 91a07120..249ed3aa 100644 --- a/python/probing/timing/gates.py +++ b/python/probing/timing/gates.py @@ -12,6 +12,7 @@ dedicated CUDA streams and a flag tensor, so it is built at most once per device and reused across measured iterations. """ + from __future__ import annotations import threading diff --git a/python/probing/timing/timer.py b/python/probing/timing/timer.py index 804dd191..0f562be4 100644 --- a/python/probing/timing/timer.py +++ b/python/probing/timing/timer.py @@ -6,6 +6,7 @@ excludes host enqueue latency. It requires a CUDA device that supports driver stream memory operations; there is no fallback timer. """ + from __future__ import annotations from dataclasses import dataclass diff --git a/scripts/fmt-all-cfgs.sh b/scripts/fmt-all-cfgs.sh new file mode 100755 index 00000000..6840c303 --- /dev/null +++ b/scripts/fmt-all-cfgs.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# Run rustfmt for the host and for additional compilation targets so that +# platform-specific #[cfg(...)] branches (windows / linux / aarch64, etc.) +# are visited even when developing on a single OS. +# +# Usage: +# ./scripts/fmt-all-cfgs.sh # format +# ./scripts/fmt-all-cfgs.sh --check # check only +# +# Env: +# FMT_EXTRA_TARGETS space-separated triples (override defaults) +# SKIP_WEB set to 1 to skip web/ + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +CHECK=() +if [[ "${1:-}" == "--check" ]]; then + CHECK=(-- --check) +fi + +HOST="$(rustc -vV | sed -n 's/^host: //p')" + +# Default extra targets: skip any that match the current host. +DEFAULT_TARGETS=( + x86_64-unknown-linux-gnu + aarch64-unknown-linux-gnu + x86_64-pc-windows-msvc + aarch64-apple-darwin + x86_64-apple-darwin +) + +if [[ -n "${FMT_EXTRA_TARGETS:-}" ]]; then + # shellcheck disable=SC2206 + TARGETS=($FMT_EXTRA_TARGETS) +else + TARGETS=() + for t in "${DEFAULT_TARGETS[@]}"; do + [[ "$t" == "$HOST" ]] && continue + TARGETS+=("$t") + done +fi + +run_fmt() { + local label="$1" + shift + echo "==> cargo fmt ($label)" + cargo fmt --all "$@" + if [[ "${SKIP_WEB:-0}" != "1" ]]; then + (cd web && cargo fmt --all "$@") + fi +} + +run_fmt "host=${HOST}" "${CHECK[@]}" + +for target in "${TARGETS[@]}"; do + if ! rustup target list --installed | rg -qx "$target"; then + if ! rustup target add "$target" 2>/dev/null; then + echo "==> skip target $target (not installable on this host)" >&2 + continue + fi + fi + # CARGO_BUILD_TARGET makes rustfmt/cargo use that target's cfg set. + CARGO_BUILD_TARGET="$target" run_fmt "target=${target}" "${CHECK[@]}" +done + +echo "fmt-all-cfgs: done" diff --git a/src/lib.rs b/src/lib.rs index ffeab506..42371e44 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -53,20 +53,36 @@ pub fn get_hostname() -> Result { } fn get_network_interfaces() -> Result> { - let ips = nix::ifaddrs::getifaddrs()? - .filter_map(|addr| addr.address) - .filter_map(|addr| addr.as_sockaddr_in().cloned()) - .filter_map(|addr| { - let ip_addr = addr.ip(); - match ip_addr.is_unspecified() { - true => None, - false => Some(ip_addr.to_string()), - } - }) - .collect::>(); - - log::debug!("Found network interface IPs: {:?}", ips); - Ok(ips) + #[cfg(unix)] + { + let ips = nix::ifaddrs::getifaddrs()? + .filter_map(|addr| addr.address) + .filter_map(|addr| addr.as_sockaddr_in().cloned()) + .filter_map(|addr| { + let ip_addr = addr.ip(); + match ip_addr.is_unspecified() { + true => None, + false => Some(ip_addr.to_string()), + } + }) + .collect::>(); + + log::debug!("Found network interface IPs: {:?}", ips); + Ok(ips) + } + #[cfg(windows)] + { + use std::net::UdpSocket; + let socket = UdpSocket::bind("0.0.0.0:0")?; + let _ = socket.connect("8.8.8.8:80"); + let ip = socket.local_addr()?.ip().to_string(); + log::debug!("Using local IP via UDP probe: {ip}"); + Ok(vec![ip]) + } + #[cfg(not(any(unix, windows)))] + { + Ok(Vec::new()) + } } /// True for the torchrun/elastic supervisor process (not a training worker). diff --git a/tests/regression/profiling/test_span_overhead.py b/tests/regression/profiling/test_span_overhead.py index 3e2e9596..48b6d2df 100644 --- a/tests/regression/profiling/test_span_overhead.py +++ b/tests/regression/profiling/test_span_overhead.py @@ -56,9 +56,9 @@ def test_manual_span_memtable_overhead_bounded(): # Guard against flaky CI: allow generous headroom but catch regressions # where span persistence becomes orders of magnitude slower. - assert ( - on < off * 8.0 + 0.05 - ), f"memtable spans too slow: off={off:.4f}s on={on:.4f}s ratio={on / max(off, 1e-9):.2f}" + assert on < off * 8.0 + 0.05, ( + f"memtable spans too slow: off={off:.4f}s on={on:.4f}s ratio={on / max(off, 1e-9):.2f}" + ) def _make_tracer(*, trace_spans: bool) -> tuple[TorchProbe, _FakeMod]: diff --git a/tests/regression/rust/probing/cli/inject_aarch64.rs b/tests/regression/rust/probing/cli/inject_aarch64.rs index e8b252a3..59a99473 100644 --- a/tests/regression/rust/probing/cli/inject_aarch64.rs +++ b/tests/regression/rust/probing/cli/inject_aarch64.rs @@ -23,7 +23,7 @@ fn injection_basic_fails_on_missing_library() { let target_pid = target.id(); thread::sleep(Duration::from_millis(100)); - let proc = Process::by_pid(target_pid as i32).expect("Failed to find target process"); + let proc = Process::get(target_pid).expect("Failed to find target process"); let dummy_lib = std::path::Path::new("/tmp/dummy.so"); let result = Injector::attach(proc).and_then(|mut injector| injector.inject(dummy_lib, vec![])); diff --git a/tests/regression/spec/test_api_spec.py b/tests/regression/spec/test_api_spec.py index b26a0585..9a1f0d49 100644 --- a/tests/regression/spec/test_api_spec.py +++ b/tests/regression/spec/test_api_spec.py @@ -84,9 +84,9 @@ def test_all_spec_handlers_registered(self, spec): missing = expected - registered extra = registered - expected assert not missing, f"missing handlers: {sorted(missing)}" - assert ( - not extra - ), f"unexpected handlers (update spec or remove): {sorted(extra)}" + assert not extra, ( + f"unexpected handlers (update spec or remove): {sorted(extra)}" + ) def test_handler_metadata_matches_spec(self, spec): by_path = {h["local_path"]: h for h in spec["pythonext_handlers"]} @@ -105,9 +105,9 @@ def test_legacy_local_paths_do_not_resolve(self): ] for local in legacy_locals: result = json.loads(handle_request(local, {})) - assert ( - "error" in result - ), f"legacy path must not resolve: {local!r} -> {result}" + assert "error" in result, ( + f"legacy path must not resolve: {local!r} -> {result}" + ) class TestPythonextCanonicalHttpUrls: @@ -150,9 +150,9 @@ class TestClientContracts: def test_declared_calls_are_canonical(self, spec, client): for call in declared_client_calls(client, spec): path = call["path"] - assert path_is_canonical( - path, spec - ), f"{client} {call['source']} declares non-canonical path {path!r}" + assert path_is_canonical(path, spec), ( + f"{client} {call['source']} declares non-canonical path {path!r}" + ) allowed = methods_for_path(path, spec) assert call["method"] in allowed, ( f"{client} {call['source']}: {call['method']} {path} " @@ -165,9 +165,9 @@ def test_declared_paths_appear_in_source(self, spec, client): for call in declared_client_calls(client, spec): source = root / call["source"] text = source.read_text(encoding="utf-8") - assert path_literal_in_source( - call["path"], text - ), f"{call['source']} missing path literal for {call['path']!r}" + assert path_literal_in_source(call["path"], text), ( + f"{call['source']} missing path literal for {call['path']!r}" + ) @pytest.mark.parametrize("client", ["web", "cli"]) def test_source_literals_are_not_deprecated(self, spec, client): @@ -194,9 +194,9 @@ def test_web_extracted_paths_are_canonical(self, spec): if source.name == "mod.rs": continue for path in extract_api_path_literals(source.read_text(encoding="utf-8")): - assert path_is_canonical( - path, spec - ), f"{source.relative_to(repo_root())} references unknown path {path!r}" + assert path_is_canonical(path, spec), ( + f"{source.relative_to(repo_root())} references unknown path {path!r}" + ) class TestEvalUsesBody: @@ -227,9 +227,9 @@ def test_public_api_routes_const_matches_spec(self, spec): import re actual = set(re.findall(r'\("([A-Z]+)", "([^"]+)"\)', mod_rs)) - assert ( - actual == expected - ), f"PUBLIC_API_ROUTES drift: missing={expected - actual}, extra={actual - expected}" + assert actual == expected, ( + f"PUBLIC_API_ROUTES drift: missing={expected - actual}, extra={actual - expected}" + ) class TestSpecReloadConsistency: diff --git a/tests/regression/timing/test_timing_gpu.py b/tests/regression/timing/test_timing_gpu.py index a55d2474..93275da5 100644 --- a/tests/regression/timing/test_timing_gpu.py +++ b/tests/regression/timing/test_timing_gpu.py @@ -14,9 +14,7 @@ pytestmark = [ pytest.mark.integration, pytest.mark.slow, - pytest.mark.skipif( - not torch.cuda.is_available(), reason="requires a CUDA device" - ), + pytest.mark.skipif(not torch.cuda.is_available(), reason="requires a CUDA device"), ] from probing.timing import TimingRecord, timing, timing_context # noqa: E402 diff --git a/tests/regression/training_observability/conftest.py b/tests/regression/training_observability/conftest.py index 65d31eb3..464cafbc 100644 --- a/tests/regression/training_observability/conftest.py +++ b/tests/regression/training_observability/conftest.py @@ -207,6 +207,6 @@ def parse_step_matrix_rows(df) -> list[dict[str, Any]]: def assert_rows_contain_fields(rows: Iterable[dict[str, Any]], **expected: Any) -> None: for key, value in expected.items(): - assert all( - row.get(key) == value for row in rows - ), f"expected all rows[{key}]=={value!r}, got {[row.get(key) for row in rows]}" + assert all(row.get(key) == value for row in rows), ( + f"expected all rows[{key}]=={value!r}, got {[row.get(key) for row in rows]}" + ) diff --git a/tests/unit/probing/skills/test_loader.py b/tests/unit/probing/skills/test_loader.py index e2397b5a..b3ac32da 100644 --- a/tests/unit/probing/skills/test_loader.py +++ b/tests/unit/probing/skills/test_loader.py @@ -12,6 +12,8 @@ load_skill, match_skills, skills_root, + validate_all, + validate_skill, ) @@ -133,3 +135,14 @@ def test_watchdog_timeout_table_expansion(): def test_match_skills_sre_triage(): matched = match_skills("SRE 值班 runbook 事故第一响应") assert "sre_triage" in matched + + +def test_validate_guide_only_skill_without_steps(): + skill = load_skill("crash_triage") + assert not skill.steps + assert skill.summary_template.strip() + assert validate_skill(skill) == [] + + +def test_validate_all_passes_bundled_catalog(): + assert validate_all() == [] diff --git a/tests/unit/probing/test_discovery.py b/tests/unit/probing/test_discovery.py index 0645104f..87a6e47b 100644 --- a/tests/unit/probing/test_discovery.py +++ b/tests/unit/probing/test_discovery.py @@ -87,10 +87,3 @@ def test_load_magics_no_crash(): assert not any( "IOPub" in t.name or "History" in t.name for t in threading.enumerate() ) - - -def test_discovery_shim_reexports(): - from probing import discovery as shim - from probing.extensions import skill_roots as roots - - assert shim.skill_roots is roots diff --git a/tests/unit/probing/timing/test_timing_backend.py b/tests/unit/probing/timing/test_timing_backend.py index 60e1cf68..4e463a89 100644 --- a/tests/unit/probing/timing/test_timing_backend.py +++ b/tests/unit/probing/timing/test_timing_backend.py @@ -80,7 +80,9 @@ def current_stream(device): seen["device"] = device return "STREAM" - accel = _FakeAccel(available=True, event_cls=_FakeEvent, current_stream=current_stream) + accel = _FakeAccel( + available=True, event_cls=_FakeEvent, current_stream=current_stream + ) torch = _FakeTorch(cuda=accel) start, end, stream = backend_mod.event_pair(torch, 5) @@ -98,7 +100,9 @@ def current_stream(device=None): raise TypeError("no device arg") return "DEFAULT_STREAM" - accel = _FakeAccel(available=True, event_cls=_FakeEvent, current_stream=current_stream) + accel = _FakeAccel( + available=True, event_cls=_FakeEvent, current_stream=current_stream + ) torch = _FakeTorch(cuda=accel) _start, _end, stream = backend_mod.event_pair(torch, 0) diff --git a/tests/unit/probing/timing/test_timing_cuda_ffi.py b/tests/unit/probing/timing/test_timing_cuda_ffi.py index 34bdfc96..299b8a70 100644 --- a/tests/unit/probing/timing/test_timing_cuda_ffi.py +++ b/tests/unit/probing/timing/test_timing_cuda_ffi.py @@ -19,7 +19,10 @@ class _FakeHandle: def test_symbol_returns_named_attribute(): handle = _FakeHandle() handle.cuStreamWaitValue32_v2 = "primary" - assert ffi._symbol(handle, "cuStreamWaitValue32_v2", "cuStreamWaitValue32") == "primary" + assert ( + ffi._symbol(handle, "cuStreamWaitValue32_v2", "cuStreamWaitValue32") + == "primary" + ) def test_symbol_uses_fallback_when_primary_missing(): diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..6185c4c4 --- /dev/null +++ b/uv.lock @@ -0,0 +1,2210 @@ +version = 1 +revision = 3 +requires-python = ">=3.7" +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.10.*'", +] +supported-markers = [ + "python_full_version >= '3.10'", +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "build" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and os_name == 'nt'" }, + { name = "importlib-metadata", marker = "python_full_version >= '3.10' and python_full_version < '3.10.2'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pyproject-hooks", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/21/6ec54248b4d0d51f12f3ca4aa77a128077d747a5db86cb5a2fcd9aedecbd/build-1.5.1.tar.gz", hash = "sha256:94e17f1db803ab22f46049376c44c8437c52090f0dfdf1adc43df56542d644fb", size = 112439, upload-time = "2026-07-09T06:21:59.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/f7/2c3f99ff9282f1c1ec9f6298f2c03034658a0901eeacb3b3501cb488574c/build-1.5.1-py3-none-any.whl", hash = "sha256:f1a58fe2e5af5b0238a07b9e70207492c79ddebbdb1ad954fc86d62a56be3e0d", size = 31195, upload-time = "2026-07-09T06:21:58.551Z" }, +] + +[[package]] +name = "cffi" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "python_full_version >= '3.10' and implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/e9/6d7724983b3d5a0908dbf74f64038ade77c18646ff6636ec7894fd392ce1/cffi-2.1.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:b65f590ef2a44640f9a05dbb548a429b4ade77913ce683ac8b1480777658a6c0", size = 183837, upload-time = "2026-07-06T21:32:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/69/aa/24580a278de21fd7322635556334d9b535f1cbc00b0a3919447cdf464c65/cffi-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164bff1657b2a74f0b6d54e11c9b375bc97b931f2ca9c43fcf875838da1570dd", size = 184226, upload-time = "2026-07-06T21:32:11.196Z" }, + { url = "https://files.pythonhosted.org/packages/88/a9/02cae418ec4beb282ace11958d9d4737793439d561fadc7e6d56f2e2b354/cffi-2.1.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:c941bb58d5a6e1c3892d86e42927ed6c180302f07e6d395d08c416e594b98b46", size = 211107, upload-time = "2026-07-06T21:32:12.328Z" }, + { url = "https://files.pythonhosted.org/packages/3b/30/c806937ed5e4c2c7ac30d9d6b76b5dc57ff8b75d83800d9bb11a8253cf2a/cffi-2.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a016194dbe13d14ee9556e734b772d8d67b947092b268d757fd4290e3ba2dfc2", size = 218733, upload-time = "2026-07-06T21:32:13.67Z" }, + { url = "https://files.pythonhosted.org/packages/f9/cf/398272b8bbfd58aa314fda5a7f1cdbb26d1d78ae324a11211521315dd1f0/cffi-2.1.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:03e9810d18c646077e501f661b682fbf5dee4676048527ca3cffe66faa9960dd", size = 205543, upload-time = "2026-07-06T21:32:15.148Z" }, + { url = "https://files.pythonhosted.org/packages/45/ca/f91641185cdd90c36d317a9dc7f85e88ef8682d8b300977baff5e23c35d8/cffi-2.1.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:19c54ac121cad98450b4896fa9a43ee0180d57bc4bc911a33db6cab1efab6cd3", size = 205460, upload-time = "2026-07-06T21:32:16.479Z" }, + { url = "https://files.pythonhosted.org/packages/38/66/04781a77b411f0bb5b234d62c1814754ab75ebe455ccff1b08e8d7aae98f/cffi-2.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d433a51f1870e43a13b6732f92aaf540ff77c2015097c78556f75a2d6c030e0", size = 218760, upload-time = "2026-07-06T21:32:17.98Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9a/bb1d5ed9c3fcae158e9f6391bf309c95d98c2ac37ed56573228471d0af5e/cffi-2.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d7f118b5adbfdfead90c25822690b02bc8074fba949bb7858bec4ebd55adb43", size = 221230, upload-time = "2026-07-06T21:32:19.407Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/3c1409cdd26094efacd1c36c66e0a6eb9d4296e4fd4f9901b8b2042f4323/cffi-2.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c5f5df567f6eb216de69be06ce55c8b714090fae02b18a3b40da8163b8c5fa9c", size = 213524, upload-time = "2026-07-06T21:32:20.828Z" }, + { url = "https://files.pythonhosted.org/packages/fa/75/74dfb7c3fc6ebbd408038476bd4c1d7e925c62614e7b9c534ecc34218288/cffi-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:11b3fb55f4f8ad92274ed26705f65d8f91457de71f5380061eb6d125a768fecd", size = 220341, upload-time = "2026-07-06T21:32:21.9Z" }, + { url = "https://files.pythonhosted.org/packages/70/b6/9003c33a3e7d2c1306f5962e646457dcfe5a8cd8fce6bbe02d7af25db783/cffi-2.1.0-cp310-cp310-win32.whl", hash = "sha256:9d72af0cf10a76a600a9690078fe31c63b9588c8e86bf9fd353f713c84b5db0f", size = 174578, upload-time = "2026-07-06T21:32:23.073Z" }, + { url = "https://files.pythonhosted.org/packages/8a/26/710688310447531c7a22f857c7f79d9855ec18b03e04494ced723fb37e2f/cffi-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb62edb5bb52cca65fab91a63afa7561607120d26090a7e8fda6fb9f064726da", size = 185071, upload-time = "2026-07-06T21:32:24.671Z" }, + { url = "https://files.pythonhosted.org/packages/d3/67/85c89a59ba36a671e79638f44d466749f08179266a57e4f2ffdf92174072/cffi-2.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc", size = 183845, upload-time = "2026-07-06T21:32:26.32Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dd/e3b0baa2d3d6a857ac72b7efbf18e32e487c9cdafcc13049ad765495b15e/cffi-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5bce581e6b8c235e566a14768a943b172ada3ed73537bb0c0be1edee312d4e7", size = 184186, upload-time = "2026-07-06T21:32:28.025Z" }, + { url = "https://files.pythonhosted.org/packages/65/68/9f3ef890cf3c6ab97bd531c5677f67613d302165d16f8142b2811782a614/cffi-2.1.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:30b65779d598c370374fefabf138d456fd6f3216bfa7bedfab1ba82025b0cd93", size = 211892, upload-time = "2026-07-06T21:32:29.565Z" }, + { url = "https://files.pythonhosted.org/packages/22/d7/1a74539db16d8bfd839ff1515948948efbb162e574650fd3d846896eea95/cffi-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88023dfe18799507b73f1dbb0d14326a17465de1bc9c9c7655c22845e9ddc3a2", size = 218793, upload-time = "2026-07-06T21:32:30.951Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d1/9a5b7169499e8e8d8e636de70b97ac7c9447104d2ff1a2cd94790cea5162/cffi-2.1.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0a96b74cda968eebbad56d973efe5098974f0a9fb323865bf99ea1fd24e3e64c", size = 205737, upload-time = "2026-07-06T21:32:32.216Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b0/e131a9c41f10607926278453d9596163594fe1c4ebc46efe3b5e5b34eb84/cffi-2.1.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a5781494d4d400a3f47f8f1da94b324f6e6b440a53387774002890a2a2f4b50f", size = 204909, upload-time = "2026-07-06T21:32:33.655Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d2/4398416cd699b35167947c6e22aca52c47e69ad5695073c9f1f2c52e04aa/cffi-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aa7a1b53a2a4452ada2d1b5dade9960b2522f1e61293a811a077439e39029565", size = 217883, upload-time = "2026-07-06T21:32:35.173Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a5/d4fe77b589e5e82d43ebc809bf2e6474afe8e48e32ea050b9357645b6471/cffi-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d8272c0e483b024e1b9ad029821470ed8ec65631dbd90217469da0e7cd89f1c", size = 221251, upload-time = "2026-07-06T21:32:36.527Z" }, + { url = "https://files.pythonhosted.org/packages/22/f0/a2fc43084c0433caf7f461bccc013e28f848d04ee1c5ed7fce71423cf4d9/cffi-2.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7762faa47e8ff7eb80bd261d9a7d8eea2d8baa69de5e95b70c1f338bbe712f02", size = 214250, upload-time = "2026-07-06T21:32:37.852Z" }, + { url = "https://files.pythonhosted.org/packages/04/8c/b925975448cf20634a9fbd5efceb807219db452653648d2897c0989cab2d/cffi-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89095c1968b4ba8285840e131bf2891b09ae137fe2146905acae0354fbce1b5e", size = 219441, upload-time = "2026-07-06T21:32:39.146Z" }, + { url = "https://files.pythonhosted.org/packages/eb/da/5c4918a2d61d86fa927d716cb3d8e4626ef8dc8f605a599d32f33897f59a/cffi-2.1.0-cp311-cp311-win32.whl", hash = "sha256:64c753a0f87a256020004f37a1c8c02c480e725f910f0b2a0f3f07debd1b2479", size = 174496, upload-time = "2026-07-06T21:32:40.467Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c8/6c2de1d55cf35ef8b92885d5ef280790f0fb9634d87ea1cc315176aecd61/cffi-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:4f26194e3d95e06501b942642855aed4f953d55e95d7d01b7c4483db3ecff458", size = 185113, upload-time = "2026-07-06T21:32:41.761Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4e/e8d7cb5783f1841a3c8fb3a7735838d7484d08ec08c9f984b14cac1ac0e9/cffi-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:35aaea0c7ee0e58a5cd8c2fd1a48fdf7ece0d2699b7ecdda08194e9ce5dd9b3d", size = 179927, upload-time = "2026-07-06T21:32:42.961Z" }, + { url = "https://files.pythonhosted.org/packages/1e/85/990925db5df586ec90beb97529c853497e7f85ba0234830447faf41c3057/cffi-2.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:df2b82571a1b30f58a87bf4e5a9e78d2b1eff6c6ce8fd3aa3757221f93f0863f", size = 184829, upload-time = "2026-07-06T21:32:44.324Z" }, + { url = "https://files.pythonhosted.org/packages/4b/92/e7bb136ad6b5352603732cf907ef862ca103f20f2031c1735a46300c20c9/cffi-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78474632761faa0fb96f30b1c928c84ebcf68713cbb80d15bab09dfe61640fde", size = 184728, upload-time = "2026-07-06T21:32:45.683Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c0/d1ec30ffb370f748f2fb54425972bfef9871e0132e82fb589c46b6676049/cffi-2.1.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d", size = 214815, upload-time = "2026-07-06T21:32:48.557Z" }, + { url = "https://files.pythonhosted.org/packages/1b/dc/5620cf930688be01f2d673804291de757a934c90b946dbdc3d84130c2ea4/cffi-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7", size = 222429, upload-time = "2026-07-06T21:32:49.848Z" }, + { url = "https://files.pythonhosted.org/packages/4b/a4/77b53abbf7a1e0beb9637edbef2a94d15f9c822f591e85d439ffd91519a6/cffi-2.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b", size = 210315, upload-time = "2026-07-06T21:32:51.221Z" }, + { url = "https://files.pythonhosted.org/packages/58/0c/f528df19cc94b675087324d4760d9e6d5bfae97d6217aa4fac43de4f5fcc/cffi-2.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7", size = 208859, upload-time = "2026-07-06T21:32:52.512Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/c9522a81c32132799a1972c39f5c5f8b4c8b9f00488a23feaa6c06f07741/cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66", size = 221844, upload-time = "2026-07-06T21:32:53.704Z" }, + { url = "https://files.pythonhosted.org/packages/6e/28/bd53988b9833e8f8ad539d26f4c07a6b3f6bcb1e9e02e7ca038250b3428d/cffi-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe", size = 225287, upload-time = "2026-07-06T21:32:54.907Z" }, + { url = "https://files.pythonhosted.org/packages/79/99/0d0fd37f055224085f42bbb2c022d002e17dde4a97972822327b07d84101/cffi-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b", size = 223681, upload-time = "2026-07-06T21:32:56.329Z" }, + { url = "https://files.pythonhosted.org/packages/b0/80/c138990aa2a70b1a269f6e06348729836d733d6f970867943f61d367f8cc/cffi-2.1.0-cp312-cp312-win32.whl", hash = "sha256:9b8f0f26ca4e7513c534d351eca551947d053fac438f2a04ac96d882909b0d3a", size = 175269, upload-time = "2026-07-06T21:32:57.777Z" }, + { url = "https://files.pythonhosted.org/packages/a8/eb/f636456ff21a83fc13c032b58cc5dde061691546ac79efa284b2989b7982/cffi-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:c97f080ea627e2863524c5af3836e2270b5f5dfff1f104392b959f8df0c5d384", size = 185881, upload-time = "2026-07-06T21:32:59.253Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/400ea43e721727dca8a65c4521390e9196757caba4a45643acb2b63271b8/cffi-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:6d194185eabd279f1c05ebe3504265ddfc5ad2b58d0714f7db9f01da592e9eb6", size = 180088, upload-time = "2026-07-06T21:33:02.278Z" }, + { url = "https://files.pythonhosted.org/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda", size = 194331, upload-time = "2026-07-06T21:33:03.697Z" }, + { url = "https://files.pythonhosted.org/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b", size = 196966, upload-time = "2026-07-06T21:33:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e9/45c3a76ad8d43ad9261f4c95436da61128d3ca545d72b9612c0ab5be0b1c/cffi-2.1.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a", size = 184795, upload-time = "2026-07-06T21:33:06.699Z" }, + { url = "https://files.pythonhosted.org/packages/84/4c/82f132cb4418ee6d953d982b19191e87e2a6372c8a4ce36e50b69d6ade4a/cffi-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea", size = 184746, upload-time = "2026-07-06T21:33:08.071Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db", size = 214747, upload-time = "2026-07-06T21:33:09.671Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f", size = 222392, upload-time = "2026-07-06T21:33:10.896Z" }, + { url = "https://files.pythonhosted.org/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d", size = 210285, upload-time = "2026-07-06T21:33:12.251Z" }, + { url = "https://files.pythonhosted.org/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0", size = 208801, upload-time = "2026-07-06T21:33:13.617Z" }, + { url = "https://files.pythonhosted.org/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224", size = 221808, upload-time = "2026-07-06T21:33:15.466Z" }, + { url = "https://files.pythonhosted.org/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c", size = 225241, upload-time = "2026-07-06T21:33:16.869Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a", size = 223588, upload-time = "2026-07-06T21:33:18.239Z" }, + { url = "https://files.pythonhosted.org/packages/c6/4b/e706f67279140f92939da3475ad610df18bfd52d50f14953a8e5fede71d5/cffi-2.1.0-cp313-cp313-win32.whl", hash = "sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2", size = 175248, upload-time = "2026-07-06T21:33:19.799Z" }, + { url = "https://files.pythonhosted.org/packages/5a/47/59eb7975cb0e4ef0afa764ea945b29a5bb4537a9f771cb7d6c8a5dd74c95/cffi-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512", size = 185717, upload-time = "2026-07-06T21:33:21.47Z" }, + { url = "https://files.pythonhosted.org/packages/5a/af/34fee85c48f8d94efc8597bc09470c9dd274c145f1c12e0fbc6ab6d38d74/cffi-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f", size = 180114, upload-time = "2026-07-06T21:33:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f0/81478e482afa03f6d18dc8f2afb5edc45b3080853b634b5ed91961be0998/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a", size = 194142, upload-time = "2026-07-06T21:33:23.657Z" }, + { url = "https://files.pythonhosted.org/packages/7d/95/8de304305cd9204974b0ca051b86d307cafca13aa575a0ef1b44d92c0d8c/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3", size = 196819, upload-time = "2026-07-06T21:33:25.007Z" }, + { url = "https://files.pythonhosted.org/packages/20/71/7c8372d30e42415602ed9f268f7cfd66f1b855fed881ecd168bcb45dbc0b/cffi-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1ff3456eab0d889592d1936d6125bbfbc7ae4d3354a700f8bd80450a66445d4d", size = 184965, upload-time = "2026-07-06T21:33:26.605Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5c/584e626835f0375c928176c04137c96927165cb8733cdb3150ec04e5ee5e/cffi-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c4165821e131d6d4ca444347c2b694e2311bcfa3fe5a861cc72968f28867beac", size = 184952, upload-time = "2026-07-06T21:33:27.823Z" }, + { url = "https://files.pythonhosted.org/packages/2e/d2/065fcae1c73979fac8e054462478d0ff8a29c40cdc2ed7ea5676a061df53/cffi-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6", size = 222353, upload-time = "2026-07-06T21:33:29.178Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a5/e8bbb1ce5b3ac2f53ad6a10bde44318a5a8d99d4f4a000d44a6e39aeb3e4/cffi-2.1.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913", size = 210051, upload-time = "2026-07-06T21:33:30.534Z" }, + { url = "https://files.pythonhosted.org/packages/28/ed/c127d3ac36e899c965e3361357c3befacd6578c03f40125183e41c3b219e/cffi-2.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d", size = 208630, upload-time = "2026-07-06T21:33:31.753Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d7/97d3136f81db489ec8d1d67748c110d6c994268fd7528014aa9f2b085e4e/cffi-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5", size = 221593, upload-time = "2026-07-06T21:33:33.044Z" }, + { url = "https://files.pythonhosted.org/packages/d3/27/93195977168ee63aed233a1a0993a2178798654d1f4bddcdd321d6fd3b21/cffi-2.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce", size = 225146, upload-time = "2026-07-06T21:33:34.224Z" }, + { url = "https://files.pythonhosted.org/packages/b3/c1/6dbd291ee2ae5a50a034aa057207081f545923bbf15dad4511e985aafff5/cffi-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326", size = 223240, upload-time = "2026-07-06T21:33:35.57Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/ade5ce9863a57992a6ea3d0d10d7e29b8749fc127204b3d493d667b2815f/cffi-2.1.0-cp314-cp314-win32.whl", hash = "sha256:1854b724d00f6654c742097d5387569021be12d3a0f770eae1df8f8acfcc6acd", size = 177723, upload-time = "2026-07-06T21:33:51.626Z" }, + { url = "https://files.pythonhosted.org/packages/41/de/92b9eeed4ae4a21d6fd9b2a2c8505cbed573299902ea73981cc13f7ff62c/cffi-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:1b96bfe2c4bd825681b7d311ad6d9b7280a091f43e8f63da5729638083cd3bfb", size = 187937, upload-time = "2026-07-06T21:33:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1a/cc6ae6c2913a03aab8898eee57963cf1035b8df5872ed8b9115fcc7e2be8/cffi-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:7d28dff1db6764108bc30788d85d61c876beff416d9a49cb9dd7c5a9f34f5804", size = 183001, upload-time = "2026-07-06T21:33:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/14/f0/134c00ce0779ec86dea2aa1aac69339c2741a8045072676763512363a2ea/cffi-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7ea6b3e2c4250ff1de21c630fe72d0f63eb95c2c32ffbf64a358cf4a8836d714", size = 188538, upload-time = "2026-07-06T21:33:36.792Z" }, + { url = "https://files.pythonhosted.org/packages/50/d8/3b86aba791cb610d24e8a3e1b2cd529e71fa15096b04e4d4e360049d4a4c/cffi-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6af371f3767faeffc6ac1ef57cdfd25844403e9d3f476c5537caee499de96376", size = 188230, upload-time = "2026-07-06T21:33:38.011Z" }, + { url = "https://files.pythonhosted.org/packages/14/d0/117dcd9209255ad8571fbc8c92ef32593a1d294dcec91ddc4e4db50606f2/cffi-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98", size = 223899, upload-time = "2026-07-06T21:33:39.514Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3d/f20f8b886b254e3ad10e15cd4186d3aed49f3e6a35ab37aab9f8f25f7c03/cffi-2.1.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13", size = 211652, upload-time = "2026-07-06T21:33:40.851Z" }, + { url = "https://files.pythonhosted.org/packages/28/3b/fad54de07260b93ddeef4b96d0131d57ea900675df1d410ae1deee52d7a6/cffi-2.1.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d", size = 210755, upload-time = "2026-07-06T21:33:42.183Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/3d5c705acb7abbba9bbd7d79b8e62e0f25b6120eb7ae6ac49f1b721722fe/cffi-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056", size = 223933, upload-time = "2026-07-06T21:33:43.603Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d0/47e338384ab6b1004241002fa616301020cea4fc95f283506565d252f276/cffi-2.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4", size = 226749, upload-time = "2026-07-06T21:33:45.046Z" }, + { url = "https://files.pythonhosted.org/packages/70/25/65bd5b58ea4bfdfc15cde02cb5365f89ef8ab8b2adfb8fe5c4bd4233382f/cffi-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94", size = 225703, upload-time = "2026-07-06T21:33:46.374Z" }, + { url = "https://files.pythonhosted.org/packages/dc/78/aa01ac599a8a4322533d45a1f9bc93b338276d2d59dabbe7c6d92a775c81/cffi-2.1.0-cp314-cp314t-win32.whl", hash = "sha256:7d034dcffa09e9a46c93fa3a3be402096cb5354ac6e41ab8e5cc9cd8b642ad76", size = 182857, upload-time = "2026-07-06T21:33:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/b9/26/d00496b22de4d4228f32dde94ad996f350c8aad676d63bcca0743c8dea4d/cffi-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0582a58f3051372229ca8e7f5f589f9e5632678208d8636fea3676711fdf7fe5", size = 194065, upload-time = "2026-07-06T21:33:48.953Z" }, + { url = "https://files.pythonhosted.org/packages/d5/dd/0c7dbf815a579ff005008a2d815a55d6bb047c349eef536d9dc53d3f0a8d/cffi-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:510aeeeac94811b138077451da1fb18b308a5feab47dd2b603af55804155e1c8", size = 186404, upload-time = "2026-07-06T21:33:50.309Z" }, + { url = "https://files.pythonhosted.org/packages/55/c7/8c8c50cb11c6750051daf12164098a9a6f027ac4356967fd4d800a07f242/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c", size = 194121, upload-time = "2026-07-06T21:33:56.109Z" }, + { url = "https://files.pythonhosted.org/packages/99/e2/67680bf19a6b60d2bb7ff83baefa2a4c3d2d7dc0f3277034b802e1fc504c/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001", size = 196820, upload-time = "2026-07-06T21:33:57.288Z" }, + { url = "https://files.pythonhosted.org/packages/ed/da/4bbe583a3b3a5c8c60892124fe17f3fa3656523faf0d3484eae90f091853/cffi-2.1.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:95f2954c2c9473d892eca6e0409f3568b37ab62a8eedb122461f73cc273476e3", size = 184936, upload-time = "2026-07-06T21:33:58.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4b/1f4c36ab273980d7aa75bb126ea4f8971f24a96108acad3a0a084028c57b/cffi-2.1.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:cdf2448aab5f661c9315308ec8b93f4e8a1a67a3c733f8631067a2b67d5913dc", size = 185045, upload-time = "2026-07-06T21:34:00.085Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c3/ad299dc38f3583f8d916b299f028af418a9ec98bc695fcbebeae7420691c/cffi-2.1.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699", size = 222342, upload-time = "2026-07-06T21:34:01.814Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d8/df4543cc087245044ed02ef3ad8e0a26619d0075ac7a77a12dc81177851b/cffi-2.1.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022", size = 210073, upload-time = "2026-07-06T21:34:03.255Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/fac738d73728c6cea2a88a2883dca54892496cbba88a1dc1f2909cb8a6f5/cffi-2.1.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0", size = 208551, upload-time = "2026-07-06T21:34:04.433Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/0b04a700dd64f465c93020253a793a82c9b4dff9961f48facd0df945d9b8/cffi-2.1.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1", size = 221649, upload-time = "2026-07-06T21:34:06.157Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/b7379a5704c79eda57ce075869ba70a0368d1c850f803b3c0d078d39dcaf/cffi-2.1.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28", size = 225203, upload-time = "2026-07-06T21:34:07.489Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/d5e6c43ea85c41bda2a184a3418f195fe7cf602967a8d2b94e085b83deef/cffi-2.1.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629", size = 223263, upload-time = "2026-07-06T21:34:08.712Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d8/772b8259bf75749adffb1c546828978381fb516f60cf701f6c83daf60c85/cffi-2.1.0-cp315-cp315-win32.whl", hash = "sha256:0a42c688d19fca6e095a53c6a6e2295a5b050a8b289f109adab02a9e61a25de6", size = 177696, upload-time = "2026-07-06T21:34:26.355Z" }, + { url = "https://files.pythonhosted.org/packages/2f/dd/afa2191fc6d57fedd26e5844a2fe2fcc0bbfa00961bbaa5a41e4921e7cca/cffi-2.1.0-cp315-cp315-win_amd64.whl", hash = "sha256:bccbbb5ee76a61f9d99b5bf3846a51d7fca4b6a732fe46f89295610edaf41853", size = 187914, upload-time = "2026-07-06T21:34:27.58Z" }, + { url = "https://files.pythonhosted.org/packages/05/ef/6cd4f8c671517162379dc79cfae5aea9106bc38abb89628d5c16adf6a838/cffi-2.1.0-cp315-cp315-win_arm64.whl", hash = "sha256:8d35c139744adb3e727cd51b1a18324bbe44b8bd41bf8322bca4d41289f48eda", size = 183004, upload-time = "2026-07-06T21:34:28.905Z" }, + { url = "https://files.pythonhosted.org/packages/11/b6/12fc55092817a5faa26fb8c40c7f9d662e11a46ee248c137aafc42517d92/cffi-2.1.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f9912624a0c0b834b7520d7769b3644453aabc0a7e1c839da7359f050750e9bc", size = 188378, upload-time = "2026-07-06T21:34:09.926Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2e/cdac88979f295fde5daa69622c7d2111e56e7ceb94f211357fbe452339e4/cffi-2.1.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:df92f2aba50eb4d96718b68ef76f2e57a57b54f2fa62333496d16c6d585a85ca", size = 188319, upload-time = "2026-07-06T21:34:11.101Z" }, + { url = "https://files.pythonhosted.org/packages/e0/27/1d0b408497e41a74795af122d7b603c418c5fed0171450f899afd04e594f/cffi-2.1.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d", size = 223904, upload-time = "2026-07-06T21:34:12.606Z" }, + { url = "https://files.pythonhosted.org/packages/8b/31/e115c985105dd7ffb32444505f18ceb874bb42d992af05d5dced7ecf1980/cffi-2.1.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8", size = 211554, upload-time = "2026-07-06T21:34:13.987Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/9e6e09409336d9e515c58367e7cfcf4f89df06ad25252675595a58eb59d5/cffi-2.1.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd", size = 210795, upload-time = "2026-07-06T21:34:15.972Z" }, + { url = "https://files.pythonhosted.org/packages/19/e5/d3cc82a4a0be7902af279c04181ad038449c096734464a5ae1de3e1401bd/cffi-2.1.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f", size = 223843, upload-time = "2026-07-06T21:34:17.509Z" }, + { url = "https://files.pythonhosted.org/packages/b9/65/b434abc97ce7cecc2c640fde160507c0ecc7e21544b483ba3325d2e2ea17/cffi-2.1.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc", size = 226773, upload-time = "2026-07-06T21:34:19.05Z" }, + { url = "https://files.pythonhosted.org/packages/b5/9f/d4dc66ca651eb1145a133314cda721abf13cfac3d28c4a0402263ae6ad75/cffi-2.1.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9", size = 225719, upload-time = "2026-07-06T21:34:20.576Z" }, + { url = "https://files.pythonhosted.org/packages/68/5a/e536c528bc8057496c360c0978559a2dc45653f89dd6151078aa7d8fca1a/cffi-2.1.0-cp315-cp315t-win32.whl", hash = "sha256:cb96698e3c7413d906ce83f8ffd245ec1bd94707541f299d0ce4d6b0193e982b", size = 182760, upload-time = "2026-07-06T21:34:22.059Z" }, + { url = "https://files.pythonhosted.org/packages/d3/0b/0ffe8b82d3875bced5fa1e7986a7a46b748262a40ab7f60b475eb9fb1bb3/cffi-2.1.0-cp315-cp315t-win_amd64.whl", hash = "sha256:f146d154428a2523f9cc7936c02353c2459b8f6cf07d3cd1ee1c0a611109c5d5", size = 193769, upload-time = "2026-07-06T21:34:23.589Z" }, + { url = "https://files.pythonhosted.org/packages/a0/17/1073b53b68c9b5ca6914adf5f8bf55aacc2d3be102418c90700160ea8605/cffi-2.1.0-cp315-cp315t-win_arm64.whl", hash = "sha256:cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210", size = 186405, upload-time = "2026-07-06T21:34:24.857Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "coverage" +version = "7.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/8b/adeb62ea8951f13c4c7fef2e7a85e1a06b499c8d8237ea589d496029e53f/coverage-7.15.0.tar.gz", hash = "sha256:9ac3fe7a1435986463eaa8ee253ae2f2a268709ba4ae5c7dd1f52a05391ad78f", size = 925362, upload-time = "2026-07-02T13:10:50.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/97/c52dc440c390b6cfa87be9432b141a956e2d56d9b9f5fc8bd71c5f471722/coverage-7.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50913d4bf5ddafa6ca3693da5e4dd833dd1b772e0283c99ca7f7d287db67331a", size = 220539, upload-time = "2026-07-02T13:08:19.252Z" }, + { url = "https://files.pythonhosted.org/packages/3f/26/602de8c2aec7e2e3e99ebfb8e04ba65598f746275396eea5f6794ff4673f/coverage-7.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:359e141ccd33893ce3f1ad5525f8b96083003677c82182e5907d62d4ea5799fc", size = 221058, upload-time = "2026-07-02T13:08:21.013Z" }, + { url = "https://files.pythonhosted.org/packages/fc/13/ebab0743138891c1d646d61e247ec29639afcbb6c4e1905e6a0f0c75291a/coverage-7.15.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3200b6204935f928c64b2ca1f923ab8c1acb7c9de45ec61569711b34d25cccaf", size = 247797, upload-time = "2026-07-02T13:08:22.474Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b7/b6ffb9e042aa48dc4144a8a65529affaec8dca0685309353614a2a7386ad/coverage-7.15.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:be616bf61346883b2cfdc5178669647e03531d81ab761a7e378558b7e8bcb628", size = 249626, upload-time = "2026-07-02T13:08:23.803Z" }, + { url = "https://files.pythonhosted.org/packages/9c/06/243ff05b652333d8e3d060c11223efc2723b19cacf6605e433fa686ab5d4/coverage-7.15.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc7bafc3fe1059463a8fdd97ca79972d6e2bf819d775c7d54991b5b1971201d6", size = 251493, upload-time = "2026-07-02T13:08:25.397Z" }, + { url = "https://files.pythonhosted.org/packages/d3/2b/867faa17030a806114dae388b32a3fa929d8cd4bf39226fbc11f6e6bb705/coverage-7.15.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b713aa7fcf325a01d4184d848acb46fd84f78fdb0978470c636b23a06a753d91", size = 253406, upload-time = "2026-07-02T13:08:26.842Z" }, + { url = "https://files.pythonhosted.org/packages/94/c0/d789ce18f6605afc4895db75723424be2ef494282f77f61d8e5832923183/coverage-7.15.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e38e6fba2d56652fdfaf0231f8f78aeb805234a912de25dc291ee5cce5b8faa4", size = 248512, upload-time = "2026-07-02T13:08:28.398Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b6/b2673c30739f4a2e06649a0a38ad8b093c4d865462dc7bab0e9524a2c3b1/coverage-7.15.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:884499f42e382675be80770391983b90e0c0c774d87dbeeebf5f991cf6612b20", size = 249532, upload-time = "2026-07-02T13:08:29.731Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/acd79e9a41beabee92b623afe4f30b549916f48566271475f2907e752828/coverage-7.15.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:840481b12e083dbcbafab14794a8781a958edf327c8d3d70b4eee42f9b8253aa", size = 247537, upload-time = "2026-07-02T13:08:31.173Z" }, + { url = "https://files.pythonhosted.org/packages/12/d4/2d301c4d1b3238d7c88b70ab9d13fd53ed9505662a7ff1b46ba1e2e4e3c3/coverage-7.15.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:276646e9481703d09f854f3b2f018f24e19fd7049ae670a92570043eb97203b1", size = 251348, upload-time = "2026-07-02T13:08:32.63Z" }, + { url = "https://files.pythonhosted.org/packages/35/bb/c67708b2bc00f32e12805ec23d5fa677a0a51652f449341a89f9d6b1b715/coverage-7.15.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4de4b4d3f5545aa6c60dc4efd9c63b5b5dcc3bf00fe83146b2bdfffb8f6613bd", size = 247806, upload-time = "2026-07-02T13:08:33.931Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6c/57c4f653c47a6e917748f8938e389e72fbcae44e3643cd906664f0477a13/coverage-7.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5c504097b2a89b1e85bc6070d920df77daec701337e3aeef2c17775a5dd0ca90", size = 248410, upload-time = "2026-07-02T13:08:35.189Z" }, + { url = "https://files.pythonhosted.org/packages/6c/94/bb083041aef828903668f134273f319f2bd49224962875359c52faa5497f/coverage-7.15.0-cp310-cp310-win32.whl", hash = "sha256:f6e80ed91f98316e86b9c137206b04b2bcfbffccbdff49bd2eb09dddb1cf14e0", size = 222588, upload-time = "2026-07-02T13:08:36.486Z" }, + { url = "https://files.pythonhosted.org/packages/ef/94/a09d8ee618956f626741b0734854bac4425a00e10c0565f5abca64e7e751/coverage-7.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:b3b3e22030f3f6f5e01a5ce69936552a5c0f6992b7698777377b99041961031f", size = 223214, upload-time = "2026-07-02T13:08:37.885Z" }, + { url = "https://files.pythonhosted.org/packages/ae/23/82e910835ef4b8391047025e1d53aa48d66029f444eb8b25373c849bf503/coverage-7.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:003fff99412ea848c0aaebcc78ed2b6ce7d8a1227ed17e68470672770b78a02a", size = 220662, upload-time = "2026-07-02T13:08:39.205Z" }, + { url = "https://files.pythonhosted.org/packages/6d/0d/c7b213dde2f1579de5231062b386d8413f79c11667eb58c39319b25991da/coverage-7.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5cbd804bf2784ce7b45114516050f346ecd50f960c4bb630a7ee9e1d78fa2118", size = 221168, upload-time = "2026-07-02T13:08:40.471Z" }, + { url = "https://files.pythonhosted.org/packages/33/77/d000aeedfac085088337b3c7becdad328474b1f8a9e4c9368a0c99605d68/coverage-7.15.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8773e15c23305b58882a4611fb9b2755977eae0dc2e515366a1b6c98866cc4c2", size = 251587, upload-time = "2026-07-02T13:08:42.033Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e0/86787c56b9df17afd370d5e293515dd4d9a107a561d13054873eefad8ecc/coverage-7.15.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f50e40081494c1dc4239ebb202014cbcc3306ea96fb6302a34c8cc0967fc5ae8", size = 253497, upload-time = "2026-07-02T13:08:43.387Z" }, + { url = "https://files.pythonhosted.org/packages/3f/02/181bc917359299c07dead6270f94e411151c8b60cec905c33499da69afe6/coverage-7.15.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daf96f37f5fc3a7b6c6da862eb4aee61c426bd63da236ed4a73ef0e503b4bca5", size = 255607, upload-time = "2026-07-02T13:08:44.897Z" }, + { url = "https://files.pythonhosted.org/packages/b9/35/ca5e7427699913da6788c4f910e73ab16c5f4b59ec5d3a999dce2a45112f/coverage-7.15.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:51aa20f6ae2788fd197747766edf4cd8234fd9423309b934257fa6b21a592723", size = 257563, upload-time = "2026-07-02T13:08:46.334Z" }, + { url = "https://files.pythonhosted.org/packages/0b/4d/b8220bacc2fc3c4e9078e27c32e99fb411479a4718a72bdd00036a9891c8/coverage-7.15.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03d1f922757662eb7af586e77834792274cff776bc7b1d1a0b66a49ea9d84735", size = 251726, upload-time = "2026-07-02T13:08:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/c4/e4/2e145da1991d72189b9c3cf7eca05c716ee7080d099aaea6757cfc7df008/coverage-7.15.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a6d6acc9a7666245e6133dd15144ca038a85a9cd5026bb06d6bbae9e77440dc9", size = 253301, upload-time = "2026-07-02T13:08:49.5Z" }, + { url = "https://files.pythonhosted.org/packages/72/28/d2c841d698bf762e481f08bd4839d370246b6d9b61dab085a7b20b201a08/coverage-7.15.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1ac2c4c27c7df851dc9a017c2d7de00b69147e84ba3d96f37a530b0b6fb51035", size = 251361, upload-time = "2026-07-02T13:08:51.304Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ed/55d9ffde994fba3897c0c783f77a7d053b0c18787f6892ed5b0aed73f469/coverage-7.15.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b761a1d504fd4bd1f20f418753964dca9f5862a511fc854dac58296b3b223671", size = 255129, upload-time = "2026-07-02T13:08:52.661Z" }, + { url = "https://files.pythonhosted.org/packages/1d/c0/ecbf33b8c460ea2718aeb813e2df8140d0370e5f67261c31524ceb0a2a8d/coverage-7.15.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:e43b045e11c16e897895758ae90e4a90cf99e93d58549e2f90c0e2272e155695", size = 251081, upload-time = "2026-07-02T13:08:54.188Z" }, + { url = "https://files.pythonhosted.org/packages/a9/de/fb87b4261f54448dd2b9504ef19a58be42cef0d9520595fbfe1219b15234/coverage-7.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:589b54513e901739f4b4582c705ce96b80c96f57641b1464607e2367a270e540", size = 251988, upload-time = "2026-07-02T13:08:55.726Z" }, + { url = "https://files.pythonhosted.org/packages/df/27/3494d5f291b9a4cb868f73c11221a8bd2d5bd761a8f9acea61ff57128dd1/coverage-7.15.0-cp311-cp311-win32.whl", hash = "sha256:106781b8482749162d0b47056937ba0933508e5d9447f65a5e7d5c422f0d6bb4", size = 222754, upload-time = "2026-07-02T13:08:57.091Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ee/cd4847ebc9be6a9c0123d763645a6f1f3be6b8c58c962706368b79cbac07/coverage-7.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:821e92b3631d762a339695824cadbbc73020354eba2a23a551a99ad34938fbe6", size = 223225, upload-time = "2026-07-02T13:08:58.594Z" }, + { url = "https://files.pythonhosted.org/packages/57/37/5011581aa7f2be498b97dcc7c9902192442a42f4f9a748aeadb3d6506b42/coverage-7.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:309990eb5fb8014b9f67cb211f7fd41876ec8a88a88d3ae76de0ed1d611e3640", size = 222774, upload-time = "2026-07-02T13:09:00.074Z" }, + { url = "https://files.pythonhosted.org/packages/2a/74/fd4c0901137c4f8d81a76ada99e43c65163b4c94a02ece107a4ec0c6b615/coverage-7.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b75ee5e8cb7575636ac598719b4307ac529ec8fcd79608a35c3cd4d4dada812d", size = 220838, upload-time = "2026-07-02T13:09:02.084Z" }, + { url = "https://files.pythonhosted.org/packages/0f/2e/2347583467bd7f0402635101a916961915cc68fce652cd0db5f173ea04fc/coverage-7.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffb31267816b93b075302248cc1737506081b4f163df4401e9df1a6424aafabe", size = 221197, upload-time = "2026-07-02T13:09:03.617Z" }, + { url = "https://files.pythonhosted.org/packages/f0/17/99fa688541ae1d6e84543a0e544f83de0c944815b63e9e7b1ed411d15036/coverage-7.15.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e4d0bb73455bf97ab243a8f12c37c686ccf1c13bb614b7b85f1d062f06f42b2c", size = 252705, upload-time = "2026-07-02T13:09:05.059Z" }, + { url = "https://files.pythonhosted.org/packages/fb/02/6a95a5cd83b74839017ef9cf48d2d8c9ae60af919e17a3f336e6f9f1b7bd/coverage-7.15.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:20d9ccc4ebd0edc434d86dfd2a1dd2a8efa6b6b3073d0485a394fee86459ebb4", size = 255441, upload-time = "2026-07-02T13:09:06.559Z" }, + { url = "https://files.pythonhosted.org/packages/67/f2/406f6c57d600f68185942422c4c00f1a3255d60aee6e5fd961425cd9987e/coverage-7.15.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20c8a976c365c8cb12f0cbd099508772ea41fb5fa80657a8506df0e11bd278c5", size = 256556, upload-time = "2026-07-02T13:09:08.197Z" }, + { url = "https://files.pythonhosted.org/packages/74/8e/d3fa48489c15ecdec1ba48fd61f68798555dddd2f6716f9ad42adeb1a2a9/coverage-7.15.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f948fd5ba1b9cbca91f0ae08b4c1ce2b139509149a435e2585d056d57d70bf01", size = 258815, upload-time = "2026-07-02T13:09:09.691Z" }, + { url = "https://files.pythonhosted.org/packages/47/2e/2d40ddd110462c6a2769677cf7f1c119a52b45f568978fc6c98e4cc0dd0f/coverage-7.15.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f58185f06edf6ad68ec9fb155d63ef650c82f3fbd7e1770e2867751fb13158f4", size = 253117, upload-time = "2026-07-02T13:09:11.212Z" }, + { url = "https://files.pythonhosted.org/packages/51/c0/310782f0d7c3cb2b5ac05ba8d205fe91f24a36f6bf3256098f1782181c38/coverage-7.15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02adc79a920c73c647c5d117f55747df7f2de94571884758ce8bc58e04f0a796", size = 254475, upload-time = "2026-07-02T13:09:13.029Z" }, + { url = "https://files.pythonhosted.org/packages/86/f7/702da6c275f8ae6ade423d2877243122932c9b27f5403003b9ef8c927d12/coverage-7.15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6eb7c300fbed667fd6e3588eba71c1904cdb06110ca6fdf908c26bdd88b8e382", size = 252619, upload-time = "2026-07-02T13:09:14.699Z" }, + { url = "https://files.pythonhosted.org/packages/fb/84/c5b15a7e5ecba4e56218d772d99fe80a63e63f8d11f12783723a6005ab45/coverage-7.15.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b5fb23fa2de9dce1f5c36c09066d8fcda16cd96e8e26686caa2d7cb9b567d65c", size = 256689, upload-time = "2026-07-02T13:09:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/95/2f/c8b07559b57701230c61b23a953858c052890c12ef568d81780c6c46e92e/coverage-7.15.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cec79341dbe6281484024979976d0c7f22beae08b4a254655decd25d42cbe766", size = 252189, upload-time = "2026-07-02T13:09:17.828Z" }, + { url = "https://files.pythonhosted.org/packages/6b/80/6d2f049dd3fd3dbfd60b62ba6b2162a04009e2c002ce70b24cf3878dec7a/coverage-7.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c664c5444b1d970b1b2a450e21fb19ee5c9cfdf151ded2dda37260031cca0da", size = 254059, upload-time = "2026-07-02T13:09:19.304Z" }, + { url = "https://files.pythonhosted.org/packages/ce/92/b0287a2c42031d25c628f815f89a3cd9f8268ee78bb1252c9356cda1c689/coverage-7.15.0-cp312-cp312-win32.whl", hash = "sha256:5f764a3fa339bde6b3aa97657f5a6a3a9451e4a5b4ea98a2892c773a43525f77", size = 222893, upload-time = "2026-07-02T13:09:20.812Z" }, + { url = "https://files.pythonhosted.org/packages/a9/69/e34c481915fecb499b3146975061dac528752e37706edc1804f32c822469/coverage-7.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:52f9a4d2c4c56c8848bc2f524916698354b0211488b38c49ad9ae54f6cafbff6", size = 223429, upload-time = "2026-07-02T13:09:22.315Z" }, + { url = "https://files.pythonhosted.org/packages/fe/98/6e878f0b571d32684ef3f38d7c03db241ca5b82a5da8a5391596a8f209c4/coverage-7.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:31e5c3e70c85307ea35a12964e2e40f56ca2ee4b1c8c721ccf4609d17071080b", size = 222810, upload-time = "2026-07-02T13:09:23.812Z" }, + { url = "https://files.pythonhosted.org/packages/76/04/145a3748098bcc86b631a85408d2c3dc5c104e0bd86d605468239b25b6c4/coverage-7.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5be4caf3b28836f078abe700f8944dac4a65d78f16d6c600c89cb624e5535782", size = 220863, upload-time = "2026-07-02T13:09:25.371Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5c/4ed55708fed2c64b63c9bc5715daef670872202101938869b7fe5d5fbb8f/coverage-7.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dd58ad1404704303ca8d4f4b8a1095e7cbc7040ef17a66df1e6619aa10176430", size = 221230, upload-time = "2026-07-02T13:09:26.897Z" }, + { url = "https://files.pythonhosted.org/packages/7b/19/3a80b97d3b2a5c77a01ae359c6bed20c13738fe3d9380f08616d4fec0281/coverage-7.15.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bbcbb317c2e5ded5b21104af81c29f391be2af98d065693ffbe8d23949b948e5", size = 252227, upload-time = "2026-07-02T13:09:28.543Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fa/b70062750686bd7da454da27927622f48bbac6990ac7a4c4a4653e7b0036/coverage-7.15.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:27f31ecb458da3f859aab3f15ada871eb7a7768807d88df4a9f186bb17737970", size = 254823, upload-time = "2026-07-02T13:09:30.177Z" }, + { url = "https://files.pythonhosted.org/packages/a9/09/dad6a75a2e561b9dc5086a8c5257a7591d584246f67e23e70d2995b89ab6/coverage-7.15.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fb759be317fdc62e0f56bffdf61cfcb45c7761ad6b71e3e583e71a67ae753c", size = 256059, upload-time = "2026-07-02T13:09:31.979Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e7/b5d2941fa9564573d44b693a871ff3156f0c42cbefe977a09fa7fdc59971/coverage-7.15.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5cf007add5ab4bb8fa9f4c77e3732127c9e6cad501d7db43355fbfafca0be84", size = 258190, upload-time = "2026-07-02T13:09:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/7c/1d/8e895bcde3c57ccd46d896dda5f2b3d5df761a1b0c6c9d450d175dedc632/coverage-7.15.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc78d9843bd576fbe2118248258d485e968dc535f95ed504a7b0867ba9b51389", size = 252456, upload-time = "2026-07-02T13:09:35.765Z" }, + { url = "https://files.pythonhosted.org/packages/14/4c/f6997da343ddeb959be82c3b05322793f92c071ad45f7cb8a96336e2dd5f/coverage-7.15.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a263060f1de0b4b74b4e089c2a70b8003b3781c733329a9c8fd54995328f9950", size = 254192, upload-time = "2026-07-02T13:09:37.445Z" }, + { url = "https://files.pythonhosted.org/packages/17/27/a0bc09d032267b9da89d95a2d874cfbef2a5aebbf0e87cf7aba221d79a99/coverage-7.15.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c48decf16e0dfd5b049c7d5e82200c23c08126719142998d4f172444e3d0529e", size = 252153, upload-time = "2026-07-02T13:09:39.422Z" }, + { url = "https://files.pythonhosted.org/packages/54/c0/77fc233d9fba07b244c40948c53fe27308b8f21732fb3417f87fbd6fd992/coverage-7.15.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:08fb028000ed0aaa0a4cbdfbb98be7cb42f370db973fbbb469733505ab20e13e", size = 256310, upload-time = "2026-07-02T13:09:41.006Z" }, + { url = "https://files.pythonhosted.org/packages/d5/24/601cecfb5825becacb8d45219a018a3b55b9dbaec624efdb0ea249d08be2/coverage-7.15.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb7dc0c3b7d8a1077abea0b8546ebc5e26d6ef6ecefc2f0f5ad2b8a53bdad837", size = 251974, upload-time = "2026-07-02T13:09:42.733Z" }, + { url = "https://files.pythonhosted.org/packages/47/1e/6f45e5a5b3d5484318d368702af6716b5ab8913b0428bec981a562fcf296/coverage-7.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cb3602054ccbe9f0d8c2dc04bbeba90d5719236e2cd06e042ddd6d3fc7b6e37", size = 253745, upload-time = "2026-07-02T13:09:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/8e/db/4df027a77bd11d0e527f44c53557c76e54ad027413d0304252ea3a78d67e/coverage-7.15.0-cp313-cp313-win32.whl", hash = "sha256:0bf781da64326b677be344df505171435b6f58716108606621d5d27d964fff8b", size = 222902, upload-time = "2026-07-02T13:09:46.122Z" }, + { url = "https://files.pythonhosted.org/packages/a0/10/0355894d34e231f2c5449e71287e81a50793a325df2e2b027b7bcd9dfd19/coverage-7.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:2c57a275078ee3fa185f83e400f765bc764a549de66d99b47881645cbd4ea629", size = 223444, upload-time = "2026-07-02T13:09:47.687Z" }, + { url = "https://files.pythonhosted.org/packages/06/ef/bb725f263befaaff851203ab338e68af15e195d7f7b5f323162532d9b6a8/coverage-7.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:3812c61afc6685c7999b39320779ab8f43b7a3081fdb0def39976e56fbdb9a21", size = 222839, upload-time = "2026-07-02T13:09:49.717Z" }, + { url = "https://files.pythonhosted.org/packages/4f/9c/1e3ca54f72a3185ece06c58d871099898c48f0ed6430d17b6ab75f0d180a/coverage-7.15.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:41cb79af843222e11da87127ad0ecbfa878abadd0f770a4a99391a27d3887324", size = 220906, upload-time = "2026-07-02T13:09:51.339Z" }, + { url = "https://files.pythonhosted.org/packages/09/37/f718613d83b274880382f6b67e78f3802549ae39b0b3e65ae5b5974df56e/coverage-7.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7d2008989ef8fe54188d3f3bfa2e3099b025af11e90a6a1b9e7dc433d04263d8", size = 221239, upload-time = "2026-07-02T13:09:53.138Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ce/22bae91e0b75445f68d365c7643ed0aa4880bbf77450ee74ca65bdae53a7/coverage-7.15.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:769e8ece11a596315ebf5aa7ec383aeeed016c091d2bf6363ffb996d41529092", size = 252286, upload-time = "2026-07-02T13:09:54.996Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1e/bec5e32aa508615d9d7a2790effb25fb4dc28606e995816afe400b25ece3/coverage-7.15.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:65a6b6164ee5c39e2f3803f314292d6c61a607ba7fee253d1e03c42dc3903502", size = 254789, upload-time = "2026-07-02T13:09:56.678Z" }, + { url = "https://files.pythonhosted.org/packages/17/29/0e865435b4354e4a7c03b1b7920046d31d0a273d55decefea27e011cb9bf/coverage-7.15.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75128817f95a5c45bb01d65fd2d8b9cb54bbe03d81608fb70e3e14b437ad56c2", size = 256135, upload-time = "2026-07-02T13:09:58.343Z" }, + { url = "https://files.pythonhosted.org/packages/84/ff/33a870b58a13325d62fc0a6c8f01fa0ff667cef60c7498e2382a147dfa18/coverage-7.15.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9887bb428fe2d4cd4bee89bac1a6c9932f484afd5b36fbd4ff6ea5f825bb1f5e", size = 258449, upload-time = "2026-07-02T13:10:00.057Z" }, + { url = "https://files.pythonhosted.org/packages/18/7b/6fffe596bf3ddba8462758d02c5dad730fd91055a6634aa2e4226229181a/coverage-7.15.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0bfc0be1f702042207a93a00523b1065ee1fe951e96edf311581c0bbc2e34888", size = 252313, upload-time = "2026-07-02T13:10:01.946Z" }, + { url = "https://files.pythonhosted.org/packages/58/1b/11468dd6c1676ab831a70cb9a8d4e198e8607fa0b7220ab918b73fe9bfbd/coverage-7.15.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f64627d55def5a43282d70e08396672692f77e4da610a5bb8bb4060b432b6859", size = 254142, upload-time = "2026-07-02T13:10:04.065Z" }, + { url = "https://files.pythonhosted.org/packages/79/41/29328e21d16b1b95092c30dd700e08cf915bd3734f836df8f3bdb0e8fa9f/coverage-7.15.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2c6f0fa473003905c6d5bac328ee4eba9fbea654f15bc24b8a3274b23363fa99", size = 252108, upload-time = "2026-07-02T13:10:06.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/de/05ccfb990439655b35afbfd8e0d13fe66677565a7d4eb38c3f5ef2635e1c/coverage-7.15.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2bcf9afaf064172c6ec3c58a325a9957ad1178c05dd934e25f253321776e0676", size = 256385, upload-time = "2026-07-02T13:10:08.141Z" }, + { url = "https://files.pythonhosted.org/packages/51/0e/486828a3d2695ea7a2609f17ff572f6b01905e608379440a11da4b8dffbe/coverage-7.15.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:baf06bc987115d6fb938d403f7eab684a057766c490367999a2b71a6883110c6", size = 251923, upload-time = "2026-07-02T13:10:10.179Z" }, + { url = "https://files.pythonhosted.org/packages/18/c7/03582b6715f078e5e558354c87616d945b9894cda2dace8e4009b17035e4/coverage-7.15.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f0405f2ff97b1c4c0e782cb32e02f32369bcf2e6b618b591d67e1ea754575dfe", size = 253580, upload-time = "2026-07-02T13:10:12.052Z" }, + { url = "https://files.pythonhosted.org/packages/db/dc/9e578bbaf2ecb4959a81b7e7601ad8cca772cba2892e8d144cb749b4a71a/coverage-7.15.0-cp314-cp314-win32.whl", hash = "sha256:ab282853ed5fbd64bbb162f19cb8fcb7087187508a6374b4f9c34ec1577c4e8f", size = 223107, upload-time = "2026-07-02T13:10:13.994Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3e/c8c3b75d8dbe0e35f7b0cc3ff5e949fc59500f70b21d0398813f66740664/coverage-7.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:3bb3040e9f4bbe26fcb0cd7cc85ac63e630d3f3a9c74f027abf4caa27e706663", size = 223597, upload-time = "2026-07-02T13:10:15.906Z" }, + { url = "https://files.pythonhosted.org/packages/cd/bc/3cbc9fb036eb388519bccd521f783499c39b64256013fbc362782f196fe1/coverage-7.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:346771144d34f7fa84ec28386f78e0f31653f33cf35e19d253d5b35f9e8201da", size = 223020, upload-time = "2026-07-02T13:10:17.844Z" }, + { url = "https://files.pythonhosted.org/packages/28/00/199c4a8d656dff63102577a056c0fce2ff6a79e40adac092fc986c49cbf1/coverage-7.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d34a010905fb6401324ba016b5da03d574967f7b21ce48ea41e66f0f1f95f641", size = 221638, upload-time = "2026-07-02T13:10:19.703Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8e/9d0092c96a3d3a26951ecc7020826aa57bcb1b119ca81acbba996884ab13/coverage-7.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bb25d825d885ca8036795dacfc3924d33091fc76d71ebc99420c6b79e77d96fa", size = 221903, upload-time = "2026-07-02T13:10:21.514Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b4/c0ca3028f42c9a08e51feb4561ef1192e5de99797cd1db5b04590c215bda/coverage-7.15.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:94c9686bfe8a9a6810297aecbd99beaa3445f9e8dc2f80b1382cca0d86b64461", size = 263267, upload-time = "2026-07-02T13:10:23.261Z" }, + { url = "https://files.pythonhosted.org/packages/5f/aa/a375e3846e5d3c013dc600b2a3231089055c73d77f5393dd2192a8d64da6/coverage-7.15.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9bd671c25f9d85f09d7ec481d0e43d5139f486c06a37139847a7ce569788af72", size = 265390, upload-time = "2026-07-02T13:10:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/92/e1/5783cdabb797305e1c9e4809fea496d31834c51fa772514f73dc148bcfc9/coverage-7.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:110cbdf8d2e216577312cf06ccf85539c0e5a5420ef747e4a4719b5e483c88cd", size = 267811, upload-time = "2026-07-02T13:10:27.249Z" }, + { url = "https://files.pythonhosted.org/packages/85/31/96d8bbf58b8e9193bc8389574a91a0db48355ee98feb66aa6bf8d1b32eea/coverage-7.15.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c5d4619214f1d9993e7b00a8600d14614b7e9d84e89507460b126aa5e6559e5", size = 268928, upload-time = "2026-07-02T13:10:29.242Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7a/5294567e811a1cb7eda93140c628fa050d66189da28da320f93d1d815c73/coverage-7.15.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:781a704516e2d8346fbbd5be6c6f3412dd824785146528b3a01816f26c081007", size = 262378, upload-time = "2026-07-02T13:10:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/69/3f/3f48538421f899f28946f90a3d272136a4686e1abf461cc9249a783ee0f3/coverage-7.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd4a1b44bcb65ee29e947ac92bbee04956df3a6bfc6143641bb6cae7ede00fc9", size = 265263, upload-time = "2026-07-02T13:10:32.942Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d3/092df15efcab8a9c1467ee960eb8019bbad3f9300d115d89ea6195f369ff/coverage-7.15.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0e4950c9d6d3e39c64c991814ff315e2d0b9cb8152363594212c9e55208c0a8f", size = 262866, upload-time = "2026-07-02T13:10:35.104Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ab/0254d2b88665efb2c57ad368cc77ab5de3435bd8d5add4729c1b0e79431e/coverage-7.15.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:fe9c87ff42e5472d80d21704972e1f96e104a0a599d77c5e35db5a3c562e2571", size = 266599, upload-time = "2026-07-02T13:10:37.05Z" }, + { url = "https://files.pythonhosted.org/packages/a8/79/1cfa4023e489ce6fbc7be4a5d442dbc375edb4f4fda39a352cedb53263c2/coverage-7.15.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f00d5ae1dd2fe13fb8186e3e7d37bcbd8b25c0d764ff7d1b32cef9be058510a8", size = 261714, upload-time = "2026-07-02T13:10:38.966Z" }, + { url = "https://files.pythonhosted.org/packages/b7/eb/fee5c8665656be63f497418d410484637c438172568688e8ac92e06574e7/coverage-7.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:363ab38cc78b615f11c9cac3cf1d7eef950c18b9fdedfb9066f59461dcf84d68", size = 264025, upload-time = "2026-07-02T13:10:40.789Z" }, + { url = "https://files.pythonhosted.org/packages/ab/99/63005db722f91edc81abc16302f9cc2f6228c1679e46e15be9ae144b14d0/coverage-7.15.0-cp314-cp314t-win32.whl", hash = "sha256:54fd9c53a5fafff509195f1b6a3f9be615d8e8362a3629ff1de23d270c03c86b", size = 223413, upload-time = "2026-07-02T13:10:42.597Z" }, + { url = "https://files.pythonhosted.org/packages/c1/e8/2bc6181c4fb06f1a6b981eb85330cc57bfad7e3f710fc9c9d350013ba228/coverage-7.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:87b47553097ba185ed964866078e7e63adea9f5f51b5f39691c34f30afd21080", size = 224245, upload-time = "2026-07-02T13:10:44.47Z" }, + { url = "https://files.pythonhosted.org/packages/79/b8/4d959bf9cc45d0cfed2f4d35cafcab978cdb6ea02eb5100009cd740632a3/coverage-7.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aeefb2dd178fe7eee79f0ad25d75855cb35ee9ed472db2c5ea06f5b4fd00cec5", size = 223558, upload-time = "2026-07-02T13:10:46.368Z" }, + { url = "https://files.pythonhosted.org/packages/52/30/21b2ad45959cd50e909e02ebac1e30b4ceb7162e91c11d4c570223a458b7/coverage-7.15.0-py3-none-any.whl", hash = "sha256:56da6a4cbe8f7e9e80bd072ca9cefe67d7106a440a7ec06519ec6507ac94ad19", size = 212632, upload-time = "2026-07-02T13:10:48.641Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version >= '3.10' and python_full_version <= '3.11'" }, +] + +[[package]] +name = "cuda-bindings" +version = "13.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-pathfinder", marker = "(python_full_version == '3.10.*' and sys_platform == 'emscripten') or (python_full_version == '3.10.*' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/21/8464d133752951c154feafb3b65c297e7d80f301183d220bec4c830f1441/cuda_bindings-13.3.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:120fcc53d57903df529c3486962c56528cba5b7d6c57c99537320ed9922c8b86", size = 6073403, upload-time = "2026-05-29T23:11:36.22Z" }, + { url = "https://files.pythonhosted.org/packages/a8/1f/5ef51f5fbaa5d4d3201bb3d7555af028ec1aa4416275ccbf73c9e34e3d2d/cuda_bindings-13.3.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9851b0caa8bfd3bc6fa054eaf57bea7c8e9c3a62db2d2621224677f49f3c53d0", size = 6675244, upload-time = "2026-05-29T23:11:38.664Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/457ca12dad3ee9bfcc9a545cfd6b64b359ba49de40f776f6e028e678f262/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5879712accf6e14bb01aa5e67440eb84998b8d104b509cc7a6dc0b8f656a474", size = 6053539, upload-time = "2026-05-29T23:11:43.19Z" }, + { url = "https://files.pythonhosted.org/packages/95/7a/c5e3c34a409b148f5c0f5a4ea374158f95d488862c1dffedf9aa5c639df9/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04436a9364059c84b8f9636f359eccda1cf814341f5b670c71d80d2f79dbc708", size = 6674166, upload-time = "2026-05-29T23:11:45.478Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/5e7dba1ba576dd73da5dee894ca076ca5e959450dfff66d6d510a255d1f7/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7855c4868aabc0cfae28abbe83d56734bdfbd08f08fc234ac1912a12858bf49", size = 6025351, upload-time = "2026-05-29T23:11:49.685Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/6d2e9047d1fb243dbaa364b01e0297534b9ed7fd27dba1c9f361519cf69b/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e32d08f71ebcdf00f0f41eab2eb37e8da94c8ed411cc9f7f7a019ce6b34abe3a", size = 6657965, upload-time = "2026-05-29T23:11:52.227Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/2394f8163360f8391f8f1b7e72d300a82724edb81a7b7084c799fbd4c91f/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9efb21c1ee64981e184b9e0ba5eb3179e5ba3d4b51665a6cb52b8ef3d01a7cbf", size = 5920504, upload-time = "2026-05-29T23:11:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/34/c2/ef9b6a63f7dc432712a462c816662e662e00d38caa9b861c8c2588195d03/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2732904099e0a4d4db774a5fc6d91ee95fae065b4d2ecabb4968c5fe2406c9d7", size = 6476660, upload-time = "2026-05-29T23:11:59.188Z" }, + { url = "https://files.pythonhosted.org/packages/b1/81/bff68ce829999c1e4209c761bbf903b1c06ec570416ddb25020864ad5907/cuda_bindings-13.3.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ab2f74ed65bfef4163ba07a8db16f1085e0729291db12a2423aff84ee8278b8", size = 6013639, upload-time = "2026-05-29T23:12:03.509Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e0/c8a1f0c8f9ffdea4f5fe6dbab89b326cef4d85caf489dad39e209da89416/cuda_bindings-13.3.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd4c814d311ec08c981f6dded1dbe7d4b371067ee4f6c14cccec4bde9590f80", size = 6534419, upload-time = "2026-05-29T23:12:05.633Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/83b1f563925b290f2d11a01a77a84013ba56052fe3653a5bef3ccfbb43d6/cuda_bindings-13.3.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3c772dfff49681541d59630c90f858e173ac926b9c593a2b7123f2a1043cc76", size = 5809771, upload-time = "2026-05-29T23:12:10.422Z" }, + { url = "https://files.pythonhosted.org/packages/12/20/e79b4bfe98f075195afb6343d41c498f9dbd2d161d7021d4d28bceb83581/cuda_bindings-13.3.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36febb7c1079d68a981dbbd8d5a67235b399802b82075c9388624719607e52b9", size = 6358584, upload-time = "2026-05-29T23:12:12.767Z" }, +] + +[[package]] +name = "cuda-pathfinder" +version = "1.5.6" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/53/8fc9b0cdc5b7f62746e6a01b85b6461e5ae27f871010a5fcf8fa6950766d/cuda_pathfinder-1.5.6-py3-none-any.whl", hash = "sha256:7e4c07c117b78ba1fb35dac4c444d21f3677b1b1ff56175c53a8e3025c5b43c0", size = 52972, upload-time = "2026-06-30T00:58:04.34Z" }, +] + +[[package]] +name = "cuda-toolkit" +version = "13.0.3.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/c7/a79086a62c98befcdb8349656c6f114e2db3b8b2422f6e25c97a7f2a9a3c/cuda_toolkit-13.0.3.0-py2.py3-none-any.whl", hash = "sha256:d693caaa261214ddd7dbb60d68e71cbed884e68c2be7509778f3051da0b91c3f", size = 2512, upload-time = "2026-04-14T00:50:08.173Z" }, +] + +[package.optional-dependencies] +cublas = [ + { name = "nvidia-cublas", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cuda-nvrtc", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +cudart = [ + { name = "nvidia-cuda-runtime", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +cufft = [ + { name = "nvidia-cufft", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +cufile = [ + { name = "nvidia-cufile", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux')" }, +] +cupti = [ + { name = "nvidia-cuda-cupti", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +curand = [ + { name = "nvidia-curand", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +cusolver = [ + { name = "nvidia-cublas", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cusolver", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cusparse", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +cusparse = [ + { name = "nvidia-cusparse", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +nvjitlink = [ + { name = "nvidia-nvjitlink", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +nvrtc = [ + { name = "nvidia-cuda-nvrtc", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] +nvtx = [ + { name = "nvidia-nvtx", marker = "(python_full_version >= '3.10' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.10.*' and platform_machine == 'AMD64' and sys_platform == 'win32')" }, +] + +[[package]] +name = "debugpy" +version = "1.8.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/aa/12037145b7a56eaa5b29b41872f7a21b538e807e13f32c4d3c46e59be084/debugpy-1.8.21.tar.gz", hash = "sha256:a3c53278e84c94e11bd87c53970ec391d1a67396c8b22609fcac576520e611a6", size = 1697577, upload-time = "2026-06-01T19:30:35.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/f3/6b1d4c71f4cbb5360009f928934a03b42906f28fc7b3f7f35f04e58acead/debugpy-1.8.21-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:8eeab7b5462f683452c57c0126aaa5ec4e974ddb705f39ba87dff8818c8e08f9", size = 2113873, upload-time = "2026-06-01T19:30:37.148Z" }, + { url = "https://files.pythonhosted.org/packages/1c/f2/17c3bf91cebc173bfbf5734cd2669723d0a35c0cf9d2fd2124546efeae83/debugpy-1.8.21-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:0fddfdc130ac6d8bfc0415b0409822fa901c8f310e5c945ac5653a0352532344", size = 3004715, upload-time = "2026-06-01T19:30:38.888Z" }, + { url = "https://files.pythonhosted.org/packages/5a/22/1f8efd80c7b5909e760f9cfd0c9e8681d2d35d532f7c0a40760cd4da4a19/debugpy-1.8.21-cp310-cp310-win32.whl", hash = "sha256:72b5d676c4cbfac3bac5bb01c138a4656e843f93f03ce2a5f4e394ad49fbee73", size = 5303455, upload-time = "2026-06-01T19:30:40.52Z" }, + { url = "https://files.pythonhosted.org/packages/da/ce/54c79abd6cccef92fa7b43d97e3acafedf4d645557267ece05e948b5e4b8/debugpy-1.8.21-cp310-cp310-win_amd64.whl", hash = "sha256:a7fe47fd23da57b9e0bec3f4a8ee65a2dc55782455ed7f2141d75ab5d2eaeef5", size = 5331751, upload-time = "2026-06-01T19:30:42.146Z" }, + { url = "https://files.pythonhosted.org/packages/89/fb/cbf306d6e07a313a91e7171a98669054502840931432c227cfd505ee367f/debugpy-1.8.21-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:da456226c7b4c69e35dbe35dcee6623d912000a77816db7856a41af1c72a0264", size = 2203120, upload-time = "2026-06-01T19:30:43.964Z" }, + { url = "https://files.pythonhosted.org/packages/aa/57/aa739bd4ad2cbf96aeb1b20b56918ddd5ae4c28b68709bfcd327f02123ee/debugpy-1.8.21-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:f68b891688e61bdc08b8d364d919ff0051e0b94657b39dcd027bc3173edb7cdc", size = 3059958, upload-time = "2026-06-01T19:30:45.622Z" }, + { url = "https://files.pythonhosted.org/packages/a8/31/453d2c9a23d133fe2c8ec7ca1d816ded52a913487fe3ffef7c01b4b706af/debugpy-1.8.21-cp311-cp311-win32.whl", hash = "sha256:f843a8b08c2edeaf9b1582eed4f25441af21a297c22ff16bf76a662557aa9c9e", size = 5236515, upload-time = "2026-06-01T19:30:47.461Z" }, + { url = "https://files.pythonhosted.org/packages/60/94/6660de2f2d7bf388f229335ba4637646eebabdbf38564cb439a95a9193c9/debugpy-1.8.21-cp311-cp311-win_amd64.whl", hash = "sha256:84c564d8cc701d41843b29a92814c1f1bef6798724ca9d675c284ad9f6a547d7", size = 5256138, upload-time = "2026-06-01T19:30:49.113Z" }, + { url = "https://files.pythonhosted.org/packages/a2/df/bf625547431a9cadc9f4cbfeda38866e2b17f6aed147b625377e87834449/debugpy-1.8.21-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:9f96713896f39c3dff0ee841f47320c3f2983d33c341e009361bb0ebc79adc4e", size = 2483609, upload-time = "2026-06-01T19:30:50.794Z" }, + { url = "https://files.pythonhosted.org/packages/bf/09/59324b903599031ff9faaec1758292409f6561a0ec2492fe4b703327705a/debugpy-1.8.21-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:c193d474f0a211191f2b4449d2d06157c689013035bd952f3b617e0ef422b176", size = 3968900, upload-time = "2026-06-01T19:30:52.341Z" }, + { url = "https://files.pythonhosted.org/packages/14/cd/27f65b805d7fe005c44e1a36b9183ecdfbcdbf9d3e721a5115d461ecc7ee/debugpy-1.8.21-cp312-cp312-win32.whl", hash = "sha256:4743373c1cac7f9e74a1b9915bf1dbe0e900eca657ffb170ae07ac8363205ae9", size = 5336340, upload-time = "2026-06-01T19:30:54.047Z" }, + { url = "https://files.pythonhosted.org/packages/77/1d/c84e30c0c674184948b66f076ab271c01d940618a2824c23cd035a27bc20/debugpy-1.8.21-cp312-cp312-win_amd64.whl", hash = "sha256:bd7ba9dd3daa7c2f942c6ca8d4695a16bf9ac16b63615261c7982bc74f7ed20c", size = 5374751, upload-time = "2026-06-01T19:30:55.891Z" }, + { url = "https://files.pythonhosted.org/packages/77/6b/d817e1f8cc77aa055d37fba092e0febfdff40fe652d8d53d4cd7a86ad98d/debugpy-1.8.21-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:13678151fc401e2d68c9880b91e28714f797d40422994572b24560ef80910a88", size = 2477398, upload-time = "2026-06-01T19:30:57.644Z" }, + { url = "https://files.pythonhosted.org/packages/48/57/412421516afc3055fa577516f00beec3d663f9b0ab330639547ae6c57720/debugpy-1.8.21-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ecbd158386c31ffe71d46f72d44d56e66331ab9b16cad649156d514368f23ab2", size = 3962096, upload-time = "2026-06-01T19:30:59.235Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2c616337cf6ba7b07ebbc97f02c6c945a8e2f76b365e33ee809c32ee36d1/debugpy-1.8.21-cp313-cp313-win32.whl", hash = "sha256:2c2ae706dec41d99a9ca1f7ebc987a83e65578363be6f6b3ac9067504917fae1", size = 5336288, upload-time = "2026-06-01T19:31:00.79Z" }, + { url = "https://files.pythonhosted.org/packages/f8/99/9175103392f84c4b1bf7622888cdc68da07f0ff7d9e581266428f6776033/debugpy-1.8.21-cp313-cp313-win_amd64.whl", hash = "sha256:aa648733047443eb1d07682c4ef287d36a54507b643ffdf38b09a3ef002c72a0", size = 5376567, upload-time = "2026-06-01T19:31:02.56Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3d/f4bbb323a548bfab2af3d6b4ffd9bf22636e55956a1285d317a1de643aad/debugpy-1.8.21-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9bb2a685287a2ac9b181cde89edcec64845cb51de7faaa75badb9a698bc24782", size = 2477209, upload-time = "2026-06-01T19:31:04.157Z" }, + { url = "https://files.pythonhosted.org/packages/8c/2d/6e7ec524984a1702777868de49a4c53202bddac2a432a76a093469587750/debugpy-1.8.21-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:3d6922439bf33fd38a3e2c447869ebc7b97da5cd3d329ff1ef9bc06c4903437e", size = 3927115, upload-time = "2026-06-01T19:31:05.863Z" }, + { url = "https://files.pythonhosted.org/packages/97/47/d1aa6d64005a98a9144647d99306b419396f9ad7bf1d73c119e17a81fb4d/debugpy-1.8.21-cp314-cp314-win32.whl", hash = "sha256:15d4963bd5ffa48f0da0947fd06757fa7621945048a14ad7705431566d3c0e7c", size = 5336724, upload-time = "2026-06-01T19:31:07.711Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/b905b90d163af11878c1af8abafa4a25206335e112e284e413454543a6da/debugpy-1.8.21-cp314-cp314-win_amd64.whl", hash = "sha256:fe0744a12353406de0ae8ccff0d0a4a666f00801a3db8fd04e7a5f761cd520e8", size = 5373803, upload-time = "2026-06-01T19:31:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/5c/dd/2179321843d2f15841c55e5dc748baf2036f17dde755aee27046a7f83703/debugpy-1.8.21-cp38-cp38-macosx_15_0_x86_64.whl", hash = "sha256:0042da0ecd0a8b50dc4a54395ecd870d258d73fa18776f50c91fdcabdcad2675", size = 2120396, upload-time = "2026-06-01T19:31:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/60/4d/81f781813448b461210d8f3a33098b0d9f724e4a7e32852dff30147ae6df/debugpy-1.8.21-cp38-cp38-manylinux_2_34_x86_64.whl", hash = "sha256:ffd932c6796afadab6993ec96745918a8cb2444dbd392074f769db5ea40ab440", size = 3058314, upload-time = "2026-06-01T19:31:13.109Z" }, + { url = "https://files.pythonhosted.org/packages/2f/57/b2c0cb55527304d1985587cf58eba3d15d000075e781fad44103b6290d30/debugpy-1.8.21-cp38-cp38-win32.whl", hash = "sha256:4e7c2d784d78ad4b71a5f8cd7b59c167719ec8a7a0211dbb3eb1bfeda78bc4e2", size = 5308600, upload-time = "2026-06-01T19:31:14.756Z" }, + { url = "https://files.pythonhosted.org/packages/fd/97/f0fc3e9bdbefd1066e73608cccdd1641c6fe2979a603d9fafd0c806e5a6b/debugpy-1.8.21-cp38-cp38-win_amd64.whl", hash = "sha256:aa9d941d6dfe3d0407e4b3ca0b9ec466030e260fbf1174094f68785680f66db6", size = 5337562, upload-time = "2026-06-01T19:31:16.718Z" }, + { url = "https://files.pythonhosted.org/packages/ad/84/8625c1ff37bb5509029962889e79603c450239b1cec63967795e0f1a1a76/debugpy-1.8.21-cp39-cp39-macosx_15_0_x86_64.whl", hash = "sha256:9f5171176a0084b95d2ebe55a4d1f7b2a75b74c5dbec577ebd3a85c740551c36", size = 2115083, upload-time = "2026-06-01T19:31:18.377Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4f/bc441d8b7d1cc239ffb5d1bfe294d9ce788110f9d108b110faf2d1dd2731/debugpy-1.8.21-cp39-cp39-manylinux_2_34_x86_64.whl", hash = "sha256:f15c10084f9861b5e8414a48f18f8e4aadf51a98a59e72c16aa28281ca994672", size = 2999455, upload-time = "2026-06-01T19:31:20.007Z" }, + { url = "https://files.pythonhosted.org/packages/62/ed/e9f77c043d341db11c5cf009977c1706c2d0f82e626785e013691696681f/debugpy-1.8.21-cp39-cp39-win32.whl", hash = "sha256:4e70cc8b5079f885cb43910924ee0aab73b8b6b2a14eff23afdd9895d86e79eb", size = 5304139, upload-time = "2026-06-01T19:31:21.724Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/b747736fdb98385b59ff2fc19670e712065d235507051595d429f584e095/debugpy-1.8.21-cp39-cp39-win_amd64.whl", hash = "sha256:e935f9dc0501be523c8a8e1853c39432e1354e9ece717ae5998fd2371c4542c3", size = 5332435, upload-time = "2026-06-01T19:31:23.394Z" }, + { url = "https://files.pythonhosted.org/packages/95/51/67e7cf11a53e40694f720457d5b3a1cdaaa3d5a9a633e482f225456b93ff/debugpy-1.8.21-py2.py3-none-any.whl", hash = "sha256:b1e37d333663c8851516a47364ef473da127f9caebe4417e6df6f5825a7e9a92", size = 5352888, upload-time = "2026-06-01T19:31:25.186Z" }, +] + +[[package]] +name = "decorator" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "filelock" +version = "3.29.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/94/00f2059e4835eace3ae8fde680b932c496f8ec7bdc99168dfa53fb2e6b79/filelock-3.29.7.tar.gz", hash = "sha256:5b481979797ae69e72f0b389d89a80bdd585c260c5b3f1fb9c0a5ba9bb3f195d", size = 71521, upload-time = "2026-07-08T05:46:58.716Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/02/be4a57b60c7149b55b9e3b3c13f609cd8eb5307c751f22bd8fb8d262e75b/filelock-3.29.7-py3-none-any.whl", hash = "sha256:987db6f789a3a2a59f55081801b2b3697cb97e2a736b5f1a9e99b559285fbc51", size = 46036, upload-time = "2026-07-08T05:46:57.53Z" }, +] + +[[package]] +name = "fsspec" +version = "2026.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/a1/ae4e3e5003468d6391d2c77b6fa1cd73bd5d13511d81c642d7b28ac90ed4/fsspec-2026.6.0.tar.gz", hash = "sha256:f5bac145310fe30e16e1471bd6840b2d990d609e872251d7e674241822abf01a", size = 313646, upload-time = "2026-06-16T01:57:28.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/22/4222d7ddf3da30f363edaa98e329c2bce6c65497c9cb2810931c8b2c0fbc/fsspec-2026.6.0-py3-none-any.whl", hash = "sha256:02e0b71817df9b2169dc30a16832045764def1191b43dcff5bb85bdee212d2a1", size = 203949, upload-time = "2026-06-16T01:57:26.358Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl", hash = "sha256:2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7", size = 27789, upload-time = "2026-03-20T06:42:55.665Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "ipykernel" +version = "7.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "python_full_version >= '3.10' and sys_platform == 'darwin'" }, + { name = "comm", marker = "python_full_version >= '3.10'" }, + { name = "debugpy", marker = "python_full_version >= '3.10'" }, + { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "ipython", version = "9.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "jupyter-client", marker = "python_full_version >= '3.10'" }, + { name = "jupyter-core", marker = "python_full_version >= '3.10'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.10'" }, + { name = "nest-asyncio2", marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "psutil", marker = "python_full_version >= '3.10'" }, + { name = "pyzmq", marker = "python_full_version >= '3.10'" }, + { name = "tornado", marker = "python_full_version >= '3.10'" }, + { name = "traitlets", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/c4/e4a38f579de4225a561305666f7541cdabb30075def2aa1ac17bd73c1fb5/ipykernel-7.3.0.tar.gz", hash = "sha256:9acaaaf97d16355166e4085afe9d225bfbdf2b7ef520f9df3be8f2b248275e09", size = 184899, upload-time = "2026-06-10T08:41:25.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/02/77b271f5dc58bfbc0b577c877b2365d1ffea2afe66a80c13f2312820348c/ipykernel-7.3.0-py3-none-any.whl", hash = "sha256:897eb64da762549ef610698fca5e9675195ec6ac8ec7f19d81ce1ca20c876057", size = 120583, upload-time = "2026-06-10T08:41:23.648Z" }, +] + +[[package]] +name = "ipython" +version = "8.39.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version == '3.10.*'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "jedi", marker = "python_full_version == '3.10.*'" }, + { name = "matplotlib-inline", marker = "python_full_version == '3.10.*'" }, + { name = "pexpect", marker = "python_full_version == '3.10.*' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version == '3.10.*'" }, + { name = "pygments", marker = "python_full_version == '3.10.*'" }, + { name = "stack-data", marker = "python_full_version == '3.10.*'" }, + { name = "traitlets", marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/18/f8598d287006885e7136451fdea0755af4ebcbfe342836f24deefaed1164/ipython-8.39.0.tar.gz", hash = "sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624", size = 5513971, upload-time = "2026-03-27T10:02:13.94Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/56/4cc7fc9e9e3f38fd324f24f8afe0ad8bb5fa41283f37f1aaf9de0612c968/ipython-8.39.0-py3-none-any.whl", hash = "sha256:bb3c51c4fa8148ab1dea07a79584d1c854e234ea44aa1283bcb37bc75054651f", size = 831849, upload-time = "2026-03-27T10:02:07.846Z" }, +] + +[[package]] +name = "ipython" +version = "9.15.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.11'" }, + { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, + { name = "jedi", marker = "python_full_version >= '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, + { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, + { name = "psutil", marker = "python_full_version >= '3.11' and sys_platform != 'cygwin' and sys_platform != 'emscripten'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "stack-data", marker = "python_full_version >= '3.11'" }, + { name = "traitlets", marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/59/165d3b4d75cc34add3122c4417ecb229085140ac573103c223cd01dde96f/ipython-9.15.0.tar.gz", hash = "sha256:da2819ce2aa83135257df830660b1176d986c3d2876db24df01974fa955b2756", size = 4442580, upload-time = "2026-06-26T11:03:35.913Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/3a/948263ca3b9d65bb2b1b0c521b3a49fad5d59ada58724bd87d2bd5ff3f36/ipython-9.15.0-py3-none-any.whl", hash = "sha256:515ad9c3cdf0c932a5a9f6245419e8aba706b7bd03c3e1d3a1c83d9351d6aa6e", size = 630895, upload-time = "2026-06-26T11:03:33.809Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core", marker = "python_full_version >= '3.10'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.10'" }, + { name = "pyzmq", marker = "python_full_version >= '3.10'" }, + { name = "tornado", marker = "python_full_version >= '3.10'" }, + { name = "traitlets", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/dc/5512503b088997c2250b8bf18258fba9d9ce5ead641183700960d3c9d342/jupyter_client-8.9.1.tar.gz", hash = "sha256:a58f730dd9e728ba16ba1d62ebccf7ffe1ebbdbce4e95cfae941b7321ae1f4fa", size = 359256, upload-time = "2026-06-09T13:15:01.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/6f/56d39bf385c5c27988aebaf0c18a2a17e960575740100973511018bd904e/jupyter_client-8.9.1-py3-none-any.whl", hash = "sha256:0b7a295bc46e8751e9adae84781f726c851c1d911bd793edc4a3bde942e3da81", size = 109828, upload-time = "2026-06-09T13:14:58.835Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs", marker = "python_full_version >= '3.10'" }, + { name = "traitlets", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, + { url = "https://files.pythonhosted.org/packages/56/23/0d8c13a44bde9154821586520840643467aee574d8ce79a17da539ee7fed/markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", size = 11623, upload-time = "2025-09-27T18:37:29.296Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/07a2cb9a8045d5f3f0890a8c3bc0859d7a47bfd9a560b563899bec7b72ed/markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", size = 12049, upload-time = "2025-09-27T18:37:30.234Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e4/6be85eb81503f8e11b61c0b6369b6e077dcf0a74adbd9ebf6b349937b4e9/markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", size = 21923, upload-time = "2025-09-27T18:37:31.177Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bc/4dc914ead3fe6ddaef035341fee0fc956949bbd27335b611829292b89ee2/markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", size = 20543, upload-time = "2025-09-27T18:37:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/5fe81fbcfba4aef4093d5f856e5c774ec2057946052d18d168219b7bd9f9/markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", size = 20585, upload-time = "2025-09-27T18:37:33.166Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f6/e0e5a3d3ae9c4020f696cd055f940ef86b64fe88de26f3a0308b9d3d048c/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", size = 21387, upload-time = "2025-09-27T18:37:34.185Z" }, + { url = "https://files.pythonhosted.org/packages/c8/25/651753ef4dea08ea790f4fbb65146a9a44a014986996ca40102e237aa49a/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", size = 20133, upload-time = "2025-09-27T18:37:35.138Z" }, + { url = "https://files.pythonhosted.org/packages/dc/0a/c3cf2b4fef5f0426e8a6d7fce3cb966a17817c568ce59d76b92a233fdbec/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", size = 20588, upload-time = "2025-09-27T18:37:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/cd/1b/a7782984844bd519ad4ffdbebbba2671ec5d0ebbeac34736c15fb86399e8/markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", size = 14566, upload-time = "2025-09-27T18:37:37.09Z" }, + { url = "https://files.pythonhosted.org/packages/18/1f/8d9c20e1c9440e215a44be5ab64359e207fcb4f675543f1cf9a2a7f648d0/markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", size = 15053, upload-time = "2025-09-27T18:37:38.054Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d3/fe08482b5cd995033556d45041a4f4e76e7f0521112a9c9991d40d39825f/markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", size = 13928, upload-time = "2025-09-27T18:37:39.037Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + +[[package]] +name = "maturin" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/b3/addd877f871fb1860d46d3a4f206ecb10b946c85846805e6367631926fd3/maturin-1.14.1.tar.gz", hash = "sha256:9d6577a62cd08e0ceba7a0db06fb098e0c9b1b3429bad747a4f3a18215a1b3df", size = 369637, upload-time = "2026-06-19T05:19:49.774Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/f0/97c5a5bd9c71653a066c0976a484eaaae50b9369557838a4176b7b0bdaa5/maturin-1.14.1-py3-none-linux_armv6l.whl", hash = "sha256:522292398945442cdafa9daeb2271b2340fbde57027b818f923f88eab04174f8", size = 10207496, upload-time = "2026-06-19T05:19:09.321Z" }, + { url = "https://files.pythonhosted.org/packages/fe/83/294bca639b0e052f1e2f65199b3db258780c7d4e31408b934c9c974a1379/maturin-1.14.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ffe5ad71f21d1e6603c4dd75f7fee34adf5ed5ebcebb692886549888ebb329ed", size = 19680113, upload-time = "2026-06-19T05:19:13.43Z" }, + { url = "https://files.pythonhosted.org/packages/43/b6/79c881410a3b1c187f7eb3d407aecae646c6a4433d630d72200359015e83/maturin-1.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f3306078070c1508fd715b9116070cbcaff5959024272a9f1e6f5cb29768b86c", size = 10169205, upload-time = "2026-06-19T05:19:16.615Z" }, + { url = "https://files.pythonhosted.org/packages/93/9d/44b6f26dcb7f7a04c5501ac2dbb6ca1490150682baa525ca5860504f9eab/maturin-1.14.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:cd457cd88961156e26379e1155bd287cc0ec1c8b2f1582b0660fb31b87c8842d", size = 10188098, upload-time = "2026-06-19T05:19:19.736Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bd/9c0d5d6983905ce2c9edaa073a7e89355a9cf7f396988e05d32f1c37785d/maturin-1.14.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:dfc54ae32e6fcb18302193ab9a30b0b25eefffba994ae13238974805533ef75e", size = 10627576, upload-time = "2026-06-19T05:19:22.713Z" }, + { url = "https://files.pythonhosted.org/packages/e5/33/b096412bd6a7cb399652b260666f901adf88a687181a6dbd6a3f89f0a94e/maturin-1.14.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:a131d912b5267e640bc96d70f4914e10590aed64082ec9abacba7cea52004224", size = 10085181, upload-time = "2026-06-19T05:19:25.69Z" }, + { url = "https://files.pythonhosted.org/packages/56/8d/08c3bf469c38a23c9e6c877e338193001eb604d010fedc08341974e38528/maturin-1.14.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:be18fc568fb76884c0205456336892a75105ec398e6b667cd777c6268bd06d69", size = 10026363, upload-time = "2026-06-19T05:19:28.904Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a4/c4d1a92839f8745ab4aab988a7db884a79d6d710bd3b286fcf9316dece1a/maturin-1.14.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:994a0c8ba3ad8a92b3a9ee1b02645d200d610216b15cff5102b0fe65e8e08666", size = 13321347, upload-time = "2026-06-19T05:19:32.411Z" }, + { url = "https://files.pythonhosted.org/packages/b3/fa/170f04624d03fd07d2a8b1b67de83a127af93aef9eaa425839553347297b/maturin-1.14.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be80866363e605d137991b491a741a84cde9ae350183c4c85f49690ca9aaaa65", size = 10877609, upload-time = "2026-06-19T05:19:35.448Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/1ae2e1d0ded282bf2c55ac13f0811d87deb425e200ae64a15785675dede9/maturin-1.14.1-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:5282dffd4b539d2be245f4e5b1a5ab6bc1033b58f4a4872f5833f9d43c954aa4", size = 10417316, upload-time = "2026-06-19T05:19:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/fb/27/bf677183920718da49cd7982d6a3ffc440aad8919329f571d189f81b7bdf/maturin-1.14.1-py3-none-win32.whl", hash = "sha256:1a04de0a20188f95c721b5702eed18140bdcccb28c386797093eca3f62f4d4e0", size = 8931293, upload-time = "2026-06-19T05:19:41.183Z" }, + { url = "https://files.pythonhosted.org/packages/63/4b/585adeb9167b08d3cdff0032a938b0e72655c92003df4f52c3f696a1bcc2/maturin-1.14.1-py3-none-win_amd64.whl", hash = "sha256:3c9f94640ecc4895e94abaf834a0684430032c865b2748a36c12461fd9252fdd", size = 10314067, upload-time = "2026-06-19T05:19:44.389Z" }, + { url = "https://files.pythonhosted.org/packages/51/d4/dac8c0720ae246be1700afb6fbdbbea20fe35b13f6570b2f70faa005df77/maturin-1.14.1-py3-none-win_arm64.whl", hash = "sha256:15cea8fcb3ba47dd636f50092bb34baea8b04ac777392f23e6bf8a9a61efb894", size = 9718943, upload-time = "2026-06-19T05:19:47.49Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "nest-asyncio2" +version = "1.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/73/731debf26e27e0a0323d7bda270dc2f634b398e38f040a09da1f4351d0aa/nest_asyncio2-1.7.2.tar.gz", hash = "sha256:1921d70b92cc4612c374928d081552efb59b83d91b2b789d935c665fa01729a8", size = 14743, upload-time = "2026-02-13T00:34:04.386Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/3c/3179b85b0e1c3659f0369940200cd6d0fa900e6cefcc7ea0bc6dd0e29ffb/nest_asyncio2-1.7.2-py3-none-any.whl", hash = "sha256:f5dfa702f3f81f6a03857e9a19e2ba578c0946a4ad417b4c50a24d7ba641fe01", size = 7843, upload-time = "2026-02-13T00:34:02.691Z" }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, +] + +[[package]] +name = "networkx" +version = "3.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, + { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, + { url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, + { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, + { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" }, + { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" }, + { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, + { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" }, + { url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" }, + { url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" }, + { url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" }, + { url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" }, + { url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" }, + { url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" }, + { url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" }, + { url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" }, + { url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" }, + { url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/db/f4/731b6085a83faf6ca843394cbd5e217280c214399f7e8b21b9f552af0ae2/numpy-2.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c786fe9a5bbe360022e584c5a34cf6b54265c71bd7ec8ac3d8fec38968071f8", size = 16795063, upload-time = "2026-07-04T17:07:07.374Z" }, + { url = "https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32985c896d897419ef8da6917872d80b78ad0ea26d85b23245c7366ffde76d75", size = 11776652, upload-time = "2026-07-04T17:07:09.907Z" }, + { url = "https://files.pythonhosted.org/packages/b5/59/2b844c7a6e9deff69b404a66221e1542937734f65d5e6e39411876053862/numpy-2.5.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:efd736408cc97c79b9e6917338dfc8f06013b2274f992e96b1d9a81a71e2a2c2", size = 5335944, upload-time = "2026-07-04T17:07:12.227Z" }, + { url = "https://files.pythonhosted.org/packages/86/51/9bf7cb2cabcebc9e017e4ec7e6322b378317a542c08b4cb68479c1efc716/numpy-2.5.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ab84dc6b074fa881cae55bea94cc4f68e285181ba7f32497bf7dee6b1496165b", size = 6656266, upload-time = "2026-07-04T17:07:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/fb7615b211b82a32f44d5180a6d421b61f84d4fadd578b48ba4ac34e189f/numpy-2.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caf3e317d33d60c37986b452613f4ab51246d0691350c03d0cb4a898627f4a95", size = 15179720, upload-time = "2026-07-04T17:07:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21", size = 16664835, upload-time = "2026-07-04T17:07:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/97d6475ee91afe2587797d09446f9d3e475ad4cb681662d824809327b75a/numpy-2.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c12afb53450fa976d4c681c50a7423729a4c51c0465ed9f32b8a9cabbc472373", size = 16539135, upload-time = "2026-07-04T17:07:22.015Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/4db81e4ba0be7e2776b1de68c82aa862c7f8ec27e1b4927d4ae075e20678/numpy-2.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c11c405efc5ff6816d5983c96cdfa215bab3428961243af3ff59b228490438", size = 18426684, upload-time = "2026-07-04T17:07:24.941Z" }, + { url = "https://files.pythonhosted.org/packages/1f/64/c0ba2d90724d450279a7df8f32057241070250a26a7e2b5337d77347f481/numpy-2.5.1-cp314-cp314-win32.whl", hash = "sha256:f2479a47f8d5932d1718168a681ad6e536a9df484c83cfcf9de365e164537ace", size = 6116103, upload-time = "2026-07-04T17:07:27.622Z" }, + { url = "https://files.pythonhosted.org/packages/c1/1a/837f9ed7405adcd7a40538792eb169eddd8fa5630c16a1ef49dae71a30f4/numpy-2.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:24d0eb82c0541d3415a33425db64ae439dffccd7b4dbcb30e7c35120205c506a", size = 12562177, upload-time = "2026-07-04T17:07:29.887Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/49707938b6dd0a78a9178dd93227dc89e4c11af47f5c798d70366e8d0483/numpy-2.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:5a4c988b38d261deeeaad9954e3deb091ad905c94e8bb6708654ef1d97f286b0", size = 10627739, upload-time = "2026-07-04T17:07:32.568Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c7/bb4b882cfe7f299cbc8b66e42e7dd78cf9d14e40f9469fc5e3db7e15b3bd/numpy-2.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a33276be12fa045805f477f22482088b66bb758ffbe89a9d21457de863a32e22", size = 11894709, upload-time = "2026-07-04T17:07:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/40/3f/5af7f4a7f6224aef48017aa82bb6174c7a659d724be0c75017b7e64a55b4/numpy-2.5.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f089d7b00756190aacf1f5d34bdf38c3c430ac82b4f868f8cede73380460fce7", size = 5453810, upload-time = "2026-07-04T17:07:37.495Z" }, + { url = "https://files.pythonhosted.org/packages/20/c9/3474309bc94d634d3f9c3eddf03250ecb8c22cd948ef16fef69a77cc5d7b/numpy-2.5.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:09e9bfd8d2cf479c7d174804fb3811c53a8e9f20a37444008606b57d6b7a826d", size = 6761189, upload-time = "2026-07-04T17:07:39.563Z" }, + { url = "https://files.pythonhosted.org/packages/90/8a/558ae39fdd55d7e7f7fef9a84a6e964ac6b23edbd2a07e52bb084500507d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e68d8dd1e7eba712948f2053a29ec86917bc70ba1358df869d9f06649ef9cf09", size = 15225039, upload-time = "2026-07-04T17:07:41.682Z" }, + { url = "https://files.pythonhosted.org/packages/63/27/ca7392b2d030277bdf0273e7d23255b3ee57d57a7c170a6f4fb3981e1e5d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d5095fa265a0c4152e7bb12759e14381ef5496152f1ce58f44bdf55c44beb4", size = 16701306, upload-time = "2026-07-04T17:07:44.611Z" }, + { url = "https://files.pythonhosted.org/packages/02/42/03d53ae7996c44d4374a8262e9dc41671fd56cbb98f7d47ef85cf5da4c6b/numpy-2.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ab87a91b3cc3382b8956095bd8f95e00cf679bb81554339be1a2ba404a1473c1", size = 16589955, upload-time = "2026-07-04T17:07:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/7b/15/6c1784ae469640e65db111e9a34b3d0f14d91e8a38b9ce34810ced370dbb/numpy-2.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:224ca51130ef7da85bea2191625181cb4f337f9cb64b471f10c1a12aa8b60077", size = 18464252, upload-time = "2026-07-04T17:07:50.684Z" }, + { url = "https://files.pythonhosted.org/packages/94/a8/f98e50356cf167df656c526c2dfeec2d7dde182f2a3da4b458a5938e2776/numpy-2.5.1-cp314-cp314t-win32.whl", hash = "sha256:6eab239876581b2b3c5a242281b6007bbdbcd1c7085d7709bb57c5929b11e6bf", size = 6263298, upload-time = "2026-07-04T17:07:53.445Z" }, + { url = "https://files.pythonhosted.org/packages/72/ac/96ae880cdecad0b3275d9359fcec72667b49a4863c9f12942e43679dda02/numpy-2.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:83ce9c80d5b521b0d77ddcbe5447c218d247929b6cc056ca5351342accfff0af", size = 12748623, upload-time = "2026-07-04T17:07:55.384Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5a/4d2b1601df3602dba7a14f3348ba9bfe94a18adb428e693df6154c293831/numpy-2.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:5a6db61f9aaa57e369905c67d852045d3c4f7126405b29d09b19dec118e9c9cb", size = 10697674, upload-time = "2026-07-04T17:07:58.506Z" }, +] + +[[package]] +name = "nvidia-cublas" +version = "13.1.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cuda-nvrtc", marker = "(python_full_version == '3.10.*' and sys_platform == 'emscripten') or (python_full_version == '3.10.*' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/a1/0bd24ee8c8d03adac032fd2909426a00c88f8c57961b1277ded97f91119f/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b7a210458267ac818974c53038fbec2e969d5c99f305ab15c72522fa9f001dd5", size = 542848918, upload-time = "2026-04-08T18:46:22.985Z" }, + { url = "https://files.pythonhosted.org/packages/3b/cd/154ca20c38269e05eff77c1464e6c1da89f50a6390b565e9d82e06bc11e1/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:37936a16db8fe4ac1f065c2139360608a543a09275cb1a1af612e08cfa065436", size = 423138758, upload-time = "2026-04-08T18:46:58.655Z" }, +] + +[[package]] +name = "nvidia-cuda-cupti" +version = "13.0.85" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", size = 10310827, upload-time = "2025-09-04T08:26:42.012Z" }, + { url = "https://files.pythonhosted.org/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", size = 10715597, upload-time = "2025-09-04T08:26:51.312Z" }, +] + +[[package]] +name = "nvidia-cuda-nvrtc" +version = "13.0.88" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", size = 90215200, upload-time = "2025-09-04T08:28:44.204Z" }, + { url = "https://files.pythonhosted.org/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", size = 43015449, upload-time = "2025-09-04T08:28:20.239Z" }, +] + +[[package]] +name = "nvidia-cuda-runtime" +version = "13.0.96" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", size = 2261060, upload-time = "2025-10-09T08:55:15.78Z" }, + { url = "https://files.pythonhosted.org/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", size = 2243632, upload-time = "2025-10-09T08:55:36.117Z" }, +] + +[[package]] +name = "nvidia-cudnn-cu13" +version = "9.20.0.48" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas", marker = "(python_full_version == '3.10.*' and sys_platform == 'emscripten') or (python_full_version == '3.10.*' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/c5/83384d846b2fd17c44bd499b36c75a45ed4f095fbbb2252294e89cea5c5c/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:e31454ae00094b0c55319d9d15b6fa2fc50a9e1c0f5c8c80fb75258234e731e1", size = 444574296, upload-time = "2026-03-09T19:28:27.751Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5e/edb9c0ae051602c3ccaffe424256463636d639e27d7f302dde9975ef9e7a/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0c45dd8eeb50b603f07995b1b300c62ffe6a1980482b82b3bcf94a4ca9d49304", size = 366173588, upload-time = "2026-03-09T19:29:34.474Z" }, +] + +[[package]] +name = "nvidia-cufft" +version = "12.0.0.61" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink", marker = "(python_full_version == '3.10.*' and sys_platform == 'emscripten') or (python_full_version == '3.10.*' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", size = 214085489, upload-time = "2025-09-04T08:31:56.044Z" }, +] + +[[package]] +name = "nvidia-cufile" +version = "1.15.1.6" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/70/4f193de89a48b71714e74602ee14d04e4019ad36a5a9f20c425776e72cd6/nvidia_cufile-1.15.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08a3ecefae5a01c7f5117351c64f17c7c62efa5fffdbe24fc7d298da19cd0b44", size = 1223672, upload-time = "2025-09-04T08:32:22.779Z" }, + { url = "https://files.pythonhosted.org/packages/ab/73/cc4a14c9813a8a0d509417cf5f4bdaba76e924d58beb9864f5a7baceefbf/nvidia_cufile-1.15.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bdc0deedc61f548bddf7733bdc216456c2fdb101d020e1ab4b88d232d5e2f6d1", size = 1136992, upload-time = "2025-09-04T08:32:14.119Z" }, +] + +[[package]] +name = "nvidia-curand" +version = "10.4.0.35" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", size = 61962106, upload-time = "2025-08-04T10:21:41.128Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", size = 59544258, upload-time = "2025-08-04T10:22:03.992Z" }, +] + +[[package]] +name = "nvidia-cusolver" +version = "12.0.4.66" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas", marker = "(python_full_version == '3.10.*' and sys_platform == 'emscripten') or (python_full_version == '3.10.*' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "nvidia-cusparse", marker = "(python_full_version == '3.10.*' and sys_platform == 'emscripten') or (python_full_version == '3.10.*' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(python_full_version == '3.10.*' and sys_platform == 'emscripten') or (python_full_version == '3.10.*' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", size = 200941980, upload-time = "2025-09-04T08:33:22.767Z" }, +] + +[[package]] +name = "nvidia-cusparse" +version = "12.6.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink", marker = "(python_full_version == '3.10.*' and sys_platform == 'emscripten') or (python_full_version == '3.10.*' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" }, + { url = "https://files.pythonhosted.org/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", size = 145942937, upload-time = "2025-09-04T08:33:58.029Z" }, +] + +[[package]] +name = "nvidia-cusparselt-cu13" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/e1/cdc1797eadf82d3a9a575a19b33fdc871a97edbec42c00b5b5e914f4aff4/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4dca476c50bf4780d46cd0bfbd82e2bc10a08e4fef7950917ce8d7578d22a23f", size = 221051344, upload-time = "2025-09-05T18:49:51.289Z" }, + { url = "https://files.pythonhosted.org/packages/34/7d/2661f2fb3ac4302f3a246f5fc030213ac60c1fe0bce84f9783dbd831dbb7/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:786ce87568c303fadb5afcc7102d454cd3040d75f6f8626f5db460d1871f4dd0", size = 170148586, upload-time = "2025-09-05T18:50:50.248Z" }, +] + +[[package]] +name = "nvidia-nccl-cu13" +version = "2.29.7" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/0d/daf50d44177ee0cbc7ff0a0c91eb5ff676c82be42f9a970bc7597f440c3a/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:674a12383e3c38a1bcccae7d4f3633b37852230b6047883cb2f4c2d1b36d9bf5", size = 206014712, upload-time = "2026-03-03T05:34:20.843Z" }, + { url = "https://files.pythonhosted.org/packages/67/f4/58e4e91b6919367c7aafb8e36fce9aad1a3047e536bf7e2fd560927d3a4c/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:edd81538446786ec3b73972543e53bb43bcaf0bfc8ef76cb679fcc390ffe136d", size = 205976000, upload-time = "2026-03-03T05:36:24.472Z" }, +] + +[[package]] +name = "nvidia-nvjitlink" +version = "13.3.33" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/ee/580ca6f29dcab0221db8706badca1bbbb084f1975c4d4e83329c3a7e31f0/nvidia_nvjitlink-13.3.33-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:26a6de7fb4c8fdaa7703d3dad720d6d427ddfea5c48a528fd97c11733ad830e5", size = 40742423, upload-time = "2026-05-26T16:54:51.613Z" }, + { url = "https://files.pythonhosted.org/packages/69/30/45414e35ff2eee7db3da037e5707037ccf9d2b5218ffbdb055ea4d5aa98a/nvidia_nvjitlink-13.3.33-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ce48b37dfeb3cb1eae4cf85adacb47d7a6539ea2272870c9a3628ce275c2037e", size = 39168635, upload-time = "2026-05-26T16:54:13.906Z" }, +] + +[[package]] +name = "nvidia-nvshmem-cu13" +version = "3.4.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/0f/05cc9c720236dcd2db9c1ab97fff629e96821be2e63103569da0c9b72f19/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dc2a197f38e5d0376ad52cd1a2a3617d3cdc150fd5966f4aee9bcebb1d68fe9", size = 60215947, upload-time = "2025-09-06T00:32:20.022Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/a9bf80a609e74e3b000fef598933235c908fcefcef9026042b8e6dfde2a9/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:290f0a2ee94c9f3687a02502f3b9299a9f9fe826e6d0287ee18482e78d495b80", size = 60412546, upload-time = "2025-09-06T00:32:41.564Z" }, +] + +[[package]] +name = "nvidia-nvtx" +version = "13.0.85" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", size = 148047, upload-time = "2025-09-04T08:29:01.761Z" }, + { url = "https://files.pythonhosted.org/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", size = 148878, upload-time = "2025-09-04T08:28:53.627Z" }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.43.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/cc/e4c9584181f86494df0f6bdec1a4f3280c50db44704dc2a407e994fc87bb/opentelemetry_api-1.43.0.tar.gz", hash = "sha256:107d0d03857ea8fc7c5fcbbbd83f800c281f0d560553d61c1d675fccfd1761c1", size = 73476, upload-time = "2026-06-24T15:19:55.323Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/83/6dba32b85f31868400440dc7ad2ca1eab94cbbf3a7b0459ed39f8311a9e2/opentelemetry_api-1.43.0-py3-none-any.whl", hash = "sha256:20acf45e9b21851926835292e4045d290acade1edd2ff3de86d2f069687ba1fd", size = 61912, upload-time = "2026-06-24T15:19:35.434Z" }, +] + +[[package]] +name = "opentelemetry-sdk" +version = "1.43.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api", marker = "python_full_version >= '3.10'" }, + { name = "opentelemetry-semantic-conventions", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/eb/5041074274ac0956b03637cc039d434569112468e875eddfcc9a0674ce06/opentelemetry_sdk-1.43.0.tar.gz", hash = "sha256:d8187c81c162df9913e4003dd6485f7390d9a24fc17026ec7387b8b8218b08e9", size = 254744, upload-time = "2026-06-24T15:20:08.467Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/e3/b17be23af124201c9f52eececd4cc8ddfed1597d37b4ee771895d325805c/opentelemetry_sdk-1.43.0-py3-none-any.whl", hash = "sha256:d1323a547c1ce69d6a069a17a44b7da82bb8b332051ecb074041f87642c86823", size = 178852, upload-time = "2026-06-24T15:19:52.169Z" }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.64b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/30/5f26df29509eccd86b99b481ac9ffa39da49ba9577cc69071c552ae30447/opentelemetry_semantic_conventions-0.64b0.tar.gz", hash = "sha256:72f76fb2d1582d9d033dd1fcd84532e961e6ff3d90d24ba6fabc72975a83864c", size = 148340, upload-time = "2026-06-24T15:20:09.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/ca/23ba87a221b574a7c5a99d48849d80bfe8b047624681357e2b002e566187/opentelemetry_semantic_conventions-0.64b0-py3-none-any.whl", hash = "sha256:ea77e85e354b8f604ddbe5f3d9135216f982fa4d77e5859ac30f6d8a50505aa6", size = 203713, upload-time = "2026-06-24T15:19:53.339Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "python-dateutil", marker = "python_full_version == '3.10.*'" }, + { name = "pytz", marker = "python_full_version == '3.10.*'" }, + { name = "tzdata", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, + { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, + { url = "https://files.pythonhosted.org/packages/56/b4/52eeb530a99e2a4c55ffcd352772b599ed4473a0f892d127f4147cf0f88e/pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2", size = 11567720, upload-time = "2025-09-29T23:33:06.209Z" }, + { url = "https://files.pythonhosted.org/packages/48/4a/2d8b67632a021bced649ba940455ed441ca854e57d6e7658a6024587b083/pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8", size = 10810302, upload-time = "2025-09-29T23:33:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/13/e6/d2465010ee0569a245c975dc6967b801887068bc893e908239b1f4b6c1ac/pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff", size = 12154874, upload-time = "2025-09-29T23:33:49.939Z" }, + { url = "https://files.pythonhosted.org/packages/1f/18/aae8c0aa69a386a3255940e9317f793808ea79d0a525a97a903366bb2569/pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29", size = 12790141, upload-time = "2025-09-29T23:34:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/f7/26/617f98de789de00c2a444fbe6301bb19e66556ac78cff933d2c98f62f2b4/pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73", size = 13208697, upload-time = "2025-09-29T23:34:21.835Z" }, + { url = "https://files.pythonhosted.org/packages/b9/fb/25709afa4552042bd0e15717c75e9b4a2294c3dc4f7e6ea50f03c5136600/pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9", size = 13879233, upload-time = "2025-09-29T23:34:35.079Z" }, + { url = "https://files.pythonhosted.org/packages/98/af/7be05277859a7bc399da8ba68b88c96b27b48740b6cf49688899c6eb4176/pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa", size = 11359119, upload-time = "2025-09-29T23:34:46.339Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, + { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/16/b5c76b838fd9bf6ce84d3a53346b8874ec05c5f0040d75ef2c320100cd2a/pandas-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:455f6f8139d4282188f526868dbc3c828470e88a3d9d59a891bd46a455f21b98", size = 10338495, upload-time = "2026-05-11T18:52:11.558Z" }, + { url = "https://files.pythonhosted.org/packages/5a/b0/a4ffc4ae74d2d822200dcc46898987d8eb6032d1e2b219cae39da6f5cbcc/pandas-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e15135e2ee5df1063313e2425ceef8ac0f4ae775893815b0923651b806a5639", size = 9938250, upload-time = "2026-05-11T18:52:17.005Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b2/3323601a52caee42c019e370090ca4544b241437240ca04f786cce82b0cf/pandas-3.0.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05f1f1752b8533ea03f7f39a9c15b1a058d067bb48f4748948e7a8691e0510f2", size = 10770558, upload-time = "2026-05-11T18:52:19.865Z" }, + { url = "https://files.pythonhosted.org/packages/32/f1/bbecd2f867b97abebe0f9b53d750f862251b40337e061b36676ded3d920f/pandas-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a1e45c80cceb3b4a21bc5939d52e8cbd8d9b7305309219d59e9754d9ce09e27", size = 11274611, upload-time = "2026-05-11T18:52:22.622Z" }, + { url = "https://files.pythonhosted.org/packages/7f/4f/eafabf2d5fae5adf143b4d18d3706c5efdc368a7c4eb1ee8a3eddabbd0f6/pandas-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:14da8316da4d0c5a77618425996bfb1248ca87fc2c1486e6fde4652bd18b5824", size = 11784670, upload-time = "2026-05-11T18:52:25.4Z" }, + { url = "https://files.pythonhosted.org/packages/49/44/1eb20389301b57b19cc099a1c2f662501f72f08a65f912d05822613c1532/pandas-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a55066a0505dae0ba2b50a46637db34b46f9094c65c5d4800794ef6335010938", size = 12353708, upload-time = "2026-05-11T18:52:28.139Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/c321f13b5ba1819fc8dca456c7fce578da2dcfecff1abbf0eaddf8406c0f/pandas-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6674ab18ad8c57802867264b00e15e7bb904700cdd9046e3b2fa1fce237439ea", size = 9907609, upload-time = "2026-05-11T18:52:30.982Z" }, + { url = "https://files.pythonhosted.org/packages/53/85/1b7f563ebc6357c27233a02a96b589bcce1fa9c6eb89fb4f0e56421d277e/pandas-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:5cc09a68b3120e0f54870dede8287a7bb1fa463907e4fcec1ea77cab6179bf7a", size = 9165596, upload-time = "2026-05-11T18:52:33.334Z" }, + { url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" }, + { url = "https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9", size = 10894600, upload-time = "2026-05-11T18:52:45.02Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/2eb28f2fccb4ced4a2c79ab2a5dee9ade1ebf44922ebad6fea158c9f95d4/pandas-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e65d5407dc0b394f509699650e4a2ec01c0514f21850f453fa60f3be79a5dbf", size = 11422824, upload-time = "2026-05-11T18:52:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/f8/45/830bb57f533a4604b355e07edcb8ea18cf88b5f94e5fca92f27052d7c597/pandas-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c", size = 11950889, upload-time = "2026-05-11T18:52:50.905Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/fc1b368f303087d20e8c9bf3d6ceb186263cfac0ade735cd938538bea839/pandas-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c7be265b62cef88e253a941e4698604973736dcfe242fdb5198f0f7bc473cdcc", size = 9755463, upload-time = "2026-05-11T18:52:53.386Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/fda8f9705b1b09c6ebe14bfc0fa0e4ec8584d54ea673628f157ff55131af/pandas-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:557409bc4178e70ee8d9ddb494798e51ebf6ea59330f6be22c51bab2a7db6c49", size = 9066158, upload-time = "2026-05-11T18:52:56.038Z" }, + { url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/2c/20/559ace4200982c3887d0b86bfd0d856a2143ef8ddab63cc07934951a964c/pandas-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:a82d532a3351d435432cd913edbccaf8b8e01d4dd0e5ced5a8d2e8ecd94c7e44", size = 9757091, upload-time = "2026-05-11T18:53:16.306Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/69055a09fe200f29f922a3eeec4804611900b95f52d932ece3393c3c0c19/pandas-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:275c14e0fce14a2ec20eee474aecd305478ea3c1e6f6a9d8fe219a165542717e", size = 9057282, upload-time = "2026-05-11T18:53:18.768Z" }, + { url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" }, + { url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" }, + { url = "https://files.pythonhosted.org/packages/45/a4/865e0e510cae5fc2194de4db28be638952de942571ba9125934fd9c01d47/pandas-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:08d789b41f87e0905880e293cedf6197ce71fe67cc081358b1e148a491b9bd13", size = 10499958, upload-time = "2026-05-11T18:53:37.857Z" }, + { url = "https://files.pythonhosted.org/packages/86/54/effdcc3c0ff7a08037889200e148ebe94c16c4f653be078c7b3675955df1/pandas-3.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3650109c0f22879df8bd6179ab9ee3d7f1d1d4e7e0094a3f0032d9f51e2e64ac", size = 10336065, upload-time = "2026-05-11T18:53:41.099Z" }, + { url = "https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f", size = 9926101, upload-time = "2026-05-11T18:53:43.515Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/e35cf11c8a136e757b956f5f0efdcaa50aecde85ea055f1898dfc68262f3/pandas-3.0.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba7e08b9ac1d54569cd1e256e3668975ed624d6826f7b68df0342b012007bddb", size = 10457553, upload-time = "2026-05-11T18:53:46.394Z" }, + { url = "https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a", size = 10914065, upload-time = "2026-05-11T18:53:49.134Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/1ef644445fcd72e3627bceec77e3560636f87ddce4ed841afe76b83b5bf9/pandas-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360", size = 11459188, upload-time = "2026-05-11T18:53:52.527Z" }, + { url = "https://files.pythonhosted.org/packages/7e/49/4d8d4f42cbc9c4adc7a1870f269c02cbd6cd40d059622c06fb298addcbad/pandas-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:335f62418ed562cfc3c49e9e196375c28b729dcef8543abf4f9438e381bf3c76", size = 11982966, upload-time = "2026-05-11T18:53:55.043Z" }, + { url = "https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5", size = 9876755, upload-time = "2026-05-11T18:53:58.067Z" }, + { url = "https://files.pythonhosted.org/packages/2a/af/33c469653b0ba03b50c3a98192d4c07f0c75c66b263ceb097fce0ee97d31/pandas-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:a2d2dff8a04f3917b55ab3910c32990f8ddf7eceba114947838cefa976a68977", size = 9198658, upload-time = "2026-05-11T18:54:00.733Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fa/b8c257bd76b8bd060c3a9151c1fca05e9b9c5e3af5d0f549c0356f6d143d/pandas-3.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0d589105b3c14645af1738ff279b2995102d8f7a03b0a66dc8d95550eb513e04", size = 10787242, upload-time = "2026-05-11T18:54:03.564Z" }, + { url = "https://files.pythonhosted.org/packages/54/eb/f19206ffb0bf1919002969aa448b4702c6594845156a6f8050674855aac3/pandas-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13fc1e853d9e04743d11ba75a985ccbc2a317fe07d8af61e445a6fd24dacd6a6", size = 10436369, upload-time = "2026-05-11T18:54:06.311Z" }, + { url = "https://files.pythonhosted.org/packages/fd/24/c7c39fb4fe22b71a0c2d78bf0c585c600092d85f94f086d2b3b2f6ca27e2/pandas-3.0.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:819959dab7bbd0049c15623fbac4e29a191b9528160a61fb1032242d8ced2d9c", size = 10358306, upload-time = "2026-05-11T18:54:09.085Z" }, + { url = "https://files.pythonhosted.org/packages/16/ec/dd2a9eb7fa1204df88c0864164e35b228ac581062ac612ba0a67fd812e4c/pandas-3.0.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60ae316d3fd75d1858d450d0db0103ea2be3e7d4a95ec2f064f7e2ae63f7b028", size = 10758394, upload-time = "2026-05-11T18:54:11.956Z" }, + { url = "https://files.pythonhosted.org/packages/95/6e/00c61ea8e85b4f6d8d35e11852a1a4998fc7fafc91c6a602d1cc9c972d64/pandas-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd3a518890b400d32f9023722dc9a9a5c969f00b415419a3c06c043f09bb5d7d", size = 11375717, upload-time = "2026-05-11T18:54:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/31/89/8fc1c268969fac43688d65fd92e67df24bd128d53cb4d2eee534cd307399/pandas-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c39be2d709d01fa972a0cabc522389fceca4f3969332ba25a7d6c5802cf976a", size = 11828897, upload-time = "2026-05-11T18:54:17.146Z" }, + { url = "https://files.pythonhosted.org/packages/56/3b/e7d20dea247a3e6dc0bd8a6953854afbedc03951def4e7371e05e7263e25/pandas-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4db8c527972a821cf5286b40ccc57642a39bc62e62022b42f99f8a67fca8c3a1", size = 10900855, upload-time = "2026-05-11T18:54:19.72Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/68a0978d1ef8502b8492099beaa6e7a0c1b32e3b5d4f677f5810cb08711c/pandas-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b2c95f8bfc1ee412bf482605d7bfd30c12d1d26bd59fdd91efeef1d4718decb1", size = 9466464, upload-time = "2026-05-11T18:54:22.754Z" }, +] + +[[package]] +name = "parso" +version = "0.8.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "(python_full_version == '3.10.*' and sys_platform == 'emscripten') or (python_full_version == '3.10.*' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'emscripten' and sys_platform != 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "probing" +version = "0.2.5" +source = { editable = "." } + +[package.optional-dependencies] +dev = [ + { name = "coverage", marker = "python_full_version >= '3.10'" }, + { name = "ipykernel", marker = "python_full_version >= '3.10'" }, + { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "ipython", version = "9.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "maturin", marker = "python_full_version >= '3.10'" }, + { name = "pytest", marker = "python_full_version >= '3.10'" }, + { name = "pytest-cov", marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "ruff", marker = "python_full_version >= '3.10'" }, +] +otel = [ + { name = "opentelemetry-api", marker = "python_full_version >= '3.10'" }, + { name = "opentelemetry-sdk", marker = "python_full_version >= '3.10'" }, +] +test = [ + { name = "coverage", marker = "python_full_version >= '3.10'" }, + { name = "ipykernel", marker = "python_full_version >= '3.10'" }, + { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "ipython", version = "9.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pytest", marker = "python_full_version >= '3.10'" }, + { name = "pytest-cov", marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, +] + +[package.dev-dependencies] +build = [ + { name = "build", marker = "python_full_version >= '3.10'" }, + { name = "maturin", marker = "python_full_version >= '3.10'" }, + { name = "toml", marker = "python_full_version >= '3.10'" }, + { name = "wheel", marker = "python_full_version >= '3.10'" }, +] +dev = [ + { name = "coverage", marker = "python_full_version >= '3.10'" }, + { name = "ipykernel", marker = "python_full_version >= '3.10'" }, + { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "ipython", version = "9.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pytest", marker = "python_full_version >= '3.10'" }, + { name = "pytest-cov", marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "ruff", marker = "python_full_version >= '3.10'" }, +] +wheel-test = [ + { name = "coverage", marker = "python_full_version >= '3.10'" }, + { name = "ipykernel", marker = "python_full_version >= '3.10'" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pytest", marker = "python_full_version >= '3.10'" }, + { name = "pytest-cov", marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "torch", marker = "python_full_version >= '3.10'" }, + { name = "websockets", marker = "python_full_version >= '3.10'" }, +] + +[package.metadata] +requires-dist = [ + { name = "coverage", marker = "extra == 'dev'", specifier = ">=7.0" }, + { name = "coverage", marker = "extra == 'test'", specifier = ">=7.0" }, + { name = "ipykernel", marker = "extra == 'dev'", specifier = ">=6.0" }, + { name = "ipykernel", marker = "extra == 'test'", specifier = ">=6.0" }, + { name = "ipython", marker = "extra == 'dev'", specifier = ">=8.0" }, + { name = "ipython", marker = "extra == 'test'", specifier = ">=8.0" }, + { name = "maturin", marker = "extra == 'dev'", specifier = ">=1.0,<2.0" }, + { name = "opentelemetry-api", marker = "extra == 'otel'", specifier = ">=1.20" }, + { name = "opentelemetry-sdk", marker = "extra == 'otel'", specifier = ">=1.20" }, + { name = "pytest", marker = "python_full_version >= '3.8' and extra == 'dev'", specifier = ">=8.0" }, + { name = "pytest", marker = "python_full_version >= '3.8' and extra == 'test'", specifier = ">=8.0" }, + { name = "pytest", marker = "python_full_version < '3.8' and extra == 'dev'", specifier = "<8.0" }, + { name = "pytest", marker = "python_full_version < '3.8' and extra == 'test'", specifier = "<8.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0" }, + { name = "pytest-cov", marker = "extra == 'test'", specifier = ">=4.0" }, + { name = "pyyaml", marker = "extra == 'dev'", specifier = ">=6" }, + { name = "pyyaml", marker = "extra == 'test'", specifier = ">=6" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.1.0" }, +] +provides-extras = ["otel", "test", "dev"] + +[package.metadata.requires-dev] +build = [ + { name = "build" }, + { name = "maturin", specifier = ">=1.0,<2.0" }, + { name = "toml" }, + { name = "wheel" }, +] +dev = [ + { name = "coverage", specifier = ">=7.0" }, + { name = "ipykernel", specifier = ">=6.0" }, + { name = "ipython", marker = "python_full_version >= '3.8'", specifier = ">=8.0" }, + { name = "pytest", marker = "python_full_version < '3.8'", specifier = "<8.0" }, + { name = "pytest", marker = "python_full_version >= '3.8'", specifier = ">=8.0" }, + { name = "pytest-cov", specifier = ">=4.0" }, + { name = "pyyaml", specifier = ">=6" }, + { name = "ruff", specifier = ">=0.1.0" }, +] +wheel-test = [ + { name = "coverage", specifier = ">=7.0" }, + { name = "ipykernel", specifier = ">=6.0" }, + { name = "pandas" }, + { name = "pytest", marker = "python_full_version >= '3.8'", specifier = ">=8.0" }, + { name = "pytest-cov", specifier = ">=4.0" }, + { name = "pyyaml", specifier = ">=6" }, + { name = "torch" }, + { name = "websockets" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, + { name = "iniconfig", marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pluggy", marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"], marker = "python_full_version >= '3.10'" }, + { name = "pluggy", marker = "python_full_version >= '3.10'" }, + { name = "pytest", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytz" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/a2/09f67a3589cb4320fb5ce90d3fd4c9752636b8b6ad8f34b54d76c5a54693/PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f", size = 186824, upload-time = "2025-09-29T20:27:35.918Z" }, + { url = "https://files.pythonhosted.org/packages/02/72/d972384252432d57f248767556ac083793292a4adf4e2d85dfe785ec2659/PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4", size = 795069, upload-time = "2025-09-29T20:27:38.15Z" }, + { url = "https://files.pythonhosted.org/packages/a7/3b/6c58ac0fa7c4e1b35e48024eb03d00817438310447f93ef4431673c24138/PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3", size = 862585, upload-time = "2025-09-29T20:27:39.715Z" }, + { url = "https://files.pythonhosted.org/packages/25/a2/b725b61ac76a75583ae7104b3209f75ea44b13cfd026aa535ece22b7f22e/PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6", size = 806018, upload-time = "2025-09-29T20:27:41.444Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b0/b2227677b2d1036d84f5ee95eb948e7af53d59fe3e4328784e4d290607e0/PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369", size = 802822, upload-time = "2025-09-29T20:27:42.885Z" }, + { url = "https://files.pythonhosted.org/packages/99/a5/718a8ea22521e06ef19f91945766a892c5ceb1855df6adbde67d997ea7ed/PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295", size = 143744, upload-time = "2025-09-29T20:27:44.487Z" }, + { url = "https://files.pythonhosted.org/packages/76/b2/2b69cee94c9eb215216fc05778675c393e3aa541131dc910df8e52c83776/PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b", size = 160082, upload-time = "2025-09-29T20:27:46.049Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, + { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload-time = "2025-09-25T21:33:00.618Z" }, + { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload-time = "2025-09-25T21:33:02.086Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload-time = "2025-09-25T21:33:03.25Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload-time = "2025-09-25T21:33:05.014Z" }, + { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload-time = "2025-09-25T21:33:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload-time = "2025-09-25T21:33:08.708Z" }, + { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload-time = "2025-09-25T21:33:09.876Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload-time = "2025-09-25T21:33:10.983Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "python_full_version >= '3.10' and implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/b9/52aa9ec2867528b54f1e60846728d8b4d84726630874fee3a91e66c7df81/pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4", size = 1329850, upload-time = "2025-09-08T23:07:26.274Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/5653e7b7425b169f994835a2b2abf9486264401fdef18df91ddae47ce2cc/pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556", size = 906380, upload-time = "2025-09-08T23:07:29.78Z" }, + { url = "https://files.pythonhosted.org/packages/73/78/7d713284dbe022f6440e391bd1f3c48d9185673878034cfb3939cdf333b2/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b", size = 666421, upload-time = "2025-09-08T23:07:31.263Z" }, + { url = "https://files.pythonhosted.org/packages/30/76/8f099f9d6482450428b17c4d6b241281af7ce6a9de8149ca8c1c649f6792/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e", size = 854149, upload-time = "2025-09-08T23:07:33.17Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/37fbfff06c68016019043897e4c969ceab18bde46cd2aca89821fcf4fb2e/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526", size = 1655070, upload-time = "2025-09-08T23:07:35.205Z" }, + { url = "https://files.pythonhosted.org/packages/47/14/7254be73f7a8edc3587609554fcaa7bfd30649bf89cd260e4487ca70fdaa/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1", size = 2033441, upload-time = "2025-09-08T23:07:37.432Z" }, + { url = "https://files.pythonhosted.org/packages/22/dc/49f2be26c6f86f347e796a4d99b19167fc94503f0af3fd010ad262158822/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386", size = 1891529, upload-time = "2025-09-08T23:07:39.047Z" }, + { url = "https://files.pythonhosted.org/packages/a3/3e/154fb963ae25be70c0064ce97776c937ecc7d8b0259f22858154a9999769/pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda", size = 567276, upload-time = "2025-09-08T23:07:40.695Z" }, + { url = "https://files.pythonhosted.org/packages/62/b2/f4ab56c8c595abcb26b2be5fd9fa9e6899c1e5ad54964e93ae8bb35482be/pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f", size = 632208, upload-time = "2025-09-08T23:07:42.298Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e3/be2cc7ab8332bdac0522fdb64c17b1b6241a795bee02e0196636ec5beb79/pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32", size = 559766, upload-time = "2025-09-08T23:07:43.869Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86", size = 1333328, upload-time = "2025-09-08T23:07:45.946Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a0/fc7e78a23748ad5443ac3275943457e8452da67fda347e05260261108cbc/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581", size = 908803, upload-time = "2025-09-08T23:07:47.551Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/37d15eb05f3bdfa4abea6f6d96eb3bb58585fbd3e4e0ded4e743bc650c97/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f", size = 668836, upload-time = "2025-09-08T23:07:49.436Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e", size = 857038, upload-time = "2025-09-08T23:07:51.234Z" }, + { url = "https://files.pythonhosted.org/packages/cb/eb/bfdcb41d0db9cd233d6fb22dc131583774135505ada800ebf14dfb0a7c40/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e", size = 1657531, upload-time = "2025-09-08T23:07:52.795Z" }, + { url = "https://files.pythonhosted.org/packages/ab/21/e3180ca269ed4a0de5c34417dfe71a8ae80421198be83ee619a8a485b0c7/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2", size = 2034786, upload-time = "2025-09-08T23:07:55.047Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b1/5e21d0b517434b7f33588ff76c177c5a167858cc38ef740608898cd329f2/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394", size = 1894220, upload-time = "2025-09-08T23:07:57.172Z" }, + { url = "https://files.pythonhosted.org/packages/03/f2/44913a6ff6941905efc24a1acf3d3cb6146b636c546c7406c38c49c403d4/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f", size = 567155, upload-time = "2025-09-08T23:07:59.05Z" }, + { url = "https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97", size = 633428, upload-time = "2025-09-08T23:08:00.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/14/01afebc96c5abbbd713ecfc7469cfb1bc801c819a74ed5c9fad9a48801cb/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07", size = 559497, upload-time = "2025-09-08T23:08:02.15Z" }, + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/946ecde123eaffe933ecf287186495d5f22a8bf444bcb774d9c83dcb2fa5/pyzmq-27.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:18339186c0ed0ce5835f2656cdfb32203125917711af64da64dbaa3d949e5a1b", size = 1332188, upload-time = "2025-09-08T23:09:03.639Z" }, + { url = "https://files.pythonhosted.org/packages/56/08/5960fd162bf1e0e22f251c2f7744101241bc419fbc52abab4108260eb3e0/pyzmq-27.1.0-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:753d56fba8f70962cd8295fb3edb40b9b16deaa882dd2b5a3a2039f9ff7625aa", size = 907319, upload-time = "2025-09-08T23:09:06.079Z" }, + { url = "https://files.pythonhosted.org/packages/7f/62/2d8712aafbd7fcf0e303d67c1d923f64a41aa872f1348e3d5dcec147c909/pyzmq-27.1.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b721c05d932e5ad9ff9344f708c96b9e1a485418c6618d765fca95d4daacfbef", size = 864213, upload-time = "2025-09-08T23:09:07.985Z" }, + { url = "https://files.pythonhosted.org/packages/e1/04/e9a1550d2dcb29cd662d88c89e9fe975393dd577e2c8b2c528d0a0bacfac/pyzmq-27.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be883ff3d722e6085ee3f4afc057a50f7f2e0c72d289fd54df5706b4e3d3a50", size = 668520, upload-time = "2025-09-08T23:09:10.317Z" }, + { url = "https://files.pythonhosted.org/packages/48/ad/1638518b7554686d17b5fdd0c0381c13656fe4899dc13af0ba10850d56f0/pyzmq-27.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e592db3a93128daf567de9650a2f3859017b3f7a66bc4ed6e4779d6034976f", size = 1657582, upload-time = "2025-09-08T23:09:12.256Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b7/6cb8123ee217c1efa8e917feabe86425185a7b55504af32bffa057dcd91d/pyzmq-27.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad68808a61cbfbbae7ba26d6233f2a4aa3b221de379ce9ee468aa7a83b9c36b0", size = 2035054, upload-time = "2025-09-08T23:09:14.175Z" }, + { url = "https://files.pythonhosted.org/packages/cb/95/8d6ec87b43e1d8608be461165180fec4744da9edceea4ce48c7bd8c60402/pyzmq-27.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e2687c2d230e8d8584fbea433c24382edfeda0c60627aca3446aa5e58d5d1831", size = 1894186, upload-time = "2025-09-08T23:09:15.797Z" }, + { url = "https://files.pythonhosted.org/packages/a7/2a/7806479dd1f1b964d0aa07f1d961fcaa8673ed543c911847fc45e91f103a/pyzmq-27.1.0-cp38-cp38-win32.whl", hash = "sha256:a1aa0ee920fb3825d6c825ae3f6c508403b905b698b6460408ebd5bb04bbb312", size = 567508, upload-time = "2025-09-08T23:09:17.514Z" }, + { url = "https://files.pythonhosted.org/packages/9f/24/70e83d3ff64ef7e3d6666bd30a241be695dad0ef30d5519bf9c5ff174786/pyzmq-27.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:df7cd397ece96cf20a76fae705d40efbab217d217897a5053267cd88a700c266", size = 632740, upload-time = "2025-09-08T23:09:19.352Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4e/782eb6df91b6a9d9afa96c2dcfc5cac62562a68eb62a02210101f886014d/pyzmq-27.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:96c71c32fff75957db6ae33cd961439f386505c6e6b377370af9b24a1ef9eafb", size = 1330426, upload-time = "2025-09-08T23:09:21.03Z" }, + { url = "https://files.pythonhosted.org/packages/8d/ca/2b8693d06b1db4e0c084871e4c9d7842b561d0a6ff9d780640f5e3e9eb55/pyzmq-27.1.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:49d3980544447f6bd2968b6ac913ab963a49dcaa2d4a2990041f16057b04c429", size = 906559, upload-time = "2025-09-08T23:09:22.983Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b3/b99b39e2cfdcebd512959780e4d299447fd7f46010b1d88d63324e2481ec/pyzmq-27.1.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:849ca054d81aa1c175c49484afaaa5db0622092b5eccb2055f9f3bb8f703782d", size = 863816, upload-time = "2025-09-08T23:09:24.556Z" }, + { url = "https://files.pythonhosted.org/packages/61/b2/018fa8e8eefb34a625b1a45e2effcbc9885645b22cdd0a68283f758351e7/pyzmq-27.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3970778e74cb7f85934d2b926b9900e92bfe597e62267d7499acc39c9c28e345", size = 666735, upload-time = "2025-09-08T23:09:26.297Z" }, + { url = "https://files.pythonhosted.org/packages/01/05/8ae778f7cd7c94030731ae2305e6a38f3a333b6825f56c0c03f2134ccf1b/pyzmq-27.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:da96ecdcf7d3919c3be2de91a8c513c186f6762aa6cf7c01087ed74fad7f0968", size = 1655425, upload-time = "2025-09-08T23:09:28.172Z" }, + { url = "https://files.pythonhosted.org/packages/ad/ad/d69478a97a3f3142f9dbbbd9daa4fcf42541913a85567c36d4cfc19b2218/pyzmq-27.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9541c444cfe1b1c0156c5c86ece2bb926c7079a18e7b47b0b1b3b1b875e5d098", size = 2033729, upload-time = "2025-09-08T23:09:30.097Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6d/e3c6ad05bc1cddd25094e66cc15ae8924e15c67e231e93ed2955c401007e/pyzmq-27.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e30a74a39b93e2e1591b58eb1acef4902be27c957a8720b0e368f579b82dc22f", size = 1891803, upload-time = "2025-09-08T23:09:31.875Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a7/97e8be0daaca157511563160b67a13d4fe76b195e3fa6873cb554ad46be3/pyzmq-27.1.0-cp39-cp39-win32.whl", hash = "sha256:b1267823d72d1e40701dcba7edc45fd17f71be1285557b7fe668887150a14b78", size = 567627, upload-time = "2025-09-08T23:09:33.98Z" }, + { url = "https://files.pythonhosted.org/packages/5c/91/70bbf3a7c5b04c904261ef5ba224d8a76315f6c23454251bf5f55573a8a1/pyzmq-27.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c996ded912812a2fcd7ab6574f4ad3edc27cb6510349431e4930d4196ade7db", size = 632315, upload-time = "2025-09-08T23:09:36.097Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b5/a4173a83c7fd37f6bdb5a800ea338bc25603284e9ef8681377cec006ede4/pyzmq-27.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:346e9ba4198177a07e7706050f35d733e08c1c1f8ceacd5eb6389d653579ffbc", size = 559833, upload-time = "2025-09-08T23:09:38.183Z" }, + { url = "https://files.pythonhosted.org/packages/f3/81/a65e71c1552f74dec9dff91d95bafb6e0d33338a8dfefbc88aa562a20c92/pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6", size = 836266, upload-time = "2025-09-08T23:09:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/58/ed/0202ca350f4f2b69faa95c6d931e3c05c3a397c184cacb84cb4f8f42f287/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90", size = 800206, upload-time = "2025-09-08T23:09:41.902Z" }, + { url = "https://files.pythonhosted.org/packages/47/42/1ff831fa87fe8f0a840ddb399054ca0009605d820e2b44ea43114f5459f4/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62", size = 567747, upload-time = "2025-09-08T23:09:43.741Z" }, + { url = "https://files.pythonhosted.org/packages/d1/db/5c4d6807434751e3f21231bee98109aa57b9b9b55e058e450d0aef59b70f/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74", size = 747371, upload-time = "2025-09-08T23:09:45.575Z" }, + { url = "https://files.pythonhosted.org/packages/26/af/78ce193dbf03567eb8c0dc30e3df2b9e56f12a670bf7eb20f9fb532c7e8a/pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba", size = 544862, upload-time = "2025-09-08T23:09:47.448Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c6/c4dcdecdbaa70969ee1fdced6d7b8f60cfabe64d25361f27ac4665a70620/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066", size = 836265, upload-time = "2025-09-08T23:09:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/3e/79/f38c92eeaeb03a2ccc2ba9866f0439593bb08c5e3b714ac1d553e5c96e25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604", size = 800208, upload-time = "2025-09-08T23:09:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/49/0e/3f0d0d335c6b3abb9b7b723776d0b21fa7f3a6c819a0db6097059aada160/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c", size = 567747, upload-time = "2025-09-08T23:09:52.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cf/f2b3784d536250ffd4be70e049f3b60981235d70c6e8ce7e3ef21e1adb25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271", size = 747371, upload-time = "2025-09-08T23:09:54.563Z" }, + { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d8/2cf36ee6d037b52640997bde488d046db55bdea05e34229cf9cd3154fd7d/pyzmq-27.1.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:50081a4e98472ba9f5a02850014b4c9b629da6710f8f14f3b15897c666a28f1b", size = 836250, upload-time = "2025-09-08T23:09:58.313Z" }, + { url = "https://files.pythonhosted.org/packages/e5/40/5ff9acff898558fb54731d4b897d5bf16b3725e0c1778166ac9a234b5297/pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:510869f9df36ab97f89f4cff9d002a89ac554c7ac9cadd87d444aa4cf66abd27", size = 800201, upload-time = "2025-09-08T23:10:00.131Z" }, + { url = "https://files.pythonhosted.org/packages/2f/58/f941950f64c5e7919c64d36e52991ade7ac8ea4805e9d2cdba47337d9edc/pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f8426a01b1c4098a750973c37131cf585f61c7911d735f729935a0c701b68d3", size = 758755, upload-time = "2025-09-08T23:10:01.896Z" }, + { url = "https://files.pythonhosted.org/packages/7b/26/ddd3502658bf85d41ab6d75dcab78a7af5bb32fb5f7ac38bd7cf1bce321d/pyzmq-27.1.0-pp38-pypy38_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726b6a502f2e34c6d2ada5e702929586d3ac948a4dbbb7fed9854ec8c0466027", size = 567742, upload-time = "2025-09-08T23:10:03.732Z" }, + { url = "https://files.pythonhosted.org/packages/36/ad/50515db14fb3c19d48a2a05716c7f4d658da51ea2b145c67f003b3f443d2/pyzmq-27.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:bd67e7c8f4654bef471c0b1ca6614af0b5202a790723a58b79d9584dc8022a78", size = 544859, upload-time = "2025-09-08T23:10:05.491Z" }, + { url = "https://files.pythonhosted.org/packages/57/f4/c2e978cf6b833708bad7d6396c3a20c19750585a1775af3ff13c435e1912/pyzmq-27.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:722ea791aa233ac0a819fc2c475e1292c76930b31f1d828cb61073e2fe5e208f", size = 836257, upload-time = "2025-09-08T23:10:07.635Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5f/4e10c7f57a4c92ab0fbb2396297aa8d618e6f5b9b8f8e9756d56f3e6fc52/pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:01f9437501886d3a1dd4b02ef59fb8cc384fa718ce066d52f175ee49dd5b7ed8", size = 800203, upload-time = "2025-09-08T23:10:09.436Z" }, + { url = "https://files.pythonhosted.org/packages/19/72/a74a007cd636f903448c6ab66628104b1fc5f2ba018733d5eabb94a0a6fb/pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4a19387a3dddcc762bfd2f570d14e2395b2c9701329b266f83dd87a2b3cbd381", size = 758756, upload-time = "2025-09-08T23:10:11.733Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d4/30c25b91f2b4786026372f5ef454134d7f576fcf4ac58539ad7dd5de4762/pyzmq-27.1.0-pp39-pypy39_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c618fbcd069e3a29dcd221739cacde52edcc681f041907867e0f5cc7e85f172", size = 567742, upload-time = "2025-09-08T23:10:14.732Z" }, + { url = "https://files.pythonhosted.org/packages/92/aa/ee86edad943438cd0316964020c4b6d09854414f9f945f8e289ea6fcc019/pyzmq-27.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff8d114d14ac671d88c89b9224c63d6c4e5a613fe8acd5594ce53d752a3aafe9", size = 544857, upload-time = "2025-09-08T23:10:16.431Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens", marker = "python_full_version >= '3.10'" }, + { name = "executing", marker = "python_full_version >= '3.10'" }, + { name = "pure-eval", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "toml" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "torch" +version = "2.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-bindings", marker = "python_full_version >= '3.10' and python_full_version < '3.15' and sys_platform == 'linux'" }, + { name = "cuda-toolkit", extra = ["cublas", "cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "python_full_version >= '3.10' and sys_platform == 'linux'" }, + { name = "filelock", marker = "python_full_version >= '3.10'" }, + { name = "fsspec", marker = "python_full_version >= '3.10'" }, + { name = "jinja2", marker = "python_full_version >= '3.10'" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "nvidia-cudnn-cu13", marker = "python_full_version >= '3.10' and sys_platform == 'linux'" }, + { name = "nvidia-cusparselt-cu13", marker = "python_full_version >= '3.10' and sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu13", marker = "python_full_version >= '3.10' and sys_platform == 'linux'" }, + { name = "nvidia-nvshmem-cu13", marker = "python_full_version >= '3.10' and sys_platform == 'linux'" }, + { name = "setuptools", marker = "python_full_version >= '3.10'" }, + { name = "sympy", marker = "python_full_version >= '3.10'" }, + { name = "triton", marker = "python_full_version >= '3.10' and python_full_version < '3.15' and sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/e7/19894fdb51c7dbaf94f5a79bb0871da0992e8e4241e579cb006da46d2e58/torch-2.13.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:94f0de129916f77b8dc2c7a8eff644cfeddfe59e39c9f55e9f6e17543410281d", size = 111178962, upload-time = "2026-07-08T16:05:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5c/b1d5de470c54e339b30a92d96683a71bcebd78f5f2a7fc714cd6dc6bbd68/torch-2.13.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:0ab4b69f3ee03a62a002cfbf77b1ca5e88aceb4ea64cb4388bb28f638ddbb045", size = 427198333, upload-time = "2026-07-08T16:05:36.847Z" }, + { url = "https://files.pythonhosted.org/packages/50/c0/68a84105e1fcb8970144b388ff3d3e5dc15a3be28c1e247841f7d7247e41/torch-2.13.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c78b7b4d04461855a764cf01bae9a462bb88bc93defcfa11235cbc8fdf3e12c4", size = 526555154, upload-time = "2026-07-08T16:05:06.507Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c9/0bb9d097b03cbaf96bb75b15e867347b8e41bfcdfe0539452d17d9e63993/torch-2.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:2bd30b6b730d987fa386ce3898933762c5cb8cc82eb0535211d787cc3ce2dfeb", size = 122015602, upload-time = "2026-07-08T16:05:45.25Z" }, + { url = "https://files.pythonhosted.org/packages/5b/fe/cba54dc58523434919b66f13a667e36e436deddd77ca519e96553617d4ec/torch-2.13.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:e76f9bcecc52b8ff711239a2f7547d5353df95878ab232f0773c1d95928b92f8", size = 111187938, upload-time = "2026-07-08T16:05:17.065Z" }, + { url = "https://files.pythonhosted.org/packages/c2/59/1e3160e18e12aa3038390efab3ce02b36a9d4d6a527ecdd8520dca2e68d8/torch-2.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:092790c696a760c729fd5722835f50b9d81fd7c8f141571f3f3cf4081a8f664c", size = 427199369, upload-time = "2026-07-08T16:04:51.054Z" }, + { url = "https://files.pythonhosted.org/packages/01/79/1f2d34ad7034ee1c7ffc1cf8bf0f8213af2a81df6ecdb3997ecec107c09d/torch-2.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60fcdcb2f3876e21146cb4524ef06397d727ca9ad5f020818547e25075fe3cb7", size = 526574961, upload-time = "2026-07-08T16:04:07.075Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fd/0f2ce40f58aefbdb3392f9acce3c8171940943ae2d661f70558bfa73befb/torch-2.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:a0d8b11f16a48d60e2015d8213aa0390744cbebb98e58b62b3514dddc656e330", size = 122015870, upload-time = "2026-07-08T16:05:27.59Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3a/ed0f4d4d1dcde03bced7aac9a28e800abcdc0cbd06b6775044c9fbd877b7/torch-2.13.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2fe228aba290d14b9f31b049be550dbd469c3fd3013d7a19705b30454da97027", size = 111213045, upload-time = "2026-07-08T16:05:22.997Z" }, + { url = "https://files.pythonhosted.org/packages/df/a9/f6a2a4d763ff1df02e9a64c477029db614295bc9367f4131223791ccc243/torch-2.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:572df8be8ffb4599c88cbd6a0726f1f854f4da65d2e3c09f0e2c2283333cd6d4", size = 427210998, upload-time = "2026-07-08T16:04:37.708Z" }, + { url = "https://files.pythonhosted.org/packages/f3/82/fea946351658e6534db52d2cc12bc53087cbf87f9440c5f180f367c1950b/torch-2.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:796633c4cdf0fe2cdced72d8f88f22e73dbcfce83132763162f6d4bff13b820b", size = 526605292, upload-time = "2026-07-08T16:04:22.81Z" }, + { url = "https://files.pythonhosted.org/packages/21/d6/e8f3c6f7e01f626f77259de9860d2a78bc84c40539e28e79b7e98b0bb659/torch-2.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:024c6cc0c1b085f2f91f20a3dc27b0471d021c31ce84b81be3afdc39f791fd9d", size = 122057313, upload-time = "2026-07-08T16:03:53.43Z" }, + { url = "https://files.pythonhosted.org/packages/0d/fa/c1c10b7aff4a9a3e8956d4f0a5f468fa6db7abc3208805719076772b4833/torch-2.13.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:33449899ce5496c1b84b4853179d94fd102028ae1407314d9fb956bb79e70d09", size = 111213743, upload-time = "2026-07-08T16:03:28.579Z" }, + { url = "https://files.pythonhosted.org/packages/11/18/9ecb37b56293a0be8d80f810bf672a72fe7e02f8b475d5ef1b9bf8a0d748/torch-2.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:1e09d6a722504957c694faceca843acde562786df1144ebcc5a74075ec7f6005", size = 427213008, upload-time = "2026-07-08T16:03:44.106Z" }, + { url = "https://files.pythonhosted.org/packages/d4/5a/7c50ba1b7b713d71d34669c6d13dab0a11531a3eceb0307a5162dbfec0f7/torch-2.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:a3a9a21312872af8a26950b2c15680335a386a1f56ed03e780653d78b9607e9e", size = 526602329, upload-time = "2026-07-08T16:03:12.649Z" }, + { url = "https://files.pythonhosted.org/packages/91/3d/e7adcc6aaf36961cd18f56cf8ad0f3058c3a5c84ccf391762176c94581b8/torch-2.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:49b58f1e2c52440abb6f17c28f0335fe6c6d01ad1a7f55b0183b81e4b34d64e6", size = 122057920, upload-time = "2026-07-08T16:03:01.808Z" }, + { url = "https://files.pythonhosted.org/packages/36/76/6dcc7f0c07052102dd36f83cbc5800842a909c8c3fbf1a7f8a5844954de9/torch-2.13.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d849b390e07d8d333ce8ecaf91b273c656c598379a19c9acf1318a883f6b391c", size = 111227066, upload-time = "2026-07-08T16:03:33.6Z" }, + { url = "https://files.pythonhosted.org/packages/e9/09/2c10e8cd0e00fa5d23c052df6ce467eaa7182399f5e0f824f1e4ff42ccae/torch-2.13.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:a3893dc2da0a972a8ca5d698c85a9f967559ac5f8ee1797b77408aa8734d073c", size = 427226309, upload-time = "2026-07-08T16:02:53.127Z" }, + { url = "https://files.pythonhosted.org/packages/76/c6/22c2102bbef14ca6a6cb4c20e42f088e49c5f812be4e160ae57502e325f9/torch-2.13.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:49f1ea385c754e54919408a9bb3b5a72b0b755bbe2c916c1d6f70afbec4908a2", size = 526614507, upload-time = "2026-07-08T16:02:16.441Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0c/7d1deb6bce5bc3e6042caf39100ac768eba3b9a098e1dddd16f75bd6489b/torch-2.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f8573e3ce9ebcd53fe922f01077a6085ccdfbe5f12fd215883a9d87d7a744fd", size = 122051871, upload-time = "2026-07-08T16:03:23.521Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ce/aa8b7f9949d32e0f2f624f342bc3b48112c1b8a130288465938bc83bcbf9/torch-2.13.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c28def70706c2f9ecc752574766e8ae4da9b810ab6676b611166761a78a9f1e1", size = 111537025, upload-time = "2026-07-08T16:02:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/69/d1/491e3a0389430946145888b0203f2b6a759ce2a61481b96a85c2da4f2ced/torch-2.13.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:31061ff56ed8fbf26c749806905aeb749ebeb819810fd5d52508aa5afd90dddc", size = 427219769, upload-time = "2026-07-08T16:02:31.18Z" }, + { url = "https://files.pythonhosted.org/packages/9a/1d/38006e045bf0a1fc28ef01e757c554e59e59a8770c284bc4f47b14e60441/torch-2.13.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:cc26eead4cf51d0b544e31e364dcf000846549c273bd148936fe9d24d29acb92", size = 526571320, upload-time = "2026-07-08T16:01:59.348Z" }, + { url = "https://files.pythonhosted.org/packages/56/94/655c91992a882bd5071aa0b5d22a07dbb130d801e872be97c0b627a7c693/torch-2.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:a7de8a313090dc5c7d7ba4bfe5c3be222528f9a4dba1acc83bddb1157360c4b8", size = 122306773, upload-time = "2026-07-08T16:02:39.832Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/24/95ec527ad67b76d59299e5465b3935d05e4294b7e0290a3924b7487df30b/tornado-6.5.7.tar.gz", hash = "sha256:66c513a76cda70d53907bc27cf1447557699c2e95aa48ba27a442ff61c3ddfc2", size = 519252, upload-time = "2026-06-08T17:34:51.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/dc/c7043cab6fed8ae159fc1923ce829ada35c4dbd797d408a43858ffaf9639/tornado-6.5.7-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:148b2eb15c2c765a50796172c1e499649b35f30d2e3c3d3e15913cfa56bfb163", size = 448543, upload-time = "2026-06-08T17:34:38.052Z" }, + { url = "https://files.pythonhosted.org/packages/92/4f/090b1431e5a43df696feceffc268c5383cc079ecb5f08ce58f917109aafe/tornado-6.5.7-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9da38de27f1da3b78a966f0dae12b5a1ea9afe72ca805d84ff06508272ddf100", size = 446707, upload-time = "2026-06-08T17:34:39.594Z" }, + { url = "https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972", size = 449774, upload-time = "2026-06-08T17:34:41.204Z" }, + { url = "https://files.pythonhosted.org/packages/35/37/d434c73f4c6e014b745b9b37085f34f40c022f007efff3d7fe65991899f3/tornado-6.5.7-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b", size = 450745, upload-time = "2026-06-08T17:34:42.531Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2b/56b9aff361d7f1ab728a805ec7d7ea835f8807afa9f5cc690ea0e630efb9/tornado-6.5.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92", size = 450578, upload-time = "2026-06-08T17:34:43.787Z" }, + { url = "https://files.pythonhosted.org/packages/02/30/a7444fb23aa76860a14198fab96ac79f1866b0a6e19e26c4381b0938e50f/tornado-6.5.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5", size = 449985, upload-time = "2026-06-08T17:34:45.326Z" }, + { url = "https://files.pythonhosted.org/packages/5c/42/5f0e56c01e8d9d36f4e23f367b85ae6cae0c1ecddd5e6977d8388ad27488/tornado-6.5.7-cp39-abi3-win32.whl", hash = "sha256:f8de3bf12d3efdd0cbe7c8887868198f8a91415e3f29fcf258d9b8eb7b1d9ae4", size = 451047, upload-time = "2026-06-08T17:34:46.784Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/b393076ffb21b469eec5b328a0534cf03a3b90bfc6b1f09507cdd075d938/tornado-6.5.7-cp39-abi3-win_amd64.whl", hash = "sha256:de942f843533a039ef9fa3d9c88c7cd8a7c94553fb5ad0154270989b3d99a2c4", size = 451485, upload-time = "2026-06-08T17:34:48.248Z" }, + { url = "https://files.pythonhosted.org/packages/71/2e/7b1c769803121b809112cf9a00681c472eae1d80e32d7ec0e0bd61d0d0e1/tornado-6.5.7-cp39-abi3-win_arm64.whl", hash = "sha256:ff934fce95643af5f11efdae618eaa73d469dc588641e5c8d19295a0c65c4796", size = 450506, upload-time = "2026-06-08T17:34:49.702Z" }, +] + +[[package]] +name = "traitlets" +version = "5.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/a9/a2584b8313b89f94869ddb3c4074617a691de1812a614d2d50e32ca5a7a6/traitlets-5.15.1.tar.gz", hash = "sha256:7b1c07854fe25acb39e009bae49f11b79ff6cbb2f27999104e9110e7a6b53722", size = 163344, upload-time = "2026-06-03T12:26:06.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/8d/1080ee4c231f361b6ce4470d556c8c435b67c7e0753aaa641497ee92f88b/traitlets-5.15.1-py3-none-any.whl", hash = "sha256:770a53705f84b81ac107e83a1b3328ff2dae16094d8fc3cfc004e4b22dfd8e92", size = 85858, upload-time = "2026-06-03T12:26:04.395Z" }, +] + +[[package]] +name = "triton" +version = "3.7.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/ea/629cc37436ca5df93ce98956d09cd2ca1498bfee8ef4972d2fe48b9f958c/triton-3.7.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3daf64305d6cea88d3334c65ebc9bcd0c64c9564a977084366aa768d57cbcf64", size = 184551013, upload-time = "2026-06-17T20:03:37.551Z" }, + { url = "https://files.pythonhosted.org/packages/15/76/c79c34311625227a288df3e483fc5cdf3d596624cbd4b4758c4cbdc14af3/triton-3.7.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee89fbf782ec2ad50391dd1cf26cbea4f4467154c37f4773026da8fc31c0f58e", size = 197596267, upload-time = "2026-06-17T19:53:06.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f9/19d842d06a08559534fa1eaab6ca551b1bcf40f06620bddec1babaa2772d/triton-3.7.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4a0e1cd4c4a76370ed74a8432a53cea28716827d19e40ffc732233e35ceb3f6", size = 184664887, upload-time = "2026-06-17T20:03:42.913Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5e/fce69606f7f240297f163e25539906732b199530d486ce67ae319877e821/triton-3.7.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6744957e9fd610a29680ec2346057d0c86948ed3812468670719f391e94b44a5", size = 197701306, upload-time = "2026-06-17T19:53:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/94/fa/f856e24deb462d5f18bd4b5a746957862ab9b6ee5834bda60605ec348366/triton-3.7.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9497f2e696ee368862a181a90b2dcc03ca978cc4f602abd67c7d81022a6988e1", size = 184692359, upload-time = "2026-06-17T20:03:48.288Z" }, + { url = "https://files.pythonhosted.org/packages/c4/6f/fb96d15db6f36d6eae4cafb998c2e0353bf59d7c4ea1662d7497f269134a/triton-3.7.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e40869937a68206ec70d7f25bb7ec6433cb083f9135e1f36dbd318dc449a728", size = 197719725, upload-time = "2026-06-17T19:53:20.419Z" }, + { url = "https://files.pythonhosted.org/packages/00/42/c5089d4d9327fcd1e862c599cc2927f39418f84dd11a84cb2ccff9d4787a/triton-3.7.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cdbfc09d9ec58bc5e68321525653220de7515c199e7a8097a97c85e62b52cd0a", size = 184694629, upload-time = "2026-06-17T20:03:53.444Z" }, + { url = "https://files.pythonhosted.org/packages/07/42/2c3ac59253ae8892b6f307875263dd23dc875cdf732d3aea40d6d41fb7cb/triton-3.7.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58c0e131da05134a2a4788ccbcc0c1105cf0f54c8e98f19e34cd465396dc15eb", size = 197729241, upload-time = "2026-06-17T19:53:27.801Z" }, + { url = "https://files.pythonhosted.org/packages/40/71/e01aa7ad573883ed9456f130226babdec70b005e098c4d6226a6238e761b/triton-3.7.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe4ea396a06171f1f1f58cbd39c70b09294398f7dd7c620939bab54ad6f934fa", size = 184705764, upload-time = "2026-06-17T20:03:59.064Z" }, + { url = "https://files.pythonhosted.org/packages/a4/09/5683146fda6a2b569deb78ccfd8fbfea8bfe55f726b081c0a6bb18dd6f28/triton-3.7.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2020153b08280415ec0da6607834e79166442147e78e144df06b508c75b186d2", size = 197729537, upload-time = "2026-06-17T19:53:35.516Z" }, + { url = "https://files.pythonhosted.org/packages/e9/f8/448220c3092019f9fdfab39ec47985968181d67da34b44f6a7f6280a5cbb/triton-3.7.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c58e4c61f0c73b5dba3b5d19b4a7093c32f90dc18b2a7f121a7c16ccd31107b7", size = 184814760, upload-time = "2026-06-17T20:04:04.984Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ac/229b7d4589d2e5937310e72c6d46e89599d16a4a12b479ffa1499fee8eb8/triton-3.7.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10ba85fa2cca4a2fbdeb36bf1cb082f2c252bda55bf9fccd74f65ec5bc647e68", size = 197824404, upload-time = "2026-06-17T19:53:42.772Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253, upload-time = "2026-06-29T18:11:11.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166, upload-time = "2026-06-29T18:11:09.888Z" }, +] + +[[package]] +name = "websockets" +version = "16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/02/b9a097e1e16fee4e2fd1ec8c39f6a9c5d6257bae8fa12640caf869f54436/websockets-16.1.tar.gz", hash = "sha256:299468cbe42e2b9981134c7c51d99387d8a7bf562b00183b3eec53f882846dad", size = 182530, upload-time = "2026-07-10T06:32:57.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/31/cd11d2796b95c93645bac8e396b0f4bac0896a07a7b87d473bfc359f02c3/websockets-16.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de72a9c611178b15557d98eabd3101c9663c4d68938510478a6d162f99afd213", size = 179772, upload-time = "2026-07-10T06:30:22.983Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9b/34306d802f9b599eab041688a2086318037560cfae616a860234cca575b6/websockets-16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:37b0e4d726ffea3776670092d3d13e1cb605076f036a695fd1259de0d9b9fe02", size = 177457, upload-time = "2026-07-10T06:30:24.636Z" }, + { url = "https://files.pythonhosted.org/packages/06/3a/36ebbb978a7af70ff952afe5b22561264967164e9ad68b6734cae94efeb4/websockets-16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:00d50c0a27098fcb7ab47b3d99a1b1159b534dbcd959fbf05113ebc37e5f927b", size = 177737, upload-time = "2026-07-10T06:30:25.954Z" }, + { url = "https://files.pythonhosted.org/packages/17/d7/944f341d0d3c0450ffd3d171479531df1818cb1df1623af4065113999c44/websockets-16.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1acb698bff1da1782b31aebd8d7a24d7d05453964abcd7d03dbf6e25893908e8", size = 186244, upload-time = "2026-07-10T06:30:27.235Z" }, + { url = "https://files.pythonhosted.org/packages/32/e5/a9b98fc49ef0214718a9c839c6c63856a921877256ec46f371be32decfa8/websockets-16.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc2c453f3b5f99c56b16e233aad5299860558487d26adb2ed27a00c14ca24b8c", size = 187484, upload-time = "2026-07-10T06:30:28.615Z" }, + { url = "https://files.pythonhosted.org/packages/ad/7a/a575b52ca090b1976ffbe4b5f0762d03f399dfcb48eab883101331be71a9/websockets-16.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1a9f08a0728b0835f1c6abe1d9b746ab3de49b7336a0e1919cf96be1e76273eb", size = 190143, upload-time = "2026-07-10T06:30:29.91Z" }, + { url = "https://files.pythonhosted.org/packages/7c/40/705fbbd5677242fd36f724e9a94103e6bbdcb7d71e8f4498bfc1a8a7d413/websockets-16.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a089979d6173b27af18026c8d8b0077f83669a9169174482c4651e9f5739a5b6", size = 188004, upload-time = "2026-07-10T06:30:31.357Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0c/58227c8d66b1c4060c53bac8e066fb4fe2603060408e934f48660a448d72/websockets-16.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a3c18dba232ec2b92a68579c9fed8ff5a18f853d1e09fc0b6ca3159e94f689fe", size = 186689, upload-time = "2026-07-10T06:30:32.712Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d0/5c1314782594aa347e0f18808ee277a61986a2a2f9f470df9893183995bd/websockets-16.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c1eb7df4170d5068892a8834fb5c07b9552353deb0dbeb0bff3820481ae4792", size = 184559, upload-time = "2026-07-10T06:30:34.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e6/109c6f16850fd674b7e3d0e58b8987f05d3881abaa25f42a9faf5e85f097/websockets-16.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c522bd48e625b6d557aa228967258d6d3da031c4cc21d3352fb302479aa9ba0a", size = 186997, upload-time = "2026-07-10T06:30:35.397Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ec/6afa1aebc59426438b85cf7a3868c53a89005e2250a648c99e99943b90a4/websockets-16.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d106396927a7f00b0f3a69215c3357f87bf0bca6844247121f7e8291e826a3b1", size = 185621, upload-time = "2026-07-10T06:30:36.88Z" }, + { url = "https://files.pythonhosted.org/packages/27/24/c038fe8682e9345bfa422d2cc5cc68b0491ab942c92e176bf8dfa6e8331f/websockets-16.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d71bed12909b8039955536e192867d02d76cd3797cedfd0facf822e7668636c3", size = 187384, upload-time = "2026-07-10T06:30:38.096Z" }, + { url = "https://files.pythonhosted.org/packages/30/ca/dc0ef2be39c67394e24bc982a0af59cd6249bf2f4e4272813c5c505d0da9/websockets-16.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:9c1cf6f9a936b030b5bed0e800c5ee32069338129084546baf5ff5014dc62fa9", size = 185258, upload-time = "2026-07-10T06:30:39.579Z" }, + { url = "https://files.pythonhosted.org/packages/17/6b/3ffecd83ca3404b41fbdf8e9b178e55b529cd59bf64ea08b5a37b616b568/websockets-16.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3fd3e6a7af2c8fcdcf4ffbeaf7f54a567b91a83267204187797f31faaa2a4efa", size = 186050, upload-time = "2026-07-10T06:30:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/75/26/2e068497c78f31591a610ab7ef6d8d383ecadbe98f9121e1ebda77ef6d2b/websockets-16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dddd27175bf640acae5561fa79b77e8ec71fc445816200523e5c19b6a556fb72", size = 186273, upload-time = "2026-07-10T06:30:42.309Z" }, + { url = "https://files.pythonhosted.org/packages/44/ab/4dc049cb2c9e1be3a2c6fef77118f9c5049979e99cd56a97759d2f40f980/websockets-16.1-cp310-cp310-win32.whl", hash = "sha256:cce36c80b3f2fede7942f1756d3d885fa6fa086766c8c1bcf00695ab80f0d51a", size = 180157, upload-time = "2026-07-10T06:30:43.565Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4f/5e010ce5f66a8e5df380843f704ada508195a021c0c8a0f933639c9ee1c0/websockets-16.1-cp310-cp310-win_amd64.whl", hash = "sha256:115fc4695b94bb855995b23fb1abcb66099a5995575d3d5bc5605a616c58d0eb", size = 180458, upload-time = "2026-07-10T06:30:45.01Z" }, + { url = "https://files.pythonhosted.org/packages/9e/13/d47429afcc2c28616c32640009c84ea3f95660dab805766345b9682468e0/websockets-16.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a9b1d7a63cba8e6b9b77e499a81eab29d31100298d090ad4507d1048c0b9cae0", size = 179770, upload-time = "2026-07-10T06:30:46.308Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c7/2f0a722039a1e0107be73ed672ba604449b4956e48733e8e6b8a005aea42/websockets-16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bedbc5efeb96621aa2921d2d92608246691399418cac22acba427eb11877ea1f", size = 177455, upload-time = "2026-07-10T06:30:47.601Z" }, + { url = "https://files.pythonhosted.org/packages/43/6a/c26b0ae449e93d256ce5cdd50d5fe97b575a63e8dcd311a1faa972fd6bc6/websockets-16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd847ab82133015afe65d778e7966ab42dba16bd7ad2e5b8a7918db6539f3f94", size = 177731, upload-time = "2026-07-10T06:30:49.102Z" }, + { url = "https://files.pythonhosted.org/packages/cc/3f/381550b344a02f0d2f84cda25e79b54575291bc7022128a41163fe8ba5b0/websockets-16.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2fb33ccb16ee40a95cc676d7b0ff451a9a2632f11a0dbc2e666326892b2e1de", size = 187066, upload-time = "2026-07-10T06:30:50.505Z" }, + { url = "https://files.pythonhosted.org/packages/4a/87/5ab1ec2086910f23cfb9ec0c1c29fbcc24a9d190b5198b1557c00ce4a47e/websockets-16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f15b6d9ea9c2eaf6ccab964a082b09bfa6634a495bb0c2e9e7ee6943f58976", size = 188301, upload-time = "2026-07-10T06:30:51.835Z" }, + { url = "https://files.pythonhosted.org/packages/75/4b/bbbb8e6fac4cfc53d7aaa69a3d531bf10799354b0021f4b58914aced8c1a/websockets-16.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:638cf57c48b4ad8ac1ff1e453f4f97db2426b690ddc111e6da96b27b4a340bc3", size = 191594, upload-time = "2026-07-10T06:30:53.229Z" }, + { url = "https://files.pythonhosted.org/packages/5c/da/6c0c349443d6e999f481e3d9a0e57e7ac2956d75d6391bec24b92af3fe13/websockets-16.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c1c85f61bc9d5eac57ce705d848dc2d2ce3680638300bf4e1da7d749e2cf4ce", size = 188862, upload-time = "2026-07-10T06:30:54.744Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ea/a368d37c010425a5451f42052fe804e754e23333e8448aef5d55c8a8d64f/websockets-16.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:eeab6d27f51c7e579023c971f5e6dff200deadf01faf6831beaecd32052dfaef", size = 187633, upload-time = "2026-07-10T06:30:56.055Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4e/2ecd59add10d0855ec03dbdedfcdacdbd1aaabcd44b7dcbeda27538662e9/websockets-16.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2ed64e5a97b0b97a0b66e18bfe281317a75fbbd5afe692f939ea8d14a4292f2c", size = 185089, upload-time = "2026-07-10T06:30:57.444Z" }, + { url = "https://files.pythonhosted.org/packages/6f/eb/c6c3dcd7a01097bb0d42f4e9ef21a2c2a491d36b77cd0870ab59f9e8e77f/websockets-16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b3b021d0ed4bc16eea9775f62c9fa71acdacba0fc790b38581754dedf29ca60", size = 187790, upload-time = "2026-07-10T06:30:58.731Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3e/775d36885d5e48ab8020aaf377de0ff5fbeb8bc2682a7e46419e4a14521c/websockets-16.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6eb604a4167f0a0d53c2243dfc667a29f0b43c3436057184e070bb82a1000fa2", size = 186381, upload-time = "2026-07-10T06:31:00.355Z" }, + { url = "https://files.pythonhosted.org/packages/ad/90/6305c00812a92e47d0582604c02bd759db0118bbafc13f707d712dbcf898/websockets-16.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9a3f125e44c3e34d61d111652e608e0f5b85ce08c225c8d56ad0eb822fa40030", size = 188193, upload-time = "2026-07-10T06:31:01.677Z" }, + { url = "https://files.pythonhosted.org/packages/f6/32/96bf8302c81d961585b4d34a2ddd3f229782f9b8c57bc78bbf98f1b1a4ac/websockets-16.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8fdf0b00d0d1f30d1f06a92cab46fe542eec3eb302a7aee7163f142d0780f216", size = 185771, upload-time = "2026-07-10T06:31:03.062Z" }, + { url = "https://files.pythonhosted.org/packages/e8/1f/e8fe44b1d2dc417d740d9959d28fd2a846f268e7df38a686c04ac7dfe947/websockets-16.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:67b56828712f5fa7852de4c0265c28827311a657a4d275b7312ed0d1a918bee4", size = 186803, upload-time = "2026-07-10T06:31:04.34Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/b07d3a4e1eb2ab03e94e7f53f0c7a628e85fde6ad86011f7afd08f27b985/websockets-16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39c7e7730be33b8f0cd6f0aa8e8c82f9cdd1813f159765e073b2ece65f4824b5", size = 187041, upload-time = "2026-07-10T06:31:05.567Z" }, + { url = "https://files.pythonhosted.org/packages/a6/fd/e0abb8acc435642ac4a671490f6cf781c882f3fe682cdced9080ea455ab5/websockets-16.1-cp311-cp311-win32.whl", hash = "sha256:c54fe94fb2f11e11b48920c5f971e298cec73ac35db56efe57a49db63dfc95d4", size = 180158, upload-time = "2026-07-10T06:31:06.929Z" }, + { url = "https://files.pythonhosted.org/packages/81/06/85574d9458d3b913090087b817df0cc47b68e9a01dd0ab6ac04b77f49b0a/websockets-16.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9f4fb9ae8b802e55609685db98382d48fd3feb1397804e1e774968dea0f28c7", size = 180456, upload-time = "2026-07-10T06:31:08.247Z" }, + { url = "https://files.pythonhosted.org/packages/a1/52/748c014f07f4e0e170c8932de7e647a1511d5ab3049cd978797136aee577/websockets-16.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b6aa3f7ad345cf3862c21f4fbf2ef5e14d911348476c2845e137c091fe3a3f0b", size = 179798, upload-time = "2026-07-10T06:31:09.664Z" }, + { url = "https://files.pythonhosted.org/packages/8b/5e/2a2e64d977d084e49d37c187c26c056daaff41965be7300cd5dbde6f8b07/websockets-16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b43fcfb521ac2f34ba80b7b8ea16303e4ad82dd8af667bf40839ad3a5d37b164", size = 177478, upload-time = "2026-07-10T06:31:11.072Z" }, + { url = "https://files.pythonhosted.org/packages/aa/12/5b85b4e75d697e548a94962ce5c036b05dd21cb9545759d555c5586422fc/websockets-16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2bd3e12cd9afbe2baedae0b1eeade8ba64329b60fe2f9abdc966bd10fd2c2ef5", size = 177746, upload-time = "2026-07-10T06:31:12.386Z" }, + { url = "https://files.pythonhosted.org/packages/9d/62/79b1c8f0cee0da648b4899e1c5b0dbd3aa59846985136a54854db6827ab4/websockets-16.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f41979c8623df9bd30d949d82010a8fda5c56ff12cd8508a5b7272b6d4b53a", size = 187345, upload-time = "2026-07-10T06:31:13.754Z" }, + { url = "https://files.pythonhosted.org/packages/25/34/b7c5c52c2f24280e1c017acb7ad491a566750a5cceca7f3cf999373bba21/websockets-16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a24d1f35aef07d794a16c853c688e74956c50239bec37b4f2de080056046419b", size = 188581, upload-time = "2026-07-10T06:31:15.075Z" }, + { url = "https://files.pythonhosted.org/packages/bc/37/604193bebcbeffe96fdf795960b83a15d600880c64dc17ec9c31c5b3427d/websockets-16.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c64c024ddf7a35331b21fcddb562a039c275d2c82e8c2d12939e7da23997270", size = 191362, upload-time = "2026-07-10T06:31:16.395Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b4/5ee27575b367d7110d4d13945e2a9de067ec84dc71e54b87f01e38550d9a/websockets-16.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c3e99757f5baafe20fc598e202ea6f5b0b265186ad38d0a17bd8beca16296955", size = 189216, upload-time = "2026-07-10T06:31:17.776Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/3e2dcc78d85fc5d9d814895ce6d07d0dfacc0f6aaa1d151f2b8c8d772299/websockets-16.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:353f3bc6e058ac1ccab4b3588e8598837a8c04cfc8351233e6d523be675d844c", size = 187971, upload-time = "2026-07-10T06:31:19.152Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2f/cd271717b93d5ee19626cb5e38a85baab745c86e33db7c31a3ac729b31b8/websockets-16.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0352f5b38b40e857b6428d468fa21dbb4dd4a567d933c26d9831b4efe1b92f43", size = 185381, upload-time = "2026-07-10T06:31:20.665Z" }, + { url = "https://files.pythonhosted.org/packages/78/91/6ad6f2f1426317b5001bd490534208c7360636b35bac1dec2e0c22bfc40e/websockets-16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:70bd789afab579602968c39f21cb925466505f3edff22f0ae852bca54978a4f9", size = 188015, upload-time = "2026-07-10T06:31:22.024Z" }, + { url = "https://files.pythonhosted.org/packages/c7/6d/533733132ab4c07540efd4a8f0b9a435d3a5059b2f26cc476ace1abf7f45/websockets-16.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d0fb4b46f121eccd539353baebd1083a8767a9a351109453d1d1caecd1ba40c2", size = 186619, upload-time = "2026-07-10T06:31:23.376Z" }, + { url = "https://files.pythonhosted.org/packages/08/73/16c059f3d73b3331eba10793704afa4faa9939234fb08ef7dca35794e8f0/websockets-16.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c14b6634af01541e4efe2954fd8f263386f7aa6d37c01e55dd8109fd17661452", size = 188497, upload-time = "2026-07-10T06:31:25.024Z" }, + { url = "https://files.pythonhosted.org/packages/4d/89/9a8fae7dd2acdcfb1a8844c29fe42b518a04b64fce38a0923b6290e452f1/websockets-16.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:a58532c49a851bcb481e58c1be23b315c17fe2fbbed509d75aeea12f543d2c15", size = 186051, upload-time = "2026-07-10T06:31:26.291Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/b240c7dd6a0e0c59c1f68377cc3015263521080c327c15f5e753c1f6d378/websockets-16.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4e969170c3b08e1d8dabd990fef1fa702c4233aeaabec33f871806e444f6a0e4", size = 187029, upload-time = "2026-07-10T06:31:27.605Z" }, + { url = "https://files.pythonhosted.org/packages/50/35/524e3fac40e47d6fdcf6c4b2c95ef1bc8a97e01593c90eff86621df7b716/websockets-16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff9b000064b88787ba9f7a3cb2af2b68a658ca5aad76458a46469e7124b678a0", size = 187308, upload-time = "2026-07-10T06:31:28.927Z" }, + { url = "https://files.pythonhosted.org/packages/00/13/56840cf62c8859af6ba22b9529da937332468c80f32b598753e8a66d3990/websockets-16.1-cp312-cp312-win32.whl", hash = "sha256:b9f5d83f80f4d7c4bba6d97f3755ac05850c784dce0fd2ab371c4e41172f53ff", size = 180161, upload-time = "2026-07-10T06:31:30.316Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ff/87eb9eb44cb62424a8d729834f2b0515a47e2669fabec29820268f4d50a1/websockets-16.1-cp312-cp312-win_amd64.whl", hash = "sha256:6852c9f653966c16109d3b6f31181fd734f7914927e3f0fa1117af7a18c9aa21", size = 180462, upload-time = "2026-07-10T06:31:31.708Z" }, + { url = "https://files.pythonhosted.org/packages/d9/63/df158b155420b566f025e75613424ad9649a24bcb0e9f259321ab3d58bea/websockets-16.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b0232ed141cec3df2af5a3959a071c51f40036336b0d37e17faf9ef52fc73e47", size = 179791, upload-time = "2026-07-10T06:31:33.108Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/00fe9414dfeafa6fe54eae9f5716c8c8e9ac59d192be3b893c096d395846/websockets-16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a71b73d143991714144e159f767b698f03c4a70b8a65ae1733b650cff488045b", size = 177472, upload-time = "2026-07-10T06:31:34.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/76/b10633424d40681b4e892ffd08ca5226322b2426e62d4ab71eae484c3a32/websockets-16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:187323204c3b2fc465e8fc2609e60437c521790cb9c1acb49c4c452a33e57f37", size = 177737, upload-time = "2026-07-10T06:31:35.964Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/d3bb03b2229bb1afd72008742d586cf1ea240dce64dd48c71c8c7fd3294c/websockets-16.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9dba74233c8c3ce368850818c98354dad2570f57231b3fd3bd00d7aa57628881", size = 187403, upload-time = "2026-07-10T06:31:37.496Z" }, + { url = "https://files.pythonhosted.org/packages/26/16/cc2e80478f688fc3c39c67dc1fac6a0783858058914ebc2489917462cb42/websockets-16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63339bc8c63c86a463177775cb7c677691f5bcfac7b3b2f01b286d42acd41600", size = 188639, upload-time = "2026-07-10T06:31:38.86Z" }, + { url = "https://files.pythonhosted.org/packages/15/d6/ad87b2507e57de1cbf897a56c963f2925962ed5e85fbe06aaa83ced27acd/websockets-16.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23e545ea8ae4263e37cdfd4e22a217f519e48e432728bc461185bbf585f38a83", size = 190078, upload-time = "2026-07-10T06:31:40.218Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1a/5b37b3fd335d5811f29fc829f2646a3e6d1463a4bf09c3100708684c766e/websockets-16.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2237081454846fb40403a80ba86d82e2038b9c45865ab96af0abe7d002a91045", size = 189267, upload-time = "2026-07-10T06:31:41.523Z" }, + { url = "https://files.pythonhosted.org/packages/42/98/06afc33e9450d4230f94c664db78875d90f5f6a5fb77f0bc6ec15ae74e1c/websockets-16.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5f5218de1ed047385ca53744caba9435d65f75d008364970a3fae95a05812cf9", size = 188022, upload-time = "2026-07-10T06:31:42.838Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/42fef5d5887c18cf2d148b02debf56cecb9cfbffc68027cde9b12c8f432c/websockets-16.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75c98e3920039d0edff03b74478ada504b7ce3a1bc406db2cabfca84320f7baf", size = 185435, upload-time = "2026-07-10T06:31:44.219Z" }, + { url = "https://files.pythonhosted.org/packages/a0/9b/8021c133add5fe40ed40312553a6cd1408c069d7efe3444ad483d4973ed3/websockets-16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1facd189d8190af30487a55b4c3688484dd50801628a3b5b2ccd26db08e67057", size = 188080, upload-time = "2026-07-10T06:31:45.986Z" }, + { url = "https://files.pythonhosted.org/packages/69/54/1e37384f395eaa127383aab15c1c45e200890a7d7b99db5c312233d193e0/websockets-16.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cc0c6a6eef613c7da32d4fb068f82ef834b58134f6a16b54e6c1e5bf9529ab3d", size = 186678, upload-time = "2026-07-10T06:31:47.449Z" }, + { url = "https://files.pythonhosted.org/packages/68/79/1caeacab5bc2081e4519288d248bc8bd2de30652e6eaa94be6be09a1fe5b/websockets-16.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ad9411eded8988b879be6038206698bf7106c85a78f642c004485bcb95be17eb", size = 188554, upload-time = "2026-07-10T06:31:48.886Z" }, + { url = "https://files.pythonhosted.org/packages/ee/83/b3dca5fad71487b726e31cb0acf56f226792c1cc34e6ab18cbf146bd2d74/websockets-16.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:cd68f0914f3b64694895bc5e9b14e8b447e41d7bf5ffaf989bb8dcb5e2dfdce7", size = 186109, upload-time = "2026-07-10T06:31:50.508Z" }, + { url = "https://files.pythonhosted.org/packages/5b/0b/8f246c3712f07f207b52ea5fb47f3b2b66fafec7303162644c74aed51c6a/websockets-16.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fef2debfe7f7ebdda12176f26166f95b7af17af05ba06150fcf889032e0213e9", size = 187061, upload-time = "2026-07-10T06:31:51.861Z" }, + { url = "https://files.pythonhosted.org/packages/47/eb/27d6c92a01696b6495386af4fc941d7d0a13f2eab2bf9c336111d7321491/websockets-16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3cd6c9b798218798f4bb7b2e71c38f0e744bb94ca537b13376f88019d46384d", size = 187347, upload-time = "2026-07-10T06:31:53.246Z" }, + { url = "https://files.pythonhosted.org/packages/6b/d5/eeee439921f55d5eaeabcea18d0f7ce32cdc39cb8fc1e185431a094c5c7b/websockets-16.1-cp313-cp313-win32.whl", hash = "sha256:84c170c6869633536921e4474b1cce7254c0c9b0053ef5725f966cee47e718e4", size = 180149, upload-time = "2026-07-10T06:31:55.058Z" }, + { url = "https://files.pythonhosted.org/packages/a3/03/971e98d4a4864cf263f9e94c5b2b7c9a9b7682d77bfbba4e732c55ee85a9/websockets-16.1-cp313-cp313-win_amd64.whl", hash = "sha256:bef52d327d70fa75dad93ee61ea2cb1d1489aca9f35c188833563f5a3b4df0a5", size = 180458, upload-time = "2026-07-10T06:31:56.767Z" }, + { url = "https://files.pythonhosted.org/packages/8d/e6/da1dc11507f8118145a81c751fe0c77e5e1c11b8554496addb39389e2dc2/websockets-16.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f881fca0a45dd6789939bd6637cd98169b92f1c3fdc78262f2cb9ec2cb1f324e", size = 179833, upload-time = "2026-07-10T06:31:58.19Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ac/c0d46f62e31e232487b2c123bc3cfd9a4e45684ca7dc0c37f0987f29baae/websockets-16.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:30c379d5b207d3a7f0ba4c2e4602a895b0bcc63fb5f5371a4ae7fbddb03b672b", size = 177524, upload-time = "2026-07-10T06:31:59.563Z" }, + { url = "https://files.pythonhosted.org/packages/4a/33/abd966074b34a51e4f134e0aaed80f5a4a0a35163ea5ac58a1bc5a076d23/websockets-16.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:98ab58a4faa72b46da0127ccc1931dcbfc0985b0778892300a092185910c4cbe", size = 177743, upload-time = "2026-07-10T06:32:00.959Z" }, + { url = "https://files.pythonhosted.org/packages/ea/30/646e47b8a8dff04e227bdab512e6dde60663a647eeac7bbd6edddd92bbc5/websockets-16.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e9c4e369fc181b2d41a99e01477215cecdc8546a39f7d41a59cc0a7065a0b09", size = 187474, upload-time = "2026-07-10T06:32:02.54Z" }, + { url = "https://files.pythonhosted.org/packages/d2/72/890ab9d77494af93ea65268230bfbc0a90ba789401ed7a44356a44785644/websockets-16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0704df094b2d5fa7f6f410925a594c2a5c9a09167731a76292e5410934208209", size = 188717, upload-time = "2026-07-10T06:32:04.156Z" }, + { url = "https://files.pythonhosted.org/packages/d5/aa/baedbbaa6bf9ed6029617ed5e8976535bd805f483ca9b3484e7ad9ee08bf/websockets-16.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b22b1f4950f6ab7126623329c3b47b3b90a14c05db517f2db2a026ad6c928352", size = 190090, upload-time = "2026-07-10T06:32:05.822Z" }, + { url = "https://files.pythonhosted.org/packages/52/4f/d813ec94e18002571ef4959d87a630eff6e01b72a51bcb0832b75ae8c51a/websockets-16.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1ae4a686a662964a6671069f84f7f908cc3475e782227726b0c622c715962105", size = 189320, upload-time = "2026-07-10T06:32:07.223Z" }, + { url = "https://files.pythonhosted.org/packages/b8/3c/8ec52a6662f3df64090fba28cd521d405d54759268d8e820477037e8c80d/websockets-16.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:856bdd638f8277f86465057bfdd4da097c73058fb0f9d2bd5baea29e2bf2d367", size = 188068, upload-time = "2026-07-10T06:32:08.586Z" }, + { url = "https://files.pythonhosted.org/packages/96/7f/f0ae6042b14f86fa5f996c6563ea4cf107adc036ccbedc9d4f418d0095f9/websockets-16.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9003a1fde1c21a322a3ca3fa0c4bda8c639da81dbc925162766086643b05ba87", size = 185493, upload-time = "2026-07-10T06:32:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/89/ad/5ffc53af9939c49fd653d147fa5b8f78ced1f6bce6c49a7446860945b0ce/websockets-16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39e947b1f5fdab045174306e3916785bf3ed537648acc1549827c08c33b10953", size = 188141, upload-time = "2026-07-10T06:32:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/67/62/729206c0ee577a4db8eae6dd06e0eef725a1287c6df11b2ef831d003df31/websockets-16.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5dd0e666b5931c0509cf65714686a1c5126771e663a79ac5d40da4f58b1f9502", size = 186653, upload-time = "2026-07-10T06:32:12.845Z" }, + { url = "https://files.pythonhosted.org/packages/1b/86/e8806a99ec4589914f255e6b658853fe537bf359c05e6ba5762ad9c27917/websockets-16.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a0285df7925657ad65a65fb8dc330808bce082827538fd50ef45fa12d1fc5bca", size = 188614, upload-time = "2026-07-10T06:32:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/89/38/ac554e2fc6ff0b8deeff9798b92e7abd8f99e2bd9731532e7033de208220/websockets-16.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:82d1c2cab3c133e9d059b3a5420bed9376bd30e21c185c63dda4ddadf6ddda47", size = 186165, upload-time = "2026-07-10T06:32:15.626Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c5/4ef4d8e53342f94f3c49e1ae089b32c1e8b3878e15e0022c7708c647f351/websockets-16.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c39907f1eaf11f6277def65aa02d68f30576b693d0c1ca332aafa3caa723ac6d", size = 187119, upload-time = "2026-07-10T06:32:17.114Z" }, + { url = "https://files.pythonhosted.org/packages/3a/33/4788b1dd417bd97eeb2698af3b9df6775ac656f96e9987da0419a067602f/websockets-16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:45c5ea55446171949eb99fd34b771ceddd511ca21958d40d0197ced33159e5ee", size = 187411, upload-time = "2026-07-10T06:32:18.629Z" }, + { url = "https://files.pythonhosted.org/packages/30/38/00d37aad6dc3244ce349e2864815362e50b3cfc00cac28d216db20efe40f/websockets-16.1-cp314-cp314-win32.whl", hash = "sha256:b8ef8b1c8d6bd029a475ac432e730fba2dfd456715d26c473e2a82291024b99c", size = 179822, upload-time = "2026-07-10T06:32:20.233Z" }, + { url = "https://files.pythonhosted.org/packages/9d/37/2a8cb0eaddee5eaebda47a90a3ba0898d1ce3d866b02a4857fea17d82e5b/websockets-16.1-cp314-cp314-win_amd64.whl", hash = "sha256:7358ff21632b5d062707f73e859c824f1c3807e73d8ca25e71caca7c4cdcf145", size = 180167, upload-time = "2026-07-10T06:32:21.749Z" }, + { url = "https://files.pythonhosted.org/packages/07/5a/262ad5fcaef4198997b165060f09a63f861e76939b1786ab546ccc3f8120/websockets-16.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d0f38f4c3e9b359e257c339c2cc1967ccaeedb102e57c1c986bdce4bf4f32268", size = 180166, upload-time = "2026-07-10T06:32:23.278Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c7/36377db690f4292826e4501a6dec2801dc55fd1cf0405923b04937e478df/websockets-16.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:3c3d2cbd1602593bad49bd86fa3fbb25407d87a3b4bf8857c0ac5ac4914e1901", size = 177697, upload-time = "2026-07-10T06:32:25.164Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c7/07171abce1e39799a76f473608580fe98bd43a1230f5146159622c02bccf/websockets-16.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:36069b74671e7e667f48a7484249f84c45a825a134c8b1bdc01875d0daa10d79", size = 177902, upload-time = "2026-07-10T06:32:26.564Z" }, + { url = "https://files.pythonhosted.org/packages/14/17/c831f48e250bc4749f57c00dcce73337c41cd32f6d59a64567b84e782601/websockets-16.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:587f83c2ce8a5d628e166384d77fa7f0ac69b9007d515ab442123e6615aa8da3", size = 187766, upload-time = "2026-07-10T06:32:27.981Z" }, + { url = "https://files.pythonhosted.org/packages/2c/2e/4dfe63e245b0ecfaf470cf082d25c6ce35808159135fd88c82653a6b11ab/websockets-16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6db7972d52bc1b66cefe2246902e256cbaebc9ba8a45eac09343d7eb6671b2", size = 188939, upload-time = "2026-07-10T06:32:29.365Z" }, + { url = "https://files.pythonhosted.org/packages/ba/e5/5faf65aebd9562f6b4bc473d24ce38cc56f84eb5f5bee66ed9b86733f93c/websockets-16.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e7d6014888a0632e1ed7a4095248bb3095232999447f2d83bfb1900987dd9ed9", size = 191081, upload-time = "2026-07-10T06:32:30.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/cd/2634f2f2c0556c1aae6501ed6840019cc569dd6fdbcac6494378daea4dc0/websockets-16.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9cb074d150e4ad2a77aa8a332c2be85f3f64f2681519d2570c1225c12c9821ff", size = 189513, upload-time = "2026-07-10T06:32:32.399Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/2c700b51196104f09715b326b1f092ed25326bdf79a03e00a4842e503743/websockets-16.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d19c9067e1fe9490f974bffbc0e443b80a7674c5efb4980c429cc00771f07c5a", size = 188240, upload-time = "2026-07-10T06:32:33.897Z" }, + { url = "https://files.pythonhosted.org/packages/f1/20/86283636e499a1a357fa9441f690ba34f255e731f2fea174132b3b762b57/websockets-16.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d440ff0c6c7469ad59c0a412c383c235935b43635e89425e3f6a0c36de90c31b", size = 185955, upload-time = "2026-07-10T06:32:35.279Z" }, + { url = "https://files.pythonhosted.org/packages/91/23/d7fb734b0095d43bc7f1c9f68afd50adb4176e7e513403e8c70ad7daa4fa/websockets-16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8613129a2533f08de24505e69a3e403cedaadae49abdb043c4d170ca71b7e4bd", size = 188491, upload-time = "2026-07-10T06:32:36.673Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5e/168a192689db468405ecf3b8e4a2c18811936b0724d017ad7e6d252734f0/websockets-16.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:a5bf9c23f197b4ec88290fd5463f33db67362a1bb10f85fc2e8e7627f0ddab97", size = 186983, upload-time = "2026-07-10T06:32:38.207Z" }, + { url = "https://files.pythonhosted.org/packages/7e/9b/66795fa91ebe49019ebe4fa910282172252e37046b80e08fc52e0c365150/websockets-16.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:520b0fd0395f075febb283c76755af724ab9fd19dffa4f3bfd18cb4e622790a3", size = 188890, upload-time = "2026-07-10T06:32:39.545Z" }, + { url = "https://files.pythonhosted.org/packages/5a/32/126bbc844be5afb3613fd43211dac10a9645f4cf39741d04acaa2ec7030c/websockets-16.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:7143aa09a67e1c013be44e81a88dfe90fc6244198ab86c7edd064152cf619805", size = 186583, upload-time = "2026-07-10T06:32:41.038Z" }, + { url = "https://files.pythonhosted.org/packages/22/b9/0b5db9cbcf6e4970db4496893244a8d92e07f71a8ef27cf34b08aa02fef1/websockets-16.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:7acb811fad08e611755800d1560e395c67e11a6bd563598ea6abb319afb86938", size = 187353, upload-time = "2026-07-10T06:32:42.501Z" }, + { url = "https://files.pythonhosted.org/packages/99/2e/254b2131a10d831b76e2c18dfe7add9729c6292c674a8085bf8de01ad151/websockets-16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c5cf88e3faa2f7931bc6baeee7599c97656a3f6ac7f831f4fccba233e141783a", size = 187784, upload-time = "2026-07-10T06:32:43.929Z" }, + { url = "https://files.pythonhosted.org/packages/21/dc/e7288aa8e3ac5a88a0924619984d663c1abf2a87d0ea98290c66fdaee0ec/websockets-16.1-cp314-cp314t-win32.whl", hash = "sha256:589f8842521c8307684ce0b40ce4ad70c5e0aa46484c6f1225a94ef4b8970341", size = 179947, upload-time = "2026-07-10T06:32:45.495Z" }, + { url = "https://files.pythonhosted.org/packages/d3/de/37edf1260ff0fbbd2f82433489c4cfbe799ac2ff21355331609879329fe6/websockets-16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c0e0857c30bbbc2bb5c30687508f0b7ec19aa026cd9f2ff8424d0fee42dcc07", size = 180291, upload-time = "2026-07-10T06:32:47.119Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f4/84ef884775bbe77c46cce79bc7d705ea3bc6574cc00acf81af89754c077d/websockets-16.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7289d899c79e763e6221c8dcb8959361cb43274418538d7c7ad16a43b01d12f9", size = 177387, upload-time = "2026-07-10T06:32:48.574Z" }, + { url = "https://files.pythonhosted.org/packages/d3/d9/6831ec6f65e1eeac770375f4f4b604f23df9bafaa1b47004bc5f9488d513/websockets-16.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e22e9e3719f5131bd62da4db63c8da63eb8c91cc99e16c1cbd122f130e1ae07a", size = 177663, upload-time = "2026-07-10T06:32:50.043Z" }, + { url = "https://files.pythonhosted.org/packages/9d/d4/21d4922fa7fe855813a8b38f181a0ecf02a586e16c1f095fd05471f78cc2/websockets-16.1-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:83bdabafef431247e6b11a9aab8a0893fd8e82e1ed95b32e0373625b03ffce4a", size = 178501, upload-time = "2026-07-10T06:32:51.439Z" }, + { url = "https://files.pythonhosted.org/packages/91/87/7a0320df854dacd09507ca972cb04a4dc5aae279583cc5b80ad5f5819533/websockets-16.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b8d13ceabc5c60995f201b5211d76876e17e68706ebf5d3bc666b32eefff1a6", size = 179397, upload-time = "2026-07-10T06:32:52.892Z" }, + { url = "https://files.pythonhosted.org/packages/31/6a/0da1eb8c8da2ace7b578c8523d32618af85e62a9ebad56051d4a14a38a1c/websockets-16.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81495f9c0085361c582efbc3207fb877174cfe03370f17d9cd70624404aa526f", size = 180546, upload-time = "2026-07-10T06:32:54.619Z" }, + { url = "https://files.pythonhosted.org/packages/66/58/bd83247f39ddc26ffc2c24eb05087a3b749e00cb4509fc6d19daa23c8495/websockets-16.1-py3-none-any.whl", hash = "sha256:c5149dfe490ec7e5ee5dbf624c642fb725f93a5575c7f00ab594ca9eddb8dd81", size = 174031, upload-time = "2026-07-10T06:32:56.079Z" }, +] + +[[package]] +name = "wheel" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging", marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/62/75f18a0f03b4219c456652c7780e4d749b929eb605c098ce3a5b6b6bc081/wheel-0.47.0.tar.gz", hash = "sha256:cc72bd1009ba0cf63922e28f94d9d83b920aa2bb28f798a31d0691b02fa3c9b3", size = 63854, upload-time = "2026-04-22T15:51:27.727Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl", hash = "sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced", size = 32218, upload-time = "2026-04-22T15:51:26.296Z" }, +] + +[[package]] +name = "zipp" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214, upload-time = "2026-05-18T20:08:57.967Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238, upload-time = "2026-05-18T20:08:57.045Z" }, +] diff --git a/web/Cargo.toml b/web/Cargo.toml index e3c66b47..dedcb65e 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -2,6 +2,7 @@ name = "web" version = "0.1.0" edition = "2021" +license = "Apache-2.0" [workspace] @@ -17,7 +18,7 @@ serde_json = "1.0" serde_yaml = "0.9" # HTTP client -reqwest = { version = "0.12", features = ["json"] } +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } urlencoding = "2.1" # Error handling diff --git a/web/assets/tailwind.css b/web/assets/tailwind.css index e51b6678..f23bfdd8 100644 --- a/web/assets/tailwind.css +++ b/web/assets/tailwind.css @@ -2007,10 +2007,6 @@ video { border-color: rgb(245 158 11 / var(--tw-border-opacity, 1)); } -.border-amber-700\/50 { - border-color: rgb(180 83 9 / 0.5); -} - .border-amber-800 { --tw-border-opacity: 1; border-color: rgb(146 64 14 / var(--tw-border-opacity, 1)); @@ -2064,10 +2060,6 @@ video { border-color: rgb(29 78 216 / var(--tw-border-opacity, 1)); } -.border-blue-700\/40 { - border-color: rgb(29 78 216 / 0.4); -} - .border-emerald-200 { --tw-border-opacity: 1; border-color: rgb(167 243 208 / var(--tw-border-opacity, 1)); @@ -2272,10 +2264,6 @@ video { border-color: rgb(51 65 85 / 0.5); } -.border-slate-700\/60 { - border-color: rgb(51 65 85 / 0.6); -} - .border-slate-800 { --tw-border-opacity: 1; border-color: rgb(30 41 59 / var(--tw-border-opacity, 1)); @@ -3450,10 +3438,6 @@ video { background-color: rgb(146 64 14 / var(--tw-bg-opacity, 1)); } -.bg-amber-950\/40 { - background-color: rgb(69 26 3 / 0.4); -} - .bg-black\/20 { background-color: rgb(0 0 0 / 0.2); } @@ -3533,10 +3517,6 @@ video { background-color: rgb(29 78 216 / var(--tw-bg-opacity, 1)); } -.bg-blue-950\/30 { - background-color: rgb(23 37 84 / 0.3); -} - .bg-emerald-100 { --tw-bg-opacity: 1; background-color: rgb(209 250 229 / var(--tw-bg-opacity, 1)); @@ -3791,18 +3771,10 @@ video { background-color: rgb(30 41 59 / 0.3); } -.bg-slate-800\/40 { - background-color: rgb(30 41 59 / 0.4); -} - .bg-slate-800\/50 { background-color: rgb(30 41 59 / 0.5); } -.bg-slate-800\/60 { - background-color: rgb(30 41 59 / 0.6); -} - .bg-slate-800\/80 { background-color: rgb(30 41 59 / 0.8); } @@ -5147,11 +5119,6 @@ video { color: rgb(253 230 138 / var(--tw-text-opacity, 1)); } -.text-amber-400 { - --tw-text-opacity: 1; - color: rgb(251 191 36 / var(--tw-text-opacity, 1)); -} - .text-amber-50 { --tw-text-opacity: 1; color: rgb(255 251 235 / var(--tw-text-opacity, 1)); diff --git a/web/src/agent/cluster.rs b/web/src/agent/cluster.rs index 354863f5..ca0fe88f 100644 --- a/web/src/agent/cluster.rs +++ b/web/src/agent/cluster.rs @@ -2,8 +2,7 @@ use probing_proto::prelude::Node; -use crate::api::{ApiClient, ClusterQueryMeta}; -use crate::utils::error::Result; +use crate::api::ApiClient; #[derive(Debug, Clone, Default)] pub struct ClusterSnapshot { @@ -79,28 +78,6 @@ fn snapshot_from_nodes(nodes: &[Node]) -> ClusterSnapshot { } } -/// Whether this SQL should fan out via `/apis/cluster/query`. -#[allow(dead_code)] -pub fn sql_needs_cluster_fanout(sql: &str, step_cluster: bool) -> bool { - step_cluster || sql.to_lowercase().contains("global.") -} - -#[allow(dead_code)] -pub fn format_cluster_meta(meta: &ClusterQueryMeta) -> String { - if !meta.cluster { - return "local query".to_string(); - } - let mut note = format!("cluster fan-out · {} nodes queried", meta.nodes_queried); - if !meta.nodes_failed.is_empty() { - note.push_str(&format!( - " · {} node(s) failed: {}", - meta.nodes_failed.len(), - meta.nodes_failed.join(", ") - )); - } - note -} - pub fn cluster_context_for_llm(snapshot: &ClusterSnapshot) -> String { let mode = if snapshot.is_distributed() { "distributed (use global.* / cluster fan-out for cross-node SQL)" @@ -109,27 +86,3 @@ pub fn cluster_context_for_llm(snapshot: &ClusterSnapshot) -> String { }; format!("Cluster mode: {mode}\n{}", snapshot.nodes_summary) } - -/// Default `use_global` when the skill parameter is not overridden. -#[allow(dead_code)] -pub fn default_use_global(snapshot: &ClusterSnapshot, skill_default: bool) -> bool { - if !snapshot.is_distributed() { - return false; - } - skill_default -} - -#[allow(dead_code)] -pub async fn execute_sql_for_agent( - sql: &str, - cluster_fanout: bool, -) -> Result<(probing_proto::prelude::DataFrame, Option)> { - let client = ApiClient::new(); - if cluster_fanout { - let resp = client.cluster_query(sql, true).await?; - Ok((resp.dataframe, Some(resp.meta))) - } else { - let df = client.execute_query(sql).await?; - Ok((df, None)) - } -} diff --git a/web/src/agent/routing.rs b/web/src/agent/routing.rs index e72a61e6..68a8d621 100644 --- a/web/src/agent/routing.rs +++ b/web/src/agent/routing.rs @@ -78,58 +78,6 @@ pub fn describe_route(route: &Route) -> PageDescriptor { } } -pub fn match_intents(query: &str, limit: usize) -> Vec { - let q = query.to_lowercase(); - let intents = intent_catalog(); - let mut scored: Vec<(usize, String)> = Vec::new(); - for intent in intents.values() { - let hits = intent - .keywords - .iter() - .filter(|kw| q.contains(kw.to_lowercase().as_str())) - .count(); - if hits > 0 { - for sid in &intent.skills { - scored.push((hits, sid.clone())); - } - } - } - scored.sort_by(|a, b| b.0.cmp(&a.0).then_with(|| a.1.cmp(&b.1))); - scored.dedup_by(|a, b| a.1 == b.1); - scored.into_iter().take(limit).map(|(_, id)| id).collect() -} - -#[allow(dead_code)] -pub fn route_for_page(page_id: &str) -> Option { - let pages = page_catalog(); - let entry = pages.get(page_id)?; - let path = entry.path.trim(); - if path.is_empty() { - return None; - } - if path.starts_with("/profiling") { - let view = path - .trim_start_matches("/profiling/") - .trim_start_matches('/'); - let view = if view.is_empty() { "overview" } else { view }; - return Some(Route::ProfilingViewPage { - view: normalize_profiling_view(view).to_string(), - }); - } - match path { - "/" | "/dashboard" => Some(Route::DashboardPage {}), - "/agent" => Some(Route::AgentPage {}), - "/cluster" => Some(Route::ClusterPage {}), - "/stacks" => Some(Route::StackPage {}), - "/analytics" => Some(Route::AnalyticsPage {}), - "/python" => Some(Route::PythonPage {}), - "/spans" => Some(Route::SpansPage {}), - "/pulsing" => Some(Route::PulsingPage {}), - "/training" => Some(Route::TrainingPage {}), - _ => None, - } -} - pub fn routing_context_for_llm() -> String { let mut lines = vec!["Skill catalog (by priority):".to_string()]; for id in catalog_skill_ids() { diff --git a/web/src/agent/skill.rs b/web/src/agent/skill.rs index 11b1d677..1d0024e0 100644 --- a/web/src/agent/skill.rs +++ b/web/src/agent/skill.rs @@ -3,7 +3,9 @@ use std::collections::HashMap; use std::sync::OnceLock; -use probing_skills::{routing::match_skills, skill_from_api, Skill}; +use probing_skills::{ + match_routed_skills, match_skills, skill_from_api, IntentRoute, Skill, SkillRoute, +}; use serde::Deserialize; use serde_json::Value; @@ -137,32 +139,26 @@ pub fn load_skill(id: &str) -> Option { pub fn match_skills_for_query(query: &str, limit: usize) -> Vec { if skill_store_loaded() { - let q = query.to_lowercase(); - let mut scored: HashMap = HashMap::new(); - for (rank, id) in super::routing::match_intents(query, 10) - .into_iter() - .enumerate() - { - *scored.entry(id).or_insert(0) += 3usize.saturating_mul(10 - rank); - } - for id in list_skill_ids() { - let Some(skill) = load_skill(&id) else { - continue; - }; - let keyword_hits = skill - .keywords - .iter() - .filter(|kw| q.contains(kw.as_str())) - .count(); - let id_hit = q.contains(&skill.id.replace('_', " ")) || q.contains(&skill.id); - if keyword_hits > 0 || id_hit { - *scored.entry(skill.id).or_insert(0) += keyword_hits.max(1); - } - } - let mut ranked: Vec<(usize, String)> = - scored.into_iter().map(|(id, score)| (score, id)).collect(); - ranked.sort_by(|a, b| b.0.cmp(&a.0).then_with(|| a.1.cmp(&b.1))); - return ranked.into_iter().take(limit).map(|(_, id)| id).collect(); + let Ok(guard) = store().read() else { + return match_skills(query, limit); + }; + let intent_routes: Vec = guard + .intents + .values() + .map(|intent| IntentRoute { + keywords: intent.keywords.clone(), + skills: intent.skills.clone(), + }) + .collect(); + let skill_routes: Vec = guard + .skills + .values() + .map(|skill| SkillRoute { + id: skill.id.clone(), + keywords: skill.keywords.clone(), + }) + .collect(); + return match_routed_skills(query, limit, &intent_routes, &skill_routes); } match_skills(query, limit) } diff --git a/web/src/agent/skills_backend.rs b/web/src/agent/skills_backend.rs index 69568d0e..034a75d6 100644 --- a/web/src/agent/skills_backend.rs +++ b/web/src/agent/skills_backend.rs @@ -1,11 +1,10 @@ //! Browser HTTP backend for the shared skill runner. -use probing_proto::prelude::{DataFrame, Message, NodeListResponse, Query, QueryDataFormat}; +use probing_proto::prelude::DataFrame; use probing_skills::backend::{ClusterQueryMeta, SkillBackend}; use probing_skills::runner::{Result, SkillRunError}; use crate::api::ApiClient; -use crate::utils::error::AppError; pub struct WebBackend; @@ -83,11 +82,3 @@ impl SkillBackend for WebBackend { } } } - -#[allow(dead_code)] -fn _query_envelope_unused() { - let _ = Message::new(Query::default()); - let _ = QueryDataFormat::Nil; - let _ = NodeListResponse::default(); - let _ = AppError::Api(String::new()); -} diff --git a/web/src/api/traces.rs b/web/src/api/traces.rs index e3f0eb48..5e3292a9 100644 --- a/web/src/api/traces.rs +++ b/web/src/api/traces.rs @@ -308,41 +308,6 @@ impl ApiClient { Ok(response) } - /// Get Ray task execution timeline - #[allow(dead_code)] - pub async fn get_ray_timeline( - &self, - task_filter: Option<&str>, - actor_filter: Option<&str>, - start_time: Option, - end_time: Option, - ) -> Result> { - let mut query_params = Vec::new(); - - if let Some(filter) = task_filter { - query_params.push(format!("task_filter={}", urlencoding::encode(filter))); - } - if let Some(filter) = actor_filter { - query_params.push(format!("actor_filter={}", urlencoding::encode(filter))); - } - if let Some(time) = start_time { - query_params.push(format!("start_time={}", time)); - } - if let Some(time) = end_time { - query_params.push(format!("end_time={}", time)); - } - - let query_string = if query_params.is_empty() { - String::new() - } else { - format!("?{}", query_params.join("&")) - }; - - let path = format!("/apis/pythonext/ray/timeline{}", query_string); - let response = self.get_request(&path).await?; - Self::parse_json(&response) - } - /// Get Ray timeline in Chrome tracing format (for Perfetto UI) pub async fn get_ray_timeline_chrome_format( &self, @@ -387,20 +352,3 @@ impl ApiClient { Ok(response) } } - -#[allow(dead_code)] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct RayTimelineEntry { - pub name: String, - #[serde(rename = "type")] - pub entry_type: String, - pub start_time: i64, - pub end_time: Option, - pub duration: Option, - pub trace_id: i64, - pub span_id: i64, - pub parent_id: Option, - pub phase: Option, - pub thread_id: i64, - pub attributes: Option, -} diff --git a/web/src/hooks/mod.rs b/web/src/hooks/mod.rs index c817805a..39467004 100644 --- a/web/src/hooks/mod.rs +++ b/web/src/hooks/mod.rs @@ -103,12 +103,7 @@ where } /// Periodic tick signal for polling APIs (e.g. dashboard metrics). -/// Prefer [`use_poll_tick_gated`] when the page can be hidden. -#[allow(dead_code)] -pub fn use_poll_tick(interval_ms: u32) -> Signal { - use_poll_tick_gated(interval_ms, None) -} - +/// Use [`use_poll_tick_gated`] when the page can be hidden. pub fn use_poll_tick_gated(interval_ms: u32, gate: Option>) -> Signal { let tick = use_signal(|| 0u32); let mut interval_slot = use_signal(|| None::); diff --git a/web/src/overhead/metrics.rs b/web/src/overhead/metrics.rs index bb2424c2..5bcc8b58 100644 --- a/web/src/overhead/metrics.rs +++ b/web/src/overhead/metrics.rs @@ -1,6 +1,6 @@ //! TorchProbe overhead domain logic (metrics, parsing, labels). -use probing_proto::prelude::{DataFrame, Ele}; +use probing_proto::prelude::DataFrame; use crate::overhead::sql::WINDOW_STEPS; use crate::utils::error::AppError; @@ -31,21 +31,21 @@ pub fn table_missing_trigger_label(err: &AppError) -> Option { } pub fn overhead_trigger_label(summary: &DataFrame) -> String { - let shadow_baseline = df_scalar_i64(summary, "shadow_baseline", 0).unwrap_or(0); + let shadow_baseline = summary.scalar_i64("shadow_baseline", 0).unwrap_or(0); if shadow_baseline == 0 { return "Shadow off".to_string(); } - let probed_n = df_scalar_i64(summary, "probed_n", 0).unwrap_or(0); - let shadow_n = df_scalar_i64(summary, "shadow_n", 0).unwrap_or(0); + let probed_n = summary.scalar_i64("probed_n", 0).unwrap_or(0); + let shadow_n = summary.scalar_i64("shadow_n", 0).unwrap_or(0); if probed_n == 0 || shadow_n == 0 { return "Collecting baseline…".to_string(); } - let probed_median_ms = df_scalar_f64(summary, "probed_median_ms", 0); - let shadow_median_ms = df_scalar_f64(summary, "shadow_median_ms", 0); + let probed_median_ms = summary.scalar_f64("probed_median_ms", 0); + let shadow_median_ms = summary.scalar_f64("shadow_median_ms", 0); match (probed_median_ms, shadow_median_ms) { (Some(p), Some(s)) => { let (hook_tax, _) = format_overhead_pct(p, s, "Hook tax"); - let latest = df_scalar_i64(summary, "latest_step", 0).unwrap_or(-1); + let latest = summary.scalar_i64("latest_step", 0).unwrap_or(-1); format!("{hook_tax} · step {latest}") } _ => "Collecting baseline…".to_string(), @@ -54,29 +54,19 @@ pub fn overhead_trigger_label(summary: &DataFrame) -> String { pub fn parse_overhead_steps(df: &DataFrame) -> Vec { let mut steps = Vec::new(); - let rows = dataframe_rows(df); + let rows = df.row_count(); for row in 0..rows { - let Some(local_step) = df_scalar_i64(df, "local_step", row) else { + let Some(local_step) = df.scalar_i64("local_step", row) else { continue; }; - let Some(duration_ms) = df_scalar_f64(df, "duration_ms", row) else { + let Some(duration_ms) = df.scalar_f64("duration_ms", row) else { continue; }; - let is_shadow = df_col_index(df, "is_shadow") - .and_then(|ci| df.cols.get(ci)) - .filter(|col| row < col.len()) - .map(|col| ele_boolish(&col.get(row))) - .unwrap_or(false); - let sampled = df_col_index(df, "sampled") - .and_then(|ci| df.cols.get(ci)) - .filter(|col| row < col.len()) - .map(|col| ele_boolish(&col.get(row))) - .unwrap_or(false); steps.push(OverheadStep { local_step, duration_ms, - is_shadow, - sampled, + is_shadow: df.scalar_boolish("is_shadow", row), + sampled: df.scalar_boolish("sampled", row), }); } steps @@ -116,61 +106,19 @@ pub fn format_overhead_pct( } } +#[inline] pub fn dataframe_rows(df: &DataFrame) -> usize { - df.cols.first().map(|c| c.len()).unwrap_or(0) + df.row_count() } +#[inline] pub fn df_scalar_f64(df: &DataFrame, col: &str, row: usize) -> Option { - let ci = df_col_index(df, col)?; - let column = df.cols.get(ci)?; - if row >= column.len() { - return None; - } - ele_f64(&column.get(row)) + df.scalar_f64(col, row) } +#[inline] pub fn df_scalar_i64(df: &DataFrame, col: &str, row: usize) -> Option { - let ci = df_col_index(df, col)?; - let column = df.cols.get(ci)?; - if row >= column.len() { - return None; - } - ele_i64(&column.get(row)) -} - -fn df_col_index(df: &DataFrame, name: &str) -> Option { - df.names.iter().position(|n| n == name) -} - -fn ele_f64(ele: &Ele) -> Option { - match ele { - Ele::F64(x) => Some(*x), - Ele::F32(x) => Some(*x as f64), - Ele::I64(x) => Some(*x as f64), - Ele::I32(x) => Some(*x as f64), - Ele::Text(s) => s.parse().ok(), - _ => None, - } -} - -fn ele_i64(ele: &Ele) -> Option { - match ele { - Ele::I64(x) => Some(*x), - Ele::I32(x) => Some(*x as i64), - Ele::F64(x) => Some(*x as i64), - Ele::Text(s) => s.parse().ok(), - _ => None, - } -} - -fn ele_boolish(ele: &Ele) -> bool { - match ele { - Ele::BOOL(x) => *x, - Ele::I64(x) => *x != 0, - Ele::I32(x) => *x != 0, - Ele::Text(s) => matches!(s.as_str(), "1" | "true" | "True"), - _ => false, - } + df.scalar_i64(col, row) } #[cfg(test)] diff --git a/web/src/pages/training.rs b/web/src/pages/training.rs index 7fa6d6f3..e34e3ed3 100644 --- a/web/src/pages/training.rs +++ b/web/src/pages/training.rs @@ -913,7 +913,7 @@ fn render_comm_local_result( } fn dataframe_rows(df: &probing_proto::prelude::DataFrame) -> usize { - df.cols.first().map(|c| c.len()).unwrap_or(0) + df.row_count() } type HeatmapData = (Vec, Vec, HashMap<(i32, i64), HeatCell>, f64); diff --git a/web/src/state/investigation.rs b/web/src/state/investigation.rs index 47b97c1c..ebfb4359 100644 --- a/web/src/state/investigation.rs +++ b/web/src/state/investigation.rs @@ -307,18 +307,6 @@ pub fn set_trace_context(trace_id: i64, span_name: Option<&str>, tid: Option) { - update_investigation_context(|ctx| { - ctx.pid = Some(pid); - if let Some(text) = label { - ctx.label = Some(text.to_string()); - } else if ctx.label.is_none() { - ctx.label = Some(format!("pid {pid}")); - } - }); -} - /// Sync pid from Dashboard overview without overwriting thread/trace context. pub fn sync_overview_process_context(pid: i32, exe: &str) { update_investigation_context(|ctx| { diff --git a/web/src/utils/source_ref.rs b/web/src/utils/source_ref.rs index ff876c0f..a568a3ea 100644 --- a/web/src/utils/source_ref.rs +++ b/web/src/utils/source_ref.rs @@ -208,7 +208,7 @@ mod tests { .join("\n"); let slice = slice_source(&src, Some(50), 10); assert_eq!(slice.start_line, 40); - assert_eq!(slice.end_line, 61); + assert_eq!(slice.end_line, 60); assert!(slice.text.contains("line 50")); } From 6e2a2432fd268f202a6d0e7bd2528b0e8be826b5 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sun, 12 Jul 2026 14:06:19 +0800 Subject: [PATCH 15/37] =?UTF-8?q?Update=20project=20structure,=20enhance?= =?UTF-8?q?=20documentation,=20and=20improve=20dependen=E2=80=A6=20(#65)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update project structure, enhance documentation, and improve dependency management - Updated `.gitignore` to include additional directories for cleaner project management. - Expanded `AGENTS.md` with new coding principles and guidelines to improve code quality and maintainability. - Modified `Cargo.toml` and `Cargo.lock` to include the `probing-skills` crate, centralizing skill loading and execution. - Enhanced `Makefile` for better handling of Python virtual environments and streamlined build processes. - Added new documentation files for overhead measurement and invariants, ensuring clarity on performance metrics. - Revised existing documentation to reflect changes in skill discovery, execution paths, and overhead measurement. These changes aim to improve the overall structure and usability of the Probing project, enhancing both developer experience and documentation clarity. * Refactor import statements in inject.rs for improved clarity - Removed unused `Context` import from `anyhow`, streamlining the code and enhancing readability in the `inject.rs` file. This change aims to simplify the codebase and improve maintainability. * Update `.gitignore` and fix thread ID retrieval in `span.rs` - Removed the `python/probing/bundled_web/` entry from `.gitignore` for better project management. - Updated the thread ID retrieval in `span.rs` to use the fully qualified path for `std::thread::current().id()`, enhancing code clarity and consistency. These changes aim to improve project cleanliness and code readability. * Enhance probing wheel verification and update Makefile for improved build process - Introduced a new script `verify_wheel_contents.py` to ensure that the probing wheel contains all required assets and modules, enhancing the reliability of the build process. - Updated the Makefile to include a new target for verifying wheel contents before installation, ensuring that necessary files are present and correctly structured. - Refactored the logic in `conftest.py` to check for the completeness of the installed probing package, preventing conflicts with site-packages during testing. - Modified `pyproject.toml` to include additional Python files in the package distribution, improving the completeness of the wheel. These changes aim to improve the integrity of the wheel installation process and enhance the overall development workflow. * Refactor probing module checks and update Makefile for installation process - Renamed the function in `conftest.py` to `_missing_probing_modules` for clarity, returning a list of missing modules instead of a boolean value. - Introduced a new error message format in `conftest.py` to provide clearer feedback on missing modules during installation. - Updated the Makefile to ensure the `PROBING` environment variable is set to `0` during wheel installation, improving the installation process. - Cleaned up `.gitignore` by removing unnecessary entries related to probing libraries. These changes aim to enhance the reliability of the probing module checks and streamline the installation process. --- .cargo/config.toml | 6 + .github/workflows/nightly.yml | 9 +- .github/workflows/test.yml | 10 +- .gitignore | 2 + AGENTS.md | 156 +++++ Cargo.lock | 11 +- Cargo.toml | 42 +- Makefile | 41 +- README.md | 6 +- conftest.py | 48 +- docs/mkdocs.yml | 3 + docs/src/contributing.zh.md | 8 +- docs/src/design/extensibility.md | 5 +- docs/src/design/federation.md | 8 +- docs/src/design/federation.zh.md | 10 +- docs/src/design/hierarchical-fanout.md | 9 +- docs/src/design/hierarchical-fanout.zh.md | 5 +- docs/src/design/index.md | 1 + docs/src/design/index.zh.md | 1 + docs/src/design/modularity.md | 4 +- docs/src/design/modularity.zh.md | 4 +- docs/src/design/overhead-invariants.md | 32 + docs/src/design/overhead-invariants.zh.md | 141 +++++ docs/src/design/overhead.md | 334 ++++++++++ docs/src/design/overhead.zh.md | 443 +++++++++++++ docs/src/design/profiling.md | 10 +- docs/src/design/profiling.zh.md | 8 +- docs/src/guide/debugging.md | 2 +- docs/src/guide/debugging.zh.md | 2 +- docs/src/guide/troubleshooting.md | 12 +- docs/src/guide/troubleshooting.zh.md | 12 +- docs/src/quickstart.md | 12 + docs/src/quickstart.zh.md | 12 + docs/src/reference/env-vars.md | 9 +- docs/src/reference/skill-format.md | 57 +- examples/imagenet_with_span.py | 8 +- probing/cli/Cargo.toml | 6 + probing/cli/src/cli/cluster.rs | 17 +- probing/cli/src/cli/ctrl.rs | 23 +- probing/cli/src/cli/fanout.rs | 15 + probing/cli/src/cli/inject.rs | 362 +---------- probing/cli/src/cli/mod.rs | 1 + probing/cli/src/cli/repl.rs | 15 +- probing/cli/src/cli/store.rs | 8 +- probing/cli/src/inject/injection.rs | 2 +- probing/cli/src/inject/injection_aarch64.rs | 2 +- probing/cli/src/lib.rs | 3 + probing/cli/src/pyo3.rs | 19 + probing/cli/src/table.rs | 8 +- probing/core/Cargo.toml | 6 +- probing/core/src/core/cluster.rs | 8 +- probing/core/src/core/engine.rs | 21 +- .../src/core/federation/aggregate_pushdown.rs | 6 +- .../src/core/federation/cluster_executor.rs | 63 ++ probing/core/src/core/federation/convert.rs | 2 +- .../core/federation/federated_scan_exec.rs | 30 +- probing/core/src/core/federation/mod.rs | 1 + probing/core/src/core/memtable_sql.rs | 33 +- probing/core/src/core/plugin_advanced.rs | 42 ++ probing/core/src/core/probe_extension.rs | 22 +- probing/core/src/core/semantic_catalog.rs | 2 + probing/core/src/runtime.rs | 216 ++++--- probing/core/src/trace/span.rs | 2 +- probing/crates/skills/Cargo.toml | 6 + probing/crates/skills/src/interpret.rs | 156 ++++- probing/crates/skills/src/lib.rs | 6 +- .../skills/src/pyo3.rs} | 27 +- probing/crates/skills/src/runner.rs | 60 +- .../cc/src/extensions/cpu/collector.rs | 195 +++--- probing/extensions/gpu/Cargo.toml | 2 +- .../gpu/src/extensions/collector.rs | 85 ++- .../extensions/gpu/src/extensions/devices.rs | 6 +- probing/extensions/python/Cargo.toml | 2 - .../python/src/extensions/python.rs | 17 +- .../python/src/extensions/python/exttbls.rs | 51 +- .../python/src/extensions/python/tbls.rs | 61 +- .../src/features/crash/memory_snapshot.rs | 42 +- probing/extensions/python/src/features/mod.rs | 1 - .../python/src/features/python_api.rs | 36 +- .../extensions/python/src/features/torch.rs | 7 +- probing/extensions/python/src/repl/session.rs | 18 +- probing/memtable/Cargo.toml | 4 +- probing/memtable/src/cache.rs | 29 +- probing/memtable/src/discover.rs | 42 +- probing/memtable/src/row.rs | 170 +++-- probing/server/API.md | 10 +- probing/server/AUTH.md | 6 + probing/server/Cargo.toml | 7 +- probing/server/src/auth.rs | 100 +-- probing/server/src/engine.rs | 7 +- probing/server/src/extensions.rs | 9 +- probing/server/src/mcp/helpers.rs | 100 ++- probing/server/src/mcp/mod.rs | 108 ++-- probing/server/src/mcp/skill_backend.rs | 76 +++ probing/server/src/server/api/response.rs | 63 +- probing/server/src/server/cluster_fanout.rs | 139 ++-- probing/server/src/server/cluster_query.rs | 39 +- probing/server/src/server/error.rs | 3 +- probing/server/src/server/middleware.rs | 19 +- probing/server/src/server/mod.rs | 41 +- probing/server/src/server/query_dto.rs | 101 ++- probing/server/src/server/sql_guard.rs | 90 +++ probing/server/src/server/training.rs | 32 +- probing/server/src/torchrun_cluster.rs | 29 +- pyproject.toml | 1 + .../bundled_skills/health_overview/SKILL.md | 16 +- .../bundled_skills/health_overview/steps.yaml | 27 +- .../bundled_skills/sre_triage/steps.yaml | 4 +- .../watchdog_timeout/steps.yaml | 8 +- python/probing/dev_pth.py | 20 +- python/probing/handlers/pythonext.py | 8 +- python/probing/hooks/import_hook.py | 9 +- python/probing/inspect/trace.py | 43 +- python/probing/profiling/deferred_drain.py | 185 ++++++ .../probing/profiling/torch/module_utils.py | 14 +- python/probing/profiling/torch_probe.py | 96 +-- scripts/ci/set_nightly_local_version.py | 32 + scripts/prune-bundled-web.sh | 54 ++ scripts/verify_wheel_contents.py | 74 +++ src/lib.rs | 28 +- tests/conftest.py | 41 +- tests/fixtures/skill_interpret_parity.yaml | 27 + tests/regression/profiling/conftest.py | 15 + .../profiling/test_deferred_drain_worker.py | 110 ++++ .../profiling/test_overhead_invariants.py | 61 ++ .../profiling/test_torch_probe_sampling.py | 28 + tests/regression/rust/Cargo.toml | 1 + .../rust/probing/cli/inject_aarch64.rs | 10 +- .../probing/core/table_docs_integration.rs | 1 + .../rust/probing/server/auth_complex_tests.rs | 6 + .../server/hierarchical_fanout_query.rs | 14 +- .../server/training_observability_tests.rs | 2 + tests/regression/spec/api_spec.json | 3 +- .../probing/skills/test_interpret_fixture.py | 8 +- tests/unit/probing/test_dev_pth.py | 8 +- web/.cargo/config.toml | 3 + web/Cargo.toml | 10 +- web/DESIGN.md | 176 ++++-- web/assets/tailwind.css | 40 +- web/dist | 2 +- web/src/agent/interpret.rs | 47 +- web/src/agent/mod.rs | 6 +- web/src/agent/runner.rs | 3 + web/src/agent/skills_backend.rs | 15 +- web/src/api/cluster.rs | 4 + web/src/api/overhead.rs | 2 +- web/src/api/skills.rs | 15 +- web/src/components/agent/chat.rs | 30 +- web/src/components/agent/step_card.rs | 12 +- web/src/components/app_overlays.rs | 19 +- web/src/components/overhead/mod.rs | 2 +- web/src/components/overhead/panel.rs | 596 ++++++++++++------ web/src/components/sidebar/monitors.rs | 103 ++- web/src/overhead/metrics.rs | 479 ++++++++++++-- web/src/overhead/mod.rs | 6 +- web/src/overhead/sql.rs | 10 + 156 files changed, 5305 insertions(+), 1649 deletions(-) create mode 100644 docs/src/design/overhead-invariants.md create mode 100644 docs/src/design/overhead-invariants.zh.md create mode 100644 docs/src/design/overhead.md create mode 100644 docs/src/design/overhead.zh.md create mode 100644 probing/cli/src/cli/fanout.rs create mode 100644 probing/cli/src/pyo3.rs rename probing/{extensions/python/src/features/skills_api.rs => crates/skills/src/pyo3.rs} (71%) create mode 100644 probing/server/src/mcp/skill_backend.rs create mode 100644 probing/server/src/server/sql_guard.rs create mode 100644 python/probing/profiling/deferred_drain.py create mode 100644 scripts/ci/set_nightly_local_version.py create mode 100755 scripts/prune-bundled-web.sh create mode 100644 scripts/verify_wheel_contents.py create mode 100644 tests/regression/profiling/conftest.py create mode 100644 tests/regression/profiling/test_deferred_drain_worker.py create mode 100644 tests/regression/profiling/test_overhead_invariants.py create mode 100644 web/.cargo/config.toml diff --git a/.cargo/config.toml b/.cargo/config.toml index 73a6f51b..80960d8d 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -2,6 +2,12 @@ # [target.x86_64-unknown-linux-gnu] # rustflags = ["-C", "linker=clang", "-C", "link-arg=-fuse-ld=mold"] +# Single artifact tree for the main workspace + web (see web/.cargo/config.toml). +[build] +target-dir = "target" +incremental = true + # dioxus' wasm-opt chokes on some DWARF; skip debuginfo for wasm dev builds. [target.wasm32-unknown-unknown] rustflags = ["-C", "debuginfo=0"] + diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 785a4efb..15c84792 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -57,13 +57,16 @@ jobs: make frontend make wheel-bundle nccl-profiler-lib + - name: Apply nightly local version (PEP 440) + run: python scripts/ci/set_nightly_local_version.py "${{ needs.meta.outputs.local_version }}" + - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.target }} args: >- --release --out dist --zig --compatibility manylinux2014 - --auditwheel repair --local-version ${{ needs.meta.outputs.local_version }} + --auditwheel repair --features extension-module,gpu,gpu-cuda,kmsg sccache: "true" manylinux: auto @@ -99,13 +102,15 @@ jobs: make frontend make wheel-bundle + - name: Apply nightly local version (PEP 440) + run: python scripts/ci/set_nightly_local_version.py "${{ needs.meta.outputs.local_version }}" + - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.target }} args: >- --release --out dist --find-interpreter - --local-version ${{ needs.meta.outputs.local_version }} --features extension-module,gpu,kmsg sccache: "true" rust-toolchain: stable diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b3c19ad9..9d33e773 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,8 +42,6 @@ jobs: make install-wheel make validate-skills make coverage-python-wheel - env: - PROBING: "1" - name: Upload wheel artifact uses: actions/upload-artifact@v4 @@ -89,11 +87,7 @@ jobs: - name: Install wheel and run tests working-directory: ${{ github.workspace }} - run: | - make install-wheel - make test-python-wheel - env: - PROBING: "1" + run: make test-python-wheel web-test: name: Web UI tests (Linux) @@ -264,8 +258,6 @@ jobs: cargo nextest run -p probing-server --no-default-features --features kmsg,gpu - name: Build frontend and wheel, install, and run Python tests - env: - PROBING: "1" run: | make frontend make wheel-ci diff --git a/.gitignore b/.gitignore index 8e049a24..247bf6b3 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ python/probing/probing docs/site/ .venv/ .coverage +.pytest_cache/ +web/target/ diff --git a/AGENTS.md b/AGENTS.md index 0204719f..844e33c1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,6 +15,159 @@ Before adding code, read **`docs/src/design/modularity.md`** (中文: `modularit **Contracts:** `ProbeDataSource` (tables), `ProbeExtension` (config/HTTP), `@table` (Python data), `skills/*/steps.yaml` (workflows). Do not add cross-collector calls — use SQL JOINs. +## Coding principles + +These rules extend `docs/src/design/modularity.md`. Read that doc for layer ownership and dependency direction; follow the rules below on every change. + +### Minimal diff (pragmatic) + +- **Solve the stated problem only.** No cross-module drive-by refactors, renames, or formatting. +- **In touched files, necessary follow-on edits are OK** — fix what the change breaks in the same module; do not expand scope to unrelated modules. +- **One concern per PR.** A bug fix should not also add a feature; a skill SQL tweak should not also change server routing. +- **Composition stays at the root.** New wiring belongs in `probing/server/src/engine.rs` (or the relevant composition root), not sprinkled across L2 collectors. +- **Prefer under 500 lines diff.** Larger PRs need a short justification in the description. + +**Refactoring in the same PR** is allowed only when **under 50 lines and confined to one module/crate**. Larger refactors → separate PR first. + +### High cohesion, low diffusion + +Each crate / directory owns one concern end-to-end. Default: **≤2 modules/crates** per PR. A third module is OK with justification in the PR description. + +**Counted as one logical change (not diffusion):** `probing/server` + `probing/proto` + `tests/regression/spec/api_spec.json` — the standard HTTP contract triple. + +| Good (1–2 modules) | Bad (spaghetti) | +|--------------------|-----------------| +| New NCCL column → `probing-nccl-profiler` only | Collector imports server types to fan out | +| Federation tag fix → `probing-core/federation` | Skill YAML calls a one-off HTTP endpoint | +| Skill step SQL → `skills//steps.yaml` | Server special-cases one skill's query | +| HTTP endpoint → server + proto + api_spec | CLI links `probing-core` at runtime | + +**When you touch an area, fix boundary violations there** (forbidden imports, collector cross-calls) if the cost is reasonable — do not leave the region worse, and do not use a feature PR to pay unrelated tech debt elsewhere. + +**Diffusion smell checklist** — fix before merge: + +1. Import crosses a forbidden edge (see modularity §4)? +2. Same logic duplicated in two collectors? → push to L1 or express as SQL. +3. Feature flag or `if skill == "…"` in server/engine? +4. Change required edits in unrelated layers "for consistency"? + +### Contractual boundaries, not noodles + +Modules interact through **published contracts** only. Implementation details stay private. + +| Contract | Consumers may… | Consumers must NOT… | +|----------|----------------|---------------------| +| `ProbeDataSource` | `SELECT` from table; read schema/docs | Import collector internals | +| `ProbeExtension` | HTTP routes, config keys in `API.md` | Call other extensions directly | +| `@table` / `python.*` | SQL JOIN across schemas | Python collector → Python collector calls | +| `skills/*/steps.yaml` | SQL + documented HTTP only | Import Rust/Python engine code | +| `probing/proto` DTOs | CLI, Web, tests over HTTP | Link `probing-core` from CLI/Web | +| Federation tags (`_host`, `_rank`, …) | Filter/group in SQL | Invent alternate peer columns | + +**When a contract is insufficient:** extend it first (new table, extension route, proto field). A tiny one-off may use an internal API **only with** a tracked issue/TODO and a plan to fold into the contract later. + +**Noodle anti-patterns** (block merge): + +- Callback chains between collectors. +- Type leakage: L3 imports L2 internals; CLI/Web links `probing-core`. +- Stringly coupling: magic table names in server without catalog/docs. +- Side-door `pub fn` for a distant caller instead of extending the contract. + +### Dependencies & feature gates + +- **L1 (`probing/core`, `memtable`, `proto`):** new Rust crates allowed when justified in the PR. +- **L2/L3/L4:** prefer std library and existing workspace deps; avoid new crates/pip packages unless necessary. +- **New behavior:** gate with **env/config** (`PROBING_*`, documented keys) — avoid compile-time `feature` explosion unless platform-gating (Linux-only, etc.). + +### Breaking changes (0.x Beta) + +Public contracts (table columns, HTTP/MCP, skill output semantics) **may break** during Beta, but every breaking change must be **listed explicitly** in the PR description (and CHANGELOG when applicable), with regression/contract tests and docs updated. + +### Documentation + +Update docs for anything **user-visible**: CLI behavior, env vars, table schema, skill interpretation, HTTP/MCP tools. Minimum touch points: relevant `docs/src/` page, `API.md` / `SKILL.md` as applicable. + +### Code review priorities + +Reviewers should **block on boundary violations** before nitpicking style: wrong layer, contract bypass, missing test tier, module diffusion. Correctness matters equally once boundaries are clean. + +### Change checklist (before opening a PR) + +1. Which **layer** owns this? (`modularity.md` §6 concern table) +2. How many **modules/crates**? Default ≤2; server+proto+api_spec = one logical change. +3. Crossed boundaries only via a **contract** (or internal API + issue)? +4. Tests in the **right tier** — TDD preferred: failing test first, then implementation. +5. User-visible change → **docs** updated? +6. Breaking contract → **called out** in PR description? + +### TorchProbe overhead (do not regress) + +Changing overhead **formulas**, **`_close_step_wall` hook order**, or **deferred drain defaults** requires reading **`docs/src/design/overhead-invariants.zh.md`** and updating the tests listed there. + +| Invariant | Do not | +|-----------|--------| +| Primary % | Replace median ratios with `mean(probed)/mean(shadow)` | +| Amortized | Use mean amortization; must be `(1−rate)×dispatch + rate×sampled` | +| Hook order | Call `_drain_deferred()` before `_record_step_timing()` | +| Async drain | Remove default `PROBING_TORCH_DEFER_ASYNC=1` without replacement | + +```bash +cd web && cargo test overhead +PROBING=0 pytest tests/regression/profiling/test_overhead_invariants.py tests/regression/profiling/test_torch_probe_sampling.py -q +``` + +## Testing + +Full layout: `tests/README.md`. Two tiers: **unit** (fast, isolated) and **regression** (integration, contract, E2E). **Prefer TDD:** write a failing test, then implement. + +### Where tests live + +| Kind | Rust | Python | +|------|------|--------| +| **Unit** | `#[cfg(test)]` modules **inside** the crate under test (`probing/**/src/**/*.rs`) | `tests/unit/probing/…` — **mirror** `python/probing/` layout | +| **Regression / integration** | `tests/regression/rust/probing//…` (workspace crate `probing-rust-regression`) | `tests/regression//…` (`core/`, `ext/`, `nccl/`, `skills/`, …) | +| **Contract** | Same regression crate + `tests/regression/spec/` (`api_spec.json`) | `tests/regression/spec/test_api_spec.py` | +| **Crate-local integration** | Rare: `probing//tests/*.rs` when tightly bound to one crate (e.g. `probing/server/tests/`) | — | + +**Not test directories:** `python/probing/testing/` — shared factories/fixtures only. + +### What belongs in each tier + +**Unit** — required for **new functions, branches, and bug fixes** in logic paths; pure wiring/glue may omit unit tests: + +- Pure functions, parsers, federation rewrite, skill YAML loader, env helpers. +- No live engine, no network (unless testing memtable itself). +- Rust: `make test-rust-unit`. Python: `make test-python-unit` (`tests/unit/conftest.py` → `PROBING=0`). + +**Regression** — required when changing **public surface**: HTTP/MCP endpoints, federation behavior, skill output semantics, cross-crate integration: + +- `POST /query`, cluster fan-out, torchrun heartbeat, NCCL mock tables, training_observability E2E. +- Internal refactors with unchanged behavior may rely on existing regression tests. +- Python: `make test-python-regression` (`PROBING=1`). Rust: `make test-rust-regression`. + +**Contract** — any HTTP/MCP change: + +- Update `tests/regression/spec/api_spec.json` and run `pytest tests/regression/spec/ -q`. + +### Test placement rules + +1. **Test the module you changed** — unit tests next to (Rust) or mirrored under (Python) that module. +2. **One integration test per boundary** — do not duplicate the same federation/API check in server and CLI. +3. **No production imports from `tests/`** — tests use public APIs and contracts only. +4. **Skills** — loader/interpret unit tests in `tests/unit/probing/skills/`; E2E in `tests/regression/skills/` or `tests/regression/nccl/`. +5. **Markers** — `unit`, `regression`, `integration`, `slow` (`pyproject.toml`); expensive tests → `slow`, not unit. + +### Commands (run what you touched) + +```bash +make test-rust-unit # Rust unit (in-crate) +make test-rust-regression # Rust integration +make test-python-unit # Python unit +make test-python-regression # Python integration +python -m probing.skills validate # after skills/ edits +pytest tests/regression/spec/ -q # after API.md / HTTP changes +``` + ## Error handling & runtime Keep the propagation chain clean — don't reintroduce scattered `map_err`/`inspect_err`. @@ -102,6 +255,9 @@ plan_skill_run("health_overview") | `memory_leak` | GPU memory growth | | `module_bottleneck` | slow PyTorch modules | | `gpu_pressure` | GPU util / headroom | +| `watchdog_timeout` | NCCL watchdog / Flight Recorder collective alignment | +| `sre_triage` | on-call first-response runbook | +| `crash_triage` | post-crash log / spill triage | Details in each `skills//SKILL.md`. diff --git a/Cargo.lock b/Cargo.lock index 753a25d5..2773c327 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3359,6 +3359,7 @@ dependencies = [ "probing-core", "probing-python", "probing-server", + "probing-skills", "pyo3", "pyo3-build-config", ] @@ -3403,6 +3404,7 @@ dependencies = [ "probing-skills", "probing-store", "procfs", + "pyo3", "reedline", "serde", "serde_json", @@ -3450,9 +3452,9 @@ name = "probing-gpu" version = "0.2.5" dependencies = [ "anyhow", + "arrow", "async-trait", "cudarc", - "datafusion", "libc", "log", "metal", @@ -3567,11 +3569,9 @@ dependencies = [ "log", "nix 0.31.3", "once_cell", - "probing-cli", "probing-core", "probing-memtable", "probing-proto", - "probing-skills", "probing-store", "pyo3", "pyo3-build-config", @@ -3600,6 +3600,7 @@ dependencies = [ "futures", "probing-cli", "probing-core", + "probing-hccl-shim", "probing-memtable", "probing-proto", "probing-python", @@ -3629,10 +3630,11 @@ dependencies = [ "nu-ansi-term", "once_cell", "probing-cc", - "probing-cli", "probing-core", "probing-gpu", + "probing-hccl-shim", "probing-memtable", + "probing-nccl-profiler", "probing-proto", "probing-python", "probing-skills", @@ -3654,6 +3656,7 @@ dependencies = [ "anyhow", "async-trait", "probing-proto", + "pyo3", "serde", "serde_json", "serde_yaml", diff --git a/Cargo.toml b/Cargo.toml index 7a5222a5..014a3145 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,20 @@ members = [ "probing/crates/store", "probing/crates/skills", ] +# `cargo build` without -p skips regression harness / cdylib-only crates. +default-members = [ + "probing/cli", + "probing/core", + "probing/server", + "probing/memtable", + "probing/proto", + "probing/extensions/python", + "probing/extensions/cc", + "probing/extensions/gpu", + "probing/extensions/nccl-profiler", + "probing/crates/skills", + "probing/crates/store", +] [workspace.package] version = "0.2.5" @@ -60,6 +74,7 @@ tokio = { version = "1.52.3", default-features = false, features = [ "io-util", "rt-multi-thread", ] } +ureq = { version = "3.3", default-features = false, features = ["json", "rustls"] } criterion = { version = "0.6.0", features = ["html_reports"] } [package] @@ -96,7 +111,8 @@ probing-server = { path = "probing/server", default-features = false, features = probing-python = { path = "probing/extensions/python", default-features = false, features = [ "tracing", ] } -probing-cli = { path = "probing/cli" } +probing-cli = { path = "probing/cli", features = ["python-bridge"] } +probing-skills = { path = "probing/crates/skills", features = ["python-bridge"] } anyhow = { workspace = true } ctor = { workspace = true } @@ -114,16 +130,26 @@ pyo3 = { version = "0.29.0", default-features = false, features = [ [build-dependencies] pyo3-build-config = "0.29.0" -# Faster compile + smaller artifacts than default dev (full DWARF). -# Line tables still support breakpoints / backtraces; use `DEBUG=1 make develop` for this profile. +# Dev (`DEBUG=1 make develop`, `cargo check`): prioritize compile speed + lean intermediates. +# debug=1 → line tables only (breakpoints/backtraces without full DWARF). [profile.dev] debug = 1 split-debuginfo = "unpacked" -codegen-units = 16 +incremental = true +codegen-units = 256 +[profile.dev.build-override] +opt-level = 3 + +# Release (`make develop`, wheels, CI): smaller artifacts; thin LTO beats fat LTO on link time. +# opt-level "s" ≈ "z" size with faster codegen than aggressive "z". [profile.release] -opt-level = "z" # Optimize for size. -panic = "unwind" -strip = false # Automatically strip symbols from the binary. -# lto = "thin" +opt-level = "s" +lto = "thin" codegen-units = 16 +panic = "unwind" +strip = true + +[profile.release.build-override] +opt-level = 3 +codegen-units = 256 diff --git a/Makefile b/Makefile index 8193d1e5..d99f996b 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,9 @@ # .DEFAULT_GOAL := help +# Single Rust artifact tree (web/.cargo/config.toml points here too). +export CARGO_TARGET_DIR := $(CURDIR)/target + ifdef DEBUG MATURIN_RELEASE := CARGO_RELEASE := @@ -19,7 +22,8 @@ UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) MATURIN_FEATURES := extension-module,gpu,gpu-cuda,kmsg else - MATURIN_FEATURES := extension-module,gpu,kmsg + # kmsg is Linux-only (rmesg); omit on macOS to avoid linking rmesg + clap v3. + MATURIN_FEATURES := extension-module,gpu endif MATURIN_FLAGS := $(MATURIN_RELEASE) --features $(MATURIN_FEATURES) @@ -79,6 +83,7 @@ help: @echo "Probing — make [target] (see docs/src/contributing.md)" @echo "" @echo " develop / dev Bootstrap: _core, CLI, pytest, site hook" + @echo " Tip: DEBUG=1 make develop → dev profile (faster link)" @echo " core Rebuild probing._core after Rust edits" @echo " frontend Build UI into python/probing/bundled_web (dx bundle)" @echo " wheel Build dist/*.whl (needs bundled_web; bundles skills + UI)" @@ -114,7 +119,7 @@ help: fi # ============================================================================== -.PHONY: core develop dev check-dev frontend wheel wheel-ci install-wheel wheel-bundle nccl-profiler-lib nccl-profiler-bench hccl-shim-lib venv venv-wheel install-build-deps install-wheel-test-deps +.PHONY: core develop dev check-dev frontend wheel wheel-ci install-wheel verify-wheel-contents wheel-bundle nccl-profiler-lib nccl-profiler-bench hccl-shim-lib venv venv-wheel install-build-deps install-wheel-test-deps venv: @BOOT="$(PYTHON_BOOTSTRAP)"; \ @@ -158,7 +163,9 @@ sync-uv-groups: venv uv sync --frozen --no-install-project $$args core: venv nccl-profiler-lib hccl-shim-lib + @$(VENV_PYTHON) $(DEV_PTH) remove 2>/dev/null || true $(VENV_PYTHON) -m maturin develop $(MATURIN_FLAGS) + @$(VENV_PYTHON) $(DEV_PTH) install develop: venv install-build-deps core install-dev-python-deps @echo " Python: $$($(VENV_PYTHON) -c 'import sys; print(sys.executable)')" @@ -202,16 +209,14 @@ frontend: @test -n "$$SKIP_FRONTEND_CLEAN" || rm -rf python/probing/bundled_web cd web && dx bundle --release @test -f $(BUNDLED_WEB_PUBLIC)/index.html - @js=$$(grep -oE 'web-dxh[^" ]+\.js' $(BUNDLED_WEB_PUBLIC)/index.html | head -1); \ - for f in $(BUNDLED_WEB_PUBLIC)/assets/web-dxh*.js; do \ - test "$$f" = "$(BUNDLED_WEB_PUBLIC)/assets/$$js" || rm -f "$$f"; \ - done + @chmod +x scripts/prune-bundled-web.sh + @./scripts/prune-bundled-web.sh $(BUNDLED_WEB_PUBLIC) @mkdir -p $(BUNDLED_WEB_PUBLIC)/assets @cp -f web/assets/logo.svg $(BUNDLED_WEB_PUBLIC)/logo.svg 2>/dev/null || true @cp -f web/assets/logo.svg $(BUNDLED_WEB_PUBLIC)/assets/logo.svg 2>/dev/null || true @cp -f web/assets/tailwind.css $(BUNDLED_WEB_PUBLIC)/assets/tailwind.css @rm -rf web/dist - @ln -s python/probing/bundled_web/public web/dist + @ln -sfn ../python/probing/bundled_web/public web/dist @echo "$(BUNDLED_WEB_PUBLIC) ($$(du -sh $(BUNDLED_WEB_PUBLIC) | cut -f1))" wheel-bundle: @@ -221,20 +226,26 @@ wheel-bundle: wheel: install-build-deps wheel-bundle nccl-profiler-lib hccl-shim-lib $(PYTHON) -m maturin build $(MATURIN_FLAGS) --out dist + @$(MAKE) verify-wheel-contents wheel-ci: $(MAKE) wheel -install-wheel: +verify-wheel-contents: + @$(PYTHON) scripts/verify_wheel_contents.py + +install-wheel: verify-wheel-contents @WH=$$(ls -1 dist/probing-*.whl 2>/dev/null | head -1); \ test -n "$$WH" || { echo "run: make wheel"; exit 1; }; \ - $(PYTHON) -m pip install -q -U pip && \ - $(PYTHON) -m pip install --force-reinstall "$$WH" && \ + PROBING=0 $(PYTHON) -m pip install -q -U pip && \ + PROBING=0 $(PYTHON) -m pip install --force-reinstall "$$WH" && \ PROBING=0 $(PYTHON) -c "\ +import importlib.util; \ import probing; from probing import _core; from pathlib import Path; \ root = Path(probing.__file__).resolve().parent; \ assert (root / 'bundled_skills' / 'catalog.yaml').is_file(), f'missing bundled skills under {root}'; \ assert (root / 'bundled_web' / 'public' / 'index.html').is_file() or (root / 'bundled_web' / 'index.html').is_file(), f'missing bundled web UI under {root}'; \ +assert all(importlib.util.find_spec(m) for m in ('probing.skills.loader', 'probing.ext', 'probing.handlers')), 'missing probing.* modules in installed wheel'; \ print('probing', probing.VERSION)" # Linux NCCL plugin copied into python/probing/libs/ for the wheel. @@ -311,8 +322,8 @@ test-python-regression: check-dev test-doctest: ${PYTEST_RUN} --doctest-modules python/probing --ignore=python/probing/cli/__main__.py -test-python-wheel: install-wheel-test-deps - PROBING=1 PROBING_VM_TRACER=0 $(PYTHON) -m pytest $(PYTEST_WHEEL_FLAGS) $(PYTEST_WHEEL_EXTRA) $(PYTEST_WHEEL_ARGS) +test-python-wheel: install-wheel-test-deps install-wheel + PROBING=1 PROBING_VM_TRACER=0 PROBING_WHEEL_TEST=1 $(PYTHON) -m pytest $(PYTEST_WHEEL_FLAGS) $(PYTEST_WHEEL_EXTRA) $(PYTEST_WHEEL_ARGS) coverage-python-wheel: $(MAKE) test-python-wheel PYTEST_WHEEL_EXTRA="--cov=probing --cov=tests --cov-report=xml:coverage.xml" @@ -380,6 +391,8 @@ docs-clean: @cd docs && $(MAKE) clean clean: - rm -rf dist docs/site python/probing/bundled_web web/dist + rm -rf dist docs/site python/probing/bundled_web web/dist web/target + rm -rf python/probing/libs python/probing/shim/hccl + rm -rf .pytest_cache .coverage coverage.xml coverage.lcov cargo clean - rm -f coverage.lcov coverage.xml coverage.json + rm -f coverage.lcov coverage.json diff --git a/README.md b/README.md index 60e013fd..9fc11b33 100644 --- a/README.md +++ b/README.md @@ -243,14 +243,14 @@ print(f'GPU alloc: {alloc:.0f}MB, reserved: {reserved:.0f}MB') ### Configuration Options ```bash # Environment variable configuration -export PROBING_SAMPLE_RATE=0.1 # Set sampling rate -export PROBING_RETENTION_DAYS=7 # Data retention period +export PROBING_TORCH_PROFILING=0.05 # TorchProbe step sampling (see docs) +export PROBING_RETENTION_DAYS=7 # Data retention period (when configured) # View current configuration probing -t config # Dynamic configuration updates -probing -t config probing.sample_rate=0.05 +probing -t config probing.torch.profiling=0.05 probing -t config probing.max_memory=1GB probing -t config "probing.rdma.hca.name='mlx5_cx6_0'" probing -t config "probing.rdma.sample.rate='5'" diff --git a/conftest.py b/conftest.py index 83c09ad4..99648121 100644 --- a/conftest.py +++ b/conftest.py @@ -1,10 +1,50 @@ +"""Root pytest hook — keep in sync with ``tests/conftest.py`` path logic.""" + +from __future__ import annotations + +import importlib.util +import os import sys from pathlib import Path -# Add python directory to sys.path to allow importing probing without installation -root_dir = Path(__file__).parent -python_dir = root_dir / "python" -sys.path.insert(0, str(python_dir)) +# Allow ``import probing`` from the checkout during ``make develop`` runs. +# Skip when a complete wheel is installed so we do not shadow site-packages. +_repo_python = Path(__file__).parent / "python" + + +def _missing_probing_modules() -> list[str]: + try: + import importlib.util + + required = ( + "probing._core", + "probing.skills.loader", + "probing.ext", + "probing.handlers", + ) + return [name for name in required if importlib.util.find_spec(name) is None] + except (ImportError, ModuleNotFoundError, ValueError): + return ["probing (import system error)"] + + +def _installed_probing_is_complete() -> bool: + return not _missing_probing_modules() + + +if _repo_python.is_dir(): + _prepend_repo = not _installed_probing_is_complete() + if os.environ.get("PROBING_WHEEL_TEST") == "1" and not _installed_probing_is_complete(): + missing = ", ".join(_missing_probing_modules()) + raise RuntimeError( + "installed wheel is incomplete " + f"(missing: {missing}); " + "run: make frontend && make wheel && make install-wheel " + "(install with PROBING=0 — do not set PROBING=1 during pip install)" + ) + if _prepend_repo: + _repo_python_str = str(_repo_python) + if _repo_python_str not in sys.path: + sys.path.insert(0, _repo_python_str) # The Rust extension (probing._core) must exist — run once: ``make develop`` # (builds _core into python/probing/ and installs the ``probing`` CLI). diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index f13c7e9a..bfe1c601 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -99,6 +99,7 @@ plugins: Extensibility: 扩展机制 CLI Command Tree: CLI 命令树 Profiling: 性能分析 + Overhead: 开销测量 NCCL Profiler: NCCL Profiler Debugging Engine: 调试引擎 Training Phases: 训练阶段 @@ -155,6 +156,8 @@ nav: - CLI Command Tree: design/cli.md - Collectors & Profiling: - Profiling: design/profiling.md + - Overhead: design/overhead.md + - Overhead invariants: design/overhead-invariants.md - NCCL Profiler: design/nccl-profiler.md - Debugging Engine: design/debugging.md - Training Phases: design/training-phase.md diff --git a/docs/src/contributing.zh.md b/docs/src/contributing.zh.md index 9937faf8..512d0448 100644 --- a/docs/src/contributing.zh.md +++ b/docs/src/contributing.zh.md @@ -42,7 +42,7 @@ make test-python-regression # Python 冒烟;完整套件:make test | **Rust** | 引擎、服务、采集、CLI | `probing/`(Rust workspace) | [模块化](design/modularity.zh.md) | `probing/core`、`probing/server` 相关 issue | | **Web UI** | Investigate、各页面 | `web/` | [web/DESIGN.md](https://github.com/DeepLink-org/probing/blob/main/web/DESIGN.md) | Agent 体验(完整 wheel 构建需 `dx`) | -**Skill 数据 vs Python 包:** skill **内容**改仓库根 `skills/`;**加载/安装代码**改 `python/probing/skills/`。**不要**手改 `python/probing/_skills/`(由 `make wheel` 自动生成)。 +**Skill 数据 vs Python 包:** skill **内容**改仓库根 `skills/`(wheel 复制到 `python/probing/bundled_skills/`);**加载/安装代码**改 `python/probing/skills/`。**不要**手改 `python/probing/bundled_skills/`(由 `make wheel` 自动生成)。 **两个 `probing/` 目录:** 仓库根 `probing/` 是 **Rust**;`python/probing/` 是 **Python 包**。根目录 `src/lib.rs` 是 PyO3 入口,构建为 `probing._core`。 @@ -176,7 +176,7 @@ PROBING=1 python examples/tracing.py - **编写**:仓库根 `skills/`(`SKILL.md`、`steps.yaml`、`catalog.yaml`) - **安装到 IDE**:`./skills/install.sh` 或 `probing skill install` -- **打进 wheel**:`make wheel` 自动复制到 `python/probing/_skills/`、`python/probing/_web/` +- **打进 wheel**:`make wheel` 自动复制到 `python/probing/bundled_skills/`、`python/probing/bundled_web/` - **说明**:`skills/README.md`、[扩展机制 — 诊断 skill](design/extensibility.zh.md#path-2-diagnostic-skill) ## 开发流程 @@ -246,8 +246,8 @@ probing/ # 仓库根 │ ├── probing/ # Python 包(不是 Rust) │ │ ├── skills/ # skill 加载/安装代码 — 见 python/probing/skills/README.md │ │ ├── web_assets.py # wheel _web/ + editable web/dist → PROBING_ASSETS_ROOT -│ │ ├── _skills/ # wheel 生成(make wheel),勿手改 -│ │ └── _web/ # wheel 生成(make wheel),勿手改 +│ │ ├── bundled_skills/ # wheel 打包的 skill 数据(编写在 repo-root skills/) +│ │ └── bundled_web/ # wheel 打包的 UI(make frontend) │ ├── probing_hook.py │ └── probing.pth ├── src/lib.rs # PyO3 → probing._core diff --git a/docs/src/design/extensibility.md b/docs/src/design/extensibility.md index 10856b6b..ee4b0cc5 100644 --- a/docs/src/design/extensibility.md +++ b/docs/src/design/extensibility.md @@ -399,12 +399,15 @@ export PROBING=2 torchrun --nproc_per_node=8 train.py ``` -Requires **NCCL ≥ 2.26** (PyTorch 2.8+). The plugin exports `ncclProfiler_v3` only and writes mmap tables consumed by probing SQL: +Requires **NCCL ≥ 2.26** (PyTorch 2.8+). The plugin exports **`ncclProfiler_v4`** (NCCL 2.27+) and **`ncclProfiler_v3`** (NCCL 2.26) and writes mmap tables consumed by probing SQL: | Table | Content | |-------|---------| | `nccl.proxy_ops` | Per-proxy-op wait: `send_gpu_wait_ns` (culprit), `recv_wait_ns` (victim), `tp_rank`/`pp_rank`/`dp_rank` | +| `nccl.coll_perf` | Collective-level timing (v4) | +| `nccl.inflight_ops` | Watchdog snapshots of hung in-flight ops (`PROBING_NCCL_INFLIGHT_THRESHOLD_SECS`) | | `nccl.net_qp` | Optional NetPlugin IB QP timing (mask bit 128) | +| `nccl.profiler_counters` | Pool/ring health counters (`pool_exhausted`, `write_errors`, …) | ### Query and diagnose diff --git a/docs/src/design/federation.md b/docs/src/design/federation.md index 21575bad..6ed1580a 100644 --- a/docs/src/design/federation.md +++ b/docs/src/design/federation.md @@ -22,7 +22,7 @@ A coordinator query: |-----------|------------| | Write local, read on demand | No central store on the training path; fan-out only for `cluster query` / `global.*` | | Single engine entry | CLI, Web, skills, `probing.query()` share `Engine::async_query` | -| Partial failure | Peer timeout → omit shard, record `nodes_failed`; query continues | +| Partial failure | Default: peer timeout → omit shard, record `nodes_failed`; query continues with `partial=true` (HTTP 503 for cluster API). Set `PROBING_FANOUT_STRICT=1` to fail the whole query instead. | | No cross-rank JOIN | `global.a JOIN global.b` unsupported; join inside one process (path C) | **Entry points** @@ -244,7 +244,11 @@ flowchart LR | Peer set | Snapshot of `cluster.nodes`, **excluding** coordinator listen addrs | | Peer execution | Always `probe.*`; peers must not fan-out again | | Concurrency | Parallel peer requests; latency ≈ slowest peer + coordinator merge | -| Timeout | Failed peer → `nodes_failed`; default 2s (`PROBING_REMOTE_QUERY_TIMEOUT_SECS`) | +| Timeout | Failed peer → `nodes_failed`; default **30s** (`PROBING_REMOTE_QUERY_TIMEOUT_SECS`) | +| Strict fan-out | `PROBING_FANOUT_STRICT=1` fails query on any `nodes_failed` or `peer_batches_dropped` (no partial merge) | +| Partial HTTP | Cluster/fan-out APIs return **503** with partial `dataframe` when `meta.partial=true` (non-strict only) | +| Peer 503 accept | Non-strict mode may accept peer HTTP 503 bodies with partial data during hierarchical merge | +| Federated scan logs | Peer drops log at **debug** by default; **warn** when `PROBING_FANOUT_STRICT=1` | | Hierarchical fan-out | Default on: coordinator → local0 → leaves; see [Hierarchical fan-out](hierarchical-fanout.md) | ### 4.2 Path selection diff --git a/docs/src/design/federation.zh.md b/docs/src/design/federation.zh.md index 43d808de..4bdcc92e 100644 --- a/docs/src/design/federation.zh.md +++ b/docs/src/design/federation.zh.md @@ -21,7 +21,7 @@ |--------|------| | 本地写、按需读 | 训练路径无中心存储;仅 `cluster query` / `global.*` fan-out | | 单一引擎入口 | CLI、Web、skill、`probing.query()` 共用 `Engine::async_query` | -| 部分失败 | peer 超时 → 丢弃分片,记录 `nodes_failed`;查询继续 | +| 部分失败 | 默认:peer 超时 → 丢弃分片,记录 `nodes_failed`;查询继续且 `partial=true`(集群 API 返回 HTTP 503)。设置 `PROBING_FANOUT_STRICT=1` 则整查失败。 | | 无跨 rank JOIN | 不支持 `global.a JOIN global.b`;单进程内 join(路径 C) | **入口** @@ -251,7 +251,11 @@ flowchart LR | Peer 集合 | `cluster.nodes` 快照,**排除** coordinator 自身 listen addr | | Peer 执行 | 永远 `probe.*`;禁止 peer 再 fan-out(防递归) | | 并发 | 各 peer 并行请求;总延迟 ≈ 最慢 peer + coordinator 合并 | -| 超时 | 单 peer 超时记 `nodes_failed`,不拖垮整查(默认 2s,可 `PROBING_REMOTE_QUERY_TIMEOUT_SECS` 覆盖) | +| 超时 | 失败 peer → `nodes_failed`;默认 **30s**(`PROBING_REMOTE_QUERY_TIMEOUT_SECS`) | +| 严格 fan-out | `PROBING_FANOUT_STRICT=1`:任一 `nodes_failed` 或 `peer_batches_dropped` 则整查失败(无 partial merge) | +| Partial HTTP | 集群/fan-out API 在 `meta.partial=true` 时返回 **503** 及 partial `dataframe`(非 strict 模式) | +| Peer 503 接受 | 非 strict 模式下,分层 merge 可接受 peer HTTP 503 的 partial body | +| 联邦 scan 日志 | 默认 peer 丢弃记 **debug**;`PROBING_FANOUT_STRICT=1` 时记 **warn** | | 分层 fan-out | 默认开启:`coordinator → 各机 local0 → 本机 leaf`;见 [分层集群查询](hierarchical-fanout.zh.md) | ### 4.2 路径选型 @@ -337,7 +341,7 @@ merge 后再 `GROUP BY` 数据列 + 用户请求的标签列(若有)。 | `LIMIT` | 在 coordinator **merge + ORDER BY 之后**截断;全局 top-K | | 仅 `ORDER BY`/`LIMIT`、无聚合 | 不满足 A → 走路径 B 或 C | -**部分失败:** 成功 peer 的 partial 仍参与 merge;失败 addr 写入 `nodes_failed`。 +**部分失败:** 默认成功 peer 的 partial 仍参与 merge;失败 addr 写入 `nodes_failed`,`meta.partial=true` 时 HTTP **503**(非 strict)。`PROBING_FANOUT_STRICT=1` 时任一失败即整查失败。 ### 4.6 路径 B — 联邦 scan diff --git a/docs/src/design/hierarchical-fanout.md b/docs/src/design/hierarchical-fanout.md index 31b809cc..03db18dc 100644 --- a/docs/src/design/hierarchical-fanout.md +++ b/docs/src/design/hierarchical-fanout.md @@ -72,7 +72,7 @@ Hierarchical mode depends on metadata in `cluster.nodes`: | `local_rank` | Distinguish local0 (`0`) vs leaf | | `addr` | HTTP fan-out target | -Filled automatically by torchrun heartbeat / `PUT /apis/nodes`. If the cluster view **lacks** these fields, probing **falls back to flat fan-out** (same as `hierarchical=false`). +Filled automatically by torchrun heartbeat / `PUT /apis/nodes`. If the cluster view **lacks** these fields while hierarchical mode is on (default), **`POST /apis/cluster/query` returns HTTP 503** — probing does **not** silently fall back to flat fan-out. Use `hierarchical=false` (or `--flat`) only when you explicitly accept flat fan-out. --- @@ -105,6 +105,8 @@ Filled automatically by torchrun heartbeat / `PUT /apis/nodes`. If the cluster v "scope": "coordinator", "nodes_queried": 3, "nodes_failed": [], + "peer_batches_dropped": 0, + "partial": false, "node_aggregators_queried": 1, "local_ranks_queried": 1 } @@ -112,6 +114,8 @@ Filled automatically by torchrun heartbeat / `PUT /apis/nodes`. If the cluster v | Field | Meaning | |-------|---------| +| `partial` | `true` when any peer failed or merge dropped batches — HTTP **503** with partial `dataframe` (unless `PROBING_FANOUT_STRICT=1`, then the query fails entirely) | +| `peer_batches_dropped` | Partial peer DataFrames dropped during coordinator merge | | `nodes_queried` | Successful **HTTP endpoints** in this query (local local0, local leaves, remote node aggs) | | `node_aggregators_queried` | Remote **local0** endpoints contacted at coordinator tier | | `local_ranks_queried` | **Leaf ranks** contacted on the coordinator machine | @@ -159,9 +163,10 @@ Complex CTE + window queries should still be split into diagnostic chains (see [ | Variable | Default | Description | |----------|---------|-------------| | `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | `0` = global flat fan-out (legacy O(world_size) path) | +| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `30` | Per-peer HTTP timeout (per tier in hierarchical mode); see [Environment variables](../reference/env-vars.md) | +| `PROBING_FANOUT_STRICT` | unset | When `1` or `true`, any peer failure or dropped batch fails the whole query (no partial 503) | When hierarchical mode is on (default) but `cluster.nodes` lacks `group_rank` / `local_rank` (heartbeat not converged), **`POST /apis/cluster/query` returns HTTP 503** instead of silently falling back to flat fan-out. Use `hierarchical=false` only when you explicitly accept flat fan-out. -| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `2` | Per-peer HTTP timeout (per tier in hierarchical mode) | Cluster heartbeat variables: [Environment variables — cluster](../reference/env-vars.md) and [Torchrun cluster heartbeat](torchrun-cluster.md). diff --git a/docs/src/design/hierarchical-fanout.zh.md b/docs/src/design/hierarchical-fanout.zh.md index 89a24b29..d05e0641 100644 --- a/docs/src/design/hierarchical-fanout.zh.md +++ b/docs/src/design/hierarchical-fanout.zh.md @@ -72,7 +72,7 @@ POST /apis/cluster/query | `local_rank` | 识别 local0(`0`)与 leaf | | `addr` | HTTP fan-out 目标 | -由 torchrun 心跳 / `PUT /apis/nodes` 自动填充。若集群视图 **缺少** 上述字段,自动 **降级为扁平 fan-out**(与 `hierarchical=false` 等价)。 +由 torchrun 心跳 / `PUT /apis/nodes` 自动填充。若集群视图 **缺少** 上述字段且分层模式开启(默认),**`POST /apis/cluster/query` 返回 HTTP 503** — 不会静默降级为扁平 fan-out。仅在明确接受扁平 fan-out 时使用 `hierarchical=false`。 --- @@ -159,9 +159,10 @@ probing -t rank0:8080 cluster query --flat "SELECT ..." | 变量 | 默认 | 说明 | |------|------|------| | `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | `0` = 全局扁平 fan-out(legacy O(world_size) 路径) | +| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `30` | 单 peer HTTP 超时(分层下为 per-tier);见 [环境变量](../reference/env-vars.zh.md) | +| `PROBING_FANOUT_STRICT` | unset | `1`/`true` 时任一 peer 失败或 batch 丢弃则整查失败(无 partial 503) | 分层模式开启(默认)但 `cluster.nodes` 缺少 `group_rank` / `local_rank`(心跳未收敛)时,**`POST /apis/cluster/query` 返回 HTTP 503**,不再静默回退扁平 fan-out。仅在明确接受扁平 fan-out 时使用 `hierarchical=false`。 -| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `2` | 单 peer HTTP 超时(分层下为 per-tier) | 集群心跳相关变量见 [环境变量 — 集群](../reference/env-vars.zh.md#集群) 与 [torchrun 集群心跳](torchrun-cluster.zh.md)。 diff --git a/docs/src/design/index.md b/docs/src/design/index.md index d0dfaad7..ae5f3bbf 100644 --- a/docs/src/design/index.md +++ b/docs/src/design/index.md @@ -25,6 +25,7 @@ Vocabulary: **[Core model](../guide/concepts.md)**. | Document | Description | |----------|-------------| | [Profiling](profiling.md) | Torch hooks, sampling, table write path | +| [Overhead](overhead.md) | Formulas, shadow-step measurement, offline benchmarks | | [NCCL Profiler](nccl-profiler.md) | Plugin ABI, proxy-op wait decomposition | | [Debugging Engine](debugging.md) | eval / backtrace / REPL implementation | | [Training Phases](/zh/design/training-phase/) | Phase transitions and span model *(中文)* | diff --git a/docs/src/design/index.zh.md b/docs/src/design/index.zh.md index 0792259c..3f18eaff 100644 --- a/docs/src/design/index.zh.md +++ b/docs/src/design/index.zh.md @@ -24,6 +24,7 @@ | 文档 | 说明 | |------|------| | [性能分析](profiling.zh.md) | Torch hook、采样、落表路径 | +| [开销测量](overhead.zh.md) | 公式定义、shadow step、离线基准 | | [NCCL Profiler](nccl-profiler.zh.md) | 插件 ABI、proxy 等待分解 | | [调试引擎](debugging.zh.md) | eval / backtrace / REPL 实现 | | [训练阶段](training-phase.zh.md) | 阶段转换与 span 模型 | diff --git a/docs/src/design/modularity.md b/docs/src/design/modularity.md index 081b9ad5..5578e7ae 100644 --- a/docs/src/design/modularity.md +++ b/docs/src/design/modularity.md @@ -233,6 +233,8 @@ Every `global.*` row adds: | `_host` | Peer hostname | | `_addr` | Peer `host:port` | | `_rank` | `torch.distributed` rank from node registry | +| `_node_rank` | Node / worker group rank (`GROUP_RANK`) | +| `_local_rank` | GPU index on node (`LOCAL_RANK`) | | `_role` | Parallel role key from node registry | Collectors must not invent alternate peer tags. @@ -382,7 +384,7 @@ Track and fix incrementally: |-------|---------|--------| | Python ext → CLI | `probing-python` → `probing-cli` | **Accepted** for maturin wheel (`cli_main` only); keep import surface minimal | | Python ext → CC | ~~`probing-python` → `probing-cc`~~ | **Done** — `send_sigusr2_to_thread_id` moved to `probing-core::signal` | -| Core → NCCL/HCCL | `probing-core` → `probing-nccl-profiler` / `probing-hccl-shim` (`builtin-schema-docs` feature) for `semantic_catalog` | Register docs via collector hooks or manifest; drop L1→L2 compile deps | +| Core → NCCL/HCCL | ~~`probing-core` → `probing-nccl-profiler` / `probing-hccl-shim` (`builtin-schema-docs` feature) for `semantic_catalog`~~ | **Done** — `register_docs()` called from `server/engine.rs` composition root; `probing-core` default features empty | | Core → skills YAML | ~~`semantic_catalog.rs` `include_str!(skills/semantic/tables.yaml)`~~ | **Done** — overlay at `probing/core/resources/tables.yaml`; descriptions SSOT in `docs` registry | | Server → python `features/*` | ~~`server/profiling.rs`~~ removed | Flamegraphs via `torchextension` / `pprofextension` `ProbeExtensionCall` | | Server → python REPL internals | ~~`PythonRepl` in server~~ | `/ws` uses `ReplSession` facade only | diff --git a/docs/src/design/modularity.zh.md b/docs/src/design/modularity.zh.md index c41cb193..176b0689 100644 --- a/docs/src/design/modularity.zh.md +++ b/docs/src/design/modularity.zh.md @@ -196,6 +196,8 @@ HTTP 契约:`probing/server/API.md` + `tests/regression/spec/api_spec.json`。 | `_host` | 对端主机 | | `_addr` | 对端地址 | | `_rank` | torch rank | +| `_node_rank` | 节点 / worker 组 rank(`GROUP_RANK`) | +| `_local_rank` | 节点内 GPU 序号(`LOCAL_RANK`) | | `_role` | 并行 role key | --- @@ -325,7 +327,7 @@ sequenceDiagram |------|------|------| | python → cli | `probing-python` → `probing-cli` | **可接受**(maturin wheel,仅 `cli_main`);禁止扩散 import | | python → cc | ~~`probing-python` → `probing-cc`~~ | **已完成** — `send_sigusr2_to_thread_id` 迁至 `probing-core::signal` | -| core → NCCL/HCCL | `probing-core` → nccl/hccl shim(`builtin-schema-docs`)供 `semantic_catalog` | 改由采集器注册 docs,去掉 L1→L2 编译依赖 | +| core → NCCL/HCCL | ~~`probing-core` → nccl/hccl shim(`builtin-schema-docs`)供 `semantic_catalog`~~ | **已完成** — `register_docs()` 在 `server/engine.rs` 组装根调用;`probing-core` 默认 feature 为空 | | core → skills YAML | ~~`semantic_catalog` `include_str!(skills/semantic/tables.yaml)`~~ | **已完成** — overlay 在 `probing/core/resources/tables.yaml`;描述 SSOT 为 `docs` 注册表 | | server → python features | ~~`server/profiling.rs`~~ 已删 | 火焰图走 Extension | | server → REPL 内部 | ~~`PythonRepl`~~ | `/ws` 仅用 `ReplSession` 门面 | diff --git a/docs/src/design/overhead-invariants.md b/docs/src/design/overhead-invariants.md new file mode 100644 index 00000000..5225aeef --- /dev/null +++ b/docs/src/design/overhead-invariants.md @@ -0,0 +1,32 @@ +# TorchProbe overhead invariants (agents / maintainers) + +**Do not change semantics below without updating tests.** Read this before editing `web/src/overhead/`, `python/probing/profiling/torch_probe.py`, `python/probing/profiling/deferred_drain.py`, or `skills/health_overview/steps.yaml` overhead SQL. + +Background: [overhead.md](overhead.md). 中文: [中文版](/zh/design/overhead-invariants/). + +## Invariants (summary) + +| ID | Rule | +|----|------| +| **I1** | Primary % use **median** ratios, not `mean(probed)/mean(shadow)` | +| **I2** | Amortized = `(1−rate)×dispatch + rate×sampled`, not mean amortization | +| **I3** | `_record_step_timing` before `_drain_deferred` in `_close_step_wall` | +| **I4** | Deferred drain async by default (`PROBING_TORCH_DEFER_ASYNC=1`) | +| **I5** | Stable gate: `shadow_n≥5`, `dispatch_n≥16`, `shadow_baseline>0` | +| **I6** | UI soft formatting: `≈0%`, `~2%` for <5%; Typical vs Effective labels | + +## Test map + +```bash +cd web && cargo test overhead +PROBING=0 pytest tests/regression/profiling/ -q +``` + +| Tests | Guards | +|-------|--------| +| `web/src/overhead/metrics.rs` | I1, I2, I5, I6 | +| `tests/regression/profiling/test_overhead_invariants.py` | I3, I4 | +| `test_torch_probe_sampling.py` | I3, defer settle | +| `test_deferred_drain_worker.py` | I4 | + +See the Chinese doc for formulas, checklist, and the user regression fixture. diff --git a/docs/src/design/overhead-invariants.zh.md b/docs/src/design/overhead-invariants.zh.md new file mode 100644 index 00000000..8dd09bc7 --- /dev/null +++ b/docs/src/design/overhead-invariants.zh.md @@ -0,0 +1,141 @@ +# TorchProbe Overhead 不变量(Agent / 维护者必读) + +本文档列出 **不可随意改动的语义与公式**。修改 `web/src/overhead/`、`python/probing/profiling/torch_probe.py`、`python/probing/profiling/deferred_drain.py` 或 `skills/health_overview/steps.yaml` 中与 overhead 相关的逻辑前,请先读本文并更新对应测试。 + +完整背景见 [overhead.zh.md](overhead.zh.md)。 + +--- + +## 1. 核心不变量 + +### I1 — 主告警与 UI 主数字用 median,不用 mean 比值 + +| 指标 | 公式 | 禁止替代 | +|------|------|----------| +| `dispatch_overhead_pct` | `median(dispatch) ÷ median(shadow) − 1` | `mean(dispatch) ÷ mean(shadow)` | +| `blended_overhead_pct` | `median(all probed) ÷ median(shadow) − 1` | 混合 mean | +| `sampled_overhead_pct` | `median(sampled) ÷ median(shadow) − 1` | — | + +**原因**:训练步墙钟抖动大、`shadow_n` 少时,mean 比值会与 median 差一个数量级(例如 median ≈2% 而 mean 比值 ≈20%+),会误导用户。 + +**守护测试**:`web/src/overhead/metrics.rs` → `amortized_not_mean_ratio_when_means_diverge` + +--- + +### I2 — Amortized(Effective overhead)= 采样率加权,不是 mean 摊销 + +``` +amortized = (1 − rate) × dispatch_overhead + rate × sampled_overhead +``` + +- `rate`:配置 `sample_rate`,否则 `sampled_n / probed_n` +- 无采样步时:`amortized == dispatch_overhead` + +**禁止**:`mean(probed) ÷ mean(shadow) − 1` 作为 Web UI 的 Amortized / Effective overhead。 + +**守护测试**:`amortized_blends_dispatch_and_sampled_by_rate`、`amortized_not_mean_ratio_when_means_diverge` + +--- + +### I3 — `step_duration_sec` 记时边界 + +在 `TorchProbe.post_step_hook` / `_close_step_wall` 中,顺序必须为: + +``` +_record_step_timing() # 墙钟终点 +_drain_deferred() # deferred 回收(可在后台线程执行 save) +_advance_step_cycle_for_next() +_mark_step_wall_start() # 下一步起点 +``` + +**禁止**:在 `_record_step_timing()` **之前**调用 `_drain_deferred()`(会把前几步 event 回收算进本步墙钟)。 + +**守护测试**:`tests/regression/profiling/test_torch_probe_sampling.py::test_post_step_hook_drains_deferred_after_step_timing`、`test_overhead_invariants.py::test_close_step_wall_source_order` + +--- + +### I4 — Deferred 回收默认异步 + +- 默认 `PROBING_TORCH_DEFER_ASYNC=1`:ready 的 `DelayedRecord` 入队,后台线程 `elapsed_time` + `save()` +- 队列满 → 主线程同步 `save()` 回退(不丢数据) +- 进程退出 `atexit` flush + +**禁止**:在无测试、无文档的情况下改回「仅在训练线程同步 drain」作为唯一路径。 + +**守护测试**:`tests/regression/profiling/test_deferred_drain_worker.py` + +--- + +### I5 — 稳定性门控 + +百分比在 UI 上视为「稳定」需同时满足: + +- `shadow_baseline > 0` +- `shadow_n ≥ 5`(`MIN_SHADOW_SAMPLES`) +- `dispatch_n ≥ 16`(`MIN_DISPATCH_SAMPLES`) + +`dispatch_overhead_pct` / `blended_overhead_pct` 在不稳定时不应展示为精确告警数字(可为 `—` 或 muted)。 + +**守护测试**:`snapshot_computes_dispatch_overhead`、`skills/health_overview` SQL 中的 `dispatch_n` / `shadow_n` + +--- + +### I6 — 展示语义(L4 Web) + +| 规则 | 说明 | +|------|------| +| 低开销显示 | `|pct| < 0.5%` → `≈0%`;`< 5%` → `~N%`(避免 `+1.9%` 告警感) | +| 主指标命名 | UI 主卡:「Typical overhead」= dispatch;「Effective overhead」= amortized | +| 训练日志对齐 | `torch_step_timing` 为 hook-to-hook 墙钟,含 DataLoader 等待;不等于仅 compute 的 `time=49ms` 打印 | + +**守护测试**:`format_pct_signed_*`、`sidebar_copy_when_stable` + +--- + +## 2. 测试地图 + +| 文件 | 守护的不变量 | +|------|----------------| +| `web/src/overhead/metrics.rs` (`#[cfg(test)]`) | I1, I2, I5, I6 | +| `tests/regression/profiling/test_overhead_invariants.py` | I3, I4(源码顺序 / 默认 env) | +| `tests/regression/profiling/test_torch_probe_sampling.py` | I3, deferred settle 窗口 | +| `tests/regression/profiling/test_deferred_drain_worker.py` | I4 | +| `skills/health_overview/steps.yaml` | I1 告警列 `dispatch_overhead_pct` | + +本地命令: + +```bash +# Rust Web 指标 +cd web && cargo test overhead + +# Python hook / drain +PROBING=0 pytest tests/regression/profiling/ -q +``` + +--- + +## 3. Agent 修改前检查清单 + +1. 是否改动 overhead **公式**?→ 更新本文 §1 + `metrics.rs` 测试 + `overhead.zh.md` +2. 是否改动 **hook 顺序**?→ 更新 `test_post_step_hook_drains_deferred_after_step_timing` 与 `test_close_step_wall_source_order` +3. 是否改动 **异步 drain** 默认?→ 更新 `deferred_drain.py` 测试与 §I4 +4. 是否只改 UI 文案?→ 保持 I6;跑 `cargo test -p web overhead` +5. **不要** 用 mean 比值「修复」amortized 与 median 不一致 — 那是预期行为 + +--- + +## 4. 参考场景(回归夹具) + +用户实测(median 一致、mean 失真): + +| 观测 | 值 | +|------|-----| +| shadow median | 180 ms | +| dispatch median | 166 ms | +| dispatch overhead | ≈ +1.9% | +| shadow mean | 130 ms | +| probed mean | 533 ms | +| mean 比值(禁止作 amortized) | ≫ 20% | +| 期望 amortized(rate≈5%) | ≈ +1.5% ~ +2% | + +此场景编码在 `amortized_not_mean_ratio_when_means_diverge` 测试中。 diff --git a/docs/src/design/overhead.md b/docs/src/design/overhead.md new file mode 100644 index 00000000..a6eaaf37 --- /dev/null +++ b/docs/src/design/overhead.md @@ -0,0 +1,334 @@ +# Overhead measurement and formulas + +Canonical design doc for **instrumentation overhead** in Probing: terminology, formulas, measurement boundaries, and offline vs in-run methods. Implementation details: [Profiling](profiling.md); table columns: [SQL tables — torch_step_timing](../reference/sql-tables.md#python-torch_step_timing). + +**Invariants and regression tests** (read before changing formulas or hook order): [overhead-invariants.md](overhead-invariants.md). + +## 1. Goals and scope + +### Questions answered + +| Question | Typical consumer | +|----------|------------------| +| How much slower is each training step with TorchProbe hooks? | Production jobs, `health_overview`, Web Overhead panel | +| What does span / memtable persistence cost? | `make bench` tracing layer, regression tests | +| End-to-end delta on a real TinyNet loop? | `make bench` torch_train layer | +| NCCL profiler impact on collective latency? | `run_nccl_profiler_bench.sh` (offline) | + +### Out of scope + +- **Business throughput SLOs** (tokens/s, time-to-convergence) — requires your own baseline job +- **NCCL collective execution time** as “probe tax” — that is training work, not instrumentation +- **“Pure PyTorch” on shadow steps** — other collectors (NCCL, CPU/GPU) still run on shadow steps + +### vs `probing bench` CLI + +| Entry | Measures | +|-------|----------| +| `make bench` → `examples/bench_instrumentation.py` | Python/Rust **instrumentation** wall time | +| `probing bench write` (hidden CLI) | memtable **write-path** throughput/latency — not training hook tax | + +These are not interchangeable. + +--- + +## 2. Terminology + +| Term | Definition | +|------|------------| +| **probed step** | `python.torch_step_timing.is_shadow = 0`; TorchProbe module hooks run per config | +| **shadow step** | `is_shadow = 1`; module/optimizer hooks **return immediately**; no `python.torch_trace`, but a timing row is written | +| **shadow cadence** | Default `4:1` — 4 probed steps then 1 shadow step (`shadow=4:1`) | +| **sampled step** | probed with `sampled = 1` — module trace flush (may include GPU defer/sync) | +| **hook tax** | Median overhead %: all probed steps vs shadow | +| **sampled overhead** | Median overhead %: sampled probed steps only vs shadow | +| **total overhead (amortized)** | Weighted: `(1−rate)×dispatch_overhead + rate×sampled_overhead` (Web UI) | +| **in-run** | Continuous comparison via `python.torch_step_timing` during training | +| **offline** | Standalone benchmark scripts with A/B or paired comparison | + +--- + +## 3. Common formulas + +### 3.1 Relative overhead (ratio) + +Used for TorchProbe in-run and many offline cases: + +$$ +\text{overhead\_pct} = \left(\frac{M_{\text{probed}}}{M_{\text{shadow}}} - 1\right) \times 100 +$$ + +$M$ is an aggregate (see §5). SQL uses `nullif(..., 0)` when the denominator is zero. + +### 3.2 Relative baseline (offline A/B) + +$$ +\text{vs\_baseline\_pct} = \left(\frac{T_{\text{measured}}}{T_{\text{baseline}}} - 1\right) \times 100 +$$ + +### 3.3 Paired training delta + +$$ +\Delta T = T_{\text{instrumented}} - T_{\text{baseline}}, \quad T_{\text{inst\_med}} = \text{median}(T_{\text{baseline}}) + \text{median}(\Delta T) +$$ + +### 3.4 NCCL latency delta + +$$ +\text{pct\_delta}(ref, x) = 100 \times \frac{x - ref}{ref} +$$ + +Positive means the profiled mode is slower. + +--- + +## 4. In-run measurement: TorchProbe shadow step + +### 4.1 Mechanism + +With `PROBING_TORCH_PROFILING=on` (default includes `shadow=4:1`), each optimizer step writes one row to `python.torch_step_timing`. + +**Shadow detection** (`shadow_step_in_cycle`): + +```text +cycle_len = shadow_normal + shadow_baseline # default 4 + 1 = 5 +is_shadow = (cycle_index % cycle_len) >= shadow_normal +``` + +Indices 0–3 are probed; index 4 is shadow (default cadence). + +### 4.2 Timing window (`step_duration_sec`) + +Uses `time.perf_counter()` wall clock — **not** GPU kernel time. + +**Boundaries**: + +- **Start**: `_mark_step_wall_start()` at the end of the previous step’s `post_step_hook` +- **End**: `_record_step_timing()` inside the current step’s `post_step_hook` (**before** `_drain_deferred()`) + +So `step_duration_sec` covers **full step compute (forward/backward/opt) plus in-step hook teardown** (including same-step trace flush on sampled steps). It **excludes** deferred GPU `elapsed_time` drain from earlier sampled steps (drain runs after timing, before the next `_mark_step_wall_start()`). + +**vs `train.step` span**: from `python.trace_event`, measures the wrapped compute interval only — **excludes** hook dispatch and persistence. The Web UI shows both; do not compare numbers directly. + +### 4.3 Hook behavior by step type + +| Type | Module hooks | Writes torch_trace | Timing row | +|------|--------------|-------------------|------------| +| discovery (first step) | register modules | no | special path | +| probed, not sampled | short-circuit | no | `is_shadow=0, sampled=0` | +| probed, sampled | full path | yes | `is_shadow=0, sampled=1` | +| shadow | immediate return | no | `is_shadow=1` | + +`hook_tax` blends sampled and non-sampled probed steps. **`dispatch_overhead`** (`sampled=0` only) is the stable primary metric. `sampled_overhead` is the heavy path. + +--- + +## 5. Metric catalog + +### 5.1 In-run metrics + +| Metric | Numerator | Denominator | Aggregate | Window | Consumer | +|--------|-----------|-------------|-----------|--------|----------| +| **dispatch_overhead_pct** | probed & `sampled=0` | shadow | **median** | rolling **80** steps | **primary alert** | +| **hook_tax_pct** | all probed | shadow | **median** | rolling **80** steps | blended / soak | +| **sampled_overhead_pct** | probed & `sampled=1` | shadow | **median** | rolling **80** steps | Web | +| **Dispatch (Web)** | `sampled=0` probed | shadow | **median** | last **80** steps | Web sidebar / panel | +| **Total overhead (Web)** | dispatch + sampled weighted by sample rate | — | **weighted %** | last 80 steps | amortized display | + +**Reference SQL** (rolling window + stratified metrics): + +```sql +WITH bounds AS ( + SELECT GREATEST(COALESCE(MAX(local_step), 0) - 80, 1) AS win_start + FROM python.torch_step_timing +) +SELECT + round((median(CASE WHEN is_shadow = 0 AND sampled = 0 THEN step_duration_sec END) + / nullif(median(CASE WHEN is_shadow = 1 THEN step_duration_sec END), 0) - 1) * 100, 2) + AS dispatch_overhead_pct, + round((median(CASE WHEN is_shadow = 0 THEN step_duration_sec END) + / nullif(median(CASE WHEN is_shadow = 1 THEN step_duration_sec END), 0) - 1) * 100, 2) + AS hook_tax_pct, + sum(CASE WHEN is_shadow = 0 AND sampled = 0 THEN 1 ELSE 0 END) AS dispatch_n, + sum(CASE WHEN is_shadow = 1 THEN 1 ELSE 0 END) AS shadow_n +FROM python.torch_step_timing, bounds +WHERE local_step >= bounds.win_start AND local_step > 1; +``` + +**Display** (Web): $|\text{pct}| < 0.5$ → `≈0%`; treat as stable when `shadow_n ≥ 5` and `dispatch_n ≥ 16` (§5.2, §11). + +### 5.2 Sample size + +| Condition | Behavior | +|-----------|----------| +| `shadow_baseline = 0` (`shadow=off`) | overhead % undefined | +| `shadow_n < 5` | low-sample hint; % is indicative only | +| `dispatch_n < 16` | high variance on dispatch overhead | +| `probed_n = 0` or `shadow_n = 0` | soak skips ratio assertion | + +### 5.3 Auxiliary metrics + +| Metric | Source | Purpose | +|--------|--------|---------| +| `train_step_median_ms` | `median(span_end - span_start)` for `train.step` | compute-only reference | +| `nccl.profiler_counters` | latest row | data health, not overhead % | + +--- + +## 6. Offline benchmark: `make bench` + +Script: `examples/bench_instrumentation.py`. Run inside a **probing-injected** process: + +```bash +PROBING=1 make bench +PROBING=1 make bench-quick +``` + +### 6.1 Parameters + +| Parameter | full | `--quick` | +|-----------|------|-----------| +| span_iters | 300 | 80 | +| probe_steps | 40 | 12 | +| train batches | 30 | 8 | +| warmup (outer rounds) | 2 | 1 | +| runs (outer rounds) | 5 | 3 | + +### 6.2 Three layers + +**A — tracing**: median total wall time per scenario; `vs_baseline_pct` vs `span (no backend)`. + +**B — torch_probe (synthetic)**: fake single module; median per-step timing; `hook_tax_pct` on `shadow=4:1` uses §3.1. Not representative of large production models. + +**C — torch_train (TinyNet)**: paired back-to-back baseline vs instrumented; reports `paired_delta_ms` and `inst_med`. + +### 6.3 JSON export + +```bash +PROBING=1 python examples/bench_instrumentation.py --json-out /tmp/bench.json +``` + +--- + +## 7. NCCL profiler overhead (offline only) + +No in-run shadow. Runtime health: `nccl.profiler_counters`. + +E2E: `examples/nccl_profiler_overhead.py`, `examples/run_nccl_profiler_bench.sh`. Baseline vs plugin + `PROBING=2`. Compare with §3.4 on latency and throughput. + +Micro: `probing/extensions/nccl-profiler/benches/callback_path.rs` (Criterion) — component-level only. + +--- + +## 8. Other subsystems + +| Subsystem | Method | Threshold | +|-----------|--------|-----------| +| Span + memtable | `tests/regression/profiling/test_span_overhead.py` | `T_on < T_off × 8 + 0.05s` | +| TorchProbe module spans | same | `med_on < med_off × 6 + 0.02s` | +| memtable writes | `probing bench write` | throughput / latency | +| pprof | `probing.pprof.sample_freq` | qualitative | + +Isolate stack cost: `PROBING_SPAN_BACKENDS=none`. + +--- + +## 9. Gates (current repo) + +| Gate | Condition | Location | +|------|-----------|----------| +| diagnostic warning | `dispatch_overhead_pct > 5%` | `health_overview` | +| soak failure | `hook_tax_pct > 75%` default | `soak_assert.py` | +| CI regression | span ratio bounds | `test_span_overhead.py` | + +5%, 75%, and 8× serve different purposes — not a single SLO. + +--- + +## 10. Known biases + +1. Shadow is not vacuum — other collectors still run. +2. Sampled steps may include GPU defer/sync in wall time. +3. Web uses 80-step window; skills use full history. +4. Synthetic bench ≠ production. +5. Filter `local_step > 1` to skip discovery. + +--- + +## 11. Anti-noise and stability + +### 11.1 Noise sources + +| Source | Mitigation | +|--------|------------| +| Sampled steps mixed into hook tax | Use **`dispatch_overhead`** (`sampled=0`) as primary | +| Step-time jitter (data, collectives) | **median** + 80-step rolling window | +| Few shadow points | Require `shadow_n ≥ 5`; prefer long runs | +| Cold start / discovery | `local_step > 1`; offline warmup | +| Blended aggregation | Report dispatch / sampled / blended separately | +| Deferred drain blocks hook | After timing: async worker (`PROBING_TORCH_DEFER_ASYNC=1`, default) + bounded queue; sync fallback when full | + +### 11.2.1 Async deferred drain + +Ready `DelayedRecord` items are enqueued after `_record_step_timing`; a daemon thread runs `elapsed_time` + `save()`. Set `PROBING_TORCH_DEFER_ASYNC=0` for synchronous drain (tests). Queue size: `PROBING_TORCH_DEFER_QUEUE_SIZE` (default 4096). `atexit` flushes the queue; tests may call `flush_deferred_drain()`. + +### 11.2 Principles + +1. **Stratify** light (dispatch) vs heavy (sampled) paths. +2. **Robust aggregates**: median for alerts; amortized uses sample-rate-weighted blend, not `mean(probed)/mean(shadow)`. +3. **Aligned window**: Web and `health_overview` use **80 steps**. +4. **Paired offline bench** for torch_train layer. +5. **Explicit gates**: no alert until `shadow_n ≥ 5` and `dispatch_n ≥ 16`. + +### 11.3 Metric pick list + +| Goal | Metric | +|------|--------| +| Daily alert / sidebar | `dispatch_overhead_pct` | +| Sampling cost | `sampled_overhead_pct` | +| Legacy / soak | `hook_tax_pct` (blended, conservative) | + +### 11.4 Tuning + +```bash +PROBING_TORCH_PROFILING=on,shadow=8:2,rate=0.05 # more shadow points per window +``` + +### 11.5 Future work + +Trimmed mean, per-cadence aggregation, EWMA sidebar, confidence bands, NCCL in-run shadow. + +--- + +## 12. Operations + +```bash +PROBING=1 PROBING_TORCH_PROFILING=on python train.py +PROBING=1 python examples/torch_probe_overhead_smoke.py +PROBING=1 make bench-quick +``` + +Reduce overhead: lower `rate` / `layer_rate`; disable `trace_spans`, `sync=on`, `backward=on`; use `shadow=off` only when in-run estimates are not needed. + +--- + +## 13. Implementation index + +| Component | Path | +|-----------|------| +| Shadow + timing | `python/probing/profiling/torch_probe.py` | +| Offline bench | `examples/bench_instrumentation.py` | +| Web SQL | `web/src/overhead/sql.rs` | +| Web formatting | `web/src/overhead/metrics.rs` | +| Skill SQL | `skills/health_overview/steps.yaml` | +| soak | `examples/soak_assert.py` | +| NCCL E2E | `examples/nccl_profiler_overhead.py` | + +--- + +## Related docs + +- [Profiling](profiling.md) +- [Tracing spans](tracing-spans.md) +- [NCCL Profiler](nccl-profiler.md) +- [Troubleshooting — High Overhead](../guide/troubleshooting.md) diff --git a/docs/src/design/overhead.zh.md b/docs/src/design/overhead.zh.md new file mode 100644 index 00000000..b6842834 --- /dev/null +++ b/docs/src/design/overhead.zh.md @@ -0,0 +1,443 @@ +# Overhead 测量与公式定义 + +本文是 Probing **instrumentation overhead** 的顶层设计文档:统一术语、公式、测量边界与离线/在线基准方法。实现细节见 [性能分析](profiling.zh.md);表字段见 [SQL 表 — torch_step_timing](../reference/sql-tables.zh.md#python-torch_step_timing)。 + +**不可变语义与回归测试**(修改公式 / hook 顺序前必读):[overhead-invariants.zh.md](overhead-invariants.zh.md)。 + +## 1. 目标与范围 + +### 要回答的问题 + +| 问题 | 典型场景 | +|------|----------| +| TorchProbe 模块 hook 让每步慢多少? | 生产训练、`health_overview`、Web Overhead 面板 | +| Span / memtable 持久化成本? | `make bench` tracing 层、回归测试 | +| 真实 TinyNet 训练上的端到端增量? | `make bench` torch_train 层 | +| NCCL profiler 对 collective 延迟的影响? | `run_nccl_profiler_bench.sh`(离线) | + +### 明确不衡量 + +- **业务吞吐 SLO**(tokens/s、收敛速度)——需用户自有 baseline job 对比 +- **NCCL collective 本身的执行时间**(那是训练逻辑,不是探针税) +- **shadow step 上的「纯 PyTorch」**——shadow 仍运行 NCCL/CPU/GPU 等其他采集器 + +### 与 `probing bench` CLI 的区别 + +| 入口 | 测量对象 | +|------|----------| +| `make bench` → `examples/bench_instrumentation.py` | Python/Rust **instrumentation** 墙钟开销 | +| `probing bench write`(隐藏 CLI) | memtable **写路径吞吐/延迟**,不是训练 hook 税 | + +二者不可互换。 + +--- + +## 2. 术语表 + +| 术语 | 定义 | +|------|------| +| **probed step** | `python.torch_step_timing.is_shadow = 0` 的正常训练步;TorchProbe 模块 hook 按配置执行(shadow 步除外) | +| **shadow step** | `is_shadow = 1` 的基线步;模块/optimizer hook **立即返回**,不写 `python.torch_trace`,但仍写 timing 行 | +| **shadow cadence** | 默认 `4:1`:每 5 个 optimizer step 中 4 个 probed、1 个 shadow(`shadow=4:1`) | +| **sampled step** | probed 且 `sampled = 1`:该步会 flush module 级 trace(可能含 GPU defer/sync) | +| **hook tax(混合)** | 中位数口径:全部 probed step(含采样+非采样)相对 shadow | 噪声较大,保留兼容 | +| **dispatch overhead** | 中位数口径:仅 `sampled=0` 的 probed step 相对 shadow | **推荐主指标**,抗采样步干扰 | +| **sampled overhead** | 中位数口径:仅 sampled probed step 相对 shadow | 重路径(含 flush/sync) | +| **total overhead(摊销)** | 加权口径:`(1−rate)×dispatch_overhead + rate×sampled_overhead`(Web UI) | +| **in-run** | 训练进程内,靠 `python.torch_step_timing` 持续对比 | +| **offline** | 独立基准脚本,A/B 或 paired 对比 | + +--- + +## 3. 通用公式 + +### 3.1 相对 overhead(比值法) + +适用于 TorchProbe in-run 与多数离线场景: + +$$ +\text{overhead\_pct} = \left(\frac{M_{\text{probed}}}{M_{\text{shadow}}} - 1\right) \times 100 +$$ + +其中 $M$ 为聚合函数(见下表)。当 $M_{\text{shadow}} = 0$ 时结果无定义,SQL 用 `nullif(..., 0)` 处理。 + +### 3.2 相对 baseline(离线 A/B) + +$$ +\text{vs\_baseline\_pct} = \left(\frac{T_{\text{measured}}}{T_{\text{beline}}} - 1\right) \times 100 +$$ + +### 3.3 绝对增量(paired 训练基准) + +$$ +\Delta T = T_{\text{instrumented}} - T_{\text{baseline}}, \quad T_{\text{inst\_med}} = \text{median}(T_{\text{baseline}}) + \text{median}(\Delta T) +$$ + +### 3.4 NCCL 延迟增量 + +$$ +\text{pct\_delta}(ref, x) = 100 \times \frac{x - ref}{ref} +$$ + +正值表示 profiled 模式更慢(延迟更高或吞吐更低)。 + +--- + +## 4. 运行时测量:TorchProbe Shadow Step + +### 4.1 机制 + +启用 `PROBING_TORCH_PROFILING=on`(默认含 `shadow=4:1`)后,每个 optimizer step 在 `python.torch_step_timing` 写一行。 + +**Shadow 判定**(`shadow_step_in_cycle`): + +```text +cycle_len = shadow_normal + shadow_baseline # 默认 4 + 1 = 5 +is_shadow = (cycle_index % cycle_len) >= shadow_normal +``` + +默认下 index 0–3 为 probed,index 4 为 shadow。 + +### 4.2 计时窗口(`step_duration_sec`) + +使用 `time.perf_counter()` 墙钟,**非** GPU kernel 时间。 + +```mermaid +sequenceDiagram + participant Train as forward/backward/opt + participant Hook as post_step_hook + participant T as torch_step_timing + + Note over Hook: 上一步结束时 _mark_step_wall_start() + Train->>Hook: optimizer.step() 返回 + Hook->>Hook: drain / flush / save(记时之后、下一步起点之前) + Hook->>T: _record_step_timing() + Hook->>Hook: _mark_step_wall_start()(下一步起点) +``` + +**边界定义**: + +- **起点**:上一 optimizer step 的 `post_step_hook` 末尾调用 `_mark_step_wall_start()` +- **终点**:当前 step 的 `post_step_hook` 内 `_record_step_timing()` 调用时刻(**早于** `_drain_deferred()`) + +因此 `step_duration_sec` 覆盖:**整步训练计算 + 本步 hook 收尾**(含 sampled 步当步的 trace flush),**不含**前几步 deferred GPU event 的 `elapsed_time` 回收(回收在记时之后、下一步起点之前执行)。 + +**与 `train.step` span 的区别**:后者来自 `python.trace_event`,度量 span 包裹的计算区间,**不含** hook 派发与落盘;Web UI 同时展示两者,不可直接对比数值。 + +### 4.3 各 step 类型下 hook 行为 + +| 类型 | 模块 hook | 写 torch_trace | timing 行 | +|------|-----------|----------------|-----------| +| discovery(首步) | 注册模块 | 否 | 特殊路径 | +| probed + 非采样 | 短路(无 module 记录) | 否 | `is_shadow=0, sampled=0` | +| probed + 采样 | 全量执行 | 是 | `is_shadow=0, sampled=1` | +| shadow | 立即 return | 否 | `is_shadow=1` | + +**重要**:`hook_tax` 比较的是 **probed 步(含采样与非采样混合)** vs **shadow** 的中位数。`sampled_overhead` 仅取 `sampled=1` 的 probed 子集,反映「重路径」开销。 + +--- + +## 5. 指标目录 + +### 5.1 In-run 指标 + +| 指标 | 分子 $M_{\text{probed}}$ | 分母 $M_{\text{shadow}}$ | 聚合 | 窗口 | 消费方 | +|------|-------------------------|-------------------------|------|------|--------| +| **hook_tax_pct** | 全部 probed `step_duration_sec` | shadow | **median** | 滚动 **80** 步 | `health_overview`(混合,兼容) | +| **dispatch_overhead_pct** | probed 且 `sampled=0` | shadow | **median** | 滚动 **80** 步 | **推荐告警口径** | +| **sampled_overhead_pct** | probed 且 `sampled=1` | shadow | **median** | 滚动 **80** 步 | `health_overview`、Web | +| **Hook tax / Dispatch(Web)** | dispatch(`sampled=0`)优先展示 | shadow | **median** | 最近 **80** 步 | Web 侧栏 / 面板 | +| **Total overhead(Web 摊销)** | dispatch + sampled 按采样率加权 | — | **加权 %** | 最近 80 步 | Web 面板 | +| **Sampled overhead(Web)** | probed 且 `sampled=1` | shadow | **median** | 最近 80 步 | Web 面板 | + +**推荐 SQL(滚动窗口 + 分层指标)**: + +```sql +WITH bounds AS ( + SELECT GREATEST(COALESCE(MAX(local_step), 0) - 80, 1) AS win_start + FROM python.torch_step_timing +) +SELECT + round((median(CASE WHEN is_shadow = 0 AND sampled = 0 THEN step_duration_sec END) + / nullif(median(CASE WHEN is_shadow = 1 THEN step_duration_sec END), 0) - 1) * 100, 2) + AS dispatch_overhead_pct, + round((median(CASE WHEN is_shadow = 0 THEN step_duration_sec END) + / nullif(median(CASE WHEN is_shadow = 1 THEN step_duration_sec END), 0) - 1) * 100, 2) + AS hook_tax_pct, + round((median(CASE WHEN is_shadow = 0 AND sampled = 1 THEN step_duration_sec END) + / nullif(median(CASE WHEN is_shadow = 1 THEN step_duration_sec END), 0) - 1) * 100, 2) + AS sampled_overhead_pct, + sum(CASE WHEN is_shadow = 0 AND sampled = 0 THEN 1 ELSE 0 END) AS dispatch_n, + sum(CASE WHEN is_shadow = 0 THEN 1 ELSE 0 END) AS probed_n, + sum(CASE WHEN is_shadow = 1 THEN 1 ELSE 0 END) AS shadow_n +FROM python.torch_step_timing, bounds +WHERE local_step >= bounds.win_start AND local_step > 1; +``` + +**显示规则**(Web):$|\text{pct}| < 0.5$ 显示为 `≈0%`;需 `shadow_n ≥ 5` 且 `dispatch_n ≥ 16` 才视为稳定估计(见 §5.2、§11)。 + +### 5.2 样本量与可信度 + +| 条件 | 行为 | +|------|------| +| `shadow_baseline = 0`(`shadow=off`) | 无法计算 overhead % | +| `shadow_n < 5` | UI / 技能提示「样本不足」;百分比仅供参考 | +| `dispatch_n < 16`(默认 rate=0.05 时约需 320 步窗口) | `dispatch_overhead` 方差大,优先看趋势勿读单点 | +| `probed_n = 0` 或 `shadow_n = 0` | 跳过比率断言(soak) | +| $\|hook\_tax - dispatch\_overhead\| > 10\text{pp}$ | 提示检查采样率 / GPU defer(混合指标被采样步拉高) | + +### 5.3 辅助指标 + +| 指标 | 公式 / 来源 | 用途 | +|------|-------------|------| +| `train_step_median_ms` | `median(span_end.time - span_start.time)`,`name='train.step'` | 计算区间参考(非 hook 税) | +| `nccl.profiler_counters` | 最新一行计数器 | 数据完整性(非 overhead %) | + +--- + +## 6. 离线基准:`make bench` + +脚本:`examples/bench_instrumentation.py`。须在 **probing 注入进程**内运行: + +```bash +PROBING=1 make bench # 完整 +PROBING=1 make bench-quick # --quick +``` + +### 6.1 参数 + +| 参数 | full(默认) | `--quick` | +|------|-------------|-----------| +| span_iters | 300 | 80 | +| probe_steps | 40 | 12 | +| train batches | 30 | 8 | +| warmup(外层轮次) | 2 | 1 | +| runs(外层轮次) | 5 | 3 | + +### 6.2 三层测量 + +#### 层 A — tracing + +对每个场景: + +1. 内层 warmup `warmup` 次 + 计时 `runs` 次 +2. 取 **median(总墙钟秒)** +3. `vs_baseline_pct` 相对 `span (no backend)`(`PROBING_SPAN_BACKENDS` 空) + +| 场景 | 迭代内容 | +|------|----------| +| empty loop | 空循环基线 | +| span (no backend) | `probing.span`,无持久化 | +| span (memtable) | span + memtable 落盘 | +| span + event | span + event 行 | +| train.step span triple | forward / backward / optimizer 三个 span + `probing.step()` | + +**每迭代微秒**: + +$$ +\text{per\_iter\_us} = \frac{\text{median\_sec}}{\text{iterations}} \times 10^6 +$$ + +#### 层 B — torch_probe(合成) + +- 单假模块 `_FakeMod`,`DelayedRecord.save` 打桩 +- **无** 外层 warmup/runs;一次跑 `probe_steps` 步取 timing **median** +- baseline:`hooks only (trace_spans=off, shadow=off)` +- `shadow=4:1` 场景额外输出 `hook_tax_pct`(与 §3.1 同公式,按 cycle index 分桶) + +> **局限**:无真实 backward/GPU;数值用于 **回归对比** 与配置敏感度,不能等同于生产大模型 overhead。 + +#### 层 C — torch_train(TinyNet) + +- 设备:CUDA 可用则用 GPU,否则 CPU +- 每轮 **背靠背**:先无 hook baseline,再带 phase/TorchProbe +- 每场景内 2 步 warmup + `batches` 步计时 +- 报告 `paired_delta_ms` 与合成 `inst_med = median(base) + median(Δ)` + +### 6.3 JSON 导出 + +```bash +PROBING=1 python examples/bench_instrumentation.py --json-out /tmp/bench.json +``` + +--- + +## 7. NCCL Profiler Overhead(仅离线) + +**无 in-run shadow**。运行时只看 `nccl.profiler_counters` 健康度。 + +### 7.1 E2E AllReduce / AllGather + +脚本:`examples/nccl_profiler_overhead.py`;编排:`examples/run_nccl_profiler_bench.sh`。 + +| 模式 | 环境 | +|------|------| +| baseline | 无 `NCCL_PROFILER_PLUGIN`、无 `PROBING` | +| profiled | 插件 + `PROBING=2` + `PROBING_NCCL_INFLIGHT_THRESHOLD_SECS=0` | + +**流程**: + +1. `warmup_iters = 20` +2. `bench_iters = 200`(默认 msg 1 MiB) +3. 每次 collective 前后 `cuda.synchronize()` +4. 输出 `latency_us_{mean,p50,p99}`、`throughput_gbs` +5. `--compare` 用 §3.4 算 `latency_*_pct`、`throughput_pct` + +### 7.2 微基准(Rust Criterion) + +`probing/extensions/nccl-profiler/benches/callback_path.rs`:callback 路径、slot pool、`now_ns`——**组件级**,不与 E2E 数值直接对照。 + +--- + +## 8. 其他子系统 + +| 子系统 | 测量方法 | 公式 / 阈值 | +|--------|----------|-------------| +| **Span + memtable** | `tests/regression/profiling/test_span_overhead.py` | `T_on < T_off × 8 + 0.05s`(300 iter) | +| **TorchProbe module spans** | 同上 | `med_on < med_off × 6 + 0.02s`(20 steps) | +| **memtable 写路径** | `probing bench write` | 吞吐 / 可选延迟 reservoir | +| **pprof** | `probing.pprof.sample_freq` | 定性:SIGPROF 频率越高开销越大 | +| **PROBING_SPAN_LOCATION** | 无自动化公式 | 定性:`inspect.stack()` 显著增开销 | + +**隔离栈成本**:`PROBING_SPAN_BACKENDS=none` 或 bench 中 `configure_backends([])`。 + +--- + +## 9. 阈值与门禁(当前仓库) + +| 门禁 | 条件 | 位置 | +|------|------|------| +| 诊断 warning | `dispatch_overhead_pct > 5%`(稳定口径) | `health_overview` | +| 诊断 info(混合偏高) | `hook_tax_pct > 5%` 且 `dispatch_overhead_pct ≤ 5%` | 可选:采样步导致 | +| soak 失败 | `hook_tax_pct > 75%`(默认 `--max-hook-tax-pct`) | `examples/soak_assert.py` | +| CI 回归 | span 倍数上界(§8) | `test_span_overhead.py` | + +> **注意**:5%(告警)、75%(soak)、8×(回归)服务于不同目的,**不是**统一 SLO。发布前应结合目标硬件与模型自行标定。 + +--- + +## 10. 已知偏差与解释 + +1. **Shadow 非真空基线**:NCCL lite hook、CPU/GPU 周期性采集、span 等仍在 shadow 步运行;`hook_tax` 仅隔离 **TorchProbe 模块 hook 路径**。 +2. **采样步膨胀**:sampled probed 步的 `step_duration_sec` 可能含 deferred GPU `elapsed_time` drain;用 `sampled_overhead` 看重路径,勿与非采样 probed 混读。 +3. **窗口已对齐**:Web / `health_overview` 默认均为最近 80 步;全历史 SQL 方差更大。 +4. **合成 bench ≠ 生产**:`bench_instrumentation` torch_probe 层无真实模型;torch_train 层仅 TinyNet。 +5. **多 rank**:各 rank 独立写 `local_step`;联邦查询需注意 `rank` 切片。 +6. **discovery 步**:`local_step = 1` 通常应过滤(`WHERE local_step > 1`)。 + +--- + +## 11. 抗噪声与稳定性 + +### 11.1 噪声来源 + +| 来源 | 影响 | 缓解 | +|------|------|------| +| **采样步混入** | `sampled=1` 步含 trace flush、GPU defer/sync,墙钟远高于非采样步 | 用 **`dispatch_overhead`**(`sampled=0`)作 hook 税主指标 | +| **训练步本身抖动** | 数据加载、collective、checkpoint 等导致 step 时长尖峰 | **median** 优于 mean;滚动窗口 | +| **窗口过短** | 全表或 <20 步时 median 方差大 | 默认 **80 步**滚动窗口(Web / health 对齐) | +| **shadow 样本稀少** | 默认 4:1 下 80 步仅 ~16 个 shadow 点 | 要求 `shadow_n ≥ 5`;长跑 job 更可信 | +| **冷启动 / discovery** | 首步注册模块、JIT、缓存预热 | 过滤 `local_step > 1`;离线 bench 用 warmup | +| **混合 probed 聚合** | `hook_tax` 把轻/重路径平均 | 分层报告 dispatch / sampled / blended | +| **OS 调度 / 频率缩放** | 墙钟偶发毛刺 | 离线 bench 多轮 median;in-run 看趋势勿盯单步 | +| **Deferred 回收阻塞 hook** | GPU `elapsed_time` + memtable 写在 `post_step_hook` 内 | 记时后再 drain;默认 **`PROBING_TORCH_DEFER_ASYNC=1`** 后台线程 + 有界队列 | + +### 11.2.1 异步 deferred 回收(中期) + +默认开启(``PROBING_TORCH_DEFER_ASYNC=1``)。主线程在 ``_record_step_timing`` 之后只做非阻塞 ``event.query()`` 分区,将 ready 的 ``DelayedRecord`` 入队;后台 daemon 线程执行 ``elapsed_time`` + ``save()``。队列满时回退到同步 ``save()``。 + +| 环境变量 | 默认 | 含义 | +|----------|------|------| +| ``PROBING_TORCH_DEFER_ASYNC`` | ``1`` | ``0`` 关闭后台线程(测试 / 调试) | +| ``PROBING_TORCH_DEFER_QUEUE_SIZE`` | ``4096`` | 有界队列深度 | + +进程退出时 ``atexit`` 会 ``flush`` 队列。测试可调用 ``flush_deferred_drain()``。 + +### 11.2 稳定性设计原则 + +1. **分层而非混合**:dispatch(轻路径)与 sampled(重路径)分开;`hook_tax` 仅作兼容汇总。 +2. **稳健聚合**:in-run 默认 **median**;摊销 overhead 用 `(1−rate)×dispatch + rate×sampled`,**不用** `mean(probed)/mean(shadow)`(步长抖动 + 小样本 shadow 会严重失真)。 +3. **滚动窗口**:消费方统一 `WINDOW = 80`(约 16 个 shadow 周期 @ 4:1),避免冷启动与远古 outlier 污染。 +4. **成对对比**:离线 torch_train 用 **背靠背 paired Δ**,抵消 run 间漂移。 +5. **周期对齐**:shadow 按固定 cadence 插入,probed/shadow 经历相同 NCCL/GPU 背景采集。 +6. **显式可信度门控**:样本不足时不报警,只提示 Collecting / 仅供参考。 + +### 11.3 指标选用指南 + +| 目的 | 推荐指标 | 原因 | +|------|----------|------| +| 日常告警 / 侧栏 | `dispatch_overhead_pct` | 与 shadow 路径最接近,抗采样噪声 | +| 评估采样配置代价 | `sampled_overhead_pct` | 隔离重路径 | +| 兼容旧面板 / soak | `hook_tax_pct`(混合) | 保守上界,易偏高 | +| 发布前回归 | `make bench` + CI 倍数上界 | 可控环境、可重复 | +| 长期趋势 | 滚动 80 步 + 每 5min 采样一点 | 避免逐步抖动 | + +### 11.4 调参建议(提高稳定性) + +```bash +# 更稳的 shadow 基线(更多 shadow 步,略增 cadence 开销) +PROBING_TORCH_PROFILING=on,shadow=8:2,rate=0.05 + +# 仅看轻路径时 temporarily 提高 rate 可增加 dispatch_n(更重) +# 诊断 SQL 时务必加窗口: +# WHERE local_step >= (SELECT max(local_step) - 80 FROM python.torch_step_timing) +``` + +### 11.5 未来增强(未实现) + +- **Trimmed mean / winsorize**:去掉 probed 时长 top/bottom 5% 后再算比值 +- **按 cadence 周期聚合**:每 5 步一组先算组内 median,再跨组 median +- **EWMA 平滑**:Web 侧栏显示指数滑动平均,降低逐步跳动 +- **置信区间**:bootstrap 或 shadow 周期自助法给出 ± 区间 +- **NCCL in-run shadow**:与 TorchProbe 对称的 collective 基线 + +--- + +## 12. 操作指南 + +### 启用 in-run overhead + +```bash +# 默认:rate=0.05, shadow=4:1 +PROBING=1 PROBING_TORCH_PROFILING=on python train.py + +# 或运行时配置 +# SET probing.torch.profiling = 'on,shadow=4:1,rate=0.05'; +``` + +### 降低开销(优先级) + +1. 降低 `rate` / `layer_rate` +2. 关闭 `trace_spans`、`sync=on`、`backward=on` +3. `shadow=off` 仅当不需要 in-run 估计 +4. 关闭 torch profiling,仅保留基础探针 + +### 快速冒烟 + +```bash +PROBING=1 python examples/torch_probe_overhead_smoke.py # 无 GPU +PROBING=1 make bench-quick +``` + +--- + +## 13. 实现索引 + +| 组件 | 路径 | +|------|------| +| Shadow 逻辑与计时 | `python/probing/profiling/torch_probe.py` | +| 离线基准 | `examples/bench_instrumentation.py` | +| Web SQL | `web/src/overhead/sql.rs` | +| Web 格式化 | `web/src/overhead/metrics.rs` | +| 技能 SQL | `skills/health_overview/steps.yaml` | +| soak 断言 | `examples/soak_assert.py` | +| NCCL E2E | `examples/nccl_profiler_overhead.py` | + +--- + +## 相关文档 + +- [性能分析实现](profiling.zh.md) — TorchProbe 采样、表结构 +- [Tracing Span](tracing-spans.zh.md) — span 分层与 bench 入口 +- [NCCL Profiler](nccl-profiler.zh.md) — 插件 ABI 与计数器 +- [常见问题 — High Overhead](../guide/troubleshooting.zh.md) diff --git a/docs/src/design/profiling.md b/docs/src/design/profiling.md index 0ff86682..d26cf70f 100644 --- a/docs/src/design/profiling.md +++ b/docs/src/design/profiling.md @@ -48,7 +48,7 @@ TorchProbe targets **always-on, module-level training telemetry** after probe in There is **no warmup schedule API**. Skip cold-start steps in SQL when needed: ```sql -SELECT * FROM python.torch_trace WHERE step > 10; +SELECT * FROM python.torch_trace WHERE local_step > 10; ``` ### Hooks @@ -74,7 +74,7 @@ Default when enabled (`PROBING_TORCH_PROFILING=on`): **`rate=0.05`, `layer_rate= **Shadow baseline steps (default `shadow=4:1`):** every 4 probed training steps are followed by 1 step where TorchProbe hooks are fully bypassed (no module-level `python.torch_trace` rows). NCCL, CPU/GPU sampling, and other collectors are unchanged. Each step writes one row to `python.torch_step_timing` (`is_shadow=1` for baseline steps). Disable with `shadow=off`. -Estimate overhead: +Estimate overhead (formulas and methodology: **[Overhead measurement](overhead.md)**): ```sql SELECT @@ -106,7 +106,7 @@ Full column list: [SQL Tables — torch_trace](../reference/sql-tables.md#python | Field | Type | Description | |-------|------|-------------| -| step | int | Local training step (per rank) | +| `local_step` | int | Local training step (per rank) | | global_step | int | Global step (`step_snapshot`) | | rank | int | `torch.distributed` rank | | world_size | int | World size | @@ -166,6 +166,8 @@ CPU sampling via pprof (`probing.pprof.sample_freq`) is separate from TorchProbe Host CPU, memory, GPU utilization, and related metrics are collected on configurable intervals via environment variables such as `PROBING_GPU_SAMPLE_MS`. +**Variable / tensor watch (`probing.inspect.trace`):** logs go to the Python logger by default. Set `PROBING_TRACE_STDOUT=1` to emit updates on **stdout** instead (useful for quick local debugging; avoid in production training logs). + ## Data Storage Torch traces and other probe data are stored in **columnar probe tables** (e.g. `python.torch_trace`), queryable through the engine. Retention and federation follow memtable / server configuration—not a fixed-size in-process ring buffer. @@ -176,7 +178,7 @@ Torch traces and other probe data are stored in **columnar probe tables** (e.g. -- Skip discovery / warm-up steps SELECT module, stage, AVG(duration) AS avg_sec FROM python.torch_trace -WHERE step > 1 AND duration > 0 +WHERE local_step > 1 AND duration > 0 GROUP BY module, stage ORDER BY avg_sec DESC; diff --git a/docs/src/design/profiling.zh.md b/docs/src/design/profiling.zh.md index 050df75e..2753dca5 100644 --- a/docs/src/design/profiling.zh.md +++ b/docs/src/design/profiling.zh.md @@ -48,7 +48,7 @@ TorchProbe 面向**注入后长期开启的 module 级训练遥测**(`PROBING_ **不提供 warmup schedule API**。跳过冷启动步请在 SQL 中过滤: ```sql -SELECT * FROM python.torch_trace WHERE step > 10; +SELECT * FROM python.torch_trace WHERE local_step > 10; ``` ### 钩子 @@ -74,7 +74,7 @@ SELECT * FROM python.torch_trace WHERE step > 10; **Shadow 基线 step(默认 `shadow=4:1`)**:每 4 个正常训练 step 之后插入 1 个完全跳过 TorchProbe hook 的 step(不写 module 级 `python.torch_trace`)。NCCL、CPU/GPU 等其它采集不变。每个 step 写一行 `python.torch_step_timing`(shadow step 的 `is_shadow=1`)。可用 `shadow=off` 关闭。 -估算开销: +估算开销(公式与测量方法见 **[开销测量](overhead.zh.md)**): ```sql SELECT @@ -163,6 +163,8 @@ configure("on,rate=0.5,layer_rate=0.3") 通过 `PROBING_GPU_SAMPLE_MS` 等环境变量配置间隔,采集主机 CPU、内存、GPU 利用率等。 +**变量/张量 watch(`probing.inspect.trace`):** 默认写入 Python logger;设置 `PROBING_TRACE_STDOUT=1` 可改为 **stdout** 输出(本地调试方便,生产训练日志慎用)。 + ## 数据存储 探针数据存入**列式探针表**(如 `python.torch_trace`),由查询引擎访问。保留与联邦策略由 memtable / server 配置决定,而非进程内固定大小环形缓冲区。 @@ -173,7 +175,7 @@ configure("on,rate=0.5,layer_rate=0.3") -- 跳过 discovery / 冷启动 SELECT module, stage, AVG(duration) AS avg_sec FROM python.torch_trace -WHERE step > 1 AND duration > 0 +WHERE local_step > 1 AND duration > 0 GROUP BY module, stage ORDER BY avg_sec DESC; diff --git a/docs/src/guide/debugging.md b/docs/src/guide/debugging.md index 3265d9f4..554b32b7 100644 --- a/docs/src/guide/debugging.md +++ b/docs/src/guide/debugging.md @@ -156,7 +156,7 @@ print(f'IsInf: {torch.isinf(loss).item()}')" -- Find slowest operations SELECT module, stage, avg(duration) as avg_time FROM python.torch_trace -WHERE step > (SELECT max(step) - 5 FROM python.torch_trace) +WHERE local_step > (SELECT max(local_step) - 5 FROM python.torch_trace) GROUP BY module, stage ORDER BY avg_time DESC LIMIT 10; diff --git a/docs/src/guide/debugging.zh.md b/docs/src/guide/debugging.zh.md index 7e259fa4..153f29a6 100644 --- a/docs/src/guide/debugging.zh.md +++ b/docs/src/guide/debugging.zh.md @@ -155,7 +155,7 @@ print(f'是否 Inf: {torch.isinf(loss).item()}')" -- 找到最慢的操作 SELECT module, stage, avg(duration) as avg_time FROM python.torch_trace -WHERE step > (SELECT max(step) - 5 FROM python.torch_trace) +WHERE local_step > (SELECT max(local_step) - 5 FROM python.torch_trace) GROUP BY module, stage ORDER BY avg_time DESC LIMIT 10; diff --git a/docs/src/guide/troubleshooting.md b/docs/src/guide/troubleshooting.md index b96a773c..70bd08bc 100644 --- a/docs/src/guide/troubleshooting.md +++ b/docs/src/guide/troubleshooting.md @@ -71,7 +71,7 @@ Common issues and their solutions when using Probing. 3. **Wait for data collection**: Tables are populated as operations occur. Run training steps first. - The first TorchProbe step is discovery only (no rows); use `WHERE step > 1` if needed. + The first TorchProbe step is discovery only (no rows); use `WHERE local_step > 1` if needed. ### Empty Results @@ -92,7 +92,7 @@ Common issues and their solutions when using Probing. 3. **Check step range**: ```sql - SELECT MIN(step), MAX(step) FROM python.torch_trace; + SELECT MIN(local_step), MAX(local_step) FROM python.torch_trace; ``` ## Eval Issues @@ -168,7 +168,7 @@ Common issues and their solutions when using Probing. 4. **Use SQL step filters** instead of a warmup schedule: ```sql - SELECT * FROM python.torch_trace WHERE step > 10; + SELECT * FROM python.torch_trace WHERE local_step > 10; ``` ### Query Timeout @@ -184,12 +184,12 @@ Common issues and their solutions when using Probing. 2. **Use step filtering**: ```sql - WHERE step > (SELECT MAX(step) - 10 FROM python.torch_trace) + WHERE local_step > (SELECT MAX(local_step) - 10 FROM python.torch_trace) ``` 3. **Aggregate data**: ```sql - SELECT step, AVG(duration) FROM python.torch_trace GROUP BY step; + SELECT local_step, AVG(duration) FROM python.torch_trace GROUP BY local_step; ``` ## Data Issues @@ -208,7 +208,7 @@ Common issues and their solutions when using Probing. ``` 2. **Confirm training has progressed** — rows append when hooks fire; step 1 of TorchProbe - is discovery-only (use `WHERE step > 1` if needed). + is discovery-only (use `WHERE local_step > 1` if needed). 3. **Check TorchProbe is not off**: ```bash diff --git a/docs/src/guide/troubleshooting.zh.md b/docs/src/guide/troubleshooting.zh.md index d93e65a9..c46d0c93 100644 --- a/docs/src/guide/troubleshooting.zh.md +++ b/docs/src/guide/troubleshooting.zh.md @@ -71,7 +71,7 @@ 3. **等待数据写入**: 表在训练进行时填充。先运行若干训练 step。 - TorchProbe 第一个 step 为 discovery(无行);必要时使用 `WHERE step > 1`。 + TorchProbe 第一个 step 为 discovery(无行);必要时使用 `WHERE local_step > 1`。 ### 结果为空 @@ -92,7 +92,7 @@ 3. **检查步骤范围**: ```sql - SELECT MIN(step), MAX(step) FROM python.torch_trace; + SELECT MIN(local_step), MAX(local_step) FROM python.torch_trace; ``` ## Eval 问题 @@ -147,7 +147,7 @@ 4. **用 SQL 过滤 step**,而非 warmup schedule: ```sql - SELECT * FROM python.torch_trace WHERE step > 10; + SELECT * FROM python.torch_trace WHERE local_step > 10; ``` ### 查询超时 @@ -163,12 +163,12 @@ 2. **使用步骤过滤**: ```sql - WHERE step > (SELECT MAX(step) - 10 FROM python.torch_trace) + WHERE local_step > (SELECT MAX(local_step) - 10 FROM python.torch_trace) ``` 3. **聚合数据**: ```sql - SELECT step, AVG(duration) FROM python.torch_trace GROUP BY step; + SELECT local_step, AVG(duration) FROM python.torch_trace GROUP BY local_step; ``` ## 数据问题 @@ -186,7 +186,7 @@ probing $ENDPOINT config probing.torch.profiling ``` -2. **确认训练已推进** — 钩子在事件发生时写入;TorchProbe 第 1 步仅发现模块(可用 `WHERE step > 1`)。 +2. **确认训练已推进** — 钩子在事件发生时写入;TorchProbe 第 1 步仅发现模块(可用 `WHERE local_step > 1`)。 3. **确认未关闭 TorchProbe**: ```bash diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md index e193a8fb..8cd303d9 100644 --- a/docs/src/quickstart.md +++ b/docs/src/quickstart.md @@ -168,6 +168,18 @@ probing -t query " `_rank` is a federation tag added at query time — see [Core Concepts](guide/concepts.md) for how this works. +## Diagnostic skills + +After the server is running, run bundled diagnostic workflows: + +```bash +probing $ENDPOINT skill list +probing $ENDPOINT skill run health_overview +probing $ENDPOINT skill run slow_rank --global # multi-node straggler (from rank0) +``` + +Skills execute SQL steps in-process and apply interpretation rules. See [Skills](guide/skills.md) and `skills/catalog.yaml`. + ## What's next These three commands — `backtrace`, `eval`, `query` — cover the majority of diff --git a/docs/src/quickstart.zh.md b/docs/src/quickstart.zh.md index 9ea0480a..fb54b4c2 100644 --- a/docs/src/quickstart.zh.md +++ b/docs/src/quickstart.zh.md @@ -151,6 +151,18 @@ probing -t query " `_rank` 是查询时附加的联邦标签——工作原理见[核心概念](guide/concepts.zh.md)。 +## 诊断 skill + +服务就绪后,可运行内置诊断流程: + +```bash +probing $ENDPOINT skill list +probing $ENDPOINT skill run health_overview +probing $ENDPOINT skill run slow_rank --global # 多机 straggler(在 rank0 执行) +``` + +Skill 在进程内执行 SQL 步骤并应用 interpretation 规则。详见 [Skills](guide/skills.zh.md) 与 `skills/catalog.yaml`。 + ## 下一步 三个命令——`backtrace`、`eval`、`query`——覆盖了日常诊断的大部分场景。详细文档 diff --git a/docs/src/reference/env-vars.md b/docs/src/reference/env-vars.md index 1f7944f1..a6e310aa 100644 --- a/docs/src/reference/env-vars.md +++ b/docs/src/reference/env-vars.md @@ -40,7 +40,6 @@ Prefix syntax: `init:SCRIPT+` runs `exec(open(SCRIPT).read())` after activ | `PROBING_MAX_FILE_SIZE` | server default | Maximum file upload size in bytes. | | `PROBING_ALLOWED_FILE_DIRS` | server default | Colon-separated list of directories allowed for file reads. | | `PROBING_BASE_PATH` | unset | URL path prefix for reverse proxy deployments (e.g. `/probing`). | -| `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | server default | Timeout for remote fan-out queries (federation). | | `PROBING_ASSETS_ROOT` | built-in default | Path to the web UI static assets directory. | ## Authentication @@ -58,6 +57,7 @@ Prefix syntax: `init:SCRIPT+` runs `exec(open(SCRIPT).read())` after activ | `PROBING_SPAN_BACKENDS` | `memtable` | Comma-separated span backends. Built-in: `memtable` (`python.trace_event`), `logger` (stderr), `otel` (OpenTelemetry), `none` (stack only, no persistence). `configure_backends([])` also disables until `reset_backends()`. Unknown names fall back to `memtable` only. Custom backends: `probing.span_backends` entry point. See [Span API](../design/tracing-spans.md). | | `PROBING_SPAN_LOG_LEVEL` | `INFO` | Log level for the `logger` span backend. | | `PROBING_SPAN_LOCATION` | unset | Enable automatic location capture via `inspect.stack()` for every span. Adds overhead; use sparingly. | +| `PROBING_TRACE_STDOUT` | unset | When `1`/`true`, `probing.inspect.trace` emits variable/tensor updates to **stdout** instead of the Python logger. | ## Step coordinates @@ -185,6 +185,7 @@ Hierarchical side-channel registration when `WORLD_SIZE > 1`. See [torchrun clus | `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | Hierarchical cluster query fan-out (coordinator → local0 → leaves). `0` = flat fan-out to every peer. See [Hierarchical fan-out](../design/hierarchical-fanout.md). | | `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `30` | Per-peer timeout for remote federated / cluster queries (seconds). | | `PROBING_FANOUT_CONCURRENCY` | `128` | Max concurrent in-flight remote fan-out HTTP requests per query. | +| `PROBING_FANOUT_STRICT` | unset | When `1` or `true`, any federated peer failure or dropped batch fails the whole query instead of returning partial results. | | `PROBING_NCCL_CHUNK_BYTES` | `65536` | NCCL profiler mmap ring chunk size (bytes). | | `PROBING_NCCL_NUM_CHUNKS` | `64` | NCCL profiler mmap ring chunk count (~4 MiB total per table at defaults). | | `PROBING_NCCL_MAX_COLL_SLOTS` | `512` | Max in-flight collective/P2P event slots per rank. | @@ -193,7 +194,7 @@ Hierarchical side-channel registration when `WORLD_SIZE > 1`. See [torchrun clus | `PROBING_NCCL_MAX_KERNEL_CH_SLOTS` | `8192` | Max in-flight kernel-channel slots per rank. | | `PROBING_NCCL_MAX_NET_SLOTS` | `4096` | Max in-flight net-plugin slots per rank. | | `PROBING_NCCL_POOL_SHARDS` | `8` | Shard slot pools by comm hash (1–64); total slot limits are divided evenly across shards. | -| `PROBING_NCCL_MIN_MSG_BYTES` | `0` | Drop events below this message size (bytes); `0` = record all. | +| `PROBING_NCCL_MIN_MSG_BYTES` | `0` | Drop events below this message size (bytes); `0` = record all. See also §NCCL above. | ## Debugging & diagnostics @@ -204,13 +205,13 @@ Hierarchical side-channel registration when `WORLD_SIZE > 1`. See [torchrun clus | `PROBING_CRASH_BACKTRACE` | enabled | Print a backtrace on fatal signals (SIGSEGV, SIGABRT, etc.). Set to `0` to disable. | | `PROBING_RUST_BACKTRACE` | — | Rust error backtrace detail (similar to `RUST_BACKTRACE`). | | `PROBING_SAFE_DEMO` | — | Safe demonstration mode that restricts dangerous operations. | +| `PROBING_MCP_ALLOW_WRITE` | unset | When `1`/`true`/`on`/`yes`, enables MCP write tools (`set_config`, `eval_python`). Default: read-only. See `probing/server/API.md`. | ## Skill & tool paths | Variable | Description | |----------|-------------| -| `PROBING_PROJECT_SKILLS_DIR` | Per-project skill directory (overrides `$PWD/.probing/skills/`). | -| `PROBING_USER_SKILLS_DIR` | Per-user skill directory (overrides `$HOME/.probing/skills/`). | +| `PROBING_SKILLS_DIR` | Extra skill root directory (appended after bundled/repo/user/project paths). Highest-priority filesystem override. | | `PROBING_CODE_ROOT` | Root directory for embedded Python monitoring code. | | `PROBING_CLI_MODE` | Set automatically by the CLI to prevent recursive engine initialization. | | `PROBING_PYTHON` | Path to the Python interpreter used by the CLI. Set automatically. | diff --git a/docs/src/reference/skill-format.md b/docs/src/reference/skill-format.md index ce55fac0..9ec637bb 100644 --- a/docs/src/reference/skill-format.md +++ b/docs/src/reference/skill-format.md @@ -205,28 +205,47 @@ parameter (default `true`) that auto-detects cluster availability from ### Interpretation rules Rules evaluate query results and produce severity-graded findings. They run after -all steps complete. +all steps complete. Clauses are joined with `|` (all must match). ```yaml interpretation: rules: - - id: high_gpu_mem - when: "step:check_gpu_mem | avg(allocated) > 90% * gpu_total" - severity: warning - message: "GPU memory usage ({avg_allocated:.0f}MB) exceeds 90% on rank {_rank}. Consider gradient checkpointing." - - id: mem_leak - when: "step:check_gpu_mem | slope(allocated) > 0" + - id: no_tables + when: "step:available_tables | rows == 0" severity: error - message: "GPU memory growing at {slope_rate:.1f}MB/step. Possible leak detected." + message: "No probe tables — confirm PROBING=1" + - id: straggler + when: "step:rank_latency | column:avg_ms | max/min(ratio) > 1.5" + severity: warning + message: "Rank spread on avg_ms exceeds 1.5×" + - id: chronic + when: "step:worst_fraction | rows >= 2 | top(row).worst_fraction > 2 * median(worst_fraction)" + severity: info + message: "One rank dominates worst_fraction" + - id: cluster_dead + when: "step:cluster_nodes | column:status | any_contains('dead')" + severity: warning + message: "Dead node in cluster.nodes" ``` +**`when` grammar (implemented in `probing-skills` / `interpret.rs`):** + +| Fragment | Example | +|----------|---------| +| Step binding | `step:` — required for row/column predicates | +| Row count | `rows == 0`, `rows >= 1` | +| Column predicate | `column: \| ` — pairs with the tail on the right | +| Numeric compare | `value == 0`, `value > 10`, `max > 1e6`, `avg > 5` | +| Spread | `max/min(ratio) > 1.5` | +| Ratio of columns | `ratio(num_col/den_col) > 0.3` | +| Text search | `any_contains('dead', 'stale')` — case-insensitive substring | +| Top vs median | `top(row).> N * median()` — needs `rows >= 2` on the step | + Rule fields: - `id`: Unique within the skill. -- `when`: A predicate expression. Format: `step: | `. - Supports `avg`, `max`, `min`, `count`, `slope`, `latest` aggregations, and `>`, - `<`, `>=`, `<=`, `==`, `!=` operators. `*` multiplies by a reference value. +- `when`: Predicate string (see table above). **Not** arbitrary expressions like `slope()` or `avg(col) > 90% * gpu_total` unless implemented in `interpret.rs`. - `severity`: `error`, `warning`, or `info`. -- `message`: Template with `{column}` placeholders filled from the step's results. +- `message`: Template; `{step_id.column}` and `{column}` placeholders expand from the first matching row. ### Summary template @@ -280,16 +299,16 @@ and how to interpret the results. ## Skill resolution and overlay -Skills are loaded from multiple roots in priority order: +Skills are loaded from multiple roots in priority order (highest wins): -1. Embedded (compiled into the CLI binary at build time) -2. `$HOME/.probing/skills/` — user-level overrides -3. `$PWD/.probing/skills/` — project-level overrides -4. `$PROBING_PROJECT_SKILLS_DIR` — environment override -5. `$PROBING_USER_SKILLS_DIR` — environment override +1. `$PROBING_SKILLS_DIR` — explicit extra root (when set) +2. `$PWD/.probing/skills/` — project overrides +3. `$HOME/.probing/skills/` — user overrides +4. Repo / wheel bundled skills (`skills/` at dev time; `python/probing/bundled_skills/` in the wheel) +5. Embedded defaults in the CLI binary (lowest) Later roots override earlier ones for the same skill ID. The catalog (`catalog.yaml`) -is also merged across roots — entries in higher-priority roots replace embedded +is also merged across roots — entries in higher-priority roots replace lower-priority entries with the same ID. This means you can override a built-in skill by placing a modified copy in your diff --git a/examples/imagenet_with_span.py b/examples/imagenet_with_span.py index 5c5e8921..418947c0 100644 --- a/examples/imagenet_with_span.py +++ b/examples/imagenet_with_span.py @@ -609,6 +609,7 @@ def train( model.train() end = time.time() + wall_start = time.perf_counter() for i, (images, target) in enumerate(train_loader): step_start = time.perf_counter() # time.sleep(1) @@ -634,7 +635,9 @@ def train( soak.tick() batch_time.update(time.time() - end) end = time.time() - step_elapsed_ms = (time.perf_counter() - step_start) * 1000.0 + compute_elapsed_ms = (time.perf_counter() - step_start) * 1000.0 + wall_elapsed_ms = (time.perf_counter() - wall_start) * 1000.0 + wall_start = time.perf_counter() if soak is not None and soak.should_stop(): print( f"=> soak stop in train(): {soak.stop_reason()} " @@ -644,7 +647,8 @@ def train( return True print( f"Epoch [{epoch}] step [{i + 1}/{len(train_loader)}] " - f"time={step_elapsed_ms:.2f}ms loss={loss.item():.4f} " + f"wall={wall_elapsed_ms:.2f}ms compute={compute_elapsed_ms:.2f}ms " + f"loss={loss.item():.4f} " f"acc1={acc1[0]:.2f}", flush=True, ) diff --git a/probing/cli/Cargo.toml b/probing/cli/Cargo.toml index 6c0371b8..de40fb71 100644 --- a/probing/cli/Cargo.toml +++ b/probing/cli/Cargo.toml @@ -17,6 +17,9 @@ path = "src/lib.rs" # name = "probing" # path = "src/main.rs" +[features] +python-bridge = ["dep:pyo3"] + [dependencies] probing-proto = { path = "../proto", default-features = false, features = [] } probing-skills = { path = "../crates/skills" } @@ -44,6 +47,9 @@ futures-util = "0.3" serde = { version = "1", features = ["derive"] } serde_yaml = "0.9" async-trait = "0.1" +pyo3 = { version = "0.29.0", optional = true, default-features = false, features = [ + "macros", +] } [dependencies.clap] version = "4.5.38" diff --git a/probing/cli/src/cli/cluster.rs b/probing/cli/src/cli/cluster.rs index be29513e..eeafa2f5 100644 --- a/probing/cli/src/cli/cluster.rs +++ b/probing/cli/src/cli/cluster.rs @@ -1,3 +1,4 @@ +use crate::cli::fanout::fanout_strict_enabled; use anyhow::Result; use probing_proto::prelude::NodeListResponse; use probing_skills::backend::parse_cluster_query_response; @@ -48,12 +49,26 @@ async fn cluster_query( let value: serde_json::Value = serde_json::from_str(&reply)?; let (dataframe, cluster_meta) = parse_cluster_query_response(&value).map_err(|e| anyhow::anyhow!(e.0))?; - if let Some(meta) = cluster_meta { + if let Some(meta) = &cluster_meta { eprintln!( "cluster query: cluster={cluster}, nodes_queried={}, nodes_failed={}", meta.nodes_queried, meta.nodes_failed.len() ); + if meta.partial { + if fanout_strict_enabled() { + anyhow::bail!( + "federated fan-out strict mode: cluster query returned partial data \ + (nodes_failed={}, peer_batches_dropped={})", + meta.nodes_failed.len(), + meta.peer_batches_dropped + ); + } + eprintln!( + "warning: cluster query returned partial data (nodes_failed={})", + meta.nodes_failed.len() + ); + } } render_dataframe(&dataframe); Ok(()) diff --git a/probing/cli/src/cli/ctrl.rs b/probing/cli/src/cli/ctrl.rs index 965a8be8..1b8a5d17 100644 --- a/probing/cli/src/cli/ctrl.rs +++ b/probing/cli/src/cli/ctrl.rs @@ -1,7 +1,9 @@ +use crate::cli::fanout::fanout_strict_enabled; use anyhow::{Context, Result}; use std::io::Write; use http_body_util::{BodyExt, Full}; +use hyper::header::{HeaderValue, AUTHORIZATION}; use hyper_util::rt::TokioIo; use probing_proto::{prelude::*, protocol::process::CallFrame}; @@ -157,6 +159,11 @@ impl ProbeEndpoint { .and_then(|v| v.as_bool()) .unwrap_or(false) { + if fanout_strict_enabled() { + return Err(anyhow::anyhow!( + "federated fan-out strict mode: query returned partial data: {meta}" + )); + } eprintln!("warning: federated query returned partial data: {meta}"); } } @@ -244,13 +251,13 @@ pub async fn request(ctrl: ProbeEndpoint, url: &str, body: Option) -> Re } }; let request = if let Some(body) = body { - Request::builder() + apply_auth_headers(Request::builder()) .method("POST") .uri(url) .body(Full::::from(body)) .context("Failed to build POST request")? } else { - Request::builder() + apply_auth_headers(Request::builder()) .method("GET") .uri(url) .body(Full::::default()) @@ -261,3 +268,15 @@ pub async fn request(ctrl: ProbeEndpoint, url: &str, body: Option) -> Re Ok(res.collect().await.map(|x| x.to_bytes().to_vec())?) } + +fn apply_auth_headers(builder: hyper::http::request::Builder) -> hyper::http::request::Builder { + if let Ok(token) = std::env::var("PROBING_AUTH_TOKEN") { + let token = token.trim(); + if !token.is_empty() { + if let Ok(value) = HeaderValue::from_str(&format!("Bearer {token}")) { + return builder.header(AUTHORIZATION, value); + } + } + } + builder +} diff --git a/probing/cli/src/cli/fanout.rs b/probing/cli/src/cli/fanout.rs new file mode 100644 index 00000000..ab64a4a7 --- /dev/null +++ b/probing/cli/src/cli/fanout.rs @@ -0,0 +1,15 @@ +//! Federated query policy helpers (mirrors `probing_core::core::federation`). + +use std::sync::LazyLock; + +const FANOUT_STRICT_ENV: &str = "PROBING_FANOUT_STRICT"; + +static FANOUT_STRICT: LazyLock = LazyLock::new(|| { + std::env::var(FANOUT_STRICT_ENV) + .ok() + .is_some_and(|v| v == "1" || v.eq_ignore_ascii_case("true")) +}); + +pub fn fanout_strict_enabled() -> bool { + *FANOUT_STRICT +} diff --git a/probing/cli/src/cli/inject.rs b/probing/cli/src/cli/inject.rs index 96eb0eea..d0de730c 100644 --- a/probing/cli/src/cli/inject.rs +++ b/probing/cli/src/cli/inject.rs @@ -1,371 +1,11 @@ use crate::inject::{Injector, Process}; -use anyhow::{anyhow, Context, Error, Result}; +use anyhow::{anyhow, Error, Result}; use clap::Args; use probing_proto::prelude::Query; -#[cfg(target_arch = "x86_64")] -use std::os::unix::ffi::OsStringExt; use super::ctrl; use super::ctrl::ProbeEndpoint; -#[cfg(target_arch = "x86_64")] -use crate::inject::{InjectionTrait, LibcAddrs}; - -/// The x64 shellcode that will be injected into the tracee. -#[cfg(target_arch = "x86_64")] -const SHELLCODE: [u8; 6] = [ - // Nop slide to make up for the fact that jumping is imprecise. - 0x90, 0x90, // nop; nop - // The tracer does most of the work by putting the arguments into the - // relevant registers, and the function pointer into `r9`. - 0x41, 0xff, 0xd1, // call r9 - // Trap so that the tracer can set up the next call. - 0xcc, // int3 -]; - -/// A type for managing the injection, execution and removal of shellcode in a -/// target process (tracee). -#[cfg(target_arch = "x86_64")] -#[derive(Debug)] -pub struct Injection<'a> { - /// The state of the tracee's registers before the injection. - saved_registers: pete::Registers, - /// The original state of the memory that was overwritten by the injection. - saved_memory: Vec, - /// The address at which the shellcode was injected. - injected_at: u64, - /// The addresses within the tracee's address space of the libc functions - /// that we need. - libc: LibcAddrs, - /// The tracer that is controlling the tracee. - tracer: &'a mut pete::Ptracer, - /// The process we are injecting into. - tracee: pete::Tracee, - /// If the injection is not explicitly removed, we attempt to do so when - /// it is dropped, but we need to know whether or not it was already removed. - removed: bool, -} - -#[cfg(target_arch = "x86_64")] -impl<'a> Injection<'a> { - /// Inject the shellcode into the given tracee. - pub(crate) fn inject( - proc: &Process, - tracer: &'a mut pete::Ptracer, - mut tracee: pete::Tracee, - ) -> Result { - let injected_at = proc - .find_executable_space() - .context("couldn't find region to write shellcode")?; - log::debug!("Injecting shellcode at {injected_at:x}"); - let saved_memory = tracee - .read_memory(injected_at, SHELLCODE.len()) - .context("failed to read memory we were going to overwrite")?; - log::trace!("Read memory to overwrite: {saved_memory:x?}"); - tracee - .write_memory(injected_at, &SHELLCODE) - .context("failed to write shellcode to tracee")?; - log::trace!("Written shellcode"); - let saved_registers = tracee - .registers() - .context("failed to save original tracee registers")?; - log::trace!("Saved registers: {saved_registers:x?}"); - let libc = LibcAddrs::for_process(proc) - .context("couldn't get libc function addresses for tracee")?; - log::trace!("Found libc addresses: {libc:x?}"); - log::debug!("Injected shellcode into tracee"); - Ok(Self { - saved_registers, - saved_memory, - injected_at, - libc, - tracer, - tracee, - removed: false, - }) - } - - /// Use the injected shellcode to load the library at the given path. - pub(crate) fn execute(&mut self, filename: &std::path::Path) -> Result<()> { - let address = self - .write_filename(filename) - .context("couldn't write library filename to tracee address space")?; - self.open_library(address) - .context("failed to load library in tracee")?; - self.free_alloc(address) - .context("failed to free memory we stored the library filename in")?; - log::debug!("Executed injected shellcode to load library"); - Ok(()) - } - - /// Allocate space for, and write, a filename in the tracee's address space. - /// - /// Returns the address of the filename. - fn write_filename(&mut self, filename: &std::path::Path) -> Result { - // Get the absolute path since the tracee's CWD could be anything. - let mut filename = std::fs::canonicalize(filename) - .context("couldn't get absolute path of given library")? - .into_os_string() - .into_vec(); - // Null-terminate the filename. - filename.push(0); - // RSI is unused, 0 is arbitrary. - let address = self - .call_function(self.libc.malloc, filename.len() as u64, 0) - .context("calling malloc in tracee failed")?; - if address == 0 { - return Err(anyhow::anyhow!("malloc within tracee returned NULL")); - } - log::trace!( - "Allocated {} bytes at {address:x} in tracee for library filename", - filename.len(), - ); - self.tracee - .write_memory(address, &filename) - .context("writing library name to tracee failed")?; - log::debug!("Wrote library filename to tracee"); - Ok(address) - } - - /// Open a library in the tracee, where the library's filename is already - /// stored in the tracee's address space, at `filename_address`. - fn open_library(&mut self, filename_address: u64) -> Result<()> { - let result = self - .call_function(self.libc.dlopen, filename_address, 1) // flags = RTLD_LAZY - .context("calling dlopen in tracee failed")?; - log::debug!("Called dlopen in tracee, result = {result:x}"); - if result == 0 { - Err(anyhow::anyhow!("dlopen within tracee returned NULL")) - } else { - Ok(()) - } - } - - /// Free memory allocated in the tracee. - fn free_alloc(&mut self, address: u64) -> Result<()> { - // Apparently RSI has to be 0 or free might try to free that address too? - let result = self - .call_function(self.libc.free, address, 0) - .context("calling free in tracee failed")?; - log::debug!("Freed memory in tracee, result = {result:x}"); - // Freeing is an optional cleanup step, don't check the result. - Ok(()) - } - - pub(crate) fn setenv(&mut self, name: Option<&str>, value: Option<&str>) -> Result<()> { - if let (Some(name), Some(value)) = (name, value) { - let name_address = self - .write_str(name) - .context("failed to allocate memory for env name")?; - let value_address = self - .write_str(value) - .context("failed to allocate memory for env value")?; - let _ = self.call_function3(self.libc.setenv, name_address, value_address, 1); - self.free_alloc(name_address) - .context("failed to free memory storing the env name")?; - self.free_alloc(value_address) - .context("failed to free memory storing the env value")?; - } - Ok(()) - } - - /// Allocate space for, and write, a string in the tracee's address space. - /// - /// Return the address of the string. - fn write_str(&mut self, s: &str) -> Result { - let mut s = s.as_bytes().to_vec(); - s.push(0); - let address = self - .call_function(self.libc.malloc, s.len() as u64, 0) - .context("calling malloc in tracee failed")?; - if address == 0 { - return Err(anyhow::anyhow!("malloc within tracee returned NULL")); - } - log::trace!( - "Allocated {} bytes at {address:x} in tracee for env string", - s.len(), - ); - self.tracee - .write_memory(address, &s) - .context("writing env str to tracee failed")?; - log::debug!("Wrote env str to tracee"); - Ok(address) - } - - /// Make a function call in the tracee via the injected shellcode. - fn call_function(&mut self, fn_address: u64, rdi: u64, rsi: u64) -> Result { - log::trace!("Calling function at {fn_address:x} with rdi = {rdi:x}, rsi = {rsi:x}"); - self.tracee - .set_registers(pete::Registers { - // Jump to the start of the shellcode. `rip` seems to be - // decremented when the tracee is resumed, so we make up for that. - rip: self.injected_at + 2, - // The shellcode calls whatever is pointed to by `r9`. - r9: fn_address, - // The relevant functions seem to take their arguments in these - // registers. - rdi, - rsi, - // Ensure that the stack pointer is aligned to a 16 byte boundary, as required by - // the x86-64 ABI. - rsp: self.saved_registers.rsp & !0xf, - ..self.saved_registers - }) - .context("setting tracee registers to run shellcode failed")?; - self.run_until_trap() - .context("waiting for shellcode in tracee to trap failed")?; - let result = self - .tracee - .registers() - .context("reading shellcode call result from tracee registers failed")? - .rax; - log::trace!("Function returned {result:x}"); - Ok(result) - } - - /// Make a function call with 3 arguments - fn call_function3(&mut self, fn_address: u64, rdi: u64, rsi: u64, rdx: u64) -> Result { - log::trace!("Calling function at {fn_address:x} with rdi = {rdi:x}, rsi = {rsi:x}"); - self.tracee - .set_registers(pete::Registers { - // Jump to the start of the shellcode. `rip` seems to be - // decremented when the tracee is resumed, so we make up for that. - rip: self.injected_at + 2, - // The shellcode calls whatever is pointed to by `r9`. - r9: fn_address, - // The relevant functions seem to take their arguments in these - // registers. - rdi, - rsi, - rdx, - // Ensure that the stack pointer is aligned to a 16 byte boundary, as required by - // the x86-64 ABI. - rsp: self.saved_registers.rsp & !0xf, - ..self.saved_registers - }) - .context("setting tracee registers to run shellcode failed")?; - self.run_until_trap() - .context("waiting for shellcode in tracee to trap failed")?; - let result = self - .tracee - .registers() - .context("reading shellcode call result from tracee registers failed")? - .rax; - log::trace!("Function returned {result:x}"); - Ok(result) - } - - /// Run the tracee until it reaches a trap instruction. - fn run_until_trap(&mut self) -> Result<()> { - log::trace!("Running tracee until it receives a signal"); - self.tracer - .restart(self.tracee, pete::Restart::Continue) - .context("resuming tracee to wait for trap failed")?; - while let Some(tracee) = self - .tracer - .wait() - .context("waiting for tracee trap failed")? - { - log::trace!("Tracee stopped with {:?}", tracee.stop); - match tracee.stop { - pete::Stop::SignalDelivery { - signal: pete::Signal::SIGTRAP, - } => { - self.tracee = tracee; - return Ok(()); - } - pete::Stop::SignalDelivery { signal } | pete::Stop::Group { signal } => { - let rip = tracee.registers().unwrap().rip; - return Err(anyhow::anyhow!( - "shellcode running in tracee sent unexpected signal {signal:?} at rip={rip:x}", - )); - } - _ => { - log::trace!("Not an interesting stop, continuing running tracee"); - self.tracer - .restart(tracee, pete::Restart::Continue) - .context("re-resuming tracee to wait for trap failed")?; - } - } - } - Err(anyhow::anyhow!( - "tracee exited while we were waiting for trap" - )) - } - - /// Remove the injected shellcode and restore the tracee to its original - /// state. - pub(crate) fn remove(mut self) -> Result<()> { - self.remove_internal() - } - - /// `remove` doesn't *need* to consume self, it only does so because the - /// instance shouldn't be used after it's been removed. This private method - /// implements the actual removal, and is also used by the `Drop` impl. - fn remove_internal(&mut self) -> Result<()> { - if self.removed { - log::trace!("Already removed injection, doing nothing"); - return Ok(()); - } - self.tracee - .write_memory(self.injected_at, &self.saved_memory) - .context("restoring original code to tracee failed")?; - log::trace!("Restored memory the injection overwrote"); - self.tracee - .set_registers(self.saved_registers) - .context("restoring original registers to tracee failed")?; - log::trace!("Restored tracee registers"); - log::debug!("Removed injection"); - self.removed = true; - Ok(()) - } -} - -#[cfg(target_arch = "x86_64")] -impl Drop for Injection<'_> { - fn drop(&mut self) { - if !self.removed { - log::warn!("Injection dropped without being removed, removing now"); - } - if let Err(e) = self - .remove_internal() - .context("removing injection from drop impl failed") - { - log::error!("Failed to remove injection: {e}"); - } - } -} - -#[cfg(target_arch = "x86_64")] -impl<'a> InjectionTrait for Injection<'a> { - fn inject( - proc: &crate::inject::Process, - tracer: &mut pete::Ptracer, - tracee: pete::Tracee, - ) -> Result { - // SAFETY: We need to convert &mut pete::Ptracer to &'a mut pete::Ptracer - // This is safe because the returned Injection<'a> will have the same lifetime - // as the tracer reference, and the injection will be removed before the tracer - // goes out of scope in perform_injection. - unsafe { - let tracer_ref = &mut *(tracer as *mut pete::Ptracer); - Self::inject(proc, tracer_ref, tracee) - } - } - - fn execute(&mut self, filename: &std::path::Path) -> Result<()> { - self.execute(filename) - } - - fn setenv(&mut self, name: Option<&str>, value: Option<&str>) -> Result<()> { - self.setenv(name, value) - } - - fn remove(self) -> Result<()> { - self.remove() - } -} - /// Inject into the target process #[derive(Args, Default, Debug)] pub struct InjectCommand { diff --git a/probing/cli/src/cli/mod.rs b/probing/cli/src/cli/mod.rs index 68cc88be..68988cce 100644 --- a/probing/cli/src/cli/mod.rs +++ b/probing/cli/src/cli/mod.rs @@ -6,6 +6,7 @@ pub mod bench; pub mod cluster; pub mod commands; pub mod ctrl; +pub mod fanout; pub mod help; pub mod mcp; pub mod repl; diff --git a/probing/cli/src/cli/repl.rs b/probing/cli/src/cli/repl.rs index 591e23f8..c71a2837 100644 --- a/probing/cli/src/cli/repl.rs +++ b/probing/cli/src/cli/repl.rs @@ -38,11 +38,16 @@ pub async fn start_repl(ctrl: ProbeEndpoint) -> Result<()> { let editor = line_editor.clone(); let prompt = prompt.clone(); let sig = tokio::task::spawn_blocking(move || { - let mut editor = editor.lock().unwrap_or_else(|e| { - eprintln!("Failed to acquire lock on line editor (lock poisoned): {e}"); - panic!("Lock poisoned: {e}") - }); - editor.read_line(&prompt) + let mut editor = match editor.lock() { + Ok(guard) => guard, + Err(e) => { + eprintln!("Failed to acquire lock on line editor (lock poisoned): {e}"); + return Err(anyhow::anyhow!("line editor lock poisoned: {e}")); + } + }; + editor + .read_line(&prompt) + .map_err(|e| anyhow::anyhow!("{e}")) }) .await .context("Error reading input task")?; diff --git a/probing/cli/src/cli/store.rs b/probing/cli/src/cli/store.rs index 58fbe61d..f2624a7d 100644 --- a/probing/cli/src/cli/store.rs +++ b/probing/cli/src/cli/store.rs @@ -1,3 +1,4 @@ +use anyhow::Context; use anyhow::Result; use clap::Args; @@ -50,7 +51,12 @@ pub struct StoreArgs { impl StoreCommand { pub async fn run(&self) -> Result<()> { - let store = TCPStore::new(self.args.endpoint.clone().unwrap()); + let endpoint = self + .args + .endpoint + .clone() + .context("store commands require --endpoint (host:port)")?; + let store = TCPStore::new(endpoint); match &self.command { StoreSubCommand::Set { key, value } => { diff --git a/probing/cli/src/inject/injection.rs b/probing/cli/src/inject/injection.rs index 96822268..c836de9f 100644 --- a/probing/cli/src/inject/injection.rs +++ b/probing/cli/src/inject/injection.rs @@ -264,7 +264,7 @@ impl<'a> Injection<'a> { return Ok(()); } pete::Stop::SignalDelivery { signal } | pete::Stop::Group { signal } => { - let rip = tracee.registers().unwrap().rip; + let rip = tracee.registers().context("read tracee registers")?.rip; return Err(anyhow::anyhow!( "shellcode running in tracee sent unexpected signal {signal:?} at rip={rip:x}", )); diff --git a/probing/cli/src/inject/injection_aarch64.rs b/probing/cli/src/inject/injection_aarch64.rs index 873bc806..dd1e2dd5 100644 --- a/probing/cli/src/inject/injection_aarch64.rs +++ b/probing/cli/src/inject/injection_aarch64.rs @@ -275,7 +275,7 @@ impl<'a> InjectionAarch64<'a> { return Ok(()); } pete::Stop::SignalDelivery { signal } | pete::Stop::Group { signal } => { - let pc = tracee.registers().unwrap().pc; + let pc = tracee.registers().context("read tracee registers")?.pc; return Err(anyhow::anyhow!( "shellcode running in tracee sent unexpected signal {signal:?} at pc={pc:x}", )); diff --git a/probing/cli/src/lib.rs b/probing/cli/src/lib.rs index 05e95a52..7f9db57d 100644 --- a/probing/cli/src/lib.rs +++ b/probing/cli/src/lib.rs @@ -1,6 +1,9 @@ pub mod cli; pub mod table; +#[cfg(feature = "python-bridge")] +pub mod pyo3; + #[cfg(target_os = "linux")] pub mod inject; diff --git a/probing/cli/src/pyo3.rs b/probing/cli/src/pyo3.rs new file mode 100644 index 00000000..defa473e --- /dev/null +++ b/probing/cli/src/pyo3.rs @@ -0,0 +1,19 @@ +//! PyO3 entry for `probing.cli_main` (wheel `_core` — not L2 collector). + +use pyo3::prelude::*; + +use crate::cli_main as cli_main_impl; + +#[pyfunction] +pub fn cli_main(py: Python, args: Vec) -> PyResult<()> { + // Skill install/update shells out to ``python -m probing.skills`` — use this interpreter. + if let Ok(exe) = py.import("sys")?.getattr("executable")?.extract::() { + std::env::set_var("PROBING_PYTHON", exe); + } + if let Err(e) = cli_main_impl(args) { + return Err(PyErr::new::( + e.to_string(), + )); + } + Ok(()) +} diff --git a/probing/cli/src/table.rs b/probing/cli/src/table.rs index 7f529a01..64cecadb 100644 --- a/probing/cli/src/table.rs +++ b/probing/cli/src/table.rs @@ -191,10 +191,10 @@ pub fn render_dataframe(df: &DataFrame) { table.put((row + 1, col).into(), value); } } - println!( - "{}", - table.draw(terminal_width().unwrap_or(80) as usize).unwrap() - ); + let rendered = table + .draw(terminal_width().unwrap_or(80) as usize) + .unwrap_or_else(|| "(table render failed)".to_string()); + println!("{rendered}"); } fn terminal_width() -> Option { diff --git a/probing/core/Cargo.toml b/probing/core/Cargo.toml index 4df89a93..e7c2262f 100644 --- a/probing/core/Cargo.toml +++ b/probing/core/Cargo.toml @@ -24,7 +24,7 @@ similar_names = "allow" [features] test-utils = [] -default = ["builtin-schema-docs"] +default = [] builtin-schema-docs = ["dep:probing-hccl-shim", "dep:probing-nccl-profiler"] python-bridge = ["dep:pyo3"] @@ -52,7 +52,7 @@ thiserror = { workspace = true } async-trait = "0.1.83" datafusion = { workspace = true } futures = "0.3.31" -ureq = { version = "3.1.2", default-features = false, features = ["rustls"] } +ureq = { workspace = true } sled = "0.34.7" bincode = "1.3.3" uuid = { version = "1.0", features = ["v4", "serde"] } @@ -64,3 +64,5 @@ pyo3 = { version = "0.29.0", optional = true, default-features = false, features [dev-dependencies] tempfile = "3.8" +probing-hccl-shim = { path = "../extensions/hccl-shim" } +probing-nccl-profiler = { path = "../extensions/nccl-profiler" } diff --git a/probing/core/src/core/cluster.rs b/probing/core/src/core/cluster.rs index 9ac2444d..4fcc843a 100644 --- a/probing/core/src/core/cluster.rs +++ b/probing/core/src/core/cluster.rs @@ -350,14 +350,14 @@ pub const HIERARCHICAL_METADATA_UNAVAILABLE: &str = "cluster hierarchical fan-out unavailable: cluster.nodes missing group_rank/local_rank metadata"; /// Build a user-facing error for missing hierarchical metadata. -pub fn hierarchical_metadata_unavailable_err() -> anyhow::Error { - anyhow::anyhow!( +pub fn hierarchical_metadata_unavailable_err() -> crate::core::error::EngineError { + crate::core::error::EngineError::ClusterError(format!( "{HIERARCHICAL_METADATA_UNAVAILABLE} — wait for torchrun heartbeat to converge, \ or set hierarchical=false / PROBING_CLUSTER_FANOUT_HIERARCHICAL=0 for legacy flat fan-out" - ) + )) } -pub fn is_hierarchical_metadata_unavailable(err: &anyhow::Error) -> bool { +pub fn is_hierarchical_metadata_unavailable(err: &impl std::fmt::Display) -> bool { err.to_string() .starts_with(HIERARCHICAL_METADATA_UNAVAILABLE) } diff --git a/probing/core/src/core/engine.rs b/probing/core/src/core/engine.rs index 18849d7f..72542c44 100644 --- a/probing/core/src/core/engine.rs +++ b/probing/core/src/core/engine.rs @@ -10,7 +10,6 @@ use datafusion::error::DataFusionError; use datafusion::error::Result; use datafusion::execution::SessionState; use datafusion::prelude::{DataFrame, SessionConfig, SessionContext}; -use futures; use super::arrow_convert::{arrow_array_to_seq, empty_seq_for_data_type}; use super::probe_extension::ProbeExtension; @@ -55,10 +54,20 @@ pub struct Engine { impl Clone for Engine { fn clone(&self) -> Self { - // Note: This is a synchronous clone, so we need to block on the async lock - // In practice, this should be avoided in async contexts - use futures::executor::block_on; - let plugins_clone = block_on(async { self.data_sources.read().await.clone() }); + let plugins_clone = match self.data_sources.try_read() { + Ok(guard) => guard.clone(), + Err(_) => { + log::warn!("Engine::clone: data_sources contended; blocking for read"); + if let Ok(handle) = tokio::runtime::Handle::try_current() { + tokio::task::block_in_place(|| { + handle.block_on(async { self.data_sources.read().await.clone() }) + }) + } else { + crate::runtime::CORE_RUNTIME + .block_on(async { self.data_sources.read().await.clone() }) + } + } + }; Self { context: self.context.clone(), data_sources: RwLock::new(plugins_clone), @@ -109,6 +118,7 @@ impl Engine { let original: String = query.into(); let capped = federation::ensure_global_scan_limit(&original); if let Some(df) = federation::try_execute_aggregate_pushdown(self, &capped).await? { + federation::check_fanout_strict()?; return Ok(Some(df)); } let default_schema = self.default_namespace(); @@ -118,6 +128,7 @@ impl Engine { let df = self.sql(query.as_str()).await?; let schema = df.schema().clone(); let batches = df.collect().await?; + federation::check_fanout_strict()?; if batches.is_empty() { let names = schema .fields() diff --git a/probing/core/src/core/federation/aggregate_pushdown.rs b/probing/core/src/core/federation/aggregate_pushdown.rs index 2aa44e56..7e7b6faa 100644 --- a/probing/core/src/core/federation/aggregate_pushdown.rs +++ b/probing/core/src/core/federation/aggregate_pushdown.rs @@ -20,7 +20,7 @@ use crate::core::arrow_convert::arrow_array_to_seq; use crate::core::Engine; use super::cluster_executor::{ - reset_fanout_stats, set_fanout_stats, FanoutStats, ProbeClusterExecutor, + enforce_fanout_strict, reset_fanout_stats, set_fanout_stats, FanoutStats, ProbeClusterExecutor, }; use super::convert::{ cluster_rank_for_endpoint, is_federation_tag_column, proto_dataframe_to_record_batch, @@ -117,6 +117,7 @@ pub async fn try_execute_aggregate_pushdown( append_fanout_outcomes(&mut proto_parts, &mut stats, &plan, outcomes); if proto_parts.is_empty() { + enforce_fanout_strict(&stats)?; set_fanout_stats(stats); return Ok(None); } @@ -147,6 +148,7 @@ pub async fn try_execute_aggregate_pushdown( result }; + enforce_fanout_strict(&stats)?; set_fanout_stats(stats); Ok(Some(result)) } @@ -167,7 +169,7 @@ fn append_fanout_outcomes( proto_parts.push(df); } Err(err) => { - log::debug!("aggregate pushdown skipped {}: {err}", outcome.addr); + log::warn!("aggregate pushdown skipped {}: {err}", outcome.addr); stats.nodes_failed.push(outcome.addr); } } diff --git a/probing/core/src/core/federation/cluster_executor.rs b/probing/core/src/core/federation/cluster_executor.rs index 762d2dea..69c1d497 100644 --- a/probing/core/src/core/federation/cluster_executor.rs +++ b/probing/core/src/core/federation/cluster_executor.rs @@ -115,10 +115,55 @@ pub fn record_fanout_failure(addr: &str) { lock_fanout_stats().nodes_failed.push(addr.to_string()); } +/// Env var: when set to `1` or `true`, federated fan-out failures fail the query. +const FANOUT_STRICT_ENV: &str = "PROBING_FANOUT_STRICT"; + +fn parse_fanout_strict_env() -> bool { + std::env::var(FANOUT_STRICT_ENV) + .ok() + .is_some_and(|v| v == "1" || v.eq_ignore_ascii_case("true")) +} + +#[cfg(not(test))] +static FANOUT_STRICT: LazyLock = LazyLock::new(parse_fanout_strict_env); + +/// Whether federated fan-out must succeed on every peer (fail-fast). +pub fn fanout_strict_enabled() -> bool { + #[cfg(test)] + { + parse_fanout_strict_env() + } + #[cfg(not(test))] + { + *FANOUT_STRICT + } +} + +pub fn fanout_stats_partial(stats: &FanoutStats) -> bool { + !stats.nodes_failed.is_empty() || stats.peer_batches_dropped > 0 +} + +/// Fail the query when strict fan-out is enabled and any peer was dropped. +pub fn enforce_fanout_strict(stats: &FanoutStats) -> Result<()> { + if fanout_strict_enabled() && fanout_stats_partial(stats) { + return Err(DataFusionError::Execution(format!( + "federated fan-out strict mode: {} node(s) failed, {} peer batch(es) dropped", + stats.nodes_failed.len(), + stats.peer_batches_dropped + ))); + } + Ok(()) +} + pub fn take_fanout_stats() -> FanoutStats { std::mem::take(&mut *lock_fanout_stats()) } +/// Check global fan-out stats without consuming them (for post-query validation). +pub fn check_fanout_strict() -> Result<()> { + enforce_fanout_strict(&lock_fanout_stats()) +} + pub struct ProbeClusterExecutor; impl ProbeClusterExecutor { @@ -370,3 +415,21 @@ impl ProbeClusterExecutor { } } } + +#[cfg(test)] +mod fanout_strict_tests { + use super::*; + + #[test] + fn enforce_fanout_strict_respects_env() { + let stats = FanoutStats { + nodes_failed: vec!["10.0.0.2:8080".into()], + ..FanoutStats::default() + }; + std::env::remove_var(FANOUT_STRICT_ENV); + assert!(enforce_fanout_strict(&stats).is_ok()); + std::env::set_var(FANOUT_STRICT_ENV, "1"); + assert!(enforce_fanout_strict(&stats).is_err()); + std::env::remove_var(FANOUT_STRICT_ENV); + } +} diff --git a/probing/core/src/core/federation/convert.rs b/probing/core/src/core/federation/convert.rs index 19d6ae1a..ba55346a 100644 --- a/probing/core/src/core/federation/convert.rs +++ b/probing/core/src/core/federation/convert.rs @@ -32,7 +32,7 @@ pub const FEDERATION_TAG_COLUMNS: &[&str] = &[ fn record_batch(schema: Schema, columns: Vec, ctx: &'static str) -> Result { RecordBatch::try_new(Arc::new(schema), columns) - .map_err(|e| DataFusionError::Execution(format!("{ctx}: {e}"))) + .map_err(|e| DataFusionError::ArrowError(Box::new(e), Some(ctx.to_string()))) } #[derive(Debug, Clone, PartialEq, Eq)] diff --git a/probing/core/src/core/federation/federated_scan_exec.rs b/probing/core/src/core/federation/federated_scan_exec.rs index 33a15edf..01f45537 100644 --- a/probing/core/src/core/federation/federated_scan_exec.rs +++ b/probing/core/src/core/federation/federated_scan_exec.rs @@ -27,10 +27,20 @@ use datafusion::physical_plan::{ use futures::StreamExt; use probing_proto::prelude::{DataFrame, Node}; -use super::cluster_executor::{record_fanout_failure, record_fanout_success, ProbeClusterExecutor}; +use super::cluster_executor::{ + fanout_strict_enabled, record_fanout_failure, record_fanout_success, ProbeClusterExecutor, +}; use super::convert::{align_batch_to_schema, dataframe_to_record_batch, tag_record_batch}; use super::fanout_scope::FanoutScope; +fn log_federated_peer_failure(context: &str, addr_tag: &str, detail: &str) { + if fanout_strict_enabled() { + log::warn!("{context} {addr_tag}: {detail}"); + } else { + log::debug!("{context} {addr_tag}: {detail}"); + } +} + /// Federated scan plan combining the local table with lazily fetched peers. #[derive(Debug)] pub struct FederatedScanExec { @@ -155,18 +165,30 @@ impl FederatedScanExec { opt } Err(err) => { - log::debug!("federated scan dropped {addr_tag}: {err}"); + log_federated_peer_failure( + "federated scan dropped", + &addr_tag, + &err.to_string(), + ); record_fanout_failure(&addr_tag); None } }, Ok(Err(err)) => { - log::debug!("federated scan skipped {addr_tag}: {err}"); + log_federated_peer_failure( + "federated scan skipped", + &addr_tag, + &err.to_string(), + ); record_fanout_failure(&addr_tag); None } Err(err) => { - log::debug!("federated scan join failed for {addr_tag}: {err}"); + log_federated_peer_failure( + "federated scan join failed for", + &addr_tag, + &err.to_string(), + ); record_fanout_failure(&addr_tag); None } diff --git a/probing/core/src/core/federation/mod.rs b/probing/core/src/core/federation/mod.rs index e253f816..2813d5ea 100644 --- a/probing/core/src/core/federation/mod.rs +++ b/probing/core/src/core/federation/mod.rs @@ -16,6 +16,7 @@ pub use aggregate_pushdown::{ #[cfg(any(test, feature = "test-utils"))] pub use cluster_executor::set_remote_query_hook; pub use cluster_executor::{ + check_fanout_strict, enforce_fanout_strict, fanout_stats_partial, fanout_strict_enabled, remote_fanout_concurrency, remote_query_timeout, reset_fanout_stats, set_fanout_stats, take_fanout_stats, FanoutStats, ProbeClusterExecutor, RemoteFanoutResult, }; diff --git a/probing/core/src/core/memtable_sql.rs b/probing/core/src/core/memtable_sql.rs index 17c3c9df..0e297e84 100644 --- a/probing/core/src/core/memtable_sql.rs +++ b/probing/core/src/core/memtable_sql.rs @@ -174,6 +174,13 @@ fn mmap_table_exists(schema: &str, table: &str) -> bool { self_dir().join(mmap_filename_for(schema, table)).is_file() } +/// Build a table provider that fails at scan time with a clear error. +fn mmap_error_table(logical_name: &str, err: impl std::fmt::Display) -> Arc { + let message = format!("memtable mmap invalid for {logical_name}: {err}"); + log::error!("{message}"); + Arc::new(PluginAdvancedTable::error_sentinel(logical_name, message)) +} + /// Mmap ring / MEMH → Arrow batches, then a [`PluginAdvancedTable`] so DataFusion can push /// filters and limits into the scan path. pub fn bytes_to_pushdown_table(data: &[u8], logical_name: &str) -> Arc { @@ -181,22 +188,19 @@ pub fn bytes_to_pushdown_table(data: &[u8], logical_name: &str) -> Arc { let view = match MemTableView::new(data) { Ok(v) => v, - Err(_) => return Arc::new(PluginAdvancedTable::empty_sentinel(logical_name)), + Err(e) => return mmap_error_table(logical_name, e), }; let schema = view_to_arrow_schema(&view); let batches = view_to_recordbatches(&view); match PluginAdvancedTable::try_new(logical_name, schema, batches) { Ok(t) => Arc::new(t), - Err(e) => { - log::error!("memtable PluginAdvancedTable (ring): {e}"); - Arc::new(PluginAdvancedTable::empty_sentinel(logical_name)) - } + Err(e) => mmap_error_table(logical_name, e), } } Some(TableKind::Hash) => { let view = match MemhView::new(data) { Ok(v) => v, - Err(_) => return Arc::new(PluginAdvancedTable::empty_sentinel(logical_name)), + Err(e) => return mmap_error_table(logical_name, e), }; let schema = memh_kv_schema(); let batches = memh_view_to_recordbatch(&view); @@ -205,13 +209,14 @@ pub fn bytes_to_pushdown_table(data: &[u8], logical_name: &str) -> Arc Arc::new(t), - Err(e) => { - log::error!("memtable PluginAdvancedTable (memh): {e}"); - Arc::new(PluginAdvancedTable::empty_sentinel(logical_name)) - } + Err(e) => mmap_error_table(logical_name, e), } } - None => Arc::new(PluginAdvancedTable::empty_sentinel(logical_name)), + None => { + let message = format!("unrecognized mmap layout for {logical_name}"); + log::error!("{message}"); + mmap_error_table(logical_name, message) + } } } @@ -778,7 +783,7 @@ pub fn mapped_file_to_table(mapped: MappedFile, logical_name: &str) -> Arc match RingMmapTable::try_new(mapped) { Ok(t) => Arc::new(t), - Err(_) => Arc::new(PluginAdvancedTable::empty_sentinel(logical_name)), + Err(e) => mmap_error_table(logical_name, e), }, _ => bytes_to_pushdown_table(mapped.as_bytes(), logical_name), } @@ -863,7 +868,7 @@ fn prefer_semantic_python_table( if let Some(TableKind::Ring) = detect_table(mapped.as_bytes()) { match RingMmapTable::try_new(mapped) { Ok(ring) => Arc::new(HotColdTable::new(ring, cold_dir(), basename)), - Err(_) => Arc::new(PluginAdvancedTable::empty_sentinel(name)), + Err(e) => mmap_error_table(name, e), } } else { mapped_file_to_table(mapped, name) @@ -938,7 +943,7 @@ impl SchemaProvider for MmapFileSchemaProvider { if let Some(TableKind::Ring) = detect_table(mapped.as_bytes()) { return Ok(Some(match RingMmapTable::try_new(mapped) { Ok(ring) => Arc::new(HotColdTable::new(ring, cold_dir(), basename)), - Err(_) => Arc::new(PluginAdvancedTable::empty_sentinel(name)), + Err(e) => mmap_error_table(name, e), })); } return Ok(Some(mapped_file_to_table(mapped, name))); diff --git a/probing/core/src/core/plugin_advanced.rs b/probing/core/src/core/plugin_advanced.rs index 7a5bc9b0..83e08b8c 100644 --- a/probing/core/src/core/plugin_advanced.rs +++ b/probing/core/src/core/plugin_advanced.rs @@ -42,6 +42,9 @@ pub struct PluginAdvancedTable { schema: SchemaRef, /// Partition layout expected by [`MemorySourceConfig`]. partitions: Vec>, + /// When set, [`TableProvider::scan`] fails with this message instead of + /// returning misleading zero-row results (e.g. corrupt mmap). + scan_error: Option, } impl PluginAdvancedTable { @@ -63,6 +66,7 @@ impl PluginAdvancedTable { label, schema, partitions: vec![batches], + scan_error: None, }) } @@ -82,9 +86,28 @@ impl PluginAdvancedTable { label, schema, partitions, + scan_error: None, }) } + /// Sentinel for corrupt mmap inputs: schema/stats look empty, but `scan` + /// surfaces `message` as a DataFusion error instead of silent zero rows. + pub fn error_sentinel(label: impl Into, message: impl Into) -> Self { + let label = label.into(); + let schema = Arc::new(Schema::new(vec![Field::new( + "_empty", + DataType::Int64, + true, + )])); + let empty = RecordBatch::new_empty(Arc::clone(&schema)); + Self { + label, + schema, + partitions: vec![vec![empty]], + scan_error: Some(message.into()), + } + } + /// Sentinel for invalid mmap / empty inputs (zero-row, minimal schema). pub fn empty_sentinel(label: impl Into) -> Self { let label = label.into(); @@ -98,6 +121,7 @@ impl PluginAdvancedTable { label, schema, partitions: vec![vec![empty]], + scan_error: None, } } @@ -233,6 +257,9 @@ impl TableProvider for PluginAdvancedTable { filters: &[Expr], limit: Option, ) -> Result> { + if let Some(msg) = &self.scan_error { + return Err(DataFusionError::External(msg.clone().into())); + } scan_memory_partitions( state, self.schema(), @@ -333,6 +360,21 @@ mod tests { assert_eq!(s.num_rows, Precision::Exact(0)); } + #[tokio::test] + async fn error_sentinel_scan_surfaces_message() -> Result<()> { + let t = PluginAdvancedTable::error_sentinel("bad_mmap", "corrupt header"); + let ctx = SessionContext::new(); + ctx.register_table("bad_mmap", Arc::new(t))?; + let err = ctx + .sql("SELECT * FROM bad_mmap") + .await? + .collect() + .await + .unwrap_err(); + assert!(err.to_string().contains("corrupt header")); + Ok(()) + } + // --- pushdown helpers --- #[test] diff --git a/probing/core/src/core/probe_extension.rs b/probing/core/src/core/probe_extension.rs index ac8c81dc..5f90da36 100644 --- a/probing/core/src/core/probe_extension.rs +++ b/probing/core/src/core/probe_extension.rs @@ -421,14 +421,19 @@ impl ExtensionOptions for ProbeExtensionManager { } fn set(&mut self, key: &str, value: &str) -> datafusion::error::Result<()> { - use futures::executor::block_on; - block_on(self.set_option(key, value)).map_err(datafusion::error::DataFusionError::from) + let fut = self.set_option(key, value); + if let Ok(handle) = tokio::runtime::Handle::try_current() { + tokio::task::block_in_place(|| handle.block_on(fut)) + .map_err(datafusion::error::DataFusionError::from) + } else { + crate::runtime::CORE_RUNTIME + .block_on(fut) + .map_err(datafusion::error::DataFusionError::from) + } } fn entries(&self) -> Vec { - use futures::executor::block_on; - - block_on(async { + let fut = async { self.options() .await .iter() @@ -438,7 +443,12 @@ impl ExtensionOptions for ProbeExtensionManager { description: option.help, }) .collect() - }) + }; + if let Ok(handle) = tokio::runtime::Handle::try_current() { + tokio::task::block_in_place(|| handle.block_on(fut)) + } else { + crate::runtime::CORE_RUNTIME.block_on(fut) + } } } diff --git a/probing/core/src/core/semantic_catalog.rs b/probing/core/src/core/semantic_catalog.rs index 597dea95..2787ef3b 100644 --- a/probing/core/src/core/semantic_catalog.rs +++ b/probing/core/src/core/semantic_catalog.rs @@ -471,6 +471,7 @@ mod tests { #[test] fn build_catalog_prefers_code_docs_for_hccl() { + probing_hccl_shim::register_docs(); let parsed = build_semantic_catalog().unwrap(); let host_ops = parsed .table_rows @@ -523,6 +524,7 @@ mod tests { #[test] fn build_catalog_nccl_culprit_column_from_code() { + probing_nccl_profiler::register_docs(); let parsed = build_semantic_catalog().unwrap(); let row = parsed .column_rows diff --git a/probing/core/src/runtime.rs b/probing/core/src/runtime.rs index 2e82fab7..298c2706 100644 --- a/probing/core/src/runtime.rs +++ b/probing/core/src/runtime.rs @@ -21,11 +21,11 @@ pub enum RuntimeError { impl From for datafusion::error::DataFusionError { fn from(e: RuntimeError) -> Self { - datafusion::error::DataFusionError::Execution(e.to_string()) + datafusion::error::DataFusionError::External(Box::new(e)) } } -/// Fallback value when [`block_on`] cannot run the future (never panics or exits). +/// Fallback value when the native bridge cannot recover a stored closure (internal only). pub trait BlockOnFallback: Send + 'static { fn on_block_on_failure(err: RuntimeError) -> Self; } @@ -34,30 +34,6 @@ impl BlockOnFallback for () { fn on_block_on_failure(_: RuntimeError) -> Self {} } -impl BlockOnFallback for bool { - fn on_block_on_failure(_: RuntimeError) -> Self { - false - } -} - -impl BlockOnFallback for usize { - fn on_block_on_failure(_: RuntimeError) -> Self { - 0 - } -} - -impl BlockOnFallback for i32 { - fn on_block_on_failure(_: RuntimeError) -> Self { - 0 - } -} - -impl BlockOnFallback for Option { - fn on_block_on_failure(_: RuntimeError) -> Self { - None - } -} - impl BlockOnFallback for Result where T: Send + 'static, @@ -74,29 +50,6 @@ impl BlockOnFallback for Result { } } -impl BlockOnFallback for std::collections::HashMap -where - K: Eq + std::hash::Hash + Send + 'static, - V: Send + 'static, - S: Default + std::hash::BuildHasher + Send + 'static, -{ - fn on_block_on_failure(_: RuntimeError) -> Self { - Self::default() - } -} - -impl BlockOnFallback for String { - fn on_block_on_failure(_: RuntimeError) -> Self { - String::new() - } -} - -impl BlockOnFallback for Vec { - fn on_block_on_failure(_: RuntimeError) -> Self { - Vec::new() - } -} - #[cfg(feature = "python-bridge")] impl BlockOnFallback for Result { fn on_block_on_failure(err: RuntimeError) -> Self { @@ -143,13 +96,13 @@ pub struct CoreRuntime { degraded: AtomicBool, } -static FALLBACK_RUNTIME: OnceLock = OnceLock::new(); +static FALLBACK_RUNTIME: OnceLock> = OnceLock::new(); /// Last-resort runtime for the server-side `block_on`/`spawn` methods, which — /// unlike the free [`block_on`] function — cannot return a `Result`. Tries a /// bounded number of times rather than spinning forever, so a catastrophic /// environment fails loudly instead of hanging a thread. -fn build_emergency_runtime() -> tokio::runtime::Runtime { +fn build_emergency_runtime() -> Option { const MAX_ATTEMPTS: u32 = 8; for attempt in 1..=MAX_ATTEMPTS { match tokio::runtime::Builder::new_current_thread() @@ -157,7 +110,7 @@ fn build_emergency_runtime() -> tokio::runtime::Runtime { .thread_name("probing-runtime-fallback") .build() { - Ok(rt) => return rt, + Ok(rt) => return Some(rt), Err(e) => { log::error!( "probing: emergency runtime creation failed (attempt {attempt}/{MAX_ATTEMPTS}): {e}" @@ -166,7 +119,43 @@ fn build_emergency_runtime() -> tokio::runtime::Runtime { } } } - panic!("probing: unable to create any tokio runtime after {MAX_ATTEMPTS} attempts"); + log::error!( + "probing: unable to create any tokio runtime after {MAX_ATTEMPTS} attempts; \ + async bridge will use ephemeral executors" + ); + None +} + +fn try_ephemeral_runtime() -> Option<&'static tokio::runtime::Runtime> { + static EPHEMERAL: OnceLock> = OnceLock::new(); + EPHEMERAL + .get_or_init(|| { + match tokio::runtime::Builder::new_current_thread() + .enable_all() + .thread_name("probing-runtime-ephemeral") + .build() + { + Ok(rt) => Some(rt), + Err(e) => { + log::error!("probing: ephemeral runtime build failed: {e}; retrying minimal"); + tokio::runtime::Builder::new_current_thread() + .build() + .map(Some) + .unwrap_or_else(|e2| { + log::error!("probing: minimal ephemeral runtime build failed: {e2}"); + None + }) + } + } + }) + .as_ref() +} + +fn fallback_runtime() -> Option<&'static tokio::runtime::Runtime> { + FALLBACK_RUNTIME + .get_or_init(|| build_emergency_runtime().map(|rt| Box::leak(Box::new(rt)) as &'static _)) + .as_ref() + .copied() } impl CoreRuntime { @@ -185,15 +174,16 @@ impl CoreRuntime { } } - fn runtime_ref(&self) -> &tokio::runtime::Runtime { + fn resolve_runtime(&self) -> Option<&tokio::runtime::Runtime> { if let Some(rt) = &self.inner { - return rt; + return Some(rt); } - FALLBACK_RUNTIME.get_or_init(|| { - self.mark_degraded(); - log::error!("probing: activating emergency fallback tokio runtime"); - build_emergency_runtime() - }) + self.mark_degraded(); + fallback_runtime().or_else(try_ephemeral_runtime) + } + + fn ensure_runtime(&self) -> Option<&tokio::runtime::Runtime> { + self.resolve_runtime() } /// Whether the shared runtime is healthy enough for probing async work. @@ -215,18 +205,79 @@ impl CoreRuntime { F: Future + Send + 'static, F::Output: Send + 'static, { - self.runtime_ref().spawn(future) + match self.ensure_runtime() { + Some(rt) => rt.spawn(future), + None => { + self.mark_degraded(); + log::error!("probing: no tokio runtime for spawn; creating per-call ephemeral"); + match tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + { + Ok(rt) => rt.spawn(future), + Err(e) => { + log::error!("probing: per-call spawn runtime build failed: {e}"); + try_ephemeral_runtime() + .expect("probing: no tokio runtime for spawn") + .spawn(future) + } + } + } + } + } + + pub fn handle(&self) -> Option { + self.ensure_runtime().map(|rt| rt.handle().clone()) } - pub fn handle(&self) -> tokio::runtime::Handle { - self.runtime_ref().handle().clone() + /// Run a future on this runtime; returns `Err` when no executor is available. + pub fn try_block_on(&self, future: F) -> Result + where + F: Future, + { + if let Some(rt) = &self.inner { + return Ok(rt.block_on(future)); + } + if let Some(rt) = fallback_runtime() { + self.mark_degraded(); + return Ok(rt.block_on(future)); + } + if let Some(rt) = try_ephemeral_runtime() { + self.mark_degraded(); + log::error!( + "probing: no core/fallback runtime for try_block_on; using static ephemeral" + ); + return Ok(rt.block_on(future)); + } + self.mark_degraded(); + log::error!( + "probing: no tokio runtime for try_block_on; using per-call ephemeral executor" + ); + block_on_ephemeral(future) } + /// Prefer [`try_block_on`] when the caller can surface bridge failures. pub fn block_on(&self, future: F) -> T where F: Future, { - self.runtime_ref().block_on(future) + if let Some(rt) = &self.inner { + return rt.block_on(future); + } + if let Some(rt) = fallback_runtime() { + self.mark_degraded(); + return rt.block_on(future); + } + if let Some(rt) = try_ephemeral_runtime() { + self.mark_degraded(); + return rt.block_on(future); + } + self.mark_degraded(); + log::error!("probing: CoreRuntime::block_on using per-call ephemeral executor"); + block_on_ephemeral(future).unwrap_or_else(|err| { + log::error!("probing: CoreRuntime::block_on failed: {err}"); + panic!("probing: async bridge unavailable: {err}"); + }) } } @@ -267,7 +318,7 @@ fn take_from_mutex_cell(cell: &Mutex>, context: &str) -> Option } } -fn block_on_ephemeral(future: F) -> T +fn block_on_ephemeral(future: F) -> Result where F: Future, { @@ -275,11 +326,8 @@ where .enable_all() .build() { - Ok(rt) => rt.block_on(future), - Err(e) => { - log::error!("failed to create ephemeral block_on runtime: {e}; using futures executor"); - futures::executor::block_on(future) - } + Ok(rt) => Ok(rt.block_on(future)), + Err(e) => block_on_failed(&format!("ephemeral runtime build failed: {e}")), } } @@ -294,7 +342,7 @@ where F: Future, { match take_from_mutex_cell(future_cell, "block_on recovery") { - Some(fut) => Ok(block_on_ephemeral(fut)), + Some(fut) => block_on_ephemeral(fut), None => block_on_failed("future missing during block_on recovery"), } } @@ -314,7 +362,13 @@ where log::error!("probing block_on worker: future missing from cell"); return; }; - let out = CORE_RUNTIME.block_on(fut); + let out = match CORE_RUNTIME.try_block_on(fut) { + Ok(v) => v, + Err(e) => { + log::error!("probing block_on worker: runtime unavailable: {e}"); + return; + } + }; let _ = tx.send(out); }; @@ -483,9 +537,10 @@ where } run_on_native_thread(move || { match std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { - CORE_RUNTIME.block_on(future) + CORE_RUNTIME.try_block_on(future) })) { - Ok(v) => Ok(v), + Ok(Ok(v)) => Ok(v), + Ok(Err(e)) => Err(e), Err(_) => { log::error!("probing block_on panicked on native thread"); CORE_RUNTIME.mark_degraded(); @@ -499,6 +554,14 @@ where mod tests { use super::*; + #[test] + fn try_block_on_completes_on_current_runtime() { + let value = CORE_RUNTIME + .try_block_on(async { 21 + 21 }) + .expect("runtime available in tests"); + assert_eq!(value, 42); + } + #[test] fn block_on_completes_on_current_runtime() { let value = block_on(async { 21 + 21 }).expect("runtime available in tests"); @@ -515,9 +578,8 @@ mod tests { #[test] fn native_bridge_serializes_calls() { - let a = run_on_native_bridge(|| 1); - let b = run_on_native_bridge(|| 2); - assert_eq!(a + b, 3); + run_on_native_bridge(|| ()); + run_on_native_bridge(|| ()); } #[test] diff --git a/probing/core/src/trace/span.rs b/probing/core/src/trace/span.rs index 1c9cda28..5d937172 100644 --- a/probing/core/src/trace/span.rs +++ b/probing/core/src/trace/span.rs @@ -26,7 +26,7 @@ fn current_thread_id() -> u64 { { use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; - let tid = thread::current().id(); + let tid = std::thread::current().id(); let mut h = DefaultHasher::new(); // ThreadId only implements Debug; convert to string and hash. format!("{:?}", tid).hash(&mut h); diff --git a/probing/crates/skills/Cargo.toml b/probing/crates/skills/Cargo.toml index 8b62753b..2d112b45 100644 --- a/probing/crates/skills/Cargo.toml +++ b/probing/crates/skills/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Diagnostic skill loader, interpreter, and runner (shared by CLI and Web)" +[features] +python-bridge = ["dep:pyo3"] + [dependencies] probing-proto = { path = "../../proto", default-features = false } anyhow = { workspace = true } @@ -13,6 +16,9 @@ serde = { workspace = true } serde_json = { workspace = true } serde_yaml = "0.9" async-trait = "0.1" +pyo3 = { version = "0.29.0", optional = true, default-features = false, features = [ + "macros", +] } [dev-dependencies] serde_yaml = "0.9" diff --git a/probing/crates/skills/src/interpret.rs b/probing/crates/skills/src/interpret.rs index 27ee840b..129b6dd0 100644 --- a/probing/crates/skills/src/interpret.rs +++ b/probing/crates/skills/src/interpret.rs @@ -62,9 +62,34 @@ fn expand_message( if let Some(step) = latest_step_value(steps) { msg = msg.replace("{latest_step}", &step); } + expand_step_column_placeholders(&mut msg, steps); msg } +/// Replace `{step_id.column}` and bare `{column}` placeholders from the first matching row. +pub fn expand_step_column_placeholders(msg: &mut String, steps: &[StepEvidence]) { + for ev in steps { + for col in &ev.dataframe.names { + let qualified = format!("{}.{}", ev.step_id, col); + if let Some(val) = cell_display_first(&ev.dataframe, col) { + *msg = msg.replace(&format!("{{{qualified}}}"), &val); + if msg.contains(&format!("{{{col}}}")) { + *msg = msg.replace(&format!("{{{col}}}"), &val); + } + } + } + } +} + +pub fn cell_display_first(df: &DataFrame, col: &str) -> Option { + let idx = df.names.iter().position(|n| n == col)?; + let col_data = &df.cols[idx]; + if col_data.is_empty() { + return None; + } + Some(ele_str(&col_data.get(0))) +} + fn step_by_id<'a>(steps: &'a [StepEvidence], id: &str) -> Option<&'a StepEvidence> { steps.iter().find(|s| s.step_id == id) } @@ -101,7 +126,7 @@ fn rule_matches(when: &str, steps: &[StepEvidence], params: &HashMap, - steps: &[StepEvidence], params: &HashMap, ) -> bool { if clause == "always" { @@ -123,7 +147,8 @@ fn eval_clause( return eval_rows_predicate(rest, ev.row_count, params); } if clause.contains("top(row)") { - return eval_top_vs_median(clause, steps); + let Some(ev) = step else { return false }; + return eval_top_vs_median(clause, ev); } false } @@ -178,6 +203,37 @@ fn eval_column_predicate(col_name: &str, tail: &str, ev: &StepEvidence) -> bool let threshold = rhs.trim().parse::().unwrap_or(0.0); return nums.first().copied().unwrap_or(0.0) > threshold; } + if let Some(rhs) = tail.strip_prefix("value <") { + let threshold = rhs.trim().parse::().unwrap_or(0.0); + return nums.first().copied().unwrap_or(0.0) < threshold; + } + if let Some(rhs) = tail.strip_prefix("value ==") { + let threshold = rhs.trim().parse::().unwrap_or(f64::NAN); + let value = nums.first().copied().unwrap_or(0.0); + return (value - threshold).abs() < f64::EPSILON; + } + if let Some(rest) = tail.strip_prefix("ratio(") { + if let Some((expr, pred)) = rest.split_once(')') { + let threshold = pred + .trim() + .strip_prefix('>') + .map(str::trim) + .and_then(|s| s.parse::().ok()) + .unwrap_or(0.0); + if let Some((num_col, den_col)) = expr.split_once('/') { + let num = column_f64(&ev.dataframe, num_col.trim()) + .first() + .copied() + .unwrap_or(0.0); + let den = column_f64(&ev.dataframe, den_col.trim()) + .first() + .copied() + .unwrap_or(0.0); + let ratio = if den <= 0.0 { 0.0 } else { num / den }; + return ratio > threshold; + } + } + } if tail.starts_with("last >") { if let Some(rhs) = tail.strip_prefix("last >") { let rhs = rhs.trim(); @@ -206,26 +262,40 @@ fn eval_column_predicate(col_name: &str, tail: &str, ev: &StepEvidence) -> bool false } -fn eval_top_vs_median(clause: &str, steps: &[StepEvidence]) -> bool { - // step:rank_latency | rows >= 2 | top(row).avg_ms > 2 * median(avg_ms) - let parts: Vec<&str> = clause.split('|').map(|p| p.trim()).collect(); - let step_id = parts - .first() - .and_then(|p| p.strip_prefix("step:")) - .unwrap_or("rank_latency"); - let Some(ev) = step_by_id(steps, step_id) else { - return false; - }; +fn eval_top_vs_median(clause: &str, ev: &StepEvidence) -> bool { + // top(row).avg_ms > 2 * median(avg_ms) + // top(row).worst_fraction > 2 * median(worst_fraction) if ev.row_count < 2 { return false; } - let vals = column_f64(&ev.dataframe, "avg_ms"); + let (col, factor) = parse_top_median_clause(clause); + let vals = column_f64(&ev.dataframe, col); if vals.is_empty() { return false; } let top = vals.iter().copied().fold(f64::NAN, f64::max); let med = median(&vals); - top > 2.0 * med + top > factor * med +} + +fn parse_top_median_clause(clause: &str) -> (&str, f64) { + let mut col = "avg_ms"; + let mut factor = 2.0; + if let Some(top_part) = clause.split('|').find(|p| p.contains("top(row)")) { + if let Some(rest) = top_part.strip_prefix("top(row).") { + if let Some((col_name, rhs)) = rest.split_once(" > ") { + col = col_name.trim(); + if let Some((f_str, med_part)) = rhs.split_once(" * median(") { + factor = f_str.trim().parse().unwrap_or(2.0); + let med_col = med_part.trim_end_matches(')').trim(); + if !med_col.is_empty() { + col = med_col; + } + } + } + } + } + (col, factor) } fn column_f64(df: &DataFrame, name: &str) -> Vec { @@ -364,6 +434,44 @@ mod tests { assert_eq!(findings.len(), 1); } + #[test] + fn value_eq_zero_rule() { + let rules = vec![InterpretRule { + id: "shadow_off".into(), + when: "step:torch_probe_overhead | column:shadow_baseline | value == 0".into(), + severity: "info".into(), + message: "shadow off".into(), + }]; + let steps = vec![StepEvidence { + step_id: "torch_probe_overhead".into(), + row_count: 1, + dataframe: df_one_col("shadow_baseline", vec![0.0]), + }]; + let findings = evaluate_rules(&rules, &steps, &HashMap::new()); + assert_eq!(findings.len(), 1); + } + + #[test] + fn ratio_rule() { + let rules = vec![InterpretRule { + id: "many_slow".into(), + when: "step:job_slowdown_proxy | column:slow_steps | ratio(slow_steps/steps_in_window) > 0.3" + .into(), + severity: "warning".into(), + message: "slow".into(), + }]; + let steps = vec![StepEvidence { + step_id: "job_slowdown_proxy".into(), + row_count: 1, + dataframe: DataFrame::new( + vec!["slow_steps".into(), "steps_in_window".into()], + vec![Seq::SeqF64(vec![4.0]), Seq::SeqF64(vec![10.0])], + ), + }]; + let findings = evaluate_rules(&rules, &steps, &HashMap::new()); + assert_eq!(findings.len(), 1); + } + #[test] fn max_min_ratio_rule() { let rules = vec![InterpretRule { @@ -381,6 +489,24 @@ mod tests { assert_eq!(findings.len(), 1); } + #[test] + fn top_vs_median_worst_fraction() { + let rules = vec![InterpretRule { + id: "dominant".into(), + when: "step:worst_fraction | rows >= 2 | top(row).worst_fraction > 2 * median(worst_fraction)" + .into(), + severity: "info".into(), + message: "dominant".into(), + }]; + let steps = vec![StepEvidence { + step_id: "worst_fraction".into(), + row_count: 3, + dataframe: df_one_col("worst_fraction", vec![0.1, 0.15, 0.6]), + }]; + let findings = evaluate_rules(&rules, &steps, &HashMap::new()); + assert_eq!(findings.len(), 1); + } + #[test] fn interpret_rules_match_fixture() { let fixture_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) diff --git a/probing/crates/skills/src/lib.rs b/probing/crates/skills/src/lib.rs index e46cbe17..48b99d3e 100644 --- a/probing/crates/skills/src/lib.rs +++ b/probing/crates/skills/src/lib.rs @@ -9,6 +9,9 @@ pub mod loader; pub mod routing; pub mod runner; +#[cfg(feature = "python-bridge")] +pub mod pyo3; + pub use api::{ catalog_json, catalog_to_json, list_skills_json, load_skill_json, routing_json, skill_from_api, skill_to_json, @@ -24,5 +27,6 @@ pub use routing::{ match_intent_routes, match_routed_skills, match_skills, IntentRoute, SkillRoute, }; pub use runner::{ - execute_skill, plan_skill, resolve_use_global, run_step, RunOptions, RunResult, StepOutcome, + build_summary, cluster_integrity_findings, execute_skill, plan_skill, resolve_use_global, + run_step, RunOptions, RunResult, StepOutcome, }; diff --git a/probing/extensions/python/src/features/skills_api.rs b/probing/crates/skills/src/pyo3.rs similarity index 71% rename from probing/extensions/python/src/features/skills_api.rs rename to probing/crates/skills/src/pyo3.rs index 43c4dc45..6520d974 100644 --- a/probing/extensions/python/src/features/skills_api.rs +++ b/probing/crates/skills/src/pyo3.rs @@ -1,14 +1,16 @@ -//! Python-facing skill discovery APIs (``probing._core.skills_*``). +//! PyO3 bindings for skill discovery (wheel / `_core` module — not L2 collector). use pyo3::exceptions::PyRuntimeError; use pyo3::prelude::*; -use probing_skills::api; -use probing_skills::catalog::{load_intents, load_pages}; -use probing_skills::routing::match_skills; -use probing_skills::runner::plan_skill; +use crate::api; +use crate::catalog::{load_intents, load_pages}; +use crate::routing::match_skills; +use crate::runner::plan_skill; -use crate::features::py_result::runtime_err; +fn runtime_err(err: serde_json::Error) -> PyErr { + PyRuntimeError::new_err(err.to_string()) +} #[pyfunction] pub fn skills_intents() -> PyResult { @@ -75,3 +77,16 @@ fn json_scalar_to_string(value: &serde_json::Value) -> String { other => other.to_string(), } } + +/// Register `skills_*` callables on the probing `_core` module. +pub fn register_skills_bindings(m: &Bound<'_, PyModule>) -> PyResult<()> { + m.add_function(wrap_pyfunction!(skills_load, m)?)?; + m.add_function(wrap_pyfunction!(skills_catalog, m)?)?; + m.add_function(wrap_pyfunction!(skills_routing, m)?)?; + m.add_function(wrap_pyfunction!(skills_list, m)?)?; + m.add_function(wrap_pyfunction!(skills_plan, m)?)?; + m.add_function(wrap_pyfunction!(skills_match, m)?)?; + m.add_function(wrap_pyfunction!(skills_intents, m)?)?; + m.add_function(wrap_pyfunction!(skills_pages, m)?)?; + Ok(()) +} diff --git a/probing/crates/skills/src/runner.rs b/probing/crates/skills/src/runner.rs index 51dfa8a7..943243c2 100644 --- a/probing/crates/skills/src/runner.rs +++ b/probing/crates/skills/src/runner.rs @@ -183,18 +183,7 @@ pub async fn execute_skill_pb( let mut findings = evaluate_rules(&pb.interpretation, &evidence, &ctx); findings.extend(cluster_integrity_findings(&outcomes)); - let mut summary_ctx = ctx.clone(); - for ev in &evidence { - summary_ctx.insert( - format!("{}.row_count", ev.step_id), - ev.row_count.to_string(), - ); - } - let summary = if pb.summary_template.is_empty() { - String::new() - } else { - expand_template(&pb.summary_template, &summary_ctx) - }; + let summary = build_summary(&pb, &evidence, &ctx); let had_error = outcomes .iter() @@ -386,11 +375,21 @@ async fn run_sql_step(backend: &B, step: &SkillStep, sql: &str) async fn run_api_step(backend: &B, step: &SkillStep) -> StepOutcome { let path = step.path.clone().unwrap_or_default(); match backend.get(&path).await { - Ok(body) => StepOutcome::ApiText { - step_id: step.id.clone(), - title: step.title.clone(), - text: body, - }, + Ok(body) => { + if body.trim().is_empty() && step.on_empty == "warn" { + StepOutcome::ApiText { + step_id: step.id.clone(), + title: step.title.clone(), + text: "(empty response — step may be unavailable)".to_string(), + } + } else { + StepOutcome::ApiText { + step_id: step.id.clone(), + title: step.title.clone(), + text: body, + } + } + } Err(e) => StepOutcome::Error { step_id: step.id.clone(), title: step.title.clone(), @@ -415,7 +414,32 @@ fn outcome_to_evidence(outcome: &StepOutcome) -> Option { } } -fn cluster_integrity_findings(outcomes: &[StepOutcome]) -> Vec { +pub fn build_summary( + skill: &Skill, + evidence: &[StepEvidence], + ctx: &HashMap, +) -> String { + if skill.summary_template.is_empty() { + return String::new(); + } + let mut summary_ctx = ctx.clone(); + for ev in evidence { + summary_ctx.insert( + format!("{}.row_count", ev.step_id), + ev.row_count.to_string(), + ); + for col in &ev.dataframe.names { + let key = format!("{}.{}", ev.step_id, col); + if let Some(val) = crate::interpret::cell_display_first(&ev.dataframe, col) { + summary_ctx.insert(key, val); + } + } + } + expand_template(&skill.summary_template, &summary_ctx) +} + +/// Surface incomplete cluster fan-out as an explicit finding (shared by CLI and Web). +pub fn cluster_integrity_findings(outcomes: &[StepOutcome]) -> Vec { let mut findings = Vec::new(); for outcome in outcomes { let StepOutcome::Sql { diff --git a/probing/extensions/cc/src/extensions/cpu/collector.rs b/probing/extensions/cc/src/extensions/cpu/collector.rs index 214fa9e7..8fa4a976 100644 --- a/probing/extensions/cc/src/extensions/cpu/collector.rs +++ b/probing/extensions/cc/src/extensions/cpu/collector.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::panic::{catch_unwind, AssertUnwindSafe}; use std::sync::{ atomic::{AtomicBool, Ordering}, Arc, Mutex, MutexGuard, @@ -326,112 +327,120 @@ impl CpuCollector { let running = self.running.clone(); let tables = self.shared_tables()?; let handle = thread::spawn(move || { - let sampler = host_sampler(); - let platform = sampler.platform().to_string(); + let panicked = catch_unwind(AssertUnwindSafe(|| { + let sampler = host_sampler(); + let platform = sampler.platform().to_string(); - let mut state = SampleState::new(); - let mut iterations = config.iterations; + let mut state = SampleState::new(); + let mut iterations = config.iterations; - while running.load(Ordering::SeqCst) { - if let Some(iter) = iterations.as_mut() { - if *iter <= 0 { - break; + while running.load(Ordering::SeqCst) { + if let Some(iter) = iterations.as_mut() { + if *iter <= 0 { + break; + } + *iter -= 1; } - *iter -= 1; - } - - let now = Instant::now(); - let wall_ns = now.duration_since(state.last_wall).as_nanos() as u64; - let ts = ts_micros(); - match sampler.sample_process() { - Ok(curr) => { - if let Some(prev) = &state.last_process { - if wall_ns > 0 { - let delta_user = - curr.cputime_user_ns.saturating_sub(prev.cputime_user_ns); - let delta_sys = - curr.cputime_sys_ns.saturating_sub(prev.cputime_sys_ns); - let delta_vol = curr.vol_ctxt.saturating_sub(prev.vol_ctxt) as i64; - let delta_invol = - curr.invol_ctxt.saturating_sub(prev.invol_ctxt) as i64; - push_utilization_row( - &mut lock_cpu_table(&tables.utilization), - ts, - &platform, - "process", - 0, - "", - wall_ns, - delta_user, - delta_sys, - curr.cputime_user_ns as i64, - curr.cputime_sys_ns as i64, - (curr.rss_bytes / 1024) as i64, - curr.thread_count as i32, - delta_vol, - delta_invol, - "", - "", - ); + let now = Instant::now(); + let wall_ns = now.duration_since(state.last_wall).as_nanos() as u64; + let ts = ts_micros(); + + match sampler.sample_process() { + Ok(curr) => { + if let Some(prev) = &state.last_process { + if wall_ns > 0 { + let delta_user = + curr.cputime_user_ns.saturating_sub(prev.cputime_user_ns); + let delta_sys = + curr.cputime_sys_ns.saturating_sub(prev.cputime_sys_ns); + let delta_vol = + curr.vol_ctxt.saturating_sub(prev.vol_ctxt) as i64; + let delta_invol = + curr.invol_ctxt.saturating_sub(prev.invol_ctxt) as i64; + push_utilization_row( + &mut lock_cpu_table(&tables.utilization), + ts, + &platform, + "process", + 0, + "", + wall_ns, + delta_user, + delta_sys, + curr.cputime_user_ns as i64, + curr.cputime_sys_ns as i64, + (curr.rss_bytes / 1024) as i64, + curr.thread_count as i32, + delta_vol, + delta_invol, + "", + "", + ); + } } + state.last_process = Some(curr); } - state.last_process = Some(curr); + Err(e) => log::warn!("cpu process sample failed: {e}"), } - Err(e) => log::warn!("cpu process sample failed: {e}"), - } - match sampler.sample_threads(config.thread_top_n) { - Ok(threads) => { - if wall_ns > 0 { - for thread in &threads { - let prev = state.last_threads.get(&thread.tid); - let delta_user = thread - .cputime_user_ns - .saturating_sub(prev.map(|p| p.cputime_user_ns).unwrap_or(0)); - let delta_sys = thread - .cputime_sys_ns - .saturating_sub(prev.map(|p| p.cputime_sys_ns).unwrap_or(0)); - - push_utilization_row( - &mut lock_cpu_table(&tables.utilization), - ts, - &platform, - "thread", - thread.tid, - &thread.comm, - wall_ns, - delta_user, - delta_sys, - thread.cputime_user_ns as i64, - thread.cputime_sys_ns as i64, - 0, - 0, - 0, - 0, - thread.state.as_deref().unwrap_or(""), - thread.wchan.as_deref().unwrap_or(""), - ); - push_tasks_row( - &mut lock_cpu_table(&tables.tasks), - ts, - &platform, - thread, - wall_ns, - delta_user, - delta_sys, - ); + match sampler.sample_threads(config.thread_top_n) { + Ok(threads) => { + if wall_ns > 0 { + for thread in &threads { + let prev = state.last_threads.get(&thread.tid); + let delta_user = thread.cputime_user_ns.saturating_sub( + prev.map(|p| p.cputime_user_ns).unwrap_or(0), + ); + let delta_sys = thread.cputime_sys_ns.saturating_sub( + prev.map(|p| p.cputime_sys_ns).unwrap_or(0), + ); + + push_utilization_row( + &mut lock_cpu_table(&tables.utilization), + ts, + &platform, + "thread", + thread.tid, + &thread.comm, + wall_ns, + delta_user, + delta_sys, + thread.cputime_user_ns as i64, + thread.cputime_sys_ns as i64, + 0, + 0, + 0, + 0, + thread.state.as_deref().unwrap_or(""), + thread.wchan.as_deref().unwrap_or(""), + ); + push_tasks_row( + &mut lock_cpu_table(&tables.tasks), + ts, + &platform, + thread, + wall_ns, + delta_user, + delta_sys, + ); + } } + state.last_threads = threads.into_iter().map(|t| (t.tid, t)).collect(); } - state.last_threads = threads.into_iter().map(|t| (t.tid, t)).collect(); + Err(e) => log::warn!("cpu thread sample failed: {e}"), } - Err(e) => log::warn!("cpu thread sample failed: {e}"), - } - state.last_wall = now; - thread::sleep(config.interval); + state.last_wall = now; + thread::sleep(config.interval); + } + })) + .is_err(); + if panicked { + log::error!("cpu collector thread panicked"); + } else { + log::warn!("cpu collector thread exited"); } - running.store(false, Ordering::SeqCst); }); diff --git a/probing/extensions/gpu/Cargo.toml b/probing/extensions/gpu/Cargo.toml index f74ac89d..6a9a441a 100644 --- a/probing/extensions/gpu/Cargo.toml +++ b/probing/extensions/gpu/Cargo.toml @@ -18,7 +18,7 @@ probing-memtable = { path = "../../memtable" } anyhow = { workspace = true } async-trait = "0.1.83" -datafusion = { workspace = true } +arrow = { workspace = true } log = { workspace = true } once_cell = { workspace = true } thiserror = { workspace = true } diff --git a/probing/extensions/gpu/src/extensions/collector.rs b/probing/extensions/gpu/src/extensions/collector.rs index fc2b5dae..42125780 100644 --- a/probing/extensions/gpu/src/extensions/collector.rs +++ b/probing/extensions/gpu/src/extensions/collector.rs @@ -1,3 +1,4 @@ +use std::panic::{catch_unwind, AssertUnwindSafe}; use std::sync::{ atomic::{AtomicBool, Ordering}, Arc, Mutex, MutexGuard, @@ -254,26 +255,34 @@ impl GpuCollector { let table = self.shared_table()?; let handle = thread::spawn(move || { - let mut iterations = config.iterations; - while running.load(Ordering::SeqCst) { - if let Some(iter) = iterations.as_mut() { - if *iter <= 0 { - break; + let panicked = catch_unwind(AssertUnwindSafe(|| { + let mut iterations = config.iterations; + while running.load(Ordering::SeqCst) { + if let Some(iter) = iterations.as_mut() { + if *iter <= 0 { + break; + } + *iter -= 1; } - *iter -= 1; - } - let wall_start = Instant::now(); - let ts = ts_micros(); - let samples = sample_all(&backends); - let wall_ns = wall_start.elapsed().as_nanos() as u64; + let wall_start = Instant::now(); + let ts = ts_micros(); + let samples = sample_all(&backends); + let wall_ns = wall_start.elapsed().as_nanos() as u64; - let mut exposed = lock_gpu_table(&table); - for sample in &samples { - push_utilization_row(&mut exposed, ts, wall_ns, sample); - } + let mut exposed = lock_gpu_table(&table); + for sample in &samples { + push_utilization_row(&mut exposed, ts, wall_ns, sample); + } - thread::sleep(config.interval); + thread::sleep(config.interval); + } + })) + .is_err(); + if panicked { + log::error!("gpu collector thread panicked"); + } else { + log::warn!("gpu collector thread exited"); } running.store(false, Ordering::SeqCst); }); @@ -281,6 +290,21 @@ impl GpuCollector { *lock_gpu_collector(&self.handle) = Some(handle); Ok(()) } + + #[cfg_attr(not(test), allow(dead_code))] + pub fn stop(&self) -> Result<(), CollectorError> { + if !self.running.swap(false, Ordering::SeqCst) { + return Ok(()); + } + + if let Some(handle) = lock_gpu_collector(&self.handle).take() { + handle + .join() + .map_err(|_| CollectorError::StopFailed("thread join failed".into()))?; + } + + Ok(()) + } } /// Cached device list for the `gpu.devices` table and diagnostics. @@ -349,4 +373,33 @@ mod tests { clear_gpu_env(); assert!(autostart_interval_ms().is_none()); } + + #[test] + fn stop_is_idempotent_when_not_running() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); + let collector = GpuCollector::instance(); + let _ = collector.stop(); + collector.stop().expect("stop when idle"); + } + + #[test] + fn collector_stop_after_bounded_iterations() { + let _guard = ENV_TEST_LOCK.lock().unwrap(); + let collector = GpuCollector::instance(); + let _ = collector.stop(); + + if discover_backends().is_empty() { + return; + } + + collector + .start(GpuCollectorConfig { + interval: Duration::from_millis(1), + iterations: Some(5), + }) + .expect("start collector"); + + std::thread::sleep(Duration::from_millis(50)); + collector.stop().expect("stop collector"); + } } diff --git a/probing/extensions/gpu/src/extensions/devices.rs b/probing/extensions/gpu/src/extensions/devices.rs index 5643c781..ace465e4 100644 --- a/probing/extensions/gpu/src/extensions/devices.rs +++ b/probing/extensions/gpu/src/extensions/devices.rs @@ -1,8 +1,8 @@ use std::sync::Arc; -use datafusion::arrow::array::{Int32Array, Int64Array, StringArray}; -use datafusion::arrow::datatypes::{DataType, Field, Schema, SchemaRef}; -use datafusion::arrow::record_batch::RecordBatch; +use arrow::array::{Int32Array, Int64Array, StringArray}; +use arrow::datatypes::{DataType, Field, Schema, SchemaRef}; +use arrow::record_batch::RecordBatch; use probing_core::core::{CustomTable, TableProbeDataSource}; diff --git a/probing/extensions/python/Cargo.toml b/probing/extensions/python/Cargo.toml index b0c28831..3e12183d 100644 --- a/probing/extensions/python/Cargo.toml +++ b/probing/extensions/python/Cargo.toml @@ -17,8 +17,6 @@ probing-core = { path = "../../core", features = ["python-bridge"] } probing-memtable = { path = "../../memtable" } probing-proto = { path = "../../proto" } probing-store = { path = "../../crates/store" } -probing-cli = { path = "../../cli" } -probing-skills = { path = "../../crates/skills" } anyhow = { workspace = true } thiserror = { workspace = true } diff --git a/probing/extensions/python/src/extensions/python.rs b/probing/extensions/python/src/extensions/python.rs index 82c52fe1..21e9de81 100644 --- a/probing/extensions/python/src/extensions/python.rs +++ b/probing/extensions/python/src/extensions/python.rs @@ -87,7 +87,7 @@ impl ProbeExtensionCall for PythonExt { return crate::features::crash::handle_http(normalized_path, params, body) .map_err(EngineError::plugin); } - call_python_handler(normalized_path, params, body) + call_python_handler(normalized_path, params, body).await } } @@ -277,7 +277,10 @@ fn backtrace(tid: Option) -> anyhow::Result> { } /// Call Python handler through the router system. -fn call_python_handler( +/// +/// Runs on Tokio's blocking thread pool so the async HTTP/MCP worker is not +/// held while the handler acquires the GIL and executes Python. +async fn call_python_handler( path: &str, params: &HashMap, body: &[u8], @@ -285,6 +288,16 @@ fn call_python_handler( let path = path.to_string(); let params = params.clone(); let body = body.to_vec(); + tokio::task::spawn_blocking(move || call_python_handler_blocking(path, params, body)) + .await + .map_err(|e| EngineError::plugin(format!("python handler task join failed: {e}")))? +} + +fn call_python_handler_blocking( + path: String, + params: HashMap, + body: Vec, +) -> EngineResult> { run_on_native_thread(move || { Python::attach(|py| { let router_module = py diff --git a/probing/extensions/python/src/extensions/python/exttbls.rs b/probing/extensions/python/src/extensions/python/exttbls.rs index 746bcad9..79ce8f43 100644 --- a/probing/extensions/python/src/extensions/python/exttbls.rs +++ b/probing/extensions/python/src/extensions/python/exttbls.rs @@ -17,7 +17,6 @@ use std::sync::{Arc, Mutex, MutexGuard}; use crate::features::native_bridge::with_detached_native; use once_cell::sync::Lazy; -use probing_core::runtime::{BlockOnFallback, RuntimeError}; use probing_core::sync::lock_mutex; use probing_memtable::discover::ExposedTable; use probing_memtable::docs; @@ -112,7 +111,10 @@ const MIN_CHUNK_BYTES: usize = 4 * 1024; const MAX_CHUNK_BYTES: usize = 8 * 1024 * 1024; fn value_to_object(py: Python, v: &Ele) -> Py { - ele_to_python(py, v).unwrap_or_else(|_| py.None()) + ele_to_python(py, v).unwrap_or_else(|e| { + log::warn!("ExternalTable: failed to convert cell to Python ({e})"); + py.None() + }) } fn now_micros() -> i64 { @@ -311,15 +313,9 @@ impl ExternBacking { Ok(()) } - fn row_count(&self) -> usize { - self.table.as_ref().map_or(0, |t| { - let view = t.view(); - (0..view.num_chunks()).map(|c| view.num_rows(c)).sum() - }) - } - fn ensure_table(&mut self, first_row: &[Ele]) -> Result<(), ExternTableError> { - if self.table.is_some() && self.row_count() > 0 { + let dtypes: Vec = first_row.iter().map(ele_dtype).collect(); + if self.table.is_some() && self.dtypes == dtypes { return Ok(()); } self.table = None; @@ -453,13 +449,6 @@ fn require_backing( .ok_or_else(|| pyo3::exceptions::PyRuntimeError::new_err(BRIDGE_DEGRADED_MSG)) } -impl BlockOnFallback for ExternalTable { - fn on_block_on_failure(err: RuntimeError) -> Self { - log::error!("ExternalTable bridge degraded: {err}; table unusable"); - ExternalTable(None, 0) - } -} - impl ExternalTable { fn extract_eles(values: Vec>) -> PyResult> { Python::attach(|py| { @@ -477,7 +466,7 @@ impl ExternalTable { discard_strategy: &str, table_doc: Option, column_docs: HashMap, - ) -> Arc> { + ) -> PyResult>> { let capacity = ring_capacity_bytes(discard_threshold, discard_strategy); let backing = Arc::new(Mutex::new(ExternBacking::new( name, @@ -488,10 +477,8 @@ impl ExternalTable { ))); lock_backing(backing.as_ref()) .ensure_registered() - .unwrap_or_else(|e| { - log::error!("failed to register extern table for SQL catalog: {e}"); - }); - backing + .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?; + Ok(backing) } } @@ -507,7 +494,7 @@ impl ExternalTable { discard_strategy: String, table_doc: Option, column_docs: Option>, - ) -> Self { + ) -> PyResult { let _ = chunk_size; // ring chunking is byte-based; kept for API compat let name = name.to_string(); with_detached_native(move || { @@ -519,9 +506,9 @@ impl ExternalTable { &discard_strategy, table_doc, column_docs.unwrap_or_default(), - ); + )?; lock_extern_tables().insert(name, backing.clone()); - ExternalTable(Some(backing), ncolumn) + Ok(ExternalTable(Some(backing), ncolumn)) }) } @@ -570,7 +557,7 @@ impl ExternalTable { &discard_strategy, table_doc, column_docs.unwrap_or_default(), - ); + )?; binding.insert(name, backing.clone()); Ok(ExternalTable(Some(backing), ncolumn)) } @@ -773,7 +760,8 @@ if not hasattr(probing, "_made_{name}"): "BaseMemorySize".to_string(), None, None, - ); + ) + .unwrap(); assert_eq!(table.names().unwrap(), vec!["a", "b"]); } @@ -793,7 +781,8 @@ if not hasattr(probing, "_made_{name}"): "BaseMemorySize".to_string(), None, None, - ); + ) + .unwrap(); let binding = lock_extern_tables(); let backing = binding.get(&name).expect("backing"); let guard = lock_backing(backing.as_ref()); @@ -856,7 +845,8 @@ probing.ExternalTable.drop("table_to_drop") "BaseMemorySize".to_string(), None, None, - ); + ) + .unwrap(); Python::attach(|py| { let vals: Vec> = vec![ 1i64.into_pyobject(py).unwrap().into_any().unbind(), @@ -885,7 +875,8 @@ probing.ExternalTable.drop("table_to_drop") "BaseMemorySize".to_string(), None, None, - ); + ) + .unwrap(); Python::attach(|py| { let vals: Vec> = vec![1i64.into_pyobject(py).unwrap().into_any().unbind()]; nccl.append(vals).unwrap(); diff --git a/probing/extensions/python/src/extensions/python/tbls.rs b/probing/extensions/python/src/extensions/python/tbls.rs index b42f2352..ed243c96 100644 --- a/probing/extensions/python/src/extensions/python/tbls.rs +++ b/probing/extensions/python/src/extensions/python/tbls.rs @@ -48,6 +48,32 @@ fn try_record_batch(schema: SchemaRef, columns: Vec) -> TableResult`). +fn error_batch(message: &str) -> Vec { + let schema = SchemaRef::new(Schema::new(vec![Field::new( + "_error", + DataType::Utf8, + false, + )])); + match RecordBatch::try_new( + schema.clone(), + vec![Arc::new(StringArray::from(vec![message]))], + ) { + Ok(batch) => vec![batch], + Err(e) => { + error!("failed to build python namespace error batch: {e}"); + const FALLBACK: &str = "python namespace error"; + match RecordBatch::try_new(schema, vec![Arc::new(StringArray::from(vec![FALLBACK]))]) { + Ok(batch) => vec![batch], + Err(e2) => { + error!("failed to build fallback error batch: {e2}"); + vec![] + } + } + } + } +} + #[derive(Default, Debug)] pub struct PythonNamespace {} @@ -203,23 +229,25 @@ impl CustomNamespace for PythonNamespace { if crate::features::stack_tracer::is_backtrace_busy(source) => { debug!("python.backtrace skipped: {source}"); - vec![] + error_batch("callstack capture busy") } Err(e) => { error!("Error getting backtrace data: {e:?}"); - vec![] + error_batch(&e.to_string()) } } } else if !expr.contains('.') { // Extern mmap tables (`comm_collective`, `torch_trace`, …) — not Python imports. debug!("python.{expr}: no live data (mmap empty or not created yet)"); - vec![] + error_batch(&format!( + "python.{expr}: no live data (mmap empty or not created yet)" + )) } else { match Self::data_from_python(expr) { Ok(batches) => batches, Err(e) => { - debug!("Python dynamic expr {expr}: {e:?}"); - vec![] + error!("Python dynamic expr {expr}: {e:?}"); + error_batch(&e.to_string()) } } } @@ -419,4 +447,27 @@ mod tests { assert!(parts3.is_empty()); } + + #[test] + fn test_error_batch_surfaces_message_in_sql_column() { + let batches = error_batch("backtrace capture failed"); + assert_eq!(batches.len(), 1); + let batch = &batches[0]; + assert_eq!(batch.num_rows(), 1); + assert_eq!(batch.schema().field(0).name(), "_error"); + let col = batch + .column(0) + .as_any() + .downcast_ref::() + .expect("utf8 column"); + assert_eq!(col.value(0), "backtrace capture failed"); + } + + #[test] + fn test_python_namespace_data_returns_error_batch_on_invalid_expr() { + pyo3::Python::initialize(); + let batches = PythonNamespace::data("not_a_valid..expression"); + assert_eq!(batches.len(), 1); + assert_eq!(batches[0].schema().field(0).name(), "_error"); + } } diff --git a/probing/extensions/python/src/features/crash/memory_snapshot.rs b/probing/extensions/python/src/features/crash/memory_snapshot.rs index ea1f080c..c7e54bab 100644 --- a/probing/extensions/python/src/features/crash/memory_snapshot.rs +++ b/probing/extensions/python/src/features/crash/memory_snapshot.rs @@ -40,7 +40,12 @@ impl MemorySnapshot { ..Default::default() }; match block_on(fetch_table_hints()) { - Ok(Ok(hints)) => snap.merge_table_hints(hints), + Ok(Ok((hints, partial_unavailable))) => { + snap.merge_table_hints(hints); + if partial_unavailable { + snap.table_hints_unavailable = true; + } + } Ok(Err(e)) => { log::warn!("memory snapshot: table hints query failed: {e}"); snap.table_hints_unavailable = true; @@ -77,45 +82,64 @@ struct TableMemoryHints { gpu_devices: Vec, } -async fn fetch_table_hints() -> Result { +async fn fetch_table_hints() -> Result<(TableMemoryHints, bool), probing_core::runtime::RuntimeError> +{ let engine = ENGINE.read().await; let mut hints = TableMemoryHints { sampled_rss_kb: -1, torch_allocated_bytes: -1, gpu_devices: Vec::new(), }; + let mut unavailable = false; - if let Ok(Some(df)) = engine + match engine .async_query( "SELECT rss_kb FROM cpu.utilization \ WHERE scope = 'process' ORDER BY ts DESC LIMIT 1", ) .await { - hints.sampled_rss_kb = col_i64_first(&df, "rss_kb").unwrap_or(-1); + Ok(Some(df)) => hints.sampled_rss_kb = col_i64_first(&df, "rss_kb").unwrap_or(-1), + Ok(None) => unavailable = true, + Err(e) => { + log::warn!("memory snapshot: cpu.utilization query failed: {e}"); + unavailable = true; + } } - if let Ok(Some(df)) = engine + match engine .async_query( "SELECT device_id, name, used_bytes, total_bytes, mem_used_pct \ FROM gpu.utilization ORDER BY ts DESC LIMIT 32", ) .await { - hints.gpu_devices = latest_gpu_devices(&df); + Ok(Some(df)) => hints.gpu_devices = latest_gpu_devices(&df), + Ok(None) => unavailable = true, + Err(e) => { + log::warn!("memory snapshot: gpu.utilization query failed: {e}"); + unavailable = true; + } } - if let Ok(Some(df)) = engine + match engine .async_query( "SELECT max(allocated) AS torch_allocated FROM python.torch_trace \ WHERE allocated IS NOT NULL", ) .await { - hints.torch_allocated_bytes = col_i64_first(&df, "torch_allocated").unwrap_or(-1); + Ok(Some(df)) => { + hints.torch_allocated_bytes = col_i64_first(&df, "torch_allocated").unwrap_or(-1) + } + Ok(None) => unavailable = true, + Err(e) => { + log::warn!("memory snapshot: python.torch_trace query failed: {e}"); + unavailable = true; + } } - Ok(hints) + Ok((hints, unavailable)) } fn latest_gpu_devices(df: &DataFrame) -> Vec { diff --git a/probing/extensions/python/src/features/mod.rs b/probing/extensions/python/src/features/mod.rs index 097e6397..6d6db424 100644 --- a/probing/extensions/python/src/features/mod.rs +++ b/probing/extensions/python/src/features/mod.rs @@ -7,7 +7,6 @@ pub mod native_bridge; pub mod pprof; pub mod py_result; pub mod python_api; -pub mod skills_api; pub mod spy; /// Native stack capture, Python/native merge, and signal handling (`SIGUSR2`). pub mod stack_tracer; diff --git a/probing/extensions/python/src/features/python_api.rs b/probing/extensions/python/src/features/python_api.rs index 5b4dd3a8..beed4e5d 100644 --- a/probing/extensions/python/src/features/python_api.rs +++ b/probing/extensions/python/src/features/python_api.rs @@ -1,10 +1,8 @@ use std::panic::{catch_unwind, AssertUnwindSafe}; -use pyo3::prelude::*; - -use probing_cli::cli_main as cli_main_impl; use probing_core::runtime::block_on; use probing_core::ENGINE; +use pyo3::prelude::*; use crate::features::native_bridge::with_detached_native; use crate::features::py_result::runtime_err; @@ -32,15 +30,15 @@ pub fn is_enabled() -> bool { #[pyfunction] pub fn query_json(_py: Python, sql: String) -> PyResult { with_detached_native(move || { - let df = block_on(async move { ENGINE.read().await.async_query(sql.as_str()).await }) - .map_err(runtime_err)? - .map_err(runtime_err)? - .ok_or_else(|| { - pyo3::exceptions::PyRuntimeError::new_err( - "query returned no dataframe (engine unavailable or empty response)", - ) - })?; - serde_json::to_string(&df).map_err(runtime_err) + let bridge = block_on(async move { ENGINE.read().await.async_query(sql.as_str()).await }) + .map_err(|e| runtime_err(format!("probing runtime unavailable: {e}")))?; + match bridge { + Ok(Some(df)) => serde_json::to_string(&df).map_err(runtime_err), + Ok(None) => Err(pyo3::exceptions::PyRuntimeError::new_err( + "query returned nil (no tabular result; e.g. SET or non-SELECT)", + )), + Err(e) => Err(runtime_err(format!("engine SQL failed: {e}"))), + } }) } @@ -79,17 +77,3 @@ pub fn api_eval(code: &str) -> PyResult { Err(_) => Ok(serde_json::json!({"error": "REPL execution panicked"}).to_string()), } } - -#[pyfunction] -pub fn cli_main(py: Python, args: Vec) -> PyResult<()> { - // Skill install/update shells out to ``python -m probing.skills`` — use this interpreter. - if let Ok(exe) = py.import("sys")?.getattr("executable")?.extract::() { - std::env::set_var("PROBING_PYTHON", exe); - } - if let Err(e) = cli_main_impl(args) { - return Err(PyErr::new::( - e.to_string(), - )); - } - Ok(()) -} diff --git a/probing/extensions/python/src/features/torch.rs b/probing/extensions/python/src/features/torch.rs index 4010e50d..cb972502 100644 --- a/probing/extensions/python/src/features/torch.rs +++ b/probing/extensions/python/src/features/torch.rs @@ -324,7 +324,7 @@ fn query_profiling_impl(query: &str) -> Result .async_query(&query) .await .context("Torch query failed")?; - Ok(result.unwrap_or_default()) + result.ok_or_else(|| anyhow::anyhow!("engine returned no dataframe for torch query")) }) .map_err(anyhow::Error::new)? } @@ -352,9 +352,8 @@ fn run_torch_query(query: &str) -> Result { .enable_all() .build() .context("failed to build tokio runtime")?; - Ok(rt - .block_on(async { engine.async_query(&query).await })? - .unwrap_or_default()) + rt.block_on(async { engine.async_query(&query).await })? + .ok_or_else(|| anyhow::anyhow!("minimal engine returned no dataframe for torch query")) }) .join() .map_err(|_| anyhow::anyhow!("error joining thread"))? diff --git a/probing/extensions/python/src/repl/session.rs b/probing/extensions/python/src/repl/session.rs index a61c2d50..39cfbd79 100644 --- a/probing/extensions/python/src/repl/session.rs +++ b/probing/extensions/python/src/repl/session.rs @@ -1,5 +1,7 @@ //! WebSocket REPL session facade (server owns transport; python ext owns REPL state). +use log; + use super::{PythonRepl, Repl}; /// One interactive REPL session for `/ws` (text in → JSON/text out). @@ -22,11 +24,23 @@ impl ReplSession { /// Feed one WebSocket text frame; returns the REPL response string. pub fn handle_text(&mut self, text: String) -> String { - self.repl.feed(text).unwrap_or_else(|| "{}".to_string()) + match self.repl.feed(text) { + Some(response) => response, + None => { + log::error!("REPL feed returned no response"); + r#"{"error":"repl feed failed"}"#.to_string() + } + } } /// Evaluate one code snippet (HTTP eval API — single shot, no line buffering). pub fn eval_code(&mut self, code: &str) -> String { - self.repl.process(code).unwrap_or_default() + match self.repl.process(code) { + Some(response) => response, + None => { + log::error!("REPL eval returned no response"); + r#"{"error":"repl eval failed"}"#.to_string() + } + } } } diff --git a/probing/memtable/Cargo.toml b/probing/memtable/Cargo.toml index e3a95c6b..6ff81bc4 100644 --- a/probing/memtable/Cargo.toml +++ b/probing/memtable/Cargo.toml @@ -12,9 +12,11 @@ log = "0.4" thiserror = { workspace = true } xxhash-rust = { version = "0.8", features = ["xxh3"] } memmap2 = "0.9" -libc = "0.2" pco = "0.4" +[target.'cfg(unix)'.dependencies] +libc = "0.2" + [dev-dependencies] [[bench]] diff --git a/probing/memtable/src/cache.rs b/probing/memtable/src/cache.rs index e6d338a7..ce620c4f 100644 --- a/probing/memtable/src/cache.rs +++ b/probing/memtable/src/cache.rs @@ -1,5 +1,5 @@ use crate::layout::{chunk_header, r32}; -use crate::row::{panic_stale, Row}; +use crate::row::Row; use std::collections::HashMap; use std::sync::atomic::Ordering; @@ -62,7 +62,7 @@ impl<'a> CachedReader<'a> { let len = r32(self.buf, data_off) as usize; let end = data_off.saturating_add(4).saturating_add(len); if end > self.buf.len() { - panic_stale("CachedReader dedup resolve"); + return &[]; } let b = &self.buf[data_off + 4..end]; self.last_key = key; @@ -126,7 +126,13 @@ impl<'a> CachedCursor<'a, '_> { if self.stale { return [0u8; N]; } - let v: [u8; N] = self.data[self.pos..self.pos + N].try_into().unwrap(); + let end = self.pos + N; + if end > self.data.len() { + self.stale = true; + return [0u8; N]; + } + let mut v = [0u8; N]; + v.copy_from_slice(&self.data[self.pos..end]); self.pos += N; v } @@ -136,11 +142,28 @@ impl<'a> CachedCursor<'a, '_> { return &[]; } let raw = i32::from_le_bytes(self.read_fixed::<4>()); + if self.stale { + return &[]; + } if raw < 0 { let data_off = self.chunk_start + (-raw) as usize; + if data_off + 4 > self.cache.buf.len() { + self.stale = true; + return &[]; + } + let len = r32(self.cache.buf, data_off) as usize; + let end = data_off + 4 + len; + if end > self.cache.buf.len() { + self.stale = true; + return &[]; + } self.cache.resolve_ref(data_off, self.generation) } else { let len = raw as usize; + if self.pos + len > self.data.len() { + self.stale = true; + return &[]; + } let b = &self.data[self.pos..self.pos + len]; self.pos += len; b diff --git a/probing/memtable/src/discover.rs b/probing/memtable/src/discover.rs index 6e05aec5..4a86c9df 100644 --- a/probing/memtable/src/discover.rs +++ b/probing/memtable/src/discover.rs @@ -76,6 +76,40 @@ pub fn default_dir() -> PathBuf { std::env::temp_dir().join("probing") } +/// Check whether a process with the given PID currently exists. +#[cfg(unix)] +fn process_exists(pid: u32) -> bool { + let ret = unsafe { libc::kill(pid as libc::c_int, 0) }; + if ret == 0 { + return true; + } + // EPERM means the process exists but we lack permission to signal it. + io::Error::last_os_error().raw_os_error() == Some(libc::EPERM) +} + +#[cfg(windows)] +fn process_exists(pid: u32) -> bool { + use std::ffi::c_void; + + #[link(name = "kernel32")] + extern "system" { + fn OpenProcess(dwDesiredAccess: u32, bInheritHandle: i32, dwProcessId: u32) -> *mut c_void; + fn CloseHandle(hObject: *mut c_void) -> i32; + } + + // PROCESS_QUERY_LIMITED_INFORMATION — enough to test liveness without admin rights. + const PROCESS_QUERY_LIMITED_INFORMATION: u32 = 0x1000; + + unsafe { + let handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, pid); + if handle.is_null() { + return false; + } + CloseHandle(handle); + true + } +} + /// Check whether the process identified by `(pid, start_time)` is still alive. /// /// - Returns `false` if the PID does not exist. @@ -85,12 +119,8 @@ pub fn is_creator_alive(pid: u32, expected_start_time: u64) -> bool { if pid == 0 { return false; } - let ret = unsafe { libc::kill(pid as libc::c_int, 0) }; - if ret != 0 { - let err = io::Error::last_os_error(); - if err.raw_os_error() != Some(libc::EPERM) { - return false; - } + if !process_exists(pid) { + return false; } if expected_start_time != 0 { let actual = process_start_time(pid); diff --git a/probing/memtable/src/row.rs b/probing/memtable/src/row.rs index 479a483a..0b250bfa 100644 --- a/probing/memtable/src/row.rs +++ b/probing/memtable/src/row.rs @@ -2,33 +2,35 @@ use crate::layout::{chunk_header, col_desc, r32}; use crate::schema::DType; use std::sync::atomic::Ordering; -/// Unified panic for all stale-read conditions: the chunk was recycled while -/// data was being accessed, or the offset arithmetic fell outside the buffer. -#[cold] -#[inline(never)] -pub(crate) fn panic_stale(context: &str) -> ! { - panic!("stale read: chunk recycled ({context})") -} - -fn read_i32(data: &[u8], off: usize) -> i32 { +fn try_read_i32(data: &[u8], off: usize) -> Option { if off + 4 > data.len() { - panic_stale("read_i32"); + return None; } - i32::from_le_bytes([data[off], data[off + 1], data[off + 2], data[off + 3]]) + Some(i32::from_le_bytes([ + data[off], + data[off + 1], + data[off + 2], + data[off + 3], + ])) } -fn read_u32(data: &[u8], off: usize) -> u32 { +fn try_read_u32(data: &[u8], off: usize) -> Option { if off + 4 > data.len() { - panic_stale("read_u32"); + return None; } - u32::from_le_bytes([data[off], data[off + 1], data[off + 2], data[off + 3]]) + Some(u32::from_le_bytes([ + data[off], + data[off + 1], + data[off + 2], + data[off + 3], + ])) } -fn read_i64(data: &[u8], off: usize) -> i64 { +fn try_read_i64(data: &[u8], off: usize) -> Option { if off + 8 > data.len() { - panic_stale("read_i64"); + return None; } - i64::from_le_bytes([ + Some(i64::from_le_bytes([ data[off], data[off + 1], data[off + 2], @@ -37,14 +39,14 @@ fn read_i64(data: &[u8], off: usize) -> i64 { data[off + 5], data[off + 6], data[off + 7], - ]) + ])) } -fn read_u64(data: &[u8], off: usize) -> u64 { +fn try_read_u64(data: &[u8], off: usize) -> Option { if off + 8 > data.len() { - panic_stale("read_u64"); + return None; } - u64::from_le_bytes([ + Some(u64::from_le_bytes([ data[off], data[off + 1], data[off + 2], @@ -53,21 +55,26 @@ fn read_u64(data: &[u8], off: usize) -> u64 { data[off + 5], data[off + 6], data[off + 7], - ]) + ])) } -fn read_f32(data: &[u8], off: usize) -> f32 { +fn try_read_f32(data: &[u8], off: usize) -> Option { if off + 4 > data.len() { - panic_stale("read_f32"); + return None; } - f32::from_le_bytes([data[off], data[off + 1], data[off + 2], data[off + 3]]) + Some(f32::from_le_bytes([ + data[off], + data[off + 1], + data[off + 2], + data[off + 3], + ])) } -fn read_f64(data: &[u8], off: usize) -> f64 { +fn try_read_f64(data: &[u8], off: usize) -> Option { if off + 8 > data.len() { - panic_stale("read_f64"); + return None; } - f64::from_le_bytes([ + Some(f64::from_le_bytes([ data[off], data[off + 1], data[off + 2], @@ -76,38 +83,38 @@ fn read_f64(data: &[u8], off: usize) -> f64 { data[off + 5], data[off + 6], data[off + 7], - ]) + ])) } -fn var_field_size(buf: &[u8], off: usize) -> usize { - let raw = read_i32(buf, off); +fn try_var_field_size(buf: &[u8], off: usize) -> Option { + let raw = try_read_i32(buf, off)?; if raw < 0 { - 4 + Some(4) } else { - 4 + raw as usize + Some(4 + raw as usize) } } -fn resolve_var(buf: &[u8], off: usize, chunk_start: usize) -> &[u8] { - let raw = read_i32(buf, off); +fn try_resolve_var(buf: &[u8], off: usize, chunk_start: usize) -> Option<&[u8]> { + let raw = try_read_i32(buf, off)?; if raw < 0 { let ref_off = chunk_start + (-raw) as usize; if ref_off + 4 > buf.len() { - panic_stale("resolve_var ref header"); + return None; } let len = r32(buf, ref_off) as usize; let end = ref_off + 4 + len; if end > buf.len() { - panic_stale("resolve_var ref payload"); + return None; } - &buf[ref_off + 4..end] + Some(&buf[ref_off + 4..end]) } else { let len = raw as usize; let end = off + 4 + len; if end > buf.len() { - panic_stale("resolve_var inline"); + return None; } - &buf[off + 4..end] + Some(&buf[off + 4..end]) } } @@ -143,30 +150,32 @@ impl<'a> Row<'a> { self.data } - fn col_offset(&self, col: usize) -> usize { + fn try_col_offset(&self, col: usize) -> Option { let mut off = 0; for i in 0..col { - let dt = DType::from_u32(col_desc(self.buf, i).dtype) - .unwrap_or_else(|| panic_stale("corrupt column dtype")); + let dt = DType::from_u32(col_desc(self.buf, i).dtype)?; if let Some(sz) = dt.fixed_size() { off += sz; } else { - off += var_field_size(self.data, off); + off += try_var_field_size(self.data, off)?; } } - off + Some(off) } - fn resolve_var_col(&self, col: usize) -> &'a [u8] { - let off = self.col_offset(col); - resolve_var(self.buf, self.data_offset + off, self.chunk_start) + fn try_resolve_var_col(&self, col: usize) -> Option<&'a [u8]> { + let off = self.try_col_offset(col)?; + try_resolve_var(self.buf, self.data_offset + off, self.chunk_start) } pub fn col_u8(&self, col: usize) -> u8 { if !self.is_valid() { return 0; } - let off = self.col_offset(col); + let off = match self.try_col_offset(col) { + Some(o) => o, + None => return 0, + }; if off >= self.data.len() { return 0; } @@ -176,43 +185,70 @@ impl<'a> Row<'a> { if !self.is_valid() { return 0; } - read_u32(self.data, self.col_offset(col)) + let off = match self.try_col_offset(col) { + Some(o) => o, + None => return 0, + }; + try_read_u32(self.data, off).unwrap_or(0) } pub fn col_i32(&self, col: usize) -> i32 { if !self.is_valid() { return 0; } - read_i32(self.data, self.col_offset(col)) + let off = match self.try_col_offset(col) { + Some(o) => o, + None => return 0, + }; + try_read_i32(self.data, off).unwrap_or(0) } pub fn col_i64(&self, col: usize) -> i64 { if !self.is_valid() { return 0; } - read_i64(self.data, self.col_offset(col)) + let off = match self.try_col_offset(col) { + Some(o) => o, + None => return 0, + }; + try_read_i64(self.data, off).unwrap_or(0) } pub fn col_f32(&self, col: usize) -> f32 { if !self.is_valid() { return 0.0; } - read_f32(self.data, self.col_offset(col)) + let off = match self.try_col_offset(col) { + Some(o) => o, + None => return 0.0, + }; + try_read_f32(self.data, off).unwrap_or(0.0) } pub fn col_f64(&self, col: usize) -> f64 { if !self.is_valid() { return 0.0; } - read_f64(self.data, self.col_offset(col)) + let off = match self.try_col_offset(col) { + Some(o) => o, + None => return 0.0, + }; + try_read_f64(self.data, off).unwrap_or(0.0) } pub fn col_u64(&self, col: usize) -> u64 { if !self.is_valid() { return 0; } - read_u64(self.data, self.col_offset(col)) + let off = match self.try_col_offset(col) { + Some(o) => o, + None => return 0, + }; + try_read_u64(self.data, off).unwrap_or(0) } pub fn col_str(&self, col: usize) -> &str { if !self.is_valid() { return ""; } - let b = self.resolve_var_col(col); + let b = match self.try_resolve_var_col(col) { + Some(b) => b, + None => return "", + }; if b.is_empty() { "" } else { @@ -223,7 +259,7 @@ impl<'a> Row<'a> { if !self.is_valid() { return &[]; } - self.resolve_var_col(col) + self.try_resolve_var_col(col).unwrap_or(&[]) } pub fn cursor(&self) -> RowCursor<'a> { @@ -567,6 +603,26 @@ mod tests { assert_eq!(c.next_str(), ""); } + #[test] + fn row_col_degrades_on_torn_bounds_without_panic() { + use super::Row; + + let schema = Schema::new().col("v", DType::I64); + let mut t = MemTable::new(&schema, 4096, 1); + t.push_row(&[Value::I64(42)]); + let row = t.rows(0).next().unwrap(); + // Truncate row data to simulate torn read while generation is still valid. + let torn = Row { + data: &row.data[..4], + buf: row.buf, + data_offset: row.data_offset, + chunk_start: row.chunk_start, + generation: row.generation, + }; + assert!(torn.is_valid()); + assert_eq!(torn.col_i64(0), 0); + } + #[test] fn row_iter_skips_row_when_chunk_recycled_mid_parse() { use crate::memtable::MemTableView; diff --git a/probing/server/API.md b/probing/server/API.md index b73129d9..0a80a6d3 100644 --- a/probing/server/API.md +++ b/probing/server/API.md @@ -22,7 +22,7 @@ Registered in `server/api/mod.rs`: | GET | `/apis/files?path=…` | Read workspace file | | GET/PUT | `/apis/nodes` | Cluster node list / register | | GET | `/apis/training/step_matrix` | Cross-rank train.step samples (`cluster=false` default; set `cluster=true` for on-demand fan-out) | -| POST | `/apis/cluster/query` | On-demand SQL fan-out (`{"expr":"…","cluster":true}`) | +| POST | `/apis/cluster/query` | On-demand SQL fan-out (`{"expr":"…","cluster":true}`; read-only SQL only) | Flamegraphs are served by profiler extensions (extension fallback, not public routes): @@ -38,7 +38,7 @@ Flamegraphs are served by profiler extensions (extension fallback, not public ro Training agents write to **local memtable only**. Cross-node aggregation is explicit: - **Local** (default): `GET /apis/training/step_matrix?cluster=false` or `POST /apis/cluster/query` with `"cluster": false` -- **Cluster scan**: `cluster=true` fans out the same SQL to peer nodes from the in-memory cluster view (torchrun report / `PUT /apis/nodes`), merges rows, and tags `_probe_host` / `_probe_addr` +- **Cluster scan**: `cluster=true` fans out the same SQL to peer nodes from the in-memory cluster view (torchrun report / `PUT /apis/nodes`), merges rows, and tags `_host` / `_addr` (plus `_rank`, `_node_rank`, `_local_rank`, `_role` on federated results) CLI: @@ -109,13 +109,13 @@ When built with the `rmcp` feature (default in the PyPI wheel), the server expos | Tool | Purpose | |------|---------| -| `query` | Read-only SQL against the in-process engine (`limit` caps rows) | +| `query` | Read-only SQL against the in-process engine (`limit` caps rows; rejects multi-statement batches containing writes) | | `describe_tables` | Semantic docs from `probe.probing.table_docs` / `column_docs` | | `list_skills` | List diagnostic skills (bundled + entry-point extensions) | | `plan_skill` | Expand a skill into SQL/API steps (Rust in-process) | | `run_skill` | Execute a diagnostic skill (Rust in-process) | | `list_cluster_nodes` | `GET /apis/nodes` — registered cluster members | -| `cluster_query` | Read-only SQL with optional cluster fan-out (`cluster` default `true`) | +| `cluster_query` | Read-only SQL with optional cluster fan-out (`cluster` default `true`; AST-validated, same rules as `query`) | #### Write tools (disabled unless `PROBING_MCP_ALLOW_WRITE=1`) @@ -174,6 +174,8 @@ Do not register the same capability in both places. Do not add path aliases. | Invalid query string on extension URL | 400 | | Missing config key | 404 | | Invalid `/query` JSON body | 400 | +| `/query/dto` engine errors | Same HTTP status as underlying `ApiError` (e.g. 404, 503); DTO `code` mirrors status (`BAD_REQUEST`, `NOT_FOUND`, `SERVICE_UNAVAILABLE`, …) | +| Partial cluster fan-out (`meta.partial` / `nodes_failed` non-empty) on `/query`, `/query/dto`, `POST /apis/cluster/query`, `GET /apis/training/step_matrix` | 503 (body still returned so clients can inspect partial data) | | SET statement failure on `/query` | 500 (payload `QueryDataFormat::Error`) | | Invalid file path / missing param | 400 | | File too large | 413 | diff --git a/probing/server/AUTH.md b/probing/server/AUTH.md index 821768c6..f6293c70 100644 --- a/probing/server/AUTH.md +++ b/probing/server/AUTH.md @@ -10,6 +10,10 @@ Set the `PROBING_AUTH_TOKEN` environment variable to enable authentication: export PROBING_AUTH_TOKEN="your-secret-token" ``` +The token is loaded into `server.auth_token` in the config store when the remote server starts. You can also set it at runtime with `SET server.auth_token='…'` or `SET auth_token='…'` (extension option). + +The CLI reads `PROBING_AUTH_TOKEN` and sends `Authorization: Bearer …` on remote HTTP requests. + You can also optionally set the username (default is "admin") and the realm (default is "Probe Server"): ```bash @@ -53,6 +57,8 @@ X-Probing-Token: your-secret-token Even when authentication is enabled, the following paths remain publicly accessible by default: +- `/health` (liveness probe) +- `/ready` (readiness probe) - `/` (home page) - `/index.html` - `/static/` (all static resources) diff --git a/probing/server/Cargo.toml b/probing/server/Cargo.toml index 5d43eef2..f8dcb9e9 100644 --- a/probing/server/Cargo.toml +++ b/probing/server/Cargo.toml @@ -13,7 +13,7 @@ gpu = ["dep:probing-gpu"] gpu-cuda = ["gpu", "probing-gpu/cuda"] kmsg = ["probing-cc/kmsg"] default = ["extension-module", "kmsg", "rmcp"] -rmcp = ["dep:rmcp", "dep:probing-cli", "dep:probing-skills"] +rmcp = ["dep:rmcp", "dep:probing-skills"] [dependencies] probing-cc = { path = "../extensions/cc", default-features = false } @@ -21,9 +21,10 @@ probing-gpu = { path = "../extensions/gpu", optional = true } probing-memtable = { path = "../memtable" } probing-python = { path = "../extensions/python", default-features = false } probing-proto = { path = "../proto" } +probing-hccl-shim = { path = "../extensions/hccl-shim" } +probing-nccl-profiler = { path = "../extensions/nccl-profiler" } probing-core = { path = "../core" } probing-store = { path = "../crates/store" } -probing-cli = { path = "../cli", optional = true } probing-skills = { path = "../crates/skills", optional = true } datafusion = { workspace = true } @@ -40,7 +41,7 @@ async-trait = "0.1.83" bytes = "1" nu-ansi-term = "0.50.1" base64 = "0.21.5" -ureq = { version = "3.0.2", default-features = false, features = ["json"] } +ureq = { workspace = true, features = ["json"] } axum = { version = "0.8.1", default-features = false, features = [ "tokio", "http1", diff --git a/probing/server/src/auth.rs b/probing/server/src/auth.rs index a7639aae..3719d5b3 100644 --- a/probing/server/src/auth.rs +++ b/probing/server/src/auth.rs @@ -10,6 +10,8 @@ use probing_core::config; use std::env; // Auth token environment variable name +pub const AUTH_TOKEN_ENV: &str = "PROBING_AUTH_TOKEN"; +pub const AUTH_TOKEN_CONFIG_KEY: &str = "server.auth_token"; pub const AUTH_USERNAME_ENV: &str = "PROBING_AUTH_USERNAME"; // Optional, default is "admin" pub const AUTH_REALM_ENV: &str = "PROBING_AUTH_REALM"; // Optional, default is "Probe Server" @@ -20,6 +22,25 @@ pub static AUTH_USERNAME: Lazy = pub static AUTH_REALM: Lazy = Lazy::new(|| env::var(AUTH_REALM_ENV).unwrap_or_else(|_| "Probe Server".to_string())); +/// Load `PROBING_AUTH_TOKEN` into the config store so middleware can enforce it. +pub async fn bootstrap_auth_from_env() { + let Ok(token) = env::var(AUTH_TOKEN_ENV) else { + return; + }; + let token = token.trim(); + if token.is_empty() { + return; + } + if let Err(err) = config::write(AUTH_TOKEN_CONFIG_KEY, token).await { + log::error!("failed to bootstrap auth token from {AUTH_TOKEN_ENV}: {err}"); + } +} + +/// Persist auth token to the config store (used by SET and extension options). +pub async fn persist_auth_token(token: &str) -> Result<(), probing_core::core::EngineError> { + config::write(AUTH_TOKEN_CONFIG_KEY, token).await +} + /// Get the auth token from the request /// Made public for integration tests pub fn get_token_from_request(headers: &HeaderMap) -> Option { @@ -85,103 +106,52 @@ fn unauthorized_response() -> Response { /// Authentication middleware pub async fn auth_middleware(request: Request, next: Next) -> Response { // Get the configured token - let configured_token = config::get_str("server.auth_token") + let configured_token = config::get_str(AUTH_TOKEN_CONFIG_KEY) .await .unwrap_or_default(); - log::debug!("Configured auth token: {configured_token:?}"); + log::debug!("Auth token configured: {}", !configured_token.is_empty()); if !configured_token.is_empty() { // Extract token from the request let provided_token = get_token_from_request(request.headers()); // Check if token matches - return match provided_token { - Some(token) if token == configured_token => next.run(request).await, - _ => unauthorized_response(), - }; + if provided_token.as_deref() != Some(configured_token.as_str()) { + return unauthorized_response(); + } } next.run(request).await } -// Path prefixes that should bypass authentication /// Check if a path is public (doesn't require authentication) -/// Made public for integration tests pub fn is_public_path(path: &str) -> bool { - // Allow static assets without authentication - path.starts_with("/static/") + // Liveness/readiness for load balancers and K8s probes (remote server uses auth middleware). + path == "/health" + || path == "/ready" + || path.starts_with("/static/") || path == "/" || path == "/index.html" || path.starts_with("/favicon") } -/// Selective auth middleware that skips authentication for specific paths +/// Selective authentication middleware - only applies auth to non-public paths pub async fn selective_auth_middleware(request: Request, next: Next) -> Response { - let path = request.uri().path(); + let path = request.uri().path().to_string(); - // Skip authentication for public paths - if is_public_path(path) { + if is_public_path(&path) { return next.run(request).await; } - // Apply authentication for all other paths auth_middleware(request, next).await } #[cfg(test)] mod tests { use super::*; - use axum::http::{HeaderMap, HeaderValue}; - - #[test] - fn test_get_token_from_request_bearer() { - let mut headers = HeaderMap::new(); - headers.insert( - "Authorization", - HeaderValue::from_static("Bearer test_token_123"), - ); - - let token = get_token_from_request(&headers); - assert_eq!(token, Some("test_token_123".to_string())); - } #[test] - fn test_get_token_from_request_bearer_case_insensitive() { - let mut headers = HeaderMap::new(); - headers.insert( - "Authorization", - HeaderValue::from_static("bearer test_token_123"), - ); - - let token = get_token_from_request(&headers); - // Note: strip_prefix is case-sensitive, so this should not match - assert_eq!(token, None); + fn auth_token_config_key_matches_middleware() { + assert_eq!(AUTH_TOKEN_CONFIG_KEY, "server.auth_token"); } - - #[test] - fn test_get_token_from_request_bearer_empty() { - let mut headers = HeaderMap::new(); - headers.insert("Authorization", HeaderValue::from_static("Bearer ")); - - let token = get_token_from_request(&headers); - assert_eq!(token, Some("".to_string())); - } - - // 注意:冗长的测试(需要base64编码、多个header设置等)已移到 tests/auth_complex_tests.rs - - #[test] - fn test_get_token_from_request_no_token() { - let headers = HeaderMap::new(); - let token = get_token_from_request(&headers); - assert_eq!(token, None); - } - - // 注意:冗长的测试(多个断言、复杂路径判断等)已移到 tests/auth_complex_tests.rs - - // Note: Testing middleware functions (auth_middleware, selective_auth_middleware) - // requires creating a Next instance which is complex in axum 0.8. - // These functions are tested through integration tests. - // Here we test the core functions that can be tested directly: - // - get_token_from_request (tested above) - // - is_public_path (tested above) } diff --git a/probing/server/src/engine.rs b/probing/server/src/engine.rs index 45925729..d92c43bd 100644 --- a/probing/server/src/engine.rs +++ b/probing/server/src/engine.rs @@ -18,7 +18,12 @@ use probing_core::core::UnifiedMemtableProbeDataSource; pub use probing_core::ENGINE; use probing_python::extensions::python::PythonProbeDataSource; +/// Composition root: wires L2 collectors/extensions into the engine. +/// NCCL/HCCL schema docs are registered here (not via `probing-core` default features). pub async fn initialize_engine() -> Result<()> { + probing_hccl_shim::register_docs(); + probing_nccl_profiler::register_docs(); + let builder = probing_core::create_engine() .with_data_source(cc::ClusterProbeDataSource::create("cluster", "nodes")) .with_data_source(cc::EnvProbeDataSource::create("process", "envs")) @@ -200,7 +205,7 @@ pub async fn query(req: String) -> ApiResult { // Error already logged in handle_query if it originated there QueryDataFormat::Error(QueryError { code: ErrorCode::Internal, - message: err.to_string(), + message: format!("{err:#}"), details: None, }) } diff --git a/probing/server/src/extensions.rs b/probing/server/src/extensions.rs index fbafde42..ae4b7b96 100644 --- a/probing/server/src/extensions.rs +++ b/probing/server/src/extensions.rs @@ -92,7 +92,14 @@ impl ServerProbeExtension { } fn set_auth_token(&mut self, auth_token: Maybe) -> Result<(), EngineError> { - self.auth_token = auth_token; + self.auth_token = auth_token.clone(); + let value: String = auth_token.into(); + probing_core::block_on( + async move { crate::auth::persist_auth_token(value.as_str()).await }, + ) + .map_err(|err| { + EngineError::InternalError(format!("failed to persist auth token: {err:#}")) + })??; Ok(()) } diff --git a/probing/server/src/mcp/helpers.rs b/probing/server/src/mcp/helpers.rs index 70a01b41..3dac25eb 100644 --- a/probing/server/src/mcp/helpers.rs +++ b/probing/server/src/mcp/helpers.rs @@ -1,11 +1,13 @@ //! Shared helpers for MCP tools (query shaping, write guard, audit). -use probing_cli::cli::ctrl::ProbeEndpoint; -use probing_core::core::federation::take_fanout_stats; +use std::collections::HashMap; + +use probing_core::core::federation::{fanout_strict_enabled, take_fanout_stats}; +use probing_core::core::ProbeExtensionManager; use probing_proto::prelude::{Ele, Query, QueryDataFormat}; use rmcp::ErrorData; -use crate::engine::handle_query; +use crate::engine::{handle_query, ENGINE}; pub const DEFAULT_ROW_LIMIT: usize = 200; pub const MAX_ROW_LIMIT: usize = 1000; @@ -40,27 +42,13 @@ pub fn audit_mcp_write(tool: &str, detail: &str) { log::info!("MCP write audit: tool={tool} detail={detail}"); } -pub fn local_ctrl() -> ProbeEndpoint { - ProbeEndpoint::Local { - pid: std::process::id() as i32, - } -} - pub fn tool_error(message: impl Into) -> ErrorData { ErrorData::invalid_params(message.into(), None) } -pub fn ensure_read_only_sql(sql: &str) -> Result<(), String> { - let upper = sql.trim().to_uppercase(); - if upper.starts_with("SELECT") - || upper.starts_with("WITH") - || upper.starts_with("SHOW") - || upper.starts_with("DESCRIBE") - { - Ok(()) - } else { - Err("Only read-only SQL is allowed (SELECT/WITH/SHOW/DESCRIBE)".to_string()) - } +/// Map a fallible error into MCP `ErrorData` while preserving anyhow cause chains (`{err:#}`). +pub fn tool_error_from(err: impl std::fmt::Display) -> ErrorData { + tool_error(format!("{err:#}")) } pub fn validate_config_key(key: &str) -> Result<(), String> { @@ -78,24 +66,62 @@ pub fn escape_sql_string(value: &str) -> String { value.replace('\'', "''") } +pub(crate) fn split_api_path(path: &str) -> (&str, HashMap) { + let path = path.strip_prefix("/apis").unwrap_or(path); + if let Some((p, q)) = path.split_once('?') { + (p, serde_urlencoded::from_str(q).unwrap_or_default()) + } else { + (path, HashMap::new()) + } +} + +/// Call a registered probe extension in-process (no HTTP loopback). +pub(crate) async fn extension_request(path: &str, body: &[u8]) -> Result, ErrorData> { + let (api_path, params) = split_api_path(path); + let eem = { + let engine = ENGINE.read().await; + engine + .context + .state() + .config() + .options() + .extensions + .get::() + .cloned() + }; + let Some(eem) = eem else { + return Err(tool_error("Extension manager not available")); + }; + eem.call(api_path, ¶ms, body) + .await + .map_err(tool_error_from) +} + pub async fn engine_query_json(sql: String, limit: usize) -> Result { - ensure_read_only_sql(&sql).map_err(tool_error)?; + crate::server::sql_guard::ensure_read_only_sql(&sql).map_err(tool_error)?; let reply = handle_query(Query { expr: sql, opts: None, }) .await - .map_err(|e| tool_error(e.to_string()))?; + .map_err(tool_error_from)?; let mut payload = dataframe_reply_to_json(reply, limit)?; - attach_fanout_quality(&mut payload); + attach_fanout_quality(&mut payload)?; Ok(payload) } /// Surface federated / global-table fan-out completeness when peers were dropped. -fn attach_fanout_quality(payload: &mut serde_json::Value) { +fn attach_fanout_quality(payload: &mut serde_json::Value) -> Result<(), ErrorData> { let stats = take_fanout_stats(); if stats.nodes_failed.is_empty() && stats.peer_batches_dropped == 0 { - return; + return Ok(()); + } + if fanout_strict_enabled() { + return Err(tool_error(format!( + "federated fan-out strict mode: {} node(s) failed, {} peer batch(es) dropped", + stats.nodes_failed.len(), + stats.peer_batches_dropped + ))); } if let Some(obj) = payload.as_object_mut() { obj.insert( @@ -108,6 +134,7 @@ fn attach_fanout_quality(payload: &mut serde_json::Value) { }), ); } + Ok(()) } pub fn dataframe_reply_to_json( @@ -180,4 +207,27 @@ mod tests { assert!(allow_mcp_write()); std::env::remove_var("PROBING_MCP_ALLOW_WRITE"); } + + #[test] + fn ensure_read_only_sql_rejects_trailing_write() { + use crate::server::sql_guard::ensure_read_only_sql; + assert!(ensure_read_only_sql("SELECT 1; DELETE FROM t").is_err()); + } + + #[test] + fn ensure_read_only_sql_allows_multiple_selects() { + use crate::server::sql_guard::ensure_read_only_sql; + assert!(ensure_read_only_sql("SELECT 1; SELECT 2").is_ok()); + } + + #[test] + fn tool_error_from_preserves_anyhow_chain() { + let err = anyhow::anyhow!("root cause") + .context("middle") + .context("outer"); + let data = tool_error_from(err); + let msg = data.message; + assert!(msg.contains("outer")); + assert!(msg.contains("root cause")); + } } diff --git a/probing/server/src/mcp/mod.rs b/probing/server/src/mcp/mod.rs index 80363033..6cb8941e 100644 --- a/probing/server/src/mcp/mod.rs +++ b/probing/server/src/mcp/mod.rs @@ -4,14 +4,15 @@ //! Phase 2: schema grounding (`describe_tables`, resources), cluster tools, gated write tools. mod helpers; +mod skill_backend; use std::collections::HashMap; use std::sync::Arc; use axum::Router; -use probing_cli::cli::skill::{list_skill_ids, load_skill, plan_skill, run_skill_json}; use probing_proto::prelude::{Query, QueryDataFormat}; -use probing_skills::backend::parse_cluster_query_response; +use probing_skills::loader::{list_skill_ids, load_skill}; +use probing_skills::runner::{execute_skill, plan_skill, run_result_to_json, RunOptions}; use rmcp::handler::server::router::tool::ToolRouter; use rmcp::handler::server::wrapper::Parameters; use rmcp::model::{ @@ -30,11 +31,14 @@ use rmcp::ServerHandler; use serde::Deserialize; use crate::engine::handle_query; +use crate::server::cluster_fanout::{self, ClusterFanoutScope}; +use crate::server::sql_guard::ensure_read_only_sql; use helpers::{ - allow_mcp_write, audit_mcp_write, engine_query_json, ensure_read_only_sql, escape_sql_string, - local_ctrl, require_write_permission, tool_error, validate_config_key, DEFAULT_ROW_LIMIT, + allow_mcp_write, audit_mcp_write, engine_query_json, escape_sql_string, extension_request, + require_write_permission, tool_error, tool_error_from, validate_config_key, DEFAULT_ROW_LIMIT, MAX_ROW_LIMIT, }; +use skill_backend::ServerBackend; const SCHEMA_RESOURCE_PREFIX: &str = "probing://schema/"; @@ -215,7 +219,7 @@ impl ProbingMcp { &self, Parameters(PlanSkillArgs { skill_id, params }): Parameters, ) -> Result { - let value = plan_skill(&skill_id, params).map_err(|e| tool_error(e.0))?; + let value = plan_skill(&skill_id, params).map_err(tool_error_from)?; Ok(text_result(value.to_string())) } @@ -231,26 +235,37 @@ impl ProbingMcp { if let Some(global) = use_global { params.insert("use_global".to_string(), global.to_string()); } - let ctrl = local_ctrl(); - match run_skill_json(ctrl, &skill_id, params).await { - Ok(value) => Ok(text_result(value.to_string())), - Err(err) => Err(tool_error(err.to_string())), + let result = execute_skill(&ServerBackend, &skill_id, params, RunOptions::default()) + .await + .map_err(tool_error_from)?; + let payload = run_result_to_json(&result); + if result.had_error { + return Err(tool_error(payload.to_string())); } + Ok(text_result(payload.to_string())) } - #[tool(description = "List registered cluster nodes from `GET /apis/nodes`.")] + #[tool(description = "List registered cluster nodes.")] async fn list_cluster_nodes(&self) -> Result { - let ctrl = local_ctrl(); - let body = ctrl - .get("/apis/nodes") - .await - .map_err(|e| tool_error(e.to_string()))?; - Ok(text_result(body)) + use probing_core::core::cluster::get_nodes_page; + use probing_proto::prelude::NodeListResponse; + + let (version, total, nodes) = + tokio::task::spawn_blocking(|| get_nodes_page(0, 10_000, None)) + .await + .map_err(|e| tool_error(format!("cluster list task failed: {e}")))?; + let resp = NodeListResponse { + version, + total, + offset: 0, + nodes, + }; + Ok(text_result( + serde_json::to_string_pretty(&resp).unwrap_or_else(|_| "{}".to_string()), + )) } - #[tool( - description = "Run read-only SQL with optional cluster fan-out via `POST /apis/cluster/query`." - )] + #[tool(description = "Run read-only SQL with optional cluster fan-out.")] async fn cluster_query( &self, Parameters(ClusterQueryArgs { @@ -259,26 +274,24 @@ impl ProbingMcp { limit, }): Parameters, ) -> Result { + use probing_core::core::federation::validate_global_query; + let limit = limit.clamp(1, MAX_ROW_LIMIT); ensure_read_only_sql(&sql).map_err(tool_error)?; - let body = serde_json::json!({ - "expr": sql, - "cluster": cluster, - }); - let reply = local_ctrl() - .post_json("/apis/cluster/query", &body.to_string()) + if cluster { + validate_global_query(&sql).map_err(tool_error_from)?; + } + let result = cluster_fanout::fanout_query(&sql, cluster, true, ClusterFanoutScope::Auto) .await - .map_err(|e| tool_error(e.to_string()))?; - let value: serde_json::Value = - serde_json::from_str(&reply).map_err(|e| tool_error(e.to_string()))?; - let (dataframe, cluster_meta) = - parse_cluster_query_response(&value).map_err(|e| tool_error(e.0))?; - let rows = helpers::truncate_dataframe_json(&dataframe, limit); - let meta = value - .get("meta") - .cloned() - .unwrap_or(serde_json::Value::Null); - let partial = cluster_meta.as_ref().is_some_and(|m| m.partial); + .map_err(tool_error_from)?; + let partial = result.meta.partial; + let rows = helpers::truncate_dataframe_json(&result.dataframe, limit); + let meta = serde_json::to_value(&result.meta).unwrap_or(serde_json::Value::Null); + if partial && probing_core::core::federation::fanout_strict_enabled() { + return Err(tool_error(format!( + "federated fan-out strict mode: cluster query returned partial data ({meta})" + ))); + } let payload = serde_json::json!({ "dataframe": rows, "meta": meta, @@ -310,7 +323,7 @@ impl ProbingMcp { opts: None, }) .await - .map_err(|e| tool_error(e.to_string()))?; + .map_err(tool_error_from)?; Ok(text_result(format!( "{{\"status\":\"ok\",\"key\":\"{probe_key}\",\"write_enabled\":true}}" ))) @@ -325,10 +338,10 @@ impl ProbingMcp { ) -> Result { require_write_permission("eval_python")?; audit_mcp_write("eval_python", &format!("code_len={}", code.len())); - let body = local_ctrl() - .eval_json(code) + let bytes = extension_request("/apis/pythonext/eval", code.as_bytes()) .await - .map_err(|e| tool_error(e.to_string()))?; + .map_err(tool_error_from)?; + let body = String::from_utf8(bytes).map_err(tool_error_from)?; Ok(text_result(body)) } } @@ -372,7 +385,7 @@ impl ServerHandler for ProbingMcp { opts: None, }) .await - .map_err(|e| tool_error(e.to_string()))?; + .map_err(tool_error_from)?; let QueryDataFormat::DataFrame(df) = reply else { return Ok(ListResourcesResult { resources: vec![catalog_resource()], @@ -506,7 +519,7 @@ fn text_result(text: String) -> CallToolResult { #[cfg(test)] mod tests { - use super::helpers::ensure_read_only_sql; + use crate::server::sql_guard::ensure_read_only_sql; #[test] fn ensure_read_only_sql_accepts_select() { @@ -517,4 +530,15 @@ mod tests { fn ensure_read_only_sql_rejects_set() { assert!(ensure_read_only_sql("SET probing.sample_rate=0.1").is_err()); } + + #[test] + fn ensure_read_only_sql_rejects_trailing_write() { + assert!(ensure_read_only_sql("SELECT 1; DELETE FROM python.t").is_err()); + assert!(ensure_read_only_sql("SELECT 1; SET probing.sample_rate=0.1").is_err()); + } + + #[test] + fn ensure_read_only_sql_rejects_write_inside_with() { + assert!(ensure_read_only_sql("WITH x AS (DELETE FROM python.t) SELECT 1").is_err()); + } } diff --git a/probing/server/src/mcp/skill_backend.rs b/probing/server/src/mcp/skill_backend.rs new file mode 100644 index 00000000..60d7ae81 --- /dev/null +++ b/probing/server/src/mcp/skill_backend.rs @@ -0,0 +1,76 @@ +//! In-process skill backend for MCP (no HTTP/CLI loopback). + +use async_trait::async_trait; +use probing_core::core::cluster::get_nodes_page; +use probing_proto::prelude::{DataFrame, NodeListResponse, Query, QueryDataFormat}; +use probing_skills::backend::{ClusterQueryMeta, SkillBackend}; +use probing_skills::runner::{Result, SkillRunError}; + +use crate::engine::handle_query; +use crate::server::cluster_fanout::{self, ClusterFanoutScope}; + +use super::helpers; + +pub struct ServerBackend; + +#[async_trait] +impl SkillBackend for ServerBackend { + async fn query_local(&self, sql: &str) -> Result { + let reply = handle_query(Query { + expr: sql.to_string(), + opts: None, + }) + .await + .map_err(|e| SkillRunError(e.to_string()))?; + match reply { + QueryDataFormat::DataFrame(df) => Ok(df), + QueryDataFormat::Nil => Ok(DataFrame::default()), + QueryDataFormat::Error(err) => { + Err(SkillRunError(format!("{:?}: {}", err.code, err.message))) + } + QueryDataFormat::TimeSeries(_) => Err(SkillRunError( + "TimeSeries responses are not supported".into(), + )), + } + } + + async fn cluster_query(&self, sql: &str) -> Result<(DataFrame, Option)> { + let result = cluster_fanout::fanout_query(sql, true, true, ClusterFanoutScope::Auto) + .await + .map_err(|e| SkillRunError(format!("{e:#}")))?; + let meta = ClusterQueryMeta { + partial: result.meta.partial, + nodes_queried: result.meta.nodes_queried, + nodes_failed: result.meta.nodes_failed.clone(), + peer_batches_dropped: result.meta.peer_batches_dropped, + }; + Ok((result.dataframe, Some(meta))) + } + + async fn get(&self, path: &str) -> Result { + if path.contains("/apis/nodes") || path == "/apis/nodes" { + let (version, total, nodes) = + tokio::task::spawn_blocking(|| get_nodes_page(0, 10_000, None)) + .await + .map_err(|e| SkillRunError(e.to_string()))?; + let resp = NodeListResponse { + version, + total, + offset: 0, + nodes, + }; + return serde_json::to_string(&resp).map_err(|e| SkillRunError(e.to_string())); + } + let bytes = helpers::extension_request(path, b"") + .await + .map_err(|e| SkillRunError(e.message.to_string()))?; + String::from_utf8(bytes).map_err(|e| SkillRunError(e.to_string())) + } + + async fn peer_count(&self) -> usize { + match tokio::task::spawn_blocking(|| get_nodes_page(0, 1024, None)).await { + Ok((_, total, _)) => total.saturating_sub(1), + Err(_) => 0, + } + } +} diff --git a/probing/server/src/server/api/response.rs b/probing/server/src/server/api/response.rs index aadecae4..22e5ce12 100644 --- a/probing/server/src/server/api/response.rs +++ b/probing/server/src/server/api/response.rs @@ -28,13 +28,18 @@ pub struct ExtensionRouteSpec { pub response: ResponseMeta, } -static ROUTE_MAP: Lazy> = Lazy::new(build_route_map); +static ROUTE_MAP: Lazy> = Lazy::new(|| { + build_route_map().unwrap_or_else(|e| { + log::error!("failed to build extension route map: {e}; using empty map"); + HashMap::new() + }) +}); -fn build_route_map() -> HashMap { +fn build_route_map() -> Result, String> { let spec: serde_json::Value = serde_json::from_str(include_str!( "../../../../../tests/regression/spec/api_spec.json" )) - .expect("parse api_spec.json"); + .map_err(|e| format!("parse api_spec.json: {e}"))?; let defaults = spec .get("extension_response_defaults") @@ -45,13 +50,17 @@ fn build_route_map() -> HashMap { let ext = spec["routing"]["python_http_extension_name"] .as_str() - .expect("python_http_extension_name"); - for handler in spec["pythonext_handlers"] + .ok_or("missing python_http_extension_name")?; + let handlers = spec["pythonext_handlers"] .as_array() - .expect("pythonext_handlers") - { - let local = handler["local_path"].as_str().expect("local_path"); - let method = handler["method"].as_str().expect("method"); + .ok_or("missing pythonext_handlers")?; + for handler in handlers { + let local = handler["local_path"] + .as_str() + .ok_or("missing local_path in pythonext_handlers entry")?; + let method = handler["method"] + .as_str() + .ok_or("missing method in pythonext_handlers entry")?; let response = handler.get("response").unwrap_or(&defaults); map.insert( format!("{ext}/{local}"), @@ -62,13 +71,17 @@ fn build_route_map() -> HashMap { ); } - for entry in spec["other_extensions"] + let other_extensions = spec["other_extensions"] .as_array() - .expect("other_extensions") - { - let name = entry["extension_name"].as_str().expect("extension_name"); + .ok_or("missing other_extensions")?; + for entry in other_extensions { + let name = entry["extension_name"] + .as_str() + .ok_or("missing extension_name in other_extensions entry")?; let local = entry["local_path"].as_str().unwrap_or(""); - let method = entry["method"].as_str().expect("method"); + let method = entry["method"] + .as_str() + .ok_or("missing method in other_extensions entry")?; let response = entry.get("response").unwrap_or(&defaults); let key = if local.is_empty() { name.to_string() @@ -84,7 +97,7 @@ fn build_route_map() -> HashMap { ); } - map + Ok(map) } fn parse_method(method: &str) -> &'static str { @@ -93,7 +106,10 @@ fn parse_method(method: &str) -> &'static str { "POST" => "POST", "PUT" => "PUT", "DELETE" => "DELETE", - other => panic!("unsupported HTTP method in api_spec.json: {other}"), + other => { + log::error!("unsupported HTTP method in api_spec.json: {other}; defaulting to GET"); + "GET" + } } } @@ -114,7 +130,13 @@ fn parse_response_meta(response: &serde_json::Value, defaults: &serde_json::Valu "application/json" => "application/json", "text/plain" => "text/plain", "text/html" => "text/html", - other => panic!("unsupported extension response content_type: {other}"), + other => { + log::error!( + "unsupported extension response content_type in api_spec.json: {other}; \ + defaulting to text/plain" + ); + "text/plain" + } }, cors, } @@ -241,4 +263,11 @@ mod tests { StatusCode::OK ); } + + #[test] + fn lookup_unknown_path_uses_defaults_without_panic() { + let meta = lookup("/pythonext/does-not-exist"); + assert_eq!(meta.content_type, "text/plain"); + assert!(!meta.cors); + } } diff --git a/probing/server/src/server/cluster_fanout.rs b/probing/server/src/server/cluster_fanout.rs index 550d35f8..d9a15385 100644 --- a/probing/server/src/server/cluster_fanout.rs +++ b/probing/server/src/server/cluster_fanout.rs @@ -18,10 +18,10 @@ use probing_core::core::cluster::{ local_listen_addrs, node_aggregator_peers, }; use probing_core::core::federation::{ - can_fanout_via_global_catalog, cluster_rank_for_endpoint, is_local0_from_env, - remote_fanout_concurrency, remote_query_timeout, reset_fanout_stats, - rewrite_sql_for_global_fanout, take_fanout_stats, validate_global_query, with_fanout_scope, - FanoutScope, + can_fanout_via_global_catalog, cluster_rank_for_endpoint, current_fanout_scope, + enforce_fanout_strict, fanout_strict_enabled, is_local0_from_env, remote_fanout_concurrency, + remote_query_timeout, reset_fanout_stats, rewrite_sql_for_global_fanout, set_fanout_scope, + take_fanout_stats, validate_global_query, FanoutScope, FanoutStats, }; use probing_proto::prelude::*; @@ -49,6 +49,22 @@ pub async fn query_local_df(sql: &str) -> anyhow::Result { } } +struct FanoutScopeGuard(FanoutScope); + +impl Drop for FanoutScopeGuard { + fn drop(&mut self) { + set_fanout_scope(self.0); + } +} + +/// Run a local query with a thread-local fan-out tier, without blocking the async runtime. +async fn query_local_df_in_scope(scope: FanoutScope, sql: &str) -> anyhow::Result { + let previous = current_fanout_scope(); + set_fanout_scope(scope); + let _guard = FanoutScopeGuard(previous); + query_local_df(sql).await +} + pub async fn remote_query_df(addr: &str, sql: &str) -> anyhow::Result { let url = format!("http://{addr}/query"); let request = Message::new(Query { @@ -69,11 +85,28 @@ pub async fn remote_query_df(addr: &str, sql: &str) -> anyhow::Result let status = response.status().as_u16(); let text = response.into_body().read_to_string()?; + parse_remote_query_body(status, &text, addr) +} + +fn parse_remote_query_body(status: u16, text: &str, addr: &str) -> anyhow::Result { if status >= 400 { + if status == 503 && !fanout_strict_enabled() { + if let Ok(df) = decode_query_message_dataframe(text) { + log::warn!("accepted partial 503 dataframe from {addr}"); + return Ok(df); + } + if let Ok(df) = decode_cluster_query_dataframe(text) { + log::warn!("accepted partial 503 cluster response from {addr}"); + return Ok(df); + } + } anyhow::bail!("HTTP {status}: {text}"); } + decode_query_message_dataframe(text) +} - let msg: Message = serde_json::from_str(&text)?; +fn decode_query_message_dataframe(text: &str) -> anyhow::Result { + let msg: Message = serde_json::from_str(text)?; match msg.payload { QueryDataFormat::DataFrame(df) => Ok(df), QueryDataFormat::Nil => Ok(DataFrame { @@ -86,6 +119,17 @@ pub async fn remote_query_df(addr: &str, sql: &str) -> anyhow::Result } } +fn decode_cluster_query_dataframe(text: &str) -> anyhow::Result { + let value: serde_json::Value = serde_json::from_str(text)?; + if let Some(err) = value.get("error").and_then(|v| v.as_str()) { + anyhow::bail!("remote cluster query: {err}"); + } + let df = value + .get("dataframe") + .ok_or_else(|| anyhow::anyhow!("missing dataframe in cluster query response"))?; + Ok(serde_json::from_value(df.clone())?) +} + async fn remote_node_aggregate_df(addr: &str, sql: &str) -> anyhow::Result { let url = format!("http://{addr}/apis/cluster/query"); let body = serde_json::json!({ @@ -110,17 +154,16 @@ async fn remote_node_aggregate_df(addr: &str, sql: &str) -> anyhow::Result= 400 { + if status == 503 && !fanout_strict_enabled() { + if let Ok(df) = decode_cluster_query_dataframe(&text) { + log::warn!("accepted partial 503 node aggregate from {addr}"); + return Ok(df); + } + } anyhow::bail!("HTTP {status}: {text}"); } - let value: serde_json::Value = serde_json::from_str(&text)?; - if let Some(err) = value.get("error").and_then(|v| v.as_str()) { - anyhow::bail!("remote node aggregate: {err}"); - } - let df = value - .get("dataframe") - .ok_or_else(|| anyhow::anyhow!("missing dataframe in node aggregate response"))?; - Ok(serde_json::from_value(df.clone())?) + decode_cluster_query_dataframe(&text) } #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, serde::Serialize, serde::Deserialize)] @@ -180,7 +223,11 @@ impl FanoutMeta { } } -fn finish_fanout(dataframe: DataFrame, mut meta: FanoutMeta, context: &str) -> FanoutQueryResponse { +fn finish_fanout( + dataframe: DataFrame, + mut meta: FanoutMeta, + context: &str, +) -> anyhow::Result { meta.finalize(); if meta.partial { log::warn!( @@ -189,8 +236,14 @@ fn finish_fanout(dataframe: DataFrame, mut meta: FanoutMeta, context: &str) -> F meta.nodes_failed.len(), meta.peer_batches_dropped, ); + let stats = FanoutStats { + nodes_succeeded: meta.nodes_queried.saturating_sub(meta.nodes_failed.len()), + nodes_failed: meta.nodes_failed.clone(), + peer_batches_dropped: meta.peer_batches_dropped, + }; + enforce_fanout_strict(&stats).map_err(|e| anyhow::anyhow!("{e}"))?; } - FanoutQueryResponse { dataframe, meta } + Ok(FanoutQueryResponse { dataframe, meta }) } async fn fanout_remote_plain( @@ -247,7 +300,7 @@ fn require_hierarchical_metadata() -> anyhow::Result<()> { if hierarchical_metadata_available() { Ok(()) } else { - Err(hierarchical_metadata_unavailable_err()) + Err(hierarchical_metadata_unavailable_err().into()) } } @@ -293,7 +346,7 @@ pub async fn fanout_query( match resolved_scope { ClusterFanoutScope::Local => { let dataframe = query_local_df(sql).await?; - Ok(finish_fanout( + finish_fanout( dataframe, FanoutMeta { cluster: true, @@ -307,7 +360,7 @@ pub async fn fanout_query( partial: false, }, "local", - )) + ) } ClusterFanoutScope::Node => fanout_node_tier(sql, hierarchical).await, ClusterFanoutScope::Coordinator => fanout_coordinator_tier(sql, hierarchical).await, @@ -319,7 +372,7 @@ pub async fn fanout_query( async fn fanout_node_tier(sql: &str, hierarchical: bool) -> anyhow::Result { if !is_local0_from_env() { let dataframe = query_local_df(sql).await?; - return Ok(finish_fanout( + return finish_fanout( dataframe, FanoutMeta { cluster: true, @@ -333,7 +386,7 @@ async fn fanout_node_tier(sql: &str, hierarchical: bool) -> anyhow::Result anyhow::Result anyhow::Result { - log::warn!("local leaf fan-out {} failed: {err}", node.addr); - nodes_failed.push(node.addr); + log::warn!("local leaf fan-out {} failed: {err:#}", node.addr); + nodes_failed.push(format!("{}: {err:#}", node.addr)); } } } - Ok(finish_fanout( + finish_fanout( merge_tagged_dataframes(&parts), FanoutMeta { cluster: true, @@ -391,7 +440,7 @@ async fn fanout_node_tier(sql: &str, hierarchical: bool) -> anyhow::Result { - log::warn!("node aggregator fan-out {} failed: {err}", node.addr); - meta.nodes_failed.push(node.addr); + log::warn!("node aggregator fan-out {} failed: {err:#}", node.addr); + meta.nodes_failed.push(format!("{}: {err:#}", node.addr)); } } } - return Ok(finish_fanout( + return finish_fanout( merge_tagged_dataframes(&parts), meta, "coordinator-broadcast", - )); + ); } let host = local_host_label(); let addr = probing_core::core::cluster::local_addr_label(); let local_rank = cluster_rank_for_endpoint(&host, &addr); let mut parts = vec![tag_dataframe( - with_fanout_scope(FanoutScope::Local, || { - tokio::task::block_in_place(|| { - tokio::runtime::Handle::current().block_on(query_local_df(sql)) - }) - })?, + query_local_df_in_scope(FanoutScope::Local, sql).await?, &host, &addr, local_rank, @@ -565,13 +606,13 @@ async fn broadcast_fanout_query( nodes_queried += 1; } Err(err) => { - log::warn!("cluster fan-out {} failed: {err}", node.addr); - nodes_failed.push(node.addr); + log::warn!("cluster fan-out {} failed: {err:#}", node.addr); + nodes_failed.push(format!("{}: {err:#}", node.addr)); } } } - Ok(finish_fanout( + finish_fanout( merge_tagged_dataframes(&parts), FanoutMeta { cluster: true, @@ -593,7 +634,7 @@ async fn broadcast_fanout_query( partial: false, }, "broadcast", - )) + ) } fn tag_dataframe(mut df: DataFrame, host: &str, addr: &str, rank: Option) -> DataFrame { diff --git a/probing/server/src/server/cluster_query.rs b/probing/server/src/server/cluster_query.rs index 578593ce..0475041d 100644 --- a/probing/server/src/server/cluster_query.rs +++ b/probing/server/src/server/cluster_query.rs @@ -1,10 +1,13 @@ //! HTTP handler for on-demand cluster SQL fan-out. +use axum::http::StatusCode; +use axum::response::IntoResponse; use axum::Json; use serde::{Deserialize, Serialize}; use super::cluster_fanout::{self, ClusterFanoutScope, FanoutQueryResponse}; -use super::error::ApiResult; +use super::error::ApiError; +use super::sql_guard::ensure_read_only_sql; use probing_core::core::cluster::is_hierarchical_metadata_unavailable; use probing_core::core::federation::validate_global_query; @@ -40,24 +43,36 @@ impl From for ClusterQueryResponse { } } -pub async fn post_cluster_query( - Json(body): Json, -) -> ApiResult> { +pub async fn post_cluster_query(Json(body): Json) -> impl IntoResponse { if let Some(msg) = crate::engine_lifecycle::engine_not_ready_message() { - return Err(super::error::ApiError::service_unavailable(msg)); + return ApiError::service_unavailable(msg).into_response(); } let expr = body.expr.trim(); if expr.is_empty() { - return Err(super::error::ApiError::bad_request( - "missing SQL expression", - )); + return ApiError::bad_request("missing SQL expression").into_response(); + } + if let Err(msg) = ensure_read_only_sql(expr) { + return ApiError::bad_request(msg).into_response(); + } + if body.cluster { + if let Err(e) = validate_global_query(expr) { + return ApiError::bad_request(format!("{e:#}")).into_response(); + } } - validate_global_query(expr).map_err(|e| super::error::ApiError::bad_request(e.to_string()))?; match cluster_fanout::fanout_query(expr, body.cluster, body.hierarchical, body.scope).await { - Ok(result) => Ok(Json(result.into())), + Ok(result) => { + let partial = result.meta.partial; + let response = ClusterQueryResponse::from(result); + let status = if partial { + StatusCode::SERVICE_UNAVAILABLE + } else { + StatusCode::OK + }; + (status, Json(response)).into_response() + } Err(err) if is_hierarchical_metadata_unavailable(&err) => { - Err(super::error::ApiError::service_unavailable(err.to_string())) + ApiError::service_unavailable(format!("{err:#}")).into_response() } - Err(err) => Err(err.into()), + Err(err) => ApiError::from(err).into_response(), } } diff --git a/probing/server/src/server/error.rs b/probing/server/src/server/error.rs index fa7b69d2..d2b150f1 100644 --- a/probing/server/src/server/error.rs +++ b/probing/server/src/server/error.rs @@ -81,7 +81,8 @@ where E: Into, { fn from(err: E) -> Self { - Self::internal(err.into().to_string()) + let err = err.into(); + Self::internal(format!("{err:#}")) } } diff --git a/probing/server/src/server/middleware.rs b/probing/server/src/server/middleware.rs index a626847f..bbeb3d85 100644 --- a/probing/server/src/server/middleware.rs +++ b/probing/server/src/server/middleware.rs @@ -70,11 +70,7 @@ pub async fn request_size_limit_middleware(request: Request, next: Next) -> Resp Ok(bytes) => bytes, Err(e) => { log::warn!("Request body collection failed: {e}"); - return ( - StatusCode::PAYLOAD_TOO_LARGE, - format!("Request body too large (max {max_size} bytes allowed)"), - ) - .into_response(); + return (StatusCode::PAYLOAD_TOO_LARGE, e).into_response(); } }; @@ -87,15 +83,18 @@ pub async fn request_size_limit_middleware(request: Request, next: Next) -> Resp } /// Collect body bytes with a size limit using BodyExt::collect() -async fn collect_body_with_limit(body: Body, limit: usize) -> Result { - // Use BodyExt::collect() which is already available - let collected = body.collect().await.map_err(|_| "Failed to collect body")?; +async fn collect_body_with_limit(body: Body, limit: usize) -> Result { + let collected = body + .collect() + .await + .map_err(|e| format!("failed to collect request body: {e}"))?; let bytes = collected.to_bytes(); - // Check size limit if bytes.len() > limit { - return Err("Request body size limit exceeded"); + return Err(format!( + "request body size limit exceeded (max {limit} bytes)" + )); } Ok(bytes) diff --git a/probing/server/src/server/mod.rs b/probing/server/src/server/mod.rs index f6216d80..61d14680 100644 --- a/probing/server/src/server/mod.rs +++ b/probing/server/src/server/mod.rs @@ -3,6 +3,7 @@ mod query_dto; mod repl; mod runtime; mod spa; +pub mod sql_guard; pub use runtime::SERVER_RUNTIME; @@ -38,6 +39,7 @@ pub const TOP_LEVEL_ROUTES: &[(&str, &str)] = &[ ("POST", "/query/dto"), ("GET", "/config/{config_key}"), ("GET", "/ws"), + ("POST", "/mcp"), ]; async fn get_config_value_handler( @@ -120,8 +122,19 @@ pub async fn local_server() -> Result<()> { Ok(()) } +async fn run_local_server() { + if let Err(err) = local_server().await { + error!("local HTTP server exited: {err:#}"); + crate::engine_lifecycle::mark_engine_failed(format!("local server: {err:#}")); + if crate::engine_lifecycle::engine_fail_fast_enabled() { + error!("PROBING_ENGINE_FAIL_FAST=1 — exiting after local server failure"); + std::process::exit(1); + } + } +} + pub fn start_local() { - SERVER_RUNTIME.block_on(async move { + if let Err(err) = probing_core::runtime::block_on(async move { match initialize_engine().await { Ok(()) => { log::info!("probing engine initialized"); @@ -136,9 +149,16 @@ pub fn start_local() { } } } - }); + }) { + error!("probing runtime unavailable during engine init: {err}"); + crate::engine_lifecycle::mark_engine_failed(err.to_string()); + if crate::engine_lifecycle::engine_fail_fast_enabled() { + error!("PROBING_ENGINE_FAIL_FAST=1 — exiting"); + std::process::exit(1); + } + } SERVER_RUNTIME.spawn(async move { - let _ = local_server().await; + run_local_server().await; }); } @@ -146,6 +166,8 @@ pub async fn remote_server(addr: Option) -> Result<()> { let addr = addr.unwrap_or_else(|| "0.0.0.0:0".to_string()); log::info!("Starting probe server at {addr}"); + crate::auth::bootstrap_auth_from_env().await; + let app = build_app(true); let listener = tokio::net::TcpListener::bind(addr).await?; @@ -168,9 +190,20 @@ pub async fn remote_server(addr: Option) -> Result<()> { Ok(()) } +async fn run_remote_server(addr: Option) { + if let Err(err) = remote_server(addr).await { + error!("remote HTTP server exited: {err:#}"); + crate::engine_lifecycle::mark_engine_failed(format!("remote server: {err:#}")); + if crate::engine_lifecycle::engine_fail_fast_enabled() { + error!("PROBING_ENGINE_FAIL_FAST=1 — exiting after remote server failure"); + std::process::exit(1); + } + } +} + pub fn start_remote(addr: Option) { SERVER_RUNTIME.spawn(async move { - let _ = remote_server(addr).await; + run_remote_server(addr).await; }); } diff --git a/probing/server/src/server/query_dto.rs b/probing/server/src/server/query_dto.rs index d18f036d..08300689 100644 --- a/probing/server/src/server/query_dto.rs +++ b/probing/server/src/server/query_dto.rs @@ -9,6 +9,8 @@ use probing_proto::protocol::message::Message; use probing_proto::protocol::query::{Data as ProtoData, Query as ProtoQuery}; use serde_json; +use crate::server::error::ApiError; + /// HTTP handler wrapper for query endpoint with DTO interface /// This provides a stable external API while keeping the internal implementation unchanged #[axum::debug_handler] @@ -24,6 +26,10 @@ pub async fn query_dto( async fn handle_query_dto( request_dto: probing_proto::dto::query::QueryRequestDto, ) -> impl IntoResponse { + if let Some(msg) = crate::engine_lifecycle::engine_not_ready_message() { + return convert_engine_error_to_dto(ApiError::service_unavailable(msg)).await; + } + // Convert DTO to internal Query structure let query: ProtoQuery = request_dto.into(); @@ -57,6 +63,31 @@ async fn convert_engine_response_to_dto( // Parse the response to convert to DTO format match serde_json::from_str::>(&response_json) { Ok(message_response) => { + if let ProtoData::Error(err) = &message_response.payload { + let status = engine_error_status(err); + let error_response = probing_proto::dto::query::QueryResponseDto::error( + api_error_code(status).to_string(), + format!("{:?}: {}", err.code, err.message), + ); + return match serde_json::to_string(&error_response) { + Ok(error_json) => (status, error_json).into_response(), + Err(e) => ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Failed to serialize error response: {}", e), + ) + .into_response(), + }; + } + + let meta_partial = message_response + .meta + .as_ref() + .and_then(|m| m.get("fanout")) + .and_then(|f| f.get("partial")) + .and_then(|v| v.as_bool()) + .unwrap_or(false); + let partial = partial || meta_partial; + let response_dto = probing_proto::dto::query::QueryResponseDto::success( message_response.payload.into(), ); @@ -85,17 +116,25 @@ async fn convert_engine_response_to_dto( } } +fn engine_error_status(err: &probing_proto::protocol::query::QueryError) -> StatusCode { + use probing_proto::protocol::query::ErrorCode; + match err.code { + ErrorCode::NotFound => StatusCode::NOT_FOUND, + ErrorCode::ParseError | ErrorCode::PermissionDenied => StatusCode::BAD_REQUEST, + ErrorCode::TimeoutError | ErrorCode::ResourceExhausted => StatusCode::SERVICE_UNAVAILABLE, + ErrorCode::ExecutionError | ErrorCode::Internal => StatusCode::INTERNAL_SERVER_ERROR, + } +} + /// Convert engine error to DTO error response -async fn convert_engine_error_to_dto( - api_error: crate::server::error::ApiError, -) -> axum::response::Response { - // Convert ApiError to DTO error response +async fn convert_engine_error_to_dto(api_error: ApiError) -> axum::response::Response { + let status = api_error.status(); let error_response = probing_proto::dto::query::QueryResponseDto::error( - "INTERNAL_ERROR".to_string(), + api_error_code(status).to_string(), format!("Engine error: {api_error}"), ); match serde_json::to_string(&error_response) { - Ok(error_json) => (StatusCode::INTERNAL_SERVER_ERROR, error_json).into_response(), + Ok(error_json) => (status, error_json).into_response(), Err(e) => ( StatusCode::INTERNAL_SERVER_ERROR, format!("Failed to serialize error response: {}", e), @@ -103,3 +142,53 @@ async fn convert_engine_error_to_dto( .into_response(), } } + +fn api_error_code(status: StatusCode) -> &'static str { + match status { + StatusCode::BAD_REQUEST => "BAD_REQUEST", + StatusCode::NOT_FOUND => "NOT_FOUND", + StatusCode::SERVICE_UNAVAILABLE => "SERVICE_UNAVAILABLE", + StatusCode::BAD_GATEWAY => "BAD_GATEWAY", + StatusCode::METHOD_NOT_ALLOWED => "METHOD_NOT_ALLOWED", + StatusCode::PAYLOAD_TOO_LARGE => "PAYLOAD_TOO_LARGE", + _ => "INTERNAL_ERROR", + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::server::error::ApiError; + use probing_proto::protocol::query::{ErrorCode, QueryError}; + + #[test] + fn api_error_code_maps_known_statuses() { + assert_eq!(api_error_code(StatusCode::BAD_REQUEST), "BAD_REQUEST"); + assert_eq!(api_error_code(StatusCode::NOT_FOUND), "NOT_FOUND"); + assert_eq!( + api_error_code(StatusCode::SERVICE_UNAVAILABLE), + "SERVICE_UNAVAILABLE" + ); + assert_eq!( + api_error_code(StatusCode::INTERNAL_SERVER_ERROR), + "INTERNAL_ERROR" + ); + } + + #[test] + fn convert_engine_error_preserves_status_code() { + let err = ApiError::not_found("missing table"); + assert_eq!(err.status(), StatusCode::NOT_FOUND); + assert_eq!(api_error_code(err.status()), "NOT_FOUND"); + } + + #[test] + fn engine_error_status_maps_not_found() { + let err = QueryError { + code: ErrorCode::NotFound, + message: "missing table".into(), + details: None, + }; + assert_eq!(engine_error_status(&err), StatusCode::NOT_FOUND); + } +} diff --git a/probing/server/src/server/sql_guard.rs b/probing/server/src/server/sql_guard.rs new file mode 100644 index 00000000..a75b9fc6 --- /dev/null +++ b/probing/server/src/server/sql_guard.rs @@ -0,0 +1,90 @@ +//! Read-only SQL validation for HTTP and MCP query surfaces. + +use datafusion::sql::sqlparser::ast::{Query, SetExpr, Statement}; +use datafusion::sql::sqlparser::dialect::GenericDialect; +use datafusion::sql::sqlparser::parser::Parser; + +/// Reject write statements and multi-statement batches containing writes. +pub fn ensure_read_only_sql(sql: &str) -> Result<(), String> { + let trimmed = sql.trim(); + if trimmed.is_empty() { + return Err("SQL must not be empty".to_string()); + } + + let dialect = GenericDialect {}; + let statements = + Parser::parse_sql(&dialect, trimmed).map_err(|e| format!("invalid SQL: {e}"))?; + if statements.is_empty() { + return Err("SQL must not be empty".to_string()); + } + + for stmt in &statements { + if !statement_is_read_only(stmt) { + return Err( + "Only read-only SQL is allowed (SELECT/WITH/SHOW/DESCRIBE/EXPLAIN)".to_string(), + ); + } + } + Ok(()) +} + +fn statement_is_read_only(stmt: &Statement) -> bool { + match stmt { + Statement::Query(query) => query_is_read_only(query), + Statement::Explain { .. } | Statement::ExplainTable { .. } => true, + Statement::ShowTables { .. } + | Statement::ShowColumns { .. } + | Statement::ShowCreate { .. } + | Statement::ShowFunctions { .. } + | Statement::ShowVariable { .. } + | Statement::ShowVariables { .. } + | Statement::ShowStatus { .. } => true, + _ => false, + } +} + +fn query_is_read_only(query: &Query) -> bool { + if let Some(with) = &query.with { + for cte in &with.cte_tables { + if !query_is_read_only(&cte.query) { + return false; + } + } + } + set_expr_is_read_only(query.body.as_ref()) +} + +fn set_expr_is_read_only(expr: &SetExpr) -> bool { + match expr { + SetExpr::Select(_) | SetExpr::Values(_) | SetExpr::Table(_) => true, + SetExpr::Query(query) => query_is_read_only(query), + SetExpr::SetOperation { left, right, .. } => { + set_expr_is_read_only(left) && set_expr_is_read_only(right) + } + SetExpr::Insert(_) | SetExpr::Update(_) | SetExpr::Delete(_) => false, + _ => false, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn accepts_select_and_with() { + assert!(ensure_read_only_sql("SELECT 1").is_ok()); + assert!(ensure_read_only_sql("WITH x AS (SELECT 1) SELECT * FROM x").is_ok()); + assert!(ensure_read_only_sql("SELECT 1; SELECT 2").is_ok()); + } + + #[test] + fn rejects_trailing_write() { + assert!(ensure_read_only_sql("SELECT 1; DELETE FROM t").is_err()); + assert!(ensure_read_only_sql("SET probing.sample_rate=0.1").is_err()); + } + + #[test] + fn rejects_write_inside_with_cte() { + assert!(ensure_read_only_sql("WITH x AS (DELETE FROM python.t) SELECT 1").is_err()); + } +} diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index fbd27210..4e72b1f9 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -4,12 +4,14 @@ use std::collections::HashSet; +use axum::http::StatusCode; +use axum::response::IntoResponse; use axum::Json; use probing_proto::prelude::*; use serde::{Deserialize, Serialize}; use super::cluster_fanout; -use super::error::ApiResult; +use super::error::ApiError; const STEP_MATRIX_SQL: &str = r#" SELECT @@ -52,25 +54,34 @@ pub struct StepMatrixResponse { pub rank_count: usize, pub step_count: usize, pub cluster: bool, + /// True when cluster fan-out returned partial data (some peers failed); HTTP 503 when set. + pub partial: bool, pub nodes_queried: usize, pub nodes_failed: Vec, } pub async fn get_step_matrix( axum::extract::Query(params): axum::extract::Query, -) -> ApiResult> { +) -> impl IntoResponse { + if let Some(msg) = crate::engine_lifecycle::engine_not_ready_message() { + return ApiError::service_unavailable(msg).into_response(); + } let step_window = params.limit.unwrap_or(STEP_WINDOW).clamp(1, 5_000); let cluster = params.cluster.unwrap_or(false); - // Fetch all completed train.step pairs; aggregate to unique local_step in Rust. let sql = STEP_MATRIX_SQL.to_string(); - let fanout = cluster_fanout::fanout_query( + let fanout = match cluster_fanout::fanout_query( &sql, cluster, true, cluster_fanout::ClusterFanoutScope::Auto, ) - .await?; + .await + { + Ok(f) => f, + Err(err) => return ApiError::from(err).into_response(), + }; + let partial = fanout.meta.partial; let host = crate::report::get_hostname().unwrap_or_else(|_| "localhost".into()); let addr = probing_core::core::cluster::local_addr_label(); let samples = @@ -83,14 +94,21 @@ pub async fn get_step_matrix( .collect::>() .len(); - Ok(Json(StepMatrixResponse { + let response = StepMatrixResponse { samples, rank_count, step_count, cluster, + partial, nodes_queried: fanout.meta.nodes_queried, nodes_failed: fanout.meta.nodes_failed, - })) + }; + let status = if partial { + StatusCode::SERVICE_UNAVAILABLE + } else { + StatusCode::OK + }; + (status, Json(response)).into_response() } #[derive(Debug, Clone)] diff --git a/probing/server/src/torchrun_cluster.rs b/probing/server/src/torchrun_cluster.rs index c0ed4bee..8482f71c 100644 --- a/probing/server/src/torchrun_cluster.rs +++ b/probing/server/src/torchrun_cluster.rs @@ -28,6 +28,7 @@ use crate::report::{build_local_node, get_hostname}; use crate::server::SERVER_RUNTIME; use crate::start_remote; use crate::vars::read_probing_address; +use probing_core::runtime::block_on; static STARTED: AtomicBool = AtomicBool::new(false); static CLUSTER_VERSION: AtomicU64 = AtomicU64::new(0); @@ -353,7 +354,13 @@ fn nodes_for_upstream_report() -> Vec { return vec![build_torchrun_node()]; } let local_base = local_http_base(); - let store_nodes = fetch_nodes_blocking(&local_base).unwrap_or_default(); + let store_nodes = match fetch_nodes_blocking(&local_base) { + Ok(nodes) => nodes, + Err(err) => { + log::warn!("probing torchrun: fetch local nodes from {local_base} failed: {err:#}"); + return vec![build_torchrun_node()]; + } + }; let leaves = local_leaf_nodes(&store_nodes); if leaves.is_empty() { vec![build_torchrun_node()] @@ -379,10 +386,14 @@ fn ensure_master_info() -> bool { return true; } let timeout = Duration::from_secs_f64(discover_timeout_secs()); - if let Some(info) = SERVER_RUNTIME.block_on(poll_master_info(timeout)) { + if let Ok(Some(info)) = block_on(poll_master_info(timeout)) { *lock_mutex(&MASTER_INFO, "torchrun MASTER_INFO") = Some(info); return true; } + log::warn!( + "probing torchrun: master info discovery timed out after {:.1}s", + discover_timeout_secs() + ); false } @@ -394,10 +405,14 @@ fn ensure_local0_parent() -> bool { return true; } let timeout = Duration::from_secs_f64(discover_timeout_secs()); - if let Some(base) = SERVER_RUNTIME.block_on(poll_local0_parent(timeout)) { + if let Ok(Some(base)) = block_on(poll_local0_parent(timeout)) { *lock_mutex(&LOCAL0_PARENT, "torchrun LOCAL0_PARENT") = Some(base); return true; } + log::warn!( + "probing torchrun: local0 parent discovery timed out after {:.1}s", + discover_timeout_secs() + ); false } @@ -459,8 +474,12 @@ async fn torchrun_setup() -> Result<()> { return Ok(()); } - publish_master().await.ok(); - publish_local0().await.ok(); + if let Err(err) = publish_master().await { + log::warn!("probing torchrun: publish_master failed: {err:#}"); + } + if let Err(err) = publish_local0().await { + log::warn!("probing torchrun: publish_local0 failed: {err:#}"); + } if !cluster_report_enabled() { log::info!("probing torchrun: periodic cluster report disabled (PROBING_CLUSTER_REPORT=0)"); diff --git a/pyproject.toml b/pyproject.toml index eadb8415..03f95ae9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -122,6 +122,7 @@ cargo-extra-args = "--features extension-module,gpu,kmsg" include = [ "probing.pth", "probing_hook.py", + "probing/**/*.py", "probing/libs/*", "probing/bundled_skills/**", "probing/bundled_web/**", diff --git a/python/probing/bundled_skills/health_overview/SKILL.md b/python/probing/bundled_skills/health_overview/SKILL.md index dd3bdc0e..be22d405 100644 --- a/python/probing/bundled_skills/health_overview/SKILL.md +++ b/python/probing/bundled_skills/health_overview/SKILL.md @@ -1,9 +1,9 @@ --- name: health_overview description: > - One-shot health check: CPU, GPU, tables, recent training activity + One-shot health check: CPU, GPU, tables, torch step progress, TorchProbe overhead, cluster nodes, NCCL profiler health category: triage -tables: [cpu.utilization, gpu.utilization, python.torch_trace, cluster.nodes] +tables: [cpu.utilization, gpu.utilization, python.torch_trace, python.torch_step_timing, cluster.nodes, nccl.profiler_counters] tags: [overview, doctor, triage, 健康检查] keywords: en: ['health', 'overview', 'status', 'doctor', 'checkup'] @@ -14,15 +14,25 @@ parameters: # Training health overview -快速扫描目标进程:有哪些表、CPU/GPU 最近采样、训练是否在推进。 +快速扫描目标进程:有哪些表、CPU/GPU 最近采样、训练是否在推进、TorchProbe shadow 开销、集群节点与 NCCL profiler 计数器。 适合作为 agent 的默认第一步,或用户不确定从哪查起时使用。 ## Parameters - `sample_limit` (integer, default `5`): Recent CPU/GPU samples to show +## Steps (summary) + +1. `available_tables` — `information_schema` 可见表 +2. `host_cpu` / `gpu_mem` — 最近 CPU/GPU 采样 +3. `latest_torch_step` — `python.torch_trace` 最新 `local_step` +4. `torch_probe_overhead` — `python.torch_step_timing` dispatch/hook tax(80-step 窗口) +5. `cluster_nodes` — `cluster.nodes` 存活(若有) +6. `nccl_data_integrity` — `nccl.profiler_counters` 最新一行(若有 NCCL profiler) + ## Related skills - 训练变慢 → skill: module_bottleneck 或 slow_rank - 显存上涨 → skill: memory_leak - 进程卡住 → skill: training_hang +- NCCL watchdog → skill: watchdog_timeout diff --git a/python/probing/bundled_skills/health_overview/steps.yaml b/python/probing/bundled_skills/health_overview/steps.yaml index e7d43713..a9da51f8 100644 --- a/python/probing/bundled_skills/health_overview/steps.yaml +++ b/python/probing/bundled_skills/health_overview/steps.yaml @@ -70,18 +70,26 @@ spec: title: "TorchProbe 运行时开销 (shadow step)" type: sql sql: | + WITH bounds AS ( + SELECT GREATEST(COALESCE(MAX(CAST(local_step AS BIGINT)), 0) - 80, 1) AS win_start + FROM python.torch_step_timing + ) SELECT + round((median(CASE WHEN CAST(is_shadow AS BIGINT) = 0 AND CAST(sampled AS BIGINT) = 0 THEN CAST(step_duration_sec AS DOUBLE) END) + / nullif(median(CASE WHEN CAST(is_shadow AS BIGINT) = 1 THEN CAST(step_duration_sec AS DOUBLE) END), 0) - 1) * 100, 2) + AS dispatch_overhead_pct, round((median(CASE WHEN CAST(is_shadow AS BIGINT) = 0 THEN CAST(step_duration_sec AS DOUBLE) END) / nullif(median(CASE WHEN CAST(is_shadow AS BIGINT) = 1 THEN CAST(step_duration_sec AS DOUBLE) END), 0) - 1) * 100, 2) AS hook_tax_pct, round((median(CASE WHEN CAST(is_shadow AS BIGINT) = 0 AND CAST(sampled AS BIGINT) = 1 THEN CAST(step_duration_sec AS DOUBLE) END) / nullif(median(CASE WHEN CAST(is_shadow AS BIGINT) = 1 THEN CAST(step_duration_sec AS DOUBLE) END), 0) - 1) * 100, 2) AS sampled_overhead_pct, + sum(CASE WHEN CAST(is_shadow AS BIGINT) = 0 AND CAST(sampled AS BIGINT) = 0 THEN 1 ELSE 0 END) AS dispatch_n, sum(CASE WHEN CAST(is_shadow AS BIGINT) = 0 THEN 1 ELSE 0 END) AS probed_n, sum(CASE WHEN CAST(is_shadow AS BIGINT) = 1 THEN 1 ELSE 0 END) AS shadow_n, max(CAST(shadow_baseline AS BIGINT)) AS shadow_baseline - FROM python.torch_step_timing - WHERE local_step > 1 + FROM python.torch_step_timing, bounds + WHERE CAST(local_step AS BIGINT) >= bounds.win_start AND CAST(local_step AS BIGINT) > 1 on_empty: skip empty_message: "python.torch_step_timing 无数据 — 设置 probing.torch.profiling=on 并等待 shadow 周期" @@ -153,20 +161,25 @@ spec: message: "TorchProbe shadow 基线已关闭 (shadow=off) — 无法估算运行时开销" - id: torch_overhead_high - when: "step:torch_probe_overhead | column:hook_tax_pct | value > 5" + when: "step:torch_probe_overhead | column:dispatch_overhead_pct | value > 5" severity: warning - message: "TorchProbe hook 开销约 {hook_tax_pct}%(相对 shadow step 中位数)" + message: "TorchProbe dispatch 开销约 {dispatch_overhead_pct}%(非采样 probed vs shadow 中位数,最近 80 步)" + + - id: torch_overhead_blended_high + when: "step:torch_probe_overhead | column:hook_tax_pct | value > 5" + severity: info + message: "混合 hook 开销 {hook_tax_pct}%(含采样步,可能高于 dispatch {dispatch_overhead_pct}%)" - id: torch_overhead_low_samples - when: "step:torch_probe_overhead | column:shadow_n | value < 3" + when: "step:torch_probe_overhead | column:shadow_n | value < 5" severity: info - message: "Shadow 基线样本不足 — 开销估算仅供参考 (shadow_n={shadow_n})" + message: "Shadow 基线样本不足 — 开销估算仅供参考 (shadow_n={shadow_n}, dispatch_n={dispatch_n})" summary_template: | ## 健康概览 - 可用表: {available_tables.row_count} 张 - 最新训练 step: {latest_torch_step.latest_step} - - TorchProbe hook 开销: {torch_probe_overhead.hook_tax_pct}% (shadow_n={torch_probe_overhead.shadow_n}) + - TorchProbe dispatch 开销: {torch_probe_overhead.dispatch_overhead_pct}% (shadow_n={torch_probe_overhead.shadow_n}, dispatch_n={torch_probe_overhead.dispatch_n}) - 集群节点: {cluster_nodes.row_count} 个(0 表示单机) - NCCL 完整性: 见 nccl_data_integrity(pool_exhausted / ring 覆写) diff --git a/python/probing/bundled_skills/sre_triage/steps.yaml b/python/probing/bundled_skills/sre_triage/steps.yaml index e1265406..35dc27d1 100644 --- a/python/probing/bundled_skills/sre_triage/steps.yaml +++ b/python/probing/bundled_skills/sre_triage/steps.yaml @@ -237,9 +237,9 @@ spec: interpretation: rules: - id: cluster_unhealthy - when: "step:cluster_nodes | column:status | any_not_equal('alive')" + when: "step:cluster_nodes | column:status | any_contains('dead')" severity: warning - message: "存在非 alive 节点 — 优先确认 rank 是否退出、心跳是否中断" + message: "存在 dead 节点 — 优先确认 rank 是否退出、心跳是否中断" - id: collective_desync when: "step:flight_recorder_alignment | rows > 0" diff --git a/python/probing/bundled_skills/watchdog_timeout/steps.yaml b/python/probing/bundled_skills/watchdog_timeout/steps.yaml index cfff4c02..b47d5328 100644 --- a/python/probing/bundled_skills/watchdog_timeout/steps.yaml +++ b/python/probing/bundled_skills/watchdog_timeout/steps.yaml @@ -207,17 +207,17 @@ spec: interpretation: rules: - id: missing_rank - when: "step:collective_alignment | column:ranks_seen | any_lt(column:expected_world_size)" + when: "step:collective_alignment | rows >= 1" severity: warning - message: "某些 collective seq 缺少 rank — 常见于 CPU-side hang、rank 分支发散或某 rank 提前退出" + message: "collective 对齐异常(rank 缺失、op/shape/dtype/state 不一致)— 见 collective_alignment 表各行" - id: op_mismatch - when: "step:collective_alignment | columns:op_min,op_max | any_not_equal" + when: "step:collective_alignment | rows >= 1" severity: warning message: "同一 seq 上 collective 类型不一致 — 检查各 rank 控制流和 process group 使用" - id: shape_dtype_mismatch - when: "step:collective_alignment | columns:input_sizes_min,input_sizes_max,input_dtypes_min,input_dtypes_max | any_not_equal" + when: "step:collective_alignment | rows >= 1" severity: warning message: "collective 输入 shape/dtype 不一致 — 常见于 all_to_all split 或动态 shape 发散" diff --git a/python/probing/dev_pth.py b/python/probing/dev_pth.py index 1012e615..e1d85698 100644 --- a/python/probing/dev_pth.py +++ b/python/probing/dev_pth.py @@ -13,20 +13,34 @@ from pathlib import Path HOOK_PTH_NAME = "probing_hook.pth" -HOOK_PTH_LINE = "import probing_hook\n" def repo_python_dir() -> Path: return Path(__file__).resolve().parents[1] +def hook_pth_line() -> str: + """Single executable .pth line: repo ``python/`` then ``import probing_hook``. + + During ``maturin develop`` pip may reload site with ``probing_hook.pth`` still + present while ``probing_hook.py`` was removed from site-packages — embedding the + repo path avoids ``ModuleNotFoundError`` in that window. + """ + root = str(repo_python_dir()) + return f"import sys; sys.path.insert(0, {root!r}); import probing_hook\n" + + +# Kept for tests / docs that assert the shape of the line. +HOOK_PTH_LINE_PREFIX = "import sys; sys.path.insert(0, " + + def hook_pth_path() -> Path: return Path(site.getsitepackages()[0]) / HOOK_PTH_NAME def install_dev_hook() -> Path: target = hook_pth_path() - target.write_text(HOOK_PTH_LINE, encoding="utf-8") + target.write_text(hook_pth_line(), encoding="utf-8") return target @@ -40,7 +54,7 @@ def remove_dev_hook() -> bool: def is_dev_hook_installed() -> bool: target = hook_pth_path() - return target.is_file() and target.read_text(encoding="utf-8") == HOOK_PTH_LINE + return target.is_file() and target.read_text(encoding="utf-8") == hook_pth_line() def main(argv: list[str] | None = None) -> int: diff --git a/python/probing/handlers/pythonext.py b/python/probing/handlers/pythonext.py index 4167460b..b100c1e0 100644 --- a/python/probing/handlers/pythonext.py +++ b/python/probing/handlers/pythonext.py @@ -6,12 +6,15 @@ import io import json +import logging import sys import traceback from typing import Dict, List, Optional from probing.handlers.router import ext_handler, handle_request +log = logging.getLogger(__name__) + @ext_handler("pythonext", "callstack") def get_callstack(tid: Optional[int] = None, mode: Optional[str] = None) -> str: @@ -290,7 +293,7 @@ def get_chrome_tracing(limit: int = 1000) -> str: chrome_event["args"] = json.loads( row.get("event_attributes") ) - except: + except (json.JSONDecodeError, TypeError, ValueError): pass trace_events.append(chrome_event) @@ -673,7 +676,8 @@ def get_trace_variables(function: Optional[str] = None, limit: int = 100) -> str try: df = probing.query(query) break - except: + except Exception as e: + log.debug("trace_variables query failed: %s", e) continue if df is None: diff --git a/python/probing/hooks/import_hook.py b/python/probing/hooks/import_hook.py index 01291fbe..759a3e6c 100644 --- a/python/probing/hooks/import_hook.py +++ b/python/probing/hooks/import_hook.py @@ -7,8 +7,11 @@ import importlib.abc import importlib.util +import logging import sys +logger = logging.getLogger(__name__) + # Lazy imports to avoid import errors if modules are not available def _get_torch_init(): @@ -141,12 +144,12 @@ def _run_callbacks(module_name): try: cb() except Exception as e: - print(f"Error in callback for {module_name}: {e}") # noqa: T201 + logger.warning("Error in callback for %s: %s", module_name, e) else: try: callbacks() except Exception as e: - print(f"Error in callback for {module_name}: {e}") # noqa: T201 + logger.warning("Error in callback for %s: %s", module_name, e) def register_module_callback(module_name, callback): @@ -158,7 +161,7 @@ def register_module_callback(module_name, callback): try: callback(sys.modules[module_name]) except Exception as e: - print(f"Error executing callback for {module_name}: {e}") # noqa: T201 + logger.warning("Error executing callback for %s: %s", module_name, e) def add_module_callback(module_name, callback): diff --git a/python/probing/inspect/trace.py b/python/probing/inspect/trace.py index 215c1ed6..2ef0e3ff 100644 --- a/python/probing/inspect/trace.py +++ b/python/probing/inspect/trace.py @@ -1,3 +1,4 @@ +import logging import ctypes import contextlib import fnmatch @@ -17,6 +18,30 @@ from probing.core.table import table +logger = logging.getLogger(__name__) + +_TRACE_STDOUT = os.environ.get("PROBING_TRACE_STDOUT", "").strip().lower() in ( + "1", + "true", + "yes", + "on", +) + + +def _trace_emit(message: str) -> None: + if _TRACE_STDOUT: + print(message) + else: + logger.info("%s", message) + + +def _trace_warn(message: str) -> None: + if _TRACE_STDOUT: + print(message) + else: + logger.warning("%s", message) + + thread_global = threading.local() internal_directories = os.path.dirname((lambda: 0).__code__.co_filename) @@ -833,7 +858,7 @@ def trace(self, frame: FrameType, event: AnyStr, arg: Any): # Print only if variable is in watch list (not silent_watch) if k in self.watch: - print(f"probing: variable update {k} = {new_value}") + _trace_emit(f"probing: variable update {k} = {new_value}") # Save variable change to trace_variables table (for both watch and silent_watch) try: @@ -855,7 +880,7 @@ def trace(self, frame: FrameType, event: AnyStr, arg: Any): ).save() except Exception as e: # Log error but don't disrupt the tracing process - print( + _trace_warn( f"Warning: Failed to save variable change to trace_variables table: {e}" ) @@ -903,7 +928,7 @@ def __torch_function__(cls, func, types, args=(), kwargs=None): old_val = f"{args}" ret = super().__torch_function__(func, types, args, kwargs) ret_val = f"{args}" - print( + _trace_emit( f"probing: tensor update with {func.__name__}: {old_val} => {ret_val}" ) return ret @@ -1010,12 +1035,12 @@ def get_func(name): depth = 1 depth = max(0, min(int(depth), MAX_TRACE_DEPTH)) if func_or_name in traced_functions: - print(f"Function {func_or_name} is already being traced.") + _trace_warn(f"Function {func_or_name} is already being traced.") return try: func = get_func(func_or_name) if not isinstance(func, FunctionType): - print(f"Error: {func_or_name} is not a function") + _trace_warn(f"Error: {func_or_name} is not a function") return # Store original attributes for restoration @@ -1111,7 +1136,7 @@ def get_func(name): ) except Exception as e: - print(f"Function {func_or_name} not found: {e}") + _trace_warn(f"Function {func_or_name} not found: {e}") return else: raise NotImplementedError("Only string names are supported for tracing.") @@ -1134,12 +1159,12 @@ def get_func(name): if isinstance(func_or_name, str): _validate_trace_name(func_or_name) if func_or_name not in traced_functions: - print(f"Function {func_or_name} is not being traced.") + _trace_warn(f"Function {func_or_name} is not being traced.") return try: func = get_func(func_or_name) if not isinstance(func, FunctionType): - print(f"Error: {func_or_name} is not a function") + _trace_warn(f"Error: {func_or_name} is not a function") return # Get original attributes @@ -1170,7 +1195,7 @@ def get_func(name): object.__setattr__(func, "__closure__", original_attrs["__closure__"]) except Exception as e: - print(f"Function {func_or_name} not found: {e}") + _trace_warn(f"Function {func_or_name} not found: {e}") return else: raise NotImplementedError("Only string names are supported for tracing.") diff --git a/python/probing/profiling/deferred_drain.py b/python/probing/profiling/deferred_drain.py new file mode 100644 index 00000000..d0007b9a --- /dev/null +++ b/python/probing/profiling/deferred_drain.py @@ -0,0 +1,185 @@ +"""Background persistence for deferred TorchProbe GPU trace records.""" + +from __future__ import annotations + +import atexit +import logging +import os +import queue +import threading +from dataclasses import dataclass +from typing import TYPE_CHECKING, Optional + +from probing.util.env import parse_bool_flag + +if TYPE_CHECKING: + from probing.profiling.torch_probe import DelayedRecord + +logger = logging.getLogger(__name__) + +_ENV_ASYNC = "PROBING_TORCH_DEFER_ASYNC" +_ENV_QUEUE_SIZE = "PROBING_TORCH_DEFER_QUEUE_SIZE" +_DEFAULT_QUEUE_SIZE = 4096 + + +def deferred_drain_async_enabled() -> bool: + """Return whether deferred saves run on a background worker (default: on).""" + flag = parse_bool_flag(os.environ.get(_ENV_ASYNC)) + if flag is None: + return True + return flag + + +def _queue_maxsize() -> int: + raw = os.environ.get(_ENV_QUEUE_SIZE) + if raw is None: + return _DEFAULT_QUEUE_SIZE + try: + size = int(raw) + except (TypeError, ValueError): + return _DEFAULT_QUEUE_SIZE + return max(1, size) + + +@dataclass(frozen=True) +class _DrainTask: + record: DelayedRecord + force: bool + + +class DeferredDrainWorker: + """Bounded queue + daemon thread for ``DelayedRecord.save()``.""" + + def __init__(self, *, maxsize: int) -> None: + self._maxsize = maxsize + self._queue: queue.Queue[Optional[_DrainTask]] = queue.Queue(maxsize=maxsize) + self._thread: Optional[threading.Thread] = None + self._started = False + self._atexit_registered = False + self._lock = threading.Lock() + + @property + def enabled(self) -> bool: + return deferred_drain_async_enabled() + + def pending(self) -> int: + return self._queue.qsize() + + def _ensure_started(self) -> None: + with self._lock: + if self._started: + return + self._thread = threading.Thread( + target=self._run, + name="probing-torch-deferred-drain", + daemon=True, + ) + self._thread.start() + self._started = True + if not self._atexit_registered: + atexit.register(shutdown_deferred_drain) + self._atexit_registered = True + + def submit(self, dr: DelayedRecord, *, force: bool = False) -> bool: + """Enqueue a deferred save. Returns False when async is off or the queue is full.""" + if not self.enabled: + return False + self._ensure_started() + try: + self._queue.put_nowait(_DrainTask(record=dr, force=force)) + return True + except queue.Full: + logger.debug( + "deferred drain queue full (%s slots); falling back to sync save", + self._maxsize, + ) + return False + + def _run(self) -> None: + while True: + task = self._queue.get() + try: + if task is None: + return + _process_task(task) + except Exception: + logger.debug("deferred drain task failed", exc_info=True) + finally: + self._queue.task_done() + + def flush(self, timeout: Optional[float] = 10.0) -> None: + """Block until all queued saves complete.""" + if not self._started: + return + if timeout is None: + self._queue.join() + return + done = threading.Event() + + def _waiter() -> None: + self._queue.join() + done.set() + + threading.Thread( + target=_waiter, name="probing-deferred-drain-flush", daemon=True + ).start() + if not done.wait(timeout=timeout): + logger.warning( + "deferred drain flush timed out after %.1fs (%s tasks still queued)", + timeout, + self.pending(), + ) + + def shutdown(self, timeout: float = 5.0) -> None: + with self._lock: + if not self._started or self._thread is None: + return + thread = self._thread + self.flush(timeout=timeout) + try: + self._queue.put_nowait(None) + except queue.Full: + logger.warning( + "deferred drain shutdown: queue full, worker may not exit cleanly" + ) + thread.join(timeout=timeout) + + +def _process_task(task: _DrainTask) -> None: + from probing.profiling.torch_probe import TorchProbe + + if task.force: + TorchProbe._force_event_complete(task.record) + task.record.save() + + +_worker: Optional[DeferredDrainWorker] = None +_worker_lock = threading.Lock() + + +def get_deferred_drain_worker() -> DeferredDrainWorker: + global _worker + with _worker_lock: + if _worker is None: + _worker = DeferredDrainWorker(maxsize=_queue_maxsize()) + return _worker + + +def flush_deferred_drain(timeout: float = 10.0) -> None: + """Wait for the background drain queue to empty (tests / graceful shutdown).""" + get_deferred_drain_worker().flush(timeout=timeout) + + +def shutdown_deferred_drain(timeout: float = 5.0) -> None: + """Flush and stop the background drain worker.""" + global _worker + with _worker_lock: + worker = _worker + _worker = None + if worker is not None: + worker.shutdown(timeout=timeout) + + +def reset_deferred_drain_worker_for_tests() -> None: + """Tear down the singleton worker between tests.""" + shutdown_deferred_drain(timeout=1.0) diff --git a/python/probing/profiling/torch/module_utils.py b/python/probing/profiling/torch/module_utils.py index 4ee19b14..658af899 100644 --- a/python/probing/profiling/torch/module_utils.py +++ b/python/probing/profiling/torch/module_utils.py @@ -1,7 +1,11 @@ +import logging + import torch from ..types import TensorDef +logger = logging.getLogger(__name__) + NAME_CACHE = {} @@ -23,13 +27,15 @@ def decorator(func): def wrapper(*args, **kwargs): try: return func(*args, **kwargs) - except: + except Exception: nonlocal _maxtry _maxtry -= 1 if _maxtry > 0: - import traceback - - traceback.print_exc() + logger.exception( + "module_utils.%s failed; retries left=%s", + func.__name__, + _maxtry, + ) return wrapper diff --git a/python/probing/profiling/torch_probe.py b/python/probing/profiling/torch_probe.py index 15e73af2..4b947b7a 100644 --- a/python/probing/profiling/torch_probe.py +++ b/python/probing/profiling/torch_probe.py @@ -819,7 +819,9 @@ def set_sampling_mode(self, expr): else: self.layer_rate = 1.0 except (ValueError, IndexError): - print(f"Invalid sampling expression: {expr}. Using default settings.") + logger.warning( + "Invalid sampling expression: %s. Using default settings.", expr + ) self.rate = DEFAULT_SAMPLE_RATE self.layer_rate = 1.0 @@ -838,7 +840,7 @@ def trace_exceptions(self, frame, event, arg): if event == "exception": exception, value, traceback = arg if isinstance(value, RuntimeError): - print(f"Exception: {exception}, Value: {value}") + logger.debug("Exception: %s, Value: %s", exception, value) return self.trace_exceptions @@ -1422,47 +1424,63 @@ def _force_event_complete(dr) -> None: except Exception: pass - def _drain_deferred(self) -> None: - """Persist GPU-event timings stashed by earlier sampled steps. - - Reading ``elapsed_time`` needs the events to have completed; doing that on - the sampled step forces a blocking ``synchronize`` on an async backend - (CUDA/MPS) — that stall is exactly what inflates sampled-step wall time. - Instead we stash the (record, events) and drain them here on later - optimizer steps once the GPU has naturally caught up. - - A record is only read after it has aged ``_DEFER_MIN_SETTLE`` optimizer - steps *and* its end event reports ready (``event.query()``). The settle - window matters most for backward events, which are recorded near the end - of a step: draining them the very next step (while the kernels they - bracket are still in flight) makes each ``elapsed_time`` force its own - blocking commit — dozens of ms per sampled step. Letting them age a couple - of steps turns every read into a free cached lookup, exactly like forward - events already behave. Entries older than ``_DEFER_MAX_LAG`` cycles are - force-completed (rare). - """ + def _collect_ready_deferred(self) -> list[tuple[Any, bool]]: + """Partition deferred records ready to persist (main thread, non-blocking).""" if not self._deferred: - return + return [] cutoff = self._step_cycle - _DEFER_MAX_LAG settle = self._step_cycle - _DEFER_MIN_SETTLE + ready: list[tuple[Any, bool]] = [] remaining = [] for dr in self._deferred: defer_cycle = getattr(dr, "_defer_cycle", self._step_cycle) force = defer_cycle <= cutoff - # Only read events that have had a few optimizer steps to settle on - # the GPU. Reading ``elapsed_time`` too soon (e.g. the very next step, - # while the backward kernels those events bracket are still in flight) - # forces a blocking commit — that stall is the sampled-step overhead. - # Letting them age a couple of steps means the reads hit already - # completed work for free, exactly like forward events naturally do. settled = defer_cycle <= settle if force or (settled and self._deferred_events_ready(dr)): - if force: - self._force_event_complete(dr) - dr.save() + ready.append((dr, force)) else: remaining.append(dr) self._deferred = remaining + return ready + + def _persist_deferred_records(self, ready: list[tuple[Any, bool]]) -> None: + if not ready: + return + from probing.profiling.deferred_drain import get_deferred_drain_worker + + worker = get_deferred_drain_worker() + overflow: list[tuple[Any, bool]] = [] + if worker.enabled: + for dr, force in ready: + if not worker.submit(dr, force=force): + overflow.append((dr, force)) + else: + overflow = ready + for dr, force in overflow: + if force: + self._force_event_complete(dr) + dr.save() + + def _drain_deferred(self) -> None: + """Persist GPU-event timings stashed by earlier sampled steps. + + Called **after** ``_record_step_timing`` so deferred ``elapsed_time`` + reads and memtable writes do not inflate ``python.torch_step_timing`` + wall rows for the step that is finishing. + + When ``PROBING_TORCH_DEFER_ASYNC`` is enabled (default), ready records + are enqueued for a background worker so ``post_step_hook`` returns + sooner. A full queue falls back to synchronous ``save()`` on this thread. + """ + ready = self._collect_ready_deferred() + self._persist_deferred_records(ready) + + def _close_step_wall(self, *, is_shadow: bool) -> None: + """Record step wall time, then schedule deferred GPU trace persistence.""" + self._record_step_timing(is_shadow=is_shadow) + self._drain_deferred() + self._advance_step_cycle_for_next() + self._mark_step_wall_start() def post_step_hook(self, opt, args, kwargs): if not self.enabled: @@ -1476,18 +1494,12 @@ def post_step_hook(self, opt, args, kwargs): self._begin_train_step_span(optimizer=opt) return - # Reclaim earlier sampled steps' GPU timings every optimizer step, off - # their critical path (runs for shadow / non-sampled / sampled alike). - self._drain_deferred() - if self.shadow_step: self._end_train_step_span() self.curr_step = step.micro_step self._cleanup_step_resources() self.step_start = None - self._record_step_timing(is_shadow=True) - self._advance_step_cycle_for_next() - self._mark_step_wall_start() + self._close_step_wall(is_shadow=True) return self._end_train_step_span() @@ -1500,9 +1512,7 @@ def post_step_hook(self, opt, args, kwargs): self._cleanup_step_resources() self.step_start = None self.pending.clear() - self._record_step_timing(is_shadow=False) - self._advance_step_cycle_for_next() - self._mark_step_wall_start() + self._close_step_wall(is_shadow=False) return super().post_step_hook(opt, args, kwargs) @@ -1533,9 +1543,7 @@ def post_step_hook(self, opt, args, kwargs): self._cleanup_step_resources() self.step_start = None - self._record_step_timing(is_shadow=False) - self._advance_step_cycle_for_next() - self._mark_step_wall_start() + self._close_step_wall(is_shadow=False) def set_sampling_mode(mode): diff --git a/scripts/ci/set_nightly_local_version.py b/scripts/ci/set_nightly_local_version.py new file mode 100644 index 00000000..f4373484 --- /dev/null +++ b/scripts/ci/set_nightly_local_version.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +"""Append a PEP 440 local version label for nightly wheel builds.""" + +from __future__ import annotations + +import re +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +VERSION_RE = re.compile(r'^(version = ")([^"+]+)(")', re.MULTILINE) + + +def patch(path: Path, local: str) -> None: + text = path.read_text(encoding="utf-8") + new, count = VERSION_RE.subn(rf"\g<1>\g<2>+{local}\g<3>", text, count=1) + if count != 1: + raise SystemExit(f"failed to patch version in {path}") + path.write_text(new, encoding="utf-8") + + +def main() -> None: + if len(sys.argv) != 2 or not sys.argv[1].strip(): + raise SystemExit("usage: set_nightly_local_version.py ") + local = sys.argv[1].strip() + patch(ROOT / "pyproject.toml", local) + patch(ROOT / "Cargo.toml", local) + print(f"patched nightly local version +{local}") + + +if __name__ == "__main__": + main() diff --git a/scripts/prune-bundled-web.sh b/scripts/prune-bundled-web.sh new file mode 100755 index 00000000..2d598f31 --- /dev/null +++ b/scripts/prune-bundled-web.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# Drop stale dx hashed assets after `dx bundle` — keep only what index.html loads. +set -euo pipefail + +PUBLIC="${1:-python/probing/bundled_web/public}" +INDEX="$PUBLIC/index.html" +ASSETS="$PUBLIC/assets" + +if [[ ! -f "$INDEX" ]]; then + exit 0 +fi + +entry_js="$(grep -oE 'web-dxh[^"'"'"' ]+\.js' "$INDEX" | head -1 || true)" +if [[ -z "$entry_js" ]]; then + exit 0 +fi + +js_path="$ASSETS/$entry_js" +wasm_ref="" +if [[ -f "$js_path" ]]; then + wasm_ref="$(grep -oE 'web_bg-dxh[0-9a-f]+\.wasm' "$js_path" | head -1 || true)" +fi + +declare -a keep=( + "$ASSETS/tailwind.css" + "$ASSETS/logo.svg" + "$PUBLIC/logo.svg" + "$js_path" + "$js_path.br" +) +if [[ -n "$wasm_ref" ]]; then + keep+=("$ASSETS/$wasm_ref" "$ASSETS/${wasm_ref}.br") +fi + +pruned=0 +shopt -s nullglob +for f in "$ASSETS"/web-dxh* "$ASSETS"/web_bg-dxh*; do + keep_it=0 + for k in "${keep[@]}"; do + if [[ "$f" == "$k" ]]; then + keep_it=1 + break + fi + done + if [[ "$keep_it" -eq 0 ]]; then + rm -f "$f" + pruned=$((pruned + 1)) + fi +done +shopt -u nullglob + +if [[ "$pruned" -gt 0 ]]; then + echo "pruned $pruned stale web asset(s) under $ASSETS" +fi diff --git a/scripts/verify_wheel_contents.py b/scripts/verify_wheel_contents.py new file mode 100644 index 00000000..eb878430 --- /dev/null +++ b/scripts/verify_wheel_contents.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +"""Verify a probing wheel contains bundled assets and the Python package tree.""" + +from __future__ import annotations + +import argparse +import sys +import zipfile +from pathlib import Path + +# Paths that must exist in every release wheel (wheel archive member names). +REQUIRED_PATHS = ( + "probing/__init__.py", + "probing/ext/__init__.py", + "probing/skills/loader.py", + "probing/handlers/router.py", + "probing/profiling/torch_probe.py", + "probing/bundled_skills/catalog.yaml", + "probing/bundled_web/public/index.html", +) + + +def _pick_wheel(path: Path | None) -> Path: + if path is not None: + if not path.is_file(): + raise SystemExit(f"error: wheel not found: {path}") + return path + dist = Path("dist") + wheels = sorted(dist.glob("probing-*.whl")) + if not wheels: + raise SystemExit("error: no dist/probing-*.whl (run: make wheel)") + return wheels[0] + + +def verify_wheel(wheel: Path) -> list[str]: + missing: list[str] = [] + with zipfile.ZipFile(wheel) as zf: + names = set(zf.namelist()) + for member in REQUIRED_PATHS: + if member not in names: + # Legacy dx layout (no public/ subdir). + if member == "probing/bundled_web/public/index.html": + if "probing/bundled_web/index.html" in names: + continue + missing.append(member) + return missing + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "wheel", + nargs="?", + type=Path, + help="wheel path (default: first dist/probing-*.whl)", + ) + args = parser.parse_args(argv) + wheel = _pick_wheel(args.wheel) + missing = verify_wheel(wheel) + if missing: + print(f"error: {wheel} is missing required members:", file=sys.stderr) + for path in missing: + print(f" - {path}", file=sys.stderr) + print( + "hint: run 'make frontend && make wheel' before install-wheel", + file=sys.stderr, + ) + return 1 + print(f"ok: {wheel.name} ({len(REQUIRED_PATHS)} required paths)") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/lib.rs b/src/lib.rs index 42371e44..297d4182 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,15 +4,17 @@ extern crate ctor; use anyhow::Result; use pyo3::prelude::*; +use probing_cli::pyo3::cli_main; use probing_core::{install_panic_hook, register_python_main_thread}; use probing_python::extensions::python::{register_table_docs, ExternalTable}; use probing_python::features::config; -use probing_python::features::python_api::{cli_main, query_json}; +use probing_python::features::python_api::query_json; use probing_python::features::tracing; use probing_python::features::vm_tracer::{ _get_python_frames, _get_python_stacks, disable_tracer, enable_tracer, initialize_globals, }; use probing_server::sync_env_settings; +use probing_skills::pyo3::register_skills_bindings; use probing_python::pkg::TCPStore; @@ -228,21 +230,15 @@ fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(_get_python_stacks, m)?)?; m.add_function(wrap_pyfunction!(_get_python_frames, m)?)?; m.add_function(wrap_pyfunction!(cli_main, m)?)?; - use probing_python::features::python_api::{api_callstack, api_eval}; - m.add_function(wrap_pyfunction!(api_callstack, m)?)?; - m.add_function(wrap_pyfunction!(api_eval, m)?)?; - use probing_python::features::skills_api::{ - skills_catalog, skills_intents, skills_list, skills_load, skills_match, skills_pages, - skills_plan, skills_routing, - }; - m.add_function(wrap_pyfunction!(skills_load, m)?)?; - m.add_function(wrap_pyfunction!(skills_catalog, m)?)?; - m.add_function(wrap_pyfunction!(skills_routing, m)?)?; - m.add_function(wrap_pyfunction!(skills_list, m)?)?; - m.add_function(wrap_pyfunction!(skills_plan, m)?)?; - m.add_function(wrap_pyfunction!(skills_match, m)?)?; - m.add_function(wrap_pyfunction!(skills_intents, m)?)?; - m.add_function(wrap_pyfunction!(skills_pages, m)?)?; + m.add_function(wrap_pyfunction!( + probing_python::features::python_api::api_callstack, + m + )?)?; + m.add_function(wrap_pyfunction!( + probing_python::features::python_api::api_eval, + m + )?)?; + register_skills_bindings(m)?; // Add is_enabled function to help tests check state use probing_python::features::python_api::{is_enabled, should_enable_probing}; diff --git a/tests/conftest.py b/tests/conftest.py index bcd8485e..9e54ceed 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -15,19 +15,44 @@ os.environ.setdefault("PROBING_RUST_BACKTRACE", "1") # Fallback when tests run without ``make develop`` (no venv .pth files). -# Skip when ``probing._core`` is already installed (wheel / maturin develop) so we -# do not shadow site-packages with the checkout-only ``python/probing`` tree. +# Skip when a complete ``probing`` wheel is installed so we do not shadow +# site-packages with the checkout-only ``python/probing`` tree. _repo_python = Path(__file__).resolve().parents[1] / "python" -if _repo_python.is_dir(): - _repo_python_str = str(_repo_python) - _prepend_repo = True + + +def _missing_probing_modules() -> list[str]: try: import importlib.util - if importlib.util.find_spec("probing._core") is not None: - _prepend_repo = False + required = ( + "probing._core", + "probing.skills.loader", + "probing.ext", + "probing.handlers", + ) + return [name for name in required if importlib.util.find_spec(name) is None] except (ImportError, ModuleNotFoundError, ValueError): - pass + return ["probing (import system error)"] + + +def _installed_probing_is_complete() -> bool: + return not _missing_probing_modules() + + +if _repo_python.is_dir(): + _repo_python_str = str(_repo_python) + _prepend_repo = not _installed_probing_is_complete() + if ( + os.environ.get("PROBING_WHEEL_TEST") == "1" + and not _installed_probing_is_complete() + ): + missing = ", ".join(_missing_probing_modules()) + raise RuntimeError( + "installed wheel is incomplete " + f"(missing: {missing}); " + "run: make frontend && make wheel && make install-wheel " + "(install with PROBING=0 — do not set PROBING=1 during pip install)" + ) if _prepend_repo and _repo_python_str not in sys.path: sys.path.insert(0, _repo_python_str) diff --git a/tests/fixtures/skill_interpret_parity.yaml b/tests/fixtures/skill_interpret_parity.yaml index f33bc6db..29ef0e1d 100644 --- a/tests/fixtures/skill_interpret_parity.yaml +++ b/tests/fixtures/skill_interpret_parity.yaml @@ -28,6 +28,33 @@ cases: avg_ms: [10.0, 20.0, 40.0] expect_count: 1 + - name: ratio_slow_steps + rules: + - id: many_slow + when: "step:job_slowdown_proxy | column:slow_steps | ratio(slow_steps/steps_in_window) > 0.3" + severity: warning + message: slow + steps: + - step_id: job_slowdown_proxy + row_count: 1 + columns: + slow_steps: [4.0] + steps_in_window: [10.0] + expect_count: 1 + + - name: value_eq_zero + rules: + - id: shadow_off + when: "step:torch_probe_overhead | column:shadow_baseline | value == 0" + severity: info + message: shadow off + steps: + - step_id: torch_probe_overhead + row_count: 1 + columns: + shadow_baseline: [0.0] + expect_count: 1 + - name: param_rows_threshold rules: - id: growth diff --git a/tests/regression/profiling/conftest.py b/tests/regression/profiling/conftest.py new file mode 100644 index 00000000..717b2ae9 --- /dev/null +++ b/tests/regression/profiling/conftest.py @@ -0,0 +1,15 @@ +"""Profiling regression tests — keep deferred drain synchronous by default.""" + +from __future__ import annotations + +import pytest + +from probing.profiling.deferred_drain import reset_deferred_drain_worker_for_tests + + +@pytest.fixture(autouse=True) +def _sync_torch_deferred_drain(monkeypatch): + """Regression tests expect immediate ``_drain_deferred`` side effects.""" + monkeypatch.setenv("PROBING_TORCH_DEFER_ASYNC", "0") + yield + reset_deferred_drain_worker_for_tests() diff --git a/tests/regression/profiling/test_deferred_drain_worker.py b/tests/regression/profiling/test_deferred_drain_worker.py new file mode 100644 index 00000000..bef0a0a8 --- /dev/null +++ b/tests/regression/profiling/test_deferred_drain_worker.py @@ -0,0 +1,110 @@ +"""Background deferred-drain worker tests.""" + +from __future__ import annotations + +import threading + +import pytest + +from probing.profiling.deferred_drain import ( + DeferredDrainWorker, + reset_deferred_drain_worker_for_tests, +) +from probing.profiling.torch_probe import DelayedRecord, TorchProbe + + +class _FakeRecord: + def __init__(self) -> None: + self.saved = False + self.save_thread: int | None = None + + def save(self) -> None: + self.saved = True + self.save_thread = threading.get_ident() + + +@pytest.fixture(autouse=True) +def _enable_async_drain(monkeypatch): + monkeypatch.setenv("PROBING_TORCH_DEFER_ASYNC", "1") + reset_deferred_drain_worker_for_tests() + yield + reset_deferred_drain_worker_for_tests() + + +def test_worker_persists_enqueued_records(monkeypatch): + worker = DeferredDrainWorker(maxsize=16) + monkeypatch.setattr( + "probing.profiling.deferred_drain.get_deferred_drain_worker", + lambda: worker, + ) + + record = _FakeRecord() + assert worker.submit(DelayedRecord(record, None)) + worker.flush(timeout=2.0) + assert record.saved + + +def test_save_runs_off_main_thread(monkeypatch): + worker = DeferredDrainWorker(maxsize=16) + monkeypatch.setattr( + "probing.profiling.deferred_drain.get_deferred_drain_worker", + lambda: worker, + ) + main_tid = threading.get_ident() + record = _FakeRecord() + assert worker.submit(DelayedRecord(record, None)) + worker.flush(timeout=2.0) + assert record.saved + assert record.save_thread is not None + assert record.save_thread != main_tid + + +def test_queue_full_falls_back_to_sync_save(monkeypatch): + from probing.profiling.deferred_drain import _DrainTask + + worker = DeferredDrainWorker(maxsize=1) + monkeypatch.setattr( + "probing.profiling.deferred_drain.get_deferred_drain_worker", + lambda: worker, + ) + monkeypatch.setattr(worker, "_ensure_started", lambda: None) + + blocker = _FakeRecord() + worker._queue.put_nowait( + _DrainTask(record=DelayedRecord(blocker, None), force=False) + ) + + overflow = _FakeRecord() + tracer = TorchProbe() + tracer._persist_deferred_records([(DelayedRecord(overflow, None), False)]) + assert overflow.saved + assert overflow.save_thread == threading.get_ident() + assert not blocker.saved + + +def test_drain_enqueues_without_blocking_hook(monkeypatch): + worker = DeferredDrainWorker(maxsize=16) + monkeypatch.setattr( + "probing.profiling.deferred_drain.get_deferred_drain_worker", + lambda: worker, + ) + + slow = _FakeRecord() + gate = threading.Event() + + def slow_save() -> None: + gate.wait(timeout=2.0) + slow.saved = True + + slow.save = slow_save # type: ignore[method-assign] + + tracer = TorchProbe() + tracer._deferred = [] + ready_dr = DelayedRecord(slow, None) + tracer._persist_deferred_records([(ready_dr, False)]) + + assert worker.pending() >= 1 + assert not slow.saved + gate.set() + worker.flush(timeout=2.0) + assert slow.saved diff --git a/tests/regression/profiling/test_overhead_invariants.py b/tests/regression/profiling/test_overhead_invariants.py new file mode 100644 index 00000000..889a0cef --- /dev/null +++ b/tests/regression/profiling/test_overhead_invariants.py @@ -0,0 +1,61 @@ +"""Regression guards for TorchProbe overhead semantics (see docs/design/overhead-invariants.*).""" + +from __future__ import annotations + +import inspect +from pathlib import Path + +import pytest + +from probing.profiling import deferred_drain as dd +from probing.profiling import torch_probe as tp +from probing.profiling.torch_probe import TorchProbe + + +def test_close_step_wall_source_order(): + """I3: timing must be recorded before deferred drain (source-level guard).""" + src = inspect.getsource(TorchProbe._close_step_wall) + timing_pos = src.index("_record_step_timing") + drain_pos = src.index("_drain_deferred") + mark_pos = src.index("_mark_step_wall_start") + assert timing_pos < drain_pos < mark_pos, ( + "_close_step_wall must be: record → drain → advance → mark " + "(see docs/src/design/overhead-invariants.zh.md §I3)" + ) + + +def test_post_step_hook_does_not_drain_before_close_step_wall(): + """I3: post_step_hook must not call _drain_deferred before _close_step_wall.""" + src = inspect.getsource(TorchProbe.post_step_hook) + assert "_drain_deferred()" not in src.split("_close_step_wall", 1)[0], ( + "post_step_hook must not drain before _close_step_wall" + ) + + +def test_deferred_drain_async_default_on(monkeypatch): + """I4: async deferred drain is on by default (conftest forces sync for other tests).""" + monkeypatch.delenv("PROBING_TORCH_DEFER_ASYNC", raising=False) + assert dd.deferred_drain_async_enabled() is True + + +def test_overhead_invariants_doc_exists(): + """Design doc SSOT is present for agents.""" + repo = Path(__file__).resolve().parents[3] + zh = repo / "docs/src/design/overhead-invariants.zh.md" + en = repo / "docs/src/design/overhead-invariants.md" + assert zh.is_file(), f"missing {zh}" + assert en.is_file(), f"missing {en}" + text = zh.read_text(encoding="utf-8") + for needle in ( + "median(dispatch)", + "(1 − rate)", + "_record_step_timing", + "PROBING_TORCH_DEFER_ASYNC", + ): + assert needle in text, f"overhead-invariants doc missing: {needle!r}" + + +def test_defer_settle_constants_documented_range(): + """Defer settle window is part of overhead stability contract.""" + assert tp._DEFER_MIN_SETTLE >= 1 + assert tp._DEFER_MIN_SETTLE < tp._DEFER_MAX_LAG diff --git a/tests/regression/profiling/test_torch_probe_sampling.py b/tests/regression/profiling/test_torch_probe_sampling.py index e7f89572..e3d3fca0 100644 --- a/tests/regression/profiling/test_torch_probe_sampling.py +++ b/tests/regression/profiling/test_torch_probe_sampling.py @@ -163,6 +163,34 @@ def track_timing(self, *, is_shadow: bool): assert order.index("finish") < order.index(timing_events[0]) +def test_post_step_hook_drains_deferred_after_step_timing(monkeypatch): + order = [] + + def track_timing(self, *, is_shadow: bool): + order.append("timing") + + def track_drain(self): + order.append("drain") + + monkeypatch.setattr(TorchProbe, "_record_step_timing", track_timing) + monkeypatch.setattr(TorchProbe, "_drain_deferred", track_drain) + monkeypatch.setattr( + TorchProbe, "_advance_step_cycle_for_next", lambda self: order.append("advance") + ) + monkeypatch.setattr( + TorchProbe, "_mark_step_wall_start", lambda self: order.append("mark") + ) + + tracer, _, _ = _ready_tracer() + tracer.shadow_step = False + tracer.has_backend = False + tracer._mark_step_wall_start() + + tracer.post_step_hook(None, (), {}) + + assert order[-4:] == ["timing", "drain", "advance", "mark"] + + def test_anchor_pre_always_pairs_post_even_when_layer_not_sampled(): # layer_rate=0 → nothing sampled except the offset-0 time anchor. tracer, root, other = _ready_tracer(layer_rate=0.0) diff --git a/tests/regression/rust/Cargo.toml b/tests/regression/rust/Cargo.toml index 49916885..d651d1e8 100644 --- a/tests/regression/rust/Cargo.toml +++ b/tests/regression/rust/Cargo.toml @@ -16,6 +16,7 @@ pyo3-build-config = "0.29.0" probing-core = { path = "../../../probing/core", features = ["test-utils"] } probing-server = { path = "../../../probing/server", default-features = false } probing-memtable = { path = "../../../probing/memtable" } +probing-hccl-shim = { path = "../../../probing/extensions/hccl-shim" } probing-cli = { path = "../../../probing/cli" } probing-python = { path = "../../../probing/extensions/python", default-features = false } probing-proto = { path = "../../../probing/proto" } diff --git a/tests/regression/rust/probing/cli/inject_aarch64.rs b/tests/regression/rust/probing/cli/inject_aarch64.rs index 59a99473..8f8c4b51 100644 --- a/tests/regression/rust/probing/cli/inject_aarch64.rs +++ b/tests/regression/rust/probing/cli/inject_aarch64.rs @@ -33,10 +33,14 @@ fn injection_basic_fails_on_missing_library() { match result { Ok(_) => panic!("Expected injection to fail due to missing library"), Err(e) => { - let error_msg = e.to_string(); + // `Display` only shows the outermost context ("failed to perform aarch64 + // injection"); the missing-file cause lives deeper (canonicalize or dlopen). + let chain = format!("{e:#}"); assert!( - error_msg.contains("No such file") || error_msg.contains("dlopen"), - "unexpected error: {error_msg}" + chain.contains("No such file") + || chain.contains("dlopen") + || chain.contains("couldn't get absolute path"), + "unexpected error chain: {chain}" ); } } diff --git a/tests/regression/rust/probing/core/table_docs_integration.rs b/tests/regression/rust/probing/core/table_docs_integration.rs index cc5a1e30..fb4f99c3 100644 --- a/tests/regression/rust/probing/core/table_docs_integration.rs +++ b/tests/regression/rust/probing/core/table_docs_integration.rs @@ -110,6 +110,7 @@ async fn describe_static_catalog_table_includes_comment_columns() -> Result<()> #[tokio::test] async fn catalog_serves_builtin_hccl_and_yaml_synonyms() -> Result<()> { + probing_hccl_shim::register_docs(); let engine = engine_with_memtable().await?; let col_df = engine diff --git a/tests/regression/rust/probing/server/auth_complex_tests.rs b/tests/regression/rust/probing/server/auth_complex_tests.rs index accd530e..24860dbd 100644 --- a/tests/regression/rust/probing/server/auth_complex_tests.rs +++ b/tests/regression/rust/probing/server/auth_complex_tests.rs @@ -68,6 +68,12 @@ fn test_is_public_path_favicon() { assert!(is_public_path("/favicon")); } +#[test] +fn test_is_public_path_health_ready() { + assert!(is_public_path("/health")); + assert!(is_public_path("/ready")); +} + #[test] fn test_is_public_path_protected() { assert!(!is_public_path("/query")); diff --git a/tests/regression/rust/probing/server/hierarchical_fanout_query.rs b/tests/regression/rust/probing/server/hierarchical_fanout_query.rs index 30b28cc6..93fe65dd 100644 --- a/tests/regression/rust/probing/server/hierarchical_fanout_query.rs +++ b/tests/regression/rust/probing/server/hierarchical_fanout_query.rs @@ -300,7 +300,12 @@ fn hierarchical_fanout_reports_failed_remote_node_aggregator() { assert_eq!(result.meta.node_aggregators_queried, 1); assert_eq!(result.meta.local_ranks_queried, 1); assert_eq!(result.meta.nodes_queried, 2, "local0 + local leaf only"); - assert_eq!(result.meta.nodes_failed, vec![dead_node_agg.to_string()]); + assert_eq!(result.meta.nodes_failed.len(), 1); + assert!( + result.meta.nodes_failed[0].starts_with(dead_node_agg), + "unexpected failure entry: {:?}", + result.meta.nodes_failed + ); }); clear_rank_env(); @@ -347,7 +352,12 @@ fn hierarchical_fanout_reports_failed_local_leaf() { assert_eq!(result.meta.node_aggregators_queried, 1); assert_eq!(result.meta.local_ranks_queried, 1); assert_eq!(result.meta.nodes_queried, 2, "local0 + remote node agg"); - assert_eq!(result.meta.nodes_failed, vec![dead_leaf.to_string()]); + assert_eq!(result.meta.nodes_failed.len(), 1); + assert!( + result.meta.nodes_failed[0].starts_with(dead_leaf), + "unexpected failure entry: {:?}", + result.meta.nodes_failed + ); }); clear_rank_env(); diff --git a/tests/regression/rust/probing/server/training_observability_tests.rs b/tests/regression/rust/probing/server/training_observability_tests.rs index 5e5e12fa..70d0f1dc 100644 --- a/tests/regression/rust/probing/server/training_observability_tests.rs +++ b/tests/regression/rust/probing/server/training_observability_tests.rs @@ -33,12 +33,14 @@ fn step_matrix_response_fields_serializable() { rank_count: 1, step_count: 1, cluster: false, + partial: false, nodes_queried: 1, nodes_failed: vec![], }; let json = serde_json::to_string(&resp).unwrap(); assert!(json.contains("nodes_queried")); assert!(json.contains("duration_ms")); + assert!(json.contains("partial")); } #[test] diff --git a/tests/regression/spec/api_spec.json b/tests/regression/spec/api_spec.json index 2f5544df..256d048d 100644 --- a/tests/regression/spec/api_spec.json +++ b/tests/regression/spec/api_spec.json @@ -25,7 +25,8 @@ { "method": "POST", "path": "/query" }, { "method": "POST", "path": "/query/dto" }, { "method": "GET", "path": "/config/{config_key}" }, - { "method": "GET", "path": "/ws" } + { "method": "GET", "path": "/ws" }, + { "method": "POST", "path": "/mcp" } ], "pythonext_handlers": [ { diff --git a/tests/unit/probing/skills/test_interpret_fixture.py b/tests/unit/probing/skills/test_interpret_fixture.py index 59fcc4cf..e8bd074d 100644 --- a/tests/unit/probing/skills/test_interpret_fixture.py +++ b/tests/unit/probing/skills/test_interpret_fixture.py @@ -17,7 +17,13 @@ def test_interpret_parity_fixture_has_expected_cases(): raw = (FIXTURES / "skill_interpret_parity.yaml").read_text(encoding="utf-8") doc = yaml.safe_load(raw) names = {c["name"] for c in doc["cases"]} - assert names == {"rows_zero", "max_min_ratio", "param_rows_threshold"} + assert names == { + "rows_zero", + "max_min_ratio", + "param_rows_threshold", + "value_eq_zero", + "ratio_slow_steps", + } for case in doc["cases"]: assert case["rules"] assert "expect_count" in case diff --git a/tests/unit/probing/test_dev_pth.py b/tests/unit/probing/test_dev_pth.py index 17d342fc..521b98dd 100644 --- a/tests/unit/probing/test_dev_pth.py +++ b/tests/unit/probing/test_dev_pth.py @@ -3,8 +3,9 @@ from __future__ import annotations from probing.dev_pth import ( - HOOK_PTH_LINE, HOOK_PTH_NAME, + HOOK_PTH_LINE_PREFIX, + hook_pth_line, hook_pth_path, install_dev_hook, is_dev_hook_installed, @@ -27,7 +28,10 @@ def test_install_and_remove_dev_hook(): path = install_dev_hook() assert path == hook_pth_path() assert path.name == HOOK_PTH_NAME - assert path.read_text(encoding="utf-8") == HOOK_PTH_LINE + line = path.read_text(encoding="utf-8") + assert line == hook_pth_line() + assert line.startswith(HOOK_PTH_LINE_PREFIX) + assert line.endswith("import probing_hook\n") assert is_dev_hook_installed() assert remove_dev_hook() diff --git a/web/.cargo/config.toml b/web/.cargo/config.toml new file mode 100644 index 00000000..75932b64 --- /dev/null +++ b/web/.cargo/config.toml @@ -0,0 +1,3 @@ +# Share the repo-root target/ with the main workspace (avoid web/target duplication). +[build] +target-dir = "../target" diff --git a/web/Cargo.toml b/web/Cargo.toml index dedcb65e..0d68df39 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -77,14 +77,20 @@ dioxus-code = { version = "0.1.2", default-features = false, features = [ "lang-toml", ] } -# Match workspace root: faster compile, smaller debug artifacts. +# Match workspace root: fast dev compiles, lean debug artifacts. [profile.dev] debug = 1 split-debuginfo = "unpacked" +incremental = true codegen-units = 256 +[profile.dev.build-override] +opt-level = 3 + [profile.release] -opt-level = "z" +opt-level = "s" +lto = "thin" +codegen-units = 16 debug = false # Do not set strip here — dx strips after asset extraction via rust-objcopy, # which breaks on some nightly macOS toolchains (missing libLLVM.dylib). diff --git a/web/DESIGN.md b/web/DESIGN.md index c020fe11..fbe62a45 100644 --- a/web/DESIGN.md +++ b/web/DESIGN.md @@ -2,7 +2,7 @@ 本文档描述前端界面设计原则、产品信息架构与代码组织方式,便于维护与扩展。 -**技术栈**:Dioxus 0.7(WASM)、dioxus-router、Tailwind(dx 构建)、reqwest、async-openai(浏览器 BYOK LLM)。 +**技术栈**:Dioxus 0.7(WASM)、dioxus-router、Tailwind(dx 构建)、reqwest、`probing-skills`(技能执行 SSOT)、async-openai(浏览器 BYOK LLM)。 --- @@ -14,42 +14,52 @@ Probing Web 是 **训练/推理现场的 live 诊断工作台**,不是 experim 现象(Dashboard / Training / Spans) → Investigation 上下文(step / trace / pid,URL 同步 + 页内 hint) → Profiling / SQL 证据 - → Investigate Agent + Playbook 结构化诊断 + → Investigate Agent + Skill 结构化诊断 ``` ### 1.1 命名消歧(侧栏 title 与文案需保持一致) | UI 名称 | 路由 | 含义 | |---------|------|------| -| **Distributed Spans** | `/spans`(`/traces` 遗留别名) | `python.trace_event` 层级 span,分布式追踪 | +| **Spans** | `/spans`(`/traces` 遗留别名) | `python.trace_event` 层级 span,分布式追踪 | | **Profiling · Chrome trace** 等 | `/profiling/:view` | pprof / torch 火焰图、Kineto 类 timeline(非 Spans) | | **Python** | `/python` | 函数级 live 变量 trace(非 Spans) | -| **Investigate** | `/agent` | Playbook + 可选 LLM 的诊断 Agent | +| **Investigate** | `/agent` | Skill + 可选 LLM 的诊断 Agent | ### 1.2 全局壳层(非路由) -挂载于 `AppLayout` 或 `App` 根节点,任意页面可用: +挂载于 `App` 根节点或 `AppLayout`,任意页面可用: | 组件 | 快捷键 / 触发 | 职责 | |------|----------------|------| +| `AppOverlays` | 侧栏 Monitors 点击 / `file:line` | 根级 viewport overlay(任务队列、Torch overhead、源码预览) | | `CommandBar` + `GlobalCommandPanel` | ⌘K | SQL / eval REPL | | `AgentPanel` | ⌘J(`/agent` 全页时禁用浮层) | 右侧浮层 Agent | -| `InvestigationContextHint` | 页内(有上下文时) | 轻量提示条 + 跳转 Distributed Spans | -| `SidebarTaskQueue` | — | 全局异步任务队列(可取消) | -| `SourceViewerOverlay` | 点击 `file:line` | 源码预览 modal | +| `InvestigationContextHint` | 页内(有上下文时) | 轻量提示条 + 跳转 Spans | +| `SidebarMonitors` | — | 侧栏底部紧凑摘要(Tasks + Torch overhead);点击打开对应 overlay | | `LlmSettingsOverlay` | Agent ⚙ | LLM API 配置(localStorage) | | `ShortcutsHelpOverlay` | `?` | 快捷键帮助 | | `PageContextSync` | 路由变更 | 同步 `PAGE_CONTEXT`、拉 page snapshot | | `InvestigationUrlSync` | — | 上下文 ↔ URL query 双向同步 | | `UiTaskRuntime` | — | 全局任务计时 tick | +**Overlay 状态机**(`state/overlays.rs`): + +```text +APP_OVERLAY: None | SourceViewer(path, line) | Monitor(Tasks | Overhead) +``` + +- `open_monitor_overlay` / `open_source_viewer` 统一走 `open_app_overlay`,并 `lock_body_scroll`。 +- 渲染入口:`components/app_overlays.rs`(`App` 根挂载,与 `Router` 并列)。 +- 视觉壳:`components/overlay_shell.rs`(居中 modal;局部 Esc 关闭)。 + --- ## 二、界面设计原则 ### 2.1 布局 -- **整体**:左侧固定侧栏 + 右侧主列(CommandBar → Investigation 条 → 主内容);侧栏可收起(localStorage)、可拖拽宽度(200–600px)。 +- **整体**:左侧固定侧栏 + 右侧主列(CommandBar → 主内容);侧栏可收起(localStorage)、可拖拽宽度(200–600px)。 - **标准主内容**:`max-w-7xl mx-auto`,`p-4 sm:p-6`,背景 `bg-gray-50`(与根容器一致)。 - **Fullscreen 主内容**:`AppLayout { fullscreen: true }` 时去掉 `max-w-7xl`,内层 `w-full h-full min-h-0`,用于 Profiling、Spans 等可视化页。padding 仍保留(后续可改为真正 edge-to-edge)。 - **响应式**:主列随侧栏显隐自适应;表格/火焰图/时间线支持横向滚动;窄屏侧栏为 fixed 宽度(暂无 drawer 模式)。 @@ -81,11 +91,10 @@ Probing Web 是 **训练/推理现场的 live 诊断工作台**,不是 experim ```text Logo ├── Overview: Dashboard, Investigate, Stacks▾ -├── Analysis: Profiling▾, Analytics, Distributed Spans, Training, Pulsing +├── Analysis: Profiling▾, Analytics, Spans, Training, Pulsing ├── System: Cluster, Python -├── Correlate(仅 investigation 非空时) nav(flex-1 滚动) -Tasks(底部任务队列) +Monitors: Background tasks · Torch overhead(摘要行,点击打开 overlay) GitHub footer ``` @@ -96,21 +105,21 @@ GitHub footer | ⌘K / Ctrl+K | 打开 Command Panel | | ⌘J / Ctrl+J | 切换 Agent 浮层(非 input focus) | | `?` | 快捷键帮助 | -| Esc | 关闭最顶层 overlay(command / agent / source / settings) | +| Esc | 关闭最顶层 overlay:Shortcuts → Command → Agent → SourceViewer | + +**注意**:Tasks / Overhead **monitor overlay** 由 `OverlayShell` 内 Esc 关闭;全局 Esc 链目前**不包含** `APP_OVERLAY::Monitor`(见 §九)。 --- ## 三、Investigation 上下文 -跨页共享的调查上下文,驱动 Correlate、Agent LLM grounding、URL 深链。 +跨页共享的调查上下文,驱动 Agent LLM grounding、URL 深链、Spans 过滤同步。 | 模块 | 路径 | 职责 | |------|------|------| | 状态 | `state/investigation.rs` | `INVESTIGATION_CONTEXT`(step、trace_id、span、pid 等) | | URL | `state/investigation_url.rs` | query 参数读写、与 localStorage 同步 | -| 顶栏 | `investigation_context_bar.rs` | 摘要 + Clear | -| 侧栏 | `sidebar/correlate.rs` | 按上下文显示 Spans / Profiling / Analytics 快捷链 | -| 提示 | `investigation_context_hint.rs` | 页内空状态引导 | +| 提示 | `components/investigation_context_hint.rs` | 页内空状态 / 上下文引导 | **写入入口示例**:Training 热力格、Spans 过滤、Dashboard 线程行、Agent step 导航。 @@ -120,60 +129,97 @@ GitHub footer ## 四、全局任务队列(`state/ui_tasks.rs`) -浏览器内可取消的异步任务 registry,替代原 `AGENT_RUNNING`。 +浏览器内可取消的异步任务 registry。 | 概念 | 说明 | |------|------| | `UiTaskHandle` | 单任务;`is_cancelled()` / `finish()` / `fail()` / `cancel()` | -| `UiTaskSession` | Agent / playbook 会话组;取消任一项可取消整组 | +| `UiTaskSession` | Agent / skill 会话组;取消任一项可取消整组 | | `open_ui_task` | 独立任务(如 snapshot) | | `begin_snapshot_task` | 路由切换 supersede 上一个 snapshot | | `ui_agent_busy()` | Agent 输入禁用、chip disabled | -| `UI_TASK_TICK` | 500ms tick,驱动侧栏 elapsed 显示 | +| `UI_TASK_TICK` | 500ms tick,驱动侧栏 Monitors elapsed 显示 | + +**任务种类**(`UiTaskKind`):`Agent` · `Snapshot` · `Skill` · `Query`(Query 预留,Command Panel 待接入)。 -**接入点**:page snapshot、Agent LLM、playbook step。Command Panel eval 等待接入。 +**UI 入口**:侧栏 `SidebarMonitors` 摘要 → `AppOverlays::TasksMonitorOverlay` 全屏列表(可 Cancel all / Clear finished)。 --- -## 五、Agent 与 Playbook +## 五、Torch Overhead 监控 + +侧栏与 overlay 共用的 TorchProbe 开销视图(与 `docs/src/design/overhead-invariants.*` 对齐)。 + +| 层 | 路径 | 职责 | +|----|------|------| +| 领域 | `overhead/metrics.rs` | `OverheadSnapshot`、等级判定、侧栏文案 | +| SQL | `overhead/sql.rs` | 固定窗口 SQL(`WINDOW_STEPS=80` 等常量) | +| API | `api/overhead.rs` | `fetch_overhead_summary`、NCCL counters 可选 | +| UI | `components/overhead/panel.rs` | `TorchOverheadPanel` 表格与脚注 | +| 侧栏 | `components/sidebar/monitors.rs` | 轮询摘要 + 打开 `OverheadMonitorOverlay` | + +轮询间隔:`OVERHEAD_POLL_MS`(2000ms),页面不可见时 `use_poll_tick_gated` 暂停。 + +--- + +## 六、Agent 与 Skills + +Web **不嵌入** skill YAML;启动时从 probing server 拉取,执行走共享 Rust crate `probing-skills`。 | 模块 | 路径 | 职责 | |------|------|------| | UI | `components/agent/` | `chat.rs`(全页 + 浮层)、`step_card.rs`、`panel.rs`、`settings.rs` | -| 路由 | `agent/routing.rs` | 页面描述、`include_str!` 读 `playbooks/` YAML | -| 执行 | `agent/runner.rs` | sql / api / ui 步骤、cluster fan-out | -| LLM | `agent/llm.rs` | `select_playbook`、`summarize_run`(async-openai) | +| 加载 | `agent/skill.rs` | 内存 store;`populate_skill_store` | +| API | `api/skills.rs` | `GET /apis/pythonext/skills/routing` + per-id `load` | +| 路由 | `agent/routing.rs` | `Route` → page_id;catalog / intents / pages 来自 server | +| 执行 | `agent/runner.rs` | `run_skill` → `probing_skills::run_step` | +| 后端 | `agent/skills_backend.rs` | `WebBackend`:`POST /query`、`/apis/cluster/query`、GET API | +| 解释 | `agent/interpret.rs` | 桥接 `probing-skills` interpret 类型 | +| LLM | `agent/llm.rs` | `select_skill`、`summarize_run`(async-openai) | | 状态 | `state/agent.rs` | 消息、输入、浮层宽度 | -Playbook 与 CLI/Python 共用 `playbooks/` 目录;详见仓库根 `playbooks/README.md`。 +**数据流**: + +```text +AppLayout mount → ApiClient::load_skill_store() + → /apis/pythonext/skills/routing + /load?id=… + → agent/skill.rs STORE +Agent chip / LLM → resolve_skill_id → run_skill(WebBackend) + → probing-skills runner (与 CLI / MCP 同语义) +``` + +Skill 内容 SSOT:仓库根 `skills/`(wheel:`python/probing/bundled_skills/`)。详见 `skills/README.md`、`AGENTS.md`。 --- -## 六、代码结构 +## 七、代码结构 ``` web/src/ ├── main.rs # WASM 入口;支持 base_path 子路径部署 -├── app.rs # Route 枚举 + 页面包 AppLayout + App 根 overlay -├── api/ # ApiClient 与分域 endpoint -├── agent/ # Playbook、LLM、runner、page snapshot +├── app.rs # Route 枚举 + 页面包 AppLayout + App 根 AppOverlays +├── api/ # ApiClient 与分域 endpoint(含 skills、overhead) +├── agent/ # Skill 加载、LLM、runner、WebBackend、routing +├── overhead/ # Torch overhead 领域逻辑(metrics + SQL,无 UI) ├── hooks/mod.rs # use_app_resource(首选)、use_api(遗留)、poll 辅助 ├── pages/ # 业务页 │ ├── dashboard.rs │ ├── agent.rs │ ├── profiling.rs -│ ├── traces.rs # Distributed Spans(/spans、/traces) +│ ├── traces.rs # Spans(/spans、/traces redirect) │ ├── training.rs │ ├── analytics.rs │ ├── stack.rs │ ├── python/ │ ├── pulsing.rs │ └── cluster.rs -├── state/ # GlobalSignal 模块 +├── state/ │ ├── investigation.rs │ ├── investigation_url.rs │ ├── page_context.rs │ ├── ui_tasks.rs +│ ├── overlays.rs # APP_OVERLAY 状态机 +│ ├── scroll_lock.rs # overlay 打开时锁定 body 滚动 │ ├── profiling.rs │ ├── stack.rs │ ├── agent.rs @@ -181,56 +227,60 @@ web/src/ │ ├── sidebar.rs │ ├── commands.rs │ ├── llm_config.rs -│ └── source_viewer.rs +│ └── source_viewer.rs # 薄封装,转发 overlays API ├── components/ │ ├── layout.rs # AppLayout 壳 -│ ├── sidebar/ # 导航、Profiling/Stack 子菜单、Correlate、Tasks -│ ├── workspace/ # Agent 新视觉层 +│ ├── app_overlays.rs # Tasks / Overhead / SourceViewer 根渲染 +│ ├── overlay_shell.rs # 居中 modal 壳 +│ ├── sidebar/ # 导航、Monitors、Profiling/Stack 子菜单、resize +│ ├── overhead/ # TorchOverheadPanel(UI) +│ ├── workspace/ │ ├── agent/ │ ├── flamegraph/ -│ ├── timeline_viewer/ # 原生 Chrome trace(替代 iframe) +│ ├── timeline_viewer/ │ ├── source_viewer.rs │ ├── global_command_panel.rs -│ ├── investigation_context_bar.rs +│ ├── investigation_context_hint.rs │ ├── profile_snapshot_bar.rs │ ├── page_context_sync.rs │ ├── ui_task_runtime.rs │ ├── keyboard_shortcuts.rs -│ ├── page.rs / card.rs / common.rs / colors.rs │ └── ... -└── utils/ # error、base_path、source_ref、markdown 等 +└── utils/ ``` -### 6.1 约定 +### 7.1 约定 | 主题 | 约定 | |------|------| | **新页面** | 放 `pages/`,在 `app.rs` 注册 `Route` + 路由组件 | -| **跨页状态** | `state/` GlobalSignal;避免在 render 分支内 `write()`(应用 `use_effect`) | +| **跨页状态** | `state/` GlobalSignal;避免在 render 分支内 `write()`(用 `use_effect`) | | **拉数** | 新代码用 `use_app_resource` + `AsyncBoundary`;`use_api` 仅遗留页(如 Pulsing) | | **样式** | `colors.rs` 常量 > 硬编码 Tailwind | | **错误** | `utils/error.rs` 的 `AppError` + `display_message()` | -| **Playbook** | 改 YAML + `playbooks/`;Web 侧 catalog 由 `agent/routing.rs` 嵌入 | +| **Skills** | 改 `skills//` + `python -m probing.skills validate`;Web 运行时从 server 加载 | +| **新 overlay** | 扩展 `AppOverlay` 枚举 + `app_overlays.rs` 分支;优先复用 `OverlayShell` | | **WASM 限制** | `dioxus-code` 仅 native;Source viewer 为 plain text + 行号 gutter | -### 6.2 组件职责(扩展) +### 7.2 组件职责(扩展) | 模块 | 职责 | |------|------| -| `layout` | 侧栏、CommandBar、Investigation 条、Agent 浮层容器 | -| `sidebar` | 导航、Correlate、Tasks、Profiling/Stack 控件、resize | +| `layout` | 侧栏、CommandBar、主内容区、Agent 浮层容器;启动 `load_skill_store` | +| `sidebar` | 导航、Monitors 摘要、Profiling/Stack 控件、resize | +| `app_overlays` | 根级 Tasks / Overhead / SourceViewer | | `flamegraph` | pprof / torch 火焰图、diff | | `timeline_viewer` | trace / pytorch / ray timeline | | `profile_snapshot_bar` | 火焰图 capture + baseline diff(会话内内存) | | `callstack_view` | 混合栈 + SourceLocationLink | -| `source_viewer` | 全局源码 modal | +| `source_viewer` | 源码 modal(经 `APP_OVERLAY`) | | `global_command_panel` | ⌘K REPL | | `dataframe_view` / `table_view` | 表格展示 | | `poll_status` | 轮询状态条 | --- -## 七、路由一览 +## 八、路由一览 | 路由 | 页面 | AppLayout | |------|------|-----------| @@ -241,41 +291,47 @@ web/src/ | `/profiling`, `/profiling/:view` | Profiling | **fullscreen** | | `/analytics` | Analytics SQL | 标准 | | `/python` | Python variable trace | 标准 | -| `/spans`, `/traces` | Distributed Spans | **fullscreen** | +| `/spans`, `/traces` | Spans(`/traces` → redirect) | **fullscreen** | | `/training` | Training 热力图 / collective | 标准 | | `/pulsing` | Pulsing actors | 标准 | | `/chrome-tracing` | → redirect `/profiling/trace` | — | --- -## 八、构建与部署 +## 九、构建与部署 - 开发 / 构建:`dx serve` / `dx build --release`;仓库根 `make frontend` 复制产物到 `web/dist/`。 - UI 静态资源由 Python 包提供(wheel:`python/probing/_web/`;editable:`web/dist/`),经 `probing.web_assets` 设置 `PROBING_ASSETS_ROOT`,`probing-server` 只读该目录;未配置时返回占位页。 --- -## 九、已知差距与后续方向 +## 十、已知差距与后续方向 以下为当前实现与理想状态之间的差距,供迭代参考(非阻塞发布): -**已修复(P0)**:`pages/stack.rs` 侧栏帧计数改为 `use_effect` 写入 `STACK_SNAPSHOT`(不在 render 分支写 GlobalSignal);已删除未使用的 `chrome_tracing_iframe`(timeline 由 `timeline_viewer/` 原生实现)。 +**已修复(历史 P0)**:`pages/stack.rs` 侧栏帧计数改为 `use_effect`;删除 `chrome_tracing_iframe`;Playbook 体系迁移为 Skills + `probing-skills`。 + +**重构后已落地**:`SidebarMonitors` + `AppOverlays`;`overhead/` 领域模块;runtime skill 加载;`OverlayShell` 统一 modal。 -1. **`/traces` 与 `/spans` 重复** — 侧栏仅推广 `/spans`;`/traces` 保留兼容。 -2. **Fullscreen padding** — Profiling/Spans 仍带 `p-4 sm:p-6`,未完全 edge-to-edge。 -3. **Profile snapshots** — 仅内存,刷新丢失;可接 sessionStorage。 -4. **Pulsing** — 仍用 legacy `use_api`,未接 investigation / poll。 -5. **ui_tasks** — Command Panel、Profiling Start 等待接入。 -6. **移动端** — 无侧栏 drawer;Agent 浮层窄屏体验待优化。 -7. **W&B / MLflow** — 互补集成(run 关联、诊断写回),非 UI 内建 experiment tracking。 +1. **全局 Esc 与 monitor overlay** — `keyboard_shortcuts.rs` 未调用 `close_app_overlay()`;Tasks/Overhead 仅依赖 `OverlayShell` 局部 Esc。 +2. **`/traces` 与 `/spans` 重复** — 侧栏仅推广 `/spans`;`/traces` 保留兼容 redirect。 +3. **Fullscreen padding** — Profiling/Spans 仍带 `p-4 sm:p-6`,未完全 edge-to-edge。 +4. **Profile snapshots** — 仅内存,刷新丢失;可接 sessionStorage。 +5. **Pulsing** — 仍用 legacy `use_api`,未接 investigation / poll。 +6. **`ui_tasks::Query`** — Command Panel eval 等待接入任务队列。 +7. **移动端** — 无侧栏 drawer;Agent 浮层窄屏体验待优化。 +8. **W&B / MLflow** — 互补集成(run 关联、诊断写回),非 UI 内建 experiment tracking。 --- -## 十、相关文档 +## 十一、相关文档 | 文档 | 位置 | |------|------| -| Playbook 格式与路由 | `playbooks/README.md` | +| Skills 格式与 catalog | `skills/README.md`、`skills/catalog.yaml` | +| Agent / MCP 集成 | 仓库根 `AGENTS.md` | +| TorchProbe / overhead 不变量 | `docs/src/design/overhead-invariants.zh.md` | | Profiling / TorchProbe | `docs/src/design/profiling.zh.md` | | 扩展与自定义表 | `docs/src/design/extensibility.zh.md` | | 训练调试示例 | `docs/src/examples/training-debugging.zh.md` | +| HTTP / skills API | `probing/server/API.md` | diff --git a/web/assets/tailwind.css b/web/assets/tailwind.css index f23bfdd8..ab9acb78 100644 --- a/web/assets/tailwind.css +++ b/web/assets/tailwind.css @@ -1936,6 +1936,11 @@ video { border-bottom-left-radius: 0.25rem; } +.rounded-t { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + .rounded-t-sm { border-top-left-radius: 0.125rem; border-top-right-radius: 0.125rem; @@ -4941,6 +4946,10 @@ video { padding-left: 2rem; } +.pl-\[18px\] { + padding-left: 18px; +} + .pr-1 { padding-right: 0.25rem; } @@ -5093,6 +5102,10 @@ video { line-height: 1.25rem; } +.leading-none { + line-height: 1; +} + .leading-relaxed { line-height: 1.625; } @@ -5221,6 +5234,11 @@ video { color: rgb(167 243 208 / var(--tw-text-opacity, 1)); } +.text-emerald-300 { + --tw-text-opacity: 1; + color: rgb(110 231 183 / var(--tw-text-opacity, 1)); +} + .text-emerald-400\/90 { color: rgb(52 211 153 / 0.9); } @@ -5250,6 +5268,11 @@ video { color: rgb(6 95 70 / var(--tw-text-opacity, 1)); } +.text-emerald-900 { + --tw-text-opacity: 1; + color: rgb(6 78 59 / var(--tw-text-opacity, 1)); +} + .text-gray-100 { --tw-text-opacity: 1; color: rgb(243 244 246 / var(--tw-text-opacity, 1)); @@ -5344,6 +5367,11 @@ video { color: rgb(154 52 18 / var(--tw-text-opacity, 1)); } +.text-orange-900 { + --tw-text-opacity: 1; + color: rgb(124 45 18 / var(--tw-text-opacity, 1)); +} + .text-purple-800 { --tw-text-opacity: 1; color: rgb(107 33 168 / var(--tw-text-opacity, 1)); @@ -5974,6 +6002,14 @@ video { transition-duration: 300ms; } +.duration-500 { + transition-duration: 500ms; +} + +.ease-out { + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + /* Custom styles for the probing web interface */ .page-layout { @@ -7343,10 +7379,6 @@ video { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .lg\:grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } - .lg\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } diff --git a/web/dist b/web/dist index 47c17eb7..d94bccd8 120000 --- a/web/dist +++ b/web/dist @@ -1 +1 @@ -python/probing/bundled_web/public \ No newline at end of file +../python/probing/bundled_web/public \ No newline at end of file diff --git a/web/src/agent/interpret.rs b/web/src/agent/interpret.rs index eb628d07..78b31c64 100644 --- a/web/src/agent/interpret.rs +++ b/web/src/agent/interpret.rs @@ -4,7 +4,8 @@ use std::collections::HashMap; use probing_proto::prelude::DataFrame; use probing_skills::{ - evaluate_rules as shared_evaluate_rules, InterpretFinding, InterpretRule, Skill, + build_summary, cluster_integrity_findings, evaluate_rules as shared_evaluate_rules, + InterpretFinding, InterpretRule, Skill, }; use crate::agent::runner::StepOutcome; @@ -57,7 +58,49 @@ pub fn evaluate_rules_for_skill( params: &HashMap, ) -> Vec { let steps = evidence_from_outcomes(outcomes); - evaluate_rules(&skill.interpretation, &steps, params) + let mut findings = evaluate_rules(&skill.interpretation, &steps, params); + let runner_outcomes: Vec = + outcomes.iter().filter_map(web_outcome_to_runner).collect(); + findings.extend(cluster_integrity_findings(&runner_outcomes)); + findings +} + +pub fn build_skill_summary( + skill: &Skill, + outcomes: &[StepOutcome], + params: &HashMap, +) -> String { + let steps: Vec = evidence_from_outcomes(outcomes) + .into_iter() + .map(|s| probing_skills::StepEvidence { + step_id: s.step_id, + row_count: s.row_count, + dataframe: s.dataframe, + }) + .collect(); + build_summary(skill, &steps, params) +} + +fn web_outcome_to_runner(outcome: &StepOutcome) -> Option { + match outcome { + StepOutcome::Sql { + step_id, + title, + dataframe, + row_count, + cluster_meta, + .. + } => Some(probing_skills::runner::StepOutcome::Sql { + step_id: step_id.clone(), + title: title.clone(), + dataframe: dataframe.clone(), + row_count: *row_count, + note: None, + degraded: cluster_meta.as_ref().is_some_and(|m| m.partial), + cluster_meta: cluster_meta.clone(), + }), + _ => None, + } } pub fn format_findings(findings: &[InterpretFinding]) -> String { diff --git a/web/src/agent/mod.rs b/web/src/agent/mod.rs index 2bfe6e0b..4f05ad5e 100644 --- a/web/src/agent/mod.rs +++ b/web/src/agent/mod.rs @@ -11,14 +11,14 @@ mod skills_backend; mod source_bridge; pub use cluster::fetch_cluster_snapshot; -pub use interpret::{evaluate_rules_for_skill, format_findings}; +pub use interpret::{build_skill_summary, evaluate_rules_for_skill, format_findings}; pub use llm::{outcomes_to_evidence, select_skill, summarize_run}; pub use page_tools::refresh_page_snapshot_for_route; pub use routing::routing_context_for_llm; pub use runner::{run_skill, StepOutcome}; pub use skill::{ - list_skill_ids, load_skill, populate_skill_store, resolve_skill_id, RoutingPayload, - SkillPayload, + list_skill_ids, load_skill, populate_skill_store, resolve_skill_id, skill_store_loaded, + RoutingPayload, SkillPayload, }; pub use source_bridge::{ ask_agent_about_source, ask_and_run_agent_about_source, run_skill_with_source, diff --git a/web/src/agent/runner.rs b/web/src/agent/runner.rs index 7818ddf0..f86ca83f 100644 --- a/web/src/agent/runner.rs +++ b/web/src/agent/runner.rs @@ -18,6 +18,7 @@ pub enum StepOutcome { row_count: usize, empty_message: Option, cluster_note: Option, + cluster_meta: Option, }, ApiText { step_id: String, @@ -54,6 +55,7 @@ fn map_outcome( dataframe, row_count, note, + cluster_meta, .. } => StepOutcome::Sql { step_id, @@ -62,6 +64,7 @@ fn map_outcome( row_count, empty_message: None, cluster_note: note, + cluster_meta, }, O::ApiText { step_id, diff --git a/web/src/agent/skills_backend.rs b/web/src/agent/skills_backend.rs index 034a75d6..7a35ab73 100644 --- a/web/src/agent/skills_backend.rs +++ b/web/src/agent/skills_backend.rs @@ -1,7 +1,7 @@ //! Browser HTTP backend for the shared skill runner. use probing_proto::prelude::DataFrame; -use probing_skills::backend::{ClusterQueryMeta, SkillBackend}; +use probing_skills::backend::{parse_cluster_query_response, ClusterQueryMeta, SkillBackend}; use probing_skills::runner::{Result, SkillRunError}; use crate::api::ApiClient; @@ -25,13 +25,12 @@ impl SkillBackend for WebBackend { .cluster_query(sql, true) .await .map_err(|e| SkillRunError(e.display_message()))?; - let meta = ClusterQueryMeta { - partial: !resp.meta.nodes_failed.is_empty(), - nodes_queried: resp.meta.nodes_queried, - nodes_failed: resp.meta.nodes_failed.clone(), - peer_batches_dropped: 0, - }; - Ok((resp.dataframe, Some(meta))) + let value = serde_json::json!({ + "dataframe": resp.dataframe, + "meta": resp.meta, + }); + let (dataframe, meta) = parse_cluster_query_response(&value)?; + Ok((dataframe, meta)) } async fn get(&self, path: &str) -> Result { diff --git a/web/src/api/cluster.rs b/web/src/api/cluster.rs index 082c7dff..7b19160f 100644 --- a/web/src/api/cluster.rs +++ b/web/src/api/cluster.rs @@ -14,6 +14,10 @@ pub struct ClusterQueryMeta { pub cluster: bool, pub nodes_queried: usize, pub nodes_failed: Vec, + #[serde(default)] + pub peer_batches_dropped: usize, + #[serde(default)] + pub partial: bool, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/web/src/api/overhead.rs b/web/src/api/overhead.rs index fea03bd9..d8bf4cd0 100644 --- a/web/src/api/overhead.rs +++ b/web/src/api/overhead.rs @@ -3,7 +3,7 @@ use crate::overhead::sql::{self, NCCL_COUNTERS, TRAIN_STEP_MEDIAN}; use crate::utils::error::{AppError, Result}; use probing_proto::prelude::DataFrame; -pub const OVERHEAD_POLL_MS: u32 = 5000; +pub const OVERHEAD_POLL_MS: u32 = 2000; pub fn empty_dataframe() -> DataFrame { DataFrame { diff --git a/web/src/api/skills.rs b/web/src/api/skills.rs index df46f521..4235197c 100644 --- a/web/src/api/skills.rs +++ b/web/src/api/skills.rs @@ -19,11 +19,22 @@ impl ApiClient { pub async fn load_skill_store(&self) -> Result<()> { let routing = self.fetch_skills_routing().await?; let mut payloads = Vec::new(); + let mut failed = Vec::new(); for entry in &routing.catalog.skills { - if let Ok(payload) = self.fetch_skill_payload(&entry.id).await { - payloads.push(payload); + match self.fetch_skill_payload(&entry.id).await { + Ok(payload) => payloads.push(payload), + Err(err) => { + log::warn!("skill store: failed to load {}: {}", entry.id, err); + failed.push(entry.id.clone()); + } } } + if payloads.is_empty() && !routing.catalog.skills.is_empty() { + return Err(crate::utils::error::AppError::Api(format!( + "failed to load any skills ({} errors)", + failed.len() + ))); + } populate_skill_store(routing, payloads); Ok(()) } diff --git a/web/src/components/agent/chat.rs b/web/src/components/agent/chat.rs index 2b6ad7d7..77519403 100644 --- a/web/src/components/agent/chat.rs +++ b/web/src/components/agent/chat.rs @@ -6,8 +6,10 @@ use dioxus::prelude::*; use crate::agent::{ evaluate_rules_for_skill, format_findings, list_skill_ids, load_skill, - refresh_page_snapshot_for_route, resolve_skill_id, run_skill, select_skill, summarize_run, + refresh_page_snapshot_for_route, resolve_skill_id, run_skill, select_skill, skill_store_loaded, + summarize_run, }; +use crate::api::ApiClient; use crate::app::Route; use crate::components::agent::step_card::{step_outcome_to_card, AgentSkillRunCard, AgentStepCard}; use crate::components::colors::colors; @@ -525,6 +527,16 @@ fn spawn_run_skill( }); } +async fn ensure_skill_store_ready() -> std::result::Result<(), String> { + if skill_store_loaded() { + return Ok(()); + } + ApiClient::new() + .load_skill_store() + .await + .map_err(|e| e.to_string()) +} + async fn run_skill_flow( session: &UiTaskSession, skill_id: &str, @@ -535,6 +547,13 @@ async fn run_skill_flow( return; } + if let Err(msg) = ensure_skill_store_ready().await { + push_agent_message(AgentMessage::error(format!( + "Skill catalog not loaded: {msg}. Check that the probing server is running." + ))); + return; + } + let Some(meta) = load_skill(skill_id) else { push_agent_message(AgentMessage::error(format!("Unknown skill: {skill_id}"))); return; @@ -570,6 +589,11 @@ async fn run_skill_flow( } let findings = evaluate_rules_for_skill(&pb, &outcomes, &ctx); let evidence = crate::agent::outcomes_to_evidence(&outcomes); + let fallback_summary = if llm_followup.is_none() { + crate::agent::build_skill_summary(&pb, &outcomes, &ctx) + } else { + String::new() + }; for outcome in outcomes { push_agent_message(AgentMessage::step_card(step_outcome_to_card(outcome))); } @@ -606,7 +630,9 @@ async fn run_skill_flow( } } } else { - if !pb.summary_template.is_empty() { + if !fallback_summary.is_empty() { + push_agent_message(AgentMessage::assistant(fallback_summary)); + } else if !pb.summary_template.is_empty() { push_agent_message(AgentMessage::assistant(pb.summary_template.clone())); } if !pb.next_steps.is_empty() { diff --git a/web/src/components/agent/step_card.rs b/web/src/components/agent/step_card.rs index 95a03921..5ed2a39c 100644 --- a/web/src/components/agent/step_card.rs +++ b/web/src/components/agent/step_card.rs @@ -90,14 +90,24 @@ pub fn step_outcome_to_card(outcome: StepOutcome) -> AgentStepCardData { row_count, empty_message, cluster_note, + cluster_meta, + .. } => { - let status = if row_count > 0 { + let partial = cluster_meta.as_ref().is_some_and(|m| m.partial); + let status = if partial { + AgentStepStatus::Warn + } else if row_count > 0 { AgentStepStatus::Ok } else if empty_message.is_some() { AgentStepStatus::Warn } else { AgentStepStatus::Skipped }; + let cluster_note = match (partial, cluster_note) { + (true, Some(note)) => Some(format!("partial · {note}")), + (true, None) => Some("partial cluster data".to_string()), + (false, note) => note, + }; AgentStepCardData { step_id, title, diff --git a/web/src/components/app_overlays.rs b/web/src/components/app_overlays.rs index eeb3ae0b..942526aa 100644 --- a/web/src/components/app_overlays.rs +++ b/web/src/components/app_overlays.rs @@ -3,10 +3,10 @@ use dioxus::prelude::*; use crate::api::OVERHEAD_POLL_MS; -use crate::components::common::AsyncBoundary; use crate::components::icon::Icon; use crate::components::overhead::TorchOverheadPanel; use crate::components::overlay_shell::{OverlayAccent, OverlayShell}; +use crate::components::poll_status::PollStatusBar; use crate::components::source_viewer::SourceViewerOverlay; use crate::hooks::{use_page_visible, use_poll_tick_gated}; use crate::state::overlays::{app_overlay, close_app_overlay, AppOverlay, SidebarMonitor}; @@ -122,21 +122,20 @@ fn OverheadMonitorOverlay(on_close: EventHandler<()>) -> Element { rsx! { OverlayShell { title: "Torch profiling overhead".to_string(), - subtitle: format!( - "TorchProbe in-run cost vs shadow baseline · refreshes every {}s · Esc to close", - OVERHEAD_POLL_MS / 1000 - ), + subtitle: "Observed step times + computed hook overhead · Esc to close".to_string(), accent: OverlayAccent::Emerald, close_label: "Close overhead monitor".to_string(), on_close: on_close, header_icon: rsx! { Icon { icon: &icondata::CgPerformance, class: "w-5 h-5" } }, - header_actions: rsx! { div {} }, - AsyncBoundary { - message: Some("Loading overhead…".to_string()), - TorchOverheadPanel { refresh_tick: refresh_tick } - } + header_actions: rsx! { + PollStatusBar { + interval_secs: OVERHEAD_POLL_MS / 1000, + poll_tick: refresh_tick, + } + }, + TorchOverheadPanel { refresh_tick: refresh_tick } } } } diff --git a/web/src/components/overhead/mod.rs b/web/src/components/overhead/mod.rs index 25176178..803d7bf7 100644 --- a/web/src/components/overhead/mod.rs +++ b/web/src/components/overhead/mod.rs @@ -3,5 +3,5 @@ mod panel; pub use crate::api::OVERHEAD_POLL_MS; -pub use crate::overhead::{overhead_trigger_label, table_missing_trigger_label}; +pub use crate::overhead::table_missing_trigger_label; pub use panel::TorchOverheadPanel; diff --git a/web/src/components/overhead/panel.rs b/web/src/components/overhead/panel.rs index 6c0d891c..0bbbbb2b 100644 --- a/web/src/components/overhead/panel.rs +++ b/web/src/components/overhead/panel.rs @@ -1,61 +1,113 @@ //! TorchProbe overhead dashboard panel (presentation only). use dioxus::prelude::*; -use probing_proto::prelude::{DataFrame, Ele}; +use probing_proto::prelude::DataFrame; -use crate::api::{empty_dataframe, ApiClient}; -use crate::components::common::{AppErrorDisplay, EmptyState}; +use crate::api::{empty_dataframe, is_nccl_counters_missing, ApiClient}; +use crate::components::common::{AppErrorDisplay, EmptyState, LoadingState}; use crate::components::stat_card::StatCard; -use crate::hooks::use_app_resource; +use crate::hooks::{use_api_with_options, ApiFetchOptions, ApiState}; +use crate::overhead::sql::WINDOW_STEPS; use crate::overhead::{ - dataframe_rows, df_scalar_f64, df_scalar_i64, format_overhead_pct, format_step_ms, - parse_overhead_steps, table_missing_message, OverheadStep, + dataframe_rows, format_pct_display, format_pct_signed, format_step_ms, parse_overhead_steps, + table_missing_message, OverheadLevel, OverheadSnapshot, OverheadStep, }; use crate::utils::error::AppError; +fn refresh_options() -> ApiFetchOptions { + ApiFetchOptions { + keep_previous_while_refreshing: true, + } +} + #[component] pub fn TorchOverheadPanel(refresh_tick: u32) -> Element { - let summary = use_app_resource(move || { - let _ = refresh_tick; - async move { ApiClient::new().fetch_overhead_summary().await } - }); - let recent = use_app_resource(move || { - let _ = refresh_tick; - async move { ApiClient::new().fetch_overhead_recent_steps().await } - }); - let train_step = use_app_resource(move || { - let _ = refresh_tick; - async move { ApiClient::new().fetch_overhead_train_step_median().await } - }); + let refresh = refresh_options(); let nccl_skip = use_signal(|| false); - let nccl = use_app_resource(move || { - let _ = refresh_tick; - let mut nccl_skip = nccl_skip; - async move { - if nccl_skip() { - return Ok(empty_dataframe()); - } - match ApiClient::new().fetch_overhead_nccl_counters().await { - Ok(None) => { - nccl_skip.set(true); - Ok(empty_dataframe()) + + let summary = use_api_with_options( + move || { + let _ = refresh_tick; + async move { ApiClient::new().fetch_overhead_summary().await } + }, + refresh, + ); + let recent = use_api_with_options( + move || { + let _ = refresh_tick; + async move { ApiClient::new().fetch_overhead_recent_steps().await } + }, + refresh, + ); + let train_step = use_api_with_options( + move || { + let _ = refresh_tick; + async move { ApiClient::new().fetch_overhead_train_step_median().await } + }, + refresh, + ); + let nccl = use_api_with_options( + move || { + let _ = refresh_tick; + let mut nccl_skip = nccl_skip; + let skip = nccl_skip(); + async move { + if skip { + return Ok(empty_dataframe()); + } + match ApiClient::new().fetch_overhead_nccl_counters().await { + Ok(None) => { + nccl_skip.set(true); + Ok(empty_dataframe()) + } + Ok(Some(df)) => Ok(df), + Err(e) if is_nccl_counters_missing(&e) => { + nccl_skip.set(true); + Ok(empty_dataframe()) + } + Err(e) => Err(e), } - Ok(Some(df)) => Ok(df), - Err(e) => Err(e), } - } - }); + }, + refresh, + ); + + let refreshing = summary.is_loading() || recent.is_loading() || train_step.is_loading(); - let summary_res = summary.suspend()?(); - let recent_res = recent.suspend()?(); - let train_step_res = train_step.suspend()?(); - let nccl_res = nccl.suspend()?(); - overhead_body(&summary_res, &recent_res, &train_step_res, &nccl_res) + if summary.data.read().is_none() && summary.is_loading() { + return rsx! { + LoadingState { message: "Loading overhead…".to_string() } + }; + } + + overhead_body( + &resolved_result(&summary), + &resolved_result(&recent), + &resolved_result(&train_step), + &resolved_result(&nccl), + refreshing, + refresh_tick, + ) +} + +fn resolved_result(state: &ApiState) -> Result { + state + .data + .read() + .clone() + .unwrap_or_else(|| Err(AppError::Api("overhead data not loaded".into()))) +} + +fn train_step_ms(train_step: &Result) -> Option { + train_step + .as_ref() + .ok() + .and_then(|df| crate::overhead::df_scalar_f64(df, "train_step_median_ms", 0)) } #[component] -fn OverheadAlerts(shadow_baseline: i64, shadow_n: i64) -> Element { - if shadow_baseline == 0 { +fn OverheadAlerts(snap: OverheadSnapshot) -> Element { + if !snap.shadow_enabled() { return rsx! { div { class: "rounded-md border border-slate-300 bg-slate-50 px-3 py-2 text-xs text-slate-800", @@ -63,32 +115,70 @@ fn OverheadAlerts(shadow_baseline: i64, shadow_n: i64) -> Element { code { class: "font-mono", "shadow=off" } "). Set " code { class: "font-mono", "probing.torch.profiling=on,shadow=4:1" } - " to enable in-run overhead estimates." + " to compare probed vs baseline steps." } }; } - if shadow_n > 0 && shadow_n < 5 { + if snap.shadow_n > 0 && snap.shadow_n < 5 { return rsx! { div { class: "rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-xs text-amber-900", - "Only {shadow_n} shadow baseline step(s) in the window — overhead estimate may be unreliable. Wait for more training steps." + "Only {snap.shadow_n} shadow step(s) in the window — percentages need more samples." } }; } - if shadow_baseline > 0 && shadow_n == 0 { + if snap.shadow_enabled() && snap.shadow_n == 0 { return rsx! { div { class: "rounded-md border border-blue-200 bg-blue-50 px-3 py-2 text-xs text-blue-900", - "Collecting shadow baseline steps — need at least one shadow step per cadence cycle before overhead % is meaningful." + "Collecting shadow baseline steps — wait for one full shadow cadence cycle." } }; } rsx! { div {} } } +#[component] +fn OverheadVerdict(snap: OverheadSnapshot) -> Element { + if !snap.is_stable() { + return rsx! { div {} }; + } + let Some(pct) = snap.dispatch_overhead_pct else { + return rsx! { div {} }; + }; + let level = snap.dispatch_level(); + let display = format_pct_signed(pct); + match level { + OverheadLevel::Low => rsx! { + div { + class: "rounded-md border border-emerald-200 bg-emerald-50 px-3 py-2.5 text-sm text-emerald-900", + span { class: "font-medium", "Profiler overhead {display}" } + " — adds about {display} per step vs shadow baseline. Typical for default settings (<5%)." + } + }, + OverheadLevel::Moderate => rsx! { + div { + class: "rounded-md border border-amber-200 bg-amber-50 px-3 py-2.5 text-sm text-amber-900", + span { class: "font-medium", "Profiler overhead {display}" } + " — above the usual <5% band. Try a lower sample rate or confirm shadow 4:1 is enabled." + } + }, + OverheadLevel::High => rsx! { + div { + class: "rounded-md border border-orange-200 bg-orange-50 px-3 py-2.5 text-sm text-orange-900", + span { class: "font-medium", "Profiler overhead {display}" } + " — unusually high. Check trace_spans, sample rate, and GPU defer settings." + } + }, + OverheadLevel::Unknown => rsx! { div {} }, + } +} + fn overhead_body( summary: &Result, recent: &Result, train_step: &Result, nccl: &Result, + refreshing: bool, + refresh_tick: u32, ) -> Element { if let Err(err) = summary { if let Some(message) = table_missing_message(err) { @@ -101,215 +191,294 @@ fn overhead_body( }; } - let summary_df = summary.as_ref().ok(); + let snap = OverheadSnapshot::from_summary(summary.as_ref().expect("checked Ok")) + .with_train_step_median(train_step_ms(train_step)); let recent_df = recent.as_ref().ok(); let row_count = recent_df.map(dataframe_rows).unwrap_or(0); - let shadow_baseline = summary_df - .and_then(|df| df_scalar_i64(df, "shadow_baseline", 0)) - .unwrap_or(1); - let shadow_n = summary_df - .and_then(|df| df_scalar_i64(df, "shadow_n", 0)) - .unwrap_or(0); - if row_count == 0 { return rsx! { EmptyState { - message: "No python.torch_step_timing rows yet — enable SET probing.torch.profiling=on and wait for a few shadow cycles (default 4:1).".to_string() + message: "No python.torch_step_timing rows yet — enable SET probing.torch.profiling=on and wait for shadow cycles (default 4:1).".to_string() } }; } - if shadow_baseline == 0 { + if !snap.shadow_enabled() { return rsx! { div { class: "space-y-3", - OverheadAlerts { shadow_baseline, shadow_n } + OverheadAlerts { snap: snap.clone() } p { class: "text-xs text-gray-500", - "Timing rows exist but shadow baseline is off — enable shadow cadence to compare probed vs baseline steps." + "Timing rows exist but shadow baseline is off — enable shadow cadence for overhead %." } } }; } - let probed_median_ms = summary_df.and_then(|df| df_scalar_f64(df, "probed_median_ms", 0)); - let sampled_median_ms = summary_df.and_then(|df| df_scalar_f64(df, "sampled_median_ms", 0)); - let shadow_median_ms = summary_df.and_then(|df| df_scalar_f64(df, "shadow_median_ms", 0)); - let probed_mean_ms = summary_df.and_then(|df| df_scalar_f64(df, "probed_mean_ms", 0)); - let shadow_mean_ms = summary_df.and_then(|df| df_scalar_f64(df, "shadow_mean_ms", 0)); - let probed_n = summary_df - .and_then(|df| df_scalar_i64(df, "probed_n", 0)) - .unwrap_or(0); - let sampled_n = summary_df - .and_then(|df| df_scalar_i64(df, "sampled_n", 0)) - .unwrap_or(0); - let latest_step = summary_df - .and_then(|df| df_scalar_i64(df, "latest_step", 0)) - .unwrap_or(-1); - let shadow_normal = summary_df - .and_then(|df| df_scalar_i64(df, "shadow_normal", 0)) - .unwrap_or(4); - let sample_rate = summary_df.and_then(|df| df_scalar_f64(df, "sample_rate", 0)); - let sample_mode = summary_df.and_then(|df| { - df.names - .iter() - .position(|n| n == "sample_mode") - .and_then(|ci| { - summary_df? - .cols - .get(ci) - .filter(|col| !col.is_empty()) - .map(|col| match &col.get(0) { - Ele::Text(s) => s.clone(), - other => format!("{other:?}"), - }) - }) - }); - let train_step_median_ms = train_step - .as_ref() - .ok() - .and_then(|df| df_scalar_f64(df, "train_step_median_ms", 0)); - - let (hook_tax_value, hook_tax_hint) = match (probed_median_ms, shadow_median_ms) { - (Some(p), Some(s)) => format_overhead_pct(p, s, "Hook tax (all probed steps vs shadow)"), - _ => ( - "—".to_string(), - Some("Collecting shadow baseline steps…".to_string()), - ), - }; - let (sampled_overhead_value, sampled_overhead_hint) = - match (sampled_median_ms, shadow_median_ms) { - (Some(p), Some(s)) if sampled_n > 0 => { - format_overhead_pct(p, s, "Active sample steps vs shadow") - } - _ => ("—".to_string(), None), - }; - let (total_overhead_value, total_overhead_hint) = match (probed_mean_ms, shadow_mean_ms) { - (Some(p), Some(s)) => { - format_overhead_pct(p, s, "Amortized: mean(all probed) vs mean(shadow)") - } - _ => ( - "—".to_string(), - Some("Collecting shadow baseline steps…".to_string()), - ), - }; - - let cadence = format!("{shadow_normal}:{shadow_baseline}"); - let sampling_note = match (sample_mode.as_deref(), sample_rate) { - (Some(mode), Some(rate)) => format!(" · {mode} @ {:.0}%", rate * 100.0), - (Some(mode), None) => format!(" · {mode}"), - _ => String::new(), - }; let steps = recent_df.map(parse_overhead_steps).unwrap_or_default(); + let meta = format!( + "Window: {} · cadence {} · sampling {}", + snap.window_label(), + snap.cadence_label(), + snap.sampling_label() + ); rsx! { - div { class: "space-y-4", - OverheadAlerts { shadow_baseline, shadow_n } - p { class: "text-xs text-gray-500", - "Shadow cadence {cadence}{sampling_note} · Total overhead = mean(all probed)/mean(shadow)−1 (amortized) · Hook tax = median(probed)/median(shadow)−1 (cheap dispatch path) · probed median is wall time between optimizer steps · train.step is compute-only" + div { class: "space-y-5", + div { class: "flex flex-wrap items-center justify-between gap-2", + div { class: "space-y-0.5", + p { class: "text-sm font-medium text-gray-900", + "Step {snap.latest_step} · training & hook cost" + } + p { class: "text-xs text-gray-500", "{meta}" } + } + if refreshing { + span { + class: "inline-flex items-center gap-1.5 text-[11px] text-emerald-700", + span { + class: "inline-block w-2.5 h-2.5 border-2 border-emerald-500 border-t-transparent rounded-full animate-spin" + } + "Updating…" + } + } } - div { class: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3", + + OverheadAlerts { snap: snap.clone() } + OverheadVerdict { snap: snap.clone() } + + div { class: "grid grid-cols-1 sm:grid-cols-3 gap-3", StatCard { - label: "Total overhead".to_string(), - value: total_overhead_value, - hint: total_overhead_hint, + label: "Typical overhead".to_string(), + value: format_pct_display(snap.dispatch_overhead_pct), + hint: Some("Non-sampled steps vs shadow · primary number".to_string()), } StatCard { - label: "Hook tax".to_string(), - value: hook_tax_value, - hint: hook_tax_hint, + label: "Shadow step time".to_string(), + value: snap.shadow_median_ms.map(format_step_ms).unwrap_or_else(|| "—".to_string()), + hint: Some(format!( + "Observed baseline · n={} shadow steps", + snap.shadow_n + )), } - StatCard { - label: "Sampled overhead".to_string(), - value: sampled_overhead_value, - hint: sampled_overhead_hint.or_else(|| { - if sampled_n > 0 { - Some(format!("{sampled_n} sampled steps in window")) - } else { - Some("No sampled steps in window yet".to_string()) - } - }), + if let Some(ms) = snap.train_step_median_ms { + StatCard { + label: "train.step compute".to_string(), + value: format_step_ms(ms), + hint: Some("Span timing only · excludes hook dispatch".to_string()), + } + } else { + StatCard { + label: "Probed wall time".to_string(), + value: snap.probed_median_ms.map(format_step_ms).unwrap_or_else(|| "—".to_string()), + hint: Some(format!("All probed steps · n={}", snap.probed_n)), + } } - StatCard { - label: "Probed median".to_string(), - value: probed_median_ms.map(format_step_ms).unwrap_or_else(|| "—".to_string()), - hint: Some(format!("{probed_n} probed steps")), + } + + section { class: "space-y-2", + SectionTitle { + title: "Observed medians".to_string(), + subtitle: "Hook-to-hook wall clock (perf_counter) · includes DataLoader wait between steps — matches Progress Time, not compute-only prints".to_string(), } - StatCard { - label: "Sampled median".to_string(), - value: sampled_median_ms.map(format_step_ms).unwrap_or_else(|| "—".to_string()), - hint: if sampled_n > 0 { - Some(format!("{sampled_n} sampled steps")) - } else { - Some("No sampled steps in window yet".to_string()) - }, + MetricTable { + rows: observed_rows(&snap), } - StatCard { - label: "Shadow median".to_string(), - value: shadow_median_ms.map(format_step_ms).unwrap_or_else(|| "—".to_string()), - hint: Some(format!("{shadow_n} baseline steps")), + } + + section { class: "space-y-2", + SectionTitle { + title: "Overhead summary".to_string(), + subtitle: "Rounded % for readability · details below".to_string(), } - StatCard { - label: "Latest step".to_string(), - value: latest_step.to_string(), - hint: None, + MetricTable { + rows: primary_computed_rows(&snap), } - StatCard { - label: "train.step median".to_string(), - value: train_step_median_ms - .map(format_step_ms) - .unwrap_or_else(|| "—".to_string()), - hint: Some("Cross-check vs span timeline".to_string()), + details { class: "text-sm text-gray-600", + summary { class: "cursor-pointer text-xs text-gray-500 hover:text-gray-700", + "Advanced breakdown (sampled path, blended median)" + } + div { class: "mt-2", + MetricTable { + rows: advanced_computed_rows(&snap), + } + } } } - NcclOverheadFootnote { nccl: nccl.clone() } - if let Err(err) = recent { - AppErrorDisplay { error: err.clone(), title: Some("Recent steps query failed".to_string()) } - } else if !steps.is_empty() { - TorchOverheadTimeline { steps: steps.clone() } + + if !steps.is_empty() { + section { class: "space-y-2", + SectionTitle { + title: "Recent steps".to_string(), + subtitle: format!("Per-step wall time · last {} bars", WINDOW_STEPS.min(24)), + } + TorchOverheadTimeline { steps: steps.clone(), refresh_tick: refresh_tick } + } } + + {nccl_footnote(nccl)} } } } -#[component] -fn NcclOverheadFootnote(nccl: Result) -> Element { - match nccl { - Err(_) => rsx! { - p { class: "text-[10px] text-gray-500 border-t border-gray-100 pt-3", - "NCCL profiler: no in-run shadow step yet — use " - code { class: "font-mono text-gray-500", "examples/run_nccl_profiler_bench.sh" } - " for offline AllReduce overhead comparison." - } +#[derive(Clone, PartialEq)] +struct MetricRow { + name: String, + value: String, + detail: String, +} + +fn observed_rows(snap: &OverheadSnapshot) -> Vec { + vec![ + MetricRow { + name: "Shadow baseline".to_string(), + value: snap + .shadow_median_ms + .map(format_step_ms) + .unwrap_or_else(|| "—".to_string()), + detail: format!("n = {} · hooks bypassed", snap.shadow_n), }, - Ok(df) if dataframe_rows(&df) == 0 => rsx! { - p { class: "text-[10px] text-gray-500 border-t border-gray-100 pt-3", - "NCCL profiler inactive — Torch overhead above is TorchProbe only. Offline NCCL bench: " - code { class: "font-mono text-gray-500", "examples/run_nccl_profiler_bench.sh" } - } + MetricRow { + name: "Probed · dispatch path".to_string(), + value: snap + .dispatch_median_ms + .map(format_step_ms) + .unwrap_or_else(|| "—".to_string()), + detail: format!("n = {} · sampled = 0", snap.dispatch_n), + }, + MetricRow { + name: "Probed · sampled path".to_string(), + value: snap + .sampled_median_ms + .map(format_step_ms) + .unwrap_or_else(|| "—".to_string()), + detail: format!("n = {} · includes trace flush", snap.sampled_n), + }, + MetricRow { + name: "Probed · all".to_string(), + value: snap + .probed_median_ms + .map(format_step_ms) + .unwrap_or_else(|| "—".to_string()), + detail: format!("n = {} · dispatch + sampled mix", snap.probed_n), + }, + ] +} + +fn primary_computed_rows(snap: &OverheadSnapshot) -> Vec { + vec![ + MetricRow { + name: "Typical overhead".to_string(), + value: format_pct_display(snap.dispatch_overhead_pct), + detail: "Most steps (non-sampled) vs shadow baseline".to_string(), + }, + MetricRow { + name: "Effective overhead".to_string(), + value: format_pct_display(snap.amortized_overhead_pct), + detail: amortized_detail(snap), + }, + ] +} + +fn advanced_computed_rows(snap: &OverheadSnapshot) -> Vec { + vec![ + MetricRow { + name: "Sampled path".to_string(), + value: format_pct_display(snap.sampled_overhead_pct), + detail: "Heavy path (trace flush) · tuning sample rate only".to_string(), + }, + MetricRow { + name: "Blended median".to_string(), + value: format_pct_display(snap.blended_overhead_pct), + detail: "All probed steps mixed · informational".to_string(), }, - Ok(df) => { - let coll_events = df_scalar_i64(&df, "coll_events", 0).unwrap_or(0); - let rows_written = df_scalar_i64(&df, "rows_written", 0).unwrap_or(0); - let pool_exhausted = df_scalar_i64(&df, "pool_exhausted", 0).unwrap_or(0); - let write_errors = df_scalar_i64(&df, "write_errors", 0).unwrap_or(0); - rsx! { - p { class: "text-[10px] text-gray-500 border-t border-gray-100 pt-3", - "NCCL profiler active · coll_events {coll_events} · rows_written {rows_written}" - if pool_exhausted > 0 || write_errors > 0 { - span { class: "text-amber-700", - " · pool_exhausted {pool_exhausted} · write_errors {write_errors}" + ] +} + +fn amortized_detail(snap: &OverheadSnapshot) -> String { + let pct = |rate: f64| format!("{:.0}%", rate * 100.0); + match ( + snap.sample_rate.filter(|r| r.is_finite()), + snap.sampled_n > 0, + ) { + (Some(rate), true) => format!("(1 − {}) × dispatch + {} × sampled", pct(rate), pct(rate)), + (_, true) if snap.probed_n > 0 => { + let rate = snap.sampled_n as f64 / snap.probed_n as f64; + format!("(1 − {}) × dispatch + {} × sampled", pct(rate), pct(rate)) + } + _ => "no sampling · same as typical overhead".to_string(), + } +} + +#[component] +fn SectionTitle(title: String, subtitle: String) -> Element { + rsx! { + div { + p { class: "text-sm font-semibold text-gray-900", "{title}" } + p { class: "text-xs text-gray-500 mt-0.5", "{subtitle}" } + } + } +} + +#[component] +fn MetricTable(rows: Vec) -> Element { + rsx! { + div { class: "overflow-x-auto rounded-lg border border-gray-200", + table { class: "min-w-full text-sm", + thead { + tr { class: "bg-gray-50 text-left text-xs uppercase tracking-wide text-gray-500", + th { class: "px-3 py-2 font-medium", "Metric" } + th { class: "px-3 py-2 font-medium text-right", "Value" } + th { class: "px-3 py-2 font-medium", "Notes" } + } + } + tbody { class: "divide-y divide-gray-100", + for (i, row) in rows.iter().enumerate() { + tr { key: "{i}", class: "bg-white", + td { class: "px-3 py-2.5 text-gray-800 font-medium", "{row.name}" } + td { class: "px-3 py-2.5 text-right tabular-nums font-semibold text-gray-900", + "{row.value}" + } + td { class: "px-3 py-2.5 text-gray-500 text-xs", "{row.detail}" } } } - " · NCCL has no in-run shadow baseline; offline bench: " - code { class: "font-mono", "examples/run_nccl_profiler_bench.sh" } } } } } } +fn nccl_footnote(nccl: &Result) -> Element { + match nccl { + Ok(df) if dataframe_rows(df) > 0 => { + let pool_exhausted = + crate::overhead::df_scalar_i64(df, "pool_exhausted", 0).unwrap_or(0); + let write_errors = crate::overhead::df_scalar_i64(df, "write_errors", 0).unwrap_or(0); + if pool_exhausted > 0 || write_errors > 0 { + rsx! { + p { class: "text-xs text-amber-800 bg-amber-50 border border-amber-200 rounded-md px-3 py-2", + "NCCL profiler health: pool_exhausted={pool_exhausted}, write_errors={write_errors}. " + "NCCL has no in-run shadow baseline — offline: " + code { class: "font-mono", "examples/run_nccl_profiler_bench.sh" } + } + } + } else { + rsx! { + p { class: "text-xs text-gray-500", + "NCCL profiler active (counters OK). No in-run NCCL overhead % — offline bench available." + } + } + } + } + _ => rsx! { + p { class: "text-xs text-gray-500", + "NCCL profiler inactive — metrics above are TorchProbe hook overhead only." + } + }, + } +} + #[component] -fn TorchOverheadTimeline(steps: Vec) -> Element { +fn TorchOverheadTimeline(steps: Vec, refresh_tick: u32) -> Element { let max_ms = steps .iter() .map(|s| s.duration_ms) @@ -319,10 +488,12 @@ fn TorchOverheadTimeline(steps: Vec) -> Element { rsx! { div { class: "space-y-2", p { class: "text-[10px] text-gray-500", - "Recent step wall time · violet = probed+sampled · indigo = probed dispatch only · slate = shadow" + "Violet = sampled probed · Indigo = dispatch probed · Slate = shadow" } div { class: "overflow-x-auto pb-1", - div { class: "flex items-end gap-1 min-w-max h-32 px-1", + div { + class: "flex items-end gap-1 min-w-max h-32 px-1", + key: "timeline-{refresh_tick}", for step in steps.iter() { { let pct = (step.duration_ms / max_ms).clamp(0.08, 1.0); @@ -346,15 +517,20 @@ fn TorchOverheadTimeline(steps: Vec) -> Element { step.duration_ms, kind, ); + let height_pct = pct * 100.0; rsx! { div { + key: "{step.local_step}", class: "flex flex-col items-center justify-end gap-1 min-w-[28px] h-full", title: "{title}", div { - class: "w-6 rounded-t-sm {bar_color}", - style: "height: {pct * 100.0}%", + class: "w-5 rounded-t {bar_color} transition-all duration-500 ease-out", + style: "height: {height_pct:.1}%", + } + span { + class: "text-[9px] text-gray-400 tabular-nums leading-none", + "{step.local_step}" } - span { class: "text-[9px] font-mono text-gray-500", "{step.local_step}" } } } } diff --git a/web/src/components/sidebar/monitors.rs b/web/src/components/sidebar/monitors.rs index 3943c7cb..35ac5cb5 100644 --- a/web/src/components/sidebar/monitors.rs +++ b/web/src/components/sidebar/monitors.rs @@ -4,24 +4,41 @@ use dioxus::prelude::*; use crate::api::ApiClient; use crate::components::icon::Icon; -use crate::components::overhead::{ - overhead_trigger_label, table_missing_trigger_label, OVERHEAD_POLL_MS, -}; +use crate::components::overhead::{table_missing_trigger_label, OVERHEAD_POLL_MS}; use crate::components::sidebar::nav_item::SidebarSectionLabel; -use crate::hooks::{use_app_resource, use_page_visible, use_poll_tick_gated}; +use crate::hooks::{use_api_with_options, use_page_visible, use_poll_tick_gated, ApiFetchOptions}; +use crate::overhead::{df_scalar_f64, OverheadSnapshot}; use crate::state::overlays::{monitor_overlay_open, open_monitor_overlay, SidebarMonitor}; use crate::state::ui_tasks::{ui_tasks_snapshot, UiTask, UiTaskStatus, UI_TASK_TICK}; use crate::utils::error::AppError; -fn overhead_trigger_label_from( - result: &Option>, -) -> String { - match result { - None => "Loading…".to_string(), - Some(Err(err)) => { - table_missing_trigger_label(err).unwrap_or_else(|| "Overhead unavailable".to_string()) +fn overhead_sidebar_from( + summary: &Option>, + train_step: &Option>, +) -> crate::overhead::SidebarOverheadCopy { + match summary { + None => crate::overhead::SidebarOverheadCopy { + headline: "Torch overhead".to_string(), + performance: "Loading…".to_string(), + overhead: "—".to_string(), + muted: true, + }, + Some(Err(err)) => crate::overhead::SidebarOverheadCopy { + headline: "Torch overhead".to_string(), + performance: table_missing_trigger_label(err) + .unwrap_or_else(|| "Unavailable".to_string()), + overhead: "—".to_string(), + muted: true, + }, + Some(Ok(df)) => { + let train_ms = train_step + .as_ref() + .and_then(|r| r.as_ref().ok()) + .and_then(|df| df_scalar_f64(df, "train_step_median_ms", 0)); + OverheadSnapshot::from_summary(df) + .with_train_step_median(train_ms) + .sidebar_copy() } - Some(Ok(df)) => overhead_trigger_label(df), } } @@ -51,12 +68,34 @@ pub fn SidebarMonitors() -> Element { let visible = use_page_visible(); let poll = use_poll_tick_gated(OVERHEAD_POLL_MS, Some(visible)); let refresh_tick = poll(); + let refresh_opts = ApiFetchOptions { + keep_previous_while_refreshing: true, + }; - let summary = use_app_resource(move || { - let _ = refresh_tick; - async move { ApiClient::new().fetch_overhead_summary().await } - }); - let overhead_label = overhead_trigger_label_from(&summary.read()); + let summary = use_api_with_options( + move || { + let _ = refresh_tick; + async move { ApiClient::new().fetch_overhead_summary().await } + }, + refresh_opts, + ); + let train_step = use_api_with_options( + move || { + let _ = refresh_tick; + async move { ApiClient::new().fetch_overhead_train_step_median().await } + }, + refresh_opts, + ); + + let overhead = overhead_sidebar_from( + &summary.data.read().clone(), + &train_step.data.read().clone(), + ); + let oh_muted = if overhead.muted { + "text-slate-400" + } else { + "text-emerald-300" + }; rsx! { div { @@ -99,26 +138,36 @@ pub fn SidebarMonitors() -> Element { } button { - class: "w-full flex items-center gap-1.5 px-2 py-1.5 rounded-md border border-slate-700/50 \ + class: "w-full flex flex-col gap-0.5 px-2 py-1.5 rounded-md border border-slate-700/50 \ bg-slate-800/30 hover:bg-slate-800/60 hover:border-emerald-700/40 transition-colors \ text-left min-w-0", - title: "Open TorchProbe overhead monitor", + title: "Open TorchProbe overhead — step time & hook cost", aria_expanded: if overlay_open == Some(SidebarMonitor::Overhead) { "true" } else { "false" }, onclick: move |e| { e.stop_propagation(); open_monitor_overlay(SidebarMonitor::Overhead); }, - Icon { - icon: &icondata::CgPerformance, - class: "w-3 h-3 text-emerald-400/90 shrink-0" + div { class: "flex items-center gap-1.5 min-w-0", + Icon { + icon: &icondata::CgPerformance, + class: "w-3 h-3 text-emerald-400/90 shrink-0" + } + span { + class: "flex-1 min-w-0 text-[10px] text-slate-100 font-semibold truncate tabular-nums", + "{overhead.headline}" + } + Icon { + icon: &icondata::AiExpandAltOutlined, + class: "w-3 h-3 text-slate-500 shrink-0" + } } span { - class: "flex-1 min-w-0 text-[10px] text-slate-200 truncate font-medium", - "{overhead_label}" + class: "text-[9px] text-slate-400 truncate pl-[18px]", + "{overhead.performance}" } - Icon { - icon: &icondata::AiExpandAltOutlined, - class: "w-3 h-3 text-slate-500 shrink-0" + span { + class: "text-[9px] font-medium truncate pl-[18px] tabular-nums {oh_muted}", + "{overhead.overhead}" } } } diff --git a/web/src/overhead/metrics.rs b/web/src/overhead/metrics.rs index 5bcc8b58..cd407825 100644 --- a/web/src/overhead/metrics.rs +++ b/web/src/overhead/metrics.rs @@ -2,7 +2,7 @@ use probing_proto::prelude::DataFrame; -use crate::overhead::sql::WINDOW_STEPS; +use crate::overhead::sql::{MIN_DISPATCH_SAMPLES, MIN_SHADOW_SAMPLES, WINDOW_STEPS}; use crate::utils::error::AppError; #[derive(Clone, Debug, PartialEq)] @@ -13,6 +13,308 @@ pub struct OverheadStep { pub sampled: bool, } +/// Parsed summary row: raw observed medians + derived overhead percentages. +#[derive(Clone, Debug, Default, PartialEq)] +pub struct OverheadSnapshot { + pub latest_step: i64, + pub shadow_baseline: i64, + pub shadow_normal: i64, + pub shadow_median_ms: Option, + pub dispatch_median_ms: Option, + pub sampled_median_ms: Option, + pub probed_median_ms: Option, + pub probed_mean_ms: Option, + pub shadow_mean_ms: Option, + pub shadow_n: i64, + pub dispatch_n: i64, + pub sampled_n: i64, + pub probed_n: i64, + pub dispatch_overhead_pct: Option, + pub sampled_overhead_pct: Option, + pub blended_overhead_pct: Option, + pub amortized_overhead_pct: Option, + pub sample_rate: Option, + pub sample_mode: Option, + /// `train.step` span median (compute-only); not from timing table. + pub train_step_median_ms: Option, +} + +/// Qualitative band for profiler overhead (dispatch path). +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum OverheadLevel { + Low, + Moderate, + High, + Unknown, +} + +impl OverheadLevel { + pub fn from_pct(pct: Option) -> Self { + match pct { + None => Self::Unknown, + Some(p) if p < 5.0 => Self::Low, + Some(p) if p < 15.0 => Self::Moderate, + Some(_) => Self::High, + } + } + + pub fn label(self) -> &'static str { + match self { + Self::Low => "Within normal range", + Self::Moderate => "Moderately elevated", + Self::High => "High — tune sample rate or shadow cadence", + Self::Unknown => "Estimating…", + } + } + + pub fn is_reassuring(self) -> bool { + matches!(self, Self::Low) + } +} + +/// Compact copy for the left sidebar monitor row. +#[derive(Clone, Debug, PartialEq)] +pub struct SidebarOverheadCopy { + pub headline: String, + pub performance: String, + pub overhead: String, + pub muted: bool, +} + +impl OverheadSnapshot { + pub fn from_summary(df: &DataFrame) -> Self { + let shadow_baseline = df.scalar_i64("shadow_baseline", 0).unwrap_or(0); + let shadow_n = df.scalar_i64("shadow_n", 0).unwrap_or(0); + let dispatch_n = df.scalar_i64("dispatch_n", 0).unwrap_or(0); + let shadow_median_ms = df.scalar_f64("shadow_median_ms", 0); + let dispatch_median_ms = df.scalar_f64("dispatch_median_ms", 0); + let sampled_median_ms = df.scalar_f64("sampled_median_ms", 0); + let probed_median_ms = df.scalar_f64("probed_median_ms", 0); + let probed_mean_ms = df.scalar_f64("probed_mean_ms", 0); + let shadow_mean_ms = df.scalar_f64("shadow_mean_ms", 0); + let sampled_n = df.scalar_i64("sampled_n", 0).unwrap_or(0); + + let stable = is_stable_sample(shadow_n, dispatch_n, shadow_baseline); + let dispatch_overhead_pct = stable + .then(|| overhead_pct_raw(dispatch_median_ms?, shadow_median_ms?)) + .flatten(); + let blended_overhead_pct = stable + .then(|| overhead_pct_raw(probed_median_ms?, shadow_median_ms?)) + .flatten(); + let sampled_overhead_pct = (sampled_n > 0) + .then(|| overhead_pct_raw(sampled_median_ms?, shadow_median_ms?)) + .flatten(); + let amortized_overhead_pct = amortized_overhead_pct( + dispatch_overhead_pct, + sampled_overhead_pct, + blended_overhead_pct, + df.scalar_f64("sample_rate", 0), + sampled_n, + df.scalar_i64("probed_n", 0).unwrap_or(0), + ); + + let sample_mode = df + .names + .iter() + .position(|n| n == "sample_mode") + .and_then(|ci| { + df.cols.get(ci).filter(|col| !col.is_empty()).map(|col| { + use probing_proto::prelude::Ele; + match &col.get(0) { + Ele::Text(s) => s.clone(), + other => format!("{other:?}"), + } + }) + }); + + Self { + latest_step: df.scalar_i64("latest_step", 0).unwrap_or(-1), + shadow_baseline, + shadow_normal: df.scalar_i64("shadow_normal", 0).unwrap_or(4), + shadow_median_ms, + dispatch_median_ms, + sampled_median_ms, + probed_median_ms, + probed_mean_ms, + shadow_mean_ms, + shadow_n, + dispatch_n, + sampled_n, + probed_n: df.scalar_i64("probed_n", 0).unwrap_or(0), + dispatch_overhead_pct, + sampled_overhead_pct, + blended_overhead_pct, + amortized_overhead_pct, + sample_rate: df.scalar_f64("sample_rate", 0), + sample_mode, + train_step_median_ms: None, + } + } + + pub fn with_train_step_median(mut self, ms: Option) -> Self { + self.train_step_median_ms = ms; + self + } + + pub fn is_stable(&self) -> bool { + is_stable_sample(self.shadow_n, self.dispatch_n, self.shadow_baseline) + } + + pub fn shadow_enabled(&self) -> bool { + self.shadow_baseline > 0 + } + + pub fn cadence_label(&self) -> String { + format!("{}:{}", self.shadow_normal, self.shadow_baseline) + } + + pub fn window_label(&self) -> String { + format!("last {WINDOW_STEPS} steps") + } + + pub fn sampling_label(&self) -> String { + match (&self.sample_mode, self.sample_rate) { + (Some(mode), Some(rate)) => format!("{mode} @ {:.0}%", rate * 100.0), + (Some(mode), None) => mode.clone(), + (_, Some(rate)) => format!("{:.0}% step rate", rate * 100.0), + _ => "—".to_string(), + } + } + + pub fn dispatch_level(&self) -> OverheadLevel { + OverheadLevel::from_pct(self.dispatch_overhead_pct) + } + + pub fn sidebar_copy(&self) -> SidebarOverheadCopy { + if !self.shadow_enabled() { + return SidebarOverheadCopy { + headline: "Torch overhead".to_string(), + performance: if self.latest_step > 0 { + format!("Step {}", self.latest_step) + } else { + "Profiler on".to_string() + }, + overhead: "Shadow off".to_string(), + muted: true, + }; + } + + if self.shadow_n == 0 || self.probed_n == 0 { + return SidebarOverheadCopy { + headline: format!("Step {}", self.latest_step.max(0)), + performance: "Waiting for steps…".to_string(), + overhead: "Collecting baseline".to_string(), + muted: true, + }; + } + + if !self.is_stable() { + return SidebarOverheadCopy { + headline: format!("Step {}", self.latest_step), + performance: self + .shadow_median_ms + .map(|ms| format!("{} baseline", format_step_ms(ms))) + .unwrap_or_else(|| "Measuring…".to_string()), + overhead: format!( + "Warming up ({}/{} shadow)", + self.shadow_n, MIN_SHADOW_SAMPLES + ), + muted: true, + }; + } + + let wall = self + .shadow_median_ms + .map(format_step_ms) + .unwrap_or_else(|| "—".to_string()); + let compute = self + .train_step_median_ms + .map(|ms| format!(" · compute {}", format_step_ms(ms))) + .unwrap_or_default(); + let oh = self + .dispatch_overhead_pct + .map(format_pct_signed) + .unwrap_or_else(|| "—".to_string()); + let level = self.dispatch_level(); + let overhead_line = if level.is_reassuring() { + format!("{oh} extra · normal") + } else { + format!("{oh} extra · {}", level.label()) + }; + + SidebarOverheadCopy { + headline: format!("Step {} · {} / step", self.latest_step, wall), + performance: format!("Shadow baseline{compute}"), + overhead: overhead_line, + muted: false, + } + } +} + +fn is_stable_sample(shadow_n: i64, dispatch_n: i64, shadow_baseline: i64) -> bool { + shadow_baseline > 0 && shadow_n >= MIN_SHADOW_SAMPLES && dispatch_n >= MIN_DISPATCH_SAMPLES +} + +fn overhead_pct_raw(probed_ms: f64, shadow_ms: f64) -> Option { + if shadow_ms <= 0.0 { + None + } else { + Some((probed_ms / shadow_ms - 1.0) * 100.0) + } +} + +/// Expected per-step overhead when sampling is enabled: blend dispatch vs sampled path. +/// +/// Uses configured `sample_rate` when present; otherwise empirical `sampled_n / probed_n`. +/// Avoids `mean(probed)/mean(shadow)` which diverges under step-time jitter and tiny shadow_n. +fn amortized_overhead_pct( + dispatch_pct: Option, + sampled_pct: Option, + blended_pct: Option, + sample_rate: Option, + sampled_n: i64, + probed_n: i64, +) -> Option { + let dispatch = dispatch_pct.or(blended_pct)?; + let rate = effective_sample_rate(sample_rate, sampled_n, probed_n); + if sampled_n == 0 || rate <= 0.0 { + return Some(dispatch); + } + let sampled = sampled_pct.unwrap_or(dispatch); + Some((1.0 - rate) * dispatch + rate * sampled) +} + +fn effective_sample_rate(sample_rate: Option, sampled_n: i64, probed_n: i64) -> f64 { + sample_rate + .filter(|r| r.is_finite() && (*r) >= 0.0 && (*r) <= 1.0) + .or_else(|| { + if probed_n > 0 && sampled_n > 0 { + Some(sampled_n as f64 / probed_n as f64) + } else { + None + } + }) + .unwrap_or(0.0) + .clamp(0.0, 1.0) +} + +pub fn format_pct_signed(pct: f64) -> String { + if pct.abs() < 0.5 { + "≈0%".to_string() + } else if pct.abs() < 5.0 { + format!("~{:.0}%", pct) + } else if pct > 0.0 { + format!("+{pct:.1}%") + } else { + format!("{pct:.1}%") + } +} + +pub fn format_pct_display(pct: Option) -> String { + pct.map(format_pct_signed) + .unwrap_or_else(|| "—".to_string()) +} + pub fn table_missing_message(err: &AppError) -> Option<&'static str> { let msg = err.display_message().to_ascii_lowercase(); if msg.contains("torch_step_timing") @@ -30,28 +332,6 @@ pub fn table_missing_trigger_label(err: &AppError) -> Option { table_missing_message(err).map(|_| "Profiler off".to_string()) } -pub fn overhead_trigger_label(summary: &DataFrame) -> String { - let shadow_baseline = summary.scalar_i64("shadow_baseline", 0).unwrap_or(0); - if shadow_baseline == 0 { - return "Shadow off".to_string(); - } - let probed_n = summary.scalar_i64("probed_n", 0).unwrap_or(0); - let shadow_n = summary.scalar_i64("shadow_n", 0).unwrap_or(0); - if probed_n == 0 || shadow_n == 0 { - return "Collecting baseline…".to_string(); - } - let probed_median_ms = summary.scalar_f64("probed_median_ms", 0); - let shadow_median_ms = summary.scalar_f64("shadow_median_ms", 0); - match (probed_median_ms, shadow_median_ms) { - (Some(p), Some(s)) => { - let (hook_tax, _) = format_overhead_pct(p, s, "Hook tax"); - let latest = summary.scalar_i64("latest_step", 0).unwrap_or(-1); - format!("{hook_tax} · step {latest}") - } - _ => "Collecting baseline…".to_string(), - } -} - pub fn parse_overhead_steps(df: &DataFrame) -> Vec { let mut steps = Vec::new(); let rows = df.row_count(); @@ -84,28 +364,6 @@ pub fn format_step_ms(ms: f64) -> String { } } -pub fn format_overhead_pct( - probed_ms: f64, - shadow_ms: f64, - context: &str, -) -> (String, Option) { - if shadow_ms <= 0.0 { - return ( - "—".to_string(), - Some("Need shadow baseline steps".to_string()), - ); - } - let pct = (probed_ms / shadow_ms - 1.0) * 100.0; - let hint = Some(format!("{context} · last {WINDOW_STEPS} steps")); - if pct.abs() < 0.5 { - ("≈0%".to_string(), hint) - } else if pct > 0.0 { - (format!("+{pct:.1}%"), hint) - } else { - (format!("{pct:.1}%"), hint) - } -} - #[inline] pub fn dataframe_rows(df: &DataFrame) -> usize { df.row_count() @@ -124,16 +382,143 @@ pub fn df_scalar_i64(df: &DataFrame, col: &str, row: usize) -> Option { #[cfg(test)] mod tests { use super::*; + use probing_proto::prelude::{DataFrame, Seq}; + + fn sample_df() -> DataFrame { + DataFrame { + names: vec![ + "shadow_baseline".into(), + "shadow_normal".into(), + "latest_step".into(), + "shadow_median_ms".into(), + "dispatch_median_ms".into(), + "probed_median_ms".into(), + "shadow_n".into(), + "dispatch_n".into(), + "probed_n".into(), + "sampled_n".into(), + ], + cols: vec![ + Seq::SeqI64(vec![1]), + Seq::SeqI64(vec![4]), + Seq::SeqI64(vec![120]), + Seq::SeqF64(vec![800.0]), + Seq::SeqF64(vec![816.0]), + Seq::SeqF64(vec![820.0]), + Seq::SeqI64(vec![16]), + Seq::SeqI64(vec![64]), + Seq::SeqI64(vec![80]), + Seq::SeqI64(vec![4]), + ], + size: 1, + } + } + + #[test] + fn snapshot_computes_dispatch_overhead() { + let snap = OverheadSnapshot::from_summary(&sample_df()); + assert!(snap.is_stable()); + let pct = snap.dispatch_overhead_pct.unwrap(); + assert!((pct - 2.0).abs() < 0.2); + } + + #[test] + fn sidebar_copy_when_stable() { + let copy = OverheadSnapshot::from_summary(&sample_df()) + .with_train_step_median(Some(780.0)) + .sidebar_copy(); + assert!(!copy.muted); + assert!(copy.headline.contains("Step 120")); + assert!(copy.headline.contains("800 ms")); + assert!(copy.overhead.contains("normal")); + } #[test] fn overhead_pct_positive() { - let (value, _) = format_overhead_pct(133.0, 100.0, "test"); + let value = format_pct_signed((133.0 / 100.0 - 1.0) * 100.0); assert_eq!(value, "+33.0%"); } #[test] fn overhead_pct_near_zero() { - let (value, _) = format_overhead_pct(100.2, 100.0, "test"); + let value = format_pct_signed((100.2 / 100.0 - 1.0) * 100.0); assert_eq!(value, "≈0%"); } + + #[test] + fn amortized_blends_dispatch_and_sampled_by_rate() { + let pct = + amortized_overhead_pct(Some(1.9), Some(-4.9), Some(1.5), Some(0.05), 4, 50).unwrap(); + // 0.95 * 1.9 + 0.05 * (-4.9) ≈ 1.56 + assert!((pct - 1.56).abs() < 0.1); + } + + #[test] + fn amortized_without_sampling_matches_dispatch() { + let pct = amortized_overhead_pct(Some(2.0), None, Some(2.0), Some(0.0), 0, 50).unwrap(); + assert!((pct - 2.0).abs() < 0.01); + } + + /// Regression: medians ~2% but means imply 300%+ — amortized must stay weighted, not mean ratio. + #[test] + fn amortized_not_mean_ratio_when_means_diverge() { + let df = user_mean_divergence_df(); + let snap = OverheadSnapshot::from_summary(&df); + let dispatch = snap.dispatch_overhead_pct.expect("stable dispatch"); + let amortized = snap.amortized_overhead_pct.expect("amortized"); + assert!(dispatch < 5.0, "dispatch should be low: {dispatch}"); + assert!( + (amortized - dispatch).abs() < 3.0, + "amortized {amortized} should track dispatch {dispatch}, not mean ratio" + ); + let mean_ratio = (533.0 / 130.0 - 1.0) * 100.0; + assert!( + (amortized - mean_ratio).abs() > 50.0, + "amortized must not use mean(probed)/mean(shadow): got {amortized}, mean ratio {mean_ratio}" + ); + } + + #[test] + fn format_pct_signed_soft_display_under_five_percent() { + assert_eq!(format_pct_signed(1.9), "~2%"); + assert_eq!(format_pct_signed(-4.9), "~-5%"); + } + + fn user_mean_divergence_df() -> DataFrame { + DataFrame { + names: vec![ + "shadow_baseline".into(), + "shadow_normal".into(), + "latest_step".into(), + "shadow_median_ms".into(), + "dispatch_median_ms".into(), + "sampled_median_ms".into(), + "probed_median_ms".into(), + "shadow_mean_ms".into(), + "probed_mean_ms".into(), + "shadow_n".into(), + "dispatch_n".into(), + "sampled_n".into(), + "probed_n".into(), + "sample_rate".into(), + ], + cols: vec![ + Seq::SeqI64(vec![1]), + Seq::SeqI64(vec![4]), + Seq::SeqI64(vec![500]), + Seq::SeqF64(vec![180.0]), + Seq::SeqF64(vec![184.0]), + Seq::SeqF64(vec![172.0]), + Seq::SeqF64(vec![183.0]), + Seq::SeqF64(vec![130.0]), + Seq::SeqF64(vec![533.0]), + Seq::SeqI64(vec![16]), + Seq::SeqI64(vec![61]), + Seq::SeqI64(vec![4]), + Seq::SeqI64(vec![65]), + Seq::SeqF64(vec![0.05]), + ], + size: 1, + } + } } diff --git a/web/src/overhead/mod.rs b/web/src/overhead/mod.rs index 81c683b6..cca37558 100644 --- a/web/src/overhead/mod.rs +++ b/web/src/overhead/mod.rs @@ -4,7 +4,7 @@ pub mod metrics; pub mod sql; pub use metrics::{ - dataframe_rows, df_scalar_f64, df_scalar_i64, format_overhead_pct, format_step_ms, - overhead_trigger_label, parse_overhead_steps, table_missing_message, - table_missing_trigger_label, OverheadStep, + dataframe_rows, df_scalar_f64, df_scalar_i64, format_pct_display, format_pct_signed, + format_step_ms, parse_overhead_steps, table_missing_message, table_missing_trigger_label, + OverheadLevel, OverheadSnapshot, OverheadStep, SidebarOverheadCopy, }; diff --git a/web/src/overhead/sql.rs b/web/src/overhead/sql.rs index 0a0670bd..6ab624fc 100644 --- a/web/src/overhead/sql.rs +++ b/web/src/overhead/sql.rs @@ -3,6 +3,12 @@ /// Rolling window size for overhead aggregates (larger → stabler medians). pub const WINDOW_STEPS: i64 = 80; +/// Minimum shadow rows before treating overhead % as reliable (see docs/design/overhead.md). +pub const MIN_SHADOW_SAMPLES: i64 = 5; + +/// Minimum non-sampled probed rows for stable dispatch overhead. +pub const MIN_DISPATCH_SAMPLES: i64 = 16; + /// Recent step bars in the timeline panel. pub const RECENT_STEPS: i64 = 24; @@ -24,6 +30,8 @@ pub fn summary() -> String { let win = window_start(TIMING_TABLE, WINDOW_STEPS); format!( "SELECT \ + round((SELECT median({STEP_SEC}) FROM {TIMING_TABLE} \ + WHERE {IS_SHADOW} = 0 AND {IS_SAMPLED} = 0 AND local_step >= {win}) * 1000, 1) AS dispatch_median_ms, \ round((SELECT median({STEP_SEC}) FROM {TIMING_TABLE} \ WHERE {IS_SHADOW} = 0 AND local_step >= {win}) * 1000, 1) AS probed_median_ms, \ round((SELECT median({STEP_SEC}) FROM {TIMING_TABLE} \ @@ -34,6 +42,8 @@ pub fn summary() -> String { WHERE {IS_SHADOW} = 0 AND local_step >= {win}) * 1000, 1) AS probed_mean_ms, \ round((SELECT avg({STEP_SEC}) FROM {TIMING_TABLE} \ WHERE {IS_SHADOW} = 1 AND local_step >= {win}) * 1000, 1) AS shadow_mean_ms, \ + (SELECT count(*) FROM {TIMING_TABLE} \ + WHERE {IS_SHADOW} = 0 AND {IS_SAMPLED} = 0 AND local_step >= {win}) AS dispatch_n, \ (SELECT count(*) FROM {TIMING_TABLE} \ WHERE {IS_SHADOW} = 0 AND local_step >= {win}) AS probed_n, \ (SELECT count(*) FROM {TIMING_TABLE} \ From 7f6271c18216a6196a1c7e2bb7ef023ad6b13aea Mon Sep 17 00:00:00 2001 From: Reiase Date: Sun, 12 Jul 2026 18:49:35 +0800 Subject: [PATCH 16/37] =?UTF-8?q?Enhance=20documentation=20and=20add=20new?= =?UTF-8?q?=20examples=20for=20Megatron-Core=20and=20vLLM=E2=80=A6=20(#66)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Enhance documentation and add new examples for Megatron-Core and vLLM integration - Updated `env-vars.md` to include new environment variables for `PROBING_TABLE_DEFAULT_MB` and vLLM autostart configurations. - Introduced `megatron_mcore_train_loop.py` for a real Megatron-Core training loop with probing support. - Added `run_megatron_soak.sh` and `run_vllm_soak.sh` scripts for soak testing with Megatron-Core and vLLM, respectively. - Enhanced `README.md` to document new soak testing features and usage instructions. - Updated `vllm_offline_soak.py` to support offline inference with probing and improved observability hints. These changes aim to improve the usability and clarity of the Probing project, particularly for users integrating with Megatron-Core and vLLM. * Refactor import hook registration and enhance testing setup - Introduced a `_default_register` function to encapsulate the module registration logic, improving code organization and readability. - Added a `reset_register` function to restore the import hook state, facilitating cleaner test setups and ensuring isolation between tests. - Updated test fixtures to utilize the new `reset_register` function, enhancing the reliability of tests by resetting the import hook state before and after each test. These changes aim to improve the maintainability of the import hook system and ensure consistent test behavior. --- docs/src/reference/env-vars.md | 18 + examples/README.md | 54 +++ examples/megatron_mcore_train_loop.py | 288 ++++++++++++++++ examples/run_megatron_soak.sh | 113 +++++++ examples/run_vllm_soak.sh | 154 +++++++++ examples/vllm_offline_soak.py | 242 ++++++++++++++ probing/core/src/core/federation/mod.rs | 6 +- probing/core/src/core/federation/route.rs | 154 ++++++++- .../python/src/extensions/python/exttbls.rs | 37 ++- .../nccl_culprit_victim/SKILL.md | 7 +- .../nccl_culprit_victim/steps.yaml | 308 +++++++++++++++--- python/probing/bundled_web/public/index.html | 19 ++ python/probing/core/table.py | 66 +++- python/probing/ext/__init__.py | 2 + python/probing/ext/megatron.py | 30 ++ python/probing/ext/torch.py | 11 + python/probing/ext/vllm.py | 269 +++++++++++++++ python/probing/hooks/import_hook.py | 56 +++- python/probing/profiling/torch_probe.py | 130 +++++++- tests/regression/core/test_table_docs.py | 98 ++++++ tests/regression/ext/README.md | 44 +++ tests/regression/ext/_megatron_contract.py | 85 +++++ tests/regression/ext/_vllm_contract.py | 74 +++++ tests/regression/ext/conftest.py | 84 +++++ .../ext/megatron_integration_worker.py | 69 ++++ .../regression/ext/test_megatron_contract.py | 167 ++++++++++ .../ext/test_megatron_integration.py | 76 +++++ tests/regression/ext/test_vllm_contract.py | 143 ++++++++ tests/regression/ext/test_vllm_integration.py | 104 ++++++ .../regression/ext/vllm_integration_worker.py | 79 +++++ .../profiling/test_torch_probe_sampling.py | 50 +++ tests/unit/probing/ext/test_megatron.py | 156 --------- tests/unit/probing/hooks/test_import_hook.py | 2 + 33 files changed, 2952 insertions(+), 243 deletions(-) create mode 100644 examples/megatron_mcore_train_loop.py create mode 100755 examples/run_megatron_soak.sh create mode 100755 examples/run_vllm_soak.sh create mode 100644 examples/vllm_offline_soak.py create mode 100644 python/probing/bundled_web/public/index.html create mode 100644 python/probing/ext/vllm.py create mode 100644 tests/regression/ext/README.md create mode 100644 tests/regression/ext/_megatron_contract.py create mode 100644 tests/regression/ext/_vllm_contract.py create mode 100644 tests/regression/ext/conftest.py create mode 100644 tests/regression/ext/megatron_integration_worker.py create mode 100644 tests/regression/ext/test_megatron_contract.py create mode 100644 tests/regression/ext/test_megatron_integration.py create mode 100644 tests/regression/ext/test_vllm_contract.py create mode 100644 tests/regression/ext/test_vllm_integration.py create mode 100644 tests/regression/ext/vllm_integration_worker.py delete mode 100644 tests/unit/probing/ext/test_megatron.py diff --git a/docs/src/reference/env-vars.md b/docs/src/reference/env-vars.md index a6e310aa..cf77bfdd 100644 --- a/docs/src/reference/env-vars.md +++ b/docs/src/reference/env-vars.md @@ -19,6 +19,7 @@ Prefix syntax: `init:SCRIPT+` runs `exec(open(SCRIPT).read())` after activ | Variable | Default | Description | |----------|---------|-------------| | `PROBING_DATA_DIR` | Platform-specific | Root directory for mmap ring buffer files (MEMT tables). Each process creates a subdirectory named by its PID. | +| `PROBING_TABLE_DEFAULT_MB` | `20` | Default mmap ring byte budget per Python `@table` (and `ExternalTable` when `discard_threshold` is omitted). Override per table with `@table(capacity_bytes=…)`. Tables are created on first write, not at import. | | `PROBING_COLD` | unset | Set to `on` to enable hot-to-cold compaction of mmap tables. | | `PROBING_COLD_TARGET_MB` | — | Target size per cold chunk after compaction. | | `PROBING_COLD_MAX_TOTAL_MB` | — | Maximum total size of all cold storage files. | @@ -145,6 +146,23 @@ Import hooks run when `megatron.core.parallel_state` and `megatron.training.trai load: parallel ranks flow into `probing.set_role`, and `train_step` aligns step coordinates for SQL JOINs. +### vLLM autostart + +vLLM integration is **best-effort** and enabled by default when vLLM env vars +or modules are detected (including the macOS **vllm-metal** platform plugin). +No inference-script changes are required beyond `PROBING=2`. + +| Variable | Default | Description | +|----------|---------|-------------| +| `PROBING_VLLM` | `auto` | `auto` = on when vLLM env/modules detected; `on`/`off` to force. | +| `PROBING_VLLM_STEP_SYNC` | `auto` | Sync `probing.step` with vLLM scheduler steps via wrapped `LLMEngine.step`. | +| `probing.vllm.enable` | — | Config override for vLLM autostart (`probing.config.set`). | +| `probing.vllm.step_sync` | — | Config override for engine step sync. | + +Import hooks run when `vllm_metal` (macOS Metal plugin), `vllm.v1.engine.llm_engine`, +or `vllm.engine.llm_engine` load: distributed ranks and `backend=metal` flow into +`probing.set_role`, and `LLMEngine.step` aligns step coordinates for SQL JOINs. + | Variable | Default | Description | |----------|---------|-------------| | `PROBING_FR_ON_WATCHDOG` | `auto` | On NCCL watchdog exceptions, snapshot Flight Recorder into probing tables. | diff --git a/examples/README.md b/examples/README.md index 4239bd56..fdea0e5a 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,11 +2,15 @@ Runnable scripts under `examples/`. They are **not** installed with `pip install probing` or `make develop`. +Framework integration **contract tests** live under `tests/regression/ext/` (e.g. `test_megatron_contract.py`, `test_vllm_contract.py`) — run via `make test-python-regression`. Real-framework smoke tests: `test_megatron_integration.py`, `test_vllm_integration.py` (`pytest -m integration`). + ## Dependencies | Script | Extra packages | Notes | |--------|----------------|-------| | **`tracing.py`** | `torch` | **Tracing 入门**(hook 驱动 phase,~80 行) | +| **`megatron_mcore_train_loop.py`** | `megatron-core`, `torch` (CUDA) | **真实 Megatron-Core 训练循环** + Web UI(`run_megatron_soak.sh`) | +| **`vllm_offline_soak.py`** | `vllm` / `vllm-metal` | **真实 vLLM 离线推理** + Web UI(`run_vllm_soak.sh`) | | `hooks.py`, `test_probing.py` | none (beyond probing) | Good smoke tests | | `imagenet.py`, `imagenet_with_span.py` | `torch`, `torchvision` | Needs ImageNet data path | | `ray_tracing_example.py` | `ray` | Optional Ray integration | @@ -14,6 +18,8 @@ Runnable scripts under `examples/`. They are **not** installed with `pip install | **`torch_probe_overhead_smoke.py`** | none | TorchProbe shadow-step overhead smoke (no GPU) | | **`bench_instrumentation.py`** | `torch` (optional) | One-shot report: span / phase hooks / TorchProbe overhead (`make bench`) | | **`run_soak.sh`** | `torch`, `torchvision` | Long-running soak (synthetic ImageNet + probing); used by CI `soak.yml` | +| **`run_megatron_soak.sh`** | `megatron-core`, CUDA | Megatron-Core torchrun soak(默认 2 GPU / TP=2,`PROBING_PORT=18080`) | +| **`run_vllm_soak.sh`** | `vllm` / `vllm-metal` | vLLM 真实推理 soak(默认 10min,`PROBING_PORT=18081`) | | **`soak_assert.py`** | none (beyond probing) | Post-soak SQL / overhead assertions | | **`nccl_profiler_overhead.py`** | `torch` (CUDA) | NCCL AllReduce overhead vs probing profiler — see below | @@ -34,6 +40,8 @@ source .venv/bin/activate PROBING=1 python examples/tracing.py # tracing 入门(推荐) PROBING=1 python examples/test_probing.py --depth 2 PROBING=1 python examples/bench_instrumentation.py --quick +./examples/run_megatron_soak.sh # Megatron 长跑 + Web UI +./examples/run_vllm_soak.sh # vLLM 长跑 + Web UI make bench # full report, one table per group as each finishes make bench-quick # faster smoke make soak-quick # ~60s CPU soak smoke (needs torch + torchvision) @@ -54,6 +62,52 @@ NPROC=2 DIST_BACKEND=gloo DURATION_SEC=120 ./examples/run_soak.sh On Linux you can also attach with `probing -t inject` instead of `PROBING=1` at startup. +### Megatron autostart + +Regression (mocked modules, CI): `tests/regression/ext/test_megatron_contract.py` — `make test-python-regression`. + +**Real Megatron-Core** training loop + Web UI (**Linux + NVIDIA CUDA only**; requires `megatron-core`, `triton`, `torchrun`): + +```bash +# Linux GPU machine only (not macOS) +uv pip install megatron-core torch triton # CUDA wheels +./examples/run_megatron_soak.sh +DURATION_SEC=60 ./examples/run_megatron_soak.sh +NPROC=1 TP_SIZE=1 ./examples/run_megatron_soak.sh # single GPU +# browser: http://127.0.0.1:18080/ +``` + +Based on NVIDIA [run_simple_mcore_train_loop.py](https://github.com/NVIDIA/Megatron-LM/blob/main/examples/run_simple_mcore_train_loop.py). Probing hooks `megatron.core.parallel_state` for role sync and aligns `probing.step` each optimizer iteration. + +Full Megatron-LM `pretrain_gpt.py` jobs: set `PROBING=2 PROBING_MEGATRON=on` at launch (uses `megatron.training.training.train_step` hooks). + +### vLLM / vLLM-Metal autostart + +Regression (mocked modules, CI): `tests/regression/ext/test_vllm_contract.py` — `make test-python-regression`. + +**Real vLLM** offline inference + Web UI: + +```bash +# Linux/CUDA +uv pip install vllm +./examples/run_vllm_soak.sh + +# macOS Apple Silicon (vllm-metal) +# https://github.com/vllm-project/vllm-metal +# +# Align vllm / vllm-metal / mlx-lm versions per vllm-metal docs. The soak defaults to +# VLLM_PROMPTS_PER_BATCH=1 on macOS because multi-prompt batched decode needs +# mlx_lm.BatchKVCache.merge (not in all mlx-lm releases). +uv pip install torchvision torchaudio 'transformers>=4.46,<5' +./examples/run_vllm_soak.sh +# multi-prompt batching (when mlx-lm supports BatchKVCache.merge): +# VLLM_PROMPTS_PER_BATCH=4 ./examples/run_vllm_soak.sh +DURATION_SEC=60 ./examples/run_vllm_soak.sh +# browser: http://127.0.0.1:18081/ +``` + +`vllm serve` API server: `PROBING=2 PROBING_PORT=18081 vllm serve ` (engine hooks apply on load). + ### NCCL profiler overhead (Linux + CUDA) Micro-benchmark (synthetic NCCL callbacks, no GPU): diff --git a/examples/megatron_mcore_train_loop.py b/examples/megatron_mcore_train_loop.py new file mode 100644 index 00000000..81b8da91 --- /dev/null +++ b/examples/megatron_mcore_train_loop.py @@ -0,0 +1,288 @@ +#!/usr/bin/env python3 +# Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# Adapted for probing: Megatron-Core distributed training loop + Web UI / spans. +# +# Based on NVIDIA/Megatron-LM ``examples/run_simple_mcore_train_loop.py``. +# Requires: megatron-core, torch, CUDA, torchrun (see ``run_megatron_soak.sh``). +# +# Contract tests (mocked modules): tests/regression/ext/test_megatron_contract.py + +from __future__ import annotations + +import argparse +import os +import sys +import time +from functools import partial +from pathlib import Path +from typing import Any, Callable, Dict, Iterator, Tuple + +import probing +import torch +from torch.optim import Adam +from torch.utils.data import DataLoader + +from probing.ext.megatron import ( + maybe_autostart, + sync_role_from_parallel_state, + sync_step_from_iteration, +) + +try: + from megatron.core import dist_checkpointing, parallel_state + from megatron.core.datasets.blended_megatron_dataset_builder import ( + BlendedMegatronDatasetBuilder, + ) + from megatron.core.datasets.gpt_dataset import GPTDatasetConfig, MockGPTDataset + from megatron.core.datasets.utils import compile_helpers + from megatron.core.distributed import DistributedDataParallel, DistributedDataParallelConfig + from megatron.core.distributed.finalize_model_grads import finalize_model_grads + from megatron.core.models.gpt.gpt_model import GPTModel + from megatron.core.models.gpt.gpt_layer_specs import get_gpt_layer_local_spec + from megatron.core.pipeline_parallel.schedules import get_forward_backward_func + from megatron.core.tensor_parallel.random import model_parallel_cuda_manual_seed + from megatron.core.tokenizers import MegatronTokenizer + from megatron.core.transformer.transformer_config import TransformerConfig +except ImportError as exc: # pragma: no cover - optional heavy dep + raise SystemExit( + "megatron-core is required for this example.\n" + " uv pip install megatron-core\n" + " docs: https://docs.nvidia.com/megatron-core/developer-guide/latest/get-started/quickstart.html" + ) from exc + +_SEQUENCE_LENGTH = 64 + + +def _wait_for_server_address(*, timeout_sec: float = 5.0) -> str | None: + deadline = time.monotonic() + timeout_sec + while time.monotonic() < deadline: + addr = probing.config.get_str("server.address") + if addr and str(addr).strip(): + return str(addr).strip().strip("'\"") + time.sleep(0.1) + return None + + +def _print_observability_hints() -> None: + pid = os.getpid() + rank = int(os.environ.get("RANK", "0")) + addr = _wait_for_server_address() + print(f"[rank {rank}] pid={pid} probing={'on' if probing.is_enabled() else 'off'}") + if addr: + print(f"[rank {rank}] Web UI: http://{addr}/") + if rank == 0: + print(f"[rank {rank}] Investigate: http://{addr}/investigate") + elif rank == 0: + print(f"[rank {rank}] CLI: probing -t {pid} query \"SELECT * FROM python.trace_event LIMIT 8\"") + print("[rank 0] Tip: set PROBING_PORT=18080 for browser Web UI (see run_megatron_soak.sh)") + print(flush=True) + + +def initialize_distributed( + tensor_model_parallel_size: int, + pipeline_model_parallel_size: int, +) -> None: + parallel_state.destroy_model_parallel() + + rank = int(os.environ["RANK"]) + world_size = int(os.environ["WORLD_SIZE"]) + local_rank = int(os.environ["LOCAL_RANK"]) + + torch.cuda.set_device(local_rank) + torch.distributed.init_process_group( + backend="nccl", rank=rank, world_size=world_size + ) + parallel_state.initialize_model_parallel( + tensor_model_parallel_size, pipeline_model_parallel_size + ) + + +def model_provider() -> GPTModel: + transformer_config = TransformerConfig( + num_layers=2, + hidden_size=12, + num_attention_heads=4, + use_cpu_initialization=True, + pipeline_dtype=torch.float32, + ) + return GPTModel( + config=transformer_config, + transformer_layer_spec=get_gpt_layer_local_spec(), + vocab_size=100, + max_sequence_length=_SEQUENCE_LENGTH, + ) + + +def get_train_data_iterator() -> Iterator: + if torch.distributed.is_available() and torch.distributed.is_initialized(): + if torch.distributed.get_rank() == 0: + compile_helpers() + torch.distributed.barrier() + else: + compile_helpers() + + config = GPTDatasetConfig( + random_seed=0, + sequence_length=_SEQUENCE_LENGTH, + reset_position_ids=False, + reset_attention_mask=False, + eod_mask_loss=False, + tokenizer=MegatronTokenizer.from_pretrained( + metadata_path={"library": "null-text"}, + vocab_size=_SEQUENCE_LENGTH, + ), + mid_level_dataset_surplus=0.005, + ) + datasets = BlendedMegatronDatasetBuilder( + MockGPTDataset, [1000, None, None], lambda: True, config + ).build() + return iter(DataLoader(datasets[0], batch_size=8, shuffle=True)) + + +def forward_step_func( + data_iterator: Iterator, model: torch.nn.Module +) -> Tuple[torch.Tensor, Callable]: + def loss_func( + loss_mask: torch.Tensor, output_tensor: torch.Tensor + ) -> Tuple[torch.Tensor, Dict[str, torch.Tensor]]: + losses = output_tensor.float() + loss_mask = loss_mask.view(-1).float() + loss = torch.sum(losses.view(-1) * loss_mask) / loss_mask.sum() + return loss, {"lm loss": loss} + + data = next(data_iterator) + device = next(model.parameters()).device + tokens = data["tokens"].to(device) + attention_mask = data["attention_mask"].to(device) + position_ids = data["position_ids"].to(device) + labels = data["labels"].to(device) + loss_mask = data["loss_mask"].to(device) + output_tensor = model(tokens, position_ids, attention_mask, labels=labels) + return output_tensor, partial(loss_func, loss_mask) + + +def save_distributed_checkpoint(checkpoint_path: str, gpt_model: torch.nn.Module) -> None: + model = gpt_model.module if hasattr(gpt_model, "module") else gpt_model + sharded_state_dict = model.sharded_state_dict(prefix="") + dist_checkpointing.save( + sharded_state_dict=sharded_state_dict, checkpoint_dir=checkpoint_path + ) + + +def load_distributed_checkpoint( + checkpoint_path: str, gpt_model: torch.nn.Module +) -> torch.nn.Module: + model = gpt_model.module if hasattr(gpt_model, "module") else gpt_model + sharded_state_dict = model.sharded_state_dict(prefix="") + checkpoint = dist_checkpointing.load( + sharded_state_dict=sharded_state_dict, checkpoint_dir=checkpoint_path + ) + model.load_state_dict(checkpoint) + return gpt_model + + +def main() -> None: + parser = argparse.ArgumentParser(description="Megatron-Core + probing training loop") + parser.add_argument("--tensor-model-parallel-size", type=int, default=2) + parser.add_argument("--pipeline-model-parallel-size", type=int, default=1) + parser.add_argument("--train-iters", type=int, default=0, help="0 = unlimited") + parser.add_argument("--max-duration-sec", type=int, default=0) + parser.add_argument("--num-microbatches", type=int, default=1) + parser.add_argument("--step-sleep-ms", type=int, default=0) + parser.add_argument("--print-freq", type=int, default=10) + parser.add_argument("--skip-checkpoint", action="store_true") + args = parser.parse_args() + + if not torch.cuda.is_available(): + raise SystemExit("CUDA is required for the Megatron-Core training example.") + + world_size = int(os.environ.get("WORLD_SIZE", "1")) + tp = args.tensor_model_parallel_size + pp = args.pipeline_model_parallel_size + if world_size < tp * pp: + raise SystemExit( + f"WORLD_SIZE={world_size} must be >= tensor_parallel({tp}) * pipeline_parallel({pp})" + ) + + initialize_distributed(tp, pp) + maybe_autostart() + sync_role_from_parallel_state() + model_parallel_cuda_manual_seed(123) + + rank = torch.distributed.get_rank() + if rank == 0: + _print_observability_hints() + print(f"role={probing.current_role()!r}", flush=True) + + gpt_model = model_provider().to(torch.device("cuda")) + ddp_config = DistributedDataParallelConfig( + grad_reduce_in_fp32=False, + overlap_grad_reduce=False, + use_distributed_optimizer=False, + ) + gpt_model = DistributedDataParallel( + config=gpt_model.config, + ddp_config=ddp_config, + module=gpt_model, + ) + optim = Adam(gpt_model.parameters()) + train_iterator = get_train_data_iterator() + forward_backward_func = get_forward_backward_func() + + started = time.monotonic() + iteration = 0 + while True: + if args.train_iters > 0 and iteration >= args.train_iters: + break + if args.max_duration_sec > 0 and (time.monotonic() - started) >= args.max_duration_sec: + break + + with probing.span("train_iter"): + optim.zero_grad() + losses_reduced = forward_backward_func( + forward_step_func=forward_step_func, + data_iterator=train_iterator, + model=gpt_model, + num_microbatches=args.num_microbatches, + seq_length=_SEQUENCE_LENGTH, + micro_batch_size=8, + decoder_seq_length=_SEQUENCE_LENGTH, + forward_only=False, + ) + finalize_model_grads([gpt_model]) + optim.step() + sync_step_from_iteration( + iteration + 1, + micro_batches=args.num_microbatches, + force=True, + ) + sync_role_from_parallel_state() + + if rank == 0 and (iteration + 1) % args.print_freq == 0: + snap = probing.step.snapshot() + print( + f"iter={iteration + 1} losses={losses_reduced} " + f"local_step={snap.local_step} role={probing.current_role()!r}", + flush=True, + ) + + iteration += 1 + if args.step_sleep_ms > 0: + time.sleep(args.step_sleep_ms / 1000.0) + + if rank == 0 and not args.skip_checkpoint: + ckpt_path = os.path.join(os.getcwd(), "ckpt") + Path(ckpt_path).mkdir(exist_ok=True) + save_distributed_checkpoint(gpt_model=gpt_model, checkpoint_path=ckpt_path) + gpt_model = load_distributed_checkpoint( + gpt_model=gpt_model, checkpoint_path=ckpt_path + ) + print("checkpoint save/load OK", flush=True) + + if rank == 0: + print(f"finished after {iteration} iteration(s)", flush=True) + _print_observability_hints() + + +if __name__ == "__main__": + main() diff --git a/examples/run_megatron_soak.sh b/examples/run_megatron_soak.sh new file mode 100755 index 00000000..a439c94c --- /dev/null +++ b/examples/run_megatron_soak.sh @@ -0,0 +1,113 @@ +#!/usr/bin/env bash +# Megatron-Core + probing soak (real megatron-core training loop; Web UI via PROBING_PORT). +# +# Prerequisites: +# make develop +# uv pip install megatron-core torch # CUDA build +# Linux + NVIDIA GPU(s); default uses 2 ranks with TP=2 +# +# Usage: +# ./examples/run_megatron_soak.sh +# DURATION_SEC=120 ./examples/run_megatron_soak.sh +# NPROC=1 TP_SIZE=1 ./examples/run_megatron_soak.sh +# +# Browser (while training): http://127.0.0.1:${PROBING_PORT}/ +# +# Mock contract tests: make test-python-regression (tests/regression/ext/test_megatron_contract.py) + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +PYTHON="${PYTHON:-python}" + +if ! "$PYTHON" python/probing/dev_pth.py status >/dev/null 2>&1; then + echo "error: dev env not ready — run: make develop" >&2 + exit 1 +fi + +_os="$(uname -s)" +if [[ "$_os" != "Linux" ]]; then + echo "error: Megatron-Core soak requires Linux + NVIDIA CUDA (current OS: $_os)" >&2 + echo " On macOS use ./examples/run_vllm_soak.sh for a real-framework probing demo." >&2 + echo " Megatron contract tests (no megatron-core): make test-python-regression" >&2 + exit 1 +fi + +if ! "$PYTHON" -m pip show megatron-core >/dev/null 2>&1; then + echo "error: megatron-core package not found in this venv" >&2 + echo " uv pip install megatron-core" >&2 + exit 1 +fi + +_import_err="$( + PROBING=0 "$PYTHON" -c "import megatron.core" 2>&1 +)" || { + echo "error: megatron-core is installed but failed to import" >&2 + if [[ -n "$_import_err" ]]; then + echo "$_import_err" | sed 's/^/ /' >&2 + fi + if grep -q "No module named 'triton'" <<<"$_import_err"; then + echo " hint: install CUDA PyTorch + triton (Linux GPU only), e.g.:" >&2 + echo " uv pip install torch triton megatron-core" >&2 + fi + exit 1 +} + +"$PYTHON" -c "import torch; assert torch.cuda.is_available()" 2>/dev/null || { + echo "error: CUDA torch required for Megatron-Core example" >&2 + echo " install a CUDA build of torch and ensure nvidia-smi works" >&2 + exit 1 +} + +DURATION_SEC="${DURATION_SEC:-600}" +TRAIN_ITERS="${TRAIN_ITERS:-0}" +NPROC="${NPROC:-2}" +TP_SIZE="${TP_SIZE:-2}" +PP_SIZE="${PP_SIZE:-1}" +PROBING_PORT="${PROBING_PORT:-18080}" +PROBING_DATA_DIR="${PROBING_DATA_DIR:-/tmp/probing_megatron_soak_$$}" +STEP_SLEEP_MS="${STEP_SLEEP_MS:-0}" +PRINT_FREQ="${PRINT_FREQ:-10}" +MASTER_PORT="${MASTER_PORT:-29581}" + +export PROBING="${PROBING:-2}" +export PROBING_MEGATRON="${PROBING_MEGATRON:-on}" +export PROBING_MEGATRON_STEP_SYNC="${PROBING_MEGATRON_STEP_SYNC:-on}" +export PROBING_PORT +export PROBING_DATA_DIR +export PROBING_RETENTION_DAYS="${PROBING_RETENTION_DAYS:-1}" +export PROBING_TORCH_PROFILING="${PROBING_TORCH_PROFILING:-on,shadow=4:1}" + +mkdir -p "$PROBING_DATA_DIR" + +COMMON_ARGS=( + examples/megatron_mcore_train_loop.py + --tensor-model-parallel-size "$TP_SIZE" + --pipeline-model-parallel-size "$PP_SIZE" + --max-duration-sec "$DURATION_SEC" + --step-sleep-ms "$STEP_SLEEP_MS" + --print-freq "$PRINT_FREQ" + --skip-checkpoint +) + +if [[ "$TRAIN_ITERS" -gt 0 ]]; then + COMMON_ARGS+=(--train-iters "$TRAIN_ITERS") +fi + +if [[ "$NPROC" -lt $((TP_SIZE * PP_SIZE)) ]]; then + echo "error: NPROC=$NPROC < TP_SIZE*PP_SIZE=$((TP_SIZE * PP_SIZE))" >&2 + exit 1 +fi + +echo "=== Megatron-Core + probing soak ===" +echo "PROBING=$PROBING PROBING_PORT=$PROBING_PORT NPROC=$NPROC TP=$TP_SIZE PP=$PP_SIZE" +echo "limits: DURATION_SEC=$DURATION_SEC TRAIN_ITERS=${TRAIN_ITERS:-0}" +echo "Web UI: http://127.0.0.1:${PROBING_PORT}/" +echo + +exec torchrun --standalone --nproc_per_node="$NPROC" \ + --master_port="$MASTER_PORT" \ + "$PYTHON" "${COMMON_ARGS[@]}" "$@" diff --git a/examples/run_vllm_soak.sh b/examples/run_vllm_soak.sh new file mode 100755 index 00000000..75b68534 --- /dev/null +++ b/examples/run_vllm_soak.sh @@ -0,0 +1,154 @@ +#!/usr/bin/env bash +# vLLM / vLLM-Metal offline inference + probing soak (real vLLM; Web UI via PROBING_PORT). +# +# Prerequisites: +# make develop +# Linux/CUDA: uv pip install vllm +# macOS: install vllm-metal — https://github.com/vllm-project/vllm-metal +# +# Usage: +# ./examples/run_vllm_soak.sh +# DURATION_SEC=120 ./examples/run_vllm_soak.sh +# VLLM_MODEL=facebook/opt-125m ./examples/run_vllm_soak.sh +# +# Browser: http://127.0.0.1:${PROBING_PORT}/ +# +# Mock contract tests: make test-python-regression (tests/regression/ext/test_vllm_contract.py) + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +PYTHON="${PYTHON:-python}" + +if ! "$PYTHON" python/probing/dev_pth.py status >/dev/null 2>&1; then + echo "error: dev env not ready — run: make develop" >&2 + exit 1 +fi + +_preflight_err="$(mktemp)" +trap 'rm -f "$_preflight_err"' EXIT + +if ! PROBING=0 "$PYTHON" - "$ROOT" <<'PY' 2>"$_preflight_err"; then +import os +import sys + +root = sys.argv[1] +venv_site = os.path.join( + root, + ".venv", + "lib", + f"python{sys.version_info.major}.{sys.version_info.minor}", + "site-packages", +) + + +def _in_venv(path: str) -> bool: + return not path or venv_site in path + + +def check_import(name: str, import_name: str | None = None) -> bool: + import_name = import_name or name + try: + mod = __import__(import_name) + except Exception as exc: + print(f"{name}: {exc}", file=sys.stderr) + return False + path = getattr(mod, "__file__", "") or "" + if not _in_venv(path): + print(f"{name} loads from outside .venv: {path}", file=sys.stderr) + print(f" hint: uv pip install {name}", file=sys.stderr) + return False + return True + + +ok = check_import("torch") and check_import("torchvision") and check_import("transformers") +if not ok: + sys.exit(1) + +try: + from vllm import LLM # noqa: F401 +except Exception as exc: + print(f"vllm.LLM import failed: {exc}", file=sys.stderr) + msg = str(exc) + if "torchvision::nms" in msg: + print( + " hint: torch/torchvision mismatch — reinstall matching wheels in .venv:", + file=sys.stderr, + ) + print( + " uv pip install torchvision torchaudio 'transformers>=4.46,<5'", + file=sys.stderr, + ) + sys.exit(1) +PY + echo "error: vLLM import preflight failed" >&2 + if [[ -s "$_preflight_err" ]]; then + sed 's/^/ /' "$_preflight_err" >&2 + fi + if grep -q "outside .venv" "$_preflight_err" 2>/dev/null; then + echo " note: .venv uses --system-site-packages; pyenv global packages can shadow venv." >&2 + echo " Install the full torch stack inside .venv (see examples/README.md)." >&2 + fi + if [[ "$(uname -s)" == Darwin ]]; then + echo " macOS: uv pip install torchvision torchaudio 'transformers>=4.46,<5'" >&2 + echo " plus vllm-metal — https://github.com/vllm-project/vllm-metal" >&2 + else + echo " Linux: uv pip install vllm torchvision 'transformers>=4.46,<5'" >&2 + fi + exit 1 +fi + +DURATION_SEC="${DURATION_SEC:-600}" +MAX_BATCHES="${MAX_BATCHES:-0}" +PROBING_PORT="${PROBING_PORT:-18081}" +PROBING_DATA_DIR="${PROBING_DATA_DIR:-/tmp/probing_vllm_soak_$$}" +BATCH_SLEEP_MS="${BATCH_SLEEP_MS:-0}" +PRINT_FREQ="${PRINT_FREQ:-5}" + +export PROBING="${PROBING:-2}" +export PROBING_VLLM="${PROBING_VLLM:-on}" +export PROBING_VLLM_STEP_SYNC="${PROBING_VLLM_STEP_SYNC:-on}" +export PROBING_PORT +export PROBING_DATA_DIR +export PROBING_RETENTION_DAYS="${PROBING_RETENTION_DAYS:-1}" +export PROBING_TORCH_PROFILING="${PROBING_TORCH_PROFILING:-on,shadow=4:1}" + +export VLLM_USE_V1="${VLLM_USE_V1:-1}" + +if [[ "$(uname -s)" == Darwin ]]; then + export VLLM_METAL_USE_MLX="${VLLM_METAL_USE_MLX:-1}" + export VLLM_MLX_DEVICE="${VLLM_MLX_DEVICE:-gpu}" + export VLLM_WORKER_MULTIPROC_METHOD="${VLLM_WORKER_MULTIPROC_METHOD:-spawn}" + # vllm-metal multi-prompt batched decode needs mlx_lm.BatchKVCache.merge (bleeding-edge). + export VLLM_PROMPTS_PER_BATCH="${VLLM_PROMPTS_PER_BATCH:-1}" + : "${VLLM_MODEL:=mlx-community/Qwen2.5-0.5B-Instruct-4bit}" +else + export VLLM_PROMPTS_PER_BATCH="${VLLM_PROMPTS_PER_BATCH:-4}" + : "${VLLM_MODEL:=facebook/opt-125m}" +fi +export VLLM_MODEL + +mkdir -p "$PROBING_DATA_DIR" + +COMMON_ARGS=( + examples/vllm_offline_soak.py + --model "$VLLM_MODEL" + --max-duration-sec "$DURATION_SEC" + --batch-sleep-ms "$BATCH_SLEEP_MS" + --print-freq "$PRINT_FREQ" +) + +if [[ "$MAX_BATCHES" -gt 0 ]]; then + COMMON_ARGS+=(--max-batches "$MAX_BATCHES") +fi + +echo "=== vLLM + probing soak (real inference) ===" +echo "PROBING=$PROBING PROBING_PORT=$PROBING_PORT VLLM_MODEL=$VLLM_MODEL" +echo "limits: DURATION_SEC=$DURATION_SEC MAX_BATCHES=${MAX_BATCHES:-0} VLLM_PROMPTS_PER_BATCH=${VLLM_PROMPTS_PER_BATCH:-?}" +echo "Web UI: http://127.0.0.1:${PROBING_PORT}/" +echo + +exec "$PYTHON" "${COMMON_ARGS[@]}" "$@" diff --git a/examples/vllm_offline_soak.py b/examples/vllm_offline_soak.py new file mode 100644 index 00000000..81aff1d7 --- /dev/null +++ b/examples/vllm_offline_soak.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python3 +""" +vLLM + vLLM-Metal + probing 离线推理 soak +======================================== + +使用真实 vLLM ``LLM.generate`` 长跑,写入 tracing / torch 表, +配合 ``PROBING_PORT`` 在浏览器打开 Web UI。 + +* Linux + CUDA:``uv pip install vllm``(或按官方文档安装) +* macOS Apple Silicon:安装 [vLLM-Metal](https://github.com/vllm-project/vllm-metal) + +契约测试(mock):``tests/regression/ext/test_vllm_contract.py`` — ``make test-python-regression`` + +运行:: + + ./examples/run_vllm_soak.sh + VLLM_MODEL=facebook/opt-125m DURATION_SEC=120 ./examples/run_vllm_soak.sh +""" + +from __future__ import annotations + +import argparse +import os +import sys +import time + +import probing +from probing.ext.vllm import maybe_autostart, sync_role_from_env, sync_step_from_llm + +try: + from vllm import LLM, SamplingParams +except ImportError as exc: # pragma: no cover - optional heavy dep + raise SystemExit( + "vLLM is required for this example.\n" + " Linux/CUDA: uv pip install vllm\n" + " macOS: install vllm-metal — https://github.com/vllm-project/vllm-metal" + ) from exc + + +_DEFAULT_PROMPTS = ( + "Hello, my name is", + "The capital of France is", + "Probing observes inference with vLLM", + "A short poem about GPUs:", +) + + +def _default_model() -> str: + if sys.platform == "darwin": + return "mlx-community/Qwen2.5-0.5B-Instruct-4bit" + return "facebook/opt-125m" + + +def _default_prompts_per_batch() -> int: + # vllm-metal batched decode needs mlx_lm.BatchKVCache.merge (not in all mlx-lm + # releases). Single-prompt batches use the sequential decode path and work reliably. + if sys.platform == "darwin": + return 1 + return len(_DEFAULT_PROMPTS) + + +def _prompts_for_batch( + prompts: list[str], *, batch_index: int, batch_size: int +) -> list[str]: + if batch_size <= 1: + return [prompts[batch_index % len(prompts)]] + start = (batch_index * batch_size) % len(prompts) + out: list[str] = [] + for offset in range(batch_size): + out.append(prompts[(start + offset) % len(prompts)]) + return out + + +def _wait_for_server_address(*, timeout_sec: float = 5.0) -> str | None: + deadline = time.monotonic() + timeout_sec + while time.monotonic() < deadline: + addr = probing.config.get_str("server.address") + if addr and str(addr).strip(): + return str(addr).strip().strip("'\"") + time.sleep(0.1) + return None + + +def _print_observability_hints() -> None: + pid = os.getpid() + addr = _wait_for_server_address() + print(f"pid={pid} probing={'on' if probing.is_enabled() else 'off'}") + if addr: + print(f"Web UI: http://{addr}/") + print(f" http://{addr}/investigate") + print( + f'CLI: probing -t {addr} query ' + f'"SELECT local_step, name FROM python.trace_event LIMIT 8"' + ) + else: + print(f'CLI: probing -t {pid} query "SELECT local_step FROM python.trace_event LIMIT 8"') + print("Tip: set PROBING_PORT=18081 (see run_vllm_soak.sh) for browser Web UI.") + print(flush=True) + + +class SoakLimits: + def __init__(self, *, max_batches: int = 0, max_duration_sec: int = 0) -> None: + self.max_batches = max(0, max_batches) + self.max_duration_sec = max(0, max_duration_sec) + self.batch_count = 0 + self.started_at = time.monotonic() + + @property + def enabled(self) -> bool: + return self.max_batches > 0 or self.max_duration_sec > 0 + + def tick(self) -> None: + self.batch_count += 1 + + def should_stop(self) -> bool: + if self.max_batches > 0 and self.batch_count >= self.max_batches: + return True + if self.max_duration_sec > 0: + return (time.monotonic() - self.started_at) >= self.max_duration_sec + return False + + def stop_reason(self) -> str: + if self.max_batches > 0 and self.batch_count >= self.max_batches: + return f"max_batches={self.max_batches}" + if self.max_duration_sec > 0: + elapsed = time.monotonic() - self.started_at + if elapsed >= self.max_duration_sec: + return ( + f"max_duration_sec={self.max_duration_sec} (elapsed={elapsed:.1f}s)" + ) + return "unknown" + + +def main() -> None: + parser = argparse.ArgumentParser(description="vLLM offline inference + probing soak") + parser.add_argument( + "--model", + default=os.environ.get("VLLM_MODEL", _default_model()), + help="HF model id (macOS: mlx-community/*; Linux: e.g. facebook/opt-125m)", + ) + parser.add_argument("--max-duration-sec", type=int, default=0) + parser.add_argument("--max-batches", type=int, default=0) + parser.add_argument("--batch-sleep-ms", type=int, default=0) + parser.add_argument("--print-freq", type=int, default=5) + parser.add_argument("--max-tokens", type=int, default=32) + parser.add_argument("--max-model-len", type=int, default=512) + parser.add_argument("--temperature", type=float, default=0.0) + parser.add_argument( + "--prompts-per-batch", + type=int, + default=int(os.environ.get("VLLM_PROMPTS_PER_BATCH", _default_prompts_per_batch())), + help="Prompts per llm.generate() call (macOS default 1: vllm-metal batched decode " + "needs mlx_lm.BatchKVCache.merge)", + ) + args = parser.parse_args() + if args.prompts_per_batch < 1: + raise SystemExit("--prompts-per-batch must be >= 1") + + soak = SoakLimits( + max_batches=args.max_batches, + max_duration_sec=args.max_duration_sec, + ) + + print(f"model={args.model}") + print(f"prompts_per_batch={args.prompts_per_batch}") + if soak.enabled: + print( + f"soak limits: max_batches={soak.max_batches or '∞'} " + f"max_duration_sec={soak.max_duration_sec or '∞'}" + ) + _print_observability_hints() + + # vLLM import may occur after probing; ensure hooks are applied. + maybe_autostart() + + with probing.span("vllm_load"): + llm = LLM( + model=args.model, + max_model_len=args.max_model_len, + trust_remote_code=True, + ) + + maybe_autostart() + sync_role_from_env() + print(f"role={probing.current_role()!r}", flush=True) + + sampling_params = SamplingParams( + temperature=args.temperature, + max_tokens=args.max_tokens, + ) + prompts = list(_DEFAULT_PROMPTS) + + try: + while True: + if soak.enabled and soak.should_stop(): + break + + with probing.span("generate_batch"): + batch_idx = soak.batch_count + batch_prompts = _prompts_for_batch( + prompts, + batch_index=batch_idx, + batch_size=args.prompts_per_batch, + ) + probing.event("batch.start", attributes=[{"batch": batch_idx}]) + outputs = llm.generate(batch_prompts, sampling_params) + sync_step_from_llm(llm, force=True) + sync_role_from_env() + soak.tick() + + if soak.batch_count % args.print_freq == 0: + snap = probing.step.snapshot() + sample = outputs[0].outputs[0].text if outputs else "" + print( + f"batch={soak.batch_count} local_step={snap.local_step} " + f"sample={sample[:80]!r}", + flush=True, + ) + + probing.event( + "batch.end", + attributes=[ + {"batch": batch_idx}, + {"requests": len(outputs)}, + ], + ) + + if args.batch_sleep_ms > 0: + time.sleep(args.batch_sleep_ms / 1000.0) + + except KeyboardInterrupt: + print("\n=> interrupted", flush=True) + + if soak.enabled: + print(f"=> soak stop: {soak.stop_reason()}", flush=True) + + print(f"finished after {soak.batch_count} generate batch(es)") + _print_observability_hints() + + +if __name__ == "__main__": + main() diff --git a/probing/core/src/core/federation/mod.rs b/probing/core/src/core/federation/mod.rs index 2813d5ea..9d4b350d 100644 --- a/probing/core/src/core/federation/mod.rs +++ b/probing/core/src/core/federation/mod.rs @@ -41,6 +41,8 @@ pub use rewrite::{ rewrite_global_catalog_to_probe, rewrite_sql_for_global_fanout, }; pub use route::{ - classify_cluster_sql, classify_federated_sql, explain_federation, explain_physical_plan, - FederatedQueryPath, FederationExplainReport, + classify_cluster_sql, classify_federated_sql, classify_federated_sql_with_context, + estimate_federation_cost, explain_federation, explain_physical_plan, + recommended_fanout_concurrency, FederatedQueryPath, FederationCostEstimate, + FederationExplainReport, FederationRouteContext, }; diff --git a/probing/core/src/core/federation/route.rs b/probing/core/src/core/federation/route.rs index 923f095b..f4ca8b10 100644 --- a/probing/core/src/core/federation/route.rs +++ b/probing/core/src/core/federation/route.rs @@ -9,9 +9,11 @@ use datafusion::arrow::record_batch::RecordBatch; use datafusion::error::Result; +use crate::core::cluster::remote_peers_excluding_local; use crate::core::Engine; use super::aggregate_pushdown::{plan_federated_aggregate_pushdown, FederatedAggregatePlan}; +use super::query_guard::global_scan_max_rows; use super::rewrite::{ can_fanout_via_global_catalog, prepare_global_query, rewrite_sql_for_global_fanout, }; @@ -29,6 +31,40 @@ pub enum FederatedQueryPath { Broadcast, } +/// Runtime cluster shape used for federated path cost estimation. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct FederationRouteContext { + /// Remote peers excluding the coordinator (matches fan-out target set). + pub peer_count: usize, +} + +impl FederationRouteContext { + pub fn from_cluster() -> Self { + Self { + peer_count: remote_peers_excluding_local().len(), + } + } +} + +/// Abstract cost model for federated execution paths (§4.2). +/// +/// Units are relative — suitable for comparing paths and sizing fan-out concurrency, +/// not for wall-clock prediction without bandwidth/load telemetry. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct FederationCostEstimate { + pub path: FederatedQueryPath, + /// Coordinator + remote endpoints contacted (local + peers). + pub peer_fanout: usize, + /// Estimated rows returned per endpoint before merge. + pub estimated_rows_per_peer: usize, + /// Estimated rows materialized at the coordinator after merge. + pub estimated_total_rows: usize, + /// Relative cost units (higher = more network / merge work). + pub relative_cost: u64, + /// Suggested fan-out concurrency for this cluster size and path. + pub recommended_fanout_concurrency: usize, +} + /// Snapshot returned by [`explain_federation`]. #[derive(Debug, Clone, PartialEq, Eq)] pub struct FederationExplainReport { @@ -38,6 +74,8 @@ pub struct FederationExplainReport { pub aggregate_plan: Option, /// DataFusion `EXPLAIN` text for the prepared `global.*` statement (path B plan shape). pub physical_plan: String, + pub route_context: FederationRouteContext, + pub cost: FederationCostEstimate, } /// Classify a SQL string that already references `global.*` (or will after rewrite). @@ -60,13 +98,92 @@ pub fn classify_cluster_sql(user_sql: &str) -> FederatedQueryPath { classify_federated_sql(&rewrite_sql_for_global_fanout(user_sql)) } +/// Classify a federated statement and attach a cluster-size-aware cost estimate. +pub fn classify_federated_sql_with_context( + sql: &str, + ctx: &FederationRouteContext, +) -> (FederatedQueryPath, FederationCostEstimate) { + let path = classify_federated_sql(sql); + let cost = estimate_federation_cost(path, ctx, sql); + (path, cost) +} + +/// Estimate relative cost for a federated path at the given cluster size. +pub fn estimate_federation_cost( + path: FederatedQueryPath, + ctx: &FederationRouteContext, + sql: &str, +) -> FederationCostEstimate { + let peer_fanout = match path { + FederatedQueryPath::Local => 1, + _ => ctx.peer_count.saturating_add(1), + }; + let rows_per_peer = estimated_rows_per_peer(path, sql); + let estimated_total_rows = match path { + FederatedQueryPath::Local => rows_per_peer, + FederatedQueryPath::AggregatePushdown => rows_per_peer.saturating_mul(peer_fanout), + FederatedQueryPath::FederatedScan => rows_per_peer.saturating_mul(peer_fanout), + FederatedQueryPath::Broadcast => rows_per_peer + .saturating_mul(peer_fanout) + .saturating_mul(peer_fanout), + }; + let relative_cost = match path { + FederatedQueryPath::Local => 1, + FederatedQueryPath::AggregatePushdown => peer_fanout as u64 * 2, + FederatedQueryPath::FederatedScan => { + (peer_fanout as u64).saturating_mul(rows_per_peer as u64) + } + FederatedQueryPath::Broadcast => (peer_fanout as u64) + .saturating_mul(peer_fanout as u64) + .saturating_mul(rows_per_peer as u64), + }; + FederationCostEstimate { + path, + peer_fanout, + estimated_rows_per_peer: rows_per_peer, + estimated_total_rows, + relative_cost, + recommended_fanout_concurrency: recommended_fanout_concurrency(ctx.peer_count), + } +} + +/// Fan-out concurrency tuned to cluster size (caps at [`super::cluster_executor::remote_fanout_concurrency`]). +pub fn recommended_fanout_concurrency(peer_count: usize) -> usize { + let cap = super::cluster_executor::remote_fanout_concurrency(); + if peer_count == 0 { + return cap; + } + peer_count.min(cap).max(1) +} + +fn estimated_rows_per_peer(path: FederatedQueryPath, sql: &str) -> usize { + match path { + FederatedQueryPath::Local => sql_limit_value(sql).unwrap_or(1), + FederatedQueryPath::AggregatePushdown => { + // Partial aggregate groups are typically small vs raw scans. + sql_limit_value(sql).unwrap_or(64) + } + FederatedQueryPath::FederatedScan => sql_limit_value(sql).unwrap_or(global_scan_max_rows()), + FederatedQueryPath::Broadcast => sql_limit_value(sql).unwrap_or(1), + } +} + +fn sql_limit_value(sql: &str) -> Option { + let upper = sql.to_ascii_uppercase(); + let idx = upper.rfind("LIMIT")?; + let tail = sql[idx + 5..].trim(); + let num: String = tail.chars().take_while(|c| c.is_ascii_digit()).collect(); + num.parse().ok() +} + /// Build a full federation explain report: route + optional pushdown plan + physical EXPLAIN. pub async fn explain_federation( engine: &Engine, user_sql: &str, ) -> Result { let global_sql = prepare_global_query(&rewrite_sql_for_global_fanout(user_sql)); - let execution_path = classify_federated_sql(&global_sql); + let route_context = FederationRouteContext::from_cluster(); + let (execution_path, cost) = classify_federated_sql_with_context(&global_sql, &route_context); let aggregate_plan = plan_federated_aggregate_pushdown(&global_sql); let physical_plan = explain_physical_plan(engine, &global_sql).await?; Ok(FederationExplainReport { @@ -75,6 +192,8 @@ pub async fn explain_federation( execution_path, aggregate_plan, physical_plan, + route_context, + cost, }) } @@ -147,4 +266,37 @@ mod tests { FederatedQueryPath::AggregatePushdown ); } + + #[test] + fn cost_pushdown_cheaper_than_broadcast_at_scale() { + let ctx = FederationRouteContext { peer_count: 128 }; + let pushdown_sql = + "SELECT global_step, sum(duration_ms) FROM global.python.comm_collective GROUP BY global_step"; + let broadcast_sql = + "SELECT a.x FROM global.python.a JOIN global.python.b ON a.id = b.id LIMIT 100"; + let (_, pushdown_cost) = classify_federated_sql_with_context(pushdown_sql, &ctx); + let (_, broadcast_cost) = classify_federated_sql_with_context(broadcast_sql, &ctx); + assert_eq!(pushdown_cost.path, FederatedQueryPath::AggregatePushdown); + assert_eq!(broadcast_cost.path, FederatedQueryPath::Broadcast); + assert!(pushdown_cost.relative_cost < broadcast_cost.relative_cost); + assert_eq!(pushdown_cost.estimated_rows_per_peer, 64); + assert_eq!(broadcast_cost.estimated_rows_per_peer, 100); + } + + #[test] + fn cost_scan_scales_with_peer_count_and_limit() { + let ctx = FederationRouteContext { peer_count: 10 }; + let sql = "SELECT rank FROM global.demo.metrics WHERE rank > 0 LIMIT 50"; + let (_, cost) = classify_federated_sql_with_context(sql, &ctx); + assert_eq!(cost.path, FederatedQueryPath::FederatedScan); + assert_eq!(cost.peer_fanout, 11); + assert_eq!(cost.estimated_rows_per_peer, 50); + assert_eq!(cost.estimated_total_rows, 550); + } + + #[test] + fn recommended_fanout_scales_down_for_small_clusters() { + assert_eq!(recommended_fanout_concurrency(4), 4); + assert!(recommended_fanout_concurrency(512) <= 128); + } } diff --git a/probing/extensions/python/src/extensions/python/exttbls.rs b/probing/extensions/python/src/extensions/python/exttbls.rs index 79ce8f43..e35cb774 100644 --- a/probing/extensions/python/src/extensions/python/exttbls.rs +++ b/probing/extensions/python/src/extensions/python/exttbls.rs @@ -139,7 +139,7 @@ impl Default for PyExternalTableConfig { fn default() -> Self { PyExternalTableConfig { chunk_size: 10000, - discard_threshold: 20_000_000, + discard_threshold: default_discard_threshold_bytes(), discard_strategy: "BaseMemorySize".to_string(), } } @@ -172,6 +172,23 @@ impl PyExternalTableConfig { } } +const DEFAULT_DISCARD_THRESHOLD_BYTES: usize = 20 * 1024 * 1024; + +fn default_discard_threshold_bytes() -> usize { + static DEFAULT: std::sync::OnceLock = std::sync::OnceLock::new(); + *DEFAULT.get_or_init(|| { + std::env::var("PROBING_TABLE_DEFAULT_MB") + .ok() + .and_then(|v| v.trim().parse::().ok()) + .filter(|mb| *mb > 0) + .map(|mb| mb * 1024 * 1024) + .unwrap_or(DEFAULT_DISCARD_THRESHOLD_BYTES) + }) +} + +fn resolve_discard_threshold(discard_threshold: Option) -> usize { + discard_threshold.unwrap_or_else(default_discard_threshold_bytes) +} /// Total ring capacity in bytes derived from the (legacy) discard config. /// /// - `BaseMemorySize`: `discard_threshold` *is* a byte budget. @@ -485,17 +502,18 @@ impl ExternalTable { #[pymethods] impl ExternalTable { #[new] - #[pyo3(signature = (name, columns, chunk_size = 10000, discard_threshold = 20_000_000, discard_strategy = "BaseMemorySize".to_string(), table_doc = None, column_docs = None))] + #[pyo3(signature = (name, columns, chunk_size = 10000, discard_threshold = None, discard_strategy = "BaseMemorySize".to_string(), table_doc = None, column_docs = None))] fn new( name: &str, columns: Vec, chunk_size: usize, - discard_threshold: usize, + discard_threshold: Option, discard_strategy: String, table_doc: Option, column_docs: Option>, ) -> PyResult { let _ = chunk_size; // ring chunking is byte-based; kept for API compat + let discard_threshold = resolve_discard_threshold(discard_threshold); let name = name.to_string(); with_detached_native(move || { let ncolumn = columns.len(); @@ -529,19 +547,20 @@ impl ExternalTable { } #[classmethod] - #[pyo3(signature = (name, columns, chunk_size = 10000, discard_threshold = 20_000_000, discard_strategy = "BaseMemorySize".to_string(), table_doc = None, column_docs = None))] + #[pyo3(signature = (name, columns, chunk_size = 10000, discard_threshold = None, discard_strategy = "BaseMemorySize".to_string(), table_doc = None, column_docs = None))] #[allow(clippy::too_many_arguments)] fn get_or_create( _cls: &Bound<'_, PyType>, name: &str, columns: Vec, chunk_size: usize, - discard_threshold: usize, + discard_threshold: Option, discard_strategy: String, table_doc: Option, column_docs: Option>, ) -> PyResult { let _ = chunk_size; + let discard_threshold = resolve_discard_threshold(discard_threshold); let name = name.to_string(); with_detached_native(move || { let mut binding = lock_extern_tables(); @@ -756,7 +775,7 @@ if not hasattr(probing, "_made_{name}"): "table1", vec!["a".to_string(), "b".to_string()], 10000, - 20000000, + Some(20000000), "BaseMemorySize".to_string(), None, None, @@ -777,7 +796,7 @@ if not hasattr(probing, "_made_{name}"): "op".to_string(), ], 10000, - 20_000_000, + Some(20_000_000), "BaseMemorySize".to_string(), None, None, @@ -841,7 +860,7 @@ probing.ExternalTable.drop("table_to_drop") "roundtrip", vec!["x".to_string(), "msg".to_string()], 10000, - 1_000_000, + Some(1_000_000), "BaseMemorySize".to_string(), None, None, @@ -871,7 +890,7 @@ probing.ExternalTable.drop("table_to_drop") "nccl.proxy_ops", vec!["rank".to_string()], 10000, - 1_000_000, + Some(1_000_000), "BaseMemorySize".to_string(), None, None, diff --git a/python/probing/bundled_skills/nccl_culprit_victim/SKILL.md b/python/probing/bundled_skills/nccl_culprit_victim/SKILL.md index 261a5b7a..9bb7b529 100644 --- a/python/probing/bundled_skills/nccl_culprit_victim/SKILL.md +++ b/python/probing/bundled_skills/nccl_culprit_victim/SKILL.md @@ -15,10 +15,11 @@ parameters: # NCCL culprit / victim attribution -Uses **NCCL profiler plugin** wait decomposition (`nccl.proxy_ops`): +Uses **NCCL profiler plugin** wait decomposition (`nccl.proxy_ops`) with **peer-topology attribution** (rank↔peer edges, not global wait sorting): -- **Culprit** (slow local GPU): high `send_gpu_wait_ns` -- **Victim** (waiting on peers / network): high `recv_wait_ns` +- **Culprit** (slow local GPU): high `send_gpu_wait_ns` on a send edge `(rank → peer)` +- **Victim** (waiting on peers / network): high `recv_wait_ns` on recv edge; check `attributed_root_rank` +- **Propagated victim**: recv wait high but peer's `send_gpu_wait_ns` is also high — root cause is upstream - **Receiver congestion** (v4 ABI only): high `send_peer_wait_ns` — this rank's sends are stalled waiting for the *peer's* clear-to-send credits; investigate that peer diff --git a/python/probing/bundled_skills/nccl_culprit_victim/steps.yaml b/python/probing/bundled_skills/nccl_culprit_victim/steps.yaml index a53e2466..f11ef465 100644 --- a/python/probing/bundled_skills/nccl_culprit_victim/steps.yaml +++ b/python/probing/bundled_skills/nccl_culprit_victim/steps.yaml @@ -6,17 +6,18 @@ metadata: title: "NCCL culprit / victim 归因" title_en: "NCCL culprit vs victim attribution" category: distributed - tags: [NCCL, culprit, victim, proxy, wait, straggler] + tags: [NCCL, culprit, victim, proxy, wait, straggler, topology] triggers: keywords: - zh: ["罪魁祸首", "受害者", "recv_wait", "gpu_wait", "NCCL 等待", "proxy wait"] - en: ["NCCL culprit", "NCCL victim", "recv wait", "gpu wait", "proxy wait"] + zh: ["罪魁祸首", "受害者", "recv_wait", "gpu_wait", "NCCL 等待", "proxy wait", "拓扑"] + en: ["NCCL culprit", "NCCL victim", "recv wait", "gpu wait", "proxy wait", "topology"] docs: | - 基于 nccl.proxy_ops 的 ProxyStep wait 分解,区分: - - culprit:send_gpu_wait_ns 高(本 rank GPU/计算慢) - - victim:recv_wait_ns 高(等 peer / 网络) - - send_peer_wait_ns 高(仅 v4 ABI):等接收端 credits → 对端拥塞信号 - 需要 NCCL_PROFILER_PLUGIN 加载 probing-nccl-profiler;开发机可用 PROBING_NCCL_MOCK=1。 + 基于 nccl.proxy_ops 的 ProxyStep wait 分解,按 **rank↔peer 通信边** 归因(非全局 wait 排序): + - culprit:send 边上 send_gpu_wait_ns 高(本 rank GPU/计算慢) + - victim:recv 边上 recv_wait_ns 高,且对端 send 边 send_gpu_wait 不高 → 等网络/relay + - propagated victim:recv 高但对端 send_gpu_wait 也高 → 根因在拓扑上游 peer + - send_peer_wait_ns 高(仅 v4 ABI):等接收端 credits → 对端拥塞 + 需要 NCCL_PROFILER_PLUGIN;开发机可用 PROBING_NCCL_MOCK=1。 spec: parameters: @@ -62,48 +63,256 @@ spec: - export NCCL_PROFILE_EVENT_MASK=94 - 或 macOS 开发: PROBING_NCCL_MOCK=1 PROBING=1 + - id: topology_attribution + title: "拓扑边归因 (rank↔peer)" + type: sql + sql: | + WITH windowed AS ( + SELECT * + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + AND peer >= 0 + ), + send_edges AS ( + SELECT + rank AS sender_rank, + peer AS receiver_rank, + coll_func, + tp_rank, + pp_rank, + dp_rank, + sum(send_gpu_wait_ns) AS send_gpu_wait_ns, + sum(send_peer_wait_ns) AS send_peer_wait_ns, + sum(send_wait_ns) AS send_wait_ns, + count(*) AS send_ops + FROM windowed + WHERE is_send = 1 + GROUP BY rank, peer, coll_func, tp_rank, pp_rank, dp_rank + ), + recv_edges AS ( + SELECT + rank AS receiver_rank, + peer AS sender_rank, + coll_func, + tp_rank, + pp_rank, + dp_rank, + sum(recv_wait_ns) AS recv_wait_ns, + sum(recv_flush_wait_ns) AS recv_flush_wait_ns, + count(*) AS recv_ops + FROM windowed + WHERE is_send = 0 + GROUP BY rank, peer, coll_func, tp_rank, pp_rank, dp_rank + ) + SELECT + r.receiver_rank AS rank, + r.sender_rank AS peer, + r.coll_func, + r.tp_rank, + r.pp_rank, + r.dp_rank, + r.recv_wait_ns AS victim_wait_ns, + coalesce(s.send_gpu_wait_ns, 0) AS peer_send_gpu_wait_ns, + coalesce(s.send_peer_wait_ns, 0) AS peer_send_peer_wait_ns, + coalesce(s.send_wait_ns, 0) AS peer_send_wait_ns, + CASE + WHEN coalesce(s.send_gpu_wait_ns, 0) >= r.recv_wait_ns * 0.5 + THEN r.sender_rank + ELSE r.receiver_rank + END AS attributed_root_rank, + CASE + WHEN coalesce(s.send_gpu_wait_ns, 0) >= r.recv_wait_ns * 0.5 + THEN 'propagated_victim' + WHEN r.recv_wait_ns > coalesce(s.send_gpu_wait_ns, 0) * 2 + THEN 'local_victim_or_network' + ELSE 'ambiguous' + END AS attribution_class, + r.recv_ops AS ops + FROM recv_edges r + LEFT JOIN send_edges s + ON s.sender_rank = r.sender_rank + AND s.receiver_rank = r.receiver_rank + AND s.coll_func = r.coll_func + AND s.tp_rank = r.tp_rank + AND s.pp_rank = r.pp_rank + AND s.dp_rank = r.dp_rank + WHERE r.recv_wait_ns > 0 + ORDER BY r.recv_wait_ns DESC + LIMIT 15 + on_empty: skip + empty_message: "无 peer>=0 的 recv 边 — collective 可能未填充 peer 列" + - id: culprit_ranking - title: "Culprit 候选 (send_gpu_wait)" + title: "Culprit 候选 (send 边 send_gpu_wait)" type: sql sql: | + WITH windowed AS ( + SELECT * + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + AND peer >= 0 + ), + send_edges AS ( + SELECT + rank, + peer, + coll_func, + tp_rank, + pp_rank, + dp_rank, + sum(send_gpu_wait_ns) AS culprit_wait_ns, + sum(send_peer_wait_ns) AS peer_congestion_ns, + count(*) AS ops + FROM windowed + WHERE is_send = 1 + GROUP BY rank, peer, coll_func, tp_rank, pp_rank, dp_rank + ) SELECT rank, + peer, + coll_func, tp_rank, pp_rank, dp_rank, - coll_func, - sum(send_gpu_wait_ns) AS culprit_wait_ns, - count(*) AS ops - FROM {nccl_proxy_table} - WHERE seq >= ( - SELECT max(seq) - {seq_window} - FROM {nccl_proxy_table} - ) - GROUP BY rank, tp_rank, pp_rank, dp_rank, coll_func + culprit_wait_ns, + peer_congestion_ns, + ops + FROM send_edges + WHERE culprit_wait_ns > 0 ORDER BY culprit_wait_ns DESC LIMIT 10 on_empty: skip - id: victim_ranking - title: "Victim 候选 (recv_wait)" + title: "Victim 候选 (拓扑归因后)" type: sql sql: | + WITH windowed AS ( + SELECT * + FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + AND peer >= 0 + ), + send_edges AS ( + SELECT + rank AS sender_rank, + peer AS receiver_rank, + coll_func, + tp_rank, + pp_rank, + dp_rank, + sum(send_gpu_wait_ns) AS send_gpu_wait_ns + FROM windowed + WHERE is_send = 1 + GROUP BY rank, peer, coll_func, tp_rank, pp_rank, dp_rank + ), + recv_edges AS ( + SELECT + rank AS receiver_rank, + peer AS sender_rank, + coll_func, + tp_rank, + pp_rank, + dp_rank, + sum(recv_wait_ns) AS victim_wait_ns, + sum(recv_flush_wait_ns) AS flush_wait_ns, + count(*) AS ops + FROM windowed + WHERE is_send = 0 + GROUP BY rank, peer, coll_func, tp_rank, pp_rank, dp_rank + ) SELECT - rank, - tp_rank, - pp_rank, - dp_rank, - coll_func, - sum(recv_wait_ns) AS victim_wait_ns, - sum(recv_flush_wait_ns) AS flush_wait_ns, - count(*) AS ops - FROM {nccl_proxy_table} - WHERE seq >= ( - SELECT max(seq) - {seq_window} + r.receiver_rank AS rank, + r.sender_rank AS peer, + r.coll_func, + r.tp_rank, + r.pp_rank, + r.dp_rank, + r.victim_wait_ns, + r.flush_wait_ns, + coalesce(s.send_gpu_wait_ns, 0) AS peer_send_gpu_wait_ns, + CASE + WHEN coalesce(s.send_gpu_wait_ns, 0) >= r.victim_wait_ns * 0.5 + THEN r.sender_rank + ELSE r.receiver_rank + END AS attributed_root_rank, + r.ops + FROM recv_edges r + LEFT JOIN send_edges s + ON s.sender_rank = r.sender_rank + AND s.receiver_rank = r.receiver_rank + AND s.coll_func = r.coll_func + AND s.tp_rank = r.tp_rank + AND s.pp_rank = r.pp_rank + AND s.dp_rank = r.dp_rank + WHERE r.victim_wait_ns > 0 + ORDER BY r.victim_wait_ns DESC + LIMIT 10 + on_empty: skip + + - id: root_culprit_summary + title: "根因 rank 汇总 (沿 peer 边聚合)" + type: sql + sql: | + WITH windowed AS ( + SELECT * FROM {nccl_proxy_table} + WHERE seq >= ( + SELECT max(seq) - {seq_window} + FROM {nccl_proxy_table} + ) + AND peer >= 0 + ), + send_edges AS ( + SELECT + rank AS sender_rank, + peer AS receiver_rank, + sum(send_gpu_wait_ns) AS send_gpu_wait_ns + FROM windowed + WHERE is_send = 1 + GROUP BY rank, peer + ), + recv_edges AS ( + SELECT + rank AS receiver_rank, + peer AS sender_rank, + sum(recv_wait_ns) AS recv_wait_ns + FROM windowed + WHERE is_send = 0 + GROUP BY rank, peer + ), + attributed AS ( + SELECT + CASE + WHEN coalesce(s.send_gpu_wait_ns, 0) >= r.recv_wait_ns * 0.5 + THEN r.sender_rank + ELSE r.receiver_rank + END AS root_rank, + r.recv_wait_ns AS recv_wait_ns, + coalesce(s.send_gpu_wait_ns, 0) AS send_gpu_wait_ns + FROM recv_edges r + LEFT JOIN send_edges s + ON s.sender_rank = r.sender_rank + AND s.receiver_rank = r.receiver_rank + WHERE r.recv_wait_ns > 0 ) - GROUP BY rank, tp_rank, pp_rank, dp_rank, coll_func - ORDER BY victim_wait_ns DESC + SELECT + root_rank AS rank, + sum(recv_wait_ns) AS total_attributed_recv_wait_ns, + sum(send_gpu_wait_ns) AS total_peer_send_gpu_wait_ns, + count(*) AS edges + FROM attributed + GROUP BY root_rank + ORDER BY total_attributed_recv_wait_ns DESC LIMIT 10 on_empty: skip @@ -173,30 +382,35 @@ spec: interpretation: rules: - id: culprit_dominates - when: "step:rank_wait_summary | column:total_gpu_wait_ns | max/min(ratio) > 2" + when: "step:root_culprit_summary | column:total_attributed_recv_wait_ns | max/min(ratio) > 2" severity: warning - message: "某 rank 的 send_gpu_wait 显著高于其他 rank — 可能是 culprit (本地 GPU 慢)" + message: "某 root rank 在拓扑归因后 recv wait 显著集中 — 优先检查 attributed_root_rank" - id: victim_dominates - when: "step:rank_wait_summary | column:total_recv_wait_ns | max/min(ratio) > 2" + when: "step:topology_attribution | column:victim_wait_ns | max/min(ratio) > 2" severity: warning - message: "某 rank 的 recv_wait 显著高于其他 rank — 可能是 victim (等待 peer/网络)" + message: "某 recv 边 wait 显著偏高 — 查看 attribution_class 区分 propagated_victim vs local_victim" + + - id: propagated_victim_chain + when: "step:topology_attribution | rows >= 1 | column:attribution_class | value = propagated_victim" + severity: info + message: "存在 propagated_victim — 根因在 peer 侧 send_gpu_wait,勿将 receiver 误判为 culprit" - id: culprit_not_victim when: "step:culprit_ranking | rows >= 1 | column:culprit_wait_ns | max > 1000000" severity: info - message: "查看 culprit_ranking 顶部 rank — 对比 victim_ranking 确认是否同一 rank" + message: "查看 culprit_ranking 的 (rank, peer) 边 — 对比 victim_ranking.attributed_root_rank" summary_template: | - ## NCCL culprit / victim - - **culprit_ranking**: `send_gpu_wait_ns` 最高 → 本地算力瓶颈 - - **victim_ranking**: `recv_wait_ns` 最高 → 等待他人或网络 - - **rank_wait_summary.total_peer_wait_ns**(仅 v4 ABI)高 → 对端接收拥塞 - - **role_aligned**: 同 tp/pp/dp 切片对比(Megatron 拓扑) - - 若仅有 python.comm_collective → skill: comm_bottleneck + ## NCCL culprit / victim(拓扑感知) + - **topology_attribution**: recv 边 + 对端 send 边 join → `attributed_root_rank` / `attribution_class` + - **culprit_ranking**: send 边 `(rank→peer)` 上 `send_gpu_wait_ns` 最高 → 本地 GPU 慢 + - **victim_ranking**: recv 边 + `attributed_root_rank`(区分 relay victim vs 根因) + - **root_culprit_summary**: 沿拓扑归因聚合的根因 rank + - **rank_wait_summary**: 全局 rank 视图(辅助;万卡场景以边级步骤为准) next_steps: - - "culprit 持续同一 rank → gpu_pressure / module_bottleneck" - - "victim 全体偏高 → 网络/RoCE: comm_bottleneck (rdma.mlx_hca)" - - "send_peer_wait_ns 偏高 → 对端 rank 接收侧拥塞,检查该 peer 的 GPU/网络" - - "单 rank victim + 其他 culprit → 典型 straggler: slow_rank" + - "attributed_root_rank 持续同一 rank → gpu_pressure / module_bottleneck" + - "attribution_class=local_victim_or_network 全体偏高 → comm_bottleneck (rdma.mlx_hca)" + - "peer_send_peer_wait_ns 偏高 → 对端 rank 接收侧拥塞" + - "propagated_victim 链 → 沿 topology_attribution 向 sender 追溯 root rank" diff --git a/python/probing/bundled_web/public/index.html b/python/probing/bundled_web/public/index.html new file mode 100644 index 00000000..4316b227 --- /dev/null +++ b/python/probing/bundled_web/public/index.html @@ -0,0 +1,19 @@ + + + + + + Probing Web InterfaceProbing Web Interface + + + + + +
+ + + diff --git a/python/probing/core/table.py b/python/probing/core/table.py index d66d14aa..15fa8667 100644 --- a/python/probing/core/table.py +++ b/python/probing/core/table.py @@ -1,5 +1,5 @@ import dataclasses -import functools +import os import re from typing import Any, Optional, Type, Union @@ -7,6 +7,27 @@ cache = {} +_DEFAULT_TABLE_CAPACITY_BYTES = 20 * 1024 * 1024 + + +def _env_default_capacity_bytes() -> int: + raw = os.environ.get("PROBING_TABLE_DEFAULT_MB", "").strip() + if not raw: + return _DEFAULT_TABLE_CAPACITY_BYTES + try: + mb = int(raw) + except ValueError: + return _DEFAULT_TABLE_CAPACITY_BYTES + if mb <= 0: + return _DEFAULT_TABLE_CAPACITY_BYTES + return mb * 1024 * 1024 + + +def _resolve_capacity_bytes(override: Optional[int]) -> int: + if override is not None: + return max(override, 4096) + return _env_default_capacity_bytes() + def camel_to_snake(name): """ @@ -43,7 +64,11 @@ def _column_docs_from_class(cls) -> dict[str, str]: return docs -def table(name_or_class: Optional[Union[str, Type[Any]]] = None): +def table( + name_or_class: Optional[Union[str, Type[Any]]] = None, + *, + capacity_bytes: Optional[int] = None, +): """A decorator that converts a dataclass into a persistable table. This decorator adds database-like functionality to dataclasses. When applied to a dataclass, @@ -58,6 +83,9 @@ def table(name_or_class: Optional[Union[str, Type[Any]]] = None): name : Optional[str], default=None The name of the table to create or access. If None, the decorated class name will be used. When provided, the name will be converted to lowercase. + capacity_bytes : Optional[int], default=None + Mmap ring byte budget for this table (``discard_threshold``). When omitted, uses + ``PROBING_TABLE_DEFAULT_MB`` (default 20 MiB per table). Returns ------- @@ -118,9 +146,18 @@ def decorator(cls): table_doc = _table_doc_from_class(cls) column_docs = _column_docs_from_class(cls) qualified_name = table_name if "." in table_name else f"python.{table_name}" + ring_capacity = _resolve_capacity_bytes(capacity_bytes) + + def _register_docs(): + if column_docs or table_doc: + probing.register_table_docs( + qualified_name, table_doc, column_docs or None + ) - @functools.wraps(cls.__init__) - def init_table(): + @classmethod + def init_table(cls): + if cls in cache: + return cache[cls] try: table = probing.ExternalTable.get(table_name) if table.names() != fields: @@ -131,13 +168,10 @@ def init_table(): table = probing.ExternalTable( table_name, fields, + discard_threshold=ring_capacity, table_doc=table_doc, column_docs=column_docs or None, ) - if column_docs or table_doc: - probing.register_table_docs( - qualified_name, table_doc, column_docs or None - ) cache[cls] = table return table @@ -149,16 +183,18 @@ def _row(obj): @classmethod def append(cls, self): - table = cache[cls] + table = cls.init_table() table.append(_row(self)) @classmethod - def append_many(cls, self): - table = cache[cls] - table.append_many([_row(i) for i in self]) + def append_many(cls, instances): + table = cls.init_table() + table.append_many([_row(i) for i in instances]) @classmethod def take(cls, n): + if cls not in cache: + return [] table = cache[cls] return table.take(n) @@ -169,9 +205,7 @@ def drop(cls): probing.ExternalTable.drop(table_name) def save(self): - if cls not in cache: - cls.init_table() - cls.append(self) + type(self).append(self) setattr(cls, "init_table", init_table) setattr(cls, "append", append) @@ -179,7 +213,7 @@ def save(self): setattr(cls, "take", take) setattr(cls, "drop", drop) setattr(cls, "save", save) - init_table() + _register_docs() return cls diff --git a/python/probing/ext/__init__.py b/python/probing/ext/__init__.py index 8d664568..de567c7d 100644 --- a/python/probing/ext/__init__.py +++ b/python/probing/ext/__init__.py @@ -13,4 +13,6 @@ Submodules: - `ray`: Ray task and actor tracing. - `torch`: PyTorch profiling hooks and utilities. +- `megatron`: Megatron-LM role/step sync. +- `vllm`: vLLM / vLLM-Metal inference role/step sync. """ diff --git a/python/probing/ext/megatron.py b/python/probing/ext/megatron.py index 40c43ec9..7cd0d53c 100644 --- a/python/probing/ext/megatron.py +++ b/python/probing/ext/megatron.py @@ -236,6 +236,36 @@ def sync_step_from_megatron(*, force: bool = False) -> None: _LAST_ITERATION = iteration +def sync_step_from_iteration( + iteration: int, + *, + micro_batches: Optional[int] = None, + force: bool = False, +) -> None: + """Align probing step with a Megatron-Core style optimizer iteration counter.""" + global _LAST_ITERATION + if not step_sync_enabled(): + return + + value = _safe_int(iteration) + if value is None: + return + + mb = micro_batches + if mb is None: + mb = _read_num_microbatches() + if mb is not None: + probing.step(micro_batches=mb) + else: + mb = int(probing.step.snapshot().micro_batches) or 1 + + if not force and value == _LAST_ITERATION: + return + + probing.step(value * mb) + _LAST_ITERATION = value + + def _wrap_callable(module: Any, attr: str, wrapper_builder: Callable) -> None: original = getattr(module, attr, None) if original is None or getattr(original, "_probing_wrapped", False): diff --git a/python/probing/ext/torch.py b/python/probing/ext/torch.py index 46fc0648..60a66a29 100644 --- a/python/probing/ext/torch.py +++ b/python/probing/ext/torch.py @@ -87,6 +87,16 @@ def megatron_hook(): pass +def vllm_hook(): + """Autostart vLLM role/step sync when vLLM loads before torch hooks.""" + try: + from probing.ext.vllm import maybe_autostart + + maybe_autostart() + except Exception: + pass + + _hook_registered = False @@ -102,6 +112,7 @@ def init(): collective_hook() megatron_hook() + vllm_hook() try: from probing.crash import install diff --git a/python/probing/ext/vllm.py b/python/probing/ext/vllm.py new file mode 100644 index 00000000..226f26a7 --- /dev/null +++ b/python/probing/ext/vllm.py @@ -0,0 +1,269 @@ +"""vLLM / vLLM-Metal autostart integration for probing. + +When ``PROBING`` is active, probing registers import hooks on vLLM entry points and: + +* syncs ``probing.set_role`` from distributed env and tags ``backend=metal`` when + the macOS ``vllm-metal`` platform plugin is present +* wraps ``LLMEngine.step`` to align ``probing.step`` with scheduler iterations + +All hooks are best-effort and no-op when vLLM is absent or APIs differ across versions. +""" + +from __future__ import annotations + +import functools +import logging +import os +import sys +from typing import Any, Callable, Optional + +import probing + +from probing.util.env import FALSE_VALUES, TRUE_VALUES, parse_bool_flag + +logger = logging.getLogger(__name__) + +_METAL_INIT = False +_ENGINE_INIT_DONE: set[str] = set() +_LAST_ROLE: Optional[str] = None +_LAST_STEP: Optional[int] = None + +# vLLM-style env vars that indicate a vLLM job even before import. +_VLLM_ENV_MARKERS = ( + "VLLM_TARGET_DEVICE", + "VLLM_USE_V1", + "VLLM_WORKER_MULTIPROC_METHOD", + "VLLM_HOST_IP", + "VLLM_PORT", + "VLLM_LOGGING_LEVEL", + "VLLM_ATTENTION_BACKEND", +) + +# vLLM-Metal (macOS Apple Silicon) plugin markers. +_METAL_ENV_MARKERS = ( + "VLLM_METAL_USE_MLX", + "VLLM_MLX_DEVICE", + "VLLM_METAL_MEMORY_FRACTION", + "VLLM_METAL_BLOCK_SIZE", +) + +_ENGINE_MODULE_PATHS = ( + "vllm.v1.engine.llm_engine", + "vllm.engine.llm_engine", +) +_ENGINE_CLASS = "LLMEngine" +_ENGINE_STEP_METHOD = "step" + + +def _config_flag(name: str) -> Optional[bool]: + return parse_bool_flag(probing.config.get_str(name)) + + +def metal_backend_detected() -> bool: + if "vllm_metal" in sys.modules: + return True + return any(os.environ.get(key) for key in _METAL_ENV_MARKERS) + + +def vllm_job_detected() -> bool: + if any(os.environ.get(key) for key in _VLLM_ENV_MARKERS): + return True + if metal_backend_detected(): + return True + return any(name == "vllm" or name.startswith("vllm.") for name in sys.modules) + + +def vllm_autostart_enabled() -> bool: + explicit = _config_flag("probing.vllm.enable") + if explicit is not None: + return explicit + raw = os.environ.get("PROBING_VLLM", "auto").strip().lower() + if raw in FALSE_VALUES: + return False + if raw in TRUE_VALUES or raw == "on": + return True + return vllm_job_detected() + + +def step_sync_enabled() -> bool: + explicit = _config_flag("probing.vllm.step_sync") + if explicit is not None: + return explicit + raw = os.environ.get("PROBING_VLLM_STEP_SYNC", "auto").strip().lower() + if raw in FALSE_VALUES: + return False + if raw in TRUE_VALUES or raw == "on": + return True + return vllm_autostart_enabled() + + +def _safe_int(value: Any) -> Optional[int]: + if value is None: + return None + try: + parsed = int(value) + except (TypeError, ValueError): + return None + return parsed if parsed >= 0 else None + + +def sync_role_from_env() -> Optional[str]: + """Read vLLM / torchrun env and push parallel role into ``probing.set_role``.""" + global _LAST_ROLE + dims: dict[str, Any] = {} + + rank = _safe_int(os.environ.get("RANK") or os.environ.get("LOCAL_RANK")) + if rank is not None: + dims["rank"] = rank + + for name, keys in ( + ("tp", ("TENSOR_MODEL_PARALLEL_RANK", "TP_RANK")), + ("pp", ("PIPELINE_MODEL_PARALLEL_RANK", "PP_RANK")), + ("dp", ("DATA_PARALLEL_RANK", "DP_RANK")), + ): + for key in keys: + value = _safe_int(os.environ.get(key)) + if value is not None: + dims[name] = value + break + + if metal_backend_detected(): + dims["backend"] = "metal" + mlx_device = os.environ.get("VLLM_MLX_DEVICE", "").strip() + if mlx_device: + dims["mlx"] = mlx_device + + if not dims: + return None + + role = probing.set_role(dims) + if role and role != _LAST_ROLE: + logger.info("vLLM parallel role synced: %s", role) + _LAST_ROLE = role + return role + + +def _read_engine_step_counter(engine: Any) -> Optional[int]: + for attr in ( + "step_counter", + "_step_counter", + "current_iteration", + "iteration", + ): + value = _safe_int(getattr(engine, attr, None)) + if value is not None: + return value + return None + + +def sync_step_from_engine(engine: Any | None = None, *, force: bool = False) -> None: + """Align probing step coordinates with vLLM engine scheduler steps.""" + global _LAST_STEP + if not step_sync_enabled(): + return + + if engine is None: + probing.step() + return + + counter = _read_engine_step_counter(engine) + if counter is None: + probing.step() + return + if not force and counter == _LAST_STEP: + return + + probing.step(counter) + _LAST_STEP = counter + + +def sync_step_from_llm(llm: Any | None = None, *, force: bool = False) -> None: + """Best-effort step sync from an offline ``vLLM.LLM`` instance.""" + if llm is None: + sync_step_from_engine(None, force=force) + return + for attr in ("llm_engine", "engine", "engine_core"): + engine = getattr(llm, attr, None) + if engine is not None: + sync_step_from_engine(engine, force=force) + return + sync_step_from_engine(None, force=force) + + +def _wrap_callable(owner: Any, attr: str, wrapper_builder: Callable) -> None: + original = getattr(owner, attr, None) + if original is None or getattr(original, "_probing_wrapped", False): + return + + wrapped = wrapper_builder(original) + wrapped._probing_wrapped = True # type: ignore[attr-defined] + setattr(owner, attr, wrapped) + + +def _wrap_engine_step(engine_cls: Any) -> None: + def builder(original): + @functools.wraps(original) + def wrapped(self, *args, **kwargs): + result = original(self, *args, **kwargs) + sync_step_from_engine(self, force=True) + sync_role_from_env() + return result + + return wrapped + + _wrap_callable(engine_cls, _ENGINE_STEP_METHOD, builder) + + +def init_metal_platform() -> None: + """Import-hook entry when ``vllm_metal`` loads (macOS Metal plugin).""" + global _METAL_INIT + if _METAL_INIT or not vllm_autostart_enabled(): + return + _METAL_INIT = True + sync_role_from_env() + + +def init_engine(module_path: str) -> None: + """Import-hook entry when a vLLM ``LLMEngine`` module loads.""" + if module_path in _ENGINE_INIT_DONE or not vllm_autostart_enabled(): + return + _ENGINE_INIT_DONE.add(module_path) + + mod = sys.modules.get(module_path) + if mod is None: + return + + engine_cls = getattr(mod, _ENGINE_CLASS, None) + if engine_cls is None: + return + + sync_role_from_env() + if step_sync_enabled(): + _wrap_engine_step(engine_cls) + + +def init_v1_engine() -> None: + init_engine("vllm.v1.engine.llm_engine") + + +def init_classic_engine() -> None: + init_engine("vllm.engine.llm_engine") + + +def maybe_autostart() -> None: + """Best-effort autostart when vLLM was imported before probing hooks.""" + if not vllm_autostart_enabled(): + return + + if "vllm_metal" in sys.modules: + init_metal_platform() + for module_path in _ENGINE_MODULE_PATHS: + if module_path in sys.modules: + init_engine(module_path) + if vllm_job_detected(): + sync_role_from_env() + + +def init() -> None: + """Generic init alias — runs pending autostart if modules are already loaded.""" + maybe_autostart() diff --git a/python/probing/hooks/import_hook.py b/python/probing/hooks/import_hook.py index 759a3e6c..e3b06566 100644 --- a/python/probing/hooks/import_hook.py +++ b/python/probing/hooks/import_hook.py @@ -52,20 +52,64 @@ def _get_megatron_training_init(): return lambda: None +def _get_vllm_metal_init(): + try: + from probing.ext.vllm import init_metal_platform + + return init_metal_platform + except ImportError: + return lambda: None + + +def _get_vllm_v1_engine_init(): + try: + from probing.ext.vllm import init_v1_engine + + return init_v1_engine + except ImportError: + return lambda: None + + +def _get_vllm_classic_engine_init(): + try: + from probing.ext.vllm import init_classic_engine + + return init_classic_engine + except ImportError: + return lambda: None + + # Mapping from module names to callback functions # Callbacks are called when the module is imported # Use lazy loading to avoid import errors -register = { - "torch": _get_torch_init(), - "ray": _get_ray_init(), - "megatron.core.parallel_state": _get_megatron_parallel_state_init(), - "megatron.training.training": _get_megatron_training_init(), -} + + +def _default_register() -> dict: + return { + "torch": _get_torch_init(), + "ray": _get_ray_init(), + "megatron.core.parallel_state": _get_megatron_parallel_state_init(), + "megatron.training.training": _get_megatron_training_init(), + "vllm_metal": _get_vllm_metal_init(), + "vllm.v1.engine.llm_engine": _get_vllm_v1_engine_init(), + "vllm.engine.llm_engine": _get_vllm_classic_engine_init(), + } + + +register = _default_register() # Record modules that have been triggered triggered = {} +def reset_register(*, clear_triggered: bool = True) -> None: + """Restore built-in import hooks after tests mutate ``register``.""" + register.clear() + register.update(_default_register()) + if clear_triggered: + triggered.clear() + + class ProbingLoader(importlib.abc.Loader): """Custom loader that executes callbacks immediately after module loading""" diff --git a/python/probing/profiling/torch_probe.py b/python/probing/profiling/torch_probe.py index 4b947b7a..c1f1e274 100644 --- a/python/probing/profiling/torch_probe.py +++ b/python/probing/profiling/torch_probe.py @@ -1,6 +1,9 @@ import hashlib import logging +import os +import statistics import time +from collections import deque from dataclasses import dataclass from typing import Any, Optional @@ -53,6 +56,69 @@ def _is_float(token: str) -> bool: # kernels it brackets are complete and ``elapsed_time`` is a free cached read # rather than a blocking commit against the live stream. _DEFER_MIN_SETTLE = 3 +# Rolling window for adaptive sample-rate feedback (matches Web overhead panel). +_ADAPTIVE_WINDOW = 80 +_MIN_SHADOW_SAMPLES = 5 +_MIN_DISPATCH_SAMPLES = 16 +_DEFAULT_OVERHEAD_TARGET_PCT = 5.0 +_DEFAULT_OVERHEAD_HIGH_PCT = 10.0 +_DEFAULT_RATE_FLOOR = 0.01 + + +class _AdaptiveRateController: + """Closed-loop controller: shadow-step medians → adjust ``rate``.""" + + def __init__( + self, + *, + enabled: bool, + initial_rate: float, + rate_floor: float, + target_pct: float, + high_pct: float, + ) -> None: + self.enabled = enabled + self._initial_rate = initial_rate + self._rate_floor = rate_floor + self._target_pct = target_pct + self._high_pct = high_pct + self._window: deque[tuple[float, bool, bool]] = deque(maxlen=_ADAPTIVE_WINDOW) + + def record(self, duration_sec: float, *, is_shadow: bool, sampled: bool) -> None: + self._window.append((duration_sec, is_shadow, sampled)) + + def _dispatch_overhead_pct(self) -> Optional[float]: + shadows = [d for d, sh, _ in self._window if sh] + dispatch = [d for d, sh, sa in self._window if not sh and not sa] + if len(shadows) < _MIN_SHADOW_SAMPLES or len(dispatch) < _MIN_DISPATCH_SAMPLES: + return None + shadow_med = statistics.median(shadows) + dispatch_med = statistics.median(dispatch) + if shadow_med <= 0: + return None + return (dispatch_med / shadow_med - 1.0) * 100.0 + + def maybe_adjust(self, tracer: "TorchProbe") -> None: + if not self.enabled: + return + pct = self._dispatch_overhead_pct() + if pct is None: + return + current = tracer.rate + new_rate = current + if pct > self._high_pct: + new_rate = max(self._rate_floor, current * 0.5) + elif pct < self._target_pct and current < self._initial_rate: + new_rate = min(self._initial_rate, current * 1.25) + if abs(new_rate - current) < 1e-9: + return + tracer.set_sampling_mode(str(new_rate)) + logger.debug( + "adaptive sample rate %.4f -> %.4f (dispatch overhead %.1f%%)", + current, + new_rate, + pct, + ) def shadow_step_in_cycle( @@ -116,7 +182,13 @@ def torch_backend(): return _backend -@table +# Per-table mmap ring budgets (bytes). High-volume trace tables use larger windows. +_TORCH_TRACE_CAPACITY_BYTES = 8 * 1024 * 1024 +_TORCH_STEP_TIMING_CAPACITY_BYTES = 2 * 1024 * 1024 +_VARIABLES_CAPACITY_BYTES = 4 * 1024 * 1024 + + +@table(capacity_bytes=_TORCH_TRACE_CAPACITY_BYTES) @dataclass class TorchTrace: micro_step: Optional[int] = None @@ -140,7 +212,7 @@ class TorchTrace: role: str = "" -@table +@table(capacity_bytes=_TORCH_STEP_TIMING_CAPACITY_BYTES) @dataclass class TorchStepTiming: """Per-step wall-clock timing for TorchProbe overhead monitoring.""" @@ -161,7 +233,7 @@ class TorchStepTiming: sample_mode: str = "random" -@table +@table(capacity_bytes=_VARIABLES_CAPACITY_BYTES) @dataclass class Variables: micro_step: Optional[int] = None @@ -252,6 +324,10 @@ class TorchProbeConfig: exprs: str = "" shadow_normal: int = DEFAULT_SHADOW_NORMAL shadow_baseline: int = DEFAULT_SHADOW_BASELINE + adaptive_rate: bool = False + overhead_target_pct: float = _DEFAULT_OVERHEAD_TARGET_PCT + overhead_high_pct: float = _DEFAULT_OVERHEAD_HIGH_PCT + rate_floor: float = _DEFAULT_RATE_FLOOR @property def shadow_enabled(self) -> bool: @@ -351,6 +427,29 @@ def parse(cls, raw: Optional[str]) -> "TorchProbeConfig": cfg.exprs = value elif key == "shadow": cfg.apply_shadow_spec(value) + elif key == "adaptive": + cfg.adaptive_rate = value.lower() in TRUE_VALUES + + env_adaptive = os.environ.get("PROBING_TORCH_ADAPTIVE_RATE", "").strip().lower() + if env_adaptive in TRUE_VALUES: + cfg.adaptive_rate = True + elif env_adaptive in FALSE_VALUES: + cfg.adaptive_rate = False + + for env_key, attr, cast in ( + ("PROBING_TORCH_OVERHEAD_TARGET_PCT", "overhead_target_pct", float), + ("PROBING_TORCH_OVERHEAD_HIGH_PCT", "overhead_high_pct", float), + ("PROBING_TORCH_RATE_FLOOR", "rate_floor", float), + ): + raw = os.environ.get(env_key, "").strip() + if not raw: + continue + try: + parsed = cast(raw) + except ValueError: + continue + if parsed > 0: + setattr(cfg, attr, parsed) return cfg @@ -472,6 +571,17 @@ def _sync_live_tracers(config: TorchProbeConfig) -> None: for obj in _live_torch_probes(): obj.config.backward = config.backward obj.config.trace_spans = config.trace_spans + obj.config.adaptive_rate = config.adaptive_rate + obj.config.overhead_target_pct = config.overhead_target_pct + obj.config.overhead_high_pct = config.overhead_high_pct + obj.config.rate_floor = config.rate_floor + obj._adaptive_controller.enabled = ( + config.adaptive_rate and config.shadow_enabled + ) + obj._adaptive_controller._initial_rate = config.rate + obj._adaptive_controller._rate_floor = config.rate_floor + obj._adaptive_controller._target_pct = config.overhead_target_pct + obj._adaptive_controller._high_pct = config.overhead_high_pct # Re-plan so a hot rate/layer_rate change takes effect next step. obj.rate = config.rate obj.layer_rate = config.layer_rate @@ -953,6 +1063,13 @@ def __init__(self, config: Optional[TorchProbeConfig] = None): # the role is constant within a step, so resolve it once per step (see # ``_mark_step_wall_start``) and reuse it for every stamped row. self._role_this_step: str = current_role() + self._adaptive_controller = _AdaptiveRateController( + enabled=config.adaptive_rate and config.shadow_enabled, + initial_rate=config.rate, + rate_floor=config.rate_floor, + target_pct=config.overhead_target_pct, + high_pct=config.overhead_high_pct, + ) super().__init__( tracepy=config.tracepy, @@ -997,6 +1114,11 @@ def _record_step_timing(self, *, is_shadow: bool) -> None: if self._step_wall_started_at is None: return duration = time.perf_counter() - self._step_wall_started_at + self._adaptive_controller.record( + duration, + is_shadow=is_shadow, + sampled=not is_shadow and self.sampled_step, + ) record = TorchStepTiming( step_duration_sec=duration, is_shadow=1 if is_shadow else 0, @@ -1478,6 +1600,8 @@ def _drain_deferred(self) -> None: def _close_step_wall(self, *, is_shadow: bool) -> None: """Record step wall time, then schedule deferred GPU trace persistence.""" self._record_step_timing(is_shadow=is_shadow) + if is_shadow: + self._adaptive_controller.maybe_adjust(self) self._drain_deferred() self._advance_step_cycle_for_next() self._mark_step_wall_start() diff --git a/tests/regression/core/test_table_docs.py b/tests/regression/core/test_table_docs.py index 98af4268..fe21b98d 100644 --- a/tests/regression/core/test_table_docs.py +++ b/tests/regression/core/test_table_docs.py @@ -72,6 +72,104 @@ class DecoratedMetrics: table_mod.cache.clear() +def test_table_decorator_defers_mmap_until_append(monkeypatch): + import importlib + + table_mod = importlib.import_module("probing.core.table") + table_mod.cache.clear() + table_name = f"lazy_mmap_{id(object())}" + + class FakeExternalTable: + created: list[str] = [] + + @staticmethod + def get(_name): + raise ValueError("missing") + + @staticmethod + def drop(_name): + return None + + def __init__(self, name, columns, **kwargs): + FakeExternalTable.created.append(name) + self._columns = columns + + def names(self): + return list(self._columns) + + def append(self, _row): + return None + + def take(self, _n): + return [] + + FakeExternalTable.created = [] + monkeypatch.setattr(probing, "ExternalTable", FakeExternalTable) + monkeypatch.setattr(probing, "register_table_docs", lambda *a, **k: None) + + @table_mod.table(table_name) + @dataclass + class LazyMetrics: + value: int = 0 + + assert FakeExternalTable.created == [] + LazyMetrics.append(LazyMetrics(1)) + assert FakeExternalTable.created == [table_name] + LazyMetrics.drop() + table_mod.cache.clear() + + +def test_table_capacity_bytes_override(monkeypatch): + import importlib + + table_mod = importlib.import_module("probing.core.table") + table_mod.cache.clear() + table_name = f"cap_table_{id(object())}" + captured: dict = {} + + class FakeExternalTable: + @staticmethod + def get(_name): + raise ValueError("missing") + + @staticmethod + def drop(_name): + return None + + def __init__(self, name, columns, **kwargs): + captured.update(kwargs) + self._columns = columns + + def names(self): + return list(self._columns) + + def append(self, _row): + return None + + monkeypatch.setattr(probing, "ExternalTable", FakeExternalTable) + monkeypatch.setattr(probing, "register_table_docs", lambda *a, **k: None) + + @table_mod.table(table_name, capacity_bytes=4 * 1024 * 1024) + @dataclass + class SizedMetrics: + value: int = 0 + + SizedMetrics.append(SizedMetrics(1)) + assert captured.get("discard_threshold") == 4 * 1024 * 1024 + SizedMetrics.drop() + table_mod.cache.clear() + + +def test_env_default_capacity_bytes(monkeypatch): + import importlib + + table_mod = importlib.import_module("probing.core.table") + monkeypatch.setenv("PROBING_TABLE_DEFAULT_MB", "8") + assert table_mod._resolve_capacity_bytes(None) == 8 * 1024 * 1024 + monkeypatch.delenv("PROBING_TABLE_DEFAULT_MB", raising=False) + assert table_mod._resolve_capacity_bytes(None) == 20 * 1024 * 1024 + + def test_builtin_hccl_docs_in_engine_catalog(): """HCCL code-first docs are baked into the semantic catalog at engine build.""" df = probing.query( diff --git a/tests/regression/ext/README.md b/tests/regression/ext/README.md new file mode 100644 index 00000000..6dbcc1c7 --- /dev/null +++ b/tests/regression/ext/README.md @@ -0,0 +1,44 @@ +# Framework extension tests (`tests/regression/ext/`) + +Contract + integration tests for Megatron-Core and vLLM / vLLM-Metal probing hooks. + +## Layout + +| Module | Layer | What it validates | +|--------|-------|-------------------| +| `_megatron_contract.py` | Helpers | Mock Megatron module tree (not collected) | +| `_vllm_contract.py` | Helpers | Mock vLLM module tree (not collected) | +| `test_megatron_contract.py` | Contract | Import hooks, role/step sync (mock, fast CI) | +| `test_vllm_contract.py` | Contract | Import hooks, role/step sync (mock, fast CI) | +| `test_megatron_integration.py` | Integration | Real `megatron.core` via `torchrun` subprocess | +| `test_vllm_integration.py` | Integration | Real `vllm` import hook + optional generate smoke | +| `megatron_integration_worker.py` | Worker | Subprocess entry for Megatron integration | +| `vllm_integration_worker.py` | Worker | Subprocess entry for vLLM integration | + +Shared fixtures: `conftest.py` (resets ext state + `probing.step` between tests). + +## Run + +```bash +# CI / default regression (contract tests only need probing._core) +make test-python-regression + +# Contract only (fast) +PROBING=1 pytest tests/regression/ext/test_vllm_contract.py \ + tests/regression/ext/test_megatron_contract.py -q + +# Integration (skipped when framework not installed) +PROBING=1 pytest -m integration tests/regression/ext/test_vllm_integration.py -q +PROBING=1 pytest -m integration tests/regression/ext/test_megatron_integration.py -q + +# Real vLLM generate smoke (opt-in; aligns with examples/run_vllm_soak.sh) +PROBING_VLLM_RUN_GENERATE=1 PROBING=1 pytest \ + tests/regression/ext/test_vllm_integration.py::test_vllm_offline_generate_smoke_subprocess -q +``` + +## Notes + +- **Contract tests** never import real `megatron.core` or `vllm`; they mock `sys.modules`. +- **Megatron integration** requires Linux + CUDA + `megatron-core`; skipped on macOS. +- **vLLM generate integration** is opt-in (`PROBING_VLLM_RUN_GENERATE=1`) because it is slow and + depends on aligned vllm / vllm-metal / mlx-lm versions. Import-hook wiring runs without that flag. diff --git a/tests/regression/ext/_megatron_contract.py b/tests/regression/ext/_megatron_contract.py new file mode 100644 index 00000000..53c16f58 --- /dev/null +++ b/tests/regression/ext/_megatron_contract.py @@ -0,0 +1,85 @@ +"""Shared Megatron mock helpers for contract tests (not collected by pytest).""" + +from __future__ import annotations + +import sys +import types +from contextlib import contextmanager +from types import SimpleNamespace +from unittest import mock + +MEGATRON_HOOK_MODULES = ( + "megatron.core.parallel_state", + "megatron.training.training", +) + + +def make_parallel_state( + *, + initialized: bool = True, + tp: int = 2, + pp: int = 1, + dp: int = 3, +) -> types.ModuleType: + ps = types.ModuleType("megatron.core.parallel_state") + + def model_parallel_is_initialized() -> bool: + return initialized + + ps.model_parallel_is_initialized = model_parallel_is_initialized + ps.get_tensor_model_parallel_rank = lambda: tp + ps.get_pipeline_model_parallel_rank = lambda: pp + ps.get_data_parallel_rank = lambda: dp + ps.initialize_model_parallel = lambda *args, **kwargs: None + return ps + + +def install_megatron_stack( + *, + ps: types.ModuleType, + iteration: int = 42, + micro_batches: int = 4, +) -> dict[str, types.ModuleType]: + training_mod = types.ModuleType("megatron.training.training") + train_calls: list[int] = [] + + def train_step(*args, **kwargs): + train_calls.append(1) + return {"loss": 1.0} + + training_mod.train_step = train_step + training_mod._probing_train_calls = train_calls # type: ignore[attr-defined] + + global_vars = types.ModuleType("megatron.training.global_vars") + args_obj = SimpleNamespace(iteration=iteration) + global_vars.get_args = lambda: args_obj + global_vars._probing_args = args_obj # type: ignore[attr-defined] + + num_calc = types.ModuleType("megatron.core.num_microbatches_calculator") + num_calc.get_num_microbatches = lambda: micro_batches + + core = types.ModuleType("megatron.core") + core.parallel_state = ps + core.num_microbatches_calculator = num_calc + training_pkg = types.ModuleType("megatron.training") + training_pkg.training = training_mod + training_pkg.global_vars = global_vars + megatron = types.ModuleType("megatron") + megatron.core = core + megatron.training = training_pkg + + return { + "megatron": megatron, + "megatron.core": core, + "megatron.core.parallel_state": ps, + "megatron.core.num_microbatches_calculator": num_calc, + "megatron.training": training_pkg, + "megatron.training.training": training_mod, + "megatron.training.global_vars": global_vars, + } + + +@contextmanager +def megatron_modules(modules: dict[str, types.ModuleType]): + with mock.patch.dict(sys.modules, modules): + yield modules diff --git a/tests/regression/ext/_vllm_contract.py b/tests/regression/ext/_vllm_contract.py new file mode 100644 index 00000000..f8ed04aa --- /dev/null +++ b/tests/regression/ext/_vllm_contract.py @@ -0,0 +1,74 @@ +"""Shared vLLM mock helpers for contract tests (not collected by pytest).""" + +from __future__ import annotations + +import sys +import types +from contextlib import contextmanager +from unittest import mock + +VLLM_HOOK_MODULES = ( + "vllm_metal", + "vllm.engine.llm_engine", + "vllm.v1.engine.llm_engine", +) + + +def make_llm_engine_class(*, initial_step: int = 0) -> type: + class LLMEngine: + def __init__(self) -> None: + self.step_counter = initial_step + + def step(self): + self.step_counter += 1 + return [] + + return LLMEngine + + +def install_vllm_stack( + *, + engine_module: str = "vllm.v1.engine.llm_engine", + initial_step: int = 0, + with_metal: bool = True, +) -> dict[str, types.ModuleType]: + engine_mod = types.ModuleType(engine_module) + engine_cls = make_llm_engine_class(initial_step=initial_step) + engine_mod.LLMEngine = engine_cls + + v1_engine_pkg = types.ModuleType("vllm.v1.engine") + v1_engine_pkg.llm_engine = engine_mod + v1_pkg = types.ModuleType("vllm.v1") + v1_pkg.engine = v1_engine_pkg + + classic_engine_mod = types.ModuleType("vllm.engine.llm_engine") + classic_engine_mod.LLMEngine = make_llm_engine_class(initial_step=initial_step) + + engine_pkg = types.ModuleType("vllm.engine") + engine_pkg.llm_engine = classic_engine_mod + + vllm = types.ModuleType("vllm") + vllm.v1 = v1_pkg + vllm.engine = engine_pkg + + modules: dict[str, types.ModuleType] = { + "vllm": vllm, + "vllm.v1": v1_pkg, + "vllm.v1.engine": v1_engine_pkg, + "vllm.engine": engine_pkg, + "vllm.engine.llm_engine": classic_engine_mod, + engine_module: engine_mod, + } + + if with_metal: + metal_mod = types.ModuleType("vllm_metal") + metal_mod.register = lambda: "vllm_metal.platform.MetalPlatform" + modules["vllm_metal"] = metal_mod + + return modules + + +@contextmanager +def vllm_modules(modules: dict[str, types.ModuleType]): + with mock.patch.dict(sys.modules, modules): + yield modules diff --git a/tests/regression/ext/conftest.py b/tests/regression/ext/conftest.py new file mode 100644 index 00000000..79923799 --- /dev/null +++ b/tests/regression/ext/conftest.py @@ -0,0 +1,84 @@ +"""Fixtures for framework extension tests under ``tests/regression/ext/``.""" + +from __future__ import annotations + +import sys + +import pytest + +import probing +from probing.ext import megatron as megatron_ext +from probing.ext import vllm as vllm_ext + +# Subprocess workers + mock helpers are not tests; --doctest-modules still imports +# every .py under testpaths unless ignored here. +collect_ignore = [ + "megatron_integration_worker.py", + "vllm_integration_worker.py", + "_megatron_contract.py", + "_vllm_contract.py", +] + + +@pytest.fixture(autouse=True) +def _restore_import_hook_register(): + from probing.hooks import import_hook + + import_hook.reset_register() + yield + import_hook.reset_register() + + +@pytest.fixture(autouse=True) +def _reset_megatron_ext_state(): + megatron_ext._PARALLEL_STATE_INIT = False + megatron_ext._TRAINING_INIT = False + megatron_ext._LAST_ROLE = None + megatron_ext._LAST_ITERATION = None + yield + for key in list(sys.modules): + if key == "megatron" or key.startswith("megatron."): + del sys.modules[key] + + +@pytest.fixture(autouse=True) +def _reset_vllm_ext_state(): + vllm_ext._METAL_INIT = False + vllm_ext._ENGINE_INIT_DONE.clear() + vllm_ext._LAST_ROLE = None + vllm_ext._LAST_STEP = None + yield + for key in list(sys.modules): + if key == "vllm" or key.startswith("vllm.") or key == "vllm_metal": + del sys.modules[key] + + +@pytest.fixture(autouse=True) +def _reset_probing_role(): + probing.clear_role() + yield + probing.clear_role() + + +@pytest.fixture(autouse=True) +def _reset_step_coordinates(): + """Isolate step coordinates across contract tests (Megatron + vLLM share globals).""" + probing.step(0) + megatron_ext._LAST_ITERATION = None + vllm_ext._LAST_STEP = None + yield + probing.step(0) + megatron_ext._LAST_ITERATION = None + vllm_ext._LAST_STEP = None + + +@pytest.fixture +def megatron_env(monkeypatch): + monkeypatch.setenv("PROBING_MEGATRON", "on") + monkeypatch.setenv("PROBING_MEGATRON_STEP_SYNC", "on") + + +@pytest.fixture +def vllm_env(monkeypatch): + monkeypatch.setenv("PROBING_VLLM", "on") + monkeypatch.setenv("PROBING_VLLM_STEP_SYNC", "on") diff --git a/tests/regression/ext/megatron_integration_worker.py b/tests/regression/ext/megatron_integration_worker.py new file mode 100644 index 00000000..3d28c6aa --- /dev/null +++ b/tests/regression/ext/megatron_integration_worker.py @@ -0,0 +1,69 @@ +"""Subprocess worker for Megatron-Core integration tests (``torchrun`` nproc=1). + +Run via:: + + python -m torch.distributed.run --standalone --nproc_per_node=1 \\ + tests/regression/ext/megatron_integration_worker.py + +Imports are deferred to ``main()`` so pytest ``--doctest-modules`` does not pull +in ``megatron.core`` at collection time. +""" + +from __future__ import annotations + +import json +import os +import sys + + +def main() -> int: + import torch + from megatron.core import parallel_state + from megatron.core.tensor_parallel.random import model_parallel_cuda_manual_seed + + import probing + from probing.ext.megatron import ( + maybe_autostart, + sync_role_from_parallel_state, + sync_step_from_iteration, + ) + + os.environ.setdefault("PROBING", "1") + os.environ.setdefault("PROBING_MEGATRON", "on") + os.environ.setdefault("PROBING_MEGATRON_STEP_SYNC", "on") + + if not torch.cuda.is_available(): + print(json.dumps({"error": "cuda_unavailable"})) + return 2 + + local_rank = int(os.environ.get("LOCAL_RANK", "0")) + torch.cuda.set_device(local_rank) + torch.distributed.init_process_group(backend="nccl") + + parallel_state.initialize_model_parallel(1, 1) + model_parallel_cuda_manual_seed(123) + + maybe_autostart() + role = sync_role_from_parallel_state() + sync_step_from_iteration(3, micro_batches=2, force=True) + + snap = probing.step.snapshot() + print( + json.dumps( + { + "role": probing.current_role(), + "sync_role": role, + "local_step": int(snap.local_step), + "micro_step": int(snap.micro_step), + "micro_batches": int(snap.micro_batches), + } + ) + ) + + parallel_state.destroy_model_parallel() + torch.distributed.destroy_process_group() + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/regression/ext/test_megatron_contract.py b/tests/regression/ext/test_megatron_contract.py new file mode 100644 index 00000000..6d0e6920 --- /dev/null +++ b/tests/regression/ext/test_megatron_contract.py @@ -0,0 +1,167 @@ +"""Megatron contract tests (mocked modules, fast CI). + +Validates import-hook wiring and role/step sync against the in-process probing +engine path without requiring ``megatron-core``. +""" + +from __future__ import annotations + +import sys +import types +from unittest import mock + +import pytest + +import probing +from probing.ext import megatron as megatron_ext +from probing.hooks import import_hook + +from ._megatron_contract import ( + MEGATRON_HOOK_MODULES, + install_megatron_stack, + make_parallel_state, + megatron_modules, +) + + +def test_import_hook_registers_megatron_callbacks(): + for name in MEGATRON_HOOK_MODULES: + assert name in import_hook.register, f"missing import hook for {name}" + assert callable(import_hook.register[name]) + + +def test_megatron_usability_end_to_end(megatron_env, monkeypatch): + monkeypatch.setenv("TENSOR_MODEL_PARALLEL_RANK", "2") + monkeypatch.setenv("PIPELINE_MODEL_PARALLEL_RANK", "1") + monkeypatch.setenv("DATA_PARALLEL_RANK", "3") + + ps = make_parallel_state(tp=2, pp=1, dp=3) + modules = install_megatron_stack(ps=ps, iteration=10, micro_batches=4) + training_mod = modules["megatron.training.training"] + args_obj = modules["megatron.training.global_vars"]._probing_args # type: ignore[attr-defined] + + with megatron_modules(modules): + assert megatron_ext.megatron_autostart_enabled() + + megatron_ext.init_parallel_state() + assert probing.current_role() == "dp=3,pp=1,tp=2" + + megatron_ext.init_training() + assert getattr(training_mod.train_step, "_probing_wrapped", False) + + training_mod.train_step() + assert training_mod._probing_train_calls == [1] # type: ignore[attr-defined] + assert probing.step.local_step == 10 + assert int(probing.step.snapshot().micro_batches) == 4 + + args_obj.iteration = 11 + training_mod.train_step() + assert probing.step.local_step == 11 + + from probing.tracing.coordinates import row_fields + + fields = row_fields() + assert fields["local_step"] == 11 + assert fields["micro_batches"] == 4 + + +def test_maybe_autostart_when_megatron_loaded_first(megatron_env): + ps = make_parallel_state(tp=1, pp=0, dp=7) + modules = install_megatron_stack(ps=ps, iteration=5, micro_batches=2) + + with megatron_modules(modules): + sys.modules["megatron.core.parallel_state"] = ps + sys.modules["megatron.training.training"] = modules[ + "megatron.training.training" + ] + + megatron_ext.maybe_autostart() + + assert probing.current_role() == "dp=7,pp=0,tp=1" + training_mod = modules["megatron.training.training"] + assert getattr(training_mod.train_step, "_probing_wrapped", False) + + +def test_megatron_job_detected_from_env(monkeypatch): + monkeypatch.setenv("TENSOR_MODEL_PARALLEL_RANK", "0") + assert megatron_ext.megatron_job_detected() + + +def test_sync_role_from_parallel_state(megatron_env): + ps = make_parallel_state(tp=2, pp=1, dp=3) + role = megatron_ext.sync_role_from_parallel_state(ps) + assert role == "dp=3,pp=1,tp=2" + assert probing.current_role() == "dp=3,pp=1,tp=2" + + +def test_init_parallel_state_wraps_initialize(megatron_env, monkeypatch): + ps = make_parallel_state(tp=0, pp=0, dp=1) + core = types.ModuleType("megatron.core") + core.parallel_state = ps + megatron = types.ModuleType("megatron") + megatron.core = core + monkeypatch.setitem(sys.modules, "megatron", megatron) + monkeypatch.setitem(sys.modules, "megatron.core", core) + monkeypatch.setitem(sys.modules, "megatron.core.parallel_state", ps) + + with mock.patch.dict("sys.modules", {"megatron.core.parallel_state": ps}): + megatron_ext.init_parallel_state() + ps.initialize_model_parallel() + assert probing.current_role() == "dp=1,pp=0,tp=0" + + +def test_train_step_wrap_syncs_iteration(megatron_env): + ps = make_parallel_state() + training_mod = types.ModuleType("megatron.training.training") + calls: list[int] = [] + + def train_step(*args, **kwargs): + calls.append(1) + return {"loss": 1.0} + + training_mod.train_step = train_step + + global_vars = types.ModuleType("megatron.training.global_vars") + args_obj = types.SimpleNamespace(iteration=42) + global_vars.get_args = lambda: args_obj + + num_calc = types.ModuleType("megatron.core.num_microbatches_calculator") + num_calc.get_num_microbatches = lambda: 4 + + core = types.ModuleType("megatron.core") + core.parallel_state = ps + core.num_microbatches_calculator = num_calc + training_pkg = types.ModuleType("megatron.training") + training_pkg.training = training_mod + training_pkg.global_vars = global_vars + megatron = types.ModuleType("megatron") + megatron.core = core + megatron.training = training_pkg + + modules = { + "megatron": megatron, + "megatron.core": core, + "megatron.core.parallel_state": ps, + "megatron.core.num_microbatches_calculator": num_calc, + "megatron.training": training_pkg, + "megatron.training.training": training_mod, + "megatron.training.global_vars": global_vars, + } + with mock.patch.dict(sys.modules, modules): + megatron_ext.init_training() + training_mod.train_step() + assert calls == [1] + assert probing.step.local_step == 42 + assert int(probing.step.snapshot().micro_batches) == 4 + + +def test_sync_step_from_iteration(megatron_env): + megatron_ext.sync_step_from_iteration(7, micro_batches=4, force=True) + assert probing.step.local_step == 7 + assert probing.step.micro_step == 28 + + +def test_megatron_disabled_by_env(monkeypatch): + monkeypatch.setenv("PROBING_MEGATRON", "off") + monkeypatch.setenv("TENSOR_MODEL_PARALLEL_RANK", "0") + assert not megatron_ext.megatron_autostart_enabled() diff --git a/tests/regression/ext/test_megatron_integration.py b/tests/regression/ext/test_megatron_integration.py new file mode 100644 index 00000000..f2ed5a99 --- /dev/null +++ b/tests/regression/ext/test_megatron_integration.py @@ -0,0 +1,76 @@ +"""Megatron-Core integration tests (real ``megatron.core``, CUDA required). + +Contract coverage lives in ``test_megatron_contract.py``. These tests run in a +subprocess via ``torchrun`` so distributed init does not leak into pytest. +""" + +from __future__ import annotations + +import json +import os +import subprocess +import sys +from pathlib import Path + +import pytest + +torch = pytest.importorskip("torch") + +pytestmark = [ + pytest.mark.integration, + pytest.mark.slow, + pytest.mark.skipif(not torch.cuda.is_available(), reason="requires a CUDA device"), +] + +_WORKER = Path(__file__).with_name("megatron_integration_worker.py") +_REPO_ROOT = _WORKER.parents[3] + + +def _megatron_core_available() -> bool: + try: + import megatron.core # noqa: F401 + + return True + except ImportError: + return False + + +@pytest.mark.skipif( + not _megatron_core_available(), reason="megatron-core not installed" +) +def test_megatron_core_parallel_state_and_step_sync(): + env = { + **dict(os.environ), + "PROBING": "1", + "PROBING_MEGATRON": "on", + "PROBING_MEGATRON_STEP_SYNC": "on", + "MASTER_ADDR": "127.0.0.1", + "MASTER_PORT": "29593", + } + cmd = [ + sys.executable, + "-m", + "torch.distributed.run", + "--standalone", + "--nproc_per_node=1", + str(_WORKER), + ] + proc = subprocess.run( + cmd, + env=env, + capture_output=True, + text=True, + timeout=180, + cwd=_REPO_ROOT, + ) + assert proc.returncode == 0, proc.stderr or proc.stdout + + lines = [line for line in proc.stdout.splitlines() if line.strip().startswith("{")] + assert lines, f"no JSON payload in stdout:\n{proc.stdout}\n{proc.stderr}" + payload = json.loads(lines[-1]) + + assert payload.get("sync_role") + assert "tp=" in payload["role"] + assert payload["local_step"] == 3 + assert payload["micro_step"] == 6 + assert payload["micro_batches"] == 2 diff --git a/tests/regression/ext/test_vllm_contract.py b/tests/regression/ext/test_vllm_contract.py new file mode 100644 index 00000000..c4e471d3 --- /dev/null +++ b/tests/regression/ext/test_vllm_contract.py @@ -0,0 +1,143 @@ +"""vLLM contract tests (mocked modules, fast CI). + +Validates import-hook wiring and role/step sync without requiring a real vLLM +install or GPU/Metal backend. +""" + +from __future__ import annotations + +import sys +import types + +import pytest + +import probing +from probing.ext import vllm as vllm_ext +from probing.hooks import import_hook + +from ._vllm_contract import ( + VLLM_HOOK_MODULES, + install_vllm_stack, + make_llm_engine_class, + vllm_modules, +) + + +def test_import_hook_registers_vllm_callbacks(): + for name in VLLM_HOOK_MODULES: + assert name in import_hook.register, f"missing import hook for {name}" + assert callable(import_hook.register[name]) + + +def test_vllm_usability_end_to_end(vllm_env, monkeypatch): + monkeypatch.setenv("RANK", "2") + monkeypatch.setenv("TENSOR_MODEL_PARALLEL_RANK", "1") + monkeypatch.setenv("VLLM_MLX_DEVICE", "gpu") + + modules = install_vllm_stack(engine_module="vllm.v1.engine.llm_engine") + engine_mod = modules["vllm.v1.engine.llm_engine"] + engine_cls = engine_mod.LLMEngine + + with vllm_modules(modules): + assert vllm_ext.vllm_autostart_enabled() + assert vllm_ext.metal_backend_detected() + + vllm_ext.init_metal_platform() + assert probing.current_role() == "backend=metal,mlx=gpu,rank=2,tp=1" + + vllm_ext.init_v1_engine() + assert getattr(engine_cls.step, "_probing_wrapped", False) + + engine = engine_cls() + engine.step() + assert engine.step_counter == 1 + assert probing.step.local_step == 1 + + engine.step() + assert probing.step.local_step == 2 + + from probing.tracing.coordinates import row_fields + + fields = row_fields() + assert fields["local_step"] == 2 + + +def test_maybe_autostart_when_vllm_loaded_first(vllm_env, monkeypatch): + monkeypatch.setenv("LOCAL_RANK", "0") + monkeypatch.setenv("VLLM_METAL_USE_MLX", "1") + + modules = install_vllm_stack(engine_module="vllm.engine.llm_engine") + engine_mod = modules["vllm.engine.llm_engine"] + engine_cls = engine_mod.LLMEngine + + with vllm_modules(modules): + sys.modules["vllm_metal"] = modules["vllm_metal"] + sys.modules["vllm.engine.llm_engine"] = engine_mod + + vllm_ext.maybe_autostart() + + assert probing.current_role() == "backend=metal,rank=0" + assert getattr(engine_cls.step, "_probing_wrapped", False) + + +def test_vllm_job_detected_from_env(monkeypatch): + monkeypatch.setenv("VLLM_USE_V1", "1") + assert vllm_ext.vllm_job_detected() + + +def test_metal_backend_detected_from_env(monkeypatch): + monkeypatch.setenv("VLLM_MLX_DEVICE", "gpu") + assert vllm_ext.metal_backend_detected() + + +def test_sync_role_from_env(vllm_env, monkeypatch): + monkeypatch.setenv("RANK", "3") + monkeypatch.setenv("DATA_PARALLEL_RANK", "1") + monkeypatch.setenv("VLLM_MLX_DEVICE", "cpu") + + role = vllm_ext.sync_role_from_env() + assert role == "backend=metal,dp=1,mlx=cpu,rank=3" + assert probing.current_role() == "backend=metal,dp=1,mlx=cpu,rank=3" + + +def test_engine_step_wrap_syncs_counter(vllm_env): + engine_mod = types.ModuleType("vllm.v1.engine.llm_engine") + engine_cls = make_llm_engine_class(initial_step=10) + engine_mod.LLMEngine = engine_cls + + v1_engine_pkg = types.ModuleType("vllm.v1.engine") + v1_engine_pkg.llm_engine = engine_mod + v1_pkg = types.ModuleType("vllm.v1") + v1_pkg.engine = v1_engine_pkg + vllm = types.ModuleType("vllm") + vllm.v1 = v1_pkg + + modules = { + "vllm": vllm, + "vllm.v1": v1_pkg, + "vllm.v1.engine": v1_engine_pkg, + "vllm.v1.engine.llm_engine": engine_mod, + } + with vllm_modules(modules): + vllm_ext.init_v1_engine() + engine = engine_cls() + engine.step() + assert engine.step_counter == 11 + assert probing.step.local_step == 11 + + +def test_sync_step_from_llm(vllm_env): + class _Engine: + step_counter = 9 + + class _LLM: + llm_engine = _Engine() + + vllm_ext.sync_step_from_llm(_LLM(), force=True) + assert probing.step.local_step == 9 + + +def test_vllm_disabled_by_env(monkeypatch): + monkeypatch.setenv("PROBING_VLLM", "off") + monkeypatch.setenv("VLLM_USE_V1", "1") + assert not vllm_ext.vllm_autostart_enabled() diff --git a/tests/regression/ext/test_vllm_integration.py b/tests/regression/ext/test_vllm_integration.py new file mode 100644 index 00000000..bafde22a --- /dev/null +++ b/tests/regression/ext/test_vllm_integration.py @@ -0,0 +1,104 @@ +"""vLLM integration tests (real ``vllm`` install when present). + +Contract coverage lives in ``test_vllm_contract.py``. The worker runs in a +subprocess to avoid mutating global ``probing.step`` in the pytest process. +""" + +from __future__ import annotations + +import json +import os +import subprocess +import sys +from pathlib import Path + +import pytest + +pytestmark = [ + pytest.mark.integration, + pytest.mark.slow, +] + +_WORKER = Path(__file__).with_name("vllm_integration_worker.py") +_REPO_ROOT = _WORKER.parents[3] + + +def _vllm_available() -> bool: + try: + import vllm # noqa: F401 + + return True + except ImportError: + return False + + +@pytest.mark.skipif(not _vllm_available(), reason="vllm not installed") +def test_vllm_import_hook_wiring_subprocess(): + env = { + **dict(os.environ), + "PROBING": "1", + "PROBING_VLLM": "on", + "PROBING_VLLM_STEP_SYNC": "on", + } + proc = subprocess.run( + [sys.executable, str(_WORKER)], + env=env, + capture_output=True, + text=True, + timeout=120, + cwd=_REPO_ROOT, + ) + assert proc.returncode == 0, proc.stderr or proc.stdout + + lines = [line for line in proc.stdout.splitlines() if line.strip().startswith("{")] + assert lines, f"no JSON payload in stdout:\n{proc.stdout}\n{proc.stderr}" + payload = json.loads(lines[-1]) + + assert payload.get("vllm_version") + # Engine module may not load until first LLM construction; hook smoke still passes. + assert "role" in payload + + +@pytest.mark.skipif(not _vllm_available(), reason="vllm not installed") +def test_vllm_offline_generate_smoke_subprocess(): + """Real ``LLM.generate`` smoke — opt-in (slow, needs aligned vllm/vllm-metal/mlx-lm).""" + if os.environ.get("PROBING_VLLM_RUN_GENERATE", "").strip().lower() not in ( + "1", + "true", + "yes", + "on", + ): + pytest.skip( + "set PROBING_VLLM_RUN_GENERATE=1 to run real LLM.generate integration" + ) + + model = os.environ.get( + "PROBING_VLLM_TEST_MODEL", + "mlx-community/Qwen2.5-0.5B-Instruct-4bit" if sys.platform == "darwin" else "", + ).strip() + if not model: + pytest.skip("set PROBING_VLLM_TEST_MODEL for offline generate integration") + + env = { + **dict(os.environ), + "PROBING": "1", + "PROBING_VLLM": "on", + "PROBING_VLLM_STEP_SYNC": "on", + "PROBING_VLLM_TEST_MODEL": model, + } + proc = subprocess.run( + [sys.executable, str(_WORKER)], + env=env, + capture_output=True, + text=True, + timeout=600, + cwd=_REPO_ROOT, + ) + assert proc.returncode == 0, proc.stderr or proc.stdout + + lines = [line for line in proc.stdout.splitlines() if line.strip().startswith("{")] + assert lines, f"no JSON payload in stdout:\n{proc.stdout}\n{proc.stderr}" + payload = json.loads(lines[-1]) + + assert payload.get("model") == model + assert int(payload.get("local_step", 0)) >= 0 diff --git a/tests/regression/ext/vllm_integration_worker.py b/tests/regression/ext/vllm_integration_worker.py new file mode 100644 index 00000000..29380b1b --- /dev/null +++ b/tests/regression/ext/vllm_integration_worker.py @@ -0,0 +1,79 @@ +"""Subprocess worker for vLLM integration tests. + +Runs a minimal offline ``LLM.generate`` when a model id is provided via +``PROBING_VLLM_TEST_MODEL``. Otherwise only validates import-hook wiring. +""" + +from __future__ import annotations + +import json +import os +import sys + + +def main() -> int: + os.environ.setdefault("PROBING", "1") + os.environ.setdefault("PROBING_VLLM", "on") + os.environ.setdefault("PROBING_VLLM_STEP_SYNC", "on") + os.environ.setdefault("VLLM_USE_V1", "1") + + if sys.platform == "darwin": + os.environ.setdefault("VLLM_METAL_USE_MLX", "1") + os.environ.setdefault("VLLM_MLX_DEVICE", "gpu") + os.environ.setdefault("VLLM_WORKER_MULTIPROC_METHOD", "spawn") + os.environ.setdefault("VLLM_PROMPTS_PER_BATCH", "1") + + import importlib + + vllm = importlib.import_module("vllm") + + import probing + from probing.ext import vllm as vllm_ext + + for mod_name in ( + "vllm_metal", + "vllm.v1.engine.llm_engine", + "vllm.engine.llm_engine", + ): + try: + importlib.import_module(mod_name) + except ImportError: + continue + + vllm_ext.maybe_autostart() + + engine_wrapped = False + for mod_name in ("vllm.v1.engine.llm_engine", "vllm.engine.llm_engine"): + mod = sys.modules.get(mod_name) + if mod is None: + continue + engine_cls = getattr(mod, "LLMEngine", None) + if engine_cls is not None and getattr( + engine_cls.step, "_probing_wrapped", False + ): + engine_wrapped = True + break + + result: dict[str, object] = { + "role": probing.current_role(), + "engine_wrapped": engine_wrapped, + "vllm_version": getattr(vllm, "__version__", "unknown"), + } + + model = os.environ.get("PROBING_VLLM_TEST_MODEL", "").strip() + if model: + from probing.ext.vllm import sync_step_from_llm + + llm = vllm.LLM(model=model, max_model_len=512) + llm.generate(["ping"], max_tokens=1) + sync_step_from_llm(llm, force=True) + snap = probing.step.snapshot() + result["local_step"] = int(snap.local_step) + result["model"] = model + + print(json.dumps(result)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/regression/profiling/test_torch_probe_sampling.py b/tests/regression/profiling/test_torch_probe_sampling.py index e3d3fca0..152e67b2 100644 --- a/tests/regression/profiling/test_torch_probe_sampling.py +++ b/tests/regression/profiling/test_torch_probe_sampling.py @@ -812,3 +812,53 @@ def test_random_mode_short_circuits_non_sampled_steps(): seen_idle |= not active # Non-sampled random steps exist and short-circuit (would previously always run). assert seen_active and seen_idle + + +def test_adaptive_rate_lowers_on_high_dispatch_overhead(): + from probing.profiling.torch_probe import ( + _AdaptiveRateController, + _MIN_DISPATCH_SAMPLES, + _MIN_SHADOW_SAMPLES, + TorchProbeConfig, + ) + + cfg = TorchProbeConfig( + enabled=True, + rate=0.2, + adaptive_rate=True, + overhead_target_pct=5.0, + overhead_high_pct=10.0, + rate_floor=0.01, + ) + tracer = TorchProbe(config=cfg) + ctrl = tracer._adaptive_controller + assert ctrl.enabled + + shadow = 1.0 + dispatch = 1.25 # 25% overhead + for _ in range(_MIN_SHADOW_SAMPLES): + ctrl.record(shadow, is_shadow=True, sampled=False) + for _ in range(_MIN_DISPATCH_SAMPLES): + ctrl.record(dispatch, is_shadow=False, sampled=False) + + ctrl.maybe_adjust(tracer) + assert tracer.rate == 0.1 + + +def test_adaptive_rate_requires_minimum_samples(): + from probing.profiling.torch_probe import ( + _AdaptiveRateController, + TorchProbeConfig, + _MIN_DISPATCH_SAMPLES, + _MIN_SHADOW_SAMPLES, + ) + + cfg = TorchProbeConfig(enabled=True, rate=0.2, adaptive_rate=True) + tracer = TorchProbe(config=cfg) + ctrl = tracer._adaptive_controller + for _ in range(_MIN_SHADOW_SAMPLES - 1): + ctrl.record(1.0, is_shadow=True, sampled=False) + for _ in range(_MIN_DISPATCH_SAMPLES - 1): + ctrl.record(2.0, is_shadow=False, sampled=False) + ctrl.maybe_adjust(tracer) + assert tracer.rate == 0.2 diff --git a/tests/unit/probing/ext/test_megatron.py b/tests/unit/probing/ext/test_megatron.py deleted file mode 100644 index dbde723a..00000000 --- a/tests/unit/probing/ext/test_megatron.py +++ /dev/null @@ -1,156 +0,0 @@ -"""Megatron autostart integration tests (mocked Megatron modules).""" - -from __future__ import annotations - -import sys -import types -from unittest import mock - -import pytest - -import probing -from probing.ext import megatron as megatron_ext - - -@pytest.fixture(autouse=True) -def _reset_megatron_state(): - megatron_ext._PARALLEL_STATE_INIT = False - megatron_ext._TRAINING_INIT = False - megatron_ext._LAST_ROLE = None - megatron_ext._LAST_ITERATION = None - probing.clear_role() - for key in list(sys.modules): - if key == "megatron" or key.startswith("megatron."): - del sys.modules[key] - yield - probing.clear_role() - - -@pytest.fixture -def megatron_env(monkeypatch): - monkeypatch.setenv("PROBING_MEGATRON", "on") - monkeypatch.setenv("PROBING_MEGATRON_STEP_SYNC", "on") - - -def _make_parallel_state( - *, - initialized: bool = True, - tp: int = 2, - pp: int = 1, - dp: int = 3, -): - ps = types.ModuleType("megatron.core.parallel_state") - - def model_parallel_is_initialized(): - return initialized - - def get_tensor_model_parallel_rank(): - return tp - - def get_pipeline_model_parallel_rank(): - return pp - - def get_data_parallel_rank(): - return dp - - def initialize_model_parallel(*args, **kwargs): - return None - - ps.model_parallel_is_initialized = model_parallel_is_initialized - ps.get_tensor_model_parallel_rank = get_tensor_model_parallel_rank - ps.get_pipeline_model_parallel_rank = get_pipeline_model_parallel_rank - ps.get_data_parallel_rank = get_data_parallel_rank - ps.initialize_model_parallel = initialize_model_parallel - return ps - - -def test_megatron_job_detected_from_env(monkeypatch): - monkeypatch.setenv("TENSOR_MODEL_PARALLEL_RANK", "0") - assert megatron_ext.megatron_job_detected() - - -def test_sync_role_from_parallel_state(megatron_env): - ps = _make_parallel_state(tp=2, pp=1, dp=3) - role = megatron_ext.sync_role_from_parallel_state(ps) - assert role == "dp=3,pp=1,tp=2" - assert probing.current_role() == "dp=3,pp=1,tp=2" - - -def test_init_parallel_state_wraps_initialize(megatron_env, monkeypatch): - ps = _make_parallel_state(tp=0, pp=0, dp=1) - core = types.ModuleType("megatron.core") - core.parallel_state = ps - megatron = types.ModuleType("megatron") - megatron.core = core - monkeypatch.setitem(sys.modules, "megatron", megatron) - monkeypatch.setitem(sys.modules, "megatron.core", core) - monkeypatch.setitem(sys.modules, "megatron.core.parallel_state", ps) - - with mock.patch.dict( - "sys.modules", - { - "megatron.core.parallel_state": ps, - }, - ): - megatron_ext.init_parallel_state() - ps.initialize_model_parallel() - assert probing.current_role() == "dp=1,pp=0,tp=0" - - -def test_train_step_wrap_syncs_iteration(megatron_env, monkeypatch): - ps = _make_parallel_state() - training_mod = types.ModuleType("megatron.training.training") - calls: list[int] = [] - - def train_step(*args, **kwargs): - calls.append(1) - return {"loss": 1.0} - - training_mod.train_step = train_step - - global_vars = types.ModuleType("megatron.training.global_vars") - args_obj = types.SimpleNamespace(iteration=42) - - def get_args(): - return args_obj - - global_vars.get_args = get_args - - num_calc = types.ModuleType("megatron.core.num_microbatches_calculator") - - def get_num_microbatches(): - return 4 - - num_calc.get_num_microbatches = get_num_microbatches - - core = types.ModuleType("megatron.core") - core.parallel_state = ps - core.num_microbatches_calculator = num_calc - training_pkg = types.ModuleType("megatron.training") - training_pkg.training = training_mod - training_pkg.global_vars = global_vars - megatron = types.ModuleType("megatron") - megatron.core = core - megatron.training = training_pkg - - modules = { - "megatron": megatron, - "megatron.core": core, - "megatron.core.parallel_state": ps, - "megatron.core.num_microbatches_calculator": num_calc, - "megatron.training": training_pkg, - "megatron.training.training": training_mod, - "megatron.training.global_vars": global_vars, - } - with mock.patch.dict(sys.modules, modules): - megatron_ext.init_training() - training_mod.train_step() - assert calls == [1] - assert probing.step.local_step == 42 - assert int(probing.step.snapshot().micro_batches) == 4 - - -def test_megatron_disabled_by_env(monkeypatch): - monkeypatch.setenv("PROBING_MEGATRON", "off") - monkeypatch.setenv("TENSOR_MODEL_PARALLEL_RANK", "0") - assert not megatron_ext.megatron_autostart_enabled() diff --git a/tests/unit/probing/hooks/test_import_hook.py b/tests/unit/probing/hooks/test_import_hook.py index 9329b0b8..bf64fe16 100644 --- a/tests/unit/probing/hooks/test_import_hook.py +++ b/tests/unit/probing/hooks/test_import_hook.py @@ -38,6 +38,8 @@ def tearDown(self): if module_name.startswith("my_module"): del sys.modules[module_name] + import_hook.reset_register() + def test_import_hook_new_module(self): """Test callback execution when importing a new module.""" callback_executed = [] From c3f67237e1d32d5499fabd294db65f4838827d9e Mon Sep 17 00:00:00 2001 From: Reiase Date: Sun, 12 Jul 2026 21:36:38 +0800 Subject: [PATCH 17/37] Update documentation and add Torch Profiler SQL support (#67) * Update documentation and add Torch Profiler SQL support - Added new entries for "Torch Profiler SQL" in the English and Chinese documentation, enhancing the navigation and vocabulary sections. - Introduced a new design document for "Torch Profiler SQL," detailing its functionality and integration with existing profiling tools. - Updated the `mkdocs.yml` configuration to include the new documentation links and ensure proper navigation. - Enhanced the `profiling.md` files to reference the new SQL capabilities, providing users with clearer guidance on using the profiler effectively. These changes aim to improve the clarity and accessibility of the documentation related to the Torch Profiler SQL feature, facilitating better user understanding and adoption. * Refactor integration tests for static catalog documentation - Updated the `test_describe_builtin_hccl_via_query_subprocess` to validate catalog rows instead of relying on the `DESCRIBE` command, ensuring tests are more robust against CI subprocess issues. - Modified `test_describe_json_shape_subprocess` to check for `description` and `table_name` columns, enhancing the validation of catalog table documentation. - Removed assertions related to `comment` and `table_comment` to align with the new testing approach. These changes aim to improve the reliability and clarity of the integration tests for the static catalog documentation. --- docs/mkdocs.yml | 2 + docs/src/design/index.md | 1 + docs/src/design/index.zh.md | 1 + docs/src/design/profiling.md | 2 +- docs/src/design/profiling.zh.md | 2 +- docs/src/design/torch-profiler-sql.md | 297 +++++++++++ docs/src/design/torch-profiler-sql.zh.md | 417 +++++++++++++++ probing/core/resources/tables.yaml | 45 ++ probing/core/src/core/memtable_sql.rs | 4 +- probing/core/src/core/semantic_catalog.rs | 28 +- .../python/src/extensions/python.rs | 1 + .../src/extensions/python/profile_sql.rs | 259 ++++++++++ .../python/src/extensions/python/tbls.rs | 27 +- .../python/src/features/flamegraph.rs | 32 +- .../extensions/python/src/features/pprof.rs | 1 + .../extensions/python/src/features/torch.rs | 483 ++++++++++++++++++ probing/server/API.md | 6 +- probing/server/src/server/api/mod.rs | 5 + probing/server/src/server/training.rs | 88 ++++ python/probing/handlers/pythonext.py | 54 +- .../profiling/torch_profiler/__init__.py | 12 + .../profiling/torch_profiler/adaptor.py | 209 ++++++++ .../profiling/torch_profiler/controller.py | 269 ++++++++++ .../profiling/torch_profiler/session_store.py | 116 +++++ .../probing/profiling/torch_profiler/sql.py | 114 +++++ python/probing/repl/torch_magic.py | 283 ++-------- .../core/test_table_docs_integration.py | 29 +- tests/regression/profiling/conftest.py | 11 + .../profiling/test_distributed_flamegraph.py | 158 ++++++ .../profiling/test_torch_profiler_sql.py | 101 ++++ tests/regression/rust/Cargo.toml | 4 + .../python/distributed_flamegraph_tests.rs | 99 ++++ .../server/training_observability_tests.rs | 67 +++ tests/regression/spec/api_spec.json | 22 +- tests/unit/probing/profiling/conftest.py | 16 + .../profiling/test_torch_profiler_adaptor.py | 170 ++++++ .../test_torch_profiler_controller.py | 162 ++++++ .../profiling/test_torch_profiler_handlers.py | 43 ++ .../profiling/test_torch_profiler_sql.py | 42 ++ web/src/api/profiling.rs | 24 + .../components/sidebar/profiling/controls.rs | 65 ++- web/src/components/sidebar/profiling/mod.rs | 10 +- web/src/pages/profiling.rs | 89 +++- web/src/state/profiling.rs | 11 + 44 files changed, 3600 insertions(+), 281 deletions(-) create mode 100644 docs/src/design/torch-profiler-sql.md create mode 100644 docs/src/design/torch-profiler-sql.zh.md create mode 100644 probing/extensions/python/src/extensions/python/profile_sql.rs create mode 100644 python/probing/profiling/torch_profiler/__init__.py create mode 100644 python/probing/profiling/torch_profiler/adaptor.py create mode 100644 python/probing/profiling/torch_profiler/controller.py create mode 100644 python/probing/profiling/torch_profiler/session_store.py create mode 100644 python/probing/profiling/torch_profiler/sql.py create mode 100644 tests/regression/profiling/test_distributed_flamegraph.py create mode 100644 tests/regression/profiling/test_torch_profiler_sql.py create mode 100644 tests/regression/rust/probing/python/distributed_flamegraph_tests.rs create mode 100644 tests/unit/probing/profiling/conftest.py create mode 100644 tests/unit/probing/profiling/test_torch_profiler_adaptor.py create mode 100644 tests/unit/probing/profiling/test_torch_profiler_controller.py create mode 100644 tests/unit/probing/profiling/test_torch_profiler_handlers.py create mode 100644 tests/unit/probing/profiling/test_torch_profiler_sql.py diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index bfe1c601..96a6158e 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -99,6 +99,7 @@ plugins: Extensibility: 扩展机制 CLI Command Tree: CLI 命令树 Profiling: 性能分析 + Torch Profiler SQL: Torch Profiler SQL(Kineto 虚拟表) Overhead: 开销测量 NCCL Profiler: NCCL Profiler Debugging Engine: 调试引擎 @@ -156,6 +157,7 @@ nav: - CLI Command Tree: design/cli.md - Collectors & Profiling: - Profiling: design/profiling.md + - Torch Profiler SQL: design/torch-profiler-sql.md - Overhead: design/overhead.md - Overhead invariants: design/overhead-invariants.md - NCCL Profiler: design/nccl-profiler.md diff --git a/docs/src/design/index.md b/docs/src/design/index.md index ae5f3bbf..3e58560f 100644 --- a/docs/src/design/index.md +++ b/docs/src/design/index.md @@ -25,6 +25,7 @@ Vocabulary: **[Core model](../guide/concepts.md)**. | Document | Description | |----------|-------------| | [Profiling](profiling.md) | Torch hooks, sampling, table write path | +| [Torch Profiler SQL](torch-profiler-sql.md) | On-demand Kineto capture → virtual SQL tables | | [Overhead](overhead.md) | Formulas, shadow-step measurement, offline benchmarks | | [NCCL Profiler](nccl-profiler.md) | Plugin ABI, proxy-op wait decomposition | | [Debugging Engine](debugging.md) | eval / backtrace / REPL implementation | diff --git a/docs/src/design/index.zh.md b/docs/src/design/index.zh.md index 3f18eaff..d90cfe63 100644 --- a/docs/src/design/index.zh.md +++ b/docs/src/design/index.zh.md @@ -24,6 +24,7 @@ | 文档 | 说明 | |------|------| | [性能分析](profiling.zh.md) | Torch hook、采样、落表路径 | +| [Torch Profiler SQL](torch-profiler-sql.zh.md) | 按需 Kineto 采集 → 虚拟 SQL 表 | | [开销测量](overhead.zh.md) | 公式定义、shadow step、离线基准 | | [NCCL Profiler](nccl-profiler.zh.md) | 插件 ABI、proxy 等待分解 | | [调试引擎](debugging.zh.md) | eval / backtrace / REPL 实现 | diff --git a/docs/src/design/profiling.md b/docs/src/design/profiling.md index d26cf70f..7a32aaca 100644 --- a/docs/src/design/profiling.md +++ b/docs/src/design/profiling.md @@ -43,7 +43,7 @@ graph TB ### Design -TorchProbe targets **always-on, module-level training telemetry** after probe injection or `PROBING_TORCH_PROFILING=on`. It is complementary to episodic tools such as `torch.profiler` / Kineto (op/kernel Chrome traces). +TorchProbe targets **always-on, module-level training telemetry** after probe injection or `PROBING_TORCH_PROFILING=on`. It is complementary to episodic tools such as `torch.profiler` / Kineto (op/kernel Chrome traces). For on-demand Kineto capture exposed as **virtual SQL tables** (not memtable), see **[Torch Profiler SQL](torch-profiler-sql.md)**. There is **no warmup schedule API**. Skip cold-start steps in SQL when needed: diff --git a/docs/src/design/profiling.zh.md b/docs/src/design/profiling.zh.md index 2753dca5..c354bc3e 100644 --- a/docs/src/design/profiling.zh.md +++ b/docs/src/design/profiling.zh.md @@ -43,7 +43,7 @@ graph TB ### 设计定位 -TorchProbe 面向**注入后长期开启的 module 级训练遥测**(`PROBING_TORCH_PROFILING=on`)。与 episodic 工具(`torch.profiler` / Kineto 的 op/kernel Chrome trace)互补,而非替代。 +TorchProbe 面向**注入后长期开启的 module 级训练遥测**(`PROBING_TORCH_PROFILING=on`)。与 episodic 工具(`torch.profiler` / Kineto 的 op/kernel Chrome trace)互补,而非替代。按需 Kineto 采集以**虚拟 SQL 表**暴露(不写 memtable)见 **[Torch Profiler SQL](torch-profiler-sql.zh.md)**。 **不提供 warmup schedule API**。跳过冷启动步请在 SQL 中过滤: diff --git a/docs/src/design/torch-profiler-sql.md b/docs/src/design/torch-profiler-sql.md new file mode 100644 index 00000000..caef9467 --- /dev/null +++ b/docs/src/design/torch-profiler-sql.md @@ -0,0 +1,297 @@ +# Torch Profiler → SQL (conclusion-driven virtual tables) + +Turn on-demand **`torch.profiler`** capture into **SQL that answers diagnostic questions** — not a +mirror of Kineto events. Virtual table schemas are derived from **conclusions we need**; the +Adaptor compiles timeline data into those conclusion slots. Full Chrome timelines stay on HTTP/UI. + +Read with [Profiling](profiling.md), [Federated query engine](federation.md), [NCCL Profiler](nccl-profiler.md). + +中文: [中文版](/zh/design/torch-profiler-sql/) + +--- + +## 1. Design principles + +### 1.1 Needs-first, not profiler-first + +| ❌ Wrong starting point | ✅ Right starting point | +|------------------------|-------------------------| +| Mirror Kineto fields as SQL columns | Define **conclusions** diagnostics require | +| One `traceEvents[]` row per SQL row | Pre-aggregate **time buckets** for those conclusions | +| Single-node timeline viewer | **Cross-rank comparable** facts at the same `local_step` + `global.*` | +| Table names reflect implementation | Table names reflect **analytical questions** | + +**Adaptor role:** at finalize, **compile** Kineto / EventList into conclusion fact rows; SQL never +parses Chrome JSON. + +### 1.2 Fit in the existing diagnostic stack + +```mermaid +flowchart LR + subgraph always_on["Always-on (MEMT)"] + TT[torch_trace → which Module] + CC[comm_collective / nccl.* → comm] + SR[slow_rank skill] + end + subgraph on_demand["On-demand (virtual tables)"] + PH[profile_hotspot → kernels inside Module] + PC[profile_capture → capture coordinates] + end + SR -->|"lock step + rank"| PC + TT -->|"lock module"| PH + CC -->|"align step"| PH +``` + +| Existing conclusion | Source | Profiler SQL adds | +|--------------------|--------|-------------------| +| Which **module** is slow | `python.torch_trace` | Which **kernels/ops** under that module | +| Which **rank** is slow | `slow_rank` / `global.python.comm_collective` | Whether the slow rank has a **different kernel profile** | +| NCCL **culprit/victim** | `nccl.proxy_ops` | Whether **compute** is also abnormal on that rank | +| Overall **step slowdown** | `python.torch_step_timing` | **GPU time composition** for a step (compute/mem/sync/…) | + +--- + +## 2. Diagnostic conclusions catalog (SSOT) + +**Q1–Q8** below are the acceptance criteria for virtual tables, skills, and the Adaptor. + +### Q1 — Where does GPU time go on this step? + +**Conclusion:** Top kernels/ops by time for a given `local_step` or capture. + +**Typical trigger:** drill-down after `module_bottleneck`. + +```sql +SELECT bucket_name, bucket_kind, self_us, pct_of_capture, calls +FROM python.profile_hotspot +WHERE capture_id = @capture_id AND bucket_kind IN ('kernel', 'cpu_op') +ORDER BY self_us DESC +LIMIT 20; +``` + +### Q2 — Time composition: compute / memcpy / runtime / other? + +```sql +SELECT bucket_kind, sum(self_us) AS us, sum(pct_of_capture) AS pct +FROM python.profile_hotspot +WHERE capture_id = @capture_id +GROUP BY bucket_kind +ORDER BY us DESC; +``` + +`bucket_kind` is an Adaptor mapping (§7), not raw Kineto `cat`. + +### Q3 — How much slower is a rank on the **same kernel** vs cluster median? + +**Core distributed conclusion** — turning single-node timeline into cluster analysis. + +```sql +WITH per_rank AS ( + SELECT _rank, bucket_name, sum(self_us) AS us + FROM global.python.profile_hotspot + WHERE local_step = @step AND bucket_kind = 'kernel' + GROUP BY _rank, bucket_name +), +median AS ( + SELECT bucket_name, median(us) AS med_us + FROM per_rank + GROUP BY bucket_name +) +SELECT p._rank, p.bucket_name, p.us, + m.med_us, p.us - m.med_us AS delta_us, + (p.us - m.med_us) / nullif(m.med_us, 0) AS delta_ratio +FROM per_rank p +JOIN median m ON p.bucket_name = m.bucket_name +WHERE p.us > m.med_us * 1.2 +ORDER BY delta_us DESC +LIMIT 30; +``` + +- High `delta_ratio` on few ranks → **straggler** kernel slowness +- All ranks high → **shared** algorithmic slowness + +### Q4 — Does the slow rank have a **different hotspot set**? + +Compare slow rank vs a reference rank on the same step (see §2 Q4 in zh doc for full query). + +### Q5 — Can module hotspots be tied to kernels? + +Join `python.torch_trace` with `profile_capture` / `profile_hotspot` on `local_step`. +v2: `module_hint` column when `with_stack=true`. + +### Q6 — Shared slowness vs single-rank anomaly? + +Cross-rank spread (`max - min`) per `bucket_name` on `global.python.profile_hotspot`. + +### Q7 — Is the capture aligned with the right training step / collectives? + +Query `profile_capture` against latest `torch_trace` step and `comm_collective` row counts. + +### Q8 — Is this capture trustworthy (truncated / failed)? + +```sql +SELECT capture_id, status, truncated, event_count, error +FROM python.profile_capture +WHERE capture_id = @capture_id; +``` + +--- + +## 3. Conclusions → virtual tables (minimal schema) + +Two core virtual tables (+ federated mirrors). **No raw event table** in v1. + +### 3.1 `python.profile_capture` + +One row per profiler window. **Federation anchor.** + +| Column | Serves | +|--------|--------| +| `capture_id` | Primary filter | +| `local_step`, `global_step` | Align with torch_trace / comm / nccl | +| `rank`, `world_size`, `role` | Coordinates | +| `trigger` | Audit (skill / manual) | +| `steps_profiled`, `wall_us` | Window metadata | +| `status`, `truncated`, `event_count`, `error` | Q8 data quality | + +Federated: `global.python.profile_capture` + `_host`, `_addr`, `_rank`, `_role`. + +### 3.2 `python.profile_hotspot` + +**One row = one time bucket aggregated for one capture on one rank.** + +| Column | Serves | +|--------|--------| +| `capture_id`, `local_step`, `global_step`, `rank` | Keys | +| `bucket_kind` | Q2 — `kernel`, `cpu_op`, `cuda_runtime`, `memcpy`, `collective`, `other` | +| `bucket_name` | Q1, Q3–Q6 | +| `self_us` | **Primary sort metric** (exclusive time when available) | +| `wall_us`, `calls` | Secondary | +| `pct_of_capture` | Q1, Q2 | +| `module_hint` | Q5 (v2) | + +Federated: `global.python.profile_hotspot` — primary surface for **Q3–Q6**. + +### 3.3 Intentionally omitted (v1) + +| Omitted | Why | Alternative | +|---------|-----|-------------| +| Raw `traceEvents` table | Millions of rows, no direct conclusion | HTTP timeline | +| Kineto `pid`/`tid` mirror | Not operator-meaningful | `bucket_kind` | +| Precomputed `rank_delta` table | Keep flexibility in SQL/skills | §2 query patterns | + +--- + +## 4. Distributed analysis patterns + +### 4.1 Recommended workflow + +1. `slow_rank` or `module_bottleneck` locks `@step` (and optionally `@slow_rank`) +2. Coordinated `profile/start` at that step (v2: all ranks) +3. Adaptor fills `profile_capture` + `profile_hotspot` on each rank +4. Run Q3–Q6 on `global.python.profile_hotspot` + +### 4.2 Federation contract + +| Rule | Detail | +|------|--------| +| Alignment keys | `local_step` + `capture_id`; same `trigger` / `global_step` for one diagnostic action | +| Missing ranks | Contribute zero rows; existing `PROBING_FANOUT_STRICT` semantics | +| Labels | `_rank`, `_host`, `_role` for Q3–Q6 | +| NCCL join | Same `global_step` on `global.nccl.proxy_ops` (time-window join v2) | + +### 4.3 Planned skills + +| Skill | Prerequisite | Conclusions | +|-------|--------------|-------------| +| `kernel_bottleneck` (new) | `module_bottleneck` | Q1, Q2, Q5 | +| `kernel_straggler` (new) | `slow_rank` | Q3, Q4, Q6 | + +--- + +## 5. Trigger and memory (summary) + +| Item | Design | +|------|--------| +| Trigger | HTTP, REPL, MCP, skill chain | +| Window | Default `steps=1`; `local_step` written to `profile_capture` | +| Store | In-process session; Adaptor outputs **only §3 rows** | +| Limits | Env caps; `truncated=true` retains hotspot aggregates | +| Chrome | UI only | + +--- + +## 6. Implementation layering + +```text +Questions / SQL patterns (§2) + ↓ +Virtual schemas (§3) ← TableProvider / global.* + ↓ +KinetoSqlAdaptor: timeline → profile_capture + profile_hotspot rows + ↓ +ProfilerController + SessionStore + raw torch.profiler +``` + +--- + +## 7. Adaptor mapping (appendix) + +Kineto is **input**, not **output schema**. + +| Source | → `profile_hotspot` | +|--------|---------------------| +| CUDA kernel name | `bucket_kind=kernel`, `bucket_name` | +| ATen op | `bucket_kind=cpu_op` | +| memcpy APIs | `bucket_kind=memcpy` | +| sync APIs | `bucket_kind=cuda_runtime` | +| `nccl*` kernels | `bucket_kind=collective` | +| self cuda/cpu time | `self_us` | +| total cuda/cpu time | `wall_us` | +| count | `calls` | + +--- + +## 8. Control API (draft) + +| Method | Path | +|--------|------| +| `POST` | `/apis/pythonext/pytorch/profile/start` | +| `POST` | `/apis/pythonext/pytorch/profile/stop` | +| `GET` | `/apis/pythonext/pytorch/profile/status` | +| `GET` | `/apis/pythonext/pytorch/timeline` | + +--- + +## 9. Implementation phases (by conclusion priority) + +| Phase | Deliverable | Validates | +|-------|-------------|-----------| +| **P0** | Controller + Adaptor → hotspot rows | Q1, Q2, Q8 local | +| **P1** | Virtual tables + local SQL | Q5, Q7 | +| **P2** | `global.*` + `kernel_bottleneck` skill | Q1–Q2 federated | +| **P3** | `kernel_straggler` + coordinated trigger | Q3, Q4, Q6 | +| **P4** | `module_hint` + nccl time join | Q5 refined | + +--- + +## 10. Risks + +| Risk | Mitigation | +|------|------------| +| Wrong-step conclusions | `profile_capture` step fields; Q7 templates | +| Misaligned federation | v2 coordinated capture; check `ranks_seen` in skills | +| Over-reliance on `self_us` | Document vs `wall_us`; Chrome for drill-down | +| Profiler perturbation | Short windows; skills label as intrusive measurement | + +--- + +## 11. Related code (today) + +| Component | Path | +|-----------|------| +| REPL profiler | `python/probing/repl/torch_magic.py` | +| HTTP timeline | `python/probing/handlers/pythonext.py` | +| Module conclusions | `skills/module_bottleneck/` | +| Rank conclusions | `skills/slow_rank/` | +| Virtual table infra | `probing/core/src/core/data_source.rs` | diff --git a/docs/src/design/torch-profiler-sql.zh.md b/docs/src/design/torch-profiler-sql.zh.md new file mode 100644 index 00000000..09d36ec2 --- /dev/null +++ b/docs/src/design/torch-profiler-sql.zh.md @@ -0,0 +1,417 @@ +# Torch Profiler → SQL(结论驱动的虚拟表) + +将按需 **`torch.profiler`** 采集变成 **可回答诊断问题的 SQL 能力**,而不是 Kineto 事件的镜像。 +虚拟表从 **「我们想得出什么结论」** 反推 schema;Adaptor 负责把 timeline 填进这些结论槽位。 +完整 Chrome timeline 仍走 HTTP/UI。 + +阅读:[性能分析](profiling.zh.md)、[联邦查询引擎](federation.zh.md)、[NCCL Profiler](nccl-profiler.zh.md)。 + +英文版:[torch-profiler-sql.md](torch-profiler-sql.md) + +--- + +## 1. 设计原则 + +### 1.1 需求驱动,而非 Profiler 驱动 + +| ❌ 错误起点 | ✅ 正确起点 | +|------------|------------| +| Kineto 有哪些字段就建哪些列 | 诊断需要哪些 **结论** | +| `traceEvents[]` 一行进 SQL 一行 | 为结论预聚合 **时间桶(time bucket)** | +| 单节点 timeline 浏览器 | **同一 `local_step` 跨 rank 可比较** 的事实表 + `global.*` | +| 表名反映实现(`profiler_kernel`) | 表名反映分析问题(`profile_hotspot`) | + +**Adaptor 的角色**:在 finalize 时把 Kineto / EventList **编译**成结论事实行;SQL 层不再理解 Chrome JSON。 + +### 1.2 与现有诊断栈的分工 + +```mermaid +flowchart LR + subgraph always_on["常开(MEMT)"] + TT[torch_trace → 哪个 Module] + CC[comm_collective / nccl.* → 通信] + SR[slow_rank skill] + end + subgraph on_demand["按需(虚拟表)"] + PH[profile_hotspot → Module 里什么 kernel / 哪类时间] + PC[profile_capture → 采集坐标] + end + SR -->|"锁定 step + rank"| PC + TT -->|"锁定 module"| PH + CC -->|"对齐 step"| PH +``` + +| 已有结论 | 数据源 | Profiler SQL 补什么 | +|----------|--------|---------------------| +| 哪个 **Module** 慢 | `python.torch_trace` | 该 Module 对应哪些 **kernel/op** | +| 哪个 **rank** 慢 | `slow_rank` / `global.python.comm_collective` | 慢 rank 的 **kernel 画像是否不同** | +| NCCL **culprit/victim** | `nccl.proxy_ops` | 慢 rank 上 **compute 是否也异常**(排除/确认 compute-bound) | +| 训练是否 **整体变慢** | `torch_step_timing` | 某步 **GPU 时间构成**(compute/mem/sync/其他) | + +--- + +## 2. 诊断结论清单(SSOT) + +下列 **Q1–Q8** 是虚拟表必须支撑的结论。实现与 skill 以本表为验收标准。 + +### Q1 — 本步 GPU 时间主要花在哪? + +**结论**:给定 `local_step`(或最近一次 capture),按 kernel/op **排序的耗时 Top-K**。 + +**典型触发**:`module_bottleneck` 发现热点 module 后的钻取。 + +**本地 SQL 范式**: + +```sql +SELECT bucket_name, bucket_kind, self_us, pct_of_capture, calls +FROM python.profile_hotspot +WHERE capture_id = @capture_id AND bucket_kind IN ('kernel', 'cpu_op') +ORDER BY self_us DESC +LIMIT 20; +``` + +--- + +### Q2 — 时间构成:compute / memcpy / runtime / 其他? + +**结论**:一步 profile 窗口内的 **类别占比**(用于判断是算力、访存还是调度)。 + +**本地 SQL 范式**: + +```sql +SELECT bucket_kind, sum(self_us) AS us, sum(pct_of_capture) AS pct +FROM python.profile_hotspot +WHERE capture_id = @capture_id +GROUP BY bucket_kind +ORDER BY us DESC; +``` + +`bucket_kind` 由 Adaptor 映射(见 §7),不是 Kineto 原始 `cat` 字段。 + +--- + +### Q3 — 慢 rank 在 **相同 kernel** 上比集群中位 rank 慢多少? + +**结论**:跨节点 **同 step、同 kernel 名** 的 rank 间差异 — 这是「单节点 timeline → 分布式分析」的核心。 + +**联邦 SQL 范式**: + +```sql +WITH per_rank AS ( + SELECT _rank, bucket_name, sum(self_us) AS us + FROM global.python.profile_hotspot + WHERE local_step = @step AND bucket_kind = 'kernel' + GROUP BY _rank, bucket_name +), +median AS ( + SELECT bucket_name, median(us) AS med_us + FROM per_rank + GROUP BY bucket_name +) +SELECT p._rank, p.bucket_name, p.us, + m.med_us, p.us - m.med_us AS delta_us, + (p.us - m.med_us) / nullif(m.med_us, 0) AS delta_ratio +FROM per_rank p +JOIN median m ON p.bucket_name = m.bucket_name +WHERE p.us > m.med_us * 1.2 +ORDER BY delta_us DESC +LIMIT 30; +``` + +**解读**: + +- `delta_ratio` 大且仅个别 rank → **straggler 型** kernel 慢(数据/卡/调度) +- 所有 rank 都高 → **算法/输入** 共性慢(非 straggler) + +--- + +### Q4 — 慢 rank 的 **热点集合** 是否与其他 rank 不同? + +**结论**:不仅「同一个 kernel 更慢」,还有「慢 rank 多了哪些 kernel / 少了哪些 kernel」。 + +**联邦 SQL 范式**(慢 rank 来自 `slow_rank` 或人工指定 `@slow_rank`): + +```sql +SELECT h.bucket_name, h.self_us AS slow_us, + (SELECT sum(self_us) FROM global.python.profile_hotspot g + WHERE g.local_step = @step AND g.bucket_name = h.bucket_name + AND g._rank = @median_rank) AS median_rank_us +FROM global.python.profile_hotspot h +WHERE h.local_step = @step AND h._rank = @slow_rank +ORDER BY slow_us DESC +LIMIT 20; +``` + +--- + +### Q5 — Module 热点能否对应到底层 kernel? + +**结论**:把 `torch_trace` 的 module 级慢点与 profile 窗口内的 op/kernel **关联**(v1 以 **同一步、时间邻域** 为主;精确栈映射为 v2)。 + +**本地 SQL 范式**: + +```sql +SELECT t.module, t.duration AS module_ms, h.bucket_name, h.self_us / 1e3 AS kernel_ms +FROM python.torch_trace t +JOIN python.profile_capture c ON t.local_step = c.local_step +JOIN python.profile_hotspot h ON h.capture_id = c.capture_id +WHERE t.local_step = @step AND t.stage = 'post forward' +ORDER BY t.duration DESC, h.self_us DESC +LIMIT 50; +``` + +v2:Adaptor 在 `with_stack=true` 时填充 `module_hint` 列,支持等值 JOIN。 + +--- + +### Q6 — 这是 **全 rank 共性慢** 还是 **单 rank 异常**? + +**结论**:对同一 `bucket_name`,看跨 rank 的 **离散度**(std / max-min)。 + +**联邦 SQL 范式**: + +```sql +SELECT bucket_name, + min(self_us) AS min_us, max(self_us) AS max_us, + max(self_us) - min(self_us) AS spread_us, + count(DISTINCT _rank) AS ranks_seen +FROM global.python.profile_hotspot +WHERE local_step = @step AND bucket_kind = 'kernel' +GROUP BY bucket_name +HAVING spread_us > @threshold +ORDER BY spread_us DESC; +``` + +--- + +### Q7 — Profile 窗口是否与训练 step / collective **对齐**? + +**结论**:确认 capture 的 `local_step` / `global_step` 与通信、module trace **同一坐标系**,避免「拿错步」下结论。 + +**SQL 范式**: + +```sql +SELECT c.capture_id, c.local_step, c.global_step, c.rank, c.trigger, + (SELECT max(local_step) FROM python.torch_trace) AS latest_torch_step, + (SELECT count(*) FROM python.comm_collective + WHERE global_step = c.global_step) AS coll_rows +FROM python.profile_capture c +ORDER BY c.ended_at_us DESC +LIMIT 5; +``` + +--- + +### Q8 — 这次 profile 是否可信(截断 / 失败)? + +**结论**:Agent 在出结论前必须检查 **数据质量**。 + +```sql +SELECT capture_id, status, truncated, event_count, error +FROM python.profile_capture +WHERE capture_id = @capture_id; +``` + +`truncated = true` 时 Q1–Q6 仅作 **方向性** 参考,skill 应降级表述。 + +--- + +## 3. 结论 → 虚拟表(最小 schema) + +只为支撑 §2 的查询,定义 **两张核心虚拟表**(+ 联邦镜像)。**不**暴露原始 event 表为 v1 默认面。 + +### 3.1 `python.profile_capture`(采集锚点) + +一次 `torch.profiler` 窗口 = 一行。联邦 JOIN 的 **主键锚点**。 + +| 列 | 类型 | 服务于 | +|----|------|--------| +| `capture_id` | text | Q1–Q8 过滤 | +| `local_step`, `global_step` | int | 与 torch_trace / comm / nccl 对齐(Q5、Q7) | +| `rank`, `world_size`, `role` | | 分布式坐标 | +| `trigger` | text | 审计(skill / manual) | +| `steps_profiled` | int | 窗口长度 | +| `wall_us` | bigint | Q2 分母 | +| `started_at_us`, `ended_at_us` | bigint | 时间 | +| `status` | text | Q8 | +| `truncated` | bool | Q8 | +| `event_count` | int | Q8 | +| `error` | text | Q8 | + +联邦:`global.python.profile_capture` + `_host`, `_addr`, `_rank`, `_role`。 + +### 3.2 `python.profile_hotspot`(结论事实表) + +**一行 = 在一个 capture、一个 rank 上,一个时间桶的聚合结果。** + +| 列 | 类型 | 服务于 | +|----|------|--------| +| `capture_id` | text | 关联 capture | +| `local_step`, `global_step` | int | 无 capture_id 时按 step 查(Q3、Q6) | +| `rank` | int | 本地;联邦用 `_rank` | +| `bucket_kind` | text | Q2 — 见下表 | +| `bucket_name` | text | Q1、Q3、Q4、Q6 | +| `self_us` | bigint | **主排序指标** — 不含子节点重叠(优先 Kineto self) | +| `wall_us` | bigint | 含子树 wall time(可选对比) | +| `calls` | int | 调用次数 | +| `pct_of_capture` | double | Q1、Q2 — `self_us / capture.wall_us` | +| `module_hint` | text | Q5(v2,stack 开启时) | + +**`bucket_kind` 枚举(Adaptor 映射,非 Kineto 原文)**: + +| `bucket_kind` | 含义 | 典型结论 | +|---------------|------|----------| +| `kernel` | CUDA kernel | Q1、Q3、Q6 | +| `cpu_op` | ATen CPU op | Q1 | +| `cuda_runtime` | CUDA API / sync | Q2 — 调度/同步瓶颈 | +| `memcpy` | D2D/H2D 等 | Q2 — 访存 | +| `collective` | 若 Kineto 标出 NCCL kernel | 与 `nccl.*` 交叉验证 | +| `other` | 未分类 | 兜底 | + +联邦:`global.python.profile_hotspot` — **Q3–Q6 的主战场**。 + +### 3.3 故意不做的表(v1) + +| 不做 | 原因 | 替代 | +|------|------|------| +| 原始 `traceEvents` 表 | 百万行、无结论 | HTTP timeline | +| 按 Kineto `pid/tid` 镜像 | 对运维无意义 | `bucket_kind` | +| 预计算 `rank_delta` 表 | 结论应留在 SQL/skill 层灵活组合 | §2 范式查询 | + +--- + +## 4. 分布式分析模式 + +### 4.1 标准工作流(推荐) + +```mermaid +sequenceDiagram + participant S as slow_rank / module_bottleneck + participant T as profile/start(协调 step) + participant R as 各 rank 训练进程 + participant Q as global.* 查询 + + S->>T: 锁定 local_step=@step, slow_rank=@r + T->>R: 在 step=@step 采集 1 步(v2 协调) + R->>R: Adaptor → profile_capture + profile_hotspot + Q->>Q: Q3/Q4/Q6 联邦 SQL + Q->>S: 结论:kernel X 在 rank R 上 delta_ratio=1.8 +``` + +### 4.2 联邦契约 + +| 规则 | 说明 | +|------|------| +| **对齐键** | 优先 `local_step` + `capture_id`;跨 rank 同一「诊断动作」应共享 `trigger` 与 `global_step` | +| **缺失 rank** | 无 capture 的 rank 不参与聚合;`PROBING_FANOUT_STRICT` 行为与现网一致 | +| **列标签** | `_rank`, `_host`, `_role` 用于 Q3–Q6,不写入本地表 | +| **与 NCCL 联立** | 同一 `global_step` 上 JOIN `global.nccl.proxy_ops`(时间窗口 JOIN 为 v2) | + +### 4.3 与 skills 的映射(拟议) + +| Skill | 先决 skill | 支撑的结论 | +|-------|-----------|------------| +| `kernel_bottleneck`(新) | `module_bottleneck` 或人工 | Q1、Q2、Q5 | +| `kernel_straggler`(新) | `slow_rank` | Q3、Q4、Q6 | +| `health_overview`(扩展) | — | Q7、Q8 元数据行 | + +--- + +## 5. 触发与内存(简述) + +结论能力的前提是一次 **短窗口、可对齐** 的采集。 + +| 项 | 设计 | +|----|------| +| 触发 | HTTP `profile/start`、REPL、MCP、skill 链式调用 | +| 窗口 | 默认 `steps=1`,绑定 `local_step` 写入 `profile_capture` | +| 存储 | 进程内 Session;Adaptor **只产出 §3 两张表** 的行缓存 | +| 上限 | `PROBING_TORCH_PROFILER_MAX_SESSIONS` 等;截断时 `truncated=true`,保留 hotspot 聚合 | +| Chrome | 仅 UI;不进 SQL | + +v2:**协调式触发** — 所有 rank 在同一 `local_step` 采集,使 Q3–Q6 语义严格成立。 + +--- + +## 6. 实现分层 + +```text +需求 / SQL 范式(本文 §2) + ↓ +虚拟表 schema(§3)← TableProvider / global.* + ↓ +KinetoSqlAdaptor:timeline → profile_capture + profile_hotspot 行 + ↓ +ProfilerController + SessionStore + torch.profiler 原始产物 +``` + +| 层 | 路径(拟议) | +|----|-------------| +| L2 控制 + 适配 | `python/probing/profiling/torch_profiler/` | +| L1 注册 | `ProbeDataSource` / `TableProvider` | +| L4 skill | `skills/kernel_bottleneck/`, `skills/kernel_straggler/` | + +--- + +## 7. Adaptor 映射(实现附录) + +Kineto 是 **输入格式**,不是 **输出 schema**。 + +| Kineto / profiler 来源 | → `profile_hotspot` | +|------------------------|---------------------| +| CUDA kernel 名 | `bucket_kind=kernel`, `bucket_name=name` | +| ATen op | `bucket_kind=cpu_op` | +| `cudaMemcpy*` 等 | `bucket_kind=memcpy` | +| `cudaDeviceSynchronize` 等 | `bucket_kind=cuda_runtime` | +| `nccl*` kernel 名 | `bucket_kind=collective` | +| `self_cuda_time` / `self_cpu_time` | `self_us` | +| `cuda_time_total` | `wall_us` | +| `count` | `calls` | + +Chrome `traceEvents` 仅在 EventList 不可用时作 fallback 解析,产出 **相同 hotspot 行**。 + +--- + +## 8. 控制面 API(草案) + +| 方法 | 路径 | +|------|------| +| `POST` | `/apis/pythonext/pytorch/profile/start` — body 含 `trigger`, `steps`, `align_step` | +| `POST` | `/apis/pythonext/pytorch/profile/stop` | +| `GET` | `/apis/pythonext/pytorch/profile/status` | +| `GET` | `/apis/pythonext/pytorch/timeline` — Chrome,服务 UI | + +--- + +## 9. 实施阶段(按结论优先级) + +| 阶段 | 交付 | 验收结论 | +|------|------|----------| +| **P0** | Controller + SessionStore + Adaptor 产出 hotspot 行 | Q1、Q2、Q8 本地 SQL | +| **P1** | `profile_capture` / `profile_hotspot` 虚拟表 + 本地 SQL | Q5、Q7 | +| **P2** | `global.*` + skill `kernel_bottleneck` | Q1–Q2 联邦可选 | +| **P3** | skill `kernel_straggler` + 协调 step 触发 | Q3、Q4、Q6 | +| **P4** | `module_hint` + 与 nccl 时间联立 | Q5 精确化 | + +--- + +## 10. 风险 + +| 风险 | 缓解 | +|------|------| +| 结论误导(错 step) | `profile_capture` 强制写 step;Q7 查询模板 | +| 联邦不对齐 | v2 协调触发;skill 检查 `ranks_seen` | +| 过度依赖 self_us | 文档说明与 `wall_us` 差异;Chrome 钻取 | +| Profiler 扰动 | 短窗口、skill 明示「干预性测量」 | + +--- + +## 11. 相关代码(当前) + +| 组件 | 路径 | +|------|------| +| REPL profiler | `python/probing/repl/torch_magic.py` | +| HTTP timeline | `python/probing/handlers/pythonext.py` | +| 模块级结论 | `skills/module_bottleneck/` | +| Rank 级结论 | `skills/slow_rank/` | +| 虚拟表基础设施 | `probing/core/src/core/data_source.rs` | diff --git a/probing/core/resources/tables.yaml b/probing/core/resources/tables.yaml index bcec8039..af2f4a88 100644 --- a/probing/core/resources/tables.yaml +++ b/probing/core/resources/tables.yaml @@ -56,6 +56,51 @@ tables: global_name: global.python.torch_step_timing federation_columns: [_host, _addr, _rank, _role] + python.profile_capture: + description: "按需 torch.profiler 采集锚点(step、rank、数据质量元数据)" + synonyms: [profile capture, kineto window, profiler anchor, 采集锚点] + key_columns: + capture_id: "采集主键(JOIN profile_hotspot)" + local_step: "本 rank 训练步" + global_step: "全局训练步" + rank: "torch.distributed rank(-1 未知)" + world_size: "world size(-1 未知)" + role: "并行角色键" + trigger: "触发来源(manual / repl / http / skill)" + steps_profiled: "profile 窗口步数" + wall_us: "采集墙钟时间(微秒);Q2 分母" + started_at_us: "开始时间(epoch 微秒)" + ended_at_us: "结束时间(epoch 微秒)" + status: "running | completed | failed" + truncated: "1=事件列表被截断" + event_count: "聚合前原始事件数" + error: "失败信息" + global_name: global.python.profile_capture + federation_columns: [_host, _addr, _rank, _role] + notes: + - "虚拟表:进程内 Session,不写 memtable" + - "finalize 时由 KinetoSqlAdaptor 物化" + + python.profile_hotspot: + description: "结论事实表:每个 capture 上 kernel/op 时间桶聚合(支撑 Q1/Q2/Q3–Q6)" + synonyms: [profile hotspot, kernel bottleneck, gpu time buckets, 热点事实表] + key_columns: + capture_id: "关联 profile_capture" + local_step: "训练步(无 capture_id 时按 step 查)" + global_step: "全局步" + rank: "产生本行的 rank" + bucket_kind: "kernel | cpu_op | memcpy | cuda_runtime | collective | other" + bucket_name: "kernel 或 op 名" + self_us: "self 时间(微秒),主排序指标" + wall_us: "wall/subtree 时间(微秒)" + calls: "调用次数" + pct_of_capture: "self_us / capture.wall_us" + module_hint: "栈映射 module 提示(v2)" + global_name: global.python.profile_hotspot + federation_columns: [_host, _addr, _rank, _role] + notes: + - "联邦 Q3–Q6 使用 global.python.profile_hotspot" + python.comm_collective: description: "torch.distributed API 层集合通信记录(Python 墙钟计时,粗粒度回退;精准 NCCL 数据在 nccl.* 表)" synonyms: [collective, communication, 通信, all_reduce, torch.distributed] diff --git a/probing/core/src/core/memtable_sql.rs b/probing/core/src/core/memtable_sql.rs index 0e297e84..a99831f0 100644 --- a/probing/core/src/core/memtable_sql.rs +++ b/probing/core/src/core/memtable_sql.rs @@ -937,7 +937,7 @@ impl SchemaProvider for MmapFileSchemaProvider { // is unioned with its cold MEMC segments (keyed by the unique // on-disk basename) so one query spans both tiers. if let Ok(mapped) = MappedFile::open(&path) { - if self.schema == "python" && name != "backtrace" { + if self.schema == "python" && !super::semantic_catalog::is_live_python_table(name) { return Ok(Some(prefer_semantic_python_table(name, mapped, basename))); } if let Some(TableKind::Ring) = detect_table(mapped.as_bytes()) { @@ -949,7 +949,7 @@ impl SchemaProvider for MmapFileSchemaProvider { return Ok(Some(mapped_file_to_table(mapped, name))); } } - if self.schema == "python" && name != "backtrace" { + if self.schema == "python" && !super::semantic_catalog::is_live_python_table(name) { if let Some(table) = super::semantic_catalog::empty_python_extern_table(name) { return Ok(Some(table)); } diff --git a/probing/core/src/core/semantic_catalog.rs b/probing/core/src/core/semantic_catalog.rs index 2787ef3b..f2fb6eb5 100644 --- a/probing/core/src/core/semantic_catalog.rs +++ b/probing/core/src/core/semantic_catalog.rs @@ -268,9 +268,33 @@ fn python_extern_table_column_names(table_name: &str) -> Option> { } } -/// Whether `python.` is a documented extern mmap table (not live `backtrace`). +/// Live python namespace tables (virtual / on-demand), not mmap extern tables. +pub fn is_live_python_table(table_name: &str) -> bool { + matches!( + table_name, + "backtrace" | "profile_capture" | "profile_hotspot" + ) +} + +/// Whether `python.` is a documented extern mmap table (not live virtual tables). pub fn known_python_extern_table(table_name: &str) -> bool { - table_name != "backtrace" && python_extern_table_column_names(table_name).is_some() + !is_live_python_table(table_name) && python_extern_table_column_names(table_name).is_some() +} + +#[cfg(test)] +mod live_table_tests { + use super::*; + + #[test] + fn profile_tables_are_live_not_mmap_extern() { + for name in ["profile_capture", "profile_hotspot"] { + assert!(is_live_python_table(name), "{name} should be live"); + assert!( + !known_python_extern_table(name), + "{name} must not resolve as empty mmap extern" + ); + } + } } /// Infer Arrow type for a documented `python.*` extern column (mmap placeholder or empty table). diff --git a/probing/extensions/python/src/extensions/python.rs b/probing/extensions/python/src/extensions/python.rs index 21e9de81..9cefb277 100644 --- a/probing/extensions/python/src/extensions/python.rs +++ b/probing/extensions/python/src/extensions/python.rs @@ -24,6 +24,7 @@ use crate::python::enable_crash_handler; use crate::python::enable_monitoring; mod exttbls; +mod profile_sql; mod tbls; pub use tbls::PythonNamespace; diff --git a/probing/extensions/python/src/extensions/python/profile_sql.rs b/probing/extensions/python/src/extensions/python/profile_sql.rs new file mode 100644 index 00000000..094db8fa --- /dev/null +++ b/probing/extensions/python/src/extensions/python/profile_sql.rs @@ -0,0 +1,259 @@ +//! Typed RecordBatch builders for live `python.profile_*` virtual tables. + +use std::sync::Arc; + +use probing_core::core::{ + ArrayRef, DataType, Field, Float64Array, Int64Array, RecordBatch, Schema, SchemaRef, + StringArray, +}; +use pyo3::types::{PyAnyMethods, PyDict, PyDictMethods, PyList, PyListMethods}; +use pyo3::{Bound, Python}; + +use super::tbls::{try_record_batch, PythonTableError, TableResult}; + +fn profile_capture_schema() -> SchemaRef { + SchemaRef::new(Schema::new(vec![ + Field::new("capture_id", DataType::Utf8, true), + Field::new("local_step", DataType::Int64, true), + Field::new("global_step", DataType::Int64, true), + Field::new("rank", DataType::Int64, true), + Field::new("world_size", DataType::Int64, true), + Field::new("role", DataType::Utf8, true), + Field::new("trigger", DataType::Utf8, true), + Field::new("steps_profiled", DataType::Int64, true), + Field::new("wall_us", DataType::Int64, true), + Field::new("started_at_us", DataType::Int64, true), + Field::new("ended_at_us", DataType::Int64, true), + Field::new("status", DataType::Utf8, true), + Field::new("truncated", DataType::Int64, true), + Field::new("event_count", DataType::Int64, true), + Field::new("error", DataType::Utf8, true), + ])) +} + +fn profile_hotspot_schema() -> SchemaRef { + SchemaRef::new(Schema::new(vec![ + Field::new("capture_id", DataType::Utf8, true), + Field::new("local_step", DataType::Int64, true), + Field::new("global_step", DataType::Int64, true), + Field::new("rank", DataType::Int64, true), + Field::new("bucket_kind", DataType::Utf8, true), + Field::new("bucket_name", DataType::Utf8, true), + Field::new("self_us", DataType::Int64, true), + Field::new("wall_us", DataType::Int64, true), + Field::new("calls", DataType::Int64, true), + Field::new("pct_of_capture", DataType::Float64, true), + Field::new("module_hint", DataType::Utf8, true), + ])) +} + +fn dict_opt_i64(dict: &Bound<'_, PyDict>, key: &str) -> Option { + dict.get_item(key) + .ok() + .flatten() + .and_then(|v| v.extract::().ok()) +} + +fn dict_opt_f64(dict: &Bound<'_, PyDict>, key: &str) -> Option { + dict.get_item(key) + .ok() + .flatten() + .and_then(|v| v.extract::().ok()) +} + +fn dict_opt_str(dict: &Bound<'_, PyDict>, key: &str) -> Option { + dict.get_item(key) + .ok() + .flatten() + .and_then(|v| v.extract::().ok()) +} + +fn empty_batch(schema: SchemaRef) -> TableResult { + let columns: Vec = schema + .fields() + .iter() + .map(|field| match field.data_type() { + DataType::Utf8 => Arc::new(StringArray::from(Vec::>::new())) as ArrayRef, + DataType::Float64 => { + Arc::new(Float64Array::from(Vec::>::new())) as ArrayRef + } + _ => Arc::new(Int64Array::from(Vec::>::new())) as ArrayRef, + }) + .collect(); + try_record_batch(schema, columns) +} + +pub fn profile_capture_batches() -> TableResult> { + Python::attach(|py| { + let schema = profile_capture_schema(); + let module = py.import("probing.profiling.torch_profiler.sql")?; + let raw = module.call_method0("profile_capture_rows")?; + let rows = raw.cast::()?; + if rows.is_empty() { + return Ok(vec![empty_batch(schema)?]); + } + + let mut capture_id = Vec::new(); + let mut local_step = Vec::new(); + let mut global_step = Vec::new(); + let mut rank = Vec::new(); + let mut world_size = Vec::new(); + let mut role = Vec::new(); + let mut trigger = Vec::new(); + let mut steps_profiled = Vec::new(); + let mut wall_us = Vec::new(); + let mut started_at_us = Vec::new(); + let mut ended_at_us = Vec::new(); + let mut status = Vec::new(); + let mut truncated = Vec::new(); + let mut event_count = Vec::new(); + let mut error = Vec::new(); + + for item in rows.iter() { + let dict = item + .cast::() + .map_err(|_| PythonTableError::BatchBuild("profile_capture row not dict".into()))?; + capture_id.push(dict_opt_str(dict, "capture_id")); + local_step.push(dict_opt_i64(dict, "local_step")); + global_step.push(dict_opt_i64(dict, "global_step")); + rank.push(dict_opt_i64(dict, "rank")); + world_size.push(dict_opt_i64(dict, "world_size")); + role.push(dict_opt_str(dict, "role")); + trigger.push(dict_opt_str(dict, "trigger")); + steps_profiled.push(dict_opt_i64(dict, "steps_profiled")); + wall_us.push(dict_opt_i64(dict, "wall_us")); + started_at_us.push(dict_opt_i64(dict, "started_at_us")); + ended_at_us.push(dict_opt_i64(dict, "ended_at_us")); + status.push(dict_opt_str(dict, "status")); + truncated.push(dict_opt_i64(dict, "truncated")); + event_count.push(dict_opt_i64(dict, "event_count")); + error.push(dict_opt_str(dict, "error")); + } + + let columns: Vec = vec![ + Arc::new(StringArray::from(capture_id)), + Arc::new(Int64Array::from(local_step)), + Arc::new(Int64Array::from(global_step)), + Arc::new(Int64Array::from(rank)), + Arc::new(Int64Array::from(world_size)), + Arc::new(StringArray::from(role)), + Arc::new(StringArray::from(trigger)), + Arc::new(Int64Array::from(steps_profiled)), + Arc::new(Int64Array::from(wall_us)), + Arc::new(Int64Array::from(started_at_us)), + Arc::new(Int64Array::from(ended_at_us)), + Arc::new(StringArray::from(status)), + Arc::new(Int64Array::from(truncated)), + Arc::new(Int64Array::from(event_count)), + Arc::new(StringArray::from(error)), + ]; + Ok(vec![try_record_batch(schema, columns)?]) + }) +} + +pub fn profile_hotspot_batches() -> TableResult> { + Python::attach(|py| { + let schema = profile_hotspot_schema(); + let module = py.import("probing.profiling.torch_profiler.sql")?; + let raw = module.call_method0("profile_hotspot_rows")?; + let rows = raw.cast::()?; + if rows.is_empty() { + return Ok(vec![empty_batch(schema)?]); + } + + let mut capture_id = Vec::new(); + let mut local_step = Vec::new(); + let mut global_step = Vec::new(); + let mut rank = Vec::new(); + let mut bucket_kind = Vec::new(); + let mut bucket_name = Vec::new(); + let mut self_us = Vec::new(); + let mut wall_us = Vec::new(); + let mut calls = Vec::new(); + let mut pct_of_capture = Vec::new(); + let mut module_hint = Vec::new(); + + for item in rows.iter() { + let dict = item + .cast::() + .map_err(|_| PythonTableError::BatchBuild("profile_hotspot row not dict".into()))?; + capture_id.push(dict_opt_str(dict, "capture_id")); + local_step.push(dict_opt_i64(dict, "local_step")); + global_step.push(dict_opt_i64(dict, "global_step")); + rank.push(dict_opt_i64(dict, "rank")); + bucket_kind.push(dict_opt_str(dict, "bucket_kind")); + bucket_name.push(dict_opt_str(dict, "bucket_name")); + self_us.push(dict_opt_i64(dict, "self_us")); + wall_us.push(dict_opt_i64(dict, "wall_us")); + calls.push(dict_opt_i64(dict, "calls")); + pct_of_capture.push(dict_opt_f64(dict, "pct_of_capture")); + module_hint.push(dict_opt_str(dict, "module_hint")); + } + + let columns: Vec = vec![ + Arc::new(StringArray::from(capture_id)), + Arc::new(Int64Array::from(local_step)), + Arc::new(Int64Array::from(global_step)), + Arc::new(Int64Array::from(rank)), + Arc::new(StringArray::from(bucket_kind)), + Arc::new(StringArray::from(bucket_name)), + Arc::new(Int64Array::from(self_us)), + Arc::new(Int64Array::from(wall_us)), + Arc::new(Int64Array::from(calls)), + Arc::new(Float64Array::from(pct_of_capture)), + Arc::new(StringArray::from(module_hint)), + ]; + Ok(vec![try_record_batch(schema, columns)?]) + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn profile_capture_schema_has_expected_columns() { + let schema = profile_capture_schema(); + for col in [ + "capture_id", + "local_step", + "global_step", + "rank", + "status", + "truncated", + "event_count", + ] { + assert!(schema.field_with_name(col).is_ok(), "missing column {col}"); + } + } + + #[test] + fn profile_hotspot_schema_has_expected_columns() { + let schema = profile_hotspot_schema(); + for col in [ + "capture_id", + "bucket_kind", + "bucket_name", + "self_us", + "pct_of_capture", + ] { + assert!(schema.field_with_name(col).is_ok(), "missing column {col}"); + } + } + + #[test] + fn empty_capture_batch_is_zero_rows_with_schema() { + let schema = profile_capture_schema(); + let batch = empty_batch(schema).expect("empty capture batch"); + assert_eq!(batch.num_rows(), 0); + assert!(batch.schema().field_with_name("capture_id").is_ok()); + } + + #[test] + fn empty_hotspot_batch_is_zero_rows_with_schema() { + let schema = profile_hotspot_schema(); + let batch = empty_batch(schema).expect("empty hotspot batch"); + assert_eq!(batch.num_rows(), 0); + assert!(batch.schema().field_with_name("bucket_name").is_ok()); + } +} diff --git a/probing/extensions/python/src/extensions/python/tbls.rs b/probing/extensions/python/src/extensions/python/tbls.rs index ed243c96..b56152af 100644 --- a/probing/extensions/python/src/extensions/python/tbls.rs +++ b/probing/extensions/python/src/extensions/python/tbls.rs @@ -44,7 +44,10 @@ impl From> for PythonTableError { } } -fn try_record_batch(schema: SchemaRef, columns: Vec) -> TableResult { +pub(crate) fn try_record_batch( + schema: SchemaRef, + columns: Vec, +) -> TableResult { RecordBatch::try_new(schema, columns).map_err(|e| PythonTableError::BatchBuild(e.to_string())) } @@ -218,7 +221,11 @@ impl CustomNamespace for PythonNamespace { // Extern tables (`probing.ExternalTable`) are mmap-backed and served // by the mmap SQL catalog (`probing_core::core::memtable_sql`), not // by this namespace. - vec!["backtrace".to_string()] + vec![ + "backtrace".to_string(), + "profile_capture".to_string(), + "profile_hotspot".to_string(), + ] } fn data(expr: &str) -> Vec { @@ -236,6 +243,22 @@ impl CustomNamespace for PythonNamespace { error_batch(&e.to_string()) } } + } else if expr == "profile_capture" { + match super::profile_sql::profile_capture_batches() { + Ok(batches) => batches, + Err(e) => { + error!("python.profile_capture: {e:?}"); + error_batch(&e.to_string()) + } + } + } else if expr == "profile_hotspot" { + match super::profile_sql::profile_hotspot_batches() { + Ok(batches) => batches, + Err(e) => { + error!("python.profile_hotspot: {e:?}"); + error_batch(&e.to_string()) + } + } } else if !expr.contains('.') { // Extern mmap tables (`comm_collective`, `torch_trace`, …) — not Python imports. debug!("python.{expr}: no live data (mmap empty or not created yet)"); diff --git a/probing/extensions/python/src/features/flamegraph.rs b/probing/extensions/python/src/features/flamegraph.rs index bbfa95c4..4cf2e584 100644 --- a/probing/extensions/python/src/features/flamegraph.rs +++ b/probing/extensions/python/src/features/flamegraph.rs @@ -26,6 +26,8 @@ pub struct FlamegraphOptions { pub subtitle: String, /// Torch explorer metric id (`duration`, `delta_mb`, `peak_mb`). pub metric: Option, + /// Override JSON `profile` (e.g. `torch-distributed`). + pub profile: Option, } impl Default for FlamegraphOptions { @@ -36,6 +38,7 @@ impl Default for FlamegraphOptions { kind: FlamegraphKind::Classic, subtitle: String::new(), metric: None, + profile: None, } } } @@ -102,11 +105,14 @@ impl Flamegraph { }; let frames = self.layout_frames(frame_height, width); let frames_json = frames_to_json(&frames, torch); - let profile = match options.kind { - FlamegraphKind::TorchModule if options.count_name == "samples" => "cpu-stack", - FlamegraphKind::TorchModule => "torch-module", - FlamegraphKind::Classic => "classic", - }; + let profile = options + .profile + .as_deref() + .unwrap_or_else(|| match options.kind { + FlamegraphKind::TorchModule if options.count_name == "samples" => "cpu-stack", + FlamegraphKind::TorchModule => "torch-module", + FlamegraphKind::Classic => "classic", + }); let mut payload = json!({ "profile": profile, "title": options.title, @@ -897,6 +903,7 @@ mod tests { kind: FlamegraphKind::TorchModule, subtitle: "Test subtitle".to_string(), metric: None, + profile: None, }); assert!(html.contains("probing-torch-module")); assert!(html.contains("torch-search")); @@ -904,6 +911,20 @@ mod tests { assert!(html.contains("Test subtitle")); } + #[test] + fn json_payload_profile_override() { + let fg = Flamegraph::from_folded_lines(&["forward;model 10".to_string()]).unwrap(); + let json = fg.json_payload(&FlamegraphOptions { + title: "T".to_string(), + count_name: "ns".to_string(), + kind: FlamegraphKind::TorchModule, + subtitle: "S".to_string(), + metric: Some("duration".to_string()), + profile: Some("torch-distributed".to_string()), + }); + assert!(json.contains("\"profile\":\"torch-distributed\"")); + } + #[test] fn json_payload_roundtrip_fields() { let fg = Flamegraph::from_folded_lines(&["forward;model 10".to_string()]).unwrap(); @@ -913,6 +934,7 @@ mod tests { kind: FlamegraphKind::TorchModule, subtitle: "S".to_string(), metric: Some("duration".to_string()), + profile: None, }); assert!(json.contains("\"profile\":\"torch-module\"")); assert!(json.contains("\"subtitle\":\"S\"")); diff --git a/probing/extensions/python/src/features/pprof.rs b/probing/extensions/python/src/features/pprof.rs index ccd81dfc..ec40551d 100644 --- a/probing/extensions/python/src/features/pprof.rs +++ b/probing/extensions/python/src/features/pprof.rs @@ -966,6 +966,7 @@ fn pprof_flamegraph_options() -> FlamegraphOptions { kind: FlamegraphKind::TorchModule, subtitle: "SIGPROF weighted stack samples".to_string(), metric: None, + profile: None, } } diff --git a/probing/extensions/python/src/features/torch.rs b/probing/extensions/python/src/features/torch.rs index cb972502..7438fd54 100644 --- a/probing/extensions/python/src/features/torch.rs +++ b/probing/extensions/python/src/features/torch.rs @@ -631,6 +631,7 @@ fn torch_flamegraph_options(metric: TorchMetric, subtitle: &str) -> FlamegraphOp kind: FlamegraphKind::TorchModule, subtitle: subtitle.to_string(), metric: Some(metric.id().to_string()), + profile: None, } } @@ -704,6 +705,270 @@ pub fn flamegraph_json(metric: Option<&str>) -> String { } } +#[derive(Debug, Clone)] +struct TorchTraceRow { + rank: i64, + local_step: i64, + module: String, + stage: String, + duration: f64, + allocated_delta: f64, + max_allocated_delta: f64, + allocated: f64, + max_allocated: f64, +} + +fn col_index(names: &[String], candidates: &[&str]) -> Option { + names.iter().position(|n| candidates.contains(&n.as_str())) +} + +fn parse_rank_col(ele: &probing_proto::types::Ele) -> i64 { + match ele { + probing_proto::types::Ele::I64(x) => *x, + probing_proto::types::Ele::I32(x) => *x as i64, + probing_proto::types::Ele::F64(x) => *x as i64, + probing_proto::types::Ele::F32(x) => *x as i64, + probing_proto::types::Ele::Text(s) => s.parse().unwrap_or(0), + _ => 0, + } +} + +fn parse_torch_trace_rows(data: &probing_proto::types::DataFrame) -> Vec { + let nrows = data.cols.first().map(|c| c.len()).unwrap_or(0); + if nrows == 0 { + return Vec::new(); + } + + let rank_idx = col_index(&data.names, &["rank", "_rank"]).unwrap_or(0); + let module_idx = col_index(&data.names, &["module"]).unwrap_or(1); + let stage_idx = col_index(&data.names, &["stage"]).unwrap_or(2); + let step_idx = col_index(&data.names, &["local_step", "step"]); + let duration_idx = col_index(&data.names, &["duration"]); + let alloc_delta_idx = col_index(&data.names, &["allocated_delta"]); + let max_alloc_delta_idx = col_index(&data.names, &["max_allocated_delta"]); + let allocated_idx = col_index(&data.names, &["allocated"]); + let max_allocated_idx = col_index(&data.names, &["max_allocated"]); + + let mut out = Vec::with_capacity(nrows); + for row in 0..nrows { + let rank = data + .cols + .get(rank_idx) + .map(|c| parse_rank_col(&c.get(row))) + .unwrap_or(0); + let local_step = step_idx + .and_then(|idx| data.cols.get(idx).and_then(|c| parse_i64_col(&c.get(row)))) + .unwrap_or(0); + let module = data + .cols + .get(module_idx) + .map(|c| parse_text_col(&c.get(row))) + .unwrap_or_default(); + let stage = data + .cols + .get(stage_idx) + .map(|c| parse_text_col(&c.get(row))) + .unwrap_or_default(); + let duration = duration_idx + .and_then(|idx| data.cols.get(idx).map(|c| parse_value_col(&c.get(row)))) + .unwrap_or(0.0); + let allocated_delta = alloc_delta_idx + .and_then(|idx| data.cols.get(idx).map(|c| parse_value_col(&c.get(row)))) + .unwrap_or(0.0); + let max_allocated_delta = max_alloc_delta_idx + .and_then(|idx| data.cols.get(idx).map(|c| parse_value_col(&c.get(row)))) + .unwrap_or(0.0); + let allocated = allocated_idx + .and_then(|idx| data.cols.get(idx).map(|c| parse_value_col(&c.get(row)))) + .unwrap_or(0.0); + let max_allocated = max_allocated_idx + .and_then(|idx| data.cols.get(idx).map(|c| parse_value_col(&c.get(row)))) + .unwrap_or(0.0); + + out.push(TorchTraceRow { + rank, + local_step, + module, + stage, + duration, + allocated_delta, + max_allocated_delta, + allocated, + max_allocated, + }); + } + out +} + +fn distributed_duration_lines(rows: &[TorchTraceRow]) -> Vec { + let post_rows = rows + .iter() + .filter(|r| r.stage.starts_with("post ") && r.duration > 0.0) + .map(|r| (r.module.clone(), r.stage.clone(), r.duration)) + .collect::>(); + build_folded_lines(post_rows, value_to_ns, false) +} + +fn distributed_memory_lines(rows: &[TorchTraceRow], use_peak: bool) -> Vec { + let mut value_rows = rows + .iter() + .filter(|r| r.stage.starts_with("post ")) + .filter_map(|r| { + let delta = if use_peak { + r.max_allocated_delta + } else { + r.allocated_delta + }; + (delta > 0.0).then_some((r.module.clone(), r.stage.clone(), delta)) + }) + .collect::>(); + + if value_rows.is_empty() { + let mut pre: HashMap<(String, String), (f64, f64)> = HashMap::new(); + for r in rows { + let (is_pre, phase) = match hook_phase(&r.stage) { + Some(v) => v, + None => continue, + }; + if is_pre { + pre.insert((r.module.clone(), phase), (r.allocated, r.max_allocated)); + } else if let Some((pre_alloc, pre_max)) = pre.get(&(r.module.clone(), phase)) { + let delta = if use_peak { + (r.max_allocated - *pre_max).max(0.0) + } else { + (r.allocated - *pre_alloc).max(0.0) + }; + if delta > 0.0 { + value_rows.push((r.module.clone(), r.stage.clone(), delta)); + } + } + } + } + + if value_rows.is_empty() { + value_rows = rows + .iter() + .filter(|r| r.stage.starts_with("post ")) + .filter_map(|r| { + let snapshot = if use_peak { + r.max_allocated + } else { + r.allocated + }; + (snapshot > 0.0).then_some((r.module.clone(), r.stage.clone(), snapshot)) + }) + .collect(); + } + + build_folded_lines(value_rows, value_to_micro_mb, true) +} + +/// Fold per-rank stacks at one training step; identical paths merge across ranks. +fn build_distributed_folded_lines( + data: &probing_proto::types::DataFrame, + metric: TorchMetric, +) -> (Vec, i64, usize) { + let rows = parse_torch_trace_rows(data); + if rows.is_empty() { + return (Vec::new(), 0, 0); + } + + let local_step = rows.iter().map(|r| r.local_step).max().unwrap_or(0); + let rank_count = rows.iter().map(|r| r.rank).collect::>().len(); + + let mut by_rank: BTreeMap> = BTreeMap::new(); + for row in rows { + by_rank.entry(row.rank).or_default().push(row); + } + + let mut all_lines = Vec::new(); + for (_rank, rank_rows) in by_rank { + let lines = match metric { + TorchMetric::Duration => distributed_duration_lines(&rank_rows), + TorchMetric::DeltaMb => distributed_memory_lines(&rank_rows, false), + TorchMetric::PeakMb => distributed_memory_lines(&rank_rows, true), + }; + all_lines.extend(lines); + } + + (all_lines, local_step, rank_count) +} + +fn distributed_flamegraph_subtitle( + metric: TorchMetric, + lines: &[String], + local_step: i64, + rank_count: usize, +) -> String { + let base = torch_flamegraph_subtitle(metric, lines); + format!( + "{base} · local_step {local_step} · {rank_count} ranks · SPMD snapshot (same step, merge identical stacks)" + ) +} + +fn distributed_torch_flamegraph_options(metric: TorchMetric, subtitle: &str) -> FlamegraphOptions { + FlamegraphOptions { + title: "Distributed module performance".to_string(), + count_name: metric.count_name().to_string(), + kind: FlamegraphKind::TorchModule, + subtitle: subtitle.to_string(), + metric: Some(metric.id().to_string()), + profile: Some("torch-distributed".to_string()), + } +} + +/// JSON flamegraph from a federated or local ``torch_trace`` snapshot at one ``local_step``. +pub fn distributed_flamegraph_json_from_df( + data: &probing_proto::types::DataFrame, + metric: Option<&str>, +) -> String { + let metric = TorchMetric::parse(metric); + + let empty = |msg: &str, subtitle: &str| { + json!({ + "profile": "torch-distributed", + "title": "Distributed module performance", + "subtitle": subtitle, + "countName": metric.count_name(), + "metric": metric.id(), + "total": 0, + "width": 1400.0, + "frameHeight": 32.0, + "frames": [], + "emptyMessage": msg, + }) + .to_string() + }; + + let (lines, local_step, rank_count) = build_distributed_folded_lines(data, metric); + if lines.is_empty() { + let subtitle = format!( + "{} · no rows for local_step {}", + metric.subtitle(), + if local_step > 0 { + local_step.to_string() + } else { + "(latest)".to_string() + } + ); + return empty( + "No torch_trace rows for this step (enable torch profiling and run training)", + &subtitle, + ); + } + + let subtitle = distributed_flamegraph_subtitle(metric, &lines, local_step, rank_count); + let opts = distributed_torch_flamegraph_options(metric, &subtitle); + + match Flamegraph::from_folded_lines(&lines) { + Some(fg) => fg.json_payload(&opts), + None => empty( + "No torch_trace samples after folding", + &format!("{subtitle} · rank_count={rank_count}"), + ), + } +} + #[cfg(test)] mod tests { use super::*; @@ -974,4 +1239,222 @@ mod tests { .iter() .any(|l| l.starts_with("forward;conv1; 2000000"))); } + + #[test] + fn distributed_merge_identical_stacks_across_ranks() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec![ + "rank".into(), + "module".into(), + "stage".into(), + "duration".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![0, 1]), + Seq::SeqText(vec!["layer".into(), "layer".into()]), + Seq::SeqText(vec!["post forward".into(), "post forward".into()]), + Seq::SeqF64(vec![0.01, 0.01]), + Seq::SeqI64(vec![5, 5]), + ], + ); + + let (lines, step, rank_count) = build_distributed_folded_lines(&df, TorchMetric::Duration); + assert_eq!(step, 5); + assert_eq!(rank_count, 2); + assert_eq!(lines.len(), 2); + let json = distributed_flamegraph_json_from_df(&df, None); + assert!(json.contains("\"total\":20000000")); + } + + #[test] + fn distributed_split_different_module_paths() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec![ + "rank".into(), + "module".into(), + "stage".into(), + "duration".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![0, 1]), + Seq::SeqText(vec!["layer.a".into(), "layer.b".into()]), + Seq::SeqText(vec!["post forward".into(), "post forward".into()]), + Seq::SeqF64(vec![0.01, 0.02]), + Seq::SeqI64(vec![3, 3]), + ], + ); + + let (lines, _, rank_count) = build_distributed_folded_lines(&df, TorchMetric::Duration); + assert_eq!(rank_count, 2); + assert!(lines.iter().any(|l| l.starts_with("forward;layer;a;"))); + assert!(lines.iter().any(|l| l.starts_with("forward;layer;b;"))); + let json = distributed_flamegraph_json_from_df(&df, None); + assert!(json.contains("\"total\":30000000")); + } + + #[test] + fn distributed_flamegraph_json_profile_tag() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec![ + "rank".into(), + "module".into(), + "stage".into(), + "duration".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![0]), + Seq::SeqText(vec!["m".into()]), + Seq::SeqText(vec!["post forward".into()]), + Seq::SeqF64(vec![0.001]), + Seq::SeqI64(vec![1]), + ], + ); + + let json = distributed_flamegraph_json_from_df(&df, None); + assert!(json.contains("\"profile\":\"torch-distributed\"")); + assert!(json.contains("local_step 1")); + } + + #[test] + fn distributed_federation_rank_column() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec![ + "_rank".into(), + "module".into(), + "stage".into(), + "duration".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![2, 3]), + Seq::SeqText(vec!["layer".into(), "layer".into()]), + Seq::SeqText(vec!["post forward".into(), "post forward".into()]), + Seq::SeqF64(vec![0.005, 0.005]), + Seq::SeqI64(vec![9, 9]), + ], + ); + + let (lines, step, rank_count) = build_distributed_folded_lines(&df, TorchMetric::Duration); + assert_eq!(step, 9); + assert_eq!(rank_count, 2); + let json = distributed_flamegraph_json_from_df(&df, None); + assert!(json.contains("\"total\":10000000")); + assert_eq!(lines.len(), 2); + } + + #[test] + fn distributed_memory_delta_mb_merge() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec![ + "rank".into(), + "module".into(), + "stage".into(), + "allocated_delta".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![0, 1]), + Seq::SeqText(vec!["layer".into(), "layer".into()]), + Seq::SeqText(vec!["post forward".into(), "post forward".into()]), + Seq::SeqF64(vec![1.0, 1.5]), + Seq::SeqI64(vec![4, 4]), + ], + ); + + let json = distributed_flamegraph_json_from_df(&df, Some("delta_mb")); + assert!(json.contains("\"metric\":\"delta_mb\"")); + assert!(json.contains("\"total\":2500000")); + } + + #[test] + fn distributed_hierarchy_merges_shared_parent() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec![ + "rank".into(), + "module".into(), + "stage".into(), + "duration".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![0, 0, 1, 1]), + Seq::SeqText(vec![ + "model.layer".into(), + "model.layer.conv".into(), + "model.layer".into(), + "model.layer.conv".into(), + ]), + Seq::SeqText(vec![ + "post forward".into(), + "post forward".into(), + "post forward".into(), + "post forward".into(), + ]), + Seq::SeqF64(vec![0.01, 0.006, 0.01, 0.004]), + Seq::SeqI64(vec![2, 2, 2, 2]), + ], + ); + + let json = distributed_flamegraph_json_from_df(&df, None); + assert!(json.contains("\"frames\":[")); + assert!(!json.contains("\"emptyMessage\"")); + let payload: serde_json::Value = serde_json::from_str(&json).expect("json"); + assert_eq!(payload["profile"], "torch-distributed"); + assert!(payload["total"].as_u64().unwrap_or(0) > 0); + } + + #[test] + fn distributed_prefers_training_rank_over_federation_tag() { + use probing_proto::types::{DataFrame, Seq}; + + let df = DataFrame::new( + vec![ + "rank".into(), + "_rank".into(), + "module".into(), + "stage".into(), + "duration".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![3]), + Seq::SeqI64(vec![99]), + Seq::SeqText(vec!["layer".into()]), + Seq::SeqText(vec!["post forward".into()]), + Seq::SeqF64(vec![0.01]), + Seq::SeqI64(vec![1]), + ], + ); + + let (lines, _, rank_count) = build_distributed_folded_lines(&df, TorchMetric::Duration); + assert_eq!(rank_count, 1); + let json = distributed_flamegraph_json_from_df(&df, None); + assert!(json.contains("\"total\":10000000")); + assert_eq!(lines.len(), 1); + } + + #[test] + fn distributed_empty_dataframe_returns_empty_message() { + use probing_proto::types::DataFrame; + + let df = DataFrame::new(vec![], vec![]); + let json = distributed_flamegraph_json_from_df(&df, None); + assert!(json.contains("\"emptyMessage\"")); + assert!(json.contains("\"total\":0")); + } } diff --git a/probing/server/API.md b/probing/server/API.md index 0a80a6d3..b8c98c2e 100644 --- a/probing/server/API.md +++ b/probing/server/API.md @@ -22,6 +22,7 @@ Registered in `server/api/mod.rs`: | GET | `/apis/files?path=…` | Read workspace file | | GET/PUT | `/apis/nodes` | Cluster node list / register | | GET | `/apis/training/step_matrix` | Cross-rank train.step samples (`cluster=false` default; set `cluster=true` for on-demand fan-out) | +| GET | `/apis/training/distributed_flamegraph/json` | SPMD torch module flamegraph at one `local_step` (`?step=` optional, `?metric=duration\|delta_mb\|peak_mb`, `cluster=true` default) | | POST | `/apis/cluster/query` | On-demand SQL fan-out (`{"expr":"…","cluster":true}`; read-only SQL only) | Flamegraphs are served by profiler extensions (extension fallback, not public routes): @@ -63,7 +64,10 @@ All handlers live in `python/probing/handlers/pythonext.py`, one canonical local | GET | `/apis/pythonext/trace/variables` | `trace/variables` | | GET | `/apis/pythonext/trace/chrome-tracing` | `trace/chrome-tracing` | | GET | `/apis/pythonext/pytorch/timeline` | `pytorch/timeline` | -| GET | `/apis/pythonext/pytorch/profile` | `pytorch/profile` | +| GET | `/apis/pythonext/pytorch/profile` | `pytorch/profile` — start profiler (legacy) | +| GET | `/apis/pythonext/pytorch/profile/start` | `pytorch/profile/start` — `steps`, `trigger` | +| GET | `/apis/pythonext/pytorch/profile/stop` | `pytorch/profile/stop` — finalize capture | +| GET | `/apis/pythonext/pytorch/profile/status` | `pytorch/profile/status` | | GET | `/apis/pythonext/ray/timeline` | `ray/timeline` | | GET | `/apis/pythonext/ray/timeline/chrome` | `ray/timeline/chrome` | | GET | `/apis/pythonext/magics` | `magics` | diff --git a/probing/server/src/server/api/mod.rs b/probing/server/src/server/api/mod.rs index 51f2441a..36ba9506 100644 --- a/probing/server/src/server/api/mod.rs +++ b/probing/server/src/server/api/mod.rs @@ -20,6 +20,7 @@ pub const PUBLIC_API_ROUTES: &[(&str, &str)] = &[ ("GET", "/nodes"), ("PUT", "/nodes"), ("GET", "/training/step_matrix"), + ("GET", "/training/distributed_flamegraph/json"), ("POST", "/cluster/query"), ]; @@ -35,6 +36,10 @@ fn public_routes() -> Router { .route("/files", get(file_api::read_file)) .route("/nodes", get(cluster::get_nodes).put(cluster::put_node)) .route("/training/step_matrix", get(training::get_step_matrix)) + .route( + "/training/distributed_flamegraph/json", + get(training::get_distributed_flamegraph_json), + ) .route("/cluster/query", post(cluster_query::post_cluster_query)) } diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index 4e72b1f9..b5631f7b 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -336,6 +336,83 @@ fn ele_as_f64(v: Option) -> f64 { } } +#[derive(Debug, Deserialize)] +pub struct DistributedFlamegraphParams { + pub step: Option, + pub metric: Option, + pub cluster: Option, +} + +/// SQL for one ``local_step`` snapshot of ``torch_trace`` across ranks (federated or local). +/// +/// Uses the row's training ``rank`` column (not federation ``_rank`` tags, which are added +/// after fan-out merge). ``COALESCE(_rank, …)`` breaks local ``python.torch_trace`` scans. +pub fn distributed_torch_trace_sql(table: &str, step: Option) -> String { + let step_pred = match step { + Some(s) => format!("local_step = {s}"), + None => format!("local_step = (SELECT max(local_step) FROM {table})"), + }; + format!( + r#" +SELECT + CAST(COALESCE(rank, 0) AS BIGINT) AS rank, + module, + stage, + CAST(duration AS DOUBLE) AS duration, + CAST(allocated_delta AS DOUBLE) AS allocated_delta, + CAST(max_allocated_delta AS DOUBLE) AS max_allocated_delta, + CAST(allocated AS DOUBLE) AS allocated, + CAST(max_allocated AS DOUBLE) AS max_allocated, + CAST(local_step AS BIGINT) AS local_step +FROM {table} +WHERE {step_pred} + AND module <> 'None' + AND (stage LIKE 'post %' OR stage LIKE 'pre %') +"# + ) +} + +/// SPMD flamegraph: same ``local_step``, all ranks — identical stacks merge, divergent paths split. +pub async fn get_distributed_flamegraph_json( + axum::extract::Query(params): axum::extract::Query, +) -> impl IntoResponse { + use axum::http::header; + + if let Some(msg) = crate::engine_lifecycle::engine_not_ready_message() { + return ApiError::service_unavailable(msg).into_response(); + } + let cluster = params.cluster.unwrap_or(true); + let table = if cluster { + "global.python.torch_trace" + } else { + "python.torch_trace" + }; + let sql = distributed_torch_trace_sql(table, params.step); + + let fanout = match cluster_fanout::fanout_query( + &sql, + cluster, + false, + cluster_fanout::ClusterFanoutScope::Auto, + ) + .await + { + Ok(f) => f, + Err(err) => return ApiError::from(err).into_response(), + }; + let partial = fanout.meta.partial; + let body = probing_python::features::torch::distributed_flamegraph_json_from_df( + &fanout.dataframe, + params.metric.as_deref(), + ); + let status = if partial { + StatusCode::SERVICE_UNAVAILABLE + } else { + StatusCode::OK + }; + (status, [(header::CONTENT_TYPE, "application/json")], body).into_response() +} + #[cfg(test)] mod tests { use super::*; @@ -347,6 +424,17 @@ mod tests { assert!(sql_has_limit(STEP_MATRIX_SQL)); } + #[test] + fn distributed_torch_sql_valid_for_global_fanout() { + use probing_core::core::federation::validate_global_query; + let sql = super::distributed_torch_trace_sql("global.python.torch_trace", Some(42)); + assert!(sql.contains("local_step = 42")); + assert!(sql.contains("COALESCE(rank, 0)")); + assert!(validate_global_query(&sql).is_ok()); + let latest = super::distributed_torch_trace_sql("global.python.torch_trace", None); + assert!(latest.contains("max(local_step)")); + } + #[test] fn aggregate_normalizes_legacy_single_process_rank() { let rows = vec![RawStepRow { diff --git a/python/probing/handlers/pythonext.py b/python/probing/handlers/pythonext.py index b100c1e0..91373bdf 100644 --- a/python/probing/handlers/pythonext.py +++ b/python/probing/handlers/pythonext.py @@ -399,24 +399,19 @@ def get_pytorch_timeline() -> str: @ext_handler("pythonext", "pytorch/profile") -def start_pytorch_profile(steps: int = 1) -> str: - """Start PyTorch global profiler. - - Args: - steps: Number of steps to profile - - Returns: - JSON string with success status - """ +def start_pytorch_profile(steps: int = 1, trigger: str = "http") -> str: + """Start PyTorch global profiler (legacy path).""" try: - # Use global profiler - call _start_global_profiler via _cmd_profile from probing.repl.torch_magic import TorchMagic - shell = None - torch_magic = TorchMagic(shell) - torch_magic._start_global_profiler(steps) + torch_magic = TorchMagic(None) + torch_magic._start_global_profiler(steps, trigger=trigger) return json.dumps( - {"success": True, "message": f"Global profiler started for {steps} step(s)"} + { + "success": True, + "message": f"Global profiler started for {steps} step(s)", + "trigger": trigger, + } ) except Exception as e: return json.dumps( @@ -424,6 +419,37 @@ def start_pytorch_profile(steps: int = 1) -> str: ) +@ext_handler("pythonext", "pytorch/profile/start") +def start_pytorch_profile_v2(steps: int = 1, trigger: str = "http") -> str: + """Start on-demand torch.profiler capture.""" + return start_pytorch_profile(steps=steps, trigger=trigger) + + +@ext_handler("pythonext", "pytorch/profile/stop") +def stop_pytorch_profile() -> str: + """Stop profiler early and materialize profile_capture / profile_hotspot rows.""" + try: + from probing.profiling.torch_profiler import get_controller + + capture_id = get_controller().stop() + return json.dumps({"success": True, "capture_id": capture_id}) + except Exception as e: + return json.dumps( + {"success": False, "error": str(e), "traceback": traceback.format_exc()} + ) + + +@ext_handler("pythonext", "pytorch/profile/status") +def pytorch_profile_status() -> str: + """Profiler running state and latest capture id.""" + try: + from probing.profiling.torch_profiler import profiler_status + + return json.dumps(profiler_status()) + except Exception as e: + return json.dumps({"error": str(e), "traceback": traceback.format_exc()}) + + @ext_handler("pythonext", "flight-recorder/snapshot") def snapshot_flight_recorder( include_stack_traces: bool = True, diff --git a/python/probing/profiling/torch_profiler/__init__.py b/python/probing/profiling/torch_profiler/__init__.py new file mode 100644 index 00000000..0608bd34 --- /dev/null +++ b/python/probing/profiling/torch_profiler/__init__.py @@ -0,0 +1,12 @@ +"""On-demand torch.profiler → conclusion-driven SQL tables (profile_capture / profile_hotspot).""" + +from .controller import ProfilerController, get_controller, profiler_status +from .session_store import SessionStore, get_session_store + +__all__ = [ + "ProfilerController", + "SessionStore", + "get_controller", + "get_session_store", + "profiler_status", +] diff --git a/python/probing/profiling/torch_profiler/adaptor.py b/python/probing/profiling/torch_profiler/adaptor.py new file mode 100644 index 00000000..aeba771d --- /dev/null +++ b/python/probing/profiling/torch_profiler/adaptor.py @@ -0,0 +1,209 @@ +"""Compile torch.profiler output into profile_capture + profile_hotspot rows.""" + +from __future__ import annotations + +import logging +import os +import time +import uuid +from dataclasses import dataclass +from typing import Any, Optional + +from probing.parallel import current_role +from probing.tracing.coordinates import row_fields +from probing.tracing import step + +from .session_store import CaptureRecord, HotspotRecord + +logger = logging.getLogger(__name__) + + +def _max_events() -> int: + raw = os.environ.get("PROBING_TORCH_PROFILER_MAX_EVENTS", "200000").strip() + try: + value = int(raw) + except ValueError: + return 200000 + return max(value, 1000) + + +@dataclass +class _BucketAgg: + bucket_kind: str + bucket_name: str + self_us: int = 0 + wall_us: int = 0 + calls: int = 0 + + +def _bucket_kind_for_name(name: str) -> str: + lower = name.lower() + if "nccl" in lower: + return "collective" + if "memcpy" in lower or lower.startswith("memcpy"): + return "memcpy" + if "cudadevicesynchronize" in lower or "cudastreamsynchronize" in lower: + return "cuda_runtime" + if lower.startswith("cuda") and ( + "launch" in lower or "malloc" in lower or "free" in lower or "sync" in lower + ): + return "cuda_runtime" + if lower.startswith("aten::") or lower.startswith("autograd::"): + return "cpu_op" + return "kernel" + + +def _event_name(event: Any) -> str: + for attr in ("key", "name"): + value = getattr(event, attr, None) + if value: + return str(value) + return "unknown" + + +def _event_self_us(event: Any) -> int: + cuda = int(getattr(event, "self_cuda_time_total", 0) or 0) + cpu = int(getattr(event, "self_cpu_time_total", 0) or 0) + return cuda if cuda > 0 else cpu + + +def _event_wall_us(event: Any) -> int: + cuda = int(getattr(event, "cuda_time_total", 0) or 0) + cpu = int(getattr(event, "cpu_time_total", 0) or 0) + return cuda if cuda > 0 else cpu + + +def _event_calls(event: Any) -> int: + return max(int(getattr(event, "count", 0) or 0), 1) + + +def compile_key_averages( + events: list[Any], + *, + trigger: str, + steps_profiled: int, + started_at_us: int, + ended_at_us: int, + capture_id: Optional[str] = None, + status: str = "completed", + error: str = "", +) -> tuple[CaptureRecord, list[HotspotRecord]]: + """Build capture + hotspot rows from profiler key_averages() events.""" + coords = row_fields(step.snapshot()) + rank = int(coords.get("rank", -1)) + local_step = int(coords.get("local_step", -1)) + global_step = int(coords.get("global_step", -1)) + + truncated = False + original_event_count = len(events) + max_events = _max_events() + if original_event_count > max_events: + truncated = True + events = events[:max_events] + + aggs: dict[tuple[str, str], _BucketAgg] = {} + for event in events: + name = _event_name(event) + kind = _bucket_kind_for_name(name) + key = (kind, name) + agg = aggs.get(key) + if agg is None: + agg = _BucketAgg(bucket_kind=kind, bucket_name=name) + aggs[key] = agg + agg.self_us += _event_self_us(event) + agg.wall_us += _event_wall_us(event) + agg.calls += _event_calls(event) + + total_self_us = sum(a.self_us for a in aggs.values()) + wall_us = max(ended_at_us - started_at_us, 0) + if wall_us <= 0: + wall_us = total_self_us + + capture = CaptureRecord( + capture_id=capture_id or uuid.uuid4().hex, + local_step=local_step, + global_step=global_step, + rank=rank, + world_size=int(coords.get("world_size", -1)), + role=current_role(), + trigger=trigger, + steps_profiled=steps_profiled, + wall_us=wall_us, + started_at_us=started_at_us, + ended_at_us=ended_at_us, + status=status, + truncated=truncated, + event_count=original_event_count, + error=error, + ) + + hotspots: list[HotspotRecord] = [] + denom = wall_us if wall_us > 0 else max(total_self_us, 1) + for agg in sorted(aggs.values(), key=lambda a: a.self_us, reverse=True): + hotspots.append( + HotspotRecord( + capture_id=capture.capture_id, + local_step=local_step, + global_step=global_step, + rank=rank, + bucket_kind=agg.bucket_kind, + bucket_name=agg.bucket_name, + self_us=agg.self_us, + wall_us=agg.wall_us, + calls=agg.calls, + pct_of_capture=agg.self_us / denom, + ) + ) + return capture, hotspots + + +def compile_from_profiler( + profiler: Any, + *, + trigger: str, + steps_profiled: int, + started_at_us: int, + ended_at_us: Optional[int] = None, + capture_id: Optional[str] = None, + status: str = "completed", + error: str = "", +) -> tuple[CaptureRecord, list[HotspotRecord]]: + """Compile a finished torch.profiler profile into SQL rows.""" + end_us = ended_at_us if ended_at_us is not None else _now_us() + events: list[Any] = [] + out_status = status + out_error = error + try: + averages = profiler.key_averages() + events = list(averages) if averages is not None else [] + except Exception as exc: + logger.debug("profiler.key_averages failed: %s", exc) + out_error = out_error or str(exc) + + if not events: + try: + raw = profiler.events() + events = list(raw) if raw is not None else [] + except Exception as exc: + logger.debug("profiler.events fallback failed: %s", exc) + out_error = out_error or str(exc) + + if not events and out_error and out_status == "completed": + out_status = "failed" + elif events and out_status == "completed": + out_error = "" + + return compile_key_averages( + events, + trigger=trigger, + steps_profiled=steps_profiled, + started_at_us=started_at_us, + ended_at_us=end_us, + capture_id=capture_id, + status=out_status, + error=out_error, + ) + + +def _now_us() -> int: + return int(time.time() * 1_000_000) diff --git a/python/probing/profiling/torch_profiler/controller.py b/python/probing/profiling/torch_profiler/controller.py new file mode 100644 index 00000000..3d47b8fb --- /dev/null +++ b/python/probing/profiling/torch_profiler/controller.py @@ -0,0 +1,269 @@ +"""ProfilerController: short-window torch.profiler with SQL row materialization.""" + +from __future__ import annotations + +import json +import logging +import os +import tempfile +import threading +import time +from typing import Any, Optional + +from .adaptor import compile_from_profiler +from .session_store import CaptureRecord, get_session_store + +logger = logging.getLogger(__name__) + +try: + import torch + + HAS_TORCH = True +except ImportError: + HAS_TORCH = False + torch = None # type: ignore[assignment,misc] + + +def _now_us() -> int: + return int(time.time() * 1_000_000) + + +class ProfilerController: + """Drive torch.profiler for N optimizer steps and publish hotspot rows.""" + + def __init__(self) -> None: + self._lock = threading.RLock() + self._profiler: Any = None + self._hook_handle: Any = None + self._steps_target = 0 + self._step_count = 0 + self._trigger = "" + self._started_at_us = 0 + self._cached_timeline: Optional[str] = None + self._timeline_exported = False + self._running = False + + @property + def is_running(self) -> bool: + with self._lock: + return self._running + + def status(self) -> dict[str, Any]: + with self._lock: + latest = get_session_store().latest_capture_id() + return { + "running": self._running, + "steps_target": self._steps_target, + "steps_completed": self._step_count, + "trigger": self._trigger, + "latest_capture_id": latest, + } + + def start(self, *, steps: int = 1, trigger: str = "manual") -> None: + if not HAS_TORCH: + raise ImportError("PyTorch is not installed") + + steps = max(int(steps), 1) + with self._lock: + if self._running: + raise RuntimeError("profiler already running") + self._steps_target = steps + self._step_count = 0 + self._trigger = trigger + self._started_at_us = _now_us() + self._cached_timeline = None + self._timeline_exported = False + self._running = True + + activities = [torch.profiler.ProfilerActivity.CPU] + if torch.cuda.is_available(): + activities.append(torch.profiler.ProfilerActivity.CUDA) + + self._profiler = torch.profiler.profile( + record_shapes=True, + with_stack=True, + with_flops=True, + activities=activities, + on_trace_ready=None, + ) + + from torch.optim.optimizer import register_optimizer_step_post_hook + + controller = self + + def profiler_step_hook(optimizer, *args, **kwargs): + del optimizer, args, kwargs + with controller._lock: + if controller._profiler is None or not controller._running: + return + if controller._step_count == 0: + controller._profiler.__enter__() + logger.info( + "torch profiler started (trigger=%s, steps=%d)", + controller._trigger, + controller._steps_target, + ) + if controller._step_count >= controller._steps_target: + return + try: + controller._profiler.step() + controller._step_count += 1 + if controller._step_count >= controller._steps_target: + controller._finalize_capture(status="completed") + except RuntimeError as exc: + controller._finalize_capture(status="failed", error=str(exc)) + + self._hook_handle = register_optimizer_step_post_hook(profiler_step_hook) + + def stop(self) -> Optional[str]: + """Stop early; returns capture_id when a capture was materialized.""" + with self._lock: + if not self._running: + return get_session_store().latest_capture_id() + return self._finalize_capture(status="completed") + + def summary(self) -> None: + with self._lock: + profiler = self._profiler + if profiler is None: + logger.info("profiler not initialized") + return + try: + events = profiler.events() + event_list = list(events) if events else [] + if event_list: + table = profiler.key_averages().table( + sort_by="self_cuda_time_total", row_limit=10 + ) + logger.info("profiler collected %d events\n%s", len(event_list), table) + else: + logger.info( + "profiler has no events (steps %d/%d)", + self._step_count, + self._steps_target, + ) + except Exception as exc: + logger.debug("profiler summary failed: %s", exc) + + def export_timeline(self) -> Optional[str]: + with self._lock: + if self._timeline_exported and self._cached_timeline is not None: + return self._cached_timeline + profiler = self._profiler + if profiler is None: + return None + try: + tmp_fd, tmp_path = tempfile.mkstemp(suffix=".json", text=True) + os.close(tmp_fd) + try: + profiler.export_chrome_trace(tmp_path) + with open(tmp_path, encoding="utf-8") as handle: + trace_json = handle.read() + parsed = json.loads(trace_json) + if not parsed.get("traceEvents"): + return None + with self._lock: + self._cached_timeline = trace_json + self._timeline_exported = True + return trace_json + finally: + try: + os.unlink(tmp_path) + except OSError: + pass + except Exception as exc: + logger.debug("timeline export failed: %s", exc) + return None + + def _remove_hook(self) -> None: + if self._hook_handle is None: + return + try: + from torch.optim.optimizer import remove_optimizer_step_post_hook + + remove_optimizer_step_post_hook(self._hook_handle) + except Exception as exc: + logger.debug("failed to remove optimizer hook: %s", exc) + self._hook_handle = None + + def _finalize_capture( + self, *, status: str = "completed", error: str = "" + ) -> Optional[str]: + if not self._running and self._profiler is None: + return get_session_store().latest_capture_id() + + self._remove_hook() + profiler = self._profiler + started = self._started_at_us + trigger = self._trigger + steps_done = self._step_count + self._running = False + self._profiler = None + + capture: Optional[CaptureRecord] = None + if profiler is not None: + try: + profiler.__exit__(None, None, None) + except Exception as exc: + logger.debug("profiler exit: %s", exc) + if status == "completed": + status = "failed" + error = error or str(exc) + try: + capture, hotspots = compile_from_profiler( + profiler, + trigger=trigger, + steps_profiled=steps_done, + started_at_us=started, + status=status, + error=error, + ) + get_session_store().add_capture(capture, hotspots) + logger.info( + "profile capture %s: %d hotspots, step=%d status=%s", + capture.capture_id, + len(hotspots), + capture.local_step, + capture.status, + ) + except Exception as exc: + logger.warning("failed to compile profile capture: %s", exc) + return capture.capture_id if capture is not None else None + + +_CONTROLLER: Optional[ProfilerController] = None +_CONTROLLER_LOCK = threading.Lock() + + +def get_controller() -> ProfilerController: + global _CONTROLLER + with _CONTROLLER_LOCK: + if _CONTROLLER is None: + _CONTROLLER = ProfilerController() + return _CONTROLLER + + +def reset_controller_for_tests() -> None: + """Drop singleton controller between tests (not for production).""" + global _CONTROLLER + with _CONTROLLER_LOCK: + if _CONTROLLER is not None: + with _CONTROLLER._lock: + if _CONTROLLER._running: + _CONTROLLER._finalize_capture(status="failed", error="test reset") + else: + _CONTROLLER._remove_hook() + _CONTROLLER._profiler = None + _CONTROLLER = None + + +def reset_torch_profiler_for_tests() -> None: + """Reset session store + controller (test helper).""" + from .session_store import reset_session_store_for_tests + + reset_controller_for_tests() + reset_session_store_for_tests() + + +def profiler_status() -> dict[str, Any]: + return get_controller().status() diff --git a/python/probing/profiling/torch_profiler/session_store.py b/python/probing/profiling/torch_profiler/session_store.py new file mode 100644 index 00000000..c7f2affc --- /dev/null +++ b/python/probing/profiling/torch_profiler/session_store.py @@ -0,0 +1,116 @@ +"""In-process store for profile captures and hotspot rows (no memtable).""" + +from __future__ import annotations + +import os +import threading +from dataclasses import dataclass, field +from typing import Optional + + +def _max_sessions() -> int: + raw = os.environ.get("PROBING_TORCH_PROFILER_MAX_SESSIONS", "8").strip() + try: + value = int(raw) + except ValueError: + return 8 + return max(value, 1) + + +@dataclass +class CaptureRecord: + capture_id: str + local_step: int = -1 + global_step: int = -1 + rank: int = -1 + world_size: int = -1 + role: str = "" + trigger: str = "" + steps_profiled: int = 0 + wall_us: int = 0 + started_at_us: int = 0 + ended_at_us: int = 0 + status: str = "running" + truncated: bool = False + event_count: int = 0 + error: str = "" + + +@dataclass +class HotspotRecord: + capture_id: str + local_step: int = -1 + global_step: int = -1 + rank: int = -1 + bucket_kind: str = "other" + bucket_name: str = "" + self_us: int = 0 + wall_us: int = 0 + calls: int = 0 + pct_of_capture: float = 0.0 + module_hint: str = "" + + +@dataclass +class SessionStore: + """Bounded in-memory captures + hotspot fact rows.""" + + max_sessions: int = field(default_factory=_max_sessions) + _captures: list[CaptureRecord] = field(default_factory=list) + _hotspots: list[HotspotRecord] = field(default_factory=list) + _lock: threading.RLock = field(default_factory=threading.RLock) + + def add_capture( + self, + capture: CaptureRecord, + hotspots: list[HotspotRecord], + ) -> None: + with self._lock: + self._captures.append(capture) + self._hotspots.extend(hotspots) + overflow = len(self._captures) - self.max_sessions + if overflow > 0: + drop_ids = {c.capture_id for c in self._captures[:overflow]} + self._captures = self._captures[overflow:] + self._hotspots = [ + h for h in self._hotspots if h.capture_id not in drop_ids + ] + + def captures(self) -> list[CaptureRecord]: + with self._lock: + return list(self._captures) + + def hotspots(self) -> list[HotspotRecord]: + with self._lock: + return list(self._hotspots) + + def latest_capture_id(self) -> Optional[str]: + with self._lock: + if not self._captures: + return None + return self._captures[-1].capture_id + + def clear(self) -> None: + with self._lock: + self._captures.clear() + self._hotspots.clear() + + +_STORE: Optional[SessionStore] = None +_STORE_LOCK = threading.Lock() + + +def get_session_store() -> SessionStore: + global _STORE + with _STORE_LOCK: + if _STORE is None: + _STORE = SessionStore() + return _STORE + + +def reset_session_store_for_tests() -> None: + """Clear captures/hotspots between tests (not for production).""" + global _STORE + with _STORE_LOCK: + if _STORE is not None: + _STORE.clear() diff --git a/python/probing/profiling/torch_profiler/sql.py b/python/probing/profiling/torch_profiler/sql.py new file mode 100644 index 00000000..2bab046e --- /dev/null +++ b/python/probing/profiling/torch_profiler/sql.py @@ -0,0 +1,114 @@ +"""SQL row providers for python.profile_capture and python.profile_hotspot.""" + +from __future__ import annotations + +from typing import Any + +import probing + +from .session_store import CaptureRecord, HotspotRecord, get_session_store + +_CAPTURE_DOC = ( + "On-demand torch.profiler capture anchor (step, rank, quality metadata). " + "One row per profile window." +) +_HOTSPOT_DOC = ( + "Conclusion fact table: aggregated kernel/op time buckets per capture. " + "Fed by KinetoSqlAdaptor at finalize." +) + +_COLUMN_DOCS: dict[str, dict[str, str]] = { + "profile_capture": { + "capture_id": "Unique capture id (join key)", + "local_step": "Per-rank training step at finalize", + "global_step": "Global training step at finalize", + "rank": "torch.distributed rank (-1 unknown)", + "world_size": "World size (-1 unknown)", + "role": "Parallel role key (dp=…,pp=…)", + "trigger": "Who started capture (manual, skill, http)", + "steps_profiled": "Profiler window length in optimizer steps", + "wall_us": "Capture wall time (microseconds); Q2 denominator", + "started_at_us": "Capture start (epoch microseconds)", + "ended_at_us": "Capture end (epoch microseconds)", + "status": "running | completed | failed", + "truncated": "1 if event list was truncated", + "event_count": "Raw profiler event count before aggregation", + "error": "Failure message when status=failed", + }, + "profile_hotspot": { + "capture_id": "FK to profile_capture", + "local_step": "Training step (query without capture_id)", + "global_step": "Global step", + "rank": "Rank that produced this row", + "bucket_kind": "kernel | cpu_op | memcpy | cuda_runtime | collective | other", + "bucket_name": "Kernel or op name", + "self_us": "Self time microseconds (primary sort key)", + "wall_us": "Wall/subtree time microseconds", + "calls": "Invocation count in capture", + "pct_of_capture": "self_us / capture.wall_us", + "module_hint": "Module hint from stack (v2)", + }, +} + +_DOCS_REGISTERED = False + + +def _register_docs_once() -> None: + global _DOCS_REGISTERED + if _DOCS_REGISTERED: + return + probing.register_table_docs( + "python.profile_capture", _CAPTURE_DOC, _COLUMN_DOCS["profile_capture"] + ) + probing.register_table_docs( + "python.profile_hotspot", _HOTSPOT_DOC, _COLUMN_DOCS["profile_hotspot"] + ) + _DOCS_REGISTERED = True + + +def _capture_to_dict(row: CaptureRecord) -> dict[str, Any]: + return { + "capture_id": row.capture_id, + "local_step": row.local_step, + "global_step": row.global_step, + "rank": row.rank, + "world_size": row.world_size, + "role": row.role, + "trigger": row.trigger, + "steps_profiled": row.steps_profiled, + "wall_us": row.wall_us, + "started_at_us": row.started_at_us, + "ended_at_us": row.ended_at_us, + "status": row.status, + "truncated": 1 if row.truncated else 0, + "event_count": row.event_count, + "error": row.error, + } + + +def _hotspot_to_dict(row: HotspotRecord) -> dict[str, Any]: + return { + "capture_id": row.capture_id, + "local_step": row.local_step, + "global_step": row.global_step, + "rank": row.rank, + "bucket_kind": row.bucket_kind, + "bucket_name": row.bucket_name, + "self_us": row.self_us, + "wall_us": row.wall_us, + "calls": row.calls, + "pct_of_capture": row.pct_of_capture, + "module_hint": row.module_hint, + } + + +def profile_capture_rows() -> list[dict[str, Any]]: + """Rows for ``SELECT * FROM python.profile_capture``.""" + _register_docs_once() + return [_capture_to_dict(c) for c in get_session_store().captures()] + + +def profile_hotspot_rows() -> list[dict[str, Any]]: + """Rows for ``SELECT * FROM python.profile_hotspot``.""" + _register_docs_once() + return [_hotspot_to_dict(h) for h in get_session_store().hotspots()] diff --git a/python/probing/repl/torch_magic.py b/python/probing/repl/torch_magic.py index f0aaa79a..b987bec5 100644 --- a/python/probing/repl/torch_magic.py +++ b/python/probing/repl/torch_magic.py @@ -13,6 +13,8 @@ import __main__ from probing.repl import register_magic +from probing.profiling.torch_profiler import ProfilerController, get_controller + # Optional import - torch may not be installed try: import torch @@ -105,8 +107,8 @@ def _cmd_profile(self, args_str: str) -> None: print("Usage: %pytorch profile [steps=1]") return - # Check if profiler already exists (non-reentrant) - if __main__.__probing__.get(self.PROFILER_KEY) is not None: + controller = get_controller() + if controller.is_running: print("✗ Global profiler is already running") print( " The profiler can only be started once. Stop it first or wait for it to complete." @@ -114,7 +116,9 @@ def _cmd_profile(self, args_str: str) -> None: return try: - self._start_global_profiler(steps) + controller.start(steps=steps, trigger="repl") + __main__.__probing__[self.PROFILER_KEY] = controller + __main__.profiler = controller print(f"✓ Global profiler started for {steps} step(s)") print( " Profiler will automatically record data after each optimizer.step()" @@ -127,23 +131,43 @@ def _cmd_profile(self, args_str: str) -> None: def _cmd_summary(self) -> None: """Handle summary subcommand.""" - profiler = __main__.__probing__.get(self.PROFILER_KEY) - if profiler is None: + controller = __main__.__probing__.get(self.PROFILER_KEY) or get_controller() + if not isinstance(controller, ProfilerController): print("No profiler found. Use '%pytorch profile' first.") return - profiler.summary() + profiler = controller._profiler # noqa: SLF001 — REPL summary + if profiler is None: + print("Profiler has no active session.") + return + + try: + events = profiler.events() + event_list = list(events) if events else [] + if event_list: + print(f"Profiler collected {len(event_list)} events") + table = profiler.key_averages().table( + sort_by="self_cuda_time_total", row_limit=10 + ) + print(table) + else: + status = controller.status() + print("Profiler has no events.") + print( + f" Step count: {status['steps_completed']}/{status['steps_target']}" + ) + except Exception as e: + print(f"Error generating summary: {e}") def _cmd_timeline(self) -> None: """Handle timeline subcommand - export Chrome tracing format.""" - profiler = __main__.__probing__.get(self.PROFILER_KEY) - if profiler is None: + controller = __main__.__probing__.get(self.PROFILER_KEY) or get_controller() + if not isinstance(controller, ProfilerController): print("No profiler found. Use '%pytorch profile' first.") return - timeline = profiler.export_timeline() + timeline = controller.export_timeline() if timeline: - # Print JSON to stdout (can be captured by API) print(timeline) else: print( @@ -220,235 +244,18 @@ def _parse_args(self, args_str: str) -> Dict[str, str]: return args - def _start_global_profiler(self, steps: int = 1): - """Start a global profiler using context manager approach. - - Args: - steps: Number of steps to profile. - """ + def _start_global_profiler( + self, steps: int = 1, trigger: str = "http" + ) -> ProfilerController: + """Start profiler (HTTP / legacy callers).""" if not HAS_TORCH: raise ImportError( "PyTorch is not installed. Please install it with: pip install torch" ) - - class _GlobalProfiler: - """Global profiler class using torch.profiler.profile context manager.""" - - def __init__(self, steps: int) -> None: - self._steps = steps - self._step_count = 0 - self._profiler = None - self._cached_timeline = None - self._timeline_exported = False - self._hook_handle = None # Store hook handle for removal - - # Configure activities - activities = [torch.profiler.ProfilerActivity.CPU] - if torch.cuda.is_available(): - activities.append(torch.profiler.ProfilerActivity.CUDA) - - self._profiler = torch.profiler.profile( - record_shapes=True, - with_stack=True, - with_flops=True, - activities=activities, - on_trace_ready=None, - ) - - # Register optimizer step post hook to automatically drive profiler - from torch.optim.optimizer import register_optimizer_step_post_hook - - profiler_instance = self - - def profiler_step_hook(optimizer, *args, **kwargs): - """Hook function that starts profiler and calls step() after optimizer.step().""" - # Start profiler on first call (in training thread) - if profiler_instance._step_count == 0: - profiler_instance._profiler.__enter__() - print( - f"==== Profiler started (profiling {profiler_instance._steps} steps) ====" - ) - - # Record step if profiler is active and hasn't reached limit - if ( - profiler_instance._profiler is not None - and profiler_instance._step_count < profiler_instance._steps - ): - try: - profiler_instance._profiler.step() - profiler_instance._step_count += 1 - - # Stop profiler when step limit is reached - if ( - profiler_instance._step_count - >= profiler_instance._steps - ): - profiler_instance._profiler.__exit__(None, None, None) - print( - f"==== Profiler stopped (completed {profiler_instance._steps} steps) ====" - ) - # Remove hook - if profiler_instance._hook_handle is not None: - try: - from torch.optim.optimizer import ( - remove_optimizer_step_post_hook, - ) - - remove_optimizer_step_post_hook( - profiler_instance._hook_handle - ) - profiler_instance._hook_handle = None - except Exception: - pass - except RuntimeError as e: - # Profiler already stopped - ignore - error_msg = str(e).lower() - if ( - "can't disable" in error_msg - or "not running" in error_msg - ): - if profiler_instance._hook_handle is not None: - try: - from torch.optim.optimizer import ( - remove_optimizer_step_post_hook, - ) - - remove_optimizer_step_post_hook( - profiler_instance._hook_handle - ) - profiler_instance._hook_handle = None - except Exception: - pass - - self._hook_handle = register_optimizer_step_post_hook( - profiler_step_hook - ) - - def step(self): - """Manually call step() after each iteration (usually not needed - hook handles it).""" - if self._profiler is None or self._step_count >= self._steps: - return - - try: - self._profiler.step() - self._step_count += 1 - - if self._step_count >= self._steps: - self._profiler.__exit__(None, None, None) - except Exception: - pass - - def stop(self): - """Manually stop the profiler.""" - if self._profiler is None: - return - - if self._hook_handle is not None: - try: - from torch.optim.optimizer import ( - remove_optimizer_step_post_hook, - ) - - remove_optimizer_step_post_hook(self._hook_handle) - self._hook_handle = None - except Exception: - pass - - try: - self._profiler.__exit__(None, None, None) - print( - f"==== Profiler stopped manually (completed {self._step_count}/{self._steps} steps) ====" - ) - except Exception: - pass - - def summary(self): - """Print profiler summary.""" - if self._profiler is None: - print("Profiler is not initialized") - return - - try: - events = self._profiler.events() - event_list = list(events) if events else [] - event_count = len(event_list) - - if event_count > 0: - print(f"Profiler collected {event_count} events") - table = self._profiler.key_averages().table( - sort_by="cpu_time_total", row_limit=10 - ) - print(table) - else: - print("Profiler has no events.") - print(f" Step count: {self._step_count}/{self._steps}") - if self._step_count < self._steps: - print( - " Profiler may still be running. Wait for it to complete." - ) - except RuntimeError as e: - error_msg = str(e).lower() - if ( - "not enabled" in error_msg - or "not started" in error_msg - or "not running" in error_msg - ): - print("Profiler has been stopped.") - print(f" Step count: {self._step_count}/{self._steps}") - else: - raise - except Exception as e: - print(f"Error generating summary: {e}") - - def export_timeline(self) -> Optional[str]: - """Export profiler timeline in Chrome tracing format. - - Returns: - JSON string of Chrome tracing format, or None if profiler is not ready. - """ - if self._timeline_exported and self._cached_timeline is not None: - return self._cached_timeline - - if self._profiler is None: - return None - - try: - import json - import os - import tempfile - - tmp_fd, tmp_path = tempfile.mkstemp(suffix=".json", text=True) - os.close(tmp_fd) - - try: - self._profiler.export_chrome_trace(tmp_path) - - with open(tmp_path) as f: - trace_json = f.read() - - # Verify it's valid JSON - parsed = json.loads(trace_json) - trace_events = parsed.get("traceEvents", []) - - if not trace_events: - return None - - # Cache the timeline - self._cached_timeline = trace_json - self._timeline_exported = True - - return trace_json - finally: - try: - os.unlink(tmp_path) - except Exception: - pass - except Exception: - return None - - # Create and store global profiler - profiler = _GlobalProfiler(steps) - __main__.__probing__[self.PROFILER_KEY] = profiler - __main__.profiler = profiler - - return profiler + controller = get_controller() + if controller.is_running: + raise RuntimeError("profiler already running") + controller.start(steps=steps, trigger=trigger) + __main__.__probing__[self.PROFILER_KEY] = controller + __main__.profiler = controller + return controller diff --git a/tests/regression/core/test_table_docs_integration.py b/tests/regression/core/test_table_docs_integration.py index e06f3bba..61f607b9 100644 --- a/tests/regression/core/test_table_docs_integration.py +++ b/tests/regression/core/test_table_docs_integration.py @@ -140,15 +140,24 @@ class Metrics: def test_describe_builtin_hccl_via_query_subprocess(): - """DESCRIBE rewrite on static catalog — isolated process (wheel/Linux + torch safe).""" + """Static catalog docs in an isolated wheel process. + + ``DESCRIBE`` rewrite (comment / table_comment columns) is covered by + ``tests/regression/rust/probing/core/table_docs_integration.rs`` — the + rewritten SQL joins ``information_schema`` and can hang in a fresh Python + subprocess on CI, so we validate the underlying catalog rows here instead. + """ result = _run_fresh_probing_script( """ import probing -df = probing.query("DESCRIBE probe.probing.column_docs") -assert "comment" in df.columns -assert "table_comment" in df.columns +df = probing.query( + "SELECT column_name, description FROM probe.probing.column_docs " + "WHERE table_schema = 'hccl' AND table_name = 'tasks' AND column_name = 'task_name'" +) assert "column_name" in df.columns -assert "description" in df["column_name"].tolist() +assert "description" in df.columns +assert len(df) == 1 +assert "Memcpy" in str(df["description"].iloc[0]) print("OK") """ ) @@ -186,12 +195,14 @@ def test_hccl_catalog_and_select_roundtrip_subprocess(): def test_describe_json_shape_subprocess(): - """Sanity-check DESCRIBE rewrite columns in an isolated process.""" + """Catalog table_docs rows in an isolated process (see DESCRIBE note above).""" result = _run_fresh_probing_script( """ import json import probing -df = probing.query("DESCRIBE probe.probing.table_docs") +df = probing.query( + "SELECT table_schema, table_name, description FROM probe.probing.table_docs LIMIT 20" +) payload = { "columns": list(df.columns), "rows": len(df), @@ -202,5 +213,5 @@ def test_describe_json_shape_subprocess(): assert result.returncode == 0, result.stdout + result.stderr payload = json.loads(result.stdout.strip().splitlines()[-1]) assert payload["rows"] > 0 - assert "comment" in payload["columns"] - assert "table_comment" in payload["columns"] + assert "description" in payload["columns"] + assert "table_name" in payload["columns"] diff --git a/tests/regression/profiling/conftest.py b/tests/regression/profiling/conftest.py index 717b2ae9..d979d073 100644 --- a/tests/regression/profiling/conftest.py +++ b/tests/regression/profiling/conftest.py @@ -13,3 +13,14 @@ def _sync_torch_deferred_drain(monkeypatch): monkeypatch.setenv("PROBING_TORCH_DEFER_ASYNC", "0") yield reset_deferred_drain_worker_for_tests() + + +@pytest.fixture(autouse=True) +def _reset_torch_profiler_state(): + from probing.profiling.torch_profiler.controller import ( + reset_torch_profiler_for_tests, + ) + + reset_torch_profiler_for_tests() + yield + reset_torch_profiler_for_tests() diff --git a/tests/regression/profiling/test_distributed_flamegraph.py b/tests/regression/profiling/test_distributed_flamegraph.py new file mode 100644 index 00000000..35cfb514 --- /dev/null +++ b/tests/regression/profiling/test_distributed_flamegraph.py @@ -0,0 +1,158 @@ +"""Distributed SPMD torch flamegraph — memtable seed + server-aligned SQL.""" + +from __future__ import annotations + +import json + +import pytest + +# Mirrors probing/server/src/server/training.rs ``distributed_torch_trace_sql``. +LOCAL_DISTRIBUTED_TORCH_TRACE_SQL = """ +SELECT + CAST(rank AS BIGINT) AS rank, + module, + stage, + CAST(duration AS DOUBLE) AS duration, + CAST(allocated_delta AS DOUBLE) AS allocated_delta, + CAST(max_allocated_delta AS DOUBLE) AS max_allocated_delta, + CAST(allocated AS DOUBLE) AS allocated, + CAST(max_allocated AS DOUBLE) AS max_allocated, + CAST(local_step AS BIGINT) AS local_step +FROM python.torch_trace +WHERE local_step = {step} + AND module <> 'None' + AND (stage LIKE 'post %' OR stage LIKE 'pre %') +""" + + +@pytest.fixture(autouse=True) +def _reset_torch_trace_table(): + from probing.profiling.torch_probe import TorchTrace + + try: + TorchTrace.drop() + except Exception: + pass + TorchTrace.init_table() + yield + try: + TorchTrace.drop() + except Exception: + pass + TorchTrace.init_table() + + +@pytest.fixture +def sql_query(): + from probing import query + + def _run(expr: str): + return query(expr.strip()) + + return _run + + +def _save_trace( + *, + rank: int, + local_step: int, + module: str, + stage: str, + duration: float = 0.0, + allocated_delta: float = 0.0, + max_allocated_delta: float = 0.0, +) -> None: + from probing.profiling.torch_probe import TorchTrace + + TorchTrace( + local_step=local_step, + rank=rank, + world_size=2, + module=module, + stage=stage, + duration=duration, + allocated_delta=allocated_delta, + max_allocated_delta=max_allocated_delta, + ).save() + + +def _seed_spmd_step(*, local_step: int = 7) -> None: + """Two ranks at one step: shared encoder path + rank-specific decoder paths.""" + rows = [ + (0, "encoder.block", "post forward", 0.01), + (1, "encoder.block", "post forward", 0.01), + (0, "decoder", "post forward", 0.02), + (1, "decoder.head", "post forward", 0.008), + ] + for rank, module, stage, duration in rows: + _save_trace( + rank=rank, + local_step=local_step, + module=module, + stage=stage, + duration=duration, + ) + + +@pytest.mark.training_observability +class TestDistributedFlamegraphSql: + def test_multi_rank_rows_at_same_step(self, sql_query): + _seed_spmd_step(local_step=7) + df = sql_query(LOCAL_DISTRIBUTED_TORCH_TRACE_SQL.format(step=7)) + assert not df.empty + ranks = {int(r) for r in df["rank"].unique()} + assert ranks == {0, 1} + modules = set(df["module"].tolist()) + assert {"encoder.block", "decoder", "decoder.head"} <= modules + + def test_step_filter_excludes_other_steps(self, sql_query): + _seed_spmd_step(local_step=7) + _save_trace( + rank=0, local_step=99, module="other", stage="post forward", duration=1.0 + ) + df = sql_query(LOCAL_DISTRIBUTED_TORCH_TRACE_SQL.format(step=7)) + assert int(df["local_step"].max()) == 7 + assert "other" not in set(df["module"].tolist()) + + def test_post_stage_filter_excludes_unrelated_stages(self, sql_query): + _save_trace( + rank=0, local_step=3, module="m", stage="post forward", duration=0.01 + ) + _save_trace(rank=0, local_step=3, module="m", stage="running", duration=9.0) + df = sql_query(LOCAL_DISTRIBUTED_TORCH_TRACE_SQL.format(step=3)) + assert len(df) == 1 + assert df.iloc[0]["stage"] == "post forward" + + +@pytest.mark.training_observability +class TestDistributedFlamegraphContract: + def test_api_spec_lists_distributed_endpoint(self): + from pathlib import Path + + spec_path = Path(__file__).resolve().parents[1] / "spec" / "api_spec.json" + spec = json.loads(spec_path.read_text(encoding="utf-8")) + paths = {(r["method"], r["path"]) for r in spec["server_public"]} + assert ("GET", "/apis/training/distributed_flamegraph/json") in paths + + def test_web_client_declares_distributed_path(self): + from pathlib import Path + + spec_path = Path(__file__).resolve().parents[1] / "spec" / "api_spec.json" + spec = json.loads(spec_path.read_text(encoding="utf-8")) + profiling_calls: list[str] = [] + for entry in spec["client_contracts"]["web"]: + if entry["source"] != "web/src/api/profiling.rs": + continue + profiling_calls.extend(c["path"] for c in entry["calls"]) + assert "/apis/training/distributed_flamegraph/json" in profiling_calls + + @staticmethod + def _normalize_profiling_view(view: str) -> str: + view = view.strip().strip("/") + if view in ("torch-dist", "distributed-torch", "torch-distributed"): + return "torch-dist" + return view or "pprof" + + def test_profiling_view_slug_aliases(self): + assert self._normalize_profiling_view("distributed-torch") == "torch-dist" + assert self._normalize_profiling_view("torch-distributed") == "torch-dist" diff --git a/tests/regression/profiling/test_torch_profiler_sql.py b/tests/regression/profiling/test_torch_profiler_sql.py new file mode 100644 index 00000000..361fcb6e --- /dev/null +++ b/tests/regression/profiling/test_torch_profiler_sql.py @@ -0,0 +1,101 @@ +"""SQL integration: python.profile_capture / profile_hotspot virtual tables.""" + +from __future__ import annotations + +import probing +from probing.profiling.torch_profiler.session_store import CaptureRecord, HotspotRecord +from probing.profiling.torch_profiler.session_store import get_session_store + + +def _seed_capture() -> str: + store = get_session_store() + store.add_capture( + CaptureRecord( + capture_id="sql-cap", + local_step=11, + global_step=11, + rank=0, + world_size=4, + role="dp=0", + trigger="regression", + steps_profiled=1, + wall_us=2000, + status="completed", + event_count=3, + ), + [ + HotspotRecord( + capture_id="sql-cap", + local_step=11, + global_step=11, + rank=0, + bucket_kind="kernel", + bucket_name="volta_sgemm", + self_us=1500, + wall_us=1600, + calls=4, + pct_of_capture=0.75, + ), + HotspotRecord( + capture_id="sql-cap", + local_step=11, + global_step=11, + rank=0, + bucket_kind="memcpy", + bucket_name="Memcpy DtoH", + self_us=500, + wall_us=500, + calls=2, + pct_of_capture=0.25, + ), + ], + ) + return "sql-cap" + + +def test_profile_hotspot_sql_q1_top_k(): + _seed_capture() + df = probing.query( + """ + SELECT bucket_name, bucket_kind, self_us, pct_of_capture, calls + FROM python.profile_hotspot + WHERE capture_id = 'sql-cap' + ORDER BY self_us DESC + LIMIT 10 + """ + ) + assert len(df) == 2 + assert df.iloc[0]["bucket_name"] == "volta_sgemm" + assert int(df.iloc[0]["self_us"]) == 1500 + + +def test_profile_hotspot_sql_q2_breakdown(): + _seed_capture() + df = probing.query( + """ + SELECT bucket_kind, sum(self_us) AS us, sum(pct_of_capture) AS pct + FROM python.profile_hotspot + WHERE capture_id = 'sql-cap' + GROUP BY bucket_kind + ORDER BY us DESC + """ + ) + assert len(df) == 2 + kinds = set(df["bucket_kind"].tolist()) + assert kinds == {"kernel", "memcpy"} + + +def test_profile_capture_sql_q8_quality(): + _seed_capture() + df = probing.query( + """ + SELECT capture_id, status, truncated, event_count, error + FROM python.profile_capture + WHERE capture_id = 'sql-cap' + """ + ) + assert len(df) == 1 + row = df.iloc[0] + assert row["status"] == "completed" + assert int(row["event_count"]) == 3 + assert int(row["truncated"]) == 0 diff --git a/tests/regression/rust/Cargo.toml b/tests/regression/rust/Cargo.toml index d651d1e8..64dc3623 100644 --- a/tests/regression/rust/Cargo.toml +++ b/tests/regression/rust/Cargo.toml @@ -93,3 +93,7 @@ path = "probing/cli/inject_aarch64.rs" [[test]] name = "python_py_to_table" path = "probing/python/py_to_table.rs" + +[[test]] +name = "python_distributed_flamegraph" +path = "probing/python/distributed_flamegraph_tests.rs" diff --git a/tests/regression/rust/probing/python/distributed_flamegraph_tests.rs b/tests/regression/rust/probing/python/distributed_flamegraph_tests.rs new file mode 100644 index 00000000..c633be0a --- /dev/null +++ b/tests/regression/rust/probing/python/distributed_flamegraph_tests.rs @@ -0,0 +1,99 @@ +//! Distributed torch flamegraph regression (SPMD merge at one ``local_step``). + +use probing_proto::prelude::*; +use probing_python::features::torch::distributed_flamegraph_json_from_df; +use serde_json::Value; + +fn spmd_duration_df(step: i64) -> DataFrame { + DataFrame::new( + vec![ + "rank".into(), + "module".into(), + "stage".into(), + "duration".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![0, 1, 0, 1]), + Seq::SeqText(vec![ + "encoder".into(), + "encoder".into(), + "decoder".into(), + "decoder.head".into(), + ]), + Seq::SeqText(vec![ + "post forward".into(), + "post forward".into(), + "post forward".into(), + "post forward".into(), + ]), + Seq::SeqF64(vec![0.01, 0.01, 0.02, 0.008]), + Seq::SeqI64(vec![step, step, step, step]), + ], + ) +} + +fn parse_json(json: &str) -> Value { + serde_json::from_str(json).expect("valid flamegraph json") +} + +#[test] +fn distributed_flamegraph_merges_shared_encoder_across_ranks() { + let json = distributed_flamegraph_json_from_df(&spmd_duration_df(6), None); + let payload = parse_json(&json); + assert_eq!(payload["profile"], "torch-distributed"); + // encoder merged (2 × 10ms) + per-rank decoder paths + assert_eq!(payload["total"], 48_000_000); + let frames = payload["frames"].as_array().expect("frames array"); + assert!(!frames.is_empty()); +} + +#[test] +fn distributed_flamegraph_peak_mb_metric() { + let df = DataFrame::new( + vec![ + "rank".into(), + "module".into(), + "stage".into(), + "max_allocated_delta".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![0, 1]), + Seq::SeqText(vec!["layer".into(), "layer".into()]), + Seq::SeqText(vec!["post forward".into(), "post forward".into()]), + Seq::SeqF64(vec![0.5, 0.5]), + Seq::SeqI64(vec![3, 3]), + ], + ); + + let payload = parse_json(&distributed_flamegraph_json_from_df(&df, Some("peak_mb"))); + assert_eq!(payload["metric"], "peak_mb"); + assert_eq!(payload["countName"], "MB"); + assert_eq!(payload["total"], 1_000_000); +} + +#[test] +fn distributed_flamegraph_empty_step_has_actionable_message() { + let df = DataFrame::new( + vec![ + "rank".into(), + "module".into(), + "stage".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![0]), + Seq::SeqText(vec!["m".into()]), + Seq::SeqText(vec!["pre forward".into()]), + Seq::SeqI64(vec![1]), + ], + ); + + let payload = parse_json(&distributed_flamegraph_json_from_df(&df, None)); + assert_eq!(payload["total"], 0); + assert!(payload["emptyMessage"] + .as_str() + .unwrap_or("") + .contains("torch_trace")); +} diff --git a/tests/regression/rust/probing/server/training_observability_tests.rs b/tests/regression/rust/probing/server/training_observability_tests.rs index 70d0f1dc..3553cbda 100644 --- a/tests/regression/rust/probing/server/training_observability_tests.rs +++ b/tests/regression/rust/probing/server/training_observability_tests.rs @@ -61,3 +61,70 @@ fn cluster_query_request_roundtrip() { assert_eq!(back.expr, "SELECT 1"); assert_eq!(back.scope, ClusterFanoutScope::Auto); } + +#[test] +fn distributed_torch_sql_valid_for_global_fanout() { + use probing_core::core::federation::validate_global_query; + use probing_server::server::training::distributed_torch_trace_sql; + + let sql = distributed_torch_trace_sql("global.python.torch_trace", Some(42)); + assert!(sql.contains("local_step = 42")); + assert!(sql.contains("COALESCE(rank, 0)")); + assert!(validate_global_query(&sql).is_ok()); + let latest = distributed_torch_trace_sql("global.python.torch_trace", None); + assert!(latest.contains("max(local_step)")); +} + +#[test] +fn distributed_flamegraph_json_contract_from_dataframe() { + use probing_proto::types::{DataFrame, Seq}; + use probing_python::features::torch::distributed_flamegraph_json_from_df; + + let df = DataFrame::new( + vec![ + "rank".into(), + "module".into(), + "stage".into(), + "duration".into(), + "local_step".into(), + ], + vec![ + Seq::SeqI64(vec![0, 1]), + Seq::SeqText(vec!["block".into(), "block".into()]), + Seq::SeqText(vec!["post forward".into(), "post forward".into()]), + Seq::SeqF64(vec![0.002, 0.002]), + Seq::SeqI64(vec![11, 11]), + ], + ); + + let json = distributed_flamegraph_json_from_df(&df, None); + let payload: serde_json::Value = serde_json::from_str(&json).expect("parse json"); + assert_eq!(payload["profile"], "torch-distributed"); + assert_eq!(payload["metric"], "duration"); + assert_eq!(payload["countName"], "ns"); + assert!(payload["subtitle"] + .as_str() + .unwrap_or("") + .contains("local_step 11")); + assert!(payload["subtitle"] + .as_str() + .unwrap_or("") + .contains("2 ranks")); + assert!(payload["frames"] + .as_array() + .map(|a| !a.is_empty()) + .unwrap_or(false)); + assert_eq!(payload["total"], 4_000_000); +} + +#[test] +fn distributed_flamegraph_params_roundtrip() { + use probing_server::server::training::DistributedFlamegraphParams; + + let params: DistributedFlamegraphParams = + serde_json::from_str(r#"{"step":5,"metric":"peak_mb","cluster":false}"#) + .expect("deserialize"); + assert_eq!(params.step, Some(5)); + assert_eq!(params.metric.as_deref(), Some("peak_mb")); + assert_eq!(params.cluster, Some(false)); +} diff --git a/tests/regression/spec/api_spec.json b/tests/regression/spec/api_spec.json index 256d048d..e35921ac 100644 --- a/tests/regression/spec/api_spec.json +++ b/tests/regression/spec/api_spec.json @@ -17,6 +17,7 @@ { "method": "GET", "path": "/apis/nodes" }, { "method": "PUT", "path": "/apis/nodes" }, { "method": "GET", "path": "/apis/training/step_matrix" }, + { "method": "GET", "path": "/apis/training/distributed_flamegraph/json" }, { "method": "POST", "path": "/apis/cluster/query" } ], "top_level": [ @@ -89,6 +90,24 @@ "uses_body": false, "response": { "content_type": "application/json", "cors": false } }, + { + "local_path": "pytorch/profile/start", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } + }, + { + "local_path": "pytorch/profile/stop", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } + }, + { + "local_path": "pytorch/profile/status", + "method": "GET", + "uses_body": false, + "response": { "content_type": "application/json", "cors": false } + }, { "local_path": "ray/timeline", "method": "GET", @@ -242,7 +261,8 @@ "source": "web/src/api/profiling.rs", "calls": [ { "method": "GET", "path": "/apis/torchextension/flamegraph/json" }, - { "method": "GET", "path": "/apis/pprofextension/flamegraph/json" } + { "method": "GET", "path": "/apis/pprofextension/flamegraph/json" }, + { "method": "GET", "path": "/apis/training/distributed_flamegraph/json" } ] }, { diff --git a/tests/unit/probing/profiling/conftest.py b/tests/unit/probing/profiling/conftest.py new file mode 100644 index 00000000..7e39454e --- /dev/null +++ b/tests/unit/probing/profiling/conftest.py @@ -0,0 +1,16 @@ +"""Unit-test isolation for torch_profiler.""" + +from __future__ import annotations + +import pytest + + +@pytest.fixture(autouse=True) +def _reset_torch_profiler_state(): + from probing.profiling.torch_profiler.controller import ( + reset_torch_profiler_for_tests, + ) + + reset_torch_profiler_for_tests() + yield + reset_torch_profiler_for_tests() diff --git a/tests/unit/probing/profiling/test_torch_profiler_adaptor.py b/tests/unit/probing/profiling/test_torch_profiler_adaptor.py new file mode 100644 index 00000000..da4c8114 --- /dev/null +++ b/tests/unit/probing/profiling/test_torch_profiler_adaptor.py @@ -0,0 +1,170 @@ +"""Unit tests for torch_profiler Kineto → hotspot adaptor.""" + +from __future__ import annotations + +from dataclasses import dataclass +from unittest.mock import MagicMock + +import pytest + +from probing.profiling.torch_profiler.adaptor import ( + _bucket_kind_for_name, + compile_from_profiler, + compile_key_averages, +) +from probing.profiling.torch_profiler.session_store import ( + CaptureRecord, + HotspotRecord, + SessionStore, +) + + +@dataclass +class _FakeEvent: + key: str + self_cuda_time_total: int = 0 + self_cpu_time_total: int = 0 + cuda_time_total: int = 0 + cpu_time_total: int = 0 + count: int = 1 + + +@pytest.fixture +def stub_coords(monkeypatch): + monkeypatch.setattr( + "probing.profiling.torch_profiler.adaptor.row_fields", + lambda _snap=None: { + "local_step": 7, + "global_step": 7, + "rank": 2, + "world_size": 8, + }, + ) + monkeypatch.setattr( + "probing.profiling.torch_profiler.adaptor.current_role", + lambda: "dp=2", + ) + + +@pytest.mark.parametrize( + ("name", "expected"), + [ + ("nccl:all_reduce", "collective"), + ("Memcpy HtoD", "memcpy"), + ("cudaDeviceSynchronize", "cuda_runtime"), + ("cudaLaunchKernel", "cuda_runtime"), + ("aten::mm", "cpu_op"), + ("autograd::engine", "cpu_op"), + ("void at::native::vectorized_elementwise_kernel", "kernel"), + ], +) +def test_bucket_kind_mapping(name, expected): + assert _bucket_kind_for_name(name) == expected + + +def test_compile_key_averages_buckets_and_pct(stub_coords): + events = [ + _FakeEvent("nccl:all_reduce", self_cuda_time_total=300, cuda_time_total=400), + _FakeEvent("aten::mm", self_cpu_time_total=100, cpu_time_total=150), + _FakeEvent("Memcpy HtoD (Pinned -> Device)", self_cuda_time_total=50), + ] + capture, hotspots = compile_key_averages( + events, + trigger="test", + steps_profiled=1, + started_at_us=1_000_000, + ended_at_us=1_500_000, + ) + assert capture.status == "completed" + assert capture.local_step == 7 + assert capture.rank == 2 + assert capture.wall_us == 500_000 + kinds = {h.bucket_kind for h in hotspots} + assert kinds == {"collective", "cpu_op", "memcpy"} + total_pct = sum(h.pct_of_capture for h in hotspots) + assert abs(total_pct - 450 / 500_000) < 1e-6 + top = max(hotspots, key=lambda h: h.self_us) + assert top.bucket_kind == "collective" + + +def test_compile_key_averages_merges_duplicate_buckets(stub_coords): + events = [ + _FakeEvent("aten::mm", self_cpu_time_total=40, count=2), + _FakeEvent("aten::mm", self_cpu_time_total=60, count=3), + ] + _, hotspots = compile_key_averages( + events, + trigger="test", + steps_profiled=1, + started_at_us=0, + ended_at_us=100, + ) + assert len(hotspots) == 1 + assert hotspots[0].self_us == 100 + assert hotspots[0].calls == 5 + + +def test_compile_key_averages_truncation(monkeypatch, stub_coords): + monkeypatch.setattr( + "probing.profiling.torch_profiler.adaptor._max_events", + lambda: 2, + ) + events = [_FakeEvent(f"op{i}", self_cpu_time_total=10) for i in range(5)] + capture, hotspots = compile_key_averages( + events, + trigger="test", + steps_profiled=1, + started_at_us=0, + ended_at_us=100, + ) + assert capture.truncated is True + assert capture.event_count == 5 + assert len(hotspots) == 2 + + +def test_compile_from_profiler_uses_key_averages(stub_coords): + profiler = MagicMock() + profiler.key_averages.return_value = [ + _FakeEvent("aten::add", self_cpu_time_total=25), + ] + capture, hotspots = compile_from_profiler( + profiler, + trigger="unit", + steps_profiled=1, + started_at_us=0, + ended_at_us=50, + ) + assert capture.trigger == "unit" + assert len(hotspots) == 1 + assert hotspots[0].bucket_name == "aten::add" + + +def test_compile_from_profiler_falls_back_to_events(stub_coords): + profiler = MagicMock() + profiler.key_averages.side_effect = RuntimeError("not ready") + profiler.events.return_value = [_FakeEvent("kernel_a", self_cuda_time_total=10)] + capture, hotspots = compile_from_profiler( + profiler, + trigger="unit", + steps_profiled=1, + started_at_us=0, + ended_at_us=50, + ) + assert capture.status == "completed" + assert capture.error == "" + assert len(hotspots) == 1 + assert hotspots[0].bucket_name == "kernel_a" + + +def test_session_store_bounded(monkeypatch): + monkeypatch.setenv("PROBING_TORCH_PROFILER_MAX_SESSIONS", "2") + store = SessionStore(max_sessions=2) + for i in range(3): + cid = f"c{i}" + store.add_capture( + CaptureRecord(capture_id=cid, status="completed"), + [HotspotRecord(capture_id=cid, bucket_name="k", self_us=1)], + ) + assert len(store.captures()) == 2 + assert store.captures()[0].capture_id == "c1" + assert all(h.capture_id != "c0" for h in store.hotspots()) diff --git a/tests/unit/probing/profiling/test_torch_profiler_controller.py b/tests/unit/probing/profiling/test_torch_profiler_controller.py new file mode 100644 index 00000000..d4f0dd60 --- /dev/null +++ b/tests/unit/probing/profiling/test_torch_profiler_controller.py @@ -0,0 +1,162 @@ +"""Unit tests for ProfilerController finalize and status.""" + +from __future__ import annotations + +from dataclasses import dataclass +from unittest.mock import MagicMock + +import pytest + +from probing.profiling.torch_profiler.controller import ProfilerController +from probing.profiling.torch_profiler.session_store import get_session_store + + +@dataclass +class _FakeEvent: + key: str + self_cuda_time_total: int = 0 + self_cpu_time_total: int = 0 + cuda_time_total: int = 0 + cpu_time_total: int = 0 + count: int = 1 + + +def _mock_profiler(events: list[_FakeEvent]) -> MagicMock: + profiler = MagicMock() + profiler.key_averages.return_value = events + profiler.__exit__ = MagicMock(return_value=None) + return profiler + + +def test_finalize_materializes_sql_rows(monkeypatch): + monkeypatch.setattr( + "probing.profiling.torch_profiler.adaptor.row_fields", + lambda _snap=None: { + "local_step": 3, + "global_step": 3, + "rank": 0, + "world_size": 1, + }, + ) + monkeypatch.setattr( + "probing.profiling.torch_profiler.adaptor.current_role", + lambda: "", + ) + ctrl = ProfilerController() + ctrl._profiler = _mock_profiler([_FakeEvent("aten::mm", self_cpu_time_total=42)]) + ctrl._running = True + ctrl._started_at_us = 0 + ctrl._trigger = "unit" + ctrl._step_count = 1 + + capture_id = ctrl._finalize_capture(status="completed") + assert capture_id is not None + store = get_session_store() + assert len(store.captures()) == 1 + assert store.captures()[0].capture_id == capture_id + assert len(store.hotspots()) == 1 + assert store.captures()[0].status == "completed" + assert ctrl.is_running is False + + +def test_finalize_is_idempotent(monkeypatch): + monkeypatch.setattr( + "probing.profiling.torch_profiler.adaptor.row_fields", + lambda _snap=None: { + "local_step": 1, + "global_step": 1, + "rank": 0, + "world_size": 1, + }, + ) + monkeypatch.setattr( + "probing.profiling.torch_profiler.adaptor.current_role", + lambda: "", + ) + ctrl = ProfilerController() + ctrl._profiler = _mock_profiler([_FakeEvent("aten::mm", self_cpu_time_total=10)]) + ctrl._running = True + ctrl._started_at_us = 0 + ctrl._trigger = "unit" + ctrl._step_count = 1 + + first = ctrl._finalize_capture(status="completed") + second = ctrl._finalize_capture(status="completed") + assert second == first + assert len(get_session_store().captures()) == 1 + + +def test_stop_when_idle_returns_latest_capture(monkeypatch): + monkeypatch.setattr( + "probing.profiling.torch_profiler.adaptor.row_fields", + lambda _snap=None: { + "local_step": 1, + "global_step": 1, + "rank": 0, + "world_size": 1, + }, + ) + monkeypatch.setattr( + "probing.profiling.torch_profiler.adaptor.current_role", + lambda: "", + ) + ctrl = ProfilerController() + ctrl._profiler = _mock_profiler([_FakeEvent("aten::mm", self_cpu_time_total=5)]) + ctrl._running = True + ctrl._started_at_us = 0 + ctrl._trigger = "unit" + ctrl._step_count = 1 + expected = ctrl._finalize_capture(status="completed") + + assert ctrl.stop() == expected + assert ctrl.stop() == expected + + +def test_status_reflects_controller(monkeypatch): + import torch.optim.optimizer as torch_optim + + mock_profile = MagicMock() + monkeypatch.setattr( + "probing.profiling.torch_profiler.controller.HAS_TORCH", + True, + ) + mock_torch = MagicMock() + mock_torch.cuda.is_available.return_value = False + mock_torch.profiler.profile.return_value = mock_profile + monkeypatch.setattr("probing.profiling.torch_profiler.controller.torch", mock_torch) + monkeypatch.setattr( + torch_optim, + "register_optimizer_step_post_hook", + MagicMock(return_value=1), + ) + + ctrl = ProfilerController() + ctrl.start(steps=2, trigger="test") + status = ctrl.status() + assert status["running"] is True + assert status["steps_target"] == 2 + assert status["trigger"] == "test" + + +def test_double_start_raises(monkeypatch): + import torch.optim.optimizer as torch_optim + + mock_profile = MagicMock() + monkeypatch.setattr( + "probing.profiling.torch_profiler.controller.HAS_TORCH", + True, + ) + mock_torch = MagicMock() + mock_torch.cuda.is_available.return_value = False + mock_torch.profiler.profile.return_value = mock_profile + monkeypatch.setattr("probing.profiling.torch_profiler.controller.torch", mock_torch) + monkeypatch.setattr( + torch_optim, + "register_optimizer_step_post_hook", + MagicMock(return_value=1), + ) + + ctrl = ProfilerController() + ctrl.start(steps=1, trigger="a") + with pytest.raises(RuntimeError, match="already running"): + ctrl.start(steps=1, trigger="b") diff --git a/tests/unit/probing/profiling/test_torch_profiler_handlers.py b/tests/unit/probing/profiling/test_torch_profiler_handlers.py new file mode 100644 index 00000000..55fc3a06 --- /dev/null +++ b/tests/unit/probing/profiling/test_torch_profiler_handlers.py @@ -0,0 +1,43 @@ +"""HTTP handler tests for pytorch profile control plane.""" + +from __future__ import annotations + +import json +from unittest.mock import MagicMock, patch + +import probing.handlers.pythonext as pythonext + + +def test_profile_start_handler_success(): + with patch("probing.repl.torch_magic.TorchMagic") as mock_cls: + mock_cls.return_value._start_global_profiler.return_value = MagicMock() + result = json.loads( + pythonext.handle_api_request( + "pytorch/profile/start", + {"steps": "2", "trigger": "http"}, + ) + ) + assert result["success"] is True + mock_cls.return_value._start_global_profiler.assert_called_once_with( + 2, trigger="http" + ) + + +def test_profile_status_handler(): + with patch( + "probing.profiling.torch_profiler.profiler_status", + return_value={"running": False, "latest_capture_id": "abc"}, + ): + result = json.loads(pythonext.handle_api_request("pytorch/profile/status", {})) + assert result["running"] is False + assert result["latest_capture_id"] == "abc" + + +def test_profile_stop_handler(): + with patch("probing.profiling.torch_profiler.get_controller") as mock_get: + ctrl = MagicMock() + ctrl.stop.return_value = "cap-42" + mock_get.return_value = ctrl + result = json.loads(pythonext.handle_api_request("pytorch/profile/stop", {})) + assert result["success"] is True + assert result["capture_id"] == "cap-42" diff --git a/tests/unit/probing/profiling/test_torch_profiler_sql.py b/tests/unit/probing/profiling/test_torch_profiler_sql.py new file mode 100644 index 00000000..38bb1dc3 --- /dev/null +++ b/tests/unit/probing/profiling/test_torch_profiler_sql.py @@ -0,0 +1,42 @@ +"""Unit tests for profile SQL row providers.""" + +from __future__ import annotations + +from probing.profiling.torch_profiler.session_store import CaptureRecord, HotspotRecord +from probing.profiling.torch_profiler.session_store import get_session_store +from probing.profiling.torch_profiler import sql as profile_sql + + +def test_profile_rows_roundtrip(): + store = get_session_store() + store.add_capture( + CaptureRecord( + capture_id="cap1", + local_step=5, + global_step=5, + rank=1, + trigger="unit", + status="completed", + wall_us=1000, + ), + [ + HotspotRecord( + capture_id="cap1", + local_step=5, + bucket_kind="kernel", + bucket_name="gemm", + self_us=800, + pct_of_capture=0.8, + ) + ], + ) + + captures = profile_sql.profile_capture_rows() + hotspots = profile_sql.profile_hotspot_rows() + assert len(captures) == 1 + assert captures[0]["capture_id"] == "cap1" + assert captures[0]["local_step"] == 5 + assert captures[0]["truncated"] == 0 + assert len(hotspots) == 1 + assert hotspots[0]["bucket_name"] == "gemm" + assert hotspots[0]["pct_of_capture"] == 0.8 diff --git a/web/src/api/profiling.rs b/web/src/api/profiling.rs index 61441b01..fc5258d2 100644 --- a/web/src/api/profiling.rs +++ b/web/src/api/profiling.rs @@ -57,4 +57,28 @@ impl ApiClient { }; self.get_request(&path).await } + + /// Distributed SPMD torch flamegraph at one ``local_step`` (cluster fan-out by default). + pub async fn get_distributed_flamegraph_json( + &self, + step: Option, + metric: Option<&str>, + cluster: bool, + ) -> Result { + let mut parts = Vec::new(); + if let Some(s) = step { + parts.push(format!("step={s}")); + } + if let Some(m) = metric { + if !m.is_empty() { + parts.push(format!("metric={}", urlencoding::encode(m))); + } + } + parts.push(format!("cluster={cluster}")); + let path = format!( + "/apis/training/distributed_flamegraph/json?{}", + parts.join("&") + ); + self.get_request(&path).await + } } diff --git a/web/src/components/sidebar/profiling/controls.rs b/web/src/components/sidebar/profiling/controls.rs index 03a180cf..8e569cb6 100644 --- a/web/src/components/sidebar/profiling/controls.rs +++ b/web/src/components/sidebar/profiling/controls.rs @@ -6,7 +6,8 @@ use crate::api::{ApiClient, ProfileResponse}; use crate::components::colors::colors; use crate::hooks::use_api_simple; use crate::state::profiling::{ - show_profiling_feedback, PROFILING_CHROME_LIMIT, PROFILING_PPROF_FREQ, PROFILING_PYTORCH_STEPS, + show_profiling_feedback, PROFILING_CHROME_LIMIT, PROFILING_DIST_CLUSTER, PROFILING_DIST_RELOAD, + PROFILING_DIST_STEP, PROFILING_PPROF_FREQ, PROFILING_PYTORCH_STEPS, PROFILING_PYTORCH_TIMELINE_RELOAD, PROFILING_RAY_TIMELINE_RELOAD, PROFILING_TORCH_ENABLED, PROFILING_TRACE_RELOAD, }; @@ -133,6 +134,68 @@ pub fn TorchControls( } } +#[component] +pub fn TorchDistControls( + control_title_class: String, + control_value_class: String, + input_class: String, +) -> Element { + let step = *PROFILING_DIST_STEP.read(); + let cluster = *PROFILING_DIST_CLUSTER.read(); + let step_label = step + .map(|s| s.to_string()) + .unwrap_or_else(|| "latest".to_string()); + + rsx! { + div { + class: "space-y-3", + div { + class: "space-y-1", + div { class: "{control_title_class}", "Training step" } + input { + class: "{input_class} w-full", + r#type: "number", + min: "0", + placeholder: "latest", + value: step.map(|s| s.to_string()).unwrap_or_default(), + oninput: move |ev| { + let raw = ev.value().trim().to_string(); + if raw.is_empty() { + *PROFILING_DIST_STEP.write() = None; + } else if let Ok(s) = raw.parse::() { + *PROFILING_DIST_STEP.write() = Some(s); + } + }, + } + div { class: "{control_value_class} text-slate-400", "Step: {step_label}" } + } + label { + class: "flex items-center gap-2 cursor-pointer select-none text-xs text-slate-300", + input { + r#type: "checkbox", + checked: cluster, + onchange: move |_| { + *PROFILING_DIST_CLUSTER.write() = !*PROFILING_DIST_CLUSTER.read(); + }, + } + "Cluster fan-out" + } + button { + class: format!( + "w-full px-2 py-1.5 text-xs font-medium rounded bg-{} text-white hover:bg-{}", + colors::PRIMARY, + colors::PRIMARY_HOVER + ), + onclick: move |_| { + *PROFILING_DIST_RELOAD.write() += 1; + show_profiling_feedback("Reloading distributed flamegraph…", false); + }, + "Reload flamegraph" + } + } + } +} + #[component] pub fn TraceTimelineControls( control_title_class: String, diff --git a/web/src/components/sidebar/profiling/mod.rs b/web/src/components/sidebar/profiling/mod.rs index da7fa914..994b80e0 100644 --- a/web/src/components/sidebar/profiling/mod.rs +++ b/web/src/components/sidebar/profiling/mod.rs @@ -12,7 +12,7 @@ use crate::state::profiling::{normalize_profiling_view, profiling_view_label, PR mod controls; use controls::{ - PprofControls, PyTorchTimelineControls, RayTimelineControls, TorchControls, + PprofControls, PyTorchTimelineControls, RayTimelineControls, TorchControls, TorchDistControls, TraceTimelineControls, }; @@ -20,6 +20,7 @@ fn profiling_view_icon(id: &str) -> &'static IconData { match id { "pprof" => &icondata::CgPerformance, "torch" => &icondata::AiFireOutlined, + "torch-dist" => &icondata::AiClusterOutlined, "trace" => &icondata::AiThunderboltOutlined, "pytorch" => &icondata::SiPytorch, "ray" => &icondata::AiClockCircleOutlined, @@ -139,6 +140,13 @@ fn ProfilingControlsPanel(current_view: String) -> Element { toggle_label_class: toggle_label_class, } }, + "torch-dist" => rsx! { + TorchDistControls { + control_title_class: control_title_class, + control_value_class: control_value_class, + input_class: input_class, + } + }, "trace" => rsx! { TraceTimelineControls { control_title_class: control_title_class, diff --git a/web/src/pages/profiling.rs b/web/src/pages/profiling.rs index bf42ea0d..640a23e1 100644 --- a/web/src/pages/profiling.rs +++ b/web/src/pages/profiling.rs @@ -17,8 +17,9 @@ use crate::state::investigation::{ }; use crate::state::profiling::{ apply_profiler_config, normalize_profiling_view, profiling_view_spec, PROFILING_CHROME_LIMIT, - PROFILING_CONFIG_LOADED, PROFILING_PPROF_FREQ, PROFILING_PYTORCH_TIMELINE_RELOAD, - PROFILING_RAY_TIMELINE_RELOAD, PROFILING_TORCH_ENABLED, PROFILING_TRACE_RELOAD, + PROFILING_CONFIG_LOADED, PROFILING_DIST_CLUSTER, PROFILING_DIST_RELOAD, PROFILING_DIST_STEP, + PROFILING_PPROF_FREQ, PROFILING_PYTORCH_TIMELINE_RELOAD, PROFILING_RAY_TIMELINE_RELOAD, + PROFILING_TORCH_ENABLED, PROFILING_TRACE_RELOAD, }; #[component] @@ -53,7 +54,7 @@ pub fn Profiling(view: String) -> Element { fn view_icon(view: &str) -> &'static icondata::Icon { match view { "pprof" => &icondata::CgPerformance, - "torch" => &icondata::SiPytorch, + "torch" | "torch-dist" => &icondata::SiPytorch, "trace" => &icondata::AiThunderboltOutlined, "pytorch" => &icondata::SiPytorch, "ray" => &icondata::AiClockCircleOutlined, @@ -65,6 +66,9 @@ fn view_subtitle(view: &str) -> String { match view { "pprof" => "SIGPROF stack explorer · statistical sampling".to_string(), "torch" => "Module flamegraph from TorchProbe hooks".to_string(), + "torch-dist" => { + "SPMD flamegraph — one training step, all ranks (merge identical stacks)".to_string() + } "trace" => "Chrome trace events from probing buffers — not distributed spans".to_string(), "pytorch" => "PyTorch profiler chrome trace".to_string(), "ray" => "Ray task timeline".to_string(), @@ -95,6 +99,12 @@ fn ProfilerConfigGate(view: String) -> Element { FlamegraphLoader { key: "{view}", view: view.clone() } } }, + "torch-dist" => rsx! { + AsyncBoundary { + message: Some("Loading distributed flamegraph…".to_string()), + DistributedFlamegraphLoader { key: "{view}", view: view.clone() } + } + }, "trace" => rsx! { AsyncBoundary { message: Some("Loading trace data…".to_string()), @@ -228,6 +238,79 @@ fn FlamegraphData(profiler_name: String) -> Element { } } +#[component] +fn DistributedFlamegraphLoader(view: String) -> Element { + let _ = view; + let torch_enabled = *PROFILING_TORCH_ENABLED.read(); + if !torch_enabled { + return rsx! { + ProfilerDisabledNotice { profiler_name: "torch" } + }; + } + + let reload = *PROFILING_DIST_RELOAD.read(); + let step = *PROFILING_DIST_STEP.read(); + let cluster = *PROFILING_DIST_CLUSTER.read(); + + rsx! { + AsyncBoundary { + message: Some("Loading distributed flamegraph…".to_string()), + DistributedFlamegraphData { + key: "torch-dist-{reload}-{step:?}-{cluster}", + step, + cluster, + } + } + } +} + +#[component] +fn DistributedFlamegraphData(step: Option, cluster: bool) -> Element { + let mut metric = use_signal(|| "duration".to_string()); + let fetch_step = step; + let fetch_cluster = cluster; + + let payload = use_app_resource(move || { + let m = metric(); + async move { + let client = ApiClient::new(); + let body = client + .get_distributed_flamegraph_json(fetch_step, Some(&m), fetch_cluster) + .await?; + let parsed: FlamegraphPayload = serde_json::from_str(&body).map_err(|e| { + crate::utils::error::AppError::Api(format!("Invalid flamegraph JSON: {e}")) + })?; + Ok(parsed) + } + }); + + match payload.suspend()?() { + Ok(data) => rsx! { + div { class: "flex flex-col flex-1 min-h-0 min-w-0", + ProfileSnapshotBar { + key: "torch-dist-{metric()}", + profiler: "torch-dist".to_string(), + metric: Some(metric()), + payload: data.clone(), + } + FlamegraphView { + key: "torch-dist-{metric()}", + payload: data, + thread_tid: None, + torch_metric: Some(metric), + on_torch_metric: Some(EventHandler::new(move |m: String| metric.set(m))), + } + } + }, + Err(err) => rsx! { + ProfilingErrorPanel { + title: "Distributed Flamegraph Error".to_string(), + error: err.display_message(), + } + }, + } +} + #[component] fn PytorchTimelineLoader() -> Element { let reload_key = *PROFILING_PYTORCH_TIMELINE_RELOAD.read(); diff --git a/web/src/state/profiling.rs b/web/src/state/profiling.rs index 7f10680c..16f34cfb 100644 --- a/web/src/state/profiling.rs +++ b/web/src/state/profiling.rs @@ -12,6 +12,7 @@ pub fn normalize_profiling_view(view: &str) -> &'static str { match view { "" | "pprof" => "pprof", "torch" => "torch", + "torch-dist" | "distributed-torch" | "torch-distributed" => "torch-dist", "trace" | "trace-timeline" => "trace", "pytorch" | "pytorch-timeline" => "pytorch", "ray" | "ray-timeline" => "ray", @@ -54,6 +55,10 @@ pub static PROFILING_PYTORCH_STEPS: GlobalSignal = Signal::global(|| 5); pub static PROFILING_PYTORCH_TIMELINE_RELOAD: GlobalSignal = Signal::global(|| 0); pub static PROFILING_RAY_TIMELINE_RELOAD: GlobalSignal = Signal::global(|| 0); pub static PROFILING_TRACE_RELOAD: GlobalSignal = Signal::global(|| 0); +/// Optional ``local_step`` for distributed torch flamegraph (``None`` = latest on server). +pub static PROFILING_DIST_STEP: GlobalSignal> = Signal::global(|| None); +pub static PROFILING_DIST_CLUSTER: GlobalSignal = Signal::global(|| true); +pub static PROFILING_DIST_RELOAD: GlobalSignal = Signal::global(|| 0); #[derive(Clone, Debug, PartialEq)] pub struct ProfilingFeedback { @@ -101,6 +106,12 @@ pub const PROFILING_VIEWS: &[ProfilingViewSpec] = &[ sidebar_label: "Torch flamegraph", tooltip: "PyTorch module hook durations · statistical flamegraph (not the profiler timeline)", }, + ProfilingViewSpec { + id: "torch-dist", + label: "Distributed torch", + sidebar_label: "Distributed flamegraph", + tooltip: "SPMD snapshot at one training step — merge identical module stacks across ranks", + }, ProfilingViewSpec { id: "trace", label: "Chrome trace", From 7591d6e72ae8eba5d52e29348c5e856f76d797b5 Mon Sep 17 00:00:00 2001 From: Reiase Date: Tue, 14 Jul 2026 14:23:52 +0800 Subject: [PATCH 18/37] Update .gitignore, Cargo.lock, and profiling documentation (#68) - Added 'frontend/' to .gitignore for improved project cleanliness. - Removed 'signal-hook-registry' from Cargo.lock and added 'ureq' to dependencies. - Enhanced profiling documentation in both English and Chinese to clarify stack capture mechanisms and improve user guidance on using the TorchProfiler. - Introduced new functions in `imagenet_with_span.py` for distributed training argument configuration and initialization, improving the setup for distributed demos. These changes aim to streamline project management and enhance the usability of profiling features. --- .gitignore | 1 + Cargo.lock | 2 +- docs/src/design/profiling.md | 11 +- docs/src/design/profiling.zh.md | 11 +- examples/README.md | 5 + examples/imagenet_with_span.py | 109 ++- examples/run_imagenet_ddp.sh | 149 +++ examples/run_soak.sh | 26 +- probing/extensions/python/Cargo.toml | 2 +- .../extensions/python/src/extensions/pprof.rs | 18 +- .../python/src/features/crash/grace.rs | 10 +- .../python/src/features/crash/report.rs | 4 +- .../python/src/features/flamegraph.rs | 351 ++++++- probing/extensions/python/src/features/mod.rs | 6 +- .../extensions/python/src/features/pprof.rs | 892 ++++++------------ .../python/src/features/stack_capture.rs | 814 ++++++++++++++++ .../python/src/features/stack_merge.rs | 324 +++++++ .../python/src/features/stack_tracer.rs | 311 ++---- .../python/src/features/vm_tracer.rs | 6 +- probing/extensions/python/src/setup.rs | 23 +- probing/server/API.md | 5 +- probing/server/src/server/api/mod.rs | 5 + probing/server/src/server/training.rs | 30 + python/probing/__init__.py | 8 +- python/probing/_entrypoint.py | 25 + python/probing/site_hook.py | 10 +- python/probing_hook.py | 39 +- src/lib.rs | 1 + .../profiling/test_distributed_flamegraph.py | 14 +- tests/regression/spec/api_spec.json | 23 +- tests/unit/probing/test_entrypoint.py | 31 + web/assets/tailwind.css | 12 + web/src/agent/routing.rs | 2 + web/src/api/profiling.rs | 24 - web/src/api/stack.rs | 16 + web/src/app.rs | 54 +- web/src/components/flamegraph/explorer.rs | 68 ++ web/src/components/flamegraph/model.rs | 6 + web/src/components/sidebar/mod.rs | 5 +- .../components/sidebar/profiling/controls.rs | 65 +- web/src/components/sidebar/profiling/mod.rs | 10 +- web/src/components/sidebar/stack/mod.rs | 84 +- web/src/pages/profiling.rs | 89 +- web/src/pages/stack.rs | 104 +- web/src/state/profiling.rs | 11 - web/src/state/stack.rs | 2 + 46 files changed, 2662 insertions(+), 1156 deletions(-) create mode 100755 examples/run_imagenet_ddp.sh create mode 100644 probing/extensions/python/src/features/stack_capture.rs create mode 100644 probing/extensions/python/src/features/stack_merge.rs create mode 100644 tests/unit/probing/test_entrypoint.py diff --git a/.gitignore b/.gitignore index 247bf6b3..216a132b 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ docs/site/ .coverage .pytest_cache/ web/target/ +frontend/ \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 2773c327..a1c5b701 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3580,10 +3580,10 @@ dependencies = [ "serde", "serde_json", "sha2", - "signal-hook-registry", "tempfile", "thiserror 2.0.12", "tokio", + "ureq", "uuid", ] diff --git a/docs/src/design/profiling.md b/docs/src/design/profiling.md index 7a32aaca..c7b945bd 100644 --- a/docs/src/design/profiling.md +++ b/docs/src/design/profiling.md @@ -155,12 +155,15 @@ Profiling starts on the first `optimizer.step()` after torch is imported (optimi ### Backtrace Collection -On-demand or periodic stack capture (SIGUSR2 / synchronous walk) into `python.backtrace`: +On-demand stack capture and CPU sampling (`SIGPROF`, `probing.pprof.sample_freq`) share one stack pipeline: -- Function names, file paths, line numbers -- Python and native frames (merged where possible) +- **Python frames:** eval-frame hook (`vm_tracer` / `PYSTACKS`) is the sole source; symbols are interned under the GIL (full path for source view, basename in flamegraph labels); signal handlers copy pointer keys only. +- **Native frames:** `SIGPROF` and cross-thread `SIGUSR2` use the same safe handler—frame-pointer walk + POD snapshot in-signal; symbolization and Python/native merge run off-signal (best-effort, no errors propagated upward). +- **Merge:** `stack_merge` splices Python frames at CPython eval boundaries (leaf-aligned). +- **Reuse:** when `SIGPROF` sampling is active, the main-thread HTTP/flamegraph path reuses the latest per-thread SIGPROF snapshot when available. +- **Main-thread HTTP path:** does not deliver `SIGUSR2` (avoids interrupting the training main thread); without SIGPROF it falls back to a synchronous `PYSTACKS` read (Python-heavy, one-shot). Cross-thread on-demand capture still uses `SIGUSR2` (dedicated to stack capture; crash grace release is HTTP-only). -CPU sampling via pprof (`probing.pprof.sample_freq`) is separate from TorchProbe module hooks. +TorchProbe module hooks are independent. The distributed flamegraph (`GET /apis/training/distributed_flamegraph/json`) currently aggregates `python.torch_trace`; cross-rank CPU mixed-mode flamegraphs should prefer the unified SIGPROF data source (cluster fan-out of folded stacks) rather than per-path merge logic. ## System Metrics diff --git a/docs/src/design/profiling.zh.md b/docs/src/design/profiling.zh.md index c354bc3e..61b57fbe 100644 --- a/docs/src/design/profiling.zh.md +++ b/docs/src/design/profiling.zh.md @@ -157,7 +157,16 @@ configure("on,rate=0.5,layer_rate=0.3") ## Python 堆栈分析 -按需或周期性栈采集(SIGUSR2 / 同步 walk)写入 `python.backtrace`。CPU 采样(pprof,`probing.pprof.sample_freq`)与 TorchProbe 模块钩子相互独立。 +按需栈采集与 CPU 采样(`SIGPROF`,`probing.pprof.sample_freq`)共用同一套基础设施: + +- **Python 帧**:eval-frame hook(`vm_tracer` / `PYSTACKS`)是唯一数据源;符号在 GIL 下 intern(保留完整路径供源码查看,火焰图展示 basename),signal 路径只拷贝指针。 +- **C++ 帧**:`SIGPROF` 与跨线程 `SIGUSR2` 使用相同的安全 handler——仅在 signal 内做 frame-pointer walk + 拷贝 POD 快照;symbolize 与 Python/native 合并在 signal 外完成(尽力而为,不向上抛错)。 +- **合并**:`stack_merge` 在 eval 帧边界将 Python 帧拼入 native 塔(leaf 对齐)。 +- **复用**:`SIGPROF` 开启时,主线程 HTTP/火焰图路径优先复用该线程最近一次 SIGPROF 快照,避免重复 signal。 +- **主线程 HTTP 路径**:不发 `SIGUSR2`(避免中断训练主线程);无 SIGPROF 时回退为同步读取 `PYSTACKS`(Python 帧为主,单次快照)。跨线程按需采集仍使用 `SIGUSR2`(与 crash grace 分离,grace release 仅 HTTP)。 +- **分布式火焰图**:跨 rank merge 后每个 frame 携带 `ranks`(该分区下贡献样本的 training rank);Web 点选/缩放某个分叉时展示这些 rank。 + +TorchProbe 模块钩子与上述栈采集相互独立。分布式 CPU 混合栈火焰图见 `GET /apis/training/distributed_stack_flamegraph/json`(Web:**Stacks → Distributed**)。旧版 torch 模块级 API `/apis/training/distributed_flamegraph/json` 仍保留。 ## 系统指标 diff --git a/examples/README.md b/examples/README.md index fdea0e5a..9579b16e 100644 --- a/examples/README.md +++ b/examples/README.md @@ -18,6 +18,7 @@ Framework integration **contract tests** live under `tests/regression/ext/` (e.g | **`torch_probe_overhead_smoke.py`** | none | TorchProbe shadow-step overhead smoke (no GPU) | | **`bench_instrumentation.py`** | `torch` (optional) | One-shot report: span / phase hooks / TorchProbe overhead (`make bench`) | | **`run_soak.sh`** | `torch`, `torchvision` | Long-running soak (synthetic ImageNet + probing); used by CI `soak.yml` | +| **`run_imagenet_ddp.sh`** | `torch`, `torchvision` | **默认 2-rank torchrun** DDP demo(cluster query / 分布式火焰图 / `global.python.profile_*`) | | **`run_megatron_soak.sh`** | `megatron-core`, CUDA | Megatron-Core torchrun soak(默认 2 GPU / TP=2,`PROBING_PORT=18080`) | | **`run_vllm_soak.sh`** | `vllm` / `vllm-metal` | vLLM 真实推理 soak(默认 10min,`PROBING_PORT=18081`) | | **`soak_assert.py`** | none (beyond probing) | Post-soak SQL / overhead assertions | @@ -58,6 +59,10 @@ DURATION_SEC=60 ./examples/run_soak.sh # 2-rank gloo DDP (assertions on rank 0) NPROC=2 DIST_BACKEND=gloo DURATION_SEC=120 ./examples/run_soak.sh + +# dedicated distributed demo (default 2 ranks, Web UI on :18080) +./examples/run_imagenet_ddp.sh +DURATION_SEC=60 ./examples/run_imagenet_ddp.sh ``` On Linux you can also attach with `probing -t inject` instead of `PROBING=1` at startup. diff --git a/examples/imagenet_with_span.py b/examples/imagenet_with_span.py index 418947c0..db4cff5a 100644 --- a/examples/imagenet_with_span.py +++ b/examples/imagenet_with_span.py @@ -233,6 +233,86 @@ def _training_device( return torch.device("cpu") +def _configure_distributed_args(args) -> None: + """Honor ``torchrun`` env (``RANK`` / ``WORLD_SIZE`` / ``LOCAL_RANK``).""" + if "WORLD_SIZE" in os.environ: + args.world_size = int(os.environ["WORLD_SIZE"]) + elif args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + if "RANK" in os.environ and args.rank == -1: + args.rank = int(os.environ["RANK"]) + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + +def _init_distributed(args, gpu: int | None, ngpus_per_node: int) -> None: + if not args.distributed: + return + if "RANK" in os.environ and "WORLD_SIZE" in os.environ: + if args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.world_size < 1: + args.world_size = int(os.environ["WORLD_SIZE"]) + dist.init_process_group(backend=args.dist_backend) + return + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + args.rank = args.rank * ngpus_per_node + gpu + dist.init_process_group( + backend=args.dist_backend, + init_method=args.dist_url, + world_size=args.world_size, + rank=args.rank, + ) + + +def _sync_probing_ddp_role() -> None: + if not dist.is_available() or not dist.is_initialized(): + return + rank = dist.get_rank() + world = dist.get_world_size() + os.environ["DATA_PARALLEL_RANK"] = str(rank) + os.environ["DATA_PARALLEL_SIZE"] = str(world) + probing.set_role(dp=rank) + + +def _is_primary_rank(args) -> bool: + if not args.distributed: + return True + if dist.is_available() and dist.is_initialized(): + return dist.get_rank() == 0 + return args.rank in (-1, 0) + + +def _log_distributed_probing_banner() -> None: + if not dist.is_available() or not dist.is_initialized() or dist.get_rank() != 0: + return + port = os.environ.get("PROBING_PORT", "18080") + world = dist.get_world_size() + print( + f"=> probing distributed demo: world_size={world} " + f"Web UI http://127.0.0.1:{port}/", + flush=True, + ) + print( + "=> try: probing -t 127.0.0.1:" + f"{port} cluster nodes", + flush=True, + ) + + +def _per_rank_batch_size(args, *, ngpus_per_node: int, device: torch.device) -> int: + if not args.distributed: + return args.batch_size + if device.type == "cuda": + divisor = ngpus_per_node + elif dist.is_available() and dist.is_initialized(): + divisor = dist.get_world_size() + else: + divisor = max(1, args.world_size) + return max(1, int(args.batch_size / divisor)) + + def main(): args = parser.parse_args() @@ -255,10 +335,7 @@ def main(): "disable data parallelism." ) - if args.dist_url == "env://" and args.world_size == -1: - args.world_size = int(os.environ["WORLD_SIZE"]) - - args.distributed = args.world_size > 1 or args.multiprocessing_distributed + _configure_distributed_args(args) if torch.cuda.is_available(): ngpus_per_node = torch.cuda.device_count() @@ -292,18 +369,9 @@ def main_worker(gpu, ngpus_per_node, args): print(f"Use LOCAL_RANK: {local_rank} for distributed training") if args.distributed: - if args.dist_url == "env://" and args.rank == -1: - args.rank = int(os.environ["RANK"]) - if args.multiprocessing_distributed: - # For multiprocessing distributed training, rank needs to be the - # global rank among all the processes - args.rank = args.rank * ngpus_per_node + gpu - dist.init_process_group( - backend=args.dist_backend, - init_method=args.dist_url, - world_size=args.world_size, - rank=args.rank, - ) + _init_distributed(args, args.gpu, ngpus_per_node) + _sync_probing_ddp_role() + _log_distributed_probing_banner() # create model with probing.span("model.init"): if args.pretrained: @@ -324,13 +392,18 @@ def main_worker(gpu, ngpus_per_node, args): if device.type == "cuda": torch.cuda.set_device(local_rank) model = model.to(device) - args.batch_size = int(args.batch_size / ngpus_per_node) + args.batch_size = _per_rank_batch_size( + args, ngpus_per_node=ngpus_per_node, device=device + ) args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) model = torch.nn.parallel.DistributedDataParallel( model, device_ids=[local_rank] ) else: model = model.to(device) + args.batch_size = _per_rank_batch_size( + args, ngpus_per_node=ngpus_per_node, device=device + ) model = torch.nn.parallel.DistributedDataParallel(model) elif args.gpu is not None and torch.cuda.is_available(): torch.cuda.set_device(args.gpu) @@ -546,7 +619,7 @@ def main_worker(gpu, ngpus_per_node, args): ) probing.event("epoch.end", attributes=[{"best_acc1": float(best_acc1)}]) - if args.soak_assert and (not args.distributed or args.rank == 0): + if args.soak_assert and _is_primary_rank(args): _run_soak_assert(args) diff --git a/examples/run_imagenet_ddp.sh b/examples/run_imagenet_ddp.sh new file mode 100755 index 00000000..db8a56c8 --- /dev/null +++ b/examples/run_imagenet_ddp.sh @@ -0,0 +1,149 @@ +#!/usr/bin/env bash +# ImageNet synthetic training — default 2-rank DDP via torchrun + probing cluster demo. +# +# Exercises distributed cluster query, distributed flamegraph, and federated +# profile_hotspot SQL (global.python.*) while training runs. +# +# Prerequisites: +# make develop +# uv pip install torch torchvision +# +# Usage: +# ./examples/run_imagenet_ddp.sh +# DURATION_SEC=60 ./examples/run_imagenet_ddp.sh +# NPROC=2 DIST_BACKEND=nccl ./examples/run_imagenet_ddp.sh # needs >=2 GPUs +# +# While training (rank 0): +# http://127.0.0.1:${PROBING_PORT}/ +# +# After a short run, try (another terminal): +# probing -t 127.0.0.1:${PROBING_PORT} cluster nodes +# probing -t 127.0.0.1:${PROBING_PORT} cluster query \ +# "SELECT rank, bucket_kind, bucket_name, self_us FROM global.python.profile_hotspot LIMIT 20" +# probing -t 127.0.0.1:${PROBING_PORT} query \ +# "SELECT rank, name, self_us FROM python.torch_trace ORDER BY self_us DESC LIMIT 10" + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +PYTHON="$(command -v "${PYTHON:-python}")" + +if ! "$PYTHON" python/probing/dev_pth.py status >/dev/null 2>&1; then + echo "error: dev env not ready — run: make develop" >&2 + exit 1 +fi + +# Always launch via the venv interpreter. Bare ``torchrun`` on PATH often points at +# pyenv/system Python, so worker ranks miss editable ``probing`` + site hooks. +TORCHRUN=("$PYTHON" -m torch.distributed.run) + +NPROC="${NPROC:-2}" +DIST_BACKEND="${DIST_BACKEND:-gloo}" +DURATION_SEC="${DURATION_SEC:-120}" +MAX_STEPS="${MAX_STEPS:-0}" +BATCH_SIZE="${BATCH_SIZE:-64}" +WORKERS="${WORKERS:-0}" +PROBING_PORT="${PROBING_PORT:-18080}" +PROBING_DATA_DIR="${PROBING_DATA_DIR:-/tmp/probing_imagenet_ddp_$$}" +MASTER_PORT="${MASTER_PORT:-29582}" +SOAK_ASSERT="${SOAK_ASSERT:-1}" +MASTER_ADDR="${MASTER_ADDR:-127.0.0.1}" + +export MASTER_ADDR MASTER_PORT +if [[ "$(uname -s)" == Darwin ]]; then + export GLOO_SOCKET_IFNAME="${GLOO_SOCKET_IFNAME:-lo0}" +fi + +export PROBING="${PROBING:-1}" +export PROBING_PORT +export PROBING_DATA_DIR +export PROBING_TORCH_PROFILING="${PROBING_TORCH_PROFILING:-0.01,backward=on}" +export PROBING_SAMPLE_RATE="${PROBING_SAMPLE_RATE:-1.0}" +export PROBING_RETENTION_DAYS="${PROBING_RETENTION_DAYS:-1}" +export SOAK_EXPECT_CLUSTER=1 + +mkdir -p "$PROBING_DATA_DIR" + +# Rank 0 binds PROBING_PORT for the Web UI. A stale listener from a prior run +# causes "Address already in use" and the UI keeps talking to the old binary. +if command -v lsof >/dev/null 2>&1; then + stale_pids="$(lsof -tiTCP:"$PROBING_PORT" -sTCP:LISTEN 2>/dev/null || true)" + if [[ -n "$stale_pids" ]]; then + echo "warning: port ${PROBING_PORT} in use (PIDs: ${stale_pids//$'\n'/, }) — stopping stale listener(s)" + fi + while read -r pid; do + [[ -n "$pid" ]] || continue + kill "$pid" 2>/dev/null || true + done <<< "$stale_pids" + sleep 0.5 + stale_pids="$(lsof -tiTCP:"$PROBING_PORT" -sTCP:LISTEN 2>/dev/null || true)" + while read -r pid; do + [[ -n "$pid" ]] || continue + kill -9 "$pid" 2>/dev/null || true + done <<< "$stale_pids" +fi + +COMMON_ARGS=( + examples/imagenet_with_span.py + /tmp/imagenet-dummy + --dummy + --no-validate + --arch resnet18 + --batch-size "$BATCH_SIZE" + --workers "$WORKERS" + --epochs 9999 + --max-duration-sec "$DURATION_SEC" + --dist-backend "$DIST_BACKEND" +) + +if [[ "$MAX_STEPS" -gt 0 ]]; then + COMMON_ARGS+=(--max-steps "$MAX_STEPS") +fi + +if [[ "$SOAK_ASSERT" == "1" ]]; then + COMMON_ARGS+=(--soak-assert) +fi + +if [[ "$DIST_BACKEND" == "nccl" ]]; then + if ! "$PYTHON" -c "import torch; assert torch.cuda.is_available()" 2>/dev/null; then + echo "error: nccl requires CUDA; use DIST_BACKEND=gloo on CPU/macOS" >&2 + exit 1 + fi + gpu_count="$("$PYTHON" -c 'import torch; print(torch.cuda.device_count())')" + if [[ "$NPROC" -gt "$gpu_count" ]]; then + echo "error: nccl needs >= $NPROC GPUs (found $gpu_count)" >&2 + exit 1 + fi +fi + +echo "=== ImageNet DDP + probing (${NPROC} ranks, backend=${DIST_BACKEND}) ===" +echo "PROBING=$PROBING PROBING_PORT=$PROBING_PORT PROBING_DATA_DIR=$PROBING_DATA_DIR" +echo "python=$PYTHON" +echo "limits: DURATION_SEC=$DURATION_SEC MAX_STEPS=${MAX_STEPS:-0}" +echo "Web UI (rank 0): http://127.0.0.1:${PROBING_PORT}/" +echo + +"${TORCHRUN[@]}" --standalone --nproc_per_node="$NPROC" \ + --master_addr="$MASTER_ADDR" \ + --master_port="$MASTER_PORT" \ + --local_addr=127.0.0.1 \ + "${COMMON_ARGS[@]}" "$@" + +echo +echo "=== training finished ===" +echo "cluster nodes:" +echo " probing -t 127.0.0.1:${PROBING_PORT} cluster nodes" +echo +echo "distributed torch_trace (flamegraph source):" +echo " probing -t 127.0.0.1:${PROBING_PORT} cluster query \\" +echo " \"SELECT rank, name, round(self_us/1e3, 2) AS self_ms FROM global.python.torch_trace ORDER BY self_us DESC LIMIT 20\"" +echo +echo "federated profiler SQL (after a profile capture on each rank):" +echo " probing -t 127.0.0.1:${PROBING_PORT} cluster query \\" +echo " \"SELECT rank, bucket_kind, bucket_name, self_us FROM global.python.profile_hotspot ORDER BY self_us DESC LIMIT 20\"" +echo +echo "Web: http://127.0.0.1:${PROBING_PORT}/stacks/distributed (full) · /stacks/distributed/py (Python only)" +echo "memtable data: $PROBING_DATA_DIR" diff --git a/examples/run_soak.sh b/examples/run_soak.sh index f8fed8c6..73f87b65 100755 --- a/examples/run_soak.sh +++ b/examples/run_soak.sh @@ -8,6 +8,9 @@ # Distributed (gloo on CPU, NCCL on CUDA): # NPROC=2 DIST_BACKEND=gloo ./examples/run_soak.sh # +# Dedicated 2-rank demo (cluster query / flamegraph / profile SQL): +# ./examples/run_imagenet_ddp.sh +# # Env: # DURATION_SEC wall-clock cap (default 600) # MAX_STEPS optimizer-step cap (default 0 = duration only) @@ -21,6 +24,9 @@ set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +PYTHON="$(command -v "${PYTHON:-python}")" + DURATION_SEC="${DURATION_SEC:-600}" MAX_STEPS="${MAX_STEPS:-0}" NPROC="${NPROC:-1}" @@ -29,6 +35,8 @@ PROBING_DATA_DIR="${PROBING_DATA_DIR:-/tmp/probing_soak_$$}" SOAK_ASSERT="${SOAK_ASSERT:-1}" BATCH_SIZE="${BATCH_SIZE:-64}" WORKERS="${WORKERS:-0}" +MASTER_ADDR="${MASTER_ADDR:-127.0.0.1}" +MASTER_PORT="${MASTER_PORT:-29581}" export PROBING="${PROBING:-1}" export PROBING_TORCH_PROFILING="${PROBING_TORCH_PROFILING:-on,shadow=4:1}" @@ -38,10 +46,17 @@ export PROBING_DATA_DIR if [[ "$NPROC" -gt 1 ]]; then export SOAK_EXPECT_CLUSTER=1 + export PROBING_PORT="${PROBING_PORT:-18080}" + export MASTER_ADDR MASTER_PORT + if [[ "$(uname -s)" == Darwin ]]; then + export GLOO_SOCKET_IFNAME="${GLOO_SOCKET_IFNAME:-lo0}" + fi fi mkdir -p "$PROBING_DATA_DIR" +TORCHRUN=("$PYTHON" -m torch.distributed.run) + COMMON_ARGS=( examples/imagenet_with_span.py /tmp/imagenet-dummy @@ -67,19 +82,22 @@ echo "PROBING_DATA_DIR=$PROBING_DATA_DIR" echo if [[ "$NPROC" -le 1 ]]; then - "${PYTHON:-python}" "${COMMON_ARGS[@]}" + "$PYTHON" "${COMMON_ARGS[@]}" else if [[ "$DIST_BACKEND" == "nccl" ]]; then - if ! "${PYTHON:-python}" -c "import torch; assert torch.cuda.is_available()" 2>/dev/null; then + if ! "$PYTHON" -c "import torch; assert torch.cuda.is_available()" 2>/dev/null; then echo "nccl soak requires CUDA; set DIST_BACKEND=gloo or NPROC=1" >&2 exit 1 fi - if [[ "$NPROC" -gt 1 ]] && [[ "$(python -c 'import torch; print(torch.cuda.device_count())')" -lt "$NPROC" ]]; then + if [[ "$NPROC" -gt 1 ]] && [[ "$("$PYTHON" -c 'import torch; print(torch.cuda.device_count())')" -lt "$NPROC" ]]; then echo "nccl soak needs >= $NPROC GPUs" >&2 exit 1 fi fi - torchrun --standalone --nproc_per_node="$NPROC" \ + "${TORCHRUN[@]}" --standalone --nproc_per_node="$NPROC" \ + --master_addr="$MASTER_ADDR" \ + --master_port="$MASTER_PORT" \ + --local_addr=127.0.0.1 \ "${COMMON_ARGS[@]}" \ --dist-backend "$DIST_BACKEND" fi diff --git a/probing/extensions/python/Cargo.toml b/probing/extensions/python/Cargo.toml index 3e12183d..df507dc9 100644 --- a/probing/extensions/python/Cargo.toml +++ b/probing/extensions/python/Cargo.toml @@ -29,6 +29,7 @@ serde_json = { workspace = true } sha2 = "0.10" uuid = { version = "1.0", features = ["v4"] } tokio = { workspace = true } +ureq = { workspace = true } html-escape = "0.2" include_dir = "=0.7.4" @@ -48,7 +49,6 @@ pyo3 = { version = "0.29.0", default-features = false, features = [ # symbolization done off the signal path on a consumer thread. lazy_static = "1.4.0" async-trait = "0.1.83" -signal-hook-registry = "1.4.2" regex = ">=1.6.0" [dev-dependencies] diff --git a/probing/extensions/python/src/extensions/pprof.rs b/probing/extensions/python/src/extensions/pprof.rs index 93876512..43086906 100644 --- a/probing/extensions/python/src/extensions/pprof.rs +++ b/probing/extensions/python/src/extensions/pprof.rs @@ -19,7 +19,7 @@ impl ProbeExtensionCall for PprofProbeExtension { async fn call( &self, path: &str, - _params: &HashMap, + params: &HashMap, _body: &[u8], ) -> Result, EngineError> { match path.trim_start_matches('/') { @@ -27,6 +27,22 @@ impl ProbeExtensionCall for PprofProbeExtension { .map(|html| html.into_bytes()) .map_err(|e| EngineError::CallError(e.to_string())), "flamegraph/json" => Ok(crate::features::pprof::flamegraph_json().into_bytes()), + "flamegraph/folded/json" => { + Ok(crate::features::pprof::folded_lines_json().into_bytes()) + } + "flamegraph/distributed/json" => { + let cluster = params + .get("cluster") + .map(|v| v.as_str()) + .map(|v| v != "0" && v != "false") + .unwrap_or(true); + let mode = params.get("mode").map(|s| s.as_str()).unwrap_or("mixed"); + let (body, _) = crate::features::pprof::collect_distributed_stack_flamegraph_json( + cluster, mode, + ) + .await; + Ok(body.into_bytes()) + } _ => Err(EngineError::UnsupportedCall), } } diff --git a/probing/extensions/python/src/features/crash/grace.rs b/probing/extensions/python/src/features/crash/grace.rs index 5b8f6665..6299d96e 100644 --- a/probing/extensions/python/src/features/crash/grace.rs +++ b/probing/extensions/python/src/features/crash/grace.rs @@ -93,8 +93,9 @@ fn register_signals() { { use nix::sys::signal::{self, SigHandler, Signal}; unsafe { + // SIGUSR1 = hold. Release is HTTP-only (`POST /apis/pythonext/crash/release`) + // so SIGUSR2 remains dedicated to stack capture (installed at process start). let _ = signal::signal(Signal::SIGUSR1, SigHandler::Handler(on_hold_signal)); - let _ = signal::signal(Signal::SIGUSR2, SigHandler::Handler(on_release_signal)); } } } @@ -104,11 +105,6 @@ extern "C" fn on_hold_signal(_: nix::libc::c_int) { request_hold(); } -#[cfg(unix)] -extern "C" fn on_release_signal(_: nix::libc::c_int) { - request_release(true); -} - fn hold_triggered(pid: i32) -> bool { if config::force_hold() { return true; @@ -128,7 +124,7 @@ fn print_hold_banner(pid: i32, rank: i32) { attach : gdb -p {pid}\n\ python : py-spy dump --pid {pid}\n\ release: curl -X POST http://127.0.0.1:/apis/pythonext/crash/release\n\ - rm {} && kill -USR2 {pid}\n", + rm {}\n", context::hold_file_path(pid) ); } diff --git a/probing/extensions/python/src/features/crash/report.rs b/probing/extensions/python/src/features/crash/report.rs index 4d9d3646..3ff48699 100644 --- a/probing/extensions/python/src/features/crash/report.rs +++ b/probing/extensions/python/src/features/crash/report.rs @@ -142,9 +142,7 @@ fn format_event( super::context::hold_file_path(event.pid) )); } else if hold_active { - lines.push( - " hold active — kill -USR2 or POST /apis/pythonext/crash/release".into(), - ); + lines.push(" hold active — POST /apis/pythonext/crash/release".into()); } } else { lines.push( diff --git a/probing/extensions/python/src/features/flamegraph.rs b/probing/extensions/python/src/features/flamegraph.rs index 4cf2e584..65c6c8c0 100644 --- a/probing/extensions/python/src/features/flamegraph.rs +++ b/probing/extensions/python/src/features/flamegraph.rs @@ -47,6 +47,8 @@ impl Default for FlamegraphOptions { struct Node { name: String, value: u64, + /// Training ranks that contributed samples under this node (distributed only). + ranks: std::collections::BTreeSet, children: Vec, } @@ -60,6 +62,15 @@ struct PlacedFrame { y: f64, w: f64, depth: usize, + ranks: Vec, +} + +/// Folded stack with sample count and contributing training ranks. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct AttributedFoldedLine { + pub path: Vec, + pub count: u64, + pub ranks: Vec, } #[derive(Debug)] @@ -70,16 +81,33 @@ pub struct Flamegraph { impl Flamegraph { pub fn from_folded_lines(lines: &[String]) -> Option { + let attributed: Vec = lines + .iter() + .filter_map(|line| { + let (path, count) = parse_folded_line(line)?; + Some(AttributedFoldedLine { + path, + count, + ranks: Vec::new(), + }) + }) + .collect(); + Self::from_attributed_folded_lines(&attributed) + } + + pub fn from_attributed_folded_lines(lines: &[AttributedFoldedLine]) -> Option { let mut root = Node { name: "all".to_string(), value: 0, + ranks: std::collections::BTreeSet::new(), children: Vec::new(), }; for line in lines { - if let Some((path, value)) = parse_folded_line(line) { - insert_path(&mut root, &path, value); + if line.count == 0 || line.path.is_empty() { + continue; } + insert_path(&mut root, &line.path, line.count, &line.ranks); } if root.value == 0 { @@ -340,6 +368,9 @@ fn frames_to_json(frames: &[PlacedFrame], torch: bool) -> Vec obj["phase"] = json!(phase); obj["modulePath"] = json!(module_path); } + if !f.ranks.is_empty() { + obj["ranks"] = json!(f.ranks); + } obj }) .collect() @@ -770,6 +801,200 @@ background:#0b0f14;color:#8b9bb4;font-family:ui-sans-serif,system-ui,sans-serif; } } +/// Whether a folded segment is a per-process thread bucket (`thread-{tid}` or `thread-{tid} (name)`). +fn is_thread_folded_segment(seg: &str) -> bool { + let Some(rest) = seg.strip_prefix("thread-") else { + return false; + }; + let digit_len = rest.chars().take_while(|c| c.is_ascii_digit()).count(); + digit_len > 0 + && (rest.len() == digit_len + || matches!(rest.as_bytes().get(digit_len), Some(b' ') | Some(b'('))) +} + +/// Drop root `all` and per-process `thread-*` prefixes so identical stacks merge across ranks. +pub fn normalize_distributed_stack_folded_line(line: &str) -> Option { + let (mut path, count) = parse_folded_line(line)?; + while path.first().is_some_and(|s| s == "all") { + path.remove(0); + } + while path.first().is_some_and(|s| is_thread_folded_segment(s)) { + path.remove(0); + } + if path.is_empty() { + return None; + } + let path = crate::features::stack_merge::canonicalize_folded_segments(&path); + if path.is_empty() { + return None; + } + Some(format!("{} {}", path.join(";"), count)) +} + +/// Keep only `[py] …` segments so native/C frames do not fork the flamegraph. +pub fn filter_folded_line_python_only(line: &str) -> Option { + let (path, count) = parse_folded_line(line)?; + let py_path: Vec = path.into_iter().filter(|s| s.starts_with("[py]")).collect(); + if py_path.is_empty() { + return None; + } + Some(format!("{} {}", py_path.join(";"), count)) +} + +pub fn filter_folded_lines_python_only(lines: &[String]) -> Vec { + lines + .iter() + .filter_map(|line| filter_folded_line_python_only(line)) + .collect() +} + +/// Keep only `[py]` segments while preserving rank attribution. +pub fn filter_attributed_folded_lines_python_only( + lines: &[AttributedFoldedLine], +) -> Vec { + lines + .iter() + .filter_map(|line| { + let py_path: Vec = line + .path + .iter() + .filter(|s| s.starts_with("[py]")) + .cloned() + .collect(); + if py_path.is_empty() { + return None; + } + Some(AttributedFoldedLine { + path: py_path, + count: line.count, + ranks: line.ranks.clone(), + }) + }) + .collect() +} + +/// Merge folded stack lines across ranks after [`normalize_distributed_stack_folded_line`]. +pub fn merge_distributed_stack_folded_line_sets(sets: &[Vec]) -> Vec { + let attributed: Vec<(Option, Vec)> = + sets.iter().map(|lines| (None, lines.clone())).collect(); + merge_distributed_stack_attributed(&attributed) + .into_iter() + .map(|line| format!("{} {}", line.path.join(";"), line.count)) + .collect() +} + +/// Merge per-rank folded stacks, summing counts and collecting contributing ranks. +/// +/// `sets` entries are `(rank, folded lines)`. When `rank` is `None`, the lines still +/// contribute to counts but are not attributed to a training rank id. +pub fn merge_distributed_stack_attributed( + sets: &[(Option, Vec)], +) -> Vec { + use std::collections::{BTreeSet, HashMap}; + let mut counts: HashMap = HashMap::new(); + let mut ranks: HashMap> = HashMap::new(); + for (rank, lines) in sets { + for line in lines { + let Some(normalized) = normalize_distributed_stack_folded_line(line) else { + continue; + }; + let Some((path, count)) = parse_folded_line(&normalized) else { + continue; + }; + let key = path.join(";"); + *counts.entry(key.clone()).or_insert(0) += count; + if let Some(r) = rank { + ranks.entry(key).or_default().insert(*r); + } + } + } + let mut merged: Vec = counts + .into_iter() + .filter_map(|(key, count)| { + let path: Vec = key.split(';').map(str::to_string).collect(); + if path.is_empty() { + return None; + } + let ranks = ranks + .remove(&key) + .map(|s| s.into_iter().collect()) + .unwrap_or_default(); + Some(AttributedFoldedLine { path, count, ranks }) + }) + .collect(); + merged.sort_by(|a, b| a.path.cmp(&b.path)); + merged +} + +/// Merge folded `"stack;path count"` lines from multiple ranks; identical paths sum counts. +pub fn merge_folded_line_sets(sets: &[Vec]) -> Vec { + use std::collections::HashMap; + let mut counts: HashMap = HashMap::new(); + for lines in sets { + for line in lines { + if let Some((path, count)) = parse_folded_line(line) { + let key = path.join(";"); + *counts.entry(key).or_insert(0) += count; + } + } + } + let mut merged: Vec = counts + .into_iter() + .map(|(path, count)| format!("{path} {count}")) + .collect(); + merged.sort(); + merged +} + +/// Reconstruct folded lines from a Web UI flamegraph JSON payload (leaf frames only). +pub fn folded_lines_from_flamegraph_json(body: &str) -> Vec { + #[derive(serde::Deserialize)] + struct Payload { + frames: Vec, + } + #[derive(serde::Deserialize)] + struct Frame { + id: usize, + parent: Option, + name: String, + value: u64, + } + + let payload: Payload = match serde_json::from_str(body) { + Ok(p) => p, + Err(_) => return Vec::new(), + }; + if payload.frames.is_empty() { + return Vec::new(); + } + let by_id: std::collections::HashMap = + payload.frames.iter().map(|f| (f.id, f)).collect(); + let parents: std::collections::HashSet = + payload.frames.iter().filter_map(|f| f.parent).collect(); + let mut lines = Vec::new(); + for leaf in payload.frames.iter().filter(|f| !parents.contains(&f.id)) { + if leaf.value == 0 { + continue; + } + let mut path = Vec::new(); + let mut cur = Some(leaf.id); + while let Some(id) = cur { + let Some(frame) = by_id.get(&id) else { + break; + }; + if frame.name != "all" { + path.push(frame.name.clone()); + } + cur = frame.parent; + } + path.reverse(); + if !path.is_empty() { + lines.push(format!("{} {}", path.join(";"), leaf.value)); + } + } + lines +} + fn parse_folded_line(line: &str) -> Option<(Vec, u64)> { let line = line.trim(); if line.is_empty() { @@ -791,21 +1016,25 @@ fn parse_folded_line(line: &str) -> Option<(Vec, u64)> { Some((frames, count)) } -fn insert_path(node: &mut Node, path: &[String], value: u64) { +fn insert_path(node: &mut Node, path: &[String], value: u64, ranks: &[i32]) { node.value += value; + for &r in ranks { + node.ranks.insert(r); + } if path.is_empty() { return; } let head = &path[0]; if let Some(child) = node.children.iter_mut().find(|c| c.name == *head) { - insert_path(child, &path[1..], value); + insert_path(child, &path[1..], value, ranks); } else { let mut child = Node { name: head.clone(), value: 0, + ranks: std::collections::BTreeSet::new(), children: Vec::new(), }; - insert_path(&mut child, &path[1..], value); + insert_path(&mut child, &path[1..], value, ranks); node.children.push(child); } } @@ -837,6 +1066,7 @@ fn layout_node( y, w: width, depth, + ranks: node.ranks.iter().copied().collect(), }); if node.value == 0 || width < MIN_RENDER_WIDTH { @@ -871,6 +1101,117 @@ fn layout_node( mod tests { use super::*; + #[test] + fn filter_folded_line_python_only_strips_native() { + let out = filter_folded_line_python_only( + "[py] train (a.py:1);_PyObject_Vectorcall;[py] forward (b.py:2) 4", + ) + .unwrap(); + assert_eq!( + out, + "[py] train (a.py:1);[py] forward (b.py:2) 4".to_string() + ); + } + + #[test] + fn merge_distributed_stacks_canonicalizes_interpreter_prefix() { + let merged = merge_distributed_stack_folded_line_sets(&[ + vec![ + "[py] (imagenet_with_span.py:1);[py] train (imagenet_with_span.py:659) 2" + .to_string(), + ], + vec![ + "_Py_RunMain;_pymain_run_file;[py] (imagenet_with_span.py:1);[py] train (imagenet_with_span.py:659) 1" + .to_string(), + ], + ]); + assert_eq!( + merged, + vec![ + "[py] (imagenet_with_span.py:1);[py] train (imagenet_with_span.py:659) 3" + ] + ); + } + + #[test] + fn merge_distributed_stacks_strips_thread_prefix_across_ranks() { + let merged = merge_distributed_stack_folded_line_sets(&[ + vec!["thread-100;[py] main (train.py:1) 3".to_string()], + vec!["thread-200;[py] main (train.py:1) 2".to_string()], + ]); + assert_eq!(merged, vec!["[py] main (train.py:1) 5".to_string()]); + } + + #[test] + fn merge_distributed_attributed_collects_ranks_per_path() { + let merged = merge_distributed_stack_attributed(&[ + ( + Some(0), + vec!["thread-1;[py] main (a.py:1);[py] train (a.py:2) 2".to_string()], + ), + ( + Some(1), + vec!["thread-2;[py] main (a.py:1);[py] train (a.py:2) 3".to_string()], + ), + ( + Some(1), + vec!["thread-3;[py] platform;[py] train (a.py:2) 1".to_string()], + ), + ]); + let shared = merged + .iter() + .find(|l| l.path == ["[py] main (a.py:1)", "[py] train (a.py:2)"]) + .expect("shared path"); + assert_eq!(shared.count, 5); + assert_eq!(shared.ranks, vec![0, 1]); + + let fork = merged + .iter() + .find(|l| l.path == ["[py] platform", "[py] train (a.py:2)"]) + .expect("fork path"); + assert_eq!(fork.count, 1); + assert_eq!(fork.ranks, vec![1]); + + let json = Flamegraph::from_attributed_folded_lines(&merged) + .unwrap() + .json_payload(&FlamegraphOptions { + title: "T".to_string(), + count_name: "samples".to_string(), + kind: FlamegraphKind::Classic, + subtitle: String::new(), + metric: None, + profile: Some("cpu-stack-distributed".to_string()), + }); + let v: serde_json::Value = serde_json::from_str(&json).unwrap(); + let frames = v["frames"].as_array().unwrap(); + let platform = frames + .iter() + .find(|f| f["name"] == "[py] platform") + .expect("platform frame"); + assert_eq!(platform["ranks"], json!([1])); + let shared_frame = frames + .iter() + .find(|f| f["name"] == "[py] main (a.py:1)") + .expect("main frame"); + assert_eq!(shared_frame["ranks"], json!([0, 1])); + } + + #[test] + fn folded_lines_from_json_skips_all_root() { + let json = Flamegraph::from_folded_lines(&["thread-1;leaf 4".to_string()]) + .unwrap() + .json_payload(&FlamegraphOptions { + title: "T".to_string(), + count_name: "samples".to_string(), + kind: FlamegraphKind::Classic, + subtitle: String::new(), + metric: None, + profile: Some("cpu-stack-distributed".to_string()), + }); + let lines = folded_lines_from_flamegraph_json(&json); + assert_eq!(lines, vec!["thread-1;leaf 4".to_string()]); + } + #[test] fn parse_folded_line_splits_stack_and_count() { let (path, n) = parse_folded_line("forward;model;conv 5000000").unwrap(); diff --git a/probing/extensions/python/src/features/mod.rs b/probing/extensions/python/src/features/mod.rs index 6d6db424..db84f7a7 100644 --- a/probing/extensions/python/src/features/mod.rs +++ b/probing/extensions/python/src/features/mod.rs @@ -8,7 +8,11 @@ pub mod pprof; pub mod py_result; pub mod python_api; pub mod spy; -/// Native stack capture, Python/native merge, and signal handling (`SIGUSR2`). +/// Async-signal-safe raw stack snapshotting (SIGPROF / SIGUSR2). +pub mod stack_capture; +/// Unified Python / native stack merge. +pub mod stack_merge; +/// On-demand stack capture (`SIGUSR2`) and synchronous walks. pub mod stack_tracer; pub mod torch; pub mod tracing; diff --git a/probing/extensions/python/src/features/pprof.rs b/probing/extensions/python/src/features/pprof.rs index ec40551d..668fc327 100644 --- a/probing/extensions/python/src/features/pprof.rs +++ b/probing/extensions/python/src/features/pprof.rs @@ -1,34 +1,13 @@ //! CPU profiling via `SIGPROF` sampling ("model two": trigger in-signal, process //! off-signal). //! -//! `setitimer(ITIMER_PROF)` delivers `SIGPROF` to whichever thread is burning -//! CPU (the timer counts process CPU time, so samples are CPU-weighted). The -//! signal handler is kept strictly minimal and async-signal-safe: it only -//! * reads the interrupted thread's `pc`/`fp` from the `ucontext`, -//! * walks the frame-pointer chain collecting raw return addresses, -//! * snapshots this thread's thread-local `PYSTACKS` (raw `usize` pointers), -//! * and copies that fixed-size POD snapshot into a preallocated lock-free ring -//! buffer. No allocation, no locks, no symbolization, no `libunwind`, no libc -//! string calls happen in the handler — that is what crashed the old `pprof` -//! path on PyTorch (libunwind + `strlen` over Accelerate/JIT frames). -//! -//! A dedicated consumer thread drains the ring and does all the dangerous work -//! off the signal path: symbolizing native addresses (`backtrace::resolve`) and -//! resolving Python `RawCallLocation`s into file/func/line. It then produces a -//! true mixed-mode stack by splicing each Python frame into its interpreter eval -//! frame (`_PyEval_EvalFrameDefault`) position in the native stack — the eval -//! frames and `PYSTACKS` come from the same eval-hook calls, so they align -//! one-to-one. Folded counts are rendered as interactive HTML by `flamegraph()`. -//! -//! Native caveat (accepted tradeoff): frame-pointer walking is unreliable when -//! libraries omit frame pointers (BLAS/OpenMP); such stacks are truncated, and a -//! `fp` that is plausible-but-unmapped can still fault inside the handler. The -//! walk validates alignment / monotonicity / canonical range to minimize this. +//! Raw capture and Python/native merge live in [`stack_capture`] / +//! [`stack_merge`]; this module owns the ring buffer, timer, and folded output. use std::cell::UnsafeCell; use std::collections::HashMap; -use std::sync::atomic::{compiler_fence, AtomicBool, AtomicPtr, AtomicU64, AtomicUsize, Ordering}; -use std::sync::{Mutex, RwLock}; +use std::sync::atomic::{AtomicBool, AtomicPtr, AtomicU64, AtomicUsize, Ordering}; +use std::sync::Mutex; use std::thread; use std::time::Duration; @@ -39,66 +18,23 @@ use once_cell::sync::Lazy; use serde_json::json; use crate::features::flamegraph::{FlamegraphKind, FlamegraphOptions}; -use crate::features::spy::call::RawCallLocation; -use crate::features::spy::spy_tls_addrs; +use crate::features::stack_capture::{self, RawStackSnapshot}; const DEFAULT_SAMPLE_FREQ: i32 = 100; const MIN_SAMPLE_FREQ: i32 = 1; -// Upper bound is intentionally high to allow stress testing the sampler. const MAX_SAMPLE_FREQ: i32 = 100_000; -/// Ring capacity (power of two) and per-sample depth limits. Kept small enough -/// that a `RawSample` (and the whole ring) stays cheap to construct/copy. const RING_SIZE: usize = 512; const RING_MASK: usize = RING_SIZE - 1; -const MAX_NATIVE: usize = 48; -const MAX_PY: usize = 128; - -/// Max number of Python threads we track for signal-safe TLS access. -const REG_SIZE: usize = 1024; - -/// Upper bound on distinct folded stacks kept in the aggregate map. Protects -/// against unbounded memory under high-frequency / high-cardinality workloads; -/// samples for new stacks beyond this are counted as dropped. const MAX_FOLDED_STACKS: usize = 1 << 17; -// --------------------------------------------------------------------------- -// Raw sample (fixed-size POD, memcpy-able from the signal handler) -// --------------------------------------------------------------------------- - -#[derive(Clone, Copy)] -struct RawSample { - tid: u64, - native_len: u32, - py_len: u32, - /// Native return addresses, leaf -> root. - native: [usize; MAX_NATIVE], - /// Callee `PyCodeObject` pointers, outermost -> innermost (natural `PYSTACKS` - /// order). Only the pointer is captured here — it is the interner key the - /// consumer resolves to a label — keeping the POD sample small and cheap to - /// memcpy from the signal handler. - py: [usize; MAX_PY], -} - -impl RawSample { - fn zeroed() -> Self { - RawSample { - tid: 0, - native_len: 0, - py_len: 0, - native: [0usize; MAX_NATIVE], - py: [0usize; MAX_PY], - } - } -} - // --------------------------------------------------------------------------- // Lock-free bounded MPMC ring (Vyukov). Async-signal-safe producer side. // --------------------------------------------------------------------------- struct Cell { seq: AtomicUsize, - data: UnsafeCell, + data: UnsafeCell, } struct Ring { @@ -116,7 +52,7 @@ impl Ring { for i in 0..RING_SIZE { v.push(Cell { seq: AtomicUsize::new(i), - data: UnsafeCell::new(RawSample::zeroed()), + data: UnsafeCell::new(RawStackSnapshot::zeroed()), }); } Ring { @@ -126,8 +62,7 @@ impl Ring { } } - /// Producer (signal handler). Returns false if the ring is full. - fn enqueue(&self, sample: &RawSample) -> bool { + fn enqueue(&self, sample: &RawStackSnapshot) -> bool { let mut pos = self.enqueue_pos.load(Ordering::Relaxed); loop { let cell = &self.buffer[pos & RING_MASK]; @@ -151,8 +86,7 @@ impl Ring { } } - /// Consumer (sampler thread). Returns false if the ring is empty. - fn dequeue(&self, out: &mut RawSample) -> bool { + fn dequeue(&self, out: &mut RawStackSnapshot) -> bool { let mut pos = self.dequeue_pos.load(Ordering::Relaxed); loop { let cell = &self.buffer[pos & RING_MASK]; @@ -179,209 +113,11 @@ impl Ring { static RING_PTR: AtomicPtr = AtomicPtr::new(std::ptr::null_mut()); static DROPPED: AtomicU64 = AtomicU64::new(0); - -// --------------------------------------------------------------------------- -// Python-thread registry: lets the handler know a thread's `PYSTACKS` TLS is -// already allocated (touched by `rust_eval_frame`) and thus safe to read. -// --------------------------------------------------------------------------- - -/// Per-thread registry entry. We store the *resolved* addresses of the thread's -/// thread-local `PYSTACKS` / `PYSTACK_WRITING` here, captured from normal -/// (non-signal) context in the eval hook. The signal handler then reads those -/// raw pointers directly and NEVER touches TLS / `tlv_get_addr` itself — on -/// macOS, accessing a thread-local from a signal handler can deadlock against -/// dyld's loader lock when the interrupted thread was mid dlopen / lazy-bind / -/// TLS initialization (the classic in-process sampler hang). -struct ThreadSlot { - tid: AtomicU64, // 0 == empty - pystacks: AtomicPtr>, - writing: AtomicPtr, - /// Inclusive-exclusive stack bounds `[lo, hi)` captured in normal context, - /// so the handler can validate frame-pointer reads against real mapped - /// stack memory. `hi == 0` means "unknown" (fall back to heuristics). - stack_lo: AtomicUsize, - stack_hi: AtomicUsize, -} - -static REG_TABLE: [ThreadSlot; REG_SIZE] = [const { - ThreadSlot { - tid: AtomicU64::new(0), - pystacks: AtomicPtr::new(std::ptr::null_mut()), - writing: AtomicPtr::new(std::ptr::null_mut()), - stack_lo: AtomicUsize::new(0), - stack_hi: AtomicUsize::new(0), - } -}; REG_SIZE]; - -static REG_FULL_WARNED: AtomicBool = AtomicBool::new(false); - -thread_local! { - static THREAD_REGISTERED: std::cell::UnsafeCell = const { std::cell::UnsafeCell::new(false) }; -} - -/// Open-addressing probe start for `tid` (Fibonacci hashing). REG_SIZE is a -/// power of two so the mask is exact. -#[inline] -fn slot_hash(tid: u64) -> usize { - let h = tid.wrapping_mul(0x9E37_79B9_7F4A_7C15); - (h >> 40) as usize & (REG_SIZE - 1) -} - -/// OS-thread names captured at registration (normal context), keyed by tid, so -/// the consumer can label thread root frames readably. -static THREAD_NAMES: Lazy>> = Lazy::new(|| RwLock::new(HashMap::new())); - -/// Read the calling thread's name via `pthread_getname_np`. Normal context only. -fn current_thread_name() -> Option { - let mut buf = [0 as libc::c_char; 64]; - let rc = unsafe { libc::pthread_getname_np(libc::pthread_self(), buf.as_mut_ptr(), buf.len()) }; - if rc != 0 { - return None; - } - let name = unsafe { std::ffi::CStr::from_ptr(buf.as_ptr()) } - .to_string_lossy() - .into_owned(); - if name.is_empty() { - None - } else { - Some(name) - } -} - -fn thread_name(tid: u64) -> Option { - THREAD_NAMES.read().ok().and_then(|m| m.get(&tid).cloned()) -} - -/// Stack bounds `[lo, hi)` of the calling thread. Safe to call only in normal -/// context (uses `pthread_*` that may allocate / read `/proc` on Linux). -fn current_stack_bounds() -> (usize, usize) { - #[cfg(target_os = "macos")] - unsafe { - let pt = libc::pthread_self(); - let base = libc::pthread_get_stackaddr_np(pt) as usize; // highest address - let size = libc::pthread_get_stacksize_np(pt); - (base.saturating_sub(size), base) - } - #[cfg(target_os = "linux")] - unsafe { - let mut attr: libc::pthread_attr_t = std::mem::zeroed(); - if libc::pthread_getattr_np(libc::pthread_self(), &mut attr) != 0 { - return (0, 0); - } - let mut addr: *mut c_void = std::ptr::null_mut(); - let mut size: libc::size_t = 0; - let ok = libc::pthread_attr_getstack(&attr, &mut addr, &mut size) == 0; - libc::pthread_attr_destroy(&mut attr); - if ok { - let lo = addr as usize; - (lo, lo + size) - } else { - (0, 0) - } - } - #[cfg(not(any(target_os = "macos", target_os = "linux")))] - { - (0, 0) - } -} - -/// Called from the eval-frame hook (TLS-safe context) on every frame; the -/// thread-local fast path makes the global table insert happen once per thread. -pub fn register_python_thread() { - let already = THREAD_REGISTERED.with(|flag| unsafe { - if *flag.get() { - return true; - } - *flag.get() = true; - false - }); - if already { - return; - } - let tid = current_tid(); - // Resolve this thread's TLS addresses and stack bounds here, in normal - // context (none of this is async-signal-safe). - let (ps, wr) = spy_tls_addrs(); - let (lo, hi) = current_stack_bounds(); - - if let Some(name) = current_thread_name() { - if let Ok(mut m) = THREAD_NAMES.write() { - m.insert(tid, name); // overwrite handles tid reuse - } - } - - let publish = |slot: &ThreadSlot| { - slot.stack_lo.store(lo, Ordering::Release); - slot.stack_hi.store(hi, Ordering::Release); - slot.pystacks.store(ps, Ordering::Release); - slot.writing.store(wr, Ordering::Release); - }; - - let start = slot_hash(tid); - for i in 0..REG_SIZE { - let slot = ®_TABLE[(start + i) & (REG_SIZE - 1)]; - let v = slot.tid.load(Ordering::Acquire); - if v == tid { - // Refresh: handles tid reuse after a previous thread with the same - // id exited (its TLS pointers / bounds are now stale). - publish(slot); - return; - } - if v == 0 - && slot - .tid - .compare_exchange(0, tid, Ordering::AcqRel, Ordering::Acquire) - .is_ok() - { - publish(slot); - return; - } - // Slot taken by another tid (lost the race or different thread): keep - // probing the same linear sequence. - } - - if !REG_FULL_WARNED.swap(true, Ordering::Relaxed) { - log::warn!( - "probing: pprof thread registry full ({REG_SIZE} threads); \ - Python stacks for further threads will be missing" - ); - } -} - -/// Find the registry slot for `tid`, or `None` if this thread never ran the eval -/// hook. Open-addressing lookup: an empty slot in the probe sequence proves the -/// tid is absent (entries are never deleted). -fn thread_slot(tid: u64) -> Option<&'static ThreadSlot> { - let start = slot_hash(tid); - for i in 0..REG_SIZE { - let slot = ®_TABLE[(start + i) & (REG_SIZE - 1)]; - let v = slot.tid.load(Ordering::Acquire); - if v == tid { - return Some(slot); - } - if v == 0 { - return None; - } - } - None -} - -// --------------------------------------------------------------------------- -// Signal handler (async-signal-safe) -// --------------------------------------------------------------------------- - static SAMPLER_ENABLED: AtomicBool = AtomicBool::new(false); - -/// Number of signal handlers currently executing past the enabled/ring checks. -/// `reset` uses this to quiesce before freeing the ring. static HANDLER_ACTIVE: AtomicUsize = AtomicUsize::new(0); - -/// Whether *we* enabled the eval tracer (vs. the user enabling it independently); -/// if so, `reset` disables it again. static PPROF_OWNS_TRACER: AtomicBool = AtomicBool::new(false); +static HANDLER_INSTALLED: AtomicBool = AtomicBool::new(false); -/// RAII guard that marks a handler as in-flight for the duration of its body, -/// covering all early-return paths. struct ActiveGuard; impl ActiveGuard { #[inline] @@ -397,113 +133,11 @@ impl Drop for ActiveGuard { } } -#[inline] -fn current_tid() -> u64 { - #[cfg(target_os = "linux")] - unsafe { - libc::syscall(libc::SYS_gettid) as u64 - } - #[cfg(target_os = "macos")] - { - let mut t: u64 = 0; - unsafe { libc::pthread_threadid_np(0, &mut t) }; - t - } - #[cfg(not(any(target_os = "linux", target_os = "macos")))] - { - 0 - } -} - -#[inline] -fn plausible(p: usize) -> bool { - // Canonical lower-half userspace pointer, above the first page. - (0x1000..0x0001_0000_0000_0000).contains(&p) -} - -/// Extract (pc, fp) from the signal `ucontext` for the interrupted thread. -#[allow(unused_variables)] -unsafe fn regs_from_uctx(uctx: *mut c_void) -> (usize, usize) { - if uctx.is_null() { - return (0, 0); - } - #[cfg(all(target_os = "linux", target_arch = "x86_64"))] - { - let uc = uctx as *const libc::ucontext_t; - let mc = &(*uc).uc_mcontext; - let pc = mc.gregs[libc::REG_RIP as usize] as usize; - let fp = mc.gregs[libc::REG_RBP as usize] as usize; - (pc, fp) - } - #[cfg(all(target_os = "linux", target_arch = "aarch64"))] - { - let uc = uctx as *const libc::ucontext_t; - let mc = &(*uc).uc_mcontext; - (mc.pc as usize, mc.regs[29] as usize) - } - #[cfg(all(target_os = "macos", target_arch = "x86_64"))] - { - let uc = uctx as *const libc::ucontext_t; - let ss = &(*(*uc).uc_mcontext).__ss; - (ss.__rip as usize, ss.__rbp as usize) - } - #[cfg(all(target_os = "macos", target_arch = "aarch64"))] - { - let uc = uctx as *const libc::ucontext_t; - let ss = &(*(*uc).uc_mcontext).__ss; - (ss.__pc as usize, ss.__fp as usize) - } - #[cfg(not(any( - all(target_os = "linux", target_arch = "x86_64"), - all(target_os = "linux", target_arch = "aarch64"), - all(target_os = "macos", target_arch = "x86_64"), - all(target_os = "macos", target_arch = "aarch64"), - )))] - { - (0, 0) - } -} - -/// Walk the frame-pointer chain, collecting return addresses leaf -> root. -/// Both x86_64 and aarch64 use the layout `[fp] = saved fp`, `[fp+8] = ret`. -/// -/// `[lo, hi)` are the thread's stack bounds when known (`hi != 0`); reads are -/// then proven to stay inside mapped stack memory, eliminating the residual -/// "plausible but unmapped `fp`" fault. When bounds are unknown we fall back to -/// alignment / monotonicity / canonical-range heuristics only. -unsafe fn walk_frame_pointers(start_fp: usize, out: &mut [usize], lo: usize, hi: usize) -> usize { - let bounded = hi != 0 && lo < hi; - let in_stack = - |fp: usize| !bounded || (fp >= lo && fp + 2 * std::mem::size_of::() <= hi); - - let mut fp = start_fp; - let mut count = 0usize; - while count < out.len() { - if !plausible(fp) || (fp & 0x7) != 0 || !in_stack(fp) { - break; - } - let saved_fp = *(fp as *const usize); - let ret = *((fp + std::mem::size_of::()) as *const usize); - if !plausible(ret) { - break; - } - out[count] = ret; - count += 1; - // Frame pointers must strictly increase by a bounded step. - if saved_fp <= fp || saved_fp - fp > 0x20_0000 { - break; - } - fp = saved_fp; - } - count -} - #[cfg(unix)] unsafe extern "C" fn sigprof_handler(_sig: c_int, _info: *mut libc::siginfo_t, uctx: *mut c_void) { if !SAMPLER_ENABLED.load(Ordering::Acquire) { return; } - // Mark in-flight before touching the ring so `reset` can quiesce safely. let _active = ActiveGuard::new(); let ring = RING_PTR.load(Ordering::Acquire); if ring.is_null() { @@ -511,64 +145,16 @@ unsafe extern "C" fn sigprof_handler(_sig: c_int, _info: *mut libc::siginfo_t, u } let ring = &*ring; - let mut sample = RawSample::zeroed(); - sample.tid = current_tid(); - - // Resolve the registry slot once: its stack bounds guard the native walk and - // its TLS pointers feed the Python snapshot. - let slot = thread_slot(sample.tid); - let (lo, hi) = match slot { - Some(s) => ( - s.stack_lo.load(Ordering::Acquire), - s.stack_hi.load(Ordering::Acquire), - ), - None => (0, 0), - }; - - // ---- native ---- - let (pc, fp) = regs_from_uctx(uctx); - let mut nlen = 0usize; - if plausible(pc) { - sample.native[nlen] = pc; - nlen += 1; - } - if nlen < MAX_NATIVE { - nlen += walk_frame_pointers(fp, &mut sample.native[nlen..], lo, hi); - } - sample.native_len = nlen as u32; - - // ---- python: read this thread's PYSTACKS through the pre-resolved raw - // pointers in the registry, never touching TLS / tlv_get_addr from here ---- - if let Some(slot) = slot { - let wr = slot.writing.load(Ordering::Acquire); - let ps = slot.pystacks.load(Ordering::Acquire); - if !wr.is_null() && !ps.is_null() && !*wr { - compiler_fence(Ordering::SeqCst); - let stacks = &*ps; - let n = stacks.len().min(MAX_PY); - for (i, stack) in stacks.iter().enumerate().take(n) { - sample.py[i] = stack.callee(); - } - compiler_fence(Ordering::SeqCst); - // If the eval hook touched PYSTACKS during the copy, discard it. - sample.py_len = if *wr { 0 } else { n as u32 }; - } - } - - if sample.native_len == 0 && sample.py_len == 0 { + let snapshot = stack_capture::capture_raw_snapshot(uctx); + if snapshot.is_empty() { return; } - if !ring.enqueue(&sample) { + stack_capture::store_latest_snapshot(&snapshot); + if !ring.enqueue(&snapshot) { DROPPED.fetch_add(1, Ordering::Relaxed); } } -// --------------------------------------------------------------------------- -// Timer + handler installation -// --------------------------------------------------------------------------- - -static HANDLER_INSTALLED: AtomicBool = AtomicBool::new(false); - #[cfg(unix)] fn install_handler() { if HANDLER_INSTALLED.swap(true, Ordering::AcqRel) { @@ -576,8 +162,7 @@ fn install_handler() { } unsafe { let mut sa: libc::sigaction = std::mem::zeroed(); - let handler_ptr = sigprof_handler as *const () as usize; - sa.sa_sigaction = handler_ptr; + sa.sa_sigaction = sigprof_handler as *const () as usize; sa.sa_flags = libc::SA_SIGINFO | libc::SA_RESTART; libc::sigemptyset(&mut sa.sa_mask); libc::sigaction(libc::SIGPROF, &sa, std::ptr::null_mut()); @@ -613,10 +198,6 @@ fn disarm_timer() { #[cfg(not(unix))] fn disarm_timer() {} -// --------------------------------------------------------------------------- -// Consumer thread: symbolize + fold (all off the signal path) -// --------------------------------------------------------------------------- - struct SamplerState { generation: AtomicU64, samples: Mutex>, @@ -627,192 +208,33 @@ static SAMPLER: Lazy = Lazy::new(|| SamplerState { samples: Mutex::new(HashMap::new()), }); -fn symbolize_native(addr: usize, cache: &mut HashMap) -> String { - if let Some(name) = cache.get(&addr) { - return name.clone(); - } - let mut resolved: Option = None; - backtrace::resolve(addr as *mut c_void, |sym| { - if resolved.is_none() { - if let Some(name) = sym.name() { - // `SymbolName`'s Display demangles Rust and C++ names. - resolved = Some(name.to_string()); - } - } - }); - let name = resolved.unwrap_or_else(|| format!("0x{addr:x}")); - cache.insert(addr, name.clone()); - name -} - -/// Interner mapping a callee `PyCodeObject` pointer to its formatted frame label. -/// -/// Entries are produced eagerly in the eval hook (`intern_py_frame`), where the -/// code object is alive under the GIL. The sampler consumer thread only ever -/// *looks up* labels here by integer pointer key — it never dereferences a -/// Python object — so a frame whose code object has since been freed (e.g. -/// `torch.compile` churn) can no longer cause a use-after-free. -static PY_SYMBOLS: Lazy>> = Lazy::new(|| RwLock::new(HashMap::new())); - -/// Soft cap so heavy dynamic-codegen workloads can't grow the interner forever. -const PY_SYMBOLS_CAP: usize = 1 << 18; - -/// Resolve and cache a Python frame's label. MUST be called from a normal -/// (GIL-holding) context such as the eval hook, where `loc.callee()` is alive. -pub fn intern_py_frame(loc: &RawCallLocation) { - let key = loc.callee(); - if key == 0 { - return; - } - if let Ok(g) = PY_SYMBOLS.read() { - if g.contains_key(&key) { +fn process_sample( + s: &RawStackSnapshot, + cache: &mut HashMap, +) { + if let Some(main_tid) = stack_capture::python_main_os_tid() { + if s.tid != main_tid { return; } } - let label = match loc.resolve_callee() { - Ok(sym) => { - let base = sym.file.rsplit(['/', '\\']).next().unwrap_or(&sym.file); - format!("[py] {} ({}:{})", sym.name, base, sym.line) - } - Err(_) => return, - }; - if let Ok(mut g) = PY_SYMBOLS.write() { - if g.len() < PY_SYMBOLS_CAP { - g.entry(key).or_insert(label); - } - } -} - -/// Drop all interned Python labels (called when the eval tracer is disabled). -pub fn clear_py_symbols() { - if let Ok(mut g) = PY_SYMBOLS.write() { - g.clear(); - g.shrink_to_fit(); - } -} - -/// Look up a sampled Python frame's label by callee pointer. Pure integer-keyed -/// lookup — never touches Python memory, so it is safe on the consumer thread. -fn resolve_py_frame(key: usize) -> String { - if key != 0 { - if let Ok(g) = PY_SYMBOLS.read() { - if let Some(label) = g.get(&key) { - return label.clone(); - } - } - } - "[py] ".to_string() -} - -/// A CPython interpreter eval frame (`_PyEval_EvalFrameDefault` / `EvalFrameEx`, -/// with any C-ABI leading underscores). These are the splice points where a -/// Python frame replaces the native frame. Matches `stack_tracer::merge_strategy`. -#[inline] -fn is_eval_frame(name: &str) -> bool { - let mut tokens = name.split(['_', '.']).filter(|s| !s.is_empty()); - matches!(tokens.next(), Some("PyEval")) - && matches!( - tokens.next(), - Some("EvalFrameDefault") | Some("EvalFrameEx") - ) -} - -/// Our own eval-frame hook trampoline; dropped from mixed stacks as noise. -#[inline] -fn is_interp_shim(name: &str) -> bool { - name.contains("rust_eval_frame") -} - -fn process_sample(s: &RawSample, cache: &mut HashMap) { - let nlen = s.native_len as usize; - let plen = s.py_len as usize; - - // Native symbols, leaf -> root. Frame 0 is the interrupted PC (exact); every - // deeper frame is a *return address* pointing just past the call site, so we - // symbolize `addr - 1` to get the correct line / inlined-function. - let native_l2r: Vec = (0..nlen) - .map(|i| { - let resolve_addr = if i == 0 { - s.native[i] - } else { - s.native[i].wrapping_sub(1) - }; - symbolize_native(resolve_addr, cache) - }) - .collect(); - // Python frames, innermost -> outermost (PYSTACKS stores outermost -> innermost). - let py_l2r: Vec = s.py[..plen] - .iter() - .rev() - .map(|&key| resolve_py_frame(key)) - .collect(); - - let eval_count = native_l2r.iter().filter(|n| is_eval_frame(n)).count(); - - // Build leaf -> root, reversed to root -> leaf at the end. - let mut combined: Vec = Vec::with_capacity(native_l2r.len() + py_l2r.len()); - - if eval_count > 0 && !py_l2r.is_empty() { - // True mixed mode: walking leaf -> root, replace each interpreter eval - // frame with the corresponding Python frame. Aligning from the leaf - // (deepest eval <-> innermost Python) keeps attribution correct even - // when a truncated fp-walk drops the outermost eval frames. - let mut pi = 0usize; - for n in &native_l2r { - if is_eval_frame(n) { - combined.push(py_l2r.get(pi).cloned().unwrap_or_else(|| n.clone())); - pi += 1; - } else if is_interp_shim(n) { - // drop our eval hook trampoline frame - } else { - combined.push(n.clone()); - } - } - // Outer Python frames whose eval frames were lost to truncation: keep - // them toward the root so the logical context is not dropped. - if pi < py_l2r.len() { - combined.extend_from_slice(&py_l2r[pi..]); - } - } else if !native_l2r.is_empty() { - // No interpreter frames recovered (e.g. truncated walk or pure native): - // native tower with any Python frames hanging off the leaf. - combined.extend(py_l2r); - combined.extend(native_l2r.into_iter().filter(|n| !is_interp_shim(n))); - } else { - // Pure Python. - combined.extend(py_l2r); - } - - if combined.is_empty() { + let line = stack_capture::snapshot_to_folded_line(s, cache); + if line.is_empty() { return; } - combined.reverse(); // root -> leaf - - let mut line = match thread_name(s.tid) { - Some(name) => format!("thread-{} ({})", s.tid, name), - None => format!("thread-{}", s.tid), - }; - for p in combined { - line.push(';'); - line.push_str(&p); - } - if let Ok(mut map) = SAMPLER.samples.lock() { if let Some(count) = map.get_mut(&line) { *count += 1; } else if map.len() < MAX_FOLDED_STACKS { map.insert(line, 1); } else { - // Cardinality cap hit: account the sample as dropped rather than - // grow the map without bound. DROPPED.fetch_add(1, Ordering::Relaxed); } } } fn consumer_loop(my_gen: u64) { - let mut sample = RawSample::zeroed(); - let mut cache: HashMap = HashMap::new(); + let mut sample = RawStackSnapshot::zeroed(); + let mut cache = HashMap::new(); loop { let stopping = SAMPLER.generation.load(Ordering::SeqCst) != my_gen; let ring = RING_PTR.load(Ordering::Acquire); @@ -833,10 +255,6 @@ fn consumer_loop(my_gen: u64) { } } -// --------------------------------------------------------------------------- -// Public API (stable for existing callers) -// --------------------------------------------------------------------------- - pub fn is_sampling_active() -> bool { SAMPLER_ENABLED.load(Ordering::Acquire) } @@ -861,7 +279,6 @@ fn setup_unix(freq: u64) -> Result<()> { (freq as i32).clamp(MIN_SAMPLE_FREQ, MAX_SAMPLE_FREQ) }; - // Allocate the ring once. if RING_PTR.load(Ordering::Acquire).is_null() { let ptr = Box::into_raw(Box::new(Ring::new())); if RING_PTR @@ -882,10 +299,6 @@ fn setup_unix(freq: u64) -> Result<()> { } DROPPED.store(0, Ordering::Relaxed); - // The sampler's Python frames come from the eval-frame hook; ensure it is on - // (idempotent) so we don't silently degrade to native-only stacks when the - // user enables pprof without separately enabling the tracer. Remember whether - // *we* turned it on, so `reset` only retires a tracer it owns. crate::features::vm_tracer::initialize_globals(); pyo3::Python::attach(|_py| { let already_on = crate::features::vm_tracer::is_tracer_enabled(); @@ -905,6 +318,7 @@ fn setup_unix(freq: u64) -> Result<()> { install_handler(); let my_gen = SAMPLER.generation.fetch_add(1, Ordering::SeqCst) + 1; + stack_capture::set_pprof_sampling_active(true); SAMPLER_ENABLED.store(true, Ordering::Release); thread::Builder::new() @@ -919,12 +333,10 @@ fn setup_unix(freq: u64) -> Result<()> { pub fn reset() { disarm_timer(); + stack_capture::set_pprof_sampling_active(false); SAMPLER_ENABLED.store(false, Ordering::Release); SAMPLER.generation.fetch_add(1, Ordering::SeqCst); - // Take the ring out of circulation, wait for any in-flight handler to drain, - // then free it. If we can't confirm quiescence (practically never, the - // handler is bounded), put it back rather than risk a use-after-free. let ring = RING_PTR.swap(std::ptr::null_mut(), Ordering::AcqRel); if !ring.is_null() { let mut drained = false; @@ -942,17 +354,13 @@ pub fn reset() { } } - // Retire the eval tracer only if pprof was the one that enabled it. if PPROF_OWNS_TRACER.swap(false, Ordering::AcqRel) { pyo3::Python::attach(|_py| { let _ = crate::features::vm_tracer::disable_tracer(); }); } - clear_py_symbols(); - if let Ok(mut m) = THREAD_NAMES.write() { - m.clear(); - } + stack_capture::clear_py_symbols(); } pub fn pprof_handler() { @@ -963,16 +371,14 @@ fn pprof_flamegraph_options() -> FlamegraphOptions { FlamegraphOptions { title: "CPU sampling".to_string(), count_name: "samples".to_string(), - kind: FlamegraphKind::TorchModule, + kind: FlamegraphKind::Classic, subtitle: "SIGPROF weighted stack samples".to_string(), metric: None, - profile: None, + profile: Some("cpu-stack".to_string()), } } -/// Snapshot the aggregate map into folded `"stack count"` lines under a single -/// lock acquisition (no double-fold / TOCTOU between HTML and JSON paths). -fn folded_lines() -> Vec { +fn folded_lines_from_sampler() -> Vec { match SAMPLER.samples.lock() { Ok(map) => map .iter() @@ -982,6 +388,236 @@ fn folded_lines() -> Vec { } } +/// Local folded stacks: SIGPROF main-thread samples when active, else a one-shot +/// main-thread PYSTACKS snapshot (no signal on the HTTP path). +fn local_folded_lines() -> Vec { + if is_sampling_active() { + let lines = folded_lines_from_sampler(); + if !lines.is_empty() { + return lines; + } + } + crate::features::stack_tracer::main_thread_on_demand_folded_lines() +} + +fn folded_lines() -> Vec { + local_folded_lines() +} + +/// Snapshot of local SIGPROF folded stacks (`"path count"` per line). +pub fn folded_lines_snapshot() -> Vec { + folded_lines() +} + +/// Build distributed stack flamegraph JSON from attributed folded lines across ranks. +pub fn distributed_stack_flamegraph_json( + lines: &[crate::features::flamegraph::AttributedFoldedLine], + rank_count: usize, + nodes_failed: &[String], + mode: &str, +) -> String { + let python_only = mode == "py"; + let profile = if python_only { + "cpu-stack-distributed-py" + } else { + "cpu-stack-distributed" + }; + let dropped = DROPPED.load(Ordering::Relaxed); + let empty = |msg: &str| { + json!({ + "profile": profile, + "title": if python_only { "Distributed Python stacks" } else { "Distributed CPU stacks" }, + "subtitle": format!( + "SIGPROF mixed-mode stacks · {rank_count} ranks · merge identical paths" + ), + "countName": "samples", + "total": 0, + "width": 1400.0, + "frameHeight": 32.0, + "frames": [], + "dropped": dropped, + "emptyMessage": msg, + "nodesFailed": nodes_failed, + "rankCount": rank_count, + }) + .to_string() + }; + + if lines.is_empty() { + return empty(if python_only { + "no Python stack samples yet; enable SIGPROF (probing.pprof.sample_freq) on each rank and let training run" + } else { + "no main-thread CPU stack samples yet; enable SIGPROF (probing.pprof.sample_freq) on each rank" + }); + } + + let subtitle = if python_only { + if is_sampling_active() { + format!("Python frames only · SIGPROF main-thread samples · {rank_count} ranks merged") + } else { + format!("Python frames only · one-shot PYSTACKS snapshot · {rank_count} ranks merged") + } + } else if is_sampling_active() { + format!("Full mixed stack · SIGPROF main-thread samples · {rank_count} ranks merged") + } else { + format!( + "Full mixed stack · one-shot main-thread snapshot (enable SIGPROF for accumulation) · {rank_count} ranks merged" + ) + }; + let opts = FlamegraphOptions { + title: if python_only { + "Distributed Python stacks".to_string() + } else { + "Distributed CPU stacks".to_string() + }, + count_name: "samples".to_string(), + kind: FlamegraphKind::Classic, + subtitle, + metric: None, + profile: Some(profile.to_string()), + }; + + match crate::features::flamegraph::Flamegraph::from_attributed_folded_lines(lines) { + Some(fg) => { + let payload = fg.json_payload(&opts); + match serde_json::from_str::(&payload) { + Ok(mut v) => { + if let Some(obj) = v.as_object_mut() { + obj.insert("dropped".to_string(), json!(dropped)); + obj.insert("rankCount".to_string(), json!(rank_count)); + if !nodes_failed.is_empty() { + obj.insert("nodesFailed".to_string(), json!(nodes_failed)); + } + } + v.to_string() + } + Err(_) => payload, + } + } + None => empty("no valid folded stacks after merge"), + } +} + +fn local_training_rank() -> Option { + std::env::var("RANK") + .ok() + .and_then(|s| s.trim().parse().ok()) + .or_else(|| { + std::env::var("LOCAL_RANK") + .ok() + .and_then(|s| s.trim().parse().ok()) + }) +} + +fn remote_pprof_folded_lines_blocking(addr: &str) -> anyhow::Result> { + let url = format!("http://{addr}/apis/pprofextension/flamegraph/folded/json"); + let timeout = std::time::Duration::from_secs( + std::env::var("PROBING_CLUSTER_QUERY_TIMEOUT_SEC") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(10), + ); + let text = ureq::get(&url) + .config() + .timeout_global(Some(timeout)) + .build() + .call()? + .body_mut() + .read_to_string()?; + #[derive(serde::Deserialize)] + struct Payload { + lines: Vec, + } + Ok(serde_json::from_str::(&text)?.lines) +} + +fn remote_pprof_flamegraph_json_blocking(addr: &str) -> anyhow::Result { + let url = format!("http://{addr}/apis/pprofextension/flamegraph/json"); + let timeout = std::time::Duration::from_secs( + std::env::var("PROBING_CLUSTER_QUERY_TIMEOUT_SEC") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(10), + ); + let text = ureq::get(&url) + .config() + .timeout_global(Some(timeout)) + .build() + .call()? + .body_mut() + .read_to_string()?; + Ok(text) +} + +fn remote_pprof_folded_lines_fallback(addr: &str) -> anyhow::Result> { + remote_pprof_folded_lines_blocking(addr).or_else(|_| { + let json = remote_pprof_flamegraph_json_blocking(addr)?; + Ok(crate::features::flamegraph::folded_lines_from_flamegraph_json(&json)) + }) +} + +/// Cluster fan-out + merge for distributed CPU stack flamegraph JSON. +/// +/// `mode`: `mixed` (Python + native) or `py` (Python frames only). +/// +/// Returns `(json_body, partial)` where `partial` is true when some peers failed. +pub async fn collect_distributed_stack_flamegraph_json( + cluster: bool, + mode: &str, +) -> (String, bool) { + let mode = if mode == "py" { "py" } else { "mixed" }; + use probing_core::core::cluster::{get_nodes, is_node_alive, local_listen_addrs}; + + let mut line_sets: Vec<(Option, Vec)> = + vec![(local_training_rank(), folded_lines_snapshot())]; + let mut nodes_failed = Vec::new(); + let mut rank_count = 1usize; + + if cluster { + let local_addrs = local_listen_addrs(); + let peers: Vec<_> = get_nodes() + .into_iter() + .filter(is_node_alive) + .filter(|node| !local_addrs.iter().any(|local| local == &node.addr)) + .collect(); + + for node in peers { + let addr = node.addr.clone(); + let peer_rank = node.rank; + match tokio::task::spawn_blocking(move || remote_pprof_folded_lines_fallback(&addr)) + .await + { + Ok(Ok(lines)) => { + line_sets.push((peer_rank, lines)); + rank_count += 1; + } + Ok(Err(err)) => { + log::warn!( + "distributed stack flamegraph fan-out {} failed: {err:#}", + node.addr + ); + nodes_failed.push(format!("{}: {err:#}", node.addr)); + } + Err(err) => { + nodes_failed.push(format!("{}: task join failed: {err}", node.addr)); + } + } + } + } + + let mut merged = crate::features::flamegraph::merge_distributed_stack_attributed(&line_sets); + if mode == "py" { + merged = crate::features::flamegraph::filter_attributed_folded_lines_python_only(&merged); + } + let body = distributed_stack_flamegraph_json(&merged, rank_count, &nodes_failed, mode); + (body, !nodes_failed.is_empty()) +} + +/// Raw folded stack lines for cluster fan-out (`{"lines":["stack count", ...]}`). +pub fn folded_lines_json() -> String { + json!({ "lines": folded_lines_snapshot() }).to_string() +} + pub fn flamegraph() -> Result { let lines = folded_lines(); if lines.is_empty() { @@ -1000,7 +636,6 @@ pub fn flamegraph() -> Result { Ok(fg.render_html(&pprof_flamegraph_options())) } -/// JSON payload for the web UI (`GET /apis/pprofextension/flamegraph/json`). pub fn flamegraph_json() -> String { let dropped = DROPPED.load(Ordering::Relaxed); let empty = |msg: String| { @@ -1021,13 +656,14 @@ pub fn flamegraph_json() -> String { let lines = folded_lines(); if lines.is_empty() { - return empty("no samples collected yet; enable CPU sampling and let it run".to_string()); + return empty( + "no samples collected yet; enable CPU sampling or use Stacks → Default".to_string(), + ); } match crate::features::flamegraph::Flamegraph::from_folded_lines(&lines) { Some(fg) => { let payload = fg.json_payload(&pprof_flamegraph_options()); - // Splice in the dropped-sample counter so the UI can warn on it. match serde_json::from_str::(&payload) { Ok(mut v) => { if let Some(obj) = v.as_object_mut() { diff --git a/probing/extensions/python/src/features/stack_capture.rs b/probing/extensions/python/src/features/stack_capture.rs new file mode 100644 index 00000000..522b299a --- /dev/null +++ b/probing/extensions/python/src/features/stack_capture.rs @@ -0,0 +1,814 @@ +//! Async-signal-safe stack snapshotting shared by SIGPROF and SIGUSR2. +//! +//! Signal handlers only copy raw PCs and eval-hook frame keys into a fixed POD +//! struct. Symbolization and Python/native merge happen off the signal path via +//! [`snapshot_to_merged_frames`]. + +use std::cell::UnsafeCell; +use std::collections::HashMap; +use std::sync::atomic::{compiler_fence, AtomicBool, AtomicPtr, AtomicU64, AtomicUsize, Ordering}; +use std::sync::RwLock; +use std::time::Duration; + +use core::ffi::{c_int, c_void}; +use nix::libc; +use once_cell::sync::Lazy; +use probing_proto::prelude::CallFrame; + +use crate::features::spy::call::RawCallLocation; +use crate::features::spy::spy_tls_addrs; +use crate::features::stack_merge::{demangle_native_symbol, merge_python_native_stacks}; + +pub const MAX_NATIVE: usize = 48; +pub const MAX_PY: usize = 128; +const REG_SIZE: usize = 1024; + +/// Fixed-size POD snapshot copied from signal handlers. +#[derive(Clone, Copy)] +pub struct RawStackSnapshot { + pub tid: u64, + pub native_len: u32, + pub py_len: u32, + /// Native return addresses, leaf -> root. + pub native: [usize; MAX_NATIVE], + /// Callee `PyCodeObject` pointers, outermost -> innermost (`PYSTACKS` order). + pub py: [usize; MAX_PY], +} + +impl RawStackSnapshot { + pub fn zeroed() -> Self { + RawStackSnapshot { + tid: 0, + native_len: 0, + py_len: 0, + native: [0usize; MAX_NATIVE], + py: [0usize; MAX_PY], + } + } + + pub fn is_empty(&self) -> bool { + self.native_len == 0 && self.py_len == 0 + } +} + +// --------------------------------------------------------------------------- +// Python-thread registry (TLS pointers resolved in normal context) +// --------------------------------------------------------------------------- + +struct ThreadSlot { + tid: AtomicU64, + pystacks: AtomicPtr>, + writing: AtomicPtr, + stack_lo: AtomicUsize, + stack_hi: AtomicUsize, + latest: UnsafeCell, + latest_seq: AtomicU64, +} + +// `latest` is published via `latest_seq` (Release/Acquire); only read after seq != 0. +unsafe impl Sync for ThreadSlot {} + +static REG_TABLE: [ThreadSlot; REG_SIZE] = [const { + ThreadSlot { + tid: AtomicU64::new(0), + pystacks: AtomicPtr::new(std::ptr::null_mut()), + writing: AtomicPtr::new(std::ptr::null_mut()), + stack_lo: AtomicUsize::new(0), + stack_hi: AtomicUsize::new(0), + latest: UnsafeCell::new(RawStackSnapshot { + tid: 0, + native_len: 0, + py_len: 0, + native: [0usize; MAX_NATIVE], + py: [0usize; MAX_PY], + }), + latest_seq: AtomicU64::new(0), + } +}; REG_SIZE]; + +static REG_FULL_WARNED: AtomicBool = AtomicBool::new(false); +static MAIN_OS_TID: AtomicU64 = AtomicU64::new(0); +static PPROF_SAMPLING_ACTIVE: AtomicBool = AtomicBool::new(false); + +/// Record the Python main thread's OS tid (pthread id on macOS, gettid on Linux). +pub fn register_main_os_tid() { + let tid = current_tid(); + if tid == 0 { + return; + } + let _ = MAIN_OS_TID.compare_exchange(0, tid, Ordering::AcqRel, Ordering::Acquire); +} + +pub fn python_main_os_tid() -> Option { + let tid = MAIN_OS_TID.load(Ordering::Acquire); + if tid == 0 { + None + } else { + Some(tid) + } +} + +pub fn set_pprof_sampling_active(active: bool) { + PPROF_SAMPLING_ACTIVE.store(active, Ordering::Release); +} + +pub fn is_pprof_sampling_active() -> bool { + PPROF_SAMPLING_ACTIVE.load(Ordering::Acquire) +} + +thread_local! { + static THREAD_REGISTERED: std::cell::UnsafeCell = const { std::cell::UnsafeCell::new(false) }; +} + +static THREAD_NAMES: Lazy>> = Lazy::new(|| RwLock::new(HashMap::new())); + +/// Interned Python frame metadata keyed by callee `PyCodeObject` pointer. +#[derive(Clone, Debug)] +struct PyFrameSymbol { + func: String, + file: String, + lineno: i32, +} + +impl PyFrameSymbol { + /// Folded flamegraph segment (basename only for cross-rank merge). + fn folded_label(&self) -> String { + let base = self.file.rsplit(['/', '\\']).next().unwrap_or(&self.file); + format!("[py] {} ({}:{})", self.func, base, self.lineno) + } + + fn to_call_frame(&self) -> CallFrame { + CallFrame::PyFrame { + file: self.file.clone(), + func: self.func.clone(), + lineno: self.lineno as i64, + locals: Default::default(), + } + } +} + +static PY_SYMBOLS: Lazy>> = + Lazy::new(|| RwLock::new(HashMap::new())); +const PY_SYMBOLS_CAP: usize = 1 << 18; + +#[inline] +fn slot_hash(tid: u64) -> usize { + let h = tid.wrapping_mul(0x9E37_79B9_7F4A_7C15); + (h >> 40) as usize & (REG_SIZE - 1) +} + +pub fn current_tid() -> u64 { + #[cfg(target_os = "linux")] + unsafe { + libc::syscall(libc::SYS_gettid) as u64 + } + #[cfg(target_os = "macos")] + { + let mut t: u64 = 0; + unsafe { libc::pthread_threadid_np(0, &mut t) }; + t + } + #[cfg(not(any(target_os = "linux", target_os = "macos")))] + { + 0 + } +} + +fn current_thread_name() -> Option { + let mut buf = [0 as libc::c_char; 64]; + let rc = unsafe { libc::pthread_getname_np(libc::pthread_self(), buf.as_mut_ptr(), buf.len()) }; + if rc != 0 { + return None; + } + let name = unsafe { std::ffi::CStr::from_ptr(buf.as_ptr()) } + .to_string_lossy() + .into_owned(); + if name.is_empty() { + None + } else { + Some(name) + } +} + +fn current_stack_bounds() -> (usize, usize) { + #[cfg(target_os = "macos")] + unsafe { + let pt = libc::pthread_self(); + let base = libc::pthread_get_stackaddr_np(pt) as usize; + let size = libc::pthread_get_stacksize_np(pt); + (base.saturating_sub(size), base) + } + #[cfg(target_os = "linux")] + unsafe { + let mut attr: libc::pthread_attr_t = std::mem::zeroed(); + if libc::pthread_getattr_np(libc::pthread_self(), &mut attr) != 0 { + return (0, 0); + } + let mut addr: *mut c_void = std::ptr::null_mut(); + let mut size: libc::size_t = 0; + let ok = libc::pthread_attr_getstack(&attr, &mut addr, &mut size) == 0; + libc::pthread_attr_destroy(&mut attr); + if ok { + let lo = addr as usize; + (lo, lo + size) + } else { + (0, 0) + } + } + #[cfg(not(any(target_os = "macos", target_os = "linux")))] + { + (0, 0) + } +} + +pub fn thread_name(tid: u64) -> Option { + THREAD_NAMES.read().ok().and_then(|m| m.get(&tid).cloned()) +} + +pub fn register_python_thread() { + let already = THREAD_REGISTERED.with(|flag| unsafe { + if *flag.get() { + return true; + } + *flag.get() = true; + false + }); + if already { + return; + } + let tid = current_tid(); + if probing_core::is_python_main_thread() { + register_main_os_tid(); + } + let (ps, wr) = spy_tls_addrs(); + let (lo, hi) = current_stack_bounds(); + + if let Some(name) = current_thread_name() { + if let Ok(mut m) = THREAD_NAMES.write() { + m.insert(tid, name); + } + } + + let publish = |slot: &ThreadSlot| { + slot.stack_lo.store(lo, Ordering::Release); + slot.stack_hi.store(hi, Ordering::Release); + slot.pystacks.store(ps, Ordering::Release); + slot.writing.store(wr, Ordering::Release); + }; + + let start = slot_hash(tid); + for i in 0..REG_SIZE { + let slot = ®_TABLE[(start + i) & (REG_SIZE - 1)]; + let v = slot.tid.load(Ordering::Acquire); + if v == tid { + publish(slot); + return; + } + if v == 0 + && slot + .tid + .compare_exchange(0, tid, Ordering::AcqRel, Ordering::Acquire) + .is_ok() + { + publish(slot); + return; + } + } + + if !REG_FULL_WARNED.swap(true, Ordering::Relaxed) { + log::warn!( + "probing: stack thread registry full ({REG_SIZE} threads); \ + Python stacks for further threads will be missing" + ); + } +} + +fn thread_slot(tid: u64) -> Option<&'static ThreadSlot> { + let start = slot_hash(tid); + for i in 0..REG_SIZE { + let slot = ®_TABLE[(start + i) & (REG_SIZE - 1)]; + let v = slot.tid.load(Ordering::Acquire); + if v == tid { + return Some(slot); + } + if v == 0 { + return None; + } + } + None +} + +/// Copy the registered thread's Python stack (PYSTACKS) without delivering a signal. +pub fn copy_registered_py_snapshot(tid: u64) -> Option { + let slot = thread_slot(tid)?; + let mut sample = RawStackSnapshot::zeroed(); + sample.tid = tid; + + let wr = slot.writing.load(Ordering::Acquire); + let ps = slot.pystacks.load(Ordering::Acquire); + if wr.is_null() || ps.is_null() || unsafe { *wr } { + return None; + } + compiler_fence(Ordering::SeqCst); + let stacks = unsafe { &*ps }; + let n = stacks.len().min(MAX_PY); + for (i, stack) in stacks.iter().enumerate().take(n) { + sample.py[i] = stack.callee(); + } + compiler_fence(Ordering::SeqCst); + if unsafe { *wr } { + return None; + } + sample.py_len = n as u32; + if sample.is_empty() { + None + } else { + Some(sample) + } +} + +/// Store the latest SIGPROF snapshot for a thread so on-demand SIGUSR2 capture +/// can reuse it without delivering another signal. +pub fn store_latest_snapshot(snapshot: &RawStackSnapshot) { + if snapshot.is_empty() { + return; + } + let Some(slot) = thread_slot(snapshot.tid) else { + return; + }; + unsafe { + *slot.latest.get() = *snapshot; + } + slot.latest_seq.fetch_add(1, Ordering::Release); +} + +/// Reuse the latest SIGPROF snapshot for `tid` when CPU sampling is active. +pub fn latest_snapshot_for_tid(tid: u64) -> Option { + let slot = thread_slot(tid)?; + for _ in 0..4 { + let seq_before = slot.latest_seq.load(Ordering::Acquire); + if seq_before == 0 { + return None; + } + let snap = unsafe { *slot.latest.get() }; + let seq_after = slot.latest_seq.load(Ordering::Acquire); + if seq_before == seq_after && snap.tid == tid && !snap.is_empty() { + return Some(snap); + } + } + None +} + +pub fn intern_py_frame(loc: &RawCallLocation) { + let key = loc.callee(); + if key == 0 { + return; + } + if let Ok(g) = PY_SYMBOLS.read() { + if g.contains_key(&key) { + return; + } + } + let entry = match loc.resolve_callee() { + Ok(sym) => PyFrameSymbol { + func: sym.name, + file: sym.file, + lineno: sym.line, + }, + Err(_) => return, + }; + if let Ok(mut g) = PY_SYMBOLS.write() { + if g.len() < PY_SYMBOLS_CAP { + g.entry(key).or_insert(entry); + } + } +} + +pub fn clear_py_symbols() { + if let Ok(mut g) = PY_SYMBOLS.write() { + g.clear(); + g.shrink_to_fit(); + } +} + +fn resolve_py_label(key: usize) -> String { + if key != 0 { + if let Ok(g) = PY_SYMBOLS.read() { + if let Some(sym) = g.get(&key) { + return sym.folded_label(); + } + } + } + "[py] ".to_string() +} + +fn resolve_py_call_frame(key: usize) -> CallFrame { + if key != 0 { + if let Ok(g) = PY_SYMBOLS.read() { + if let Some(sym) = g.get(&key) { + return sym.to_call_frame(); + } + } + } + CallFrame::PyFrame { + file: String::new(), + func: resolve_py_label(key), + lineno: 0, + locals: Default::default(), + } +} + +#[inline] +fn plausible(p: usize) -> bool { + (0x1000..0x0001_0000_0000_0000).contains(&p) +} + +#[allow(unused_variables)] +unsafe fn regs_from_uctx(uctx: *mut c_void) -> (usize, usize) { + if uctx.is_null() { + return (0, 0); + } + #[cfg(all(target_os = "linux", target_arch = "x86_64"))] + { + let uc = uctx as *const libc::ucontext_t; + let mc = &(*uc).uc_mcontext; + let pc = mc.gregs[libc::REG_RIP as usize] as usize; + let fp = mc.gregs[libc::REG_RBP as usize] as usize; + (pc, fp) + } + #[cfg(all(target_os = "linux", target_arch = "aarch64"))] + { + let uc = uctx as *const libc::ucontext_t; + let mc = &(*uc).uc_mcontext; + (mc.pc as usize, mc.regs[29] as usize) + } + #[cfg(all(target_os = "macos", target_arch = "x86_64"))] + { + let uc = uctx as *const libc::ucontext_t; + let ss = &(*(*uc).uc_mcontext).__ss; + (ss.__rip as usize, ss.__rbp as usize) + } + #[cfg(all(target_os = "macos", target_arch = "aarch64"))] + { + let uc = uctx as *const libc::ucontext_t; + let ss = &(*(*uc).uc_mcontext).__ss; + (ss.__pc as usize, ss.__fp as usize) + } + #[cfg(not(any( + all(target_os = "linux", target_arch = "x86_64"), + all(target_os = "linux", target_arch = "aarch64"), + all(target_os = "macos", target_arch = "x86_64"), + all(target_os = "macos", target_arch = "aarch64"), + )))] + { + (0, 0) + } +} + +unsafe fn walk_frame_pointers(start_fp: usize, out: &mut [usize], lo: usize, hi: usize) -> usize { + let bounded = hi != 0 && lo < hi; + let in_stack = + |fp: usize| !bounded || (fp >= lo && fp + 2 * std::mem::size_of::() <= hi); + + let mut fp = start_fp; + let mut count = 0usize; + while count < out.len() { + if !plausible(fp) || (fp & 0x7) != 0 || !in_stack(fp) { + break; + } + let saved_fp = *(fp as *const usize); + let ret = *((fp + std::mem::size_of::()) as *const usize); + if !plausible(ret) { + break; + } + out[count] = ret; + count += 1; + if saved_fp <= fp || saved_fp - fp > 0x20_0000 { + break; + } + fp = saved_fp; + } + count +} + +/// Async-signal-safe snapshot of the interrupted thread's native + Python stacks. +/// +/// # Safety +/// +/// `uctx` must be a valid `ucontext_t` pointer from a signal handler (or null, +/// in which case native registers are skipped). Must only be called from an +/// async-signal-safe context on the interrupted thread; the returned snapshot +/// must not be shared with concurrent writers without synchronization. +pub unsafe fn capture_raw_snapshot(uctx: *mut c_void) -> RawStackSnapshot { + let mut sample = RawStackSnapshot::zeroed(); + sample.tid = current_tid(); + + let slot = thread_slot(sample.tid); + let (lo, hi) = match slot { + Some(s) => ( + s.stack_lo.load(Ordering::Acquire), + s.stack_hi.load(Ordering::Acquire), + ), + None => (0, 0), + }; + + let (pc, fp) = regs_from_uctx(uctx); + let mut nlen = 0usize; + if plausible(pc) { + sample.native[nlen] = pc; + nlen += 1; + } + if nlen < MAX_NATIVE { + nlen += walk_frame_pointers(fp, &mut sample.native[nlen..], lo, hi); + } + sample.native_len = nlen as u32; + + if let Some(slot) = slot { + let wr = slot.writing.load(Ordering::Acquire); + let ps = slot.pystacks.load(Ordering::Acquire); + if !wr.is_null() && !ps.is_null() && !*wr { + compiler_fence(Ordering::SeqCst); + let stacks = &*ps; + let n = stacks.len().min(MAX_PY); + for (i, stack) in stacks.iter().enumerate().take(n) { + sample.py[i] = stack.callee(); + } + compiler_fence(Ordering::SeqCst); + sample.py_len = if *wr { 0 } else { n as u32 }; + } + } + + sample +} + +pub fn symbolize_native_addr(addr: usize, cache: &mut HashMap) -> CallFrame { + if let Some(frame) = cache.get(&addr) { + return frame.clone(); + } + let mut resolved_name: Option = None; + let mut file_name = String::new(); + let mut lineno = 0i64; + let mut lang: Option = None; + backtrace::resolve(addr as *mut c_void, |sym| { + if resolved_name.is_none() { + if let Some(name) = sym.name().and_then(|n| n.as_str()) { + let (demangled, tag) = demangle_native_symbol(name); + resolved_name = Some(demangled); + lang = tag.map(str::to_string); + } + if let Some(path) = sym.filename() { + file_name = path.to_string_lossy().into_owned(); + } + lineno = sym.lineno().unwrap_or(0) as i64; + } + }); + let func = resolved_name.unwrap_or_else(|| format!("0x{addr:x}")); + let frame = CallFrame::CFrame { + ip: format!("{addr:#x}"), + file: file_name, + func, + lineno, + lang, + }; + cache.insert(addr, frame.clone()); + frame +} + +/// Best-effort symbolize + merge off the signal path. Never propagates errors. +pub fn snapshot_to_merged_frames( + snapshot: &RawStackSnapshot, + cache: &mut HashMap, +) -> Vec { + let nlen = snapshot.native_len as usize; + let plen = snapshot.py_len as usize; + + let native_leaf_to_root: Vec = (0..nlen) + .map(|i| { + let resolve_addr = if i == 0 { + snapshot.native[i] + } else { + snapshot.native[i].wrapping_sub(1) + }; + symbolize_native_addr(resolve_addr, cache) + }) + .collect(); + + let python_outer_to_inner: Vec = snapshot.py[..plen] + .iter() + .map(|&key| resolve_py_call_frame(key)) + .collect(); + + merge_python_native_stacks(&python_outer_to_inner, &native_leaf_to_root) +} + +pub fn snapshot_to_folded_line( + snapshot: &RawStackSnapshot, + cache: &mut HashMap, +) -> String { + let merged = snapshot_to_merged_frames(snapshot, cache); + if merged.is_empty() { + return String::new(); + } + let segments = crate::features::stack_merge::merged_frames_to_folded_segments(&merged); + let mut line = match thread_name(snapshot.tid) { + Some(name) => format!("thread-{} ({})", snapshot.tid, name), + None => format!("thread-{}", snapshot.tid), + }; + for seg in segments { + line.push(';'); + line.push_str(&seg); + } + line +} + +// --------------------------------------------------------------------------- +// SIGUSR2 on-demand capture (same safe handler body as SIGPROF) +// --------------------------------------------------------------------------- + +struct Sigusr2SnapshotSlot(UnsafeCell); +unsafe impl Sync for Sigusr2SnapshotSlot {} + +const ZERO_SNAPSHOT: RawStackSnapshot = RawStackSnapshot { + tid: 0, + native_len: 0, + py_len: 0, + native: [0usize; MAX_NATIVE], + py: [0usize; MAX_PY], +}; + +static SIGUSR2_HANDLER_INSTALLED: AtomicBool = AtomicBool::new(false); +static SIGUSR2_ARMED: AtomicBool = AtomicBool::new(false); +/// When armed, only this OS thread id may publish into [`SIGUSR2_SNAPSHOT`]. +static SIGUSR2_TARGET_TID: AtomicU64 = AtomicU64::new(0); +static SIGUSR2_SEQ: AtomicU64 = AtomicU64::new(0); +static SIGUSR2_SNAPSHOT: Sigusr2SnapshotSlot = Sigusr2SnapshotSlot(UnsafeCell::new(ZERO_SNAPSHOT)); + +/// Generation counter before arming; [`take_sigusr2_snapshot`] returns data when seq advances. +pub fn sigusr2_capture_generation() -> u64 { + SIGUSR2_SEQ.load(Ordering::Acquire) +} + +pub fn set_sigusr2_armed(armed: bool) { + SIGUSR2_ARMED.store(armed, Ordering::Release); +} + +pub fn take_sigusr2_snapshot(after_seq: u64) -> Option { + if SIGUSR2_SEQ.load(Ordering::Acquire) <= after_seq { + return None; + } + let snap = unsafe { *SIGUSR2_SNAPSHOT.0.get() }; + if snap.is_empty() { + None + } else { + Some(snap) + } +} + +struct Sigusr2ArmGuard; + +impl Sigusr2ArmGuard { + fn new(target_tid: u64) -> Self { + SIGUSR2_TARGET_TID.store(target_tid, Ordering::Release); + SIGUSR2_ARMED.store(true, Ordering::Release); + Sigusr2ArmGuard + } +} + +impl Drop for Sigusr2ArmGuard { + fn drop(&mut self) { + SIGUSR2_ARMED.store(false, Ordering::Release); + SIGUSR2_TARGET_TID.store(0, Ordering::Release); + } +} + +/// Arm, deliver SIGUSR2 to `tid`, and wait for an async-signal-safe snapshot slot. +#[cfg(unix)] +pub fn capture_thread_snapshot_signal(tid: u64, timeout: Duration) -> Option { + use std::time::Instant; + + let _guard = Sigusr2ArmGuard::new(tid); + let seq_before = sigusr2_capture_generation(); + let tid_i32 = tid as i32; + + #[cfg(target_os = "linux")] + { + let pid = nix::unistd::getpid().as_raw(); + let ret = unsafe { libc::syscall(libc::SYS_tgkill, pid, tid_i32, libc::SIGUSR2) }; + if ret != 0 { + return None; + } + } + + #[cfg(target_os = "macos")] + { + if probing_core::signal::send_sigusr2_to_thread_id(tid_i32).is_err() { + return None; + } + } + + #[cfg(not(any(target_os = "linux", target_os = "macos")))] + { + let _ = (pid, tid_i32, timeout); + return None; + } + + let deadline = Instant::now() + timeout; + while Instant::now() < deadline { + if let Some(snap) = take_sigusr2_snapshot(seq_before) { + if snap.tid == tid { + return Some(snap); + } + } + std::thread::sleep(Duration::from_millis(1)); + } + None +} + +#[cfg(not(unix))] +pub fn capture_thread_snapshot_signal(_tid: u64, _timeout: Duration) -> Option { + None +} + +#[cfg(unix)] +pub fn install_sigusr2_handler() { + if SIGUSR2_HANDLER_INSTALLED.swap(true, Ordering::AcqRel) { + return; + } + unsafe { + let mut sa: libc::sigaction = std::mem::zeroed(); + sa.sa_sigaction = sigusr2_stack_handler as *const () as usize; + sa.sa_flags = libc::SA_SIGINFO | libc::SA_RESTART; + libc::sigemptyset(&mut sa.sa_mask); + libc::sigaction(libc::SIGUSR2, &sa, std::ptr::null_mut()); + } +} + +#[cfg(unix)] +unsafe extern "C" fn sigusr2_stack_handler( + _sig: c_int, + _info: *mut libc::siginfo_t, + uctx: *mut c_void, +) { + if !SIGUSR2_ARMED.load(Ordering::Acquire) { + return; + } + let target = SIGUSR2_TARGET_TID.load(Ordering::Acquire); + if target == 0 { + return; + } + let snapshot = capture_raw_snapshot(uctx); + if snapshot.is_empty() || snapshot.tid != target { + return; + } + unsafe { + *SIGUSR2_SNAPSHOT.0.get() = snapshot; + } + SIGUSR2_SEQ.fetch_add(1, Ordering::Release); +} + +#[cfg(not(unix))] +pub fn install_sigusr2_handler() {} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn register_main_os_tid_is_idempotent() { + register_main_os_tid(); + let first = python_main_os_tid(); + register_main_os_tid(); + assert_eq!(first, python_main_os_tid()); + assert!(first.is_some()); + } + + #[test] + fn py_frame_symbol_folded_label_uses_basename() { + let sym = PyFrameSymbol { + func: "main".into(), + file: "examples/imagenet_with_span.py".into(), + lineno: 316, + }; + assert_eq!(sym.folded_label(), "[py] main (imagenet_with_span.py:316)"); + } + + #[test] + fn py_frame_symbol_call_frame_keeps_full_path() { + let sym = PyFrameSymbol { + func: "main".into(), + file: "examples/imagenet_with_span.py".into(), + lineno: 316, + }; + let frame = sym.to_call_frame(); + match frame { + CallFrame::PyFrame { + file, func, lineno, .. + } => { + assert_eq!(file, "examples/imagenet_with_span.py"); + assert_eq!(func, "main"); + assert_eq!(lineno, 316); + } + other => panic!("expected PyFrame, got {other:?}"), + } + } +} diff --git a/probing/extensions/python/src/features/stack_merge.rs b/probing/extensions/python/src/features/stack_merge.rs new file mode 100644 index 00000000..03d3a067 --- /dev/null +++ b/probing/extensions/python/src/features/stack_merge.rs @@ -0,0 +1,324 @@ +//! Unified Python / native stack merge for SIGPROF, SIGUSR2, and synchronous walks. +//! +//! Python frames always come from the eval-frame hook (`vm_tracer` / `PYSTACKS`). +//! Native frames are spliced at CPython eval-frame boundaries +//! (`_PyEval_EvalFrameDefault` / `EvalFrameEx`). + +use std::collections::HashSet; + +use lazy_static::lazy_static; +use probing_proto::prelude::CallFrame; + +lazy_static! { + static ref WHITELISTED_PREFIXES: HashSet<&'static str> = { + const PREFIXES: &[&str] = &[ + "time", + "sys", + "gc", + "os", + "unicode", + "thread", + "stringio", + "sre", + "PyGilState", + "PyThread", + "lock", + ]; + PREFIXES.iter().copied().collect() + }; +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +enum MergeAction { + /// Drop interpreter trampoline noise. + Drop, + /// Keep the native frame as-is. + KeepNative, + /// Replace with the next Python frame from the eval hook. + SplicePython, +} + +fn frame_symbol(frame: &CallFrame) -> &str { + match frame { + CallFrame::CFrame { func, .. } | CallFrame::PyFrame { func, .. } => func, + } +} + +/// CPython eval splice point in a native stack tower. +pub fn is_eval_frame_name(name: &str) -> bool { + let mut tokens = name.split(['_', '.']).filter(|s| !s.is_empty()); + matches!(tokens.next(), Some("PyEval")) + && matches!( + tokens.next(), + Some("EvalFrameDefault") | Some("EvalFrameEx") + ) +} + +pub fn is_eval_frame(frame: &CallFrame) -> bool { + is_eval_frame_name(frame_symbol(frame)) +} + +/// Our eval-frame hook trampoline; dropped from mixed stacks as noise. +pub fn is_interp_shim(frame: &CallFrame) -> bool { + frame_symbol(frame).contains("rust_eval_frame") +} + +fn merge_action(frame: &CallFrame) -> MergeAction { + if is_interp_shim(frame) { + return MergeAction::Drop; + } + if is_interpreter_startup_native(frame_symbol(frame)) { + return MergeAction::Drop; + } + if is_eval_frame(frame) { + return MergeAction::SplicePython; + } + let symbol = frame_symbol(frame); + let mut tokens = symbol.split(['_', '.']).filter(|s| !s.is_empty()); + match tokens.next() { + Some("PyEval") => MergeAction::Drop, + Some(prefix) if WHITELISTED_PREFIXES.contains(prefix) => MergeAction::KeepNative, + _ => MergeAction::KeepNative, + } +} + +/// Demangle a native symbol name; returns `(display_name, lang_tag)`. +pub fn demangle_native_symbol(raw_name: &str) -> (String, Option<&'static str>) { + if let Ok(d) = rustc_demangle::try_demangle(raw_name) { + return (d.to_string(), Some("rust")); + } + // macOS C ABI adds a leading `_` to Rust v0 mangling (`_R...` -> `__R...`). + if raw_name.starts_with("__R") { + if let Ok(d) = rustc_demangle::try_demangle(&raw_name[1..]) { + return (d.to_string(), Some("rust")); + } + } + if let Some(demangled) = cpp_demangle::Symbol::new(raw_name) + .ok() + .and_then(|sym| sym.demangle().ok()) + { + return (demangled, Some("cpp")); + } + (raw_name.to_string(), None) +} + +/// Merge Python eval-hook frames with a native stack captured leaf -> root. +/// +/// `python_outer_to_inner` follows `PYSTACKS` / `get_python_stacks_raw` order +/// (outermost Python frame first). `native_leaf_to_root` starts at the +/// interrupted PC and walks toward the root. +/// +/// Returns root -> leaf (caller -> callee), best-effort when walks truncate. +pub fn merge_python_native_stacks( + python_outer_to_inner: &[CallFrame], + native_leaf_to_root: &[CallFrame], +) -> Vec { + if native_leaf_to_root.is_empty() { + return python_outer_to_inner.to_vec(); + } + if python_outer_to_inner.is_empty() { + let mut out: Vec = native_leaf_to_root + .iter() + .filter(|f| !is_interp_shim(f)) + .filter(|f| !is_interpreter_startup_native(frame_symbol(f))) + .cloned() + .collect(); + // Match the root -> leaf order returned by the merge paths below. + out.reverse(); + return out; + } + + // Innermost Python aligns with the deepest eval frame in the native walk. + let py_inner_to_outer: Vec = python_outer_to_inner.iter().rev().cloned().collect(); + let eval_count = native_leaf_to_root + .iter() + .filter(|f| is_eval_frame(f)) + .count(); + + let mut merged_leaf_to_root: Vec = Vec::new(); + + if eval_count > 0 { + let mut pi = 0usize; + for frame in native_leaf_to_root { + match merge_action(frame) { + MergeAction::Drop => {} + MergeAction::SplicePython => { + if let Some(py) = py_inner_to_outer.get(pi) { + merged_leaf_to_root.push(py.clone()); + } else { + merged_leaf_to_root.push(frame.clone()); + } + pi += 1; + } + MergeAction::KeepNative => merged_leaf_to_root.push(frame.clone()), + } + } + if pi < py_inner_to_outer.len() { + merged_leaf_to_root.extend_from_slice(&py_inner_to_outer[pi..]); + } + } else { + merged_leaf_to_root.extend(py_inner_to_outer); + merged_leaf_to_root.extend( + native_leaf_to_root + .iter() + .filter(|f| !is_interp_shim(f)) + .filter(|f| !is_interpreter_startup_native(frame_symbol(f))) + .cloned(), + ); + } + + merged_leaf_to_root.reverse(); + merged_leaf_to_root +} + +/// Stdlib bootstrap frames that should not anchor a flamegraph root. +fn is_stdlib_bootstrap_py_segment(seg: &str) -> bool { + if !seg.starts_with("[py]") { + return false; + } + seg.contains("builtins.py") + || seg.contains(" bool { + name.starts_with("_Py_RunMain") + || name.starts_with("pymain_") + || name.starts_with("_pymain_") + || name.starts_with("_PyRun_") + || name.starts_with("PyRun_") + || name.starts_with("_run_mod") + || name.starts_with("run_mod") + || name == "Py_BytesMain" + || name == "_Py_BytesMain" +} + +/// Align folded paths for merge: drop leading native bootstrap and stdlib `[py]` noise. +/// +/// SIGPROF samples occasionally include `_Py_RunMain` → … → user code while others +/// start directly at `[py] (script.py)`. Without this, identical stacks fork. +pub fn canonicalize_folded_segments(segments: &[String]) -> Vec { + if segments.is_empty() { + return Vec::new(); + } + let py_start = segments + .iter() + .position(|s| s.starts_with("[py]")) + .unwrap_or(segments.len()); + let mut out: Vec = segments[py_start..].to_vec(); + while out.len() > 1 && is_stdlib_bootstrap_py_segment(&out[0]) { + out.remove(0); + } + if out.is_empty() { + segments.to_vec() + } else { + out + } +} + +/// Format merged frames as folded flamegraph segments (root -> leaf), canonicalized. +pub fn merged_frames_to_folded_segments(frames: &[CallFrame]) -> Vec { + let raw: Vec = frames + .iter() + .map(|frame| match frame { + CallFrame::PyFrame { + file, func, lineno, .. + } => { + let base = file.rsplit(['/', '\\']).next().unwrap_or(file); + format!("[py] {func} ({base}:{lineno})") + } + CallFrame::CFrame { func, .. } => func.clone(), + }) + .collect(); + canonicalize_folded_segments(&raw) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn py(file: &str, func: &str, line: i64) -> CallFrame { + CallFrame::PyFrame { + file: file.into(), + func: func.into(), + lineno: line, + locals: Default::default(), + } + } + + fn c(func: &str) -> CallFrame { + CallFrame::CFrame { + ip: "0x1".into(), + file: String::new(), + func: func.into(), + lineno: 0, + lang: Some("cpp".into()), + } + } + + #[test] + fn canonicalize_drops_interpreter_bootstrap_before_user_py() { + let raw = vec![ + "_Py_RunMain".to_string(), + "_pymain_run_file".to_string(), + "[py] (imagenet_with_span.py:1)".to_string(), + "[py] main (imagenet_with_span.py:316)".to_string(), + ]; + let out = canonicalize_folded_segments(&raw); + assert_eq!( + out, + vec![ + "[py] (imagenet_with_span.py:1)".to_string(), + "[py] main (imagenet_with_span.py:316)".to_string(), + ] + ); + } + + #[test] + fn canonicalize_is_idempotent_for_user_rooted_paths() { + let user = vec![ + "[py] (train.py:1)".to_string(), + "[py] train (train.py:10)".to_string(), + ]; + assert_eq!(canonicalize_folded_segments(&user), user); + } + + #[test] + fn eval_frames_splice_python_innermost_first() { + let native = vec![ + c("leaf_native"), + c("_PyEval_EvalFrameDefault"), + c("caller_native"), + ]; + // Outer -> inner; only one eval splice point, so leftover outer sits at root. + let python = vec![py("outer.py", "outer", 1), py("inner.py", "inner", 2)]; + let merged = merge_python_native_stacks(&python, &native); + assert_eq!( + merged, + vec![ + py("outer.py", "outer", 1), + c("caller_native"), + py("inner.py", "inner", 2), + c("leaf_native"), + ] + ); + } + + #[test] + fn drops_interp_shim() { + // Native input is leaf -> root; output must be root -> leaf. + let native = vec![c("leaf"), c("rust_eval_frame"), c("root")]; + let merged = merge_python_native_stacks(&[], &native); + assert_eq!(merged, vec![c("root"), c("leaf")]); + } + + #[test] + fn pure_python_passthrough() { + let python = vec![py("a.py", "a", 1), py("b.py", "b", 2)]; + let merged = merge_python_native_stacks(&python, &[]); + assert_eq!(merged, python); + } +} diff --git a/probing/extensions/python/src/features/stack_tracer.rs b/probing/extensions/python/src/features/stack_tracer.rs index d559b2e7..9312783d 100644 --- a/probing/extensions/python/src/features/stack_tracer.rs +++ b/probing/extensions/python/src/features/stack_tracer.rs @@ -1,23 +1,20 @@ -use std::collections::HashSet; +use std::collections::HashMap; use std::panic::{catch_unwind, AssertUnwindSafe}; -use std::sync::mpsc; -use std::sync::Mutex; use std::time::Duration; use anyhow::Result; use async_trait::async_trait; -use lazy_static::lazy_static; -use nix::libc; use once_cell::sync::Lazy; use pyo3::Python; use probing_proto::prelude::CallFrame; use probing_core::is_python_main_thread; -#[cfg(target_os = "macos")] -use probing_core::signal::send_sigusr2_to_thread_id; -use crate::features::vm_tracer::{get_python_frames_raw, get_python_stacks_raw}; +use crate::features::stack_capture::{self, RawStackSnapshot}; +use crate::features::stack_merge::merged_frames_to_folded_segments; +use crate::features::stack_merge::{demangle_native_symbol, merge_python_native_stacks}; +use crate::features::vm_tracer::get_python_stacks_raw; #[derive(Debug, thiserror::Error)] #[error("backtrace capture busy: {0}")] @@ -27,67 +24,6 @@ pub(crate) fn is_backtrace_busy(err: &anyhow::Error) -> bool { err.downcast_ref::().is_some() } -fn demangle_native_symbol(raw_name: &str) -> (String, Option<&'static str>) { - if let Ok(d) = rustc_demangle::try_demangle(raw_name) { - return (d.to_string(), Some("rust")); - } - // macOS C ABI adds a leading `_` to Rust v0 mangling (`_R...` -> `__R...`). - if raw_name.starts_with("__R") { - if let Ok(d) = rustc_demangle::try_demangle(&raw_name[1..]) { - return (d.to_string(), Some("rust")); - } - } - if let Some(demangled) = cpp_demangle::Symbol::new(raw_name) - .ok() - .and_then(|sym| sym.demangle().ok()) - { - return (demangled, Some("cpp")); - } - (raw_name.to_string(), None) -} - -lazy_static! { - static ref WHITELISTED_PREFIXES: HashSet<&'static str> = { - const PREFIXES: &[&str] = &[ - "time", - "sys", - "gc", - "os", - "unicode", - "thread", - "stringio", - "sre", - "PyGilState", - "PyThread", - "lock", - ]; - PREFIXES.iter().copied().collect() - }; -} - -#[derive(Copy, Clone)] -enum MergeType { - Ignore, - MergeNativeFrame, - MergePythonFrame, -} - -fn merge_strategy(frame: &CallFrame) -> MergeType { - let symbol = match frame { - CallFrame::CFrame { func, .. } => func, - CallFrame::PyFrame { func, .. } => func, - }; - let mut tokens = symbol.split(['_', '.']).filter(|s| !s.is_empty()); - match tokens.next() { - Some("PyEval") => match tokens.next() { - Some("EvalFrameDefault" | "EvalFrameEx") => MergeType::MergePythonFrame, - _ => MergeType::Ignore, - }, - Some(prefix) if WHITELISTED_PREFIXES.contains(prefix) => MergeType::MergeNativeFrame, - _ => MergeType::MergeNativeFrame, - } -} - #[async_trait] pub trait StackTracer: Send + Sync + std::fmt::Debug { fn trace(&self, tid: Option) -> Result>; @@ -97,8 +33,9 @@ pub trait StackTracer: Send + Sync + std::fmt::Debug { pub struct SignalTracer; impl SignalTracer { - fn get_native_stacks() -> Option> { - let mut frames = vec![]; + /// Walk the current thread without signals (safe under any Python runtime layout). + pub fn trace_current_thread_merged() -> Vec { + let mut native_leaf_to_root = Vec::new(); backtrace::trace(|frame| { let ip = frame.ip(); backtrace::resolve_frame(frame, |symbol| { @@ -112,7 +49,7 @@ impl SignalTracer { .filename() .map(|path| path.to_string_lossy().into_owned()) .unwrap_or_default(); - frames.push(CallFrame::CFrame { + native_leaf_to_root.push(CallFrame::CFrame { ip: format!("{ip:p}"), file: file_name, func: func_name, @@ -122,163 +59,86 @@ impl SignalTracer { }); true }); - Some(frames) - } - fn send_frames(frames: Vec) -> Result<()> { - match NATIVE_CALLSTACK_SENDER_SLOT.try_lock() { - Ok(guard) => { - if let Some(sender) = guard.as_ref() { - sender.send(frames)?; - Ok(()) - } else { - Err(anyhow::anyhow!("No sender available in channel slot")) - } - } - Err(_) => Err(anyhow::anyhow!("Failed to send frames via channel")), + let python = Python::attach(|_py| get_python_stacks_raw()); + if python.is_empty() { + native_leaf_to_root.reverse(); + return native_leaf_to_root; } + if native_leaf_to_root.is_empty() { + return python; + } + merge_python_native_stacks(&python, &native_leaf_to_root) } - fn merge_python_native_stacks( - python_stacks: Vec, - native_stacks: Vec, - ) -> Vec { - let mut merged = vec![]; - let mut python_frame_index = 0; + fn merged_from_snapshot(snapshot: &RawStackSnapshot) -> Vec { + let mut cache = HashMap::new(); + stack_capture::snapshot_to_merged_frames(snapshot, &mut cache) + } - for frame in native_stacks { - match merge_strategy(&frame) { - MergeType::Ignore => {} - MergeType::MergeNativeFrame => merged.push(frame), - MergeType::MergePythonFrame => { - if let Some(py_frame) = python_stacks.get(python_frame_index) { - merged.push(py_frame.clone()); - } - python_frame_index += 1; - } - } + /// Read the Python main thread stack without SIGUSR2 (safe from HTTP / SQL workers). + fn trace_main_thread_off_signal() -> Result> { + let main_tid = stack_capture::python_main_os_tid() + .ok_or_else(|| anyhow::anyhow!("Python main thread is not registered yet"))?; + + if let Some(snapshot) = stack_capture::latest_snapshot_for_tid(main_tid) { + return Ok(Self::merged_from_snapshot(&snapshot)); } - merged - } - /// Walk the current thread without signals (safe under any Python runtime layout). - pub fn trace_current_thread_merged() -> Result> { - let native = Self::get_native_stacks().unwrap_or_default(); - let python = Python::attach(|_py| { - let from_tracer = get_python_stacks_raw(); - if !from_tracer.is_empty() { - from_tracer - } else { - get_python_frames_raw(None) + if let Some(snapshot) = stack_capture::copy_registered_py_snapshot(main_tid) { + let frames = Self::merged_from_snapshot(&snapshot); + if !frames.is_empty() { + return Ok(frames); } - }); - if python.is_empty() { - return Ok(native); - } - if native.is_empty() { - return Ok(python); } - Ok(Self::merge_python_native_stacks(python, native)) - } - fn default_signal_tid() -> i32 { - nix::unistd::getpid().as_raw() + Err(anyhow::anyhow!( + "main-thread stack unavailable; enable SIGPROF sampling or retry while training is active" + )) } - fn clear_sender_slot() { - if let Ok(mut guard) = NATIVE_CALLSTACK_SENDER_SLOT.try_lock() { - guard.take(); - } + fn is_main_tid(tid: i32) -> bool { + stack_capture::python_main_os_tid().is_some_and(|main| main == tid as u64) } fn trace_thread_signal(tid: i32) -> Result> { - let pid = nix::unistd::getpid().as_raw(); + if Self::is_main_tid(tid) { + return Self::trace_main_thread_off_signal(); + } + + if stack_capture::is_pprof_sampling_active() { + if let Some(snapshot) = stack_capture::latest_snapshot_for_tid(tid as u64) { + return Ok(Self::merged_from_snapshot(&snapshot)); + } + } - // Only one signal-based capture can run at a time (shared SIGUSR2 + - // sender slot). Concurrent requests losing the race is a benign "busy" - // state — the outer `trace()` already downgrades it to an empty result — - // so log at debug to avoid flooding training output with errors. let _guard = BACKTRACE_MUTEX.try_lock().map_err(|e| { let busy = BacktraceBusy(e.to_string()); log::debug!("{busy}; skipping concurrent request"); anyhow::Error::new(busy) })?; - let (tx, rx) = mpsc::channel::>(); - NATIVE_CALLSTACK_SENDER_SLOT - .try_lock() - .map_err(|err| { - log::error!("Failed to lock CALLSTACK_SENDER_SLOT: {err}"); - anyhow::anyhow!("Failed to lock call stack sender slot") - })? - .replace(tx); - - log::debug!("Sending SIGUSR2 signal to process {pid} (thread: {tid})"); - - #[cfg(target_os = "linux")] - { - let ret = unsafe { libc::syscall(libc::SYS_tgkill, pid, tid, libc::SIGUSR2) }; - if ret != 0 { - let last_error = std::io::Error::last_os_error(); - Self::clear_sender_slot(); - return Err(anyhow::anyhow!( - "Failed to send SIGUSR2 to process {pid} (thread: {tid}): {last_error}" - )); - } - } - - #[cfg(target_os = "macos")] - { - let signal_result = if tid == pid { - let ret = unsafe { libc::kill(pid, libc::SIGUSR2) }; - if ret != 0 { - Err(std::io::Error::last_os_error()) - } else { - Ok(()) - } - } else { - send_sigusr2_to_thread_id(tid) - }; - if let Err(e) = signal_result { - Self::clear_sender_slot(); - return Err(anyhow::anyhow!( - "Failed to send SIGUSR2 to process {pid} (thread: {tid}): {e}" - )); - } - } - - #[cfg(not(any(target_os = "linux", target_os = "macos")))] - { - let _ = (pid, tid); - Self::clear_sender_slot(); - return Err(anyhow::anyhow!( - "Stack tracing is not supported on this platform" - )); - } + let snapshot = + stack_capture::capture_thread_snapshot_signal(tid as u64, Duration::from_secs(2)) + .ok_or_else(|| { + anyhow::anyhow!("timed out waiting for stack snapshot on thread {tid}") + })?; - let native_frames = match rx.recv_timeout(Duration::from_secs(2)) { - Ok(frames) => frames, - Err(err) => { - Self::clear_sender_slot(); - return Err(err.into()); - } - }; - let python_frames = match rx.recv_timeout(Duration::from_secs(2)) { - Ok(frames) => frames, - Err(err) => { - Self::clear_sender_slot(); - return Err(anyhow::anyhow!( - "Python stack trace timed out or failed after native capture: {err}" - )); - } - }; - Self::clear_sender_slot(); + Ok(Self::merged_from_snapshot(&snapshot)) + } +} - Ok(Self::merge_python_native_stacks( - python_frames, - native_frames, - )) +/// On-demand main-thread stack as a single folded line (`"stack 1"`). +pub fn main_thread_on_demand_folded_lines() -> Vec { + let frames = match SignalTracer::trace_main_thread_off_signal() { + Ok(frames) if !frames.is_empty() => frames, + _ => return Vec::new(), + }; + let segments = merged_frames_to_folded_segments(&frames); + if segments.is_empty() { + return Vec::new(); } + vec![format!("{} 1", segments.join(";"))] } #[async_trait] @@ -286,14 +146,20 @@ impl StackTracer for SignalTracer { fn trace(&self, tid: Option) -> Result> { log::debug!("Collecting backtrace for TID: {tid:?}"); - // The CPU sampler now uses an async-signal-safe SIGPROF handler that does - // no heavy work, so it no longer conflicts with SIGUSR2 stack capture. + let explicit = tid.filter(|&t| t > 0); + + if explicit.is_none() { + if is_python_main_thread() { + return Ok(Self::trace_current_thread_merged()); + } + return Self::trace_main_thread_off_signal(); + } - if tid.is_none() && is_python_main_thread() { - return Self::trace_current_thread_merged(); + let target = explicit.unwrap(); + if Self::is_main_tid(target) { + return Self::trace_main_thread_off_signal(); } - let target = tid.unwrap_or_else(Self::default_signal_tid); match catch_unwind(AssertUnwindSafe(|| Self::trace_thread_signal(target))) { Ok(Ok(frames)) => Ok(frames), Ok(Err(err)) => { @@ -306,7 +172,6 @@ impl StackTracer for SignalTracer { } Err(_) => { log::warn!("Cross-thread stack trace panicked for tid {target}"); - Self::clear_sender_slot(); Err(anyhow::anyhow!( "cross-thread stack trace panicked for tid {target}" )) @@ -315,30 +180,4 @@ impl StackTracer for SignalTracer { } } -pub fn backtrace_signal_handler() { - // Ignore stray SIGUSR2 (e.g. macOS tooling or other libraries). Only run - // capture logic while `trace_thread_signal` holds a receiver in the slot. - let expecting = NATIVE_CALLSTACK_SENDER_SLOT - .try_lock() - .ok() - .is_some_and(|guard| guard.is_some()); - if !expecting { - return; - } - - // Runs on the signaled thread: native unwind + thread-local eval-frame tracer stack. - let native_stacks = SignalTracer::get_native_stacks().unwrap_or_default(); - if SignalTracer::send_frames(native_stacks).is_err() { - log::error!("Signal handler: failed to send native stacks (receiver may have timed out)"); - } - let python_stacks = get_python_stacks_raw(); - if SignalTracer::send_frames(python_stacks).is_err() { - log::error!("Signal handler: failed to send Python stacks from eval tracer"); - } -} - -/// Define a static Mutex for the backtrace function static BACKTRACE_MUTEX: Lazy> = Lazy::new(|| tokio::sync::Mutex::new(())); - -pub static NATIVE_CALLSTACK_SENDER_SLOT: Lazy>>>> = - Lazy::new(|| Mutex::new(None)); diff --git a/probing/extensions/python/src/features/vm_tracer.rs b/probing/extensions/python/src/features/vm_tracer.rs index 8f84d1a3..e1a68470 100644 --- a/probing/extensions/python/src/features/vm_tracer.rs +++ b/probing/extensions/python/src/features/vm_tracer.rs @@ -51,14 +51,14 @@ unsafe extern "C" fn rust_eval_frame( with_spy_state(|state| { // Mark this thread as a Python thread once; lets the SIGPROF sampler know its // thread-local `PYSTACKS` is allocated and safe to read from a signal handler. - crate::features::pprof::register_python_thread(); + crate::features::stack_capture::register_python_thread(); // Resolve this frame's callee symbol *now*, while the code object is alive // under the GIL, and cache it by pointer. The SIGPROF consumer later looks // the label up by integer key instead of dereferencing a possibly-freed // `PyCodeObject` off the signal path. let loc = RawCallLocation::from(frame as usize, Some(ts as usize)); - crate::features::pprof::intern_py_frame(&loc); + crate::features::stack_capture::intern_py_frame(&loc); // Bracket the `PYSTACKS` mutation so a SIGPROF sample taken mid-realloc is // discarded instead of reading a torn `Vec`. @@ -127,7 +127,7 @@ pub fn disable_tracer() -> PyResult<()> { }); } } - crate::features::pprof::clear_py_symbols(); + crate::features::stack_capture::clear_py_symbols(); Ok(()) } diff --git a/probing/extensions/python/src/setup.rs b/probing/extensions/python/src/setup.rs index 8c60d846..1270355c 100644 --- a/probing/extensions/python/src/setup.rs +++ b/probing/extensions/python/src/setup.rs @@ -1,17 +1,3 @@ -pub fn register_signal_handler(sig: std::ffi::c_int, handler: F) -where - F: Fn() + Sync + Send + 'static, -{ - unsafe { - match signal_hook_registry::register_unchecked(sig, move |_: &_| handler()) { - Ok(_) => { - log::debug!("Registered signal handler for signal {sig}"); - } - Err(e) => log::error!("Failed to register signal handler: {e}"), - } - }; -} - #[ctor] fn setup() { use crate::python::{set_enabled, should_enable_probing}; @@ -30,15 +16,12 @@ fn setup() { #[cfg(unix)] if cfg!(test) { - // Unit-test processes must not run the SIGUSR2 stack handler: it calls - // backtrace/Python from signal context and aborts on stray delivery. + // Unit-test processes must not run the SIGUSR2 stack handler: it captures + // stacks from signal context and aborts on stray delivery. unsafe { nix::libc::signal(nix::libc::SIGUSR2, nix::libc::SIG_IGN); } } else { - register_signal_handler( - nix::libc::SIGUSR2, - crate::features::stack_tracer::backtrace_signal_handler, - ); + crate::features::stack_capture::install_sigusr2_handler(); } } diff --git a/probing/server/API.md b/probing/server/API.md index b8c98c2e..f56aa196 100644 --- a/probing/server/API.md +++ b/probing/server/API.md @@ -22,7 +22,8 @@ Registered in `server/api/mod.rs`: | GET | `/apis/files?path=…` | Read workspace file | | GET/PUT | `/apis/nodes` | Cluster node list / register | | GET | `/apis/training/step_matrix` | Cross-rank train.step samples (`cluster=false` default; set `cluster=true` for on-demand fan-out) | -| GET | `/apis/training/distributed_flamegraph/json` | SPMD torch module flamegraph at one `local_step` (`?step=` optional, `?metric=duration\|delta_mb\|peak_mb`, `cluster=true` default) | +| GET | `/apis/training/distributed_flamegraph/json` | SPMD torch module flamegraph at one `local_step` (legacy; prefer distributed stack flamegraph) | +| GET | `/apis/training/distributed_stack_flamegraph/json` | Distributed CPU stack flamegraph (`?cluster=true` default, `?mode=mixed\|py`). Frames may include `ranks: [i32]` (contributing training ranks under that partition) and payload `rankCount`. | | POST | `/apis/cluster/query` | On-demand SQL fan-out (`{"expr":"…","cluster":true}`; read-only SQL only) | Flamegraphs are served by profiler extensions (extension fallback, not public routes): @@ -33,6 +34,8 @@ Flamegraphs are served by profiler extensions (extension fallback, not public ro | GET | `/apis/torchextension/flamegraph/json` | JSON for native Web UI (`?metric=` optional) | | GET | `/apis/pprofextension/flamegraph` | CPU sampling flamegraph (interactive HTML) | | GET | `/apis/pprofextension/flamegraph/json` | JSON for native Web UI | +| GET | `/apis/pprofextension/flamegraph/folded/json` | Raw folded stack lines for cluster merge | +| GET | `/apis/pprofextension/flamegraph/distributed/json` | Distributed SIGPROF stack flamegraph (`?cluster=true` default) | ## Cluster query (on-demand fan-out) diff --git a/probing/server/src/server/api/mod.rs b/probing/server/src/server/api/mod.rs index 36ba9506..b3b563d0 100644 --- a/probing/server/src/server/api/mod.rs +++ b/probing/server/src/server/api/mod.rs @@ -21,6 +21,7 @@ pub const PUBLIC_API_ROUTES: &[(&str, &str)] = &[ ("PUT", "/nodes"), ("GET", "/training/step_matrix"), ("GET", "/training/distributed_flamegraph/json"), + ("GET", "/training/distributed_stack_flamegraph/json"), ("POST", "/cluster/query"), ]; @@ -40,6 +41,10 @@ fn public_routes() -> Router { "/training/distributed_flamegraph/json", get(training::get_distributed_flamegraph_json), ) + .route( + "/training/distributed_stack_flamegraph/json", + get(training::get_distributed_stack_flamegraph_json), + ) .route("/cluster/query", post(cluster_query::post_cluster_query)) } diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index b5631f7b..138e9348 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -413,6 +413,36 @@ pub async fn get_distributed_flamegraph_json( (status, [(header::CONTENT_TYPE, "application/json")], body).into_response() } +#[derive(Debug, Deserialize)] +pub struct DistributedStackFlamegraphParams { + pub cluster: Option, + /// `mixed` (default) = Python + native; `py` = Python frames only. + pub mode: Option, +} + +/// Distributed CPU stack flamegraph: merge SIGPROF folded stacks across cluster ranks. +pub async fn get_distributed_stack_flamegraph_json( + axum::extract::Query(params): axum::extract::Query, +) -> impl IntoResponse { + use axum::http::header; + + if let Some(msg) = crate::engine_lifecycle::engine_not_ready_message() { + return ApiError::service_unavailable(msg).into_response(); + } + + let cluster = params.cluster.unwrap_or(true); + let mode = params.mode.as_deref().unwrap_or("mixed"); + let (body, partial) = + probing_python::features::pprof::collect_distributed_stack_flamegraph_json(cluster, mode) + .await; + let status = if partial { + StatusCode::SERVICE_UNAVAILABLE + } else { + StatusCode::OK + }; + (status, [(header::CONTENT_TYPE, "application/json")], body).into_response() +} + #[cfg(test)] mod tests { use super::*; diff --git a/python/probing/__init__.py b/python/probing/__init__.py index fee82af2..87aa84de 100644 --- a/python/probing/__init__.py +++ b/python/probing/__init__.py @@ -13,11 +13,15 @@ from __future__ import annotations -from probing._entrypoint import is_lightweight_module, is_probing_cli +from probing._entrypoint import ( + is_elastic_supervisor, + is_lightweight_module, + is_probing_cli, +) VERSION = "0.2.5" -if is_lightweight_module(): +if is_lightweight_module() or is_elastic_supervisor(): __all__ = ["VERSION"] elif is_probing_cli(): # Must set PROBING_CLI_MODE before loading _core so #[ctor] skips engine startup. diff --git a/python/probing/_entrypoint.py b/python/probing/_entrypoint.py index afff7a2c..92ff929b 100644 --- a/python/probing/_entrypoint.py +++ b/python/probing/_entrypoint.py @@ -80,3 +80,28 @@ def is_lightweight_module() -> bool: except (ValueError, IndexError): return False return mod in _LIGHTWEIGHT_MODULES + + +def is_elastic_supervisor() -> bool: + """True for torchrun / ``python -m torch.distributed.run`` launcher (not a worker rank).""" + if os.environ.get("LOCAL_RANK") is not None or os.environ.get("RANK") is not None: + return False + if os.environ.get("TORCHELASTIC_RUN_ID"): + return True + if current_script_name() == "torchrun": + return True + if sys.argv[:1] == ["-m"]: + if len(sys.argv) >= 2 and not sys.argv[1].startswith("-"): + return False + return True + try: + idx = sys.argv.index("-m") + mod = sys.argv[idx + 1] + except (ValueError, IndexError): + mod = None + if mod in ("torch.distributed.run", "torch.distributed.launch"): + return True + return any( + (arg or "").endswith("torchrun") or "torch/distributed/run" in (arg or "") + for arg in sys.argv + ) diff --git a/python/probing/site_hook.py b/python/probing/site_hook.py index a8ff0d01..101dbac5 100644 --- a/python/probing/site_hook.py +++ b/python/probing/site_hook.py @@ -11,6 +11,7 @@ from probing._entrypoint import ( current_script_name, + is_elastic_supervisor, is_lightweight_module, is_probing_cli, should_activate_probing, @@ -27,14 +28,7 @@ def run_site_hook() -> None: _RAN = True try: - import re - - script = current_script_name() - if ( - re.search("torchrun", script) is not None - or is_probing_cli() - or is_lightweight_module() - ): + if is_elastic_supervisor() or is_probing_cli() or is_lightweight_module(): return _init_probing() except Exception as exc: diff --git a/python/probing_hook.py b/python/probing_hook.py index c91ee085..7e3eda15 100644 --- a/python/probing_hook.py +++ b/python/probing_hook.py @@ -1,5 +1,40 @@ """Wheel / develop entry executed from ``probing.pth`` or ``probing_hook.pth``.""" -from probing.site_hook import run_site_hook +from __future__ import annotations -run_site_hook() +import os +import sys + + +def _is_elastic_supervisor() -> bool: + """Match Rust ``is_elastic_supervisor`` without importing ``probing``.""" + if os.environ.get("LOCAL_RANK") is not None or os.environ.get("RANK") is not None: + return False + if os.environ.get("TORCHELASTIC_RUN_ID"): + return True + if os.path.basename(sys.argv[0]) == "torchrun": + return True + # During site init for ``python -m ``, CPython may only expose ``['-m', ...]`` + # before the module name is appended. Worker ranks re-exec with RANK/LOCAL_RANK set. + if sys.argv[:1] == ["-m"]: + if len(sys.argv) >= 2 and not sys.argv[1].startswith("-"): + return False + return True + try: + idx = sys.argv.index("-m") + mod = sys.argv[idx + 1] + except (ValueError, IndexError): + mod = None + if mod in ("torch.distributed.run", "torch.distributed.launch"): + return True + return any( + (arg or "").endswith("torchrun") or "torch/distributed/run" in (arg or "") + for arg in sys.argv + ) + + +_sup = _is_elastic_supervisor() +if not _sup: + from probing.site_hook import run_site_hook + + run_site_hook() diff --git a/src/lib.rs b/src/lib.rs index 297d4182..edeb283c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -203,6 +203,7 @@ fn start_local() { #[pymodule(gil_used = true)] fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { register_python_main_thread(); + probing_python::features::stack_capture::register_main_os_tid(); // Initialize logging (try_init to avoid conflicts if already initialized via #[ctor]) let _ = env_logger::try_init_from_env(env_logger::Env::new().filter(ENV_PROBING_LOGLEVEL)); diff --git a/tests/regression/profiling/test_distributed_flamegraph.py b/tests/regression/profiling/test_distributed_flamegraph.py index 35cfb514..b3d172dd 100644 --- a/tests/regression/profiling/test_distributed_flamegraph.py +++ b/tests/regression/profiling/test_distributed_flamegraph.py @@ -134,17 +134,21 @@ def test_api_spec_lists_distributed_endpoint(self): paths = {(r["method"], r["path"]) for r in spec["server_public"]} assert ("GET", "/apis/training/distributed_flamegraph/json") in paths - def test_web_client_declares_distributed_path(self): + def test_web_client_declares_distributed_stack_path(self): from pathlib import Path spec_path = Path(__file__).resolve().parents[1] / "spec" / "api_spec.json" spec = json.loads(spec_path.read_text(encoding="utf-8")) - profiling_calls: list[str] = [] + stack_calls: list[str] = [] for entry in spec["client_contracts"]["web"]: - if entry["source"] != "web/src/api/profiling.rs": + if entry["source"] != "web/src/api/stack.rs": continue - profiling_calls.extend(c["path"] for c in entry["calls"]) - assert "/apis/training/distributed_flamegraph/json" in profiling_calls + stack_calls.extend(c["path"] for c in entry["calls"]) + assert "/apis/training/distributed_stack_flamegraph/json" in stack_calls + + # Legacy torch SPMD endpoint remains server-public; Web UI uses stack flamegraph. + paths = {(r["method"], r["path"]) for r in spec["server_public"]} + assert ("GET", "/apis/training/distributed_flamegraph/json") in paths @staticmethod def _normalize_profiling_view(view: str) -> str: diff --git a/tests/regression/spec/api_spec.json b/tests/regression/spec/api_spec.json index e35921ac..037911ce 100644 --- a/tests/regression/spec/api_spec.json +++ b/tests/regression/spec/api_spec.json @@ -18,6 +18,7 @@ { "method": "PUT", "path": "/apis/nodes" }, { "method": "GET", "path": "/apis/training/step_matrix" }, { "method": "GET", "path": "/apis/training/distributed_flamegraph/json" }, + { "method": "GET", "path": "/apis/training/distributed_stack_flamegraph/json" }, { "method": "POST", "path": "/apis/cluster/query" } ], "top_level": [ @@ -210,6 +211,20 @@ "local_path": "flamegraph/json", "response": { "content_type": "application/json", "cors": false } }, + { + "extension_name": "pprofextension", + "method": "GET", + "path": "/apis/pprofextension/flamegraph/folded/json", + "local_path": "flamegraph/folded/json", + "response": { "content_type": "application/json", "cors": false } + }, + { + "extension_name": "pprofextension", + "method": "GET", + "path": "/apis/pprofextension/flamegraph/distributed/json", + "local_path": "flamegraph/distributed/json", + "response": { "content_type": "application/json", "cors": false } + }, { "extension_name": "rdmaextension", "method": "POST", @@ -261,13 +276,15 @@ "source": "web/src/api/profiling.rs", "calls": [ { "method": "GET", "path": "/apis/torchextension/flamegraph/json" }, - { "method": "GET", "path": "/apis/pprofextension/flamegraph/json" }, - { "method": "GET", "path": "/apis/training/distributed_flamegraph/json" } + { "method": "GET", "path": "/apis/pprofextension/flamegraph/json" } ] }, { "source": "web/src/api/stack.rs", - "calls": [{ "method": "GET", "path": "/apis/pythonext/callstack" }] + "calls": [ + { "method": "GET", "path": "/apis/pythonext/callstack" }, + { "method": "GET", "path": "/apis/training/distributed_stack_flamegraph/json" } + ] }, { "source": "web/src/api/trace.rs", diff --git a/tests/unit/probing/test_entrypoint.py b/tests/unit/probing/test_entrypoint.py new file mode 100644 index 00000000..f8b84ac6 --- /dev/null +++ b/tests/unit/probing/test_entrypoint.py @@ -0,0 +1,31 @@ +"""Unit tests for process entrypoint detection.""" + +from __future__ import annotations + +import sys + +import pytest + +from probing import _entrypoint as ep + + +@pytest.mark.parametrize( + ("argv", "env", "expected"), + [ + (["python", "-m", "torch.distributed.run", "--standalone"], {}, True), + (["-m", "--help"], {}, True), + (["/usr/bin/torchrun", "train.py"], {}, True), + (["python", "examples/imagenet_with_span.py"], {"RANK": "0"}, False), + (["python", "examples/imagenet_with_span.py"], {"LOCAL_RANK": "1"}, False), + (["python", "-m", "torch.distributed.run"], {"TORCHELASTIC_RUN_ID": "x"}, True), + (["python", "examples/tracing.py"], {}, False), + (["-m", "probing.skills"], {}, False), + ], +) +def test_is_elastic_supervisor(argv, env, expected, monkeypatch): + monkeypatch.setattr(sys, "argv", argv) + for key in ("RANK", "LOCAL_RANK", "TORCHELASTIC_RUN_ID"): + monkeypatch.delenv(key, raising=False) + for key, value in env.items(): + monkeypatch.setenv(key, value) + assert ep.is_elastic_supervisor() is expected diff --git a/web/assets/tailwind.css b/web/assets/tailwind.css index ab9acb78..74d36fed 100644 --- a/web/assets/tailwind.css +++ b/web/assets/tailwind.css @@ -1012,6 +1012,10 @@ video { margin-bottom: 0.125rem; } +.-mb-px { + margin-bottom: -1px; +} + .-mt-0\.5 { margin-top: -0.125rem; } @@ -1958,6 +1962,10 @@ video { border-bottom-width: 1px; } +.border-b-2 { + border-bottom-width: 2px; +} + .border-l { border-left-width: 1px; } @@ -2269,6 +2277,10 @@ video { border-color: rgb(51 65 85 / 0.5); } +.border-slate-700\/80 { + border-color: rgb(51 65 85 / 0.8); +} + .border-slate-800 { --tw-border-opacity: 1; border-color: rgb(30 41 59 / var(--tw-border-opacity, 1)); diff --git a/web/src/agent/routing.rs b/web/src/agent/routing.rs index 68a8d621..0907ec20 100644 --- a/web/src/agent/routing.rs +++ b/web/src/agent/routing.rs @@ -33,6 +33,8 @@ pub fn page_id_for_route(route: &Route) -> String { Route::AgentPage {} => "agent".into(), Route::ClusterPage {} => "cluster".into(), Route::StackPage {} => "stacks".into(), + Route::StackDistributedFullPage {} => "stacks/distributed".into(), + Route::StackDistributedPyPage {} => "stacks/distributed/py".into(), Route::StackWithTidPage { tid } => format!("stacks/{tid}"), Route::ProfilingViewPage { view } => { format!("profiling/{}", normalize_profiling_view(view)) diff --git a/web/src/api/profiling.rs b/web/src/api/profiling.rs index fc5258d2..61441b01 100644 --- a/web/src/api/profiling.rs +++ b/web/src/api/profiling.rs @@ -57,28 +57,4 @@ impl ApiClient { }; self.get_request(&path).await } - - /// Distributed SPMD torch flamegraph at one ``local_step`` (cluster fan-out by default). - pub async fn get_distributed_flamegraph_json( - &self, - step: Option, - metric: Option<&str>, - cluster: bool, - ) -> Result { - let mut parts = Vec::new(); - if let Some(s) = step { - parts.push(format!("step={s}")); - } - if let Some(m) = metric { - if !m.is_empty() { - parts.push(format!("metric={}", urlencoding::encode(m))); - } - } - parts.push(format!("cluster={cluster}")); - let path = format!( - "/apis/training/distributed_flamegraph/json?{}", - parts.join("&") - ); - self.get_request(&path).await - } } diff --git a/web/src/api/stack.rs b/web/src/api/stack.rs index ec447def..ef83d623 100644 --- a/web/src/api/stack.rs +++ b/web/src/api/stack.rs @@ -23,4 +23,20 @@ impl ApiClient { let response = self.get_request(&path).await?; Self::parse_json(&response) } + + /// Distributed CPU stack flamegraph (`mode`: `mixed` | `py`). + pub async fn get_distributed_stack_flamegraph_json( + &self, + cluster: bool, + mode: &str, + ) -> Result { + let mode = match mode { + "py" | "mixed" => mode, + _ => "mixed", + }; + let path = format!( + "/apis/training/distributed_stack_flamegraph/json?cluster={cluster}&mode={mode}" + ); + self.get_request(&path).await + } } diff --git a/web/src/app.rs b/web/src/app.rs index cae797ff..8ae64b36 100644 --- a/web/src/app.rs +++ b/web/src/app.rs @@ -11,8 +11,15 @@ use crate::components::app_overlays::AppOverlays; use crate::components::common::LoadingState; use crate::components::layout::AppLayout; use crate::pages::{ - agent::Agent, analytics::Analytics, cluster::Cluster, dashboard::Dashboard, - profiling::Profiling, pulsing::Pulsing, python::Python, stack::Stack, traces::Traces, + agent::Agent, + analytics::Analytics, + cluster::Cluster, + dashboard::Dashboard, + profiling::Profiling, + pulsing::Pulsing, + python::Python, + stack::{Stack, StackDistributed}, + traces::Traces, training::Training, }; use crate::state::profiling::normalize_profiling_view; @@ -29,6 +36,10 @@ pub enum Route { ClusterPage {}, #[route("/stacks")] StackPage {}, + #[route("/stacks/distributed")] + StackDistributedFullPage {}, + #[route("/stacks/distributed/py")] + StackDistributedPyPage {}, #[route("/stacks/:tid")] StackWithTidPage { tid: String }, #[route("/profiling")] @@ -78,6 +89,26 @@ pub fn StackWithTidPage(tid: String) -> Element { rsx! { AppLayout { Stack { tid: Some(tid) } } } } +#[component] +pub fn StackDistributedFullPage() -> Element { + rsx! { + AppLayout { + fullscreen: true, + StackDistributed { mode: "mixed".to_string() } + } + } +} + +#[component] +pub fn StackDistributedPyPage() -> Element { + rsx! { + AppLayout { + fullscreen: true, + StackDistributed { mode: "py".to_string() } + } + } +} + #[component] pub fn ProfilingRedirect() -> Element { let nav = dioxus_router::use_navigator(); @@ -113,6 +144,11 @@ pub fn ChromeTracingRedirect() -> Element { #[component] pub fn ProfilingViewPage(view: String) -> Element { let canonical = normalize_profiling_view(&view).to_string(); + if view == "torch-dist" || canonical == "torch-dist" { + return rsx! { + StackDistributedRedirect {} + }; + } if view != canonical { return rsx! { ProfilingSlugRedirect { target: canonical } @@ -127,6 +163,20 @@ pub fn ProfilingViewPage(view: String) -> Element { } } +#[component] +fn StackDistributedRedirect() -> Element { + let nav = dioxus_router::use_navigator(); + use_effect(move || { + nav.replace(Route::StackDistributedFullPage {}); + }); + rsx! { + AppLayout { + fullscreen: true, + LoadingState { message: Some("Opening distributed stacks…".to_string()) } + } + } +} + #[component] fn ProfilingSlugRedirect(target: String) -> Element { let nav = dioxus_router::use_navigator(); diff --git a/web/src/components/flamegraph/explorer.rs b/web/src/components/flamegraph/explorer.rs index d6cda114..3d3078bc 100644 --- a/web/src/components/flamegraph/explorer.rs +++ b/web/src/components/flamegraph/explorer.rs @@ -108,6 +108,10 @@ pub fn StackExplorerView( .map(|f| (f.name.clone(), f.id)) .collect(); + let selected_ranks = root.as_ref().map(|r| r.ranks.clone()).unwrap_or_default(); + let is_distributed = profile.contains("distributed"); + let rank_count = payload.rank_count; + let reset_view = move |_| { zoom_id.set(root_id); phase_filter.set("all".to_string()); @@ -138,6 +142,13 @@ pub fn StackExplorerView( }), on_metric: on_torch_metric, } + if is_distributed { + RankPartitionPanel { + ranks: selected_ranks, + rank_count, + frame_name: root.as_ref().map(label_for_frame).unwrap_or_default(), + } + } ExplorerBreadcrumbs { ancestor_chain, by_id, @@ -173,6 +184,54 @@ pub fn StackExplorerView( } } +#[component] +fn RankPartitionPanel(ranks: Vec, rank_count: Option, frame_name: String) -> Element { + let ranks_label = if ranks.is_empty() { + "unknown".to_string() + } else { + ranks + .iter() + .map(|r| r.to_string()) + .collect::>() + .join(", ") + }; + let coverage = match rank_count { + Some(n) if n > 0 && !ranks.is_empty() => { + format!(" · {}/{} ranks", ranks.len(), n) + } + _ if !ranks.is_empty() => format!(" · {} ranks", ranks.len()), + _ => String::new(), + }; + let title = if frame_name.is_empty() || frame_name == "all" { + "Selected partition".to_string() + } else { + format!("Selected: {frame_name}") + }; + + rsx! { + div { + class: "px-4 py-2.5 border-b border-slate-200 bg-slate-50 flex flex-wrap items-start gap-2", + div { class: "min-w-0 flex-1", + p { class: "text-[10px] uppercase tracking-wide text-slate-500 mb-1", "{title}" } + p { class: "text-xs text-slate-600", + span { class: "text-slate-500", "Ranks in this fork{coverage}: " } + span { class: "font-mono text-slate-800 font-medium", "{ranks_label}" } + } + } + if !ranks.is_empty() { + div { class: "flex flex-wrap gap-1", + for r in ranks.iter() { + span { + class: "inline-flex items-center px-1.5 py-0.5 rounded text-[11px] font-mono bg-white border border-slate-200 text-slate-700", + "rank {r}" + } + } + } + } + } + } +} + #[component] fn ExplorerToolbar( torch: bool, @@ -349,6 +408,15 @@ fn ExplorerFrameNode( format_pct(frame_value, total), ), ]; + if !frame.ranks.is_empty() { + let ranks = frame + .ranks + .iter() + .map(|r| r.to_string()) + .collect::>() + .join(", "); + lines.push(format!("Ranks: {ranks}")); + } if let Some(path) = &frame.module_path { lines.push(format!("{path_prefix}: {path}")); } diff --git a/web/src/components/flamegraph/model.rs b/web/src/components/flamegraph/model.rs index 6524903e..048bae7a 100644 --- a/web/src/components/flamegraph/model.rs +++ b/web/src/components/flamegraph/model.rs @@ -15,6 +15,9 @@ pub struct FlameFrame { pub phase: Option, #[serde(rename = "modulePath", default)] pub module_path: Option, + /// Training ranks that contributed samples under this frame (distributed only). + #[serde(default)] + pub ranks: Vec, } #[derive(Debug, Clone, PartialEq, Deserialize)] @@ -38,4 +41,7 @@ pub struct FlamegraphPayload { /// as a warning; 0 / absent for profilers that don't report it. #[serde(default)] pub dropped: u64, + /// Number of ranks included in a distributed merge (when present). + #[serde(rename = "rankCount", default)] + pub rank_count: Option, } diff --git a/web/src/components/sidebar/mod.rs b/web/src/components/sidebar/mod.rs index cd2a2998..92ead372 100644 --- a/web/src/components/sidebar/mod.rs +++ b/web/src/components/sidebar/mod.rs @@ -62,7 +62,10 @@ pub fn Sidebar() -> Element { use_effect(move || { if matches!( route_for_stack, - Route::StackPage {} | Route::StackWithTidPage { .. } + Route::StackPage {} + | Route::StackDistributedFullPage {} + | Route::StackDistributedPyPage {} + | Route::StackWithTidPage { .. } ) { *show_stack_dropdown.write() = true; } diff --git a/web/src/components/sidebar/profiling/controls.rs b/web/src/components/sidebar/profiling/controls.rs index 8e569cb6..03a180cf 100644 --- a/web/src/components/sidebar/profiling/controls.rs +++ b/web/src/components/sidebar/profiling/controls.rs @@ -6,8 +6,7 @@ use crate::api::{ApiClient, ProfileResponse}; use crate::components::colors::colors; use crate::hooks::use_api_simple; use crate::state::profiling::{ - show_profiling_feedback, PROFILING_CHROME_LIMIT, PROFILING_DIST_CLUSTER, PROFILING_DIST_RELOAD, - PROFILING_DIST_STEP, PROFILING_PPROF_FREQ, PROFILING_PYTORCH_STEPS, + show_profiling_feedback, PROFILING_CHROME_LIMIT, PROFILING_PPROF_FREQ, PROFILING_PYTORCH_STEPS, PROFILING_PYTORCH_TIMELINE_RELOAD, PROFILING_RAY_TIMELINE_RELOAD, PROFILING_TORCH_ENABLED, PROFILING_TRACE_RELOAD, }; @@ -134,68 +133,6 @@ pub fn TorchControls( } } -#[component] -pub fn TorchDistControls( - control_title_class: String, - control_value_class: String, - input_class: String, -) -> Element { - let step = *PROFILING_DIST_STEP.read(); - let cluster = *PROFILING_DIST_CLUSTER.read(); - let step_label = step - .map(|s| s.to_string()) - .unwrap_or_else(|| "latest".to_string()); - - rsx! { - div { - class: "space-y-3", - div { - class: "space-y-1", - div { class: "{control_title_class}", "Training step" } - input { - class: "{input_class} w-full", - r#type: "number", - min: "0", - placeholder: "latest", - value: step.map(|s| s.to_string()).unwrap_or_default(), - oninput: move |ev| { - let raw = ev.value().trim().to_string(); - if raw.is_empty() { - *PROFILING_DIST_STEP.write() = None; - } else if let Ok(s) = raw.parse::() { - *PROFILING_DIST_STEP.write() = Some(s); - } - }, - } - div { class: "{control_value_class} text-slate-400", "Step: {step_label}" } - } - label { - class: "flex items-center gap-2 cursor-pointer select-none text-xs text-slate-300", - input { - r#type: "checkbox", - checked: cluster, - onchange: move |_| { - *PROFILING_DIST_CLUSTER.write() = !*PROFILING_DIST_CLUSTER.read(); - }, - } - "Cluster fan-out" - } - button { - class: format!( - "w-full px-2 py-1.5 text-xs font-medium rounded bg-{} text-white hover:bg-{}", - colors::PRIMARY, - colors::PRIMARY_HOVER - ), - onclick: move |_| { - *PROFILING_DIST_RELOAD.write() += 1; - show_profiling_feedback("Reloading distributed flamegraph…", false); - }, - "Reload flamegraph" - } - } - } -} - #[component] pub fn TraceTimelineControls( control_title_class: String, diff --git a/web/src/components/sidebar/profiling/mod.rs b/web/src/components/sidebar/profiling/mod.rs index 994b80e0..da7fa914 100644 --- a/web/src/components/sidebar/profiling/mod.rs +++ b/web/src/components/sidebar/profiling/mod.rs @@ -12,7 +12,7 @@ use crate::state::profiling::{normalize_profiling_view, profiling_view_label, PR mod controls; use controls::{ - PprofControls, PyTorchTimelineControls, RayTimelineControls, TorchControls, TorchDistControls, + PprofControls, PyTorchTimelineControls, RayTimelineControls, TorchControls, TraceTimelineControls, }; @@ -20,7 +20,6 @@ fn profiling_view_icon(id: &str) -> &'static IconData { match id { "pprof" => &icondata::CgPerformance, "torch" => &icondata::AiFireOutlined, - "torch-dist" => &icondata::AiClusterOutlined, "trace" => &icondata::AiThunderboltOutlined, "pytorch" => &icondata::SiPytorch, "ray" => &icondata::AiClockCircleOutlined, @@ -140,13 +139,6 @@ fn ProfilingControlsPanel(current_view: String) -> Element { toggle_label_class: toggle_label_class, } }, - "torch-dist" => rsx! { - TorchDistControls { - control_title_class: control_title_class, - control_value_class: control_value_class, - input_class: input_class, - } - }, "trace" => rsx! { TraceTimelineControls { control_title_class: control_title_class, diff --git a/web/src/components/sidebar/stack/mod.rs b/web/src/components/sidebar/stack/mod.rs index 501b4d2f..1d80c66a 100644 --- a/web/src/components/sidebar/stack/mod.rs +++ b/web/src/components/sidebar/stack/mod.rs @@ -7,15 +7,27 @@ use crate::app::Route; use crate::components::colors::colors; use crate::components::icon::Icon; use crate::components::sidebar::nav_item::sidebar_item_class; -use crate::state::stack::{bump_stack_refresh, stack_tid_label, STACK_MODE, STACK_SNAPSHOT}; +use crate::state::stack::{ + bump_stack_refresh, stack_tid_label, STACK_DIST_CLUSTER, STACK_DIST_RELOAD, STACK_MODE, + STACK_SNAPSHOT, +}; use crate::utils::callframe::{mode_for_kind, FrameKind}; #[component] pub fn StackSidebarItem(show_dropdown: Signal) -> Element { let route = use_route::(); - let is_active = matches!(route, Route::StackPage {} | Route::StackWithTidPage { .. }); + let is_active = matches!( + route, + Route::StackPage {} + | Route::StackDistributedFullPage {} + | Route::StackDistributedPyPage {} + | Route::StackWithTidPage { .. } + ); let expanded = *show_dropdown.read(); let on_default = matches!(route, Route::StackPage {}); + let on_dist_full = matches!(route, Route::StackDistributedFullPage {}); + let on_dist_py = matches!(route, Route::StackDistributedPyPage {}); + let on_distributed = on_dist_full || on_dist_py; let tid = match &route { Route::StackWithTidPage { tid } => Some(tid.clone()), _ => None, @@ -32,7 +44,7 @@ pub fn StackSidebarItem(show_dropdown: Signal) -> Element { class: "{button_class}", aria_expanded: if expanded { "true" } else { "false" }, aria_label: "Stacks menu", - title: "Live call stack — expand for filters", + title: "Live call stack and distributed CPU flamegraph", onclick: move |_| { let current = *show_dropdown.read(); *show_dropdown.write() = !current; @@ -50,6 +62,18 @@ pub fn StackSidebarItem(show_dropdown: Signal) -> Element { is_selected: on_default, route: Route::StackPage {}, } + StackSubLink { + label: "Distributed · Full stack", + hint: "Cluster flamegraph · Python + native merged across ranks", + is_selected: on_dist_full, + route: Route::StackDistributedFullPage {}, + } + StackSubLink { + label: "Distributed · Python", + hint: "Cluster flamegraph · Python frames only across ranks", + is_selected: on_dist_py, + route: Route::StackDistributedPyPage {}, + } if let Some(tid) = tid { StackSubLink { label: format!("tid {tid}"), @@ -59,7 +83,11 @@ pub fn StackSidebarItem(show_dropdown: Signal) -> Element { } } if is_active { - StackControlsPanel {} + if on_distributed { + StackDistributedControlsPanel {} + } else { + StackControlsPanel {} + } } } } @@ -149,6 +177,54 @@ fn StackControlsPanel() -> Element { } } +#[component] +fn StackDistributedControlsPanel() -> Element { + let cluster = *STACK_DIST_CLUSTER.read(); + let panel_border = colors::SIDEBAR_PANEL_BORDER; + let title_class = colors::SIDEBAR_CONTROL_TITLE; + + rsx! { + div { + class: "{panel_border}", + div { + class: "px-1 space-y-3", + p { + class: "text-[10px] uppercase tracking-wide text-slate-500", + "Distributed flamegraph" + } + p { + class: "text-[11px] text-slate-400 leading-snug", + "Merge main-thread stacks from all ranks. Requires SIGPROF sampling (Profiling → CPU) for accumulated samples." + } + label { + class: "flex items-center gap-2 cursor-pointer select-none text-xs text-slate-300", + input { + r#type: "checkbox", + checked: cluster, + onchange: move |_| { + *STACK_DIST_CLUSTER.write() = !*STACK_DIST_CLUSTER.read(); + }, + } + "Cluster fan-out" + } + button { + r#type: "button", + class: format!( + "w-full px-2 py-1.5 text-xs font-medium rounded bg-{} text-white hover:bg-{}", + colors::PRIMARY, + colors::PRIMARY_HOVER + ), + onclick: move |_| { + *STACK_DIST_RELOAD.write() += 1; + }, + "Reload flamegraph" + } + p { class: "{title_class} text-[10px] text-slate-500", "Pprof frequency lives under Profiling → CPU (pprof)." } + } + } + } +} + #[component] fn FilterChip(filter: &'static str, label: &'static str, active: bool) -> Element { let class = if active { diff --git a/web/src/pages/profiling.rs b/web/src/pages/profiling.rs index 640a23e1..bf42ea0d 100644 --- a/web/src/pages/profiling.rs +++ b/web/src/pages/profiling.rs @@ -17,9 +17,8 @@ use crate::state::investigation::{ }; use crate::state::profiling::{ apply_profiler_config, normalize_profiling_view, profiling_view_spec, PROFILING_CHROME_LIMIT, - PROFILING_CONFIG_LOADED, PROFILING_DIST_CLUSTER, PROFILING_DIST_RELOAD, PROFILING_DIST_STEP, - PROFILING_PPROF_FREQ, PROFILING_PYTORCH_TIMELINE_RELOAD, PROFILING_RAY_TIMELINE_RELOAD, - PROFILING_TORCH_ENABLED, PROFILING_TRACE_RELOAD, + PROFILING_CONFIG_LOADED, PROFILING_PPROF_FREQ, PROFILING_PYTORCH_TIMELINE_RELOAD, + PROFILING_RAY_TIMELINE_RELOAD, PROFILING_TORCH_ENABLED, PROFILING_TRACE_RELOAD, }; #[component] @@ -54,7 +53,7 @@ pub fn Profiling(view: String) -> Element { fn view_icon(view: &str) -> &'static icondata::Icon { match view { "pprof" => &icondata::CgPerformance, - "torch" | "torch-dist" => &icondata::SiPytorch, + "torch" => &icondata::SiPytorch, "trace" => &icondata::AiThunderboltOutlined, "pytorch" => &icondata::SiPytorch, "ray" => &icondata::AiClockCircleOutlined, @@ -66,9 +65,6 @@ fn view_subtitle(view: &str) -> String { match view { "pprof" => "SIGPROF stack explorer · statistical sampling".to_string(), "torch" => "Module flamegraph from TorchProbe hooks".to_string(), - "torch-dist" => { - "SPMD flamegraph — one training step, all ranks (merge identical stacks)".to_string() - } "trace" => "Chrome trace events from probing buffers — not distributed spans".to_string(), "pytorch" => "PyTorch profiler chrome trace".to_string(), "ray" => "Ray task timeline".to_string(), @@ -99,12 +95,6 @@ fn ProfilerConfigGate(view: String) -> Element { FlamegraphLoader { key: "{view}", view: view.clone() } } }, - "torch-dist" => rsx! { - AsyncBoundary { - message: Some("Loading distributed flamegraph…".to_string()), - DistributedFlamegraphLoader { key: "{view}", view: view.clone() } - } - }, "trace" => rsx! { AsyncBoundary { message: Some("Loading trace data…".to_string()), @@ -238,79 +228,6 @@ fn FlamegraphData(profiler_name: String) -> Element { } } -#[component] -fn DistributedFlamegraphLoader(view: String) -> Element { - let _ = view; - let torch_enabled = *PROFILING_TORCH_ENABLED.read(); - if !torch_enabled { - return rsx! { - ProfilerDisabledNotice { profiler_name: "torch" } - }; - } - - let reload = *PROFILING_DIST_RELOAD.read(); - let step = *PROFILING_DIST_STEP.read(); - let cluster = *PROFILING_DIST_CLUSTER.read(); - - rsx! { - AsyncBoundary { - message: Some("Loading distributed flamegraph…".to_string()), - DistributedFlamegraphData { - key: "torch-dist-{reload}-{step:?}-{cluster}", - step, - cluster, - } - } - } -} - -#[component] -fn DistributedFlamegraphData(step: Option, cluster: bool) -> Element { - let mut metric = use_signal(|| "duration".to_string()); - let fetch_step = step; - let fetch_cluster = cluster; - - let payload = use_app_resource(move || { - let m = metric(); - async move { - let client = ApiClient::new(); - let body = client - .get_distributed_flamegraph_json(fetch_step, Some(&m), fetch_cluster) - .await?; - let parsed: FlamegraphPayload = serde_json::from_str(&body).map_err(|e| { - crate::utils::error::AppError::Api(format!("Invalid flamegraph JSON: {e}")) - })?; - Ok(parsed) - } - }); - - match payload.suspend()?() { - Ok(data) => rsx! { - div { class: "flex flex-col flex-1 min-h-0 min-w-0", - ProfileSnapshotBar { - key: "torch-dist-{metric()}", - profiler: "torch-dist".to_string(), - metric: Some(metric()), - payload: data.clone(), - } - FlamegraphView { - key: "torch-dist-{metric()}", - payload: data, - thread_tid: None, - torch_metric: Some(metric), - on_torch_metric: Some(EventHandler::new(move |m: String| metric.set(m))), - } - } - }, - Err(err) => rsx! { - ProfilingErrorPanel { - title: "Distributed Flamegraph Error".to_string(), - error: err.display_message(), - } - }, - } -} - #[component] fn PytorchTimelineLoader() -> Element { let reload_key = *PROFILING_PYTORCH_TIMELINE_RELOAD.read(); diff --git a/web/src/pages/stack.rs b/web/src/pages/stack.rs index de8510ba..44fb222e 100644 --- a/web/src/pages/stack.rs +++ b/web/src/pages/stack.rs @@ -1,13 +1,18 @@ use dioxus::prelude::*; +use dioxus_router::Link; use probing_proto::prelude::CallFrame; use crate::api::ApiClient; +use crate::app::Route; use crate::components::callstack_view::CallStackView; use crate::components::common::{AsyncBoundary, EmptyState, ErrorState}; +use crate::components::flamegraph::{FlamegraphPayload, FlamegraphView}; use crate::components::page::{PageContainer, PageTitle}; +use crate::components::profiling::{ProfilingContentPanel, ProfilingErrorPanel}; use crate::hooks::use_app_resource; use crate::state::stack::{ - stack_tid_label, StackSnapshot, STACK_MODE, STACK_REFRESH, STACK_SNAPSHOT, + stack_tid_label, StackSnapshot, STACK_DIST_CLUSTER, STACK_DIST_RELOAD, STACK_MODE, + STACK_REFRESH, STACK_SNAPSHOT, }; use crate::utils::callframe::{count_by_kind, matches_mode}; use crate::utils::error::AppError; @@ -159,3 +164,100 @@ fn mode_label(mode: &str) -> &'static str { _ => "All", } } + +/// Distributed stack flamegraph — merge identical stacks across ranks. +#[component] +pub fn StackDistributed(mode: String) -> Element { + let reload = *STACK_DIST_RELOAD.read(); + let cluster = *STACK_DIST_CLUSTER.read(); + let api_mode = if mode == "py" { "py" } else { "mixed" }; + let on_full = api_mode == "mixed"; + let subtitle = if api_mode == "py" { + "Distributed flamegraph · Python frames merged across ranks".to_string() + } else { + "Distributed flamegraph · full mixed stack merged across ranks".to_string() + }; + + rsx! { + PageContainer { + PageTitle { + title: "Distributed flamegraph".to_string(), + subtitle: Some(subtitle), + icon: Some(&icondata::AiClusterOutlined), + } + div { class: "flex flex-col flex-1 min-h-0 min-w-0 gap-3", + div { + class: "flex gap-1 border-b border-slate-700/80", + DistViewTab { + label: "Full stack", + active: on_full, + route: Route::StackDistributedFullPage {}, + } + DistViewTab { + label: "Python only", + active: !on_full, + route: Route::StackDistributedPyPage {}, + } + } + ProfilingContentPanel { + AsyncBoundary { + message: Some("Loading distributed flamegraph…".to_string()), + StackDistributedFlamegraph { + key: "stack-dist-{reload}-{cluster}-{api_mode}", + cluster, + mode: api_mode.to_string(), + } + } + } + } + } + } +} + +#[component] +fn DistViewTab(label: &'static str, active: bool, route: Route) -> Element { + let class = if active { + "px-3 py-2 text-sm font-medium border-b-2 border-blue-500 text-blue-200 -mb-px" + } else { + "px-3 py-2 text-sm text-slate-400 hover:text-slate-200 border-b-2 border-transparent -mb-px" + }; + rsx! { + Link { + to: route, + class: "{class}", + "{label}" + } + } +} + +#[component] +fn StackDistributedFlamegraph(cluster: bool, mode: String) -> Element { + let payload = use_app_resource(move || { + let mode = mode.clone(); + async move { + let body = ApiClient::new() + .get_distributed_stack_flamegraph_json(cluster, &mode) + .await?; + let parsed: FlamegraphPayload = serde_json::from_str(&body) + .map_err(|e| AppError::Api(format!("Invalid flamegraph JSON: {e}")))?; + Ok(parsed) + } + }); + + match payload.suspend()?() { + Ok(data) => rsx! { + FlamegraphView { + payload: data, + thread_tid: None, + torch_metric: None, + on_torch_metric: None, + } + }, + Err(err) => rsx! { + ProfilingErrorPanel { + title: "Distributed stack flamegraph".to_string(), + error: err.display_message(), + } + }, + } +} diff --git a/web/src/state/profiling.rs b/web/src/state/profiling.rs index 16f34cfb..7f10680c 100644 --- a/web/src/state/profiling.rs +++ b/web/src/state/profiling.rs @@ -12,7 +12,6 @@ pub fn normalize_profiling_view(view: &str) -> &'static str { match view { "" | "pprof" => "pprof", "torch" => "torch", - "torch-dist" | "distributed-torch" | "torch-distributed" => "torch-dist", "trace" | "trace-timeline" => "trace", "pytorch" | "pytorch-timeline" => "pytorch", "ray" | "ray-timeline" => "ray", @@ -55,10 +54,6 @@ pub static PROFILING_PYTORCH_STEPS: GlobalSignal = Signal::global(|| 5); pub static PROFILING_PYTORCH_TIMELINE_RELOAD: GlobalSignal = Signal::global(|| 0); pub static PROFILING_RAY_TIMELINE_RELOAD: GlobalSignal = Signal::global(|| 0); pub static PROFILING_TRACE_RELOAD: GlobalSignal = Signal::global(|| 0); -/// Optional ``local_step`` for distributed torch flamegraph (``None`` = latest on server). -pub static PROFILING_DIST_STEP: GlobalSignal> = Signal::global(|| None); -pub static PROFILING_DIST_CLUSTER: GlobalSignal = Signal::global(|| true); -pub static PROFILING_DIST_RELOAD: GlobalSignal = Signal::global(|| 0); #[derive(Clone, Debug, PartialEq)] pub struct ProfilingFeedback { @@ -106,12 +101,6 @@ pub const PROFILING_VIEWS: &[ProfilingViewSpec] = &[ sidebar_label: "Torch flamegraph", tooltip: "PyTorch module hook durations · statistical flamegraph (not the profiler timeline)", }, - ProfilingViewSpec { - id: "torch-dist", - label: "Distributed torch", - sidebar_label: "Distributed flamegraph", - tooltip: "SPMD snapshot at one training step — merge identical module stacks across ranks", - }, ProfilingViewSpec { id: "trace", label: "Chrome trace", diff --git a/web/src/state/stack.rs b/web/src/state/stack.rs index 0859da6a..14a0f8b4 100644 --- a/web/src/state/stack.rs +++ b/web/src/state/stack.rs @@ -15,6 +15,8 @@ pub struct StackSnapshot { pub static STACK_MODE: GlobalSignal = Signal::global(|| String::from("mixed")); pub static STACK_REFRESH: GlobalSignal = Signal::global(|| 0); +pub static STACK_DIST_CLUSTER: GlobalSignal = Signal::global(|| true); +pub static STACK_DIST_RELOAD: GlobalSignal = Signal::global(|| 0); pub static STACK_SNAPSHOT: GlobalSignal = Signal::global(StackSnapshot::default); pub fn stack_tid_label(tid: Option<&str>) -> String { From a7cb35ae12a9864e287e68749915c711e39fd01e Mon Sep 17 00:00:00 2001 From: Reiase Date: Sun, 19 Jul 2026 00:59:45 +0800 Subject: [PATCH 19/37] Refactor profiling documentation and enhance stack capture features (#70) * Refactor profiling documentation and update stack capture features - Enhanced the profiling documentation in both English and Chinese, providing clearer guidance on stack capture mechanisms and the TorchProfiler. - Introduced a new directory structure under `probing/extensions/python/src/features/` to better organize stack capture and profiling modules. - Updated the `setup.rs` and `pprof.rs` files to reflect changes in the stack capture pipeline, ensuring proper integration with the new structure. - Removed deprecated modules and functions related to stack tracing, streamlining the codebase and improving maintainability. These changes aim to improve the clarity and usability of the profiling features, facilitating better user understanding and adoption. * update tracer * Refactor stacktrace capture and logging for improved readability - Reformatted code in `capture.rs` to enhance clarity by aligning tuple returns and simplifying function signatures. - Updated logging in `dynamic.rs` to streamline debug messages for concurrent stack captures. - Adjusted formatting in `pprof.rs` to improve readability of flag manipulations. These changes aim to enhance code maintainability and improve the overall readability of the stacktrace features. * Enhance safety documentation for stacktrace capture functions - Added safety documentation comments to `fill_raw_snapshot_with` and `capture_raw_snapshot` functions, clarifying the requirements for `uctx` and `out` parameters. - Improved code clarity by ensuring that safety considerations are explicitly stated, aiding developers in understanding the usage constraints of these functions. These changes aim to enhance the safety and usability of the stacktrace capture features. --- AGENTS.md | 2 +- docs/src/api-reference.md | 2 + docs/src/api-reference.zh.md | 2 + docs/src/design/profiling.md | 47 +- docs/src/design/profiling.zh.md | 45 +- .../extensions/python/src/extensions/pprof.rs | 14 +- .../python/src/extensions/python.rs | 2 +- .../python/src/extensions/python/exttbls.rs | 4 +- .../python/src/extensions/python/tbls.rs | 2 +- .../python/src/features/crash/grace.rs | 40 +- .../python/src/features/crash/handler.rs | 2 +- .../python/src/features/crash/mod.rs | 3 + .../python/src/features/crash/report.rs | 10 + .../python/src/features/crash/signal.rs | 57 +- .../src/features/flamegraph/distributed.rs | 108 ++ .../{flamegraph.rs => flamegraph/mod.rs} | 218 +-- probing/extensions/python/src/features/mod.rs | 44 +- .../python/src/features/native_bridge.rs | 17 - .../extensions/python/src/features/pprof.rs | 679 ---------- .../python/src/features/py_result.rs | 7 - .../{config.rs => python/bindings.rs} | 86 +- .../features/{convert.rs => python/bridge.rs} | 43 +- .../python/src/features/python/mod.rs | 11 + .../src/features/{ => python}/tracing.rs | 2 +- .../python/src/features/python_api.rs | 79 -- .../python/src/features/stack_tracer.rs | 183 --- .../capture.rs} | 553 +++++--- .../python/src/features/stacktrace/compact.rs | 87 ++ .../src/features/stacktrace/fingerprint.rs | 101 ++ .../python/src/features/stacktrace/fold.rs | 342 +++++ .../{stack_merge.rs => stacktrace/merge.rs} | 97 +- .../python/src/features/stacktrace/metrics.rs | 151 +++ .../python/src/features/stacktrace/mod.rs | 48 + .../python/src/features/stacktrace/parse.rs | 246 ++++ .../src/features/stacktrace/snapshot.rs | 149 +++ .../features/{ => stacktrace}/spy/README.md | 0 .../src/features/{ => stacktrace}/spy/call.rs | 10 +- .../src/features/{ => stacktrace}/spy/ffi.rs | 0 .../src/features/{ => stacktrace}/spy/mod.rs | 18 +- .../spy/python_bindings/mod.rs | 0 .../spy/python_bindings/v2_7_15.rs | 0 .../spy/python_bindings/v3_10_0.rs | 0 .../spy/python_bindings/v3_11_0.rs | 0 .../spy/python_bindings/v3_12_0.rs | 0 .../spy/python_bindings/v3_13_0.rs | 0 .../spy/python_bindings/v3_3_7.rs | 0 .../spy/python_bindings/v3_4_8.rs | 0 .../spy/python_bindings/v3_5_5.rs | 0 .../spy/python_bindings/v3_6_6.rs | 0 .../spy/python_bindings/v3_7_0.rs | 0 .../spy/python_bindings/v3_8_0.rs | 0 .../spy/python_bindings/v3_9_5.rs | 0 .../spy/python_bindings/version.rs | 0 .../spy/python_interpreters.rs | 0 .../features/stacktrace/tracers/dynamic.rs | 261 ++++ .../src/features/stacktrace/tracers/mod.rs | 13 + .../src/features/stacktrace/tracers/pprof.rs | 1180 +++++++++++++++++ .../tracers/vm.rs} | 54 +- .../src/features/{torch.rs => torch/mod.rs} | 5 + probing/extensions/python/src/setup.rs | 2 +- probing/server/src/server/training.rs | 4 +- src/lib.rs | 18 +- tests/regression/rust/Cargo.toml | 4 + .../probing/python/stacktrace_signal_tests.rs | 31 + 64 files changed, 3679 insertions(+), 1404 deletions(-) create mode 100644 probing/extensions/python/src/features/flamegraph/distributed.rs rename probing/extensions/python/src/features/{flamegraph.rs => flamegraph/mod.rs} (87%) delete mode 100644 probing/extensions/python/src/features/native_bridge.rs delete mode 100644 probing/extensions/python/src/features/pprof.rs delete mode 100644 probing/extensions/python/src/features/py_result.rs rename probing/extensions/python/src/features/{config.rs => python/bindings.rs} (59%) rename probing/extensions/python/src/features/{convert.rs => python/bridge.rs} (65%) create mode 100644 probing/extensions/python/src/features/python/mod.rs rename probing/extensions/python/src/features/{ => python}/tracing.rs (99%) delete mode 100644 probing/extensions/python/src/features/python_api.rs delete mode 100644 probing/extensions/python/src/features/stack_tracer.rs rename probing/extensions/python/src/features/{stack_capture.rs => stacktrace/capture.rs} (55%) create mode 100644 probing/extensions/python/src/features/stacktrace/compact.rs create mode 100644 probing/extensions/python/src/features/stacktrace/fingerprint.rs create mode 100644 probing/extensions/python/src/features/stacktrace/fold.rs rename probing/extensions/python/src/features/{stack_merge.rs => stacktrace/merge.rs} (74%) create mode 100644 probing/extensions/python/src/features/stacktrace/metrics.rs create mode 100644 probing/extensions/python/src/features/stacktrace/mod.rs create mode 100644 probing/extensions/python/src/features/stacktrace/parse.rs create mode 100644 probing/extensions/python/src/features/stacktrace/snapshot.rs rename probing/extensions/python/src/features/{ => stacktrace}/spy/README.md (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/call.rs (97%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/ffi.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/mod.rs (85%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/mod.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v2_7_15.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_10_0.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_11_0.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_12_0.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_13_0.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_3_7.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_4_8.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_5_5.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_6_6.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_7_0.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_8_0.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/v3_9_5.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_bindings/version.rs (100%) rename probing/extensions/python/src/features/{ => stacktrace}/spy/python_interpreters.rs (100%) create mode 100644 probing/extensions/python/src/features/stacktrace/tracers/dynamic.rs create mode 100644 probing/extensions/python/src/features/stacktrace/tracers/mod.rs create mode 100644 probing/extensions/python/src/features/stacktrace/tracers/pprof.rs rename probing/extensions/python/src/features/{vm_tracer.rs => stacktrace/tracers/vm.rs} (81%) rename probing/extensions/python/src/features/{torch.rs => torch/mod.rs} (99%) create mode 100644 tests/regression/rust/probing/python/stacktrace_signal_tests.rs diff --git a/AGENTS.md b/AGENTS.md index 844e33c1..41f6735f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -175,7 +175,7 @@ Keep the propagation chain clean — don't reintroduce scattered `map_err`/`insp - **One error type per crate.** `probing/core` funnels everything into `EngineError` (`probing/core/src/core/error.rs`); app layers (`server`, `cli`) use `anyhow`. Prefer `?` with `#[from]`/`#[source]`; never add `From`, and don't `map_err` an error into a flat string (it drops the cause chain). Attach context with `anyhow::Context` (`.context` / `.with_context`). - **One boundary conversion.** `EngineError → DataFusionError` lives in a single `From` impl; DataFusion trait impls just use `?` instead of hand-rolling `DataFusionError::Execution(format!(...))`. - **`block_on` never fabricates data.** `probing_core::runtime::block_on` returns `Result` — on a degraded async bridge it returns `Err`, not an empty/`default` value. Surface it; for a diagnostics tool, a silent "no data" is worse than a clear failure. -- **No `unwrap`/`expect`/`panic!` on production paths.** Propagate with `?`. Exempt: tests and vendored py-spy bindings under `probing/extensions/python/src/features/spy/python_bindings/`. +- **No `unwrap`/`expect`/`panic!` on production paths.** Propagate with `?`. Exempt: tests and vendored py-spy bindings under `probing/extensions/python/src/features/stacktrace/spy/python_bindings/`. - **Never pollute the host process's stdout.** Use `log` (Rust) / `logging` (Python), not `print!`/`println!`. Expected contention/busy states (e.g. a concurrent stack-trace request) belong at `debug`, not `error`. ## Skills diff --git a/docs/src/api-reference.md b/docs/src/api-reference.md index c3f8dda3..525324c1 100644 --- a/docs/src/api-reference.md +++ b/docs/src/api-reference.md @@ -215,6 +215,8 @@ There is **no** `probing.sample_rate` key. Torch sampling is controlled via `pro | `PROBING_PORT` | TCP listen port for remote CLI | | `PROBING_TORCH_PROFILING` | TorchProbe spec (mirrors `probing.torch.profiling`) | | `PROBING_PPROF_SAMPLE_FREQ` | CPU pprof Hz | +| `PROBING_PPROF_SIGPROF` | macOS: force `ITIMER_PROF`/`SIGPROF` (default is eval-frame cooperative; may `SIGILL`) | +| `PROBING_PPROF_COOPERATIVE` | Force cooperative sampling everywhere (disable async SIGPROF) | | `PROBING_AUTH_TOKEN` | HTTP auth token | | `PROBING_ROLE_` | Custom parallel dimension for `role` derivation | diff --git a/docs/src/api-reference.zh.md b/docs/src/api-reference.zh.md index 57deba94..d6224d44 100644 --- a/docs/src/api-reference.zh.md +++ b/docs/src/api-reference.zh.md @@ -214,6 +214,8 @@ probing -t $ENDPOINT config probing.torch.profiling=0.1 | `PROBING_PORT` | 远程 CLI 的 TCP 端口 | | `PROBING_TORCH_PROFILING` | TorchProbe 规格 | | `PROBING_PPROF_SAMPLE_FREQ` | CPU pprof Hz | +| `PROBING_PPROF_SIGPROF` | macOS:强制 `ITIMER_PROF`/`SIGPROF`(默认改用 eval-frame 协作采样;易触发 `SIGILL`) | +| `PROBING_PPROF_COOPERATIVE` | 强制全平台协作采样(关闭异步 SIGPROF) | | `PROBING_AUTH_TOKEN` | HTTP 认证令牌 | | `PROBING_ROLE_` | 自定义并行维度,参与 `role` 推导 | diff --git a/docs/src/design/profiling.md b/docs/src/design/profiling.md index c7b945bd..4ccf00e8 100644 --- a/docs/src/design/profiling.md +++ b/docs/src/design/profiling.md @@ -155,15 +155,44 @@ Profiling starts on the first `optimizer.step()` after torch is imported (optimi ### Backtrace Collection -On-demand stack capture and CPU sampling (`SIGPROF`, `probing.pprof.sample_freq`) share one stack pipeline: - -- **Python frames:** eval-frame hook (`vm_tracer` / `PYSTACKS`) is the sole source; symbols are interned under the GIL (full path for source view, basename in flamegraph labels); signal handlers copy pointer keys only. -- **Native frames:** `SIGPROF` and cross-thread `SIGUSR2` use the same safe handler—frame-pointer walk + POD snapshot in-signal; symbolization and Python/native merge run off-signal (best-effort, no errors propagated upward). -- **Merge:** `stack_merge` splices Python frames at CPython eval boundaries (leaf-aligned). -- **Reuse:** when `SIGPROF` sampling is active, the main-thread HTTP/flamegraph path reuses the latest per-thread SIGPROF snapshot when available. -- **Main-thread HTTP path:** does not deliver `SIGUSR2` (avoids interrupting the training main thread); without SIGPROF it falls back to a synchronous `PYSTACKS` read (Python-heavy, one-shot). Cross-thread on-demand capture still uses `SIGUSR2` (dedicated to stack capture; crash grace release is HTTP-only). - -TorchProbe module hooks are independent. The distributed flamegraph (`GET /apis/training/distributed_flamegraph/json`) currently aggregates `python.torch_trace`; cross-rank CPU mixed-mode flamegraphs should prefer the unified SIGPROF data source (cluster fan-out of folded stacks) rather than per-path merge logic. +Feature layout under `probing/extensions/python/src/features/`: + +| Dir | Role | +|-----|------| +| `python/` | PyO3: `bridge` / `bindings` / `tracing` | +| `stacktrace/` | Stack capture, merge, tracers | +| `torch/` | Module profiling (`python.torch_trace`) | +| `flamegraph/` | Shared flamegraph render + distributed folded merge | +| `crash/` | Fatal-signal backtrace | + +`stacktrace/` pipeline: `StackSnapshot` → `ParsedStacks` → `FoldedStacks`. + +| Module | Role | +|--------|------| +| `snapshot` | Capture document + `StackSource` / flags (only signal-writable form) | +| `compact` | Heap-sized sampler bucket payload (used frame lengths only) | +| `fingerprint` | Aggregation key = `tid` + flags + PCs + py keys (no demangle); pprof also filters to main tid | +| `parse` | Snapshot → CallFrames (multi-slot `(tid,seq)` FIFO view cache) | +| `fold` | Parsed/Snapshot → flamegraph / distributed aggregation | +| `metrics` | JSON groups `sampler` (drop / fingerprint / export-fold) vs `view` (parse / cache) | +| `merge` | Python ⊕ native splice + canonicalize | +| `capture` | Thread registry, intern, signal fill (does not own parse/fold) | +| `spy` | CPython ABI / TLS (py-spy-derived) | +| `tracers/vm` | Eval-frame hook (sole Python frame source) | +| `tracers/pprof` | `SIGPROF` sampling (SQL / continuous profiling) | +| `tracers/dynamic` | `SIGUSR2` + command/HTTP on-demand (always via parse) | + +On-demand and CPU sampling share one pipeline: + +- **Python frames:** only from the **vm tracer** (`PYSTACKS`); symbols are interned under the GIL (full path for source view, basename in flamegraph labels); signal handlers copy pointer keys only. +- **Native frames (Linux):** `SIGPROF` / `SIGUSR2` fill a POD via `fill_raw_snapshot` on a per-thread `SA_ONSTACK` alt stack (in-place into the ring / slot). **macOS:** async `ITIMER_PROF` into Apple libc SIMD (`_platform_strlen`) has caused fixed-PC `SIGILL`; `sample_freq` defaults to rate-limited eval-frame cooperative capture of **`PYSTACKS` only** (no mid-hook SyncWalk — that used to paste `_PyInit__core` / vectorcall under every `[py]` frame). `PROBING_PPROF_SIGPROF=1` forces async SIGPROF. Merge drops CPython call-protocol / extension `PyInit_*` noise. Symbolize/merge run off-signal. +- **metrics JSON:** `sampler.*` (ring drop / fingerprint / fold-on-**export**) vs `view.*` (parse / `(tid,seq)` cache)—do not read a burst of export `parse_calls` as per-sample demangle cost. +- **Fetch paths:** dynamic (command/HTTP) or pprof (SQL / `sample_freq`); both read Python frames recorded by the vm tracer. +- **Reuse:** when sampling is active, the main-thread HTTP/flamegraph path reuses the latest per-thread snapshot when available. +- **Main-thread HTTP path:** prefer the latest mixed snapshot; **never `SIGUSR2` the main tid while `sample_freq` is active** (Distributed included). Only when sampling is off may `PROBING_STACK_SIGUSR2_MAIN=1` enable on-demand signal; otherwise fall back to bare `PYSTACKS`. Cross-thread on-demand still uses `SIGUSR2`. +- **Distributed flamegraph:** with sampling on, export only aggregated sampler buckets per rank (empty buckets → empty graph; no on-demand fallback). + +TorchProbe module hooks are independent. Distributed CPU mixed-mode flamegraphs: `GET /apis/training/distributed_stack_flamegraph/json` (Web: **Stacks → Distributed**). Legacy torch module API `/apis/training/distributed_flamegraph/json` remains. ## System Metrics diff --git a/docs/src/design/profiling.zh.md b/docs/src/design/profiling.zh.md index 61b57fbe..33e9360c 100644 --- a/docs/src/design/profiling.zh.md +++ b/docs/src/design/profiling.zh.md @@ -157,14 +157,43 @@ configure("on,rate=0.5,layer_rate=0.3") ## Python 堆栈分析 -按需栈采集与 CPU 采样(`SIGPROF`,`probing.pprof.sample_freq`)共用同一套基础设施: - -- **Python 帧**:eval-frame hook(`vm_tracer` / `PYSTACKS`)是唯一数据源;符号在 GIL 下 intern(保留完整路径供源码查看,火焰图展示 basename),signal 路径只拷贝指针。 -- **C++ 帧**:`SIGPROF` 与跨线程 `SIGUSR2` 使用相同的安全 handler——仅在 signal 内做 frame-pointer walk + 拷贝 POD 快照;symbolize 与 Python/native 合并在 signal 外完成(尽力而为,不向上抛错)。 -- **合并**:`stack_merge` 在 eval 帧边界将 Python 帧拼入 native 塔(leaf 对齐)。 -- **复用**:`SIGPROF` 开启时,主线程 HTTP/火焰图路径优先复用该线程最近一次 SIGPROF 快照,避免重复 signal。 -- **主线程 HTTP 路径**:不发 `SIGUSR2`(避免中断训练主线程);无 SIGPROF 时回退为同步读取 `PYSTACKS`(Python 帧为主,单次快照)。跨线程按需采集仍使用 `SIGUSR2`(与 crash grace 分离,grace release 仅 HTTP)。 -- **分布式火焰图**:跨 rank merge 后每个 frame 携带 `ranks`(该分区下贡献样本的 training rank);Web 点选/缩放某个分叉时展示这些 rank。 +`probing/extensions/python/src/features/` 按关注点分组: + +| 目录 | 职责 | +|------|------| +| `python/` | PyO3:`bridge` / `bindings` / `tracing` | +| `stacktrace/` | 堆栈捕获、merge、tracers | +| `torch/` | 模块级 profiling(`python.torch_trace`) | +| `flamegraph/` | 共享火焰图渲染 + 分布式 folded merge | +| `crash/` | 致命信号回溯 | + +`stacktrace/` 数据管线:`StackSnapshot` → `ParsedStacks` → `FoldedStacks`。 + +| 模块 | 职责 | +|------|------| +| `snapshot` | 采集单据 + `StackSource` / flags(信号路径唯一可写) | +| `compact` | 采样桶堆上紧凑 payload(按实际帧长,避免整份 POD) | +| `fingerprint` | 聚合键 = `tid` + flags + PCs + py keys(不 demangle);pprof 另过滤仅主线程 | +| `parse` | Snapshot → CallFrame(`(tid,seq)` 多槽 FIFO 视图缓存) | +| `fold` | Parsed/Snapshot → 火焰图 / 分布式聚合 | +| `metrics` | JSON 分 `sampler`(drop / fingerprint / export-fold)与 `view`(parse / cache) | +| `merge` | Python ⊕ native splice + canonicalize | +| `capture` | 线程注册、intern、信号 fill(不拥有 parse/fold) | +| `spy` | CPython ABI / TLS(py-spy 衍生) | +| `tracers/vm` | 解释器 eval-frame 钩子(Python 帧唯一来源) | +| `tracers/pprof` | `SIGPROF` 采样(SQL / 连续 profiling) | +| `tracers/dynamic` | `SIGUSR2` + 命令/HTTP 按需采集(一律走 parse) | + +按需栈与 CPU 采样共用同一套基础设施: + +- **Python 帧**:仅来自 **vm tracer**(`PYSTACKS`);符号在 GIL 下 intern(完整路径供源码查看,火焰图展示 basename),signal 路径只拷贝指针。 +- **C++/Rust 帧**:Linux 上 `SIGPROF` / `SIGUSR2` 共用 `SA_ONSTACK` 安全 handler(每 Python 线程 `sigaltstack`,原地 `fill_raw_snapshot`)。**macOS 默认不用 `ITIMER_PROF`**:异步 SIGPROF 打进 `_platform_strlen` 等 SIMD 例程后会固定 PC `SIGILL`;`sample_freq` 改为 eval-frame 节流协作采样(**只记 `PYSTACKS`,不做 mid-hook SyncWalk**,避免 `_PyInit__core` / vectorcall 把分布式火焰图打散;`PROBING_PPROF_SIGPROF=1` 可强制异步)。merge 丢弃 CPython call-protocol / 扩展 `PyInit_*` 噪声。symbolize / merge 在 signal 外完成。 +- **metrics JSON**:`sampler.*`(ring drop / fingerprint / **导出时** fold)与 `view.*`(parse / `(tid,seq)` cache)分栏;不要把导出批次的 `parse_calls` 读成「每样本都在 demangle」。 +- **获取路径**:dynamic(命令/HTTP)或 pprof(SQL/`sample_freq`);二者取 Python 信息时都读 vm tracer 已记录的帧。 +- **复用**:采样开启时,主线程 HTTP/火焰图优先复用该线程最近一次采样快照。 +- **主线程 HTTP 路径**:优先复用最新采样混合快照;**`sample_freq` 开启时禁止对主线程 `SIGUSR2`**(含 Distributed);仅在采样关闭时可经 `PROBING_STACK_SIGUSR2_MAIN=1` 按需信号,否则回退纯 `PYSTACKS`。跨线程按需仍可走 `SIGUSR2`。 +- **分布式火焰图**:`sample_freq` 开启后只聚合各 rank 采样桶(为空则空图,不回退 on-demand);跨 rank merge 后每个 frame 携带 `ranks`。 +- **canonicalize**:剥 `_Py_RunMain` / importlib / `platform.py` 等 bootstrap;SIGPROF 仅统计已注册 Python 主线程样本。 TorchProbe 模块钩子与上述栈采集相互独立。分布式 CPU 混合栈火焰图见 `GET /apis/training/distributed_stack_flamegraph/json`(Web:**Stacks → Distributed**)。旧版 torch 模块级 API `/apis/training/distributed_flamegraph/json` 仍保留。 diff --git a/probing/extensions/python/src/extensions/pprof.rs b/probing/extensions/python/src/extensions/pprof.rs index 43086906..62e18a08 100644 --- a/probing/extensions/python/src/extensions/pprof.rs +++ b/probing/extensions/python/src/extensions/pprof.rs @@ -23,12 +23,14 @@ impl ProbeExtensionCall for PprofProbeExtension { _body: &[u8], ) -> Result, EngineError> { match path.trim_start_matches('/') { - "flamegraph" => crate::features::pprof::flamegraph() + "flamegraph" => crate::features::stacktrace::tracers::pprof::flamegraph() .map(|html| html.into_bytes()) .map_err(|e| EngineError::CallError(e.to_string())), - "flamegraph/json" => Ok(crate::features::pprof::flamegraph_json().into_bytes()), + "flamegraph/json" => { + Ok(crate::features::stacktrace::tracers::pprof::flamegraph_json().into_bytes()) + } "flamegraph/folded/json" => { - Ok(crate::features::pprof::folded_lines_json().into_bytes()) + Ok(crate::features::stacktrace::tracers::pprof::folded_lines_json().into_bytes()) } "flamegraph/distributed/json" => { let cluster = params @@ -37,7 +39,7 @@ impl ProbeExtensionCall for PprofProbeExtension { .map(|v| v != "0" && v != "false") .unwrap_or(true); let mode = params.get("mode").map(|s| s.as_str()).unwrap_or("mixed"); - let (body, _) = crate::features::pprof::collect_distributed_stack_flamegraph_json( + let (body, _) = crate::features::stacktrace::tracers::pprof::collect_distributed_stack_flamegraph_json( cluster, mode, ) .await; @@ -55,14 +57,14 @@ impl PprofProbeExtension { let freq = match pprof_sample_freq { Maybe::Just(freq) if freq >= 1 => freq, _ => { - crate::features::pprof::reset(); + crate::features::stacktrace::tracers::pprof::reset(); self.sample_freq = Maybe::Nothing; return Ok(()); } }; // Re-settable: `setup` bumps the sampler generation, retires the old // consumer thread, and re-arms the timer at the new rate. - crate::features::pprof::setup(freq as u64).map_err(|e| { + crate::features::stacktrace::tracers::pprof::setup(freq as u64).map_err(|e| { EngineError::InvalidOptionValue(Self::OPTION_SAMPLE_FREQ.to_string(), e.to_string()) })?; self.sample_freq = pprof_sample_freq.clone(); diff --git a/probing/extensions/python/src/extensions/python.rs b/probing/extensions/python/src/extensions/python.rs index 9cefb277..e7d0cb28 100644 --- a/probing/extensions/python/src/extensions/python.rs +++ b/probing/extensions/python/src/extensions/python.rs @@ -19,7 +19,7 @@ pub use exttbls::PyExternalTableConfig; pub use exttbls::{register_table_docs, ExternalTable}; pub use tbls::PythonProbeDataSource; -use crate::features::stack_tracer::{SignalTracer, StackTracer}; +use crate::features::stacktrace::{SignalTracer, StackTracer}; use crate::python::enable_crash_handler; use crate::python::enable_monitoring; diff --git a/probing/extensions/python/src/extensions/python/exttbls.rs b/probing/extensions/python/src/extensions/python/exttbls.rs index e35cb774..f61c5fe5 100644 --- a/probing/extensions/python/src/extensions/python/exttbls.rs +++ b/probing/extensions/python/src/extensions/python/exttbls.rs @@ -15,7 +15,7 @@ use std::collections::HashMap; use std::sync::{Arc, Mutex, MutexGuard}; -use crate::features::native_bridge::with_detached_native; +use crate::features::python::bridge::with_detached_native; use once_cell::sync::Lazy; use probing_core::sync::lock_mutex; use probing_memtable::discover::ExposedTable; @@ -27,7 +27,7 @@ use pyo3::types::{PyDict, PyType}; use pyo3::{pyclass, pymethods, Bound, PyResult, Python}; use thiserror::Error; -use crate::features::convert::{ele_to_python, python_to_ele}; +use crate::features::python::bridge::{ele_to_python, python_to_ele}; type PyTableRow = (Py, Vec>); diff --git a/probing/extensions/python/src/extensions/python/tbls.rs b/probing/extensions/python/src/extensions/python/tbls.rs index b56152af..7c28d85e 100644 --- a/probing/extensions/python/src/extensions/python/tbls.rs +++ b/probing/extensions/python/src/extensions/python/tbls.rs @@ -233,7 +233,7 @@ impl CustomNamespace for PythonNamespace { match Self::get_backtrace_data() { Ok(batches) => batches, Err(PythonTableError::Backtrace(ref source)) - if crate::features::stack_tracer::is_backtrace_busy(source) => + if crate::features::stacktrace::is_backtrace_busy(source) => { debug!("python.backtrace skipped: {source}"); error_batch("callstack capture busy") diff --git a/probing/extensions/python/src/features/crash/grace.rs b/probing/extensions/python/src/features/crash/grace.rs index 6299d96e..6460ebe4 100644 --- a/probing/extensions/python/src/features/crash/grace.rs +++ b/probing/extensions/python/src/features/crash/grace.rs @@ -118,13 +118,47 @@ fn hold_triggered(pid: i32) -> bool { false } -fn print_hold_banner(pid: i32, rank: i32) { - eprintln!( +fn hold_banner_text(pid: i32, rank: i32) -> String { + format!( "\nProcess HELD for debugging (pid={pid}, rank={rank}).\n\ attach : gdb -p {pid}\n\ python : py-spy dump --pid {pid}\n\ release: curl -X POST http://127.0.0.1:/apis/pythonext/crash/release\n\ rm {}\n", context::hold_file_path(pid) - ); + ) +} + +fn print_hold_banner(pid: i32, rank: i32) { + eprint!("{}", hold_banner_text(pid, rank)); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn hold_banner_release_is_http_not_sigusr2() { + let text = hold_banner_text(1234, 0); + assert!(text.contains("/apis/pythonext/crash/release")); + assert!(text.contains("gdb")); + assert!( + !text.contains("USR2") && !text.contains("SIGUSR2"), + "SIGUSR2 is reserved for stack capture; release must stay HTTP-only: {text}" + ); + } + + #[test] + fn grace_does_not_install_sigusr2_handler() { + // Contract: grace must not install a SIGUSR2 handler (conflicts with stack capture). + // Only scan production code (exclude this tests module, which mentions the forbidden API). + let src = include_str!("grace.rs"); + let production = src.split("#[cfg(test)]").next().unwrap_or(src); + assert!( + !production.contains("signal(Signal::SIGUSR2") + && !production.contains("on_release_signal"), + "crash grace must not install SIGUSR2 release handler" + ); + assert!(production.contains("Signal::SIGUSR1")); + } } diff --git a/probing/extensions/python/src/features/crash/handler.rs b/probing/extensions/python/src/features/crash/handler.rs index 458886ba..b717661a 100644 --- a/probing/extensions/python/src/features/crash/handler.rs +++ b/probing/extensions/python/src/features/crash/handler.rs @@ -13,7 +13,7 @@ use sha2::{Digest, Sha256}; use std::sync::Mutex; use uuid::Uuid; -use crate::features::tracing::crash_span_snapshot; +use crate::features::python::tracing::crash_span_snapshot; use super::grace; use super::memory_snapshot::{self, MemorySnapshot}; diff --git a/probing/extensions/python/src/features/crash/mod.rs b/probing/extensions/python/src/features/crash/mod.rs index bc791de2..6b5c7868 100644 --- a/probing/extensions/python/src/features/crash/mod.rs +++ b/probing/extensions/python/src/features/crash/mod.rs @@ -19,6 +19,9 @@ pub use api::{ }; pub use signal::install_crash_handler; +/// Whether crash grace is currently holding the process (skip SIGUSR2 stack capture). +pub(crate) use grace::is_held as is_crash_held; + pub(crate) mod config { pub fn enabled() -> bool { match std::env::var("PROBING_CRASH") { diff --git a/probing/extensions/python/src/features/crash/report.rs b/probing/extensions/python/src/features/crash/report.rs index 3ff48699..ebb650bc 100644 --- a/probing/extensions/python/src/features/crash/report.rs +++ b/probing/extensions/python/src/features/crash/report.rs @@ -224,4 +224,14 @@ mod tests { assert!(text.contains("train.step")); assert!(!text.contains("memtable")); } + + #[test] + fn hold_active_release_hint_is_http_not_sigusr2() { + let text = format_event(&sample_event(), true, 0, true, None); + assert!(text.contains("POST /apis/pythonext/crash/release")); + assert!( + !text.contains("USR2") && !text.contains("SIGUSR2"), + "hold release must not recommend kill -USR2: {text}" + ); + } } diff --git a/probing/extensions/python/src/features/crash/signal.rs b/probing/extensions/python/src/features/crash/signal.rs index a08de739..005790e8 100644 --- a/probing/extensions/python/src/features/crash/signal.rs +++ b/probing/extensions/python/src/features/crash/signal.rs @@ -41,11 +41,15 @@ const FATAL_SIGNALS: [c_int; 5] = [ libc::SIGFPE, ]; -const MAX_FRAMES: usize = 256; +/// Dedicated alt stack for crash handlers (`SA_ONSTACK`). Sized to match +/// stacktrace's per-thread minimum so `ensure_signal_altstack` can reuse it. const ALT_STACK_SIZE: usize = 256 * 1024; - static mut ALT_STACK: [u8; ALT_STACK_SIZE] = [0u8; ALT_STACK_SIZE]; +/// Keep short — `backtrace::resolve_*` is not async-signal-safe and has nested +/// into `_platform_strlen` (SIGILL) on Darwin, wiping the dump. +const MAX_FRAMES: usize = 32; + fn sig_name(sig: c_int) -> &'static str { match sig { libc::SIGSEGV => "SIGSEGV", @@ -152,6 +156,9 @@ unsafe extern "C" fn crash_handler(sig: c_int, info: *mut libc::siginfo_t, _uctx write_str("native backtrace (crashing thread):\n"); + // Print raw IPs first — `resolve_frame_unsynchronized` calls into libc + // (`strlen` etc.) and has nested-faulted leaving an empty backtrace section + // when the original SIGILL was already inside `_platform_strlen`. let mut idx = 0usize; backtrace::trace_unsynchronized(|frame| { let ip = frame.ip() as usize; @@ -159,27 +166,41 @@ unsafe extern "C" fn crash_handler(sig: c_int, info: *mut libc::siginfo_t, _uctx write_dec(idx); write_str(" 0x"); write_hex(ip); - write_str(" "); + write_str("\n"); + idx += 1; + idx < MAX_FRAMES + }); - let mut wrote_name = false; - backtrace::resolve_frame_unsynchronized(frame, |symbol| { - if !wrote_name { - if let Some(name) = symbol.name() { - if let Some(s) = name.as_str() { - write_bytes(s.as_bytes()); - wrote_name = true; + // Optional symbolization (may allocate / call unsafe-in-signal libc). + if idx > 0 && !env_is_truthy("PROBING_CRASH_NO_RESOLVE") { + write_str("symbols (best-effort):\n"); + let mut sidx = 0usize; + backtrace::trace_unsynchronized(|frame| { + let ip = frame.ip() as usize; + write_str(" #"); + write_dec(sidx); + write_str(" 0x"); + write_hex(ip); + write_str(" "); + let mut wrote_name = false; + backtrace::resolve_frame_unsynchronized(frame, |symbol| { + if !wrote_name { + if let Some(name) = symbol.name() { + if let Some(s) = name.as_str() { + write_bytes(s.as_bytes()); + wrote_name = true; + } } } + }); + if !wrote_name { + write_str(""); } + write_str("\n"); + sidx += 1; + sidx < MAX_FRAMES }); - if !wrote_name { - write_str(""); - } - write_str("\n"); - - idx += 1; - idx < MAX_FRAMES - }); + } write_str("==== end probing backtrace; re-raising "); write_str(sig_name(sig)); diff --git a/probing/extensions/python/src/features/flamegraph/distributed.rs b/probing/extensions/python/src/features/flamegraph/distributed.rs new file mode 100644 index 00000000..f36f7f9c --- /dev/null +++ b/probing/extensions/python/src/features/flamegraph/distributed.rs @@ -0,0 +1,108 @@ +//! Distributed / multi-rank folded-stack merge helpers. +//! +//! Stack merge is implemented on [`crate::features::stacktrace::FoldedStacks`]; +//! this module adapts classic `"path count"` lines and [`AttributedFoldedLine`]. + +use super::{parse_folded_line, AttributedFoldedLine}; +use crate::features::stacktrace::fold::{folded_from_line, merge_folded_attributed, FoldedStacks}; +use crate::features::stacktrace::snapshot::StackSource; + +/// Drop root `all` and per-process `thread-*` prefixes so identical stacks merge across ranks. +pub fn normalize_distributed_stack_folded_line(line: &str) -> Option { + let stack = folded_from_line(line, StackSource::Unknown)?; + let merged = merge_folded_attributed(&[(None, vec![stack])]); + let f = merged.into_iter().next()?; + Some(f.to_folded_line()) +} + +/// Keep only `[py] …` segments so native/C frames do not fork the flamegraph. +pub fn filter_folded_line_python_only(line: &str) -> Option { + let stack = folded_from_line(line, StackSource::Unknown)?; + let py = stack.python_only()?; + Some(py.to_folded_line()) +} + +pub fn filter_folded_lines_python_only(lines: &[String]) -> Vec { + lines + .iter() + .filter_map(|line| filter_folded_line_python_only(line)) + .collect() +} + +/// Keep only `[py]` segments while preserving rank attribution. +pub fn filter_attributed_folded_lines_python_only( + lines: &[AttributedFoldedLine], +) -> Vec { + lines + .iter() + .filter_map(|line| { + let stack = FoldedStacks { + tid: 0, + source: StackSource::Unknown, + segments: line.path.clone(), + count: line.count, + ranks: line.ranks.clone(), + }; + let py = stack.python_only()?; + Some(AttributedFoldedLine { + path: py.segments, + count: py.count, + ranks: py.ranks, + }) + }) + .collect() +} + +/// Merge folded stack lines across ranks after normalization / canonicalize. +pub fn merge_distributed_stack_folded_line_sets(sets: &[Vec]) -> Vec { + let attributed: Vec<(Option, Vec)> = + sets.iter().map(|lines| (None, lines.clone())).collect(); + merge_distributed_stack_attributed(&attributed) + .into_iter() + .map(|line| format!("{} {}", line.path.join(";"), line.count)) + .collect() +} + +/// Merge per-rank folded stacks, summing counts and collecting contributing ranks. +pub fn merge_distributed_stack_attributed( + sets: &[(Option, Vec)], +) -> Vec { + let typed: Vec<(Option, Vec)> = sets + .iter() + .map(|(rank, lines)| { + let stacks = lines + .iter() + .filter_map(|line| folded_from_line(line, StackSource::Unknown)) + .collect(); + (*rank, stacks) + }) + .collect(); + merge_folded_attributed(&typed) + .into_iter() + .map(|f| AttributedFoldedLine { + path: f.segments, + count: f.count, + ranks: f.ranks, + }) + .collect() +} + +/// Merge folded `"stack;path count"` lines from multiple ranks; identical paths sum counts. +pub fn merge_folded_line_sets(sets: &[Vec]) -> Vec { + use std::collections::HashMap; + let mut counts: HashMap = HashMap::new(); + for lines in sets { + for line in lines { + if let Some((path, count)) = parse_folded_line(line) { + let key = path.join(";"); + *counts.entry(key).or_insert(0) += count; + } + } + } + let mut merged: Vec = counts + .into_iter() + .map(|(path, count)| format!("{path} {count}")) + .collect(); + merged.sort(); + merged +} diff --git a/probing/extensions/python/src/features/flamegraph.rs b/probing/extensions/python/src/features/flamegraph/mod.rs similarity index 87% rename from probing/extensions/python/src/features/flamegraph.rs rename to probing/extensions/python/src/features/flamegraph/mod.rs index 65c6c8c0..70183a43 100644 --- a/probing/extensions/python/src/features/flamegraph.rs +++ b/probing/extensions/python/src/features/flamegraph/mod.rs @@ -1,7 +1,8 @@ -//! Interactive HTML visualizations without inferno. +//! Interactive HTML / JSON flamegraph visualizations (shared by stack + torch). //! -//! - `FlamegraphKind::Classic` — stacked CPU-style flamegraph (pprof). -//! - `FlamegraphKind::TorchModule` — modern module performance explorer for torch. +//! - [`FlamegraphKind::Classic`] — CPU stacked flamegraph (pprof / stacktrace). +//! - [`FlamegraphKind::TorchModule`] — module performance explorer (torch). +//! - [`distributed`] — multi-rank folded-stack normalize / merge / filter. use html_escape::encode_text; use serde_json::json; @@ -73,6 +74,9 @@ pub struct AttributedFoldedLine { pub ranks: Vec, } +mod distributed; +pub use distributed::*; + #[derive(Debug)] pub struct Flamegraph { root: Node, @@ -801,151 +805,6 @@ background:#0b0f14;color:#8b9bb4;font-family:ui-sans-serif,system-ui,sans-serif; } } -/// Whether a folded segment is a per-process thread bucket (`thread-{tid}` or `thread-{tid} (name)`). -fn is_thread_folded_segment(seg: &str) -> bool { - let Some(rest) = seg.strip_prefix("thread-") else { - return false; - }; - let digit_len = rest.chars().take_while(|c| c.is_ascii_digit()).count(); - digit_len > 0 - && (rest.len() == digit_len - || matches!(rest.as_bytes().get(digit_len), Some(b' ') | Some(b'('))) -} - -/// Drop root `all` and per-process `thread-*` prefixes so identical stacks merge across ranks. -pub fn normalize_distributed_stack_folded_line(line: &str) -> Option { - let (mut path, count) = parse_folded_line(line)?; - while path.first().is_some_and(|s| s == "all") { - path.remove(0); - } - while path.first().is_some_and(|s| is_thread_folded_segment(s)) { - path.remove(0); - } - if path.is_empty() { - return None; - } - let path = crate::features::stack_merge::canonicalize_folded_segments(&path); - if path.is_empty() { - return None; - } - Some(format!("{} {}", path.join(";"), count)) -} - -/// Keep only `[py] …` segments so native/C frames do not fork the flamegraph. -pub fn filter_folded_line_python_only(line: &str) -> Option { - let (path, count) = parse_folded_line(line)?; - let py_path: Vec = path.into_iter().filter(|s| s.starts_with("[py]")).collect(); - if py_path.is_empty() { - return None; - } - Some(format!("{} {}", py_path.join(";"), count)) -} - -pub fn filter_folded_lines_python_only(lines: &[String]) -> Vec { - lines - .iter() - .filter_map(|line| filter_folded_line_python_only(line)) - .collect() -} - -/// Keep only `[py]` segments while preserving rank attribution. -pub fn filter_attributed_folded_lines_python_only( - lines: &[AttributedFoldedLine], -) -> Vec { - lines - .iter() - .filter_map(|line| { - let py_path: Vec = line - .path - .iter() - .filter(|s| s.starts_with("[py]")) - .cloned() - .collect(); - if py_path.is_empty() { - return None; - } - Some(AttributedFoldedLine { - path: py_path, - count: line.count, - ranks: line.ranks.clone(), - }) - }) - .collect() -} - -/// Merge folded stack lines across ranks after [`normalize_distributed_stack_folded_line`]. -pub fn merge_distributed_stack_folded_line_sets(sets: &[Vec]) -> Vec { - let attributed: Vec<(Option, Vec)> = - sets.iter().map(|lines| (None, lines.clone())).collect(); - merge_distributed_stack_attributed(&attributed) - .into_iter() - .map(|line| format!("{} {}", line.path.join(";"), line.count)) - .collect() -} - -/// Merge per-rank folded stacks, summing counts and collecting contributing ranks. -/// -/// `sets` entries are `(rank, folded lines)`. When `rank` is `None`, the lines still -/// contribute to counts but are not attributed to a training rank id. -pub fn merge_distributed_stack_attributed( - sets: &[(Option, Vec)], -) -> Vec { - use std::collections::{BTreeSet, HashMap}; - let mut counts: HashMap = HashMap::new(); - let mut ranks: HashMap> = HashMap::new(); - for (rank, lines) in sets { - for line in lines { - let Some(normalized) = normalize_distributed_stack_folded_line(line) else { - continue; - }; - let Some((path, count)) = parse_folded_line(&normalized) else { - continue; - }; - let key = path.join(";"); - *counts.entry(key.clone()).or_insert(0) += count; - if let Some(r) = rank { - ranks.entry(key).or_default().insert(*r); - } - } - } - let mut merged: Vec = counts - .into_iter() - .filter_map(|(key, count)| { - let path: Vec = key.split(';').map(str::to_string).collect(); - if path.is_empty() { - return None; - } - let ranks = ranks - .remove(&key) - .map(|s| s.into_iter().collect()) - .unwrap_or_default(); - Some(AttributedFoldedLine { path, count, ranks }) - }) - .collect(); - merged.sort_by(|a, b| a.path.cmp(&b.path)); - merged -} - -/// Merge folded `"stack;path count"` lines from multiple ranks; identical paths sum counts. -pub fn merge_folded_line_sets(sets: &[Vec]) -> Vec { - use std::collections::HashMap; - let mut counts: HashMap = HashMap::new(); - for lines in sets { - for line in lines { - if let Some((path, count)) = parse_folded_line(line) { - let key = path.join(";"); - *counts.entry(key).or_insert(0) += count; - } - } - } - let mut merged: Vec = counts - .into_iter() - .map(|(path, count)| format!("{path} {count}")) - .collect(); - merged.sort(); - merged -} - /// Reconstruct folded lines from a Web UI flamegraph JSON payload (leaf frames only). pub fn folded_lines_from_flamegraph_json(body: &str) -> Vec { #[derive(serde::Deserialize)] @@ -995,7 +854,7 @@ pub fn folded_lines_from_flamegraph_json(body: &str) -> Vec { lines } -fn parse_folded_line(line: &str) -> Option<(Vec, u64)> { +pub(crate) fn parse_folded_line(line: &str) -> Option<(Vec, u64)> { let line = line.trim(); if line.is_empty() { return None; @@ -1142,6 +1001,67 @@ mod tests { assert_eq!(merged, vec!["[py] main (train.py:1) 5".to_string()]); } + #[test] + fn filter_attributed_python_only_preserves_ranks() { + let lines = vec![AttributedFoldedLine { + path: vec![ + "[py] main (a.py:1)".into(), + "native_fn".into(), + "[py] train (a.py:2)".into(), + ], + count: 4, + ranks: vec![0, 2], + }]; + let out = filter_attributed_folded_lines_python_only(&lines); + assert_eq!(out.len(), 1); + assert_eq!( + out[0].path, + vec![ + "[py] main (a.py:1)".to_string(), + "[py] train (a.py:2)".to_string() + ] + ); + assert_eq!(out[0].count, 4); + assert_eq!(out[0].ranks, vec![0, 2]); + } + + #[test] + fn normalize_strips_named_thread_prefix() { + let out = normalize_distributed_stack_folded_line( + "thread-123 (MainThread);[py] main (train.py:1) 7", + ) + .unwrap(); + assert_eq!(out, "[py] main (train.py:1) 7"); + } + + #[test] + fn merge_distributed_joins_platform_rooted_fork_with_user_path() { + // Repro: one rank rooted at platform., another already at main_worker. + let merged = merge_distributed_stack_attributed(&[ + ( + Some(0), + vec!["[py] main_worker (a.py:1);[py] train (a.py:2) 2".to_string()], + ), + ( + Some(1), + vec![ + "[py] (platform.py:1);[py] main_worker (a.py:1);[py] train (a.py:2) 3" + .to_string(), + ], + ), + ]); + assert_eq!(merged.len(), 1); + assert_eq!( + merged[0].path, + vec![ + "[py] main_worker (a.py:1)".to_string(), + "[py] train (a.py:2)".to_string() + ] + ); + assert_eq!(merged[0].count, 5); + assert_eq!(merged[0].ranks, vec![0, 1]); + } + #[test] fn merge_distributed_attributed_collects_ranks_per_path() { let merged = merge_distributed_stack_attributed(&[ diff --git a/probing/extensions/python/src/features/mod.rs b/probing/extensions/python/src/features/mod.rs index db84f7a7..815e427c 100644 --- a/probing/extensions/python/src/features/mod.rs +++ b/probing/extensions/python/src/features/mod.rs @@ -1,20 +1,26 @@ -pub mod config; -pub mod convert; -/// Backtrace-on-crash handler for fatal signals (`SIGSEGV`/`SIGBUS`/...). -pub mod crash; -pub mod flamegraph; -pub mod native_bridge; -pub mod pprof; -pub mod py_result; -pub mod python_api; -pub mod spy; -/// Async-signal-safe raw stack snapshotting (SIGPROF / SIGUSR2). -pub mod stack_capture; -/// Unified Python / native stack merge. -pub mod stack_merge; -/// On-demand stack capture (`SIGUSR2`) and synchronous walks. -pub mod stack_tracer; +//! Feature modules for the Python extension (`probing-python`). +//! +//! Grouped by concern: +//! +//! | Module | Role | +//! |--------|------| +//! | [`python`] | PyO3 glue — bridge, bindings, tracing | +//! | [`stacktrace`] | Call-stack capture, merge, tracers (vm / pprof / dynamic) | +//! | [`torch`] | Module profiling from `python.torch_trace` | +//! | [`flamegraph`] | Shared flamegraph render + distributed stack fold merge | +//! | [`crash`] | Fatal-signal backtrace / grace | + +/// PyO3-facing surface (`bridge` / `bindings` / `tracing`). +pub mod python; + +/// Unified stack expression, merge, CPython ABI (spy), and tracers. +pub mod stacktrace; + +/// Torch module profiling (`python.torch_trace` → flamegraph / JSON). pub mod torch; -pub mod tracing; -/// Python eval-frame hook; source of Python call frames for stack tracing. -pub mod vm_tracer; + +/// Shared HTML/JSON flamegraph renderer (CPU stacks + torch modules). +pub mod flamegraph; + +/// Backtrace-on-crash for fatal signals (`SIGSEGV` / `SIGBUS` / …). +pub mod crash; diff --git a/probing/extensions/python/src/features/native_bridge.rs b/probing/extensions/python/src/features/native_bridge.rs deleted file mode 100644 index 2bb5b881..00000000 --- a/probing/extensions/python/src/features/native_bridge.rs +++ /dev/null @@ -1,17 +0,0 @@ -use pyo3::prelude::*; - -use probing_core::{on_native_bridge_thread, run_on_native_thread}; - -/// Run Rust/Python bridge work off the Python main thread and Tokio workers. -/// -/// When already on the ``probing-native`` bridge worker (e.g. loading a Python -/// plugin from ``execute_python_code``), avoid ``py.detach`` — an extra thread -/// plus nested GIL handoffs can SIGABRT on Linux CI (pytest-cov + torch). -pub fn with_detached_native( - f: impl FnOnce() -> R + Send + 'static, -) -> R { - if on_native_bridge_thread() { - return run_on_native_thread(f); - } - Python::attach(|py| py.detach(|| run_on_native_thread(f))) -} diff --git a/probing/extensions/python/src/features/pprof.rs b/probing/extensions/python/src/features/pprof.rs deleted file mode 100644 index 668fc327..00000000 --- a/probing/extensions/python/src/features/pprof.rs +++ /dev/null @@ -1,679 +0,0 @@ -//! CPU profiling via `SIGPROF` sampling ("model two": trigger in-signal, process -//! off-signal). -//! -//! Raw capture and Python/native merge live in [`stack_capture`] / -//! [`stack_merge`]; this module owns the ring buffer, timer, and folded output. - -use std::cell::UnsafeCell; -use std::collections::HashMap; -use std::sync::atomic::{AtomicBool, AtomicPtr, AtomicU64, AtomicUsize, Ordering}; -use std::sync::Mutex; -use std::thread; -use std::time::Duration; - -use anyhow::{anyhow, Context, Result}; -use core::ffi::{c_int, c_void}; -use nix::libc; -use once_cell::sync::Lazy; -use serde_json::json; - -use crate::features::flamegraph::{FlamegraphKind, FlamegraphOptions}; -use crate::features::stack_capture::{self, RawStackSnapshot}; - -const DEFAULT_SAMPLE_FREQ: i32 = 100; -const MIN_SAMPLE_FREQ: i32 = 1; -const MAX_SAMPLE_FREQ: i32 = 100_000; - -const RING_SIZE: usize = 512; -const RING_MASK: usize = RING_SIZE - 1; -const MAX_FOLDED_STACKS: usize = 1 << 17; - -// --------------------------------------------------------------------------- -// Lock-free bounded MPMC ring (Vyukov). Async-signal-safe producer side. -// --------------------------------------------------------------------------- - -struct Cell { - seq: AtomicUsize, - data: UnsafeCell, -} - -struct Ring { - buffer: Box<[Cell]>, - enqueue_pos: AtomicUsize, - dequeue_pos: AtomicUsize, -} - -unsafe impl Sync for Ring {} -unsafe impl Send for Ring {} - -impl Ring { - fn new() -> Ring { - let mut v: Vec = Vec::with_capacity(RING_SIZE); - for i in 0..RING_SIZE { - v.push(Cell { - seq: AtomicUsize::new(i), - data: UnsafeCell::new(RawStackSnapshot::zeroed()), - }); - } - Ring { - buffer: v.into_boxed_slice(), - enqueue_pos: AtomicUsize::new(0), - dequeue_pos: AtomicUsize::new(0), - } - } - - fn enqueue(&self, sample: &RawStackSnapshot) -> bool { - let mut pos = self.enqueue_pos.load(Ordering::Relaxed); - loop { - let cell = &self.buffer[pos & RING_MASK]; - let seq = cell.seq.load(Ordering::Acquire); - let diff = seq as isize - pos as isize; - if diff == 0 { - if self - .enqueue_pos - .compare_exchange_weak(pos, pos + 1, Ordering::Relaxed, Ordering::Relaxed) - .is_ok() - { - unsafe { *cell.data.get() = *sample }; - cell.seq.store(pos + 1, Ordering::Release); - return true; - } - } else if diff < 0 { - return false; - } else { - pos = self.enqueue_pos.load(Ordering::Relaxed); - } - } - } - - fn dequeue(&self, out: &mut RawStackSnapshot) -> bool { - let mut pos = self.dequeue_pos.load(Ordering::Relaxed); - loop { - let cell = &self.buffer[pos & RING_MASK]; - let seq = cell.seq.load(Ordering::Acquire); - let diff = seq as isize - (pos + 1) as isize; - if diff == 0 { - if self - .dequeue_pos - .compare_exchange_weak(pos, pos + 1, Ordering::Relaxed, Ordering::Relaxed) - .is_ok() - { - unsafe { *out = *cell.data.get() }; - cell.seq.store(pos + RING_SIZE, Ordering::Release); - return true; - } - } else if diff < 0 { - return false; - } else { - pos = self.dequeue_pos.load(Ordering::Relaxed); - } - } - } -} - -static RING_PTR: AtomicPtr = AtomicPtr::new(std::ptr::null_mut()); -static DROPPED: AtomicU64 = AtomicU64::new(0); -static SAMPLER_ENABLED: AtomicBool = AtomicBool::new(false); -static HANDLER_ACTIVE: AtomicUsize = AtomicUsize::new(0); -static PPROF_OWNS_TRACER: AtomicBool = AtomicBool::new(false); -static HANDLER_INSTALLED: AtomicBool = AtomicBool::new(false); - -struct ActiveGuard; -impl ActiveGuard { - #[inline] - fn new() -> Self { - HANDLER_ACTIVE.fetch_add(1, Ordering::Acquire); - ActiveGuard - } -} -impl Drop for ActiveGuard { - #[inline] - fn drop(&mut self) { - HANDLER_ACTIVE.fetch_sub(1, Ordering::Release); - } -} - -#[cfg(unix)] -unsafe extern "C" fn sigprof_handler(_sig: c_int, _info: *mut libc::siginfo_t, uctx: *mut c_void) { - if !SAMPLER_ENABLED.load(Ordering::Acquire) { - return; - } - let _active = ActiveGuard::new(); - let ring = RING_PTR.load(Ordering::Acquire); - if ring.is_null() { - return; - } - let ring = &*ring; - - let snapshot = stack_capture::capture_raw_snapshot(uctx); - if snapshot.is_empty() { - return; - } - stack_capture::store_latest_snapshot(&snapshot); - if !ring.enqueue(&snapshot) { - DROPPED.fetch_add(1, Ordering::Relaxed); - } -} - -#[cfg(unix)] -fn install_handler() { - if HANDLER_INSTALLED.swap(true, Ordering::AcqRel) { - return; - } - unsafe { - let mut sa: libc::sigaction = std::mem::zeroed(); - sa.sa_sigaction = sigprof_handler as *const () as usize; - sa.sa_flags = libc::SA_SIGINFO | libc::SA_RESTART; - libc::sigemptyset(&mut sa.sa_mask); - libc::sigaction(libc::SIGPROF, &sa, std::ptr::null_mut()); - } -} - -#[cfg(not(unix))] -fn install_handler() {} - -#[cfg(unix)] -fn arm_timer(freq: i32) { - let period_us = (1_000_000i64 / freq as i64).max(1); - let tv = libc::timeval { - tv_sec: (period_us / 1_000_000) as libc::time_t, - tv_usec: (period_us % 1_000_000) as libc::suseconds_t, - }; - let it = libc::itimerval { - it_interval: tv, - it_value: tv, - }; - unsafe { libc::setitimer(libc::ITIMER_PROF, &it, std::ptr::null_mut()) }; -} - -#[cfg(not(unix))] -fn arm_timer(_freq: i32) {} - -#[cfg(unix)] -fn disarm_timer() { - let it: libc::itimerval = unsafe { std::mem::zeroed() }; - unsafe { libc::setitimer(libc::ITIMER_PROF, &it, std::ptr::null_mut()) }; -} - -#[cfg(not(unix))] -fn disarm_timer() {} - -struct SamplerState { - generation: AtomicU64, - samples: Mutex>, -} - -static SAMPLER: Lazy = Lazy::new(|| SamplerState { - generation: AtomicU64::new(0), - samples: Mutex::new(HashMap::new()), -}); - -fn process_sample( - s: &RawStackSnapshot, - cache: &mut HashMap, -) { - if let Some(main_tid) = stack_capture::python_main_os_tid() { - if s.tid != main_tid { - return; - } - } - let line = stack_capture::snapshot_to_folded_line(s, cache); - if line.is_empty() { - return; - } - if let Ok(mut map) = SAMPLER.samples.lock() { - if let Some(count) = map.get_mut(&line) { - *count += 1; - } else if map.len() < MAX_FOLDED_STACKS { - map.insert(line, 1); - } else { - DROPPED.fetch_add(1, Ordering::Relaxed); - } - } -} - -fn consumer_loop(my_gen: u64) { - let mut sample = RawStackSnapshot::zeroed(); - let mut cache = HashMap::new(); - loop { - let stopping = SAMPLER.generation.load(Ordering::SeqCst) != my_gen; - let ring = RING_PTR.load(Ordering::Acquire); - let mut drained = false; - if !ring.is_null() { - let ring = unsafe { &*ring }; - while ring.dequeue(&mut sample) { - drained = true; - process_sample(&sample, &mut cache); - } - } - if stopping { - break; - } - if !drained { - thread::sleep(Duration::from_millis(2)); - } - } -} - -pub fn is_sampling_active() -> bool { - SAMPLER_ENABLED.load(Ordering::Acquire) -} - -pub fn setup(freq: u64) -> Result<()> { - #[cfg(not(unix))] - { - let _ = freq; - return Err(anyhow::anyhow!( - "CPU profiling (SIGPROF) is not supported on this platform" - )); - } - #[cfg(unix)] - setup_unix(freq) -} - -#[cfg(unix)] -fn setup_unix(freq: u64) -> Result<()> { - let freq = if freq == 0 { - DEFAULT_SAMPLE_FREQ - } else { - (freq as i32).clamp(MIN_SAMPLE_FREQ, MAX_SAMPLE_FREQ) - }; - - if RING_PTR.load(Ordering::Acquire).is_null() { - let ptr = Box::into_raw(Box::new(Ring::new())); - if RING_PTR - .compare_exchange( - std::ptr::null_mut(), - ptr, - Ordering::AcqRel, - Ordering::Acquire, - ) - .is_err() - { - unsafe { drop(Box::from_raw(ptr)) }; - } - } - - if let Ok(mut map) = SAMPLER.samples.lock() { - map.clear(); - } - DROPPED.store(0, Ordering::Relaxed); - - crate::features::vm_tracer::initialize_globals(); - pyo3::Python::attach(|_py| { - let already_on = crate::features::vm_tracer::is_tracer_enabled(); - match crate::features::vm_tracer::enable_tracer() { - Ok(()) => { - if !already_on { - PPROF_OWNS_TRACER.store(true, Ordering::Release); - } - } - Err(e) => log::warn!( - "probing: pprof could not enable the Python eval tracer ({e}); \ - stacks will be native-only" - ), - } - }); - - install_handler(); - - let my_gen = SAMPLER.generation.fetch_add(1, Ordering::SeqCst) + 1; - stack_capture::set_pprof_sampling_active(true); - SAMPLER_ENABLED.store(true, Ordering::Release); - - thread::Builder::new() - .name("probing-sampler".into()) - .spawn(move || consumer_loop(my_gen)) - .context("failed to spawn sampler consumer thread")?; - - arm_timer(freq); - log::info!("probing: SIGPROF CPU sampler started ({freq} Hz, Python+native)"); - Ok(()) -} - -pub fn reset() { - disarm_timer(); - stack_capture::set_pprof_sampling_active(false); - SAMPLER_ENABLED.store(false, Ordering::Release); - SAMPLER.generation.fetch_add(1, Ordering::SeqCst); - - let ring = RING_PTR.swap(std::ptr::null_mut(), Ordering::AcqRel); - if !ring.is_null() { - let mut drained = false; - for _ in 0..10_000_000 { - if HANDLER_ACTIVE.load(Ordering::Acquire) == 0 { - drained = true; - break; - } - std::hint::spin_loop(); - } - if drained { - unsafe { drop(Box::from_raw(ring)) }; - } else { - RING_PTR.store(ring, Ordering::Release); - } - } - - if PPROF_OWNS_TRACER.swap(false, Ordering::AcqRel) { - pyo3::Python::attach(|_py| { - let _ = crate::features::vm_tracer::disable_tracer(); - }); - } - - stack_capture::clear_py_symbols(); -} - -pub fn pprof_handler() { - let _ = setup(DEFAULT_SAMPLE_FREQ as u64); -} - -fn pprof_flamegraph_options() -> FlamegraphOptions { - FlamegraphOptions { - title: "CPU sampling".to_string(), - count_name: "samples".to_string(), - kind: FlamegraphKind::Classic, - subtitle: "SIGPROF weighted stack samples".to_string(), - metric: None, - profile: Some("cpu-stack".to_string()), - } -} - -fn folded_lines_from_sampler() -> Vec { - match SAMPLER.samples.lock() { - Ok(map) => map - .iter() - .map(|(stack, count)| format!("{stack} {count}")) - .collect(), - Err(_) => Vec::new(), - } -} - -/// Local folded stacks: SIGPROF main-thread samples when active, else a one-shot -/// main-thread PYSTACKS snapshot (no signal on the HTTP path). -fn local_folded_lines() -> Vec { - if is_sampling_active() { - let lines = folded_lines_from_sampler(); - if !lines.is_empty() { - return lines; - } - } - crate::features::stack_tracer::main_thread_on_demand_folded_lines() -} - -fn folded_lines() -> Vec { - local_folded_lines() -} - -/// Snapshot of local SIGPROF folded stacks (`"path count"` per line). -pub fn folded_lines_snapshot() -> Vec { - folded_lines() -} - -/// Build distributed stack flamegraph JSON from attributed folded lines across ranks. -pub fn distributed_stack_flamegraph_json( - lines: &[crate::features::flamegraph::AttributedFoldedLine], - rank_count: usize, - nodes_failed: &[String], - mode: &str, -) -> String { - let python_only = mode == "py"; - let profile = if python_only { - "cpu-stack-distributed-py" - } else { - "cpu-stack-distributed" - }; - let dropped = DROPPED.load(Ordering::Relaxed); - let empty = |msg: &str| { - json!({ - "profile": profile, - "title": if python_only { "Distributed Python stacks" } else { "Distributed CPU stacks" }, - "subtitle": format!( - "SIGPROF mixed-mode stacks · {rank_count} ranks · merge identical paths" - ), - "countName": "samples", - "total": 0, - "width": 1400.0, - "frameHeight": 32.0, - "frames": [], - "dropped": dropped, - "emptyMessage": msg, - "nodesFailed": nodes_failed, - "rankCount": rank_count, - }) - .to_string() - }; - - if lines.is_empty() { - return empty(if python_only { - "no Python stack samples yet; enable SIGPROF (probing.pprof.sample_freq) on each rank and let training run" - } else { - "no main-thread CPU stack samples yet; enable SIGPROF (probing.pprof.sample_freq) on each rank" - }); - } - - let subtitle = if python_only { - if is_sampling_active() { - format!("Python frames only · SIGPROF main-thread samples · {rank_count} ranks merged") - } else { - format!("Python frames only · one-shot PYSTACKS snapshot · {rank_count} ranks merged") - } - } else if is_sampling_active() { - format!("Full mixed stack · SIGPROF main-thread samples · {rank_count} ranks merged") - } else { - format!( - "Full mixed stack · one-shot main-thread snapshot (enable SIGPROF for accumulation) · {rank_count} ranks merged" - ) - }; - let opts = FlamegraphOptions { - title: if python_only { - "Distributed Python stacks".to_string() - } else { - "Distributed CPU stacks".to_string() - }, - count_name: "samples".to_string(), - kind: FlamegraphKind::Classic, - subtitle, - metric: None, - profile: Some(profile.to_string()), - }; - - match crate::features::flamegraph::Flamegraph::from_attributed_folded_lines(lines) { - Some(fg) => { - let payload = fg.json_payload(&opts); - match serde_json::from_str::(&payload) { - Ok(mut v) => { - if let Some(obj) = v.as_object_mut() { - obj.insert("dropped".to_string(), json!(dropped)); - obj.insert("rankCount".to_string(), json!(rank_count)); - if !nodes_failed.is_empty() { - obj.insert("nodesFailed".to_string(), json!(nodes_failed)); - } - } - v.to_string() - } - Err(_) => payload, - } - } - None => empty("no valid folded stacks after merge"), - } -} - -fn local_training_rank() -> Option { - std::env::var("RANK") - .ok() - .and_then(|s| s.trim().parse().ok()) - .or_else(|| { - std::env::var("LOCAL_RANK") - .ok() - .and_then(|s| s.trim().parse().ok()) - }) -} - -fn remote_pprof_folded_lines_blocking(addr: &str) -> anyhow::Result> { - let url = format!("http://{addr}/apis/pprofextension/flamegraph/folded/json"); - let timeout = std::time::Duration::from_secs( - std::env::var("PROBING_CLUSTER_QUERY_TIMEOUT_SEC") - .ok() - .and_then(|v| v.parse().ok()) - .unwrap_or(10), - ); - let text = ureq::get(&url) - .config() - .timeout_global(Some(timeout)) - .build() - .call()? - .body_mut() - .read_to_string()?; - #[derive(serde::Deserialize)] - struct Payload { - lines: Vec, - } - Ok(serde_json::from_str::(&text)?.lines) -} - -fn remote_pprof_flamegraph_json_blocking(addr: &str) -> anyhow::Result { - let url = format!("http://{addr}/apis/pprofextension/flamegraph/json"); - let timeout = std::time::Duration::from_secs( - std::env::var("PROBING_CLUSTER_QUERY_TIMEOUT_SEC") - .ok() - .and_then(|v| v.parse().ok()) - .unwrap_or(10), - ); - let text = ureq::get(&url) - .config() - .timeout_global(Some(timeout)) - .build() - .call()? - .body_mut() - .read_to_string()?; - Ok(text) -} - -fn remote_pprof_folded_lines_fallback(addr: &str) -> anyhow::Result> { - remote_pprof_folded_lines_blocking(addr).or_else(|_| { - let json = remote_pprof_flamegraph_json_blocking(addr)?; - Ok(crate::features::flamegraph::folded_lines_from_flamegraph_json(&json)) - }) -} - -/// Cluster fan-out + merge for distributed CPU stack flamegraph JSON. -/// -/// `mode`: `mixed` (Python + native) or `py` (Python frames only). -/// -/// Returns `(json_body, partial)` where `partial` is true when some peers failed. -pub async fn collect_distributed_stack_flamegraph_json( - cluster: bool, - mode: &str, -) -> (String, bool) { - let mode = if mode == "py" { "py" } else { "mixed" }; - use probing_core::core::cluster::{get_nodes, is_node_alive, local_listen_addrs}; - - let mut line_sets: Vec<(Option, Vec)> = - vec![(local_training_rank(), folded_lines_snapshot())]; - let mut nodes_failed = Vec::new(); - let mut rank_count = 1usize; - - if cluster { - let local_addrs = local_listen_addrs(); - let peers: Vec<_> = get_nodes() - .into_iter() - .filter(is_node_alive) - .filter(|node| !local_addrs.iter().any(|local| local == &node.addr)) - .collect(); - - for node in peers { - let addr = node.addr.clone(); - let peer_rank = node.rank; - match tokio::task::spawn_blocking(move || remote_pprof_folded_lines_fallback(&addr)) - .await - { - Ok(Ok(lines)) => { - line_sets.push((peer_rank, lines)); - rank_count += 1; - } - Ok(Err(err)) => { - log::warn!( - "distributed stack flamegraph fan-out {} failed: {err:#}", - node.addr - ); - nodes_failed.push(format!("{}: {err:#}", node.addr)); - } - Err(err) => { - nodes_failed.push(format!("{}: task join failed: {err}", node.addr)); - } - } - } - } - - let mut merged = crate::features::flamegraph::merge_distributed_stack_attributed(&line_sets); - if mode == "py" { - merged = crate::features::flamegraph::filter_attributed_folded_lines_python_only(&merged); - } - let body = distributed_stack_flamegraph_json(&merged, rank_count, &nodes_failed, mode); - (body, !nodes_failed.is_empty()) -} - -/// Raw folded stack lines for cluster fan-out (`{"lines":["stack count", ...]}`). -pub fn folded_lines_json() -> String { - json!({ "lines": folded_lines_snapshot() }).to_string() -} - -pub fn flamegraph() -> Result { - let lines = folded_lines(); - if lines.is_empty() { - return Err(anyhow!( - "no samples collected yet; enable CPU sampling and let it run" - )); - } - - let dropped = DROPPED.load(Ordering::Relaxed); - if dropped > 0 { - log::warn!("probing: {dropped} CPU samples dropped (ring full or cardinality cap)"); - } - - let fg = crate::features::flamegraph::Flamegraph::from_folded_lines(&lines) - .ok_or_else(|| anyhow!("no valid folded stacks"))?; - Ok(fg.render_html(&pprof_flamegraph_options())) -} - -pub fn flamegraph_json() -> String { - let dropped = DROPPED.load(Ordering::Relaxed); - let empty = |msg: String| { - json!({ - "profile": "cpu-stack", - "title": "CPU sampling", - "subtitle": "SIGPROF weighted stack samples", - "countName": "samples", - "total": 0, - "width": 1400.0, - "frameHeight": 32.0, - "frames": [], - "dropped": dropped, - "emptyMessage": msg, - }) - .to_string() - }; - - let lines = folded_lines(); - if lines.is_empty() { - return empty( - "no samples collected yet; enable CPU sampling or use Stacks → Default".to_string(), - ); - } - - match crate::features::flamegraph::Flamegraph::from_folded_lines(&lines) { - Some(fg) => { - let payload = fg.json_payload(&pprof_flamegraph_options()); - match serde_json::from_str::(&payload) { - Ok(mut v) => { - if let Some(obj) = v.as_object_mut() { - obj.insert("dropped".to_string(), json!(dropped)); - } - v.to_string() - } - Err(_) => payload, - } - } - None => empty("no valid folded stacks".to_string()), - } -} diff --git a/probing/extensions/python/src/features/py_result.rs b/probing/extensions/python/src/features/py_result.rs deleted file mode 100644 index febce592..00000000 --- a/probing/extensions/python/src/features/py_result.rs +++ /dev/null @@ -1,7 +0,0 @@ -use pyo3::exceptions::PyRuntimeError; -use pyo3::PyErr; - -/// Map a displayable error into `PyRuntimeError` (Python API boundary). -pub fn runtime_err(err: impl std::fmt::Display) -> PyErr { - PyRuntimeError::new_err(err.to_string()) -} diff --git a/probing/extensions/python/src/features/config.rs b/probing/extensions/python/src/features/python/bindings.rs similarity index 59% rename from probing/extensions/python/src/features/config.rs rename to probing/extensions/python/src/features/python/bindings.rs index 549a5143..47e14903 100644 --- a/probing/extensions/python/src/features/config.rs +++ b/probing/extensions/python/src/features/python/bindings.rs @@ -1,12 +1,88 @@ -use pyo3::prelude::*; -use pyo3::types::PyModule; +//! PyO3 functions registered on the `probing._core` module +//! (config, SQL query, callstack, eval, enable flags). + +use std::panic::{catch_unwind, AssertUnwindSafe}; use probing_core::config; use probing_core::runtime::block_on; +use probing_core::ENGINE; +use pyo3::prelude::*; +use pyo3::types::PyModule; + +use crate::features::python::bridge::{ + ele_to_python, python_to_ele, runtime_err, with_detached_native, +}; +use crate::features::stacktrace::{is_backtrace_busy, SignalTracer, StackTracer}; +use crate::repl::ReplSession; + +fn callstack_error_json(message: &str) -> String { + serde_json::json!({ + "error": message, + "frames": [], + }) + .to_string() +} + +#[pyfunction] +pub fn should_enable_probing() -> bool { + crate::python::should_enable_probing() +} -use crate::features::convert::{ele_to_python, python_to_ele}; -use crate::features::native_bridge::with_detached_native; -use crate::features::py_result::runtime_err; +#[pyfunction] +pub fn is_enabled() -> bool { + crate::python::is_enabled() +} + +#[pyfunction] +pub fn query_json(_py: Python, sql: String) -> PyResult { + with_detached_native(move || { + let bridge = block_on(async move { ENGINE.read().await.async_query(sql.as_str()).await }) + .map_err(|e| runtime_err(format!("probing runtime unavailable: {e}")))?; + match bridge { + Ok(Some(df)) => serde_json::to_string(&df).map_err(runtime_err), + Ok(None) => Err(pyo3::exceptions::PyRuntimeError::new_err( + "query returned nil (no tabular result; e.g. SET or non-SELECT)", + )), + Err(e) => Err(runtime_err(format!("engine SQL failed: {e}"))), + } + }) +} + +/// HTTP `GET /apis/pythonext/callstack` backend. +/// +/// Always returns JSON (never raises into Python) so concurrent stack capture +/// cannot take down the training process via PyO3 exception propagation. +#[pyfunction] +#[pyo3(signature = (tid=None))] +pub fn api_callstack(tid: Option) -> PyResult { + let payload = catch_unwind(AssertUnwindSafe(|| { + let tid = tid.filter(|&t| t != 0); + match SignalTracer.trace(tid) { + Ok(frames) => match serde_json::to_string(&frames) { + Ok(json) => json, + Err(e) => callstack_error_json(&format!("failed to encode callstack: {e}")), + }, + Err(e) if is_backtrace_busy(&e) => callstack_error_json("callstack capture busy"), + Err(e) => callstack_error_json(&e.to_string()), + } + })); + Ok(match payload { + Ok(json) => json, + Err(_) => callstack_error_json("callstack capture panicked"), + }) +} + +/// HTTP `POST /apis/pythonext/eval` backend. +#[pyfunction] +pub fn api_eval(code: &str) -> PyResult { + log::debug!("Python eval code: {code}"); + let mut session = ReplSession::new(); + let out = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| session.eval_code(code))); + match out { + Ok(s) => Ok(s), + Err(_) => Ok(serde_json::json!({"error": "REPL execution panicked"}).to_string()), + } +} /// Get a configuration value. /// diff --git a/probing/extensions/python/src/features/convert.rs b/probing/extensions/python/src/features/python/bridge.rs similarity index 65% rename from probing/extensions/python/src/features/convert.rs rename to probing/extensions/python/src/features/python/bridge.rs index bd3ff16c..dc3c4ae0 100644 --- a/probing/extensions/python/src/features/convert.rs +++ b/probing/extensions/python/src/features/python/bridge.rs @@ -1,16 +1,32 @@ -//! Unified Python-Ele conversion module -//! -//! This module provides centralized conversion functions between Python objects -//! and Ele types, replacing scattered conversion logic throughout the codebase. +//! FFI helpers shared by PyO3 bindings: thread bridge, Ele convert, errors. +use probing_core::{on_native_bridge_thread, run_on_native_thread}; use probing_proto::prelude::Ele; +use pyo3::exceptions::PyRuntimeError; use pyo3::prelude::*; use pyo3::types::{PyBool, PyFloat, PyInt, PyString}; +use pyo3::PyErr; -/// Convert Ele to Python object +/// Map a displayable error into `PyRuntimeError` (Python API boundary). +pub fn runtime_err(err: impl std::fmt::Display) -> PyErr { + PyRuntimeError::new_err(err.to_string()) +} + +/// Run Rust/Python bridge work off the Python main thread and Tokio workers. /// -/// This is the unified implementation that should be used throughout -/// the codebase instead of scattered conversion functions. +/// When already on the ``probing-native`` bridge worker (e.g. loading a Python +/// plugin from ``execute_python_code``), avoid ``py.detach`` — an extra thread +/// plus nested GIL handoffs can SIGABRT on Linux CI (pytest-cov + torch). +pub fn with_detached_native( + f: impl FnOnce() -> R + Send + 'static, +) -> R { + if on_native_bridge_thread() { + return run_on_native_thread(f); + } + Python::attach(|py| py.detach(|| run_on_native_thread(f))) +} + +/// Convert `Ele` to a Python object. pub fn ele_to_python(py: Python, ele: &Ele) -> PyResult> { let obj: Py = match ele { Ele::Nil => py.None(), @@ -39,42 +55,31 @@ pub fn ele_to_python(py: Python, ele: &Ele) -> PyResult> { Ok(obj) } -/// Convert Python object to Ele -/// -/// This is the unified implementation that should be used throughout -/// the codebase instead of scattered conversion functions. +/// Convert a Python object to `Ele`. pub fn python_to_ele(value: &Bound<'_, PyAny>) -> PyResult { - // Handle None if value.is_none() { return Ok(Ele::Nil); } - // Try bool if let Ok(b) = value.extract::() { return Ok(Ele::BOOL(b)); } - // Try int (i64) if let Ok(i) = value.extract::() { - // Store as I64 for large integers, I32 for smaller ones if i >= i32::MIN as i64 && i <= i32::MAX as i64 { return Ok(Ele::I32(i as i32)); } return Ok(Ele::I64(i)); } - // Try float (f64) if let Ok(f) = value.extract::() { - // Store as F64 for precision return Ok(Ele::F64(f)); } - // Try str if let Ok(s) = value.extract::() { return Ok(Ele::Text(s)); } - // Fallback: convert to string let s = value.str()?.to_string(); Ok(Ele::Text(s)) } diff --git a/probing/extensions/python/src/features/python/mod.rs b/probing/extensions/python/src/features/python/mod.rs new file mode 100644 index 00000000..d9287111 --- /dev/null +++ b/probing/extensions/python/src/features/python/mod.rs @@ -0,0 +1,11 @@ +//! PyO3-facing feature surface (distinct from crate-root [`crate::python`] lifecycle). +//! +//! | Module | Role | +//! |--------|------| +//! | [`bridge`] | Thread detach, `Ele` ↔ Python, error mapping | +//! | [`bindings`] | `_core` pyfunctions: config / query / callstack / eval | +//! | [`tracing`] | `inspect.trace` spans and crash span snapshot | + +pub mod bindings; +pub mod bridge; +pub mod tracing; diff --git a/probing/extensions/python/src/features/tracing.rs b/probing/extensions/python/src/features/python/tracing.rs similarity index 99% rename from probing/extensions/python/src/features/tracing.rs rename to probing/extensions/python/src/features/python/tracing.rs index 095862ef..e4e115c1 100644 --- a/probing/extensions/python/src/features/tracing.rs +++ b/probing/extensions/python/src/features/python/tracing.rs @@ -11,7 +11,7 @@ use probing_core::trace::{ Event as RawEvent, SpanStatus, StepSnapshot, Timestamp, }; -use crate::features::convert::{ele_to_python, python_to_ele}; +use crate::features::python::bridge::{ele_to_python, python_to_ele}; fn lock_span(m: &Mutex) -> MutexGuard<'_, RawSpan> { lock_mutex(m, "span") diff --git a/probing/extensions/python/src/features/python_api.rs b/probing/extensions/python/src/features/python_api.rs deleted file mode 100644 index beed4e5d..00000000 --- a/probing/extensions/python/src/features/python_api.rs +++ /dev/null @@ -1,79 +0,0 @@ -use std::panic::{catch_unwind, AssertUnwindSafe}; - -use probing_core::runtime::block_on; -use probing_core::ENGINE; -use pyo3::prelude::*; - -use crate::features::native_bridge::with_detached_native; -use crate::features::py_result::runtime_err; -use crate::features::stack_tracer::{is_backtrace_busy, SignalTracer, StackTracer}; -use crate::repl::ReplSession; - -fn callstack_error_json(message: &str) -> String { - serde_json::json!({ - "error": message, - "frames": [], - }) - .to_string() -} - -#[pyfunction] -pub fn should_enable_probing() -> bool { - crate::python::should_enable_probing() -} - -#[pyfunction] -pub fn is_enabled() -> bool { - crate::python::is_enabled() -} - -#[pyfunction] -pub fn query_json(_py: Python, sql: String) -> PyResult { - with_detached_native(move || { - let bridge = block_on(async move { ENGINE.read().await.async_query(sql.as_str()).await }) - .map_err(|e| runtime_err(format!("probing runtime unavailable: {e}")))?; - match bridge { - Ok(Some(df)) => serde_json::to_string(&df).map_err(runtime_err), - Ok(None) => Err(pyo3::exceptions::PyRuntimeError::new_err( - "query returned nil (no tabular result; e.g. SET or non-SELECT)", - )), - Err(e) => Err(runtime_err(format!("engine SQL failed: {e}"))), - } - }) -} - -/// HTTP `GET /apis/pythonext/callstack` backend. -/// -/// Always returns JSON (never raises into Python) so concurrent stack capture -/// cannot take down the training process via PyO3 exception propagation. -#[pyfunction] -#[pyo3(signature = (tid=None))] -pub fn api_callstack(tid: Option) -> PyResult { - let payload = catch_unwind(AssertUnwindSafe(|| { - let tid = tid.filter(|&t| t != 0); - match SignalTracer.trace(tid) { - Ok(frames) => match serde_json::to_string(&frames) { - Ok(json) => json, - Err(e) => callstack_error_json(&format!("failed to encode callstack: {e}")), - }, - Err(e) if is_backtrace_busy(&e) => callstack_error_json("callstack capture busy"), - Err(e) => callstack_error_json(&e.to_string()), - } - })); - Ok(match payload { - Ok(json) => json, - Err(_) => callstack_error_json("callstack capture panicked"), - }) -} - -/// HTTP `POST /apis/pythonext/eval` backend. -#[pyfunction] -pub fn api_eval(code: &str) -> PyResult { - log::debug!("Python eval code: {code}"); - let mut session = ReplSession::new(); - let out = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| session.eval_code(code))); - match out { - Ok(s) => Ok(s), - Err(_) => Ok(serde_json::json!({"error": "REPL execution panicked"}).to_string()), - } -} diff --git a/probing/extensions/python/src/features/stack_tracer.rs b/probing/extensions/python/src/features/stack_tracer.rs deleted file mode 100644 index 9312783d..00000000 --- a/probing/extensions/python/src/features/stack_tracer.rs +++ /dev/null @@ -1,183 +0,0 @@ -use std::collections::HashMap; -use std::panic::{catch_unwind, AssertUnwindSafe}; -use std::time::Duration; - -use anyhow::Result; -use async_trait::async_trait; -use once_cell::sync::Lazy; -use pyo3::Python; - -use probing_proto::prelude::CallFrame; - -use probing_core::is_python_main_thread; - -use crate::features::stack_capture::{self, RawStackSnapshot}; -use crate::features::stack_merge::merged_frames_to_folded_segments; -use crate::features::stack_merge::{demangle_native_symbol, merge_python_native_stacks}; -use crate::features::vm_tracer::get_python_stacks_raw; - -#[derive(Debug, thiserror::Error)] -#[error("backtrace capture busy: {0}")] -pub(crate) struct BacktraceBusy(String); - -pub(crate) fn is_backtrace_busy(err: &anyhow::Error) -> bool { - err.downcast_ref::().is_some() -} - -#[async_trait] -pub trait StackTracer: Send + Sync + std::fmt::Debug { - fn trace(&self, tid: Option) -> Result>; -} - -#[derive(Debug)] -pub struct SignalTracer; - -impl SignalTracer { - /// Walk the current thread without signals (safe under any Python runtime layout). - pub fn trace_current_thread_merged() -> Vec { - let mut native_leaf_to_root = Vec::new(); - backtrace::trace(|frame| { - let ip = frame.ip(); - backtrace::resolve_frame(frame, |symbol| { - let symbol_address = symbol.addr().unwrap_or(ip); - let (func_name, lang) = symbol - .name() - .and_then(|name| name.as_str()) - .map(demangle_native_symbol) - .unwrap_or_else(|| (format!("unknown@{symbol_address:p}"), None)); - let file_name = symbol - .filename() - .map(|path| path.to_string_lossy().into_owned()) - .unwrap_or_default(); - native_leaf_to_root.push(CallFrame::CFrame { - ip: format!("{ip:p}"), - file: file_name, - func: func_name, - lineno: symbol.lineno().unwrap_or(0) as i64, - lang: lang.map(str::to_string), - }); - }); - true - }); - - let python = Python::attach(|_py| get_python_stacks_raw()); - if python.is_empty() { - native_leaf_to_root.reverse(); - return native_leaf_to_root; - } - if native_leaf_to_root.is_empty() { - return python; - } - merge_python_native_stacks(&python, &native_leaf_to_root) - } - - fn merged_from_snapshot(snapshot: &RawStackSnapshot) -> Vec { - let mut cache = HashMap::new(); - stack_capture::snapshot_to_merged_frames(snapshot, &mut cache) - } - - /// Read the Python main thread stack without SIGUSR2 (safe from HTTP / SQL workers). - fn trace_main_thread_off_signal() -> Result> { - let main_tid = stack_capture::python_main_os_tid() - .ok_or_else(|| anyhow::anyhow!("Python main thread is not registered yet"))?; - - if let Some(snapshot) = stack_capture::latest_snapshot_for_tid(main_tid) { - return Ok(Self::merged_from_snapshot(&snapshot)); - } - - if let Some(snapshot) = stack_capture::copy_registered_py_snapshot(main_tid) { - let frames = Self::merged_from_snapshot(&snapshot); - if !frames.is_empty() { - return Ok(frames); - } - } - - Err(anyhow::anyhow!( - "main-thread stack unavailable; enable SIGPROF sampling or retry while training is active" - )) - } - - fn is_main_tid(tid: i32) -> bool { - stack_capture::python_main_os_tid().is_some_and(|main| main == tid as u64) - } - - fn trace_thread_signal(tid: i32) -> Result> { - if Self::is_main_tid(tid) { - return Self::trace_main_thread_off_signal(); - } - - if stack_capture::is_pprof_sampling_active() { - if let Some(snapshot) = stack_capture::latest_snapshot_for_tid(tid as u64) { - return Ok(Self::merged_from_snapshot(&snapshot)); - } - } - - let _guard = BACKTRACE_MUTEX.try_lock().map_err(|e| { - let busy = BacktraceBusy(e.to_string()); - log::debug!("{busy}; skipping concurrent request"); - anyhow::Error::new(busy) - })?; - - let snapshot = - stack_capture::capture_thread_snapshot_signal(tid as u64, Duration::from_secs(2)) - .ok_or_else(|| { - anyhow::anyhow!("timed out waiting for stack snapshot on thread {tid}") - })?; - - Ok(Self::merged_from_snapshot(&snapshot)) - } -} - -/// On-demand main-thread stack as a single folded line (`"stack 1"`). -pub fn main_thread_on_demand_folded_lines() -> Vec { - let frames = match SignalTracer::trace_main_thread_off_signal() { - Ok(frames) if !frames.is_empty() => frames, - _ => return Vec::new(), - }; - let segments = merged_frames_to_folded_segments(&frames); - if segments.is_empty() { - return Vec::new(); - } - vec![format!("{} 1", segments.join(";"))] -} - -#[async_trait] -impl StackTracer for SignalTracer { - fn trace(&self, tid: Option) -> Result> { - log::debug!("Collecting backtrace for TID: {tid:?}"); - - let explicit = tid.filter(|&t| t > 0); - - if explicit.is_none() { - if is_python_main_thread() { - return Ok(Self::trace_current_thread_merged()); - } - return Self::trace_main_thread_off_signal(); - } - - let target = explicit.unwrap(); - if Self::is_main_tid(target) { - return Self::trace_main_thread_off_signal(); - } - - match catch_unwind(AssertUnwindSafe(|| Self::trace_thread_signal(target))) { - Ok(Ok(frames)) => Ok(frames), - Ok(Err(err)) => { - if is_backtrace_busy(&err) { - log::debug!("Cross-thread stack trace skipped for tid {target}: {err}"); - } else { - log::warn!("Cross-thread stack trace failed for tid {target}: {err}"); - } - Err(err) - } - Err(_) => { - log::warn!("Cross-thread stack trace panicked for tid {target}"); - Err(anyhow::anyhow!( - "cross-thread stack trace panicked for tid {target}" - )) - } - } - } -} - -static BACKTRACE_MUTEX: Lazy> = Lazy::new(|| tokio::sync::Mutex::new(())); diff --git a/probing/extensions/python/src/features/stack_capture.rs b/probing/extensions/python/src/features/stacktrace/capture.rs similarity index 55% rename from probing/extensions/python/src/features/stack_capture.rs rename to probing/extensions/python/src/features/stacktrace/capture.rs index 522b299a..d5752b31 100644 --- a/probing/extensions/python/src/features/stack_capture.rs +++ b/probing/extensions/python/src/features/stacktrace/capture.rs @@ -1,8 +1,7 @@ -//! Async-signal-safe stack snapshotting shared by SIGPROF and SIGUSR2. +//! Async-signal-safe fill of [`StackSnapshot`] for SIGPROF and SIGUSR2. //! -//! Signal handlers only copy raw PCs and eval-hook frame keys into a fixed POD -//! struct. Symbolization and Python/native merge happen off the signal path via -//! [`snapshot_to_merged_frames`]. +//! Handlers only copy raw PCs and eval-hook keys. Symbolize / merge / fold live +//! in [`crate::features::stacktrace::parse`] and [`crate::features::stacktrace::fold`]. use std::cell::UnsafeCell; use std::collections::HashMap; @@ -15,41 +14,15 @@ use nix::libc; use once_cell::sync::Lazy; use probing_proto::prelude::CallFrame; -use crate::features::spy::call::RawCallLocation; -use crate::features::spy::spy_tls_addrs; -use crate::features::stack_merge::{demangle_native_symbol, merge_python_native_stacks}; +use crate::features::stacktrace::merge::demangle_native_symbol; +use crate::features::stacktrace::spy::call::RawCallLocation; +use crate::features::stacktrace::spy::spy_tls_addrs; -pub const MAX_NATIVE: usize = 48; -pub const MAX_PY: usize = 128; -const REG_SIZE: usize = 1024; - -/// Fixed-size POD snapshot copied from signal handlers. -#[derive(Clone, Copy)] -pub struct RawStackSnapshot { - pub tid: u64, - pub native_len: u32, - pub py_len: u32, - /// Native return addresses, leaf -> root. - pub native: [usize; MAX_NATIVE], - /// Callee `PyCodeObject` pointers, outermost -> innermost (`PYSTACKS` order). - pub py: [usize; MAX_PY], -} - -impl RawStackSnapshot { - pub fn zeroed() -> Self { - RawStackSnapshot { - tid: 0, - native_len: 0, - py_len: 0, - native: [0usize; MAX_NATIVE], - py: [0usize; MAX_PY], - } - } +pub use crate::features::stacktrace::snapshot::{ + RawStackSnapshot, StackFlags, StackSnapshot, StackSource, MAX_NATIVE, MAX_PY, +}; - pub fn is_empty(&self) -> bool { - self.native_len == 0 && self.py_len == 0 - } -} +const REG_SIZE: usize = 1024; // --------------------------------------------------------------------------- // Python-thread registry (TLS pointers resolved in normal context) @@ -61,7 +34,7 @@ struct ThreadSlot { writing: AtomicPtr, stack_lo: AtomicUsize, stack_hi: AtomicUsize, - latest: UnsafeCell, + latest: UnsafeCell, latest_seq: AtomicU64, } @@ -75,13 +48,7 @@ static REG_TABLE: [ThreadSlot; REG_SIZE] = [const { writing: AtomicPtr::new(std::ptr::null_mut()), stack_lo: AtomicUsize::new(0), stack_hi: AtomicUsize::new(0), - latest: UnsafeCell::new(RawStackSnapshot { - tid: 0, - native_len: 0, - py_len: 0, - native: [0usize; MAX_NATIVE], - py: [0usize; MAX_PY], - }), + latest: UnsafeCell::new(StackSnapshot::zeroed()), latest_seq: AtomicU64::new(0), } }; REG_SIZE]; @@ -92,6 +59,7 @@ static PPROF_SAMPLING_ACTIVE: AtomicBool = AtomicBool::new(false); /// Record the Python main thread's OS tid (pthread id on macOS, gettid on Linux). pub fn register_main_os_tid() { + ensure_signal_altstack(); let tid = current_tid(); if tid == 0 { return; @@ -118,6 +86,9 @@ pub fn is_pprof_sampling_active() -> bool { thread_local! { static THREAD_REGISTERED: std::cell::UnsafeCell = const { std::cell::UnsafeCell::new(false) }; + /// Per-thread signal alt stack installed (`sigaltstack` is per-thread on Darwin/Linux). + #[cfg(unix)] + static THREAD_ALTSTACK_READY: std::cell::Cell = const { std::cell::Cell::new(false) }; } static THREAD_NAMES: Lazy>> = Lazy::new(|| RwLock::new(HashMap::new())); @@ -233,6 +204,9 @@ pub fn register_python_thread() { *flag.get() = true; false }); + // Always ensure alt stack on this thread (idempotent) — even on re-entry + // after fork / late attach, so SIGPROF/SIGUSR2 never run on the training stack. + ensure_signal_altstack(); if already { return; } @@ -299,14 +273,20 @@ fn thread_slot(tid: u64) -> Option<&'static ThreadSlot> { } /// Copy the registered thread's Python stack (PYSTACKS) without delivering a signal. -pub fn copy_registered_py_snapshot(tid: u64) -> Option { +pub fn copy_registered_py_snapshot(tid: u64) -> Option { let slot = thread_slot(tid)?; - let mut sample = RawStackSnapshot::zeroed(); + let mut sample = StackSnapshot::zeroed(); sample.tid = tid; + sample.source = StackSource::Vm; let wr = slot.writing.load(Ordering::Acquire); let ps = slot.pystacks.load(Ordering::Acquire); - if wr.is_null() || ps.is_null() || unsafe { *wr } { + if wr.is_null() || ps.is_null() { + sample.flags.insert(StackFlags::PY_ABSENT); + return None; + } + if unsafe { *wr } { + sample.flags.insert(StackFlags::PY_TORN); return None; } compiler_fence(Ordering::SeqCst); @@ -317,19 +297,38 @@ pub fn copy_registered_py_snapshot(tid: u64) -> Option { } compiler_fence(Ordering::SeqCst); if unsafe { *wr } { + sample.flags.insert(StackFlags::PY_TORN); return None; } sample.py_len = n as u32; + if stacks.len() > MAX_PY { + sample.flags.insert(StackFlags::PY_TRUNCATED); + } if sample.is_empty() { + sample.flags.insert(StackFlags::PY_ABSENT); None } else { Some(sample) } } -/// Store the latest SIGPROF snapshot for a thread so on-demand SIGUSR2 capture -/// can reuse it without delivering another signal. -pub fn store_latest_snapshot(snapshot: &RawStackSnapshot) { +/// Whether a latest-slot read is consistent and belongs to `tid`. +fn latest_snapshot_read_ok( + seq_before: u64, + seq_after: u64, + snap: &StackSnapshot, + tid: u64, +) -> bool { + seq_before != 0 && seq_before == seq_after && snap.tid == tid && !snap.is_empty() +} + +/// Whether a SIGUSR2 snapshot may be published / accepted for `target_tid`. +fn sigusr2_snapshot_matches_target(snap: &StackSnapshot, target_tid: u64) -> bool { + target_tid != 0 && !snap.is_empty() && snap.tid == target_tid +} + +/// Store the latest SIGPROF snapshot for a thread so on-demand capture can reuse it. +pub fn store_latest_snapshot(snapshot: &StackSnapshot) { if snapshot.is_empty() { return; } @@ -337,13 +336,48 @@ pub fn store_latest_snapshot(snapshot: &RawStackSnapshot) { return; }; unsafe { - *slot.latest.get() = *snapshot; + // Avoid a Rust temporary of the full POD (can blow a near-full training stack). + core::ptr::copy_nonoverlapping(snapshot, slot.latest.get(), 1); } slot.latest_seq.fetch_add(1, Ordering::Release); } +/// Fill the current thread's latest slot from `uctx` (no large stack locals). +/// +/// # Safety +/// Same as [`fill_raw_snapshot`]. +pub unsafe fn fill_latest_from_uctx(uctx: *mut c_void, source: StackSource) -> bool { + fill_latest_from_uctx_with(uctx, source, FillOpts::default()) +} + +/// # Safety +/// Same as [`fill_raw_snapshot`]. +pub unsafe fn fill_latest_from_uctx_with( + uctx: *mut c_void, + source: StackSource, + opts: FillOpts, +) -> bool { + let tid = current_tid(); + let Some(slot) = thread_slot(tid) else { + return false; + }; + let latest = &mut *slot.latest.get(); + fill_raw_snapshot_with(latest, uctx, opts); + latest.source = source; + if latest.is_empty() { + return false; + } + slot.latest_seq.fetch_add(1, Ordering::Release); + true +} + /// Reuse the latest SIGPROF snapshot for `tid` when CPU sampling is active. -pub fn latest_snapshot_for_tid(tid: u64) -> Option { +pub fn latest_snapshot_for_tid(tid: u64) -> Option { + latest_snapshot_with_seq(tid).map(|(snap, _)| snap) +} + +/// Like [`latest_snapshot_for_tid`], also returning the slot generation for view caches. +pub fn latest_snapshot_with_seq(tid: u64) -> Option<(StackSnapshot, u64)> { let slot = thread_slot(tid)?; for _ in 0..4 { let seq_before = slot.latest_seq.load(Ordering::Acquire); @@ -352,8 +386,8 @@ pub fn latest_snapshot_for_tid(tid: u64) -> Option { } let snap = unsafe { *slot.latest.get() }; let seq_after = slot.latest_seq.load(Ordering::Acquire); - if seq_before == seq_after && snap.tid == tid && !snap.is_empty() { - return Some(snap); + if latest_snapshot_read_ok(seq_before, seq_after, &snap, tid) { + return Some((snap, seq_after)); } } None @@ -391,7 +425,7 @@ pub fn clear_py_symbols() { } } -fn resolve_py_label(key: usize) -> String { +pub(crate) fn resolve_py_label(key: usize) -> String { if key != 0 { if let Ok(g) = PY_SYMBOLS.read() { if let Some(sym) = g.get(&key) { @@ -402,7 +436,7 @@ fn resolve_py_label(key: usize) -> String { "[py] ".to_string() } -fn resolve_py_call_frame(key: usize) -> CallFrame { +pub(crate) fn resolve_py_call_frame(key: usize) -> CallFrame { if key != 0 { if let Ok(g) = PY_SYMBOLS.read() { if let Some(sym) = g.get(&key) { @@ -418,8 +452,23 @@ fn resolve_py_call_frame(key: usize) -> CallFrame { } } +/// Canonicalize user-space pointers (strip top-byte / PAC bits on aarch64). +#[inline] +fn strip_ptr_tag(p: usize) -> usize { + #[cfg(target_arch = "aarch64")] + { + // Keep low 48 bits — safe for both TBI and pointer-auth tags. + p & ((1usize << 48) - 1) + } + #[cfg(not(target_arch = "aarch64"))] + { + p + } +} + #[inline] fn plausible(p: usize) -> bool { + let p = strip_ptr_tag(p); (0x1000..0x0001_0000_0000_0000).contains(&p) } @@ -434,25 +483,42 @@ unsafe fn regs_from_uctx(uctx: *mut c_void) -> (usize, usize) { let mc = &(*uc).uc_mcontext; let pc = mc.gregs[libc::REG_RIP as usize] as usize; let fp = mc.gregs[libc::REG_RBP as usize] as usize; - (pc, fp) + (strip_ptr_tag(pc), strip_ptr_tag(fp)) } #[cfg(all(target_os = "linux", target_arch = "aarch64"))] { let uc = uctx as *const libc::ucontext_t; let mc = &(*uc).uc_mcontext; - (mc.pc as usize, mc.regs[29] as usize) + ( + strip_ptr_tag(mc.pc as usize), + strip_ptr_tag(mc.regs[29] as usize), + ) } #[cfg(all(target_os = "macos", target_arch = "x86_64"))] { let uc = uctx as *const libc::ucontext_t; - let ss = &(*(*uc).uc_mcontext).__ss; - (ss.__rip as usize, ss.__rbp as usize) + let mc = (*uc).uc_mcontext; + if mc.is_null() { + return (0, 0); + } + let ss = &(*mc).__ss; + ( + strip_ptr_tag(ss.__rip as usize), + strip_ptr_tag(ss.__rbp as usize), + ) } #[cfg(all(target_os = "macos", target_arch = "aarch64"))] { let uc = uctx as *const libc::ucontext_t; - let ss = &(*(*uc).uc_mcontext).__ss; - (ss.__pc as usize, ss.__fp as usize) + let mc = (*uc).uc_mcontext; + if mc.is_null() { + return (0, 0); + } + let ss = &(*mc).__ss; + ( + strip_ptr_tag(ss.__pc as usize), + strip_ptr_tag(ss.__fp as usize), + ) } #[cfg(not(any( all(target_os = "linux", target_arch = "x86_64"), @@ -467,17 +533,20 @@ unsafe fn regs_from_uctx(uctx: *mut c_void) -> (usize, usize) { unsafe fn walk_frame_pointers(start_fp: usize, out: &mut [usize], lo: usize, hi: usize) -> usize { let bounded = hi != 0 && lo < hi; + // Without registered stack bounds, do not walk far — unbounded FP walks on a + // deep training stack have caused signal-stack overflows / resume SIGILL. + let max = if bounded { out.len() } else { out.len().min(8) }; let in_stack = |fp: usize| !bounded || (fp >= lo && fp + 2 * std::mem::size_of::() <= hi); - let mut fp = start_fp; + let mut fp = strip_ptr_tag(start_fp); let mut count = 0usize; - while count < out.len() { + while count < max { if !plausible(fp) || (fp & 0x7) != 0 || !in_stack(fp) { break; } - let saved_fp = *(fp as *const usize); - let ret = *((fp + std::mem::size_of::()) as *const usize); + let saved_fp = strip_ptr_tag(*(fp as *const usize)); + let ret = strip_ptr_tag(*((fp + std::mem::size_of::()) as *const usize)); if !plausible(ret) { break; } @@ -491,19 +560,69 @@ unsafe fn walk_frame_pointers(start_fp: usize, out: &mut [usize], lo: usize, hi: count } -/// Async-signal-safe snapshot of the interrupted thread's native + Python stacks. +/// Options for signal-safe snapshot fill. +#[derive(Clone, Copy, Debug)] +pub struct FillOpts { + /// Walk frame pointers beyond the interrupted PC. Off for on-demand + /// `SIGUSR2` (UI refresh) — cheaper and less likely to disturb resume state. + pub walk_native: bool, +} + +impl Default for FillOpts { + fn default() -> Self { + Self { walk_native: true } + } +} + +/// Whether the calling thread is currently running on its signal alt stack. +#[cfg(unix)] +#[inline] +pub fn on_signal_altstack() -> bool { + unsafe { + let mut cur: libc::stack_t = std::mem::zeroed(); + if libc::sigaltstack(std::ptr::null(), &mut cur) != 0 { + return false; + } + (cur.ss_flags & libc::SS_ONSTACK) != 0 + } +} + +#[cfg(not(unix))] +#[inline] +pub fn on_signal_altstack() -> bool { + false +} + +/// Fill `out` from `ucontext` + registered `PYSTACKS` (async-signal-safe). +/// +/// Prefer this over returning [`StackSnapshot`] by value in signal handlers. +/// Caller sets [`StackSnapshot::source`]. /// /// # Safety /// -/// `uctx` must be a valid `ucontext_t` pointer from a signal handler (or null, -/// in which case native registers are skipped). Must only be called from an -/// async-signal-safe context on the interrupted thread; the returned snapshot -/// must not be shared with concurrent writers without synchronization. -pub unsafe fn capture_raw_snapshot(uctx: *mut c_void) -> RawStackSnapshot { - let mut sample = RawStackSnapshot::zeroed(); - sample.tid = current_tid(); - - let slot = thread_slot(sample.tid); +/// `uctx` must be a valid `ucontext_t` from a signal handler (or null). +/// `out` must not be shared with concurrent writers. +pub unsafe fn fill_raw_snapshot(out: &mut StackSnapshot, uctx: *mut c_void) { + fill_raw_snapshot_with(out, uctx, FillOpts::default()); +} + +/// Like [`fill_raw_snapshot`] with explicit options. +/// +/// # Safety +/// +/// Same as [`fill_raw_snapshot`]: `uctx` must be a valid `ucontext_t` from a +/// signal handler (or null); `out` must not be shared with concurrent writers. +pub unsafe fn fill_raw_snapshot_with(out: &mut StackSnapshot, uctx: *mut c_void, opts: FillOpts) { + // Zero in place — NEVER `*out = StackSnapshot::zeroed()` which materializes + // a ~1.4 KiB stack temporary and has caused resume SIGILL at `_platform_strlen`. + core::ptr::write_bytes( + out as *mut StackSnapshot as *mut u8, + 0, + core::mem::size_of::(), + ); + out.tid = current_tid(); + + let slot = thread_slot(out.tid); let (lo, hi) = match slot { Some(s) => ( s.stack_lo.load(Ordering::Acquire), @@ -515,32 +634,113 @@ pub unsafe fn capture_raw_snapshot(uctx: *mut c_void) -> RawStackSnapshot { let (pc, fp) = regs_from_uctx(uctx); let mut nlen = 0usize; if plausible(pc) { - sample.native[nlen] = pc; + out.native[nlen] = pc; nlen += 1; } - if nlen < MAX_NATIVE { - nlen += walk_frame_pointers(fp, &mut sample.native[nlen..], lo, hi); + if opts.walk_native && nlen < MAX_NATIVE { + nlen += walk_frame_pointers(fp, &mut out.native[nlen..], lo, hi); + } + out.native_len = nlen as u32; + if opts.walk_native && nlen == MAX_NATIVE { + out.flags.insert(StackFlags::NATIVE_TRUNCATED); } - sample.native_len = nlen as u32; if let Some(slot) = slot { let wr = slot.writing.load(Ordering::Acquire); let ps = slot.pystacks.load(Ordering::Acquire); - if !wr.is_null() && !ps.is_null() && !*wr { + if wr.is_null() || ps.is_null() { + out.flags.insert(StackFlags::PY_ABSENT); + } else if *wr { + out.flags.insert(StackFlags::PY_TORN); + } else { compiler_fence(Ordering::SeqCst); let stacks = &*ps; let n = stacks.len().min(MAX_PY); for (i, stack) in stacks.iter().enumerate().take(n) { - sample.py[i] = stack.callee(); + out.py[i] = stack.callee(); } compiler_fence(Ordering::SeqCst); - sample.py_len = if *wr { 0 } else { n as u32 }; + if *wr { + out.py_len = 0; + out.flags.insert(StackFlags::PY_TORN); + } else { + out.py_len = n as u32; + if stacks.len() > MAX_PY { + out.flags.insert(StackFlags::PY_TRUNCATED); + } + } } + } else { + out.flags.insert(StackFlags::PY_ABSENT); } +} +/// Convenience wrapper (not for deep signal paths — prefer [`fill_raw_snapshot`]). +/// +/// # Safety +/// +/// Same as [`fill_raw_snapshot`]: `uctx` must be a valid `ucontext_t` from a +/// signal handler (or null). +pub unsafe fn capture_raw_snapshot(uctx: *mut c_void) -> StackSnapshot { + let mut sample = StackSnapshot::zeroed(); + fill_raw_snapshot(&mut sample, uctx); sample } +/// Install a **per-thread** signal alt stack for `SA_ONSTACK` handlers. +/// +/// Critical on Darwin/Linux: `sigaltstack` is not process-wide. Installing only +/// on the HTTP / init thread leaves the Python main thread without an alt stack; +/// SIGPROF/SIGUSR2 then run on a deep training stack and resume as `SIGILL` +/// (observed at `_platform_strlen` after signal-frame corruption). +/// Minimum alt-stack size shared with the crash handler (256 KiB). +const SIGNAL_ALTSTACK_BYTES: usize = 256 * 1024; + +#[cfg(unix)] +pub fn ensure_signal_altstack() { + THREAD_ALTSTACK_READY.with(|ready| { + if ready.get() { + return; + } + unsafe { + // Reuse crash-handler / prior alt stack — do NOT replace a larger + // stack with a smaller one (that made SIGILL backtraces empty and + // left stack capture on an undersized buffer). + let mut cur: libc::stack_t = std::mem::zeroed(); + if libc::sigaltstack(std::ptr::null(), &mut cur) == 0 + && (cur.ss_flags & libc::SS_DISABLE) == 0 + && cur.ss_size >= SIGNAL_ALTSTACK_BYTES + { + ready.set(true); + return; + } + } + let mut buf = vec![0u8; SIGNAL_ALTSTACK_BYTES]; + let sp = buf.as_mut_ptr() as *mut c_void; + let size = buf.len(); + std::mem::forget(buf); + unsafe { + let ss = libc::stack_t { + ss_sp: sp, + ss_size: size, + ss_flags: 0, + }; + if libc::sigaltstack(&ss, std::ptr::null_mut()) != 0 { + log::warn!( + "probing: per-thread sigaltstack failed (tid={}); \ + SIGPROF/SIGUSR2 may be unsafe on deep stacks", + current_tid() + ); + return; + } + } + ready.set(true); + }); +} + +#[cfg(not(unix))] +pub fn ensure_signal_altstack() {} + pub fn symbolize_native_addr(addr: usize, cache: &mut HashMap) -> CallFrame { if let Some(frame) = cache.get(&addr) { return frame.clone(); @@ -574,67 +774,14 @@ pub fn symbolize_native_addr(addr: usize, cache: &mut HashMap) frame } -/// Best-effort symbolize + merge off the signal path. Never propagates errors. -pub fn snapshot_to_merged_frames( - snapshot: &RawStackSnapshot, - cache: &mut HashMap, -) -> Vec { - let nlen = snapshot.native_len as usize; - let plen = snapshot.py_len as usize; - - let native_leaf_to_root: Vec = (0..nlen) - .map(|i| { - let resolve_addr = if i == 0 { - snapshot.native[i] - } else { - snapshot.native[i].wrapping_sub(1) - }; - symbolize_native_addr(resolve_addr, cache) - }) - .collect(); - - let python_outer_to_inner: Vec = snapshot.py[..plen] - .iter() - .map(|&key| resolve_py_call_frame(key)) - .collect(); - - merge_python_native_stacks(&python_outer_to_inner, &native_leaf_to_root) -} - -pub fn snapshot_to_folded_line( - snapshot: &RawStackSnapshot, - cache: &mut HashMap, -) -> String { - let merged = snapshot_to_merged_frames(snapshot, cache); - if merged.is_empty() { - return String::new(); - } - let segments = crate::features::stack_merge::merged_frames_to_folded_segments(&merged); - let mut line = match thread_name(snapshot.tid) { - Some(name) => format!("thread-{} ({})", snapshot.tid, name), - None => format!("thread-{}", snapshot.tid), - }; - for seg in segments { - line.push(';'); - line.push_str(&seg); - } - line -} - // --------------------------------------------------------------------------- // SIGUSR2 on-demand capture (same safe handler body as SIGPROF) // --------------------------------------------------------------------------- -struct Sigusr2SnapshotSlot(UnsafeCell); +struct Sigusr2SnapshotSlot(UnsafeCell); unsafe impl Sync for Sigusr2SnapshotSlot {} -const ZERO_SNAPSHOT: RawStackSnapshot = RawStackSnapshot { - tid: 0, - native_len: 0, - py_len: 0, - native: [0usize; MAX_NATIVE], - py: [0usize; MAX_PY], -}; +const ZERO_SNAPSHOT: StackSnapshot = StackSnapshot::zeroed(); static SIGUSR2_HANDLER_INSTALLED: AtomicBool = AtomicBool::new(false); static SIGUSR2_ARMED: AtomicBool = AtomicBool::new(false); @@ -652,7 +799,7 @@ pub fn set_sigusr2_armed(armed: bool) { SIGUSR2_ARMED.store(armed, Ordering::Release); } -pub fn take_sigusr2_snapshot(after_seq: u64) -> Option { +pub fn take_sigusr2_snapshot(after_seq: u64) -> Option { if SIGUSR2_SEQ.load(Ordering::Acquire) <= after_seq { return None; } @@ -683,7 +830,7 @@ impl Drop for Sigusr2ArmGuard { /// Arm, deliver SIGUSR2 to `tid`, and wait for an async-signal-safe snapshot slot. #[cfg(unix)] -pub fn capture_thread_snapshot_signal(tid: u64, timeout: Duration) -> Option { +pub fn capture_thread_snapshot_signal(tid: u64, timeout: Duration) -> Option { use std::time::Instant; let _guard = Sigusr2ArmGuard::new(tid); @@ -715,7 +862,7 @@ pub fn capture_thread_snapshot_signal(tid: u64, timeout: Duration) -> Option Option Option { +pub fn capture_thread_snapshot_signal(_tid: u64, _timeout: Duration) -> Option { None } @@ -734,11 +881,14 @@ pub fn install_sigusr2_handler() { if SIGUSR2_HANDLER_INSTALLED.swap(true, Ordering::AcqRel) { return; } + ensure_signal_altstack(); unsafe { let mut sa: libc::sigaction = std::mem::zeroed(); sa.sa_sigaction = sigusr2_stack_handler as *const () as usize; - sa.sa_flags = libc::SA_SIGINFO | libc::SA_RESTART; + sa.sa_flags = libc::SA_SIGINFO | libc::SA_RESTART | libc::SA_ONSTACK; libc::sigemptyset(&mut sa.sa_mask); + // Avoid nesting with SIGPROF while filling on the shared alt stack. + libc::sigaddset(&mut sa.sa_mask, libc::SIGPROF); libc::sigaction(libc::SIGUSR2, &sa, std::ptr::null_mut()); } } @@ -752,27 +902,72 @@ unsafe extern "C" fn sigusr2_stack_handler( if !SIGUSR2_ARMED.load(Ordering::Acquire) { return; } - let target = SIGUSR2_TARGET_TID.load(Ordering::Acquire); - if target == 0 { + // Refuse to run on the training stack — would corrupt resume into SIGILL. + if !on_signal_altstack() { return; } - let snapshot = capture_raw_snapshot(uctx); - if snapshot.is_empty() || snapshot.tid != target { + let target = SIGUSR2_TARGET_TID.load(Ordering::Acquire); + let slot = &mut *SIGUSR2_SNAPSHOT.0.get(); + // On-demand UI capture: PC + Python keys only (no FP walk). + fill_raw_snapshot_with(slot, uctx, FillOpts { walk_native: false }); + slot.source = StackSource::Sigusr2; + if !sigusr2_snapshot_matches_target(slot, target) { + core::ptr::write_bytes( + slot as *mut StackSnapshot as *mut u8, + 0, + core::mem::size_of::(), + ); return; } - unsafe { - *SIGUSR2_SNAPSHOT.0.get() = snapshot; - } SIGUSR2_SEQ.fetch_add(1, Ordering::Release); } #[cfg(not(unix))] pub fn install_sigusr2_handler() {} +/// Serialize process-global signal handler tests (SIGPROF / SIGUSR2). +#[cfg(all(test, unix))] +pub(crate) fn with_signal_test_lock(f: impl FnOnce() -> R) -> R { + use std::sync::{Mutex, OnceLock}; + static LOCK: OnceLock> = OnceLock::new(); + let lock = LOCK.get_or_init(|| Mutex::new(())); + let _guard = lock.lock().unwrap_or_else(|e| e.into_inner()); + f() +} + #[cfg(test)] mod tests { use super::*; + fn sample_with_tid(tid: u64) -> StackSnapshot { + let mut s = StackSnapshot::zeroed(); + s.source = StackSource::Sigusr2; + s.tid = tid; + s.py_len = 1; + s.py[0] = 0x1000; + s + } + + fn claim_test_slot(tid: u64) { + let start = slot_hash(tid); + for i in 0..REG_SIZE { + let slot = ®_TABLE[(start + i) & (REG_SIZE - 1)]; + let v = slot.tid.load(Ordering::Acquire); + if v == tid { + return; + } + if v == 0 + && slot + .tid + .compare_exchange(0, tid, Ordering::AcqRel, Ordering::Acquire) + .is_ok() + { + return; + } + } + panic!("could not claim registry slot for tid={tid}"); + } + #[test] fn register_main_os_tid_is_idempotent() { register_main_os_tid(); @@ -811,4 +1006,60 @@ mod tests { other => panic!("expected PyFrame, got {other:?}"), } } + + #[test] + fn sigusr2_rejects_wrong_tid_and_empty_snapshot() { + let good = sample_with_tid(42); + assert!(sigusr2_snapshot_matches_target(&good, 42)); + assert!(!sigusr2_snapshot_matches_target(&good, 99)); + assert!(!sigusr2_snapshot_matches_target(&good, 0)); + assert!(!sigusr2_snapshot_matches_target( + &StackSnapshot::zeroed(), + 42 + )); + } + + #[test] + fn latest_snapshot_read_rejects_torn_or_mismatched_tid() { + let snap = sample_with_tid(7); + assert!(latest_snapshot_read_ok(3, 3, &snap, 7)); + assert!(!latest_snapshot_read_ok(0, 0, &snap, 7)); + assert!(!latest_snapshot_read_ok(3, 4, &snap, 7)); + assert!(!latest_snapshot_read_ok(3, 3, &snap, 8)); + assert!(!latest_snapshot_read_ok(3, 3, &StackSnapshot::zeroed(), 7)); + } + + #[test] + fn latest_snapshot_roundtrip_requires_registered_tid() { + // High tid to avoid colliding with live process threads during tests. + let tid = 0xC0FF_EE42u64; + claim_test_slot(tid); + let snap = sample_with_tid(tid); + store_latest_snapshot(&snap); + let got = latest_snapshot_for_tid(tid).expect("latest snapshot"); + assert_eq!(got.tid, tid); + assert_eq!(got.py_len, 1); + assert!(latest_snapshot_for_tid(tid + 1).is_none()); + } + + /// Real SIGUSR2 delivery → async-signal-safe fill → `native_len >= 1`. + #[cfg(unix)] + #[test] + fn sigusr2_signal_path_captures_native_pc() { + with_signal_test_lock(|| { + install_sigusr2_handler(); + register_python_thread(); + register_main_os_tid(); + let tid = current_tid(); + let snap = capture_thread_snapshot_signal(tid, Duration::from_secs(2)) + .expect("SIGUSR2 should publish a snapshot for the current thread"); + assert_eq!(snap.tid, tid); + assert_eq!(snap.source, StackSource::Sigusr2); + assert!( + snap.native_len >= 1, + "ucontext PC should yield at least one native frame, got native_len=0 flags={:?}", + snap.flags + ); + }); + } } diff --git a/probing/extensions/python/src/features/stacktrace/compact.rs b/probing/extensions/python/src/features/stacktrace/compact.rs new file mode 100644 index 00000000..c227672e --- /dev/null +++ b/probing/extensions/python/src/features/stacktrace/compact.rs @@ -0,0 +1,87 @@ +//! Heap-compact stack payload for sampler aggregation. +//! +//! Sampling stores one [`CompactStack`] per fingerprint bucket instead of a full +//! fixed-size [`StackSnapshot`] (~1.4 KiB of zero padding). Reconstruct a +//! snapshot only when folding/exporting. + +use crate::features::stacktrace::snapshot::{ + StackFlags, StackSnapshot, StackSource, MAX_NATIVE, MAX_PY, +}; + +/// Variable-length stack shape: only used native PCs + Python keys. +#[derive(Clone, Debug)] +pub struct CompactStack { + pub tid: u64, + pub source: StackSource, + pub flags: StackFlags, + native: Box<[usize]>, + py: Box<[usize]>, +} + +impl CompactStack { + pub fn from_snapshot(s: &StackSnapshot) -> Self { + let nlen = (s.native_len as usize).min(MAX_NATIVE); + let plen = (s.py_len as usize).min(MAX_PY); + Self { + tid: s.tid, + source: s.source, + flags: s.flags, + native: s.native[..nlen].into(), + py: s.py[..plen].into(), + } + } + + pub fn native(&self) -> &[usize] { + &self.native + } + + pub fn py(&self) -> &[usize] { + &self.py + } + + /// Rebuild a fixed POD snapshot for the parse/fold path. + pub fn to_snapshot(&self) -> StackSnapshot { + StackSnapshot::from_parts(self.tid, self.source, &self.native, &self.py, self.flags) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn roundtrip_preserves_used_frames() { + let snap = StackSnapshot::from_parts( + 7, + StackSource::Sigprof, + &[0x10, 0x20, 0x30], + &[0x100, 0x200], + StackFlags::empty(), + ); + let c = CompactStack::from_snapshot(&snap); + assert_eq!(c.native(), &[0x10, 0x20, 0x30]); + assert_eq!(c.py(), &[0x100, 0x200]); + let back = c.to_snapshot(); + assert_eq!(back.tid, 7); + assert_eq!(back.native_len, 3); + assert_eq!(back.py_len, 2); + assert_eq!(&back.native[..3], &[0x10, 0x20, 0x30]); + assert_eq!(&back.py[..2], &[0x100, 0x200]); + } + + #[test] + fn smaller_than_full_snapshot_for_short_stacks() { + let snap = StackSnapshot::from_parts( + 1, + StackSource::Sigprof, + &[1usize; 4], + &[2usize; 2], + StackFlags::empty(), + ); + let c = CompactStack::from_snapshot(&snap); + let compact_bytes = std::mem::size_of_val(&*c.native) + + std::mem::size_of_val(&*c.py) + + std::mem::size_of::(); + assert!(compact_bytes < std::mem::size_of::()); + } +} diff --git a/probing/extensions/python/src/features/stacktrace/fingerprint.rs b/probing/extensions/python/src/features/stacktrace/fingerprint.rs new file mode 100644 index 00000000..b1b5c45e --- /dev/null +++ b/probing/extensions/python/src/features/stacktrace/fingerprint.rs @@ -0,0 +1,101 @@ +//! Aggregation keys for stack samples (no symbolize / alloc). +//! +//! # Contract +//! +//! - Key covers **tid + flags + native PCs + Python keys** (not [`StackSource`]). +//! - The SIGPROF consumer currently **accepts only the Python main OS tid**; +//! including `tid` keeps buckets correct if multi-thread sampling is enabled later. +//! - Collisions are statistically rare; export folds a representative stack per bucket. + +use crate::features::stacktrace::compact::CompactStack; +use crate::features::stacktrace::snapshot::StackSnapshot; + +/// 64-bit FNV-1a style fingerprint over tid + flags + PCs + py keys. +pub fn fingerprint(snapshot: &StackSnapshot) -> u64 { + fingerprint_parts( + snapshot.tid, + snapshot.flags.0, + &snapshot.native[..snapshot.native_len as usize], + &snapshot.py[..snapshot.py_len as usize], + ) +} + +/// Same key as [`fingerprint`] for a compacted sampler payload. +pub fn fingerprint_compact(stack: &CompactStack) -> u64 { + fingerprint_parts(stack.tid, stack.flags.0, stack.native(), stack.py()) +} + +fn fingerprint_parts(tid: u64, flags: u16, native: &[usize], py: &[usize]) -> u64 { + const OFFSET: u64 = 0xcbf2_9ce4_8422_2325; + const PRIME: u64 = 0x0000_0100_0000_01b3; + + let mut h = OFFSET; + let mix = |h: &mut u64, v: u64| { + *h ^= v; + *h = h.wrapping_mul(PRIME); + }; + + mix(&mut h, tid); + mix(&mut h, native.len() as u64); + mix(&mut h, py.len() as u64); + mix(&mut h, flags as u64); + + for &pc in native { + mix(&mut h, pc as u64); + } + for &key in py { + mix(&mut h, key as u64); + } + h +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::features::stacktrace::snapshot::{StackFlags, StackSource}; + + #[test] + fn same_content_same_fingerprint() { + let a = StackSnapshot::from_parts( + 1, + StackSource::Sigprof, + &[0x10, 0x20], + &[0x100, 0x200], + StackFlags::empty(), + ); + let mut b = a; + b.source = StackSource::Sigusr2; // source is not part of the key + assert_eq!(fingerprint(&a), fingerprint(&b)); + assert_eq!( + fingerprint(&a), + fingerprint_compact(&CompactStack::from_snapshot(&a)) + ); + } + + #[test] + fn different_tid_different_fingerprint() { + let a = + StackSnapshot::from_parts(1, StackSource::Sigprof, &[0x10], &[], StackFlags::empty()); + let mut b = a; + b.tid = 2; + assert_ne!(fingerprint(&a), fingerprint(&b)); + } + + #[test] + fn different_pc_different_fingerprint() { + let a = + StackSnapshot::from_parts(1, StackSource::Sigprof, &[0x10], &[], StackFlags::empty()); + let b = + StackSnapshot::from_parts(1, StackSource::Sigprof, &[0x11], &[], StackFlags::empty()); + assert_ne!(fingerprint(&a), fingerprint(&b)); + } + + #[test] + fn different_py_key_different_fingerprint() { + let a = + StackSnapshot::from_parts(1, StackSource::Sigprof, &[], &[0xabc], StackFlags::empty()); + let b = + StackSnapshot::from_parts(1, StackSource::Sigprof, &[], &[0xabd], StackFlags::empty()); + assert_ne!(fingerprint(&a), fingerprint(&b)); + } +} diff --git a/probing/extensions/python/src/features/stacktrace/fold.rs b/probing/extensions/python/src/features/stacktrace/fold.rs new file mode 100644 index 00000000..ce3e3553 --- /dev/null +++ b/probing/extensions/python/src/features/stacktrace/fold.rs @@ -0,0 +1,342 @@ +//! [`ParsedStacks`] / [`StackSnapshot`] → [`FoldedStacks`] for flamegraphs. +//! +//! Aggregation and distributed merge operate on this layer. Prefer +//! [`fold_snapshot`] on the sampling consumer (avoids exposing intermediate +//! frames to callers that only need folded text). + +use std::collections::{BTreeSet, HashMap}; + +use probing_proto::prelude::CallFrame; + +use crate::features::stacktrace::capture::thread_name; +use crate::features::stacktrace::merge::merged_frames_to_folded_segments; +use crate::features::stacktrace::metrics; +use crate::features::stacktrace::parse::{parse_snapshot, ParsedStacks}; +use crate::features::stacktrace::snapshot::{StackSnapshot, StackSource}; + +/// Options for projecting frames into folded segments. +#[derive(Clone, Debug)] +pub struct FoldOptions { + /// Prefix `thread-{tid}` / `thread-{tid} (name)`. + pub thread_prefix: bool, + /// Strip interpreter / stdlib bootstrap (for cross-rank merge). + pub canonicalize: bool, + /// Sample count carried on this folded stack (usually 1 before aggregate). + pub count: u64, +} + +impl Default for FoldOptions { + fn default() -> Self { + Self { + thread_prefix: true, + canonicalize: true, + count: 1, + } + } +} + +/// Flamegraph-oriented stack: root → leaf segments + weight + optional ranks. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct FoldedStacks { + pub tid: u64, + pub source: StackSource, + pub segments: Vec, + pub count: u64, + pub ranks: Vec, +} + +impl FoldedStacks { + pub fn is_empty(&self) -> bool { + self.segments.is_empty() || self.count == 0 + } + + /// `"path count"` line used by classic folded-file consumers. + pub fn to_folded_line(&self) -> String { + if self.segments.is_empty() { + return String::new(); + } + format!("{} {}", self.segments.join(";"), self.count) + } + + /// Path string without count (aggregation key). + pub fn path_key(&self) -> String { + self.segments.join(";") + } + + /// Keep only `[py]` segments. + pub fn python_only(&self) -> Option { + let segments: Vec = self + .segments + .iter() + .filter(|s| s.starts_with("[py]")) + .cloned() + .collect(); + if segments.is_empty() { + return None; + } + Some(Self { + tid: self.tid, + source: self.source, + segments, + count: self.count, + ranks: self.ranks.clone(), + }) + } +} + +fn thread_prefix_segment(tid: u64) -> String { + match thread_name(tid) { + Some(name) => format!("thread-{tid} ({name})"), + None => format!("thread-{tid}"), + } +} + +/// Fold already-parsed frames. +pub fn fold_parsed(parsed: &ParsedStacks, opts: &FoldOptions) -> FoldedStacks { + metrics::inc_fold_call(); + let mut segments = if opts.canonicalize { + merged_frames_to_folded_segments(&parsed.frames) + } else { + raw_segments_from_frames(&parsed.frames) + }; + if opts.thread_prefix && !segments.is_empty() { + let mut with_thread = vec![thread_prefix_segment(parsed.tid)]; + with_thread.append(&mut segments); + segments = with_thread; + } + FoldedStacks { + tid: parsed.tid, + source: parsed.source, + segments, + count: opts.count.max(1), + ranks: Vec::new(), + } +} + +fn raw_segments_from_frames(frames: &[CallFrame]) -> Vec { + frames + .iter() + .map(|frame| match frame { + CallFrame::PyFrame { + file, func, lineno, .. + } => { + let base = file.rsplit(['/', '\\']).next().unwrap_or(file); + format!("[py] {func} ({base}:{lineno})") + } + CallFrame::CFrame { func, .. } => func.clone(), + }) + .collect() +} + +/// Snapshot → folded in one step (sampling / export fast path). +/// +/// Logically equivalent to `parse` then `fold_parsed` with the same options. +pub fn fold_snapshot( + snapshot: &StackSnapshot, + cache: &mut HashMap, + opts: &FoldOptions, +) -> FoldedStacks { + let parsed = parse_snapshot(snapshot, cache); + fold_parsed(&parsed, opts) +} + +impl StackSnapshot { + pub fn fold(&self, cache: &mut HashMap, opts: &FoldOptions) -> FoldedStacks { + fold_snapshot(self, cache, opts) + } +} + +impl ParsedStacks { + pub fn fold(&self, opts: &FoldOptions) -> FoldedStacks { + fold_parsed(self, opts) + } +} + +/// Merge folded stacks across ranks: sum counts, union ranks, canonicalize paths. +/// +/// Input lines are classic `"path count"` strings (optionally with thread prefixes). +pub fn merge_folded_attributed(sets: &[(Option, Vec)]) -> Vec { + let mut counts: HashMap = HashMap::new(); + let mut ranks: HashMap> = HashMap::new(); + let mut sources: HashMap = HashMap::new(); + + for (rank, stacks) in sets { + for stack in stacks { + let mut segs = stack.segments.clone(); + while segs.first().is_some_and(|s| s == "all") { + segs.remove(0); + } + while segs.first().is_some_and(|s| is_thread_folded_segment(s)) { + segs.remove(0); + } + let segs = crate::features::stacktrace::merge::canonicalize_folded_segments(&segs); + if segs.is_empty() { + continue; + } + let key = segs.join(";"); + *counts.entry(key.clone()).or_insert(0) += stack.count.max(1); + sources.entry(key.clone()).or_insert(stack.source); + if let Some(r) = rank { + ranks.entry(key).or_default().insert(*r); + } + } + } + + let mut merged: Vec = counts + .into_iter() + .map(|(key, count)| { + let segments: Vec = key.split(';').map(str::to_string).collect(); + let ranks = ranks + .remove(&key) + .map(|s| s.into_iter().collect()) + .unwrap_or_default(); + let source = sources.remove(&key).unwrap_or(StackSource::Unknown); + FoldedStacks { + tid: 0, + source, + segments, + count, + ranks, + } + }) + .collect(); + merged.sort_by(|a, b| a.segments.cmp(&b.segments)); + merged +} + +/// Parse classic folded lines into [`FoldedStacks`] (no thread metadata). +pub fn folded_from_line(line: &str, source: StackSource) -> Option { + let line = line.trim(); + if line.is_empty() { + return None; + } + let (stack, count_str) = line.rsplit_once(' ')?; + let count = count_str.parse::().ok()?; + if count == 0 { + return None; + } + let segments: Vec = stack + .split(';') + .filter(|p| !p.is_empty()) + .map(str::to_string) + .collect(); + if segments.is_empty() { + return None; + } + Some(FoldedStacks { + tid: 0, + source, + segments, + count, + ranks: Vec::new(), + }) +} + +fn is_thread_folded_segment(seg: &str) -> bool { + let Some(rest) = seg.strip_prefix("thread-") else { + return false; + }; + let digit_len = rest.chars().take_while(|c| c.is_ascii_digit()).count(); + digit_len > 0 + && (rest.len() == digit_len + || matches!(rest.as_bytes().get(digit_len), Some(b' ') | Some(b'('))) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::features::stacktrace::parse::parse_snapshot; + use crate::features::stacktrace::snapshot::StackSource; + + #[test] + fn fold_parsed_adds_thread_prefix() { + let parsed = ParsedStacks { + tid: 42, + source: StackSource::Sigprof, + flags: Default::default(), + frames: vec![CallFrame::CFrame { + ip: "0x1".into(), + file: String::new(), + func: "foo".into(), + lineno: 0, + lang: None, + }], + }; + let folded = fold_parsed( + &parsed, + &FoldOptions { + thread_prefix: true, + canonicalize: false, + count: 3, + }, + ); + assert_eq!(folded.count, 3); + assert!(folded.segments[0].starts_with("thread-42")); + assert_eq!(folded.segments.last().map(String::as_str), Some("foo")); + assert_eq!(folded.to_folded_line().rsplit_once(' ').unwrap().1, "3"); + } + + #[test] + fn merge_folded_sums_counts_and_ranks() { + let a = FoldedStacks { + tid: 1, + source: StackSource::Sigprof, + segments: vec!["[py] main (a.py:1)".into(), "[py] train (a.py:2)".into()], + count: 2, + ranks: vec![], + }; + let b = FoldedStacks { + tid: 2, + source: StackSource::Sigprof, + segments: vec![ + "thread-9".into(), + "[py] main (a.py:1)".into(), + "[py] train (a.py:2)".into(), + ], + count: 3, + ranks: vec![], + }; + let merged = merge_folded_attributed(&[(Some(0), vec![a]), (Some(1), vec![b])]); + assert_eq!(merged.len(), 1); + assert_eq!(merged[0].count, 5); + assert_eq!(merged[0].ranks, vec![0, 1]); + } + + #[test] + fn fold_snapshot_matches_parse_then_fold() { + use crate::features::stacktrace::snapshot::{StackFlags, StackSnapshot, StackSource}; + let snap = + StackSnapshot::from_parts(7, StackSource::Sigprof, &[], &[], StackFlags::PY_ABSENT); + let mut cache_a = HashMap::new(); + let mut cache_b = HashMap::new(); + let opts = FoldOptions { + thread_prefix: false, + canonicalize: true, + count: 1, + }; + let via_fast = fold_snapshot(&snap, &mut cache_a, &opts); + let via_parse = parse_snapshot(&snap, &mut cache_b).fold(&opts); + assert_eq!(via_fast, via_parse); + } + + #[test] + fn python_only_strips_native() { + let f = FoldedStacks { + tid: 0, + source: StackSource::Sigprof, + segments: vec![ + "[py] a (a.py:1)".into(), + "native_fn".into(), + "[py] b (b.py:2)".into(), + ], + count: 1, + ranks: vec![0], + }; + let py = f.python_only().unwrap(); + assert_eq!( + py.segments, + vec!["[py] a (a.py:1)".to_string(), "[py] b (b.py:2)".to_string()] + ); + assert_eq!(py.ranks, vec![0]); + } +} diff --git a/probing/extensions/python/src/features/stack_merge.rs b/probing/extensions/python/src/features/stacktrace/merge.rs similarity index 74% rename from probing/extensions/python/src/features/stack_merge.rs rename to probing/extensions/python/src/features/stacktrace/merge.rs index 03d3a067..c70a367d 100644 --- a/probing/extensions/python/src/features/stack_merge.rs +++ b/probing/extensions/python/src/features/stacktrace/merge.rs @@ -1,6 +1,7 @@ -//! Unified Python / native stack merge for SIGPROF, SIGUSR2, and synchronous walks. +//! Unified Python / native (C++ / Rust) stack merge for all tracers. //! -//! Python frames always come from the eval-frame hook (`vm_tracer` / `PYSTACKS`). +//! Python frames always come from the eval-frame hook +//! ([`crate::features::stacktrace::tracers::vm`] / `PYSTACKS`). //! Native frames are spliced at CPython eval-frame boundaries //! (`_PyEval_EvalFrameDefault` / `EvalFrameEx`). @@ -63,6 +64,31 @@ pub fn is_interp_shim(frame: &CallFrame) -> bool { frame_symbol(frame).contains("rust_eval_frame") } +/// CPython call-protocol / extension-init noise between user `[py]` frames. +/// +/// Kept out of flamegraphs so Distributed stacks do not fan out under +/// `_PyObject_Vectorcall` / probing's `_PyInit__core` after enabling pprof. +fn is_cpython_interpreter_noise(name: &str) -> bool { + if is_eval_frame_name(name) { + return false; + } + // CPython extension module init (Darwin often shows a leading `_`). + if name.contains("PyInit_") || name.contains("PyInit__") { + return true; + } + name.contains("vectorcall") + || name.contains("Vectorcall") + || name.starts_with("_PyObject_") + || name.starts_with("PyObject_") + || name.starts_with("slot_tp_") + || name.starts_with("_PyFunction_") + || name.starts_with("cfunction_") + || name.starts_with("method_vectorcall") + || name.starts_with("_method_vectorcall") + || name.starts_with("_PyEval_") + || name.starts_with("PyEval_") +} + fn merge_action(frame: &CallFrame) -> MergeAction { if is_interp_shim(frame) { return MergeAction::Drop; @@ -73,6 +99,9 @@ fn merge_action(frame: &CallFrame) -> MergeAction { if is_eval_frame(frame) { return MergeAction::SplicePython; } + if is_cpython_interpreter_noise(frame_symbol(frame)) { + return MergeAction::Drop; + } let symbol = frame_symbol(frame); let mut tokens = symbol.split(['_', '.']).filter(|s| !s.is_empty()); match tokens.next() { @@ -157,14 +186,10 @@ pub fn merge_python_native_stacks( merged_leaf_to_root.extend_from_slice(&py_inner_to_outer[pi..]); } } else { - merged_leaf_to_root.extend(py_inner_to_outer); - merged_leaf_to_root.extend( - native_leaf_to_root - .iter() - .filter(|f| !is_interp_shim(f)) - .filter(|f| !is_interpreter_startup_native(frame_symbol(f))) - .cloned(), - ); + // No eval-frame splice anchors (typical for SyncWalk mid-hook): do not + // concatenate the entire native tower under Python — that was the + // `_PyInit__core` / vectorcall soup on Distributed after enabling pprof. + return python_outer_to_inner.to_vec(); } merged_leaf_to_root.reverse(); @@ -181,6 +206,9 @@ fn is_stdlib_bootstrap_py_segment(seg: &str) -> bool { || seg.contains("importlib/") || seg.contains("runpy.py") || seg.contains("zipimport.py") + // platform. often appears above user main_worker via import side-effects. + || seg.contains("(platform.py:") + || seg.ends_with("(platform.py)") } /// CPython main / import bootstrap that sometimes appears above user `[py]` frames. @@ -286,6 +314,23 @@ mod tests { assert_eq!(canonicalize_folded_segments(&user), user); } + #[test] + fn canonicalize_drops_platform_import_root_before_user() { + // Observed distributed fork: platform.py: vs imagenet script root. + let raw = vec![ + "[py] (platform.py:1)".to_string(), + "[py] main_worker (imagenet_with_span.py:361)".to_string(), + "[py] train (imagenet_with_span.py:659)".to_string(), + ]; + assert_eq!( + canonicalize_folded_segments(&raw), + vec![ + "[py] main_worker (imagenet_with_span.py:361)".to_string(), + "[py] train (imagenet_with_span.py:659)".to_string(), + ] + ); + } + #[test] fn eval_frames_splice_python_innermost_first() { let native = vec![ @@ -307,6 +352,38 @@ mod tests { ); } + #[test] + fn no_eval_anchor_prefers_python_over_native_soup() { + let native = vec![ + c("_PyObject_Vectorcall"), + c("_PyInit__core"), + c("slot_tp_call"), + ]; + let python = vec![ + py("imagenet_with_span.py", "train", 659), + py("module.py", "_call_impl", 10), + ]; + let merged = merge_python_native_stacks(&python, &native); + assert_eq!(merged, python); + } + + #[test] + fn drops_vectorcall_and_extension_init_between_eval_splices() { + let native = vec![ + c("torch_kernel"), + c("_PyObject_Vectorcall"), + c("_PyEval_EvalFrameDefault"), + c("_PyInit__core"), + c("caller_native"), + ]; + let python = vec![py("a.py", "a", 1)]; + let merged = merge_python_native_stacks(&python, &native); + assert_eq!( + merged, + vec![c("caller_native"), py("a.py", "a", 1), c("torch_kernel")] + ); + } + #[test] fn drops_interp_shim() { // Native input is leaf -> root; output must be root -> leaf. diff --git a/probing/extensions/python/src/features/stacktrace/metrics.rs b/probing/extensions/python/src/features/stacktrace/metrics.rs new file mode 100644 index 00000000..0fc44b2d --- /dev/null +++ b/probing/extensions/python/src/features/stacktrace/metrics.rs @@ -0,0 +1,151 @@ +//! Process-wide counters for stack capture / aggregation. +//! +//! Two scopes (do not conflate when reading flamegraph JSON): +//! +//! | Group | Counters | When they move | +//! |-------|----------|----------------| +//! | **sampler** | `dropped_*`, `fingerprint_*`, `fold_calls` | SIGPROF consumer; `fold_calls` on **export**, not per sample | +//! | **view** | `parse_calls`, `parse_cache_hits` | demangle/merge path (export + HTTP/dynamic); cache is `(tid,seq)` reuse | + +use std::sync::atomic::{AtomicU64, Ordering}; + +use serde_json::json; + +static DROPPED_RING: AtomicU64 = AtomicU64::new(0); +static DROPPED_NOT_MAIN: AtomicU64 = AtomicU64::new(0); +static DROPPED_TORN: AtomicU64 = AtomicU64::new(0); +static DROPPED_CAPACITY: AtomicU64 = AtomicU64::new(0); +static FINGERPRINT_HITS: AtomicU64 = AtomicU64::new(0); +static FINGERPRINT_MISSES: AtomicU64 = AtomicU64::new(0); +static PARSE_CALLS: AtomicU64 = AtomicU64::new(0); +static PARSE_CACHE_HITS: AtomicU64 = AtomicU64::new(0); +static FOLD_CALLS: AtomicU64 = AtomicU64::new(0); + +#[inline] +pub fn inc_dropped_ring() { + DROPPED_RING.fetch_add(1, Ordering::Relaxed); +} + +#[inline] +pub fn inc_dropped_not_main() { + DROPPED_NOT_MAIN.fetch_add(1, Ordering::Relaxed); +} + +#[inline] +pub fn inc_dropped_torn() { + DROPPED_TORN.fetch_add(1, Ordering::Relaxed); +} + +#[inline] +pub fn inc_dropped_capacity() { + DROPPED_CAPACITY.fetch_add(1, Ordering::Relaxed); +} + +#[inline] +pub fn inc_fingerprint_hit() { + FINGERPRINT_HITS.fetch_add(1, Ordering::Relaxed); +} + +#[inline] +pub fn inc_fingerprint_miss() { + FINGERPRINT_MISSES.fetch_add(1, Ordering::Relaxed); +} + +#[inline] +pub fn inc_parse_call() { + PARSE_CALLS.fetch_add(1, Ordering::Relaxed); +} + +#[inline] +pub fn inc_parse_cache_hit() { + PARSE_CACHE_HITS.fetch_add(1, Ordering::Relaxed); +} + +#[inline] +pub fn inc_fold_call() { + FOLD_CALLS.fetch_add(1, Ordering::Relaxed); +} + +pub fn dropped_ring() -> u64 { + DROPPED_RING.load(Ordering::Relaxed) +} + +pub fn fingerprint_hits() -> u64 { + FINGERPRINT_HITS.load(Ordering::Relaxed) +} + +pub fn fingerprint_misses() -> u64 { + FINGERPRINT_MISSES.load(Ordering::Relaxed) +} + +pub fn fold_calls() -> u64 { + FOLD_CALLS.load(Ordering::Relaxed) +} + +pub fn parse_cache_hits() -> u64 { + PARSE_CACHE_HITS.load(Ordering::Relaxed) +} + +pub fn parse_calls() -> u64 { + PARSE_CALLS.load(Ordering::Relaxed) +} + +pub fn dropped_not_main() -> u64 { + DROPPED_NOT_MAIN.load(Ordering::Relaxed) +} + +/// Reset sampler-scope counters (called from pprof `setup` / `reset`). +/// +/// Leaves **view** counters (`parse_*`) intact — useful across HTTP polls. +pub fn reset_sampler_counters() { + DROPPED_RING.store(0, Ordering::Relaxed); + DROPPED_NOT_MAIN.store(0, Ordering::Relaxed); + DROPPED_TORN.store(0, Ordering::Relaxed); + DROPPED_CAPACITY.store(0, Ordering::Relaxed); + FINGERPRINT_HITS.store(0, Ordering::Relaxed); + FINGERPRINT_MISSES.store(0, Ordering::Relaxed); + FOLD_CALLS.store(0, Ordering::Relaxed); +} + +/// Counters for flamegraph JSON / debugging, grouped by pipeline scope. +pub fn snapshot_json() -> serde_json::Value { + json!({ + "sampler": { + "dropped_ring": DROPPED_RING.load(Ordering::Relaxed), + "dropped_not_main": DROPPED_NOT_MAIN.load(Ordering::Relaxed), + "dropped_torn": DROPPED_TORN.load(Ordering::Relaxed), + "dropped_capacity": DROPPED_CAPACITY.load(Ordering::Relaxed), + "fingerprint_hits": FINGERPRINT_HITS.load(Ordering::Relaxed), + "fingerprint_misses": FINGERPRINT_MISSES.load(Ordering::Relaxed), + "fold_calls": FOLD_CALLS.load(Ordering::Relaxed), + }, + "view": { + "parse_calls": PARSE_CALLS.load(Ordering::Relaxed), + "parse_cache_hits": PARSE_CACHE_HITS.load(Ordering::Relaxed), + }, + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn counters_increment() { + let before = dropped_ring(); + inc_dropped_ring(); + assert!(dropped_ring() > before); + } + + #[test] + fn snapshot_json_separates_sampler_and_view() { + let v = snapshot_json(); + assert!(v["sampler"]["fingerprint_hits"].as_u64().is_some()); + assert!(v["sampler"]["fold_calls"].as_u64().is_some()); + assert!(v["view"]["parse_calls"].as_u64().is_some()); + assert!(v["view"]["parse_cache_hits"].as_u64().is_some()); + // Flat keys removed — do not misread export parse as per-sample work. + assert!(v.get("fingerprint_hits").is_none()); + assert!(v.get("parse_calls").is_none()); + } +} diff --git a/probing/extensions/python/src/features/stacktrace/mod.rs b/probing/extensions/python/src/features/stacktrace/mod.rs new file mode 100644 index 00000000..9aa84f13 --- /dev/null +++ b/probing/extensions/python/src/features/stacktrace/mod.rs @@ -0,0 +1,48 @@ +//! Unified stack tracing for Python / C++ / Rust. +//! +//! # Pipeline +//! +//! ```text +//! fill adapters → StackSnapshot → parse → ParsedStacks → fold → FoldedStacks +//! ``` +//! +//! | Type | Role | +//! |------|------| +//! | [`StackSnapshot`] | Signal-safe POD (leaf→root native, outer→inner py keys) | +//! | [`ParsedStacks`] | Demangled + merged frames (root→leaf) | +//! | [`FoldedStacks`] | Flamegraph / distributed aggregation | +//! +//! | Module | Role | +//! |--------|------| +//! | [`snapshot`] | Document types + `StackSource` / flags | +//! | [`compact`] | Heap-sized payload for sampler buckets | +//! | [`fingerprint`] | Aggregation key (`tid` + PCs + py keys + flags) | +//! | [`parse`] | Snapshot → ParsedStacks (+ view cache) | +//! | [`fold`] | Parsed/Snapshot → FoldedStacks + merge | +//! | [`metrics`] | Drop / fingerprint / parse / fold counters | +//! | [`merge`] | Python ⊕ native splice + canonicalize | +//! | [`capture`] | Registry, intern, signal fill (no parse/fold logic) | +//! | [`spy`] | CPython ABI / TLS (vendored py-spy; do not casually edit) | +//! | [`tracers`] | vm / pprof / dynamic fill policies | + +pub mod capture; +pub mod compact; +pub mod fingerprint; +pub mod fold; +pub mod merge; +pub mod metrics; +pub mod parse; +pub mod snapshot; +pub mod spy; +pub mod tracers; + +pub use fold::{fold_parsed, fold_snapshot, merge_folded_attributed, FoldOptions, FoldedStacks}; +pub use merge::{ + canonicalize_folded_segments, demangle_native_symbol, merge_python_native_stacks, + merged_frames_to_folded_segments, +}; +pub use parse::{parse_snapshot, ParsedStacks}; +pub use snapshot::{RawStackSnapshot, StackFlags, StackSnapshot, StackSource, MAX_NATIVE, MAX_PY}; +pub(crate) use tracers::dynamic::is_backtrace_busy; +pub use tracers::dynamic::{SignalTracer, StackTracer}; +pub use tracers::vm; diff --git a/probing/extensions/python/src/features/stacktrace/parse.rs b/probing/extensions/python/src/features/stacktrace/parse.rs new file mode 100644 index 00000000..f26a08e8 --- /dev/null +++ b/probing/extensions/python/src/features/stacktrace/parse.rs @@ -0,0 +1,246 @@ +//! [`StackSnapshot`] → [`ParsedStacks`]: demangle + Python resolve + merge. +//! +//! Output frame order is always root → leaf (caller → callee). This path is a +//! warm/cold path — not for SIGPROF handlers. + +use std::collections::{HashMap, VecDeque}; +use std::sync::Mutex; + +use once_cell::sync::Lazy; +use probing_proto::prelude::CallFrame; + +use crate::features::stacktrace::capture::{resolve_py_call_frame, symbolize_native_addr}; +use crate::features::stacktrace::merge::merge_python_native_stacks; +use crate::features::stacktrace::metrics; +use crate::features::stacktrace::snapshot::{StackFlags, StackSnapshot, StackSource}; + +/// Small FIFO of recent `(tid, seq)` parses for HTTP / dynamic reuse. +const VIEW_CACHE_CAP: usize = 16; + +struct ParsedViewCache { + /// Oldest at front; capacity capped at [`VIEW_CACHE_CAP`]. + entries: VecDeque<(u64, u64, ParsedStacks)>, +} + +impl ParsedViewCache { + fn new() -> Self { + Self { + entries: VecDeque::with_capacity(VIEW_CACHE_CAP), + } + } + + fn get(&self, tid: u64, seq: u64) -> Option<&ParsedStacks> { + self.entries + .iter() + .find(|(t, s, _)| *t == tid && *s == seq) + .map(|(_, _, p)| p) + } + + fn insert(&mut self, tid: u64, seq: u64, parsed: ParsedStacks) { + if let Some(pos) = self + .entries + .iter() + .position(|(t, s, _)| *t == tid && *s == seq) + { + self.entries.remove(pos); + } + while self.entries.len() >= VIEW_CACHE_CAP { + self.entries.pop_front(); + } + self.entries.push_back((tid, seq, parsed)); + } +} + +static PARSED_VIEW_CACHE: Lazy> = + Lazy::new(|| Mutex::new(ParsedViewCache::new())); + +/// Symbolized and merged stack (root → leaf). +#[derive(Clone, Debug)] +pub struct ParsedStacks { + pub tid: u64, + pub source: StackSource, + pub flags: StackFlags, + pub frames: Vec, +} + +impl ParsedStacks { + pub fn is_empty(&self) -> bool { + self.frames.is_empty() + } +} + +/// Parse a snapshot: native symbolize, Python intern lookup, merge. +/// +/// `cache` is reused across samples on the consumer thread (native demangle). +pub fn parse_snapshot( + snapshot: &StackSnapshot, + cache: &mut HashMap, +) -> ParsedStacks { + metrics::inc_parse_call(); + parse_snapshot_uncached(snapshot, cache) +} + +fn parse_snapshot_uncached( + snapshot: &StackSnapshot, + cache: &mut HashMap, +) -> ParsedStacks { + if snapshot.flags.contains(StackFlags::PY_TORN) { + return ParsedStacks { + tid: snapshot.tid, + source: snapshot.source, + flags: snapshot.flags, + frames: Vec::new(), + }; + } + + let nlen = snapshot.native_len as usize; + let plen = snapshot.py_len as usize; + + let native_leaf_to_root: Vec = (0..nlen) + .map(|i| { + let resolve_addr = if i == 0 { + snapshot.native[i] + } else { + snapshot.native[i].wrapping_sub(1) + }; + symbolize_native_addr(resolve_addr, cache) + }) + .collect(); + + let python_outer_to_inner: Vec = snapshot.py[..plen] + .iter() + .map(|&key| resolve_py_call_frame(key)) + .collect(); + + let frames = merge_python_native_stacks(&python_outer_to_inner, &native_leaf_to_root); + ParsedStacks { + tid: snapshot.tid, + source: snapshot.source, + flags: snapshot.flags, + frames, + } +} + +/// Parse with a multi-slot `(tid, seq)` view cache (HTTP / dynamic reuse). +pub fn parse_snapshot_cached( + snapshot: &StackSnapshot, + seq: u64, + cache: &mut HashMap, +) -> ParsedStacks { + if seq != 0 { + if let Ok(guard) = PARSED_VIEW_CACHE.lock() { + if let Some(parsed) = guard.get(snapshot.tid, seq) { + metrics::inc_parse_cache_hit(); + return parsed.clone(); + } + } + } + let parsed = parse_snapshot(snapshot, cache); + if seq != 0 { + if let Ok(mut guard) = PARSED_VIEW_CACHE.lock() { + guard.insert(snapshot.tid, seq, parsed.clone()); + } + } + parsed +} + +impl StackSnapshot { + /// Lazy materialization of merged [`CallFrame`]s (root → leaf). + pub fn parse(&self, cache: &mut HashMap) -> ParsedStacks { + parse_snapshot(self, cache) + } + + /// Like [`Self::parse`], but reuse a prior result for the same `(tid, seq)`. + pub fn parse_cached(&self, seq: u64, cache: &mut HashMap) -> ParsedStacks { + parse_snapshot_cached(self, seq, cache) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::features::stacktrace::snapshot::StackSource; + + fn c(func: &str) -> CallFrame { + CallFrame::CFrame { + ip: "0x1".into(), + file: String::new(), + func: func.into(), + lineno: 0, + lang: Some("cpp".into()), + } + } + + #[test] + fn torn_py_yields_empty_parsed() { + let mut s = StackSnapshot::from_parts( + 1, + StackSource::Sigprof, + &[0x1000], + &[0x2000], + StackFlags::PY_TORN, + ); + s.flags.insert(StackFlags::PY_TORN); + let mut cache = HashMap::new(); + let parsed = s.parse(&mut cache); + assert!(parsed.is_empty()); + assert_eq!(parsed.source, StackSource::Sigprof); + } + + #[test] + fn parse_cache_hits_on_same_tid_seq() { + use crate::features::stacktrace::metrics; + let before_hits = metrics::parse_cache_hits(); + + let s = StackSnapshot::from_parts(3, StackSource::Sigprof, &[], &[], StackFlags::PY_ABSENT); + let mut cache = HashMap::new(); + let a = parse_snapshot_cached(&s, 42, &mut cache); + let b = parse_snapshot_cached(&s, 42, &mut cache); + assert_eq!(a.tid, b.tid); + assert_eq!(a.frames.len(), b.frames.len()); + assert!(metrics::parse_cache_hits() > before_hits); + } + + #[test] + fn parse_cache_holds_distinct_tid_seq() { + use crate::features::stacktrace::metrics; + let mut cache = HashMap::new(); + let a = StackSnapshot::from_parts(1, StackSource::Sigprof, &[], &[], StackFlags::PY_ABSENT); + let b = StackSnapshot::from_parts(2, StackSource::Sigprof, &[], &[], StackFlags::PY_ABSENT); + let _ = parse_snapshot_cached(&a, 10, &mut cache); + let _ = parse_snapshot_cached(&b, 11, &mut cache); + // Both slots remain addressable (not a single global overwrite). + let before = metrics::parse_cache_hits(); + let _ = parse_snapshot_cached(&a, 10, &mut cache); + let _ = parse_snapshot_cached(&b, 11, &mut cache); + assert!(metrics::parse_cache_hits() >= before + 2); + } + + #[test] + fn native_only_preserves_source_and_tid() { + // Addresses won't resolve meaningfully; merge still returns frames or empty. + let s = StackSnapshot::from_parts( + 9, + StackSource::SyncWalk, + &[0x10, 0x20], + &[], + StackFlags::empty(), + ); + let mut cache = HashMap::new(); + // Pre-seed cache so merge sees known symbols (leaf → root input). + cache.insert(0x10, c("leaf")); + cache.insert(0x1f, c("root")); // wrapping_sub(1) on second frame + let parsed = parse_snapshot(&s, &mut cache); + assert_eq!(parsed.tid, 9); + assert_eq!(parsed.source, StackSource::SyncWalk); + assert!(!parsed.frames.is_empty()); + // root → leaf after merge + assert_eq!( + match &parsed.frames[0] { + CallFrame::CFrame { func, .. } => func.as_str(), + _ => "", + }, + "root" + ); + } +} diff --git a/probing/extensions/python/src/features/stacktrace/snapshot.rs b/probing/extensions/python/src/features/stacktrace/snapshot.rs new file mode 100644 index 00000000..6ac6204c --- /dev/null +++ b/probing/extensions/python/src/features/stacktrace/snapshot.rs @@ -0,0 +1,149 @@ +//! Signal-safe stack capture document. +//! +//! [`StackSnapshot`] is the only structure the signal path may write. Order +//! invariants: `native` is leaf → root; `py` is outer → inner (`PYSTACKS`). + +use core::fmt; + +pub const MAX_NATIVE: usize = 48; +pub const MAX_PY: usize = 128; + +/// How this snapshot was filled. +#[repr(u8)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] +pub enum StackSource { + #[default] + Unknown = 0, + /// Python TLS / `PYSTACKS` keys only (no native walk). + Vm = 1, + /// `SIGPROF` sampling. + Sigprof = 2, + /// `SIGUSR2` on-demand capture. + Sigusr2 = 3, + /// Synchronous `backtrace` walk on the current thread. + SyncWalk = 4, +} + +impl fmt::Display for StackSource { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(match self { + Self::Unknown => "unknown", + Self::Vm => "vm", + Self::Sigprof => "sigprof", + Self::Sigusr2 => "sigusr2", + Self::SyncWalk => "sync_walk", + }) + } +} + +/// Compact quality / truncation bits for a snapshot. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] +#[repr(transparent)] +pub struct StackFlags(pub u16); + +impl StackFlags { + pub const EMPTY: Self = Self(0); + pub const NATIVE_TRUNCATED: Self = Self(0b0001); + pub const PY_TRUNCATED: Self = Self(0b0010); + pub const PY_TORN: Self = Self(0b0100); + pub const PY_ABSENT: Self = Self(0b1000); + + pub const fn empty() -> Self { + Self::EMPTY + } + + pub const fn contains(self, other: Self) -> bool { + self.0 & other.0 == other.0 + } + + pub fn insert(&mut self, other: Self) { + self.0 |= other.0; + } +} + +/// POD snapshot shared by SIGPROF / SIGUSR2 / sync fill adapters. +#[derive(Clone, Copy, Debug)] +#[repr(C)] +pub struct StackSnapshot { + pub tid: u64, + pub source: StackSource, + pub flags: StackFlags, + pub native_len: u32, + pub py_len: u32, + /// Native return addresses, leaf → root. + pub native: [usize; MAX_NATIVE], + /// Callee `PyCodeObject` pointers, outer → inner. + pub py: [usize; MAX_PY], +} + +impl StackSnapshot { + pub const fn zeroed() -> Self { + Self { + tid: 0, + source: StackSource::Unknown, + flags: StackFlags::EMPTY, + native_len: 0, + py_len: 0, + native: [0usize; MAX_NATIVE], + py: [0usize; MAX_PY], + } + } + + pub fn is_empty(&self) -> bool { + self.native_len == 0 && self.py_len == 0 + } + + /// Test / adapter helper: build a snapshot from PC and Python keys. + pub fn from_parts( + tid: u64, + source: StackSource, + native_leaf_to_root: &[usize], + py_outer_to_inner: &[usize], + flags: StackFlags, + ) -> Self { + let mut s = Self::zeroed(); + s.tid = tid; + s.source = source; + s.flags = flags; + let nlen = native_leaf_to_root.len().min(MAX_NATIVE); + s.native[..nlen].copy_from_slice(&native_leaf_to_root[..nlen]); + s.native_len = nlen as u32; + if native_leaf_to_root.len() > MAX_NATIVE { + s.flags.insert(StackFlags::NATIVE_TRUNCATED); + } + let plen = py_outer_to_inner.len().min(MAX_PY); + s.py[..plen].copy_from_slice(&py_outer_to_inner[..plen]); + s.py_len = plen as u32; + if py_outer_to_inner.len() > MAX_PY { + s.flags.insert(StackFlags::PY_TRUNCATED); + } + if plen == 0 { + s.flags.insert(StackFlags::PY_ABSENT); + } + s + } +} + +/// Compatibility alias for older call sites. +pub type RawStackSnapshot = StackSnapshot; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn from_parts_sets_truncation_flags() { + let native: Vec = (0..MAX_NATIVE + 3).collect(); + let s = + StackSnapshot::from_parts(1, StackSource::SyncWalk, &native, &[], StackFlags::empty()); + assert_eq!(s.native_len as usize, MAX_NATIVE); + assert!(s.flags.contains(StackFlags::NATIVE_TRUNCATED)); + assert!(s.flags.contains(StackFlags::PY_ABSENT)); + assert_eq!(s.source, StackSource::SyncWalk); + } + + #[test] + fn empty_zeroed() { + assert!(StackSnapshot::zeroed().is_empty()); + } +} diff --git a/probing/extensions/python/src/features/spy/README.md b/probing/extensions/python/src/features/stacktrace/spy/README.md similarity index 100% rename from probing/extensions/python/src/features/spy/README.md rename to probing/extensions/python/src/features/stacktrace/spy/README.md diff --git a/probing/extensions/python/src/features/spy/call.rs b/probing/extensions/python/src/features/stacktrace/spy/call.rs similarity index 97% rename from probing/extensions/python/src/features/spy/call.rs rename to probing/extensions/python/src/features/stacktrace/spy/call.rs index 4e90f92a..2e241e8d 100644 --- a/probing/extensions/python/src/features/spy/call.rs +++ b/probing/extensions/python/src/features/stacktrace/spy/call.rs @@ -1,8 +1,10 @@ -use crate::features::spy::python_bindings; -use crate::features::spy::python_interpreters::FrameObject; -use crate::features::spy::PYVERSION; +use crate::features::stacktrace::spy::python_bindings; +use crate::features::stacktrace::spy::python_interpreters::FrameObject; +use crate::features::stacktrace::spy::PYVERSION; -use crate::features::spy::python_interpreters::{BytesObject, CodeObject, StringObject}; +use crate::features::stacktrace::spy::python_interpreters::{ + BytesObject, CodeObject, StringObject, +}; #[derive(Debug, Default, Clone, Copy)] pub struct RawCallLocation { diff --git a/probing/extensions/python/src/features/spy/ffi.rs b/probing/extensions/python/src/features/stacktrace/spy/ffi.rs similarity index 100% rename from probing/extensions/python/src/features/spy/ffi.rs rename to probing/extensions/python/src/features/stacktrace/spy/ffi.rs diff --git a/probing/extensions/python/src/features/spy/mod.rs b/probing/extensions/python/src/features/stacktrace/spy/mod.rs similarity index 85% rename from probing/extensions/python/src/features/spy/mod.rs rename to probing/extensions/python/src/features/stacktrace/spy/mod.rs index ea3ca3ec..188b0dbe 100644 --- a/probing/extensions/python/src/features/spy/mod.rs +++ b/probing/extensions/python/src/features/stacktrace/spy/mod.rs @@ -7,7 +7,7 @@ pub(crate) mod ffi; pub use python_bindings::version::Version; -use crate::features::spy::call::RawCallLocation; +use crate::features::stacktrace::spy::call::RawCallLocation; pub(crate) struct ThreadSpyState { pub stacks: Vec, @@ -59,7 +59,7 @@ pub fn get_current_frame(ver: &Version) -> Option { match (ver.major, ver.minor) { (3, 4) | (3, 5) | (3, 6) | (3, 7) | (3, 8) | (3, 9) | (3, 10) => { // Python 3.4 to 3.10 - let ts = threadstate as *const super::spy::python_bindings::v3_10_0::PyThreadState; + let ts = threadstate as *const python_bindings::v3_10_0::PyThreadState; let frame = (*ts).frame; if !frame.is_null() { Some(frame as usize) @@ -69,7 +69,7 @@ pub fn get_current_frame(ver: &Version) -> Option { } (3, 11) => { // Python 3.11 - let ts = threadstate as *const super::spy::python_bindings::v3_11_0::PyThreadState; + let ts = threadstate as *const python_bindings::v3_11_0::PyThreadState; let cframe = (*ts).cframe; if !cframe.is_null() { let current_frame = (*cframe).current_frame; @@ -84,7 +84,7 @@ pub fn get_current_frame(ver: &Version) -> Option { } (3, 12) => { // Python 3.12 - let ts = threadstate as *const super::spy::python_bindings::v3_12_0::PyThreadState; + let ts = threadstate as *const python_bindings::v3_12_0::PyThreadState; let cframe = (*ts).cframe; if !cframe.is_null() { let current_frame = (*cframe).current_frame; @@ -99,7 +99,7 @@ pub fn get_current_frame(ver: &Version) -> Option { } (3, 13) => { // Python 3.13 - let ts = threadstate as *const super::spy::python_bindings::v3_13_0::PyThreadState; + let ts = threadstate as *const python_bindings::v3_13_0::PyThreadState; let current_frame = (*ts).current_frame; if !current_frame.is_null() { Some(current_frame as usize) @@ -116,7 +116,7 @@ pub fn get_current_frame(ver: &Version) -> Option { pub fn get_prev_frame(ver: &Version, frame_addr: usize) -> Option { match (ver.major, ver.minor) { (3, 4) | (3, 5) | (3, 6) | (3, 7) | (3, 8) | (3, 9) | (3, 10) => { - let frame = frame_addr as *const super::spy::python_bindings::v3_10_0::_frame; + let frame = frame_addr as *const python_bindings::v3_10_0::_frame; let prev_frame = unsafe { (*frame).f_back }; if !prev_frame.is_null() && prev_frame.is_aligned() && prev_frame as usize > 0xffffff { Some(prev_frame as usize) @@ -125,8 +125,7 @@ pub fn get_prev_frame(ver: &Version, frame_addr: usize) -> Option { } } (3, 11) => { - let iframe = - frame_addr as *const super::spy::python_bindings::v3_11_0::_PyInterpreterFrame; + let iframe = frame_addr as *const python_bindings::v3_11_0::_PyInterpreterFrame; let prev_frame = unsafe { (*iframe).previous }; if !prev_frame.is_null() && prev_frame.is_aligned() && prev_frame as usize > 0xffffff { Some(prev_frame as usize) @@ -135,8 +134,7 @@ pub fn get_prev_frame(ver: &Version, frame_addr: usize) -> Option { } } (3, 12) => { - let iframe = - frame_addr as *const super::spy::python_bindings::v3_12_0::_PyInterpreterFrame; + let iframe = frame_addr as *const python_bindings::v3_12_0::_PyInterpreterFrame; let prev_frame = unsafe { (*iframe).previous }; if !prev_frame.is_null() && prev_frame.is_aligned() && prev_frame as usize > 0xffffff { Some(prev_frame as usize) diff --git a/probing/extensions/python/src/features/spy/python_bindings/mod.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/mod.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/mod.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/mod.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v2_7_15.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v2_7_15.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v2_7_15.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v2_7_15.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_10_0.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_10_0.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_10_0.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_10_0.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_11_0.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_11_0.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_11_0.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_11_0.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_12_0.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_12_0.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_12_0.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_12_0.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_13_0.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_13_0.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_13_0.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_13_0.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_3_7.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_3_7.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_3_7.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_3_7.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_4_8.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_4_8.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_4_8.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_4_8.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_5_5.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_5_5.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_5_5.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_5_5.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_6_6.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_6_6.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_6_6.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_6_6.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_7_0.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_7_0.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_7_0.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_7_0.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_8_0.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_8_0.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_8_0.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_8_0.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/v3_9_5.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_9_5.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/v3_9_5.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/v3_9_5.rs diff --git a/probing/extensions/python/src/features/spy/python_bindings/version.rs b/probing/extensions/python/src/features/stacktrace/spy/python_bindings/version.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_bindings/version.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_bindings/version.rs diff --git a/probing/extensions/python/src/features/spy/python_interpreters.rs b/probing/extensions/python/src/features/stacktrace/spy/python_interpreters.rs similarity index 100% rename from probing/extensions/python/src/features/spy/python_interpreters.rs rename to probing/extensions/python/src/features/stacktrace/spy/python_interpreters.rs diff --git a/probing/extensions/python/src/features/stacktrace/tracers/dynamic.rs b/probing/extensions/python/src/features/stacktrace/tracers/dynamic.rs new file mode 100644 index 00000000..2671a0f0 --- /dev/null +++ b/probing/extensions/python/src/features/stacktrace/tracers/dynamic.rs @@ -0,0 +1,261 @@ +use std::collections::HashMap; +use std::panic::{catch_unwind, AssertUnwindSafe}; +use std::time::Duration; + +use anyhow::Result; +use async_trait::async_trait; +use once_cell::sync::Lazy; +use pyo3::Python; + +use probing_proto::prelude::CallFrame; + +use probing_core::is_python_main_thread; + +use crate::features::stacktrace::capture; +use crate::features::stacktrace::fold::{fold_parsed, FoldOptions, FoldedStacks}; +use crate::features::stacktrace::parse::{parse_snapshot, parse_snapshot_cached}; +use crate::features::stacktrace::snapshot::{StackFlags, StackSnapshot, StackSource}; +use crate::features::stacktrace::tracers::vm; + +#[derive(Debug, thiserror::Error)] +#[error("backtrace capture busy: {0}")] +pub(crate) struct BacktraceBusy(String); + +pub(crate) fn is_backtrace_busy(err: &anyhow::Error) -> bool { + err.downcast_ref::().is_some() +} + +#[async_trait] +pub trait StackTracer: Send + Sync + std::fmt::Debug { + fn trace(&self, tid: Option) -> Result>; +} + +#[derive(Debug)] +pub struct SignalTracer; + +impl SignalTracer { + /// Fill a [`StackSnapshot`] via synchronous backtrace + TLS Python keys. + pub fn capture_current_snapshot() -> StackSnapshot { + let mut native = Vec::new(); + backtrace::trace(|frame| { + native.push(frame.ip() as usize); + true + }); + let tid = capture::current_tid(); + let py_snap = capture::copy_registered_py_snapshot(tid); + let (py_keys, mut flags) = match py_snap { + Some(s) => { + let keys: Vec = s.py[..s.py_len as usize].to_vec(); + (keys, s.flags) + } + None => (Vec::new(), StackFlags::PY_ABSENT), + }; + if !py_keys.is_empty() { + flags = StackFlags((flags.0) & !StackFlags::PY_ABSENT.0); + } + StackSnapshot::from_parts(tid, StackSource::SyncWalk, &native, &py_keys, flags) + } + + /// Refresh Python keys from live TLS under the GIL, keep native PCs. + fn refresh_py_keys_under_gil(snap: &StackSnapshot) -> Option { + let keys = Python::attach(|_py| vm::copy_pystacks_callee_keys())?; + if keys.is_empty() { + return None; + } + let native: Vec = snap.native[..snap.native_len as usize].to_vec(); + let mut flags = snap.flags; + flags = StackFlags(flags.0 & !StackFlags::PY_ABSENT.0 & !StackFlags::PY_TORN.0); + Some(StackSnapshot::from_parts( + snap.tid, + snap.source, + &native, + &keys, + flags, + )) + } + + /// Walk the current thread without signals — always through parse. + pub fn trace_current_thread_merged() -> Vec { + let snap = Self::capture_current_snapshot(); + let mut cache = HashMap::new(); + let parsed = parse_snapshot(&snap, &mut cache); + if !parsed.frames.is_empty() { + return parsed.frames; + } + // Registry miss / empty py: re-copy keys from live PYSTACKS, then parse again. + if let Some(refreshed) = Self::refresh_py_keys_under_gil(&snap) { + return parse_snapshot(&refreshed, &mut cache).frames; + } + parsed.frames + } + + fn merged_from_snapshot(snapshot: &StackSnapshot, seq: u64) -> Vec { + let mut cache = HashMap::new(); + if seq != 0 { + parse_snapshot_cached(snapshot, seq, &mut cache).frames + } else { + parse_snapshot(snapshot, &mut cache).frames + } + } + + /// Read the Python main thread stack from an HTTP / SQL worker. + /// + /// Prefer latest SIGPROF mixed samples. **By default we never `SIGUSR2` the + /// Python main thread** — interrupting libc SIMD routines (e.g. macOS + /// `_platform_strlen`) has repeatedly resumed as `SIGILL` at a fixed PC when + /// refreshing Distributed stacks. Opt in with `PROBING_STACK_SIGUSR2_MAIN=1`. + fn trace_main_thread_off_signal() -> Result> { + let main_tid = capture::python_main_os_tid() + .ok_or_else(|| anyhow::anyhow!("Python main thread is not registered yet"))?; + + if let Some((snapshot, seq)) = capture::latest_snapshot_with_seq(main_tid) { + if snapshot.native_len > 0 { + return Ok(Self::merged_from_snapshot(&snapshot, seq)); + } + } + + // While SIGPROF is armed, never SIGUSR2 the main thread (Distributed / + // folded export must drain sampler buckets only). Still allow PYSTACKS. + if !capture::is_pprof_sampling_active() + && allow_main_thread_sigusr2() + && !crate::features::crash::is_crash_held() + { + match BACKTRACE_MUTEX.try_lock() { + Ok(_guard) => { + if let Some(snapshot) = + capture::capture_thread_snapshot_signal(main_tid, Duration::from_secs(2)) + { + let frames = Self::merged_from_snapshot(&snapshot, 0); + if !frames.is_empty() { + return Ok(frames); + } + } + } + Err(e) => { + log::debug!("main-thread SIGUSR2 skipped (concurrent stack capture): {e}"); + } + } + } + + // Safe default: PYSTACKS only (no signal into the training thread). + if let Some(snapshot) = capture::copy_registered_py_snapshot(main_tid) { + let frames = Self::merged_from_snapshot(&snapshot, 0); + if !frames.is_empty() { + return Ok(frames); + } + } + + Err(anyhow::anyhow!( + "main-thread stack unavailable; enable SIGPROF (probing.pprof.sample_freq) for mixed native+Python stacks" + )) + } + + fn is_main_tid(tid: i32) -> bool { + capture::python_main_os_tid().is_some_and(|main| main == tid as u64) + } + + fn trace_thread_signal(tid: i32) -> Result> { + if Self::is_main_tid(tid) { + return Self::trace_main_thread_off_signal(); + } + + if capture::is_pprof_sampling_active() { + if let Some((snapshot, seq)) = capture::latest_snapshot_with_seq(tid as u64) { + return Ok(Self::merged_from_snapshot(&snapshot, seq)); + } + } + + let _guard = BACKTRACE_MUTEX.try_lock().map_err(|e| { + let busy = BacktraceBusy(e.to_string()); + log::debug!("{busy}; skipping concurrent request"); + anyhow::Error::new(busy) + })?; + + let snapshot = capture::capture_thread_snapshot_signal(tid as u64, Duration::from_secs(2)) + .ok_or_else(|| { + anyhow::anyhow!("timed out waiting for stack snapshot on thread {tid}") + })?; + + Ok(Self::merged_from_snapshot(&snapshot, 0)) + } +} + +/// On-demand main-thread stack as a single folded line (`"stack 1"`). +pub fn main_thread_on_demand_folded_lines() -> Vec { + let frames = match SignalTracer::trace_main_thread_off_signal() { + Ok(frames) if !frames.is_empty() => frames, + _ => return Vec::new(), + }; + let parsed = crate::features::stacktrace::parse::ParsedStacks { + tid: capture::python_main_os_tid().unwrap_or(0), + source: StackSource::Vm, + flags: StackFlags::empty(), + frames, + }; + let folded: FoldedStacks = fold_parsed( + &parsed, + &FoldOptions { + thread_prefix: false, + canonicalize: true, + count: 1, + }, + ); + if folded.is_empty() { + return Vec::new(); + } + vec![folded.to_folded_line()] +} + +#[async_trait] +impl StackTracer for SignalTracer { + fn trace(&self, tid: Option) -> Result> { + log::debug!("Collecting backtrace for TID: {tid:?}"); + + let explicit = tid.filter(|&t| t > 0); + + if explicit.is_none() { + if is_python_main_thread() { + return Ok(Self::trace_current_thread_merged()); + } + return Self::trace_main_thread_off_signal(); + } + + let target = explicit.unwrap(); + if Self::is_main_tid(target) { + return Self::trace_main_thread_off_signal(); + } + + match catch_unwind(AssertUnwindSafe(|| Self::trace_thread_signal(target))) { + Ok(Ok(frames)) => Ok(frames), + Ok(Err(err)) => { + if is_backtrace_busy(&err) { + log::debug!("Cross-thread stack trace skipped for tid {target}: {err}"); + } else { + log::warn!("Cross-thread stack trace failed for tid {target}: {err}"); + } + Err(err) + } + Err(_) => { + log::warn!("Cross-thread stack trace panicked for tid {target}"); + Err(anyhow::anyhow!( + "cross-thread stack trace panicked for tid {target}" + )) + } + } + } +} + +static BACKTRACE_MUTEX: Lazy> = Lazy::new(|| tokio::sync::Mutex::new(())); + +/// Opt-in: deliver SIGUSR2 to the Python main OS tid for on-demand mixed stacks. +/// +/// Default off — required for Distributed stack refresh stability on Darwin. +fn allow_main_thread_sigusr2() -> bool { + match std::env::var("PROBING_STACK_SIGUSR2_MAIN") { + Ok(v) => matches!( + v.trim().to_ascii_lowercase().as_str(), + "1" | "true" | "yes" | "on" + ), + Err(_) => false, + } +} diff --git a/probing/extensions/python/src/features/stacktrace/tracers/mod.rs b/probing/extensions/python/src/features/stacktrace/tracers/mod.rs new file mode 100644 index 00000000..36d7ae8e --- /dev/null +++ b/probing/extensions/python/src/features/stacktrace/tracers/mod.rs @@ -0,0 +1,13 @@ +//! Stack acquisition tracers. +//! +//! | Tracer | Trigger | Consumers | +//! |--------|---------|-----------| +//! | [`vm`] | Eval-frame hook | Always on when tracing; records Python frames | +//! | [`pprof`] | `SIGPROF` | SQL / continuous CPU flamegraph | +//! | [`dynamic`] | `SIGUSR2` + sync walk | HTTP/command on-demand backtrace | +//! +//! Python frame payloads for [`pprof`] and [`dynamic`] always come from [`vm`]. + +pub mod dynamic; +pub mod pprof; +pub mod vm; diff --git a/probing/extensions/python/src/features/stacktrace/tracers/pprof.rs b/probing/extensions/python/src/features/stacktrace/tracers/pprof.rs new file mode 100644 index 00000000..7a16fe5e --- /dev/null +++ b/probing/extensions/python/src/features/stacktrace/tracers/pprof.rs @@ -0,0 +1,1180 @@ +//! CPU profiling via `SIGPROF` sampling ("model two": trigger in-signal, process +//! off-signal). +//! +//! Raw capture and Python/native merge live in [`crate::features::stacktrace::capture`] +//! / [`crate::features::stacktrace::merge`]; this module owns the ring buffer, +//! timer, and folded output. Python frames always come from the [`super::vm`] tracer. + +use std::cell::UnsafeCell; +use std::collections::HashMap; +use std::sync::atomic::{AtomicBool, AtomicPtr, AtomicU64, AtomicUsize, Ordering}; +use std::sync::Mutex; +use std::thread; +use std::time::{Duration, Instant}; + +use anyhow::{anyhow, Context, Result}; +use core::ffi::{c_int, c_void}; +use nix::libc; +use once_cell::sync::Lazy; +use serde_json::json; + +use crate::features::flamegraph::{FlamegraphKind, FlamegraphOptions}; +use crate::features::stacktrace::capture; +use crate::features::stacktrace::compact::CompactStack; +use crate::features::stacktrace::fingerprint; +use crate::features::stacktrace::fold::{fold_snapshot, FoldOptions}; +use crate::features::stacktrace::metrics; +use crate::features::stacktrace::snapshot::{StackFlags, StackSnapshot, StackSource}; + +const DEFAULT_SAMPLE_FREQ: i32 = 100; +const MIN_SAMPLE_FREQ: i32 = 1; +const MAX_SAMPLE_FREQ: i32 = 100_000; + +const RING_SIZE: usize = 512; +const RING_MASK: usize = RING_SIZE - 1; +const MAX_FOLDED_STACKS: usize = 1 << 17; + +// --------------------------------------------------------------------------- +// Lock-free bounded MPMC ring (Vyukov). Async-signal-safe producer side. +// --------------------------------------------------------------------------- + +struct Cell { + seq: AtomicUsize, + data: UnsafeCell, +} + +struct Ring { + buffer: Box<[Cell]>, + enqueue_pos: AtomicUsize, + dequeue_pos: AtomicUsize, +} + +unsafe impl Sync for Ring {} +unsafe impl Send for Ring {} + +impl Ring { + fn new() -> Ring { + let mut v: Vec = Vec::with_capacity(RING_SIZE); + for i in 0..RING_SIZE { + v.push(Cell { + seq: AtomicUsize::new(i), + data: UnsafeCell::new(StackSnapshot::zeroed()), + }); + } + Ring { + buffer: v.into_boxed_slice(), + enqueue_pos: AtomicUsize::new(0), + dequeue_pos: AtomicUsize::new(0), + } + } + + /// Claim a ring cell and fill it in place (keeps large snapshots off the + /// interrupted thread stack — important under `SIGPROF` + deep frames). + /// + /// `fill` should return `false` to abort the claim (cell is released unused). + fn enqueue_with(&self, fill: impl FnOnce(&mut StackSnapshot) -> bool) -> bool { + let mut pos = self.enqueue_pos.load(Ordering::Relaxed); + loop { + let cell = &self.buffer[pos & RING_MASK]; + let seq = cell.seq.load(Ordering::Acquire); + let diff = seq as isize - pos as isize; + if diff == 0 { + if self + .enqueue_pos + .compare_exchange_weak(pos, pos + 1, Ordering::Relaxed, Ordering::Relaxed) + .is_ok() + { + let dst = unsafe { &mut *cell.data.get() }; + if fill(dst) { + cell.seq.store(pos + 1, Ordering::Release); + return true; + } + // Release unused claim; zero in place (no StackSnapshot temporary). + unsafe { + core::ptr::write_bytes( + dst as *mut StackSnapshot as *mut u8, + 0, + core::mem::size_of::(), + ); + } + cell.seq.store(pos + 1, Ordering::Release); + return false; + } + } else if diff < 0 { + return false; + } else { + pos = self.enqueue_pos.load(Ordering::Relaxed); + } + } + } + + fn dequeue(&self, out: &mut StackSnapshot) -> bool { + let mut pos = self.dequeue_pos.load(Ordering::Relaxed); + loop { + let cell = &self.buffer[pos & RING_MASK]; + let seq = cell.seq.load(Ordering::Acquire); + let diff = seq as isize - (pos + 1) as isize; + if diff == 0 { + if self + .dequeue_pos + .compare_exchange_weak(pos, pos + 1, Ordering::Relaxed, Ordering::Relaxed) + .is_ok() + { + unsafe { *out = *cell.data.get() }; + cell.seq.store(pos + RING_SIZE, Ordering::Release); + return true; + } + } else if diff < 0 { + return false; + } else { + pos = self.dequeue_pos.load(Ordering::Relaxed); + } + } + } +} + +static RING_PTR: AtomicPtr = AtomicPtr::new(std::ptr::null_mut()); +static SAMPLER_ENABLED: AtomicBool = AtomicBool::new(false); +static HANDLER_ACTIVE: AtomicUsize = AtomicUsize::new(0); +static PPROF_OWNS_TRACER: AtomicBool = AtomicBool::new(false); +static HANDLER_INSTALLED: AtomicBool = AtomicBool::new(false); +/// Eval-frame cooperative sampling (no `ITIMER_PROF`). Period 0 = off. +static COOP_PERIOD_NS: AtomicU64 = AtomicU64::new(0); +static COOP_LAST_NS: AtomicU64 = AtomicU64::new(0); +static COOP_MODE: AtomicBool = AtomicBool::new(false); + +fn env_flag_truthy(name: &str) -> bool { + match std::env::var(name) { + Ok(v) => matches!( + v.trim().to_ascii_lowercase().as_str(), + "1" | "true" | "yes" | "on" + ), + Err(_) => false, + } +} + +/// Whether to use async `ITIMER_PROF`/`SIGPROF`. +/// +/// Darwin default: **false**. Delivering SIGPROF into Apple libc SIMD string +/// routines has repeatedly resumed as fixed-PC `SIGILL` at `_platform_strlen` +/// (observed at `0x18beb8adc`). macOS therefore samples from the eval-frame +/// hook instead. Opt into SIGPROF with `PROBING_PPROF_SIGPROF=1`. Force the +/// cooperative path everywhere with `PROBING_PPROF_COOPERATIVE=1`. +fn use_async_sigprof() -> bool { + if env_flag_truthy("PROBING_PPROF_COOPERATIVE") { + return false; + } + #[cfg(target_os = "macos")] + { + env_flag_truthy("PROBING_PPROF_SIGPROF") + } + #[cfg(not(target_os = "macos"))] + { + true + } +} + +fn monotonic_ns() -> u64 { + static START: Lazy = Lazy::new(Instant::now); + START.elapsed().as_nanos() as u64 +} + +fn fill_cooperative_snapshot(out: &mut StackSnapshot) { + // PYSTACKS only. A SyncWalk `backtrace::trace` from inside `rust_eval_frame` + // never sees `_PyEval_EvalFrameDefault` splice points, so merge used to + // concatenate interpreter trampolines (`_PyObject_Vectorcall`, probing's + // `_PyInit__core`, …) under every `[py]` frame — the "messy distributed + // stacks after enabling pprof" failure mode. Match the pre-pprof on-demand + // path: clean Python stacks with sample_freq weighting. + unsafe { + core::ptr::write_bytes( + out as *mut StackSnapshot as *mut u8, + 0, + core::mem::size_of::(), + ); + } + out.tid = capture::current_tid(); + out.source = StackSource::Vm; + + if let Some(py) = capture::copy_registered_py_snapshot(out.tid) { + let plen = py.py_len as usize; + out.py[..plen].copy_from_slice(&py.py[..plen]); + out.py_len = py.py_len; + out.flags + .insert(StackFlags(py.flags.0 & !StackFlags::PY_ABSENT.0)); + if py.flags.contains(StackFlags::PY_TRUNCATED) { + out.flags.insert(StackFlags::PY_TRUNCATED); + } + if py.flags.contains(StackFlags::PY_TORN) { + out.flags.insert(StackFlags::PY_TORN); + } + } else { + out.flags.insert(StackFlags::PY_ABSENT); + } +} + +/// Rate-limited sample from the eval-frame hook (GIL held). No-op unless +/// cooperative mode is active. +#[inline] +pub fn maybe_cooperative_sample() { + if !SAMPLER_ENABLED.load(Ordering::Relaxed) || !COOP_MODE.load(Ordering::Relaxed) { + return; + } + let period = COOP_PERIOD_NS.load(Ordering::Relaxed); + if period == 0 { + return; + } + let tid = capture::current_tid(); + if !accepts_main_thread_sample(tid, capture::python_main_os_tid()) { + return; + } + let now = monotonic_ns(); + let last = COOP_LAST_NS.load(Ordering::Relaxed); + if now.saturating_sub(last) < period { + return; + } + if COOP_LAST_NS + .compare_exchange(last, now, Ordering::AcqRel, Ordering::Relaxed) + .is_err() + { + return; + } + + let ring = RING_PTR.load(Ordering::Acquire); + if ring.is_null() { + return; + } + let ring = unsafe { &*ring }; + if !ring.enqueue_with(|dst| { + fill_cooperative_snapshot(dst); + if dst.is_empty() { + return false; + } + capture::store_latest_snapshot(dst); + true + }) { + metrics::inc_dropped_ring(); + } +} + +struct ActiveGuard; +impl ActiveGuard { + #[inline] + fn new() -> Self { + HANDLER_ACTIVE.fetch_add(1, Ordering::Acquire); + ActiveGuard + } +} +impl Drop for ActiveGuard { + #[inline] + fn drop(&mut self) { + HANDLER_ACTIVE.fetch_sub(1, Ordering::Release); + } +} + +#[cfg(unix)] +unsafe extern "C" fn sigprof_handler(_sig: c_int, _info: *mut libc::siginfo_t, uctx: *mut c_void) { + if !SAMPLER_ENABLED.load(Ordering::Acquire) { + return; + } + let _active = ActiveGuard::new(); + if !capture::on_signal_altstack() { + // No per-thread alt stack — do nothing rather than smash the training stack. + return; + } + let ring = RING_PTR.load(Ordering::Acquire); + if ring.is_null() { + return; + } + let ring = &*ring; + + // On Darwin even opt-in SIGPROF: PC + PYSTACKS only — FP walks enlarge the + // handler frame and have correlated with resume SIGILL into strlen. + let opts = capture::FillOpts { + walk_native: !cfg!(target_os = "macos"), + }; + let mut filled = false; + if ring.enqueue_with(|dst| { + filled = true; + capture::fill_raw_snapshot_with(dst, uctx, opts); + dst.source = StackSource::Sigprof; + if dst.is_empty() { + return false; + } + capture::store_latest_snapshot(dst); + true + }) { + return; + } + if filled { + return; + } + + if capture::fill_latest_from_uctx_with(uctx, StackSource::Sigprof, opts) { + metrics::inc_dropped_ring(); + } +} + +#[cfg(unix)] +fn install_handler() { + if HANDLER_INSTALLED.swap(true, Ordering::AcqRel) { + return; + } + capture::ensure_signal_altstack(); + unsafe { + let mut sa: libc::sigaction = std::mem::zeroed(); + sa.sa_sigaction = sigprof_handler as *const () as usize; + sa.sa_flags = libc::SA_SIGINFO | libc::SA_RESTART | libc::SA_ONSTACK; + libc::sigemptyset(&mut sa.sa_mask); + libc::sigaddset(&mut sa.sa_mask, libc::SIGUSR2); + libc::sigaction(libc::SIGPROF, &sa, std::ptr::null_mut()); + } +} + +#[cfg(not(unix))] +fn install_handler() {} + +#[cfg(unix)] +fn arm_timer(freq: i32) { + let period_us = (1_000_000i64 / freq as i64).max(1); + let tv = libc::timeval { + tv_sec: (period_us / 1_000_000) as libc::time_t, + tv_usec: (period_us % 1_000_000) as libc::suseconds_t, + }; + let it = libc::itimerval { + it_interval: tv, + it_value: tv, + }; + unsafe { libc::setitimer(libc::ITIMER_PROF, &it, std::ptr::null_mut()) }; +} + +#[cfg(not(unix))] +fn arm_timer(_freq: i32) {} + +#[cfg(unix)] +fn disarm_timer() { + let it: libc::itimerval = unsafe { std::mem::zeroed() }; + unsafe { libc::setitimer(libc::ITIMER_PROF, &it, std::ptr::null_mut()) }; +} + +#[cfg(not(unix))] +fn disarm_timer() {} + +/// Aggregated bucket: count + one compact representative for later fold. +/// +/// Fingerprint includes `tid`; this consumer still **filters to the Python main +/// OS tid only** so distributed main-thread flamegraphs stay clean. +struct AggregatedSample { + count: u64, + representative: CompactStack, +} + +struct SamplerState { + generation: AtomicU64, + samples: Mutex>, +} + +static SAMPLER: Lazy = Lazy::new(|| SamplerState { + generation: AtomicU64::new(0), + samples: Mutex::new(HashMap::new()), +}); + +/// Keep only samples from the registered Python main OS tid. +/// +/// When the main tid is unknown, drop the sample — otherwise worker threads can +/// leak into the distributed main-thread flamegraph. +fn accepts_main_thread_sample(sample_tid: u64, main_tid: Option) -> bool { + match main_tid { + Some(main) => sample_tid == main, + None => false, + } +} + +fn process_sample(s: &StackSnapshot) { + if s.flags.contains(StackFlags::PY_TORN) { + metrics::inc_dropped_torn(); + return; + } + // Contract: only Python main OS tid enters the CPU flamegraph map. + if !accepts_main_thread_sample(s.tid, capture::python_main_os_tid()) { + metrics::inc_dropped_not_main(); + return; + } + if s.is_empty() { + return; + } + let fp = fingerprint::fingerprint(s); + if let Ok(mut map) = SAMPLER.samples.lock() { + if let Some(entry) = map.get_mut(&fp) { + entry.count = entry.count.saturating_add(1); + metrics::inc_fingerprint_hit(); + } else if map.len() < MAX_FOLDED_STACKS { + map.insert( + fp, + AggregatedSample { + count: 1, + representative: CompactStack::from_snapshot(s), + }, + ); + metrics::inc_fingerprint_miss(); + } else { + metrics::inc_dropped_capacity(); + } + } +} + +fn consumer_loop(my_gen: u64) { + let mut sample = StackSnapshot::zeroed(); + loop { + let stopping = SAMPLER.generation.load(Ordering::SeqCst) != my_gen; + let ring = RING_PTR.load(Ordering::Acquire); + let mut drained = false; + if !ring.is_null() { + let ring = unsafe { &*ring }; + while ring.dequeue(&mut sample) { + drained = true; + process_sample(&sample); + } + } + if stopping { + break; + } + if !drained { + thread::sleep(Duration::from_millis(2)); + } + } +} + +pub fn is_sampling_active() -> bool { + SAMPLER_ENABLED.load(Ordering::Acquire) +} + +pub fn setup(freq: u64) -> Result<()> { + #[cfg(not(unix))] + { + let _ = freq; + return Err(anyhow::anyhow!( + "CPU profiling (SIGPROF) is not supported on this platform" + )); + } + #[cfg(unix)] + setup_unix(freq) +} + +#[cfg(unix)] +fn setup_unix(freq: u64) -> Result<()> { + let freq = if freq == 0 { + DEFAULT_SAMPLE_FREQ + } else { + (freq as i32).clamp(MIN_SAMPLE_FREQ, MAX_SAMPLE_FREQ) + }; + + if RING_PTR.load(Ordering::Acquire).is_null() { + let ptr = Box::into_raw(Box::new(Ring::new())); + if RING_PTR + .compare_exchange( + std::ptr::null_mut(), + ptr, + Ordering::AcqRel, + Ordering::Acquire, + ) + .is_err() + { + unsafe { drop(Box::from_raw(ptr)) }; + } + } + + if let Ok(mut map) = SAMPLER.samples.lock() { + map.clear(); + } + metrics::reset_sampler_counters(); + + crate::features::stacktrace::tracers::vm::initialize_globals(); + pyo3::Python::attach(|_py| { + let already_on = crate::features::stacktrace::tracers::vm::is_tracer_enabled(); + match crate::features::stacktrace::tracers::vm::enable_tracer() { + Ok(()) => { + if !already_on { + PPROF_OWNS_TRACER.store(true, Ordering::Release); + } + } + Err(e) => log::warn!( + "probing: pprof could not enable the Python eval tracer ({e}); \ + stacks will be native-only" + ), + } + }); + + let async_sigprof = use_async_sigprof(); + COOP_MODE.store(!async_sigprof, Ordering::Release); + if async_sigprof { + COOP_PERIOD_NS.store(0, Ordering::Release); + install_handler(); + } else { + let period_ns = (1_000_000_000u64 / freq as u64).max(1); + COOP_PERIOD_NS.store(period_ns, Ordering::Release); + COOP_LAST_NS.store(0, Ordering::Release); + } + + let my_gen = SAMPLER.generation.fetch_add(1, Ordering::SeqCst) + 1; + capture::set_pprof_sampling_active(true); + SAMPLER_ENABLED.store(true, Ordering::Release); + + thread::Builder::new() + .name("probing-sampler".into()) + .spawn(move || consumer_loop(my_gen)) + .context("failed to spawn sampler consumer thread")?; + + if async_sigprof { + arm_timer(freq); + log::info!("probing: SIGPROF CPU sampler started ({freq} Hz, Python+native)"); + } else { + log::info!( + "probing: cooperative CPU sampler started ({freq} Hz, eval-frame; \ + Darwin defaults to this — set PROBING_PPROF_SIGPROF=1 to force ITIMER_PROF)" + ); + } + Ok(()) +} + +pub fn reset() { + disarm_timer(); + COOP_MODE.store(false, Ordering::Release); + COOP_PERIOD_NS.store(0, Ordering::Release); + capture::set_pprof_sampling_active(false); + SAMPLER_ENABLED.store(false, Ordering::Release); + SAMPLER.generation.fetch_add(1, Ordering::SeqCst); + + let ring = RING_PTR.swap(std::ptr::null_mut(), Ordering::AcqRel); + if !ring.is_null() { + let mut drained = false; + for _ in 0..10_000_000 { + if HANDLER_ACTIVE.load(Ordering::Acquire) == 0 { + drained = true; + break; + } + std::hint::spin_loop(); + } + if drained { + unsafe { drop(Box::from_raw(ring)) }; + } else { + RING_PTR.store(ring, Ordering::Release); + } + } + + if PPROF_OWNS_TRACER.swap(false, Ordering::AcqRel) { + pyo3::Python::attach(|_py| { + let _ = crate::features::stacktrace::tracers::vm::disable_tracer(); + }); + } + + capture::clear_py_symbols(); +} + +pub fn pprof_handler() { + let _ = setup(DEFAULT_SAMPLE_FREQ as u64); +} + +fn pprof_flamegraph_options() -> FlamegraphOptions { + let subtitle = if COOP_MODE.load(Ordering::Relaxed) { + "eval-frame cooperative stack samples".to_string() + } else { + "SIGPROF weighted stack samples".to_string() + }; + FlamegraphOptions { + title: "CPU sampling".to_string(), + count_name: "samples".to_string(), + kind: FlamegraphKind::Classic, + subtitle, + metric: None, + profile: Some("cpu-stack".to_string()), + } +} + +fn folded_lines_from_sampler() -> Vec { + let buckets = match SAMPLER.samples.lock() { + Ok(map) => map + .values() + .map(|e| (e.representative.clone(), e.count)) + .collect::>(), + Err(_) => return Vec::new(), + }; + let mut cache = HashMap::new(); + let mut lines = Vec::with_capacity(buckets.len()); + for (compact, count) in buckets { + let snap = compact.to_snapshot(); + let folded = fold_snapshot( + &snap, + &mut cache, + &FoldOptions { + thread_prefix: true, + canonicalize: true, + count, + }, + ); + if !folded.is_empty() { + lines.push(folded.to_folded_line()); + } + } + lines +} + +/// Local folded stacks for Distributed / pprof export. +/// +/// When `sample_freq` is on, **only** return aggregated sampler buckets — never +/// fall back to on-demand `SIGUSR2` / one-shot PYSTACKS (empty buckets → empty +/// flamegraph until samples arrive). +fn local_folded_lines() -> Vec { + if is_sampling_active() { + return folded_lines_from_sampler(); + } + crate::features::stacktrace::tracers::dynamic::main_thread_on_demand_folded_lines() +} + +fn sampler_mode_label() -> &'static str { + if COOP_MODE.load(Ordering::Relaxed) { + "eval-frame Python samples (cooperative)" + } else { + "SIGPROF main-thread samples" + } +} + +fn folded_lines() -> Vec { + local_folded_lines() +} + +/// Snapshot of local SIGPROF folded stacks (`"path count"` per line). +pub fn folded_lines_snapshot() -> Vec { + folded_lines() +} + +/// Build distributed stack flamegraph JSON from attributed folded lines across ranks. +pub fn distributed_stack_flamegraph_json( + lines: &[crate::features::flamegraph::AttributedFoldedLine], + rank_count: usize, + nodes_failed: &[String], + mode: &str, +) -> String { + let python_only = mode == "py"; + let profile = if python_only { + "cpu-stack-distributed-py" + } else { + "cpu-stack-distributed" + }; + let dropped = metrics::dropped_ring(); + let empty = |msg: &str| { + json!({ + "profile": profile, + "title": if python_only { "Distributed Python stacks" } else { "Distributed CPU stacks" }, + "subtitle": format!( + "SIGPROF mixed-mode stacks · {rank_count} ranks · merge identical paths" + ), + "countName": "samples", + "total": 0, + "width": 1400.0, + "frameHeight": 32.0, + "frames": [], + "dropped": dropped, + "emptyMessage": msg, + "nodesFailed": nodes_failed, + "rankCount": rank_count, + }) + .to_string() + }; + + if lines.is_empty() { + return empty(if python_only { + "no Python stack samples yet; set probing.pprof.sample_freq=50 on each rank (Distributed refresh no longer SIGUSR2s the main thread)" + } else { + "no mixed CPU stacks yet; set probing.pprof.sample_freq=50 on each rank — without SIGPROF only PYSTACKS (Python-only) is available" + }); + } + + let subtitle = if python_only { + if is_sampling_active() { + format!( + "Python frames only · {} · {rank_count} ranks merged", + sampler_mode_label() + ) + } else { + format!("Python frames only · one-shot PYSTACKS snapshot · {rank_count} ranks merged") + } + } else if is_sampling_active() { + format!( + "Full mixed stack · {} · {rank_count} ranks merged", + sampler_mode_label() + ) + } else { + format!( + "Full mixed stack · one-shot main-thread snapshot (enable sample_freq for accumulation) · {rank_count} ranks merged" + ) + }; + let opts = FlamegraphOptions { + title: if python_only { + "Distributed Python stacks".to_string() + } else { + "Distributed CPU stacks".to_string() + }, + count_name: "samples".to_string(), + kind: FlamegraphKind::Classic, + subtitle, + metric: None, + profile: Some(profile.to_string()), + }; + + match crate::features::flamegraph::Flamegraph::from_attributed_folded_lines(lines) { + Some(fg) => { + let payload = fg.json_payload(&opts); + match serde_json::from_str::(&payload) { + Ok(mut v) => { + if let Some(obj) = v.as_object_mut() { + obj.insert("dropped".to_string(), json!(dropped)); + obj.insert("rankCount".to_string(), json!(rank_count)); + if !nodes_failed.is_empty() { + obj.insert("nodesFailed".to_string(), json!(nodes_failed)); + } + } + v.to_string() + } + Err(_) => payload, + } + } + None => empty("no valid folded stacks after merge"), + } +} + +fn local_training_rank() -> Option { + std::env::var("RANK") + .ok() + .and_then(|s| s.trim().parse().ok()) + .or_else(|| { + std::env::var("LOCAL_RANK") + .ok() + .and_then(|s| s.trim().parse().ok()) + }) +} + +/// Distinct training ranks that contributed non-empty folded stacks. +/// +/// Do **not** count HTTP fan-out successes: a duplicate peer scrape of the +/// local rank (addr mismatch) previously inflated `rankCount` to 3 on a +/// 2-rank job while frame `ranks` still showed `0, 1`. +fn unique_contributor_rank_count(sets: &[(Option, Vec)]) -> usize { + use std::collections::BTreeSet; + let mut ranks = BTreeSet::new(); + let mut unranked = 0usize; + for (rank, lines) in sets { + if lines.is_empty() { + continue; + } + match rank { + Some(r) => { + ranks.insert(*r); + } + None => unranked += 1, + } + } + ranks.len() + unranked +} + +fn remote_pprof_folded_lines_blocking(addr: &str) -> anyhow::Result> { + let url = format!("http://{addr}/apis/pprofextension/flamegraph/folded/json"); + let timeout = std::time::Duration::from_secs( + std::env::var("PROBING_CLUSTER_QUERY_TIMEOUT_SEC") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(10), + ); + let text = ureq::get(&url) + .config() + .timeout_global(Some(timeout)) + .build() + .call()? + .body_mut() + .read_to_string()?; + #[derive(serde::Deserialize)] + struct Payload { + lines: Vec, + } + Ok(serde_json::from_str::(&text)?.lines) +} + +fn remote_pprof_flamegraph_json_blocking(addr: &str) -> anyhow::Result { + let url = format!("http://{addr}/apis/pprofextension/flamegraph/json"); + let timeout = std::time::Duration::from_secs( + std::env::var("PROBING_CLUSTER_QUERY_TIMEOUT_SEC") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(10), + ); + let text = ureq::get(&url) + .config() + .timeout_global(Some(timeout)) + .build() + .call()? + .body_mut() + .read_to_string()?; + Ok(text) +} + +fn remote_pprof_folded_lines_fallback(addr: &str) -> anyhow::Result> { + remote_pprof_folded_lines_blocking(addr).or_else(|_| { + let json = remote_pprof_flamegraph_json_blocking(addr)?; + Ok(crate::features::flamegraph::folded_lines_from_flamegraph_json(&json)) + }) +} + +/// Cluster fan-out + merge for distributed CPU stack flamegraph JSON. +/// +/// `mode`: `mixed` (Python + native) or `py` (Python frames only). +/// +/// Returns `(json_body, partial)` where `partial` is true when some peers failed. +pub async fn collect_distributed_stack_flamegraph_json( + cluster: bool, + mode: &str, +) -> (String, bool) { + let mode = if mode == "py" { "py" } else { "mixed" }; + use probing_core::core::cluster::{get_nodes, is_node_alive, local_listen_addrs}; + use std::collections::BTreeSet; + + let mut line_sets: Vec<(Option, Vec)> = Vec::new(); + let mut seen_ranks: BTreeSet = BTreeSet::new(); + let mut nodes_failed = Vec::new(); + + let local_rank = local_training_rank(); + if let Some(r) = local_rank { + seen_ranks.insert(r); + } + line_sets.push((local_rank, folded_lines_snapshot())); + + if cluster { + let local_addrs = local_listen_addrs(); + let peers: Vec<_> = get_nodes() + .into_iter() + .filter(is_node_alive) + .filter(|node| !local_addrs.iter().any(|local| local == &node.addr)) + .collect(); + + for node in peers { + let addr = node.addr.clone(); + let peer_rank = node.rank; + if let Some(r) = peer_rank { + if seen_ranks.contains(&r) { + log::debug!( + "distributed stack flamegraph: skip duplicate rank {r} from {addr}" + ); + continue; + } + } + match tokio::task::spawn_blocking(move || remote_pprof_folded_lines_fallback(&addr)) + .await + { + Ok(Ok(lines)) => { + if let Some(r) = peer_rank { + seen_ranks.insert(r); + } + line_sets.push((peer_rank, lines)); + } + Ok(Err(err)) => { + log::warn!( + "distributed stack flamegraph fan-out {} failed: {err:#}", + node.addr + ); + nodes_failed.push(format!("{}: {err:#}", node.addr)); + } + Err(err) => { + nodes_failed.push(format!("{}: task join failed: {err}", node.addr)); + } + } + } + } + + let rank_count = unique_contributor_rank_count(&line_sets); + let mut merged = crate::features::flamegraph::merge_distributed_stack_attributed(&line_sets); + if mode == "py" { + merged = crate::features::flamegraph::filter_attributed_folded_lines_python_only(&merged); + } + let body = distributed_stack_flamegraph_json(&merged, rank_count, &nodes_failed, mode); + (body, !nodes_failed.is_empty()) +} + +/// Raw folded stack lines for cluster fan-out (`{"lines":["stack count", ...]}`). +pub fn folded_lines_json() -> String { + json!({ "lines": folded_lines_snapshot() }).to_string() +} + +pub fn flamegraph() -> Result { + let lines = folded_lines(); + if lines.is_empty() { + return Err(anyhow!( + "no samples collected yet; enable CPU sampling and let it run" + )); + } + + let dropped = metrics::dropped_ring(); + if dropped > 0 { + log::warn!("probing: {dropped} CPU samples dropped (ring full or cardinality cap)"); + } + + let fg = crate::features::flamegraph::Flamegraph::from_folded_lines(&lines) + .ok_or_else(|| anyhow!("no valid folded stacks"))?; + Ok(fg.render_html(&pprof_flamegraph_options())) +} + +pub fn flamegraph_json() -> String { + let dropped = metrics::dropped_ring(); + let empty = |msg: String| { + json!({ + "profile": "cpu-stack", + "title": "CPU sampling", + "subtitle": "SIGPROF weighted stack samples", + "countName": "samples", + "total": 0, + "width": 1400.0, + "frameHeight": 32.0, + "frames": [], + "dropped": dropped, + "metrics": metrics::snapshot_json(), + "emptyMessage": msg, + }) + .to_string() + }; + + let lines = folded_lines(); + if lines.is_empty() { + return empty( + "no samples collected yet; enable CPU sampling or use Stacks → Default".to_string(), + ); + } + + match crate::features::flamegraph::Flamegraph::from_folded_lines(&lines) { + Some(fg) => { + let payload = fg.json_payload(&pprof_flamegraph_options()); + match serde_json::from_str::(&payload) { + Ok(mut v) => { + if let Some(obj) = v.as_object_mut() { + obj.insert("dropped".to_string(), json!(dropped)); + obj.insert("metrics".to_string(), metrics::snapshot_json()); + } + v.to_string() + } + Err(_) => payload, + } + } + None => empty("no valid folded stacks".to_string()), + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::features::stacktrace::metrics; + use crate::features::stacktrace::snapshot::{StackFlags, StackSnapshot, StackSource}; + use std::sync::Mutex; + use std::time::{Duration, Instant}; + + /// Serialize sampler-map mutation tests (non-signal). + static SAMPLER_TEST_LOCK: Mutex<()> = Mutex::new(()); + + fn with_sampler_lock(f: impl FnOnce() -> R) -> R { + let _g = SAMPLER_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + f() + } + + fn clear_sampler_buckets() { + if let Ok(mut map) = SAMPLER.samples.lock() { + map.clear(); + } + metrics::reset_sampler_counters(); + } + + #[cfg(unix)] + fn ensure_ring() { + if RING_PTR.load(Ordering::Acquire).is_null() { + let ptr = Box::into_raw(Box::new(Ring::new())); + let _ = RING_PTR.compare_exchange( + std::ptr::null_mut(), + ptr, + Ordering::AcqRel, + Ordering::Acquire, + ); + if RING_PTR.load(Ordering::Acquire) != ptr { + unsafe { drop(Box::from_raw(ptr)) }; + } + } + } + + #[test] + fn accepts_only_registered_python_main_tid() { + assert!(accepts_main_thread_sample(10, Some(10))); + assert!(!accepts_main_thread_sample(11, Some(10))); + // Unknown main tid: drop sample so worker threads cannot pollute flamegraph. + assert!(!accepts_main_thread_sample(10, None)); + } + + #[test] + fn fingerprint_hit_defers_fold_until_export() { + with_sampler_lock(|| { + capture::register_main_os_tid(); + let main = capture::python_main_os_tid().expect("main tid"); + clear_sampler_buckets(); + + let snap = StackSnapshot::from_parts( + main, + StackSource::Sigprof, + &[0x1111_aaa0, 0x2222_bbb0], + &[], + StackFlags::PY_ABSENT, + ); + process_sample(&snap); + process_sample(&snap); + process_sample(&snap); + + assert_eq!(metrics::fingerprint_misses(), 1); + assert_eq!(metrics::fingerprint_hits(), 2); + assert_eq!( + metrics::fold_calls(), + 0, + "lazy pipeline: fold must wait for export" + ); + + let folds_before = metrics::fold_calls(); + let lines = folded_lines_from_sampler(); + assert_eq!(metrics::fold_calls(), folds_before + 1); + assert_eq!(lines.len(), 1); + assert!( + lines[0].ends_with(" 3"), + "aggregated count should be 3, got {:?}", + lines[0] + ); + }); + } + + #[test] + fn non_main_tid_increments_dropped_not_main() { + with_sampler_lock(|| { + capture::register_main_os_tid(); + let main = capture::python_main_os_tid().expect("main tid"); + clear_sampler_buckets(); + let before = metrics::dropped_not_main(); + + let snap = StackSnapshot::from_parts( + main.wrapping_add(9_001), + StackSource::Sigprof, + &[0x10], + &[], + StackFlags::PY_ABSENT, + ); + process_sample(&snap); + assert!(metrics::dropped_not_main() > before); + assert_eq!(metrics::fingerprint_misses(), 0); + assert!(SAMPLER.samples.lock().unwrap().is_empty()); + }); + } + + /// Real `SIGPROF` → handler → `latest` slot with a native PC. + #[cfg(unix)] + #[test] + fn sigprof_signal_publishes_latest_native_pc() { + capture::with_signal_test_lock(|| { + ensure_ring(); + install_handler(); + capture::register_python_thread(); + capture::register_main_os_tid(); + let tid = capture::current_tid(); + + SAMPLER_ENABLED.store(true, Ordering::Release); + let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + let deadline = Instant::now() + Duration::from_secs(2); + loop { + unsafe { + libc::raise(libc::SIGPROF); + } + if let Some((snap, _)) = capture::latest_snapshot_with_seq(tid) { + if snap.source == StackSource::Sigprof && snap.native_len >= 1 { + return; + } + } + if Instant::now() >= deadline { + panic!( + "SIGPROF handler did not publish a native PC on tid={tid} within timeout" + ); + } + thread::sleep(Duration::from_millis(2)); + } + })); + SAMPLER_ENABLED.store(false, Ordering::Release); + result.expect("sigprof integration"); + }); + } + + #[test] + fn unique_contributor_rank_count_dedupes_duplicate_rank_scrapes() { + let sets = vec![ + (Some(0), vec!["[py] a 1".to_string()]), + (Some(0), vec!["[py] a 1".to_string()]), // duplicate local scrape + (Some(1), vec!["[py] a 1".to_string()]), + ]; + assert_eq!(unique_contributor_rank_count(&sets), 2); + } + + #[test] + fn unique_contributor_rank_count_ignores_empty_line_sets() { + let sets = vec![ + (Some(0), vec!["[py] a 1".to_string()]), + (Some(1), Vec::new()), + (None, vec!["[py] b 1".to_string()]), + ]; + assert_eq!(unique_contributor_rank_count(&sets), 2); + } + + #[test] + fn sampling_active_folded_export_skips_on_demand_fallback() { + with_sampler_lock(|| { + clear_sampler_buckets(); + SAMPLER_ENABLED.store(true, Ordering::Release); + let lines = local_folded_lines(); + SAMPLER_ENABLED.store(false, Ordering::Release); + assert!( + lines.is_empty(), + "with sample_freq on and empty buckets, must not invent on-demand lines: {lines:?}" + ); + }); + } + + /// Ring survives a real SIGPROF enqueue and consumer-side dequeue. + #[cfg(unix)] + #[test] + fn sigprof_ring_enqueue_from_handler_is_dequeued() { + capture::with_signal_test_lock(|| { + ensure_ring(); + install_handler(); + capture::register_python_thread(); + capture::register_main_os_tid(); + + let ring = unsafe { &*RING_PTR.load(Ordering::Acquire) }; + let mut junk = StackSnapshot::zeroed(); + while ring.dequeue(&mut junk) {} + + SAMPLER_ENABLED.store(true, Ordering::Release); + let deadline = Instant::now() + Duration::from_secs(2); + let mut got = StackSnapshot::zeroed(); + let mut ok = false; + while Instant::now() < deadline { + unsafe { + libc::raise(libc::SIGPROF); + } + if ring.dequeue(&mut got) + && got.source == StackSource::Sigprof + && got.native_len >= 1 + { + ok = true; + break; + } + thread::sleep(Duration::from_millis(2)); + } + SAMPLER_ENABLED.store(false, Ordering::Release); + assert!(ok, "expected SIGPROF sample on ring with native PC"); + }); + } +} diff --git a/probing/extensions/python/src/features/vm_tracer.rs b/probing/extensions/python/src/features/stacktrace/tracers/vm.rs similarity index 81% rename from probing/extensions/python/src/features/vm_tracer.rs rename to probing/extensions/python/src/features/stacktrace/tracers/vm.rs index e1a68470..cf4ff0c5 100644 --- a/probing/extensions/python/src/features/vm_tracer.rs +++ b/probing/extensions/python/src/features/stacktrace/tracers/vm.rs @@ -4,14 +4,13 @@ use pyo3::prelude::*; use probing_proto::prelude::CallFrame; -use crate::features::spy::call::RawCallLocation; -use crate::features::spy::{get_current_frame, get_prev_frame}; +use crate::features::stacktrace::spy::call::RawCallLocation; +use crate::features::stacktrace::spy::{get_current_frame, get_prev_frame}; -use super::spy::python_bindings; - -use crate::features::spy::ffi; -use crate::features::spy::with_spy_state; -use crate::features::spy::PYVERSION; +use crate::features::stacktrace::spy::ffi; +use crate::features::stacktrace::spy::python_bindings; +use crate::features::stacktrace::spy::with_spy_state; +use crate::features::stacktrace::spy::PYVERSION; #[allow(static_mut_refs)] pub fn initialize_globals() -> bool { @@ -51,14 +50,14 @@ unsafe extern "C" fn rust_eval_frame( with_spy_state(|state| { // Mark this thread as a Python thread once; lets the SIGPROF sampler know its // thread-local `PYSTACKS` is allocated and safe to read from a signal handler. - crate::features::stack_capture::register_python_thread(); + crate::features::stacktrace::capture::register_python_thread(); // Resolve this frame's callee symbol *now*, while the code object is alive // under the GIL, and cache it by pointer. The SIGPROF consumer later looks // the label up by integer key instead of dereferencing a possibly-freed // `PyCodeObject` off the signal path. let loc = RawCallLocation::from(frame as usize, Some(ts as usize)); - crate::features::stack_capture::intern_py_frame(&loc); + crate::features::stacktrace::capture::intern_py_frame(&loc); // Bracket the `PYSTACKS` mutation so a SIGPROF sample taken mid-realloc is // discarded instead of reading a torn `Vec`. @@ -68,6 +67,10 @@ unsafe extern "C" fn rust_eval_frame( compiler_fence(Ordering::SeqCst); (*state).writing = false; + // macOS default: sample here (no ITIMER_PROF). After PYSTACKS push so + // the current frame is visible. No-op when async SIGPROF is armed. + crate::features::stacktrace::tracers::pprof::maybe_cooperative_sample(); + let ret = ((*state).frame_eval)(ts, frame, extra); (*state).writing = true; @@ -127,7 +130,7 @@ pub fn disable_tracer() -> PyResult<()> { }); } } - crate::features::stack_capture::clear_py_symbols(); + crate::features::stacktrace::capture::clear_py_symbols(); Ok(()) } @@ -173,6 +176,37 @@ pub fn _get_python_frames(py: Python) -> PyResult> { Ok(py_list.into()) } +/// Copy TLS `PYSTACKS` callee keys (outer → inner), same order as signal fill. +/// +/// Returns `None` when the TLS buffer is unavailable, empty, or mid-mutation +/// (`writing`). Interns each key while the GIL holds code objects. +#[allow(static_mut_refs)] +pub fn copy_pystacks_callee_keys() -> Option> { + use std::sync::atomic::{compiler_fence, Ordering}; + + with_spy_state(|state| unsafe { + if (*state).stacks.capacity() == 0 { + return None; + } + if (*state).writing { + return None; + } + compiler_fence(Ordering::SeqCst); + let keys: Vec = (*state).stacks.iter().map(|loc| loc.callee()).collect(); + compiler_fence(Ordering::SeqCst); + if (*state).writing { + return None; + } + if keys.is_empty() { + return None; + } + for loc in (*state).stacks.iter() { + crate::features::stacktrace::capture::intern_py_frame(loc); + } + Some(keys) + }) +} + #[allow(static_mut_refs)] pub fn get_python_stacks_raw() -> Vec { with_spy_state(|state| unsafe { diff --git a/probing/extensions/python/src/features/torch.rs b/probing/extensions/python/src/features/torch/mod.rs similarity index 99% rename from probing/extensions/python/src/features/torch.rs rename to probing/extensions/python/src/features/torch/mod.rs index 7438fd54..9384b737 100644 --- a/probing/extensions/python/src/features/torch.rs +++ b/probing/extensions/python/src/features/torch/mod.rs @@ -1,3 +1,8 @@ +//! Torch module profiling: flamegraph / JSON from `python.torch_trace`. +//! +//! HTTP entrypoints live in [`crate::extensions::torch`]; rendering uses +//! [`crate::features::flamegraph`]. + use std::{collections::BTreeMap, collections::HashMap, collections::HashSet, thread}; use anyhow::{Context, Result}; diff --git a/probing/extensions/python/src/setup.rs b/probing/extensions/python/src/setup.rs index 1270355c..6865b1bd 100644 --- a/probing/extensions/python/src/setup.rs +++ b/probing/extensions/python/src/setup.rs @@ -22,6 +22,6 @@ fn setup() { nix::libc::signal(nix::libc::SIGUSR2, nix::libc::SIG_IGN); } } else { - crate::features::stack_capture::install_sigusr2_handler(); + crate::features::stacktrace::capture::install_sigusr2_handler(); } } diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index 138e9348..c16200ee 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -433,7 +433,9 @@ pub async fn get_distributed_stack_flamegraph_json( let cluster = params.cluster.unwrap_or(true); let mode = params.mode.as_deref().unwrap_or("mixed"); let (body, partial) = - probing_python::features::pprof::collect_distributed_stack_flamegraph_json(cluster, mode) + probing_python::features::stacktrace::tracers::pprof::collect_distributed_stack_flamegraph_json( + cluster, mode, + ) .await; let status = if partial { StatusCode::SERVICE_UNAVAILABLE diff --git a/src/lib.rs b/src/lib.rs index edeb283c..60f9ce23 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,10 +7,10 @@ use pyo3::prelude::*; use probing_cli::pyo3::cli_main; use probing_core::{install_panic_hook, register_python_main_thread}; use probing_python::extensions::python::{register_table_docs, ExternalTable}; -use probing_python::features::config; -use probing_python::features::python_api::query_json; -use probing_python::features::tracing; -use probing_python::features::vm_tracer::{ +use probing_python::features::python::bindings; +use probing_python::features::python::bindings::query_json; +use probing_python::features::python::tracing; +use probing_python::features::stacktrace::vm::{ _get_python_frames, _get_python_stacks, disable_tracer, enable_tracer, initialize_globals, }; use probing_server::sync_env_settings; @@ -203,7 +203,7 @@ fn start_local() { #[pymodule(gil_used = true)] fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { register_python_main_thread(); - probing_python::features::stack_capture::register_main_os_tid(); + probing_python::features::stacktrace::capture::register_main_os_tid(); // Initialize logging (try_init to avoid conflicts if already initialized via #[ctor]) let _ = env_logger::try_init_from_env(env_logger::Env::new().filter(ENV_PROBING_LOGLEVEL)); @@ -232,17 +232,17 @@ fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(_get_python_frames, m)?)?; m.add_function(wrap_pyfunction!(cli_main, m)?)?; m.add_function(wrap_pyfunction!( - probing_python::features::python_api::api_callstack, + probing_python::features::python::bindings::api_callstack, m )?)?; m.add_function(wrap_pyfunction!( - probing_python::features::python_api::api_eval, + probing_python::features::python::bindings::api_eval, m )?)?; register_skills_bindings(m)?; // Add is_enabled function to help tests check state - use probing_python::features::python_api::{is_enabled, should_enable_probing}; + use probing_python::features::python::bindings::{is_enabled, should_enable_probing}; m.add_function(wrap_pyfunction!(is_enabled, m)?)?; m.add_function(wrap_pyfunction!(should_enable_probing, m)?)?; use probing_python::features::crash::{ @@ -269,7 +269,7 @@ fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(refresh_torchrun_cluster_role, m)?)?; // Register config functions directly to the module (flattened) - config::register_config_functions(m)?; + bindings::register_config_functions(m)?; // Register tracing classes and functions directly to the module (flattened) tracing::register_tracing_functions(m)?; diff --git a/tests/regression/rust/Cargo.toml b/tests/regression/rust/Cargo.toml index 64dc3623..b25a3926 100644 --- a/tests/regression/rust/Cargo.toml +++ b/tests/regression/rust/Cargo.toml @@ -97,3 +97,7 @@ path = "probing/python/py_to_table.rs" [[test]] name = "python_distributed_flamegraph" path = "probing/python/distributed_flamegraph_tests.rs" + +[[test]] +name = "python_stacktrace_signal" +path = "probing/python/stacktrace_signal_tests.rs" diff --git a/tests/regression/rust/probing/python/stacktrace_signal_tests.rs b/tests/regression/rust/probing/python/stacktrace_signal_tests.rs new file mode 100644 index 00000000..6cc86211 --- /dev/null +++ b/tests/regression/rust/probing/python/stacktrace_signal_tests.rs @@ -0,0 +1,31 @@ +//! Signal-path integration for stacktrace capture (public APIs). +//! +//! Crate-local unit tests cover SIGPROF handler + ring; this binary exercises +//! the SIGUSR2 on-demand contract used by HTTP / dynamic tracers. + +#![cfg(unix)] + +use std::time::Duration; + +use probing_python::features::stacktrace::capture; +use probing_python::features::stacktrace::snapshot::StackSource; + +#[test] +fn sigusr2_public_api_captures_native_pc_on_current_thread() { + capture::install_sigusr2_handler(); + capture::register_python_thread(); + capture::register_main_os_tid(); + + let tid = capture::current_tid(); + let snap = capture::capture_thread_snapshot_signal(tid, Duration::from_secs(2)) + .expect("SIGUSR2 snapshot via public capture API"); + + assert_eq!(snap.tid, tid); + assert_eq!(snap.source, StackSource::Sigusr2); + assert!( + snap.native_len >= 1, + "expected at least the interrupted PC; flags={:?} native_len={}", + snap.flags, + snap.native_len + ); +} From 95c4ad8d5dac024025be9a9c882e426897369c24 Mon Sep 17 00:00:00 2001 From: PengchengShi00 <146822991+PengchengShi00@users.noreply.github.com> Date: Sun, 19 Jul 2026 01:01:16 +0800 Subject: [PATCH 20/37] Feat/slime (#71) * feat: add Probing-RL online observability for agentic RL training [WIP] * support RL-slime perference analysis --- Cargo.lock | 2 + README.md | 2 +- docs/rl/agent-runtime.md | 191 ++ docs/rl/assets/placeholders/README.md | 15 + .../placeholders/cross-process-spans.png | Bin 0 -> 266241 bytes docs/rl/assets/placeholders/engine_metric.png | Bin 0 -> 140736 bytes .../rl/assets/placeholders/engine_summary.png | Bin 0 -> 130998 bytes .../assets/placeholders/perfetto-export.png | Bin 0 -> 226898 bytes .../assets/placeholders/rollout-view-main.png | Bin 0 -> 176999 bytes .../placeholders/sample-phase-detail.png | Bin 0 -> 249591 bytes docs/rl/assets/placeholders/train-view.png | Bin 0 -> 46600 bytes docs/rl/inference-engine-metrics.md | 158 + examples/ray_job_actor_span_demo.py | 582 ++++ examples/run_inference_metrics_demo.sh | 6 + examples/sglang_inference_metrics_demo.py | 179 ++ probing/core/src/core/mod.rs | 2 + probing/memtable/src/docs.rs | 21 +- probing/server/Cargo.toml | 2 + probing/server/src/server/api/mod.rs | 6 +- probing/server/src/server/local_query.rs | 61 + probing/server/src/server/mod.rs | 2 + probing/server/src/server/system.rs | 89 + python/probing/__init__.py | 3 + .../bundled_skills/semantic/pages.yaml | 36 + python/probing/ext/__init__.py | 4 +- python/probing/ext/engines/__init__.py | 29 + .../probing/ext/engines/mock_sglang_server.py | 203 ++ python/probing/ext/engines/prometheus.py | 110 + python/probing/ext/engines/registry.py | 131 + python/probing/ext/engines/scraper.py | 111 + python/probing/ext/engines/sglang.py | 243 ++ python/probing/ext/ray.py | 483 ++- python/probing/ext/slime.py | 75 + python/probing/ext/torch.py | 18 +- python/probing/handlers/pythonext.py | 116 + python/probing/handlers/router.py | 19 +- .../probing/profiling/torch/module_utils.py | 17 +- python/probing/rl.py | 198 ++ python/probing/tracing/__init__.py | 3 +- python/probing/tracing/span.py | 27 +- tests/ext/conftest.py | 74 + tests/ext/test_rl_tracing.py | 51 + tests/ext/test_sglang_real_engine.py | 76 + tests/regression/spec/api_spec.json | 463 ++- tests/unit/probing/ext/test_slime.py | 91 + .../probing/handlers/test_python_handlers.py | 24 + web/assets/tailwind.css | 125 + web/src/agent/routing.rs | 6 + web/src/api/analytics.rs | 12 +- web/src/api/mod.rs | 3 + web/src/api/rl.rs | 636 ++++ web/src/app.rs | 49 + web/src/components/layout.rs | 39 +- web/src/components/mod.rs | 1 + web/src/components/rl/metrics_line_chart.rs | 219 ++ web/src/components/rl/mod.rs | 5 + web/src/components/sidebar/advanced/mod.rs | 84 + web/src/components/sidebar/mod.rs | 40 + web/src/main.rs | 1 + web/src/pages/mod.rs | 1 + web/src/pages/rl/inference.rs | 470 +++ web/src/pages/rl/mod.rs | 2711 +++++++++++++++++ web/src/rl_contract.rs | 117 + web/src/state/mod.rs | 1 + web/src/state/rl.rs | 20 + 65 files changed, 8307 insertions(+), 156 deletions(-) create mode 100644 docs/rl/agent-runtime.md create mode 100644 docs/rl/assets/placeholders/README.md create mode 100644 docs/rl/assets/placeholders/cross-process-spans.png create mode 100644 docs/rl/assets/placeholders/engine_metric.png create mode 100644 docs/rl/assets/placeholders/engine_summary.png create mode 100644 docs/rl/assets/placeholders/perfetto-export.png create mode 100644 docs/rl/assets/placeholders/rollout-view-main.png create mode 100644 docs/rl/assets/placeholders/sample-phase-detail.png create mode 100644 docs/rl/assets/placeholders/train-view.png create mode 100644 docs/rl/inference-engine-metrics.md create mode 100644 examples/ray_job_actor_span_demo.py create mode 100755 examples/run_inference_metrics_demo.sh create mode 100644 examples/sglang_inference_metrics_demo.py create mode 100644 probing/server/src/server/local_query.rs create mode 100644 python/probing/ext/engines/__init__.py create mode 100644 python/probing/ext/engines/mock_sglang_server.py create mode 100644 python/probing/ext/engines/prometheus.py create mode 100644 python/probing/ext/engines/registry.py create mode 100644 python/probing/ext/engines/scraper.py create mode 100644 python/probing/ext/engines/sglang.py create mode 100644 python/probing/ext/slime.py create mode 100644 python/probing/rl.py create mode 100644 tests/ext/conftest.py create mode 100644 tests/ext/test_rl_tracing.py create mode 100644 tests/ext/test_sglang_real_engine.py create mode 100644 tests/unit/probing/ext/test_slime.py create mode 100644 web/src/api/rl.rs create mode 100644 web/src/components/rl/metrics_line_chart.rs create mode 100644 web/src/components/rl/mod.rs create mode 100644 web/src/components/sidebar/advanced/mod.rs create mode 100644 web/src/pages/rl/inference.rs create mode 100644 web/src/pages/rl/mod.rs create mode 100644 web/src/rl_contract.rs create mode 100644 web/src/state/rl.rs diff --git a/Cargo.lock b/Cargo.lock index a1c5b701..412a6ab3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3625,6 +3625,8 @@ dependencies = [ "datafusion", "futures-util", "http-body-util", + "hyper", + "hyper-util", "log", "nix 0.31.3", "nu-ansi-term", diff --git a/README.md b/README.md index 9fc11b33..95327c5a 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ > > Uncover the hidden truth of AI performance. -Probing is an **Agent-Native performance analysis & diagnosis tool** for distributed AI. Instead of producing flamegraphs for humans to squint at, it turns a live training job into **queryable, actionable evidence**—relational telemetry that an agent (or you) can `SELECT`, join, and act on. +Probing is an **Agent-Native performance analysis & diagnosis tool** for distributed AI. Instead of producing flamegraphs for humans to squint at, it turns a live training job into **queryable, actionable evidence**—relational telemetry that an agent (or you) can `SELECT`, join, and act on. It can also be used as a performance analysis tool for **agentic RL** training (rollout / train timelines in the Web UI under the RL panel). It's built **from the system layer up**: zero-instrumentation probe injection, SQL-queryable telemetry, NCCL wait decomposition, and cross-node federation—so the data is structured for an agent to consume, not just for a human to read. diff --git a/docs/rl/agent-runtime.md b/docs/rl/agent-runtime.md new file mode 100644 index 00000000..593329a8 --- /dev/null +++ b/docs/rl/agent-runtime.md @@ -0,0 +1,191 @@ +# Agentic RL 诊断系统(Probing-RL) + +Probing-RL 是基于 [Probing](../README.md) 的 **Agentic RL 在线诊断工具**:在训练或 rollout 仍在运行时,以 **Sample / Turn / Phase** 粒度观测整条 Agent 轨迹,并支持跨进程 Span 关联、Perfetto 导出、SQL 查询与进程注入调试。它不替代 Slime、veRL、XTuner 等训练框架,而是作为 Sidecar 挂载在各角色进程上,补充框架内置 Profiler 通常缺少的 **样本语义、全链路与在线** 观测能力。 + +Agentic RL 的性能问题常表现为 GPU 空转,根因却可能在 Sandbox、Tool、Reward 等上游环节跨进程传导。Probing-RL 用于回答:哪条 sample、哪一轮 tool、哪个 phase 拖慢了 rollout,以及 Driver、Rollout Worker、Trainer 之间如何关联。 + +--- + +## 适用场景 + +| 场景 | 说明 | +|------|------| +| Rollout 慢、GPU 利用率低 | 按 sample 找 straggler,查看 inference / env / tool / reward 各 phase 耗时 | +| 多进程 / Ray 分布式 | 自动按 `rollout_id` 链接 Driver 与 Worker 上的 Span | +| 训练与 rollout 流水线 | Train 视图对照 `train_step_id`,看 buffer 与训练是否跟得上 | +| 需要下钻 | 从 RL 视图进入 Process Timeline、Perfetto 或 `probing query` SQL | +| 长跑 Job 现场排查 | `PROBING=1` 启动,或对运行中进程 `probing inject`,配合 REPL / backtrace | + +与框架内置 Timeline / PyTorch Profiler **互补**:Kernel 与算子级调优仍用各框架自带工具;样本级 Agent 轨迹诊断用 Probing-RL。 + +--- + +## 架构 + +```text +训练框架(Slime / veRL / XTuner / 自研 Agent Runtime) + Driver ─ Rollout Workers ─ Sandbox / Tools ─ Trainers + │ probing.rl spans + 可选 Ray hook + ▼ + Probing Runtime(Rust 引擎 + 列存 + SQL) + · 动态注入 attach 运行中进程 + · 跨节点 span 聚合 + ▼ + Web UI:Rollout / Train / Spans / Perfetto / Inference +``` + +框架在关键边界打 Span 并传递 `rollout_id`、`sample_id`、`phase` 等**通用属性**;Web UI 只读这些契约字段,不依赖框架私有 span 名称(契约定义见 `web/src/rl_contract.rs`)。因此同一套 UI 可对接多种 RL 栈。 + +--- + +## 核心概念 + +| 概念 | 含义 | +|------|------| +| **Sample** | 一条完整 Agent 轨迹(一次 rollout 常含多条 sample) | +| **Turn** | 单轮 Agent 交互(推理 → 环境 / 工具 → 再推理) | +| **Phase** | 轨迹内分段类型,如 `inference`、`env.step`、`tool.call`、`reward` | +| **Rollout** | 一次批量采样任务,由 `rollout_id` 标识 | +| **Train step** | 一次训练更新,由 `train_step_id` / `batch_id` 标识 | + +--- + +## 功能说明 + +### Rollout 视图 + +![Rollout 视图:一行一条 sample,色块表示各 phase 耗时](./assets/placeholders/rollout-view-main.png) + +- 一行一个 **sample**,以色条展示各 **phase** 耗时(inference、env.step、tool.call、reward 等) +- 支持按最慢 sample 排序、详情面板固定(pin),便于定位 straggler +- 适用于「512 条轨迹里哪几条特别慢」类问题 + +![Sample phase 详情](./assets/placeholders/sample-phase-detail.png) + +### Train 视图 + +![Train 视图:按 batch 展示训练各 phase](./assets/placeholders/train-view.png) + +- 按 `train_step_id` / `batch_id` 展示 `train.prepare`、`train.loss`、`optimizer.step` 等阶段 +- 用于对照 rollout 与训练是否重叠、buffer 是否成为瓶颈 + +### 跨进程 Span 关联 + +分布式 Agentic RL 中 Driver、Rollout Actor、Trainer 往往在不同进程。Probing-RL 通过: + +- **`rl.export_context()` / `rl.import_context()`** — 在 RPC 间传递 rollout / sample 上下文(基于 `contextvars`,兼容 async) +- **`rollout_id` + `step_id` + `actor_role`** — 前端将 Worker 上的 child span 挂到 Driver 的 `rollout.step` 下 +- **Ray 集成** — `ray.init(_tracing_startup_hook="probing.ext.ray:setup_tracing")` 采集 task / actor 元数据 + +在 **Spans 视图** 中可查看跨进程的完整调用关系,无需手工合并 Chrome Trace。 + +![跨进程 Span 树:Driver 与 Worker 的 span 按 rollout 关联](./assets/placeholders/cross-process-spans.png) + +### 多层下钻 + +同一份 span 数据支持不同粒度分析: + +| 层级 | 入口 | 典型用途 | +|------|------|----------| +| 逻辑 | Rollout / Train 视图 | 找慢 sample、慢 phase | +| 进程 | Process Timeline | 某 worker 上 span 时间分布 | +| 系统 | Perfetto 导出 | Kernel / 算子时间线 | +| 查询 | `probing query` SQL | 自定义聚合与报表 | +| 运行时 | `probing repl` / backtrace | 不重启 Job,查变量与堆栈 | + +![Perfetto 导出:从 sample 时间线下钻到 kernel 级 trace](./assets/placeholders/perfetto-export.png) + +### 推理引擎指标(SGLang 等) + +除 Agent 轨迹外,Probing 还可抓取推理引擎 Prometheus 指标,在 **`/inference`** 页面展示并发、吞吐、TPOT、TTFT、KV cache 等。 + +![Inference 页面:已注册引擎与最新归一化指标](./assets/placeholders/engine_summary.png) + +![Inference 页面:指标时间序列折线图](./assets/placeholders/engine_metric.png) + +详见 [inference-engine-metrics.md](./inference-engine-metrics.md)。 + +### 采集与注入 + +- 启动时设置 `PROBING=1`(HTTP 面板需同时设置 `PROBING_PORT`) +- 对已在运行的进程:`probing -t inject` +- 可通过 `PROBING_SAMPLE_RATE` 等环境变量调节采样与 retention + +--- + +## 快速开始 + +### 1. 启动带 Web UI 的训练或 Demo 进程 + +```bash +export PROBING=1 +export PROBING_PORT=8080 + +python your_train_script.py +``` + +浏览器打开 `http://127.0.0.1:8080`,进入 Rollout / Train / Spans 等页面。 + +Ray 相关示例可参考: + +```bash +PROBING=1 PROBING_PORT=8080 python examples/ray_job_actor_span_demo.py +``` + +### 2. 在代码中打 Span(最小契约) + +```python +import probing.rl as rl + +with rl.context(framework="slime", rollout_id=12, trajectory_id="t-3", actor_role="rollout"): + with rl.span("inference.generate", phase="inference", turn_id=0): + ... + with rl.span("env.step", phase="env.step", turn_id=0): + ... + with rl.span("tool.call", phase="tool.call", turn_id=1): + ... + with rl.span("reward.compute", phase="reward"): + ... + +# Ray 远程:传递上下文 +carrier = rl.export_context() +ray.get(trainer.train.remote(batch, carrier)) +``` + +建议在以下边界打 Span,即可驱动完整 UI: + +1. rollout 提交 / 等待 +2. sample 生命周期 +3. agent turn +4. 推理(inference) +5. 环境步(env.step) +6. 工具调用(tool.call) +7. reward 计算 +8. batch 准备与 optimizer / 权重更新 + +### 3. 对运行中进程注入 + +```bash +probing -t inject +``` + +注入后可通过 Unix socket 或 HTTP(若已配置 `PROBING_PORT`)访问同一套 UI 与 API。 + +--- + +## 环境变量(常用) + +| 变量 | 说明 | +|------|------| +| `PROBING` | 设为 `1` 启用 Probing | +| `PROBING_PORT` | HTTP Web UI 端口(如 `8080`) | +| `PROBING_ASSETS_ROOT` | 前端静态资源目录(如 `web/dist`) | +| `PROBING_SAMPLE_RATE` | Span 采样率 | +| `PROBING_ENGINE_SCRAPE` / `PROBING_ENGINE_SCRAPE_INTERVAL` | 推理引擎指标后台抓取开关与间隔 | + +--- + +## 相关文档 + +- [README.md](../README.md) / [README.cn.md](../README.cn.md) — 项目总览与 `probing.rl` API 摘要 +- [inference-engine-metrics.md](./inference-engine-metrics.md) — 推理引擎指标展示(SGLang) diff --git a/docs/rl/assets/placeholders/README.md b/docs/rl/assets/placeholders/README.md new file mode 100644 index 00000000..36e96838 --- /dev/null +++ b/docs/rl/assets/placeholders/README.md @@ -0,0 +1,15 @@ +# 文档截图 + +本目录存放 Probing 文档引用的界面截图。路径相对于 `docs/` 目录,例如 `./assets/placeholders/rollout-view-main.png`。 + +| 文件名 | 引用位置 | 内容 | +|--------|----------|------| +| `rollout-view-main.png` | [probing-RL-agent-runtime.md](../../probing-RL-agent-runtime.md) | Rollout 视图主界面 | +| `train-view.png` | [probing-RL-agent-runtime.md](../../probing-RL-agent-runtime.md) | Train 视图 | +| `sample-phase-detail.png` | [probing-RL-agent-runtime.md](../../probing-RL-agent-runtime.md) | Sample phase 详情 | +| `cross-process-spans.png` | [probing-RL-agent-runtime.md](../../probing-RL-agent-runtime.md) | 跨进程 Span 树 | +| `perfetto-export.png` | [probing-RL-agent-runtime.md](../../probing-RL-agent-runtime.md) | Perfetto 导出 | +| `engine_summary.png` | [inference-engine-metrics.md](../../inference-engine-metrics.md)、[agent-runtime.md](../../agent-runtime.md) | Inference:已注册引擎与最新归一化指标 | +| `engine_metric.png` | [inference-engine-metrics.md](../../inference-engine-metrics.md)、[agent-runtime.md](../../agent-runtime.md) | Inference:指标时间序列折线图 | + +README 首页([README.cn.md](../../../README.cn.md) / [README.md](../../../README.md))亦引用部分上述图片。 diff --git a/docs/rl/assets/placeholders/cross-process-spans.png b/docs/rl/assets/placeholders/cross-process-spans.png new file mode 100644 index 0000000000000000000000000000000000000000..636ea97b930a6dadedd1a0963c3777d3124f8afa GIT binary patch literal 266241 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
$k1lMn(eMl7hB*s-WglU3>&-8l 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 Gum1x}gB&0L literal 0 HcmV?d00001 diff --git a/docs/rl/assets/placeholders/train-view.png b/docs/rl/assets/placeholders/train-view.png new file mode 100644 index 0000000000000000000000000000000000000000..e2241b9726e1e4df4a3542ed289b14bde2a1e3a8 GIT binary patch literal 46600 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 \ + --host 0.0.0.0 \ + --port 30000 \ + --enable-metrics +``` + +确认指标端点可用: + +```bash +curl -s http://127.0.0.1:30000/metrics | head +``` + +### 步骤 2:启动 Probing 并注册引擎 + +在仓库根目录、另一终端执行: + +```bash +export PROBING=1 +export PROBING_PORT=8080 +export PROBING_ASSETS_ROOT=web/dist + +python examples/sglang_inference_metrics_demo.py \ + --engine-url http://127.0.0.1:30000 \ + --engine-id sglang-real \ + --num-requests 0 \ + --keep-alive-seconds 3600 +``` + +说明: + +- `PROBING_PORT` **必须设置**,否则只有 Unix socket,浏览器无法访问 +- `PROBING_ASSETS_ROOT` 指向已构建的前端目录 `web/dist` +- 默认注册 `http://127.0.0.1:30000`,指标路径为 `/metrics`(由 demo 对外部引擎自动选择) +- 进程保持运行,后台每约 5 秒抓取一次指标 + +可修改 `--engine-url`、`--engine-id` 或 `PROBING_PORT` 等参数。 + +### 步骤 3:打开 Web UI + +浏览器访问: + +``` +http://127.0.0.1:8080/inference +``` + +若在远程机器上运行,需将 `8080` 端口转发到本机后再访问。 + +### 步骤 4(推荐):发送推理请求以产生指标 + +空闲时许多指标为 0。可持续向 SGLang 发 `/generate` 请求,例如: + +```bash +while true; do + curl -s -X POST http://127.0.0.1:30000/generate \ + -H "Content-Type: application/json" \ + -d '{"text":"Explain RL in one paragraph.","max_new_tokens":64}' \ + > /dev/null + sleep 0.5 +done +``` + +发送负载后,**Throughput**、**TPOT**、**TTFT**、**Cache hit ratio** 等折线会出现非零变化;页面约每 5 秒自动刷新,也可点击 **Scrape now** 立即抓取。 + +### 常用 API(可选) + +| 接口 | 作用 | +|------|------| +| `GET /apis/pythonext/engines/snapshot` | 查看已注册引擎及最新归一化指标 | +| `GET /apis/pythonext/engines/scrape` | 立即触发一次指标抓取 | +| `GET /apis/pythonext/engines/register?router_addr=...&engine_type=sglang&metrics_path=/metrics` | 手动注册引擎 | + +### 相关环境变量 + +| 变量 | 默认值 | 说明 | +|------|--------|------| +| `PROBING_PORT` | (未设置) | 设为 `8080` 等端口以启用 HTTP Web UI | +| `PROBING_ASSETS_ROOT` | (未设置) | Web 静态资源目录,通常为 `web/dist` | +| `PROBING_ENGINE_SCRAPE` | `1` | 是否启用后台定期抓取 | +| `PROBING_ENGINE_SCRAPE_INTERVAL` | `5` | 抓取间隔(秒) | +| `PROBING_ENGINE_METRICS_PATH` | `/engine_metrics` | 注册时未指定 `metrics_path` 的默认指标路径 | diff --git a/examples/ray_job_actor_span_demo.py b/examples/ray_job_actor_span_demo.py new file mode 100644 index 00000000..3192611b --- /dev/null +++ b/examples/ray_job_actor_span_demo.py @@ -0,0 +1,582 @@ +"""Slime-like async RL demo for probing spans inside Ray actors. + +This example mirrors the shape of ``slime/train_async.py`` without depending on +slime itself: the driver submits rollout generation one step ahead, waits for +the previous rollout, trains critic/actor workers, and periodically updates +weights, saves checkpoints, and runs evaluation. +""" + +from __future__ import annotations + +import argparse +import asyncio +import json +import os +import random +import time +from dataclasses import dataclass + +import probing +import ray + + +@ray.remote +class RolloutManager: + def __init__(self, actor_name: str, trajectories_per_rollout: int): + from probing.ext.ray import register_current_process + + self.actor_name = actor_name + self.trajectories_per_rollout = trajectories_per_rollout + register_current_process("rollout_actor") + with probing.span("rollout.manager.init", kind="ray.actor", actor_name=actor_name): + time.sleep(0.05) + + def get_metrics_router_addr(self) -> str: + from probing.ext.ray import register_current_process + + register_current_process("rollout_actor") + with probing.span("metrics.router.addr", kind="slime.setup", actor_name=self.actor_name): + time.sleep(0.01) + return "http://127.0.0.1:18000" + + def check_weights(self, action: str) -> dict: + from probing.ext.ray import register_current_process + + register_current_process("rollout_actor") + with probing.span("weights.check.remote", kind="slime.weights", action=action): + time.sleep(0.02) + return {"action": action, "ok": True} + + async def _generate_trajectory( + self, + rollout_id: int, + trajectory_idx: int, + sleep_seconds: float, + env_step_sleep_seconds: float, + turns_per_trajectory: int, + ) -> dict: + import probing.rl as rl + + trajectory_id = f"r{rollout_id}-t{trajectory_idx}" + carrier = rl.bind( + framework="slime", + algorithm="grpo", + rollout_id=rollout_id, + step_id=rollout_id, + sample_id=trajectory_id, + trajectory_id=trajectory_id, + group_id=f"rollout-{rollout_id}", + attempt=0, + actor_role="rollout", + ) + token_count = 0 + env_observations = [] + with rl.context(**carrier): + async with rl.async_span( + "trajectory.sample", + phase="trajectory", + kind="rl.trajectory", + trajectory_index=trajectory_idx, + turns=turns_per_trajectory, + ): + for turn_id in range(turns_per_trajectory): + with rl.context(turn_id=turn_id, env_step_id=turn_id): + async with rl.async_span( + "inference.generate", + phase="inference", + max_new_tokens=128, + ): + for value in range(20_000): + token_count += (value + rollout_id + trajectory_idx + turn_id) % 13 + await asyncio.sleep(sleep_seconds / max(turns_per_trajectory, 1)) + + async with rl.async_span( + "env.step", + phase="env.step", + action=f"answer_turn_{turn_id}", + ): + await asyncio.sleep(env_step_sleep_seconds) + env_observations.append(f"obs-{turn_id}") + + if turn_id + 1 < turns_per_trajectory: + async with rl.async_span( + "tool.call", + phase="tool.call", + tool_name="calculator", + ): + await asyncio.sleep(env_step_sleep_seconds * 0.5) + + async with rl.async_span("reward.compute", phase="reward"): + reward = round(random.random() + rollout_id * 0.01, 4) + await asyncio.sleep(0.01) + + return { + "trajectory_id": trajectory_id, + "tokens": token_count, + "reward": reward, + "turns": turns_per_trajectory, + "env_observations": env_observations, + "rl_trace": rl.export_context(**carrier), + } + + async def generate( + self, + rollout_id: int, + sleep_seconds: float, + env_step_sleep_seconds: float, + turns_per_trajectory: int, + ) -> dict: + from probing.ext.ray import current_process_identity, register_current_process + + register_current_process("rollout_actor") + with probing.span( + "custom.generate", + kind="ray.actor", + actor_name=self.actor_name, + rollout_id=rollout_id, + step_id=rollout_id, + ): + start = time.perf_counter() + trajectories = await asyncio.gather( + *[ + self._generate_trajectory( + rollout_id, + trajectory_idx, + sleep_seconds / max(self.trajectories_per_rollout, 1), + env_step_sleep_seconds, + turns_per_trajectory, + ) + for trajectory_idx in range(self.trajectories_per_rollout) + ] + ) + + identity = current_process_identity("rollout_actor") + return { + "actor_name": self.actor_name, + "rollout_id": rollout_id, + "pid": os.getpid(), + "identity": identity, + "duration_s": time.perf_counter() - start, + "trajectories": trajectories, + } + + def save(self, rollout_id: int) -> dict: + from probing.ext.ray import register_current_process + + register_current_process("rollout_actor") + with probing.span( + "rollout.dataset.save", + kind="slime.io", + rollout_id=rollout_id, + step_id=rollout_id, + ): + time.sleep(0.02) + return {"rollout_id": rollout_id, "saved": True, "pid": os.getpid()} + + def eval(self, rollout_id: int) -> dict: + from probing.ext.ray import register_current_process + + register_current_process("rollout_actor") + with probing.span( + "rollout.eval.remote", + kind="slime.eval", + rollout_id=rollout_id, + step_id=rollout_id, + ): + time.sleep(0.04) + return {"rollout_id": rollout_id, "score": round(0.5 + random.random() * 0.1, 4)} + + def dispose(self) -> dict: + from probing.ext.ray import register_current_process + + register_current_process("rollout_actor") + with probing.span("rollout.dispose.remote", kind="slime.cleanup"): + time.sleep(0.01) + return {"disposed": True, "pid": os.getpid()} + + +@ray.remote +class TrainWorker: + def __init__(self, model_name: str, sleep_seconds: float): + from probing.ext.ray import register_current_process + + self.model_name = model_name + self.sleep_seconds = sleep_seconds + register_current_process(f"{model_name}_trainer") + with probing.span(f"{model_name}.init", kind="ray.actor", model_name=model_name): + time.sleep(0.03) + + def async_train( + self, + rollout_id: int, + rollout_data: dict, + external_data: dict | None = None, + ) -> dict: + from probing.ext.ray import current_process_identity, register_current_process + + register_current_process(f"{self.model_name}_trainer") + batch_id = f"{self.model_name}-batch-{rollout_id}" + with probing.span( + f"{self.model_name}.train.remote", + kind="slime.train", + model_name=self.model_name, + rollout_id=rollout_id, + step_id=rollout_id, + batch_id=batch_id, + ): + loss = 0.0 + trajectories = rollout_data["trajectories"] + for item in trajectories: + import probing.rl as rl + + carrier = rl.import_context( + item.get("rl_trace"), + actor_role=f"{self.model_name}_trainer", + batch_id=batch_id, + ) + with rl.context(**carrier): + with rl.span( + "batch.prepare", + phase="train.prepare", + kind="rl.train", + model_name=self.model_name, + ): + loss += (item["tokens"] % 97) * 0.001 + time.sleep(self.sleep_seconds / max(len(trajectories), 1)) + with rl.context(**carrier): + with rl.span( + "loss.compute", + phase="train.loss", + kind="rl.train", + model_name=self.model_name, + ): + loss += item["reward"] * 0.01 + if external_data: + loss += float(external_data.get("loss", 0.0)) * 0.1 + with probing.span( + "optimizer.step", + kind="slime.train", + model_name=self.model_name, + rollout_id=rollout_id, + step_id=rollout_id, + batch_id=batch_id, + phase="optimizer.step", + actor_role=f"{self.model_name}_trainer", + ): + time.sleep(0.01) + + return { + "model_name": self.model_name, + "rollout_id": rollout_id, + "pid": os.getpid(), + "identity": current_process_identity(f"{self.model_name}_trainer"), + "batch_id": batch_id, + "loss": round(loss, 4), + } + + def save_model(self, rollout_id: int, force_sync: bool) -> dict: + from probing.ext.ray import register_current_process + + register_current_process(f"{self.model_name}_trainer") + with probing.span( + f"{self.model_name}.save.remote", + kind="slime.io", + model_name=self.model_name, + rollout_id=rollout_id, + step_id=rollout_id, + force_sync=force_sync, + ): + time.sleep(0.02) + return {"model_name": self.model_name, "rollout_id": rollout_id, "saved": True} + + def update_weights(self, rollout_id: int) -> dict: + from probing.ext.ray import register_current_process + + register_current_process(f"{self.model_name}_trainer") + with probing.span( + f"{self.model_name}.weights.export", + kind="slime.weights", + model_name=self.model_name, + rollout_id=rollout_id, + step_id=rollout_id, + ): + time.sleep(0.03) + return {"model_name": self.model_name, "rollout_id": rollout_id, "updated": True} + + +@dataclass +class StepResult: + rollout_id: int + rollout_pid: int + actor_pid: int | None = None + critic_pid: int | None = None + eval_score: float | None = None + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--address", default="auto", help="Ray address for ray.init") + parser.add_argument("--num-rollouts", type=int, default=4) + parser.add_argument("--start-rollout-id", type=int, default=0) + parser.add_argument("--trajectories-per-rollout", type=int, default=3) + parser.add_argument("--turns-per-trajectory", type=int, default=3) + parser.add_argument("--generate-sleep-seconds", type=float, default=0.1) + parser.add_argument("--env-step-sleep-seconds", type=float, default=0.02) + parser.add_argument("--train-sleep-seconds", type=float, default=0.05) + parser.add_argument("--use-critic", action="store_true", default=True) + parser.add_argument("--no-critic", action="store_false", dest="use_critic") + parser.add_argument("--num-critic-only-steps", type=int, default=1) + parser.add_argument("--update-weights-interval", type=int, default=2) + parser.add_argument("--save-interval", type=int, default=2) + parser.add_argument("--eval-interval", type=int, default=3) + parser.add_argument("--check-weight-update-equal", action="store_true") + parser.add_argument( + "--keep-alive-seconds", + type=int, + default=600, + help="Keep the job alive so probing CLI can query driver and actor PIDs.", + ) + return parser.parse_args() + + +def should_run_periodic_action(rollout_id: int, interval: int, final_rollout_id: int) -> bool: + if interval <= 0: + return False + return (rollout_id + 1) % interval == 0 or rollout_id == final_rollout_id + + +def main() -> None: + args = parse_args() + + ray.init( + address=args.address, + _tracing_startup_hook="probing.ext.ray:setup_tracing", + ) + + from probing.ext.ray import get_ray_timeline, setup_driver + + setup_driver("driver") + driver_pid = os.getpid() + final_rollout_id = args.start_rollout_id + args.num_rollouts - 1 + + with probing.span("setup", kind="slime.setup"): + rollout_manager = RolloutManager.remote( + "rollout-manager", + args.trajectories_per_rollout, + ) + router_addr = ray.get(rollout_manager.get_metrics_router_addr.remote()) + actor_model = TrainWorker.remote("actor", args.train_sleep_seconds) + critic_model = TrainWorker.remote("critic", args.train_sleep_seconds * 0.8) + with probing.span("weights.update.initial", kind="slime.weights"): + ray.get(actor_model.update_weights.remote(args.start_rollout_id)) + + if args.check_weight_update_equal: + with probing.span("weights.check", kind="slime.weights"): + ray.get(rollout_manager.check_weights.remote(action="compare")) + + step_results: list[StepResult] = [] + rollout_data_next_future = None + rollout_data_prefetched = None + with probing.span( + "rollout.submit", + kind="rollout", + rollout_id=args.start_rollout_id, + step_id=args.start_rollout_id, + submit_step_id=args.start_rollout_id - 1, + consume_step_id=args.start_rollout_id, + ): + rollout_data_next_future = rollout_manager.generate.remote( + args.start_rollout_id, + args.generate_sleep_seconds, + args.env_step_sleep_seconds, + args.turns_per_trajectory, + ) + + for rollout_id in range(args.start_rollout_id, args.start_rollout_id + args.num_rollouts): + with probing.span( + "rollout.step", + kind="step", + rollout_id=rollout_id, + step_id=rollout_id, + ): + probing.event("rollout.step.start", attributes=[{"rollout_id": rollout_id, "step_id": rollout_id}]) + with probing.span( + "rollout.wait", + kind="slime.rollout", + rollout_id=rollout_id, + step_id=rollout_id, + submit_step_id=rollout_id - 1, + consume_step_id=rollout_id, + ): + if rollout_data_next_future is not None: + rollout_data_curr = ray.get(rollout_data_next_future) + else: + rollout_data_curr = rollout_data_prefetched + rollout_data_prefetched = None + if rollout_data_curr is None: + raise RuntimeError(f"No rollout data available for rollout_id={rollout_id}") + step_result = StepResult( + rollout_id=rollout_id, + rollout_pid=int(rollout_data_curr["pid"]), + ) + + if rollout_id < final_rollout_id: + with probing.span( + "rollout.submit_next", + kind="slime.rollout", + rollout_id=rollout_id + 1, + step_id=rollout_id, + submit_step_id=rollout_id, + consume_step_id=rollout_id + 1, + ): + rollout_data_next_future = rollout_manager.generate.remote( + rollout_id + 1, + args.generate_sleep_seconds, + args.env_step_sleep_seconds, + args.turns_per_trajectory, + ) + + if args.use_critic: + actor_trains_this_step = rollout_id >= args.num_critic_only_steps + with probing.span( + "critic.train", + kind="slime.train", + rollout_id=rollout_id, + step_id=rollout_id, + ): + value_ref = critic_model.async_train.remote(rollout_id, rollout_data_curr) + if actor_trains_this_step: + with probing.span( + "actor.train", + kind="slime.train", + rollout_id=rollout_id, + step_id=rollout_id, + ): + critic_result = ray.get(value_ref) + step_result.critic_pid = int(critic_result["pid"]) + actor_result = ray.get( + actor_model.async_train.remote( + rollout_id, + rollout_data_curr, + critic_result, + ) + ) + step_result.actor_pid = int(actor_result["pid"]) + else: + with probing.span( + "critic.wait", + kind="slime.train", + rollout_id=rollout_id, + step_id=rollout_id, + ): + critic_result = ray.get(value_ref) + step_result.critic_pid = int(critic_result["pid"]) + else: + with probing.span( + "actor.train", + kind="slime.train", + rollout_id=rollout_id, + step_id=rollout_id, + ): + actor_result = ray.get( + actor_model.async_train.remote(rollout_id, rollout_data_curr) + ) + step_result.actor_pid = int(actor_result["pid"]) + + if should_run_periodic_action(rollout_id, args.save_interval, final_rollout_id): + with probing.span( + "checkpoint.save", + kind="slime.io", + rollout_id=rollout_id, + step_id=rollout_id, + ): + save_refs = [ + actor_model.save_model.remote( + rollout_id, + rollout_id == final_rollout_id, + ) + ] + if args.use_critic: + save_refs.append( + critic_model.save_model.remote( + rollout_id, + rollout_id == final_rollout_id, + ) + ) + save_refs.append(rollout_manager.save.remote(rollout_id)) + ray.get(save_refs) + + if (rollout_id + 1) % args.update_weights_interval == 0: + with probing.span( + "weights.update", + kind="slime.weights", + rollout_id=rollout_id, + step_id=rollout_id, + ): + if rollout_data_next_future is not None: + rollout_data_prefetched = ray.get(rollout_data_next_future) + rollout_data_next_future = None + ray.get(actor_model.update_weights.remote(rollout_id)) + + if should_run_periodic_action(rollout_id, args.eval_interval, final_rollout_id): + with probing.span( + "eval", + kind="slime.eval", + rollout_id=rollout_id, + step_id=rollout_id, + ): + eval_result = ray.get(rollout_manager.eval.remote(rollout_id)) + step_result.eval_score = float(eval_result["score"]) + + step_results.append(step_result) + probing.event("rollout.step.end", attributes=[{"rollout_id": rollout_id, "step_id": rollout_id}]) + + with probing.span("rollout.dispose", kind="slime.cleanup"): + ray.get(rollout_manager.dispose.remote()) + with probing.span("tracking.finish", kind="slime.cleanup", router_addr=router_addr): + time.sleep(0.01) + + timeline = get_ray_timeline() + actor_pids = sorted( + { + pid + for result in step_results + for pid in (result.rollout_pid, result.actor_pid, result.critic_pid) + if pid is not None + } + ) + + print("=== probing slime-like async RL span demo ===") + print(f"driver_pid={driver_pid}") + print(f"actor_pids={','.join(str(pid) for pid in actor_pids)}") + print(f"ray_timeline_entries={len(timeline)}") + print("step_results:") + print(json.dumps([result.__dict__ for result in step_results], indent=2, sort_keys=True)) + print() + print("Useful commands:") + print(" probing list") + print(" open the Traces page and select 'RL Timeline' to inspect rollout samples") + print( + " probing -t " + f'{driver_pid} query "SELECT actor_id, class_name, worker_id, worker_pid ' + "FROM python.ray_actor ORDER BY timestamp_ns DESC LIMIT 20;\"" + ) + print( + " probing -t " + f'{driver_pid} query "SELECT name, attributes FROM python.trace_event ' + "WHERE record_type = 'span_start' ORDER BY time DESC LIMIT 20;\"" + ) + for pid in actor_pids: + print( + " probing -t " + f'{pid} query "SELECT name, attributes FROM python.trace_event ' + "WHERE record_type = 'span_start' ORDER BY time DESC LIMIT 20;\"" + ) + + if args.keep_alive_seconds > 0: + print(f"keeping job alive for {args.keep_alive_seconds}s...") + time.sleep(args.keep_alive_seconds) + + +if __name__ == "__main__": + main() diff --git a/examples/run_inference_metrics_demo.sh b/examples/run_inference_metrics_demo.sh new file mode 100755 index 00000000..dcb7cea4 --- /dev/null +++ b/examples/run_inference_metrics_demo.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +# Launch the inference metrics demo with HTTP dashboard enabled. +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +exec env PROBING=1 PROBING_PORT="${PROBING_PORT:-8080}" \ + python "${SCRIPT_DIR}/sglang_inference_metrics_demo.py" "$@" diff --git a/examples/sglang_inference_metrics_demo.py b/examples/sglang_inference_metrics_demo.py new file mode 100644 index 00000000..a83d0d4c --- /dev/null +++ b/examples/sglang_inference_metrics_demo.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python3 +"""Standalone SGLang inference metrics demo (no Slime). + +Starts a lightweight mock SGLang HTTP server (or connects to an existing one), +registers it with Probing, sends dummy ``/generate`` requests, and prints the +Web UI URL for manual inspection. + +Usage:: + + # PROBING_PORT is required for browser access (otherwise only a Unix socket is started). + PROBING=1 PROBING_PORT=8080 python examples/sglang_inference_metrics_demo.py + + # Use a real ``sglang.launch_server`` you already launched (metrics at /metrics): + PROBING=1 PROBING_PORT=8080 python examples/sglang_inference_metrics_demo.py \\ + --engine-url http://127.0.0.1:30000 + + # Slime router / model gateway (metrics at /engine_metrics): + PROBING=1 PROBING_PORT=8080 python examples/sglang_inference_metrics_demo.py \\ + --engine-url http://127.0.0.1:30000 \\ + --metrics-path /engine_metrics + +Then open the printed ``/inference`` page in your browser. +""" + +from __future__ import annotations + +import argparse +import os +import sys +import time +import urllib.error +import urllib.request + +import probing.ext.engines as engines +from probing.ext.engines.mock_sglang_server import ( + send_dummy_generate_requests, + start_mock_sglang_server, +) +from probing.ext.engines.sglang import ( + DEFAULT_METRICS_PATH, + LAUNCH_SERVER_METRICS_PATH, + resolve_metrics_path, +) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--engine-url", + default="", + help="Existing SGLang HTTP base URL. If omitted, a local mock server is started.", + ) + parser.add_argument("--engine-id", default="sglang-standalone") + parser.add_argument( + "--metrics-path", + default="", + help=( + "Prometheus scrape path. Defaults to /engine_metrics for mock servers and " + "/metrics for external launch_server. Override with PROBING_ENGINE_METRICS_PATH." + ), + ) + parser.add_argument("--num-requests", type=int, default=8) + parser.add_argument("--max-new-tokens", type=int, default=32) + parser.add_argument("--request-latency-seconds", type=float, default=0.05) + parser.add_argument( + "--keep-alive-seconds", + type=int, + default=600, + help="Keep process alive so the Probing Web UI can poll metrics.", + ) + parser.add_argument( + "--probing-port", + type=int, + default=int(os.environ.get("PROBING_PORT", "8080")), + ) + return parser.parse_args() + + +def _resolve_demo_metrics_path(args: argparse.Namespace, *, using_mock: bool) -> str: + if args.metrics_path.strip(): + return resolve_metrics_path(args.metrics_path.strip()) + if using_mock: + return DEFAULT_METRICS_PATH + return LAUNCH_SERVER_METRICS_PATH + + +def _probe_http_ui(port: int) -> bool: + try: + with urllib.request.urlopen(f"http://127.0.0.1:{port}/inference", timeout=2) as response: + return 200 <= response.status < 500 + except (urllib.error.URLError, TimeoutError, OSError): + return False + + +def _print_web_ui_unavailable_help(port: int) -> None: + script = "examples/sglang_inference_metrics_demo.py" + if __file__.endswith("sglang_inference_metrics_demo.py"): + script = __file__ + print() + print("*** Probing Web UI is not reachable on HTTP ***") + print( + "By default, PROBING=1 starts an in-process Unix socket server only. " + "Set PROBING_PORT to also expose the HTTP dashboard." + ) + print() + print("Stop this process and restart with:") + print(f" PROBING=1 PROBING_PORT={port} python {script} \\") + print(" [your other args...]") + print() + print("If you are on a remote worker/pod, also port-forward 8080 to your laptop.") + + +def main() -> None: + args = parse_args() + mock_server = None + if args.engine_url: + engine_url = args.engine_url.rstrip("/") + print(f"Using existing SGLang server at {engine_url}") + else: + mock_server = start_mock_sglang_server() + engine_url = mock_server.base_url + print(f"Started mock SGLang server at {engine_url}") + + metrics_path = _resolve_demo_metrics_path(args, using_mock=mock_server is not None) + + registration = engines.register_engine( + router_addr=engine_url, + engine_id=args.engine_id, + engine_type="sglang", + framework="standalone", + metrics_path=metrics_path, + labels={"source": "mock_sglang" if mock_server else "external_sglang"}, + auto_scrape=True, + ) + print(f"Registered engine {registration.engine_id} -> {registration.metrics_url}") + + print(f"Sending {args.num_requests} dummy /generate requests...") + responses = send_dummy_generate_requests( + engine_url, + count=args.num_requests, + max_new_tokens=args.max_new_tokens, + latency_seconds=args.request_latency_seconds, + ) + print(f"Received {len(responses)} responses") + + snapshot = engines.scrape_engine(registration) + print("Latest normalized metrics:") + for key, value in sorted(snapshot.get("normalized", {}).items()): + print(f" {key}: {value}") + if snapshot.get("scrape_error"): + print(f"Scrape error: {snapshot['scrape_error']}") + + inference_url = f"http://127.0.0.1:{args.probing_port}/inference" + print() + if _probe_http_ui(args.probing_port): + print("Open the Probing Web UI to inspect live metrics:") + print(f" {inference_url}") + print() + print("Useful API checks:") + print( + f" curl 'http://127.0.0.1:{args.probing_port}/apis/pythonext/engines/snapshot'" + ) + print(f" curl 'http://127.0.0.1:{args.probing_port}/apis/pythonext/engines/scrape'") + else: + _print_web_ui_unavailable_help(args.probing_port) + if "PROBING_PORT" not in os.environ: + print("(PROBING_PORT is not set in the environment.)") + return 1 + + if args.keep_alive_seconds > 0: + print(f"Keeping alive for {args.keep_alive_seconds}s...") + time.sleep(args.keep_alive_seconds) + + if mock_server is not None: + mock_server.stop() + + +if __name__ == "__main__": + sys.exit(main() or 0) diff --git a/probing/core/src/core/mod.rs b/probing/core/src/core/mod.rs index 24ebb5fe..1b8ccea4 100644 --- a/probing/core/src/core/mod.rs +++ b/probing/core/src/core/mod.rs @@ -54,6 +54,8 @@ pub use datafusion::arrow::datatypes::SchemaRef; pub use datafusion::arrow::datatypes::TimeUnit; pub use datafusion::arrow::util::pretty; pub use datafusion::common::error::DataFusionError; +pub use datafusion::catalog::TableProvider; +pub use datafusion::error::Result as DataFusionResult; pub use datafusion::config::CatalogOptions; #[cfg(test)] diff --git a/probing/memtable/src/docs.rs b/probing/memtable/src/docs.rs index b5d5929a..9c335089 100644 --- a/probing/memtable/src/docs.rs +++ b/probing/memtable/src/docs.rs @@ -44,9 +44,21 @@ pub fn infer_extern_column_dtype(name: &str) -> DType { "rank" | "world_size" | "group_rank" | "group_size" | "bytes" | "async_op" | "micro_batches" | "micro_step" | "local_step" | "global_step" | "seq" | "role_rank" | "role_world_size" | "lineno" | "depth" | "ts" | "used_bytes" | "total_bytes" - | "mem_used_pct" | "gpu_util_pct" | "rss_kb" | "thread_count" | "cpu_total_pct" => { - DType::I64 - } + | "mem_used_pct" | "gpu_util_pct" | "rss_kb" | "thread_count" | "cpu_total_pct" + | "timestamp_ns" => DType::I64, + "engine_id" | "engine_type" | "metric_name" | "labels" | "framework" | "status" + | "router_addr" | "metrics_url" | "message" | "error" => DType::Str, + "metric_value" | "value" => DType::F64, + _ if name.ends_with("_name") + || name.ends_with("_type") + || name.ends_with("_url") + || name.ends_with("_addr") => DType::Str, + _ if name.ends_with("_value") + || name.ends_with("_ratio") + || name.ends_with("_ms") + || name.ends_with("_tps") + || name.ends_with("_bytes") + || name.ends_with("_seconds") => DType::F64, _ if name.starts_with("is_") => DType::I64, _ if name.ends_with("_sec") || name.ends_with("_rate") => DType::F64, _ if name.ends_with("_id") => DType::I64, @@ -179,6 +191,9 @@ mod tests { assert_eq!(infer_extern_column_dtype("time"), DType::I64); assert_eq!(infer_extern_column_dtype("trace_id"), DType::I64); assert_eq!(infer_extern_column_dtype("op"), DType::Str); + assert_eq!(infer_extern_column_dtype("engine_id"), DType::Str); + assert_eq!(infer_extern_column_dtype("metric_value"), DType::F64); + assert_eq!(infer_extern_column_dtype("timestamp_ns"), DType::I64); } #[test] diff --git a/probing/server/Cargo.toml b/probing/server/Cargo.toml index f8dcb9e9..253ce73d 100644 --- a/probing/server/Cargo.toml +++ b/probing/server/Cargo.toml @@ -52,6 +52,8 @@ axum = { version = "0.8.1", default-features = false, features = [ "tower-log", ] } http-body-util = { version = "0.1" } +hyper = { version = "1.3.1", features = ["client", "http1"] } +hyper-util = { version = "0.1", features = ["client", "http1", "tokio"] } serde_urlencoded = "0.7.1" futures-util = "0.3" rmcp = { version = "1.8.0", features = ["server", "macros", "transport-streamable-http-server", "schemars"], optional = true } diff --git a/probing/server/src/server/api/mod.rs b/probing/server/src/server/api/mod.rs index b3b563d0..79a1db89 100644 --- a/probing/server/src/server/api/mod.rs +++ b/probing/server/src/server/api/mod.rs @@ -10,7 +10,7 @@ use axum::{ Router, }; -use super::{cluster, cluster_query, file_api, system, training}; +use super::{cluster, cluster_query, file_api, local_query, system, training}; /// Canonical public `/apis` routes (method, path suffix under `/apis`). /// Keep in sync with `tests/regression/spec/api_spec.json` — verified by `spec_tests`. @@ -23,6 +23,8 @@ pub const PUBLIC_API_ROUTES: &[(&str, &str)] = &[ ("GET", "/training/distributed_flamegraph/json"), ("GET", "/training/distributed_stack_flamegraph/json"), ("POST", "/cluster/query"), + ("GET", "/processes/local"), + ("POST", "/query/local-pid"), ]; /// Build the `/apis` router mounted by the root application. @@ -46,6 +48,8 @@ fn public_routes() -> Router { get(training::get_distributed_stack_flamegraph_json), ) .route("/cluster/query", post(cluster_query::post_cluster_query)) + .route("/processes/local", get(system::get_local_processes_json)) + .route("/query/local-pid", post(local_query::query_local_pid)) } #[cfg(test)] diff --git a/probing/server/src/server/local_query.rs b/probing/server/src/server/local_query.rs new file mode 100644 index 00000000..715cfbfd --- /dev/null +++ b/probing/server/src/server/local_query.rs @@ -0,0 +1,61 @@ +use axum::extract::Query as AxumQuery; +use axum::http::StatusCode; +use axum::response::IntoResponse; +use http_body_util::{BodyExt, Full}; +use hyper::body::Bytes; +use hyper::client::conn; +use hyper::Request; +use hyper_util::rt::TokioIo; +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +pub struct LocalPidQuery { + pid: i32, +} + +pub async fn query_local_pid( + AxumQuery(params): AxumQuery, + body: String, +) -> impl IntoResponse { + match forward_query_to_pid(params.pid, body).await { + Ok(response) => (StatusCode::OK, response).into_response(), + Err(err) => ( + StatusCode::BAD_GATEWAY, + format!("Failed to query local pid {}: {}", params.pid, err), + ) + .into_response(), + } +} + +async fn forward_query_to_pid(pid: i32, body: String) -> anyhow::Result { + #[cfg(target_os = "linux")] + let path = format!("\0probing-{pid}"); + #[cfg(not(target_os = "linux"))] + let path = { + let file_path = std::env::temp_dir().join(format!("probing-{pid}.sock")); + file_path.to_string_lossy().to_string() + }; + + let stream = tokio::net::UnixStream::connect(path).await?; + let io = TokioIo::new(stream); + let (mut sender, connection) = conn::http1::handshake(io).await?; + tokio::spawn(async move { + if let Err(err) = connection.await { + log::debug!("Local pid query connection error: {err}"); + } + }); + + let request = Request::builder() + .method("POST") + .uri("/query") + .header("Content-Type", "application/json") + .body(Full::::from(body))?; + let response = sender.send_request(request).await?; + let status = response.status(); + let bytes = response.into_body().collect().await?.to_bytes(); + let text = String::from_utf8_lossy(&bytes).to_string(); + if !status.is_success() { + anyhow::bail!("target returned HTTP {status}: {text}"); + } + Ok(text) +} diff --git a/probing/server/src/server/mod.rs b/probing/server/src/server/mod.rs index 61d14680..21f0fb98 100644 --- a/probing/server/src/server/mod.rs +++ b/probing/server/src/server/mod.rs @@ -14,6 +14,7 @@ pub mod config; pub mod error; pub mod file_api; pub mod health; +pub mod local_query; pub mod middleware; pub mod system; pub mod training; @@ -218,6 +219,7 @@ pub fn sync_env_settings() { "PROBING_SERVER_ADDRPATTERN", "PROBING_AUTH_TOKEN", "PROBING_BASE_PATH", + "PROBING_ORIGINAL", ] .contains(&k.as_str()) }) diff --git a/probing/server/src/server/system.rs b/probing/server/src/server/system.rs index b5e4e6b8..bdcfe9a3 100644 --- a/probing/server/src/server/system.rs +++ b/probing/server/src/server/system.rs @@ -66,6 +66,95 @@ pub async fn get_overview_json() -> ApiResult> { Ok(axum::Json(overview)) } + +/// Get local processes that currently expose probing memtables. +pub fn get_local_processes() -> Result> { + use std::collections::HashSet; + use probing_memtable::discover; + + let mut pids = HashSet::::new(); + for table in discover::discover()? { + if table.is_alive() { + pids.insert(table.pid() as i32); + } + } + + let mut processes = pids + .into_iter() + .map(process_from_pid) + .collect::>(); + processes.sort_by_key(|process| process.pid); + Ok(processes) +} + +/// Get local probing processes as JSON for API. +pub async fn get_local_processes_json() -> ApiResult>> { + Ok(axum::Json(get_local_processes()?)) +} + +fn process_from_pid(pid: i32) -> Process { + use std::collections::HashMap; + Process { + pid, + exe: read_proc_link(pid, "exe"), + env: HashMap::new(), + cmd: read_proc_cmdline(pid), + cwd: read_proc_link(pid, "cwd"), + main_thread: pid as u64, + threads: read_proc_threads(pid), + } +} + +#[cfg(target_os = "linux")] +fn read_proc_cmdline(pid: i32) -> String { + let path = format!("/proc/{pid}/cmdline"); + let cmd = std::fs::read_to_string(path) + .unwrap_or_default() + .replace('\0', " ") + .trim() + .to_string(); + if !cmd.is_empty() { + return cmd; + } + std::fs::read_to_string(format!("/proc/{pid}/comm")) + .unwrap_or_default() + .trim() + .to_string() +} + +#[cfg(not(target_os = "linux"))] +fn read_proc_cmdline(_pid: i32) -> String { + String::new() +} + +#[cfg(target_os = "linux")] +fn read_proc_link(pid: i32, name: &str) -> String { + std::fs::read_link(format!("/proc/{pid}/{name}")) + .ok() + .and_then(|path| path.to_str().map(|value| value.to_string())) + .unwrap_or_default() +} + +#[cfg(not(target_os = "linux"))] +fn read_proc_link(_pid: i32, _name: &str) -> String { + String::new() +} + +#[cfg(target_os = "linux")] +fn read_proc_threads(pid: i32) -> Vec { + std::fs::read_dir(format!("/proc/{pid}/task")) + .ok() + .into_iter() + .flat_map(|entries| entries.flatten()) + .filter_map(|entry| entry.file_name().to_string_lossy().parse::().ok()) + .collect() +} + +#[cfg(not(target_os = "linux"))] +fn read_proc_threads(_pid: i32) -> Vec { + Vec::new() +} + #[cfg(test)] mod tests { use super::*; diff --git a/python/probing/__init__.py b/python/probing/__init__.py index 87aa84de..5f30c4e6 100644 --- a/python/probing/__init__.py +++ b/python/probing/__init__.py @@ -62,6 +62,8 @@ def is_enabled(): step, ) + import probing.rl as rl + try: from probing.nccl.mock import maybe_auto_seed @@ -109,6 +111,7 @@ def is_enabled(): "phase", "attach_training_phases", "owns_training_phases", + "rl", "set_role", "clear_role", "current_role", diff --git a/python/probing/bundled_skills/semantic/pages.yaml b/python/probing/bundled_skills/semantic/pages.yaml index 0b412ccf..ca9f90de 100644 --- a/python/probing/bundled_skills/semantic/pages.yaml +++ b/python/probing/bundled_skills/semantic/pages.yaml @@ -74,3 +74,39 @@ pages: path: /python description: "Live Python variable tracing on functions." skills: [] + + rl/rollout: + title: "RL · Rollout" + path: /rl/rollout + description: "Per-trajectory phase timing across rollout workers." + skills: [] + + rl/train: + title: "RL · Train" + path: /rl/train + description: "Training batch phases keyed by train step." + skills: [] + + rl/spans: + title: "RL · Spans" + path: /rl/spans + description: "Distributed agentic-RL span hierarchy with cross-process linking." + skills: [] + + rl/process-timeline: + title: "RL · Process Timeline" + path: /rl/process-timeline + description: "Per-process span timing and batch drill-down." + skills: [] + + rl/perfetto: + title: "RL · Perfetto" + path: /rl/perfetto + description: "Chrome trace export for the loaded RL span set." + skills: [] + + rl/inference: + title: "RL · Inference" + path: /rl/inference + description: "Inference-engine Prometheus metrics for agentic RL rollouts." + skills: [] diff --git a/python/probing/ext/__init__.py b/python/probing/ext/__init__.py index de567c7d..13834377 100644 --- a/python/probing/ext/__init__.py +++ b/python/probing/ext/__init__.py @@ -11,8 +11,10 @@ 3. Normalize framework-specific events into Probing spans. Submodules: -- `ray`: Ray task and actor tracing. +- `ray`: Ray task and actor tracing (framework-neutral identity via PROBING_* env). - `torch`: PyTorch profiling hooks and utilities. - `megatron`: Megatron-LM role/step sync. - `vllm`: vLLM / vLLM-Metal inference role/step sync. +- `engines`: Inference-engine Prometheus metrics adapters (e.g. SGLang) for agentic RL. +- `slime`: Slime adapter — cmdline/env → neutral process roles; Slime router registration. """ diff --git a/python/probing/ext/engines/__init__.py b/python/probing/ext/engines/__init__.py new file mode 100644 index 00000000..0be3db5d --- /dev/null +++ b/python/probing/ext/engines/__init__.py @@ -0,0 +1,29 @@ +"""Inference engine metrics for Probing-RL. + +Generic registration is framework-neutral. Concrete adapters (e.g. SGLang, +Slime ``sglang_router``) live under ``probing.ext.engines.sglang`` and +``register_slime_sglang_router``. Metrics paths differ by adapter:: + + /engine_metrics — Slime sglang_router / model gateway + /metrics — sglang.launch_server --enable-metrics +""" + +from probing.ext.engines.registry import ( + get_engine, + list_engines, + register_engine, + register_slime_sglang_router, + unregister_engine, +) +from probing.ext.engines.scraper import ensure_scraper_running, scrape_all, scrape_engine + +__all__ = [ + "ensure_scraper_running", + "get_engine", + "list_engines", + "register_engine", + "register_slime_sglang_router", + "scrape_all", + "scrape_engine", + "unregister_engine", +] diff --git a/python/probing/ext/engines/mock_sglang_server.py b/python/probing/ext/engines/mock_sglang_server.py new file mode 100644 index 00000000..3f3e52c0 --- /dev/null +++ b/python/probing/ext/engines/mock_sglang_server.py @@ -0,0 +1,203 @@ +"""Minimal standalone SGLang-like HTTP server for metrics demos and tests. + +Implements the endpoints Probing scrapes without Slime or a GPU: + +- ``GET /engine_metrics`` — Prometheus text (same shape as SGLang) +- ``POST /generate`` — accepts dummy generation requests and updates metrics +- ``GET /health_generate`` — startup health check used by SGLang clients +""" + +from __future__ import annotations + +import json +import threading +import time +from dataclasses import dataclass, field +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer +@dataclass +class MockSGLangState: + num_requests_running: int = 0 + num_queue_reqs: int = 0 + total_requests: int = 0 + total_output_tokens: int = 0 + gen_throughput: float = 0.0 + time_per_output_token: float = 0.015 + time_to_first_token: float = 0.08 + cache_hit_rate: float = 0.0 + token_usage: int = 0 + max_total_num_tokens: int = 16384 + lock: threading.Lock = field(default_factory=threading.Lock) + + def render_prometheus(self) -> str: + with self.lock: + return ( + "# TYPE sglang:num_requests_running gauge\n" + f"sglang:num_requests_running {self.num_requests_running}\n" + "# TYPE sglang:num_queue_reqs gauge\n" + f"sglang:num_queue_reqs {self.num_queue_reqs}\n" + "# TYPE sglang:gen_throughput gauge\n" + f"sglang:gen_throughput {self.gen_throughput:.3f}\n" + "# TYPE sglang:time_per_output_token gauge\n" + f"sglang:time_per_output_token {self.time_per_output_token:.6f}\n" + "# TYPE sglang:time_to_first_token gauge\n" + f"sglang:time_to_first_token {self.time_to_first_token:.6f}\n" + "# TYPE sglang:cache_hit_rate gauge\n" + f"sglang:cache_hit_rate {self.cache_hit_rate:.4f}\n" + "# TYPE sglang:token_usage gauge\n" + f"sglang:token_usage {self.token_usage}\n" + "# TYPE sglang:max_total_num_tokens gauge\n" + f"sglang:max_total_num_tokens {self.max_total_num_tokens}\n" + "# TYPE sglang:total_requests counter\n" + f"sglang:total_requests {self.total_requests}\n" + ) + + def begin_request(self, output_tokens: int, latency_seconds: float) -> None: + with self.lock: + self.num_requests_running += 1 + self.total_requests += 1 + + time.sleep(latency_seconds) + + with self.lock: + self.num_requests_running = max(self.num_requests_running - 1, 0) + self.total_output_tokens += output_tokens + self.token_usage = min( + self.token_usage + output_tokens, + self.max_total_num_tokens, + ) + elapsed = max(latency_seconds, 1e-6) + self.gen_throughput = output_tokens / elapsed + self.time_per_output_token = elapsed / max(output_tokens, 1) + self.time_to_first_token = min(self.time_to_first_token, elapsed * 0.2) + if self.total_requests > 1: + self.cache_hit_rate = min(0.95, self.cache_hit_rate + 0.05) + + +def _make_handler(state: MockSGLangState) -> type[BaseHTTPRequestHandler]: + class Handler(BaseHTTPRequestHandler): + def log_message(self, format: str, *args) -> None: # noqa: A003 + return + + def _send(self, code: int, body: str, content_type: str = "text/plain") -> None: + encoded = body.encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", content_type) + self.send_header("Content-Length", str(len(encoded))) + self.end_headers() + self.wfile.write(encoded) + + def do_GET(self) -> None: # noqa: N802 + if self.path.rstrip("/") == "/engine_metrics": + self._send(200, state.render_prometheus()) + return + if self.path.rstrip("/") in {"/health_generate", "/health"}: + self._send(200, "ok\n") + return + self._send(404, "not found\n") + + def do_POST(self) -> None: # noqa: N802 + if self.path.rstrip("/") != "/generate": + self._send(404, "not found\n") + return + + length = int(self.headers.get("Content-Length", "0") or 0) + raw = self.rfile.read(length) if length else b"{}" + try: + payload = json.loads(raw.decode("utf-8") or "{}") + except json.JSONDecodeError: + payload = {} + + max_new_tokens = int(payload.get("max_new_tokens") or payload.get("max_tokens") or 16) + sleep_seconds = float(payload.get("mock_latency_seconds") or 0.05) + state.begin_request(max_new_tokens, sleep_seconds) + response = { + "text": "mock completion", + "meta_info": { + "completion_tokens": max_new_tokens, + "prompt_tokens": 8, + }, + } + self._send(200, json.dumps(response), content_type="application/json") + + return Handler + + +@dataclass +class MockSGLangServer: + host: str + port: int + state: MockSGLangState + _httpd: ThreadingHTTPServer | None = None + _thread: threading.Thread | None = None + + @property + def base_url(self) -> str: + return f"http://{self.host}:{self.port}" + + def start(self) -> None: + handler = _make_handler(self.state) + self._httpd = ThreadingHTTPServer((self.host, self.port), handler) + self._thread = threading.Thread( + target=self._httpd.serve_forever, + name="mock-sglang-http", + daemon=True, + ) + self._thread.start() + + def stop(self) -> None: + if self._httpd is not None: + self._httpd.shutdown() + self._httpd.server_close() + self._httpd = None + + +def start_mock_sglang_server(host: str = "127.0.0.1", port: int = 0) -> MockSGLangServer: + state = MockSGLangState() + handler = _make_handler(state) + httpd = ThreadingHTTPServer((host, port), handler) + bound_port = httpd.server_address[1] + server = MockSGLangServer(host=host, port=bound_port, state=state, _httpd=httpd) + server._thread = threading.Thread( + target=httpd.serve_forever, + name="mock-sglang-http", + daemon=True, + ) + server._thread.start() + return server + + +def send_dummy_generate_requests( + base_url: str, + *, + count: int = 5, + max_new_tokens: int = 32, + latency_seconds: float = 0.05, +) -> list[dict]: + """Send dummy ``POST /generate`` requests to a SGLang-compatible server.""" + + import urllib.error + import urllib.request + + results: list[dict] = [] + endpoint = f"{base_url.rstrip('/')}/generate" + for index in range(count): + payload = json.dumps( + { + "text": f"dummy prompt {index}", + "max_new_tokens": max_new_tokens, + "mock_latency_seconds": latency_seconds, + } + ).encode("utf-8") + request = urllib.request.Request( + endpoint, + data=payload, + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(request, timeout=10) as response: + body = response.read().decode("utf-8") + results.append(json.loads(body)) + except urllib.error.URLError as exc: + results.append({"error": str(exc)}) + return results diff --git a/python/probing/ext/engines/prometheus.py b/python/probing/ext/engines/prometheus.py new file mode 100644 index 00000000..6b488b9f --- /dev/null +++ b/python/probing/ext/engines/prometheus.py @@ -0,0 +1,110 @@ +"""Minimal Prometheus text exposition parser.""" + +from __future__ import annotations + +import re +from dataclasses import dataclass +from typing import Iterable + + +@dataclass(frozen=True) +class PrometheusSample: + name: str + value: float + labels: dict[str, str] + + +_METRIC_LINE = re.compile( + r"^(?P[a-zA-Z_:][a-zA-Z0-9_:]*)(?P\{[^}]*\})?\s+(?P-?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?|nan|inf|-inf)$" +) +_LABEL_PAIR = re.compile(r'([a-zA-Z_][a-zA-Z0-9_]*)="((?:\\.|[^"\\])*)"') + + +def _parse_labels(raw: str) -> dict[str, str]: + if not raw: + return {} + labels: dict[str, str] = {} + for match in _LABEL_PAIR.finditer(raw): + labels[match.group(1)] = match.group(2).replace('\\"', '"').replace("\\\\", "\\") + return labels + + +def parse_prometheus_text(body: str) -> list[PrometheusSample]: + """Parse ``text/plain; version=0.0.4`` Prometheus metrics.""" + + samples: list[PrometheusSample] = [] + for line in body.splitlines(): + stripped = line.strip() + if not stripped or stripped.startswith("#"): + continue + match = _METRIC_LINE.match(stripped) + if match is None: + continue + name = match.group("name") + labels_raw = match.group("labels") or "" + value_raw = match.group("value") + if value_raw in {"nan", "inf", "-inf"}: + continue + samples.append( + PrometheusSample( + name=name, + value=float(value_raw), + labels=_parse_labels(labels_raw.strip("{}")), + ) + ) + return samples + + +def metric_suffix(name: str) -> str: + """Return the metric name without an optional ``namespace:`` prefix.""" + + if ":" in name: + return name.rsplit(":", 1)[-1] + return name + + +def pick_metric(samples: Iterable[PrometheusSample], *candidates: str) -> float | None: + """Return the first matching sample value for any candidate suffix.""" + + wanted = {candidate.lower() for candidate in candidates} + for sample in samples: + suffix = metric_suffix(sample.name).lower() + if suffix in wanted: + return sample.value + return None + + +def pick_histogram_avg_seconds( + samples: Iterable[PrometheusSample], + *base_names: str, +) -> float | None: + """Return average latency in seconds from Prometheus histogram sum/count pairs.""" + + wanted_bases = {name.lower() for name in base_names} + sums: dict[tuple[str, tuple[tuple[str, str], ...]], float] = {} + counts: dict[tuple[str, tuple[tuple[str, str], ...]], float] = {} + + for sample in samples: + suffix = metric_suffix(sample.name).lower() + label_key = tuple(sorted(sample.labels.items())) + if suffix.endswith("_sum"): + base = suffix[: -len("_sum")] + if base in wanted_bases: + sums[(base, label_key)] = sample.value + elif suffix.endswith("_count"): + base = suffix[: -len("_count")] + if base in wanted_bases: + counts[(base, label_key)] = sample.value + + for key, total in sums.items(): + count = counts.get(key) + if count is not None and count > 0: + return total / count + + for base in wanted_bases: + total_sum = sum(value for (metric_base, _), value in sums.items() if metric_base == base) + total_count = sum(value for (metric_base, _), value in counts.items() if metric_base == base) + if total_count > 0: + return total_sum / total_count + + return None diff --git a/python/probing/ext/engines/registry.py b/python/probing/ext/engines/registry.py new file mode 100644 index 00000000..f2703384 --- /dev/null +++ b/python/probing/ext/engines/registry.py @@ -0,0 +1,131 @@ +"""In-process registry for inference engine scrape targets.""" + +from __future__ import annotations + +import threading +import time +from dataclasses import asdict, dataclass, field +from typing import Any + +from probing.ext.engines.sglang import DEFAULT_METRICS_PATH, resolve_metrics_path + + +@dataclass +class EngineRegistration: + engine_id: str + engine_type: str + router_addr: str + metrics_path: str = DEFAULT_METRICS_PATH + framework: str = "agentic-rl" + labels: dict[str, str] = field(default_factory=dict) + registered_at_ns: int = field(default_factory=lambda: time.time_ns()) + last_scrape_at_ns: int | None = None + last_scrape_error: str | None = None + last_normalized: dict[str, float] = field(default_factory=dict) + + @property + def metrics_url(self) -> str: + from probing.ext.engines.sglang import build_metrics_url + + return build_metrics_url(self.router_addr, self.metrics_path) + + def to_dict(self) -> dict[str, Any]: + payload = asdict(self) + payload["metrics_url"] = self.metrics_url + payload["status"] = "healthy" if self.last_scrape_error is None else "degraded" + return payload + + +_lock = threading.Lock() +_engines: dict[str, EngineRegistration] = {} + + +def register_engine( + *, + router_addr: str, + engine_id: str = "inference-engine", + engine_type: str = "sglang", + metrics_path: str | None = None, + framework: str = "agentic-rl", + labels: dict[str, str] | None = None, + auto_scrape: bool = True, +) -> EngineRegistration: + """Register an inference engine metrics endpoint.""" + + registration = EngineRegistration( + engine_id=engine_id, + engine_type=engine_type, + router_addr=router_addr, + metrics_path=resolve_metrics_path(metrics_path), + framework=framework, + labels=dict(labels or {}), + ) + with _lock: + _engines[engine_id] = registration + if auto_scrape: + from probing.ext.engines.scraper import ensure_scraper_running + + ensure_scraper_running() + return registration + + +def register_slime_sglang_router( + router_addr: str | None, + *, + engine_id: str = "sglang-router", + framework: str = "slime", + labels: dict[str, str] | None = None, + auto_scrape: bool = True, +) -> EngineRegistration | None: + """Register Slime's ``sglang_router`` metrics endpoint. + + Slime returns ``http://{router_ip}:{router_port}`` from + ``RolloutManager.get_metrics_router_addr()``. Metrics are scraped from + ``{router_addr}/engine_metrics``. + """ + + if not router_addr: + return None + merged_labels = {"integration": "slime", "source": "sglang_router"} + if labels: + merged_labels.update(labels) + return register_engine( + router_addr=router_addr, + engine_id=engine_id, + engine_type="sglang", + metrics_path=DEFAULT_METRICS_PATH, + framework=framework, + labels=merged_labels, + auto_scrape=auto_scrape, + ) + + +def unregister_engine(engine_id: str) -> bool: + with _lock: + return _engines.pop(engine_id, None) is not None + + +def get_engine(engine_id: str) -> EngineRegistration | None: + with _lock: + registration = _engines.get(engine_id) + return registration + + +def list_engines() -> list[EngineRegistration]: + with _lock: + return list(_engines.values()) + + +def update_scrape_result( + engine_id: str, + *, + normalized: dict[str, float], + scrape_error: str | None, +) -> None: + with _lock: + registration = _engines.get(engine_id) + if registration is None: + return + registration.last_scrape_at_ns = time.time_ns() + registration.last_scrape_error = scrape_error + registration.last_normalized = dict(normalized) diff --git a/python/probing/ext/engines/scraper.py b/python/probing/ext/engines/scraper.py new file mode 100644 index 00000000..6f1f9662 --- /dev/null +++ b/python/probing/ext/engines/scraper.py @@ -0,0 +1,111 @@ +"""Persist scraped engine metrics and run background scrapers.""" + +from __future__ import annotations + +import os +import threading +import time +from dataclasses import dataclass + +from probing.core.table import table +from probing.ext.engines.registry import ( + EngineRegistration, + get_engine, + list_engines, + update_scrape_result, +) +from probing.ext.engines.sglang import fetch_sglang_metrics, flatten_samples_for_storage + + +@table("inference_engine_metric") +@dataclass +class InferenceEngineMetric: + timestamp_ns: int + engine_id: str + engine_type: str + metric_name: str + metric_value: float + labels: str + + +_scraper_lock = threading.Lock() +_scraper_started = False + + +def scrape_interval_seconds() -> float: + raw = os.environ.get("PROBING_ENGINE_SCRAPE_INTERVAL", "5") + try: + return max(float(raw), 1.0) + except ValueError: + return 5.0 + + +def scrape_engine(registration: EngineRegistration) -> dict: + if registration.engine_type != "sglang": + update_scrape_result( + registration.engine_id, + normalized={}, + scrape_error=f"unsupported engine_type={registration.engine_type}", + ) + return {"engine_id": registration.engine_id, "error": "unsupported engine_type"} + + snapshot = fetch_sglang_metrics( + registration.engine_id, + registration.router_addr, + metrics_path=registration.metrics_path, + ) + update_scrape_result( + registration.engine_id, + normalized=snapshot.normalized, + scrape_error=snapshot.scrape_error, + ) + + if snapshot.raw_samples: + timestamp_ns = time.time_ns() + rows = flatten_samples_for_storage( + registration.engine_id, + registration.engine_type, + timestamp_ns, + list(snapshot.raw_samples), + ) + for row in rows: + InferenceEngineMetric(*row).save() + for metric_name, metric_value in snapshot.normalized.items(): + InferenceEngineMetric( + timestamp_ns=timestamp_ns, + engine_id=registration.engine_id, + engine_type=registration.engine_type, + metric_name=f"normalized.{metric_name}", + metric_value=metric_value, + labels="normalized=1", + ).save() + + return snapshot.to_dict() + + +def scrape_all() -> list[dict]: + results = [] + for registration in list_engines(): + results.append(scrape_engine(registration)) + return results + + +def _scraper_loop() -> None: + while True: + try: + scrape_all() + except Exception: + pass + time.sleep(scrape_interval_seconds()) + + +def ensure_scraper_running() -> None: + global _scraper_started + if os.environ.get("PROBING_ENGINE_SCRAPE", "1").strip().lower() in {"0", "false", "off"}: + return + with _scraper_lock: + if _scraper_started: + return + thread = threading.Thread(target=_scraper_loop, name="probing-engine-scraper", daemon=True) + thread.start() + _scraper_started = True diff --git a/python/probing/ext/engines/sglang.py b/python/probing/ext/engines/sglang.py new file mode 100644 index 00000000..0b17a3a6 --- /dev/null +++ b/python/probing/ext/engines/sglang.py @@ -0,0 +1,243 @@ +"""SGLang / sglang_router metrics adapter. + +Slime registers engines with ``sglang_router`` and exposes aggregated engine +Prometheus metrics on the router main port:: + + GET http://{router_ip}:{router_port}/engine_metrics + +See ``slime.ray.rollout.RolloutManager.get_metrics_router_addr``. +""" + +from __future__ import annotations + +import urllib.error +import urllib.request +from dataclasses import dataclass +from typing import Any + +from probing.ext.engines.prometheus import ( + PrometheusSample, + metric_suffix, + parse_prometheus_text, + pick_histogram_avg_seconds, + pick_metric, +) + +# Slime ``sglang_router`` / model gateway. +DEFAULT_METRICS_PATH = "/engine_metrics" +# ``sglang.launch_server`` with ``--enable-metrics``. +LAUNCH_SERVER_METRICS_PATH = "/metrics" + + +def resolve_metrics_path(metrics_path: str | None = None) -> str: + """Resolve the Prometheus scrape path for an inference engine. + + Priority: explicit argument > ``PROBING_ENGINE_METRICS_PATH`` env > default. + """ + + import os + + raw = (metrics_path or os.environ.get("PROBING_ENGINE_METRICS_PATH", "")).strip() + if not raw: + return DEFAULT_METRICS_PATH + return raw if raw.startswith("/") else f"/{raw}" + +# Canonical metric names consumed by the Web UI. +NORMALIZED_METRICS = ( + "inflight_requests", + "queue_depth", + "throughput_tps", + "tpot_ms", + "ttft_ms", + "kv_cache_usage_ratio", + "cache_hit_ratio", +) + + +@dataclass(frozen=True) +class SGLangMetricsSnapshot: + engine_id: str + metrics_url: str + raw_samples: tuple[PrometheusSample, ...] + normalized: dict[str, float] + scrape_error: str | None = None + + def to_dict(self) -> dict[str, Any]: + return { + "engine_id": self.engine_id, + "metrics_url": self.metrics_url, + "normalized": self.normalized, + "raw_count": len(self.raw_samples), + "scrape_error": self.scrape_error, + } + + +def _latency_seconds_to_ms(value_seconds: float) -> float: + """Convert a latency gauge from seconds to ms (legacy gauges may already be ms).""" + + return value_seconds * 1000.0 if value_seconds < 10 else value_seconds + + +def build_metrics_url(router_addr: str, metrics_path: str = DEFAULT_METRICS_PATH) -> str: + base = router_addr.rstrip("/") + if not base.startswith(("http://", "https://")): + base = f"http://{base}" + if not metrics_path.startswith("/"): + metrics_path = f"/{metrics_path}" + return f"{base}{metrics_path}" + + +def normalize_sglang_samples(samples: list[PrometheusSample]) -> dict[str, float]: + """Map SGLang Prometheus samples to framework-neutral metric names.""" + + normalized: dict[str, float] = {} + + inflight = pick_metric( + samples, + "num_requests_running", + "num_running_reqs", + "running_requests", + ) + if inflight is not None: + normalized["inflight_requests"] = inflight + + queue = pick_metric( + samples, + "num_queue_reqs", + "num_waiting_reqs", + "queue_requests", + ) + if queue is not None: + normalized["queue_depth"] = queue + + throughput = pick_metric(samples, "gen_throughput", "generation_throughput", "token_throughput") + if throughput is not None: + normalized["throughput_tps"] = throughput + + tpot_seconds = pick_metric( + samples, + "time_per_output_token", + "tpot", + "avg_time_per_output_token", + ) + if tpot_seconds is None: + tpot_seconds = pick_histogram_avg_seconds( + samples, + "inter_token_latency_seconds", + "time_per_output_token_seconds", + ) + if tpot_seconds is not None: + normalized["tpot_ms"] = _latency_seconds_to_ms(tpot_seconds) + + ttft_seconds = pick_metric( + samples, + "time_to_first_token", + "ttft", + "avg_time_to_first_token", + ) + if ttft_seconds is None: + ttft_seconds = pick_histogram_avg_seconds( + samples, + "time_to_first_token_seconds", + ) + if ttft_seconds is not None: + normalized["ttft_ms"] = _latency_seconds_to_ms(ttft_seconds) + + cache_hit = pick_metric(samples, "cache_hit_rate", "prefix_cache_hit_rate") + if cache_hit is not None: + normalized["cache_hit_ratio"] = cache_hit + + kv_usage = _resolve_kv_cache_usage_ratio(samples) + if kv_usage is not None: + normalized["kv_cache_usage_ratio"] = kv_usage + + return normalized + + +def _resolve_kv_cache_usage_ratio(samples: list[PrometheusSample]) -> float | None: + """Map SGLang KV pool occupancy to a 0..1 ratio.""" + + max_tokens = pick_metric(samples, "max_total_num_tokens", "max_num_tokens", "token_capacity") + if max_tokens in (None, 0): + return pick_metric(samples, "token_usage_ratio", "kv_cache_usage", "cache_usage") + + # ``launch_server`` exposes pool occupancy via kv_* gauges; ``token_usage`` may stay 0. + kv_used = pick_metric(samples, "kv_used_tokens") + kv_evictable = pick_metric(samples, "kv_evictable_tokens") + if kv_used is not None or kv_evictable is not None: + occupied = (kv_used or 0.0) + (kv_evictable or 0.0) + return min(occupied / max_tokens, 1.0) + + kv_available = pick_metric(samples, "kv_available_tokens") + if kv_available is not None: + occupied = max_tokens - kv_available + if occupied >= 0: + return min(occupied / max_tokens, 1.0) + + token_usage = pick_metric(samples, "token_usage", "num_used_tokens", "used_tokens") + if token_usage is not None: + return min(token_usage / max_tokens, 1.0) + + return pick_metric(samples, "token_usage_ratio", "kv_cache_usage", "cache_usage") + + +def fetch_sglang_metrics( + engine_id: str, + router_addr: str, + *, + metrics_path: str = DEFAULT_METRICS_PATH, + timeout_seconds: float = 3.0, +) -> SGLangMetricsSnapshot: + metrics_url = build_metrics_url(router_addr, metrics_path) + request = urllib.request.Request(metrics_url, headers={"Accept": "text/plain"}) + try: + with urllib.request.urlopen(request, timeout=timeout_seconds) as response: + body = response.read().decode("utf-8", errors="replace") + except urllib.error.HTTPError as exc: + return SGLangMetricsSnapshot( + engine_id=engine_id, + metrics_url=metrics_url, + raw_samples=tuple(), + normalized={}, + scrape_error=f"HTTP {exc.code}: {exc.reason}", + ) + except Exception as exc: # pragma: no cover - network errors vary + return SGLangMetricsSnapshot( + engine_id=engine_id, + metrics_url=metrics_url, + raw_samples=tuple(), + normalized={}, + scrape_error=str(exc), + ) + + samples = parse_prometheus_text(body) + return SGLangMetricsSnapshot( + engine_id=engine_id, + metrics_url=metrics_url, + raw_samples=tuple(samples), + normalized=normalize_sglang_samples(samples), + ) + + +def flatten_samples_for_storage( + engine_id: str, + engine_type: str, + timestamp_ns: int, + samples: list[PrometheusSample], +) -> list[tuple[int, str, str, str, float, str]]: + """Rows for ``InferenceEngineMetric`` persistence.""" + + rows: list[tuple[int, str, str, str, float, str]] = [] + for sample in samples: + labels = ",".join(f"{key}={value}" for key, value in sorted(sample.labels.items())) + rows.append( + ( + timestamp_ns, + engine_id, + engine_type, + metric_suffix(sample.name), + sample.value, + labels, + ) + ) + return rows diff --git a/python/probing/ext/ray.py b/python/probing/ext/ray.py index 9df993d6..7a64b074 100644 --- a/python/probing/ext/ray.py +++ b/python/probing/ext/ray.py @@ -16,12 +16,282 @@ def my_task(x): """ import functools +import hashlib import os -from typing import Optional +import socket +from typing import Any, Optional from probing.utils.py import _get_attr, _get_ray +RAY_PROCESS_FIELDS = [ + "timestamp_ns", + "pid", + "hostname", + "node_ip", + "ray_job_id", + "ray_node_id", + "ray_worker_id", + "ray_task_id", + "ray_actor_id", + "ray_actor_name", + "ray_namespace", + "process_role", +] + +RAY_TASK_FIELDS = [ + "timestamp_ns", + "task_id", + "parent_task_id", + "actor_id", + "function_name", + "task_type", + "state", + "job_id", + "node_id", + "worker_id", + "worker_pid", + "start_time_ns", + "end_time_ns", +] + +RAY_ACTOR_FIELDS = [ + "timestamp_ns", + "actor_id", + "class_name", + "state", + "job_id", + "node_id", + "worker_id", + "worker_pid", + "start_time_ns", + "end_time_ns", +] + +_ray_tables: dict[str, Any] = {} +_span_context_enabled = False + + +def _ray_table(name: str, fields: list[str]): + import probing + + table = _ray_tables.get(name) + if table is not None: + return table + + try: + table = probing.ExternalTable.get(name) + if table.names() != fields: + probing.ExternalTable.drop(name) + table = probing.ExternalTable.get_or_create(name, fields) + except Exception: + table = probing.ExternalTable.get_or_create(name, fields) + _ray_tables[name] = table + return table + + +def _append_ray_row(name: str, fields: list[str], row: dict[str, Any]) -> None: + try: + _ray_table(name, fields).append([row.get(field, "") for field in fields]) + except Exception: + pass + + +def _now_ns() -> int: + import time + + return time.time_ns() + + +def _stable_int(value: str, modulo: int = 2_000_000_000) -> int: + if not value: + return 1 + digest = hashlib.blake2b(value.encode("utf-8"), digest_size=8).digest() + return int.from_bytes(digest, "big") % modulo + 1 + + +def _safe_str(value: Any) -> str: + if value is None: + return "" + try: + return str(value) + except Exception: + return "" + + +def _safe_int(value: Any, default: int = 0) -> int: + if value is None or value == "": + return default + try: + return int(value) + except Exception: + return default + + +def _call_attr(obj: Any, names: list[str], default: Any = "") -> Any: + for name in names: + try: + attr = getattr(obj, name, None) + if attr is None: + continue + value = attr() if callable(attr) else attr + if value is not None: + return value + except Exception: + continue + return default + + +def _current_ray_context_attrs() -> dict[str, str]: + """Return Ray runtime identity for the current driver/worker process.""" + attrs: dict[str, str] = {} + try: + ray = _get_ray() + if not ray.is_initialized(): + return attrs + ctx = ray.get_runtime_context() + except Exception: + return attrs + + for key, names in { + "ray_job_id": ["get_job_id", "job_id"], + "ray_node_id": ["get_node_id", "node_id"], + "ray_namespace": ["namespace"], + }.items(): + value = _call_attr(ctx, names) + if value: + attrs[key] = _safe_str(value) + + is_worker = False + try: + worker_module = getattr(getattr(ray, "_private", None), "worker", None) + global_worker = getattr(worker_module, "global_worker", None) + worker_mode = getattr(worker_module, "WORKER_MODE", None) + is_worker = ( + global_worker is not None + and worker_mode is not None + and getattr(global_worker, "mode", None) == worker_mode + ) + except Exception: + is_worker = False + + if is_worker: + for key, names in { + "ray_worker_id": ["get_worker_id", "worker_id"], + "ray_task_id": ["get_task_id", "task_id"], + "ray_actor_id": ["get_actor_id", "actor_id"], + }.items(): + value = _call_attr(ctx, names) + if value: + attrs[key] = _safe_str(value) + + actor_name = _call_attr(ctx, ["get_actor_name", "actor_name"]) + if actor_name: + attrs["ray_actor_name"] = _safe_str(actor_name) + + return attrs + + +def _process_identity_attrs(process_role: str = "") -> dict[str, Any]: + try: + hostname = socket.gethostname() + except Exception: + hostname = "" + + # Optional framework adapters bridge their env into PROBING_* once. + try: + from probing.ext.slime import apply_env_bridge + + apply_env_bridge() + except Exception: + pass + + node_ip = ( + os.environ.get("PROBING_NODE_IP") + or os.environ.get("POD_IP") + or os.environ.get("RAY_NODE_IP") + or "" + ) + if not node_ip and hostname: + try: + node_ip = socket.gethostbyname(hostname) + except Exception: + node_ip = "" + + attrs: dict[str, Any] = { + "pid": os.getpid(), + "hostname": hostname, + "node_ip": node_ip, + } + attrs.update(_current_ray_context_attrs()) + role = ( + process_role + or os.environ.get("PROBING_RAY_PROCESS_ROLE", "") + or os.environ.get("PROBING_PROCESS_ROLE", "") + ) + if role: + attrs["process_role"] = role + return attrs + + +def current_process_identity(process_role: str = "") -> dict[str, Any]: + """Return the current process identity used to correlate Ray spans.""" + return _process_identity_attrs(process_role) + + +def register_current_process(process_role: str = "") -> None: + """Persist the current Ray process identity, if Ray/probing are available.""" + try: + attrs = _process_identity_attrs(process_role) + _append_ray_row( + "ray_process", + RAY_PROCESS_FIELDS, + { + "timestamp_ns": _now_ns(), + "pid": os.getpid(), + "hostname": _safe_str(attrs.get("hostname")), + "node_ip": _safe_str(attrs.get("node_ip")), + "ray_job_id": _safe_str(attrs.get("ray_job_id")), + "ray_node_id": _safe_str(attrs.get("ray_node_id")), + "ray_worker_id": _safe_str(attrs.get("ray_worker_id")), + "ray_task_id": _safe_str(attrs.get("ray_task_id")), + "ray_actor_id": _safe_str(attrs.get("ray_actor_id")), + "ray_actor_name": _safe_str(attrs.get("ray_actor_name")), + "ray_namespace": _safe_str(attrs.get("ray_namespace")), + "process_role": _safe_str(attrs.get("process_role")), + }, + ) + except Exception: + pass + + +def _ray_span_attributes() -> dict[str, Any]: + """Attributes added to manual probing spans in Ray driver/worker processes.""" + return _process_identity_attrs() + + +def enable_span_context() -> None: + """Attach Ray process identity to every manual ``probing.span`` in this process.""" + global _span_context_enabled + if _span_context_enabled: + return + try: + from probing.tracing import add_span_attribute_provider + + add_span_attribute_provider(_ray_span_attributes) + _span_context_enabled = True + except Exception: + pass + + +def setup_driver(process_role: str = "driver") -> None: + """Enable Ray span attributes and record the current driver process identity.""" + if process_role: + os.environ["PROBING_RAY_PROCESS_ROLE"] = process_role + enable_span_context() + register_current_process(process_role=process_role) + + class ProbingSpanProcessor: """OpenTelemetry SpanProcessor that converts spans to probing.""" @@ -60,11 +330,21 @@ def on_start(self, span, parent_context=None): span_kind = kind_map.get(span.kind) if span_kind: attrs["otel.span_kind"] = span_kind + attrs.update({k: _safe_str(v) for k, v in _process_identity_attrs().items()}) + + span_context = span.get_span_context() + attrs["otel_trace_id"] = format(span_context.trace_id, "032x") + attrs["otel_span_id"] = format(span_context.span_id, "016x") + try: + parent = getattr(span, "parent", None) + if parent: + attrs["otel_parent_span_id"] = format(parent.span_id, "016x") + except Exception: + pass probing_span = probing.span(span_name, **attrs) probing_span.__enter__() - span_context = span.get_span_context() self._span_map[(span_context.trace_id, span_context.span_id)] = probing_span except Exception: pass @@ -151,8 +431,7 @@ def traced_execute(*args, **kwargs): def init(): """Initialize Ray tracing integration (called by import hook).""" - # Users should explicitly use: ray.init(_tracing_startup_hook="probing.ext.ray:setup_tracing") - pass + enable_span_context() def setup_tracing() -> None: @@ -165,15 +444,82 @@ def setup_tracing() -> None: from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider + os.environ["PROBING"] = os.environ.get("PROBING", "1") + try: + from probing.ext.slime import apply_env_bridge + + apply_env_bridge() + except Exception: + pass + worker_role = ( + os.environ.get("PROBING_RAY_PROCESS_ROLE", "").strip() + or os.environ.get("PROBING_PROCESS_ROLE", "").strip() + or "ray_worker" + ) + os.environ["PROBING_RAY_PROCESS_ROLE"] = worker_role + enable_span_context() + trace.set_tracer_provider(TracerProvider()) trace.get_tracer_provider().add_span_processor(ProbingSpanProcessor()) - os.environ["PROBING"] = os.environ.get("PROBING", "1") + register_current_process(process_role=worker_role) _wrap_task_execution_in_worker() except Exception: pass +def _worker_pid(worker_info) -> int: + return _safe_int( + _get_attr( + worker_info, + [ + "pid", + "worker_pid", + "process_id", + "processId", + ], + ) + ) + + +def _worker_id(worker_info) -> str: + return _safe_str(_get_attr(worker_info, ["worker_id", "workerId", "id"], "")) + + +def _worker_node_id(worker_info) -> str: + return _safe_str(_get_attr(worker_info, ["node_id", "nodeId"], "")) + + +def _collect_worker_info() -> dict[str, dict[str, Any]]: + """Return worker_id -> state metadata from Ray state API when available.""" + try: + from ray.util.state import list_workers + + workers = list(list_workers(detail=True)) + except Exception: + return {} + + result: dict[str, dict[str, Any]] = {} + for worker in workers: + worker_id = _worker_id(worker) + if not worker_id: + continue + result[worker_id] = { + "pid": _worker_pid(worker), + "node_id": _worker_node_id(worker), + "worker_type": _safe_str(_get_attr(worker, ["worker_type", "type"], "")), + } + return result + + +def _process_id_for_worker(worker_id: str, node_id: str = "", worker_pid: int = 0) -> int: + if worker_pid > 0: + return _stable_int(f"{node_id}:{worker_pid}") + if worker_id: + return _stable_int(worker_id) + return 1 + + def _extract_time_from_events(events): """Extract start and end time from Ray task events.""" if not events: @@ -219,7 +565,7 @@ def _extract_time_from_events(events): return start_time_ms, end_time_ms -def _convert_task_to_timeline_entry(task, index=0, total=1, worker_to_pid=None): +def _convert_task_to_timeline_entry(task, index=0, total=1, worker_info=None): """Convert Ray TaskState to timeline entry. Note: If start_time_ms and end_time_ms are None, we use a relative timeline @@ -234,8 +580,8 @@ def _convert_task_to_timeline_entry(task, index=0, total=1, worker_to_pid=None): Task index for relative timeline fallback total : int Total number of tasks for relative timeline fallback - worker_to_pid : dict, optional - Mapping from worker_id to process_id (pid). If None, will use hash of worker_id. + worker_info : dict, optional + Mapping from worker_id to process metadata. """ task_id = _get_attr(task, ["task_id"], "") func_name = _get_attr( @@ -279,20 +625,20 @@ def _convert_task_to_timeline_entry(task, index=0, total=1, worker_to_pid=None): # Get worker_id and determine process_id (pid) worker_id = _get_attr(task, ["worker_id"], "") - if worker_to_pid is not None and worker_id: - process_id = worker_to_pid.get(worker_id, hash(worker_id) % 10000 + 1) - elif worker_id: - # Use hash of worker_id to generate a consistent pid - process_id = abs(hash(worker_id)) % 10000 + 1 - else: - process_id = 1 # Default pid for tasks without worker_id + node_id = _safe_str(_get_attr(task, ["node_id"], "")) + info = (worker_info or {}).get(worker_id, {}) if worker_id else {} + worker_pid = _safe_int(info.get("pid")) + if info.get("node_id") and not node_id: + node_id = _safe_str(info.get("node_id")) + process_id = _process_id_for_worker(_safe_str(worker_id), node_id, worker_pid) attributes = { "task_id": str(task_id), "function_name": func_name, "state": _get_attr(task, ["state"], "unknown"), "worker_id": str(worker_id), - "node_id": str(_get_attr(task, ["node_id"], "")), + "worker_pid": str(worker_pid), + "node_id": node_id, "job_id": str(_get_attr(task, ["job_id"], "")), "task_type": str(task_type), } @@ -334,19 +680,20 @@ def _convert_task_to_timeline_entry(task, index=0, total=1, worker_to_pid=None): "kind": entry_type, "thread_id": 0, "process_id": process_id, # Add process_id for Chrome tracing format + "worker_pid": worker_pid, "attributes": attributes, } -def _convert_actor_to_timeline_entry(actor, worker_to_pid=None): +def _convert_actor_to_timeline_entry(actor, worker_info=None): """Convert Ray actor to timeline entry. Parameters ---------- actor : ActorState Ray actor state object - worker_to_pid : dict, optional - Mapping from worker_id to process_id (pid). If None, will use hash of worker_id. + worker_info : dict, optional + Mapping from worker_id to process metadata. """ actor_id = _get_attr(actor, ["actor_id"], "") class_name = _get_attr( @@ -374,20 +721,20 @@ def _convert_actor_to_timeline_entry(actor, worker_to_pid=None): # Get worker_id and determine process_id (pid) worker_id = _get_attr(actor, ["worker_id"], "") - if worker_to_pid is not None and worker_id: - process_id = worker_to_pid.get(worker_id, hash(worker_id) % 10000 + 1) - elif worker_id: - # Use hash of worker_id to generate a consistent pid - process_id = abs(hash(worker_id)) % 10000 + 1 - else: - process_id = 1 # Default pid for actors without worker_id + node_id = _safe_str(_get_attr(actor, ["node_id"], "")) + info = (worker_info or {}).get(worker_id, {}) if worker_id else {} + worker_pid = _safe_int(info.get("pid")) + if info.get("node_id") and not node_id: + node_id = _safe_str(info.get("node_id")) + process_id = _process_id_for_worker(_safe_str(worker_id), node_id, worker_pid) attributes = { "actor_id": str(actor_id), "class_name": class_name, "state": _get_attr(actor, ["state"], "unknown"), "worker_id": str(worker_id), - "node_id": str(_get_attr(actor, ["node_id"], "")), + "worker_pid": str(worker_pid), + "node_id": node_id, "job_id": str(_get_attr(actor, ["job_id"], "")), } @@ -403,10 +750,60 @@ def _convert_actor_to_timeline_entry(actor, worker_to_pid=None): "kind": "actor", "thread_id": 0, "process_id": process_id, # Add process_id for Chrome tracing format + "worker_pid": worker_pid, "attributes": attributes, } +def _save_ray_task_entry(entry: dict[str, Any]) -> None: + try: + attrs = entry.get("attributes", {}) + _append_ray_row( + "ray_task", + RAY_TASK_FIELDS, + { + "timestamp_ns": _now_ns(), + "task_id": _safe_str(attrs.get("task_id")), + "parent_task_id": _safe_str(attrs.get("parent_task_id")), + "actor_id": _safe_str(attrs.get("actor_id")), + "function_name": _safe_str(attrs.get("function_name")), + "task_type": _safe_str(attrs.get("task_type")), + "state": _safe_str(attrs.get("state")), + "job_id": _safe_str(attrs.get("job_id")), + "node_id": _safe_str(attrs.get("node_id")), + "worker_id": _safe_str(attrs.get("worker_id")), + "worker_pid": _safe_int(attrs.get("worker_pid")), + "start_time_ns": _safe_int(entry.get("start_time")), + "end_time_ns": _safe_int(entry.get("end_time")), + }, + ) + except Exception: + pass + + +def _save_ray_actor_entry(entry: dict[str, Any]) -> None: + try: + attrs = entry.get("attributes", {}) + _append_ray_row( + "ray_actor", + RAY_ACTOR_FIELDS, + { + "timestamp_ns": _now_ns(), + "actor_id": _safe_str(attrs.get("actor_id")), + "class_name": _safe_str(attrs.get("class_name")), + "state": _safe_str(attrs.get("state")), + "job_id": _safe_str(attrs.get("job_id")), + "node_id": _safe_str(attrs.get("node_id")), + "worker_id": _safe_str(attrs.get("worker_id")), + "worker_pid": _safe_int(attrs.get("worker_pid")), + "start_time_ns": _safe_int(entry.get("start_time")), + "end_time_ns": _safe_int(entry.get("end_time")), + }, + ) + except Exception: + pass + + def get_ray_timeline( task_filter: Optional[str] = None, actor_filter: Optional[str] = None, @@ -440,9 +837,6 @@ def get_ray_timeline( timeline: list[dict] = [] - # Build worker_id -> process_id mapping in a first pass - worker_ids: set[str] = set() - task_filters = {"func_or_class_name": task_filter} if task_filter else {} actor_filters = {"class_name": actor_filter} if actor_filter else {} @@ -458,26 +852,14 @@ def get_ray_timeline( except Exception: actors_list = [] - for task in tasks_list: - worker_id = _get_attr(task, "worker_id", "") - if worker_id: - worker_ids.add(worker_id) - - for actor in actors_list: - worker_id = _get_attr(actor, "worker_id", "") - if worker_id: - worker_ids.add(worker_id) - - worker_to_pid = { - worker_id: idx for idx, worker_id in enumerate(sorted(worker_ids), start=1) - } + worker_info = _collect_worker_info() - # Second pass: convert tasks with worker_to_pid mapping + # Second pass: convert tasks with worker metadata mapping total_tasks = len(tasks_list) for index, task in enumerate(tasks_list): entry = _convert_task_to_timeline_entry( - task, index, total_tasks, worker_to_pid + task, index, total_tasks, worker_info ) # Apply time filters @@ -485,16 +867,18 @@ def get_ray_timeline( continue if end_time and entry["end_time"] and entry["end_time"] > end_time: continue + _save_ray_task_entry(entry) timeline.append(entry) - # Convert actors with worker_to_pid mapping + # Convert actors with worker metadata mapping for actor in actors_list: - entry = _convert_actor_to_timeline_entry(actor, worker_to_pid) + entry = _convert_actor_to_timeline_entry(actor, worker_info) # Apply time filters if start_time and entry["start_time"] and entry["start_time"] < start_time: continue if end_time and entry["end_time"] and entry["end_time"] > end_time: continue + _save_ray_actor_entry(entry) timeline.append(entry) timeline.sort(key=lambda x: x["start_time"]) @@ -534,7 +918,7 @@ def get_ray_timeline_chrome_format( if worker_id and worker_id not in worker_to_info: worker_to_info[worker_id] = { "node_id": attributes.get("node_id", ""), - "worker_pid": None, # worker_pid is not in attributes, we'll try to get it from task + "worker_pid": _safe_int(attributes.get("worker_pid")), } # Build process_id to worker_id reverse mapping and update worker info @@ -551,6 +935,9 @@ def get_ray_timeline_chrome_format( node_id = attributes.get("node_id", "") if node_id and not worker_to_info[worker_id]["node_id"]: worker_to_info[worker_id]["node_id"] = node_id + worker_pid = _safe_int(attributes.get("worker_pid")) + if worker_pid and not worker_to_info[worker_id]["worker_pid"]: + worker_to_info[worker_id]["worker_pid"] = worker_pid trace_events = [] diff --git a/python/probing/ext/slime.py b/python/probing/ext/slime.py new file mode 100644 index 00000000..5b7bce21 --- /dev/null +++ b/python/probing/ext/slime.py @@ -0,0 +1,75 @@ +"""Slime framework adapter for Probing-RL. + +Maps Slime-specific process identity (env vars, Ray actor cmdlines) onto +framework-neutral agentic-RL roles consumed by the Web UI and ``python.ray_process``. + +Generic code must not import Slime class names; call into this module instead. +""" + +from __future__ import annotations + +import os +from typing import Optional, Tuple + +# (cmdline needle, neutral role). Order matters: first match wins. +# Needles are Slime / SGLang actor class names and entrypoints only. +_CMDLINE_MARKERS: Tuple[Tuple[str, str], ...] = ( + ("RolloutManager.generate", "rollout_actor"), + ("MegatronTrainRayActor.train", "train_actor"), + ("SGLangEngine", "inference_engine"), + ("sglang.launch_server", "inference_engine"), + ("train_async.py", "driver"), +) + + +def apply_env_bridge() -> None: + """Copy Slime env vars into generic Probing identity keys. + + Safe to call multiple times. Does not overwrite explicit ``PROBING_*`` values. + After this runs, callers should only read ``PROBING_*`` / ``POD_IP`` / ``RAY_NODE_IP``. + """ + + if not os.environ.get("PROBING_RAY_PROCESS_ROLE") and os.environ.get("SLIME_PROBING_ROLE"): + os.environ["PROBING_RAY_PROCESS_ROLE"] = os.environ["SLIME_PROBING_ROLE"] + + if not os.environ.get("PROBING_NODE_IP") and os.environ.get("SLIME_NODE_IP"): + os.environ["PROBING_NODE_IP"] = os.environ["SLIME_NODE_IP"] + + +def infer_role_from_cmdline(cmd: str) -> Optional[str]: + """Infer a neutral process role from a Slime/Ray actor cmdline.""" + + if not cmd: + return None + for needle, role in _CMDLINE_MARKERS: + if needle in cmd: + return role + return None + + +def resolve_process_role(*, cmdline: Optional[str] = None, default: str = "") -> str: + """Resolve process role: bridge Slime env → read ``PROBING_*`` → cmdline → default.""" + + apply_env_bridge() + role = ( + os.environ.get("PROBING_RAY_PROCESS_ROLE", "").strip() + or os.environ.get("PROBING_PROCESS_ROLE", "").strip() + ) + if role: + return role + if cmdline: + inferred = infer_role_from_cmdline(cmdline) + if inferred: + return inferred + return default + + +def resolve_node_ip() -> str: + """Resolve node IP after bridging Slime → generic keys.""" + + apply_env_bridge() + return ( + os.environ.get("PROBING_NODE_IP", "").strip() + or os.environ.get("POD_IP", "").strip() + or os.environ.get("RAY_NODE_IP", "").strip() + ) diff --git a/python/probing/ext/torch.py b/python/probing/ext/torch.py index 60a66a29..964b35e8 100644 --- a/python/probing/ext/torch.py +++ b/python/probing/ext/torch.py @@ -63,11 +63,19 @@ def optimizer_step_post_hook(optimizer, *args, **kwargs): config.exprs or "", ) - models = get_toplevel_module() - for model in models: - install_hooks(model, tracer=tracer, backward=config.backward) - install_hooks(opt=optimizer, tracer=tracer, backward=config.backward) - hooks[optimizer] = tracer + try: + models = get_toplevel_module() + for model in models: + install_hooks(model, tracer=tracer, backward=config.backward) + install_hooks(opt=optimizer, tracer=tracer, backward=config.backward) + hooks[optimizer] = tracer + except ReferenceError as exc: + logging.getLogger(__name__).warning( + "Skip torch profiling hook install because a weak reference expired: %s", + exc, + ) + hooks[optimizer] = None + return def collective_hook(): diff --git a/python/probing/handlers/pythonext.py b/python/probing/handlers/pythonext.py index 91373bdf..5dc57345 100644 --- a/python/probing/handlers/pythonext.py +++ b/python/probing/handlers/pythonext.py @@ -651,6 +651,122 @@ def extensions_list_api() -> str: return vendor_extensions_json() +@ext_handler( + "pythonext", + [ + "engines/register", + "pythonext/engines/register", + ], +) +def register_inference_engine( + router_addr: str, + engine_id: str = "inference-engine", + engine_type: str = "sglang", + framework: str = "agentic-rl", + metrics_path: str = "/metrics", +) -> str: + """Register an inference engine metrics endpoint.""" + from probing.ext.engines import register_engine, scrape_engine + + registration = register_engine( + router_addr=router_addr, + engine_id=engine_id, + engine_type=engine_type, + framework=framework, + metrics_path=metrics_path, + ) + snapshot = scrape_engine(registration) + return json.dumps( + { + "engine": registration.to_dict(), + "snapshot": snapshot, + } + ) + + +@ext_handler( + "pythonext", + [ + "engines/register_slime", + "pythonext/engines/register_slime", + ], +) +def register_slime_inference_engine( + router_addr: str, + engine_id: str = "sglang-router", + framework: str = "slime", +) -> str: + """Register Slime router metrics for SGLang scraping (slime adapter).""" + from probing.ext.engines import register_slime_sglang_router, scrape_engine + + registration = register_slime_sglang_router( + router_addr, + engine_id=engine_id, + framework=framework, + ) + if registration is None: + return json.dumps({"error": "router_addr is required"}) + snapshot = scrape_engine(registration) + return json.dumps( + { + "engine": registration.to_dict(), + "snapshot": snapshot, + } + ) + + +@ext_handler( + "pythonext", + [ + "engines/list", + "pythonext/engines/list", + ], +) +def list_inference_engines() -> str: + from probing.ext.engines import list_engines + + return json.dumps({"engines": [engine.to_dict() for engine in list_engines()]}) + + +@ext_handler( + "pythonext", + [ + "engines/scrape", + "pythonext/engines/scrape", + ], +) +def scrape_inference_engines(engine_id: Optional[str] = None) -> str: + from probing.ext.engines import scrape_all, scrape_engine + from probing.ext.engines.registry import get_engine + + if engine_id: + registration = get_engine(engine_id) + if registration is None: + return json.dumps({"error": f"engine not found: {engine_id}"}) + return json.dumps({"results": [scrape_engine(registration)]}) + return json.dumps({"results": scrape_all()}) + + +@ext_handler( + "pythonext", + [ + "engines/snapshot", + "pythonext/engines/snapshot", + ], +) +def inference_engine_snapshot(engine_id: Optional[str] = None) -> str: + from probing.ext.engines import list_engines + + engines = list_engines() + if engine_id: + engines = [engine for engine in engines if engine.engine_id == engine_id] + return json.dumps( + { + "engines": [engine.to_dict() for engine in engines], + } + ) + + @ext_handler("pythonext", "crash/hold") def crash_hold() -> str: """Extend grace hold for post-crash debugging.""" diff --git a/python/probing/handlers/router.py b/python/probing/handlers/router.py index 25a2e5ec..b433e7de 100644 --- a/python/probing/handlers/router.py +++ b/python/probing/handlers/router.py @@ -56,6 +56,18 @@ def _parse_param(value: str, param_type: str) -> Any: return value +def _infer_param_defaults(func: Callable) -> Dict[str, Any]: + """Infer default parameter values from function signature.""" + sig = inspect.signature(func) + defaults: Dict[str, Any] = {} + for param_name, param in sig.parameters.items(): + if param_name == "self": + continue + if param.default != inspect.Parameter.empty: + defaults[param_name] = param.default + return defaults + + def _parse_params( params: Dict[str, str], handler_info: Dict[str, Any] ) -> Tuple[Dict[str, Any], Optional[str]]: @@ -110,6 +122,7 @@ def _parse_params( parsed = {} required_params = handler_info.get("required_params", []) param_types = handler_info.get("param_types", {}) + param_defaults = handler_info.get("param_defaults", {}) # Check required parameters for param_name in required_params: @@ -124,9 +137,11 @@ def _parse_params( except (ValueError, TypeError) as e: return {}, f"Invalid parameter '{param_name}': {str(e)}" elif param_type in ("optional_string", "optional_int", "optional_i64"): - parsed[param_name] = None + parsed[param_name] = param_defaults.get(param_name) elif param_name in required_params: return {}, f"Missing required parameter: {param_name}" + elif param_name in param_defaults: + parsed[param_name] = param_defaults[param_name] return parsed, None @@ -358,6 +373,7 @@ def decorator(func: Callable) -> Callable: # Auto-infer parameter types and required params param_types = _infer_param_types(func) + param_defaults = _infer_param_defaults(func) required = required_params or _infer_required_params(func) # Register handler @@ -365,6 +381,7 @@ def decorator(func: Callable) -> Callable: "function": func, "required_params": required, "param_types": param_types, + "param_defaults": param_defaults, "uses_body": uses_body, "ext_name": ext_name, } diff --git a/python/probing/profiling/torch/module_utils.py b/python/probing/profiling/torch/module_utils.py index 658af899..fe066623 100644 --- a/python/probing/profiling/torch/module_utils.py +++ b/python/probing/profiling/torch/module_utils.py @@ -98,9 +98,20 @@ def get_toplevel_module(): # noise is not about our modules — silence it just for this scan. with warnings.catch_warnings(): warnings.simplefilter("ignore", FutureWarning) - objs = [obj for obj in gc.get_objects() if isinstance(obj, torch.nn.Module)] + objs = [] + for obj in gc.get_objects(): + try: + if isinstance(obj, torch.nn.Module): + objs.append(obj) + except ReferenceError: + # Some distributed/runtime objects are weak proxies that can expire + # while gc is being scanned. They are not usable modules, so skip. + continue is_child = set() for obj in objs: - for child in obj.children(): - is_child.add(id(child)) + try: + for child in obj.children(): + is_child.add(id(child)) + except ReferenceError: + continue return [obj for obj in objs if id(obj) not in is_child] diff --git a/python/probing/rl.py b/python/probing/rl.py new file mode 100644 index 00000000..750e4f12 --- /dev/null +++ b/python/probing/rl.py @@ -0,0 +1,198 @@ +"""RL-oriented tracing helpers. + +This module keeps the public API small and framework-neutral. It records RL +semantics as regular probing span attributes so existing Ray/process tracing, +queries, and Chrome tracing export continue to work. +""" + +from __future__ import annotations + +import contextvars +from contextlib import asynccontextmanager, contextmanager +from typing import Any, Callable, Optional + +from probing.tracing import event as probing_event +from probing.tracing import span as probing_span + +STANDARD_ATTRS = ( + "run_id", + "framework", + "algorithm", + "rollout_id", + "step_id", + "sample_id", + "trajectory_id", + "group_id", + "attempt", + "turn_id", + "env_step_id", + "phase", + "actor_role", + "batch_id", +) + +_current_context = contextvars.ContextVar("probing_rl_context", default={}) + + +def current_context() -> dict[str, Any]: + """Return the active RL trace context for this Python context.""" + + return dict(_current_context.get() or {}) + + +def normalize_attrs(**attrs: Any) -> dict[str, Any]: + """Normalize common aliases and drop ``None`` values.""" + + normalized = {key: value for key, value in attrs.items() if value is not None} + if "trajectory_id" not in normalized and "sample_id" in normalized: + normalized["trajectory_id"] = normalized["sample_id"] + if "sample_id" not in normalized and "trajectory_id" in normalized: + normalized["sample_id"] = normalized["trajectory_id"] + return normalized + + +def merge_context(**attrs: Any) -> dict[str, Any]: + """Merge active RL context with explicit attributes. + + Explicit attributes win over context values. The result is suitable for + passing directly to ``probing.span``. + """ + + merged = current_context() + merged.update(normalize_attrs(**attrs)) + return {key: value for key, value in merged.items() if value is not None} + + +@contextmanager +def context(**attrs: Any): + """Temporarily attach RL identity attributes to nested spans/events.""" + + merged = merge_context(**attrs) + token = _current_context.set(merged) + try: + yield merged + finally: + _current_context.reset(token) + + +@contextmanager +def span(name: str, *, phase: Optional[str] = None, kind: str = "rl.phase", **attrs: Any): + """Record an RL span with standard rollout/sample attributes.""" + + merged = merge_context(**attrs) + span_phase = phase if phase is not None else kind + if phase is not None: + merged["phase"] = phase + else: + merged.setdefault("phase", name) + with probing_span(name, phase=span_phase, **merged) as active_span: + yield active_span + + +@asynccontextmanager +async def async_span( + name: str, + *, + phase: Optional[str] = None, + kind: str = "rl.phase", + **attrs: Any, +): + """Async variant of :func:`span` for asyncio-heavy rollout code.""" + + with span(name, phase=phase, kind=kind, **attrs) as active_span: + yield active_span + + +def event(name: str, *, phase: Optional[str] = None, **attrs: Any) -> None: + """Record an instant RL event on the current probing span.""" + + merged = merge_context(**attrs) + if phase is not None: + merged["phase"] = phase + probing_event(name, attributes=[merged] if merged else None) + + +def bind(**attrs: Any) -> dict[str, Any]: + """Build a normalized context carrier that can be sent across Ray calls.""" + + return normalize_attrs(**attrs) + + +def export_context(**attrs: Any) -> dict[str, Any]: + """Export the active RL context plus optional overrides.""" + + return merge_context(**attrs) + + +def import_context(carrier: Optional[dict[str, Any]] = None, **attrs: Any) -> dict[str, Any]: + """Normalize a received carrier before using it with :func:`context`.""" + + merged = dict(carrier or {}) + merged.update(attrs) + return normalize_attrs(**merged) + + +def decorator( + name: str, + *, + target_getter: Optional[Callable[..., dict[str, Any]]] = None, + attrs_getter: Optional[Callable[..., dict[str, Any]]] = None, + phase: Optional[str] = None, + kind: str = "rl.phase", +): + """Decorate sync or async functions with an RL span. + + ``target_getter`` is intended for framework adapters that can extract a + sample/trajectory context from function arguments without hardcoding a + specific RL framework into probing itself. + """ + + import functools + import inspect + + def wrap(fn): + def build_attrs(args, kwargs): + merged = {} + if target_getter is not None: + target_attrs = target_getter(*args, **kwargs) + if target_attrs: + merged.update(target_attrs) + if attrs_getter is not None: + extra_attrs = attrs_getter(*args, **kwargs) + if extra_attrs: + merged.update(extra_attrs) + return merged + + if inspect.iscoroutinefunction(fn): + + @functools.wraps(fn) + async def async_wrapper(*args, **kwargs): + with span(name, phase=phase, kind=kind, **build_attrs(args, kwargs)): + return await fn(*args, **kwargs) + + return async_wrapper + + @functools.wraps(fn) + def sync_wrapper(*args, **kwargs): + with span(name, phase=phase, kind=kind, **build_attrs(args, kwargs)): + return fn(*args, **kwargs) + + return sync_wrapper + + return wrap + + +__all__ = [ + "STANDARD_ATTRS", + "async_span", + "bind", + "context", + "current_context", + "decorator", + "event", + "export_context", + "import_context", + "merge_context", + "normalize_attrs", + "span", +] diff --git a/python/probing/tracing/__init__.py b/python/probing/tracing/__init__.py index 81e4206e..264b6650 100644 --- a/python/probing/tracing/__init__.py +++ b/python/probing/tracing/__init__.py @@ -27,7 +27,7 @@ phase, reset_phase, ) -from probing.tracing.span import event, record_span, span +from probing.tracing.span import add_span_attribute_provider, event, record_span, span from probing.tracing.table import SPANS_SQL, TraceEvent bind_table(TraceEvent) @@ -46,6 +46,7 @@ "attach_training_phases", "detach_training_phases", "owns_training_phases", + "add_span_attribute_provider", "FORWARD", "BACKWARD", "OPTIMIZER", diff --git a/python/probing/tracing/span.py b/python/probing/tracing/span.py index 3fa9f2d3..c37c35cb 100644 --- a/python/probing/tracing/span.py +++ b/python/probing/tracing/span.py @@ -24,6 +24,7 @@ # Rust Span cannot hold arbitrary Python attrs; track deferred persistence by id. _DEFERRED: dict[int, "_DeferredState"] = {} +_span_attribute_providers: list[Callable[[], dict]] = [] @dataclass @@ -32,6 +33,24 @@ class _DeferredState: start_persisted: bool = False +def add_span_attribute_provider(provider: Callable[[], dict]) -> None: + """Register a runtime provider for attributes attached to every new span.""" + if provider not in _span_attribute_providers: + _span_attribute_providers.append(provider) + + +def _provider_attrs() -> dict: + merged: dict = {} + for provider in list(_span_attribute_providers): + try: + provided = provider() + if provided: + merged.update(provided) + except Exception as exc: + warnings.warn(f"Span attribute provider failed: {exc}") + return merged + + def _recorder(): from probing.tracing.backends import get_recorder @@ -100,8 +119,10 @@ def __enter__(self) -> Span: location = _caller_location() self._persist = _persistence_enabled() + merged_attrs = dict(_provider_attrs()) + merged_attrs.update(self.attrs) self._merged = ( - span_attrs(self.attrs, source=self.source) if self._persist else {} + span_attrs(merged_attrs, source=self.source) if self._persist else {} ) span_obj = _spawn_span(self.name, self.phase, location=location) @@ -202,6 +223,10 @@ def _parse_span_kwargs( kwargs: dict, ) -> tuple[Optional[str], str, Optional[str], dict, bool]: phase = kwargs.pop("phase", None) + # Backward-compatible alias used by older RL helpers. + kind = kwargs.pop("kind", None) + if phase is None and kind is not None: + phase = kind source = kwargs.pop("source", "manual") location = kwargs.pop("location", None) auto_location = location is None and _location_enabled() diff --git a/tests/ext/conftest.py b/tests/ext/conftest.py new file mode 100644 index 00000000..f9eb24b5 --- /dev/null +++ b/tests/ext/conftest.py @@ -0,0 +1,74 @@ +"""Fixtures for extension tests that should run without a built Rust wheel.""" + +from __future__ import annotations + +import sys +import types +from unittest.mock import MagicMock + + +class _FakeExternalTable: + _tables: dict[str, "_FakeExternalTable"] = {} + + def __init__(self, name: str, fields: list[str]): + self.name = name + self._fields = list(fields) + self._rows: list[tuple] = [] + + @classmethod + def get(cls, name: str) -> "_FakeExternalTable": + if name not in cls._tables: + raise KeyError(name) + return cls._tables[name] + + @classmethod + def get_or_create(cls, name: str, fields: list[str]) -> "_FakeExternalTable": + table = cls._tables.get(name) + if table is None: + table = cls(name, fields) + cls._tables[name] = table + return table + + @classmethod + def drop(cls, name: str) -> None: + cls._tables.pop(name, None) + + def append(self, row: tuple) -> None: + self._rows.append(row) + + def append_many(self, rows: list[tuple]) -> None: + self._rows.extend(rows) + + def take(self, n: int) -> list[tuple]: + return self._rows[:n] + + def names(self) -> list[str]: + return list(self._fields) + + +def _install_probing_core_stub() -> None: + if "probing._core" in sys.modules: + return + + fake_core = types.ModuleType("probing._core") + fake_core.ExternalTable = _FakeExternalTable + fake_core.TCPStore = MagicMock + fake_core.cli_main = MagicMock() + fake_core.enable_tracer = MagicMock() + fake_core.disable_tracer = MagicMock() + fake_core.is_enabled = MagicMock(return_value=True) + fake_core.config_get = MagicMock(return_value=None) + fake_core.config_get_str = MagicMock(return_value=None) + fake_core.config_set = MagicMock() + fake_core.config_contains_key = MagicMock(return_value=False) + fake_core.config_remove = MagicMock() + fake_core.config_keys = MagicMock(return_value=[]) + fake_core.config_clear = MagicMock() + fake_core.config_len = MagicMock(return_value=0) + fake_core.config_is_empty = MagicMock(return_value=True) + fake_core._get_python_stacks = MagicMock(return_value=[]) + fake_core._get_python_frames = MagicMock(return_value=[]) + sys.modules["probing._core"] = fake_core + + +_install_probing_core_stub() diff --git a/tests/ext/test_rl_tracing.py b/tests/ext/test_rl_tracing.py new file mode 100644 index 00000000..be0a38d5 --- /dev/null +++ b/tests/ext/test_rl_tracing.py @@ -0,0 +1,51 @@ +import asyncio + +import probing + + +def test_rl_context_normalizes_sample_and_trajectory_aliases(): + attrs = probing.rl.normalize_attrs(rollout_id=3, sample_id="s1") + + assert attrs["sample_id"] == "s1" + assert attrs["trajectory_id"] == "s1" + assert attrs["rollout_id"] == 3 + + +def test_rl_span_merges_context_and_sets_phase(): + with probing.rl.context(run_id="run-a", rollout_id=1, sample_id="sample-a"): + with probing.rl.span("inference", phase="inference.decode") as span: + attrs = span.get_attributes() + + assert attrs["run_id"] == "run-a" + assert attrs["rollout_id"] == 1 + assert attrs["sample_id"] == "sample-a" + assert attrs["trajectory_id"] == "sample-a" + assert attrs["phase"] == "inference.decode" + + +def test_rl_context_export_import_round_trip(): + with probing.rl.context(framework="slime", rollout_id=2, trajectory_id="traj-2"): + carrier = probing.rl.export_context(turn_id=4) + + imported = probing.rl.import_context(carrier, env_step_id=1) + + assert imported["framework"] == "slime" + assert imported["rollout_id"] == 2 + assert imported["sample_id"] == "traj-2" + assert imported["trajectory_id"] == "traj-2" + assert imported["turn_id"] == 4 + assert imported["env_step_id"] == 1 + + +def test_rl_async_span_keeps_contextvars_context(): + async def run(): + with probing.rl.context(rollout_id=5, sample_id="async-sample"): + async with probing.rl.async_span("env.step", phase="env.step") as span: + await asyncio.sleep(0) + return span.get_attributes() + + attrs = asyncio.run(run()) + + assert attrs["rollout_id"] == 5 + assert attrs["sample_id"] == "async-sample" + assert attrs["phase"] == "env.step" diff --git a/tests/ext/test_sglang_real_engine.py b/tests/ext/test_sglang_real_engine.py new file mode 100644 index 00000000..758b5b55 --- /dev/null +++ b/tests/ext/test_sglang_real_engine.py @@ -0,0 +1,76 @@ +"""Integration test against a real ``sglang.launch_server`` with ``--enable-metrics``. + +Skipped automatically when no server is reachable at ``SGLANG_ENGINE_URL`` +(default ``http://127.0.0.1:30000``). +""" + +from __future__ import annotations + +import os +import urllib.error +import urllib.request + +import pytest + +from probing.ext.engines.mock_sglang_server import send_dummy_generate_requests +from probing.ext.engines.registry import get_engine, register_engine, unregister_engine +from probing.ext.engines.sglang import LAUNCH_SERVER_METRICS_PATH +from probing.ext.engines.scraper import scrape_engine + +ENGINE_URL = os.environ.get("SGLANG_ENGINE_URL", "http://127.0.0.1:30000").rstrip("/") +ENGINE_ID = "sglang-real-test" + + +def _engine_reachable() -> bool: + try: + request = urllib.request.Request( + f"{ENGINE_URL}/metrics", + headers={"Accept": "text/plain"}, + ) + with urllib.request.urlopen(request, timeout=5) as response: + return 200 <= response.status < 500 + except (urllib.error.URLError, TimeoutError, OSError): + return False + + +@pytest.fixture(autouse=True) +def _cleanup_registry(): + unregister_engine(ENGINE_ID) + yield + unregister_engine(ENGINE_ID) + + +@pytest.mark.integration +@pytest.mark.skipif(not _engine_reachable(), reason=f"SGLang not reachable at {ENGINE_URL}") +def test_real_sglang_engine_metrics_scrape(): + registration = register_engine( + router_addr=ENGINE_URL, + engine_id=ENGINE_ID, + engine_type="sglang", + framework="standalone", + metrics_path=LAUNCH_SERVER_METRICS_PATH, + labels={"source": "real_sglang_test"}, + auto_scrape=False, + ) + + before = scrape_engine(registration) + assert before["scrape_error"] is None, before.get("scrape_error") + assert before["metrics_url"] == f"{ENGINE_URL}/metrics" + + responses = send_dummy_generate_requests( + ENGINE_URL, + count=2, + max_new_tokens=16, + ) + assert len(responses) == 2 + assert all("error" not in item for item in responses) + + after = scrape_engine(registration) + assert after["scrape_error"] is None, after.get("scrape_error") + normalized = after["normalized"] + assert normalized, "expected at least one normalized metric" + + stored = get_engine(ENGINE_ID) + assert stored is not None + assert stored.last_scrape_error is None + assert stored.last_normalized == normalized diff --git a/tests/regression/spec/api_spec.json b/tests/regression/spec/api_spec.json index 037911ce..f98b1e59 100644 --- a/tests/regression/spec/api_spec.json +++ b/tests/regression/spec/api_spec.json @@ -12,174 +12,347 @@ "cors": false }, "server_public": [ - { "method": "GET", "path": "/apis/overview" }, - { "method": "GET", "path": "/apis/files" }, - { "method": "GET", "path": "/apis/nodes" }, - { "method": "PUT", "path": "/apis/nodes" }, - { "method": "GET", "path": "/apis/training/step_matrix" }, - { "method": "GET", "path": "/apis/training/distributed_flamegraph/json" }, - { "method": "GET", "path": "/apis/training/distributed_stack_flamegraph/json" }, - { "method": "POST", "path": "/apis/cluster/query" } + { + "method": "GET", + "path": "/apis/overview" + }, + { + "method": "GET", + "path": "/apis/files" + }, + { + "method": "GET", + "path": "/apis/nodes" + }, + { + "method": "PUT", + "path": "/apis/nodes" + }, + { + "method": "GET", + "path": "/apis/training/step_matrix" + }, + { + "method": "GET", + "path": "/apis/training/distributed_flamegraph/json" + }, + { + "method": "GET", + "path": "/apis/training/distributed_stack_flamegraph/json" + }, + { + "method": "POST", + "path": "/apis/cluster/query" + }, + { + "method": "GET", + "path": "/apis/processes/local" + }, + { + "method": "POST", + "path": "/apis/query/local-pid" + } ], "top_level": [ - { "method": "GET", "path": "/health" }, - { "method": "GET", "path": "/ready" }, - { "method": "POST", "path": "/query" }, - { "method": "POST", "path": "/query/dto" }, - { "method": "GET", "path": "/config/{config_key}" }, - { "method": "GET", "path": "/ws" }, - { "method": "POST", "path": "/mcp" } + { + "method": "GET", + "path": "/health" + }, + { + "method": "GET", + "path": "/ready" + }, + { + "method": "POST", + "path": "/query" + }, + { + "method": "POST", + "path": "/query/dto" + }, + { + "method": "GET", + "path": "/config/{config_key}" + }, + { + "method": "GET", + "path": "/ws" + }, + { + "method": "POST", + "path": "/mcp" + } ], "pythonext_handlers": [ { "local_path": "callstack", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "eval", "method": "POST", "uses_body": true, - "response": { "content_type": "text/plain", "cors": false } + "response": { + "content_type": "text/plain", + "cors": false + } }, { "local_path": "trace/list", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "trace/show", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "trace/start", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "trace/stop", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "trace/variables", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "trace/chrome-tracing", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": true } + "response": { + "content_type": "application/json", + "cors": true + } }, { "local_path": "pytorch/timeline", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": true } + "response": { + "content_type": "application/json", + "cors": true + } }, { "local_path": "pytorch/profile", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "pytorch/profile/start", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "pytorch/profile/stop", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "pytorch/profile/status", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "ray/timeline", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": true } + "response": { + "content_type": "application/json", + "cors": true + } }, { "local_path": "ray/timeline/chrome", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": true } + "response": { + "content_type": "application/json", + "cors": true + } }, { "local_path": "magics", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "flight-recorder/snapshot", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "crash/hold", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "crash/release", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "skills/list", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "skills/load", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "skills/catalog", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "skills/routing", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "skills/roots", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "local_path": "extensions/list", "method": "GET", "uses_body": false, - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } + }, + { + "local_path": "engines/register", + "method": "GET", + "uses_body": false, + "response": { + "content_type": "application/json", + "cors": false + } + }, + { + "local_path": "engines/register_slime", + "method": "GET", + "uses_body": false, + "response": { + "content_type": "application/json", + "cors": false + } + }, + { + "local_path": "engines/list", + "method": "GET", + "uses_body": false, + "response": { + "content_type": "application/json", + "cors": false + } + }, + { + "local_path": "engines/scrape", + "method": "GET", + "uses_body": false, + "response": { + "content_type": "application/json", + "cors": false + } + }, + { + "local_path": "engines/snapshot", + "method": "GET", + "uses_body": false, + "response": { + "content_type": "application/json", + "cors": false + } } ], "other_extensions": [ @@ -188,49 +361,70 @@ "method": "GET", "path": "/apis/torchextension/flamegraph", "local_path": "flamegraph", - "response": { "content_type": "text/html", "cors": false } + "response": { + "content_type": "text/html", + "cors": false + } }, { "extension_name": "torchextension", "method": "GET", "path": "/apis/torchextension/flamegraph/json", "local_path": "flamegraph/json", - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "extension_name": "pprofextension", "method": "GET", "path": "/apis/pprofextension/flamegraph", "local_path": "flamegraph", - "response": { "content_type": "text/html", "cors": false } + "response": { + "content_type": "text/html", + "cors": false + } }, { "extension_name": "pprofextension", "method": "GET", "path": "/apis/pprofextension/flamegraph/json", "local_path": "flamegraph/json", - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "extension_name": "pprofextension", "method": "GET", "path": "/apis/pprofextension/flamegraph/folded/json", "local_path": "flamegraph/folded/json", - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "extension_name": "pprofextension", "method": "GET", "path": "/apis/pprofextension/flamegraph/distributed/json", "local_path": "flamegraph/distributed/json", - "response": { "content_type": "application/json", "cors": false } + "response": { + "content_type": "application/json", + "cors": false + } }, { "extension_name": "rdmaextension", "method": "POST", "path": "/apis/rdmaextension/", "local_path": "", - "response": { "content_type": "text/plain", "cors": false } + "response": { + "content_type": "text/plain", + "cors": false + } } ], "deprecated_paths": [ @@ -259,76 +453,150 @@ "web": [ { "source": "web/src/api/dashboard.rs", - "calls": [{ "method": "GET", "path": "/apis/overview" }] + "calls": [ + { + "method": "GET", + "path": "/apis/overview" + } + ] }, { "source": "web/src/api/cluster.rs", "calls": [ - { "method": "GET", "path": "/apis/nodes" }, - { "method": "POST", "path": "/apis/cluster/query" } + { + "method": "GET", + "path": "/apis/nodes" + }, + { + "method": "POST", + "path": "/apis/cluster/query" + } ] }, { "source": "web/src/api/files.rs", - "calls": [{ "method": "GET", "path": "/apis/files" }] + "calls": [ + { + "method": "GET", + "path": "/apis/files" + } + ] }, { "source": "web/src/api/profiling.rs", "calls": [ - { "method": "GET", "path": "/apis/torchextension/flamegraph/json" }, - { "method": "GET", "path": "/apis/pprofextension/flamegraph/json" } + { + "method": "GET", + "path": "/apis/torchextension/flamegraph/json" + }, + { + "method": "GET", + "path": "/apis/pprofextension/flamegraph/json" + } ] }, { "source": "web/src/api/stack.rs", "calls": [ - { "method": "GET", "path": "/apis/pythonext/callstack" }, - { "method": "GET", "path": "/apis/training/distributed_stack_flamegraph/json" } + { + "method": "GET", + "path": "/apis/pythonext/callstack" + }, + { + "method": "GET", + "path": "/apis/training/distributed_stack_flamegraph/json" + } ] }, { "source": "web/src/api/trace.rs", "calls": [ - { "method": "GET", "path": "/apis/pythonext/trace/list" }, - { "method": "GET", "path": "/apis/pythonext/trace/show" }, - { "method": "GET", "path": "/apis/pythonext/trace/start" }, - { "method": "GET", "path": "/apis/pythonext/trace/stop" } + { + "method": "GET", + "path": "/apis/pythonext/trace/list" + }, + { + "method": "GET", + "path": "/apis/pythonext/trace/show" + }, + { + "method": "GET", + "path": "/apis/pythonext/trace/start" + }, + { + "method": "GET", + "path": "/apis/pythonext/trace/stop" + } ] }, { "source": "web/src/api/pytorch.rs", "calls": [ - { "method": "GET", "path": "/apis/pythonext/pytorch/timeline" }, - { "method": "GET", "path": "/apis/pythonext/pytorch/profile" } + { + "method": "GET", + "path": "/apis/pythonext/pytorch/timeline" + }, + { + "method": "GET", + "path": "/apis/pythonext/pytorch/profile" + } ] }, { "source": "web/src/api/traces.rs", "calls": [ - { "method": "GET", "path": "/apis/pythonext/ray/timeline" }, - { "method": "GET", "path": "/apis/pythonext/ray/timeline/chrome" } + { + "method": "GET", + "path": "/apis/pythonext/ray/timeline" + }, + { + "method": "GET", + "path": "/apis/pythonext/ray/timeline/chrome" + } ] }, { "source": "web/src/api/repl.rs", "calls": [ - { "method": "GET", "path": "/apis/pythonext/magics" }, - { "method": "POST", "path": "/apis/pythonext/eval" } + { + "method": "GET", + "path": "/apis/pythonext/magics" + }, + { + "method": "POST", + "path": "/apis/pythonext/eval" + } ] }, { "source": "web/src/api/training.rs", - "calls": [{ "method": "GET", "path": "/apis/training/step_matrix" }] + "calls": [ + { + "method": "GET", + "path": "/apis/training/step_matrix" + } + ] }, { "source": "web/src/api/analytics.rs", - "calls": [{ "method": "POST", "path": "/query" }] + "calls": [ + { + "method": "POST", + "path": "/query" + } + ] }, { "source": "web/src/api/skills.rs", "calls": [ - { "method": "GET", "path": "/apis/pythonext/skills/routing" }, - { "method": "GET", "path": "/apis/pythonext/skills/load" } + { + "method": "GET", + "path": "/apis/pythonext/skills/routing" + }, + { + "method": "GET", + "path": "/apis/pythonext/skills/load" + } ] } ], @@ -336,26 +604,61 @@ { "source": "probing/cli/src/cli/cluster.rs", "calls": [ - { "method": "GET", "path": "/apis/nodes" }, - { "method": "POST", "path": "/apis/cluster/query" } + { + "method": "GET", + "path": "/apis/nodes" + }, + { + "method": "POST", + "path": "/apis/cluster/query" + } ] }, { "source": "probing/cli/src/cli/ctrl.rs", "calls": [ - { "method": "GET", "path": "/apis/pythonext/callstack" }, - { "method": "POST", "path": "/apis/pythonext/eval" }, - { "method": "POST", "path": "/apis/rdmaextension/" }, - { "method": "POST", "path": "/query" }, - { "method": "GET", "path": "/apis/torchextension/flamegraph" }, - { "method": "GET", "path": "/apis/torchextension/flamegraph/json" }, - { "method": "GET", "path": "/apis/pprofextension/flamegraph" }, - { "method": "GET", "path": "/apis/pprofextension/flamegraph/json" } + { + "method": "GET", + "path": "/apis/pythonext/callstack" + }, + { + "method": "POST", + "path": "/apis/pythonext/eval" + }, + { + "method": "POST", + "path": "/apis/rdmaextension/" + }, + { + "method": "POST", + "path": "/query" + }, + { + "method": "GET", + "path": "/apis/torchextension/flamegraph" + }, + { + "method": "GET", + "path": "/apis/torchextension/flamegraph/json" + }, + { + "method": "GET", + "path": "/apis/pprofextension/flamegraph" + }, + { + "method": "GET", + "path": "/apis/pprofextension/flamegraph/json" + } ] }, { "source": "probing/cli/src/cli/repl.rs", - "calls": [{ "method": "GET", "path": "/ws" }] + "calls": [ + { + "method": "GET", + "path": "/ws" + } + ] } ] } diff --git a/tests/unit/probing/ext/test_slime.py b/tests/unit/probing/ext/test_slime.py new file mode 100644 index 00000000..821e2d2c --- /dev/null +++ b/tests/unit/probing/ext/test_slime.py @@ -0,0 +1,91 @@ +"""Unit tests for the Slime process-role adapter. + +Loads ``slime.py`` directly so this suite stays free of ``probing._core``. +""" + +from __future__ import annotations + +import importlib.util +import os +import sys +from pathlib import Path + +import pytest + +_SLIME_PATH = ( + Path(__file__).resolve().parents[4] / "python" / "probing" / "ext" / "slime.py" +) + + +def _load_slime(): + spec = importlib.util.spec_from_file_location("probing_ext_slime", _SLIME_PATH) + assert spec is not None and spec.loader is not None + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + return module + + +slime = _load_slime() + + +@pytest.fixture(autouse=True) +def _clear_role_env(monkeypatch): + for key in ( + "PROBING_RAY_PROCESS_ROLE", + "PROBING_PROCESS_ROLE", + "PROBING_NODE_IP", + "SLIME_PROBING_ROLE", + "SLIME_NODE_IP", + "POD_IP", + "RAY_NODE_IP", + ): + monkeypatch.delenv(key, raising=False) + yield + + +def test_infer_role_from_slime_cmdline_markers(): + assert ( + slime.infer_role_from_cmdline("ray::RolloutManager.generate") == "rollout_actor" + ) + assert ( + slime.infer_role_from_cmdline("ray::MegatronTrainRayActor.train") == "train_actor" + ) + assert slime.infer_role_from_cmdline("ray::SGLangEngine") == "inference_engine" + assert slime.infer_role_from_cmdline("python train_async.py") == "driver" + assert slime.infer_role_from_cmdline("python my_job.py") is None + + +def test_apply_env_bridge_maps_slime_to_probing(monkeypatch): + monkeypatch.setenv("SLIME_PROBING_ROLE", "rollout") + monkeypatch.setenv("SLIME_NODE_IP", "10.0.0.1") + slime.apply_env_bridge() + assert os.environ["PROBING_RAY_PROCESS_ROLE"] == "rollout" + assert os.environ["PROBING_NODE_IP"] == "10.0.0.1" + + +def test_apply_env_bridge_does_not_overwrite_explicit_probing(monkeypatch): + monkeypatch.setenv("PROBING_RAY_PROCESS_ROLE", "driver") + monkeypatch.setenv("SLIME_PROBING_ROLE", "rollout") + slime.apply_env_bridge() + assert os.environ["PROBING_RAY_PROCESS_ROLE"] == "driver" + + +def test_resolve_process_role_prefers_env_over_cmdline(monkeypatch): + monkeypatch.setenv("SLIME_PROBING_ROLE", "rollout") + assert ( + slime.resolve_process_role(cmdline="ray::MegatronTrainRayActor.train") + == "rollout" + ) + + +def test_resolve_process_role_falls_back_to_cmdline(): + assert ( + slime.resolve_process_role(cmdline="ray::RolloutManager.generate") + == "rollout_actor" + ) + + +def test_resolve_node_ip_after_bridge(monkeypatch): + monkeypatch.setenv("SLIME_NODE_IP", "10.0.0.2") + assert slime.resolve_node_ip() == "10.0.0.2" diff --git a/tests/unit/probing/handlers/test_python_handlers.py b/tests/unit/probing/handlers/test_python_handlers.py index 370fcbe2..b2d6a988 100644 --- a/tests/unit/probing/handlers/test_python_handlers.py +++ b/tests/unit/probing/handlers/test_python_handlers.py @@ -120,6 +120,30 @@ def test_handler( assert parsed2["required"] == "test" assert parsed2["optional"] is None + def test_optional_parameter_uses_function_default(self): + """Optional query params should fall back to handler defaults.""" + + @ext_handler("test", "test/defaults") + def test_handler( + required: str, + engine_type: str = "sglang", + metrics_path: str = "/engine_metrics", + count: int = 10, + ) -> str: + return json.dumps( + { + "required": required, + "engine_type": engine_type, + "metrics_path": metrics_path, + "count": count, + } + ) + + parsed = json.loads(handle_request("test/defaults", {"required": "ok"})) + assert parsed["engine_type"] == "sglang" + assert parsed["metrics_path"] == "/engine_metrics" + assert parsed["count"] == 10 + class TestUnifiedEntryPoint: """Test the unified entry point.""" diff --git a/web/assets/tailwind.css b/web/assets/tailwind.css index 74d36fed..06bbdaba 100644 --- a/web/assets/tailwind.css +++ b/web/assets/tailwind.css @@ -836,6 +836,10 @@ video { bottom: 0px; } +.bottom-1 { + bottom: 0.25rem; +} + .bottom-1\/2 { bottom: 50%; } @@ -972,6 +976,10 @@ video { z-index: 1; } +.z-\[60\] { + z-index: 60; +} + .z-\[9996\] { z-index: 9996; } @@ -1052,6 +1060,10 @@ video { margin-left: 0.25rem; } +.ml-2 { + margin-left: 0.5rem; +} + .ml-3 { margin-left: 0.75rem; } @@ -1060,6 +1072,10 @@ video { margin-left: 1rem; } +.ml-6 { + margin-left: 1.5rem; +} + .ml-auto { margin-left: auto; } @@ -1136,6 +1152,10 @@ video { height: 0.125rem; } +.h-1 { + height: 0.25rem; +} + .h-1\.5 { height: 0.375rem; } @@ -1324,6 +1344,10 @@ video { min-height: 600px; } +.min-h-\[680px\] { + min-height: 680px; +} + .min-h-\[calc\(100vh-11rem\)\] { min-height: calc(100vh - 11rem); } @@ -1348,6 +1372,10 @@ video { width: 2.75rem; } +.w-16 { + width: 4rem; +} + .w-2 { width: 0.5rem; } @@ -1376,6 +1404,14 @@ video { width: 1rem; } +.w-40 { + width: 10rem; +} + +.w-44 { + width: 11rem; +} + .w-5 { width: 1.25rem; } @@ -1432,6 +1468,10 @@ video { min-width: 0px; } +.min-w-\[100px\] { + min-width: 100px; +} + .min-w-\[140px\] { min-width: 140px; } @@ -1501,6 +1541,10 @@ video { max-width: 10rem; } +.max-w-\[1400px\] { + max-width: 1400px; +} + .max-w-\[14rem\] { max-width: 14rem; } @@ -1509,6 +1553,14 @@ video { max-width: 16rem; } +.max-w-\[320px\] { + max-width: 320px; +} + +.max-w-\[360px\] { + max-width: 360px; +} + .max-w-\[480px\] { max-width: 480px; } @@ -1649,6 +1701,10 @@ video { cursor: not-allowed; } +.cursor-ns-resize { + cursor: ns-resize; +} + .cursor-pointer { cursor: pointer; } @@ -1683,6 +1739,22 @@ video { grid-template-columns: repeat(2, minmax(0, 1fr)); } +.grid-cols-\[minmax\(180px\2c 22\%\)_130px_1fr\] { + grid-template-columns: minmax(180px,22%) 130px 1fr; +} + +.grid-cols-\[minmax\(180px\2c 22\%\)_130px_90px_90px_1fr\] { + grid-template-columns: minmax(180px,22%) 130px 90px 90px 1fr; +} + +.grid-cols-\[minmax\(220px\2c 34\%\)_1fr_auto\] { + grid-template-columns: minmax(220px,34%) 1fr auto; +} + +.grid-cols-\[minmax\(300px\2c 34\%\)_1fr_auto\] { + grid-template-columns: minmax(300px,34%) 1fr auto; +} + .flex-col { flex-direction: column; } @@ -1844,6 +1916,12 @@ video { margin-bottom: calc(1.25rem * var(--tw-space-y-reverse)); } +.space-y-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); +} + .divide-y > :not([hidden]) ~ :not([hidden]) { --tw-divide-y-reverse: 0; border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); @@ -3688,6 +3766,11 @@ video { background-color: rgb(249 115 22 / var(--tw-bg-opacity, 1)); } +.bg-pink-500 { + --tw-bg-opacity: 1; + background-color: rgb(236 72 153 / var(--tw-bg-opacity, 1)); +} + .bg-purple-100 { --tw-bg-opacity: 1; background-color: rgb(243 232 255 / var(--tw-bg-opacity, 1)); @@ -4934,6 +5017,10 @@ video { padding-bottom: 0.25rem; } +.pb-3 { + padding-bottom: 0.75rem; +} + .pb-4 { padding-bottom: 1rem; } @@ -4946,6 +5033,10 @@ video { padding-left: 0.5rem; } +.pl-4 { + padding-left: 1rem; +} + .pl-5 { padding-left: 1.25rem; } @@ -5374,6 +5465,11 @@ video { color: rgb(234 88 12 / var(--tw-text-opacity, 1)); } +.text-orange-700 { + --tw-text-opacity: 1; + color: rgb(194 65 12 / var(--tw-text-opacity, 1)); +} + .text-orange-800 { --tw-text-opacity: 1; color: rgb(154 52 18 / var(--tw-text-opacity, 1)); @@ -5960,6 +6056,12 @@ video { filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } +.backdrop-blur { + --tw-backdrop-blur: blur(8px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + .backdrop-blur-md { --tw-backdrop-blur: blur(12px); -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); @@ -7268,6 +7370,11 @@ video { --tw-ring-offset-color: #854d0e; } +.active\:bg-gray-200:active { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); +} + .disabled\:pointer-events-none:disabled { pointer-events: none; } @@ -7284,10 +7391,20 @@ video { opacity: 0.5; } +.group:hover .group-hover\:bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1)); +} + .group:hover .group-hover\:opacity-100 { opacity: 1; } +.group:active .group-active\:bg-gray-500 { + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1)); +} + @media (min-width: 640px) { .sm\:col-span-2 { grid-column: span 2 / span 2; @@ -7364,6 +7481,10 @@ video { .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } + + .md\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } } @media (min-width: 1024px) { @@ -7401,6 +7522,10 @@ video { grid-column: span 2 / span 2; } + .xl\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .xl\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } diff --git a/web/src/agent/routing.rs b/web/src/agent/routing.rs index 0907ec20..88098924 100644 --- a/web/src/agent/routing.rs +++ b/web/src/agent/routing.rs @@ -45,6 +45,12 @@ pub fn page_id_for_route(route: &Route) -> String { Route::SpansPage {} | Route::TracesRedirect {} => "spans".into(), Route::PulsingPage {} => "pulsing".into(), Route::TrainingPage {} => "training".into(), + Route::RolloutPage {} => "rl/rollout".into(), + Route::TrainPage {} => "rl/train".into(), + Route::RlSpansPage {} => "rl/spans".into(), + Route::ProcessTimelinePage {} => "rl/process-timeline".into(), + Route::PerfettoPage {} => "rl/perfetto".into(), + Route::InferencePage {} => "rl/inference".into(), } } diff --git a/web/src/api/analytics.rs b/web/src/api/analytics.rs index 9fd13d7e..438f0ddb 100644 --- a/web/src/api/analytics.rs +++ b/web/src/api/analytics.rs @@ -6,6 +6,16 @@ use probing_proto::prelude::*; impl ApiClient { /// Execute SQL query pub async fn execute_query(&self, query: &str) -> Result { + self.execute_query_at_path("/query", query).await + } + + /// Execute SQL query against another local probing process via the current server. + pub async fn execute_query_local_pid(&self, pid: i32, query: &str) -> Result { + self.execute_query_at_path(&format!("/apis/query/local-pid?pid={pid}"), query) + .await + } + + async fn execute_query_at_path(&self, path: &str, query: &str) -> Result { let request = Message::new(Query { expr: query.to_string(), ..Default::default() @@ -14,7 +24,7 @@ impl ApiClient { let request_body = serde_json::to_string(&request) .map_err(|e| AppError::Api(format!("Failed to serialize request: {}", e)))?; - let response = self.post_request_with_body("/query", request_body).await?; + let response = self.post_request_with_body(path, request_body).await?; let msg: Message = Self::parse_json(&response)?; diff --git a/web/src/api/mod.rs b/web/src/api/mod.rs index 6a8ed922..d1f25d5c 100644 --- a/web/src/api/mod.rs +++ b/web/src/api/mod.rs @@ -93,6 +93,7 @@ mod profiling; mod pulsing; mod pytorch; mod repl; +mod rl; mod skills; mod stack; mod trace; @@ -120,6 +121,8 @@ pub use pytorch::*; #[allow(unused_imports)] pub use repl::*; #[allow(unused_imports)] +pub use rl::*; +#[allow(unused_imports)] pub use skills::*; #[allow(unused_imports)] pub use stack::*; diff --git a/web/src/api/rl.rs b/web/src/api/rl.rs new file mode 100644 index 00000000..7f25230b --- /dev/null +++ b/web/src/api/rl.rs @@ -0,0 +1,636 @@ +use super::traces::{EventInfo, SpanInfo, TraceEvent}; +use super::ApiClient; +use crate::utils::error::Result; +use probing_proto::prelude::{DataFrame, Ele, Process}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct TraceProcessInfo { + pub pid: i32, + pub process_role: Option, + pub hostname: Option, + pub ray_worker_id: Option, + pub ray_actor_id: Option, + pub ray_actor_name: Option, +} + +/// RL-specific tracing API (multi-process fan-out, rollout filters). +impl ApiClient { + /// Get all trace events for spans tagged with a rollout_id. + pub async fn get_trace_events_for_rollout_id(&self, rollout_id: &str) -> Result> { + let span_ids = self.get_span_ids_for_rollout_id(rollout_id).await?; + if span_ids.is_empty() { + return Ok(Vec::new()); + } + let query = trace_events_for_span_ids_query(&span_ids); + let df = self.execute_query(&query).await?; + Ok(trace_events_from_df(df)) + } + + async fn get_span_ids_for_rollout_id(&self, rollout_id: &str) -> Result> { + let query = span_ids_for_rollout_query(rollout_id); + let df = self.execute_query(&query).await?; + Ok(span_ids_from_df(df)) + } + + /// Get trace events from another local probing process. + pub async fn get_trace_events_for_pid( + &self, + pid: i32, + limit: Option, + ) -> Result> { + let query = trace_events_query(limit); + let df = self.execute_query_local_pid(pid, &query).await?; + Ok(trace_events_from_df(df)) + } + + /// Get all rollout-tagged trace events from another local probing process. + pub async fn get_trace_events_for_pid_and_rollout_id( + &self, + pid: i32, + rollout_id: &str, + ) -> Result> { + let span_ids = self + .get_span_ids_for_pid_and_rollout_id(pid, rollout_id) + .await?; + if span_ids.is_empty() { + return Ok(Vec::new()); + } + let query = trace_events_for_span_ids_query(&span_ids); + let df = self.execute_query_local_pid(pid, &query).await?; + Ok(trace_events_from_df(df)) + } + + async fn get_span_ids_for_pid_and_rollout_id( + &self, + pid: i32, + rollout_id: &str, + ) -> Result> { + let query = span_ids_for_rollout_query(rollout_id); + let df = self.execute_query_local_pid(pid, &query).await?; + Ok(span_ids_from_df(df)) + } + + /// Build span tree for a single rollout_id without applying an event limit. + pub async fn get_span_tree_for_rollout_id(&self, rollout_id: &str) -> Result> { + let events = self.get_trace_events_for_rollout_id(rollout_id).await?; + Ok(build_span_tree_from_events(events)) + } + + /// Build span tree from another local probing process. + pub async fn get_span_tree_for_pid( + &self, + pid: i32, + limit: Option, + ) -> Result> { + let events = self.get_trace_events_for_pid(pid, limit).await?; + Ok(build_span_tree_from_events(events)) + } + + /// Build span tree for a single rollout_id from another local probing process. + pub async fn get_span_tree_for_pid_and_rollout_id( + &self, + pid: i32, + rollout_id: &str, + ) -> Result> { + let events = self + .get_trace_events_for_pid_and_rollout_id(pid, rollout_id) + .await?; + Ok(build_span_tree_from_events(events)) + } + + /// List Ray/probing processes known to the current driver process. + pub async fn get_trace_processes(&self) -> Result> { + let query = r#" + SELECT + pid, + hostname, + ray_worker_id, + ray_actor_id, + ray_actor_name, + process_role + FROM python.ray_process + WHERE pid > 0 + ORDER BY pid ASC + "#; + let df = self.execute_query(query).await?; + let mut processes = trace_processes_from_df(df); + if let Ok(local_processes) = self.get_local_probing_processes().await { + merge_local_processes(&mut processes, local_processes); + } + processes.sort_by(|a, b| { + process_sort_rank(a) + .cmp(&process_sort_rank(b)) + .then_with(|| a.pid.cmp(&b.pid)) + }); + Ok(processes) + } + + /// List local processes exposing probing memtables. + pub async fn get_local_probing_processes(&self) -> Result> { + let response = self.get_request("/apis/processes/local").await?; + Self::parse_json(&response) + } +} + +fn trace_events_query(limit: Option) -> String { + let limit_clause = if let Some(limit) = limit { + format!("LIMIT {}", limit) + } else { + String::new() + }; + + format!( + r#" + SELECT + record_type, + trace_id, + span_id, + COALESCE(parent_id, -1) as parent_id, + name, + time AS timestamp, + COALESCE(thread_id, 0) as thread_id, + phase, + location, + attributes, + event_attributes + FROM python.trace_event + ORDER BY time DESC + {} + "#, + limit_clause + ) +} + +fn span_ids_for_rollout_query(rollout_id: &str) -> String { + let compact_numeric_comma = sql_string_literal(&format!("%\"rollout_id\":{},%", rollout_id)); + let compact_numeric_end = sql_string_literal(&format!("%\"rollout_id\":{}}}%", rollout_id)); + let spaced_numeric_comma = sql_string_literal(&format!("%\"rollout_id\": {},%", rollout_id)); + let spaced_numeric_end = sql_string_literal(&format!("%\"rollout_id\": {}}}%", rollout_id)); + let compact_string_comma = sql_string_literal(&format!("%\"rollout_id\":\"{}\",%", rollout_id)); + let compact_string_end = sql_string_literal(&format!("%\"rollout_id\":\"{}\"}}%", rollout_id)); + let spaced_string_comma = sql_string_literal(&format!("%\"rollout_id\": \"{}\",%", rollout_id)); + let spaced_string_end = sql_string_literal(&format!("%\"rollout_id\": \"{}\"}}%", rollout_id)); + + format!( + r#" + SELECT DISTINCT span_id + FROM python.trace_event + WHERE record_type = 'span_start' + AND ( + attributes LIKE {compact_numeric_comma} + OR attributes LIKE {compact_numeric_end} + OR attributes LIKE {spaced_numeric_comma} + OR attributes LIKE {spaced_numeric_end} + OR attributes LIKE {compact_string_comma} + OR attributes LIKE {compact_string_end} + OR attributes LIKE {spaced_string_comma} + OR attributes LIKE {spaced_string_end} + ) + ORDER BY span_id ASC + "# + ) +} + +fn trace_events_for_span_ids_query(span_ids: &[i64]) -> String { + let span_ids = span_ids + .iter() + .map(|span_id| span_id.to_string()) + .collect::>() + .join(", "); + + format!( + r#" + SELECT + record_type, + trace_id, + span_id, + COALESCE(parent_id, -1) as parent_id, + name, + time AS timestamp, + COALESCE(thread_id, 0) as thread_id, + phase, + location, + attributes, + event_attributes + FROM python.trace_event + WHERE span_id IN ({span_ids}) + ORDER BY time DESC + "# + ) +} + +fn sql_string_literal(value: &str) -> String { + format!("'{}'", value.replace('\'', "''")) +} + +fn span_ids_from_df(df: DataFrame) -> Vec { + if df.names.is_empty() || df.cols.is_empty() { + return Vec::new(); + } + + let span_id_idx = df.names.iter().position(|c| c == "span_id").unwrap_or(0); + let nrows = df.cols.iter().map(|col| col.len()).max().unwrap_or(0); + (0..nrows) + .filter_map(|row_idx| match df.cols.get(span_id_idx).map(|col| col.get(row_idx)) { + Some(Ele::I64(value)) => Some(value), + Some(Ele::I32(value)) => Some(value as i64), + Some(Ele::F32(value)) => Some(value as i64), + Some(Ele::F64(value)) => Some(value as i64), + Some(Ele::Text(value)) | Some(Ele::Url(value)) => value.parse::().ok(), + Some(Ele::DataTime(value)) => i64::try_from(value).ok(), + _ => None, + }) + .collect() +} + +fn trace_events_from_df(df: DataFrame) -> Vec { + let mut events = Vec::new(); + + if df.names.is_empty() || df.cols.is_empty() { + return events; + } + + let record_type_idx = df.names.iter().position(|c| c == "record_type").unwrap_or(0); + let trace_id_idx = df.names.iter().position(|c| c == "trace_id").unwrap_or(1); + let span_id_idx = df.names.iter().position(|c| c == "span_id").unwrap_or(2); + let parent_id_idx = df.names.iter().position(|c| c == "parent_id").unwrap_or(3); + let name_idx = df.names.iter().position(|c| c == "name").unwrap_or(4); + let timestamp_idx = df.names.iter().position(|c| c == "timestamp").unwrap_or(5); + let thread_id_idx = df.names.iter().position(|c| c == "thread_id").unwrap_or(6); + let phase_idx = df.names.iter().position(|c| c == "phase").unwrap_or(7); + let location_idx = df.names.iter().position(|c| c == "location").unwrap_or(8); + let attributes_idx = df.names.iter().position(|c| c == "attributes").unwrap_or(9); + let event_attributes_idx = df + .names + .iter() + .position(|c| c == "event_attributes") + .unwrap_or(10); + + let nrows = df.cols.iter().map(|col| col.len()).max().unwrap_or(0); + + for row_idx in 0..nrows { + let get_str = |idx: usize| -> String { + match df.cols.get(idx).map(|col| col.get(row_idx)) { + Some(Ele::Text(s)) => s.clone(), + Some(Ele::I32(x)) => x.to_string(), + Some(Ele::I64(x)) => x.to_string(), + Some(Ele::F32(x)) => x.to_string(), + Some(Ele::F64(x)) => x.to_string(), + _ => "".to_string(), + } + }; + + let get_i64 = |idx: usize| -> i64 { + match df.cols.get(idx).map(|col| col.get(row_idx)) { + Some(Ele::I32(x)) => x as i64, + Some(Ele::I64(x)) => x, + Some(Ele::F32(x)) => x as i64, + Some(Ele::F64(x)) => x as i64, + Some(Ele::Text(s)) => s.parse().unwrap_or(0), + _ => 0, + } + }; + + let get_opt_str = |idx: usize| -> Option { + match df.cols.get(idx).map(|col| col.get(row_idx)) { + Some(Ele::Text(s)) if !s.is_empty() => Some(s.clone()), + _ => None, + } + }; + + let get_opt_i64 = |idx: usize| -> Option { + let val = get_i64(idx); + if val == -1 { + None + } else { + Some(val) + } + }; + + events.push(TraceEvent { + record_type: get_str(record_type_idx), + trace_id: get_i64(trace_id_idx), + span_id: get_i64(span_id_idx), + parent_id: get_opt_i64(parent_id_idx), + name: get_str(name_idx), + timestamp: get_i64(timestamp_idx), + thread_id: get_i64(thread_id_idx), + phase: get_opt_str(phase_idx), + location: get_opt_str(location_idx), + attributes: get_opt_str(attributes_idx), + event_attributes: get_opt_str(event_attributes_idx), + }); + } + + events +} + +fn trace_processes_from_df(df: DataFrame) -> Vec { + let mut processes = Vec::new(); + + if df.names.is_empty() || df.cols.is_empty() { + return processes; + } + + let pid_idx = df.names.iter().position(|c| c == "pid").unwrap_or(0); + let hostname_idx = df.names.iter().position(|c| c == "hostname").unwrap_or(1); + let worker_idx = df.names.iter().position(|c| c == "ray_worker_id").unwrap_or(2); + let actor_idx = df.names.iter().position(|c| c == "ray_actor_id").unwrap_or(3); + let actor_name_idx = df.names.iter().position(|c| c == "ray_actor_name").unwrap_or(4); + let role_idx = df.names.iter().position(|c| c == "process_role").unwrap_or(5); + let nrows = df.cols.iter().map(|col| col.len()).max().unwrap_or(0); + let mut seen = std::collections::HashSet::::new(); + + for row_idx in 0..nrows { + let get_str = |idx: usize| -> String { + match df.cols.get(idx).map(|col| col.get(row_idx)) { + Some(Ele::Text(s)) => s.clone(), + Some(Ele::I32(x)) => x.to_string(), + Some(Ele::I64(x)) => x.to_string(), + Some(Ele::F32(x)) => x.to_string(), + Some(Ele::F64(x)) => x.to_string(), + _ => "".to_string(), + } + }; + + let pid = get_str(pid_idx).parse::().unwrap_or(0); + if pid <= 0 || !seen.insert(pid) { + continue; + } + + let opt = |value: String| { + if value.is_empty() { + None + } else { + Some(value) + } + }; + + processes.push(TraceProcessInfo { + pid, + process_role: opt(get_str(role_idx)), + hostname: opt(get_str(hostname_idx)), + ray_worker_id: opt(get_str(worker_idx)), + ray_actor_id: opt(get_str(actor_idx)), + ray_actor_name: opt(get_str(actor_name_idx)), + }); + } + + processes +} + +fn merge_local_processes(processes: &mut Vec, local_processes: Vec) { + let mut known = processes + .iter() + .map(|process| process.pid) + .collect::>(); + for process in local_processes { + if process.pid <= 0 || !known.insert(process.pid) { + continue; + } + // `/apis/processes/local` does not populate `env`; roles come from + // `python.ray_process` (framework adapters call `register_current_process`). + processes.push(TraceProcessInfo { + pid: process.pid, + process_role: None, + hostname: None, + ray_worker_id: None, + ray_actor_id: None, + ray_actor_name: None, + }); + } +} + +fn process_sort_rank(process: &TraceProcessInfo) -> usize { + match process.process_role.as_deref() { + Some("driver") => 0, + Some(role) if role.contains("driver") => 1, + Some(role) if role.contains("rollout") => 2, + Some(_) => 3, + None => 4, + } +} + +fn build_span_tree_from_events(mut events: Vec) -> Vec { + events.sort_by_key(|event| event.timestamp); + + let mut span_map: std::collections::HashMap<(i64, i64), SpanInfo> = + std::collections::HashMap::new(); + let mut root_spans: Vec<(i64, i64)> = Vec::new(); + let mut span_process_lookup: std::collections::HashMap<(i64, i64, i64), i64> = + std::collections::HashMap::new(); + + for event in &events { + if event.record_type == "span_start" { + let process_pid = trace_event_process_pid(event); + span_process_lookup.insert((event.span_id, event.thread_id, event.trace_id), process_pid); + let span_key = (process_pid, event.span_id); + let span = SpanInfo { + span_id: event.span_id, + trace_id: event.trace_id, + parent_id: event.parent_id, + name: event.name.clone(), + start_timestamp: event.timestamp, + end_timestamp: None, + thread_id: event.thread_id, + phase: event.phase.clone(), + location: event.location.clone(), + attributes: event.attributes.clone(), + children: Vec::new(), + events: Vec::new(), + }; + + if event.parent_id.is_none() || event.parent_id == Some(-1) { + root_spans.push(span_key); + } + + span_map.insert(span_key, span); + } else if event.record_type == "span_end" { + let process_pid = trace_event_process_pid_from_start(event, &span_process_lookup); + let span_key = (process_pid, event.span_id); + if let Some(span) = span_map.get_mut(&span_key) { + span.end_timestamp = Some(event.timestamp); + } + } else if event.record_type == "event" { + let process_pid = trace_event_process_pid_from_start(event, &span_process_lookup); + let span_key = (process_pid, event.span_id); + if let Some(span) = span_map.get_mut(&span_key) { + span.events.push(EventInfo { + name: event.name.clone(), + timestamp: event.timestamp, + attributes: event.event_attributes.clone(), + }); + } + } + } + + let mut depth_map: std::collections::HashMap<(i64, i64), usize> = + std::collections::HashMap::new(); + + for root_id in &root_spans { + depth_map.insert(*root_id, 0); + } + + let mut changed = true; + while changed { + changed = false; + for (span_key, span) in span_map.iter() { + if depth_map.contains_key(span_key) { + continue; + } + + if let Some(parent_id) = span.parent_id { + let parent_key = (span_key.0, parent_id); + if parent_id != -1 && depth_map.contains_key(&parent_key) { + let parent_depth = depth_map[&parent_key]; + depth_map.insert(*span_key, parent_depth + 1); + changed = true; + } + } else { + depth_map.insert(*span_key, 0); + changed = true; + } + } + } + + let mut spans_to_process: Vec<((i64, i64), usize)> = span_map + .keys() + .map(|&key| (key, depth_map.get(&key).copied().unwrap_or(0))) + .collect(); + spans_to_process.sort_by(|a, b| b.1.cmp(&a.1)); + + for (span_key, _depth) in spans_to_process { + let parent_key = span_map + .get(&span_key) + .and_then(|span| span.parent_id) + .filter(|&pid| pid != -1) + .map(|parent_id| (span_key.0, parent_id)); + + if let Some(parent_key) = parent_key { + if let Some(child) = span_map.remove(&span_key) { + if let Some(parent) = span_map.get_mut(&parent_key) { + parent.children.push(child); + } else { + span_map.insert(span_key, child); + } + } + } + } + + let mut result = Vec::new(); + for root_id in root_spans { + if let Some(span) = span_map.remove(&root_id) { + result.push(span); + } + } + + for (_, span) in span_map { + result.push(span); + } + + result.sort_by_key(|s| s.start_timestamp); + + result +} + +fn trace_event_process_pid(event: &TraceEvent) -> i64 { + attr_string(&event.attributes, "pid") + .and_then(|pid| pid.parse::().ok()) + .filter(|pid| *pid > 0) + .unwrap_or(event.trace_id.max(1)) +} + +fn trace_event_process_pid_from_start( + event: &TraceEvent, + span_process_lookup: &std::collections::HashMap<(i64, i64, i64), i64>, +) -> i64 { + if event.trace_id > 0 { + if let Some(pid) = span_process_lookup + .get(&(event.span_id, event.thread_id, event.trace_id)) + .copied() + { + return pid; + } + } + + span_process_lookup + .iter() + .find(|((span_id, thread_id, _), _)| { + *span_id == event.span_id && *thread_id == event.thread_id + }) + .map(|(_, pid)| *pid) + .or_else(|| { + span_process_lookup + .iter() + .find(|((span_id, _, _), _)| *span_id == event.span_id) + .map(|(_, pid)| *pid) + }) + .unwrap_or_else(|| trace_event_process_pid(event)) +} + +fn attr_string(attributes: &Option, key: &str) -> Option { + let attrs = attributes.as_ref()?; + let value = serde_json::from_str::(attrs).ok()?; + let raw = value.get(key)?; + match raw { + serde_json::Value::String(s) => Some(s.clone()), + serde_json::Value::Number(n) => Some(n.to_string()), + serde_json::Value::Bool(b) => Some(b.to_string()), + _ => None, + } +} + +// --- Inference engine metrics (framework-neutral scrape API) --- + +#[derive(Debug, Clone, Deserialize)] +pub struct EngineInfo { + pub engine_id: String, + pub engine_type: String, + pub router_addr: String, + pub metrics_url: String, + pub framework: String, + pub status: String, + #[serde(default)] + pub last_scrape_error: Option, + #[serde(default)] + pub last_normalized: serde_json::Map, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct EngineListResponse { + pub engines: Vec, +} + +impl ApiClient { + pub async fn fetch_inference_engines(&self) -> Result { + let response = self + .get_request("/apis/pythonext/engines/snapshot") + .await?; + Self::parse_json(&response) + } + + pub async fn scrape_inference_engines(&self) -> Result { + self.get_request("/apis/pythonext/engines/scrape").await + } + + pub async fn fetch_inference_engine_metrics(&self, limit: i64) -> Result { + self.execute_query(&format!( + "SELECT timestamp_ns, engine_id, engine_type, metric_name, metric_value, labels \ + FROM python.inference_engine_metric \ + WHERE metric_name LIKE 'normalized.%' \ + ORDER BY timestamp_ns DESC LIMIT {limit}" + )) + .await + } + + pub async fn fetch_inference_engine_raw_metrics(&self, limit: i64) -> Result { + self.execute_query(&format!( + "SELECT timestamp_ns, engine_id, engine_type, metric_name, metric_value, labels \ + FROM python.inference_engine_metric \ + WHERE metric_name NOT LIKE 'normalized.%' \ + ORDER BY timestamp_ns DESC LIMIT {limit}" + )) + .await + } +} diff --git a/web/src/app.rs b/web/src/app.rs index 8ae64b36..a9a2a701 100644 --- a/web/src/app.rs +++ b/web/src/app.rs @@ -18,6 +18,7 @@ use crate::pages::{ profiling::Profiling, pulsing::Pulsing, python::Python, + rl::{Inference, RlObservability, RlViewMode}, stack::{Stack, StackDistributed}, traces::Traces, training::Training, @@ -30,6 +31,19 @@ use crate::state::profiling::normalize_profiling_view; pub enum Route { #[route("/")] DashboardPage {}, + #[route("/rl")] + #[route("/rl/rollout")] + RolloutPage {}, + #[route("/rl/train")] + TrainPage {}, + #[route("/rl/spans")] + RlSpansPage {}, + #[route("/rl/process-timeline")] + ProcessTimelinePage {}, + #[route("/rl/perfetto")] + PerfettoPage {}, + #[route("/rl/inference")] + InferencePage {}, #[route("/agent")] AgentPage {}, #[route("/cluster")] @@ -64,6 +78,41 @@ pub enum Route { // --- Page route components: each wraps a page in AppLayout --- +#[component] +pub fn RolloutPage() -> Element { + rsx! { AppLayout { RlObservability { view: RlViewMode::Rollout } } } +} + +#[component] +pub fn TrainPage() -> Element { + rsx! { AppLayout { RlObservability { view: RlViewMode::Train } } } +} + +#[component] +pub fn RlSpansPage() -> Element { + rsx! { AppLayout { RlObservability { view: RlViewMode::Spans } } } +} + +#[component] +pub fn ProcessTimelinePage() -> Element { + rsx! { AppLayout { RlObservability { view: RlViewMode::ProcessTimeline } } } +} + +#[component] +pub fn PerfettoPage() -> Element { + rsx! { + AppLayout { + compact: true, + RlObservability { view: RlViewMode::Perfetto } + } + } +} + +#[component] +pub fn InferencePage() -> Element { + rsx! { AppLayout { Inference {} } } +} + #[component] pub fn DashboardPage() -> Element { rsx! { AppLayout { Dashboard {} } } diff --git a/web/src/components/layout.rs b/web/src/components/layout.rs index 19aa0308..3f5c2b48 100644 --- a/web/src/components/layout.rs +++ b/web/src/components/layout.rs @@ -24,8 +24,14 @@ use crate::state::sidebar::{save_sidebar_state, SIDEBAR_HIDDEN, SIDEBAR_WIDTH}; /// Floating button shown when sidebar is hidden. Kept as a const for clarity and reuse. const SHOW_SIDEBAR_BUTTON_CLASS: &str = "fixed top-4 left-4 z-50 w-10 h-10 bg-white border border-gray-300 rounded-lg shadow-sm flex items-center justify-center hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"; +/// When true, main content fills the viewport without max-width or padding (profiling, stacks). +/// When compact is true, chrome is hidden for embedded viewers (Perfetto). #[component] -pub fn AppLayout(children: Element, #[props(default = false)] fullscreen: bool) -> Element { +pub fn AppLayout( + children: Element, + #[props(default = false)] fullscreen: bool, + #[props(default = false)] compact: bool, +) -> Element { let _sidebar_width = SIDEBAR_WIDTH.read(); let sidebar_hidden = SIDEBAR_HIDDEN.read(); let mut floating_result = use_signal(|| Option::::None); @@ -44,7 +50,7 @@ pub fn AppLayout(children: Element, #[props(default = false)] fullscreen: bool) UiTaskRuntime {} InvestigationUrlSync {} PageContextSync {} - if *COMMAND_PANEL_OPEN.read() { + if *COMMAND_PANEL_OPEN.read() && !compact { GlobalCommandPanel {} } ShortcutsHelpOverlay {} @@ -55,9 +61,9 @@ pub fn AppLayout(children: Element, #[props(default = false)] fullscreen: bool) div { class: "flex h-screen bg-gray-50 overflow-hidden", - if !*sidebar_hidden { + if !*sidebar_hidden && !compact { Sidebar {} - } else { + } else if !compact { button { class: SHOW_SIDEBAR_BUTTON_CLASS, title: "Show Sidebar", @@ -73,15 +79,26 @@ pub fn AppLayout(children: Element, #[props(default = false)] fullscreen: bool) } } div { - class: "flex-1 flex flex-col min-w-0", - CommandBar { - on_execute_done: move |r| *floating_result.write() = Some(r), + class: "flex-1 flex flex-col min-w-0 min-h-0", + if !compact { + CommandBar { + on_execute_done: move |r| *floating_result.write() = Some(r), + } } div { class: "flex-1 min-h-0 relative overflow-hidden", main { - class: "absolute inset-0 overflow-y-auto p-4 sm:p-6 bg-gray-50 min-w-0", - if fullscreen { + class: if compact { + "absolute inset-0 overflow-hidden bg-white" + } else { + "absolute inset-0 overflow-y-auto p-4 sm:p-6 bg-gray-50 min-w-0" + }, + if compact { + div { + class: "h-full w-full min-h-0", + {children} + } + } else if fullscreen { div { class: "w-full h-full min-h-0", {children} } } else { div { @@ -90,7 +107,9 @@ pub fn AppLayout(children: Element, #[props(default = false)] fullscreen: bool) } } } - AgentPanel {} + if !compact { + AgentPanel {} + } } } } diff --git a/web/src/components/mod.rs b/web/src/components/mod.rs index 091acb53..bb1c1579 100644 --- a/web/src/components/mod.rs +++ b/web/src/components/mod.rs @@ -39,6 +39,7 @@ pub mod poll_status; pub mod profile_snapshot_bar; pub mod profiling; pub mod profiling_sidebar_hint; +pub mod rl; pub mod sidebar; pub mod source_viewer; pub mod span_timeline; diff --git a/web/src/components/rl/metrics_line_chart.rs b/web/src/components/rl/metrics_line_chart.rs new file mode 100644 index 00000000..a05e232f --- /dev/null +++ b/web/src/components/rl/metrics_line_chart.rs @@ -0,0 +1,219 @@ +use dioxus::prelude::*; + +#[derive(Debug, Clone, PartialEq)] +pub struct ChartSeries { + pub label: String, + pub points: Vec<(f64, f64)>, + pub color: &'static str, +} + +#[component] +pub fn MetricsLineChart( + title: String, + series: Vec, + #[props(default = 280.0)] height: f64, +) -> Element { + if series.is_empty() || series.iter().all(|s| s.points.is_empty()) { + return rsx! { + div { class: "rounded-lg border border-slate-200 bg-white p-4", + div { class: "text-sm font-medium text-slate-700 mb-2", "{title}" } + div { class: "text-xs text-slate-400 py-8 text-center", "No samples yet" } + } + }; + } + + let width = 640.0; + let chart_height = height; + let pad_left = 52.0; + let pad_right = 16.0; + let pad_top = 16.0; + let pad_bottom = 36.0; + let plot_w = width - pad_left - pad_right; + let plot_h = chart_height - pad_top - pad_bottom; + + let (x_min, x_max, y_min, y_max) = bounds(&series); + let x_span = (x_max - x_min).max(1.0); + let y_span = (y_max - y_min).max(f64::EPSILON); + + let y_ticks = y_axis_ticks(y_min, y_max); + let x_labels = x_axis_labels(&series, x_min, x_max, 5); + + rsx! { + div { class: "rounded-lg border border-slate-200 bg-white p-4", + div { class: "flex items-center justify-between gap-2 mb-3", + div { class: "text-sm font-medium text-slate-700", "{title}" } + div { class: "flex flex-wrap gap-3 text-[11px] text-slate-600", + for s in series.iter().filter(|s| !s.points.is_empty()) { + div { class: "flex items-center gap-1.5", + span { + class: "inline-block w-2.5 h-2.5 rounded-full", + style: "background-color: {s.color};", + } + span { "{s.label}" } + } + } + } + } + svg { + class: "w-full", + view_box: "0 0 {width} {chart_height}", + preserve_aspect_ratio: "none", + rect { + x: "{pad_left}", + y: "{pad_top}", + width: "{plot_w}", + height: "{plot_h}", + fill: "#f8fafc", + stroke: "#e2e8f0", + } + for tick in y_ticks.iter() { + { + let y = pad_top + plot_h - ((tick - y_min) / y_span * plot_h); + let x2 = pad_left + plot_w; + let label_x = pad_left - 6.0; + let label_y = y + 4.0; + rsx! { + g { + line { + x1: "{pad_left}", + y1: "{y}", + x2: "{x2}", + y2: "{y}", + stroke: "#e2e8f0", + stroke_width: "1", + } + text { + x: "{label_x}", + y: "{label_y}", + text_anchor: "end", + font_size: "10", + fill: "#64748b", + "{format_tick(*tick)}" + } + } + } + } + } + for (label, x_val) in x_labels.iter() { + { + let x = pad_left + ((x_val - x_min) / x_span * plot_w); + let label_y = chart_height - 8.0; + rsx! { + text { + x: "{x}", + y: "{label_y}", + text_anchor: "middle", + font_size: "10", + fill: "#64748b", + "{label}" + } + } + } + } + for s in series.iter().filter(|s| s.points.len() >= 2) { + { + let polyline = s + .points + .iter() + .map(|(x, y)| { + let px = pad_left + ((x - x_min) / x_span * plot_w); + let py = pad_top + plot_h - ((y - y_min) / y_span * plot_h); + format!("{px},{py}") + }) + .collect::>() + .join(" "); + rsx! { + polyline { + points: "{polyline}", + fill: "none", + stroke: "{s.color}", + stroke_width: "2", + stroke_linejoin: "round", + stroke_linecap: "round", + } + } + } + } + for s in series.iter().filter(|s| s.points.len() == 1) { + { + let (x, y) = s.points[0]; + let px = pad_left + ((x - x_min) / x_span * plot_w); + let py = pad_top + plot_h - ((y - y_min) / y_span * plot_h); + rsx! { + circle { + cx: "{px}", + cy: "{py}", + r: "3.5", + fill: "{s.color}", + } + } + } + } + } + } + } +} + +fn bounds(series: &[ChartSeries]) -> (f64, f64, f64, f64) { + let mut x_min = f64::INFINITY; + let mut x_max = f64::NEG_INFINITY; + let mut y_min = f64::INFINITY; + let mut y_max = f64::NEG_INFINITY; + + for s in series { + for (x, y) in &s.points { + x_min = x_min.min(*x); + x_max = x_max.max(*x); + y_min = y_min.min(*y); + y_max = y_max.max(*y); + } + } + + if y_min == y_max { + let pad = if y_min.abs() > 1.0 { y_min.abs() * 0.1 } else { 1.0 }; + y_min -= pad; + y_max += pad; + } else { + let pad = (y_max - y_min) * 0.08; + y_min -= pad; + y_max += pad; + } + + (x_min, x_max, y_min, y_max) +} + +fn y_axis_ticks(y_min: f64, y_max: f64) -> Vec { + (0..=4) + .map(|i| y_min + (y_max - y_min) * (i as f64 / 4.0)) + .collect() +} + +fn x_axis_labels(_series: &[ChartSeries], x_min: f64, x_max: f64, count: usize) -> Vec<(String, f64)> { + if count <= 1 { + return vec![(format_time_ms(x_min), x_min)]; + } + (0..count) + .map(|i| { + let x = x_min + (x_max - x_min) * (i as f64 / (count - 1) as f64); + (format_time_ms(x), x) + }) + .collect() +} + +fn format_time_ms(ts_ms: f64) -> String { + let secs = (ts_ms / 1000.0) as i64; + let nanos = ((ts_ms % 1000.0) * 1_000_000.0) as u32; + chrono::DateTime::from_timestamp(secs, nanos) + .map(|dt| dt.format("%H:%M:%S").to_string()) + .unwrap_or_else(|| format!("{ts_ms:.0}")) +} + +fn format_tick(value: f64) -> String { + if value.abs() >= 1000.0 { + format!("{value:.0}") + } else if value.abs() >= 10.0 { + format!("{value:.1}") + } else { + format!("{value:.3}") + } +} diff --git a/web/src/components/rl/mod.rs b/web/src/components/rl/mod.rs new file mode 100644 index 00000000..5661d103 --- /dev/null +++ b/web/src/components/rl/mod.rs @@ -0,0 +1,5 @@ +//! RL / agentic training UI helpers. + +pub mod metrics_line_chart; + +pub use metrics_line_chart::{ChartSeries, MetricsLineChart}; diff --git a/web/src/components/sidebar/advanced/mod.rs b/web/src/components/sidebar/advanced/mod.rs new file mode 100644 index 00000000..a1553298 --- /dev/null +++ b/web/src/components/sidebar/advanced/mod.rs @@ -0,0 +1,84 @@ +//! Advanced / low-frequency navigation items. + +use dioxus::prelude::*; +use dioxus_router::{Link, use_route}; +use icondata::Icon as IconData; + +use crate::app::Route; +use crate::components::sidebar::nav_item::sidebar_item_class; +use crate::components::icon::Icon; + +#[component] +pub fn AdvancedSidebarItem(show_dropdown: Signal) -> Element { + let route = use_route::(); + let is_active = matches!( + route, + Route::DashboardPage {} + | Route::ClusterPage {} + | Route::PythonPage {} + | Route::ChromeTracingRedirect {} + ); + let expanded = *show_dropdown.read(); + let button_class = format!( + "w-full focus:outline-none focus:ring-2 focus:ring-blue-400 focus:ring-offset-2 focus:ring-offset-slate-900 {}", + sidebar_item_class(is_active) + ); + + rsx! { + div { + button { + class: "{button_class}", + aria_expanded: if expanded { "true" } else { "false" }, + aria_label: "Advanced menu", + onclick: move |_| { + let current = *show_dropdown.read(); + *show_dropdown.write() = !current; + }, + Icon { icon: &icondata::AiSettingOutlined, class: "w-4 h-4" } + span { "Advanced" } + } + + if expanded { + div { + class: "ml-4 mt-0.5 space-y-0.5", + AdvancedSubLink { + to: Route::DashboardPage {}, + label: "Dashboard", + icon: &icondata::AiLineChartOutlined, + } + AdvancedSubLink { + to: Route::ClusterPage {}, + label: "Cluster", + icon: &icondata::AiClusterOutlined, + } + AdvancedSubLink { + to: Route::PythonPage {}, + label: "Python", + icon: &icondata::SiPython, + } + AdvancedSubLink { + to: Route::ChromeTracingRedirect {}, + label: "Chrome Tracing", + icon: &icondata::AiThunderboltOutlined, + } + } + } + } + } +} + +#[component] +fn AdvancedSubLink(to: Route, label: &'static str, icon: &'static IconData) -> Element { + let route = use_route::(); + let is_selected = route == to; + let link_class = format!("{}", sidebar_item_class(is_selected)); + + rsx! { + Link { + to: to, + class: "{link_class}", + Icon { icon, class: "w-4 h-4" } + span { "{label}" } + } + } +} diff --git a/web/src/components/sidebar/mod.rs b/web/src/components/sidebar/mod.rs index 92ead372..c209383b 100644 --- a/web/src/components/sidebar/mod.rs +++ b/web/src/components/sidebar/mod.rs @@ -113,6 +113,46 @@ pub fn Sidebar() -> Element { show_dropdown: show_stack_dropdown, } + SidebarSectionLabel { label: "RL" } + SidebarNavItem { + to: Route::RolloutPage {}, + icon: &icondata::AiDeploymentUnitOutlined, + label: "Rollout", + is_active: route == Route::RolloutPage {}, + } + SidebarNavItem { + to: Route::TrainPage {}, + icon: &icondata::AiRadarChartOutlined, + label: "Train", + is_active: route == Route::TrainPage {}, + } + SidebarNavItem { + to: Route::RlSpansPage {}, + icon: &icondata::AiApartmentOutlined, + label: "RL Spans", + title: "Distributed RL span hierarchy with cross-process linking", + is_active: route == Route::RlSpansPage {}, + } + SidebarNavItem { + to: Route::ProcessTimelinePage {}, + icon: &icondata::AiClockCircleOutlined, + label: "Process Timeline", + is_active: route == Route::ProcessTimelinePage {}, + } + SidebarNavItem { + to: Route::PerfettoPage {}, + icon: &icondata::AiThunderboltOutlined, + label: "Perfetto", + is_active: route == Route::PerfettoPage {}, + } + SidebarNavItem { + to: Route::InferencePage {}, + icon: &icondata::AiDashboardOutlined, + label: "Inference", + title: "Inference engine Prometheus metrics", + is_active: route == Route::InferencePage {}, + } + SidebarSectionLabel { label: "Analysis" } ProfilingSidebarItem { show_dropdown: show_profiling_dropdown, diff --git a/web/src/main.rs b/web/src/main.rs index 27651e25..e93f0be6 100644 --- a/web/src/main.rs +++ b/web/src/main.rs @@ -9,6 +9,7 @@ mod components; mod hooks; mod overhead; mod pages; +mod rl_contract; mod state; mod utils; diff --git a/web/src/pages/mod.rs b/web/src/pages/mod.rs index 21eac3df..1ac634f5 100644 --- a/web/src/pages/mod.rs +++ b/web/src/pages/mod.rs @@ -5,6 +5,7 @@ pub mod dashboard; pub mod profiling; pub mod pulsing; pub mod python; +pub mod rl; pub mod stack; pub mod traces; pub mod training; diff --git a/web/src/pages/rl/inference.rs b/web/src/pages/rl/inference.rs new file mode 100644 index 00000000..0bcd0cac --- /dev/null +++ b/web/src/pages/rl/inference.rs @@ -0,0 +1,470 @@ +use std::collections::HashMap; + +use dioxus::prelude::*; +use probing_proto::prelude::{DataFrame, Ele}; + +use crate::api::EngineInfo; +use crate::api::ApiClient; +use crate::components::card::Card; +use crate::components::common::{EmptyState, ErrorState, LoadingState}; +use crate::components::rl::metrics_line_chart::{ChartSeries, MetricsLineChart}; +use crate::components::page::{PageContainer, PageTitle}; +use crate::hooks::use_api; + +const REFRESH_MS: u32 = 5000; +const METRICS_HISTORY_LIMIT: i64 = 500; + +const METRIC_DEFS: [(&str, &str); 7] = [ + ("normalized.inflight_requests", "In-flight requests"), + ("normalized.queue_depth", "Queue depth"), + ("normalized.throughput_tps", "Throughput (tok/s)"), + ("normalized.tpot_ms", "TPOT (ms)"), + ("normalized.ttft_ms", "TTFT (ms)"), + ("normalized.kv_cache_usage_ratio", "KV cache usage"), + ("normalized.cache_hit_ratio", "Cache hit ratio"), +]; + +const SERIES_COLORS: [&str; 6] = [ + "#2563eb", "#dc2626", "#16a34a", "#9333ea", "#ea580c", "#0891b2", +]; + +#[component] +pub fn Inference() -> Element { + let mut refresh_tick = use_signal(|| 0u64); + let engines = use_api({ + let refresh_tick = refresh_tick.clone(); + move || { + let _ = *refresh_tick.read(); + let client = ApiClient::new(); + async move { client.fetch_inference_engines().await.map(|resp| resp.engines) } + } + }); + let metrics = use_api({ + let refresh_tick = refresh_tick.clone(); + move || { + let _ = *refresh_tick.read(); + let client = ApiClient::new(); + async move { + client + .fetch_inference_engine_metrics(METRICS_HISTORY_LIMIT) + .await + } + } + }); + + use_effect(move || { + spawn(async move { + loop { + gloo_timers::future::TimeoutFuture::new(REFRESH_MS).await; + refresh_tick.set(refresh_tick() + 1); + } + }); + }); + + rsx! { + PageContainer { + PageTitle { + title: "Inference Engine".to_string(), + subtitle: Some( + "Inference-engine Prometheus metrics (scrape path configurable, e.g. /metrics)".to_string(), + ), + icon: Some(&icondata::AiDashboardOutlined), + } + + div { class: "flex items-center gap-3 mb-4", + button { + class: "px-3 py-1.5 rounded-md text-sm bg-blue-600 text-white hover:bg-blue-700", + onclick: move |_| { + spawn(async move { + let _ = ApiClient::new().scrape_inference_engines().await; + refresh_tick.set(refresh_tick() + 1); + }); + }, + "Scrape now" + } + span { class: "text-xs text-slate-500", "Auto refresh every {REFRESH_MS / 1000}s" } + } + + Card { + title: "Registered engines", + content_class: Some(""), + {engines_panel(&engines)} + } + + Card { + title: "Latest normalized metrics", + content_class: Some(""), + {metrics_cards(&engines)} + } + + Card { + title: "Metric trends (time series)", + content_class: Some(""), + {metrics_charts(&metrics)} + } + } + } +} + +fn engines_panel(state: &crate::hooks::ApiState>) -> Element { + if state.is_loading() && state.data.read().is_none() { + return rsx! { LoadingState { message: Some("Loading engines...".to_string()) } }; + } + match state.data.read().as_ref() { + Some(Ok(engines)) if engines.is_empty() => rsx! { + EmptyState { + message: "No inference engine registered. Register via /apis/pythonext/engines/register?router_addr=http://host:port&metrics_path=/metrics".to_string(), + } + }, + Some(Ok(engines)) => rsx! { + div { class: "overflow-x-auto", + table { class: "min-w-full text-sm", + thead { + tr { class: "text-left text-slate-500 border-b border-slate-200", + th { class: "py-2 pr-4", "Engine" } + th { class: "py-2 pr-4", "Type" } + th { class: "py-2 pr-4", "Framework" } + th { class: "py-2 pr-4", "Metrics URL" } + th { class: "py-2 pr-4", "Status" } + } + } + tbody { + for engine in engines.iter() { + tr { class: "border-b border-slate-100", + td { class: "py-2 pr-4 font-medium", "{engine.engine_id}" } + td { class: "py-2 pr-4", "{engine.engine_type}" } + td { class: "py-2 pr-4", "{engine.framework}" } + td { class: "py-2 pr-4 font-mono text-xs break-all", "{engine.metrics_url}" } + td { class: "py-2 pr-4", + span { + class: if engine.status == "healthy" { + "text-emerald-600" + } else { + "text-amber-600" + }, + "{engine.status}" + } + if let Some(error) = &engine.last_scrape_error { + div { class: "text-xs text-red-500 mt-1", "{error}" } + } + } + } + } + } + } + } + }, + Some(Err(error)) => rsx! { ErrorState { error: error.to_string(), title: None } }, + None => rsx! { LoadingState { message: Some("Loading engines...".to_string()) } }, + } +} + +fn metrics_cards(state: &crate::hooks::ApiState>) -> Element { + if state.is_loading() && state.data.read().is_none() { + return rsx! { LoadingState { message: Some("Loading metrics...".to_string()) } }; + } + let data = state.data.read(); + let Some(Ok(engines)) = data.as_ref() else { + return rsx! { EmptyState { message: "No metrics yet.".to_string() } }; + }; + if engines.is_empty() { + return rsx! { EmptyState { message: "Register an engine to see metrics.".to_string() } }; + } + + let labels = [ + ("inflight_requests", "In-flight requests"), + ("queue_depth", "Queue depth"), + ("throughput_tps", "Throughput (tok/s)"), + ("tpot_ms", "TPOT (ms)"), + ("ttft_ms", "TTFT (ms)"), + ("kv_cache_usage_ratio", "KV cache usage"), + ("cache_hit_ratio", "Cache hit ratio"), + ]; + + rsx! { + for engine in engines.iter() { + div { class: "mb-4", + div { class: "text-sm font-semibold text-slate-700 mb-2", "{engine.engine_id}" } + div { class: "grid grid-cols-2 md:grid-cols-4 gap-3", + for (key, label) in labels.iter() { + div { class: "rounded-lg border border-slate-200 bg-slate-50 px-3 py-2", + div { class: "text-[11px] uppercase tracking-wide text-slate-500", "{label}" } + div { class: "text-lg font-semibold text-slate-900", + { + engine.last_normalized + .get(*key) + .map(format_metric_value) + .unwrap_or_else(|| "—".to_string()) + } + } + } + } + } + } + } + } +} + +fn metrics_charts(state: &crate::hooks::ApiState) -> Element { + if state.is_loading() && state.data.read().is_none() { + return rsx! { LoadingState { message: Some("Loading metric trends...".to_string()) } }; + } + match state.data.read().as_ref() { + Some(Ok(df)) if df.is_empty() => rsx! { + EmptyState { + message: "No metric samples stored yet. Click Scrape now or wait for the background scraper.".to_string(), + } + }, + Some(Ok(df)) => { + let grouped = group_metric_rows(df); + if grouped.is_empty() { + return rsx! { + EmptyState { + message: "No normalized metric samples found yet.".to_string(), + } + }; + } + let engine_colors = engine_color_map(&grouped); + + rsx! { + div { class: "grid grid-cols-1 xl:grid-cols-2 gap-4", + for (metric_key, title) in METRIC_DEFS.iter() { + { + let chart_series = build_chart_series(&grouped, &engine_colors, metric_key); + rsx! { + MetricsLineChart { + title: title.to_string(), + series: chart_series, + } + } + } + } + } + } + } + Some(Err(error)) => rsx! { ErrorState { error: error.to_string(), title: None } }, + None => rsx! { LoadingState { message: Some("Loading metric trends...".to_string()) } }, + } +} + +fn group_metric_rows(df: &DataFrame) -> HashMap<(String, String), Vec<(f64, f64)>> { + let ts_idx = col_idx(df, "timestamp_ns"); + let engine_idx = col_idx(df, "engine_id"); + let name_idx = col_idx(df, "metric_name"); + let value_idx = col_idx(df, "metric_value"); + + let Some((ts_idx, engine_idx, name_idx, value_idx)) = ( + match (ts_idx, engine_idx, name_idx, value_idx) { + (Some(a), Some(b), Some(c), Some(d)) => Some((a, b, c, d)), + _ => None, + } + ) else { + return HashMap::new(); + }; + + let mut grouped: HashMap<(String, String), Vec<(f64, f64)>> = HashMap::new(); + for row in df.iter() { + let Some(ts_ns) = ele_i64(row.get(ts_idx)) else { + continue; + }; + let Some(engine_id) = ele_str(row.get(engine_idx)) else { + continue; + }; + let Some(metric_name) = ele_str(row.get(name_idx)) else { + continue; + }; + let Some(metric_value) = ele_f64(row.get(value_idx)) else { + continue; + }; + if !metric_name.starts_with("normalized.") { + continue; + } + + let ts_ms = ts_ns as f64 / 1_000_000.0; + grouped + .entry((metric_name, engine_id)) + .or_default() + .push((ts_ms, metric_value)); + } + + for points in grouped.values_mut() { + points.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap_or(std::cmp::Ordering::Equal)); + dedupe_time_points(points); + } + + grouped +} + +fn build_chart_series( + grouped: &HashMap<(String, String), Vec<(f64, f64)>>, + engine_colors: &HashMap, + metric_key: &str, +) -> Vec { + let mut engine_ids: Vec = grouped + .keys() + .filter_map(|(name, engine_id)| (name == metric_key).then_some(engine_id.clone())) + .collect(); + engine_ids.sort(); + + engine_ids + .into_iter() + .filter_map(|engine_id| { + grouped + .get(&(metric_key.to_string(), engine_id.clone())) + .map(|points| ChartSeries { + label: engine_id.clone(), + points: points.clone(), + color: engine_colors + .get(&engine_id) + .copied() + .unwrap_or("#64748b"), + }) + }) + .collect() +} + +fn engine_color_map(grouped: &HashMap<(String, String), Vec<(f64, f64)>>) -> HashMap { + let mut engines: Vec = grouped + .keys() + .map(|(_, engine_id)| engine_id.clone()) + .collect(); + engines.sort(); + engines.dedup(); + + engines + .into_iter() + .enumerate() + .map(|(idx, engine_id)| { + ( + engine_id, + SERIES_COLORS[idx % SERIES_COLORS.len()], + ) + }) + .collect() +} + +fn dedupe_time_points(points: &mut Vec<(f64, f64)>) { + if points.len() <= 1 { + return; + } + let mut deduped: Vec<(f64, f64)> = Vec::with_capacity(points.len()); + for (ts, value) in points.drain(..) { + if deduped.last().map(|(last_ts, _)| (*last_ts - ts).abs() < f64::EPSILON) == Some(true) + { + if let Some(last) = deduped.last_mut() { + last.1 = value; + } + } else { + deduped.push((ts, value)); + } + } + *points = deduped; +} + +fn col_idx(df: &DataFrame, name: &str) -> Option { + df.names.iter().position(|col| col == name) +} + +fn ele_i64(ele: Option<&Ele>) -> Option { + match ele? { + Ele::I64(v) => Some(*v), + Ele::I32(v) => Some(*v as i64), + Ele::F64(v) => Some(*v as i64), + Ele::F32(v) => Some(*v as i64), + Ele::Text(v) | Ele::Url(v) => v.parse().ok(), + Ele::DataTime(v) => i64::try_from(*v).ok(), + _ => None, + } +} + +fn ele_f64(ele: Option<&Ele>) -> Option { + match ele? { + Ele::F64(v) => Some(*v), + Ele::F32(v) => Some(*v as f64), + Ele::I64(v) => Some(*v as f64), + Ele::I32(v) => Some(*v as f64), + Ele::Text(v) | Ele::Url(v) => v.parse().ok(), + Ele::DataTime(v) => Some(*v as f64), + _ => None, + } +} + +fn ele_str(ele: Option<&Ele>) -> Option { + match ele? { + Ele::Text(v) => Some(v.clone()), + Ele::Url(v) => Some(v.clone()), + Ele::I64(v) => Some(v.to_string()), + Ele::I32(v) => Some(v.to_string()), + Ele::F32(v) => Some(v.to_string()), + Ele::F64(v) => Some(v.to_string()), + _ => None, + } +} + +fn format_metric_value(value: &serde_json::Value) -> String { + match value { + serde_json::Value::Number(number) => { + if let Some(value) = number.as_f64() { + if value.fract() == 0.0 { + format!("{value:.0}") + } else { + format!("{value:.3}") + } + } else { + number.to_string() + } + } + other => other.to_string(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + use probing_proto::prelude::{DataFrame, Ele, Seq}; + + #[test] + fn group_metric_rows_accepts_text_metric_values_and_numeric_engine_ids() { + let df = DataFrame { + names: vec![ + "timestamp_ns".into(), + "engine_id".into(), + "engine_type".into(), + "metric_name".into(), + "metric_value".into(), + "labels".into(), + ], + cols: vec![ + Seq::SeqI64(vec![1_000_000_000, 2_000_000_000]), + Seq::SeqI64(vec![0, 0]), + Seq::SeqText(vec!["inference".into(), "inference".into()]), + Seq::SeqText(vec![ + "normalized.inflight_requests".into(), + "normalized.inflight_requests".into(), + ]), + Seq::SeqText(vec!["0".into(), "1".into()]), + Seq::SeqText(vec!["normalized=1".into(), "normalized=1".into()]), + ], + size: 0, + }; + + let grouped = group_metric_rows(&df); + assert_eq!(grouped.len(), 1); + let points = grouped + .get(&( + "normalized.inflight_requests".to_string(), + "0".to_string(), + )) + .expect("series"); + assert_eq!(points.len(), 2); + assert_eq!(points[0].1, 0.0); + assert_eq!(points[1].1, 1.0); + } + + #[test] + fn ele_helpers_coerce_common_query_variants() { + assert_eq!(ele_f64(Some(&Ele::Text("0.5".into()))), Some(0.5)); + assert_eq!(ele_str(Some(&Ele::I64(42))), Some("42".into())); + assert_eq!(ele_i64(Some(&Ele::Text("99".into()))), Some(99)); + } +} diff --git a/web/src/pages/rl/mod.rs b/web/src/pages/rl/mod.rs new file mode 100644 index 00000000..86699b2a --- /dev/null +++ b/web/src/pages/rl/mod.rs @@ -0,0 +1,2711 @@ +use dioxus::prelude::*; +use dioxus_router::use_navigator; + +use crate::app::Route; +use crate::components::card::Card; +use crate::components::colors::colors; +use crate::components::page::{PageContainer, PageTitle}; +use crate::components::common::{LoadingState, ErrorState}; +use crate::hooks::use_api_simple; +use crate::api::{ApiClient, SpanInfo, EventInfo, TraceProcessInfo}; +use crate::rl_contract::{ + self, is_rollout_submit_parent_span, + is_step_parent_span, is_train_timeline_span, is_rollout_worker_role, logical_step_key, + LogicalStepKey, ROLLOUT_TIMELINE_EMPTY_HINT, TRAIN_TIMELINE_EMPTY_HINT, +}; +use crate::state::rl::{ + estimate_detail_panel_height, ROLLOUT_FILTER, ROLLOUT_FILTER_INPUT, RL_DETAIL_PANEL_HEIGHT, + RL_DETAIL_PANEL_HEIGHT_DEFAULT, RL_DETAIL_PANEL_HEIGHT_MAX, RL_DETAIL_PANEL_HEIGHT_MIN, +}; +use crate::utils::tracing_viewer; +use std::collections::{HashMap, HashSet}; + +/// RL observability view selected from the sidebar route. +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum RlViewMode { + Rollout, + Train, + Spans, + ProcessTimeline, + Perfetto, +} + +impl RlViewMode { + pub fn title(self) -> &'static str { + match self { + Self::Rollout => "Rollout", + Self::Train => "Train", + Self::Spans => "Spans", + Self::ProcessTimeline => "Process Timeline", + Self::Perfetto => "Perfetto", + } + } + + pub fn subtitle(self) -> &'static str { + match self { + Self::Rollout => "Per-trajectory phase timing across rollout workers", + Self::Train => "Training batch phases keyed by train step", + Self::Spans => "Distributed span hierarchy with cross-process linking", + Self::ProcessTimeline => "Per-process span timing and batch drill-down", + Self::Perfetto => "Chrome trace export for the loaded span set", + } + } + + pub fn icon(self) -> &'static icondata::Icon { + match self { + Self::Rollout => &icondata::AiDeploymentUnitOutlined, + Self::Train => &icondata::AiLineChartOutlined, + Self::Spans => &icondata::AiApartmentOutlined, + Self::ProcessTimeline => &icondata::AiClockCircleOutlined, + Self::Perfetto => &icondata::AiThunderboltOutlined, + } + } + + fn internal_key(self) -> &'static str { + match self { + Self::Rollout => "rl", + Self::Train => "train", + Self::Spans => "tree", + Self::ProcessTimeline => "profiling", + Self::Perfetto => "rollout-perfetto", + } + } + + fn shows_rollout_filter(self) -> bool { + matches!(self, Self::Rollout) + } + + fn uses_rollout_filter(self) -> bool { + matches!(self, Self::Rollout | Self::Perfetto) + } +} + +#[component] +pub fn RlObservability(view: RlViewMode) -> Element { + let is_perfetto = view == RlViewMode::Perfetto; + let limit = use_signal(|| if is_perfetto { 2000 } else { 400 }); + let timeline_depth = use_signal(|| 2usize); + let selected_batch_key = use_signal(|| String::new()); + let process_filter = use_signal(|| { + if is_perfetto { + "all".to_string() + } else { + "driver".to_string() + } + }); + let function_filter = use_signal(|| String::new()); + let discovered_processes = use_signal(|| Vec::::new()); + let state = use_api_simple::>(); + let navigator = use_navigator(); + let view_key = view.internal_key(); + + let shows_rollout_filter = view.shows_rollout_filter(); + let uses_rollout_filter = view.uses_rollout_filter(); + + // Create dependency, recalculate when limit or rollout filter changes. + let data_query = use_memo({ + let limit = limit.clone(); + move || { + let rollout_id = if uses_rollout_filter { + ROLLOUT_FILTER.read().trim().to_string() + } else { + String::new() + }; + (*limit.read(), rollout_id) + } + }); + // Refetch data when limit or rollout filter changes. + use_effect({ + let data_query = data_query.clone(); + let mut loading = state.loading; + let mut data = state.data; + let mut discovered_processes = discovered_processes.clone(); + move || { + let (limit_val, rollout_id) = data_query.read().clone(); + spawn(async move { + *loading.write() = true; + let client = ApiClient::new(); + let result = async { + let processes = client.get_trace_processes().await.unwrap_or_default(); + *discovered_processes.write() = processes.clone(); + + let mut spans = if rollout_id.is_empty() { + let fetch_limit = expanded_trace_fetch_limit(limit_val); + let mut spans = client.get_span_tree(Some(fetch_limit)).await?; + let local_pids = collect_span_process_pids(&spans); + for process in processes { + if local_pids.contains(&process.pid) { + continue; + } + if let Ok(mut process_spans) = client.get_span_tree_for_pid(process.pid, Some(fetch_limit)).await { + spans.append(&mut process_spans); + } + } + spans + } else { + let mut spans = client.get_span_tree_for_rollout_id(&rollout_id).await?; + let local_pids = collect_span_process_pids(&spans); + for process in processes { + if local_pids.contains(&process.pid) { + continue; + } + if let Ok(mut process_spans) = client.get_span_tree_for_pid_and_rollout_id(process.pid, &rollout_id).await { + spans.append(&mut process_spans); + } + } + spans + }; + spans = link_cross_process_spans(spans); + spans.sort_by_key(|span| span.start_timestamp); + Ok(spans) + } + .await; + *data.write() = Some(result); + *loading.write() = false; + }); + } + }); + + let display_fetch_limit = expanded_trace_fetch_limit(*limit.read()); + let active_rollout_filter = if shows_rollout_filter { + ROLLOUT_FILTER.read().trim().to_string() + } else { + String::new() + }; + let rollout_filter_input_value = if shows_rollout_filter { + ROLLOUT_FILTER_INPUT.read().clone() + } else { + String::new() + }; + + if is_perfetto { + return rsx! { + div { + class: "flex h-full min-h-0 flex-col bg-white", + if state.is_loading() { + div { + class: "flex flex-1 items-center justify-center text-sm text-gray-500", + "Loading trace data..." + } + } else if let Some(Ok(spans)) = state.data.read().as_ref() { + if spans.is_empty() { + div { + class: "flex flex-1 items-center justify-center p-8 text-center text-sm text-gray-500", + "No trace data available. Start tracing with probing.tracing.span()" + } + } else { + { + let all_display_spans = build_display_spans(spans); + let display_spans = filter_display_spans( + &all_display_spans, + "all", + "", + ); + rsx! { + RolloutPerfettoTimeline { + spans: display_spans, + fullscreen: true, + } + } + } + } + } else if let Some(Err(err)) = state.data.read().as_ref() { + div { + class: "flex flex-1 items-center justify-center p-8", + ErrorState { error: err.display_message(), title: None } + } + } + } + }; + } + + rsx! { + PageContainer { + PageTitle { + title: view.title().to_string(), + subtitle: Some(view.subtitle().to_string()), + icon: Some(view.icon()), + } + // Limit control slider + Card { + title: "Context", + div { + class: "space-y-2", + if shows_rollout_filter { + div { + class: "flex flex-wrap items-center gap-2 rounded border border-blue-100 bg-blue-50 px-3 py-2", + span { + class: "text-sm text-gray-700", + "Rollout ID" + } + input { + r#type: "text", + value: "{rollout_filter_input_value}", + placeholder: "e.g. 12", + class: "w-40 rounded border border-gray-200 bg-white px-2 py-1 text-sm font-mono", + oninput: move |ev| *ROLLOUT_FILTER_INPUT.write() = ev.value() + } + button { + class: format!("rounded px-3 py-1.5 text-sm bg-{} text-white", colors::PRIMARY), + onclick: { + let mut selected_batch_key = selected_batch_key.clone(); + let mut process_filter = process_filter.clone(); + let nav = navigator.clone(); + move |_| { + *ROLLOUT_FILTER.write() = + ROLLOUT_FILTER_INPUT.read().trim().to_string(); + *selected_batch_key.write() = String::new(); + *process_filter.write() = "all".to_string(); + nav.push(Route::RolloutPage {}); + } + }, + "Load rollout" + } + button { + class: "rounded bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100", + onclick: { + let mut selected_batch_key = selected_batch_key.clone(); + move |_| { + *ROLLOUT_FILTER_INPUT.write() = String::new(); + *ROLLOUT_FILTER.write() = String::new(); + *selected_batch_key.write() = String::new(); + } + }, + "Clear" + } + span { + class: "text-xs text-gray-600", + if active_rollout_filter.is_empty() { + "Empty means latest-event mode." + } else { + "Fetching all spans tagged with rollout_id={active_rollout_filter} across processes." + } + } + } + } + div { + class: "flex items-center justify-between", + span { + class: "text-sm text-gray-600", + "Number of Events" + } + span { + class: "text-sm text-gray-800 font-mono", + "{*limit.read()} events" + } + } + input { + r#type: "range", + min: "100", + max: "2000", + step: "100", + value: "{*limit.read()}", + class: "w-full", + oninput: { + let mut limit = limit.clone(); + move |ev| { + if let Ok(val) = ev.value().parse::() { + *limit.write() = val; + } + } + } + } + div { + class: "flex justify-between text-xs text-gray-500", + span { "100" } + span { "2000" } + } + div { + class: "text-xs text-gray-500", + if shows_rollout_filter && active_rollout_filter.is_empty() { + "Trace linking fetches up to {display_fetch_limit} events per process to keep cross-process parents in range." + } else if shows_rollout_filter { + "Rollout ID mode ignores the event limit and fetches all matching spans for the selected rollout." + } else { + "Fetches up to {display_fetch_limit} events per process." + } + } + } + } + + Card { + title: "Trace Data", + if state.is_loading() { + LoadingState { message: Some("Loading trace data...".to_string()) } + } else if let Some(Ok(spans)) = state.data.read().as_ref() { + if spans.is_empty() { + div { + class: "text-center py-8 text-gray-500", + "No trace data available. Start tracing with probing.tracing.span()" + } + } else { + { + let all_display_spans = build_display_spans(spans); + let process_options = collect_process_options(&all_display_spans, &discovered_processes.read()); + let function_options = collect_function_options(&all_display_spans); + let selected_process_filter = process_filter.read().clone(); + let selected_function_filter = function_filter.read().clone(); + let display_spans = filter_display_spans( + &all_display_spans, + &selected_process_filter, + &selected_function_filter, + ); + let discovered_count = discovered_processes.read().len(); + let batch_options = collect_batch_options(&display_spans); + let current_batch_key = selected_batch_key.read().clone(); + let selected_batch_key_for_view = if batch_options.iter().any(|batch| batch.unique_key == current_batch_key) { + current_batch_key + } else { + String::new() + }; + let selected_batch_label = batch_options + .iter() + .find(|batch| batch.unique_key == selected_batch_key_for_view) + .map(|batch| batch.display_id.clone()) + .unwrap_or_else(|| "All batches".to_string()); + let depth_value = *timeline_depth.read(); + let link_summary = cross_process_link_summary_view(&display_spans); + + rsx! { + div { + class: "space-y-6", + div { + class: "rounded border border-gray-100 bg-gray-50 px-3 py-3", + div { + class: "flex flex-wrap items-center gap-4", + div { + class: "flex items-center gap-2", + span { class: "text-sm text-gray-600", "Process" } + select { + class: "max-w-[360px] rounded border border-gray-200 bg-white px-2 py-1 text-sm", + value: "{selected_process_filter}", + oninput: { + let mut process_filter = process_filter.clone(); + let mut selected_batch_key = selected_batch_key.clone(); + move |ev| { + *process_filter.write() = ev.value(); + *selected_batch_key.write() = String::new(); + } + }, + option { value: "driver", "Driver (default)" } + option { value: "all", "All processes with spans" } + for process_option in process_options.iter() { + option { + value: "{process_option.filter_key}", + "{process_option.label}" + } + } + } + } + div { + class: "flex items-center gap-2", + span { class: "text-sm text-gray-600", "Function" } + select { + class: "max-w-[360px] rounded border border-gray-200 bg-white px-2 py-1 text-sm", + value: "{selected_function_filter}", + oninput: { + let mut function_filter = function_filter.clone(); + let mut selected_batch_key = selected_batch_key.clone(); + move |ev| { + *function_filter.write() = ev.value(); + *selected_batch_key.write() = String::new(); + } + }, + option { value: "", "All probing spans" } + for function_option in function_options.iter() { + option { + value: "{function_option.filter_key}", + "{function_option.label}" + } + } + } + } + span { + class: "text-xs text-gray-500", + "discovered {discovered_count} Ray processes, showing {display_spans.len()} roots" + } + } + } + div { + class: "rounded border border-gray-100 bg-gray-50 px-3 py-2 text-xs font-mono text-gray-600", + "Cross Process Link: linked {link_summary.linked}, orphan {link_summary.orphan}, rollout parents {link_summary.parents}" + if !link_summary.orphan_keys.is_empty() { + span { + class: "ml-2 text-gray-500", + "orphan keys: {link_summary.orphan_keys}" + } + } + } + if view_key == "profiling" { + div { + class: "flex flex-wrap items-center gap-4 rounded border border-gray-100 bg-gray-50 px-3 py-2", + div { + class: "flex items-center gap-2", + span { class: "text-sm text-gray-600", "Depth" } + select { + class: "rounded border border-gray-200 bg-white px-2 py-1 text-sm", + value: "{depth_value}", + oninput: { + let mut timeline_depth = timeline_depth.clone(); + move |ev| { + if let Ok(val) = ev.value().parse::() { + *timeline_depth.write() = val; + } + } + }, + option { value: "1", "Level 1" } + option { value: "2", "Level 2" } + option { value: "3", "Level 3" } + option { value: "99", "All" } + } + } + div { + class: "flex items-center gap-2", + span { class: "text-sm text-gray-600", "Batch" } + select { + class: "max-w-[320px] rounded border border-gray-200 bg-white px-2 py-1 text-sm", + value: "{selected_batch_key_for_view}", + oninput: { + let mut selected_batch_key = selected_batch_key.clone(); + move |ev| *selected_batch_key.write() = ev.value() + }, + option { value: "", "All batches" } + for batch in batch_options.iter() { + option { + value: "{batch.unique_key}", + "{batch.display_id} | {batch.process_label} | span_id:{batch.span_id}" + } + } + } + } + span { + class: "text-xs text-gray-500", + "selected: {selected_batch_label}" + } + } + SpanTimeline { + spans: display_spans.clone(), + max_depth: depth_value, + selected_batch_key: selected_batch_key_for_view.clone(), + } + } else if view_key == "rl" { + RlTimeline { + spans: display_spans.clone(), + } + } else if view_key == "rollout-perfetto" { + RolloutPerfettoTimeline { + spans: display_spans.clone(), + } + } else if view_key == "train" { + TrainTimeline { + spans: display_spans.clone(), + } + } else { + div { + class: "space-y-4", + for span in display_spans.iter() { + SpanView { span: span.clone(), depth: 0 } + } + } + } + } + } + } + } + } else if let Some(Err(err)) = state.data.read().as_ref() { + ErrorState { error: err.display_message(), title: None } + } + } + } + } +} + +#[allow(dead_code)] +#[component] +fn _unused_legacy_traces() -> Element { + rsx! { + RlObservability { view: RlViewMode::Rollout } + } +} + +#[derive(Clone, PartialEq)] +struct DisplaySpan { + unique_key: String, + span_id: i64, + trace_id: i64, + parent_id: Option, + name: String, + display_id: String, + start_timestamp: i64, + end_timestamp: Option, + thread_id: i64, + kind: Option, + location: Option, + attributes: Option, + process_label: String, + children: Vec, + events: Vec, +} + +#[derive(Clone, PartialEq)] +struct FilterOption { + filter_key: String, + label: String, +} + +#[component] +fn SpanView(span: DisplaySpan, depth: usize) -> Element { + let indent = depth * 24; + let duration = span.end_timestamp + .map(|end| format_duration_ns(end - span.start_timestamp)) + .unwrap_or_else(|| "running".to_string()); + + let mut expanded = use_signal(|| depth < 2); // Auto-expand first 2 levels + + rsx! { + div { + class: "border-l-2 border-gray-200 pl-4", + style: format!("margin-left: {}px", indent), + div { + class: "flex items-center gap-2 py-2 hover:bg-gray-50 rounded px-2 flex-wrap", + button { + class: "text-gray-400 hover:text-gray-600 flex-shrink-0", + onclick: move |_| { + let current = *expanded.read(); + *expanded.write() = !current; + }, + if *expanded.read() { + "▼" + } else { + "▶" + } + } + span { + class: "font-semibold text-gray-900", + "{span.name}" + } + span { + class: "text-xs px-2 py-0.5 bg-gray-100 text-gray-600 rounded font-mono", + "{span.display_id}" + } + span { + class: "text-xs px-2 py-0.5 bg-gray-100 text-gray-600 rounded font-mono", + "{span.process_label}" + } + if let Some(ref kind) = span.kind { + span { + class: format!("text-xs px-2 py-0.5 bg-{} text-{} rounded", colors::CONTENT_ACCENT_BG, colors::CONTENT_ACCENT_TEXT), + "{kind}" + } + } + // Display location in header + if let Some(ref location) = span.location { + if !location.is_empty() { + span { + class: "text-xs px-2 py-0.5 bg-gray-100 text-gray-700 rounded font-mono", + "{location}" + } + } + } + span { + class: "text-sm text-gray-500", + "span_id: {span.span_id}" + } + if let Some(ref parent_id) = span.parent_id { + span { + class: "text-sm text-gray-400", + "parent: {parent_id}" + } + } + span { + class: "text-sm text-gray-500", + "thread: {span.thread_id}" + } + span { + class: "text-sm font-mono text-green-600", + "{duration}" + } + } + + if *expanded.read() { + div { + class: "ml-6 space-y-2", + // Attributes - displayed first + if let Some(ref attrs) = span.attributes { + if !attrs.is_empty() { + div { + class: "text-xs text-gray-500 mb-1", + "Attributes:" + } + // Try to parse and format JSON attributes + if let Ok(parsed) = serde_json::from_str::(attrs) { + if let Some(obj) = parsed.as_object() { + div { + class: "bg-gray-50 p-2 rounded mt-1 space-y-1", + for (key, val) in obj.iter() { + div { + class: "flex items-start gap-2 text-xs", + span { + class: "font-semibold text-gray-700 min-w-[100px]", + "{key}:" + } + span { + class: "text-gray-600 font-mono break-all", + { + match val { + serde_json::Value::String(s) => s.clone(), + serde_json::Value::Number(n) => n.to_string(), + serde_json::Value::Bool(b) => b.to_string(), + serde_json::Value::Null => "null".to_string(), + _ => format!("{}", val), + } + } + } + } + } + } + } else { + div { + class: "text-xs font-mono bg-gray-50 p-2 rounded mt-1 break-all", + "{attrs}" + } + } + } else { + div { + class: "text-xs font-mono bg-gray-50 p-2 rounded mt-1 break-all", + "{attrs}" + } + } + } + } + + // Events + if !span.events.is_empty() { + div { + class: "text-xs text-gray-500 mb-1 mt-2", + "Events ({span.events.len()}):" + } + for event in span.events.iter() { + EventView { event: event.clone() } + } + } + + // Children spans + if !span.children.is_empty() { + div { + class: "text-xs text-gray-500 mb-1 mt-2", + "Child Spans ({span.children.len()}):" + } + for child in span.children.iter() { + SpanView { span: child.clone(), depth: depth + 1 } + } + } + } + } + } + } +} + +#[derive(Clone, PartialEq)] +struct TimelineSpan { + unique_key: String, + name: String, + display_id: String, + span_id: i64, + kind: Option, + location: Option, + start: i64, + duration: i64, + depth: usize, + process_label: String, +} + +#[derive(Clone, Default)] +struct CrossProcessLinkSummaryView { + linked: usize, + orphan: usize, + parents: usize, + orphan_keys: String, +} + +#[component] +fn SpanTimeline(spans: Vec, max_depth: usize, selected_batch_key: String) -> Element { + let rows = build_timeline_spans(&spans, max_depth, &selected_batch_key); + if rows.is_empty() { + return rsx! { + div { + class: "text-sm text-gray-500", + "No completed spans available for timeline." + } + }; + } + + let min_start = rows.iter().map(|row| row.start).min().unwrap_or(0); + let max_end = rows + .iter() + .map(|row| row.start + row.duration) + .max() + .unwrap_or(min_start + 1); + let window = (max_end - min_start).max(1); + let window_f = window as f64; + let window_label = format_duration_ns(window); + + rsx! { + div { + class: "border-b border-gray-100 pb-4", + div { + class: "mb-3 flex items-center justify-between gap-4", + h4 { + class: "text-sm font-semibold text-gray-900", + "Timeline" + } + span { + class: "text-xs font-mono text-gray-500", + "window {window_label}" + } + } + div { + class: "space-y-1", + for row in rows.iter() { + { + let left = ((row.start - min_start) as f64 / window_f * 100.0).clamp(0.0, 100.0); + let width = (row.duration as f64 / window_f * 100.0) + .max(0.5) + .min((100.0 - left).max(0.5)); + let start_offset = row.start - min_start; + let end_offset = start_offset + row.duration; + let start_label = format_duration_ns(start_offset); + let end_label = format_duration_ns(end_offset); + let duration_label = format_duration_ns(row.duration); + let tooltip = format!( + "{} ({})\nprocess: {}\nspan_id: {}\nstart: {}\nend: {}\nduration: {}", + row.name, row.display_id, row.process_label, row.span_id, start_label, end_label, duration_label, + ); + rsx! { + div { + class: "grid grid-cols-[minmax(220px,34%)_1fr_auto] items-center gap-3 text-sm", + title: "{tooltip}", + div { + class: "min-w-0", + style: "padding-left: {row.depth.min(8) * 14}px", + div { + class: "flex items-center gap-2 min-w-0", + span { + class: "font-medium text-gray-900 truncate", + "{row.name}" + } + span { + class: "text-xs px-1.5 py-0.5 bg-gray-100 text-gray-600 rounded font-mono flex-shrink-0", + "{row.display_id}" + } + span { + class: "text-xs px-1.5 py-0.5 bg-gray-100 text-gray-600 rounded font-mono flex-shrink-0", + "{row.process_label}" + } + if let Some(ref kind) = row.kind { + span { + class: format!("text-xs px-1.5 py-0.5 bg-{} text-{} rounded flex-shrink-0", colors::CONTENT_ACCENT_BG, colors::CONTENT_ACCENT_TEXT), + "{kind}" + } + } + } + if let Some(ref location) = row.location { + if !location.is_empty() { + div { + class: "mt-0.5 text-xs font-mono text-gray-400 truncate", + "{location}" + } + } + } + } + div { + class: "relative h-5 rounded bg-gray-100 overflow-hidden", + div { + class: "absolute top-1 bottom-1 rounded bg-blue-500", + style: "left: {left:.2}%; width: {width:.2}%;", + } + } + div { + class: "font-mono text-xs text-gray-600 text-right w-44", + "{start_label} -> {end_label} | {duration_label}" + } + } + } + } + } + } + } + } +} + +#[derive(Clone, PartialEq)] +struct RlPhaseSegment { + name: String, + phase: String, + start: i64, + end: i64, + process_label: String, + span_id: i64, + attributes: Option, + turn_id: Option, + env_step_id: Option, +} + +#[derive(Clone, PartialEq)] +struct RlSampleRow { + sample_key: String, + label: String, + detail: String, + start: i64, + end: i64, + process_labels: String, + segments: Vec, +} + +#[derive(Clone, PartialEq)] +struct RlRolloutView { + rollout_id: String, + start: i64, + end: i64, + samples: Vec, +} + +#[derive(Default)] +struct RlSampleBuilder { + sample_key: String, + label: String, + rollout_id: String, + group_id: Option, + attempt: Option, + start: i64, + end: i64, + process_labels: HashSet, + segments: Vec, +} + +#[component] +fn RolloutPerfettoTimeline(spans: Vec, #[props(default)] fullscreen: bool) -> Element { + let trace_json = build_chrome_trace_json_from_display_spans(&spans); + let container_class = if fullscreen { + "relative flex-1 min-h-0 overflow-hidden bg-white" + } else { + "relative min-h-[680px] overflow-hidden rounded border border-gray-200 bg-white" + }; + let iframe_style = if fullscreen { + "width: 100%; height: 100%; border: none; display: block;" + } else { + "width: 100%; height: 680px; border: none; display: block;" + }; + + rsx! { + div { + class: if fullscreen { "flex h-full min-h-0 flex-col" } else { "space-y-3" }, + if !fullscreen { + div { + class: "rounded border border-gray-100 bg-gray-50 px-3 py-2 text-sm text-gray-600", + "Perfetto view for the currently loaded trace data. Use the Rollout ID filter above to focus this panel on one rollout." + } + } + div { + class: "{container_class}", + if let Some(trace_json) = trace_json { + iframe { + srcdoc: tracing_viewer::get_tracing_viewer_html(&trace_json), + style: "{iframe_style}", + title: "Perfetto" + } + } else { + div { + class: "absolute inset-0 flex items-center justify-center p-8", + div { + class: "text-center text-gray-500", + p { class: "mb-2 text-lg", "No timeline spans with end timestamps" } + p { class: "text-sm", "Load a rollout from the Rollout page, then return here." } + } + } + } + } + } + } +} + +#[component] +fn RlTimeline(spans: Vec) -> Element { + let rollouts = build_rl_rollout_views(&spans); + if rollouts.is_empty() { + return rsx! { + div { + class: "text-sm text-gray-500", + "{ROLLOUT_TIMELINE_EMPTY_HINT}" + } + }; + } + + let selected_rollout = use_signal(|| rollouts.first().map(|rollout| rollout.rollout_id.clone()).unwrap_or_default()); + let selected_sample = use_signal(|| String::new()); + let sort_mode = use_signal(|| "time".to_string()); + let selected_rollout_read = selected_rollout.read().clone(); + let selected_rollout_id = if rollouts.iter().any(|rollout| rollout.rollout_id == selected_rollout_read) { + selected_rollout.read().clone() + } else { + rollouts.first().map(|rollout| rollout.rollout_id.clone()).unwrap_or_default() + }; + let rollout = rollouts + .iter() + .find(|rollout| rollout.rollout_id == selected_rollout_id) + .or_else(|| rollouts.first()) + .unwrap(); + let selected_sample_read = selected_sample.read().clone(); + let selected_sample_key = if rollout.samples.iter().any(|sample| sample.sample_key == selected_sample_read) { + selected_sample.read().clone() + } else { + rollout.samples.first().map(|sample| sample.sample_key.clone()).unwrap_or_default() + }; + let selected_sample_row = rollout.samples.iter().find(|sample| sample.sample_key == selected_sample_key); + let min_start = rollout.start; + let max_end = rollout.end.max(min_start + 1); + let window = (max_end - min_start).max(1); + let window_f = window as f64; + let window_label = format_duration_ns(window); + let sample_count = rollout.samples.len(); + let segment_count = rollout.samples.iter().map(|sample| sample.segments.len()).sum::(); + let sort_mode_value = sort_mode.read().clone(); + let mut display_samples = rollout.samples.clone(); + if sort_mode_value == "slow" { + display_samples.sort_by(|a, b| sample_duration_ns(b).cmp(&sample_duration_ns(a)) + .then_with(|| a.start.cmp(&b.start))); + } else { + display_samples.sort_by_key(|sample| sample.start); + } + let slowest_sample = rollout.samples.iter().max_by_key(|sample| sample_duration_ns(sample)); + let slowest_label = slowest_sample + .map(|sample| format!("slowest {} {}", sample.label, format_duration_ns(sample_duration_ns(sample)))) + .unwrap_or_default(); + let detail_bottom_pad = if selected_sample_row.is_some() { + *RL_DETAIL_PANEL_HEIGHT.read() + 12 + } else { + 0 + }; + + rsx! { + div { + class: "border-b border-gray-100", + style: if detail_bottom_pad > 0 { format!("padding-bottom: {detail_bottom_pad}px") } else { String::new() }, + div { + class: "mb-3 flex items-start justify-between gap-4", + div { + h4 { + class: "text-sm font-semibold text-gray-900", + "Rollout" + } + div { + class: "text-xs text-gray-500", + "Grouped by rollout_id and trajectory_id. Each row is one rollout trajectory." + } + } + span { + class: "text-xs font-mono text-gray-500", + "window {window_label}" + } + } + RlPhaseLegend {} + div { + class: "mb-3 flex flex-wrap items-center gap-3", + span { class: "text-sm text-gray-600", "Rollout" } + for rollout_option in rollouts.iter() { + { + let is_selected = rollout_option.rollout_id == selected_rollout_id; + let rollout_id = rollout_option.rollout_id.clone(); + rsx! { + button { + class: format!("rounded px-2 py-1 text-xs font-mono {}", if is_selected { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-gray-100 text-gray-700 hover:bg-gray-200".to_string() }), + onclick: { + let mut selected_rollout = selected_rollout.clone(); + let mut selected_sample = selected_sample.clone(); + move |_| { + *selected_rollout.write() = rollout_id.clone(); + *selected_sample.write() = String::new(); + } + }, + "{rollout_option.rollout_id} ({rollout_option.samples.len()})" + } + } + } + } + span { + class: "ml-2 text-xs text-gray-500", + "{sample_count} trajectories, {segment_count} phase spans" + } + if !slowest_label.is_empty() { + span { + class: "rounded bg-orange-50 px-2 py-1 text-xs font-mono text-orange-700", + "{slowest_label}" + } + } + } + div { + class: "mb-3 flex flex-wrap items-center gap-2 rounded border border-gray-100 bg-gray-50 px-3 py-2", + span { class: "text-sm text-gray-600", "Sort" } + button { + class: format!("rounded px-2 py-1 text-xs {}", if sort_mode_value == "time" { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-white text-gray-700 hover:bg-gray-100".to_string() }), + onclick: { + let mut sort_mode = sort_mode.clone(); + move |_| *sort_mode.write() = "time".to_string() + }, + "timeline order" + } + button { + class: format!("rounded px-2 py-1 text-xs {}", if sort_mode_value == "slow" { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-white text-gray-700 hover:bg-gray-100".to_string() }), + onclick: { + let mut sort_mode = sort_mode.clone(); + move |_| *sort_mode.write() = "slow".to_string() + }, + "slowest first" + } + span { + class: "text-xs text-gray-500", + "Tip: click a trajectory row to pin its phase details below." + } + } + div { + class: "space-y-1", + for sample in display_samples.iter() { + { + let start_offset = sample.start - min_start; + let end_offset = sample.end - min_start; + let duration = (sample.end - sample.start).max(0); + let start_label = format_duration_ns(start_offset); + let end_label = format_duration_ns(end_offset); + let duration_label = format_duration_ns(duration); + let is_selected = sample.sample_key == selected_sample_key; + rsx! { + button { + class: format!("grid w-full grid-cols-[minmax(300px,34%)_1fr_auto] items-center gap-3 rounded px-2 py-1 text-left text-sm {}", if is_selected { "bg-blue-50 ring-1 ring-blue-200".to_string() } else { "hover:bg-gray-50".to_string() }), + onclick: { + let mut selected_sample = selected_sample.clone(); + let sample_key = sample.sample_key.clone(); + move |_| *selected_sample.write() = sample_key.clone() + }, + div { + class: "min-w-0", + div { + class: "flex items-center gap-2 min-w-0", + span { + class: "font-medium text-gray-900 truncate", + "{sample.label}" + } + if !sample.detail.is_empty() { + span { + class: "text-xs px-1.5 py-0.5 bg-gray-100 text-gray-600 rounded font-mono flex-shrink-0", + "{sample.detail}" + } + } + span { + class: "text-xs px-1.5 py-0.5 bg-orange-50 text-orange-700 rounded font-mono flex-shrink-0", + "{duration_label}" + } + } + div { + class: "mt-0.5 truncate text-xs text-gray-400", + "{sample.process_labels}" + } + } + div { + class: "relative h-6 rounded bg-gray-100 overflow-hidden", + for segment in sample.segments.iter() { + { + let left = ((segment.start - min_start) as f64 / window_f * 100.0).clamp(0.0, 100.0); + let width = ((segment.end - segment.start).max(0) as f64 / window_f * 100.0) + .max(0.35) + .min((100.0 - left).max(0.35)); + let phase_class = rl_phase_bar_class(&segment.phase); + let title = format!( + "{} phase={} process={} duration={}", + segment.name, + segment.phase, + segment.process_label, + format_duration_ns((segment.end - segment.start).max(0)), + ); + rsx! { + div { + class: "{phase_class}", + title: "{title}", + style: "left: {left:.2}%; width: {width:.2}%;", + } + } + } + } + } + div { + class: "font-mono text-xs text-gray-600 text-right w-44", + "{start_label} -> {end_label} | {duration_label}" + } + } + } + } + } + } + if let Some(sample) = selected_sample_row { + RlSampleDetail { sample: sample.clone(), min_start } + } + } + } +} + +#[component] +fn TrainTimeline(spans: Vec) -> Element { + let rollouts = build_train_rollout_views(&spans); + if rollouts.is_empty() { + return rsx! { + div { + class: "text-sm text-gray-500", + "{TRAIN_TIMELINE_EMPTY_HINT}" + } + }; + } + + let selected_rollout = use_signal(|| rollouts.first().map(|rollout| rollout.rollout_id.clone()).unwrap_or_default()); + let selected_batch = use_signal(|| String::new()); + let sort_mode = use_signal(|| "time".to_string()); + let selected_rollout_read = selected_rollout.read().clone(); + let selected_rollout_id = if rollouts.iter().any(|rollout| rollout.rollout_id == selected_rollout_read) { + selected_rollout.read().clone() + } else { + rollouts.first().map(|rollout| rollout.rollout_id.clone()).unwrap_or_default() + }; + let rollout = rollouts + .iter() + .find(|rollout| rollout.rollout_id == selected_rollout_id) + .or_else(|| rollouts.first()) + .unwrap(); + let selected_batch_read = selected_batch.read().clone(); + let selected_batch_key = if rollout.samples.iter().any(|batch| batch.sample_key == selected_batch_read) { + selected_batch.read().clone() + } else { + rollout.samples.first().map(|batch| batch.sample_key.clone()).unwrap_or_default() + }; + let selected_batch_row = rollout.samples.iter().find(|batch| batch.sample_key == selected_batch_key); + let min_start = rollout.start; + let max_end = rollout.end.max(min_start + 1); + let window = (max_end - min_start).max(1); + let window_f = window as f64; + let window_label = format_duration_ns(window); + let batch_count = rollout.samples.len(); + let segment_count = rollout.samples.iter().map(|batch| batch.segments.len()).sum::(); + let sort_mode_value = sort_mode.read().clone(); + let mut display_batches = rollout.samples.clone(); + if sort_mode_value == "slow" { + display_batches.sort_by(|a, b| sample_duration_ns(b).cmp(&sample_duration_ns(a)) + .then_with(|| a.start.cmp(&b.start))); + } else { + display_batches.sort_by_key(|batch| batch.start); + } + let slowest_batch = rollout.samples.iter().max_by_key(|batch| sample_duration_ns(batch)); + let slowest_label = slowest_batch + .map(|batch| format!("slowest {} {}", batch.label, format_duration_ns(sample_duration_ns(batch)))) + .unwrap_or_default(); + let detail_bottom_pad = if selected_batch_row.is_some() { + *RL_DETAIL_PANEL_HEIGHT.read() + 12 + } else { + 0 + }; + + rsx! { + div { + class: "border-b border-gray-100", + style: if detail_bottom_pad > 0 { format!("padding-bottom: {detail_bottom_pad}px") } else { String::new() }, + div { + class: "mb-3 flex items-start justify-between gap-4", + div { + h4 { + class: "text-sm font-semibold text-gray-900", + "Train" + } + div { + class: "text-xs text-gray-500", + "Grouped by rollout_id and train_step_id/batch_id. Each row is one train batch." + } + } + span { + class: "text-xs font-mono text-gray-500", + "window {window_label}" + } + } + RlPhaseLegend {} + div { + class: "mb-3 flex flex-wrap items-center gap-3", + span { class: "text-sm text-gray-600", "Rollout" } + for rollout_option in rollouts.iter() { + { + let is_selected = rollout_option.rollout_id == selected_rollout_id; + let rollout_id = rollout_option.rollout_id.clone(); + rsx! { + button { + class: format!("rounded px-2 py-1 text-xs font-mono {}", if is_selected { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-gray-100 text-gray-700 hover:bg-gray-200".to_string() }), + onclick: { + let mut selected_rollout = selected_rollout.clone(); + let mut selected_batch = selected_batch.clone(); + move |_| { + *selected_rollout.write() = rollout_id.clone(); + *selected_batch.write() = String::new(); + } + }, + "{rollout_option.rollout_id} ({rollout_option.samples.len()})" + } + } + } + } + span { + class: "ml-2 text-xs text-gray-500", + "{batch_count} batches, {segment_count} phase spans" + } + if !slowest_label.is_empty() { + span { + class: "rounded bg-orange-50 px-2 py-1 text-xs font-mono text-orange-700", + "{slowest_label}" + } + } + } + div { + class: "mb-3 flex flex-wrap items-center gap-2 rounded border border-gray-100 bg-gray-50 px-3 py-2", + span { class: "text-sm text-gray-600", "Sort" } + button { + class: format!("rounded px-2 py-1 text-xs {}", if sort_mode_value == "time" { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-white text-gray-700 hover:bg-gray-100".to_string() }), + onclick: { + let mut sort_mode = sort_mode.clone(); + move |_| *sort_mode.write() = "time".to_string() + }, + "timeline order" + } + button { + class: format!("rounded px-2 py-1 text-xs {}", if sort_mode_value == "slow" { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-white text-gray-700 hover:bg-gray-100".to_string() }), + onclick: { + let mut sort_mode = sort_mode.clone(); + move |_| *sort_mode.write() = "slow".to_string() + }, + "slowest first" + } + span { + class: "text-xs text-gray-500", + "Tip: click a train batch row to pin its phase details below." + } + } + div { + class: "space-y-1", + for batch in display_batches.iter() { + { + let start_offset = batch.start - min_start; + let end_offset = batch.end - min_start; + let duration = (batch.end - batch.start).max(0); + let start_label = format_duration_ns(start_offset); + let end_label = format_duration_ns(end_offset); + let duration_label = format_duration_ns(duration); + let is_selected = batch.sample_key == selected_batch_key; + rsx! { + button { + class: format!("grid w-full grid-cols-[minmax(300px,34%)_1fr_auto] items-center gap-3 rounded px-2 py-1 text-left text-sm {}", if is_selected { "bg-blue-50 ring-1 ring-blue-200".to_string() } else { "hover:bg-gray-50".to_string() }), + onclick: { + let mut selected_batch = selected_batch.clone(); + let batch_key = batch.sample_key.clone(); + move |_| *selected_batch.write() = batch_key.clone() + }, + div { + class: "min-w-0", + div { + class: "flex items-center gap-2 min-w-0", + span { + class: "font-medium text-gray-900 truncate", + "{batch.label}" + } + if !batch.detail.is_empty() { + span { + class: "text-xs px-1.5 py-0.5 bg-gray-100 text-gray-600 rounded font-mono flex-shrink-0", + "{batch.detail}" + } + } + span { + class: "text-xs px-1.5 py-0.5 bg-orange-50 text-orange-700 rounded font-mono flex-shrink-0", + "{duration_label}" + } + } + div { + class: "mt-0.5 truncate text-xs text-gray-400", + "{batch.process_labels}" + } + } + div { + class: "relative h-6 rounded bg-gray-100 overflow-hidden", + for segment in batch.segments.iter() { + { + let left = ((segment.start - min_start) as f64 / window_f * 100.0).clamp(0.0, 100.0); + let width = ((segment.end - segment.start).max(0) as f64 / window_f * 100.0) + .max(0.35) + .min((100.0 - left).max(0.35)); + let phase_class = rl_phase_bar_class(&segment.phase); + let title = format!( + "{} phase={} process={} duration={}", + segment.name, + segment.phase, + segment.process_label, + format_duration_ns((segment.end - segment.start).max(0)), + ); + rsx! { + div { + class: "{phase_class}", + title: "{title}", + style: "left: {left:.2}%; width: {width:.2}%;", + } + } + } + } + } + div { + class: "font-mono text-xs text-gray-600 text-right w-44", + "{start_label} -> {end_label} | {duration_label}" + } + } + } + } + } + } + if let Some(batch) = selected_batch_row { + TrainBatchDetail { batch: batch.clone(), min_start } + } + } + } +} + +#[component] +fn ResizableDetailPanel( + title: String, + subtitle: String, + segment_count: usize, + children: Element, +) -> Element { + let mut panel_height = use_signal(|| *RL_DETAIL_PANEL_HEIGHT.read()); + let mut is_resizing = use_signal(|| false); + let mut drag_start_y = use_signal(|| 0.0f64); + let mut drag_start_height = use_signal(|| 0.0f64); + let height_px = *panel_height.read(); + let height_label = format!("{height_px}px"); + let resizing = *is_resizing.read(); + + rsx! { + if resizing { + div { + class: "fixed inset-0 z-[60] cursor-ns-resize select-none", + style: "touch-action: none;", + onmousemove: { + let mut panel_height = panel_height.clone(); + move |ev| { + let current_y = ev.client_coordinates().y; + let delta = *drag_start_y.read() - current_y; + let new_height = (*drag_start_height.read() + delta) + .max(RL_DETAIL_PANEL_HEIGHT_MIN as f64) + .min(RL_DETAIL_PANEL_HEIGHT_MAX as f64) as u32; + *panel_height.write() = new_height; + *RL_DETAIL_PANEL_HEIGHT.write() = new_height; + } + }, + onmouseup: { + let mut is_resizing = is_resizing.clone(); + move |_| { + *is_resizing.write() = false; + } + }, + } + } + div { + class: "fixed bottom-0 left-0 right-0 z-50 flex flex-col border-t border-gray-200 bg-white/95 shadow-2xl backdrop-blur", + style: "height: {height_px}px;", + div { + class: "group flex h-3 shrink-0 cursor-ns-resize items-center justify-center border-b border-gray-100 bg-gray-50 hover:bg-gray-100 active:bg-gray-200", + title: "Drag up/down to resize panel height", + onmousedown: { + let mut is_resizing = is_resizing.clone(); + let mut drag_start_y = drag_start_y.clone(); + let mut drag_start_height = drag_start_height.clone(); + move |ev| { + *is_resizing.write() = true; + *drag_start_y.write() = ev.client_coordinates().y; + *drag_start_height.write() = *panel_height.read() as f64; + ev.prevent_default(); + } + }, + div { class: "h-1 w-16 rounded-full bg-gray-300 group-hover:bg-gray-400 group-active:bg-gray-500" } + } + div { + class: "mx-auto flex min-h-0 w-full max-w-[1400px] flex-1 flex-col px-3 pb-3", + div { + class: "mb-2 flex shrink-0 items-center justify-between gap-3 pt-2", + div { + class: "min-w-0", + h5 { class: "text-sm font-semibold text-gray-900", "{title}" } + div { class: "text-xs text-gray-500 truncate", "{subtitle}" } + } + div { + class: "flex shrink-0 items-center gap-2", + span { + class: "hidden sm:inline text-xs font-mono text-gray-500", + "{segment_count} phases · {height_label}" + } + button { + class: "rounded border border-gray-200 bg-white px-2 py-0.5 text-xs text-gray-700 hover:bg-gray-50", + title: "Expand to fit all phases", + onclick: { + let mut panel_height = panel_height.clone(); + move |_| { + let h = estimate_detail_panel_height(segment_count); + *panel_height.write() = h; + *RL_DETAIL_PANEL_HEIGHT.write() = h; + } + }, + "Expand all" + } + button { + class: "rounded border border-gray-200 bg-white px-2 py-0.5 text-xs text-gray-700 hover:bg-gray-50", + title: "Reset panel height", + onclick: { + let mut panel_height = panel_height.clone(); + move |_| { + *panel_height.write() = RL_DETAIL_PANEL_HEIGHT_DEFAULT; + *RL_DETAIL_PANEL_HEIGHT.write() = RL_DETAIL_PANEL_HEIGHT_DEFAULT; + } + }, + "Reset" + } + } + } + div { + class: "min-h-0 flex-1 space-y-1 overflow-y-auto pr-1", + {children} + } + } + } + } +} + +#[component] +fn TrainBatchDetail(batch: RlSampleRow, min_start: i64) -> Element { + let batch_duration = format_duration_ns(sample_duration_ns(&batch)); + rsx! { + ResizableDetailPanel { + title: format!("Train Batch Detail: {}", batch.label), + subtitle: format!("{} | duration {}", batch.detail, batch_duration), + segment_count: batch.segments.len(), + for segment in batch.segments.iter() { + { + let start = format_duration_ns(segment.start - min_start); + let end = format_duration_ns(segment.end - min_start); + let duration = format_duration_ns((segment.end - segment.start).max(0)); + let dot_class = rl_phase_dot_class(&segment.phase); + rsx! { + div { + class: "grid grid-cols-[minmax(180px,22%)_130px_1fr] items-start gap-2 rounded bg-gray-50 px-2 py-1 text-xs", + div { + class: "min-w-0", + div { + class: "flex items-center gap-2", + span { class: "{dot_class}" } + span { class: "font-medium text-gray-900 truncate", "{segment.name}" } + } + div { class: "font-mono text-gray-400", "span:{segment.span_id}" } + } + div { class: "font-mono text-gray-600", "{segment.phase}" } + div { + class: "min-w-0", + div { class: "font-mono text-gray-600", "{start} -> {end} | {duration}" } + div { class: "truncate text-gray-400", "{segment.process_label}" } + if let Some(ref attrs) = segment.attributes { + if !attrs.is_empty() { + div { class: "mt-0.5 truncate font-mono text-gray-400", "{attrs}" } + } + } + } + } + } + } + } + } + } +} + +#[component] +fn RlPhaseLegend() -> Element { + rsx! { + div { + class: "mb-3 flex flex-wrap items-center gap-3 rounded border border-gray-100 bg-gray-50 px-3 py-2 text-xs text-gray-600", + span { class: "font-medium text-gray-700", "Phase legend" } + RlLegendItem { class_name: "bg-blue-500".to_string(), label: "inference".to_string() } + RlLegendItem { class_name: "bg-amber-500".to_string(), label: "env step".to_string() } + RlLegendItem { class_name: "bg-violet-500".to_string(), label: "tool call".to_string() } + RlLegendItem { class_name: "bg-pink-500".to_string(), label: "reward".to_string() } + RlLegendItem { class_name: "bg-emerald-500".to_string(), label: "train/optimizer".to_string() } + RlLegendItem { class_name: "bg-slate-500".to_string(), label: "other".to_string() } + } + } +} + +#[component] +fn RlLegendItem(class_name: String, label: String) -> Element { + rsx! { + span { + class: "inline-flex items-center gap-1.5", + span { class: "h-2.5 w-2.5 rounded {class_name}" } + "{label}" + } + } +} + +#[component] +fn RlSampleDetail(sample: RlSampleRow, min_start: i64) -> Element { + let sample_duration = format_duration_ns(sample_duration_ns(&sample)); + rsx! { + ResizableDetailPanel { + title: format!("Trajectory Detail: {}", sample.label), + subtitle: format!("{} | duration {}", sample.detail, sample_duration), + segment_count: sample.segments.len(), + for segment in sample.segments.iter() { + { + let start = format_duration_ns(segment.start - min_start); + let end = format_duration_ns(segment.end - min_start); + let duration = format_duration_ns((segment.end - segment.start).max(0)); + let turn = segment.turn_id.clone().unwrap_or_else(|| "-".to_string()); + let env_step = segment.env_step_id.clone().unwrap_or_else(|| "-".to_string()); + let dot_class = rl_phase_dot_class(&segment.phase); + rsx! { + div { + class: "grid grid-cols-[minmax(180px,22%)_130px_90px_90px_1fr] items-start gap-2 rounded bg-gray-50 px-2 py-1 text-xs", + div { + class: "min-w-0", + div { + class: "flex items-center gap-2", + span { class: "{dot_class}" } + span { class: "font-medium text-gray-900 truncate", "{segment.name}" } + } + div { class: "font-mono text-gray-400", "span:{segment.span_id}" } + } + div { class: "font-mono text-gray-600", "{segment.phase}" } + div { class: "font-mono text-gray-500", "turn:{turn}" } + div { class: "font-mono text-gray-500", "env:{env_step}" } + div { + class: "min-w-0", + div { class: "font-mono text-gray-600", "{start} -> {end} | {duration}" } + div { class: "truncate text-gray-400", "{segment.process_label}" } + if let Some(ref attrs) = segment.attributes { + if !attrs.is_empty() { + div { class: "mt-0.5 truncate font-mono text-gray-400", "{attrs}" } + } + } + } + } + } + } + } + } + } +} + +fn build_timeline_spans(spans: &[DisplaySpan], max_depth: usize, selected_batch_key: &str) -> Vec { + let mut rows = Vec::new(); + if !selected_batch_key.is_empty() { + if let Some(selected) = find_display_span(spans, selected_batch_key) { + collect_timeline_spans(std::slice::from_ref(selected), 0, max_depth, &mut rows); + } + } else { + collect_timeline_spans(spans, 0, max_depth, &mut rows); + } + rows.sort_by_key(|row| row.start); + rows +} + +fn build_rl_rollout_views(spans: &[DisplaySpan]) -> Vec { + let mut all_spans = Vec::::new(); + collect_all_display_spans(spans, &mut all_spans); + + let mut samples = HashMap::::new(); + + for span in all_spans { + let Some(segment) = rl_segment_from_span(&span) else { + continue; + }; + let Some(rollout_id) = attr_string(&span.attributes, "rollout_id") + .or_else(|| attr_string(&span.attributes, "step_id")) else { + continue; + }; + let Some(trajectory_id) = attr_string(&span.attributes, "trajectory_id") + .or_else(|| { + let group_id = attr_string(&span.attributes, "group_id")?; + let group_index = attr_string(&span.attributes, "group_index")?; + Some(format!("r{rollout_id}-g{group_id}-i{group_index}")) + }) + .or_else(|| attr_string(&span.attributes, "sample_id")) else { + continue; + }; + let sample_key = format!("{rollout_id}:{trajectory_id}"); + let entry = samples.entry(sample_key.clone()).or_insert_with(|| RlSampleBuilder { + sample_key: sample_key.clone(), + label: trajectory_id.clone(), + rollout_id: rollout_id.clone(), + group_id: attr_string(&span.attributes, "group_id"), + attempt: attr_string(&span.attributes, "attempt"), + start: segment.start, + end: segment.end, + ..Default::default() + }); + + entry.start = entry.start.min(segment.start); + entry.end = entry.end.max(segment.end); + if entry.group_id.is_none() { + entry.group_id = attr_string(&span.attributes, "group_id"); + } + if entry.attempt.is_none() { + entry.attempt = attr_string(&span.attributes, "attempt"); + } + entry.process_labels.insert(span.process_label.clone()); + entry.segments.push(segment); + } + + let mut by_rollout = HashMap::>::new(); + for mut builder in samples.into_values() { + builder.segments.sort_by_key(|segment| segment.start); + let mut labels = builder.process_labels.into_iter().collect::>(); + labels.sort(); + let mut detail_parts = Vec::new(); + if let Some(group_id) = builder.group_id.filter(|value| !value.is_empty()) { + detail_parts.push(format!("group:{group_id}")); + } + if let Some(attempt) = builder.attempt.filter(|value| !value.is_empty()) { + detail_parts.push(format!("attempt:{attempt}")); + } + detail_parts.push(format!("{} phases", builder.segments.len())); + by_rollout.entry(builder.rollout_id.clone()).or_default().push(RlSampleRow { + sample_key: builder.sample_key, + label: builder.label, + detail: detail_parts.join(" "), + start: builder.start, + end: builder.end, + process_labels: labels.join(", "), + segments: builder.segments, + }); + } + + let mut rollouts = by_rollout + .into_iter() + .map(|(rollout_id, mut samples)| { + samples.sort_by_key(|sample| sample.start); + let start = samples.iter().map(|sample| sample.start).min().unwrap_or(0); + let end = samples.iter().map(|sample| sample.end).max().unwrap_or(start); + RlRolloutView { + rollout_id, + start, + end, + samples, + } + }) + .collect::>(); + rollouts.sort_by(|a, b| { + numeric_string_sort_key(&a.rollout_id) + .cmp(&numeric_string_sort_key(&b.rollout_id)) + .then_with(|| a.rollout_id.cmp(&b.rollout_id)) + }); + rollouts +} + +fn build_train_rollout_views(spans: &[DisplaySpan]) -> Vec { + let mut all_spans = Vec::::new(); + collect_all_display_spans(spans, &mut all_spans); + + let mut batches = HashMap::::new(); + + for span in all_spans { + let Some(segment) = train_segment_from_span(&span) else { + continue; + }; + let Some(rollout_id) = attr_string(&span.attributes, "rollout_id") + .or_else(|| attr_string(&span.attributes, "step_id")) else { + continue; + }; + let train_step_id = attr_string(&span.attributes, "train_step_id"); + let batch_id = attr_string(&span.attributes, "batch_id"); + let Some(batch_key_id) = train_step_id.clone().or_else(|| batch_id.clone()) else { + continue; + }; + + let batch_key = format!("{rollout_id}:{batch_key_id}"); + let label = match (train_step_id, batch_id) { + (Some(train_step_id), Some(batch_id)) => format!("train_step:{train_step_id} batch:{batch_id}"), + (Some(train_step_id), None) => format!("train_step:{train_step_id}"), + (None, Some(batch_id)) => format!("batch:{batch_id}"), + (None, None) => batch_key_id, + }; + let entry = batches.entry(batch_key.clone()).or_insert_with(|| RlSampleBuilder { + sample_key: batch_key.clone(), + label, + rollout_id: rollout_id.clone(), + group_id: attr_string(&span.attributes, "role"), + attempt: attr_string(&span.attributes, "rank"), + start: segment.start, + end: segment.end, + ..Default::default() + }); + + entry.start = entry.start.min(segment.start); + entry.end = entry.end.max(segment.end); + if entry.group_id.is_none() { + entry.group_id = attr_string(&span.attributes, "role"); + } + if entry.attempt.is_none() { + entry.attempt = attr_string(&span.attributes, "rank"); + } + entry.process_labels.insert(span.process_label.clone()); + entry.segments.push(segment); + } + + let mut by_rollout = HashMap::>::new(); + for mut builder in batches.into_values() { + builder.segments.sort_by_key(|segment| segment.start); + let mut labels = builder.process_labels.into_iter().collect::>(); + labels.sort(); + let mut detail_parts = Vec::new(); + if let Some(role) = builder.group_id.filter(|value| !value.is_empty()) { + detail_parts.push(format!("role:{role}")); + } + if let Some(rank) = builder.attempt.filter(|value| !value.is_empty()) { + detail_parts.push(format!("rank:{rank}")); + } + detail_parts.push(format!("{} phases", builder.segments.len())); + by_rollout.entry(builder.rollout_id.clone()).or_default().push(RlSampleRow { + sample_key: builder.sample_key, + label: builder.label, + detail: detail_parts.join(" "), + start: builder.start, + end: builder.end, + process_labels: labels.join(", "), + segments: builder.segments, + }); + } + + let mut rollouts = by_rollout + .into_iter() + .map(|(rollout_id, mut samples)| { + samples.sort_by_key(|sample| sample.start); + let start = samples.iter().map(|sample| sample.start).min().unwrap_or(0); + let end = samples.iter().map(|sample| sample.end).max().unwrap_or(start); + RlRolloutView { + rollout_id, + start, + end, + samples, + } + }) + .collect::>(); + rollouts.sort_by(|a, b| { + numeric_string_sort_key(&a.rollout_id) + .cmp(&numeric_string_sort_key(&b.rollout_id)) + .then_with(|| a.rollout_id.cmp(&b.rollout_id)) + }); + rollouts +} + +fn collect_all_display_spans(spans: &[DisplaySpan], out: &mut Vec) { + for span in spans { + out.push(span.clone()); + collect_all_display_spans(&span.children, out); + } +} + +fn build_chrome_trace_json_from_display_spans(spans: &[DisplaySpan]) -> Option { + let mut all_spans = Vec::::new(); + collect_all_display_spans(spans, &mut all_spans); + let mut complete_spans = all_spans + .into_iter() + .filter(|span| span.end_timestamp.is_some()) + .collect::>(); + if complete_spans.is_empty() { + return None; + } + complete_spans.sort_by(|a, b| { + a.start_timestamp + .cmp(&b.start_timestamp) + .then_with(|| { + let a_duration = a.end_timestamp.unwrap_or(a.start_timestamp) - a.start_timestamp; + let b_duration = b.end_timestamp.unwrap_or(b.start_timestamp) - b.start_timestamp; + b_duration.cmp(&a_duration) + }) + }); + + let min_start = complete_spans + .iter() + .map(|span| span.start_timestamp) + .min() + .unwrap_or(0); + + let mut process_labels = complete_spans + .iter() + .map(perfetto_process_label) + .collect::>() + .into_iter() + .collect::>(); + process_labels.sort(); + let process_ids = process_labels + .iter() + .enumerate() + .map(|(idx, label)| (label.clone(), (idx + 1) as i64)) + .collect::>(); + + let track_keys = complete_spans + .iter() + .map(|span| (perfetto_process_label(span), perfetto_track_label(span))) + .collect::>() + .into_iter() + .collect::>(); + let mut track_keys = track_keys; + track_keys.sort(); + let track_ids = track_keys + .iter() + .enumerate() + .map(|(idx, key)| (key.clone(), (idx + 1) as i64)) + .collect::>(); + + let mut trace_events = Vec::::new(); + for label in process_labels { + let pid = *process_ids.get(&label).unwrap_or(&1); + trace_events.push(serde_json::json!({ + "name": "process_name", + "ph": "M", + "pid": pid, + "tid": 0, + "args": { + "name": label, + }, + })); + } + for (process_label, track_label) in track_keys { + let pid = *process_ids.get(&process_label).unwrap_or(&1); + let tid = *track_ids.get(&(process_label.clone(), track_label.clone())).unwrap_or(&1); + trace_events.push(serde_json::json!({ + "name": "thread_name", + "ph": "M", + "pid": pid, + "tid": tid, + "args": { + "name": track_label, + }, + })); + } + + for span in complete_spans { + let end = span.end_timestamp.unwrap_or(span.start_timestamp); + let duration = (end - span.start_timestamp).max(0) / 1000; + let ts = (span.start_timestamp - min_start).max(0) / 1000; + let process_label = perfetto_process_label(&span); + let pid = *process_ids.get(&process_label).unwrap_or(&1); + let track_label = perfetto_track_label(&span); + let tid = *track_ids + .get(&(process_label.clone(), track_label.clone())) + .unwrap_or(&span.thread_id); + let mut args = serde_json::Map::new(); + args.insert("span_id".to_string(), serde_json::json!(span.span_id)); + args.insert("trace_id".to_string(), serde_json::json!(span.trace_id)); + args.insert("process".to_string(), serde_json::json!(span.process_label)); + args.insert("perfetto_process".to_string(), serde_json::json!(process_label)); + args.insert("track".to_string(), serde_json::json!(track_label)); + if let Some(parent_id) = span.parent_id { + args.insert("parent_id".to_string(), serde_json::json!(parent_id)); + } + if let Some(location) = span.location.as_ref().filter(|value| !value.is_empty()) { + args.insert("location".to_string(), serde_json::json!(location)); + } + if let Some(attrs) = span.attributes.as_ref().filter(|value| !value.is_empty()) { + if let Ok(parsed) = serde_json::from_str::(attrs) { + args.insert("attributes".to_string(), parsed); + } + } + + trace_events.push(serde_json::json!({ + "name": span.name, + "cat": span.kind.unwrap_or_else(|| "span".to_string()), + "ph": "X", + "ts": ts, + "dur": duration, + "pid": pid, + "tid": tid, + "args": args, + })); + } + + Some(serde_json::json!({ + "traceEvents": trace_events, + "displayTimeUnit": "ms", + }).to_string()) +} + +fn perfetto_process_label(span: &DisplaySpan) -> String { + if let Some(rollout_id) = attr_string(&span.attributes, "rollout_id") { + return format!("rollout:{rollout_id}"); + } + span.process_label.clone() +} + +fn perfetto_track_label(span: &DisplaySpan) -> String { + let rollout_id = attr_string(&span.attributes, "rollout_id"); + let trajectory_id = attr_string(&span.attributes, "trajectory_id") + .or_else(|| attr_string(&span.attributes, "sample_id")) + .or_else(|| { + let group_id = attr_string(&span.attributes, "group_id")?; + let group_index = attr_string(&span.attributes, "group_index")?; + Some(format!("group:{group_id}/sample:{group_index}")) + }); + + if let Some(rollout_id) = rollout_id { + if let Some(trajectory_id) = trajectory_id { + return format!("rollout:{rollout_id} / {trajectory_id}"); + } + if span.name.starts_with("rollout.") || span.kind.as_deref().unwrap_or("").contains("rollout") { + return format!("rollout:{rollout_id} / control"); + } + return format!("rollout:{rollout_id}"); + } + + if let Some(batch_id) = attr_string(&span.attributes, "batch_id") + .or_else(|| attr_string(&span.attributes, "train_step_id")) + { + return format!("train:{batch_id}"); + } + + format!("{} / thread:{}", span.process_label, span.thread_id) +} + +fn rl_segment_from_span(span: &DisplaySpan) -> Option { + let end = span.end_timestamp?; + if attr_string(&span.attributes, "sample_id").is_none() + && attr_string(&span.attributes, "trajectory_id").is_none() + { + return None; + } + let phase = attr_string(&span.attributes, "phase") + .or_else(|| span.kind.clone()) + .unwrap_or_else(|| span.name.clone()); + + Some(RlPhaseSegment { + name: span.name.clone(), + phase, + start: span.start_timestamp, + end, + process_label: span.process_label.clone(), + span_id: span.span_id, + attributes: span.attributes.clone(), + turn_id: attr_string(&span.attributes, "turn_id"), + env_step_id: attr_string(&span.attributes, "env_step_id"), + }) +} + +fn train_segment_from_span(span: &DisplaySpan) -> Option { + let end = span.end_timestamp?; + let phase = attr_string(&span.attributes, "phase") + .or_else(|| span.kind.clone()) + .unwrap_or_else(|| span.name.clone()); + if !is_train_timeline_span( + &span.name, + &phase, + span.kind.as_deref(), + &span.attributes, + ) { + return None; + } + + Some(RlPhaseSegment { + name: span.name.clone(), + phase, + start: span.start_timestamp, + end, + process_label: span.process_label.clone(), + span_id: span.span_id, + attributes: span.attributes.clone(), + turn_id: None, + env_step_id: None, + }) +} + +fn numeric_string_sort_key(value: &str) -> i64 { + value.parse::().unwrap_or(i64::MAX) +} + +fn sample_duration_ns(sample: &RlSampleRow) -> i64 { + (sample.end - sample.start).max(0) +} + +fn rl_phase_bar_class(phase: &str) -> &'static str { + if phase.contains("inference") || phase.contains("generate") { + "absolute top-1 bottom-1 rounded bg-blue-500" + } else if phase.contains("env") { + "absolute top-1 bottom-1 rounded bg-amber-500" + } else if phase.contains("tool") { + "absolute top-1 bottom-1 rounded bg-violet-500" + } else if phase.contains("reward") { + "absolute top-1 bottom-1 rounded bg-pink-500" + } else if phase.contains("train") || phase.contains("optimizer") { + "absolute top-1 bottom-1 rounded bg-emerald-500" + } else { + "absolute top-1 bottom-1 rounded bg-slate-500" + } +} + +fn rl_phase_dot_class(phase: &str) -> &'static str { + if phase.contains("inference") || phase.contains("generate") { + "h-2.5 w-2.5 flex-shrink-0 rounded-full bg-blue-500" + } else if phase.contains("env") { + "h-2.5 w-2.5 flex-shrink-0 rounded-full bg-amber-500" + } else if phase.contains("tool") { + "h-2.5 w-2.5 flex-shrink-0 rounded-full bg-violet-500" + } else if phase.contains("reward") { + "h-2.5 w-2.5 flex-shrink-0 rounded-full bg-pink-500" + } else if phase.contains("train") || phase.contains("optimizer") { + "h-2.5 w-2.5 flex-shrink-0 rounded-full bg-emerald-500" + } else { + "h-2.5 w-2.5 flex-shrink-0 rounded-full bg-slate-500" + } +} + +fn collect_timeline_spans(spans: &[DisplaySpan], depth: usize, max_depth: usize, rows: &mut Vec) { + for span in spans { + if depth < max_depth { + if let Some(end) = span.end_timestamp { + rows.push(TimelineSpan { + unique_key: span.unique_key.clone(), + name: span.name.clone(), + display_id: span.display_id.clone(), + span_id: span.span_id, + kind: span.kind.clone(), + location: span.location.clone(), + start: span.start_timestamp, + duration: (end - span.start_timestamp).max(0), + depth, + process_label: span.process_label.clone(), + }); + } + } + collect_timeline_spans(&span.children, depth + 1, max_depth, rows); + } +} + +fn build_display_spans(spans: &[SpanInfo]) -> Vec { + let mut counters = HashMap::::new(); + let mut sorted = spans.to_vec(); + sorted.sort_by_key(|span| span.start_timestamp); + sorted + .iter() + .map(|span| build_display_span(span, &mut counters)) + .collect() +} + +fn build_display_span(span: &SpanInfo, counters: &mut HashMap) -> DisplaySpan { + let counter_key = span.phase + .as_ref() + .map(|phase| format!("{}:{phase}", span.name)) + .unwrap_or_else(|| span.name.clone()); + let next_id = counters.entry(counter_key).or_insert(0); + *next_id += 1; + let display_id = format!("{}#{}", span.name, *next_id); + let process_label = process_label(&span.attributes, span.trace_id); + let unique_key = format!("{}:{}:{}", process_label, span.trace_id, span.span_id); + + let mut children = span.children.clone(); + children.sort_by_key(|child| child.start_timestamp); + let children = children + .iter() + .map(|child| build_display_span(child, counters)) + .collect(); + + DisplaySpan { + unique_key, + span_id: span.span_id, + trace_id: span.trace_id, + parent_id: span.parent_id, + name: span.name.clone(), + display_id, + start_timestamp: span.start_timestamp, + end_timestamp: span.end_timestamp, + thread_id: span.thread_id, + kind: span.phase.clone(), + location: span.location.clone(), + attributes: span.attributes.clone(), + process_label, + children, + events: span.events.clone(), + } +} + +fn collect_process_options(spans: &[DisplaySpan], discovered_processes: &[TraceProcessInfo]) -> Vec { + let mut by_pid = HashMap::::new(); + let mut all_spans = Vec::::new(); + collect_all_display_spans(spans, &mut all_spans); + + for process in discovered_processes { + by_pid.entry(process.pid.to_string()).or_insert(FilterOption { + filter_key: format!("pid:{}", process.pid), + label: trace_process_label(process), + }); + } + + for span in all_spans { + let Some(pid) = process_pid_from_attrs(&span.attributes) else { + continue; + }; + let role = attr_string(&span.attributes, "process_role").unwrap_or_else(|| "process".to_string()); + let actor_name = attr_string(&span.attributes, "ray_actor_name"); + let worker_id = attr_string(&span.attributes, "ray_worker_id") + .map(|id| short_id(&id)); + let mut parts = vec![format!("{role}:{pid}")]; + if let Some(actor_name) = actor_name.filter(|value| !value.is_empty()) { + parts.push(actor_name); + } + if let Some(worker_id) = worker_id.filter(|value| !value.is_empty()) { + parts.push(format!("worker:{worker_id}")); + } + by_pid.entry(pid.clone()).or_insert(FilterOption { + filter_key: format!("pid:{pid}"), + label: parts.join(" | "), + }); + } + + let mut options = by_pid.into_values().collect::>(); + options.sort_by(|a, b| process_option_rank(a).cmp(&process_option_rank(b)) + .then_with(|| a.label.cmp(&b.label))); + options +} + +fn trace_process_label(process: &TraceProcessInfo) -> String { + let role = process.process_role.as_deref().unwrap_or("process"); + let mut parts = vec![format!("{role}:{}", process.pid)]; + if let Some(actor_name) = process.ray_actor_name.as_ref().filter(|value| !value.is_empty()) { + parts.push(actor_name.clone()); + } + if let Some(worker_id) = process.ray_worker_id.as_ref().filter(|value| !value.is_empty()) { + parts.push(format!("worker:{}", short_id(worker_id))); + } + parts.join(" | ") +} + +fn collect_function_options(spans: &[DisplaySpan]) -> Vec { + let mut counts = HashMap::::new(); + let mut all_spans = Vec::::new(); + collect_all_display_spans(spans, &mut all_spans); + + for span in all_spans { + *counts.entry(span.name).or_insert(0) += 1; + } + + let mut options = counts + .into_iter() + .map(|(name, count)| FilterOption { + filter_key: name.clone(), + label: format!("{name} ({count})"), + }) + .collect::>(); + options.sort_by(|a, b| a.filter_key.cmp(&b.filter_key)); + options +} + +fn filter_display_spans( + spans: &[DisplaySpan], + process_filter: &str, + function_filter: &str, +) -> Vec { + let mut filtered = Vec::new(); + collect_filtered_display_spans(spans, process_filter, function_filter, &mut filtered); + if filtered.is_empty() && process_filter == "driver" && function_filter.is_empty() { + spans.to_vec() + } else { + filtered + } +} + +fn collect_filtered_display_spans( + spans: &[DisplaySpan], + process_filter: &str, + function_filter: &str, + out: &mut Vec, +) { + for span in spans { + let mut children = Vec::new(); + collect_filtered_display_spans(&span.children, process_filter, function_filter, &mut children); + + if process_filter_matches(span, process_filter) && function_filter_matches(span, function_filter) { + let mut cloned = span.clone(); + cloned.children = children; + out.push(cloned); + } else { + out.extend(children); + } + } +} + +fn process_filter_matches(span: &DisplaySpan, process_filter: &str) -> bool { + if process_filter.is_empty() || process_filter == "all" { + return true; + } + if process_filter == "driver" { + return attr_string(&span.attributes, "process_role") + .map(|role| role.contains("driver")) + .unwrap_or(false); + } + if let Some(pid_filter) = process_filter.strip_prefix("pid:") { + return process_pid_from_attrs(&span.attributes).as_deref() == Some(pid_filter); + } + false +} + +fn function_filter_matches(span: &DisplaySpan, function_filter: &str) -> bool { + function_filter.is_empty() || span.name == function_filter +} + +fn collect_span_process_pids(spans: &[SpanInfo]) -> HashSet { + let mut pids = HashSet::new(); + for span in spans { + if let Some(pid) = process_pid_from_attrs(&span.attributes) + .and_then(|pid| pid.parse::().ok()) + { + pids.insert(pid); + } + pids.extend(collect_span_process_pids(&span.children)); + } + pids +} + +fn process_pid_from_attrs(attributes: &Option) -> Option { + attr_string(attributes, "pid").filter(|pid| !pid.is_empty() && pid != "0") +} + +fn short_id(value: &str) -> String { + if value.len() > 8 { + value[..8].to_string() + } else { + value.to_string() + } +} + +fn process_option_rank(option: &FilterOption) -> usize { + if option.label.contains("driver") { + 0 + } else if option.label.contains("rollout") { + 1 + } else { + 2 + } +} + +fn collect_batch_options(spans: &[DisplaySpan]) -> Vec { + let mut rows = Vec::new(); + collect_batches(spans, &mut rows); + rows.sort_by_key(|row| row.start); + rows +} + +fn collect_batches(spans: &[DisplaySpan], rows: &mut Vec) { + for span in spans { + let is_batch = span.name == "batch" + || is_step_parent_span(&span.name, span.kind.as_deref()); + if is_batch { + let duration = span + .end_timestamp + .map(|end| (end - span.start_timestamp).max(0)) + .unwrap_or(0); + rows.push(TimelineSpan { + unique_key: span.unique_key.clone(), + name: span.name.clone(), + display_id: span.display_id.clone(), + span_id: span.span_id, + kind: span.kind.clone(), + location: span.location.clone(), + start: span.start_timestamp, + duration, + depth: 0, + process_label: span.process_label.clone(), + }); + } + collect_batches(&span.children, rows); + } +} + +fn find_display_span<'a>(spans: &'a [DisplaySpan], unique_key: &str) -> Option<&'a DisplaySpan> { + for span in spans { + if span.unique_key == unique_key { + return Some(span); + } + if let Some(found) = find_display_span(&span.children, unique_key) { + return Some(found); + } + } + None +} + +fn cross_process_link_summary_view(spans: &[DisplaySpan]) -> CrossProcessLinkSummaryView { + let mut summary = CrossProcessLinkSummaryView::default(); + let mut orphan_keys = HashMap::::new(); + collect_cross_process_link_summary(spans, false, &mut summary, &mut orphan_keys); + let mut orphan_keys = orphan_keys.into_iter().collect::>(); + orphan_keys.sort_by(|a, b| b.1.cmp(&a.1).then_with(|| a.0.cmp(&b.0))); + summary.orphan_keys = orphan_keys + .into_iter() + .take(3) + .map(|(key, count)| format!("{key}:{count}")) + .collect::>() + .join(", "); + summary +} + +fn collect_cross_process_link_summary( + spans: &[DisplaySpan], + under_logical_parent: bool, + summary: &mut CrossProcessLinkSummaryView, + orphan_keys: &mut HashMap, +) { + for span in spans { + let is_parent = is_display_cross_process_parent_span(span); + let under_parent = under_logical_parent || is_parent; + if is_parent { + summary.parents += 1; + } + + if is_display_cross_process_child_candidate(span) { + if under_logical_parent { + summary.linked += 1; + } else { + summary.orphan += 1; + if let Some(key) = display_logical_step_key(span) { + let key = format!("{}/{}", key.rollout_id, key.step_id); + *orphan_keys.entry(key).or_insert(0) += 1; + } + } + } + + collect_cross_process_link_summary(&span.children, under_parent, summary, orphan_keys); + } +} + +fn is_display_logical_parent_span(span: &DisplaySpan) -> bool { + is_step_parent_span(&span.name, span.kind.as_deref()) + && !is_rollout_submit_parent_span(&span.name) +} + +fn is_display_submit_parent_span(span: &DisplaySpan) -> bool { + is_rollout_submit_parent_span(&span.name) +} + +fn is_display_cross_process_parent_span(span: &DisplaySpan) -> bool { + is_display_logical_parent_span(span) || is_display_submit_parent_span(span) +} + +fn is_display_cross_process_child_candidate(span: &DisplaySpan) -> bool { + if display_logical_step_key(span).is_none() || is_display_cross_process_parent_span(span) { + return false; + } + + let role = attr_string(&span.attributes, "process_role") + .or_else(|| attr_string(&span.attributes, "actor_role")) + .unwrap_or_default(); + is_rollout_worker_role(&role) || span.name.starts_with("custom.generate") +} + +fn display_logical_step_key(span: &DisplaySpan) -> Option { + let rollout_id = attr_string(&span.attributes, "rollout_id")?; + let step_id = attr_string(&span.attributes, "step_id")?; + + if rollout_id == "-1" || step_id == "-1" { + return None; + } + + Some(LogicalStepKey { rollout_id, step_id }) +} + +fn expanded_trace_fetch_limit(limit: usize) -> usize { + limit.saturating_mul(5).min(10_000).max(limit) +} + +fn link_cross_process_spans(spans: Vec) -> Vec { + let mut linked_roots = Vec::new(); + let mut pending_children = Vec::new(); + + split_cross_process_candidates(spans, &mut linked_roots, &mut pending_children); + + pending_children.sort_by_key(|span| span.start_timestamp); + for child in pending_children { + if let Some(key) = logical_step_key(&child) { + if attach_to_logical_parent(&mut linked_roots, &key, child.clone()) { + continue; + } + } + if let Some(key) = submit_link_key(&child) { + if attach_to_submit_parent(&mut linked_roots, &key, child.clone()) { + continue; + } + } + if attach_to_time_parent(&mut linked_roots, child.clone()) { + continue; + } + if let Some(rollout_id) = logical_rollout_id(&child) { + if attach_to_single_rollout_parent(&mut linked_roots, &rollout_id, child.clone()) { + continue; + } + } + linked_roots.push(child); + } + + sort_span_tree(&mut linked_roots); + linked_roots +} + +fn split_cross_process_candidates( + spans: Vec, + linked_roots: &mut Vec, + pending_children: &mut Vec, +) { + for mut span in spans { + if rl_contract::is_cross_process_child_candidate(&span) { + pending_children.push(span); + continue; + } + + let children = std::mem::take(&mut span.children); + split_cross_process_candidates(children, &mut span.children, pending_children); + linked_roots.push(span); + } +} + +fn is_logical_parent_span(span: &SpanInfo) -> bool { + is_step_parent_span(&span.name, span.phase.as_deref()) + && !is_rollout_submit_parent_span(&span.name) +} + +fn is_submit_parent_span(span: &SpanInfo) -> bool { + is_rollout_submit_parent_span(&span.name) +} + +fn submit_link_key(span: &SpanInfo) -> Option { + let rollout_id = attr_string(&span.attributes, "rollout_id")?; + let submit_step_id = attr_string(&span.attributes, "submit_step_id")?; + + if rollout_id == "-1" { + return None; + } + + Some(LogicalStepKey { + rollout_id, + step_id: submit_step_id, + }) +} + +fn logical_rollout_id(span: &SpanInfo) -> Option { + let rollout_id = attr_string(&span.attributes, "rollout_id")?; + if rollout_id == "-1" { + None + } else { + Some(rollout_id) + } +} + +fn attach_to_logical_parent(spans: &mut [SpanInfo], key: &LogicalStepKey, child: SpanInfo) -> bool { + for span in spans { + if is_logical_parent_span(span) && logical_step_key(span).as_ref() == Some(key) { + span.children.push(child); + span.children.sort_by_key(|child| child.start_timestamp); + return true; + } + + if attach_to_logical_parent(&mut span.children, key, child.clone()) { + return true; + } + } + false +} + +fn attach_to_submit_parent(spans: &mut [SpanInfo], key: &LogicalStepKey, child: SpanInfo) -> bool { + for span in spans { + if is_submit_parent_span(span) && submit_parent_matches(span, key) { + span.children.push(child); + span.children.sort_by_key(|child| child.start_timestamp); + return true; + } + + if attach_to_submit_parent(&mut span.children, key, child.clone()) { + return true; + } + } + false +} + +fn submit_parent_matches(span: &SpanInfo, key: &LogicalStepKey) -> bool { + let rollout_id = attr_string(&span.attributes, "rollout_id"); + let submit_step_id = attr_string(&span.attributes, "submit_step_id") + .or_else(|| attr_string(&span.attributes, "step_id")); + rollout_id.as_deref() == Some(key.rollout_id.as_str()) + && submit_step_id.as_deref() == Some(key.step_id.as_str()) +} + +fn attach_to_single_rollout_parent(spans: &mut [SpanInfo], rollout_id: &str, child: SpanInfo) -> bool { + let mut matches = Vec::>::new(); + let mut current_path = Vec::::new(); + find_rollout_parent_paths(spans, rollout_id, &mut current_path, &mut matches); + + if matches.len() != 1 { + return false; + } + + if let Some(parent) = get_span_mut_by_path(spans, &matches[0]) { + parent.children.push(child); + parent.children.sort_by_key(|child| child.start_timestamp); + return true; + } + + false +} + +fn find_rollout_parent_paths( + spans: &[SpanInfo], + rollout_id: &str, + current_path: &mut Vec, + matches: &mut Vec>, +) { + for (index, span) in spans.iter().enumerate() { + current_path.push(index); + + if is_logical_parent_span(span) && logical_rollout_id(span).as_deref() == Some(rollout_id) { + matches.push(current_path.clone()); + } + + find_rollout_parent_paths(&span.children, rollout_id, current_path, matches); + current_path.pop(); + } +} + +fn attach_to_time_parent(spans: &mut [SpanInfo], child: SpanInfo) -> bool { + let mut best_path = Vec::::new(); + let mut current_path = Vec::::new(); + let mut best_duration: Option = None; + find_time_parent_path(spans, &child, &mut current_path, &mut best_path, &mut best_duration); + + if best_path.is_empty() { + return false; + } + + if let Some(parent) = get_span_mut_by_path(spans, &best_path) { + parent.children.push(child); + parent.children.sort_by_key(|child| child.start_timestamp); + return true; + } + + false +} + +fn find_time_parent_path( + spans: &[SpanInfo], + child: &SpanInfo, + current_path: &mut Vec, + best_path: &mut Vec, + best_duration: &mut Option, +) { + for (index, span) in spans.iter().enumerate() { + current_path.push(index); + + if is_logical_parent_span(span) && span_contains_child(span, child) { + let duration = span + .end_timestamp + .map(|end| end - span.start_timestamp) + .unwrap_or(i64::MAX); + if best_duration.map(|best| duration < best).unwrap_or(true) { + *best_duration = Some(duration); + *best_path = current_path.clone(); + } + } + + find_time_parent_path(&span.children, child, current_path, best_path, best_duration); + current_path.pop(); + } +} + +fn span_contains_child(parent: &SpanInfo, child: &SpanInfo) -> bool { + let child_end = child.end_timestamp.unwrap_or(child.start_timestamp); + let parent_end = parent.end_timestamp.unwrap_or(i64::MAX); + child.start_timestamp >= parent.start_timestamp && child_end <= parent_end +} + +fn get_span_mut_by_path<'a>(spans: &'a mut [SpanInfo], path: &[usize]) -> Option<&'a mut SpanInfo> { + let (first, rest) = path.split_first()?; + let span = spans.get_mut(*first)?; + if rest.is_empty() { + Some(span) + } else { + get_span_mut_by_path(&mut span.children, rest) + } +} + +fn sort_span_tree(spans: &mut [SpanInfo]) { + spans.sort_by_key(|span| span.start_timestamp); + for span in spans { + sort_span_tree(&mut span.children); + } +} + +fn process_label(attributes: &Option, fallback_trace_id: i64) -> String { + let role = attr_string(attributes, "process_role").unwrap_or_else(|| "process".to_string()); + let pid = attr_string(attributes, "pid"); + match pid { + Some(pid) if !pid.is_empty() => format!("{role}:{pid}"), + _ => format!("{role}:{fallback_trace_id}"), + } +} + +fn attr_string(attributes: &Option, key: &str) -> Option { + let attrs = attributes.as_ref()?; + let value = serde_json::from_str::(attrs).ok()?; + let raw = value.get(key)?; + match raw { + serde_json::Value::String(s) => Some(s.clone()), + serde_json::Value::Number(n) => Some(n.to_string()), + serde_json::Value::Bool(b) => Some(b.to_string()), + _ => None, + } +} + +fn format_duration_ns(duration_ns: i64) -> String { + let duration_ns = duration_ns.max(0) as f64; + if duration_ns >= 1_000_000_000.0 { + format!("{:.3}s", duration_ns / 1_000_000_000.0) + } else if duration_ns >= 1_000_000.0 { + format!("{:.3}ms", duration_ns / 1_000_000.0) + } else if duration_ns >= 1_000.0 { + format!("{:.3}us", duration_ns / 1_000.0) + } else { + format!("{:.0}ns", duration_ns) + } +} + +#[component] +fn EventView(event: EventInfo) -> Element { + rsx! { + div { + class: "flex items-center gap-2 py-1 text-sm", + span { + class: "text-gray-400", + "•" + } + span { + class: "text-gray-700", + "{event.name}" + } + if let Some(ref attrs) = event.attributes { + if !attrs.is_empty() { + span { + class: "text-xs text-gray-500 font-mono", + "{attrs}" + } + } + } + } + } +} + +mod inference; +pub use inference::Inference; diff --git a/web/src/rl_contract.rs b/web/src/rl_contract.rs new file mode 100644 index 00000000..42407d7e --- /dev/null +++ b/web/src/rl_contract.rs @@ -0,0 +1,117 @@ +//! Framework-neutral RL span classification rules. +//! +//! Any RL framework can drive the Probing UI by attaching standard span attributes +//! (see `probing.rl.STANDARD_ATTRS` in the Python SDK). The frontend only interprets +//! these generic fields — never framework-specific names. + +use crate::api::SpanInfo; + +pub fn attr_string(attributes: &Option, key: &str) -> Option { + let attrs = attributes.as_ref()?; + let value = serde_json::from_str::(attrs).ok()?; + let raw = value.get(key)?; + match raw { + serde_json::Value::String(s) => Some(s.clone()), + serde_json::Value::Number(n) => Some(n.to_string()), + serde_json::Value::Bool(b) => Some(b.to_string()), + _ => None, + } +} + +/// Rollout/sample timeline requires trajectory or sample identity on each span. +pub fn has_trajectory_identity(attributes: &Option) -> bool { + attr_string(attributes, "trajectory_id").is_some() || attr_string(attributes, "sample_id").is_some() +} + +/// Training timeline spans must be tagged as train phases and keyed by step/batch. +pub fn is_train_phase_span( + name: &str, + phase: &str, + kind: Option<&str>, + attributes: &Option, +) -> bool { + if phase.starts_with("train") || name.starts_with("train.") { + return true; + } + if attr_string(attributes, "actor_role").as_deref() == Some("trainer") { + return true; + } + matches!(kind, Some("rl.train") | Some("train.step") | Some("rl.phase")) + && (phase.contains("train") || name.contains("train")) +} + +pub fn is_train_timeline_span( + name: &str, + phase: &str, + kind: Option<&str>, + attributes: &Option, +) -> bool { + if attr_string(attributes, "train_step_id").is_none() && attr_string(attributes, "batch_id").is_none() + { + return false; + } + is_train_phase_span(name, phase, kind, attributes) +} + +/// Parent span that groups a distributed rollout/train step across processes. +pub fn is_step_parent_span(name: &str, kind: Option<&str>) -> bool { + name == "rollout.step" + || name == "train.step" + || name == "rollout.submit" + || name == "rollout.submit_next" + || matches!(kind, Some("rl.step") | Some("train.step")) +} + +pub fn is_rollout_submit_parent_span(name: &str) -> bool { + name == "rollout.submit" || name == "rollout.submit_next" +} + +/// Worker process that executes rollout logic (framework sets `actor_role` or `process_role`). +pub fn is_rollout_worker_role(role: &str) -> bool { + role == "rollout" + || role == "rollout_actor" + || role.ends_with("_rollout") + || role.contains("rollout_worker") +} + +pub fn is_cross_process_child_candidate(span: &SpanInfo) -> bool { + if logical_step_key(span).is_none() || is_cross_process_parent_span(span) { + return false; + } + + let role = attr_string(&span.attributes, "process_role") + .or_else(|| attr_string(&span.attributes, "actor_role")) + .unwrap_or_default(); + is_rollout_worker_role(&role) || span.name.starts_with("custom.generate") +} + +pub fn is_cross_process_parent_span(span: &SpanInfo) -> bool { + is_step_parent_span(&span.name, span.phase.as_deref()) +} + +pub fn logical_step_key(span: &SpanInfo) -> Option { + let rollout_id = attr_string(&span.attributes, "rollout_id") + .or_else(|| attr_string(&span.attributes, "step_id"))?; + let step_id = attr_string(&span.attributes, "step_id") + .or_else(|| attr_string(&span.attributes, "train_step_id"))?; + + if rollout_id == "-1" || step_id == "-1" { + return None; + } + + Some(LogicalStepKey { rollout_id, step_id }) +} + +#[derive(Clone, Eq, PartialEq)] +pub struct LogicalStepKey { + pub rollout_id: String, + pub step_id: String, +} + +/// User-facing hint when train timeline has no matching spans. +pub const TRAIN_TIMELINE_EMPTY_HINT: &str = + "No train batch spans found. Tag spans with rollout_id, train_step_id or batch_id, and phase=train.* via probing.rl."; + +/// User-facing hint when rollout timeline has no matching spans. +pub const ROLLOUT_TIMELINE_EMPTY_HINT: &str = + "No rollout trajectory spans found. Tag spans with rollout_id plus trajectory_id or sample_id via probing.rl."; diff --git a/web/src/state/mod.rs b/web/src/state/mod.rs index 36cd80f3..5a52e8da 100644 --- a/web/src/state/mod.rs +++ b/web/src/state/mod.rs @@ -7,6 +7,7 @@ pub mod overlays; pub mod page_context; pub mod profile_snapshots; pub mod profiling; +pub mod rl; pub mod scroll_lock; pub mod sidebar; pub mod source_viewer; diff --git a/web/src/state/rl.rs b/web/src/state/rl.rs new file mode 100644 index 00000000..5da09838 --- /dev/null +++ b/web/src/state/rl.rs @@ -0,0 +1,20 @@ +//! Shared RL observability state (rollout filter persists across RL views). + +use dioxus::prelude::*; + +pub static ROLLOUT_FILTER: GlobalSignal = Signal::global(|| String::new()); +pub static ROLLOUT_FILTER_INPUT: GlobalSignal = Signal::global(|| String::new()); + +/// Height of the pinned rollout/train detail panel (px). Synced for main content padding. +pub static RL_DETAIL_PANEL_HEIGHT: GlobalSignal = Signal::global(|| 256); + +pub const RL_DETAIL_PANEL_HEIGHT_DEFAULT: u32 = 256; +pub const RL_DETAIL_PANEL_HEIGHT_MIN: u32 = 120; +pub const RL_DETAIL_PANEL_HEIGHT_MAX: u32 = 1200; + +pub fn estimate_detail_panel_height(segment_count: usize) -> u32 { + let estimated = 108u32.saturating_add(segment_count as u32 * 44); + estimated + .max(RL_DETAIL_PANEL_HEIGHT_MIN) + .min(RL_DETAIL_PANEL_HEIGHT_MAX) +} From 8102d3adacaa6b49d67960b11beb182bb68c2eb1 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sun, 26 Jul 2026 10:15:27 +0800 Subject: [PATCH 21/37] Update Makefile and documentation for example paths and soak scripts (#73) * Update Makefile and documentation for example paths and soak scripts - Updated the Makefile to change the benchmark script path to `examples/overhead/bench_instrumentation.py` and adjusted soak script paths to `examples/imagenet/run_soak.sh`. - Modified soak-related commands in the Makefile to reflect the new script locations. - Enhanced documentation to clarify the new paths for example scripts and their usage in soak testing. These changes aim to improve the organization of example scripts and ensure accurate references in the documentation. * Refactor probing repository root detection and enhance CLI script handling - Updated the `probing_repo_root` function to improve the detection of the probing repository by checking for the presence of `pyproject.toml` and the `python/probing` directory. - Modified the main script to utilize the new `probing_repo_root` function for determining the root path when executing the `pretrain_gpt` command, ensuring better compatibility with different project layouts. - Added a new test for the `_is_probing_repo` function to validate its behavior under various directory structures, enhancing test coverage and reliability. These changes aim to streamline the probing repository detection process and improve the overall robustness of the CLI scripts. --- .github/workflows/soak.yml | 12 +- Makefile | 10 +- docs/rl/agent-runtime.md | 2 +- docs/rl/inference-engine-metrics.md | 2 +- docs/src/contributing.md | 2 +- docs/src/contributing.zh.md | 2 +- docs/src/design/nccl-profiler.md | 11 +- docs/src/design/nccl-profiler.zh.md | 10 +- docs/src/design/overhead.md | 16 +- docs/src/design/overhead.zh.md | 18 +- docs/src/design/profiling.md | 8 +- docs/src/design/profiling.zh.md | 8 +- docs/src/design/torchrun-cluster.md | 6 +- docs/src/design/torchrun-cluster.zh.md | 10 +- docs/src/design/tracing-spans.zh.md | 2 +- docs/src/reference/env-vars.md | 9 +- docs/src/reference/env-vars.zh.md | 2 +- examples/README.md | 153 +- examples/cluster/README.md | 20 + .../{ => cluster}/cluster_multinode_demo.py | 2 +- .../run_multinode.sh} | 10 +- examples/crash/README.md | 22 + examples/{ => crash}/crash_demo.py | 2 +- examples/{ => crash}/crash_torchrun_demo.py | 2 +- examples/crash/run_demo.sh | 14 + .../run_torchrun.sh} | 6 +- examples/getting-started/README.md | 33 + .../child_test_probing.py | 0 .../{ => getting-started}/external_table.py | 0 examples/{ => getting-started}/hooks.py | 0 .../{ => getting-started}/nogil_sleep.pyx | 0 .../getting-started/run_external_table.sh | 10 + examples/getting-started/run_hooks.sh | 10 + examples/getting-started/run_test.sh | 11 + examples/getting-started/run_tracing.sh | 11 + .../{ => getting-started}/test_probing.py | 0 examples/{ => getting-started}/tracing.py | 4 +- examples/imagenet/README.md | 33 + examples/{ => imagenet}/imagenet.py | 0 examples/{ => imagenet}/imagenet_with_span.py | 2 +- .../run_ddp.sh} | 10 +- examples/{ => imagenet}/run_soak.sh | 12 +- examples/{ => imagenet}/soak_assert.py | 2 +- examples/inference/README.md | 26 + .../run_sglang_demo.sh} | 0 examples/{ => inference}/run_vllm_soak.sh | 10 +- .../sglang_inference_metrics_demo.py | 8 +- examples/{ => inference}/vllm_offline_soak.py | 4 +- examples/job-tracker/README.md | 17 + examples/{ => job-tracker}/job_tracker.py | 0 .../{ => job-tracker}/job_tracker_via_init.py | 0 examples/job-tracker/run.sh | 18 + examples/megatron/README.md | 35 + .../megatron_mcore_train_loop.py | 0 examples/megatron/megatron_meta_debug_loop.py | 35 + examples/megatron/pretrain_gpt.py | 145 + examples/megatron/run_fakes.sh | 15 + examples/megatron/run_megatron_lm_pretrain.py | 31 + examples/megatron/run_real_lm.sh | 12 + .../run_soak.sh} | 12 +- examples/overhead/README.md | 26 + .../{ => overhead}/bench_instrumentation.py | 10 +- examples/{ => overhead}/bench_profiler.py | 0 .../{ => overhead}/nccl_profiler_overhead.py | 4 +- examples/overhead/run_bench.sh | 11 + .../run_nccl_bench.sh} | 10 +- examples/overhead/run_torch_probe_smoke.sh | 10 + .../torch_probe_overhead_smoke.py | 4 +- examples/ray/README.md | 21 + examples/{ => ray}/ray_job_actor_span_demo.py | 0 examples/{ => ray}/ray_tracing_example.py | 0 examples/ray/run_job_actor.sh | 12 + examples/ray/run_tracing.sh | 10 + ppt/convert_to_pdf.py | 90 + ppt/probing-presentation.html | 2357 ++++++ ppt/probing-presentation.pdf | Bin 0 -> 1567451 bytes ppt/probing-print.html | 2310 +++++ probing/core/src/core/mod.rs | 4 +- probing/extensions/nccl-profiler/README.md | 2 +- .../python/src/features/stacktrace/capture.rs | 6 +- probing/memtable/src/docs.rs | 10 +- probing/server/src/server/system.rs | 8 +- .../bundled_skills/comm_bottleneck/SKILL.md | 2 +- .../bundled_skills/comm_bottleneck/steps.yaml | 2 +- .../bundled_web/public/assets/logo.svg | 96 + .../bundled_web/public/assets/tailwind.css | 7542 +++++++++++++++++ .../public/assets/web-dxh50ad7a34ffc43ea1.js | 5 + .../assets/web-dxh50ad7a34ffc43ea1.js.br | Bin 0 -> 13319 bytes .../assets/web_bg-dxh9628c8b4a0d6e07b.wasm | Bin 0 -> 5365209 bytes .../assets/web_bg-dxh9628c8b4a0d6e07b.wasm.br | Bin 0 -> 1103986 bytes python/probing/bundled_web/public/logo.svg | 96 + python/probing/ext/engines/__init__.py | 6 +- .../probing/ext/engines/mock_sglang_server.py | 10 +- python/probing/ext/engines/prometheus.py | 12 +- python/probing/ext/engines/scraper.py | 10 +- python/probing/ext/engines/sglang.py | 21 +- python/probing/ext/ray.py | 8 +- python/probing/ext/slime.py | 4 +- python/probing/ext/torch.py | 2 +- python/probing/fakes/README.md | 82 + python/probing/fakes/__init__.py | 211 + python/probing/fakes/__main__.py | 117 + python/probing/fakes/bottom.py | 65 + python/probing/fakes/device.py | 468 + python/probing/fakes/finder.py | 157 + python/probing/fakes/helpers_cpp.py | 179 + python/probing/fakes/journal.py | 195 + python/probing/fakes/loop.py | 96 + python/probing/fakes/megatron_lm.py | 415 + python/probing/fakes/pretrain.py | 172 + python/probing/fakes/registry.py | 102 + python/probing/fakes/specs/__init__.py | 6 + python/probing/fakes/specs/cuda_extras.py | 263 + python/probing/fakes/specs/megatron.py | 753 ++ python/probing/fakes/torch_hooks.py | 214 + python/probing/fakes/verify.py | 146 + python/probing/handlers/pythonext.py | 40 +- python/probing/profiling/collective/config.py | 24 +- python/probing/rl.py | 8 +- tests/ext/test_sglang_real_engine.py | 4 +- tests/regression/ext/README.md | 23 +- .../ext/test_collective_autostart.py | 6 +- tests/regression/ext/test_comm_collective.py | 8 +- tests/regression/ext/test_megatron_real_lm.py | 89 + .../test_collective_policy.py | 6 +- tests/unit/probing/ext/test_slime.py | 3 +- tests/unit/probing/fakes/test_fakes.py | 284 + .../probing/fakes/test_megatron_lm_env.py | 131 + tests/unit/probing/test_entrypoint.py | 10 +- web/src/api/rl.rs | 76 +- web/src/components/overhead/panel.rs | 2 +- web/src/components/rl/metrics_line_chart.rs | 13 +- web/src/components/rl/mod.rs | 2 - web/src/pages/rl/inference.rs | 51 +- web/src/pages/rl/mod.rs | 503 +- web/src/pages/training.rs | 2 +- web/src/rl_contract.rs | 17 +- web/src/state/rl.rs | 8 +- 138 files changed, 17949 insertions(+), 590 deletions(-) create mode 100644 examples/cluster/README.md rename examples/{ => cluster}/cluster_multinode_demo.py (95%) rename examples/{run_cluster_multinode.sh => cluster/run_multinode.sh} (93%) create mode 100644 examples/crash/README.md rename examples/{ => crash}/crash_demo.py (90%) rename examples/{ => crash}/crash_torchrun_demo.py (95%) create mode 100755 examples/crash/run_demo.sh rename examples/{run_crash_torchrun.sh => crash/run_torchrun.sh} (76%) create mode 100644 examples/getting-started/README.md rename examples/{ => getting-started}/child_test_probing.py (100%) rename examples/{ => getting-started}/external_table.py (100%) rename examples/{ => getting-started}/hooks.py (100%) rename examples/{ => getting-started}/nogil_sleep.pyx (100%) create mode 100755 examples/getting-started/run_external_table.sh create mode 100755 examples/getting-started/run_hooks.sh create mode 100755 examples/getting-started/run_test.sh create mode 100755 examples/getting-started/run_tracing.sh rename examples/{ => getting-started}/test_probing.py (100%) rename examples/{ => getting-started}/tracing.py (97%) create mode 100644 examples/imagenet/README.md rename examples/{ => imagenet}/imagenet.py (100%) rename examples/{ => imagenet}/imagenet_with_span.py (99%) rename examples/{run_imagenet_ddp.sh => imagenet/run_ddp.sh} (95%) rename examples/{ => imagenet}/run_soak.sh (90%) rename examples/{ => imagenet}/soak_assert.py (98%) create mode 100644 examples/inference/README.md rename examples/{run_inference_metrics_demo.sh => inference/run_sglang_demo.sh} (100%) rename examples/{ => inference}/run_vllm_soak.sh (94%) rename examples/{ => inference}/sglang_inference_metrics_demo.py (94%) rename examples/{ => inference}/vllm_offline_soak.py (98%) create mode 100644 examples/job-tracker/README.md rename examples/{ => job-tracker}/job_tracker.py (100%) rename examples/{ => job-tracker}/job_tracker_via_init.py (100%) create mode 100755 examples/job-tracker/run.sh create mode 100644 examples/megatron/README.md rename examples/{ => megatron}/megatron_mcore_train_loop.py (100%) create mode 100644 examples/megatron/megatron_meta_debug_loop.py create mode 100644 examples/megatron/pretrain_gpt.py create mode 100755 examples/megatron/run_fakes.sh create mode 100644 examples/megatron/run_megatron_lm_pretrain.py create mode 100755 examples/megatron/run_real_lm.sh rename examples/{run_megatron_soak.sh => megatron/run_soak.sh} (90%) create mode 100644 examples/overhead/README.md rename examples/{ => overhead}/bench_instrumentation.py (98%) rename examples/{ => overhead}/bench_profiler.py (100%) rename examples/{ => overhead}/nccl_profiler_overhead.py (98%) create mode 100755 examples/overhead/run_bench.sh rename examples/{run_nccl_profiler_bench.sh => overhead/run_nccl_bench.sh} (88%) create mode 100755 examples/overhead/run_torch_probe_smoke.sh rename examples/{ => overhead}/torch_probe_overhead_smoke.py (93%) create mode 100644 examples/ray/README.md rename examples/{ => ray}/ray_job_actor_span_demo.py (100%) rename examples/{ => ray}/ray_tracing_example.py (100%) create mode 100755 examples/ray/run_job_actor.sh create mode 100755 examples/ray/run_tracing.sh create mode 100644 ppt/convert_to_pdf.py create mode 100644 ppt/probing-presentation.html create mode 100644 ppt/probing-presentation.pdf create mode 100644 ppt/probing-print.html create mode 100644 python/probing/bundled_web/public/assets/logo.svg create mode 100644 python/probing/bundled_web/public/assets/tailwind.css create mode 100644 python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js create mode 100644 python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js.br create mode 100644 python/probing/bundled_web/public/assets/web_bg-dxh9628c8b4a0d6e07b.wasm create mode 100644 python/probing/bundled_web/public/assets/web_bg-dxh9628c8b4a0d6e07b.wasm.br create mode 100644 python/probing/bundled_web/public/logo.svg create mode 100644 python/probing/fakes/README.md create mode 100644 python/probing/fakes/__init__.py create mode 100644 python/probing/fakes/__main__.py create mode 100644 python/probing/fakes/bottom.py create mode 100644 python/probing/fakes/device.py create mode 100644 python/probing/fakes/finder.py create mode 100644 python/probing/fakes/helpers_cpp.py create mode 100644 python/probing/fakes/journal.py create mode 100644 python/probing/fakes/loop.py create mode 100644 python/probing/fakes/megatron_lm.py create mode 100644 python/probing/fakes/pretrain.py create mode 100644 python/probing/fakes/registry.py create mode 100644 python/probing/fakes/specs/__init__.py create mode 100644 python/probing/fakes/specs/cuda_extras.py create mode 100644 python/probing/fakes/specs/megatron.py create mode 100644 python/probing/fakes/torch_hooks.py create mode 100644 python/probing/fakes/verify.py create mode 100644 tests/regression/ext/test_megatron_real_lm.py create mode 100644 tests/unit/probing/fakes/test_fakes.py create mode 100644 tests/unit/probing/fakes/test_megatron_lm_env.py diff --git a/.github/workflows/soak.yml b/.github/workflows/soak.yml index 61b682d6..6dc46300 100644 --- a/.github/workflows/soak.yml +++ b/.github/workflows/soak.yml @@ -71,8 +71,8 @@ jobs: SOAK_ASSERT: "1" BATCH_SIZE: "64" run: | - chmod +x examples/run_soak.sh - ./examples/run_soak.sh + chmod +x examples/imagenet/run_soak.sh + ./examples/imagenet/run_soak.sh - name: Upload soak data if: always() @@ -128,8 +128,8 @@ jobs: SOAK_EXPECT_CLUSTER: "1" BATCH_SIZE: "32" run: | - chmod +x examples/run_soak.sh - ./examples/run_soak.sh + chmod +x examples/imagenet/run_soak.sh + ./examples/imagenet/run_soak.sh - name: Upload soak data if: always() @@ -182,5 +182,5 @@ jobs: BATCH_SIZE: "128" PROBING_DATA_DIR: /tmp/probing_soak_gpu run: | - chmod +x examples/run_soak.sh - ./examples/run_soak.sh + chmod +x examples/imagenet/run_soak.sh + ./examples/imagenet/run_soak.sh diff --git a/Makefile b/Makefile index d99f996b..806dde0c 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ DEV_PTH := python/probing/dev_pth.py DEV_PY_DEPS := pyyaml pytest pytest-cov coverage ipython ipykernel ruff PYTEST_RUN := PROBING=1 $(VENV_PYTHON) -m pytest -BENCH_SCRIPT := examples/bench_instrumentation.py +BENCH_SCRIPT := examples/overhead/bench_instrumentation.py BENCH_RUN := PROBING=1 $(VENV_PYTHON) $(BENCH_SCRIPT) PYTEST_UNIT_ARGS := tests/unit PYTEST_REGRESSION_ARGS := tests/regression @@ -198,12 +198,12 @@ bench-quick: check-dev $(BENCH_RUN) --quick soak: check-dev - @test -x examples/run_soak.sh || chmod +x examples/run_soak.sh - DURATION_SEC=600 PYTHON=$(VENV_PYTHON) PROBING=1 ./examples/run_soak.sh + @test -x examples/imagenet/run_soak.sh || chmod +x examples/imagenet/run_soak.sh + DURATION_SEC=600 PYTHON=$(VENV_PYTHON) PROBING=1 ./examples/imagenet/run_soak.sh soak-quick: check-dev - @test -x examples/run_soak.sh || chmod +x examples/run_soak.sh - DURATION_SEC=60 MAX_STEPS=8 PYTHON=$(VENV_PYTHON) PROBING=1 ./examples/run_soak.sh + @test -x examples/imagenet/run_soak.sh || chmod +x examples/imagenet/run_soak.sh + DURATION_SEC=60 MAX_STEPS=8 PYTHON=$(VENV_PYTHON) PROBING=1 ./examples/imagenet/run_soak.sh frontend: @test -n "$$SKIP_FRONTEND_CLEAN" || rm -rf python/probing/bundled_web diff --git a/docs/rl/agent-runtime.md b/docs/rl/agent-runtime.md index 593329a8..c7062669 100644 --- a/docs/rl/agent-runtime.md +++ b/docs/rl/agent-runtime.md @@ -129,7 +129,7 @@ python your_train_script.py Ray 相关示例可参考: ```bash -PROBING=1 PROBING_PORT=8080 python examples/ray_job_actor_span_demo.py +PROBING=1 PROBING_PORT=8080 python examples/ray/ray_job_actor_span_demo.py ``` ### 2. 在代码中打 Span(最小契约) diff --git a/docs/rl/inference-engine-metrics.md b/docs/rl/inference-engine-metrics.md index 506ba243..c1e7e275 100644 --- a/docs/rl/inference-engine-metrics.md +++ b/docs/rl/inference-engine-metrics.md @@ -97,7 +97,7 @@ export PROBING=1 export PROBING_PORT=8080 export PROBING_ASSETS_ROOT=web/dist -python examples/sglang_inference_metrics_demo.py \ +python examples/inference/sglang_inference_metrics_demo.py \ --engine-url http://127.0.0.1:30000 \ --engine-id sglang-real \ --num-requests 0 \ diff --git a/docs/src/contributing.md b/docs/src/contributing.md index e37cca6e..00892a3e 100644 --- a/docs/src/contributing.md +++ b/docs/src/contributing.md @@ -171,7 +171,7 @@ make test-python-wheel # tests against installed wheel + checkout pure Python ```bash uv pip install torch torchvision # or pip install … -PROBING=1 python examples/tracing.py +PROBING=1 python examples/getting-started/tracing.py ``` See [examples/README.md](https://github.com/DeepLink-org/probing/blob/main/examples/README.md). diff --git a/docs/src/contributing.zh.md b/docs/src/contributing.zh.md index 512d0448..9fd097c6 100644 --- a/docs/src/contributing.zh.md +++ b/docs/src/contributing.zh.md @@ -167,7 +167,7 @@ make test-python-wheel ```bash uv pip install torch torchvision -PROBING=1 python examples/tracing.py +PROBING=1 python examples/getting-started/tracing.py ``` 见 [examples/README.md](https://github.com/DeepLink-org/probing/blob/main/examples/README.md)。 diff --git a/docs/src/design/nccl-profiler.md b/docs/src/design/nccl-profiler.md index ba8ea3cf..0e1fafc3 100644 --- a/docs/src/design/nccl-profiler.md +++ b/docs/src/design/nccl-profiler.md @@ -13,7 +13,9 @@ This is **Path 3** in [Extensibility](extensibility.md)—a Rust `cdylib` loaded | Straggler identified — **why** (GPU vs network wait)? | `nccl.proxy_ops` + skill `nccl_culprit_victim` | | Suspect RoCE / IB congestion | `nccl.net_qp` + `rdma.mlx_hca` | -Coarse collective tracing (`python.comm_collective`) works with `PROBING=1` only. The NCCL profiler plugin requires **NCCL ≥ 2.26** (PyTorch **2.8+** recommended); it exports both **`ncclProfiler_v4`** (NCCL ≥ 2.27, preferred) and **`ncclProfiler_v3`** (NCCL 2.26) — NCCL negotiates the highest version automatically. +Coarse collective tracing (`python.comm_collective`) is **off by default**; enable with +`PROBING_TORCH_COLLECTIVE_ENABLE=1` or `SET probing.torch.collective.enable=1` +(in addition to `PROBING=1`). The NCCL profiler plugin requires **NCCL ≥ 2.26** (PyTorch **2.8+** recommended); it exports both **`ncclProfiler_v4`** (NCCL ≥ 2.27, preferred) and **`ncclProfiler_v3`** (NCCL 2.26) — NCCL negotiates the highest version automatically. ## Three collective data sources — keep them apart @@ -28,11 +30,10 @@ probing has three independent collective-communication collectors. They have Rules of engagement: -- When the plugin is active (`NCCL_PROFILER_PLUGIN` set), the Torch-API tracer - is **disabled by default** — recording the same collectives twice with - conflicting timing only creates confusion. Force both with +- The Torch-API tracer is **disabled by default** (including multi-rank jobs) to + avoid silent overhead. Enable with `PROBING_TORCH_COLLECTIVE_ENABLE=1` or `SET probing.torch.collective.enable=1` (e.g. when you need per-step - `global_step` alignment alongside precise timing). + `global_step` alignment alongside precise NCCL timing). - For execution time, bandwidth, and wait attribution, always query `nccl.*`. `python.comm_collective.duration_ms` is **not** NCCL execution time — for `async_op` calls it closes at `work.wait()`, otherwise at API return. diff --git a/docs/src/design/nccl-profiler.zh.md b/docs/src/design/nccl-profiler.zh.md index dc896727..e3b8fecf 100644 --- a/docs/src/design/nccl-profiler.zh.md +++ b/docs/src/design/nccl-profiler.zh.md @@ -13,7 +13,9 @@ | 已定位慢 rank,要区分 GPU 慢还是等网络 | `nccl.proxy_ops` + skill `nccl_culprit_victim` | | 怀疑 RoCE / IB 拥塞 | `nccl.net_qp` + `rdma.mlx_hca` | -粗粒度 collective(`python.comm_collective`)只需 `PROBING=1`。NCCL profiler 插件需要 **NCCL ≥ 2.26**(建议 PyTorch **2.8+**);插件同时导出 **`ncclProfiler_v4`**(NCCL ≥ 2.27,优先)与 **`ncclProfiler_v3`**(NCCL 2.26),NCCL 自动协商最高版本。 +粗粒度 collective(`python.comm_collective`)**默认关闭**;需显式开启 +`PROBING_TORCH_COLLECTIVE_ENABLE=1` 或 `SET probing.torch.collective.enable=1` +(并配合 `PROBING=1`)。NCCL profiler 插件需要 **NCCL ≥ 2.26**(建议 PyTorch **2.8+**);插件同时导出 **`ncclProfiler_v4`**(NCCL ≥ 2.27,优先)与 **`ncclProfiler_v3`**(NCCL 2.26),NCCL 自动协商最高版本。 ## 三条 collective 采集路径 — 保持分叉,勿混淆 @@ -27,9 +29,9 @@ probing 有三条相互独立的集合通信采集路径,**计时语义不同* 约定: -- 插件启用时(设置了 `NCCL_PROFILER_PLUGIN`),Torch API 层插桩**默认关闭**—— - 同一批 collective 被两套语义各记一遍只会制造混乱。如需同开(例如要按 - `global_step` 对齐),`SET probing.torch.collective.enable=1`。 +- Torch API 层插桩**默认关闭**(含多 rank 作业),避免隐性开销。需显式开启: + `PROBING_TORCH_COLLECTIVE_ENABLE=1` 或 `SET probing.torch.collective.enable=1` + (例如要与精准 NCCL 计时按 `global_step` 对齐)。 - 查执行时间、带宽、等待归因,一律用 `nccl.*`。 `python.comm_collective.duration_ms` **不是** NCCL 执行时间——`async_op` 调用在 `work.wait()` 处收口,同步调用在 API 返回处收口。 diff --git a/docs/src/design/overhead.md b/docs/src/design/overhead.md index a6eaaf37..731b8ab3 100644 --- a/docs/src/design/overhead.md +++ b/docs/src/design/overhead.md @@ -25,7 +25,7 @@ Canonical design doc for **instrumentation overhead** in Probing: terminology, f | Entry | Measures | |-------|----------| -| `make bench` → `examples/bench_instrumentation.py` | Python/Rust **instrumentation** wall time | +| `make bench` → `examples/overhead/bench_instrumentation.py` | Python/Rust **instrumentation** wall time | | `probing bench write` (hidden CLI) | memtable **write-path** throughput/latency — not training hook tax | These are not interchangeable. @@ -177,7 +177,7 @@ WHERE local_step >= bounds.win_start AND local_step > 1; ## 6. Offline benchmark: `make bench` -Script: `examples/bench_instrumentation.py`. Run inside a **probing-injected** process: +Script: `examples/overhead/bench_instrumentation.py`. Run inside a **probing-injected** process: ```bash PROBING=1 make bench @@ -205,7 +205,7 @@ PROBING=1 make bench-quick ### 6.3 JSON export ```bash -PROBING=1 python examples/bench_instrumentation.py --json-out /tmp/bench.json +PROBING=1 python examples/overhead/bench_instrumentation.py --json-out /tmp/bench.json ``` --- @@ -214,7 +214,7 @@ PROBING=1 python examples/bench_instrumentation.py --json-out /tmp/bench.json No in-run shadow. Runtime health: `nccl.profiler_counters`. -E2E: `examples/nccl_profiler_overhead.py`, `examples/run_nccl_profiler_bench.sh`. Baseline vs plugin + `PROBING=2`. Compare with §3.4 on latency and throughput. +E2E: `examples/overhead/nccl_profiler_overhead.py`, `examples/overhead/run_nccl_bench.sh`. Baseline vs plugin + `PROBING=2`. Compare with §3.4 on latency and throughput. Micro: `probing/extensions/nccl-profiler/benches/callback_path.rs` (Criterion) — component-level only. @@ -304,7 +304,7 @@ Trimmed mean, per-cadence aggregation, EWMA sidebar, confidence bands, NCCL in-r ```bash PROBING=1 PROBING_TORCH_PROFILING=on python train.py -PROBING=1 python examples/torch_probe_overhead_smoke.py +PROBING=1 python examples/overhead/torch_probe_overhead_smoke.py PROBING=1 make bench-quick ``` @@ -317,12 +317,12 @@ Reduce overhead: lower `rate` / `layer_rate`; disable `trace_spans`, `sync=on`, | Component | Path | |-----------|------| | Shadow + timing | `python/probing/profiling/torch_probe.py` | -| Offline bench | `examples/bench_instrumentation.py` | +| Offline bench | `examples/overhead/bench_instrumentation.py` | | Web SQL | `web/src/overhead/sql.rs` | | Web formatting | `web/src/overhead/metrics.rs` | | Skill SQL | `skills/health_overview/steps.yaml` | -| soak | `examples/soak_assert.py` | -| NCCL E2E | `examples/nccl_profiler_overhead.py` | +| soak | `examples/imagenet/soak_assert.py` | +| NCCL E2E | `examples/overhead/nccl_profiler_overhead.py` | --- diff --git a/docs/src/design/overhead.zh.md b/docs/src/design/overhead.zh.md index b6842834..d86aefb7 100644 --- a/docs/src/design/overhead.zh.md +++ b/docs/src/design/overhead.zh.md @@ -25,7 +25,7 @@ | 入口 | 测量对象 | |------|----------| -| `make bench` → `examples/bench_instrumentation.py` | Python/Rust **instrumentation** 墙钟开销 | +| `make bench` → `examples/overhead/bench_instrumentation.py` | Python/Rust **instrumentation** 墙钟开销 | | `probing bench write`(隐藏 CLI) | memtable **写路径吞吐/延迟**,不是训练 hook 税 | 二者不可互换。 @@ -197,7 +197,7 @@ WHERE local_step >= bounds.win_start AND local_step > 1; ## 6. 离线基准:`make bench` -脚本:`examples/bench_instrumentation.py`。须在 **probing 注入进程**内运行: +脚本:`examples/overhead/bench_instrumentation.py`。须在 **probing 注入进程**内运行: ```bash PROBING=1 make bench # 完整 @@ -257,7 +257,7 @@ $$ ### 6.3 JSON 导出 ```bash -PROBING=1 python examples/bench_instrumentation.py --json-out /tmp/bench.json +PROBING=1 python examples/overhead/bench_instrumentation.py --json-out /tmp/bench.json ``` --- @@ -268,7 +268,7 @@ PROBING=1 python examples/bench_instrumentation.py --json-out /tmp/bench.json ### 7.1 E2E AllReduce / AllGather -脚本:`examples/nccl_profiler_overhead.py`;编排:`examples/run_nccl_profiler_bench.sh`。 +脚本:`examples/overhead/nccl_profiler_overhead.py`;编排:`examples/overhead/run_nccl_bench.sh`。 | 模式 | 环境 | |------|------| @@ -309,7 +309,7 @@ PROBING=1 python examples/bench_instrumentation.py --json-out /tmp/bench.json |------|------|------| | 诊断 warning | `dispatch_overhead_pct > 5%`(稳定口径) | `health_overview` | | 诊断 info(混合偏高) | `hook_tax_pct > 5%` 且 `dispatch_overhead_pct ≤ 5%` | 可选:采样步导致 | -| soak 失败 | `hook_tax_pct > 75%`(默认 `--max-hook-tax-pct`) | `examples/soak_assert.py` | +| soak 失败 | `hook_tax_pct > 75%`(默认 `--max-hook-tax-pct`) | `examples/imagenet/soak_assert.py` | | CI 回归 | span 倍数上界(§8) | `test_span_overhead.py` | > **注意**:5%(告警)、75%(soak)、8×(回归)服务于不同目的,**不是**统一 SLO。发布前应结合目标硬件与模型自行标定。 @@ -415,7 +415,7 @@ PROBING=1 PROBING_TORCH_PROFILING=on python train.py ### 快速冒烟 ```bash -PROBING=1 python examples/torch_probe_overhead_smoke.py # 无 GPU +PROBING=1 python examples/overhead/torch_probe_overhead_smoke.py # 无 GPU PROBING=1 make bench-quick ``` @@ -426,12 +426,12 @@ PROBING=1 make bench-quick | 组件 | 路径 | |------|------| | Shadow 逻辑与计时 | `python/probing/profiling/torch_probe.py` | -| 离线基准 | `examples/bench_instrumentation.py` | +| 离线基准 | `examples/overhead/bench_instrumentation.py` | | Web SQL | `web/src/overhead/sql.rs` | | Web 格式化 | `web/src/overhead/metrics.rs` | | 技能 SQL | `skills/health_overview/steps.yaml` | -| soak 断言 | `examples/soak_assert.py` | -| NCCL E2E | `examples/nccl_profiler_overhead.py` | +| soak 断言 | `examples/imagenet/soak_assert.py` | +| NCCL E2E | `examples/overhead/nccl_profiler_overhead.py` | --- diff --git a/docs/src/design/profiling.md b/docs/src/design/profiling.md index 4ccf00e8..dd6eff7d 100644 --- a/docs/src/design/profiling.md +++ b/docs/src/design/profiling.md @@ -92,8 +92,8 @@ Hook overhead is reduced by sampling; forward hooks remain registered on all mod TorchProbe shadow steps measure **module-hook** overhead only. The NCCL profiler plugin has no in-run shadow baseline today — it always records collective events when enabled. For NCCL AllReduce overhead vs probing, use the offline benchmark: ```bash -./examples/run_nccl_profiler_bench.sh -# or: python examples/torch_probe_overhead_smoke.py # Torch-only smoke (no GPU) +./examples/overhead/run_nccl_bench.sh +# or: python examples/overhead/torch_probe_overhead_smoke.py # Torch-only smoke (no GPU) ``` Monitor runtime health via `nccl.profiler_counters` (`pool_exhausted`, `write_errors`, `rows_written`). The Web UI overhead panel links to the offline NCCL bench when the profiler is active. @@ -126,7 +126,9 @@ Use `role` + `global_step` to join with `python.comm_collective` on the same ran ### Collective rows (`python.comm_collective`) Lite-mode hooks on `torch.distributed` write one row per collective with `duration_ms`, -`bytes`, `op`, and the same step/role coordinates. See [SQL Tables](../reference/sql-tables.md#python-comm_collective) and [SQL Analytics](../guide/sql-analytics.md#python-comm_collective). +`bytes`, `op`, and the same step/role coordinates. **Off by default** (including +multi-rank jobs); enable with `PROBING_TORCH_COLLECTIVE_ENABLE=1` or +`SET probing.torch.collective.enable=1`. See [SQL Tables](../reference/sql-tables.md#python-comm_collective) and [SQL Analytics](../guide/sql-analytics.md#python-comm_collective). ### Enable PyTorch Profiling diff --git a/docs/src/design/profiling.zh.md b/docs/src/design/profiling.zh.md index 33e9360c..6e6fdc7e 100644 --- a/docs/src/design/profiling.zh.md +++ b/docs/src/design/profiling.zh.md @@ -92,8 +92,8 @@ WHERE local_step > 1; Shadow step 仅衡量 **TorchProbe 模块 hook** 开销。NCCL profiler 插件目前没有 in-run shadow 基线,启用后会持续记录 collective 事件。NCCL AllReduce 与 probing 的开销对比请用离线 benchmark: ```bash -./examples/run_nccl_profiler_bench.sh -# 或:python examples/torch_probe_overhead_smoke.py # 仅 Torch 冒烟(无需 GPU) +./examples/overhead/run_nccl_bench.sh +# 或:python examples/overhead/torch_probe_overhead_smoke.py # 仅 Torch 冒烟(无需 GPU) ``` 运行时健康度见 `nccl.profiler_counters`(`pool_exhausted`、`write_errors`、`rows_written`)。Web UI 开销面板在 NCCL 活跃时会提示离线 bench 入口。 @@ -126,7 +126,9 @@ Shadow step 仅衡量 **TorchProbe 模块 hook** 开销。NCCL profiler 插件 ### 集合通信(`python.comm_collective`) 对 `torch.distributed` 的 lite 模式钩子每条 collective 写一行,含 `duration_ms`、`bytes`、`op` -及相同 step/role 坐标。见 [SQL 表](../reference/sql-tables.zh.md#python-comm_collective) 与 +及相同 step/role 坐标。**默认关闭**(含多 rank 作业);需显式开启: +`PROBING_TORCH_COLLECTIVE_ENABLE=1` 或 `SET probing.torch.collective.enable=1`。 +见 [SQL 表](../reference/sql-tables.zh.md#python-comm_collective) 与 [SQL 分析](../guide/sql-analytics.zh.md#python-comm_collective)。 ### 启用 PyTorch 分析 diff --git a/docs/src/design/torchrun-cluster.md b/docs/src/design/torchrun-cluster.md index f814fa4e..cabe2813 100644 --- a/docs/src/design/torchrun-cluster.md +++ b/docs/src/design/torchrun-cluster.md @@ -40,7 +40,7 @@ See [Environment variables](../reference/env-vars.md) for the full list. Highlig ## Presets (`PROBING_CLUSTER_PRESET`) -`examples/run_cluster_multinode.sh` supports: +`examples/cluster/run_multinode.sh` supports: | Preset | Use case | |--------|----------| @@ -49,13 +49,13 @@ See [Environment variables](../reference/env-vars.md) for the full list. Highlig | `steady` | Long runs, lower CPU (90s stale) | ```bash -PROBING_CLUSTER_PRESET=fast ./examples/run_cluster_multinode.sh 2 2 +PROBING_CLUSTER_PRESET=fast ./examples/cluster/run_multinode.sh 2 2 ``` ## Demo ```bash -./examples/run_cluster_multinode.sh +./examples/cluster/run_multinode.sh probing -t rank0-host:18080 cluster nodes ``` diff --git a/docs/src/design/torchrun-cluster.zh.md b/docs/src/design/torchrun-cluster.zh.md index e2b30ab1..b45940a6 100644 --- a/docs/src/design/torchrun-cluster.zh.md +++ b/docs/src/design/torchrun-cluster.zh.md @@ -59,7 +59,7 @@ global rank 0 ──PUT──► 本机 master 视图 ## 预设(`PROBING_CLUSTER_PRESET`) -`examples/run_cluster_multinode.sh` 支持预设,便于 demo / 调试 / 长跑: +`examples/cluster/run_multinode.sh` 支持预设,便于 demo / 调试 / 长跑: | 预设 | 用途 | 主要效果 | |------|------|----------| @@ -68,8 +68,8 @@ global rank 0 ──PUT──► 本机 master 视图 | `steady` | 长跑省 CPU | stale=90s,max interval≈67s | ```bash -PROBING_CLUSTER_PRESET=fast ./examples/run_cluster_multinode.sh 2 2 -PROBING_CLUSTER_PRESET=steady ./examples/run_cluster_multinode.sh 4 8 +PROBING_CLUSTER_PRESET=fast ./examples/cluster/run_multinode.sh 2 2 +PROBING_CLUSTER_PRESET=steady ./examples/cluster/run_multinode.sh 4 8 ``` 也可手动覆盖任意变量;预设只设置未显式 export 的项。 @@ -86,8 +86,8 @@ probing -t rank0-host:18080 cluster nodes ## 演示 ```bash -./examples/run_cluster_multinode.sh # 2 机 × 2 卡 -./examples/run_cluster_multinode.sh 3 4 60 # 3 机 × 4 卡,sleep 60s +./examples/cluster/run_multinode.sh # 2 机 × 2 卡 +./examples/cluster/run_multinode.sh 3 4 60 # 3 机 × 4 卡,sleep 60s ``` ## 与 Python hook 的关系 diff --git a/docs/src/design/tracing-spans.zh.md b/docs/src/design/tracing-spans.zh.md index c7cd342b..0c0ada6a 100644 --- a/docs/src/design/tracing-spans.zh.md +++ b/docs/src/design/tracing-spans.zh.md @@ -94,7 +94,7 @@ flowchart TD 3. **Rust 栈 LIFO**:正常 `with` 嵌套用 O(1) pop;乱序退出仍 fallback 全栈搜索。 4. **避免** `PROBING_SPAN_LOCATION=1` 于训练热路径;TorchProbe 变量追踪有独立 stack walk。 -本地基准:`make bench-quick` 或 `python examples/bench_instrumentation.py --quick`。 +本地基准:`make bench-quick` 或 `python examples/overhead/bench_instrumentation.py --quick`。 ## 查询 diff --git a/docs/src/reference/env-vars.md b/docs/src/reference/env-vars.md index cf77bfdd..e81a113c 100644 --- a/docs/src/reference/env-vars.md +++ b/docs/src/reference/env-vars.md @@ -108,6 +108,13 @@ Non-PROBING-prefixed aliases are also recognized for Megatron compatibility: | Variable | Description | |----------|-------------| | `PROBING_NCCL_MOCK` | Enable mock NCCL proxy data for testing without GPUs. | +| `PROBING_FAKES` | Opt-in fake packages for macOS debugging (`1`/`all`, or comma list: `megatron,transformer_engine,apex,flash_attn,triton`). See `python/probing/fakes/README.md`. | +| `PROBING_FAKES_FORCE` | When `1`, shadow real packages for enabled specs (needed if megatron-core is installed but unusable on macOS). | +| `PROBING_FAKE_DEVICE` | `meta` / `cpu` / `mps`. Remap CUDA device APIs when `probing.fakes` is installed. Scripted loops default to `meta` (no compute). Real Megatron-LM runner (`examples/megatron/run_megatron_lm_pretrain.py`) defaults to `cpu`. | +| `MEGATRON_LM` | Path to a Megatron-LM checkout for the real-code runner (default: sibling `../Megatron-LM`). One checkout at a time — switch versions by changing this path. | +| `MEGATRON_LM_ALLOW_ANY_VERSION` | When `1`, skip the megatron-core smoke version gate (default allows ≥0.12.1 and <0.21). | +| `PROBING_MEGATRON_REAL_LM` | Opt-in for `tests/regression/ext/test_megatron_real_lm.py` (`1` to run). | +| — | Fake layer also writes ``python.fake_event`` ground-truth rows and can hook ``torch.distributed`` to dual-write ``python.comm_collective`` for correlation / verify. | | `PROBING_NCCL_PROFILER` | Path to the NCCL profiler shared library. | | `PROBING_NCCL_MIN_MSG_BYTES` | Skip recording NCCL ops smaller than this size in bytes (default `0` = record all). | | `PROBING_NCCL_INFLIGHT_THRESHOLD_SECS` | Watchdog threshold for snapshotting in-flight (possibly hung) NCCL ops into `nccl.inflight_ops` (default `10`, `0` disables). | @@ -199,7 +206,7 @@ Hierarchical side-channel registration when `WORLD_SIZE > 1`. See [torchrun clus | `PROBING_CLUSTER_STALE_SEC` | `25` | Mark node `dead` after this many seconds without heartbeat. Should exceed max interval. | | `PROBING_CLUSTER_DISCOVER_TIMEOUT_SEC` | `2` | Timeout per master/local0 discovery attempt. | | `PROBING_CLUSTER_REPORT_TIMEOUT_SEC` | `5` | HTTP PUT timeout for cluster report. | -| `PROBING_CLUSTER_PRESET` | — | Used by `examples/run_cluster_multinode.sh`: `demo`, `fast`, or `steady`. | +| `PROBING_CLUSTER_PRESET` | — | Used by `examples/cluster/run_multinode.sh`: `demo`, `fast`, or `steady`. | | `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | Hierarchical cluster query fan-out (coordinator → local0 → leaves). `0` = flat fan-out to every peer. See [Hierarchical fan-out](../design/hierarchical-fanout.md). | | `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `30` | Per-peer timeout for remote federated / cluster queries (seconds). | | `PROBING_FANOUT_CONCURRENCY` | `128` | Max concurrent in-flight remote fan-out HTTP requests per query. | diff --git a/docs/src/reference/env-vars.zh.md b/docs/src/reference/env-vars.zh.md index 099e0a6c..024cb7e0 100644 --- a/docs/src/reference/env-vars.zh.md +++ b/docs/src/reference/env-vars.zh.md @@ -23,7 +23,7 @@ Probing 读取的全部 `PROBING_*` 环境变量参考(按子系统分组) | `PROBING_CLUSTER_STALE_SEC` | `25` | 无心跳超过此秒数标记为 `dead`;应大于最大间隔。 | | `PROBING_CLUSTER_DISCOVER_TIMEOUT_SEC` | `2` | 每次 master/local0 发现超时。 | | `PROBING_CLUSTER_REPORT_TIMEOUT_SEC` | `5` | 集群 report HTTP PUT 超时。 | -| `PROBING_CLUSTER_PRESET` | — | `examples/run_cluster_multinode.sh` 使用:`demo`、`fast`、`steady`。 | +| `PROBING_CLUSTER_PRESET` | — | `examples/cluster/run_multinode.sh` 使用:`demo`、`fast`、`steady`。 | | `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | 分层集群查询 fan-out;`0` = 扁平 fan-out 到所有 peer。 | | `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `30` | 远程联邦 / 集群查询的单 peer 超时(秒)。 | | `PROBING_FANOUT_CONCURRENCY` | `128` | 单次 cluster fan-out 的最大并发远程 HTTP 请求数。 | diff --git a/examples/README.md b/examples/README.md index 9579b16e..19d2cf6f 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,142 +1,43 @@ # Examples -Runnable scripts under `examples/`. They are **not** installed with `pip install probing` or `make develop`. +按主题分目录;每个目录有 `README.md` 和可执行 shell 入口。 -Framework integration **contract tests** live under `tests/regression/ext/` (e.g. `test_megatron_contract.py`, `test_vllm_contract.py`) — run via `make test-python-regression`. Real-framework smoke tests: `test_megatron_integration.py`, `test_vllm_integration.py` (`pytest -m integration`). +| 目录 | 主题 | 快速入口 | +|------|------|----------| +| [getting-started/](getting-started/) | Tracing / hooks / 冒烟 | `./examples/getting-started/run_tracing.sh` | +| [megatron/](megatron/) | Megatron-Core / fakes / 真 LM | `./examples/megatron/run_fakes.sh` | +| [imagenet/](imagenet/) | ImageNet soak / DDP | `./examples/imagenet/run_soak.sh` | +| [inference/](inference/) | vLLM / SGLang | `./examples/inference/run_vllm_soak.sh` | +| [ray/](ray/) | Ray tracing / actor spans | `./examples/ray/run_tracing.sh` | +| [crash/](crash/) | Crash 捕获 | `./examples/crash/run_demo.sh` | +| [cluster/](cluster/) | 多机 torchrun 集群 | `./examples/cluster/run_multinode.sh` | +| [overhead/](overhead/) | 开销基准 / NCCL | `./examples/overhead/run_bench.sh` | +| [job-tracker/](job-tracker/) | 作业生命周期 hook | `./examples/job-tracker/run.sh` | +| [probing-acme/](probing-acme/) | 厂商扩展包模板 | 见目录 README | -## Dependencies +框架集成 **契约测试** 在 `tests/regression/ext/`(`make test-python-regression`)。 -| Script | Extra packages | Notes | -|--------|----------------|-------| -| **`tracing.py`** | `torch` | **Tracing 入门**(hook 驱动 phase,~80 行) | -| **`megatron_mcore_train_loop.py`** | `megatron-core`, `torch` (CUDA) | **真实 Megatron-Core 训练循环** + Web UI(`run_megatron_soak.sh`) | -| **`vllm_offline_soak.py`** | `vllm` / `vllm-metal` | **真实 vLLM 离线推理** + Web UI(`run_vllm_soak.sh`) | -| `hooks.py`, `test_probing.py` | none (beyond probing) | Good smoke tests | -| `imagenet.py`, `imagenet_with_span.py` | `torch`, `torchvision` | Needs ImageNet data path | -| `ray_tracing_example.py` | `ray` | Optional Ray integration | -| `bench_profiler.py` | varies | See script header | -| **`torch_probe_overhead_smoke.py`** | none | TorchProbe shadow-step overhead smoke (no GPU) | -| **`bench_instrumentation.py`** | `torch` (optional) | One-shot report: span / phase hooks / TorchProbe overhead (`make bench`) | -| **`run_soak.sh`** | `torch`, `torchvision` | Long-running soak (synthetic ImageNet + probing); used by CI `soak.yml` | -| **`run_imagenet_ddp.sh`** | `torch`, `torchvision` | **默认 2-rank torchrun** DDP demo(cluster query / 分布式火焰图 / `global.python.profile_*`) | -| **`run_megatron_soak.sh`** | `megatron-core`, CUDA | Megatron-Core torchrun soak(默认 2 GPU / TP=2,`PROBING_PORT=18080`) | -| **`run_vllm_soak.sh`** | `vllm` / `vllm-metal` | vLLM 真实推理 soak(默认 10min,`PROBING_PORT=18081`) | -| **`soak_assert.py`** | none (beyond probing) | Post-soak SQL / overhead assertions | -| **`nccl_profiler_overhead.py`** | `torch` (CUDA) | NCCL AllReduce overhead vs probing profiler — see below | - -Install PyTorch into your dev venv (tracing 示例只需 torch;ImageNet 脚本还需 torchvision): - -```bash -source .venv/bin/activate -uv pip install torch -# ImageNet 示例: uv pip install torch torchvision -``` - -## Running with probing - -Use the project venv after `make develop` (see [Contributing](../docs/src/contributing.md)): - -```bash -source .venv/bin/activate -PROBING=1 python examples/tracing.py # tracing 入门(推荐) -PROBING=1 python examples/test_probing.py --depth 2 -PROBING=1 python examples/bench_instrumentation.py --quick -./examples/run_megatron_soak.sh # Megatron 长跑 + Web UI -./examples/run_vllm_soak.sh # vLLM 长跑 + Web UI -make bench # full report, one table per group as each finishes -make bench-quick # faster smoke -make soak-quick # ~60s CPU soak smoke (needs torch + torchvision) -``` - -Long-running soak (CI weekly job ``soak.yml``):: - -```bash -# ~10 min single-process CPU soak + assertions -./examples/run_soak.sh - -# shorter local smoke -DURATION_SEC=60 ./examples/run_soak.sh - -# 2-rank gloo DDP (assertions on rank 0) -NPROC=2 DIST_BACKEND=gloo DURATION_SEC=120 ./examples/run_soak.sh - -# dedicated distributed demo (default 2 ranks, Web UI on :18080) -./examples/run_imagenet_ddp.sh -DURATION_SEC=60 ./examples/run_imagenet_ddp.sh -``` - -On Linux you can also attach with `probing -t inject` instead of `PROBING=1` at startup. - -### Megatron autostart - -Regression (mocked modules, CI): `tests/regression/ext/test_megatron_contract.py` — `make test-python-regression`. - -**Real Megatron-Core** training loop + Web UI (**Linux + NVIDIA CUDA only**; requires `megatron-core`, `triton`, `torchrun`): - -```bash -# Linux GPU machine only (not macOS) -uv pip install megatron-core torch triton # CUDA wheels -./examples/run_megatron_soak.sh -DURATION_SEC=60 ./examples/run_megatron_soak.sh -NPROC=1 TP_SIZE=1 ./examples/run_megatron_soak.sh # single GPU -# browser: http://127.0.0.1:18080/ -``` - -Based on NVIDIA [run_simple_mcore_train_loop.py](https://github.com/NVIDIA/Megatron-LM/blob/main/examples/run_simple_mcore_train_loop.py). Probing hooks `megatron.core.parallel_state` for role sync and aligns `probing.step` each optimizer iteration. - -Full Megatron-LM `pretrain_gpt.py` jobs: set `PROBING=2 PROBING_MEGATRON=on` at launch (uses `megatron.training.training.train_step` hooks). - -### vLLM / vLLM-Metal autostart - -Regression (mocked modules, CI): `tests/regression/ext/test_vllm_contract.py` — `make test-python-regression`. - -**Real vLLM** offline inference + Web UI: - -```bash -# Linux/CUDA -uv pip install vllm -./examples/run_vllm_soak.sh - -# macOS Apple Silicon (vllm-metal) -# https://github.com/vllm-project/vllm-metal -# -# Align vllm / vllm-metal / mlx-lm versions per vllm-metal docs. The soak defaults to -# VLLM_PROMPTS_PER_BATCH=1 on macOS because multi-prompt batched decode needs -# mlx_lm.BatchKVCache.merge (not in all mlx-lm releases). -uv pip install torchvision torchaudio 'transformers>=4.46,<5' -./examples/run_vllm_soak.sh -# multi-prompt batching (when mlx-lm supports BatchKVCache.merge): -# VLLM_PROMPTS_PER_BATCH=4 ./examples/run_vllm_soak.sh -DURATION_SEC=60 ./examples/run_vllm_soak.sh -# browser: http://127.0.0.1:18081/ -``` - -`vllm serve` API server: `PROBING=2 PROBING_PORT=18081 vllm serve ` (engine hooks apply on load). - -### NCCL profiler overhead (Linux + CUDA) - -Micro-benchmark (synthetic NCCL callbacks, no GPU): - -```bash -cargo bench -p probing-nccl-profiler --bench callback_path -``` - -End-to-end AllReduce overhead (baseline vs `NCCL_PROFILER_PLUGIN`): +## 依赖 ```bash -make nccl-profiler-lib -./examples/run_nccl_profiler_bench.sh -# tune: NPROC=8 BENCH_ITERS=500 MSG_BYTES=4194304 ./examples/run_nccl_profiler_bench.sh +source .venv/bin/activate # after make develop +uv pip install torch # 多数示例 +# ImageNet: uv pip install torchvision ``` -Results land in `/tmp/probing_nccl_bench_/{baseline,profiled}.json`. Compare manually: +## 常用命令 ```bash -python examples/nccl_profiler_overhead.py --compare baseline.json profiled.json +./examples/getting-started/run_tracing.sh +./examples/megatron/run_fakes.sh +./examples/megatron/run_real_lm.sh # 需 ../Megatron-LM +DURATION_SEC=60 ./examples/imagenet/run_soak.sh +make bench-quick # → examples/overhead/bench_instrumentation.py +make soak-quick # → examples/imagenet/run_soak.sh ``` -## More documentation +## 更多文档 - [Examples (MkDocs)](../docs/src/examples/index.md) - [Quick Start](../docs/src/quickstart.md) -- [Vendor extension template](probing-acme/) — `probing-` with entry-point skills + magics +- [Vendor extension template](probing-acme/) diff --git a/examples/cluster/README.md b/examples/cluster/README.md new file mode 100644 index 00000000..8d6a7ebb --- /dev/null +++ b/examples/cluster/README.md @@ -0,0 +1,20 @@ +# Cluster + +本机模拟多机 × 多卡 torchrun + 分层集群心跳。 + +## 入口 + +```bash +./examples/cluster/run_multinode.sh # 默认 2 机 × 2 卡 +./examples/cluster/run_multinode.sh 3 4 # 3 机 × 4 卡 +PROBING_CLUSTER_PRESET=fast ./examples/cluster/run_multinode.sh 2 2 +``` + +预设说明:`docs/src/design/torchrun-cluster.md`。 + +## 文件 + +| 文件 | 说明 | +|------|------| +| `run_multinode.sh` | 编排 N 个 torchrun | +| `cluster_multinode_demo.py` | sleep + dist init | diff --git a/examples/cluster_multinode_demo.py b/examples/cluster/cluster_multinode_demo.py similarity index 95% rename from examples/cluster_multinode_demo.py rename to examples/cluster/cluster_multinode_demo.py index f66f237f..735e65d6 100644 --- a/examples/cluster_multinode_demo.py +++ b/examples/cluster/cluster_multinode_demo.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """Sleep demo for multi-node torchrun + probing hierarchical cluster report. -Run via ``./examples/run_cluster_multinode.sh`` (see script for N nodes × M GPUs). +Run via ``./examples/cluster/run_multinode.sh`` (see script for N nodes × M GPUs). Probing loads from ``PROBING=2`` (site hook). Rust ctor starts hierarchical cluster heartbeat when ``WORLD_SIZE > 1`` (default on). diff --git a/examples/run_cluster_multinode.sh b/examples/cluster/run_multinode.sh similarity index 93% rename from examples/run_cluster_multinode.sh rename to examples/cluster/run_multinode.sh index 55f98099..3335b7fe 100755 --- a/examples/run_cluster_multinode.sh +++ b/examples/cluster/run_multinode.sh @@ -1,16 +1,16 @@ #!/usr/bin/env bash # 本机模拟 N 机 × M 卡:自动并行启动 N 个 torchrun(每个 node_rank 一个)。 # -# ./examples/run_cluster_multinode.sh # 默认 2 机 × 2 卡 -# ./examples/run_cluster_multinode.sh 3 4 # 3 机 × 4 卡 -# ./examples/run_cluster_multinode.sh 2 2 60 # sleep 60s +# ./examples/cluster/run_multinode.sh # 默认 2 机 × 2 卡 +# ./examples/cluster/run_multinode.sh 3 4 # 3 机 × 4 卡 +# ./examples/cluster/run_multinode.sh 2 2 60 # sleep 60s # # 也可用环境变量:NNODES NPROC SLEEP_SEC MASTER_PORT # probing 高级开关(一般不用改):PROBING_PORT PROBING_CLUSTER_REPORT=0 # 心跳预设:PROBING_CLUSTER_PRESET=demo|fast|steady(见 docs/src/design/torchrun-cluster.zh.md) set -euo pipefail -cd "$(dirname "$0")/.." +cd "$(dirname "$0")/../.." [[ -f .venv/bin/activate ]] && source .venv/bin/activate apply_cluster_preset() { @@ -120,7 +120,7 @@ for node_rank in $(seq 0 $((NNODES - 1))); do --master_port="${MASTER_PORT}" \ --rdzv_id="${RDZV_ID}" \ --local_addr=127.0.0.1 \ - examples/cluster_multinode_demo.py 2>&1 | sed -u "s/^/[node${node_rank}] /" & + examples/cluster/cluster_multinode_demo.py 2>&1 | sed -u "s/^/[node${node_rank}] /" & pids+=("$!") if [[ "$node_rank" -eq 0 ]]; then sleep "${NODE0_BOOT_SEC}" diff --git a/examples/crash/README.md b/examples/crash/README.md new file mode 100644 index 00000000..0f567fa5 --- /dev/null +++ b/examples/crash/README.md @@ -0,0 +1,22 @@ +# Crash + +Crash 捕获演示(单进程 / torchrun)。 + +## 入口 + +```bash +./examples/crash/run_demo.sh # record(线程异常,进程不退出) +./examples/crash/run_demo.sh exception # 主线程崩溃 +./examples/crash/run_torchrun.sh # 多 rank +./examples/crash/run_torchrun.sh exception 1 +``` + +调试时若不想等 grace:`PROBING_CRASH_NO_GRACE=1`。 + +## 文件 + +| 文件 | 说明 | +|------|------| +| `crash_demo.py` | 单进程 | +| `crash_torchrun_demo.py` | 多 rank | +| `run_demo.sh` / `run_torchrun.sh` | 入口 | diff --git a/examples/crash_demo.py b/examples/crash/crash_demo.py similarity index 90% rename from examples/crash_demo.py rename to examples/crash/crash_demo.py index 8d111cdf..79797751 100644 --- a/examples/crash_demo.py +++ b/examples/crash/crash_demo.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""单进程 crash demo — ``PROBING=1 python examples/crash_demo.py [--mode exception]``. +"""单进程 crash demo — ``PROBING=1 python examples/crash/crash_demo.py [--mode exception]``. Probing 由 site hook 自动加载;本脚本不 import probing。 ``record``:后台线程异常,写入 memtable 后正常退出;``exception``:主线程崩溃。 diff --git a/examples/crash_torchrun_demo.py b/examples/crash/crash_torchrun_demo.py similarity index 95% rename from examples/crash_torchrun_demo.py rename to examples/crash/crash_torchrun_demo.py index 57e953e2..f50443d7 100644 --- a/examples/crash_torchrun_demo.py +++ b/examples/crash/crash_torchrun_demo.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""torchrun crash demo — run via ``./examples/run_crash_torchrun.sh``. +"""torchrun crash demo — run via ``./examples/crash/run_torchrun.sh``. Probing loads from ``PROBING=…`` (site hook); crash capture needs no imports here. Modes: ``record`` (thread exception, process stays up), ``exception`` / ``all`` (fatal). diff --git a/examples/crash/run_demo.sh b/examples/crash/run_demo.sh new file mode 100755 index 00000000..7a5ef6cb --- /dev/null +++ b/examples/crash/run_demo.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +# 单进程 crash demo。 +# +# ./examples/crash/run_demo.sh +# ./examples/crash/run_demo.sh exception +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +export PROBING_CRASH_NO_GRACE="${PROBING_CRASH_NO_GRACE:-1}" +MODE="${1:-record}" +shift || true +exec python examples/crash/crash_demo.py --mode "$MODE" "$@" diff --git a/examples/run_crash_torchrun.sh b/examples/crash/run_torchrun.sh similarity index 76% rename from examples/run_crash_torchrun.sh rename to examples/crash/run_torchrun.sh index 1d4dd167..d10165d9 100755 --- a/examples/run_crash_torchrun.sh +++ b/examples/crash/run_torchrun.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash -# torchrun crash demo — run from repo root: ./examples/run_crash_torchrun.sh [mode] [crash-rank] +# torchrun crash demo — run from repo root: ./examples/crash/run_torchrun.sh [mode] [crash-rank] # mode: record (default) | exception | all set -euo pipefail -cd "$(dirname "$0")/.." +cd "$(dirname "$0")/../.." [[ -f .venv/bin/activate ]] && source .venv/bin/activate MODE="${1:-record}" @@ -23,4 +23,4 @@ python -c "import torch" 2>/dev/null || { exec torchrun --standalone --nnodes=1 --nproc_per_node="$NPROC" \ --master_addr=127.0.0.1 --master_port="$MASTER_PORT" --local_addr=127.0.0.1 \ - examples/crash_torchrun_demo.py --mode "$MODE" --crash-rank "$CRASH_RANK" + examples/crash/crash_torchrun_demo.py --mode "$MODE" --crash-rank "$CRASH_RANK" diff --git a/examples/getting-started/README.md b/examples/getting-started/README.md new file mode 100644 index 00000000..d2f6d8ba --- /dev/null +++ b/examples/getting-started/README.md @@ -0,0 +1,33 @@ +# Getting started + +入门与冒烟:tracing、hooks、ExternalTable、父子进程注入。 + +## 依赖 + +- `torch`(`tracing.py` / `hooks.py`) +- 其余脚本仅需 probing + +## 运行 + +```bash +./examples/getting-started/run_tracing.sh # 推荐:span / phase +./examples/getting-started/run_hooks.sh +./examples/getting-started/run_external_table.sh +./examples/getting-started/run_test.sh --depth 2 +``` + +或: + +```bash +PROBING=1 python examples/getting-started/tracing.py +``` + +## 文件 + +| 文件 | 说明 | +|------|------| +| `tracing.py` | Tracing 入门(~80 行) | +| `hooks.py` | Torch module hook → ExternalTable | +| `external_table.py` | ExternalTable API | +| `test_probing.py` | 父子进程 / 嵌套 PROBING | +| `nogil_sleep.pyx` | nogil 相关实验片段 | diff --git a/examples/child_test_probing.py b/examples/getting-started/child_test_probing.py similarity index 100% rename from examples/child_test_probing.py rename to examples/getting-started/child_test_probing.py diff --git a/examples/external_table.py b/examples/getting-started/external_table.py similarity index 100% rename from examples/external_table.py rename to examples/getting-started/external_table.py diff --git a/examples/hooks.py b/examples/getting-started/hooks.py similarity index 100% rename from examples/hooks.py rename to examples/getting-started/hooks.py diff --git a/examples/nogil_sleep.pyx b/examples/getting-started/nogil_sleep.pyx similarity index 100% rename from examples/nogil_sleep.pyx rename to examples/getting-started/nogil_sleep.pyx diff --git a/examples/getting-started/run_external_table.sh b/examples/getting-started/run_external_table.sh new file mode 100755 index 00000000..f355dc4f --- /dev/null +++ b/examples/getting-started/run_external_table.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# ExternalTable API 冒烟。 +# +# ./examples/getting-started/run_external_table.sh +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +exec python examples/getting-started/external_table.py "$@" diff --git a/examples/getting-started/run_hooks.sh b/examples/getting-started/run_hooks.sh new file mode 100755 index 00000000..7095d5da --- /dev/null +++ b/examples/getting-started/run_hooks.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Torch module hooks 演示(ExternalTable 写入)。 +# +# ./examples/getting-started/run_hooks.sh +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +exec python examples/getting-started/hooks.py "$@" diff --git a/examples/getting-started/run_test.sh b/examples/getting-started/run_test.sh new file mode 100755 index 00000000..d68a6406 --- /dev/null +++ b/examples/getting-started/run_test.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# 父子进程 / 嵌套 PROBING 冒烟。 +# +# ./examples/getting-started/run_test.sh +# ./examples/getting-started/run_test.sh --depth 2 +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +exec python examples/getting-started/test_probing.py "$@" diff --git a/examples/getting-started/run_tracing.sh b/examples/getting-started/run_tracing.sh new file mode 100755 index 00000000..4552dd3f --- /dev/null +++ b/examples/getting-started/run_tracing.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# Tracing 入门 — span / phase hooks。 +# +# ./examples/getting-started/run_tracing.sh +# PROBING_SPAN_BACKENDS=memtable,logger ./examples/getting-started/run_tracing.sh +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +exec python examples/getting-started/tracing.py "$@" diff --git a/examples/test_probing.py b/examples/getting-started/test_probing.py similarity index 100% rename from examples/test_probing.py rename to examples/getting-started/test_probing.py diff --git a/examples/tracing.py b/examples/getting-started/tracing.py similarity index 97% rename from examples/tracing.py rename to examples/getting-started/tracing.py index 14cff683..2d9aa225 100644 --- a/examples/tracing.py +++ b/examples/getting-started/tracing.py @@ -18,11 +18,11 @@ 运行:: - PROBING=1 python examples/tracing.py + PROBING=1 python examples/getting-started/tracing.py 终端实时查看 span(与 memtable 同时生效):: - PROBING=1 PROBING_SPAN_BACKENDS=memtable,logger python examples/tracing.py + PROBING=1 PROBING_SPAN_BACKENDS=memtable,logger python examples/getting-started/tracing.py 查看最近 span(另开终端):: diff --git a/examples/imagenet/README.md b/examples/imagenet/README.md new file mode 100644 index 00000000..d159f44b --- /dev/null +++ b/examples/imagenet/README.md @@ -0,0 +1,33 @@ +# ImageNet / soak + +合成 ImageNet 训练长跑、DDP 演示与 soak 断言(CI `soak.yml` 使用本目录)。 + +## 入口 + +```bash +# ~10 min 单进程 CPU soak + assertions +./examples/imagenet/run_soak.sh + +# 短冒烟 +DURATION_SEC=60 MAX_STEPS=8 ./examples/imagenet/run_soak.sh + +# 2-rank gloo DDP +NPROC=2 DIST_BACKEND=gloo DURATION_SEC=120 ./examples/imagenet/run_soak.sh + +# 专用分布式 demo(Web UI :18080) +./examples/imagenet/run_ddp.sh +``` + +## 依赖 + +`torch` + `torchvision` + +## 文件 + +| 文件 | 说明 | +|------|------| +| `run_soak.sh` | 长跑编排(CI / `make soak`) | +| `run_ddp.sh` | 默认 2-rank DDP | +| `imagenet_with_span.py` | 带 span 的训练脚本 | +| `imagenet.py` | 经典 ImageNet 训练 | +| `soak_assert.py` | 训后 SQL / overhead 断言 | diff --git a/examples/imagenet.py b/examples/imagenet/imagenet.py similarity index 100% rename from examples/imagenet.py rename to examples/imagenet/imagenet.py diff --git a/examples/imagenet_with_span.py b/examples/imagenet/imagenet_with_span.py similarity index 99% rename from examples/imagenet_with_span.py rename to examples/imagenet/imagenet_with_span.py index db4cff5a..f2287874 100644 --- a/examples/imagenet_with_span.py +++ b/examples/imagenet/imagenet_with_span.py @@ -172,7 +172,7 @@ parser.add_argument( "--soak-assert", action="store_true", - help="run examples/soak_assert.py before exit (rank 0 in distributed runs)", + help="run examples/imagenet/soak_assert.py before exit (rank 0 in distributed runs)", ) best_acc1 = 0 diff --git a/examples/run_imagenet_ddp.sh b/examples/imagenet/run_ddp.sh similarity index 95% rename from examples/run_imagenet_ddp.sh rename to examples/imagenet/run_ddp.sh index db8a56c8..754e622b 100755 --- a/examples/run_imagenet_ddp.sh +++ b/examples/imagenet/run_ddp.sh @@ -9,9 +9,9 @@ # uv pip install torch torchvision # # Usage: -# ./examples/run_imagenet_ddp.sh -# DURATION_SEC=60 ./examples/run_imagenet_ddp.sh -# NPROC=2 DIST_BACKEND=nccl ./examples/run_imagenet_ddp.sh # needs >=2 GPUs +# ./examples/imagenet/run_ddp.sh +# DURATION_SEC=60 ./examples/imagenet/run_ddp.sh +# NPROC=2 DIST_BACKEND=nccl ./examples/imagenet/run_ddp.sh # needs >=2 GPUs # # While training (rank 0): # http://127.0.0.1:${PROBING_PORT}/ @@ -25,7 +25,7 @@ set -euo pipefail -ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" cd "$ROOT" [[ -f .venv/bin/activate ]] && source .venv/bin/activate @@ -87,7 +87,7 @@ if command -v lsof >/dev/null 2>&1; then fi COMMON_ARGS=( - examples/imagenet_with_span.py + examples/imagenet/imagenet_with_span.py /tmp/imagenet-dummy --dummy --no-validate diff --git a/examples/run_soak.sh b/examples/imagenet/run_soak.sh similarity index 90% rename from examples/run_soak.sh rename to examples/imagenet/run_soak.sh index 73f87b65..0fe1e364 100755 --- a/examples/run_soak.sh +++ b/examples/imagenet/run_soak.sh @@ -2,14 +2,14 @@ # Long-running probing soak: synthetic ImageNet training + post-run assertions. # # Usage (single process, CPU-friendly): -# ./examples/run_soak.sh -# DURATION_SEC=1200 ./examples/run_soak.sh +# ./examples/imagenet/run_soak.sh +# DURATION_SEC=1200 ./examples/imagenet/run_soak.sh # # Distributed (gloo on CPU, NCCL on CUDA): -# NPROC=2 DIST_BACKEND=gloo ./examples/run_soak.sh +# NPROC=2 DIST_BACKEND=gloo ./examples/imagenet/run_soak.sh # # Dedicated 2-rank demo (cluster query / flamegraph / profile SQL): -# ./examples/run_imagenet_ddp.sh +# ./examples/imagenet/run_ddp.sh # # Env: # DURATION_SEC wall-clock cap (default 600) @@ -21,7 +21,7 @@ set -euo pipefail -ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" cd "$ROOT" [[ -f .venv/bin/activate ]] && source .venv/bin/activate @@ -58,7 +58,7 @@ mkdir -p "$PROBING_DATA_DIR" TORCHRUN=("$PYTHON" -m torch.distributed.run) COMMON_ARGS=( - examples/imagenet_with_span.py + examples/imagenet/imagenet_with_span.py /tmp/imagenet-dummy --dummy --no-validate diff --git a/examples/soak_assert.py b/examples/imagenet/soak_assert.py similarity index 98% rename from examples/soak_assert.py rename to examples/imagenet/soak_assert.py index 367b3676..530eea35 100755 --- a/examples/soak_assert.py +++ b/examples/imagenet/soak_assert.py @@ -4,7 +4,7 @@ Run inside a probing-injected process after a soak workload, or standalone against persisted memtable data (``PROBING_DATA_DIR``):: - PROBING=1 python examples/soak_assert.py --require-torch-profiling + PROBING=1 python examples/imagenet/soak_assert.py --require-torch-profiling Exit code 0 on success, 1 on assertion failure. """ diff --git a/examples/inference/README.md b/examples/inference/README.md new file mode 100644 index 00000000..a3a6f762 --- /dev/null +++ b/examples/inference/README.md @@ -0,0 +1,26 @@ +# Inference + +vLLM / SGLang 推理侧 probing 演示。 + +## 入口 + +```bash +# 真实 vLLM 离线推理 soak(Linux/CUDA 或 macOS vllm-metal) +./examples/inference/run_vllm_soak.sh +DURATION_SEC=60 ./examples/inference/run_vllm_soak.sh +# browser: http://127.0.0.1:18081/ + +# SGLang / 推理 metrics demo +./examples/inference/run_sglang_demo.sh +``` + +契约测试:`tests/regression/ext/test_vllm_contract.py`。 + +## 文件 + +| 文件 | 说明 | +|------|------| +| `run_vllm_soak.sh` | vLLM soak 编排 | +| `vllm_offline_soak.py` | 离线 generate 循环 | +| `run_sglang_demo.sh` | metrics demo | +| `sglang_inference_metrics_demo.py` | 推理引擎指标 | diff --git a/examples/run_inference_metrics_demo.sh b/examples/inference/run_sglang_demo.sh similarity index 100% rename from examples/run_inference_metrics_demo.sh rename to examples/inference/run_sglang_demo.sh diff --git a/examples/run_vllm_soak.sh b/examples/inference/run_vllm_soak.sh similarity index 94% rename from examples/run_vllm_soak.sh rename to examples/inference/run_vllm_soak.sh index 75b68534..6f5f0c2d 100755 --- a/examples/run_vllm_soak.sh +++ b/examples/inference/run_vllm_soak.sh @@ -7,9 +7,9 @@ # macOS: install vllm-metal — https://github.com/vllm-project/vllm-metal # # Usage: -# ./examples/run_vllm_soak.sh -# DURATION_SEC=120 ./examples/run_vllm_soak.sh -# VLLM_MODEL=facebook/opt-125m ./examples/run_vllm_soak.sh +# ./examples/inference/run_vllm_soak.sh +# DURATION_SEC=120 ./examples/inference/run_vllm_soak.sh +# VLLM_MODEL=facebook/opt-125m ./examples/inference/run_vllm_soak.sh # # Browser: http://127.0.0.1:${PROBING_PORT}/ # @@ -17,7 +17,7 @@ set -euo pipefail -ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" cd "$ROOT" [[ -f .venv/bin/activate ]] && source .venv/bin/activate @@ -134,7 +134,7 @@ export VLLM_MODEL mkdir -p "$PROBING_DATA_DIR" COMMON_ARGS=( - examples/vllm_offline_soak.py + examples/inference/vllm_offline_soak.py --model "$VLLM_MODEL" --max-duration-sec "$DURATION_SEC" --batch-sleep-ms "$BATCH_SLEEP_MS" diff --git a/examples/sglang_inference_metrics_demo.py b/examples/inference/sglang_inference_metrics_demo.py similarity index 94% rename from examples/sglang_inference_metrics_demo.py rename to examples/inference/sglang_inference_metrics_demo.py index a83d0d4c..c71e20ab 100644 --- a/examples/sglang_inference_metrics_demo.py +++ b/examples/inference/sglang_inference_metrics_demo.py @@ -8,14 +8,14 @@ Usage:: # PROBING_PORT is required for browser access (otherwise only a Unix socket is started). - PROBING=1 PROBING_PORT=8080 python examples/sglang_inference_metrics_demo.py + PROBING=1 PROBING_PORT=8080 python examples/inference/sglang_inference_metrics_demo.py # Use a real ``sglang.launch_server`` you already launched (metrics at /metrics): - PROBING=1 PROBING_PORT=8080 python examples/sglang_inference_metrics_demo.py \\ + PROBING=1 PROBING_PORT=8080 python examples/inference/sglang_inference_metrics_demo.py \\ --engine-url http://127.0.0.1:30000 # Slime router / model gateway (metrics at /engine_metrics): - PROBING=1 PROBING_PORT=8080 python examples/sglang_inference_metrics_demo.py \\ + PROBING=1 PROBING_PORT=8080 python examples/inference/sglang_inference_metrics_demo.py \\ --engine-url http://127.0.0.1:30000 \\ --metrics-path /engine_metrics @@ -93,7 +93,7 @@ def _probe_http_ui(port: int) -> bool: def _print_web_ui_unavailable_help(port: int) -> None: - script = "examples/sglang_inference_metrics_demo.py" + script = "examples/inference/sglang_inference_metrics_demo.py" if __file__.endswith("sglang_inference_metrics_demo.py"): script = __file__ print() diff --git a/examples/vllm_offline_soak.py b/examples/inference/vllm_offline_soak.py similarity index 98% rename from examples/vllm_offline_soak.py rename to examples/inference/vllm_offline_soak.py index 81aff1d7..58e36ce9 100644 --- a/examples/vllm_offline_soak.py +++ b/examples/inference/vllm_offline_soak.py @@ -13,8 +13,8 @@ 运行:: - ./examples/run_vllm_soak.sh - VLLM_MODEL=facebook/opt-125m DURATION_SEC=120 ./examples/run_vllm_soak.sh + ./examples/inference/run_vllm_soak.sh + VLLM_MODEL=facebook/opt-125m DURATION_SEC=120 ./examples/inference/run_vllm_soak.sh """ from __future__ import annotations diff --git a/examples/job-tracker/README.md b/examples/job-tracker/README.md new file mode 100644 index 00000000..553655bf --- /dev/null +++ b/examples/job-tracker/README.md @@ -0,0 +1,17 @@ +# Job tracker + +作业开始 / 结束 hook 示例(集群作业元数据上报骨架)。 + +## 入口 + +```bash +./examples/job-tracker/run.sh +./examples/job-tracker/run.sh via-init +``` + +## 文件 + +| 文件 | 说明 | +|------|------| +| `job_tracker.py` | HTTP 上报示例 | +| `job_tracker_via_init.py` | 仅本地打印的轻量版 | diff --git a/examples/job_tracker.py b/examples/job-tracker/job_tracker.py similarity index 100% rename from examples/job_tracker.py rename to examples/job-tracker/job_tracker.py diff --git a/examples/job_tracker_via_init.py b/examples/job-tracker/job_tracker_via_init.py similarity index 100% rename from examples/job_tracker_via_init.py rename to examples/job-tracker/job_tracker_via_init.py diff --git a/examples/job-tracker/run.sh b/examples/job-tracker/run.sh new file mode 100755 index 00000000..9354c818 --- /dev/null +++ b/examples/job-tracker/run.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# 作业开始/结束 hook 演示。 +# +# ./examples/job-tracker/run.sh +# ./examples/job-tracker/run.sh via-init +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +MODE="${1:-hook}" +case "$MODE" in + via-init) + exec python examples/job-tracker/job_tracker_via_init.py + ;; + *) + exec python examples/job-tracker/job_tracker.py + ;; +esac diff --git a/examples/megatron/README.md b/examples/megatron/README.md new file mode 100644 index 00000000..47807f88 --- /dev/null +++ b/examples/megatron/README.md @@ -0,0 +1,35 @@ +# Megatron + +Megatron 相关示例:真实 Core 训练、fakes 本地调试、真 Megatron-LM `pretrain_gpt.py`。 + +## 入口 + +```bash +# macOS / 无 CUDA:scripted fakes(非真 forward) +./examples/megatron/run_fakes.sh + +# 真实 Megatron-LM + 底层 fake(默认 ../Megatron-LM) +./examples/megatron/run_real_lm.sh +# 切换版本:MEGATRON_LM=/path/to/other-checkout ./examples/megatron/run_real_lm.sh + +# Linux + CUDA:真实 megatron-core soak + Web UI +./examples/megatron/run_soak.sh +DURATION_SEC=60 NPROC=1 TP_SIZE=1 ./examples/megatron/run_soak.sh +# browser: http://127.0.0.1:18080/ +``` + +契约测试(mock):`make test-python-regression` → `tests/regression/ext/test_megatron_contract.py`。 + +## 文件 + +| 文件 | 说明 | +|------|------| +| `run_fakes.sh` | `pretrain_gpt.py`(fakes/meta) | +| `run_real_lm.sh` | 真版 `Megatron-LM/pretrain_gpt.py` + bottom fakes | +| `run_soak.sh` | megatron-core torchrun soak | +| `pretrain_gpt.py` | Megatron 风格 CLI(fakes) | +| `run_megatron_lm_pretrain.py` | 真 LM runner | +| `megatron_meta_debug_loop.py` | meta scripted role/step loop | +| `megatron_mcore_train_loop.py` | 真实 mcore 训练循环 | + +详见 `python/probing/fakes/README.md`。 diff --git a/examples/megatron_mcore_train_loop.py b/examples/megatron/megatron_mcore_train_loop.py similarity index 100% rename from examples/megatron_mcore_train_loop.py rename to examples/megatron/megatron_mcore_train_loop.py diff --git a/examples/megatron/megatron_meta_debug_loop.py b/examples/megatron/megatron_meta_debug_loop.py new file mode 100644 index 00000000..f7b139dd --- /dev/null +++ b/examples/megatron/megatron_meta_debug_loop.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +"""macOS / no-CUDA Megatron-shaped debug loop via ``probing.fakes``. + +Uses **meta** (default) to stand in for CUDA. This does **not** run a real +Megatron forward — it exercises probing role/step sync and import fakes. + + PROBING=1 python examples/megatron/megatron_meta_debug_loop.py + PROBING_FAKE_DEVICE=cpu PROBING=1 python examples/megatron/megatron_meta_debug_loop.py +""" + +from __future__ import annotations + +import os + + +def main() -> None: + os.environ.setdefault("PROBING_FAKES", "1") + os.environ.setdefault("PROBING_FAKES_FORCE", "1") + os.environ.setdefault("PROBING_FAKE_DEVICE", "meta") + os.environ.setdefault("PROBING_MEGATRON", "on") + os.environ.setdefault("PROBING_MEGATRON_STEP_SYNC", "on") + os.environ.setdefault("PROBING_NCCL_MOCK", "1") + + from probing.fakes import run_scripted_loop + + result = run_scripted_loop(steps=4, tp=1, pp=0, dp=0, micro_batches=2) + print( + f"ok: steps={result.steps} role={result.role} " + f"device={result.device} last_iteration={result.last_iteration}" + ) + print("tip: probing -t query \"SELECT * FROM python.trace_event LIMIT 8\"") + + +if __name__ == "__main__": + main() diff --git a/examples/megatron/pretrain_gpt.py b/examples/megatron/pretrain_gpt.py new file mode 100644 index 00000000..5870ef93 --- /dev/null +++ b/examples/megatron/pretrain_gpt.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +"""Megatron-LM-shaped ``pretrain_gpt.py`` entry for macOS / meta-device debugging. + +This is **not** NVIDIA's real ``pretrain_gpt.py``. It speaks the same CLI dialect +and import surface under ``probing.fakes`` so you can debug probing role/step / +observability locally without CUDA. + + PROBING=1 python examples/megatron/pretrain_gpt.py \\ + --num-layers 2 --hidden-size 64 --num-attention-heads 4 \\ + --seq-length 32 --micro-batch-size 1 --global-batch-size 2 \\ + --train-iters 4 --mock-data + +Or:: + + python -m probing.fakes pretrain_gpt --train-iters 4 +""" + +from __future__ import annotations + +import argparse +import os +import sys + + +def _bootstrap_fakes() -> None: + os.environ.setdefault("PROBING_FAKES", "1") + os.environ.setdefault("PROBING_FAKES_FORCE", "1") + os.environ.setdefault("PROBING_FAKE_DEVICE", "meta") + os.environ.setdefault("PROBING_MEGATRON", "on") + os.environ.setdefault("PROBING_MEGATRON_STEP_SYNC", "on") + os.environ.setdefault("PROBING_NCCL_MOCK", "1") + + from probing.fakes import install + + install(force=True) + + +def parse_args(argv: list[str] | None = None) -> argparse.Namespace: + p = argparse.ArgumentParser(description="Fake Megatron GPT pretrain (meta device)") + p.add_argument("--num-layers", type=int, default=2) + p.add_argument("--hidden-size", type=int, default=64) + p.add_argument("--num-attention-heads", type=int, default=4) + p.add_argument("--seq-length", type=int, default=32) + p.add_argument("--micro-batch-size", type=int, default=1) + p.add_argument("--global-batch-size", type=int, default=2) + p.add_argument("--train-iters", type=int, default=4) + p.add_argument("--tensor-model-parallel-size", type=int, default=1) + p.add_argument("--pipeline-model-parallel-size", type=int, default=1) + p.add_argument("--vocab-size", type=int, default=1024) + p.add_argument("--seed", type=int, default=1234) + p.add_argument("--mock-data", action="store_true", default=True) + p.add_argument("--device", default=None, help="meta|cpu|mps (default: env / meta)") + return p.parse_args(argv) + + +def model_provider(pre_process=True, post_process=True): + from megatron.core.models.gpt import GPTModel + from megatron.training import get_args + + args = get_args() + return GPTModel( + hidden_size=args.hidden_size, + vocab_size=args.padded_vocab_size, + pre_process=pre_process, + post_process=post_process, + ) + + +def forward_step(data_iterator, model): + """Scripted forward: no real tokens; probing still advances via train_step.""" + del data_iterator + # On meta, even a tiny forward may fail — swallow and return a dummy loss path. + try: + out = model() + return out, lambda loss_mask, output_tensor, model=None: ( + output_tensor.sum() * 0, + 1, + {"lm loss": output_tensor.sum() * 0}, + ) + except Exception: + import torch + + z = torch.zeros((), device="cuda") + return z, lambda *a, **k: (z, 1, {"lm loss": z}) + + +def train_valid_test_datasets_provider(train_val_test_num_samples, vp_stage=None): + del train_val_test_num_samples, vp_stage + return None, None, None + + +def main(argv: list[str] | None = None) -> int: + args_ns = parse_args(argv) + if args_ns.device: + os.environ["PROBING_FAKE_DEVICE"] = args_ns.device + + _bootstrap_fakes() + + from megatron.core.enums import ModelType + from megatron.training import pretrain, print_rank_0 + from probing.fakes.specs import megatron as megatron_spec + + fake_args = megatron_spec.default_args( + num_layers=args_ns.num_layers, + hidden_size=args_ns.hidden_size, + num_attention_heads=args_ns.num_attention_heads, + seq_length=args_ns.seq_length, + max_position_embeddings=args_ns.seq_length, + micro_batch_size=args_ns.micro_batch_size, + global_batch_size=args_ns.global_batch_size, + train_iters=args_ns.train_iters, + tensor_model_parallel_size=args_ns.tensor_model_parallel_size, + pipeline_model_parallel_size=args_ns.pipeline_model_parallel_size, + vocab_size=args_ns.vocab_size, + padded_vocab_size=args_ns.vocab_size, + seed=args_ns.seed, + mock_data=args_ns.mock_data, + ) + megatron_spec.set_args(fake_args) + megatron_spec.ensure_sys_modules(args=fake_args) + + print_rank_0("> probing.fakes pretrain_gpt (meta/scripted, not real Megatron-LM)") + print_rank_0( + f"> layers={fake_args.num_layers} hidden={fake_args.hidden_size} " + f"iters={fake_args.train_iters} device={os.environ.get('PROBING_FAKE_DEVICE', 'meta')}" + ) + + result = pretrain( + train_valid_test_datasets_provider, + model_provider, + ModelType.encoder_or_decoder, + forward_step, + model_provider=model_provider, + forward_step_func=forward_step, + train_valid_test_datasets_provider=train_valid_test_datasets_provider, + ) + print_rank_0( + f"> done: iters={result.train_iters} role={result.role} " + f"device={result.device} elapsed={result.elapsed_sec:.3f}s" + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/examples/megatron/run_fakes.sh b/examples/megatron/run_fakes.sh new file mode 100755 index 00000000..57c6f4ea --- /dev/null +++ b/examples/megatron/run_fakes.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# macOS / 无 CUDA:probing.fakes scripted Megatron 循环(非真 forward)。 +# +# ./examples/megatron/run_fakes.sh +# TRAIN_ITERS=4 ./examples/megatron/run_fakes.sh +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +export PROBING_FAKES="${PROBING_FAKES:-1}" +export PROBING_FAKES_FORCE="${PROBING_FAKES_FORCE:-1}" +export PROBING_FAKE_DEVICE="${PROBING_FAKE_DEVICE:-meta}" +ITERS="${TRAIN_ITERS:-4}" +exec python examples/megatron/pretrain_gpt.py --train-iters "$ITERS" "$@" diff --git a/examples/megatron/run_megatron_lm_pretrain.py b/examples/megatron/run_megatron_lm_pretrain.py new file mode 100644 index 00000000..d30dea77 --- /dev/null +++ b/examples/megatron/run_megatron_lm_pretrain.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +"""Run real Megatron-LM ``pretrain_gpt.py`` with probing.fakes bottom-layer only. + +Default checkout: ``../Megatron-LM`` (sibling of the probing repo). Override with +``MEGATRON_LM=/path`` or ``--megatron-lm /path``. + + PROBING=1 python examples/megatron/run_megatron_lm_pretrain.py --train-iters 2 +""" + +from __future__ import annotations + +import os +import sys +from pathlib import Path + + +def main() -> int: + # Ensure full probing init before fakes (avoid -m package circular import). + import probing # noqa: F401 + + from probing.fakes.megatron_lm import main as megatron_main + + return megatron_main(sys.argv[1:]) + + +if __name__ == "__main__": + # Allow running from any cwd. + root = Path(__file__).resolve().parents[1] + if str(root / "python") not in sys.path: + sys.path.insert(0, str(root / "python")) + raise SystemExit(main()) diff --git a/examples/megatron/run_real_lm.sh b/examples/megatron/run_real_lm.sh new file mode 100755 index 00000000..e1a243f2 --- /dev/null +++ b/examples/megatron/run_real_lm.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# 真实 Megatron-LM pretrain_gpt.py + 底层 fake(默认 ../Megatron-LM)。 +# +# ./examples/megatron/run_real_lm.sh +# TRAIN_ITERS=2 MEGATRON_LM=/path/to/Megatron-LM ./examples/megatron/run_real_lm.sh +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +ITERS="${TRAIN_ITERS:-2}" +exec python examples/megatron/run_megatron_lm_pretrain.py --train-iters "$ITERS" "$@" diff --git a/examples/run_megatron_soak.sh b/examples/megatron/run_soak.sh similarity index 90% rename from examples/run_megatron_soak.sh rename to examples/megatron/run_soak.sh index a439c94c..4dfdd327 100755 --- a/examples/run_megatron_soak.sh +++ b/examples/megatron/run_soak.sh @@ -7,9 +7,9 @@ # Linux + NVIDIA GPU(s); default uses 2 ranks with TP=2 # # Usage: -# ./examples/run_megatron_soak.sh -# DURATION_SEC=120 ./examples/run_megatron_soak.sh -# NPROC=1 TP_SIZE=1 ./examples/run_megatron_soak.sh +# ./examples/megatron/run_soak.sh +# DURATION_SEC=120 ./examples/megatron/run_soak.sh +# NPROC=1 TP_SIZE=1 ./examples/megatron/run_soak.sh # # Browser (while training): http://127.0.0.1:${PROBING_PORT}/ # @@ -17,7 +17,7 @@ set -euo pipefail -ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" cd "$ROOT" [[ -f .venv/bin/activate ]] && source .venv/bin/activate @@ -31,7 +31,7 @@ fi _os="$(uname -s)" if [[ "$_os" != "Linux" ]]; then echo "error: Megatron-Core soak requires Linux + NVIDIA CUDA (current OS: $_os)" >&2 - echo " On macOS use ./examples/run_vllm_soak.sh for a real-framework probing demo." >&2 + echo " On macOS use ./examples/inference/run_vllm_soak.sh for a real-framework probing demo." >&2 echo " Megatron contract tests (no megatron-core): make test-python-regression" >&2 exit 1 fi @@ -84,7 +84,7 @@ export PROBING_TORCH_PROFILING="${PROBING_TORCH_PROFILING:-on,shadow=4:1}" mkdir -p "$PROBING_DATA_DIR" COMMON_ARGS=( - examples/megatron_mcore_train_loop.py + examples/megatron/megatron_mcore_train_loop.py --tensor-model-parallel-size "$TP_SIZE" --pipeline-model-parallel-size "$PP_SIZE" --max-duration-sec "$DURATION_SEC" diff --git a/examples/overhead/README.md b/examples/overhead/README.md new file mode 100644 index 00000000..5f70101d --- /dev/null +++ b/examples/overhead/README.md @@ -0,0 +1,26 @@ +# Overhead + +Instrumentation / TorchProbe / NCCL profiler 开销测量。 + +## 入口 + +```bash +./examples/overhead/run_bench.sh # 完整报告 +./examples/overhead/run_bench.sh --quick +./examples/overhead/run_torch_probe_smoke.sh # 无 GPU +make nccl-profiler-lib && ./examples/overhead/run_nccl_bench.sh # Linux + CUDA +``` + +Makefile:`make bench` / `make bench-quick` → `bench_instrumentation.py`。 + +## 文件 + +| 文件 | 说明 | +|------|------| +| `bench_instrumentation.py` | span / phase / TorchProbe 墙钟 | +| `torch_probe_overhead_smoke.py` | TorchProbe 冒烟 | +| `nccl_profiler_overhead.py` | AllReduce E2E | +| `run_nccl_bench.sh` | baseline vs profiled | +| `bench_profiler.py` | 早期综合 profiler 基准 | + +设计文档:`docs/src/design/overhead.md`。 diff --git a/examples/bench_instrumentation.py b/examples/overhead/bench_instrumentation.py similarity index 98% rename from examples/bench_instrumentation.py rename to examples/overhead/bench_instrumentation.py index 01d18d4b..fa3a595a 100644 --- a/examples/bench_instrumentation.py +++ b/examples/overhead/bench_instrumentation.py @@ -4,18 +4,18 @@ Measures wall-clock cost of tracing spans, phase hooks, and TorchProbe at representative settings. Run inside a probing-injected process:: - PROBING=1 python examples/bench_instrumentation.py + PROBING=1 python examples/overhead/bench_instrumentation.py Quick smoke (fewer iterations):: - PROBING=1 python examples/bench_instrumentation.py --quick + PROBING=1 python examples/overhead/bench_instrumentation.py --quick Optional JSON export:: - PROBING=1 python examples/bench_instrumentation.py --json-out /tmp/bench.json + PROBING=1 python examples/overhead/bench_instrumentation.py --json-out /tmp/bench.json NCCL profiler AllReduce overhead is **not** included here (needs multi-GPU + -``examples/run_nccl_profiler_bench.sh``). CPU pprof (SIGPROF) is server-side; +``examples/overhead/run_nccl_bench.sh``). CPU pprof (SIGPROF) is server-side; enable via config and compare with ``probing.pprof.sample_freq=0``. """ @@ -507,7 +507,7 @@ def _print_report_footer() -> None: print("Tips:") print(" • TorchProbe hook_tax compares probed vs shadow steps (shadow=4:1).") print( - " • NCCL profiler: make nccl-profiler-bench or examples/run_nccl_profiler_bench.sh" + " • NCCL profiler: make nccl-profiler-bench or examples/overhead/run_nccl_bench.sh" ) print(" • SQL: SELECT * FROM python.torch_step_timing; python.trace_event") print("=" * 72) diff --git a/examples/bench_profiler.py b/examples/overhead/bench_profiler.py similarity index 100% rename from examples/bench_profiler.py rename to examples/overhead/bench_profiler.py diff --git a/examples/nccl_profiler_overhead.py b/examples/overhead/nccl_profiler_overhead.py similarity index 98% rename from examples/nccl_profiler_overhead.py rename to examples/overhead/nccl_profiler_overhead.py index 97326614..74169652 100644 --- a/examples/nccl_profiler_overhead.py +++ b/examples/overhead/nccl_profiler_overhead.py @@ -8,7 +8,7 @@ Typical usage (Linux + CUDA + built plugin):: make nccl-profiler-lib - ./examples/run_nccl_profiler_bench.sh + ./examples/overhead/run_nccl_bench.sh Manual single run (profiled):: @@ -16,7 +16,7 @@ export NCCL_PROFILE_EVENT_MASK=$(python -m probing.nccl --event-mask) export PROBING=2 export PROBING_NCCL_INFLIGHT_THRESHOLD_SECS=0 # no watchdog noise - torchrun --nproc_per_node=8 examples/nccl_profiler_overhead.py \\ + torchrun --nproc_per_node=8 examples/overhead/nccl_profiler_overhead.py \\ --output /tmp/nccl_bench_profiled.json """ diff --git a/examples/overhead/run_bench.sh b/examples/overhead/run_bench.sh new file mode 100755 index 00000000..37f6d854 --- /dev/null +++ b/examples/overhead/run_bench.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# Instrumentation 开销基准(span / phase / TorchProbe)。 +# +# ./examples/overhead/run_bench.sh +# ./examples/overhead/run_bench.sh --quick +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +exec python examples/overhead/bench_instrumentation.py "$@" diff --git a/examples/run_nccl_profiler_bench.sh b/examples/overhead/run_nccl_bench.sh similarity index 88% rename from examples/run_nccl_profiler_bench.sh rename to examples/overhead/run_nccl_bench.sh index b3289dc6..665acdcc 100755 --- a/examples/run_nccl_profiler_bench.sh +++ b/examples/overhead/run_nccl_bench.sh @@ -3,8 +3,8 @@ # print overhead. Requires Linux, CUDA, PyTorch, and a built plugin (.so). # # Usage: -# ./examples/run_nccl_profiler_bench.sh -# NPROC=8 BENCH_ITERS=500 ./examples/run_nccl_profiler_bench.sh +# ./examples/overhead/run_nccl_bench.sh +# NPROC=8 BENCH_ITERS=500 ./examples/overhead/run_nccl_bench.sh # # Env: # NPROC torchrun --nproc_per_node (default: visible GPU count or 2) @@ -15,7 +15,7 @@ set -euo pipefail -ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" cd "$ROOT" if [[ "$(uname -s)" != "Linux" ]]; then @@ -45,7 +45,7 @@ BASELINE_JSON="$OUT_DIR/baseline.json" PROFILED_JSON="$OUT_DIR/profiled.json" COMMON_ARGS=( - examples/nccl_profiler_overhead.py + examples/overhead/nccl_profiler_overhead.py --warmup-iters "$WARMUP_ITERS" --bench-iters "$BENCH_ITERS" --msg-bytes "$MSG_BYTES" @@ -73,7 +73,7 @@ mkdir -p "$PROBING_DATA_DIR" torchrun --nproc_per_node="$NPROC" "${COMMON_ARGS[@]}" --output "$PROFILED_JSON" echo -python examples/nccl_profiler_overhead.py --compare "$BASELINE_JSON" "$PROFILED_JSON" +python examples/overhead/nccl_profiler_overhead.py --compare "$BASELINE_JSON" "$PROFILED_JSON" echo echo "Raw JSON: $BASELINE_JSON $PROFILED_JSON" diff --git a/examples/overhead/run_torch_probe_smoke.sh b/examples/overhead/run_torch_probe_smoke.sh new file mode 100755 index 00000000..ac303589 --- /dev/null +++ b/examples/overhead/run_torch_probe_smoke.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# TorchProbe shadow-step 开销冒烟(无需 GPU)。 +# +# ./examples/overhead/run_torch_probe_smoke.sh +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +exec python examples/overhead/torch_probe_overhead_smoke.py "$@" diff --git a/examples/torch_probe_overhead_smoke.py b/examples/overhead/torch_probe_overhead_smoke.py similarity index 93% rename from examples/torch_probe_overhead_smoke.py rename to examples/overhead/torch_probe_overhead_smoke.py index 51c36d60..04cc0a40 100644 --- a/examples/torch_probe_overhead_smoke.py +++ b/examples/overhead/torch_probe_overhead_smoke.py @@ -3,11 +3,11 @@ No GPU or torch.distributed required. Run inside a probing-injected process:: - PROBING=1 python examples/torch_probe_overhead_smoke.py + PROBING=1 python examples/overhead/torch_probe_overhead_smoke.py Or from the repo with the dev venv:: - .venv/bin/python examples/torch_probe_overhead_smoke.py + .venv/bin/python examples/overhead/torch_probe_overhead_smoke.py """ from __future__ import annotations diff --git a/examples/ray/README.md b/examples/ray/README.md new file mode 100644 index 00000000..bfabaa98 --- /dev/null +++ b/examples/ray/README.md @@ -0,0 +1,21 @@ +# Ray + +Ray 任务 / Actor 自动 tracing 与 async RL 骨架 demo。 + +## 依赖 + +`ray` + +## 入口 + +```bash +./examples/ray/run_tracing.sh +PROBING_PORT=8080 ./examples/ray/run_job_actor.sh +``` + +## 文件 + +| 文件 | 说明 | +|------|------| +| `ray_tracing_example.py` | `_tracing_startup_hook` | +| `ray_job_actor_span_demo.py` | slime 风格 actor spans | diff --git a/examples/ray_job_actor_span_demo.py b/examples/ray/ray_job_actor_span_demo.py similarity index 100% rename from examples/ray_job_actor_span_demo.py rename to examples/ray/ray_job_actor_span_demo.py diff --git a/examples/ray_tracing_example.py b/examples/ray/ray_tracing_example.py similarity index 100% rename from examples/ray_tracing_example.py rename to examples/ray/ray_tracing_example.py diff --git a/examples/ray/run_job_actor.sh b/examples/ray/run_job_actor.sh new file mode 100755 index 00000000..a03f1e23 --- /dev/null +++ b/examples/ray/run_job_actor.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# Ray actor span demo(slime 风格 async RL 骨架)。 +# +# ./examples/ray/run_job_actor.sh +# PROBING_PORT=8080 ./examples/ray/run_job_actor.sh +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +export PROBING_PORT="${PROBING_PORT:-8080}" +exec python examples/ray/ray_job_actor_span_demo.py "$@" diff --git a/examples/ray/run_tracing.sh b/examples/ray/run_tracing.sh new file mode 100755 index 00000000..b9e384b2 --- /dev/null +++ b/examples/ray/run_tracing.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Ray + probing tracing hook。 +# +# ./examples/ray/run_tracing.sh +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$ROOT" +[[ -f .venv/bin/activate ]] && source .venv/bin/activate +export PROBING="${PROBING:-1}" +exec python examples/ray/ray_tracing_example.py "$@" diff --git a/ppt/convert_to_pdf.py b/ppt/convert_to_pdf.py new file mode 100644 index 00000000..8f4db1bc --- /dev/null +++ b/ppt/convert_to_pdf.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +"""Convert the HTML PPT to PDF using WeasyPrint.""" +import re +from weasyprint import HTML +from pathlib import Path + +src = Path("/Users/reiase/workspace/probing/ppt/probing-presentation.html") +html = src.read_text(encoding="utf-8") + +# 1. Replace slide CSS: show all slides, remove absolute positioning +html = html.replace( + ".slide {\n width: 1280px;\n height: 720px;\n background: var(--bg);\n position: absolute;\n display: none;\n flex-direction: column;\n overflow: hidden;\n box-shadow: var(--shadow-lg);\n border-radius: 12px;\n }", + ".slide {\n width: 1280px;\n height: 720px;\n background: var(--bg);\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-shadow: var(--shadow-lg);\n border-radius: 12px;\n page-break-after: always;\n margin-bottom: 0;\n }" +) + +# 2. Remove .slide.active rule (no longer needed) +html = html.replace(".slide.active { display: flex; }", "") + +# 3. Fix body for print +html = html.replace( + "body {\n font-family: -apple-system, BlinkMacSystemFont, \"PingFang SC\", \"Microsoft YaHei\", \"Helvetica Neue\", Arial, sans-serif;\n background: #0f172a;\n color: var(--text);\n overflow: hidden;\n height: 100vh;\n }", + "body {\n font-family: -apple-system, BlinkMacSystemFont, \"PingFang SC\", \"Microsoft YaHei\", \"Helvetica Neue\", Arial, sans-serif;\n background: #ffffff;\n color: var(--text);\n overflow: visible;\n height: auto;\n margin: 0;\n padding: 0;\n }" +) + +# 4. Fix slide-container for print +html = html.replace( + ".slide-container {\n width: 100vw;\n height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n }", + ".slide-container {\n width: 1280px;\n display: block;\n position: relative;\n }" +) + +# 5. Hide nav bar +html = html.replace( + ".nav-bar {", + ".nav-bar { display: none !important;" +) + +# 6. Hide progress bar +html = html.replace( + ".progress-container {", + ".progress-container { display: none !important;" +) + +# 7. Fix gradient text (weasyprint doesn't support -webkit-background-clip: text) +html = html.replace( + "background: linear-gradient(135deg, #fff 0%, #93c5fd 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;", + "color: #93c5fd;" +) + +# 8. Fix title slide gradient text +html = re.sub( + r"background:\s*linear-gradient\(135deg,\s*#fff[^;]*\);\s*-webkit-background-clip:\s*text;\s*-webkit-text-fill-color:\s*transparent;", + "color: #ffffff;", + html +) + +# 9. Remove backdrop-filter (not supported by weasyprint) +html = re.sub(r"backdrop-filter:\s*blur\([^)]+\);", "", html) + +# 10. Remove the JavaScript (not needed for print) +# Find and remove the ', '', html, flags=re.DOTALL) + +# 11. Add @page rule for PDF page size +page_css = """ + @page { + size: 1280px 720px; + margin: 0; + } + @page :first { + margin: 0; + } +""" + +# Insert @page rule before the closing +html = html.replace("", page_css + "") + +# 12. Remove slide-indicator visibility for print (optional - keep for reference) +# Actually keep them, they show page numbers + +# Write the print-friendly HTML for reference +print_path = Path("/Users/reiase/workspace/probing/ppt/probing-print.html") +print_path.write_text(html, encoding="utf-8") +print(f"Print HTML saved to {print_path}") + +# Convert to PDF +output_pdf = Path("/Users/reiase/workspace/probing/ppt/probing-presentation.pdf") +print("Converting to PDF...") +HTML(string=html, base_url=str(src.parent)).write_pdf(str(output_pdf)) +print(f"PDF saved to {output_pdf}") +print(f"File size: {output_pdf.stat().st_size / 1024 / 1024:.1f} MB") diff --git a/ppt/probing-presentation.html b/ppt/probing-presentation.html new file mode 100644 index 00000000..5894f257 --- /dev/null +++ b/ppt/probing-presentation.html @@ -0,0 +1,2357 @@ + + + + + +Probing — Agent-Native 分布式AI训练诊断 + + + + +
+ +
+ + +
+
+
P
+
Probing
+
+

Agent-Native
分布式AI训练诊断系统

+
让 Coding Agent 长出看穿分布式训练的眼睛和手
揭开 AI 性能的真相
+
+
+
版本
+
v0.2.5 (Beta)
+
+
+
代码规模
+
Rust 86K + Python 15K + Web 21K
+
+
+
开源协议
+
Apache 2.0
+
+
+
日期
+
2026.07
+
+
+
+
+ + +
+
+ +
+
汇报内容
+
从价值到技术到增长 — 用云原生语言理解 Probing
+
+
+
01
+
+

价值和意义

+

万卡训练时代的诊断范式革命。用 K8s 类比定位:Probing 之于 AI 训练诊断 ≈ K8s 之于容器编排 — 从碎片化工具到统一平台,但难度更高(不能停机)

+
+
+
+
02
+
+

技术方案和独特性

+

四层架构设计、没有北向流量的范式选择、五大创新设计原则、SQL 联邦查询、分布式火焰图、Python 变量跟踪、NCCL 等待分解 — 6 项业界首创

+
+
+
+
03
+
+

技术深度与竞品比较

+

10 款业界工具逐维度对比,总分 3.85 架构领先但成熟度差距明显。诚实评估五大短板,明确互补而非替代的定位

+
+
+
+
04
+
+

增长计划

+

目标用户:AI Infra 团队。框架无关统一接入,AI Agent 自动诊断。增长飞轮:部署→零改动接入→自动诊断→Skill 沉淀。从工具到平台

+
+
+
+
2 / 22
+
+ + +
+
+ +
+
万卡训练时代,传统诊断范式正在崩溃
+
GPU 规模从 256 扩展到 10,000+,传统 "先收集再分析" 范式在三个维度同时失效
+ +
+
+
O(N²)
+
数据传输爆炸
万卡全量 trace 达 TB 级,收集本身成为瓶颈
+
+
+
3h+
+
人工不可行
10K rank 逐个检查,即使每 rank 1 秒也需近 3 小时
+
+
+
误判
+
级联故障误归因
ring/tree 拓扑中 1 个慢点多跳传播,统计方法将受害者误判为罪魁
+
+
+ +
+ 核心矛盾:训练规模在指数级增长,但诊断工具仍停留在"生成火焰图 → 人工解读"的旧范式。当 GPU 数量超过 1,000 时,没有任何人类专家能有效遍历所有 rank 的性能数据。 +
+ +
+
+
传统 Profiler 的困境
+
+ PyTorch Profiler、Nsight Systems 生成 GB 级 trace 文件,需要人工通过 GUI 分析;不支持结构化查询;不支持跨 rank 联邦聚合;无 AI Agent 接口;诊断知识不可复用。 +
+
+
+
需要的范式转换
+
+ 从 "收集 → 分析" 转向 "查询 → 归因 → 闭环":查询推送到数据所在位置,利用执行模型做确定性归因,AI Agent 自主完成诊断闭环。 +
+
+
+
3 / 22
+
+ + +
+
+ +
+
Probing:Agent-Native 诊断范式
+
不是又一个 Profiler,而是让 AI Agent 成为诊断流程一等公民的基础设施
+ +
+
+
Step 1
+
观测
+
SQL 查询活体遥测
python.torch_trace, nccl.proxy_ops
+
+
+
+
Step 2
+
诊断
+
运行结构化 Skill
health_overview, slow_rank
+
+
+
+
Step 3
+
行动
+
干预活体进程
eval, config, inject
+
+
+
+
Step 4
+
验证
+
再次查询确认
闭环诊断回路
+
+
+ +
+
+
三大用户价值
+
+
+ 研究员 + 调试训练不稳定性,实时检查张量值和梯度,无需停止训练 +
+
+ 框架开发者 + 零侵入分析框架内部,在生产环境中调试用户报告的问题 +
+
+ MLOps + 无需重启服务即可监控,跨节点关联性能问题 +
+
+
+
+
安全边界设计
+
+ MCP 接口默认只读:仅接受 SELECT/WITH/SHOW/DESCRIBE,结果有大小上限。

+ 干预类工具(set_config、eval_python)需显式设置 PROBING_MCP_ALLOW_WRITE=1 才启用,且每次写入都有审计日志。

+ Agent 能放手诊断,只有在你明确授权时才可改动训练任务。 +
+
+
+
4 / 22
+
+ + +
+
+ +
+
如果用云原生语言理解 Probing
+
Probing 之于 AI 训练诊断 ≈ K8s 之于容器编排 — 从碎片化工具到统一平台
+ +
+ +
+
K8s / 云原生  →  Probing
+
+
+ Kubelet in every Node + + Probe in every Rank +
+
+ kubectl (声明式 YAML) + + SQL (声明式查询) +
+
+ CRD / Operator + + Skills (steps.yaml) +
+
+ CSI / CNI 标准接口 + + ProbeDataSource 契约 +
+
+ KubeFed / Cluster API + + global.* 联邦查询 +
+
+ Prometheus pull-based + + 没有北向流量 +
+
+ Sidecar 注入 (webhook) + + PROBING=1 / inject +
+
+ OperatorHub / Helm Hub + + Skills 社区市场 +
+
+
+ + +
+
+
同一个级别的意义
+
+ K8s 统一了碎片化的容器编排生态:Mesos / Swarm / Nomad → 统一 API + 声明式模型

+ Probing 正在统一碎片化的训练诊断生态:Nsight / PyTorch Profiler / Megatron profiler → 统一 SQL + Agent 接口

+ 两者都是从"每个团队写脚本"到"声明一个意图"的范式跃迁。 +
+
+
+
但难度更高
+
+ K8s 管理的是无状态容器——Pod 挂了可以重启,调度失败可以重试。

+ Probing 管理的是有状态训练进程——不能重启、不能中断、不能有可感知开销。万卡训练一次中断损失数十万元,zero-overhead 不是优化目标而是生存约束。

+ 相当于在不能停机的生产数据库内部建一套 K8s 控制面。 +
+
+
+
+ +
+ 一句话给老板:K8s 让部署从写脚本变成写 YAML;Probing 让诊断从写脚本变成写 SQL。K8s 管无状态容器可重启,Probing 管有状态训练进程不能中断——这是更硬的约束,也是更深的护城河。 +
+
5 / 22
+
+ + +
+
+ +
+
项目规模与技术资产
+
Probing 已具备完整的系统级实现,覆盖从底层存储到 Agent 接口的全链路
+ +
+
+
86K
+
Rust 代码行
(不含 Web)
+
+
+
15K
+
Python SDK
代码行
+
+
+
21K
+
Web UI
(Dioxus WASM)
+
+
+
15
+
Workspace
Crates
+
+
+ +
+
+
诊断能力覆盖
+
+
+ 预置诊断 Skill + 13 个 +
+
+ MCP 工具 + 8 个 +
+
+ SQL 数据表 + 20+ 表 +
+
+ 联邦标签列 + 6 个 +
+
+ 开销不变量 + 6 条形式化 +
+
+
+
+
硬件与生态支持
+
+
+ NVIDIA NCCL + v3 + v4 ABI +
+
+ 华为昇腾 HCCL + Shim 兼容层 +
+
+ PyTorch + 2.8+ 推荐 +
+
+ Agent 集成 + Cursor/Claude/Codex +
+
+ 平台 + Linux (macOS 部分) +
+
+
+
+ +
+ 安装即用:pip install probing — 零代码修改,PROBING=1 python train.py 即可启用,或 probing -t PID inject 注入运行中进程。 +
+
6 / 22
+
+ + +
+
+ +
+
四层分层架构 — 教科书级 Clean Architecture
+
依赖方向严格单向向下,6 个公共契约定义模块交互边界,组合根只存在于 engine.rs
+ +
+
+
L4
+
+ Experience 体验层 — skills/ (13个诊断剧本) · web/ (Dioxus WASM UI) · Python hooks  ≈ Helm / Operator 生态
+ 诊断 UX、声明式知识库、可视化 +
+
+
↓ 依赖方向
+
+
L3
+
+ Control 控制层 — probing/server (HTTP/MCP) · probing/cli (命令行)  ≈ API Server + kubectl
+ HTTP API、MCP 工具、注入、联邦 fan-out +
+
+
+
+
L2
+
+ Collectors 采集层 — probing-python · probing-nccl-profiler · probing-gpu · probing-cc  ≈ CSI / CNI 驱动
+ 指标采集:Torch trace、NCCL proxy、GPU 利用率、系统指标 +
+
+
+
+
L1
+
+ Platform 平台层 — probing-core (SQL引擎/联邦) · memtable (无锁存储) · proto (wire types) · macros  ≈ etcd + controller manager
+ Apache DataFusion SQL 引擎、联邦三路径路由、MEMT 二进制格式 +
+
+
+ +
+
+
6 个公共契约
+
+ ProbeDataSource SQL 表注册
+ ProbeExtension 配置 + HTTP API
+ @table Python 数据表
+ skills YAML 诊断剧本
+ proto DTOs 线协议
+ Federation tags 联邦标签 +
+
+
+
关键设计原则
+
+ 组合根只在 engine.rs · 不允许 L2 collector 交叉依赖 · 禁止 CLI/Web 链接 probing-core · modularity.md 以表格追踪技术债务 · AGENTS.md 为 AI 协作设计编码规范 +
+
+
+
7 / 22
+
+ + +
+
+ +
+
核心技术能力
+
从系统层做起:免插桩注入、SQL 化遥测、NCCL 等待分解、跨节点联邦 — 数据天生是给 Agent 消费的结构
+ +
+
+
🔍
+

动态探针注入

+

运行时附加到进程,无需代码修改。通过 Python .pth hook 或 probing inject 注入。支持远程进程。

+
+
+
🗄️
+

SQL 查询引擎

+

嵌入 Apache DataFusion,支持 JOIN/窗口函数/CTE/子查询。自定义表只需实现 TableProvider trait。

+
+
+
🌐
+

联邦三路径路由

+

AST 级 SQL 分析:聚合下推 O(1)、流式扫描 O(N)、广播 O(N²)。自动注入联邦标签列和查询护栏。

+
+
+
+

NCCL 等待分解

+

导出 ncclProfiler_v3/v4 C 符号,零侵入采集。Proxy Step Wait 三段分解:SendGpuWait → PeerWait → SendWait。

+
+
+
🧪
+

Shadow Step 校准

+

4:1 节奏 A/B 对照:4 个 probed step + 1 个 shadow baseline,自动量化探测开销本身。

+
+
+
🤖
+

MCP Agent 接口

+

8 个 MCP 工具:query/run_skill/list_tables 等。写入操作受环境变量控制,默认只读。

+
+
+
📝
+

声明式诊断剧本

+

13 个预置 Skill:health_overview, slow_rank, nccl_culprit_victim 等。YAML + MD 双文件,可在 CLI/Web/MCP 三端运行。

+
+
+
💾
+

无锁 mmap 存储

+

自描述 MEMT 格式:环形缓冲 + generation 计数。单写者 + 无锁读者,零拷贝零序列化跨进程共享。

+
+
+
🔄
+

延迟 GPU 事件读取

+

采样步延迟 3~16 步后异步读取 GPU 事件,将 sync 频率从"每步一次"降低到"每 16 步一次"。

+
+
+
8 / 22
+
+ + +
+
+ +
+
杀手级功能 — 三个鲜活场景
+
不是抽象的"低开销采集",而是老板能看懂的具体能力:分布式火焰图、Python 变量跟踪、分布式 Query 热力图
+ +
+ + +
+
+ 🔥 + 分布式火焰图 +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
rank 0~127 栈聚合
+
+
+ 跨 rank 栈自动聚合:128 个 rank 执行相同代码的栈合并 count,不同路径分叉显示。Python/Native 栈在 _PyEval_EvalFrameDefault 边界拼接。 +
+-- 联邦查询所有 rank 的模块栈
+SELECT module, stage,
+  median(duration)
+FROM global.python.torch_trace
+WHERE local_step = 7
+GROUP BY module, stage +
+
+
+ + +
+
+ 🐍 + Python 变量跟踪 +
+ +
+ # 运行时注入,零代码修改
+ trace("train_loop",
+   watch=["loss", "grad_norm"])
+ # loss 变化自动记录 ↓
+ step=42 loss=2.31
+ step=43 loss=2.18
+ step=44 loss=1.95 +
+
+ 运行时追踪任意变量:变量 id() 变化即记录函数名、行号、值、类型。torch.Tensor inplace 操作自动拦截。 +
+-- 查询 loss 变更历史
+SELECT lineno, variable_name,
+  value, value_type
+FROM python.trace_variables
+WHERE variable_name = 'loss'
+ORDER BY lineno +
+
+
+ + +
+
+ 🗺️ + 分布式 Query 热力图 +
+ +
+
+
r0
+
+
+
+
+
+
+
+
+
+
r1
+
+
+
+
+
+
+
+
+
+
r2
+
+
+
+
+
+
+
+
+
+
r3
+
+
+
+
+
+
+
+
+
+
...
+
+
+
+
+
+
+
+
+
🔴 rank 2 是 straggler
+
+
+ 一条 SQL 跨 rank 聚合:rank × step 矩阵,颜色深浅 = 步时长。一眼识别 straggler 和异常 step。联邦下推 O(1) 传输。 +
+-- 跨 rank 步时长热力图
+SELECT _rank, global_step,
+  avg(duration_ms)
+FROM global.python.comm_collective
+GROUP BY _rank, global_step +
+
+
+ +
+ +
+ 这三个功能的共同点:数据天然是结构化的、可 SQL 查询的、跨 rank 联邦的。传统 Profiler 生成 trace 文件后需要人工用 GUI 分析;Probing 让 Agent 用一条 SQL 就能拿到跨 128 个 rank 的聚合结果 — 这就是 Agent-Native 的具体含义。 +
+
9 / 22
+
+ + +
+
+ +
+
6 项业界首创 — 套壳工具伪造不出来的护城河
+
护城河在底下的系统层:活体注入、关系型遥测、NCCL 分解、跨节点联邦 — 这些是 Agent 集成能触达的基础
+ +
+
+
1
+
+

联邦 SQL 查询

+

业界首个支持跨 rank SQL 联邦查询的训练诊断系统。AST 级路由,聚合下推 O(1) 传输。

+
+
+
+
2
+
+

MCP 协议集成

+

业界首个为 AI Agent 设计的训练诊断接口。8 个 MCP 工具,Cursor/Claude Code/Codex 原生支持。

+
+
+
+
3
+
+

声明式诊断剧本

+

业界首个将诊断知识固化为可执行 YAML 的系统。13 个预置 Skill,可复用、可扩展。

+
+
+
+
4
+
+

Culprit/Victim 自动归因

+

业界首个从 NCCL 时间戳自动推导故障 rank 的系统。区分"谁慢"和"谁因别人慢而等待"。

+
+
+
+
5
+
+

Shadow Step 开销校准

+

业界首个自动量化探测开销的训练采样器。4:1 A/B 对照,6 条形式化开销不变量 + 自动化测试守护。

+
+
+
+
6
+
+

跨硬件生态兼容

+

同时支持 NVIDIA NCCL (v3+v4 ABI) 和华为昇腾 HCCL。dlopen 拦截 libprofapi.so,映射到统一采集路径。

+
+
+
+
10 / 22
+
+ + +
+
+ +
+
创新设计 (一):没有北向流量 — 范式的根本选择
+
不是实现细节,而是架构哲学:数据不动,查询动
+ +
+
+

传统方案:北向汇聚

+
+
+ rank 0 + → collector → + 中心服务器 +
+
+ rank 1 + → collector → + 中心服务器 +
+
+ rank N + → collector → + 中心服务器 +
+
+ 四大问题:
+ • 带宽 O(N) 放大,中心节点网络瓶颈
+ • 中心节点单点故障 = 诊断全断
+ • 序列化+网络IO 侵入训练热路径
+ • 中心节点需存储全量数据
+
+
+
+
VS
+
+

Probing:数据留存在本地

+
+
+ rank 0 + ① → ② → ③ → ④ memtable +
+
+ rank 1 + ① → ② → ③ → ④ memtable +
+
+ rank N + ① → ② → ③ → ④ memtable +
+
训练期间零网络流量 ↓
+
诊断时 coordinator 按需拉取(南向)
+
+ 四大收益:
+ • 训练热路径只做 mmap append,开销可控
+ • memtable 内存有界,格式统一
+ • 进程退出后文件仍可 attach 查询
+ • 路径 A 聚合下推:peer 只返回少量行
+
+
+
+
+ +
+
+
有意的 Tradeoff
+
+ 放弃实时 dashboard 的「好看」,换取训练热路径的「不干扰」。放弃跨 global 表 JOIN 的灵活性,换取联邦查询的正确性和可推理性。这些约束是设计选择,不是技术缺陷。 +
+
+
+
为什么是创新的
+
+ NVIDIA Nsight、PyTorch Profiler、Megatron 内置 profiling 全部走北向汇聚。Probing 是第一个把完整诊断栈嵌入训练进程、数据零上报、查询按需拉取的系统。这个范式选择决定了后续所有设计的走向。 +
+
+
+
11 / 22
+
+ + +
+
+ +
+
创新设计 (二):五大设计原则及其创新逻辑
+
每个设计都有明确的 tradeoff,而且这些 tradeoff 是有意为之的
+ +
+ + +
+
+
1
+

SQL 作为统一诊断接口

+
+
+ 原则:诊断逻辑写在 skill SQL 中,不在 engine 硬编码分支。
+ 创新理由:传统 profiler 的诊断逻辑硬编码在工具里。Probing 让"找最慢模块"变成一条 SQL,任何诊断逻辑都能被 Agent 自动化执行。engine.rs 只负责注册和路由,新诊断 = 新 skill SQL,不需要改引擎代码。 +
+
+SELECT module, median(duration)
+FROM python.torch_trace
+WHERE stage LIKE 'post forward%'
+GROUP BY module ORDER BY 2 DESC +
+
+ + +
+
+
2
+

probe.* 与 global.* 的二象性

+
+
+ 原则:同一组物理表的两个视图,差异仅在于是否跨 rank fan-out。
+ 创新理由:coordinator 收到 global.* 时改写为 probe.* 发给 peer。peer 侧永远执行 probe.* — 从根本上杜绝递归联邦。不是两张表,而是同一张表的安全视图切换。 +
+
+
+
probe.*
+
本地扫描
单 rank 调试
+
+
+
global.*
+
联邦 fan-out
跨 rank 聚合
+
+
+
+ + +
+
+
3
+

六列联邦标签自动注入

+
+
+ 原则:合并结果时自动附加 6 列标签,但显式列清单不自动带。
+ 创新理由:这是一个有意的设计约束 — 防止用户在不知情情况下拿到带标签的列导致聚合出错。SELECT * 自动展开标签方便探索;明确指定列时则严格只返回请求的列。安全与灵活的精确平衡。 +
+
+ _host + _addr + _rank + _node_rank + _local_rank + _role +
+
+ + +
+
+
4
+

联邦三路径 — SQL AST 级选型

+
+
+ 原则:不是字符串匹配,是解析 SQL 抽象语法树判断路由路径。
+ 创新理由:路径 A 检测到可 merge 的 GROUP BY → 各 peer 先聚合,只返回少量行(80% 集群查询走这条路径)。解析失败时保守走 C — 宁可慢,不能错。这是分布式查询优化器在训练诊断场景的首次应用。 +
+
+
+
路径 A
+
聚合下推 O(1)
+
+
+
路径 B
+
联邦扫描 O(N)
+
+
+
路径 C
+
广播 O(N²)
+
+
+
+ + +
+
+
5
+

Agent-Native 不是事后添加,是架构第一天就有的

+
+
+
+ 原则:MCP 暴露的 query / run_skill / cluster_query 和 CLI / Web / skill 走的是同一个 Engine::async_query 入口
+ 创新理由:Agent 不需要学新 API,只需要会写 SQL 或调用 skill。默认只读,写入需 PROBING_MCP_ALLOW_WRITE=1。这不是给传统工具"加个 API",而是从架构第一天就把 Agent 作为一等公民设计。 +
+
+{
+  "mcpServers": {
+    "probing": {
+      "url": "http://127.0.0.1:8080/mcp"
+    }
+  }
+}
+// 一行配置,Agent 即获得完整的诊断能力 +
+
+
+ +
+
12 / 22
+
+ + +
+
+ +
+
技术深度 (一):无锁存储 + 联邦路由
+
两个设计最精巧的组件,构成了低开销采集和跨节点查询的基础
+ +
+
+
MEMT 无锁存储格式
+
+
+
环形缓冲区 + generation 计数
固定 chunk 组成环形,回收时 generation+1,读者比较前后值检测并丢弃回收 chunk
+
单写者 + 无锁读者
写者 &mut self 排他,读者通过 Acquire/Release 内存序完全无锁
+
三种后端统一抽象
Heap (进程内) / Shm (shm_open 跨进程) / File (mmap 持久化)
+
per-chunk 字符串去重
DedupState 哈希去重,存储为 4 字节回引用,可节省 20%+ 空间
+
+
+ 训练进程写入 mmap 文件,probing 服务器通过同一文件读取 — 零拷贝、零序列化 +
+
+
+
+
联邦三路径路由 (~3,066 行)
+
+
+ + + + + + + + + + + + + + + + + + +
路径场景传输
A 下推单表 global.* + SUM/COUNT/MIN/MAXO(1)
B 扫描单表 global.* 非聚合O(N)
C 广播JOIN/CTE/UNION/子查询O(N²)
+
+ 基于 sqlparser-rs AST 级分析(非字符串匹配)
+ 查询护栏:强制 broadcast 需 LIMIT,自动注入 LIMIT 10000
+ 每行联邦数据自动附加 6 个标签列:_host, _addr, _rank, _node_rank, _local_rank, _role +
+
+

+ +
13 / 22
+ + + +
+
+ +
+
技术深度 (二):NCCL 等待分解 + Culprit/Victim 归因
+
整个项目中技术最硬核的部分:从低级时间戳数据到可操作诊断结论的跃迁
+ +
+
+
Proxy Step Wait 三段分解
+
+
+
+
+
SendGpuWait — proxy 等待本地 GPU 完成 send buffer
Culprit 信号:本地 GPU 慢
+
+
+
+
SendPeerWait (v4) — 等待对端 rank 的 network buffer
接收方拥塞信号
+
+
+
+
SendWait — 实际发送操作耗时
+
+
+
+ 首次进入优先设计:只有第一次进入某状态时才记录起始时间戳,正确处理 proxy progress loop 重试行为。

+ 引用计数完成模型:通过 live_children + stopped 标志判断 collective 是否真正完成,处理异步完成语义。 +
+
+
+
+
Culprit/Victim 自动归因
+
+
+
+ Culprit(罪魁)
+ send 边 (rank→peer) 上的高 send_gpu_wait_ns
本地 GPU 慢,导致其他 rank 等待
+
+
+ Victim(受害者)
+ recv 边上的高 recv_wait_ns
等待对端发送,自身无过错
+
+
+ Propagated Victim
+ recv wait 高但 peer 的 send_gpu_wait 也高
根因在上游
+
+
+ Receiver Congestion (v4)
+ 高 send_peer_wait_ns
send 被 peer 的 clear-to-send 信用阻塞
+
+
+
+
+
+ +
+ Slot Pool 内存管理:预分配固定大小 slot pool,避免高频采集路径分配内存。三重验证(bounds + liveness + 指针身份)防止 stale handle。pool_pressure.rs 在 pool 接近满时自动降级采样率。分片锁 + try_lock 避免阻塞 NCCL 回调。 +
+
14 / 22
+
+ + +
+
+ +
+
加权总分:Probing 3.85 架构领先,成熟度差距明显
+
10 维度加权评分,覆盖架构、采集、分析、分布式、AI Agent、开销、扩展、易用、生态、创新
+ +
+
+
Probing
+
+
3.85
+
+
+
+
DeepFlow
+
+
3.38
+
+
+
+
Nsight Systems
+
+
3.27
+
+
+
+
NCCL Flight Rec
+
+
3.12
+
+
+
+
Coroot
+
+
3.07
+
+
+
+
PyTorch Profiler
+
+
2.96
+
+
+
+
DLRover
+
+
2.82
+
+
+
+
Nsight Compute
+
+
2.82
+
+
+
+
DeepSpeed Flops
+
+
2.55
+
+
+
+
HTA
+
+
2.53
+
+
+
+ +
+ 诚实评估:架构设计 (4.5) 和分布式诊断 (4.5) 确实领先,但易用性 (3.0) 和生态成熟度 (2.5) 是明显短板。总分 3.85 领先但差距不大 — DeepFlow (3.38) 和 Nsight Systems (3.27) 在成熟度和用户基础上远超我们。架构优势尚未转化为采用优势。 +
+
15 / 22
+
+ + +
+
+ +
+
逐维度评分:架构与分布式领先,易用与生态是短板
+
不回避弱项 — 诚实的自评比满屏 5.0 更有说服力
+ +
+
+
架构设计
+
4.5
+
/5.0
+
DeepFlow 4.0
+
+
+
分布式诊断
+
4.5
+
/5.0
+
HTA 3.5
+
+
+
创新性
+
4.5
+
/5.0
+
DeepFlow 4.0
+
+
+
AI Agent
+
4.0
+
/5.0
+
DLRover 1.0
+
+
+
分析深度
+
4.0
+
/5.0
+
Nsight C 4.5
+
+
+
易用性
+
3.0
+
/5.0
+
Nsight S 4.5
+
+
+
生态成熟度
+
2.5
+
/5.0
+
Nsight S 5.0
+
+
+ +
+
+
差异化能力(竞品尚未覆盖)
+
+
+ 差异 + 联邦 SQL 查询 — 跨 rank 声明式查询 +
+
+ 差异 + MCP 协议集成 — AI Agent 原生接口 +
+
+ 差异 + 声明式诊断剧本 — 知识可复用 +
+
+ 差异 + Culprit/Victim 自动归因 +
+
+ 差异 + Shadow Step 开销校准 +
+
+
+
+
主要短板与互补关系
+
+ 主要短板:
+ • 跨 rank 实时聚合需按需联邦查询(非持续推送)
+ • 0.x Beta,缺乏大规模生产验证
+ • SQL 门槛高(skill 部分缓解)
+ • 无 Prometheus/Grafana 集成
+ • 仅 NVIDIA + 昇腾,无 AMD ROCm
+

+ 互补而非替代:
+ Probing 作为诊断入口和 Agent 接口;Nsight Systems 做深度下钻;NCCL Flight Recorder 补充层数据;Nsight Compute 做 kernel 级优化。 +
+
+
+
16 / 22
+
+ + +
+
+ +
+
范式对比:Agent-Native vs 传统 Profiler
+
Probing 不是在做"又一个 profiler",而是在重新定义诊断的交互范式
+ +
+
+

Probing (Agent-Native)

+
    +
  • 运行时实时查询,在线诊断
  • +
  • SQL + MCP + Skills 声明式接口
  • +
  • AI Agent 自动执行诊断剧本
  • +
  • 联邦查询跨 rank 聚合
  • +
  • Skills 可扩展诊断知识库
  • +
  • Shadow Step 自动校准开销
  • +
  • Culprit/Victim 确定性归因
  • +
  • 支持 NVIDIA + 华为昇腾
  • +
+
+
VS
+
+

传统 Profiler

+
    +
  • 生成 trace 文件,事后离线分析
  • +
  • 图形界面 (Nsight GUI, TensorBoard)
  • +
  • 人工解读火焰图/时间线
  • +
  • 单进程视角,无联邦聚合
  • +
  • 固定分析维度,不可扩展
  • +
  • 开销固定,无法校准
  • +
  • 依赖统计相关性推断
  • +
  • 通常仅支持 NVIDIA
  • +
+
+
+ +
+ 定位:Probing 不是替代 Nsight Systems 或 PyTorch Profiler,而是补全它们缺失的维度 — 分布式联邦视角、Agent 原生接口、声明式诊断知识复用。深度下钻仍需 Nsight,kernel 级优化仍需 Nsight Compute。Probing 的价值在于把诊断从"人看图"变成"Agent 查 SQL",以及跨 rank 的联邦聚合能力。 +
+
17 / 22
+
+ + +
+
+ +
+
增长策略:谁在用 Probing,为什么用
+
不是给单个研究员用的 profiler,是给 AI Infra 团队用的统一诊断平台
+ +
+
+
目标用户:AI Infra / 平台团队
+
+ 谁:百卡以上 GPU 集群的 AI 平台 / Infra 团队
+ 场景:支撑多个业务团队,每个团队用不同框架训练
+ 痛点: +
    +
  • 每个框架自带 profiler,接口不统一
  • +
  • Megatron 的问题 Nsight 看不懂
  • +
  • 业务方报"训练慢",Infra 团队无从下手
  • +
  • 人工诊断 3h+,排障靠经验传承
  • +
+
+
+
+
Probing 的价值主张
+
+ 一个工具,统一接入所有框架: +
    +
  • PROBING=1 一行环境变量,不改业务代码
  • +
  • PyTorch / Megatron / DeepSpeed / FSDP 通吃
  • +
  • 所有框架的数据统一成 SQL 表
  • +
+ AI Agent 自动诊断: +
    +
  • 业务方报"慢"→ Agent 自动跑 skill → 给结论
  • +
  • Skill = 可复用的诊断知识,经验沉淀
  • +
  • Infra 团队不用每个 case 都人肉看图
  • +
+
+
+
+ +
+
增长飞轮
+
+
+ Infra 团队部署
+ 一次部署,全集群可用 +
+ +
+ 业务方零改动接入
+ PROBING=1 即可 +
+ +
+ Agent 自动诊断
+ Skill 沉淀经验 +
+ +
+ 更多 Skill → 更多场景
+ 正反馈飞轮 +
+
+
+
18 / 22
+
+ + +
+
+ +
+
系统性 Infra 解决方案:框架无关的统一诊断层
+
不管业务方用什么框架,Probing 都能统一接入、监控、诊断和优化
+ +
+ + +
+
框架无关 — 统一接入
+
+ 探针注入训练进程,hook PyTorch runtime 层,不依赖具体框架实现。无论业务方用 Megatron、DeepSpeed、FSDP 还是 raw PyTorch,采集到的数据 schema 完全一致。 +
+
+
+ Megatron-LM
+ PP/TP/DP +
+
+ DeepSpeed
+ ZeRO 1/2/3 +
+
+ FSDP
+ 原生分布式 +
+
+ Raw PyTorch
+ DDP / custom +
+
+
+# 任何框架,同一个入口
PROBING=1 python train.py # Megatron
PROBING=1 deepspeed train.py # DeepSpeed
PROBING=1 torchrun train.py # FSDP +
+
+ + +
+
AI 驱动 — 自动诊断与优化
+
+ Infra 团队不需要人肉看图。业务方报问题 → Agent 连 MCP → 自动跑诊断 skill → 给出结论和建议。 +
+
+
+ Step 1 + 业务方:"训练慢了"
→ Agent 连接 Probing MCP
+
+
+ Step 2 + Agent 自动跑 health_overview
→ job_health → slow_rank --global
+
+
+ Step 3 + 定位到 rank 42 是 straggler
→ nccl_culprit_victim 自动归因
+
+
+ Step 4 + 结论:"rank 42 NCCL recv_wait 占 73%,
建议检查 IB 连接"
→ 全程 < 30 秒,无人介入
+
+
+
+
+ +
+
+
Web UI = 更可靠的实时看板
+
+ 每个 rank 内嵌 HTTP server,Web 直连查看实时状态。比中心化 dashboard 更可靠:无单点故障、无聚合管道断裂、无中心存储瓶颈。集群视角通过联邦查询按需聚合,不持续占用网络。 +
+
+
+
从工具到平台 — 和 K8s 一样的路径
+
+
+ K8s + 编排工具 → 平台 → 行业标准 (CRD + OperatorHub) +
+
+ Probing + 诊断工具 → 诊断平台 → 训练可观测性标准 (Skill + MCP) +
+ 短期:解决 straggler 急性痛点 → 中期:Infra 统一诊断入口 → 长期:Skill 社区市场 + 自动修复。每个新 Skill = 一个新 Operator,让平台更聪明。 +
+
+
+
19 / 22
+
+ + +
+
+ +
+
产品路线图:从诊断工具到训练可观测性平台
+
每阶段都有明确的价值交付,不是为技术而技术
+ +
+
+
β
+

当前 (Beta 0.2.5)

+

核心能力已就绪
13 Skill + 联邦 + MCP
NCCL v3/v4 + HCCL
已可解决 straggler 诊断

+
+
+
1.0
+

短期:Beta → 1.0

+

稳定性 + 生产可用
E2E 联邦测试
Web UI 火焰图/时间线
3 个标杆集群验证
目标:上生产

+
+
+
1.5
+

中期:平台化

+

Skill DAG 可组合
自适应联邦路由
Prometheus exporter
推理场景诊断
目标:统一诊断入口

+
+
+
+

长期:生态 + 方法论

+

Skills 社区市场
自动修复建议
在线异常检测
万卡可观测性论文
目标:行业标准

+
+
+ +
+
+
关键里程碑
+
+
M1 3 个 100+ 卡集群标杆验证(Megatron / DeepSpeed / FSDP 各一)
+
M2 Skill 数量 13 → 30,覆盖 Top 10 训练故障场景
+
M3 Agent 自动诊断闭环:报障 → 诊断 → 结论 < 1 分钟
+
M4 推理场景 P99 延迟诊断能力
+
+
+
+
学术价值
+
+ 五原则万卡可观测性方法论框架(查询驱动可观测性、执行模型感知归因、校准式开销预算、声明式诊断知识、Agent 原生接口),当前实现完整度约 51%。Gap 是论文贡献而非缺陷 — 每个原则的未完成部分都是独立的研究方向。 +
+
+
+
20 / 22
+
+ + +
+
+ +
+
学术价值:从"工具实现"到"万卡可观测性方法论"
+
五原则方法论框架,当前实现完整度约 51% — gap 是论文贡献而非缺陷
+ +
+
+
P1
+

查询驱动
可观测性

+

联邦下推
只传结果不传数据

+
40%
+
+
+
P2
+

执行模型
感知归因

+

NCCL proxy 语义
确定性因果归因

+
50%
+
+
+
P3
+

校准式
开销预算

+

Shadow Step
闭环反馈控制

+
45%
+
+
+
P4
+

声明式
诊断知识

+

YAML 剧本
可组合可复用

+
50%
+
+
+
P5
+

Agent
原生接口

+

MCP + 结构化查询
写操作安全控制

+
70%
+
+
+ +
+
+
论文叙事策略
+
+ Gap 是贡献,不是缺陷。论文核心贡献不是"我们做了一个工具",而是"我们识别了万卡训练可观测性的范式转换,提出了五原则方法论,并通过 Probing 在生产规模上验证了其可行性"。

+ 方法论文论结构: Introduction → Motivation → Methodology (核心 3 页) → Implementation → Evaluation (1K/10K GPU) → Discussion +
+
+
+
最优先实现的两个 Gap
+
+ 优先级 1:拓扑感知归因算法 (P2)
+ 从 peer + channel_id 构建通信拓扑图,沿拓扑边做因果传播分析。万卡级联故障的核心解法,直接与简单排序做 ablation 对比。

+ 优先级 2:自适应联邦路由 (P1)
+ 引入节点数 N 参数,估算各路径预期延迟,动态调整 fanout。固定 fanout=128 在万卡场景可能导致超时。 +
+
+
+
21 / 22
+
+ + +
+

总结:Probing 的核心价值

+
+
+

价值与意义

+

Probing 之于 AI 训练诊断 ≈ K8s 之于容器编排。从碎片化工具(Nsight/PyTorch Profiler/Megatron)到统一 SQL + Agent 接口。但约束更硬:K8s 管无状态容器可重启,Probing 管有状态训练进程不能中断、不能有可感知开销——这是更深的护城河。

+
+
+

技术独特性

+

四层架构 + 6 契约 + 没有北向流量 + SQL 统一接口 + probe.*/global.* 二象性 + 联邦三路径 AST 路由 + 无锁 mmap 存储 + 分布式火焰图 + Python 变量跟踪 + 分布式热力图 + NCCL 等待分解 + 声明式 Skill + MCP 接口。6 项业界首创构成护城河。

+
+
+

技术领先性

+

10 款工具逐维度对比,加权总分 3.85 领先但差距不大。架构与分布式诊断是核心优势,易用性 (3.0) 和生态成熟度 (2.5) 是最大短板。差异化能力 5 项,但尚未转化为采用优势。

+
+
+

增长前景

+

目标用户:AI Infra / 平台团队(百卡以上集群)。框架无关统一接入(PROBING=1 通吃 Megatron/DeepSpeed/FSDP),AI Agent 自动诊断闭环(<1 分钟出结论)。增长飞轮:Infra 部署 → 业务方零改动接入 → Agent 自动诊断 → Skill 沉淀经验 → 更多场景。路径和 K8s 一致:诊断工具 → 诊断平台 → 训练可观测性标准(Skill 生态 + MCP 接口)。

+
+
+
+
谢谢 · 欢迎提问
+
+
+
+ + + + + + + + + + diff --git a/ppt/probing-presentation.pdf b/ppt/probing-presentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2cac542b247f83274ab4b414190ada7ecc7a767c GIT binary patch literal 1567451 zcma&NQ*(NCMiW*dhogyx{M zn&0=)GYWqQdC5$|>yO;_N;Jho@MDf&kK>GS<1V7(eWhm`W6vf0pEK76NE&h$m&SoW zpH8ZU!i%?1$xuizw%>W~+vU7Z4`C~1T5Z|o6S-l0u=YZjyc%xvHokb4G;k=EDs$k( zkwrxk`CkNM!pjMm5*&;!G-cuyU2b!;<&};l5z&vSIA_a;t>CZjPZulCZ)OYKr4_z; z?&fl#4;zpu`OV9rRMZZ-P;xPWTs#xoW#a!jpPG+{bF<6{MHdSoZ}5WsH=&fC_7E% zeonAOH$b{NzR)p=P2}=&ID*?IyG6?6`6{&&vV@u|AzMqJyrQE=u)D)^Lm!xu_3nb8 z{{`C3IUzWlAzdE%+k}XqNTB#d(YeOo@@>K9J&`pA4(*68;wSUj21PDR(d#clr^9f` z3~(d#$%Z;Hv3`&dNI5f|b&Lx=j6zz+71Ktwb9{K3@IH!q;MkGQn?;~3(3mhEp@(M)eQ%e6v4B|P zHZruI7us_TOSd7QkMSah*YqGA1l=4E)Vn6MDGcz~vfd2HoriL7`h0wvk-Hf&>Rker zOeYh*s1FowWok+Hn-bkGOM~fFNLUFpW_CSAXi{i*M2LrHYK9pLG8AUYi$ey{twR|? z=71MKw%RnMu#nXuQ23{tk2z&vLah1YQ90xcXV!UX2xYlpA}4)2t8gR4V4)?6%_boc zIB798h&&*zz&ef`))%6FGJN@9!`tA7rVd)>8-V%_5d-O+BtaERPC#c=*a!_=o5mqa zS7o6iFbyR9ZS(W)#kgP<>n9zG-cDV{R*al|*)J_pJ1G*2Zc>lg`b)CBjxj!f?xVf{ z)J|(A;0G=PMm2q@amO)9L zom_^?oG%&mEK!b+d8A2YQ&$m| zYz905Gxl4XTKr^&eCf}L+)>BF-eCMMq|_wgtLt>dUQoD=c0C|V;8`h><(C*YH_*@% zW}C&;xpC47^Tq|?L1uACDy{+{N63coq;Y)T;5NJx06*_4>G9xl#Gd`E#~I4#x9UqK zO+G=pb9H-^*m<0L6g-)&XdGG-Em^yqSn~toTYW+eYhq*kzm5LC(f{%joc|+#!NS7M z{{QwDSDIrs_+qGCD{7DKAXucSqY%h$$h$a}n0@syQvLdfP4B`mq+>s^?(t0~rY-H% z{h{3A2nor3mFl{Kkx?`XS5WU%zog}<{QJ?!T{ z8|qya7!|!<`-emw94rlv^&w!>jp!s0jFv~j6{A{Ja+CCB`hKDmP8}?6E)t*WVcr#B zc(JR9w7M-JQEH`?1IZ#>#)yRTBg0qM_=;lbFdD|&7!zU|zkd<5tItl}w#gIuDJFj;mG#{FYAV1UXIK&4F~ctAn}Q$D=!woARj zFzY8k)45vsuX(w?f~HCuIoJ}|)D`amx65Y~@ ze=Ql@r`YS-OgYpRtJ`!8SiEWuw45_n8Loz}0I8U1FwK~0;fi7dUL_4Cxs%M$R)@=I zS}jd~C~zBCH; z?46Oup{=W3o^DSUg1TQ%t!S;AQjcAF45>QFK7V!ofGf;Nv*8v18`)+^hfs7XIa^h% zTe5MO1aNlU2z56{R41CGNbpj3X72;B_8KiT=WiDs`bhsp(<|9296cFs9*1gv%ID4g z46;dOHwqE5{BzDWjpB>^M(_bDfK!el%!oVJgKbtBEL?QQ;Q5XO@E97a$D! zkX@^ni5~(#a^&F|tGV)(IRi8vmU{nO4*IrNOM&PFP&J^iWfzaF5As=oG2u?m+x9rg-$k?c3BZ-0t1| zrT!dsP*{*|c1{-oj~w{UdvuZ~GSOoG!!}@W6Bb><9hJdgey}=Fe^SwSm6EU1)}W$- zBOw(1K*3zVWh%OW){2oJHjS4wvQPa9FayoB={z4xFb-Wm4wiQ*ikr|HT7lbHXU;n` zRb6kbXvWlOpYX+Y8~|}evC2commQ$2SB7=%TuMN`r0Yrx~dhfk9YPJ>!&aJd9^S`_{!fG!}w^eB4HKoRoS_kz9RdcpG%?HI~yJu=f z?kNFl!Cg`?o048}cam9WUU=s%Z`{(+@-c28QLTa3Zm7I6Vh4KMUV9%NmukX=XIJ$70g^qCeT+5Fmnq zd${wUiXI`ezjcE}=HYk`aZ91~>xji!lZ_@c2`XcEH2c)My+)?;d@EJd`r3^2Xa;Xo zX5v;8PO|cLD&zMis^O=;8^)GcO;8{hcN114$ek2S)U5*w?K5iTX*NrWPbfR8E4{>c;n=5hF!^7PPmWdTSKNRsom_cg0EaxEptx4VJ*3G(c5iB>gHM2$NE1e^l9l|)Z z<$HBDaa*^|b)&gF^8@1DFm(0*4T`w`M?n!Q6AQ=x5fo`{#B6e)df(KXo`A%=)9Qj4 z{jQhb7_$lB!Wq0{c+S(Je>1_aO#BplMyC${+tlu9>L7$!3zdyoQD(SQRz8q#e9_fE zGlJVQTIT&@^Wsy|{zs!z+xYHdD>CqU@%xIAx9cP)XXpA=$~u1?s^D1=sbi%hXWIDS z8pCHhlF*vzh(N$=a0rYc;NsH@&$(J#U$ckypYr6wtK!4r8KN$+aZ@mn?xqUM(}Q%tm6J<7ZxCPG*-^M0eYs`wP8()kxJ_Z5?sPMe zze9x#y@H3b2+KyrDWzlR;oD4sE)xEK9jdvi-0wF~*PVzPB|=hoYE~RVgHwstr~ir@ z(I)3r-E%YwBfj==lZQ=2Py|oShNu7oq3JEc3P&x=GR0)9o@kmid6bi2dbAebks$7Q z(MMlV&Ib&Zx$SOT6qL*!axiD1#rD(r{_%9+&WaE93vYwa94(pG<%0lLS3qb!&HbE{ zn)`)qXoG}l_Au`up8>iHWz|$lwrDr$RhS70G=vhWa-ByKg-hyL48{@`4TFPC_#38E zp+(Dh=85Fj!YN$o7KRi12Pj{va|!0_87}RMcvuDU`Xa=#1`4Qj4ge9lz2?8~PT}`SN#8 z4xbq5YO>K~0<$b61H0g*G{GUW6u~-NO}B7~CmTnS4aoL)hQ(1JOH?hn5w_wawdU)(;(eSD{GMgGixr+$~@ml)=~ z83>=}&->@|wU}LCYVA~AdybBBJ`Z8mtq}Hs3khqU1tp@aC^HROvGIHFI$r)Lp_f^b zZL=#lRZz8KNLGiFT(qMOA+2>q!%6yjG#*xBQd{8uYQ!}aB)(5E>*Zv2(o8dX)6hIc zS7gViA-XLtAfbXCV`O!cV4f_|XU>-GyAM&-YtRn)yP9Yaf84&DvHVjJ8$QUlKhRJl zYZ(FH``ylQR2CbY$$n9bjg!)O0GG}QBLZS@Q5y~iZmq2jf}fnxAIF~XVy*v4!=wuw zoiRBiXrC)pi=V3)JssYyl;&DAob?r7QYlZF+NhBqo00&VSnP$?*eh>W#E~+tFZ3@K zFK0|t-Luqf6B_wo=W84e)${{KBUcgUW0Gq6H})S~p2}bMD2zVxsyZ-_WTzO(|Z_)K-+Rbux;n;O~=!z z^9&;Rtg*+p#q;j{f>FTp3#KQhi_rDQC!Dc=Yh=4~ka30jx0rT0k7~-u&)SY}ljq$O z=Z^1-QI~r*+LoUbe{7Qg4>u&_lsavW>cO|{35Gz2*^cQa+rUT|ZiRKN<<9F?U~|?T z$9r5>#$`i;<3Jw`zUGn}?&7cNOnG>8SxL*PQFx2n-PyttLyRt?;S8_FejXX zUM~k3w&$PvV$MOyqTQ>G)$z8+r$zS)Z08FIL*bk#JXDec^h0%C=#fp1gCKv$NE6rK$P^` z)pJ%Zjr6!iXV2A*vN**g72uau>C@0`9U1shY@HX7UE`;aj%}QA#sfdblfgs#exDW6 zMe{Q$Q?h)fjyt%(L7(_a@y>NFwEQxO8Il%9GV5Vl-UYCzLCAkj*N?;xCJ<_@D?P`| z`7^4`dY{a76e`*sWm{x`m9m4a*$cK;ka-B?@S+fhphnico`50|pH>Q*Ep?1u+tWMz)f5 z-N*Zt;iI3m>FnAh=8ZJH>d}w^EAWU}mg=k`qM=8%P#Z}NVj0*f>(klPx`oD_+H3I6 zdA;LEXGc1q$~3QRKh^m5i8LW$EWZ&~$%eIvyON1BvqA%vf~+1rl)>hc#^#9^Gpkl- zl|>=lFAIOyj`*SX4x^tI&ULXkS+b~<593xbI|A%L+J2uKTNgV!`TP@Me$^PmdVM%T zQk0m6vPRMx+f}o|6~fXjE5Q?mG9JY~Sq8ht9rSV3dyu=t>RO$1Cv>4qy3m+8Wo&d& z^Ju4)$`jgOC6I?b55wGzi(^SLko-~@;LJo4C%8)M5hE?aHz38G9Yp|}Sau4??B_<- z>Uy^RxFnSNNcAUN7%isbM+(&Qui?;_8(ibnxKPyk<9NWuUe99jFlTWlP-54&o>mrB z12^_m?PWxsI@fN=t%ZiD9}6%u%oh5(M03HG?irj;?9x2~M4TQGyfN_9jLG(twcgfs zkI%{&v65>H8GaON^`eV@KW&xNbiY^rv+CbNZIk0?qjKN2DfTw4w_G zZbmQRpgS6NhKe{O%i_6L72~`LybFr~Yk{!p*u;+E%BgBBMfcGPY_(>6;dc@J0mDS# zTDUDAuxm$@(mqfKc07KH#u(Ak@Jk_m>#dmCAo-Nd-CUpe0DGaZA2O2jj6#K7dy`(u zFy<_QL7Vk51ZXRBm7VYr!UTs)`>b{?c`7CbJPkv?3(tUTU45}WtUqkIx|mQeIP7Pr zAK2#jzCTrbG^E%qfmS*J@9=lq-&=$V|2;X<&smgc&}0jvlR29%}v zpn*?G?56W%63B0S9T-S|p06boX>sLe=wKT`135fx>OxFbPKE<>Ug7z3kfe+I+1#qh z*h*65M&H~w((*Z0BUR0@VKw$f6Cb5j`I}X6g>9H9?9{Kea)vPf#hQD7i}kvUe9J^X z2HkUubk4|CnSTq4WlyX;_zr?re_ytRaD?z+kP2Erkms#-(Mo^q-`MJYJ!}vjk(%t_ z_ih|;(GxZh*A(YiA^+Sk1!3~ws;mnFUhpJ^q@A}yNu z7gmY5SHV07<&?WLR0@+$|APW3+#jxr=Yxx_j4a%M3A?V*+l>F9;P>M9$&QQ1j9|}q z=RwB0XcH3P%9sD9d*jO?Sf)em)t%I*u`g-m^@x;#p%vQY_K2Bt^$m1kcuQJhh%cIv zT}~%kA2A(P?{?G6evKKXn`Xfb_JCob^V0P9Cnwk^6&wS)vIy+(8aP^EDOI``3PRh7 z#aHSQ`>7BwLDohGoxW2bD{;aeGq||Nt!^Ue?~6ky!h~4+o6TG&GIe3UZqz_yt=po& z0sZ^}kS*L)eMm)gHj;|)`CbL+&Dn`*HGACiWc@xcVja%T+gj>HAa`?d?F_(AG}NsY zAB)Eg@0G+Ig9Hj%DR{2b!m8X#s>) zqamcq($T&NGP;~~B+G9v5Zg+TVxfxZ^DpaWTDtNHM;|zsBtN*%8V=l7jh)fZ<+xnF z!aQax>M(MvytW-W$9nTa@`C011(1`52cBU~zh9S@-OWLqcxZ3N%QyxE#YWTM7qJYI z=%}>#1UZNXKDEy(Vj|JNpy4}gGs9vS$dzR+Tw*N&1%|8z6S*`jYa)NRJD@fus7Z8U5nF2Ki z1X_>X3Xd)20f8MT2nb>k_2jrTyor~lY^ztmS{B^RKbEW1^enYqphj3G9;CQrnn^a5 z|D2mIdAs!jeaCSp&yeVY*y>{-`3ydREw>YhQ+18s0b(oZJ9>F^Pb{vR68LQbD5y>p zTWdR}>bD2DEHfDW>~=}*Y_FiJ+KJE}f$87{xfLyst>W51`c)V>>y0-W6c@4!wrF~e zlSYt}{1d%|U8NHN+FvdXA$WJl#(YlPwZkH*-~*8BLxCGHp$u^Is7NF*^QwHaE_`ue zP`H=4h&(#1iTYSbX8^uJgenMLgFI{A*qfDuoX+2liqhph;ih_80+;fp7sC*orLF^B zV0Mgi?3oy8d-f|^`oW3w=%(*o?#Flu)*L4OY9Tp$3g_gvaCQws6vgz}sL=tZxVg@zV9eU(rF~+RV39tFC>JH=*0?yYB3C5IWtr&!Pk+A|Y%YRNE4ly@JLOU=B zy{jwl=FBFlUUTv8gjfXLqcli}t#6ZngoI}RuR;Vg=$L-p4Hv?lnw6eak1SrPCQ7S$ z8MbvYn-dwR+#L=ZJJkC@Rz9q09;YV;Tvrf=^ge@&gw}*f5ZezHCbY-$Y5f#Ku6k)h zcu<$8KXNrjsWX1Td~e9=5tg3T9$z&HX*V{!lN`DT!;tr6vYtCUCp6|mrwBcsI0=#p zM@ps@&bMt1Muv^gP!hhY#N6TTpX7@!P9n~$+(AX>_zC_@tF^0wN{_4fF2Cn!V}U}y zJ`%rSwiFg=Q%{qnoG9%mDA3QXnYv@=RH7KRW_J11lK6?&E|8rBk_XQLT9}D9c0NZz zbnyYCwDwt{Yqr@+R3Vr=;1N8>i)&!15YV3-WVb>(1s3dN(qpHMSS-*^=p=AyysQ36 zb=y*07GspLLE2xh{YH5JQYz)GMm3EaTi?CJvK6!YH?sOtg}i1)+YEW#7wD@wNcC41 z2PVtcF6@fE+Qx;YMuZha)%+k(>0ei}zcuN0fTPBtPrW9P_$8zmXnb^~JVEK?4!JbO zK;TI&q${E&Q%B+5UVKsop;;&lJ9uC5d2v^>?$S|9OUh%WIDy0YKHHtPotA6|zYxz9 z_l-d{GUQF3m98-#`;a*3bfi)4DIGYlwm6JG=HT42;J3b!sCjHiU+$OGL%>EqBSDO) zVIWdO8CwX<8CYqgC$)}4FS$rRr+^!Lp}2nRu4o zh~@RkN<}Syq|A*W;`6^{y6L%tFkd z;BqSLbVoHq_15m;R_Azo?_~Q6mV;&I;iur?Dw?VB-z_`w(?Q!y*lj;%W^5AxweI|B zwTokMM`o0%VZQ6EqJ?#hcFQ;6>GM0`@`OW zZ0gL$ESMo03VLzJ*ME;<+v|^1ntU3vLeJs5QdigWBDU1QY*3GJ7#HuP4eCClQu;PCUe!S=8 zd=<#_)H^lYbJ1RxHptK<`Fx%isO9)>Ql&F7sOm-@QrC)GNT0Ms)N=(YvmY$*EyDYl zL_KI^#g^fI>kApquQ6T6Da)%8P{dl6kX-XVzEhIDC93pu%jq->hGwG+=XWs&ZO`F8 zW;xuQTRaU^o>%&%H)(3uQN=t}X7@DL+V?H@iCsOU{-w4LO*5h5&RwO5Q+bZNh89-L zG|;()oI+}@L`L|6f1qOMns>aT+qzXtw~dvQDS_6D<1wPFoXi_jf5Y1m@Q0FUpCa0 z3FS?J`FH$_qTeS=O+vXZ{R2y)-7LQKkBE4i$;n?(g<7*6O)_%(%{p;AEIbX^)vyPW zaAHD*iKr?#B(iL30u?^PlIlCxMlEv(YfQ6tRM9839`(#J!cqOIT-I;_-UmvQUL&=2 z@oEU111bHicEehtNbIBGx4xiMB#P?%l5ewW52k>`dO!y^ZV6=@SvX@X?OXLlou6k1(GZ*`4_kDbwOTMpsw^Z-t1m3`r%LAu}@~*a^(Twv7EKsQIDu z=YFVe`0lJJocgY!pgladtKI*)!!Um2loaox==+>zQbe@C?zMRo8@(Y4g8c(&D1C$G z<_sP20{BPY(Bq6i9i|F*aT*s%ze$ipVj_^GO{(RE&?PtwL9~zk4$X;A4ZlNi3XMH~4DA2`saIB+3*GkA2P#h_=Qh=+o z36Y*PshwK_Ojs8V<_4CJyQzs=Em_x#b2x{ z({Pfo0~W><)F91|5FOPi?|j5mj>W9p6OkgWT(aN-9Ytz|g4s9nNs|{n_--MMzT6f! zVrzXt!VXvAR-Ef>QK#Ne>m87wNGbjH(&Wgt8#;WHEHdjx?@jSOmFkg zf+7rivsbm=9))S(h-^)Wp5KR%-k!MMe?jzGp5(lZ+rruW!4i0aQNv2}*2dWT{W&fc z`547?`Vun}1o3r<3u&B4lxdbxNgt}skS+M%TzA`T z&+P}qM=9Xvl?(G3W>%O@%%6m#hYL7teInm-5GS(tiG;de7ZW!hoPrJ~rtJ#6vvdKS znm+Y^K7VAwz@CwxlAr&hL`I~ZAD{n{>0hrK*F(Mo-z|5kPlIKO8b04pkW*f!|38$= z`ah#wZl?dUCP-VWhO`C2=cVS>(NDUx1Dx(Nj>0^FLx@A;a6TU?yN;64Eb#dLM?o
0sgwGn7xC1Zf5UjdAaiOAbRy?NtVuHnKqmiG)bBZ!kefud+9h! z5XFEQ`Jc`{w^?+oevPYBk=k882xy7Fvx|mx+D;RD4qbm?eoH~W_36X!L)*Hla=D3O! zr+7vwzoMNiQfnctgF^~KR!L;F0Is*V(AfWlMfN(GurO&^9rCA%0^Yam@0`Hi3^s)C zaD<%&TU=tynjC!Q%sefcQ{PTo9~l7iG_NsCM3rSv?<_#@0wkJmcYyq}LIB3M*d}SH z(tNTD%y*eKu%hbGKlH!#@O`BrH9n$zP3T_LRD%|HrI(Wj@s+N`LQtWR)XiBwB@O)m zJmE@;M>po3l7BC0)AP)#{3Ag*Wc$0$0VBzS`_=CtJSw2Xqv)pA=SdLN#{QSgXC)Zh zy&n=5zxQ80EC{l*9P8Pd7=_oRJ5h{A1H~;{}#KY_7>Ie9JyO#h~E-(fry>$v|Dr0mVj3zqC zy*(b*EgDOAx}uwLt7qPSyP_^MJ|PY>>0_vWo!k$jN8!i8lr}gD z8cjpLAD1lss@A?c^S^J+w^(j4rvlG}*%H_BrZ?w_X4m5IZqc_2W@P6z-+Q=+1@n`Z zw%^={UsYo2k`e#{%T+TmUlEuuPXxdWGbv|)pBM}BErR?0e~zAdTk}r#nchB@y7X^& zvx%(nQmXWPabkYL!}{pkQU?1Q60V`ryFZ5+_B+btVEGrVpe&E6Aahc_U!tbzCjw>+ zF?0PN49Q3?V{+2(sOi@S#Mx0Wfz2dIn-O?Fz!p`c#zLAW)OY2I>UZ0+ao^5smz^mx zQGkLy6t$ltFqX=$V9;H7o??!eDD!#ZrO{e6W**Y@nT3pakf{|F07xm5Hb)7qIz-2) zV6*NuUhuECNXDX`@*tf;_mGS#w@(Z$tTvYeYTdKu#p8dS4phF2ns4PB8J;87BnIHNK%HSvxLgbOFnRi!$e zkWY0MLhkZc9;1>jwNgLYSU64Zr>PKNE=YmcLfn4pW^a$T({ThU;lObuCto@_)F~Z% z(9mMy0OpF9B_?%oZ~{Ac#WU&VPm5&mljmUYhpA4PR4f0L&x+G9_=7ku#ff4yv93m{ z&?B0-a3;3<=oHgZ$QIG%EUc_ACUUJ|f4HPdn@2tI2jzo3b-dV(^4Lqm@U>6-blua&~M_#b{NVe^t;qp{L@G4Nn1@ZDO3}c*849 zo5ZCV_j*vi)A089cOZ{97>1Q{n@>OR3?dZDsih&73mx2jVdhhbyxGJVAI$4pAfW&G z>)xM9m40jFjo-B;%Q1q!kW1_JKgQ}kD*$`5f*gp91H>F;2S?@)Hpe56HRS`XfNI?{ z$a~+`Op-!AtpI2Mr^(PG zPNe))9N6|``M#M8ezkw>?)dy%Bq1tcV+H^@U;QSZ+2C5MZ99DA=Gp;*J0#0;zUz}3 zJYXtEztny3r5ApF#v)CDT&kS9i&>XJKjA>I>QS8r31I;RfEb3hdedvzT4COazd}hphcX)WxbSRZ(A_6EH z(P4(=c?ba4?J>K~8f1qyw>s^;w(b3W<6BL{*INXBVhPR)zM<`1ziHoR+wE(C*Xu|* z!S8F4_UH%G?XL$6pFPAItvA@80f-P_EMeY!ZrJzA_tZ%TQupV5MomvmmK0vi%&P*r zW|)HGKiSfZo4$~kY($cn+dI7as$I(YJq~>)xFcm-ysZM{h~FUYHTm`$f+|rN6fo1k zUt)~l;J;XVC8&Q(i#1XjT=|Q>2W+(TK2Xx`WA>9IY{z}%O*tb@SRH#=Hx$cwp+PvRnOjoPi8YW`nBE+A&TUZA zjyh?K-G#hP0?!@QVjMgm{*Nqn_Agl7e~~_$BkH6bL|$r>y05RRD|A=_4D?eT&I?er z91)0Jy@c%G7l=q6crEthaUDB#Ew;V)>en+$h0(9l$**;MOEwcT=Be~F7ff=X7gg>8 ze3gh4pf4wbvX!8pj`XKJ=JN z)`noSGK(d7_=xO`%E@s(Nb|Ww!zl%fQd%voA>sImi}SlX*N)_ITqpCQ+(pRpqUj)c zYNl??PsYXCsOw?{KQZZO@#RU`6F_cBR1++Zv^~D9^?Z_KQ}vjN$4sO4TtaH2bG*xY z2=Uck$T?pMcj~DYn5=VxEiF4|8;pC!5l}{}Z1wPPDp5mMp~nSBEDM+54ee6WvLZa| z`Tivd-@jcrfy^dz`Ae;du6U(+FUFQ^$&KlFsV^4`{by{pld(ELEh5<6#4jUG&f_ZT zZd`b7n%`SjE6@gEJ-aF0web8V-N#ahVDV3^>f-P~k!8tWE5+rrij4k>MU;c+vyIDf z%PD;#n$jwo_ z!)B(=V>$Yju^ijpc^YnKrPRxiG@XJNIYE=lnu#qqu*= zu}4stBt*6i(gmycH#j9X*f)o*=?QB5b?EVABbtezIbaFyLHj$ggt9w?^N# zh60o*1Tx6jR6!9qfo;&IkX>o5Cy8-kq$c;;#*g*=DV1FT5j8|CAqs*B6 zed_+KI9SA?9#r_~5{>b3f@Q3w4VLSfm#sXEDCU+Sxmm35a_SPcZ^J?LJT4Y4-Ff_v z`x%|@0Xel!S$})>Et-fO2gE`>DI;30-8BzLDD1l@Be9rCRkqni*8Lw&3qiUf*ttBO zu!*Rk936e$H@QQCzcArx&+w4HfR4I4tvyuJpZoL%5HWjI%*gE=$oO z2I;)=N3VW!t@!_Kxz>&C_4=c%`nfRF+_YwAgR#){7Q_!I_B&u+b}dM9@H%h@dtDQ%c{D2>-lq*dwJh@Sp)UEVszo^IHZPi%VHIQY6cAjgkM;`t~ zp*>_~<=Ef+Y4G0^iCWPt9otT78LMuVv1?mQe#DxMtr@#<}PLgs|kui2SP?87q-l{rreze=1s63 zON&xXZbD3KHXAPyPi7Mu>la6klIUB0{vs#fBRhE61uS0j?G^IqPCw)v5K?$vzh%WKOT4)afx&GN zf7gYwLH)cBT=e)p@%MP2w6usGaYvLzbWYclB7d#1yu%?eY@z8^VX@3V&ewRClum=N6|Q zORbA<`ud5lSv78mILC=LH6jXaswGv4*P-)y(pPcSy1@|0G5@@iy*kNpC3LZf=&oHM z4E{2BInJeQ`Z;UK+Fm$W$#G#Tl~McvE`F~(Tz_4s(r%l)AP5kyis4DW;ph?Xjgb0? zat6Dk=WO1CEgb8-VeGS1eRqB{->erNW&9K|hvgHa%KX3v0>t&28QG73ofE6>vg4*o zK4eB+t8@|soLcVI4L`P8Q6BTUls7Nkr^%m(GSbV)(asIo!n4a-`Ob(+Vcdm{FFuMq z8X&!C1{jb>EvvBs1eA%L(FQZB;imQD00hDFa;M`-^y|$L9rdNN&D>Q~QKl>KH*w<~ z`P5)~I4_P*68BbrQrB7LR&hZGdFFV%IAuT66@mGSD2&k)>yl!S~@- zM*XS~%Q)?$AnC?*r+bf3*w;@QjY=?S)x2@PMI*1=7priK*TS^tdlQF0mh<6xHxJ+5 zO%x@+Ao?$jAtkg1-aRYK(l)qTite#BLQ;K`uzXM&Crpy=PO9L<$BG$o!kQWqbS%2B zQ)rJi@um0Iw(a{^$kTFOXRf0(Ni5OW29;gZmV*QzQ*m_=iDPe0_2@}oI|>!5;I?5I zF_iutJOv>PRduXDrJm333b_jm@_|y2;Hy#8_8E|$AFYatY1fHf6pd2iRg`|&zc))4 z<; z9_web2{Wn{HCEPK1)TJ8{2S3lTQ_RJr9>PKpX5>iIJ%^mLFETIUjhke6J|(a%qYW$ zKF4fx{;McnqH3s8QK4C)&MamL=9uH|n{TyD51}gYDE>uIpP>lPkt7WUP`0RtGm6Jt z;t5PKGCpI#*4cpb@lT>mp(OyQm9Sw;t5I^0JbQbiJ}AgJlF}C-+g0v)+l+U8RX2Gs z1(*V;6qYsmjO7=(tI=CPf#$*eqe?6ok0gj?fPa06rnS<-XNqqan&OLr1dWY>$Lp91 z-i(Gf50t*zY0GpRq82r+WRmMtyeUQ!u~@uxunL)?~N z2Sx?Bu)XT(R<-wi!4G7DI7L;m$&56_5Kg5Ts{%)d}ezI1RMx`0*R&7&_*-D zjvRji;zjmAAn${T8rhU5JlbduV7*&jV*_ShHc}5utqe92AV6{NF1>uKMOjbRKp`5{ zOLTA#l0+gNK}_f4Y!sy^T&490rOeUn!kN>~lz~hV3k|=_Jvrpz&)7E6QFVZ9pMpgB zGOPjz$_KoUTdQsn3b=&o7DiG7<0@yD8Z~GSeh5z9Cz)p z^*v1|9Dp3m+iumrGH?nVJ;u{2M`ng#Rt>-IgN|3##lGg62sa)7xv=D0d_MsTD3bbCi{jf>SK@h;K&A^kbY@6F#`|A2GRGR8UR zKS#@2@FEG7_(%)D6xhQcm}a)zL(SraTjI@u52-8_hR%jl;9`p(4rDR>+jl%}gTy!f zt9h%N3d#g;tLjs}9AfZZ@!Qi0G?Mgosa+c#Vpvm>7ca(cg?tKyX{hE#toQSgM#`H% zsOR1vS2Wft3*R%DOq+SAf=ugDtPfFVuwC8PIglDNUAvSpy;GdC@b!ZHzfXiqNg)B$ zHBN=W$7tB7Yw7!Vy~uk5Zz*H%sna(cHJt*0JXAR&T@lhap|d;P^BZqDUrK6sLcs?S zJ5=X~`^)i{;LrQe$IRJMo@?q>&$c0vfEVVZ)~9_U3C~{1d1JlkkLS;|Z3m~G_tRF3 z;A7-Q=Hc{f8D7=XoINf!H0~G;(&K0D1gu_XK^OZcTc21MZX})gNY|W^w>4#BDvURp zb@jQ~#xcWpY0T+fephJ$tY#KE$y2_pIlwYB#cCPJTPHJL9NtqB7urK|+6Q6CUMHg% zm@t4NbkY5B-_hgycGC5Xpo~Wd&6`6wzY)rZ^G*OeabzM&ujgZsO-QqdaZ1?p^BhXp zqX}WbhD=k@-~i;Dc?(nKruDr&517gd94M~mY17cjR0*@eK&14GKpllTij`;^_ywDb z#Qa+_t1ih#O6SZ5b!BWyTfx^$S0Ncu_6RxB!4Z~5PxgFw2L343qdH_q5i0p{TOJGD zzTF;a*nO7oRWWJ453u4!Y!X&!zjX@Yrvl=fw`qh$6AYC-JhE;P_koKEH^H? z{qP_FT#GZmR?H;+Wth@~!~fpdQ^(m|vQx_LPQRscy-7e2`!!$a`Gupc_WO#Xy1EPl zN*<%Jbg#-*DnF**m(*waBvsSWo{`@-sL8Ip;C6WtajS6|HC(95)FHCt|6=SNV?>F% zZPB)E+qUiQ-L`Gpwr%aUZF9G6+qU)kyZ621oV@en{8*`^Qdzau$jGQwGjoo)=w1~o z(^9w=c5f1^*xqALb3-%dg}F9hHlE2|t@C`m?!zbC3a)O&aY^g>p-58MJuglWk&C3m zjN;Uq;9U>S%1{}x6mBT8lRWEi#K7U>^k5s9N?ut{XLQ!?YsRh4pSN^wvZqd8-$bH4`Tg}|UT(tNS2heggIO3fU=Imy(04Feldj)Mcfk@~X{QvFvii!coB! zVO|wiPf1$jA1F4)dEC@1eN8DAFU<)^)dCf&h=IWe?M1~ziT(-|qW~7zVDFOQ!*hz| z7Jddtr9Ms!la@Id89ywgIv7T_qtOf%wl~2#W>egS&$15o?{{R!&~8 zHw%=`Vv{Lm3@|s7E!D3Is z`{3T1F+y2DF*a<4Un{bpt}Iz7+U`FiO{EI;&s%Ti3f`kVU9p>0XQvCy`NF>ofw0}R z7m;dJ`kIlELT>E^SJU_DYhyp8XK)%k_N#bvO%Kg;v-DQy(>7KvWbBnS6V~I&iB@bk zm+qPE)-78quXJK8*8*1iw3LlU(YC>hTTi}Zk=Ub5#PeDjE!SlGLv@v z#YhRooW-I+ebMv%JjU1i>AT4~E`9Kh;@LrcEAfpKdi>chffTgexY~jLRYQE=pRdmg z`j5BPt*jsO<{z7HlWY%-p~V?LKwoFp*8kyG>VIc*z{tSH`Ck)vx75aLH^mUTU({}` z392i$u_2rp;)fy#)t~!Pkq#LOMD)ajNZx)D&buXK_5i%mS1;a`~bj$twVo)EIcTBINe>KwHB9bl|O}uw08S z2b|5KSuvuouFbM!GtbZM@Ijs=l|XwWI6v$YRIzw0Ek=cCpvW=ASWWjg6bXpcRz)Pc z!sHc>N98r?m}FMjF;}ZkJo2aDuL-0L5)wB_ZO7)GVwmVqCh5$Li$V5d%WLES zlonG8Y+ZRTjE0U}(Ks#|@!Pn-*l(sE)R>#a?!_C&QrQ)A{DJE>x_Q>?+2rMwerV+Q zKz8uV#lJ_JA2LSF5?xL@Y#FiFTY{%t-e;_G{CmiI=qea~z$h1SX(6@ssY<`v=dB#X|CvX?{-Z zpRZ^M!9-D#|{#hYl_aR4VU@>|Ze{xtm;~Yo}joy>gW_C@2O5=7eP5 z7Dwg8R+0faEXmNYtIU8>w3R1zQNhW>IO&uHdjw)&F6a7+slutcvH&s210yRU3Ljin zVAjMbd6zY2L~)^;>{k#^7gRRkf5CKJv02V^-4Wfnjt;1i$0?TSG1P!9n=h5w((jbY z%2#t5(#G0Nw&97T5vzrjP;MLuhY-HpAKigR0s-j#<|RLF#UT{9k(z={CVMbTH>UWF&yBO?mRW#l}buvEcJ5wOYQ* z-H=6X_%wo$eeQOW!uctT3jyfE!qd@)n_5*FhFY;=CHICX^kIYUmC-7gWNkyo)OeH} zP71#RTjn2jrP^KqSU#50|3P#9cU8nJ91QILRdcR%e#18-2|W*Lk8A!?Z@vIQd>EBF zV;8729{Q4O&jM(YdK?3>hd*&Kqh=zisAI>LEMB`T9b=#AsF;YDm~mA!vEGQc4TWMaL5ovzk9ZB@B4-@=uuldS?UGAj1zMNOSt6yDx)15cF zC&X_FP#xa>=;*sspxf@u?VcGq(!Ri3$2y)T-q)(zbUTxs>y*9oy|0+@199;z-(&#% zg1!;jhLO4&$b$D6!Ld}`kWyM?G>W((wCbqOKUv|rvh(BmS5cxp$&N|#eC8on6S5Yp zlH|=xtE%gA^Wx|OQO!y5fKp z?ZdL-IRwJ`LG~k==+>?QT(k%oXJ$imfuPI`=5X`e2X`{g1K>^2MNsF@GKNd;)T)l% z;?0=ZSNi0YAx>nNamEmtVZmraMS-GZh3Ozxtuu2S01B$In(KK;2_S8hBzd#SHO~@* z&⪼Ph=Exb=R>-PR?aTz5^4at=P2@2nit*y)7IYnIcPBmw`B)Qc~t#+;95DE+Ri_ zACD@PWmWjMLR202tdyL$gZTOkmaP4h&iP6xeO^rX#Qpy9Hzd_slPyM#HYMhi5c1Mg zO#v-y&cI9zmkfchwMG%e%b*ap3^$E}G(g7>h}|334t z{=C7DQEUy6WXOIpg!bAdmSh$Mh8vS+76BD1%O!bd9&VAf-zI4c3(^lt$l1NIOzn)Z zWEk3VP8JvQ!9G}|_qH2|>+^yumnHDpajZ0r{GzPZf7IQb^EM^7!%_{M(gSiPIdOZwja70u`is@+rOik4srWsJTNuyFK1;3-2|(^+h>nO!vq`y2{f_D3ZIgXZb!jmvXk1U; zRD3SiCDU@3W_ar6aOW{O=C?1QQb&R9(^A3Mp-F7EhqYo?25udBqv&p4X4(KOY*e%Tr4`|gnh8i z$=Q`DG@2BXpybKk6&n!qQmsJ-prom18Eit|E$G&oT9RV1z^F;HmJJ*+DM0S*0PRP& zrAe_Z(h_3`0_LEt+mss+ed*e_R;QXeShT;NsPfTl1hw3?ELk0w#HwA3!ONGT<O zX3H$IK`e$P>x|9C1aRdx8hmu47y9lKheI(c9I$H1(-NeXTKPNA7)E9IV@mhQ zmoQh;p{)G-)W*X8Qd2w&wY>X8HNjG*=qKXI=QmOf&cd3MlAcu{7V;Q8*-W$Q*Df&Mm(4I5GyH*^n3kOMx{`{~x6F{}s|^r|5Dn2F+v8G^8x;#)Jzt%NA;0 zi7C_Kbe`?tq$M86`N<^xvBkXQbQGJ)XAefXi@W85@Q#d9SW6_#a%JI*B=PGj?+Nzh=96hzSl3F2EowntV zd9)~s!#bPKLfdN(49(BQd$OqdJEdM8X#2KUe8va+WKs5aQ$Am_9%};PNFU9qS=&SbSn#7;l zj-B;c7A_WTpLX8oFp@7(>{7pATIR>&B`~{~(&p--x-xM=l~NTqi}T;KU#sE|0Q1qj z8?*sTLRm{{E)U1rJ;-H;yVPL?6KZcBHjq?wIFyUCso=bV>^3qI0&C49~FH~B2W z-L&7DmYPPi$TZ+Kn~FEDg;mXME2ekL8I7Hp=`LsuTSKKpZv=bWy0&X-ySK>wYD5-r1z{&@2OV?u}H4cZt5jCz!KWZGB~wuCcMkYjvT~*a9Ege3h}lT@GyZ_ux&1EVjopuA}Td^)26m zk&?D~rI3z+KOPJIF*q-YDUzpy>cBmG;PPd_BS$xg6PkX>Dz&Gq=1FWRFBFci*M!Tm zTZkvpoRvbO`DX`sZmg2$Jg&nN!gw-+(MCO2!(QQlC-VD3MAAptu<>4dnU zg2B8Vl$$UR96~oD5RJEC-3(;m_7EJo%3xC?{ZG4kd(0O^dE%6CW?UA~p^>^1pXta- z-NhAYEmYjymwKI%wY*KzDli3mf|8FvvrY|&X3@0P8gKJ!iiZKRN8MJSFY78)eqAe} zuz6X{X#G+39#obo3JkM~&@{V-M@@jTT>e=~ZAf}Mw$bAriw56xP-GH0g5CA83!8nl zhRo$_(B5>oI`KqSg2yhDFNH4WwmFJ{==S?0MACr@zIBhosVL6=YYVBo^{hF~-Qx*d z42(EgjqQ?3bn~TZko^KwJg(ThLLzQZ%Pf33;9#*&1lKa|n@9n>IGAvP{I8N3h%bbX+el1hq!m_rqr?z3 z7&d{z8QSHKh$+{^uHPv6GDl||WJwN@zW;EQ@2lOg6Y>LR$=ZyYAh(N3iCtx?FFH*n zR`9)y51Oos2OLOB8avQAULLhcq+YmG!zc~aW+OYzV_p386J95^wKa0BU2a{c9Igd2L0y#^)4-JpnlvHgb#|AJzk*Ji6#GB_EWj?`lbDU9SFG#r69A*zJ6sRc;Hv z?e~h`_q8E?JkZ3V30?C=76xdK3AVW)Ig*jb+R}eohwESY7YHNXNz{Q$>S&h`#dm3C z?HkJ{F`xaW(7dvKejMA;&!gZK@l~BISDDcSr&z_c+XP!zZ;=FpD|O*Dyu^iC!%hf_ zfwpuaHoQ>xv}kI1$54Xf;QC!v+x@$Ma7oI(D!f}4$iRwG^G)8*b-%hn>i^e#cqxKT zDV9PQ#u+<`p#KoXSBEYak*crJq{rWhw(ZC40Ygn$g#oHQqX^fxrR!DJ1ovV>&I6@twO&BQG-7EKT@9L%1zYtr5sc zd#x)zG~{pl*>eCut%IAaI0Jtc9FpxnSEPsRZUOPDL<5-_m#+iem0R<2!t_naxwMXs(=vtzcPG z<19|#&*i~ooocysvvRy-3#($H_@&CO73hUL|4^$J)BxPU5vMuIz9FJNek_?B{JR&b z?fOnc!R4dYkt;lam^*M~;qy$9Y#4~&^-(Rh69_j?t6(7GJm8=Ot3_r}&INP3;^#k;dd~ zwRcD-g8%Iq8O_ta#<~VI#H>o`|RIER=YfTs>u|)Vv&2Gw>kd5?TKWp z90NSr>BV*rAC`JXM%m#~X7*O(EH68-#7VH3N07;rtEWjap3F7%AU)6OK$VLO83lV- zN9&!+!&qTDBilo!umhUdlflCF=oI8plEKlpo6Pa_FM>BNLFU>^VdWdt^#P6Qt6~VT zNm;w)CtE9}yrM7otr`ZJG)C(d;DuN`J2;)KGLD?seTd$=_`KLg_&e8~%R7*)%I*6s z-xnDz!t{C79`vqWxs1u9ZDYR++X!~odo}^AAH(Jl6C`I(b#@V+r;|L*(pOM>iNMeB zFmo@vFnBlGS^1A??nrF0tlhJKdgLSUK1nzi>x@WTvYo1d^z3kU>haPS(>3t;Ggw~MF!&jH88Bm&PQ17rKtBqA0wr^|GU(l5hLd&{QDe31+z z&S8LY(Kxi-^v-s_Wh{n5wfc8FI8)Ls@ac;p2jhTAE7x-T*L{q8f^6!}Vuv?y@K6}i z+_|_t05GCC82S-A^UCj@+J?{wcDPZG)!mi9=Lx}5yJ#RJ<2r==`*D4xz#ouqsLbjZm-`#S zx#ZCm#OIZWQyeXwOVpX^3&=*=Fu-NDHme~Y4JnmTowWH^-m9wqa=(}pNtu%0ZP4TU zVqMia-d0(M(HHLhxFpDH88pN!=U%4^ly{79A6ZsvYRClP^$I_>2siMFOGu~&vp*(V zNBQXnwRbjhR3y_0e+K;%+W?QeW>NP)MaZEW!5Fc0;Yf)fXBzVCbC2(MdPX952&h;`M>ii41Q5#Febv)PrScJ}OJOrSsV!tq zDm_p)k>Ek(-`x)1?u;3g7qoEensC~4Ps)v5Wo@ppbKI`n{)t&yBwEj%M2%K&N8QJ~e+{-HP7YKJc()>Q_}-YRl1)B^2rrI^?G#&|{!2 zSJ2^Ep%UU&>%IBg-3gsqkE><>w>?DSgHsJy;6Nb(90k$emja0FYj z0Ia_@SPNQWg6K38yT3D1#(}%vAJ`@6ximHC3O0<#V5mdPfHm3#sENdAhL4$q%8(S4sjyKP-l~xrur`To9SV)*_aWih za}c7~Rpy^qiL%dA$_ibAx7DuWU%!IKTeqfhCRm-ev77qYCh91EaB>;7v5xUV?|Ljk zsT@*A_EZVMy(N6t*QR!R<$6{BM{`a%uYsetg3GrOI7X@dk=vxs1w+~U zl$LiSgPh9KBvZ0_Y~%uiwG})e`N{~L7koS>+ysn`M7ufGI)co@|0tGPt5c1|Mz=?H zb{2I|>>h#0&NO)>2N!)}Zi2dTO+zn(EW8?X!8u4ibhr-X@Th0dbBuzaj0 z-R8zv0?l)CCDw&Tzpsy(+TPOd3UHDVL=8ML3-GzaV#oIVIgRz9C;Xdjy&pE2M?wt= z2LEF4idV$(Z0CY`G9)~rD=h;c-15dGa9%1MF_Cfe3wv)~Di~c;-HHm9=g7h5@#%M?(-erpD6t<5wb?K)?b(8)H zi$Orxr_EXhbEHSpb*Hu@t(sKkgjGvZ>29V#u4LNt{Cw>tfs@Vg)>X>K4~Vw+JX*tv zJOD-M;SqP;#H@HU-6rG+$1u>rfQq+0K>pLz(n(>&+?a?>jvP)!fxD}!A$|MdAkfGh zvKbITJ&>6jA$`_rKu$pt@tC8#?acltEC=M4Sh}SyDxcIi1hDaI`@>);)ao4lLyREatrIS!!6S2+$0UGqikdIHl78jL@XUL72goo=>_zr zPNl!OeC+FhaUfJ7?4@+4X%f)mnJSaySnn`SWg?TnDO2f)AqcE-A-M3F$!iWaQ&8kt zWunc`UM&ry3K1w`BJ-NUgP3GmNG{DykwkR{ubQSqMP|~D9);t2-O>|;3aZkNY36?+ zbg8X_cyfKt)}2{#Hsn!L7rCX%?#$(nR%1|WwV5b>p042-7-seG9NY0>|f5cG0rO;;>>uk_v=6fpc8s}|Dhie<~@GXVbL5}UuYY2ti^U$OJ^c*qr7 z+~w%xk)P4Dty#E4=y}7Iri`$RR`d1K^FD z(EUGX+5fIUl7;=hH(9v)Es!J`vGM(@=a36*-g1qu?|=t0k$@u_e+c}?Y7m~6ms!l8 zn3VeMhnS?YBI@#NB72PhVt*@W%fhij13gjiuJXF^U9x`$9qao}mN$kUpAT=5(Nj?l zz3AKBo&B`X^ZmmP{44m^4d}~X&oXIIiRJukWnyn+kea=A+#1K#-IN&daBx2R9c zVb?nFJiYLaZV>6P$ePVLA^OQK=jmsyUCd|kH%s#`58Q0Jy)qe@mAo%6hE*(=`33Fx z@Ni))XVK%~m%^E`0ckpu^ziUt!MjS?!5oR5k-K5Hh*Q(JSoPmk`3^^8;Oq4j;q=gj zX2E(odHq7-BCF6@m1cEVP9*$^e+@L7;grG=BV36to#}SKRQ!Fjmv@0}P zcOn+Zv-Ch{x`3o?NbNgMdsTd1HBM;S0$xoz*_~K$Wp#Bu8<}Ne0AmIu3A*Ddn;j!R z9V`bPo!}v-0vGv76sVFNOceYPtAtX6L_#)b&YP^Ezq{n&uBSFJvG8LcgQ}j5G8$Ib zt0*x0+lNwW3yp{hcF{xz(IK57=Q zs>~Gar=1$g7+39}@))4`T6O|K!>eNi&SU=&NB$kI2s733GRRDB;z?yb!82jc{H}X1 zk(Ldc^Cz`_gCYX$gZK1eHqrH{GBgTKQSG1ZyyP&R_0qi67|Hb_5fgnu;0WHBQXh&F zZ)P1oo)-rJp7%63X65#+gjmE7{x}gpQ~^1Z#z6$hNiSTyu{k`U8+JD&(ZuTgCVR%m z@FW9M#%O+N_yDKFarUq8!TLp>TGxTu_T416LP1f`dyoO0)BvyRH6ArVcltp({fho4 zPThk)>8vx;lmYaZMnQ?1YC(y(_7#J&NT_BRLYZV_tm6;?u;8U)UP+Y3KuO_!)(#RY zyCjjgtTMzYO{B%_5JA?WH7td7xifSvrf?TVNSG&O;ciinFHH^ z&pJjuscObs5(^Jblwo9^Wg|F-%LFkJ_%Jb3I|=bBC*BT4eYl8*h_S-sBcT;f_aRr6 zFa_p%(Cn6&UEnNJi}yhxjrXA`0aV4LLHYQAWL|=-&=83ClsWkDIVt}`qM7bEl2p>c z5w+xijPEs>0 z7E+e0Qa~snA=3|)MBykQ8sfiLa2iAwRDicM5uXWrh>3e*jva#zN{Ok{ztnt#q0+jo z?1sj)cr+Z+5n2X&nVA2l|M3ge7~rE&2>`N$i7;+V17#?4MG5*cHbNvcU3(2-VfRhA zRlF4O()Lh1A0BVWqAEm91{v{T+xWbDjY?t1@?JI9wmZjTkjV~3mA5?HSs1f)fdta+ zwVj)X_V3dYuJQB*$yb8ux5Om=znToFQTE30MEmemxH;>llzTZRL??WHa8pbVqcgOb zr*lmLqie^5Q=Opb4WW9pjAZgCl9S2nXF0g>KYCh)w55iPpgt}UqaNtg>^D#p5S^3= zp8O({9}K!ttHTne?;!uYwSEmQLIWX}DLTi8y*4;8^}7DgNFTMHv zybU|<*8J-^=ui*3bE=yTbSc=wK}$e#Qm4sox8mtH4az2RaVN^?FCgEwQdhNh$s6q9 zpy@~lr9-QkTo=|^sm}kGpI{ssBWg=b+w#tH*oAo!n(f%be>ZqJU^FS#t)}mIL@nFp zafFfmYIAxXg*TL~)NmLNzE9 zf0)Y>0``=QbWu0e`Eu*{yFCr|k%@DH3EV>xL$q(6emTUDFagE~1WT?y)+`vH%BcBG z(TGlp8GB?87I34J6TW+9{JX%``qv)R@Ma8t@EfUH+3c(XvvJK`Gs4j-s)+*Q35{Ly zF&KWO<7WN(r8|U=M3drF7g9u{Wju45MlhrixkOA~G!HDwwf&`H-G4JuWg0C@QBw74 zw@ydYVs+h5Qw|}c45CI%(xRLHj;Cb=oO5k*QnxEORI!B9TG2(gEE`=}e~Q>9T|H{^ z+;k*l@iVd~$gE7SAa;<_2Ye{+*dbfiyHeP_u#cl~UWw2vHeCLNrIE_IUfsW*4>W_1gq~w_XV=Z{1{5i9usP!>dk@zBjT(*)1OG= zHc;hYBTM%9{wlJdRTK1xQ>Jz%oss~e=r!Vqr#MIbt-{SPE$gSX(YKv1l*}z=@}56> z4#(8{5#wHXaw!1LsEEPW%19nO`2}F(&K_P072jxXSNG2aO~`_xP-wFuwsrn#PU|I& zovTe7r&GbIc}f~LeJdN2vk?-OVc|rPpmDISB@-J_1Kik=&A-=q+m>C`J|mMZ82+QG zVZYeA%<$4aYU3cFS|}Z3D!FhrK!6CGT8aL<3JNmsaxm^s`81qbb9tOPD4WApfvrJl zv^jfd%|JBD_q@t}zVbD$&8JT{*v93a0~TcwHOdMP_vV4l3n`23FD+v{gQD{Mh1#?l zsj;nsdYx_EWLKhbiT;7E#djLm!_AiVBRcmhHc#eGlwFk--f$N;=2t4``a$uOp@E*0wMn#zo9()5JD zAPoiSQ6*Sc;{rO9yJE8?bO#P!=sG&vL=iqPWqSr~{q>^B;Jyj~pRy(Rw+eRHMV^YV|_)o=Lp7ZY=nabL@+S8$RpSwgAa$XSi3CaYLNh zH-R%eu8%EfzQ0txiHSIh9S{Lvd9U{mds}fo-%Dxy-*A30dqCp^+nO$+`?MSAD~_|2+jN&EP`KEU()yrOAqecbbvQG>jZavX&UV%sg1 z)x_ti{W{K`irFke{;R|q$y1&+!MV}x`CjPt`3kd@T-(FsHBox2n_043vUwazgm<5XcP&&oGp+|tDO9rHpycODsa0LG(!Eed{U~i)8sQAWRj-0> zJF%|j`iO$kM-Ob>ax_{^9&$*#XPghCS9&bXk<<}ZB-GY-#3M67;dpwxx(i#Ynwlel z=0`!^@&4MH2&-in(fZ6G>jZguQX6I3u4MKXYIh6PBv5I5Eth<{=8xnxFMC?J`Ed%x zaEnFK+j71;m09L|pa}r#=y-KhFbf}t_K%k}ikby)0QrcV#i@AM6-ix;Uewef*pfTH z>;o<>N`xLiiIOr>y^aL-M@wt$5Gs3fR}~J02}OV@r4Gh3Mz>x-WU?V-Ap>bj*o=#@ zBx$pXi0UgW3N5K&MD{pc#I{UYyZUvx0@1)0S4@Cas#1^=M^^+047Yk*VyE|ey9H8T zCfltJKb}u`Aewhc0ArMW+iLe-6oFh|IdW&Qu9`jt5q-DTet?`a-ev}1)`SOCJt^uh zJ?uFad%X?_4oqL2C@Z3;#tdQK$x)2IKf6mVXw70QWsyIjX)$mk51nzE%}MUaMXt(I zGOB|=#Dj%On(3pfOZT<}u_m3dA(0ze%7mkJ2g?O#owS_IK(;#zF_waO$4UeKRC$o5 zIe4A;^?CXJt>1S@=is9+QGsr^0inRu|3lyMsPV#&yNt9vcz=kX0t47ubb@-o6%N}Z zy&AnS+#GOK#no;W=8R{I{|HwEoFm?9-gjK4f-Q{R zNb`dn>C`j(nh}Kz;;wxA_{Q1m7aB+&&OhmLGL~^oGE4q&T6QO&LMyTOxRv=L7k4=# z|7&3ZZXIZa&E$CDwMQ&~`O4rq8`ZVJ?MPd(2+_|Zz?e*j$IptA2u}d)0x=43XK0n* zmHMm-@-)01O3;Yv`=U};&5M?%1_51_(uk%1R+kzYNiuw8D@9Wg_~$npW64t;b|S9; ztTgW&B6z%4AItO<9O^zz#F2fe<#a+u6swc z#FolNvIMWPuAfr;Zy}_CL(tGiOEtVVew!OG#@4{~oIPJMtPuP{je0AL z4^s1B9XJeTAZ@G&G#GQmTpASEG6ciuBY?IE;0N}aiy^d&GHO@X<}wj}TQ|?eBi=V& zBSZEwJLjHIS$iX>YNNI}@ue^%lY{N(#EDH_%4e(X=rK|H)N9{ph*M7>zur%~Tg_D+ z8x5&pd93X4=+CtPTk09$Z*UHkMnZ!v;TC5KY@;0+sv6kyMN-=g9fp)w!rMhFRY&Cg z(s-50Q+E*b?nqOlLo39WJq z+QK}48Fz{(a7$;3ESuonm~lZ=-`^Up21xuz>wHnZzigvZ-62U~+x!t5mjxlntVs|# z>^bMtcZ7nd@Sk6Tp-oZnD{|2XOCGfu+`#A^*7*T)-ezeV)H(McHFu5=(5wkD5WW-q z>t9U#>d#?s0W{>rg~0^sDzJG@eAJl{wSfa}fK?sIV$!9yS3(MQ`kM&HSsB%X3|^VpY(9)DCW7N63U0;28LTmGhV;fiq^oQNQ+z8y~=gUlFP)~jUq+>*XeE} zcX1y^@fHT@GR3Zg6{O{q_hQzYA)};fSY5dBYB_t)(VwgbKg_Vv;pjI6Q?i(^vjz(H zu5`zo!O*p*`E;B(wByB1Zc}w|fu&8hI8wDWxn&m*LZ{jY#;6N5y{# zh#?<)`GL?bhQy22W%e}=Idg6*sKpX6Iz{$`xB+q72iTw!68Dhd4PM%sCL4wnZCtUE zQyKP;H7=oM8Zx%w`;ht%>g|KKh{``k+N{wG4fhbGZ@KT}WAR1x+aA zar%ID_2f<**&^wMcK;wg-I@KH2hRW66Y`^fN?fCOx{>R)o-9TE;4XIy@f_5l&nj1o zE2pYib09yN=0jFC5@a8~>$mjde!2BlpaxbkakPQ+LR6dObibq6??MhW=NAfrQkPnB zQQYvFdG_40wsYxb@Lh=MI+D38xeUK zKrb!|NL9v0%K@Y0#(daR`tpC51AhyC*a zKTXfi1Iv%Q>x2I4uP?S=Mr)U>>G_Nw@CGJu(f<&n`rlO#voo{(_a-(vRx{MC4&OC; zcfN4(tT*Tc9QZ(;%}OK9ISZ?@bMTcZC@Aq;>(f8tX6`wAHL7U`O_aMh|7tmi%)%aE z!rM?1@LH{DJNg znh(UUvwgSc&4c<>t~7(4AUx~ByJx-qk@T0Dv!54a6#Y$$-wpgvHmVPV)P|YY7yO1A zJ-LNR-SbpIfKM0*B@Oiz`B@?K-qgC}XkI_E$Z2N7Q5|IuQ~h7% zy7f+WN7Py}+NQMonDqG&XvVfbwcsn0XNu&bq;&#SMnlwSUSS<{QQIWnYY_4Jgm^H+ zA&=AUp9nd(fWRQlft@}V^_DFu_G`5YK_kMb=>N$?1ruNzSLlDzZ_1`Y#e`)g&;_Aw zu}cGnvR+JDp38`5$s>>^gl-Tb*M#jNp`PsU~ec$()$lEQ)#zed&$W2h3M)C=C}9OK;Z4 zV$dz>55e-nuAb5grW0gqt$;h`RBA(rHP%JVBz2k$*F2G9H z?`^{=IGpnEs7>B*)pFdhrQ#r%&%N!jlh&8|bH(bu-SW9i5I#w%3G~Mz;&It+@l4jO zwDOcZ?B_ulE*JnTS8q%uy1S)3$4GI5Tl9z_4QWg3-mGYCOPQShCIxEJ)ql;t%=2&i z2wNT!1R{}2d)d-!ZzRfHE<`guPF)TaDm(1MKde#~bFx@%OjaEb1HL)9)CQ9S)BS54 z(wA{)3<|dX?Nol^qYg@Y>FxJYP-z}&H5+bwU|FS%5FkrC(pVnQO(DYE%Rre3khqIz zkCCVT3TJK4L>QBMK*`W~(BS4MeXbzG35IeE2`1@4iZU=10kRs{#DTI7A-SkO4U`Se z;l#uZD67BV?iSL(K+eHK&NT*~z91PA->)a%krCjptA}aW!O;ALuZ^i)2b!h6c7uJu zd+1b6{lGQVTTf6f@|6QRZxO811KISisCy35?^Rz{8X*USM9B-8dpLyL%llapQ{etN<9r~f}^CU2+$V+m(p+kk%-s739sU6k>C#q ziBX(rfCOa3#OBO!PowmKJbcAD?WQlAKjL*Fd$u?(3`*8AAsy?BlKVa?AFLIUqh$E4 z5)=e)ZHy=V#888*#zfF)TT4w^`DQTuloN$)arV4$9#e|LQ--pbG}4WIx5P0Z8W!1ugT^jL;2i)WX#PX~aWK1!PAJ z1!PF-HAp_?BobDVlakQqwpR0t+yn33?eeQSsxK{V#;HiJR4`;#qYa+5Qcpb&k#Di?frims_|GNubwb2LbnJ{QMP!cL@NM6 ztb56!-@la=C0=UV@NIA8$V6Y*C~j0eEyI}B#9Aqk#hjyeQ8A@GgC!etmZ}nLyB+mtdckh10c5>WORj4m zp`)~KW8)H_^6d1J@(cVoGTWdfqH27hxBGb|;#j1yGrEET^9Yv61y##}s#$Lni`qyE z!vWrpac#9+69SB-luHbINz89Ev0P{aO`TOGxL9BJ>Zc}(n%Jcz7u_YE`5vz(I#V=D zhN7)eq`|}nN5|z61VaMDXB)vfC?)42-)%yH=vceD8-VP=)>n(3<+Rga5QL|nHil*`uB?g+o$E)+r7b#vI z3sNTKr;*SEp-5uih*C>JoQ=~&#t`SRr?i3o*QshfS~vl4`?@k}f-57DSvmQ*7vEHfi{%8y2U+EFlVaDK_r?nVpxHaO{P+<@>wvX zbX%Or1_(_(C5}vd&W-$`+A{5jp_2F}_Sys1jxC%1sFsw~K97$l=Qb z7MHv@pA9ZI@HfPJXnJLC1WY`VPF4^i>j}kgS9Tk^e_b|z7^Fa?3nGmYjdL?#h;k~L zZ4o8$X+*^w${VixOL{)qGzIf1hZXJRNx&qo!aI%<0wQVR{!$}0V@zaPV8Hcw;*?Z; zp~-vgwE74DwyVXc_ctMkRq-4n#G-}+jZ{cNsA>$?k26K8D9F{1tIAhZG^5bO_lM&c zuvMxv@EE2Fr(|$YU?0#|nhA2fT3dZkV|0|ysQr9^*6x_zFl|SkeH7j4X2HaK^48LE0bX0k0&wf;F?&k^M(gPi zdAq1x+Yl{VFK!!XNYT`}WssJ$!LO0QAsR|5Rbd-ThK57b^?@a5ND0QD{&E<9AxrT^ z+PLUp+H741Xe^_U=CS~-E+D0)n&eff8viCBgj<|=oc|lj^IDu+(ZxEwr?Z6!d?$4LFvD(o~I#LJ+s-y`mTit0zH6R^sNj^6+4_-};KundhOd?}Itk$Eo;u zP9FySxe_+RV4qw6@HNK3sbgyGgbfu0q~__5g9!poHNmMPf~NkxF`+8oSJ6yp%>WbH ztN|LlXRv@7`eGH@A6SQg!Oj$&2CmT=*(uC?Eucnb+ggGN(=iOZDZwnk-f1k#jNz<; zrpglZ+N<85Ke6n13I(rUR;gl6fhUk-YJZw(U4%(v3jUXu^LSll6St-wUMFX8E7HpT zkc!YAcqOk-rGJ!_!&(DHRXeC46-GY~l^fGM1!gwYqo?FN>R)a9?>cJwf$HTk*&Sn6 zMzp$r*TLZ`_y^evg?a#SDAQhq5h0cWd;l;oz<#$80eG(uoRDKrB2G+xKoBIu9zl>8 zMlF1RpD4^kW@+Fs;tUrg+my{!LXFIY&?^u2<$eGG+I&0MD_3Gs^l zFMF}t!R{RD0|k>}Om)0q0howr1SgN4T-)ao`Kg)1sCRlxd zYL#X3Jg!_5yJf6vqfF{;zY5{YYy{q%14Z1wTUPv*6QrsR07}aU8mWN_17ajV6SXM8 zfT3>=FhadCc1H!{-z@#WtfWWcD8o>ojSPbpl%ZcIfZO%-X*z7v^-Lvi8xV&Dvl$qU z)k@GHg+z0LMuE{D(nM`bxHU>!gxwb64BQ%TJ4IV$v{_I&B|6a#%6PpFlC2ew2j}Y% zs}&!Ly=nNNHBE~_Vx!7#Wh)pQL%15C#h_jhy+3bkJM=q6`+rn{dMi^){{PCdLOW2HGBwhr{sayYvDpCxe1V+Q`}lz7c3hNH^y zueh}R5;ozNu!m5s`gxTq#uRw`FA9w(>PMw3IhHCW9W*^fvFv*HJ_LyDSIcXr?&0CJ8uZky8REBEUl~kR<%M0 zXzoRNy*W^2#C;Z^&$;_!O`m8OGPjEa--^>^)p`_Clmi zA-R)dzAEr?DNb{r5~-s)U%RrWJP!RhOowg<$r~3hps*%^$fAx1yNS1`f~rVMLbq?f8Wa zt)~b3`^)t<$oECF#0UI`KB3nkFeX1GX!zc@v+HMIui#e;WMO6JdALbN4(*jp^9>nQ z#l^+MxXVoCxv#dq%g)=>+2}~Jvom2VUv|5Iw!FvKJ0!@$HZr%ncjaTx@s%PtH-S;Y z*U5RnD_2mybwU{X=}7z9-CnaI%!dC4+xvU;bKxlq=rnFWzY7BBb#`Bf4JB*L z#S1H1`sLnAeJYXF!D_Xd5T0J`-3Y(u<6&jT=LIxSqAeLxBJ)yR%^nqvG%(A$?(56c z_dR9iyKDvduS$R@u?tTG#IQ~#njRdR0C$a$1UWVtzvaF?>igf>guj^Nmv4c|fJy8T z4S&>qy7@99>~Oh|nHm{)sVRe6Lm6`kGCPd}pCLg{t7}Id=d|YWF7EL@st0djHKW+W z)bS-$D6VcbCjX$rHJ!ch6X+U_p-uZ*S)p!qpEF!6TAprooE)IzX%2_LHO=-;)1!8O zUO&|Ed@~-0SMJQTpACsN8@O*d4mOYa3EFh@3ZaK^af#DGSiRJToQRUMi2AG+_P!lM0aiCF&T=gdot1muTsEemii-V?0&K@wV#EI4mq_X;u6aDN*&F_OvRJ2$c0d=AOlI#714*D%Z7ka zK%X$z+Iy*h?=md?*RG7AdwDS-reJc}qZc)Ui6KiG$|$$FW+kjyw?qRuOs26T<&GNH z+_5o&4!wO}NujWr^|O>QyYvQ*GFT4KNl$LIWiAH9rIFIJ`T+Kt$NTD zQsc;cjEgD{vJk#J2ZL{TGJ_-QL=F!~&-=m3&gVu?bNIK{;$0_M#UeXLi4+?Jr3_j+uWCDZ z$ha2AjqVuryIEGJ88EpbJLj>u7jxL=RlEzby|aE%d>mJnr6t99oWUnpIjEbx{*{(s z=HMb1i<)b%$2=gD`?S5*_w6j@b0X1L7I`!l37n1Tlq8C{i;!SqcLzRru!ycJ?H zbA}|eH~Ws7hTcJA^JvsfC3T=eO${|nw=wVvD$r`T{s-no5rHv}t4hcLkg*z0cP*XY z(Nuz&NBbuc=Jxja4l)>nNSeFruCbdok6p0{}g zzB-QtlUV|oo6Fsn1IC1+JnKvUc>f;8iv8ZWQ`T~2Zd{!ZsPSaInMg|!_nUqD^q z91=6yJc(y)@m$e|GsKUx#5cw~<8H*cZMts;fEEsH=4ttqY*o(|M6p@{TMCR z9T&Y8#^Yu)35&R1rv~?D|!(z7XCN z3kTr7M&6V5hM*!uCeivklCfz5lnK_>(7en7)OoX_pnO3CPGZ{Lp#?Njsj-d{rSuhE zzEafg>HF&uAHXfA$!A|vt*n2A3$0%XZV630A-Ugp_xycYEbhVEkRV(kuqF`4+(X_{ z@GRY*(6p3EyJkXly`XLmst>3is@%9?i*jVL&>_G<<=L1P)HBIH^j!ji$+7E3h z&y*?{{V3Y8IT(-wq+RNB%fTrA#U!Q=9YIJ7?$pZ+3|fE}1A>bR1m9#1DuPSw<5D9W z*vOQt;Rl=NvpVNOSL4&Qc1RkjSeA36 zbikGhC~DRS&w3~^KS#sqcv6igEN_!7UO(P$*W5X10bk(t8{o{sS>Ys&2|cjO)u&al z;(-AP=AhTNTQgX--7@ExWcV;@zi)L18JnQHE?7XTSz`tr$n1H6@*$kf$cWT{8A`T63#TGdj7PCt~cQoU3#s11jBXx z*zSHsD)=h0zJ3HU2pc)jjj;4FPxhQu_B+}NaN-QGD?aWnZivc86Y5XTFJMLF0a zWWq8P#pSASGR5-xXq_K$O}=vzzisVQT9zIkRJ-m^7UzHo;W<2Kp-~2;T&(tQhN`*D z&NV3@{2mO2IyJY>FJMJh86Hw?9y0^KHNJWAuI&ayxfONS*N=eHEb9Yz-pK#ii_&-h z$6H`5{hrk-&W~FECbfK$0`Lc1H-~&?^j}@ z?_79wTn##jwr|ycZC}G+US&&all}1ik%`-3Z$K5yhEWpmU?{pGnroAd?uj2eP0GUh z(n=Q@xOsdk??$d46(OoXo6?{*Es}{JM5VFGP$46AjQa%##+o(Eh)9EHFi*F2#=$ie zuL2s{KKS*FR5=_K^#Q)Cg9FkbGGG-Td(QuLd%6@>VVmW^xy^QjN~>`yiHrv781mAg zN+szp;B#RvU|+)93c>z%0FJXL?iu;Io2~R6kgP?&emj9T4w#K{JAHFmHKbEcJgG6_ z4#RaB%;LG_=Cf4P{HMvTfwl%m*!@s%`2ADnOFeIWq1MGr45Hs)747Di_SwYt=pN=fG`K$FgzfwK+qQWmA7p zHP7@|r0rjYE8V~D6>#BkLDDk>NZRN(_y>dczKfD&_VG#@9i-9S>!F31Z-W z(1V-pA;=e0Pc5qBH1U=?z52pFAEiH?&cpn66D7|2Ppg8cHa`RraM;RkcU6s4qhUX?phRH-P#w z-zPWS@1GO4XAMkN%L!iA+*Egcu{Gm8M(|ow`(OhZBt6wrIXW+AXHR*@MP=ka-{4;3 zu`~a}Vd(#k|Ha72!uH=-Jeo5N8^f^O7d5kOjCp=vU5vOm4AL8g*2OYh((^KK$i&C@ znPmx|KZ*d74!_dtPmf+_eLl^?e3DeCug}2A^8Xo>p;YV?}+bb&;DfdSKflgBt?_}XY5wEyVcQQ4<0Y%P4@i=^|jO=SoqEU z2dj+ipV@0dh&HD7b6WmmyMkFK7&G=!U&`ZrFWtz13-jA}L1O{rSxC>OhWy+lxLvuqu}0tz+JHR^TH zKwGZqh&`Qx2Ma(v`*s%{4Lu;jD-L*Y5J0~I`MR}om8x6XZVitb+JSbyS`>=zKs!#E+N#uPAhoYqqsbR9`dy#OiEOZ{nw83c?s4@tDl zmct%!HjpDFabC03u2o4MFHIX_VRXsDpo|-2A{L-ZM_ykHRJQQ1=X0~U=^g%C?GRA0 zsdrF|t_W>mNaqE10abZ`2T>8$aA_&$u*`7BrA7m&90V^unN^XWM<1aqueXdUrjPBZ zZKD@3Jm?NGRa)rBt#H3UKth2jAsDNAtXAG2&)4O05@viN`hPh(`8)aUvVH71W$3#b!9-c8)-k&tNi656`nRlumB#eeh zSHGG&7leYXo_9+I_VjFVP$!r})A^702G%2#FT(bfN_F*cyoxPRN!?K)Zo??fB#CNS zX*pwxLL;*tWqHk_6nRBUqIJn=+#sX6RYuk74Oum?J$&pIWA+7r8W~H#hMk3IC*De| zjd(4#s+bxTD;_0?L|tAK^*L|bZuxlhhXMf~C$g^aOI6qq&CBA3EJ5}vGZwN1MV%2m57mI8BhTRcJn zVqxz4To*x1a{+3ubch1gRq4FFtGS?D{h^`XUU4yA5wrc!zj|fI@_r=)zDrnbkb1 z*q#*HG1g$N<~Y&JsgkjAOeRI;JOc$RzgC)I*)+*jiG%36?2&byGTK6QH=+Scqw`_h zpLMg(_AjNE%8i+-7N?Ij{F+56*siu}l`JKlq$P0`cPdQKo_sYv#k^hfAJ!+@$(@YHd&LcVV~7;eiH@$NiSv9EVCjb> z!j)n<+;5qpeYwtcSV3|J&b z(KUJV^GFmZFOlJyLW@ciP|`*DrJJl6m5XGG7Bna&Olis4ay$J)ifKmj4`pObdEo-= z+A!t9P4=m*thgu@Bo}ADn`O3jXH_ps5oZuN#4$yYs_xbM$^*h{emU~JhyucZ6YMT# z)Xx2iurIxS2*P#8`WSr+a7=Jm@P=_T zx+`&xw_`;)rNCRq!OE?~c-53QY3>mXwF*gaT(bU9?gcOj>rT4gw~UFZ9TAd2&!e4l z*4Bkq1nOnLFK&mIwI`cg4Vdbo&YXPDBlynL<(kxlJG!bfZ&Gq_9IR7dbf6=znK-kK zO*^wip=#Pxhj1lTJSE`RH+e~rs-Xm)TZ9D}W15p!pv}vxphct&{g^bJdr5B$zr8~e z*y8*2vNt6>B|EdW-9_7wFpn2fSfoljHM?*W#vb zKIcext{8A*_o&!n(U$r;fPL@0Tb|4r?DlyB_!;o)qxbdY_a*HEz$sO+FzkG<7IZ7N z>b|Hg^08RVOIIVQ*rAq-7B)`Vj2YK~38eh`0yjba%T|aN{fA)I%G>>8=k_qL^K-uh zr+e?Jxg8VY+f&54e-@#)J?~o$oXn^#kknWInRD=A`^UEX>-poxr;>HXFdpL!5$!EL zSmaN)tr6#{Nc0$UJ)Wkgs-w*zeGDmbOt;5OUFty;w$1dvI9vg%Efb@)z)6CB@4F|T$nojM(MdIU_2Agr@AWZwYS8WRKz0tXFO1J!{20{BR9orhw9q8$K_h*l3^d;& zeKt5xlSv}_hSTx<_gBe%U*w$O^8oOp>^@Ls|9LGQ;<83Tg5A207wsEY1n6KFJ zSjTNtvzh1+&~@{Bi#D{k1RXK$Nil%Lj$>Gxl8)lh^Uz5UgA^^9HOUQetqdpAe|PaZ zeg=0b(e3oaHvG(yC0C19Q*?;&9{@I7&>AfD?U%|qk{pT&G7VHm-wdkRRB;)}nk@52 zP~2^PovdU>55xX?GOXAcyDYLk-HetD7#_aDr!`ElSBUAf#rT?Umpm*k8I(hD z@ZOF&$cjGUf@{;+%SQprdb3EL8<+16HJlfr({tH25LkjLEG@yWoPY)EkR`BooIC6Z ziuI9%(-}?BMO`)nOCI{vS+-}523t{I%eG6`WLP@6)qNUken6V= zwk9b2Z1SF2mV{crzPf}H5fH!|dPY372f54!KZf3Wx<3v&Y`e=_(%3R>keTrCACdQY zlE5MlC*j=OQoJeNc0do@BR)YR;pYym?{(w)8=qI@K+J|So9nwW=Qogii$UoR-+nmO zpWcht0yk=?#rOear*xeLyXkxCn@4?ezY-53o&!p#uJRA_M7+xIXaIkM)=XNcA~v9N z+*=St?Mv<;ua+ZN5MkyX;&zvV{k;~xven96V|GTtmsTc+-@r~7VT87s7(pca&fnTt zxomC~({>OlKrK7l>Q;iO_gxnkew-N;W@xeFOFqT9Br=-F4fJlS2n`tLlN;9sSn=(Ga zy=w6BZCh(saJW4y>zeJ0V7ZScoi$b1Y9jFj*(mZF?=#q_We&2oG|z195IZH=a#-|G zy-ewgLmelOMBLf##)yw`&uKMLg5_`Ui;!DlM&|AkAkH~rJsDdg3Ge<|KR9|2cQG=A z;f5l$#6qh2>fcvM?|NIbpm}@HorqZ2xz?aA4iLE0vr;H-3p;M}-GS_w_jinlOOOC}f5KO%}Y~1wZ;L!1IkmVgG zMfLfPn(f6RxUCtR_sR9~k)8yD{6Kd&*8L-}&eB&j5BL36;_CY`5|chF(GUd7R_Ct6 z7!;su;=3))yN~t*WqbZw!Sq1*8WY0$bL#u^^?pG+vez<@@ngX8&GK1~%T8lbobv;y z(Q0+_Ke$`}OY|un9pissV=)m3+A8)dV!#S?T`>$TA{| z$9Qp?YBusMkJde<{S^)`6iLMHQoeoX8^F6+bn)tNZ;=;#1hv6~`m}klC;@N!dTWW= z-oIGMVSO!P5w|Xo-_VW8xMA(7tTlhY)VW!e#KL!nwk7BbLGlWZbp5nr77l8~?lFXpB}# z@zGOkuo&>n;okGaMq}8YD|A?V3Nm1NNcu0upuG6fG8Oz*;S&TP_$C2%Z0m$!#-H- z_JHU<;m_FLZ0IkbHvcxmh1JG7Y8{8H{C6oP&5HTmM7X{_qPI-&0>0>DHjBNG#{Pii zC=E?~wLB4J4LX>;T#V9_M2gOiS3)!T_CxaZ6^$ZVEYq`zCjJ={4#|kB;;JI@LjkAl z7JETE*lFU6RjDn0_8D~77-X2^aRN#)>>=4qFj@XRQ0OYHtS$59# z?f?mGvFv{;Vi!hVU{l53X9BEk)Jh&xfRY%}o$ zCj*#V5&y$L1ic{>p#!Ija{8k;Z~A-vwu?26^=}%7ZuFrgQ?`vP-YvIZJCA(fa~5wSVi` zGMGW6A=_#06*!F`b%og%s5gmtGe5tGwZSyMuxax?*(qje-Y`O#>ij3q!V$Gk)ttl@45LKIjtwI`k`?L(mMF)g2?7e~p@P6zB?U0%GX z4KS)%_~TBSs@7j(I8?xLcE+AVfR^xlLr}Oi*h6ni^}uiCsy3f%)=HnLcI^1_e!ow+ zd|E%8>vGuoV)@2hYNDyA)S+fSRne2UTu^A37y4rZ;&_i;IuiVe;P7JeVb0T$D#hU% z0RT*g0TR-bBD0xjJVv63)3m1ZP-4P}RK)WILFqgSbm%-o(*w3r`7O%slThi~Fi&Be z4lw@yzNkqJf`#M2QOL=?cFmKHVSu1dp!F36w~N>UT@V~L2{oQ&psQ?=G>mg!8gZi9 zNo4K6KJb9P-k(n>IC2E%1Twh+H^$6IcJWU08RGb&_vd1T>7{j^6hZ6`tUgckjqt%? z<#7}oUVN>0z&$T8V6Gk~Inn1sHq=QEpIDeXlCa%j_bc!~iT`?GQ-dh3fQjb}yfEew zcs^T_Nb>3G>r@{OO{~(EV~}}0Td+_q$z79VTRkXAD|jXWRmJTwyYvBm#cbI~E%+dr z8__n{^jalC$V)Byki;ekDnzf<4kDP*l0FP5Dw4H<`iv0AzY&cFeN5Wp*~d?iZh0%} zxU2CHzM32^W_JP+6uNFYnvhgzUymIuqG_Fjiv-157FwI%3l+Lf$fjwC2|~vE6G7?L zJCGgW=)dkI;1n@p|h`aHsqAu|ev z^aaDAu(;9F;$D_w+s^kqJG$(%_VczzMQvHyw~NG&xM(QwUp826S!=p~K1_4Geh{`t z-59OE?+CmQa(Ez)1z!)qg05ijP@0m4o_SkryH`8k?`z;5Ugo?kFVShQP!lIH~>IaR}DIs{(`^J;=PDTJz`VbH{z2t2RXj zgLpk3@4vz^AUWEHZAN_C@;IBNBx(_)z%iyB+@~eV0Kf;XW6~7;(b6LU>3_;keMW1S z%j+IrMhx>@J!|g?^gVGcvA}Vi*&x8Rl(}=HuFj3p3pn;Ij$Kdfg+-byGZ9DEnZI_d z>uKObvi}q^^GZEm&91JyWDB=8XP4^ZoaR=~_gjqEi77_14qU-gqQyg4$|jV)<+&V0 zdB}Y<_Bnb+7mm88Bo}Y57RO~DyDXR<3u{PbY`NlVvo-V3C==@;rbxME8F=r2vT-Kn zq4g{^nT>3r(mMA7SyxK-g$tEh(!FWGJ+SPs~QxwPc7QAG1#EY?6sR`!lejm;j;)r|{9~*}FL4oLb4b z-Y$UI`UIlb=;zrin%LniDzDoQ*xQNz&XdhqbPQpybSl46RCxunA$D9k5LbiIb_ZIb z`FzYLR~+w|MB9xgh+_)go(+2KF7>@fjotDMX6^j-P$iyO>u!Q1e%y}XwdLVYdXQ9A zBao;|;z6CNNUwXP1M1sBo%^S_e#fo=TAUZA>alj&^!mES9HnKA3^&Jn#G=lgQ^xLTiW+0B+MRC*aDUWFnH0IRSF237EJSq3r#^EO? z+HQeO|J&f+eCK9d(D><;l2imWtX0vU|Js>u)O&VW`J3zizzikjXz4W_W*?-96UG5+ z@_$R+`oE>l2$ueq>gJkY_9mS&oN*!eT2^S#(NE7_O$^1vu#K&n>3VARUvqLd>r=4I zPQ#{W(jn;BO58c5Z_z>SM#0$2Hu~@&{C%#10(oe@NYvf{4<%jz2W~xwMvQQjDYCuX zAF4#Z!$q@7hj{kvpoO$=$^(po(tENSI?~4#tdtC(p zHk>*P^b6m)F8CzT*YkQ!ZHw-8H$~Ad*&Q4;Xd`qU6~pwUkj0SNMw{wQ1MNF=u1v!Z zT`%m$3)}tW0DeH?;8&fBWh!XuwXg3DhaU{nJ>mtA6AcrIgd%=@f`J;jY{(@_cW5UyGuWY)4pD-UA9QNiwJ}DOg&&n8KNr{d?z``4iQ~ql1k}+Ab{+GR)3o5l<%PV>W3& z?ie8|<xejB8jzSL zO`LkU<;{p9z*AQe5RGDY3Nrjau5K#Oyrd$)ckE3J@-2@7AF8Vawf4uptHd2EA0=16 z!CL8=47uoAmO_7B{qLf*`S6H%nx9rQxT{hs1_*;j{%?;;DOJc%V}A;m@`1Am+tgKp z9F$Jd`RdCJD!02UeaSoVh7dFnZ?B6Al&dBjCE!RV@mmaVMiTJFwh9rIzzM?rOpTrDT_#=Pa_wHHNp}fqX+p zyV&{yj^-|WbliQWJfq4f%^t4=$rpoY=Y_@YEc^b%{b=;Mq@I47y^MaJyC7g)Q?YvB zR3p^QYG6Dbvk+vpk20Y~rRtCVA_aD~dXvF@r%M2#`wUrpB{Y)8jqAFbXH&kiU|(2T z=&!n^oqI)GVl&J!u?7u|r!rE44V~X5WDFp`vGyX5Jjtp$f z|F5UNr6y^+DFX8!jan^y26o0waJ@@{(hU;pfK~NHmk8X(1_hdC`Hi<9GIqEsB3`6N zIgomn)`wj$B3_5#2s-ggc2WZ89Trh;msy`~+uEd)Ye&L>Qm#fB zeot1Wlc}kI?mG6P6PM@F$P1DwzvptO36f(Q$?oaeWvAqjET-i#sfz@B#{|12In#Kh z5>wc^F;0F@Hv=F}MyU2(7G;*f60a@72wLJ5izigY|d|Sj-%V1(&Lh3bPczyt9vU^sh+5t55AD1Da{#cJKLvN zxI$Nj1T%)kiwTsRiN$22j`XJTZ@QHGUuXbEc0%>wvyxzqnyO_M$HI!CiRzW}gjWEG z$vfoRQEjAfsvG1wlhG)(-Vs!N2GhXeagHhN@(@&`2lvG)SMNQxOeFVRg(L33O@f++ z{<3`KB`@3g)M(5n0B(E^DpX%BFE9Z&Jvgd}x@%SK$^Z2itvx=Wsm1D%0 z+itz?5|CYg3m3l~;=l)B8^@p~uLSUuZvk_lc-_nmW}ZV2xFW7E?F1H^!J&(el&W%` zR*%&vXG_pfA-BN+wk=Q9t#AeE^&Zp^9c>$;0E|0WT7x~Nvt*jXx-nrCx)G=LqLWMz z26!+xo}ri*B$&JQ11Lrkufw`X&QH@KlOgZlVWW{<^Z|2p?aQZw*>mQB4mi4DOsO;w z4M9A8jgd~^=#AO?Kz7)EjkKJlVz9pvZh?UcrVxtk%lj2c<;wHU|o zS3Rpl5fk@v?wLYM-VgiqW+*>87POb_xI7mpb9 zr3MVC9V3r0OMbasURWZJiD7jm4*xz}k$o;4ZjjWYu>^Ww1kI{dUGVS(Q)Og$|8uR{ z?WzO=Wo$Mf&S|geA;M~B{GB+wrMhk18$uZUks-=^%0*oGFzC=_%B=W8tx9Bc70q$o zNEZ%vFBmB^9(AgI9=o>yh^~FYSW2p$2L)g16c5(^)&=<2zhqA;7I&j58GV?L!W5oX zC~EVU1dK`Txvxr?*pFttPuTsV2Lt$M!DUnuC^LyFZLtW z&)0`8+-Dw(c$aX&_O}oF=h7Jx9=+vv3;ZimGTL!b@$dd=nn`v-{aT`Ke4UO|a$7ZN z$LzY%PmeVHxwvOmr|-ir&0JsM7b)5L%G{ z<99&WWk}qy2CyO#r;L)KGYnci}OjzF4*DwqsAi)Eh4#2E9J$U1WmNzHbiWc@hKq5+|m+80>( z=QyXY9q8go_cvIjII&+&VtTdsN_(zdG~R@`gbTyWgt3*OFBaAh7@;v+!Sf#m=9LB< zCV~c|B*@hZur%FYViBW}Dtb(ErhK-WBJM)!PCW*PXX~%+9nOMXJ;a{|sy!^crY(jy z)`@zR2Lu3R0U+S@SUeDg*}W-5c|*qCaC`xUQ9sD&LmgZ)m<7F2!RTWxBME#UdT6mc za=@N>1%RE<-yU&6Yq`g4hn^!Ux%>kxL)-gK)qj z3#>yx4sNXx_ujnIq~Y0X#dUsSIyu0 zj}H?0HDX@qW*B5|3rfGWU>v>^1&(|Z3!3;-6M~w-JrNQ z_rDCvvHXU18h+V|I;y^Y+nu4U_e$F)E^Y@ran1uIaO7Z^h(g!DLF5GF8I#@&>dJ^( z7xZ`(VGcQA_i=J-N>F>Hauk{ukMjl5TmFZBp2yd@d$d-O=GGf1;~W1v!Mp| z9+Fs63S?$+L9@uMx7hF01Nr>rW@ho1i$=4diAm6ev{(Ac5(vTOg?=UdCXuBW3stjhorCnHDKvtPu zVx@Mj9_EbJ(;8V|hOZ>gIn9V!i_6{tr1dcxnj^{68(rvy_RyUYi^C`vgm&fbb-e_j zqdknVy6U4)fmSBHq{PnkzA-8(YnzSM*;x|>%BUMP8DNQ~qp~6r{E9<9%i#t1{z#2B zW>CQ)2iJ{ca~TBMF^9>f7-5nnvIBO^L;dXnwwLe#pI6Z_{2dg8#Eke^a-~u< z!vGF)id06}w5dh3P%B}MX@a)#9%GUK1R{D9Q9Mp{Fk)&{zz?O7!&XJr&stmFNPPo5 z&0%tXW0~7TfWbUB>vCAw8VqR|44W0D#%H6cr&75)c2KhR!{$6w5lZ_b#lRVX+*1*T zu}nbrdL!A;=t_!n39HA}i@7HYsk_l#%)z5?{Qoor@9_zCczol74E`JF4`h(IV=vJV z+!KUj5<@?7mHIi-`;|LUpo;hh5~P^0HVbRs^m0AUPaz;M3r-ZfSrvHT?3r%|0GSER z*Ke2HL4sA(@+$b3PaqZ$Q7lA#z%DmWo7)#2(SWb9cC69r6BQB9BUkWmAptHLJR{N93#fsqKh0_id7b)! zL5f=1S$g;j{Yil4ux#-cl2Kfp?NTUkRsExYfauSI?{^3YiEhgW6bLM~s|A3F?Q{WK zp1ITaYZ=iWCid5I;IHNM|5!#e=*{!um48H>jNW*i1$NsetY6S59DZy>sRyr0ZWkSH zX(Sk-M2^c>86PD_tB!R{juTEE?;m4oQfi==b(SY8-$YKMSeXzm*MJ~Yt$K11>nh^8 z&UxXguHrg>+PzmCQcaAu(zg`H=)1a zh>*;m?Uy#MZe&r7Z$fRLXs&c(_<=bU{daxBo&Vh*LYohu7-RZxaD-KEo=lpm7a0gu zk0MW13N^SOS0Q*1N(uo=lI|%L01r~8mP(rI&=e?H9||zA8b)710nWPZf^{_`;px$m z)23B9pzTS0#|(JnmugM%{Wd|c78>aKR}SB=@UZoie>j8$&wBaTi!2ZZx*CzJvOI8{ zPL4$%i@?B+rN13F0Q$3_G6=jB< z2bFcdskvFgJSq!0vVMXD21}XN90^x_t$3UadJq*xk#Z=aO7ow2nk4_=GGxCpGUUyOgnAtB=W0~VNf{Ux5M^>rcEth8h5RO z&MhM(#fx5ok*YP;rl%9POsllK5AD^qkcAG6OcdwWJ3PMZUQZ=IpG&O1@5DRIKVICQ zD=UxupN|oG-Niqx;`W>iH5QFYN6)@J-rrMu6+2(oa64b_T$}Gijzzl8wmAz_>wS2_ z8`CO{h7S2xHSs$`nL;1wH91akrx`Pq5yiGs=O)nTl5Hv47ydUP3g{vq+7iuVhG{X@ zZ^VSmL6cwmWFT_kQgC&F7CcWfIgllbUC=ohR1?tk$5yqw(lil%BFvP~yy z>NqF(Roc&=A1>W-RIpBZDX}u}VMb8|CNIr=Yx3~GAzJ~10 zP$cwtz0~Y{A7}Ip4!XxVBEB{c5_4KB=TRyi8;~ z6iR|R&!3+w!`_F+KeU`+k%K|+M53&_qQZG?B%|hujm+d8wUW zDdL^~4JHs+!bA0?vi$ZtXNjNWf}7W1fFm{weMHGYBZv^4-NuzYD#b4Q7Q0{)lB9zz zglbSAsMrY^Yctx)e*R!dm=UiyFrI;OnKC4XB7f))ZL4`)MK$|=S0piu;PrN&_ZL-U z5WOF-OTZ zi)IgoV+)it7 zRy9-wkj%_XpSrHJ2A(*Cu9!`nxScBEDJ$RT8ERp8_WyE>A}<_;T?GOS)hw`+iKb?Z8XT8Lh}&8)@%?c zJYX++^)kFrAK}Hd>v7Scp?*;=RO@Bc+NpO<{j)}-GRKXzdZG&CIlhPIfP1I3Pd8*{ z8Xt4jlR+o!5oZj!H4Th>bE>(sE^3=Cp|>4&II$5Esiq)3UbK{yuO{=ZE9Uyf?Wd|3 zm4Dw+7To^oI2IO3nB#uL#z1}|7?=5JEnPSe_jk`x8iXw*Ql*I9;ZvObD9KS01(6#I zPiR6R2{%Pn^X?>zW<8AB;JR;`TD3jeA{^1zs2_eReT3zj9g2M*AhzQT5CfeU<_Ik2 zqi>vja`EhM7ng4Rl;ZfXX!x;KY9rk8-B!4eBzLkThL|rY$55M(v@Ct}w!MK+OiPuTGRDYfoKvC$mhu$UdL!-;#I~Tu#=U? z%>C1?De6)Hu|m&2tWz8hw*7zP;~{z@Z}_VXPe{U8lpf74kH0ucX8ap|*WX5rT?Hv0C%95@Lu4!dnH)|weqe!823Iv>*VHg{*%B2KJo>rBI+rr5#;)3ibUSgPa z!|cENj%?oVb^^lCkxKo>myffUv_-ghEdYkGww;PM24FOO@7k13b~|$?(0%U`@%myK zd-NmT^3Mz5c;?GemdwQfCeBy!{(Bufb`6KifT_?f5+Wt1wufUQs&Ks&Cy8BXYZ3=u zg7I3v3H7+HE7m#+qP}nw(Z%rZF9D58?$ZOwr$&XpZ+(-*n6LK zu`X)VsJh6AtcXN>S^2z_vC~fOSNaoo6|3n%Ec7_mRd~8~Wrg;lVrpl`DvvS3?Yc>D z|G^N$pEtjM5}+D((Y#Y|*UC4v&&RkI@4YspyQ*zdyoyx7UL9EcB#l|Yu@sE+?avz?tB*E6e39*Qdp)b=sc2c5A^Ljz5N*WvTE?9if!t zz~gDO<$q?r*>7ksg-7*zP*S&I7O9|(BJd&SYP1BGcJe9my9^+pfVFP~v`8ICHFc;4 zYL|PHD@rfG!x4Qb-HS&s8>R9oY_w^_4=uhiQGX`{9T@^z1oNzrrmQj6d!%dEpm1m( zdwT9cKA}545|(k6S3|nKN;4=}s)$=rY}OtB#);q|D|&W&i<4-U=oAzjDon)0=l^;3&P`3 z?t)&W>_h{*nUA<_6qnqQ_L?mDeMpeP<#lax(qG4a;Or;3{IvOL8!MY|UpX-LL@ETu z_<98C%sPM?8XpNxljt_1l~>TU?hhtN*2f)et}3U^=KNisvF#-QRtm%1PM`$-(v~bM>r@P2LOm8WQL$O z2n;dqZACnWsE*!PuZbX!8`=stL2!)zFn|FaAAU$-oD%*Cx5A5!Vc_5yXK&mfN$-Sr)ig1scs%|&I(6xcEyt3aOg{m@6_xfGmn7TFc{my=k3Hx_dFXTL4 zlp4bESai!V8ESsfL(Pd4L)|Pp-LLnxd2XIh`_N9)@gcDtpk1n?nKR)x%;nB^xwhI$ z8cXKaI%gplf|*#O-#*F4_3hK*E>mYi9aQvc@R2FkYVfJTXf_Z8{=!lfOBSx@&W}Zl zBjB{*@EJ)zyP~@vE453(^tT9pLfo>SS#;+~E?wOn+I%`u&B~orcD|PE@i&bV;UiY5 z@~SdyE;D3(+2NUw`sHH}UF+JGu4|zm;BmGtSfy7hxe{X3->p+7M;$L)H<5a8t5Is( zDcp|t5oeC93uQ~c+7Q30J_q_`S9i8$50<*zfn9zLX}3EOIT=3!7PpnKJ_+L*lz_I% z2JF=~vD6&adXZYTdNiKtH`$A1MvGazprukeGZyfD%d!#B`4bx0Ref!X)o=4%t92x% zLq^!L=9+@qv(}N%*7W1LMCkHrlSnh_OdB}t3pg`-;|W_mf;~>0EDFs?!p|3sx)pJ` z0dy6iJJ#yDIh1Z6spqa0Zx3SxKBg0Mg9VyCSRV%!X`^Qzz$9dXWms$ z-}YRgLg=e8~;m>wdwc zi&s_V2cxo{XCUdf_&WEWJ+ose#`d2kH~>{N@-O3rgQUaRf3nnGR#H2TJ=@0fb;C)R z{LDhg=!^Z3P>BQz%!XV!An<{bZMl$ZJm2Iv-6@Ux%Ha6W_s^z^(d zo1ea}6LOpt`8Lh_z>2O*YNzp6reCNE@+X;h>S3Hp(1QJI)P~y%JDxZwr+?gfR zZX3M4-1K~1-TXv-bZ)faR8LJ0IegC@zPY|>9q#|2V(XcCU$j*Fa(F*|9Ps~mynXC! zAN%2SzvCNie>48rY(1>6(fIwKCzsB8{uieK|2=*$BO3$b|8uhHw84hZ{h)TbnLghE zfEJq`1)p9lJ5LggTNJZ!=3g+Xoh6ff_#^KI7zaclRcDu-kpd9#@%ap>&b;}wyxM=f&;rKp=<~HWDy)LXCf9d-F}um47qdKk98vSJj}$Q@ zTj)Qv#Znf^N2_&@9Nbjg^tn2wpRJ&YPcDQ_?graLHcfU=_3a3pyW4L}pgFH1X z7ZAx41R#U`i`5(!cpZZ%oD*W*&T;9pJTFhVPnzY1^{AyS>n{j=sii=M}7QF}mk zkSegqLbi>WsiCQhlNs9_sr&z&*OCLQ>hPMv|6uccoTG&7>#?(}f`%2zP!4B&$J;F79}fC= zj3}8#2t%Wd>>Dfb5vnu7KuvBcJK2lcLm>e2j>))dwEV5$ABqo zG-gmqthGi6XP^Wc-ARlr0HIAw}9k0}1YYyk^<73`BAyl)HD+U_MO zl^;1-5Og`)rsL`_K@oUA-*&cSxG+d^V|?ND=Y+Q#R5d@v#~pNjIGFJ$Uu>QZXN&Fr zIKaV!-K8D9+-^q?uD8E%GxTbVY zl^IO`EV0qUs|0Vctd^lqeF_(`R7hebNvn~fp5jL%7OXrpTZ&KZ!ZWB3IMD%&ew|`K zLXZ$w;b%4Jx2dSL7e7_Gp~Mh-s+=3k<6;Tie9VU*G{2<*>E&R*?t%}{ zRTdJwsaE#6?8MV>H_828UzHXU3t+@&$HS&XNL` zTaMb0O~}X@I$}Phb1RQ+{vmnF=E{aQe1fw747j)7rKudReXfi`*7i-`VBY$t%UD3; zy9QcwueGe`uw=mDoLsT8!hZ9U2AQt+Hs@-9(`s@(rSGO=n}(1#s`Z)Yxue6^y1*d&DcM|f#y;~lw8EGUD_&E44;&>p zp@bn|TwArrt|55SvQeRC$B*JuBd0YhO%s_^EDTU{&-$e@IhCyU{`5%ax1-&8)$NDh z?Ys84lM(6X9{9HGr=b+nkmmgby_s_8{$H#^|4noPN5&Naq#V9Y;OrJUl716;rq^E+yNfGC=ZeSs@zFu82P^%h^HwwWK?Fl)Oy*&Kfd9d z#j@7k;Jfx*=RL6br$&N&yS$wL#l7_V_6ha+{(OFju`7V8eSv!JiSBsm(3{p@xQ6xd zt>P;+9|!hn6F?_#zb$q$Nxz!(7F>AWih>l%7)~8ket;^DtGxxCkwq`T{kL1eSqUr-i;Po#^w|{#b&Rim+^slX;SeA{yJkTXKYUMM@hE(vW)hymvgQ}{kz8+(z zkUV!wZG#Z53W>Xd19=EJUNulvD~(md{7gt7i1fGqD*Y_?!5b0Rtv_y1U41)x_)@=? zYw87a#DjarzF~>Av+-+awla{wCH2M{)*;K(Z3deytM+xmYle&P^==Z-3 zNv;}LoUHxV712D5I2xNc>nV_QM)+t0RRHW^=ecEu5+YbwjW(?16vDraFu)RtU=4&w zV(3vU(H1gBR4|7#j-XIctE*tx8+rO1gcTqOT&Mh;RtJ>}W``Ao*RVE@P!8J-asU;K zMu(%FLO8eH5jqzVM%^Qyv#Y_=;K*5W6OaNpdoZJ`oz%=oZ7!?iuFH28=p05WaerC) z@Tv~YSyeBy=I!@fh8rP>4t3eC;Y0bqG5kJEc7D3Op75b^dR}@a)yHKj%&i<{M8b+= zf&?M%3DmL^v{}ufbGH4&9xJM%|HgM>b5&7JJ>bpEWi>zNZW&fX_ZzCJPqLvkDA6}J ztM@yP8Rp`!JIH0GZOyciwdVJewIdcn+Toa7{EZ*^6DEOxxMwx~NqvxI1DtI`oSmFM%~n@EH(_G%bEV%wCLlB?)ppF4; zWJQBQ*`8O$WZRr#QAJw+sFBgkB)`F?xWT5pLH4Jmt$j}NXDr{2^D(Qd3{!I*U>?y8 zt_`}J8~cQ7C1B2IiLs42?=-EsmmJU)IwE;>Jzpj24T`?*hT0p2_Nx23fU1$FR5fBR zJhTDSRuK|pWrJ9cKHR~=KgIO@Jg7n6o;K6Zp=ZEx5D^Bw4$r)OYlr_*x9ewQ zMX&oOU}OKo;-zNAdEggQv1s*f#I<|pPiKG|czoCM^0ITS>+|!~(ZXLHIgyn|);?&$ z6QmoHjBYePhD#Qux7|P^sx>-p_(dsOCecz~+fi^`5J7lKB6BQ`ZV-k@HVuLtpMF7e z&lD*tl_2Y;RLun3S1N6VNJj%S2s!NV*Wb4)Qa`z?51_oGau1r~K;-KVWlvu`Xu!SY zTt+;CvXa?I7KE?7Zdgfobv`{Ny9uROcz!L^ulwt6;Ki#keb}Gnh>Rqg5Cm5-oj7O@ zperBhNZ;a;K*1&=Y**1AQ=B6&--}q}%D@pX40OKB@IvqrtbY%pnO&e%9}DQfAAq=Q zaFciITBRL9W85!fK;>#s6l|8vLh0#@I`+{)t81cuSaVm*5!Wgw-_%rbfv-Vds8k2p zrTFLruNdRZ3rJe(#^(TcViNWykDhs2uOVnTLNQC+0B_1rE3HSnYgZdRm?|AFB+Uff zQ6s{qLVL(3B2wuQkXz|5AWi8_kH^c4-M4BmhEv*Grm1QWMDrFftpB0krIV=t82p-j zOq5B#OFzD-#To(zRCez6_tR91UbS=5%?(?6NtNg)Qmjh&LNUPU62P~;0M9&G9kK;k zfWZwm@goL$pKigF6ExVf%*~vwXE7`s89!rg?8~SPITbclq|dbs)@nMMs-}x1+cXKi zgIAgfs}SIbXUpn<Vs$b~PMxY7WF;C+o@^IU>tWrrmkE4M;(1Z)5$MKzks_?dCn#V>x3XS-n)GUyEv1HavaZOv?1teN1 zv=_>68o)lg!Ndtyi8A}+SI*6HL5_I)&=3n^48DakHZRix8Ggm(>nYafX1+6oU_e4cFTfJ`0M=-u}Bb zX}n-*JW%}Z=PVo(s{$l@g@qX=QrXlask133f z_Qk|cuQ9Pey5x&3(m`Di^P;{E_3!H7zu|`D>+M7xGCPW=+3MLUJ1H_u>x98G{n!&* z^hX1jertT$@)u`3=r1_(NwEcGTIG-PAc|!BVi5i2Cc@6!aHFTE*5{Uqp%?3O4y8SGFObSS zx&@6Oqa`jTIYvktV%$~D7nYW(6jQQG%>+=N&L|7{LM&dmJ|iBg9bW^};9CxnW+0y; z_Lf=N&@X*e4a6lEV3q*mo4(|`KyIKVcn$g*6bTzuDCpl*=6Vy#eUR*od9u(Y0zH$u zlu)I54$$tw9RVxzH7HiHHs@Zv_u&mbZz^;j9>ycNGyYaw6YIU9w|!dM9!E55yXhN1TWP--e*Ox?H9 zrbttSt2gCqTkU0~j4Q@+J4G8gP#Ed$#NQ$~KOLB&KMfthMJOt`xC)bU4zuG**%Zsl^e)zKxbOO3CtXR0{)hEajRV`(kJLALpJ2&c05_);XSMTfS z+3BN2FFyC1T_eR38cKB6f9Ii0MYT`9!)>OoJNi;^^vRJ5y_WaT{oe3XQe4bsoN~jw zRDeIgR~1Mo2VH4(@DIxa&?ePIaCz+Xn?Uj}tq0VP?AgXxiJQK}5m0M+7VP_-@zp36 zGhmBaSW?8p>T>Kv!oO)Q4X&fI_jZ zA%%2qz|bxW8DO%dSXK8$!S5!00*)!&lShWpy{&Am9|*`R4IL{Nar4s50?bC?lID2aP&0Tlb=I4^i}#n^^Jf- zpUzrA3kt`sf7%nPpPj}8XFc7a>i(vBDE9Dudx==7Uw&N}$PSH^!)WBm7c0nDubkDxlXPV6DeeV3moKXLq%+MBTE6fpS6 z$QB_Q8XCuzaKiO*5&9O;kDi*zi0fLmaj_ZVK1s1#i85-3_D;1U(>=xQL;j$i{-A@e zm%AH6U|<*>I^x&$tzl9i$M@rfAl})-ggkgVWiq;W$>3e;!`{^13HIjEEfoLFsyG$S zJz7uYNF=o`2lFZqELb9){i?S_Qc&!`snYzc30M_E*(_*uH2Ml~d|m|)k762p{P9!V za^4T3pmMkaSsq4!vOZ8bfqQ;n1iG$8tJ*n#RizvpQXx2pknwDpAjL@&5eBBcZ=9;- zEXc3q)LFpOHv|I&h$1qK1vKNKHLQ=#tgQlGqwv}}Rckley5wW!xRmI0)Lujvp0z=V zVU@l#LT{^8FSY-lJSk|2Oc{P^xP8E{zBoMzv*>@3`oRx}1R}|cIwY#WEkiob;>ITq z9D^Z(g0<$aE#MVcAoVr+05SDg;vCWb6TOb;L*hZGt_WD-qEJC`j(>wBK&ohn%_YI6 z2ayBg|DKUGK4u&hykqjOfT+33Qp-~RL?cRJ)lYHsS`4rD8K`p<-*yp79&C1QQ;quy zBcuTqWJilgFE|dSAZKe(1xy--0N|MY5tz-3#vHv02wSELic4}qV-|@}6|%xOg#nHN z(rsZj7FKjkiO)7M9scREzLs| zY6*gR^S0wdfC-T$$KcczBRAZIV(iQ3bX4BE=rbC(Aafr(6CJHROK@_M{jDqrRYfgK zX6hpSgB?sLY6~HSlI>tBBx)ynr=Wgl=Q2581FJ(fK(0C`t^Ss#V|lv@(7iV zs)iz=cs?@Dc!BhUtgQ3C9igJ2vA(8M8w!)buVCB(C$52hslVW!>rL#4x}|=+>dKJ@ zt5~`|?5w_0rF={adXnkSAWJx#fu*T-Y5gRonyq71lTUpx--b}8ZT?KlEV;HhGo3SK z%fg792Y`Gj{H_}f0+Cs#kVMKpDUjhi7NDYRd~I)ZnenMCX(kt8qRGa$A@!-vQW6w< z6Hwz2(Bl%&;}MYalaL;RGgtbL3$gTj)~5u<|%*i1ZUhybQh#kj(oVa{2y1=@oiM1A)WNX+1vH?W~XoifC11O0M+A1}OruMKnT0rN22ncbB75G1>Y^8q4zZG}jk1ZC zzm;@=$p(=Ko8*v6qKdW>y`c+mXn8~!pcVL^1h2u}Zo^cSoKi!Z?2*A_%q*FHgf$YF z|9Fd7SwTlu7DY=|mPJoi_8)ht7a9Zu3JdCZ1McNgbkM&rkjRvWXcf_-_HS`KDi~ZoOGQKKU`017(_)@k zcIvTnkgKSaD?$z9YKC`wxqt2-9KN4!_j|_i{IU<$5Y<8o2e>6qQj{*lngWxmLxl zW;I?Nt7m4;8CTZuXtRxH04`zcJ-}*1y4lRNBo>Fx)47c%8QVv@jUKaxkTUqu^^GC* znXzxB^ihct$^zK9+8+*g?%G-f4;Q}fv&`LkWfR*{0r@;-u{}IJPhdeqkU4N-YIg8+ zJKt8!ay#F`;1G26;C_6=**6D5Rl5fDOc6k0-6^SPSo(fAyTA8u_b2Fk-rhgBIAib5 z15)dI$@yDq9bu!mJmTW_$!jE2DrqIhiN5w+%d@Xd^4TcxctCGlP)zs4%?#oYHM7v7 zB1x*z<0mMPD5YFI%#WyuEBS1uk`1jAl2WTAvGxNj5A{6vgzON57$I(j)I)~`3i0E` z%7v<{0iE8ZB<#`6P%(d$tvP zz!ygTjG*6CZ?tF6<*D|w)VZgdD7fAa?`lzvoGleVM~#YRpmdknm(9jj%khG&t8{7p z)Jbu%&+;0NEus z%JUeKC<+-_aoX0PDgTZ`W-xuClfYn0;f=TiQf%Ku!72{{y><$@G2>wS`IqfTD|mwF zxJ&X<6*PSr6!m-)N4Ym9rv0*O8{?h)`j9wJXiKb4AwO1rs@bZK>XZ}FkP z@Wx;xTHc(?jaup^dn&e7M`QC_f6&Huu+X}}kADTSt6(KP>(7jR|BC|)MBqR+MBBN# zJIz~l=9{tU9;>Z97PP;{kt_}?^PK6=Y;{a#onkAd5%)204Y{;~cfDDXDiptw1%p<& z105Y!ZMR4kT+^XZKC)*)x@0nSD&!O!U^#FF%D-12!~SP5D@=!WZ9^AB9!Qo5#Kc1y z1n~AUO_DGDAtvy`Kvdb@FOQ)a>8e#5^;Ltr+$r3PnDpb%(bh{5qxamg3$kTvz2U}Z zx^kX2)J&{L5~FOV!f*2-$O9uJv++08s>!?(Mm!hGQYX6pmwb`85GADKcb)SKyj9x`Z?f6h?LT~k$hkYd zpI0S*A9YBI2S~f3K-r|dQ-rT~23Ffn?dcS#**`m~b?1`FPhyjYUFRv9YW6mNge{)U zULW4vT$&dT2EM0jHKpq{ZHXI$Vo6hYqdy>Rq){33t6W^2jmid8wU*rd5WOz@S+Pbs z1XT_;DLgw+72KME%A0{Gi-Ho98U}5!TP`D4S0;2sZQS@C?fv25*3CN{ zmt_+e52@PS4KkyQJn3sz$zY?7d3D@v!I?#2J10MP z;a(qggIj-)ybd|v!2`(;l2hYe!2n^)RKrxs(J6I$AYS}flwYAmf8#M@F~_B zLJucKjNO1yQkkxLAyBh{g?mK|KU-bAGF75fY7n>SZz*tA1X%y;cVaeJvbd6x)q^vg z7t@_F%{kf5!|g&(5Y=;PH|rSAVehsh1Gx>P_2zG(61ICk7@#B%YKFc~Z*`={KV@wr z%XVj~x9}$66c^j3|0IR53}7ty3zxN=37c19hikFW#ubsrZ^9Z|cPM zDo_7FQ8Sy~h6Vg_wjff*ve)LH8lJ0)J4uI)4oX~?kGCLMRNTf_N2tB7XnA{B6H-U5M=8g- z)8+>fxf9tH?U%N2X{i!N#Xwn-W0B9We@DM87e_T}c`wF1y*>j)IOq9|T+XgYdLH5L z0b^;cj-sCBVchL)K1&58UYYg3f!T5D5b6gD7Dpxgo$n`VI}a@)^TUK&&;EP+w2#Se z9!=gvdXK4xz6!^s57hMRc1vxqsygiVN~1KtkT}Ooe)Ru;(Z}-NyE@Ly!2Ev;6l+Px z;*7v{&(x$f05+ZXc>?z1L{Wri57r(Alah`aD<{W6c@Cu=qKbjZ=dkKjIgPN&?Cyocr$Xo;O z#ke1-IR|GKFPR!_ASrO_2t%C&9yh z_XnWp^Z}^TBOu|L#G6Y-e{3es9DT$j@uHd$P2+^XL?}$-RaB53MAk8O$P%SQw|woL zXrkMGhDz3HGL?p zcpG#m?R)k37{UJqTGYJksMh@a`+VQv1K#M3V_P1`14!&+Fb8FQc6!<5Y#V`j#Hokh z$%iGu-4}^u;WCe&^l#KaA}JpDQO20+B|%fi$cH9&rT~OCns?!hqCew}ojB`AD!`L1 zCkZ+g*&fG{@mN~#dp0~H*|XwCWa`dA&P`ucMYX9LjvZtWe=K;5IdyVnuo~YJvB8NW zU%SN#oeD23<{W46B$4KRw}wa#zsT`*>6aj3XX<@{r`C|u#4|MDK>XL```YRGwTJKL z^Rf5Q%FUmp`r{eMzImMd$Lw^cjsZry#hT8I&s+5<{1edyh zLW4xb0}ynhR~)t>0clqL&fwoJ#vb4#glkx`NJB$8p_yJ9$O9X?4&D28|15Oi@385N z+ps_IfnE)cwHvEJ5EQKqTTxCbMpVh)2a0LQmpI$(d;6{O@ad4=L*U&6hz-NTQHqx4 zomkb98ikF84T}G4#-)t4H#3#?y#tKiNP*Tn3VDdf)BKGAD;?m#%AbkMDD$O^OS>Db zScYm#yjbC6)3UUL+$kHb5>=07uF{`jq=sGe$|iLnPt@I41dvT@5wST7U8d=19bm`6 z#_&`Qq(Lif7PF}ISPA$>b0*7pQ~U!#dq%fn>-jx~bJ=jkUY{5iDD3AAk(5Rq&P1 zAudsG>S{-dlY!|^zZ{T8`MC3DOrqQj9agfmffc1Gzot zgZs~@1KXEY>-KsrlanSt6+5TO>_py;8b-OAUGu)Ba6!yMk}`161H0g^(z`%LtIDRA(P|2q2{zE z@J7P013W#Af@rT^X1B1DQ**0qr@mqjtU*paCB3aA-TLSnI5xJ`JJ|jZNS*zT8Gw1P ztjnN5cJRn+l7pZ7v#lM!ZwWoL5%nYVFeSc-Xqhhxw$v0Jy2jxFtcyN?{n<&wcGJVuE zyl^VLMkov#x4v0_&?}LERO1y}>!V&%nvhQ#U|%wNJJs-%YC5GQLd|AR0Vf+<&e?sF zij$NgZ|2b1?>Whos?0K+^ycU+$L7hfAJnl@KBPkEUgD!aHdkg(x?Oo*nl6CKwn*Y+ zlYrKeVuZ(lC1JSD{P+Axs$JZ9{KF~al*uxBq|;AHu_EWvdJpSV1>Iwk;9KXM^5MB= zDy-NL0V|;>O=Z=2E2UXr$|>D)M^|D*b;>mhsasPfy!)$YhP@mkX_n<48fd_ZYp@v> z+5x|_Q~F;#RoTU!U5s4x*q49bfNQX^+jln@AbpWZ88YV`N;`J3*FbwTa!>;d`oJG> z(1e|e zzbA@pDyf3RY=Lf@B;TAgtbFJhHN3j=Ng2wzxEOA;*y0$u7zWj4@BT5>1zlK?z17(= zC)C)AyTkA%qUa+p05MhOf|Et}uIboipK!X(HtKV`=A;p`&oHQ4>xdfCEvWlXgz)4U z>jL}Z?$_ZXpn1c1YN|CvQEI6Q(^w6jYH0)+D2g}zi0JFpz1FGt+kGih--0qVqI|4c zM-96Z)^H*%5Zl`c6ExXHQY;0e$Iiv17nY(`t1GapMD^G;AKK^Ip}Ut8cdcXt<&%o@ z9eG{{e^W>T&wF1pbOc#FYM;fV?yV!~KdxZ>x}rxz~})K7UIQDj?%86&KZe42#j7QhXp)h@5W z?zfP)v3PF>OM)D87O~Nj%kGyk z({vwvVlf3GDFd)oM8Y4ZTb&gY(iF4c7*^5$cynCs@_Vt53C$~fSc!#=p|AE@X05~vY`{X!zfQ&a_i{}2vULfXt2g8a{1MT(3sInlV>{~s|Kest21 zdHFJ)UGQZx|Ft{yF$VB!Q)WjVY~dxb@7|XQ^JI5JQaLFMDJ|r;)8(A6v#g@wM;iI2 zvWl}aXV=PErs^{EE-!ljGcn}C1>ND2gpp=tj^jw@E8F$s6>1}*`u~_LwG?!5>RGpb zfan_6JU0qntth2!^`v)1`NFte)qJO5taeAjxUP$WO>~T^S9fY^?}&o!xWyAb>KH?G zM#>CxJ{rtJkro7*=vOJ+>QEhLxFx|*sO~N{9V$B>?_#PLU8D)UZ40Q<)5oA5OM)rswSYHr}I9wdkK1Q}RWwgubHPo6m z3?3`c-2|Bh(uunClU0j+v})g)RQ{9b_YEDZ;nMtHlnDPlA_@~HE6e}+ALuKsjhKy5 zM4uJ4)3v{6=h9E0495nD?yn}shG~~@fb*Fb3V8w+e&X>ItBWi&H6t1p-8JsTMs64xvcZS zZ^6u%$|p&tBp0SoKB0$(?zCXVoLCeOIIZ+SbQVmscI=#KHKIxXXGQ3-T)7lzAFV-8 z*DcS7fvd?v8=vbaNicDpDoyU~RA`mRRX~>LufHvm*ff5i9q1)D?yP%@$-miGuqd@8 z@dj#U4u(*(N7n-~H`7HxY$Db)w*rsM3@3pGS}2WMClY!fC9KsXxN+`_1ySc+;qgdg z);V6$O7b1cl+B%gM>0y>t8^R})&%h^L*|^$(s4ILq0SUOhGrlLC3pkH0%FJ@hc5ed zLSUoOFsK8=GCt$GFc=Abm9p0BaGd*pwPa|gx@B#S|11Zz{R)}3lAu!y76ToM@K-tA zvboL`YmoA$Wq8cbH&_>_M@0m2Ub*Netq8`GfA67R{h~1-%zmYt=!#t`3q=szU zAZVqNh*3~X-bE;%H^Zs~%K8Tc8AHV)t^(8WcVai--+n=!a-W^{w{PeF{@)b}w?^^h=Kj#LGCNPd60ZnijT-1(kn*RK|2lcs56 z+nCw%Jtm#rWhD&`B6?F1kPyH2MQEgyDoumB8V;;Hr=QRCiKai9M8Y-OcDbDNcBe}= zx(m2;u0=1D{WcVdd&Mk{F5@HwMIiKcL}UPaAx)z5MJ+-hKvoM7wGwsELeE;&8i9qN>XfxCyZiJeZ?SQ7<7mQv z^)P<~PSIE1heYS7Q#^FE9a(seKA$*qt%6^~5}aGY@ho;I-6I{dzqkv+T}FcCD@vw1)%(WP$lTo3Qqf6V~~#{<*(43v(BnQMR)16 zRa49!XmTGN3WOW_4DVBYI!CGat1?r)L_N!rUtz*_lId+qo4a=(EH{BA9I3AnLPhY{ zVD)ubaEdz7Nk_+tmE-vRo;A}X1n54d#8s_C;6V&>6e4Cp%f?eQWib(^Uq#?#y+j4g zA4?-q@eR2Qu>jrtPw!L_Ku*ga#0J$+5oLmB8kN7oaIP|o7VX!ea&?*QJtc7Z7I^0o|Mn;^ z@Z+9LECgfb>q|52%(!4Ie_!RH%#EE)NcPq>Nrc$uL&2q8>C?{Eiz=VYDli)yPn3bo z1i5FmuDlBdVZgSGO+X*6TnB<^QnvE8sSo*_bYny1G#qz#yk-ezo;qG+7L|Gz2St2m zhxWtgdqkpG3IIX`O=uLtiY|C${xSvFsZe`DgvL-uMj~Ky_LHWTkl~9$L_@eW;8{-p zBh&qE#`IjtC^^c-NwWTVMllIL<(c4B0#5q+gNUPM5L1O{^qScBDLN?5s>CRAG|kbC z(gT=P;H}yBW3fon+{^nk5tfu-x&W*JR;LtMh7SohSkadA6$3 z3qKfFrK}m--tTGh9o`=$3hQ#*?-A9|g2uh?Y4U5U)O)UTj zlcaZXTpTs*7p8ZzNVB_Wze@JHxg;lp!)^f@Qf437)dK7o8{}F2OoDcrWbQcZHhb>;7fkGj6q+sz`z$-xDLcg( zW^D?mV()y^z?S2eYI}F(k#Xi<>BU{StOBLdUNy(J?%wWZTheDyiob2E;>AU`+Bk44 zu;uXaZ2Pdk^~(T1--18GtY|qn)}ucI_IuboOMQ&JB53kz4{C!YYx?Q(`B*p}n&JO> z|Ahq~EtBIA>6DjsZE(*ui-o(M?unU1)@&E6V`)*vC%-O;VM;BF(wupKO1WIg*z5JcuHuUx4(LRD16yl5e0l-7O$9-JF`tZdp zo(MF%>Wj6ef3Yf3%Y17#BF_JFHIFYoX7q!F3}tLFWZ29d_3;qw!iwqM9t82G*iY~R+zu+!h0I!UDF%!5j?^CaKzFy1?OA0&n z?N8a{pFw@wM`KijotNExxP1c}U>Oh!&HD2yvZ>ib5>@+Iq*_a0uLSb6QTGtl7j47M zqRueNt5lwath3H=i6VuCqNll0;}rv`=WGav(z>I)T3!xL*b_-J^p%15Vlt7?MqIh2 zwbs&m`)GA;*b_N~j@_}sUw(Qvv6^tkJW4=qX@;l{P%W_E08#RGs;VOL#HxFmvG&M~ z$7gDB(^wBV$3Ln}6DiRQ7kl@=^(=GY=XS-F;V28g-vZ5&rHu4XQ*fJNo4Og@9l=iF zgncG^24$W^Sghs7yzV0v%}mR);0@P?GRD9w%vxZ*Z%|6ex!ftDIyYtn{A9LaGB6q~ zBrr`#g_}iI`n}!0-}H2vz4+Kf8UerL2Q(L^zz)f>iuNNBz|Z`y>fe>P^*YAy9eG(@ z5`I4jUzF661sZ<){XW^>eHk(J5HM(8O~P(H-^B`&ElhMzzSCh8D)4$WTw5GA=ya50 z#AD6mrlkv0OPccx@vAK#bC7Owk`s##>oPpwkOQ7$2~Im5 z>&4vsZ87zGC80Pw&+h9?`lJVFD>3kPAu9_)}0sr zxD?*|dd@kkF20sV7KRP?6TNyc-N6pIyv#rs9wlXz?ZY;(~3Q%^{HGRkp{jZ+fZd- zm3_plu(;_YM%7$wpuG-W+vzEn zr1nZa_2TJuQ7lloDzpoy@#YVuGMf*)*#3Mf-ihp9x`s6H*IZD4B!Bm?(E493*XnV6 z&Hvnu>^+QJ-I_e?^NZQ^z~HCyj*Q9pe4*#q7sSq1 zbNV)z)4E?RX_d!28Th_r*39awYfy!jQmo^xfv%>R3+7;hg@Z-xj5RgU5Y#=Ekw+_^ z8)YKr4gJfF^Gf@GAK*1TuT*NG~D6KM|U<@IRHB*&u zOe|-ef^dVa2Y;(Dv9)ZC0&14Y-MRq?!U*vcfPy!cqDB$2%DXm8mNQCsbvJ50Dq5*& z9NI1!P$p>^s0buAAtOFi1}vXPeT&IL4DtdMNRm1Oy1~p8?K=NXj3RDbbNES}WzeB6 zSUFSzwIVWae?`++6-p{dBvVP8h$AEfF|pKWt-=JmPWHT{!PVB6&u$1Nv_CN1UJU@% z6;#1sB#)aKAuF0I?4Ba23CTgIbQY7yE;xDJ0}gQwvG5;;Ll{(|uu3aVK|g5=I;_KF zW!Wf*Qe9^lRd$u~iA*9C#ibZ$Tp0?29JEd=RsjlSV0##^g!JQ+QC0-9Kxqfi7R zlggv?_8UQbplE8eK;V`12;?5Jm z(c}TlF%vokZGN*wkGI9Z$x#*k3BO7AxYdkR{QqO@9iv1Enk~`Owr$(CZQHhOcb~Rx z+qP}n?mlh%^*8suH8bnoANOZft;)=Z%8JU|6+1Qzf#he7?vyo)(TQN9xhnN^cYZ&k zyZ4~1Q5rkqiF)$95!PtYAocb_DbBKY9wH!m!lM}*%naT@0H=VQ6RWN*o7?nqB$}OW zub1d)OE*SlZ>_*CrX}anb?)=Y%SkF0B2M&DP4q_pn|YgZSr#X1H08MKg2G^&aqrLN zQ|Aj^S(9|bU>Scjz#n@siT>s32R1+MpJr-+EMBVw2#LQlq!@{M_kku}6X~}94D6h3Odv0KZVM7b2@jH=5AO)qas6#Gi9e8` zv$K+rNUsAY3m=T3{7Zof!uGKQ!XZhU3>4(kJjZH#BEGLYl;B12fstQjh3c*i;!A^Q z$pi0X-|zBcZHk2pleBrLsD0qi$JEjBL3(e!Iy;G;k`qrta<789%yg5$$( znF56dBw8Fic^FEgn3WWbM`dPa&)YEf(gRt|)_l=w-0BBZ`ApicUu!f%d*W;uef{8o z*lEVkZ~Oc~$-=0|o3 zcG9@zLu*7F`=@?5B*=n%V|?mkJpWwWm6cRbN?R`M*>W-RJqN;8Ez^@<>~G=1|H=~t z8W^56%>yKGW<#qhn4K|sE4X2{k({?6Qi;i}YFN12a3!iMzlCkqDf{=d)@O;d&FX6G zDsi1=K#&_$E|p0rtHI9nA^klkZ#Oj9P&kd!70!+f3glryO**5WKq&r3eJG)1(9^5v z(0Nule+4B2Z1t=`dIo&&cxKVIH1lpEiF>8}P&FxNTw;<oHm}f`tLaCftgghXEfoM_gNtfBFhh&9<*es0errpD$E9zk(}uxh!Nndb;U?6ZDpW-htpr#MgL zh-c;PDN}TBm(u28*z{<0M&PXdN5Xz=CYu*e`BiMM^<#>!@3(_c$cAt;jHrztuU*gP zXVU;}rrYa7{FiwUCEhI%p>O*^>KMM>zNkA;;;jaw>#uydUe^bQ!_i*!BCMy_gh_DZDvv3D)vC~wBQg& zm4v`@!=dQJDq-gM)W)!Sol1b_<$?pz@g-^K_ylC%l}UIr?Xgvgm!6r?Hp;nGHqcTL zA^Jv-wEtz>NHN-GVZAgETc)*({c;)7Q(fN7?2_Vr+rk?9;FM!3)+7$$4tc&!sv!*( zwOe~#)%6z)OYy z{FQw+bd)WrS_eijFy|quP3Mu7MoH%QDq+|-M2AcjWP9^krBwU;H07VxRFajBq*@VM zpX!k)^Xw;n=RH%Jr)*Cm9-ja@ypBP(D*?l~1nn>PtV^GC*>w zRlf|hpE_+`O4_QipRQ=;wCY%Iu?B-T)|^(i_C2&jhG=04?|5cZwZgy423t)SKkRl@z@+1ps^(u*#WGBwiMj| z&!rleDP`2EF|8F#)aa?r6|em*pskh;DBD!`W7L9d>KXN#Ec{#G)TD7XW=hB4Ykg*& zWqN5WAumU5ueKE)lOhF1J zWWYodP;*XC%^U#4wSCxY_z-380gxI%6)*C&s z*i43)U=nT*xT?N9kpN0ttkAC$_m`a3wRFsf4Lelx1PA8HGwkAb2`6Z~;>}B{C7qBK z<@)D4=PH)G#YlHI?UBwyZpF2VAQsHZnkctXldk$V`RXRr^8teu(=Vg4zifjdT_Gsw zP2_W9HiLD$fOb0%?rtR`T`{~)VO&Rd5xgR5vg!gX9R&;rd?|Ho|2 z|Co*H{-E1b7W$>S{Tviv7CIWBM-c^xcW|`eX<^p(d$-4!V8(%Ee`#ihh8k$kA>-}i z;|fixYX`ccMY}Mg^8Y%u1qrQ*Tz1l8ux1zIcHG- z2kIRrvc@%aAhIe%ThqsE6_Mtq9-Kv6IAC4C7W%PXFv+#Tk8lGUY43zoXB!n%)hqN$ zxqrcER~64hd_T|5)Hq0AJ0Ygfg8ITZzBU{L#FcQ6?uoO&H$(R^9o88|J}+mcn@S-w|GD1r5#6o42Wr}tLKz%-YVN` zruq~$L{$lVEwL+EL;7{u-dXyMCWtOtknV1&CEd}siu=kYPj2t-*}JQ;^CKZ>42Gx7 z*;m+f=FRtaDqYV<)=s^b-}>hV4QlYVnf}fJ9UDc$%d3iuhDO3qqtDOs$@Hq8-^cVz zx8rj7X|SG4A{-ffL!;)HL#->P*5?7wo8tO{FzTIIRZBmu4?y$shV1yBz>ulg$@kg? zw0ouO4#ivwri!MXYw>C0ri@a08_~^HyEpbj*vs)@9ADEUUW-5NZ~Dl@Xt&UB9<0z2477)ekM7^DldexC4&n?H|1Fx9Jx??`@a^TJS=b70uix z0lbKn3XNo2^tlWBxd{vqv}p-#jaxP@-$efT>)xKX!_L~CGf)}!>k-=h_1^X(IRTvm zi8rS?$e6ZoDv*mPkA0OWF%;O3j5;n>^c>DQ11p?s`5-rTsoQv%OZVRt!;+a&K~cQa z&pWLs-O z{{`Ea*{T-!dHo}Ut6X5V?W?yaed#l>{tz7WM7Uny7P&xV9Zdxbr8|(a8gsf%)3OzE z8k?Cq-a!5FVE)bZR{=YR)q5Fa=CMqdL>ruLGCa115_h7@Vc4KQvd#J3_GG#;j4whP z${R>+(P5_$Iq=G22Us)Nj(_5&=IXg{I`U&^kC#;FgFB0cj*`7lMI5T5pEs>zFk&ze zZ63zro*?9GG&7TD<}-D0+rnYzYaK~1W=cT(ZbXyMlm(mi!drZWpwi6Au+v!YXRJCN zbxuXRQYqTuiTdU?iLV!T)^)P2zGj=Rnc$`GJe-H5cnAho441EBa&sWc2CAiaYBs`(CF;-ylp4*kJHbG)~T~LriC=$+C@b!UN+s{6;o#=?Eh{@;+ z%H3O3bU;w?^;Xv@(80|$;{K- z=Vof0Z^?S7^)A|S0s!eUI5q3i;saAy2FLd=$~Zt?Gvp=Fodxr`{!_y`8ZILJz!CmVk7urR04#1W$ybO zd*A@j<_;fr0;qKq9AmY&_Kq?bxZ{3!*^E0k%K_>jhCLm3(8_j%D-18UzH-F7sPv#s zDKC|lxdVzeB@EQ>dw+ZP`;N!2OSz@e)9)ii?&DeEuBg91 z^})gu95t|-vwvb?C3wnoymSfyG?9UYEt#|IaChYqQ~D0U-wIHYzFXSp@)$WIPDPM+ z(MDlZ<$e9A>!1(!y%2B<>f|v2j)nBJQQW*5^4s^hxxU;Q%YN5u-YBq%r4j9WQ|n z96M>q*YtpsunMsw+(hwO9AG;SR7K?&rcgeXK40hgwvxZ=*}oGfAI@$LP+`G6SeaB+ zky7Y*w_+|f({M6RxKAqCqLLVZ0B{@Y{`F^}T zd^8D@GxJ|P0Xx{{K0x8a-nH7_)U#|HAEX5aS<%G`m>pNSCF_m+9`+w<@pfpQ1u`(* z7iwI|nk(lpacn6hlcnGYWH=!{*aNBvJe|ECMvtGS-wc&B0J5+1Q(>FV)ltZneO`@~ z*qA2Fbz#m0xPm~gNM(T!V;<$-iYiQ%W0i!h_+^vEgi$i zcgc)6! z0pfnyOy^g{$43!hNCjXKkM#?P!KnLs0PH)pgy^U&ol;Lgeh`xm{J{Fio8mPPoTC3*Z*?Eav{jrSu5S(wia6nK2a2xw7F+(V z2=EeRSw9#+C1}AvE*D zd)40#JWKGb-0RD9m?rQ2dv0Xa^$1rOiX-=#eq>RD6q;kf<^ENLj`n+}yo#XoSa!k9 zYAQtJIjfznAHyZ?hVz(zU1jOOuFjnE0o&f~j$?BIK$~x<(Ny3F{18v9xKz&bAROkd zH=19@_U4ItP8D*zp7G90lT$G(3I6mWGjf+#r*Y(nyCigw^hN@?l8Z+!kq_-K?K`-s z`c+6#mJh{iw-ve9&W$;2eTw}X&};9N=l>riSpH}H07eG(|0_%!Yf8jox1#i{{s-4d zZlm*`0~?JX8AYJ>u%;1!ZGK-sBpm<2dlN_1Ag=5%WyW0>V1$v0kF9F;_Qui@k^{~a zL+&lYFWvWfs3)jS$;krE`Ki|8cd_KTg56dYMJqidbZ8 zjBHY6qM)X34Yi;A?4zfJGQwHiSPMao{<33ISWJ<$EaH}^O*N%4*swo2iK~>6LOD+8 zy+RcrxP`V)tsVhDQtGL{-xrDaOIdXXd%;4Rx$a$Bg9oXl9-r7@LY8<~oI^OyHf zR_jvLu^_3BfI<~Mk2kS;N+P0j5YYFHxq84Gx8OEG^l4G3$y!4-B1~`AU3b76g+ek~ z5{s3;WGFwvN3rv9P&1$Ulv3!*UapUZkGL>xQoWi4T+dH4@SrP;zc#JBpM|5Xpqa6h z!nC`5!FUl{2cEh4dz-!@cTMOpg`OPGw_7+Bm2kfxM6wuV@TX{U$}eD)Tt!0^qgooM zxFMQRRb2A~!%hyOqjcZ(50o*Z1IF@fT`99titEJ0+(ZdFww3f)Cvb@OSQ$8FI?Pmw ze>*I6T*R3A3CIldh$yBl80;W2-ej3?C=bevO5Boyq6W*SpL=2~R#0G$B*s7IWxMht z4;R%66_#|%3>BYd0#p^hSZ|6k%6j#XY86%`X*2Kqo|#t*kjw{Je4|U!^~~YNgOW;w zoM}t*0EMW5L&Vw#wJI4C?x%n-ELH*uh~}}!qGRl@lE`Thc3~f<#ksX4EImNxepinU zk6muxuUIoVJ-HO)602IJ3mzc=sUVa%(10&s2ehz?;>24#=xsI*rFn!| z=bL)E-5wtY!pDR{=%S(=2rN#7(F2JI9xX%CNT35k1YGHZ4iBHDy?j5L6M-&=m$L^i=Aq_J)hs_6BZ!_s!SE`MW9SMJaBDDIkN{8Q4&CGOctj-OApq0k%lV$ zbqXYD82fEuc$`l2Z0vNx9MjX$Ju!1yGSW8+1D9xr7{h39#D9+y5Z4pq(|F({941Tt z$lR*&YIA(I?e2ktQq{ikb;kVg_73Q@ShtKi=>3=!|ET754BC&Y?8$U`p&QB%MLp~U z^ifo#QspNR=0}tV?X8<2Vej*snzxe!mE4{SyhxFzS#O^V;{QpPrnAUJ23$6U0YN-NZgfNkaPtC7QsmG+wQT{hrh#(kbfIuUec zKqYFq-nth9=@SrLp-*toevQvXuV^1x{-tmuU*DZB7^bNG$em3uBthbX#m7Y-r&XCQ zo6Dkd)`@c={{zbr%_X15W;8G`jg5RecNPx`=)lpA8T*{kHq0Wi8cyezuABM_-!EHY z0SqQ$8X78kwI9HXi!!B%bc-)^dhv}uxnc8GJ{b$TejJI@#s=wv2p&sC{Flgc53k^TUul-(HD z-jm9&J{^Ir_CWQx@{tKc79sE`d%4Bp-E1g{%efIG@o9MMK6wJ`W|qphl1WX?$ba^l z`(^)deFa151{qr12;MW3?pH@|l#gqVX-cr90S-%EXu@0W5vu2Hda`)O8g7<*=r zjU-aBc{7XK5@Y+?*t6H`3?l`!dEDq2c?Rbm^L7~-4AKv_d#Z-u&Y;ay@K8Fj9zpPqe{I z=+g5HLsS*ZHe`cz0U$J?kOEci#&x#4ox4>|=MkEF+H33sapO2yv+Z~tDrK_}2z7qt zz9rp>8izuXej2MXKy$Gg*G2~?J!?O|Hc7sfM_vWyIE`VqIF(OqYo!w3s?0WegIrL$ zw{g_-55tEtN+v!n?l9Cs%s|^t)2ZlI$T?wbOn2Iyij%V~jZ)^~XxL`eisPl{3HyDX z?N-TJ)o1r0qAKc#rbhcq=~@n09u#3!Wm(9|PX2Gwu<4^>S&C%Z9Hj5d^D!J>&v@@3 zG??(@=U7C#bZnX2XJMdMl5x;LS)0PfsYH*iwiPr?<;DzHqL(+?r>A4F`Bg4~TH#hH z)b46Zr8DBc4E!F}2fw_%!P`+ygsAcFkKYuE+W7DS^z(ys=@^{2j z*A8DV(YVrw5suzKj&q677ng4x{Kq?|a>&xZ9NKz^Ax2(u!LXm+9)0Ih%>ko!`d%&A zvf%J~4z9wOJa}DWCADERKu3f!tHPAm{s|`PmxLcTuLg8WI*uVFPbUuUkxn#{>M|GQ zs|PxGD7v;lL6)3F7m^!{{$b7Fh8XEkDXRElUzo6p|5m;WhdufiLmr>5DTK;WHUdl- zrId{^QIcfl!5AvcI7tzA{4s97XNI zvVNjv-;hb}_3Wg7P=XR>5dwi@Ajo1{k#@8UMfx-9)6$#TD!4b_9uBd_9zKW3)gI#n z4=crp8pEPMGGOeLQQs{m^b5lI7fi2LVAEMKmYxawlPXTRMis@lJQ{$T-t&lcOccmN zT&xJ5&IybU?^c;Xn4$cHUsPggRls#G<;oHU!F4RF+;pwPjgX(g1IIYg_{xFjJ#@FP$^aHP-FPX zt2dpoFYEa=SyVTkIe)QVRDpeJUbJi};ZY8D5Ha3gCQ4{9_E41YGIwnjk_};eG3W@) z&Shyn+KOn8i^=0WYvqC9&>Vc!havI2X;@BjrT%VhLP zgiyZHvsFHb+PO;4A^oPTUWs+@hAS=(W4F7uGYvwull_G`WidVy8O9P&f9hsP4v=-{ zuvAG9i~ecig_j@WT3Xz31XkPU z!Cg3b8(_(XpLByuI=pWt+i!GSyCq?(p|W{%JbG2arcqLPSEr;e^Ut$v*B||c;)hc? zyxd3A&D3|*WvM2J6)YFABIc;d?HvwCZNCI5+?%JC=?Nzqu`tN56md(SOq2$ zAEtA>5HrYqITO2$Y($|M;7yxa{=&psTNM1j3NAW6$%eq0`gG`Zn*%Gvdv0F#ojAcX z0+Qa5NtG&Q-HB`&uG1aUC2X_0KX3medfB{3c2l}oMRu8O5na3 z!vNkKFCsNV)*l~S^1c(Le?E=d&Caq;THgI=*|e;e67$?R`em|G>49xn8gq@IB@Qn7 zpdQM;Lr=Uv9*V_|9p(CyuKF4oJjFce63b4&oUW0zQ_2NXyP3Y7Bu$2TAA~8&_xAF9 zTpo+0>QqIWl;adnML0gpdGl7veOO4^Av@07l67gL>)Q5uulxKir)CGg{A|$qO5sKm zJ~U)}zJZ8u@2vit;QT+!N@HQ7r~f|zsVkoK7~;|Bn&q31E8 zOZsO5s>%gAmOzrXpL*jgW960QLV#z1?GX&U4+}C< zJES%r@x5GEJ5!GEuU_BvaUS2F&sv;s#R~jq-SDs3((TqxJUac$YaH(%;hti^B)Ho_ zkXQRqxE<*lUQ@C}zCRlclS#tj=C2BbmL7m+;>x!`2PJT)I0=1nC_GB)uHh#hsi%EE zh=1@zM#B9KBXl*81V9+Taa7*nlUimazkXCz>BuZh{;SThjNn@yN=yI%9_e{e3+5=} znZ)}q*+h#A0zHrve2&GiZyoh@s?S%k-x99jNkiY4rYUt#BRd&Z8+;JQbEkboHjGoC zqz_;}24DggFZni1JK_Gg;YvF7D)8Z*Sx_8&0n}bNdJH-V=-}P01DEyL5%}RS)sEMpwW)P zqXPUfaN(nJ@)k*+kbGx6w$@p+F=>B75Hv9zp=Uk2R~O`D)j{w&N9+!avz36rO6h-O z6!>AqQ&mI2pXd>X$liaMaVkn5a-`NFkST7-Ih-Yc%>wx^i;Z<*rPHyHG(HW_&^%z;+$z zgcT7E-8A8-dkKHImy7((FO>=|oB`24gAkx&1G2wnnVEz|$RJX)02sPnHwMmfcg!ab z6uMCY#KmqRIJ`HS(}Pz3TI+X&sPz8eD0cDSRX`$q0C~13$X~!oNmtuNWAIF(%MgIj zz+{i;GZlt7M%2P~fX0EK?$qe)Bp9?~NEo?p;@N_IAK=~0311eE(=&3g2{X0@B1QZ6 zcItvl@7lryM2{kK=ER9f>gRA;I4|@F$N+Qq^WyCRiqm^lrz)|^ink45_$g|TiWI66 zNetyUh{4Ic7z`5A@H3UzfI@ga5z(55`AKXY}=-4M_&Mh zit;)Pj6AfUyrf9kHuIjBl!=7c3M`&lRLPZ{%_K~TD40E6$~*}rHGRQ<5e$H2L|^hZ z_nR?m$~?GyEtn5*x`f!@QW8*b82;XaoE$`Gou=fUB8t-g>Y$l&IZnZF(GejlX$>cG zXP6jkLv^SF`w*7^Xb+bF6#)2%SzmvpU{D;@`49Uo`AvShc!i8VeL3_PaQ*Ea3jP`W z6+(i;I#Cgvy{C0YlbHDHI2|&0XQ;LR5JLY5eR>?eu+bGs;iV^sZtVM%-<`0WIG9yM_MAo%%*Ic2m zxkg!Y1wW&22Fa%Ee!k}5weqe8>J&IjmhhrkB7=koDI>$GAf_<-27B#uvT~o%=9e58 z+Fsh9(L?;s*u-k(_bA$D3@$&M3@UoSzV~sN*Mi=`yx@Yz-#Lqza{r$>t6ID^jMpT_ zxt-~QP#C~fq=748S(8cLYG7%o9eHMKaRfxU<{;@ zIS2U2oq2et3c%gLH?ZT&H4wbRBM`=)2QuRDw1e!QH!`#ovR}!s$^=KUXdHNfTF1Ni zKq!-jmHWQnW}bR4(H0FN>;CE3?)|CrdbrZ-dHvkn-M_1PxxCJ`+eiC8W-8qo;4?*J z=j{`l9~C@&^?SMbY4dtmR`dIL@BFs!5164E5L?e-fWiygfAO8CV^sM3v%nKsQ|zw>_?LD6&ClJF+pb@8YRjz=eol92pb#D4FlbLvS`a(n_8UBw z-5kN`+ius-{f*!Iy&oq?zRxnh`v)RfNUqL`sA|M9Bo_=Nrbff10QRG%3jTogPy_p( zOoYCGk32!&X$fW>XB~HtQCjNh7oeQ!U;6Yt?xep%bod&kzMv0X^sVOV68NtUw^%23 z>Os=A^c44%23KI~0+f~u7lvfub{MF)RV?Q=JUK(q(jg>}jT10RtgEb6ElEav%1r95 zEkb?!!yB!1D>4F$bg8*t(x$b4&rlZX>9VY5uIm&pNTU7;@{Hi7VWod=ISxlx(8Dw6 zES2y^XBx|LiKhi&hCK$y1C-no23`}ktxJTRK#Bp)8$R-Hn)`)3k7fG1Vr*NCaD>GIK~}UeVRr0fE#F^l^iP>b_%B5xmxa!dH2_Gty zP-E-26<)+fua!1}_2k+{_iiW`#W^!)^2>3eB{0flO^gfQl*&;r^vx-y;azL<)0Y=S z%uQQeyl7OqM_^EP?B?_MPzXRhNYqS|+Wum*l%eXmgTY|jggc&bfHBpz6^nk?pgs~= zG>=G5S78NABVB@wq^ajVNNr^!B8Z5g2(<}KS#y~(93BrWX4ghRiZ#cjdwo07fbf~& zM3S51?9zT31B{l)+_(T!TM#jylaHYJ`Th*P+`K3@DK5i=|7`2^d_QOQvO*sZ6mTPN zT869Ue2(Lox@ek$sDh2MS9rKyAb-iz^i6>heymKf;GAMtJDHT}h}vsHO)}9D|8s%1{_uqBe8pgVJ2!gQFSpM;bgtm(LKdr^ALQ$r4pv`f!chZRG}FXU?{LLF^N4I%{H6FbB1XJA^U+q<0fgU@NG zD9SnCN|lk*U%pkf^3Hx}+YsZNK*T_+UK+dayQJ4*sbn8A+RSNR&0qS9M9ujq#z44L zLGTZj5F43w9UY7Cl^n$Lcy0Kz$!SNR(8|*0#o)B~h723)6Z&>dPJ*>ft-+{s+?ro# zc$nu9)-7eO#NPfyFl6e?Ff;ykHD3y~2x#WdoI7ew(89GaS#DU0qI}Y}6998LWIyd^ zUMHBG1Zlw)!J;g!#HKFKmT3Fh66%vk<6u+3=$Q(y93N>U{zALFO;f8{#Y#FT+D)YR z&t1ecm&}wYDNwY_$&K6T&mV=>kII;jj$c*00EEiUmrPG0NB9wSvpX>DPnJ zP$4DIqNt?uP3xpEDN!q(!ku_D2D?UOl>llv6?_>w_a__Rx8UK$M3!V+kar1p z)z-c78)guLVt+|V%EFY`3HIX@K{`LyD~e@zN{%vm9dhLIGTQg>)~m*SU6v&)h|`T5 zx(1m^3(irFB(jm9E4D_MofT%zjMy^Klh|oicQ}xZm4;Zhn&Ic8VT<&|%`mOE1B6rF zIh@VQ$)992)`Vu*uxQ#EQ(;tAVmuu=E_q~3j0zlGgqM^n@aZT3w|cTMHdyx%$FsM< zqnWq&%ejyC9jvi3-X7?1!r<{Bt9JqwW_meP7-=Hjf*_qgD*Z7&XkQfSfMQ4l}racRDRfvUi&$bQDDn8VTY^#YMlAq*au+MEKTgQvBiPspTw3 zltaSGw2cGue^uhRn`4yj6ocYnsr7oyLPy2 z3%0$=>gr24Qr!2c2?zCoQX7ZaM+9;-iA46^a9a&?!{ML>c0evxvj=7S4aW%oD5nIr zu8V=Uy}CA2yDRdUC$=Q&TTOKX2Z5+xGGuvbqTaGLY|2ki*vw5hlLNTC_UYlkoN;;O zjbBs`wWz1ssGpscp3X%=TInFWW-j!#KT_RsUJgyRGDHNXlcP1aS^K;Gu7sPXc$@z5 z#g!4~O7TRg(&;A1F*CP{+Y_z+NP6WBl$0NW(WHqINP%Z>cilP=l0lS`oQbpn@Gu z1TXE1i~@5^0S`DfMKFXX!^&3y2v>yxKuu&>HTol_eb+2-2#N&LBT0WLP!&0{On~#n zIqe@X#5S|e{aFCE2-hU-KBddxS7req47!cCn9oXm1}Apg{6yb1I}g`ATdw|V!M+;L z;qh4t)l+5V(Lw-GKxsC<)if%Kt;V+H*;gnW7uwed4-EOa;h7tcbgu^iXUnA<5BSnz zCoax4bN8jdUJK4C8PhWrMiQT^0uV?(nmG2ig}7_xpvU-GDM7b`zyHk5Z#+;>HbnEA z+bP6yOyCU;BcBw3UA9`!B(L3#d*C$z023&r*@Q+?+rC7R%2eJKHN8h|pr_Niw3gQk z7cysH?%G0P)4Psta{t#IGlB_s?h;UsS=$aXxx^2Jh*%jy#51R8MY;?H*XjUit={|A zo+4;pTy3ktQM9+I9IETw|Ga3ez1IJ|_$0*#6T@RL3|k<=5R&jA4Sh{v0~mX?0GD3B zJDvYokHtj}-YubQR5Pe(?fmX>7Df*1`1j!dU0sV6yiVxg5wG3d+0i6La&!CF7Hap{ zQ*mjvd~X|M#thhw&^@-X9lpF#0oVSuN9n8{j0U%>t?>&1w`=lE7N@&;th2n|;J3nD zv`H={>}CCS)9r-w(7#OMk2F*D;m2c=Se}`SM#)41bMW5)r)u@YI7$5Xux(AMpDmHW z#S!UpIQgvlV^i6*fkQb&I6rx{^WHv4mavOqkrV93S@3{2$fVoQG5KKR>uB_s zj^ULyxxM)z4|i=)vv+H|V;OdfiJ{AoYT(>ge^rKaff>W5mG5Rk?t6O1h?D!@vz%ds0J~qRU1-@&)RS$c6_SyChNWb!^WSM7i{g9 zdQ-Zc**pF7HhX@G_cBS>$@a72@H2UT__v*v@%ZEC&(tpv6C*vhg7?gNzq}Ee4eEm@2t-%FmU8gULhG92R zS%jLig8L7F`4=t4-+q)2@XajL|2*AZ^Xu5BclnMVxrM2bEzjSj^1)t=_4fWa?uAK; zae~T>?$U+f!S!y>jSOOa_8|327Eac_-XiGLydqkkrmkw6mC~K9;E~EAJF$INv|WCJ z#>TbZqFrb9YQs$h_R?&V!F~}ubm5jTyxNi8R#Lag$8{h#HA0Yz$4f7~NiB_Z*RK4u zc7QHZlomLNrGh|r5aATeZ-xFLaGjt!gl<(~&W0Qxb$6~IVm5#fc%)(yZxQKHJ(@c| zllHeYL5{K;0}e@65vCZ@1=lWH4bmH?P?j?Uw*^11I7!YF$sd@kX9@9PMHP2ehf7%v zf!qQ8PT&q1g9>hMXjhAVqTKA#zJ5_hmCGv(?^v7wy=0KkRRjK8t8+>`j&;4?iJxKN z1NkIiKjD^AB^k~^FHlJ<6C9quXa$F>$n2FO(bV6^O1Jb`vET3(!oB{jsI6tCbm_+g zK?VI*kvnKLu^~HbTwfP4eDj=cO-sh^IsFQz;t$|aQazyk;IBcyC>s@zWYl>?Jbf8V zno>+RZE4D1W)=!jSLE;@Y#alNq%0F{RWbqrt3LaLRdG<3(XKGPRVKMNB~7lpnfKGC zo;l3v8`yl|V}w$yVuUJ>*-2hq8DG-UBweChl1?s?nqE1_605B-`mw@Y(;Qm~bEFB? zz9L-H5^oi?v}WXRelUK`QS*wTnJ=W4aa#d_7V#Y(&L>1u@ZYt-e_9LLNqRy=2=34rxL+Gr-jnDof!RI33} z(pddFRNX{f>&QyvnJSV|ecU`)U*I<6Rp1s1mvgd8s_r<{z0p#)T_b7CI-(#s8uh0) zR~F<=QqpRoiFDVEYs)`?Fd2Tcj0seNw{U=)J@ozGl>iNiLKF5QV16f8&)3uK#czSr z&(G0W_Gn)&-0vq$xPiq|-QE$t79!i+yJX2s=+++}?~j+kO1qx7@6OzbNhiEw=>fIo z9;1&AoXpdFHaSYC&rh1m26d_W`ZeDTawO?Ws1&Nuz(FI0u&OEQSdFCm?t+KC^CMd3 zjT~BE{9;kZ8LH&J+&W{iKqTHB!MuYZvhoZZQPz7BrNTy-{e`6l+= z4iv{#K(Kb>=7dJgjHHvV4{*C*j}L5O$EFx^-No(^aVGd|IRtfui)%``%TaGstS@zx{t!(^#3zRHUmJ7x%_vGP7=VBU!Vd_)*$ zi9|&%M_zD=mc_E6$S__;Gc65Yj}Ga)q!3#k@8WXjPe=v9wZ5<6xtwh(tSL*ADZFZ* zrEqNL#O82a_be#s ze>4)cfoMZ?gPny|oXg#FnFj-WPr1*_Sia&s~J=Pq6)W~Cl(L4T0aSrln)g5p=n?Ac4kod@}mxFB& z1`n%{BHJ_jpug4k-iH~-dk&cm$U^Ds9h_F;N&10k;M#Lmk2TZ4pJIG7|0!hFRg`Mg zvghREczK6_V!(W3GMX)|$Qvbfz0Ncq9|0s42NA`Qb3lLbCzv~6WuZsz01g#QM#7Ot zB(amODld1!)ZNF@Cx665FA&izb8!SjH~h!HN}${)Uxq@D><9uKG8LmLx}TC%Z!6a) z&x`~eiNJcL?oV)Ttinq#kNsxX5OY5RJhX>iD7aEM zNVumwFWgcilpZgPl`qW&F1FrKsLi5l7kuJ3}WvU+8X?}}$x_Z^a;*ypec(wXWXU3q#| zo@aX)njr@dvgIy*rGH7w7EVDl-n;O@$i&8J2#mIKynR)q+q@b2OHd|HitXRcv3qEH zbUFEMpTcn1ynU)Iqq3a<0ZrSQ_Ag_&y_p_*FE3Bw&M&9)t}Lem?pbsM`LnT8|GMz` z${NTgezqYYkK!J?0R%P*Ncg4)8LqqD!d<>O{VY)2P#5rAh@#FK^gVY`V3`d$J*>wY*TS z0`ODhJeA<)@?MU+ucM}^GGJEZL? zO+n@xVJ(&qQ9{i5R>!>OU2B1hPHM~gcEfkdcbDI=k}n1{$dN~3vj^Oymz0k&j$AZ( z*UK_Uav&^RslMt5_H`PkU3dPHo*KDbtIoT%rZjG#^&_^QyB2NarRa0B(=}U+g_Q~L zB7rKIKJCy!8aQiLpV%mrs_B9gHIhiI+316}5Xkqb9X?zn`djV+x#LiSf2L=jmFkZj zU+>##E8n=xmPLIz=gLLJ@d_M7>>F*Q;Jte=^vC-9_iGQhlt-PR>B#t&l1$6cHpZ)D?@5lkP?N$E9wxE z%*FCB``LaTu0XYN6N%QOK$gfYfRKSUoOuMUED^l+@XI366FNJqy@owuXF z4(wH!{nQM`bI*uM{hSsiGDW%ty?;hC=G@En^l#x*oo$+$@E2*!Z%$rWo;h#fW-TK! z+NXPe6P4R-9A1*^?CcOEaw>5L&&DFL`R5a5SR^i8LPI+#6f20eNCg9HBMO7q@alwm zLLK;SLJh*gXH=w<(v(6%9daQ=FC&T+tK}W|t!WE-hg;q*$SwCcm_`C7J9dzaC&gDG-!4HixaSs7qVbCnPLNCPIkbClpUsD!2T#t34|l z!?tWC2UP_3f?ImP;Z^V|JJeB+Y*J3|O0&TXH|H{^jQ69rdKCUB-DPV(4UI);j2age&rc+d7zQJ9y6DJ|x>tKNWLE z%BUPOB2E_Uj7T`hV|^H{=Eid{t}<4LE}a7H)mkdo6W}9~W(sw;6|Xtn8PmFurnV!G zXNQ+Q$#GXpiUvZIWhU)Sv0X+nc<}P8VHoDSJ=lQw$?C!u!yI@;tO{5vp`@IZ2Q`G- zl_J6A?)|yy37x;s4$0I2+^y|qWLPt zp5Jzz*EDP7_w^L|sIPBnBL8}_aGz_1rL3BSIu(98LjR6PsY3sWNLhi2RHcJYM;u?( zpIuFE!qfHCTc0*-zNZX%z#9p8>qPcBOMn@D&xn2*S%Ds=eE(MX?Zk&5NK8d8K3nnmKb z3YF+VL`J(byk1 zwhwo_J&>7haVzBq$1~QIG)n%8$!c`(FwS0^rJb3jUD%#y)@-$x&JWL~4KBWAf7=15 z%&fO8vZP$fAYx71lqAKHe#A?EtV?%pgOT5I3!t5g3$nhW+Xg2e{6eG~p9Mp0yja4P z-AI*uTYV3+yFg6 zXmd6+>1DkOQUFJkrTZ;VTD~`|#$Lj#d)hjoCQ*&iKEP=L6X(Uhu)_nX@B~#fe{k?H0$w&lzRv07^tnJaEhn|Wg?dyi+xYbd9)a{0_% zDEaSw#^%g)al~}c+~@RrtPRd(83B&ggd}xI4sl-Z2Ki?e7#l|@4ZA3yG@s~Si3mox zh%iq^kYZ>C0>h}ZNtJoaO11>D=m}Oaw~_E$Z-M)<>s;?Oc*crQl%^ zIL5@~`RYiSkU8HUh*_iO56H$Y<^J$OZ(%Spfgk7bdtDM@iYTk3=JQTH6pHf*FcgXa z;|@Yf5CQg31`^BJ2?`eybnO4P4nTA3a%Mz@!MJahr3U*D0F9aNU zjM}ryuk=5{XH25ucO_AY$fZ(k>>skUSa{rFV@z&y7vnx)_|y1++(2yiWpQzjWr_a; zFw02A0Hx^97Rgp9&}hEo`~)2}iAjVo(~n3IhW`Zxr~gGt2Wx7DMKhNJiB}N^QqTR+jyWo=7f)%V4jmIg#Nm7MNA+iyG8un_%b7*P70On!l*zveRdTdgcpPEmO=R*{7HR@M z4Spd0BGyN8<)Yfl?$_MpGtNhN2uP zE0s%Ou$&3HeO8tL4@@F!sK-{%E1cEZu)#H$MEF>-jFa`@l^w<*KK{WWu#4(fGFV(V;u`)Ye0wN!1;86$` zF)#KwEfzKZXcR85im!`NF#k!sLNC;@4@*=D6+d<=6HIs!L(jg83YD08iR>Ji;vl?4 zatMyOS7viOO4u>~$a392G|S@AzGBh)VoHcP}I!3vBx_a-&2p#l2h)o@fx8~?=! zYvg$O$D|me&w7_jBU3$}D-vzj14A?-xkZots;Jm88upvco#2=_`GDQ~oAZI-)Fifs z&BL2(@`8^@l@S*Wa7NTZZHJ*=`9{yq^)hhaLKRaqp-*|{hS$#X@qsJ;4UJEp=I!2V zvGg$ZO&}|9@$~`a7tM^OwOo_@gA$Re^~tBytV}miD|4i;%rK_AZHJ4@XaDvIfy`Fk zQSje`bpFC;I&$JOl zXxYYdtKTDL`2Mlu$fvxY&A#IB^stY<&+x9si;8x6>8X-_mB(jrwATW$nP1D zBI(OSSzNM&f5$A2u;01X>;67P&+q$&*|qm+}8g?dy0-R1$xq+T=Amxn|ILZSqTyJUq2`pj**K$_@Qd*0QP_>)2~D zt7sU65-giQ@pj3b_Ch*9F+-dtI$nUFR5z^g9$!tbXxkAQ2Ip&Vn+PnWKyzej(unQV z4~(7qW~T**t%yfm2qJDqJV6-2Qs2K4 z0{F6J;_-XCdHx5b(Uabq)r>`{=0K7mI*qVUw`bZ-U|1_PeW8*|n&y$hGz&xq_*y%1 z#IEo6`AYx0!Ae|@v~%)>xEP+X8CqnoKa<4ognx+-#So1zUL@}(DMm+5+szT6D8_Nk zIEU;kKnxH6Iz-P1Z_&>V3J}I5Va)_{xh#~M^!31J&k&#`YUFc)4%AIh zt}cX?&aBG-bP#2kXiyQ-et-`GvQ>Ve{~#+eH7H4HrZ4Lk-#a6`yp+%`s1HgOT7yL{${(&x;imz{DZ0R2t6WxsJiwoLs@(|9jy*i z0Z1GoL$4xa96oI!pGYu;dONV4hG_BWB5b75S=|Q}n{x|_*7->a_Ig%-hSq|ec69A< zMD26Vc~vIO?VwCjgg=-%7k7X^n27-5wQv&HIbK|$;ionfb`J|+JQVFwRWT$@N_y;` z6KdTwD5l3?*!~JaW)LxP{E=*b)WE{Vo_c;qoy?)3&ooJ0MyRH*~)?afo2zzj2lJiycnz2AXXK;tj3 zL8g3Ds{P6gL|1^JX3Y?6dUQlm5LS6=X=S$7Zp$%q4hYhtV1)E`(Fra<7>47(B+#?` zw!r>2P2njSO# zYlnzuB!e=!9B+rt96+NFc=^-)Xme)8*Z_6v5G!o5R3TcJ29UuOl#^1f0L7(Y7*xl1 z2&0Fbux%v=g7A+ocO79ZvC5+ulZ3u{XmL>Kpc3YJfMi-YBqS33J8%)@C>5{N!sQ|}QBUz$1q}JF;_PkWnfYmSd_@onJ-HaJtK}#u4iIs#m9mzeS9;Ms5qcPInS0Xqn+r*Ec-%h7)Ar_wvm;AHLU{wk6kC!oz zUvYbHGQ_jc;BP35t=w!4MNuzw+YA)n&cXyA9Dt9EyycX5R`6jm1!b+UB~gXKRI{@> zW^9Ua>HS~dD&AozvkG4=htm6>of&eQ;LgkIuhz5{J|}0@BV^N$6n);N+b6<%kxt1Z z`_y&4^cAn1l@I~uSM{W*2(bAFUx2Zxt^l9A5ntg7>YB-sZt6ILwr3F|BISAH<;ezr z;PVGIrFAx@p{X90HXd8hS|5;k+VzA`#*P{CUJOj*bbN)~1Ccp1sOmk$6mO@%c20F9 z3vu1`cigmn71C@q3tbCGV|luo`1lFRsW+KukHOXoG$0;x1}iz+t3dOS!%!dYFV07D z88Z9ZG_$5N0wUG94F-W_4$by?Oj;R;Y+7l*10%|umEiBv^hgX=X&7)^Hw+c|kC-*q zV#JyF$N?%lIB_Ec)y+dg7xy6gF7Hzw`mJYc$0!ruPx0_@a8F1`ShZfJiO|VP4qBf3 zURtq!J3#QK(F(wl0~+CVnC>T&68GF4oe=sRY`|B+qaiPycAX&c+jSh|k$roE`5S&v zAFlvF#0!*@<%a7-Rd%5gBH1Vf@4PfQj8r*15z(^cp5i>b`ey4()4u+iX%1V0!sH8i z={Tb*l}TUDH+&bQz0?0Zf6&+Uesu5FSS`5sBBaWaxAzUqkKcxY)+y|GZM#xh)NnvYND-}LCLm*`PYwipmaO}NcQ#?u3D71=3MPuX~|cL+sOp(?w!xJP$V@nPzgiWbQ~7OqE`Ye{a#r zY6ECXJi?1H(i1uYtjQwpO^|H*3c@LYv%nH#_6p%%&-p;RuV%`fl+zHF6l|s%TXEs# zo}j@jbjN1VK0(F8$vkXyv}IH+P))BUdn{hjIyy@|5j{U7D4C8NW`7# zk|m$-?sc~!_gnP?gw+GSzkzI&Y0=mT z+Uz)5XsynpF-h>7?Hbj`e(Gt3oC;m_C$PdivP*sEfA-kGJ{Dwpm^WP8{br zwQaYT_y5QB|FiK^CKe9n|L*&1t+~3b)_>`Xy1&kWO{eOiO&>f?&Tptj~DZLUX zDAP|1S|5Lln2RYAwXUspy(#B|d;Yc&rDM%bvp>!#=&ZohSp>tT=jg zL@ecJspGafd|XQhll%Gp)a=tMa&Tw@mdzPI7QTNQ*;(x@T`J!T2}<)VhC904OQ5T@ zknNUgr_xzyS|pJ;IAZD((dXXo;r>DC-D|l&XfQZ;Qh3T2t z4GSYLMyz?*02G7d+1HjpmMkD~K0)m^WrR_zFbewG(|k69;!Po1Qm97q_@i*aC|fN> z9vG^K%}+z%KA(g?#UPiImMYcwK2Jr7=n{81BudGk!E+(yqa9X4OIXtx5y$gJxVuK$dyQe@ctT|X~cZ{bAE2TIM?Qu3WU87@CT5NMeS}c0<-ciFN zlAMZuBob(YqCTYeWz1BL91y(1r~S-|s_gq26wfPIJa?MqxT;y=5DFn{9RSIEbt`)$ zZ9NkqQCq|$Rw8#%Y$}TUpgu^%jxZ4wnKY7Ab%hU7Klp{h!q`eY?w)Q+c354;_{6;(Jyh&gM1r%enh*o}-2xD?fr2$Chj6VzT42KgQpIrA-w@}xnC1U{Pf->nqs z0d-1VrVFdpVR$an48cEiQf<&lG|DK+?>}6-IxbCI(v1ee!F7&%)7q!)f2j&06ff(+ z2JHd~%!BP>wF3wu!)_`P0%(yGi1(|!+y9~odA0`vwJ8`>xYfQ^{cpPodeKUxU+8#} zFUX$f$w*%6kkmNQm#1b%);cNXP{K+nNk@C0PD)qn9G47Bml#L3NsTSlKOo7g=tUue zHb-(opIQ4~shBGz#5`q=38c)uRP^ZQHl4xbxZ{p%|TecJN^j97Z#EepTR zR>%Lj-_C}=gaWXf6Tsid|GsRp7k!3*$3{k{$X^xwn74F_!6%qY7`8_N*tT@)4w#Sy znTYsXRXlD4gXw`}lF%SmNL|xUW73Og2mo?;j+>Og4*vx*fjx?*Mc#53MW2&^QiWYN z65DLiQlQFb_jLC%*4Ouq&3V6wNyi18>acOrC+|8+&;Nb*NPmlVAF&-UFW(IEm;?T@YWZKiuGe$WKA`=VhChD||;#09eZNEVob=blui~ zfcIlQ7#3=pMFB6)8$fyLQoZl@V@QA3|JO`a+2tS$P>Eh@b|-JU+Uz>nG{YhDp4mpx zfA!;8GkX;cVR1L)fZYSxd?hv8q;DG&SFptOoDTItx8zUd7hU#|R5D!Ke!a9_*HanK zZFuYpaZH$!WMsA>Me?^(oS0@OpeSb+Fk3dlWX$}xAWD~AI$XDH4Z@;C9GccitSsOu z&>+izfQ=EEbhSOSRTs;_4+l6kYs_H)P^4KY>rPK;5Q9c%S~IHN_JzMBPBji`q1mz9 z7Aa^dT;S@)x^DIFH2hvr83kE)WQaE>VOZpQ&{oH6qD5=6MN65_>t0Fd#9!;ym$cne zYM*@)7%vkK0|YkIfIJtBp}Y&JMa329bF-D2ON{fNom<+duxb8E;vix20J7hhKj9Pd zbLGU2#FfN;k@L{qU~KJ||&{hksaQa(i_Z@wt#BmW*+R|FaVKKY zm1t8B#=G#9P651jc21{GGmXNH`7ZGUz@B3R24YHcPNIZSSam5YXC_otlN@|;z0K85 zscMUD%bym6_Gv3|TIG?ub5vE1#Ku~7BF#Jed4>lNJP+M%zI-tRPW`VeVA8zsq`@L~ zN9AnT5OSl$Oe4FBSFWhLWhtW$BBf2@<@TT>vS^43JLq4u9s#pGx{B`mPY6Zu+}%}hGG1t8=thf-DOj~r+?ZN(aFT&5#PfQcrS)ww zZ#I)?b{sJhO{IUF>}n4vRPeuT3d+177j{Dcm6&nitCruGF!A>B;*eRwkcDx8=@cXs z%kR;M$;-h<4F^u%XRfblM2b1omao7W1F-Wp|56!icMNZbw)7B?TVWDUz3i{^;{!j?)rgKR4@m%PKA+OIY9p9cg^j&gHsqK@BEYd z)0JQu>?BXT=~`Ao90uJEf2;Dbr_#)hbl<(-(7Gth?#BqSP) z0H}nP6#!a6o7CPIA-@-+I7uc(bc7&DpO40AqIZHs-h)eKI%1q`uen(A8RadLF~xL- z@Yw73f=b(O(i{I(KOa&UlVHWcsSH88rW( z&ffHbtw43zH=qEzrd-x_b5-CU&MsnBFXL?MGM?3?8>R^nSmA4+m#9)I=SZKTz2X6Msn-LE=kGD=l}6* zzQZ$# zcOBh;x7&PVjj;R(0@9*?6OZCE@g?62A}H-HG;bi^fBDe;b42eZ;17K!4=Nz~9Bw7y z5Fhv%DZrB3_ggWVPFQ~L31Ri-Npj*w`=#>Zj-ZkpUT|TvoElHO8}hGZOh1?h>$y~S zZRdBK7J-Ep+*wRhec5|me5eH>1i(x6!-FQ3&z+hC_$j;n=e>9hy!M)aAJhqZJjbO= z9NRsd2f!DkGW?Iiil{9@0zOzK|EzCJ(K{MA2I1QaCnHI<-$iVeQtihwDGSGiL&t9K zY42S$wHCU5*e59esn(71_w2Z?|Ho^72Vx9v1)pjv;P(aL5zzJayI^KlasUv}${p{K zy0hxFk0)Y^AT5j+u z8K*z6iP5r0=QD3H4c@4Bn8BK zApi&ih^(-k1(;3=0xabKxmz#IrZU+}ilu^+AWeaK?Y}dHm_RBhbMXL-x^*-T)f-aI+b##R9zlocmmPyrk0 zOz_6B)FtS<(iiU94d@z;yeFO&zy#O^CmyelejGA7f7am=bh#6=2UU)UU^e#C>D#>; zMW;YCv;^|LwNgPF{QUTRqZ4ayRE*=@gyJLs)RqT-xwQI8t18Lk{ZkK5TMpb74|v7o zl_i58%2Ny=R?cj@UXGrVH$|#>CrqdfZ=CU;$aW8M`<|C_nr!(_+9(A)ayHapNG*ft4Wm zhjTeP)mRl;HPk9T{pX^}^vcUB)s=KraDmR+kI{=cRemL9RpJWCwJl|B)lKE9a@OTA z!A>)IF1ST!S7ldjSNt09<{S2B@XMa(j*sk%+Y0~k-erbW2hX92FmfzC`(<`AEdH&x ziqUZFe7j2i{Ih?3Q4PN?AIqDiKbkIzd9IC*@pSYL|e;En=F41W9+$$Om;WwSj%e;(`-o>Q&4$88DRRc=NI z+8j*nw%*Sc2Sz$lJH!ehkC;#OgnNN%h~|Wp3F?S$fjxnbcGGSR8Jj2LKjk{~?)-Xh zD+>UdcXc|PY}o~RBCxH%Y^fz)wyJ`>Cl^?q9y@k>N~Y;m-!y~71~{N}%KBYVbVBdA z%H4xMVIzPL-+{KAZ}bIwqNt&NK(zKQ-rd;!aYO6C*Zdf6q{_qWtAZ;*9}BkN&zAGN zzZW|K;Y{X#?}Q5g5+8qU@%-R)Kf~hyUq0~t1Iiu+&vFm{>*9AMQ12-U{=H{o5kd(` z*`0C2;EtJ3)p_4qF(|_cDrgO+)v_nKlm*|eRZM0-44wVe*#yWU#BZAknSQ9WPbuzNZ{O=9>NzYfh7p>KHl|uh`lV(88cMy3-cC* zi>sm^S?Q>v-bJ~SM~dEJMyj572v}Ng_sTr{a)+F^?q#>LQE$Ep-c!%_KGgUOTunw8 zT-)BX3IwV1yN)%+wJm@Pg3FCRKoDHPPqHpNi53yBv`)Ct5_FZNZK~X%A@ycv)yE?AdK#=&Z_C_{XJ2s0;`)^+3HA}PBu@i>YpU- zI>+W)weK)Q9Xp1-@@#%_Upg^*sG96r8n*OL#lP#(ZCSd{FkZ)kQ#*zozm{+5+5H1U zkq_wnw~}nYL&Bl^ru2jOSm)V*SMRlYkKLnwI7FXc5C34K(+$qxT?}jw{FuCIICbQ zygJYB>ZXlTj=037Es6qiUWsltYrI>I>GRO39Jk2|OR!>Y&W?5xk0}-P_qcQZ*dP_# zf}kMv{_S8@_*I>;qCKvFpwnMm3Xc-S?KhLdWPu=J08n`~--a7agLGorHCDd$6f2JH z6f2&cegJOX_4yU9zYbW%Lo2Npr&DSmT*I7S4w%b175qx1K+E@3ic{VIK(h`NVYOY5 z1dkHiX3ntnl@+rf3U>ogParCt#I*6w6npiKc%TNM z4ipGHlpaZkMb$GK0^!Np)INMV&m&G&Qh_eyA45Z~pV>Ieyss zch>cM8bBP z53a7kv?X8uiA{frw9mlN=0}i|O}~J`IYxy2GQlp;WPI?YFFKRE|BD1?J~rj+@u#yX zmJV<#-{G;(xkoSV6ZfajyB8mR*O8z7b{?A@4m-NP>g@z^s*nCLR{0Us9QwVZbV*HH z67{qBoXQD@vml+{RReG1g7*bp9|L*uZc(^#`nXT`R_H#F>GWZsy=enMcr+Qq0Twh#;{_BnS!0^u2E-WC z1`m+vvIY|v>CgrhG->h%oB87*oga`BDC1g^=nf^igr$ssg*iHhQif6JS&H$3(Rjv! zlwpj10D~cDIWXtX?+ory=G5)usnlbS#}ENI#*8wAp>7$lM==jKW1O)amJ?9c4vaZ( zhM;$&9Ee_+anR{oAo6j%Y5ajNniKhB2LIBC_a=@0)I(5E7fwUn?ruLCj4BCSBO?up zi%}s>nkyi4h$9L#x6cL!1IjB<*FX?7IHP?Aw77uek--2pj$>fXfKX-)j_^=ujp5@l zA{aEle8U3iG-Y!V;8~3E0?ugBK({|TBxui`4dwVbfCi4sI78APj|R*(=>;IsWE(c*Kc{Nedyuf@~W2lmAfv({70Sq-_{$!BfGGeb5P!U7Qmb z00b*?l<6UMLvcZa#$)V&DvW|i>Cw2^QO$}7gI+Ay!HFz=0&JP-&MDK$xVqGjsk-;f@gnrC7n=G3No#8U-l2RwuyU7I6wPbv`GKArZ0{U`2*0nCS zzz3(@xWnxMC~f zC>XCQhU^ZelK-qRom>Q$vq7if0 zbEZO?$hISL^ptN{!9x6}Mvh)|cy63QQVU0HSS&^fQP2k~=;ekPkQZzw!`~sx&`Gja z&~GlTP8>N8Sfs@gNF}ED!i3Z#9!YNzK`RZaeR-yGDpAV^Mf8@@8xQ8Z_T?N!u^K<$ z(gdekO=hQH!j8NZ6y;8a%xBUEv)@L-OdUCU`&u!{TQ3K3e1{35KoOn3))|q*L<_MS z_jO^ess$a0jc>&b9fpiF1+$|~&OTjav5DcV zT&Rr$83xo8bhWP-YMdC)CdnT0{jxvVi0U~}%H^>O1ur4cD_}fo`1`6OY03@dgym|Y z7(t9jG)_F$lt|n!s!S1|kC$Lj>RB~@IP8>4)%nG?+A=!Sg6xe}OlJvFnFea{2iOKN zoqMu0Wi%tWR=JTAO?>*Jrb`FdqM0#piCjvmDhFvsdZ>$%+nGKjm{EInYPIa^IF>#1 z_A;7BNqcG>=+Rac)vJ<=9Eq!n&>hd24mu}tlMi5;I(D;C#Re70nDs2sl46ER9}7UyX5%PT zPg)k4BN2-s)~crsHj_#l352m!gO@Qi0%bx{KCDRc9>)f<6e;big36nrJe?(D%DoXg z7cF7uN2MEGs3kJ3sBL;xs?|+#8l@SDsBS@;QmK&&blNP68nI+Bp%#l-_sLO5X|u-e ziE63r(DkCICW1Xwn5C#YMp>ZU+OdXRQ;4b-t;}vsoB67?C6bxs`6ISc_=obh7D_f- zSTEEH`e_X(f5hq-t=%*Ka4UMN8Lr(7cUJ_NaU;rMIdM}6XDzLluiKgwsg;&bzX4Yd zP7X`dG1DxG3{6N-P?!B}pY2SGK>r&sbrTA0ms=8h+Lzo(y?d+Ht zD=3_nA#$^wRHdPnB*g>?^*nq4N>({{bjZ}i)hZ?VSA;KRJJGYo5xRy1ibh(Ky~(S~ zT^KE*#CM93)J{cg=tM|BoC5XSNF#|B4Tx?sb=6G8&|GZtrhtxLV+xV%P;L~a3UW~o zrsLs0gHG}3l9o_-RE~0i#*nGu64YAa54)Cf1#U%ps&};9WNTB?$;KoWRA9t%w&8JY z42@ZQ*pXUrI3cN^D2e{~K{3elpBUX5fE6xJE9nQY8$tV^OpZpa?%Axih- zT*(!)Nzrp&E=w}QdaGnEbHbj(*vUmUwe$uAzwmWbsU}3N3OzE(Z!sCEnvj-Sfz^@? zIZ0i{(PLO;ttuuP79jiCVUtcDHli|O%BY9=PM>LHSI%!oS;w*J2gHFIiRIXE1$m~9 zOcQlk(W2;oyv;PWkWxNkwh3lVi_fsK{U!@re*;t!v6qBT+EstxzB3jEOFG;qC_} zJXUF+MP_V+%i87^ngmo$X& zT|tvVLQ!5m%`tJ4#uEw!0o+fVC8nt+XBddDsOPR-@TyiOm_5OXr4gtouu4jpcL!Y|<1R9#N(o$AcnM~!LHF&p%K4@&p2*14lz-$_$@SUVHOcK->A+`tbAnnC z-kVo3{x(!&0I=P&Tn^F>%ouEx4fuu#Cykgob{UIGVi%_%lRH+e;EK2Cl`utOH&z7- zpy<=tp|C#>cyzd6 zfs{V%uq?X&1SX9^;wPM?F#fEWPbgJ`#q`!W&;|8EFFby}*eSs-c)q0Bw}m-fB&7!D zp@hIkpADj*T)F~tJ^^aEi0yW8mBn;zCP}t$qJf!M7HgF&Xd3-k1amh|w5A=gg+t9DbsZU&$rDFay4WH@a#Prl(zeKXqF4xj$=njUzGALy=2Ibi zYyx1-IuUS_(P2M_Kug-cQae~8x12up?Qo}RQ~nrvh9AVO@`GG2hRP;aejSq_%vER8;U@t5PE ziL42xdx%(cGmCKy;zW?B)W?~O+Ig8JRca$eV~Tj*e21p^M=d!jXvI{utds@1XuEJLMD!_y7iS{* zJeT?NTykK233Sr>i4ETZVct*shcjd6gRlR5i7h0|Tb0 zn$d7mn9d~P%sySFd@2hijb_C_HLUb;2g3er7>uTv-JtOX-Z^;L+xRn?grdJ+*nd zDav&zh&B(!l{kELP7=g2)|w_N8n0AE{ksI4exN_PTNq2;IM{^di-1Oqsk2E>sNGss zy9o(PQ-n;FCh7`dNv95J3rkvcGRIOTYwU|6s|N(MeERct(LnfOSlw{hgjxy==eaTs zdk_2NtEWzsNgi5@Y&~WCnH>x1rtwe>3XbNl+57frY=&Th_n&8@$XT#2)6SRb=bB5#8(eF7)pdQsS z1ZXdc>2O4PIslHPN1X_C3Ywsp4WDZyn_i3r!kL+v6UCbdwQiR^pxWh=l$oe{s0bxB z8!ZN`7Y;0Qra78I7IZ|MF%fPqS+nWj1r^A2S=1pYiM;Yl%k|-oW%mpG#^8deS`e#y zJa)>~<-Bo}Kxd>(K2(S>sV|`V5ziMAf?Y_H$|qZe%W(BJu2V(skEr4{i(Po4%Ot%4 z#U0@d&E{nk4xutM%8-Wl0n(w`c(P+CqEiT~3>-~S(zQ@1w}#$IJU9@dE0Cn{6IDua zJ$YJW5#ct`TI4(^c(wewNp~d4ht=Gm$au!a<-N*!b;b1lYqqsrIj*QSt2J>FKSxjnLAsCd%?~y zAq@^|L8iM3=j*9W$@U5j96F)QbgB#(PfOF@Xv_%q7@$vfUlMFoejE*6gp3hi;9Kq%2*2 ztP({6s0a<%AWBL&<_#{mVgY3;%o@5er%qF%wmPVgW^^3E3e*Pf^D(a&dX)iAd3=dN z$$I`Dfh&#tT~Q!9U|{ksTm`?cdxp|zxl@Q>UrFx@Ay|n`aUuD`Tn`jZ`JGh+UZ;I`*{o2 z($6lGKf3S{T=<$PiGTLpn>$)r%SWs=f%7}hY6*Zn;s zFjY<7a$V*>&Z&SmIy4OUCy({DF)Ao>1He@6G*rGKS{~+TZ25 zx5VXq8Sv*|{eu5}I;a1syIXn0FXwzlrE*few&yAg=l|U*n&FNt0-k|II->7=SxW}G z_#rz?pWXRt{8~F&adKV4o_DwVxQ;%7_r18?fP+O|(@E#lB);*0<^Q%!KYYOUcfO9O zu)4PVwn4OnIB>nDMdG*tI+LxPJz4VO#5f2Y;UF{2RF;-s;eC0(3@z-s<$4Z;$LDoDL`Mey`S{HL zxTgK=eebLLaZdJ-^vXOwPVeF8=JfAFkKg|387Pdu`7|xKe6fDO-R*Jvtvq@R7d-)2 z_hB!!`@I`_*BladM}eZ>@=d+XcK179@jm5yI`{Rsb7l>-`}n!Uqxu~gMDqdG5y1-t zQJ@8JZAJFkfXW^kCoZ8Mn$iiYBpm9{hm<4S4dfzZ3=sk+pazkhOh*u6i*a#pAviRC zjA*yU*rF#a_QBg~Bgka{RR7K68%GDB4ff^zmIV@gG_cs3kFy@&vL1h@E)=^HOk4bX{U@1xQ|yBqWaDB$)9Z?aJuIXb znz=sm6RoRBTO{cY$A${6BTY0Q8y~<5C=aW{Dj>G9Nq7j?URt70gCYmdvNou?%@H>1uAZBr z$xT8IZ)s-65-#yx*n;_YMNr}Bs=uE`5)pSu+pJ`f>j`)92Y}%OSXCFR(e^6QjPpp5HF`xWX7Sr8Nka8SdEje3?Lo^eitupObY-6 zky5L2$JF7$Hx~G8{ELr}>Na;%14lez5glwV?XcYTeT+B!`H=t})bHp2pG5v3)y@ z_Yr!CI9#r$yhUS)p=kOvyUy?2ikzM2m8vdMWg(m98ebDTiAEJ)AhDKkh=+PJwetFLbM=q_MA=do5stsCgqS!9 zaxaTWp{kq^Bzz*0*WhIzq2o2)3oDSc0qd`CI7k?Zg456(->&Yu3YR?7&J830P@&=A z=3rUcVZ*?||BJ7)2&#jLwsn962rj{$g9LYXcXxMphl9IYaQ|_4cXtc!4uONq!R;}5 zgIjg$4!XJrJ?z@Md+%QBYaCckB>}ISu&G3saETb2wK-53LX!+V_5Hnmz&Ao8b(~~m zVxtNk>`wCZ-+2>Nm?hih2vBg%8)%*nOxbOotg!Kc8LA8~Tbou&^fbmqJxx146cjN2 z;2Omc$dw2zwb1A4^9}UDNxEU zh~g_KzF3keXL8pS#+!7N%TFW@Nu5VBTjch-WR zxBr7oyRhJkW(Oh@Yek#|BO3xPE&!`pw#xOx^fJx(gb!7oGqXrgeTrXVF~cgVwqn~P z&_{!udF_S`dhZcw7V-2TGgIC8NR}-#@^v?YZG&_5XCFArHt713;aTJ* zl<n-uy~0~++t;r2BzR&`y5mn zoqT0+@H8S~cjLRWt0FU(V7`blEZ6A!!??lC9Mozkv{8Y|H*`2928doDtdm~{cz{m2 zEwQ5z%)I$yC0RfCibrM(Nb^`o33=%+mzX6~4}m7Ukp0g?39&VrTCs*$OYo9x;3p%S)an3Mz_Yxz;pj(fa{rpkC$i=+@?|+KkOi=jlvQT$IyF|&NQbEJ*-JC4T zx8U@UTYC_dA9)G1=SYWad10=@(2Tz(&)rjwCN9Xbrm}I|`R67dIpnqV53ZA{vc23- zMCSCkv-9}AC?T65$iL0?=yo;e3OX8;9-hlCuBts61GGW%sG4z&n}%?8oag^uWEb?( zU$f@7z1%qf$&?qzkWRie*br<|d^LDGJuuR=n5)AF=dadeTKZsz#y7UECGB*iv@oLt zGa}VL=L(e>tGfyPP$I1@7AA8Qm{Z)j2YEZDb$VhE?eEt#?@e@~XApNw?W@pl2_o7f zr~%N@Z@al_@E}86e5;gw2+G|W(ob>h|4SIF6j3v+@^VSntW%;F`!_W;eo;}q*I2{C zd1nOL$8N-Mdue=s|6>qFtn)>fX4BV41Cx<*>|huDnv&bC0*sz3;001bN&2AKRJugw zn?8uU>IFufL0nEI=W;4Us=A`xGb-MlQXM~j)_{>6uU2GwcV9lvnNilZp^%ev14?NM zQ~SzJqv$s@`uBU1R)`wZ?XjwE^xNOd6l6yu# zJ{pgk_rFSA&YH6?Ynz?f190R)ER{$;_A-2fIDslW7hL8Io4Y#S%mb)leL3R)_QO{u zO8ho_<`s_)ZYba0rdl%uVU=Dg6Kr#Ewq4c1(fifbc(~izwzML(d{g>zHlc~KBRp*3 zA)eg1ZU8&?$}xKxxvbv@7>hYf57XB{hxCmZYV7E@zrbXwb_9&H!c*yYwG(XZAZVX- z52!7jbG)0I$6I19ct;|di1jQ8_HgT$nx!eLB*txca%x8Rw|DyU`({E)fId`8AI8tD ztuqza*wq1y^Q#=>x@4hIZa;m_jdbOu3^5YgG-^bV2H+h3=p=na^LCx*puO)-j9S#_wYcU9Y%R;c{W zITf=Xpz|v}lm_s(TV`Y8VNr&glWzgwPx^YRblb`BHyo1aYl0)%yGt$p>-1==tjTw9 zcO9=eC;E^5*Zh)~k%)=JPKcvpS7nP^$ZG~e8P16X-igH{70S7j0N;Ig<0Dk<-M0q! zF0%;PBm%n+0 zFtf0=>Wa|jsBX@c7G3BcySz3bv+wE?x&8sn=9rA^RGRrm7M{RcN;c7O}_s=ulp7K zv5&9VV1VEnOGY3V=1D+~%j1_HXw!EyTUb+cfB|I2jMQF83*j@tg!YxcOE|!8sCio_w|#Hqin7- zoMxw}@+k^%GB0nl&u`4nbFB08?5H5Vn$j#>#D1BW0iE6qbyWQCo)kwH2Ux}9n>iL) z?;pTOE$RwW&}XMM72kux9s+A-0+%yMZd}nvS$=r(_vu(-Mzl~u{!523q-2N^v9=!F z*qd!en2n8_LT+tBn2nE_L2ON~5eNfwTh%*#E-v~NYBsQZa}?;{6yW6S<)o%I*i*mWo^9zVSKCNC>e4A zre)t&&C1OLwTEK-JoCgEeGU)TM!m-r+WPgDf4n==-_FE!1K?C)a}Cg1JJ!z1RAqT3 z&_EV(C?9!eZ8d-6N3aNT-R66?JKtSdMPm^X~6}V*F`peZbx+0 zBdQ|mp)h^fh#T;e7Skv=c3Rlg)5ou@+|Ba?WHQ#rEu@t);5X3{;BZe`XY6F1zt{Fn zk6qy+B>7^PM3#w+%;E)_5$GC`ez_5tr4v2);I1Kv%2Uc%J!WdEKl^T~qeU`sJLnu(cw4_iy-IRxN z@9GRSJHo7%vma_@`gG0^auHx~jSyCK9?1aw8ED+qqUR>;v=2t^c^IE{dE1iVhq3wi z2l2%B-{+4S&u2{e?08kd=srkW7LCL%<8+xQGqz+R_0jQAbUr{qSpALqp{U*C;q|qr z#8M>5+B$;S<;8Xa+CP%-<@~SQF>-tF_uVQk-Ni(Mgmu z^PMaGtW0f}tDV^@x&E=S{Vv6?Gtb*Qzc9{MNZmkuU&}PohpF0E=Yc+)>|_8vu}6koW?AxeGdco|1DUO<6=9;T9-0uj7uz5k4~1BwawCMrSHszx@Y>`WFW~D}9XVF+ z;4BO|me_Omrp{D@qX(gg;?e_tOEWVIYp;W;r;&YGwMUtiG!>^hTcc@iPBZ>57sQe3 zI3Xn(Pwlg}A|JPwLSOfk^n|DmYnv?XSMCjNyzc`zR8ZMV^p6JhS(YZljs{8P%f{cTbdFg3JanJ-^zQQ|ItYA zV9G$BqC!Ly`=T?t{*Z{>K!@o+z1rJ(znS!jGPvp-5rSq2^#b|35QkGr8~h+9%7rF| zaqVk_fLy1K(zDIuBNQtj`oPC_ra9++<(}o!Tv_;UM`xIRW#=ZJ24ytQ7NFsCIDCy&fdk67(cl{y%l0>Ogagmy=1ZcQ$0Hw{g9ZxO6;6W-9RjI{M(md zbm{GkOSUv6R%;o5yJ=MJISN&5<10eWb>tNSwuO1o9n6^hjby1RItopV3zXcG?>`ebd3wz!Tqr0^9`Sj_7j3Fr}GZoo}H6|`4v-UdB zZJXWKtvg~imasWZN)(IBJqYUl=7H(u+n_~^2PhBk zEU$BjtjJ8B!`%x@*7O=dHeyWHkAAEde_QH(iBTvCv)*iD#4%wzctk%E^=Ib84%bOx z2>gqUjI*-!`WBt$85DRnJ#K!`fwfe|z&G2B>rDyx#Ig)c8Nl9z&;N9%tLWvOl#=a>(zIbZMV(F(E?D&BvOLGtk^H@;E=V>1#j;_UQS{De0ok z6Ul5%&BgyX4>*%lHu9QU3#`6M@%B^Oi3C2SHssj;r$9rpJxd*#Z~PmP5vBC>YWMw7 z4?C>+KUS0>3*3)hW3u3089Vil12jYHsPY~&yUUfGfLcq*!duQcZEJBaTdy-b)S6!S zhWzc`sQbrv$Su$J9)qC(smFJ;ub1BYMH)?!)qf1l3%>p$-N?KV4YB;K8T^Y{dF&aqzLr(|4hU8+br_G64Mnv*$-Oeo?J#p%I~+AH z0>gY|M@QsmcSC4y3@u$0ARuf#aA$`+P2|d@7N5wsP5X*tSSe4sw72r3bZF6A0r$PT z%l*iWR^j=Ru?l~~w3%MXduQkOy+d#32RCM7cGUtU8-z&Xm}U-cOc(e-!9Av3Le$t= z)H+0~h(gHUEKAIKx_~v&TuHk+gWEVcgJMoLE7uMa&j_=UJz9=AS}vA3I+`&$T9!Fl zCW1LSK7u7$!)9vVEzD3jbYmRUwMi@YSA z+?+gh1GP!Je&C%s`(m|`QwIZYR<=h9@;6N zF~-bDzy^m{?8J=Zy|ew4Ul;ai1caIAn5G~Myu*LV1V*5LsMx2N`3-P!YA{@!VdUkD zf&K16bN$wG|7A(zVAei7{A_W)dsO7)Y5)E#YPK#eLC#(L92!;%{bQsu2uihoZ>A+N zF;Yn>kbWJ-LP9}IQTR`E?@Yf~;t@(&%+D5eGSe^$Z5n)$>I>QdyX1%bnhHs?R1Kiw ze~a2FeR$W6W-17 zPfA*+NP$L-${%UGQb&2%R=8!c`-icqh`&Rtz%VUtsx6knfu&TX)Q?D^)R_s-Ug8wJ z2Ai^C|E9)D`JD7qjNJ6Yy&|~BpDrpPFc!l)9l+mcT~*A3o3@LEqzCxbTgr5e*?K;W zTh&W`d&@>OaF2^)yWjPEOvRI{^TLbm1Y4?o1EQIkCk9uTC9yEitLE2UPP1RQxOA-F z^n!wN(1Hs#)p{nz5)KWC;;}gR5U12`g8R}}a zf-GfRP4sM=ihq}gUH^&%ecIs_;P`R>>SBL0xn+~~Gy999fY2-y)B2>KC zGyFT%n{F~ruDuk$eW1EEgN20entN(oAdVA6VD6q0gfW@*?YCf-Mt1bT#%0;#tG+-wqOL9a+sS4hia&;J+he z9mA&FoWsBQ2-J|q1DEyf`Dc*UNb-&LX8PAn1uQs_YoF@2KX9UYq-9`;3?>)P6KvfK z6Dk`W9P4zVvY4sH=ze$Ak`@~LacG$z9iL_&Vqn!ePAt21cJfe!>EsR#TVEv?@1$x} zQ0AWC9#S5`9&WQ7El-j@wyX-2c#^8D3 zEj~WgdiU)_t#@1DttJT6jCa);roGg?pShWqS&n9=!m{a&g@x3TX9>Hgg}9*0U)V<# zYSx>^st=d)6`YTprN1@Q{&Z(CH@0S}^qO9Y%D~H2QU9f)P$4)>#XZBw!#T)F$vnX< zg;g2#{1F;5R0hyXmKH!(FhG_t3!_+`md`17b9;!3cSJ^75##Y*1CCNWw{ye5Jn5L7 zlIr1a`sk%l(K}^)kO=9=k*vizQ5Vmzh~POKU^rk@N1Ry@)ig^Z%Y1<)L%;Kcj(~K7 zAejqU^VK2r>!ZLSf_4s{Pff0r9<{$`X*qHfQj_wS=>h5)hBk$Zp*&*HVP5T4ECct9 z=ejK2yvgcP6^<4P9)x6N0nIRC-d+%&(5L; zw`TQ6H;)zQ=Z-cl2`XPGR{9L~OvTpS6U9->R>PbW3e`kZJM@FA;+XMk*LY<3m9S7M zsKJ69<5#WcHA^+6n)es4_20h2!b!Gl<*C#=hIS>5Hi~sJ5fj@~O8Jpfx3_AZ-^C+g;iE5Z;3E(`9d8G`ikgvzYF^U-gQ;^2{Y95Yw~MS zPqAA)tE1;BXt$|{XSLI+A}1YTrxZ8Ztb$eP+56Wf6vK(d#1pu6k1~%A4-*J7b5gO5 zQVvmz8=BnUrV;KY6vLpc3xjmClc^cbSSzpF5Uw0;bS5onyhj6K{M_>|TLPnoR5`>9 zeSAXHu}%s992UDv#ohmeZE$sVzK@ZXm5CgKdx#lpLe$Wt6tij?SN}+D>E2RnQQC9T z_K20MW7bWn0K*}|J4PvyiHBBZ>zNEdv9aqvB$7}!J4hy&)v*JH#@M5Q9JM{6{BqxJUDffK{EWh`;N)eT z{+r80`W{eCzdI8Nj(ZD9hCF)>ea84+zk3F5B|@`AnN0wvCWU4epyH>QR|d7e#jHgQIAhlVtA#i{#v8 z3?(KwZ?youik`O^Lk^vIVj8n5|7`ZDNwZ|q0l*Z)ymZ=W>1|YegS=X2q=QTwLjIpUcY;`19e6`znf8Nz3`OVp>1O5!(o|q)yA&R z(&(4N|BPCphHQ?yj)}Rpv@zHy`=-Fafz|03D1T~;+{(D|pW=pV-tN?sVj4pA{4^aO z=WnV-HhK!aKD8{A!+d90$5vHfJ5QyEaZ|36dJodJc6FXdfL@qPm`J8XHuGPV=Xn{C z8C&c7*x_e!)N+G#ww(No)_)oXPWx;-aaXJgFLaVPTOD6%++-P1tfaB}s>}UKw!xO& z>p?>UY3SY6u>P6)AS?~ojk(+cO3UiupL5#{xOya-b{@xGWjJ7ixd=M?F*uE}tnidgp_|!|bK)Y|RD?I#>T7++-oBvc^koj<_k3OuQV@{`%m3k<) z@jgBC57$eh!(%shDm)7=81Fl$xq-MI^L7`Xpa(X-o$M>Hk<;q*`%d*1-@oE_6*}Qp z3uN6^@5Gkzba$toLDy1^84emv(hCDuYt6ijL;oY2)ZX)>o!*-c=G&3BsVcOq0jvj8 z@7_%ikJH9OGb&4CZv=M&5A8!5*~Zvo93Ai~$E5;DSW(%;z;t38nwk zHNLqsmAx|c8z^tJ!=+HL%nFh6IQk3hJq_GjzwmEFs&qmm;b z`WINJezDp>+Lpe8{LsMA#9vN+Z9~lL0B^69`Ax zN0k%L6NnSD$*ro0YP03~ip}cHYHmvR>RJ`&YCY7|*7??vr@l)y0a%dw2-oniaIilk zU?mYfDGj~*upkUz-cTIrcYXSAOV13NU$yJ@~qq z^ME1d!{G!gl5i1&pL)N5TwrU>th!4hzQJT85+kl)5f};NT;`|yet2jG+%BW*<$jLv zCLCk7AuG$-{Nr#;q4`e+V?#4=avg(Svye_Pm>}o_*J2d$mZPrXh?4 zuMr=pv*NB1wwP-i&Wc4IMa;^0I7D0|&en$wV+4sXq`k4UQM8e01qg+tg=mGT;&jnK zfzyZ=k$a=q&=LKE|9&oz**LQiSub0+Sj*ddMA_rM`!tDxC+DQ*R+=mkn+ck_o6NQ0 zFQV6lv@I?i?LyQG32JkSa>}Py?B{dinIb^g2PiDWBXlEx8WW$9BenOF}!&hmxGeOl2Z;k-yw#0k_0M@+#3j zziZjoNsZp$io`vD;sEVPnXU31hTlJy*T&A!y zmL2bci`x_2Hs>P2faBu5dF#|U;>&!w;Up0A>b2Q?GaK*kg z8kSr0soZ+E5e*iBHu_AD#z#?Pssj8GPtyN6@n3=h+pLyl06*DkJ) z>HSvju9TbQnO1)9v)cA40(Os~t}3sjf8Fd3+g&PmJKBuS{b%rT46akNy*8e$H(Tr; zSKEb+73G%y)0s_O|MhEseL{qmnE1VY8Rtq2zR(U*^=lhSyF zH`jqP@1^>|QABx|zF99v@YGGSKi=?64gc1Y>-icv<$2Ezc%j6E!XS3_tcj z!lL#3(-c(V{j0rF?)mBxwbOrf(R?&CM}=K(yXl*I)i#Tb%7UJQ9sT-Yi_Q7Woeu5e z_G-5?fJp0neADTmu%3tBK7Q365)aFE^JkXddWYF)E$}x49=Bg|ozoVklSU`vMGHmM zRU?VhN=$VrNA(&$EZ$}dT~PJAz-9Zk^<6w(ydQWD=_pk}08S^bES$y4B#*!Vv=FmV zvYF7USO1(Af48!;YTM;>U!tOO?2y~&2l`i3y`rJ;e0@(R$Iq(8<1;xBpS>*Zvuc>K zGm?5H@O-j?7`$7^>HA@!@lvDn-apaoq0yq{ZMD?@Xp-7kpw|C!KX+|({>rm_A9#d% zhFf#qX@6+F;wE*rWoT!h>2fmIz?N|~u^hsn(+pm0&=Amk7b?ZLTY0L&Z?>IA!=P2e z#D6wiu)YckAaBKV05UkO6{JL7fnFWj$9Xzad)uiGd|%0HyU%X@(lGd=0qSo}p5svz zlWJEOwP1bwdSUI%E=>llD$V=t$fLVE2P_1=x2=YhNoWjB%(oWs@LS?lS3U204qf!| zG0~#PU8tB%8YeA&_tP8XWY7n^FqU2(hwI$)BN}Fn&Z1F&{qy*wzUH;p$5#8`cD=!Q z$8|5)z~pO z1zOP0yuCYQXVK58_rD!oP-~p&F?xH+Q)&4Z>sS4l>_JhRqsqBNHIO=qg%ap4HADv&xJ@s#6cUFWVmI$0Sdle5llbObkQU9ech(8*>o-5f>IkaUa8z?+1} z@37n)N6wmimqHiOOVh}3eak>HF_UzYy$vd=%-AW3#pNPf;&%~I9!$g%&zX+FZKrs@ z2pKOQRY6!VScr_wrGg)ZKJthCBa=cyAQ|az@M4gY?CIcERG}(Tgo=?XTzuP{;b`Xha8VVA%Wjt)7pmcXl4C%r)aOM|44e?Jfhv-E9^7tY@; zxN)jkHka!h4i4lHa+?!eGJTg^ZSHzwTG$uZe%d@Ky9|nNAc*7s#vK=zk0l>0L5xA@ zWbd-seV~nf7`MZXxB5f<%HO%g*fxG~Y>PX@{-xGsotvn|reMoj9xLys4ZcI9U|px? z`0A!lTb^ELx8ncxk!+NYb;i}VaXryGHupdT@_SckHS`CXb08|P3OrP`jEg-Vl?X_N zmi;iu?f5KMh!6C5zHg%ZTH`%Y_f(IrJYZaN+@s$3EiG*OoaT0vUY2|R|LFt5ck<(7 zt4a9@{!?&G?+hnbif(>&(Zp-I5|*Ww!mbkT;|qAfXA`i~5Y%gTRA+sQ;2YxJw#=-T zMLod1QqWC6{X}r5me$2GH5ZOtZt_lR9dTC%-rRED8sGR&e9(;O1Qx;Njc*V5y|&@^^E2Js7h@22I*G zhZwniUS7i( za&*i_3F4S%F$C}NKCY&D&f{`H$KqqShQ8q-n5ibxk5GfYT3)_8-i0D%U%y5wt~Qcr zNqxDBWcJQ2m;TKgl+qfr#$asjYP`Z81)=^6(Qv2Cyskx zGdyuNt4w~f?MCKq-kMmD(owE|+f?AvxJt@sJHKhCe{^gVvc|q%pxs^YPudRmnqQ56%^mpkn z)N>p629Ut8*<1Pk4eLNQ3mAm1m{X(Zby-#hP)lB@XslleTed0GPz`;>u!Bfh-qGO| zH*hUC>&U&&rxbwOS`Op4(bfSDa9UOO3g;2Oxi8)HbDuWQ<^9!O2#{vq$yHl3vBtfk zcATszh;8TAtqc>NI5Y7k3KMa2k+C}(iL$9vJ4srqVcU9at$^RDp%Ew>WpaJxm^_Ui zSg2@tUnDj7J2>))YUutE{xVn8;trN}mpnNA7x3zhyS^NLu1ey2r(JYYJx+hkh$mt9 zAa}CRw&ISwBf$2^Tg8y~i=J=S=Bpl3+^u*)q*79DpEJ^&yRqRkDMV1S7R@5}g26D}mp<>bq>j`F;)D7Bu z9g5`GoE6W2BP7x5f2Rvqfi|mH3s*{~V6vke>Iq=WJg>Euf}??FdXJ_?Hc**cJ+vv6 z?Iz&#Fk-Y!XTR`tPHj5+(M({W;<^ml??gSk;mw9++ikd$`=5=DR^HzoJl?4hC4)B2 z(GG1ss*al2O|^_PwP6*Tx}!yRKcD&%CSdlB@6<=R^yj(S@Ol%~Cz^)N`%|8FR+;IB zrA{=M;0$V~@{bD54f9>cdf?^Nj?G6Kx2)acvc_mI;qFnApF-Dw@NleU>w)mM9Y{FC$6`zrhboq;H+cSWdzN8_UW)#53WQ_dfh`!J;P z=nrLZbwOD}yb|3>h!}T$`@coP=llM4vXqs)+;^CXOTF1^>qeqV4ZhTso))(<%bjZQ zM|uPMHBHr{yPssvi-0f>_Y!lC9EK4A5p?4`j&kb#>L=eRjz3|QN0_R1XL&V2<12bW z(hSBnPP5N7zogwuVU5j~Ghf z0qvREd<6el@+d;sKs0iTy6aX6>EOLo^5zWm7j${_ayhy~J||Q!rQV*jdk%S>?asW; zK+YKL6fpMEBQm3{91wWtd+VjsSzf?S=Z8ptxc^@2>(-_v_kt9!q&^9(a2Y)vxXg=Q zJL-SEVCy>OfBD!dXz37sex_i%e-+uzxw;NRPHWyf7ae6I=?L#%sjqVTmOl_y0W^`6v6F{;{0^LpOheIg}KZ9*lz8yMRxn$ z=)(}CP|W!mK32eIqa_|MQMNMp@R_xUd3lg~rlQA%Jo1po&C?R+cBvw>RqZRsY^-

Ps0*OKCrchb;q6A#J!z`6^Q5nl`?z}^ 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�A3Msv~v!`9@a6y#*2f4Nd*v*TgK>L$)?s~LRP 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 z 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

gK$VAWXZY=bs(lO-G3i?ux~ z=QQ_$a%_l=&{6=>$Iw2A2Wtf0-5}v|8(G?~@7Z3;lF-DQT*WwW)8p}3xK&&6?@SM@ zRg%eY#VM{7jWr-QR&Z|_ZF2Q(;hn|LDu?A=oUito*$e;q}VM|#9bMV zD~W7fhQmh{3A=b#twKpc+dDf-0C+8|n%Q!dZWHN4$a2!29ra=s6TCw@mhPrP*h<(w z!qZPWrfl5Whn$jff&S>mpzT^z^)>IPQ<|iP%*%(|#8Yv=K$4Iw3+M@h%0rIGmQuZ5 zFTyEBv9mS_EfcH7q$>sSQH{RuDYx|(6&BcFS=RwxI(9p#lqJK0z%XBJI258rIjdxj zD52Ok^tUAGG@kJ%RoR58mdug{o#J^gjB!Pl6_OpK%U zufKgx@`~ScO#UNDdrlsv?$wwnv7vo^-obl&H`i-=w#B}P@Wt)c#kx-+U^8+kHdG(O zmZ$xC7>qoy12xnaQ^mShJIQ(9pc)A^J3nU87?`VC=Y_t`h zaToIFYd|G>c|NVdIbSZjT#dOh*@-Ol0l4qN%@^73UBJa3y1YC+WTWbvb=)oV2I-gO zcD*&@tZjI_zxn6A>RWa#7}a*n^Fx1uCwm=Y?@2aMFZJ^D*SPQCB4fpo z=`F$_$0)fsxcK=_`!66ST0xFd>F<}7M)-Z_E9>8YvQ4589cql9LM9Fhz)CTQBTfxT z*v-0&^Pkxd`mdk*DQZ@BLObtU`Y-DcTw~I|k{BW){7LUayRc+IY&{bQiP0FX&~*{H zp_{xc>}37^$;zx`t2TeHWVc^{yTl~u!7fa8#DO&ZAr$|7*AF=$LC1l(=#+&GZ2^J2+AmL5om!a; z>aVI6?UV}EXaa0cBD^@ak+rXQ;~*bfUx$LSgbMrTe}s`ayvaNfN$rZhs?=ovg%$ZP zs>Tv!4ls$cJ_VQz&@H4zkeRLGaPC_ZZt=$S3RgI5;IF?p&O3QmBrDaP5Mk+hze!Be zjUfmeDoSGH1_v%C(Mn`fSWwPR?nffw*;pa@&3_*R{av2q?!gxG-$%m&pvBK~M2-%u z`=W=Pg;GZP(*7fgq}j#~Gr!^h5#?8TNJjom;7tnJNo=`US~tGH3trs$mV}nJ8H0GR zSZVe}20fMmU9}#mPt(PDHnCkvI=Nd1mB!IT^_z#p2;6|Uv!e0oPz#SLAzo}p=%U5N z_bbk(pS0sK;!)eb{k^4=7NfhfuDZShZ4No~>SW|ImF7(=DBXYvKpnG9C{q*us?gd^ zLd%|3fco#hfH?yWN9HuKufr%^T8BRHNs>Z$8BS|g>d+BT5^@w3C*zX7uNFm5N^c( z2qVRvZzQMvmgQtfAx_p*{kuk{T;jV#i^ZSbC%q6G0~gRlW~-ke{l5)y-sptF+Q7pt z*?5Wp=6 z+Y*zR;V;7|+v0}1aflO$LyL2NOyLcP+FI3-sHSAedw)8bn~6T?yV>@-YWFk}d>7dv z1Y)3Qyr}utNX8l;zal^xjWb}OUyV%=VQ#nQVe^Iaro)Hca<{L}Q+F=aGH0|R$UCPC zbsHdMhQ8ShdNVrHGQTY1#Sd(|a2QGe|nOwDoBcKk7 zNt+74_(iunO(|4Pri9F3O%Kgwi0bSrG<`5NLuo~6{=E$AHw7TgKCrAhwlQ&aNa|?M zey`#-NnlAQ`xoIu7j8I$?n#ueI!>)|UUEYg>cY~#)7ZYQlre4?fYKapp+?BFob^58 z8~`nx<7^3$TvJ4?Vi44L_UblyrG*;LGajCcK<5~Y205ePf!9eX2t!_P$pa*d$XL+G z6CqA=Eb=4*6yyD?Ng~@md*f%eozL9%0t8J&ac@g7;mzUJN8WPplEhG>PGyb$G>dx6 zIxcG3j`AgZ2Z$K8>kggU&5kqkHjx$rL~D06$cw~UPzXY#q2&Pg%0DHSZr{^k+<`UN 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�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 z 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 hr^m>qj>`1+AK! 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

th8TcgAT`hlP8{K5l}QR-{R5 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

-{Csg^87=J{=9DXMLxe#vU6Q%vnQr(Y|3BhYxckmuNti z!=Ysxoa2&==+u=@jfz8bLdBTfAgkBB`bcT->8g{Z-odOs;nb9%>X=8m2qH(=X z8PeDHPVteg>$$YRyr*aYYBQ!C{OKClQqQQWxc#E8c7l21fBZE{Q^_Krw4#BQm3a|Znw^7u; zi*n3iZy!l7)}W&}eIO~KkPhq;bwq|y;i+C4(AEUgVLGgpT+{)z1RkZE5KJjqeznj^ zQ{+H2-0;qb8t!~!LAr_6)yDhNu*k<|s}c#tBL-H?s=?w*0ZJ6a_@!#=3nYI(I;j0 zk#~d^u?+my`AH@&@4|evn6trWxD*Zbc@QrcW_$LbL@~k#2ATTMMetPCo*+L zuSjY_W8W}Y9HkmQ(mtp2-H%=C7Xf`e{)f2FmWaPcxGi0!c6V^O1P^PN8VQ`i9o3fJ z0g%KNi9(PApkI*xu+ybHC~0-O zznt~-?W%uS2l@!cF7uL2m%|eg%qu6NLcJ#st9zn0?s%!Stcp0%h;lrv3LxrsN$OTb zOdBpd$~3Z17@|0$^kAJo_CZbDcJYO@@nP{=Er{uKbx#N58YFsvduqOY@_(>M_7l=zHg%2+SGIhFt0WEljjUZcV436sXib6 zZt!IBZuFOK!v8<#_6n)3ud<;N8y@MB91_&g3e16N3$7P0AMV3s{(&3a@4hTLw-#aC zefZiP?L&@ylyIZOkB!FXZ|>_QCT^HA0@AccNR>h2dTGdPdsF$A#&IoJ%d%1hOsb$A zZDc~qX6nU5$M=%ut(2#C2=)7P>H4KvELJ)$S=j6_a)6!5*cXNpur<|)z5`XDq#|A6 zyq6$kOjcev*PN)du(`Uh_+kyJ?zmVh(x^2wK)f+S!h#=&7jl0Qc-oDm=-hO)_70xe z)2XfdzH`24#T4UnoZF_C|C43>PSlM}uB54O@V{Q#lfrLW;gB7W+ERbRS!sluvrJ@Z zS!NTr;!;-_c`mP%XHU3l9v1Pg^pY>1-1yd8bgI(}>GL15EiJNu^9Bfb zTUi|gT=D#~AR>_(FRnF5U3E^M6IGf#dEi6ZS!Ja)uPqkq;Nak?W@SgmFr~>UHb5sPcw>UZyEIx z%C0m>%_5(gCym!jg6q{@*k`yv^63#=l_dl5rK)deB|(x(I1NsIhiaV7gz~GowIOUv z1(Aaca_SY;_CM|jIMq3ieiT$Y%G8faAu(YgjbhJxsZ%jkO#^j|U_`W(N1Lmd7uUJa zthAB5vKn)1I9%)w=rc$zm7am2$LPDW^Ud>f`}Q>l3k#5o1Pb=cwH^`t*pE$>z}NY| z6k#WSI07He0fGa_rNa#-|EiRdO3#L{Hy)4v*O^o9uXf+mP+IpEiF1Ou)X0Bhj;8yT zW_va81p?DN$+`HUrSp%2w`hS~X+Tv#L4rmiEP4o4a;2uQD%yyzVotU09_yEQ*O);e zQq=sMIV<)P`tuvge6u07f_aF$NXha*$5$z<7+Si%;`wZ5@IbJ%aWeizp=5X=(zQHg zX2ggN%xnQJwv)>aKEf=5m*MegX2g-6wNi$q5WZ!YQ9EY53=p=*J>l)xn0JOQUbw9ksa+T|z!5fYOSETmu1NPH;U$v$?$Ca;D zpLCU7;Uy=fRXyeKTeHTiBx6-ey+D?krym-?+f#K;JYbKOdDM-`LJIZR3}a458%Flx zNN>-ID0xTgga6(EbJA$e3K2h%QTK>u)XM)FQ$FU>8(Tp@k(l_+IW}g~@TdtND>_6{?n$$sBqY+(?uG!2cMvhLyYW4>}^se>#`(nDM ziTOSnh~_zUd?yE9;5P24X^fpO!Wly1}aY33>dlUOq17)j^G0dAf^6Rvr7NEg0>362~b zR_6<%p<)-ITGLUrX*E4Tr3*nM4PlINln!mfuj{+%uj=UehM8LC$&}_XsZ249F3E+0 zyke93++Fao4&luagRWb~2Abu77y=nBY!L|!+hSS!2@nc(=ddz7z;6io?=Q!1_4aOd zd46B5-v$0W$+B>XDF@!~e|DvSN}7$G{i=OgO<%vsbrf9<_n6=)xda6^Vp3iKh-`Ns z7#bNpI&QTil@Vnlm=Fc<^z28!kh?gJ70ZygfVjp8t^=DuVRjJ~nS1#UD9y3!5*nC^>V$es z6Dd6JdEt1$9u7M~^#3Id+?WG-y7;-J-$FdBk&=HlI-!hKyahGBra9-vaj|&hW9;35cym2vab9OrmsnJ9u}VW}&T0Cvd~VZT;)1 z)PB&(=F(W}?FtnRrGY~{k7x`atouUz0K~kSf0!6k1G7dy*GP(IS&Opco@?b+Cy-7k zf^RNYTUQe*iDyjdqJWaxuF&{vd6|Avl@Vlp>R`Q&5k^lG!Ol1~dSmNEHt8Z^5}@W> zaE8Z)RXT6N7R%q{r&TJJ^e_PA)VL}%J9UfYjUXu&3At|yCcCpxh8I=Th*d%J@z^&u zDKl|OMp})QD0Wr|Er%1rUb zOszDLJf|iid9bB482b#8)Ur`JS!Y+xiv7hK1{wvAEv(szQZIVIVn2L74Kue50ic{ll4fSf` z>XptOsam+Y_=bEJC?h4Hiqi>FqQ#@xOGKJLdt{HHwiea>s*TfNNfd`?X?{I`BHi_w zqR_C>fJ#Rftgn35`NapGOn^z=1b5i6fF+HH+e1w49;~NH%N0)V6r7v>zwqo$2}><^6Y2i4@5X?p zeU{x2*QTAIgoi4qYL(*Yd}O5ETiVGiGS5TAf$2M_noupC9)J(QL~GP_05EmOHehb7 zQ-iPh{f5+{KEX}dUP51YnxX(FnfS>!gjSu6+J#))6c2|B)TX+L za*SWRwrl1@yXozyQpJlz;l^~~MbMic#f7o%mT5c;N#H|?6WeB#3q+QwwX7!M$&pnv zx8x@&kSG2e-K2R)N-?VXy7Pf9TS?H6EE_VqgWQ<09{n{3MV2Bjk2x>VC-))8CZO}+ zvq2uY2>dT=z~`Hm1A z`80JeaO?$|Fm$_kx`lq3)MOcz*iOgD)795A<}%_$hdFq(Ng~}(eOTmvJvqx+qZU6x z!(+fsL|Ujhn-Y)xPo_b>q+;6Acg1+VyeUn-E3_An%+M&Ar+!#5VbQ*f(mDv0NHKPZ z>^gR^-!ffZ4L6K&rxY0lfUHo8>y|8AB$NeHE32!LFMMWsmIY#y&k%P7MHP!o2>Ek? z4y`hvHc?hm>fFqm&gS3i$sdk&{o>FWw<``dlhPAP)*~&&yS5z8Z}f+BLV-1B;(Go| zg7SH}Jxmk7e-P-Moc-YYq0~iem4I`@MC-YUaCwHkGW7$^Gwl%w^!Lw_N}bF|tMezb z!pdQ6@-}RM5`#2F9V8lrDd(j*X_#|kInZDAh3G+4xfIyT2JD`BBD05$B0(NC_$Z@D zI(K>mKhH%~3`GVx)xz1q%{u93got~!)z77+r6UaVV6fi{d|pOk&qk{WY#waFT|r~o zw;oj`2lAd6-7#BFk$u1Tu!lCj+$q&mEfc%EvT8(_?YBQB+D|`sGn92QKJs$kG_uku zOLPyXx+gOCQ!lc8lXaZTjmRU#Tv*0S}vxW>hwwX?}tW_tKVpPn})hX#x{5%&@`F`RM0{<3j zctR`01-yia5aA>XI0v}_$wrsQ6~Nh**!XxjF7LYOdO<5ps~iYJPCZzb#EvwwD;nHllbpPc9-Af(WBuf4}#62viGn;kXBVls?Ao6jX<#b zkzdFWUoO#-$vJRFsd{;%u*U#IEf;K5*E}1(POhsw9yJ%6U-*6{~Gzjw} z;jkuTU5@wqp~VH_ZQF6P3gKdh58Z;n7SI{cUWRZegm3whP>`r_}u!{Zt^I&q~$XqciFYEKomn$hpe>o~h9 zQ%iA2v_e`HD>?CJFU+;&o@rda)WBW|iD3g}v;G=-^KR`PQU3q>G|Ul-6e>^nQxuT} zd6FaN_;jV~;issBFrb=k!aPP&%dpMbDNat7a!}~svHvo z8+Hq15B@WLeBQsaILS4Y=Gpb54@GKhpXD5QKzc4Br^-H*>Hei@9H#=O))qeVZHnHl zClt|8L`ECZurVx?+@PB=I1l-HNTKfEuItmv4RC^aR~((4cMmfX)~lBlGU}4xyibOuFcl;w z@B+Z@`qq4*swZLmbff+4_y#w{jNDQHifKYehE}Gjq3^y#w8&OPggV!P{~$lG`CSMd zQXU%o(~6soUTtI3@(Mvmu=AE04&{b+!*b$iX zKhV#VISCPfeaf9D-DUL0XQN&3epZU6mxM5G>WZ#j+nI4$$($4(t%d_1>CUo~&?SFT zzv!&QqBZcB4Yv>rq-^_}31xQ$HyB>t3jRebkU!6@$(`o6y1BWquCD#<_nP+;5OnLh z?!I&rQVVC$L?V&Ln}|3TI;qW;9dh6&ky8f3CmHO7X!6hjC^w=6Md?PQ6 zgWw~Ttq0|nElaO7M2|QjH%G2?wRgloFXoNrDho^E%Y)s}OyFiYlsSn9`KsYWyLnt= zkvPU|CwURBIRK&cU?+!iW74`(PmQVloonU!Q`HQmd>UpJWsZy-tj8}g6YjON|&d~m%I*_!?Q<+-^?tOmzDq;3J~QrH8mvs_Tr#5WVuDr zQ8rfAjn2)}yT50)wsJ9NmzS=>moVSg8ZFEW{RcC?1&E2gJ!8D@L>3j9Y1bP0zqu1C zBfT`|`=0MEBVxal<^a`G)RfwtynrkuoL zC1=yT1|cdP3Ibb-i5!C4-+z~^xdjE37nY~gvI8*)HjeJ0KO)7$PPi;ak`Gu9IMuZ8o_ZMxV~z ziS!~`x*B(5MD0)8lLV}=6k|*)@FKNRepVxQnzB^P!lSTa_<={cLU5_niTc+T5iF;GpB<7H$MQV_8|o#jLV+ za%U&)@6(4YB_$S1OG`XWJaxUV6Biex5|}^6_wrQh=Q*mNZRRM)zn`6Ut#(9 zc=TUGjN99sNFz}=Iu$rt2Q4rdfO7rchbw^K?;`3n%0P=98GFWg*S7EXEt13TKHrMU zPzzeMncXSsF+=e-sM9G%8FR+*qp{$1xLGfpIZ%#4*=DL1+x+^oXaCQU$7l8_TUG z&L%e2)_>B>Mk|?FdOO@~fLJTg(sgp;Bt_TO0wV)gUh&p{5Kj|pYcJ>d^T&2O+cVxL znqCqoyyg}MfFP-^tpLa>dAby~8VB6$)@fG%dH8 zxcL?l`=Hv*31`yw2sg6@>0Y0ZejjufXEN`3+Jme{1!`< zfQ^N~u<?>3XXtMMDFC4@d-Bt+)Z3o2k3ImYPWcqLl0I_~NOe%J=WRql?R}RD{UW zGe7`w1!UF`eFKP}bTu@>BM7+wgtn}-6sQ`J?|{z5oyig9{o>pP_=H0gm7MQh6%isQ zAHw~H(c1Arp%9K|;EUm40{q%(aNS`#`NL}SiG`S5EN_=mtp=NdS*gbYOrp)HdqjcL z9+|G1TPysaHcF}+Q6-4z6P;4WJvLLMIg|T$n{SEVS-vXJB2DF#S`!d6?t6stEI`K* zSrd4&&J*!G-j+k#YbKz0<69igVi<#N{z4nqJnR3+4)a0cxreMMB%3?SA!!?*B_WE;(NTkuQ^l9O&@pj;rD}Lk-txIYmSJF~~DR)bOYt!wJ2K zDm^OKdywTOi$ilhYAlWdEyocNaPX|JXIBebd1-8@bTC#CBlOKIvs#)u z2aoN!%Jn`}n&wT;q;>2yS7dWJ!a;20IcejmH5fY&GQ{_cRpcmhzQ3ajHGu`@>X-** zjOq}|0Xj=s?6c6DUU0V7SqKTtJ2EuRe@kd^Xhv$xQ8{Dgiry)V4#?95zXn6vm&c>% zPmze>=rojF-f<@H`>e_l5y3F??2*mP`J2um%~Y|7&X#GmO7k$GZ>QJkne+G&M1lCUG#-EXL&P0gDFi%$F0X*vTaaV%NZ1sX z+tgYubB%RL&v|L;#$|=T4{L2XymtSbZhJjpda<>zMZV1+flYLhg;H{p=9<%arGU{56h z%Ank%2{VO`jr!%U)hS?$CpB|pv`Y!-OpN+-)tAM9Bm?;_TOgY*?RTT{+$g}9R@hX(y`R=q070l zd_9f;i^ea+QkU50bJ5!JiKZ-E5SAWbVQvC?Q%tO^q{PJNaIg*z4!pLj4nF^}F7SQz zg3tSrlcNWi4ceVkmTVt<2>OJ5LzNQz>JDkYvcoDBLIsaxB2j-<#0(kVS~4WE6r7Gw zRgNMU-%P{$n7}PH3~8RgMy(&pN=2C>1z4Ip3N70H4T=IK2sVPq%7Ve6c3d$h~uQuS}z*l z3IRc^HC0AlKE4vrGgU!|#TxLG3HaNUC?awV^q&Ao1kl;FR-Hpv(;*j~Y!_?Oo^+$P zAV)aL?m8X(3r7Jm|LBpM=Z3HM2OZ<{R}M3?r1vn;o7=m|UI`6H0!gGu%?f{#@a2&7 za4=CT0HzpCPizm z;*_<**PJ!QzdRG>X^`#Ve-mIR*M_qL8{Y*fc03W{($b#7rBMj)VrO!7sh@m)4AO@?4gUy`LX&hqSjhb#$yPY2nM0&3Qe$|2N}hI!GBT|XkTDCt zHgFS1h0^tJUTTdlqek}~J;`18wheT21U)Ved;S{z9PDmB?Vl4yLiJ{n>KEip6600+ zN<9wv|K5YYHdtT83n<&Kx8F7|fR#tbJCT&SJrbnhgHy=m5e?@ULD{kgijxwa&V z4(4PUIw4cGvavyuh7x-Tp)~05aq#oYDLr)n5`=AS7SdxVoUUg3oK|&b*xo$>)^LA( zRED^}ohKzdyjkO01A^cm|5Y<`w5{6{%zOjTLNAk9a>n9oBU_YNh?>#@P(oQp}rWzwSVKq-|R?8O8nXHc{udb zfMr{Y>RGyEFu zQ?nY|U)R~F3~-s1^o%5P>>d{RazFK;w4?~udW%W5igliDukwDP^alx$8qCbj9(!3I z>FBDl>lim1QexKYu-U~_V0^DhDu&{t% zFoprU4@ipwisz|D*4Z0xZ+5`!#La#CaN4A#gvMEJ>DOIdZ4da4J1Z+28gBGPTe7mw zfXHKRmXF_q-q!$$_k`RoIj;Yr;&r{1lg+|N8Ehmc!iX}1hEU=8Sa|rm@mUw%2#?(4 zHr$D33X&PH3s79z^a||9w!+cMG3fcUglzs1&7pbLU3l;OZsGj!vI(HildXP+3Hd2< zfnMk7ZQ{&D96cUm00yTkTk*HH_5E8=OE;;H{1jT@$-ZFn>lokqn$qI+H)YRND%pOZ zJwf?0+q9|;m+QlXR^IW)u*$o&n|<{i_&9ncAtN>Q-_ytYc1ne&lF~zHTg~+2i zz`eR2&m<2kG&Ji~QeU z@9yqKjRI@}9N&S7-{KrY6LcNG}-_;ko$eA+(SzFU3y6pn!@aS;KSh zBktFCG*NgF<_QMdY4754}9U>H6Jfbm+i|_J9SbX5mAD zlReo<6O7w6i2iQPwK%8x@ux@;nD(e7cLgm9`N>he}4g}d_P4-eERh15@?>NQCFi3dA{|g zsS55n`$`t5GUvJolD?29GRg(~UwiJj*;&$BdQ?@X5;?fLumI6v%~PbGWSQ{){LM}w zc5%1ey{ieqa;%hGMNGL=T}vx1$p#Pgaz+f&jN=r0$vhJCqyxhv4Tktl~X#3 z9)^`E_;=N`X=z)Ufm)myH;|;h z!hov=pI>cuIq+9)6EJdc7#iJ(0p<7kLnEuUh6WiT9Cfm+lKaEWejVUQ28#N~K{Xv6 z#>s_$1E#`hfC?ThLULTXvb>!U8|im}EJTi813xxt#@y1%(gIY=Soaez8hQMco?T=C zmh}6fAQ?@J)D$|}xC^-OJ=Sf-+_x6R1qqt}Kve|ArK`Pjb4;FLOp zxvVg$hb&|02r&_2D0L(%sz$#?fhO<#7y5+izwKJb3==p@P&5B8THM$BWnx@rUVv|W zdHKo1iVCf9G2bt660Vwtp%kV(kcr(s*4H(<`FSBZV;gSY3Dl#pOY&-({{FeNI z>Ux!}jKC{jR({GnXu>2WZs^WW7>#VpHvebNSU&z6>ZI67=PUxnk@jyVUrpSMR6MSP z_4s-2;gq;sOPvsqW|uuxNJdL5lc0%~b^#MLxys)W*!K!Vrz7GJ4@$}8d!yo$3cBgo zP~jV>gD8(4k!x?y7Hb?=tUj(TDl{1I3-do~iWTCe~+?aTLlNjQWkFdgs z7!~@MFT9UTJS~Q_4h~Bi+?*7-^6|teM%_XUDaIR)@WMW@Y&Sq>NZ68^5x%eHJv*=e zuKT0geu`q^*7#)cQBz6|MTk}-5P+;HOE;1~?}CFHZFuO)~J=((H=Shz|9(s9^hDf61f)R_MvF$iW>QV|lA z8m6k}ADUUym3tisxP194E40zn{dToL4oTHr(gq3VqVv^F9KyM&JsV->e}zX-RMPo{ z!rh={o>f_3^`1Q_>$3rW++9}y{_+sSA2a*UY>y0Ki=N#?utW2MVGwxMe|n{`SU4pU zY5i@#3`E~-_D3#%w?#AN)s?&!sr)Chb|}N!9ABKP#M3-WVW68=#S!`$5A|$2UKq}D z7|%VPk!GBFh?=c%U}BsyIT|Mum&y`RjoLIhHBb|jQA_uq=t+Kpo>h5;tBerL%%b=v z?g1xLq)$fM_QO?yY>%~9_G#@zA~Ai2fv4Er@2ZuVOVEA`6%+?C@d1YzR%brd?x3Dag>qk zQZpwQmB<8aXHdCEJRV*9&sBBQEwZ?9{ku-)3pQ$yIIhC=dU*r6NK@?gnxtJBu1PXO zTBMMYDW$OhBKVB{>F9X9n#}eisj!3+THanw>F{P*H=^gFF+2o_%D|~6Ep{TM+c_gY zhN-l1kh!*iO+_8^nM+)%lt0VwD^}=ER=Pcj2lO(zE8sLsSoaR}XzL(|zW4vc zn8O3vSPUP#2@?@2SdPIJy(PC!+oWSuPmOO$B*M?ZzuW&>->r0BykxG73hf9~)KxF0 zijb%qYlO(+jK`%NoY^d+X_@+1!58JL5e!nM@wv5muwSWZ&Y%hkktvgIYt4g(SP=1z zS%^zJKC)sFkM)jHQKRQ_=;;a`t3vE=2Zg#3)w zTJrUQ7U#Jo1o<2BA&n~72enQ0<%j~>;xbrCKrRrPwkEkAx$-lMp{K}kt<4NfRUUtu z5AU#uomDl?&UaTr;mFszb654bKB#qv7+4&{M| z^yJ}y``0r{&!&88s<{7TO96R~BJJ_roxPyM?-QHqYZB{V zRx=Sa$x@#%@bT~p*R;Iq<4cLFjwO@kub%>)ZzuQm3NyY5BippDelNT8yPRY^;O=s5 zvpc$Ra&1X5(Ur{ri)>q)2_$96tppY*Dp1i{|Hzf2!x`6jol2?BP zvukbVG)K|OPZvRI`D+uw+ED6}e|_GUbKBjd(0XQ8Rkn;}9;7WixUFjpgLWrpXJ?z0 zS~6ghigdr9=r+E)9i?hCr*i+UvCHyG*{mw=ORm87fj2pfRn}W11M9eT3`?bOL!64T z$40y1VZkIaTnyY_*;#af|JoZ+ll0iBthnREun!gKbJcRp=bs2C!*a4RQl-@k%%eXQ zh_i%2p!$mD388q|$u@t-{tfc55zojMuVNP0b=`>`dYM8rB(8*0qA|aJl*)>gvQq4< z=0i=QFj+wvB28B+NtpSpAn4h^9|C)OQc*r>;0{3% zbt+(5k5x}>&>(Ksv=LxkE^yZVM=jSi2u)N+p14?IRrQ-~Y-_3Mu3=+NYIa?zauAWX zEnFAo^z}4rjL2pF9_iM*^uoHL;N*(WGv#W8dY%vsLRtH*@1?%0tG)aW&^ky>PX#8D zYxb?yypMnrIkkEp9U&BGAeC63EnogtP}q9u2&egquBD|ltacZe<1*oFAWGinUUfIW zW9;kudyC)^m??ZaZzqo}+j^U6@cGLqA+07BTPb$p?NhFezfsBBk1ED{X%vF=i3rc8 zxsgZ`VU|Drym0`^mr4kd%w%kdT~D(!B_ZFBKaUaCyF4V=970+{zvdKfy zfPY%q!#>1^pF4AAyr{W=teFW81h_b7=l+?-11khF03E$f7%|*GsU=8rOk+zub(#C zkzB{nd%UcH(d&I?6DJ!Tn!{mCOpJGeI{`tNMn&O3;bcY~W8=c=9N-vk1mc5To8-um znhkR5s7l}Z0%$N1uYR{(&un%%YHvlL)%g3vdV62_wXt-&E%qldE?Zg?F*2i6MMs=U zW@|`yxyZn|f$XEI(A{`Y;2of}CRsQc#mLh46nF*Gi^k&?4#no08Z&8WFRbX1<|-)} zu(h)OyD+3G`^}F|Wqnn#G$r`E(7?Ui48JKzOU{T#Q*%GutJe}jzuM%H{tgRL1KN+k z$}0d#x3oN3zMKJ!|82i>(EkGXD;KY!x_YDMbzbv-L}Vnfqx%q63{hfZA?4KK_(<-POs9oSQ2%&B9frlzHf6+g@xV%+o_0Rh2~{rKc$HIv8c>H4?6ni~7w zf{`@`de(J(wg4lz(fA{5cg=Wa1^e2)fL(I2aAuE%+JV z?-^0TA@8r+e8|&=B#?QXv?w>HDV%&;C#_J5!-li_D!V>1Z!^VY@?-5XJbY~S!Ug(p z9m+6o#hQR+BqGC>jRNgG?esfr4eRg(Z#~c7!Op}n%#>Lo<9%PwZ@mBJP$#E>rQocr zE~MM7CWG&9zVH%^Y;0>icG_xc1%-?p7yi&O>2%&twYjvYX{mOVcGg)yg{efJ0_+=E zO$|YfR0K%Gz{&J!pz{m#n}G!~eJ+R05}5EWd9t+2Vx2!zdbfT3U72ao{smbliJu1Tu4CM=KBvTKKrS<*{ml4=z3@9P3%_Kp7QW_F3 zQ44D35`mzCIbiLUo0)k`>4lf>O}Z8BZudx;dC@Y*oXrbA;=AQjFeJRU`Vlr23a~?L zVSknaW9(8!;lBL*-rgC@reRa(vcX-Cjs-@qpvWJ)9%)`|vQZQ)@edEQppr!!q|%Nm zog}yp|G%xkRlbQ;L_pvRFRuaE=(E6=Yd0MZRHe;pxncEtj0Ax-IC|X4v7~YOibniq z=KAnoIdrU;_n?_9&HO9a2O0OP!Z+?n;|JNrwz>LVr9||mebBxn zufivoV7hDUK~DY?8v`gFNhHuz6cNoxu`U9=M(hw>Q58SWA5E;R{zc#f=B1TixW9J; z+?dR{F~b9-R&RZQe~tb4??H_&NU;&4yY$ePdD4qw(5TRrF2K&G6B$>RB@v`;^ zrj!ynw)sTB`|WXMOC6(1(?9;e{LxGlRPtS2%`=we*{^s-ut%?+sAkUk}aQx8TvV-p^_zjGPpk`=ya8|>bIskS$ENQ z0YaEs3)JSLJiJIf6D@}zIyBBe3}FWsU<)FDHd)1AY;W2jobT9zhvp59H3An7B}x~|t_tH5p6 zPz!XRB{_}E%FW-m=Dtzd4tDv2jEu7VcgwQ|-!7o{c&|jEUv-uF59%}oH%)eki4LUt zD=o5Db|k<$wyYAW5=p}*y1;lqlbMa}Q;GKv-s=p16QML{{DHZ!pEhjcH>t8&g$4dX z&7HVj!31!zl;WcfRZB1*y2iLA@LA82UulqiIQ}EKKAZpYPqg!CBB?Pe!~wIAswqwa z!SW;4^6d~3nJ4-;QE(Y>9p~k{n^J+eX#NZYzx}PoxAXQES}0KT6BNNL6bpU-FCxp- zW9H1;UobMBa!j0a^$RCsG*L{WDk|>*kf8u)*VNYw&h8^wg*9PdAw8|4c(WQD@UV@UY@XQC5fCX{#V9o&Wp14B?R{jwyAG41P}urHKg(O(ym z{hakwiJtb(86mF4C+9D6T9xlHztl;2;20P$lJ(ir9(|K?PCrOgJE$q12M!(?C%L`A zm%fPpwUPv!J7DUyrKJ5+>1RCr!~!`m($@{<{IO)3nUxJV@gw1oVq!pMkW>J$C&)+@ zB4w9Lr#9)^rnrb5MwldJ;~NfU#F7gFNvFVJ`01#nxnjHAL4kR>;v%o|y5WtbqYA-O zf9NSE8b}AZS?!_0@wzs$S(yB^Y4kozU#HaB_{^k=9AGs`eK>Jdc%n+_X5D4Ye&jIy zYG(&#jCm%sCVjo~c(fC{%iM{mdwlj4)ws5ot@k7X?tTIf`OEyU)0_aH?t0f0GK`%l zBb2~VQSH%nX93dH(~}*drY&f%mb7pd8oXU(L6*WIT_C>cWuRJ$m8|E6BA?X{!a?aa zR{NG83V(x=I??DwOF458n!~&gjtiNv2hGzeuKX%dyby{tRnjaMYxL=5f}YSp)mT^O zKbYlMH8ypnuYwXXQxw&0Thro`5g^u-u;^r?Nhs|tLlN?0yTCiW1RzxoJp434vf7Y6 zY@>Q<8Y-?_Q=-P^F<4kjYvRUU^Jsn>ZYW%+N#liPN_5n*y$|@{QDM9@)p+5vg6Gub z0gR^{ofepNTo&onGv@yQy;L-VdmAxds8`OL?WT?hNnOy)qzhzknnX?k!7uNy$Y-F- z<4aa&l(mo@eL|&hrfGDRqy=HLtzH3>h3bBYtrcQuFJRQ8CAG765#ZxH^xc3NwOkmN zrVjS4muI9AC-60X;bfg-{$qlt#j4MRB15VJkB`L+RmFe4B>ZHtnKbhK2IZiMOP5z~ zAs}JB>dkEV$1Vk;R_2A}W*jg68bH^nZN@rwwnu-|!R|Z|O?j1fW-Z#fN%N3Etz9r@ z9+<~o&!Bh;`(O#tTktr3l1(=m1vBsLm(?R3N z|KskPqb%vZEHf+3O53(=tJ12pZQHghZQHh0Y1_7qdEc+QXQtQcnbrT!tX%75hAi;R8l-un(!Ui1iVDb2j#Kn1z_j6MAwHBA_7*f5{TB%AFsZQl8HACZg za6cO?JmHL+{AB_R@XRt1&~Lf)m8fJy6Dw8k%EUJBh%cV>>Y$4K8B}R$FVx3e^tG4w`}9y zB8d$QFzALo<;Zq74dz6vb`4l7r;4na(O&&|k05Lu&8p=E2_b8GLp1d)-QgD$Rg900 z&qlk8LIdT5Y9QVU3Wu5MC@0o7jQgS|WoGA64LW+Ewwj*`(U{nZQ&xX=%YbpF_uCy# z!h*aJshY~?gC4BI3^_wc2pTrSv7RSX!Rnc*>mS`0#pY}zyZC88$7zOH89Uxasc`2% zo5_5Q(acOVR}rF$2c%)933p;Mz=7NHA4HN$!5wX*=^`}ps|5wg{z%3Pm3-G~ZWvXv( zuNUKMcmi6JN}cq!mQ?;L^czOHt(I&njx=Nus9=az;!n_hs-o<9XGHDJ>mEwxB->I zu}|<=v3W{m07iFk)g^Hj{!Y>cYxmgTzVmL5aOEn!G=F)~IM(3#{#?c2yhi9Y1jI_r z+0$^NA=c06WiUf)3KcRs6R*6q__P$O#pu*6wj`!`a_KV|G9O1bal_%lHD~odSX^!C zTC{IZAZqf}e$|BgjkdxKi`k1a88W;S4){u4zi_#;N{p%9Pw1Ta{jYw{Sj$_d#`B#Z zk_V0l2M3?~#k_ojfStuQLmS%|IXXEQ>s$Y`Wouvo4bTTAU?BKsi-(6^%-qV!*nxmv z%u3(MSj5=S*2tJ%+1<{VfL=|`z{1$jiC)Rs!0BIaNLuTg8q@z<8+m;PYexb=e|ZOE zBXdJ1TL%J0R(fGuD`#sPM*>DR20lLe-{wY6X8&x{OBkD*nmPSz6VSxgLCH?v5O4$$ zV;6HnV{r$4cX}anCr5c>2Vq-lJ6juL8z%w|dPy5VV0O0u#6{rb;A~7UZERx-*dZ$` zD<2>9zYobR^Kz5d5=9>+WcN6erVLGls8AV{P!9m_F=XlKV+TZoQb(dR3rP^Kgkf=O z!h8obsY3f87>d-!M60Ql?quhprJ*;Vc?NaiPHlEc6QEDSGOL7@&6gF$7jI8oy$=io zIMZu)(F?fjn;f&8=-eH#G~K6QJy*=4zXafK2lNc_dw%$L?UY<1V!NHU&Gd@927&XfzC?g`Yi*-r zwmQCMjrOuzaub2*R(7FbzIdPindx0MuJeEIu-gd?wc9c6^KWp3~0by09roT3l@L`!dp@4;iLc0 zi2%GWE8k^Ozi3IO$s4$OhWSylm_njSyD|dy&++8H>1RN{mtp8cm^TAyFL3eDej9Ay zlMlZ*e>=*;5-@Ty07jwsAL+r!#L2<-pAy7dvyxQ2O~l9&)dLeK{|duo0cie!t%-%WIn$ZZsRPT?aCB2LuE zFiai?6a$tcLc}Tu6MGtL`l9V()w8DQNu#3Rs{HNzonFP#I;So=f$}C>XLC`-_tO`k zc2Utz^94N)a3WN0*`__qr&!;1R!A1z{IUj!)P2m?f0o$bg`QoR@1CVtGhhC4)*Mo? z*k*{h9&lb-%Js=p`U&)n*=wnLz<@5wh>4GK?erR(^C1!#)1%ed+R&gBk{`e8qpH%> z)@IJ8y!^OW@tZp<#*;UCN=<80w&ZQn_WPzJ<-2VATF{ZU9w7}l?{X5Y|0!8;r@b_z zIJ{Ssz^)RlBixZhl^e(3@~P0AtdSW{?rUh%)%!%(H@Euy)$7WR2?G|e4g(nOwc~}Ic9WsGw{>* zV;^4*v9+VC%lm4h4dCqDr{`A%sdM4dVLFw0`sg>kcGouTeRZz;{iesTva*5^I}(t5 zr43ByueSW?#=}?N_Qw9a)z#5~UHaQ&5GDlX*Yu80Pf4X4Q(O&J@ zwN+<05|RHhm(tCWF$oV3f7YHYTQbdaKLK!}3P&b4OD2>yNY?vX?NhUiEk~Bp(js2q zEfhmWm6G=bg}7qK9~VF-zFO-*ka4}q3tDZZZa;JVJF7e!#1a(q@)%6wve(d9{m;ES zFJA0fdnpfpOMij4Hw)I~^>q!vquO}&)G0H!y4->Thwr8r#B@5FHeyel|7|wQbqm0} z=ggP{{VXrnC_R!8$pQEsbZmcKp?BYa1@?y7Oxi7s0C+Pl7b^fy6@b^>wQI+wx@PhG zDL{K05I3k-Os~gTc-!j3G8Oq8RP+Uk5$p^?JtE)SxDFE%qi{4+*zJ+Nib91>dh;cq z>+*Eh*V$@A;;kE3)|AQpYv=1vdn7_CY{lfN-pfai>(>ll_hoI@w%rzo>_Q)G?n7W|RpskIrR1l# z1|7Wpd7ch_&ZVqWfzPw0+5#sSFr4Igem;KR#eTPXzdE$6PpX9~G(yypC5}b^N!)#@--XG8X6L+)2acFwcXSLCwOXYl~e>6@|$N1^1iCDktg zBAy&ee=J8bJBg^!96!#Ibw0XCqfVg*oL!Z{J)pd1S4jSW-J7*XfbWJ@>;A!5z6~VK zMhn*rSNhx4su$n&qsOLA$_#}^p#c^hC7Q!CfCA-yyEkN-?SAxdIY$ACEi;M78M!Oi%%m688$@$Xk_4Z)buEMHN;KWlWu`?ZMb*e(dGI-WS z307d!U%wep67Dq(RW?{IP47ir0ViJ;Fcdqxo2DA?%e%wBd?<9Qu=-%B73E!WW=%; z6QH8}qJ#-sjnfEni?J-?UcCU?d$YH0UPlvYQazHqX`Q8^X9g@}Cs?@k97lJEAk)Tu zo28oXiJ(n25@OYd3SEajX26CIjMfGZ=!3fq%W=}H- z>Uyb_Z2*27G&QG;A(yNMFw7QeyVd|LU4LL$AwsY~l@!Ij#QvI$-jX;sx*<|w8PcbYQZXp;1eQjnZ z&E7PAVM~8Df{+44AV7Wp6%6b^^Vo`Y^g+->?UM4-Q7uO=NzYE?MTu!F`}RXL9I0Ad zX0TYfa_kqGrM?~1Yqqy|eCMU~1O+EeE54L6GdEjQ z=S^0EAiM*R*wATw?FaH6G-zzfxZn%Bx7a!rbha0v=?q1PKb20nCdv#g5s7HFL5<`TI8j5f8(;A(FfZ(&tMp$`%HwPDTIHC zaTw!5etXL07p~%p^gg`;kmK65^!i*cbfrWD&@QxtInU{8U{Ap??7!4&fZ! zc2aIJsaYJVNffQIP-L)wg+CKED~w7U1Z84qjv zBX~CdGfw=CSuTFb1vP#qUJUYEmBQ|##muKDFI?={q{>5PTR#ZgS)t@`7N}Gih>&ARNtu7bxv3MqUJQ*H>bGOi9iz*AmQkh$*54{k%m@jCV)k0gyP}vuoY$P zo{~Lui{>=8cBh)U|H6RWxLwmGg4p{Q9qk#72pT5%i_ke9pTSB}YNjz;aZkhV(wU(< znX!PSZ{`_EZqg)L5<%3oF--eQ+Rh^2l%!ZCsWINqW~sF?hYKl%EO5D1FI0Sg^1+@J z389D3o0#NU-nCDVK{DaFTnPx^Y18zS(utatQe;wKKxf&EMxP&=yOcG`Z*7$~@jxQnSl=X4 z_AsDltj~SqFRI4zG>7Ps2T|P22)lu-kwm#wPTOEbT=IN<8*?n-^CA_i$mpKdEyJ*% zl;*rhemH)yhds?K-HvM>nDt~@OeF#aCEEDChoNXj;4Cej;ZRyB;w>kca4n@!EO`~X zJ#WGdIss<#4_s=YY9q-wP)lf3?k}Oq?5CF$5mCsNc&|8CnJf!5#IL`d3H5)y#Kecg z*fp28lFAzIkb_}qztVrl(VU!=zrXLCagbh}g>0CFaV{VcjdvCfa@(ZA+>bnnA2LYp z&qaktCaQV|Q~P_JB?SZmNR~|%6?#Fu;wU&L8kA#Z=}(>1M=2k4)F`-xpPu%9KvRHf$ts|>?up&*L8Ljc5G5P!gm@pw(QS!GJM9MRJJmP$O!|k!xs+=uHopQfaxFs_NMp~SW>(3AX!E_ z!Xldw?F2VkmD$|~X_>~NQX!|*^nnUR2H;8FGMvycLqt^DsGK4j*)DVBpxau80AjzBWbhz3C{>D zo8yxeFESIHA-~F{0msg85np&9i-vJka?79##bTJ<76#~G>E&(55Gy~H1X#5s6pRnxz_(9+GDm`+t31!) zAH?Lg`OAW>M5)*T+_2va)sqIamy=y`y^HMcUTq2}yJ60|9&x*H;b_1FOstn^gd+lt zwMWMe5qt8FXps>vOZ--zWXsExS-2^j)|;ZV{fg7b#pQ?zZ|dw*I- zSj?BW8ijGtlvz@(z7`pv<3DZp*5a%Y!eWM1PIO~5{&eOAg|VtQh=pNMa_9fV-IAg- zQCc%27Ude$UlU%!S|ul>l!H|*^a2fy2p|}Iw+7A`L*LMv3*wQf3{N;h!gtu+>$xnP zz*Kd=jf2HDat_Un(Y;|OPAUdYLqAHhYYeZUxPc<@K-7E+n;G^3{X+>Yc`M6o z9F*A-LYzp5f?|C@f#YBW)B;SGe1b`AX^G1+fCym;@>+1%xGyv1g!%pAwY_@Wf&pXa ziSVbR#@Va{F2koFKP>XpG4Mj_dXC~Tfmx8{@I29GR}rgI;%q$Q1k+MYh#O|2_IfFv zjMKX1uuB5h>+mZf=)2pRJILVv1<-jTRbGP|^LMucJs38bl{i3;=? zbbT5Slo}%vWie_942L88iBkt0f!-_@e-+MC&yNDJNnFzWj-T%&8dOUxKjb{=@j9XK zQ9eI^eq8pnfBT0tMi1D7W3bM}CTBI#c9Yx`Oc0Tp;Yo}P7-#JQ+!9FsJ3ZZ+5Y!pHP9*pW_F%3DPKw2>} zZa}sAH6kEAt<8@5LA7J22y}{{9@+u6Tl6aMU z3fz`kS|EtPJRDIU5wE~|9h|?&FEhe)I0;Qc+?=*aT3Vqg89$k6X0{z^2_6(hco+SA zaNEl-)G9G!IMYr*&S4@wR-VV6Yl8s-=_a)eE6Y6bli|hgHoq-uOcnEskrt0os);zA z5$JYJc6Ihi&0<9OOtf#D(*N2@p_grd_yEXmEeVc)mkkAx;DLN$$-V>mR(pl->I?sg zG)Vi^exwY&79pC*A(Y>K9Fo5`ww)sthvis_>ib7oj965yuuP9wWotc61VC(4mbcpbRN{< zed}yI5eGiu=(sC%4hL@opr(_>|M3;vU^=w};BBp1F<`WcnDqq+;b&Zx$|sS)+;>DD zsQ=A_to)f8U;s zC+*^5^D$3N|9u@|JnC!&P(`&Gm0=p0!I}%!lLA2 zPIE>KCt?!UCdgo@kO;l%#+M^EyuZ1L{r+A65Cywt*FSsp;=_v-FPJ?#BFn;;9$F}P zn}EfAMT#ywC_uz z)KEd4_JCB`C=EP$vISc@RN|i~ocYxVy$?aMF-^TyjNOcXx! zXB08%I^(Fd&{t2ML^nrl>W)k8%eW?G8`u~#H)Q<_a7Ck_NnlC+g3udW1CH<;lc zM;B+=C*?_8vz->QT88B3Ym6hQn_(8gB4{hw##3>Kr<017bYd38Co3lZRr4)g_H$(z zEL`-*)BDp;Km{9rQ4pF!zjh&|um74*qBK51*G7TntoW6e29{Y*6=Y6{w0nmg&19h> zT&m0X=z4|B!C~nn*ItD(7d$vGq@%VBDNsHc#lq~L)`E=RHw9^-1P+Nyb01x~)M&)E zs7t1A zI?Sc%3}#AwyHWu(_c=z|#(()wIKs}?|e4dV_QLGnf|oF zSamb18f%0_-u9zh`7zCfn2*dLYhl_jYq8+vON9V z=v)ZjkLcX%t1AH9UQP4sc~|p|t?j+E_R7zyCu-e-DnZ$J_pGo}0J=oEmN3{_woZpV zi*&w|-BfbC6h%>a6skq2%JCt7|`od&4!X$==W= z$ewjoA;bgrgi~3C6)*PtE~V$eqYI$!^yd%iGeC#v>iYWGqYF>~fCUFhv?78h03Ar! zV>evPa4c0u3mxY8lBOM{0r`_Whq+Uy>$*$9k~3|)(OTEgu;0C=jWRSoKEAZ1TC?2Y z^?Ikrz~S@J3M5zRB_l_f_s5LpE?w|_KW^ts!vJn}d+v#}TdRh!azl%Hh;rzkWVFUwnUm z|H=D+;BDpM%Jg0{t^1KfZ+#t8oVvUMoeu<(OBA;5mN&C^pvIAmFdK%S4L7X?QyCdR zeo|{~4%>EPu(DfPhFbnslRR?0I=*#^+HQ`Nj(?}@#C^EgQss3NUll6LO5=34PzIPB zKyhfhSgjv$ngNv)4vt*hbB&phJ~4s9j3h?n%;?aN69~Q=e*ks$&9j7Ys)3n`Q{ee+^flHk6`GM zb>3Zj(L)Pl#`q_}m zZSP9gvuwLM#$km)GA=?YqD8CD(cVc-!58$PN^?ta6u911HDi0wAxuA&CPN*3F`qk| zJvv=$G$^AHp%6=*=a8D2ziw6^OVlNZ?3Pc ze^`Jow2TvuTj|&WOW4r=jmcN1U|$ReJmGT7aI`xVE@cO3;Zi znk7e?L?Q3WcDvsw(KHsEWi-r6CnSmj)H)`E$k0|j>t;1^KG4t|W#|*L0_l-h6U`eU z(c^9Et~IqDnxXP6C*jbTZa0&9^R+i`X?H)Kl0MFA%r&7j*Z8i5T6;{kTWBg<+EYy` z-LL$@r0N>~euxDvJSA${%yFxLa@rlPXnEH=*N*NW#@d9Rw3L`B{iZf_ya&3sV&Ke@cT8mWihhwsl;#ln-nT_P!LxQAhX}ApjSY!M41I9#Q{o%UTI+=Qx zmbi(@S%wJ|2}YKx3Ef43Xx6@7U-w(798*2Z21ocq=3H!$Ob!<%ov?%bLrVBI5#xvq z&)Ke?@<`Bj5cA{c1`x#x*>z320vWTkjOf)*HdB9fQ_O7U5!(ZoVEiAd{0UF@!f!z- zQ3SK^-!QDYlk+G{@j6-T1Nm?-!Hq0&0hnrmH~#GQ2&s6#O(JU%+O2$R`33|6EsM8S z@%teoW!vk)H$N~#v*h8#?DaxDnz%8tw*q3j+WQKR7;&-v{EUslZTVOug4uCNPG`fF z%O{MSb!GC>?;s&=;Wx#{^hR?A1B^u&Nhw0~UrLDV722HOuID0Iggk<6rjB1o;R5Qz z@RQ(lJ#x?WtY<_-2H$OkcB}+$)|R#QFJMx&UefC0>}j15r*av=jdRsRAbUg>qZz1W*vmH6ZbkUw5r zStKo@VTT*EXZ)S`HGeVQF5c z^y+x((dzi)rNe_LU%&_Xn1o3y@N6>3w#X9bXV5FHS)K~V+!hZWOi{hHk@;(Ju(09- zB?n1t#Moe$1GopXue3(P6I5Z zA5^!aGnRSjab0g4th`V`Y*C?Msw%SN!=Qw3=58SdkipO3U35_Jr$vX;{%^v+6 zW}HRZ`cmJGVF*=FoX(FIm1R6K%H?DdM?O~Ryp!mU(k33v|DMm@6f_)EBKX{ zR!c3$a$_Y>O(F?WOwq)&%VKxV7;(U%L&YA73ttsiZJZ*)aR~hs`D}+oDB=;&>(7>d za6%SAQIG0&Dw5<@PId~*#va?;q~du_FF<@>ay9_kl}NuhLxg`QZA`^M3mJx2Z(7xU zBx4N~uugCw6kUj>WS4+RqPXvIfkKE?@O$e{a2Dd=($OLq;HA;`0NI3X1jUJ9a~-$S zJS$CkN04Nk6maJY4*50}&l8ylNjOAOOg^6+`U90MB?srY8cqT6JZMW8&QsmxNipw8 zl8zl}MU&Eq+LSq*6uf{j6mY@*&^6NsNzd7&L)Z?*2S2p*mPh?LnRsPXDFn`ti|-6w3|GrTFfC9 z8dH)Fg4KJ=ml&|ppzfoQDEESgmC?$?pHy4BS3Wp^)B&o_3d4+&Q_5EkMVB$a+_svT zIo4i`Dk4}YpHbx4(AiwJ9UwYU*l^@e%5x$gGyGb$wE>t zJa+5_UB2jtRGBqgLLhM^+8YD0hJoOu2khsH$P5mdUcEB9f3mXMV8DjC)3al>d~{>s2Cgej4BEm<_w6AwqWsV_KcgL3j2mpS zJL>^NptTj&z|m-ixY1rjTg@ZFGq(9psa|zRKYH9ZPo3@{Zrza4@N}z)rjAah8j-kMD<%X3zT&U^m^`*h# z=a=*hdA}f#Vr7!8iSXg!&NCzk66Hx)A!8Q48X0Ke`hX^1EeOuQVx>^jfw?;eWWCry z(|gHySdD+cyqTRf-^&>4s_tVjIuR=8zPsd`>IKp zU`#a{t3l<5i4w$14T&_4t_+NoV&d0W3zdtcmCokbMz9rO{1CG^p>4K9Gbtq;Ju`a| zQFi#nnlQ;r0;yD|cC#HvyxIvtJxxer?C#bpA|Y;%8Tl1iVnhXnhC&|!;lt)v6mhq$*$Jkmw!l41+Iz*! z43wtapomS{c3=!+tybbhEMIa-=`k`N+IFMU!kg=cN1){JXBw|*?hQ6#J zbGX!~oqjOuwqU=c;6k|tOy8f1goHfzPi_JeW)dp-~*S%%uIJCa3&Pd*e{cu zNWzz5c?`dFhRS)iFF(~fxpDIM4JeCa(*j00H*`Wo;M9FI#p*m`TyK;hJGmhu5t3Tf z_bZ{+HjY4sJ*qR2g5MC{X0WACnF7Mzr=yZJxt~9XiBXA+1y0zu>xBhca`1Ge=C0n_XaX4rLf@e9RE_AX4iAP_qvOCfzn{G zAhQvuhp7Y_hR4#Sk&ai?V11vAve=?uG%e?C^xr2}0^&7JscYBAYA4a z0f6GPe-={b`#n(6>PcPDKaST&DFQq{7wx2k6QvY)tK4w8kl1JIiKm`u{2TOVft*WP z9cpmRE+?_XA57z@2i;JJg)Z}s5T>+F#>{Yfb9WgBsd3daTyo&qm-_4m&@ykMCikgv z7@~OeB3c`N_RENolcr&YIJ4HWFcWE{_O87<#O_%nV8Z3C8CZxENyMoqo0_znc~cIW zBpttr3PhhwbyK|P`sA<@B6%vD>Sgfw(Hs*=8va6nUNIy1!4Rr3*uzjVIjv@%i5(iB zt~6YEglatD8J8J!DH1D{fx4tQo3LR9rshBV;`9#Mhkv)_{AJx}GI zhxly#(jA}EHfc!%71=rM=YjI!50qUV3=+Y&F7n(~vb6-26FQ7@`6T*0M7rUMr!JLB z3M4H3{1hL{FeXqAai4oRRInXs#!pAMGU`3)CZlFFK4rx=Fk(ZpY4f}CW1k$zk8mH2 z$+nJ-3`}%=(=-(JjX@-oLcZ1=xWtAql(ub0HFUTjuT5;5qrA$CVXO(xSldc)RSS_n zn{90cwil9=)Pk_3wI=SpdHtt8n6wC`Ffc~4!hQrnB6XJRh$vy*duzH=7wwhdJmkI` z&()*HNGv|Oa;W~h`*ERNm|(r?8UpYPy&hk&Z2KI`d2y9*q}o;&X);#0Gn~lqu`^KL zGc{lT(TP|!ReL*EucTeR%z-Cz`;TW4NgGGE2pdhcCzCbp)QXr1PXL#HeSNc84*=+r zB?81)?341lJHr5r=R7^%w>+;uS4Q{%a(|&UaNvRDIbIGdSgUM5D5$gy5nK|pR~YLO zBHPG_B(4)e3rZz=gsGHL5f1onQzbFq=GyQ<3B#QIm<`9{8K9R9l)|H$%4n)aX|<>z z`SJb&a4*AH-lv_wpWT4R_fMaka)3hi*V*qLkE^!h7+mfUEUt(X*%HUS!SLf8U!9%X zZ~zeUc3MKO-7Zp7*VEcAjWFFW;yG9Xdj|<{wLsIULHw+F^LCOFM zdk}%0a^50&Oy&x=Zk{BmXXIk%s@2mdaV&~xU2`)TSLUP%K&*Yw#OPk9CdI+Lc%G7$ zALwJkifrO&1JyZRZY7QswRJa{u)IU46bQ`k!v6x&muXIC5G>C;JgDC~oAjx5lSyt64f7n`CW%B#-wRk%LFff1}I?e;l!Y`fPJ{H@eyZ3NQc(H?OO*P*z4-9q zLj(JO1W{xN+ReYDdcq!%Ypp7Qju?M+9^#e2hP)G?UyriNk|_#a*-jJ-u;RE+y>d3L z1b2iF<^f@X;E9oRf+V9%(%WqZ3NTGs$<^Ap8XFt4WrR~WsV8G&V;ieanJ{xzB&g5Q zaqO-9W|!d?l}b$kmp9diR!MRzjUt>Eg^%yxHF%H!*Z=&}iA?)DOBdl91aBWR4T#~b zxLZ(42iX8kTma-amGCWfmJy{vdBncFEKrG%t;bpNUDM-IZUTKXl#gjqnk-rapgGfM z#sRB3@w-KAGATUkqk1JS@uOtBHj`jOm9X~{U<&z#YL$M~8hKGx4|7RFgr;L86{9<} z^EmE{QfP2@7j7UR-3c#^2u9QLTgFxptxxQYVufj3Et(0dI1V@-y{asBF^W`_Rp$w^ zC}l?*L6(Afg^Q&#L&)JF@RXIl-VI1JS3rv+xk!+ig0@4K9Ap-?39SS2+$`i6geWN> zeXW{y(H*Ncf!J|1csm%rER^wLz0lQ&X6eq%&{fKGBpH#xLArHPpCaW6zDhW?&S>Bk zRa188EeR+~5(>e1%_!PBfFTKrk!P&lJ@PMsYNANKojVkz@ri`slt|q;d`vxPNcgo< zF*G&@ds!`{5@&ynTkqx~SNs>WdL(V?9EAC}s4s_3BfLJ@r`;lP?BH=(_j@Lk?;$?ctB@NLeq{gl z(Q-NSJ?ev8%mJWfpEK?1;)3)3uX?Ikusja1YAMpPrv7JxE1=s{>3?0LXkcpZ8ls&ZpHt z^7EFuy7k`isgGd3H-^&ffswm< z&>0iLsN}P%sFX@%zcP(ow&wtmMDlbe0$C7UL`}N9N8=!uLx=` z>ZCxy!4Vc23Ed9W4w)aR)F%jG?}#{<7g&MzyczOBoRaH8`Ys&E^Jh$M$^LC(opRhUGe z@>|q^r`Z%L=L37}K0ZRCc&lW4ZAtT2tSIClOAt%KO*5CL{miI;jU#Y%mp2=C=efr9 z!%twOcW9c#yP{p#Ci3%9t^9mA7_u-p`wZzm+r_k;U2Y#kWPD zy$e^fSzEyMhEAj00^l|mKbL^#e7jF@35EuFdehAC2(}~>#zCx-lTG2?_}T4yGZ@Gx zpd9-%|Ife1zbh80PkBo9ifNlQ|P45m>6Yt1uK2eTzwXtpp;8Uwl(yFG$S<`27$hz`201IfW zFPn<|Pak@;e?>W-@oQ| zwp8A$^{7&Ur_=839dzruNM&Da zT5RD?xilG^q+lDL>r5-0eWWQdE>e(LZsGUsfqJl@Vjrh}B>J@xtqBcG#e0cyvYq_c znpQPII@Z@^ZZc8`15y%eS|)FqgRUn|Y)F%YwR$^EqXzP?`S>TYCPfB(lk6l^w3tX8 zu_+ny#qh@-FA~u=>98SJ-$(FdhQhDc{W)>9DBW~I*iQ9C-mQK)J){?KUht~r|0=~9 z|G%K*G5se>9wR#&<9|wh?`21$RrhV)-QuaXSqbLAv4)NfZE%Ich{D1I>Bu6*KSc?@ z>K`CZv{if_@b!Mb_Wh*ef9WeXkW8W(OEL@B2q}u}SUVKEx;g-o?j>NK;oS6`=B&QX zT!#`MW@!h$p!0ErII(ehhUl?)Ked}^@H)jfI_I`f_ z1Np@<)$slI`wf5Atmj+q>!as^H#G59uGEpP^caQT7D1>q@mj~_I~kqZHaH&WGt@c> z77SRtT0h8-7s|bWit01x4Ax`y)9RNE{Y;GIqED%WZ4V8h?n&oyY3>K)cHyWHR(~o% zkiQx%KkKWS1;LQh^JR|V=_ByP*mli$lfyJZ5FffwRI?^t*O@wBvb4+U;(=V7JwZkp|IZdz54FYXU$p%MO#;3C_e^3E;D@%ebi8A8vuRo@o6O2C1es4LwV8NEnf84gh5>fN zJQIF~gfA<~jW`BS#gL;#pc14vE9k~i2(t)#IBJ8S*hy+3HfPEuNl274+_E>0P;96~{Q(S9_)=yqAj7?3mdg<6m83D%H95slBzr@Qiol@WeRQGk_^ zwjZDxp=TRRunqvvUTRk61n)wTgG}&<3@SFyio_7@1{&U|7qy%&+pVU# zMp0#>awY?TD98vV8qFK+j$s(Wb0g27KYBR99R|^OjSJKa00Lx)EvA%q_mZ4Xc?Eia=&c6=@85cAKiBQk9p=@+9O_>a@ zACyt9QR`cc8{U?`=*7{9>*o)xG}*!dUr9>q6#Hm%HQ_W73RJl4zhc+)M=AHldHT?X z3})sNz3HMDj6XS^I=wmYPRJ-BLVu)i<#DM{rJpG>Bh$rMXZ$u*M0d0w$h9*{P&bx* zRGYkGc}d%N61bom(`Fz{O#-a{K>4YDPaXUo`6^Z*T6*n1CmRG6qBe<4hi|1ZFL*^U ztVjN9^$%#EhUx&r;SW-SKKcpc`f!B({KH!pkqXZl37~!Mt1RZ%OL6YvMe2pQ(GYYE zyb(~{ESVvpC2|nG|L9YHJOEV%= zfWo;Ii&-;IQ_a^+y?iKjq2sbEnJGq)3lG2&Ugo~_hGTj#P`8ckb?oEq%mfS>mxWnu z@HuzaT4X-;7*8#rub)^gU0Kb>0yg<#PmAi~PK!+MR3_#10NQ=vb)o$G5`RWFE8 zS_t#)OeFeTv7{hvi}2VT_D*LVdGl7pxhM08H7FR{Q&z5- z>$&zk(TTL9ZrH!osBf?mv^vWJoO$iAABJt_9W~3>i9-4-vtXfo9kIVr2;85Yl1$LB z18vDA!AqgKNGphKaNZ8fJw})D;{$6iY5mJnh~qkx0W)Y1eyiUwuB;<871thgCZNb1 zxgIt9D1gv^DpnRAu=^|*OO!G$xUB!cC2wutdyqVrk zv0y(GYm=DOI=Hdx%@%%#CXf#BTMas7q^ zOiM|eqW7ccaZLJnVbJ%%kJ zxQ^5sI{6UaQ6{_rXT7gj}s?7TM669`mXvy8gI$lehZi zoyoYwquv!rBdh)5ztOK(t^sfX9TAN%p-8_+x{_-kUtn$`_13@$B^L>jnPg%OoX{@x zv$#2?vfLGBo6{!@%lVlj!azLLXt2*CMG#lm{W}|EnHGEX! zI;GI%hSJMHjWgRuGmB-|2C$xY2v%{*Bwt1tKoT%f=S7df(jEi@+a;4%U*fITUN$)-_5Nzq6*o=uvsd@6d@dv6zN@ zX~H%!e{U@>p+4a#*(r*sBR?C^R66+LHSE5#NC!+M9Fmzhp%JfNM1OAjK?`E~=7*xU zURs)S?FOWrp(U{pK%vPxLhfkw63xw=U0LYz_VM0 zdGau4Ae+KHv)>lx2d)Y8?ZZL@?vHK`pzLrb}~a z69Sn*v_DLw#SQ{)0PdutrgE_~%M7@M>Nw}PJ?EU;Zo-mFZmYaqE|Le&(a6FJNZZgT zG{6bYjx6G_yb|vL-V%%-MWQOkw#jrs-B`l{Z`go(^-Bk=*9u=R_&sY3m#~@i52deK zMWTe7zBhtBhDLQj77V)GEK$Az5sI8>LA?Se9vm3`20NVa3UL8LIHA9W)y(xC|5VL} zRddFaShZHQ3eBNXxeoP;Rk7J`ofcHWM;|~&;OPfWb4xu zc=MwoW&@HaT{xb}wP(XARqR&3!Pt$3aATU%dO&+wkw8Tt8ouu zvon86d)u0Zq!kB@b*YG1@fWh?oBr7skpm_sE=O;M*U?5Kp-hUAmDSHm%ZeJ=Pce

`((Lsi&z-5Iqi3L}x5Xg%r63s6uo@Sb?c_AS$y~J24%Pfxqw=mB@x&Rm zaV;)^Cn*U5`u-w{g^H9o3{hPz8j+MKGn2!UJ0UAt@H;>G21yVKoZKlX$vG8fLOOaT zhgWmMOQ#aT(*r~k8S5l0Z+m*{Xr8vCNn(I3*+ z6wWxX&O$}flq(8XIqCEsli{cBAj$3xbc;We3t!UMkJv-{+Wn7l0)ZU;t*qK5BRaM~ zS80UF5jxOIuF`*dpr(97)mHr^OfozuTZLht#Mr|-ZXK^Tf(Pq-A6nM-bkcb@q;w2#sjW+&R^Rl9M>ucJLPU}p6+Lo>018wLcHy&r*TUH$3R zkNzcEXH3Q)67RmsC?ps$S+?8{Y4&39pfLP7m)E;Tm5!&6T9#w(Hi|`Kz8j-%{Ip_D zO>Jr}C%}ehaA7+w=HQ`C4sxTI&9iVi>eQAvB%?XDBGVGw=?;RBSB-cOyx{RMt&=}9 zTEE@P*U4(Qh5iz4fGOrQJ>7yXW!i*ryZ5<^Nx$A{GA2;olMbSVr4p?#TToY9$=7?W zHu{Qrv_lMAh9x!XLt%VwUu)d0)_gB=5uFEVvbL7b@6M#XMWd18m(1^$XcSbOv~f3M z)BZC34!_&IWa}{zBeI+sW+FTU{cbltjQEkOt#o~zX>Zw)@c?6(en;M5hmq6Mma|(| zhL=A67D?)^K<85p*Qwgz3uV+SQBiGYYN^x3MHk-Rb=R9-UCkOS6u+#DxD;H& z+~T0_GLX$ZDS~Qs{SP-^Vfzde-cKM#Bwbn) zmzHZLOKP?~n3J-Ja#5Ojp@27XIz7f3=({Cb#KBxos15p0Or7wvWctyHN zk-l?$w{TWf|81*tMQg}&>3MbqNVt)RyKb>vpTy@1*mt;+8hRZ{Cic4VyC1$qm#e(F zyaM0lm=4%;EaD4tpzd*VtDBqLL^tJ2t*AKYKR}Gvgo=-`Og((Wt6f z=N8<3^*M{X#XI<$n3x2E8Qx;AenS6H(Dm^xx=+Ewnw1ddhZ#3Bw0~RQaL#C>{H#|RP;q0hA~_dcQ0 zF6S`Iu7vDOf!fZ5%$FLuKD>(qgb>ukOTl~OdC}6TxOs5<`}okUxXM_Sup@bwp9eLg zdcO|dmp9H<0v$kCg<&tS=F_A!ntB!oscT{4ja(!xV4E91A-Ry;psx<1k9r0K4ue5+926oMYepZE!f} zl)vl(9Y(Sf;K?}@V4})7ERniRw7++%bvkBsy5&8wVwR}ilgN`AiFeECs+*gY6WT%a zeA+ElNiO3QgBKrTP>fB2Q7?nPUyu6X(fo3BdHjsQk%K#%kGnv-YpgR)Wb|w4Tqyb{U&dPA&iy@DNDj;alOjSmiYQ67{jfs-#+OJlOS# zZQquzaL)(zHS_gcUK`)`U$kxmlmP-KL*4rE47!deID;% zkCg^|5sTT9rc@^mtB2P=S#}lXdLel#5%U@^at=nDAoDY#;!F`cq<!??iLx<Ml>UlnjF)-y<8*c~IoKV6O|MjI=(f+=veU4r_G8BkomMdcE zeWKNG^JBQ|Fs3`dm3Di=DM17Z5#cS;PT?vcDmKJwY&>?^Vv5y%&b6oWhQ{0&!Jfkh zn<$cBi4u4-_(JUU+*k0FAAVKpVd+)Upf%cAdbb(ULKsr=gXR#@+ivSmGS;L{JYpon z%EZ=MR8p?5aL5q$%Npr~(BZ-2xXkc=M<|_O1N7oTFhM2`<5%+P&mx^=n5~++Rs?)} zm{XzFK&1g36OXTl)txhU@+(q9QlOKBQgjx*4q!X>?x7pM_0kca-mR$5>$F4GGHq5N zW9}1*#e*pDT@m~#kpSf?G-z;O`?!eFu-d9CoIQ*8f@$2o9a=um+w*d@1K z24p;sUC!>e(W%b$NHVRKO`9XML*CJ^uZL5QfGNjxI>CTA#xv3pjM~6*+U&N&n&su~ z+|+YGw1@-;ys>uq#fyR^XRZH3+q}golUH_B4R)B^a@3Oh6@M>FQrEl7e&7AaxLNaV z8yIkH%b|X{BH<;Gf7^R$p;CV+6Lnm;%ofwIZp#&OPm`iwTa)Mc*xR0$qB?c)0&tNf z1hKu(-N96*{P-ir{4CNT`92VzgqIN_6GaevEV$ur95X)2z7LnaV#@J-tW)te04kk3 z@U2;yxSO8|K)({)&sOM5J?!fNIm%E@LDwDJtRvgd%3vVxFv^_3R0JYcmD`R)o0+&` z{yG$^)V_`~`w*>hnK*(f&wBw@_Gf=G!iI6@=JY&e?*$$IuG>4T3j(;|>Nd|VbGeL; zj<~5Aa5y)=+-;5pm!+M`#$;ko-%uNWGDB+g=kRVV>! zk7k{?@@Q^7R2{X49!zr;*JQqU6{Q<_??~1?&WVV{NzhPc2baCNNw;*Y&VJ3e<ME@ocldz3}++p}Kbs(jo*wmdCuK za&2ev9V@dD-5|pqxH6_G`hS<%bawLG6|V;mePmNs#;e1Ur*kC##?M_*MhWK*MVf_M z4ZlciI1gRNcH8_K{~bd&ElPw|GR!a)R}s5hSUklezf8clGnr}?1DkC$F*`$7+MTbp z41L0LpwU$WJ0dIw3Tfzdt01~KAl|?PkR9>;{+drtcQH4khpVU6cF(O6(Ad=2s$$cP z??;lJM5s4M>4dD!2y3^#E2&;0?ZAasP^PR|p<-%UgqeWg2#+_hW$iaG?fN>2V8`Mn zC*0OY(eXJw`(rsf^f-SxVjX=xgacP!cOXoO0ThiH06?gH#?0a-jT+E2I*SLxK%$GS8Z>!;n2KR;V~} z)@TVuylXKjtRm=KFD#z)1f@ydiphT8Oku!m?86M0TlB+Z^QqokN$ zi}c_{h5~~?=j9^MXIy;Rn7EQxZOG>n*7&R!$omzQ^pOPsYW{ag)aSC@(Cn4g7Re+@ zZnS2@&iY%LEHPifVuuQluQQW+UKcgYo@8N;Cq1`DJNw!O6erozBt&oF( zHD=Pc5h+&a4Ojo}(~dOpit=!|b835)XmbNP$Fo($iicyXE{-(UAW9mct*9(5a^d1c zlRZ^3zotP)0EaMU4f$wh?OVzH@TZ40DEvSbRBtQ50z#41$YIQyA!#g#075Ug(8?l* zaTzvwcve|#8j2rG<=cmDGhi7i590=hMS0AI8&sPYp)1bkZhBpjV4_#G${Y~N}?U8v5#ltMfAqB z0OHXK=K9k`e|ECx#$HxosFu4l`4F$PwWz}a+oLMSfuqa8G+;mIxPDCK&RV~nAadB| zT_W}xAx^2fUa<;Eqs;r+=LTrJL%x+9*GnLBIOPIOgGt#Myh%;O{5F9AHnhy}*YcoO zs3B+i0u(Xlf`gmU9jAMTUKv`YtmIA4DxVgY8>w{Yir5s?qY*F-soT%-MrEQ=iDku@cH?PvC+$+lz-c*}QPA)6`rg+u$eMHC z^QDQA#)V>^Ipa;dKMI6`Ivjg*S1y}fp*k~NuSNh*C!A{k$*|oi#J?Ow_S~Z;=nqk>+G@Yvg zDqIlg@b~cW+?LQ=)Zi{DQDO6^Ycdp>5~YQ|%WO9~{l;4^HR$}98*g1ImmWg=_E4W8 z+4b^kM!s%i<)xO6uD{W+t}tYg0#HUu;Iqd)TQ6ie&*!wwqst344XSAbjsooaLQfR{C#^%%i<8#JdKyOJ5fmp3|oF>xcW#AmDK??ItX!(*gG`yvN zy6-u+hF^19KaE$%`cRN4A$?SLi>4}-17l*ARhwt4PS)76(BrtTzc@02YyL#M@bCau z)zSdI#K8T0O}|meQ{3Zk0Bu~uDOzep?DI80&xIy&h|%rf!^1;t7XDoOdFuvxsp|so z@C;?_SV9>G!q$bIJzC`>pqPQaN*GTbck8^R5zd({56u6;fLXtS;3+uF(8M_jb4FHg zMgi2hJ#C3PbV79SfTKZ;2D=r66hY4pqjG5&*jQs@)_rLB&=H4QbBnIq`TQ0s7d{lQ zz=~Ouo!f?nDG@hRibSv?Gg(u5dU(H3r}4TA>-aS6l|S!d0AEJx7cYhB21>X!27gH| z5&mTr($s3t;B#5rE^;s%C&G)|%j8}TZ4F<|M-2@@i)&d5nIoujUqdk)+dj4i>%8mW zanPx;QNc9K=G#iQ8{m?ku{=wdaWO4>2Ce(Z&k533BA2=hYyZ>X@44so&QKtlSuP?<<72iv=%^ISWb9X5D}Bcho= z+slDA`XE$J`Aq$Mmt%+<;$}QpSX=6ZC_}zNV^qR*V64Mq%IK=;Ed{^H*r} zLTas^e6iBL#f)b8ua@y&vs#e6TY>gTl{ICt&zVM~^(^qgHRv<~UdPi8$K~g5i;EAB zn0g+j41Ab&$h#eY!$f(5eHp7%P&ej%Q!h`RaWhGXOOZVbjdQF%{rGoGI3-&Q2sD(Don1;w zDzRL3BYLqg^y}_8)r6xExi@C&3JFV_b=f_bTt3t}d0VPHK4uUt{9Vs3r?*q#QB$fN zR%8$#j4Pw_p1d#dvQhGNv-T$NeLm&?y`hhNB@H!fnMP+FPWt-?jJucCrgiNemJP`p zG?!7=lIRl+5|yx~AY+)3)9LWC_3|=P0N9wkqZ_$4^3oj7&Oo|HHF=%4#hp+*0#?T4 zcRIZ-Dei}?kHfwaB{+Q!&mJx4a=acKzE1ZVr^ZW+n?i`yBk)c4rSgfnvU4C6Xl=cZ z=kueToqs$oQ7SJ~k%s|Ry%6eTMD9U-6l2w|!YfmJsriM|L-rol)C=;Gv%CbAr#x@L z?f;(i{DVOkbhRkeVBmKTxysjg(qxJvU?vJnnV5Ra zz!Gyn=B?DvqL!g%{Wte}diH%Set9f=t-#&POEh7ZX4Rtq@j2t=+tK4x!@kE6GR&o$ zHj!5*zx{@BAw0gJMq$X;!xm4y!$0?4$CI07IV8Z|tp^=OW;&lb9opS%?9_)?z5<=P zb#mB(gO;qkbNi9wfD5SVB`QHH4EU!wc~?C6l6aV*(Ca?U*ORCwTV6Ftv` z?);u@SWR%mA*S;w`=3+sJM`+f-&Y(x7AG5#IhIRFY4S zhJLe9Z2^*E+TVNsz8(m${WwakjX$tP1^`Fu*fq@AELJQ@75_jVmB~`wdiLzvHRl~U z$CNY0vNh+6OmGtoAbkc@cyS?x`3{^|a2XUDN9!kl+g~k$B{eZ4uL-5%8FA0uE89!Z zufvtETWZr6=j*R_EBcW!bp z(vM+A!ao(U0-w_>6bpWHGvd#=e0t-!+>7J*Zu%QJ73y*ZZuv+V#S10-e$Tnv7&<=p z(&{7im>~%|qSi60@!rACx9+vQ-~Rqz%*7(9LL;^TqNTR?M}^1VpZ0!l)r`8*BLfq- zLn}YoIwKjDzMzUyb>77jA$4hdU=6IY{v}z!U+pY_cFYx&0fQl=rg7I5_nCA!YyTu(wOs zmd*cKyVlRli#fR>_PYBin#1q)FPn>jd#|+xmcg0RH2j*y1=C6wqf~pWLvhRLwBSyC z^)GUh$gcf{@B2nXcIjq;kLp?*Ru2AH4V{g*E5x0iM+amz7@ivy$&guvB`)7pSADBX zz-18-J7(2=nBUWO_G9%tq5r!&qfBwLJpFd>{mTzJaCIj}Y!SbTLx}U$!0lZ`I_wMf zkH-+LDQ4qd`unoh@4To_i4G>Yy!I6;-2{rECNerN4#l+ zP%+kJ*PCx+ zo$gVGUVqu$PT4u-;1En+L!_XuqDon^-gCwSE^mRW_=ALjjeqHX=nK5O{w$FnfUf(Y zf5=cuXc&I@)w>l#&-*+nJi7AFtb#!<*+0(NMmde%an%NT;~N!JJmO!y`JG_pN*fhh zd$)wGGSVjm``25VZOhEV8DmzZpjpxK1pM!7??0(ocjA>}E7iw`{S%Mp z4ZrnwgdN0`%iMMDZq#v`Cxv340F;+ z=lW=1h{MnGd->zutI#x4>@SP_EbM7qp6xg{2+YtWQs)qwaTVJWgRY0%Vz5$Ph(hM# zS#@rg_wm*SEXPra-{Da7&m(TlSZ{;I|IXp|a|0GJr-mJWge4{q{)nJV)8lmh0T#2AaoXe$TrBjE z)Mwv9awcN#j&E02hbEd%S{Om%Vh*pH=5*CWc2ivdOM4q2evPj0u&61=lLt3tYlhiP|@tg8vdkOz=}6=ocysNmbv(%z+~ z!T3iyxnlw=Ieq`1q{b*@(2P1ycP)(2r=(QRWl@T_VhNTCpF}LZ@D2#X@smi<0u&%Y zHqVm#m_)y#$`(Vw@8%DZ4XziHL1?hrY6}3E)*!RRG7SlN2#S~?WF&3h<1t0Kn#20h zOw_Jfta8a|_W`*8OgY=d$*t5tY_aA6T#ln{;V~ zl3J3)RX%gsg%f%10D55KlO+G;G2?D$Thl8lmuQ#4-GfG4MpB$swwqYcI%S` z@eAn!*c@j#K^>DsuvoC$BNJS%ma4A;(WQ&^rf{CIfHT(-O&k}}aS|2x9LPE@2U3i4 zf8c5lv&PoP*|5Oj`rAFw9D!eJe4monuKqO^80&|(z$Eqnl(4$~pn(wr0B6MMl2F5K z4@~YDZey-6J9%uf{h!SIgrErax$m>v2r`X0C*)F$X)O)H6zV#4;>_QZM@_*_Bi+dA zhRg%fn$<0W=&SmaU1KOau$VwoAT?&jBEz)b;Bq1J^X4jq0^E`BaYhjLQi`--pnG5& z6rq+>PB&eKZygJGwj|VDMQ@+^5C)jm$2y8LMN}E;%BoN`{)R2n8Oa}2q3r& zPobRQSkH(BL87##ceo4RH2$5NChsZ-{Q$(nocl3>+2r?c8$#~B=zIP#)}z6p-E1XQ zv}91j^S{F4T`Hib2R%1WYIw>DV*g!9?V84v=gult;%=OPUP6040Eg)(7^U$b_9Rgl zs6Z6rkU}{Od~AH3EMqSehUU_py&mIE%-4bRsa`lu6OA+fyL(W#^5nW-;nsq9gs(yECjalU_`&X1{+*ejyHvl7$*j- z*o#)-B_|)cDjo9W8d^2S4Q#}*vl9J~w}7U3`6WPGncEh0-Q9zn|6$pI5h)u`Ee<%C zk1Aj)z@tYL;}yK^X%f_rc)Jb+$bzp$xY~{Xrl3%W5IVP-;Q*c5B+rzr)lKR zGDgg}fm9_mr$RpDb3oN%l4g6$icc8dY)yu>ev=!{PHkSW&$||_KI?mK2j{z`y zm2TU2=K<2cS_PQ^<2*!I>RyFS(0yhorqt&goQ(G~mYKBeurD~lQlJ+1RaMOHOeqES zWP3gQHk%V9QJFeKy7!(wBXzLA9JOwPB1CfP6d|N<^-M#7m`lR>bdl&MR}1}gxsndb zs5!r?dEqSTRwyz3wTQic$PwB3BTT%;IpzR6rA#p)UKExes+s!PU)1$mp>nLjo zmQ54(i>n(cT9)$ocNO#bAo1e``%uhdtZ3atgQnLKr(6>oKPR^=ebaS3>xajQny0@7 z34hCxDGjBYGC8d($#FkW@Jjk2t&qM$FQrXU` z%TMLqvd(ipVUbqC(TXq`FW&2`Hpnw$k7{ z-{M!gjdd%7_QHp4roi)Px8#YAed4rRw?0`eg{uJFXPu;wehY@0jbmBErroz=ZT4lH5Hm{$>D`Hz$FkyuJ+s} zes^gn>-_Sbb36X3&ybIwrz5f3<=*7Oj{+TnhyC>~sCWObJ^PZu9pmG$k?53KO)(4K zkJka7x@J4LT!IYk9c|LuSSsz9?A7i#52uT+hN)0>-^aTxjy#*kfxh+EIJwnK`SLY& zs~J%xC6wbRsbx&<>Spgj&843X>u&UUN@E5<~wH-4=D208_49xSMd zEbvjFJ`e+zzvQ4gPU4&@-L8U()?u`Ax{+K`5k|7Sh*m+3Iz>$?aSg8|I_0}IglxPe zKn7jGEVd|inIc}b$eNx&;v*=@fH5Pu1`dFcQ}R$J0ZPr)(ZUjC=TJz0I%4~utWX%s zJXb+G2H~w3cDLdC`v_-&tw=T@QK0;xVahBUM17aPlb5Ob;I01r6Z<9QF!18eN<{fU zUKW@ckQIfsuSp_Xnl>E9TFT>gC zi``=s!e2!5hNgMaf_n;x`sOJM&YZP30=MFRr%?La; zhbco}1wAssUUa$uW=#ZcZYmO_C#SwL)>WGKWQvv!^ODz%kY<53Y7ZI26tbZvE(b@7 z-bpCNiWovE&Kf|1wrRGvEKhHjowul?zdXfn*I1E8EkIwJoP@2xtlOtOz`X` zWf@r47Xg&-$I97Gj*zJNfqr8VUYe>&qHnRuVNG2uAd7}gPEVBMm1s+LWXnZIer$E#{jL@{r3emb6-`l z>Q@4vB6t6ANbN!g-;d`;Qpt&x3dBn1tIgI{b9HgD3)h`$Y}KgtZ%XJFaIS(YI-0gO<*u74s{@Ew7Yg2isYCP z)X2zPjskyXjFf{d|pD zCBs@nEN&zy^e}VUs*4OD2>LL1us%rvfI~J2ArnE2#1B;jxZ6zw>XU>TMv`G(;vCjZ zsXPcGn>brn-Fh0I-1P3<;X2-aH#;P2*{+F7ec#A!dLN(kc0OwQe$90TpL}foZp=;E z`6%)E^1MN9e|XvXz@I!lylPYRdDZg%2h{cKdy~}K^jV%8#?`&J)v5|SiP*EV+MwEf zraoBd2kn=bk|NcYrRTOAkgTBDAYt=)yQuGvH#|Il&lr%KR(#lk&s3_;%w_|WrzNf5 zrgXK+e;X=qF3=&Wf16}f)7*@3^f0g8nxVBM$A0jarMrI$cl+1v-?!!D>l(cqsoV8v zgBnKqFwFiey{A75y7E@T2&2m^8f^*;;a_hj2Zh>ND}LN#+NYk!16g`nb{o*nUZ%&q z@^BC9bBlEmpqLO3By0x|RKRZ=0-um?exmugB?Eh}+m1Z5PZJq+zbQWvLmZ=F*Bmk-4W2s}O zS~*x1j5PJ$K0D0d?~V6{v^O`+IrAb8H``!~X?vDv(M#Y-K$8IL2IB-IdjTHElawoU zyjO4@zgkN%dr^;O=Z*Fu(#|IsbPs`I>Ln}Tn?af&hy^VrtPOzaPQp%XWygzK+OPAU z#J3eaPjN3HzwwR+=buuK`CTXlKHW=ds#p_R^GAi$1ZmLfP!kFQfQy_OO1X$3Wk|EF z{N8hwcN6t}e(`>$E?Y16>*zbVVR-5N{80?6K}~IectjKmyu)%-7m%@H4V6LQcR>tz(L?DUz^Ih5PMVrA zdDF8^%k^jWS*X1dWe$-1Oz~sfCDTeO*FIW4TZM&T9ut*;tdz_T6uZDUJ%KA)vrryP zVm(g0f`e=8_nNeXsbeDW1?_>uklp?C>u20*n<9lO?7tY$MFY_3dO^ualx$`imt9$o z4&(H^n9@Psm5Reyp58w_y%}9svNtZ;TGifAM{g|Am;f!IbS=nbps({;mi?%X%2{l0 z;6?)Jt%S$rqQ#c_`NN&}uGO~ux2{r6N5J`a2lUY!4Z|z^Y$PW6uok-o(;1^=YOxG+ zDr(-Tqn8?&qO~lHB@U&q^@gp(7W-#ksq$)ZbmMdoS8tV2K8s2Cnf0yypZfc8oT+AV z>_#Kd;U%Kt#fJ4PG>VZr>v#5d%FKv$uI$LkApKNh-fRhPpPf#~{TR~m`W;M`? zqi?+bO4C0La55zhtzxGX`Ta``(Bqo)`MDz}@bD1P&K48fr=#D}N)Z*dVlXd@k^>~o zrR4GR>vfLJZw8S?d@T(@DwxN?6kX;8Ue9zlPwgfB{3rgeO&@1nHtk&6cJts)#v+k` zhDv}pyD}s!gD^h;RzEUz#F|w~3yPXabb5VH#KLwvsr$HLJb8r2q*}BS-r292g@cPB zOwt12=^zY4$lkaYRyGc~RJD%f%q4+hU#rWgk=cTGz?JoH9rxM%x|ihhMSsAti*51z zCw8{-9d0FP)^#A{$gNWS3seTvfA(_8Y@+wTi&vOv~4_->}%%NRdk@lvHX@`chCq-C3T>mLgsV1$j}lhLe9iYq}dfMtL# zkX4vXXz@X6Eb5sjDQ>Oq#u!AgwP~x$n@R=IuVhBAwip;btH(EXAVzlP$1;8~m8K>| zu6?#)K^&45p_h>*5TQika8Vgx3xXTa3d#|qSN^JC6xIbvUge|$Lqo{|$;^YGRGs%q zGLtQh<-xyuXOFI|mHR$xyC1=s=0rWZqLJg&^t;(=$tFh^A^5G7Zc%hmcLNhZ^Vdpg znVyWLip7y;Qj-PSN+y&%YLkm8F%5*86Vx)^r6!R>x7M{3@H7i?TQ1*sEC4&QF#ozH z0O{;LhWkCSeaDvu2`#3MUZ#>?F^B7%U{l`{0O9cqxw$2wbBR1=ePmTd9u3V|Qpp}#{Nncl;oZx#MHlD2BkM0jMGBr;!GM&xU9<@vSIy93Bs_cbqk)J@XT`d?I zfp=l^T8W#u15Nf|8+3*Qyc2N(d8CeDk4k$xB8h~vmfiugY(ZyqV3%$!C+N2HT}iJ6 z_G9qutkNKkf!y?K%f3A{Pg#LR=usA(+dvzE}HR)$4U~c6*eajvmK%U3#hm z7KQuYfXG|tM1XE#B*Yk=)ZY3WV+$B3Zn#$$9+9&{0NgK3RK?-q4rQ8dlwcC`D&#Yz zNQRioC?jZ`vpxN9QNPP`hpJT0m%qW{mnNe6_B-BRA{q-`Tj%B;Wlz$2YwtPF2j4ei z%Qrq;bqdtQMFF3MW-k6}oUDY4L}d4~8EV;o9{sSe0(SXNY6E2y$>fCMLr}pf`smu_ z6aznQLxSOfWc%xoLQ7~0qXi%uKq%mwoasa`u+!KN;4L`d&}@yhGxJx$mv-LhIhUoQ zdp|P^-B@06G0(#Z>xF}zK4q?H9%FJFICS*k0EvWuIuY05qA(!%W?_^06}s~(@`@J$ z(M<@=dSxYLZd4QiCcJ_se4xZFrj;S{XlC^Y5(VJOT#jH<@g{sVx@E#|yd2Xe&4(z}UY=xHwg@q1uL$iB8otcXDN#7=Sv zcIP#$lE_f^A>j)SF;WZBFbW*S_;=yJokJR?DljZu8jd6w+iWDv33>S*SaexiaVR=j zzz{+S5Jhm!KJ#fEo)2|EMu3}w5uJ$Dm#-v_-pLHWU~X0@F>>6rXwI#8jPAGTMRtOHv0)T$Nse)1ZyUl$#!; zc%8-Z)2CDSIUCMP0)0WDCX}{R)$Z+^u>t{OVY(st)*vV<;7+iYaQOLqaioF07H5(| z(Xu#WB=rZ%#|yn~Uhu2YTwN#6}ZjuR=`c zSF~S`(he~xcD={l;%|8D_K*4>=QI=lj>8OQ(k4)N+Vai|$AZ&4&oP*xYCxc$^2icY z^7QkSD*n0+kLL&?vzQNni6KB}fGk394JF?mOU-f$ z#kK!8?f5JNSqgS(-wFIE@O_?;fR%h%{B3h8wYTWnSH0v}0E&?pG=+!L!dCk)oCjbJ zcPHrg$QJ7jj5R4!Kt}3cl1OS~y=NyTI-kMCzyhE%gfQwZn*RM9JuclkKxhGe|(-Xd~38(ftS zt#`s2<-?X#ZC)EtaBMq0Lbs2IfGSG_7 zr37GsAcUJ#)pnpb8?obI^(8g!@eQC1cvx+v$EP(hN@XPEA8}%q;Aoj{D&}|DZG$S~ zWM72_4#lm?ayw2pmY#iqa@tX*F9ytlVyrlgjfZA>6>PWXx0s{p3nMHZpqa1gbn7?* zx6vltQi#u4lu`M~%O%_P?k#I0bo02e+u!dN8odyNp6rcXyX? z??1hAXGE6nLzlxNPRc{D8V7NPu9{%RWge?Z|y7sn4q(ss5` zBJzVUa^s^WV(6-MZGwnVPVSj1)Vev(=BqyCAohbe$dzrLg3WSL{-{Ay05|qH9R@Vw zi*sP?=|m_(Zo$(+%rG|}4z(+*D7Uo72&e-MSgI@}$U36p5<-rE{aMdVV<0)zg)Gf; zvY~)E(-f%Z`R;mXa36q%HBd#5w!>Z-12;k@g}hhK%Jq2^=;X9{y0{-)ZoV=J2orv+ zmMkM5_1~8RC%j70`RU)f8H%PMnm6#xqwDUgr0rMd!XbjZXCM;399&L>jJ|s!gJg}f zGYYN!@1mG!eVASkX2j_9=an7T{8cYKdu$(fcrHZpcm^9nq!nx6j2C-pdk^N(?!B-| zuv!t5me373M50O*D(|H4c<;cT^@{jNb#-I}-!?YX(Tw!97Bv%p(ciT|_^pAA$@2y_ ztcJVGC6)l?jnIO^)hEwK_32b)=FfvqnEHzCdob;FAi>E=OK z2$_!voy{DPqW{+Av=vkX4+WC*e9iW&(z*!vXt9sE{~C2s`nZk`5FLVwJL$gmM2tj6 zDzlA-Xg`8D7~tgFTq8q0NIbN^gQ}nT3m1wHQxVvFKx~KJFxAQ#}3K{IPn-sEi$MuA~WzwND=9nioEzm6S$@L!Fe3lK)P3o zS@mI1Ugs9O2Hz8S;Tk=Qw2uY2PomB|>AhX-_m=SO!RUO0~ z0s=Ytdzm*SyRO4`tauAwxu$*NvQ3{3asyCPQ3X?GVFaMoFS@tMq+$(JM2Aodu*NAu z{^ithoE>H*YmXV{g_kP>)tXV)vxHUcXn6(sEEaIyX7=TBe>709;pHYzH~du4EYjpuvmWje>Q8&?wdSph|-db=TwO zwa0TAx=?uKR6{q`DIEDZkO$M7sLF0c0&|T%d$*sfdqgITjLRx}4+ zIt=3I2EP$+Dzkx%oAO8$jjeK#{3vhANkV$ad}Yp8G)@fZnY&01-Vm^iYUQKd?8}u& z7Zlg8j-8O+7uK}+4q|$4gTU(U5It(8Jvr*sGOl11xtlXw7qn~_ss}mTc?FRFqV61` zL<#yVU$$-AcD=G~+qP}nwr$(CZTpqgZ+aH3FOwejf6cuMzJ&B{mK0%#JX!knIE!~T0#Z16VBk{JwcxNL3F z_W)=z0n(O@FBXKrOzP)esQ|&YZ0=?J%j596V^5R1+T>~YJszi3=RUG5_J@sHOzBk* zv<58@la?%XDH`W1VL3r3Q;;KXTov)e@6eH^M!%{fERU7D(yp5L0X9Hocij~&7DMYd?9@WP8VPwLsFX?x>3GP#V%XJ_ZQ2|g2J(+=ev}T=S zEF%cuds)cUyr-Px2*Ut$cZ>yC7p~Zc*nqP5E}4KR6! zkR-^bO0IL0-ZMalX=;Rbr}x;9Bayo2MD-c}*Y*?M3oFgzg|pHDz{+O3upj8(PU(PJDx+_Xa~u%MI4A!R31V90?i#cnWnocl;9Zgz#lPT%w{x5( z3yE#7gs;U52v5`)Ro!F&@9if21gcblrb7&50#6A=QMa+*NDKBgC3l1zNLhRByqM&w z2dG*|+3RK1ezcJV+6_9((+q>W4ldcQ&o9X<|`-PS8Hj*WJ5-*tG(O^1%|D-(P3GNEi)(`>gWE6TwZpp6$F=gYwfn%{Q;i7df!V^?*ePJ z4l=72KV3OcsQ-QJIG!^#uyU;FykUOJOKpGdn|AA^P!vC%3lmXU-x5W{n2YwjoKm*J zt&JFqle|o3a7LZvcHa>)HoKn_(>n*$&XdkYWmHo zZU)yo-xYWPjGaDGETsr0APuEL`7H2!&542MlV~mc^C7@!yIlBQcx#Lsxn;Y$gSIdw z)wRJPsXgK}D^u&Ow(F<@Xehz=moh#bRnuWTye%8U31`oB+Soo|RB*-6jlm7&!@QLR z0D2=v8D3w*^*)AR-!T%0!_lDII^8+U!(QG2@0UREiVKbfhPyQ%YzaUL&z8a|o?}FS zD=a}9G?J_RZd=~tognlh-$kC*-*BrqC#Dpcms;!s$9726>s5v* zfJ8>$0iHx~nM5}XmmBU?zL9V~0Q4)|L)L&E2P(HgbtvUeE$k-JwBhUGQt)n$1Q=E-whL3&tMp=fi4C+YS*Q_Y&t3*6tTtdI@RkHOk$m&Nc=D zKYgvBA1b|Y9U5i-%grPF-uE&*DL%f-nqCx;X(>^WY%{io8Ix$oJvwuCc`r_^#H?#z z$}PrwcH4D^^_nWe16RWZ<3 zl#HAGn$BYoJ_5Q93A`+H`!%y{K;Q4ySLl@$HK9fa3jCJ!I900LwGe!zm>-W&fjQ%m z&@idpdxF=OKz3#x08Kw&K1JS7m&hx@Yn@G}A|;CAwZHOG8pu|v1vM=Ha(8Dj6R1j`hECYP^rD9z384Gz zHVLZ-;_g9zx+>QjnwVgokwf$SAWE_3 z2an}p0(UqLZr|)oS@BjEnfXBIAE4<&vue#g+H?Wr$1W(`OFXSCIYMf-mU+V*h?+i7 z9=`2F-v-9UX^J0Vn6F3RbbP&^AE@{M%TP#z7uBLJZZrv!XL{@*L_*M=)te98M)`R^ zGe-kIoinJ%mY?-O2o4y&AV^&lZDcQr?4-s|IgR77Z4P!~ zXoimEarmPu0v5{VoyThJu#y>qZ#!N^9~YXw`0Ac&%ptP-!WPNK zJn@0vX(^p?vY~dE%fm+>w{4fxcRf<#&DZp7$y|s00V(87112=-qbwJTGopvQWUNpY zEbSuJS%b_S;ywJPaLfYj+*N-b;)#VrdZ4*`6PjKr;Fr2i{wrOJkV$AIMo<*aj;5AM zcCC`H7`BVk*gC7(Io^LNyjqwgWQAj(Qz6h2dRxs183UP))wX&M8)WM~h1YI&BQ0EH z_U7yN5DDb#T~^~?9#9=LpO{?Ke_klh;77q*kXf^LaohL%Pv|o(;t}{YP+|Q$M1(hX z;bQTy;Rk%5Y?ylHzq-!OrlNGtE0HOjZwA0AMuk_W+0v(5!+lzdbxDCA3}BF#^MR$K zoH4QhV(*~J>{9s}^MwZb&M9Sx^r!4{XqF+XEW^dE0=sdN|jeZ|02>ohVGZ2fEkT zi08IUtXMWA)(>MC!VaKHP|YTyfC7`172=~Sw=TIai$^WLw?6!N+Z~hJ_djeD!-_o! z?OITerko^n$ZmtIBE~^&VvwkKh=+~l*&e!HJ=?5Uo1;g*>L(dZ37T65qhTcJQ!==d z&K3<%FQa)4R%o=;>@vio8A4!L7X-jr0;_>ELEZJUE^rm&l6Tu=wwJzfX1q!4pLIr1 zZEk5dBi=)6f9Dag7&y;?s6a=vd4VSyRh}cl%J4k;eQuK;AAb{4%0yq+=YCRt)ohVy4@sman<+Gn!ei73u1%bbLECX6aiIS8`tG8e`SI$zow}YG z3<*12WOQTpon+Ci-15*izIZrZCgMX&?DZ!!|fB!i`r+QURi7YYqZ z|#t`X@4i1>CNH!OjE!)6dTsQx; zb0oB!GA!U_hy z11Vl*yLUmqa0*-RHw-&po`7L?7$YZ?)dX|5q-?NIQVKR_Ce2@yjj-NcayHCmWiTI=rWT){4(@Pz~I(SSms-v8Gv$Dq{F z8fTe(a;0mIzwK#zT|U-W7vBxtFvsYloaRm&a`yP(*BxB=bD9|;=GOt#g87?(ID*@$ zUt#lR$jKDsfE?V-o}T9f|ry5Rb->)>P{*c zvSk52VIB0CmUJJD>+RCmN|Yz&%o|9h4(BM%j=%bpxQ4JV?q>5AbbQMY`@;4?pNr=j zt9JiDwP{5w&-zqA87MqO{ug8npx+X8W|2Id7{3`lsbjY3qRQ=I_>#IyuwJrPnAWlu zcHM|Ccl9nT^$q=!=QO~r$p;0>=Cjq#;l~fF_8fTCv7v2dc(G`+o9Pf}oF;JEYs8F8 z04|nS@V`(IF96Rezb6pX97h%>{rWLg#|1t%`NP){L2w$Uy9B9bDvmg^K=B}^n5e_d#v|J2MWKz&$wh*u>6+HBbB;0(q`$v4_n|orv~sc1NUk z--yxp{Q>8sWv7setA{U;;?Sjx&gSRw`r=w{9|2v?5F)cGf&~xHsiCF$n907bUeRUl zYtYO30esaJ+66`zqLa=fx}1^O)YAFK%%Y5AaoAp3gE0pkD-Me)73K$^qR#by`V-tR zl$p&(xK)`{NA8GHPQ>bm=rQb(f1;ao#N#UdOc0lq{tI3lwEK7s_kQm{w0E@~h+*TP zb+I4OgYYG5D4DO{Ybg-rnSu0<4N~1Ih45+j2w39G4VB59(Fpl#2N7owI*SaN(%+O* zg@NVOutdaHL7!Yx{4Bfw0~a)$s6~$m1_2YRhI1hzNB7XD#ogZ;8%^mY#xg^w8}J|$ zGR!u2%bc=B0jOzUQSj~w4h>>Fl?z?(L@b{lIsgqy*k?-zT!YzbDDC=cu><|U1IIi>PYGhUD^+BEs&XaLx>K7Ss<`01@+D8w!{_=Y~D!WAB)D^Cd6v}A&O zvv3)%4ti)Ld7z@KSGStbgSy_LkTNBA5C*B`QE&Lp#rJ6x)$zl?xgX@p8j3E)KmxVS4cl$&?u0xfa1KjCWV&LLgHE`%s9+|!O9)K$H6JI)P#sh}Fi6i`c)M`S|{Kjb24aCFS&3`Bu_bfgid9qwp z(oo-#lkE#n^TZ>tEy^~pSvs>^cFeRN{2+}7>#WwGO-c6)NTgV#ggc~Sz8iJn#+%MEf)_N1b6a$IJyhAxSnlbPdfN5+x zCe70y{E^A<7A`Z|u&EH*Gx>bV5Ld&@O6DEEo+C*{f`3O9`EQ!vzCBT28q>NCff+Hq zT46(!7l{H7g!HUaNABYEICN9$k8nn_ucOO~(5!jhcP~uF19kfs|E05aliS0XiLIE_ zKNSzky9+nuXV>nHkVXO+{WNETTsTl3wvGtH>E_xjD5p<9_)3LXoXP(jfQN6%4iHN& z%N;`P#F|Jvh1j?<$4k1svRPIkZr4nlh{WtRB`+(d|`>5LP7Q6bp~|~fSX7l(jMtUR-uoJ8;iLnLQk?L z&1Fwj^4?4QZGxzb7BG;&(m>jHL(OH-sFwY$ zkEeDbOH>-$dy^Ar>6ORPQ(UeDAlm)^YI&uz8@u8w2>Zn_H3Pqfb|Tw;Lj!-9C1$mG zx|tI^0gM*_$n}zL<+APPh1VxUyyShu>83wuCWMSt`9^4nLU3(xpW02U!(_JL;5-PY z?EI1yoSxt+69tTpQQ~&qSX;cgDnV3#bO0zU)`k|UN20<*-fbKmwP&b>J9b!?`gb6k zD0Q|W{I)=L-iWk@6bTASgesgpUlMgzP^6u4>ZiIoK;(&G=k>C~0&0o;10&1c{ju>Y z=&v^U>t)e)_Op}xre>q{>9?U$WD8YHteIpWL?3O*;D}>rcli}z(|V?45qWXAhFm|B z+j-}A*#2NW({8-~VxHFqf{r+4l&&OmTHemAZysPzh2UWiJ>g@a*7QU--fLi5GEJ)- zrzj9W%BYn`>HZQD?BF6eFt~3qM;wHNaMpbLrO@pX3}?OCv9w_u1$^nhCYEBy#sPV~ z%M(kJG1Z9l$0RAp+I~X~grws{SisISa=~mB>4-;8bW%8l{_8tL@z4F?y2eMN=pa?N z3aM}!!IV8{+97NkT+=08Uf6@KpR)XreWA&#K^jP%o2ddh%WUZJ2 z*`)hpTCe53aN2S`)PQc!Y+oQ%vZ0&a_Mi5*YbZ9pfnFk^jTmt-Lwp_XvND>Cp~812 zj8wPi^UcjQ#5yu4gf4I|i`sX1m&)NZh%ddq)TVN6*`_fK?I>kV3~`+#7qRbSHl+6A>Zn?j9$OV~Nq~3+=4fws>ftwUQ0BAKV z!21B5t4lHd|28bMGN&jW4ypr^PYhZcsGZV0TpZ_Af+bRzLk%LBmUC&uQc(h|LO^EZ zPH2O)$w0AGh4~hlrb+D(K|O`il~Mnc3Yl1=*O~BpzggBxsTwczZJs(xq${w6=f~5a z52LjlgEu9Rl5bPMFm+Bv>KFBJJuM!yNH%GFOrnF^K!?EO5%!=2J3s#XZ$y2_TpM62 z&6Q~XP7f^Y!y>BVibTBytZqnPR1pS(fy2b>lRm)>h$>vgD#BOQS=}(T?Zkbks<-vs zL9dLgP(?RJ0_>g}ir+ybGP<9j>2`q?WuD6CfqS>e6d@qtQOL0sa!BIPYG8l!vlG^N zlSAh21zv1dPjX}&;>rGDA~`)rIzltD+_6JyKTSXoEpg_>5<=@tYWOm^4rF^(+k1&3 zqa8mBoO9(8W~`~%TBuU}Kp0`wWcX9OZ{241%os#tNNHs~{x2l&5I$CzO$NpAZSf>YS>-Jk#VKJFV!v&lnM zBcm#8Y8xws10#l}DDpf~ z-@jJ=+i|-Xe zyJO^)Iu+7AX?MwU3wVOI?}uL?P!bp|3ux#i3YS_%a)rtgLm^%X%@`eI&nFs%%B?ym8d<%8XH=#%4HKyXYyMH%s*g=@zdXneJ$#+N%UH z$jbhhrW{mNbi7JM?A zivg_gN_v}uv8i$YCVFA;TaXMjQ9<`w1~#rSO`q&{A##)TL~1qZ7ULVG5(3Om%??<9 zS4k`Gahlz27VqK18CkgWm9&OF2xlmJ*njO2gYWo7KU(^L*1QeCfN}@2xS4!+vW9E+ z620(~RTwnHMxAjdkfrKj<7KvqcxRD?cvltl1J>e9H-e?flr6quX2v2ZO~u)jPH-8h z7^T_-v9cA9r|XtwUlbP<(!hq4+M{!_(b~QV@~M`ChjdN^R88YYP9yH0xnQ<0^wGd~ zVE|~`7%ugJE$Z>FPv^ar`&Y8Di`J>O=W+~Wkq|+99N%HcS7v65xxYmFyerWn`K~{e#0v|3I#k3EA7OFP>HjJ6b#E>k(snrZe47~ib&(Vy|Ve}>3 z3jXbN|DrOq4mV_AWx8$(Br^A+rgiW__dD9Jr6fEYVPoo~?U*3~dpY5zcl`FDL)4~F zw4&unitXGml(n7*-0F0i17L@A; zi-7$l{S3B94RC@gAQ@3K%6GhEEtwBo=MgCP6(Jwf0m@dmN0Eo>{W2e1l#_hfDCusFts!XP3DbRERnNpZvHycL5c2I!?>1?AkcuKNqB4YaGzwDIpW z{DMXgtHTfWeyChUh`KvPnzTDmop}InxQ!MRyS_=(G#smJ7SwVNghfH@L&^yftcgr? zpaowsvUu~k|AjyZxoE`d1^H^Kl!kalXB2rM8n&Vg&0=VE%C6X;>E9Zn zh+m!@r8B9%29$9(8vs}DJqEVlLn&x8@`2`W+SLt*1UKrO;K`9bxV_vEjT_C`QH8_C zv~H0<&7#-cQn2BLs4y=4y9zb%hbVkn&-tt;($N**SrZP8a?}!pJY3^I5X~hlAzU%8 z`rDIdBB;lH`i)XbZXi|af|pS?gMi(!&0M!s5$|Z|tQV-uP$GK$`@;w<%aD`lF-Ws8 zY~%CyUA4g+2|~@`7VhGXo9bxS=ViMWhX7FRLk^J_ClJcBejVROQ>G$Bo~>{wXI*G-t{uH#}R|Pbgg?pAuV|@UIbb3FQ>K^4$!^%E)ww8Ifba=BteRaRf`y{B_8jBIdDVxlh)vZX2y2 z1;2jAs9|ZM$8DhZ*cHU=rn6$8W}Hj8;<;sre1XGgkd{hui+z^Y2W_P}(mjh^3`O8{ zQXXdyOJk(&$y*rcN;F*WP7^#o_k14)C#axL_IsaD@5_E)95u^s>eT(TGTbt%Kjm9C zq>7t2qL3o8+yKU~>&R<2N;+ZTRXy&kSL9F85h+raZ>F??O82jh7p6AO=-{Ow zoW&O#UysG0aF`y8qGlVZ-yd2}W(a{yQcNwM$?30XHZB($fbw`DtbA=WBZ)=kd)akx zhK}6eBq7vgd4Yq9%a@V<5zyb7l_ViDHefH2fw z55A3*9ftE7|8%b}9qj#q4P?3tIFw{Ogf>XgghB#7hry>582kwdqL<}<6fJVGzNm8P z^Vn40Q*=&p*Q-CM;V!VsUDo3?u9TigdS9Dn37O+hsre&oGS7*{Qq>mKYCL%-TPr3|?={kxoq%E@P#i&l06oL5|nG$j2-hfWnX?-A+42B?g z_N?e}Jcslkek8Ss@ig%bC)+*<<5AJ%1|&mVfQ?Ieg!?tGe9t}X>D=$5csPI73iG}( z?*>zqoUCZ;_}zCAR^cJ6(BEygdhF}?rlmekho?E0VBBkLxP8J~*|1810p>`y z$#n3S#zUk>fPYzhN zCqO^(e}R6STR_3uaGlF(v}i`3GR8ajUT~_j9w53;|IMz~f124d1&rIQ$z4j6Mo?k-+%)MJ>LIdxIq^5{n&2`f?e|E(H>*gVYC(G z=LAx~ZM)I&+Rlu}D+S;lPi#79&tSj?_!>|QbT;i{jzcbpomAs^u;E)y%`5bMo~ieF z=^rMip*6cZpJ|#+R*Lz(#WeE$=Di@_GnKKmfWtaeM*-{5DIT6eOe<9lpQlIB>N2F6 z#KyC)s@=nnzu>7hPKZHAot=AyudWFfOJyb4y*EtAu&}p>t0~-08T(TbT+T$+847VR2>tHdEvaIi%D=9%$(k!g-d|7 z1#HMC%Qtg(cnI_JTmSsV{aGBj2bX?8|5C$yyk4&Bwc0gu zTYqkArYaZ|J@Hr$xM@!b%R)y?P&`xpTGB9=6R44y0Wn~so!O58Nm%?7QeY<`oXy$H zIAW@22-hLx!Y-fhgTRX0emV}2Lw-@40hQoX4Vkd-L%8AJTzWID8ptXrg~?J-CKk2U z$Gp*l7yGr?wCIsxKs0T<|mN-*yK9F{FSk~x8nPd^*p*&!r;s2 zj8+cD4(JLFv<#t>k9`~+{_nS{XD~FIaq@hoYwFPUcEh_S0?YI0MMKOmx`sq9S@O~} zQ2^M?35NHg4L>5z$<~r}ln+)*lKh+)%&V+Q?py1m-?=sXANI40iA?uHe{J(K4o5os^LTqU=*onc$mfvNVs3MyEgP?-yiwA-LfEgfuG-hnTV!9EzL zsku!*!R>dL0e7FmZ>f6^I}FgOB(HT;l5yH2PKP)gg(NJAMp3YZ61X0Z&{;<(QAMb0 z&8`~uNFvB*4fL64d5<XjWgG z$JthRb9ulqzMWo>ghuqSP;^wt3i(_>{IlGOKz2BMxEtbiDu4LvjWEcSC}a?x&2Uy` zpGC}?6F#vNQg1|nLR1Kzen`E*Kis#?9yUs01&$$9K4(8O11i33ez$?}dk(&$H*&Um zcf+5StZ%>YdK)?}8il_tZoL4I>D?@kL5&u-@27GzGU6k`ta7sgV8+skUfMPjiKVw< zS!Cu~Q$d}b$Ud#RM3zK*ka*MNejNh?J?S6H)$>m|o@F|uYoai=D7_3l1Q<;s`vi4F zt2RcgU!%18Gt4B$7BTHQ+40uB9*;dk*IU$@(HhCl&c!SJQ-kn1_KEG|t|qTS5JPR` zf~e_flv-c0%S9dzBcgw+6#R^anTy7&8NO6hx5v;~Qw9EWu6-dMMrdw9rFr|ys%SQ~ z&;)csN-$v@saQWrekw*&J0AnM(eDi-S%1`7kFdG@> zu{KORLreE9I`o8&^KcwPy~{G%6(0E$ z>B_C|O|IRqUoOTmo1f39j^mY#Szw?@@}=( zI=CN{OjMfTJy6F9S@XG$vi83VoUj(#v6EGM)wVyHR!g)=QQ49>uRm|JLxGnfbX6&`SO%~8>Boxx znfM@w#C9b7lpxSrZ4n>w$YzK;$)Rz?JAp7gLz9VhN)CJKlt@?RHFN2K+6sR{HRsd? z1p3>@?}qm=1u&6pSf*^QT#J@M$Q%qa9@d?=tFb z%UnLQk06r+Fya=v)g?70oWu zO>W_?>~XS@2d^wH;?ZTpb15oN3*$#@=5>$2Iq%`bfx`5Qw8gS>`V9%7()xhdOANK; z6!C!#nt8r~Tt=rtY6bs5iuqW0EYDG~?}1T&F0JX6-u}qG^s8AnfkG#Y1-Y< z!AD%ho-V#%&T)#Cfwkzjd!BBL_~^06?Oi`=)8uo}$Q0ewuNdYv*fW8zOPRV8uKP-X z8tj55YhpIxLw1OdKjCs6g-el}W1ce{Lxyj!W!xSUZ(CeW4UGvCU287EHH!U zA+O%LG6>M69x*FwEU)2cPjym)cPK;4C6NCXYJC$iX^KHedP+)3?|jS{xqEisUm&#~ zRgHYFWlo3{>`izOSaD1uXtl{sO$C*|Y9#>8W#scS0+nP@%(pZfwCx zV98ivgNaxrUun^%{lQ1$!;XzBIT}_oz-b^V1w7ls z3Ad^*#QSR9@kX+Q)soc@I5gJDfTM&@in-UpL35@xEks9tXsUd=HsBhtp4D^IFlnRQg+&JC=o4rDQ`V$i zK@m<~<2*I*Dz#U78ExpHjRgirq5Sba6+=COTR!I_0)3zQrK@eT~nW1i3rE8l1I{F1wg!dj&y%C``i;c=!nYAtbPtE`-f%! zLv16MS!Zq{o(_hWy6d1_PZRGf&yhnRem%r4^tz?CNA9LqMD`C*Ow7FPLG}REjGnmt zZ81*4X;7u0nKhHa+T=%uD$M}x8AHk+@ga?IZI4(10CsCxuUdAME6?-~#^_hCTw(MZj%jS%g4a+Hwo`-2Cm#2 z{?+{!Enp13 z$HL`vZBc%im&#w5o!frr>vRjg&ZSAWu@jbR^dKteGojYDX&ZP6F;U)eEL*{w#8k-f z#vH-o^ez+37P~rI?G;*+it)C9v2}wx$pol@}+V&Ow@8Ss<2FJO!u??Dv1NwSV#dfQ#Av zPh775L$vx|%RXdcWa0Qv_Tfynm%OqHMt|SQw{Lqef?#BE;Q>-a`W%5U6jMumY1m0J zGp|c#sk0@SUXghb=Y~1_(!{RJOY5{?$+Bdq%m{gYDEwhY=M;8G-G&KzYL8i((;TPU z-S>Bc*MU~*Uar?`?wT8%KZj`@CSc|%@RtLQdBz+9cJ3?SO(Q1aLlI%VMyfi`H`ytOW!%{CUJhb8iIori+P+J4oJf> z+dR${E@;CC;rwY#eVSEBKt64*FuALFwI-!Kns8C8COqd2($FQ)JOXkSN#J_tIy8&W zCTa!2;i&#RRMDk);F}JQd2qp5M4-7es13t0jRpes9e@mi-)soM>MS5_yz-4Cf=pZx z7{gySh>~U+`7JnrTXP56aGSaE8u0siY`$UFQYIA7Ec{!x%iqzVe7a6tTPcJFMme2< ztV%G1;itALDh@jWzG37dmA_B#zWM?*u?lhwbxDE`Z_ZlU z#KmCFUG+aLj!LW?{~|mnEd)~Dj3OB7f2kN37=eBNmUdFl+`|*W8yql|Z>u0zZqQ>MQJR*h?)T2g1-Y!V0^S_;5WCWJVw6`QSXS!m>3V!z0Cdy-P)fu{0NNU1$?h4 zWnMUi`ggYpWdae{UTI6>U66glxhqPBj%dg~i)$a9rtQz=S1qSn7U7F39Qe2G4>3J^ zy&E^QtHfhH*aF+y&c1sZAf!_twETQLF);6=Z1*EZ{`FG>TuZ zY?+bF+71vj@H$A48Yu#n=)o6c^iHgv;dN+shjrkbW~PtKu__2U*BE`796^7eJla5W zNUGQbtxEs6vcFND3O+1@2U$@5S|Z0(Qt^ct4s~)^oDq_RB@F=2CB2@#E#NyTk>e&4 z?w=RusfXr?M$qRd&)gu5uIAhEn=CuYJR1*~cB$6=FG$|Ge_4JQ-zirW$uX7hTqTZ6;IIQD+-sK4QZvFVJt15@^icwk&L5F`3nE z-#GCqBv*IHpQdfuj)a471w=S72`;c`e@pB+To#{!HlavhDjY$I@UFRYcl*-*O#3Q= zAX{VBl%Y*Kym171g&kC5Bv0PtkQBwfevCd`GH|m&`nXX!K@zP_o=0)Y7~wgjk9COM z9#iu^Nr;G`O<(R2FnDifz5cN*af}LND%ZnoUwa=~p^<9UCNzNmTjP!(2U(CKj8`K0 ztMak<(fD+8&=#%W*b+n8rTobK_?{{JMzL^QDNb@gS(3b#ugR%z6d=nWTT?<%^mPs* zR@D+tcmc*Wpry^yhf3}Vk)jXsdyYkH0I3|8lfWBv3@u3JUrPjUQCYj)#7OOBxR zr=9?mDGT+1S?1^oSe#LFx2&L85s`2E20njj>>lN4#xFlGJD2%p)%Vy9)dU zmaJWkHQbT-q`j7rn_Y)#0TXdrRR+n_nd+m`G znY(43^AOjDiquLgXLQI|>H#9(Q}0$ql3FJf{O!gZ59my0;33~1zfp|H;FGDbA0Bzh z9$7`}SZQO?)nZ0lG<_G=iV;c|vME$bq^_K|#Z_I0>#~OAuEt%)5y=#ag&Y7R0)YU#UhYqPdtP(R zXE`6UJ|N%%1osf}{YP3Ldwe^;Kd;+9FPm0AS6X{S$F(~xU9M}ln>t-qZa4q`3;Ib4 zkCiRI?}AqcLPKdnu33ztXn7*c5|RaJBvMW@p4dnf=9B2-wSEzwq3E9(_+Ji>lnm%t zMghv01%>|tazKs0#wg8v&a|@WFg@U%^5@Y`s5RKU>uW7mN@`u?Yj`qNwUhX(jcfEb2l@&X^F4F;0l&96LGY zl(3QWR$MOEz3G~+U9XoX-74m#6ce)9+~2|`eBXQ%|NPeE%{Q9Q1)6x39Wf+O$&^&( zY%-C$o|a1FR4ZwN>0PrZv>m()sVR;j`aA!Mdx1vkx=lx5DkSs$#IH<=Jx zPsq2hi4g2Jv)45X7oYm#p;eQx*M{fTfH=Qga{ zzSB%DkCv26E|ha2yDSo^O6d~qEiH9j6$R&74uK@ZWCfSJoNv!&N|dYaT00!3lsNyE z+sY!Q@D2N8?|Ag5V)iaKXYZMx9PIs_|Ie>|?zi?Tdv+eh`3GKq?x8n6`RT_V`==i< z?#jE~*Ej7->ax(8o2`oI4Sh#+XL0`?vMY$AN&LF`Gf!S-`2nT;eT=cE&VAtt<*khVmp=UMKF;FGzy4)FT^4=0crTA7kj|G6Cm)pMkjXyydRZ?ipg^Y~bl+wYW zzjR^$cYpKKSFb-k+tz_p_n&*iM}PA-081(TsSp3!KlmU1Hp}t)wX63&@VcijT#mMy zOj%uMLYZJZ=cJ`(l*W`|OiF9#Bgt$!)r2s@i1(h-lGE%QYnE$cRyT+Jx*VFen9d64 zJf|hiv*->fwUko!t>LRhdRblcpL)-K`^>>VUd%P;iBRi(+qO;D_p4QZ?Z)czvp4(H z$byuUw6k-6JfTgyDoW(9U9ER=DN9}CMC&tH)OlSkrW4LZCX^CJ8FS82${A-N zq)a%YLU7?@iYbzUq|7K)xe|4?y*fEwE)R_9VsJ66QchK^3RP3;jayP`h4_|0G(~z@ zgRENm%-Xqih@tQM7_;-fAA&I*=cJmG`RQtT+{f4s!w_Tk)@DLdPEzTVQwT0a zR&R+@r|bE2I-Qg>D@r+KEXJf|k#kNtD~@$egvCf0jUiG1lqnGsg;ZQiGCLhSU9FD? zGxWp2M6y;XEhU#O>tGEfPJ9c%nSzp+(?vh?^mSVubW>t&!>9-;x!?#v%3_COUGURq z7F5{Xdn>=}e(P6%%XBeTkz_)!Y>5&=DT^__`Q4|tcehGj3s!QX8D}Xa$`c_u_&`af zjAgv^Oeo8Q$CQHcF{R8%N-XEx_ckR)2`AL1+)GNEW+evcV#p~m5mSz&WJ=WJjyAzw zR+MKV&mHxF%WV2V3C$!=fs;_4ta>f|`~K+n^x^pPPkmvrSj5x5fB*8@FZ<SA7=0s`cF@>Bt$vF}ql4Dus#ABr1yBLD8)`ec_ zSx(__|LE}W$fYKeL(YQ~ILAXwByq;&U_ypdFpS>e5w!@>zl={;(t2oZQLx@vUQ#BC z=)@Dhb?K8Iy7Hqx^=PHojs4}l=g;jDm8vl#LMCwVRDaDkM_sLrLVe8{Cn6@>;K(1fA+7CVD zRuzuX90HLn`Vcu&jFRc35`v`Yo$qROmfX1}B%QwSBmVTspLy|5_jmSw3Y4^Ojl~|dsT?(f^JQ}&Aj11ICp%*v`Z&7yZ6D}-R(s- zipJ6!{4bMC5e6b4N;!t)GyZk(*f?Br4B2_tTiXw?-ngzmZr66zEGZ+B;g=&NQYOJO zVo%OnxX?Iu&LKUY%GQ~rsSeo8P`Gb^Go&&c_l45f1#9AAC zMEHz@`PKrb6bXJF^XRf;Ox}ARf-!d7yInWfrt6LIFs}3I6C9t? z&1npmy;*x2VsPFX=LS3YA8oweNe%HVH=hpxJUwdkI_tE|R+j!DH@~{0Tf8&4qPu+0+WZxca z_d7e?V%}9%$q4r$1cXM>2Rklm3;|0L(n!uAKrR?IEESS-#<9v+?aV0^LeLR-8<(1b zo<(U4-Z*2ux6T>ooQb}VX^425%xI=LWyV>dS&G@XC|nRSI%jAmOvv$GBhL6(w&YGU z5o6nb{&PM5iflN4_A{&H@^EMCB|X?CjgW z^UJ?GJn`A4DC3zkFY;Ob<@ddR>+rDnU;e@J^Pm6h)6ZO5ujXcWU_I+|cYNBq&=n;U zay(9Pmfmu+nPN#1Cyz@_DFwl51D$3(XtT78kDeMQF~`DVX-V3kBMJ9M@ELBwW)?E@ zSrA6F$UzcEx!{};i454sG`e+?kWd9bDXOMjaV|)r!N#C)hmbqYL`W`5u~mGjy25>M zheu07%JW}4w*2|`{!xALg8%3L{OZR)_Qc-aGr=7&vQ~M$QwLw_R!h<@C!MZ>Dl+GU z3ql3Bt>Y=1zqpV+Bp8j+-;oSGL2~|7*Zrh%nY5&awrxPyNp`CxcP*iw-B7zI;8dCoDD@omNa9oHFq_g19538NU{jOf4*9of%8 z(Y$$DhyN%cl7y}tqM-z5d!Z?3a0Z*hJLiN@O=RPouzWhx9AI_Mocffgb2&s8Y3BHq z5bnV8gCKsu#@BTeE^u6Ez{p|2CKJmoG z#~=UQ3(q_q%~~^}N(4YJ;*Y(Dy#7mHY<}Uzmh3W#JGfCcd;P0yoBS^qpAkH3Io=nP za)Dw5BZ)~GqA!@FjCmZ@@F|%R{`giwNzxf+)yn6MacfRXSyyJWS>GAQ!uJ^zDu{Yd% z-|Hu{;l|!4e&@G8{F%r1Y@7Y z=2~~n`r_qF&+K2{r%6|Zo^F#@rG4%HJL~o zEaya^z)YM=gtF+f^U)4|wy3wacgdY)B8D%Wv_JIkun+#1)uCWlOjAGc$(k`s(7wm# z^QLVNimIN?(aH2`bz{qQY+9}h#i%qMjDQTH2+t%5$x{s0W~C)z*;rSXnr704EEG$| zOGbjvF~3@`?RHIk)g^uZzus>?`TT!Zcf03tge~_G<4kJ6Jo#1a!G8GL-~4RzbXg)) zUbi$e8c5=thL~!}Lw4Pe38#X=Ww)K9G{5wxJf~E!P_w7z-c zBqx_~_~wXZrc&^32oqF;S=)vj$h@X2OQ;0-HoH_7EP5jOoyNfvchV*OZ-4Xp_q=_V zQR?iFQlx@Kg7q^tfLhI1KcHev5^Rw!0}$$l>}lqNDR!FNStjnJOFDPHx#!%D zL-D^$EP+eFs9+?dL^H2y(R4nzJfBmWQfJ9*LXQuVEC`w$V&+619jwTmW#Ue{r2Frm z?(S}_*DGUNlqWKgl7^IvO7nn&CUW1kBK-Ft72<^e~;W*ChnL^ z+TrKUom&W{SMACnY$8m-?WRmX-b>kKGO0iTutT0rsfpRftSjP%tOfOfRQgp4;CwwM z?wG5ZR&sl5tLuk#w+hMA5q*>tQ1dXPYR0=EtyZZJG*tk9s#Yl*m3v@+&8RT>4 zn7A{p>P`3V5|T@$kM?fZVF@A-p;A#)7fNaj>G}k;+2z>|jg+jKJfG6o6VG#sWZ5Jd ztKIoS3OXIzyoTE$9>HpYX&_L-s9oG8#oT~QZu4tavuimX^3_18jy?T`pk6sBAuia~V{|`NyGIJ)} zxOw$>wI4~O0_vn~gAzBTr0?=nl6p>@p~+{ds2j54kRpyY5ub%3KBrl=vutjVJJiH$ z^xA&@$A6GQGl}dS>>Vs`x;SK(W2PCDTa*YzLCQ>>19{hbfRSYls(lD-B-$rcl4h06 zz|QU7AyCirnwZUAdzbfLBz6a|_jV$9SLXctgyTs9-F zC)VWTP#Z?x>qrbFxKzps#PjZ46R*X~3*IX&%+T&1UR^c&G5Wz%54m@2PJqu5>N2_} zrlZ{oeH1a!vZkqEW2K+aOp}Y=(XE|X+k7(xm0xK?ghF0Z_NV^H_m7Rk@o0JTXnCz4 z^Iq>$(`Ho=?;yLA!I-2uW;?Kn&RkR15Hvbv8a%^-<4{h8m{es+?r0OQtt3>J~p7aL(RTGuG00&tZqC|4BfJtB z*a4g@fv!Wwcy<=Dco~%0m?Gca8C&A+bQ7->wq@Q$2vQ5Hwb!)LEvSg!ki&~2M3 zCn-|rNmbFJpv)!TlcCR2jbuAQP-6&D6;w*-IrKvw+OV~K&-%3%eB7Ri*UEJk1*yuZ zaorc5d1CM8LE99dOG5mCa!J5`H4ym-9^4F7(U3?8R2OJ`%n^xG9MAxqLMZg?-m?#o zZw(W#iA(*z{=)0aN^?#=`_wZRE?jLJHT2X$yM+ja${?x=nL^?r=jaH{OzFgF_7*|_ zndGXXb|Bs*Z~5!)yT5Jk946Wen|SqK>i^>}zGE^GgotZ~;+sqx{{U-;ZJ&+M;P#V`cQfh~{HhJY^^BbkvrAjd5V;LO2CiUDeb ziR>XWOtMdu%lq$rz}eRla`#LB=3n_bpMielv;QM`wc5GquUECyy7>5~AOGL~>2F`Z zMvjjXVM!Hq7%1UMmc$s6BUB`;f#5V3)SIYlh<%tI4Wuzbw$%D?YWp7Y+OhxQKmI?i z48JDJ=IF-q+~m7%`*{R=wKkuf-}%rutx#UQarGk~d;D-O^(~VsTFbnr3Gxdl?*=~# zY(+{UV=R{SMx2sxg$Rp{q{$e=Vt&^9*V5j--hA>4NB`u^*7@@fJ#c*UQ&*o^-rn-iKlf$&FRumr7a#m*)xE}c7h_2G-S_&zFZZt8PB<(Aebq(LKluaa zD0P#1Vtjb=!qbm`=Gtl{y54h{InPkD^SPLE+GlSQcp8NCtrL=_Km{l}8Rf#9xgg^w z@_`3l--i?OnzEDqGfnCrdSvU`-etzfy{~&CWf#v^KlDDftbp(GGUu z!jm8U_!EZ*yzhfhDTGn_iX>EucnltVN+H?U1Wcu7CI&m6yE&oUOGaJ1Q#<$f%{O_3 z?rqq`=2Np~uBxN$Q?o1AFH_3T-Sgn3OaJ7a>PKGE^9b)>UB!mCJn$H2GDUiI@6yK} zd;G>#*EZak++&u;8JD}=iDzK1V9^N$}r^D{60NkpMvMbcjnpZ!h7f>Oot;of6UJn@C6 zkNaM=jZ+mBI=6kIfv6&Pjf@&{hb6Nt0BZzQh{bM9FsMDT9!;L2m4yLkO7 z>AKu?E{|CdRKrIxQqGgEm^X=gh+2q@5rjiXHMPUG{@ht7ysU$d{m2x z?T8kolw$R=QW;a)U7j2h!sZix{l*s_xc{y9J$Ucl<;PyX`(t18cg4=^e)1}?w?6W5 zDcI15e%SxqlTTiJ_N437dfkuO{orOWLCTW$O|}N5Kse_C6YnD0%d*JHSu##IL`7kH z>&$HOjVOcup$|OVu9~46+V=R^?~T%_)cb(^T~s79t)71*#!IrvbkXj2N5`w}#l6nD zn|sgPbNG{$meQW~8i^?)s%Gm!GC}_*^v=Bj6W3l@`@jg*nGGoK87^bRX7 z`6xP_i7wgc-PaBFm8Gft?b&qer17h!jUk@ip6nl7I)Cnsr_Rm}F1=6#usGuGbaz>aaFLKa^EB_atKt3%y^PgpE>o)_Ot)! z&%b58J}RWx+1g>EIK49uF0I!c#|AAr%<18^F0JjSlPY@1CoJZZ)vB!v)eScKz7KXb zeX+wZzTCFwesx@%_E<}iG7rJE-SIu=A3fOr(8T=U@Aq4xX5UPZHl-EgGLxZgPoBMY zb?@f7S+gEa7)*>9Ayj62;zFVn`ml^KU1jH>j^k_&o(P4}0KpS3+1A$f$@&%S#QB*& z|DJwWGshz7XyQzNbh74b!T90nQxBX!|G+b!`;8s?N1pdrL~`FWA+(?Q6HClu_hcA4 z9gsgP}JKj6=Lb=v9#lGp0qWc&Gdb*&`bU4 zf8)D)vm$9wT%A38wyq}LL5Z3ZQixP=j+p==mb&1SmP$JbKT{OC9}Gh}Cu4}ys%%qF zGTgNdhm1`hy!ZQG>MJ=p`ApjmLc6wiMWMUycx&r?Ilpvp{bSGjcyZ7^{|~+a7UF%F zc@+C*eSETR_73cFNvsPY=l`(@u&XHcdVOz65W~IGfGSr)7dzfEh@pYkEK+i zWX@Vb=(H*zrJdrWsB?gXL{${VxT?~aev3(qS&f6`Ddm>Bg7T)neB}n6RWEG`B(0m~ zB&9}6S!iucJDr}Y7Z=)t=TQe1ZT#kF2IuskkE9>Wx;g2G)$vKUTxJ_UUMDm=JC0<* z%t5LPL{i?uAu~q21H)Nrbo~m6qVIIB=jDU11Q+LL|L$#6jYs|KdUU{YDVt(e?!wb9ot7}bSA|58+aQlUyQG;1FtqnOk7xwm-tF@1T z*?|xqxggeNRuD=-*oYE4)m!xH1IifPFyqvBFV zC!7kc6vG}3X;=wq7$Z|Mx~Gqb0Q%9k|{>6Cn04y z7_XQb+GF3p^EQit#5!0!`qv#@4DVP zjBxLbKRk>fvEWl=Xar3JefYEha%DOq6@-t*VOp6{5*>WCkl77nzCD?$m-&?Wg}?GW z>-B*%C#9|nIXShp<9!l@r+`7Y1$H8}CJ4@TsT_cfC@7yyap-offdDGceUHgZLMnjf zf-tU_;5p^!ZQ{wh*tbL9#e`LZ<2A;I@+}))94Hu$VPS0%p}TxDG@FK zV%QEVI!?aB>_U8>>BH zcu9;Br9>L%;|k6zEu&RLODSpF^}e@C*D2+8-NdAv@xVM1cY`}QZjMe?U1OIgW?tV8 zs@fkZGQ;?czVD{fDIrnMhYdo z^&TQloI-#NDZJ89jgXR4@Utl;@nG+Gx$3&EU#&XtW3%qt&Q8kPnG|tu@urLG>&?U{ z-p!_cp$oyeQi`g>Ir+Zl9wrv*Wh)oH=Z|k=IWVz#FuosbYkiOUEpyf%nBb4Ef4-on z-uZ1mx_^9Q*$vIAXT*o-y3SjJ4wR5aJ&g^|IpSYkVWYT#=!!~BOrK@Is;5kZjEnl* z+P-W-;-CF%?~TFG9M7IUQ%J3ZDvKg|3UVi5!{8{Tg;E40dyHbzNWxy~Agb0#LTYK$@DngoZgld*6Fr!8b2+EKZ#0RCK0i;}-= zROg@l_Z|(d&pFTQYI`;_E^A#yplNxcmFA-JmgMXZE+M>6Ax9QDW*Q^lGIk??$|8oZ zi7}Up8Mno7^TxrA8#lXleRQ(64pcE?oDZq*?JziN$k}^t2cP-GM?U_@JI*!kD&y2z zTb8*07{k0=&%eYl6zR*pxNZB%pZ*aSjd6nyMo3YVit%xPH=`~l&WW?YDQr2JO&6=? zxKHhDcQN?G)rs{s7zd4gNJ|hB&S8+XVB7~Z6|<4X=X^{tY9)g6Jr)c~0-X&mf{hRY zHJvxsx1BvYKH0l*&0|DCzTOb@eSh*1DjqU?%AjIJ4~4ycPhru;czvENI8z2P2+}^_*sewyNJW6*>WNab~cf( zcP{$}{@u4_k{Agj z>(0jzIMXr4b=&Rj9USc4xOU^l(ed%vnNFQ|aAQ7O=dAMp?0j@C-*fi$PhYsrFzAQA z<8A(Wa<`t)GIZ_WEo8!Zv)(*L_;Bm9+q0kgnLoDdpLD?y#_Dof6^e3J6*7$zo;P_P z<&iO35DaElLUEpDG3m;tSsk2v=pI(;qt%n^D}xZ6akLu=MS>yLk*ea1r=da9kt~R5 zksZk*+m6f^Qn0TVMgO^f@6nV7A$fE-_O}*`6zP0YNG|)%n!#%&%R(3ot_)i0QRO2* z+$EvlfgLkmq6yiA+}qst-O2IsGZ!!3yt&u+ZPVJAFx7q-TnN#+fGOh+Q|>WEBB$N0 zbGwV%$InYuBXK0u8s|zO1x}A~R(eeQR@=9D?z7vlU;Yn%_5b&eeu?O#+18@2E2Y$= zDhZ=fu!tfbAE8%@^B-pw<(v+bNw`&}q^?xi^~-bju=oD>?4uw2{No?JDO4Pr0f{Q9 zcVI?JO=ZD?$AD0wXmq$^be)u(SK|EF6*T-M?L$|UMO_pFv9o#-B3E2ZszOlKw?;Cq zB_=M7qb*Yk-lY&6Rwkz4dQ2;2Od6Nl<+7|S`DAuz&H45j8VL^}kQb5*Kw&Co|v)oK{x@kw)Zd~kSh z`0UloeQ#n)W{BR$kfOoTh5*VS7=siFF_cN7RUvq3@_wx+LX=H+xU+SSf&A@Du>GU! zlq54)RuJbL=F7y8azc|<>K@ubOM`gb)_ZU7ZNeWoex~VG#kyLaG-X*9N)t+@KnzK8 z6cpWlgp9h)T!1=92I##ZG_a2;$aq{uP1 z%}|x9(z0ng7Xl+>QkQ~J>qCwnL4KeyXX`NyuQjWaWpnA$vp4tlyT0u^6ClwQ49?hW zU2x9%Fm}jck}st^se+f4l1kQhL?_EAVY?Ksw%(WR!k~546#1=_h zV1N;JcE)KWDKmq?L4k^b%@lh3TCn+SJCej%^}X+zzUkZV`PhdqKK?sRt+&0TSNkXbt@{#fiYjmhQrx60y(RPcPNDSBxvEfw7ELoqLANG4 z_`paOoaUHZKX^i&_11aD=(v8Q8-jK2=FRcIHuo3){dakC$dCr9uiE9 z1{-bge3buSEDt7heeR9(-e0?Z{qp5&&RZxGn=opIqC0I;x ztgeq}D30Q`gLZ@1e7FtU-a3D9cs-(aO=DnDvUc5HzqTL!*4Fl+L&q4cv_h=Uq^hFM>1mtN0%{WEG2GTI9#rl%j0IXy192~oTro-8=Q~M$H5?&iZKSCL*O|_ z0a0=>spWK5FfJywE-UFEq^gTa1tkKOrO3=?nrNX}jDkz%eb9yY!qXqTdi_b)js26) zXN$=jbXj;qVvOE7hT>azZh>tCwNz|A+=eaYlbe@Ln9QbhN<}H)n3u;*ik{I(=5>w~ z1LL5(J#a2;aG6HJn6-lvfNa;Tm7EI72WN@IpxeH)TeGQ;sk3Qkd%NlExzp2!A9(Oh zZ#!z1&Gjosm!7(@cWrfa)VskQAAIfuKlc~D>Qz1R-Qv{l{re}+61iRvHzqZi6}%aA zAvI?@kvOYL_<6?5LiC-9K1@nwj5Tdvl#)^!f{~0WhTOwi8+-_UB!v;~eA+)=U%$S$ zUN5`e493NroJYWAOt8)ayl_wi$pna!RI03XRrAGsiohpFRSGUusq4vf5l{*p%GuQ0 zF2^`2RR|8VtvO2>_(@StTsY}Ne%m8|@OhWu`i&;}C=f}b$vpv615S?8M@k{0>rQMw z+=ktI?;Aex#IG@xb!R2_bgXwWCfmk7`|P#t?ZwXaR4d9k9I_8q0KE&wStVEs!5Xg_ z#k)7ohm3@n5VhjN(8WZQELZEcP+CbHBAw4ppE-5@?799O-}@Hl&6R8W{klInUT&Sc z^6-Oi4irgdN-+e_Xuscnj8%+-A}QF(R>)QrRzD z`q(26d^LOP`sLn`Llk3>BzaB|>%@fi9wc=b+&C_9yxj#}ovixKQX7>R1cMu4tOWN_ ziJa(BI!Vbd7L%%kR3ssh3+^4_FRes742tBUkTx=BgD!ROcwO7u^A7lX)=C_&ji-z= zHn^xbXIV&5N=}uYzy6`Es!~mFtZfawJlH5D;~XlZTeE2h%9ya2l`duP($?0*nZPCA z-JLVevkUWD=H#1o%SL75!C6WW8LU^0_xM{8Wg(&FTh=8^{ zP8?&fx(+-t;+=>oGET};P3PrgBB{t_F`djyLUSf+I@waP9;eO85WVxHu1oLCy6;Pg zGv0XAm??(H2*pI_j8Z`MY#KiHsb4M9SBy{jz)$_P|NlSxt3^=)(}#zFNEFsOr4flC z97q%NqQAOW`y#Db4R(lu_LMI1w2_1ur?JLV1QdhFjcX^%RlB`aRRxoh2ti}?IR*%G zgHK1g2CaYy>=WwwgtFC%Ntq%!wrNrpx+t9sXSV9P&?k+VRH*ATy%$t7f}mH5ic?bR zI4O9hr0E>Vywrkb>r9qfPHGiwRzg!j+tm<5(3~#KV7=oUd)JvD8JQN+8Z#ax2-=Zs zkUUt+C~t@6;OOMWjhk%;+#-Zzj7P{EA_6NLJ=Tgw$0LwhJ(*QyP3QAcs_e6cPZo+2 zUe!BWTe}HQoEB5wUUpK7X|31GuI+}|M3WfSO;?se zi#&9e1Xs-_j1p&TazT~cqSh1J&bHlPoIhEukB-)MaDXdf#EFaJHaeF^1cP`F=#8*A zsmtx1nUI;QtO}aJnl82$TZ}3t%bmrJlq#hxIE(Q9sZ=6*lR~UCFg54B61WOEmUWGH zobhhxW1xg9Ddf^OH?Dn&nbi3`+;2WmmV%ckabXAJUuiRKC3wmx2@=9bp%lnn5fXB=F_A!G3N{8i z;26owxiBrT`AqLM;H{~5!Ny#dGRC-Cxh^Fsc_DdK%A82o*`f1{(^5;&k9*5WE;t>U z&JF#fz(|&L)8^z!;{CdFwii4PU4s>E`b0?A_tyG;a6Tdzy0N#vT6Uv^d^Fa%fJGfI zmZCfqcyJ=cs0vk9dOk0Tnulz+wyUx%jiW-A(|SjP_ajTKW5`PKLh%8t{Zy55NKP_V zC;{q2rm9fA8Q|Xl{N+N+A!R1H2mZ~x_ZhLuEt5L5?W!oth&;|?nIWc&g&y~DnvSjg zUss3!>hRe|A3AmK{ikm3-B_>IsFR=!ws5X=PLBr+Qh33sb$-1L>&Z~pqSPE)k~1zO zMRC*$Aq3^#1uYfByil^3lramrkMe0-!h)q5R4Bg?Mzd zI$kzo#F7T%3=oXyOmsd4L|7~a;B?iroJ@tqB#=$z*4-tz;#oo=z*l zn0G;p2!UW^QfLaTKB5E*xZ#qP9Oo_Q^2*1M$2b63Ae<9Pjyi+Z%IECj)lV_byh{v( zCLd75#LqW`lN4!DeccQE%YW-H|FeJotC0+Edh?sD>91VAwmdnucChn>pG=G$bfL;Z z!ZQOxAl~A%ShHz^k!g$>aqQqa~TOmZkebZ z%wUMMF2!3r_?Q3F|M7qLhyPD0c-IX|bGSl;&uN^=m_vw^$fkk1f!KU_srIvf=KG9^ zC(AE9^47^Ge*0+uW^?YIoi~5mn@)~bSFc<X1QvQmQCL~>&NUD z8QfS1a>4siN&rjCf)_b5r6mZRNP%dkh^h)Le9W9HO4MRn&*}+=WD>fl3zVN?n$+4m zl5g5_KEyi3|IQOF(D+%&qd1M6!z^JoSv9w({fVt9=wu)Gg2y{1Z$h+ zUdfw`6h)=g_N*RJ2dV@Q1Vjd8<%DoRIu6ih0wFDU3)h^5 z^^P*3w06Lx7$v+nJ(xWmDi;0VkZdAgA^+9?>wo{1-~3x3d__k?9_jX@4C`2D*lcB* zie-a{Ol&^9Nc)-p%i9l5ZnQ1Rs6xuI@>^Ba><|Cgso(kV=Rg0MYnLxvpUmpr-R;?8 zdimLBm&?XjTf4H*vM4xsY>H_u0@y7K@Wim{=gv4&7FEimEHtQS#7fVsv%@fO%nyZf z`>2kT3oW$9!8r^=j1JMS_Y#VSoMbTfj-2VcUI;NMO0DF&TRSs=0HoAlOxq2V@~SKb zYgen@$0USkyZ+#4wQ9PAnGd-ikOR4Z>=q%F18pb-8XZefNTH^Sa(ibgBvFN!Or^1= zE~~|2+a)yx<)O}rX(hdbr;(gkpK_QW)&bI5OQ;P5HA1vncLhDIYDZ$Yn%z#EE5(*_G=WRE%o%LRZ z2;$4o=K?JvqArCH>g3oSA07(M%Cbn&^<8Y6*tWg5zOJjWrPIZnD=l3}O=G$N@mX)% zljXYWO$4Tar}e<6u)1)|p5PD+B6v;`pVsAkdsfzBGLtdcvJy<>QcMeQKg(%ZEhZI7 zv`}(3D^UTu{1%;w!*&A z6lZ;zCz-8U(=^?3-L-?Y)*1^?BgAAqdUvtDJ~^DY zQ(X^S^vJ{hPWqq8~^X;u|l6YAZQ!H>EnU+a$PR1%;F&0rR z*z*hw5M$A17~Q(<5uzhE1Krv<@bm`bQb@q)T(m=U0UW=f4RLUOge#Y3O z_C7xH#s}u}>O=qHQ`fJYgpgLpT~VmnWF`b#uhz%My)I~332Z#YrD9qIrCCan3+{Z5 zDtA5HWuc`m#cWz=Rf0v9Q-Qo9E3GwpZ9%gg3jovr;}6I^Bo~NT(408l+_Wr;L~_$~ zA*8aDl<||3^}%u58JkkF*7e4Y*Z?BiO{oC8cC61kpOdG_OG=8e*7L2&)^?R>5Hc<1 zg^z>_PHY@Mm6lb${Z|op1Z)dVQjlnobvGSs>BV(pq0ug|T)NkmO*ufF~=u&J3n`>|;+p z@z`bLsL0Pir^<8~Oy91%OrtKi))N0JCKXdkDg}^B3MM4O%)_E-=oztkukLeEf!lF z2s29bhFz8P0BplA;S)WcVSD;Z+2KKkIb zz&^~OmUXW*pUh>5kqc18DBiH~KHYF~2dl!D8Vbeb!{2z}1@8MFJvurRTvcTWkIH27 z$wZJbx^57Hh7g2+qR}uIteU1ii0}H|N6(yF{MLs)+qFarVNG&IDpk$47`$w6P2cNM z6b1IN(m0l-^aKo{Di-F+y1b7iBo0Iuudw0%dt|uVb7zf!6 zT_|hCe70Q_HKnrDMWHn&Qln;^1>~`STuLc2v@%gO!O4)wbgPOfV&@6ATDSWLhs}C@ za=Zk1;!_XGbjIoq9*hweEJ}~KoZu5<+*y_*pDa8<`8g`UeCP4W^`W%Pgx)UR-A>LFagk|t{O zr9ix0j3$D6$OnJz#=(v2H%^wzp+^oD5io);4Q9M`&LBwx$#z7f#^g4GO+mSyikLi3 z_OWdOd{1BoW8cS!Jx4$siN;#<-7hWhmw)kl&3nIGo}`!{76A8%cNV43K)ko$rK2ts z*Nra<5n1ewSDWOIYY zGyT({m+G9OdKO*yasyY)+DiZQFJ-NhY@K ziEZ1qt%+^hv%lS!-L2YxU>~}wpS!xcPJR1x&iQa{6yWV}y4%MR%r^mgh*Wc6gT=ar zL-y4?xo6`+_?01ul~rMB3mf3^U?-X%3g^ix%94Y7LE>u9fRh_hP>L_VN6I9=Cl_{kkUce2f^a z(R&@paU-l1cpY}hSZKP!uR#2Ry>q|){5PFKbU#rNnz%$&Q*|USk9^JzG8QMu2zr#< zPxU7OG_8cw>HJ754A2bVk3TZY_2Ek2Vk@uJB-~FBx06s%l{dq@p)D)o++hd>sx7C( zGM?*Ls93_c%2CJa0(=v;?W6_KfDI3cQowHuP%0yB<4*La?$a8$lHSWj}dNkdcyOG}Jl=1K#BPEe_m&AN4#4xfIEH!s6xnmtO9)?Nb z0&!I7VRN?SM>iXNm64dzhrcdGpA~$^(?& z!}He*PeGOcA$&gsw4PyjDS$)yJ5cJGF+WPS+9tVDHsy?P{)C)IOUwelLd+%mMZSpmZNI8 z@*&CZMp!`xQ5pbN|=vEwy#$*IW71_BX32s*3VqTLJ@ZTYqVdNi@_5 z9zTRJ+uFGZ{a^erA}^Q1vtl-m<7DnRZr1w#9D0QsUC$PhQ05$HVqgkUG;9-c5&f=Q2<7EA0J?Wq>2ppP zp?o*g>ezj--b^A8W^)Zx8Fel^Gq*r+L%~}7lFe?=AB1i2^rWGc5Houb^d?u$Oj(HE zIDJP?$iuLL(jCD_u4Vj}K(}spQ#N|`8EbFp3JmXgeJ|Z?4c^>sVVqbK43DbtxDvS!Sq{0P_mU z|B&sf_>!#mZ4g7BoZzwe1^(B+wZSaTN;ij_k^cU9nA`?Vd>p5MGRJ6YM$OE%&fQM3 zP>UHTVGq3(;feW96C|EbY(DiFJX{jm98LAte>&SBSdxfbny+QF6h$UnQ?;WGtt*2b zmukf)mwQs`^u^#o+`&?MV1E4Oj~~?>g?$E8&B9S(QHc?|b{jgys&HZB1<2N4e z^=s)j20FE=a(YI$7tF6Mc(^Sk>_O+AMhOV9gb-B&>9B+pR37S%jE&q?9Qxhe*WZIE=O!uUDzb=oNL#U>oj?HcIqI2P4s94}RLolGT zw-q1PA91hUJMYdm4vC&h>~em017eiJ?Y~|yQ^eB)?t~|krSeZFbacJtXVy6Lp*e$> zVpwDFO`rH4yD^<@eh;);^EUqYFK?*4H)y*v9svgz-(zrO=WZ^RrjP z!mYO2wD@VHSu}sroL5v-#ju}9L8lYi8t^Oc3&xNc_Qw>{Q9(}+{Rpz819K8QWcq6e z<3B#=_;kM9qBRHyn>A#Zi3lk1mjyo!H4tyc%V#3+WNJ%eI2OKV@dRYvDgie%fK zgUMeR-#bS32iyxKTK~Ut7zyOA+vn9 z;RnNsJ5#Nv&*LBEu9UH>!hm=_Lkfwl6*vcAs4&DO&%z(vd&H< z@?^{>*}fnX@`3ggU zkXD6_AawzcM{$i5Pc>xveJ* zG-^n69^d-RxX(@x?;Oq&YzW>k`iJRR-H0Ua2XLKM~0nn+e(}oRGZBZZo8`)=lr@6OzuDm&r1=WOjrK zIU<{RO^7Zqi{e$3kKDE%)E0f92YrtdD@aS#j9)D5U7(KBPG5mG!U}xuFICxK8yTT`(A-D zV!TX4-E2nCI-iH-(F^tiMvN?4{ZSxJSfuC1=~`Id?eKR9Zr0ORq@()wuN_8Vwjz7- zBH2CU03Fey|C+j4gfYBX2_LG9z!Hv2XaU%YvNMM?UWR|ad$ODMp?#mTw%SE{ntK<}v|Bx1Gup+vg?lVjHjfcRw&EI-@*wWI3r!c66hJ4&h*?sH~ z<1odZp)NIoZo(0&hIIb^aOSL9j2aiqf~-g&*no2mT&^_3x!vG8k3n$OY!dC3#$TQ- zX~%@oL{K_sBn5$J9i4gHbW}X9@?kBf-yNb*iF;2SoR(gW>)E1=p!62IVersT9BRnP<0YzEo zTIXD(AYYs+Wx(wCWW^kGhKnN95-sIUiyW6`RM3jMgb38uujteOWhCqwL+|O^sjc-p zb{^N~ELD1_V26=TmP(O}wY1~yL`^UI>#?-MIL8Nu!v%*_&f?Q53*VQ^OB>l7ES=#f zbm5OHi(I*M+gvJAzBcxV_HYWU+wNJu#@5zWJ|EAPHO32kSLr3UV)*_-aays(mWTop z;;aZIB}wV94GeF{<2o}Tn9#*Lee3i_3qIy!(2F z6wc}z_8OUb5{_JOSIRrw z*dOqb0a9Q$EgZwq_zMB?EMPcebbJpbYs{f4w|@Rd;#?5e?t;kE`!lNi3+c7Mdf}ai zZKm<rOQ&=8G?YdwB}*3g4@Dr4X}I9J zVOb1XkxL&PcePBDFbd=hXH&`B96OO%f7hpRJy;)cNCq0Oap*QwRyb*n7Cmj691B$y z2lD-n0OmchH@olItj)N}kl%*&-k)d0dLmaSEsD{T zDE#P#DjdrND@~M@Z{Ux<4oM(m1|8Qx^X|~qq}~Q;Jh3?LvJ`nc;z1*Xv`)`?%6X73 zn~!NXYOUEaf_L#N5VDa|8?|kOaZiq~IsZEU2NFG-{JBc!NzwjVRCs9}mV_uw8Hc^1 zr45*2Sl%^`69Fmi8j4Af$w0>dTj6H9=qAHj6qW%xabhIXO3y*(_VaigzqoVR@zki? z%`d`GMYRS(*QgZH`_-4}`yp8iPn*h&X&1PaLc}@lTYCS;NE(rNM@Oh96_Q`8UDIQGdIJ=&2T6 z`CY)<=8BD@Gr@zaI`Fe490(4Ce#Wy7Bc@OQm?p-X#1~75P@g~mtSa>_!?|nNj#Pqd z&_2y$cfRh;oZ^8$!_GU-cL`g`Y|{Ob3+F79Jl5@Ecxf!JD7VvS7j{uZ%unLR+&e#l z6TbVCzG@LvHgS#EJ9lfPUMLTx_Z$*$E|0V42n8RPmMCyg78_0RN*8Uy_n+d0-L^u~ z1lFcHi$!N%m8j~93hvValc}Jspd&IG(II(h?Wk)B=m@?pr=WV1ID9vrp$E7-lU5u8 zp_iHq8gCq{j8rErEbUkmxh}COGE|$GM`U;>;E1T2<%Q4c6OanNn?WmuvSU7m4!&!@ zo^6MP##IU88$ZCokV=)cMBErhJ>}3AIM(l6G9$4WZsOJno~p!+i{Z$&R^!T!_3$?p z^^{K#jDz^LPi1siWIxEPr#a8$=X^EcZ%8#e2=iUMLTQc1^bx6X{d+>;cfB32OyLLx z-|Mpis$q&ri0)o#cr`$^yAlZ1MSRG!=-Zq|Q)%K1>g)H$28TOyVh}T-$xlRX>f*i+ zV;E%G8bLWB=IW(1W1ecP;wqANmeUl?Q-CZak~+X?*t4)giL8KbGEs$7(^eNAO;Zty z=G3ISSzTK664_MLlHM_PAAKC8_e*@PI;EeU4V&zmrVti&_@JIIW#l+QN0cPqL0p^f zwn|3^0d;VshQKx#9{eB6%EN99T%;a%g?OIzCEuDVC)ebM*v9LL&dy&KI>Q6yRN7SR zkhW~A=*J&Bck1`9Yas{<2Xi4OU=vG?1ed|5y=2wq3hIWMBNu(E zVLTB&o{HGL9IQScr}b#Yx~b^IU_m>}nFQEF-& zKB02>g-Yf9U4>n8=AZKV=wrGGiP+Hkscc{*BYMq1Y=>}caN5V*fw4+2lPu)I*apxmyy*H>HCSdK);xaJxD+th(HJY&=DAv2nvM~~WY(Ba%q3^M;)|zo=dI%@`(f!d zL3eK|zF-Q$IB6CbmW6~-7c&YWNb&WWiodXFy4qy8{CF`YiOPeJH{To_W*)A zJR)!?(h?hbGv<%@K28{?u{hOHBEo<;Q5_P3W6`BKMDq+wr4QqNyBPo4<%--HK8OC; zH9)+N9<+v#V5eU+-|9U|Fg9tyWv?rjP(iB{3hWVPD^6#`m6rk|_eQj=TO-d$b_hsD z?Lu=rs0c)686ybKaH5ND?yvVRm|KO?BPZ!n#)Y$sA==?EXAn)FV~HiE#72GJT7Z)E zr%m`1%|3ibNP+liLfTu%xnYixZwx8vh*`27E*AqQ?Y}t;gDdLyQQ`^h?(K(>LvDEhgryl?baR{>#O&~jfKp{FKD6Q~zXoSUHao4GyOM(QG zCO#*c8i?&aSc&IUj;lM7rZolsCcL#Aw#s+Jm`)=JLia#b_GhspFVk=l?P^d_uJ1$X zIZDZ1Zm%~tP@Z^#y24i$DKnt0U{AmgW6yfSS)5i9Avz~q>wSzGs&v|us36ka*1RSj zC+ZtUvo#682(K-Rh?C*$5ab;g2{)8T*Vu$RP~aMpv0Xv3vXj*Sqm0)7igNTFkSFT& zaU{=+SfWg1x9)2ytHASM!2Qa3@h%Kg(eHL=?&%a(w_M&DYn90^E)XsNVntgLu8~`K zUy2Y8pN~EstyB_|FDiAqVl+lOP2y-Z9#q8YqBuu&H|FncMcUZkHI7)nfd;&6U?4A7 z76QRh0yo!eWVFNy;3 z!&w{6{`-O7_7eB?nZKR>qxXyV_cfpILnZ<$nP@mFP&gQX_P;ja%%t#Y#`@}>q51@P z{oHbTfAI0?^Kb)<-mS!j#n>t3@ z^jqrFRd$^^4~^HFE&X|BY!wJb9-b_|nV}MRM}1!-jq0Kddm9%4aL8x7xF%feINz>> zDVmHNPSCl>o(vL|YX9^&S0?$MB}JEQADfqAo?6V7#GI8&?0ek(V#OOJ!c;38)7n$7 z=lm@Zo)W|&KGT30#i9KPB@6RzLq@_P%&&!^90cx=TddKvT%;#xu)F`Y_pSAeus?0z z25XtL@Fs2e&oy&x6&JXaS6pK2V%{~IF)^`DWg3mJD_{*_u+a8RFZ%IU3k^2Ga)M@D zWsvYUTNgc3MgSKZY7a>A}p|T8lP-| z^7ql!V=zI#N`@(P1JarMO_gLQeR}?5|2oM`J3hImzQzzR{u{L=Hy*q&x1;mVr8NMS zGlVfNjA|eAm=RtRGG3>{<6n$prV$;+q5>4Ko(t`Zve~~6;wP4-xY?a&UuK7@FHjJHzjcc$Ldg$EOm3 zVaZfNg_`QonS7ird<5Rdn+OO6avSp#?Yf)aY8xL4_txmg#6`e6=B%6#g3Q z|2GIYDbLAux=1a;SD;kzlcYy7MDuUke6yYv|8N*YGkUP;@Oo( zVpmufsU_+Rg-UX_yUpmOL4*Y&sebXpQ!%ggYUQNwt}Rwt=|2#LRk*55@D0)ArD-W+2p!o=-A<+Ccnu-WfF z@ud2bg>wf{xy#Wf?4Um8bL0V1HR0an=hI=BiDX;Uz^5;Pv3&B3<(usKO+2r3Fl9=u!qIf$o*Pzwj*c_c+bN`SX+_ z-{@cV>ul0p0(wa~`$!}kKGHVC|G}5Puf)bbeq~SGmpGKO)3vWkz0XMbz$VqSUAb(N z4TnENCJH1yK6ksU*_}yeKoR&+aQ5Zi(hw(gy32>grs$!=#RYVtcAEuy(w#ICe0Y}qJwl~IX2S@*4oR31>VE+$=Pii}%*v-uVR%LIB zkHz?@^oc$iL@u@Zu6%6b55Q6MPpS@rOqS(Ip=&Uy9i0B4B$aK_@7X!xl~1<}C0p6& z+=$+L$vJ1}%j1*5OnQS4d4&;wMI1YArZX;qTYk4bV;+h4oxQ$=v%;TE8hL#dL(stj z6L`g)0(E1I3LTUN@dC#p3n-sIH0!T)@0lIeqJavb)QBNWe+%vYgm8?p(p;L^`=l}E z4RF~8SB9zC@Y|UxA?}4bJL8%zpb4-6*mUwvYSZNG!G$8lw|l(Z3TkS*JML9TiOA}% zsIYUtd28`-e@I>r0%ze}4zBwRp$9p0Nxa|(vEDYIJJ(auVTt{SO;c34;9dB!W=yDj-w7Z7n(ge?M|MBh=pSDULdDwCXD~M|_C_DOwuunbR{?9LzdT?J zyrtvkV@5@RMB)m5oU1O$2-?#*cL%BLcop6EVC(s;v2a{MYNwUe8hl#t#ZpC;V~7yhwn{ zek>a9w?#KM0Hg7UUQa!f?d@VPy7+!*bffuKC>Cq=uZu!hN?S7fa(ZKgp`WpU0@w_( z?$SSo${NWlsvGPlcXcrg7OMY!Zaa#n(6p1wE}T6Nl*iVTx>e_3j(&xX~! za_!Hkt#@euvZEl6+3S0qdde8k;%KuAdv$k#&uZ>x&CSa**U9Va&J*8|LL*+l!ZXvmt3-0bF+7H;*P5|E`G(-U*r_3}H3E5tobW?Te`?w02%F z=vj3bxZsUCT_js>#zc7w-`Bi|^JZcYWALr)5Jn3NIc=Eod)HXrzwxC*KA*@&EcjyD zs=*@(7|)~E-ho2}eGk13-Da=|?v~0cqH`Gpfd%}j4N7!xCRa4{BL{`Y&dZr#eUa0; zxaWs4)L|zNrq}DC{|so7FP5=59Y>4qtN9n8{7U)Vrv#@A2$LN67mV3YJw(cJ1y=-y zAM~HA#D~6>H@Ge=WmHOlwzY?i5ZQ7$>i&FVkf^Z5+?GiJhH+>5Vi0bl&H{-#C-us^ z*Eg}@sVF#ZFMRNG`^BjnVVq%>UbEAi_$luy2e(T~yxL~N$g zu8oR_SUGc1>Hvf)m8(wG4cdzZ1({FI-QMPv{~i-M5y86kV}s%R_4xM%cJGxmf>CeR}!zyUtY0lLUs?%jf+>&tq|U*|%f#5jPqV1`-u400>~J5{=B$ z!4D^Z__GjNG$)NXOzWl*X%-LFMi^KCE;-QIk2o^>n09Stpr*IY_isVpFK&bTWIHpx zwgY%YlH3#^=H{xl?fu4j!?W{S;NgQ1%+mQ<~Rw?A#yJ%>eQV&l|l1uoUNZY=HyX>z|<|cduxpU4s7wt)e>}iZU zCDyjzzxFO^YTL2dH!}Y)8Bx0*{r07kiCrP~!Fl~RE-?#p_f4>7ZP)ejL8&0lwKKKv zM0`Wl$<-agroN~UdtDOLgU-Vw&Pq&#*w`ttX2)@rCzZFerD?_BaIM!}E!g6H2RCZ( zpv&jLwNd-se{rH#Vhj^VE z+6MD_yBY;h21S!y3H8>tZ&A{j%7g4a_(&PfKblq%Op~*X4XhQJT^t_hk1h$BijGJh zXS^{m*B`tV)7Q`u30`>wosAXQwQ?`)bzr&>C$Z7WTPm+qxuK`E<$h?aK1N{horNm( za#*;#vqL^+FR}5vCFh@#pR23mSIXh3f1{DJ<0QQLl{#JSB}JH5mKpuu11Ch%{kQN^ zjC_skvk;3ALm2qbMM)J1TJ&g{@t?Ro~k zy~7d=dXlXUG04h#$BN~vY|r!C6QhWXK1nx(2a!_F z85re&fic6hNYtAdSz=5!;3G+EE0VTuI0lMIcU>P#&*{a)7MM0|{N=UV=$<)WSUH-M z*!W=jTJP2GaP%y;phT%*;(xxoK0`S8SRHw}kxUou)L?$j&^dXybMtPai%h13eR~B6 z(tAuTB!JS;(+%O6;I)!}Sm0t_sEGhji`Sl6n(Mam>48{l;EHtt-rQmHLp-F+%srSdiOh+48kVnGpW66z zUJlnzTaVYo#Sry}?wi>=t+vs~*KdmtM3|vuf?}F7#>goxko3U5<1^P9Sg1e#Q2n`Q zHMWq91DrKZ{cqG)>~Ct`y}#xOR~K=?Ed&crf^qTn^KBJwHfp}x0ZS=Y6WNXb9C}Tw zKtHGhX`ex{R_cq2Lm}L^xNyA0itxXQF)~$)J{%BWqtBN4a4P~%T7({5EX6yqu(4X} zu+ww(-eb3stR1X4>6Ac18VnRwjDq;W%dnNUqKY5*qzpa|5_Y80oIz+L607+)L!ML0 zCnKHE*Vr^Bk{Ze<2PG557y0s$fs)tZgbcQr z5n+f@j?{xSiY8^$sD8|Ns+fe90TvksVjU~AFWf5(HA=Dtq(WijP|+hGe2KF8q{a+v z@y`TL^&Ncp#kO6k$!4jL{F}_2{Rbt8`GdHgVCXsC>|#)Y!8Y}7R0Y{l{qT-rwvlgo zpF6UUIpV;P6)#R)2~&K}l$$U(2_%28=SVmr<;NE>FxJ9u&{lKhQDZ_JaN{Mk%Ug5d z(R0(8UOvh7#e)0|gL^YX40-P=8aik|wQak4VJJ~!P5N4)oB9m-OcG3+6%54VRAGv<*wmwi_+pI}eZRS)_nZ@xetIaDPB*UwP zfuk34Fw1Vlaxl6`KDa3Q$wqc~Y9~U1iI|Z>CBoq(N4`rG4zVQn0=PfsS;aiFzh;1# z00c20<=j)<7HO(Nrp?TFY2fe?W%&GbW&80t-_#RQgb;m{VkG%Es~V=FG!!%p1dSM6 z3xhCA3&Z4Mlbh|v^Yq|y)t*PdiAT=CDUp-zY70>TUVn=&39M)?3OO#K*TA^xf^CcZ z&zB_;3wiwJQOz9cB(m8DKAA`3LVCF*ij3$HBW|fA3PkFIdCi-k?RZdZqAYHfu`MFW65P{CK^Q@NUbC|^CcMQcWwMRqJs59=kH~m_`J`X*78I(9W zofN9Gt+9%+%DG3)O?&JW{yA*TvG)!N#OwnHNm|Gs@7-59QRe<+C&qeyPsil}Uw6zz z!z0A{%<(-rP~S3Lt>2eSZZ2Z%$U%g@fi38d8PAE;1S=I36@+1VU4z{rOd8D4Q}s%u zPk|i&jy-#Z(CTwWDv4sRQM*8Wl`?vAW|bN~_`J|5Ck~e4d$BZ?R9+J*XG`n%pcYk= z{DenBJ>Q-cq1j(%1x@TIC$hDKLlo5n$QjajTzGoQ(7A?iIhNtIW}?|fqK%b6AYh`~ zvUOu^+%V6qYSS9 znYQFf%@#>@pp{`Rl~!CZrix!_L>3vbpHA-#;tqwN5o&^#=O95f=H7B8+;||E?Y{Z? zL+r;(bY&EYpUsH3-2)Fqw=y-lt?YfT{CB$JYkqggW2f~hhi*GBCsHlmdDUvyY6Ock zX`@*qLMU@#E8WZzNH;h%H<898ec|WBD1BFsRIZ#$D_b^KL8c@u7~E7BAbynbj|CX4 zoF~RaPg(b^v%zVlh-3YID$}S+lL89%DA$FH5@(eO_#36|m_~vcSq9xL=vQ;>-ssKX${dUf z6s!~N1DMXZD*;lEB2uaU^L|xHB?a-JY0*=?&2QZl$?|2m*cR@02~pjH%R0~O`UtvFHXacr-3(={HW z)>{?*2k)mxn#z1Dy{R~QGjC|PjNhR^aK*l1EC^-L37(?cBH}G*vS>9t3*26z;_nrnWX;>qq2}w&%+b2I%2OBSJ~~(- z=Fjl#bSm#6SgIq3)tVh$I^`6(zJY&Lr`c3uSJ{O$wIm6M0mh@i76ikM8(?p|Fhq1c z4|IlJ{L#+)f&-K<2`GIOO-K$1=G0kQW!N5$?4KC5mE$@_1Ea`7pQ5GyG)$R58>sgC zKd$^GpQ#A}CEuvO-SvCB>UF{^FK=p#zZU3j5Jj?@$Kjp76I#?GZnM#IU3ETLaic>-}6U8urZi7R#5 zW;0Vs(!IJhf2*3hewD?u%4&SO3(U&Z>g7u0c}#bWev+|kWNG*6h;* zAe^`sU;!zPGCtl@K$g@@k7Ba4p80!S{OkgU>h&mRl;cxvjH$WeAyMf+hLKNcvkY>^ zc@r3XU&UwoRz@1v72mU{$`7^ebN_(V%#*EP01inq@Fiho6+I#3D8xfFgb(ip311ob zaz8wb{D=xWsG{7dAvkt+Mvs=mo^(}~7scwPj(og9^+Q&L=pmY?D3Do$$4#UE-uL#CG z5`c*v3U5;KLS*$a^%#?BE}r_FVg!V+w30Og!+Q*9UP7Ctrp?Ihm+T{~r2r{N zL%9fFiqto0Jr&9yudgf_ZJDLwZ;f&7dy~3NO_7tU!E$xF>r8^*1jTYO*h08v_vU?J zp8B-3`dqQVdb2smV=FBm*ZM~(?|=B%v=(i;mp+E|8zuC<2P(U$QXRYNgZTwluAcP3Jvtsx+qZNjECr}k-St_F zKMjT-h>1=ULE$w-$BTUaj!nVM`06(HY%&8*A0C5-ehkSRtSwAq_z-USQ-ep5fftpW z$H;QXDNl!z0k&cmGIgo{6WH3jIpb zib=p~rc}PzR}NM?F}j|V@%-b6v~W$#a9-Uq$Z!fRwmd~!v- zbQ?RGH9tl`SGs)yyL=`(wdFl}H?eSHP`M%I890^wr?iD#H~vk}v}yBk11*$(Hi2Gu zl@0LIhAEd7N?+iJyF3t-`}j3NtAvjPqc8IT964Q$!bv&HTW)9J;3!Q;!48e1Z7gf4 zf0{3+)R^8KajY>#MHCD$6!LINJQjdKK;Rd=YP}|Tt1;1ey`B+tiVb%S)-i!u8Fq{r zYFX_fp{4ybS^$gQ3h8CT0wzqpHVE3ur3hZHxngq8IpqH1X;B0#Yo^jY=2O*fzOGlp#bE__2CS=47qI0`P>TS=7&FV8Rzh;2;^H6bKgDB%szebgOg zAOOxipDRNYE=q!+tRW2LWI()^69jvkHMC?4z@VwW8#4}i1mHMrFt_qrUl94jzdc?n zQY1X&SV1sGm)^Av*6oa8c1^_?%__SU&d}y9cU3LT(>ze=JaLy zg6&inUrzPkTGa`}#o24y>%bIAJt}6>^o3{nhr3n!QyZasT|Z-@Sa~}+ll9~?nb_uu zn5wzu7mymaqh@Ppe~@6MvS~0Ftjm$%^YCwDz>T<(_YL!>{AFe6uLyZ;JM+KbR5|KG zxV$aYMVyp88Z>`WW5C=}J+E1VvmOljG7fF~87+x9^)fc5f0T2YhTl=AD^Wv%S3xa} zrm@U0*Gr#-2$~|p7Zv|hy*IZrlcKar(2gu!qQi7?H^$h2%z~s-YP-)mCt6H3k<+)M z2EsvYC@h6wqf2*Tfk*$>^#W@c{aIP$QoU*IRpatT>zIE}C}WgQX){gSoC%4B?O|+W z_G1QwPcEg6P|6XYgHXCb&4kvO9`kG)V>`f%R1a>`w2=LWr}&39LN3pZ`OG5CO_M+y zs&L5-uBQJ_p)h|l$NM2-sttu4Egx%e13$;L$E@LPc;S^4o8QEyyTsb2;htna zF&*by+Z1Inp~&To3!Y4k_RVk!cxZ~}h!gagTp^}JGLfjQ>i=+D%;NTXR8!@&S;iC*z0(O6*QW;P~;1Er5J3UP7B;h9ej$LNZrBH_Ra6g?l8=7v@E z&n4*v-B?ujB(B)|Cb+r4VQmJdp))u6y8QAxZ`w|^OkNnk+`s9TF40eGW(9J5v$8es z6eGARAw$r8krZ5W6(2HMaE!eIM%(-qrGyt?pPsMIw)1SQ&@>Q03S}wNxPYL-q`qjY z55z@cPnr@J(hx6MdIs*Ol1Ef~Riv}sG5%f?RF-r*sRGdJiLpruSB4a7sUG}_+G^OsmS|A@=;oY&*C3oe#l@qv_SvxU|rHx3#p}t@9tb&k>n>UnlafwKi(QR}zH?na1ogl=q zk5WC#pK&Y6jq7lLZF3Z9<9kIFEa`!2AA1`s6Q0ol?STb#<+tgKEjt>EB2x1~M z>$f#USC}`IGlnS%P<8u&0oWi*uPxBA?sCky12-2rfV!e?s7mX0rW+z*(Hxk5Fb>F;sX z&ajaXf7vK(-fd7N0c_wjC)`m=IrN^l<)Ck)Q3puVrkUEHTlx^3Ay}x+8>hOaTPhwkdG+Vu1){n#&rOgS^7Qx{ZC*RHszm{ zAgopQ?s2=DOMFAc;srs7qu3M{#$N?4J;D9Ftp2~@-LcE)Shn`u{v2b{D2s!z@H6_tv46l)BKRsZudlbQit8$UAKiG}71e4CzVC4GS zKzE(MZG@chBz(jj(I* znEH9WaD3WdnP`UeGu}hfXh!9@+F!q{9zvf6?u&!+B>4lG9Y#4a{VLG*CMpMtM04L_ zS18xSxc&F9$H=uc1x!Pa(c)I;x|6pP&q$g%7ednEnb;|c=jelM!4C!_$dVT+8V}CN z9PK_{=$Xw(#Xv*RsTV0Y`id*88A@TpUv@_znt?28^|uwxKzJ^%soQ~mUTy@_=Yx*b9ilf;@rN8U*@&#T=pxAR@6$vce~4Wu%pfFiI4 zPhw#8TPNmYj?pv5C{b(>4WhsZX!gS-)ZH#IWy%6MLO&Vh$g2~b){R>EBTE=+BrwBW zl0ov=UhXDQHIg!?l@$6!>axmZ`}MNc3gXW{zJK#4Au~@I?Amf_mr~iM745@oER+j{ zD5xeQ(HZzIl-L5Tu;?Jz|E_HEx=-D$jl^4O%FV&bGZ?QV#ag!MK`5>GT<02ab#%NE zv6k0bQ!tYhE+Pm^1C?M`DpxtX8VYLYw{s=i%h7!V24SigV-|nF z^`_Z>1}guHvFca?Rw8xS&7#nh{yx@W3F@D4Ec?j)U^GY)$)*fn2`0YgNQ~0{2&q0} zKiV+Ya`D_-)2YD=@RJ0k@01J9x{$T}ZC#YR-b5{i;XKhSzL@`Oupan=U4??w(TS7m zn%n)QCvb%1O<;DRV-y$~T-f815?jr1raol3r*}9@JC5Cx0%RA| zH+8i@4w=cbiQhh8?g_H%SDcK>l+lv(V!z;6X#2Pg3*^;kMbt*dXbnKa;`zIwlmg8) zCN3Wbr!rxu#RW;f-hv69=%1wN1=eG|h~KnfuF}eI4Q#anWHUACIWIwSRATp@+lOr~ z)~eG>kw9mznbpkA#;dMfGgakEBMgfJW%S?!_FlIOPi@fvi7WXZT=HS@(jPmNdD;^v z=b+5GOc-})C1EE8}{5gf+oY<`f3eHQ&fzdB_s8PP;CLkq! z{MLm1PZe(?lP4NuJH%kKxZiw}7-t}Yn}|LB;w9#FvYBJ`4FPB%l`)gL29@#OR7TMC z5rt?Ej5>HnW`$Tv@md@O9=veg@eEA{r`jVHGC7p;0t!Aol2+;y=d2nOW3CZ5RD6Tw z{s;JeyD4;ud2`A_xqwQcrYmaYL=a=b%LLurM$2Vcjm6J!7spR8^;^NB!eE9r$Eqwo z@sEWow3u0MBkCQjYcF*tT;WM|y+5J(n=WeL`*h{7^aTGsO?#BlN?Bu_orMoNlc^y{ z>ZLqurX;kHuIkPim3(saQNn)t3Oa<=l8TlHx{#?0MQX|8xLDnf((FN&TGix=(jO#G z$7+s)n~bz&xTJD!kD4Mq`JBip2R4sVSY!H0C^JR5z2G|}18!WOExFs`#(puq=r6Sn zC=yp8)WJtxcUMeXe|siPH=aB%F8*{>!}RlJqLa7n)>nsyhAu|OEqDX?g6o9WOp??x zS`v5-DMDKW*j1pKMh0#ELBr>er+ejS6tQ3`Qm8qD)8u;SSOn~9xuCMonkW`|2v?^{ zkybHamKg~_bJSIc=<*KfL6qdVtjUNAqLx5hj_iks967zZ3(7-Xt53!(44|{-9X6W$ zE7s)u3)pV``~K89eDR}Dh5-Z^!L4#*$GpOs`b)CKm=(`Hi3rE=lswSVj6w6bySp&1 zR#Lxdg{!QBZ1pn|db+QKIgla*n==opLdcmYcd0e%QHW#Rqau0|iXhz87|b94jw|9s z?a-nEKp_}O8CUQF`N^TQrMTa>26bTgRQUT1iQ0T+jchO#1Ix>xjkn=$(yvKYEF&=J zVkcbipn2nC54Wn8ztQ79!fjV+(!46Xx!tBpLOq!#C@N6GXiZHktvob3m0{epNobtd zQrD~+f3*TJ3J({8W%3t95e}3`lgOhLPZ>a0-~pQ$Qt&7#pmo8Td}VsH;qUyhD#ID{ z9E>?maRR;brI4W%hVOD4d@}DB7<$bY|FiW%n@8LW9(RDyZ^C(y4uG&MSmKsC<6xF} zKfo4KOuX@~fnGo6EBFLQ+cE2Z0B%5$zYGs1al6^Ru-1EY4Rj6$H==mYS~3xNjQ}uY zxd`;f@hHjz*DB*R<@&VX6)MR!i>CmAJhX%5T;nW2=i->ds$paut~0o!$@hqJIAoi5m+C;N^bt*?Z#7b^ZZtR zeG*$)AFI*PeX=1Y2BJZh#0UY`Z*vKT2fJK| z&F*riI0E@Z+MZ?WG+viz^sWVXPbOhFE&#a=77}0~9Y59jQ|d%aOp3(Ez;V5Be~19; zuAi?6Ts~``yol{)HtshZha#NkoEj#VQX!=EikECZZjH_^EKVRg=-&v3cVoJeaFn|1 zA?fO1ZE=L-?KAv-32x5iJ;3@dI-B6)Sw5Kn_p;c-DIsAic9t z7TRagG0qHPa+99FTPy*og6OI*_CxOibJmK5=NZQ-qxZ&Q{MNss$T_$E?g{N+>Lc86 zPrhq?c_9{G+uy$4Ke#;{_8lVAxbFmu5bLsmobe*=-`&~i_10DvSCHrKhl6(4alMA% z%yw)pWHcF1wy&k}$ZjsQ0%Ac&AsAY_S~t|)!`+-23R zVrAQ4l#X8Ao;WYb`mVKeOs$;=TZ4Vp*x*u?VQDRa6=IAXjwiW*+-~+c z8qq)-e@355qeo0ENSj*5{VTKGH1C$#IMHAmY=3pF__myUb`-OHvDO^iTDkbccK7kf zJtwUIu}Ehbs6G-Lss=>FmV3?Q+U4+H6xiKqeo8h^tR^?#;Q0i4-sXoF;H24-KH&%4 z>h?AO;Av41$4U!!^Y*P)tLq^;8t(>BdTuYtQ=W!Lg9m{2nn4pFG)nU*OWicJ9Y0Rf z!@)><(+cg3qr<~PdobBNVXeWGT4XoMCkJmXy42r#H_PM9axBY9Cj;ucYZvPiTt1uJ ze*;lcL?dE3Jr{L{-=xLL0CtFWe);b)zIAQho zcas5ZP|Gba+JTFmB7QKK^cw#2i_wd>-`bU1+-(v7J(=Qoo8@f@7ECGvq!h8DC>Xzy zc_T>>C4f>5MQJ}zr(&zBQcR0+Zv0@AiK+o0q)XXw8jp*6Uq4a2dbt0&{`e>Y%L&dh z{GfIBOZJ_Agxyo(;x9n#+0ixBdlcXPB{;Z$zC)I1qQGLx7j5L7P4w^H?tF*_@KN`{ zZYFk<(UBYv*5F14g>VDgv1yS- z5W!}v=LT&Eb#;_&+dweD3!8uwYpWi`ScDmiVJ0?Qmo51Hy(=5|@rC?gpv$0WHtE~6 z9kiF~6KtOGgS&Qfr3gnlHC^s*jUWAXaJid(khcv5fHdwinvm8B~wHkoqSo@Nl+NgZOm7VTI(FGWM_@t z8O7nN+xULVc;L357*7tyJ1>JQ3sxU(Ev|4O z^SCdui!FaLx?TuA+I_tnSZgPqYamcKhh)Am`%D`Uxm?-J^CKTAK)P zn|iL_9UVQ$ll|f04X3e*5a4+R0J!><&sGGUKBG<}jUGTH{6_O$7=6gIzB_v5j!xb*}bA zzS%FrV(D^w^@*e51SqlG?yzvTi25j4&IGyg%GaWU8>?rZJdo|nCzl)J?A0`FgR#d3 zM0#j5BUyX&@p}`k;#D4N+r5avpZ^h zFB&``mwtx!&PkR{!_`v{5@Cz84Bh>mgZ`^m4u{fOU3uh##qPIKmO|#)iY$NlA7eEh z?|n7-;$L-(8wc>|QTP3Eer1vahR;6Ldj`_v+Wxmde9g;4GI=WwmTsZ;&S;#HjRXZK zKR|$O?>yMM|9d1jG4A)W!Jz3a0W8uYI@-Ak<9@{Rh>f%2W-Q5Ji0lWiI(}e>hHQmn$^1AAe~wJpnEvKvdS*206^-@1PL>sj0vS)%TJB|O^itv?2VD$+@- z*U9pvBJlKC&|8@tT!o_OHiIu7ZGINN=WOT1Aa4sy38D#S?&^E)9$gK0Kka(mz5OdT z3_keGPXg>>$G&*sPhb0YKhe+oG~Ld3BYxo%#G=p+C;9d$Q!MxB%B5s4nybI48(oM1VUyiz9h3*qaP)wcLE6o5s;uz=VtP8xLM$iUpP{MN-IN zKikRDL(g7ZYPSo%|LT>0v$ghEv$@r7t_}|Ga=`=V5&|5^=>G0twX@V}ZCX%?JRS}D z_wRfSBI&y;hhTZ=tX%e7AXyQOz3%DjU-|utz|&{XfAo2tW}=81exM-UR?P?8p(;hZ zxU%>?UgNZX?=ySXe}8*8dFqKj^Jkv>*+kb}4fb!}ynA#jbzBQAUS2={{`Y+MdoI53 z?wzlW!rL2-mHVoAecZbiIppxlA|JZ$!eRbq$920dVG0bEpDC;*Df#O$4FHhXYUKMD zn*JF0uOthde3B(GcWD`q7CQc@c(6DWLkbE8)cr&;Y!S(M>5=P9F$hHgy)}ONCq{z# ziXL5ucnYl0x%2ZfD2`IaD=l8tE5F7 z(vayz5r;}7ES)r4ZCLCh4g^9H6NoJ_x}LrAcaq7$ATL%|o;-8%`Mo4-+nxeq>*P~| z{?7f|uX@Yxy1ji9zx)e)t#j-7jxn z`#fBDCI~jt;#KIZ7HHw%=4;91z-wA=Yi%-0EgD%EC&KYp&js-{KEB<=NuD}8@nM>d z3fuuG6GAy^9L6aZg>7fTSs?9hF7l(jdu^JM<~m`0p6^l+QK#FFZ2)cVIXQLW92G(? zl6@QH?EtZOZ@U6f?JEcOKzh(r*>)_O;)=chvc<-{^+Z3#Ac~9PP~t6|??A(H2b7rlk$;P$u(^Rc)2gxg%3>~Jga-Jnf^-pZN3 zFu3(cqy4=iDFDeOhHXCzrLIG?9ShK~Dee(80FoZ=4zXQWfeXR?yx3=o_7={$$aek1 zc#zpj?yCv$S5>k%2@ggH!~8+>=$=M_T?a6DcInx^eCZ^h%ogy*_(N4S4y z{F&?9w}iFa_N{jJoWqkN&>Od(RUP6Ueh!JdVesBB-nt{ZPs@|*6t}c9B;oW9jC}&k5dYpkF)|Pq zpHu4}0xSX|Gl&G@ocH_pS$c@zWK#V0LT7Qa*?0?B++ENu3+iaAyn|Nr|83 zACz$redKYO9SO^*7sSNU7?!D_Bh=0E!|lB{58Wly>#+QA@A~g{PkfxGdv0?xncU6y ze~<6KAk)lQJ_+Oi5rxpu#ez#^qa5UuX!lhf9SWZNuI+oxaW1T!6H^Cuba;Dtc_|2% zc6LW`jw~F-gQGMnQjYUf%1O*Hg9N6Ko!fHG^iBk#Zx5Ia1IPuS{vKPz#bJ>@PSW`bk8besO&j$TZWhfG$uM#d2gRN2&3~qbH|_QJ;m%nl z3&|4ReMI!Gi2K_XEe6{!y#)} zVKu7g-(z`XwKf2RmTgDau}**Q$?oc8_bW75Y%N~&Iv0qydT{O2ici?^M!{60*TsGV zvNp>`SSBmo4ggr-f>5VO?sLUEt6dA=G>df&UuP|_vv`t5;Zb^YaAYlyiBCNVI0(Q| z&%?Wx7$g{2ojlvez<+$>@@8*q6op%h?`n|XXm~@!Nsj>LkW|W|2-(_?`?Z$&-b(8F2>mLD;TRx<)|*YXD$<~nT-dH zlYyf%^isdkDKiIj1X>E&egr3d=&v!m31lI;#uF@U-Qd_;JwVHBd~3`1-xwb44noyD zxz*@58|3xSO43P6m#BYEk**B)WO10vT;L5cc*`06Q@Q&Eu=VHcrAM&W;nDthcr693 z25xklauDGwJBK*=8tOdewUz}hO#J6~MbIo2yvjH&^M}gxVW8^`6}9}~(ap(&&#XT6 zmw-;Ql%0z|Y}*+x#t&Y(w!VD1wRpaN_rDaQA`#;>ITAVp%?>=*hBR9GQLyz>x?qK;WyA$yM@F~1(F;ku z69q%J43{b`kq|_z$Ss5%*Bd^V01o`d@{GXK3nd`LPBuAMa2yLlp6Am{ZmqyX&i1cB z#;wio=1OmZlEQ%9K)5l`_~Rreh?K{w0f)~4i7tCd!^eNg))@GG)1McVzMLr4Rl>eDBNY@Gf*Z6S>$R(si>CpOeFT;FW)~bomGE z_NuN2tdfXlH8XYWw)(%!;x_sDKuLu#);(+pEpSn!eTbGd)?xd+|7EYabn(4^y?N#n z0yom(XT<1Nu)V}m2`%Q>3;+-2jLT$w(WhR^_qz_{u9J_8_@JM5{IpAm*TR-#cU`pP zaRF4M8m=qE677egb#!!?Zd_P#;uJ;2``Z2+Dccuhj6F8&eN(B%MQ7%=^ zJt09q9uz1b{#rBIhn8D57&GPt^5MkdqeIcO7T%+DyvyW9=%P}{i_|3=h|a^Y!6~a? za0yjb7YA3q3Xv?LzHQr{OZ#awE2Ll_;5!fJvA-#$3ZI!?B+ z)Etjh$D0%o#l;qc+ou~xw?i^v`2EXrB|r}BaiXx4o((1(;apMzCrClJxI?V_`}@AX z2E9{RNKUPtX8HR4{#9@35ebnPeAz;|1yBa@gzJJ9*Tq>JPtwA+lkm=`$NL+dwGXy8 zo`=|0dc!pgH{luH{4pGy5rf4W&W{b7IP(pAhy#x_W@Uiz4Z0%{3yyMPo4b4gnvDN zFTbbfJ?-KVpl=+FzI^)&N6B-*>LAyH)GtItF(q;w-u!Jz{FDjet`oQ~ATCrOd#4=R7d&n*e^-$X^DHE8yUHw_W(iG8^va6rI%Q0QTR`dNAP{Vv{104zy?_7L z9NZKvOb4IMCcn{Ys?A=oJv;~&gSD>ba&}N4uxbK5}xibyr%+YiQ;5H$y7E zvm8vipudyF69F$cwA<=-c&5Z8$pvyjn7}0Gl2An~&)-rY$kU%G&V@BZl3%9#CynPob-fH0VV{YUT5(c!J_W!$BOg=WbpYF{`=d2Cd|5h$a;Y#S^C0TA+z987j3QJ zPzcL!#xRTGLZRHIR-@574V_M2>sxLgok5Z#w3h)>~l&1qW_*^%Cv)8ghAp~F}fx`$r+aw?c z!-$O%dUC7L@^d1_x$Jo89-)oZR%;!#++3}-E$T@DZD_YCf+qwO5kbuhqoFv^x1;`y`9Z`{g;lhKQJ(0k7l$Kt(Q*VX4X z_57mUkt~1d;PuxUtKZi-@qzY<=leH*6YzWOR;OUuC>q(V_0j&TMV2j`cwg`IM|mDe zo=Q<2-}-juOFHJ6uqxqX0&-myfvMeXIHPbh+Gp-WdPsUQEe_Mca%bt;M^|q2_g=al zANIx5TW#BF3DOwi5B2b!4fp;E9D0ykQRlDOKlpUxg(scs1Gd~(>ub(F(Oy?-BXP)2 zZg=0eV&CuY+#eHmrakH{UqW0Y!+n%N&f?B$&;}hWm~B}K5Lu{jxGUJO-Qqp3H=;JO z5(lU(lF3-EJ^n*p_e_!YHMq|5GNr^ARI`;%D_V473QIk2v25tKaO%u40?%JdF@`{} zWYTQ6q1e+sLylGaR)5dh9T*g_CVHLwZ&Fg*4b&PQUb`NiXoBaKU{<(yN8W{Qo|%_Fc~}TGr-DK@kX$6$>JyCbT#W=De`#X)W1Aibu&rC1aSUR?rFn&jhfb)kYTZ5jz@<9Vcjc`1Zj# zoD@V9M+3LL@v)VQKa>uy4EMg>+58A1zS0^0Q~6YLa8=@_RWjsx&}gtclm#Q`_z9lB zcDp?wQIU+B%?2rA$+d-6_ZE4m%Dl2#OL$@KWz*gU0M3Ivv(9(COY15X@Y(@rdv3F3 zjk&N<8cW=9{fmpmfn{gJi%@}zS7>fS>?^*{*bvj!>iHk_JEueuL1J;PvCOiA$sB`C zS-P&HF<-Cq>uPDEbjlUUC%5xxS2i{#yLX!exWUR|?}S{r)My@Dy7ZTJ-T*JX{<+QN zt&d(6=a=cOP45!Ywes6c z<~q$i4f%w>mR;-y6T-5|z^5!~`Ay$G4=n=dA>b*CQ;ayWZ75=(vO-LTN#6F+z2V@> ztt5%_VDZ`Z<_Gy4KnJ+J&d(?$dRjxQfN@SB}v)A>b9rb8OiiKu) z`-mf^!4m3^PcB%uZcvNhQ_aIM8)R7Aigx-tcQHR|wtC*iPhh(vS)!93i%e6lszRaSs|!L&tL*0&t1n5rHKio8IId!Coa zLrjR@UOYzN`Rnf4#}IY1aX;96lw!g1#0i=vUxP{o4ZpGRN$=DTDG@Vc zF;2~>x>&akC{!iO58sZdZ7EZ^6)>Fzx*oacI-70Kv#l4b4;9X%EW%Uxc{NU=tLMT+n3E{e{j~J>f)6Hq~e$#4dN4^*lp52M_+v7>z zx_qno9|$k)q`yp@C+yAzp6)|rD_KOtH@x1dN_rl{bmn?xm;g7|tvRIU`}zKDC}hxD zJ4WF7Ydh#++Q`QJ&PC5vjAtoqv}c|5reb>DS(>MB{kjy&TYK+%@$6{wAnTlz@mpQ! zABrv(L(j8qr=TenO!!uQXP3Q-tO7Ky57Hvmr#^3-=q`Lf$y{(#dR8%SS%GAt!sWM_ z{#{V87TAlCx^^Xck;j`RQN zr|5rm;=;wYy%~qEXX)219Hit@n&0^&wRWg1VtI~wJ!1hxEhPq+0vF&(NE-_u@fHWU zlltB|)}6llifd_tZBMtFgtzV zEL%YXlWNcPfKHUja_Fe(Dgtt$7D~@ z;+A?}0qlU^bBhMm*z#UaKG^e~OBPKH^Zz!P%5q`6CclX{} zEc@Z`8~ZVk$adR~yr#tI0z9p(%_R9kn}q_lkM8`=;N~xHJo$3~dyP)u-vNVtLETh{ge{d+*9ZyOg#yK$&0*YW`;k}5qG%!>f#yVxA zs!*L)e@=TwmeJl4m(^F=@UIKBuxamwWd6W;T2MPsqr3>-M?SmJ7Ky{qvFnYZ5~{VehJZ4g3khVh!_Df zanwB^lU*jhdh-is7aw_KeIpr<3s*I024y0{i7a*_*?+Ke6vgpDdi2%nqx(_OFX&p& z3ala*c%Yt8%2&W{tp7k39vL>nSSbW7-(&*kPSEEqGh0CDHwRd%r>d%QX7* zM?1F`7rnP0+*{}^FZEWkWIRR^>hT9?5(~_qERajFziKR(oR8vpcuc z8qlb3sqO*IPmh_Vh686nW7 zxCbI6I1A$fV9Rkj1ROHF&^q-gOdXzwbuZhx#mF2@D;K})n^*;YD-N&fsLZv_*jGA{ z7DMz5_}V3P1(9^YBnK#hC))sW7IC2SBP3JGYXJXUP~}kUI=1!5qx@eF@BZd%_kQ-htI7f~$C*&6 zDpHo;9d(D}RF?(Bj&h*m0)@#0xZ_>Og$fo15abFu5XxZjQn2u-E`Za)BGbIL@)xRO zRX0kltgJHVBJ#O;DA0saX#cz{seDYLd8>xdFAReu3JbB=EBp3b6slbx>v5o+jl zY9JdIsG_YonWZ~a_6yT}Ey_f!stHeUfv8eCCU!2E zT%fOYQd?o~lWX@rB#-VC-JS426r(4W7YSHrQa}s0oV9+^c|AXUj(p9A6B);{@MY75 zm?B_fnBU1mN_*e+c>hXgLQ1KF;&^H%H);S+pV*a=Cq{-qI){Cn5CiXHD3L_ zPah-jL)T9|eNnJX@vIeisz0tsRYq#cV$M0YrKV_o3-b}XvX6mcF=`CSYARR16+hA# zeD37hQw4V=5Lx5n_Qk*4>L&;?NE~P3Nyrb2(aTQzY^i4rSW!V^({``bmrXgzG)^*h z=BysHJngzYfza(v&sp~tEuM1m-z$|TS2@7xJOT3KGvd%3}n6=%s9O06@XBN#J@iA5KfHD`uL0;Z*t0 zmzvLmrFH!-0&IwvcI86o|M}gW7jK7$>noS{iwAr5d-!Av$d@3YlE(-LxAh2{+y*?F z%ea|-c)jZng+?a52)Yd?Au>JdB~c z)!h7~)QnnoA*fEO&H$~Nj~?^!XD4df=2S_bQPw3<#Ih(5ZahrjhhFlRmei|%P{d)g z(?N2t?8aj9Lh8d=&t|9v$gI?Sp5vx(pn#8M^Ey1U-t+J5{l(vTQB;8@hd+ZrxqU!-QKNJb2&2Z)0)i=H%sZo<(_-BkaK7eJAsm2)RP?;b31D!txLX8PP*! z5Ot+0M4B<=SSzQ#8{~%tvh?7w$}g-S*?Cj8ELg8kl-};LACv*2B@$Vq5wJAISd9)J zJWSw+UOIF7y-Jrq44aJr=NgX2x;gb+zteI~NK4Mr4${7(#qs)To7%WMS-P3>V zjqkj1{oe1nq_G!Sm{<@f8|${BERW*J-GUvu?yA!`r=XBfnC2RDkIJ&EP>!0wb8@3L z0gUj5C;iE)J<5@%D*{*usijpjwUI-Rc8rL?6;y1VhAiKpxpm1_tRk--Wg@i!{wgwj@O!1O&Gn-+IDneZ*^A&Z2GI?yYVWTy>Yw9l)mD^Gg+2 zoujIIL#+s<;7Bmf_3|V_m^2oaA13faFLlpcM3`igL(hK%7MX6lOKKpcL>;tE!%VA# zDj#g#7kx+kQnwUQa0C`?-;oQS_^n&Nb+Q{NafNuF^qpRK^y297<;9bqr2YnEK|Fb# zXFE>o8BARPvCz3}(+>01=g)kmIoG@Hd0X?F0_$$%Vm$>A<~&AgiCgx@S)S{Jubpmk1`7i ziM;Pj-jhtegC)zN*B`_*f!I;;AZf6rUsw#@3-bTs1pocPEi#F@lG*ao*;eOc*s`hr z93mYd656;}Rie*e$r^|)1$8;8Vm5oGM*B^}V_pqL>|1Z0 zzqqi>U1#iShA^ zuNdaYUpADN5=pW5RB-80wxg_Qb&oZu_ZI&)?ub8Vy-(% z>nVK=ysgBmy4YVRftOAxQ;G(73&v!(xwrMvBA-A#b@&KChLCMqhLlJ2SSDkwcV=8YCB7zt2BLFE zkK46$tWeU??(W-+tm7}?#S7H#MkY#&3@M-@L#5)!ydEo83o*VqDu82$~6DC6cCe{-W+F zt7piTQ&q~5A2pAaBZkU*V>;VW5rikj?ccchm4drx8}MXjQGuq%Jf=JbL5?gWsZIf^D@mVGY!=!@aWR5>ov?W!xY(=3-# z+=tI3?9=O3C+Pg}L{Z5@OZEBT$pxt%&L(>B9A>i{FM}Gh+TZ+#VT$D{NvqH%%A4%jap7@E*>c_Wl{S#t2Wh$f&6Yw;E zM+ImWXaPdq84$`$x9ru*RktpyTJKLgrOp8`I!Roc?(*tE@6HV_+JQ`>o&n_3_VK zmlqYFHs)9*nb7G`b@OUHX#*g}>7{S(d(Q<$j-j5pSIR8yW#*ENA=%8~PpjlhP3KKa zkj6B0BUJ`*141X6-19qUH4oR^I_*JS?MJ1Lr(>F`Oev{!V_Am~08|!^7rLw6tqTtm z`0X!IFC5){RqP7Sh;3hSb=oWA+}mx`#ph6n@tOKK2eDsk?Tf^mL-@LI@5%eDI{F(T-j;3 zoGMpM&#V1ph;&rO^E?P7i%0ItxmSPppFd3Cx4-o94?iZlmhE}Xpwa5G#SOrtVAk}q zZcncNo}pPYP-1pf^)IiszNT^A+Y-aPwMf9Tk};*!!s!d0-NkV9DzZ<8(aQ<>wq%HB zBL}~<9yE4G&7`xke)fAIPZ>*?!C&+_&@?vL8>T5zh0GfO8X9w zWT^zeqCP-QI037B3g0=B$U<1b9IO3M{>xY7%2H%C8wI8`2m@uModC7_pNfA4G?ovS zpDpZ-4tFSY4EQ};s2(qeP_OrwC-Q+WUZCCQ0dUHR21NI6f3%2SY%MN$?%&ShAA{B! zFCtyT%(;S)MYjj{e%Ee2;frTn%B zdHbuff3wkYA+}S-ymLd9nZ1f8l{q%OzgJ0>T^SD9;ZExBtPy)|sI5s6|&8%dymEb*^P$ z*}>X?(q(H)X%Yua?8Rz4w)xoKx%<+8L#zq1EWp&(g^yUin?~PCSa^8kVp}(~)n}3u z1=TPDEdo|MAae+aY>VNB=z_upN6FRB$=GrO3Z%kiQs*pH2muEH9(?S<;4M1%1IK=^ z(lA;z-N0)#d#64U_rKO&dEDu3F_tLR!^oN(y@Koo)w+~t-)Jl@d)*VFh|AWBWncX& z@2o1FtT3N?4yYEa#Pz+U^T@0rqsF)^Ic; z8=Hobvzd#flrC+q=_^w^dKOxm4jQWG($xG{Pvg@u6+O;RkB!1Q38YZa_Rb<(H0&iR zd8g5|B)Yki-+eH-utFCa`)_>p7cAV`eDptDfAq%`ON11_(i6YUupYDavVol*;b5|b zm4pbdJo00<>u1TE)IWu!T)p&zZfi9;{6~A&e@CcWAQ#91v}YF)5{1Yk-WNryUHl); zudhZ6;@*QGX@RaUaQ8}n8X7pDbob{>_-cG5F97z=0&7(YGM(OtvFhLX{XB9eM{g9# z=;Y)7iIUuP+vB}&zxB1hv+=~w_fCBO+U38cCl^3S9Iu=|YJ3DEl&aR&+St^k(N*lQ zoCpYr?YaxA@qOK8v%9i3xc>6w!Rrqb_@S4!7X3kX6m)dSVVq`E_pqt+HD}|#sxe?w zAaSn1;24rMH_5HKtf!e&^91!#){07tShI5~i+2LCiyhKW`R=yNGd-ul@7bNezP)=Z zOtZVmVD0or?8aJJ#2D$6;mV|}26dK4S?XyzN`I)3ymR^omHZ)d1|$qxsNpRy|Gd}x z@aw<#pZ9bsT{%2!x$>Vv<#u^uWeubXSNM72suv(b))gUSO4g*PmZphdH+ehe%gdQ(Gg5y zX;)Hrb_Y=5YE)p^3D+DQV{hmkG%cYNrnc8!%DEDPHM?sg_F{Ye+`|NZ=p_XDG98eh zAtgwqv>I*GUw$T$%GS%%d1f<4E=f2SUphYB?ik4{0#}p9%F!|qVXF{)eB&R*lQ%<1 zi!8}ABpGpCdcQ9p3_{0Z83#PQ&n8!b#nY)CAeK~<{>+Kdv&yvjWy*Qic1G;IcTgr(Oi1>{+s`G@AOY1Ow#eKSHAK$cW=EAH2osJ zSJ-XELac``A-i*00j`HRYDYtN=&V*&?Y}`N%X)CrV;5rLw7WxOC2<A~mz?^a_a%UPTxj_=K8f6Y=AXHSmJ%6;fS&zix{{PjvimuWTta6Qc>rCy*< zF>>AHYtHC@x-rf&u3JuI5@#xma1~}M0 z{C~F{@J;LTcJuGFg;O$jX(Y}AvD0xg)4>kY>W{LQx|FK5_KCe~|9JoQAFN;cd8J#* zy`m%t*3Vjw8|}U9wND_Yi-6pF^WVCyt;Xt;5F%=Oyhwy@#aN9zG5smbD$7}t=8xq! z3gkp#xYAvKViNA&ewe@yy+nImz#>XXY(g@KBady z>f8L5K350>>{Yo02nH}d;#r(Z%W|+yh;HuOQMxjdTJ{+m6N=#|m)p00x3T?CmQMV@ z*^}R0*q3(QcT_kL)ZAFqf=6{b{Ls%e~O&%D5OciVc?4?yFJ3f`;b=P!}e1#g8!3W&e8WZ+@V= zBMZ2^)Hu-!u>7q{yMMHb&%C()e|*dRUaqIsX&TmEqRFZ@4IWHiN-4SSM5=v94zd*Z zOXttM_ph_T|JAi8E2r3y_`VOV6>K#(&qQBo(l$u(9s82%d{Dz@<#ANn1u%C$vnpmX zxn^{I#OsizF?oRyY3I}@HU>Y|9F_I$1l(bstvD5xj-4=@7m8jJzh95ipzYKfy zzWXUl4yytTGtvWAV-pQ^3{Wr~C~8_pgU-e$Sp4a5?|P%*kuB_dkT!*qy%wG4YxJf?Ox$JWSwYFBRxe4-5CZ@y=KvLZ}`jJWpL@8vRf0tSUul&RLo& z;97FcepZ1p_26hdQbYHG)qT2ka)M-Uk?(%&#QVO!^ZR4iupB)_KypNNvcs4ug^2@T z<_7k~CAncCYwXY@P%SWk_d^z9zZ$bQO+tkA9A`6H$@Gvm?mIS<-~|WBUJB6ZzxfwUoY$>h!C|Yp{?_ef64+OZM{EB`VA4g&2v1T z@N6vOjJTa@ypSG)tG!|51z{HHa3uEJ*6PCqe&{8L##+34jWBuu{3ax2?b&e<{CF&O zdaUQ?49$Jw+>@HXQ$8r)uP3ZPML}^WTIW|kdAaw8e|X3pESn9Lq@e3&Q1M}kx0Wm> zVcWHQ2|ElA#?C~vyXyX1?$hJoqg17(bya&Ul{Z#K*~*-Va<*WpCKLyP!1cxRy_}37 z7DQVx7YaQ$$|+vkR_?wm&VZ{&a+E?{zoT@HkrvLnYbFAgZqipxvp60VHB4V?W&?wi zHW*SOhQt$VKe;19$U`M16{#aq47iQc30;SlEr=r(=xzLz*Ze4KoQMxziuzaV)(J#C z>UUW(lp;sStKCnd5!}{zya$PeEh2{)Sn`@rswhJC1u|MW7Z)jsp?@7$QL z8X2D_>f2GX=^3Bn?sA?+d5$U4yfkRM?}MjKeeuDK1CAFFrX;ZKWU(nwU!3p2`+a=Y zu~u}F9CRHb!Ok5nU$=h_*{2{I)T3Cd9BySi_!>~FfZTaZjVrL|cTY=lYXq!-h6P7# zj6H<_Pw~53DsGGp-dwzq+V9e{M`(3wwG7iKHCkwE=~mBAo*$w$&*v3=%QPy<^&Cj# zAluBK(>^ZO6N@ZYVVgu(*78>(>(tnLHo!8UT(y>;?RGEfToftv`F4BdaVVve<{ATc zLKDxXwH)Zh=cbdh&z6FuwmgcirnLfBzGWL5vQJeRFVTLHA~CO>8@v*tTs? z^v1SrPi*^*ZQFJxnb=My&gNUx?pAGW{r)@E)%SLv+xPZU_w+f>Bl%I*5$l|6SAEwU zwyhd<+;_{xIKnt^jms`@QK2>pGfC|Th>*kM!`=q+nk|23v}?xokxCI|brm|TiWZV| zr#|2%yam1d*z?1c-HcS`m3^|AW{Z6QAa%!NGd9jV9*puxloo(-w^Fe~r_ixabh1TO zwpz2+nu?)4CJznLQt@?hy|@!?yuC3#d`_g{T^nGn=G+{vzB^-Ud#$9x8sH!Yoa_k< zgDh+(1%jmR$UWFdT0p~#Cw}h*r2J2)c+7j}VizHYP3v@I5F5Dk7{^t{#uB~ZW8CIq znpi2cRr^vrQg%8Jcs`{qua60ch9s%fUq7!U{rA>2dyiFa-Fv@z0@enFjwks%;TUcs7p90^ zeWE-~Z(|OM5u=Bo>I;1@|-!S8W98x(Yp>BF1-SU(*W8N~Iw&*Ry~0O_+}YiUtfDfqK~o2{Xd zHX>`8ObBjvY`QBNxo|(A8!wEWiBZ7P=p<{RE&^}HSdI*M_B{I&FYoIOQX0~KW^peYtE(wdH8F! zrfnHv8{iWPPZ4&;v51$gngchd}P`1$duQgKeZ+72=$I+;7; zU6npQ6~X#~QaTv&@_6UwbN~yJi}!I1M+IfolM1NzB9Y)W$cbA z+=@d*Gj2ob%X|Z`aS<~<9QZ+KYLj#34g9=0vbW@D-MDum{>2`sEo^8q2VLDdlr(#= z8hAMvrl^Pa$j|g=8iMHgs_oyR%(GZPHXCyGu>QQbo20ds(b)4V1{{BvAJ~(RVV*-G}Byt5aux!Zd*!S!^#u%OGeYEO<=T)h3`S?{V5k#IEHOE$pfsm#$BVzd zyM{~qEDEv{PD!okP**UAL?pW3Db1_)w;DME$zcJvgCO#%e1YR>gLXuF1wklA)tC}n z&7i-_;k`*zG353pqkc--6-}OF0Z40ruOB_kEU|ldGgUv00foBTyAgQPUVnWQocntZ zZ-lupo7jz$B}tRBEYa{eRm$RKSJm*j?GK+9`9BQ|>@Zm*2nnHfLe^JL!$6XoN1@ah zqK9rD1tl6c_#R__uY2`)obivxES*C5^(G7H?aJ`kEomR#K=ZlLWW1w4o(NDG%Bum$ z&Ea}TGE1d(>*-+^XduW`=v;hOfsqN)RzEpTn6^5-#I9REOZjd!>zBi5S@>0fEA+1W z>rQL@)F$PsQ1tz>({dxF!7xKnb?IxxMLKi|;)X8p=xCu34roEf2tozd!!1z=83pW7 z=VIATS5GnFr8yW!!a)nvEYUyJzm~4&Qdz|mOY?ro6JEq@TtZ2(tngsyiibsp81^k4 zB4HDa&=bhG7=2;c_e(x`?bu4|YeX@JwH16T9dJ<G%wpQTDXQ-8{d4Y< zwlr_QpO2Fz8(g~)MHchCf4g?K8fd(J;(=H4at@{h@&i_5L~>A1SOUHoP=aS z#&?O(T$|UXr+I1(a(P7YqcLhAAbJ8dj(pqJuDKCtXr3?ePk1vd77Cjn>{%Mr_p*i- zCGja5=>Plt7P0hPa(b9Gz-=R<>rcQ-btU`ARO5mW6~yKWEfvenU#T=Byn;la4?-j2 zhR>nm@ zcU(7F%II)HFeJ#^Hp4OMcjsGrf30?`I_o7^<4T;CDVtXCd91gz_Mikgq=nfN3X=nd zAd|#BDDVl3MU4hQIIA^S1)FheAB-3DZaMw(@du3G;}(!BZj&rUBULO0Px;j$v3T@> z2FYQC=pJPLDiItBzT9vaX=;MrWhubWjaLVhUb#eJRri0$Ny4nbtyLY4!t+7=V7z1LERa~4 zB;bgCdZ(6Veq?ebHoo_V5u?Dg>{+%3y8vm$2wP2F6@xgL&vNeXF~PwdeY_DhT%m7Z z^B&cEm@7s|qoILPt-3pwRg@Nydx5B+4@W(UTy21hddG~mG?HEs_-b8RaEH&;a0OXD zR^JY>E-`480)KQ*Eo(&*l#9m=Gepi_gV#Mj+vIW(W|=sgxg7rDYUa4m(M2hq%#=we zdwt}IwLC&!+F^MlGn2L|wPjx*cur;lTR{;03+{1OvJ8J6Xpi63vJrI{s%p_Nhoo*8 zkJN}&tEJnCK1YfbK77!_&a;~Z#woqMSZEWc8vkd>;lZK-7>@d?(Bx15DSK24zck_o zqGZB_4Kg_ZA+;!aO`==DlQ4SkcyxK_o_M&7JfW&i`KmF=II1(9u?!QSHx|6a8(6S2 zC547RJ`$^ha94lWl|}zSzj{`aji&oVU&U3dQ~iVtL@T!PEx@SH_0}liOsP%vG=!z# zRj~dzLF~hHV)pTUfp*^%EM)CI!((tBl@lwLgUJ(bF0;;qwwpxGLncU-$9g!)hm#M5 zaX{EwT^v=gdspT9!RsCSF*Dn<{`SY$YftXAz3lo6+}qq6(Q|EtTk6+&8QQt_#bW?H zEs64k`Sjez3vmk(0cD31ixxfQz6nHb?~z>~0Uk&KB~FXQI^8QtoiX8x$8#C-`oi^r zvOHM~KsWa6_mp>?R6zk&ZNFC~@9csu9RJ z6gzE*#!YX=$?Z5jbWf4OSM5vOVNw!8H>}%JPZCCTDBz*C|e*X71;oyY-2? zyWR6%DW4oBJS-drDumUxS!O0Dot*qnEqX7^Xa5s^)k8J=O}(elhcy~@uWmf@wMge| zW^%Nfe9+GI0Y>nzs)UL;k`(Qfl?$ZvvER}Pz}Ll-JY0|x1SriDN8fPVEHuM3KL`K6 z!3*W)!>-(gmT!gQwX-!dPt0(`+4>(7oAeb?Th0=rRXc|5`aIbBp^X!FzaZ0FpSu4w zP(9%hC59O1^71iHMY@k6Kk)+dD0UnVW&J(CwZqGn)>TuwfS|Vb1Y+fUvi~Ah5mfmt zR*`fDEyVEsC3e>#XFYs&83amL3r9_?@6`aD@`C@`-gD+XW*~i}5@!j3>+`i$BsqjS zes@g^Bh=znC4U3AK6I?D!Dt9&c;XuUvJWf+Gq0Nb`?G=C(Ib^j1xNV{6QL>NoJ0#t zO<8BQ{Oe;{bTDfpYm+Ya(DEC1CnhFmmm<% zScJ;Ei3i*?*0{8rzqE=$9@=Lw-?ez&0Yi!|v+wI&u28p4?+di|a^5dvPpMb>FV~AU zi@%%3oF{)lMAQh}{>2F_!%C&@Ba*(b^rDiMxX=~=a2Fn}Dd*PM5w>~aNfN#FXLn@A z6|hG1H|4igLHElPYx|_%ixetM5pK<5iT5wLwnIL zOf6@#SA*fxHanczM=T2}!iN5-G{wIGBUNh&!zks!v#by@T5-oUcQU1rK4bF^l0Ry6 zF{9yaTAn|3n`W;NB8B+LT4-IF%pG*NE#E)s-c<2vUN?1Wo-)js62g>5$pkPIgK_aA zu`{)SmXE6G_Uye4{{5AA${AhEAVAw|;ze3IHaPeZp1w$J$&PH2(_kWP!E%h&e1(iPIO zvmv5-#5lE{deVn6U;zSXox??fsq0&0A|NPBEv&+&#;+h#!As7pE7+v0vb6e9o29AB32j=DJ(grlE;F369abl; zri*E!ZQ?m^v8wTLhOVMRpbpG&0ugAn5^s){MIPU=Z3TEt32g3=S0iEiOAqxoF1Ehn zjv3J%(U<#9%4;p62WIA7ZjZsSVvkzSic#3~Q2F}{IfV>HQi^&NPCU$(9W7Xda!N4( zp1zKH3SYzM3W%LnU`)%)@|sF`lO&b>f_0!^vf{k#D=pl9G&ZLRmM?7ZG<#2Yf zcI8V7%AZNAoQz~|&L>pWmY>Pg4(b2`2#~9f5b?;xj#bmd#{gj$o0#gyc7#O_YQ~xu zYXST^!_`xm3*tc2t&>JrI+*AZ;4X6WBnBhV4(Da0=J9Lb?f|9OdH%lq||%y6_C zYB#Q=QJ)OIN`x5>&dXbcQQf3_2@o0_A{sTz;%j^mJYZ}C%@jbpnrnaLsU>jde5>+DcJh?i{K+ag%BCJ%465zh&AV*DkKd~F@m#kUtTfd5%jROiT0f8$L zCsSm(`~U73ra^1)2P-9an58b;&NUAIElKyOobj+~HA7TfAdU;w`PDt<@wgB~qjNJf zxrjR0aQ=971$-obPa4=>;=f}(^!GOewkiQ#HsM^wv1UQAb3pc=+VG30)1sLb@3y^y zko7YNOOt!+O>7aZI-8Pht^zvdXR-^r+9aabIhJ`xr4O1?lCqiHEF?%zs&F4KDu++L zB`XI8IxD2J%yqOymd*xf*N-C;8U)ooh?DpA1(n4xt;p6@IPVtdQUfc6{psaMH3`GZ zn3)jY<=S#5A9>u~`3(v|7%}kCOIm(YDXYo($3fGOa+7w2CQi;58?X6beN*rT1tOOyej-2CU?V=3OWKYF+>&Xd5r85|01 z5Lw=$J`Ufhbeu@-1rI+wt5`cz=L+mfsDx&3HGUbpN>r>$gN~ytkM$%|w_W*~deg-7 zk)=aNQ3Yo{KM<5sKe{{wbBJ66bd4Z<#eds4NP(BcU?GG|y7#;IuE)M*XL>8iS^hf+ z@0rJkuXC0hwaAj&p32vtBQ?Rrc)icGUbA!$svXRcV6=ZE5@_9joY}16=qa^hl!*O2 zW+&t|t>kE?l~KGbl>x=Gwl?^#Dn^b~Ws8kW@e>35O=eW+&)aBbuouFTn^Iq!`Pp65 zUM?E;=#yUw>jJ5qw*GUG269<|=>E%W(AE4W6nYW}w=kOwdY{+8$<57D_?NNx?xXt` z42WU$K$-(G$dPSR5Xmxt`NV3Zdm z;W5by*V(nLa@AbYhwvnWmA~=>2q<#AZJLkJrMiyn4GLp?{lHpSS@a^9Zqy0P$nB&o ztg54|7Vv|Rf-^;c;RKC&v4saa|Sv=kan$E7%)1@FSm1bzg;MbO`av8$;cGvI?qOcH0lpcJre1*Q}l zkjZ)Gny2ol!~Nuc4UFnLWW^c^#uCua-JLg;Yl&n3o$DT6Y6+_f%jerouKsxB3H`dp zUD?;$KgYnm=j`!&aiSXb6zrj~2rBl={EHmxNcD?l%6=|lB&(9Jf z!UYY1%Ajyd{R5v!HTg%Ye9sqnXVS9w6jadBauJbI4To)(slM=%Zf<{&BWhN4LuZj{ zOdi%?{~F)?naf2d*?+(cx4o)$xqs^{8fkvPDnqv{ly~%vx|5{{jjskO0%V_+i7^~J zxDj!x#&|@qU4upF7V49i?kw~`#GHFyB8BZtXx?evGMVjU@d^BS zILFJaTmI7AxXqYDFx#YG1*cX>^)odK{EFr%rYT#hMxuaxtDYS*+cmkeoaFtZ$`O2k z`Dg`&7VOJ{VilLTjBgMIEY*JK5tvX1iHrE|9S#|HLeQ&lWQagbcJvw|GrLui7^qVv4XzU^lCA@Z1Po|?R72IdN zp}Yw`q<^^RocZHtWe4e%d=x4dIO#XK+*E{Ak?wV%)FN4@jsF{&QtmJ--b%1y$aIUg z4y?_Y3NMC9XYDk*n_enQQP`-eIkYwX%=-?i$YZzWW|GG)oHx2Wp-Z{u3O&Y_1PM}t zPHZx_{xYF2Y5s+$q7$_;f8iu}CcvuNTVt$B^P?HExrnK0hW?CjX{_R#1v5?4#meBYMhidv|)LGZ(f^355)UFysS8$4H@uKrZ2!9Dub_1hAU)|#D zEI*@El(z!l+1CNsin^(AZ!B4Q1 zvwBEm#(vz4C0^t(wp5TKYQ|oeGMrek(%_5~SjL~R6jF0fq$}YDo4YGw8gLWB=j5-1 z(~x?RtNuwm32Da(=N^DWt8Do&AsXc-p!q-&%WnUZPp+}Gmjy8wpUTBkK*qu#4_pzg3Yd|kRvzunYs zR|(glD{_*W+1f@CV`^YpI8K2#8L+-f!)8rzJ)fr~SDvP(4|SFfhs)xyGiLwY%#dG2 zdzNr6zehs8bQfIQ`^(qyyw!7A~X$V5n(C(pK-+ohL!>91-y_U*Xyh*z1O!F>!UgM%l z`+TfE_3tGOqTpG;i(46VI7cP&*Z{o{eo!0Pvf=yDE3Eri# z1#;$n-G+v(e!Vi1%2G|mNq`%+4;6PQiq_n7obeL=ZY9d`{4(vCRdKaUHK2S;L%Q&3 zo08LAsHvg4|L2C?bio-O=k|gyaodvRMb+;}A5(l(B{b$z8*wJ;G7h%HQAgtigio!c zA$={QgaXo3A6AfP;RSL)6@W-m-Z#YHq!Fabq_v=amcCas{dSQhM96Fj&>&=)TS63) zDz^#v3%7Fm_BMeDp*-ALWjtWS(1&KA(_(;&`7Mx!V4KhTmC?@Z%4<~JW!9{46rC-> zH-R3YQN$|XA$~UhH$W=4alAn4Uv->aYZ4_*b0k!ub-8DU;yuIHpqcGrd4kZ9XO}WhAT_*ha^! zk$#Ci%N1?6Qc_Eos$Ihf+aba{A4H}SKUx5M;D+o_t8vG)u$@Q%DwvFmq|r9)@`3hx zDfYl<06aTeun>=yp93=yl{UDuL^mA?ugq{b7Uc0AFc|EI&jwBIMPRp7jLPi+DzjC@ zA$|<2A0Wga2CtwY78#109O87OxCA7Nh4C?nYZm8t$(p(%m7!-}?r(DPojL&4z zz&JD@x@V&)AXw_$u(r*4(hqaOzO1Fj574y8=P0qZ{_7#LFJO#(N`y@L*y< z37t4A0#g`qwH1Z$uu+6s#$lo_&lP8Qin2ray#f<8aKgpm*AB>V{_$^jU1NUyScrb1 zScvZ5Jff!#QZn{v=MaPu=ye}v>9_Qg*+-ST+-#QA5U2oqJrx<0BqrW$x$LB}viqOM zbZuW)-Gkxf?AK_k*!ucLW&tNJ1Ca}7bFEcE(53R}qTwRr@nK1UHqIst3X6{!%q3fY%Guh%7(g%lR$aKH*G<`d#$`ERnFoKX8HumcwFoP}ZS5DcR4M zZW3-z94S}ce-$tKb}Ia6o*Y7B9+j253(1AnjP<7pR6<>uVnR3Imfe}|WJ?k%+BImj z7^C%QO`rkm9)|f7xA`b&!;pv_B0=ev#2s=Z3`uBaKD@)7)|!8F?wrjSq6LcBU4hhD z^}=$kP=FYf{gLS$lQ@*nx@c#3QRCNavfpp0XuI%9`g)-Eu1dB&UVuNdf8o4X{Fh{N zZI6M0P>uWe2XeH^=-Qb54Y5gkdWvT>AR0XV1TB$c;xp)nQ6i9Vm({?U@U{%RUmBDv zCI-c3@-XcvkgNSjSzKTNleP~Yn!1AO=kU%VY!%c0P7P07MC@_kt4!odb6nNUxtn{Z zrLckxrlDre1a9>9`PxKPMV{e^6j(mt&Qz#>jxvHEQ57v8u?SHUo-~M{BHOhZ!4r#r zNTgyYE7QNo6EJ0@N-YH_U<_msPPgy#{%oToDuEMBHPvyuTv>_TGrKEZ&?!QAKA)y# z^(;Oh-z9$kWVa~AZ;GJPyfSPYAb^s||F z(DcA|YbPrOxyE}2xcm|^=IKqZ_f!cC0tSg@ok8tQg+zpUD&zW>WFjgLsB|#Mv#8FA zz>bH?a5*&D0yZe*N1aoSd+0T4wjg}jV?)yjZYI=|A!S`9e-4U?#21L;_GAj{y{@>1 zpqoqz7kVVPw%lg^;0#)e3sFFoaH}mMhwk7HzOo?msM0su(2{SEgR|pBkC>3pF3nKj z-_6*~5k)Jj4y4Z^wFDD()y=vKkO9#v$z7}#eGx`dQ45LimLd<3NG!!QOVwrKJH_OU zQ6S$KV4`ayJPt5S#k=k^HCTov2U!19rQm_4qJ@Ej<#c>4IC?Iwg~D$LGAeMc{2|tX z%q7erfqsgQwe7udu%FJm>V1Y{gSJhV4R3ptXV&t*P~qCIBw1+rlPmb6&<90Wnyq^OEZh;OlJn3jhH0V@liJK+r0Rv|RDcWzBtkJbg0z zvO+;akwiyf znEqrZie{D&De6<=>K&J(D!V3{wghoyr9y(i(sMuhgyX#;`?5>#Ep;=smfsBOjsg9C zB+Bp1bUvjxwO$E$_{y``B}4U>Dqr%0N{7PBB0W{06}sTqND`>DDkGeK|au8cwp(IRJB)t|@8uuS^zJ=<hL_L0MEiGH(@v1xaZ`k@ z)V_{{EK6H$z{H9TqabMcU2K$BHwoqx>x(oC;d!UG$eCrVo> z47DT0_Dj;Ij=kI*ZCR`um8>HhqGPUX?52Jd>xw0VF90tJx$h010?m{Z4uc8LS&9)a zt+w1KN?m&o8))J)ih>`~1%(|n4vMxn<)<<)AESjO9@zM;4}M-X;||^uKz>IHhB`R| zjf-O`gH7{1cr4m>t_7Q0Zp^*&8HLA$%L)8*GIqfo<^!<^rqZV}O!bPgwKO?()YDw^ z2hqY*aGRH_Ov?}3JG$AGCJNB4$uwj;`l+Yx2Ub+oLFimsjSFRuAy%x$AN&TqlEapA zWF8wHs}#3`CHPG+6f2B5r3ulWz^}j{JCJOM-GWA_bQmO?b{E7G(!)-8&~lik*+33L zYy6JIXQq<-6w3BJdeo6jtAZd$2^Z0?EA}-l!HWzgU#xHqM>>wwu)@fw5qOkwigiFW zKPt}ig+jMdAX5PC7i!#!{O5_~rALFrRVBuApCl|!C04w)++HqIBjbzko-3!6R4bSu zK|zjtEIvU!?;;uw`eM{kh0T7EYulMoe-Dm7obV-Jz;^yo z&+mh~*vp6f7#Xo>`Z1p=8x2$4lb^v$tI%=5rlgEnPa57ZcF%@S#b}4+h#f0A$Tq!4 zO&Fd;u0Z+`anDD0$2Z$ZKM4|YsWJKQL!xon0%BTX(Y}Rm)J?y3+YT}|?2^lG&VnPe z=6nsa`SMHAdv!y1R5{H3SfH`BaWpPx$SsSFjiv;vd}vfdM5J;kZ+BH~54lfp7yg&9 zh>~#c4FS6?+F3%@K6wv*p7RqAYiDEU$@YE|MF?Cu_1GQRB+rwKLGOLn{mc~a{mftq z3i0VJU<5IT0YQOmnT9&-@ajzK+A93t(i5Yd6i9<6tspQf*2srw6Kcs{BknSOrKStt zL~3Ke6w&yT$z``lU7zt@1Wz|jyxO|gJ#VMyakGnhqJdVn2)LQ&cQ?_z>T^-=(0%teOehNe#ruTttvTMN%s5ljNC1NF>Nmb6yEH5LL*u(p0*lv)UZ?Dwa;z>dVO_fnx$=GNXkqE{r0#NFLRa#Dx?j zM3bVRO0jIip=+kCovfYu^N4CBy|Sjd+2pLqS~t9a1^x=AC??E^T4G2#afn%|MvW&U zM7dlIB~%$DG{#A$9}lJ^xvFyBAb>jT4H^fq4*^#mwk`qBDgzITUBr&9o2;&$EdCoy zoY^lZ@4RwBLQ@^m&Z|R}m1zX02-}1PfI6x&as9O$e%<>e@Z^JAoEw#k8j%{|;$7_4T z-ta=#ID-N8Jg@goB8HHnS*64qCyy-Bf~1Yw0UZseq+ruj+;1RDu=Z5s_6|Wuk9}ng z*G+{;vS&KlLAdZPWZ-d0S}Q~E9FgWY?k@Nkvvw*58D_M2E?{I0(4t3=8UK&yGWC#U z(h&IPAD%U^azRISHvpETkSS3`q0ACpd=AqHrk_=zkV$RsJct;kIN8RAdx97z^hUF` zk(=T=+Ii9!8ur(*jY(xqy}n8I&+H0a{l^xqJWAU3fVLr03Hlq@Ta@D%2RE+>OKa=% zy!B2UZJZ)J>&+G#%>qENPraUo`Z61$Sm^NH^Ud!3AhdR>wl#AYO)+x|HJo*Ia-wrj zl&2+6d*YB~W|$HB=)5Tl=utA<=ndUof%ix(?FBx znp^W;`he);3QN-eIfK(8^@=#xkfBZ{Vxx~mOgLy6>Ig0xWs;p7j9g?0O{`sVy$$}8 zvEUloBAFTP(6dKNsD0Cg2XQb0eg>xuMH5!f^p?Hp(crpcrn$S(*IM7Cqx8yVS^HA% zaB3lA;k2?EOMy{Gztd~|tbGxKuUT6+Eq30*qE=roI%v)ue-ifShjDf}#3VaCI5}D2 z$`9lp$69g;QcP(P;R5j}1%xl0at8h1A@EXL-Rj3maHf&c#nULh5uBm)Wtgvj8ls*v z9{9D_MmLu_o6V)xa^`gAecCxQ+2eZp&5vExiW?m^z|dgi6xMdu_Mc`7oY(IU$Hn$^ zj;HdP1kC^rdaSzMJ-MB=g4X?s>;d-yl%oh~dJI$=W6)GkSO&ukLySE`w0jiT&_nb{ zZ1_;IJ+xD_Gb1jFpoCh9K3hF3Va8qU$oYvdq^Q!EQ{5BW@3iTk-arDTwAfUOGUu{> zgtE!sEw^cu*EWBvu59@Grk@;+Y+aF%gCL>uaw>d-lO4F>{Y?jwa_VtuGQntUIEAz%ZSamx`|!o-Az&>chjFpTqPVPFl} z>nOR<@*Tj|{)7oTsC&cAY#{2dHbcn?P|TtuJp*$Lf&#yvgQqT|#NAQRs>aROQ4aG= zGL!B(v0lF^68gbz^X_l1zVDhhAdEb$;zv@vAC21|QloOBEt_aGO~I@4DDur*P0mK& z6VgZFGP-nBHd!TaSF@9Vm_IA|P(e(luS|iEB)`+44SUmxF->Ud^r&dXWrWES&`ucs z>TD+_6;Tx-rm#lW17jIrrl7KU+|zQZPqM;KciAc6%IPFJWcM?^E6|*T~C-EhEH4 zm`6cVXe+jw#zRq$3QMC#9*o{p)2Ghc63>Rj<4lh#TQ#u%7GvGb+xlw2eJ2Vu|95dK zzmqnfC3w0yC9rY1u|Vj%hZtjTV157L=Ev98P>sZ| z=J@sv4JQ7e{qZ}31-BT6F2t94os|B^samP7yfQay+PP+h)FNFiR2Jj)$LVSdS48X1 zrE7GfHdUPBc z(Qj0Zi;o0gP&%4gg|CEk$E1fQbvE zs;jZfe{YbsH8KY<{*OLNMozZQ#NXE|IRQ*9O3ztEX^%k{=50z#okHP!N}x$1Tlb{r3paN$;gvY#L~rC3E(7ZZ|h)h2e5M? z=3oKL<9yS9 z9Fy5(l4C{fjnO#J0dG0!>?zcL&y#Rk##SR zUzlx9hZ8AuJ4QF%L@4vqZTQufN1+U((@K%0I)YyThPkmR$vO(x&Dk>}Jq_53#gn12q1B?;?@wiF zq{pofMSQK7BVN5|A_@)g_}3+{&5!sSq)~Mh_VQ6%jvNh_cbhyvIHNlxU0h3)NlNphL`btPBaj z@XfH*2eIF1H^c=YIzY;!BlKZ3=^Ee41r9?QJ5~h_^GWt|_Zw5gX+TVp!fwR>qIhl( zg5o^4L3Ke4T)2A6r&7XAgW$iA>OQ57=&WhfCqifoikH5@(3lG$kKk3=EK@*n(>Jd` z3(5I8^)KiuYc*XMLLS847(UZg5n34B3xf+Eg1};hpAbU1aV9-Dzh9mwDu^*3qv`fQ z-hD<0Qr;T{Vwy)1T6hlF2hYR7Y_>8TA5>9)%OoibjWaU)q$WI81>X%P61Nmz*4XwI z6~?QMa*tc8O$50(1do(fTCpuknh>P!jT+JwcIrmek4|e*1=AHN_zz+l?XS@*287;f z_gc?x*e=Wm9B!Y&T3fE6&Tin}%3R{TfyE{MeyTpEmhH$+e?ru{AdUw}&{fyv8b+As zgHgIiNWmZYUUOJW5Rw^>5Z54(fInylQM*dwiVh*vlET~a_{5EI!^q>X37tv#Vd%xGXu!su;cAJYiWbVrLw%NJ68QGUkkAduIx--isu&e;t_V zZ*nyIrm)O1pk0&jy1XvYe|;2{}eczS96}vZ5}=1*?K44w~+xC{;5`!E;=<;RMj`@OO$Oa zPiJ+j%#uvrNpD4}pJdP`uXrugRHirrJvZi-IHy-zoB50G9Sg4ETb+8^*WhD3No2eA z)d)RQ8|XA^^xB;$PriQb3l;|6qW-^-f%|_W!~Yir{)>CNiloSYX>0#~q0oO3X#N8_ z_D;^ktlx;EDsSX$P0Yf?^zDVp|H2CnZYHk(3orD&)9@u-Yb6EE0G66`lOm~AVyR^C zx-4KMG5ts=;e(Q6{x3Q&cw?<&e}zCcM=AT5NAQU$Tb%nwe%BM8FJDc$xU0`p>$;x1 z&0ct$m3^Pd%v%0yGCO|EdMnrcM>1R#M3l?T`q;7cR9oedd|T^&JyG-q`_(;NZpzs~ z#{(hjK0AUOYu@53;!XrQR_*uv5t1WOHh@NRTH_x8!Bg@^r^u>uUb8Pg3w+GRBVE&H zmdv}mfa$j1Q~4X2{K=qV{Zl`(7vwYp@hkdHjtIXk*&xYNrMg+BpL^b>+Vb94Eg|wx z@PP_61ABvYb=iu(rV5-}C>njM$B}e%Ofg(Zz>H8={R%ap+I9dOSHf*}UNT6!f;3Ht z5EWlaJy03dg0WLh)|)%kz>JDJx2Y$Wl{`hCS*7rq^jxBX5{4}?R_Ew>&>$j^~+@D9j4!H)j>=Y)z&J=u{?GU>Q)i9OAYS+1yYLM>e1` z%t||`PC}z7(csZ}c$$+lRL49Z50?c49IMhz4%M5I`|6tuebH?!(GAptE?VNp7~0f| z%eT4Vfaa_7O*!#Yg zC1R=L4QieY_j(8IQ!E9pdeEG))z-@DEtPWW>$h5JDa^#JLMamxjHZ`kn#!aPKVI+qmIliy3r0cD5+{|Lrrrp%ly=|Od0W@*!oh?AW0L}ttMp7i;YaroBVeFovlvmD?uh} z>*=F84t9rZK*ov&jbR$B%hJ@9#{T?I!_zG(_As+3X%5E>_Vic>71vGF z0z$Dy3X23F!@ywWcm|*-P{F7-_lv7cLvwjt)rkp3J8VKH;9EOgYM#z%UrBubM+Een zb#=KlFMj6Z>~y#H^w+kfz-Qa%`L8Tq_snK?)m0sutm6@BH?;IChnT%+s`6I$T>3G{ zBtfnrDa;xQzUIJ5xrnWLc!{)hGcUYkhehg9pn=Xrt_NwS4|nIg%hQth$Fug!8tiY& zXL5OyED2oGr7J4TpE(p7GCUs$nwcXt_H20{)t{4+kKsg1M4$E_r#WWMi_`%8#a(4q zTZAqi=xR57O%KQyH!Mea*Yt!PLHeNidGXH({rptsOLexy%NSs#mAYmn{r&xMBT)0+ zyw)r&SEWp|zZ94399N1$g2urWL<@7?WyN5V9vrB*di446I_qEa`PTi~{jX9{fVt@R zxKon(i35rM=a@$|&#`0dQ@Ioq#Ah~OI^&zXp5Zv1zCJlWWYh#;>vkmP_h{v~@8xzF zrK6uB6WM{*_SCwtZJGu?W`Po9xqt&=i~AuXGep`*A&-8Mv_&U z2~Cf@4en0AJvy9t;tu+r9DBLJ9NpDvmz^+JCrtg?qPU5H;TJ=X7qHDwRL~Eq>Cl2+ zPV_)oPR1BpW(sSCsQZnem0GB@nHru1aKFBNd;N#t>uhx&S&&VBF_}W5t&jpKYJ-)) z#g*NkJ5?|nxj&5F&hSS$VqrF{GM9>U)v`r#G5z-ly`RR8`(Zi;Q0ja&2O*Bb_OB@A zhcM(rm(DE9b#@F+zYoo9ZQrjti(36a*>tTZP_Y!KoA-(P$Lg_8ZphM!rtg*KXT(J? ze;XF2!i{%|TU-D3c2?`Mh`}{e!BqI^+;3Y?S7H}~i+G=s za%bH-S?jN#=PjaU!d(-gSezi%;-4TKxbJ_}H70Jr<}N_c{kU?{>!;1{VK^aNM3Ty# zW8%(|tIKCPV$kGz?sd>06c>zwMNn(Sw<3c6tBd3LskM<#aq!iZFY(VxbFx$IQzwt1 zHn^~D@B(Hbb+yXl8xey4>*6iZCya<5`qnXSl6s39{(qzHt)t>fwz%yO9D=(9mk^w8 zoIvmpJh%sU*8qV8cL@Y{cXzko?hXm=?)LV~oypD2d%yQCW^vcz`=jNYI(@qK+5OwK ztLo`GyKYR0zyLYsN`Q^DA*Bo^xN0_G*8c?n|T^k=WlaxpS7(*RdpoD5K6Ss z7Y=O0MI5{Djbs~9_Qm48%f8-doRGW~J?+szaJ{X$-Y&omhf7%|zGzdPC9-tgU~PV{ z#5`gj)kngDoB+=Z=r&%ALVLC?|J5w!@Y32{;g0I6R`k6YA-4{!4Dx$)Va(wp1QTBL z?eF|wbwLZDMyu5TuMZ@J8t>dkl~=15x@~~9$3=D}p=ihR*#?JU@N~6rE$vP$!jZb0 zdlqOKFTN<_`t%W-EqvkLt*+ZewcNmGiTXC&WP&JcUdQfy6KKR{1Vv68y=d?(=6kWs z#Ip98K`9upw7eRbyaX?xz&_2hGk>tP?|Qa6eXl{8>n<+KxEjRMkJ4Dx>ZGefqvDuh9H< znMc^Xab!KO+olhA1oO(Mk_{?-CuJNy?7e4#?EA{N@VT6RkLS)y>4#se>COi%lgZ+gwKUQfY(9nWm6}|5b@S(D!#{94tmsNd#1_`m&otlsdB zOI&s392dVNhD%Se+U+(=FWqjdRHrhV^Ej8C8~pMb-~7$>f`JY|&1ENI)Nx6_koQn3 zLHOX?C`0!qv)+Qp=~b71go%dFQ#o3@t?AOM6|6P`hz~3#A4LltX0sx8re898p`)Ms zc}$*98HYeb39<)$s8tkRI!!`!e=pm=t{AEZwI#~fS<@fRanQ}`hn0X8%fIq`b*X)| z-y-|X*KEA=6tU8SBUXr|$vt_<^gvYA0TscS)1X%i68jUe6lhu--wIb)6NIPYf#tqN zh=xSfq>TsH!&%eLN3=7*km8`rfql?-iD%{i#5vMH{+!GMVm?vNdi)Ul7`lwMR=yI4F`*uJc}I1;X*3A{4}>*P@nz0sv6=)$Z)Z4m=v6cAu%#3GMkF5;;hjT1%QzLx3o#6kci0oLD#mZOk(8 zp_%k+!-p^$J<4VmHS~8D26#MGed6lN?kcP&8@jMV&*AG4=Chuy<)v89w_2w?Dc?J8ad3VpsdEuGB#+Y; z#PRCVpNH;TE9q0j`0(LI+4}DD+~lXj_Sc#8inf~^)|?X1L~J^ZLW$8-`jPL*{BsqK zyGyWx-jx}7JqhwAtuIkktslN#wO51*_KP_~`Q-K@v!)VER@v-opy7RFoq@Tdr<85H z23w*=&H76u(CpZk8D|R*CLC%ZmPVW6hNJ9@bF}!iPR6fsSMO%xJsdb;SJS7IYONGl zgpi=VeeD@!OwQ4I`P9`P)(Jwi&xTT*^r)`Ns=C2xA&5FZxf(4>ljg0Ru;c|d%&M`* zVG93L!Pq!@B;6+~g5Z!D9Y=jb_YIwG^pkY>zC`Z9r?~D0SeA$6Ym<#As**j>t4?}5QGz9q^sn1!FziZtxDBlatd ze2+QX6a$|wd+S;H)>wr(+&v7lp;Rz;bM}ME%aIGL{&6I3Rp1X0b1un*w8gBgK|-nia2s&AmnH-}jxAB1HrVewq-$|M~Ty&<~s zWxQO5EqCr7FHi~PKTKTnldlX>&RUVVZ2O|LFo;`I!s|h8bH~q~AlAE;vmUYiPT|dh zsNnin8K#kx9DZN@GjXzBSi0AyIvFS3*_Yp;sHP`d0G-8C5^mXQM0DP7>@+0@bGRll z3D642b$;0L7F~{NzZ^)W#TQ8`PoN>IqHUuS3A-9Vqjmbo`O;oJw?(rR zJ9_Q1811C~YV>+O@&%Oi?kJNWMj&ITfn)1XSbjM72R^u{~naa{_j(n5>nR%WK#2=uXgbg*4 zk)8-KMeByUN&q~Z*9cCHeM0lrB^jqqJnIAz&tkpaenG>8?Z~0AV)QaWR_p~QW+(ag#=nb}yTn@hS`)|I00JS(dw_s1`58knY?8>F-?}fZ73c@&O z!Z0s~P$70-VP`YZmZJt5_65Vqy0rx2-Ljzsjh3XcvnWd`zk#$YNsDs=M+Rnp!tH=> zkGgr2{62v32UrbOcKmVCpt5LwUJO ziWj2BBL@SU5gk-~k?rkSa8l6YA4?rRNV>?zjZFmhk%^0|_Op0rYP%kxI*-hqj5Dyi zp(tgei>LttagF$53Zvml5q|*3k&&I!fBHQ~wU9myx3BTA&M*{zB66#^iz%AOi79=n zn$*yIeY^Tte7{oxqe`av8$Lp0zdObWis79b-EDPU+N^a0+iEbxSJ0-N31SduWqw@) z*d*yQF9r8&MO=anr&U+jf{2n?qhk69&JY=_R?y33h8%2_^$~ocJRrI~2(*~&w)ycj zm1<=?U8lJ>s}q^U0oER`h1ZzMIc)1q!(4U&%`#KOe9cgmHr6VV;Pu(y7W63I1(po# z?cavNhrf<9ZCQBFQEU^?262cVO`a5;&Q;he`SG10bM9lNqr^wZkgaRj@`W-SO)NDs>1h}HFt%rVLrYiJChd=28hb40v;*qb42{c@ zEvMj~oTwf3PZuiAe&A)T{J@p5<2XzRupD4y-kxR5^TF==!2?FOB;d;D+C;ToC2pXv zO-9X4@+^C$0$1E>8g&;hMFGQY0BFz=j7Ul84`l0A+f@8fhQ3Q(p^WtnEF#P_+#tPe zEn2I@`LNUxravpbLI{qT`g6;=sCRtE4u2FZyg+2kYbAYN2)x^4m{z@vgRe}tJSek- z0(a3_$s+ro1sYkOeHiK_{h(+G3jD4IDoKW!!+IX>hTrUc3rqSvh{Ve15(0Bn&2yh`wgRlh9hQx1tWcIBp z)=gTEn#gd(f%Tk1aT!iS5c~z0c;4-I9>IKKh!c557`4)Nt)?CF19MU<5fN;?w1MuN zd_N>BKRdL19#T7zP+Z_pTzH;nl<6{rcpl(PMrDi1s)?xHGW(I5uD1Wfe4y%1Qp(1O zf%rDG+VJ*zh51*34=%MrvKMl(@5` zl-lC_em(w0wu@oFEZVj}?AB>l#ayDwek+yz#Ub-q=_I<=a@6d0nF^OX0o-Hfdh64yfr@P~QT8XjQ zR`sI3au9dSMoQqDyLYv3(RRQsg?8?`2&Zm`y$80tw8%5GfA2G6B%#;rcD???w3WVr>-7rU#;)kAp@7=<55&S5J-Pw1=J|Q=hbFb?eTUd;B2b;$4i&GM?c+i(yYI>KL6U+I-cSVgPE})dEwW zUUP?;*LhwAtXoS@&s*AMZ+qyiX4qfRbP1vcWP?@d@EJ)veB{@n96@hMyHyP?!dJ0t z8ObZ^^)Qlrf$FOnIMv{dgSNf!Q4v#x7#OA<#~DO%!B(bMGNSs@s0>-gB2E+%R^B>l znbXPbKwCCwDGp(qmmMlw_j|8!i9|~Y+BE48+W6}2%QwrjtH1%z_p+Vk+9*KV_b^_+wC8QG67ha=>T$vUF{_mHum$66Mi~6zwt&=W2#@k5+ zT`VILWWiOrCL5*uQbJkaKU6+{svbKkpMKE?Zt$h}Ls()9hVprpe6(~pim?BL+W6t& zILk6aYDB`>+FXH+u6z>a7+Z*PEi%RMw)w90rHwJ>#J2PKt%Z4I6`sHNGza@QI8^yI zw019{wd|0Lcu6rPn~-hb#c_D2cPi7=yPV1*H2bBOJ}1ZNZ+EJk2=nL{rMmOh3Q{ut ztXAQsr39^mK2KKwJIJmCDc{c++JC4J-&Pybi|mM&wm>@SBlPmy^()yLN{feZAHZOV zSH_U~toOs=`+T`+V%cUZcDal)jTBZ~>rIY+sah3J$U-PPG@ecQ5+1zfi`?AQGWIEN z(muN%W|?Pn%u0J@y=%zAc783)?#&?hGOSm z&R1V)s#{Hya)KC6Mqd;ADDk9mZ>E+DK8VPWp`tU-Cp=uI#w~BHkr$AM$O3mNUr3pg zlJh#*2YJlhnb2}d)W5k(h|fvxf73KM_u|FcH4Zm}LX>_H+O@MR zsV|?m?Gfyu<>(`h-Xyb*pH+wdHt+V`@aizWpG;SOHHp>|IH1_O-XrhMXeLtXRHva^ zZ7p$OHYnX`a7CFO5vvXwxDv8IsHvKG>4^KrVDMNg3>nVX!mgN6MSm_Jq}D09-~TW? zCVQ+#-3^Hn^CSzk4r3&(;G;%V&{4T3d<6!@TvoQ5f6Fw^7Z)-M2pEceI9f6crpq_l z-o5m74T0|Ufw}nLSY=2;3O^Q3I@<_D@aphF$TZ8B(kca;CERA`KkTygZttSp_#rcv z{>WNdkXPVTSRS{pgfr%HJa@(abUXNePx$?7s_g&2C$?6qY_3LwXL;m^vqEnN+ z6J}fCIjIO7Hs8?7e3S#$&`yw-I8nu83`WToHimA^&>I9?oXrm}J`P-Q-?2XX;TwPg zLCj3vjGaHmkT;E`F%Zy*TQX&0-SgwlA*!lUcn_ezEh&kiWfO}?+dJh2<#=`FrIAaX z1zH}ci-ppt;$!H?yvCmCp~j@D_ipKF46NKuSduokBPP!kq!=pB!@l%(Ce4@3&Rsk8 zl##e;MhtMjD!Qqh!z;Gp$@8t z(fF%xLy8>7*{J$_RSk|eT16dp_7mAskfJ;+twa%4`|ROpsUTdn9H1H))?JwA+ruXl zP3GujJaTw$$^Eg9Xr8|CbI%+81jWWpEUQb)+Z5&Sgxz+~KujF{!lW}b4uj!Y)zeu~ z_%ZrSIar>46>GjD>J91k;G={uQrAI9R4W}9g9nQ@FFV4ImYnmL6dM5~W}^I>hhi2k ziPYO27dldF`|DN1E^)zx2(x>GMTahNNQ7{s^tB2IJpE4Kbp#n@*-ITCRNfM~)Nqtv zvlYTG-&y55y2MTFZreMGh&QK?a9*q+=4^Cayx%=_x%A!yRg$57!k~3&V`4=r`mnHq zQ<)?86n5FU!p4|K8=msDzhw_`gDk{TbhYWtHw|!=Ft^wPXRc7p3QzOdd&I6W?jUEw z>?9zrL|pX;E!dw5_*9u3lPapgFrmwvVgl75i0NWjVC8i`BP+?_L83K2p=uDDB~lDU zc&8(G4!1e*8GG%R+im4tL>YN<(yR(Y-Anv7m_o!e)ZQEH_~K9I*Cq4e%}7&?9N?3>&z5lh7?`xKSYxEig~fSkUtgQAinx;XHg%6>~a0 zyAM$#+TXYee?k{Z+pfhp=*?V}L?ZQvGE9laO!L)BrkRotc|&oarI4Mx3tc1^qW5)* zH%7MtW|)T25;VVC+NAe7#*hVUSgc4hWEBJNOTDk~Gv|=0h}Ti%c%^-x8LV0K@W3=p zSXe|aRhWQ1+u%gKpW>6DJvJcu@8CLrtb_9}V0SWYqT_FaD_uf07fnKz*wAw1UdxAk z+l=utNQ984m{D`P(dnovT_CTTe40{5ThM36f>w`O0L+){P_E_uVzyPY*rpw_Tzq8N zCZ}XT#@E zx%FT!X4vuL{*Vmv(gvvmeE$L@<8FW9jg5jL;WhL-F4rd-&Bf-te&(}CBnin$)0*`9SVx6v(_OH$0re5!!0H)^A?{#FBD{{v9T~`9bsELn5kp}RkdXkE{AmjIVEXG zKGyAyjLR0}LLc>)V;7dfC_?EEM{r1?P%>W(M@|V-NmENvP3{hO8VGhe|5Ibc_;>n5 zO49}e0h-bO@%lTG!bs1@XYN3x@*CvA$i&7##LC2=Mz1JiqigZ|HoemCZ$W$MWerUX z&Gi5Hl$55Snav;X#WiiL41YTZ9V;{FGz>(vf4pM`g3k3$*V^3HN?X?&gp&ML{O&(e zl7HfezqUZrBZUl77G2O!AcMhj|C5DGpws=)-2Q*?HA3cArvK5xUuy;Yy;j0j=C&5U zL74wK)$g11GDP&UR+?tk7MfPNX4)UQuG5iKz zy`z6z9%cMzdIbLTB}korxDj}7FES7T{_4AjRU+d*QzFQ=U%bZn7<7#LZZ+5QyYZ+rjH-p{goYY@mr#Kgu<2Vh}g_-nud zJggL%?k&Z?8~v+WAEP1xk4=$)hgBrtK@X;v+>OfiM z-^QH&>$uEsnJF_P9RnLHkb&txWTrpM{z))pW&$Ozqj~)+V_j<*dL?n*zd18AS)dc1878zkqE%VLdO7LVq#+bGo~{C zEc|n_@aG}-4z0`#0MLXz6EhP#=!=-?SlQTF8Q6dACIbFg)Z?M%?%D6J(4Xf1kz z5-uJiT?4p3UBe0*%?4$=Og|H!f9?1q%z~1j`~H815j0;8WB~prcRnm?1GqnG^NX>+ z{>mPsLLVD!19({22Jj%T4d5}tHh}xXHa|1D|4pX)uyhUJ{&dYx`+iZ~W5j9zj}5B< zJS_ihq_ zEOg9707lU41`8Vl`(FTJz{A2ffPVnr{5140SK$|>K1LJ=@Yqlsz{8?AfCoWw0FM#H z0o)(O`MqZhO2e5M*g$hx|GD$=ud@4VlZ}X(38ea8e(w)U<^b+b=KS5m03H^?0XztV19*%O4&bptIDm(RZ~zYi z;Q$^Zgah~o5YC^I-v5(;30frM_d&`B0&4*O0Id1bzFz_+`y(8e0p1^_VPpUe75*DS z1#SJ&qqzUN3T$k@btG6>>6k&>70X{b62ON=YC!+_`FnTjzs)E9Y3IK^2pR@_d}H6h z$41luAC{;AJ_u0*e2hd5@Uam!z=tJjfDb~{fYv>FgsOXNL=Es^i5lR85H-NZNYnuD zPt^Rcmt+GzEIb3eKRokq3x8?u9wRpcygxVdyKO(`1Ap84BVoD!WZ>Tx@B%(8GXuOo zGxMiyzk2O4rkVFgW_}Ji{BL>)4@<`Y?@!14wC@+!J;pU>fd4l(0=kK|jEyP11Q8SH zKG;HrR@OG4`F3W&|7-n4b_Pb!%}jsZ;CgyTO~o3IwZw&|QHvmK8Wl3hGXHJ$%b>7H zeQQe-bGofDa6yFn=@QyVn#?apTLTkOI4SyU{Gm*`M$}d$*}l!`pBqx}us7ezWiZJr z$c7?)&BxE~R+u)F`S#W+_hsOndk3`4M$~?8k3Li2sfTF;-*awqx0%W4|Hb<1L&kZkx7k{7<*I(U)M zEyUHbh$yJTzaljTr2$61^)(lN6Vhf^irz7&%J6N*VMfcg&B{S%Qn9ccT=tL?(ZrLAnXtjyhW)JA!xm615w0Eb zFme_tm%CLHUTfqxL7jI~n-%UZ?CcvW_)6TVjjgqU%E?w^LZ zZKHh#P}kvNfDE)1e9qwBj>_1^m0b;K0WqP;fsGonHof>_iR4^F<_X?(lkR(gJsi@W zJm0U75PAq+PQ~lw3;>Hn3bsL2m18WvMaOk=fxJSfJuoVD@SXtiI=ZNAU(DQsW?!hZ zW*P5WEi*7ECL*MXBN}Kfewfc9r+o5JGqxfHlHQuGvn~7Y<&<{Ofv06o^~4mZFL;83}P&cc@2(BgC6Yi z=t(r}iOG5JOdb{LpY;*8kUHV{^U8iJ=WPF^7<&FpP~H&dZJr2`6~z{MJaHLh9}eHl zV$^&R5HgXt%##81IcYF!c?@)0uR)fWXT>!oAvEBZ?`%LvtpnOjWwf~YXVO3iDRCi; zFewcVG0=wfNa;L}BrX&8{eaG8@UhQmmXjK%e6^9si(pxBd%VgzP9`Fx_WK za(VsOuL~6s>YgOiDn=8RjnVNNz~`GptAM40%##KgMB}t7|C)tA&sz;tXMt6y&Rk|H zegn~$pa&PK0}it8i;~@b z0+n||VLE$|gPfBQ0CwI@!9v*P?D-9Ja+ywKlazNfXN%OCHeQo$dTLJ^+%UDo!5XZ( z^?jarKC_%bkGdMd>;!mJFwlakDNAL|GtKuLRBI_6(1q#m2c50C{ymIoAjoz;o9HXK ziYd_k101bPL46MrEzcdM`VzqYyoTvKV$pYpe1^6(q@>(SsD7=t_+ffG|r7^1BX zrom3ZW6hHUvVVnKYZp2V^nKA2O*fzLdoaew*b|AhkVyFrwlGElCZ&gP-0r?76W*@* z(+6o>UlbGsCH8BK?FHYtxSTdPZhX&vfDZivAuQy}H`? z-U3gYhRZzd!a-rS9K&=-Wkw~j83HeS(n0&AJGUG#U{jX8q!sBwHd&{P2y$l4@o?qFLFX7$g(uV8iHw>&q*R$mf z{{@0A2+61FpL^ivF!?S7=$@4@;Hj`_*84@o*JtVClqG%V+my5MQmdN86Y4OiW;ljd zE11HA_H(-u+j%YNdbOJ=%+p%>eF*IYPEKZ|i?51dyEo(ZHPvzp7xMV(#`R`SgL9AZ z5h9BWvv$2ZAlVtb1#8%pDvoO|qJ(fHq6Im&BK%c&1v(vJc{-zc9TUuw;mkW2R);)K z=Gqe40I-h=65DMR44gS??09zt`0nimTt)oTEp-T6-BSkkN8e4ARLmw%w!5cHK@W8M zm2D2Y6$ZpP)q}{Iu9mKJvx>aV+Km#xL|wsK^DB&f!$deH}o{^V-5+Dc<- zeo!e7u%Mnie3hfQu77gnj}!@?RXe+K;NNq^x)n&!P_R{6{v#NV2jAh^X7NA;ik;}G zjR6E=pWEdiR~AyA$LgS%0phPOZ@l&RIDlxw$qCd0Iuuf zS-#Q*eNE#%i|Dj*f$)p|11z?r9ZV(TnwVB%+N)pf@TYc!6y}f{P)Z0lc?#I%Ua`cm zqU7pE%*Rs@nl4MbXCI&ywNnHHY}ds^cZJe#Ez~LnYof4fTULw~BsdM`ARd)YPkEkZ z>a)<1iWhz^#*M0KgXd@?6Vv)4#AwMl*5yg=@Y?#VrsJ)4Dr$Kv%l9=eXtyt1?=z5% zrnH}v0)pSm?HHPU2^^x|?92{9EM$sfe0b+P$d15!}FmWt@=y*bEJuOUA_3P^W9#)g~s+L9U!dokGd zwrIR)^mcg+CX)s1YaV+O4Nx3fyG4vYoc)@itxZfzi*>NAL&*DsJnIYi&x}S1y7f@; z-Xs}HKt(sth1a>_>qBIYW=6^VF@jb(yoRy})C|Sezy<@_8Wt4Lkz)LTu@^z znYT96gL_JKMUw}mdf0DGwj7KuE;bHFhoTo=CnI2ciUbS`;n17Z71+r~!92&u6O1&- z2y~xQ?jV!UL>-gI-|j3y$qLhOFfYSxZHbOD-G>4Wli^;j;@37HclUQzEspC_NaV~J zWMI0L!}{-}Xv%Q=MZBWG)EpORxY*8ikm(&45>y+QQfF7Bh0b0mGr*HdkR1sZ;-eJb6mq^=l(9CWaP8UhVN=3Qa$K6t;4J&HV~nTjqanu4JSi($W{`eGXgIa!I{?$rX_ z-d+3T_R!XXPL~`b(HXNSE`JJk)o zg^QOjlUK%PZZe+~B2kYtz8pEa?4hEji-HkvxEt*7amuvkD%;aHdRrQKsD?5H4XOz z#mKF$Um=Yjn!&X5pxtU5f{V@=MZO4bB?Xx1s=Ing0|9^Ex{flst$z$Ie~&}apinPG zzUUzuBYJ5|?-*FZG3wLYoAnfda?5Rzu+VmKC}E_UVotyU>OQcx+{6h>-@;UKP5bc+wr)ZorTmM9guP$%V7ztiP8DO~} zX2R#7{%FBp_G(CJYmw6CWKCks-nrmwc|njr(m`Oi29wd5LmyZG5x!$98k%7_Ip2d6 z{q`Hqjx=eF@py9l4jZbTG3SpLw15%BYaHKa4u>(2hM9B1dhy79YTOWbH3>9y# zK(R>#^!NAKTTm z7nx&T#B^P*o3*ZMY70alB%irdYtG{dpOTWYx|i4Ss`buexU4h2mayJ$<{~Pp;&QdO zwT$LDWc;yt9=S*8dehU|_^LqTPF*9OepQ%flyEcE8>?`@D&2h5ykFx^>0^bX`oYma zaN~zpt|tTmUA6=j7lEYb?KDGh%H#3)Jk>Fc+#1dorx+0e&s{HEngLB{>ORk`Z*pqN{dnr46GYg*FmVC= zk%5!)?TBYVJB!jh63ZF&ROx2(`euxr;(BH38`bK?(u&f@F2s3#$^K7A7h{Qu+D-O* z>J#P;aDGU<+#imA{FtE(Zb)p*4XRb{Xl&YQYiDZ zn`q*S6VQc(>ec_1k;{4WIx_Jgu@*QBHTG z^9Wh1?_oW0!t+Q#T+^&-|3Gb`v%ecsWepUqzAVNCB6xS41f`M)tISw{3$U&zRGvE4 zfxL{n%RXNH9aEH^j!jo$QCN$*C>J{pj6g$vWoUJkm}!R`J>BiWsk5b}eCkBI{p}?! zHxpL=`O>;2HI%;f{u$&NhQ=m^!H1Hsv$y-LNBWIg*GD}Uxkr^)!UJpO3xpr9_SZk$ ztU3!g&lq7S|Z;IJXO8fE_IFZ@Pi^E6@s%p&=Eftj}&MFmL$4@1Uq!^_eKkeZ* zsy6F#2+=$b$o(YvyqIRP3s!NQYI2{s?WzAE*`iIsc+tbXaG8>8JkjE6= zLEkqu(J^Fr+x#Gl+=9=cCgE7#Hl<58Xji%AuXkWV2DYFJVg zZAtb|wE+7szqbNkV3!1=aqU2;)A=%n(a>8TYW1DFUBY1+FNw71O6*g?)96HjS5Z%f zTV9-MeinSLu-(1ar>__me*F9u0OU!j61$pj;0}u`aZRdS`YRJlZ z+@~H~fo3%6ePh&?sDS6uGN`%X9*P-*3Jn~B(u`ik1#P1;xa&p@rn6MWaxV-$R)Ksf zxEO*r22k-Bw&t?L9?cXVA&towNpOW?xjXP0x*8o{6b*fI#NL5#uUUUW8lJ@XHXLhW zBC}5 z09G*Z37xiQO6dnujrYwx(s`2T{?EU02oxhq7nwct)P5IA`A!f#biejV=2K4T%t^sX zXRyo$6iPWvcaIT)8UyuV!PPfd;(W>#w2pxu(BXxiSc;=m@Io2L(E(9eRP)f$TFae^ z(hI)a^`G3=Dg7!uKM6b~Olf#Za%iMTr0mrYL6kdM)PxAv=8>ja+i3x)?K0XnSs>w-6w>?+tz7Y)$g_K>KM{1v}o&3=bA zN^}ktKC~;!nD^rS9F>T5w9k8t3hl9$&^m3e+NIP;<#68f2Ke)(H28V-@L#j0S0E>mwi%>dYv|4*pgi3lx{X_KVY%ma6bceP+xjxJDA*>C3M3L$RY3J{dPY^tZnJ5guRYUAy z3}HgaS6i0Ju=lzGUyg>hhqf6q$xzhqpboJ^-p`vP|)oD1ryZ5XmhxLwkxu zk9L&_X9<%J1)?XQy&)HLdt0y0Gx3x;p_cU07io@-Ctqo1%)=y($PcZ<`;?Y8jq^TO88^%vjSP>vPQcwJw?9B*kZYh==nJSA(nBRQQF z#i|1P+@?O^bCZvvH1p~jVN4=qWmg|hDW!~;h zrMebhkq(cDrl3}f7#Wqob3zs}8i;l+fA09sB;M0j3{l4T738?p*@7vg@&wpyp%G#u zE@qN-hG+^)cO_qh`UA}lRp0kPL{@|(dfkOb^R$US1gn$sJ2CN40MC~-Mo+4vlI=Fg z^&w=0G$9>D@RIQ=MWzLkQNJWb!1#B!1&O$U?&g*wQ1e=V%@E^zo=_<-X}ei%U5F2! zc`pi8D36j-x)F_`jsR2kvXqDkL-JE{8dOmd?_~dK^5;-EV6=P-${q{fxR30ZEU-=e@3(_1X)stL5AMl*MFV1m{6&m5EN#Ml{^?1#l5 zdWONy^CLbCPk_TtbVavn^o;N6b;v-5jC1RDf?|hDM(}Cq37Tq|9Ms?t=2X)b;8XJU z%+=KEuLT3ohJ%#&ieu^nk`>Fdx4+xrwA#w6n;zvD1H99TB+^iK%nSt?zYU>lms=-D zi?87CIP`}?DP_-vg;)+YE4Gco`J0rZQgxaRhm%l_Nh%>8vT?34Xist{UJPZ6l_rd< zuDpq#W~|&0I*JoYgZak0Nqdx7CP)`vFyPM-(;0f2-d#{(Pfq-nG;TyR%#S9y$V1*_ z@a@ZT+@4HF*vKybCwb*syp%_UT9%a7#cqA^ipTNRWm>}$787rF$4%d^`Vs6D{m{vn za2CjjY%gu#qc;6|V(Su;KSw@SYlJTJv`0I7@%zDn)wIDYRx!uQ+5J_M^iFuzz3NF8 z`dMd@4!aNEu_P1jZn{|AYgt*V3xsxTne{UYa@k1>b3^M2yoB)za}BLiw~Us;u54Jx z0_a)C&f687R010t{Tq)uqQ^|juMtGASzWh!=qkrl8(QQp+H(%mJ11uq-DUbJ$7^P^ zFDjI8D_-52#fQ^pSkj|h$8EKcf3LWppI%cjn+>8bNJhF{t#B?4xLOm{yty)R&ZLnh zzq8^Bb?U4->~ww=)F|-OHPv{nYoOXCMQ=9>&ed4PrCq~y?VR(omRGWqll?f~XXo1W z))`}inAD9O?N$-a1+TSflaCEUt9+f!CZCpt$Y*vark3I;$)|V8hFqL{Z%-=|8=Nk; z_F0}c`X05$#?JAJ7bR6%Bgl;eE;}xv^8`ASR(3p{aW0~kFnN3QwP&ZTs@|e|Lg1@z zaPsp{+BhMtXf84q*1X|2S*qUFntgN9PiDm{%%M%znV=bbe7!M2iISH0Mi4*zvGZ$WrIMby<-zF zylW9~m}^e(@ovQ5>+3|J7va0wb3DVylM81p3_uHlS%=!_B|ZdoRlJ>qnRomM55djS zOyMp2WSyytO4Da_@v6|2=!6AR<5;=Qw#YZ9uj>OW`ho~9kB`aDwwKdupVu9CEYzQ` znZH-I*~e`d`ZnX=K+&~=5h=-lKzZaWPpSDX9wJ*pOETWWcvPe=y0nBlS7m~7>L8+a zagu$>NKP@Iz^GE5?W7eNR>*O&R|@<*zs5-IBHKGisNG@?zi#uBne4(2v-4R3E@5TD zu((T1JTJJ7Hf7`Ve%}5j3omI(_0p}Thku&bZkh2u=QeH({n_vg(qTQ-3hO?st z8)+Dwj8U=@niWJHr79ur;^Ql5-f;<%J0e*H(A{8n!0wMO9dq5wxUdAroI9%5h@6qD zD*6+`gqAFs*h3%R3IR8T0;)d5R60uv!xC6O*FVI%kti7qx(e$n4RbCV5&E`QBz>`Q zrQdkH)Y15AU?JD~*x|Oq(!%97ql3S12`)HxMxDnMklv?dVs9~+g=W$g3_&QkVX>@_ zS1)T_3a>G8RCm&&-mcgXDTk;+Zi&M5&B~3;m(+pESM+6fXQVXwK?EUff7uUr=O1mv zA8GsT7v0&g3&Xw;wpBaF>%@{3aD5s4;GZ`i>OJwT+=Ha1I~TCrl*uHMkb8N+ zL6_RbOqVK9F!O>Q5ho`}fZ0;)sezw$@S#gI6@5iFW!1`sk!4y(2#Wq>JZfe$KeDg| zFTZ7gB*9`x$7fhhWlPjvA8k!0MoDfTmCYgL52!)}rlB2aUqU-*+6$swb3n(mx zHFOS4mB67B_QPg&it>Fs?g zglDEl>x)S+hgu2liz)I6FE?pi;iS(F)i?@-Jil?4=D9lkevsY6|H6am;LW4*vm8YER5X_9SSbk%a9V?WB?6zO(=0VuBie|*2o*p?nb%18Jvbt z(Ly9hPutmVFN3M~Wls(_5Bb#&3L|2rZg-AyFXZN&XD$nQ5^giqRhbDB`U?v-dn)_9 z57W0h_AnMo4IA@5`tRu{;xC;e?Pm9BN+MLwVY9AgqykBYoe>Nmv0Y?Jf{S>^2kL^m zYVe8`H1qNH<$Rnig!|lvg3=9E@Su|n?lgXs`*E)vU4N48$@Yjbbe~az zNIT^*dkd%k6a>0EXpZI%fQ6CR4*mLik42=GbtS3wmEj(`Vc&e(IKI4*_!C~*3ToV$ zeZ&H-GQd`NdfSAko-;Uqhor>msC2FL@C9#%eRl!@&l`%X`OewF<}D_Bo)>1Y zrE{?iGfrsEm2b9ADav;TcgqqFW~QF!Za|e~`w{o?4GvjeyS8K9#$SjU8&|f@@X(M>% zU9gL5ct%kU&28gpx6$w9IbVZGcX zy=lxD=wL)w>>gP#KNW4>zWA^eE|lN|?|5 zOa)UY&8Y)B~c6g!P! zPhsLg3J<5xEUDF2YU`ffDo)M46SXt%=-$35F5wiKu76Hlde+hXudD3MEniW|>gh6? zi_f!*kzC39y*{3_6q-la?(Ss=e_i*`?oL%qy{qu#bD29Q&Ir9TYnmO zdx$bGJ}e#r!mZWjoL4KFS#1NXpkC*9{-3_i{+|g1j^pR)ypo4kCnL#}h-!`KYzgYr}y{$cADtG6Olfw+QO`pt7I1?fwu9cKYvGmfp?nrd7jh_eEc)09g%=L z7DPCk@F^zi2G;mSQ8rN;)2WT7d4a@dCD>@TV+bNqgY0~wYJ&(kqGtQ|+4%px>n>jZ z$%wj(soCKatHITkn!@s@alHdYptt42!6SB|grU~MZ(YADm|mfeTy=RdV}Y}vx3}*H zS351?%BEexcQu7~hw5PI+Q#PAT6VT|tz=%A@sTEF&Uy`6#9Ko_xKe_lo)fHiz=AkK z?a$~IZaOerXUHHeB%UF#i%Y&Raer@UUnHxRjz?mpiLq0I3mD6$@QZ?%j}0waNc$LR zy%4B==j2)>k^uOkbO;Sz=Pb+`&(R9BJ|KULttA&PKaUa2Q_ z@F6PWRR1WEN0(D-z$|BZk=muR9O$j(*J7!2dxPX;?K9o|`{Rda!tkqe->w!>qa(&1 zbxaDQ6DWZ~Ri#M8b-Y~C>=fqf^R`(A<>(txiFSc~U@@f@OPVH#kIRQnuWux*sV90gG zDE$^9RC>(a{(KrW4^W$~xawP*Gn$HwU_rS|?SNldn*r z_iUSVd!~MKd~(fU?oCG8S)H`X#@SqLR-pZTbrd2XW*l5&J>m!mi{2mhcQvG)DcJue|Fi!cT_Bo-iNt=hY{0=&!|m2BL_MdxTFtu9AT?SF5#r$t>kiBgfv5OYiS{iujPSg1A3?P#2NfD!bO%OSoRTy z_7v&z^*n;N)gH2XaVvR0yZ~#1D#I>hHl%XBlfIHS_#@1z0-EbgPJ4% ziMNz@oM;|y!Na-x$ai~k54-bEELr~?qQl?xfu)d-S%Ig zP@7Yd@gwyyV}88$Xhb|PX@nCqdM8c-2rL;MQyFbl(e!&jXqjpgZ6fkf`O4{g5cAX& z-&5DefU%w)<@}*F_BXIx_TWrT+4zWk*DrPUiw=_ohnu4SNxtyhhQ!#r#%26ewm3Vh z3eb0Cqmn;EN@X?{uKUQ1GXazAGw5T&;`Q>LYBdAC@n9FG2`X~rdC#*I1`}B~q8lIe zH9Z4AY4RA&Vr>T#`>*!#x=CiWV$pnt$6z+aX=A$i1N~+HGKh#)~$IJ zBzw(A@355%F}z3)8;6ysJRgPw`xNuOi91JHO%`ocCh|PzW_@+?R`qrOZ~!;FHT!PT z-YopB`rrrJb-}S2`_fY#b5Y;el + + + + +Probing — Agent-Native 分布式AI训练诊断 + + + + +

+ +
+ + +
+
+
P
+
Probing
+
+

Agent-Native
分布式AI训练诊断系统

+
让 Coding Agent 长出看穿分布式训练的眼睛和手
揭开 AI 性能的真相
+
+
+
版本
+
v0.2.5 (Beta)
+
+
+
代码规模
+
Rust 86K + Python 15K + Web 21K
+
+
+
开源协议
+
Apache 2.0
+
+
+
日期
+
2026.07
+
+
+
+
+ + +
+
+ +
+
汇报内容
+
从价值到技术到增长 — 用云原生语言理解 Probing
+
+
+
01
+
+

价值和意义

+

万卡训练时代的诊断范式革命。用 K8s 类比定位:Probing 之于 AI 训练诊断 ≈ K8s 之于容器编排 — 从碎片化工具到统一平台,但难度更高(不能停机)

+
+
+
+
02
+
+

技术方案和独特性

+

四层架构设计、没有北向流量的范式选择、五大创新设计原则、SQL 联邦查询、分布式火焰图、Python 变量跟踪、NCCL 等待分解 — 6 项业界首创

+
+
+
+
03
+
+

技术深度与竞品比较

+

10 款业界工具逐维度对比,总分 3.85 架构领先但成熟度差距明显。诚实评估五大短板,明确互补而非替代的定位

+
+
+
+
04
+
+

增长计划

+

目标用户:AI Infra 团队。框架无关统一接入,AI Agent 自动诊断。增长飞轮:部署→零改动接入→自动诊断→Skill 沉淀。从工具到平台

+
+
+
+
2 / 22
+
+ + +
+
+ +
+
万卡训练时代,传统诊断范式正在崩溃
+
GPU 规模从 256 扩展到 10,000+,传统 "先收集再分析" 范式在三个维度同时失效
+ +
+
+
O(N²)
+
数据传输爆炸
万卡全量 trace 达 TB 级,收集本身成为瓶颈
+
+
+
3h+
+
人工不可行
10K rank 逐个检查,即使每 rank 1 秒也需近 3 小时
+
+
+
误判
+
级联故障误归因
ring/tree 拓扑中 1 个慢点多跳传播,统计方法将受害者误判为罪魁
+
+
+ +
+ 核心矛盾:训练规模在指数级增长,但诊断工具仍停留在"生成火焰图 → 人工解读"的旧范式。当 GPU 数量超过 1,000 时,没有任何人类专家能有效遍历所有 rank 的性能数据。 +
+ +
+
+
传统 Profiler 的困境
+
+ PyTorch Profiler、Nsight Systems 生成 GB 级 trace 文件,需要人工通过 GUI 分析;不支持结构化查询;不支持跨 rank 联邦聚合;无 AI Agent 接口;诊断知识不可复用。 +
+
+
+
需要的范式转换
+
+ 从 "收集 → 分析" 转向 "查询 → 归因 → 闭环":查询推送到数据所在位置,利用执行模型做确定性归因,AI Agent 自主完成诊断闭环。 +
+
+
+
3 / 22
+
+ + +
+
+ +
+
Probing:Agent-Native 诊断范式
+
不是又一个 Profiler,而是让 AI Agent 成为诊断流程一等公民的基础设施
+ +
+
+
Step 1
+
观测
+
SQL 查询活体遥测
python.torch_trace, nccl.proxy_ops
+
+
+
+
Step 2
+
诊断
+
运行结构化 Skill
health_overview, slow_rank
+
+
+
+
Step 3
+
行动
+
干预活体进程
eval, config, inject
+
+
+
+
Step 4
+
验证
+
再次查询确认
闭环诊断回路
+
+
+ +
+
+
三大用户价值
+
+
+ 研究员 + 调试训练不稳定性,实时检查张量值和梯度,无需停止训练 +
+
+ 框架开发者 + 零侵入分析框架内部,在生产环境中调试用户报告的问题 +
+
+ MLOps + 无需重启服务即可监控,跨节点关联性能问题 +
+
+
+
+
安全边界设计
+
+ MCP 接口默认只读:仅接受 SELECT/WITH/SHOW/DESCRIBE,结果有大小上限。

+ 干预类工具(set_config、eval_python)需显式设置 PROBING_MCP_ALLOW_WRITE=1 才启用,且每次写入都有审计日志。

+ Agent 能放手诊断,只有在你明确授权时才可改动训练任务。 +
+
+
+
4 / 22
+
+ + +
+
+ +
+
如果用云原生语言理解 Probing
+
Probing 之于 AI 训练诊断 ≈ K8s 之于容器编排 — 从碎片化工具到统一平台
+ +
+ +
+
K8s / 云原生  →  Probing
+
+
+ Kubelet in every Node + + Probe in every Rank +
+
+ kubectl (声明式 YAML) + + SQL (声明式查询) +
+
+ CRD / Operator + + Skills (steps.yaml) +
+
+ CSI / CNI 标准接口 + + ProbeDataSource 契约 +
+
+ KubeFed / Cluster API + + global.* 联邦查询 +
+
+ Prometheus pull-based + + 没有北向流量 +
+
+ Sidecar 注入 (webhook) + + PROBING=1 / inject +
+
+ OperatorHub / Helm Hub + + Skills 社区市场 +
+
+
+ + +
+
+
同一个级别的意义
+
+ K8s 统一了碎片化的容器编排生态:Mesos / Swarm / Nomad → 统一 API + 声明式模型

+ Probing 正在统一碎片化的训练诊断生态:Nsight / PyTorch Profiler / Megatron profiler → 统一 SQL + Agent 接口

+ 两者都是从"每个团队写脚本"到"声明一个意图"的范式跃迁。 +
+
+
+
但难度更高
+
+ K8s 管理的是无状态容器——Pod 挂了可以重启,调度失败可以重试。

+ Probing 管理的是有状态训练进程——不能重启、不能中断、不能有可感知开销。万卡训练一次中断损失数十万元,zero-overhead 不是优化目标而是生存约束。

+ 相当于在不能停机的生产数据库内部建一套 K8s 控制面。 +
+
+
+
+ +
+ 一句话给老板:K8s 让部署从写脚本变成写 YAML;Probing 让诊断从写脚本变成写 SQL。K8s 管无状态容器可重启,Probing 管有状态训练进程不能中断——这是更硬的约束,也是更深的护城河。 +
+
5 / 22
+
+ + +
+
+ +
+
项目规模与技术资产
+
Probing 已具备完整的系统级实现,覆盖从底层存储到 Agent 接口的全链路
+ +
+
+
86K
+
Rust 代码行
(不含 Web)
+
+
+
15K
+
Python SDK
代码行
+
+
+
21K
+
Web UI
(Dioxus WASM)
+
+
+
15
+
Workspace
Crates
+
+
+ +
+
+
诊断能力覆盖
+
+
+ 预置诊断 Skill + 13 个 +
+
+ MCP 工具 + 8 个 +
+
+ SQL 数据表 + 20+ 表 +
+
+ 联邦标签列 + 6 个 +
+
+ 开销不变量 + 6 条形式化 +
+
+
+
+
硬件与生态支持
+
+
+ NVIDIA NCCL + v3 + v4 ABI +
+
+ 华为昇腾 HCCL + Shim 兼容层 +
+
+ PyTorch + 2.8+ 推荐 +
+
+ Agent 集成 + Cursor/Claude/Codex +
+
+ 平台 + Linux (macOS 部分) +
+
+
+
+ +
+ 安装即用:pip install probing — 零代码修改,PROBING=1 python train.py 即可启用,或 probing -t PID inject 注入运行中进程。 +
+
6 / 22
+
+ + +
+
+ +
+
四层分层架构 — 教科书级 Clean Architecture
+
依赖方向严格单向向下,6 个公共契约定义模块交互边界,组合根只存在于 engine.rs
+ +
+
+
L4
+
+ Experience 体验层 — skills/ (13个诊断剧本) · web/ (Dioxus WASM UI) · Python hooks  ≈ Helm / Operator 生态
+ 诊断 UX、声明式知识库、可视化 +
+
+
↓ 依赖方向
+
+
L3
+
+ Control 控制层 — probing/server (HTTP/MCP) · probing/cli (命令行)  ≈ API Server + kubectl
+ HTTP API、MCP 工具、注入、联邦 fan-out +
+
+
+
+
L2
+
+ Collectors 采集层 — probing-python · probing-nccl-profiler · probing-gpu · probing-cc  ≈ CSI / CNI 驱动
+ 指标采集:Torch trace、NCCL proxy、GPU 利用率、系统指标 +
+
+
+
+
L1
+
+ Platform 平台层 — probing-core (SQL引擎/联邦) · memtable (无锁存储) · proto (wire types) · macros  ≈ etcd + controller manager
+ Apache DataFusion SQL 引擎、联邦三路径路由、MEMT 二进制格式 +
+
+
+ +
+
+
6 个公共契约
+
+ ProbeDataSource SQL 表注册
+ ProbeExtension 配置 + HTTP API
+ @table Python 数据表
+ skills YAML 诊断剧本
+ proto DTOs 线协议
+ Federation tags 联邦标签 +
+
+
+
关键设计原则
+
+ 组合根只在 engine.rs · 不允许 L2 collector 交叉依赖 · 禁止 CLI/Web 链接 probing-core · modularity.md 以表格追踪技术债务 · AGENTS.md 为 AI 协作设计编码规范 +
+
+
+
7 / 22
+
+ + +
+
+ +
+
核心技术能力
+
从系统层做起:免插桩注入、SQL 化遥测、NCCL 等待分解、跨节点联邦 — 数据天生是给 Agent 消费的结构
+ +
+
+
🔍
+

动态探针注入

+

运行时附加到进程,无需代码修改。通过 Python .pth hook 或 probing inject 注入。支持远程进程。

+
+
+
🗄️
+

SQL 查询引擎

+

嵌入 Apache DataFusion,支持 JOIN/窗口函数/CTE/子查询。自定义表只需实现 TableProvider trait。

+
+
+
🌐
+

联邦三路径路由

+

AST 级 SQL 分析:聚合下推 O(1)、流式扫描 O(N)、广播 O(N²)。自动注入联邦标签列和查询护栏。

+
+
+
+

NCCL 等待分解

+

导出 ncclProfiler_v3/v4 C 符号,零侵入采集。Proxy Step Wait 三段分解:SendGpuWait → PeerWait → SendWait。

+
+
+
🧪
+

Shadow Step 校准

+

4:1 节奏 A/B 对照:4 个 probed step + 1 个 shadow baseline,自动量化探测开销本身。

+
+
+
🤖
+

MCP Agent 接口

+

8 个 MCP 工具:query/run_skill/list_tables 等。写入操作受环境变量控制,默认只读。

+
+
+
📝
+

声明式诊断剧本

+

13 个预置 Skill:health_overview, slow_rank, nccl_culprit_victim 等。YAML + MD 双文件,可在 CLI/Web/MCP 三端运行。

+
+
+
💾
+

无锁 mmap 存储

+

自描述 MEMT 格式:环形缓冲 + generation 计数。单写者 + 无锁读者,零拷贝零序列化跨进程共享。

+
+
+
🔄
+

延迟 GPU 事件读取

+

采样步延迟 3~16 步后异步读取 GPU 事件,将 sync 频率从"每步一次"降低到"每 16 步一次"。

+
+
+
8 / 22
+
+ + +
+
+ +
+
杀手级功能 — 三个鲜活场景
+
不是抽象的"低开销采集",而是老板能看懂的具体能力:分布式火焰图、Python 变量跟踪、分布式 Query 热力图
+ +
+ + +
+
+ 🔥 + 分布式火焰图 +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
rank 0~127 栈聚合
+
+
+ 跨 rank 栈自动聚合:128 个 rank 执行相同代码的栈合并 count,不同路径分叉显示。Python/Native 栈在 _PyEval_EvalFrameDefault 边界拼接。 +
+-- 联邦查询所有 rank 的模块栈
+SELECT module, stage,
+  median(duration)
+FROM global.python.torch_trace
+WHERE local_step = 7
+GROUP BY module, stage +
+
+
+ + +
+
+ 🐍 + Python 变量跟踪 +
+ +
+ # 运行时注入,零代码修改
+ trace("train_loop",
+   watch=["loss", "grad_norm"])
+ # loss 变化自动记录 ↓
+ step=42 loss=2.31
+ step=43 loss=2.18
+ step=44 loss=1.95 +
+
+ 运行时追踪任意变量:变量 id() 变化即记录函数名、行号、值、类型。torch.Tensor inplace 操作自动拦截。 +
+-- 查询 loss 变更历史
+SELECT lineno, variable_name,
+  value, value_type
+FROM python.trace_variables
+WHERE variable_name = 'loss'
+ORDER BY lineno +
+
+
+ + +
+
+ 🗺️ + 分布式 Query 热力图 +
+ +
+
+
r0
+
+
+
+
+
+
+
+
+
+
r1
+
+
+
+
+
+
+
+
+
+
r2
+
+
+
+
+
+
+
+
+
+
r3
+
+
+
+
+
+
+
+
+
+
...
+
+
+
+
+
+
+
+
+
🔴 rank 2 是 straggler
+
+
+ 一条 SQL 跨 rank 聚合:rank × step 矩阵,颜色深浅 = 步时长。一眼识别 straggler 和异常 step。联邦下推 O(1) 传输。 +
+-- 跨 rank 步时长热力图
+SELECT _rank, global_step,
+  avg(duration_ms)
+FROM global.python.comm_collective
+GROUP BY _rank, global_step +
+
+
+ +
+ +
+ 这三个功能的共同点:数据天然是结构化的、可 SQL 查询的、跨 rank 联邦的。传统 Profiler 生成 trace 文件后需要人工用 GUI 分析;Probing 让 Agent 用一条 SQL 就能拿到跨 128 个 rank 的聚合结果 — 这就是 Agent-Native 的具体含义。 +
+
9 / 22
+
+ + +
+
+ +
+
6 项业界首创 — 套壳工具伪造不出来的护城河
+
护城河在底下的系统层:活体注入、关系型遥测、NCCL 分解、跨节点联邦 — 这些是 Agent 集成能触达的基础
+ +
+
+
1
+
+

联邦 SQL 查询

+

业界首个支持跨 rank SQL 联邦查询的训练诊断系统。AST 级路由,聚合下推 O(1) 传输。

+
+
+
+
2
+
+

MCP 协议集成

+

业界首个为 AI Agent 设计的训练诊断接口。8 个 MCP 工具,Cursor/Claude Code/Codex 原生支持。

+
+
+
+
3
+
+

声明式诊断剧本

+

业界首个将诊断知识固化为可执行 YAML 的系统。13 个预置 Skill,可复用、可扩展。

+
+
+
+
4
+
+

Culprit/Victim 自动归因

+

业界首个从 NCCL 时间戳自动推导故障 rank 的系统。区分"谁慢"和"谁因别人慢而等待"。

+
+
+
+
5
+
+

Shadow Step 开销校准

+

业界首个自动量化探测开销的训练采样器。4:1 A/B 对照,6 条形式化开销不变量 + 自动化测试守护。

+
+
+
+
6
+
+

跨硬件生态兼容

+

同时支持 NVIDIA NCCL (v3+v4 ABI) 和华为昇腾 HCCL。dlopen 拦截 libprofapi.so,映射到统一采集路径。

+
+
+
+
10 / 22
+
+ + +
+
+ +
+
创新设计 (一):没有北向流量 — 范式的根本选择
+
不是实现细节,而是架构哲学:数据不动,查询动
+ +
+
+

传统方案:北向汇聚

+
+
+ rank 0 + → collector → + 中心服务器 +
+
+ rank 1 + → collector → + 中心服务器 +
+
+ rank N + → collector → + 中心服务器 +
+
+ 四大问题:
+ • 带宽 O(N) 放大,中心节点网络瓶颈
+ • 中心节点单点故障 = 诊断全断
+ • 序列化+网络IO 侵入训练热路径
+ • 中心节点需存储全量数据
+
+
+
+
VS
+
+

Probing:数据留存在本地

+
+
+ rank 0 + ① → ② → ③ → ④ memtable +
+
+ rank 1 + ① → ② → ③ → ④ memtable +
+
+ rank N + ① → ② → ③ → ④ memtable +
+
训练期间零网络流量 ↓
+
诊断时 coordinator 按需拉取(南向)
+
+ 四大收益:
+ • 训练热路径只做 mmap append,开销可控
+ • memtable 内存有界,格式统一
+ • 进程退出后文件仍可 attach 查询
+ • 路径 A 聚合下推:peer 只返回少量行
+
+
+
+
+ +
+
+
有意的 Tradeoff
+
+ 放弃实时 dashboard 的「好看」,换取训练热路径的「不干扰」。放弃跨 global 表 JOIN 的灵活性,换取联邦查询的正确性和可推理性。这些约束是设计选择,不是技术缺陷。 +
+
+
+
为什么是创新的
+
+ NVIDIA Nsight、PyTorch Profiler、Megatron 内置 profiling 全部走北向汇聚。Probing 是第一个把完整诊断栈嵌入训练进程、数据零上报、查询按需拉取的系统。这个范式选择决定了后续所有设计的走向。 +
+
+
+
11 / 22
+
+ + +
+
+ +
+
创新设计 (二):五大设计原则及其创新逻辑
+
每个设计都有明确的 tradeoff,而且这些 tradeoff 是有意为之的
+ +
+ + +
+
+
1
+

SQL 作为统一诊断接口

+
+
+ 原则:诊断逻辑写在 skill SQL 中,不在 engine 硬编码分支。
+ 创新理由:传统 profiler 的诊断逻辑硬编码在工具里。Probing 让"找最慢模块"变成一条 SQL,任何诊断逻辑都能被 Agent 自动化执行。engine.rs 只负责注册和路由,新诊断 = 新 skill SQL,不需要改引擎代码。 +
+
+SELECT module, median(duration)
+FROM python.torch_trace
+WHERE stage LIKE 'post forward%'
+GROUP BY module ORDER BY 2 DESC +
+
+ + +
+
+
2
+

probe.* 与 global.* 的二象性

+
+
+ 原则:同一组物理表的两个视图,差异仅在于是否跨 rank fan-out。
+ 创新理由:coordinator 收到 global.* 时改写为 probe.* 发给 peer。peer 侧永远执行 probe.* — 从根本上杜绝递归联邦。不是两张表,而是同一张表的安全视图切换。 +
+
+
+
probe.*
+
本地扫描
单 rank 调试
+
+
+
global.*
+
联邦 fan-out
跨 rank 聚合
+
+
+
+ + +
+
+
3
+

六列联邦标签自动注入

+
+
+ 原则:合并结果时自动附加 6 列标签,但显式列清单不自动带。
+ 创新理由:这是一个有意的设计约束 — 防止用户在不知情情况下拿到带标签的列导致聚合出错。SELECT * 自动展开标签方便探索;明确指定列时则严格只返回请求的列。安全与灵活的精确平衡。 +
+
+ _host + _addr + _rank + _node_rank + _local_rank + _role +
+
+ + +
+
+
4
+

联邦三路径 — SQL AST 级选型

+
+
+ 原则:不是字符串匹配,是解析 SQL 抽象语法树判断路由路径。
+ 创新理由:路径 A 检测到可 merge 的 GROUP BY → 各 peer 先聚合,只返回少量行(80% 集群查询走这条路径)。解析失败时保守走 C — 宁可慢,不能错。这是分布式查询优化器在训练诊断场景的首次应用。 +
+
+
+
路径 A
+
聚合下推 O(1)
+
+
+
路径 B
+
联邦扫描 O(N)
+
+
+
路径 C
+
广播 O(N²)
+
+
+
+ + +
+
+
5
+

Agent-Native 不是事后添加,是架构第一天就有的

+
+
+
+ 原则:MCP 暴露的 query / run_skill / cluster_query 和 CLI / Web / skill 走的是同一个 Engine::async_query 入口
+ 创新理由:Agent 不需要学新 API,只需要会写 SQL 或调用 skill。默认只读,写入需 PROBING_MCP_ALLOW_WRITE=1。这不是给传统工具"加个 API",而是从架构第一天就把 Agent 作为一等公民设计。 +
+
+{
+  "mcpServers": {
+    "probing": {
+      "url": "http://127.0.0.1:8080/mcp"
+    }
+  }
+}
+// 一行配置,Agent 即获得完整的诊断能力 +
+
+
+ +
+
12 / 22
+
+ + +
+
+ +
+
技术深度 (一):无锁存储 + 联邦路由
+
两个设计最精巧的组件,构成了低开销采集和跨节点查询的基础
+ +
+
+
MEMT 无锁存储格式
+
+
+
环形缓冲区 + generation 计数
固定 chunk 组成环形,回收时 generation+1,读者比较前后值检测并丢弃回收 chunk
+
单写者 + 无锁读者
写者 &mut self 排他,读者通过 Acquire/Release 内存序完全无锁
+
三种后端统一抽象
Heap (进程内) / Shm (shm_open 跨进程) / File (mmap 持久化)
+
per-chunk 字符串去重
DedupState 哈希去重,存储为 4 字节回引用,可节省 20%+ 空间
+
+
+ 训练进程写入 mmap 文件,probing 服务器通过同一文件读取 — 零拷贝、零序列化 +
+
+
+
+
联邦三路径路由 (~3,066 行)
+
+ + + + + + + + + + + + + + + + + + + +
路径场景传输
A 下推单表 global.* + SUM/COUNT/MIN/MAXO(1)
B 扫描单表 global.* 非聚合O(N)
C 广播JOIN/CTE/UNION/子查询O(N²)
+
+ 基于 sqlparser-rs AST 级分析(非字符串匹配)
+ 查询护栏:强制 broadcast 需 LIMIT,自动注入 LIMIT 10000
+ 每行联邦数据自动附加 6 个标签列:_host, _addr, _rank, _node_rank, _local_rank, _role +
+
+
+
+
13 / 22
+
+ + +
+
+ +
+
技术深度 (二):NCCL 等待分解 + Culprit/Victim 归因
+
整个项目中技术最硬核的部分:从低级时间戳数据到可操作诊断结论的跃迁
+ +
+
+
Proxy Step Wait 三段分解
+
+
+
+
+
SendGpuWait — proxy 等待本地 GPU 完成 send buffer
Culprit 信号:本地 GPU 慢
+
+
+
+
SendPeerWait (v4) — 等待对端 rank 的 network buffer
接收方拥塞信号
+
+
+
+
SendWait — 实际发送操作耗时
+
+
+
+ 首次进入优先设计:只有第一次进入某状态时才记录起始时间戳,正确处理 proxy progress loop 重试行为。

+ 引用计数完成模型:通过 live_children + stopped 标志判断 collective 是否真正完成,处理异步完成语义。 +
+
+
+
+
Culprit/Victim 自动归因
+
+
+
+ Culprit(罪魁)
+ send 边 (rank→peer) 上的高 send_gpu_wait_ns
本地 GPU 慢,导致其他 rank 等待
+
+
+ Victim(受害者)
+ recv 边上的高 recv_wait_ns
等待对端发送,自身无过错
+
+
+ Propagated Victim
+ recv wait 高但 peer 的 send_gpu_wait 也高
根因在上游
+
+
+ Receiver Congestion (v4)
+ 高 send_peer_wait_ns
send 被 peer 的 clear-to-send 信用阻塞
+
+
+
+
+
+ +
+ Slot Pool 内存管理:预分配固定大小 slot pool,避免高频采集路径分配内存。三重验证(bounds + liveness + 指针身份)防止 stale handle。pool_pressure.rs 在 pool 接近满时自动降级采样率。分片锁 + try_lock 避免阻塞 NCCL 回调。 +
+
14 / 22
+
+ + +
+
+ +
+
加权总分:Probing 3.85 架构领先,成熟度差距明显
+
10 维度加权评分,覆盖架构、采集、分析、分布式、AI Agent、开销、扩展、易用、生态、创新
+ +
+
+
Probing
+
+
3.85
+
+
+
+
DeepFlow
+
+
3.38
+
+
+
+
Nsight Systems
+
+
3.27
+
+
+
+
NCCL Flight Rec
+
+
3.12
+
+
+
+
Coroot
+
+
3.07
+
+
+
+
PyTorch Profiler
+
+
2.96
+
+
+
+
DLRover
+
+
2.82
+
+
+
+
Nsight Compute
+
+
2.82
+
+
+
+
DeepSpeed Flops
+
+
2.55
+
+
+
+
HTA
+
+
2.53
+
+
+
+ +
+ 诚实评估:架构设计 (4.5) 和分布式诊断 (4.5) 确实领先,但易用性 (3.0) 和生态成熟度 (2.5) 是明显短板。总分 3.85 领先但差距不大 — DeepFlow (3.38) 和 Nsight Systems (3.27) 在成熟度和用户基础上远超我们。架构优势尚未转化为采用优势。 +
+
15 / 22
+
+ + +
+
+ +
+
逐维度评分:架构与分布式领先,易用与生态是短板
+
不回避弱项 — 诚实的自评比满屏 5.0 更有说服力
+ +
+
+
架构设计
+
4.5
+
/5.0
+
DeepFlow 4.0
+
+
+
分布式诊断
+
4.5
+
/5.0
+
HTA 3.5
+
+
+
创新性
+
4.5
+
/5.0
+
DeepFlow 4.0
+
+
+
AI Agent
+
4.0
+
/5.0
+
DLRover 1.0
+
+
+
分析深度
+
4.0
+
/5.0
+
Nsight C 4.5
+
+
+
易用性
+
3.0
+
/5.0
+
Nsight S 4.5
+
+
+
生态成熟度
+
2.5
+
/5.0
+
Nsight S 5.0
+
+
+ +
+
+
差异化能力(竞品尚未覆盖)
+
+
+ 差异 + 联邦 SQL 查询 — 跨 rank 声明式查询 +
+
+ 差异 + MCP 协议集成 — AI Agent 原生接口 +
+
+ 差异 + 声明式诊断剧本 — 知识可复用 +
+
+ 差异 + Culprit/Victim 自动归因 +
+
+ 差异 + Shadow Step 开销校准 +
+
+
+
+
主要短板与互补关系
+
+ 主要短板:
+ • 跨 rank 实时聚合需按需联邦查询(非持续推送)
+ • 0.x Beta,缺乏大规模生产验证
+ • SQL 门槛高(skill 部分缓解)
+ • 无 Prometheus/Grafana 集成
+ • 仅 NVIDIA + 昇腾,无 AMD ROCm
+

+ 互补而非替代:
+ Probing 作为诊断入口和 Agent 接口;Nsight Systems 做深度下钻;NCCL Flight Recorder 补充层数据;Nsight Compute 做 kernel 级优化。 +
+
+
+
16 / 22
+
+ + +
+
+ +
+
范式对比:Agent-Native vs 传统 Profiler
+
Probing 不是在做"又一个 profiler",而是在重新定义诊断的交互范式
+ +
+
+

Probing (Agent-Native)

+
    +
  • 运行时实时查询,在线诊断
  • +
  • SQL + MCP + Skills 声明式接口
  • +
  • AI Agent 自动执行诊断剧本
  • +
  • 联邦查询跨 rank 聚合
  • +
  • Skills 可扩展诊断知识库
  • +
  • Shadow Step 自动校准开销
  • +
  • Culprit/Victim 确定性归因
  • +
  • 支持 NVIDIA + 华为昇腾
  • +
+
+
VS
+
+

传统 Profiler

+
    +
  • 生成 trace 文件,事后离线分析
  • +
  • 图形界面 (Nsight GUI, TensorBoard)
  • +
  • 人工解读火焰图/时间线
  • +
  • 单进程视角,无联邦聚合
  • +
  • 固定分析维度,不可扩展
  • +
  • 开销固定,无法校准
  • +
  • 依赖统计相关性推断
  • +
  • 通常仅支持 NVIDIA
  • +
+
+
+ +
+ 定位:Probing 不是替代 Nsight Systems 或 PyTorch Profiler,而是补全它们缺失的维度 — 分布式联邦视角、Agent 原生接口、声明式诊断知识复用。深度下钻仍需 Nsight,kernel 级优化仍需 Nsight Compute。Probing 的价值在于把诊断从"人看图"变成"Agent 查 SQL",以及跨 rank 的联邦聚合能力。 +
+
17 / 22
+
+ + +
+
+ +
+
增长策略:谁在用 Probing,为什么用
+
不是给单个研究员用的 profiler,是给 AI Infra 团队用的统一诊断平台
+ +
+
+
目标用户:AI Infra / 平台团队
+
+ 谁:百卡以上 GPU 集群的 AI 平台 / Infra 团队
+ 场景:支撑多个业务团队,每个团队用不同框架训练
+ 痛点: +
    +
  • 每个框架自带 profiler,接口不统一
  • +
  • Megatron 的问题 Nsight 看不懂
  • +
  • 业务方报"训练慢",Infra 团队无从下手
  • +
  • 人工诊断 3h+,排障靠经验传承
  • +
+
+
+
+
Probing 的价值主张
+
+ 一个工具,统一接入所有框架: +
    +
  • PROBING=1 一行环境变量,不改业务代码
  • +
  • PyTorch / Megatron / DeepSpeed / FSDP 通吃
  • +
  • 所有框架的数据统一成 SQL 表
  • +
+ AI Agent 自动诊断: +
    +
  • 业务方报"慢"→ Agent 自动跑 skill → 给结论
  • +
  • Skill = 可复用的诊断知识,经验沉淀
  • +
  • Infra 团队不用每个 case 都人肉看图
  • +
+
+
+
+ +
+
增长飞轮
+
+
+ Infra 团队部署
+ 一次部署,全集群可用 +
+ +
+ 业务方零改动接入
+ PROBING=1 即可 +
+ +
+ Agent 自动诊断
+ Skill 沉淀经验 +
+ +
+ 更多 Skill → 更多场景
+ 正反馈飞轮 +
+
+
+
18 / 22
+
+ + +
+
+ +
+
系统性 Infra 解决方案:框架无关的统一诊断层
+
不管业务方用什么框架,Probing 都能统一接入、监控、诊断和优化
+ +
+ + +
+
框架无关 — 统一接入
+
+ 探针注入训练进程,hook PyTorch runtime 层,不依赖具体框架实现。无论业务方用 Megatron、DeepSpeed、FSDP 还是 raw PyTorch,采集到的数据 schema 完全一致。 +
+
+
+ Megatron-LM
+ PP/TP/DP +
+
+ DeepSpeed
+ ZeRO 1/2/3 +
+
+ FSDP
+ 原生分布式 +
+
+ Raw PyTorch
+ DDP / custom +
+
+
+# 任何框架,同一个入口
PROBING=1 python train.py # Megatron
PROBING=1 deepspeed train.py # DeepSpeed
PROBING=1 torchrun train.py # FSDP +
+
+ + +
+
AI 驱动 — 自动诊断与优化
+
+ Infra 团队不需要人肉看图。业务方报问题 → Agent 连 MCP → 自动跑诊断 skill → 给出结论和建议。 +
+
+
+ Step 1 + 业务方:"训练慢了"
→ Agent 连接 Probing MCP
+
+
+ Step 2 + Agent 自动跑 health_overview
→ job_health → slow_rank --global
+
+
+ Step 3 + 定位到 rank 42 是 straggler
→ nccl_culprit_victim 自动归因
+
+
+ Step 4 + 结论:"rank 42 NCCL recv_wait 占 73%,
建议检查 IB 连接"
→ 全程 < 30 秒,无人介入
+
+
+
+
+ +
+
+
Web UI = 更可靠的实时看板
+
+ 每个 rank 内嵌 HTTP server,Web 直连查看实时状态。比中心化 dashboard 更可靠:无单点故障、无聚合管道断裂、无中心存储瓶颈。集群视角通过联邦查询按需聚合,不持续占用网络。 +
+
+
+
从工具到平台 — 和 K8s 一样的路径
+
+
+ K8s + 编排工具 → 平台 → 行业标准 (CRD + OperatorHub) +
+
+ Probing + 诊断工具 → 诊断平台 → 训练可观测性标准 (Skill + MCP) +
+ 短期:解决 straggler 急性痛点 → 中期:Infra 统一诊断入口 → 长期:Skill 社区市场 + 自动修复。每个新 Skill = 一个新 Operator,让平台更聪明。 +
+
+
+
19 / 22
+
+ + +
+
+ +
+
产品路线图:从诊断工具到训练可观测性平台
+
每阶段都有明确的价值交付,不是为技术而技术
+ +
+
+
β
+

当前 (Beta 0.2.5)

+

核心能力已就绪
13 Skill + 联邦 + MCP
NCCL v3/v4 + HCCL
已可解决 straggler 诊断

+
+
+
1.0
+

短期:Beta → 1.0

+

稳定性 + 生产可用
E2E 联邦测试
Web UI 火焰图/时间线
3 个标杆集群验证
目标:上生产

+
+
+
1.5
+

中期:平台化

+

Skill DAG 可组合
自适应联邦路由
Prometheus exporter
推理场景诊断
目标:统一诊断入口

+
+
+
+

长期:生态 + 方法论

+

Skills 社区市场
自动修复建议
在线异常检测
万卡可观测性论文
目标:行业标准

+
+
+ +
+
+
关键里程碑
+
+
M1 3 个 100+ 卡集群标杆验证(Megatron / DeepSpeed / FSDP 各一)
+
M2 Skill 数量 13 → 30,覆盖 Top 10 训练故障场景
+
M3 Agent 自动诊断闭环:报障 → 诊断 → 结论 < 1 分钟
+
M4 推理场景 P99 延迟诊断能力
+
+
+
+
学术价值
+
+ 五原则万卡可观测性方法论框架(查询驱动可观测性、执行模型感知归因、校准式开销预算、声明式诊断知识、Agent 原生接口),当前实现完整度约 51%。Gap 是论文贡献而非缺陷 — 每个原则的未完成部分都是独立的研究方向。 +
+
+
+
20 / 22
+
+ + +
+
+ +
+
学术价值:从"工具实现"到"万卡可观测性方法论"
+
五原则方法论框架,当前实现完整度约 51% — gap 是论文贡献而非缺陷
+ +
+
+
P1
+

查询驱动
可观测性

+

联邦下推
只传结果不传数据

+
40%
+
+
+
P2
+

执行模型
感知归因

+

NCCL proxy 语义
确定性因果归因

+
50%
+
+
+
P3
+

校准式
开销预算

+

Shadow Step
闭环反馈控制

+
45%
+
+
+
P4
+

声明式
诊断知识

+

YAML 剧本
可组合可复用

+
50%
+
+
+
P5
+

Agent
原生接口

+

MCP + 结构化查询
写操作安全控制

+
70%
+
+
+ +
+
+
论文叙事策略
+
+ Gap 是贡献,不是缺陷。论文核心贡献不是"我们做了一个工具",而是"我们识别了万卡训练可观测性的范式转换,提出了五原则方法论,并通过 Probing 在生产规模上验证了其可行性"。

+ 方法论文论结构: Introduction → Motivation → Methodology (核心 3 页) → Implementation → Evaluation (1K/10K GPU) → Discussion +
+
+
+
最优先实现的两个 Gap
+
+ 优先级 1:拓扑感知归因算法 (P2)
+ 从 peer + channel_id 构建通信拓扑图,沿拓扑边做因果传播分析。万卡级联故障的核心解法,直接与简单排序做 ablation 对比。

+ 优先级 2:自适应联邦路由 (P1)
+ 引入节点数 N 参数,估算各路径预期延迟,动态调整 fanout。固定 fanout=128 在万卡场景可能导致超时。 +
+
+
+
21 / 22
+
+ + +
+

总结:Probing 的核心价值

+
+
+

价值与意义

+

Probing 之于 AI 训练诊断 ≈ K8s 之于容器编排。从碎片化工具(Nsight/PyTorch Profiler/Megatron)到统一 SQL + Agent 接口。但约束更硬:K8s 管无状态容器可重启,Probing 管有状态训练进程不能中断、不能有可感知开销——这是更深的护城河。

+
+
+

技术独特性

+

四层架构 + 6 契约 + 没有北向流量 + SQL 统一接口 + probe.*/global.* 二象性 + 联邦三路径 AST 路由 + 无锁 mmap 存储 + 分布式火焰图 + Python 变量跟踪 + 分布式热力图 + NCCL 等待分解 + 声明式 Skill + MCP 接口。6 项业界首创构成护城河。

+
+
+

技术领先性

+

10 款工具逐维度对比,加权总分 3.85 领先但差距不大。架构与分布式诊断是核心优势,易用性 (3.0) 和生态成熟度 (2.5) 是最大短板。差异化能力 5 项,但尚未转化为采用优势。

+
+
+

增长前景

+

目标用户:AI Infra / 平台团队(百卡以上集群)。框架无关统一接入(PROBING=1 通吃 Megatron/DeepSpeed/FSDP),AI Agent 自动诊断闭环(<1 分钟出结论)。增长飞轮:Infra 部署 → 业务方零改动接入 → Agent 自动诊断 → Skill 沉淀经验 → 更多场景。路径和 K8s 一致:诊断工具 → 诊断平台 → 训练可观测性标准(Skill 生态 + MCP 接口)。

+
+
+
+
谢谢 · 欢迎提问
+
+
+
+ +
+ + + + + + + + diff --git a/probing/core/src/core/mod.rs b/probing/core/src/core/mod.rs index 1b8ccea4..f736ed41 100644 --- a/probing/core/src/core/mod.rs +++ b/probing/core/src/core/mod.rs @@ -53,10 +53,10 @@ pub use datafusion::arrow::datatypes::Schema; pub use datafusion::arrow::datatypes::SchemaRef; pub use datafusion::arrow::datatypes::TimeUnit; pub use datafusion::arrow::util::pretty; -pub use datafusion::common::error::DataFusionError; pub use datafusion::catalog::TableProvider; -pub use datafusion::error::Result as DataFusionResult; +pub use datafusion::common::error::DataFusionError; pub use datafusion::config::CatalogOptions; +pub use datafusion::error::Result as DataFusionResult; #[cfg(test)] mod tests { diff --git a/probing/extensions/nccl-profiler/README.md b/probing/extensions/nccl-profiler/README.md index 2fb180c3..160f68d8 100644 --- a/probing/extensions/nccl-profiler/README.md +++ b/probing/extensions/nccl-profiler/README.md @@ -165,7 +165,7 @@ make nccl-profiler-bench # E2E: baseline vs profiled under torchrun (Linux + CUDA) make nccl-profiler-lib -./examples/run_nccl_profiler_bench.sh +./examples/overhead/run_nccl_bench.sh ``` Tune E2E with `NPROC`, `BENCH_ITERS`, `MSG_BYTES`. Disable watchdog noise during bench with `PROBING_NCCL_INFLIGHT_THRESHOLD_SECS=0` (the wrapper sets this). diff --git a/probing/extensions/python/src/features/stacktrace/capture.rs b/probing/extensions/python/src/features/stacktrace/capture.rs index d5752b31..95f3e0af 100644 --- a/probing/extensions/python/src/features/stacktrace/capture.rs +++ b/probing/extensions/python/src/features/stacktrace/capture.rs @@ -981,7 +981,7 @@ mod tests { fn py_frame_symbol_folded_label_uses_basename() { let sym = PyFrameSymbol { func: "main".into(), - file: "examples/imagenet_with_span.py".into(), + file: "examples/imagenet/imagenet_with_span.py".into(), lineno: 316, }; assert_eq!(sym.folded_label(), "[py] main (imagenet_with_span.py:316)"); @@ -991,7 +991,7 @@ mod tests { fn py_frame_symbol_call_frame_keeps_full_path() { let sym = PyFrameSymbol { func: "main".into(), - file: "examples/imagenet_with_span.py".into(), + file: "examples/imagenet/imagenet_with_span.py".into(), lineno: 316, }; let frame = sym.to_call_frame(); @@ -999,7 +999,7 @@ mod tests { CallFrame::PyFrame { file, func, lineno, .. } => { - assert_eq!(file, "examples/imagenet_with_span.py"); + assert_eq!(file, "examples/imagenet/imagenet_with_span.py"); assert_eq!(func, "main"); assert_eq!(lineno, 316); } diff --git a/probing/memtable/src/docs.rs b/probing/memtable/src/docs.rs index 9c335089..9c48ab9b 100644 --- a/probing/memtable/src/docs.rs +++ b/probing/memtable/src/docs.rs @@ -52,13 +52,19 @@ pub fn infer_extern_column_dtype(name: &str) -> DType { _ if name.ends_with("_name") || name.ends_with("_type") || name.ends_with("_url") - || name.ends_with("_addr") => DType::Str, + || name.ends_with("_addr") => + { + DType::Str + } _ if name.ends_with("_value") || name.ends_with("_ratio") || name.ends_with("_ms") || name.ends_with("_tps") || name.ends_with("_bytes") - || name.ends_with("_seconds") => DType::F64, + || name.ends_with("_seconds") => + { + DType::F64 + } _ if name.starts_with("is_") => DType::I64, _ if name.ends_with("_sec") || name.ends_with("_rate") => DType::F64, _ if name.ends_with("_id") => DType::I64, diff --git a/probing/server/src/server/system.rs b/probing/server/src/server/system.rs index bdcfe9a3..5fc2976b 100644 --- a/probing/server/src/server/system.rs +++ b/probing/server/src/server/system.rs @@ -66,11 +66,10 @@ pub async fn get_overview_json() -> ApiResult> { Ok(axum::Json(overview)) } - /// Get local processes that currently expose probing memtables. pub fn get_local_processes() -> Result> { - use std::collections::HashSet; use probing_memtable::discover; + use std::collections::HashSet; let mut pids = HashSet::::new(); for table in discover::discover()? { @@ -79,10 +78,7 @@ pub fn get_local_processes() -> Result> { } } - let mut processes = pids - .into_iter() - .map(process_from_pid) - .collect::>(); + let mut processes = pids.into_iter().map(process_from_pid).collect::>(); processes.sort_by_key(|process| process.pid); Ok(processes) } diff --git a/python/probing/bundled_skills/comm_bottleneck/SKILL.md b/python/probing/bundled_skills/comm_bottleneck/SKILL.md index 64100bdb..45e2d014 100644 --- a/python/probing/bundled_skills/comm_bottleneck/SKILL.md +++ b/python/probing/bundled_skills/comm_bottleneck/SKILL.md @@ -25,7 +25,7 @@ parameters: | NCCL profiler 插件(**优先**) | `nccl.coll_perf`、`nccl.proxy_ops` | NCCL 原生事件,执行时间/带宽精准(见 `timing_source`) | | Torch API 层插桩(回退) | `python.comm_collective` | Python 墙钟,launch 层粗粒度;独有 `global_step` 上下文 | -NCCL 插件启用时 Torch 侧插桩默认关闭(`probing.torch.collective.enable=1` 可强制同开)。 +Torch 侧插桩**默认关闭**(含多 rank);需 `PROBING_TORCH_COLLECTIVE_ENABLE=1` 或 `SET probing.torch.collective.enable=1`。 ## Parameters diff --git a/python/probing/bundled_skills/comm_bottleneck/steps.yaml b/python/probing/bundled_skills/comm_bottleneck/steps.yaml index b4c06d3b..8581bcf2 100644 --- a/python/probing/bundled_skills/comm_bottleneck/steps.yaml +++ b/python/probing/bundled_skills/comm_bottleneck/steps.yaml @@ -75,7 +75,7 @@ spec: GROUP BY op ORDER BY sum(duration_ms) DESC on_empty: skip - empty_message: "无 comm_collective 数据(NCCL 插件启用时 Torch 侧插桩默认关闭,属预期)" + empty_message: "无 comm_collective 数据(Torch 侧插桩默认关闭;设 PROBING_TORCH_COLLECTIVE_ENABLE=1 开启)" - id: op_by_step title: "每 step 通信总耗时 (Torch API 层)" diff --git a/python/probing/bundled_web/public/assets/logo.svg b/python/probing/bundled_web/public/assets/logo.svg new file mode 100644 index 00000000..baaecadb --- /dev/null +++ b/python/probing/bundled_web/public/assets/logo.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/probing/bundled_web/public/assets/tailwind.css b/python/probing/bundled_web/public/assets/tailwind.css new file mode 100644 index 00000000..06bbdaba --- /dev/null +++ b/python/probing/bundled_web/public/assets/tailwind.css @@ -0,0 +1,7542 @@ +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +/* +! tailwindcss v3.4.15 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden]:where(:not([hidden="until-found"])) { + display: none; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.markdown-body { + font-size: 0.875rem; + line-height: 1.25rem; + line-height: 1.625; + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity, 1)); +} + +.markdown-body > * + * { + margin-top: 0.5rem; +} + +.markdown-body h1, + .markdown-body h2, + .markdown-body h3, + .markdown-body h4 { + margin-top: 0.75rem; + margin-bottom: 0.25rem; + font-weight: 600; + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity, 1)); +} + +.markdown-body h1 { + font-size: 1rem; + line-height: 1.5rem; +} + +.markdown-body h2, + .markdown-body h3, + .markdown-body h4 { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.markdown-body ul, + .markdown-body ol { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.markdown-body ul > :not([hidden]) ~ :not([hidden]), + .markdown-body ol > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.markdown-body ul, + .markdown-body ol { + padding-left: 1.25rem; +} + +.markdown-body ul { + list-style-type: disc; +} + +.markdown-body ol { + list-style-type: decimal; +} + +.markdown-body li { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity, 1)); +} + +.markdown-body li > p { + margin-top: 0px; + margin-bottom: 0px; +} + +.markdown-body p { + margin-top: 0.375rem; + margin-bottom: 0.375rem; +} + +.markdown-body strong { + font-weight: 600; + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity, 1)); +} + +.markdown-body em { + font-style: italic; +} + +.markdown-body code { + border-radius: 0.25rem; + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); + padding-left: 0.25rem; + padding-right: 0.25rem; + padding-top: 0.125rem; + padding-bottom: 0.125rem; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 0.85em; + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity, 1)); +} + +.markdown-body pre { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + overflow-x: auto; + white-space: pre-wrap; + border-radius: 0.375rem; + border-width: 1px; + --tw-border-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); + padding: 0.5rem; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 0.75rem; + line-height: 1rem; +} + +.markdown-body pre code { + background-color: transparent; + padding: 0px; + color: inherit; +} + +.markdown-body a { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity, 1)); +} + +.markdown-body a:hover { + text-decoration-line: underline; +} + +.markdown-body blockquote { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + border-left-width: 2px; + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity, 1)); + padding-left: 0.75rem; + font-style: italic; + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity, 1)); +} + +.markdown-body hr { + margin-top: 0.75rem; + margin-bottom: 0.75rem; + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); +} + +.markdown-body table { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + width: 100%; + border-collapse: collapse; + font-size: 0.75rem; + line-height: 1rem; +} + +.markdown-body th, + .markdown-body td { + border-width: 1px; + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + text-align: left; +} + +.markdown-body th { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); + font-weight: 500; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.pointer-events-none { + pointer-events: none; +} + +.pointer-events-auto { + pointer-events: auto; +} + +.\!visible { + visibility: visible !important; +} + +.visible { + visibility: visible; +} + +.static { + position: static; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.sticky { + position: sticky; +} + +.inset-0 { + inset: 0px; +} + +.inset-x-0 { + left: 0px; + right: 0px; +} + +.inset-y-\[7px\] { + top: 7px; + bottom: 7px; +} + +.-right-3 { + right: -0.75rem; +} + +.bottom-0 { + bottom: 0px; +} + +.bottom-1 { + bottom: 0.25rem; +} + +.bottom-1\/2 { + bottom: 50%; +} + +.bottom-3 { + bottom: 0.75rem; +} + +.bottom-6 { + bottom: 1.5rem; +} + +.left-0 { + left: 0px; +} + +.left-1 { + left: 0.25rem; +} + +.left-1\/2 { + left: 50%; +} + +.left-2 { + left: 0.5rem; +} + +.left-2\.5 { + left: 0.625rem; +} + +.left-3 { + left: 0.75rem; +} + +.left-4 { + left: 1rem; +} + +.right-0 { + right: 0px; +} + +.right-3 { + right: 0.75rem; +} + +.right-6 { + right: 1.5rem; +} + +.top-0 { + top: 0px; +} + +.top-1 { + top: 0.25rem; +} + +.top-1\.5 { + top: 0.375rem; +} + +.top-1\/2 { + top: 50%; +} + +.top-3 { + top: 0.75rem; +} + +.top-4 { + top: 1rem; +} + +.top-8 { + top: 2rem; +} + +.top-\[1\.125rem\] { + top: 1.125rem; +} + +.top-\[10px\] { + top: 10px; +} + +.top-\[11px\] { + top: 11px; +} + +.top-\[14px\] { + top: 14px; +} + +.top-\[52px\] { + top: 52px; +} + +.top-\[5px\] { + top: 5px; +} + +.top-\[9px\] { + top: 9px; +} + +.top-full { + top: 100%; +} + +.z-10 { + z-index: 10; +} + +.z-20 { + z-index: 20; +} + +.z-30 { + z-index: 30; +} + +.z-40 { + z-index: 40; +} + +.z-50 { + z-index: 50; +} + +.z-\[1\] { + z-index: 1; +} + +.z-\[60\] { + z-index: 60; +} + +.z-\[9996\] { + z-index: 9996; +} + +.z-\[9997\] { + z-index: 9997; +} + +.z-\[9998\] { + z-index: 9998; +} + +.z-\[9999\] { + z-index: 9999; +} + +.m-4 { + margin: 1rem; +} + +.mx-1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} + +.mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-0\.5 { + margin-top: 0.125rem; + margin-bottom: 0.125rem; +} + +.-mb-px { + margin-bottom: -1px; +} + +.-mt-0\.5 { + margin-top: -0.125rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-1\.5 { + margin-bottom: 0.375rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.ml-0\.5 { + margin-left: 0.125rem; +} + +.ml-1 { + margin-left: 0.25rem; +} + +.ml-2 { + margin-left: 0.5rem; +} + +.ml-3 { + margin-left: 0.75rem; +} + +.ml-4 { + margin-left: 1rem; +} + +.ml-6 { + margin-left: 1.5rem; +} + +.ml-auto { + margin-left: auto; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.mr-1\.5 { + margin-right: 0.375rem; +} + +.mr-4 { + margin-right: 1rem; +} + +.mt-0\.5 { + margin-top: 0.125rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-1\.5 { + margin-top: 0.375rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.inline-grid { + display: inline-grid; +} + +.hidden { + display: none; +} + +.h-0\.5 { + height: 0.125rem; +} + +.h-1 { + height: 0.25rem; +} + +.h-1\.5 { + height: 0.375rem; +} + +.h-10 { + height: 2.5rem; +} + +.h-2 { + height: 0.5rem; +} + +.h-2\.5 { + height: 0.625rem; +} + +.h-20 { + height: 5rem; +} + +.h-24 { + height: 6rem; +} + +.h-3 { + height: 0.75rem; +} + +.h-3\.5 { + height: 0.875rem; +} + +.h-32 { + height: 8rem; +} + +.h-36 { + height: 9rem; +} + +.h-4 { + height: 1rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-7 { + height: 1.75rem; +} + +.h-8 { + height: 2rem; +} + +.h-9 { + height: 2.25rem; +} + +.h-\[12px\] { + height: 12px; +} + +.h-\[20px\] { + height: 20px; +} + +.h-\[22px\] { + height: 22px; +} + +.h-\[28px\] { + height: 28px; +} + +.h-\[7px\] { + height: 7px; +} + +.h-full { + height: 100%; +} + +.h-px { + height: 1px; +} + +.h-screen { + height: 100vh; +} + +.max-h-32 { + max-height: 8rem; +} + +.max-h-40 { + max-height: 10rem; +} + +.max-h-48 { + max-height: 12rem; +} + +.max-h-56 { + max-height: 14rem; +} + +.max-h-72 { + max-height: 18rem; +} + +.max-h-96 { + max-height: 24rem; +} + +.max-h-\[320px\] { + max-height: 320px; +} + +.max-h-\[70vh\] { + max-height: 70vh; +} + +.max-h-\[80vh\] { + max-height: 80vh; +} + +.max-h-\[90vh\] { + max-height: 90vh; +} + +.max-h-\[calc\(100\%-1\.5rem\)\] { + max-height: calc(100% - 1.5rem); +} + +.max-h-\[calc\(100vh-14rem\)\] { + max-height: calc(100vh - 14rem); +} + +.max-h-\[min\(28rem\2c 50vh\)\] { + max-height: min(28rem,50vh); +} + +.max-h-\[min\(60vh\2c 520px\)\] { + max-height: min(60vh,520px); +} + +.max-h-\[min\(90vh\2c 920px\)\] { + max-height: min(90vh,920px); +} + +.min-h-0 { + min-height: 0px; +} + +.min-h-\[140px\] { + min-height: 140px; +} + +.min-h-\[200px\] { + min-height: 200px; +} + +.min-h-\[34px\] { + min-height: 34px; +} + +.min-h-\[36px\] { + min-height: 36px; +} + +.min-h-\[4rem\] { + min-height: 4rem; +} + +.min-h-\[520px\] { + min-height: 520px; +} + +.min-h-\[600px\] { + min-height: 600px; +} + +.min-h-\[680px\] { + min-height: 680px; +} + +.min-h-\[calc\(100vh-11rem\)\] { + min-height: calc(100vh - 11rem); +} + +.min-h-full { + min-height: 100%; +} + +.w-1 { + width: 0.25rem; +} + +.w-1\.5 { + width: 0.375rem; +} + +.w-10 { + width: 2.5rem; +} + +.w-11 { + width: 2.75rem; +} + +.w-16 { + width: 4rem; +} + +.w-2 { + width: 0.5rem; +} + +.w-2\.5 { + width: 0.625rem; +} + +.w-24 { + width: 6rem; +} + +.w-28 { + width: 7rem; +} + +.w-3 { + width: 0.75rem; +} + +.w-3\.5 { + width: 0.875rem; +} + +.w-4 { + width: 1rem; +} + +.w-40 { + width: 10rem; +} + +.w-44 { + width: 11rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-6 { + width: 1.5rem; +} + +.w-7 { + width: 1.75rem; +} + +.w-72 { + width: 18rem; +} + +.w-8 { + width: 2rem; +} + +.w-80 { + width: 20rem; +} + +.w-9 { + width: 2.25rem; +} + +.w-\[200px\] { + width: 200px; +} + +.w-\[33vw\] { + width: 33vw; +} + +.w-\[360px\] { + width: 360px; +} + +.w-\[66vw\] { + width: 66vw; +} + +.w-full { + width: 100%; +} + +.w-px { + width: 1px; +} + +.min-w-0 { + min-width: 0px; +} + +.min-w-\[100px\] { + min-width: 100px; +} + +.min-w-\[140px\] { + min-width: 140px; +} + +.min-w-\[180px\] { + min-width: 180px; +} + +.min-w-\[28px\] { + min-width: 28px; +} + +.min-w-\[320px\] { + min-width: 320px; +} + +.min-w-\[36px\] { + min-width: 36px; +} + +.min-w-\[3px\] { + min-width: 3px; +} + +.min-w-\[3rem\] { + min-width: 3rem; +} + +.min-w-\[480px\] { + min-width: 480px; +} + +.min-w-\[48px\] { + min-width: 48px; +} + +.min-w-\[640px\] { + min-width: 640px; +} + +.min-w-full { + min-width: 100%; +} + +.min-w-max { + min-width: -moz-max-content; + min-width: max-content; +} + +.max-w-2xl { + max-width: 42rem; +} + +.max-w-3xl { + max-width: 48rem; +} + +.max-w-5xl { + max-width: 64rem; +} + +.max-w-7xl { + max-width: 80rem; +} + +.max-w-\[10rem\] { + max-width: 10rem; +} + +.max-w-\[1400px\] { + max-width: 1400px; +} + +.max-w-\[14rem\] { + max-width: 14rem; +} + +.max-w-\[16rem\] { + max-width: 16rem; +} + +.max-w-\[320px\] { + max-width: 320px; +} + +.max-w-\[360px\] { + max-width: 360px; +} + +.max-w-\[480px\] { + max-width: 480px; +} + +.max-w-\[90\%\] { + max-width: 90%; +} + +.max-w-\[960px\] { + max-width: 960px; +} + +.max-w-\[9rem\] { + max-width: 9rem; +} + +.max-w-full { + max-width: 100%; +} + +.max-w-lg { + max-width: 32rem; +} + +.max-w-md { + max-width: 28rem; +} + +.max-w-sm { + max-width: 24rem; +} + +.max-w-xl { + max-width: 36rem; +} + +.max-w-xs { + max-width: 20rem; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-shrink-0 { + flex-shrink: 0; +} + +.shrink-0 { + flex-shrink: 0; +} + +.grow { + flex-grow: 1; +} + +.table-auto { + table-layout: auto; +} + +.border-collapse { + border-collapse: collapse; +} + +.-translate-x-1\/2 { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-1\/2 { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-1 { + --tw-translate-x: 0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-1\/2 { + --tw-translate-x: 50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-5 { + --tw-translate-x: 1.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-0 { + --tw-rotate: 0deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-180 { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-90 { + --tw-rotate: 90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +@keyframes pulse { + 50% { + opacity: .5; + } +} + +.animate-pulse { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +.animate-spin { + animation: spin 1s linear infinite; +} + +.cursor-col-resize { + cursor: col-resize; +} + +.cursor-default { + cursor: default; +} + +.cursor-not-allowed { + cursor: not-allowed; +} + +.cursor-ns-resize { + cursor: ns-resize; +} + +.cursor-pointer { + cursor: pointer; +} + +.select-none { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.resize-y { + resize: vertical; +} + +.resize { + resize: both; +} + +.list-inside { + list-style-position: inside; +} + +.list-disc { + list-style-type: disc; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.grid-cols-\[minmax\(180px\2c 22\%\)_130px_1fr\] { + grid-template-columns: minmax(180px,22%) 130px 1fr; +} + +.grid-cols-\[minmax\(180px\2c 22\%\)_130px_90px_90px_1fr\] { + grid-template-columns: minmax(180px,22%) 130px 90px 90px 1fr; +} + +.grid-cols-\[minmax\(220px\2c 34\%\)_1fr_auto\] { + grid-template-columns: minmax(220px,34%) 1fr auto; +} + +.grid-cols-\[minmax\(300px\2c 34\%\)_1fr_auto\] { + grid-template-columns: minmax(300px,34%) 1fr auto; +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.items-start { + align-items: flex-start; +} + +.items-end { + align-items: flex-end; +} + +.items-center { + align-items: center; +} + +.items-baseline { + align-items: baseline; +} + +.items-stretch { + align-items: stretch; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-0 { + gap: 0px; +} + +.gap-0\.5 { + gap: 0.125rem; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-1\.5 { + gap: 0.375rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-5 { + gap: 1.25rem; +} + +.gap-6 { + gap: 1.5rem; +} + +.gap-px { + gap: 1px; +} + +.gap-x-2 { + -moz-column-gap: 0.5rem; + column-gap: 0.5rem; +} + +.gap-x-3 { + -moz-column-gap: 0.75rem; + column-gap: 0.75rem; +} + +.gap-x-4 { + -moz-column-gap: 1rem; + column-gap: 1rem; +} + +.gap-y-0 { + row-gap: 0px; +} + +.gap-y-0\.5 { + row-gap: 0.125rem; +} + +.gap-y-1 { + row-gap: 0.25rem; +} + +.space-y-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0px * var(--tw-space-y-reverse)); +} + +.space-y-0\.5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.125rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.125rem * var(--tw-space-y-reverse)); +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-y-1\.5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.375rem * var(--tw-space-y-reverse)); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.space-y-2\.5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.625rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.625rem * var(--tw-space-y-reverse)); +} + +.space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-y-5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.25rem * var(--tw-space-y-reverse)); +} + +.space-y-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); +} + +.divide-y > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); +} + +.divide-gray-100 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-divide-opacity, 1)); +} + +.divide-gray-200 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-divide-opacity, 1)); +} + +.self-end { + align-self: flex-end; +} + +.overflow-auto { + overflow: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.overflow-y-auto { + overflow-y: auto; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.whitespace-pre { + white-space: pre; +} + +.whitespace-pre-wrap { + white-space: pre-wrap; +} + +.break-words { + overflow-wrap: break-word; +} + +.break-all { + word-break: break-all; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-sm { + border-radius: 0.125rem; +} + +.rounded-xl { + border-radius: 0.75rem; +} + +.rounded-b-lg { + border-bottom-right-radius: 0.5rem; + border-bottom-left-radius: 0.5rem; +} + +.rounded-l { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.rounded-t { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.rounded-t-sm { + border-top-left-radius: 0.125rem; + border-top-right-radius: 0.125rem; +} + +.border { + border-width: 1px; +} + +.border-2 { + border-width: 2px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-b-2 { + border-bottom-width: 2px; +} + +.border-l { + border-left-width: 1px; +} + +.border-l-2 { + border-left-width: 2px; +} + +.border-l-4 { + border-left-width: 4px; +} + +.border-r { + border-right-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.border-dashed { + border-style: dashed; +} + +.border-amber-100 { + --tw-border-opacity: 1; + border-color: rgb(254 243 199 / var(--tw-border-opacity, 1)); +} + +.border-amber-200 { + --tw-border-opacity: 1; + border-color: rgb(253 230 138 / var(--tw-border-opacity, 1)); +} + +.border-amber-300 { + --tw-border-opacity: 1; + border-color: rgb(252 211 77 / var(--tw-border-opacity, 1)); +} + +.border-amber-400 { + --tw-border-opacity: 1; + border-color: rgb(251 191 36 / var(--tw-border-opacity, 1)); +} + +.border-amber-50 { + --tw-border-opacity: 1; + border-color: rgb(255 251 235 / var(--tw-border-opacity, 1)); +} + +.border-amber-500 { + --tw-border-opacity: 1; + border-color: rgb(245 158 11 / var(--tw-border-opacity, 1)); +} + +.border-amber-800 { + --tw-border-opacity: 1; + border-color: rgb(146 64 14 / var(--tw-border-opacity, 1)); +} + +.border-blue-100 { + --tw-border-opacity: 1; + border-color: rgb(219 234 254 / var(--tw-border-opacity, 1)); +} + +.border-blue-200 { + --tw-border-opacity: 1; + border-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); +} + +.border-blue-300 { + --tw-border-opacity: 1; + border-color: rgb(147 197 253 / var(--tw-border-opacity, 1)); +} + +.border-blue-400 { + --tw-border-opacity: 1; + border-color: rgb(96 165 250 / var(--tw-border-opacity, 1)); +} + +.border-blue-50 { + --tw-border-opacity: 1; + border-color: rgb(239 246 255 / var(--tw-border-opacity, 1)); +} + +.border-blue-500 { + --tw-border-opacity: 1; + border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.border-blue-500\/50 { + border-color: rgb(59 130 246 / 0.5); +} + +.border-blue-600 { + --tw-border-opacity: 1; + border-color: rgb(37 99 235 / var(--tw-border-opacity, 1)); +} + +.border-blue-600\/30 { + border-color: rgb(37 99 235 / 0.3); +} + +.border-blue-700 { + --tw-border-opacity: 1; + border-color: rgb(29 78 216 / var(--tw-border-opacity, 1)); +} + +.border-emerald-200 { + --tw-border-opacity: 1; + border-color: rgb(167 243 208 / var(--tw-border-opacity, 1)); +} + +.border-emerald-300 { + --tw-border-opacity: 1; + border-color: rgb(110 231 183 / var(--tw-border-opacity, 1)); +} + +.border-emerald-50 { + --tw-border-opacity: 1; + border-color: rgb(236 253 245 / var(--tw-border-opacity, 1)); +} + +.border-emerald-500 { + --tw-border-opacity: 1; + border-color: rgb(16 185 129 / var(--tw-border-opacity, 1)); +} + +.border-emerald-700 { + --tw-border-opacity: 1; + border-color: rgb(4 120 87 / var(--tw-border-opacity, 1)); +} + +.border-gray-100 { + --tw-border-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-border-opacity, 1)); +} + +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); +} + +.border-gray-200\/80 { + border-color: rgb(229 231 235 / 0.8); +} + +.border-gray-200\/90 { + border-color: rgb(229 231 235 / 0.9); +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity, 1)); +} + +.border-gray-400 { + --tw-border-opacity: 1; + border-color: rgb(156 163 175 / var(--tw-border-opacity, 1)); +} + +.border-gray-50 { + --tw-border-opacity: 1; + border-color: rgb(249 250 251 / var(--tw-border-opacity, 1)); +} + +.border-gray-500 { + --tw-border-opacity: 1; + border-color: rgb(107 114 128 / var(--tw-border-opacity, 1)); +} + +.border-gray-600 { + --tw-border-opacity: 1; + border-color: rgb(75 85 99 / var(--tw-border-opacity, 1)); +} + +.border-gray-700 { + --tw-border-opacity: 1; + border-color: rgb(55 65 81 / var(--tw-border-opacity, 1)); +} + +.border-gray-800 { + --tw-border-opacity: 1; + border-color: rgb(31 41 55 / var(--tw-border-opacity, 1)); +} + +.border-gray-900 { + --tw-border-opacity: 1; + border-color: rgb(17 24 39 / var(--tw-border-opacity, 1)); +} + +.border-green-200 { + --tw-border-opacity: 1; + border-color: rgb(187 247 208 / var(--tw-border-opacity, 1)); +} + +.border-green-50 { + --tw-border-opacity: 1; + border-color: rgb(240 253 244 / var(--tw-border-opacity, 1)); +} + +.border-green-600 { + --tw-border-opacity: 1; + border-color: rgb(22 163 74 / var(--tw-border-opacity, 1)); +} + +.border-green-700 { + --tw-border-opacity: 1; + border-color: rgb(21 128 61 / var(--tw-border-opacity, 1)); +} + +.border-green-800 { + --tw-border-opacity: 1; + border-color: rgb(22 101 52 / var(--tw-border-opacity, 1)); +} + +.border-indigo-50\/30 { + border-color: rgb(238 242 255 / 0.3); +} + +.border-orange-100 { + --tw-border-opacity: 1; + border-color: rgb(255 237 213 / var(--tw-border-opacity, 1)); +} + +.border-orange-200 { + --tw-border-opacity: 1; + border-color: rgb(254 215 170 / var(--tw-border-opacity, 1)); +} + +.border-purple-200 { + --tw-border-opacity: 1; + border-color: rgb(233 213 255 / var(--tw-border-opacity, 1)); +} + +.border-red-100 { + --tw-border-opacity: 1; + border-color: rgb(254 226 226 / var(--tw-border-opacity, 1)); +} + +.border-red-200 { + --tw-border-opacity: 1; + border-color: rgb(254 202 202 / var(--tw-border-opacity, 1)); +} + +.border-red-50 { + --tw-border-opacity: 1; + border-color: rgb(254 242 242 / var(--tw-border-opacity, 1)); +} + +.border-red-600 { + --tw-border-opacity: 1; + border-color: rgb(220 38 38 / var(--tw-border-opacity, 1)); +} + +.border-red-700 { + --tw-border-opacity: 1; + border-color: rgb(185 28 28 / var(--tw-border-opacity, 1)); +} + +.border-red-800 { + --tw-border-opacity: 1; + border-color: rgb(153 27 27 / var(--tw-border-opacity, 1)); +} + +.border-slate-100 { + --tw-border-opacity: 1; + border-color: rgb(241 245 249 / var(--tw-border-opacity, 1)); +} + +.border-slate-200 { + --tw-border-opacity: 1; + border-color: rgb(226 232 240 / var(--tw-border-opacity, 1)); +} + +.border-slate-300 { + --tw-border-opacity: 1; + border-color: rgb(203 213 225 / var(--tw-border-opacity, 1)); +} + +.border-slate-400 { + --tw-border-opacity: 1; + border-color: rgb(148 163 184 / var(--tw-border-opacity, 1)); +} + +.border-slate-500 { + --tw-border-opacity: 1; + border-color: rgb(100 116 139 / var(--tw-border-opacity, 1)); +} + +.border-slate-600 { + --tw-border-opacity: 1; + border-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); +} + +.border-slate-600\/80 { + border-color: rgb(71 85 105 / 0.8); +} + +.border-slate-700 { + --tw-border-opacity: 1; + border-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); +} + +.border-slate-700\/30 { + border-color: rgb(51 65 85 / 0.3); +} + +.border-slate-700\/50 { + border-color: rgb(51 65 85 / 0.5); +} + +.border-slate-700\/80 { + border-color: rgb(51 65 85 / 0.8); +} + +.border-slate-800 { + --tw-border-opacity: 1; + border-color: rgb(30 41 59 / var(--tw-border-opacity, 1)); +} + +.border-slate-800\/50 { + border-color: rgb(30 41 59 / 0.5); +} + +.border-slate-900 { + --tw-border-opacity: 1; + border-color: rgb(15 23 42 / var(--tw-border-opacity, 1)); +} + +.border-transparent { + border-color: transparent; +} + +.border-violet-100 { + --tw-border-opacity: 1; + border-color: rgb(237 233 254 / var(--tw-border-opacity, 1)); +} + +.border-violet-200 { + --tw-border-opacity: 1; + border-color: rgb(221 214 254 / var(--tw-border-opacity, 1)); +} + +.border-violet-700 { + --tw-border-opacity: 1; + border-color: rgb(109 40 217 / var(--tw-border-opacity, 1)); +} + +.border-violet-800 { + --tw-border-opacity: 1; + border-color: rgb(91 33 182 / var(--tw-border-opacity, 1)); +} + +.border-white\/15 { + border-color: rgb(255 255 255 / 0.15); +} + +.border-white\/20 { + border-color: rgb(255 255 255 / 0.2); +} + +.border-yellow-50 { + --tw-border-opacity: 1; + border-color: rgb(254 252 232 / var(--tw-border-opacity, 1)); +} + +.border-yellow-600 { + --tw-border-opacity: 1; + border-color: rgb(202 138 4 / var(--tw-border-opacity, 1)); +} + +.border-yellow-800 { + --tw-border-opacity: 1; + border-color: rgb(133 77 14 / var(--tw-border-opacity, 1)); +} + +.border-b-amber-100 { + --tw-border-opacity: 1; + border-bottom-color: rgb(254 243 199 / var(--tw-border-opacity, 1)); +} + +.border-b-amber-200 { + --tw-border-opacity: 1; + border-bottom-color: rgb(253 230 138 / var(--tw-border-opacity, 1)); +} + +.border-b-amber-50 { + --tw-border-opacity: 1; + border-bottom-color: rgb(255 251 235 / var(--tw-border-opacity, 1)); +} + +.border-b-amber-500 { + --tw-border-opacity: 1; + border-bottom-color: rgb(245 158 11 / var(--tw-border-opacity, 1)); +} + +.border-b-amber-800 { + --tw-border-opacity: 1; + border-bottom-color: rgb(146 64 14 / var(--tw-border-opacity, 1)); +} + +.border-b-blue-100 { + --tw-border-opacity: 1; + border-bottom-color: rgb(219 234 254 / var(--tw-border-opacity, 1)); +} + +.border-b-blue-200 { + --tw-border-opacity: 1; + border-bottom-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); +} + +.border-b-blue-400 { + --tw-border-opacity: 1; + border-bottom-color: rgb(96 165 250 / var(--tw-border-opacity, 1)); +} + +.border-b-blue-50 { + --tw-border-opacity: 1; + border-bottom-color: rgb(239 246 255 / var(--tw-border-opacity, 1)); +} + +.border-b-blue-500 { + --tw-border-opacity: 1; + border-bottom-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.border-b-blue-600 { + --tw-border-opacity: 1; + border-bottom-color: rgb(37 99 235 / var(--tw-border-opacity, 1)); +} + +.border-b-blue-600\/30 { + border-bottom-color: rgb(37 99 235 / 0.3); +} + +.border-b-blue-700 { + --tw-border-opacity: 1; + border-bottom-color: rgb(29 78 216 / var(--tw-border-opacity, 1)); +} + +.border-b-emerald-200 { + --tw-border-opacity: 1; + border-bottom-color: rgb(167 243 208 / var(--tw-border-opacity, 1)); +} + +.border-b-emerald-50 { + --tw-border-opacity: 1; + border-bottom-color: rgb(236 253 245 / var(--tw-border-opacity, 1)); +} + +.border-b-emerald-500 { + --tw-border-opacity: 1; + border-bottom-color: rgb(16 185 129 / var(--tw-border-opacity, 1)); +} + +.border-b-emerald-700 { + --tw-border-opacity: 1; + border-bottom-color: rgb(4 120 87 / var(--tw-border-opacity, 1)); +} + +.border-b-gray-100 { + --tw-border-opacity: 1; + border-bottom-color: rgb(243 244 246 / var(--tw-border-opacity, 1)); +} + +.border-b-gray-200 { + --tw-border-opacity: 1; + border-bottom-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); +} + +.border-b-gray-400 { + --tw-border-opacity: 1; + border-bottom-color: rgb(156 163 175 / var(--tw-border-opacity, 1)); +} + +.border-b-gray-50 { + --tw-border-opacity: 1; + border-bottom-color: rgb(249 250 251 / var(--tw-border-opacity, 1)); +} + +.border-b-gray-500 { + --tw-border-opacity: 1; + border-bottom-color: rgb(107 114 128 / var(--tw-border-opacity, 1)); +} + +.border-b-gray-600 { + --tw-border-opacity: 1; + border-bottom-color: rgb(75 85 99 / var(--tw-border-opacity, 1)); +} + +.border-b-gray-700 { + --tw-border-opacity: 1; + border-bottom-color: rgb(55 65 81 / var(--tw-border-opacity, 1)); +} + +.border-b-gray-800 { + --tw-border-opacity: 1; + border-bottom-color: rgb(31 41 55 / var(--tw-border-opacity, 1)); +} + +.border-b-gray-900 { + --tw-border-opacity: 1; + border-bottom-color: rgb(17 24 39 / var(--tw-border-opacity, 1)); +} + +.border-b-green-200 { + --tw-border-opacity: 1; + border-bottom-color: rgb(187 247 208 / var(--tw-border-opacity, 1)); +} + +.border-b-green-50 { + --tw-border-opacity: 1; + border-bottom-color: rgb(240 253 244 / var(--tw-border-opacity, 1)); +} + +.border-b-green-600 { + --tw-border-opacity: 1; + border-bottom-color: rgb(22 163 74 / var(--tw-border-opacity, 1)); +} + +.border-b-green-700 { + --tw-border-opacity: 1; + border-bottom-color: rgb(21 128 61 / var(--tw-border-opacity, 1)); +} + +.border-b-green-800 { + --tw-border-opacity: 1; + border-bottom-color: rgb(22 101 52 / var(--tw-border-opacity, 1)); +} + +.border-b-indigo-50\/30 { + border-bottom-color: rgb(238 242 255 / 0.3); +} + +.border-b-red-200 { + --tw-border-opacity: 1; + border-bottom-color: rgb(254 202 202 / var(--tw-border-opacity, 1)); +} + +.border-b-red-50 { + --tw-border-opacity: 1; + border-bottom-color: rgb(254 242 242 / var(--tw-border-opacity, 1)); +} + +.border-b-red-600 { + --tw-border-opacity: 1; + border-bottom-color: rgb(220 38 38 / var(--tw-border-opacity, 1)); +} + +.border-b-red-700 { + --tw-border-opacity: 1; + border-bottom-color: rgb(185 28 28 / var(--tw-border-opacity, 1)); +} + +.border-b-red-800 { + --tw-border-opacity: 1; + border-bottom-color: rgb(153 27 27 / var(--tw-border-opacity, 1)); +} + +.border-b-slate-100 { + --tw-border-opacity: 1; + border-bottom-color: rgb(241 245 249 / var(--tw-border-opacity, 1)); +} + +.border-b-slate-300 { + --tw-border-opacity: 1; + border-bottom-color: rgb(203 213 225 / var(--tw-border-opacity, 1)); +} + +.border-b-slate-400 { + --tw-border-opacity: 1; + border-bottom-color: rgb(148 163 184 / var(--tw-border-opacity, 1)); +} + +.border-b-slate-500 { + --tw-border-opacity: 1; + border-bottom-color: rgb(100 116 139 / var(--tw-border-opacity, 1)); +} + +.border-b-slate-600 { + --tw-border-opacity: 1; + border-bottom-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); +} + +.border-b-slate-700 { + --tw-border-opacity: 1; + border-bottom-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); +} + +.border-b-slate-700\/30 { + border-bottom-color: rgb(51 65 85 / 0.3); +} + +.border-b-slate-800 { + --tw-border-opacity: 1; + border-bottom-color: rgb(30 41 59 / var(--tw-border-opacity, 1)); +} + +.border-b-slate-800\/50 { + border-bottom-color: rgb(30 41 59 / 0.5); +} + +.border-b-slate-900 { + --tw-border-opacity: 1; + border-bottom-color: rgb(15 23 42 / var(--tw-border-opacity, 1)); +} + +.border-b-violet-100 { + --tw-border-opacity: 1; + border-bottom-color: rgb(237 233 254 / var(--tw-border-opacity, 1)); +} + +.border-b-violet-700 { + --tw-border-opacity: 1; + border-bottom-color: rgb(109 40 217 / var(--tw-border-opacity, 1)); +} + +.border-b-violet-800 { + --tw-border-opacity: 1; + border-bottom-color: rgb(91 33 182 / var(--tw-border-opacity, 1)); +} + +.border-b-yellow-50 { + --tw-border-opacity: 1; + border-bottom-color: rgb(254 252 232 / var(--tw-border-opacity, 1)); +} + +.border-b-yellow-600 { + --tw-border-opacity: 1; + border-bottom-color: rgb(202 138 4 / var(--tw-border-opacity, 1)); +} + +.border-b-yellow-800 { + --tw-border-opacity: 1; + border-bottom-color: rgb(133 77 14 / var(--tw-border-opacity, 1)); +} + +.border-l-amber-100 { + --tw-border-opacity: 1; + border-left-color: rgb(254 243 199 / var(--tw-border-opacity, 1)); +} + +.border-l-amber-200 { + --tw-border-opacity: 1; + border-left-color: rgb(253 230 138 / var(--tw-border-opacity, 1)); +} + +.border-l-amber-50 { + --tw-border-opacity: 1; + border-left-color: rgb(255 251 235 / var(--tw-border-opacity, 1)); +} + +.border-l-amber-500 { + --tw-border-opacity: 1; + border-left-color: rgb(245 158 11 / var(--tw-border-opacity, 1)); +} + +.border-l-amber-800 { + --tw-border-opacity: 1; + border-left-color: rgb(146 64 14 / var(--tw-border-opacity, 1)); +} + +.border-l-blue-100 { + --tw-border-opacity: 1; + border-left-color: rgb(219 234 254 / var(--tw-border-opacity, 1)); +} + +.border-l-blue-200 { + --tw-border-opacity: 1; + border-left-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); +} + +.border-l-blue-400 { + --tw-border-opacity: 1; + border-left-color: rgb(96 165 250 / var(--tw-border-opacity, 1)); +} + +.border-l-blue-50 { + --tw-border-opacity: 1; + border-left-color: rgb(239 246 255 / var(--tw-border-opacity, 1)); +} + +.border-l-blue-500 { + --tw-border-opacity: 1; + border-left-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.border-l-blue-600 { + --tw-border-opacity: 1; + border-left-color: rgb(37 99 235 / var(--tw-border-opacity, 1)); +} + +.border-l-blue-600\/30 { + border-left-color: rgb(37 99 235 / 0.3); +} + +.border-l-blue-700 { + --tw-border-opacity: 1; + border-left-color: rgb(29 78 216 / var(--tw-border-opacity, 1)); +} + +.border-l-emerald-200 { + --tw-border-opacity: 1; + border-left-color: rgb(167 243 208 / var(--tw-border-opacity, 1)); +} + +.border-l-emerald-50 { + --tw-border-opacity: 1; + border-left-color: rgb(236 253 245 / var(--tw-border-opacity, 1)); +} + +.border-l-emerald-500 { + --tw-border-opacity: 1; + border-left-color: rgb(16 185 129 / var(--tw-border-opacity, 1)); +} + +.border-l-emerald-700 { + --tw-border-opacity: 1; + border-left-color: rgb(4 120 87 / var(--tw-border-opacity, 1)); +} + +.border-l-gray-100 { + --tw-border-opacity: 1; + border-left-color: rgb(243 244 246 / var(--tw-border-opacity, 1)); +} + +.border-l-gray-200 { + --tw-border-opacity: 1; + border-left-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); +} + +.border-l-gray-400 { + --tw-border-opacity: 1; + border-left-color: rgb(156 163 175 / var(--tw-border-opacity, 1)); +} + +.border-l-gray-50 { + --tw-border-opacity: 1; + border-left-color: rgb(249 250 251 / var(--tw-border-opacity, 1)); +} + +.border-l-gray-500 { + --tw-border-opacity: 1; + border-left-color: rgb(107 114 128 / var(--tw-border-opacity, 1)); +} + +.border-l-gray-600 { + --tw-border-opacity: 1; + border-left-color: rgb(75 85 99 / var(--tw-border-opacity, 1)); +} + +.border-l-gray-700 { + --tw-border-opacity: 1; + border-left-color: rgb(55 65 81 / var(--tw-border-opacity, 1)); +} + +.border-l-gray-800 { + --tw-border-opacity: 1; + border-left-color: rgb(31 41 55 / var(--tw-border-opacity, 1)); +} + +.border-l-gray-900 { + --tw-border-opacity: 1; + border-left-color: rgb(17 24 39 / var(--tw-border-opacity, 1)); +} + +.border-l-green-200 { + --tw-border-opacity: 1; + border-left-color: rgb(187 247 208 / var(--tw-border-opacity, 1)); +} + +.border-l-green-50 { + --tw-border-opacity: 1; + border-left-color: rgb(240 253 244 / var(--tw-border-opacity, 1)); +} + +.border-l-green-600 { + --tw-border-opacity: 1; + border-left-color: rgb(22 163 74 / var(--tw-border-opacity, 1)); +} + +.border-l-green-700 { + --tw-border-opacity: 1; + border-left-color: rgb(21 128 61 / var(--tw-border-opacity, 1)); +} + +.border-l-green-800 { + --tw-border-opacity: 1; + border-left-color: rgb(22 101 52 / var(--tw-border-opacity, 1)); +} + +.border-l-indigo-50\/30 { + border-left-color: rgb(238 242 255 / 0.3); +} + +.border-l-orange-400 { + --tw-border-opacity: 1; + border-left-color: rgb(251 146 60 / var(--tw-border-opacity, 1)); +} + +.border-l-orange-500 { + --tw-border-opacity: 1; + border-left-color: rgb(249 115 22 / var(--tw-border-opacity, 1)); +} + +.border-l-red-200 { + --tw-border-opacity: 1; + border-left-color: rgb(254 202 202 / var(--tw-border-opacity, 1)); +} + +.border-l-red-50 { + --tw-border-opacity: 1; + border-left-color: rgb(254 242 242 / var(--tw-border-opacity, 1)); +} + +.border-l-red-500 { + --tw-border-opacity: 1; + border-left-color: rgb(239 68 68 / var(--tw-border-opacity, 1)); +} + +.border-l-red-600 { + --tw-border-opacity: 1; + border-left-color: rgb(220 38 38 / var(--tw-border-opacity, 1)); +} + +.border-l-red-700 { + --tw-border-opacity: 1; + border-left-color: rgb(185 28 28 / var(--tw-border-opacity, 1)); +} + +.border-l-red-800 { + --tw-border-opacity: 1; + border-left-color: rgb(153 27 27 / var(--tw-border-opacity, 1)); +} + +.border-l-slate-100 { + --tw-border-opacity: 1; + border-left-color: rgb(241 245 249 / var(--tw-border-opacity, 1)); +} + +.border-l-slate-300 { + --tw-border-opacity: 1; + border-left-color: rgb(203 213 225 / var(--tw-border-opacity, 1)); +} + +.border-l-slate-400 { + --tw-border-opacity: 1; + border-left-color: rgb(148 163 184 / var(--tw-border-opacity, 1)); +} + +.border-l-slate-500 { + --tw-border-opacity: 1; + border-left-color: rgb(100 116 139 / var(--tw-border-opacity, 1)); +} + +.border-l-slate-600 { + --tw-border-opacity: 1; + border-left-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); +} + +.border-l-slate-700 { + --tw-border-opacity: 1; + border-left-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); +} + +.border-l-slate-700\/30 { + border-left-color: rgb(51 65 85 / 0.3); +} + +.border-l-slate-800 { + --tw-border-opacity: 1; + border-left-color: rgb(30 41 59 / var(--tw-border-opacity, 1)); +} + +.border-l-slate-800\/50 { + border-left-color: rgb(30 41 59 / 0.5); +} + +.border-l-slate-900 { + --tw-border-opacity: 1; + border-left-color: rgb(15 23 42 / var(--tw-border-opacity, 1)); +} + +.border-l-transparent { + border-left-color: transparent; +} + +.border-l-violet-100 { + --tw-border-opacity: 1; + border-left-color: rgb(237 233 254 / var(--tw-border-opacity, 1)); +} + +.border-l-violet-400 { + --tw-border-opacity: 1; + border-left-color: rgb(167 139 250 / var(--tw-border-opacity, 1)); +} + +.border-l-violet-700 { + --tw-border-opacity: 1; + border-left-color: rgb(109 40 217 / var(--tw-border-opacity, 1)); +} + +.border-l-violet-800 { + --tw-border-opacity: 1; + border-left-color: rgb(91 33 182 / var(--tw-border-opacity, 1)); +} + +.border-l-yellow-50 { + --tw-border-opacity: 1; + border-left-color: rgb(254 252 232 / var(--tw-border-opacity, 1)); +} + +.border-l-yellow-600 { + --tw-border-opacity: 1; + border-left-color: rgb(202 138 4 / var(--tw-border-opacity, 1)); +} + +.border-l-yellow-800 { + --tw-border-opacity: 1; + border-left-color: rgb(133 77 14 / var(--tw-border-opacity, 1)); +} + +.border-r-amber-100 { + --tw-border-opacity: 1; + border-right-color: rgb(254 243 199 / var(--tw-border-opacity, 1)); +} + +.border-r-amber-200 { + --tw-border-opacity: 1; + border-right-color: rgb(253 230 138 / var(--tw-border-opacity, 1)); +} + +.border-r-amber-50 { + --tw-border-opacity: 1; + border-right-color: rgb(255 251 235 / var(--tw-border-opacity, 1)); +} + +.border-r-amber-500 { + --tw-border-opacity: 1; + border-right-color: rgb(245 158 11 / var(--tw-border-opacity, 1)); +} + +.border-r-amber-800 { + --tw-border-opacity: 1; + border-right-color: rgb(146 64 14 / var(--tw-border-opacity, 1)); +} + +.border-r-blue-100 { + --tw-border-opacity: 1; + border-right-color: rgb(219 234 254 / var(--tw-border-opacity, 1)); +} + +.border-r-blue-200 { + --tw-border-opacity: 1; + border-right-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); +} + +.border-r-blue-400 { + --tw-border-opacity: 1; + border-right-color: rgb(96 165 250 / var(--tw-border-opacity, 1)); +} + +.border-r-blue-50 { + --tw-border-opacity: 1; + border-right-color: rgb(239 246 255 / var(--tw-border-opacity, 1)); +} + +.border-r-blue-500 { + --tw-border-opacity: 1; + border-right-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.border-r-blue-600 { + --tw-border-opacity: 1; + border-right-color: rgb(37 99 235 / var(--tw-border-opacity, 1)); +} + +.border-r-blue-600\/30 { + border-right-color: rgb(37 99 235 / 0.3); +} + +.border-r-blue-700 { + --tw-border-opacity: 1; + border-right-color: rgb(29 78 216 / var(--tw-border-opacity, 1)); +} + +.border-r-emerald-200 { + --tw-border-opacity: 1; + border-right-color: rgb(167 243 208 / var(--tw-border-opacity, 1)); +} + +.border-r-emerald-50 { + --tw-border-opacity: 1; + border-right-color: rgb(236 253 245 / var(--tw-border-opacity, 1)); +} + +.border-r-emerald-500 { + --tw-border-opacity: 1; + border-right-color: rgb(16 185 129 / var(--tw-border-opacity, 1)); +} + +.border-r-emerald-700 { + --tw-border-opacity: 1; + border-right-color: rgb(4 120 87 / var(--tw-border-opacity, 1)); +} + +.border-r-gray-100 { + --tw-border-opacity: 1; + border-right-color: rgb(243 244 246 / var(--tw-border-opacity, 1)); +} + +.border-r-gray-200 { + --tw-border-opacity: 1; + border-right-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); +} + +.border-r-gray-400 { + --tw-border-opacity: 1; + border-right-color: rgb(156 163 175 / var(--tw-border-opacity, 1)); +} + +.border-r-gray-50 { + --tw-border-opacity: 1; + border-right-color: rgb(249 250 251 / var(--tw-border-opacity, 1)); +} + +.border-r-gray-500 { + --tw-border-opacity: 1; + border-right-color: rgb(107 114 128 / var(--tw-border-opacity, 1)); +} + +.border-r-gray-600 { + --tw-border-opacity: 1; + border-right-color: rgb(75 85 99 / var(--tw-border-opacity, 1)); +} + +.border-r-gray-700 { + --tw-border-opacity: 1; + border-right-color: rgb(55 65 81 / var(--tw-border-opacity, 1)); +} + +.border-r-gray-800 { + --tw-border-opacity: 1; + border-right-color: rgb(31 41 55 / var(--tw-border-opacity, 1)); +} + +.border-r-gray-900 { + --tw-border-opacity: 1; + border-right-color: rgb(17 24 39 / var(--tw-border-opacity, 1)); +} + +.border-r-green-200 { + --tw-border-opacity: 1; + border-right-color: rgb(187 247 208 / var(--tw-border-opacity, 1)); +} + +.border-r-green-50 { + --tw-border-opacity: 1; + border-right-color: rgb(240 253 244 / var(--tw-border-opacity, 1)); +} + +.border-r-green-600 { + --tw-border-opacity: 1; + border-right-color: rgb(22 163 74 / var(--tw-border-opacity, 1)); +} + +.border-r-green-700 { + --tw-border-opacity: 1; + border-right-color: rgb(21 128 61 / var(--tw-border-opacity, 1)); +} + +.border-r-green-800 { + --tw-border-opacity: 1; + border-right-color: rgb(22 101 52 / var(--tw-border-opacity, 1)); +} + +.border-r-indigo-50\/30 { + border-right-color: rgb(238 242 255 / 0.3); +} + +.border-r-red-200 { + --tw-border-opacity: 1; + border-right-color: rgb(254 202 202 / var(--tw-border-opacity, 1)); +} + +.border-r-red-50 { + --tw-border-opacity: 1; + border-right-color: rgb(254 242 242 / var(--tw-border-opacity, 1)); +} + +.border-r-red-600 { + --tw-border-opacity: 1; + border-right-color: rgb(220 38 38 / var(--tw-border-opacity, 1)); +} + +.border-r-red-700 { + --tw-border-opacity: 1; + border-right-color: rgb(185 28 28 / var(--tw-border-opacity, 1)); +} + +.border-r-red-800 { + --tw-border-opacity: 1; + border-right-color: rgb(153 27 27 / var(--tw-border-opacity, 1)); +} + +.border-r-slate-100 { + --tw-border-opacity: 1; + border-right-color: rgb(241 245 249 / var(--tw-border-opacity, 1)); +} + +.border-r-slate-300 { + --tw-border-opacity: 1; + border-right-color: rgb(203 213 225 / var(--tw-border-opacity, 1)); +} + +.border-r-slate-400 { + --tw-border-opacity: 1; + border-right-color: rgb(148 163 184 / var(--tw-border-opacity, 1)); +} + +.border-r-slate-500 { + --tw-border-opacity: 1; + border-right-color: rgb(100 116 139 / var(--tw-border-opacity, 1)); +} + +.border-r-slate-600 { + --tw-border-opacity: 1; + border-right-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); +} + +.border-r-slate-700 { + --tw-border-opacity: 1; + border-right-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); +} + +.border-r-slate-700\/30 { + border-right-color: rgb(51 65 85 / 0.3); +} + +.border-r-slate-800 { + --tw-border-opacity: 1; + border-right-color: rgb(30 41 59 / var(--tw-border-opacity, 1)); +} + +.border-r-slate-800\/50 { + border-right-color: rgb(30 41 59 / 0.5); +} + +.border-r-slate-900 { + --tw-border-opacity: 1; + border-right-color: rgb(15 23 42 / var(--tw-border-opacity, 1)); +} + +.border-r-violet-100 { + --tw-border-opacity: 1; + border-right-color: rgb(237 233 254 / var(--tw-border-opacity, 1)); +} + +.border-r-violet-700 { + --tw-border-opacity: 1; + border-right-color: rgb(109 40 217 / var(--tw-border-opacity, 1)); +} + +.border-r-violet-800 { + --tw-border-opacity: 1; + border-right-color: rgb(91 33 182 / var(--tw-border-opacity, 1)); +} + +.border-r-yellow-50 { + --tw-border-opacity: 1; + border-right-color: rgb(254 252 232 / var(--tw-border-opacity, 1)); +} + +.border-r-yellow-600 { + --tw-border-opacity: 1; + border-right-color: rgb(202 138 4 / var(--tw-border-opacity, 1)); +} + +.border-r-yellow-800 { + --tw-border-opacity: 1; + border-right-color: rgb(133 77 14 / var(--tw-border-opacity, 1)); +} + +.border-t-amber-100 { + --tw-border-opacity: 1; + border-top-color: rgb(254 243 199 / var(--tw-border-opacity, 1)); +} + +.border-t-amber-200 { + --tw-border-opacity: 1; + border-top-color: rgb(253 230 138 / var(--tw-border-opacity, 1)); +} + +.border-t-amber-50 { + --tw-border-opacity: 1; + border-top-color: rgb(255 251 235 / var(--tw-border-opacity, 1)); +} + +.border-t-amber-500 { + --tw-border-opacity: 1; + border-top-color: rgb(245 158 11 / var(--tw-border-opacity, 1)); +} + +.border-t-amber-800 { + --tw-border-opacity: 1; + border-top-color: rgb(146 64 14 / var(--tw-border-opacity, 1)); +} + +.border-t-blue-100 { + --tw-border-opacity: 1; + border-top-color: rgb(219 234 254 / var(--tw-border-opacity, 1)); +} + +.border-t-blue-200 { + --tw-border-opacity: 1; + border-top-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); +} + +.border-t-blue-400 { + --tw-border-opacity: 1; + border-top-color: rgb(96 165 250 / var(--tw-border-opacity, 1)); +} + +.border-t-blue-50 { + --tw-border-opacity: 1; + border-top-color: rgb(239 246 255 / var(--tw-border-opacity, 1)); +} + +.border-t-blue-500 { + --tw-border-opacity: 1; + border-top-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.border-t-blue-600 { + --tw-border-opacity: 1; + border-top-color: rgb(37 99 235 / var(--tw-border-opacity, 1)); +} + +.border-t-blue-600\/30 { + border-top-color: rgb(37 99 235 / 0.3); +} + +.border-t-blue-700 { + --tw-border-opacity: 1; + border-top-color: rgb(29 78 216 / var(--tw-border-opacity, 1)); +} + +.border-t-emerald-200 { + --tw-border-opacity: 1; + border-top-color: rgb(167 243 208 / var(--tw-border-opacity, 1)); +} + +.border-t-emerald-50 { + --tw-border-opacity: 1; + border-top-color: rgb(236 253 245 / var(--tw-border-opacity, 1)); +} + +.border-t-emerald-500 { + --tw-border-opacity: 1; + border-top-color: rgb(16 185 129 / var(--tw-border-opacity, 1)); +} + +.border-t-emerald-700 { + --tw-border-opacity: 1; + border-top-color: rgb(4 120 87 / var(--tw-border-opacity, 1)); +} + +.border-t-gray-100 { + --tw-border-opacity: 1; + border-top-color: rgb(243 244 246 / var(--tw-border-opacity, 1)); +} + +.border-t-gray-200 { + --tw-border-opacity: 1; + border-top-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); +} + +.border-t-gray-400 { + --tw-border-opacity: 1; + border-top-color: rgb(156 163 175 / var(--tw-border-opacity, 1)); +} + +.border-t-gray-50 { + --tw-border-opacity: 1; + border-top-color: rgb(249 250 251 / var(--tw-border-opacity, 1)); +} + +.border-t-gray-500 { + --tw-border-opacity: 1; + border-top-color: rgb(107 114 128 / var(--tw-border-opacity, 1)); +} + +.border-t-gray-600 { + --tw-border-opacity: 1; + border-top-color: rgb(75 85 99 / var(--tw-border-opacity, 1)); +} + +.border-t-gray-700 { + --tw-border-opacity: 1; + border-top-color: rgb(55 65 81 / var(--tw-border-opacity, 1)); +} + +.border-t-gray-800 { + --tw-border-opacity: 1; + border-top-color: rgb(31 41 55 / var(--tw-border-opacity, 1)); +} + +.border-t-gray-900 { + --tw-border-opacity: 1; + border-top-color: rgb(17 24 39 / var(--tw-border-opacity, 1)); +} + +.border-t-green-200 { + --tw-border-opacity: 1; + border-top-color: rgb(187 247 208 / var(--tw-border-opacity, 1)); +} + +.border-t-green-50 { + --tw-border-opacity: 1; + border-top-color: rgb(240 253 244 / var(--tw-border-opacity, 1)); +} + +.border-t-green-600 { + --tw-border-opacity: 1; + border-top-color: rgb(22 163 74 / var(--tw-border-opacity, 1)); +} + +.border-t-green-700 { + --tw-border-opacity: 1; + border-top-color: rgb(21 128 61 / var(--tw-border-opacity, 1)); +} + +.border-t-green-800 { + --tw-border-opacity: 1; + border-top-color: rgb(22 101 52 / var(--tw-border-opacity, 1)); +} + +.border-t-indigo-50\/30 { + border-top-color: rgb(238 242 255 / 0.3); +} + +.border-t-red-200 { + --tw-border-opacity: 1; + border-top-color: rgb(254 202 202 / var(--tw-border-opacity, 1)); +} + +.border-t-red-50 { + --tw-border-opacity: 1; + border-top-color: rgb(254 242 242 / var(--tw-border-opacity, 1)); +} + +.border-t-red-600 { + --tw-border-opacity: 1; + border-top-color: rgb(220 38 38 / var(--tw-border-opacity, 1)); +} + +.border-t-red-700 { + --tw-border-opacity: 1; + border-top-color: rgb(185 28 28 / var(--tw-border-opacity, 1)); +} + +.border-t-red-800 { + --tw-border-opacity: 1; + border-top-color: rgb(153 27 27 / var(--tw-border-opacity, 1)); +} + +.border-t-slate-100 { + --tw-border-opacity: 1; + border-top-color: rgb(241 245 249 / var(--tw-border-opacity, 1)); +} + +.border-t-slate-300 { + --tw-border-opacity: 1; + border-top-color: rgb(203 213 225 / var(--tw-border-opacity, 1)); +} + +.border-t-slate-400 { + --tw-border-opacity: 1; + border-top-color: rgb(148 163 184 / var(--tw-border-opacity, 1)); +} + +.border-t-slate-500 { + --tw-border-opacity: 1; + border-top-color: rgb(100 116 139 / var(--tw-border-opacity, 1)); +} + +.border-t-slate-600 { + --tw-border-opacity: 1; + border-top-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); +} + +.border-t-slate-700 { + --tw-border-opacity: 1; + border-top-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); +} + +.border-t-slate-700\/30 { + border-top-color: rgb(51 65 85 / 0.3); +} + +.border-t-slate-800 { + --tw-border-opacity: 1; + border-top-color: rgb(30 41 59 / var(--tw-border-opacity, 1)); +} + +.border-t-slate-800\/50 { + border-top-color: rgb(30 41 59 / 0.5); +} + +.border-t-slate-900 { + --tw-border-opacity: 1; + border-top-color: rgb(15 23 42 / var(--tw-border-opacity, 1)); +} + +.border-t-transparent { + border-top-color: transparent; +} + +.border-t-violet-100 { + --tw-border-opacity: 1; + border-top-color: rgb(237 233 254 / var(--tw-border-opacity, 1)); +} + +.border-t-violet-700 { + --tw-border-opacity: 1; + border-top-color: rgb(109 40 217 / var(--tw-border-opacity, 1)); +} + +.border-t-violet-800 { + --tw-border-opacity: 1; + border-top-color: rgb(91 33 182 / var(--tw-border-opacity, 1)); +} + +.border-t-yellow-50 { + --tw-border-opacity: 1; + border-top-color: rgb(254 252 232 / var(--tw-border-opacity, 1)); +} + +.border-t-yellow-600 { + --tw-border-opacity: 1; + border-top-color: rgb(202 138 4 / var(--tw-border-opacity, 1)); +} + +.border-t-yellow-800 { + --tw-border-opacity: 1; + border-top-color: rgb(133 77 14 / var(--tw-border-opacity, 1)); +} + +.bg-amber-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1)); +} + +.bg-amber-200 { + --tw-bg-opacity: 1; + background-color: rgb(253 230 138 / var(--tw-bg-opacity, 1)); +} + +.bg-amber-200\/70 { + background-color: rgb(253 230 138 / 0.7); +} + +.bg-amber-200\/80 { + background-color: rgb(253 230 138 / 0.8); +} + +.bg-amber-400\/60 { + background-color: rgb(251 191 36 / 0.6); +} + +.bg-amber-50 { + --tw-bg-opacity: 1; + background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1)); +} + +.bg-amber-500 { + --tw-bg-opacity: 1; + background-color: rgb(245 158 11 / var(--tw-bg-opacity, 1)); +} + +.bg-amber-500\/85 { + background-color: rgb(245 158 11 / 0.85); +} + +.bg-amber-800 { + --tw-bg-opacity: 1; + background-color: rgb(146 64 14 / var(--tw-bg-opacity, 1)); +} + +.bg-black\/20 { + background-color: rgb(0 0 0 / 0.2); +} + +.bg-black\/30 { + background-color: rgb(0 0 0 / 0.3); +} + +.bg-black\/50 { + background-color: rgb(0 0 0 / 0.5); +} + +.bg-black\/55 { + background-color: rgb(0 0 0 / 0.55); +} + +.bg-blue-100 { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1)); +} + +.bg-blue-200 { + --tw-bg-opacity: 1; + background-color: rgb(191 219 254 / var(--tw-bg-opacity, 1)); +} + +.bg-blue-200\/70 { + background-color: rgb(191 219 254 / 0.7); +} + +.bg-blue-400 { + --tw-bg-opacity: 1; + background-color: rgb(96 165 250 / var(--tw-bg-opacity, 1)); +} + +.bg-blue-50 { + --tw-bg-opacity: 1; + background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1)); +} + +.bg-blue-50\/30 { + background-color: rgb(239 246 255 / 0.3); +} + +.bg-blue-50\/70 { + background-color: rgb(239 246 255 / 0.7); +} + +.bg-blue-50\/80 { + background-color: rgb(239 246 255 / 0.8); +} + +.bg-blue-500 { + --tw-bg-opacity: 1; + background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1)); +} + +.bg-blue-500\/85 { + background-color: rgb(59 130 246 / 0.85); +} + +.bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1)); +} + +.bg-blue-600\/25 { + background-color: rgb(37 99 235 / 0.25); +} + +.bg-blue-600\/30 { + background-color: rgb(37 99 235 / 0.3); +} + +.bg-blue-700 { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity, 1)); +} + +.bg-emerald-100 { + --tw-bg-opacity: 1; + background-color: rgb(209 250 229 / var(--tw-bg-opacity, 1)); +} + +.bg-emerald-200 { + --tw-bg-opacity: 1; + background-color: rgb(167 243 208 / var(--tw-bg-opacity, 1)); +} + +.bg-emerald-200\/70 { + background-color: rgb(167 243 208 / 0.7); +} + +.bg-emerald-50 { + --tw-bg-opacity: 1; + background-color: rgb(236 253 245 / var(--tw-bg-opacity, 1)); +} + +.bg-emerald-500 { + --tw-bg-opacity: 1; + background-color: rgb(16 185 129 / var(--tw-bg-opacity, 1)); +} + +.bg-emerald-500\/85 { + background-color: rgb(16 185 129 / 0.85); +} + +.bg-emerald-700 { + --tw-bg-opacity: 1; + background-color: rgb(4 120 87 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-200\/70 { + background-color: rgb(229 231 235 / 0.7); +} + +.bg-gray-300 { + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-50 { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-50\/30 { + background-color: rgb(249 250 251 / 0.3); +} + +.bg-gray-50\/40 { + background-color: rgb(249 250 251 / 0.4); +} + +.bg-gray-50\/50 { + background-color: rgb(249 250 251 / 0.5); +} + +.bg-gray-50\/60 { + background-color: rgb(249 250 251 / 0.6); +} + +.bg-gray-50\/80 { + background-color: rgb(249 250 251 / 0.8); +} + +.bg-gray-50\/90 { + background-color: rgb(249 250 251 / 0.9); +} + +.bg-gray-500 { + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-600 { + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-700 { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-800 { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-900 { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1)); +} + +.bg-green-200 { + --tw-bg-opacity: 1; + background-color: rgb(187 247 208 / var(--tw-bg-opacity, 1)); +} + +.bg-green-50 { + --tw-bg-opacity: 1; + background-color: rgb(240 253 244 / var(--tw-bg-opacity, 1)); +} + +.bg-green-600 { + --tw-bg-opacity: 1; + background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1)); +} + +.bg-green-700 { + --tw-bg-opacity: 1; + background-color: rgb(21 128 61 / var(--tw-bg-opacity, 1)); +} + +.bg-green-800 { + --tw-bg-opacity: 1; + background-color: rgb(22 101 52 / var(--tw-bg-opacity, 1)); +} + +.bg-indigo-300\/90 { + background-color: rgb(165 180 252 / 0.9); +} + +.bg-indigo-50\/30 { + background-color: rgb(238 242 255 / 0.3); +} + +.bg-orange-50 { + --tw-bg-opacity: 1; + background-color: rgb(255 247 237 / var(--tw-bg-opacity, 1)); +} + +.bg-orange-500 { + --tw-bg-opacity: 1; + background-color: rgb(249 115 22 / var(--tw-bg-opacity, 1)); +} + +.bg-pink-500 { + --tw-bg-opacity: 1; + background-color: rgb(236 72 153 / var(--tw-bg-opacity, 1)); +} + +.bg-purple-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 232 255 / var(--tw-bg-opacity, 1)); +} + +.bg-purple-200\/70 { + background-color: rgb(233 213 255 / 0.7); +} + +.bg-purple-500 { + --tw-bg-opacity: 1; + background-color: rgb(168 85 247 / var(--tw-bg-opacity, 1)); +} + +.bg-red-200 { + --tw-bg-opacity: 1; + background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1)); +} + +.bg-red-50 { + --tw-bg-opacity: 1; + background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1)); +} + +.bg-red-500 { + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1)); +} + +.bg-red-500\/90 { + background-color: rgb(239 68 68 / 0.9); +} + +.bg-red-600 { + --tw-bg-opacity: 1; + background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1)); +} + +.bg-red-700 { + --tw-bg-opacity: 1; + background-color: rgb(185 28 28 / var(--tw-bg-opacity, 1)); +} + +.bg-red-800 { + --tw-bg-opacity: 1; + background-color: rgb(153 27 27 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-100 { + --tw-bg-opacity: 1; + background-color: rgb(241 245 249 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-300 { + --tw-bg-opacity: 1; + background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-400 { + --tw-bg-opacity: 1; + background-color: rgb(148 163 184 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-400\/90 { + background-color: rgb(148 163 184 / 0.9); +} + +.bg-slate-50 { + --tw-bg-opacity: 1; + background-color: rgb(248 250 252 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-500 { + --tw-bg-opacity: 1; + background-color: rgb(100 116 139 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-600 { + --tw-bg-opacity: 1; + background-color: rgb(71 85 105 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-700 { + --tw-bg-opacity: 1; + background-color: rgb(51 65 85 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-700\/30 { + background-color: rgb(51 65 85 / 0.3); +} + +.bg-slate-800 { + --tw-bg-opacity: 1; + background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-800\/30 { + background-color: rgb(30 41 59 / 0.3); +} + +.bg-slate-800\/50 { + background-color: rgb(30 41 59 / 0.5); +} + +.bg-slate-800\/80 { + background-color: rgb(30 41 59 / 0.8); +} + +.bg-slate-900 { + --tw-bg-opacity: 1; + background-color: rgb(15 23 42 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-900\/40 { + background-color: rgb(15 23 42 / 0.4); +} + +.bg-slate-900\/95 { + background-color: rgb(15 23 42 / 0.95); +} + +.bg-slate-950 { + --tw-bg-opacity: 1; + background-color: rgb(2 6 23 / var(--tw-bg-opacity, 1)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-violet-100 { + --tw-bg-opacity: 1; + background-color: rgb(237 233 254 / var(--tw-bg-opacity, 1)); +} + +.bg-violet-50 { + --tw-bg-opacity: 1; + background-color: rgb(245 243 255 / var(--tw-bg-opacity, 1)); +} + +.bg-violet-50\/40 { + background-color: rgb(245 243 255 / 0.4); +} + +.bg-violet-50\/50 { + background-color: rgb(245 243 255 / 0.5); +} + +.bg-violet-50\/80 { + background-color: rgb(245 243 255 / 0.8); +} + +.bg-violet-500 { + --tw-bg-opacity: 1; + background-color: rgb(139 92 246 / var(--tw-bg-opacity, 1)); +} + +.bg-violet-500\/85 { + background-color: rgb(139 92 246 / 0.85); +} + +.bg-violet-600 { + --tw-bg-opacity: 1; + background-color: rgb(124 58 237 / var(--tw-bg-opacity, 1)); +} + +.bg-violet-700 { + --tw-bg-opacity: 1; + background-color: rgb(109 40 217 / var(--tw-bg-opacity, 1)); +} + +.bg-violet-800 { + --tw-bg-opacity: 1; + background-color: rgb(91 33 182 / var(--tw-bg-opacity, 1)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +.bg-white\/60 { + background-color: rgb(255 255 255 / 0.6); +} + +.bg-white\/90 { + background-color: rgb(255 255 255 / 0.9); +} + +.bg-white\/95 { + background-color: rgb(255 255 255 / 0.95); +} + +.bg-yellow-50 { + --tw-bg-opacity: 1; + background-color: rgb(254 252 232 / var(--tw-bg-opacity, 1)); +} + +.bg-yellow-600 { + --tw-bg-opacity: 1; + background-color: rgb(202 138 4 / var(--tw-bg-opacity, 1)); +} + +.bg-yellow-800 { + --tw-bg-opacity: 1; + background-color: rgb(133 77 14 / var(--tw-bg-opacity, 1)); +} + +.bg-gradient-to-b { + background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); +} + +.bg-gradient-to-br { + background-image: linear-gradient(to bottom right, var(--tw-gradient-stops)); +} + +.bg-gradient-to-r { + background-image: linear-gradient(to right, var(--tw-gradient-stops)); +} + +.from-amber-100 { + --tw-gradient-from: #fef3c7 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(254 243 199 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-amber-200 { + --tw-gradient-from: #fde68a var(--tw-gradient-from-position); + --tw-gradient-to: rgb(253 230 138 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-amber-50 { + --tw-gradient-from: #fffbeb var(--tw-gradient-from-position); + --tw-gradient-to: rgb(255 251 235 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-amber-500 { + --tw-gradient-from: #f59e0b var(--tw-gradient-from-position); + --tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-amber-800 { + --tw-gradient-from: #92400e var(--tw-gradient-from-position); + --tw-gradient-to: rgb(146 64 14 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-blue-100 { + --tw-gradient-from: #dbeafe var(--tw-gradient-from-position); + --tw-gradient-to: rgb(219 234 254 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-blue-200 { + --tw-gradient-from: #bfdbfe var(--tw-gradient-from-position); + --tw-gradient-to: rgb(191 219 254 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-blue-400 { + --tw-gradient-from: #60a5fa var(--tw-gradient-from-position); + --tw-gradient-to: rgb(96 165 250 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-blue-50 { + --tw-gradient-from: #eff6ff var(--tw-gradient-from-position); + --tw-gradient-to: rgb(239 246 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-blue-50\/80 { + --tw-gradient-from: rgb(239 246 255 / 0.8) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(239 246 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-blue-500 { + --tw-gradient-from: #3b82f6 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-blue-600 { + --tw-gradient-from: #2563eb var(--tw-gradient-from-position); + --tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-blue-600\/30 { + --tw-gradient-from: rgb(37 99 235 / 0.3) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-blue-700 { + --tw-gradient-from: #1d4ed8 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(29 78 216 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-emerald-200 { + --tw-gradient-from: #a7f3d0 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(167 243 208 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-emerald-50 { + --tw-gradient-from: #ecfdf5 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(236 253 245 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-emerald-50\/80 { + --tw-gradient-from: rgb(236 253 245 / 0.8) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(236 253 245 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-emerald-500 { + --tw-gradient-from: #10b981 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(16 185 129 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-emerald-700 { + --tw-gradient-from: #047857 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(4 120 87 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-gray-100 { + --tw-gradient-from: #f3f4f6 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(243 244 246 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-gray-200 { + --tw-gradient-from: #e5e7eb var(--tw-gradient-from-position); + --tw-gradient-to: rgb(229 231 235 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-gray-400 { + --tw-gradient-from: #9ca3af var(--tw-gradient-from-position); + --tw-gradient-to: rgb(156 163 175 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-gray-50 { + --tw-gradient-from: #f9fafb var(--tw-gradient-from-position); + --tw-gradient-to: rgb(249 250 251 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-gray-500 { + --tw-gradient-from: #6b7280 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(107 114 128 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-gray-600 { + --tw-gradient-from: #4b5563 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(75 85 99 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-gray-700 { + --tw-gradient-from: #374151 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(55 65 81 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-gray-800 { + --tw-gradient-from: #1f2937 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(31 41 55 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-gray-900 { + --tw-gradient-from: #111827 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(17 24 39 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-green-200 { + --tw-gradient-from: #bbf7d0 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(187 247 208 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-green-50 { + --tw-gradient-from: #f0fdf4 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(240 253 244 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-green-600 { + --tw-gradient-from: #16a34a var(--tw-gradient-from-position); + --tw-gradient-to: rgb(22 163 74 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-green-700 { + --tw-gradient-from: #15803d var(--tw-gradient-from-position); + --tw-gradient-to: rgb(21 128 61 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-green-800 { + --tw-gradient-from: #166534 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(22 101 52 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-indigo-50\/30 { + --tw-gradient-from: rgb(238 242 255 / 0.3) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(238 242 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-red-200 { + --tw-gradient-from: #fecaca var(--tw-gradient-from-position); + --tw-gradient-to: rgb(254 202 202 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-red-50 { + --tw-gradient-from: #fef2f2 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(254 242 242 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-red-600 { + --tw-gradient-from: #dc2626 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(220 38 38 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-red-700 { + --tw-gradient-from: #b91c1c var(--tw-gradient-from-position); + --tw-gradient-to: rgb(185 28 28 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-red-800 { + --tw-gradient-from: #991b1b var(--tw-gradient-from-position); + --tw-gradient-to: rgb(153 27 27 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-100 { + --tw-gradient-from: #f1f5f9 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(241 245 249 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-300 { + --tw-gradient-from: #cbd5e1 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(203 213 225 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-400 { + --tw-gradient-from: #94a3b8 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(148 163 184 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-50 { + --tw-gradient-from: #f8fafc var(--tw-gradient-from-position); + --tw-gradient-to: rgb(248 250 252 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-50\/80 { + --tw-gradient-from: rgb(248 250 252 / 0.8) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(248 250 252 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-500 { + --tw-gradient-from: #64748b var(--tw-gradient-from-position); + --tw-gradient-to: rgb(100 116 139 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-600 { + --tw-gradient-from: #475569 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(71 85 105 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-700 { + --tw-gradient-from: #334155 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(51 65 85 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-700\/30 { + --tw-gradient-from: rgb(51 65 85 / 0.3) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(51 65 85 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-800 { + --tw-gradient-from: #1e293b var(--tw-gradient-from-position); + --tw-gradient-to: rgb(30 41 59 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-800\/50 { + --tw-gradient-from: rgb(30 41 59 / 0.5) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(30 41 59 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-slate-900 { + --tw-gradient-from: #0f172a var(--tw-gradient-from-position); + --tw-gradient-to: rgb(15 23 42 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-violet-100 { + --tw-gradient-from: #ede9fe var(--tw-gradient-from-position); + --tw-gradient-to: rgb(237 233 254 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-violet-50 { + --tw-gradient-from: #f5f3ff var(--tw-gradient-from-position); + --tw-gradient-to: rgb(245 243 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-violet-50\/80 { + --tw-gradient-from: rgb(245 243 255 / 0.8) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(245 243 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-violet-700 { + --tw-gradient-from: #6d28d9 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(109 40 217 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-violet-800 { + --tw-gradient-from: #5b21b6 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(91 33 182 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-white\/10 { + --tw-gradient-from: rgb(255 255 255 / 0.1) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-yellow-50 { + --tw-gradient-from: #fefce8 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(254 252 232 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-yellow-600 { + --tw-gradient-from: #ca8a04 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(202 138 4 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-yellow-800 { + --tw-gradient-from: #854d0e var(--tw-gradient-from-position); + --tw-gradient-to: rgb(133 77 14 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.via-amber-100 { + --tw-gradient-to: rgb(254 243 199 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #fef3c7 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-amber-200 { + --tw-gradient-to: rgb(253 230 138 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #fde68a var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-amber-50 { + --tw-gradient-to: rgb(255 251 235 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #fffbeb var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-amber-500 { + --tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #f59e0b var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-amber-800 { + --tw-gradient-to: rgb(146 64 14 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #92400e var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-blue-100 { + --tw-gradient-to: rgb(219 234 254 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #dbeafe var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-blue-200 { + --tw-gradient-to: rgb(191 219 254 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #bfdbfe var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-blue-400 { + --tw-gradient-to: rgb(96 165 250 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #60a5fa var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-blue-50 { + --tw-gradient-to: rgb(239 246 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #eff6ff var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-blue-500 { + --tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #3b82f6 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-blue-600 { + --tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #2563eb var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-blue-600\/30 { + --tw-gradient-to: rgb(37 99 235 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), rgb(37 99 235 / 0.3) var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-blue-700 { + --tw-gradient-to: rgb(29 78 216 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #1d4ed8 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-emerald-200 { + --tw-gradient-to: rgb(167 243 208 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #a7f3d0 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-emerald-50 { + --tw-gradient-to: rgb(236 253 245 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #ecfdf5 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-emerald-500 { + --tw-gradient-to: rgb(16 185 129 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #10b981 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-emerald-700 { + --tw-gradient-to: rgb(4 120 87 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #047857 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-gray-100 { + --tw-gradient-to: rgb(243 244 246 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #f3f4f6 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-gray-200 { + --tw-gradient-to: rgb(229 231 235 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #e5e7eb var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-gray-400 { + --tw-gradient-to: rgb(156 163 175 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #9ca3af var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-gray-50 { + --tw-gradient-to: rgb(249 250 251 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #f9fafb var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-gray-500 { + --tw-gradient-to: rgb(107 114 128 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #6b7280 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-gray-600 { + --tw-gradient-to: rgb(75 85 99 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #4b5563 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-gray-700 { + --tw-gradient-to: rgb(55 65 81 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #374151 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-gray-800 { + --tw-gradient-to: rgb(31 41 55 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #1f2937 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-gray-900 { + --tw-gradient-to: rgb(17 24 39 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #111827 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-green-200 { + --tw-gradient-to: rgb(187 247 208 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #bbf7d0 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-green-50 { + --tw-gradient-to: rgb(240 253 244 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #f0fdf4 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-green-600 { + --tw-gradient-to: rgb(22 163 74 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #16a34a var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-green-700 { + --tw-gradient-to: rgb(21 128 61 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #15803d var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-green-800 { + --tw-gradient-to: rgb(22 101 52 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #166534 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-indigo-50\/30 { + --tw-gradient-to: rgb(238 242 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), rgb(238 242 255 / 0.3) var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-red-200 { + --tw-gradient-to: rgb(254 202 202 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #fecaca var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-red-50 { + --tw-gradient-to: rgb(254 242 242 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #fef2f2 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-red-600 { + --tw-gradient-to: rgb(220 38 38 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #dc2626 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-red-700 { + --tw-gradient-to: rgb(185 28 28 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #b91c1c var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-red-800 { + --tw-gradient-to: rgb(153 27 27 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #991b1b var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-slate-100 { + --tw-gradient-to: rgb(241 245 249 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #f1f5f9 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-slate-300 { + --tw-gradient-to: rgb(203 213 225 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #cbd5e1 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-slate-400 { + --tw-gradient-to: rgb(148 163 184 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #94a3b8 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-slate-500 { + --tw-gradient-to: rgb(100 116 139 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #64748b var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-slate-600 { + --tw-gradient-to: rgb(71 85 105 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #475569 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-slate-700 { + --tw-gradient-to: rgb(51 65 85 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #334155 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-slate-700\/30 { + --tw-gradient-to: rgb(51 65 85 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), rgb(51 65 85 / 0.3) var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-slate-800 { + --tw-gradient-to: rgb(30 41 59 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #1e293b var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-slate-800\/50 { + --tw-gradient-to: rgb(30 41 59 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), rgb(30 41 59 / 0.5) var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-slate-900 { + --tw-gradient-to: rgb(15 23 42 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #0f172a var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-violet-100 { + --tw-gradient-to: rgb(237 233 254 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #ede9fe var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-violet-700 { + --tw-gradient-to: rgb(109 40 217 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #6d28d9 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-violet-800 { + --tw-gradient-to: rgb(91 33 182 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #5b21b6 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-white { + --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #fff var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-yellow-50 { + --tw-gradient-to: rgb(254 252 232 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #fefce8 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-yellow-600 { + --tw-gradient-to: rgb(202 138 4 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #ca8a04 var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.via-yellow-800 { + --tw-gradient-to: rgb(133 77 14 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), #854d0e var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.to-amber-100 { + --tw-gradient-to: #fef3c7 var(--tw-gradient-to-position); +} + +.to-amber-200 { + --tw-gradient-to: #fde68a var(--tw-gradient-to-position); +} + +.to-amber-50 { + --tw-gradient-to: #fffbeb var(--tw-gradient-to-position); +} + +.to-amber-500 { + --tw-gradient-to: #f59e0b var(--tw-gradient-to-position); +} + +.to-amber-800 { + --tw-gradient-to: #92400e var(--tw-gradient-to-position); +} + +.to-black\/10 { + --tw-gradient-to: rgb(0 0 0 / 0.1) var(--tw-gradient-to-position); +} + +.to-blue-100 { + --tw-gradient-to: #dbeafe var(--tw-gradient-to-position); +} + +.to-blue-200 { + --tw-gradient-to: #bfdbfe var(--tw-gradient-to-position); +} + +.to-blue-400 { + --tw-gradient-to: #60a5fa var(--tw-gradient-to-position); +} + +.to-blue-50 { + --tw-gradient-to: #eff6ff var(--tw-gradient-to-position); +} + +.to-blue-50\/40 { + --tw-gradient-to: rgb(239 246 255 / 0.4) var(--tw-gradient-to-position); +} + +.to-blue-500 { + --tw-gradient-to: #3b82f6 var(--tw-gradient-to-position); +} + +.to-blue-600 { + --tw-gradient-to: #2563eb var(--tw-gradient-to-position); +} + +.to-blue-600\/30 { + --tw-gradient-to: rgb(37 99 235 / 0.3) var(--tw-gradient-to-position); +} + +.to-blue-700 { + --tw-gradient-to: #1d4ed8 var(--tw-gradient-to-position); +} + +.to-emerald-200 { + --tw-gradient-to: #a7f3d0 var(--tw-gradient-to-position); +} + +.to-emerald-50 { + --tw-gradient-to: #ecfdf5 var(--tw-gradient-to-position); +} + +.to-emerald-500 { + --tw-gradient-to: #10b981 var(--tw-gradient-to-position); +} + +.to-emerald-700 { + --tw-gradient-to: #047857 var(--tw-gradient-to-position); +} + +.to-gray-100 { + --tw-gradient-to: #f3f4f6 var(--tw-gradient-to-position); +} + +.to-gray-200 { + --tw-gradient-to: #e5e7eb var(--tw-gradient-to-position); +} + +.to-gray-400 { + --tw-gradient-to: #9ca3af var(--tw-gradient-to-position); +} + +.to-gray-50 { + --tw-gradient-to: #f9fafb var(--tw-gradient-to-position); +} + +.to-gray-500 { + --tw-gradient-to: #6b7280 var(--tw-gradient-to-position); +} + +.to-gray-600 { + --tw-gradient-to: #4b5563 var(--tw-gradient-to-position); +} + +.to-gray-700 { + --tw-gradient-to: #374151 var(--tw-gradient-to-position); +} + +.to-gray-800 { + --tw-gradient-to: #1f2937 var(--tw-gradient-to-position); +} + +.to-gray-900 { + --tw-gradient-to: #111827 var(--tw-gradient-to-position); +} + +.to-green-200 { + --tw-gradient-to: #bbf7d0 var(--tw-gradient-to-position); +} + +.to-green-50 { + --tw-gradient-to: #f0fdf4 var(--tw-gradient-to-position); +} + +.to-green-600 { + --tw-gradient-to: #16a34a var(--tw-gradient-to-position); +} + +.to-green-700 { + --tw-gradient-to: #15803d var(--tw-gradient-to-position); +} + +.to-green-800 { + --tw-gradient-to: #166534 var(--tw-gradient-to-position); +} + +.to-indigo-50\/30 { + --tw-gradient-to: rgb(238 242 255 / 0.3) var(--tw-gradient-to-position); +} + +.to-red-200 { + --tw-gradient-to: #fecaca var(--tw-gradient-to-position); +} + +.to-red-50 { + --tw-gradient-to: #fef2f2 var(--tw-gradient-to-position); +} + +.to-red-600 { + --tw-gradient-to: #dc2626 var(--tw-gradient-to-position); +} + +.to-red-700 { + --tw-gradient-to: #b91c1c var(--tw-gradient-to-position); +} + +.to-red-800 { + --tw-gradient-to: #991b1b var(--tw-gradient-to-position); +} + +.to-slate-100 { + --tw-gradient-to: #f1f5f9 var(--tw-gradient-to-position); +} + +.to-slate-300 { + --tw-gradient-to: #cbd5e1 var(--tw-gradient-to-position); +} + +.to-slate-400 { + --tw-gradient-to: #94a3b8 var(--tw-gradient-to-position); +} + +.to-slate-500 { + --tw-gradient-to: #64748b var(--tw-gradient-to-position); +} + +.to-slate-600 { + --tw-gradient-to: #475569 var(--tw-gradient-to-position); +} + +.to-slate-700 { + --tw-gradient-to: #334155 var(--tw-gradient-to-position); +} + +.to-slate-700\/30 { + --tw-gradient-to: rgb(51 65 85 / 0.3) var(--tw-gradient-to-position); +} + +.to-slate-800 { + --tw-gradient-to: #1e293b var(--tw-gradient-to-position); +} + +.to-slate-800\/50 { + --tw-gradient-to: rgb(30 41 59 / 0.5) var(--tw-gradient-to-position); +} + +.to-slate-900 { + --tw-gradient-to: #0f172a var(--tw-gradient-to-position); +} + +.to-transparent { + --tw-gradient-to: transparent var(--tw-gradient-to-position); +} + +.to-violet-100 { + --tw-gradient-to: #ede9fe var(--tw-gradient-to-position); +} + +.to-violet-700 { + --tw-gradient-to: #6d28d9 var(--tw-gradient-to-position); +} + +.to-violet-800 { + --tw-gradient-to: #5b21b6 var(--tw-gradient-to-position); +} + +.to-white { + --tw-gradient-to: #fff var(--tw-gradient-to-position); +} + +.to-yellow-50 { + --tw-gradient-to: #fefce8 var(--tw-gradient-to-position); +} + +.to-yellow-600 { + --tw-gradient-to: #ca8a04 var(--tw-gradient-to-position); +} + +.to-yellow-800 { + --tw-gradient-to: #854d0e var(--tw-gradient-to-position); +} + +.p-0 { + padding: 0px; +} + +.p-0\.5 { + padding: 0.125rem; +} + +.p-1 { + padding: 0.25rem; +} + +.p-1\.5 { + padding: 0.375rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.p-5 { + padding: 1.25rem; +} + +.p-6 { + padding: 1.5rem; +} + +.p-8 { + padding: 2rem; +} + +.px-0 { + padding-left: 0px; + padding-right: 0px; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.px-1\.5 { + padding-left: 0.375rem; + padding-right: 0.375rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.px-2\.5 { + padding-left: 0.625rem; + padding-right: 0.625rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-0 { + padding-top: 0px; + padding-bottom: 0px; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-1\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.py-10 { + padding-top: 2.5rem; + padding-bottom: 2.5rem; +} + +.py-12 { + padding-top: 3rem; + padding-bottom: 3rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-2\.5 { + padding-top: 0.625rem; + padding-bottom: 0.625rem; +} + +.py-24 { + padding-top: 6rem; + padding-bottom: 6rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.py-px { + padding-top: 1px; + padding-bottom: 1px; +} + +.pb-0\.5 { + padding-bottom: 0.125rem; +} + +.pb-1 { + padding-bottom: 0.25rem; +} + +.pb-3 { + padding-bottom: 0.75rem; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pl-1 { + padding-left: 0.25rem; +} + +.pl-2 { + padding-left: 0.5rem; +} + +.pl-4 { + padding-left: 1rem; +} + +.pl-5 { + padding-left: 1.25rem; +} + +.pl-7 { + padding-left: 1.75rem; +} + +.pl-8 { + padding-left: 2rem; +} + +.pl-\[18px\] { + padding-left: 18px; +} + +.pr-1 { + padding-right: 0.25rem; +} + +.pr-2 { + padding-right: 0.5rem; +} + +.pr-3 { + padding-right: 0.75rem; +} + +.pr-4 { + padding-right: 1rem; +} + +.pt-0\.5 { + padding-top: 0.125rem; +} + +.pt-1 { + padding-top: 0.25rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.pt-3 { + padding-top: 0.75rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.pt-\[10vh\] { + padding-top: 10vh; +} + +.pt-\[12vh\] { + padding-top: 12vh; +} + +.pt-\[15vh\] { + padding-top: 15vh; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.align-top { + vertical-align: top; +} + +.font-mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.font-sans { + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-\[10px\] { + font-size: 10px; +} + +.text-\[11px\] { + font-size: 11px; +} + +.text-\[9px\] { + font-size: 9px; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.font-bold { + font-weight: 700; +} + +.font-medium { + font-weight: 500; +} + +.font-normal { + font-weight: 400; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.italic { + font-style: italic; +} + +.tabular-nums { + --tw-numeric-spacing: tabular-nums; + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); +} + +.leading-5 { + line-height: 1.25rem; +} + +.leading-none { + line-height: 1; +} + +.leading-relaxed { + line-height: 1.625; +} + +.leading-snug { + line-height: 1.375; +} + +.tracking-wide { + letter-spacing: 0.025em; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.text-amber-100 { + --tw-text-opacity: 1; + color: rgb(254 243 199 / var(--tw-text-opacity, 1)); +} + +.text-amber-200 { + --tw-text-opacity: 1; + color: rgb(253 230 138 / var(--tw-text-opacity, 1)); +} + +.text-amber-50 { + --tw-text-opacity: 1; + color: rgb(255 251 235 / var(--tw-text-opacity, 1)); +} + +.text-amber-500 { + --tw-text-opacity: 1; + color: rgb(245 158 11 / var(--tw-text-opacity, 1)); +} + +.text-amber-600 { + --tw-text-opacity: 1; + color: rgb(217 119 6 / var(--tw-text-opacity, 1)); +} + +.text-amber-700 { + --tw-text-opacity: 1; + color: rgb(180 83 9 / var(--tw-text-opacity, 1)); +} + +.text-amber-800 { + --tw-text-opacity: 1; + color: rgb(146 64 14 / var(--tw-text-opacity, 1)); +} + +.text-amber-900 { + --tw-text-opacity: 1; + color: rgb(120 53 15 / var(--tw-text-opacity, 1)); +} + +.text-amber-950 { + --tw-text-opacity: 1; + color: rgb(69 26 3 / var(--tw-text-opacity, 1)); +} + +.text-blue-100 { + --tw-text-opacity: 1; + color: rgb(219 234 254 / var(--tw-text-opacity, 1)); +} + +.text-blue-200 { + --tw-text-opacity: 1; + color: rgb(191 219 254 / var(--tw-text-opacity, 1)); +} + +.text-blue-300 { + --tw-text-opacity: 1; + color: rgb(147 197 253 / var(--tw-text-opacity, 1)); +} + +.text-blue-300\/80 { + color: rgb(147 197 253 / 0.8); +} + +.text-blue-400 { + --tw-text-opacity: 1; + color: rgb(96 165 250 / var(--tw-text-opacity, 1)); +} + +.text-blue-50 { + --tw-text-opacity: 1; + color: rgb(239 246 255 / var(--tw-text-opacity, 1)); +} + +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity, 1)); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity, 1)); +} + +.text-blue-600\/30 { + color: rgb(37 99 235 / 0.3); +} + +.text-blue-700 { + --tw-text-opacity: 1; + color: rgb(29 78 216 / var(--tw-text-opacity, 1)); +} + +.text-blue-700\/90 { + color: rgb(29 78 216 / 0.9); +} + +.text-blue-800 { + --tw-text-opacity: 1; + color: rgb(30 64 175 / var(--tw-text-opacity, 1)); +} + +.text-blue-900 { + --tw-text-opacity: 1; + color: rgb(30 58 138 / var(--tw-text-opacity, 1)); +} + +.text-emerald-200 { + --tw-text-opacity: 1; + color: rgb(167 243 208 / var(--tw-text-opacity, 1)); +} + +.text-emerald-300 { + --tw-text-opacity: 1; + color: rgb(110 231 183 / var(--tw-text-opacity, 1)); +} + +.text-emerald-400\/90 { + color: rgb(52 211 153 / 0.9); +} + +.text-emerald-50 { + --tw-text-opacity: 1; + color: rgb(236 253 245 / var(--tw-text-opacity, 1)); +} + +.text-emerald-500 { + --tw-text-opacity: 1; + color: rgb(16 185 129 / var(--tw-text-opacity, 1)); +} + +.text-emerald-600 { + --tw-text-opacity: 1; + color: rgb(5 150 105 / var(--tw-text-opacity, 1)); +} + +.text-emerald-700 { + --tw-text-opacity: 1; + color: rgb(4 120 87 / var(--tw-text-opacity, 1)); +} + +.text-emerald-800 { + --tw-text-opacity: 1; + color: rgb(6 95 70 / var(--tw-text-opacity, 1)); +} + +.text-emerald-900 { + --tw-text-opacity: 1; + color: rgb(6 78 59 / var(--tw-text-opacity, 1)); +} + +.text-gray-100 { + --tw-text-opacity: 1; + color: rgb(243 244 246 / var(--tw-text-opacity, 1)); +} + +.text-gray-200 { + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity, 1)); +} + +.text-gray-300 { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity, 1)); +} + +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity, 1)); +} + +.text-gray-50 { + --tw-text-opacity: 1; + color: rgb(249 250 251 / var(--tw-text-opacity, 1)); +} + +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity, 1)); +} + +.text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity, 1)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity, 1)); +} + +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity, 1)); +} + +.text-gray-900 { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity, 1)); +} + +.text-green-200 { + --tw-text-opacity: 1; + color: rgb(187 247 208 / var(--tw-text-opacity, 1)); +} + +.text-green-50 { + --tw-text-opacity: 1; + color: rgb(240 253 244 / var(--tw-text-opacity, 1)); +} + +.text-green-600 { + --tw-text-opacity: 1; + color: rgb(22 163 74 / var(--tw-text-opacity, 1)); +} + +.text-green-700 { + --tw-text-opacity: 1; + color: rgb(21 128 61 / var(--tw-text-opacity, 1)); +} + +.text-green-800 { + --tw-text-opacity: 1; + color: rgb(22 101 52 / var(--tw-text-opacity, 1)); +} + +.text-green-900 { + --tw-text-opacity: 1; + color: rgb(20 83 45 / var(--tw-text-opacity, 1)); +} + +.text-indigo-50\/30 { + color: rgb(238 242 255 / 0.3); +} + +.text-orange-600 { + --tw-text-opacity: 1; + color: rgb(234 88 12 / var(--tw-text-opacity, 1)); +} + +.text-orange-700 { + --tw-text-opacity: 1; + color: rgb(194 65 12 / var(--tw-text-opacity, 1)); +} + +.text-orange-800 { + --tw-text-opacity: 1; + color: rgb(154 52 18 / var(--tw-text-opacity, 1)); +} + +.text-orange-900 { + --tw-text-opacity: 1; + color: rgb(124 45 18 / var(--tw-text-opacity, 1)); +} + +.text-purple-800 { + --tw-text-opacity: 1; + color: rgb(107 33 168 / var(--tw-text-opacity, 1)); +} + +.text-red-200 { + --tw-text-opacity: 1; + color: rgb(254 202 202 / var(--tw-text-opacity, 1)); +} + +.text-red-50 { + --tw-text-opacity: 1; + color: rgb(254 242 242 / var(--tw-text-opacity, 1)); +} + +.text-red-500 { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity, 1)); +} + +.text-red-600 { + --tw-text-opacity: 1; + color: rgb(220 38 38 / var(--tw-text-opacity, 1)); +} + +.text-red-700 { + --tw-text-opacity: 1; + color: rgb(185 28 28 / var(--tw-text-opacity, 1)); +} + +.text-red-800 { + --tw-text-opacity: 1; + color: rgb(153 27 27 / var(--tw-text-opacity, 1)); +} + +.text-red-900 { + --tw-text-opacity: 1; + color: rgb(127 29 29 / var(--tw-text-opacity, 1)); +} + +.text-slate-100 { + --tw-text-opacity: 1; + color: rgb(241 245 249 / var(--tw-text-opacity, 1)); +} + +.text-slate-200 { + --tw-text-opacity: 1; + color: rgb(226 232 240 / var(--tw-text-opacity, 1)); +} + +.text-slate-300 { + --tw-text-opacity: 1; + color: rgb(203 213 225 / var(--tw-text-opacity, 1)); +} + +.text-slate-400 { + --tw-text-opacity: 1; + color: rgb(148 163 184 / var(--tw-text-opacity, 1)); +} + +.text-slate-500 { + --tw-text-opacity: 1; + color: rgb(100 116 139 / var(--tw-text-opacity, 1)); +} + +.text-slate-600 { + --tw-text-opacity: 1; + color: rgb(71 85 105 / var(--tw-text-opacity, 1)); +} + +.text-slate-700 { + --tw-text-opacity: 1; + color: rgb(51 65 85 / var(--tw-text-opacity, 1)); +} + +.text-slate-700\/30 { + color: rgb(51 65 85 / 0.3); +} + +.text-slate-800 { + --tw-text-opacity: 1; + color: rgb(30 41 59 / var(--tw-text-opacity, 1)); +} + +.text-slate-800\/50 { + color: rgb(30 41 59 / 0.5); +} + +.text-slate-900 { + --tw-text-opacity: 1; + color: rgb(15 23 42 / var(--tw-text-opacity, 1)); +} + +.text-violet-100 { + --tw-text-opacity: 1; + color: rgb(237 233 254 / var(--tw-text-opacity, 1)); +} + +.text-violet-600 { + --tw-text-opacity: 1; + color: rgb(124 58 237 / var(--tw-text-opacity, 1)); +} + +.text-violet-700 { + --tw-text-opacity: 1; + color: rgb(109 40 217 / var(--tw-text-opacity, 1)); +} + +.text-violet-800 { + --tw-text-opacity: 1; + color: rgb(91 33 182 / var(--tw-text-opacity, 1)); +} + +.text-violet-900 { + --tw-text-opacity: 1; + color: rgb(76 29 149 / var(--tw-text-opacity, 1)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.text-white\/70 { + color: rgb(255 255 255 / 0.7); +} + +.text-white\/90 { + color: rgb(255 255 255 / 0.9); +} + +.text-yellow-50 { + --tw-text-opacity: 1; + color: rgb(254 252 232 / var(--tw-text-opacity, 1)); +} + +.text-yellow-600 { + --tw-text-opacity: 1; + color: rgb(202 138 4 / var(--tw-text-opacity, 1)); +} + +.text-yellow-800 { + --tw-text-opacity: 1; + color: rgb(133 77 14 / var(--tw-text-opacity, 1)); +} + +.underline { + text-decoration-line: underline; +} + +.underline-offset-2 { + text-underline-offset: 2px; +} + +.accent-blue-500 { + accent-color: #3b82f6; +} + +.accent-blue-600 { + accent-color: #2563eb; +} + +.opacity-0 { + opacity: 0; +} + +.opacity-60 { + opacity: 0.6; +} + +.opacity-70 { + opacity: 0.7; +} + +.opacity-80 { + opacity: 0.8; +} + +.opacity-85 { + opacity: 0.85; +} + +.opacity-90 { + opacity: 0.9; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-2xl { + --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); + --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[0_20px_60px_-12px_rgba\(0\2c 0\2c 0\2c 0\.35\)\] { + --tw-shadow: 0 20px 60px -12px rgba(0,0,0,0.35); + --tw-shadow-colored: 0 20px 60px -12px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-xl { + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-gray-900\/10 { + --tw-shadow-color: rgb(17 24 39 / 0.1); + --tw-shadow: var(--tw-shadow-colored); +} + +.outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.outline { + outline-style: solid; +} + +.ring { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-1 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-2 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-4 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-inset { + --tw-ring-inset: inset; +} + +.ring-amber-100 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(254 243 199 / var(--tw-ring-opacity, 1)); +} + +.ring-amber-200 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(253 230 138 / var(--tw-ring-opacity, 1)); +} + +.ring-amber-50 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(255 251 235 / var(--tw-ring-opacity, 1)); +} + +.ring-amber-500 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(245 158 11 / var(--tw-ring-opacity, 1)); +} + +.ring-amber-800 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(146 64 14 / var(--tw-ring-opacity, 1)); +} + +.ring-blue-100 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(219 234 254 / var(--tw-ring-opacity, 1)); +} + +.ring-blue-200 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(191 219 254 / var(--tw-ring-opacity, 1)); +} + +.ring-blue-300 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity, 1)); +} + +.ring-blue-400 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1)); +} + +.ring-blue-400\/50 { + --tw-ring-color: rgb(96 165 250 / 0.5); +} + +.ring-blue-50 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(239 246 255 / var(--tw-ring-opacity, 1)); +} + +.ring-blue-500 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1)); +} + +.ring-blue-600 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity, 1)); +} + +.ring-blue-600\/30 { + --tw-ring-color: rgb(37 99 235 / 0.3); +} + +.ring-blue-700 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(29 78 216 / var(--tw-ring-opacity, 1)); +} + +.ring-emerald-100 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(209 250 229 / var(--tw-ring-opacity, 1)); +} + +.ring-emerald-200 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(167 243 208 / var(--tw-ring-opacity, 1)); +} + +.ring-emerald-50 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(236 253 245 / var(--tw-ring-opacity, 1)); +} + +.ring-emerald-500 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(16 185 129 / var(--tw-ring-opacity, 1)); +} + +.ring-emerald-700 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(4 120 87 / var(--tw-ring-opacity, 1)); +} + +.ring-gray-100 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(243 244 246 / var(--tw-ring-opacity, 1)); +} + +.ring-gray-200 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity, 1)); +} + +.ring-gray-400 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1)); +} + +.ring-gray-50 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(249 250 251 / var(--tw-ring-opacity, 1)); +} + +.ring-gray-500 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity, 1)); +} + +.ring-gray-600 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity, 1)); +} + +.ring-gray-700 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity, 1)); +} + +.ring-gray-800 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity, 1)); +} + +.ring-gray-900 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(17 24 39 / var(--tw-ring-opacity, 1)); +} + +.ring-green-200 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(187 247 208 / var(--tw-ring-opacity, 1)); +} + +.ring-green-50 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(240 253 244 / var(--tw-ring-opacity, 1)); +} + +.ring-green-600 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(22 163 74 / var(--tw-ring-opacity, 1)); +} + +.ring-green-700 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(21 128 61 / var(--tw-ring-opacity, 1)); +} + +.ring-green-800 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(22 101 52 / var(--tw-ring-opacity, 1)); +} + +.ring-indigo-50\/30 { + --tw-ring-color: rgb(238 242 255 / 0.3); +} + +.ring-orange-100 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(255 237 213 / var(--tw-ring-opacity, 1)); +} + +.ring-red-200 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(254 202 202 / var(--tw-ring-opacity, 1)); +} + +.ring-red-300 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity, 1)); +} + +.ring-red-50 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(254 242 242 / var(--tw-ring-opacity, 1)); +} + +.ring-red-500 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1)); +} + +.ring-red-600 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(220 38 38 / var(--tw-ring-opacity, 1)); +} + +.ring-red-700 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(185 28 28 / var(--tw-ring-opacity, 1)); +} + +.ring-red-800 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(153 27 27 / var(--tw-ring-opacity, 1)); +} + +.ring-slate-100 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(241 245 249 / var(--tw-ring-opacity, 1)); +} + +.ring-slate-300 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(203 213 225 / var(--tw-ring-opacity, 1)); +} + +.ring-slate-400 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(148 163 184 / var(--tw-ring-opacity, 1)); +} + +.ring-slate-500 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(100 116 139 / var(--tw-ring-opacity, 1)); +} + +.ring-slate-600 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(71 85 105 / var(--tw-ring-opacity, 1)); +} + +.ring-slate-700 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(51 65 85 / var(--tw-ring-opacity, 1)); +} + +.ring-slate-700\/30 { + --tw-ring-color: rgb(51 65 85 / 0.3); +} + +.ring-slate-800 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(30 41 59 / var(--tw-ring-opacity, 1)); +} + +.ring-slate-800\/50 { + --tw-ring-color: rgb(30 41 59 / 0.5); +} + +.ring-slate-900 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(15 23 42 / var(--tw-ring-opacity, 1)); +} + +.ring-violet-100 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(237 233 254 / var(--tw-ring-opacity, 1)); +} + +.ring-violet-700 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(109 40 217 / var(--tw-ring-opacity, 1)); +} + +.ring-violet-800 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(91 33 182 / var(--tw-ring-opacity, 1)); +} + +.ring-white { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity, 1)); +} + +.ring-yellow-50 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(254 252 232 / var(--tw-ring-opacity, 1)); +} + +.ring-yellow-600 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(202 138 4 / var(--tw-ring-opacity, 1)); +} + +.ring-yellow-800 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(133 77 14 / var(--tw-ring-opacity, 1)); +} + +.ring-offset-1 { + --tw-ring-offset-width: 1px; +} + +.drop-shadow-sm { + --tw-drop-shadow: drop-shadow(0 1px 1px rgb(0 0 0 / 0.05)); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.\!filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important; +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.backdrop-blur { + --tw-backdrop-blur: blur(8px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.backdrop-blur-md { + --tw-backdrop-blur: blur(12px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.backdrop-blur-sm { + --tw-backdrop-blur: blur(4px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-shadow { + transition-property: box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-150 { + transition-duration: 150ms; +} + +.duration-200 { + transition-duration: 200ms; +} + +.duration-300 { + transition-duration: 300ms; +} + +.duration-500 { + transition-duration: 500ms; +} + +.ease-out { + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +/* Custom styles for the probing web interface */ + +.page-layout { + min-height: 100vh; + background-color: #f9fafb; +} + +.header-bar { + background-color: white; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); +} + +.nav-button:hover { + background-color: #f3f4f6; +} + +.panel { + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); +} + +.table-container { + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); +} + +.source-viewer-overlay { + animation: source-viewer-fade-in 120ms ease-out; +} + +.source-viewer-dialog { + animation: source-viewer-slide-in 160ms ease-out; +} + +@keyframes source-viewer-fade-in { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes source-viewer-slide-in { + from { + opacity: 0; + transform: translateY(8px) scale(0.98); + } + + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +.last\:border-0:last-child { + border-width: 0px; +} + +.last\:border-b-0:last-child { + border-bottom-width: 0px; +} + +.last\:pb-0:last-child { + padding-bottom: 0px; +} + +.focus-within\:border-blue-500:focus-within { + --tw-border-opacity: 1; + border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.focus-within\:ring-2:focus-within { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus-within\:ring-blue-500\/30:focus-within { + --tw-ring-color: rgb(59 130 246 / 0.3); +} + +.hover\:border-blue-200:hover { + --tw-border-opacity: 1; + border-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); +} + +.hover\:border-blue-700\/40:hover { + border-color: rgb(29 78 216 / 0.4); +} + +.hover\:border-emerald-700\/40:hover { + border-color: rgb(4 120 87 / 0.4); +} + +.hover\:border-slate-500:hover { + --tw-border-opacity: 1; + border-color: rgb(100 116 139 / var(--tw-border-opacity, 1)); +} + +.hover\:bg-amber-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-amber-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(253 230 138 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-amber-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-amber-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(245 158 11 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-amber-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(217 119 6 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-amber-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(146 64 14 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-blue-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-blue-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(191 219 254 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-blue-400:hover { + --tw-bg-opacity: 1; + background-color: rgb(96 165 250 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-blue-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-blue-50\/40:hover { + background-color: rgb(239 246 255 / 0.4); +} + +.hover\:bg-blue-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-blue-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-blue-600\/30:hover { + background-color: rgb(37 99 235 / 0.3); +} + +.hover\:bg-blue-600\/50:hover { + background-color: rgb(37 99 235 / 0.5); +} + +.hover\:bg-blue-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-emerald-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(209 250 229 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-emerald-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(167 243 208 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-emerald-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(236 253 245 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-emerald-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(16 185 129 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-emerald-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(5 150 105 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-emerald-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(4 120 87 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-100\/80:hover { + background-color: rgb(243 244 246 / 0.8); +} + +.hover\:bg-gray-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-200\/80:hover { + background-color: rgb(229 231 235 / 0.8); +} + +.hover\:bg-gray-400:hover { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-50\/50:hover { + background-color: rgb(249 250 251 / 0.5); +} + +.hover\:bg-gray-50\/60:hover { + background-color: rgb(249 250 251 / 0.6); +} + +.hover\:bg-gray-50\/80:hover { + background-color: rgb(249 250 251 / 0.8); +} + +.hover\:bg-gray-50\/90:hover { + background-color: rgb(249 250 251 / 0.9); +} + +.hover\:bg-gray-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-900:hover { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-green-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(187 247 208 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-green-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(240 253 244 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-green-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-green-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(21 128 61 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-green-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(22 101 52 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-indigo-50\/30:hover { + background-color: rgb(238 242 255 / 0.3); +} + +.hover\:bg-red-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-red-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-red-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-red-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(185 28 28 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-red-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(153 27 27 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-slate-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(241 245 249 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-slate-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-slate-400:hover { + --tw-bg-opacity: 1; + background-color: rgb(148 163 184 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-slate-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(100 116 139 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-slate-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(71 85 105 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-slate-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(51 65 85 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-slate-700\/30:hover { + background-color: rgb(51 65 85 / 0.3); +} + +.hover\:bg-slate-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-slate-800\/50:hover { + background-color: rgb(30 41 59 / 0.5); +} + +.hover\:bg-slate-800\/60:hover { + background-color: rgb(30 41 59 / 0.6); +} + +.hover\:bg-slate-900:hover { + --tw-bg-opacity: 1; + background-color: rgb(15 23 42 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-violet-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(237 233 254 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-violet-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(245 243 255 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-violet-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(124 58 237 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-violet-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(109 40 217 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-violet-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(91 33 182 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-yellow-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 252 232 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-yellow-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(202 138 4 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-yellow-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(133 77 14 / var(--tw-bg-opacity, 1)); +} + +.hover\:text-amber-100:hover { + --tw-text-opacity: 1; + color: rgb(254 243 199 / var(--tw-text-opacity, 1)); +} + +.hover\:text-amber-200:hover { + --tw-text-opacity: 1; + color: rgb(253 230 138 / var(--tw-text-opacity, 1)); +} + +.hover\:text-amber-50:hover { + --tw-text-opacity: 1; + color: rgb(255 251 235 / var(--tw-text-opacity, 1)); +} + +.hover\:text-amber-500:hover { + --tw-text-opacity: 1; + color: rgb(245 158 11 / var(--tw-text-opacity, 1)); +} + +.hover\:text-amber-800:hover { + --tw-text-opacity: 1; + color: rgb(146 64 14 / var(--tw-text-opacity, 1)); +} + +.hover\:text-blue-100:hover { + --tw-text-opacity: 1; + color: rgb(219 234 254 / var(--tw-text-opacity, 1)); +} + +.hover\:text-blue-200:hover { + --tw-text-opacity: 1; + color: rgb(191 219 254 / var(--tw-text-opacity, 1)); +} + +.hover\:text-blue-400:hover { + --tw-text-opacity: 1; + color: rgb(96 165 250 / var(--tw-text-opacity, 1)); +} + +.hover\:text-blue-50:hover { + --tw-text-opacity: 1; + color: rgb(239 246 255 / var(--tw-text-opacity, 1)); +} + +.hover\:text-blue-500:hover { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity, 1)); +} + +.hover\:text-blue-600:hover { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity, 1)); +} + +.hover\:text-blue-600\/30:hover { + color: rgb(37 99 235 / 0.3); +} + +.hover\:text-blue-700:hover { + --tw-text-opacity: 1; + color: rgb(29 78 216 / var(--tw-text-opacity, 1)); +} + +.hover\:text-blue-800:hover { + --tw-text-opacity: 1; + color: rgb(30 64 175 / var(--tw-text-opacity, 1)); +} + +.hover\:text-emerald-200:hover { + --tw-text-opacity: 1; + color: rgb(167 243 208 / var(--tw-text-opacity, 1)); +} + +.hover\:text-emerald-50:hover { + --tw-text-opacity: 1; + color: rgb(236 253 245 / var(--tw-text-opacity, 1)); +} + +.hover\:text-emerald-500:hover { + --tw-text-opacity: 1; + color: rgb(16 185 129 / var(--tw-text-opacity, 1)); +} + +.hover\:text-emerald-700:hover { + --tw-text-opacity: 1; + color: rgb(4 120 87 / var(--tw-text-opacity, 1)); +} + +.hover\:text-gray-100:hover { + --tw-text-opacity: 1; + color: rgb(243 244 246 / var(--tw-text-opacity, 1)); +} + +.hover\:text-gray-200:hover { + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity, 1)); +} + +.hover\:text-gray-400:hover { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity, 1)); +} + +.hover\:text-gray-50:hover { + --tw-text-opacity: 1; + color: rgb(249 250 251 / var(--tw-text-opacity, 1)); +} + +.hover\:text-gray-500:hover { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity, 1)); +} + +.hover\:text-gray-600:hover { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity, 1)); +} + +.hover\:text-gray-700:hover { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity, 1)); +} + +.hover\:text-gray-800:hover { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity, 1)); +} + +.hover\:text-gray-900:hover { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity, 1)); +} + +.hover\:text-green-200:hover { + --tw-text-opacity: 1; + color: rgb(187 247 208 / var(--tw-text-opacity, 1)); +} + +.hover\:text-green-50:hover { + --tw-text-opacity: 1; + color: rgb(240 253 244 / var(--tw-text-opacity, 1)); +} + +.hover\:text-green-600:hover { + --tw-text-opacity: 1; + color: rgb(22 163 74 / var(--tw-text-opacity, 1)); +} + +.hover\:text-green-700:hover { + --tw-text-opacity: 1; + color: rgb(21 128 61 / var(--tw-text-opacity, 1)); +} + +.hover\:text-green-800:hover { + --tw-text-opacity: 1; + color: rgb(22 101 52 / var(--tw-text-opacity, 1)); +} + +.hover\:text-indigo-50\/30:hover { + color: rgb(238 242 255 / 0.3); +} + +.hover\:text-red-200:hover { + --tw-text-opacity: 1; + color: rgb(254 202 202 / var(--tw-text-opacity, 1)); +} + +.hover\:text-red-50:hover { + --tw-text-opacity: 1; + color: rgb(254 242 242 / var(--tw-text-opacity, 1)); +} + +.hover\:text-red-600:hover { + --tw-text-opacity: 1; + color: rgb(220 38 38 / var(--tw-text-opacity, 1)); +} + +.hover\:text-red-700:hover { + --tw-text-opacity: 1; + color: rgb(185 28 28 / var(--tw-text-opacity, 1)); +} + +.hover\:text-red-800:hover { + --tw-text-opacity: 1; + color: rgb(153 27 27 / var(--tw-text-opacity, 1)); +} + +.hover\:text-slate-100:hover { + --tw-text-opacity: 1; + color: rgb(241 245 249 / var(--tw-text-opacity, 1)); +} + +.hover\:text-slate-200:hover { + --tw-text-opacity: 1; + color: rgb(226 232 240 / var(--tw-text-opacity, 1)); +} + +.hover\:text-slate-300:hover { + --tw-text-opacity: 1; + color: rgb(203 213 225 / var(--tw-text-opacity, 1)); +} + +.hover\:text-slate-400:hover { + --tw-text-opacity: 1; + color: rgb(148 163 184 / var(--tw-text-opacity, 1)); +} + +.hover\:text-slate-500:hover { + --tw-text-opacity: 1; + color: rgb(100 116 139 / var(--tw-text-opacity, 1)); +} + +.hover\:text-slate-600:hover { + --tw-text-opacity: 1; + color: rgb(71 85 105 / var(--tw-text-opacity, 1)); +} + +.hover\:text-slate-700:hover { + --tw-text-opacity: 1; + color: rgb(51 65 85 / var(--tw-text-opacity, 1)); +} + +.hover\:text-slate-700\/30:hover { + color: rgb(51 65 85 / 0.3); +} + +.hover\:text-slate-800:hover { + --tw-text-opacity: 1; + color: rgb(30 41 59 / var(--tw-text-opacity, 1)); +} + +.hover\:text-slate-800\/50:hover { + color: rgb(30 41 59 / 0.5); +} + +.hover\:text-slate-900:hover { + --tw-text-opacity: 1; + color: rgb(15 23 42 / var(--tw-text-opacity, 1)); +} + +.hover\:text-violet-100:hover { + --tw-text-opacity: 1; + color: rgb(237 233 254 / var(--tw-text-opacity, 1)); +} + +.hover\:text-violet-700:hover { + --tw-text-opacity: 1; + color: rgb(109 40 217 / var(--tw-text-opacity, 1)); +} + +.hover\:text-violet-800:hover { + --tw-text-opacity: 1; + color: rgb(91 33 182 / var(--tw-text-opacity, 1)); +} + +.hover\:text-yellow-50:hover { + --tw-text-opacity: 1; + color: rgb(254 252 232 / var(--tw-text-opacity, 1)); +} + +.hover\:text-yellow-600:hover { + --tw-text-opacity: 1; + color: rgb(202 138 4 / var(--tw-text-opacity, 1)); +} + +.hover\:text-yellow-800:hover { + --tw-text-opacity: 1; + color: rgb(133 77 14 / var(--tw-text-opacity, 1)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.hover\:opacity-100:hover { + opacity: 1; +} + +.hover\:opacity-90:hover { + opacity: 0.9; +} + +.hover\:shadow-sm:hover { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.hover\:ring-2:hover { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.hover\:ring-blue-300:hover { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity, 1)); +} + +.hover\:ring-blue-400\/60:hover { + --tw-ring-color: rgb(96 165 250 / 0.6); +} + +.hover\:ring-emerald-400\/70:hover { + --tw-ring-color: rgb(52 211 153 / 0.7); +} + +.hover\:ring-offset-1:hover { + --tw-ring-offset-width: 1px; +} + +.focus\:border-amber-100:focus { + --tw-border-opacity: 1; + border-color: rgb(254 243 199 / var(--tw-border-opacity, 1)); +} + +.focus\:border-amber-200:focus { + --tw-border-opacity: 1; + border-color: rgb(253 230 138 / var(--tw-border-opacity, 1)); +} + +.focus\:border-amber-50:focus { + --tw-border-opacity: 1; + border-color: rgb(255 251 235 / var(--tw-border-opacity, 1)); +} + +.focus\:border-amber-500:focus { + --tw-border-opacity: 1; + border-color: rgb(245 158 11 / var(--tw-border-opacity, 1)); +} + +.focus\:border-amber-800:focus { + --tw-border-opacity: 1; + border-color: rgb(146 64 14 / var(--tw-border-opacity, 1)); +} + +.focus\:border-blue-100:focus { + --tw-border-opacity: 1; + border-color: rgb(219 234 254 / var(--tw-border-opacity, 1)); +} + +.focus\:border-blue-200:focus { + --tw-border-opacity: 1; + border-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); +} + +.focus\:border-blue-400:focus { + --tw-border-opacity: 1; + border-color: rgb(96 165 250 / var(--tw-border-opacity, 1)); +} + +.focus\:border-blue-50:focus { + --tw-border-opacity: 1; + border-color: rgb(239 246 255 / var(--tw-border-opacity, 1)); +} + +.focus\:border-blue-500:focus { + --tw-border-opacity: 1; + border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.focus\:border-blue-600:focus { + --tw-border-opacity: 1; + border-color: rgb(37 99 235 / var(--tw-border-opacity, 1)); +} + +.focus\:border-blue-600\/30:focus { + border-color: rgb(37 99 235 / 0.3); +} + +.focus\:border-blue-700:focus { + --tw-border-opacity: 1; + border-color: rgb(29 78 216 / var(--tw-border-opacity, 1)); +} + +.focus\:border-emerald-200:focus { + --tw-border-opacity: 1; + border-color: rgb(167 243 208 / var(--tw-border-opacity, 1)); +} + +.focus\:border-emerald-50:focus { + --tw-border-opacity: 1; + border-color: rgb(236 253 245 / var(--tw-border-opacity, 1)); +} + +.focus\:border-emerald-500:focus { + --tw-border-opacity: 1; + border-color: rgb(16 185 129 / var(--tw-border-opacity, 1)); +} + +.focus\:border-emerald-700:focus { + --tw-border-opacity: 1; + border-color: rgb(4 120 87 / var(--tw-border-opacity, 1)); +} + +.focus\:border-gray-100:focus { + --tw-border-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-border-opacity, 1)); +} + +.focus\:border-gray-200:focus { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); +} + +.focus\:border-gray-400:focus { + --tw-border-opacity: 1; + border-color: rgb(156 163 175 / var(--tw-border-opacity, 1)); +} + +.focus\:border-gray-50:focus { + --tw-border-opacity: 1; + border-color: rgb(249 250 251 / var(--tw-border-opacity, 1)); +} + +.focus\:border-gray-500:focus { + --tw-border-opacity: 1; + border-color: rgb(107 114 128 / var(--tw-border-opacity, 1)); +} + +.focus\:border-gray-600:focus { + --tw-border-opacity: 1; + border-color: rgb(75 85 99 / var(--tw-border-opacity, 1)); +} + +.focus\:border-gray-700:focus { + --tw-border-opacity: 1; + border-color: rgb(55 65 81 / var(--tw-border-opacity, 1)); +} + +.focus\:border-gray-800:focus { + --tw-border-opacity: 1; + border-color: rgb(31 41 55 / var(--tw-border-opacity, 1)); +} + +.focus\:border-gray-900:focus { + --tw-border-opacity: 1; + border-color: rgb(17 24 39 / var(--tw-border-opacity, 1)); +} + +.focus\:border-green-200:focus { + --tw-border-opacity: 1; + border-color: rgb(187 247 208 / var(--tw-border-opacity, 1)); +} + +.focus\:border-green-50:focus { + --tw-border-opacity: 1; + border-color: rgb(240 253 244 / var(--tw-border-opacity, 1)); +} + +.focus\:border-green-600:focus { + --tw-border-opacity: 1; + border-color: rgb(22 163 74 / var(--tw-border-opacity, 1)); +} + +.focus\:border-green-700:focus { + --tw-border-opacity: 1; + border-color: rgb(21 128 61 / var(--tw-border-opacity, 1)); +} + +.focus\:border-green-800:focus { + --tw-border-opacity: 1; + border-color: rgb(22 101 52 / var(--tw-border-opacity, 1)); +} + +.focus\:border-indigo-50\/30:focus { + border-color: rgb(238 242 255 / 0.3); +} + +.focus\:border-red-200:focus { + --tw-border-opacity: 1; + border-color: rgb(254 202 202 / var(--tw-border-opacity, 1)); +} + +.focus\:border-red-50:focus { + --tw-border-opacity: 1; + border-color: rgb(254 242 242 / var(--tw-border-opacity, 1)); +} + +.focus\:border-red-600:focus { + --tw-border-opacity: 1; + border-color: rgb(220 38 38 / var(--tw-border-opacity, 1)); +} + +.focus\:border-red-700:focus { + --tw-border-opacity: 1; + border-color: rgb(185 28 28 / var(--tw-border-opacity, 1)); +} + +.focus\:border-red-800:focus { + --tw-border-opacity: 1; + border-color: rgb(153 27 27 / var(--tw-border-opacity, 1)); +} + +.focus\:border-slate-100:focus { + --tw-border-opacity: 1; + border-color: rgb(241 245 249 / var(--tw-border-opacity, 1)); +} + +.focus\:border-slate-300:focus { + --tw-border-opacity: 1; + border-color: rgb(203 213 225 / var(--tw-border-opacity, 1)); +} + +.focus\:border-slate-400:focus { + --tw-border-opacity: 1; + border-color: rgb(148 163 184 / var(--tw-border-opacity, 1)); +} + +.focus\:border-slate-500:focus { + --tw-border-opacity: 1; + border-color: rgb(100 116 139 / var(--tw-border-opacity, 1)); +} + +.focus\:border-slate-600:focus { + --tw-border-opacity: 1; + border-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); +} + +.focus\:border-slate-700:focus { + --tw-border-opacity: 1; + border-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); +} + +.focus\:border-slate-700\/30:focus { + border-color: rgb(51 65 85 / 0.3); +} + +.focus\:border-slate-800:focus { + --tw-border-opacity: 1; + border-color: rgb(30 41 59 / var(--tw-border-opacity, 1)); +} + +.focus\:border-slate-800\/50:focus { + border-color: rgb(30 41 59 / 0.5); +} + +.focus\:border-slate-900:focus { + --tw-border-opacity: 1; + border-color: rgb(15 23 42 / var(--tw-border-opacity, 1)); +} + +.focus\:border-violet-100:focus { + --tw-border-opacity: 1; + border-color: rgb(237 233 254 / var(--tw-border-opacity, 1)); +} + +.focus\:border-violet-700:focus { + --tw-border-opacity: 1; + border-color: rgb(109 40 217 / var(--tw-border-opacity, 1)); +} + +.focus\:border-violet-800:focus { + --tw-border-opacity: 1; + border-color: rgb(91 33 182 / var(--tw-border-opacity, 1)); +} + +.focus\:border-yellow-50:focus { + --tw-border-opacity: 1; + border-color: rgb(254 252 232 / var(--tw-border-opacity, 1)); +} + +.focus\:border-yellow-600:focus { + --tw-border-opacity: 1; + border-color: rgb(202 138 4 / var(--tw-border-opacity, 1)); +} + +.focus\:border-yellow-800:focus { + --tw-border-opacity: 1; + border-color: rgb(133 77 14 / var(--tw-border-opacity, 1)); +} + +.focus\:bg-gray-100:focus { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring-0:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-blue-400:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1)); +} + +.focus\:ring-blue-500:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1)); +} + +.focus\:ring-blue-500\/30:focus { + --tw-ring-color: rgb(59 130 246 / 0.3); +} + +.focus\:ring-offset-2:focus { + --tw-ring-offset-width: 2px; +} + +.focus\:ring-offset-amber-100:focus { + --tw-ring-offset-color: #fef3c7; +} + +.focus\:ring-offset-amber-200:focus { + --tw-ring-offset-color: #fde68a; +} + +.focus\:ring-offset-amber-50:focus { + --tw-ring-offset-color: #fffbeb; +} + +.focus\:ring-offset-amber-500:focus { + --tw-ring-offset-color: #f59e0b; +} + +.focus\:ring-offset-amber-800:focus { + --tw-ring-offset-color: #92400e; +} + +.focus\:ring-offset-blue-100:focus { + --tw-ring-offset-color: #dbeafe; +} + +.focus\:ring-offset-blue-200:focus { + --tw-ring-offset-color: #bfdbfe; +} + +.focus\:ring-offset-blue-400:focus { + --tw-ring-offset-color: #60a5fa; +} + +.focus\:ring-offset-blue-50:focus { + --tw-ring-offset-color: #eff6ff; +} + +.focus\:ring-offset-blue-500:focus { + --tw-ring-offset-color: #3b82f6; +} + +.focus\:ring-offset-blue-600:focus { + --tw-ring-offset-color: #2563eb; +} + +.focus\:ring-offset-blue-600\/30:focus { + --tw-ring-offset-color: rgb(37 99 235 / 0.3); +} + +.focus\:ring-offset-blue-700:focus { + --tw-ring-offset-color: #1d4ed8; +} + +.focus\:ring-offset-emerald-200:focus { + --tw-ring-offset-color: #a7f3d0; +} + +.focus\:ring-offset-emerald-50:focus { + --tw-ring-offset-color: #ecfdf5; +} + +.focus\:ring-offset-emerald-500:focus { + --tw-ring-offset-color: #10b981; +} + +.focus\:ring-offset-emerald-700:focus { + --tw-ring-offset-color: #047857; +} + +.focus\:ring-offset-gray-100:focus { + --tw-ring-offset-color: #f3f4f6; +} + +.focus\:ring-offset-gray-200:focus { + --tw-ring-offset-color: #e5e7eb; +} + +.focus\:ring-offset-gray-400:focus { + --tw-ring-offset-color: #9ca3af; +} + +.focus\:ring-offset-gray-50:focus { + --tw-ring-offset-color: #f9fafb; +} + +.focus\:ring-offset-gray-500:focus { + --tw-ring-offset-color: #6b7280; +} + +.focus\:ring-offset-gray-600:focus { + --tw-ring-offset-color: #4b5563; +} + +.focus\:ring-offset-gray-700:focus { + --tw-ring-offset-color: #374151; +} + +.focus\:ring-offset-gray-800:focus { + --tw-ring-offset-color: #1f2937; +} + +.focus\:ring-offset-gray-900:focus { + --tw-ring-offset-color: #111827; +} + +.focus\:ring-offset-green-200:focus { + --tw-ring-offset-color: #bbf7d0; +} + +.focus\:ring-offset-green-50:focus { + --tw-ring-offset-color: #f0fdf4; +} + +.focus\:ring-offset-green-600:focus { + --tw-ring-offset-color: #16a34a; +} + +.focus\:ring-offset-green-700:focus { + --tw-ring-offset-color: #15803d; +} + +.focus\:ring-offset-green-800:focus { + --tw-ring-offset-color: #166534; +} + +.focus\:ring-offset-indigo-50\/30:focus { + --tw-ring-offset-color: rgb(238 242 255 / 0.3); +} + +.focus\:ring-offset-red-200:focus { + --tw-ring-offset-color: #fecaca; +} + +.focus\:ring-offset-red-50:focus { + --tw-ring-offset-color: #fef2f2; +} + +.focus\:ring-offset-red-600:focus { + --tw-ring-offset-color: #dc2626; +} + +.focus\:ring-offset-red-700:focus { + --tw-ring-offset-color: #b91c1c; +} + +.focus\:ring-offset-red-800:focus { + --tw-ring-offset-color: #991b1b; +} + +.focus\:ring-offset-slate-100:focus { + --tw-ring-offset-color: #f1f5f9; +} + +.focus\:ring-offset-slate-300:focus { + --tw-ring-offset-color: #cbd5e1; +} + +.focus\:ring-offset-slate-400:focus { + --tw-ring-offset-color: #94a3b8; +} + +.focus\:ring-offset-slate-500:focus { + --tw-ring-offset-color: #64748b; +} + +.focus\:ring-offset-slate-600:focus { + --tw-ring-offset-color: #475569; +} + +.focus\:ring-offset-slate-700:focus { + --tw-ring-offset-color: #334155; +} + +.focus\:ring-offset-slate-700\/30:focus { + --tw-ring-offset-color: rgb(51 65 85 / 0.3); +} + +.focus\:ring-offset-slate-800:focus { + --tw-ring-offset-color: #1e293b; +} + +.focus\:ring-offset-slate-800\/50:focus { + --tw-ring-offset-color: rgb(30 41 59 / 0.5); +} + +.focus\:ring-offset-slate-900:focus { + --tw-ring-offset-color: #0f172a; +} + +.focus\:ring-offset-violet-100:focus { + --tw-ring-offset-color: #ede9fe; +} + +.focus\:ring-offset-violet-700:focus { + --tw-ring-offset-color: #6d28d9; +} + +.focus\:ring-offset-violet-800:focus { + --tw-ring-offset-color: #5b21b6; +} + +.focus\:ring-offset-yellow-50:focus { + --tw-ring-offset-color: #fefce8; +} + +.focus\:ring-offset-yellow-600:focus { + --tw-ring-offset-color: #ca8a04; +} + +.focus\:ring-offset-yellow-800:focus { + --tw-ring-offset-color: #854d0e; +} + +.active\:bg-gray-200:active { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); +} + +.disabled\:pointer-events-none:disabled { + pointer-events: none; +} + +.disabled\:cursor-default:disabled { + cursor: default; +} + +.disabled\:opacity-40:disabled { + opacity: 0.4; +} + +.disabled\:opacity-50:disabled { + opacity: 0.5; +} + +.group:hover .group-hover\:bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1)); +} + +.group:hover .group-hover\:opacity-100 { + opacity: 1; +} + +.group:active .group-active\:bg-gray-500 { + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1)); +} + +@media (min-width: 640px) { + .sm\:col-span-2 { + grid-column: span 2 / span 2; + } + + .sm\:ml-auto { + margin-left: auto; + } + + .sm\:inline { + display: inline; + } + + .sm\:flex { + display: flex; + } + + .sm\:max-w-5xl { + max-width: 64rem; + } + + .sm\:max-w-md { + max-width: 28rem; + } + + .sm\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .sm\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .sm\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .sm\:grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .sm\:items-center { + align-items: center; + } + + .sm\:rounded-xl { + border-radius: 0.75rem; + } + + .sm\:p-4 { + padding: 1rem; + } + + .sm\:p-6 { + padding: 1.5rem; + } + + .sm\:p-8 { + padding: 2rem; + } + + .sm\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + .sm\:py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; + } +} + +@media (min-width: 768px) { + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} + +@media (min-width: 1024px) { + .lg\:col-span-4 { + grid-column: span 4 / span 4; + } + + .lg\:col-span-5 { + grid-column: span 5 / span 5; + } + + .lg\:col-span-7 { + grid-column: span 7 / span 7; + } + + .lg\:col-span-8 { + grid-column: span 8 / span 8; + } + + .lg\:grid-cols-12 { + grid-template-columns: repeat(12, minmax(0, 1fr)); + } + + .lg\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .lg\:grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } +} + +@media (min-width: 1280px) { + .xl\:col-span-2 { + grid-column: span 2 / span 2; + } + + .xl\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .xl\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .xl\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} + +@media (min-width: 1536px) { + .\32xl\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} diff --git a/python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js b/python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js new file mode 100644 index 00000000..ad0206c2 --- /dev/null +++ b/python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js @@ -0,0 +1,5 @@ +function lt(u,t,e,n){if(n==="style"){u.style.setProperty(t,e);return}if(n){u.setAttributeNS(n,t,e);return}switch(t){case"value":u.tagName==="OPTION"?Y(u,t,e):u.value!==e&&(u.value=e);break;case"initial_value":u.defaultValue=e;break;case"checked":u.checked=S(e);break;case"initial_checked":u.defaultChecked=S(e);break;case"selected":u.selected=S(e);break;case"initial_selected":u.defaultSelected=S(e);break;case"dangerous_inner_html":u.innerHTML=e;break;case"style":let r={};for(let i=0;i{for(let n of e)this.handleResizeEvent(n)})),this.resizeObserver.observe(t)}removeResizeObserver(t){this.resizeObserver&&this.resizeObserver.unobserve(t)}handleIntersectionEvent(t){let e=t.target,n=new CustomEvent("visible",{bubbles:!1,detail:t});e.dispatchEvent(n)}createIntersectionObserver(t){this.intersectionObserver||(this.intersectionObserver=new IntersectionObserver(e=>{for(let n of e)this.handleIntersectionEvent(n)})),this.intersectionObserver.observe(t)}removeIntersectionObserver(t){this.intersectionObserver&&this.intersectionObserver.unobserve(t)}createListener(t,e,n){if(t=="resize"?this.createResizeObserver(e):t=="visible"&&this.createIntersectionObserver(e),n)this.global[t]===void 0?(this.global[t]={active:1,callback:this.handler},this.root.addEventListener(t,this.handler)):this.global[t].active++;else{let r=e.getAttribute("data-dioxus-id");this.local[r]||(this.local[r]={}),e.addEventListener(t,this.handler)}}removeListener(t,e,n){e=="resize"?this.removeResizeObserver(t):e=="visible"?this.removeIntersectionObserver(t):n?this.removeBubblingListener(e):this.removeNonBubblingListener(t,e)}removeBubblingListener(t){this.global[t].active--,this.global[t].active===0&&(this.root.removeEventListener(t,this.global[t].callback),delete this.global[t])}removeNonBubblingListener(t,e){let n=t.getAttribute("data-dioxus-id");delete this.local[n][e],Object.keys(this.local[n]).length===0&&delete this.local[n],t.removeEventListener(e,this.handler)}removeAllNonBubblingListeners(t){let e=t.getAttribute("data-dioxus-id");delete this.local[e]}getNode(t){return this.nodes[t]}pushRoot(t){this.stack.push(t)}appendChildren(t,e){let n=this.nodes[t],r=this.stack.splice(this.stack.length-e);for(let i=0;i0;i--)n=n.nextSibling}return n}saveTemplate(t,e){this.templates[e]=t}hydrate_node(t,e){let n=t.getAttribute("data-node-hydration").split(","),r=e[parseInt(n[0])];if(this.nodes[r]=t,n.length>1){t.listening=n.length-1,t.setAttribute("data-dioxus-id",r.toString());for(let i=1;ii.nextNode()?i.currentNode!==a:!1;for(;i.currentNode;){let p=i.currentNode;if(p.nodeType===Node.COMMENT_NODE){let y=p.textContent,A=y.split("placeholder");if(A.length>1){if(this.nodes[t[parseInt(A[1])]]=p,!w())break;continue}let et=y.split("node-id");if(et.length>1){let x=p.nextSibling;p.remove();let z,B;if(x.nodeType===Node.COMMENT_NODE){let bt=x.parentElement.insertBefore(document.createTextNode(""),x);z=x,B=bt}else B=x,z=B.nextSibling;i.currentNode=z,this.nodes[t[parseInt(et[1])]]=B;let ft=p===r||!w();if(z.remove(),ft)break;continue}}if(!w())break}}}setAttributeInner(t,e,n,r){lt(t,e,n,r)}};var I,T,v,M,F,U=class extends Z{constructor(t){super(),this.d=t,this.m=null,this.p=null,this.ls=null,this.t=null,this.op=null,this.e=null,this.z=null,this.metaflags=null,this.u16buf=null,this.u16bufp=null,this.u32buf=null,this.u32bufp=null,this.u8buf=null,this.u8bufp=null,this.attr=[],this.attr_cache_hit=null,this.attr_cache_idx,this.get_attr=function(){return this.attr_cache_idx=this.u8buf[this.u8bufp++],this.attr_cache_idx&128?(this.attr_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.attr[this.attr_cache_idx&4294967167]=this.attr_cache_hit,this.attr_cache_hit):this.attr[this.attr_cache_idx&4294967167]},this.el=[],this.el_cache_hit=null,this.el_cache_idx,this.get_el=function(){return this.el_cache_idx=this.u8buf[this.u8bufp++],this.el_cache_idx&128?(this.el_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.el[this.el_cache_idx&4294967167]=this.el_cache_hit,this.el_cache_hit):this.el[this.el_cache_idx&4294967167]},this.evt=[],this.evt_cache_hit=null,this.evt_cache_idx,this.get_evt=function(){return this.evt_cache_idx=this.u8buf[this.u8bufp++],this.evt_cache_idx&128?(this.evt_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.evt[this.evt_cache_idx&4294967167]=this.evt_cache_hit,this.evt_cache_hit):this.evt[this.evt_cache_idx&4294967167]},this.namespace=[],this.namespace_cache_hit=null,this.namespace_cache_idx,this.get_namespace=function(){return this.namespace_cache_idx=this.u8buf[this.u8bufp++],this.namespace_cache_idx&128?(this.namespace_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.namespace[this.namespace_cache_idx&4294967167]=this.namespace_cache_hit,this.namespace_cache_hit):this.namespace[this.namespace_cache_idx&4294967167]},this.ns_cache=[],this.ns_cache_cache_hit=null,this.ns_cache_cache_idx,this.get_ns_cache=function(){return this.ns_cache_cache_idx=this.u8buf[this.u8bufp++],this.ns_cache_cache_idx&128?(this.ns_cache_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.ns_cache[this.ns_cache_cache_idx&4294967167]=this.ns_cache_cache_hit,this.ns_cache_cache_hit):this.ns_cache[this.ns_cache_cache_idx&4294967167]},this.s="",this.lsp=null,this.sp=null,this.sl=null,this.c=new TextDecoder}update_memory(t){this.m=new DataView(t.buffer)}run(){if(this.metaflags=this.m.getUint32(this.d,!0),this.metaflags>>>6&1&&(this.ls=this.m.getUint32(this.d+24,!0)),this.p=this.ls,this.metaflags>>>4&1&&(this.t=this.m.getUint32(this.d+16,!0),this.u16buf=new Uint16Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%2)/2)),this.u16bufp=0,this.metaflags>>>3&1&&(this.t=this.m.getUint32(this.d+12,!0),this.u32buf=new Uint32Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%4)/4)),this.u32bufp=0,this.metaflags>>>5&1&&(this.t=this.m.getUint32(this.d+20,!0),this.u8buf=new Uint8Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%1)/1)),this.u8bufp=0,this.metaflags&1&&(this.lsp=this.m.getUint32(this.d+4,!0)),this.metaflags>>>2&1)if(this.sl=this.m.getUint32(this.d+8,!0),this.metaflags>>>1&1){for(this.sp=this.lsp,this.s="",this.e=this.sp+(this.sl/4|0)*4;this.sp>8,(this.t&16711680)>>16,this.t>>24),this.sp+=4;for(;this.sp{this.handler(r,n,I)});break;case 25:this.nodes[this.u32buf[this.u32bufp++]]=this.loadChild((()=>{this.e=this.u8bufp+this.u32buf[this.u32bufp++];let r=this.u8buf.slice(this.u8bufp,this.e);return this.u8bufp=this.e,r})());break;case 26:{let r=this.stack.splice(this.stack.length-this.u16buf[this.u16bufp++]);this.loadChild((()=>{this.e=this.u8bufp+this.u32buf[this.u32bufp++];let a=this.u8buf.slice(this.u8bufp,this.e);return this.u8bufp=this.e,a})()).replaceWith(...r)}break;case 27:return!0}this.op>>>=8}}run_from_bytes(t){this.d=0,this.update_memory(new Uint8Array(t)),this.run()}};function nt(u,t,e,n){if(n==="style"){u.style.setProperty(t,e);return}if(n){u.setAttributeNS(n,t,e);return}switch(t){case"value":u.tagName==="OPTION"?V(u,t,e):u.value!==e&&(u.value=e);break;case"initial_value":u.defaultValue=e;break;case"checked":u.checked=N(e);break;case"initial_checked":u.defaultChecked=N(e);break;case"selected":u.selected=N(e);break;case"initial_selected":u.defaultSelected=N(e);break;case"dangerous_inner_html":u.innerHTML=e;break;case"style":let r={};for(let i=0;i0){this.waiting.shift()(t);return}this.pending.push(t)}async recv(){return new Promise((t,e)=>{if(this.pending.length>0){t(this.pending.shift());return}this.waiting.push(t)})}},D=class{inner;constructor(t){this.inner=new WeakRef(t)}rustSend(t){let e=this.inner.deref();e&&e.rustSend(t)}async rustRecv(){let t=this.inner.deref();if(t)return await t.rustRecv()}},$=class{weak(){return new D(this)}};globalThis.__nextChannelId=0;globalThis.__channels=[];var W=class extends ${js_to_rust;rust_to_js;owner;id;constructor(t){super(),this.owner=t,this.js_to_rust=new j,this.rust_to_js=new j,this.id=globalThis.__nextChannelId,globalThis.__channels[this.id]=this,globalThis.__nextChannelId+=1}weak(){return new D(this)}async recv(){return await this.rust_to_js.recv()}send(t){this.js_to_rust.send(t)}rustSend(t){this.rust_to_js.send(t)}async rustRecv(){return await this.js_to_rust.recv()}close(){globalThis.__channels[this.id]=null}};function st(){return window.__PROBING_BASE_PATH__||""}var K=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Rt.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingbytesource_free(t,0)}get autoAllocateChunkSize(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingbytesource_autoAllocateChunkSize(this.__wbg_ptr)>>>0}cancel(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();o(t),c.intounderlyingbytesource_cancel(t)}pull(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingbytesource_pull(this.__wbg_ptr,t)}start(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");o(this.__wbg_ptr),c.intounderlyingbytesource_start(this.__wbg_ptr,t)}get type(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");o(this.__wbg_ptr);let t=c.intounderlyingbytesource_type(this.__wbg_ptr);return At[t]}};Symbol.dispose&&(K.prototype[Symbol.dispose]=K.prototype.free);var q=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Ot.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingsink_free(t,0)}abort(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let e=this.__destroy_into_raw();return o(e),c.intounderlyingsink_abort(e,t)}close(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();return o(t),c.intounderlyingsink_close(t)}write(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingsink_write(this.__wbg_ptr,t)}};Symbol.dispose&&(q.prototype[Symbol.dispose]=q.prototype.free);var H=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Ct.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingsource_free(t,0)}cancel(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();o(t),c.intounderlyingsource_cancel(t)}pull(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingsource_pull(this.__wbg_ptr,t)}};Symbol.dispose&&(H.prototype[Symbol.dispose]=H.prototype.free);var L=class u{constructor(){throw new Error("cannot invoke `new` directly")}static __wrap(t){let e=Object.create(u.prototype);return e.__wbg_ptr=t,ct.register(e,e.__wbg_ptr,e),e}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,ct.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_jsowner_free(t,0)}};Symbol.dispose&&(L.prototype[Symbol.dispose]=L.prototype.free);function tt(){return{__proto__:null,"./web_bg.js":{__proto__:null,__wbg_Error_92b29b0548f8b746:function(){return s(function(t,e){return Error(l(t,e))},arguments)},__wbg_String_8564e559799eccda:function(){return s(function(t,e){let n=String(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg___wbindgen_bigint_get_as_i64_d968e41184ae354f:function(t,e){let n=e,r=typeof n=="bigint"?n:void 0;g(r)||Lt(r),_().setBigInt64(t+8,g(r)?BigInt(0):r,!0),_().setInt32(t+0,!g(r),!0)},__wbg___wbindgen_boolean_get_fa956cfa2d1bd751:function(t){let e=t,n=typeof e=="boolean"?e:void 0;return g(n)||b(n),g(n)?16777215:n?1:0},__wbg___wbindgen_debug_string_c25d447a39f5578f:function(t,e){let n=Q(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},__wbg___wbindgen_in_aca499c5de7ff5e5:function(t,e){let n=t in e;return b(n),n},__wbg___wbindgen_is_bigint_2f76dc55065b4273:function(t){let e=typeof t=="bigint";return b(e),e},__wbg___wbindgen_is_function_1ff95bcc5517c252:function(t){let e=typeof t=="function";return b(e),e},__wbg___wbindgen_is_object_a27215656b807791:function(t){let e=t,n=typeof e=="object"&&e!==null;return b(n),n},__wbg___wbindgen_is_string_ea5e6cc2e4141dfe:function(t){let e=typeof t=="string";return b(e),e},__wbg___wbindgen_is_undefined_c05833b95a3cf397:function(t){let e=t===void 0;return b(e),e},__wbg___wbindgen_jsval_eq_e659fcf7b0e32763:function(t,e){let n=t===e;return b(n),n},__wbg___wbindgen_jsval_loose_eq_db4c3b15f63fc170:function(t,e){let n=t==e;return b(n),n},__wbg___wbindgen_memory_de265df8aadd6273:function(){return c.memory},__wbg___wbindgen_number_get_394265ed1e1b84ee:function(t,e){let n=e,r=typeof n=="number"?n:void 0;g(r)||o(r),_().setFloat64(t+8,g(r)?0:r,!0),_().setInt32(t+0,!g(r),!0)},__wbg___wbindgen_string_get_b0ca35b86a603356:function(t,e){let n=e,r=typeof n=="string"?n:void 0;var i=g(r)?0:h(r,c.__wbindgen_malloc,c.__wbindgen_realloc),a=d;_().setInt32(t+4,a,!0),_().setInt32(t+0,i,!0)},__wbg___wbindgen_throw_344f42d3211c4765:function(t,e){throw new Error(l(t,e))},__wbg__wbg_cb_unref_fffb441def202758:function(){return s(function(t){t._wbg_cb_unref()},arguments)},__wbg_abort_8bae0f33e7833997:function(){return s(function(t){t.abort()},arguments)},__wbg_abort_eee9248a6d680839:function(){return s(function(t,e){t.abort(e)},arguments)},__wbg_activeElement_4bc99dc1a7094c27:function(){return s(function(t){let e=t.activeElement;return g(e)?0:m(e)},arguments)},__wbg_addEventListener_d85450ee1320c989:function(){return f(function(t,e,n,r){t.addEventListener(l(e,n),r)},arguments)},__wbg_altKey_50f830d1793a2eea:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_altKey_c5e44fde6beb66ef:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_altKey_f3e24c4c9cfcf271:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_animationName_e80680fbfd3da8a2:function(){return s(function(t,e){let n=e.animationName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_appendChild_f553e8704c4f14a6:function(){return f(function(t,e){return t.appendChild(e)},arguments)},__wbg_append_01c74e5c6b58aa64:function(){return f(function(t,e,n,r,i){t.append(l(e,n),l(r,i))},arguments)},__wbg_append_58377ae3be2fb5ef:function(){return f(function(t,e,n,r,i,a){t.append(l(e,n),r,l(i,a))},arguments)},__wbg_append_8e24caa53c80c631:function(){return f(function(t,e,n,r,i){t.append(l(e,n),l(r,i))},arguments)},__wbg_append_91733ec40ee3b1f9:function(){return f(function(t,e,n,r){t.append(l(e,n),r)},arguments)},__wbg_arrayBuffer_3b637f0fa65c5351:function(){return f(function(t){return t.arrayBuffer()},arguments)},__wbg_arrayBuffer_a158e423a87ee756:function(){return s(function(t){return t.arrayBuffer()},arguments)},__wbg_back_939cbdbdfad8aff7:function(){return f(function(t){t.back()},arguments)},__wbg_blockSize_5af477b962b2b031:function(){return s(function(t){return t.blockSize},arguments)},__wbg_blur_e902dcc79406e89c:function(){return f(function(t){t.blur()},arguments)},__wbg_body_40ec34e0a2931fe8:function(){return s(function(t){let e=t.body;return g(e)?0:m(e)},arguments)},__wbg_borderBoxSize_ff7f5405dcc6554e:function(){return s(function(t){return t.borderBoxSize},arguments)},__wbg_boundingClientRect_0776888095b16b8c:function(){return s(function(t){return t.boundingClientRect},arguments)},__wbg_bubbles_07bec919f30033ab:function(){return s(function(t){let e=t.bubbles;return b(e),e},arguments)},__wbg_buffer_54b87055582c8a81:function(){return s(function(t){return t.buffer},arguments)},__wbg_button_f6a9a7b725f1838e:function(){return s(function(t){let e=t.button;return o(e),e},arguments)},__wbg_buttons_d8acd46cf8f40ae9:function(){return s(function(t){let e=t.buttons;return o(e),e},arguments)},__wbg_byobRequest_06b654bb15590436:function(){return s(function(t){let e=t.byobRequest;return g(e)?0:m(e)},arguments)},__wbg_byteLength_41862ca4020b9c43:function(){return s(function(t){let e=t.byteLength;return o(e),e},arguments)},__wbg_byteOffset_d42e18c4441f628b:function(){return s(function(t){let e=t.byteOffset;return o(e),e},arguments)},__wbg_call_8a2dd23819f8a60a:function(){return f(function(t,e){return t.call(e)},arguments)},__wbg_call_a6e5c5dce5018821:function(){return f(function(t,e,n){return t.call(e,n)},arguments)},__wbg_changedTouches_dbf6eeabddd3c2da:function(){return s(function(t){return t.changedTouches},arguments)},__wbg_charCodeAt_2a30bc7c17474cc6:function(){return s(function(t,e){return t.charCodeAt(e>>>0)},arguments)},__wbg_checkValidity_3a31dcce278f31a1:function(){return s(function(t){let e=t.checkValidity();return b(e),e},arguments)},__wbg_checked_596d0d7b35f55a01:function(){return s(function(t){let e=t.checked;return b(e),e},arguments)},__wbg_clearData_1297d08581746c08:function(){return f(function(t,e,n){t.clearData(l(e,n))},arguments)},__wbg_clearData_a7a19d854ec1a3b7:function(){return f(function(t){t.clearData()},arguments)},__wbg_clearInterval_16e8cbbce92291d0:function(){return s(function(t){return clearInterval(t)},arguments)},__wbg_clearTimeout_113b1cde814ec762:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clearTimeout_333bba87532ab9d3:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clearTimeout_6b8d9a38b9263d65:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clientHeight_994541cde34d3ca0:function(){return s(function(t){let e=t.clientHeight;return o(e),e},arguments)},__wbg_clientWidth_6852617da948be39:function(){return s(function(t){let e=t.clientWidth;return o(e),e},arguments)},__wbg_clientX_a7dcb4081126cd4b:function(){return s(function(t){let e=t.clientX;return o(e),e},arguments)},__wbg_clientX_c396b0fb11d601d3:function(){return s(function(t){let e=t.clientX;return o(e),e},arguments)},__wbg_clientY_a4650836fdf58f01:function(){return s(function(t){let e=t.clientY;return o(e),e},arguments)},__wbg_clientY_c0560910b20ee192:function(){return s(function(t){let e=t.clientY;return o(e),e},arguments)},__wbg_close_249a23304523681b:function(){return f(function(t){t.close()},arguments)},__wbg_close_72d318d9c16e83ef:function(){return f(function(t){t.close()},arguments)},__wbg_code_89c999e407c79eef:function(){return s(function(t,e){let n=e.code,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_contentBoxSize_74fbbc51859ff90e:function(){return s(function(t){return t.contentBoxSize},arguments)},__wbg_createComment_003419d0740789d4:function(){return s(function(t,e,n){return t.createComment(l(e,n))},arguments)},__wbg_createElementNS_013b3fb26f4796ec:function(){return f(function(t,e,n,r,i){return t.createElementNS(e===0?void 0:l(e,n),l(r,i))},arguments)},__wbg_createElement_fcbc0805de826d62:function(){return f(function(t,e,n){return t.createElement(l(e,n))},arguments)},__wbg_createObjectURL_416e527781e6fd6d:function(){return f(function(t,e){let n=URL.createObjectURL(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_createTextNode_4dad5b18435dda7c:function(){return s(function(t,e,n){return t.createTextNode(l(e,n))},arguments)},__wbg_ctrlKey_2e52816fa7160097:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_ctrlKey_50bd8324959ca786:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_ctrlKey_57171169eab54da6:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_dataTransfer_c1c4745cee7e05f1:function(){return s(function(t){let e=t.dataTransfer;return g(e)?0:m(e)},arguments)},__wbg_data_f994b1bb75d8337a:function(){return s(function(t,e){let n=e.data;var r=g(n)?0:h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_deltaMode_d869228efd74f393:function(){return s(function(t){let e=t.deltaMode;return o(e),e},arguments)},__wbg_deltaX_5d829ffba565ed10:function(){return s(function(t){return t.deltaX},arguments)},__wbg_deltaY_6cfce8f8da250c23:function(){return s(function(t){return t.deltaY},arguments)},__wbg_deltaZ_42c86f225c34aa04:function(){return s(function(t){return t.deltaZ},arguments)},__wbg_detail_a90dcd774780ebf6:function(){return s(function(t){return t.detail},arguments)},__wbg_documentElement_b7ec99417969bfbc:function(){return s(function(t){let e=t.documentElement;return g(e)?0:m(e)},arguments)},__wbg_document_179650d6cb13c263:function(){return s(function(t){let e=t.document;return g(e)?0:m(e)},arguments)},__wbg_done_89b2b13e91a60321:function(){return s(function(t){let e=t.done;return b(e),e},arguments)},__wbg_dropEffect_8187d3b019f3e6bd:function(){return s(function(t,e){let n=e.dropEffect,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_effectAllowed_ca2550f3a73fb833:function(){return s(function(t,e){let n=e.effectAllowed,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_elapsedTime_0330f570ff694c6f:function(){return s(function(t){return t.elapsedTime},arguments)},__wbg_elapsedTime_4c2a1fd1473438d6:function(){return s(function(t){return t.elapsedTime},arguments)},__wbg_enqueue_6d83b4c6281bafd6:function(){return f(function(t,e){t.enqueue(e)},arguments)},__wbg_entries_015dc610cd81ede0:function(){return s(function(t){return Object.entries(t)},arguments)},__wbg_entries_8ddbe5d352d85237:function(){return s(function(t){return t.entries()},arguments)},__wbg_entries_900cefd6f70eb290:function(){return s(function(t){return t.entries()},arguments)},__wbg_error_744744ff0c9861e6:function(){return s(function(t){console.error(t)},arguments)},__wbg_fetch_074561c3e313c86f:function(){return s(function(t){return fetch(t)},arguments)},__wbg_fetch_9dad4fe911207b37:function(){return s(function(t){return fetch(t)},arguments)},__wbg_fetch_b5951fc96f52f786:function(){return s(function(t,e){return t.fetch(e)},arguments)},__wbg_files_116196bc012ac3c8:function(){return s(function(t){let e=t.files;return g(e)?0:m(e)},arguments)},__wbg_files_a4eb87e5e4343c46:function(){return s(function(t){let e=t.files;return g(e)?0:m(e)},arguments)},__wbg_focus_2f77051f98540625:function(){return f(function(t){t.focus()},arguments)},__wbg_force_368c1897f399d783:function(){return s(function(t){return t.force},arguments)},__wbg_forward_4bb54c7f45451c64:function(){return f(function(t){t.forward()},arguments)},__wbg_getAsFile_adead4fd4f4ce592:function(){return f(function(t){let e=t.getAsFile();return g(e)?0:m(e)},arguments)},__wbg_getAttribute_5a601ba4718b922a:function(){return s(function(t,e,n,r){let i=e.getAttribute(l(n,r));var a=g(i)?0:h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,a,!0)},arguments)},__wbg_getBoundingClientRect_e828e6c31c66dea6:function(){return s(function(t){return t.getBoundingClientRect()},arguments)},__wbg_getData_fcb88fae21d94f1e:function(){return f(function(t,e,n,r){let i=e.getData(l(n,r)),a=h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,a,!0)},arguments)},__wbg_getElementById_1cbd8f06dbe8eb8e:function(){return s(function(t,e,n){let r=t.getElementById(l(e,n));return g(r)?0:m(r)},arguments)},__wbg_getHours_9f6561095682ce51:function(){return s(function(t){let e=t.getHours();return o(e),e},arguments)},__wbg_getItem_b96269ddc16cf24a:function(){return f(function(t,e,n,r){let i=e.getItem(l(n,r));var a=g(i)?0:h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,a,!0)},arguments)},__wbg_getMinutes_b0d5cd90bf9b8f22:function(){return s(function(t){let e=t.getMinutes();return o(e),e},arguments)},__wbg_getNode_2f3b1f608db7c9d0:function(){return s(function(t,e){return t.getNode(e>>>0)},arguments)},__wbg_getSeconds_40c565b3a6cb05fe:function(){return s(function(t){let e=t.getSeconds();return o(e),e},arguments)},__wbg_get_507a50627bffa49b:function(){return s(function(t,e){return t[e>>>0]},arguments)},__wbg_get_757c867e2520bbc4:function(){return s(function(t,e){let n=t[e>>>0];return g(n)?0:m(n)},arguments)},__wbg_get_78f252d074a84d0b:function(){return f(function(t,e){return Reflect.get(t,e)},arguments)},__wbg_get_base_path_39628b0b6ddfa96a:function(){return s(function(t){let e=st(),n=h(e,c.__wbindgen_malloc,c.__wbindgen_realloc),r=d;_().setInt32(t+4,r,!0),_().setInt32(t+0,n,!0)},arguments)},__wbg_get_c7eb1f358a7654df:function(){return f(function(t,e){return Reflect.get(t,e)},arguments)},__wbg_get_e73985d6689d2245:function(){return s(function(t,e){let n=t[e>>>0];return g(n)?0:m(n)},arguments)},__wbg_get_select_data_60af93fcbe2f391c:function(){return s(function(t,e){let n=rt(e),r=Mt(n,c.__wbindgen_malloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_get_unchecked_6e0ad6d2a41b06f6:function(){return s(function(t,e){return t[e>>>0]},arguments)},__wbg_has_8374cf06984d8bfc:function(){return f(function(t,e){let n=Reflect.has(t,e);return b(n),n},arguments)},__wbg_hash_508149c4291ec8c2:function(){return f(function(t,e){let n=e.hash,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_head_41a60f9034e0b41a:function(){return s(function(t){let e=t.head;return g(e)?0:m(e)},arguments)},__wbg_headers_cf9c80f30e2a4eff:function(){return s(function(t){return t.headers},arguments)},__wbg_height_6f29ab40ae50636d:function(){return s(function(t){let e=t.height;return o(e),e},arguments)},__wbg_height_96c07d9559d0200a:function(){return s(function(t){return t.height},arguments)},__wbg_height_9f27216001e3c804:function(){return s(function(t){return t.height},arguments)},__wbg_hidden_c08eb1c29c138ab0:function(){return s(function(t){let e=t.hidden;return b(e),e},arguments)},__wbg_history_e648b4314d9b256e:function(){return f(function(t){return t.history},arguments)},__wbg_identifier_d30bb260fab6b02a:function(){return s(function(t){let e=t.identifier;return o(e),e},arguments)},__wbg_initialize_169e37fbdd472b20:function(){return s(function(t,e,n){t.initialize(e,n)},arguments)},__wbg_inlineSize_3c8412828bef21eb:function(){return s(function(t){return t.inlineSize},arguments)},__wbg_instanceof_AnimationEvent_3a83c3d21fbd4d01:function(){return s(function(t){let e;try{e=t instanceof AnimationEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_ArrayBuffer_4480b9e0068a8adb:function(){return s(function(t){let e;try{e=t instanceof ArrayBuffer}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Blob_c6523f92a32c8695:function(){return s(function(t){let e;try{e=t instanceof Blob}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_CompositionEvent_6fef075df3b5dbf4:function(){return s(function(t){let e;try{e=t instanceof CompositionEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_CustomEvent_9b848ed45794fd3e:function(){return s(function(t){let e;try{e=t instanceof CustomEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Document_d1955f84f5d0351c:function(){return s(function(t){let e;try{e=t instanceof Document}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_DragEvent_7bd2cb4c087838f2:function(){return s(function(t){let e;try{e=t instanceof DragEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Element_beebfaab75d12d9d:function(){return s(function(t){let e;try{e=t instanceof Element}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Event_512f3841fa744d1e:function(){return s(function(t){let e;try{e=t instanceof Event}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_File_ee62de53bca2e697:function(){return s(function(t){let e;try{e=t instanceof File}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_FocusEvent_cadb56dad3dfd4ac:function(){return s(function(t){let e;try{e=t instanceof FocusEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlElement_4493a09212d3586f:function(){return s(function(t){let e;try{e=t instanceof HTMLElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlFormElement_ebf2bd35b418e93e:function(){return s(function(t){let e;try{e=t instanceof HTMLFormElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlInputElement_ad3be04339d0e4df:function(){return s(function(t){let e;try{e=t instanceof HTMLInputElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlSelectElement_b4698f847dc49da5:function(){return s(function(t){let e;try{e=t instanceof HTMLSelectElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlTextAreaElement_37795f65e16b7ed0:function(){return s(function(t){let e;try{e=t instanceof HTMLTextAreaElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_KeyboardEvent_be49f2d8e15d587a:function(){return s(function(t){let e;try{e=t instanceof KeyboardEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Map_e5b5e3db98422fcc:function(){return s(function(t){let e;try{e=t instanceof Map}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_MouseEvent_89eddfc6203c1749:function(){return s(function(t){let e;try{e=t instanceof MouseEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Node_d29e7ded486fd76a:function(){return s(function(t){let e;try{e=t instanceof Node}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_PointerEvent_8ef1feb51407c0ed:function(){return s(function(t){let e;try{e=t instanceof PointerEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Response_c8b64b2256f01bec:function(){return s(function(t){let e;try{e=t instanceof Response}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_TouchEvent_62e9e212135a784b:function(){return s(function(t){let e;try{e=t instanceof TouchEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_TransitionEvent_a1842850468877e4:function(){return s(function(t){let e;try{e=t instanceof TransitionEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Uint8Array_309b927aaf7a3fc7:function(){return s(function(t){let e;try{e=t instanceof Uint8Array}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_WheelEvent_8a8f43ee9318fcd4:function(){return s(function(t){let e;try{e=t instanceof WheelEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Window_05ba1ee4f6781663:function(){return s(function(t){let e;try{e=t instanceof Window}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_intersectionRatio_7c65292cc5ad712c:function(){return s(function(t){return t.intersectionRatio},arguments)},__wbg_intersectionRect_be1020a3be2ed245:function(){return s(function(t){return t.intersectionRect},arguments)},__wbg_isArray_0677c962b281d01a:function(){return s(function(t){let e=Array.isArray(t);return b(e),e},arguments)},__wbg_isComposing_919a0fdf6ac030c9:function(){return s(function(t){let e=t.isComposing;return b(e),e},arguments)},__wbg_isIntersecting_fc6d9529a49c5d62:function(){return s(function(t){let e=t.isIntersecting;return b(e),e},arguments)},__wbg_isPrimary_e59b27f91017e844:function(){return s(function(t){let e=t.isPrimary;return b(e),e},arguments)},__wbg_isSafeInteger_04f36e4056f1b851:function(){return s(function(t){let e=Number.isSafeInteger(t);return b(e),e},arguments)},__wbg_item_74998074fc497f92:function(){return s(function(t,e){let n=t.item(e>>>0);return g(n)?0:m(n)},arguments)},__wbg_items_350b6f2d566d3def:function(){return s(function(t){return t.items},arguments)},__wbg_iterator_6f722e4a93058b71:function(){return s(function(){return Symbol.iterator},arguments)},__wbg_key_803dca86cdcfa8dd:function(){return s(function(t,e){let n=e.key,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_kind_c494ca014c671a6f:function(){return s(function(t,e){let n=e.kind,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_lastModified_41250e8004d0f7ce:function(){return s(function(t){return t.lastModified},arguments)},__wbg_left_7e76a74d0db1754f:function(){return s(function(t){return t.left},arguments)},__wbg_length_02c64e687322fa34:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_1f0964f4a5e2c6d8:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_370319915dc99107:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_e08fc23135c66d6f:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_eea4bfa35e75c87c:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_ef21514bf74fe712:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_localStorage_5bf6ce3f8e51412a:function(){return f(function(t){let e=t.localStorage;return g(e)?0:m(e)},arguments)},__wbg_location_8f24df2c257fb974:function(){return s(function(t){let e=t.location;return o(e),e},arguments)},__wbg_location_c9a2271428996698:function(){return s(function(t){return t.location},arguments)},__wbg_log_0c201ade58bb55e1:function(){return s(function(t,e,n,r,i,a,w,p){let y,A;try{y=t,A=e,console.log(l(t,e),l(n,r),l(i,a),l(w,p))}finally{c.__wbindgen_free(y,A,1)}},arguments)},__wbg_log_ce2c4456b290c5e7:function(){return s(function(t,e){let n,r;try{n=t,r=e,console.log(l(t,e))}finally{c.__wbindgen_free(n,r,1)}},arguments)},__wbg_mark_b4d943f3bc2d2404:function(){return s(function(t,e){performance.mark(l(t,e))},arguments)},__wbg_measure_84362959e621a2c1:function(){return f(function(t,e,n,r){let i,a,w,p;try{i=t,a=e,w=n,p=r,performance.measure(l(t,e),l(n,r))}finally{c.__wbindgen_free(i,a,1),c.__wbindgen_free(w,p,1)}},arguments)},__wbg_metaKey_7a85debd51844822:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_metaKey_d961c7572a9f84f5:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_metaKey_f934f09e37889d70:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_name_14e920dc23fffd96:function(){return s(function(t,e){let n=e.name,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_name_d7d79f5466e37447:function(){return s(function(t,e){let n=e.name,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_new_0912d735e8fbc1d3:function(){return f(function(){return new FormData},arguments)},__wbg_new_0_3da9e97f24fc69be:function(){return s(function(){return new Date},arguments)},__wbg_new_0d809930cd1354c6:function(){return f(function(){return new Headers},arguments)},__wbg_new_22598f2b091dadf2:function(){return s(function(t){return new W(L.__wrap(t))},arguments)},__wbg_new_26bdcffba762c064:function(){return s(function(t){return new U(t>>>0)},arguments)},__wbg_new_32b398fb48b6d94a:function(){return s(function(){return new Array},arguments)},__wbg_new_41e6f99b2fd20423:function(){return f(function(){return new FileReader},arguments)},__wbg_new_4339b2a2675a03e3:function(){return f(function(){return new AbortController},arguments)},__wbg_new_7796ffc7ed656783:function(){return s(function(){return new Map},arguments)},__wbg_new_9792ad3275d1dd31:function(){return f(function(){return new DataTransfer},arguments)},__wbg_new_b667d279fd5aa943:function(){return s(function(t,e){return new Error(l(t,e))},arguments)},__wbg_new_cd45aabdf6073e84:function(){return s(function(t){return new Uint8Array(t)},arguments)},__wbg_new_da52cf8fe3429cb2:function(){return s(function(){return new Object},arguments)},__wbg_new_from_slice_77cdfb7977362f3c:function(){return s(function(t,e){return new Uint8Array(J(t,e))},arguments)},__wbg_new_typed_1824d93f294193e5:function(){return s(function(t,e){try{var n={a:t,b:e},r=(a,w)=>{let p=n.a;n.a=0;try{return It(p,n.b,a,w)}finally{n.a=p}};return new Promise(r)}finally{n.a=0}},arguments)},__wbg_new_with_args_200d82645b6544eb:function(){return s(function(t,e,n,r){return new Function(l(t,e),l(n,r))},arguments)},__wbg_new_with_byte_offset_and_length_54c7724ee3ec7d82:function(){return s(function(t,e,n){return new Uint8Array(t,e>>>0,n>>>0)},arguments)},__wbg_new_with_form_e4ca634e481666c7:function(){return f(function(t){return new FormData(t)},arguments)},__wbg_new_with_str_and_init_d95cbe11ce28e65e:function(){return f(function(t,e,n){return new Request(l(t,e),n)},arguments)},__wbg_new_with_str_sequence_and_options_9db076dc44ddbeb0:function(){return f(function(t,e){return new Blob(t,e)},arguments)},__wbg_new_with_u8_array_sequence_and_options_2c1900e5a5c93850:function(){return f(function(t,e){return new Blob(t,e)},arguments)},__wbg_next_6dbf2c0ac8cde20f:function(){return s(function(t){return t.next},arguments)},__wbg_next_71f2aa1cb3d1e37e:function(){return f(function(t){return t.next()},arguments)},__wbg_now_86c0d4ba3fa605b8:function(){return s(function(){return Date.now()},arguments)},__wbg_offsetX_fdc5eb20edabaadb:function(){return s(function(t){let e=t.offsetX;return o(e),e},arguments)},__wbg_offsetY_0a05e99022d21c5b:function(){return s(function(t){let e=t.offsetY;return o(e),e},arguments)},__wbg_open_221b279749ba2e4e:function(){return f(function(t,e,n,r,i){let a=t.open(l(e,n),l(r,i));return g(a)?0:m(a)},arguments)},__wbg_origin_ed66c06e67ad2049:function(){return f(function(t,e){let n=e.origin,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_ownerDocument_5a7a5473f8709b3e:function(){return s(function(t){let e=t.ownerDocument;return g(e)?0:m(e)},arguments)},__wbg_pageX_56e23ef1ade65aa7:function(){return s(function(t){let e=t.pageX;return o(e),e},arguments)},__wbg_pageX_9c5f057472795ea1:function(){return s(function(t){let e=t.pageX;return o(e),e},arguments)},__wbg_pageY_12d134258ad141c4:function(){return s(function(t){let e=t.pageY;return o(e),e},arguments)},__wbg_pageY_d421aa8cfce954d6:function(){return s(function(t){let e=t.pageY;return o(e),e},arguments)},__wbg_parentElement_5030754e30795652:function(){return s(function(t){let e=t.parentElement;return g(e)?0:m(e)},arguments)},__wbg_pathname_d27a358088ce7b2b:function(){return f(function(t,e){let n=e.pathname,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pointerId_ea33d2695be12e7f:function(){return s(function(t){let e=t.pointerId;return o(e),e},arguments)},__wbg_pointerType_d5e932608aa61bb6:function(){return s(function(t,e){let n=e.pointerType,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pressure_9a7845d9744ae9f4:function(){return s(function(t){return t.pressure},arguments)},__wbg_preventDefault_b64888c857500682:function(){return s(function(t){t.preventDefault()},arguments)},__wbg_propertyName_835d4a18e8327b10:function(){return s(function(t,e){let n=e.propertyName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_prototypesetcall_4770620bbe4688a0:function(){return s(function(t,e,n){Uint8Array.prototype.set.call(J(t,e),n)},arguments)},__wbg_pseudoElement_174adc902d41a1c1:function(){return s(function(t,e){let n=e.pseudoElement,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pseudoElement_6013088f8877903f:function(){return s(function(t,e){let n=e.pseudoElement,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pushState_3d01701623122bc8:function(){return f(function(t,e,n,r,i,a){t.pushState(e,l(n,r),i===0?void 0:l(i,a))},arguments)},__wbg_push_d2ae3af0c1217ae6:function(){return s(function(t,e){let n=t.push(e);return o(n),n},arguments)},__wbg_queueMicrotask_0ab5b2d2393e99b9:function(){return s(function(t){return t.queueMicrotask},arguments)},__wbg_queueMicrotask_6a09b7bc46549209:function(){return s(function(t){queueMicrotask(t)},arguments)},__wbg_radiusX_06f8dad66dfba7a4:function(){return s(function(t){let e=t.radiusX;return o(e),e},arguments)},__wbg_radiusY_0658ca1fd998f494:function(){return s(function(t){let e=t.radiusY;return o(e),e},arguments)},__wbg_readAsArrayBuffer_7db0a55c6c3a2b4e:function(){return f(function(t,e){t.readAsArrayBuffer(e)},arguments)},__wbg_readAsText_a8f6dfc210ba1a8e:function(){return f(function(t,e){t.readAsText(e)},arguments)},__wbg_removeAttribute_1e7d2c409776d836:function(){return f(function(t,e,n){t.removeAttribute(l(e,n))},arguments)},__wbg_removeEventListener_a3f23c70077bdcc1:function(){return f(function(t,e,n,r){t.removeEventListener(l(e,n),r)},arguments)},__wbg_removeItem_78e03a38da96e0ae:function(){return f(function(t,e,n){t.removeItem(l(e,n))},arguments)},__wbg_repeat_4e131e99bff9b9f4:function(){return s(function(t){let e=t.repeat;return b(e),e},arguments)},__wbg_replaceState_9a0a4a53d3bf3439:function(){return f(function(t,e,n,r,i,a){t.replaceState(e,l(n,r),i===0?void 0:l(i,a))},arguments)},__wbg_requestAnimationFrame_1a85deeab66448c2:function(){return f(function(t,e){let n=t.requestAnimationFrame(e);return o(n),n},arguments)},__wbg_resolve_2191a4dfe481c25b:function(){return s(function(t){return Promise.resolve(t)},arguments)},__wbg_respond_510e32df8aeb6817:function(){return f(function(t,e){t.respond(e>>>0)},arguments)},__wbg_result_53fd7283ffc3cdb8:function(){return f(function(t){return t.result},arguments)},__wbg_rootBounds_f45f30011740fdb2:function(){return s(function(t){let e=t.rootBounds;return g(e)?0:m(e)},arguments)},__wbg_rotationAngle_d0a0b686498034d7:function(){return s(function(t){return t.rotationAngle},arguments)},__wbg_run_9f0b5ec848bddc2d:function(){return s(function(t){t.run()},arguments)},__wbg_rustRecv_ce812a5965920185:function(){return s(function(t){return t.rustRecv()},arguments)},__wbg_rustSend_27a0ddfb6f0fa952:function(){return s(function(t,e){t.rustSend(e)},arguments)},__wbg_saveTemplate_4aa5c34bf8b14cc9:function(){return s(function(t,e,n,r){var i=zt(e,n).slice();c.__wbindgen_free(e,n*4,4),t.saveTemplate(i,r)},arguments)},__wbg_screenX_0a3f7a47942676bd:function(){return s(function(t){let e=t.screenX;return o(e),e},arguments)},__wbg_screenX_bd1fb25d48033c9c:function(){return s(function(t){let e=t.screenX;return o(e),e},arguments)},__wbg_screenY_30eadec06612b80f:function(){return s(function(t){let e=t.screenY;return o(e),e},arguments)},__wbg_screenY_7e467250657a3c56:function(){return s(function(t){let e=t.screenY;return o(e),e},arguments)},__wbg_scrollHeight_8cf19eb16ebc9b9b:function(){return s(function(t){let e=t.scrollHeight;return o(e),e},arguments)},__wbg_scrollIntoView_d8b806f471b7418e:function(){return s(function(t,e){t.scrollIntoView(e)},arguments)},__wbg_scrollLeft_5be50f489b342a09:function(){return s(function(t){let e=t.scrollLeft;return o(e),e},arguments)},__wbg_scrollTo_cac0dff19f631942:function(){return s(function(t,e,n){t.scrollTo(e,n)},arguments)},__wbg_scrollTop_b3effa9c5de14d21:function(){return s(function(t){let e=t.scrollTop;return o(e),e},arguments)},__wbg_scrollWidth_38006a7134cdfeff:function(){return s(function(t){let e=t.scrollWidth;return o(e),e},arguments)},__wbg_scrollX_9da7f7defce2297e:function(){return f(function(t){return t.scrollX},arguments)},__wbg_scrollY_b4c56e98c6d976ad:function(){return f(function(t){return t.scrollY},arguments)},__wbg_scroll_4a3297b235bee8de:function(){return s(function(t,e){t.scroll(e)},arguments)},__wbg_search_af2555aa41bd23cc:function(){return f(function(t,e){let n=e.search,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_setAttributeInner_11a30d36aa43287e:function(){return s(function(t,e,n,r,i,a){nt(t,l(e,n),r,i===0?void 0:l(i,a))},arguments)},__wbg_setAttribute_71039043be82d098:function(){return f(function(t,e,n,r,i){t.setAttribute(l(e,n),l(r,i))},arguments)},__wbg_setData_19a2f9f5b313cbd6:function(){return f(function(t,e,n,r,i){t.setData(l(e,n),l(r,i))},arguments)},__wbg_setInterval_84b64f01452a246e:function(){return f(function(t,e){return setInterval(t,e)},arguments)},__wbg_setItem_364a11cf21db9039:function(){return f(function(t,e,n,r,i){t.setItem(l(e,n),l(r,i))},arguments)},__wbg_setProperty_e4e51b1b1d681d15:function(){return f(function(t,e,n,r,i){t.setProperty(l(e,n),l(r,i))},arguments)},__wbg_setTimeout_3a808dd861dd3c12:function(){return s(function(t,e){return setTimeout(t,e)},arguments)},__wbg_setTimeout_ef24d2fc3ad97385:function(){return f(function(t,e){return setTimeout(t,e)},arguments)},__wbg_setTimeout_f757f00851f76c42:function(){return s(function(t,e){return setTimeout(t,e)},arguments)},__wbg_set_4d7dd76f3dae2926:function(){return s(function(t,e,n){t.set(J(e,n))},arguments)},__wbg_set_575dd786d51585f8:function(){return s(function(t,e,n){return t.set(e,n)},arguments)},__wbg_set_6be42768c690e380:function(){return s(function(t,e,n){t[e]=n},arguments)},__wbg_set_8a16b38e4805b298:function(){return s(function(t,e,n){t[e>>>0]=n},arguments)},__wbg_set_behavior_af2ac621388b739f:function(){return s(function(t,e){t.behavior=ut[e]},arguments)},__wbg_set_behavior_f9f984e684b645bc:function(){return s(function(t,e){t.behavior=ut[e]},arguments)},__wbg_set_block_8135b3acafa1ca88:function(){return s(function(t,e){t.block=it[e]},arguments)},__wbg_set_body_029f2d171e0a005f:function(){return s(function(t,e){t.body=e},arguments)},__wbg_set_cache_b4a740b195c051f4:function(){return s(function(t,e){t.cache=xt[e]},arguments)},__wbg_set_credentials_bb34a40189e3b43b:function(){return s(function(t,e){t.credentials=Tt[e]},arguments)},__wbg_set_dropEffect_ee044779833a313d:function(){return s(function(t,e,n){t.dropEffect=l(e,n)},arguments)},__wbg_set_effectAllowed_70e1a79093efb47f:function(){return s(function(t,e,n){t.effectAllowed=l(e,n)},arguments)},__wbg_set_headers_9c61d123c3ee1f10:function(){return s(function(t,e){t.headers=e},arguments)},__wbg_set_href_960e4284e5cae151:function(){return f(function(t,e,n){t.href=l(e,n)},arguments)},__wbg_set_inline_77b0fb4f96d76814:function(){return s(function(t,e){t.inline=it[e]},arguments)},__wbg_set_left_18508443258534ad:function(){return s(function(t,e){t.left=e},arguments)},__wbg_set_method_5532d59b92d76467:function(){return s(function(t,e,n){t.method=l(e,n)},arguments)},__wbg_set_mode_66c79886ad78fc05:function(){return s(function(t,e){t.mode=St[e]},arguments)},__wbg_set_onload_4dc1f96725e4138c:function(){return s(function(t,e){t.onload=e},arguments)},__wbg_set_scrollRestoration_29b3e9dc74898bc5:function(){return f(function(t,e){t.scrollRestoration=Nt[e]},arguments)},__wbg_set_signal_c4ef8faddb4c1446:function(){return s(function(t,e){t.signal=e},arguments)},__wbg_set_textContent_54dcad83ae15772d:function(){return s(function(t,e,n){t.textContent=e===0?void 0:l(e,n)},arguments)},__wbg_set_top_29926a592a2d228a:function(){return s(function(t,e){t.top=e},arguments)},__wbg_set_type_8ce203e412e28cf6:function(){return s(function(t,e,n){t.type=l(e,n)},arguments)},__wbg_shiftKey_42866b295d317445:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_shiftKey_9bcb8bdd60c2f152:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_shiftKey_9f797da486b2ade8:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_signal_dad7cb35193abd31:function(){return s(function(t){return t.signal},arguments)},__wbg_size_6304a694765921a9:function(){return s(function(t){return t.size},arguments)},__wbg_state_edcc5b2da67f07f2:function(){return f(function(t){return t.state},arguments)},__wbg_static_accessor_GLOBAL_4ef717fb391d88b7:function(){return s(function(){let t=typeof global>"u"?null:global;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_GLOBAL_THIS_8d1badc68b5a74f4:function(){return s(function(){let t=typeof globalThis>"u"?null:globalThis;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_SELF_146583524fe1469b:function(){return s(function(){let t=typeof self>"u"?null:self;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_WINDOW_f2829a2234d7819e:function(){return s(function(){let t=typeof window>"u"?null:window;return g(t)?0:m(t)},arguments)},__wbg_status_c45b3b9b3033184a:function(){return s(function(t){let e=t.status;return o(e),e},arguments)},__wbg_stringify_b54333f60f1e4dad:function(){return f(function(t){return JSON.stringify(t)},arguments)},__wbg_style_6657aed849e5d757:function(){return s(function(t){return t.style},arguments)},__wbg_tagName_d99c8072027f3c98:function(){return s(function(t,e){let n=e.tagName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_tangentialPressure_979a239d3db31d90:function(){return s(function(t){return t.tangentialPressure},arguments)},__wbg_targetTouches_3e9bdb053b2d5023:function(){return s(function(t){return t.targetTouches},arguments)},__wbg_target_e759594a8d965ed7:function(){return s(function(t){let e=t.target;return g(e)?0:m(e)},arguments)},__wbg_textContent_37277f66248f39e6:function(){return s(function(t,e){let n=e.textContent;var r=g(n)?0:h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_text_d3a29f7525a132c3:function(){return f(function(t){return t.text()},arguments)},__wbg_then_16d107c451e9905d:function(){return s(function(t,e,n){return t.then(e,n)},arguments)},__wbg_then_6ec10ae38b3e92f7:function(){return s(function(t,e){return t.then(e)},arguments)},__wbg_tiltX_1327e8185e612854:function(){return s(function(t){let e=t.tiltX;return o(e),e},arguments)},__wbg_tiltY_b44744ee36b60a24:function(){return s(function(t){let e=t.tiltY;return o(e),e},arguments)},__wbg_time_2e33e99ff5e53342:function(){return s(function(t){return t.time},arguments)},__wbg_top_fe120acfa924a430:function(){return s(function(t){return t.top},arguments)},__wbg_touches_a631c50f1b367753:function(){return s(function(t){return t.touches},arguments)},__wbg_twist_6cc18194426f8a4f:function(){return s(function(t){let e=t.twist;return o(e),e},arguments)},__wbg_type_06f2150affb3c059:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_type_9d13c17ea2611dd0:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_type_c1987e7fbaf7340e:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_update_memory_ddf6b41a329aec73:function(){return s(function(t,e){t.update_memory(e)},arguments)},__wbg_url_abdb8fb08377f8c0:function(){return s(function(t,e){let n=e.url,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_1f687dfa7d6c3d08:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_a5d5488a9589444a:function(){return s(function(t){return t.value},arguments)},__wbg_value_c40f8f7227bb3a9e:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_d7621df0105931d8:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_view_21f1d4a4f175dfa9:function(){return s(function(t){let e=t.view;return g(e)?0:m(e)},arguments)},__wbg_weak_4a47d74ffa0a7f96:function(){return s(function(t){return t.weak()},arguments)},__wbg_width_16032a5bda5e6fa9:function(){return s(function(t){let e=t.width;return o(e),e},arguments)},__wbg_width_20c45c895834b83f:function(){return s(function(t){return t.width},arguments)},__wbg_width_219185400361db86:function(){return s(function(t){return t.width},arguments)},__wbg_x_71553b4e719d215a:function(){return s(function(t){return t.x},arguments)},__wbg_y_111b04aa46dc0f86:function(){return s(function(t){return t.y},arguments)},__wbindgen_cast_0000000000000001:function(){return s(function(t,e){return k(t,e,Et)},arguments)},__wbindgen_cast_0000000000000002:function(){return s(function(t,e){return k(t,e,yt)},arguments)},__wbindgen_cast_0000000000000003:function(){return s(function(t,e){return k(t,e,vt)},arguments)},__wbindgen_cast_0000000000000004:function(){return s(function(t,e){return Bt(t,e,kt)},arguments)},__wbindgen_cast_0000000000000005:function(){return s(function(t,e){return k(t,e,ht)},arguments)},__wbindgen_cast_0000000000000006:function(){return s(function(t,e){return k(t,e,wt)},arguments)},__wbindgen_cast_0000000000000007:function(){return s(function(t,e){return k(t,e,mt)},arguments)},__wbindgen_cast_0000000000000008:function(){return s(function(t,e){return k(t,e,pt)},arguments)},__wbindgen_cast_0000000000000009:function(){return s(function(t){return t},arguments)},__wbindgen_cast_000000000000000a:function(){return s(function(t){return t},arguments)},__wbindgen_cast_000000000000000b:function(){return s(function(t,e){return l(t,e)},arguments)},__wbindgen_cast_000000000000000c:function(){return s(function(t){return BigInt.asUintN(64,t)},arguments)},__wbindgen_init_externref_table:function(){let t=c.__wbindgen_externrefs,e=t.grow(4);t.set(0,void 0),t.set(e+0,void 0),t.set(e+1,null),t.set(e+2,!0),t.set(e+3,!1)}}}}function ht(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h790c723772977d15E(u,t)}function wt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h59cad6d2488dca29E(u,t)}function mt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h9761498151360b23E(u,t)}function pt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h8e4f100a6c778e58E(u,t)}function yt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h7dd8c6f9e9c12966E(u,t,e)}function vt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17hd9e6853fc436a5f1E(u,t,e)}function kt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_1_6invoke17h3dab76294ffea566E(u,t,e)}function Et(u,t,e){o(u),o(t);let n=c._ZN12wasm_bindgen7convert8closures1_6invoke17hceaf1cd31a005417E(u,t,e);if(n[1])throw Ft(n[0])}function It(u,t,e,n){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h04eb02ab906308ebE(u,t,e,n)}var At=["bytes"],xt=["default","no-store","reload","no-cache","force-cache","only-if-cached"],Tt=["omit","same-origin","include"],St=["same-origin","no-cors","cors","navigate"],ut=["auto","instant","smooth"],it=["start","center","end","nearest"],Nt=["auto","manual"],Rt=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingbytesource_free(u,1)),Ot=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingsink_free(u,1)),Ct=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingsource_free(u,1)),ct=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_jsowner_free(u,1));function m(u){let t=c.__externref_table_alloc();return c.__wbindgen_externrefs.set(t,u),t}function Lt(u){if(typeof u!="bigint")throw new Error(`expected a bigint argument, found ${typeof u}`)}function b(u){if(typeof u!="boolean")throw new Error(`expected a boolean argument, found ${typeof u}`)}function o(u){if(typeof u!="number")throw new Error(`expected a number argument, found ${typeof u}`)}var X=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbindgen_destroy_closure(u.a,u.b));function Q(u){let t=typeof u;if(t=="number"||t=="boolean"||u==null)return`${u}`;if(t=="string")return`"${u}"`;if(t=="symbol"){let r=u.description;return r==null?"Symbol":`Symbol(${r})`}if(t=="function"){let r=u.name;return typeof r=="string"&&r.length>0?`Function(${r})`:"Function"}if(Array.isArray(u)){let r=u.length,i="[";r>0&&(i+=Q(u[0]));for(let a=1;a1)n=e[1];else return toString.call(u);if(n=="Object")try{return"Object("+JSON.stringify(u)+")"}catch{return"Object"}return u instanceof Error?`${u.name}: ${u.message} +${u.stack}`:n}function zt(u,t){u=u>>>0;let e=_(),n=[];for(let r=u;r>>0,O().subarray(u/1,u/1+t)}var E=null;function _(){return(E===null||E.buffer.detached===!0||E.buffer.detached===void 0&&E.buffer!==c.memory.buffer)&&(E=new DataView(c.memory.buffer)),E}function l(u,t){return jt(u>>>0,t)}var R=null;function O(){return(R===null||R.byteLength===0)&&(R=new Uint8Array(c.memory.buffer)),R}function f(u,t){try{return u.apply(this,t)}catch(e){let n=m(e);c.__wbindgen_exn_store(n)}}function g(u){return u==null}function s(u,t){try{return u.apply(this,t)}catch(e){let n=(function(){try{return e instanceof Error?`${e.message} + +Stack: +${e.stack}`:e.toString()}catch{return""}})();throw console.error("wasm-bindgen: imported JS function that was not marked as `catch` threw an error:",n),e}}function Bt(u,t,e){let n={a:u,b:t,cnt:1},r=(...i)=>{n.cnt++;try{return e(n.a,n.b,...i)}finally{r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(c.__wbindgen_destroy_closure(n.a,n.b),n.a=0,X.unregister(n))},X.register(r,n,n),r}function k(u,t,e){let n={a:u,b:t,cnt:1},r=(...i)=>{n.cnt++;let a=n.a;n.a=0;try{return e(a,n.b,...i)}finally{n.a=a,r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(c.__wbindgen_destroy_closure(n.a,n.b),n.a=0,X.unregister(n))},X.register(r,n,n),r}function Mt(u,t){let e=t(u.length*4,4)>>>0;for(let n=0;n>>0;return O().subarray(p,p+w.length).set(w),d=w.length,p}let n=u.length,r=t(n,1)>>>0,i=O(),a=0;for(;a127)break;i[r+a]=w}if(a!==n){a!==0&&(u=u.slice(a)),r=e(r,n,n=a+u.length*3,1)>>>0;let w=O().subarray(r+a,r+n),p=C.encodeInto(u,w);if(p.read!==u.length)throw new Error("failed to pass whole string");a+=p.written,r=e(r,n,a,1)>>>0}return d=a,r}function Ft(u){let t=c.__wbindgen_externrefs.get(u);return c.__externref_table_dealloc(u),t}var P=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});P.decode();var Ut=2146435072,G=0;function jt(u,t){return G+=t,G>=Ut&&(P=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),P.decode(),G=t),P.decode(O().subarray(u,u+t))}var C=new TextEncoder;"encodeInto"in C||(C.encodeInto=function(u,t){let e=C.encode(u);return t.set(e),{read:u.length,written:e.length}});var d=0,Dt,Wt,c;function ot(u,t){return Wt=u,c=u.exports,Dt=t,E=null,R=null,c.__wbindgen_start(),c}async function Pt(u,t){if(typeof Response=="function"&&u instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(u,t)}catch(r){if(u.ok&&e(u.type)&&u.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}let n=await u.arrayBuffer();return await WebAssembly.instantiate(n,t)}else{let n=await WebAssembly.instantiate(u,t);return n instanceof WebAssembly.Instance?{instance:n,module:u}:n}function e(n){switch(n){case"basic":case"cors":case"default":return!0}return!1}}function at(u){if(c!==void 0)return c;u!==void 0&&(Object.getPrototypeOf(u)===Object.prototype?{module:u}=u:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));let t=tt();u instanceof WebAssembly.Module||(u=new WebAssembly.Module(u));let e=new WebAssembly.Instance(u,t);return ot(e,u)}async function _t(u){if(c!==void 0)return c;u!==void 0&&(Object.getPrototypeOf(u)===Object.prototype?{module_or_path:u}=u:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),u===void 0&&(u=new URL("web_bg.wasm",import.meta.url));let t=tt();(typeof u=="string"||typeof Request=="function"&&u instanceof Request||typeof URL=="function"&&u instanceof URL)&&(u=fetch(u));let{instance:e,module:n}=await Pt(await u,t);return ot(e,n)}globalThis.__wasm_split_main_initSync=at;_t({module_or_path:"/./assets/web_bg-dxh9628c8b4a0d6e07b.wasm"}).then(u=>{globalThis.__dx_mainWasm=u,globalThis.__dx_mainInit=_t,globalThis.__dx_mainInitSync=at,globalThis.__dx___wbg_get_imports=tt,u.__wbindgen_start==null&&u.main()});export{K as IntoUnderlyingByteSource,q as IntoUnderlyingSink,H as IntoUnderlyingSource,L as JSOwner,c as __wasm,_t as default,at as initSync}; diff --git a/python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js.br b/python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js.br new file mode 100644 index 0000000000000000000000000000000000000000..77798385fb065391461dc46fdf0d68509fef5942 GIT binary patch literal 13319 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 RdYtpb@~jfmrl?<^^bQgY-y;A3 literal 0 HcmV?d00001 diff --git a/python/probing/bundled_web/public/assets/web_bg-dxh9628c8b4a0d6e07b.wasm b/python/probing/bundled_web/public/assets/web_bg-dxh9628c8b4a0d6e07b.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7741f52d8804e7f64960f37eaebed70f43f09dbd GIT binary patch literal 5365209 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

W~u5 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

W;^Z+xrQ^ZcV4V64On+5 zvVx5w`vWT|2jLql7|hu?a6XRH@Od4%CFcg*Fm>YAch{L3d?NOKV@K3xoW7#7lXCS{g*U#Om4vW0f1NHgbwXwPf0w#qcpRf_6WdxP3ed$d zOLDszh*&7~S|uPl_{q1bPiT8>@^zC)o>gH71XA&3XIH{!U^PuZwwpVbm$jlt3U z@mA8vDb$9h@PYs0z;m;TLN_J>|N0FgK5Kj{Jj#)oYPiKw9~y|R%_eq?6CqKNrpCF@ z(F+m{FsHg~)u0*r8#a(*fUfaqz_3^Dn|d2sL@xX>l3hi^fA|v;lFbrNvFwp1mV)?* zGFX!qeaK&@G{s~V>_v@?PM6UF@PXyy%u4NQ*Hia@gXuJ1k~WDsrF z28Z&{7#S9%zfqkq^L7s2Qq3D*)mfH!&A&3YS2FLNXf=D3_{DAs*AYoLFY_Bo?L+NA z9Mnf{d#Nw$PgChs25pJ~e;I~(3}|jP1be;W+7wQ|+VinGk7kOyPZKwT7=Vx?{l7K* zrqn&7rvzvoC)7&GqXk6_h=R317jO5P@S;%!zUMLIy4eIp3pIkG^>Ei8m&$(B;kIi^ zcx{1L$B@`=+NLV{ffQ0w-}aFOXoLxF)O13WDzIbC^ADSu+LYUkiN-~rC)hwTrY-+p z4m6V|3L37@Bb4OA(WZtpYZs0*AFm-z4KNE5FUMn-T3>lhWo^P&a-hkH^Obt8l8?Ip z4w^&_BT-@u>e~RnF!IO)3&2QMYYiU>J50UOCQcr1^{E=_E{^9Lw}R(MOEYoiSL}`- z&f!*^&9PC7TS-VQlv~x%ZV|ldo*LRMZcy_ZB3$nq@T%vE9z#$=zB!8rjC>0h$i$y_ zdR(3*nglc(9L;=jAvDv7i!TK2i8q>EmOzAL(X(oXT&1+*T-BNm&8=pPWr)ervS6Mgn%$_ z`PHkG;qSfOQ5C9ZO#!HBMvcwE3l%LimC6~8CAx*_)|@vb*h+kiF|%MGh#AK%0i@CQ z0~oPU(Qc3_prq7w*p~x@`gb3_mr%`StSf9FV>%G=+pdaKm33n_%zRs zwKFCUeKa*DmlCtH;u^~2m$mouiOj{CFTX68(yjHx!*6wvvc(rajz5zS%rL)XlNWEcDMYGa}=que7}#u+9C@g&(5o%%_7M!RW52&2}}iTnpY|#vO#Ov zmOHa2w^W;4Y_s~+Pp0sH zw!2u{0I56ljcrKZcIGiWV!y`D<@PMI)hf{VomjimYMCLRQWYg(W;g2%Fx4fg)T<+7 z(3`L&e4p*08be6f0Bp{TQqBedn1G@kRtDJ|ox2sDkS$qq<>PPAUc>d?h^JiSp;0bm zRKIjiiBEGQ&O}G1G>5JudD-AO1jYhg&&k$uo7-bd7I}$w@b~n~j{Q-mM zIb-@Y-{RULfLEC&h}&mb3{sI$KzXU=cb@*GE=2qw=!wN;_wE&^9w^@didn)ss9kH z%`dW`TDNb5nO?g%ac7y`Vr-U5W5@)-DToD4Ib^nV!6H4wM~+j&wvTj>J!G!<|d7*9ZGQw)y;^7c?NfPwCL5_bN>XmA^-6Hry?m9o>mM zd6|y```f;Uk>LniQTP2<5Ha1S2MgJ{k~Re82<-o-sENOdYfXe-BtrG9>T@{q%&uPCzIY+N zDGZsrgNb0&)bZB;l<&K>Nq#d`=Qkrjg->0Q5C)p2v=0U8%>gjKy$W#5|Ic-p&75A& z)Y^<*Vaoa&PKt$>j@$piqQw(GU7L2{`XO zSG&$kr)g!}lWML&_VWxxFu|ccBEMT?THM`o)C!k`oaAug924a^1XDD>Nmb-GK0$>l zjkuEG(|Mei@UCI2o8j7gtCD9hC{H{-6@ff~%I(xpd|IBU zNqSEvJ!Zpo<@aau4_bcO<9kmL>1+t9cr5y9FZ(q|*+(`(dRSX!?<-LD*SHaf+WJ^- z_rG`eXURW1{j~&D7e~-XXVE=0!O1y_Z&cUe&pZnI~fFVW1!B z?46#hqNns+iQ=GVFN%Yn=m(mmXcc!Y>v@XzPezm0Oe$XTxSnf>a-%0AeN0b|s_)g4 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�^Xv0Hzqe}@ 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 z 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

HZ< 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

u;O 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

I|`3Vr5W|NW?cb<#pM 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�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
  • QYru6L|#Twa;Vf%-K_WPCjMUoVg2nduE=R`vA-W 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
    olGrnnr8-xL)Zy(zweFn&`s5WXoY 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 z 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�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 HZY(iV#g}) zal5)NbqSc$AJhM=C4UgYPOAp*TKrnu0^}o&K47P^Lqrqz^P1G?j$NW-onnvU$Nm|q z|MilK7%uywfFAef7})`t#$UqBM2R{CwH}jv+~)>*!m;T%ng?>>GAzQHp$*I}SNQp- zS|kLQ%0W*nSj*=z{#X-e2xcc7IqX8-3iZwf^i#>~WRNTVscPDDanjC<{uiR0OZzp7n8rmG^F-%-Y# zyb`aBhi7QgDb05PNOCyzzplivNQOVNNt<1#4WhgR*&N#~dj(q|K{E&y49fOHCTlVP zXOG}Gd*|XbY0jI(1H^Ufv7#2$m8vU$@NeG{y8O@pafpKsI>N(Zt^-mfG}#N=xrmB9 znYCpz>rt3R6sg5Xa};F(EwB*cT^4iA5+=;0B=ac6e8`v+l6eCtFKi7&xtdFm?WAv@ zY{O308~l|Ud#gzWt6Xle zxXZ$rC3bIt!vT60jbL+vE_YyY55trhdi3Bq40-IVJn$2?jbRSrw_;GNO7vojWb>UC zpUK~BahX}8>=!)rY)g|h-drHh2D_K7CJ@}HdB5#FxSexP_AOj;5L33V4X!~=($}9QYYw_ z$2pV|9Y1zn%asxH7O)K()8fauh#k|NmVVP|Wo1#QTEQPVmbB>@m7*eXODNt-MFs-x z2Sjkm%Mvs3Z?7uZE|d#F*|FWv04I10xxZi@EXdM~X<&}#bLYEB8wI*ZKiOWEsag+J zc4I`W6g*c2vsDR}_q4opBm|xc^o8`3pEJo8^Mt4LESvBrJ~{}4ukR>`#pW`h(8`!AQ+8rarF`?{q*lxa)?4a4-`iB%m+V; z{%)4H1Ir2V8pk%xke>GNcEr;TiF`$sFNAOj!fa8Uf{<@8<~szq{~f#NK#{Lq+4PbU zZ%bR(Hl8TtQzBjdhvU_9Q!dQy51OeB_eo3tSwoG^Z@GI6yea)k|BYtB?$Q@~@A@ zq&z+vk#h43wAl#&uf~B!C#?E`MmMbX0*wGy`+-J?&0zq(O)mhSrW=5#*$N=dZlIA! z6HA{l$pV22B}5DoTIYx^Fd`Pp#)?zV16OhDbjR9x(tXm`2o@KH(mf^^W}_RI{ES*@ z&`LX?Cs@{K!e!kf?HtBt=O%9HF@Sr-K^|7j7)8z%m%NGXhe_#LA@zAp*Vgeu)N$qC z_H5z*6a8z|=NYMYw)(4Y6b}Aqc3Z`$*tzBbg=$4J7fpcp9?-axcJhG6ruI?LJ84S| zH3+Mutmut&@yv(}FS+R?YhjcYXz48?Z@^{Is2pbwLVY+ATItmDyJw)WM&#hE3)L(6 z5<1T35qD%Mc7kw54`+;U+6)T>4{CICP3v+F2`qK5<-~m|7fdx0RV%J6I#5eZWXm$% zYr$mFLOuu77%_=vG1|mM6t#{c{VeYwn%EO$2IqY}s%zH+T$`6iKCm2F&vZ z%;zI}JbPYPG-L@<(EbT-EQrHw{}M+wGlw+^F&|AHoM;O z$fokc&Z?kg-izc-K8V*ND)I>KET+|9el20hj^HDJNK6efnw+e=^LP^dmIuT)5TKcK zn}=Z$SA~L$I>_GPQdKPdnd&dx&@qg$X6RsuCK0i|_T$gpN3ns6(oYI+c^L=8Qm zvAVcjGcV&*a{WL;F%T%ubWXobf67_1XbNt=+di9a^a$5si3kgm-BnV!5MS{(<@)KK zfrK8@gvxY?N{t*|u@Zix&}J)H! zLTVchv9cw;iF8$ZPISgb)fuih$sNI@S4M48fqnVBLnoR5 z9cO%)-W66M;};A%Qr@q^51b2yLs8*e4<%g;1(a>+49EYmrtQVsbjAWH)T@Jmv$W&_9<}Q1LHf;xDU*_dfC?< zj8W}IdQgMGFF-T+4_HEF5p3xoFQbI2ej4!v(zy7DZL9IC^;9$9LR5JlOxwqyNT57c zgoJsYeMKTI&!p3>9P2HIrvG9UE!m`YmH~^v%n;eH4Ggp#ctZkw|C$KDXWpJ2W*bdE zudHQd|y1ec+a#EpRUjG1%HW?*p}&3$0Xhn0UT z=`i$}GaBy|72b|ug3AM?;DolS%*y+*2MT#GBpZQK1Zb%pTps^)oH4TQG(pofr?6<2 zS8;#0r_xruaBx7Xk&XQYEsO$bCh`?k@IS=l3z3m&I?|&EF>nPCI6E)J^#os01YB>^ z&T{OQwJ0WwFwB&tEM<{9Flx68oznj;pf4?TKQxPu?0?Q@Md(*tOefZr6u1c!K7EI* zoDYd~+<8O+WwcasS;}E~c?Cv}Ng*Z;c6}~b2m}&HAi!9E*94wUKTmrJ23H7)(L114 za;Eo^)}lz+g&ySj?X>>w1f{YDS)dDYzX-ln#>@yg*%m~;nHTW}uX7t}Ba3QsWGAAK zG3#|R8JFuS>QQf+Sesl#qLi2?<=L4Sv!z8j<$XXczmfQ?@BIv9H8jv9FBoAkR^}kj zB*gM`;Wp1wGLD#TB&UC51gt%<_OFdc;x-fVsQ=P1e>jT0Z8*UzMUqRE@tB{63{c1% zBaVQD)#PlF{Ru%ZRtK|7#w zpewO*>@Y09T7f%!b8f>4qX|)j` zCOP@`r`c>Xu)l}PjE&w5^mWg1ZtYHWqk>>-qr&r6{Q4t;CtnFHV0R05z%fTzQJ8ih ztPGi$7#(M1A89F-b)}?nu+dA`t;g&);MF6e1&tOcv=CtQ724yrTRrru!;&9h3LC*i zq|9H5U8}dLMcIk*noFII+V7Qt1a>W^yTGS=5#&;SFQx1K9ZT>ruyhu=X|d6Z93V)G1L=%-LlH8hk8K#0Z=wl!-ImjOhK7; zbMG+gVCngtx+uhP9ucf}*+^$cOcAR*dhEwRY?JjARF3Xe)B_?0=&uMNl28Tf_xCUc zhWY0{IgK`)gb4IlBp8c{SGlZ>Jw;!RJd}%`TaB{PeNJ*%Uhj7Vbua0nU>5>5j4~^! zlt@aqL;(#Ao1zB3X{DHL8ZLIOqELF^LZTjsKWW^E2M8TYoQm>@v{fNRCL?lJTvYp* zrYIoe>AXfJQ5zu>7{X2&h^0YTihQ&U37TwMDWFVjt*W<}ZFX3_?Oe%?Tq3S(tcwkR z&no87B;tyEaipJT24&G7C@3Xlrp)pKn8ehUjX44TAoL3?;{ zVmQBrlyA5JOhxEkRp4eeAn=xz2X|4pVyikXI%Is50q9I*9zmg27{*2qCj3ZbEIJCG zfg^v^4$fUg+%}wXc+}B4i>j^{HxT!QKSgsp@-P2-<3MS#9I*$TpNLJ1K^GuUp)OuV_Dovgb_27tSyatwMV_B0W^A{~juGc7VnOXgDB z6%>A{^j$QGTO3P`)L!O(Wi;a$E#A?)J`f#`kLea#{3Y>IyB>$Yba6_uQc@R+(=Xf} zLnrWH&Lcj+u-Z71alJPM&fLI-s|EC!&;8e9a+QSE5*EE2<47OfzA`tmx?;?zkJKj; zxPXH%-2Kfv?p?OZU^J?5Od*adhK4lIP}xe#f|vlX)|0>W-kA~=(>T$A#>7dAkDv? z7PmFzZ4;zu8P}Xr?L{2#`&vB8kqwX8|5U?99IG_1KK$L|(KJpsnOU5J4(jSkm02<` zcNV*~+V{U;4KV#qNH-5pepI=UMs+qXI)&JnEw=eLCWD(k!eYgKzoW;M!3~d7kfbpF z{H0v=>mL;`q3a2AbOf3T<&xcGAFVjY3{{WEKD2bfKD>0n6|!`JPDubWkZkr$ie0!K zH*IxpOE!1N=F3(h$&!w3Aj`SsqW*{Ve)}nSrwoKUhZBAjtB?}3^kiQxWD4kfea`Yd zSCF@ujpY?Qg!JwH?FF_nB+OXSc}eACdn9)? zqF2Lu%aBGu=fkBBGjg!nLH9>m*@7O^w8#uCF`KQJS+%;7URj5-wN=Jxm66KEb8axk z%_{1GI>XdjazG@DF0DTo)S@8Vt3f&TURrouKtLUHZN5^+-yGNM=2{G_A#NecVntqX=3cW*YY1g-R>U-kyaXx4FI8Pg z=+g@6Puxl#gkvLXGf|)>Qr~8h2vcKR{Ihfl55$!HM#uzw&yH;eL|VFR4j?OuqXxc0 zr=odOU}S0Fr>0UVqc^rrzux!_Tgy!%9Fa?DvV_$H3a&L1P{uf;f_;!0kTi@ga-7yd zW&`nIDb_|tMPdR}5J-zi%+l)*u$($}-Ic`YtOr)ob`mfyrCD!XNd7wjT@0O&qZWC9 zl$9(5Ad)JEN1iy&AQ6~ka=zG{SyBH^mUKLhB42ci4nOCTnw*+~EimgKp#7c%U;v$c zSw?JwX(CL2Xo9mVdl=f2-1>}Cq0UJeEQKh!ieh~7%psS^^A-m_q0ud6+yqo-td8BI zM0t7ZP9YI(Sf`0D>UQv67Y}qWCf7~~L{nvie@3y%C|;juFf>ljpT`DZw@BTRUoWAp6KIA~CuDg6i1LmaH4F+Y zCorekZHCq&iAzX|Z`7n$XLa0ywn(opQ3C;}Vg(!zr2YfobWAn&37zL@| z2OFhG&4nn5s?7D-+7oA(wKy-UGSj(pQyVxcEG5?cm)MGDVrC`8pUA|7M2VG>2$kt4 zXI=!Yb*wWlLcH$fNiHyI0(KG6`h`U;Us&d1f{TEuL8YS-CDJ&J*l|}~)MOsCXO0%r zS;1>p{*Y7`6znlMT8tLKAS4E7QmF)}xFC1w&8WK$+VTtB-eTwiBhAy1#SNmZt!Yel z=y7W?5{wFzD0&r(4Xw$dU^QG)Y)P>JgI*e0aA2&(mN`W^NgfytA{rNDk=TfM(4NWj zl7?@|@*DE-D&ZtDu^F=EQdx+gt)*Hre0k7kd7Rke{^c$aKG-Akz3xEvvE=bRdds8K>ec*iXZO6d!xVQgHbggh+ ziOp=BDt5Mn2i-bRytnrR(gwPDKF`}e%@(Fh2!01<(g~)lOr)(T;plT*M1W2RvqLEt z+IMJc$aIIQ#qk2kG)bn>{b2`y+j*8bSQV5KLyZg>{5>gFbxS4NjYo_3W(vIeKysjF zv9U>O4j(n4axJwxqcn0Qbn{-6m2$j5jVRM7$LFE|xp$$-srv2MFdUlWpPbRS&3w};>^=waZ4?{Fl=>~wisy1Fe@-{!yF?59NzLh9bCtHyW* z;YoK=bW}{7vd$CJdKH!%W`L!J5nypCXSom1JPx@26-R`gqysz@>gGh59UI~2L%&q$ zPz+row^Q=C>*P{x^P^*e&dhb}9M#P#=jzb)diQiOs>JbkPf4+Xf>rTm1p*$7;id}c zy^H2J=zEBGr#Mi=n+BAt>>A82^XgjLxk>O2#>1czm*MKqN{wnBR=k8n{x-m?&IQBW-+x6$xqC+CglusCc*Ubmo3xLW_-`)fqH#V) zw11*xGc?7VGoxA>OCuay;K)UfU$AgGtXn;?iZ&gO?aNjDA8>u(?{twM;J^?W?b(X} zjRej6;073wg+SEgsKxa*8$ISzlm!%H;Twr>%XY|?tq!nm20dm+m#x91EL#Pm3`6+zIyu^$7;l~f90#M^p63@&!{_Y2 zZBI$Ji+Pi;#ry*_yck7x@Zmq_c4lT&CHlPBdcioD40tlgLsE8PpDEil;XQ1Xh zOC%s~lf)4JCYNw4tw(`BqEccWlo( zFSFfX4>ryKUrna20T-gjCt}DFGq-WLz8E)Q9T_uqs3Q*!>c(eKho1x;ZFN6u-ki|L z*011xZKZa4qk3yL{z57{($M-v>ld{=lt}2|jEMnZbPXuYGJo^6q~kuR)eYSA?Xz1Ogkvt)htcWL^#65$5EBO-H{_QnFq1>xLF`|ITMc)G2X4n%#gx;0x$cK zN)shyU4OsEz~vmwL*%BA-_toJoeuj}wjmPm4Na+RX8tZqjjC^t-6snKdlP~&Ajq&C zwO59i25{Pg_*WM+Hm@vDvENap5Dv6yP4uM$p8#r=+>tL!Vy<;-dT#1o0ZpbTn1_B) zI(JuLNE2`$8}%}F1a`1Y$e+PxP@VN_0NkKBF~+QE#&wE zU;tq7A7Qs~41QO^0N=8Y(NVnQ9M-GAj!83`GZ!2~XAsvg zV770k)$f{QsX_WAI%I;Omup0Kl(i2=jCRz(aOEaO#xL~!&wbm{b&54T8BdBs=JD$^ zBkEQe!Ik%-3nV~Pi=;JHxHDQi2Is^XZLMS)2OD=g? z@uRn#Sy#A^i5OeU>W8i@uRI-T%6r#~JRW$kYcBrUM9|R4j(7tnoZ83in%Jc%Q{ujN&>{*vybeEQ|}r z_bA8~y8MqiXNWjg#yil^v*Kd6W-Vo(I!h-n$$%01IxCFD3fGFT#DRJ%7+s zGNO7HQT>V2`rDE*WPt&PU<74IGA7Z$n`V#Y^VG9;FXV|$*8YMPM(V&z$WNE=Q`?_D z;iH?dXW#U_9sI2=II^*!_~H3X1_>P5i-Z3pP{oLeXi_Lf36po^!u~XPm==;j`sguB z;bAfpC6s9x7i5R>smi`nxQ>jg_=GiXrU_zJ5-{(&!P?8vj9o+dqu<_WD6Z*cCf$7f zG8Tjz)B75YCJD*mIsI#_ac)%u^e+=PasT_!uJF~YZUeo0fvaQt8r=rCQf{bV1Y@pQ z5TxX!2?B@GLYuRk@y%^bgHll zJJt@%f&$82SVkTG#=>8`aD;;GRU{y@iKd!|VO~dVX;kULo4&048`NnaT>g%HeZbCs z85>$gBU$gTp|I-I_nu4CKhW z`42hrZvLay6a9x>aGF!)(TUO{twDaO71|=lz+G(Ym1r|_+^8R`#2RJSFj0+g&?kClCu zIG=`h%1y{?GiB!_c^Id*28c^lKgWb=H%t1q08Ofwf!j3vLm**pF|--(IZJ^qj+0qj zZ!~k1F+vD}7J}lCA>reb%C`}h6SE>{o&???kUU_xI^^exP+jkyO_~c5#BAFP{58#y z;L1GUgv^@^;%TyguA+nNN~mDl+yu z6VNk+x2o%op_fl~cl*q7O;$ykiADmQ14DkTNEoL!SX4% z;X9GljR_0Oq8(5HqLDQr^c3Y*{Jp}q)~@@k(TAYod+WBxNw*`JN+72WO^j&UKz`x8 zupK;Uiv5+bOH0O>8sbtuIY2Q4n%tp0Vw$Kpk#hS|+g9DbAx56*>lo~}Kna7DxpJf* z%4y4L>T$OPme-KKR)G`|Pzp4`49$y>{&`&l2c;2aKrDuz3}z(9>c*k&KqJ!P0f!@c zkV0EN^c%@qOJ;E1!G|4snEvjg|BAy9=h-sAvx#3akf2{a9Kk64+Ja}H8!6tQY#ajW z3EUVm)HVzSPdKXCQIDxUd>=xG2?M9*p~HlYgWl{xgQEulUh~TgE*VleC_)w^F;>NTnK=xZD)fi8S$<^pcI4%q?lyIEyF7@4_aF4*!=%6bb#w zYAXM6KnkRhSR?VpL_^_Y6;MrZ0;-`nK9vx&GhmIT5g;rnR~%aN7H6Z_VX~JqG}4m6 zRbZ<+Zh8?p+xmunyd$Js2?OZ*kf$ah&#L&Qzj#FN5%|S0Jnb+BjSGzK5G9aLZgPWX zhAT~HDF3AHNei*_bwHnEo-&ETg^6%r+_k6f zVIt4@daxn_SP&shMFfi?2CthrlqeMmtco1=OT%Do(=>+7K9*${W!sEn%22rjUvV4z z55guRV@U@mC}j6k%1k(IPl`7E0LY( zTtjRlnVC~&<1ktfH|SBQqCC=u+l$^}y&10S17sd(FE32m68^%tZSK)B1Z1-TDq)}u za=CgDBvRcKS(HJJlQ#)I)Ea>_ST%lE24f-h*8a(Cn-A_=tRTaVML-M^Vhqd3KGuxD zM_Un~umpg<0V>-iXa@ZY{j>wraH#S0@MBDk$A%wc${s|@BnCuOBKHbwzK_r|%(zJd z5iO!|4VSov%e;dtrH+jvLk$K&PG*pi@p=RLY(# zW!IOac?l~g>@1zU<^thjCp;e%@D0o&G9rg0x*0>%ES(QHJ9*J1@o+ps5+ZbQ?C4g~ z9^J~?H)^YBEm{2Qa>Y@dPoyDa#A#xbNFhjd<$G3d_uc?wOh3<$m|;}H*m>U!Ev^ZvCaf$bS7|CORFysoz$y?^3B+l9bdX)ZZ72@JPtEq7dF=p>w!tLU$c~W}2WE5wcepEiOJbY-(BAQB%@q&bigv+J zY&caN_DI!Hk5mo!`o>|fjhi*MEwc>jbzmE~d$lVc(^CrSu@sZLhwd$oqv&XLNUhX= zhW!W@ouA*E8$;fCboZkLfTY+00sC=2zRTT6gvD|)P^C03oX z7+&e<(RBRip2?$$XT~k8d9QRiBUERUd6cuyWWl0(0-adzlW%Mz}w_kE8KR+U2?}UA#s_L=kL*E2F}1w2OF=RC|u7w zll+TMmYc?&;@_g~-08U(T?^(uQ5wZcQ{Kbl=uxzz{GE6JAdr;bEu8@V-U-XfZ!)Oe zg_hu8QA2~9ltbpYVn$czpb}Wu_@$qR5fCy0xN+Qx&ZpB87IUYInI42?2E+ZErlA{< z4$>|mxtKglvXATGCuI#MD(UsV?fOqo6?(l4%?C|DhqpSjjL?Eml%bcv5Bm~F@-^(j zb3b|ryT|MIYFU%3IMiFMQbbbW-=MMKOPgI<)VKqHWoJANTkc;TSikQsqBpa8J5a`w z$-xxMc(jdkJvI7#D5Rs;Q70bOqhhakov_}_b#aGm0%MkY$pE91sF$`1DN{b!w-BKw zw%}_FKUMo;qQkc*t=ADa*fC;luBC?HSKa00=>q(OKbPQE#>50Jk0bTjM|m8Y@~m_{ zmvWNT58)x>mio9f<=O5be~x23+x;STkS1Vv{v=3~X_-oS4~ltZ)}Q6HR;B3W;e4?- zUYR(n!wj+2_Bhq=ks^m*s>Q&ed4&8wcgY8k5aV%L*bE!($9?MpRyc?^Y~Z*L~1 ze>g1|oM*X0{Vet~>5I3a^Qz%987a?*PX#BrOL2)l#-e?7gmf5iciX=!;-^eHHQTHP zS7n)AW^L@O-Hnuq6RNa>ol}=f?ZLz$TcaXNF*x5yXAC75MhjKt9u)Ae;yQp>ZV9Ld-U7dJLpcEHoS=S@hs0Erm1fS45Aomc zaCbS5v?dy=xoBhd7Y%NOfZ%{ok7R6$p6H}3;h^>YXZEJSCt7emk8~Wm_F&t~NVz5D zp-o`v8GQ%g6ff5~%#tM=XAQp$RJoJ1zlN$4YdZAOB2M^{8fq-k;L&eB6)Z>)hwTPK$beq?Hp- zk8=inLW87ae%2cgoM7bu&dTpn-w|dxwlpT!I^y=J)%5*|gpzw(rZ2!bg22T_m}MGa zcxzCJ?`MhUm_%j8cc{YF4a7mCaAY<#PdD7-*o}poVt4u)=>= zx;VPlo45w+hW^8_&J{2GFbT-U?joFGKx|x5rA{Kgw`Xg(7JwkIZZ#@q<)mK{T@ym6?7!Ra4} z#AEdD>3j{?yC!Wy$}0Spli*k8TpFmE%MLD?mubQo)`nNHiWpm&Y(A3O+~ncJegv_N2pFO$UyLK}0V7va@=&-03zr-+Q z#z~T}^e>(Mo1DnNt?x4T;Y0>e<-8teUKfONpOZ8c6kp*vR#y*3PMFUMHFkUn_7i_} z(!A@M1R_KaD6Rv<7>MkW$urQ3pnh%(N+-|MTE%diU;E@qTvDgKYCJS*!a7?h9zD0M z?fE-LeLr1Tw+%8pM<`&IO~ni>UC5enK~iwgL^{Ai00|D_C?=ddS6bM=>F_YFXD(22 z8OEpVRiNJHoXlFs(WAEKGtkLGlA^8)h%b=tiS_}2-9J9~=!1u+1YRS!xH&hKY#JH# zyA1whpt7o|S#W?>MDzgr3dlFWz5@&eq*Oh<;KWgfAN%)%6L1(lMwVRTIku1MfY}n& zdB+YQ7?1;p8Zr>$0q)g~XM$irfExgg-COQ>ej!JM+fu`^I(b;1B=D|ZPQBP&rRhf# z`m3+kz1NB8mh?kg%e#M_HQ*r7t!PZVAGh>=G5`DvH<<)+$I#!& zV+XqL?7>ZUfx08)Wpli`l0@RxseP#(@AQ#edcB50+#lB+WRsBdQUt@Xh588vI6n4V z@0Q^cO?P#U`kgENF2BQDz?>W>M>g^~kIZpT^sDSX9K}UhyG;&Wt~KR`b4a;z<=Bxy zxhAG-rD*L4I@mAJL?$~HGkb_G5Z}TvNN*IA07%w!?QikMSVyJ~Nnql8XsD)a7Y3dv zkZm#)S*FnuIJcirN5QK%l>?okrlO!p`|XAWY0BX3#%| zlgh>l9d5_uaLFf8kK`Vg`AYvj*a*P(tNd(WsAJ;f93%$v5)sOHGPUE%cfJ;{m%{8A z_gxDe8Sxgmy}O~d*tW)V?RJPMfG zy@YbSS2cVT{t}l3$$tW-3|r^=abpNKv$mR)^hdQc4RoLh!HRwWM>^kBj4gXF}`HAjw? z61z@PYotB->+vn}0B{6=901xHU}zqxv+4ZkV2CuMhDp=)ve?q?EdzLsu3`S9YZ^C^ zU3nqpaNg#CA{$}`uf5DmD$1mbN+DlPnM50LqndIU_cc&{nwzu$P+1t#dT%P}HSUGz zHBc7bNpy`EgL<5Ubr{@$$;)6|r-dT|u?ZEsIE08(T#T`aW|Sc%fk@*LM6pTDw}i?4 zdPOvX4g(WAxCJ^tp;-fdLMz@E|GLgZk|R z#jibTj)ZR`aGh2B^eAErpsA$;jQx6ljH8DihT}NP`0b3~8HV~YnmWq2KHZ@XKZU5J z#Sbp}^&2%u7pq}_U5-XRn&3r??XVQp040Xf8{wm)G>$JDO{$gmnhQr1`l*;e(84LL z2ZRw_UGTkvm|yw=gxUkbnOofvAQ;j4z= zip{jE%HoG@wnh39ip8nwi{vtE@}?sUIt>Y*UJi9_hs#~_71y@moRqi^Y51lwbNR)k zU_-d9dj(IfLX*7@cltrU+qtCq6ICSepa`fxv>r2VqHAp zgic}j_Lw==&xd8fGYI_jkSz&mNUX3L09Kz-J-opS+xrA(P&Pl(c{h*-;Z#ru2xl6Q z4k<6~rzuouasgLr+ps>F7!by2{-BBs3;a{Fz%nLo|1WfG@sOc11Z=~?GAH49{n8qT z*!eE&{9x_mg)si&#;|x9*}>z)vbcyW*E^^e6m%SQhOvDHu2|Iec07r+R{zP$_R-Yk zf(7w(@MQF+2AU$HoFlHS*id2uHL$S^4IIu06HTCSG2558#VHPPiI)KSQt}dh?%>8j zDZf^uCD|mR7-bns$BDXs(OY_eNU8|q?h_rwb?Q~e52}iJEHbO56DYt*AtRs68aa}h zN$@z-MQ4zlVKpi`At^Y0@#&Lx4ym=)W)HC8CWdd%-ge0H{*Wg=8Yv6mf(C~2rmab+ z05H4X21Y>(+}oCMHXT|lbjsa$nT6%S>E+IQ!-9Mjt=hy3h*=7LwvL#<%{T`m49u5brq^im%R|xP|yHVL_d% zTC$PE2u7xKJEai{U1vJNaab0Vncd9-$k&MB147e@dE1J7MDdrev@Q$RKimhn?(&6< zC3?N+C2zRfmoPRU=tP*xDs_LO`44w;FpA71AN@S|@7qEdO(PY5!&oYSNQ@_1S8Dmk zv}hF>=6y}wI9_ZAf^hr_4OBXqxPN9w2bH~dr$(>ufK;CRM~x5!;lU}O!M4P0($Rek z#=ffia;!^qN#nbmuklSJE=O*pd0Y!uGNd{rSM?lo)u-~ikZ%6t!Ts6sEB>wnyUy5z z|3c8s^L1d>8RK}doyedW<7KBAx=t+4hAnOOAzxg=if zS=YwX;&$8JBr@k}MyDGqGj=a`9ZuqXqVT?`_0-Bkoamw#VjFoUtj2yKD(gTYI|24Z zSwTW|zIY{>arwq)^IcUrD)-e^5%$o?8KIJ7DUViZDiR$%(@DG^Ud26HdY{?FC7X{OITX0czO{Z7DyBJHhd#6Cih<1A{Ib-YU-@(tyoYndqlq2*jtohB z0f0J43+;t|Eq{7wa!IdlDzq-O^iCO(yG1{2Ep>q0Xd$Ue^dOvAS@-e=+T(K=`|u;e zbQ^qzuREM}Fakv9D-atgyFr&JU5ZN#IzBQHGL3x2xeK@ERSJ0i7RLt z6=jJD!LJrgP3{s|fx7b__x@XQfa#pvYf}NeFN?W-UCN!vI30VnCuss47FeXWTefT^$I4^HyNNdp3OYBOhkev zLd}*RzgR~#Yi)*D@#~)QXy_fYKG40jF_S}TH2jcH+hO$$8`(oNVU1F-?oi<^$NVC- zN{!Wfzdw*s6D?NWbJ{*<&>#V!aC`KXN-o9r5tUf{Ya1ajY6VL>XBs0uVu5M8j zlp~`FCM-K9_sSsR1jltD;FNi&QnOR0awc;@gv6@Z=(Bj|gH*#)rbl%@0Z*)Z_`Sya z=nD~IyY0@)yKMn=dB=?DqRTT4IbGvo!DZ&6nudRAI_TY-nh4^g_G48hBKOzJ+ADMP{@JjyS;HR5B3ECut3KA6j zq)b$lzy~J?lthyJz(OY&9@4l}ipfIWA z5g$WrHUc9!fdQsWyUnpuspQ+z1H8MZWI^uwllMqFB@^SOO)8ri$ix`DyJO)*6Nhn4L8rBO#CwGh-eZ2fYzzIn@zS{Oo^ zYnhEh+L9cZFS-^nbWgS2+0t+A!}638_F&qdFAGjmE!sA>RHrP_K8?fP9OC`+Jp&UM ziardWM@SVK(<>*2O&HE?mE|zbF}te|@K;x=OYOyNWsK=t-L=j6I*f6H_DZ7(6hv1} zZx)AhER}>}o#|$}y{l0wehFjxLJ+;svP!Q-R0pDO5`>_ui^oe^NnvLFK1{K`r2;mC ztQaoVg)xqe!5#J{vGv3@4342*eKWke2e#GRzsRQXPSB)PcOsPBlCFq&!EuUSni`6r zOObdKyTX9UYmTbuv@=p~i&2&R^V$>Gu#1`mR`l?4ZOa8y2x5*{2uHX)M#-?rDUIf# zcVnF@X-`YG*Q<~tgm$5x_%mh&Y}kuLBn1ya^B6-!@p_|O+e8;yCL1J=&43ykh5V&<0z0kwt2H)ZqY>_miK(=EhP}mhX=uwv+@;)F5sb(V}x-gyt21yc` z$EMI{VZlWGbO_OIF%A?kDOiveR4Js5i`+|2n7uG3s@64Fn$DXnq9Mo0)oKb5Dki(hUuHI~FpPTI5#hP-O~=Hy(?dwr3c~D*JH}&_9B@sZ%jII^5;f z2|fdTJx786VTzCjPcgEmQ8sG0Op#PE@j*nPXj?bGXXcs#~{UQ z21|73Dk_82CF<$ReBS!vXDjXAOpB#tjK-@dmBuyC?r|PDa50);#Hj;+M3^C zC($;Dv{bMJVZ>ALGK*wT>Ri*c!07XkP;S04WsIzuGwJ6AAnC(@COfJIX9!e{*RC0> z<9_cw#2wOH4`cEEGdH-ipfWrR4h4Kfc{(iu=E4_V)JliNONTgL5VnM`FG3W~g;V(Q zE`Y#5&tdGc;w)o5QU>-J{jj}t<7xmZI7n$-hF7ov2}O`pN2z3dwXe!bgPht|eL?#- zC-oiX*T#QR9Kif2MoKzY+~#t z*-dQT2Bn8yg2t>UWa_P&ttBC@;1(>xk53ybDL9|Hf@I0T?LQZYB(P6%cLE}UYD{{x z>=|yc)taxIPW*-5a`Ij#Q|BSIJZawn&K6zQBDw9g=eioT+I{kO$13(+tcEJc@IK*< z@OKR#3rXL|E9~nKHZky22Dzt6J>EP5o6Y7yHC#aPb`*jTS^-i5!fok9VU>cUBdbc_mRFwg?_j zUSL9du(gQW-$0mk0!yYGv)TLY;2DQ9bnty_S!Q6$WJuYit%N*i5PHihBMGvkWYiDw zF6j|1-wRaU)^n}XR;IvnQ-|%R0Yyyoarz^GmPS92LBA@Z!Cqvb(fOCusjEc^)V4C~ zqV-6goZUsoWEp5GMwDxleQ0263u)*9}plcA8DWd6pNTf+H|cnaKM5+@-y51HQv4$mMa z_mg9)!tL2kyf^>`8(Z1C)9J<@^b~K8Ep7u@Xb1vLhV*y_iP)z zZ*(6#_H^M-GPLna?B?z1vgc#JCBJH1X|RO_^i(kGh18*0vnks)$(KAKl!HtbiS%*5=)p{s6VLH#2o~r29a0@TnNaN#rl&m@ zBfL)eZVXdGLp^^EehGR(5cG-_6Bj@ivdWblo}R=pQU2kp`O4f=dhIxl<_d!}P-RBP zVFP8|kLD9&k3!VWCs%xs%Mid4A*YMzD5qZuE!I8DR!`x_q3_OpC5gWX*}V!AtA9l0 zKdq4;jWvqDN8-M+k?^}-2Z(95EQ814*)9<8{v)yU+n23PaaR;^gB5Jg!z|7?QU|!}M*L_)KFo&BHR2d4S<#kXG(M zKj~_qi-JoPf7`i9s%RCC>%i9}`{b3!G3{)MQdu9fgJXiL)noxUde70;!TnYWv?;yN zFap!9{3GH1?(33Z84#^U8HX$Ox?@L>F7SQ^7LtGN*|`pZc&~BU!D$EP9V@T#H*Qzd zJjAEJ@`h05^sy-MkiVn!CNC%%Ww$L$?`}Xc_XpI(6p*R>-q;Xmxtcg2Q1Mwm!l2um5?6z0(CU!VpV=jz4vo z8LRVF)RPUv;yI!ZxNWnKtcDaz3Wk@`>GcdG#zQQ{oneu9aO$u2?ISci#)mztYsykf z?H^Xu&i6mvvH?0Tc`)7D?P>rbw?(*AR3Rd75C|lkMe+EM$eiEaW!$o%sEr`OGtx4P zRt|alRRU+R7bFehqg;INGj}riU792?es?iEi0wA&+&_7((gcXz1TKbxkU?lQV*E{M zHoEUYyFqJdOdTA_JAMg4c)v`>@8go1H~Q3He7dv-IrB=Wl+BX402TKmuU7X)sN2w` z$rNm=N2*{#`neKHX(sDLi5{!@LHlnPsARZ%HBvo?rD_}63~~ThHk8^&FTqW0uKH=f zOl@+a?pIL|HibfC?~0yCLo6@Jqkp6pP72Fx2yzCZb|R^_Y@$&OSf9v0PicGtO1p6B zPB7Af2U5T8`mdtLVu{t)zJ_K!J5PEXN1I4}Q|;V{BBA+BMtXnAwq$V0viB#pRKFUe z74r}sMe5Htl)c=B4ims^wioP~r=t6AB5L_J+bg!VT{05z2*trQUC-&xq9mXs`PMBf zFu!$ykZ(GkaQmR}9=9IDt-Z)1b7{iHaeo=i%-=`a1}CRh@%dM4z;AQHs&${A5>Y@H z*m(O+1_S2b*|ALN+$+uedJrr@eaV+|wc2>LGXi;U<~AGl%FXWWeP>_F9>v@hycgG( z0bf&r*MunK-F|+($qq|+Clo_?mTZ8u)0uKQ#7gmE;+~il7)>I3b_vh z+K0~*>p!zcb%8C6l&GLTQ3=v>`*kB=X;Cid z%|h&47BrVtU4EkCmjhwiC|7L?|01snGgOLHGJ@N1!NJWxbMNok3z(=es}H8x+R4;` zjVf@(5wTJAtee84v)mpTH&*IS<>glI0=VV?HKXW#;eYSSzNwzf7@K9q2D2iP%w=+z1ch4jGgf&a=HaeDUx z1Pbmqe$Y1nQj{nlgShqi(`#FQy6{WGrbdkpEUIKe%<=G*^&3;QrRxU-);?OCVtgj| zv10@#wwzl?vYygT^G)8sdc}9zxyvo8hU{}AbI0&L3&Oi~Mlz%2GM}TsZ&EOPNH>>k zu4Rj_&oVRDU7z+>pY(fpTDLyg`j(fto|PwXNUT2qIz5@bZ8d87=W?*k{x{qQ9mg>K zqU{y^k21cguFU^|w?Pf>4i#F^BreWIIP94Z_;}FcNg1BS8flqW>OP z<{`(>z6rIhYxFar5zd9{=j(5TIGhVhL4NS;3z`Ug*}c#AgQ&Jjz~rg(Q9nZy5i(6o zZ(KvR107^tZTlS98&UD*<-eRhbxrWMx=n07$@$Vp3I&?)jIks190mjq`SvXd;9jtiKd#TgnH#N280JyD6c~M@{7*LUTx=rbgwY5QFopxq`ul96VrY3 z2!D12tmn2t7K>cAka2y?BvNxVFN-)^1bYze8Kf_RTZd&@KhvIr_~-gz?G`VoMR>TI z1Q)CaA$In3zV7!aG3D&qUdYb2p?)S2fw^TV{}4t6HKvY3Ycdg)(*y-uZ2IW-vK8vt zma&34z@EbCm>s0QLcwe__0j-BW2N;jF9!=)52LeHC`n~r72<1FALhgQ?=C#gJV5n? z18OiQd93g~fpYsQ0}!Yav2%0}LY%0_Cr=E0T$=2DLEc;&kn$#??@lKy8Vb*v=Wj^& z{rC=TVIcj*6)$brFqV0QwX)OTg>8w;31?>Vkl=QUdvZv$aGjQEVy04sXf4rio!=aP zIE5)*rc}6Ba9!c-CH#5%lEGJ^$`G)4CI5)1&!UfL$`w%rCF5tI9{YK6aa?|mVV@P9hY(`{+zPW6tdv8_nKNDX zFFpfc>JLo}++1nZgC-!RN6B0MvIV|~isRu_P294mVsqI#<#PgHD$q|k?sie} z)>?4<#YkU|>*sMp2&WflA3qT0`7b?5$7i*j#Hu@^ErGmCrHZ zU<0gSXS89OSzA}1$b|hsDG!z5Q_7eV>*6qC;a1pV$`8~_y5UcT5f2te$@e+>;-X8F zK+m${L`y=mO%R3~jtC+PvxOQL`MQtDJ~*qr2AT=?>CV63p@63fZps2K!L0;>A|#nm z?D>t4a#b%f^`?V%segY3BF2d_G-X}BoumT{z_lA7Mz0*up&k~hKilxs`az@x!S%l1 zvIECA#QVT69h|g9cE(W4&o)QIj-uTun!fQOn!?v1W}BI$~y9XXM;xO7hm&^ICU28#k37;EsYWk}*8||NHL{<&m=2i?eoa z$6eS~zP;ClYOl$i9b+F}a+s!a&X_caag|lI_45Gm?_Qz7gOObytQD0lP}?;a5gKwk zq0QvMYhC`U6V7)Br(yw3Q*3M2;(3Mxha(tmM{5V6DV5;?sOAB^gNqW?uu6!w%ehD6dRUK-2%<_@(2hQq?ag`wROICgQGo1A)yQpW(dBY3y-oD8fAbZTOe7>)G8|G&rea+0))ck~idl`KS1RlK9vW%yNX zu%FnvM)*3X$oi)z9S{O#1X^>rPt*d$$pOI403xmo32|ja2h!%No7#rll=VFNt$%;s~eN0X4_ycujPQnhsJJT$$# z3`ddLSn1WuBee@7)balI1eK->PS&9BKXAUni9>hpc2R2cJ$LX;48(<-e8pb6OCFoF z#X8(#U9io&K%oJ|O{O)*$n*tN=--W z43sg*219cg0Ut1aj|_5$J*gDF&gyJ?zLN!OU+phjI+ zf`Jv12Z6VUAn+2=3LH9LWkw;$C6e?{VB7_*rW9JXA(x&+_3YQVR?hfa3Of8)aHaXzdOg_U-IQ~y@ zWE}W-51e>E3q>4k!j<%&_|*GMy!JBMEgmf2-(uZ<6OSCKH)(~#Qdgsb*U5Be>mrr9 z0`$^Yu-i6+Anp2W$8CBD!pV!RftMq(Z?Ca0B#yaZCcQCR0hFoEQ@goX+`8m~l^4`< zXJb(dnLnT6k0I&a7q72nxb^{Mce} z)>9Q+2OTTnKPU?$WNsk>kGVyO%w70*@SYV#=a2r(Gy)<6M2}SK>$tTLER`QIUKNBN zIi}=#P+Y6gtgF=H2db{e#80UXOAmLR6}Se515fU!XwQfjKM!3`)1_lD2|b7RW=Y{; zMsM7&^{Xw*>K95@+vi3f*dZA_THZgdxI_CNb>Hh$CjvTOOPl?g6zVq4Ry^ZyUP+ts z9F1q1Za5sO(k;EWpETYfHLs0Eeb~q8#}l+gp2TsR`uv)e{p&$ODwjvHCy z7tS5My`cs<MetgFeKNLq6)Q3unW)_LkP~=;&LLV zEkGo^^0z)KK4@#61U(hc>;47ba2Ct9#qshJoS99@y0QK$4*zKInI7EEhXshN7bk<{m5lE=v;)=Tf=kY z-h?x9yCUIE#!C{Cy$cMK<wF2 z_-k?E8?|q^L*R)+3%F5{k*hjFatY1tOp(YDb}9X1q}L&BkO7kgt5Ubw;)Nblf2q$U z7pWC_)HfwY%9M$N)k?GJ=^Ya8& zgl13ZR#>3r^My++ql^w@xL@_4{RSj92uLzN3c}Oc%xfK-W@r`4W#)l zyuW79vuNjy%3yHB>mdFTpL+xy8O?E4Uj@^G)ORX7z3!}Wyhu!^JF0~MN#3(-GZDXH zr8Y?`@cx|+H*~#of+-OZkJuzlhJ9#5jc0}(d2J2Pwq?26a^ESL#Q2A;C#Kfs+8&TU zp}aQv{~9LmhT&Qe-o8)?=^x)Gm9{EfC?+Zwe6qxN_;tA05c6LJ)E$1p+h+$5uF$jI z{rv*`x{3C%@GPr>okPQ6ar)`y=1_(rPPp4re((kTT;(*5#uc5Cd65#K}=9GTqhxXYj&gke~PhCMUIl0}WK z)u_8kD8R!QyjfIc`VwwK>?W6lO(aP4#A~Yx)5jvn+yt4MAc<$Q#Ir%{v5rF%1*^L8 zegg_^7a?%DeEgHKEkbF<9h1p}w?aJYJODn@7P$ni%d~E2Kl^Nte_6Otar{0xs1Kd| zQH?}`==Y49`+CFzWITU9V%gMy`I;Nmj+xCspq|Q0?(gJyy?r;2#|I`AEXc6%8 ze(t0?tN(J-z#R8N?Co6EDYI$P5TXcQ8pKBB+M8G&o+@eU1?Zot3H+i~Cb+r`%)scB zjmx_7I$87qP->fyn!G|A6J^#Ro9k~BM{y(3@~J9~6VqmFPz5Z9Du_%YpBmQUNpYcG zoIX-43>R)|5s%|ocPvs-J4h%bxV?*W*FGj4ofy(>KgXdE+&(Nc31ABwQa)Q|{PSVV zzIB-dn-R5P0T{m2pRQ3A7Gyt!qSmLNiNZQ`QTZyTTs#Q91^g{$0RIffbO1Le zyTqKfy{Ph)Bl)k|cXL#w2Yb1)f4&V^pXhh6-n^G3*QIivQ{}xI0a7>iY(7_2|doFNhaPI=?~4^ z=g0a(vkBsXy=7|eXED7=&aFNG(ksZAx%WMBte_-68El4yt{rL{kuk`0!{&y9{a_plKm;b*k%|| zh2#745}juZ9(MTns5(|*1+4q77+KG(f|PAxMMxu;q107qJ2C+Y2fN3d9ylH0N8;|) z_wBTa-(T>B`E@xw0c}5tCgxm=-gTI@p-ykQoxnt4tf6plMY#wJ6Zmq>) znWSxH*j771CTb!=855C7SZI>JLbfy%?iK4JcQj#}wKs(mtk2U;!9*CcB+RZ(I$^zy zL1sLvU(8I+weRc9Jl}qrgsh{J47wxE-csp-kS+wdeOlG$u@Wa`HbD(s@xY%n(c}q} zg%QLhNMU*pUyh7EW(Qz6iz1wP5;`tD9OypQ7q|A9GEb)K11R`o$MWjZNeqEdw_N}5flc#o8iT`Tv=-Uk1|5{!P(jm| zV4}%XlI|=iy#&{(hNZf@6WxXVU8K`@?u8-K^}L#!ayccO+fbi>(tk*ypk?TwP8&6n zzx9J!m$4H+C;;XA5Xw+fMb)I?LgeHh3@wjbHZTd3sgI%~#~+pZq1v&Hwb50Q?HESz##-i@&AUtuMUvu>Y17>I}}nK*E3Z z_FMjsAAIDo)6KEY*MBc!ec#RQOU40^X4boNLoLHqrn+_4OAmW@AO?8W;dm(eZI&;UlV!I<$(marN{)N3wOVen%Gg05ynn@=oLTGYN!_n#VlIoLqv| zXTF_Vi+weRIp`?sHm;feuPe2?`s2tBf2gj*b%2P!_niAq<0osyqW8&6a#0~QVO?kR44jn*U`Xx49`7KY z!R~Q4bTCqsvcv8Nmw%UoU!)E-V!s3~MdS20fk#4sJqV^$8p{GG;cT~A*EiBiXrjgP*7@Z$>=^~vu;I5@CJw1O`G zb*#W2(Yb?bx$v*%1%Ht%Sbl%>p}79}EtBarooQ`nZKlR*MlDw}YiHHY?mYE?rfrOF zFZ>&~$6f^4PB^9(aDF8@ECzl5ReMMFLcHz`L#lh&(KuP)OBrT^=SC{sJ^h+u?+)ga zq&)33ofrv`)6cJLoJ=zMiRt=j`VQKa2{c&F?4t#&)}FsDovIjIKzzk-*-gqiVTH!a zLK+Wc`^~97jT$W=>cYw$9rg=I3QEKUfT~o%kn|WNq`m_cihb74EM$_?Q-bm=%gFc@ zC?>Z(wM3v&TnS)c`l#6W$NuO;81R4U^mGn%P#JLQVy!TlVaP%6l)CG?be>9gp3c1P zA&)Q+t!F~vTIMiPA09R39QJ8mHRs(d8L*W}$a zK23L!`+;In%_x6}{}h%TcM|kwvsj{}QahnD^Ll0DA*vE_sYHnqrK|IdS9Rs;*#k+8 zw-h{*bOMXNY1EgT5>02^xB8!u_Cy2fKys&=x}6SiJ5i5MznH~E zYK~lIe^^k-E=_oz=eFnV_#wT`3-I}aPr4B86zq6&IN6qQXJz3~wq@7^JAU;Oowh1s zfNhh9p}JUB1o_pQhWhGZAbl%K#eOZ|M8c|55N6+~JGoHzD-Zt%AAFKy@j4+_IDjVG z$@$9xaH;*Xvy1bwDhAitq|ch?02STzQq$0ff}Aom$*?9ruR5?oVTmd~-A)^jNk+My zNv7uKE?n>W7x*%2#{>xh{H`2vUu1ZD)c&lcgF%Axt5-#-NKETcnp<~d%SZUkihY;Z$A zYf2_Mzoebzt(0`)#%t3 ziuP5{dT{k$zrugQ8jtgz=zhWu-|O)Sz95QWF{bU%Lut~lX*tvg^p=$(!pDJ%O!Fam zfr@^QUm(`PEht+C4+Ig0i33B|ur77z+E(x#dcA-?y6{L#)!E%|-t9?~6YssAmDbJ! zWKoV^B+M)&L1WI!1L^Kqab{zCTIGYsy71sWJ# zNbW+(lI%1tHl$rCzr&z*)wGxs+l~k!){l zNUnS%^n5S^WJdVi<)Q2DrZCPgjUa?QB6bNCgoq|%1O>ba z0;5-G2aM5RVTO^{ojb~8bV#(+m%B(AgL&h(o>(~f2jSZbCu8^;E7_1XOBT3clK7t{ zMDCV|mVk{Of!Oc~=$y{ksgh53CPA$WI=#v>K}88FDp0SAciw@WENle3Bw(*lWndl+ z3(YpWy{o}s+ZtOvvoJ_^&Rp-FnW?Gtkb3B3j>4rmeu`dPpaIE8_P!;ReD_Du%<8MA z$JK)z^gg+SD6uChPc8ANEa;SdQrT9LvPlH)#N+S;5O8`1+^VCI}6NH zgV1kq5G>n)Dpe@2LVI$c1&DSwe+(@TV14a0+B0~o$Uz5LDDb`@4z5~tvz*D>8<*rs zy;Cn$IXJoAHTYmMYLkVjc2k&rRsNzEix#Yv8}hj;QNtGh8en1s44EmW9?LeN%XW*y z7H*SMhs#Z51OIu&_m6X0!&d){yQL=Ocn5nBz2Rf9R%ckr4hlQ*kskM=Z{Yd;%tz${ zlwA)`e&xkVFXY*LZ2Zg77vscu;xZ&^cAL8t&rQ7Gct^fZ970E7yE!3$Zt?}s-}s$x z8jgH<2`aV7k+?J=6aP!ykOiOmg@9MWD{NCq(g}|_bR~I1aXs_ObC=Z~qGKPq-1h^N zzg-SlCq_~RYX4zJt}=EE3kg8K^&pNUIS+CWs$}Vxv$9?jN2N&O%US7778W{xFq<;X zObll8P^Ll$bH%C-Rphrtg`KvwK+i^~QBbyeENO&KCkXt~^-6j&DMu#);ZJ0Dwm4AG zh1*ngNiBCTB|v{)I}J>HoX0f=W(Rmr*DUUw6AHEx=Tng{npd~L-GPALF(Bs5@tM5S zECYc1t^5GuLhCIZazLg2r6n!f;gc$~lHtehIN#-_UZVS`dV_qQ#}~#FHOsvV8oONb z*x0oB%C2GYg1@W`G5~iEE2%bt zOI%tgEI>ma>VVB20Qsu7l&fgdrPl^YkLR zQbiRL<6~@a%q$V`p-l_R_kel`43`j=%D?1&?3kQDmTZE(qm9ISCg&s0y`TItLXJs; zAU4JwGqp70p<)53Dw4wd zTwa<4Y9t+a9wtNmo>Skd%yr~~1on)x-d*yEv!IHD7DFw|7R@YYqd6r!Fh^cGTt4YP zOZN&)hvL8UJL#~_6@F~S&Aco8%g6i*YvD|!u0a42LJZLLz$KbP&&5e4$1o_Dvw$=4 zIP;$(?H$6I@gKOS24vkLqf(!On@z)wYqrA!Zbo1R&wbRz8F9{nmS0);+-}d!BkC zcW}l7SXxhmQ%%<#Q|`DXf%IM+1y4ovImWc?AtP9YEo@`}a~C=6q;n(hW(1Y>K)+Uo zL9OHB@pkm54YVSe$uv$Be-|C5_Z%5+{>*9bjk)0WU5A;xM)UCn&zmS*cm8MMi@Y0T>Zy9tCCa9`+kd$O;=RW) zuV_Phw(whD=3Ds;q1o7`BpqTj+E*{8M_6MaMUL(XM&PU{M zw6g#;GwM-L!S{mBHXl4C$hKfziVv}kyA}5B--H&Yy;Eub)SkhqT%i7HPC1c@bwQ&? zSixA6s?!g2xmVp-I|8YeTWh-J11C1@(IweMFX#ruWYH#_Rb&Js_Ayw5XAXR~Ith^X z2zZnt)w+xnZqu0z*F~J7Uxc3xAJJNh`56%rMIDMf%H2ilb0#l z@`;Jp*;4(|i%0YO_(t~hz?**eG&Qve@$^g{@u&3}D4~Xb*z|h+`P24YUV-V2Sd~#d z?9Pk;XzoG+wDZAJinsz}*>Dxy)^$TQ_wgObzJ|DUc_irm0Ub4Qe_g1Pj?>#sQm;#3 zR}AdSaK>3U#8rdF`G6fVzVi-@-~pZne)EDm%s}$al0^sZ#U|-U;81_)hg07;D@3jH zNRduWOWd0STgmbHGwPgw6LgjwCuoX|8tc4YHSrm&av;-`YWZDZ2G+)yO&bP{?HIJ1 zPBe$MRCa+1-0P@^Bh0!-M9;bhr9cIQ&SWJvXm31A|1+ig( z6CnZt0y4htTNnO}yh`IaWF&l`Hy_?Td-dXrqlM>$BR#vfY^v05?q%g8=Zs11BVxLs ze}w19o6DMylF8(?BA<~yfbNAljYea7(S63bFwy8ekLFUz-~MNZY3+07eXsf+M*e~} zv3O39e#@Av5NQJL?Ap=-7{VqaFpJJIbw%NrgFKn&dhsc!@KB- zll4*6q_;Rz6uQpO&D94lh4$jRP@M8qC)*BpVI}~>(3r587)zQQP#sfvRBD2($!*rk z8}BlMo6KaEy|4alg8;gF)hQZ=F=*@7j!~a^jlwM(r`bgXnk_*oha3OA2-{|0!)?W8 z+*ZD~NE>ZpvuN3>AVNVU46!g3H>7WBZ;0`)_4>K62UM$WHnA6(nP%N>qUdMV6cUOZ z2lEb`+x})~ejn#K*Wg_X&rOAA7{)x?dBECiENMxL7A>)+9R}sT=Uf;!4U9wcYJJ~b znvsvI0d_?PYsO8OLt*BUU|yzLNKt0e0<$1)%D$#>b-u&JHuA~0p2c0Cdp&x#0x=^? zzsVF@V_LC}2VYp`^07HFXf`Jn&E~{IvpMmi`CwwJ|9xw4;#Ye^gcyuU0N40Tp35>& zmWF0ioMGak@jQhZ-f2fJMGiM??(%fQ0{}ty83;O|c`zD5kEAe#3VzFAcl9dKTQh^1 z_(LJa(YQVWH%{Qh6=!Sgx8G*LZHrIxXyxQN%2p&#2Q~rjgHS2JKQ`fOH4Jd6<_I4X4=(kQ^$)xlUv#oly014?5zK zH?-pG6^$WK-&QCehU(4)sK>{NpZGdnKP^&_NJ7Fc#IG4bg@Nk>c(gvvF18e=5OGN; zAVn%UC@(%wj-#KOHg-fn*B;4Qe%(m_^N`^#dHd@JZ8RO@*fIc3K(fD$l1yQVz++@B`<kPF9elGA9&%5M9Mt_3qQ^rnH`9n&wYIPl(Y6#4nKaRx|<_ptVn7}9%htxB`MEXxcg zCB##&*|Meqq>ws`(ia&{m>^R5LRQxyRfAxV5KO{HaXyd*%3?rR6u3yu_mT5sIcdD| zHl&xKM$>;MsEx}WPkfs1WXXcegME+@+Moxb(TN1bIB5dh9b41S7vLI4z(Qq*gInM5 zm8ZBD){1)H_;~BU4Kzt}LOAgkp=qzV+IaiCdRgLYl_m0tkPSiHF6V>L7j4Zv=OL5> zq;qxo(5Ab1dfgF8U{6Rphlb+Y3F*c2?NaAowRur-Sze-Ou__8##mf;nXrPMgOdvkl zr>`ZsVKJm3+C@=KD-qggPDGkoiCcL2s^XP+>k!cai(Lk+3RwLw%@K-0f-pv74KkV; zd%INpvdIm7RKq)xAv!4UKU+~^LXqBEiz)}qk%T&urfsw?MV3T-{;}`F+uEjY z5+XnM68RVf*a)%fTBW)n zt;5No18PZqX+T4tas0S&onBDdz+|w-<#Xoh#_vC^xsOAB7Z0<(Pq*ZTUVHlp54REG z=o3S)fbyiFYp4e){cyVCd7gtj&$E%`_uqyD8G^@BN97ihDOqGYcZm9|W)^Po(u#GR z4SM*cFt^~jG~!QJ3yxfDpzsa_it5XAFz>>byf%IKF?FZrBz?(7F$_N+Eq`fC-pDa;Kgje ztdvkoqX&A#!K=_C4k~Qt zd+$F~Iok(%F+vQZ0&4O#-`pA}k6%BjvY1pV_bX%;)MhZ_a7^)get1$%IT^ye_ff8* zd-jUMdNd@JJ+2_&1DVcSa`p!7mE%Kd{|e+af2j|Y_Si?1;AqUN-v?CRm1=6&l)6@@Nys+TQOIjCxZ)KMD3f>EVwnl>IW>idyFVZ;)Fl778#Zb zC_DW9oBWBFSSU^l6jkOiCZLNFL|n{}%m7`tpw$vIdBd7~>ya&DjAn}Jv>*T6`hhCx zd>Z?*9yGsvB|X}Mz6KsKOaF6&r!68FdSb@?0$Vt%GS};}(MGRqkS&e*xwRb{`m9+tS8G2I-I`+IR5*Q_#RR84tEu!P=y&sQLuI?v`w+Au@?mq9RI? zDOo$(VlHKv11bL??)L$2hPLR(+Tm$%sY!Nl;K5H*6m-DCck2R*fM`J>OarH`err8Ck*IxT$>f86b2x|!xoKg3}hf91{X;ItBR8&)T4 z;ht}3W8-@;Kg3KguRE>$#Cuy#i=hmb5>(9TxcktQVdp-Od``?;LHe|qv zl)S);U!+O76QgG=Uvw7+Tg7||y_g@LH;&3mTLa!_-sAYxUkMk)2MvATI;c+kV1 z#z71O6@75ToG8xhD{01U1Qocf#MjA_hD*n@{Oo)3B+~^gQ_VC8W+d1!r+lu?tgpQ9 zqD5a8F#>Kj^ffrtIa@mQ&(bfw1&tpEOP2ws9r}`c9{6BTp2zry^fW{3Ean&5>n{2n zrE0(4R;G4pT0knO_wWU_M_>Q*khF3vTxxH@e}cbWnIOlLiVs31%&hX`&%#=J4bdhYJIR^hN3M zTcbgK4GGk-*9j7Y_Pjh78-34#;YxRkZH0MjC~4NF`OKhBB!VmFT5`OCdKM}&sXyZwJl z55W^0SZ%pjwI@C(7-lK8@y2gp8A9@}&9(_C4 zGT4u}HpzsAgUc_BSTyZsI%jB)g!TIuD&TFuCvX29JW}#YkYlASshfu#- zN)^TDVC%&~Eht=BrDmtyOLw^83v9*`mvwf}2l9~l<=Q;tl)G2MvCoRONcOHr=(=3% zFO&$~Tlw1AVFh8MBw8BpY*P((c zn56(6(~C~WMYib)c1kIm%w+?6%|Oxb-T39z+&lvDOLoDLlF$qB6*JiuGfz$KA?XL6 z+^D;wY(A{mMx@d+N_)(K)=3&@9M|t(RA&WwMacIK-qQO>&2{J-D#;)Gs?_E@AQqG_wJjCn0Lu1VRDdM>h^Cc2Oh32UH{CCC!REjh-zoJl6z$ zNu4G0xPcohgg;XU#A1R%kK+*t#JT`Sg#^iR!9ioBPnpFg0`kP2P%-}S6RvQeA# zou)6w_gKXqSa2b$?fqI;53f11P?&D#+ass>aE9MEYWf3FPm^MigS5q&OtZW3If%G@ zHKR^34rTtYgeefdL1l+(cKSPjE;!LEO(j`>YG`kTzV+gy@mhu`@sUwIcFSqFsO8p% zz6lH!FOJ+ea;#Yh*O6jY-cEyyRj@EZ`&oV>NZ#f$EiPqby6#>Cp>LMphSyEvm4%Mp z$xR!~Z$j9377hue+dNk_1~S}j!;Pb6&=miT53b9%odI(L@=yHHXZTIjiYW|7FZmho zWOzac$j0#M6ecU@zfOn`Ug!z9R2e4?tQF%ro)nhjQ5aIFH?TE#m@8hnQfWlK%LRba zvK8G6KOOoE#xB1ms2@Ca$V`2}lyOpwKyv>M=Ya-Ygd_OB*f;`IirD+F-#;NnI7Z42 z5z#ph#6M?j9e@@;M}Xi-2BUmSt(9N}+BLRY$ag@WVWKDyOKGz7`7A(q3VqQWaS)L(kp8U4-U z>~pU%g7>k@zf7AwCc&VzJ7ZEZoiXo!U`xxjD?KQD23iuv7w8=cNZe>AHZEC`BnEyj zRjlvrO77$f4ld+*c{T@8;R&9Y;UIXSZt-!|892Rhvb<-_j;N{Um-16TBX0EBUQ8e!FaB0G>l@7gl7tsOc8!FvINk+Wy$0j}F zuL_5UmCcWYVsBuB^AeZaT}s8HKZUnrq?BZWJz=1T;U~`^vB^`P&d%X@;-7;y(?2FP z{ljzByUgIo)?R`1g^qAl`~5D}nB4*Wr_;0GWOG1x%)XgnRD~gwA%8OV0K2Nbo`o+P zPJ8+|H%Pu=3y`RJGKV-!8qxaLw5&csj)|T)BE6>2kVrIPK)Mff!4e6hq6}qTR5E0} zQlL;;`HIRg5}1-KBk;KWin)?|iA&dwKL_||u7r=IjdBJ(u|-%1&)_`$4#VT4^RAeB zoF&=7$gmAG{e2l>_^_cgE>MQmJo(2K)eTe~Q7Z{Bn5vv$b?No7k00QMzurArh8>4c zWlYtF^Z0Sp_puggAZ-d7({23;3DaNH=NN;X#A&V`(Z5$GJ>^Abh0Y?PJ+&1FGcHQ) zXqlVjg?mz}BqSH!&#J&C*yA%$vh0Cu`cAG+X`7nSIZ$ihQ@C}%R30Ko6+0Dps90jb zdA(UtXvLRJM2z-pq^2T&HmT+6{))TmHZDo&Em{IOACrWp8ZYc)M(ED8VTMB;WmQ>Z zn!S^~VbhRnQnn}U8P0;ClgdO9{@BwkFEVm9D&tam(7VxLu+0?`&qxIE&6|e4N%>Sg;H1)H!K`z70zI?Q}_+3ZFvuSimqxXBt|zQurOYzVoKDlT2e!#@H!>cdnXN z_>@ISjSd^P{cYmQ7EX~FY zDR1Lg{fjtG2G?$*E})Ma!K!U+VbS9w84$L?ajnMtGj-2t~(y6c-!=?VN}@s0bJEMc9#x zjm6`QHM`YOlc;%-=f7`W94ZDp&J#xuA$+(}06`42FdCtnz$uK^a5q6nl&#N7qmV>` zCM(%M!+)7nl98oZIhDe36=-8+I}1BEY2(ut=ow~F0;0JcUZehXKVEm<2CoW!GRtq* z+M(@&CL?a@k>Lg$_RB^!oskHvrMS1{V@`!zpRf#0G&UkN*6cb%N4Unj0pV^_Qr`@KU<}NfeJ;_izrRpQBm}g$n@LoJ`Q3y79n+}~&crtljLTy5)hT7@ zUx(^^(|z$2t3NhnbjQ<_q^}}%clJLbPi`4DJl$$jigAyc|1ul@i;gtq9#}2t_)@az zc=CGz%$f90(H$>4#b462j~+?f03C$-hQgYtm|7S52@mwm5#>?hFcslS30WM~eF z{579~BZ~JPd=x!LAe_BxBfy!VKm7?t;C#dZh^y^*c8@&;%-#;+^1vOFROR-SL$lhu znQqbMteM%m94-hyRJLyqqivy7_dZKMDbOF`Dr)CG$lHTueg=+a+P4`at=4M|dmheh z<#iMMWw@4kH+QMcoTH*WT}lNW&@$A+h^&cdkvWGyt?{G7r0#DTnNO#N9QTqYt_Ac# z`yE=)t9Ly`OqqT%Z9Qby@7apidQ8u)m8?-0WcB|n16Wm^BjWHQs9d}!Xw<0xPHYnZ zi?&(>vZiC2{CVax1%bWETrd!7Cxw}b4 z^?LqsnwQcA1P2q+7mx8J{PNrvPB<5*-79g+o)Twp@*+;}#N##|$z@f)8^d+4_k7Cx zdp~_#13c|pxsiYQImsRDyh&+RY|flW%!#B6JstNhxRf<$ql~r*0(=FblH+ixy|th1 zqaC=5%dI}UYu&Fm19xS)Lk~tI!Yk#rOsZRiVnGNqIivjd@NCXp| z4>Jim+vJjzLG}w0<@;t1SV}8!r#+N_&(C?{`UTQ^IvOOIA(b)mK zr@;a=3~n!0h$ZlG^ZL|iXaMVUEvAPI1gSlTCmp8AMVV)yk&N@{AolDDT5iPlg` zyr0WSvjEkE1**D(#d8|=*48NwvK)GDoWvy1>Ejq0&_QwRAJh2|Lyw|;UB;UfLBJ$( zh5DB`GM%K^v9X{y;q>I|4{fYCb{uxqBgB(Zf|vZ(wn3kZ_>VCWUW>5DT;RBvw1xO| zTcpEwh633E2!|IrgLqhH#+>9+F;^Z87LjyExNw{Fo z32qoTf+*z%h=)iBeXJr_FIc@0MoF9~kbH4bWQy6sEocvDt6E6nO&z80S0&?8+rxfR zp_2l_rOjYx3Ch!mC4UHeU@l4BisPDURf{0XBoqynP5u+04YyEIL*s{9SX-_v8k_jh zX1&uD%R}w=E3wp$q=?a4e2&I~f~80Ym>hAG1ZohXV35jVb z!Xj-iEp-6mcOr19hdz8JScIl*$_bIyv`fcKrXb^LvONV5=tGE1&!VY$P1SZPjjx!Nr(x$R%|^C0x6KH_4p!z^c&wsFo`U9i#^v}TR>=L-6kFu@j9 zCtp6TB+i$&;tFz5smRdOUX{sYS#(;iyKiavQ)HV4nhIY_M2xj}JNtU}evM<6F^}sV zbZTKnL3dlNsH;UMt~b9pUr01M}n2zsrqAWm-eOFbL!Lk7gO3#JWzd(-t#crwK6oN zXFSQ0NsLU3+qvhcy%q{Hc{mr(s$hI#V|(%0h0Czg!X=JjRsj#Pxb#GheS`9{7PWDG z+cq=9jFle-u`Ad5{!p=i;sdzCcrl);!cIMSdkps#V#N-7?A&4c!W-y;TS07M$C4LB z0~er ztX&Y_e^M-15d*cZv9}LP3RMo8f|nWp*tYHX{zN3s7Euoco{Iiuntq$Zj7aBK4IIXOw3#SZ(bORy zmlV)<<+4(Go(QxTmJy~)mP6?Ys~=seld5J6`Kp0Q($^>|EE`CFdd(g z)nVSSba0&6Rj-zuFgUHU$-E;mH1TemOMz0ua(>BDe1+>O3@+ZCe)HTbT{!lS$wM5_$b&$O z{v_3A+?lu%vf8p$e+H#I*#3NDtezq?;s`|?E?l^9;bO~{EMJ=sc-_kiUq>Fd@yuY(9pi7nE9d z7d!0=0qKLeK`oy{h&jL=<<7_~b7e^_ohy}e;U{nHo;Pg`jAt*b)$>yw!(-?k`cwCG z8Z{<5nkC5cJ)Qh=2B#F(>wX3rtO?6Zye;=aD7nrO26#5OYO%F32synK}_GKFiy-`Buf)as~NjmB_cn8SXA|5klkX%m#{YoWQx&! zC!GW;?|Wh7Q6!M?kMWEgQ2aU>kAe|NkIRgA(B>q9rjC7KHwdVY8MI_!t?9dn<+Au>)=$mJ-_ zK{ru9`|;~ZU)0Ad(?*8Dk5C-bysi-mf!yvo&m*;_E92WC|+`=wmBLclX~B9m3gdB5}yuF}{y(M$QG zZn@N8MX%}z9e=g|67T*G6Ao?%ioeo)ef$)9M8K^`!bz;He|~ z&!d;ZNrE>k-qbJ(%!;k(5%4vd{9g~g{5t7Vp*^5CL=FxS2=_&Py{wx6EESIQ7gSb4 zbMjU59)ia&zW857YXZ?MU9ji@a=11)FFht^lpekhJYMV@|1S0uC~vq^E3j%)g z@5a9D8%d_yKHqyD8%9PF;i!Daq!p{S?K)si;2wYVL-XvJ7{pbGe{D4Yw6O?44*DU$ z{=c|~5&lPGXm&eR?fl|z-Ni5d1;jfI4AnbC^D*-1&@{TMXPR|qjb03q5lm8IBbeq% zysn7Ag!KettAevN5awP>qcEmb{`FR2UUuHj%6`&ornambX_u)PdV5vk|B-WemiHo? zn=jlwetDlg0^peTLT-4hRaq;uIkkurZxW~U)1qlyGdMD?l+!gY{3#^;0q6Q!{!SVL zU;Kr&{vaMr!@~yv-iFbGt$8GH7z~Hh>N8pm9xSN~>%y|G3eIv1k8MfZL&h0YAwyw;TMg zQwb1>qSpoKCx|BWG_uUwcl2b-c%}1xp=F-ha@r3U1Z1ccpFYwwuBnkv9$m88(A4&G z7W?g7+#@r(1cDX-yv*_dyi!9ScR*#RUzi23`sy!xfCrIu9lMNKOa~b{(jLjqiFG>L{u#oN$NXc-`5epWeCnCB7>A`tSH@)%bPXpfF`AbTFEJ zJrnm;KgwT*A@0j^*ZQU6HkuvihQexa!{=G^Q1;Y~?)y2GPPgMzyi`t83Jn0y zUjQip5pr1twX(M4iL}g|E5+9<0f>Rzbt9E6^u{efPqNoT%uVkqXo#_Vsx4+~In0iK z!F@K(Z^EtFF|dUK=8&?g^yEOiXLV-+bVw`&Y}HK@`lP=jyKmv2JA2m2al@hdZxMXlKfvC5OW9`+03@@JItK+p5 zb%g$BG+WFc)TehocYIDkeerDKD?r!xJm1Sn+?1HK4G7H5N3UwCb1d9y-qo{|041BW z^A3L)=QWhQuYDSLJK}mDnvW86E-dKQ_M7@QzIG8J$mKVfL7z*D`1@falkSm)Q5a-T zT%yn=4?$Om?1-Hw~LNHmo-QqBH$EI-kM3GRw2X|{(fevhST z(yx9;o?L<^ixG$4BT(+i0uHsG&+P1$21K#zLG9UzD+XDh{YoR+DExo3nczxifX?oS zeyiF6sVZ~jPdp8St45wmhbel?*^Lc8b2EIZXGY-8nMt}n^jV`s`Oc*NnkwKp+xd+> zhDe@6<)AhL$wZ+r-f@}XTTsdPE`8> zzs~dN)<=eKo@YFB3796Ba-FdR_#=2OK5~I|eKq zD0rJS$OQB((6wN0yFd zyS55E06#AfbFnvKN$B9r1Ad*<(3y#&fkT%nE!NL1;sHrY`SEHdHC$xWXnCUhvNZQ=9oFCf#m}yPHY{`cQL)Qrlj_rxg%7}>TP$r9x%kuD zl2HGO^n3J1yzTUEGOlD=Q;OB_5XTx$jJSqc+K! zO`o$B3#x82y0~}cx`19=H|Yh3s9d&wc`vJQT?)Lx%f=w+&2Z%}SJ~p(wq^7#4X_N} z!w>^OFAWmZJszXo)ohRYhM3-=VQbcMtY#AFNNgFubdD+O3rM=;<+L`&%2EWjr!`zE zQHCy4&?hnS;FURi?oYhF!YfkuS}8-8(3{*Llha)@7AZvqi{xNooND&!?3km@p?_d^ zDJ3IW-rADKzS2_&DbPMhZz6A^b$w&>y}m}k6TcW+iertsV}-gq67|0KWh2{dcBjT! z8<_LcWP}vu2ln<*P=Jd)H`I#Gl%Xk8 z@o-POQUD7V0)!FmD=T0T4}V4TU&^6gz0h1U(==^=lR-m-VvkQ|3~v%tsB^6LpnEuJ z!+Z-eM;irWPPx1hAy8zQr5TaRCctzhfy5$`5GmNLfu)YzPSO*a-lCHay?~o5_l4AJ zu`8ugc8T*B;}d_wUM*N^Wq|x?xl48pLlmaKoVn?fsjLu%37H12OCpI7h|Iq-@T4we zN!X<2V`=r+x_*q{A)=QQwD9CcU0&{Emkhm?Is}n}SKoNPg+2}K!P=wNEt}Wx^qXHI zlb`8j@%%>^KTX)fD2b-XZsVO|4d7WDjQWIdLK;K4jj1V&+?JcXj>bw81IOhE_uGz` z4AX{~jB*&3tESSOZOGm+<5!rl5He;AaKF}3?lBvLcBaFZQI0Js}p*NYKeN(L3mX1My^}( zDAOp_-HAe4nxPEf_HufE$fUFTFU|*N_=k;TNwHi!VR5>AV(;pSMFVA;mF3gZC~Qi| zeWfwRMuPPbuJrMOAu_l@Wdo9o+=jV73gy_Q>J{q~Ni&0Elr_hnD3UPofmBI#xpmeQ z$=Rg44n;usz;gGB-tsg)lImvJva1kZQiTCEU|> z8X%wn0R#3jL>X%c@ehv+nCKSnE!$rj$ZIw^nXEsQshk_!lNwIYg_sc{Zyb0(l>dMaq*17l*FVgX>Y`lGx9(zMqd78Fu^wWvGsz-M-stbg>hDW z+nN%rj+031`-#2`KG7|P0wzwdM6hV})aG$10m`Jb?{1crS~pwa$DT)3`HS1Nn`io+ zZnN%mQ>wi?ahTd%SjFD0^WuWDGK<6PcWSwK*$q0iz$e|`*g{|Arm!B=aoB#x>j$-& z3paEo{qEVJI+@z$^97Dv(}14{QGMyceoOSO3QcEmpTh~XnsAJ?mIeDKrl7jPOu zQe+*o$>2#Hro2xy@}u!Um5B|+o{hv+D(*F&5vP$`c@7_w)z5h-7x##4c(@)2R5jgcJh~IgnW#?SVB6jPx$QcP0Ka-`9t+-9yH%)LfwBb02il?>G{wuk zCosYP&II`-OM|5AK^0(AjLq>9$@#8S)ph>qnb0?c0t&^94qbP|Y#{CRLgms>uk>4q zuQ1(CG_r`suI_}1YTH8etjdmmNCYD|9a(r{|M}BqB6C}dAdSoq74@d<4en-5(IuO* zjxWv%;I5~UA6P2lZ@(ArM1m_3J}~9JUX+1}yV?4@b_ICn!j zEA6bH%G%@I`7qa?jp#OKB0((tBU6z_k!i&5%Ao9BodXlx)fHs)jzngEHdiB|a1~F{ zcQbqIwcWzKEO#tx&cU+6JxHCsXp!$P3U2 z)E_r5X|Ku^|C{j_W!*<*-x&Cw8bQ`(rHV5~yq2SzXWeH&BM^dsgaKMuz^N&r^lr`y#%|5C zjXo?)k*!z*rzLNTIdeIQ^l0BI{r&W5=!#4IYcf(_@k^5-1#RixyAxx6LK-f=2F%u* zlgqh_@xrerm)jSSLx5SM6gjOipXmKQ=FrH`aEt9f%Lo+7rsuf%mhbSES7)|D-@vl9 z#4dle2sP9bO8Da?NmM64Bz<&yquTzx{$p#bv%6E%cj?n@KA68K*{Zd91}MU<0Z}-DIKPOeMwXA(Z#` z1+TgGLbwZh5$FI8b*ab{3n;e2i!Pl! z`EuLdeLE{TU^~hOnWfL@LLo^>0QVzwJkjm{4!BUbI#Y+Z(uA!G(Xk~8zZ^_Sc70{K zZGW!I!RXklbGc#08g8-{EOR)l4iWhvLU#;$4=oy|C^F1nVTAt$v>6a8cm)N&9`ir) zh~b=Y@BU=(?j&kYY7{SS(nFT1#+w+^=Z~YS;M0jcAW1slWj;&XsDZUBcqGu%z4N!5kPC ztlC=l>0wi2ay5APu!$h@sf*WC!-^)Q9quk|>2NG^b8DQyF(i|_BuMZ%vQ`oym32rG zNrXsDq5+vx_?uIL?V258$Ut?q)jVBigS2`ztzTU?ukv_^#*rhDed|o$ey2-I$wVnA z?O|D>^r0;!=aiN=lNm(t#`b||W?jcQSoYOdjJUb4>Y!h#Z^fYPtcj!B^f|Kc&B&^_ zxqSmV-;$~tgiM%ED2~G9;^loJaenZ}Du%|Yg|+rV-K4ODz^ZV)=N)8^ol6P{m3@DL zxa~E)gI;l{6ndd1%%mQ{YR{_z71!w&6ZdCKo?sh=O;99r?uH(();85|5W8xY3zyv( zh!HWGcuX?Iqq0eJ8)~|kSwb*l^u0KeAfrVtIs`*9$Cpu03Rfe^c5e*#)kd_+<*EQ7 zPC9Uz#}gLKRLP1@H?b0H)gY&iQe}dWvKqwJX@O+L`Gl;mIWZ;O>+T3u&6c5EJl(o* zltX<@w_3b9QKq6EeCE_fF6zBxn#m3uEzH-@d{^Tlz~Y7ZE~;tYG&Y5Y1vOm25PgFU zK?9UCJ#JUp77d0JMNT2EhO|G}R|yFARIGZ~;?cb?)OT)jyu*&5v|OwE+!O6v2GW8G zNlH7b_B?^7OAj`(p=Z=UW!l8af=d;klu(z+Rx(W1N%=iV*hs+E+D_zKn8B0i#`h-j zyTe?z$;?e*E)v=?Q)2Rr;yYF;9`pA7$xS%JfFvywnJE@5V$oSZYvi)dL0RGCj?gGl zQF>5~K3~}O-b}L#7eM&R*s=&%oWzJD2Y>PvmS%|*B$ll7K?gJg?no%VPqqAT?yMkgb$naHTIeH4JR(v$MilB??19eaA5^6(r~5degRfEzL+ zMP+SOfz%y1eU$5?*<@VNzL$hX^9f?wa*NmCvbwoGD-K}Uk9wnrfWO6>g$-^)@s{J| z@_!H*KLzy@=ia1!Pda`5rJu<(z(3ABm+Ncx0d`oLg2fO39pIm!sKB$xJqx_6PtG-_ zOzsSm(cqVsIaeLO`}O?7=>f4}1#r}YK#T}87Um2MJzRIaj6LyB{-T~SZE#EJe-5Yb z9KWo>V{+^Y&<)3Crh!?%LskV&I4r7Q$6YXxUnh{=Dw?sZX2v*e10`Y%5_I!-|9J`r zb4N5jP5iT-lFqBSHaue4_u^du7SH>`q*Z1h%m5M;$=!+@Tg*h{>F4yRO+_AwXYW>y zv?Z->D~C6N1M7@6q%oCxE@m8)F50qVT2t$Pfr&wn{-uU~{-?ZY;&Ze~3h0tB7hxfm zmtrEL9k19{vL0k3B%P4k0p!i#%Q44G1d0L6L?0KyX5fjbCyOazVU}VhU5yfqgO4he zmjC`swBoe9Ya|OBGBO|>YB%)lEIu8I4jtdT>j)XKagl@^G7q>vuwjoRmbVq*fTZd# zFMkQ#5(5>Us6_&W%~)zD1wy>eo=+p$`!Ro^nI%X2pqKE+JC>Lo4fdj*F%uxj0q)>s zfy62k#9hK5QIU!b6WFBvUDEw-zWW`61Z>NEAN_oXZdTgh%-8y3?wtN*d;cCt)Xf(j z8oG3{qj%B;BjZqF9%Rg9d71IVP?TamHe;py&6#E;t=5puGq;EwpgV7JuiszKN2ybn zu_r%}#%*yQr#$0ZB5^rfXB=8?Rwqf-*Lq)TQ^UE@J4Oip8=s`>(Z2Qj+moFyPWuXF zLI|QN=|%9?{YbpkxEXt)Fr!Nb#;!hdq6o%+;T@mY36Z&o^dRb3OF)NNOD8&`CjLTn zp&4?Fv`a#w(i8zMmCLfiaJu;TMtICf&M+fR&go-CCY$A0g98o=it2zA{C7f{ap4dP zK@RX-C8isaiJc9_#IA;Bbl%otj#XketHmDHxV?vC+w*PDFMK}Rx#-BG<$F4(VX1G$ z(-3tZct3i1+7N7J+Wh+^mH*Fu!@ly9btJ*WHFZ3KIzc#(BZuV|k*w!(BNPcB?tCE@hr@>{xk(-EQX4B> zRMIy@ee5tfKn@~=Y+)F7EQn|pRLjo6F_U(b20T5$DP$xY@sEyvlGT2atXC$g^ncIT zNKgcv+zPTJ&=ztsE{}6&RBPZ^gX}#W!Ok(=$6kB@gFmZ6Uq0Q_M01*Fg#&0s-urSk zl*n<_efQr04-{^q>=~@{I^fV|$*8QtvA2!3Y;*B)IuS(9b7WiCBW8Li?@7=Gn!#@E zM*)AVINa&{Zui4v% zFYI>$26;%?{sTpp1)}@p=v5FlAlsjq9YlLQcObNh&)H}yDT&fB6Vop55n>HmyfNbl z0!7QZD}Q!Yl;F3gS34qV${cP8E1W8PRbdb&fp>U$aRL(vzpWHL1pT4F_O|}ucPb7R z`2FQU&~BxeU-37h`8Q5vCKcI^_QsMR%`r{7OU@=31yR^me#4kaOZbf{JBy9VmHc6b zzZ_)uy))Ygl~CHGyUS~EeyeZHq>@j}4HJi67i$ zGX!O|VuZ?h^y}Wu{+*GJoJ^o^`%1*G$qzQ>Q8f>*i#n6+Kb^(64SdLi0U(ct?b6v5QJwgzFxai6 zS*A1|Bv--m@E^$%1aH*9n zS|NUwfj5Mq#c}J{*ep=z=MqyN^#y9Z`FDJe1*zNqF?oKGd{FqV^93AbKSRsL-^Soq zyT%tpeO&;mFD7?7t`+B*(h6NsBq;eUoeX z%<8F^-XF)KjEK1>?bisYH=lRzDg6)SA6FtaF!}oFH5Li3{JmWl1JBN{0}nE|Dr|tjqOMnR{|Uqr%(L$TxsxtdR#v|_-};CEl+Lr&i)B3q7tCkF+LmH zfdrpM#(Uh6SC5kT##FX9DzvRl8%@3!#`_V%QWf%&`GrZfD5R%2^M|vj`ajJRDR%a2 z02>QcnbZ~yqd|lF!*9&_F|@#aJk%ev=4LvCK)B^ba;DgPICV)r$Eb*C663142k=B^r}cseB?SM_#~Y5Upb{G~`OL90!I}HR%&q;Pd!#WI3F#8_{5s z0S{r&q*(NRI$}e1tWN}3NhuL%q8^O3C)s%*6nA}3#hnYn2*hRT!I4(BXcU`8-PoF7 zNIw^@3x^b2)&)a-PM!W&;I-213*}Ub-AjRq2shSjAfn>US?+L*A|NtTF?RoO%oQQF zS)`3!`Lg^*US8GZK0!u0$F{uggJ0_U>@lxpTvR!kX+eE|A<3(PZITYd>Y7qG{bFi> zf+OnBNJRXy$Lqx4$S3I_7Ubp@11Ii$@4k3E>1t&=Nev zX0hEVGs2qBM^c1tzLm_|z)w$z%kJT8=-3Hri4og_-~yH;O-kq&fzg>e|A_8qykM0QoR7FzPa63`nDY zqi;T{2EuM8g(E6f<7Bd^XB83@Uj@;Jzu_tzx_5d9=gDPws|`tJivE2ld}_> ze(7sbtWl!%RJ{x+jqRlCcZS^-LE(_6;Q~{LSn7}!`uyRzT;t*E;wfX3Hr!l;Cl@2f*uFe zo*xH2zo&98=iWnL(Ff_!_n4)GCz{u|S#&R-yN2E4!f(ff^yp- z=ms<+m`}Kx3tq;J(dX{uf)^ra2|1GijoxG{pg+4Ydb$7{HX9YzugnpctzIq`1*aeh0j#4d@rSAu)wwc7qBcd zKRDp$3%9DYnlA)P=KXw}c-$dPU20(Wa0iLZKe z{{YmIU6(JG!i<7NU&l4L7=RvWOzF=)jp3fsDm6dJn(wda6Yxq)c;PTd_;(8GZq0z@ zu&(iVGN|gYX{RdJjwFB8+jw!T7HQ04xO;25&B4r7 z>RJU%4T9fNudXhZ9M za51w01Xzp?)e^&q)q0M?3ajVhLvoZ{=eGIR0Y& zft|E7YDF!5OaRYs%QG5ca#R@J)VX3i{d= zNXumfhxR0pB;&QW6$?9flY3tYwML#3x93_FKK(HcxChHhn$*vrPA;T}5`JxCIQYFsX(%MBA5RB5hT}6i;Ox?lhwMWMiNZ4RMhMa z-23mvh;{mp&p3zcB!keIm+4Yx^68im;2Q}olGNF*5y>pxE8~?FNS9_}TtbE-X6B`S zy5aU?EAH;4al;T2>(kMLGRW6yQ3um_eh5*kMf~h6&*?qkAWP2b)zRFrXwmj+1&m57^a?|~^(Q-9gsc66cj-i!csK=I&syMc(z(hNN*`Y&MI40yN6aoITMN=01 zKHLv%d4^*MSag#aY37|RCb{82I_cxg%vkJJlH<`wq;PqLt7i-;mta?Z7N8}ofTgfCdo+th z-t?74+sO{-#Gf#vIj8K3s1$|~1Ye}v=!tE0tXjks*$lD>L6Cb(x;HQv53*@X@*0P; z-~Sj6W(cX#tiQ3+G~Fv9jDx2zK?b0w1%p=+?8}cJkM=}Wxk6=-JfJ{L5e^?~D)5n( z0;?c2rb3x64t4+88>vbBND@57P$A??8q4kUpXrAdWrMW3?joI=EoqDa3oRjy(VZ6! zqBHhFQx7PagFYoH%=KzM{M)|laY4R+tci#kWQK&h>yH`4dAhQZtO4>1T|c z^)6DoW`c~ZYca5 z{A-Z>zc@nTW-=mW!Wq@d92%HmVW7!$bjbfmva_X(4PXwlo4Fr zn;mx6q+3H<8-JBg)f?O&u5b6?Iu3a%+&8^&PjR2T5T2V~d3@Q0`b1G{eFXt02p~4! zh&)4(q37_?n$HhNZS z94Gd&f(=sDbvCxtYa1?oVSG!tq!}&6`MfR;pQwa{H8N*q56e-pYks8xLGj0A ztrXAcnU7w+z`Y{r9>fSaq`Zt1fM${SYxf z6Cr+R5`CL*rlvT}VYob+f17%wZX*HU;h3?R>m+ehkVp{4pIBXDt!wi%K;^23YfEV! z3Y^Ox6^-K-Hf@2(N5T|QcqB!FOlnBSCp;ln@$Nw46*tFl$IPMwTTA#kUbeuA1uWs# zD;G_A1=x#{qC%}E(nS5_a6}miQZ-!OAsLV5JIZp!q1CwJ`3S*aqsIY-F0DEj*o1bDs00a!Q%m&+>JN{hHGFyGI@F^nm zosn)$;>(9e9aZLeJKXkOeek;ptj$jWx5S`xMvGup!0+9|XWoWXw6h2 zRX>qo!y!$oc`he6XWaGRqBZ*L$#w#@5Rt^u5RuhE@Xr~vy9gdW3-&pZf5ar5&pZB9 zRz+u*pDbrz`QM2$5IM8a&6u7Z1pAadVgRqool{*blw8U`z{5fXPC6s#Y%92NRL`Ja z#!%>i6EE+Za&W;p9|GqJ5I9$az)^Yn+Yt4n;%z^>x087}U*fFlFXfZ9z3UWIiH}=9 za7$r+#tNy!$L9|O{4LI7*h&<+O6KmQ_b>dziS*-*W^g#f>f)tk0msT#tAWQlxt$(; z276hPq`Cb)s!S99A6wFE;!U{Oj8aOIJ#&U?zwnBWjzwfiD>@Nm4- zdeV|2d03P@NfX7?F#W`x4mNfE7dKjsQquJ}pLdO&C zh?ozH-j>}{;4(p)2}YQ0qe0^+MT5rE^hm%?d_;L*t#%k+Gc-gqa}#L)ZjMXsGp&fa zcNxJM0r(GKF|2;BE&+Vvr$k6btZ32))bD}w2&^MukYSgQ*!&UYq4|=Q7)n~(YrA_o zpuYG-#2a2jqdKt|Z5jJf-Qa>c)!tXXmK@l6 zFYe=hD&XrHEjA&|g+`G_v0w5e$lZ40FkX@PnFweh8Me@uHZov`reIcrXX2_sYm~_p zXlMXk%NfwMjG1(A%4TJZLRF6^vCJIU^GNp)3~4}-j+4G5KML&Hq3x6Q3Hy|NLQlif z0pn*E@_6Jl;~(`HwfIm?HGndvlzJw2cb}ssGv(82Hhh3Q?>@#bx6PR14%6JNnns$D zbnu39W!b3;+rBt&9X*2)Ep~1 zLTr0?X-L<_Qb)_3)AL~wH=iy|UkFIB6~acW+uAi-DuaX=rfEis^5f%1jmZ2F&=shz zbOc(dIP7mr_P~7hms`+6`@i@K)zwnc9oK2`wY2=&y80R-1E&1AIsfq!BS|xT#zeqV z$aU+!BUmkp@u?FLBod!@<{xNv@P@-W>T>vT1H#@Er9#mjrzjWGgu*H2Fs50ML%HPx ze`lq6DNPP+^pS1JLb1dGT6~icvC6PrA!xOTXIg>wKCg}EK54@U7R5SD?HZ8{nwyg~ zhv!0V(0o2Jlnw9Kt}xMZTL{1S{+8_w`2BIWXUoP7=#2qrLTFQ}d|VquHJVcbD>tDl z3TR_cm6MVDo%>Tv-hsj6kHnKYx0%&;J=;$3+voF9?5vU%8Dn&|c!^!#~hsWQ4c-i~CV!ZV$Mce^oIA^7+ zK%4A&^Ic7X9s>(0K|)&yIdrn}7s`RJ_w`fOmyd2xYbpMC51oXKtC)x#Y_UMj>ykge zZw*vbVpQRrx@elTE9tJJd*TN%@$hgI^6`mEM6mJCr7z!ZTd!rK6o6o}g^m8{uzS0~ zq4#GRs>p;>CI!t4my9G}Gt$}#**iOUa7nNkH97*sIDH(VL_Asv!MdOhe#5jI6=G~S zK-xS?pbco}cr^#j@UNT`2y-T2$_Cd=o&7m=p?#w7bsKedoDiL#yGSM(Ge3n!)FNgV zazm?olv$M1dO^z$)ALU+=C`|_UflcX#rI=$tgbs0U)}gIUvgn{Hjr%ru9PWh8p~{S z@+0&8p<_UqC|KR##AN=`q9i%|3_@kO>^d0?65 zF@leX-zj}TdM1N2DY(Q0CVmdys-dvJO#Kz=Qylm<^QmYne~EW|`+-RgJU4G=$xrEX zRzBd~KG!FbS-fVT)=T8{aPL~v(NWKUqbz%-TlQ_P8B#c0kkTt-x^&UmAdo?#>;zPH zyWRf$*$qOqijWEvW0oCBDaG-UOrm+NBm&x~H%%B+_lh$5(Sc~CbVORd(k&B=JNEPh zKM>!TknoUX<>g<7l4Q#~ghh(uf(<7IN7_m^&B)hFq7N+E;mK&YFO11#y>e@-n7@hS zutsz?ra_Zw8qbKDq-jD!S^cnPgi2`;?X?nugQ4A!$48O9t>qmjVwOLc(zK znTI||*q`v2Z#kZgshcm58M;d|iU_~_8Wy(vXx)422VrS>tgCWGDQN@+7j!X=chF?V z%yh@<@0pAN+yp8_4I{PhL>F)T<$jXKhzFTN-_7wuuH?lOD0{X>2{ip#_tIc?6wWRI zwRCIhQnRiBdDxLf47I1JJAJr29gV^YrVQm-PHg;9Ld^(CV5I6&gGaxtviZft1k-JF~ zN=h}Subt?EYb+n>wLn>m*vRXH{pe)^L9a2Nq zKq^i!?p-Rn{c!P&P8gbOyM7tpoV-;cc`xlI;Jpkp!73Ys-)>eQ*Ih&PR6x%Lm6)dV zQkokQIXd;qOBT1W*1&$>VKA%=oa4di6kpE)s(0Y86j9t@Z@Q!dl8hA$RK7Yg}cH(X%8l#lYUB=OTyIN2lE_V zfl^#1v%ySRVj>u-RK1h7lCg*9glGs*rP6^1g3U44AQ{mUpa4wp`KCg@y`^1$i|83@ zzN2Sb`9lk?b~>V)238HRDVVL7V zPVCdX?vzZLc55Ec+2m~jrS$aDuitek--ynqR+aBsI(Ckcf= zHq1$FHPmcWYhz~Gjq9YPw22OiOi6Btj@?tR<^a!9_~CE7i4+qr#a@sS!ugwP4}9KI zc!+|urQl3r3TkM$L$%l-*K867>J{qlcf<1AGoq z21;P3jBc|`=|JXH>H^thv~GJRdlQtWaT1e%mE=N(GWE?REl6d~{Ka?zp$rZ*-_t-2 z-yP>$*4Ugi1p~uecc;plsmZN?UV>_;2Ic|_Sh@}?)3j}ml^xURO*B>b9 zg@-Ix&QKB-1m)W#V_7jk-K+lqzQ0innKZa}%#<;OARMMa-+nxQ`5-;2hGTZ`-F;r= zE3NMM97|F$i!Ldp&bo|PYS{YFg?~)09NOh4sB8uJY9#`I*PIrL+jNjJlT>-4qj7$- zTtgSO z?{g&TnIPNmfo{@xbthM*$-!$Kr!S0G+dVxp*rVh?6;r-bTEEkQS6fAebS#m}y3HzzDy7-@Q}E_kP1rT< z;q~<%=uUmv(gCG=pf}YRUZZ{oVwOCwj6!)C%9XNbK*KzP?NpHo9!L$Tcc$f*)2`~T zYPN)>*BiPRL#L}u4rN_~=n2ZwF+dnqB?YFA9?O6$yd+Fl zwX9vm`IwX1&S=*xA0gRbemp)qU~|g(J_jypEF4pt->Y~~k*y~JdbDU;*Yt)vzVoAy zR6tlK42lXpZ0+|Vjr7+nNQY!`wAzjZV^a@RCduz0To;mylpQgEh zrR2@gjndQ9Tq8VC5gL}dOi~zEEQyKe%Dh<8a{XZ@@py2o*)h$X4d<+2^rFtl6$Lib`YlEesB_f;!>~;82;# zBrP(CBta+z1cn<;@x><-8rQhcziJ)DOYw6ySuWP6&v}DC1`FqfP!v$8I?4uYPd703 zo?!@G)fiSfYCtPQbJ9+v`t(mRG)c`OLzmvgT2^&K6@e13(L)FUv~UHoxC5NR&o8N0 z_p}?9*+qO|V`D}nRVBk+ItpUx2lE64Cuu8H|JkAFXgw}uADQ0oTLPUC)*08VTD7?8 z4gIQ;!teC~%3CpccoW%UZGEXhHhSiLCgP zOo<6Gv_xHq6m456EJ%ydd3n-boD3FU$Z&CySUVhWsLkeT0T^i>#TH<+@YtgJTFN`P zp4t^?e)etV3Xi4Mj*5OKx_zj8qu-Lvjk3Mb_#suF8YhMqcTz$-sV!OHxm>bfnh{K4 z_=37J`xdGhhZt+ho&@vn&{y_hO5?KPQ@idzV*@Rl{nBVPWx5xc0LMfy@^8 zKRWP+IBKSwz|#b%^C0OpV`_RrX}sEe9EE2na|1jqNZGuwKw09bYW&O6KD}f|!mg}> zkSY|@qsd$?g0UX_0lSc?*9OIq2ro_PFV1-vjc|dQlz>dw$R{0+V|Alo>;|sl&}ME| zMpzhl0<6~EgSKRXfGfYlp$Fml43fbG$?$?ibit^9L1d&O16d7$+3psLlVC{*m+ZAL zN^mrDe1;A~i=n}Bs7}kh?nYi3-!FDl9}Y0>m-~B;_PTa;!xP zF?yGI(4s4R7J!RB3$NZm*Y`+30XL0MZ*9-(vY#g#ph-c0*V|75m!|inyyD+>EfI;x z!zqX9_{voA^hF8%Y`TUtKFjJ9C!1(JUomjqZCH9PEx+J^=d<%U$N2XJajnsx`$@h0 z+_f!14|UDDo7lVOrV5fQ)4^p_CV5s2WiuYv1h{G&t?Cq;IrOVNMnUiw_DxJ!#GXbD ziGB}Cmiaf#X^r!aAB`#CA~Q7Ikam0%C6QEQmpoi<0t?b`mAkz zVhe|@>%*iddYfAQQ#ZL6fQ3*IJh2&4f|e572>8w!Rz`0-P+4T=f|>{9t`2gZOmc@O zV<^nbhR`v)hve&T{%9ce$9d}Etj8`&Ey`?nPBC;W`fq>*TNLoqThhS?aJKNL!N$Sv z(=_#C{a*u8*q#MRG18iJfUn!cmMz)l4x_TqJ%(jB6)`!i1WA>ru*4Hs6tT-Nl~pKP zfhLUU^#QNHR=#iRyhqKb;8DpxyA^+tYf2Tdg+|^qU)U-r8Zj>wVo+*DJVb(Dav3nb z%E-?hnHX~LXfz;>&lQeIL{@?@)CDG1{sq_pU9Zhom(KD{xQNriWK%j zpLi-X=mATlKre_YRwe9~o+#N%IEF&I)P-bSs>B}MlEX*li>Y~1th!CEh&fY3i{X_W z%w%EK+2_WHt$D^QAuouX_~rVYJ(R?^TjmG{_Pw^uOar;FGX zYD!HU*yJPj&>eF3h{26U*+gYs#+3&J3Hgun-`RG_{IF={*3ye1J>Rwy3vdR~VNOqf9oOvkN3Lr>Qz zHw%K6fj(_f+%K4IVMf=LJ0cyh_Tfz#GsE#cFk`4==4{@ke%l}E&v2gcIh+y8rWV2G zcER$=6HXgR&~*$`m330wR~kO$LIjNDg{tfbOjj%d7X)I-po4(DHMoFuFgFtu=N%vQ zI3M{UV#J^|^6nB?2`rR2y=tS=2LbMx0MY;(+*$uMo+ zh+Kygsfv6uPF_HTEq&LRb2;YNG8K4SlwDTMSEo_w2uxElk`5H2s(dBuSc9On;5Tzz z@-3dP8cI?;jHXHYx_ApT%hL?8e}U^3aU;SH3CpIeGe7j^spKFa#k`?#aAadYvhg2X znTb1HGFX)V4%pN{;ULtOI~X@N^UfSvT(wZA7_#h{9ZEc$&nV1I?KVgK}kQT>-Y*qKAMA)Efc0PFMXY_A>?sz8q%&UwB@|M2T z3!n5lB#+!2rr|LV9QRzfep$rpq7g3|%!gIs0nP5J9uj8cU}W;XQ@nz^-dpAm7)R`~ z*s^yOO&AI~4f8U)%c*Ga_!%sgCSAw54}px;X+8v^iA>>jO`){96e;-r=@3 z12;MJti(0rDL<9K#?-12Gc&cJ=0*ZGOh)JTelq$nd#~gk$*Z^y*AESnO~+{Fw`NaL zP6yGc+^QiIfo1{}F5rFEA5g~5LyJz3jXBRiJp*)e2h&QS;3sUPTPrn1yR|~U4j9yt z578sKcdDIci(EJl{nm}PKM}tC$YdMwBf!Qm1$d^mxqo4^zvXiWTb`-5q0M;n=O&v| zInGDwv#5{0%0S8!EKm63sdusSpv_i!xH$Ovg5GpKRC*WSVhz;nCkQH1IW@6xt(`th zqK<__z$>CI6&9*MB+pM1g)DK0qe|A)42?mT)sU*^P?`2(tNM%fVaX5Y7kj#z)W_QJ zO_RuvVU;Dj^e|FgZ*|mRj2vT~DE#nrWx92l7A`PE;f{ZJ>=5UxWye-yjsyjWKc{h1 zVo;cu`R*a#$!OL$JB)c7EmNW!2k(m%rsyjSPV#Tra}wG6p(5AIM(e!r)UH; zfItMuA;)#vFFDZ$sb(0*aOx@;`ldhcnPZ-M6lt8RbP#Kbaq4gmwv~19>aYWb-M#Q) zx&TFq?Zv@aa2m(QH5i{avlIDW*SalRM~m=fgjsnPOa@&(71laIX<4LI|6tYpjJWwE zTpS=g8+8=IDaO6&XPxO#?&Fe0#y{Gd!usElGGsfTvLGXg>tHTq6jOZTtN8-hW%I51 ztZ=Dq=n}Xd?-~68=@6kR>5(5kEB> z(9k{?*L7jdTJ%F_fQyIRdrtqd?(B~~TXlxgr-A8}U8r2Ts%{xy z;YO2V!S`MI#g3>A>zeaj`VQ9y!ovHqc*Iffn!%v$p^=^*mVP~3uU&Q}Sf-&QX+#5J z2=EFo8+vDelExFLEVHhD)L(W6GMynxRG{(95AaMCIV=fSlqVQcj+AKpFOnPC!Q$ZP zXwOGK`O(k#znFzx?eCJWq6OeKtGHEd4&|32@Sd-=Fb>go&gUCviuk1P3oG%)d(Y zWPGQBx4q}P^n-p=e7L4Ps3{+N^d=-=dyTq<^SOtLIMZ{X?GaOHfP0IRl4fVDNHXt4 z!#eOsR+Ae45uAZftC9fJVwfHG+{UKRe+B1UZq1yOHY$g9DSfsP68Am$Ve$p-ea-_# z8*u(}Q(G!^K-D5FmE{M22lw!QstCF>T!c>vC~TOl4%7kZ$B8b2aCErSf0IY*w?8Sc z)f6*JL zg$#W4w5&miSxj{tgvRO?VzQPaO|Tzkw23LEU&CO~Q-xv(9?_~j$_xOyUF+gOwtEvO zgfA09OGU=SEnjbDgWcRq7`Qj~8n*IacterF0(fm{&#}>*1OV3n{#<$MBl;EHA_!;{ z&>n<+25R9d3B}>g57fnteA1JAzJ;n@w;Wz<$&+9WfsG3U%0bT@jhx~al4!5%W*S`& z+{D@4;Q%vj|2W;;=HaC5cZEtr8yk&}XE}{ZsiZ(E*yZDmA16rzdwgUWPZPQ8{k~B) zSlSeH+AIa zAc@DhrokFUbh$MT=eHB1!!NOu7$(%b^OzA1IF45!1=Ve<`)r<&$9n4%zUN)q&jSu{ zMguZ|`o>&IY5&RbbE;q<2+Rc`AWkkyZH%QMi)eQg(Q#X_9fm$%P@OmQwnKz~2o?ll zE^D(&L?LuP0T?ZfD$I;dVp;~m1bZyGzGQh)jHbq*#PBP|B9ja!i-84at5C7BJ2#lhuv2w_ z91#`?QozZlrh5Jak6oEkEG9jV+PZyD)AhBRwmDQ`p{Ou5ks0XK0MZaFP*s(TAl#M; zSgm#jS=UIRaQ5D$D8%YtMCN)76EY^aIUW0SD8A{cLn}lz241J~2a?#nC z>KoDDMtDEd;*U#hx++Nd2!;POUbM6H;3829EjlF{in=(XabK5W0IJ67v->*J402@0=Za zQE#JqEjHk($p9W9xy`=MTc4o)>g)J5=u+k}rdHt!TWo$+$4LxrJgyj(e-{%U44VsgYXkq^rQ`mO1R-NuQNjPhA za5fB~@dHssk1Sltx+tm%1j=f&C-m|Dm*wl~Gb zfNG6l;p~=YZRpSyh$*PA!^LAhM1$Cb0XjuqhM2vq@n8-CTA|cn^plcDlvqd8T5>1~YDZTqN&iO_hMH$zpI-p6?E1|50Zmd}^1g+}ag3!U@7lp0D4 zlwacL(OfxyDw$LB(lB>gK9^?b#9g(~d875FknJs@U2|Uc*QJlJ!K# zTu&Zx4Plr%zK${yc+a0s%jH`fQ%ne5EXIU>cX4kb$MuZX1jWoON-a&v+=({r1{ag1 zFjXMq^Sb2Fo2S{_d{UcQNL!q-hH#Q8!AqluBtHI5p6p!dR^PuWom$IK{ojDb@J((9 zY+2SI;w2j%N}dXfQ@Z)-i#}hX;IkR2{kwbO?Aw{eAh3GYiP%T2;3&2$1Kk--5(bJW zR1z&7`6>skulu1%anygN7-kR{$Pm4tWqKW8ZW_LWRa%kf6e-uR4{||baVrI*Nz*tA zXek9Iy_{-q7?5lrlA=c{kX|N=?4lJ2Ug`@c7BLskKQ(qGl0)*pvCahWMkHP+T@yT` z6kb9}XL%M%(spF)Ge@??>{rb3-N*;X&$Gp9xndJQXJ>4H>^51#+!ulA9vzh00R!SW zSn!xwC$BHx@WH3+k#5&{Zr4L-oyK2kx5x0{{%51}*$6ybG$cmHqutmmvAST~%D|-5 z&76Br>2>TaB`2*)ugmDXH$2;)>+inMPMzrx{%5p5BFxPY|15jHsXy(=Ek6GuRlQw_ zMQs--<;(?*#OG&N3S(i;Z>fw)008mZEa40XZ6;I! zGIi48(WE7ruMA$?-6ehR4PD?aTTlyMTWa6A+Bk^};QfWrmnV-k~D3ypwqrh$>hC8^y| z2ShNSP74HBK+v}~SzK}$xV*#2Kb?VaGTLyjk&Y>FxB%=^CCvCS(-4hrT;9hwFcu{k za;1SsP8e=iWMB(8EFLq`?C;Od6ANr2~iO0!qg&6ytb9#`Q-Du1?k zU|G$dbX4Q1z-E>vrA;<(_|8y;PocUR{b9blva(Sk<>Fd19hXZWHCM*K{)HFc|CCE2 zC7K>`!1~4*Rf@4p^#%Y`KCCox#i!qH)+%x-OkLgzhaywzt9rw+M$789EfzSQXlciH zry}Tn*;l#v3MaF+E$tu&;$;`CAbK62cWU6aHiTfB(ByRWWV(KG&*sTC&R2a#S|ez5 za3rU~IBsxr)USX;96-*Y6pu z_p&)a(05S=F~pcOrKFK+P!}{a`s#m6VD-?Z87%2wT{>L1ceL)%OUCps z0ee`_RO#sUbbR}s$?cCjGIpgJJ0axBVdG+iuVyNsA6UAwg^`^Dnz5La4!@4T9ZXdzFnQA>so7NH4kq!1&9a7-uUQMcb@1@}dxx5!5{(hTvxRv~(IV5d#0;&}N~CpG&>G8Wm9@0N`hg+(nr{zl zvTYPHMBmP%j@=iwtB+*1b@|8~MU^#tin$B-6PFp=>}wYl85|4}?l1tkFq#V&CW96v zmfwlEl;;QBcng`F3;uqIa0^`F|s{=1b~?trZA96#KrI`R0mf@Q+1NKNp;C^97ywx5c!6 z_q~A6!Tjhm(GS-4ryLx(@mKz_2%75uj)JH#?9)pcjOo*?_*^p@6u;fibS{*I{#LdO z6JGD+lorS$`^}3cI--8nAn5kNU;Quzcf5UG5w4{ToPQSA;k-a*q&Ig;w4Vh}S}uVR z;{K3DExur~DHGs8U!(XzP}oO)T-IFSGu95vwh=YOvnNE4r)kkwqBCQ7<8S@o6piiT zJIPjy@5Og#E8m7)sQBuCdHS+WV8=R*9qT3RSg&HoWCZIC3O74^8Y3Xc90)%)-+i@# z1y51D01#q8tC~hRAV)chXxzE(`-$|P3xU4+ho159%x1v7O>;op=w^ToUUqI|=AcXQ z1exdBlu=Ka^^{d#v+L_3KoS06e;R%-^o5>~kVug{t;m( z$6PNoEM^`qG*a8bTMFp)!@DV$O>=GHlSmOYnNe{v1k0%9jDxLZJTM zjwlanvksE4u7j4&{50R!p`Uo?0JVNX)J}tk)urJ9%glPswrP6%NbT~`fC*CszFBq5Z?Q%i#! zt&GjAgc3J}#lB2JRvfe*B@3jgn9`74_>;7QJuVEP2?zREjQ9sKV{AL%v*y^_)f&#& z{SL>H_~KJ06Wq!5d}zj6(IygmeseG;%S@y6TW1e%I`97TnabTHitzNN!?yW$yFMAu z<4!Wg^S`D|8#`W)k0ZPDNU747N5;+hY(h46@ z0FK^j;t?~qWP%Y{RFpU`Z{asSz1d8*xp>p{F{J0owq@#4C0X?*E#?O&`;Z^4xEMvQ zztnNw3R<@_;SVM(qbUHOZr37yZA3QU=Bz)~h_|G^A8?C-tpu=~Pzrztx{b5Ql@ev%{LQQBg}s{H~9 z0EN>MutFBD8?pKZN6|I91OE?s`c&G@=1(3Lv(`fd<8BIm*?@aKnz13Bsps~WbmbG~ zUBWP!v8f4Bhn2QvFLX4sAZZg+Qe*J-#FX&(Fjdd$P+xA9W2OxIzNK!MeSFM?jf{99 z)ij&&`YQ)i)y!F2C5Qv+i2vrbFa6)8iV<|w~&w1bF13c5*T!Z4|zJ3d%v$2j`#tqZ=xkgu#DT-mf zGgqyqM0$5!WL=&cwdF`U^|9*|*8(FiIBQQ{wvz$Y0wd5mf81{J4s`2x9mf~^l|3bQ z>=ZSmU!;vv{Ux$N#!1Fh8%Lww<1bL&Wi0qvM9xAJ2h?3_BEIJyuv90ZCq3Tx%Z!2% z%|al-jq=1kHkluI_KQFBR9nK{-oL3)GWWHz_PhN?C;W{<>vAZ<-&bFJ+zK&^95 z(Rzp;-q#<9t4nnaDolr_F#6Q@$?;B=UN|35 zpLnTvOt8QN4{khoY}qy3t%V52O_^%ia6ew`KU(Y#o%YYt2+%0SeE15YiV719x$oEg zPo4#x1HS7&-DtUF?ix&*hpf7C7vF^Ds@UaScvzj}N!Y4je_PLI4uF2t)*fV%8ZeU< zp|k|eSD?Lht0&7Zl&tHzAzf^&Mba#bem}rh+?9`w2yZnJy@5PS<#dOt8%v@n3T)j= z*tm5(W6$*!X&t!yM(!6p8V{8~{vp7NP4k&7EkSuK z%ejHyd)XqMRV#6xReVc}8L~HiBmpWvSp1E=UOag35GT!Gbj>QWh3)G-?`%Lh7;@!hX4(Io>G`GJwZYolzxMRN zHXg57R4m{is-0ujd8`H(JNJk2_z-X+%y;4H|DY2KFs0_bv@ zlT4Ro!_D2__AU$C<(9LX0kAg{;8y2&xT@HFF%;`w59!b#5;p=AVUUD?e5#hf5gO*x zVY+GZ#OCP}r)N(rfLypZl5%*p9`{hsYhi|2ZKyo6RypF_(ZDV{ywcz@*kg)~fD$&% z>LR0f^<^QZ=(ipy1IJ!W4OcGWyQ@D$rVN)i(@M^9^8;VjfirANgNYb7T>5i+Jc>g| zzV3Fw5XxK|_n6j^FS_Zt^z;v9)a|sQI~=71R#H%!{QSsIZO7$))IK}+X%}p%_Xd5X z#wFg)30UB}XQ$`5d=z)8^5#R2RaVMMFB4B+x6Q%YRLrk!F$lT!kQ)qHcl9+-fm#%< zS1>&y#{P_jrrB^sQhu?$??o>`yk8;W16VbDKE@%ucT*;<11h7z$Y!iX_PUe5sV_gY z2KgS*5Ohii2}f!bT?)x6LFFHT5o;MieLB4DJ$VVO{JfLsZwq~$U2bLdnK_?Lp)Tv1+qK)^kMul&_*%-6MA7t^*Vnj=Ss6rPH+ThuuwxfjVKQ;qqS zuT@NdEHJ=$RaXtTA%Af?7olD(X~e%UbDJTgkG`GLNR!|XpYuj&6Cl0`95Yl`yIUc5 zEY5Xt0nGuPbhYA3vBkzUaTotb3Uu7wI5+)tZ!mGX*MchvPQ7tMEm+*6#hbM^HtTP6G$f(t)&lr(Hspsx3y*3U6OAbfEn%I} z7A>KjwRNi?Cpx`=W}FJgTH7+jt1BIv1-*`iG;zbRmSY&Ktxupu`8ewaXDeG<~|CL1=T@+|J%& zA%RW8FDpuD{h%XIHpX~O61n+IQJBZQcQK!L12bl^k(N=n)tD$SDJIQg3Bq9xE@4%y z39}fw!WRarTRRf-^=APA_SEXVexWK}BYe(GN;WRAJBKFh4pY?UVg3n{GV;SZ)BQY1 zt78I$k@6_|=pkZtcjm}=nwR;Vx1UknnWkINlH_*~s|iB*3WOg(tcD1&8X?4Lj1ayH z;X4qX%?^ zEiWf9<_798V3LeLzHy~Orr&n&%Vw?0Pzb!;!>f7-AwmEXx|-4#W#lP_5=*79r%ZJK_^Fg z&@VB!VMcjp9{_I;4-6A%6dynWGS#MdI$YbD7z7Rd3qqvB!#E2}M#n;6xsGItSi!$i@?3NZQTHH8xmjJmcL!o=9T}Oxy50tF|t5k>e zN4=ronkL{;p{Mu+lcUvvEK^eHXdo9Fr&+{ZSLZ@%!ya-PF+3$V7y(7UJ&i_+wWBk3 z;tn}EO@Ixvv*oBStuZ|yG*#6b@N{|8|_IuNeV zsYBd(*isAOZ6T(ID#D)W6bITOorxYv`(Cui#K3fy}fS~FH6fVKhkl)dUV|Fk&v7qV&6y7HWlw?OI zoSO@$IK@e4^W647M5oai>VqBKaLpd0UxA?N1?020fcfJU?mu|qHkjX6GOozDpPI4i z_%YzI`a{ED^&AHVZcaGVUEPpyWOgYqIC>633|%*8!Z6R>j8DmN9DROc6=+s4bumS0 zzEH{cuXLgoC=e<{sG#0MkD%&%H7+3F{%rU93)FeElS&2#-V3Xhf^b0T+~OY`F2l&2E01%^#C2LpiW z0#lQ+y?J7<*BNHR=9L;F&a?&sAP}sxh}4o6S-UYt)(Q0$j@KzsG;v^)kDCt+ti!== ztgVbuX@O(bgblDAr(0&5t4OI1eb*`g*Jy^d7U43JljG(;wu=+HeCkfD&pV^4vIu!c zzz8(`w`_^T>%Q{`9?-N@mvqT!Y*R|RE~Q_$hjE=!YqY8EQo@$+^)&+xi9R4nnxsSt zcD*l~vbD|jS$drO^SW$PO>Wgj*zmA6#zqHgA@Wu&Lhjb4$Q!j8a_7}Gxb^Bf+waRutM&k(G=p4a)x`Wqbtrr=06j?)T?25C?|QF0m` zKMXcMdYTQ%97@w-jt#f-yRsY97?<1LQy~*&=1GC&tZAHk(Djn)B)|lu4dLcYk2y_ptj#*teQS`@TsmYlW{e5}Mf<8&x*spXGnjlg9t?9x?!kXc z#h>_-3I1Q3k+Il6A&O*$zQGti-0(W_9JRuFq8%1=;&&@<#$%3pBy~)1%Wi|>F6cyd zSleNRb*YnJIHl%QOMQi}$Yy7eGKh{PMxK2nsx(+T7qL)3QOBTsckfXM#2$Bu3rDc; zOddg5%0&hs{cGcauky>;W8Hubb{6_MYDd6}BgIK9Y4+1s&gf91#sE5oH6AFkhS!?% zO2rwH)=F}BvW$9Usoe-tCKn`Wue>_|H`w`5-Yibn0?f8>MZ>{oqHndz)gm@65Xqv! z;FaA9WdGnunRpzeR6m17!TK=}Wsu z&~|*z7~!?shbC+sAn0WckTrkTsJqzuvGwHs}GPzn8W`t)+atag3pl-*zl(jk?x1 z3bj#|0Pfw`!aJGw?VF~5_@15>+Z`%&so$}!+ZgqxL-TIAd|@4%TJvVjO6X4TsZ~6N z=NBPk1;OXcIF$FmBfygNilAhTX?${KPHEa!S;8YniOlf?XSto~_C9Pg=&f%RlxN|M zxLk%dIMd+I?P`L10MP`mp3J@q|9pvPg?6xrWLIo@D6OtLSak0q(DvyAn59>e_Z^~E z80CQj3rw00kE&V;J<>>gj7JQ!7(T={Gwk!FIY*lRl{PoY+HP}SVBS|IBlc=l!Q4)`_;z} zN@@3%DT{+KqPv^bSka+u{wr*pvaOg3uaL$^_uvZh>{#h=feiu47zU64hW2G3vc5szD=_v#Gr0!i=?f7TE=?VQ;e!! zcS;k4s>+Y(D6C@5fX@1*M)QiZd318W>T2rmJ#y_V()B`b?-AQY-ac??dO*WGFKcV_ z{a3+=<{>**jI@-R9xMw9@S*d(LqW5*_W`e{2Yd1qN#u8^6+$0Y6~jf>Z1eh~ z#ZG8qL2B*RASc{SIL5bffPmV&nvV2FRNwO){5%&a&Mv~XZS(AoxWYb*2+p4t?Ct$Q zz_cq`gD3y(u$e##2QH$D@R7A|JkAxp<6x!`dt)V*|mpx8?!&Qutw zTgs&;R@*eynQs}-VXIyLnp=BWC^U1~cWsX{_Y|J`f7){kn|?|*_0U+;CKK&>4{@y9 z2vNP>?OkV>{F{HI>GdI-JIO-|%Q)JehR{l2HhBnpQwQO!`nY+Bt9@+t@JtWqwlv`# z&7r2|R;#vZTC-v+5;iw*X0awf(E!HEBKHnjbIY{P9DaIm0@BG3>*4ySl{UBC{j>e* zdU4RTS6xgIER<$X^=S@D*C4x&tM!v8^{bt>g)L!mq`N#s_da zr<>;f?3WGmf2liJJFI4)nogarmi}VHT%r?w8O!Qz&fN|k{Esh!>J7BN-H5iY(va91 z0M_a$`7$drBNEI1w;Ta`uJvP@l{-zr)SyB|B#Ek;3uZmELfF+V#E3;YCt_ zp69)f;+;=eHDSKtAOxF{Ek5)oXRS}R6_dl8Xg{*d!4Ybv(gJfo2-dQ7i=P{0#-EvM z;Q1p^_}v%W9Aw|`!ZGKQk$uE1sSl2}s`vk05Wz1${~{i|F7yz)d`31L#@5eF2<9dr zIe>rup`&cv(m)*MdbW;W-yZ8v(>qo`26(G9aS&S{1ZzwMM27rmnl ztX0#cTpHxOovM&o^;HIrxILx+n4o54@cAKJZp|u_gNGhiT|K8hwe1~d)@ze(NvFXz zKyak<8KpQmX$!+&v8>wJ^yb}+=0q{W`Qm|Bo|T6A(}V10eQ*#kl$ErK(t5w6drL!U z7k?EGo&KZxzRQ5FSs6S-N8-Rv5~1@FiNe4DHnei%k~9{D=X-(u8pn ze<)=le$E}7231T)d6VR%#50}n71M4mAi^uBXeN9Nyn>)4=LB#bvfWb~UFy3#K*un0JF&oIzKMkhL?Ra; z(OKlh&4#GTBx#cpdXlT?h9aDaSKjpjh%jR|OCgtgv{7UFfuz{+DA(3O96+i_Tmfdn z%W|`HK2-P=dxb)zmjVyF5kt_IA~SFG`pU9zL>EK{wHhFpWo44jn3rSW zLP%bU3aWfsjuz#{mDV@ugMd za#?9aUIs%FLn=7E&Qx!k-P8J9!2( z(6yEG1as0*5dV@-aJ1c2B?J{>kn{mj9#JCakM(r;@(@NrNK6p6unKdKA;`S&QR zVT{11GN4~Xb3)yEzOERi_~n$0yoL2QHdi;UMXPt5Ywci)jeLwL zL)$Jhca7sP;--LGbB&?SlNh!lg$l*QjUf|5iV#Qenab5k>#Cp4b|Tank7RUQYw`np zAe%%MhQyKgk5NE|?Wz@8R}86+=z5MU6E-*zJq1a}jI~`*YoHnpC6^pv_$FAzI%^bQ zZ4r^e}67bU0C&mNR)SfbkMA(h?ojtTm>@Z1vQU!Es=ptmwg>Kmq=} zw5Mf*flBES{$%-(CoJnk={ljjd49=@)ZtNDGBk~E{&h;$fC8i-8{Z#^n7Xcj6M*sH zv8xW(zG6fEE&l_=ZMvWW!9ykC*gZ1gdqizqyZnp1iIZ{xLM35w=wiejy9+Jw$ny_i z=k=6Kh`mzNcsJG@(95BHAPO+|P3BKCIFE*X(_p)yMp`Y+C=;bGPW8cpBvAU=_HdNS zN+zzEoXB0r?Cio`J-oCo2A}{c>^^zA4U>VSk?L{5*im;lElv>eYl|L zgvi6nf(>Rg4mO!+=+y;~kOic=gvym^EV_i|+$`Rri%P7mg~JuYFYTQixnvZjpC6bi zjvrf4o=qw~var%MJn;p={LokT{n`z3ZT**BD&Iso~{Oz|EA-U6!z02LLh-mg<44X$NNbdv*)tP|15Ez=C$+ z60$DzmZX>sz+Rd!a;|a=kr+GOMTgbC{>kV2{73$0FMvCMLqdChr_+(HSt*~{6848h zOt_o{`4X#s7%5)D9dH%QkCtO+eb-OyzOY`sFK}z&eJ&7Bjl9@neCm8`cU~qBS)8U1 z?adxq)Vc&VcBrKUEqx$oZh`^gFQ?YJ7E02TnERQA6ET|5d8@&vZj+biO}ha_>Xhgpo zNA0=GtnJF*ta(QkMC+cwDn>85V4$*QqK6heBlLTEe0H`6@qv-og zO6D7B`i^W-vus9ih}Wfhv^hz344&i6JxY&DdANHaByN{~Kt~(dpH9-eX?D?BSVLg` zwx96vIdp0-Km8Nmxfa<+_n4368LA>Chm>U>u}!TdWyUz9*H(@|;~eWTsw}(=y{POP z=%5@;z6f2s(ALo-v{ilw53U6JHZ8PJZkS}7y_dTS1%UOAm2yT*Ex60!c*924|)d`O1dc|_QO6cTSHzfV7EW z?J}7b%lVrIkgQ*Qf+Na}C;mwkG=BpQ;h$?Nj-0aZG?z$u9`%|^KEruf&z2g8Gi-=Lcz;Di`)5aYY%1GNn$7ZJ6(XO-8#IZ;U&0h=Dnu=d|k8 ziR%YWHUWK|wb)^#6k@Z`$KKKPM2G%iQ>*sD&UMw26CQ)NY>-Hvz+SfRf2NMBi(@vRE=neq-mTyK`2i$$CCA6mLC0>8a^2Ptv{E}&* z(9k#>Lap9XBt!|Cg)SGb9ZS3_*}@l1eP)HmH=GlEQ>h)aRGH*f?2ww>8@ry-;eoTzx-&EH~iqUjJiFY zw&}`JIDEh!%lmbX{mtbB*Z<`YK1FK&@#KethEl4f>QkW{lY3)HC(>dCELOo{|Kr_` z1JO$%M(#uPBHa#6%?PzBRVSAZzXI zxg8IS?cfJx6mOgcZKxUz+ylX&yk2wcn7Bkg&eBCF$w8D&YtC7003DL+uxs9sT4k3T zYaz4cF6Nz$J0QunHC$k^p91q8TEG3u%7EA~tA!=D7gJEonOw4c&RJ}9x`Xf!Cp>hQ z1!fdw9-^LI09sNFsw82ZcyJ>&L~Ik z)1#e_z0P*cm?+$?mw1U+yW~G{shkHFXof`5c3t8USG%WUC%dtO6?PZ>oZdxBJQ?6D zHh}Iy#~&_uq&+gj2QqrVQ_i&Zpoi{Bw|~!*pJlIMjrU7P73u2j&!kg&NQYFUyR=EG zlqIBeL}g`mBWeYf^Hf_{%3&9&1XyVnGniS7x%}&-=djqzop#c&&fn0$UL<3-Wr2cM z^maSHmW@QNBig|DHzJbt`0!uPf%5l-Pm0SM)Mkq%KzFwIwFl3?=er43JB+J4Z{Mbd zmH_v7Z{T;KF}Y>+T46zZ_3wot(~CMWZirs9df~+T!|KIoEV%G}8YSY=vI%;Jn|?zV zAQ5TOy!)&0T5Fa3IS(>;{CtKXQl~qvgBy!38*zGCK;~VXscGZcvSZ;v4MCq0QEb-a zYP^)KsPLH~?_NNYJ{Vv7{t8C&Y3-hc8}yvJtZ@PTM&mrD1AS_YB!q#DF4hA$&QVlN zBy2DPW$sO=df*^+m#Lntq=-J+#!6e|52>K#`_uTZz1iV%oD)R$Xw*0|6F(6u|05tN3%t}L9UXwes{apaD4qow@3_# zXde3u5)V*Bc}6E?4`(FFWqFBM-`uKO|6vb-mw{`}0}YLXjj#OT6vxcy9x{GN)ue#f zU^D`-!#p5!P}@#5Y6Sv+p`6 zfYM_xT;0P3Ep*#(kMe>EjThg=S@EH=ab#ILz9+7}8@RD$p`CY*qK>mi;j~65uEuKl zVYDgRjVeYx#6Lo$K@y+$0d`yhCYFQG&N7-yL8KHArMgTwje}om-X4M)|7cNO@Dc!m;kH_>!Wp+wLvXj>K6s_+5eGy;x-W%zzi<9K!ruv8xktmmU zdzc6!GJw_-y~BG0#VMkd%z3wUUD*d7Vb>E{^Vd#(F7hQ9(27a9p?12#lIgE38y^VP z!DCDa>7{PzgPDICT;#6}euU7$yxaQo(Xc227sucnM12BpFmuv)*if0?>nG>%Pz1i! zRn+k`-bl1bfPXFx5lYx;9<0fNW6Nn&H zu2IdNxBwiCfe#!W-OLcBbuw`gEuP1gt0tr2r-o$jtVI<=(hB7j4DGhn?1D8`vNkmJ z%OOul$U@Avm0zrY^SRgvewLiHJAJZ4CLCy#TYG&9-jML+7bHjj1}B3ek?7!G|20|^ z4doJ6*~1S!yuL1&X)_XBRKbXgbNWJv{MN5Kn1>}kd(pL0UrzxTfe4;Y@N1qGh=<2KEHS5KbutDeH?iJRIOhY;xkAPwBxB5D z9G>DuZD4wo^hd#~ex&x*$>hWBjR8Y+O1;8tL`2S)FEsp={Jg(oVE8V}<+TT(vN_ByG5SEFo=IUUnvO(( z=sf1J3A!j8xh@zvnDthtb>eaO*r&|Q|Cm)X+rN;0x)gcFCwLn>FJ<2}$%Er1$AFTW z-)GSjF&$SDHa(KJNwz+Nmq5iK@x?=wzO9h?L1!Rz?wSbnu37BOsKM!DE{qUKWH->7 zPoMps6PNLFGrQ+0dUFrs`r3^#%I>7wwcWWJAjf_r8NLhX_Y}xlPoMQLGpMl5d6^cS z)Jfb`?nvLU%+IZ`e*?h+9tp-{(=&ab+tlUM#BW(Gs+y^zVlOmxc2t?~bwxaj*6x6S z3lW2WcmZ6?s2Z{3(M~lIG)9mI_$Ep1xKEAf^DwVE=KNZd>N~ID{i1uPJ={28SU$=R zCilzW_4$$i%e1!{7N!F0oSA&Ds`^42Ioowd;@nhs1k-66HQjs&>dGwKvO<((wpU~ zc?v)Pfl`z>Y0Ve;qP31815G~yf;KIt{5DZZqux8>_)@aZh3ZE6%A%tq7dgq4U0q1iQ=P?e2UWk6=KTp8(1T+ZzNw6{W)(MEKdC{h(SYRy{2SCXs zY)GpcvjL^&vHppbyp#iQy!kEYI7JUShUh`Z5oERK`@OMRs58JQqfv>1n=wzxJ(tK##^pc}8-_kP3y5lm`g0 zEI=jy#BP@38gIa#JFavERsQft{%|23SyHB)NL1}WjC+2jLY372Ep8AP#}6RG#1 z4`5SjLEdjPs<2oX#LKW!~bbVek!$BI2 zazed;!wOx|{=fm7a0?%c%jm;bCkF2c@Qg{F~*n>Om=Uk=P z{}~kZ4Rp&s$K*>#&wwl?_Sb~p`*7>VIe37^iaXVrv(@XsI1*|Ky6f0@jHO&B^5=p% z_@*%kv=CodP%=RjlF(ngD1a~(8JN_uTV=sUTmSD!H8KQ)OUfmO)yCj#PwG9YdV$Zp zFLL<|EvG)}Y3ief5liZT4u{Wk4$zl;B58CPyWzk_6RiVSs~A9aw}|T7jHk%WE0c4g6~?W^r#vH)!{!ll`1HI?(BYno$!j$*)$Giw@mnZg>EEjK%i~$7iyc z8&x7pgK>cW?^8fJxk$XsA$MZXBOfeXG>Ig>PXG)g6f3%}i0etcME*ejiornOY%++r z_Z>Jy^V~H^opSa(CO;d>Z@n4^3du?&6x|oZ=3wT0R{`&rL5ZR$P1FOhy1KZTRVWY{ zjKGS*3WAYHt%DWGN;?uGB^Wgj<9%Epiqfb?V0CqITUe(g)tcxv(V{4gY6MnRH?1g2 zqZ)yg)y2)Mfa33?48d?0czA(AfdE{-Co{JPBqypSOjxMP8VXh0D8b@}S{zmgRu*8f zAruBG#NsBVkh_2y_Tv$)#VG$0n3eaPW`nKswPaJs3CXmfCs;q(n%X*@Q)%^ zuTU|ykQ5376%xt%0%`_stn76GX}Z5#Qc#*#c^p!7o^f@nxpPzf5>1mpRj)rE<@Ae6)9!` zq3Xkxz$t_j7AiK^BgZFM9TyNsg0e64q?>>~%a)F3qL;98Y=h8hkW(jmj zc$7`Xic$Z*M~fbf>LRO7+kOe;<{$W$VwGf>oKW__lvx7?wMG#*m+B4uxYh{vu=o>{ z%ly1)Qp=%lE)SZ|tiN%T(na4+&Cx~8Sn~9feEq{lp}&V*0v>(2s#wTX>V={ZQ1}36 z;%7r;E?g6|m#4mHLk127W$Th0Ma&f6FKv~iuU6{!Cz*Lo=3?Fy@)uVN&y~)BBBSj; z`0{gt*Nmh4zYbaPFhK?YF_>y|6=5iR(Uq^r@$$7~g&o}Jjz@sn5v3Xkm?5Jrdxvs> zNx&)fuDq1`Q`kZ3&{Cvl%2yvt3z(KWAd_2KXNSu&ktug2D6D^LCymwG^9^{;mgYWm zBGtQOuEU?0VO1LqS8O)n_uZ>z+Ld~#Do=L4okU$P?I>U!VkIN_bv1g<7NFvAQ=esJ zR~>2hHE;i?r(7KTs4w3sEVTkwmcY>>h2m_Z_qe@6O=i|CeWZQh@xe9*wZTS z4O4lScQ%@ze4^3RUd!h#?6H09Vzpx?G&vnyoer@GpyZna>Kp<(Z;#In?-;PXMR84dyXsQGg z(MeQ)9=iv_ zSJny>6*J_Ho03x!0(AAvwhtXc3Gr>J>F(4O zhexYgitJ8;D<(Z3WsP1l%UPbLoBHcYOE7 z8fh>fRZ$(`0GbWtiOBa-e@4)=wD)vwce5(&&s zODKTO`ON0khh-8*5Tra>^sS+HaD0d~cU;Qh$+*BnAb1~)hv39e$!C^JBH|a=yO+Rc zrg!7jr9V z{38zQIkc0xW<5kznZg)81Fq*v<%GEo6V1=FdrNDx;#z$0DzlG)_Dg+YXVO>yK$_c~ zSdV%xA^B-e+;Hfu2vlayak2cV^J^4GP{850&08_Tv*H9rWo)y zpF@n7zT0%)oCar#cEP8y_^3Xv+<>`q2Y#VLh5U^Dq$>q!8J6gMYow7fg_dCOh`~co zAxRoamVbvF}Shkj4-gy_|r>RT*_I_&-tSGE-0TK{OoYHAy8Nr+{EEjwX+|;-5W;Fzahcp>9~o zakGA!TA3p(5G%GVIYAwLRz$r8)NwWmd*~)T!$v7RctX$r=1DI;^Bu(_ANXT1dSF^U z{qb&Lq@Z>;7ar=;c5@j~8g725bcT_nVXl2|vRkWoU=f;@?6e=dVDZzP@O_+A;H(7S=*kXFBdCU3qAYLG!29hdUt9N$(^YC zKzSbq00~EM{i-%E{PZh+?Uvh?7e4<_GC%{GwcJ557j;$!cEe8to!$q0pfDE*#9jH+ z)YCfqn|t^>oRAH2sTpCGt5dQu(?!Ecv~VAgO`YEW~ z+=;!dImHGpHqOc4`D{*BSw1r4O)>~YlSpoLuT-B5vdVL7x3%oh1%dj6l}XX+sKj zdP_BJD%!Q2jd$6Ltq8zb=0B(MFAZOq_KKGcm(hq^P-BUNR=V#Vb~C|5)__cnXLYU9 zY_6k`q`DRxOKhT8er8qM4kpsm#GdSITOSS?R(o`{ES0)N=lz7x+qHIWd2E?MFQm&+DKrA9vV#1=9e`I7%&kkKwk&B-J6HT2X zr_Ln2^PeJ(+$rjZ8cF~%cFB9hN~fG^SVN-sFGR#eCknG1nMsYVBXaB`<3_g;x)}YD zkis*MxBU(mwZ7TC27t|nml79Y3bT;c3$%0h$SD{ATfGKn^Geny~T4=n>8uMBtJ0fkYK|EA>h61Q|Cw7%=Q$; z<#Q)n>y7Labna?i6}+5W1=cg$oHi>_-d(oi(B-Cai8);?-wTMPgUOK0*I1Wn`^!T_Rxxa_Fz$Eu9*?TBb_H&T#f8hTnsPD zbp@%2Z7!GZ;t`pbp2h^g&znaw zW9-_chOyFj$*~1~1%TzzUy!2(;sqqqT^&Tb>=|fZm4ULJ4^dy7$@9DIe0Sm!z}D$b z^n^hn1uTRQd|88LSy~r8#oHHm)Lm6uUN!l%{BF3oJU%P4(=j~8t1Cbg@OOA zdNZJ+Vn&eFLWn(VmS=p8+m0ftUY9c6G5Gi$5Jo8$X~*EW4)_c$Di2|5yozuRiZ5De z0hKk2;_1KzIyT3!!jMc^OEo$oEpL^Y{!Pvg(Drm0Gr_+^ z&?_vO6Q93(XRO)RNHrQwbocJ4OU~+#l?68z zrn9dt6w~Kb-)9;^aHA2YmQKCom{ffFrb0St&CIjIE|xh5M(8RgSWKk#GA|QcC(5t6 zmO)Ic<3}S>yP8hKdNX=SQD(fnF}DE0FP<|{*e)V(7_Jn}0iJ1$1O1E{SGsBN^*5S) zWg-etyJ;9DEs9u-^lkz)oEU|Dj7g4@h5^tNln5CYNE1AWAB~HUAuJE~e!0i_IVIeu z^Nm$;wS z#H2+KHCzZJMD58jQ~YvH2(B%_@bkxj8i_jt9paW*9sdh_Fv@Y?ZiHb`Y|ka7#HT}6 zPmey#cQV>IM@|M6dwH>LLfk`TSXN-yIZaGQh!6n_D(7tGMq<7u3r&t)mPZ!ZG>dkP zxSAxjKs+)}1W~ICD=bm2Y>#Scr2(w3V&Qz^MG>d=#~}4SF@dWhpgJXp=$jz;>tbDl zfJsd{IfS6L+PVbst4|YRr;4*EJ{tt!v_;aUDEF8~gopCQ^ns95+NF)y?>uo4HOWXD zgUkYmyOnrOv|L_TuEK`+WWooVx%22maNrys!{Qor+Avj4>RF^0P`r5fW9aRN4|XLu zt^F7P1PGYR7J{Z)O^ngZy9rXub?K4)@dlbRy%osFN`xcADig;x>YBev2eFu2*VHn_ z1rFKZmPpO(m0Tj%l)8{e%q<3UI~5nl`!Rzc)MX4`a@cWC|MB?H9S95hJcxWP-7H4b z)(lc?G(Qx~tB`>r35-^VHpC!>*HgtMYEb~MK(d00U3h)qt!X?fP~e?)SWLYgN>Cyr zbtW}FcmN7-85-ZA-_eDwpT9eYLq6BD}0`31b2(kr&7V;0?Mp1$_N9s4o zS~WzC8;0zQ3Uv|dl^TK2X*>ZInJzk6;DOjtE6CI2;?Mf3dP7{H}in$Xxyay96mY~WSa0(fzaQzJ6>G-wD)wkg(jUq^w zL^Fjsx%Y>m6Y8SiiHvDyjcf*~Ga9Z^d4X9=qO%f1H2t<{uAXPO56uWs;`8)@suyYZ z3AXuY_uVA5ok+aKjO;D2b`a?mbX+lrw?rdFRmO=Ul2_MSTMfg+9v1Sq3n}|WCRgf; zRC}m2fo~4g0(kU5`m8Q4279gQa|?hS?7FP%t2vN-Y}luuCDnPyM4^9gVc9!xfV_9D zUKxRxeZs()7MF67?6W8;GFMD;fWv4^*E% z1`g(DABEx6L(N;EY<#8Fomm1*)$S9xy+BR7`9dg?Pz?EX-$sb+y5y7f#P_FL31XsN z^}KEVl`#Q-xEz9$8ANf#O1A3&@Ly{vZ{6<~5@V)t2yNk=2d-Unx^RRe8R$FHcVLSt z@o;3Y24Y+SYo?6ZQoaPm)%JwKfI}O;N$s@Ibw6sQ!qB@=d$y12!TNk^QPj}gE@@!< zrIOA<BFA8o4 zZgET7FIn_#+GaKMrw49&WCmQZKxY!b{g!d<6SQL1FYO%p=iN$pd1_rlP?ATb#xdVx z0!$MJpiB4TR4Y%kZw~Tbbu|r@0eZHG)opEFRvo=rRM%rlNTGuK=<1-Wfmn_AHhB*^==BquB7{mC~p*&oh5f6gb*au*6 z8~TGX>(qKHYp%EX+`|_A;})ZO4>Q%ys>^x?MdsGrlkT6*;$^8yZZu_FG@5D2hHGip z)1DW;zs3r%^M<*za1@0-xpTF-Jq^#zaY@8;q22Is;8K=M6-Ntq z#C)IB>zUh?Al5XQ#Fh)A5n*@4VLE)Pes}E*R7Ce3^UzLjB+qnee4eUf$rt9a2zeU2 z9}edY$Ily$f76V|-}cCr#D9m=UW_1M*O|D@Lnq@ln9{f{Eft3drzI1m0K#Zp4sYe~ z&Dp^p<9b*KS2PX>s43aV(a&;6(_x+&Jm5W}{=jJVSYw$?`?O}#P2OFLPn4^TsuGpx zv+oOMi+PA#9=`1d|B#&SYO1eVP88aT__^P9OW@v3ZPtin^gHC$c|v z*b?|s61Y;q(5kL<@M&DV$MuBob<1#WQw@%&o?kUu$~VmgQ(!3Pc}6Hj?-NaES&ij< zw_i|p_XNzGBk&#=^!!L^0ouW5%JciH-PgbEer)C0x}&W`FZ;juzq}16Q;8mVO18M*@i-H* zl=rgt7@7n>cnb=wi-s!E5YNn1_m5glgbrs&dLAT1o$<(KzOV?@;2A z{Q3YjK+3-!fQ=5t8rg+zDL$TG!c^2uvWSeRX{Q3b6Zb+KQaiWZ2oOnRn=It zJX|n{ncvpTug=VVfOoc;>8ssPM3cFVzW|@2&ga_nbNJXA6?!l-tdoJfIeV2R zuwjv`ulC$=%_Tb`!VEwCg#X@`Dt6m@tVY$f$3qoFEVn|=+Vup|d2s|!J<so`sDKEg zd)lH4K|m-dhM}~~aTWq*X85V@XzCmhX2X>3O5Q|2p8RAt07jlTFE>@1V!w7bqH5_CVed;5^ZF+oK`achsaExx`Tk~ z--U04_pVzl7VBV_TF{G(YG&Z9KmBbDC2=b>Hdk~wwzY435%74jqbbFTzxE6Xfppt^ z0rM?f)Q7Z_3G85#B3Z~?7Akj*4>V0%b!G2jN_oiBlrHe$AvAJSpHZC8Sb`K%3g+u# z`$yOhMGIh5v$JbG1ND_Y$LNOmgr+YrME5?_>PnpdWZr67&mZSZ>DA?#ST&W&cd%4I z!vhc38Kj$_%8oI;L8X^U`W`DQ=zA}1f_eY6iZnx&fO1R*K3SFuVZpw@r;OW4YsEiHng;dMLk!XDg=riLKOHUZl(@q3}7USL&HqWakaw6?byNUugOHNVc|NtTNO-+8Q|jHoxO0tt64eX z99%=Iv`id7cZh(uJOwS#uf5pFVzCAS-C&8yOyris-6$vuEJVrZgs$s*G&CMwZ~|+} zge+w3cC_yU4b;-=$yb}z$H+TK5bHUT(;g@!cYYPma#gi#eTa^<@a5H6 z|JGN3d^~gOxQ`4u`N+8>;RxY3$1FQ3`4YJL$vj}YKSln$+Rd6;&Dr_#PGkYU(r@S} zB*U#g!?rsayo42gfr0FKJv;hMSbHP)UUSEGcGSF6@rR*i0}2(jJ=OA~%eUExPzT6O zuH@DKiP(^`P-O5d`S_dx{GDEw?rf^8W^~D)OGSr^Ae3DnSVQ1eD$)z@EJtb>gnlucI>$KHwS z!8AYDR}x-T>Ojb2;h1E@Q$CI42-|C5@K|vSoRs)rHV~RT(j!+zo^~3L8`m3$S&PoU zFo2=&v?q_+xIomEz|fiMzKRoi%%poLPLEC;Ungk^B)I?tz8Vr4jGiNE28Q#y9W-jH zebD!}O?H61>xjXq<#JO5q;P?%TaA9^8Cbt+bhKF8nVy#oi*N6JR>$kYKIj~$&BIY8 z>kt;59Pd%zsaG`<7PFXvX~Q2~n3{dlF+QX--Dl-Ia^bHi_ys1rfbccK$!4Rj4mYlg zT!cu3z*NL9;*r2}XlUo6Y~v~qV~87_`7Tp@M$wg?yYs)f{^uHeLyY}S@wTzvr4;QO z7ebb6b-A)i<5C1K;?(ni2wRuKZK$p@>-p*9E_9aF~#ta}8kx=-Mlh-#jVdajY6 z7jxDsi)Rs@pUZ%-onQNM5V&;z=m7O;?NC}jbi<584lx?samU=MhcW?%4Zx~X_6>*h z3<+gN4zce_$}wxt5(Kmzgdukf^-glzvd9YLSe}qchyeleRwOc{1WDAhsBe1?P_iQ1 zBu&yK15L*ObJ9`CRFb|FQ?Z0i3f(C-Ym=bv(=nCa+t5ky16o|Mj+oI-z;JBso2LJ9 zF${JYGqy|iPatDwbbZifWptnoHXoM;T?RZv7Hpc+H0MtLilP&a4$-d{B@|{{IJT?= z?!?AiL?DJkXC$Jq;Q1273{6VfreBEu>l*p?9yzOe=tw(H-9eFUg-$kh+ZEP{vMQNTNrB^WXh{83f5^~Lm0~agEYNr2QeuI!WGyyj z)Br;edX%25DOE{znu86~lV_F;qp}CZWc6D=8)t0tG4(n?y3yLFL|e<6aG*bZ+@!|v zu_u`{MYUb)T{Q7j>YpXyJOc$uDO|#m@*+=dX*HYnUtf26@lOK8G!5Z84eo|#D;UIjnfh) zp)&g#sI+_=pL#DXP#+`{rU=GK#c$Rb!%K|hm?NZVlu?^BTXyJ+htHDPxKb^%;U(E&9ON=P>*Xsk$_zyz$^R5uu;F0a4HGNL>>)5S}`O8<3rO> zR(1K7hH@x@(^QE{nra~(1EX=Lc_PO7JIoWMW3&vcMv<}-;}T6VkuIxSl?0I05MnO7 zB}6?BsOS+>B~Y80mg;LG3KXJ`+NK(KLRmwLXE6`~Q7x)tqeV!BCI|UeHy6^+j0$GM zhtk}o(L+zh4_UPgmoiUDxrK-WZfsPxo9^l`?;!m%4b!?BrwOGyR`0-ReQw)`)V*g6 z1TL$V*jz_W2cl*&&vM;bdk<4S`FgivK6%VV4BeU9OonAT^?-i9O?LH0`sa_%P~9 z3xl5x9sKYYFJ9UHh2gK9$diz3D2-nycpBUYyBfdyYe_~3Juj>ZN?FHafxa$!rK}S+ z(~C<>Ko3aNr}VP86pErgqgTaom=*OkeOKHVN+TvP(MLo)}>>-c0dro^=;?)HncHIfiHyK~A_H*d)8jJv_ht!HCtk#7XVW>mv@}>! z$$_>5dF<_!tit$P)U4XdaR^(0$AVcNZ!IdC`y7H+zLQ4hzyHH8pUeLN?9t&GvnS7D z=Z1J%SvonvpO;EVR;VbFh-aeK+lSDK_-Xd^ayXf1*lJUou&MfXL9ao0?>ms1iC6Kh z(^?m_trS4I&yak7LOo_F#Kh<#)aCCt%F1vD(@PJ^v7^(A+D)W7kZ0h}YD_&o)>F*? zw@N(Qb#agkavI8Kk%m_6Ceh=hUgfzo(B0AxxN+(z`Bq0N3C)c$RT|ep$Km+SQ%M>6 zroC|YQkQh(RcBJ4n@GK|Bg*d5mo$+llth>z5eT|BJa{qdOibjeqqUz7KQA?NN@Phs zrH|q*P~#Tpn5HguU34)a2leA*I~ilm{!2nC@7DQVo}a^*76t@Ub? znS|5X9U;BI&wdKb1SsM8t*(Z2Lx9O7SM+>Mh~LY=Wn^82N%~UsL+2 z28fwU%#B}cu99JzAx2toJB;rttl9Q^;%Vp3%2IrGwbQSx~BT2=h z7B#1s>$%t5lEPB%&~@SbdB>h4DYd#Ku#N(2G+qD1Sar5qHm+J2(a%tt0uwM$zp_C` z)kC$d&i8%qm3sH?SUA-N#{s zCm`BSj3=5Vxm2`dN*FRGOp}-=x+c1+=x}WblI*0YZEYVHFCPCTv*``SgKu%v@(R74 zt6b+_*>TB!N(?}=fu3S)g1?bW{t}E5GDnuXWJxyHNVPwxpBk9eQL>H>WNhVFh5k&%H9Zn4T9?p&_P+lAWcrU`5=aD=Tx#H)1No|VR(*xZF?S+08&XR zlH7sw@`%H+5=--$&<>c`THm@x_T|tw4gCR{rXc|}2*a7$ZlwUiv^1eNw4P5Y0o2aj?@-j{mkfHaXh zzT*0$w5!$v*;q6}(C_f?W{z{Tmc{EhOPJZANuir{F~IYK(D|uM?XNKR0-JbftKD>%4d~6yVXX zQ53+g7wXbbPn`7)HQT!lx3no)Q{?y?)-GHB zl#%;rC62TSKGG__7T>h%^zO|+|9<+Fl>lP`GRMAr#u=~P_~w_5*MO<2YMzd4?tFF& zta)%orod2DX;w-^#B6*Ik*u%1WgNtMgH+l?s#IJkw;A(y>b<-NqsvZhVm_z@b)k=2`&j>hd;)kU2%<`oU!qqe_4 z%*OIi7YHOqfCT*SX#8ePXk!psLiI`xnIS5Zvu=F)(y2t^aH`vT($2W8qzm{OV$mAG z`J~>>9eOsy#1DPgxl1_G;UDi%%D)`i`}m*y2gu9%8#Ue`i3VTZ*H=-#08w&Q(!={| zhhru4yAHxxa0d)Yl2pl(CB*e_E57~1sam6b`o%l=0rRVB4l58jM{j@#fqUhMx=etJ zfuDeQfCK=DgoKKWj3A!qxEjYKDC@K8pw^7)ZPuG7b(e+L9g5*;9=9$?E+ZgGW_;sW zXBgVi;2Lj@U3fq+=7DtqdNw=`hx(tP1cAy)mkCLuRJtpVFU*xxYAbVsA6A`6Ct8F2 zDKNvokv+eLo->UhGxc{sAAbG< zIW6cQ%40r!|10`lpVu&a`O58IqQC>adJ_ipgR;bu*q885uHxBuh$w$1>2UU;=)v_1 zw7tC9&nJf;e#(XOO9$(*QJzqAFAi0k#)W|kCwMWFmBN+OFLzindS}}qXT0Xi&wpba zhY7yx8@nT4#+JL~-YpzkhdqTYMIEs1GxR=h=+dq;5+7m9YO2JrLZVRcf!!$dsN4`f zEv(?C_OY1O`S`V8ioqtHha#N6)0Mr^SRiLzP4YhI#GpSW2K`zL&f1Z$wq)q`v=fBym8UiLkH2q;6r-A! zt4vD>A|Ah}4e_(wA1Uh&e6u___>L{p8B0f-qNKNV;X0avo_@uzR+^ZHjvnkL2d{UU zx5|3rZBpKEjASD5gAG(RG!-4Hc8Zx=#>iI$ju;0_yals5BlhxpIn~!ChL@b-1G-=% z?v|&wR8_I{F2bO|p_P4WQ0AL5%dwpi{9@oW2$kiMsSX%a_s`kHh2RT)?|iPUJC>gp z_17>x@VVQcyKEo*l>e`P*{T`X(0o~yzEbtVd-PeaN>(2|eJeImxuT5C0A=gzk2e+R zOsv)GPJF|AkBv8ksdenPL{M<$`^7Oc-{P0WpS5_s6Tq5GR~-=d{(#2%Dd;faI;Stu zT%d|0F*V?ne(GM;{kU5zUV3P4%Bj$Cv7F>j9l_Ccm6qz#%1BoV`IGc( zcV@$q$756Hz`LN|f|v%p^DcZQUqbG(YeKvFR+w*`LF2L-CdDh>f#iQ_E`Y?molN&81Lfd^%?;=ku${D>Up;&o_H~E1q|E7mw|J)%;hjuJ`4v_~E7< zOOv@G;mJMP)b=Pk0!O(CXPuLTDr1uUTgx)=rA8IItHjzjxG06LZGJNO4D+pzZMm8a z!&Q6p8$Qh^Jlig#Z^3dEMd#<&*RV)1ljdYJA~g8nZmE9T99}J)i91V8cb5ZCb{2VA zXQ@bp#r#+t=T;jAen}t8$KU73r;#ua!exByB^MbjzmH&t=UmB_G}W(aoQE~e*E~%fTHDzOu-`SH4^G+So%a$E!M`a zJW3l~Ic8DxBqC-C?T|hE+mxGh_`UlaH2n-T%ayYWf-(iT_tXo_hT3&c!VAe7C#QsS zkDTdc3LPXSz0uHow*c!zjC~(LeP6JP_{ODR%OCA=y&J1vopi_@DOqgze=S$*qs?&q zKxiasJgkP<&GF>oEPicVX-oPkEjHs@l3bkmy#io7!jEUV4Dg?saolO35ul5KDpe>Y z=1^F^^Wr5%d4if8YuH6(8~$jl`#*LX-W)&`gT2QbiLoq*iojr|oImG_T;>BQ)>l7ekT-uL>r(tfaFKXq z!QWf~r3(YCRlwek9BIIFDC|XM_tFv4)Mc3Pli-gOau=CQlFt8lT|J&fDq(m1!yy+Ll%@FT85X%TcJ3pULER{9ecX~WLN{W=cr z>%*^{+#*JIT0^1Yw-)ek>f1)r5hISxFy8ZUT|8}mX`zXyTqKN;C$!UTksz`1?BnpD zYNzU9{&~7stMmtC7t5ID-NX0|@2~juJ0j4lDkH=Q8+vZqtl)9tBO$~M%*aT;q|p>3 zQ_wL%?Lx@RiPtRl*j7rdfRumQ`Ezw&!8TCc{~r|!>tmCX?B`fw1`=KS*R>i5Uy1r8 zz##B6P^;9ri?$@D{T4l5Kvl~ii6xjBRL%B_GzM#q+2;$G@4{ySjJRn=YZJgotfjn; zXij4JXH;|~R+H6+Fq3b~&G4fpM=$she~Di9&M^w5$(LrcA51f0KcS+|z7udRRKay- zMkVT*h;`czz2Nn-@XCd27Up1-#O#^{`0`KRWx2Z%0Oh?0ma7m?A0drVwfV1Pl^Xz% zNfeyLFvuU>ki(Ie!IAh-@}P8z z(>xds&0b3a0x(i{;Q?*rFYk*Jx=AZsGVcnW}%Dzn~BWFp< zs}P$N9-56GY|r90S|G0c01k~4_$)W2RmgSKbvb&^)d%|VdFra@3Y6Zj*P}^MIW%QI z^+lGVl8X?`SjRtRJdGtG_1rHB=Hb#BOw2<8t$-U6U9xMSCWy8kT*5L zVb?ktW8!4Ia7d{4%K|WdXh~xnS&t6MWI=N#?9EQ!2X%^0mA71Z#cCf(HLmkw&}?;6 zzN$6wsk%?lxJ7NLgSVlK1V*KVezWVtLakZ7ZnL5rR0Jq!A7cL^$g1?!8})nwXX=XL zN56x-SpsSTVbVdOAg4(eo!hIp6^e8eI@=nZ4nJ)~?*cz5 zjR>RC%-vI!2*puIEHq-?SasYo^2jOsx;Q~d&Ykb6#yYA#7X@-Lu$b80e#Rsc;V5+N z`R3IDk}rNZ4D8^9=N*r<4YJ&sR)nn_M~)0v10#$j~sFzqukC5L%qT#bD( zYTE9Wr9EtnurjP;zhg(v{no|w4%Yj)mf(2{wiv!T$C238aGvg!bctgPff_px`i4<2QK1+_menopI>16aG~p3Nl88Mq|r z(F~LU)47hMir*Wlu_k3ld{q}Zxv_JidCpEbGSU2%BDAw~cTy=WRG zYN%36PLl{`AXRG*L<0;1>%-s7(;hQU${~KDSU4f^jq$NbS=b)&JdT1*z(gvdj=wA` zf!_vdgAHbMVC)aMlbpbuWS)q+XaEN|V0?&fn_tr(**5DM94-_w`r(tI;@H%S*m`L9 z(yR9+2lVa+V(>-RNmS$vtCh?f`+lq^P$yH>1??x%LCs$hSPV+OIlzXfA4i4=FUqHD zA=cM!waG)l@xy|@YW}`lZgEbOc^fqDz1B^fK!P`m_jO`O&v#HPM{mgZlgx( zGh&e4i1IxxhN0*yDqMd8X1Xmcn-iOYsd!iH`F%(=8^JDTOdQXYkkd_v7$3CBo!OnKBbX55O(yds>cNrHX=0obA5 zzBaW2E=PfomChF#*iQV<5qDJBt6cQ?ZpC_z>KN9VUN!kmt1QU6}z@;}9k$exG z*uMQ*Se$6rMIw$`C4xettMrayR#}k=KOe3&}a-y>w zK5IO4R(Q*sCS6@uv*OXbEy2T4e1Y>tD^c+nkO}N)V1TX4aUbb_{M-)2VF+pC`!Ic2 zw>^<`SSNIa@Esb@`XS}953xxBfOp+7_6&*h5V)AZ1slMJ0Bm4_$RFPy;dbcR_IbWe z9~IT(VFB8=@nu;nzp2~Qsdn3aF{2i{K2|x37Y&+Ti2$ZIeKyFZovtEkSH)ZrOJ5fT z69sAD)}f4$bzEl=iPovYHFOyBgmME)3!g`bu^AGLiw3m?r4zd6O(N?8&&7w81yu_y zR~qp%1%5*{^x`*{n(lqkV>i}gsL5`s&1GKptV=7WX|t*EzL5GBw_>oV6*M{753_f9 z$JgppOi@o9E}Kxsn-~f2)Z~|X0=2Q?y?3Es(QtZ^Ep1)jnBZ|&AO2d?lS3kQJ3!E{ zl=ZPEG0gmMoF*^=6kQXZS8?Qved%iCt8^1xDuyx!{(`s&?8)!OiHCG-)cSfR>7U z83RiKctTt=G1FH`i!;ZcsVHwDr6&_(1gNyAv(n->cgc1fRd});>vD?;q^%*&Ba}X{ zU-kX8{PN(B!x6Ek&r(-9(2msA-P&x4n~o=+%J{=r1Ru>gQ~xKB1=mb~hDqoM)qCZ(I~g@+e?- z!DYOVX7k+cY?NBWLr;A7vo8{yRthf zwaltUKT$C-#Z+G3Bbf`T};=yaAU@u3IVi@`_C?QW31S0oE zo=9NFWl)R|<5)4c`ljObH-%y(Bwzo9)LKTCfmb+}{$ZFS6&!*d!%3j~7Y}0zB!%ZW z$)&fd=33};JS;U}bj&~K1Q_blje>3r{NPrHH@a^+iJmPHlEJbMRC_=lI;RgXflfw^ zyYKwCQ0Q@Yiq8!JVoGV7&>Tot)VpNk*@JsTv)EI~uN$pW`K_t9C>M&-of!ScVZF}d zpr5a7oAx;4eztD)UXTRHk`k+9q{!mcl|femrxpo!)zv^(2i=s+ObIo)`T?{$MzANL zx*9vJ*H|+PT&E@uzBsBXgmU&K@=JtcN^RGFzwg+nXa_pKp@5!GP`mer4Y~Qq zq0}wQc-oW7wZMKuC)EoMm++4b+)Sf~%FVd-CTYoDJ;I>8!hukgqWSt08u9%USBD_4 zO-@j>2?gQL7u3sOvzWSzm8|L1e8+7acsjx=c{1Fri09lCUhFZ0p194eQSWN`(YK47 zrlSX<(sM<#dFBiRj`M`O7qc7R||2D4*KYHoRv#cMl4^Hz7;D)HApPK(m zd-^7Z^)TSeY@H`8IV41|MRy&X69z{IdRBj8!NBZE2pVvg^n7fvzh30c9pSTW9pf`1 zv^T6635M0Mb?f49D#a z9;oSsHk%GsQedH6CowBTA$w0T7%1t&4NK8PyAUbjZB?OkBUAJm)^>=`rG5nTtSjg2 ztm35EVlh-Vdgz2C3A>fBq)C1PYChXGvxWNg82ZuG)V3HYmo~SejPD!RZ{OQpYkzTf z(QEqpu}xlh@?-Y z8&JosUtrYM-Oxy8v~#@&zLmU>+nW3CYN$>J76`0%uwPe|>LNs;LMgIEAE!$V|E_A` zwWTcw>&qD z6C|lb0ZHi6A>Kj0v>b!R{SgSs-7v%GHJF~`W6wwrG`9$ha#Y=0=D zlkam01XRAS4PLwuHFeLpfRN4Vu$hK8HIN>$I#xxA6-jAR@q;>XHN zzBbuYOLV9v0a})nAux#r=H$-Rn8X&xiPIYS;2NMt`Xri@HXj}{vCiGxVxGIWwg&GL z0>1GKfyC0wRn#N=Rh4#TII~>4dFyT>;Ta~d!8c}AWng-bJ3!UkX{c_A{GoUAdWA{b zVcgYur~ez>`pw`udOUmL4IVkrLam!>vnvSElKnjB8zA5F_2DvkO86b=9rEupF3Z3%*E3|R@B)%XwB6oPu7$Zp-hO@%W`_BC9$aBiDmu=KUv z8VfItAUF#|uop-%n)IWl$ZLsorl3Qi=vuXcApo-^O+^Gc$ZcAu6%2>|hy7^1%dOuM8Jsg?9$klo;9FN8JF&colsS zYZO_w=4qESR(v6)_N1adK?qTJ5iT4~+k)IlU=N^;N$YBd_QV%GFU1R8N{WVMt>40hx)CNUI-iD#LaTw0-lMoHO98Cgw?&se3Tj5I+yD&U6YY*U z3z-9`0&k-^*%-;1tJ!gu(1pMXp&EmkbFn)zrEs1V&e5`ZxK2}oSei;v)|416N(H^StD)p}0uy^y5P8i8g#EHt=Y>?@geoHkGQ;Y%Lo)z|%#?3^evcl()XH+QU z3DP?2kYp?$&C@YY_>WgLQ8kL)cj{-LqjpLB>a}5*9Y~VW_@Z|`>~>fi+a4xUnYk_Q zz6ux}J6@f6L`c|`nM~xVN1kw5D|GDw2@r6JLYx?I5%-z`wVO*w)-FKEnnD#zHrhpT z3oD!0?VCI{C8-HVgd0+C?5+Z&(5V`OE*H>5iNT{4TL53H zcSvx0k62AfXig+iGS7C@&eHuyW}N!ATesWJm-ScCl2J9(=4DmM?lGsiu(!3XZ`QV2 z+h+2fuvC$Ttdz0f8rNj}{Z&}DMN~!lGS%KX&{_>bd>;}?GQ*2L!S|vO_1=-Ac2(U* z&bqrhVGwD26^_Y}vT7{r2AR>>wLbkcq>n4VsMDW3S z#4Rtem-(V(91oacoO1s>Ky zGh+ar@05o{BFsTdq3GjOdcu=oa|KF-hf{?dq z^ImF*b@(Vx2En7)vEv48#e^2mmlhleLEt~pvT`hKy1AY@MQDJ+fQ}1OKoY7eFs^`l z2@#z)TA70ZF20-%$3=&}(3Ef%I6f~txh`{>+>_>}SQwR*zxn0`!_u&@;drGRO?@~i z6h5T~Yx9C%zZqW9V4O40Zd-Tq7JA)HyQclS?PggvSio;IHOB_{_;XgL%?9hiefH*3 zNqcbLg!r6tFlFsHky7JMkZ3VJ+7JEHy@R)wldDg@VKFd^c|5x3vh3KoJmBCITQF1s z=3;;e1}_X*G${AhHu^Y;hIlnKz{9hVP%u4Gzol{0T2NC^ECme~W?vNu*;aN7;bAIV zj6pI5j?~6E3Z^_ZN}mr=;uV|CG#(c($JDy^%v`VI$7gR2E_(n75{}@Z%Bc;nFV~Na zS1AOE_zd&e1h$|@WD?G8c;7s@gXeEB%?O;!0gCz3_lwE?ctn_He}oz@5NGBqc9>kr z!_H!P-s({3&VqU+gJulgN`0HMind}$YoMm}H8<7Vb`{w}Oi%{%Us`^^EtmO=KiRs630hVqvWYyZK0 z@*lrC{Ie1MBENwsSKP=zTTF!LtSdF3c2fj_HV-675E0Q8(i_$v&-0AIY+j5QF*G#c zxa=yWTOF0uqc8jP{M6o)ZGsrCR{4G`?;}*}MdGsPaAj^bYrq$>Da9<5YKa~q5IzFC zy5?Saoi-dmRb_~pWll9d3|2!Rrb&6Qb}RRE!`*0I95Q`?wCTgt^nLmsKM8kk)`{7y zV|Cq$$}MV@SG4)|3Nv(cmcpDb2m1Kyh|g7(^$G0{4By+XgxEPThg?4`Qrg)g;pE`L z;0HZd%|Y%XUmv+HlS%RJ>bcxxPldZl4M^uyaLqLZ_|$}vN4?I8C-VK5F0U%ZlV!*R ze{`!r<|Sil5^=qj{~x`gm%B#sY*%4``ni$;x^-YVS}L#DJJ`VBr$6VB_A6|1eiP?sQSu^582{tbU02ZP0JZ*CE$Xz`#WEpjh(96SSg!q^M!?eqph8B1Q@0a6QmdM zELa(`lB0Td&lj7I0V2Y$(?=W%F5m%qL0Ac6)wsfBV~- z-7V(ntBd2gtI!t@=nVukk5GrYy~7>udi&kp7T#>Ntq0~OQ18E(lWTp*=U2G}WnTo5) z550b3u5gQcZ-ZXGwNG^_ZxO%#Y@Yi1#L_44?)8Y=$V^~jWIDA~`DHpC5;OqmcUGxZ zJ{m2IMyW_wx<^$oXYh}G{745|YhU8im%@VzL%^@=w#Q$;Kp~53>jC6&+4NBMWM&>b z_$wJJ-fP-U8F_ujkc07cR?fbrt1_xssWL%4v8)SMkYyOvsvw zBS_}j(s8J4ZT4~+J2_IZrJSwu; zwL#=TEx)fLN5%d2&*hJbwV!TDIh`H#)>*Syhu*ecDg?`-NNlWwlROpl@(4u zP+~+D&==<$B+kOImR#(3CX|yq}hTP+_x6UiaG{vZ#>pJOxS z9wxXDa=&lj8Wb>x%j8u$1{3hSycx}iz7^pyu7wNbHqiGFo5BD`-jE-9mit~#;^@Yv z)1L_ssvtfG3UB&q>XOd2!Wmsm$_W$w7aPizY@$ncx2Is`Ex@OAav81dr%ujI9;pp1LJ9Fb|Ykrxr->U3b z&AY!CX2blL%=K`XoxxQMRFKf)IWOTz9Y+q0_s_pZC>%C-eb<5?epeWf$A&b6y0dkS z$g zypDqInro?>MaS5n|90cQ&ixldZ^yNpnB=1o#jvFXn&#Of`t2a_9hFW=0GZzX-5q_L zlX(Zgr&t`LBSS5Uc`%kj|evzP2|zw|^dTh6wO zl@X9&AWA}k0^6P2*)7~ujP)15@eTPmzZuyA+(aB3Mbh-^A(kJBL>NdAi{p!E>S6n zUZOr>TF})I)L*A>AIp-4A+55qQM3xSv$MnO#XF{xH+75;?8i{QaCcG2S9yla7&&5g zE-1?};)Ma@gNE4#RXc8E>bY%H+dp2)>lY@P!5Ex0sY^8&UI8=0qGb|P)gI$Bednj0 zYqFC!?H;X9Rc_QiLU!N2v4ET6?5erDaTkRv)P({D0Ru6Rv>_hC5|vhlT#%yqWBF zI#_t)8UWc-L2FRE1kOqd;aU-=Hif4R*X%S=d(nNUm}5VwjhVOFKUL2~1vBpI|aaS1eYsSXWL`vqLjEX65O;f0A147q!}^fs&u zfKMgVVZj$j1Zk*FJoSfu3)NjURdr31v`s(r-P-TqY|*&gCS+Qt3Jp(4uh6HIY+eeJ zhf0pAQ3};ENNKXqr_MCig-yqynM2(pQZq}$iJt$()LNzoE)TE~(wq><-~*kW+lHdtV(9_!q-VwlLBH^8OzJua zMYDx1BC6d6zc%a@*$Wh^CD-Vq03p8a5`tN0Mj?E>lLnUfj%V&p3p zgN@`C|IaY`Vu2=p#rTb{iz946j0(K~g%Xu2+kLK8m=Itr6*NND$m3He3M<0yw%cP) z)O_+yl+);yOEf@6H!C#Pjl+Qv4c@g5k4vsq()Gz1levO=?)NBaLuL%W)|tz{dka4W z)f%QhM+eLwp`LQ}pWubEk5K-Bmn(m34||0MFQ4+-8VG+tYlkg%*7ed8>MNYB2ljYO zTv%6%B3^OyLdjx1@Z;5k2T}_n^~i2?RB7*wSW3VzL=+hjxnhliGfejs7d>$xlsLBB z7?<(W_|d)1?F$c=;1^6^$sm~-5$SXT!E8#SSaN!xm(9t0aPk}O<>4KEIKd;H%w}fK z6CM54h7N@4xlCrP5c!S&ukC;;D1ogqVWc3vMEQvREWK*r2WjnFgejuSwTiwO(trKw z)hIFh0mJ_SfBsL{tW&Z0?$_iIB)s8o;lIcEU5)r2-)7;VXD^jqN}Bu~N*&35WKg}% zsBct1)ew0BUzH`B&mBP^XZGGwkz!3-@Cp-V@)!rc(Zq;w?KB3rBP=NSOd_)JrzS*L z$!{QTqO06w;V@^GxQ6j2_St9e-gLqz--L_r{&qa^tT8oa@5`{}&0`c_Lq|}xLym{* z@A60fUKy%I7aZeQjo>0wEq18QRq!jJ428YiLVB3$TC17*&5I9xl_a624>6g(;~HNy znppQbZRd>84C;jww!T;qS1`T`ZU~39CkK_iw3?`~X_f*Gq7^%s*E5&8+iq|9jfU!m z?{5kET^gX}5+v-s`MSa|YEo-VH~LEivt#sNLXeO4M+8YQ{1WgyXTEIX@ z5fncrhA7&-+foqWpJQi1(l~_B!9DlR`@S$MJZ3UmRXm$hR;Eyt?ebAR{0Zf-0_hx| zi!E>^)_jR?nA<*eQEG+At!j(F4H5l{q`7Jy;SIfKbH%-!1R8Bn6=Wd#04Y{#M?`MO_cQ^#UGnFCbyN38kxs+!Uul5aF0L97yRL2;8O>E)9(nz)ldG~R3uuf zf6_mj5=C^PCwikx7Fg~EOdA1{161z23TSioR0_MF8t_ey-1kxvNyRBDsXy#%*YmcA zE^0xQ6kf0s&_c|iAT(*=s^y?hHT6;`(D``Pc#E8YcXc4Fco+FjxvX*V=@SzZfC?E0jtuLokr;Xv2)0lXuP4=IbHYj*(%in!?i)t+GP9}OU$dR z1f;?&)0)XDD*Y{0jzS}lHYZUsOty9SV}q2|2uc1wJUs7?;Sp8kjQ&4kCaf1_<`$JK za#g_=%yEH-`?FZ0&^)V@CS%K@hIsSGWayzhNy8(Pl}i%}uL>2R*d^?n5l?}H#Cjeg zg3CHTf3Hhp?p_xpj|JZrG({n*Mp*eRBX5M}$}Wzi*(y!qcNC3E0lyZVZ$@WZ3N0OB zG+b6=6SeOXR20rQq{PdFC5=2NVe_5XOh8_;`Q`W98lw=NJLhM1qO#C~dv=XQdLGjI z?>fIV{&)bqR3?B(Ml$!zs04rR&X{C{%2MSm>8E!9(mSl>%00uE+rT{0mP~Xc7hNHy z)~+ZNj@NycZ!ssv7)Pf##fl=OM1lpPG#Kiqu2bPZup8F_POwf(UBI<%% zKX(;B>*w}sd-jq;Elc=a|EL)%*+nA*0OW`ps)o>nSp*eyE)YKRObx&1jd#7Tg@ zKc`9%HTV>P>qLjk5vCTlta5P%z8J)35;9Dn%}s#VnrB(7T%Lv;cZYYr{D-)uOs^xX z-UhJaqW~hV*FAj>SA$j4>UjGp!7p-7{BuH^f9`UgqHmYfN9c{=wg*`B!nDvqKd*pS zwmZXW2>%pdjy1J4Jf=K1RV}7gBInk)zv5wK_5ZKzXR2>ic|%ASQ2w5Dff^I?Zec=v zvTqJ`B-4siGzH{m6<2)72KQod;V!C%P)kTz^BeG1N7P#$*VwX+-F7qD(#C1qiiX?F z2c2Ut*dOFHub2A?p(9M_CSYfuM~)gC8FnmefV$%tWWZt~q3A{3`Q4sryE7dZTPPM2 zI2|JJEE!~&GwPQmEm%&|1{gZY%!Hnu6o~n(l_i4OKV2;NJ+XrsR@Ph&2zW%%J)VWN zu~MV(XU+;FoQzt52wDP+`B6eTCh^e9+5zHfZYt^^qHYi>mm{ox|3*cb>S@p?ses?d z86`>s_`@J!J)L6n`MDB#d41`3x}cY2dd8BWue_-9dB>QT^54MnSSVp0VqOaV*js|@ zOYFO$PtrinshEywIq;}g@kwQ|14E_O$_VsVb)E84e4WO*{?iC(T1dSP(xh>D>PD{5 ze*MhxXt#uC{9cUOL(!np38!Z*fKD_jRl*b06@?g{7t{=c$lf{Xc8TA7d&>;r~ zWe%D+u)EcJ@rK-SN7~X*g>8*Nr?1b-%e%;D(shzm#O&N<|5QsM6_X!)lBKWrijObn z!9vK58^UHV5Yc4G$~0t?bV7V^w%{Deq9pc;gNtY9RVIx%=DnHL)@;qz$}Z44ZJAhk zW8EDM&d!+)q7EuRz5xWGdlY=YX9Wi2C-?k49pT#Bh~14q0e?0Z_%j88$h7+xrHlyK z5f16^WU0dvlgjU|7pk{R_FWaNRx2#GR+nW>&U+VQ&DlM3LC$$zr=i;Tk?CK$M0L*z zh7jFbwH>IcWKpUw;i^sKD@1rEPbY^8Tf||6BtbIAfx`^VWl;288fhyH3DjzAwbbS7 zKV=CJ##;off$brbcOLETb z<>_PIB=AWdn0v=H9!eN)M?h~IsU4qzK{eqh?fq|VL%p1O1_ zAr{6%2fO%%9VtafguEgV?!YS#Essd2m3X{Ux(6{ z>!FLd$;vCj2Zz#IfB%CzqJz-NK&)wCZyJBM42aA`5Q4p`g#(LxnVi zmsR0!yf9GpRSTEei?kEIW~Z=@q}|u98@ycnf6R7+}&mYNUrMZ-5cp(HQKr!JX!YSGD6mA@}S6s zhH$|aPtX@0?5d~{nrADOeD-Gvz`Ck+U((khCB9*b=JX63#_p?*)bmn z5bsmsDSlTn@M)5U569N|dn!>|;&hYjH9}m_&^HRjC7ypikpzDAcLi&qvT8iTlv^vp zetuGrhcr7Py9m|@>>j@!QdP}RHf;olQ}1Fp6#i5)#;+ef3)5X6B2hqB zy7NfNHC=7dgiA5m?o0%1slq__6H|^H62Q7xEF85|i%E>;9J*Ze`Anc%OOcg&BJwc= z2rddPTf2%qPEqKaI!@VpaSV$mT%u(3qifmyucbQo#d{D0sC7+6bmBR01R9!-M&x8D zEJ0VAn8gf?47yJDd)0AO?}yJy*kxH{kyR~>r9jjWsN&+zC|!FjE4@@xjqMGNTFkA) zzarWHI^i#?v?_v|nM7}U*-!>S8C8@XG9!<&^)XSY28dGc$^&fTTOn~?s}b)!jBHBt z&E5txzath38DP?%*s)WOl6$Hj^%-j zq!q}PVSqY#EA&3jA?19FZs#^Uz|h>5I~fBeGK@cbJm&Prk-1m?nFG|qF6&b4y}d_o z?IN!oe$Je~axAUo>k4!$^!#KRtaC$xTV18@;4Ems;qzjx$5!Cow*2Fdbetoi${#Z9grO}^du_TmPwQPh?PU3C2@~XF}Fh0r_I%L-TZl_)enDc?dEHZ{NzGHB~Q7= zOGyVS4+RNcbCI)#Z6=pnP<)!-G!@F2<#-2U4nWzpvN)(AIloRtje`T^$w7**MOG1F zF9UPaO=OX^)&_yq+UoO_NIA8vOz}uJ`{CJ=SBun=3pEfwIDD{3Jx?cs`j1U|TD&ZAVX_{8 zPH>OkDGM;ZMt_`7tMPpMST87@kS>HY96Znsl74hlbAsiAU#G%i6zAFRs7^jQJ2_ z`Qj6NF6vwV@W>NSn^QZzwUveM+aC7Z@4f7bgM5I5Jtw}@GJ)JWd&)(;&2u3S9Xyni zcnclIWsh8FZaOM>YJMoP#f;O*nM;vQMF^Tt%TKZrTW5pZ+H23!hU10TGOyTk(I51d zj{e~dXSdn7&6V@9ilWNmFPPgb#jQ~W{z}a37TODFTx|51<8I>@=Hx_9_pUO!EZqhh z8;Zr~J_E_;tc<*R;%9{=M^L#ruqDCad*0`=xq5{dpgL@?~PlrJI& zqbw)!e)#q{^Hwts>a`LJ8s8zPH<%^vahEOAUHUc9U39Q8cZb+j>SsI;x-8nRYUHD4Js@*J&o!x~iD^yZ|o67u4VI>Q?d4 z#KDeP(v>gL&e_H#XQkUxb*C2+*|IG}R0^bQjVTUZ4bD%S&aFdiC zfDa75(mkDmUrQp>VlD=w6HgSJtUjxrIiX2W z<3y`4q1#^CdW|upor2%uN6ER-%(W0BCm43N3!u5XbqR)b*(0`#eCJ>E1UvbJQ~bXo ziR%9g_C=6JoUZHY(=Qsn^U)>W=7c{y`~!B5r7J}4qA-` z@tUGE;`jBjzB+$2;OFDt;Qr|R=Zog-lu*RF@n>(B$j!t*6SiQpe<9Frk>Y64-wp@y&thtH^i$F(_ zt~=Qa52F3zf*RiMXW6gOmh#TgE zTooExa7e+Rc0mDP_urK6X6FCN{O1Ob(&|+h)LZjqa@B+nR;Y0xju zGDuImke+0sxAcgMjjDdH`Rc1GU0rlt|(ZrN*# z4J>{&X!hLhld(jIz+p3dwkcH9y8`JOz(`?qBOjig1J5|2A?h%w|CJM^?s+bjvS{Mj zeHN5elz-B`01Hpd36Hv{TZ~z;XXg$qPWI%h78c1Bk^Q5;F_ebgN1Mw!cLEBewKa)O zStFV&PyAfQBtzQ@jDOJUqBp)*$-!RC7^{yY217Bv7|bO%ZW7j@J(3snQo81B=hRJ-emR?&f1M z)=%F2Y|Q2a{P;~TgO1)cUhg@r8qzmX>76~Nypktq4R5?~w}1oq$6`*qdT~W8x#mjtpIQ#bK$7@IeL|L^<@SNHGfy3m)lG z&&oGA#`Mdn;3^DV3L_@}(0wW+C?zClSNoCt`bAGF5vz3;3FM!)CmyZ+Su!&Rt)T+L+ zzO&n@*SdU}@$|JT$f^wH#qHalQQf}t(*!ts9`6#rgjc7zZ>>j9G4|?mO_UaXf{hnm zm;ZY1?&QF0%iw@EzYXBGw()<7NKp0~%MHPyp6w45no*V+la}8kD!$+7?3_;AFLj!@ zrH#AQ9qg7i?&hY|hE1)uew)}I23}rHL(^tk-`HW(#5C{Z1Iy4h^Ud@JiT82&#kueN z;gBoZESZs*@v{BR+a00F083=`ZGN>rdPlgx7To_|zucP-#Q_*s@Xy9o+LuE_tFdy& zaHJ_*bV%645&MHP40{T2`b8k%eP07pZEytwR(TwYeoj)GsB}k*VOP6tfW`;6lb7>S;$oa)cVCRJ#QPy;AWN z3<(M8C<0UgQ%#`%ZV(C=sL4ezoPF|)L9 z_JTrm$y)8Q@8;s5zv!4_++gwBNS3zoS__-D0Yv%YA_jA&P~dA!DA zl|F9T!?NY)d_R#P^CIc>%&1``4?d#1Nm~{xbj$Ki#FmiR;la-eQjZ4DD zb0tT&hUi^`1%6%Wjq|bC<(LR2TTN1qq_D64Sme-KR-(c@V8T$Bz1LhciecU4^77;X3m7Dv> zsbSQeqpYQr3wut${AP0@GKqKNrew`T1Kt_WuRUuBxU!lEfGJY~P0`qNS;JP&4WZZV zP^FK^NacG^D*zIiU5H8j`EKWljK1%-T~L)bfU)l|um6BfZ0$RA9gAgLK|VUPeDF1u zZ~1A8HmqJTy7T^ES;2i?%BnlPH!7P&sQ*7kd0rl|d9G#cE%|#p{x{=yF~;FVoDHM? z!Np&IE zBHUHy*xXLrwK7JM(Y5u_KR^BIuLlz#?IGtFm^&ux>swCMo?E=Q<sD z4SG$#7c4sQ`Rn+xyfk4~>~h^~H`nQ*%}{}Jefz9g-GPYzy{p>uOSv)MHBv~%h5SB{ zk~d#t|M8*MKr4MRp?taZ76=o}H>)J8PEh*7solx9%_M?x6buy&3j-yxC29%cJ61Iq z&JEz<-a|{2;>3WV-rpz)d{3wPn916=Pv5SN$nW}HC|#-eD18B?^{N7nvG zAbkcX{?JgT4v_Yh`ZLAq!&m$VbypG;;`a?#8-({WjeoEHCJE5m5hS`F3O-zqz^o5b z1SlD+r3&w>h_GV_baC%E|HL_-9mRsLTK2V-eUAsTMZ zJ?6uYHIkm>-8r84?JrWj-5K=nYFhNgvr(r%7c1s)Wwp?j4h68E`9EW)dFL7LX8;Pr zZ~1L}HwK9L4dGKUYoGH82LEC>QDBKE+n&;f%D7gvX|XrXY?Pgbh2I)!LG*aK^ATmy z5Pw2wrgE{jbX+Kg*EF-!Eyf*Y9{{uoS3b{%{fqhHb-8iCFTZw0t3oG5@f|d>V)+)4 z-JG1^TMnS0b@`vDMs0)rBp|md7P!3`sXvdI$xbzPPtlX!u%zyh7DhjEB7mnm<`s03EN&{G(ck^vV&hWqC4zw zmagL373Zs_wm5Z=^-XVxCM*<>BVw=zQsikA*LLkJz50>P>2l~(H=2)m_E>!HEmr)t zX1}E2!^0PB=>?9Jwh*VeCrLFhh>y~1X)PC~V>m_N@R`F;s}qn(iuJIP5Fh{%Re@$_ zs#w<*o8a87_l=??D%z^p5xdHst-x@$Vq^%^yr0Jy%&vx!Whd9lXJfu+^7#lYKg4!o zCbPj(B9!LKeIypLm~k=dr&-_N8zztHu|J^tpWh<2A^b%sq1?sy*6DR(4sIN)l1^U% z4!X9H`K`%fcndX_tFSDv+ou4Jw+wHAOgCL#I$U}Fw(~42uXA5PdZZKm?a!~I46I;N z9ZqlROZ|vCeu5QVIox;*8s}|9{Ebh~5V>9E1_QB> zNJ`OgI5z)2;PRvLJ?chQqzlac;clnCaMybMgP{)mxVXCE{%4= z&aX+K*C({$azCUeO!4Cs17ORLBVxg@#QIf?`jv<}r^<60#qi8qG< z`joUQDsciJbB;V_OAfbKp~EXCuM)pBwVf`5Y!x;09szlLI(uLd*uj93=!`%OY}1dw#SIvB$2SSsiUHW;HB~9;69pCi__N?6 z*mS55R<*43k)E*v6o!~&90>zLLhI`%pJ=4uD43A}y4*zK%wNTojIf(#Nnj`u&%#HO zuY-8URid%GASOf^t(3fkTMOS$h9^8L-~f7+&nhTu@G`27D>d9M3+K~6|K9k%8h_AJ zzU`a-dzSzI5C7ac0p{l*Q(rvE`$^3woz&cjp)CC-e=BaWaip!ozCY3g(WPPmE%wRqyHe^oa5!j*l*1c(>)c2z>XC7r5GCB4hR{$35L zlYmI0M;EM*W@H!g&8anoXs|lKsrw5vbl3i{L9Pgl|1@~;j7D_F*>Vka(S9tz;{G%g3d`g{YLj38w5fsY^ zz`Uy98;#K|t#r$2VeBxM2kyn7UyH$+ccw0SDx7!hnA-g6a@Vu9&@I#2^yIcTY+DD#Q=;eESWa zRX2Aop|1sY=d*`xNzv`M#U`lD@PL5kV3;7J?5^C~di!++AlTO~0Qr4@7FtEqXGU%Pf3fHZ(17|IPU)(Q9m*A0+nj8BSVHCBM?1j_fS zYmf9q&pe-h{Ybt7kd(L4ZFBv?O2n2*-fr;FAbw0H#;`PwjTm~Q(Mfw?ef2HX` zv~ier((C1tH&$p0O6Z#4HK4dx;~T@UDzZIpa6%dft%T`4t} z4yX?r1A@~GD9{f`A2rKT+fEbl<<$1hYJKs50tsHG9g$T8M%%pH{W?kd@I3~tq1&G1 zhr<*GFAt&Cp$Pkq)BMxWq|pdiHC#UxNXsuE``i=uMT4;@+Kdppi3{12@WXFQ%v}M_ z>O6o)nYVt$#V@GdUuT3kO00jR;&~r*T0h*y?K6r)FDSh}6yu^wVLD9;W<@^O#?ng; z750W2{n%&Oc}sNB(e;YBLZ_MHo&)w6Wybah2X)6{S(E{8%9D9e=7pn|FPJXZiU$`} zM>#;oKRs8{V?v+oD0fOD?K71I+|F1Ranep(WDer;!9~*yA~9|o)ZFa=S}eahSy9|# zYnG^>d_+<2wPj)SJ#MgYhY7;uSX)yZ0wjULH{~U+@rPa+&GusLL-Wl#FE4l0?xv2j z1f=#?+N`;x)U-;)rUkazmG>#UB@;zJ=dy~C_xeA~_X7Pmiai%b$b!8tDRyJiFNOi` zu@(o^x*8&<*$A8mn+N7vSHAx;`lt0|2ltL~V?DsB9vxpx6woVx>V10T+>dryOdSbS=Nv29nS#X? zEuIR$<`587L5OM~w6IRhfaxTdPJ@eQc&}AxJ9LF#y+^ta@cFHajfeacdx`I-^G%*P z4~6N|dZaE8_B+gOea++#&UJ8s!L9Cr!lwwNgG0cy<;DH)m_m)OjCilUgvBmlu|vUy zr|hT0cN}Ol@Gwn_cCDVxnV zmC{7H=uWU!L%7vn8uw586BSF=AVP9>z~8W>biY-NSNN^l=4ULxLAE+F%gnm5H*5F( z*A4!FHq;rt4WZh7JY{H93ePKGM-<6BnMXvaky)A5!xcPj0^KXegYX%7rvOuJEk2Sy zo#Uy8Re@6&-{5#$SC*#};BOZ@D4_dTS2g%7)rJ1r@6dUnHeT&azwWF;sokYyWNtu6(q9DJik|56lDE>6J-_YTT>KWhbs) zGR%a^)=}?@99~o$lo1ZFSEBn`2`y7uRs85Se_;HmxmsID5C)5+0g(So#XB-k0j!uy zM2XqU6G$0GS;x7Vmhgq*VmW|4f>ZP{GfUn_mv>zP*|4w-R|Htx#B|2XRLEkb5O%+mCsUK0 zEf+aXAbD6pB5uneG+4V(52K`w6=;o5Ue`qU?TppWBfE4!-#Duu4-ozio;7~H&ANGj z9Gk3cwz9;F<-ggF1mpf?8!r!Gj-=WoopeKZkcrzq_v`@HWBSL5G6yn&b^QA}t~$<& z;Ko#q0eZ9yb^|+0ECt%_T0HwY?Xurt9N%$g@4k86^5weJ2yTK!QV-ql5*Ie2vR#qo zG@1JZ8|^)vc6>+X&%Xy%BBY0GPlcwK+%bpO=&*bF>6R~*l-pQyCsx^YuI3bNGQwR= zmbg|f@hjn>st2wl{TAOPAaGbNT4F+*-}>RzenRt{!{ya}>KE4rGP{;9@p7OCS?t0x ztg%ad_j@vXM1LQe^`!88QM-GFJz7Tc#Diq(4*Rv7!a$2hCLhUMUMuiDmf`Ba+_^yA zdv>QZb`%6e9Rs?VMy(h6Q%W2wZX+Zv=F*Y@ww&dc7V9rm>(H+?22REo_?ZJgZ>Bbp z>Vavpj}fmui*nxuUAqJ=zK7J~jBqd;lVq)&j-_+|7N2I4#Fte)E2v`%qSLVBaioI; zV64Mb{iaeS@U5Ef#LxHsSm|rFX3qwBtUX@#%gxFfhdPA;TGpAXeR%yEYJCo6C4u1( z8Z_8e#P=;_yM1a?Sx$GxKQo$kG+gKxf%`_V0@P~BSR}ZCcKBoYuS4of19a~ZvxwEf z6MY$L#t^1fPo?tA(XUN~_QE@OcdiS88oEGYi{d(;XY5YQ8xw|;;^Ma85><4ZY@Kf> zd{F~8Q&J?4N+i`@J!YT>WM-hQKl(3_62C)NBSu&vBn>FtlK*)Z`Ho^sZb$fu8>RU> zc{mp<9$}5~qCMR9;QeZl=Na}^I8l1Q*)daGotbMKL~>fk(c54hZUitMl@sF-`g1X$ zVF=YVA7SV`baH6&rZ4n44=9z~iFR^!lAPT@UOhCZHEuLZpJXi(o zT@b}=C#EXqa2`gTj`g%6wX7)?X?u2|>h%f~xq~m=9!d8{*8Q_kF+e>9+whvC;O>7_J1qILB(GSYpL*v5N3!Ytx*ZeXTpl_*z(%cO2i6f!0f zD`xTxG1&GP>1{b?9GzTww$P8>);(Cab!cHLoX09Y85qva-ru_U>}&f0j@o7lSyTHL zIz_2gIz& ze3a41EBP)S8BX4`x?h>BUd1}e!a7~?3MJk3aed?ZKmVoCwKIQ$v~usrzfm0pQa{d} z`RgMPEePCL^ygcO>E_M&CA$&ZjYIY}^HH)WUV3eKrAP|ZvT$SY$A^XDU-u7w!A~5+ z^Ah~p_SRJo9ao_+TP5g5&_q{X&o=lmFqBt~o_Qom8=#=57?i)~+w33S_T%E0N`LF5 z@B6)b@{jVlVR2Uh^d6b=l%4{0$OZS7%|-2cL8;1G2DSHs#B=;yMM3lOk}iI(33t1o z-istQif;D^q($`bn)SDX1I(pUBcN@yVyCKyrOrBaoz(Uh2rShUk<`iQ3cs!vPfkG-EAO$$z(~#s+o`rMTKn=kzfN>&#__m?uuRk*D2SNd zwH!uES`g#hb5I2m!S6syJXvN@cKdSm$~U6{iaPwPmJockfbbDH==uz1-=SiFA9=#E z7WOa!!2aQwE?T(_W=YUX>daLEUKCX=_@&FD{=fjcu@xj%*|*eUR3`&4MXZX1X`(G^ zzNfhSZFGq--70Oz*YGbFP2gtE4|KlGxM?tnYuaI%+w_nCE0>n>WK*n_phT__u>@oy zTTTu-2*5IpoQ5t?xP`4CsKtS?JZzZ`wML_f8lP=vs~PX4wS6@CAtEE)JpLg|*RRu} zF$Y!pXMCIwknf2#P2~7N%D@7gN`|uue#h;e?x9UJE*0$~G#!%WFWP;RJ_KEoQeP+iOmZ-knNo;N{>dNU zN{#*r2^Kr+CtIdjqPm~175sEQHty=D%HRkUqE3MnSt1#xnf}z^LNvO3XlM!RqQ-Fw z>CdDl>g!!TnDFiFQPQN0pn70N{rrKhV-{Nys_j^A)8U3l??EOW03D8U#x;oXqCNvi zX1Nq|n7IgZ;J6AV{adgcpN4BZga~lejj}$Xdb38#WIU4CZ~YTyJ_M%P;NiSaOAkZs z=OPAee9f6>_x<}^MR<$nnKzZ(ufq6>qo|6J5fKU;c#onfa)Ing!eJ11B(E5`0f4z- zoo1n4l&@g&X&TASX#)veoL`k@b`;P44BSse2|@S^UU1H%bvMX{{pZsOT7M~!um=#`=kw@+;V64=d+_3~bi;iLg<@RiPn7xX_YD@90&9l|I$4xaab% zBte%7_jT#mpqwTi%7S@GNJeoRq|5Roo>uzyTqUAq(F9}gxmfla{7YOzRIXE%gwRmA zx=uqwH7m6}I%H|nrma&6!C>q+Q3>gLB}kuO6YJ=9*_fs@vYK6Jl~Y2+@r_4dl4pWo zJ#Mh(K@dB%2X?byVzGKUOYr4NQn(Ue26-O;9kHJMC26@RiQKE*N!5AojwXVm+bF}R zYnLI`v&tCPY%o9x!7hUC3AJo!p^=5j5F+3Mi{wBUTU#l5VO$2!a}< z%KX>dJ8!fhP!TeMj+uK?iTx4gJ$=*Q83GLlM{xN_ma_E8DY+^Xrd$6eY%%p+pA9@b z7NjX1nO&WE*5Wr`=0y+Y`a)#|V=7-%By5;rc*o_6+D88nkn&PK8b=)7$hT_>S|2=3 z8sCA+y8-H~Jb(5x`W_Q`LKe}6PNFp|V=i}M}jpw(iU4vmOI?#RXX<)eIam9iK zHEKjHb?VjY{kMG%ZtVc+uofK<+M%3)5l|9XP za1U^02SsC=q@!M#xvO~oD&PDJ!{24fKk9so+PmDBqs_Cu%40dXd9^orE~hka?L+ou zRC?l~uCWV1!7ItFU5TK|KOi`Wj-`j4gMt!qeVDz*dr!Z&sIZAS^CHU+wbQgBiHjpR zOf9jEgbd?l0N}_mlVdo&Brx$1qd;Hq_m8xk(n_j)n6va#Jw@The=fVAf!gqIh&{`A z1YHk5u-9g_ihn!zQx`dr-AQB+OSmuJ1^}>x;co-TMi62C`zIt&>2=Ne{xCouBw4>M zz|19Rl#wfzy5XVkT@rRfdENCBM@lKS#o{6s89~kFuQGBix$4}}=&{ngRWGJwIb&x) z{*Ih)qLTX(59m=dNc)>cY8x(-t*PyxsJN{95fK{?-R6Rr-yc*f`O3-_{7hcMEwV5p zg@{bfT0z-HH=mPv!wFu$A(P`A$I+VrGeB<6 zFq!Aw^DbAM#DKB=SFBGVlq5xgk}1mUTe&_c$?)TA^LpNT6Xa7?&PvMod}BX~9AXIu zUmQhDS8Oi(va%?)WEieOo>L1fc8m>?GA9$6N3yz^d4Bg--a$Tb;z5Q~2Z*Cd7J(X< zFF4&bTaw|+AGgv_;wJJ>&U@9=S(ITFWvsjvU@Fx7gvyQ|W0QWyp(G!LB=6i&l;~&- zpB?66kYpH8@S$XPIS3ckm~g5bM^08h?7VM9($D{Wm_%xmxPUEHIX4i07?Lz8&shGK z9WDMDwDC)4z|JdP3FoMfb@>&;)@$3FbosUR#LGfZGdyi#EK8OJA%$oqj#L0hC{`bV zVCj;5F%(|BrMLe1Te{e(;o!yNS{HC%$ILg+Z>d4IvMWif^80dywc*90?Qhb;5N)S4QoYUAFS{#W#R;r4~sG25r)Hns!!6TFCK zKUS66N2S#N#HJ^7#y20c`Xc{5q82+h{gRO}6>bWfs%9-V+bu-PkwxrM$DX`T`@^hD zNqs^+^_<8KaVl;KXQbG%Q=_+%N|psMA=|;5j!t%RG>7M&BI#w%PF~-NIlNthJL}XQyB^399ps7JK>-gC*fdkQDN?LcB3x8Q@R9Fy3j2XFRn36GkI zWaH(&#Q`CaQ!0Y!xdcC=#6~jYP%GgD{YN$i&_CSaM3^s}NT^u^Cm75-R!Bopd6>{$ z2&=Ga(}7!6NUgjfWZ%>%O7WT}U1E4J=Tz(v$*gzyAk%<1d<7KuO4|w~k#X4AXB*Pi zYxjBKZuaHK3So*2ykP|MWFSe*l_H(LqPf4Gq)(~-1;d#skp_ocwHwKBspt^?WGmLT znzv=;OD3i!GmbX3RKt+c7 zyN%%%G+c0JF5pT;kq)86pK7I=pF{yuD&5u-(``4ed!_V-RLK8oQ~2ae|9 zvB(L78&LN!xIUKXHj}K%P?UpVF9m&?U*dNE)7|yJ={Hc+rCrj*{({pVop;p-s+7UQ z{8vYFhLNf1_`Z= zk^`>1YgcuRuIW-5X*LE3$pj?`lEt1}cHgB&O z_|ciEbWuH_no-aUtqT!b?%!JRB_yglqPi=(Nn@`K*@WyTDB~2e$2T>tHm6?hfquUL z#d6B0oOq(A&Al$)qP17r=dZj`X5p$`rikChlT9dodMvU}q56W^2zntjr$=uiT5yU3 ziT`BX^K>q_=DJeMrV>YQ{!bzU>K#Tr`$zZX!$ZJng5tp>^7OkBlAFHRLSq_|3r+^y z?tle}d0_boRG*5~rH)48!3P^k=XRq(*1HS4Vr4Fv9!-*uQJQ?~Kf)fivFCK>?@^3k$YJB_AhaePTt%d%1rH`ZD`)&`AEl~IsISrRMMjD9*npf*H# zE)uKJ2D{$K%6RK5QmFtf_@G1CyOeB09xH4{TGRST)9(qpXdRMz%Zt=5>eY>R=!5>E zEuQV>YK0nNCqzfeW-O#i*gR^k8kSa5@kVbVp`1&>w#a&fUypY5LMI?T&f%mX$FW%j z+#0#E|AbaM-OzDg;5;Cnhq9uK!v6qD4E)K}^M7?A|Kg6zb3J^1`9?ZrHtLvpL(P0lu?mM3IYMjglQ~iG{LKz2BLSR zxC+*TFH0xq6Vm|;3t!^Z^xeqr-{EIV_*+ScT79lZYM&k`z{ItK&lvJL`a3~__K?It zg&d$dr>9j~TwkkRcIH0~MZ@VHk4S-vCURxUs#AffU@Mbu9D(+}1@Kq3W8YVEO>2*Wu1FPT>N!klZRw?;d>Qqqlx?VBA*TUMn(M z{S})zTg3n)+djR5V;r>@x0Q`5EAT?F(~+U|Wz6+~SM*>}ejBdtu*m10h}&|d(YB@B zj=d6#UO0_=)D}c~IN2z*Xwq54R|rVZ0JX9|AO;PZZg?@VoqCK^U|T*2AjFJ-`?CNI zlCA@yVSI!ooApaY)@KfhalP9v0jIFF`i(>(DwEx^&Oaf{OOj>zJYJ1ve0C#nib z2#}(B&d~_%Iw>&ZkUwVuAe@z`a{*lAi%lMV%BQCTA!|YoQSk&PsmRWYQ*!R&7Gr<+L0XBHd}RNym?@) zU}?*tT6PY)f!>e;4LoAu03e)c;GBj*07$gNnFdCOYc13P35I@rd9F;~)drJi#^p0( zaxx0XN(%St(@HY(r)x6Ij!R4I+!a|tF}$sL*QuJj|GQA1OE}Q&T()m?YNFrv%0&fA1K)hzEO)uPP67d;Qhbj@fR86GZTxbka zSDxWrhI5&+u?IjIz!{9Es@M)`v-sM&Jt}eWQkFt{*JV=lN^7Ym`IZ!Og}bL2gM>&N z=~deUa+1EUG16}5Pcsq)VLf8SLd0z#t4?*P#)y&HNgmutIh@iKN49AuvSMnSGb=atfU$C&!$v2X9_N$Zm`HYh}Vm8g{i^l5!J?h#YAbe@EYGtAiE_CE|B6 zo%+G0pb){wJs@wms;9dTN4pFn*is@vuX!ntKReh7B(zyL?;dJDx{u2p2S%lahZ8%3 zM_rfQc`2JeP{MYKqutp+t9?nd+73=jrS)eQkRTvX#WywG&h0&+;W7fhgz_^^4>I2D z@8~XpJ9~83ALP48G9nwO(+T4~r5nd{B*ZHQkGA#r?T0D$+u;#x^3LhecsrfZ&nAo& zg;|IfvZi%aF5+*u!0*KK-&&*w06A%16)r&`KXwpqp7EY;lbv$=;>i~>68vf}zj^ji zqiY0^f)Wc7x7HQ{-7XwUyDliqK4k}ZR}k-Lu3q&Klq9bJ4t6+=C3x{R7S%l%y-8H~ zBd^|)jY3=c*G+J|$tBIv(hvMbrH4dXOM@6%U9iGr#b6u4eA@*R*%AV@!BsS|nO4zr zk;_!GAYPyNbIm^VmW-wQ6tOj|V@HeyxC%$bi3T&o5a0>*3z?gQ$e?enSxr*A4u$d% zFe*RLrBKL3nWn8Yo~T9Q%;Psx(bE3~p6)Pa!5aPF5%ffKs(6xrO`5X?Co)OVK&e77 z@IZP1#IjjSKdgh5DE;HV? z??7P=mfp>o<)CB(A5*p-%`!UB!PzC_?B_nbW<%+}Qz}1HVn(1V{QZSB>)Kpdu@)G7 zLq#-37<5wOy>-UQnDZSdeo*_g|IcaBbUf&Mt?;LX@96Z#Lip&Z) z(m)ftvswZs?IAp1Jw3@b{7_6;f_B4^mwa$N&r}!ck+7#m2b&53qgqe6!{}BAFvT4w za?LA>toX}M58uc2wvC1NE730`1_b<~qVv+Q2n5_vR zbb~Z%=UBU=ydwCcM>|Nk$;AZ93+{r)B$u&9g%YIOuoOjGXmA^?WG&PgJ9n)Em@J1? zd|;{TlS03V*phJa@b_HT8MR)17qRo-jtyZVjc4Gm z3$?(|7G?ph^h945)pL7CwX-^?bAv{WG~Mg?LMoSF9F2qZFU=i^W=&RlYD^PV;QAFB z-!~QoBj=1xV5Y_ewz396L^AG3PRb@pEK19BVpcXyBZ+hLwbU~LD!9&wII;eBJ|VcL zUOg95dxlULbM?@fjnE2uI3$LY#|W{>R&mzxeI^2mT3K|3B!XVpr2RV7=#_7MGRM8| zCtJnoox_sOOuo9;^m6A63C9ciDo*uM) z@EB?(KP>)iJGjm^3l~81w#eCb;zGn8ag{Q!yG3K>$;sEsL%Z$u5}$lv1Q<_}ImG=7 zC#bjc4I=*g2?sg2Qh0JYHJdf?jOAv&-eIja=W_c&bS90aL*m^!I;)g{@nRSybUPr{udv3 zKQVvG74P`>Y`aHeK>lir(?5IiRmH37c0BSFR~h4+j}O{rF2)1#SK`S(S{oRr`b~e~ zKi$%&rSnJ_Z}9L_+Lg$E*zh^tc3`rxmNt^`JoM9tNco(U$z*U-VvP&RpDT9Y z`rlj8qZ{Eh|H1%Ca@Y1A2l}Zv=sgZ_^piVqX11}o$y_y_wY|aOC+X$-2ibcZ1cQ#F zAG*FRGSP1@WpQ1DluW{l-;GV=Ld?ZZlzc*z7{XUaRq* zEjVPS)x$6CSrkCZ;3<^DI4ktCcIbG}sRsj2ecbQV9Y+QtFw2C}Prr1lMBgHx?J>`a z5-Q|_Gu!x+TIj=dI^lPiK-m2=Wf0_FIGSr#l?Gp2gad8x z$huMvp1O(R7eGPjJD?N zO7T7_X=Pb>C?`X4qCnaRktegX|LbNXvYL(xvv*(}D|jne}%RS1MDEB-nStG->*vSVg-95b83F;6ud zOIA{0Q(`nEh}VSAqjYj_Ja)J2`1F*Y?dmR+DDI{Vf;gs&^j}X&nWQ}JY_>m^26fayO+@CLd1M3M{6$V#h^j@ zBa`$s7ygctLM+)nJ&`h=A|X*4W|Gqez%0G09H7_~bL$q?_NLCc!bY<@`GFB-Ic)(; zK)1`a_*<=HUFD^vqDpaBLS;^5WBxjq^q4E0cFWqxRj6|BD>oTi+<+`))ObHa#SS$# zjcG!PFV{zc=ULx>W)t)-l{BDIOhHE_`eB!Q>R^gVL_S*DuExOs5=kSnItYSEBzJeK zyTkmm*ly7TUJ#*&q{wa(SSSY`Uj(QU1r+)~!T>0SRA!UoBk-k8@7u<{q)l=VG{;Md;xS}m_I0p24 zStk&Qf2{tf;faKkhmioq@0lM>{v#Y?D{;+hD+c70F8Y@(9@YDo*|)6Dp5NCe0Yq7? z`f%8A@H3=@8u|RdcaL3_956i8==zkUOPR3Pr}JDi%n#|Uz%q<)%Ic0iXigDmGj7?`EWZ{(6TsOwWec^T~0 zU}4~^As!K0&lluu!cYB~NhN*JJ%mpQu!0{SX1?zUVknWvPsIdY!G$7)_)-Yu-5ahH z0TmCRo_*ITUrqFn^Rgn`CxUF&EM zYFl2lknhUf3O`tr+ zm2UVuAZ$`y!(u7(PKoQ*o+}qHui;byDYR1|fQ|8b+$9sVt*M|vJTEeroS>~CW=un5 zIrBptSm`s=jA^2pV!b}9t@0Y}IW1r)4ED-gCsd zzmP`YE}AU%2a_B73YSJF3My?{*Tp`U8o7%BS;v~IKK~|GkP}9UmByk_uj8sx?0Gp; zl#BN#JlcK#E7cm(ai}O#$RLtqI8j(t+CRCrlv+a5t z=3TC2a+8IW)1`Qwtqy|O$7`X~E8WQv>i=PW?_WJ%9#3v6}495{;tv1 z4$qkm%9k5!ohsL`4H96Fdl`sV22(1^)ae1`1&Z+fpvxo9=fIyFHx0Lz|q{uxq>U0h0 z4S|t~8C%}cV_Mcuq369@v%HqEHq1;eg$Pxa;3t#c*=X}$U_lu0ctz4p8aNej;~o^| zwGP%yI*~F=Mb(!6FrZ(7^$>lDMlyqhPXYWntotcQf(sK6JQ(qbgYZB3MiqclcdBxZ|h*SI4+w z72}7bgaxj=*3KQ4*FNl%|gb364hQyB){sq4g_`4SIE!FtVU;f$}i2v0J z!XjO6P$;l^V2}fYgl3>NfyQ4%t45Gyz%3@;xjSTU?G~80qJt*b&WAg+t;ItKBMH`> zF{HRshO$kTZL46oaQI3AO|ZarbYSQTfMEe;lAI;u_qhiy%sPd~WXchMyFPqsTznwU zBsRqTd~&Nf#gkP74MR9jEGh0U5t@QLlVtKr4 zWVt%}v~@A+c!@jaK=o{}3&CsmP0{xa(FYrIEtqxI`WdRmw~ng#H_Nw@BumWX2qb_- zHexY{L4kH1m#e#vXK=n(Np6tgU=5u-raBuKY20nFpR;=kJF`|db|!Dkg>ssFcyV@B z*cvfl{8CcpxN)`{>h2Lj(cxkrCzx_&%9Y_0%4*LZ9ad`$HbDDvLXJ?92O7+w2Nrb_$z>1OWV@HT|I*4m{;L(gsx^C%)`2k8W9KUBKJA|0>CRk<`%N0JlEF?;b@}Sgae6_mc|wfoV#OY%$Z7kbZmyFi zK|ELSGDv z`5@1Mn`<6BL1!M%#5mW{$KnzU;$tG#A>x6qVcJ;>SeZ5k3~q~k$lHbr430B~5;7Ow z&-rp-2LO1;N<`X#YcpP1r1n=c8fbgJk(LzVBvbx=BM?aeE}t^)E?3b~Ek_iBPPK|^ zjQMBZTx$yIkhF4zY!(|VX687F>#% zz?X2PXM~w9bjfa8;Q{lyFd&uUU@C6)BIm|^#wOqWN^9`muM4HheNFDcEb3=!*(}~W zx9XBjUOGhl<&9>a$xSUYL*cgDwpe=rf_S?lY2sHv;2 z-o222P%S;>~Wr+1{T0PFmuNiEjh#D_cIJ@l}su|!`dZE z|K5X1WKdO(w1ZL({^*{VcM1H=i|HEmC^pdI;%4Kk=ip$$-4cvg%tC#+0^9uC{)}E) zAd5LJkBwhE#J%%9LZNvi7}0-GyE9K21&5Rmks6FX*PB-`SrhFyYy$;7OsdmZ#Rx0& z#W%;Y$Mk-$Fp=22DLO2+rn8jMQ(K%VXK-_yuW0EBggGtFJ5s6##kX&OuELRmo=8&S zf>DKWVK@_tABe{*ypc~*WG>R;a48BG0pFuwkqc@Wc*=0>591;zF9GQSJMu!Q^3|=R zY5=>d-v|Z?wN6##m2tQNi5CHRzi^h&Ra!q`n8X)HJ=~;AIoYx2)uu)kHszG=MkgX+ z95f1oxx)e@zQcZw56F(as5S!C{TP%pvwaoGMzmF^a@UMh3WQi?>^TXMd3*mNwji6R z^hE>JT%`j%!4MR34*h_xcwBfYyh?i)uJqM*_U+t@CY;*4=@^hEPvhz-O|!KMMNUS9 zow7D`Ell2zQ2{J8txM~;EqTGYOI^0g3PEMQ5fFJGa+ixuBt66k+8aYmRge3Qhl^Y3 z{JN^9ZTNen$6(Q9V-AwivJD;Jb2$m{+6&|Ia!c!{V~hI9j1&c!%D9_wr4{yD&29mwDg8nRG>5Oj zO{hCN#9r)VG#@{Wsc~iDV?J^+_v~&LU8^Nx8?Ma-)+uX@pXW#C&U?~64b>Zw| z;nC_&n`{r*6-m~(2b}_#((|o##r8N6hCK-M(I9rX8>hlCgv35NdMT_vKAOVi<$XL*+ojhg@z>Cpb}fBF1Afo*o=LP@~N(&_)|VE zUP1)GAQ@u!=X)K%hYt?)I3XRwPeRD=;y;N%B&H*c^Uvkv%6McO|shHNr8J>K;m8I3z|| z$QSA)vo_t$vvkeCw3n3_nSC+fH`qOAPQ59z8z@w+Cde$6Q`6GCPlm~(qo;7dP+8!? zXwsETh^n`yS zVqj4ry3WNQUF>vVQhqR2u$m;GTRnxRLnRy>`f_}8^r>WVPHYBPu=GVAi91*PP~6*T z?~sHkz^VkS8?JXDSrQIK!z{WThv-N2%n4Gq7>xV_7+SCzsWrkNOjYmkxsat*1vpLUMwz?l&o>}jV{ zk9Fv}mp_!zJfr5TSTGy{a{=ucvR&Im%9jf+%uq2+DMh#YZX*um|90gmZfFxTmN30P zcCWr|QsN!WCiDxW>E4=9sCG1o;9Y!^>05w+$xH7bWcln=4no^O5s%Yxz}{wI0mrd` z$Y9}FFD+QA=@HRIt+rXiV{<b(wuw>Yb=$)PduuOIv z=$cD2jWRPukF8cI+TU9VSBuXzo0B?p!V9boEvrqMMEG|?xXfA45AWD%oak011#e_A zUS!0v3&M0?-Zc@kMe*;OK}mqKc#{yy-s-&5;Xn*loAs`$OEwIO_+TOn9jjnD3g%zb zBM!o1hOw98Tx=oMOHsOlOr*jtY@>vYCI7#YCc>z2JZO zw5NQ?cnWu$)(^h^Yx&6Xpl65t6pTwNUj4J`z+8Xh)jvHa#D-jXEpp9HJyW`CApb~a z5PCPGV$VBJe(=&X#UTrMZIm&yxb7b|<}&xdh) zbD8clW1*;W*ERafVo(FJTW%}2%lYQob=3&&jmQ#DCXG#zJ{|9)ObJFKqbw7Tlrimq;cs{e> zqnyh#4T$!iKGOlY`#x^2v2ZZ14e9H&>+4U*H48^QE9VN3n ztpd{3K!N|)4b=taq77@2hwE6YaHEmckQ}ZxyRuaEd8+z-ra=2WPrnS*tN*MwyfTg^ z``eC-^b1*o?@QO#Rb(+KmXczjJbN7NmeD@^{{~{O6T-J~v9dxY84FMALTAtx1Bdjix)3oSpKbuoW2J!2=$WB>mK5v><;5wG5J|3>= zb;?tZ8DS~>0=5ZPgpK_U#jEC=YYzefA#_4xKrf2b0quZ8G*%bZt1-r+RoCHEn+)L% zL>h486)YEXYD&BgRm$p7IqEAJp`cxoWlOd(BlafOoVU^rwks!7VY;;Uuh|aFVAvaj zaPDylNiXcXpwBYVXF&8~T^tCl4T$JXlsr5D;7r%wA(6=cQ9F=<(|Hs0;KU-4RzNxk zQW>OakV+sakWrci8LP}iYGnaT7r`Y5K)3A4D$A#>RXI{W{PKs+-=d4EgCknHRA7Dj zs`K>5xg4Gpp zdkMkq0h10rSe1y{w~R)2G?)JtGZB%vQpP}!GS^Q=Qmj>u5XFkPfD_(IFu04(npS}q zYXty)gPSr7c~fX;$BMcA=D)!gq<0YT(tV*9-~me|?MS9amIt&khz3@zE!^x8osY*# zj*^rYhFW#23<%W;{vzd;VKtI=I)xlCLuTk`Cue;YSc#-Z2!aZTMh=4AY7w}{K8TlG zY5(5y=85kOjV)@MCVdveEoU)kowKf$Uj&7l-UQrPsjR(1ZK(fj-!jwmwtatl*PP3H zzt!|V;%yWh-EFZJ@LB}+Vw7Szwz4+Iaf@{Pq(Fly=U*>R-|5F(ZB z;WCs_QY2ED2{js_%G9iRVps@ky>Un!Yt; z6HpgaXFpMWo~oX&Qi#g7VHgxp`0uS=tD1M}*1rtUOc&E#0*mhx`X~&*XbsAXA+_l7 ziUO-Buo_{XtLXxOVNsP2rN+Xi^~W6YG=?oK?;+VyIYb$u9N~ib*&D-_yNWLY=2&=e zNAQ27*4BC0A;>8i3bS#YS0oNX9_!w>fz7?DZ%{9tf347PPSZ5ZJG+&O#BW{X%30-m zKB@huGyWb;PJ&C5@X{60rQP`ekBEp_2P1%{@@|vpq%R5bmKkxTErlggCl&4nbzp7Z z$GPxy9KUJ z=O9=o$TPCH4XdZAIpnIq9sr55T&*4;1Ra5~!^u`V`D#~jjC+vO3+7N^UY!E$$-9`N z=2(>{zzW*W{jD%k#`z9=OUW)-HlQ z5%$UA;)M;n$2sGaRX_UP@uyeR2FWP}3LsAq;%T_yN8TBH>>FnAFBzYL>F`#~w;z6Q z*Sb$@8kbR%E_>YwA*8O0&PUCmA$WWyHfIUH)VZqSXhFxgQwase<=%>{egZb5u{X^K zcd^ZLZq8?aJ%p(+9E`e}kwawa&c#?IwL=s^2N5L`XI z>b1&Mq-{s#zE@K!U*LlmlEZ4r9rV}pqjhN6G=TH8}<2!t0b|qzV*(|W<%CXHX zjpIXmT4EVxb3~n^6KZ*;xgYfy{KNAoDxoF8v?B?d;46{#}F z3^(ap&p2Ve&oX}h=+P+~2`_9(ziaF`yGXuo8`1?%x4d*N6T_LqNu)`6Gs z-}zE;_=Naf*7}XJ96ph^_|2@Q? zpP}FHQ~q|}p4ByH!uv-GnM^CYTgPPiL0dsryW=b7J1>8DL#JI(nKgXpdQI$pl$l}u zy3Dy~UY1;}-jPg}q&AzrvZo=rQUG#4z(0#?zIfua5wRU&=jE+w28-}Ql!<6~po~^F z_&6Zbv6K$k;%nnK{~|2Z|phebd) zt+voJyE>Xol^W7Rczg?KhlNvC?6z-1;So}*!K)_Iay8N@Hw3P{xi)) z=_}Xsvh`kD3TsF0i0&uq*u{0u}zEjFPe65HrJ>YKwl`Ayn1U_!B*20p9M%W`{*=X=Wf@ z*VjAX4iVji&XHHrp!?a?2fFUasD~cmN1+P!-~Fonf))KB2_uHAkTCLO9CGAH2j!um{@xctoy9nf96YGfjlx*~T;Mp1w`X!}!A{+WL0^V2u+P%Gp(k_;tS8|!M6QUi z|A^G>L?;cZ@DYjM%5kwag#rm^VDkh++z22TXx+@j`jZ8*gGG~+5Qlou)ww79giQK%BYEJ zX!V&#_Zyjk4@vuGfVyrJF)oDbI7* z;*gp1T;N&QPHTL7QdA=KBZ_nF_eg|pkjaf3a~xTc#H>Ub3DT16muu*8vj>t-Y@`x! zJtTKs1bOCcIn6~oID|cM5z^8v`riufxn_^7j`!I=7HCTH!d@iM0*M1yKfyYADUaNi z)If4!zXmX!t!1>sr$G%9B+XN9EJ^Cfq>-pqZ=P(6R+Sl(pBM*wKb2hD;GP+ZU7q?8 zJ1i_tg_$IS$7isZoYb~RiTHAtRU>*xn`nb2^kIvN=-hPaJ zPDXT%kf{)sMH4jU6ex4xU}Pc>&TgW-m)=UTHq>zK+3lxgA3IKpAUk|&w^~@HA4|l? zmYXJEko_Mhz)ay;PRlSdH_{yJA2NtgIN>|1$Tv$*3|kSR=cY5mwx6feS6}^2LJXHW zmjZRKYKwVsGx7nAx|L)T@6;MufHL=-VBF$sNv<4bgiE+Iu@bP5;wIs9RvSd|iA4X_)-{gDd>7PipRi1c} zG@i{-znVZk_>HW-4IjyNKfEHa@ZS4Vauevx7TF zc z#T;rWR&P}5Ih&7I<+Hl>*V*EPyKS&waiMOujfKF zY_hL*mm+-`{Fs5%VS6wxfqFOg3IvQQi_lRt(eVGclIQImUz4E5^K~aHH^QQcGPX^8 z9@`X*T_Q+eAsRhNXpL1##MzoigxA9x8{XQ;@bD=TldZbo-XI9FT(s}EGOYZ@;Z*a+ z7ywBK_7m9NgQyA?A2C35FQ3W{Ksl9_tgeWZD4}PHS-E@X@k0mK40Tu#rkWHHnn*Ny z$+PTFU__TABW_ri-Ueow2ChD8E6XzM5+babrk~^t&=SB=-Ot$@0~F@}YCF{X)Trs( zQY4v6IVA`4knSY&F>O_`Eyb`=AL*L_5y?jGlpl>}WShslI-NkNVb?TGL%E;|uK_OO z&?Kkdmd)1(KYkl@;`?MW@ywaqaW^$i%O%;vG|eU9Ox9X3y5Nw2V6(++fb%+|HGxU4 z)&?|w)JB9tJ+zK5JYuWrv(91VP-SQz;WDm`(Vw+M7&gh-P9x4fW4d)?`BtZwxDe37 zF!mbe6ZeqFI0wZjDH{sT%s%&z`BZWRDaexMH5cw|Q5oVZDVm7BeH*Bg!4405i6(4O zBIhB9kuAZAY&_F2_JMf0MJDf*2)4VGdUY(q3pzYG1q2pc+^DmmxQiB{PC~$r+~lU9 zL9R(4(`4F>GJv4jTNr@TI$>k2$7FvQNAiP`-OXQG?!taaC}Y%#Q;61xww@iJ>;zgF z>B(piC61%$02aR`82l>OMb3?=O~`H<)r+;0^iN5rG3sk`uRf}YN>T4M9;>S6IHc%|FN(g? z!hbM{m$*qMCOTUb(@&Krra=Z|J-O59;U@*D1(Fm9EXtr z(cZ#(Vh|Zc`j~ZFg$NB*iDcY0()`JY^%luB>_*3u>5J9SDcOvLpR^E(+R$r%wz6^8 zKnNFau~Wv0L8T~@s)G(VL%eD;deHo&FA!e_H)Pud@-h0ht+uqdU>S4-QqjN(Mc>F0 z)+K=obDTPpNIh>>&gpH(QU2_oZ}q9V*TKBi!rbvmu(2?|_!DqQ9YTw@T8ZG(2YJ2F z+<-?%@U1=HgWStS*(h+{MS-=5YZmArn%1U++Hc%xxVcG0ZgN^uu z1Q4!U3&d_V5+*bt1`H}*YCsS5$E0(oCXxhA(2=k&puo$4bdrB;OLu^v=l3>keT3WW z@8}Hz;t)cC9y$dyD5D$Ic>I6= z-C_z-_h9WRw>)Q;)Mzeo-{$*9=FwV>3uvU;_}Z;`=AAy|8@Vy2 zUVIuE$BpyONbI@*C+ORZ81dt-%wBhuZ#G!w?w3KPDU*vLC5-bgcwaN$&XVxZ%D1?*Uy~6wsYX4IQ=73ao{pkG4jk0 zFiP@%!s`(cPweY2KPP7Ks(!6J*;uh~PPu)+7m$L3K{oDr4G;OWv~6FvpI^E+Y^#u9 z`v6*G|KvZVY#Nq3J#m(kt)pIu>fnUnu^m*1|;6Wl^@66ih7L16p{kjv9J@S7>y=-xaq?FWF_btB}!E z<`*Vae#b}3$P>+xyhBxg@iUdnKFVwXq`OGYq=J*XBiKESlWmcMaD#wSMg-08#Y!i@ z;v{53E+CY4nv0y$^eOO^z$z%zo7Mt~S8g&O?f?rMWSy^VnnUhKo;U7)=_=%h0_$th zbD#;|Y&(U=p2OG>Bwm?;Wo`LR&kEmE`}YS0w4xw&yatdbmwAeU$2RWt@ZyFEI#Qk2 z4O2Ta@SRVZ+-K>X)}*IdWBqhZ8vJyO`oh=}59vliOBPCd<+vfo$n;cJU-rvjUebB( z6#kWpBYm_fx6=J2N$-cso4<|eA>SDKd}Xo(G%t-?L9s1&`n$=gN=;YaWLxM_D0iYy zV}97aa1UdH>06cnczNjc6TzWe#4{5;w z1OSRKh`{yWOVW_n8_P!3LW{yf6C3@ICkBN=(q%-gHYI1@Gag&-Z0IruDtFw;=eFxT zaLhxQm?2Lv;V&<7L4Mnn^OizgnrfmPpA^q-EMww^OEpLR^t7m4-?}|VX4mf#NWgmaxq;uPA!ELu4AVFaUX<%*_PRv zI*&ONWiG{-H$M>?DQ8j2J-Ozc41jw8hS^8FFli&3W+@s11C+I2xBm@NZ#%nkHDqpg z0X1K<9xM5yy>PN0-LOb%{7@t_8eN;v$zGenIv_F{S}PmcD>vw@v^fy-cd<_>En#jO zOv4g@-;5Arm2%-6EcPDK>)vBt6ma@G${WBFL&dr^--oJd*nD_OW&!RvHEp)5xzBku zi7USxqvQ%FLX77tKzHVa(P}N zVU1{X45tLqh-T?r4obLfY zX<9KHqizJ@!O+@7+V>5uU5>$4p8H+Vigmz|40{I zcfaC}|JsSjrF34|#f99#o(FqEO_3 z5T@cgi=N7Q3q4izP>+aFk%6~5c*HUE1_Yi(G_=^~kwRjTzINc<#+Zqc-SP6hY~6j! z@MN#q2WJIcBspQfqc^~#Zra*P@A!S7TR7aB-{L**{=uD-ogXlD)BX0wT)A@VvmNwP zW!$5ps4B+HzZ4p4V_BHzJ(ORCHAg+|mr5QK7<7f%VPF{d!v}mb@b?P-c;8isTMLLZ3QGmI;b$i z)}a3BxtJd_1EvnUnxW=Fz=W~BcEB)=4Bbt^>5~DXI64Zs7CLRezgVNAg<02G8Xtw)c4KU|)AyV9T^Q>j&V_&i;%Da1jx9gmTl@&{ks~Hb2Y9m+#D|#1 zCmB!VU+aC&gaz9_U7?IrUR_6ZZ~eI=0B*mk^N6`h@b>2Vs=UEl0sM7D+gm8JIKpzb z6<9||5)&E!K#BaFkIg~;2&@AfZ#`KDR?K=Gif#g~^^R0Ov7y|U=71D@ZIivl{=00) z*Fy0_s*y&z6<~!a7X;m1>)Q{FfD7fDNRHm@$M?HA&rbdFD9y{;56N3=zq>4nmE~6n z#SS1^hV${=Uh&z3y_YxT@4R^W)q2?U0u?nFZhSvrB9x;;E&y9#_q-+OqSt9T-d?r6 z8Sii)f|03DW`kbb=~*Z1Pz4+k)y`(umkHa-nqJIdS(}VW&;AfHvFM;7H~3I9m_4tv zThol1{DK6ip?0Rfs=~%@bmyLyGlRqtMZ@uLcC?9f+G)xyTh>e{PV1Oy^W`&RTGcax z>5jVlzr&K>w?6t&p7=t<*_}XTfPRpJ0YUuJMy)25%vSNCe_Tte02m^$MDhlyh9$z) z!v^;6S4UR}YOE6qBI-@8ySxRHt2#d#x3Xr-kxq$4%A}8%eQK?I0NS>iyb zs&nHaKM0|3wv&dn^?Wuww4o#F(7T)SnJ}jDB@8SV@Q&kPAX6~v+3sY&2$P=S_N<<| z3ULp`E{UGUusloW1SiOnxvD^JK*25+vCt>7^?lCiME(_TP;zjxV)T7a_56Z!xXw=d zC7WSoriq@fh(-0YITyJ)Jx5o@!$jWj4-LhK!M`=;vaS8*_!95^vd6Vg~FAQ}W>w{7%R zfMMQfn#(vr*Y*X>a*yMb=VEWeEyo)hA9^9{diK*TE-ImziVZ{|6BM8GyQPpE7u2P#d;1N%|`uPX=^m;;~-r|XYGG?$*H+?7MbKZQI z+OG3BmMAv+{AqNxJE)*c4b?z3>I(f~+ztNV8P1x1bpV)lzw#-gvOSYvhi_S9rkfl; z`pot}LyBilky_eaQH&yR&^8Ix+XV)Tp?P1(pLv2ILt^lSym2bQfMLy z0EHga<2-{nji2BYJC~xCQXO&vE^!U*N%VNv z88o%5W}fhAV+ep3U8>L8%-hQ3HsybzT=}NUakYI;o5s)33kU@oC-{z~$En`W^v;XGx#r1sI zZ|XtcGp9#Rjyoz}RSKECc+nZ2uq_*M(S7LYk$l(9!R8C?pD)tr;{9Gts|hUMljAjq z8d1OWSC`s@U=)PGt(*F)Ez_a%Q>l$pRcp3n|3veE{6ioHFQW#?*3PAxI^Ml5wl*`1 zK>h7)tRm_2*qZnjTNf9x|Lv?|+uSG5zT+^DUPk*Wv57}E^DKg});s2WOVlrNpE!md zC&OgN=ytIH#UoH4H$D#p8yhOX4b1-+l!+D6od9hg$J-I3NMHbV}b z#!q9ZCjE{pgD(D_zQ-GBK0HS%DYOAZo=v7tlENJEd2E>p+ub+hCpOeYw?%^7mBGtb zsZLY#3&B@xO(amN?$$3OuR<(|bjOK_7p**g>mBvqE|!x2vyupNYIs{bY(Xg$|F0 zctvC$AWs4QsLWjNc{3m1rz?}m)6$2w_6Oeg)2=jIk6#{1j!wH9qwc( zpk%k%`QgZM)odk1Qc6l4TcgwmfC8jw*bAY20!z%Ri63Bwhq&Z&J`6g$Lq_TxcDJrk4^)o*_A_@tDQKxe;&Y?x3GrM z3qc>#IXlEmGs9W2Bd^oQoA+gyUUtb+MVCCWSM9}h_U6_3b>@yJQ1BP|b*@NO-d{n1 z3kR$PxET2a9};fyy>!U^;yW%sS=dE`&KI5!^5-_zl{=zD!XIVYVNn0ly(5Yh->q=) zmPv@dv?oUh?dU|2^$vibGX7PCQkuwCyw2&s^Jm8_$=^Q4>UK%pK1SZYaeHC2=Eo!H zWNoHkVK!MRSugFyObK?;9nH=btCay$b?THoQ1#99XHVB*R2?qHOxU;LHsK_kc@V3M z^+Xr&P$ZpWb@tvaj|ey^0;__Z!g{QKzmT+hNu5-+Eln31Wc3=JP-&1g)fqi|erukM z*Iud^c1jzJ&Z_M+Sx3qCt|-z~V`Ysi7-g^XwR@ZjUr5}wJ4E-A6$b~d5v==Nkd-UR4lT>&}mGBbJV|u4P-k`mk3|%@YO9Jidjw*4bCJVfn--5zrwN+o& zH|&B`#BCAVf4p9Rxidvth-oEH7Hw>B+B9?Ezz}(RAJq=KogG%S*kiksg+_oe8(jB< zMM#pGa}maSccAZs5ZAbHB}N~(5K-MV1fIUtv^E)i%ukFfKF@d6Y(`6wB$O{pi8eOa z1AfR4bP&La{rccMw_R=i6Q&#qQ;?&+}I7V;|otoZb!$dmJ(NfkSj1K)_3ADlh$iQT+ z&AMUJ!)INe8XXrrtFoaf8EMnKUC=3Kvy6xt(e{TFG?(KaD8hEloqx?CO`7=j+qs?` zaj2&&do`C6*mxC6djmY9Xx4?%Hap3)XP%PhB9Ak7zAlTVT=K=QnmN!2@Sq4MsPW+IPDqV=Uw1;v?jlqgm337^B4e{q z4>B|Jf?#GEe4iUXf>UoDsnqDAPaJ#)9vO*itZlSk@Mw(SiK@1?Z&$>)LnJog z$Sy$cegy*RNDjwVSRqd79s(D4w9Kmp?xhk+rdoO%8@t#TVPg+B;z6?EV=v+JUR`+$ z2ZsX$#ubNkjRXu}OR?#2w2uroEfu7al>O;*<FW#;> zuxep#*sFfTS;lIaJ66E1`P}xuNzbf3C0Q;uw8m~MR?2yU>ab~CFLGd z*Oli?SeL$*&^7;9-%ilmc;mU;CiJXBL1BnbO@<*42Y%xs*msCsbsxruVJUYjUi2YE z_{i24d|m9zh2Z>Dqfo`>B4cR{$df1*JaUNnXliZGzpVx*+z}8r8|$YzZBa>}cSqNL zKxj!>qVMfgmF(diYWN5%pNiEoaqvC%+Xgv!&7Di(+_~b;9q!y6I<|%2XrqH-PyZ@hiEtv{DhBC z6)jR933y<{P`j8XXPtfm#Pvd1>d7WI;e2Rh6OaB*{;JOvF9OF4*j2VU-&%ok45EOu zpt zZh2L8h&7sMVs*~nxuYFw35yYiZr_R3@*sl(c8K^?!;_J-V7p4d?NBuA<4NR!L5Zd}}cwSbOrymW&b>6P=sZ@j2nOAPh_X%!BWW zPG6IBnzHxYN+O2Sy{6Mco*XwH-OV806;6`ap!NMwYt062g(E)u42B&BUWmWDX;tyd zcYHt|C>tttO1|<bffylA4iuqMYTO_eR6uw@zXap4 zapssqy+-#+~PXv%tJOL+QCG0c6~s=WiBsLIK(i_r_5Norc*jufix;Is8INIn-pYwWtI2$Fu<0`ppsJ z=2xQ=Mhq$o{9^zY?*N^H0?CsnKddj@=U-hsb9FSx*sB^9L+{s{fa3coCXMWn!9)5D zZo{|Pr4Mr%xSaE@BC}`hmS35Y!vJNUXSiy}O!P;#5WbJ~qF1Dger=7KfstVA2|#BW z^J!ZSB-^W~@Afdbmi5+&)l5F0K$O)?Ps)>@8pax||48cLe1K%_KuY6x#cz|!q?LzK zNnU+_Y+6PuMbXx2e-3Z+P|olt6u1RoJSe8f$b*PR7IGM}|PCuX0?0y2Gbf9UP?T&x(4F%$;M zmd!)jozt+>LOHmSkD9uJ9{FMlKg}{%F3{jER=feF~VOiC;+GhZh z?wy+QYGs!rjdGNgcqXmcyKY@@l~UeVn1`Z`y$Gc<2i~#3SWwbSDuk;VZ-NH@YO~c` zp_ocbhT7P89^M${?w~|my#m-$-tvbc0;_EfRY$r)o{=RZkm2A=l@2W&?G>1L; zLJ_rw#Ddl38sA{r5$y~9G&RQOl128D1(v`%Sp`MMsz2vfnvc6371_T`dTgJ-A=r|$ z@H1d}XauGnZnqbnv`X0}@Jbp0x1+$g@Az#G9=vIN;)6#%8FaA31H9N%M_S9vWgndq z0!uq0bnb{uvYbPibJP6sRE@oa;yer|;D&~o@$2u^57y`OWxghogf@u1gDZp0JPAUK z>KuNj!%Ya86=iBISE`O6(;mC+L37;358vDES{T6*9dc{v4BA}1Hs7`*Q8J1mz2uS_8MmFJLOfmsZL zgN%dM%aIceMLoG_CIbCGEDz7`hP_zqXh(Y(+`<`CxOBgA_G9zys$f<_nsgg3$P|j_&xTCfbC7Py+W>u6~CJddMOCW5| z6hpnxrAFt3L(h-eqg4&HtUj-pD62U=JD=5^o{C;d3qdi~@APcug}R=3m^ z?Wkb2iWNF_g~Ek#&07nc!Km~EFz+Hmc`BX`-K&B$3#jS_oSw%l!MvW8+u6^lv#_4E zJbA+uc*8VEJAx*H;|kvpsZoX06tpPJY$-HWAl(tPDmbqBN=UO+NOOW#3a#~+u0v`B z7*%xsQKBmosO+of{$$7@2iexKQ7!kldS8B)`&kS7GxgNgqoS(x42#CVVHMWkV!V`} zkG>0IXmmBk*WA$tgK2phK*_TMHGGOSiD;D1O^~7V*tUQ_D07j#e&NC(*+J`3Qq0n% z(gcloQdzD=iO2|GlO(_jP=bnpV}g4z;zTF%h2&(^%cyL%WstSgXW;=`;5OhN<7Qc7 zqt>gcmEUNI?QmJBilc1VjBh!Bcw1jlt^-?I5k=Xo0R3hlw7b6#I{pr`0ahc97u;Y= zZEwor{BeN(5dOM^5EA25USkCUssIS6-q6FGqyO2SE`W{v+Twk@Tt^CBc!AgYG9}g9 zV%;+u3w;xqnJ2Uvlmgd#k)AP<=c#ZK)Q$q9gV|&&x@=c8s?v;J^GhOLo{3&Z0@`gl zaeI6lpD<9|(>*v-B!i^AdC`=ub}PA5o2hvcrlV9~3tF?)A%P8nU9cJ&HS$W^&; z#F=XtFipC+Su|JK8Vw`IiHv|G1Ac}RBnSyW$n;udhmL)!VN18|y>E{bh*Qf` z)?(rrQ{jyY=7<2zUeKU#dd$0$IVHW;{ev*RmGjEXS`Z?x2C{G=M$3;kCO9+jG_8a~ zfC)5=#x}DSW&ULu0TM_9S#qs3Z~iKd%*>+Ftv^G6D>D@|m6NuO!Uarhw8*MPZf3B| z%AgRSO#EeG2`#k7|EcZ&)H267P3uC}@CZu#_<&P!Cd@);%N++;=9|qdqkJUMmIZ5B zu|F=mJm{6z?p|gOQH@zX$lk9uEkWL|qP|;2JvZ+4=ctDBmBSVkYB;*=TDhd#QXnSU zB9jY*Q>JlQ!l(%`zc4IF8c^J)F(#!JQ)xsdtr$rs$fR#w6A`*SM91rbBnzCZQezi_ z6qxLq+a#WXB!(!RPw2`$Y>56DUO;h;!t4#I$CjwMohGbT(pm>aEqSqH9$>j;(eCzK zv*EXq1<2D~`&g{Yve^-Z^dfC(W3}eyTu57*uI2D@KmR<}NPi_=briG0UbY07`Dc)q zWGPO8k0KbMz%dCu`FT&Wn+&&QGk3H6@?$Hu2f=;XmWeB8VCBj!z+uH(9at*F=d@RJ z^3ka{t9y2jM{y2T?D~eumF^$k0?Vgbu zOPO`_JOCriAZnD3AOhxEmpu$(y8u@T!g+^?J!6%Ds2ZN0>}K5hUBexnbUOVrx9yw3 z7PVKMB&se4xbx)`ZA!&n%2ORk9!q^W|Fb`*1sF<(QB@lFjly05IOp6SPHIWxGfN4zY zHsfHr7#_2tb0%e$JZSS^7NENcK-$$M!exds3L`9BghH&i%%UuXC5$gHPDxi0lQ2PU zB{-T$5+g{9bSQ^FWdI^b_!XN-Lvc=#0inXJ#KecgdNQJn$Qp$S6$M5ZHd+;rCx?=i zA_Kzmc%=odDm!ghPt@^FMaPhIHtUIFtELc3txJ*BR6M2&7yi`PNymgNSNqyABDm4N z({lrK8&ZLB$XUr6r3G9y5cwNHe=45;58{uYgu+PIgpY_plZy&ZkNkxH3b5RRKWn$WA913uiQipTv}yO9Rfb^!iRIL+F#2CX6m z^c*JTa-`C3gS3~k&}0nRIU$q2UJ8VI>UBE$ea%1*bVDX_ke^(_9IFd$%fT&3@Ib(? z=j^xNkS$hGK%-r(RyUSgw8A>ICnpLHZpf-oINAa9{wnr4n{AFVT=a4s<8w{xvKQe6 zhkA)53r=22h5t!{wp*BP(L*c2Lk|g9K||Y~x`th6&nvnn2Ue=ws^PS|m(0dDx*K;` zOU(^+nnz-`-IH{IRgd2(?W_EfNZYCvgr>8Gc4(RMY{)HAD|frE;;xBgr;9h z<_rOeMdq5{2tu3Og3q%>k2-Wrlov9oQ?B%`R-Cl)ZqGeGJ>qAq#69xb;bE53_m-iNMLuOxO-POXkC(ao7ya`aj=%LAoxVJyK2Q zT$r*aTs>BEzN~~!dLt{*>*o$WLkarH{Bts>zsh`4Ljh0wh#{!dipoL?7*7s|oIZlr zj!4aFfnooYlTI|9=C1wj=TDz;?TnqM_z=?8Mo+*ehSlnE%h3=jL0U?jmR!(HCYZs0 znF|YYlDSa(+5mNnz6MJ=ID?Bwj_GZ@E7E(Y<|pIC5;t_DU?jOEvayK;O;m{knYh5_ z0+;K`6H(_3#ll~)ak3D*@gefJ*sDjr^&g#YJvh9-C{_pIE$KtG1z&b?Hk_D`D^ds} z-tg(7uxl5N1t|5YKUyT}y`u1hs{S=rWE_>6NGZF2INdZZNUuP zJVi{GNy}q!FAp1c(y#s)2GN-0xR~)Pmn^zl%h0Pwm=X|#ZW#sJkzOAitfjZWDbBR1 zC>fP_E*%8s9s`vgUN6u z5`D^Y`=gutC02lD3VbxN^HtGlY|SvkSy_0Dsl+wvz=p{8QCACO^(!GX@f|#n_rux^@Q6q}^9e%c(7#|s*isuuk%_ieN1q)dNjsJT zZ$28+F4I0wHbM6#==6y5Tp2-KFqo?HNLy?n&=licCzP~4IrTbM*=XMtP8e^rps2piN)b79nIes&^{+sD`4LCK;E6)KbLnrkFzCHu?P2R->k~7XXc>kQ zhyUr4L4Av)XAPmLL7@K}OC}0E({f1T+8x6Vg`8sSg$jz=CD@)DLU+iPsOLJ&ndgz1 z#`)zXkMT+U&ROmkHZZh&rFZpq;b+SMF0KHqIgTqhUF-xvVVaadpri&l$_Ao6i5wiP zx;fbDJ;pDyN|%DZ0b%(Xn0dZ_C{c9F3=ql`5Xc1l4ucq2=MR+(A~-^t(?}9Yn`E7w zryH?#8ptBPXt3BdftV{C)>x#9$xC&cZG%DoV!RO`0Aa2Vg~r-G zCVS#%W#M(96E9^i6I`)Vmbg@7iuB9vj~<44#lC30Ltx?h+C3Mt7g3vDQ|s?i85;}$ z&SMj-*h(H2uLm`hum+9OQ;|WHBVs^R8Cto8;L_+A(1w{AVC<}UFhTn&Q%uc=%H+FW zVToadVU2}Mkd%)n)#EGb#}_d$0GKj^d=nNzI%YIWf(2c?T9KZ2i2(p)0R+f5Sseh& z`t^1M3!DG?dIP|Kn=^OAV2K9IRd{dcKNXtzHB8VvoGO!zvqugxhVp zQfcGf_wJu^;U^f!UoG%2m;0nNntwwa3MO40B9ns>DIN3+{~@~dMgyl4yY4-|*x2#d zi}U_7&B-mW@WY0bSwIx*yN{g_;>sVcaYNzT5Nb(WeO|eQax69L*=gN)?>KPQy?!IW z(l09`+k+Sb_L4l-XOE7iU%q!c)mQ>2qM5(vl0cMD zhSdO0Gtc@&G)+v}KMRw9W5@^?HEQ;(ib!uDgkQ6VEJK$xhqNZr1QsPw+J?%NRQufH z(Z^>7*BP%#kV>8rBSX-0z5Fi1h4`%lvbO4p*vUxuoHj`j+nuMHpN~!D{3ylA^2M%1 zA*BTxs^P0`9LRd0=YYc?ved(cs(l{?GHhq8)&_~pV9ri-s=$WEOza7kY?hgFI@Su? zC_tf3`S|}6d_t81)CR{wevt3sHlFd@irJ{r%84Xauvrd+MG047^cZ4aO-|^I%6j@A&tHZKgnJQ9VqblpQE zwO})-Elik2QQM>e%a<9xl4(j_(Qd%n31uuUaT{Gjbo7q(t2EOPJR?|eVx2wEr_zke zpf;h*bhu;1NZ+<&h7nZvucX}}p5|%#(>*9UsR*;F&5pMi-Q7|dqg%EI*ZT%zhqzru zyMZ=tW5uJaELbpk?2^FRRR_t2iN4oiJDH0Nv{N=E8|Y|T*!K62kBczjEle}Ialo5y z_dev-dM7BKxz9&?5-5d0Afy>Vng-W`3>%6GeL+PH`t)TZ&M3w=5`8m|_m12k^8jSI zlcqeH^N*}etFx?1;_*a+O4@9+vCZDCa>y2xxzLfILG}o5 zEaQT;;X!^T%Jok*b1X6qSv;xG3qvn~eyOIuRbi?|7>X=KJgwIoItex>C)#6}c&UN3 zCJ-dw))-2$C^w^vlf*Xch}O`(_&_f6H(Uud*OrtlU`PUvgxZl@3U3XDaarC(mF~-? zh@s>vNBwRCU33YCmKMK{5}UTiq?wDQcVmOVSZJOX=52oHDtI@R(eL%H4d%C{5e)#pv&^Ntc7{%2DpZIqn)#PN@z zQXx3t?6u+vf%y;StUO6zMY!289Im@<+iE;_Gk#LSk0yjV=sq(N%p6J&V4%)T18y%fDAB z)Rd5#gXx`R1*Ym!%9bbyt2QZSuGXb$(|Z;rV1)wL7uTS|^4Ysx3Vc~Y=YD<~g1AR- z_DCQ=a5T9rB@S3ZEoC*L5kB)fs@$1CsDA(|B+56ym>e0~0&EB(`}M;95i<}hjgr_G z*dBk|mMD}?RwxufY0863BsbBDyVJC4`3yDWv(y`ZHY+oTlTz1Lbp$Q!c$#D$$>s$m z&^$~tPo4$vgD@?iXnWdYcQD@7$QV9QrXn@rOCaH(FN2vu@OXe2BgO)-AbdClXo+z= z=}DRd=DIj&gY}}c1ss`1ok5&tenG&boa?AR33emaK68+sL?_nKT{!A7$@STp#gS01 zo#YAU1HFaP=ZpjIa&B{7`cZb54AHB5>NGli8s*ywSG`O9i_}k#rk~aXG9Ka%+ndEY`qmbpS<~EItSn8=xytKm44)kQ4 z7p3b*%ZXz^ELgRj9@yMG@x#XQ^0_Q{C}Jra$PPbQsFc+ReJ&u|e+NJH?;!;0OtsWc zZ`dD+It&{YTD-&SP>Nj5hHyE+7OV|p$X4Lvgo&@3ZWPq-j@!sDB3On8kE|(1{#*pK zf=g~AEB5;u1H22@o+RMR4~(0q;d4G{p?vUc_)AJ9L*yH4LQI0HQr|qK0x-Hqr0wu_ zb_V$j2mrORIl8(6Dk5TXWv!Wb4#Z34R*mQ{ONVV=aeXq(Tie%%$3Sz0f9Wu!&}aEy z16LVe$Jj6J1{Odk)G>{@?SRC2`3Zk3zljid&W93v*by9uh@G=o)v}nyw2L$vq!0_D zgEVBta)_?W=W-z`Xl}1!Qjf|Q#1I-v5(_2-sVT-~AV^Kkp`e4d!5g2+vK0y#SnIs$ zt-x|TY}2rO{_7L=YJBz#f>!sFN-id|qN$FYJibvuiqh-GSQ(IzDicnyLcp?UR#FKf z8-W5p;`4%!m*d(KS4|NvMF}X`|3mLrf1WCP_UxZjaK6xm^I1P7)GwUkl#9=1X{xx~ ziAidT0C2-4lbIxL{B$<&b?|PGHMqn@QD6g!H=n zy|;Vr^h|a1vE`|$Cvm!$FfS&mUQY}s2&&=xdA9Zl~%liKTQzEzURx46(=}IfoZjr=t_?G8|rZ95fh|xw#ZA5PT`4@rt;pGs5 z-@~i=M;vE%Fv9|cgI`J_0cILh%2CCLK+CfN*CkP1-~_yuhWkVt$uYX!g+;cCa5MNv z(v6v5uwQG(xH}CWix>yoCD+({xfF8@4z+-GdP_0N&i2gu%wU8Xeq9YTMU(+$dey6zC4dw7)oZUY7GC*gLm%coF#pr2?@j3J!GDy3i za&U5J3>%0NM;#0g3e#u(gYgJML>w#}OuW4T4)z;8$*jh_m~nq}Q9M|t_Mj5MDM5W|KKaW~Sy5K*DB)Yqib;ZBwvz#@1$ec5T9(UA_tB*0 z6W{vrl6rV~7Hcdz0$$V&+kzxovIoFBqN_3{9OZ6%3a0YImLG$p3pT;(JM3{HT z#sbR*+?|FB!EA_lhLN$B9dcIamuWqxL(Q*TA%Rn!M$pvTNhtjH_0BgDFj?6BsA&yT z%2hE6M&$ycwe>pyZAdFJmtMLntd7{ajkV1-nKUF~2iwpr1Ouqk8eQ~jGpBwko6D!u zCg4WgUw~=C(Sl*|gJ7=a_KS60s#L!gq>^Pr2%vRTUxr8{^(t`5>@Mdpq=}H>JpF|7 zI|{erf~&_BzXI(W{{HfFz#4-!H$LS48qJ^8VM3PtMp{`%Sa3Nv+Vworskgeyfuzj2 zh_avOe^p2tKUzLVI>`4QQtv1tav;pO#@)p|B3#q|h~oSs=4q-xV=8cHt3oY)nC8%h z|A->u#a+mN5JjzVC#^~?SACiwH}$UzQmT$xwdV*3biV^xjI4+%X!F) zFqn_r|HO&XoLsH=w92b<;Z-tGH<(x1^#6nP{-amU>F0dX>P$>y_V@-(9H+Dv4wbAB zYJC;+`9?Jy)LzQUAoH-%D6vyQ4bLo>ANi>?DV;7zGF{>NNDQqG))Ua$V$vwXsCvJj zT-8DMAY$1>xOI-@0N}xZi0Uo~dFfVqfi5kl$`IO7m9LbZDLK7yEh z^O2Mu5mj^=(@VU&``>Uy`|o&K&n5C^nddI@P{z;r!-d4zEH(FX^QVR{;4Ln~=5nq& zZN0N{y(en=6C?2<3OOw1>bg35L#28n;i87#+hnZ7ii{+NIw(p5B>gg# z1`g(a;$iZ}aimuH8>Tlxw~Up{k##Lk@I1aEMt;%eb4e>%I0Jz4uihjl=O66c2v4fGNS#F->nrAr=nN>AqGo}+WRh3$Yl7C(t zRc^?Orl8(FJkqfh`*oxRR=u6?F|ImB86mXSyq=O?<{? z3>n=zpR)o^f1}TyND6=34Z%2egq=$M*1wH3S9?x3JeSFq)#2DrdA0p-d?bI&+C@Y6kK<&hLT+vEgOE-Z2lP#wy7B^X+PL-!j*XKj^shuP=XU!hacGW5rABn)`58czR8L@&)sKd`wi0ai|g{9f@fd(RYRK>uB0G6P{%WiEp?dTf9f z1t>5-6N^{eMv{MGbXO%K88rLjt{%n0XC4D6`aKt3G#&UK&CD5``VB#RTMp1Yh8_$^ z8p0{Bkj&qko+;!qSqFA>QXm5($2+V2LW{a>k^>XHO>LwYrBWHd zmyLs1EvH2u1i@5It-lZDhH;ZQqdxfSLE9`xA!aZ&)nrlLCCcC}RFGxgrHW!}D3~ScfXh47SnYH=t&Rn<_r+bB8z+=RR63X))u<*M6%0)9j=LfGe zco!~Q`}C_0D&DCHDC1DMAK0IK@(ZRNe6|qB2jvT|k1Ve4M!lF#F?ZhT*D!?{wxKU+D%4e)4@NzKYYPLQOYNolBgFaF>o=OX|gu;t*NEcic2&FXLG zD_D#&^+s&x*t`>eIpDV6QhqKO53<(r3sWQ|ps?L}1h#dd#v#x;I9dx;~m% z8L(%3|9>6FQ@ct3b?-N@0qQRl>0L_9&(hDVdR+aeU;mYa^4)727Dfg+)kGm~3q}S2> z$f@I14T=z{mL}PBp$M;ZlAj=2>S{|-y}#R>}Hqe6RW0wxDfk)?NN1y9W z{l-4|7VUjSXP-%T-&nDu?QbNaUdPI?1MH_*=)ebNi@+}T1e(b8|M z`m*ew`VJc;=TdPdSyt$$A&S5O3Mty!X%;Pjj|6~;L`fJ2cWSK{2g5m@v3`RIvP=I= zM4{LN3OI{kXiUCZ5Nt`V|CK1qPRJ`@&d}#IeeH|XakEkhvAewQTJl^m7v=K|yZ-U_XM=Pm42E(&D}b-HH9@uK%XcZzrTr!< zLunE=fO(SX&Oq&rtejytD#;m|zYz{2Ejy%XPP?Siacwges1aaU0sH~qm-12-QV8}F zib)WvKI12|(Nf%vF(!UklGoby{!>=V>#MTxu2(?^-MqIeX~vbImc&@`LZ*wl30_o{ zums8??buMg-oLtS6@;}5DwfF=80x>jL`tYhoIJZE6j__vTE!mR(9euJ=25{7R-M}+^{Zy(YImVw)1TW(ZuAZ$ZIR*vSe07RWb z+0@@5T?|l*7=VQ`k(SxNm6;Vj6-5Zfy&orGVjpypfVSSYo!2&rymqa&DR$F-%(qcC z0nX^(-n7QX!SZ$VC3ti7yvt0B8cIg?HcK!^jp5hL&yC6RgX#YL186a5G=fGmXs|XR z4C1Hp=##P|G>PwoIPUxK(h%Pt*DthfJJvRYMq&`7RuJ8mfF>*FTlQ##b+ChjF3ztc z34Aa}@I}MG^h#nwz^F^bNQ#OfcMHx(m!59?X^#}tXr)IYYA|Cq7CJpeZUr)H>?D#< zuXH+y3T&6?WGK&pA~VT?l?*sYu@4Jpki5CYZ4J5&A$&UTa!o*)8p}H|4i-ZXDypg` z2ph9k&9OwL*_i#7cmN$7;s<*wDGT0C))Gtpj71dWk-sBtYa1b>$mdWxuT4*VctD~ zvmkBxMb{s<#<&mzK$!;j>Hg!YE)(@Gzbw7~ENqywj1998q{f6OH3=zxne|FvB--|(6+FzdCxQBQn?Tq_oWcnBev8s~ypsZ+LB(@PPZ4FW}k?mV09MVi_Lx z5+@H4Wh&qsYEKCWuLTk>PXUN2-tRXW|6(@xD1@{z|D9bV#Zf5S*t4#^6#GEIoX-5r zN`4@YcQMQ1XJJP*58Y?xyKfmG3=?PC7%SE92I5Ou@%QuRj%6SZvk$T-&j$O>@v*PQ zFae_Lv(kY6!0%uI1LHH3U%$3>n$?|~=iV|4mFYbO=F>Rm%RKS&W!LYsTZ*G^sfc2sOK`@&MjRukP9 zok`BF#S|V1X*%g)k8{)jQQ~(8-Z*ikjHkKri-;F9XUQQtF$$Fse4Qz)zy)6~L+4vR zm?mM?`B9S^HwHxN$k&h&1yeL3V~_|N@+0^UdtL$^Up|M1U4Tm5eJ^X&_5-@HYX3+NmAmiv5e6SoDO z<(AN=H8pLd{)i@Z)35y=mVFk}>wo2^qq4!k27McxrGEmFJC$GbR(N2@HfVWgJ{z>U z^Go8UG4q{?Tag&uk=p3dgi5~aYgty0?q4Wjjk02>nUJ&k#>!>EU)Opm>J-84bA(|0 zUu0_YrtrYyCPJ_?@m@T6e8Y7sRx>6iqRxZlmPQsd&n#z7R&@(A)9q}K;0d1Le68CR z6mEMPh1=di;kIii{0k*(T#b>=aS?|=DdD`xvy(pm=vS}HzD`I650Gx!h5)qRkOD=6 z(qF>B$l?MDoC6wqtEIl=@7Q+Gh5nVhq}4hi4fYbC&43g`YIg!fvvVnu;ZVIe%@-TR z#&W{BhxpP#Y;qNxTm#KIc&ToyCA4ulQVx^W*&**JLfT{>#ALfL7RBP$iNS3K58WG_ zBMPQ3Svp%zzv>IM$q-XU{pF8g%r(2C0}8IAyQH7pBmLN2v|)>==uBco7x1iHQtPhc z&Qnq{Q^Pz|)P?m((Rwggk>C=WvI$J@9BWOwY|%A00X;~$05w3$zf$AptW~Rt#bTOD zBw5UD$3%cE2!B$$S2t5mslLc(9j)T|y8`Hn;8(qrA;uqy4>-TXLN!s8=iH-R0-Du6 z{8AYf)ycY;^1n3;3LIB?rtO^JS(O=JOR)ZLx+EDwv3Q8@la!vlR5s+oRoI4p!oH+l zE+>jLf?h~-1=UoIMv0My10ApC7A@;sGhyvPKEabkf`QK9A7RyM-eIITZHusod%_#6 z_1;YUpIJt2UwtXDJa@N-i;`^)qfu1ZRcT&26$arPLYI4^Vgl zWov$Jl9+dAiUG=p)K6Xb-B~fEemYRXQdS$fqQD4q~&Kvum22KS>w$(`8-# zG_hU#1G;j6?~E9)En~5%W}F0}*q+Iv>&Dc`)YNudPfbjjWYEJ1nO8GmbY) z01!-*Xb+e;Ge#BugK){Nt+Yexa^|dQJ7qPe2dxX8))(q#nHMoK46Jgg{LTX`6909N z#8gb+)?|OTTAWsDJx)BO5(htV1$$s@fZ8UzfA2H76*&306pl%df!5dRZu)ssYK26b z!NY#Ia~-DMS#v4=lt3_DAf>7lr(CU?7&`PnjmZ=8rB73F&2Awb*#UR5XE4~pN@St% z$`ZU$RwWZO*2y+3!H*oMKTHU3wh(XZXK;})ye!54dO4=>3vnP# z6n-|)&d2f+pxNbP0!Xy2FnyI(;A(ElJIT7kRp7<;i%$c=>Ea7K|Ged?PM~r3DN|wk zY_vytf=GkoLQ$ABnz=7-00k^NHvcr zWs5izZbH%`%dag{0<2{3&N{vIP|1sbA9kJ&zZwp zn>_H~Q#{+x_p-w*0RUB=n+p ztIq>ay7HLWG~o_CgM}f6n6Umb7`=dcoC~e<0`W`nXEad1OySnLpJc&IQcZvop6zjz z9Op&FxkZNU>dR#x^0UiNHvF$7^x0}1voGIg{MVxb;8S<{lQdq?5K0{D4**zU=xu}r zB_w>QL4Z~z99_8F7qUNmXbQ4bzQ|`aO=3!HL_*35=llP0$g`wHwIA3~H-e2F+l$S# zYTV1)KedU(=9c@zBvQBB{;FM^7aDDmt&@p!S<^UGM9@1Sl$PT^c>0~vo>Vy;bb7yM z`xyZ7{uDNSF-+a`zDz7n?v`&K?l$6Dd*5*$c|TNi?QPS=g8!xc(p_3iWixdvX_y|Y zI(VEL?mRrVtfOiF!XkF2KRu)}h$YmFV|*f-m0Yt8YbQN~{SINOW9bc;&fay{s=jzF z(O>rd(qOOGnu;H`usg6Vgi9)Jt2W*wgxgu`S>u!JuXs_+CG=E=uwp!Z5A!Ao?2(HN z^#uT-giwJAn8EtFn8s9SOocLCEN*pES+~W&!=3%&O%IUPXbq;a)gFk?yI)SQsJOHA zC?a9pevVscA?cv#>!VwB{ODF0f8(~=_%>N2n*Y8^Is*)_!;b@N+8CJsb%2PPkpfjtXWy6x>;i8KWDf(?d_ zCJg@gYB#1wHUktY`<6+9v1teqS~Z=xv6c` z8y_G*^hJgK4Q;@J%8Ef}D^1;qrp->QnwnkE^QinA+W1zsp#do>(84&jJ{Gj+!h!pvTM{0qM_Ie1%C?Z5L&^j zpx7oFY4|75g<2Y;6e0x5ItT*lZ-BrA_!RQ3T|^xgI7I_f2#e-DGU{djVogj?AX|zc z9Z`NjKUG1GXm>_ewi;$j-fsZ3VNfHGG80Bklu)0w)O#|sSlk3yo8+Ib%4^aAr3f)R z5v&4_K-L>3b}L-W zFw)yfVX^y-z*|6j&;8`UYb3!1tIax99&8BE_vth%Kl|nSKeYqhxc75VykHzN!_DI5 zU5Xt5{q9Y57c^!%K^K)aT-tOE%cVEnVcoIL8@ff2y5YF1Iw2WTK^ljfhd4f0PNKTN zGX%a>W*ncF;m5P_aD0x}rA9)VYVXCNYv)-mo>7EWhv7?t2+0(4@tYp?(&OF@n)Dpd zs9D3Zdeu&CzZ!GPHmpoRYKHC<+4du$KFNFJW2Gm&y@Pb5gi(oR7)`M;K^IITea+y) z#JpP8_J&|u-@9(?U2ys|ev`0-H38~%07rWj7=w0o&B{d*57cJPD?@0ZDe~fe;>DJ) z=WY_eoG1uchysNq^3qTmV1Go=y7Z*XAPkTWFQ%i5srcfQ@LI0L$ZQM>Xny#PLzdU7 z((=El?dL;Bf@H|#qK`eT#tn1+w+D*m;{jy733cWbtZx1J@`$v_`yxJ+W97kBv+(`C zS4jevWn1H*mkRudm9)c=NYwe~D_Vxo*u!i10O9X818PKo`2Zj({1eeDz*)_HIC=%9 z-IN4@*W1I;rEF4F6w$<3w<9(Gx-ZD3WtcZvAoI(acusLyoWoPv9Z$E{2qP5oNn8eAX^MAY0+Np&Ti9d9+-Oh~ zPSQIcdRX7G1xkK-O<37ej36uoy@RN2S>-dU|1C5*dXk_?oj~|XY8+Kd z>tgZ?wp*yVigjikd66vg3 zC^jh((~&?+LGJ6P{H#}Xyu{8W`fqHAN^926&m#f9C5%-)>%Bm{Z>zPO&XQ|*qFMt0 z6*G9(9RJCqXmpO-SMKTNGxy>#^uUERfxbWp;K3T|yQANdTg_gY@QiS4`za1Yy{pbL&$t@z76 z>a*oO4%E;h(2wcYb7wjq6W<=TM(dt|(R+P{!2g4){JG5~FKa%*M>RVcChP8ydm57a z=L|<*{bm8vf5oo9{5X;N*~d?Tmnw_t>Zre_8REKTGI-H?{(7RbaWT6-=C#pJww{y6 zShDl^JH}|yK_Dh@vPln~oo_lx$%!vB^#ZZy_xLZ5l#;0hAQrNYK-h#ECt7< z)KxQcAl;Z^+!;fJi4xL+wk!n)*9ht&L(R;U%s5K>kF?f*Y4)53v^kBo`=Ay1J4=HZ z#YwIwsmW-chjz(!{v_x5^<|o@baria=VI)+s2@^}o$V>*>33Cg>8Z4th4Zbi;XOf= zTA{+$L)54N+@;5z6^ITfCz7GAK~NT8Rh>#JB6n+pRV;@e^j?%iFD89n_k;ZTT4sqR=y#uizV1u4G3RPa7|=d^6{xiP`ESS4y%Tmw zpXk%ffb`$+hzbT$8HS?S@)7Dwd9k*f(0pC@t&cv;X(6kYGTTg>sjTa$iBxlkMnsq^ zXakFx*Y*$?{vX;pb#(cUB8zxB_UAe{mm4h~1rgIkyS&apYUw1P$;4PgOb_M~m;I&6 zBH%qn=u3-TbYFJz8%%Gwy9stC&$}z-pcvNFR)A-UGzI&!CMCPTCy&7{aChM5)M6J6q4cG*&U zN2bdrh1jSQen}+#rx2oD+Yo5pp;r$5DgJ-fACo*iDP+holoA(QBTs36MtNw(A5;_@ zi5x6Ph6*oU1T&={V`mbu^O->xovdAk{`vniC{S#Lj~Xc>Roo|Hy20H8ffM8u_fJ<1 z4|?7ClnJEO^HnD~pY+>@rpOdHT=aA&5?O3*D|9?p0@E0~VT5c%oG#Sa556qi-DCfmAjBM=VfIeP#Q(jv%L{=Oh z@J1Rg2UYnj=z3@JnydYlcb}?0<4pWN+v7h;_t%v9Kfi;sbi4>vDmluKDIsMxC~iSG z3_U8(dz~1#KcGTc>_xBUtZ*Z~)_nplrQv;XfJ{Ji83LoY_UEbnM}X)_ore8#5VULo zL*ZXosV;BFp-=)(NqL#mAsG!UYFf7ipzMwa18o=uBy3|LMK9qQ{~Q@hMe}_IQEwL# zZY`BWvnHNEE2*|;n4c%m^>bTy_3)g`Sm4^+J zHHZM8pn4yLIjNYagW`8%^?oI_p$gH^+PzF*L|mtl;;Asut*j=z#G8MiXo)4Ews6%6 zKEiD&t5F#*AiZxPwlKj?jIO#1tQ2}8cd1qCG|iLr%@o$yo>EfJ#<~Y?Qx|rMY|ABw z@3Nutbm-Doyd6i7W>Yl{Ymq4z3DJBURC)xp5MPhIS`R9HXmjs@RCya-)8KKpy#`?1tC;#*3?&8?`99b|64zCp9gh9ObF9p8aCO7r0-76$&FMWb24|h`+#|4 z#(vRbExh9n=OB<7FvxmYe5{4rA@n6kBAQ-!?7gHDTE0OVf;&EVDC?&jy>RUlUAUGO zZZG^uZL{i7v}cFrgH|ftrexfiduCW+o~L1wSpi+`mkQ1K?3Y3dBNnJD<%Z1=CYTe< z5ENlWn?3q@#mZtboLfXilx9!J9yY7jdoPPn{8h+l5e#AO_uqz}K*e6=w7WHi9z zyq~f&_uPmXf{7tb`>dm=Q*kTU4{vomL@#p-AO>6V!rcW(X#SI-O0O zyb&`5kGy4gM8nU$ai}(u=G6fBU?$m3e;cG3mMLGK*t%24axMDY0RAxmilB{r*^`Db8BRjrYQzc{lLR%%pgzg-_$#sV{baM~e-yTiBEMx2 z>6VBHnPtn$$$5w{LV9ueCFh)~2+6Qp<*`?0lYj2XWbL-(gu|0H_WBP8!vWbZYtbcw zPbsHs_>c?Y2cV5=ugneMAUw|KqTK7p*Hn=H{v|Yfs2>F#{4-mYyW%n8xdf@1rZi%w zbus3WHir7=$pEU=q15ra;42QzzFuvvY-&KrCADZzm10`ST<@r~OWH@lz#4#a%lCq> zGL$wzQ83-;MBElk2V!t~KWMgSwXyG{xyaTH4JNz?ep)3F?a_=gD(rmj8cqq-7~Dxx zMP_6f+X(b^H##_ha+ROnUn`#3KQ7VunPYn5qc;75u960ny22b$tI`fB#kAQj@0W4Z_90^Zy8z0(3mTCaDexw zCEt8`+C6F?$pGlhg}WwZbe)#aGiC&F;!6e5j|tpJ(}#SEK;0J^gbZy(Wsy%;LVd9 zpJJ!o_&sv{YLizDWSys5aq^!H{N67>gCjeQ4$i9P>9azULabC z=xY!ThM@m{SSJS-Z!A7iX^LA*0KGvN)EA|xjH!+~_B2G}gH`O)87K16qo~l@cZoUMX{k zu3=?hzfOY(RY4AFvSDg6N5o^#^5EuIOax5?(#x(V)!K{$6p6{?WlYb$*&=!W&wXK= z4M9c79y~wW=L9)rD~f#IaXr7n;vXL$`DgR|`v=pja`CSxaGS90`1EaIej&8sKThhv z%KXP?P@Z8r%UUH694retd+ofw9Y7GpUemMpDF=4x4#g^m%@0-N(SUYqnwv%XiSI?yr2y&%^ZByupD3qpy!x zm3DK@oCs%CpoJt`^Cf^K1S}C?sR3duawSPRtI$jU`iL;3qGFs=s2hMjPz!4w1p#L> z`Cp9??(P*{Op22ccX;l(?8rS|b~j%Lfima-Li-G&@HdjI0C1$@#|J~F3PkAN^< zOOtTcNzNu}F{6}r4(M_*Mkz(Hu>XHm%h%;M{m4iNXdL`&}IHj*IL#~>#2ubp>^$p`yukv{pR-$sUI0Z)8Y%-V8CA-Pu z?FzBO;^23Y-KO9}tzYx{{w(VIGpIMyexr$jat^HZwW-c6f|96KL&5H+x4S~Ijqlw@ zU>S^}T`U-}L_|gqO7Xr55-hAz#O8;tfYD(`v7)mPnGPj9HU6hWLa*V_{$#NHhJ1=VJ8w~+rf3c9Uyv=(Ym5{8+B;#gQvsE>#LLGw*tV zx~B{_kh6r~lEH?#8pynWJSY5Nxe7?p~iv+v|KmBa5iDq9yKp}D2NtU>}rjA>1uf&kzOD8hzFscRICF8_5fiBO}QXjvXShVM)y!42B!rE7*Z29V}MAkRoG7I z5JF9I;G}C1r$Nk91U?n;sen%r82B;*)vyU`7&>(Sw+!96KqFt?<1w_ez+RRH(POrj zrnodRN`zo_wLVz%?Ih53dZxL}&{09{>l-%X=BKaNO@}~eXnOC#mzbJw?E~TEN9Sg` zHmJMGX=~-O8xJXG@y=Ge-F;O|JAg#TtVEPhQ3FaYtuSBs8mQq6dUI3b$A;`)QW&Jq zcM_-d=OV8|;!2Iu`HKPQoGSX(DA#EM9Nue$PN?{Z+EJ=U_%iC*8~bdIH|%Z&8^;=Z z_>SYe2(eU|QF6C(QLE47zgZ^Hzbr1|U{d{$w}SK}1Y+tD*P~noJuGQWHPxA7xEAG$ zS1a_8tD+&5`8}?U*0XW=A(>IOn7|f@_3jX>vpc|Yr+H&WsIz1sVoSX#IiGb@grZu< zk76F1hFc{Zo$%T~_dfOmAqpc1LR9rU4!uK5X(wgU4p)#<-w>uDC=tsaqi)o5yd}a}bEAzjzT55Q zJ<|t0(=l>ZKwADu{1VYc|8)cPG{j+k#qou1(BmpuA`Am9RRy70=&tqmE!nvcSc?9w z0+~^&2ZF_Og5-vgf&;(9B@J)LYi7vEYznKg*iDmJ>E`Lsr3sI}rpa+3=mOCB;3cb5m#j@4wC>yh@FdN& zQ3lA>GL&UeLJFhN{4`C}vTDJ{z2<7kUukA^+Fp97ErCPhGCc) z@=p;67DUuADxDl8gSCsq6J9{jyKeU^6}=ujCvR$vSY=h!9cd>tl`VK#VjFhdXmiLf zbazh^tZwdzgAawY8SEQgT&VgXvs|u{cZ<7)2yAi7TRd>ro`;VPIVr!bf@|i|zN0;K z!Lo&OfyL&7;?$hw9Z>NjuNGH}QcxC`yu=Mx?aq2cq=y^kG;!5Rix-FQ{b47rK_R-w z12ieBTy~AwDHDBZ3O!1zC^Z9-$tO5#RMLqz1Q)}sN#;%h|nUL}md{OcllIvNc z2M*CMl1YA2fbB#>3wb7H5$jLm3~HIinLvAkO5T0gh4Ez6!xyu*-YlFlJM(XbFjx8< zkiai*MDO>|&Zp!`%&)`4Fw%%3(J(AM-8`@MYm-U$fH1Xxm{DU zfs#~~CCPgpT%p(aKK(zKo;f3DFGC(-<*qAFAnMnrzT^Xc(I z)lR}rOW&horSlTYvtz_`gUd{uHPi|DDhENb_ba2c#*oQ%hts26kZAWe&f?-IXPr)< z3Efp-rx{63PWBFa4oFO#R2$~>k%SASm9S3mihImr1f~OrGP;~ue)x@bpr6ClJp+?D zfZ`RF70YAO_!!7P3&ji)(jvhx604hSEl70^dt$gASIz`}0PXiK-!;RfuohdWtruxP zlf0;(QuPkRb%6#=;?;4%+JFn$JP%pLmsNT2+rYb z^c9$4r4Y^BEjVXo0CC5V4lxwuCr24u1BoNCMJ7b@{VEGH61CnDa=S~<2~-QX|55RO zeh2_I042!~BnWed<$!?XcVRpUe4q~kA1)69-@^bz-YA)oDH^-3H{`w`*s#}sIRvni zM^6I39|BO>+0pi-p7(A_Lzv`slSyDv1;)w}D*}#2fz1R6e7G?%WGFNel2l(XRGrEV z%3e}n(MhSeau88v;e%W1y<(JXKcAQ^l!-NMAWd6!-H*~9abCDXXHft5j3`Eg_0(O& zpc_Y78@5=AdBw`ak-zroVG0vUJe45=UCdU9wFIawKSG)c%=Z4rW|J9zdTYg`p?41T zxq`8EyxwW3XFCk1^KVMQwx*Et%IPz?<hz>qun{8jK>c5nKTgr9)ovXA z@^!oL7XZIRf5ahWFy!|JBLRYxfM3|lT1*7ZmmYpKc_vh>Hm&$r~je{02E%2@jFfaH_0 zN|sbIGPzoQyIXHu^)f|w*2eg19an~1)vk?Q4B}NLO#Z?K=}{(}lQF(p$%JMmh}5`} z$OdPdi?65~PGpR)Xd5K4$K{L-B%h8|x}?&P>D5x|el}peS=GyBx_u9-*85dVs|pZQ z9Z*npP(js3P_-UZiPWr;$O`+sTv1o-E~uidki>qMGgeFjB%gs*hNLo(8Ima};Gl!7 zT6j%|9R$5jPykvT5Umc1RvWZhr?0j+-?AbBiSSV>_?40{n^!%Z)} zJM85K4pUDA*|17lChHPOpgwH1&5=dTxl|)h! zq(l$&oWe7POP+ugK~e-HAua+?t|_Mu1*GCt1Dw5*9)u)d4Q5?)wxA=~7V}|!s@yB- z#;g^+dgRytnC<^_ydmS{f7PlqwC;YxwLU%LeT3j~AW~Pi4<|4wo-;G41aDUFl|8zVi3JH8{nY{p@*a2I=6t(ard8axmPTRe`2faxbxA(YmhkIGp;*4Olh*^h@{Z*^-Pl8()g&k4)B3U=48)_I z62~Bz_iGa&mNs=mD~4Nu#Y*e1bi3gqW7@91A=sl_@N1{PU4g3KXvg#{p?aK8Z1bo{!ckb$O&wys>vsH<3cWfB-K#I6D`rqEN z(7hDtR}45a#KB-D8m+FEAF$Y)fF5qS$6Uio_%@ep%KRuz40_{?cHCLPpbUxhXD1uz zMzRU*Aq2P^0(VTRg6f4NPcrcG`bmIY45?Tw_XzA_FPcoERSL&-T(g`!`y1R7= z6oR*twr8iiI4S!k5N_HJ^+IX#8)&fV0jATgfNmhl8?q&8MrDbp==yEtHTs`) zpv6auj>=z#>@$j8!rYaSg%J$c29m|3BzOn;KhlV`w3vN#4CR65hTt=|m60Q85JGf5 z7ZmQ#6|{n5MV%pJ{w@QS;;twhYMfU%Kpo~tva=Tx&_*DnlJ7uEhJ(cr(cFP_DfWwq zQK&*vSAVLTYwk}@5Ur)0r?6KOkO`CG$Oa6;4wW_>-HU>MKiCkqx^IMxcxAV$@ht>b zH)us=4PwFYBj%|n>$@Rx#UHrVnAcxaU%`jQE=KxZVCaq#ESb8k_1cRImm_d~I{!{z z<)6~6+IP%bpZVItXse<87tF)y?~H}V*Mz`8?RWjR)xR?G;ZG5viJyRV9y09}VqoV8idcg$mewtAUl13PyhL6TO^* zaGLtb0Ze=@Y)<2@yU720rUxTd#uo0<%wm2Uis#nT+#MBN<}8& zDcMpk%g!Rnp;gKN%d!+X`kY|(2?Q0E+_N}61%+N!2dq=Q?u?Sok{SW6t1tL3<)3!a)1UBSV0}2VB;Ktu>Eh#3E-(3GQTw9OcUqCkfvPL z&XTj&xEis9RnS-i-L;1(RS;?`h=3I*8#C!hOisuQf`=>)F#tJ~YaglG3;V}$(MJ|G z8`j#s?Cd-U7HS^Cunti$KzyGoF=f8tjjJtQfrkylBC%D!MBQ!~Lf-HOt7Rawwu@ea zz_jh2TqDD@JhU?MgAwvHIfmV&q)jk$j&PXPcAv{6J{ds2?)2T7(~E`9pwrKrH~l+C zaja<@8&r_!64hm{RP0$=D7FwO4K)^=yist7t&X)}sJwf3DwJ=0W?+%hO#gVLfURDj z%7Sh~gpnYp-Vsb=u{}d0enF!owrDbJ?Tz{ZqrCmvb zA|pD z++5>_Rsqn(g+>~wRH-#(mhOa2N87|hn3)0iwU8}Z)St$UP9_a9NpZ&N43CD z34|6A!Zc3o&qVQr8i?Bk)nVR>KBxtf9Bq+;(NntF3qVrpg`P*C_iBZ(hNnZz8*?Ho zv+_dHKgw63^%Jdx*6ZXP#M@qjadHEyrF*{wFZc6nzOGPvuf+L_-cg`>YNu3jlYcWL z_(EWsLW#a*P%BEP3)L7O&{p12RLrLll<~Q3+$*N&+B6hmyU{{-P6g3IrS=e)`RuZ= zWL>}#QzDiU-E9`)*9ZlA?-VZ#uPPj$3@{VUO|CpFPUm!rDKCxkd6D+R_g*) zi6#eN-Koy?nI;GlqzcpgvL^jsi5(=x|5_1&6k#X`9TmVmJ(1ibUYaYP>XA0UM2-t2 zj9^KFHETNW){3T9Lt=GhYU}rYXSnStuv)cm6W&v)FXyAq+#*I7rx?5i0dJYt722Er z=~`5a$*BAu#)(KF?seys&u9rT;G%!ji}|hC-b6CMW_}`17Rh)NdwJnL*jm@JFh;3~ z!Ei+p?fnAO(8`+7B@s#m--OFUzi1(N7v=-k(_T8)HDuLlUGryFCA;LVm&DyPwF6h{Kv3O%L!}rpCPluNPEr2rBB! z7Zhr3#M}kWqiK8 z#!PunWXZt-`R6AT07?Wpy!{%(qVLa%e0PMf^PUZUkii4VjbwwN-s9CdK&|UFIHd6R z0DQa-OfDNaS@b|Pfu8C9Y4(|tfW2hEjD$s(F6m0x*l1!QV4eX)8+2Z{8X-NK(K(m>1d5toIyAc^$lTsGP5_|ymbULS?==8s0?ZoxJ5ll~t$No2k#)FTIg=@L?fmG!3^Hs+`*LgeGP*JG$=kq;=Lc^ek# zd@;w-kz;%knU^L50=lfofD`Gr(*&g^b9h_DyZ)8;Qs$!0e%@i6F@{IY$OuZrFf$rc zgIpEtS}9n0jY|eyDTJZ|ZtMx;U-}zH*K9}!f-=V&GUWnBI|>p zU?t>6NJ++Am!q7EBoXMR#gbjwGL#FNWFp=#E)xYI(;CBtblJ&$J6#ef_ujptV9~&> z%f!IJb|GB!*{F-u%tr0$B?ph`@98E}Q(|&XPKACek2``*ax0n2Q~OMDe|i)uGWjO8 z@)3%F9w5tA{tpge<2kf66X$@-#xpb?@Fd2on`v1n2Bn7yS>DXPCB}Px-+=_-kP9(8 z4sYdX$L=3eLNlQl;sRckg;xGF>8Ga%FhdnRB6O&sv0TSG3n#%7mRp?1PjIP_3fAE{ z?fk>nL%f~+R6^ZXOq_$dbf`ZlT+A>GsH*PHsXoTR6b)*UWU{yT{|&(33Tq31j=-Nb`sFD(AD>Y?29DiT!Vh&vhBat_ee8E z*yG}l#=_M{X+Cwj(H}Z2s#;8V@Kh^$cnvM0@q#b#0x#LL#cOBHHeT@+Ug33j#^=ej z&Hw4MdlUnPv1jVG|JaTt(|%9v8DNh?ogE6V+N^fhm;T8CYj;dr8{X{p@9bMl7Df{v zIH%91K_gp+ZJSMp*iEm!Hwv2E;i)dG@t9$?<~NEt94H~!V>%7 z4!Yxe$C;v<7p~Sv9&boiDDuC6wkH2ct4i=|M~0!%9mGk=LMo9zqliu<&1@jQ)gA&=|55t{t^y&gGg{NJ;k16_g5+yG*;7-3BW229vtG<}9Y*RWo+-b z6nKfnS;X&D@9{i;4_0{Djp2NLbf_`8`fSpBjBZt6ZV{kFQa;N0ub;eaAp!CqoAUXj znX~^j{wuv*=f8dO?gb=&DF3bf+Fq=@{50IpyBOkV&PTi&hItr+|IF2!6f#*D0tF{S zKf)*WVXROmjUn2kBsRm7>9W7`t^C=oKUCqraW43;Gw};d;K+Rnqbb^yBsL+ZGYp3{?~<;5}+LTj<;Bulgg)I#B2{2thcQEf75dSyc)%#Q7DYL6y(Y{KI5tAfKsMF zoX5%g1m_4WlfxHrm=_YZ+B2X;YLX4tst)UCHME^UG|NqK;nD(G@sJ6XO=np{iE#zO zP{qKa3pis65H6|J^oqrO-sQoDd&G^mdL5s)>tHQ*3J-K%FW2jx{?d#*wX@&m-TBP; zi%^1Vg!egRR99ngg*56E%%>P`D5oSYhsX|u={ow)NSR4FTCuC$vY%M4WKjlv3V6kX zl!t(o5Rjxi0Gx^IP!+DPVaalG*CtA*cQvxRYKneqEwL?c@W_0}Y-@_OUq#6~w?RI8 zMhDwjfIS+X6CSU&p<&BuB`u_BT9l>vr0El!A9X`77Y}c?$@1ab)x-URrODa;G;&`h zz4R@wF&`lhWBps8C9HGbKYLSyG70spQu&@You;#_zvpnf&&HDfoCtcni%{T?S3-l1 zv6VY9tfw95e)78P^ivD+>vGeS8F_X2X^Rozy2A7?8@AOIr&VTz>Pk1Ti$rc6J^j*% zoVxO~8OM!vmFeFm+)!7YF4%E>U2XcF0oTSAwrGO8NQLg2Ek zlFz;U*z(}A0S{MhkI=kiB|<)U=7p>?)2ZH8IrKB8TKl3t=x1@eOUGhb(bS%uT&|U} z=A>aGi=M>^lT(d$1@@4M6QO|XfwME7qtY}{`{f28Xq}I=2O^1)m;+qQ*VqzE1OGV1a2;i1ZD+ck_tyZjg;HJH1kwuH97l7GpFV_wCa)G8Tpox zoNZ=j;eunUK?f+YHvh#TvdTCu?ifZ)8xvtud7BAqr6Q7~_XIg&v^*7N#^RQ;RKQc9 zmqc%(LfU-ONtu)56drJyRwwnqyTEe}A9I}mRfB*}HHO*nfHcVl%JgUao(88XR;&=e z=d=D&QGp@FGAWUN$<2For>`6L%QF}HH0Is^L60Ts?e*`_w;~4Yud^l;niln- zX>rf$P=M4f^r`pZSJY}qm>$UwJo98QK*9uOg)}%)BV-_Zh0&-q3P~cAT;7*ZEi}3* zy0Kzx{VJ;#PT-st$|InX%k(&4fdeJ{>4*xfFeK5A%uX_;<#v+d=$s_f=N2i#+hgW4 zE+|CAk&r}JREpL}BFHH#gR9v~BOZ?b?}5?j;(sX_pJ%V9)0v#1j3 znTP~5D#5D(K?5>5H4KDkzRigG`waaqi7KOc?&#a97d@3v$7bXo&Z}fI0%MVRZ^C_s zkutG7ML@px5xh#QrderRzkfu_KB()1rt_QLMjD9+Hd_us1`Eq{8pa$d!HLcJOBXEZ z_lh!~HdM=6{;L|E2Rk$%=9b7QM;)|f?lH04>P9Ja|=gYXt9kUsy34C z(mGpL+w2u6hgbKNc?s#v5Wh*pO;h5U-?tk{sR;)r<;yBVi0%wDec4uF4%SZta-*8Y zlS+L(m+_fnUUO!d6o}o_p`V#w6jUr7@XvaJWC}7g|7fUK*7Ik z+$qv*lXChf|Bb@)9}n(tzPCJ2tED4g2_7|2>p)a4h>0>>8KRx9O9tC_xR|txE7I*j zCtW3zvAY$?=-trXtBfWg!jVk4j#JY6b_B1V0L7=rYVYA2ExQPHr#Nz83r67!F;YO` zp%1-lvh3J*N+Z!r_S_+jWRIQE$mG4aGZz1xI$RsuC$t+;Y5Kw6uZ#6qILG@jcwO~Y z6gd2Otk5{Oq&7z1cQ#%e);_oMi_gq=2*4G_z?$0Ahcqlp1sH6WC{z@W(6;Y-|C)Z4 zCKljWAL8Hiu4Z&n{%^()Dlda`maU&$w(SU??PdwhJzA@1sV7G-8f*?ymK?}k_~|CS z9MSkYznS4YVW>9M2tz%(GvcIp0#9>_!iHh zw@N2)ij9{lj=Z8xOPnb^EteSem8QkL@+9TnJ}Wgsv}MarK|rzyA}`426&7e9P6#;= z!yiBm8H?;qufI?;bFSD_1(lgtj82}EzP`djuUEoB!_%* z0MoZ2MaDbm4-b~`_12v8%5$A~2jmtDaBaZQ_YYQEoV}ihRF@}RZXVD|?wtuJAj2}Y z-bSSHWJB(LN5~`Xh#*ve`=i3ja{AzlG7}8@R2zsvT4{PZX1w>PSWRfu6(n&j(B4M?3(4HN<98m8N@8q}UN(X|}`@$a~kAorYA0Hyzxwm9${3wZ%Wg z3sHNXhA%K@Rtrl~fBGW6Wbed$%yQ2QPmpsINjNZJiZjnWhihr<_Zc=NK?epLC2Bxm z9Yef$r$?>Df#;}erm_j{-ZAWiV41+latkuFrwBRbP004!B- zzN&mH9M0)s_Ej%WQlFk080vt&wlZJ(AWD`TVeF*egY>$B6cugVW* z1nMlYzOd&}xHDVihkNiG?muk1vL+Wsag2sloyp|N>+_vzm2 zgbpN0xheW{_9yufXupY)VE_W~gI&fha9TU)JE9XFd&$pq54g5Hi1 zW$CGpa+cq5|H=SWh*FOZK%C`-yvt47u?z72`@Rt|r%;7E(rrV9No%_?y@9}RiUjRSA%hPX4l0nd~RNcb>`~J7a1QLoQjSjl^>M^xbNe28@Z*Q;8IBQ z<67b!^zjc~(Ff#PRr%0<_LK>60z$=bP3u8~T`0xCkT>i=1jQpVQk$WV{0%<&~c!&__A{pPVH{f+TOybxyAP^ zS!~yWHB0cYxfLtF6H8WQX3BX`!zo3Ebn4YcxH9mv2gEwk8dRxY`BF)BzqpL}ccr*j zi`%bmExM~lT{WsL%754rmmTf!zCN=aAU*^<7`9h(zne;>pYM75tkI-+R693lUZUko zd=ozOCOq3)JJU|cyp3OhU-Tq@8-ib|Hu11iFnkyVI2R$v7{#k5ac!{J_d40;y4&Fe zM`x7q(nOMWVkJe2Jn-s_5~2KeBcIdYRl zusm^nBIxbp0R!1OtU#)PlNfTlw?S+kt3)IrR~hbsIKZeXAip^`=LZV_`M`ys-_iN( zp&Z@4;hH(DhSty%xP;Ia*7TnQ6!w6E)jC4hp%BrPOe`V) zw1QZHjo@s~Kp#t-zHN8{06`cQ1SB~yie!xk^cOKp$s^Lm zVyfzQ9MbJN1YB@ONY z-gn0_mHiMW{y%JZ*o2dTU5V}CgxTV5jEm+f)eHtyn=6SaEsZx(iuGAi&Gg|s z5~1<5W4uw=;B+pq=$>>A1+|4QJvj0}#+ju9@;QC(TAO5fe$RyB+|hyS|3(Wu`Z@JV za<{R~ZtSg4K?xTw97|tx6*w=*1U!;B+Hlw?JDdc=p3zj)>J~4CkL$5Lyq;kY{g@KS z()spn{Naj~oH=GqR#OY8G0gAO|N2KO*T)iu`l{oCzI*gD#!eUX8N&`2^i{*T>wL`% z`Y!IjtL1*akJ0&(I^Rd0FM;-5)dMymuhyiiv#!h5wTO4MV+lxOm)+z}NJ%tbO|ijB zN+er5I%L4}oQ2M`Q|WizGd$_X4s)ov(@NjTvPJ~`iva4admH#AC(bH2wlCO4Z2DAV zOvc(@QO*Lr{5^%$S>t!E#f6JSox)Vnz-(6pr>1TyV+KC4Gj<{0A~R*un~led?S6eR z^ocNzRqSp^t%v?KoI%OpL}rJsf>R55l@dVOf@~8qFv8fsx$pfCCblW8+=TpBS#YM) z2R{EyuxjGMdtd)^>i;wMBv%ft80Jy_OLFs%bB|ZUp=XHxQ0w{FWBsN!x$E~_dBz=~ zF?}awrf&(8cGgl4HDcLOljR+Qt(5Fi8-c8~>V3<%05$coW$Fy9MdbaR`~DHXOws53 zpI@P`9@FRlAN*m=d@vE$(r42DFSuqo8IDiad3tstWC76aY2Lk z`5?rY41@p6SJuKWr~ldhIi*j-;1K##9j)auu33HM`^^ZDC<=I*S`DNOx-@uwAqg<> z5izHmtUg;5y1X@Ry*Ws2O{c#t%^GUYJqZ0apZCxX1|zE8eVotIk-0gJ6BUi#X(3~d zZtlxaqL=;@^dy;0NRa&%9O=A8BDve`&CEAtTHW1i@~73~=%>ghy2(-1Y`+jzRQUHl zlQ4O*RhFSk7k6$#xzK{rt)3@l&C8tB!uoFyBXS6~P+mih+>~1ZtOKFE4lb#3rTI#m zoFw^&Q347E@PP{|4iH*1S0gz!UY~#}`1bPT!rqXcUg*vE{%I+JM-u}NU&HXw@hJi+ zErOr4B9ljMeK5O6ag~1X0s2jxkF2!~+g7zwI3WySn)!AvDbVAiGPSBt{UxS`wsuR}@3>h`OdwOBVY|OYD zaATvbC3X0nVrxs|0qT(Htj;mL9a<)mq8GPVbVqT;Dn8%$9;b0rV^haJi*bg3761hu zKox(skeWb?);%pij!Bo-rbae1&tAD1t2Gv4pS#C31d1|BH0Tv}=fU7w(h~?kq(80Q z4tOprxS(pDWmIH(u1{581(4<Ky*$67>Qvm$}XtIImk%oK$s{ND|bsn zCK$88nN6XHgHOL+r@jt?D3vmz6?NtS51DzihJWC; zn&nw72(#x*u%ni^?GkK8F5J8(IMA(Z<_9Y+5z)ZHa$c}%?D;o1BZ|JB(!!bXDXV8S zvn^pO_YQYkqct|yiuR4#H{Ea2$}kfy0SOdQn_4~Uja4C3)9;w=yOaO1 zWYPt_jUCVrq6P{n0{W=3&wliFjNqfqw?BszhFE=7RHr8RJh;rHQWUP`@C)6VZ1< zKVLS7KdggGj9F3k(oXva481xH;tO?R@s>G5Y-~<~i?R&!@mMsYdIcVIz8ceYD!4G6 z!#6TTLQpQuTj^~tK7#iqZK7yH6O#f9j(xnW`PIMckV%@x9jB8zn|?)?^7P{-9t30g zvE#QuHq^;H7zU9+KbXb820`J)uqlZU7ExqF6tnqPr;<)HO;>5tsGP|^95XF^PqRGk zwo!ltb6_+mMZ7jm@H~CRs5C}QrI?bF8@2za`~{Ksk~-5IA{7@GeN5GS)g3v=(cZgo zAq=@a63x||GHY^ZaC{W}PL%bx>+$*P1L=4P{cx#iA*fU$)lR=k05fA(BQ_Yuf^r4> z&Xo+3+K1Fym-sKf>K}5vsqO!6mvP4n%PwKLp2i*@a^+X+D8cuC<$p19!tywmMOKfY9!Lc*{no)$POa4HVQ0KghhG-3P1b| z+Z>d?l3XIsRP*Z~JS=C3uVcDuLY|!BfQ+Bdrc74l8;P%!$%2Yg5;Al}Y z&mrqlF!F7Oa9;FvrlZFARv`VzG9bQ&Ti9FDUO-o{=WOYQdtf^7y9CX9@1(?q8p z|78M5STSe`<(V%QRK0+_udRLHxj8)XiCg%@G8&KzE&ZSe4I@)DnhyqP7&@J0Kw-v3 zq);~D&nc^2pH?;o85m?@=q$=82Gz#7|j@_Z6!D49<)LJ6ekGo@PSwV;-J!Ei+!STFJ78`q1RF} z{d05d+^2X6lzdK?Db3nd<@ED@my(DDvI!{XHKfRjvNjs!5BkYYQ z_ETY-yvw}t!g^M$?Df$rKY3kZfShOW;2`E0#$ERCaF5Kl%tJ6T2huSLO|;FG+{>3{ zb1joG+~Lu&B#ei|LZ)Xs#X`nIWK+w+Owwl-W26f-YP|+Mw>MzfdhY##(oLLvm*XeU zILYaNKHMo5G9GRdOOhj-{3pTEWj%su_2|B)CW$SA)Bp!Y{^8Z`%iP@KhJp|JN#-vpQ|=UE8^N-8J~X{NDNc`Gn0;Rjrsw3KRfZ{SP} z-@)R+SNUTb?7}cLD$=kvqneWh;kS}|=|!xy-w9s2V7hfpG+e;5&X+;Ea6{`AWmkIW zmo1>6`AL|t)aJE*c891b1A1VZm)`N%qTDGAN5I$LIkA2_Cu4DG4Bu`&-+bJpetene zNL+kUtvgf+%w8=crK}#;YbA*YdUQvkt@xnqZwBq>$1`(WZ6|^pJaDoj>b6G@8p&c^ zN@vik`sYzC*zt2ICY&XF~Es zda2FsvDU z|3IPKG=C4acx7uISfvD26VrztN8?-y%UlMhn_XH2#bvE+ru#^8DJ%({j#Ulmy7=LY zFA9RG7I;04SSN5>SkS|SS0WSo79|1%2^p7VR<4Rl5C&;H9j3wvhUg>7JRE|o;1mfN z8T#s1RgQD8Ry0`nO>WzyO33+-PJT~NB&0ODtKTg>u%z1^)>Lb((ywkHL&#@;*sO~E zD)*2g_ zNJQs2<+o)2?aN~rZkhrxw1vOjU-8MNjXJyv=QONO2DQYj7enS7X2R-)>U)T=%(VX4 zlF#V&v4+{r2X$+~$$UQt#SdL{0&fUEM(|0mxT_8@hUJ<~u)u7@9NBnR<4mV~!SK`s zN`lv)zrYOCIqQaxfK3P=6*K`ZDSjurtE8W6kL7&X_GYSKp8wyO2NphF$2`UVK57T_ zgD{g&GL8%bl@Sod9DpD?r)U;}pagOKIhwQ6 za$ZG9VBSYSqlZS<^MQv=YsvTS00g-Q^Vt9O<5Sc#_NC&OyjFKs)C?R-uZd}T%cwP$ z1TG1oT9me7rK?(X9%;5Kj#q_!I;ad=t%1j4xdnF=2V36Y=A8QLYE8{*p-qc$)4}!Y z*=~gZ)QmGsRw}$^rs3n9`s{Txb6VeF-xL1JLzPd*gTiHLA!%Fg{hoD36PETQJ7IFY z?*``qSWpRT$#TgQ>StPj?k^>z85j=I5a#x2Kz>^aVfIzgkR za$wcNvXvxZH9fy>U4FUIT#ZfT7P!N15pqNIDP5JetAq2wiW`rt_v*yjX9{p+SB6vF z;KYn|PRgh-J6^PaH0&ObJp5+#7E96RiM|x$c<1G15Y|U?F_K=7BqL6Ah>1KsAy(2G z!h5S)hmhk*53JEP$YXGxX+Cv~!#P3M<7%SKTQHqzn`S4+zVSuv%laiQbzO1B-@JUA zXiR(0LvrSP-yx&;PB?En=x)u;*tOiQqE+I~N2ocY$y6OSV>Ko6ZqIBYdUqy6Zrrrl zWPU>mYyi0tNEvlZXp}{md2i*h-5^prMrsxZAfN~Z+=&S1vOkCmGJ)O#q&FKxF>pnH zI9!E$&tNNW;JNu47oW#_zRuhSd@45* zm_L{!HOv}~fUFddfiSa4R*h^H?ffhZkhJ)*BNUn(ni`@o)}NSbCV03>F+d!d1JT+{ z?@%$4s$o#u10G7&wFU0cx(U?CHQQ}6A!1g|-otbf=u=1NCK}URkyvcNHATzEy}&fG zeKZ3G7Ix7mX&DppvIK;D%=HdKqOmM`F~MYEnfHOrOz3op5v1$9SCNi$KKXF@yz<4P zOe4x59+UWj`1hH^xmkL`cw>dxj{iAF|XpoJeTKuHG zX&8W4jo{Erpv5rd5y#bvk%JzuhL*4v_E6X?VY`85ZFgvB+ZVFeha_V#mN7KoHlf>s zlVw=Vh=tSY8mz2Ce}iP2fkE)E=bElT$%o%F7dEfb#JSPOYz6DBS-#O{?uK_Gub+|Z zhd!>f8o~qW&7_jC@a5Atg%VKu$OVhA_fVdShZ^lKAFYC@@LK+Dn3BNUksw{bRh(SZxriYhxqkP4f|{UMSS*o7=5Jw+XW?l-nti!MebLb%C{5*YgpHJ6}_*R9V_Oz7eY>z$krY6L5Y&ga~L= zJF0Q#*>wH;&KfWu8l6w&47d{$OTIETVzYm+2cfbWxzZ|M3N^tg|F#3OplPQ)8gZj0 z;EU8>PHM7v9ysMAJ<^v$;3Gpa${Vq7%jkU)DFGY~lLV*RBkBQ2O#=Qlo7=Us*edF_ zF`QkVC-SZ^dcwNz%W^FFfsDH8?rAzHS0O6PLnXUYA{jC3{zR5F?~mnj)%rPLhMrg1 zq@&Hgh>2v-FI|b}T}O!Q+o17e7ru_sZNh`L^qQkU;};j>{ygF>7vb@ACov+FBRIC} z5rH?-@^_>htrta#p$4VYL!`=ae%dYVCnP-@p@+b^M^9vUUIc9#X5Eq2+~HR^&pr<# z>O`C~^)}Iop6vW#=!p)x>Ehgqva{cP^V#R&p_|p?AKT;^Hs}TNnymMuBOUqfwy#G| z?x4YCM&oEy33~?t3Ga1<9^U3Irn~01hhzq&k@q@T*ILs9;i7R@p5$Vog^{#UES)iy zR+>m>_)-{1q3uJ*hprTO(nu@+xNm3thA6bM(9Gn8ngLTxvd$lE%fm#ky3y~MjFPPv z(@djIk2Z%DDWsDitXo0XzwdeUT2CN2FYjVw6! z&d?OeAe-jEyv2)qD%??`lY+w8l6wQg+z5R4{K0cN7on9yh56u_h!gj zvXH#o>pR}IhiSV~H`5mbWak@(t+iO|a}L>rxRAxMVI!L&pMAin?guRJNPLUfZA;AxeDq74&pfS{-?mFMNu+-Sym_<9A3Hs(Wok|*#151jL zITo;C2sRpmGazZ2Yg*?_J82f&$+Do!ssD>IJ)ATQLdPP8UfFagP{7pUbE8!UMkm9* zu#y<`>bQF2Thry>e%t!{9YcN$yM}0DAha%yC+1p8d6+h)*EQRYk?Ln&aj~Wc&lwce zqITHmLvL6OQo2O^lCVmBTZP?J#M})dK!AV-SEg8)MYEAXUp6)@FKN2jA-Cyu_I&F` ztL4@d;5a$+1xpX?a_jv4n1`-tV8HR)c42xb$`xDclr@6AADac#%@CnOue*iG;;~8H z=zZ=Ii?MU>#}(gQ+H!IEWWZ`!vxRQX?oXkF1jn^dqckE{PB6zxLal{kXc1FZ&vppO z^j0<~D>|w37MJ*Wdy%AM67sbO$Ct@7?V6e&D=VRmc(rd!#EE!dnSDzW%%-=7B`ejB zXV=q!e0{or(5#Xl*$kOVa{1GW8;r5cTxla#;JDpIDk9%remAB*uO4G?z88))rYUW@ z^E0L}Qo?O4)Jqr&1I-|8WigV8u2eal;mR>KG>Mt^maP0vbPp&;zGpU3zir6xsU1TUrB+QG&4r!) z2=MD;t4Jy07K?D*=E1Xv3t}su_3iWLd_d^SJvjzi6Bj}bMR&ylDq`x^NzV=ItO>;K}a z9!9E(QdtLv3_&dd)Rza;m)8h7Dq$T~5c~1@*cNNMC}WcuMU3&-HnxhVrVzzznrJP4 zar%)>snI#^cESO0!oUXUv2^pwGTCa?)P=MIJNPCVkSRT*4S_7xP`oK#E5F=4$VDgt z(<)Ns270W;gHr*GV6x$wiGW6hR#A0$R&NCD?6yAmOFyYkLoXJMjew15Y|LObl*e2# zGmVf8bRQgUN0j@t=xU4kj}~3(b&n6nap7!icH`m_2P$Es)vBf1PWJz4>SFya}k3G_I%9l+sEEPy8m-78tqYext=>%+NO|Nxh zSy)&N)2U?e&x%?U74#`2>TXu9%3OYi7kogpEJ(66S{Veu{m%^}On0ja%ZK%%PohTN z{MVVO?GDH0Ghf~^z=!aFs$vbGY1l3-WPl?IXuoUFuVh>`f(Pozp{o?Sj;YB)0mZ4# z{dXw>MnLNb3Rj)EBIRQdI)ns9jiE!(Tpt$UiLaIX&DM-Sp=K%+cu5t-?q@$y66>>AFAxB>{9*SvU&D+V;^cP-|PioK5Okv8H)tnqt8v-cp?jird0oArYZy>oQwNhJ^`taZ_G>VT z#p!z*JM%-DABzAR9%bIL=VTzENsf|HB8r941=UOjx*{|Mn6E=owYeiVbVB%`iKp6# z?q|d^_gILu2}P(PGEHIp5bJe`B0z^BP)x^2uFK;>&f}NNB{jO|bWj$^^V%i)8EXHjR6a?=8n0iB??9E`N z0wV?!uHN_u;xwB9g+P@Fn9Qr1Y76V(%3~8iRs#HM`VPafBb3lRzWs*N?sYHMWUQGD z8)Jw#U=Ci=EBK_T8%?c9rB^$Qj%<~cx~EEFZL;9map6(NkC(h@<~`ZuO=SYV5o@2B z+&C?(Xwcr;yH9KoQpVX5a<#8ah^%gx8)P%Vhb`$)9c`c6RqRJZ!6mnz)y0J%gN?2B z?13IZx1r+)aT<%Ib;l)pvS`qkd8&~ZQBy7CAW695!~FGCDWgL8k5+~gHB;E|ON;0de*lv8RZ017Qp6fzbNOUmlFrnJ@9&{q?1eSu*HU0@`>Iyj^L zIOErp6!*q0`(eKnX6agh-&Ae8DQW%Jcl_MB+!CMro|ae1t3D-GfvOQ#*<{uyKY#~t z40zMz^9?ey+C|~C3Y6@LHhNSyuk$wS*EL+Pq1d3)UaVdO$x^tq##WiDc~df6Y3vQ4 z)v)(9IWw${NM0W{gum7iAf>2uLmjk6*<$tb#)IL-sD3PB%M^+s3PY~AQY#USwdkcR ziVI)z6?dsuWf3}gK3K$rLNg|8-yA zCdBH>z6w9cM0-@Kql^G$M72X}l%2OqsXD=nI}`b~@O}*Kd$4%02cbJb87dX=a|SBO zDAl>{Avf-x<*(Bg)qJrZYUGZWC#7TU16q00w-qi{PPZUkN|BgdzvGP#^~6dNO}gE{ zL$5cj8*;knOCMP{JPHE9FyS@nXuc<+vx&$ppB+?Rn#5;+$;C;p-*xYQihtt9)vSG> zV;l&vA|jw4d$3vZJ4pgA?QPT+qh!m-Ss*_>E z@65(3IGcO=R>vUox@a)Pzib3`e+%;SIS+(GSiKf=$KgL2&*JO4kj}puv-Fa8(3jz49Kko_waKNA-3YAZvTbSX6TDywIDc=8#+2#VHB3O0$RA62P(hA1QeVhV~=GR_*YsfVMl0E0I{WpT}B z6IR+o%I&fzT{`9-4nRp7OB1tv&)WV$m)z znk9lAjQ&HfX$=vOX4xKP;1^s;nJJi_p9&QtNwKF_=BHsEF4e*y0P=dxw=4*N;;Y26 zU5Bajn{^o+f0rBeJ5=gwNaMhJoxZGf>p$jEc9jUWk^4FJ= zs{PleW*o!ZMR>yJa^g^U(e8Za$Sq4Yr{K$llNTl|Ice>ysyYbBuvPt4hpH_4oD|79 zh(lMNP7j3Nh6s%iVPKmR3r!tXuKQ;SJJlL8U%%tH&^cW|1h8w=Uv=PeFDXL!RhOUL z>96fKVTbGxYO(0-?*<(1a7s8Pct4Z0o6YyeGoxq_biD zlx<+$hEfDj7eZL(@K4%MW=DIibRUE*HL_+MiU~pL3(x6tnf3^U6Q1SYfX+_jS7l8x z8iX^ilN*fgSD#FBgizI@B0i6%#>m#EtZ}_ib6%VnV`iP5TdO5Nli~5U=qQ-nrx=}U zs+(E)Q&B#`N!>mU3R<85k}6v_)~@}PcC>~?wzbr^Z~LrR-^4G^sPJOrN)VX?5gyB{ zrbD(2IOa9D33u@hYen|T3%84BTKxr|)TJ_5#^V_@FI1QNV>?wbFMt!SSO98p-g% zN*KUyz)#G($^L2|BgM|U1ICNXrlM7Cx@pZIN=pqxXfkgWc0|()*Zb^?iz1brJZw== z46Z+Yf?A!DW)`@GDmgri8$Xq65rt?e)T3;s6S`FrnejXps(tB1MSVD1K5~DTwp*EN zQ;9M&WeEx>iEUu((jSX_<6g1I`T?xL#RiIZ>(u)w!t)K&u zkWa)G``lONuBl-!eX1ntV?3(~?jhm|r##A%?dC?pBBhwKzxkwUs_Fj3KL)b_sZl3({?Cm&OaOM4MIRUW@b9g3dn7XJ~Bd}QtZmjQInz^vI zL6C=A%+JvkE6Xq&M8u3abj^uzO?y_Lt%d{R;xxi*@yX|4_EYG&t7o69W>pwuPtEL1BZzY5oF)yOdNznzoQe~RZ|l8snYlmC zDo_oL_^JWP-H?S-7EY7D6k`Rj#aRdHuu204FEbW{mlYO+92y zxYCn#7n82ra=v!#eHk{yy5WRmGnazz#KDGf`7P{Y*G@C53TnK!KonLx`)t)ho;q`!8%WCR08;MH`_gT1!A>c@HSd|7%|ApD2)mxgpbuc@d6)nV>8I!VF@j zkz$0ZE`;$m`VMM0Xh`e_d|Ia{sN5)MAqa@1pcplIfN@7Ng{$qHCqr~V#A}Jp{RjmlCK-ZA=X%gW zsj1yz8s#8U(k!IhZ-~m;BbyaX@2jkwP3w}QE}vwGfS6f&epy*PkVcU?*oqi(OEY4m z&Wmm|Tg*0GBaZGavhkeNj2(N9tnWHkiaDf1nNf8IvEvQGDf#G)E1NB%`p=HCosl4W57lUJ*smvWrK|>u%?I;Nvt|hAEljY_rqq zF5#6i^ib81hKpTA=<+iyb}-t>`0AHj7aDh;2^cMN`M3FqQ~aWddoA(K6Pvr5m)aNN zEC{zbv4Sw8kL6kCFbUI1_}ihY#z|RctIdb+tDKzN9B|*7W9|jNU4+*d_5!*8)n>Mc zaT#ros^aqqtq_L{o?s{RP_-45BA27REgx4iFLX(mL0^A>d#3>1MF^$Pe(Ied-tl(&0GwlzL>mQ$Ij}V#OX}h0$d{VQ;tXD=SUw~@! zZu38d?gv5;EM8jPHvvAYQR&FJRp7@ei1y9^ec?as?|8HDy_X^(XJ$RYOzcMNhx5t* zfZc#c!b0-jXV>G0;SBxWKq9*3LS?LXN?`#Edf&k5c~DdXeq30^bD>@xOKLoeXvR=( zczw@$U!B*ZVwg`}#qGFt)c!u>;n)FM^MUp0{yJ*5tJ`a3IcEm&F@?tR7QK@t?y%J25TMXC`anZY}a-=2Z9YJJo0 z>_O`;@c+sc)inrk z4YzVabxHYLnLEX&GvK!O7yeu&i1fc%Wcj5$Kj!oNJntoCCb4%0r9ylGWiDeerbu(n zxUCv<{T<*~-?X|c1y63ZIU3r~V; z1uzJRV8D%`w0b7CC8MI&Uh@mjS^-w*Qb1~!xQQA}L)tNq8 zmOR`;+ixhwr>nSnxE%{q*iHzNoePNic{jFxW89=hkG0<{M7!aUm0I3R zUNJ#-{>7;kP_$A+UthpdFZ?~X7YB!By+Szyfo&AMB}1-#_m(E$sp=z{>&#!@E_@{Y zucx4lr{!#)5ybJb0*K<_BJo+iifW>_;yoGrs7~YmLsm6era?SOs^jjNKh(V}?GHXh!Vj zKcJN-f$c{ZL(3uG-Is2&(}6+xRUr?0FJU8S`;+XNii%`OS_A^IuZSN}6}J>3dQ5?&S>sp-8bsJ9B1CcQXlPOT|+=sOMwZwB327 z2@{K!x^mVErsPFdvExMbho(!_P#lB@x>XTyox5Fdw|5)%bZ`^TNYBGEc$1p?_ne$Lt@+IVbF^RZTj<*S%2!qF5G z4nA8zWJDHoC%<$2#4pU0`JMZr9#Ix)UrL&VIkqr9<)8Lu%=8_)d9+!#1?#-P_Hup@ zxXYpf>z@<3F9zJiCkJTc*U7feo8GPvZw$Z=EedK3;W+u_%WO;wK_iPlz#T^;uve3o z04-EkywAk=J(OIhTC{nj9CSdnq-eB8%{IIf6B`Zd`F!qRFw^2mZ_0rCxfb?h>oCi~ zZ0(m~XSkj;?4gY%F>b=MqL{Yf&8Z3u{p~Jp!;b)4)!( z)P-*w@;d=Aw&mP8wMQnf6^@?t$WEHL^`~@|;2cbn~0m%zEO9<+n4I2wA(CAo-Vo$v@ByV}ZtI zBR9F}?!8Ai>oUp2YHEN_?V6^X>Q|4>dDc8vLQ2N-_-`x4A~g1GEg`fB6tI$=ZG_`(;U82cvR1FQAs2EtD(-cZT)mLwlEUl zuif(hvg#};yJUwk)4yD4Hl$Vj0#~%=cRNpA%s(0GyafXX(h@>nCNkA%Qij;4SdsZH z2yn(!q!t7QgmS1LydDzXV74^{Hr9s_=Smg-aB?LE*&G**Y?4jcR$}_&iMLI49mE7R z3;(&+RQzxYr`Vnhsd;bj$@>XSz~@B<`t{fu)K1u7`*W`sQH;q}vC?zW^bx zQ($hXqR6}^Ql$52)Cn2^O$6GoE<1uhUz6#ecig>o%}UDk5*YG(>j6iY)_^^*V35mK zJ3`Kz_3e^E8W0w=@r6;027OOM8yJ9VKB)LmX+5`G@U36@DTX7=r(RrtKB;vJdm={ zLKA^Y!z_bbeMqwd6x?DI@nfV( zY>LI6&OiyI)P>yG%Xh4?2%bh=vnHb@fDLmLEuUx6CxC-u`=Yxa*Zf>wc+?zCmVj9! z`-HOOGk#GeBEZE)JmdPZuHP89`aT<$NG9b1%AQjN)_GY!;1eDOsKg9;VOr8a z#np;h#AAzM=f-dZOc*g(r*yOnwV0OL!)zlo72tO0$n^7&pmYz~iolktrS174bWzk36e_PR1v}Fo9x9!s30AYOf0>0J;$=;P z&n*_ZY6`3Ni?(CrcO7j^QQo@;5zqucD;-)t9Q4NB7ppYB_(W=5#4>jeEj_~eB^-a8 zw?C_?b#(v*1<4?PAmH!|jRjH=n}b1gjwn^2R%l~4jdIU{e8(N%tCe^j{TW=~z}DV_ z<_wRN6PGnDcco`@>bAW;TYkL0whHw+{+wnV7FnK-xYj_m(k!1>LzlslKqSnfqM4hv z+iei~Wu?!(TnFVu-QMe$YKk*y26rApDnh#Ae~1Oq`xW=4ovDRfeI2;8RxJpsnhMz* zS>#;PF@K5!bV^x!K9{BEA79EH)Yt~K)Oqh_ex#6<5m(HfH9~-5MtaRIH(`%ku+QyW zMJ3U(Sd1?c-&UmMA+u}ZHQuv{JtZZjCZ$?S)upB(OD#i|+J?k*cn|bVq1|U^YMI+d zUUj(Tuv?CpEF8i-63jnUbq!0^PMT^obhlw`Tx?Wa&-U^vI#`>7wEf$f6z-4hP|s;9 z4Sa*p^i`RD)F%6x#S9wqdQ+0Ag7imdl}mh*!@rr1==KBQP|E-PCCN*)+Qm#5SOmBA z2I|=SHDvyl&E><5+ur_ZV)(Q1%EwY}JR06ytv%8Ic=j4HajMgu2FTdp2R`)X?)DQi zx0jcX%v$Av6Dx>J%=qkzGyeW}pB!+bt&}ld{=dIo!B@WbPT=&yb;HEDl4UcHl&L&} zx=c@@Z+IN0sSdJ|D4$A>Ep3BxLrbGOu^K|)R^RfYf{E1E#nE`bZWtNP(3r)cF2-40 z&3_)(P6(@lckG`z#hYP%Z{C4>-4|@w7lTCNqZ!Mm%0@5Gs81Z$Cdg}GWF#n&KG?s> zb_60>*RU)5bGlaFjsQzQw7^m03UJCsG>=vJ-3YyKGn2?3n{*UYza?LTvkbEB%H)Z)jBx;=T~jg)KEIJ z$tq3GPy4}%{Brl4cgqdM{e9DrS;M4Gi2^?MM%|y+w^cdJ|1zo;-HmYaW+;RC;mR?0 zB670?kSNiHD+^2bg;K?o)xW_V0cD7v6UoqUzWvOwlyqtyc#}66{Sa9cr8e2R&CZ3F zK%2BCgrS!K4F`L-tYQ}o%gk4&vDL@X3TtR%J^hkky6b&GV++Xd(Sq=M*=uAxo17+B zdSiX%tA*ldp&jA;L(i->7V#zSGn?g#vXm|6oGl;F^XjNK3MedNc3M46&M3nFir<{NQ@1BV0t&2dOHBzy803v{au_PS5L6m>3vP7&xyxxVb zliDA)xMYXHCA6>{0+-Rs&k>`B$i*B&DvXaNN$t}-7{tqJQ(hiaJt*{g5j&y$&_Y;P zOF?2bjL{I5EPcHTo$==-X6$^oARPXO1&%+qo4JO5VFS>(4*5WNllv2T!hu^#vb)>} zC^Qp>LdiKK$(NEbCMmNNJ!vR@$~DkfSE5gb7m0Ugq4X!p2J(&7GPNqgG? z$hdQmqzN=&T6P9bkEPF0E$INEmzM3)iY-*_(uOVAHea&`me7Z8>e5;!Ml*+!G5Iyq zo@l4rFryh<3BO)JuC(d;x-Fcq@vah0uvjCn_Vg5I5jd;UA|&0KDTsMUlchWU$o?X(QM2W&AIT9!v;fl|en6ws9_ zE^%+X~1U104C zAbC7H@Ek590!!&HA@}9i|L}(~$lt~oTnq))En?j~4)w zqA_%aodJYY41Kxk<)QrZO3tDGmsjboX2o$5h>9X}b8&ktF5HCtU4_9%R~EzvLXUqT zw4A{+bfgs4!j016`VUeX2Nu;YLnOmY zBaKM&f4Erk5rY}$R_elqyNEdU^MY8RYsS$qx9+I8?#YeZA{n0Vuc;wEH~H)M5~54I zmZE2#*#j6*nt;r}x|A)ln511xSS10wv46fWi^~m2gF9p(nKP;hhNS%2x)GQ3Qih4> z2>ZRFO27yj8S@ac`!!cDrGXlwZ{g@sa;~%gNBs~#%GV$F!7JqXHhA(&J_4gK1V^EB2cR}Mqyyn-MnKu=#>1cy*!eb~cS25O zw-S>srdW|^vr{-LqDp18sA1fa!!kFd7tgFMEqfwT<3ft1u^3%2iIsv0T8p#jBdhdi zJ9p36Qu)eLSRm1|%7~U8m8(LE9r{079dB<`_-ijk3&LF7T7at(j+Q?FYQ{KZDZ^yW?=GM7>jNwynW53 zqYjyTB9cIywEZIxKe>J48;FbV<_eD?iyP>)t{-55wOZLLB%AhFeC)K~p0E@^ zqXGxhCUi!4kR$DqisfqBDRgcYiolJ6WqEEdR64Ccfz)F+M-f63yCcW&Vz+uv65U6n zg!NIkYU>-mT~^=pk_{i4_%5r}_*tt1os}>00*;LnfMr^fW_qx)piCYq}0~15zam^9{<=U(RSESXWJ9>xh0e z9ueLzPFv}O_txMWk;J(fhjYZLK<{~~=%xe-wC8Fpkxa@WEuG3nh_kiWo? z8TG&xxS4NDGU10Lil&AsFg>brF?a`$yy#5xpdl#k6ppUGYws<4tXwwrext@_*9uCy(r`iIec zD7l#Z_-Oev6#=T!Op<0tM$N})5o%N8gCODajHxr0D!ukWWkSFTH*ZQMR`dk|q~;m) z)*lc1-Uj?TNr5h^?wI?L!K9zm+_4<+V@48NJO^3D^gITXA z7;fQ1B>uOQO2VYi;mP>gLaa2Bb!Li=gW0U?I&QqLv&-AdeU?pN+KXKc3gJDR|al(4cvD8l!~=KeOmKVpCuid z%EM2aJ>~&WTHu@Qn)s7vcBp*9j2I#(yT`zAn>cY|ojWMY)~Z%KTPFAhxJ@+s7pcCg zUJhtN7u6EgtrVEhH2ptnrkXe@V2f8PD({B4yi|x~A>++Iy%%I}3~2`h?8*xBXDZ*+ zrFt!Gu&5GMvBpb_mq-1blO_1Ex;>C#%%vus{CqVxk%p8hxgr;3Ld31Tdi;n%b4OB? z7X_dB)eI|RS&e%~?C%40(=u!C7G_o#{zBN$v=LbP28kLK+7J0XVKP=akneI9_Yfp56$$?f|VS$Ac4Oepo z6BgR!2*y5w8#dKHtW8_ z2q*<$1v4NP2vynhSnbI=7s@DPA&)WmH3M+zceEUDeg&5k#^j^EnXc;OW}! zpEL6Xr*w;E)~9sM(=Ji2SALcj{wlLx``t{&Jz0PM$>#gS{Qu>w#62;&%-N2srPsGJ z%Pwz?;|{45klfw{P3K;e{|r&6)Bd?v91B(Bv)DP;icC#P?>&@8h1Jl+%HjC(mnA*x z*~${+OHy6(Tvd~TMKwb>r_~CXS|N`jyU(kY*)>IBoUoVcJmA8jO4i2HlRNsY=YK!3 z$AXjlAMn8c3AG``5*HS7WSBohJW9t#D6p>ISWEwW_FpL9amtvWM$dZkBLq!@U)|Y19LNMl zPfVuDY@ZfdI2G9t!p2gK!3`4m7P-UTiPjQs$HdYe5~(_aOm!AnCHa*JUL%q8717tF z8EQZEGo6dR+eIUxdaf6%UoXA}xq5YcSlaZtLT6(gLaQ{TBSH^FH_Ryl5?GIMVrj*b zUiHEJjEpEyPE5K}Mk^5y8BJjnalCQuNUnK3Vd&{S5&XYWzT4@Cen&L+%=f0B#L%+*VWM!M+r#ZJp+U2wFCO*Y4D})?C*LYhYSDCE#yDhoUPwiYX7@>gsl23%IBc3pA`LDXW{6YL*qW*oq_SJVWD-mZFQ<#gk zJyeui9bVuJmmlYgolEB+u9X-s$5~ps=8~Ass3E9Jvd=WEaLSLUm3)fQ{=m;&l8((r z@xWm2fC+udDde}`A_^8H93fIbza$%%W%5b`NTj?gaUk8R)&|(PY^YdK1+76+S-1NE z>lDOYw*Wu+=UYv=&~T=xt8afN#rpixEs|$5LNb_gOU#2=+XW{3$gGA7{!HN@6LH-^ zMsX4ZL^8{Tr&qvuf)rUbHaR^-P~m` zF5W~~;&0+K(*LFuq+@mV)1q%7A{PPUNHQ_a)=AYF~x#sfkSjp;Abm^Q7>Fq)` z0Lx33nvd*GP(Vmgq7>AlcfPaL$1x6Tn25R-Nr(**G=xs>0JL<;{Q^5JGN;m1j3qBj zKlaS_2fD@@e7SiQhW9&rh&+V66YNXUspX58-`}Fb5Thp% z7h7E{CAG|J^W9y<(*C}SNKg%@ESX2Pob`?07I4^gaWiAWDA_;cBEs{_oIc=XR?Gfl zauMP1xAM+`N9iK6;Q94VE+SdU*X!$@Y^zNepGN7HT!Uk-hJE9@`hF9KTUzvOKh%npgYD8y+yj>KIM$t0pcWU_=dF%StPVnF1Ohy{^KA`V14iFgnN zBoaU*GDLJ)dsE$c!Cikq+L9Ypz~0y!$i0S5Hj+h!XC~Az3mhkByo7 zZ8h)fFsaO~p}DzCN}an!_N&CrTlH5K6vF#= zilo5+kVe(G+7gCv8aFQ%=G7BoamxPzQmE>S!qBB~8aFRq)gyia_~sN@!=I=J7dLZ2 zP(8tMEB0!*m0gqB;8pVkEAuVmNNac4`xcBux`diyBLSHlu>^3YLoVfSPxr^l_fBTc zZl2620aXk}JS!xCbKX-SEB7Zeo|_gf1*%5?Kr<&(1Qr1`@igkzHm!h)F~`)}TH!ax zfg-E=eLM%e?=b5-8L?!>vzUoQu{5Te~w+=gdJTMG=zGr1i#j$eLnF21gBN5$h!!`Y46*+oQuJ>DdN_$LBr*7#tiCt7qk zr_ng3%!HI9jl^Dp?>S$ikOLuW3B5Bh#H7ayB?D7tk9QohPjKavjUV8!`k{4c89_*z ziCz**#a9rhvdlpOwy>|Z<(RSxJ^3V-*+K|tN94c*H3$H0ur0uRC;m+D1V`3LRN& z;&o`W!Z{%WoY$71V5w14ia}2n`UbC5p^mlMZEBUW(NR86} zDuz^xSD$h4Z>scoaFWW%2`ZIMac)Z;lV=L1F!Okz{NmzBpjJ3dFd`_77Dyg;jNNVe zPdDQoY@MfzpZ9kbi#-FCX0EFW1$c>a_tsJ1LLPk>f>1yvz5=EG+ln$%ih3pgh!L~o zFZyW=LKSW}2#m&f7!H9MjL!PS42DCYjQ46zMlef!5Q!9qF#*%*)v~{Fh8?Kn z1UCXI`<1DbBYwr=RKzfp8WpL88|br*)q=^t>xzQXOU%{+WXIT@UXbaDQG+P&t>mr# zASc!lONp=4l+w`K+H#6>1*1#{S6pG}#xDn&S|SPgn5Pr!@v(IRUSe2}dl@|~)7i?{ zn}k{HomeGeo?Y!(Z7r#@fZ41aG|r3TG>?3V%y;`v zFGgLbD5=B;<42?#+iJIu6!~!)Y2uWH4}M7VdOak|vC7xtW85=SaIVKP>ZPfS96cm-`3qxi z3h133u)guT({kgQgO!x)Esab0eVdJmD#rapkA*tLZ(sQS2-}(8Izdd=!j)S@W}OZF z8BEtPV4A0Y;FWo_-hdUuw<=E+&LS|zuWS~Sk2X&%BBXjvD3H|T{yo>w!D@>|EjkCtc6#JjRb#q7kwasq+t61O0t-ZVD!(10~*-6 z5)czz4QUn?k#NgCf!1MHA!P|sATItettqGt0|YS@#1&8=*LGwmXbn+;T-!0M0!jI$ z3ujW@%9!f2Fm03zG2EM#zM&OXBX&kx16g+&4SM_JGah5Kdfyr3Qnc3118fG}ZgvLA z>b-ho1Ly~}xSA4GnlzJu$Kd%|2pWI%?hYY7^unK`ISy03tj<8m=KEGNlxcpTT@6fZ$6sNrHjv1o(Mn3MJ7JylUY>RVl+n&N1waaq>ph^ zSGCT1wFEO__*P|RviDcC6|P&>TeT)&)N(q(An-*Y!Fsqf1K4C;1C`xddqus(iCSC34sn7r!)aH#oO z6N_UkX(SGS`58adlK*($QnT)%x>30@dq6c=r34Ya6UxRt+n|OT8!YOyVIfCq?Zqh4 zD@N&}*@Z=7bwe5Sk4@Eaq*Q|fw6;oW%3ijNKQ@^0N#c0Sl3ltWlriyrWIpR7sx506 zU;$dZZ%NBj(hydE78Pc+G=@6q^dE5L!z+!ivXKqY`4*xgKbxA`4B@yL!uCQ z$-b1jV}{5|+tL04gvn{2wSF>Y2+P`EfOXP4((a{GnIYsindX5f7u^ZX(yt1;sFA_Bfj)m#qb+1l%+Nnr8v&2IY!lqS3l#o4XTlmR zC<@S(1f>$Vzd^*MU?v0t1ap>6e-O+7Mb}(V88?sYa0bIj7T}%I90p8r#C|vFXX8kJ zxNL%glG*f*^LO30=l}?-11S?g!6ctNPAy(*nD^5s8zfqw^w%j zpMeq6+W_k6Y$kW8pOu^3ZovhtWMUzr72HRPFOWt7s<83VY*b$12=JMf6qU?3a}5IL z%QKpm={6P<=<$sA`-+gaXR9)5l8GX;nsdO;jK}H%(&m< zQ(&{yjJTqsyK%0jxo^K*$R}t_)c*RW7Q@+FrXla<*91eb7*?}0QE=L?b_o1YsO`Hf z@H@-_&uqMH(sha_EUSPBuZxFp{aMnWO5yN-xi^IJN{yJ*k0?2cftS85c(Eh~i!*4v zl{C_U44v8^VQ9s8AmrS%VX9h3)jECx8AivxjX#5sewxe`$e;lcBM zBr~riG|SFH2ckf46}_|31*z0Zur~(+r1xqE<=G0k1G6ZZbc=wtKGv4Aja4!bMR5UF zc9A!p#k}~+1a(;ZDBtm%a0jJYkJ^M~U7BNu)lUc7u7u3>#AM{>Vl-uvvDx!ZF-`Xz z=2arTU1z(*X?M*cS1HHsNlYisPEHx3ix~IqISm5@F4kJ-kmUHzN4YjtsfeKPe zvW?ARXOD#0Q|fHaH~05o3F~1B<{HxoE;%%a6VALT%JRgCc>}u{= zt4G}mZOKJ~+Ksq;NnB(jzkmavz;dUBZb0 z#}l$O@6V3rD?bz9W*---mvvURk+uDH!5m6r?WpmcG@7hLu+>1n@(Z&h@pQ`)Om{XR zY9oDA;E>MFIhT4qRbmg)6kN5fI`6pK7*W7~%o1dVIYnKT!Flbt9Idvs>(X-R!2-RY z!-%uiiNvPNhS5FB zaOc;F^ZTx@yVt9UVvG`$!fh1GDp+Fv$CupQL|NXRG9ulZx}tx}XB0ZTT7UVpzazO~ zrz0rk5=RZd{wyx(2@0S27rBfe!J6U*)X(Zz%^p%i20|j@B6W)+WpPI(<-6)kAsK{0 zoJ#9SJBoe+hWY=P@}J=2rQp)G<439h3R>NB62wjQPfXHFD9Q7%na!Z41Y0MFxaCTO zajEOF(ZzdXoYZXhP|$8_e0};P-1JzwSL>q3CPAMU+W$||!FICgv6i1TJ;zOBc*1^;>js&)B9wBnd| z-ujZ~LD*-QlU@oWp9xY~ykHA7?t+!iKQ1L<{zSXp_Z2LfYtq2t;~7~d6R3{MnIE^P zMPWn6fLiuyhl$r_qvbY1a|WKf=#!DXv+Ct|fq$*n9V`pkW1qy=yjl+gi@&nd#O;Zt zF87Z9-n*bD@U@~cg3HuTK+;xpIaEeGeF|FBXN%To7+oZ~BA2^zd34yi3%b#`#l+KE zEnMLlJvdI1aZr-&=#f>lPElkrWkYM{0UDPbv-rD4VR*gbZ@B_#l}-GW<*UPr0(H<> zdnd_Ra1)%y^#jOh+z5vO|Ma&*=T`ALM*%x-^ag{R#`OcpY1|MG(q=sLz$#wnD6p8b z;k9$c;flXy3Zxrt;smz%yHMe?nq_Of6GY?9AmhKKi!6)@sqPGkA9gL}JMx;kP@BO~ zGiYTU_dmQ!{ue{mG_7HgE37Ln#J*_$g6~-FBss?_AE-&)SV4fe3Rxm63{Uo5B;oGa zi01ZY6vwMXS^8W&S`#EM2uQdftPQ&ZzW|8Y6(OC!w5&z)6KfbNj=pp zIh7e&b5|hWSCqA=wd<~7ZWg2bjnh$Ers!X&-v55C0gHRV^9rC{)D1;;6mFzD{qm{1 zzbkI+b(6U!NzaCKL|aOd>e;~c4^y>dM*>PqtktmMWaG)3C-YGxbK_g|`vmmbl5uZA zN5C%a$$v8J9z6lJpW1dGXMx|cf4SP9;8bK=8^{0gxHokwB%l>kWv7T)kDy~H{W>$- z&At@3HL;F=?3i@B`_b#7Z)Ug70>ePp$g3)undNzv+pIQRVmW=2Lq%;29@GQlqofhj zf?kmKC)M#glWW* zgkBvzG$#8Kv9D>Ry7%m|wD_({zJLqQgNi8H2`=jXrM- zHoBphMxX+rA= zRJcwiHP-V^Bx&7Dn(qpIZF1_m^$N8{A=*2#Oe);(QN-G5!FFkDit9GA2snT;NrBFe zgaACND#$P(+LDWo6rvjtd-mQj#t0Nk#z>ZKIyMJcciq@_^(%t7Rbh0&rbid8nrL2u znm!?|OUUkkA?tOsAW)vndJ^W7Fm6VFieVop2x93%B0Z=`AF8qdH7sf@GUhg*z*HaD zdTnErbRD**C#>BobI-Yg814R;k%w6ZW6WW7QSB*)x%@O08r2A#4{aR!JkJ`>Co4SB zWxW~moS6EE9W|vL$)FDv#z$4E;D*@f`;nR2C40KR7R2Xdx^WUTK zrMhk-vcl>>7G%z!;ucJyrdpAiob4={=;20Y3W24z;YOEJ8!C7oO+gKHuA4sDGYG#` zi0aB^6d$b#GUaU@_l0L-s;TjIzE23qMbfjGSek12v%F|ZAUUZ52G02hf=bUup_ORc z?}|Et)Tj-%W{xYm(1#@ zTi+hXXYI4on0O9hjK#31b3B`Ff)iX7jJGD{+a8@r@9h*eXbd{S8O)sAe#&^Gh8{wo z`|SMYw5-jdX|Z`ZJk88aq?V}#y76eVthv*vY1*O=^UpkbDjo&HV948P9d&Mj;|X-f zHBw3T^*V@*##iQ%8m=!7rflQI#+v7YewzmDCq@@EMkr4zx@eFtrH5HvzD{O!g$JX@ z&x=(%FjB0A4Y>G(&EgVl$?C{y>0~$i_XVsOe=e8iw*ldiD0x@hFw>tAPkm^OP0KGV`*U{cHTDqs*GSD2uLzuTZEM?t|8r#H&X&KN#|&9 z;MVL%9CBFPHeIcF$;*i~5w@H?0mpe$TT*7;6KtTN+5NNtpQ28F+O$=CZ^I1t2hEM! zSQX$_!`DJ&qxIM-i?E}T&0z3WeGzqHhk)t8b&6!nyd-h!ok)N*bj__HG>1i}^};;6 zy-c8C#LL%uqo*5@nRk3WWwzOV=yKOC%)-+;z1g*ni(RT202mUkFqv2V(<9&v%7?`0 zsYR}4QLkR8DsZNPt9QK>(0BICW|Rold!U}~Gk{DSsir2Q_6Gpk>(-*lp@MH3Y1-?- zifHJhbDwXuLgx|^W1tWXV{54zjWw*QfT7O~{1T0yG5vb{ACp9Y<(KMJ(i2 zBg6iH9#|C8fIVWQLM)|e-ks8dNm3@U^u6u=Do}CF>OUHzAcKbYDPiDRFs%eZOOQt( zU_aNgP!FTy#+l)F9dhbzQ6C4sOI5^$)?Tq$v(btm^R}8dei?XdkvEyp-O|CIOr7ZZ z*N?x_<>d66qKRqyG$TWvCWN%EuoctD3vgx2c+Hgnu zSegtQw9wsA>yVje-inHUC3aVA!`){*ZnU07ag@l4bi{~~nqBmm`bcU%(GD$;*7zEI!%j-y0;L={@L<6LD9m?sL<& zMp+lUd4ozUIN-X(8}5o(wO%&lLQYN8=-&$^kJ*!`pP?(@BnvkU6t&=PH4$II5f-gh z2e-fpo47d`hm9lLQaFOedPJqk@AO#2zHj!{$+GC5ZlK-8pte=?VrW4LoUM7yejz_S z3L`BHW7=~63+8}%^kN+y%j(GD>Ea}GZ-aN97WaTxW{`fSI4X5fEG(GA5XW_!^2QGv;y`>%Axw-6$iu*fu^Gf zuezu`>PV^@B>+|G;Hl(5UsUAl6QT_b(tV7KmKw*!o5dde>#ZmZXI6H+TLk0y=5Q9X z38|garH=ow5b6*`wst)|?_atDnL*T709t>MnS~P^{=2n>Ko(J#!ZtIxbW~ zMBGy=?tzwKWlv)65j7Ir$0gn@uD1<2C9pTjc=Dw@S*EqLWuF$NXlx3|P zQ^)0-vxE>@E?JENpt|jdeAh)bm}bW{HN|Wm*;E-`%hhthqAE}VkWqbZ#uUGvJkddW zW8O>LxDL6#-shU)HVam~LR%-}5-Q})E`TL{MOAoeg|*4eD`WqM1l!x1dhz0ZhBG9P z%n*0|bYHhO1z0PI)bj|X;q%RE`YoAIpRYyTs*3N}!PeK-eCDLE-cGFn^g}hZL4>t^ z7Hg1nzbVo;E2-kO&9&RRh>IkUfB|eU*(J#hT`Q`+ofR`dff3|G;i)cw+P87x5z zG{c|VYk(A1#gg^8d``&iX+UhMoPt1NPaHo6sN?;h7)`WSA&Yn)jBXqPXjEIr43wKM zu#b$ql@3K+PW{LPg8nQQ@wp}J3|rjWVyiPLN=&(&?0AuO#c1WQ-&>7e+wZk>HdfIa z-2=qg)ZquGIQqGSMP>*tfcJ)NX?DLdD@LQ=Q!RjQnB3%I>co<=AW0&)9L}1nnCz1( z2+5U_Ddgm7!SMW9dND@qL z43hhaNY&}s+MSkFsTbJBo@OG$N5<@~O}lZ3__DDbTs%ESsPykDTvHh- zEf=*u;;QL0NiDEONT+fJ_bd!EiI(){`v#N4+07n%F2|8hN;_+U?ie z9Kn!j;o{Eh?h=QR$b!=G5YX+2LKhWuQI!B?wtNysi4qze525%io-v~?jBXD=U%7aX zo@0v>387sI&}=GhVQD4YvK22+*DZ4pYyfQg=6>V4wPrc!uF2|42ezD3CD*Es*|xYA zV>-|iMp>CHh~ltf?Rch(XngD=M%23(6scotj2TU!;~;h2{qBdN71q`Aeh0uj4_u2( zT?hUK2`iYgWAWp)&-WgT%!Nw|)9r@FoF-gQYc^H3PAGg<&77uEwk6x#Iv5J~A$+UJ z_y~#kx(Yh$xa(z*nv;|Jk_iyFl)Ii{G0rhIKf`61MR*vjv@y8G^=j6yjFwR!_kSY+ z5U{lSB+q2MbW?{NC(k$u8W}QU)c+s*HjH`?{uZ3e+R=CeE2=$FFWuXihe#O7b|6R) zt|RX>2%OR9B`&Q=Y=LvGY4tVVlz1=V?t>N1PR^@95V*o2Kypy~p7HYj4B99AuG)Rk zT%m0j>C3sG7H`$t1^7bH&VbW8q5oJRA=;Q~P{aC2??~gjXA1Sh{aV--8Y}{p1vnV# zsq#do#BcSD=n~a2g^M#|aJ88qGFD)o=eb!0%Zt1)yI^~nmsThgUX1|hLYFxO?x$Gs zPOz9A2XWA!2nc4{Mc}#vZ+7Bt#X|AAf;X!$Y`!r6>JX4;7_K#pa1@i4lH)W2C&`a5 z`3N%0m^g;0E0f6@Nx1l!)c*EM$_#d9E1A??3Yl*>n&g~LXdzP7dC zCutrSWnr?emA84`e-1PM&H&T&&xS#tvFXpwW3~wNadq!0zre~~0)*if8FF}goyu>Z zru^11;fR9y37!$6D9CMWhs2tS^zDF17X&2VqVGNh3U_d}{!g^bNP6to8@5$iM#m@; zliZrmkd*lePx}XJA1akhK$g-;+Ay}ee+jKfcm))1pM|s8!d9fdpiEd|ZET&c66mkQ zSP6Q3h>;lY>D?h(JImnf#Qh781Z6H2=-&sRWnljhXNE#K0TEBQC<%^!r#Kp}mCoGO z6N>4XfNA9gargNkoWC3v<}U2b_QymGbJ2^KPF8eOx{06U`Jy@H?kPs5-~`-hJ(GCqn&H>k1J~ zR%F@=6btYhqUZiGB}>AFfh(i>T36G}R&!oJn~Cp_^)mCJH0Hylo~&q1pP66(V_nhH zt~4uBx5XSADW8YImbRGOvu;cpf8MhRpW)+w9Np|PD+~~1em-is2Kf!vYJe-Gr=v!H z4omVVdTtH$DfH1c%?slGqA8KD$QhZZV>ALKYOyLeA9@P&Kz8Ou2C0tLhseJLAZF3d z#VoYAR$8;Ly_}XA<*hz@mQs2Xl`qQ`V`p1heW~^PPtSsoImqE z#+!JIp6@h5QS#7|Var)U<(ki?o*WGysK;e>+WK4wKa>YnkxI`FNCBb;GrcpCZa5w* z{iC!i|B!;-@VqN-H7wa6iO{5D%qvNR#*Uht^!xQfCjRZ8}kTDD4&jxH%Np0OD_M4OU5k(@3OjN6XIN3fk zB#lHC4f2uM9w|6VkbSeq$5qwT*Ss+?Rra-)=+;^W7iDPeB#}1!oVv#7I`{_lRdj0GxMhIJ56I$WEHyTs&^%SS zFB&ei23ez~Q$P%7wgz`5F1yd^jFnrw00lvh*7N7)33YxB6shl}!yc4)6kBasve0o$ zZ?$E~Qq@N~ZOVF97NcGg&W?4-A1P9%^39Y$-EYiU<8vDu*N~5X+_{)I*UZ_fcb4jL zX&dPz`WcJ8)Xqqeq-gAXW&TQ(6Z)#~EIB09gWy{+l^csbV9Y=19+Fwh1k}|dVf#((zKKE^9alUIyRzFa8g*{b zlh1zRX)G>!5>K{30GMCh+N&$g43|=Q$>BQEiE$?0Cg|0T+|Z*7J_v|_H;?l-*};X4 z+=ll{_YtlpdL{R4Yv&i8+R;-XIBt$~a|eCVx5W7| zT00hOp6raKR!mq)mbj@%Tuhc1^E74FweWljk6H955fbQ4TvSujU{P^ch^X9}c(osW z4-%_77H`l|M17p2ka>bsO#S#Niw7U|gL{3jC#+VpS}3lS{>dx%zr3}-j=p|>FlT*T z*9quZD{GqMt=H6>cK6zUAA95eq>p$0QGBe8?R)rBUvpFS!QGcPEEASLky1&ttLncB zJM3THyYnK%J!h+u7KK`qNwcb)>o~I%kWEbI{lAr|yD67H7>_QvG_{Z`%(!=oh?gt@ zl|(K1=JrShdo>Y4WXXOmI^DhY-L#iV{0>kw?v#d_Qh<1=rQd=WRC^P!n^jYH^Z}XQ zmLqmV^+P+2>fD5q`PbKEo*rOgX&y$nubv0bzVlPSN(RdLFjs)ZV&|Hlrpmfci~aeV zo6g_fbnMC|WVF<}!#-IkH3WzFZW1S@hN}8nCb^!s3b}Si0N*wZ=*rpbHh7pL4}kDi z>s(QUNpCQzT8Yv8(TZKUpKAS#7B9t!!c7<8Vo@-Mb9-q9YPJ*cr5)L7M0L+^e)eE2 z8CZQ97#Jm>q|Y`Fk0Goe$kLo-%zCCxuX(|fffr%V~!?~?$rye~4Q-C9n9vdv` z5ljxj;Uk`_d}K^rCer*n%E}mSPQQ@iK3WY*kfN|z8p4uxMHB0tXQ8glqEsHi*@DD%)VTJ1mD@9&PjS8T=WymBPV!zye}3C zVIHb%rN+w==VZmVpkNw>QLqJY;?nQ)73 z8$bVln^Cg5R2gX%)Z)XJED+OJHCDmo4p|+hzi9uW8CmVYFnDqTvJ{I$(K?V?AVB=< z;zi3$Jo=oismP1F%M3!_tr?I#)!C{7v|`Q3Kbw5e4hKzFs2>F0FtmixCKnMkxk4|e zx~4^Mu!9#MBuQ8KX;S}W;?iZ_wSEiR4}1#%_u#k;ilkQ-84EGOoGBX75gI|Q+d`;Q zT|+G_S()Pb24xl^r6x@URL!DwTzX~k)g#lHgPbff-m}&maTQz7{s?Cz^NJu8h)u#g^EpJlc{VnS`RG&#;$fT1YxoS*ZlGIXav=Kvkrw&vWO(GFT)GV^+hV5zg zgZnDU2QNBQZe+i9B=+A5U-7!hF2 zN+5f(;|v~ISRWYuan-raD<<4|Jgun1Mob;ZC_8DMxdXS@)BWQjS+!68zOG=REgarf zpYVyF76)!Ha4uxTq4h){UVoPexVD2U#O#$HM z1KcO-3s39Df%7cYx#cu2BL*h2Po6k0OuD(2Q5RMht6QBgEpK4-)m6N*W+JK(#)MZP zyz3ZqZ$;%mJ6k&fzzTIyUGb&6^r)I%G^ENz?v!I8bNhbL*t*F!R{s(6+mM;3l zpJ2X1JuI6tOH~oJR)D_axO*^HgMNLK}Ev`1}X>kA#2$$w>ChC6f zK#(XltOvHIX2%9V@u)gXa|sgdf;0fj8#-(7!x=HKtpHL(y)pU?AlP*UQuQWiV-r0h zWXNqIWha<#uAZZ#_Lw#(f7O}Ix;;x3CJ1Hy-FJOPF#rz9F7aYs5y;K&C5rdLboQf2(rl>RyT=Q0?{oy&4tec4(-RQke}v>TA&cTG}~@ zS(vwln+?7$S*Gwanrmtgeg{tem4RpLV8f2O)$J%%EtIk}TflBhdTsQbV>E+XDxm%P zrDS7(k-*s68^0}xK;pRwC0?r{&O^vN=N_{4B9_kbl#f=&2Nr&5f=`He% z`kwM|SD#*(!9(=99K%Dzs$`;90o%1R<{A%(E%d1g(?0Tx4!2u(04S`1=+0t{R69SI zjpNW&O(R0`+XL|%^M-YYlFt?!XpQ>C`{NIUT?xh3DYiigTe4Rhw4s5`TuZBN$eObG zdd9jM>S^}aVzp8#crQb+t zPneCZvy3=G;QA3b!+Eo_Fdz03p|O2uS%L1bOD0`cZ=8KHR`1w!_x{;s{ zrpawJ{SHj$O?I;@i0r*E-G29OyV&jyeV{5f@SEMfch?xKZs2^sqsChszk|lb&i6ZL z`~(JGl&j?|^1d?7P?!%aiezH*ua)ZAFx9fL{1Xc2S$y&YB}jeFzoo4FEk*9*3!hKk z+dKMGv@0!6HOY}A^=A~xW8M{ z^xMg&MX_&MrlUkXG8^l*WaWR5XY|fI-f0r|jb7C$FhniZQlI zj4fDV7=~>yk;WR;_AMmkjSS34zTv&}>)Y`h$eqYMknrf)d7;Q^;dMx6GK8G-7Gyqx z%tw&y9`6QH6UY z%qgmp_k`$6{Do>Pzjns7QYO{RDZWjIuOjKtp{RELZu3oR-|GJ? zw`&L137_HbveyA&eBhXW=X#t(!92E}qhB0&F1Q7u6D@ zb+_G15Hw|gJRCTb`N;*0jfLtd%j6$(MVH~rJ*6Y z?w&vDWkKo*gbIrRp*pWoteiahwvWFCL8qOcT57l6guKjg!$I@^_1Pc(O6 z<1k$;mNqrjuK>Qo<9vTeHtIXtu}?lBkaAj>Mn^Pie}#EBS4}*KE!CHriTq8VN+KZq zFhJ3(Z&9VI_;YvCP%Z)}%+e$g%NMELmmiX*J;G_z zj$u7MVY49^9$#Rd5*=`*Qrdp5f!VUSBvreAX$;mX=bG3u%@8K=EmSk=Q%k{MDGm`2 zsl~f3wNt0AehSRZk+HV;ITu^qV!P!nwwawZO-2uDY(CbFEyd2^3aN8VV?krP7lp!w z*LYA}L+m$uayRbqUs7*0&20UX$Y{R)4W&b6@l@`}i*lHETG=n>0o`IK)7JM$Nw_QusHyihTh|&NH&$!#NrUqs8YL-rcF)Lq zK@lK*??LNkU)bJqdHUinE+ z(S{00f5bGiH&P6Vogaaw=j3f9s5We0Y(!TqDxiKU+lEw8!q$wW_9=8+1(S^HPuSV1 zDtNO&m)RIgK_6$nN#9vlUVf9SpJk<4H&=^-;B{!W!v$Ga4`&TC@2z-TXvy3cQvr0} zUY!rpncz}ZUI`*?ho1XO?R*LXKXtdR;h_p8!nFbVr{cR-=RHM-m7EA`|3zMj?g_by zuPl2_F1gbd{J4caXq7J;)O9V#g6m>yO!u+ji`x2I97o7jn#x*M)cX}DF!F3yK14KS zmuS6lsjBsy!A-(!8YLs3YJZeb@bY*#A5#0i@A~EyP63I!cAGS#o@r-JLhHdu^2Dh(DFN2x$T|3y z1PH%(fG8v5&)v7pQr&XqNhqW>&s;tF{y@6IMd7qWCPlkL0W&VP2I$L?5$V2jv0p|h z8I(OS=b}cbH?3BjpFb&Nrx`tbQc@2h=?Z#@?msAk9JP~(Dwnx&xlAtN{pAR(gRFJ( z_s9)cwCgI_)jGLK85 zi#RY&o0>=qg2HGu#{AmMSQ-aKx_7|!(f^j-wATd%Num{qp6+FAv}^S?iKL$pOSAmE zCs}G{5i4`+ekpxu3O6AP7IUZ8>(i%f%Eb> zs`k|%3evkmOPgavU8}3WZ$Ues-7KW4cy+Msd?Q6-4X*y#^yvHkjVvGb5&zxKgY$N|?Hrk={-ivKJNX3vlR2Hl6}9Ip5WW3{q*CB=5w zJn;F^B}lTVwwGMu~Qd54eW_|Vlff;ty}km`a;YEWtu)G#Z@!1XIO zZoAHgOWBrTCVu#4XFai*JcS_vTEWYD{Y z_lLd=8IhEd42L5ylyoRXLR`Xn_{Omvldj8j&hMF-3Ut7_0hg3 z`}cS_Ti?zprJ_i@I1IJk=~y5-H6Wj$$0quo=FGt)H7dQ(H?-v zKx7~?T{=z;|Lf-7Ch z8*k0fcrtIu{KM2XLV+^;h`hD{CFc_#?5dH=ut-{AqFor=5^7Da4g>mgHJ!@lj=wkA7PR`W`JMXZciUQ?|2wwGert8-=#ZJFk4RIc;onhGXvW`S+2lNz_> zH-gp0QZIhU4vMDD$dSztKR|N8WDM(dT})0HjQMWkuj2)lMm(}%ma(JVX3L4&PJNm9 zinWQX>a98=6`576{%=5VzR`zFVUqWnrP2cuEtuVqj2%(}T#@&TDz<}$;Z^YPf*(#D zt?zCoq@c3hn(eK<=CcvH$H)%Yc_&8*%@Xg!s(1{_wh`qdf7zMvn|?`>&LVJy6b>*% z?V%EWh5zUqAi+PSq?48f;?G792wAM4HtIxzeDa7Rs24~=GV(qXgu_98ga@wJfL#VH zDriukPQemj+$dSNciH?=Un)sY6EYk;T9OR?7eh7)-|$4jOP*6ez>e5)w{LBCvC2Z? z7JW$w(B@eKJu=@&Tl9Z|GA37t>seG|j(@bqr>_pKS^UC5<1?bzlINRU=Yj(b9_ot+ zbn9XdC&Fb5cm+WVH_u=y#l(vC$>A=se{`-%44TPD`Ym=?pI(5*Hy0^?$Y`7Z5)A!) z+?7d?evX_4tMP9rHA&Jw-dT9_d80;uoLx6)LeW_a|L@G@0`HWq=(pefADYEK%eOKn z?w82%Fp34Pt?&sWG)uL>Oa?cSCs(nQx~greTq#wXiY3inQYOJ4UAQK8{|PCkhzcqE zuY4l&6-g5YL`m<6mTmG9qV2qls_}z7_7^@vEpC zqWFHvhig?UsO}y_JS*~6sV_g{C|MzX!szNCbAZL{uXbyTpW0mtA7pA3E=X-k$l#c5q(x+Q`9$vG#zeF+(Tqi_5xKZy7VKgp8upgS1= ztr4d6AX1t$EC}>hlYjQu@|$}ytO2>TUr)}#yZbzdKJicfT}4goMZc8)DETwvbpBX( z+|M3^2fvB1#90COCUW$fK^?Rl?R`q0+*jm`s{cYM5-r^mc+g~n4B~^|N;A%9{Khvt z7l2UR*!dqrn+B8lddT~*7X0r9G~>(?PS;nx{NgaEsq9n8uR+voM-ZEXqST5j3%;!Z zsIFKVg4(SfKKXzOmP0oYm!AFC+wZID+sBGrm2%*yjIlb)Bz5z{y0OnGh>t=y~t zaR-JiWi*$M+F3J8kW^JgWtAEYCrQ@UHk`EiopS(gIOhP|aLxe+f$!~ykAJzzFx)P= zBLZSSa5k>pTinf^fe#j=^FSjLrB>+c78d;7z7BvNr???3+ai!BU1VDPYn_AnTY75a zoig9f3Sj9X|FW9{=@rl+dPAFxAjxw(C$c^*JDNtx%0o44DB_sYE^JCf_(A65x{%gh zroYNZ@J4xFM!UFHwcH*ekC#K#3d5~Y(YaKc4V5pmYo-;Gx^hrYvuWm(u)FI|?+22Q zN!w22_ga4Fi!ds@EL9>1V{$hGVM%ZqCot`#kHJ)U-4 z$3E?xV+TcmN#h}?bgo~j!TSdIC$PVJP`oiPLuKWcT&hTEABb>!UofziJ++x0Fq=E* z!4~u7Fl>t5XH4>_sC$&OnT@UDwQK-dO+w2&Sj2#XsTQ%MGTO9pUIh|TQmSx{!qus@s-?n$VFT)G_xuL+)!|0uqQ+uOE@W1|CVg7gNemx( zci+V()9q~k2^14$5({I5tU>PvB-N>4a-mIub4A4hX9?E95q^bXsGww~tV0p}ilgLj zLr$m`Z%rVqjAD%Ffh!6{0+P&7S0w+Ef2})@~Nc~Yx1uZ{$ zlrbW%6ua>!#Bi${+^~9!g7(fe= z?ha`GkqGgW6S98SxsGlG6R(B%`&m=Z+rNP1w{*+Hjong$p8hlh+3#Ru>DIvX; zV_KiZOzo?LDgBnhUy=;k5?rBDCbv(aE-(*^2d8kPSR_sg-lrbS4v4+CX>P?WMei##i1#$ zBhW-_VJw^g(dGIolh#URN48Y^w5l0WtO;a|>;xLI)w0{8NL&&(3Q^<3r-oIOA_~=1 zV{r7{fv81BWR8!-2Pa`=t*g?kriD?9!Ml)XewIM1Z`0eLPa%*qkLi%jeW1+8nEBke zpD$*PU-o4&^Pbr$J&l8V>VK0`&Eo)tWoBE-j$(u$(9ci?H(4l5m>VR#j#cW!xd^t+ zNROxDwfeB+IFJ!)ZojozhUhYB6VLI!Zu;O%&kLK#$5b9A5!nk?z4e-75^0S$I$c-` zg|`KN`bSjs$Zw$@)Wv+1n@zgJl*!z{|Ck1ec^$j4`BfP{p1y|-89hpdS zpeT&-LRX}NODf_;bbzKeMS`4hh-@Xs< z&$8UI`Q|3)7TztSKIx`SQ@26QdZxpwPgZ!j!$Tqoo7QS#GJ2R{`kj4;(L(+7pY$}} z!6BxM|H?13!ST`W+~{4|tiBSFdo;J^?TVi1-1l+n(@1me`-~qX?OC*!?U6tET2}bU z`k9l+#SkIA0OwX1l#3Pe}jtMh2g*YDl9xaFYr z>z~R)Pq*+W%9JH1oGlm^$f*9t z$9Rx3Pm37RumhZPGtPiwyUTNG)S#GAR_K54t4B4i0SMVLzLH_68c-(CG~ zqQ;V$VlkibJwlu?9c^*YaRRtn0~Amn0qP?l0r&0C;G+#l1?|XR$W?qIk6tboo&ovDESyfdd~}nv7&h60L;s=awV4G9CxzKE~YVq=S63{s&pvcH;XwNjM&Uaxc20 ztEbeK;4$WpJ&&tAQF1zN$10y!u%bAy6hbKj7W(oy6-2r=^$_>l6KNr} z)vY+6tZ^C_vTB+prIT#=UwyuDc{ZL@2&6QfWtT3FXR?hos6^+O-s@zBBp%8=+|}_^ zrTbR6xx2kKabRjC10qv?qkTfCfIm{qWIb1um>qYKT#FkauEV5~y2Ypl_$D=}o^FQ& z(ek=ji5Fb)>ytk`O?e@?xna#yM4VG9%I0A2`->0Pu9vFV{+^O(jxDvGqhhb(X(6)$ z2zQoR2sb8#nlp5#3@7xd44`57kjkg;M?7K3799iso^m|d7kSgWMX$2bh0^=eINPf~Vy?Hcwq9Kl0be8a%^I$< z%zU0);nJ!Gs1KTiX)^0hjSQHDlvqL318OM52?%DTu@JkMyeN?74QYXck<8O5vujfl z&|GRo&%zKxOf_aN7EpshVh3a>_8GxB76x1Dzd>InYZ?l)l|{IP8jqy0tKHz=huZ$9 zhHxq&ZJqQkmRg4YxovHrFK4wz!_$m|WPL zOkG$@IqfbvfxxMncHs;#a28LvPTi~P1-QDp>(?$SQtP*(ndTj7xQI^S<##IUd%*pu zxu)nyU)!WN;i#6@pAw5=C-HNzc=1GjN9AQinIE)#^OU%qvaXbrRH`hL?y3v{LRIf| z6HKf3&ji|a&{i)ZX=F()mxB)#Av9Vb^mO^krTswd-W=Ln7lkp^bEM7UQ>%*b$}U!v zSFICC&m>lbqX!3myTZ!daOJpq<6cQe_w-T;W0+%Zb{?9|6vV8QjbEX&JAyvj4ewaqZiK-}%wx^f4fpzDI5R z9yNsNfPg}zzHqz{mEa^Gk2eVjjT8Nhv2t11n*`)BCIQ)NjzggPH!D1lpf+DJ6>2x| zFEy)vX=dR(d3WI0;%x=htDG)ZxWDP z%W$7P9vVP0g^cWf#AGK7$mf<2D+=;4Mvm1(U!(EbxYu$R-$cxd@r+psdEB^F&GB4L zS1qd9Z9o%fEwV3WZ?s-};dUs_$%see(8y2f^shW-hl7(dIKXVS0svukg5K%0E8=%{{}Bb>~#(2P)hl16u%))>|?GdkFsp?oCx@spowXt zmPZ2{Gqq^zX$rLnORdmZtvnHJ6o6jHE}8m#NT zi9d%G<2>hE0)L|}PJW-9!v!TyS&%YTy4^dlSt2srgKc>mTwhJrEDqy@Q)cEZBS#EA zw99D|ga&RhUT@@eAl*7mnc91gmYwh3fkYb&F6!Nd!fpzhCV{he6m*XYN;^lYe4r40 z--3h*UdY3{4fl~Z`_%h_pfAv$4$K}hwszPi3q@jJDnVHl>vAUzAw6Jip=z>+~}L8&)Gi&1D^PP@z#y8Ws(Qo$^-KE2VMkv`+Z_GTDGYHKBF zI6~>=5ic)Xmau~1l8G_Rnd<+;un&^`+y1}uH#6tYQ9kjNPmUM)6eanCSKtQf*&d(< z7x*S!y7%C=n~jnDsgGsaATRk)Ud^k%w3qgyeU*pZ2mfeK^-KBIk9U0HhbSz`Mzd+~ zYqe(ERfI2<;p+1?lZrHiejDnYUUn3da_$|sXTY8}W(WR` zwk_4=1Eb1DA#;Su=G@>Ab zEO2jl!y;-K7gg*Az8*axLX>q!@2zk8G0dENkeB1TBKgqP?G`|@RO|1$4p%CD39RXs z^S+`eO`I|~oJg)_Ed^ie$2t9+VtX75QBgut)o*2?23D*&^ODV4=U!*&gB{dQcJtMe z>wIjzEKCP!%?h->-T}1n&L15IHPDRH`_utu6QevK*YRF2GMi7!1h(;)Tvn)ZCd~YA zA3$IG!%GwAmIL2Ox0(D!CZ73lkBBqh0-Q1^fz)+m1XLb|$M_-9;9-N3fzk=R$`vPD z$dQuNDnv<5tJEA7=vL$Z<>sZI*n06%ya$PZG?5=8;b=1W!mG9{>BH)7qPTYfEh6oN z5}vf_%tiflG{M}^6X{ofj!6XJuFfV37PVJE^xxYnUXSzV)DkaN&F9(t$e*T1d{)Rz z$<;m|2vz2JTb=&g-L?o|)O!PSu=o$jhrh|P_N(~)@DbnppZG3p=6nA%H-TXF_wWT{ zAE2_I?u`1QZ~Qg;V0OJ2;kS5rWoYSNzYH|W@>iHOLNxXFZ{Z9AI~Fr2){OC}tXmdc z;d;b&alO<;IT>q)ZF zU|qi#YKPr(35So4N++~bAFOl>`M(jQ={%_Wnq}JsTW^x!j*Te`PF4mU%7xn~Nd6MV zi(Jcnn&!#ah0lo+rn7z0Tx{&{jdB@m%!Wy_vwVv0^ zGE>h**IC9sY~NYe_Zze+H>LvHREGN4_CD5BjF6?L@4HQg;(+mFkbAdhG9%bsbya z(Xv+4;Ce^>OTu2!SLS%DiDsZo-8zjflns-IqG^m!|BH_QBy&pq)jmNqig)(I zuQL6UayT`B+IR1F-x}|POC;PB4L_D*qZ$_yP6VM!CvSziD!~C0?~C*K%)?92T^c;| zjUPJt-I0@Szye=9!7pB!>{nf^Y~}=DI7uPk+;2I{xN3P0&s`sz<7VMO4xH{l^&l|T zBhV1U`ok1LH`{=o3=`X+lBFy`V(>v?GF@bjBxmZ(|l&EWjvFUk1D*TQy zJy->dZiG|wLJtNTJ6Mp?SpJ2aL?nK>>qA|nhOXc zY`Eqhl{IG?-phPNw@v&NpYzSPIm>GKgPmO#x9L6^ys`rut2o2$s0-S~heJU?$n>R5 zXe8Ez?BE^*^wBXj z%=`%tsrRY=~d*fhB zakKF`Q=m@F0ZcK)W?SmSBuO@YYzm^^7(PBm>AkG9S`?b|3J-QzSSwSQ4{g|om3Jf$ zEO8{FC?@RfDy;Of$aD<)xH7xTZco#=$SCufS9g$o^6I{%4PIh2Y*8h+4L>c?REH6vfAy) z=zS>}A-Woe8C@MtorGsHXeu^$18;U~OCgv1i}tku$F|_1v(l1wohwPRPL+kxB7#~( zh!!n)i#Ckp$8*ZY@Mc4^Lz+I}zZ>CS>ABOqv|Y-cNLFJsl^~Sjn}}=RZ|}XgtOfHD zP)kY;U)V|0(hm}ge#FCtxLsvx|2!k7^Xf}hH;?|*4(+0!~cI- zKeWlMS;tv}Zn_gdi3)<>^THe&dB{~`?49Ljz1(kzFbn{l7N3|TgdqAB~*(&UhEqG_i)qs295W2JI^4b+C&me!3g zUK5iwvM=k%qDNo7{u<(Jg6wDEGWp&Ry3smZT`#(p-I9Y+O9JlU>|D;&7I@{!vD@YcpK9)m;rZzlmO6UrvZd+!5;PZ72rYg{kKPI*C^$fGf5`e`Y_GEW_B9x36E-EfWMQ!TZ7S zoDd&Q&BJ^HOKpxQ{6ZVr){c$nX9AZ+h>q=$aivh5mHu2U+`DQs`%Y9dQQ=a}|D_>% zWZ4_y@)eYM|D&@4tT&J>%SU%VhIfik_H!r0!FUi91v*#<%h2VMMRTe1rWKeU4%*gZKwqki*eo6)C4 zT5Mn!>$}5YuitD>m%DBP-0|y3ySSjDzQ5T%7I6*lrP@C65r^`Eg9Ux_fe-Jt$6m;% z`O=%@?C9}}x)y8Upk;^gY@ElZ8&~wS_{>kA6fq|>lPIRvTbve(IUARwe9g-;$7gd8 zN)VhNlO|v@Ofx~qkaXxKYhiJh=O=7xvBO5F(t%WyG%sc1_Ckz|b|%3rubPuOMi#(a z5>Fn)S@cB|&pE@xidWS!KTd!g-uPN75AQPJHNJUq*a<#;XX6V)2ZefiNIk7QwLGft zK=hISNXd7pV^qD>XAV>6Kac;5zW^T& zL~-d~#=*eLPR4tASOAz0iklsn8qC`0Y_(;#D*k@`n<~cC>psh^aP_bV*hiQ0CZsb9 z!7`YebGe4HXCP$SfqG#s0|XUTZde`WJYW?|RLVS+Qa$Ium~u&Tb}Ok+Y)Eh{@kU=% z;fRZ=Q)S`O4lrunJ2g2})0_mlBc!Bb?{-TL80#knzG{*tn2_#uNFm&qn?t|dU~jrT zOu5U?hSyr8;!I3PJZmSY?X1|BsZ$x`La~P;Rll> z+BLvgl}e1{967pbXYeNx7lhKZP>9Xws-3D9y`|L9>_*?eMK!tViNSkn%<6#>s4?P| z6jVdzmqG!b6LKKyF8nVc4$=M6y7_R;nHnJ6Do)@$@GD(^Jj8%5={Sr zX!CxoBJ+MiE8tnh-_@mmYl-Pr!nA9DHuFC>bj9*YLQp#@d)r`JtpsEJRPL@4@35#F z9S7mGtGGm`t5)kUu}a44QTP5y&Q3@2F#SylV#90FjfX*XA*1ATE8NY8y2e* z)KSPlggpePe&_s1;eA7ifUyo0+^fD~yj1*JDt;{$zj9SDfcs593Fh}w4tJ|H zVD$qff22r}46SF)ECu$l zD@7HREWXLvQ(xp^W;hz*JNPXr?R_d9))rWh(^0nTCVxZ7Kw45a2H_bd5iVw{iB&?{ z`v`22;bGexe|sM*e0^?6>vq(c^)y<4zNDzI#VJz8IB-mo4kDdm!cd6x{=$u;zwFzb zV(pMqD#8(qGms&&x}6)hw?`{BgvjQz+}MAPR-|22>oa`L4)o-q7A%AYB_D3iNz;{7 zRzl0bG=o|4hN{w#-n}-mY(65>3$-uIYNt>@#;qFpRuT#xW)3oJhHDTEc5_QbW6YPq z_ke@y_PTE1qQ?DGxfy2Y{TX!NWO&vBK4zri$}2zSJ@&JjN3POK`-fL?bf09TLo6AG zQf1+8`8)Rdq-BVP(RASBW3g{_i&*YL1b?|O`zXt;`NaH{j>PD6PX{d}j$#UWJc&C( zdJM2enoh3L=E+Yy0A4oqg~6Lew*f zRm58_Q>Yk=Z*fmyjWV9@71*fSq%(_fRS1E;`vBq|kRcKQWgr@1ATC3b+g07n6l6EO z7OY`gr7cp(ANjGogrqv+nD1t1IL0ePP;7q@NJ#VfBwWp>*SH5aIQac8$C?#B;(?#(gyWzAns>mdpaJlbe z8@#d>95rVDM+V4~>|&9Sq4SW#Q#=}FSnx5pBhH|xeywHOT&Z%~V4bQVS{t~Pa<)xb z6bw=I8(o&g*4jh0@4j+M$^)F$hn zCA$bq?wig-kPr3fT6la*9y90(@#BIY(@Y2iT?ewjXy5$eE)VD`BHZG%~(nZqpuiWwV@vfqP|@z`F3xC zm!FoTOioAq_P`wnD#tYcg3}N(33_654Zy2bF7u+BC)A>8cU`&e{agxlTO$>&iM}ko z3!$b01H^NPxswpPAFSqcTB|ne@hn6DUk%M%t%ogk0-yDO_c_{+gzXJGyUi(nw)FmJ zr^tr~Az+x-k=>3?tJ#_=^8&X&e9=`Z*n^3bU2-XPHE940anV2hO=lf2Xz(g}QQH-_ zSDRqhSqzt>+S*k1<=Ezik1!g{LIKg}K2dYcR@zj{-xPYXJ1|BEwT$FeV>?(R?P*_z zN0*Yi_!oN6X{Xd=D7|xFQB6~h;HxEu2$QYJarIJvCd_eCo*v-%_H=`z=&j>UJtyTTw|JEdBsX%bgAyB(|^)f33fKO_)MEEY}XPc02- z)|;~1>2(-iC$Xufk<%3$-tA7~@$3JV8GkLB>I6#~T!1RnU|ofZ zZ2-c8kIcI#)Z}KoD-}o6`1Kv_7p6a?_Y?Rah*ORf{(PHcy5CWDxRwE-3qL^Qo+)RG zWNjL`X`B|pYCAdH?Dbw~I&!I#<0$6P6S*Ryt0ZmUO`}&jbEgTJniCk4R_JsVOZ(NY zA_$Cq64}c)KJ`4HZjb}MVb!PH&K}=Jclbcjpo7@Myf{If#8xMxS(~ONxxrKyT;zmH zogY?<(?1NJwTloM?z0x*6#LupW>!D5HsvA&##g+{ji;W;OIv-6Z^&IA`a;m|B@O4O z_t2ZTjs*EuotcnSUrIv;ETVIVq4v5zv8T>Rq?be9HRVMGKokgFtaGZ+r8_x}I;H&? z$)**%;BlzKJ%^NXD@v{8IU~y zoWWNODC%}6VsVbiKy0Bqau7uG+2xTmAq|(%093G)s3&Cu10eSzoSgD(wWZjx@b7rB4{?PShCDMEy}<{dRrp@s(nh zn_0ZUH|CPt3c5!gqwog9#Pz*~{X&JWHdeB_@(BN_%Eg{>H|C^miC)7sY2f|l<|q$UUEqq!{>eO8-TtXr!v(5s zt^!X5(yQ&?+H+44u|_9t(L$U=H5boG{&_<`6u-{h4VT|}X5IaMZGbh(okNhw^H=AMzCK> zJVVU;7A6AzsS(BwhxoeWdZBjvMJ)eE5e=2C2h}NPU@=I`l^oijdquF;Q;7y3Eh@TFk zSPqm{7hhe}yqPYnRh~qi(mpFay?bX18^s_jg2PVy;U%qC`QT>FS#UH}>(GI0K=iiP zfa|W)6ztH$=4Z$=qeGtRSxQ<8%4leQl&v|a0qPPpKp{~B#XUb zY;JV;X6z<0yj&g@gB*u<%}1j{BI=BnEdg8xAUWQ|1P~1cGDv7a6}<>pYvMHv+ixn* zw*&bT@;_TlV%AZDJ+nEd?S`|O4TP_mlW3{}|Ay7+Il`^QT{I#PN`v%=JB$*1by*pP zl|rUmycx7m{^WszQq--h0eNiEURV4Pg($fj)a`Tb+?x`YY#jxl5Oa%f0#{2Y^&w~k z>8K|{yBgkV1JYIBUBH(WD;}{~0cU|2IAhog)Dj_n)&FbI0Ki%TfQdm0foK6Fq5%N3 zVG!2@Xspf${kEMz9V(hhVe?8qljtCjR%)tY;WQ5IuAA0&xG`g}N zDmuoL(!nHo))lY(!=H&*=&?CTVTL6>!K`cZr z;KNJR=YS_yV?{kO5dJ*dPgER*>af$FNBf4{0n|xl3Q~z2watR~Wn>k4OsZ=9uT?gu z=#p&gl<~+#LS|(&H}UMYTd&TC{p|s7>I})ZoarQD=eP9<>PMN*Ku;~t%$`)0Ds~b0 z>_HJ!(LIXP@{BR6j7wsRNh_lTR9#1Ip|oPZMULbmeO>4CVh4W&hms|?>uI8EoYT2DB@@-EEnq^|bJ8Ne~)5G~TU?7u&5n`!&Q zIV?JujhNd|aY0*(!PnT%{x`kFr3Ne7EBf3UltLe43lnmRd6ylf3Vux&QPteL+P4?1 zX{Oqo{6sE8Weq%{UFZ;<@Lk0#GT!=>Ru$weXSz-HH)EnTo2vL))2>Ngqm!SLaMuo; zGcs*)?A@g2XfDA|?qof)ym5yqU21_HuwTF1O0|Rg#90ZOtE^bt*&95hy^L}%WS!4V z49Y$qA-$EWI;k%MgML%VY?lwLlZY$puULm!Tw zr3+(Z$**df$CvH3Y#5+YKc(L}8`%yD(1)GIbk39FT@uTO*!ofN>LqJm+L|~H{GbK- z8#5a%5^j>#9^W^y?(VtAODgn|qMTR-B)G(Z>%9JB)qDWXm)bnSE5?5l-Ynd_8sOSw zrX*Tv@Le<>To}9++1s(sV1PYI*%uO*%spc(OVBmYQ{Qyj`m^8EuNI(E^q?%TYvc2m z_Qz5U|4EEz_ng=$^8X2MOP3a$a%s9+7jb|iDe^ZxHqoWM#<#pXh_Vi~Vim$qb{D!G z`9F$7XnpZqT-|4hcb50>9<}qPEMdKGB5P z-V=>&y~)h%C4-lG`q7;7P{LAH_|o=>daU?H-CFk~6=zUtayLX(lWXV=6;)6$>r@d? z+~!$Oa1!9D3!Q&ZP2n35H7t?HfFDjUDe_^ntsy0Qu&N-?(x7+owTGw4U#Mu8N`Vqa zSTgl|Cms9pWnl{?ykd%%zosl%omkpJHUF3#WMz^uvO9X6+ORe$_M&%7`IIl1J{KQs zmoLiy$#*=AQ{065E7V=%vpVZQuTpN`;$$a{ zeP^$H3-dg>V|BFY%EtY(PY5rcxr=)5ce>1cmXBwoR-gqQKH8|9yaT-9(%GgA3Nh42Ao-={%{kI=yI3lIw8TPETs=Rq64tj?X6RP}^bLNpJy2G*-4 zPS6*VRfl>)^6!>EbVub4j>rB0C)%_GaRnBm++I^2N5DkkPz*6v{CJjH#;U|HhGj2x z(f|~zhUw~WRd)rrvx5$5HNwiwJvQOcIxdIv#mf6*zWlW6Zpa@t=<1UoJ=PLv2WfmA zfemkduW{D>T3b(Qd(l$Ym6!XB3}+*pR?-v_WGVx+oi|PmzqA`_UHEMg)}kr4FCIW) z!6tYKYHeVR)K) zUJad~%IaI#+KYS@95Zhi{zNkPd*;uBWi9_Mc9pur$nzYm&>AATELgMQn9@xgW0&jE z9c-rb4RN4)Lu2dHV3lttKJ-+76MDGB(kQc$9|bMLs1OxR364ie@ccb3 zJ*>$Q%PcN^J?FU%Zed;#vI`eQ>2AU%ZHn{bLew9B`BEhYk36>$;@no9PxXc0FZC)#$2!6E=3nW-bOnnVtozz$7Rz&S4$fj}=RXiv=lY4{q2@S*zdLXKo2I zp`PpRMGI^jb@=^Hm3G477A9#5DSH;V*iF9B#*V!F#*Vy<#x9J*Z1yr9EiV2M>)F2< zPlIP$+wLay)R`%1X z5I*qb_;zIo2^;n#qNY48;zcnrQR{X_hw6nwrP{q-UqV~&K@n+pT_*sJN$3zc7~d&&&#Ai}|5S}r*kz{g+`Kmgp48ssBVFi;g!FpK78rG<8H^b73bLpH_gQgy@d(o-`1hmSb zbuLX^b_0@8id4^=wsaUb48!+uN~M5XUf)(M`)x~XqEvJpJlhkz)Vo`CZj$P#a}%g< zt&TyMvhSgb5uMKhp1SE$shcu|TD63P!5%kkR$d9cSQ1Q9a7hr#;MZy3Wj&*^kdMOx z-xxscBxQDwI2Dm`w0nE(7K$!%d~iu zYR*|*KAS|35~K1vZ4msWc$b9h**Xeqpn4Y)SaT`2A_5_Xh7+RPvB81e7!VD24P(2p znPjqNoPua*Y(aASLNaTOY`?QWQjpXf$IwW7pw#+PxqKB{&vezOtW{;5y}mD)=1~Cv zS%w?5(lBmryJ_tq+0lTQqd3y-7Q^ALEt&4uYZ6$38;d2$nN|i!ZqFCS-}uUUx`tkb z9hV^EpA?71A%{l0Q-z&&yZm)KlB= zIXAp|-?DUnuD0+o;kFtG?1H({wiBMbJhsd}WOz)9*ZS^b;1zGLxkGzDPrPRkIxzf} zXXvZ34fV70@*%`((te1*E5LP0*uP%ejgsHkoF4@x#;Z~V3STw->3z-Xr$R0T!L`8~|`5-MC6d6NNWj^yxUI<(z$BQUa$*<5( zm1(x78sdRmR^7G)u8`wtl%0~__ZDGp-x+0RwsvapUlhU>3x3)#Xw%qHmB^GFAEGM2 zl6`TCimEcEG(cb(efXwyE!^O*VwK}|qyoJ5WWe1l!rkqJU8D#T799G~O#?bN#L;&_ z0kxr4`gp+xsUp@+8{EH_%qsigq)|UvA{D<)XXuO|)^ZkIBYmXGBCwx;7Y-k|rK=Tx zmzE$&kOosyREDTDps;HVIktsJz6nS#K+Wj|7@$#cpyK>El!@XHNaPwQEa}FbaTV!% zik#3@WTvM!Ys&;^s9de_yIg7jFIO7Ds~erXDVb3Nionao8XGmVQ9L67nGt}rqeBP9 zObIKEv1o2{u4}rcZ3Le*#%nH5@LD?M3GW`;ytE7VSGNv|DRyX>E+fw_8jN8rce}jt z4&PAXnzqi{qnEFSMrooFK@ycS46Jsna%Q2Vd&Ql=v)lH|Lb;>k;~UO|9Z6RtnkLl5 zA}&g%P8$jm5E~aZk4O!O1bhh6tb9UsA7`8FDtT9{Y#w)_6?(42s5y2ZN0~MK_3?}6 zN8pS;Uk3dA?pJ^R^$@|YA^tv{3kuP{uFq1bg0juc9#m*acj-&iny7v=h{yT@P@~SM zy@V{d;xW-Vzt{X2`{pKbAAl0Z2B0}BRV-HQv{)~ZyR%?!#krBk!{*+PV7ciPjq7&{ z^kdZK9uuH+Q`Oa>-R26j4id7Q{fUDFC=eT^T6kfjsa3<-V75rI&!y27^%g|TQ5}aC zlAUz$G>2&xf;etYl}anwZvBlG zCLJlCNkL@g>1H@L3wc-Rriw zTXB1xcc~EDknxtFqWCvd%<4%t*y_Q;6LaJUj|)cz=24m#3I|7(msE~RS{F96|W1rEN5DO zscoszo;d(CL+f_49;@{j^(xnLDqVO}Vrr58^|B^Z?Utl2(GR7KN%PP{kOmr*jb4D0oV+@O z?m4K_;Q0;25!MNs<%-^tW=~yXKay!D1pPs9P<>pXV4)9Wta(+q-OxL?U{|ahSW+I8 zUQ6$4sw?$F!-F6ctazkh^KOpNSAh{*x|!9jIB-;i#?ClsX*?bi^AzEb%=wAq+ZngV zOmkoNF?^fpfUpl#Velb}LfCg0i7mS*kf>bEzgVRgl=^1I$cEjlm>e{Tq^s@qEaBR2 zdWrDB>#n}D@vb=Z5lT1rh@+AHK{B6t;ME8Gsy z`^X51roX*IJ%?WHCY#*1c2bPDC+?+6%5!-0@hPUqNkrd(AbZs)XN>7DquhW7jDhkh zXaHz1;CN~i?L}9m7@FdQw*Ry=xhttv3&#AHMq<2HHMlTKS=n@bKKwdMaW1I58x5uS zYIP{t3871$;55sO*z_nJe^Z8k-?RA+9?XZ?cG)$Mf2LCx)xCg-*%N+0W#^iysifii zibn-yvNzc_-4GBa$b5aJnQEJZZ8Y5LHWHnn$UAAIgJ{BYit!jLz?wo`mxSw5uqS=3 zkPFJToYM|~VVgE`RFQ`ocji)sa!xn1NZOBmc_=V}RWwuc`Te&sx*=`N;1H-qo>>}f z)c<@y1a9UJ)x}B9-2wpx%YEgn=Go7r+gbn?#V?ijQ}oi`F6}3j*u`4)^;c7J74P;w zZ|e431LQu%>f%?yR-Tzp7xz>bM)Rn=KdzVFv-Im;mEdH{(w8#c5K9J81u&6mA=M)( z1Q1SxFdPC&0W1l0W~ej4HN=Ba($lEFUB`D+P#-Y8E+8F~?|18~(3ZSOjE$n%Ib6EP z+T={VqO}Gkw|dV!sq_J2sM;UM97$FtPrs*ZLubOu_`^$JJ98Y z!Oae*XP31wd1_Z(+WYj$)la8E5i|>ApM*{Kw*ty%?%+MJ0HiL>Y9RGhH7BTZ>Vzc8 zpV#41Pu63I0oj(ehMb%eFB+j}(sj}%NGIgb%CGTh2N#@mp}D?&hfdog3L9*&%TQSl zFHVP9GD6)r_P)B`_6@SJPi@C{;{pS$UkRRZkRwnprGtxpu{CoDD?7CvgR9LR(4R~P zW4m_a#tr)hCb88$X|XZ6W19jjY}@=oDXPmlk^kRY7N$5gSEO{a$2zWVG6NDgPQ=XK z5xAeWLiH0QueCDh?k42`0M7^Dc1!6VyK4yfiw}+~(3yvG9A1m4Q54v+9HyCPNEefl zYrUwrG6uJCvyuJ@+E)_pK){uYAH8qMsr8V@zYahs$Uj)HV_>~>-1PCG(#s~jO?H)u z1tR6qb&`1sW+pDHr+C0d2gMO2Mr?{Mc6g2+jd@|4CTffQM0M@W3-ftZMktPTDs5QFyGlwE<9rw zQR&n#Mr?x?7j)t~-*4~Y|ELZ+nG1X67DlGw!AtIUQG{gB^+DLUbPRog20mE_XpT>2 z^#G*(p{x>}u>U0uMo z7YR~4+;JHzL_j}jVvS`sEd(6w`}tMTV_YmheQ5D{`cP%`diI5barz5kyaFCVMc?U~ z3q$?f^(*noaA!sH$SX}yz4NWw8OlX4R*EN2)4indj&8zA?@FV5*};0;Fso;+k;@B@ zpy_vXB8o`Y`N3AkB5DU$o=`**%aw8ZjYgikNbK@P8RbRFw)Y3$S-Z6pQjKVI!OjEa zG8;dw;|z_Bu=R7=nfEct<{2ifwu;t}!Ux0*Rb#PIWdk>Fv%@5BrzEH_4O%r-fQ6}; zK^-K@@cOT0(`Z)&_Ukpc4_ zLAvD0eubIq*#&I9aa3*-FgS4+|NVyZr49Q$J_gc9vizs6~+c`8%Lq=(fh+e!PS#BU14RS%BJ-ZK_ zuP5~WyWD8XAy&Ux9b~rRm!6liQ>}ay51Mr8SlDiJ9>t0P>k~ktczub?v^ru&Rx8t& z@|+-m_jG6!x+|_|9m|K4y;;|UXTHK%_nB3KZ{H+2B$7dFU>TKaH;g7b?J7Jt-U5Ux zv_M6G*4n?!svCFM;tn${!#Vd5RU*r=QC;Ota~kI4&Yq+%JV5b|ifPOxbAHa-QRjE0 z+r4=Dw$SG^U2ZHVG>L#`n|Y?`*EpNyJ}C%RchL=iZY;Ts4{tLNF1h(L0)#;_Tt))u zheGy}7gnXOX$ujFr?#bh_WyTxr2en1<&po)(Pl}bd&{43iBrS_TObJ2{5+nFg1)W2&QMM7bBx=R`Y&ZP&4_HW~s`(P~>wZ<6!tksY|RmB6l zt_++?`rGK>a%luSRpW@(frL0nCNUZXL07su${u!NZXF^14~w zdm5Y0)ht|8y-{-!h<+Kz6nO^kDAhlkWt*%J^}#Pp*3HwYf==pwB8D*GzH^O z5iQ|mrz_c#?;>gp6tKbnE$j#)GdouC;m5t0YXeqzSi&tBx$dfnc-~wduyL~mW}>eT z)$vAc1ch11C|r?a7*x^hz{XGJG#D2R{VdXKVAb2MF2EwlN3p-qnv!x|0r8itj7Wrs z`#rk_*>2_lYqzKT<Km&cp@8tr7eTUnN&`@o8q30K;5K-p7=UvK3;&?lB{-BLM?Ibt&sS{Yl9Um9UMcYFfWIH zr}(o#=Goc#&YjA9Q+p6v3l|*n56@? zqv(>>ecS2GO-1BsIe{D7P-b8ToDYb8Nm*TJaQ*JKkq9J#!Vb`xS>5AO|ejan7{j8xG zZzV){(tbx?cI`VL_`XVbKyYCR*`wRoq|$b~lovVKqarH|VgTnNco1w}7yuHxpmc*S z-^PcPct(QY{#iW8JgBzrgaAy*zg%(gRVk@J)k-KEJ?t?mUC#ot^I!(>Rmtwrp9v;7 z3Mwa0vN+5L_U-S!;}|eAgFv5VeHZp5a@yn7@4G=7gccl6fwuLYynK&q$lX-?QM@td z7?B;B6vYr&)Jfi5n;&lds2eS_h#jX9JLS_!;2(R4rVH80QmCiq`3sf}-`rnobjY%! z4cIa%my?E)2Ru6Fk9HQteLgzoK>8614n8}0y_K#R2usS0%bFyi(xS*>RL?skoVa{YB67()0Im3S8jeB4z&hnbP894E$Gfo^U)T5()`F;Vr&mPmSPmn*q^vl52H7_> z=W`nTL5%ynyMO_iI5#@D{qt89S7O}WbiS;ePD`Tn!gcU|mg;b)&ZXH<60tFV<=oP?GSb;1cQYU)?E81qT>2518tyzYhmg@$d3D;Njm+Bqw5AA%)Y@Cj0`|enRPvTbg;%+W2VYo`` zG8mz5?{J5^-lDhK{}Q;byEIG|<3kfr)_++0d_?|dV4cVo|CaI)HpkW23Gs6ZB2UNv z%E)J32+*`J9HupuR`!fx-xrnxH7XUZ3STej6@*8yKfM_CGvKD+NN|ZL`&n>~*;mZ5 zi_%8PMZNasQOfzQ6Xgp&lV7OJbJEwTc)kinGd>kIis$Jy6aUY|$QJ;-W|!24RSb!r zH_J32bB)Zt2nOQp*kgj?$h#p@%8jmVi;%KZE+q@~P?E?U9#HhqvIu4*j%Oc`Ib;VS zbI4|zR4{vZZuG~b@PpB)t~g}kyA(-uNNgm^HW#VlgAcx`LFM0)SbyRX^^0$$>mgoHNcb5Qx&TTiuOg~aK>+Q(%_6o6 zwQ00Wd>S&9W}P#OYgrZ&T{w+O`^un7mlQi0k3Q+@CC zn}lYdK2C5KBnvVaQVBuK0%1L9@LvW>fsToipvDjvm{N%yMAn?fBC8|r$y(A-bFLdY z_5d#!OMC=^ANp+w)JQPyHNZH+S6~*dxV&0#7ZU2MmV8#fTIF zvHs)}=%`o`0BhNto&bz zucVfJ;v&1+cv^GTiZCss3MH6a`Xwh0N5a{ZQA%<$qlC~YT4zho!p0Aj$O(F7ztMm|jBub<}E7*e#Z|@=}xe(ij>KP&~)(+_fOWm%*>%P7cz={tUU@A-{K3sxg*|H_vvHp!R z++?;xfPTC-qrM<^`>$O+*ODOiQSi;?K)twl+rThv0b}4qrF|xs{P*U5YJ+kF(H4I> z=?$rS(;J7l2G!VGPwu2U0~v!MX5tX?>1dL=fMdNgovJf)%?)P+MCl7Hc7re`a|V1r zW(}=sV3`skE z?)6EV`Uy6|<$7NHi)EhM$*p9XENMfA=x{?jE1?kgMNB~$HrIw`yB$es%L-#&$S*ya z&ZLnRm!LO))#ss8t$C?ISq8>zGA(MZ-zlnEZ}r?RXe+A7)pLj$D`2QPZ8Z#~T9kt~ zU~l|f^W}()99ew`Zt4L{PT7vrnzu?}bSowRFkeTbAp!ZB>KgGG({u~aP^I*Fp?IYo zA~kb%O6znGyuTGQekUII$k>Lz6yHq{RT-I956AaDGF%>8K?Bsl-#y+}PR4{qI;naE^}Rhr%29$9X@;@*p=u!78-7g5tYme??qFnBvKn0? zt;V=t`6x63odb1d?fq$*4{_CSSQG|zDpU6u^#$T2y+IOaxK&99Ea|_gnZ|KpM*?o* z=)Q*ATItmHM?kW6N!(xecfvc}sg^%JTgpbkw#K7<{_%ONdPK^$-*V&%XQ--)9ns>I zHMhK9#wD%e5D4Vl(thxS<=Nob64VnhFa}&DJk=j{Nw}Io`wS~CtyTW2;9`VBREamK z2V0hpYO&5aYri(G|GssAyGtGK>Rh(b9`I#2>1LpBQW;PkpukXRRlxe;`(`0N<-vkbX4U!PitN?Mn z#mvB3u;jV83F~LA;*wlegpWkUs9^nVpv>}_RDQ1h&Qcd5Gg6(Yo%JD$fQe9*EX@iG}NqB3oy-1E;l6|T1?tN7jK=ZblE*$Aa+y)BC%k% zY-5$;?M_o%XtE%a8GVNXV2@LeRua&6PpiQP6A`>%f)j-fU7Vk_U*C(yv4IH8yk@v- z3?T9r<|Yo9J7qZn(}JS#S!yt4@aQ0TZ^nFT6|nPi zblG)2xe9DPF5;3^or=owoW-^sba%1z*?(DkGj+8B13=MTcrPRvu213F~D{0*0OWz*3ig@#Hm3eAc zKzc<7d>y49foGx|sD1TwDF4z{vNh(pn0>%H#nM+sRuZr=ddOcm`PI`cMDABSobunO(AZ-LUSl{2p+^c#*Q|L= zfLUwxYjq{ruZO3mD+zTS-<4l_0xhs=lR!kk8F7358J-yeV5kG0*4~JFxJWL>au)c1 z3;FdS*cI4SXxs@jG&0Z^YFQRU`eux(R9)O@A@Sm!BU{eKZlnFBSpar@^Fsx^{-PK6 zvkz>$t0`V)=OE8{{g@XllZF8CW~Qx7NG<4O)A=SK#?{9!im^Ws3m(S!%RjIjPkdYD z219c)gaN1tT^8T=;sDLDqBORCCyoaA@rT+99rREpl7ZMZXXg8Dw2CM&ya`hT9$1sB z1Oi8XvsU1raj$4Flu1TRFL+zB6#SqK;d)er|fB(1d64b3@;Vj z$`9tQ41&xn+ebxrfpG^PC|)mz=Gc-kR1camKY9ooQs`^PF?<68w#vZnW#wXt4f)_bfg+r?wz zytGi%r4Kn2WcM!4J3T3XvlSzlAl7I{93MrcRZISBffXXM=Pl?lX4wIkH{7Nl=~O8nir3)`&12V?6(eMeLytLl6*TdP>t%ctX~jkwe@m z(rHf8Dn=_$6~=gMwa_?-RrbzaLT5cmw%BkkU&<9#CiZeprdg%fjKfM}5k%=MgL0kP z?5XR2C(w$J3|yZRyDrE+D|GvCNe;?Rh{(y=poW*%sx16$Yp!UmIH>qQrJh9r+dPL6 zt48v#2ALo#_DBpBdd%U2qRn_FjR)CleJ7`Y{8goGJaiOPlp&b)cYgr>vbVlxS{?ek z2@L5kkdC#YQ{|15MggGyh9+u^qlr?*f=W&Aq_^~q9^VGH*-iXWe!b*B*5Z?*x_970 z`Ee*e2)zyyEYOZep5q{fiBhJhLz8_Fj#?jv(Ob zAp~?{7-;M)I7vvlqV-xvQT4{ z5Cn7~;39@8&@DR~$jm4XkdxQ8*zW|C!9E0RApjm#-fUK}u(M_|*gytF0bv)b`s8&8 z@TkcGd_03ukR{SxM`mk#JsFMoe54b25c) z_Wu%sJvKmy8G;Ccq~D-Q0g_SqaCjD2*_jE?oI7V(!Jv~GmuN*Ud!aTd^l5X6*V7?&RyE)QQVi3Wjy z%e4O{DLU?2P_28pu>GNw?YQ}oNJFFNOp--JX|pB4FcyVniXctJfoz8+J(L*{me`G4tXd&gq+KgDDL2qSl zDBR{*EUa$MIg-3t^6|%v9DI>AwV=2NR~EXxz*0~`Fz$GmDTj8QF|WfD?r)7Iv}CHSVd;H8CteV21i+u6xR&7wu zFq5F?QY;jf7171JH`BBnlKuwp3h7H~=08YXBkA_OHX*yKbi0~}o%R??*LZzh*9rW2 zSfhU^fzYz3qjy59fXJ4ma$dXX+TIp38Z;-sS|+zJC8&#apB{Gc=b^ytT)p!&J1vg( zibm@|?@d)a-|^m?KCcdQ$!`(8=<>s+Xgg2GNAz;ut6e^_a7(l&e6opZDAp?EoVQNRJNtdp>s%>^b`g6a)jR%P>+8 zOoDVTJwJ{QE(vmK)t{~CGAJ=IiB-rjsyq4PC<)S&1bF~SkRy^HHYjz`p(f@Y;2AYi zh{m@Q;}pok8%Pb*b#lT@Ea!1@;6TYkTFSPvkZV=yPeu1l|21+R0#Sy59;lJ{5Jj!) z7$Ty=ck~r>AQz?9x|6R>0^;1}Vir=k5QK#=5r!Ig#s;2{?l=hQ(^yuK2G`q_k~T10lB%t#%IM z$<&0PI8YWp<0O&Bc>=$!YJ=F3fA4*x1wq2+Jwb6cl2twQn7aR6x9io{)vPAAi+aZE z7j_Znj}3V-N1<))FLvywTP%O2Ao}(6Ui_5?#`xz)!QVR}zWMc>6B{oVk1~Ge0uV+Q zL2mP-FsVr!QWn--@Dr1hz*Pcp+W6CEa}_vNJFJXv00% z7ym@Ii=pMwHUfX*8iN!JwZU=++E_ur(gczQ2p~;el-CnK`>xYz>}bav8>5)g_*|T6 zwFhs=oEuPz$gQPxLmR56bS?GJcW;_Q8^ArQGZKfiJ^pVF)-}>I!!G`^^=TaTT6zg) z8Q*%u#t3#`*VNZ7^$rwJ**-oGhVer!Zh>UI(b~qkdM@itM2^U2TwDrct?jI5_nbdm zbm!i|ddHEVv{7$imcJ8}r-*)&Jd#MZk`K7k&0WfvKIo{j6zQlY|hG#j>6A5*eE?o(iBEUQ6#k==!EOQ{60e7 zA3(|Asn=;a(ed*>Rl{Il*K|CmT5NQgsPz6>70TUJVWAAjJZ+;yjM`lFDhap{f-i?R zscb`|FkuN*S5$k35)36(wR*2g=0{YRPd1I_GM9F%gv_`fi!*TXuuPDepM z5D9edPGgHXt&li)77?gt+QESDCLXlM@{}p=S(!t$5*=SHx}Uf9G^NvJR?@lg(?5}X z@<6Gi(ljY1a3tB0O17}~pt56w;h?=>R7v}}xWh#_DyH}S7+bmpqmT+L01oop;JW>- zEo_2uXIwtkf87xc41+enI*&#(<+|0Oqe#02_u3?EFF&VFJ@yp3o90CEYB`saryu}* z_4!YsSdsKVU7vxvy`p+FE5#uuJhE~@KAK` z)K{$5n8V9MP(}1T?4^5SQ^${eGB^1hPeR5b8AIc08afeCY)oblBxtmsqEKpem8~GE zB1b&z4gn@kPM;Jvr%*hmI-YoYEo^OFU!riUic>reAlh=NBP zo(f(HriFTQdA;Vpx0;`cC3+(W`yla7rWMg z6RrB8*X3Ye9=d{MgK)lk&^=osB*Wz@U++!7sOQoV>kXS+dqxY;cvE-l{sqw#1_Ly| z1pz&oZ{Z*WhYsB6)Q-;5x@y4sa4YxIkJ(-Pwrmid^d!*)|CItiTJc_d^>4n`eDClX z2^#{-`tc@^uJhk7ExZpl?UFP zZl0fG*2)LBGUl+A^uffn^!?*+NZe-|7-#1W7ujML;op`{FfTVI98uE3(21ET&SNx? zN*x^RTWkiFTH3);s^6?w+cd!rpmq{LNV>e7P*?(sa%*_BZ9CO@jAUn9w>~ErdLQjC zp}*VjS`xuS4f@T%wf`W8Wxw0ydz_Qm;BC50z6zkEDB{uDvFur2!pK0CWlCo9CU-9U$2UD78e=zO4I zwTg#JD05R@CufP1zBxn2rKPE#vGdqw2(s(@)axZ3tG{(-2nS{elj!qi2!*!gkT8{y z_*v;sPS@F(xV*rIw6C`paEn&F-iPqt!R%vm(u2@mg%StS0(^!#S%BY$8Fs-BWDM(b zn+7q4|KbckHBAe!P4`6zGc$zS3+Vs#;0ti$x?T502;adB;l;EY&E$&FoD#eDA^)hoaW)k+58(G-&j84hNEO|Ya)($5 z_IH9oW@mzdSnJi@2|H?#I02EikzKWty0PKIht#5%FwClss#k5RpgW-6(<7Rp;^5n6 zj_8o!k!tc^J;F-CEz+$dj^RG6KeFoVfEi*+o$=2eic1!b!o>b>{!UiM^s7gJaojk9 zXmE{6c0AzRnVRAv^(15Ql5vZUVYH^+hkyDCHpIhSNNhoG*e3`z)eKH~(082ypEC0< z=c*$`v%99P5F1Q_vB%~*$Hzed>dsk!ncY3CNwj&g7RC^_ZAEGt^{M0ybp(Fmd6j0i zoahA<)kgOYLAB=EI8RVdYT3ru7b&$@Zlr!fw>un_n(vrvpOiW2?43Utgz~WR@=Le$ zeF3E5$V2oepe=Zx9!g!cEhpyg;G=I_v)W?W3p>l5(0DjEl1*hbS<%McmiW+w4DDs(&u8alnxK zW1c14b7rMA(OMlCpKY)1vD5Nr98RpSx}W2re}N+Mg%G~<;G2Ad|0Ofy>=AeI-)<1<_NhnN zf4>!mvhRKzl=D-B+@IVRI%nlsbu~hI8X;Dda*I5nrw;0xz!RC)yq?qw^d{Y!4{B!6 zj@o|3i}}WGR}b~HU$Ex7{iOm+1Y*im}-x zKo2uXbiREIeRS4kP1gpewvchsK5zZh&&ZhZ|M!ce&yftH#fzjr z3l(02B&$M*->0$~=_680;fKxKoUK^rT2!ehMV#w3#TZ8d{O>5FSsLtiy%ug@ucSa) zBM7QDq{*I_RDwdE&+Q-qZ)Bh1R?^>m|0V1n<7-w}Xr)qcVWDQ;;s1TfqPVl7T&D-! zOLt~tTIK>%9FLecD`1OS;+MD}#MyU5W(e^ev1^TgMJe(A9*y6cf`_@73!4yeYMKo= z^6Mr>{;-IM7b|B6ny4WuLz7G9nZpAeC|bn&(Ds{kKZ2tv$sjh+P-%b+41U{Z(XTtO z#7h}T#2-M>XMF}kv*r4%h_}MeiZ;{n$f%^BsC`*$^KIGoo^UMmIS27dP~JF1k8_Z& zb<{0d9$rRb>Sv+*EEI=pP2;mu(p1&k9F~*o20c?BEid`A3M(Z05fp((fx8F{^NP`v zoHA89aMHB3(n)jJHz&>0YNL8fi*(tB{N)5-Yx*n26fGO?4WKE81x|4cOc#gy?EKA; z4CwmSB@y9Rv&x$;qDwaf3&R06_b|Bv2uZs>)6~}dLmIdRS>I9-v}I&BEVF4lGirml zVb=k=CP`xHHh3m#!yu)r^(ETMYFKWXTu-`3leR$~exb%LH5NPA&Svw_lK$lPI4b?Q zj|_j)Rs0nKOYKX$RrILh!0^=i2S&nv?Tc1`rEqDK|YeXyCV??r$jqSPtPn#bL#fk4a{Pxcca^y`xmgHvvW`3Wxkb?9mP zCZXk(c+R@|!pCD~R{WdxG&|=^_?s+4H9vl>Z5Jy5#9bA6lS>VkCtPNLSRBX*7}Bzi zL{)*yEh*cKk_y96-7Pej4k3F9rEEuW#ucsICO|#J$g1&m5AwWxx)N<;jRNY{o>3;# zbf+xq3erFihY8d~Zy>q-Gq7=m{nAvnBLreuH;PTsYz#wEAMt_`pd@x~?K{zp5sS{? z2jQwnl>OdIYENWmXK<}(NjG7doZ zyo{8(q<^WOckM${=LZ*A55?_UO*Xi?FC&!M2W2OkOG#pErV8)4|28R-Y|*)mR6@n5 z0Oui28)T4bEQii7>%1x71X&5u$aJ>f3i1?l(Qo&z+!~cYIDzt$U2O>nLCX{>p|J(AcIo`S@ow1pK_?3*HY;YR^hV(x znqUYZ2ODTqKTujZ>2AR8Aqh~^mEY^esU^b2($0;Vv6N!}r+h+(HUE)~SFc%PtgP~=~+vk%YC z+hf)tIcE+%RYpoLLXhme$>--mCkDychWIIXZ1pQp{HBWuf(mIgqa}0jT-81ROi}>GdEPP@(Cn#Xp0`Iw?%b)V&p*Y||C7)l_psqni6=pNbComY|4 zu2!T=(d+(JG#O0_F+Rvju~lX&*P&Ue7|qCIrk_D^nZDZm1kib#sL+-sM_MxW+y{?s zL@?Vx;dIs|X`H#0$2rm~^$5*d>*x-t_^_Nj-XeSN^!FF^^nY(Le;eJ*k8)03q&;e; zc?&;ko+|S?W!|5c?raWMujZb7s#Df;wwc0rV2ajvIA{2)SoZB-a#4?E&=mC1zKWPy0ZBf6h#3F%sAucTJe$6 zPC~1(O1%9XMy#KblIH*^mZ`JMMZu)G1bwdMH~HaBN-LRsaFGl%nl37S3M_8M4DeQO zGPwL+do4RVLnjcXp+G+>m9aJKO!*sA9H*|TZM!TkNS*OSva}(~)V8v=sA8k#f_VX1 zsT|rHl?2PXZvd=8R~&N&QO;>&ZBgU!e_c|F?R}$W+yU@y{YY_aGET)nJMfu4GW|Tz z3s{;!gW=Z6r|qjJFE;(~B?Y6qcV=W#XknCNuTz&qu=CEGFuIYHFv_ptSwYW$sJIS0 zNQwt$wk_$jqBbJ$fx=Q<4k0DZl)m-$O;`75z-bGrqNax{7S$%=1zS9*WO)-PFAvk% z>HWYHBZgVNnav7ty4lwvP;?Yit(^=4_9l9CrA{b+%2BnwE2MKL;pxp ztGvT0G0H$%k)imDA@h!j91DwC91+1RKmR^Y5fdWfSC;ikH%OmBkeDw!mf6;qvDS;RIgT7EDq zR!IFGV|H_@+TBJ5L97u_=4%`ftt#|KLrgINq1s>>+#GCxdjbnP`4yVfHyv`+a)nVY zRIm0It}zS4a3bS4tt{#eL(!1+@dc7u@Z-uLuRc^@%k0+gp6TJNz8%(4_1rTO+Zi@z zI5!kJ1w|~*h_W&|(1y*9(ov>4E7h6S%1v=ed*yRtmTM>IDJ43z|#rsS#mAzwE-(yDRKEDFQqCbG-W7^u0dIw7AZ|eakbPl!<6gwRr|s2g)S zbd`Y#F1s{4kH!aVd8?E+FYOB`_ENoMD2b#W>S3CWSq!Y#iSK@xvlvZ@XF7U(abu@z zW3FCJs9la~({*z9uH=M4d!{yj zhZ2`wCE)cSXt!;EYD*_siAxBw7?ROB*VW{V>d>RudU!DUF=7?) z;AU%WYBhI^2;UEFRaP@CJeiede34YT3eEsqm55=p5*q$s)mur=bc+PIp--H5B@e^V z3i(}(=YAWswHk=kUPK>l`R>fsH$PV+APC3$(=hyl65PaS3Ko3%-=jB*F()vI- zDivh!B``Qgw`_>#SX*`nz|_>k1lQd!R$JP)sHmzU3oGM2`?J(2qrOpHvSF?cvj*}Q z3EMNF+8Tn|^V7A~ks2mWS>tgWg(i;Cdax<9vW8L2B^LxDHms9Y7-VV?WU3I9RnY!K zpM{md?=uV$ATSi%!>lW4Z1kE{Y`EJ(e0*V1C@tl>ptpn0L>5I_Yllezk_8h9cq0PEXfGErr*rLkaZwV|>yAfjJy zG{2Dcsu1p zXE_%oG7_p$$l&KT>navQ9O%!Yr8tQ`91mz?K9-JJXlCv*tMu>%8FFow8;f3Fw5UXM zp$dJ!ZIAaKmf{)?udY6u@ruJY&ad+6$q$m-hpBVGubUTWou(X1a3!<^Ke&Cu>S4r! zSI&SChkuF~PtJ#^4r%yzlDW{|ZQ% zJLK7fFG}ZoeeJ3L)v^+mNKx)K$jiD~;u=b<6bkE%Hksk&lys`&^&N{W znjMcq|DLL_Yoas^a|)Xs+9ZD|+=i4_i1nXlzn&6Z;0|ymwApRS)|ic%F+(4o=FtZ`=?Y~s_LsduAwtiCSTLM7|^xVkM~5|HDH?A^NOCtxk57C?`) zn?YR$9X4c}Jxh2IgB+YF;4M9*q}6e&^2)93xQ>xNHChR0uxi4Po&^jU7L0s&9vpMmNdd zRN{3J^E^5Pn*#yX2V$(j1ZtuITBlZ_jz5LO$p^I*QS$8WduVg1p7e=IB83(A1B zhKC6QTV#utzow}#X=~KL;C0DcLWKnZXsU{|6ydS0fTbrgq~}=DpTzsw3g6v*(0wgx z^GkD(N-c;&G_9FMztInMU;rZj0MXWV-yBE#!ZClpneg8Ym`c0^Se7yQBH5Ac$ZFV4 zY%np~NnuA@g4=F0Y88i7+E@ySZfA2AfIVa+Wnn{>LS|Kzc7B)6lsZ3TFSj}D6;3WOtlHdW<|{`>4HRZz_}=e3??-;?3Lk4L1ZCce_1x;58<#8;)Y zbBwG}l}(lO>Ya=dBoMZyX}sx!_d}nVS{Ix=(PiimDu352B}3~qQm|3V6kq?V!_FxG zs8QccrlCSVdG5UIQv1?L)&m0Wge+&dkNBJNe~RYNe;$Suv}jjO?bwiLJ@wLpmV3v4 zPrfAT<$r69IQM?usJJc@`G0!@Nt|!v)w46AC_D0nf@S~ih^X5Wsf)ummH&Dv5yUUe zFv7~GjogLzf*v|F9H`p zsnkrTs<~%C|GKu;#$I{eVWHqX;?i=|Gj<36sppoz8vChlw${#Nkl=4f51l-s9o~BX zKWu*$#OCM-?6OUT4qlFmi^fr*>GHWnnR}f-d-N?n>(ODXyG}sfa`99OT;y+2&mzpm z1_(E8-3?4KpjKbaZd)13QfSi!ZZNipmrAY};Q&U}v|xx##9{n{nJQ+)rQ3;%Qf zlndTt&3@!#=lidF{_8>SFh1-YUpJH0D^yBXpxFwYhjoHQ$oAO*SFe%L?G;H9djga+?%~EwX^BJOH>XR+uSIauUh!PqKoyOrR z+*7CZ9?uK~MO4GM4{RhE4N5aO8!i{?vI!TPndQ(rV}*S%fsv{<-R#*Emq;($sbuyT z$KGSY(Du*Zj|DH?T`CIDzDMr9`~9u;z&XDi6L_}f4pR>)6;^XG-x7Dz#xc130!pDQhcM>7S595oKp*WQLMC6r* z@i-mV4v1FjkFk1>&k?)ru=UJMv={)=QUj{=1}%gs(a#*w#|o4*2M!>MMHZCMOQ64A zsCOSMevM)`s9l-1Zf$z~)OWux0hN>mi9qF+%;dheb!E)FO6H$v%ps*oLZ;LZr5!BAh-f<)KAP(&CI7*ZCcij zmSJZB>KTVNkBjTjb@GmyjNWgUS~@fWA_%JDnl7>+W|0UY4Od6+FwbW)&F!R0c6)f~ z*B0>Y3ldRbhP+QP>^;7-*J^)?upj}s})SVCHm7cT|y~c&X!yz=2yU^AYPD@PKICIY3br5~4B#!8xoc%i zXDsU|_hE!qd>|;X%p#XvCw3s=;A1e`Tdd|XY<~3NI1KAL85FU9;N0b7`*1N;Yhh5# zevSaBPZk2tI}C@i=aKk%9G?Jo6W=O+gG^ ziF|Lt4!NLhZ=IRjxgGjqxm>r<3r|e6BSPz z;tmZ>&k&Tx{3MN8otw>#e`k9Bt>TUUHh=f?Xo<6Y1S<(gm^BD9JA^@z&dP`#4MuXO zACf(H;pB})mJtEKizM#kzB9WK>)4(Da66g2YMgvqw|cLez3(=91ZZ4g;@60FSkIgv z@=JvgdQ7^)^A7|?G8RVqE^fVadW(Dz9|k4@Nl*^DCkp|AU071QDn?3!2X*V_%E2A< zCYEhULhj5EALKjk8vA&Ho`p>O@eu*Cv-77s6XY4ue&AolNpkk=;8;;v`t{(xt4wgr zVj04kf@X~>S8k0re3%l0YrxH#NJ>PEK>>=w>w@VEoDL0mH4~EfQuF$W6klj z`3zRqGGQ9zmvKc}8=kP{vJK(!+C-Q(EPCZD^wxW1mh;Y%%41)?NG4NPUG)t;vZ8=6 zH-LNbs8bN}6!mwcsD;X{-kYsnl6J-*Ic8KeMHgIH@di!E95k)mWY-QTSsD*PXL!8X zX+6Qd)TvUX{B}}%MNxcO)mn{REOBsAXH!LGb3}-gA?tB~%%$Mc=Tg%}8-0G>a4$z= zO_ra(d3Ic%;^Vg9^9oT~hPv;YKy;%r=5-fgf^R6WXCwaCMkXARNP5ROR@1#GK8f?c+0bBUkOyns@b^ z$xM1>PsQ*0*ED1J$O)F)s|{WDc`_cp!fi3ghydMwvx3BL0i1e-??!wc$uIr$pQB@^ z|3=5j_U#+sIELfN6^`B9iY7KGscoNP%)5!z5 z)p09kTuQ%{B-QO5Q(OBz{Hwd@tGtNvgWUNgP<>Fn4(q&~v z+f^n{A)gtZ=mlk02tenyN~&rr9oJ ztg2@Cv4|k@wM7u2I1y?Y=8L!+LF8+QAkw41A}T#49ExXmU86J@<*Q-jFXd7V&6U)Y zbL@{#uv0p&tN&PP9i7B~`VmBEaqSi@SoACQOBH!IZcgIgWLV{ zxe;nITs5%8-@nchfEKtr@2}(A0>vJqi=Ze7^n~a6S!A8w_qEGQDyxbGQLa(y$@DHN zWu)+EOSC?b$?GhGazrDoBdzYW*iiaUDq5=){!34Wr=i^+;U!NJwR#Z8;Ft1PsmR1KqjlZq$YqB>J`s=6T3cr-?Z) z$PpSv3Zi5jAJt_AnX@)7tVLna{`1BGZDxgAzo_XDv`j>gfF5a&S^q=Hr{nl(OKmHpM{PhuGRUylW@G>xbu+~ z7-@y5H#ee24eFhHek!}NE+I>}R1JlnUFZ-sYw!9B)IIVPcZ9w4erS$5yKERT&Nsn*q&cO6qx4hW^yULHw-I zO}aW}gRL@*VIT#8u)-2#G&$`Sl!Ct2 zV9$aV+d6H}x)1Tz$_8S>?_<0h{Jo;RjXTEa^916W=DMkblW;yA^(P~yPyXS=IT$Uq zH$YUiA6nA2vJ#W!9fQO&FnTF6v4W8tT}F{e^J;U4aIL?N z@%*5?G>Ls$sUkK_>&hEatEwI?mt#_I&gz2~snQ7}Rq7UIwE!#`Y@F%ZJGyGdxDrZ? zmePu{VTDjgsaBK?8`$SS%oP7x4UvG-NNZU!dfk*8qZXOlCxTW0gDpbSwRcj~o@JF% zS}7?JB4n_<%h^GCipYpa2vuMnJ+dQ9m>(fxK}4?ffd7NikImc;OFQrI^H8p6Ug6G% z!GplBB51)wfK$K<7}PfU<_A~eFrWcVSIT>1AG(8lbvzTiJFo~|!PM?>z=s}g%&qwUe-@8~#RGo~j1Ye3!g*DR?3R4_;;rlQf*znRtu zM^%M2G3MtKTm8@l*g>6xI%C}gW)l=R*5QXwc_Qn$NvoxmAB^r{2nw&Qjm4Ca^ZA4ymhCN99T|n{045?^;q6 zJh=JFB>^q!s;#Qf(5AI@N{}_(V>Lwvy>YC|3L1eX7-+%1f@ec^p$vbeil;|qbYp0O zyObX>+yFsB3ckLER(096H>It1=&B0n?b4PPkE)piTt$@H&8f!bI1coD6qPmHRk8FW zKG~9B&ShDt8QYN%{{8S}1j`ZOXRR}P^RS$J@5D zl7p@bt*NRpplY`Ua-^z5LkMQSc#WY^D`dlNmStA;R3=iTnD~>5&R8~u8G$ot)w+Mq zqm%FmGdRKsj-cQOk(CgLFbewYu&xA0yXnJD!Kx#gq%O(tHj6TAG$w|U>!?;6#sXzw z`=kH*p8z)j#N5=}iw_hB4z45l2S{o^QB{(6ta5$#$=Cp$$m>LYXV1N#^YyBwb=XI!2D2CWV zrt~R1mCK5vjIt1JNoVDn1gH9Sry~aAcYmuy#xUB7F={G(v5^ai@P2Ck!Xhkj7PvI( z?(+l`1!K%}_Kr!ldZ<))#(H72%)AEs4tsPnd#oj?`bR(gnEXoCBqYa%Wb?cCt->pX zxBoo}CM1{$FlwP6*5+FUuq1Yml!%NWY1K!4kC*(-rc8kQ%4E!(t{}_Jl^d58E~oy% zm>Zw?ZgH9po>r^*HXpGs-i_YojZcfGHb2$PyE=vNF=Z%<@W{g9{v+-WmO1KVNAihB zOlFRJm{L+)vWHWXT1IdHJ8d8{Ch(090nQ^6!dS)qP>1!EVy8AT1z@bsfO$MYl-b3% zSRt&PCO)R^WtNtSmuid)txV+S#xZReW)hQzOm2mjw9yq_w0uU#PP5X|E%{8rs++30 zm&O(>SruVE1{Rm&pryiqoG@MG!rek!|Cn-fw+$h?veBBV${OK~_UZ=dKDtkdtvs_G*|0&fhSFHCk~OJt0`Sx@%5U$k_mmj-Efl+`>2rbj9h zqTo{tzLlHOh)R)_7*t9NYmh`kkW~k?p~68>0!T)hxI*$EnayioX4l~ zyBvyM521D1IxrKq==$R=;yFdeEYRzYss`l?|{v|L*XY`lJxsv7Y@Cx|e+8KI&GCI7Bn@2^@Uwf*Nds{q{W- z{xn2n$tE=e%DU#xGgNe4prX&t@+(_0M3TES^jb)Oeuje$IFNP6x6z}j z3b^l_(Ck~LW|sHe_BY(onLatrvbvv?V^E{t25u7j)HuPe9mgL2AP@&RLR7MgE+TKL z>)-8Dd#P#(_b~--^5^ zHQQmyux;03XOIeF#7i>_c3(vYodTWEjs-`k{6Tux-3hD`YWJ~23U2P6m-00fm}J{^ zU!SP2-1n*;#}7S^&MU)CLNqL6BE7NSZ?}qtO{!BDCm5dEbAElvupqwD$>g!SJX$3d zhT}wcVA}sIl1Lxf=o2YGyaCrmrHMkrp!#hJ20EZGJ7!lCE9Yb|=IJX13SR_Sx*24yX+SY!tWk^3tnVWyHTT7v;yR4#9<(YJkpU+(ivC9j$O%BVe*85`oBsoaO(gY^eSPhzZx4?|oFhNJJ(C_^ zoKkJv#%Of;(LhR_N`Axu}TJx#|61|EKap}KBI2xfVsxa+v~2wr_w4$d!9ZGIT!PB=sdmg zqxUVkW^Kg0Y(6bWBeun$rBBM42=wSMk|Rs$8uw=!i4!xr*aW=#j#dU_VDhtTO$RtT zXb9eufDdD5JA`%G&lQ?%b)(j4klhA?4FMd2yTiMTYQU?fff^<$Yo{wWeX}r?IpT_O`&mj+KAuV+r$V;Nm}VVTCH$!bjkh|B^RekV zZ0yp6`~ zb&J@c8-bnb;%(oAuxi>YhTk8Ry2n_mtepREUfbkWhY2TeT#40+lI@=i(fJHTVKt66 z{oSVOfRYVzIqQmHGTD26tydMwV&||9nGvE*TgLutIMp;Q>xDKqtX3t*$p1QtBp15% z_Fa!A+CVxv<)z@1vkB{3otq77!_Pyb*fkWWal~Cl4eU;IdM7^-3;7WFfLTGXq+76W zhLa!TtpV=~m&8%1$a4oUJig1K5w%j|_C}(${G`+K-VTA^HQHzuPDV>C3S6dEpS&x# zlDHWP=Gf{LWZLs*NQ%P)%=8{Kf?Wowykbz+en}N*t21_4!46uk#U%O-*~MZp6yxt% zK%5{hBdy+83s8i#yZ(&TFw+%GFE23%7N&r5=Qs$q>#j%(h}1jTnr%CrP>yBQ)3efp!7v6_(dN5+}0B-6|$ zS4}!3Zkv+{Iqq$;@`76XNyPAfo3ECe`Rys}N!yMOUrL}(agflg(sG5@nnv^>g(6y* z!3v01g=f?rN&pKoLllfJbXb__l%G~M-Xcv-OkXt{k?Xy|6pA-X>3Sn&VXlbgoYm?N zA|Vy-GAh-}`n*&aH0?(_YWl_d;3w>d$Ob)QFGVn1&qdva0>z^~fu_1t-U|-Oz7Zr% z4R@Or_lig(OsdCu1FnjJpyQ)yU=a)~M9_u@8Nq#!-5r%~W$D=fQh+YFKuh65MzXlR zOFMP}hm7;qN-k|GO;gYqIZ0@-dlZGZ{c3Ri^!m3aIR~3svCXSzgRoG8l$kO#ML~*E zo$4G*3M`<9!G$?n*aQlxZ0!Qm@7Mo<-CF(Z{Qj<6x30A^=M4$Xg|4C{6NOj$Ed~X< zXyZwTNJriSDP&U#+=w+Ydr`@WQS)Vx^`%o=s+_Oue@@mZhpqA3f3sPDg}>HvpxIzf&tjyCaUpol2a`2SwX!Rz86 zPXxdY#hq?Jj3^ChcL-0h*4Cy*i%?*|*>xYP3mV;hA7Dz>3B)@o=%B-$t#rKRvZMPB4a_JPsF1n#2&k&8 zXTTs(9Vprr$7FDKf=@+4vGbuR&~=#wc6RmPxO1t#6$+mvERIX{t$$wqLDcpJoc3smm~In6%i zzBY*hHAHUkWGcQzjao9X7HD$#6+bMicn*eJQIU4yl_u7clETOyvH6q84?u0l zoCa?1$t-T@q%32=F2@SqmDmp!brlHd?o!AerlIvXVm< zYIIK!ByvcJ%DjUUIfEseMEgSA5JonFQ|<-M@M^jUP|}as^$d!cAs8gh=OOwsmx>DW z?rHdKW{aqGxVRofnG0L1q8Y#8#fK?+-zy^_uMrpS$rqI7@s&HV!n2%L3FzUw7b#RM zJ4~MpN#|h^+V~?t%RE4IU6I@* z<&c`<5ah7TP5vEGGVxoz5}H&hV1X`0r`%TOrj~_b$%aOxAc&<3Who$$8jMNaLKN=XP*u$Q`i-VlMD9ClJUo;8x#dhF&Kk!gjYl;V>{7Al=jTvZ@&9zH zn&5Tm4{Iwxw|VuA?i6tMZ{;KEGni%%u)mPtX50~F&%%(`=n_|4bP_&gA)(s&#b#FU z_Li@9b&s_^$%YK^9)Izuv7c=h>Nx&=f4QwGehF>NH#|gtebrotIL)Pf2=#&>Ekx0w zp{}U)xtNd%|D$@jJVY-2Qz;=@zTN7DGTjd=kn#^Z=`;^flV5n_a~SO?ml2M)NAJxV z7P<36&? z!Uph+s%2y~V#%O61uq7Y0IOAl)#F%Yll}ffG)WWsuk?9|4x?&QkU0KPaGi3%G0u6Y zsUt z$z`2FEv>N`oE=U@L=1_M94Dx5C4P%QCvI7IBrR`sM+j>`h2*CfOo~S8a1Osv@{z8{ z9;6OE>5V4IIJygyrceUCg{_x4K45OEnPy5)z8ZANUTZ72D|&1LU&j+fx#58naShKK zhFM)>@k}fRHoxY`>sI6W-F@XG;lWMNNMYU}+o#$PY_>^i5ubc1c}LG8@OqzY%ur^Q zG0i=m$a4Tg*{K%@W5x^mt|ZK_@RgfQ&`X^Ix@n=pbJyqX@mLc^^QFN36-R-~uudD5 zD`kX@f)oT6zU)j}P>x%Q$2L@&b}>&*UU6;LT+2|l$ZESG28*9^vFHY2snC*_+2}{GMk+fu>%;*a$@5k1c9MV6dk+dr1J=15bom>% z9u1-IZmbJk@nF;Tg(+N^#D$YMe`$i*&`|NiaoomR_$;{Hx zp@O^*iePEY<^0z-o_HBh9}y<$j9lRoZaMo_W>>W-;l0M<*U`<6LJHk1G48ot!#zP;yp>`61^eF+SV; z=(7tQS^>1&2)I?jq5Gg(eb3eLkiT`aKq$BSUgqzk0ZhyN?S3;CLRSlsJ*Ypcwt*Y# zKPaBIZ6Eg2Z`oKwH1+R0H_H)VmzaySgHHB{rbN?LX;pb^7R-7x{MysUCWgGq_YNgrR(;4Dhd>3XXK*#0v{#1_ z-6{L(+e7!=vmE!0+;^6zN3TiNTC@tou_-bn_@u;-e|t>(jfe%j zvTCmjh>g7%NACCk)oC%M5L}%+1&#Cd^FdDF=s$48&2B9991OoO=xr)~&a7wGX*r3q zRyVpwzHs=o#VnZ?h3TXQQc*CNeSur$RfS}tqdRflplTa>O{%3Ksc%Gpu8Xb>f}$wf z!qs1O3F6j1zvY#Hi8cdzxONYqEgGpo>)-`y%ox@n10+ zs=zO-T4n#o_N|PKtg@JAQ@~j&tCSY-to2Tam$EKklXT_0gYv235AKfA!a2Xv8fd@4NFB8D>>p0Vs^%kl6A7eHsG( zSh-01I+KJ&;tF9dr1|7ZZ2@6GE0t0`1@Qfm?w~6KGJ(kSi^b?2$8eWGSerxMrNa9p zAK#5IYA;cJ891gc36Hk=gxz%WS1*o?#o`G?gGq40TsrrPC0a!62XeM?vY93;c*A|e zSgWq4dh&~zVE?MzdvA{RJDz9oT-(a3^4z1?jnz?X2o;{k1-v)Wm?L;MoJU4dU@mn6 zI#*0m)HBDk7nfjPpPGT4Jb6MqyR+`84+I*V>RYhw)~-07GPU=jfA1xYNr01qVL-Jy z2v)Pc0o(FpUDV)c5GEs&K#&X%1HU!|fTqES(O@J;+;9l6KLqr(&0O)x6X2x&+d>rO zucoWp_By(=C*8WkuOpdxoONr{tivaj^)?_aP`kA|EUO>3 zNC0vmv;LF<>l1*4ti)nem8IrjaPi3Y@LN?^Cv--N> zM)HURS?a7Qs9&@qL9-^J)jTB0aKi|dmpkflmte^Vg`W8M_HX6x*{MrbRZw1ZN?Qhp z37y^|04C-H7kCoy>^i+PQtBnou4Dy6DLv&C&oxkY?kKv&owndWVAv8JxEuTa;!Ckz9b!rw53O2yM*yvDJjUk^_>Xz;KUT0OO{?!ys;Jx%zgZ)RK?m=N4ni(|IGI?xL8(qttKXP zG|edM8lQBNTKm%ahADy4LXNIDMESa}IMJbMd+$*h*$dnd2uhG?R`$~>ijb>NbS=}N z)w#^KIpw0h01au`wXsF0v%3;a<+R@oWU7k(B#}yVyA$t!2-Odh)9M;!!JsXAfi%_Q z8?XEcY9M+S`|5EoX0L?dceOoL1hF+ki`67|ZO+zU_b8zP=Gg zliM>-i-ZNLXQ0(UI9$AztD&6MYY($#Mb;3Iq={q@_VhN^X<4`lURvqo=k_C6=bCU5 zX|uucMlWqfHa403js*Z-WQBJUMJGb=Xqs$It5jnbQ7KqvILCl+r3>$-#asu>HlCX0 zJ$Xq1i4Ef7elNGm#P~-#UghD+w24is%!_8Y#->5cVPS6wB=Nh5ymngRI@^+URgy-) z+Nh&UqWTq%pJ#3HQj-@vS<)+1oYBWv9su-FftjqcREqj=U~c9u83#>RRs&mHg%w%K zrgG2R)oEDu7But?2%W*fmlD$yydCe>#VGU6vvGuJoBJ@9n!efqWGNGajh7yy(^Osl%u1S8N&n7QU#%T^S5#V1^QeA&@|<_79CI>u*) z2D`@DmEG+vE-$|VoDZSv>LIV=o6D}|Ef0&==1wD-l;8Azj4gBNPq%LJ)z}U%7Kf&z z&Q2(0Y3!ct_@pP18um34ojnr*Vs$_Pp@Ng6;d<7kwjJBz`>{j8*qd3!-om3YXV2oAtZiBYoECr4F`~$8E|axerR^~ zC&c(yi|olkuY`mAI|EhOry6q~o*jC!C7jF7nG?klXr;%Ga z>klK@&Bfl5CUa1CoC{`#OiY&MB@00qQ*uh?MF4d%Yl;ed2{KBf7r^U1ngUGrMBkjw z)gQ9o>`7_1sX$YWEOhTNJv>`+=1S4x439DrGTZaT=EUf((F48jbou9gRc1Quab~&V zj9nuFd~V5{5w>kPO#E5V2}i|>Oo(ncCeEAWkiB45?gK6CvMHPA8{H!P{Ghm}lVNBR zQr^rHH&tzEbPpG=zvFd%)-;NY;8nSyrN#`vr}6rk6qakAo_TmlR$Da=3cLQWID=CD ztbA}uRYkdIJ((gVl<{pKZ{@YPG8&hcn=b0? z3D8|r2;N159HB!|nKG1`l4KoNe_pRfq{N`~CW@8FNG*E#bMnFJ@-ttA7ko{Q=-y^tcU_wX>N$jWB8<~* ztu%7$rqm)E@wIPQBIWA^{sArkolAoUp6A*oC%(YR)KlIV$35G@;mf0=03sU`^XO{C z!rplcll0$G1Ih=DAF=iyrwnEhNH+N1BN$LsyN;FrK8@4L!s09<6Qjwv8-0jbvVB!h zm{ho8gPN!~2A7F?cqw`wiSlPr|oGq6JHw?z36#3NkqRrUOJEgYJl)>4)kmpu(pOK@SxIEQb z;KirKYw$92-K5)^KX6S&Qaz8f?Lhr2vOu@&j!PSa&svW)k8@>z9CH$$vHi>fl;T1uObrI&d3lAm-X3HKZ z*G=L@C_8-DT%4YHraI+Go4k`#1aB5tdJ?U=FPrrLdb|$kD#{|GI`ktz|L%&U?xCwU z7fD7NEmLS3V!6WH#W{W;Ip({<+Kft$$OMb!2t>IbyW4TX#dxjOKC@|FJ+1*g+KAg5 zD8LjaXFhdjyQqv6+6nYt0Q|#2OTaw8;cG#+_~x@Q>IKr zt`T;e2`*xdSW~gO)Z+^c<^q~Y8e?#eM&}PvOp59AGlo=S^rs?|Y>-(^!z=}vbzs2? z>=d6$5#BF%X9Ur%jeK6FhJMn}PO47W=Ik6bEo#~Bwk>bAgf9;nvOH|aJ0k`dv0cH- zfFb5&Eu9+^2+YXA^eiz|W<1K`@Ag&3VpQ=%q%5;%*Sb{O0$?_UYcuueg5CKl1S|+% zD&F;zbl577sDz=(TfyN!det5)(u$fu;QWtQGh#iu$5!fmLHpVh{I(iSP4M;Lr5D1x zY&q8JN-Ev@H@bqZuio9x<5mI|vPgORnwhT=7=Y0mN+->Bs62ou3a}`ye7}5s02WmE z(x)xRJZUW2wTr|7yfWA&xc982@+=;mc@}`?j7VA^DX!K{kH|J;8f(kjf%_MByroUr zs*^_T%!L~kOZLFWvSrxg1RVt7v)*98Qi)=9+#tK_}c}I{P8A6oxV7Cro-V63-#+ox=&uo%dH(U}Xu?VhA&0 zm07XIoLH|cIJ+^SsaQm%npraBbHVcsn5^ai<23Vt+6!4Az)0grONw%@aF*L%(y#;PUL zJDkMLS36VZ_C>K%B0`92kH+$8pG*PH>*_c4(T*2FwJNQ z*82R@Qt1Lu09lGqDrYSX@M{sh5PS4`et#Xl+tzWmJI4!ca6Eqp(p*r?_9Pz0X(@yW zSke2>c(o0V*KCm1gG_qpRi%?oNXz8j6fqfs68*sQx%ftF zy-)aKe6z9F5X9uYo@o8r7L?Q)!LC0QFinWzYF1Q>0|DbmFTQhK6JOV?uymnWhv{L|Siqt)U)b>i)h@)uBl6&aiVVv_mNp#s#i%Ybymltc(t z<_gHK(IRO@uw_^)9&~Dc7!*~&u~%#6d!R`eR&pjbC7(}tf4_P7fco!2@VjuXn^O70k6sJc4h^X= zOoZ-Fa>+Q~VEQH66yN*XmbcC2&uE6DS;JHwYX#dbz0=M>!;o}BkgCk}?8B0#}t;JO~^Kh2>uHQp(@18&ikI<}$zhjkyhhAxqo0 zXI_yKOtj6&Q4+O8uP;X@J@65?;W1#lsQK{eJ*u&ZE8VF9^Ao_Hj;ERsR)7@+lqiW> zqnP9N{=hiK+`0X!mw0RDwKtwCm#u&4zhz%U>b=tdUxi{)LC?7}*((5!gL(KwHx&d- zcA>;uft5!cT)C|Ud(*ELxG+}*>RMx4BEtN|tqr zDwH4J&|Dw;)IB%aaaSk^NHSo<7uH`;0=&KI8zZY-kxgOA66YvhiNDVNkfZ*2xti=k4vr;)3L~I zca&N#+~Z%N3*jxx`dn74!7w7+q4Z`wn!d*>m*&=jzKa{hDGR9+t1Ysl*<;nVw&IuJ zmOqB89)`Z^qi_~cI~g<5dY}Lgk!M&)`B>d|JO_=$_rea{hR7IO)Uv8J)ycr>*H-5D z!)`@nj8RZQ+GL{fKnYZ{dt#S+P&H$V#0);USIDqgAR_dguf0_Vr;>V|KwuMPavK`S zOyRn|fdBtahc^kSb;wvCXL9wd#6k==;K z@Ax!n|E#8tsheuwS;i+}&3#^=pdS*M%g!1p-4V7MnT zi@EPq2M~#es1iR1E05yqslgQ-tyn?$Vl`K*R}|otdFj{Y z{NeQ~omZGET+t)%+*^Jz@8MY8c+H2)%{$$gi+lM-_7kj=yEX2BP!-R z;oLq-_E2(_*En|eCX9^tAet2nUx8utExXND z2@nZRa?`e{Mz>?vs2(`iTM0wYRTZ6CS|6ZX-U{`f|b>8t4Ywxd(6sF{>qP@(VO9ne z&LhWrO!djVeE%n_@~?z{)YFI90_eP}NYDk_7133(*n;VIsX)0@`Nx4ik08dH8h9H+ zbXUJ|BG5B17}%Ii(7m!@8i7Vvdh`~b_iV7@<(4XxlU2|=G|mdJV4xdA;XZdM*l?b@ zc$SLyBgJ8{&n-9TKTs?)2ZcWXF{ZF}Nhg(8QLJoP^&(n!viFCH_*;hNn? zUd5J;b1Jtue;V1qa^j~pndc+{Syo5=nU&S14a^*;mc@sdIHd-c&2LrF>Z`gO>E3lH z%0wPQ%D(Qd`7ll-X2FTC6L*JN(2lL_3;iGP)cHL{ijw6XYWe;`gZ_SrzWSh7qOd}b zwlE13kg$ORM18pf;QNyjSEKlxCEnPYC07;&>v_!x45GA>&Lv3LxdLjz7%l=K72r`wtND6_e;R)(;L>#lcQB1ahi3a4jEU2mqaNj@KNaxcxdvrQigc#~CXC>c zf+OJ18O{r;R{1V&dk^`i@kbJ63rX)G9h7Z($#{-hGKOd+NmS&f66q>1Dod&ilv7fq zE5=Ab6I26bJ5ul@e_ue%&Sr$>M@o2IB!zfLJfx+{W!D&@Zb*A5y?TR&G!vscOk!xW zTYIKf--!~k4pIg*LurrUjpAF}D7B{4np;s`T%{f(BC3(|tA{p%2!A@gs=yDrnZa+Y z0B@{t0d*D;R@H3|(nLb3?PlA`wflgeoK#NSB+$SoQWVe%s~cM{c}`m>j4u?75BAq0 zpig4lv6zE85Pk~w7TNFkWi`1aeGyh{fAeG+_Bzu_uQN1M*Wvr>j){gE%i6w z%ItbV>j<%-uHUvb6@(U8Pocni4r0dKm*c4&60$~Pz^Y9i{t4VPmMob}{zKNED_%Zb zk!ZOX#WAZ(5=M9?f}lhMZvo+gN+-L}SQ$>ntC}4IG(=MD`~~8cCtx$+)p_ zdx3WSOhaDA{tbg)fc_0j-dxZ7+dPO`x(LszuL{y-9YysDMe-TiiYatxMHDdr4zdY( zKmfQIlrRM=2}8B7Kr5ncnKGxMcj%Bimrf4 zh{-o)7w{sN{6D&+|A_w$OMb=uAI((-TL*OIuin4^hTOm3PiyJ3V1~Xg%nXk;Ao$2Y z1M&@MKz#JzdjP(M6x(a_8^q7XZ+^rb(yv^OH4R5*2#?GVnz^Fr;UBz0)`l#=AuEyN zDGl)gR0|#QJ?ndO@=UFk zAndr_0hZ}u-gnPztaxM4aB=rAUQUo7J;xG#WV>aA7PErxO}^@>>g?KYV?KYEA;dep z`ofC|*)e=j50+~=UN>%BrFbUP7s(;3LZ3RIJmT9=xkS0ril5vY)!hH|%(3Uq%}f2> zNmK8vZl9HN*11L!bT5s@>Z&fg+5f&Fl9X%W(ubf&Dcw>{fO$7bR;$(I1`y57_8Q8d z!s1z$!YHX~3JH75OvY+j)zZo0Nd}i21A?@XY29d2aqH545?fGOx6sJZ-G#*QuOIMLK*BTUH;0QJL?yv?;UqRru(a34Msi~k4&MB``Z7& zhzLcv`wY$|Ax5kD76r7LA)4DbQ$(SoTm!S{j&hBMpu6y~^v;DQj-cTNt*ra}8$cIl zSDIO5L^%oti$vaktu#qqS|0v?%-e2llmD9<6<0p}(UoTX5-%`+^K*M){3HJ8GT5qv z)L8p*U;N4xV@g_}xIQ5O4A=qJCNlK*bWnzS(S5kYhPz`iL2FfRaJF$3g-ErE)`_}AdQ`M^R3sTDTQw1F~*I# zsCH%OsZqSwF-I*^Tl59fcwKNYa;j@$d@M=$q^O=uE;WhuoBr*fu+LT|L9o%?eB<24 zGS=Bk9^4IPjCH2=P$UlH$%waz&lAtJX_Md!4yZH1Ln>n(rKd5<1jtjZn?jq z1WCKm(xnI|=9cqKrGIkdZ=%8W>OObez4NiZ9T zSLv0?13mITGgi}QX%27sI20Cv(w?Xi&eQ5j?T0gJH-EL-IHhT|l?o_(4rSVeD2h;t z5e%H=WnctKdr}1Q3wnpIBT{r?$^b@^@KM?YJJ(e2U#6|I|wRz~AK{^y7`7 zS6U`*b5+~yT6MAdWgaiG%{3pdg6n-|Rpq@3^Q$`_SZehVUdtaC(3VvmWpC6~p{qeR z0qrEzom=OXr_1XcZ)L_xU6r#+RBJQYc9Fd*oc-zwekb{yFCn8~Vk)|*hQ%sXTl(8S zMRGx)(hkAQL#dU%(CFNylwX){v(+iTg5{J=fL8hbk#jGT{pJI*qHg=8fU0R&BC)*1 zMS!+W9~b+PGk$-OfCx84+BH+gC4XC!vj+{@Nf>w;7Vi4x41hb-r38USRWpjDxxb5p zTjIEBc?C%|HfIk=A_!(n9$q(4pWvdDFG?{gG!-KwGM8aRWjY9*Y+I=m&qs(O-@l=j zo;Ll@e-(2#Ain5p`}EDw+$1yarjzf}FQ0WX<4z0`jg(W9k0MnLJ&g27zMEMPQ8KUo zbR#Jcqjce$xvq4XT$zz0(2tc8x5_(b(5W2QulR}$Dt1JVfb?H&BBdYJF>$FX<{p4}wT@`(n za*Ir_{lFw4#HOb8?LTuz!YaE1(02p^EQ>8`$?jdEN)c9lTp7?>Nl^}r#mjeg^ zsENW!uSsidilyq6c?-~y?tCzi)|*iRM4M*&jo`m60ixz-56~Ghz@&1dQRe^%3n8K1 zay>Z+0M;kwJ(mPaStFel^@Tlx94k|{>a!%+Q9$p)Zh)|L|JJ#a|kYU@+{3`Cl< z$0lAAXl$uDTuVc@Ow#qWAim8ZQCrX)vsTA^b6uy`OqbeEtd$LxS19VbJX>Gble#@7 zbAyQ;1XjMU9xdRpFrzZM8L-DZ5NbRzcQgN$6!%DJSC#I?72vZ)mSwzG3yi{E4Lnc$ zO5%d=H_~8~-1&y;Vvk9~UlI2w35Q*+`B%hA=g~#udKE7;OUe!aasy63==QGuvL^4h z&O@{VK;V)o$hs5QgZcmfApaTe{}OsATp_9i!1x6plVV)%Td4|{*TffN&H;wJ!>6sy#i6F3^2O1SwYMgm z@~IToUx|n#gGo)lw1c?*A_B)-rL*T;P)6mHz2);BbJAxTwXq>)S8ePTS16(pY+@Ep zrT7>ls623OWkOYlDzv%OI!isX**cQ{g;mlalrULyl^k7bxGc<{;!(g z8$s1%lkJpMiImX}tgx(0_WKMuL@i;inj!Zf6x@_!p%Zk9Ik2^CN#&l=!Z-9NiZfpO zXWd6r2(+5Emf70?fU6yrfCz#X{Muf?-+M~=8M`9=B}4kQ_wt^)3O6Upga2GRWIUpo z>xxeMLko!rxi2z)z?pc}#Zia*|nKt6)WmChS~Q$m!(6{W)F z5BO9>x*_3g1W10zjqc`e(1S>HJHjIoApIDSUIfTYvlpSqOZ_V&^{WEkyM?LV<$bsP z-STD}&2AyFyJhozPHZmkbB2d}&q)Dp-bP-NmY!ka?Is$$~$H8&a^8NX`uq zs-Y6v(Zv+Tge7VoWs#^mq)aJa_IwJ?Z-5A36KE&lck(OshuUkP4Rs9pXUc;nl*q#x z_2tQt8=Enz_(s~EdB6|n%4@0>Isxkhij6^X8iRsK3v#>%Q-4}IGYTZ9&LGx-O_JIg{BU2=Ld*h)NmQhX!qhk;aB-kBh#)5#SvAI*4Y%ekd*_QEHtIi*u1qMEBi zw+GEWW)6x6MoXNf^T~M=GK$$pnOZ)JS)N^W7pmaMOA<^m~FMAG>Psrn#Mq5cTI^uRm zp4Jwq@l%^FGka$J_`qZUE`4(ojr)gshZ57r|ItdzkY9D-bQ8{GcZTY@$_BIr<+Sy3 zO~|gC7{>9HtDGDk`4J*5`BVtUY>Noo^5NNqDyo;Ow`7FHX2^`m%o?!3ax_o{B)HI^ zaBTY#X-WRDs&HCLIy6DTnmo$Iye=>WQp#pWYtF#9@p%8;?c>)6=?e!%eY`&Wm_1hH z8=j@CsE{scIT0X2Tyd0j`;jz`S#K$;e;2~vCaK1E@V^~O(_ayB(}qCd`Sp$ebY(5A zKoMfeors#Fr9C-TZI#Ltz~U~3F>l;|o0MLsek9nRFMgPz1RQr1s|I)_w*iRkO_TMY z{F%3d0_?yS9(|^>I=0|A#Yd8X?CW00;DfX;l`QWVbXX_ll6bv!Y$8kg%WeLPS%#qM^4Uo9<~UjT@g# zB@63Hg|gVYrXYxA5h78zkqQ343=CEOBg47tvM$bVUODU@#uz7^(=&8;uAJ%UDd`~E zl)6$dkM*5(PUGoojH*H;K z3R2FT$_-%(7#PCvJKFD&q+I6*$)ywtrsphQq2bM45Le&Z572Qcyet&xeti$<<3p`Q ztSqY~MPOoYT|>8)0uZD$gfwnXD(Res)c>7AVCeu3X8Uu$U6I1v3ZoyJK~@b+I-5pQ z&fD8v?t9=$o$XY7LkAPN%KURv} zF5T!|IWubBVWG(z-&DWXU|Pk$^{$r>lE+l!+d_vHf>tKD72B%fqWI`ns{GLhG^A4L zD@s9-NEJxNGG?)a<^m|2L=RMD(t)TxjqleQW`oOzI?dmUPRd1r!U5h#NtLr*K(CFz zco`Zh0U8}9VrVIMuiN7cOP`ZU<`5&Z`|A9bvq7+M*&H>KnM`HExg1DLq7sp~B(_0L zKR1XXNOgqShd?XErQ=4Kb8Y)i@ymVHFLcz^g1EMjba!oP_ZgvG#foJTQD&TW)=6d^ z!u#Dt+15((Wx5jT-%Mo3_(uTn@fhRUM)N6XZo|LNch*J*!BaOQWAqQLeGlBp)NS1<-@Eq0hFZ z3l@CDWbHF!3Sy06)mTpc2Fa+JO^d@2sMPxb)%mLrvN5pz4U$7Az0K?N<>#+E(4Yxk z6Q(`3iKOA{!BbJoB$h8aLesSg!dG_SrUvn)HS8z(==hU>+leAbN;(pdyN|Ip{@Mh+ zC${Pb-pkOWFi3LNei$&9xE7QaaP4z{dwRstF1s(Hq4Vmnz-}5v$fiSJ;t3GKKvqjI z5H|a)R1LePSbfyAZ8u;rjdgMgO@-oE82vVN6WS;`8jI@DR5ab6F~l{^WArDrsGzUL z8&%9Xm$9kKV(k5i9WTv%M3+<{mJq4_9j7U5hZ^oVH6+n%O(Q-OH(@}6rq<(0mj)G$ zwrT2tz_>xcvH-vw+eCj(<&kAuD|1w{rEJ9IJ)MskfQpMWKWGE%kKwP&fqE>?S-Ab_ei;a{Zvu7u7bu)jv# zM%7M)T$URPAWSE`7nU>4-iMs8dV|h|g8=x5@P>9ape3mDV1VvN4?q%X!LWtH_Y}>K zfd&GYGSx$uUN&7(cL-~6F*l{5_9}@Qwijm9A`Ra{6)2W=26wA5d6nw{HL2GQ6Rcn= zxH%j&Cvc^)x`I$auP_P?WLq06$^99ZQKe7KsZpqjC4R&P!z#17-Q$8Rv3E57Kec~Z zQaMhAt3YC}oxUrLcC(C4^B%F=B2F^cx&xPx;Ambku5$tSs*UD0fM9|b9ow)Km5s#j@2mLYUtN=!}-N8R{bvAZwG$4{!U7+kN2bD zzhIBQtYz)U@c_>v6+_OB90Dyl-p^W^-XG$54*!Yk?mrJgxIi|1lebl#eA_4MvwN6< zx)1YKevHgta=wDG_N96Ux)qt%5!Xg!NdLMCiJvd$qqS58^dC5Di8%5zywztGWcQ<+Zp#I(tF!;O zKApQX+<)BqAcij|gAU8K29ENpZ^;uWkY?=`Eb?4V2l|ABrRaHQ`rNMUYeWxY`ZfhwaR<}1wkko zM8Nfz`xS9{CA0Vp`dc`sFk2XwgbCc~iNY-L~4$Z}VZm9d0AnM(C@a z0xWFKwGD>S9rVPRcRAfL2FvsHi)_Kc7UGsi7*PJUlX#KQRAEV85RhcRz;%z_G~H=L z(iYK!q;~>a6S3Y&oiFMK(~!N0o-6rr7Md-cEf}o$mS4F(QTN(>o$3hybw%y1gx$JZ z_CsnuEQhcp2Qd5!wdQHJowNH$Vyr}ty}3l2L@K;(Z{mvE*g9+!>TGAVVch0v{XsW~ z5tY^rnO0H8C%RrsM;05mv9!KZu3|B`9V6~U#j``3jd0Ad_sf}n{-38X=bFQ6X|LR7 z;X@0@+s@{^?vv===&L+tso~j9iCgPu$TF?F_AHVQEKIE1({yzwTgg>EA7tfT-2+@md>u?%>zPF ztm|%UB3EX1nM3szXM2T$pVBrsL70+c(fUd|D%$^-TMe(+-uQlh)Yp5HR1o|Sj!I%e zbqW6g%^vfV=^NzFV~_XaC+Z&~LJM!zawxyMsi=cXrfcix^3lYFRP5{jGlaG*YSZMq zcsGt1DrkQ0Kkhkde8Jz=J`S2{f3w;7ykS)(Sp?mr0tRyOCj98mY+2QZ-v}X$QxH7= z(zHwodTRnjE8dW)>_r>XY(K56T$*R zB+qu&>=GtGkvKIN1Vi1ieFXgns9bnH%biX?OY{-$k{)KAEo0~N87m|gRxpr{`v9EJTh6y1PeA)DQ`BnkeTR>G8p|0O zEe&95qx{Ag;DZ;HU3{auUCNvFl!f{(tPdxK6Y?^%`Tk z>}Ar#&F2m?C0kvc<#yLfJd5#j2U;g?Hy?*gxj!)D7qD*`*aZh|XK@&D&#k-d1u};D_}ejP_0w9E6}9?;p*<3$T1NFL6FJgu|c+V8JXmv8$CRXzpb@t$U4Y?rgck(h z5~m=#Kd;PWc0wDocfjC#r^mYak65gW%-H{G4`}1UE3iWY!l&{0!Tl^xkG zuK}oTShA}hsM_T!{ty?6J?if22ILNJad*Szi@e_J_`FdE?_l#-^34MPGn-17LFS@l zuiIC8Kv6S=cg*U9^j+_~Wh{ObDHa9X@Oa!9givx(hS?~bR$|j@pQP76*>mHQsx26z zRm>Kki>os-76k;nA;-4%&?gA}f@7-fbPc4?z_$GYy4q?R-DbP6=L5)%?m&KDx&jZ! zc?9_RF0la4r$rbvm$@A>rOA0?vRhEB$lhs&U0Z2jewACtt1$Q{p?YSnuZy%e{>V+N zXwCR7H}LCPBYw$syhTgmM=tO?S|h&Y9P3&VUvd`Th>z^!{dmg`H?_HVgbi28=k3u= zA0tnM#~g;`S>L}_2q%rHaVJwmCLIjzkysRWSR3#5h!Cs;ivx(htO@8eyj->G5gj*|trw6vvJ zf<&O?xLS)L{|KE075-PHYihDKgQQU{igxr|HZa+Lo7a4iXXV_U$1OvnkhRlZXxF;f#>pJn0;Rw8`903r=NfJ7w4O#8`|%O|K%yi5 zd999ZRJjXG&Z`*c{efk67{2^8ly!@{GBo>ikaEu29=ij+aMYY0 zH9ZEo9-y)%n}4F0^u>`1!$4%`YrhOZy{c=*v9C;h7Be*^fv?#u9DHTu{jgo*kcB*$ zI{b*x#P(%+Pv${{4xN5ODXZAh)O4LE)wc^s&Qu5J&sH4a6S7=gX&KCL8e#_aT2LyF z8~+9#x|M+W@A{Ao;y9E8@?$ZH{iX~Q`UJTv3iUg5?8WgP;vs~H#ApWG2|F9JL^JO$ z-(O>SC`6+-)!gBU2jZYFyXb^dNd2P>i9Dd}b+B9uKoHw7%|_T3p_MP@>cM4O3N2mr zp{1)nx&(QH%#Eol>h*!f)U`0%yDn0Po#Qf^;3?NT@8=6BJ5?8EqB4f&y(@~#?CB%b za6zFuzZOSuMzF7?M?T*kjHToX5k{9Adm_mSd?ox$NTk*hlgPM&86z5thQ^qn71c-D z?l0s=f=5DCGzTR^9in*|yBSbZfP~_@av^rcl0WTvvEJCaq^E*M^ za}sRjlG^PIWn9B#61j&j4WIC8E=(vu@2G;Nnal0C{TFgYoD^Or1p&!2u&Y-5EhHp> zf&LQrzX|cdJ18up3L{IuiP8dQf99?ple%Pl41__?T{#98#UK<7>er)EajP5>cH_Wq zYk0pBILRpQ20@7>ZI$tr^7-sjyEP5G`fYRTW^s2v>J`WymxnOiuU13#JnY1M6@IW$pXl{ zdV)dBTVIiT^3H=<=o<~}AiX-XHvNeN({roSP!nD7(jm;PPK)Z1#-1=;$t622EM35X z?U8QHd()y(7s_6TP>@_iYN(Gy18Iw4jlgFvfdeMp$_hQ z*lcX|PY9%#Xlo*@k*E|cb7pEB_EujdQbeJ~J=$Tf2Y@_6Djy2lV?CAlz-h>)iAw4g z)V-yE=uGL}HVXGCvEj!i)(L}1hAcW2PZ(~B66rE9ntw*t)O=ykQAkw7;7B4*RuGy9 z$~YlCM3Q1vULIDdj!E2;A(g=@`k&UW zh--{^@>5(N16V-e1>udTO9?c~2x^?E9i&I3Q7|S`0rOhz{zN4ntihoO%1#7;3RZ*b zmWMQ0W%3KEYHKq?*m;BmXv<2a?qj4xlM)n74Lrw50It{xL=kcFBKjGs`{wB#LGFno z;S}H$;V3vIIAzjKbl1U#eGE_hl(`bqQS zJw{ORR|c(tC)iy?NHLG2U)Sv=Cae?@xyI5_TZk9cncBa(rEu1KHv%RDxpkJt%<(af^n8+&+t zUxTT6tb#DCA6SJsC<(u6T%6RZKOopbe!L=RlO0_V_GqvO89Cm}UhjPJc9+g`k~y$2MIBrV{s*%xNreDhWr*{J659IOQ5U zjwxfPV@&)v_>&|*eQfEBrDZ;`m~Y@Rr4Vr(#_}+!*c?0l1}n3#REz954!QAqQ!o%h zt_tr-{~qJ{8XZhn*=Nm}LC1aExsBOZ04R)LcUBm=ZvT&4Q3*|KPm6cB9WjqU-v#`V z$x)aZ&tD&=L|BXs(xPDP(K>nz%xFNMBC}9EOs;xmqhsxo;dTk8=m2n?bVaIZq{{DT z=7HIA=eIv`&8`p{WLKdQTJ`Zy2%?zpaO{28y|rdFV|d6>{Ci{X&EnEOq-3xPKtKA^ zX_5_e@xRALH0lpix&X>0aA4O^9jg32H0KIdRZq_uaIuS4cEOe!0AovA8(-f>x<^7| zAd$KT2W->^Z|bh|P)d%OxPzS8Y`FC|-M`+RhziZXz^C)P{JD=0(}95#!>RO}B=pSr zY@8gciRl}YNp{E%|M5&-M}t08zug?4|D(LTgi)^S?&)^z8N?OWDH+{f(bQgI`$>k; z<0LhCq1#Pt6I)(~t2t5+S(l%zVNT)#tx8dGh)ohN(n2e{9dG_iQu{tOqw{0@lx9@p z{G{L_xf&rv)o?6IPAyFQ>8^Imb8xU1I;Lvwwfl>;0GuD|Er{ZlrS%YyAZQazHsw@Q ztA=R&XF};~Cf(HxZ=>3FxQ@H6L1|aflYhmTP5?z$-g`n8L_XM(zQ_eN>51&AWSen$ za^uy;CDvRGC2`w0gQRNX+%CU9#>zbIhuN0)Q3V&%XpRCDh2OM zl3Sr*nT0#=y`;z?ae-s_XrPfQvVMVuu;Jzlc`YNR^awoaRi% zPXLuWJ9lx%Hw>99_px_Lb)RRN&+__^vqIM{GYEE zwLEa?_daI4v5xpKMea78u`#$j!R}x1e*=Le_cc4`^6RRuR?25w@qr^p=A^%Dz)pk4 zayH4H|*9L>p*WPam1Dd>$e14J%agN|GKhphD<{ z;2m_WGdhZQ1zo{r)(#l0cB_^yCs;#4+QC@bdEw5gl}ym3=UFyMfo1nM%hwhU+-qk3 zGp(ZEt@NZA+6_V7BA#npnSa-x{0|Ib8B9gD$R?u{Pc6KsB|3{y*B5ST2Qi^dt_kuhE!^_(N$?Zc_ z3r?DxbC>-xXfN|K?rq!E1DSE_sBmeVCF@8ltX*pbzMv&k-L~63qrb4I%E|ra?&3sp zB+ZM$$lpG>v(86tI(yBbUmV64d2>Nv1+-o2nrGn(2~OX8L8<@q$TT=pHZj-=nFeRE zLc?u@o~cyQhE8U7B@q_AXKeY(RQ3zL5%%7DbsA839WPc}MuS=t8@u^O^4PWz2`n9c zcZ{jrO}prh775{-YsW6+fY!Z{pU4MmNtj?w_U+RNounIMJ(;5jX%u8~9;mv|+7J%? zbIlAbOifO{;!csIeoA@IDl# zIpAD$S0XA7%ba==t_Y)*VHiB8UUe}jEby{TXki2+?NM_4KL%#clTNDMUK)P7(o%kV zEtbUPl;j)rY?w%ZAJjB+5>=vFi>g&OuLj_RbCC+=sT7L$vw9K0ovqH85mg!E1e_}2 z-BZZei&YK+B1XcnNP0rCy#k2C@o_|gV!S&bf)tWWaHy>YwGKO+No zpv(EWW|kqXYjW->!@5Q0Z?6lf;vHD@sIoJeeHv|RQ^N>7A@Vf3$n|bk!_i)b;;Nxp zPG?QMdWF4tZ-ZSIca9ps5F$JRF&PuT;9wzr;XjThM_*7SL()u(zoYk;R{?)veu!P# zd@=%~m5hRjm@mT(86D$&0XO{&-UpgWL4`z@^}9h}5IJ&1vouUN;aXbE^A=MZ7mfv5 zDu1D54_$Tu)M)PSm)l}M!D*>J2XP(84}n0EJfx(Nv=@-KKoZ=0d_fhZZHi%|9E!D! z3z9gonEj%)G|WhF!KE1*P&oj}eJC7f^@l$dNtnE{qUNlH#E+4TtvJ?V-(U18obJbz z5_cKxNbjb`(ZI>2YD~=J$-kjhobGc?33rcyN~&r5CaR@QT5I0wXxms`!=`=E5()V@ z7PlKB)i@fqN6$-!ILpznC;|8i$ z>U<4w1;b|Ek(W;jeMX9*HK{e0qobV6VUjaC8`$GFF}bC!fCnv%>(u>La+>eXKr&S= z6m~pbjg5wpFRGB~*;apWiSGNjS*6n=`}JK4v$Xv?(K8gP2&WQSOInqg5RDP@dR(6UDa`$kD3s9 z%)ECe<;^F1h6*|u(!C0Fk6hJ2h?>@=cBZ(lkq>~@4$?z83x9UGQh+R6#GP5M$zW~i zDJ7o@N!G}WJzcLq@H!0;w550O)R%b=IA7>3g3MzObYL0!T~r~!NhFYX6o`<<3B(*v zYAz?mtiaQJR$xT{)wpy|1(j_QvJBe_LY)&G>YOlYd^0>PF5>L&JTx=kx~9+N_sSf~ z``X-Mi`zyw=1q=5o0ND877Uu_Yn$0+(kc$8zdJ|VSD6+~=(vzeIh{(NqZ_m zQ`1!EmufkqAM{z}o?uybZ+F;Sb4=taeJh(FOh`+G1zDt&IErtQ&e>Hy4g9IYVg@eT zq8^l;EIjpS%JMX%&~{=!q*8{{(pA&!h^|t>*Hpxcbrn9)GQiZb&6AQzq%-+G5+Vhy z8?Vg<=y;Vx;$g$0Nu9Ngh?!Q5`lh&npOK8}aE`Bm5N zmYu>)Vk;%b6}8zK~* z@M#?1@`DFH!knlXv1P z&*2-cFvW|rD%s~+MKfJd7KOY#n9mQlFN^j?8V=fA&oINNYD!*rwb4v=Il7q)Smr$p zv~BJ|L)$lK_1ZAeO}#wvP2+$df!eVLVw*Z9g(gSKR`tK?Xxz@@ng@p;R3*(@eB2SP zNA;l5YoGD;QAMf$xgmj_bWDG?FgQtw1Vsm#7G~W{?x6M=uJW;uBa*W!ZUr({sdoV zPngrJHv4?mJf9d~Fo33BP`}%uEyLr4J!p7%pW2Vw9r4y9#U_qa?Jro$y6Q&>=# zrnTQ6y~x!4>x0%dLTYIA^47w@Xty-(^r-oIx9t3^(8gFy&`U+XQDI##J*NS~dT?&GJz5v?3>w_j8v!}3 z&D;FPK$ZR!DJs*I)~fC#bNKaoVtUKlK{T1=~t=^^7P29z;2d0NGs|KOp^ zUwL^m+xb;_yyEtGbx^vMztJ%J)^FN+;r){XjJ05cBdI8>9R_6J*9IN5&Bx?uP4TOa z9|xFtP^3~JG`jn^(z>YI_)&3QmEZnNYBA#e_1Q8`e2Y zA_9(Fj2hj<{E7KoptuI5^HH4M8v2Oz+9{bq`1va^9KBzo?;7aVNjCoAAY65owkIB_ znk_x~0U`&l^iF0oAt$nlUM&gNZgBCKxMpfV^Og7J?@?UD+{MbTxGPX8ERf$ziA-l5 z{mQ*!d;}~?%S4gsb`$bM*-9pj-w@1^VO~-PJ!NLrZUh%$`D{muycqGiP~^bUgRGvO z`+bunAlE&Cfk#s6;_4#|-Wxf$26LXH^(=upw?x@v_;BY+^Hcp5@$Pc2aVN9{{B=#q0nRVfopf*p`%ogB5~ zYxh%E!Uw>lxx!vb0~|8a^xccFe04M!M)@KM+Y@@fd!@W3y-vJvF#uAX~6rJ!xFbDa1AuFAD~mS94}EktoG=(XL37NGOXn!@@6~8 zN7=>1iP}+MqM)k|B|X#kz2EWdv4VUb1MG-`>@RqBUR9nu4le$yY`25#Cup@6o?I$M zY)ty4exUPFgM*>JQb%qK&{rtP+xMa=41MKa&2l~EgW4LI%Y2U(5q@d9EIx$@0NQh) zygDu-G|0A^bJ=E~QRj%_QqMJlje3M0IRRm%2wg$q8pg^&2(dB)Lv;p|4>sUC*YrM| zgxtEzGYOf_D zn|O-pg$pb}4%?jB06Dbjuqc7D=UkiMg2LvFc7K~Ws6{LCTjmM{gQ!i^+-=nno!dk2 z$Ulg2vSt`}C>@+H%mu(De;) zZ7cxTVG(cV-SRs``TlNP=LXjwNaza)Etr!wmn-P@Jikx)$#S@%31J5o$0?-6y*UBT zQDw|#eTMOOo6Z7WA-w=WH+!2BOq6jl_^6ad6e^ZldD{*9FBsD4*YALD;~$u}BstASVMHi6c8pXzp>!9FcW$upwm>tjkpY-LZc z07gK$zx1zC^2;4Q+Y5T-KBcX>DK0Emj%hV5cJ1IzKz$;hLY8FS&Id2atuaipv(A33 z`nAlo{|~gss1F64j})j-qvc7;Gnl+oZu@ zoOc~a&ubaV%b(2piaThp+B&GY-<9vfnpERVo#qr-81*+(URmmt2r1S)g$fIKfsPHv zb%Iu&VO0*S$cAOy(h1_*@s>&j7%iDtAFQ+@f$_)29Sv(-{RAg3_I~{Mp;lb%vB;I} zbV@vj8Exkw&h;4ig`z*hVqryOKfmkHX^w?;i(}_%%_};k3jam*pmTL?AyATie&y~* zubfK^vPF;#7fP1k;wI9KfcDlKVHwJ9vG5&os}=bRhXb^!!NU~>OKV`~UqYPeZ!XlE zq7yde8qHG!O_X!h*1-BtbJ}arLJR@Jt7);Idv5HOIw|j8 zI#ZCt91A9H5M&J2o1nNk3|Sa3lpj0i+fGuF2efV1gmc5BJ2=AF+u?e09`2x|PmhR^ zO&=^%KCwJjFaj{QGM1Z&^7oK)^MX9em7Mwp_+x9Xx7pQfPibo?ngco|(&1@r)aGzh z>NS_?ayFVwrMKU$D@~)T&-lOoHBhj|L+5EU-RV*{R~^V zc|O39IVS2~SJ$bnogjar$i3c7V8B#IaSJ%1?Q$ziYhb6D-Yv~z+-B8j<{9I?%ywjB z>2M9{h~z>7#XK|<(A1zPTY}G-fJ{{_%PX)uKIccg0u-|?*OSh|u80((eyV1i{|r<^ zinlgeIMoe0v%o?JtBTY$o|hiFU*7lj8_u=1!e*s~Fa?9+mFVO* zxSIMjeaDJpR(u{h)Z)R?|CJbRzWy>Wec0%Lh?N{$s&3sOEw^TlTDsW|mMVk@{5+8q zs?~XOX6TJbuKf+&*Z*>%SB7?MD2rI;qS4l`rhx<3#_nf zy)nw-+o<94fKaiLLW!x#$p74GX?<5Pjv0nK(de7;)ON#L&D&$BXieWpWt&CoZgQ7U z!<1NdrK1OxZvOQxef}RdJgskUc*@IriwL^?uqH-B@`^?nbFuWUNXmh#{FSd{9a`Vlfx!D4h>5m zBo9yTuWZ(T`Jq9J%33c%JQvleuj`(Gg~Fj|OKYxUb-P~_6T5vEPP@cIi%s61LyPRJ z+_eKqOA>+QNp!;~ib7X|t_ocRinbJ@BT00nA^tG>&Y7CIDs*MMt2~-QUpR_?3LjiK zmBP=lj;;>f6pS^__a1w1wn|6_Yd+{U>_O95IEvdprjEV{H8fy8di0TJ(Igidj3p)w zpEJb%eL07fj%kqz9g(=-&;#B%U37t~8#Mh^BXt4BoRO6W6BiX)jd&Alve3=!D*2_UK3w(xdgo6~WElP@mHlL1gCU4~ahCpJ zy;voJcz~IX6>NWp;9>KE`ZRqz!q!&*v93cw2mFGdbuZoa)J7@UaUlmBa=H%>N6Cz! z^SvjF*(#wywgzRn7SuxHDpQd#s& z?}W{`FdUXBjLcK@0EPAUZYxJ&fZZs(&px4(;CC~GkO5TC2V|UCYKpbxI%XPZ^h{ z4Dy7jNgO~TF!_XGD7Ve%^~Em_y$MuUNY1owFP%)5$>jJFl+hB8Z_KVlP7o~o_+*dSQJFGQ_(BCW zw&U9x!l=EpgnlrdSAv|LC^{{h0U4Mp%sEn=`aVFcn$x5aXcOmxpv7}ho`A%YL-Liv z>>p3n$N4V^?zO9z+Dx8T#waFjGhdPqO{prT?ofw{5bM_))gpf=z`o@EqipE;dh9&M zWn8*jmiJC;v7nvm6XTA}l|Lb&6>FiFEzW=6f5V-Ri3vyxZ`p-*&n#yJ6(KHJoV+^n zJHyoy_e;%H;(_*vYNE^>w4M-~BHpCzsr99_LL)tqR!&dB99Cm**ej>WEa9KW9ESq7M-_|71g*0}CbM}-owe(*SRGzXS4-XnhmttD zB~$W9a`!StI!x-gOPOL|-7(#&@l1;h2K3)AjYP5}kcX)0bplR&FL{QV_5%4umivX= zee2ZQ9lnl}qPs{P0w(XBH0j|)GLvZc3j*uqo$PmUB1l2B2f|i;7N-Wq&glu5&={|c z+_98JbkeS%0Q#1m33-gO&U$MrB%l0jpx3EKgNc{S6bs{Ft=Fm-8^i~-s5xT2M}u$p zO&_m})&iq_$t4&GMXU{-4fUD$hggL$`f#bRT z09RryOH>2xA;g?iq`K}u$3v#fZ-#Yu_3;b?pd>3N6lmS1n8j8N=7ztUPKMQWb^PuG z;u7WA-CQx$SLTP*_Sv%xjV`<1{;_F~^}Ge>2ygNA0;4#@XICG(tYrUX-Pl3$T7%@Pq15tl25Aqnr1-fpVE?Fi;B}4;ZwqN%3;$A=MJGa z**yF6V=f*4;C0$8Y2nq%7G%4pIqhVmybM63`0#y-HDX=g5dcSUD_1Bw0}Ct|U5IP6 z5uhjdZL)=t5$&520Buw!fPzv`PWvsF+{;++GaG{-Ji1kMxWNmk9aDSJK&oLHHfZbq z926Vl#*7)`YvI~Uui0Z+?!z2G>gpZ8)e;I52BO$y56X*a=~q7(upjUGaA7bDaYwo7 z))V(z%kf%W1}%$~+a*#T>cw2_#)_7nNOGiWj=~MMHAfG3i1)-&qFIYY{%D8~j~DfA zJL=k2l-ee;wvMzF<0sF_wx<>GpaM?sFr;tflZmHZD_3~lQwiVLY>C5_g337=@ixT# z>x7335uHzOj>+dHnJ)W;-I>c#TMiU$m(PXC@B6X1m7pu#b!C5Sc2#06A@&`im~MI{-= zm@Hr;TWmUVf?)v&qzk^ZA4;_e-J%yncZjiAu0Wd_rF7pPQ?f=Mx`)13&VDVKCW{$0 zSAacuWX?zNC_OXY=iHU|RHQ0Y0s=U&m~i zJu(k=YJ93;1Y@K>pu%y2{IFw^;QTacrZO2equ?TS=PFx%5P3jq6-=Nd9vXV4B5Gjr zALJ-BJF+}|XBj@+#XNX69#zbaClm&X5EM0< z@UaX%I6>K8{0;pA9fihA6!*M=@EZznF1`0~f(DRsF{zn5D}X*tqY2W#ELm~0l&T1* z^)u3M1HQG|Q+*786lS1Pz@>92%9(UDmLh=}$%o{F(o=|jDEIKAA(AG96{GN={(k}+ zoOcHlblG`cy8}wbYxrk`=eHjJS++xHknMtk0PvozJk4kXI2>CMG$w0v5D8?d5F-q~ zbqQ8+FVA@fcwatpZZ0uYu||H;q8eFH|EtvUT2S|;Lm;Q)mpCs`XZNtwnrmmFUBr0X>L$Z(gz{l{+?_7!cK(JF8xqE$K_0 z8571qdtM{`mroCW%Wr`AbROiRFINE4A1D?ZD#o zq@ra;8De}GExb2~TA-JSJUkc6A?*n!a>PVsY5K|{EEY1$o@#|wXLY{WB~!A{b}~;^ zl8^x~;Ynqjopu^tOp$|j5y=RHAYsuUr@un~h((;BcohPnXMDLze+VOLFAKvL%$!LD*hHq-!(qBX`7*$%)EbrOfo)w>4_51%orno0A zGJ;W)Fsz7aNS6WOQ*{RP=@7C!3=W=_*R^9bZgqod99Wc+o-BB~YhFwi5VoP5n7W0p%i5saxCxX$>2tk@adG$TQ zJc{|yp33$8)V${Y{Q?J4S+?uRMQTF@H>cpWvNjZ4Bcr88RFo!^t%d8G-d%U@s`EDK z;X@JvLqZD#;8Q}ZAKZIsgQSGi7W8S(|D=Z_0Bj z156_0x%R8##?~3r<~p7`*vNYhBrgyMR&c~y>7Ij7XEoRB!cbeOYzE6PeV?2b{_Z+2 ziLja~fT|8kYt69Y)lCn?%?e8l!eOp$Y1s#KXnrHT;$ij8X)c4|#qpptpv91pQ?@HS zoPu-b#&#f>CH$nR1lbP6o(Z0X4@}p7-KR8+*p6+^K7M}>sHgAiak}^|Byx=ZuC5!l zZkTj1!c9DxCyx88Vh!0zm!Jq{cLS-LkLaD>%3w&hw96!$UO+d63m)dc?u~CSC7r3LU#a{*kG!Yn|n2r8_ z)DuMqWP{^LVcpHqB6)ioRJ;3&C9`Kga{aL3S4(l&)hnQRyly$>9~@JOu&}Zz!2D?7 z!w>Qlls?B?36p?XVHD>(;wfpbxqjt?tK?3nWZBl;;aMo)kzap`&SFB3l9z^iqhqhz zoBvk(Mbwbc0x0EuBlP!VoPsv?vRx6b{_7hw?&>d|0Xq{b&em1`ALc3Yn^(U+4_{8o z7OkWiJ$x+bcnM}20q1Qr%-qB+k%krQK&tVqoExgpZqWOFzM{ktZ)6gmcl^iBOM{dA z6yJGiURal94RHB?ast8Qx7w1}>}h|95k9=KrInrhfR=i1)%TXaEun+U3lJOQ{1Oy3n@HXxe9UUPalQiWz~$ zHLCODR);}p?Kp_LPe)CcSj6aCZXT^_I#IIkJD3 zzaRJ~oA_I}J9aLM$=KjdLIxl=(^>Tv(#mrrms~}u>=c*iJW>_TWGsj-<`Y3$%SR+rR9BZBEGv7}!5+19S_(YC03+|IJUkF%|{)>QIf(?Nm4Y#rC})l4X1KimlDM zE~~T0n1@me0kYv9W5-0yM|1&b0JDUjCZ1*KnapJFxyq?)<+>^FSxsd%O~QS#()^0L zmpokj+?3*YJZhSv@Vel5(P56zq=TpEul~nq*Aw&Aw|}{^3H*rIGKI0equLN3EaJv< z=$f4O?XU~k>51HT&4PH2u&pEA(D7qECDF^c##Qm3r<85X95sM9%~`#0^zIW+2K)X> zgW^9clnOwB268h#UU`wqwfAf}6UFYgl=tuOT76bpgKaYM5-oNQ_Zj1RXTO#R+*xf* z&ZuXryQ|KXTLQK9Y{XyqPkosgFpCrnXi#9m`3@|w+38Gy)NQtv>ZUFxid6DdhcP|q z{6r@yAFcXKsnV)w#b=SOI&6x&E6B~f3L6DS!6{=D6-*?JYAi7hQ^YjWJkDwePKeA% zU!AK_EPus*iZ{OVh>!iI!si{|@gET%qMLkkRBKM%zHiZ-5X6f0;U?}w^-Tz3&AMy? z*UK=PESIJMg#Jq@aW$4)Vm*=1O@`c@)0R?*_3tXCR^UKgXB&K72;siJGyD|>T6KQK z+R~*xW3$n1JWvA*CzBdt@9IEubMn6j58471>-Htm4dnBq&k1`V@ubn8)cjfhCODDp zX(n3=f?Boq+w$8!?crTboo_Y>y$9q{#BTo7hn+B<6b|cDp`mo*hfnkU zIX&uMDgGX*<*965W}#o1E8G~h9)Z%Wn5aA0SlqUo5Q<--2hJzl7YAN_@u~XSp}-P^ zJxQ4Cdv6sNRkaZ4oi-9K+0k;i1U?UPK)?SVz@JLstXq9F^BxDk_r68(Eql|aPMmc= z-0%2c8Rj20OG>>qHG-kH)`5PEUr=hs_w!s$T8$PkePLIwlIEY>LCG#D_&T?0O8y52 zDm;A0I?_JV&d!=ATNOOUs^ZI$xSyhcuahc|206@ufv{?h(n^7J-s~-lLGXb>#|yPw z{*C=nh|JnU%VT)iGJ7smddKZz!SxDNh~9IAO~??PrPb?F^{_y+#<7%XJ*E>g>%9MU z7}2Htcx^|0R(`bJ&qtg{7G_vos^Z1UG8CK%8(X9DCV1^psrG(kslj1(jME`DY^{!g z-l8j~*!(c*3H@S^T17wDSa`|X;g*>Xi5ju=)&>96`L}|bDg3Qs0_nZ;bNhuznV){< ztF{GhVNw=|2G>J!w=O^US&mnq#zNjrch*;2ym&p{1suG9t6MK_#!Hj637sj+LoTy2 z{YIEK(Y|cv+@%<-*bypG9m6pZT(9jrgtKy2SkN~oM1zOc>=vMyL%EGx_ZbCi>y>m% z6NAc92#1UIa&d4DdradS!z)LtBW}{%s2N)j7aaJp9A@3ZJ5o~UV^r|B@CT_=5VSY# zR+E0;P_JwNzOM-lnKKcTfpW0rffpKOQ@GJrhWy+*j$uD^F|{^tIn(;N?g^c_dV{TO zD0$24ZHjrNHWwX~q!l8nb|rMF7Us(h^XO6d5PpGMK0tmb7?F_IS!xN2%are$)GjB< zS+z_ST-Ibq;`-NmGlB`kOZSxSjiFzfjVNskN|cf=hz6$0)&j{&eKC5IPD=NYQ&nkO zn2Gs4_U7M1&ohO|$U?R(EdwM4h)G`lmWZVA3)B*sH>~q0!7XrRd;Z{EY5ijAnq~iM zBt~af3JHCr`_(s(MctlOr^g>Inq&MJ-~f^5 zwMjRs_hs9D`I~>;w`JDduLTmYtGa@{EvvwbTcGAN+s!Rm4NWpJr3g$t%l<`D3&@hO zPCT4&f2MgbNrjAHvXrF{8?80^!u+Cfu!l+Fj9-?XeF&>&V$@>-^Fsn<#m=UfndOs| zX!<+lt8?!x<7YaqW4dx3pWExyxaGG@$qwS?PquY~x(1i;%(o@bS?Q@?fcVJD;Y!4K z;+kjmzno|`qf6nfZTX~UlN|k%_)jTZT2TIR6m$J5!_cFS(AO^609*r<%xm|{mUb2w zDyjOy9aa{SezZai1U2bW{1NL*rMtCQA_cfmN(F!?e=HuR)%)PHD@OF(7ls!{;m8ZM zJ6&)fzmeJXwyxBCH!q%_8wNqEzk*?CwHU^V2`agGxLZL3K=+4A^IeUb5^f7|cZ0ea@$LsAViy-Qi_UXFika> zZ|E4JFAGgM>7Wbuh!LzML=e!Ds7iK2RIU#ldYuRm{h`F{sjx}32_)27Jeg0Z(p@Plrf3Za z1V`{If#k1Z-{5|W5-D`+{L>cNK9Rt+l@O(r8egabu`acptc(^w0wv<17ESq7Tqzu3 zE3R%qAC8aenOL+V$v=9pWH0>^9H413qhOv5J{I9iKS(@Zew?ux@-|Y_n;AL5DAC5w z6fixs9XP6UlRRs2UvuN#5;a`7#1sfX;cOa2ev*NqgWND-3^L$-Ljp^^vY%fKz$t^v z3}|`CwC+p-?;3q~Mc1Y^F?E+Ey5O-hbPie`a>w~mGw6HP1L9oBd0;DSRIG?!zEv!; zFTBouCIu`P<4Nmuaqo_C$;=9o_^!AA%Px`bV21Q(-;Et?-+F1#zufhSO$*2K2i#bV ziK?!axr>~&x39Ql>t5LMBNM|OS0l40U&`~4yS&`OshR(5%XgMKxg`Cqrkf57vlSm+ zH84Yhe`^AmX~BE2-_r7HsVJa#)s*W&IljX9N#WvbWKSZj?N;{0iZjJWch+?R!IhFO zM~I@aRm!b|hzhBGnh4pv8}{rsEiuH5Ub(ghYkScX8a+CE;Ty*N>4|m2oXmP`vsr}c zI_dqS{ae#+LPf#;Dp)hVr}u%cnQyX=LX^yY!=edt(wNxQos=OiN19AgzVKxq1DmC^ zQT`MeQX7{}RyK9yZS#BkL%Iko8Ao}wwPPq4T%qKAAc=O4fZR^vkc_gf7*DX#v;|zu zOYXoLQB+17lx=69G;4i!85RtPTWuVr0F-X)z0_I8&J=2>L4y10l5wv}?0GyZ_v%69KTW%eNHxl7LKKWJS6!YGc7u%j`_z+7_N)0fQH58W@k#OT+Up_SI zP$OdCwn3V#sH)Prx5qDR-xTp$e6HiPe6H#Bobph3uygGBVI<6mm?WHcC`useJC|B9}JlXHrVZ6NI8 z^%}=Z-ze@_hkeo+`KQ5#T?r#vUEV5{f0x`Z-!+)qD0E?=LoNX?0arxNg%(bDaYbAq zDaWeqxo`FWK_J&M={?G$$XF#v-T0cFf;W}8lcSCWGuWjO>|%?FYckDSyC&6t+c)bbtX(m?8nj2$_kyO z6M>m=ayr716C1@q*)`sup!G5S156(?q?}tMt1$U`!v@rJWyd-^rfngDbr5ug6j5tz zLbNe73U!&GBx>SX?^C7^(GyZOn?z32tL)aIcU*JKvG4#$2&e&`#<})FSiLfjc{d!+ zzDO9Ck}`dFK-q5SRWZUuHmk_8)ZO6>4AzyS4*l#Q`GFCuVq6-T=+#VDk6SRO<-{d!sEt=}9V!OYDu_i(n0WIZEnda7_+$~6liC(z%(tmX zA~lvJhsnzLL^`mGSIVcpj2`Up=v3!DGr_!ItJ(D{Mqma8f4>k9RxK$DZC5HzFH{D0 zu2Huqpn<(3B{)6+YA0=y5b8znoXc3Uj{Y@+^TGu?!@?ULsZcF_GzaBK*Ec|n1kH1v z#?iKY7}Ed^4{V2V6OA?!rY6?5PLziBOaQrSuC%(jl{#xWl_5NivkTn3wXyvON z3qjA&{2t8&fCMcO5Rupp7~P2Qe6b=8l6H~0>%J+&E*Vo^d1}giClx35Ls)iyuy+1~ zb@3uhOkELIkEbnVwdh1JbTr)*?=-6rVWvc%4Sqru*&LSl8UmhT@p;CdpyIvts>Qz&5(aZjv z)YH&bRz;tHszy(CJ^SsW< zhKF&4WUaL1A#p~cZwl%j*iJm6tY+lJfo4?yx!O?C8 zR_?g7S%?fGHF>IC>=@$&OB*b;AVz6jL5y*I2^$uGUAYx9EOLdT+i>5;N&$ci@N1ts zMkbJy6y>ArL}a>E40g`qiFW8SX(q}6XJ4yM)Z1x6eBi!L#Gq*MPWW)EnUR7(Nd{6? z{pQO@=d;Y-KHvD!LWIdl$CNGCF)lN(#e7=RPsUG1^NHlsORzCEeu#mNdl5AI;$!!8 z)W1Ub+DAOx=ARGCKm9Ls@!iE8uuig1e{uPU2S4Xtpz-Cw&%+Nd+fjBN*4>8I0w(Rm zA%x{y>PV%3A!@Sv!o|ZIth*dz)Tam3iu-O@;sNQIPp z+Oq0(^sIn`KPEXV2YqHYaZjtW_31nA3+booshm%t7_l#C6LH~hEHwhN)B2J?fh065sqV|%qW9`w@PcWd(3z@Pg&5`aZs#~vocn~+x5`4=J-M*(6w zx49uw-BeQDfN7_!$X`fQyaQxS-FJuNkr!SiEmj^S5o+wpdp43}F{ye&Sgvn_nB zV#`o^`kAh7Ih;ys+QF;W^gIw1;Be)OzSWfp^~&G4jD| z9DJXCcn6UnzWGYHX`_`Jl5l-B9ZB&b%7SuW;7#w5aP*T(Tk+iQ-~ZxOUwxx`*L}+| zzps>7ZghjIU&MMSKY_u{=LJlWXn=@Q&qZ^Aqbh3ia3P!4(Ydvsp<9A$C{D@p>csUfd} zj4I-R6#;?n>Fww-lqy=r_$r@pIxQa#8KZc0^p;lC~c!^>!}9!x&I4 z$gzjA{QAmRCv$aIglscXx9>M&m_>2v6b23WJZedVhKQqlf$=CU7taorKB~)>d^e=@ zhrLWiq9F7gY_+5r(G65p@nkR_b0LAwTd(5FU`N^K1WBGuBQgulv9CF$iidS^5<;wzFZ%xoARa0 z|JJV`D*=MxGtm_bj;b%p_AzI-<NM)rN%7e;{pSpy59rCF z;9!{fqop-HtkZDc!!!VfbX>R6+DNmK$||Wy4q78S6Ug`TXO2Ufa2?aK&#R8MQA=m; z4-fM5!o#`8N&oigUqAkjFM`Jz*ObvG@@6n#C6b~Mh|`(m54=(d_!}B5 zsoO+)u}F;{p{>>5RW?q``UtpWw6+0TvmopH4}jyzTfEc){hU(}aA0S!=i@(T-s1K^ zloIX`j_gI`C^R zprf<{GTH1*9cS?Qhiw&Bmfe@GLnex09@2w zP6mu3LWDSCgj6kV@KaJ8%Em;1 zi>(SLL{Xrl1?0d%oS`YK@7DrRMh?-G7PL4}X!_^`-NLrQ!cTz~p7l>2aHLT6i$sNz zAdw8>vw+st1nL(pNurI$rxpCpIRR6?1tg0gOkvw7#ym;}7!KoS;i)c$eJn=zHz%q_ zHLT+{)*k;S+-#kY3^sfa)|*DcVX^fHvQ=zCg?dV8X;8hySQzz!eT12Mx;)T`q5;1_ zW_7R9*_2j52#10|=h=++5%j!zS}CtFn$vvho_GN-ZTFY~bA@-lRv7WFNzs_lxfE}VW*S@!4 zb`I*A)=@r(v#xkgh3}Mk^48ydQ65?sT~Fp7hw?HAO@96?7y;EA|BRrGXj}2B1D|&a zuny}mhG-097{eIGForRVVGLs!!x#b-IAqs#=O*j6W91v&Ifr0tfa@(TsD)?0h*24- z6Z}f$tX_w87();o+{A6)KI^a!B9O;Rk^}&dBnd*MPIBk4v2%{z$=7jTor$junDL2n z@eHI=D&>`dL43?~`O3_Ab-a2S*V60a)8+^h*sGw$EshNp2=B#*iz(}tsR|RpA7F{#fro@w(^-7K9HCuRv0bP_9 zQ!`-G{wrd;#;%ncg>X~jPX>nkF%$ENfDV}FiDubP7~mCYc>{xe*|hVjxE-+ME1I>x z!k{Xn_Fky~3!T5@)GCjdGX}=T1M{$3n&~(94Z0!36+_6xy0Wk>!;;w#1*2qSWWw&i zOkikXxXxG$jSP4n!N{tV^H2wnk%R#gF;nR@U4T#r0!8JvDJU~ie@)wPrNJ~Nv~=M< zKvgVM*+{wl{Cr1o?X@^az9Dj^!67^4_Vvp}<7l?LcWTG&uyJsB20Pf&U}00T#^%!; z68q*x-7?9zkb5VZPwZeP?rqGUySG%nl$spT)uY!lKDv74sNx<5fY?zTkUimI&Ucws z`m8^goH6au=;czMyo|SC{Ihd*;C6iMgmR`f;Wx76e4}lePlK+wl79nuN>wf0UfmD; zF^FFL8cCa4KZSHPll!T&!O%}YFaZKZTw~^mR;&G^HI4nRV*Z19hy01f`8y*#I9dYK zw$L=e1lHp|a7aqM27D%H^7gC{lv(u7xl&~csqbycChW6OzY$7dsJETUET=!q*vl%2 z4p^#%j9U z=$Ggc9?1Gs9S5&^p$;&bJs#~Va!0Nzy_{C6N^&5;^lQLf=PoQrDU#{7N-NI@7F51c z09r%D%~?d^M-9)lmPP=&I}&*IW!4~S0TLn3t=PZ3hxOQ&?c z#9M6Z-k8yINaw1C`?xC4TG9atgU(XRib^xu74}aRTZgqCL_}H9(^^abBqx^n)^osY z@p~so2bWt8D{20|!Ml{#+xl=&>;VNNtbl|a(A~Iggev!k`3|>rYX(L`xg8(oB-TNZ z6vJ~Kx?d$Jay{gBV|G$&ETzS)OFZufZ6(!M189L^b{Ke9JNm`90)GA(zypx(va4}C zNxuu^7eWL1+ulyNDwR>m3gtXvORT^l9cbVmHgu;8V!yZ}cwxbWUGujDRwu+q1#*fe zP)~jnz-^2wwgU({R@fxi&hBHw)P_M_&>Fv!AsUr` z6&C(z5#DF2!c1#`bR?DK4@L|_lOwe3dmTz)mCgs~;>4z>pI>#?ykAo|A$N694y z5n%2Gf`yP8!PI(gksy!}yqC8Ta|LxN_AOV76@e@O2!0hdgG5zYhb}rDdDoJFP~12) zP-Q_0!6xIfS5zDS<-1u_DpPdp?l3(9I6JV@T@*9KF9h+9(R}}Cx5@1lk z-64kn%`}}6Aw60D7=iJ!)iOKhx}cg#cacsmP}MDOKRd})NYcCBc1G>)mZ&hu58bXU zhQNZ+(nzs%s4q>XBjS?>Q2loudaf9I%B(4=GtTtoU zs1g4LMaJ`X;=^ItZ0Ly(R2>%l4T``29(K3&Fo41~C8XaCu(YmO_%!m zL0Di+hDw$$Lz?huVI}d38los;J&TD~j+0*-k)fyD$j=nPe57#(Ilk+~ZUhed`GRq0 zMcLMactfbf(VuFGkxpMn3JvS;MYD8TpxigJHi<%oBfLwq_T_thak|`$COZFv%F@Tz zoD|-R>!jkFZ$ctfffJB@3=PmeqOVa z$Ng48?>3N|EB+$es4@EeVj$8JmB-{HDbct7Hb^w2?1Z2TH{Nm1Z3PKE_@CZcV4JKT zw%EMBI9x9Kp;&zTYy6L>)nKt02D4`1b%MO?z8^tNz8L_5HN}2_^#h940mG_b8Y_c5 zRy>|!N2Ybb?f3^meGCHYD(q3}A|k{A`RV?;Xg3kQ$^SYN#1*2>4*NhvC2sK0q4-;a z!D+cGCkO08TiZA3!jZg=UpH0{LLXKCs*#=mEoFZFO)aVbT@g#>=43qb zbArSDIp4w;q=-eS@lDW3#R8aMHH}lTfCf-G4Ei^Joz|ulhTlGVUdfSC*OFNm{V^B>ocfVQ!!B5vJ zB2FhQroGRv18kOu)TWm&;mbJVR9t};7=Z++5*&i`v&zz180-nKD8eUVfVU34^F8;> zCYY%Yux2}_W+r&!FF*127TsaEt7>bUCGmk}4WgUu1$rJ=zt|3MYliQ6?O`+sl5xD%v-0&~A z6zf>LO1;BJX1DH=ldnfQsZ8}h5!1zL%%5jTkMdY|HKJ?vq6_pZ^OJ8&~-PFY6DexnAC}u9&(BtlmTH9V)bllC> z1R!2|g56D@7z+5cl8%OPuyt=h^~69dL zl3uKXBkszUA9SYqggSZrRTAuN-OKugI4|Z4@3D!fJDsy^2r9|5Z<=U6y+o3 zuf7}cg7xSQD%xT`CUzt6*r~&S5AQe}h_;C4X+e;+l}Z z&u_NJk#*-v3w|l>ved;!%bq~Kj< zQL^g5IpuV(IRPWqJT8_j)>^Ef&0CPkNAu)~(N}{x#;&fRm{JLoN&m+DXoD9N6&onB z_lsD}8GI4G0kJEj{GFdnj|&&OzAzSxuLka{S3Y==nRMeD@Zld3=jW&)sJm)dE}hjs z)=VXAhQAI-&f-QF5yiG?$Yuv5cv2M3RR8~6G-$z41c!r+#vG-TwVjA>e=dc`qd*t& z229d#UK@qF@)ieOrE^mA;CGPx4E+F7^9PMKk`!SX#+st6r$yf2z(7^sX>l}LL zvzh2D7x%~xfBk>|z0FC<4!Fa9`$e!%ge#g>)n+ij^bdD-klo!E@4rGCYYhoioBycL zVLDd&pkA2#2-B?eag_kqTyvI0tAJqt@5^hc5xU2;Rug8)dLh^8NbezK)-6=eH{2MbPO zZkL+M`}U`#3%gZoO%=FoK{80C;M^9g-Eyn01E+>=QFFn>2= zfGrSFgv2nGk2MTpc^Hoxl5WOZX$sDFNYJ%Xcsu=Nu4PlAo_OTIxdLxgD6FSO6}#%c z+h9v%GJ~6g4G$)@9zq0ct+B>1Y~m!YfZ%m_2Xsnv;**x;ZEd_QRZ}p?qc{uL)SeTK~x2h&KF5s*yY%xGW)>*>5 zL%F=$s;}1(6b0HW3Iac4Hk;Ac8pl5U6Ys#IP(F8lN$UNYA*LDxB+5`AqyZ#NU}=Gt zHbA=IOAjJhgisbBc-+q^XwJ?mS|E@L?~>1yV(YVU*%<0hZJFe7fWEIar5@W?zf<k5dE$CKphjR6v_}TJYoWy_?NcxSv5sv?y65nBl1AiUI4e_CNmk_7!M zE!yb*Le-YQYzEa6NE>#hg9xKa$?y$GZw_hWzM*v2;lf*~R>`w3pKh5}&p0ACk>uJx zqB++cIva*q#xl{o1m~2MJ$9aQ787fQ6>rQOBg$e}#ON-gTAx&A;Ym2T_xvp0{Ry@6 z%$)1zO{Y0ol!%&}8&i_imC(w`WYFWex!G;UBe%FwQny@ZIYc)Sdb0jK%^fqBNY;9N zFX!JBqdYzU#F5_Kb)(|$tFs&Ss?kME)rv_$%^HHi)%IkDRwzO$IXs1*4Usc3lO9rU z5;Ou_Ow&(%0^m>cTzjb_pAk(g*;2ZB%UK9AGPO9oGuwr?6g*;(CXR$oLTkOz%^Vq@ z%@ZU%?J{cGb{jr;{z8_TEQKsJSqfQdvJ^sqz*9}03R!CM8eY7=J%vS6p9!TM7Z3ES zDNkJPnvX=w(+IEuZUejx@GOBWfh>V6fh<9mAWI-iAWM)XkR`|x8wRY5E0(^PdN+J7xxL}N{*xYeC#DP;;1#&~PKJxXV;gVn z6J33;|A!?pfKQ88dG7wxYZ(}O^^|Krd%^pb4_tuv?ty?Sw4CXBTs|BQJ-vq~1CD!7 zKo5lCJpugH`~DAZu9d!FT>m-V#&)nc7^dIlT)96o9z1jr^!bT1f?nQmmJh^;&wG5{ z(cC8Ehhr9N5pdH%5P|o@2}d#EEPwTwc0f3CKGk8Ms`CLQUO95(Z~LQ?sq)AoexB*n z6>Y;uM*xebH3)|c&s{Kli~y`O>JXWkS-c%eE1!2Uv&u^&n(O=@7gPxSiM1Jos7d%f z>*kzk{=4h*sBg3%Z7oy@ez?-9g$h46twOS(`t!A3>YYEO>dZScT zE4sF3W9->`c;_=74b&+kpxwESJu>#m8&Ti|Kq*O;VzmtrMiS2{DWy&dz+a}YEy77A zf6wr>H0kO2Sz1-&Q5*kCo1oSDE|!4OcYF6~aG&RrqIen)ON)xTv}4Z|b+pqIvqG)Y|NSrk;g~$;qtZ`)`YR!L8B^uO1%nN$-23!1Fz6qBm zL4Tghzp-87+$t9I5<+Ofg1FFn+;O|!2LdtPxiYJCw)OFr^})>tI7v9>7_q(du-d8U zG`n_xJ;{FkMI7B&9Xs`6(zKaAjqdc_jQ}~<>P0@Kw~o6IoG}!aDDYtvG=b`(klktb zI;9{{0PoM%aTw4uMm{F8{y#~DmFuE*Z2)r)ERHA$!3{X@`)i_=Ryol;T*y`_t5g}l zm5W49U?60+5_vw$PpceReK~VXM%bFsv7ii$h1bC3t zUh%$3MnC{I>vn7?$h&kCvsSWdB=-@u@L72-JQ4>`(^^QiBLCg~=A_wvaEEnaW^WcG zb02P=b-c2EW%Y}SZOjT(jB&K##&7k$dB2(Q_A58$-Uxk3Ki5Z-*pHBk6iG_T3A<|h zgNdZD3j93iQLcywgD87rkeOylx4!x3QuAnuO*t}+m6vjj5-0EZ==$l=p+y#7u|Xod#22bTZ? z;Pv1UKEsDx4>=-W1d!*a#gMzBZ8K*v8*v;EE?)tgtBlFILoXG^ zPrch}g2{$)U35B0(c~I_jgSkmfx@PJj+yw?6Ouvjo^oRqo0lN}Y1o+Cf) zUO2q&d?Tf1j&m}3K1u&q=ixzZ;M$NX(H})Re38553w*RoH90~08Z>%?RHq|E@r2go zFjLM4#ImqP8lEmF$3(YXB5ORTZulVTeEkS%m2*z?q#Kc2>QtHtF6}E*N698-f%Ot_ zF0y;(R$W)QB1og;47K?t>#m4iGYQF8?`c}A2}KB6%WYK@@l^Xtj$~9D<1?G(L*q$5 z=3*FE4*Lkd`kbzJ4Jhti@%6!(=^X1X12Bni@@z;jR_L)mT=Wcj20eqG!7ih8pUU~} zTxVdAGtK)fjCtTcDbF|hmJ9e4e9#ZnO@H}d@VWPW?B0M0;(bY)(avAx`MJwZi)i0? zixg>CFtD{_&Xj0!(Y8w7K!dIuaA1p&;CcwdADARX9n(Nk4df;@OCu&W=1U4sx+G%s z@Od}4AGC#+ttdNzsn6@B95Yz z)hmsZ)q_}3)sTtBjt9Hdd^H8BFPsgHANYjsvXX0R&RrQPc-x@^A=di=(7TJ(xR!_+ zVqmg!S#j8$F^^D#c5saNio5zv1$nZ>v$3YTjTXM3?X{H$cS2m3CBqC$i{jRTQarcntkpQlqUc#jpKxRq~otimkYG z1bfTymR&+&{fF+%T+?xFnV+UllrztX=;>-x$41qfCUE8rB@4>qF&-TBSSz<#?1X@Kympc_1pKK-%6DV)BfA?#s>^E>YjYBp?Knu2klR&r6G2-wC43V z>_^YJU~awo7fxHp8oX*P5{c8@M?(nhK|WyQ;}%~C&hmN{0wpqFKI)XRg*IL zdSY-EX(i%jcm;=`()+?qtS%a=oQ?|76fB~YaT7_m>h4uU`YVP+Q)bSif!JX{S44>&p_G0OqMIx?4(H*U=ClN7fVMh*%qy>GzwwEVj^%)iq+YQ$f31zsUV^X;|&r< zW3O~&X2nU(S%QJ)9OUo|{!(R)yz|yffK!ooTi+)4W4H37OATRAH78S&8Z7C;jtBYp z+8C%iSg3ixAWInErU;`}sHefC13}j)>mB}$`a*f|%~)wvw_-!`CAr;e%A>slLkj=9X^@Blmz`xL|&4f+zS~dF;KiXXRLU z>6sfzP|LG(CCzLYXxUVf$k~mbH>fwsxMJ~EOkSTQN%*@&)L-IFXMkJYhF@H@s6Wzm zN4^XoC6I`_`mqB6C>I#PaJ@Ndeq9lrRY0UTcAJzosIrkfySoA6%Jwk`5r;D+4!($q z8f!i4V)?ZT_5eh$18#luS4#8`C3cw)k9bB43-e^-4rq3nUFQDX21(3kSe zt%@2+u78?5#Realt>1aM=3LIfPg~Gq!m}`b&UZ^6CxXlOd?#Vu9oiPzlibtZRmm(j zbq4;*jkD$bv$jyzj#k7> z5MOv=nOJ+KipG_$X5Hki4mq4Y1++p9fOq9G(M{Kz4*Z{vXlf6SAq-vH&`S9Tb0`J(A(atz~(bVmFT=^kcMJw^$O z6M<0{#z1ju9NFH0O!;_;!dr6$;ppIrV0vT%Xt>jD8g(a~%5%33I&Tg()wBk@5^Th0 z=LOVri+}7Mx1v@AT$j|Hy~55cxWaAEbiwFW%6#;#w_I86H0#bLeM42`Nq*Lc ze*LrSPk+}r*+hmIsAt@b=e%=XB+`I3Mi$c?fvOU$+{_d{;&M|>^^<#Dxlg$O^TFs+ zvo_T`ymV)1A2WH&JPhOE7gI|W8M|y`S3_5t_)}bgh1ZiTTi`o6)k1OWB}l*~3?^52`2t$F z;@GB>{G(l^j3u+*SV%lO1)=saurs0x>>MO77)u^4a5h2hmSB5A~;-MK~ zS)o)(8O!2C7rKuXh~a~_Kj5uXd&=!f8v>gR5=PC_9Ju#pB#*jkZZN#qL9#&t(sgqU1ay&0@zDsBk!eH+8i8Cuo`49A>rB(e?3F^kg_flgBiF`5Q%uvS z7$~?KiOL0jT73FeM|9C;$1mP9->WmB*@+z5gEJs>BAH&N$%S?3m1z=sL!So$JNz^H zEeU9~Gg&w$j;f)nPggm5y%CuD>hwN7hO*$-ak6V>cA{BrsWHI#zsDz;yTh zS8vLg{KF?#TA?{~NPYc>J_-z~-v)G11*X)m0CG`+Lhv&LKzJaSYRZBmO+FZDa;IK` zj)hg~CWi5Sw$-jgb&?GtpRrzpH?)SRQyftz1pN#_2#g>x{=}aa@R@^&!OfvWdxl7p&fX8P&fW~GxVM)82hwkb2#xDhd%8Jp)FRwPxy!tKls&eWq?OW~_!E+wq@ zcvZg9XjwH;jIM7Dk)Z=Mn!R>k{t*xhjk{Q_zyFJARxiU|cogq=9cbs+FuCPZh6Q4+ zT4*_QB)BO9S6$|-7@g#S9CbbPz78BtxzjYai)-*&*Htb4X5*q z$+7hPcg7darYN^pn) z0A!B-QSrTxF4p)Lb~s`bU4^P!+|Rh>l*&s>qh|Af$pj;AxPQQ|L@z2C}raVd-^HoI7V zm;V|(_-+{YC#90)K;rPsGWos3b~Av&`0_{MMb;p62`c!C)1`- z^JSWrq35M8mn>t`$4rX?4@wZ%&V=#1qVq$FR5^xa8al}oI;Bt6LHNolsT^TJf+|Y~`8pWwsn29jlwsZnt^uzMsjkG@6uP|j(W)vX>n{*P3yxQR! z>vje2r(YD(;`L}ZN@AmZG$vId%1+2CL)Omyn^?mSW zPn?Ia`wY)Loi54=SgItyM`hu5^gW!CSNP*pf$98Bk`7M4bDc=L9l6W|3SEMp#Emim z#_V0o?c?%+FQCooABCH#6yuvOV5(>S{7h;`WarEr9Y&N8&cSZ={L}4=Z0lLp(xeQrBGGC<>PzgZJITvR zkh9~B-Rk*H+ON~3bJv9XKSoTu0mfmfEn7&TAGi%9>{uTchn>3jBlc z7d3FhWA%~x@08=++k9lG&(vLhpX1ljv%=Fbo>rH2HBd@hOuqDuCxwcLa>?{P`iK_2 z?O)grZPHVjin71#hx3MCj{NHzozhDg-jb86Dh%m?z_mT5H8^Lk^d~nCHu~eY z`OP+T!`wD$-zpj3hLUeNd3bK9<%Yz%{{bgsy~H1d$d22&Us(ErMI|^J$l!kQlN=8I zXt>Z92;N(k#Pj|2r3&vccjo0vAjBdKxuyMQVx{LIt-xcfvl)ykf8?G5-2{*$r92K+ zTfU7dF!u%}w7{gC%ND6lE&36dOx~5A;_~YDS-rT?79m&=8L+4euuC(+8YH=J!D)#hfmr4c@3sH#;xZ9`=t;%K?3*ybkdW?Sbw}dH zLzH%ron`b>KvpNbjv*H;QCo~+^&?}U%8G^RYBx}eN@bjY@$4wgAIFv@#zci;kW!xMf@!< z?(;tAIySsiP@W%Ae_KzXm8>9ZNiYyW#||`HKru|*AVLzG(2MV8D1B-5mS{hVMgXlTn)Z#%L@t~rv zhe+Q=#23rVh6ILguN)!_wuzMN*3(4I?j36 z131q~VY`3_ZC5m(t>s{}=sl)~Bm_BA3Fdxf&1k@YDcDdqb8f>Q+Ye^eIHNm#9MmaS zcJkkPbKSd*@;6)FNsOA4lmD#ECV475q?QOs%Ecr4hSrw$M}-B72-jjrYIWim9yExH z>G1e9t{@4Sd_xaWfWNqy(!33jt^1un>lShkJBB0)#xWy^Q`3`P&o`gh>T@iG1=yPb*G- zN4Wk3KrfL`e(0$p6oCs*ljjbY_b=*_Te?ARJ6C&os2u-Rg{ftn9T;k7sVNy$9>u$% z#w!m_6rt;a2N$66AuZ*YqydFhrAlP@_ggTBqRDV>1C2v$FS;};O+d|L3yMm~6#hR} zH+jKk07%6ge1; z7X?CIe+$Z~c~yvCaTtxSaWk0OvbsBo9^*e6UEgUn2uRpcj-V6pUU4aGFu-b72M%M` z2ATwNnMg^8#r0_Ac3fdj8z7})G~8KUfeMFg?Il1`W;^uGdHbSP_88y?6U0{&Dy*N& zWX+RWRvym8x;+_9alVBFr%`w-Aj|xx{?qnfDzcFhR{u|!{9Pa5?V)^V?l+bk2T#QB zQnp#snuU0yLn}Su!S-gDBLDDxz&awxl7|pN{~K0-d)SYj7+o4P9I{-n=eU)%De02+u5VG#m*sYXQ}8*FC(@%V>4YDR-~!n|DDh_B!o_&f zoxXkCRQAoR4<1-3f1fPn3huRV-p~w?*&+_p zL~bnEN`u0T+{Yneqx*z*?}cvcJK%gzdf5P zv$yZl$7>Jn>Q1aNQsQQvpU#eW~EkH;Uo$?LUpKD9l7~*=yb>r8~Paih9TXitqH|kAC(!|an5<- zaD!+pny*W8jVCJnXu9(+G%mDPLuyeHRa_OGZ_PfLwF$|flcAXb%8!{J?iXtByOUQt zYW`5N64d;jq+q*zS2k)p8d(KudnZzrm5+XXZHL5M7#t1(S!p2)c$3sSUN+>juw;lj zmMBohr7^z${;;uPR!Ku0V|Q>)dc=D$WXNH|5Z9$m9n#r-dqAnWX!*!DPCr(|kU_(c zaQb`-$jR>*HyA(V;;LCv5J3>!gHEW6;;0s2Atl8POV(Lpxrr4w4P?*&JUVKwX)L9u zgmN&k;>HM3px<`0WOFeq#T?)=Lua+xS4yGW zM$l>%b6seON}AvTBBLN=_?{sgN5)dbn317;!Lk)S(Hni_kNlM@NFpym($C9~WZ9Kk z22#jSk~p?~??5>$8|Mzp#fVOYVDG=6FE^C5?nQu021*=~kgQ{M9>|#O1!`rPrDv35u|`SO&m)nw-PWhw2kr$6M-)&}U(o(m5rE#iid zFd{%iN*I(b(1L|cmN_RF!!uP7@sGVoOmduzKEN4?J))ZMCju?wz}kDDS{M#PnrsOv zNNP3R5D#atvWpQ zZ+njpdtg`E927M(Vlu&L8Iul6$V~c^u3QV2wFV868-h;+h}v0M9PtlajMvA(MyuEc z-~HUZnO=Mm-O4)xXkwR$_A9QFyJery1fGM3e+zo3?JS{1FQB%fPJc9e-L=Tpo(q)& zTGw0?GUNUi>6_p4n?_m4qHiufIYs97>LhGGv6mcbqJ4F%W#-X)&kPsLYW51bd7?yu z;m`ps-OPGGeA5jBYTgJLzd@uxbX2f`?fh|B-o^FRI736MW|Tl*Bb=s4rw6&N;8 z(U}#Bp0f0hl;v!s4yP~!N@m;5($BNEnjM>0`#ijF%&QVR3Y^V7hhTi{^#TW8Y*6gX zuBuM#)!JdFFxyj5W9aXDZR>aP9X22~|Bg=f!xf26?>mK^@nNfRN(s<+AwuO;jp+mGuyYrL(XZgn#&9ra%nvsxB( z|Kt=nXE!Ts=c#{upOTw3c49!Z-NZe~3z2j@N3+!_wfgyry8O?(UGae=`3w=(>NW5> z3k$wNt@!y<5|R2q3j%Fcy1_`y|FQdE%y0G?>j|_-5M6FvZF_HgKv=HK-WJ0byf7c+ z<~K3$g{*m<5TdC@8^6Vj@-h_K`7_;IumJo>K5ZkaLLpr>99l1BXL2OUz0i5&w(?=z zUXI^bukJZfaBp@}dH)iMLJay5TtzVa>(r7Rj%8Le9%w#NwLO3OS}_KJh=TOGsYVWA z@nx+K{u`|iuAlAEOmjz!z-i^HXCYnm^o;3(=+et;_hv-DvSaw3>vw5yY{^4r#zapJq*eU&93REe0FtKo!AJd3{!U;c8_ z5=qb!ktSg4L-~kjc{fLug6Ek_kaTe~R{M1?{lvkHzrPlR{RtZ$2g;j{+!UKN_xZ!& zyzsqfwtrd)u(N+bWkXeeNw3G@FU7y$bhi`;Cd)3(NF(WUmCV>~bW(*GWf0Z46UW}= z4lTO~Q@8AA#hO8b>*4p37jsH=+gqyd-tn>J8Xanz_wn@y=)f+j;Yr{~25NNp**j{l zpf8ua{8AAqP*CyV#20CJE?Q!4YPOZ^_KNPk>Q>mBiv;8%R}b@{yG9#3m}Xko0oczs z5_a8^f<|G|6J)iVX_<0;`Gqr*G0(GsyJ3?^Dh}V=E}T$PRdc?jxtYtg$$Cw#ty)@I zKfEsJeX<8Bh7s%FZiEi>pmQH)%MTRL8FXm2b=zw+iLZ`&^I>OW-Gwb_V_R>e$WJs8 z_Z-0(y^f(tobcY^t>W!TsXbe7pgqGsJ6Mv3;7uhe3T$<8tu|)Zpyi~@QGe2t&*JANcf}*?%+q zA?QByT2)(vX=S+fUu>EuKJkeroJuV(c_-BZQW6=z_iXB!lY@BG9#AtAxmj=IKAg5COu1~1@A@P5W zh(d^~KkB^6&~86@GYXW~h4CFquxwlqtC2tZP+P$Av#nfa#r z4{q*_d>Y&v!A~4sjVS5kzKhk*A1d~e`XJ3m);?gTfd%U#Hv%Cc1Y$#kK$r#YKa&qM zkb4*e1V#uou4Z#7Ci`-Mic*hxz2928@}%A}VL`744^>=Y zf4&AjwNN)+!WE9HD7&%rUv8SH^DF+*4E0b}Uu$*Vh6|{bZ_+6HQD)9NZKSSh~Ea;U;Mmwa946NswxY zYKX!{O}H)-1zLtKRxUitNsU69t-XQOg95~e4&6{n1A%Civ=s4PlxE@)*M77r^xso} zKngDz`k;U|Xmu+kH&NlQklw&hh*J0uYMdVPN5(Rj{ZAoZr$jDYr~`JE!KLCNHv1*& zFZM+haY@)nTkzGl+N3frJyIXwp^cK7bo(JM=}Kf-9puLmSFZ)RPqL71pTUL1BBUa< z5NbSQQsGX4<}@qDXWiME;Gh5@1}nr8-7MObf_8V%E}Ric#_z-&F@qP zXqztJm$+15Vgdn~qoiBg@$lR4G&SSBR~)Lro=l7x?pe`=%ce1UK3Mc@IniW&tG$}y zEdNPkds#iLRzn?pUZg8lkX^y~Vb}Lqd`mQsLG#yHY-RW>ZPRRKTL&19`J@r9Szjuh z1(0Z7MrjA^e)ows6fT$64=ELmcw0`xzB_%da`m9+e?sLX$rF6hb_VH2!Mpu)sJa6T z(78kt1T0I&TgebYLOb`Q0Up)qpuWLj6*|J)?#BlY;In=J7h0|6tjpuJwB2Hlnp8FtEj>mH(a_v7Pc^$v4@d`3^f0H39URjHC>98wGFxW`SJXdJ`Oxa)1oe=nk5A%V1oCJx9;K~mTGtk{3z4$_DPD; zk?}>cAOevV+o8ocQ42S;;cQraD=u7Slj}<4%wtNr5_kHC*n9^9V+;uH-=aTVWbMtw zDhrON+f1-weYm6t8ymTDo?%S#5B35|N23F5xxV@VDkQxfz}HLEcZ$(~4oo)Lxg}!W zTUmya18n#tZ?)Tn-e45cM-nhKK`hjQEB+|>>fG*h)DUY6dliU%{yRM^UOK{~kn$zi zqw9FRkTLAn|zGH;0s$M=c#=fEony?Sw_R_p5LlM5_98?-C7=Di`B9{>E} zdy;u*Vf{yc{yCg)g8d$pNi@eiP$}Z4KK>nR{6GAn8{2w17{@UVc`_M-{G*jXRliCb z3C>@6{p##0p~3TK_P94E(jN1My!Qi=VB5h>;buQANE7G(*xs$%JSGC&`73-tj-*Ev zAD#0kjX?jkN^rGc6p;}u=hmT8yWQ?G$+qsCUFhdsKHxa* z>Ks|=Pfi##IOTODnSR#KrKcNY<8BmnaKC|QXu;p~S)}%XmFBWjmy|%Rlw_8;rBKcb zom04Gz%|hDg_{skmr=snWf44ZHD>ymj}?6PfEM%C_6r>5k>Q1>2rD|PO(6yjZ9&!^x zM#lwBY57~O(~j3HrDzNx1)Mc)q+}5wsqWS$*B{c~6Ku+{RE~^QBP)O5a;{j+^`o;E z(gV~a-kVaQmd@X)Rv_RsjzoP(MvZ}0$@JAMaG;SYX^69i8ihljYld$(laUnD7_vi% zuGy#I@&GGitmr?_U>4p|&BFrd@tROy9{S%=Pg1HptoUg`RdCFsT4Qi7LK0#>I8ms%|1_XjDNts>0?$L0M!$I)+AP@V(uTWHvVwQ(l?5-B^H>oW&gbd zby3Ehk*jH06V?k-lzSw&$jpCTlF(>rwVD%4IE?c$HJi%&?hPORF#i`n!pJN|^Q{=Z zKM4n6RkO31TJqc2kEGy%|WXdoHw}NsE-c;QMR2`DeE#rF|wjx^VCg$ zdd*0>C<1w7FS7BWTb}MPSB1>W4Auzx8BeXO)efsDI*#m>zP}mP{1ssX!i&x!6xc%) zSMFEH)NMO^1afZ%NRy?!B9VO2WPE|_$*$I;S9hdE955}$%ce{%@c&rKZ4wg{QP9g(bH zGueaAEflG{5Tyi<%X<_OD@*@11rIb}O1WEdTNF~T((`3PDxk47i=5H@UxXVEu*UW3 z+1rMwJPetVeaf^cGp`g8@qE`@;C?nvz(oeHZR{9_+AU7g3Q`h~5a#G`unOo|ck=`f z7HL{_&)Cs@LyEA@m0E|VTyO1~e&puGMZd8A=Wy3h9XwfH=uPMjA^%?D~gWPywufWzbp)NJtDXCtE3Y z>=GR4Iepzs2h2e&F*@%q&px3Dbk9>^ZtF*sqLlKw-A^?o+Xku05tr0IQ?-@Hr)V zB_-<`QbM-xw{z({*4u^)?|;Zcl^W^tmAK*K@U!^J>KXPVsQy%3I&dY2+DS$s|A0kN z5yLAs6@~zmSvEV)g({P?->PSAzaza)TU+*ngLhwFNGFJ{hE)E4F!jmg_xSl(!+km! z3DlLWC+HiE{l@`kAG^okn|?LSd!A4nEy2Ph1_0t&OOk{LEFm|{`{lH95cgdFd%eBE z8cW^>u;<3E@^d5!*{lU0Yc->^v}LNicG5~xv}mpS^40c%lz{b-M+u%4yJx|bgg`zu z;J`vf17j?5T~-nTxHOi3j~-aJdUG!`-nh72-dByblp>&fD_tcxyQqjfA(INIq)A)r zbTze~)X-Zm0M# zl`ic1#x399r)y`p&R$u(~vvjSLc=)EOy)$ir$>NupTl)euvll6i# z2$1B0(+>6VQ^Z~vEE+d1x~M5x-^^p6F%b1N@HQ_;_{M?tpUg`}i$nOaCnPj6 z%U9?VqZBleVe?h`!fri}4?8LLa3_uuOZk*RPo0{O^=frFe**1cBaWjbJKLQT{w-lH zg4%)>jLW{-NycwmN>B@oyquol(BC9&C=$(&o}NfEl@$B`1M;nX^nBO%#hVFfd`3JNP7$}Jugi1#k2!p6V)zu7!|*zJ%K&0;?SlutHckBT@*uv0)5~0cIV&Ea zo+Zy&Mgz^ackzyD?9S`R(SsNcUIEPKR|D|ugI>eMm+4i!Tj?NcyuaK@K(0vlH0Ih{ zg8G=}fY3S0#w~%7I|S{9>Dyzc1R=|xiKCG2j^a|KrSf--D7A4#5*<*T*e4PuM#O=mhHyRc-Q7Fb$aTh z4GsjJ4sd9WZ=lvXKO^9X?c_*pp9@dFn5x8`f%onF zGow`^-=^d2hQK#?KQ|$w$$Z^->-D{N5rxJW}x}OfJ=&aSUKh5CnE0UFGRkW@MWK-e^*b@({ zA~vG+o9VdO9I^W)E!o*;r0k$Ro?Ws9Y?ef+gtn}qG1;nh19mx8Fxa3v-+j;#KdSi? z)s9O_09&nh`-d6t06jp$zfG0~g%Pu)biw6PJzMmz-}e6n@R|4TY-FU>nF6B8`8|&f z|AtpTO`5aP(ahtoMoLlRPw;>I@5-1p)Fzgq)wQ5LgmPt*We1y){bPp4eH9vAGg7FNjT6>e zwEumNC`P>I{{IvH2V!2DqC)Gi;1$+Lb6td;6+EJ!}rc&zt^tOM5$lYBN=E23f*D_y~r zFBJ8g!)f~LH--u~W>yk|wDb;*+)zZ49!10Gu%dw$Ns&!zNeEUnB1DGs#Ypf?HW&3* zpf+Q-)f<)ch+o)fENB5@LMien^&Ln+Fifx5795Iv&qU}DK6A%u)`;c8Tuf!g42sS& z<4>kSKAKG49FO5|wF)wbPw4TLte}>J2=-*5NVG2)M#gelghkxm%*!}Gn(_q^y%4KF zaYOkHecb1WZt@{0il)#=2>-2z9G`ttnL)lFFN>ye>rXlnnkwI>N$86mHB|f{*#~RAr`-JO z6~Rw{0TmjkyFru)48$*RY zK&~o@e|iSa<{HyuRCV7xEB9I9u_rimqM@c7NEykPB9AAwctK+zY`AzT$Zq?i--`0sl9wbu+2uNa**Co(9lkNEI$}h(Q-pMkMab4c z*}orMx>K7ay+-!Y>DU% zv`bU0BJ_NPBpIEi4i&=?%A=OwTXIp{f8&zq84Vwh#35IbthaC>gOD-g+0_a;ic%j7 zd*Q7tG&2_uMaEI*o)Is*B5GUZuVl4`WwE>!*JMc{AXH{jAms(|ab5OBy~ki~YW+x_9TI-+tpn&cDb8MCY5 zMR%N6DTP*Gmbge+#Dv&idFeD|ngb{mc4lkDj zBumSx*PmB%lSC4fOe`+YbqDKe03Rm_y5Sz=z$rY(?f{o4`ETB63wh0eik-d_Z*sNz z$Cp7iA(xNiUVVB0!EO(EC=Az5&$6G$#E-$i^oJyWtLhDpBepD z18};5b?Cf_Y8SZ08Z{2@nUKxI-t_3}I4^Z^>432H9?=PqEt(NPs4Hzl=rn8^UHwKr5R*lfEBAcz!$!uY~)V#`(Uqb&&2 zl$f1cKsf%Y{vzIdxFxmWqkL?XiO0i;8L_@%nej=p%){te>K!}wDV3B33=V}71C+14 zXqA5`x7k8`3Z7-?75XDafA>H!f{OWQaB-)B=!r0@6$=_V4{NfT4s@XGt#ruR)_oI; zEO(B?>tt){0hy>~k?x}iPr*pmeg@+qW`gB&<`mD)u)bJFUylY>&Y|-7ry$62PE2Be zHPPgAJtuljv{9&hd~ez`(+8pCQRt@&i6p3LR#Out^_&J`Tq1$9&xOx+W1P!O=Jl z8sm5vitEIt49>6rQu`Lnw=bD_!5V;xobO@;0-h+a{j$v^sQcI>M&*Ffhrx-%*}mL;i{ z?>N@Zw;std?4sY>Jh>VFv2-|r1uu)5lsv1U4<zTat4bP^)2n)o}D(guWgW=#k`Dd+n2US%g?^fNjI)a zf8|uJb^5OpS+yevg!}YgmG~QV(~Ro4Mt92s^DfIBW4R^evLgg6j?e$u6d-U zO5zaqhY>pt5d-Xp5ycvs6WAY)bcKC(@(@?#f+Mo0?!8m^B>7nx7d!Lx2#f*`;~;OH zgJbi9&PH9J7YYVFg9ljc`@ycdG}0NP^|dR@uiGogxyvj zppbisnJi7ycG-dTADhYXrfm^IC>rW3@;#uS%7*6*_mYT7-$8IhVMy|6L+W4)-342Iyv*ezD`0CwA+tY~Ed%XHNlGkl^L-_~e!-3^hRwkP|LqN-Kqf7({ zr%CunhJ-Tq@v@9b7;A3E8KzuvDd?Hg%o9t){If~;IY?+2W5R&cFqEuU2C zFMBIsopeatvdDpc>e7X{E>PCyq*8xg5IrIYOm8OPv$6EPZ*UAvM2Y;ia3{^V-?`B- zTw_5EV=3b+=p|W(JvJ`Z^7AGKI#St;ZcrqM&ds-d*k!HyN-*b1jBsgSp7X~mEEsqH zO4bdl9MIv6JqMYlOR3qa=8ZpYC@(Y+&(y@2=%%IRm`H{neU-7!WDK8rZS%bh}T&vjPge@$b>$Um@+)15yljnUyW3f%vik#)2!wzuG!!ZfQ+ahtA!; zibfjTu^*=xv@J4?A8#x&gr{zPC?}0mNQI{Rwb-23S*E*za}HG8Rvgtpr7T`W3Rg`{ zf6L9w1RPp4C;}Y8g)F>hb;^Upka@l-n-LT!!;0%C3jPW5suvV+c|g&Ho~^Eya4u zqpV*X9+-8GHyP55^(mGwK87a&O9o_NV&-e(?!xqYFLg13`^8rhKlGa~-4o<~gu0pb zB7I+Ekq*!9z(}9IypmxrkhYVc8q1>Wl#4eOW|j#B@w9=3dtKK0N}cdo+7a<#D`}|v z`msNDb&C&LwN~?wFRXYUVTNr}R`X89vO+_-5!|VQm}%3$Fj>Z}YDgz(vRd=VZYng% z6`JbU;HMg=W}fL%19!m>zi{ zqpe>HBqb3E{u>!}!}81`*^Ed}0)hujcaBktEF;QBVZx3UMkr9_#FEk2(TWrmkioDp zBR7$uhTMD3Oe1O;(bnr6KKMDH)L?J)E;SYlMmo0PJ^$q+k6<@MT1FmNG6*M_Q0nBJ zDd(`z{L1cs@;9#O$vgRo_&Vu{Z)pB}femJXH~3kg#ZhC6wtkfldJf9fyNWI*@JK-# zU@%p|Ai5ItGcazt%uAz*Ig-RnZBCq%sFHQmG2PztncF-neaYY`IO@4eN1;Ta)=lx; zrK4fVgp122OJM~g%u^o@h?F=3o|aN(CabC}%PxFJV2E-hiI)r3PM3+P%gu!E0R@HC z0*bPXHC{kbZYrlJHCdh%=8+Ai_|E4_iq<5r2C>>KD8I?Yls)Z)##f{IUY=OOP*-w3 zHB{j+(OAWNdxEw=Ps@z8=BgT}yeTI^Nfx2FRp{B8j&8XK0C2_07|Kon__}&Lcfrmn zmn5TBq222j<(uKPsNlyg&if$E*f{*D|Eu?{C589(H`1mqX!P%mVORrPv}St(yuG2=;{Isf*Z_eZXzP!fCNrhu!FR0SZhZ0NbbyUPG0!6r>*pCdDv9!N z5!`fs`@Ji&D})BwRT$4u&T4jy&6dT{il?{tp+Zo7-f`JmqRju+!wTLPxF>EGhzTZ~ zIe{JnYhewmVbwM$MNkjoR5%s1!!{F-haL=;YD+;Ey8G-5%e0p9kDR1F(DztK5sfh= zg9gNH-Jw!NgPUqH4hc`ZvUnVuWdtW@5z8<#wwPwwyCgIaTP>$qLK>vFclb8vN$XM7 z9Y7k_WId+9P-~J)(1U)I6PnAS(utR)O_XwPO-d|yJY?pyz6~R@sM^e#o#`&gjh%Ad zS{o5$p8tc^-~bKkIgs%XLCE&5X<~yvKVsr?F2^srA%C93U>I6u&1zL-kbcPO5qfx@ zm*=GHC;SgvJ2h)yN%5TQiA)w?_=K?gfL- z`DK$G!U9Sttu+o@w+8sEM0MIKw&sK|0;M>0G|xJ!7Mt21dqQ>U!^w%j z1PbzUGGsaA+SISB+gtdLC*p&e>mOdSK69i28Vm`d$?cqW^DtrjG<5s$lqfEoE+y-q$-zY`6jQynGxquGNl>BCBv*Y(}wg^vl>1)Anl7ct7u~N@TBe0u<9A-*CG>_Dh z*5m2tLRx(1Gu!dqFZV#03ZK3{cA(Ah@6v59u$j}M5a@FLV=PjE8L>wNzu5WBJKZ2O zbB6|!m3yF|a2d0`Eae}D_8V7}El$5q=dB5+;hNIS>C-WS2=FV!6`z`Cjob~IZ-Fz0o9%z{A?KTAvmdTK4p23^bEXaQ8THc7V@iWA{b zVt0qxON&PUNA19#G1pTv`RAGEONz#a-sO^Y;@{(j!)x z(fX&EhaaBOfuH^`)uj=f{}lM^%JdAHjI}JxVJEebbK|`yEHJ5v56!HnLo2Z0kZtWE zP=-Eh+fBbA%%WEN)o^3xBO#8yH(5Y}FIQga3F(iRj+{f!>-O4?px1Lf0`*svB)FJ) z=*$uiAfI;f$Cf^TrB7h#8$j@m*pJp`Nw*REL~EAr%1{S)T7_kFqK$2AqM9S+GMCx&{M=7*?=?wQr=I5x z0nfOE6!vw%trk7nYYi;ZK&S4}d6Y|tyU0)y9F|{&+w6jix9RJCgTZhz(kAM3q6KwP z!N_vnt_65J20SiEi7qr3R3EdlyjSzU>*ZR5r?Jh)TUE_3|<+)s#_*G!8J2JB)Bs4NX zF&}?Md<7}zYjIk6-;%|SuB`R{P0Q{(Pw6R*kXeT)E0p`;?-Co{mXJ|RD3Q=;+&P2$ zkOWDWM;p2Ylc8{_2iU`Cz|78<(lDHrP>sWcBm=3X5L(uP9Qna35FBHqQP4=xvHh#h z1tpzq{V*wrI*}vfEBU$&f)hHec4I24C=4IcKr~*-T)oTsGE2+lRUWQv?j49~IN^8t z;{h{)9MQWSvBrJvF`BIr&heGI* z&7$+_!e3Zu2eA0Jh_URsJ0#-E3*M^x^{i8vU$M|3?RbeBDy}DT5``E zeiPL14{?Q8Dq!Nvo(z=G#u=vt$(3nDu2NG+)yF2#K1BC+YceY+BX-L8Et*i24?OET z);z3HH-t?Ye7iox2jz)+_Vol73L2-Jv&@c+j#!it1vw-8B?t2#coIDspGhNz%6wc& z92mY+Ak{&d03e)!JHxwB4idApZCI$EC}LDk2;TIt-?dJ>79ef`tlR}VnZsu)AEHW0 zK`tBqsI{#8uVA+(q@#;n)UqFM{N_1R2g946@0K zm+mH+)Io`;N7HM7YBTUJ_uFO$cn#vUnrf?Db9}&|l#Miar&7JOI$H)(Ei~58rU+34 zd)H#YL|OMtsa6i0Mlo3ZVX_TRmn~1s%(}aDh!_&J=93*F*%~#*0YLwoDQPttJUDw$)T2^fpj{pMWJkWK(?q@Ba zik(tT3zKTn@2I9;Xg03M{O>lN_LmL(kuXpXosU>~sYg!NnUbV|vVqHjW1L;6MmPd+ zLbyv+B!}aV6j#XS^mXOR(J{hVs(Of`4uqAV*$5=fZ9K~WpZnPf?qxwxQ)(>vZ8c7Y zA(&tBIph1RGuQs=o6hISJavd+x$5UNx@4>4&oSl{VddQ?BXX=qdNbGc{weVW?E$MD zIh5%+LVnY3&uW(aUKZTJ$xPUZ7&V7e{B&Zf*P3s*(n;4<*RB2c2UoH;k=)d@cJg?C zVGWLXAjK@{6= zt}(4ye0S>o+`B$ya?5WGX?cIwA0wFYqhIbZ80o)p@8Tf*q1peP6jnaxqwA45JU zi?GrG{ec3>OYrSQ9TV~ryUBaS`=yl>CbdwI$t+*+t!B2nr?WQ%e!pR~k)AqqE}QHh z3v&(=CjFANiX&%`^}EgQ{PPHDqYjxLG{s+0C|f>Kp7WvpcNLqS3N!9d8yRcrOK+7= z@mn<}X!_cOTh&kO_^p~=1sk~w;=kkCUY|WABU+>oWo009a5I;aSM$h*;Y}9h zNOySxE76T^VenzRk+O$>#e#gl?a4w5s^C18?n+nrTt)vvN_^W6@zf<@ zL?TKBK;u-NR1oGS5cJ~6&VbG|mk9R!M8+1YrO_&@?Krk3`o>bPO%I=LXKT2|~ z40WtYgO03;26{DTz|@byAdgGGS^7$v*|>&QP448W`tqGqfqCm%^8rYXvK9zz`aW#j3^GPXI$zgA%UzIs~J zd{GodR)jQXis{e@(ha&XblX%)soEPdqojN?!9W095tjcV>p=YU>Zw9$l%hCf0Fp#Z zmIxPvY=E<7x#{!V=e3n!7FYM{9&_hNdM|Z;ODTXQm~>yvtWtCK!U86HYjL;(jH49v z3G?3khnN$cO#;|zi3IXavPG>@o{q&Sg|LgSqlSVeNqAR<_hl*I*I9HSgh__!5BVHa z&%zxXGELSn$KO?ZrFGaz^}X9RE~b<22%jI#8SE&H9UB|&*1bp2EO<1@x$^NPbV)5FFpv03jaDjD(4&I*lQ5=fkH?61P6`Znp0yNE$A6?;vo`_uX;;s7pSLes3IhA zk5aB9Qi5(%GL6Ch%mom{{BMi@t5TZC5AqHli(KQefETsfK2J*Wz|;$_YCdy5u3C5_ zMEd(l(dwZGNP8(5iX^1OR$i$u%x_|{@Ez~N%fl4d&qqcEn%)3Utlsekpws8Ohb)m| z%ZUecl(Exg&_E3Ep3`QC9eA2QP0!v6h_YlJSdoBLK`#4A{pL|qFMsz}ReN2bQyH`Z zLeF!z8%=#PF>K35u9!dHy9hm4LIkD7py%jyx{0&@l*^gcPzhB>adbo3- zr+z=r_FZGdckRT4v*NSor;;+xeOTUK`M;$Si?TTPN(C-{uP@IcQSP34OE z%9&yY`%Ox?LppD&Gx3l7Fv*pKh2jw<*aA!dna+`LFYS8-;4^L)Q*^`(WdjRHB- z65Y~80!W^1veylheOb&{fwbgAEZ0e)bm7iTQpXA~C>x|fQMI917orztc1q&*qm z5l_+1;9Qwfl8ZIZqWLZJo>`lYg5PC?b(uYF;m`Nu14q{tM2@grZGzwI6F4o^_Wj?B zp$N;<7Ij|ft;$%Ialf`9gSW-G+vbL8iqCPqH zFoXOO3_3|KrLn_p7=FQc*HI@4NQVdre4ABXFUNYRNFh|s1l#1-&@UiOHNsbcQPYSW z%LKE*Be;a``8aBz6(yUb;rL-hFdAn|5LBL``Bs{_wJ_aj7k6J}^z_}|h*0uS8Nf`qF+y>QQIFq zOGuzZ$ttdlCR`k9vWX*mLf04-M_iqL?#-UBGwAMRlj2qPm0o*&RCsl>?>v!=(QYmGQ{{OgLIx%|Mv=uE32p0S_nB_v5p4F3|Dkad%;#?k}pUG8nGX_!ziC zVZ}3xp2Xy@6G9EfN`Wp|O2Z)#jUa(H94;aZj24cfXRrcL76TCxx{m!xH1)Gi%|g`! z4du0YksFlk{7AbJirGH6B-_6DE^SX5rlfI zsA^Y6h4V=@$7GQDHg_vUQBYq^v4{Vk;QRKiD1+?fY(*X$M*4EvI zKR3i_EdFeWt0DesEbhkQ@5bV3EdFUM-XYkb!<1P^@i+79xG#4XI}4gV=gLy%{D{;i zKG&k~y&9mDz%+38qZ0S{Z{zfZ$R<&Ia`iQK&}uxO)UC^wfq zDi;V1Ik$RPD)yHah5jdv^)bwSvBz=7gCE-XNIBuYeTF64yA5In${dcB3@=D3zPZu< zduX-B-_qj(67gQ)a)PeGVFfUNE~#`XM1$xy++GGm?;0B5@8T~mdsN2Z0Y_7fj14FH zRM6Kf#o*|?40Aok4QfbyBvGZ3NL`~d>@uwB}IZPsRb9>n&|=qjbePprn^Nj#G0zIE@T0b z6`7GCNLkO*MSkQ(uCR9y<*I{EDx6U?WdJ&>PTq=b_#aOvmz_n@NLDE)`2r|oRhRZ1 z3sJEn-}9LsPS*>2ZVNqSwpBz!?C(m^&W;p4(=F#a;e?RAplDNw!C2_%lAXr=#W zdx~O-C?l)$99=PY%~m+N8;J)DFK~*?3n`L7B9tEGqLV(Iyg&3VdC3ydDIKc>kgs6l{tY8#BUba~lcZzkMo-Jy6( zK*G1axB4F!(CNCu7i=xKP263ePiB+JM?fsq*#x+i5{AN9u)X(X$dhmKS^>cdtv{VcKq9HI-dL~b6d)H+CmX*e zHJGizXdIs&*?l^+oFi!4Pe)#tnGxB|cgz$j1yS5mu5F)y*;1O#fPifwHlL0Z#NJty zdszyE6O(diA;M%l<=HZm9>tGi+kHBbhjZ0eyuvM5QHbX@9t9_uS1(jUcR9zwR&fW{ z6m|?msd1$Hzr$@$dmt))nq-ttv=D1Pvq1oo+o?t`Cf!C(e)4Vv1b2-kve`=KOKpnb z$-^KinFgG^hnl>v=q{_)z2E4!DJIbiqYJktuE1*NxrbNYcs7hzzPd|BK_k8R@8XLG zlUH%})t+p5zF z-@#_^qN&BitN|)EZ)?3sU+>sRV;PY2DONaAHNGv2r=U-#yp~WhM7RdBBm1LKqrm8t z&>u2Y-WDy46pxFzC^u+9dRF19i0Ivg>?zjwhTbJzr7EKc9ZgrO!REcy_Z8V*)Qm^# zL)KGt=5*e3`eN#s0G|ZxTO-fO@4#TT5X8+F^{PIIS^O&@R=l{$fQaUdbFU@T18TZU zm%yy?Mrh!#vY)!y^eEmA#%hQm=O0#hFDrX^@F2FsZ$>xxx-7ZjPf6vZX`7jfIm%N? zk2(-f^QU8j9(^i60Go4FuB_(WtwbL>IWw*LKk4d~nUvMvEeziw;{*Rin{NJ=zvcW~ zJ?4M^Fnu8Bc7WK)1iE$-Us)dvc$WufD}D^)$4}Gd<|+cJaL6*d)9Xvv0RGGOHx8?@ zIBCE!ZdwP#l&TX|jp=DC=-4+wQ&AvK^Gc#Z}QGs>2OPenYfjvtLlso<1xYIV(fSovkVm7PCDNm}=XntdAAGIFPOpBHPr3;X(w z)tAJI)2zpHznOc_o&%8SP&rTYhFox&4_=nbHM54M{8;m$+^IR7T&6iEk7}mKwVESx zjb_e+w>+eIPwv(1klQtH$fcTLa*5{sNq4@dxgzIlzLK*vbLB$KUb$bhCV5aZKe<{n zP#)9ll#4aXR#AMEWtookJ_kkT<9Q_ zW{#d)!QY~KvL0`qx|i~Ae@?Mqh(i9I5>Np&B2gj}cw028 z+)3Y*qNH)WngRU&E%+g8Z&nXL2Ls}2%uK_bq6Qr#z7cS8CZVRQ+#N=Bc~o}k=U$B=x|&0iT-#9RPK~9%QkRV8CHjkvsQCv?Xlh#) z|Hy)K;79^x1(9D32>cX2Ht2G&)%aJ(;-9ZytQH1B@s?|4(Yo;ixoGP*hNdmm zB2fept5OEw2LiCH6J-3Nf6wuVg04QuoNvTYQyCmju4L_=7^ANI85$TIdUW0o zgWz*>#6exTDw-y9wOgTKuBooojBKKk%RluT2pYA8KVk{C|LPF~4pvUPf#s(2mq(V}-rsgr*(it*rp2uN=+%uobnxDYoEkHD(c{6*@2lJLHx`35L zz;`c%(|jt1PjCp&IRrBbE!WS_Koe)6g&3s1ut6ICsuGaPT^b+(e(VqorwCEsMvn6- z4`U)7aPQ>OJoR18K&HP}_&cr8YHIC+!QTp6PpILK;1pZ4nk5N`#p{7I1z;V2A?Ue0 zX+O}{ z*((O^wygcG2R5WNOii`uvChGr`m&n%gT zv%|o;62O=I3XTM`%uIl=v5zt3Ma@c0ItF`0U%Rpd*3iqIy`9=_vq1}2xYpGaFcXay zj$*~elwlF0uG<_L;h$Rc$%aD-cfvJoSUmH%C<)>9VIGYjJX9^pf#uB7)XbxMhP#Me zUA2ZoudemAG@&F0p(FWa1SHzgq1Al1*-&cGE5rh;LZthI^P?7W#66(;MExu|k&7e} za9VbOQ$$8YLaegj(IY#ugn5@sydpgQjC2Lg^K;>KJGrPKS9Ih;{QYy1vDHkeZ;6DO ziv*<3W`Y$LJYpA&Utw@4wk2NAG5k@Nr63buGJDMAhv_>z%tfeErhzB!ccSr*_UsZB z#?FFNFiGm1gsw9Y}}6I!mtgUVt;U0n8Ljys?z(kngGn=+A^21Fm-0 z+xln`W$NgiXj$J6oub^|0t%ux=tS+Ix6HaM+u1j0Gi^VAu7yohQs#}%w)=0q zzOaHJcjF=j+C95;f!Ul~%>K&EP&SrRBV#F<3V8;NS61kf{wC3#98A$Vl5180RfuZ{ zKx482!rr96aBe%|*cq3{yVqN8SW~#VP5=PUywL=T#U@){IBi7H-`kx;#9{e{UqqaA@H#f&fT&PHyQ3!OYh9 z1cCO^E+%No8P>Z6fPn}l8>}IpxBLVK5LFlbswmxXBXz@P;IB;&UzF3jM*} z)0myPT!%qw09f~rzxx^%kG&7apd*!L)RvU_+uK1ZmYR5(hf$l@f9M+{@qkjBK<#E zvd(?;!1%w*UANT)eSM^PP$qT%_i$N z3^8dU9laMPw(svLy!fv5<1y{Zwb4e!s7x|Y$%wTG9uGum%rVO45 zECz<{UoJa+4L8lFbc$M^Q#NWt@rEK;B)8|jJJZ?lK`~M5!Tc zo>tm z6LHgzQU_6!fo7mLJvIwy1X2&I@qo@TaXIn~jNFh@l>i$RA`6Hj?<@5!%&XNZkG6A-adh>}GAn&D&vvW!0u)}k~#Ua&;vx7Uxh-u@rp ze2G6L?=_+E$I-yJ$@>c2+x~ms7siMr0-#5)Wb&4v-99t~d+zv=5~TPoNr^qURYCcQmz?P!x? zU01u@7JpUMVrYcgu9(0~ z>=r%p77FwO#UUa@B#@olxYU6LEW^v-VO1KtlLOO-QWq-e(*W&6zxN0kUjx|7>|5FT zmK&3tVD>&I=>m4)iT8vM+L0Z_sX12n0=ktA{!GZecky^Akwg-Slw|vBsui1{>oUmF z8}Pn6Nd|7`o8kSpdtd%%H|j@hROAOZFZMpA=$RJ{8ApRF!T1Mjuh~DbzkfyF(tvO6 zA9%1YC1pa*W;()9BOAeRENu`}=K2^C8YlHySh?1rlTS%X0r+qiGF4GMvb}k8)+eXV zv~yuR(9Z%~lAsgVCLqeR*{`7z8jX8te#(1-hH-@nL;Q zd?x@!q+)j2qK73cgO&?s+Q8WA=0;fYuK}h+Tq|x3_tJ(D;){mZ7>k5>LQQFQ<%`Oq zNj%0hs%jD>l}5XQ!T)s!ivIWgDNX)Gb9sI1H8YxIU%|{h86Nw+_YE>izgdn8hL`hSJ&6t0p&$V&bH!2l7cpnm%m_0 zQOaDfilUa0EN$}8gSR>E)tEbs&F9HXD0Z@+4&Cuzwq?J3m5wjeUevu)(W{zuGR_cO ztp%@siMt~g+vvrswdi8xopSGaZQbu1f`3<&C*F#@Q={?ePVcjPcnoLbH{_}gkCI#}s3>wqsZ!-p%;QXGYPRmEsQ(c` z6YRS5!JefG4tj=A0HeVE@CAn#a0Wo%15TG-cjvrU?%gSm@gX|;{qQHe-~Z$P@W1;j z|C9gDf8{Sd)ssD*e@JiHH`5mf=}!^x&da8pfX5#jY~6(W5e1JA_>MH-uqhxY_d%YI zbgsyFMspuTY~yJ32t-dbuuUKuBU782&BHakMzqvBl{tnLW!6%RS&nUhz=r}0#9HAP zUtMiljdBaZBUt^ApN$Avopd__^&E0(atnjs{!|J5wyr#F0<_^ZUS|zIbVsxXG$i`O zZ4=m)nk~CYo!W+7wauvFujaTAHOOvi7s>E_g+v4526~A5Juoo60(eSFUDCb$*Z@sa_;{Qp}98 zjR8G^k?PmB$PCfTE7e(xfayPjPzA_*0L|xp20G>#c&Bz_FNT&QOZHRF81-r*VUw%h zq*!252d~+4OnU9bX&V1tb{uMAE;L|NesnPb!+SjjzmE0PkiR41TMs5y+B-yAH66$TsPpg+AH$n;+86ob|!?tjKn*hd(^m7Dyu+ zwCc$Q#eRTc8LUYmD#|)%V9vmtfmM?QbNGEJEujEKK)S!G60k1iXiJ0t0c~)`Mcd84 zBt=>&8689aVne#Vp~{-OeykEp0D?%vILw`Us1&|Fz@nuU2MGLsXkIWsNq>$Mq>eG5 znmarape2qh%-@0$MrURidX_~rl9a4hUgtZ4IYbr}h73*(tHgBTkeVW-7ITIWPfieC zhdfJDY}*e5n&O~fL^RyOnHIKPC*Cid4%OQ@XRfLAUR!y-Nrym`QeRMmE6q~Q zOKIy*1;iV6MjVinwsA={bI8*aOt)fn#Ub#$yd*QP!-j9Rc?*u>VzncRdY>){vq2Me zoW3S(8MK~9)7MPHx4^XDS?DDHRz2MMYurX4O2$Z)AsAr>XD~Vji0w~FYM#qW3TmbA zeg4b+;gTx)3!KGRo{1Lu07fD&&B@G-5cg6(;eFsUJAmZsH{w^9j}~rEG-|}vd_x^F zTtql$K$AY?;`+Iz+h}^io9^}=T;f>n2*dy;Yx1^>(l?)#E(QD@4fSj(I$dsK6)6e zL|V@{y&iV`$Dz#)dUIemykXaZ6HkBqV-KdRck`Y|_P#@b#Z80f!Y%2+A7YE^`@ujA zg$t#hNHqU)=E=);7ZdncI-V(8MeQ?KB2ov^<6OT$WnhW=*+BPBT>eM9JLLa9{LQaD zqucsF|B3vRyT^MUc{=RDhr`t&Y^++A1gcU=AhHY~%Yqc-@G4hT8A`3fE1no(r}oJ3 zeAMNsKp40)9q;-{AOHzm2vp!8{s#D@Hj5g6$S}Q*B@pzqZG+B$7KEfDh_{a^KvKFjS9x%$U(@2lPC6m;p zmy${Bp!WmQI&nvaveJ1KdS5PLdU=k29XzC{}>y(1p5F-4qdGw(lXn{AB;|fqqN_ z%+&58qQ;Zq{ak#2ot4;2&6vCJ1V$I0J}}y$#|#NhkzssxLaRV$$*_}GHOdgkS!i_ z$JEZs3XRpO79kdya*>6nWDjaSc_;|l1|&d=i>D6U%dK}Y2#UWnB+tLOVJQX_%+@2J z4YuuDGs9~X7t;mf?nZf=p^q zXDI=M@5P$s+?aroKmh~%!}pP=bUA1L&F|Tf-&LQ= z@I^8eA0c6>Mh*M1ZKzl^L&$DAy9a3m z+1xuYwG6dV&mN1HDMLmyAK&k3`Dy+!uMJIx!=Jnib+4SVo!Q;j-ISdR z0KPgo=!c6K>)~ zM!$~#qwhhD+Gafwh1-Jj+|ji+R?|NW@TqB=o~7dX?dH|p=v%F5UYz~Zrk4)-sf%8E=%p9E^g%Cuq0Kkm6_8iAesC{kvB^D}@8Q`wH^R76 zgWu2i#dH8D7R0$|bKzxsc&<_D0@HV_%`sIuGFdEDxK2aauBP!fk6eku>6pP0t z3lcXPiR;D_?Dha{AHg-GSA3~@1XN441ygn)oIp7`f}7vyFZO%}4&^A`?=#$rqi1ym zGPBf;MSyGw)gnTj`_qN$<5=@GrKR>k8Wdy4qNZUKE>WMEA@NQd?i4!;hQ@juC5hp(k_ILcUQz4SiEj+K4P03c(#gyf zw|A#0K^yxw4|%Z(vtd*{bsAQm?#l6CB=nJO;1;T5cJt%wMBY23SH>vYzFw{ABg|oH zIEaVO3(mhkY7rzF6$L7|^fMg_6!%OS-mQN zSvFC@Dx`++m|Iy|Qc^PJ7-L)_TrzwWNKgx}7UAIW52ocbVw4^UG z##IFT$9-X>y{AhvyjH8~iTjns{Vz2SE4+);e*{C7LsC)VN)p9FCtW)&V+MDwf z^^^sBsi+#+)|>v4xC&e8*9&8(vZXDzU>I9~11}4L+fZYkcIfORPv6 zZFnf9ibR*DF_{zXsh(LQjnLH7l*XNUk@|d*d4WM2gjMUp|1d`1-z?^pO=g>4q#RaW zNr~b*_8rMqh1>mqz*I<&sYHB;N{3g&;Ef0_Re6J#rMISmMGTIu`=V!xj*JdOUZmmUSUXB;m4=;Uf5 z?)=bXuH(-4Orn2g6ckTKvi)?V^`-1@={jQpCm5WQ-PiMhy0QbctArAV;FgAw6mI!j zzYgcVPtXhxMCu4paU|EFXCLXP8C8c009~1e%_k0qBL&j3ER+ie=7E?xh&D`8ll%u? zARv%h7leR}GTnx~9M{7VoYyqmzTA-O3(0 zo3RH@RBIN8k91)#N301haYuoEK>)>!rm2GpgR);sec^wYa?{+P`%=WMMAx)>D#gF- zD0^Q6kgjhbs=6NKqqz3YzzO_Kir0Vr`@{9IW6V;`b1}f>72my=ir)5UZa4A;+bU0# zyJXy*|HkYOdmdh?SMh39;)D1Bc8L7ejGvk+*i7v=(yQ}+w>(+*(|PwR9|wl~M!R9E z8gN6s+L8V}jCmqb(se5oq&44ac*M|kO#Q{?dc8V|@v8mdKJ;)XTIZrW zTDm*X7gemk(HiM5dwCmJ+zkADgsWyQ$hc+_=EDON!x0_A)OXcl+%VtwAc&IzqSb^h z$@Gnh!D}hL-Uj26Hwake6m3!vj!FLYZ zA4UwBLP8tEPEQTA8=pF(*@HDKezMEuPv_ZtlQ8YMeWgsx&(suR84r2|p}mZQSNOpz zyx>Lm#Njo^oGv@ONQ{>*FIYuLi2zW6L;`4tnUXon)XnLJ!SCG&^~mu(=vFC#b6S-^ zwJ*Fac=G&Lhk)U)0-XMMxd!8II#MLm9U>LwxMK84B#AoD&=R1AiYj@#ywXWlE+`*! zD-~u*Xi2Ccgg!4cno5*20cs=w2?j~!l-S3etnxO-YeQ5!VM?JuE+YyQYWgBNW$&hN z`QAT_2U1^|s6$K&F)_oD5`~Z=oBX^Zo^WxwrX&Ew*nHj@v+g56?@g0`b-j{N>5HyIy`Ez93L+jaQF`F`_kFk9|g!TYfS)oG?h^VuUy;A(<Xtlxz@2L-^*%AZPmRtj$B1_R7IPOrZ$P#{IWLWTpUV?_*|StAXQ8gwLN6g z7j#<$(h7|OL&|GcAQ_+y+@bEuI}FC!yUT#ScSimyKr9Oq5n?!t_)&pN_AAz7^);}T zln?YdDC~oBt%}aM5tTj(4vroA(>I6vutqaet4nW$t;)TATw@sB*|?#Lw0rbQe2F}1 zGii&>pjm}SRCYf9EgFs^^`RU_og{$(^Ei!{D<@6IYtwj}-5zT^(#Pwjcq;-C`B>0@ zlvb}(W3D~iYg<2xF`5P%0^=q@C_RXJKKIObkhb;VfTG57amWerlNG_03K^oYJdFvw~j;etC|^is|3u z&!E^ZFO=UUX;3u9EifqXp>aI@mk$rnFV}mtPy1d_uX30w7x1#jmdMyo@5##3Cd#x0G=gn6HCxy3ZVW8B zlIIv{){6=Ab*%*u7J@?Q?JpH<=avL~p@2jnL1G0mDs+?o4<}?Kl#ia6z$Wv!_#ANR zLdB^e0&Jr;%JMXqYzNodU3sGt5izDG+<@(mT0~k2WsXM&iKn#EUi$82H5q(|*A(<> zcO;KUMLKIj^VhM1VLLfQp}zvQF*jxyb3NmPS35uNViE7>s)x(u`?2{DIF5Iw)Mw2u zSqImJ{aa4{0OwUwL!UAx9*En5{QRDT)svk+y7au2MO(`3s}Rv;F9%MxFS>(s6$DBP zZkFrM>+DpWbOQP+e-;_so&7j7?Ir~6qWh#^)2 zb7}4wJjbXnnrulNx!;iS+Xcs&oB&KIGnqLibZWzB<~>xu?VZxDOwCL2nrAHw;lrRC zb3w(J(svD2@wv`~L?@!x_=NX*+$e5=pF6klTY*fNb1RpOKI^K@Qdfwvj;R)LRX4^+ zfl-Zkm)6`A)0mIpWbZ`usz5U5CEPo_K}R7o(m~4*5s^)DXAIGzQXEU+8 zILqj~@4+SWauM@5WxePLkXSz6oScL{^mG6r>qe81DH6;m7*uf}P^5vgNL)L55;r7; zS;R%269ZQbi#h~xvOP`4#?He}DcRd4C{=H)$BbGM zhrUs~YBKgjQ(=o&3@!>plxnWI-^7cYI%kTU!j>G7LCTF2WQtN}3-0x7n%|iC*aISw zfK53a+lqj-KA68pfu>|3F*wRcy=rBZ3v&hQ7ucDGeG6eA&-H#TlYYRZg60Qv93U#b zWikQeR1KT_=iLFjzgxGct=(;^t7p5kA?Ug1Uxh_QnDSJzNu;b<{g{R>nz$vXx6=F# z?!6Xv<}$5!x~gv&K1Bt9cmx0wdIy!@+@d6+4OayNtAsJ9;4786|&mR zd_|A8oCL~l#dAQ{DsoKFa>D-o0C0a6z#z_;FK<|Hh-ie42qTO{E;T?j0^Kl(xz|Uk z+3OPph4u#;p%Gu=-yxid%wCYWBQ_!&Yzo*28E}>@%c6$Jy5II-Q^y;%1B5B0ZkMC~ zTK?4MVF(zjKc`(x5~=DO)j=<-p5WW6p3c`?2`N|E!72%K122?tWGFr3yNf%`*Ez0v zWv=_vsq@mtUc&GDKKZM?;B7m|PjfM9T54eKhRQ5_g@`39a91=fdcFLdtP}5vpLUHQ%Q>F?3+BYnqK}SKW{Q>;(Q;u6&CYlO*byA3@Z*Z zew{{{YZ-Zo`5gtwrN+=r8vRzAIfKwO$Y8mPDIt5tEH#!cR->U3HCqHt0TyaZfn=8e z=$}bMvEeL{W0s_{%?_k~XE#a#TAuJh<4EI(BOh_$k#8zmLv{0)stO`HU43Zqszu3C z9!kkDu50pd7D=*;rdY*fqW%6A zW_mf-rFr0x%lAINXmoB()X8BVf&|k=Z{p^tsBO4AT4pt(ieZgz<5MZn+#6gRe&Do`8M;QgnMBV_* zYMC4K2V3A^e(RJYYRs57qi~9{!|RWXdq9*fm_w%ELbxkd?hw&}(=LaJ*@VeyOr?2Y!#Phq?W)LK^hE^% z7IjqtTa(|3c;K(Lj?^&(8=aS5u6D0AD@rD7XZ36<=qFeU`&hB=XqH>E1JQ3j(~Sky z+bxK#Q!TUEtWjS)-6+iZ+@1ghz?;RoOC(PVHHl@=YdjuotfTew>nlDLi{C#%iod_w z((Zey`TP4us?V+8{aPoBu+e9P6W1>P(OIbG|NVE^y`$#foBN-sz<~?c?jkGmj65-i zgSm>Q_fBgykD%5*qsLn4u99}YY|6jQYnCiWXh5d(@%vY#xdiTlL#sVtLVads6Fbzh zQsuNXvAtf>oo{!-XFK#D(*ZLv$5(7mlH>MRK-k4h)n>_~9gJBP}3m11XuX^+;`E@V018S)Vc1wfM z>iSY*F2*@$>Jcz+#{CD@4Mi&LD;CIY9iXByTyW)CLVwCj_Fg_;;?6ZOb{Bq)1B z{8};a8)wY-T~pe*jC-8=%Gf+o#62>~wz>_S?*VQERKT54FLK^S1O|HzT<-m1Jkfto z#YP!Is5%4w)BW+0qYfm3&z3t3)pEzZ0HRM;_7%JyXtRy5uk8_64I^CzBAtcEma%!6 z5S4Tg7ke0`br85S^4NC7eBpZ^yf<+@zw;{Ih`u8m8J~;9xP2Dh=3%rSQ?|i*W%M#bs~hN4L*l*i5hQZoC`{CLycT>S-hCr)=+MO0Nx==$PzS$ z8W;RbVu};)C35rgW_OSCws&yMrT|;s@WsZJjVrEv#RISWFsPd=D4&OxUbQd`8q0zC zNaN5AW3X^rwQ#V}ghyCzOX5Dy^!KeFp#RgdnLUw54v@$l!Ec8j%igE5k=5fMThDUq znz0B)dJSsv=VGWbZF$Funct6NH?klUgVhxfYf}EYv4wg}p?SVT8KbdC=ygr<33``u z^#@dgzq56yR5$E%$(>M;kNTq<6Hfw?31FM_p*M;xdZx2T%u{OZ1+85n@uxbFE+IbY zj1za3n`xpprEO^Z<%(j2Uj-8*FV!JZ6{(K((+7fJo_Cl@CiTT6gB-kToaSyZIB4fQ~Nd!Kl~Pj=Q}(9wM|k$cl60eqI6Lv^-I zvO-Q2l^3DBlh{U11W^tFts__qoU;kNAtlYmY}jo3HonK2$0NRU?h#wvP9XGRHFXA4 z;6-eks5dexJyM5H+;qX(OzzUlCNq+sw7G11&s^1PIcUz+$%`j!OF~xGCm{~GP+Jqp zySxZ3fvI|EEH2YVl5Zuy+bm-$Y3>g9xsvTTzd-R(py0jTGdJJX14bo#oB%@KBHrA` z!p%VGz#@MLpx!c5HYa7(OpiM|@c3E~wtz-cgdzp!0a%#8IXjllecEunpx=_^-oE-t z%ENKY5-r?NhP@M^O1;UE+uAWiWt(1HlHnj#6@8UTb||zX7SiM zI;#)tX3%{Woihh*>_Yxskf=i;)f%+Co}E(A>8L-hvy0C^_gD+SPQ%hyCM2A&FU8zu zb}>wnmb}}q`rVir-RL{L(x8#eVa@wCheJQWokw{+-a2znBfk9v4%sULXmN+|xH%Pm z)!XKSywUN(x8p&{XU!~Ca3Teeok4YfWAY4iF1LK<4PN3rxdNkr8i}pn#y_!$p|Q|A z^`g;;L}URN!mVYkSJ@}2%gPk<-+EtPPknXxR^!Z3toZ|K(+Oz9lM(Ow(sHV6;o;YJ z$>!Hh4soVZO)?N#=*$0BkkStR#Fgria6=v!)QwYz>&&Tn%XOKT6G^J=wD^Wx`9xY3 zduBMfteNr6h)Gquv?f>dB!B_*KQPNaj1kZ6+RsON-)hR}@wtgyf_~z%;i{%h7X&sz z|GRyNvL1v}wB0az{ef78@Zls!6D&lVrpU>fR@^9HrgwtbEF4xqAj*JO5-`ah+$qN< zcdN6dj+mH-L{H&82u?A7BXoT%+1n_VuJ?Ir89VXoNs{0J7ZPF}J+3mN)+lV_cRP)s zQgb6oSOEz(Rq#chTjnP1^TL#iGVb}dk=MYP3TcJ2FHO$6rYoY;2<1ZC3ZnpSYJVi& z1fPula9wyB_SSk((2l5<@)d9#^yQ&5&OSgr@rBK9-*FkKE+|f~iVP z1WB#wqT8>O+93ov5JZ7}Xf*=b$e|DCes_`QN4?PQAgvuUOp3j-*IEj6sa8 z{sIrw6F`Fs5^FWWW|aJCi-U51V!(k9G&j_uP*4#FGXeI2=k8f9ILt<<5ww++0joWizT27*RLg@Lwdd+y3j*ru@bR&p0 zZEAaY=b4xebrG@SuH%S%P^?D&jQxB=yMWWuQ$5_oXXlxVoQPKP8Ni`px?zeOu~wlA zlTW_I!Ne81{GuJo>NbO1a%gR3Tc;o3d(Yc_?@=8$!(9GM;)f&Jkqg;!!+OD&4{eG? z@+4M}w{9uv8E`0>PMS7!h%0>brOT0yU~qT9Z`a43bGl=plt>Apoc2&PUX%y-^%Xzv zQu1HMX2`SE=j2>a2dQsF7?iyy8Vn%ncGmbV22%kWtXoAlakik01)_ecZM_J_h^jvYAueogiJ8i#5T^{Cuh+ZvH3d{zNf`}; zDx|mIC(V7t^Nob#Eo-(1UBm=6Cwz$_p?^`>e*elz0(S8J#-RwN3%wch^`S%7=jV?F zd5uQ_{<`0Vm8^OQudHa4>vwePYXc=h*iX0ihJ02-dt@{e{u;TM;6Atv;LtXI;vjV< zB!1AwE2OrUjw=c>c1cu4CxfYGu%SJAUT%a@kZGJxUd;2GBD~6`05>_gwyoaj_ddNN&M%cc$k-sGtXwLoq8D0lSpGWPLC@x-sH};D zO^Q#D3*Q{=mdkBxmx}E;C)2O)Z$W&X0LElP+^Zt&vxYl9-KrTSB23>jPxCeOxOLYc z{MvuM4d~<%ycpcWx2Efsp;5FP)`cEEYxb2 zze<^zK0JJrb4l6Hwg{WXu6JHI=;obPpH}`_s3XR(2ZMkl`H$6ya_c?k_-MvCpV}o_ zqOFp;D!hd*04V_XHf6qhgoEFa3%4Js8Qpr%@AR7NTgyFf?)vwBx<`F?%L=-0SXyJG z^ACN7OT|GlG)?2HptbGzNS4oHQQ_Q7TwjnRPn#rw2x9uw3LO^-78uELVEEy%ldd=x zDMx!mP!n_De4uT z*-TOclD=YZf7RL6pwEjP9ag(-^P(DBYlInPD!U3M2`0if5S^($p49^fn!l9zHjV+@08el!B- zM7cMeTQSKbu#M|1yit>ybzeqG#%%|-bNnhvWoy459g+TiBdxWM(rQ{;&ih0WUnOgg zl-t^OtdE15e&wSK-+H?@{~X_MD)lrC$A1bm)FD*$-9c@_Ee4#R*U-pUDuR=A__4o$ zFo5wjxnnx(1k=^W1}tIHJmei0vN$}o*RGY6bp(sC7tZ~%%K^}NiRr0GUbhWUlRFe9s&t-rTI#;%{1j$%QcCb^wTu{ zUy))W1)(2YmT%9jL*6xVyZfHitxr}g&@rZ~% zi6|YQzACK=h?{D|rRjZw@K4r@8_k!N2MlIv8~U(-V{R}6FsX+ioWgn2;Ee0odZJ|! z!}R1rA%lEM5<^Ne?2Vx`wpZwoHOgGaj?-R-xOXK=tUaAPJbKzN#+z1KOafRqdnrV|Oc(oq9f&h} zD`7FBpH6(zCVNKr$o#`{o0r zkxkridQFiLu$0fQ3qeCbMjSf~@wIa!OXfm-!3#YH&Z*Z_HGX_089;cmAa9 zUlxCqef3kC6lLlCH`~k~m=IO@Q7^3pjN2Ds2b3Y8{WmB*C#B%&9()CokaY|p%dr}3g{nsk@*~g0R1HF&s%-@-n zExV$i^uKdpkr_o5 z2^`B;?io&{gPGnaE+1aW0J`>dHCVJXoh4IxoW8kY$3Fkn83StT>pfg53hskqUm1rN z?Yv^Oo$GA=i6*kvv>kL_e)Mtple-;vg!kG$t{kB+gA+^S z-XxGRqGkUznKNZW`h539O09`Mnc@Ogd-cU}Y#6PmqLoop$!Q%UjnVv3pZeNwlM!6I zH^x5CCwa%u!u6DnuI~*v z;~i2X#Tu@?Ac4G&%erx~-zu7qp^#Wfbzv7^idK(*=O~Y}TP@u85%30uOBZ-*-95xJ z*8T#meG1SYz}a}ke4nCIfs0ZIMz(MDb_TX(S-y(4QHum?cgrx1Ho)8dry~CgW#A7g~x7+GTs}Dee2ydx2)lSkG-Z$@6)(oSe*&BS4*Tu6106 zJ5@Do)b;c(?hi9GjZDWR{R?;k?y^THdbj}$++z6XY2yRzmMM9mbeB}J=;V>0h*sT0 zshDJkQBBxoN6&^{#E20iMvN%QJk6NPn!>*kCz6uiV>DV^rgSShpW(vWzGh~sigeD| zL&*qwN+uE&6RlmPXD>TB#Ek_@F`cl}gUr*Xawbi-TO(d#YdoQTYm} zkc`+6xKb{zbhxrU;L3Ds%^}vZ6@W93T4Y(I49?qflv-X3s7Y#@Xf_c9rE-(sQK?W@ zsi_;tkw+@vJp0WJVKmGCehAU8PY6+(e$LibVaaDi#VY}kJubdM>~B9ih#H4kY`9UZ zmQ^lP$#aD8oFSYJVW!o4dfBR7<<9lRpfGC~wvDi;rnR(A-piUsEN0ie0yG}xlgem~ z_S}E;dT9wglrcLlqB|cBkY_cp?Vn*Wd<6$vCaOB@4ExTw@2D4=q`d>3{57G z?3vh3dDE4Pd3E#^^H{?C{Fxle=iUscq~x5&BJ*are$tFaPZDFn{3$BE_CO3oQU*>% z84xhu5HroQIix(L0)&>ZaCzT``-M2z6!M%}ZM-|*$1yZHH)W8t*@#UycY<*nA5Lq_ zbGiKCD%}SuYh|7Uf(Z|se23(n=%Vi?U0gLvxSoDO=7M&TkXm7|wJ2EhBW?Bp#%M=5-QklQVL_7BynQydU^WtNv z*-}tU#eVf)peh4s1eOX%<4%5ns{ItS2?^nS%K$FZiow`x#%XILv^p)_sdBC=cpb(?nHOKXp`du;0BfBm#FG7FD9LA^amS<3 z>S&U&zZHW#jv_3{({DoY!7v;H}8rSt8omYq5#QJSrLRz ztH_svhSrAiP&K)4+{PNqZ@k7Y&0{z|+h-M&*RmBZsyrSL#j0_pB%aS88z!r4TmiEF z3)5><1U_G==T1!m%v#VVciriRR2@BgKQ{C+E5W<0@>VWJB$)gtxBXRKHW3X2jQ|=6 z++Er8vW?&{04snFaz3EN0hWN4fR=!kKrexAfU{J@BkLKMi2!5C1q)~aZ-ZvD+zJMY zXVB0pH#KwuP8;MP8i_0R+2RAHN2RG1mEW9mmC+shGUus7UMWM9D=g3I?z%90O_k6HysuqHe%)=v@loTogR+=nmcUytw* z$w&RRDt0U%5FXT=^Bcg=;&l1yeh5EGMs&!67tkvVW;BH#{Q%;r{9l>qm@qQ^Jc9XX z6Nj^+YA|*z4L*wq^noV%eB3e6R9IFl?Z}F;WF}8^~-M$rGlF&lz*3^nwxu=u)p35^?SfrtlBz$hXc4&$Mw+9b7}N~LP^=t zb--r~O=EbB>xGI3JQGHkSz0~SI0kIx6Qk;$Im$_^eOs<)&*hnoi{=(?GZ#TNn5%00dY5w|M80y-Sw5bqC$CWXcH`tI; zgc(i!4YXEWP+E6Fvz9W&HFBZ@*zN}F-ZH`g%Hy_jS;h%kV$WF{H3FJdm~OzyW|K@? z{X#(7jJU@kQcgsFI;duzS_+yOg5hQIObz7MRRkKi*UWX}iYE)5j zqYFNY584DkHY}o1lOFeh?9m}P*Q4WCzc`BEz)7l%&vs|Q-3m}#)rtcm2EtS1557nN zJdTY=<6_yFV_H@~5hpxOMzuIcHc0sW!u%kbjEPT#F9H#!R@bN2*6*>tKJy{D?iXH% z@buqWiesHxvFdfolt*Nxo4U+yU<=6h41|833Uo*M3{wV0 z!}b;Kfs(!oN%t9fX&HDLlZ<6Xftbv{1A0J$%a4GQ?YG72D4MT3%DlyS5pj)s=jr}L zyPk95U?O@w?C%6eiZ{OW;&I#D)4BEEUp(IXeS#RiI0sPp;~e3N7q(e0g%Ut?N+n5p z(O_)pN|c29AttT$fsKu*VP3qeP&Wc@Pf6ic%!z_d7j9SNbS4?W=>EedWw_eA_0dB=R6Q(>6F3A>OZ z^Z42+T6BDQtNpnbg_!*I7#7`EP}R|g64;7YJyty9O8YU*lb)YE3McP!1YV*Or5!~R z{(wP~-kaUA(-gp~p9O#1GIwA8Yt87m?{u~Y5}6~_SCCw$GZfmOP6?no%krE9PY}_r zp%-3lZ2M9yHJ`meThxIFZ zNcM+R4D36|M0D4yI)L78LQ%MpcHjb9&z` zd-d4^CYm)3svH!-j8$iG@Nd5~FCb*QiOA?0CL!h_fXPOM{ z^obopxDfOhj5da%8+r`ojmCS>-vr##$5Wq#a@XUjCexzWn;~rbd5SOR#cZ3e@x){i zmNTnr?z2@gs3|dex>@uLHnHK~1wugyIV>u@+l7)$7z=;`8lZFy@qs^^wzJ`K&ezOY zfGp%jJGr7SYgEfaM(1(}s`81U7nLr%N2p4ngkg?iBC6vK@e(M(vZSm@u#KCB%G)_& z13?PhKN-wPFaY*(r?7DWhWg(H@XZ$F%b(n39! z?@C~5y$UO5`;V;4ELOA3mg({UDWVpE%@o;Oz1Dbg}R-_;?$Ip$HE(fCWEu!=VMkOvV<%-H|}RX{eA;HfGz5`o3xO zri1Ek7n?oSnP%h<9A;~tLZhfuE4ZVICBb6Kw?GI z`j5s(+TZ5-5~Vv_t@r;49feN_2m*|QJt!?YC#f5`M_rX|mWys~2JOvemeGwwtFgK27yt6eDbJoE5VV9Sj)|J+~40f=n?KS$%@P_%#{5fZ(${cd|u%1VyTXcj~> zt*_tt2ruxe{w=4BktlyP7nm%~Y{OPA$Dn75HWYD5E8b7LLAslTFn7!e%>`vvvYPx* z!#p+_E~SDKG(n%LRMSpPJ#w1ux&-s+Ht`EE;wC*KX!(X!R-&30Q_Mm8W1Agsn^?97 z3M7%j#DY|k4WWt$w!(sDaEJ>p!@Y+`5pI%ZDyB#&NmS+4mwB#6JP}Kzcn%G^=%)o= zxtVeMy8CXA^5M2r85>dG!0bRS$0qng_|n(9*>S_3K2d-Zi?(lsg3)2pd|vk)cnIur z4fLf!+~mFAi~k(JiN#}a5%1&J@5JttT~o6_X4Nj4>O$es2cyUG5j!g$;L!_A$q1v9 zWSrg9-j;wa7XH@75D>3zZrS6r*idCL_#I6M-qAgrTndX#9jR<*cl-UtuCHV28$dV=@;NGN6D&-ip+y zK%w^?P}ciJQvdeLM?cTl^x3zn-X)*wmA(~nun;-ve63zo>;~;XLqpU8NyFW#J2i%& zN!=;*PzOh=;USGuu*bm;@quP^?&vbS zp!_bVu@Y2u*S=;-pC~fAKA9wrvc(&1nsuOHiEBBc6rH zX+nxuc`DP&;MUk1DtP`q<-=WXGHD#ltLJHFPDI>{66mORN%fA3<&q2;OX@yBX$r}- zeE&D4brtIsrDSU%(sX|EZJ`&60BRJkk>z)-R3Ig72u57G#vaEeD&%Zr(m9z7I2shY zn3}$wQztmt_Y25)yt8KGf_4=^qD)oVFCHAE+F`tk*UV)yUv5@Zq6Cwn{$y*oe`@x4 z?-YbN(c=LlM&PiBc`|-|%3;&AWEtiv;5*JQoI7xY-S}(9eI%U9 zcus<~ZpZH+a5Q)2HzZgGo{GNwZ*rG^p#NqL$sI0Z4;!n<*aKdn>mXh#yNF%U~3kMhz|eL_!WK*Wp1#aOCf3- zQyXyx6m%ddvPjx?vB)=3gHvmfKSlaCz%NmQ8Fy^$dFCv!az=g84I?^)L<(%w-ZqHN zl()p(BH}o88DIlKz!tebwTOuTbE&~|{>I@yx9aT$NA`M%eo%j}(3g{duC|GZ` z^*cjz+?F6COpb)=)k_8@|Pfv!Az^XpmH8^`8HoVL?^>$l-aHD4R^sp=y8A1)e`jYZalU2fq zDv5>D08K!$zcj7J*A!fl0AK&kv~JXZ-?Hg4V1QazEt=FZfD#vd(ep+uS=_k7TS0pE z_J2dVrSzMiv&eK@f=U;EmHdiU_}*+$1)2-nBuU9VNXC+eSZRl%>iX){|c%@%<{ zao{`;d&bbawS8wih;y$mY=OzK0=27_7Gg#ZmkykHTg1DLbZh?l#A`kjCCbbb*1awk zdZfs1MS?4%eyBWqhYXUrxB}M&6-62?`S{l8mKplGHbX;<3*K}%qtlYt`EeW14ru$1)|%VpHJ*^FBuHSB7lg2y%U zAHhT%D9zX1I$HTKbZJ4D9%;SH!okLAG&U?8SPvDgafT^Omk_Ngel9!E>g7xdN^hMt zA@G-c=ltIecQJbk7gAXcO&c6{C*ilHHP^77Gd~tn6>ntR-K{Z@2tmA?`Hjd+Y7Kp~ zRhqIW3S!YbB`X{KX-V8LZ+F9A(OJ!v;Z3Klr{w$x+FkG&<9uV(RT4u(?SnJ!h9s%k*Q`i>jVz>Iy;XZO;z(XYmb^&thm8s&Uf$GXc4uVH=N2|=fOZpA=%j28VaWrhPp1x zZJgU;6x8D=g}VavNYwlkkzlvhkPTyWpFj(fO?v6qDHyz@qBT=?r|Z#iop`?j89y*p zpx;RU4shhnXVNZrymphO=+l_80gGt-eZe>02c-yVqL}+7h2-i|rZM3zp1xAKDMQ8M z&D5M#OA@EM;b%{A`&)5*mS+;ZP2<50GUVU@P-1uD9YOZ!3JR&IiA>vNnk0*dUHgwO zsCtutx?e|peR$9C({&HJ{xzh6NfmY}nfPyuIp${%|D?&^p5s9YCJ%rsvdiV7loNlr zGL%PGO8NnGmju%TXfEk7pg#qz5sZ~+t@vRm0vH>CdRP_$aOHtL$PDg1&U4)bD+1+X zvW=sc?jynj*|!AwU4I%X)R+|fld}Aqbp_akyk_COcvlEjvqlV%rX8-{wow!t-~9yz z7RrRs41Ras0xHwVdnEqlK|M#YTyjodgZ^F9QnqYC4rwjY=1Xcc1mPL#0;Clo5XTL@ zi_pMORD!=EnnFNI@Q)nxu1dEX1k1-UVe`P^?ml<|XHup3Ua6#8pPORm!RbS2^lT8)ULvE?FO59Fqod#}y42{6Dr-Jn4 ze%_1kSSHJaJkEdc!-iLFqOVP??|XEv+L-Wz8pZ1EJRh4m^x1Km9J28cL+RVbJC`F{ zsFPcx8NXdV@Q7J@WCkWIV3$>>Px272xXhf^c8Kld$Fw(mx%@r9wYo&B0jm0xL))P65|j`+glp+) zf``{EK*Ra9N)!G}xUCX9y4zi2{(`2} zr$m;DPB6-L*{<=m41E!l^z0o|RK8KzZti7%gl7ads`wv^;Qq@%L~&bNVt9Z!S*S9D z^n0zpFi>#cesJzX^6%&P?0PhTH5JOM@~V>XmU2?G?omY%RZ9gH%6!QVDBlT~0(UJL zvn7%-E^2#3Dx+qlLEO|4*h~se)y_Rv{L9W`pw#?_;oE=W+T=d6ADmC`5PHq?BV^-Q zG8ZcUaXok_5))pGa4{4P->&yZO!~%m`0N<_N&D~r=2M7&GqCk(A}_f~v0_v?9eg@J z2A(}A=bWVneW?wl&Z-a$R#|DhR%CQY75sCV*uYYLf6!>yF)q7D3Z{RSweNxF$sU5p zw3GzGvn%u6uC9=ZE?C_x>0|UOy(emAhxf;dRYGn_*A5egULp>Yu2t=D!>D9X_J$pi zYihcR3WF$JQ#OLs`Xe0o!bh?)CUGeVl^_x&l`2y^U~;-J!2 z&J@h-cUa}sdg81WDNmOU?WSw?M3Y>PCkU|CK06Y*6`x#-=Oc;2Vj+OSo2Dq6LQM=_@bp~HGnDSxoD9zxVoJ<8Js z=ZR5Z$W~S@dyucgg@m+yra20*~To@Z)KHp|7`jE=xipuMOb-`4})pNcX(^TS!@%cu` zK#{;t75XGb^zksb(grVg*A?i3>{n=q#LxXXn>O&6WFeX1-M!Amx?B7Hh3@{@exxOO zjSuCqN;lRvJ3x0 z?Jt%>JG({BcJ*pbGEZ5uit6y0d*X5&EhG||N?EPz6w8u$t0Vv-qQ5GC>#)wCE|y&j zG#L+ehNF_-B}dlz-eYIaFW++Z{L(FFjRqM3{RLu_ylwlz$pybe^KHx6;%CNT*kaD1 zeW5j0+lnj&hN4TPf74Oh=z?&Z*-(wJNlntVJDp{SuQ4m&2+!H$KAU zEUQG176T;hcjc`FYMP?MfEEnhUUD=6x{gFyZ-OqwI2EOx;34DqBO3u?mkEq4nbwXUfT^|xU9~^G7Evvq>}Iq z%S&Y>K6-Se$fnTB?Z9VnR>uUmJ=)fvXDDf6=Tm!%^Qc}lxks6fTc`Kj{nzh?MTqf5 zoLs{_GfluN_A|IEKmOZSbX6e{M_Z~^^4TMCNJrYpcP1@ZRmHxw=al=Kd-^dE))Yt* zeuX;s#KDi;eBx^I)e!V!QK%OxVX*A3z0MNd>`^a6dq+Z55I*)QE)~cP3gJ752`r6>-sK1`f1hwv&9Vj-TAiq8ZtixxXrFH%iFCIf zJva|mxX=nzu&{}1ibqbee24jY5d-ZAH`1Yy@Ks@gDVPofC3!T+X;XgltCjtL1N48DtFf8(!|*`|9vYEM_(IQjPRzwu5edarV@yv>()w{tj+47a^nzq=o$P%<4{^gym4shK8L=r<)rm^c|SP37#Lhiu9h z;<)(;`bOMtlR-kflkrh~i!zp{O}(ZyNhUL-=elsitUb1Dq~njWfMwrq#CLMI;>xrG zO!@|kCoof-m>+b@?Ru8%>;QuIa}7cv=Q58|JN`Kwzdn~N>iGBBRBObT@j8w}o!z10 zdL!J;A;LuFHaOgPwzHfjcnf5Ki!Wj5oRiSOvE$fAcg9S$m%!rgcSQ$L7 z7NY1jnLi52n~JM|q)oIH1nY10 zPrE6vjhkyJBf&6}T`q1|EqbLl(*V~JXJ9R26P9d4^lyqRUEc8YcGTB~JA^Za1A(yM z=`4B4yGK&kEKgrDFPt!cq%zuabjUHGNj6lCmxQcU0aO)1Mglb{!fcc+Jcg2%+xK5B zkIdZitrKQ;eRAs8b&R5-nD<{?WPEK-u6#hnatsHa{0f=xYxsFhd=vMdFMSjGH~Yu@ zvv~QxY0!cBvVZ^2=d^QCx~G3%bG=s z3#9?`=o6foZ;AAZm3lZk4%Tq^2E%e!bbBc7E<+&80Dm}0j|7ep14-+=8rL8o9oprC z!o~@CaA17Y+X@PzQCyOW_dysu;vzt}GAfO7zqkmIXlVeD;#Jn6N1Dl(TKJpIz;K>3N*6YCr?i1!y@*m&L3 zkR0R)t9|GCmU*VKDK1!<**-%bXW*hy5&n>G@Sv{AHz0O7PLQ1@0ns|+9MOj z?-b;nT35MoMv?6u))FNK_J~qWr+W+o5eC#`QbFIqX4q$AYB=Sm#E^>3BNK`b97ujw zbC;I65zOT*1ZHdjEDBIjA-W$WN=X+?>2WGMC(KGV)=blj7Rw--f)b^q3!n$n5aspR zjuuMS*kra`crXo7o@-j6#!!5+6XvXj=>OAQ>#ZE2z3LZHydcoY9qAyDfK=`W8Vmf% zp}6Z8@nnplgEs_dj##p@wv7!Z4=PsW4W8f-Z}X?t0onTCSiSkHxX&~mbQsuyJNeI! zxVHQV*2~V|4*qgq$Wv|pzKY_jM)Akqm8Fcf_8>|gQpMtU+1OYNdxRA;y~t(`L{5BZ z$f#*$KZovqqUTH+_hHt^TmbJZ5cu_S}Ddonen4Py3q4n*rpHs1i>>i?v z?S--ITQ>0Am_r?^?g=r(`I{~cRq;a)`V~M8ab3zvu4!oX3vfbK8AJV7srkSXH8!no zNb4K+Ha9p^6SZpl99gkhYhm-TH`vtd3ge=MTQ(101htNI>|hlZ$2;IcgWEIVMkrBC z3^LhnNjo#$nR|kB7oFE4c^|8TZmx;>^epCN?-2aeluOq0tO-2W(Xj)v2`#X=2O)w0fHuLSQ=e7>3}W7M~%nQ9uG1a@2X#UIP;`Tht+ zh410(Mddjg#Z_0ue;%U;PGd&zKtXhjl)&#I72a^r;nMi{@zZ4ZSj7MO_VX3hC;+rD1;P z7guMB+o+x$a~J%BH;;Q)bJ-VfN)?VKhh;HaT_2CvbseyF#V;>VA-t1j z>Nu7{Sc*koPsv=Z8k&O~UaYGUUnUY>K0B^0Mz@eyr)};)+SH;Pdo9q0TI z)h`+gc_N#OHNK;nTxp@VwJhe&@6G)u?wERXKNmMD~qZ z1kDmhn0$gz7ypiXg`XR0@bCqVx3)i<@yUEHKlDME!7)-2z&^pg4fB%$-VQQ6IB9d>J zW~x-*R3H47zWrI*=QkmSz6~qttVo9YLHgR|s%kHzq!1Vf6M&=k%m`dC*(-9p3%<;!XP2*I(`?>_{~rQ9)*Pu2;%Vc)(h!&ks$N z_S#dp(@N{PamcyTdfe7-*i$HR?TH_%^&p4)gxL)~#`BA!84A69VZS%&Vzg2!$X9I? z)D)(!ag~A-*COzf}0GL$Zky-vnl-Wv>N8ZG9PggdOnaF=8FthSMhb$BPx8 zT?zY$)>=6N)|+JdujGTjeX%k|m^COGI7n{RD+GBFz|}y>AT?=P%cWOh8SKJlEf*3dLA^?qfo3~aVQyWO)~KTE7)Ix z5;~48JM6MyWFq_~m$oiq$7NWFm_WzetY+UCWwV_B6e#sRrF{-@m)e(`Mo2~23U5w( z7Tg74Mu{ezD-GKyX0?S-$saPZ;8e=t^rj6Kx)G2g> z)1VOa-y(6cG8s;r!SS`JKDv(xHgJnj@?G01X|~ zLV3!M>l>{Kyria$RRWJgOS@#LsLMSYSZVSi+x+lUz= z$4x7OX~ETG76e>T1HQ48Dc0h+BGPo+#VzCZ7jg4E%y6VIN~y{(1%Q*R#2AG`i@taC zBS5Up9lX_PoOu;IxDONhgLJ-Dvswr<)j%PIwO3gmP_LPOY?or3P#ornn?pKyTAmo< z$VQPew9XhwtN;s)QDJi~>ZIq>yV;en=~9y7n3V`)Ot94!C)LAhJG_GXm$Tb<540QaZquSAkqan8t<;yQ_*M`7WP^izQJ_{WrK( zVSw9okTQ)j$Cm@|ed$~Kj&1cmLc4WDQ%Z?ancBG2m1;3mEB#gmvyP{JMwQIUpW1_= z1@K?GM;E4I5IC2DXfWtUPGhb(Q>+e%24PVkNAnP(S`LlwQe7vYTGiRY+}VB#n3}R; ztxh=kK9wOvPxnfO99Dp%HbEt@oF^-wtdyRU<_2Z*s#?%zqOs^-(^U-`DG`YeLjvJf zC(l!}ASg`nK`8J|CsmM)JK|dN!;<6@pu~I`_w@igAflE{0%3Q6e! zD1DrPYDB6l@$-bGqZySxvn27oMeq%+ACp1cas2wlFIYjFVcoC48C>NLIpS}FcKFzP zhI(s97_gMBICC3ez!C(?^nfhPmFk08it`do`Xs{#cygVJvG;Z$C!H4XsWr5Rr&ci> zx+{NC=jgF7b)Zkc?vFbNMV|mgXWQl23RGvbtk~OdE9yd4T3@(@80kxgnAp z7R!93@bYn>>7)bKZ~RGWC`Ot&1lSP|xG%KXMm#JTLTJ-2M#%~K!>*L(ECUBaKM-j1 zFjsx~2mm(;m@$|Um^9mN-pp8fxA9o2| z{bxEPJ@cMrZ#~Q9a>#mwYp?smUqi4LT*eNcJi)*9V|xW-g^3x^^BD2*Q?d1btI?B# zH}l%T%MzMO+@CClLvoOZ?<}JDz@ve6obY#sY$s|D-b@_YW&G zVkbvNu|CDzp~fEy4*u}stv{XTm8wc^VC|6ln zoF+Q)j|Kokb1OL+O@-NZxiJ^vq%{rR4|uIkXYMt-i+xX7Ge*iz4i3MYm(3hI5%^`_ z>tI!474D_^7*!+x|NRM4;X_%<5B~QL@Sh6qHnbsDW@n8?q_QTTFkriT@pqgC@MNRA zMIx6>Lj|oN@)l-G2Gq#33^OzPi~j9l*d?8+F!#3q`!G^Y<{sj7vo)(eEF93o{^8Xy zXKW-YOa8ALtMiqV`3*(fc9yRH0A90XVCzk&CD&5w`>#?k3X+(E*RbQwzE>u;UE zof$d+4rT5G`AwD~PsX1Revb|&BaO){qQ8#gcn24|;YjxP{0J8rvfn{WA^W*seOXOA zPNmq=?h_NNtL}(oomN|DrFVYWuVFL`MZaV7JMBCQLhlBmav*=fyT(NZMc2+tT~4`T z8lf@`ifRI+AiUKN>!@z>|F9fil?`4Xr~HfZpv@rDExxboZNga_&Op*prHOBATU))8 znc`woRDM%3eR9YDuHf8A2%z1eM3(O&+Y z7*_WCs5IlUIg{h(-{DAf|l0W`7+KAl6Fh`EdM#*Cb()p6Dvzz9Zj!&YBp4=f!5DY`}YfcDN8(-)1OYZyli0 zg@bD@NX0Tk_9QN4z92qT^@_L$I*t2N0({Td&;2SRwNp-ixxhpntvJI9R7?w|QnVdY zb<|&dVN)QsW{K?uJ?ALcZ3wgQ)LGQ)@!12UUdtx|!J6&x4XI&r#U1k5H2JC;5Tjl!sC7NVq7GD)V716i;Ku%$7SQnes zKSnM;Dx9)<>98a!Sv~QMty{irhOkhJN_q2Yyp-^|77j)FO*P7KRKIF3jbWmaZ_?zUABC3Iw(3?B93iv$8d09er2qQmei9d7!_uBZE7b z&#ELsoKw@*(54AB7uvgPZAoy!-w!AH2M4njT@mg&j(0;9DPJt;*%l`c?N8=7sJ$ig zz{=_figi?tjvBfAuL4h8aOAo+?eLQ@*U4WUR6q1>Zrq{Jc?i=&b!5rwEyPB1~%eu9y^o^F9Ng@ z&xoWolK4K0(uWpXP0`IXr5sClRx1v{??d^P3v8CX#<%U{)ZPKe<+;6|1;j}(r^b_ z8C!r)R###A}XiQlgH>pPVOw_f?Y1G=`^Tl>7larcnqWC+xdiJ>TABW?$Aw zYbB64mgNd#HF&m7q$L{ctcxjqs^&!JuKD5f4ykk5y7B5@-P=JDgkZCuqz@b)M;;1u zBe1a~*Dwf=4Uk(m@xeS=qrGxd90m}qz!fvb%+bN=3FIkl-n0bC!YX4JrNW$7E%IUm z)G7!W8JW)(Ol{4x7pBfoiy5+-ekk^cLhJ)B$&BJDOVBk?=*Yb-F@bTlRr@^(M*1`< z2*n+REo9c3TlBrgBb9Rg#~`1XKpDcj0uIP7@;l{bd7zM4JD*ii}uf^ zZ8yKlrtyeF#G8xR4sY8!LGYkWedq0dZ2mzJFPuBdDVYcQ!SV`<&u zvzGNp9JFVoSrB#Y)RYLh+MBcSCl2>5kH!9Tq=-4ORJSaKU&K9h=&x6ryMVG^(BGxD zSMUk#om)^>6-;mEm$p`k#Vi)XJnG(jk;yJO-LeR^d(2sV}1&6MxTD{Qa@fR0=DB@ zB&H%JE2!#cI;xx`6KMlXAf?;KV#PG6jGx|tW{kmHMV#|jp|t@@$g5@$inM_XzmW0U z8zvE+4%xnR54%~Br&8n5U3KT3lNZkY3r}sF2T#(Rq$C3DKfZ#jASqz)uiyL+%9G(x z1eMYV6L2j27a=+v!Q)7y_}ae6^acCls?(fuCOn1{mFj(%Q^WMKyfY!~8oO8a+Y9PA zgOpRv;>oGCciB2Gco!BeimBCi0mNrD2Sxs<-es0WcAbnCT^DdJ%z-`u^`7`S^i%8% z;0$06z#Gw$pbBD`1Js}lH&Bknlsx$$UFAWnLJaa9J<_-NxeP~G3du14S1oGJ_w@BC zv;!R(9le;OF8?H$hOh-zZXHdKnRz z52k2^;apd9S*uuLthI6CP4h%$*PRAz*eS%&-#}ml<4s`_a+Q+IvLlHd}VsESyE*`m1oC z0o3fvtrGNeXG^oZyu|(Jtb;`>Qaj5ec>m6i`7HP1hW1vB&{eV;8flrYVok zj9zaKY^Hy~Iv%q(L%X@I^yd=@-lT}gsh-c~4zd!QHniQ(c60wSc|ahP_0Te^kp7}C zB7VL-#K66V=PZeL<^9};Ym|yo603&N2x;)Hdd=!21q@OZreh_5&H_5i(7He^tA^3j zQ(0v9DVI*66Lwd|?M|qV0_pgR7O%(UKxma>KVX3HH=E@biuBRk?{YN#{j=Hr~o3UUulFPGZwZ77?~Y5y5Y^Ey{Z8cxBO;5v&U}1 zS1-)k8sO^*HA;dyrgsR#5GM;o_Y7L3=a@h zdWq6EL6sbhU>}e)$5Yqixv?v>E^fX$YKLJM*JGmitwOWsia5ku(af#=*>g{QLJ><2 zWj6uEmK9RxMxDR{?*qT83D*0fDs(;8lQqkAp-WH>x-er_jei#!&*qZ?P^CB-#0xSsAl*UOzrwV-)43wTr|g^Y zs~wq^4=X#Y)CDd*NVtOGYY40ncC<$()y$VkJ*S|L!>Y}Et)!P1f)*O*c7Px4Vsi5+ zDk@-T#p89-d+*)Tc^fH)e8APn|HG)G+g)|Sz$3xPExuYldOaqf|Gp!0Y4Q=AaZik7L=GJ~}q{rB8R@KO(^O`xxdOSehif0a7_ zB2+-a@MZ3_X)1TD#2nmZq@3W7MtVyU2LX>ov zwiC*AccorGpM++!<-E@@CYbEELxW(gXRw-<>$pqJv zEvtX`V}NbbP_EFUvIxT#u)J3~x_8d^=89|X15E~krlp=&p4hFcM_aqs`(VDxb^J=g z3LZaBZH0+o))w`2gb9R}@ZXkopmt^E>xlvlCxcyswi`qB(+M|M7L!ZLeYTk)m8DU_ zXO#YcA=O5AP+-i2S*kN8FcbS2)Xt3VW%jkU#H4p7nK=Czd+?h*|rfuA#5`QE1=W!M#q>FiH4wp?a&Q{ zyor0g9!ez$tUi{9CCK*x4;z>tpi2fw(i0Y!sXVP%&kVCXA(tp!$YTjY-Eyc_%=h0- zPU3L?LCXgF+fW)1q_dCKI(`I~KeRognv0iJOfrZL05LKU={Bt1hKDcotHfn&E$xD_ z9WyGHhJCdfD&Rr;TX3z}x|b4AQ<0{dyj6gc7H^u_6DTz(rEDSyXfY`w+pcWtgpQ5G zXd937APRxGlU`HpFefx3P$RIiF)GCET7R1#-7|2_?~;~vj~OHhBpHO71Zx0w7n)HY z0W7&&(}vMPJ3a%;E`j?%at67BVk?u!nB!!G(P_w4#j!a@M zH!VYfPPO&SP%{ERKKNN72=apg8xL}Wx*-tdo1cb|4Z6-5w+033(w4&KKRM1Z`JzR4 zad$r_PbYUJZo{>d&FrqdoxW=ygm*{R=*pb+#HEPv-#!`0E=&p%oG6o z7UAb$S&Gbyh}uQ1)lne%=@zZ2O|iLa(oR>$0ffzAkUQjiCD^hx(DCr!0&*Lrn45p5 zP6)eejy!*BngLFy`K}^!9=7gXd#rK@9*0I&b0o+N+?4CuNdtNI*Z=VGlmAk3d0VKf ziX6St;Y+gW^WKk=k-nsz*n6Y_hFFwFTP=a1KO}>yCe@#nTuw9g(|vUf%5Vv7f1VZHz$^u3acYOjQ$h%2FzhRk$sizv}VC zbtS=zWvFefq|zG)AU?aCv}yL3#klR+VZ7A=a z6kjIMzz-lPAhTF&FJc_6h0?e)s1u+DeeQbekIVHt13myF0VpY+rVKcWERp z5WJIBtoy}DF5I=!TkLYpv`|-m)|!qE<-F?E$Zs2P9l8a9trm-X2gQ0;RHU4gDVUv8 zHMWZly>k7?dva-@c0mi>3#jKub~vjMi18C^=4qM)b0t!I`(k!T%pA=9w$}azSkHd= z|K1-pw;ynJ^c;Q=@m+HA%gw9r>tg_ zx>g;_9zUfsL#A5$#~&VdzjcX6FKBmJ zM6{IR^hTgXs{3{&biQz@K|oMcG)fxspa{YQ%pi0mSVxi;AtAw%1?;&F%FEWA&|Hvd zxP#VXJqa4ho5R%A68x4WvXN!!3p%Mwv>}D$QA88(ej_`jOfkkXL;*5eA{PxeAJj#d z)8oyR)RsZiO;SFn-P0nT^zKQS_-zq_ZZmn=ZiRMpNlrQ~Vjh6Dj^GhonG}HpDl*NT zB7zz`iSR%^ba}AhXZf?rkoj)`fpCaT%@y8b`tL_{Vg?-dc^#02I)uM{Yhn<%fG(c+ z5E|fsMIx+QFtM!X&hN$awwk#JEUv%2!HF5rwe&8FVSp0i;$%eK3~!>V9bHdauZRI^ z;m2w%1isdeZ{OO)ff0)upLW+G@D}b+xL&LlM?HRp`L!d2YzRp_tj@)b!PLBxZM|aH zvO!a&ZIWUt$Y&7qwaUXNZa+P)1+mbu>g_nL(r@3=_a!WiX$NkT1B(s>5)SrokO>WY zso{v~aA4rvVxBN5asDsCa-OT-1}4VTRWP^;Dc?jiF)B*WCJ$8@&PLb+^bktBs${(o zSE(KO!zdLw;Dz{WVw92a#z(+X=`0tx(z`GPT!4Be#&F@_P0|LmE=6U0eO}$*sHy5; zMDfpH0rnG5Gt8|7yA~<~YpAAgasl*&Ta9Q<3Iz0sO9u#3K>Cc{1j9J=)GUoy&aE2Q zuGd>s_O8ltcGeCDIX8Qqo~%HjgZ#Nw{Z-i{W{Zi|d+0wL6q(WMYvaO4Sia3V4K8OR zW{#7q__G64RsfG~Rr<3R6uyenemdbrgn!l$plWw|;%gu91|{jJx}}SSt&0;M57D9T zgkoY$V*{pOtBu=?kC(kT#(&C{%+Fu{##^hqS0VaO!v|}={zLzHKYA_pSE3-oz~$yJ$yypZI2BM z>^;9@?rj-YipGivuEHW1fcZw{KFJD!L935B`Eb@@R4BzHIJ#n=TJ~>p98A8$VkE4) zS1^L9m(JaJHHXG??6%doxl)No7K}@tv1tByj;^BnZGGiVYwBn?gEHWiic11GUxvox1hcI+OCGA4nQXqLTG~^fBGYXMTtDF zeq(xf2X@RLmme#@-#LU^17?!PjI3cNLDB%I1_H3a{&}tUM!g%e)xO!~R(2|Yi zW)KP$?ilN})YVN`jud0uj~2`V3(8wW8!vAnw@a>fkuR1o=H#E}%X17v)KU;OkZJ1M z1*SFqOz-!f*s}0 z%V=icc+u7bu-8+`Ua1H083!;%mXJ_7Vd>CH%R)W?cI8StQ(&a)ABN%KY~%Gq@ZM?f zu<{QV@5<~ShAbRrbwBWRBglGT?^B;U&A0A>EQ#!Xk9TChP}zrh6QcqNGpz_{R5#8f z)I1{kQI1%o)6J3!q3PN5&ZnG-XY^JjHIP;fM_M@=XP;7qP((eetJ@mnwW?(U)-8u2{ zZCi#vi1_2(5LX{k)wXAwpSYZDeByF;_v1{kLr9=zRG_>w*-T4I+l4u~HOWu`kdYxU z9k~$G12m(?uo*0rfs6cQ_FJRw7N)n>!WG`-%ta>533QTk$NvVXw>}BiC>L#fYv0;z zmM_U`snt)`dY`E0{|6}NN0OXB|K1!fJVfb&aE}o{bl}FJlVTJWE%Q*o)yL>U6iW3h8HYs#AB6e6G`Aj>@3m~5Ta4~DK<~>lwD36?GOMPuVjOY z62=bM1mZ;NYPed;B=glQU;-o}0^x3oKr9|SBE9#Ov;F>A+y27?Bu0}7@FLSH1h z00PX}O%v2=p6H(o1O(eh7p)kIu#uPb+?lk5G(XHct4d*^_XV1KEyCnzRh>&{73nV` zt6R&IbcuBApi)t9i4nPyleA-pun1%?id;MRP4_Lmph>Bi$$J=%9(_LGWsW78Bn0r^ z-G6@k#@U0zg+O@0zuwRf9y0?113tEZALYYbGYq;Ggmy+wCl)F{8{jgUV7r25Oe} za}(C)G~1gg9YDD|p-7)gsNDX8c!M!~Q!$Bw7GxN=Hi$oWEaMR4pFiWww%8QO8l6U| zaYAoAoC~Zwu7~J0#Z8^*>Y$I!VWo%Ea`?O_7Xk=ytFEpBQJVAsuafpZk};W?oGCd>=Y;_bH3rEiY~En%Z-v+vC;t z>gpY{e)mkO$)I>)tx2!Kf{iO?cg@d8{P*S9tJrqFw_+q8R=pT#f#F0GAG^UA?=^u0 z9_V#7$2v%Z$mBA>3bx=Hc`&YDXB5qgP4^t5eKue^vSuttA$no(7r_}p;rdim-RQY1 ziVe|T6RevohpOAydagtk1tkTZIG!sWoXtw7Lb|KI1>_YB7<^*x4rq~b2PiDw{WxET zBO(m|s1;*#YMSTXPX^0B0xU`3G?n<~L=R7rVPYW&B+d3wSc4UiFb|ZDn=x(g<~qxo zCvJYoU?tL87gXS0(3Y=B1E0d*}}VgfugXRW`{TCkYO}wzLsS2U;=a5_wqFz&MrRoI5+`){KU(m5#e;itzw~nJO%n9anBnV*X^UPR|MbBJz5>7(%+KxXo>~V)KF_ko2UEH6 zr|yd-tRP3x5|o&NXR>1Mk^3AAqMx91FV`H0*N^BskVTw{FETG#68z*i3hJL(oC6PO?um{6ULhTD|LbC_S~H_$dxncpyH#U-(`lE-xM9<)frz6UGes?~51 zH^5pkQ+0+NMc2Rgb;OjE!uN?_ttr}xuZt&=ap5i`#Wp z_Q%hi11FyErm>XMY~XO|Dt)g9_WE1(t~j~fzG;S#_Mbn>KSk1J*m} zbqTX(oH!>h-tH+DZW3`S>U^?H^^gKnh0Pf}JY91n;``GIiKRHSmK{8Z&@Ie0@{X-C z-)DgkD#vl-dQcft4vK?`tPV!DW(gulY7IK)oMi1kTu(5!zNTQrG$LjdyBrU-#?B9`w{H0Tss(UTp>szP@9 zBSj_gaR?xwU^%AAu2mNqBf`90S_fuwVs;W6s3~0kI%K0h_!ov*dz!oDdY*y^SQ#)7%R_D6E{zmn^fRolCSQhpMxZHqM246Sf~0+H!A4w#+=L zi)H(U9+P5Zz|dCq|Mj?T?qIhE+qI??{*z)RCR?Ttq&O$FGEs#K(8PprSuC43)O=Sa zZ8r{kX!4Z1{>`$w#EjiUS<#qrhMbsFjxT&D%hpXKL9IMnU9<&Iyvztez`?n|xrWag z7!O-C>9jWZ2EiW`YI{xn#Z&7oumTpKYBiemH8;GbPK|J}Veskbqz&iAY=eW9=2!(v zY~T0-jvLQi)0skZkUX{F!D>dHT5myv-ut2_{111%nkG6daIC#hDCoGsV|U~#K^*+WFHiQV4j8TbvyAJZm4s? z^vhS+{GdZHM%w{A`Zmw%`ro0P6KQ--KVNnlS60@P|5ipd4!Sf7ckWhpYOVhriWOCuWkm!a@Yy9qhJx}|JY#mL8lNIU# zZ+zt9@9PRQ*AtrYY8xhn@A8sS^KmLd9AJwV`-Z%cl16!xeASfrXtZ5tSBSl`GBo_I zLihyZCzRZ5Xv!~7aa-+n?ZP%=JYta)p6V1Gu#r5p(B-#i8b-(PRCU+!z!Ce$MJV6A z=J;U`c9a{7x$5J^+;Ji#)DYaB$oytQWe(2zvXhBn)0UsIt&|3Q8-rHq?bs z@+IG!cOgkJS(Uw0QvoXZ1-vy)r-nm)7d#v9!6vzqyFO8^I;*(Vve5N+zlNs$#@$+! zINZU!PhpfuAdSt+t2N8y9bR9cbsHoqo`^4vCK}s|EbUMPrVwLj{U{a)EmERY=jNsX zZCydePOaA5UT4c`In4(OkJyzXlt*>!plC9RzY7s@2;j>u=bPC=r?|oR4MpLR_U`@= z)B|&N_ror0+~ammlk%JOctHGl1~)Z!3S;DWYhj}AIzgR zRLhV%cNzLS=CY&S2@uoARsdZu@Kn)=yw(elN0^40DPh4_8v=YXD7SiY@!u;n{oU9V z;Y`@JZ4ezb6KhHsiYr8+8uA&#SvDDZ-=<@2qHbz1*7^DJLdeKa3&byHtttd;& z$wSz|#x7~lB~oDB9FyRZVqjw=`90`yHoLt;p=aet>n|^4=Ip`Hm4yR65fK~9(bY5w zo`@UEK#3cZgv!S%(HFfpZ)uUutfim@BY8j&ckLX>Mg@ivh7rn^6s9DNu$e)jO?<#a zS9tlx40gdfn4p6@n_$Xxc1#b-9oHpQT<*Z=Lp+7{9N$|)ZIH8{?+d%cqWI^*f4zM0 zy|AT?W~U0K&p|B7J4?@-yr2~%{iHAJ1!?7?xJyhzB_yZ+r?J z?B^kb{8N1SyIao`$2a;u_E#Gue?In0I<8CPdUU6i$gh#IB9@VRI0$jaJ*r8GybVE56J46%;;alrfypMLA;v+R=0}`N9N`l{+`V_r zGc`uu8JDcn&4~kD=vLV;;7)TKOE4upY?A!LXEwsbpC$GA<8T#+8pziOEbUU0!Y-n- zJ->ccpzdU{rm*y*5YB880#o-vaH{0&Z`d9+!ePTYX1FZu&em)nMRa>>ifFYI&h@@rs0 zih;Y&qAob%!T(#8Geg0riePYTuu34(RlJTPL| zD(=-Y*qMpRv9IwYIffGD{;19(BpRFfcS;H%N(OAbG@cY!<2_xreqCsTjf|9% zU`+}nQr2om{u(HBmv0(hare6@%#fLm`1N>s-Gh^J$k|oO(tWku^)eNptZB7Fii5^V zaM4}x9Zi5FEFx1rouEOPcfZK@k zepsP4!sUk!>g0z+-VqD#w<`Heq3Bf>?(#kQn5)-K4nt&+TG;^yWCKnviL|uKS`wU6 zkyb57esa?)kAYSd??5JbX{e{`h#d2g2!Ru;rKhDK&^|G=2h8AeL7a`Z?3H(FHVYooW2b<{74EO@5 zO4l;!&mQtnR9w8`+dfjgiHVBp85J&HPjgO@n-I&(?Is!{F`)e*E)+eNYONtPljL$V8ja$SjUd7l@!{Q-gmCyE7L>aO$e$Li41m(%yghD0R)Dniz znNB#DQAuH^b-i26cu}d!+UkPH$R(mUr_9^6I+m_I({xdQ zL_tX#Csd_hkt<&X$VD9>)zAx4#WjGW@an)vt3Qd(n111NJKWySF8kbzAo>s3{dVCx zaYnNz@W#*MF+|0(`|j@^#7ub1783+9{O275gvHL}RHCG=p_&j6Rc#!q4NjIWK3Cpd%hov!rvA)|hWrW;{1;(@O+hql>D{02t<^X?;!g4Q zt0ZVjpG7`b>;@0cW5>)q7Ly=Q(Y7^V9wqv2LIG2FII_S!z!CP4 z(*5RrJmUa&g0#-|Ho>@xS$jJzdLPcrTW6!G*?$wO_x=nw3I67@4#o+*9hIdeKk16D zhU@8*HP$4?BBGkMUTehG!_`)7Rm+5*B?OzC5Dr`^DqYSTqop ztmgkdU0Ayzy?mmVz-6~Mwf<3PW4lGTX^^>zHB?Y~AM{3G68axJ8)z4M7lSBV;~8X? zdq+{l(a#T;*|gSHh0mZf6pZ=~;X2jr3K4MeGTnB}ov`Aj_t;2o68!^ARs?V0&duXC z#SxD*#i4) zm_EKjpL_Y^0EV1*V;_-y&_%G6OXby)L`sC<4i+#SO{Ehw2eTCyEjIPt$*+7h{2 zwx!%iG{V~aEn!#s#~kw8$Z*-7pLM2xJ=fQqdJ1Fn4F%$r?x<A6D*2e+=FeDP99})rwZ`aZ4&z(|>Q7DZ&)B zQFW8BC1*`6HzHp7vgN=$S6OQ?{3zi{X2*Hr;~H8Lf}VQ;hg@ENT*J1XDp`{TQ=osK zU%h%Gy#Bv7UoSqR4#=<%g?!P20rIvn75TDCxWgReqlUQWy63d9`Im};z5#05Bc&$# zapZQE!LeWxrZ?6yQDXBfze|%ipYcVg&Fi@9Sq8qAo4}x2asfpC@<>5Dct2ALj4cxz z%-qa!nuLRy&KT2LbePhJLzJBUb(A^w=8=iXW+KhE)25?)NU%qnyx{{`iY9!ce6>x|GFH zf$154MmFf@&FBtKy1W9tsFdMSjajhkpdJ+T@JfYv#pcTE;(8=)x6Ba`vQ#Wvl;RR% z(Q=unVoQAE#NY}W$N6ba-%zaLH7_WSN?Ku(S;<3Ub3*RGYBw~z-e4SAIQ;wv)uo%r zTa_AVoYC!B6K0Mm9VOx3>dxZ#%RFNQ!YOC}dH69Gc<4nr(^64T8 zYL~V`9}bX>5C#8OMGGMh|5QKG?;5SKE(T8)aGCQ0VNnN(-q%^*;fc{0no+4{Mo zt41j7;dyGm%@uJl8O|LN#DG9~1YVi=Aj}nj zEEW|K*)|Xz(PXxDC;wB3cENrx(E7o+FEW1?-cJ~j1Y%R+Q2>XiHG<~UO+8q*IH2BQ z0Y|F{h^0J{HCK|Acfto_Iqy#zD0^bUm_tQ@x zg|ZjCL@#M2bfAo>SR%N}PVv0oe?h3lD_oIulGg+XVcn6Vn)=&Nuvn~5v6o&0FM zu!dk~ze3nDT7z)*Rs1g6qZZ=Q4x3=+WD{m@=2Y4ug`51^>lWM-nwDT42&4ublJ4W1 z6K857_mM`K`RRGAKiymXm9rN_z`ZzG(>HDwT(hv2Vyh)>`;{1jgo(&Dq4FDWi+i~J zveiR?5Aw^<{FqUpv>SB2!kuZ&gnVBw#lo0r$+y^rTPCl;F!qa5S?<|&pY>BW_^h)i zY|Zc4K#B4?V>_%r$Qrkfsw;yVEM+&EAaEsM{hk3gB>nNmfJ%G~hN({nxm*&{1B;TH zVjWL&79}=ZPKC8psiQ2EQCE4~5X?~3+{`<@!mJDqhi%`dre2KCOCd0NklrCg<8>I- z!NHcZ6<(2=Fx$4!%LZg^7xfjD^*>7#A4U*GhW+``bex==R0ZjK&JrVi8^|yz0j!NK z`Cc<+7j0x1C_D2Dx)g2oGRuE=DErvnp;_kyf z1~W@!01QH`qh;font>AnUx>8*NMV{kV9!Gts&&h2^4RVbcWI(!quvQSgTL2(&}j^Y zyzrinUuoK$X;uqJO!li|&+R@cj1`eJNOvx{=nd}YitoFc-Cp%tPlRdBooUU8gL7E` zpJQy2ul_%}c$6qA#~jkG8>oX2>aFzr~m6TP;GzqdS7H%MzvtU)yZo5o-Wt0O9DUO6$$F{&1{|I*o zsa&I*vSY~+$IQOnE?7#`E=Zl6I05PJ1^?EX-GjEgGdildQt45w?{X=im^L;N5J5a0 z<5*6mRrTPwM0*VgQIywU#`wC%evZmntNsA}37GNP_hyFRdtB1|Q3xFr z<*CG`<{Igri`mY79@K`;WT(%W&iwgoNDYNZW}yr*kLrn9dP3GAE;t=7PHpy~<0&*Y zJUUKc3K5u$+-fGfHN5cFPox#RVD@CmK+Mu1sq2R-%Ys@sf^B-CstehQyMNE94vSJd zzGMb$doPeBW|3uPlOFSsRap`NL!pOATufY&%+KATgkd2h9!0bdz;1(nljR1aiImsXAaXbx>|4t|@z zg#kl)%2g}7p$SB-4Y`KB4V1B-vzz^sDM0zFaP@%YOG+~c*KWhHB>X&qxHNS#Qkoxv z!4}-odO!kcQErNel@VG_mz`>~H_z#E9AvQi!eZ-Cd+VIegEvNd`<(8EN3`ST^bw5N zJzBN*&gp#NHN?)Ry?;(Oz*EsaJg3v(d9+jK^dWdmJ9|#2!&9`6&gmq0G4133jZ*5( zxk%)^9_E#dmyriCxu!#p1@v40ITwMo8rop=-nXEmxNcl9!9}xjpmCy78<@c2od+bQ zG_g@x#-u+^0(Lj-H${>K+Lq2}@|j3c`DQDeobXJ#>}& zWC5wS{JvWAQrV4W~dVIOvG^S5pEv@))!oorFclzA%-I6gUh$5&9Kio_xpF6y|7yZ8T}jd56nbrOQz!!<4vQK{!ko3JlQTYhEg%wy-Db0G?+}4G9={Rp zOZprk2@#cL^j=L=ii8HD(?MYd;QdJ%iiSE$nB2DZRlI88o+)a=|CofJ;@Tt$q<6_+ zIVf?k;CfS2>xS@hp=aG#2_&CqZtAHi9V$>3nL>eOG3Z+Zz)-=2d4Mi$L94S)*v#ju zNfci`CS8A@so8)ug4s7DyhjM73wu6jByq1U*Rd0(bRHZGaa`!S2{Zk(tscN^3Hh$f z+MuLXI}P9=S7i=(4tQ-4d2{_oKy%pXpTP>#Jv_qP*?47cy-eVXmK>CdP`Nk0WPoxZ zE`Miwv~zbD2&4prj^<%vmHnu(FtOiEctQ5~xAos>x6-hfkg^bW5KcDSP<#xn7E|2NSm~L%^*MCSMl7^ zk9S;)ugw1mrkn%+Zu3}VIdHf!_awd2+uW^$?b9J&IBQ5+?S>WyiVXJv9rFe%8!(S| z1h^IO9RL=Q$GZpI7;@y`of&&J%~4dprE1}80FX#UZ^&;tWs{uyo@c6QSTa3Xt&n(r!SOPD13B0A#grz7qdrqLM*VN5|vSdr`!$vWPutud@D zb(RJ`c{#LwZ2>NVXm||;%GP;F<>f@;Z|S!o7IJn6@@ukL?zkxCv6AED~d1v!1XeYY|Vvuy`_`i-+DaB;qS~A#3)i2 zW5|E~Mu4=uf0Xb4eK-P5{WhY_wdVN)56C!od9eO@h`-60CFF_n~i zG!`F4*QY6#{r{#=L4&L(xWFl*L0aO`RJib5TayNALKt&}qKi32VPy@0NyvT3wQF{- z&W8k63~zKhEb*a94n}*ZVsQ*Q`W;PZY+@;>-|?&ig8moxbqv26ZgTx{U&@2Ud!+2t z!j+um)UuIbA!1A(9%U+aK#HLq1#+y}u<+%~H5ZH;9_A+(y`fjaZYL=;OL=kdW>@S- zrmF7pB{;cXN?(tHii|_$^wS7Y#U^5~L0zZIa(0gTPM?K#Nb@9*{6|C;`|To)^3kkV zVkfjzQ(~j`D6QlwHMNu^qf!;$mEHJ+mnZWp`R0kzlyLYe1^RwOQFV@Nn41gSQ}Je; z=iJ&YWj%z;WsKu+tVn}^Xo!awB2=GN02W#zo-8qxSW?5cK)r*(xf|I#xMVI_Ru&4L zlYhy-SNT14e(Z@zDik&+tiaASKRRJEoQt57{Qa@q8$c8ruN#$oP*tQIksqoNvE#jd zKs&O#UcpjEmyYV;GG%;p1KKdHnIo+%Z0=+f=qAYl4g&9st%hJXvE1ARxJ1-vnSaxp z7lJ4Vu1kYtw<52AK8n(0o_}`Zo@j=o)P)TyyK<^KAvw&qDL~92K*)Xx5{b$f6r*-i zH5y_`!of5Zt*OJ)&=B;-?80^IPc;SzRIh3G*o&MehCrZtuWyats>`wq4qhaQ`D<6# z3KXT=iRpb-NNmF5q1zAvKPkc><+A~V5)|`yQG)mx8hr_B1WfN#)mD-vHYm$m< zYpEypEmUlQk~Y7oY?G(54GtSVeE7@_b9$IMGKdhIbB0Or1`tdnT)8fM;Q@!^=?nskE#*E>g{GuB}wn1sS{^<_`Rl>Je zWP$#{7{4unCi5dX&wl6KNCq+n#8b9@9yVIifO)J&IH4AGq^X3Xn>sYDz#WW`tR5g^ zM=WzdbKrEFa2-f1vBMl18KZpsD#zNk^VwiM8dx-nUTnLoJj!S1rC%R*djQxxi2ycj z;2Js)jkc&h(8xCI`TzQ#8XBmGe_&E0a}%i<^z&NVW{^#-?&JbAwq;%^|u9ZHv!PyLiS~24@O3<6lum_6!2A<8)Fq z;-+aPh+Jdo*qV6oCti8_kM>N`$(?R%em+|m;JfaypMxJ(LiY`B`3SCR;k>lDx9&f(PTJ$)^5$_H!G2_1oQ0btK0!jPj$`=pDa?<7rpaQ zF(R-y(WZ2JSH!Ph6Dqjr|S}*Wn9LSlAD{m?`rFv7~RMTw8WQhACTF_j zR94e}VcXJs5oNRVAfU(&LwtuZ{?TBHE7n($%147_uG9<~`Pym?H-&|CnVBwm*}n}m zN{4;-^7}hgUP1>-r2qvWlR&O0n3xiadV98e(}`e-kRVtF7c96FNf`Ed+WXZ!Aif9a z?I!`B`OF7?D~|=wO*>_b`u8tD@o5oG&tt?uPk8vUC6+5j9AaCr9)^>|cje==l00hH zmbmh&7jv~5@$L)a-j$xfuIw*@yiyTw|I+ue8SYL`7F?Q9k4!mqB_=Fr9ZcUi)RK3` z;@6eJ2G1c0OO1qBfNs0e4hZesrLC31wVGFsx=qW}Oyl`lYPqEO`~$Y0=Q`W>qQz!q zj3pSLJ5=V?rW#bBxmA2~<Xbsz~$GXi&iqR6p7=n~EDPF(UjXg9k?x#_V@>cVXDyvP(HYE@X*v9w% zOuX?&W3nvf4vsw@G(NWG9zOcGdekcl(WZi%5j&_Bv5d4Vy17_A8ZzaN*}RuM_d+JG zStMIC#kRuuZ(7jisx$c=a7{Z;(TxIob#JGG_WHE}?ksQn#HY|tKEyZCbzUFSni#NN z55$M?mWTlDfV4;TA!&uLcDDw4$I_);{Rr{Yb?=XmKqY+qvG!gXpW|-!6mQPuDNyvm5Z>7HVX*KTMA7eqLjM@^EVz6H~m@Cih6E_Ej2kASE(&}}4ea~Xs@hQ9F zn4R)hYH`w~^FyNBUs3WTSzAumSbw16y)PW(rj>N>iA&Ek6fI7gJ^$=IaY!fmu=X{A z$}PnG=ZFFvBC0Np2TJ~ACufL$8om?Vd-v<+6KmV|E<9s+Z#MV#XO=pY!efOC-xPW3 zQFca~b>K{3l1kxR@Cy$1ad(v($c5fiVahJt?n~<5{aC9qJfPCL8kG*Xlmd%Lb)K6l zI2CUX7u9`=CSwg@s1Ji+gRQggA#1kK>KlGb>rD_&+cMIEtq(%D0@JAy zc$g4a5TdQN{52T8k6IojjIH;E`3Kw8>UKr@T{A9`sP1Tr)p~IAxjuJ<^mKh7IRLZ{ zp`pe$=wBI^bdQ5$%`9KH7F#})Y-s<<<^TV9_XL$tVmt;!75mioDR#d3Kjza$2GmBxp!)2Dli|ONxny{9&C2w>or-9FwR*=Y0W6;W4w^%3-BwnU@ObXU zU=uZyX#NXqiX)rDv@LD@#?vMQl2^SFY&I)^KJN8eP2L>X_)M$bb6*y zvQoq?7-|~^2rwsuP5XlJa2%BXQAXoYRELyGtWzB|S!=O7e)WaKXx!!V`TOKxBEMM7 zl+W{Fff<#2D4&fE9D7$TEbt+{Bd_my!nx^P9A>JFX0G1iPO!mPg*cfBnnqdnl_!uV zR?4Z!=HTXFm7m*RD3-~BvxuJu4uuC9vQhoZs6H^$TfUd$yT*@IJ%Qi1-|9-MK0v&p zDwBPvU$`Il^J~L98hUc@kL%hy@Im0YaV%MC%^Nr-+0xC5fP&i&>*QJ4rB|ayM;f1N zZ`)KzDA{eM(O^>^75BB6cPFHRfn1xxB=k&t=N!^OuKfwe1pku-nfM?Qju%s)VCGB# zoyC#iB^=snQQtbSuWgzJO&x!)0i9hq^us8-aqHIj;@+dHfcpYsCtMqFWpW7NcQTFE zs9mS)hcg>#)oW&rFMw!wbl`MJoJlHV%C~26utNCbWa$_}QL$1WIUu~Ma|7LwT>TA- zLe`mz_;9$J3ma}{KQY9*K&6WM;p%58Pj9i&ZJN|+hWrsz%A3!OqEmr_g%|Nca(NxxB`5FnPFlu6(#?s6iy#ez30*yPbI9c)4H+HE$hMegr7wx6Oy=w=s+L8kd{ zLoDu1M1fEgaG>ghm;if%LxLbgfV6x;L{tgfpo8gX(YT zVgwSBIhl{t;i~KRzLFYyEc|A)N{diDJ@od1Qt-QQE7&QG2aVN#-I4tTA^VY+nfM9m zkJZiijmdE@DIR;|HG-|Ocu++)Bc`=a%z!*GzBDmZrR%00tN8AW?N{b*#`~zc7W_*= z0wC}e*9c}b!kLZedUj&HrP6d^neRzI=5rd*Ti?NuJt!f0skl?AqFLYVGb(yZPgf7- zeY`qDXcvTY*k(AfA+eB>%2xkff3qhmUzV?w%tg1yl|z(c;&!jxu4N^qo~6`fk{!=w zLTEvBYku>uu;~sAzBf@o+PlW$6kCk(-^VL{cC8-KIL^9pfP^e30V}1g9<9IZlVR=h zoCM_c+`Sj}i&31gR0uqkZnE145ot}hE_#b5op92`n`WUBW&)!{(zj+i-)&08RPv@7 zjc18Fu4e8&MoP*$X$OOJfP@GKHc0D_%7<j6Y zkKIhv<qH@-Zb_eGO9u1PX=318R^bPR1r0(hrfoEXXk^N&zKFQ8^k7 z$3(=U`8BFynds$&QqA=-v><&2BbfyubBX7kqG^zta&7&Av(~ZiXAv+)a#Tr6B=YHV z43vX%htRx>gI)ir|Nk*QCsH?xIWgFZrwp%v_-;n#%yS|!+Q@IBFC}A~hW}%C1+Wr( zt`j%u3rY($jhArvq4tusf5+*cUT*1RX5nY8u@!#SY^G2#(Gh{bFc7EC8yDhEs_!dk1kS$(kJ>Ftz_b^!4{KKmrpY4mm8-+QvUJPIB&$GmX z`VR^)gT)EaVod>xPkv3G!Iq6n^Y)wuE=x-ADS8xYRDw8u`eZaX7cJ_h@ig z4sJg3wtbmv+@rzr00ge0#RM(6oyr`%$zhB3su-nwxrNT-Z!8cU+G=+O`3iyaYn~sL z#4y<$BN5bzOnSH42O9gMsA&5zh>TLs3ty4L#q85Szy?{^~$w$ zKWiw}$OU{3qT*(}2R)6E^2)iCjEs`(!Q}OF=LqKrXNi4=G!bFImzCdrAZKQz#bzgB zfC_Zjj9sFtRu;pQGbtgOh3T~5Ik5~X54l|=;Jzv9`j8VfjudYcaa?&A;Te83YBRLS zE&$Zk;{h^Fp~i#11Sz+@yy?93=i$;V0TFIv>tQPz$HV)+xiYq>RoMpTIb%kn2|9ph z384Ox6FhTp;Vg`H=nK3oT7p|yT25FK!B&@mZLWYv7HSzXki4mTqJk3I+u})orzNat zqzJ6q#6NW&jl0SXpb;U%+it%yk67m&oHaBxRwo1;92Hy{@_IH5P6-(?DoGsv2^+T~ zsFx?XsHr0mUL4O%1?jgrki(EU`v*NI|p~gvkMp1EHb$Uc6C73W^K& zJ~lx~#GiO&{ws4B)<;|!fz5YwDXY+oQo|mn3REFZg`*yg3w0Mz3=JHqU_OTN0p@#Y(4& ze%(-UY2{K!@MT^s3mIJ%-DcOUXi&7-p6XB_B7%lD$)zqXsIYdr+`Vwb9Ew~(WKAZ6sw;RU4rmOJfsrbnj;o(r2O>HDK*UwhiLNfXrkl&J zg=_Vv_^ONt_<*%jT*=Jln&4a}K~N;$pvcwFyoVz$?mOHXDhQ3}(Wg(~oDz7i zvJM@Cq%-}!_U>wvA#mOzTggd|xq}kKrNQTOlC2Q&S?D_lySfw+Hc?A1Lg$U5NA$F8x2;?`gdnySr@F(O*sf>c50UiApbcP`vw20DUn%iv;1sk~lT zV#R69mZ`IKyA?!3I50h%>OTBfv9Y&xN3Cu-dH;#VjHcCo1Hx@QZzyg z)HHZ@SgV~ivw6pXL^bU2vo7bCJ?ANA=oUe$h1FIP`-GZgzol4Tq-QF}SMEP4pVul% zDMWEr3{i_BEz?S4W7}W~>osq{YOvoWqC)dm;`l3tMeZO!I-ur z^Z{iSvxJ!QGdWl~NQ31;_LTtd2`jLvy#*d{1_miUih|U}0611oLR+&0oQu-49s`Z* zBMl(r!n;ciA-x$cvhQm+M7a_Xo1?NPA`1dzmLX~-Rq+LrE@}FgdPtmeHE!L)dom@`f4()rOSD)%@Z{{S^^C@Ou8+#au&VGnkWslQi&0JJOV zt?6tD)@#U02|&Y*Ys{^vQ$=-k6YOTbxfI42s7@2I-PSP)Y`2ejbp|-RiS?CbP}5~ZUiH?Bhqr9v zCmcDSV%3~Tu9)}-9xrSpGUB(xX2kD+O^AOGb{+96U<2_RrPE8Ug!nz&Ziod%{7tYq zuU`ATdewXN+UC_O!>d;-;wJ+4x5Md>rTYYLX{F>{C4$X zv(lvNI*w}*|D{L8Tbs{b!N`sGwh%?{Bl)=cEO4P{O25rsinaQ<`tDrc!n!UqIvI93;Voz1#Y!Cuc9|E zOIhkk$S$-6;=QW2#@_{)>-1FmGBHES3~%O>=%#<&#ff>Z{&c>|# zzq;XKaKqc|hR5IT_TT@MBrGn{=+KviwitG28~y8J;!NQ;*5`x1O7|Q&0fa6w3TE#q;GsbyA@UOwH*O(J!0PFHc`f zq4eNW=Bzd8L*upMa0^33=s;!rcx@g-xiC*=DzRDMi)EzBlKlaf!(&bnLAHoV&Ou&B z)xp~leNraOo>u=w{7Ho!z4C8-nF-gHYwPjuUgMZbJ?@YyfACzxKeaW}pLCn{L=ifz z&~zadxRzd2`vByx^_kb6Vk+}9Zqu$X6gd)m_cmP`vo(sGB&5+ZQ=j|Iemp7$ z8i+=hxn#FSM3PKQ77h7D#>~#P$S9auRkIfijMgke9tN~uf0*H2{#cN)J>HaqlX+{$ z226wGDd;c7FEkGiGHkG?dFT8I@m}|@JP@#bfK#cX2mi>CF6q@r%X*B4V zVp3ezuQZTcK4i?BrMfL*R%>p>ykj7WUvPedUKRReo&07d~jC z;FUJR%26)1BFum~Y89?FcV93$YG#0<@XYu*AS8e~LsQRS)oqB`nM-7@$lM@jCQ^08 zT2^W#pOD1cKp1vNU}MxDs_BPF*fjZwBsd0mcv9{n#fpM}kJ0YCCF^X*gOyra6OH8r zQBA8(;1SbT(*FgdK{)VsW-F!?oswg&LR0N1soslNMDD8;57gil5yy*7SgS8u2$7Yj zel^q_d^nT$iiM$ZI?@{0$*#CxAY7H`evo)Ih$l22`~JNq*Nq_p+jiv~^$(%?*)ecl z0cE|Y#aWynJt>}&=jrxRQLyq}zN$RkW@<3j)#e%01~1MQ}+$9 zclDl_-l_DG-AwY4IPVPLSPSi~b$XW)XJ+Qnswy4Rx`X^SS5(-z`@NXjY(qDKO2>G$qq(R&ZV@@!*Ixw=)B^*L|iABsEKT&-tw*hg$9Jr;MjeuBRvDZtTVI*%JA77U#tb4X{duUlx zbYwJW%Je|kkio|Mc#~wzbR|=fSu&7gu3nZ3fb*Q73t3Ahg9ibz^9Aiu>}&)i*OpJl zDM|(RZe>BbqE>iY2j3lyR^E6MU(~ptem7iu8OePJS(tF$3bVzJKSe2ySjRd5XhF3; zve)cjTMx7=qqztX?gfZbeG6*A--J+$M?O-Xm!3koKXvASo)zD8t9$o_?rk+WXu z^M!*>$Y3Kk@O|)&NRjeV&K}b?pPao!H4RRqu`Mr-Jkepkz@UM=jbR%vM>cL_*>KAn zPO>grY1H5~%+n{P(1hp}UA*%7w#MiG(XjW09da~uO%jw@4#nXIc%Y!e@WsMD|_1x94B-fCO66>&rtMVuM^cF(X!e>OP&04$8LsOX=3m~gweC>MH2tY{BGl$e7j9i)BOJV+R) zZQbR9_w7cg+&)FgY>wDD8ZLhi4*1wep=SXCu*mQgFgg>iAjZ?2)!+{-s`|X|hdynS zT=Jo7h>yM3JYxudEk2semJ4!m%6C}?1oY?pgRgrlJ;0%7=*+1{_(|i4SxySKXFmdNO9#rTmoQmj_ zzYkaA7cT7l^4Ee;-Y^y>pIZTHC?BfUSb3%{#a$+~044>HgY(I`m5BJmk`O1?g*>80 zeu#0DI!5YO&EJO5UDMZ86>TuCe-&+#yCH-SLI@#*5JCundq+&c4U#=4U%J#>3ddY% zQKz_eoCXZuF9vHHVW7M#zEBTY+d%gSpKS#)B2EX#X9B=#oFvaVv0u94xTQjvjW)@Q zMJ8F4(=$tH?fxuNB0JQ?`Jrux$g}X+HS@U98bl08mlczak^v$YY=9TDRa!`*F{2oA zO0`si-Ly27Tc~S9Ep}n=`mySElGR`Wxi`iZJnTKl1^f_ky{_3nOV_pUna`emYTv&m zl{w`Zi{;dgHtND;AL-en8-W`12V1#~c<#SpRrysL!pD{&;zX+V&E5+m?s8<)O_%CJ zFt5dyjsHv~)T>|{S3~MRrqXPmc#@}0oL7Pe}M^%SgStTwz|*KtL`;WAVzEjBJv3+$Ui}H@kvD zsUCTlh;!d%Kv%XD4pG6EJ}L}(rZJ?lnC1b)amlo)46W?B9W^wY1*@E*42wv;A~Gah z55D`DYA>f_?E%=XXKkS}FCZ#s0TnG*Y*=}zLQAQMNA&U@2M5Xvq%o5JUm}(S(ab`N z-7pI!bD3&e6fp*=x$jHuqJ%*RxXJhJ8@s$oI${gO)9r%cKbGu3CoT8iOP=DKNtHUa z4xLG`rzr!J!D?N8hP|->j04d|?t$3Z=we+`Q*ciDA>`JJ)$ig1YTPvV?ejj#iMy`~ z36pwSV|z)~%&njoyy={|Hs-`Fk}-Q@2jSQS1IkV-&J^kNJgK$mc+n3S2Gt$w(%tsw7NZJH$Iq8SY5w)5`*(Fi1Q?u9i)4{6!(D4C-$n})h;gAIVX zk{(=FlX)2+Op?O24&(NcN(95$mN=A5vaM=Mr=gwlUW@jFuSN4V^%8DfH<{)cVj;1R zQqQl%!c7;zHje-uHbS%z?h0WTf&j{rrBcW7LvRPkEdwG8TMOzlX6a>?8Y1}HQEVS^9wwa zA4&Sb+jp7ECjzgLeRZ=VF?>#JXQ@9^2so9_Q~nc=oa#Jit|ZIg|Yxse&nS zyh}q5f*Zzn(xDo7%YImdb(8=wwOtFeKoT_OR2N%aEX&qTJ*m1!KIUG1y7#B3$>3IV z_#p_~iXuzg<-z~pR1ow1yz-wg35H#DT+7ibzUJZg@^!&iYR;$*l%2qdR)NDOOK;uNk;^=4lmcK+DMMI4lnQBPQ)ms)cnv&3T#gqD_ zPp81ISx8n$R&scd_^`hWVPN72$ZQ}{9&o<;^G27_&@x|Xrporys-`@q}X{!#`53Mguy#pnZ#43zXe0jRKXy3H<~Cc`GcAVv4VwBjcgD)*QNwQ z?Yqx@g$<_(!Czx?PGNo!k{g0^Ni%rrPXpGa`Cd!P;uQI#1)>Zs+vH-H+Dom!@3Rj=fdUd^$*g z?~bHy81RPZ563uM&W|4IDuZqDo>UJF#@lu z=(j?}#qH3h3i>I6g;X>bK4SZ`!Hgo_G1p9WrvlE|Ak)C@(8j&m@{#SnUCHDOq^TTX zBj+mKbs-L*j8>yIWxXp2JEJU=cM8=h%l%LD}6$r57WmO0Mw(ld-rKNxJp-%xYF<+g-U$eAuW6`CB&o3Md zn*0;LOj=l>U9*p2Nc30W%9kP^JlPxXWOT3&MG-5o^C-}o1DSy0hC40Wg`=K!CK>U> zx!cwBIs~V6AQpL#Y|olVh;I=Tx}JG^ABfS6!uoBZomuIboI{rHzA1lPRbxLsbzwix zYX^Dz3B&&vr#rRb62SVl?fSgp%!#LEoiW?X+HCe8d)*jty2@THwk%c3i^z4aOs6dp zJZxnpvsz3prHVxlNojmd0gQZwf&L|_*jCber97jdvG}%|dc9V(IH+eQ1r|+cLZOp* zL1#;App;(9!BDDEOS!R~%8N@mPbVPJSf^WpV6-Yo*Qgq@H3}OR`*}cS|M9869Wvw3 zGHn$UI#ux=&-0^XZ7`;duRh+E!JbuhIU-^Y18}(;31tsB{#Q4;G`zfm}!Vme~7}lv_i&;ZD&&%F7VT2_UClb z2!|e%`@_hl53_&-SAMIHXcr=qCrwv6N)(j{r8CD8tgd0V)` zSc!_l3hD;`z6sfOc>65lat&$ex0P}TOfj3enJ$w)5w(p^d_3vG86)m-Y8Mm{>+j_;FX7RL=SZpLuKe3SB*xg*A@fZC}w`aAm@ zW5h68B#@T`a#Yr|<1+HQn1GNPkkkdu9F%j&G|WEFH0^45`Oq3+USB9<4q3^T#2mns z3^sd8XZ#tAjc0ro@|csZ<`c2HPSR8n<+DDywMw_f#K#!TdM#c=%jHlTYIN-c?m+bY z&p7qv%P+}T-Dx!I{s#14hi7GS?$l}*%mD!I!-uF$a$EH;MURW8yM%m)tp+}GJ!$3~ zD`e4B7NF}jc{Qh+NeM*4cR_PZx58)8uwXDRzm0`e0aS%j=q*FEXZX*6Cfp9_>(5T) z?F%CeGHzz&&SCJBc59#ZL^3^OpyA zzBVk@&zGfg0<^VMg^J@^4YyvRrVA2rRKujvI()c=_~%023DUDk$*2)~pc#?KO2zV4 z1x#t%3jKfb*6H=FX~Li9qlS@)PQ!w_Ssp2*y#Pd2<8q;=o?WkA4QSNuF>C$V4S5v| z3|Zwi>6|YcjdHoLc=!=2XhkHtW`!lXR?vpgYI{lD>2+7?p`*dc5;VeeX?)r{ty0y3 zVKJ{Ga6S6t*b7r;@;QVPRR<_u)DooOu!O+>2t4DcpgL7^#vmkoNn$ikEv&a%7BRU^}^@ia+gEk?MMP`hY8 zD+E_BK~Lu1R192gU^23Sze=rMPdY6aj8cY>5`_Hea!C1pMPqBWE~6FpkUA$CG)zr~ zGC(FXNarkrWM(qJb#LXs1kH;2O`oWIka9k)?U3(fB!wpp+lQB;E{-!ep*}D0YFPeA z&OZtIXIs1J|NIwOmMOSyi{{;ulDA{WTiUewOHvowJ_tLMc8QtzAFk z`r*+M|0}i!vw{!O#-IN1qQOI?WNMm%igsd=Lrb_dj;wRq<-BN?=glKCgi#8yU&nqe zzHV1fSMYuIKy3tZqMVW5h}Z;rEQnLC+nq461qAz$t=p0$0ou4K-qUTugF_2 z0+OG{&CtKj^)qJXV$6m33O>JFv*(Y{K`3Ua#ZycuqN?s?i3CvPQ%?XvSY1X+I)31A zIhU^xadd73s!xff-cGU?ORes_&b6HqTpuMzYmJTZ`y6n!gYfHI-#v$)N(KavC;JFT z`+W)yah8bt_?92d^l9v5V*NTat4_qLILb$-tkejLDm{7iir|n^Ih)murvhK{-)NhN z%$f#g)fRv@I1#s;?9A-?jimL))WA zF^LJP0aZr%T=RFu>MW|Yj5uioD}E`>9?Ok$Rw{e2=pemX@q@=JL}PYK?7VR4Xq`(U zMVaQiCT~*#*6)~SSzcHXuMOI_9I}2m*Y@rf(mF59d28BFIy=YWoF0`8-$ju&OAERp zOArrXlRGTvV+6rfPOH&{mi7=cbpr-0{(m(JWX>8*K&x}~cfE>F^I$)<=>aHO1- zQ%Ede>HNKX651HvK_S_%Ol1C1fOg4Cm}ElSm8Tx;FV2Vm8@N5Xo6!ekW%f)p2-KiuvQ;Iwm&EOu9~Fro7Cp8 z$lv)IA$qtu3U6!i&jmr3ILh|D3P~-_5=M#v9>HW{u&V1f$RLd-2A41DcY3AgKKOIB zvGF()Q~2E$pI0g)8Cko#`T)uB6at5q=*mmXZx|_X;YL|st=Wwt{o7Akj1Y}kiuwi(K|9fw~=5f0OYkm?l zPw7MVQ8rXjw9J~NkxEiKZ2KQbWdD^+;3bmYsF*54)&g~2GXz>Zt=-II`NdJhj8zti!ekObr?{5%?#4M!(^>HSh;`LMvZ;d%oAHtZ z4oRgn!6XWL=R5Dq(`b7)7)7%bL2_^;F!MX%*<_r(xABKZmwn_ zyqf1g9WgL4AQ`yk1K(;Ms0KB1g|%sFdH%gT^%1fl{o|)8EB0Eys4S@#MN2l>^e*J# zJml0N`|TShJF_ff4sVmt#&d{yM6k83kiElLdpwSpAKJT}k0Znb>%Bz0@)wgG;p_l~ zPx!^~w-*l?o&|5ovGB+^ULZ~4O>ZZ=ia9ed6!FY%lk9c@9jtT|b)_{}uOe3ss%D^M zvX*poGFe+%oO4*R^z})WbPd&+60-BaoY^xfQA=w>w6!s%6!IB{G0k@qnLCTHlWr+x z3nco=HPxb%xx&;v)I;%6&gV?Y#kgcGv`>l8hyNc5SwA`6)zrNUf1a-H{zXDPy3~so zRgH0r_pPPPqom2vvLQ*1Yd=YrUBSpZbj9a?Ruo>@eg8!+hA!GB`~3@5&5|P=&&GIk z=w~1dqI;M&EnmojQ@?C=$9aM@CLSi@8OML`w^x$p3`xaNHha9`>Xno++*F?B6_`md zcKP^-Ti}~EWwxombGPuQzg0m!S|vF-r+0dI7Vwf|rx)Ji-8&U$b-49@GchH*^`06} zfkMF;BB8n`SzkAKZ*%Lt?sq8_*%#Si^Wke=mdb22Qyvz--9;ZjQU*#1SaD|lu>zyy zVD!FrdB@|b6i1PlHxJsPDZ&T~Q6UilG^0%J)S$F%qnLf1#GQXh@}Y@RVy5(g)(mtjgCR^2M-Z_p=Xb4-S9~cKuxdI+zy*SM(2Fd5 znB_1-%zVwz!MJVx<`qM30TCOSYt;HPlaNf{{sIacX3Gn3^N^f&Psz2cr{r!N)8G*8 zc|jZSOH4wuU-0<7_rI-lz;th;zw6EQc~)Pr&ZWpj@yl=9v5)!HKkR<$_5GpREGd9j zZce?Q{V?6*iN-Oa<^oBSMLuv!fF_JeIATlXLI9RQ>6QJ@(S>aX9y0RR!<*iP(jizz zXTfZJ_0;H3Z2F>f^APsmMpW?l)c{4Tu<^OPN-)p_HR8(1TaZ=(o_if3EV9K8S`2#U zZX-@9uT)cT2{qXw72~#yOFMI2N3`LutqKCr$9&v+VFUTA&e_V*>e_nMhN%bTYAz0| zA#K&doa|Ef+FAhaq_hTLAY!P%B9gJ-+L2yv0BTto7)pXbh`1jB;8I<$DS-{l)W~^d($9l2+X_6|;{x)#=U5jIGA_1}OQqnMn*r zSI;`@wyHp$w-Ku=vL(33Y`>JOV$lOzAi4$VAl{Vd^EF%-?^>cfr|Xd=L}_@f2yMJ~ zFWsngU04Co;h>x*`%|*UDx%qtA047?(jK%ds)l=z>U8RdQ}*5L>)0hYNZa$iiAyZA zt(=sfY&RpV=0dD#8arRoDtki3GKDK=#ZWPm=Lg1zvc+ zvWN5^&keoB+&6;FcCdiI?E>$dxtKbZh1FFwXpn>OATM$JQyUu?N&qtbxZ0#6Jsvw; zTv_ceG487W2+fh{W>hgvIH~`paLdf~qsOwt^g<7)+?rk>ydmc3`EWYLIxG1S%dA`i zo%p%(L7N+=dr`8g$r6-LUDNy3^hYYX*RpY>;G8}>(`%pEk72|pHp4zZFw#su&vuO6 zW}=^E7?Hy<2%4v2Zn%jVtBs>U&xgjaRk3GbmIKCQ=ED#DcRh}q8XJiDQdbA9lNsOe zpLUa#cjERht<~Ln74#x?Kl87rAn1DZKA`noaV>D_g$7(#V4?=Bq zN?Q;h*RqWH&dP7;Bz+bGVyWj>n8L0Q~cGx;m-Nnjq^Z?2^f3&$2+%?vo^ zA(Gis0^fHnBlX&2TdMIbopXM_k3GHrx;BQ`$+50w7o>%tB#@Bwcnvet9o0};q=HZ~ z2u=cpN-BLof`{jOBZ+fwgllLX`2s`P@aO;dH%jL6Kpj=Zy6k5q5TO>;o#1`ve*UK= zHvpv?7#!9T80J#v!(+`XUvQ51^~?oOB{@twbKQnpn*ghr${{dRZDW+Zn2vW*dP^(# z%B2?)+E-D``!;+1rpPuLrZqj%Oyz`v`T$g`mt&I5b>EUP-4{q7648Mbw^EQ!lzcr= zpJc|}Pj>>ANPUR9HRprWk*_ZqE)gygdi!IKqci~OCZ4?DOhqv_!?WP%R~Sp9CRI~- z6~q;P!#b#$@DF7^T_^3WNUH%`mNNWg(n%Pm1eI}Kht=@(IekWxoGH7c2vHho99un8h zkEK1`$@Z`l)%C`#Bl}|0^kDKMe@7|nv(5^EAmpcN9`y9QsLyI44$dL0_sB6WWLh`h zSZQs^mz;}1uuxVX0F;eLYFo!#*!10G;wKxMGzA9`rhx3X4S zn;$Ky_{a@c-h?_ulbS?IrbIa=CRyY5v(F~6m=S|&``x%5NVH*k*k}&z=D=!h=1+nN zMqvkf^NXC|^rKm7O8Kx>kNY|d?;dXOE^DkeQDfU zcI97cEq|(z06nW21@z2j6!6V9n$d^HBJAR3VxYWV)gru-+iykdiMDw8)pOJ1-o|?7 zyn%L0zEmk=deRW#*aeLo`l45XoXPN@HSOOo=6 znr=z%zqw=Ge-5I}@g%RhZFF0=2q~rGE;O~@t|`6%OO(aL?qEGJD_&Y<0??k7Yjpxz zhn{FE zPoirwCEM#%AjBx-9u(!u+}Fv)Y2IF^#Ij&YmXLd1-l-?ym_)ses}pi43d~aK7noJx zt^?+*zK@pOsCLq+X@_eh;RZ?AQvxB!H3?}6dq~(*!m5N_?y-h@>naA0j(bxvpbIwF)NEA{|k~y*IA~X9H*!vZ_@A^C7lhWS-C9<3=f)4L;RFbQ= zcPmV%`2XA_dsSE+SR*Hi#xDV*FcWsI5VjY@2dvo3MlA%eEsDkGiF4 zMRQsR9hb4G{;=bgtE5cR^JDB>IJC7aPYa5(1Ru8A4#vUX5JaYagM=dH)mgb! zSPgJ5fg}$a$BCKa+)iU&V`AOx2XyO0w}xp^`e((KwS3Sx*ia&t{D>_H9~Y785gCOM zFr$XU6dST(XhPpBy0@@F8w_;~bqx_ifuVukfXWUir?HrgHwBDSbL!mEF{7Yl;d124 z``2x~=S$hvUH_JZi6Q1g z=MjgVA7hT8Qmdh76P=-E?XiQTi<2V{d)Z*2#Rk}J_`%-9@GkY})J*a25_#1NToB+F zI)d>FUBUQ;o?xgxCsUV?3{jGE)~+4i(AV6<5&GGz4tmi*l1$2@27AyEhA9lA6u06p z$mNh=B0A>M5L_WZ=0!etEzbjQ$L zf+kobQbkpoE7!|_aeDB;w-8qHRH4G5qGc2{2Oi#`h}Mdbpdxk9+j_;hmm2Py#}ivj z%9I>)qg$wJB94~;kkeNb&n-}Olr-D7KVEuNt@q#>Wi`Bi0R3YVmYeF6W=Cz)BzZ(| zmZL-s;K}OW0pgASc9nhoiU@ICZSRG;e+8XP)IqGmntDlcX7B<8Lr9o90Ea`^3~hp% zE6qv0vr=qPxaNj!>)&5EM%Mfgi2n7J2(1V!~{8YpHwZ;YeAnBFMYi4U!u z2Ul%ncdQYRMH`gl>g!`g5{zdQxnADWnSFSIk$d9Aq=TIfZx>M@+L$1D;=gxn= z;%WTxmFFd~LJ#2SO_@$R63Q0my`xj$(DRn4A03{Ck+3*J^kpR+ z0#+IqK=B3WiaI?7tEwtC9c{Q+H#e8=XLK#B@|Jw%$(x#8ikOWQbkAb^{=r%zORe-^ zy2(8ufA7Q>qR2H99Gu4D$3?%Rci!rWeknmapV(g_>8%hF*V!k`J{wMIH;{CHbkDTC zZi5y<3_oG+;pArYxfvz-bwcSLDA|ym$UK>T1Vu}JRu=iCvX%sOH?6>4t;MkPJ4hd~ z?V>j#Og90jlvzw0$QgR9?`)C!=V|obrF>|M^2YOR`2HR(0g?EMzcT<(nPs0FH7HIZ zjmbp6l6~s5qi0Q~-^OaQbXbC?Mo5Yd_mvH#zPL}YTxSZ5J}eCye-kJ&Z)`?p9yK?*)nJSKc4W|%LH0*ERgoqFCo@Q+kM{u8u;)M5Ht3nU>dI`n% z3~0C`$e>HTTm(3fbW78oi2!LP<*8>(VQ{mhgHP|F*`FQ z?6f-ba@ns=k|VQojg!y(5wy8T*L?6{I?36+Hy>6nm5>+$8xlRyZetL72x;L;Ogx&I z#F!bn)!r5{cpZFeL_A}F95&nHWoVOQRc|yruV3y}sQ35ywE}ht4ll)_KP|P1v*k5O z^1O5_u`e01{8|CqO7#6i+MyH-`ACufCDA(04QMgppz94!KW~v_L0{@&)Hj;O68^Bh zU7MqOCHabOsEkPQKM_okr1n<_jQhCif|#y`>P8-KC*W>gPuB>)FLKfSJdOciJlJO| zOpanDPKTe>`V0y|su5q~iR54jLnOI4)D89+5N zje#Q0f)iqvFzQ$s5@snV^f<990a|f@v!P`W@D2GmtxV-Vmtqa)v&IbAB!jsR#ts~= zR1q%S$-Im>CFMB62dWAbclMx2qEnCu3C}4KjOzZ3Vhc@7W@HF@l8*d3v9W9@@UE>Q z?=8rhZo)oEfYekr{azb|(nvV3Y$&}UYkoD7=Kr@7L(cA3JEXj8_r~8te^Ng9o)kui zv-QhJ7681Cx-JmpK|&iifhHjUdg{^C#yib?00<+Yl5!$`4%o5pnwLEEK63AF2MUDBNPP-LN|5U>VO#29jVT!8663$X@q{;( z$mbGFnW=)qQ`;xX=VxxiF=WC&;bEHLJm;@x2m@fEL`q8}c~2l?Ak!i2HQKx={wWA1 zR4f^|udSx|CaDlPSMj^(B4czRsQ{=ZgTh(j4Ls}6j?HHzf4r^g<3toYzHj7n2XxfI z`IXVia>!X1EfiOcgspQ|_pvX%t3W7>){clL)5u&?yN?ejli3XjER3rA`wmQfdT zN5_&Nm6-%Y5=D`Rf5`Gd_k}`go+IWs^t`xf7c-H7m(#Tc6d+^)J>*9F*d_nqo9gkq zwU-VA(|hYt+MmifczLH_vN(9FB5?I6Y?~Ng-rUAl+cLM)0J5`>UpTU>Ud|eD zHre~%-;afB?Ie__7uAg7j4^2+_qh-OYwDPKRCPq6xcG%3@|PcPzamL~B-1}TDDc!y zT^h@s)XhgDW@+$VV#V_dz~6qr6zcS_7z}i9L!b zxPIP{v#Y%}up5m$CH|O0`JEIBm@(AyVG+Hu2dc7piMzHyj6{3YmP~;77vvLsYXxd7 zi$`RJ87tUb3)O9)-M6=m($a6sV|k3iu85-xBRQbcmZIzN(bwx+!IdhZ8^-zGJ<0CH zhpb^hT}yX8Zu^pKN>viN{UZ!>LE0VDlr18^=m?}Je~k+-aHVkpt9bG9A&6j}flY|h6vICrRE?%WSMdRD2YMduAbdNCwOS8JV&?igqt?mt}W1J@dnc;7q0;IFl zDEZf9CdVeHUlX9okz_`T`3x7j>qQn-$*GLcL~ z#fly32308;(nh#c?xTSj_h2{QOVU*PoW;U136Q0TdIc=P=v5&Htdl5aXhN`9B`)vg z15MI`J^|O_!mG=`4a`l@3L^4)vr@D-BSrOe&D)(#&7Y|I-hijAZXf-4N6xkZ6;Qqo z>%FnONzl?~O!0`L`>#$*w$PF1*l4&uHRJ95pLg-i~vR2-c2*lYkN(8@1G@Thyg;ag^zm8>-ijBe0*^*xh5Pb+*B#T`#1l&An z=DsO{=QuQfuF>>aYRQ*^O!%Loq)En1`5G@Z(4Jj!v3+T7cbmKh;(D0l)r>(uvV@1J zvy{MjE6!)+YMbSZdQmZ5o0DtvY1tge8w#0{m_@ z$2LTpT3mr<8NKulNwfq$fw6fab`zd2dOTJPqPI;toUu-Qp+%ZJ;S(|TP{2&lM0k4y#@AJ2Tl`KYqDCWhL#_kHby1%^^-LgCE~l(SvD>a8 zZvicis0&+q$r9@hpmb5U`eDhvp5wal=*v;I|4_QHbJYV%`FEQV;ej#4F7S*s1{C)O zGAPhxAQ5**@_-mR`0U0f#{)wGwXtldc1wh&tT@wI^=NmaapCY>xp<0bi>Z)XqZ?=YJX+S3wwM z&%AfYmtgxVjT6F|VOFw^)J|CMWgWA!{iq$pisp`OY$=|oM1z6YquIg1CntWnn#vZ;2E<;kC!? zvfUeXF0|XdQI_*9nsn^Z4Y+dU6u_G$@sTFpY3L0D{mRs7Zi?7YOXw^zmQ^Zqk-L$m zMj}a6<_RrBOl(esU?}0X8>)7x-sgyqFTIFaVUR zatcMJ__8Ef5|FxHI-nOIthd-v6Hg*t!5IS_4Z0B=XttZ}dayu5w#wk5^3|YA9Hl@s zANq$e+K^9d>G7Bi+ol1=l*V<@UhKMPwv7)xJa~YQ=D|0;L9&BNToczz>c=du^=-cy z-x1fwwaJ3`AKNWiGogyFFB?D{hDcP{u`I@|Bg9v|&_UANzOb%G;?G!kwl$*e4-+WK zabc3Ww3ixK-G;$n;*;0n$0c{}lU%&-N>4-7(CxqfoM`PW=D;Ge!OhNLWto+7$#jM; zsl6YrQ~hM09t^tozvfaAK*fRlYBnWCUw(N;AjS+uFp(j~I;xeiHzsPpo=9`5j2?xO zxr5Xe3bpEN7VyHB5TvHdZ@kMhEw4<8mA=!Zg)Be4;;7`3*I z(-n>s13#cXL+AwTc;2D|)(9}m= z$!O+d3HZpQEJrS8yJ(}(2+s|GHi*I8g@1@w?!9f{`e&cLVR6K$|83p5GWkaT!K!t? zISJmp_w9vMH!iJJ>2zu@K5y-=rOmEjFSgVS%9Ao2xgD|k6Kys>KfR3ICKWg)vA+_& zDLOvwZmx*Jk>Go2_y6rLLa)C{kI+@|zxRZlr<#K#QFw6ZlaXI9Qq4SLRLw-gt97Yd z)DN#H?v#>%C-*=N`J6~!G)%If>?%}KyzaZ$A})={7Tz5{uM8OPQd$zCh)`y{S5$U< zop>IlORuZq7mV&~MdjtJ3@Wb#(SzFRQ3izak}k_?EvZedRF|1+Dtpj7o*QU zn)P3UEOZ}Q<@->V>Hq~vY0W(8IXv@9@0ljKqn_2OO;D}3e3HZzQ1 zAy#^CVPx*YqEEpc@g^(9CrKp0BZ$wZ^?Y$9Q~~Nv8#5IC+^#*5hM~Z1L+Qdwdmt$G z(h;p{n0q0e7g+)JA);prjMNLb21ic81ncfcDb$G}`d>&@QVS{hl3Ehg z)^?*Wu6{W{MR>G_2~8;^<^@`mi(`O7!XlF`gLU@<5=tc7EsWuWKVL%?D#GRzf+6jV z#n*3GAs9nRc_}-407!US$j!E=E#rlEZK^8$S}3{`Zs`g==05?7Ie#Bfk)<)BG8DPf_)KCsTnSecw)^fFx zLNI}0w7!G@{@G`duyBe&a>4wxaGVSW(4M#T+*6+qse(+C=o{>$0Wvp_(b0Z#MW!BF zQWQds?Ml-=#eI*l6%F5pRCy?|c2|ES!Kf3A}jdru0o5yOx;Fh}$`3QdelmhB~5 zkb`gT5*Kps%~A!G?1vI`q9_aNdAMM&6qKFt>lfwrXk4!^j6sw={t&oYs6$jdehOTa zPxJiA-6jwB=+`OhwHO%fQTv9?qxljTq}RVLLBOQHOf+JiB zuE?f#zG11I%F$P3E%xdY_qe;-{Bq;aAYF~=ytJU+md$X9D@%7jl`yzkCw!bX{!9M& z)<+`q@vy0(xf2iimTI8!U+8Q4g}o}OPQs3h(TKe}ZaMtG&DFmP*HsODBELP(r3k#= zjoW8ld%@J)vbKon=sC{Q3sU>u0_*bCcxH49NH0ClwFY347XAxOA^sFnUp+7HM{u^M z>sd??7P+o6IdoQ3F%(0Xv_+|c*hW#eI^LvB?KrFX-&sGT;1!dw4+_!Oq5k4IK^mGG zc)$3^=L8oZ)6#B^{N^A~4!ZHL7G1PkY9vzVqx4op4hedSL>UJ)X99_@aA4dzXZF6P zD9MEbi5J0Es+e-dCFQa!!OY+I%6 zKsk55BK4uXhM-dw&Rl`jA#(%g2A&d4^D<`$V!op1e6`z$X!3=`@#=Iz|3@&4Rn0=3 zfKN;!(yUKb6E*#Jt)?WF)-djZYTW`uXG(bZ1++1L%I2ynn|M;Pj~&&poQ|5(iB;;9 z81N16*KpOMe0^0v=ts+s-X!LR5EtP@|;Z&(uTi57v0SurNg^S9{HaUR=m z`2PA)e^P70g{}$ke$JST4br?FHw_yUoy~Jwrjy8YtnE-P{o=c{sD^dOTEaPx;l7Ty z@V)Vtm-2-y5j+9XbbtnzZbgRI0^zpNZBdI_YWg~gxFoXpLKSRv* z(Qy<7M>SuDcjBCb6Y5d3l~&`lwZsR`R&{Dj3w%6Ji5ieZ@r^0>d3H%axzHjTZ9<-< z%cj@fxx@JvBK^Axk4xrXfMCYCN@f%wXo|SPUe~n05O3@PeX-DDcT)KO__ZQ#)$m5v zB2@@@QTp{=){^EFPc%U)w7@D+#4HySnNla5q~Uo+?wOAx>p+p8R!ct8p&dG$#B4%~ zKq!zT5tK*ty@FVT|d>}|GN(JtJ-@-$hOe*dGUYh=5o;er54K()U{ zyM%#qi^MHPy}I^rH_shS^9KVHZjIR15U z!SorD0DHqU6(Tu7Wp>0q?$`P-(6qqnp4CU(5rYOFcHIEcJbsJ4ond|8%q;#%tw}Hh z5oQpL$(Xt$_fQ$Pk0hHoi)tRVeCiZ@qc!=htzBcxZ9Sl_vwdDyt1CV4$^TgGuD7oi9gG4bP9s|)7(x1KFbg8*%kZ(1`G7wVmF(b%yp_%#)6b@Z331xWn6O= z*kPU6UMsXSNnLoEvl)#KMoam!D&^y)(AF#QDM@o6r^rRLh?E*!sQNOC$h{`iK z%66%yRBhR)t$2)Tn9g$$X1v|2dnNNX8OjA-&58O2FU^2Orb0n**W#MV&)pL3H*ZB3z>7R@ z2h%THvRe(Kx@K$6;~<}~Yd8Ao&(}drzOrbL`+WLKEZ*X{nOPX``$~NEVLWfMqqPrf z38s0%f5B<-6>ZFMYW1Cq8&VX-(?eSZDwG$#36)rT8xPACWqV0V&sN43vDBH?+O}NJ zjjUS8i`{Y4Jv}IHz%V|i`00AR+b97Px?IHONH5`udLiFT#>hu->Z|fd2xo&Enki^1 zqpWV`ENqX?Kcb$U#+(^pm+p*Lv?Aj|ws2r_F_ODfD{gj2gB=aeS{DlGhDK6gXkyV) zt+QO^%LPs7A(^Ih@|M~;({{+Au;qH6{TOu^{mUuUK-$m{ZEFgpL>u2V}fD4t9yK!*(=Bg`&~4%*vOPgk+hoqm4)e zmra^wrctoIC6_6X<41h-TfW)X{+=1!$7X#X zl*dN2Dizv3%;$mBIT&`>hNN_tm(v?)WnMj-+D7%Tx5OCT(w9ct))&n>I1AtrJ)JW^m7R*N!_8 z^rqF5;sfFSxz4d&x*D#In2y^T8z=4}st8|rw-Xf()(>Y*( znZd?&K&Y`JxS!JEsj~eCzNb*X3;s_&-{>62yg+sR`l!#*3cC0u20k7q$)JLYHM-v9 zmPD;fG{IXX%jFF3Lmh?B)lC7HtJQA#wP&~ZdbC@3jmmxSrg$vie>eqM34Gk)qOL2{ zSXHaWZ32K~rmlJEH%T|{wP6AzQ?q>k|JMHKVPT=S-)Ew_bgD3|A8`czp<19w#Ai6^ zhQQkTUMbSP(#dfD2gg09M8>v$ggDe6(cArQDS;T%`u;(y^+V6f1qC7;d`slL_w&H? ztR4mGqdCbAyo(~>E9=IsMIZ*NA14dNn8f6{1glxlp=fPQ9S{Z6;=dRo)6jjBtD?g- zgckU2LK^o#JEd#IMSJBkGh#HfsV6HZ;ZTY=@D5JLPMmK^&i|Gog4Wz_J94MYbz0IBVSAOKfGN( z{3HiyA3LyVsQU>;r>M9ctig*>N%=>;k(OE04l;Qc#wzncjn+Fk^mylOh>%(KZkT%^ zk@vm3*;&bnq(0U}F3l*Q72gcoK6B(*iipe&q$2y^a6fm)e$Rxjn@S{3Y4mlYr2_gK zGg^yFTzz<_bI*LWaCDZGRqQ2g6GVWNc5xk84;aAgVlL%1lN!OiMqrU($Ifa9bIdcW z0DWtcxzMJHdK}DvR9BCZ!60Hy){ZEM$S13IIci*;mvfK1+%c+fdEQ;q76Sw>#DR0b zJ9C|vpQetm;?5UXFbAo^Lf!=}aY}D`4QM%ogr?~VL7+13fEb_{#VTFYb)C2!Gq=ad zs`kc`$Yi7!ZgQ>hLmx^uVvQK&>8BDiEkcmHjyD@k)}qVLhQNy#6cbR4pcuPW{Xj*f zmD+}B0sQUd4HfNnq*KCf*uDr&V@9SpE;fu~$z zriRsF?ZD#joC$Sp1}@_$O#Am7tE`UPq7yEhZWXKd&7@NBkY4+X-l~6;1ZCj9Ut= ze-)7&7qqfr6_Ah?S*CST!ie}SFs53Rh!1JeTpYcxY~c);ViE{j9ZGs1_#_p^G!3~T z!Xax~3pASb%9?1D6yCa{`!|1cpzZO_;D`MR+m~ScY|#D{A{GNyDMCSJ7@d=AaWIsPw&P;pS%npNOxpz<)%dn@Z!^-_GR&2gU;nI zv1wS>WRg5h%Rg2q$hFj^KPvYycN9Fg#=c}FL*LTaVob0aR%att(^z~xPKoYEu6UR* z(^$n3Jx-~CJfDcoJAQ$~t$186cDOr=8sE~GfI*kQ6?tDJO?etZfE&K1T-ax`3~~|) z$2NrFZX#FO;!-HxCug4f?iOBn>%3&2ZFap{Sk7Ftoc>|N0jx zTuT8V5F<#CSFpTfVQnGBE!UF@m!9~21Q1GQQDr5k;7*pRv;oXMHodBnS~P}kB&DRf zCq&RtE>kUpv_*+WWhp^GacT$^1Ft&csC)nk)^zfkI5)Z%eLJ7R9?j2Dut zB23_(50flL0gncx+muU-v_C(hN1sii52U$8p}I6rEY3EDy1BOOE!rDq4J0ONZJC3H z;s$MKX4mw0#eyPGWF(S8b%=c2lRBAuB7YrL5;UQ!@xH@i z1Y9jKIUF)q9rewMlbV9^w1QP)>R(O}T`ZROS%4Vn;8yx9{0KM%JfTX@+$CJ^hy(1XnU9RhR)6xh|SCPuEQk4<6j_ievey3>$SY z9XHs+Vjn?jZV?Xamb_Qayp6pPYWM$?#eaI?CFx`|E0Ss|6ag?FuyoXez|YC z)%(#mWn_0GY0R<4N4pesWLmNHRxo*ewnLhD0no*h69|b>UZzgMt^_;&4r6WYbnnyy z^R^DDCDVx3VdE-46L%*LLxC|UIynnz3H6-o+!`!fNLk{H(_7TC+0|d!k;t0^s3Q#p zgTtGb+pLeZ2QblPgy$VQJMb;4tY&70;6}4CmRU2ZODO!7o&Rq%hIV-^^0cEdmYd^y`A=i$i=tLoQ51QR6)Y6?5<N6*^`sA)S$U&j@Q8h97)4|$LvQYpVyW!=l-Wc`2J`EOU!-bT( z)A|-GcipW*?7gv$N-hco`M0({1Ot>Twf7n6r9CkayYPUH z#ELKeXvAWD+*YC<<~5hYCZ&t%bp$0&n@`ePBEZQ}U)+@kU&A;@K>&8wG4hhbdE8k> zr@AaxyvOP~3aZ@vPaUQ|KO8cWY~*)4EJDUH_Q+yT=z?70CsHJV%`WF~W7xB%LV2r7 zH2$eL=^jQn2iX-`$7yMk5f{zD+7Mo7fAJ>R91oX9u4GzDz?TUX3|z7&VhVnLso+no zzbwz+G75_U?aE&t?gQYjHtxmY(c*J4dgQg2DB{P5`~LP=T6AyGRlx9*{uq9E1pt$I zb(!Xd8zD!ZOApVMSFPJAa8eqdHI7)kSZs9RI=M%+W*jZPuDRbf#Td_+pPzV7YsZ$2 z6j4%i?=S>EnF4Ub3F*8ZO(t6QD5l(ST#=$(_r80F9NMPA6W=}()}M%2*Rohk-*lFo z^Trf;UPbZ{+i0LnPD(6e*)MOskKVltk~n)C!vR|5+DxY8CC2cWUg2qdAK+XYQ((-O zR|3Z)NHxT>C$sA31U*H?#KpygPNV#JyMFBwj6ll-BUraA`Ek>E#mKJ(q4UZe$wj;}e0L7hVA@>ek4YSK39p~?okUWgNG ztBpA>Co$+PNn)VKtE@AoN=Vdx)5Re-l1w-TIan$flrX4)$;f`E5C^EG6VL@psO?BN zeb~dC+#O)k7n&AkUWYiiOCkASOJaA7OPQ3DY;|GW7^NV0zOI={e_LxFgD9`4IE!8u zavC<@`EuI7DS4NU77SD+Xf)t~|LG-GQZV_3zRg%w{9RRl>I=a%=oCR4i+!ix)ei8I z2)J(xcmGf-6blnHC#<$ULQp*^^+IR`9bj<5BhOS&n=6CAD!xjJoPFjKft#0CotV5d zn!OydBy#nL^Mcg(-rUQIh+PuDh89VD*epga`_($?>>kqI%0QEyPjXYP|AGu2QIN(L zG*ETK@!t&bGh1nNsmk<@MVEsDlfk8{eB1^XW4{>AI;hDFuPH`|H^!_Qro~POFCm+d zA+ned^}Up0<9e(xADJ_VMMfWv`BPa>Ylnq(D}6#>g%uUnd!k``ycTjlGOHJ38ZF>w zkpfU_hQDZ;uIttvM{!fr_lE;|iInMOHQV&|PPx`wU`m_WIuQ`NAh!3D6j1f(7u;{_xu?UB>Hw z9lmJ~+4mItCqR)_$9gmxH2^_KT3Vv}=I?u`T zTzrCnwj1+G)*MZ|StgWS>xzH|^37+=Lw=t|@$VBQLrpa1U8~!Vbl}d7N-ASjN0gu; zz3Gaef6j$hH8(M-OX+TA!zXrJE}_H*Lb)V^C1*V1Ss;WsG6Sne)Og%i3>MESn9!_AMgVU%Y7BC=HBg~bXyfp-~)y_N!NLi)f7E84VQ?So4fw} z4{HoW0T<5Xpv^4KmQOiCHD;EF1c?3`Gj~Q)K~*?&QaD>Bmd;HVlUA{5a-Xl+(9aSS zV zi3BCI%y?%g85FVLYPbRG!e5I)NJ2twhpo8Xf9uQRRYC@$(L(!``R7j38C<{t$BL%H zHo^p_qy|_(4J`i8>k2LF{cXR;y|0!@Qw|EtG^o;(z-K-H^9sE>Lp(W9>NI?3QEC51 zRirOT%KWy%*M$GjClZ!oMD=pUEk1d~TBz?%>r3f#lgLdkH#^7wdSP0YlDTQ?1NHT3 zNlH?$NDC>Uo{&~askm_gM%=h&K5n#Y!Hvfs;`X(@@AysKdA7i{+F1hEYHl#x7-pVs z$lR#=fEz0}6mFm=JL{0NACmGz+-!~ib#B_vO8Hs&<$K=~rZ?Pdoab@_EZpq(fd&W? zc*TvfbYqSi>=5Jz7B{$=j|lLY&hZ;LtjinRY`+qb8`@f^qawcU?k45y+!*IwZfu1c z(}BMm`Vi#Cp-xEqNhv?c4fSkW9iR3cDc|9SH1nx5)Bc&1f5wfj54h3C4T2lVoYxI} zEx0+ljzWa+;`#w`;~#?RytHpf`35(jKHx?iH^jIJ5V3>iCZ>}ElDq^j6x&^8^0O*- zvx!1cPZCpZWpA|B3D(ng_PH5@yH2ncb7 zezz*b&dy?#Vd$}=)}hYA%LPXOqX!N1kZv&dt2xx5%Wa`Nw`>`?wv1X zzLZzZ93uMz?H!=opon>rRb-WZu0?;0Hnz3UsK#h!ulHWZqTqE8!avCVH%S}*9DI5D z;U5rUN(?Y2ghoc6apt-xMkdV7_^KA!iZNMFZfnQJ_y@WNgTL`hF7&X^-h;&mTB7Oz z{gV=s5(PPu=zWlM_CRwL%0uz%%%cG-6CUGzP)EfdZ z;m?0rACE7q`d4c%bL|<2zb>Gn+_15DnQfu35^tpy2M>~8-yzX*#5{UQm$qE#avu%d z^ykGPcU9JxExb@xkYAabmRER;1d2YQ9QfpvVu~=uBan9Fgg<8CseGeJz!AfivVdD& zA9D8Bb(QEYzw72|QFglCanVNWVAfu@p8wX-RXKQLvY*J~Yo?)Vx`0SNRI*nqb9i6V z3gxrdYUr~&)QM@&kC2SeYJN$@dv0@Fc56OAi6D>Pk!^wMB~rsY9o8jatW`TSO9iDv zR4`+E$jn+?@ckAjiS|;?>3DjoxUa|^_m0<9_e}+zSO@n=iuCimz5me7h#BL=zf~&< z&0{TBO-m}r-<3GHAQCqL%dBKgz^Rb1NO2J%z(152nyvr%=2Lt72Gf`90DmgU?=3|y zCcpXT;UYCi6v`O1FaatU%1fxNVtG8ZMgTr1&g5>s>;*&*7P1C9vJotSeaCxgEOx~+ zim-%;_dSEOIXkrd`TH4uaIdq!Ec*EGY^uur;XiPr{L{ZPv+t5dxX0Cn4K-Yir$Cu- z40TU36km6z3!7ILy3b=3DMxnrQkkFQPBB#(<{E^lT0Fv){=fYh(uH!5EdiNg3ArohYUH_hdmbV zEW)r^M!*!{$>m3?ncNJ}0ulzO35x@p&xH4JRY%$l2>jlP*F1vc30}TMM_)jQLM5i{ z%9TPa@^oOFl%x#9^)@$#q;y&=%hJ`a#PDfm+DL*m9Rne^hQNqp5!o^VSnBJ1yJ0$r z_Yy0jC3dk*KL7QydIuB>#D>PyDT&{jCn&v)B!tMUTB8;m5}Wkmahh+3Ew^S(c@C&5 zQMRaeAvLfV7^+070{^C;?5;Zd!!x%%KbP`%+*otxCyC4-9*W%xz~i$ta(62>x4M?) zbQe52bza)7VS>je4O}Q%DAikRYc_Sp5ZvEnxEP~Y)X>CMAV|r*w4+~lpzw|3ufO%o z&(J^kKA67umXECcgRd_Ghw}5tId8%%)Pn^2G0J8ROPi6Es=?C@8iojxkSV-An=ADQ zD`-m&^=sIESst7~q&cx~%TBJu`K24Z^VN)uA z?4ts_?3VC42E5ucj_QpfM&GBFNavEpBHLBV1z)awUj0-fOGV)+lnkF9zmm(FNshNn@&E zk1hTZC?u56Yc1S7zrT2n?7O!`d&=o*^YdBw8Y11xTp8yZE@wyf=Dp5tnm(brg@cux zZj?B`g^Z_Bv!@z7tr;;A0i2~X$c8TW)DTG1<@Mgt9ztiFQ4c(rPrQ9&=<0!4-@1V| z;!Ok2)c@Ny7qEREr<31w6m5d(42k0nCK?lPBbf)Nq;p7OH(FRoB0Hi46E)}y0CPbP zw`)e1%A!+$vK$RPDt2m!a^0+p?DIX_ef*JK_AfxCE^cLSv^ClrX+}H4O)Z)k4ind5 z7gL>R_MK?-O%L>S{c~DkY(B-%>dfyC^}2m7!6mdVCuZ4y!KSrv?_b{~xrS1O1jHR% zqox`6sPX`r@77@K+yz2x6|8I6s6)5jQl|1hJmAq(Lu)m+Y;GS;Rq;;r@ccoM0vFRoQ*IGi1ZvS}K1vE1fw7%ymMQH}@1ry=<}__3X>7b1!TT zmwwg*>-^9in7I*26u2>-LY=XOUJz{;_!)^cmZzI+QTn3QPBYhR=8uWUR2fS@A2*F4 zL{}G3nK*udC^IS+uFLn@4M-NnL<$P@X_5A4~fC-z$xAEItw~6ZP%yNtFi;A z$e-ci&aZmu?1KIG2On~OIK%&Hk&`7vSXTSO{LU74UFwf6z%FbUa>GgdgrP=HI zwV(V>m-&DN;7}U6m_pCfjJ(Gy8ALm|5i_pRnlA8h&?Xc%bwoZDA|?vkDwU607DFLC zuY&-Ub|)LiRa<{W$A5^*sd*if#d^7%_auazldkuajH!xzV?~p*2#hi(Ga>hl>&zZ^ z8d8)-8iUTlQrBve;xxS0!aW2`bGJxwcID|d@8%;0xp?pwW=nt=F&_(=LNucV4ZutXEuaO6* zSp7yLF5U-OLFF)v(3It+eFZtPWXAiTin+Kd@G7H+JfsM*mQBq9u#k{4>O|y?KtknhrJ$DZ za;Y81{&sDS<-Q6S^_|jZdd+08L6}0~w%Iy+>CwlZyC?}N%F4A^#w!kSwjV`4Pbf~T z5q0lFk#gHvo2GQ~O!fY?t|PySo(NkXbJGF5*8~Xi5?bqm!A_gl3DOkM#q7(E$0~U3hf!;$kfOUfbL=OXt zTyW)~p^w*V;#k8NGm)=Ba)ue0m)M@MxmS%epX0QNmL|nn^B_c`mO_-D4GnNglS?$A zF5^zJif)Zu`50BAo@JPGj3ywMIiTj_}t)RCA;#$$)@#4!}jr?MEFD^Fdt4`_}qrkKW_oo?vT zy}5LUvJFb8rHccQAQ|qsH&EseHj$0ydD;=g5AzWa#E+&&535-~tQpPCX_)5`Gng+V z`52&9>cK{{;^;QfET3j3iL08?+^&yMwx+g^L?<)qN`=m`1Rs~C{(eboV7%l`Pm`H0QNofFkcvdr zIya_2x+QkXA5KOqKLK59?PL^|=H^E1y)q{gJoMecKf0k}38; z5|J*MPsB|*DZrSO$Xraka>>6?pXd-W_=BO`YWM7j9>Pq}IOps|h_`?1MAEBjy!Fp@ z!0kP8Q}#vidT`^LAyYy^*n40gFbRXKi)RCzLRqA*+}BIpb%pU!eAYQ_lNA{yZ|lDo zf{j4z?qTlxs`6|ZwE{C9-q_IUn+sHEkkZHW*VkO#yE|*x60x(w$%sOHpD_JRRtq^- z4GgU9+0>oa&Xd+3%E>ocW25c4m|M?1clem^|9MPB9G><8;VH4Rz{K8x_3nD{<@4;Y z@osCAL@XEIVddBeak6Q9tEQS(%{+u1!B6&6sexz!xIolj;vY*4Jv!Gs$MpYZXfE=X zN<$aCQ#w%ip&z}5B2N!Mp2_{A<9(;9K<98LPJ)2qvm$VOba&HYbYdY1pTBXQ2n|pl z96>PHBJLkFAXje@X7#h1$+82L|9(2cG*8a8p4}YvlSxuRB5pYzr8eU0b*kWsT(JKB2K9C0&KwpTWFC9LOy_r33MUULt5vJ;b6YU;hnt^d>wBNf zLNO!`GxXRu5S#E*AeJyBJd3ob%t*l>cSXk4NBKa(vl}m*$6YwS>T*u4iSW`rkvpFISeV1%^6&f? zoXwmC4xK*vZ^p}#-#`EF{>eJ0?-=19=1leZ0P)-K+oAhX|1NdmIHkRgCrJ2ikxLn(e#7gRKcKiQrcCB@AUAVtx8nP9;A4m-G)t5@MPhJECxXYIv-iuE^p2lp9Gd z=JHRluBNPt9^65YRd}PkqyfN49*IqjRS?Jo52t$s7EWw8dA;99gn#4E46)N<4Gc*f z0udD~b0fSygVRJFd7yBNxDD@~d*XHvInXc@h3H$&Yvzdc>qQs1e*MEAH2>{vtRlUF+78n58-73O)DISuFrWib@Qn=-G&bo=Fh0tQR8qh(H~UfU1(O zbUd)h0jO3C#MV?x7JkI^7-;+xsa3H%cE1_0?hKFhPO-#*qvBHlUDM$B!FOafL<5i5 z-;d0V;)Zv;3!9SIFa+oCim{QA5XNdZ5p&17(2~N!$la#`-7}fN{1orw-W-q(SM3AL zdi393?*!YgQ#ID#F@I8+1Ew`n!_IV2lO+nC?FhMe-?_5CR(icC$k?W8=e#(hnIU;f!-O%f`jS6>7`*Lc-(7?M+uNdVIG-UPWPUA+6&mM*pFcl99)F02 zEoY71p!F`36MvkyjU64;v4ZDjx#jYa=DqCyxmwMG)pj+xhX3CK4ICC@JXF2lO!)g6 z6@2Gs7%Zg-%86dH;hb`Q5A$E}l^8jgmDsQ;m>L-BN}2iLM7=bK+{7@5DV~q@}XvWO% zDDeZ@SVC+zQ5cd~p+JpNqT@TKVYvhFu-?=}J4rFlNNNQxAC2E*U)uKL>~9&ql;~&m zUOHR=oGhg1lrerz!A;(TLk0ZUmK^$6bqnYg-COCtxaDvB13^ECj^$NqmkBbDyo4z^ zmQyAc^`54db(Wyl_)wBS&{u15B#nK(N4Jt~)9r9DBH9en@AI758(w^^x_40o_cnL2DfZFls@Q+Y` zu`+mKtA4{2ZP8RS%+lEMWHQ$e8yTV{xxdWDZ+f;)V&2Dtrt!PvI|)FKj}0dqII`{t z8HIu2%UdNbV25zdD^NX1li5R(ISLK}^RfH1(adQvz(90pj{>Cxtd*<9aATq3(P88# zq|LVP@)^u>0VkQR^J}c23IxtZSe-5|!q4kX3P)ZC30#OLF%M9l#)%{$PaAS_QslcK ztODl}EcXp8`f-#0Na{6nH!|6Do|->N7A}$#zrrvtxPr5#2RU+%v||%b0^T|kMt|z5 zv@?{Jp|t~IG#OmW5Sp7((|$bw0lej%O*$EXXF%>I;^GGBMoo{=&U2p6ipOz4j+JVB zo9}3bOWFlronpU#b18i+e~iih9H~}ekgH1{qgR(dM)!KAalUKeE4UY6L2MEbw+Ksr zE^8A)&}qE9X{++uHm$ot##wS0xHq6AU(>UX*4d)Z$5$qhmEhCoMK#=@f&&u(#c}6Dll|}wjkDgnxKr8zT2snUO^eaUm^zSY z(S*c57$FD55iA`fxPIz~SpFBWND_Ij_v2IfaRYP{KB?}bI`do8t7C7g69Tmxp z^4egsjUl;*5P&aL@5FnV6r5)mFtV<&P8JCwm5fBPE?fK!sqa_A2F$g@twdTWz0+eu zy*AhtrkTT7tAHp%f|XhyDc&Jqu`m9mx+936d@e7+>*Y}hp9JB-WrD-NXYGghltQeH z2KXI^D=P6tmh6;T6m1u|JBHKKJ2owTdgEdcMT>O?_0o~e_cp53{VTPEgo-;sjI|=* zklu+;9~+7&lbq_oOtSMJ@cpnXQ)VNsq?B#OLmD^`_WdH;`7hN1L_y~va5I~~A0&3! zDwT*cPTBJY^RVRkT@~BA&~09hkuUajLa12?C{6}4JciCt`8f~wRa%o=kelaWBOd4JnOS>YdpRu4m z3N5Cm_ts!BejA}d5uUlQb7AK~PKW#yz<7h*60&YyvOxBGoR&t46aDxc*g{2kI>~P| zM*38TDxyOvUYz5{m;sWED9uQwY5sndlp*70GI7s-n8M8?CM$1 zFmtUlaalYtZT60*} zz=r^=&x?lQxh z**>{Iy>bo*uR$n5upPn@2ySpiAsD;8{g*gJ)cg_;&jE-LPbrccDmPUhf`|E!2p*-M zz>lNG2wGPHL@TzobZtGS>iN90>d)LzlmuV`h?&650?lj)nOlfN2?g`{6tDAIt_tNU z5KX=dD8?tE=D_*;zV(<-jgOWu&PDk0N44-=#K|sg~*mO{i{rGptKJ@v2o{fR)zmWndhBdq7W_B8e2mSVt!Y9jR!|^-rRkh zxGf1ugEL@?EqgsUkPtVc# zj~gRJYg`!kVVOf+jW3;(U}%D$juBHcj)ri*b0ZrtnXZMEV!>ck?)`oL1#-!+&ieG5 zsO_WBi-Q%xVjY|C%aFzCkJi2GLp1^tI+k|z;^xe%Wtr0X6EU( zCthnHNu{@68jubqryk}S^HRN5Ycxrpi)u1ve5+|u zy;AK!;Bbqgo3=IuP`?*I9T7ksu1Kd#SmJCBBKUM)F%Y1aVQ4XumJ?J^^8ceM%w^k& zF0OX(%%DJ$U80#bCTF`YH?)sL6-~*TmNmo2xbn=bCl76ucfU79A?odc=eNzo9-b6O zcyu|-S#^u3P>c!hZii@nZZff^>>I7o%_0RJR*pGx!F^9Ba* zJ2^*u;hYMc{+xhP}4dTS|+6|Oo!I$_9`$4 zP2idswOId1>s~F4V8|LBG%bG`p9XFTUbfia}WNN|BMeJC&j+quA4D+-JP1qLGp zM!y0h=RU5$$V-+s^K`$o^>BRU#w+fbKyIsCZ%5Eg2D_+|hAPan`WjHCGNuZo>LQuJ zh=~JaZBQo2?rh83`3YuY#Uo2L`Y; zh8nA;x;j9elyF3JLfo)p`9d^LB^M#9)_UD#d*)NcB`W4+EK4Zb0n^Qq{P+tBRR_dK zaFmq4G=o~b?lP;_>vdm{FlIR!-fBfyOfm5#ZBAO5)lul5uYLl+QME`BToUXJus2^`6uDT!-dswg z`hN!Nw$<4uU0~ra!C|PCG*7L z`O?X*BfucFG@dLxchy?2c0*bVVp&zz^Rr0HkyYT`3fKzTEM%9y;dO0DTiRvXmf+O- zi8SzN`dW!u=^uq%iZ{&W&(ps2H;Xf@iXDl(V07NVCIk<1KRLmnB%2s$R== zgr$ORMVKTcL1}WMFa*$J)v)OaGlTFkSeihUxW9~5iO05i<9QIJp&aE_U3=Kf4y?pV z*Cc`3DQ~8Pmf>7u&eCSrM_)v!U-}3rQg2JB_XCeHtwyuhu$A})920j}VTGNcY;MyS zKT{Fk8cP;{e?;6jX6$rY09;|)^2e3hmW1iNNzgDnzO}S-B2&vyA=4u)A_d;q52|yL zXAS@~^aTV-2u>SmKLY|=LQ#Mv`|-5|iSm`MASDYOr{`AO2}=aev2N``QRS5HDIlxW z!iJ~e=)M$y@qSBm2^UD0qEV{25uiA=N@@-Bl&GMW0Ls=3@tQSt8l^BqU?wwO9o63Vo_=ATl>R6b=BxAPky|Y3!NsJ<+LE6* z@1ZQDmTetAIVi;Li4wlJ)M`lN4JXHr@(0DtE+`*Sw=@tMrGr4r-Q|Z36f+y!(3C`r zrI+zLZ)1`aN=MM=9_CvHVY&CIcx;$5V)q}1CRv*MeJf^JJ^Rka-#PJMvSFb(|Yy5W+akJ zOY+CIGi;hGBQ{APYgbzkrwVw}#IKDT(-&(3vL=al-_KytH&hYbk6GaIn9KQ!qs6`u z9*6-?*JqdP?s7Y8ryghsYfFzb)Lagz&K-AJTo58;Ak-~nYl_R!e=K6{zt7m!!yQqp z^$+);hWchNJGcIh#fcCl21>fg*>!}JBg#hVWZqtldM$YxohEin9KV@N^-V6`Q7P5i zB?1HF?WBDrvMb?cmlZyDk|=}Z)&%=9DG2aJfDSuk=@9y>TPAh>n|Csa^BD;FVipe% z4-b#(hDff1YGfdZ&%dnj&E1#q9(eO(ufN)_-8bjAziBY^&yY8A7cZ_$pPQ}%fD*|H zn^!G?qfvaT8$tA|dIz`!$>4#~6wtl#9Ol}>TCaGA;QRbn)q7n*okcX51QT~ebpC^tciCUEN z0*+u&&A_MUMGo8K?_N8kG~28eY}2Nu3z9dmRuFSqg|tfiOma`gabzAW4rs01f`VGk z$pD6lfWWeaKKzVpO`fS zi>@LURQPS`zv0Q0-4v=?cPK?hj*4Do`rLbeO#BtHm&_mV;8%7R>7VZtGV9|67OsiF zQ;2vQB=lQa#HU>mhguwh>wS@GmVujDBEDnySqgNv{kICbeV9Y&NOD<=C$T;`G8yl( z7Q*@TZ0F^hpzD($Sb~E9+@kd5k%PF)fFwomk8T%IcXXmLHCEYN(1{99={Cg}fd^%S zGs(r6n6oqaZR6uK-H%H5er!RyrA>Y8t#sO$>|scXwAAtv$3tnx?9vE0X`0GT zO$&aR$5l$!@{6L0QZ?Fwp_=TJQq@6OKqM&esX%ZLI0&>BYPQ(jGd2+J@~k1P&2`7^$-@NM)( zr9S`sM4mYtJCUKfiQ+QI{U+ z3fwB&~7XEnH3iGzRq}xW1Vb%zv1YYIS?5DnH-J*+4`;LtYx}zFg_w z#-pH-K3(e3FGUyv9SKllwlm&vVm~*sBs>k>TP^TWl$ITnk#{yz=bSr%i!FCHJg}(b zoiwYnI(4j&k2k?^@Xq1?lL(|HQD>js2HEwy__h3H4mq0^ofES7=gUc+cPvEuAAjx zkncf*33ja5EDzs-2ItbSNr5WmN=(YLmyQO=dR7qEoiA7d!(S$KW?I#r)A&>=K0Hg# zD1C+kD|O1sw1Y|N<1VQLosT_})Kh>ilxeH4H6>AL&5yIM`|(Of(dwyXJ*IuCocvdx z58V9+7P-CrM4pJ6Bm&h(E`EKxwBpWvlJu16>=*OG?8EvReZ^@Sei~Y}_aNocUt*ty z{-BnoV=7Jz^-s3O;sGVG;4Qp(|Kt7aL$4IGQSnbZHzTI?H;U8s8$djEob~UUu z^Zxj&=RCY~f3>gCEzCK)!PUDPBuxA)K@&8t&@Q^o2H@Ku{~ZByokSmCKR`{~O< z^al8tfGATL*{ewZti+||ycM=Hh@y}AMh@3TzQQoM^5Yc`Aw~?u^=}!qrqbPF3Ak!8 z(fo+>&mx*6v-80l9v}7P?e9Aym~by@jCCSdN>;0jSd!nYC8+CQ%20{>X(&PRt+@yY zlmTUcVP+(C-gNT@iiC_j_6MXy)Xka4gp9@IbxwBh|{bmS&s}eYUEac9B~mlnRYov_Cf>Gi04~>$n4E1>vr2`XGXCLW@<0{xY6$$8J70{ z9l00R9*d$z+B!$Q-XnbZ{sl&GHov+3wI4m6msYd2D5bxWMe4xrlyJEag2@ehHYcVK zd_wKpdZWKk=asIRFMavW>8r9@@XMoXi$OI_aNJIeb;y4F&9B0z9b4*i;c?Z%T!{ zi=_0R#JL$bnRHM}2AqbSsY7*i*v)HezFjXz711Ky!6a%&Efls?)EY4Z`WCa3=_;>3 z9uaVG#9zF;N^R_Alhi}ABJwG@+W*+fblH3)E<;P)_s6=RUo3@=XLhIxXQZ*|twxD5F_(Z2L)PW5~*rTsF9xl@;qtgXGzU&x-M?Ojb+lFMKOb;n3QgAfAjsaXs@1&d5 za{e9Cas9O{EY%2uM%$D+hnECC_+9a8AP3zOfvfPvUZ!P-%9bbAhZv$WK3O!@DfX~f z+LyQloPL_>A>Ab>=WRQw60K;6Dw=7(I2Lp+l#P$*)hX!ntD6b9nH3B3l^s--GetQw zV|hSn(?H!@&pqeZi+{pPq-(&&tD8wyp8oRTlwz}tnN3o$Tm+mp!cGczr)zE}SR4;v zps5V&HoAx4P{y4shDZGmnW-zlO(v2%PR4lq zLoF;^(o2r&IGDJoqCP=G9yOP3SERvg%KKMn9`@#PFI0c^_uF~7=4%#otu(E8)Nj!6 z8-hQ){CXa4hM>HqEt4OemvYm$NouU*lH{|Eg?7C%61Lnnl&zmT?zv#!*NhG?~7 z>o*%_w7#Ng3>EeGNLlw%Lv&zc${h1BQ*&EPV8l)h?^xU*8HxJ-uRxHd{ z1lFm=kdO<6ogT`+xEtYFbUc!~)~HiPF@F`%aizkO%D^K>3gG@WICh_{icP{iShF;t zbe5bp!cH2@o@)KRD-T4=>XNB~?FRS$ve!~a82Z8D{h3q_NL0Pnm1<2HwhSW2G1?Ea z!FQyv#I^N622{CZm`K&UR8JrL;693P4J^K$R4s&WuImWAwu6^%FnEFbM_8Xz0{+k9 z=5wzhUT_T>T(r4!@6#6QRZj4wYhFr+^$`%*0}w*P{2Lf2h{EPr5Qjs3kc7jNbe9h+ zasBZKrt~>Keo@s?=K{E~#|6BpwX zd#UfD{OCc+X5bgsU(B`B`tB0up?FHu^g5joCfAat(0KiQ(K^je6)pK3$!OKB7VXjE zoxZOVGcP9Ykr2sbF>hn__y+p}@&LxLn0s@Cb(P5}Itt3;@M$wHfvMj%(cm*DGfR)N zFu}r9Yc{Oe`Aq8LFI`_RxrX>3#a!U9;cekV$1kA|?n&l})ac_>pi+a(e8kNZP}J;) zec`6m68L;N(aD#p)KRHljrXNJ_c06*yWG(I6&PYJ(RC!#n4q!h1pA-V1UHzSxkcss z+wbSkq+Q$b5M5WYCP?>CC7M2yX!Yy8mn22lVv?~FSl<_pWL`h)aWrep^($L8hrS~v zaF5>c$0ZdgyNY|3Mng#Ku`C3}81E?6*X?x7Eb?x*I%h9_u2AiIW#F^lz7kC}qE0rO z&|eLp@QN4AHbM*8h6Ne9jG;I?&i*X87dP^w-!Nr4DESz^zv(;Ouq zvOh;<-VJ(wG_@OEq7KVlH5=7;_jwRiJ^zc@;!^a*Ug*Gm!wPl)KQgz^j04Nuipzok zl319|%K0Mo=8p&TaT0G1I|P}QuJ209as$CkKp*o3=8(AJvgN)AgNzfEN?_-W*yo{c zE#pH_1buLfkN!Uyk+O*(1WXKGz24$} zu*Yxxi-MVd3Ufxe!l24TF=hj~);LlHqD??e{cHu33D)1T(W!8<%2S-XYi@#EQUb7og?Ii&-1{8se-JX!0493bD%P=d$ z)i|+yN0Ydzp^Lu_4tW{HoS?X$SDo5UuvfyRH8ODs|DvVd;OpQJeyRU`lsb41)6m8a zNT0W-9Ec9=oP`&OzvlCSDw6;Wa3f9?Y`qdechLYS)tisIR=E?zIBI5FA*ow>N%E?O z%>b_NE>Pq)C<9-q39ez_8c4syStl&bpD@CVGt1lZ?0Z|_OLLeYP2EcG-K|TL?tX@1Q)qb6D%PibD-;4=0#ZMik*-h20Bz|TQr+V4`e4(a zIA6mNItZP>@9HeCBjmfRqs?DyecxR*g?N{NW;?4o*9WtU<7v0lWvOj9Px0p}@)jI) zxptRk`x4)s#uSOEC3J!`38NZG44^m>X?nFN>lnWo=v=2B z^q7r77q(Wya(X}7bUmO&3DsdfZaR9SwT8*Sp>2W-xrP-mTMt6GUW>X0_jJgU2q&Q{ z&cCJlL89gGyDVRsV|^KuGT8=;slSBi{Yp{w-;`iJ_2H=`w%=AWjnHU6mUk#o=}cWBM)w zOXkdX-~jV)rACYtUEj8hG2lRXcz9$+ohMS@MPBCBUd^ImeFRjY=?{ht00|8EgW(W> zx;+e2FoJDwaXSVG>qLkxB5dhqyr5KpnCR{~g$ZcL|dol4P} z8xB42%!M%mInqYZQ`R~ZzojOuX9RHe7TIERG^ zYCneju=SG!1nKQlT6T~5($`QJQ3C0xb9AhDbH*iRsk)5Ka`g=7j<=^6l&zhYfUJK( z^+B3|UMz73t^?7PqD32Wb~SY~U zj$i)FDks@*pT{H%zv&o|vtkgXr<*ULdrcC81W0uFpC(LhiWwj=Y6|JF8(y+rtsgek@m$ z2X@TMOjjQ`*_zpVXM%1NtXViYZ7$`OaQ4jTS3QJVyz-DNJEfC!LM)X86%Iox8CnW) z5-P!$B=!hRT{xHE>xo!d8&dRg7rbN=K}nNWPuOk%L>haxxyfg;Za*TPt48~ceP{?BD&dbV z_6^S6z6{J}yy-!pO8hNV)FwSKe)y(59SK??oy!k-w?Mb}2>Su|)?9xt?Q;Br>qskB z!UZe0%>}4z-$(cI|1M)8@{rw%Y<1%agAder#E7AMQ$OIhMeMsUrSt~W|IYgWrHRb1 zs8EA5!!Tn83PJE6JFP)#>`=Z!8qnE0q!Grnx2PlA!}F*I1+UXDSlD4*n8uj(1v*(` zrp`<14fK|I`rJOh3$!-ia7t6p`ugGkV%iK}<@orP75(}j)35w&6|Te_q16>KU|EJ9 zD5+~@lZMI&@)>UWND3=%zS~48-1u93TKxEq&7EdyILt-xcnF1;o=wojGS$oPc9#?MnPMKKkkta%mRhvB{I zCqe%j`#|AujVmBJ}GQw_jq};m^Z?loIW+T3FuIFG0zCKbtjfzjhL}wtf znmNc>bKHFK2`MqTAAYZ?xIy{4Y_Q#xo+dxRGBBUV9MH@7@zGW8DVasgr~tlUP5m1X z7W;yH*?L;Esk{Gy`h~xW-oqX6d=SIpQloE!bY{HiKo&l3l`=h$;^_OvpIGL7emu#c zv@ciCA%ST}D+>fVgdTqTMOsr(!y_4tYSqOQ26)lDIXZZn_c$+L8IZ(!!3xKm2+nRv z)d(%%=1O8dEMI75B2Ef8iV_Zjh-z6k+)*_>{Mj+WvdB9U`r-{mnWk7CP11&oBL{_I~;gB*z}q4ZgZuWQMg2Q*pA{haG3=FQ%$w zXOC-a=b|LsSG$y$mgtv%Z$cFfxiYrYiba$&ayr)vXzEes|VI*K#iy|xG z5oMgNa`D)H&=b2WYX1yK(pZjR)GnxB(|9*rZoLUV@VU=4{)Q&#M?(_}_~Y@|Xq$9R z(ozs#mgH~-Ybdo$P}&1sVjS=Pn__j-l{3Jx5G1l05XK4}XTAR!G)(LGv2hEzlbFS22rXJ+9W%bZCJsyg29!l23BjA_sb|BU! zN->M4u!4M;UaFSpFUMC&u&eajn|5R=b)*j4(I9uv0Y-KiOOs_Y4)@CvaE=~Xir zE;ShNR%(b|QSj8Z!spy~o~6m(?+?HJkIvd#4kmeJo-65%fw@E*C28v2$Nwn`H*VlsJZ~^jN(h|#1T+zNs5GvM;$hAf8#c~P0HX5FK z(V#aRDG_>RTLN+-|PBt50gWNSh_{m0@5E&_sFcSg+;=wjYhqPpwNl5gBtdN z(SGTUYl|{eNb&?HfjZJu#9Vh}MPa;1eQh8Geuk06^6U|`q^O}ztgysJ8~Y*)4=Vm!ul^q67 zT5*}%1)nIy?%QhIwcw28q*I3}iPt0>HH`5ZwtkhpLE9){47*8qz~UhDMBxHEpS*Z@ z?NK`p>)DrQ*ap^;d#cgo{)%A^AwL7k2?ey!x%(<-nNh7CBV55ZnOE1Cq$6Xgc{?`X z$XLpDY_N8qCSxhEO9Vm<(OT*@b+Y_`P>*^aI|`0Gc=rY+a9cPT7U#KUirp47Mco_C zz@>>tRXI`h`Z(1GV5#dV(sANC0+^#J8ldLLGr3h(b(J>e97Je5xDx_aoXhQWFz*jY zaK^i{!icvHL7Cj(gxDxTl#sUS7FRh`JONKWs=2pOleQ#N5C?5AJc^0ITN}+k)YXZ(iKcLM(e6 zCIS)Hc(_10WH!C|@*{fJpZrOHbV^vfGH-9bDVF2oViU4)8R}v=&nz%s)Isy8gC=0( zr-;_NcNXv6S0##~VSM*#5Z+NLkpu)u?`jLk8fxfiJ?=nyNfm|&Y88&*9ypGj}_TtqvP_fP5m+<0>cp9zIo9pbDSVllt==H5@!37-#RDoojHVFs615Q}{L%W9 z_2d?s28(x!V++0I0}T|@{KPVMmKZy$@=mIHYSOI0$VU*FjI^xy?K*K96wb0^c7zsu z;!ebX;9TPSooo7H^@fuwa?Q)#26Fi!2+`PeZObe6S$gq-HDl=DEO$8l!GJW-Wz+h+ zQ>`-+NiIFbxv8!5f=v1)$b*;5598A*e@O%U>S)?>6K<5TL5-^+{O%k}udy)MTnt51 zq}Kb=g^zk_A;mtNKou?VL&zsAp{}Ee-2*&P;A;MrjZVBq_gegOIvzxTG9HW#@26NJcPp*dhaaWfP;Ld4s^?9YxortSW4NGIhCn)BoS~?RZP{4oJn3n zs{t2PlcEuY0aQt0CEi5-E`@v;(o2d6akLn0hf;iX(G|(6le#4?LnppiSO59Jo1rU= z=YQvq2d084I8YX6Ih^?)RQaF$e zm;2MMP(D@(ZqpJfN(WnE!EfWUI{VSt+(8gnBdHCmmJS>>`(dHJhzg zopx8RV|I%$I-ZTZ#hU9Vk{ZDK^Fe2Z+-B8MfaS~Dm<|S&mm7{#!!fl644zgwB%|eAhy{IGUF0$9(2@W3TnE)WULnGM_Z&-iQ#e%HQf$_5(j&zd8Aw zg}>poXZLY();w26&?}+wA0*xdsO5kx<>@6;7j{Sv`J1qj)=OlO-&(P1nwZ4~8GmXz zO{*^IcHQ4Q{sKd*bwmpa_bY(X}}bQ6d(#=^s;Tk6owR#K#ZPyBy^x{s&1)I zdAy8bdl|UGkpdD3DM2Q(HKhSlm`Dfih~wi+1F!Im<_^B$1)j~-t@Zi1$BWb@bfQTC z352v@3rjk1iSyFH70zh8ZNnaMUoAcG3a>S#1shnS^hpWmK$AAGi6sRj5To)O2D;FN zRG6x@qwTekU~fUCNM^?SJc7=*65f| zLjoZ+=t3Kf$4BVzTjf)S!QyR)Y-al3K6~-O2VAS4etWI%(K2&0)r=Akn=GEn$O2_A z*ZwujWOvf|<{KBn#+6Ig#EY-6o$*Pz>iuXb_+R?OA$C6sH4vwK#K(8N2FNayvoUh} zd~@b7=N?Lv4)*dS&mOO@w|0Qk=N9b4v2}`R@@o+s=5**njhd8DsHK{N-K$m(J?ISgGytFqq|7Cms ze?@o{Z=WI_mS+wQkKI;@xn!Wz%_UvVo*F@xW|N1qYQKfo%F;reU`-Y!S(RN2Gi@rb z27+@elOA7Xr^e)#WpPccSWluH*Q9NhW||n(yHwEDn@GaR)F|N*v%p-5bUj|YZbuN? zErQs$a!PW!HLAhdvN8CgE5wvwRL#WrwNzeR(>H~KrO{@c+V~+fkOJ6g_UH0N1Y~vK z+G9|eNxGS}1w z1XNHClX;DFr0w3Gf9x^OEa?9{&9JH$rhRBT<0wnm0ONhrNuhXk9lK~88C6MS;#Tcz zRwfmYA~GJ4ujKnu%!W8_%bBge3q(A$w21S!wl@w1gXOyp8$xQ;{khDp@*!U6kQPU= z!y*$@s3fMOZ}H=6{2z}4KTF?2q1qzoVhz1&9&r_xIN5l*^b%Y{;j(K*tTgD;gNPI$ zW`O|i<88V{pb}LHp{y8c(zXq!0#eQKyk|n;sLVEBO-##GHLf7Rg5MSvt`MhJuTK?X z&Ea#a#N$J@O$xI{Mvr@J`mgSebDvDypFu2IIF6d0urI3jmH~Hh+uVN=F=r~ocC1j} zM6l^;#YsC;%-TA8B?i(SoP5 ze_)StX|sj1YQ;`K+5Tv4nIh9e#wZgJ$PvH8%xemtP61RSpG-!X&k)WeM zM}Q6h9SE9f+#tyi9g4Jx5U+rCeK1U{EZ8gU0ICG$h&pMg$pOR^g2=XNrwax4-B3g6 ziJbs|0}fSD3e^zMQ*^{qe6SSo`OB+QIxgmzR*FBXru zlY#S23i|1&$<)LMj#rc@!rrAKg4iOaV}(fwbJ!$&w8M{^#k1c>X0h_w_&*5ID9&Li zrnxwSwZuzROUz6ykfaQSNLli3&PvjI-J(>Nr5i$xLd(ESuIDt- z^ok_&1$e*SC=uwLHI;wHZyHhmIvAxk3TsKJWk4NZeN$N1 zf;FY`_OaBhRE3Zlq%XV=rt68OgAb+~h)M)SJlH?@s{gYRXISe~qKHwoqWpC0r2-Nr zvnP~bsKj#Qyum9N?uhxV&bY=jh|2M#X%dlK19{Z|wrzH>@Ev$kT|H8(&rTWp{1>v8 zgt^)1gO}p9jGaABq{3#5TNufqda{^7+Ik$JS-{IHj10X>`IUfito+DG70QMUmstR| znEyE$2kH;&+8-i2KjudQS~2Ch-N;GInuuOuLENyu_%;fzHy$ECC#^m}yx3l#;rQ@o zx2mD*-64Hz50TMR;aUPq?u|$)EQ#LcA9n3)dt8O&t2R~AY{EuIBjB*&`H>LA{8hl= z_WgPu))}6U{}Z+DFLZ6B!FW|#MXbAl^URRweVh5m3^aCeq3(8yd%-f(zQ*Sy3=-L6G<{d%~knW-!68s9%8SJ03fK>5U6Hjm-1{>mul0L3c;IiUq5NTn$3|ckphXs&-l>rym?C!KF=;);z$E2o2`YnN%2pZYyP!>^- zRk6?AIUYExo>zZpi=RMEdJ2&A1ItX%n5E{$Q_`)qlbX084;ywF2a^X^?uP8lBKPYg zc(6@>Sr-D?32L?VMU|zlETID93mo+W%M2Qe+vbo>v83jRoLF$W+gZx6M2;Le)E(6! zs^=C&}yQXrPpM$)958|67iHt2JD#d1LzHUu+@GL8r-a4Mn9y3XDJ zqag|wKQ>lUcyGcdY=p;v(%iJimJkaVa`FXJD2DR4$KR)>l0*MPfiQSUqnJYh65?opPmmM+}=J);87^wOk@aLzJ2%#(M9Y5 zkzGRQpAypRV>jK#cJ*rfBS$jl3#=JY%c(*7(M`g+*$7K|ci2hjEh75$^$ADVL$9Dlc+dVOb3S?d>vPvB69leA#IXK^aYr%l#qK10PEvfjz&vw|kVNlh zqpUM;staP7jPoDBxnPt?#f!_xhM}|zx{l#}wAvkaQ(c6xu;Vp9H`W&Et(QLf3p|=z z*mn6}p_8hv&{sqkJ}=KU%55pYSo+(N54G|2IPjG2t$+4LA=BpfaanZGE6h9>j_^!&|GT3Ga3 zLc(k1A{7z`62C$Fgo8=pst2cxHS5FFWA&KDcF;sU=E9`A$X7v>iNI=se3RKy#V5@l zHK`|KWqS)D$}0Et`H%Skzo0$}<4+O)Jd6Ke_xdr#`<1CcLq&>apSJ?j*9z%Km~ijf zHO0oufMeYk1Vtpd!0TA@#oG;HA;8FcRL1H}<;-<0m~VD>!3Qj3tdZ-?e$O;>U2u#U z%+@5=rGJvqZ)Z~Apx*oAXCO3EcQG{8aAC`Z$T)sKX!jKvBi+m*N6o^Jy1BK}sPB-Z zy~G@`I+=JqD&^ApD>eW691Xw+)z4wJ6j2{Vg(~{|T7WUfEufJJ>Q%^a8o78M?2+u* zbI&inbJ+SowG!{2-)iV`s=OH{cTtxdKOwTG%wZ^je2Xt6{~6#3D^Mq{ApQTg>X z=ZBw!=aRs6^WL$>Lxofh3+WHFYl37dnJ(yT+T<&h?3~Uq=F0m}K0k=5{a{oR;GqIQ z%R+vTHvmbsH#=%}PWSELll~p_P4tH=KR_-TYn%~CWA(?pGhm}{d*-{ZBb2GtDNRN#;2+LyeAph|F z;ozA&QPN+<|END5vYDLPJV1}3I4@;={!n#{*x>!$8v9Vz3WcBIvc$X;Eo`mXcJQ`Y zi*{7vugjR-8j=tSRti$oKRs}HAV1i+W2R{Q#Vm~85{#@)5o?{1pFa9HV>Atumblpvu zLz$Y)F)%}Wz*P%|R}m11T9D$* z*=SsgA6d7fPpEJ(^)UC{q}Mj#_7HLQ3fr-{yRV{(GTg|Jj6G8QsjbUgKj&ke3=bN( zRA!7%glWQY{#U83y*dzo#zlR<4(Le_7uS7k$=W&wTbBO)3?@0Spv0!NN{43Xmc>Yz zY;3&Fsi3x3iTgy6>c?cTk>3Du$+mD@zO7|^vEeLKZDI-Im7A0&`Nd9exVLOnrjv7k zto%^^njf6^PCX&*2Ra*R(?!u^9!}fHHSyVQttG;Y#Q#pm@}9h1*=qfIz12JTz+1s( zQv{Z0#P@r%3iaP5p0julLav3w+yy`2<*+QUMxy@7V-FH0q*a3Xqv9N`G=hoE*DxAj z?D+1@H}Dyw0-1=5e9b$Cc7Q|qOy8PMpMJ!rygZ~)tgrMLwN-~gN2b3u`>$;=Zt3V? zA^W{9P+ZIvppWY(LQZ;JilaS|py-;xe~Pf4xc51>fopqh>Y{X!+wSS>9VP1h?L^>m zkuWGb+7TdpCnQr|ye}tG<_=!IDGgHAT&EXGL#o^~g)|FX1SUZPHyYY_YzLQMTFAW) z9jDCu?{benQ=T9XzV$PgH$FlqIrG{GuFrzITNAuZo)GlCLSW*_ zi^XkdgXkxeJ1(UM9cQM?9lQ|8>Vc6+nJ-(Uk4xhR=2rp38%|6X0<)X65YW!wSaCI7 zmR5{PmlMiDpucD2e>wdm7BR!_?ui(YKlWzV$oI0Hnk18CobB+(6Y0o=65%19BE_40 z$d~-cpYE@#w@_rZ9t*cT;{G2Q$$3UbZnP36N#8bN@?TvUZ4Q}3qYy<_3?nPxNR7yy z-IG@Q@N^M}B=5)R28`uk5r#4?!oVpE`?i9l;leIqwo5RnOIL|Ak}?JEE`VHfC37W& z#QzJ3F1}h){@cK9z$D1n;GBiCa8&jthumIP%QTGhuo!T$v`9Ej^;Zacjfx^cl8Hj? z#Q-3uO5{5}vnbAM*A7ey^2I#A!+Xl3(`z-}zoYr=Fx6cp#y0!5(->@&_q%N0;jID@~9 z7bxG!iNY27DZfMF?Y@p5xs38v?FRI33Cbp4amk|v%B`cm*C!wFQEryU3Y1)co`PS$ zG-K5>v*tbPbftCdX^yq?KA|{_PloRjSOz=OL;JwZ2MVly99}zn6K18Izkk|?L_I|y z>vYMY^dsEaDy2dTfA0vBIhRvr1F^^o*D^&5YPMc*;`3*VmcDL|zY95I5V{SXKw2HJ zeyL7$5A{q->#9u`d|Z5yLO3Kq1$)rO(!yvZAsn65PISeD!$|+B!C%lTHM1EK;H;=N ze!4D47mB_)e8Ui_fv?;1bMqC>-7dGm!_{Af5a1`5wP(@F_fVvgwt2 zV7kZ}@e$Rvb_sZ0j($Y~7W&J>9c)b?pg(v$v>c9+!e6n={*mgQT-2Ae1qtbzeXt0*+t_b~+}`_@W- z0_wux1qLEhalT4Vz;fcA1I6k>9;M0@f#Esnj1p0`^6wYMZXtW4t5;w3xD-mRDo9g0 zq+q71Me;aC@ojl$YA_J@kSdnw-i`^40H++)hJ$iyilz-5iSq!-^ut$QVVUH02cJDU zC36c3fFW%kLG3C&ssJ9tAUyy{vtdh?)~ZX!oel3d<|+U%l62-ZI~vlG{0=4gjv362 zPO%#+7gvQXEZ#r=jI zR~gep(?&m03?fwq0a))aSFlfK=*E-BkzOwR4YL@CQsHb#*>FXTwHULyCx|w8^pZd> zO7S)NL%NiPN72XTR-7(e7F(IDxK5ol4D7dzf66Rb>rE^!nLE>?E{ew;i|*g|>*r*q z-x$Y~>w|`buCnRKl5iyNE-Zh5hPIaM4U2-~9X)3bR)Ja(7U`GGvmK)oBNgEap>R)6 z>zOQ4Sa-JsxVdwOE zj6Gvo5!PP@mRpNeRmHpQ!=y*t)Hhkw)J;1n8E}x<&Aw(nWOXq;f$M*lMFBPGqSW6# zbE}^T%eaR*Lus^q{~be_wRehgF`si;1k_k%e!I%DwEw z>iR$$ImBl*QQTSKlkM&hMzO?*r`xZh!k#mUo7HBdFb6m7SMwN!HP|I?k^WARv_Y}K@V zF_Q?u0g+o(!u< z_-%yL>XtN*T}89jVKm{;X5m&ZFx6hzn>z^U9pV0X}$HC5! z^lcp26bV1aVGN~Qv@Ij>M@hSW^pj2tyQu$Fc1HWlz?*tm7NO1*mBWi4;*QdfyQ14R z8)Wot&RnmBq@mqH%Mcps+%ke}WvMk=uA0#MlCYKfcqLql#(|2M;q4T-vs?`-5IeMo zZZ~JRYQUHSX0-HGFV<_X5&M^on{BpV{(I+rvBU9ig1LkT7EN;#M!+;++`dc7;F{eO zCtefR!l=H{fmdpviZ#7UKT1N(GJP2pU-BV(y6SUu>ft`KgOV{kUD-i(x=<2JR8&bQ zEcv>rn&;Z@C%_)gh3Jo(cEY%O5%QEqx`tio#A~i0ybIea)F|7uJ8ExRTPRV{$bfr0hN1jP>T zjimkhlbZS94GQAOt`?L95-Nk(Ya{&8si#0cg63ECuSTR^+`@Y)`1q4nV+4)Kc$8h& z+QB-bYPVzw@vRM;PpSp?Q%R_jRxDWWmf+9h3^g3HkfM8CGWkzBxx^tGv3&*p@@ENv%+JTP82M&~=P2gV~7_!mG|dDWxhMd*|$ zhuvoUQCjPhX;4!i*V0$ACztSTjG6YYVU;-7!^c+Bw0(;HmX$u7-}eGDXfNrDq(7+X z*yj4wE8p^{1eDe`JmfTq-Y!%KAV1Fn75o`M1(EkGP@WdKH31l+x@H1h-dyVwNWgLk zya^|C3lgltslQ_zOhdMQgg~gwy@ow$7S3)oB7lD^UwEcA;wph^LqHrdAm)1cU4Zky(gKUBqx{@CB+uh%;;y{`m4cTP8MYXY)t{NktygMD18GChqIh;-M0IG zmrvxm@MWcPixRkmzy$U$WwR3`d~;*b*sA)IrI+uXyw z+{e?o-{f}4^QOeU1QD?p#2A-D9u9wk#6L@zt8ZpNl2idLQf(T8CvU&ayD*6HqHV~W zl;F~^)f2k%0OQT#)sCiI9QVtuW~mf((MP#hnyPQNjl zFi3v9YqzSK$!uS!{E~Oq_`s8X8Vi=VYHxpqUG!egAI8&33T5S!dy`7o6{-34$4+Li z2+g}wVJ4|q*HEr1j9|ALn3}rI(50>#hFV&&<&h^c_ml#V$v#BQlv*IN-xa306$Oiu zLEA=FugKG-GqM(XdtD-%TX4(lV+2oEXgo=&b*_}c)op6x1bSIda&$s({DRE4%ziWS zZJ1F>E}rMb5N|jyaThB>mPxEdZ~8^eVNpsP0=;R@1MM`~jNZg^=0Bao!me?{A3N=D z4EV5D?|3tqcbxZavpj?9N99h+>LJXcdk2FVYtAKu{sc_^=b<;_y$fY!-(_#w3l_>? z0pX1dNOd2~a0g&>Sb((LuYYmN}M8 zJmFk8AVJ@q!4AFp3RM8wJH`5h3bsThm`w_MarI@~$2l$6(JA%%xGyNSFgaPayQZ&6 zMLf0wc>N&C{fecOQs{ZlG_Y3<7LB&y2Ek)S@OcTMqBN5t{zT)Jm8FBT2j`Ealw5$a zgfQIjkq{@grJa%t%6G5+7E^Ydrx7uLPxfkC14_XAJv^K#`j#{4iw!&KDly_TwBAEo z)^THe@NCy{+{L3Bp&nE+Pf|{PJg~mo9@m%Vl>iy0SKJ6==(;JnUR4{<)`E&{YZy!= z&@f?vIc^!>MC2J`Nn!K+d#oove*e+Ojia7qjJ;}%iH4(I8@-2;P46NUy{R_N!6$0t zRD@3y<4hZk2bS@H&%@)MyfcofM4vNwUba{BAcdr*FP(hxeBo!v_Jfub5yQYc>~Ll7@~XZ0@tY(KL}29O0u_7Ud5rL zT~TFy2whA7K|sF07EkH0V*zprA~8U>^5Zn1EGb-pAL-W`-OvIe2ZY&f7s^37QvL&j za7atcAsnri6+9h#1@U`yI?c)(1}$xP_HRh;A`5Mdg{G|qV9l2o1%Bjjx=e0!3E#g# zSaBb#4AQE9fo(A+LK z-4f1c-)ZG+HDgOwTsi!{y<(@>nox|%cOn|t?6}FCsI?ks_YPr$#f@V2>}VJLvLIp1 zMnVBQr~%7}a`IV>>Z-9UeCH;~oaFKCNz~z#VTv+Z5w<(ho?u9ZCh0WdcnhwIFyBew zvnqgcV?aZhnV|h4#o^~q>2XF|IB-_Nt=1aTSZ~YK zA@2UlfBdaZuD4`G`qb}4aM)BYglK=}+qng?+QrVexM5uEOJ+K1OZc)fRn5MkDuL|k zR#xZawdg3wa%DQCN&QOGoa%C{!Park4wSBRUUDb$j-lCsR`D+>dE@eCN7ZBP@#m#S z9oF7Aq;)}!sOeW0SDku>g*v!0w%}oK-+O<;?ewX-n_lay58K@Z(t18)Kn&+h_puk> zN7e8-!oK6fG$ zTF9B5Y%VxgECqaK0+<1s5k$;|klA6NHvnQ(-Y2G0RY~s(3RCe^&#{KfVUeN*2d!{r zaa!s@4^&oPKIY}4c%umr?8o2(kc1-6;B@o zKWdnKS6k8LckHuhsTJm!!331{5@eCcoFJ2eTQgRP+}>7i`WlLpc9jqbzQ&RydX2Z= z@aQsYy9j<~7&u5uC#%O4nvJS22@JZKzLoHl>JZ9YdR3F4i%n9Dejc0>yP59&-%){A5w-%Wji}S22H0irfi@p z2?<1mJHmDZT8(%aV>@P;_B>UUBp0ZMl=YuNt`W-BcO=OeFMF!~?i>F8k3T%0)$qlO z0uEXfwC$~-Y>g6TGr@b_Tz>DvP^o6*L+`n3jPdeSKMXE5+*;(^i5(?qZr%1|;9|{H z%TEwSV&N`=H4wB`Nu&+K??BGr981rE4^D1ZD~suVQeL%K^dwtc3dAljYz5p}L_qC( zZ2#^uILAQIqoUc0=1kYV8XkUkBtWyd>{e~6nAesN6#mafQ$!EVu)ggEaygZ^`1TW>d5TBaM;nc zu}5G+ccV5NYmid{?feeBycL^m$x*|?Wp!KkaqX5U_N>BvS!qcQswDO6iG?Jly(Bch z-$&lIevP?pTg2hnp#JdE9V$UUMGbs=gnQ&))%c()G98Hii_A-sDI5}$XuGZC?y9u) zdz&#cUEIyz0VSeUfBIiQa6#MWvd${9A8}6XY%@fhxF6B=EAp(kV_DiM>)IL=zZ_9< z12gO}A#quH>XqW!^s|>+5FlSMjvt-Gq5==_{@<{ni({5s*|ST2O&T5+5^r(E?py4v zo^CQ@WdP~6*w1U_l|(}YP?^k$ebBV0pN|2@4}#(fi~VGY&_j3|%c!3iV}2@H zU>mL-X*CT_x2dLFZ>Sx`Y^~EegcXmX>|jJ}yE>fR=c^smsW2?Tp2jE{Skl-4ri;0; zvRDk*s_DFs1`j}I@rG?pP|zX;El||vS$6iq>=n!pE)uK&mo^{D#lB=;?R@i>TQW1~ z7fTiBjq2&m1WnNT6y*;%cM8P5MoVmdZ+}9r3!FR(tcUG(awDmzI(+=X+}0p_)csi6 z{e()Pl%6oBhn(@0pla6<)mLLxW2iiKOMQez4-5{ko-#)e#RL$5rZjEWv3NkT^1V{*)YFpZV`8%Y^b$ibg$Q$mQ0_Hs6)I7 zdyl)QylyJKCmdiu7zJ)g5gBIy^p+as0uc}9!~zf5-SIg#dRDD4cz6S&#_E+qI`Zj3 zX$m(vV(%~pmy*9yzroES{wM;-oRgQy}L z9kAM+_07}SFF&^6Ad6>&!t9`5z3ypSAvLAc%q5$UY&g;i#N|v{E=tQ>YHpF5Yb4hj zq%2+&OE_Xb`J!_nCFuA0l>nq0F{c|l2sf@jus9f#qoa91SP#b4S^CDx4`yVrrR{S5vtWtZ~<`Gp*GEcmVH{i9;6 zPBf3DOtO?VtBldbLe5AI?95O^&|z^8>h~gJF&D$`U6 zt#K$;*BY8hGw(Fr=E^!&w=PPHX@o{*uC!ycMbITeETBLtUx&{z67AkLg{LY^0~S>3 zstU7lUMJU;RB_xs_ZokH5!U_?178M=&@UGmflNG2!G~)v(z~*s#c{G$*5TDlluVee zP)m@|A;5LyQoxz*%6l5!AUd~8WFgp&@tSwJ1}d5V)wx07j0b3NkL`>M1!RAd!Lng;;!l70qCS} zbionUoBwo-ZyPEO3YFBC6D+&Ytdy;r&tGCk@waqW*9QyGS=RN1r0$Z8vRVIm#MpI` zI?PG2J9#NuowD@@ei_+%9e;d)Ye9>Wf6Zb{^-uMNU;Bo$7h8YGKzoZU!5}i5vj1G_B~FFAmMUx>+tW2f}BT+lwA^ zg5CRurp^l402oq}HF8z|7;1)$>?Gd${PT^d$NjHi+*hqXXy@#Xgo;pU{#)5lc?=KP zqf{hf6tDfYcc&p3E|9h39`sO3y(%itnn{MSbNp<7kwR&l9$QA?wngh&n_;{ZA%Tg(ITA z+EzXUw5M`ZEq(?rR-_>>nIQ#Tq}Ru$I?#D!Y>^XinjjtJbj_eJYkg$J5^-d&)w$cb zEXTAVvJ!95g#d$vd-jyN%OmyOjvaH`F;v z4Y7O23dH|husv#TF-sSEF-ovk-CU=t&Em>QtrJ9PPTgU2Ml8w)ysdP`HN>ETgHF=L zdDi{*!T-77$)pgg`+2)8Q|jatVkb0$*aj}5`V0$YDPc~{@=Ik=l9mt>WQ;+pn0(45 zr8`m_T8;_g?_-KHOd}H(;1!Qjw}5|FP|Cf=@0v)UC#PZ^u^G{J#uy8(27SXb1Pj)c z)LZ6CX+5kW=_}%%wA7QZcB0NsScRxlxUD*srj#vBaf+oBSUWDVxaSbY$>cB*!P_~=0EMcn`wVL5TGhM}3^Iq?*Y$2-?=?~3 zMhVI8#e!>n%C$-XWn6SaF3yMjmtG+}M4Hnz5#1a#O-VJM`N^CvOC`O1dXhkc*KO=v zrsZpg;y^DFzF_6P&dcdTg>!nNyV${|NnOQQwv<*ys5$dy>150TKsUiFB;e|xN@1`< zHv@(pFF&l1d2&C!ZJeT6@L}++d2w|d{LAjW-!YK4Z6qsK^6UQuHZb@69jC^8mrc6% z=#IAkP&{(K^%dV(Z{65vYrTx^1g{c%(7`9|9(kYKRlCy{(uFB=8`10Mot5<+yp1C-S z=&pa+@%mh)&*y4j#kolJEUV$$9Z~ivuiX%ZUPRV~8+0(O$O6X@sE z!+`_0Ew{Z@PyzZGdq z;YgoI|B-Q64OAne1@zXLn=#Prx_cqG6a;tMV~#e^-C$?C03}M=?J+e^!NS)=HkYn~ znQrC#)tA=x*HQY*J;SR$!qXPNKX9E-u42xa<#GG~7Z5<3Rrbc`bpKFAPTZTuFcW}& zZ5!4a;*3*HIB~}45K2-q`jE+RVpBJ*)Jug zD;B+4$+H>~sjNE^4oEyat%Y}SYq4vNP^o$|7BXlj!O95J=hA zM(&o)u{F(0Pqnu?kE629Vi`O~5;Dh;_mHNuoGPcX&IyOvDD9=i-_Bv z>6kbE zbd>rl+WS;4(u$PL#LqeJ$hlx9&ftKunf{isl)Wv*^lxgq;eiBcw%)GjvM+z1Fb76A zoP@GsDx(mgf>~sZ6o)cZbcu5~gYh@i@6i-pY72yO0kqXu8Vs21|4in(3TpsnP@-qp z;AQ2l--4+KaIjJj2*4wdwLJ#6=l@fbw^Noj8szuj96N`pN1xl1h0S!GkWaxax`$s@ zZ+uEmW^j%}-nYLcUx@bi<%@YiI$HS|szHWml{0LuuL>Q+!`x)Wlxs=buysG>oGNhl_-EuWAodRq3x<5j z&TFWzfF=Yr=_a_4jc20|UfOZ>O0~i24h_P_8?``va7O={r zUHiNN-v`zR;(^$`63Fmwx*EHD(mCi`KOlrKEP?uQHXHlMS>rnq8cfL5KMq-!nAtjb zZ!fr+K>kRp940;rddCR+fseGoG2&S5WMP|pAC(6r8Sd%MPq)-FYt1<#&CwMV2y8}u+7>v^ax7j5A*$3u)k3Dhl^J^u%wCgU#|>ogfD#;yS)himC=Fd-%>HnQco_baz- zjriKVSW9K6yTbMr5#=8s61M`02fMY9Qe3?aL1eNs0Z>|;$0J`rP-S{zQKs&3H)w~< zv~3hJZdStn-b&FqP@G)nE zT1ZC=yV}QDB4v7#uiIRDpHaPUbmXlDa^K+n+T~Gv#A@)yF?5?JkmjhE2`s)xsgpx%_kvxXZrFsT?iND39!kNM>ASq zAhU?$qBFH0IPlT$_W~p4w6U%O?0TgbEt+Q!+^Hn%9+r5Dj(sKn&g%Z*;>pF4wHPkq zGBR(>v31jBRrL&f{q#&-XlK#Y6ZNERaROm%p}uM3X+oK6f~28suKUbAx|g9 z%F>a5;mr&2?sy-UrWx}$PGr13uvI@WywkN0qyEONKR@cub?~jF|7T|N|7Kc(&T&tB z{D#B6yUo6P>pk$FK`qrB$bWk?{SKk__yX_bFVyoS(UqgeTYn*GeS2EG^#$Zfat9Vr z$)+T&ePyGurP(__y*W8Q{q6`R1QdN8f*h~y%eV>SZGoK_{oAjCV2y4OXc{=k)qS!6 znT;UxERv~SHp)AYgChv?@K<@&s9)=VxbN^LAoHevsiCd`8`t_#yp3+w-Kg2SV`}8d zR8X!=l3Z>S%SM4@@#N&^?!q&u;txNRyu-CkJef_mf5dCP zBt9B^+~?gP-3|j1n$|1Bi*oQ`RssDJH*r3T$xSq-a1YUr^cOm)*;0sy z=`O6Lhm;Z)eTX(MLlq80sNG4#)#z0I5<^t1z>3}epacE_F z!~(9VX|uPk#q_-0x=uw_rmdNW(a|*5RLRcM(vAj@_!+HPXpSXDIjM4W^q>vQmRgGP;$CgW~mLgH3D=4d_u3OG% zZ-UvEy=BSk1bQd&Js#)OF^eNoO-oV$a)?BS#W@WaKg~g* zmCSK5O`G2JLg>-ffas~k)W{oo%lU5V;)?S?dOSNO>`6hlAg7h1Ly2`?zbFWCnhpGM zu(o7FORM)l?doChc#vByR63YH@`hs#GaJ(#x!+!lCaKRcwL?dFF`hPt1B-}4DV0-lPvw-9 z>gU=E1@{EKT|5)E82>4I&G-hpd~09Z_Rq0@KyRl0--ZS#p^zEALz*PYZLuvC+aGbJ8vLglF0yu*W(5&9zL!07li zf%uYHdChH7lw)7X3R~QXd&BgZ<#DwAI=ejCm=gWvX{i3#v$KHL6h(xnWZ2=D4k{xa zHCK*+!YE}QC|b^^l+%}cEO4B-(Pj92Kt$Lg3V2Q90{c-4aC&bnXIQkcVEja(<_VeC z=g>apyiyLKPj(V$0Ch)6M)_{Q5;yaV`s)44!_YhHHLQ>&O=uhuN7(4i5AJX$mltN8 z_ZZNi$qZ5V+P5m*^76Rv1tzxbm=*frlSTv`=@M7sh$A=n>iUEOH7HI=McOTehF?lx z47A!LGugp0RNHP9B5snE84pAM8jo5ATG4qeT~wsOJ3e3=CQV`duo3!vZR#k zjV+YGuP98Y7G=`Cv}B9Tv8(@QbX}{Qj|wUWrrCxl{PkUJmJMe?TU1{s`>vAhRWig7dZpu0}qJ81DvY+t5|FR1eFD;jzsTU-<)upTI zFj*=}ejmGH=g~?`~}{f5Nipj+4k6o?d21AuDvjC6UxSmEFeA& zx~c zH@Dh_CDJi;EO*&V{%K-t zBZ+~yq#jj%`9Vmhc0j!ooS|;%1@S0P3(+5-1OzI5q?tw~)w7Rn&@HjWUH5<83n<8A zW6rs-(8Xk9!HL8o*(-$cx+_U4>hC_=aC{?a)!eb+n6G?zv-OVZ@Co>8$=PGRabPp@hD>to9AcQBl@z0UgtK0hn_xFZfQ-3RX7W z*C9+lp$>X%yIOBb8!DPITKaKLRN37isATKnyW#mf!^o1jW|v8;OpA}X%v)33GheZk zmN7&WkbaS~PMeVGs^IOMYt_S?>SRXnBKsu*o2e<$2T%MXK^yAc-+Y7kL}O{G96^ z=wX&XpBfM${NP%I2qj=Ev~?$V#Ua3{aM`vsym=2=v* z0nqU!5xlK-x6uBM8`$>iYrQkKHDxwm~KL4B# z7x4X#RUgTT^7)E7NxI2t?Haq90-Ycy1evO?)f5&FaK!{l0wU?pIN{VNoy7sLiLU*0 zKYzDJKhe*?6g3lw(B{;}M!aqFXR?;&1@NfjK_D+a2R~{AKj09>v&bi&oL){GOQyuTYX{ZCgjtCObHEtNu}~+gBcMzdiu*KXw>k%l5$;%IdIs@#sN80oq!iVuA%`GHbV{b;uY$oyI!)mc#>H! zKV{&dbbV51dD&a+Pc3x^56v(AsP^NJ7|yd%{ZFsbwK~>xd28mCR`8XBZYyaSP|;=% zf7uPXnv1VLDSf>%%dL;O*6N7s#fypK=R*ppCf@U}dC9dJaar%bkjE|}m4C1L#>H(k zxE$w@PjfSh&{ueUZE;Ja(YyKu!fVf|^|dT-zBEEulClXmP54Q89 zRHn8m7ldOp>3lLjp3KA`q>?II=j_xFV?8OC$}oJEuvyYcRZNUn)WtaqdNuZW?YzdC zu2XliomCbQ1tstn+fg|hJ^)MP8Bo$`9HC0wA#_TI;Sz0IR zX$_$03!qu}a?_ipDwz7Bhi@Z<_Tu*n&KGDUo($T5Y{JhGJgo(YJgM3sjP`U6pgNnA z(}DghwV$Hb(AGsROhVZk2G++#Tt^Ys9|GNUKNI=N8aG>gZqrMGiCx40!-TMuGsS>7&;D?PeHo z+cI5ctcP${QN5p=7z;tYlYi7ZGnePNQ}`0`Pla3qu=4#I%G*bqecj=maq*cCk9rE73&reFM_aUN;;8=uC zJT{i~U@pjDWDys=a4f3;*dg>lF9ms7Cq+2g3n}}DvxVh{PkcJ4^CqNKn@ZVdXtIFG zji@Rxl{=7JEu1@daBrm>y&}g4)kJOAGeO3GGpvX<3 zyS_Rl_jGw53o`-Y|2wUPtIfLj|AY~8G)|EdhjfNuW%q$kD`R9$cfRltr-YHohL0AH zY|VyQ9PX#b>-x4S6&td>7|rI9{X9$Z3DI^7)TgPtJV*G7YDd)UJ{QW;1-^!UAp9yB z?E%bpf%eR&vRWi z(faTbDkWGWf5}*KLa6nOW$4xqW!O_bi&+DsGY0v1N71r6)i$X%F#D%LPlA@+YSY_A zj}~C1mQOMQ8Ti2jyHZk4`T;L}s~>(uB*Xr)(q4D7h<1PR1MF`ZWuWj~wAdyVmL1gW zTSggZ?I+(`_OkObSZ<%fE1I4}v2(N=37jpZz*Gw< zu=cED*Jltyg$|$QhYp{{gWz&86Ba|Kfc3L8CGD9bMOjO-w>BCM46MAMa-RE|7ZiZC z{fpmjFoRqP&rWLT`<57lL>Z=SDLU)NxigbH2Jcs%ud;6G3z8O?p3Ii7cSjJ`_(*vR zBh9}n=;MsRb0J%&2xR!Y$Qc8F5C4mtFZ|kYMpUlvkiuPj7d8m63@mco5cldQ+h9Yr z&5e->4$OOp`1nhu=7Ulbp6zybt?M$yFaweDG-xoF^}E zDE|R)=)qpbGw8;un;Q=K@tt-dHVM8aN+x-K%*EUW0^jzKeTo;#=q=l90;uAgFy)kb zPgPxKFVZ$_R?j@-LB$Uiydvce!+eMPG3T~OJnBy>8^0U`Gxzo=%+caQ8S2A4(Oan5 zqKj7_Dnb@_?y@;G9yP8lmPul!9uB)S@mQi(#!H$Nz2(h23^pi%*32!jfZ732emdad zl}yz4&fl$IDJ78mKI)GP3uUb%1-1lL1b&XD0dnN(p+-H}eqPq{+`MJ(J@@LnQZE(< z&)qI%;FudiB1_Z6*CioX+W{30*v#9zC(3TNysC_neqMLXfV3oC#NSK$^5MLh#d=`% zS2*JKoAOcZMOcQB4?$Ix>)^9Lj~3I7{}3kr&Syu6x1#m&uMsZB6Y|+HqS>05^shF= zA{R{!eE9GM2i38e`+eo>oF>BVy+8&WV9u_vtT8=A^GH8(z?x`{Y5F_dsQp$&;$ z5Vzo)x^8`@oviD;#4e$t*U3Jk!tKDtcZMpTnvUV24KhYow@5I zR3^J6Q`;{3v_Mv!N(RLy*zq3PlC1#IvDa{LlQyVsUG)+$l|M|NRA(D&$QE~tZ~WUr zh4;{JFBZ@^5xCpHJ0A8MNbjxRE;mU(E~J-mBns4!m9*q`t%9bZ_T^ z?9hjt=KYh^sQgWktC&Y7%^GU8$w-b_nOb8S&2P;-cYF4PfT&<_NGS${fjjj;+YFHL z0O@`=xR!R;CvYYhD3*bN9fMvM?=EcqSyb+?$h{NKT!{t0$T#DfN_*$@M#*Le8QI#M zlLyd;O85b|oFEtS9{!8jF4^obx#5pZr%R(>w9E^o$cKwBM^KPU8DIKcGJ)gKTS{u+ zfsInve}~y=_fbfF3lPt)U`T@Y7(Lu}?)Vcwi6##N;-|${$!fT1-Ftb_=Pbh@O^JQG zI!3?`fg{v4_U(G+Hn?6BcjMxIv|OwvDte$h(y~p5v?`<}NXunQX;lJEs+y)h_$^Vr zDVfnX^Z_bH2xL&h6y_9NndfhSCoOLz#09hYJ9-i9Rn?C1hYg0V>Vc&4D^OLgXuKMrvt(PcVp|y4F1)_yL&eLa@`RO^g zaCC!J$9#l9rkx56r>?v^F&CPw|WF&V-8ySH3*t@sBVs-QLDlGl;D5XUGLCowsN%+=11iU9i?=Vek#PN z#g~)UQcOVoI)*Li-A-b%(vV$zGz4J_?Z2bV%R8pNI<(l$q=}!g^EJc-J^-kaJ}2&0 z-$LHkUS)0q9`A`UbOjA+OA8g<2yfkYi%q6~Arll9d*=Gt3=ULjIEFTX_K_~Dy3!bZ zfll7O6okbzyk(4CVzicS*$~|+eY&^FbUQ=no;Rc0-I;DxtKg65Zha5kfpv6?UFbH; zbay;U_i!!U{W9HcAD|ml(M?C`x<5_#B%!Dr$!RmC zHb!koZ24q4q02eCOlfl|ZO)~x7t&HKx@rZ_47MOLEr-~ORBlQ}fp4;$oo@pGjA@A( z52oeE5`Afrxo?2)8&*pZMU*zrkJ45sDBD*oB!qK6sY=WuW!a!POBFR!JTwfT(tL2|yri?u>H z&c3}%saN^*u=tx?bx4vZiNuqY%(5ZW^F&2;4KU0O+=YyiYN1JC86iI%Q3W%n5Dc=PUwWP;;)~}OKDt=Thp1J%zPhy5haAr( zL@ouq9t}C5COH83KG1z*E-$C`)g`mOlFZfDfHjolsuZVJM;Wok6U*fgY)!ctzWvIe&5_S|695z>jZCa zp-hbO#0{u_w5oe@6eSm_t!DHWzG|wG)jCvH*?97K@XSWW!3{Jq%!oD0ZB?Gtvc_-} zwsL1leX-a1%b{G`oV=0sXb9ii1HBHtUz{fo{?elbh<_GxnROXZ#)k$--(P_HD@o(%0I>%O@JUT(S_zJ08<}3Nnjz5p{fK;L+c~~Wr`Vf za=mKZJ+TWxn%ea!zvgYSX)D%xl1vwysHPl3A15e-NCCwRkU2UIMY$VRQR#`x>4R7c zcfB_*+Gv_Glpzh)Pls=AQSmtq*y*WPoG&Px0)V2bRJ?L$1^ggN6(KAkjgqcz&2yGRFm469O$qxtPHj)pvJ+Ylf==p;Axy&bW0N>kM$@C=N>4J z0Z?;K^N(?Y%{Y@Vg2wP*|C+bB?XYdJFk&Q0zF+*uLXO(|5|NjbB#<4DDyyZE&TD8e z1uLr#uL-%8L)nNuMsmmIw|jE^kJ=RN=zA(8ze!NqDv0rTN)z zeTS_P4`B(pqy0fpT7?)Ui{r+p>B73bsk76Fp+}WWx7zs7!eU3{GWbBPg^+)azj|5Y zixCd29I9Wq;cS)>Ds$H01U@({!h}0n`@eo9kWJL7K#w7o@ zmvg4NGLwsbWr%fGF~-RIOj%kVWJ?@Qjw9X`ztDq zjf8_J5|e}7MDdG5^n;KlkhNsxEGx*_vIjO%tiu0Fuc!*+v(Bt`_kHq7#z9b!Wb5`D}*NGHXFw(N?q-ZADwrfO_#(GzWb9jR(}e zNMS&YM&nQ_8b{3&Q@o&0H|>bO;JD7`%O<8xbg&ME9gG`Ch$JPX1FcidxWyvp-u&*D zV=P2P6#VB-l4g6ML2e6H*P9*JrD2WbZQv;pm>pFHTcJRJv923#3HYCz{&VU{7O;{} z&mM0_j$WGMjj7c``8mb=RX{@KcN@F{MF*}F7Unc<={Z#J2nh;Q$k;UP`Urgrhl_b3 zVWrPGCAY;HoG?zdZ{FWJ34u?FQH?>kq4GRZHhK1SYkAhaV=%d0=-+1C z(7@q~)`#Xe!E=HbQ3$2H>`{bQ`oz%-=h3n{@>3f+>qViaS04{Aj|!c(+(0nU8|KoM zOZ+GW!1Lq`D=O_o$px3676`uQnbq{*QrO-L3dt#PG}f|Srn8vRaH^#>`Wd8vwxHG- zOR*)zTk8N_tOksz^pdM3?=l{m(ejj{ZffFT-K}|*V<1HmB z+D1T$?1jct3@-Gnh(11jdB&n^U8|#jed9#cT=NoGL}ceWtY>LRNFejx*Eb^2$gys1 zO`;5GQ{_i{lo$=~s~ULnv;89y%Y*?)MYUHyQb{?{(%-sj$Lp)p3;(_SOXLSPKShsS zoR-4DY|7oNxc^9hB)24t0veJh1xF6+BxH#NZPt}1|6a=Sub_~YB_0Y5bj<+Wf50qD zEl)pg?+pSs03Uh5OIBho8Is7UqD+3FtCsQz`?LAWJ!84VHj^$phFxsf3z?awPadToI zZ%nwjEE`J(v4yE=M3CujQD1+`xcGN;;tJ$PEpxs$n$q|;0>AIi1kcN7!Udjz7L=xb zc9;~3u8$3+AVgKxJMtlrbV!asG(MIOGkr!}R>G*E7lL^eJbhle-}<1rDomV8TC2-viwZ!aIO^|(eM_bNRJnWlZ#mV3EQ$= z=ZSc_?Vw`6@e14LW~nbaUwQ%~TSp-nd>W7*Ps->ziR2vMOI2v^fA#t6JhWs64--cl z&_CYhhn7UdUy^xpQ6hHZJW?n#JQA&eN21imL-KAp6Ev+x`@a!;cQT*h$N#ua zO4bjsPD=OHdKjNr3LRn2E~2}m{#dPOT888b8D@81(}8kHLt4cXXG!bDgHK)FRygn` zgdIS+V|Wpx)O7D0P6crvT0|fI?l|GNoIojvRZ%QSJ_sx(JZdJI`eyb|>Z?O4{mG@M zdDGB7Z4{nn4>ve*(c*I>7JOrqOKyW+PIz|Gkt`bSch>x~p-csX$9VsF@qFlq`-%6J ze=1e4b}l*M;q`kDZhRf$b=TBSw@Dv}-^JLXRvCQ69t)C&ja+XC5VF=x0-;$1m#QOG zn)Y!|hMfpmlDed(9=)Ckau$+Zav@UQ96&aJ?B$>82 zsJN5tg7&(J3Tn}iM~j1!Jc~mp`c8>Ck@rvPL(L|8Jjmd`Sot(9UR~s##hCe*QJH{? zWl-6WO%FR{Tv@nbxN$skw5Or9Rdci1IrJ=pTIZ>GS{nzy=Hm=WxZ*rszc5>wUM=JS zV0%@myRa(b=N@LZwT{R~wxWV%B54%1%O;JQ`96=7h01=HAd$-*6Qg#8#cNrigyAsC zx+PeQ%x-j|QZU#rHfV&?OAAKynpdFc6rWUjVwgQc`l1uztDj#=VP&&L>s^xolxBL( z_lfr;Dvsr7Wv0C>>E7Pu)oyh=2be5MV&k}jp%uOSGfE8L{V!`i5jrl$%9rltYP#iA z$~Kl=$?0a2uYO)^|0sQ)VZ}Yvx@?#2a=M(c4#Hf_#ay<_p4t`{c$CHtC8o-k?0W3^ z9QO;m;CirYiqWF)%84-&O_F)zbl-hqIZifON-rmihwH9|_8pAii`cQc%vc1mx1>2P zcKc~e$s+SBR^D0SRbvaqWw|eK6m$b`$7>eZ7BYOL8?EnDo~7g5vX=0ZUC17$T&060 zFR8P&9fzKD4&%8UMlPOz8w1yU-;2YB6{qDd8OF7*b2(So?s%dzVYB$^cT9jx-cZ7p zZkPtdCODgx?oHavz&aXzGw~0DHO2mA8~U-?`^?qq=PJK=on8+3ZpiwO`{rejtqUG9 zNn2c)n_Bo6c!VW($N<50Gi1R^wLU{0wAt%ieAK=~>pCWH)R?;NqbxKYtD>(qnA}P0 zK)%nL6MvXlBZ(CkWA6FSI!nqG^Ryqo(~I*-((vNvK=p(!zzg=cti1Z>gzaIureDyb*v5iFUms+69*pH%4+P5?zfy1xc)!Ql#Y7Ux|qS=@kg|HIAA z$_>$0++0^J$O+ztoh!=POqsYvH@R4zsJE9I2(~A>k4qi#7>#4UxsPe^XfJ{6O(-D4 zNgl(2EJEgjbf-F_ja07N#*qldh=?EAv}x16HK2cw){nwB2XGXuM8f%Qqf3_gv?Dew4mfJ?St!w3EIa*erOdfM$K? zj=d_By8^;E+%lNGROV(T=<*}rc7f;x_8XWFbDAV;>iaIT9!|PUR#o883E}xk2zLaj zXiLJ)n$0{X8lO#fk~M1gRjL^(GvHymdvVd}k#?K#=Y!5irBS0t6K- zV~FU*T#=;iAaOjWJt-i@f`HZ`OR)A@vP($IQqfc)?U;R|-*O1jY>?7Lf{M40RYWo3 zz*U7BvB5j%RY`B<>bikWm{tgH6>-}43ZzC=+|K>2>4j1&yS9Vym7VN+rg>t+uwiw2 zjOdC^{vfBv=)giemH_ucdV%}n}8oGNXv zPQ>lmB<g;zMM0K->_c9_?ibd) zhVn>Rqe^^Ux9cc#gNESytoYNbgW^~+y#u=qAYZZ5ZHIDOK?QLS7wXm#{Gm%#9wmn| zRyRyp(z|zNGTlw%T+e7Jt9!?S89@3 CZp3z{m#u&x`nsa49Vaal^fX@HlQ$c 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ℜLSU$ZYc13^ogZ2EiE%{F{e}kv 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�xI{2KJI6)gW_}+ZCCqP^b4}g;=X{YOyg&@*%!8Bd~ zham+`!39MUgO9QO}WG4BY&;->rJr2n;Ot0T?Q8X48i^>TtZ~BsO zl8s_ro1&YRnsJF`+A9@~ReYrYHk0%#{D8--0;Uk8(HBWNq_{SyCCSbFg=H${H)bC$ z8l<5ov-&SD{;uMuW2F;4405DHSa8tep9Bt*LTfo*yF?!2^Rl^lU;O#FDab{@O~*9i z_jfE+k#~+kuO6xqF;m)8x!S7DlM3(Az7WX2Mkd2fff#_=b`KA3Xq+0csZ;X?MC zI_Lg2lKh!lY-W-_gU*4=x{#%>Cr9|K&ouBue06KmH@a+A>YQ zYnfxU`K0@rZEwb-jJLedKO)chpm}{v^qt*j>_ug3m?b8q5~ZRWt72c_hv>N zB5?0Cx0($*2EW?{Z+LryI{(taF#Bxx~6H{{K;j2X%W;>(-UYu6lkU)ee@aiZm(<0}Lr%!1+ZxJYvPj(bjUZ(0nA0 zoy#rN$SXumA=R1{V?2W?+z*N3Z&P@~8;6<-@09C^tI*awigJLKUz9ZYQ9^x%+7uy< zM1cB8C@{NxIX0{;PL+#Fba3$5b)*9 zAY`t=QOkP4BKv9|%`IYi;apLw?+W9LNk@q}Hf3C}v-*|k=MV@og9Y?Ti=LsEG*%~j z)rrj+v(^rd*(~NwBwR~KTU_22trPnFIW5;hpRKOE3{{_*^GC;}Cg7)P*|17k8Uqqm zb8p^tnEy_oD!*?+<4;YJe*Qp8y`_Ra-n%2R_z(B0R#`>> z?3)iYN49+5Y!h1b=lylc7%6BXg`7!fb_Cq}H2vZVn;W9@4E0{gzb+60UtZ$N6V!wf zkmQ_gZn)N-az}DTycE?y)+H}RJ%D(#0fU{HW}C~|VCXQ0BdU#)<25EZS*y5JeX`O} z8mkG4ANYgKSYvNp%gX1kGsRl|H@(u#bS-3fZ7`d?=h7vS49|U5@R_BCK8osv9$57% zIcWIIglCq@^nARE!(;o%5%VFs0&EcukI1Tpuvcm=@kS5Ko#bWvA;jy2!+Vl)5N?ws zXS{;Lb2V$6#qDy=2mkIOb`fruLRY+&!);ZMrKO73bHK=Hf^Mf#p>^xD{<Uk!JN zjZg3AM}BMsTmQe$!nDP^P#Y-kgun)SKx@N`f}ks_!MG;GeLEq@CxQC^Ovtv1nCoVH zPy=nCwI$xd)cW+dDhOU_iuw?ah@O=`PHQwR?i7!7Tr7hV`0=*}wk3fRj?lV&a&!kf z6m%xEVUM1yFsF}zYoc0vp1=z)etu2jE zVPlNIv1Y(qx;?#A`25Rn6L3c8m)wQ@CnUqRbo>vdQF7dELOeO+DQF#t-r|6;2GQ|TVVw_*cMu61qeFmh~`%HjL zmGeIAv1p27hCLQd1*o;iu_%bGXA2ZNh^=P}0b=ojL1~YqlJ1;Ozbwre$KCU3MoC)} zhk42mClxLclAQn$e=W%2g0>OO#P3HcTiu~h;v)g@5wsTJaBXlQipo9a6zquf|9XH} zt)q|-lAQn$AH}&K7wuH%rLso=^}~KP_i-6kO7EAzZ$1{FZ1}GVc2V^oOOKtGKNHd|+`gc=*TrI9fcRc;2I|v5<5ANBekI%n=@^-+lb~_lkx| zBJz+OZE$$+;bk7VM#P^Ke{w?l*eT^ARk;7?gN!D^;u)$DV4Pe0=3)|{oCzrvf1dhS z4Lths503#OrT9?%6$A%zeKfr$`aRvjZjbp4tk*bHzT}V z%WrUKx;}f${s~inrt^b^KX=rQsuMfYl@bAID75v;a!@pZT|N z8UOojU^oFI)g6JK5Q40PhbY$SIbP#B$BqCGHu|jU@NfiL(o)am>cDCK9c1Nz*3JCf z{!tuqr^O9$`{j{aR; zSGy{c->Ui7`kL3x=i0R2T#W5S`JMCfA}{Lpc2+N3@|^KIc_OX%$^t3EMUtS83=u-9 zzMk`;?A=STknT{wFnNU=Ie3LL6E7W8oM;diP_wgPucJvHu*~`jODJZHE ze)eeV5{%D)$F5ciO6u;W>+b$?*DH{T)m{`y_WFZxZ;4G6+j7Cw}TnF>g%AqjmJirpDA z)&q_>!KcF73LYZ`UKU1JG`Y*K-16x0{TEG4XRt&6c|D7+k?rD5*_qf+ryFW+bDRv+ z!|t>d``;fwE()b-&A~y_g8E&WHnGo2Yq7pWnCo!hPnvMm33I;CdKH=oKT%{kt)XZ#X)Y))E=-? zN1oG+Lc(fiBL%Us;|WG+%nh1);M-uZ{6|}%(Gv^tiEDk;TUM_ zoD5mz^o{Qogk`U|KZU84a2cSgipK^m2EBaBs88iXAp8`wI%%^v@6ylGQwy;6ezF3X z=ap9=uoQIxFEU3pS*q=|;ouJ07K9c3P;KlA4>ec4=vS~ALxgLFql$K$qez8wdU-C=3-zRzE*;CPzN61t9;^{rWhfC2KFKyq(&e_Xy4j7V$65FmBrHf@Xa_8`gHVvRQ2lhAmvbuM*H znzdg#!0Ag%5ZlJkcnS6!;ib7nwdx^X3m{XuRM@3ENREH z>qq9)YMgrI8q~9Da%D?5stI{*619N3cLSfV{02a)I^&eunxQXBh&C+QEjhB~sy`^+ zxe0TDOSJogarwa47c~`V;z8rYj#5~GcF6wJ3D*%4^r<2ScM3IdLM*()&7!iYlv3BJ zcOk3>qnPTmmfNj9iv8N&YT-Gwogyj5Lj+7<>`>22;^V8aW4}$B-H+~~3V4L70Br8_ z{uC$5;&S?2klNeoWGAu@IUMpKasc@N`54(H)GsZ4_L?JQ zgQo0UWt}OErqrMt(3;YHeTNQdd%w>d=LqS2+2-O+yiuGERLYTX;F`)IYmUkM zE}}sVN4&hnV1`pbwtD;TR!XItrP~9;Jc#?kGgbgI4%+9CERRb=xuhn~O30on=~GZ@ zq7DEjaXF@2vJcdA1Ts<043R_D9q@p}o7$EP{J>?d;NwgfB9l!=oKum=W(~DdvBzdX z8k=bK_p6~uzH1Z=+b5qsZk)eB!-l6w++m`SX*C^o@Bxz+H1ak7Db<}X_6N#1gZ$2V zhO|++mUIPTcurscbLs%P#Y%ycc!Px*{tPHJ)i20<{0-5&-TYk#q7r0GH}$1W8M+vX z=v3KPvj?aoHJ&D|Z8WRYqt*5u-DC8_nt%!S?3kOm%Y5ymN%^b3v;0Bls^5BKolbRe z{ZCuSg~~=W?~x+c-oMqo{HSjk1fKw-8er{|X@?5Kt->mu=_8DtU@lrBe*{h41o$dH zbyC(!lfQk6(!KZ#wHFtT zYu31lm;*RtYmj#0SXo*7Itu^p8%w#2Za{RMa{Mz?iIG_^>kMWgK|#19c>2xZB_}KV zcv?9iY(jd61N|$K+0}M{!KZYa<1mmitHqi+L$C*ceE{qQ-~a%J0N4)(-H4P|9Wxn* zLX*dK96=_o_LjYUdq4iLj#6l3S-zNg+ApW=WSS~`WBNRnIhI2~TYqU%=h``VG`hPr zB(+Reuq=!wj~>r~6w0)qS$3|yq|L+*)<~&1UJ(k~c~T>XCm-{jlqZW>N$gahkqEqy zFEA)=`^EgsR#toQtMSi;LL>7<=FXX<_aExC#4-xEThi#2o7s=)y3SWGs}kzlDkJ?A z9vCn%+NzlRM-b+NWYK%W7o0)?+Wx`53dwdXeT%Azdp(60R~aaA#<7IFsuoD8=nd?k z30t&y9Hz6s1}X-lphLp$SgdBl8G(PJzu(=L5;)r>aJC0pn+{jX9R?wp!X%t9J&qV+ z!BGXv__&1SZn3;Y=BwKjRcs?z#l{gOoD@XK6drUEkEpI#38`0A*wIHoGMtfPF+`4v z&6mx)`d40$qIE*kr;Qbud}`t~ZDxIgUfmStsT~k_d{E;Gpb%9zY_?wAwBote-H{C5 zNN7zbKOOt+Z}0v-brnLOQxe#2brtW%qOaSMP2Z+&ztE&n@Gd`Kk=K>ZLT;Zb?9Vw|DCPLTLfDgNl6kSb>PQskmhgHMLtx!jHl>bnphfq%WHSWRjGd@)I;bhdq7y{KW4J zok)*N%mgmmp3LUdAh_&Y{|E2M#<>#u+!d4pzeP8Gm#**))h~Kg`dv7g<@E#J%=#_9 zh6SM5o_n|mNL{OntnI2JRX@bXB;GNL4~|1GpE-?@oFk7qt4B|0eCCx;>Lgp!-}KM? z7OPFGxi#%$O@ma1UErVjRBaSl2{G_LvW>&BaQ9udAwKdVd4Y)+%BMD-^-ySgrWBpajMv1XtP=?;SgI@hxj<7xW#2LpnH@7j5GqYl*GE137 z%q`3c=6>d0<{{wu!5gf-e+E;&{LmgAI&8%?H0{Jk*3|HFA1;oEl!(I{)af&PaBOWf ztc;S-qlKv6Tl8OMxCj^`AuzTrD;=`B<6CArr5(PN`)8iVfeJI>faoW@RPwj)$9_cW zu}lg0`OqX0tC0Z2fZ&oW@vq9GApf-AiP|^Wx-e)DS}Xjmc9GI1v{v$doybkdn6sZA;L<#>)NZ<7N6& z0jyElwn%piaNkOYT|?K*BI;~^ve=PE{NGJp|A3hcG_ z8a`9hS(poq$jD=Fd_n=4CbJa2G*1Uzgb(XkVwn06+dJIcf7?;1qU~fKD^-RpoIlbU zi_M?*l#8aKLes!Nydgro`JU#@_8f-%M~zu3XGl1M$r)14ka32bGgzF#mXAZW^B)_o zVS=RH6-w4?{}SPuXImFZx_+Hx2fzN~p@YugwvjVk;WLN|z2PZHNE1GYiG zq)+?#9mwasQkAjqo~;r0b`udzEScVAeRF?+=Ix7o#-I92j3%O*ShO_OoZG?^C4K9T zqRvxZZU0b{FOzV~d#>6(#NPS{3C*#U4RxbwIyX9a(2F6}KYn|T`u(K`pL~@aI(ko& z>6tG`vFc}cJX-FQlb23l5N&T~ju>Rq!zZ;aS zjjE^FDK1lw}n{( zqJ{fFaRH@fLM*El){a(@k+*{5n8g#A8#QKpUnDfO6>fge5b@fX1^Ke;&lBxXp7w+~ zz?Nd4OK{bPZ$UG}HQ_U;cNC>y1KeM86q7=%;W>f*0a8VF6QRcT-3v-%mSZ&B)Vyxp zggu3qvXZEB;pt7%CH2OsAv=7^7H*yT$A!bQDOLjX>Y)(1B(Y+299Mqs#jYfU=SQ!e zFWQD5c(0629N>`LL;>UZ%G)L89?HFUdS%HnUpt(-ft$?|+v+|D4?D_Yvw##OH3|;k zVoZ1Gi~~qc5>YB3b>-5EI{_SqKrs>|fNy|PK?hDw38*9&@9P5-`~rFy{0hzu>-lb{ zZ(&s&liF<99j^~KV-Ch8Zz9>kHqm*!W%Vjf-?k2q83kdK=&mzN~VF5HZ)vpC`z?YK{} zmg0P5QNhDKV>E9}mL9kg8NG0%FrNF+nlr{VRuP;Dj8oj)nSbNmo>7K}9U}zSDyw=P zD=boZS27rLkuhX&d|Xe711&dOrdyuJtiiafSezSDa$zsa1ANywfh|X`Nvd{Gjeu58jVra>)d+^4&s#(>>^--(zZ^^B_1kA0C+g&1 zWB*2X_ObevMyQ^l9A*5{(Yjw+Hrg$@MbfhO;4TMdCjfT~kU*B+g>?BA4)rJ$Lnvhl z!`%r}mhE+8RedRM|`#H6J78WpCeYlkzi`9pO_bQQnC|o&=0ZTPxoXzkt)&n@J z;mJ_Z$(-p`3}+VWd0ElIh$k?TzJEgCMCO2e{{b;u@#29L_)OjshWXcxR?h`OcLaOI znQK3v%c6i6%OegafM_z!%VD0lpC7`CNUZUS@_leM!_gJFaf;EqA|r$We-I7#buk z9WYX2rXomQyg-ynZ0ZdT)N3WGSG5&P7lejJQ7_mH%GHVk<9^yVwod0ZRXQ8dCV@gB*^mf+Gz0@<8Bg*R zVqwCIestJ|9L4=L@yR|zSXUxDj<=ILVPVIAG8Vzd5_eB18#lvd9R1!;EE^e{k(7CM zI^iu@uCYX(I5x+zk|WuBZw@Lc!~rN89fYFY?o8-e^=~A}U5BVS?z5tJI)BPq@|KHU z@!#G=uwMjOtc;4n;)#_{N|sbzG#xpOA9hIu~)>?5|j&lWkD;HR{tY6Q0T!>>FAip~0c^XbbrHW2#DE40J~d!6Bx;JFdfmD7GfM-V?!Z6WaQZ$76y(RkdVr;<~z~AZCj$t<)hHXs$yXz#U&_u_;+*TFfGyVsVuy; zx|eU9U!hS6S45r?cwy^UNlB#J7?o^ASrc1Vk3N?~k!`o0MkC*H50h_iu zKC8JwV@{(ecE-vsG6-)_q9G>+G48RKU4&PF$}%M?22IqItKgEcPeq;M@e2wajUDZ2 z&M7&ynHjHE7lRtU?;c$F__j<3H-a4wX)$ry!^SHrW3b&!^h3zLDL7ZVwO za@1HcGtqi46qx$tKU9l@8i*ll7wDOWuo{$doX?PIbwPzuKFqdl&t0yyGKm0lMj}4V zz5r)AMjl#8{(wcZ@sD-YVKO=`cj@aK47AcWQng5;PLt=(Ft~ZvVH&z7eUX81A0oW? z_JYr-gE$M-bW9KUuI77Xd9t?mWYW@tJ}J^5B8};h)K^IgT~g8yq)ii2uO=ziB5e{R zC5;rJLF&*W^&OUq8vs(Vk?JH;stqY6{6R{!q{7-Z6|=cY`>IkY_f%?RQWKC=9MUR5 z%9c{`k>Y+O)gK^DQ>5fcEs}HuDf$*tl7>`o=aF^^QmP~+{6OO9OC^TN-~UCIhDig) zq?Yfck_&2>rPN0%7(p7q&Fmq0RkNDvS^{3u2$~oOllvTt;A?V~aNx6&Y@YuMp zh}<&FEyM0Qv8`Q&?Au2_BWv^~VF_1RM?Zfs@{^>)+HTa|1>@S$VIwfIdVlW+^FrtW ztNX#cS4L8HfI|3D2KbAX_?P?&ZZI@i8$od|);toznK82_`R0|gb(bn+(l0*VJCH>es@IB5y8y>qIW)i&hqh*6DP9K?+hB484y+v@6i5_WO%O09;|czv#(i z1!4=xG_t<+I7wjQB?I}TM<0$OB`omA8<1<=Z4H);Xm0G?*XOQ=ox0y01Y98?BI7F5 zK8bWJm7o$0ejxFrM1VrjXP&;8xdzrqL5gDr5cD~Oz$v}}U#`3kJ|ri(LD3ijz?aMC z-Po{%xf1$jYUMq`HI?Pq3CVuCDEk4kKiRG?N0|KJO;VB?1bqdE;Se9M9K||-9imE9 zi3(UFOZ0Uyvly@!V{R`G-aw+S3e0co!>N{<=>%2w1?JvaKV)bYPR?AmB4gB&>dF1mJS_} zDX~JV5LIwRPItbOlX7KDm(_<}07}r_uHQ=+^N=Jd85%yi8?!N;kGve#O?bd%Hu>Dm zd$YUUlN<=8!(ZIqy|CvV?TCtI!cP$0x1W+?(lHQcS`uyXL19CiTqB~f`1BLV2L zf~?~YBmygvk&zLg-(n%=@v)Z^*WykYQM z7jQGK=M(r8Pj{xR$%IUd81=9KSMZfACzh`~&^=2)l9^=<_99pGGM|%}4@;P^-s%c^ zeK~P_5Q4@W{6+{5>^Q<{t$wqVaIhS{ERI2__QgEe&IXbskmmSOEq3$W&o zT!zIIsw;}+NRas1G;6Z$3ic6$4WMn;>)W@kkpkFm-MZ!z8-q!blGGskL-~KHwBx1r zu1$gmJFH!sBzr=CNrz__@m2$i791vgB^yQav!bcHE?A`6;$bf$5h?NTlE*WL;cb!! zLY8{Z6%(&6-Tu3B%!mTdzJ2A(M&i4MtPDei&|lMwF%zB)GUh@vWB)rF0u@|*H4I2S zH?eeSN$mFIn$(^>gM53ALX?J&5KYDJVK5?LqXmI)1o*M_=3~9@N>9yEqh}kZiAP(4 zJjC&(1Nj4|pUY~UNR`>Dm6^66(HQv4%vt9_>P1H3B9MDTyXCew@%iftn;`ICg7U~ zOXpNmx#xZr>JMsi%*YqsUB`mMF+8N7+{^gB$-GnO^KKMs6$qNf`S_!l{1DSJvT78O zu`%N+ExmAbHXx{?vl7k^NwKtWqP??)`dAXZ1{F6f%6Z!I<>v9 zlE-<2+<6ram5iY4S!wLmJv}Rr0(^5(uTF-Mbwcq(xw%^|Zf5mkVWyZ7_ORO2O8$mt zNz{*NK_}nfH-hC(&1QkUy!v*wZ-vLZKB2#E%5K;yp&Mc_c^GEFSLqe<+1 ziEF`dQ3QxW(Q%j30^qn;E2=V19clnc715?gBvSUsk2?C^#J5?UT%-_y0WK`nX9~zG&;`h|< z`(fFEt;%JU6g=iV!sHZR4LxV80YcK~W=#S-#s?Q#t70pT5WqJsbH%Fl1_D`|Q<-!! zTXj;?zbTbOzKN#KQZgY19frQATj{C;_5Qn=5}48NWM2)G!0AAlIRi35PcbtKGEC4V zu7(aQFmy}A7teM!6^`=F>_!gEZ{VRX0T*SH9*9>tFekUwJ%HbS9}=sm!APX8|=29=5VJgH^fKmT~n1n||&(BN)X_TSl;)=+y)o zgNC-OAW2ianDpxUowtIjWOcdG7R1f@YmAjt6^T#SHY#}uGdJB`xIWdWPZ@A#pe&`IJu2B}8723OFv2r1#%Q3i<7$ZSiR!Jk ze6Pklk4pExznbW07|}Yt#wS8_W~+WkRhbU-M+#DXGS%#_hx&=%1n0FS$_^368+aLr zd1GexxpF93Yi4|&NQ_3(4jB`_%&!0AkN>0a9oC~)vAb}Le+M}Ahwa=odx>Ch#yHN+ zG_=zaq5xntjWAJ0^;1cB+{Mb6UQd~#w2h3Z-3Y%NFT!77BgL@=bK#k zP3TYju`-RoBkpygNT|+cm#0bbztqW5=chwf_J}bY3=LD_4yEbc##UnamynEi8cl7n z?FG?4W2zZiR)l4KU(=t$#F;sgWGzPo@xdHoKW*A*hX7hOKq~}j$$;A?kTwV3kRdiE z2pgP}d|zLMfX@Asf5*P|Wku2*LtKr;_wAg^P-3~Cx}2ON0%F@jFJJJApI|8@I zGIjBBs7^vi0bk=)%1|JPsG`37?C@@0Z9^JUF&ebwfGTr~=QA&1b`chGmICGhwFuh? znIamJJk`A*1wladQ|SlY>~*&2|SY{G1Sd zL_d+;Sy4)N79s-nXxlfk^1g9L-T%PnLcSjP{N79T=;(SvSZL5Mw87OF9?baq&+uT& zcdRI;eh&NsVB*|BY@_L_+WBWsmNL| z0vKR66o!yaBqEm07GiU1esKVj*zzPfrwCvHl+Qd4unA32Z&n) z9ffg#_L6YLm_x5N_W5&>>Wa=Hh|dNU&*X2@zw6$)aS*Qk>}m1hj3AiLM|5w^z+PMk z1x~EWB@Py2vN+=W)_(goY0q@pnXh!U9$Lm%gC&UMYns7^0clOb;$?p2c+3 z!$K^Rr<)!h>p_#_--0h-AgkM$=TMQdL&5CthWV>5@Y)Ex)&Z~ez-uk=S_uHnI748? zY|4S^98G{=iFrA#xQ&iX39s+TUpUKpFYP-CNF$0eR12zyida`$+cxZmk)C)?*DOL? zw>pcL>F-Ls<&&Uo!Qlpyd8p8ykmhz>3SZ^`)d^9zSUaoaCD@pHogJbszXBfRxb|D` zz{&{Y(TP?``|jEJ6TF*>25Y+X+`@utw8MytoCKPv3OIqJ*s+E{&LcXwS>JFHH&2k~ z!suxTaJ=7FM*^kOix}%v*AkqSm|{4kzALNn{&HRE?J*vye`zNXsV(6MoZnaWsEw^; zjm}Rv#5X=i2WM=DKNarnJDXImv6suWd*Do0hIs!-La|DB*N!1-(q?H#udoQAgot!9EqnB_ zIo`P)^E(U@=Be}a%EmYkn+0E<%YghP)#7FrZ8T^`Nz%r;LZ{Dy=|E4XlhtpA5}m!A z=g8I|Jc1;7{nw;p2R;q`5ugn+Tn_bcS?-5N5(mme#IX>6rp9|Jplch5jjz<3!NWAwxd|aQUSiZsO%gDYA>m?c9p+<4?)^F70 z|Gx~psYrTBI~U22svn0=o+j%a1j(A9&&)+~kW<)DZnL#vXcr<3ZaA~o?;WbzT4b~8 zC|s%q@{FF+Lgy~nso4wqE=&8s?Cm?hV@xm*7^A}rcb`TNoJ!aBBU`yEP)C&@kaead z^$86Bij0hJ8TF9nTuNa?fw@`7m892gjJ)hvbfgmZHZ+*%sPbERfU-y@qZjMdLr_+8 zbm)Yao>MyuXq$#;>Y*K$n;n$)J{c7G8f2W0DME6rlq+-`t(BoB8afNmSMjx2-Y;`( z=*E#us!Ck?0DwDmp-$}qhPEO2v8eL^%npZPMShCI{uV4B1yB0COtTPgi#jOJ(-={f zjj0a)T-Jd9iU=MSZcv7lp-kiDnH`?o-+K#hJPx5Q2ciR_n&J?$3_BNV!{BdW&=rpK znnsE_zVrE7QJ=5reu6&(tDS`DrDP4Q!F+`!9M;9k2U?-)2^K2oU*`29EG%Meqk5n? z;RHT#+hEwjXyQ^8EI!l5=p6Q+OSuEm6A>VAip%JN^aVbo<&r2+sgH=}O6;9^k0!L) z7R`VJv#TmwoiudZk05@ZLnP?_N271;bEg`KR6FlAwCK>oQA`^UF=|>Fb%ND!4#$k} z%g%&_fj%i{?*jLt%BY*Tn(c|DPu~QQ^lX^pDkqf{&jWu(@f`(7stQ_vn+r32i@vSW z4{0%tV&`y29Mrx^oQh^WfW+jJu%h#FaAn^n<0e8e$_LCd;$gR0~wxh{HQPD!xCU7!;Nb{ICL=|J&CTrexp&1D4 zJpw&NpCe>TRc{E#>^jjIYNdfVaf3sEcKO<^HM5!8DlG(-9G0lCTqPoT@ZB}W3sQ}* zuOLiUOfcO3L@4$yIy>|TPK`cdhbLRT@s4bp0+EtP2J4NaYzi2zZ= zv<{NTMM~>2#hL0*{pl_Qf!6EtbGiv$^B8>m?kTx=&13IcFheyKM^|=( zswylfMy6Rhg=uc7(aOCB4O+@bWQsGk5eN1X@>WfY9F!d7FUbD+=;(f#M`m!_4ph$M ze1}rSH|Cv1Q89~&PtX$-g{u=o)sUHym~~H9aOZHqy|F3CTsoYGEIeXXIWqamjLt{o zW3+7RjU2OpT?ER{aTa!f`ebKg7o4XhC2djupW1^sG}7;wUSuc|+^DK}&FC9a0u#GojP>2t!357EdBi$E$6q*nqtV*IJg5zckr7nsWY9$`xKeen9~*0a0+ zGLZ=hspOpO`x-elx;Wf5&fBGv33x&&=8as z0lJxIFCtQ-R8ik_V4KP!Qw+LJCvR!UIY{&IZ{k_1Zw!? zY1i-(toYTLeTju>5hT;(oK-pmov%{g3K>ti-u0kLA3)kESLr#(Xr&aaPCb*=dawy! zKcc@@kIUBKXEh3>L8*59&OK;0p(q$|{oZUg8UN z?H-)0ZslfAkuQd~ULb?lIe^qeN{REvdC7~p7c$UUS5G$TwP<31>Hb1P)IulRu(aS> zO>JO6i?-(>_k*)SbhP+%;$xQle|{1`1i-`5sh3*pF?y5-&{X1-am-RPuBglAYH7(P zr=3SxX+%bw{ybz;h2)IrefDBt%uVxY+B(Xz{28GoX{`xEsW@Wdu!g7Q3m%E1dx4lI ze}kVeOPP<#hF6Uu5=4HQbVcl%$Tg8`B7rqw$QfXgG4Ne=sMzwewvWmP0{ZoI9u^RC zsVDgqJ57>}(QVFj9OGSGsWdZKTn00BSU$&pXcdf5)A_em{N}CYldsJM&c{%_d;~f_ zZ&=dQJzWR~21){AFJ5XXNKI$8$UBfIgrBa1Hscy0TQWEQ|T*Hpy zKS{6Q*fD(JVZQ!zD5kohxS)agMR(Q;ti+<-ov8ZY7$J;A9FM#_oZ3HWo2qrZUx@R( z0K8%KG`rOY(Wy0k6lf^`sYjqTV7T3Z-9P2n%bH}Q3B`{a+=rmU8-*{~vX8So`e0(x zL27uB%dy?jvQlh^=@U}SYbZW`>IlW3iW5iN5xgIa#}LrHWb1>{2_BsCR)BL>LmbPc z5fesUzv$e*Md^?}Rqum`dfe~-#|UvI{-FKndtN*t*TUsJS8nRNk5bRyKD^Vjwy{<9 zz4Jyg{r|NLV6|R&4L#SlgXB2)7`^~uPVqf{9{dodC+ZcqUnmFe;@MYl*ss{ z0bC_iYJjO3QDTVG1K)mlIU>l=q--SL=k2|)WmI$+w%0!*?=|hdp5gG;0-izKTKf@&S8IPb|JE7J^*R_h0t4v>6&RC~28ai>bQ>AgaMk4}Lqd;w$y3fB~} z70P;Dp)`dLDZG!+r<=e8g-|9LMw;J1%4m$5Kj| z!H!p(%P9+Viia5?qq#Wm-Z!8RH%%fol7l@bqu9>bJ2nPT9D(y(KXNXd*+2IR!f~s* z5^eb~S_SKQ4yRBSJmJPL-`o?6&vT1d3CBC{CAR;Q<7(q5dzD<4y(5>6(Z;j^G5eGn z&Aw5iV;H*@K-sDMEwXd`EyiGe<1AYh4aL??L;2uFH(kmYN!J)7V;HA)QNj`BQi3Dn zQX)ocTYHVF<3>jqM(XB4O&RVFqAeW=BP=-(PK>v7B+t8xMFB>JkjQTQj?d6 z9wk|(C#i=!e!e4US~R$@f@8=O(89lW)QX!-htwM8)^yh zp+D2`Attln_{z;W@c3p7!D=_f^eVLqy<4sFf4rD1ffI_p&WWL~$1s*fVw=88z{OXbA=qOc2Qx1-6fG zg%~WL#l-AZ^c8mhreFSiDr@ysNcUIksDe*n?Lv;!Z^W7sG1{PUm@b7((3R-ncB=o_ zT2AjT6;-c&tlC`(KzUCB5^X+2iLZV0v3{}Dl!(Eowa{?uGts6*4AEGlDlnalG$mrR zi))#^3f)f@75U`$85Ns)35|*LzVyepD4{fM1>*&3T!)-tHpoW~+s(wz`78euSQ8EaWvtLC~seZMK zAPf8fxgA|Vud1RAqSE4pb*N-~{(K;{qTVlA@wt7Lpo#6Dyu+Cx$N?2M+p}T{DjOT0 zhD^~X9#9vNaLu=67KoCkRQKNzM|Y&K9bN!d=(Zz|e*C$F15>vi*zx={mR;)&XB@`3 zeJmyJJ`ZjknX|*#@-BDs`XUyXeM`0|yq7!U2E3x7`5&@q-e7xNal4_TUPhIw7Etw+ zc@6#fHq)rWw?e++NM}egWTT-<*BPV?Pc2erVQp`eGA-i%-R>fDk>4S0=-7zE#BK6Ikk=q5T_j+ z_l!4BF_sf65t3!v1Rjz#N7wpg5V>lOn|?zKe+UomJ>HY-Xo9295MUoWnt{T^jO*6H zfOC4rfF*Qdol_tQUv0`Yei@Jd5<)9gEg9@rU<+l>X`4btF9xhX$kIsJ4(2);{nS*&Qso6CxB` zHD#?GUZECcNmKYXNy);^!7IJ$x2}om0bgEssV$)U3iHDlM2+cNc;T-1k8R47vcm6U z&IK@Cz%m%BVNV4wRLCRvQDE>k4a!+oSc7dzok*S<9 z)H=!?nF2i(10F#r{JbOLYp>F$QFw?b+oIypBlSFIX*YQO_O;9N%S`T>ZhxpDI*+e8 z5+7+20IdrpXK&_S=_5Ws;DuA>Dl)-uh4n9Uf$|#jV-F8@|CF6VnW0CGT9vgO1(k*- zoQa|%^qaQu7)r;DO4VSoZ0*_W1fKh~pp<za_wQ55seYzVQ$(c*TA2q%M?{|7(Ti9u8^-DDe zNmSh;T^|_$^W;TVPdD(k9?m*<<*jZhBC74?AW<3dM@__u*lP`yjStUrK$QHu`H#@Y zaP)DrcLM(haOQZAB_irMl4M8fQP@SvoS33j<+gvh+!#0~D~eL0-~%Pf^PT0fq@ApL zy`iMNnacWk81x|r(-wNsKGGRwK4p}pwvfHV;#FkffUrWvHL``eL-s-=)ob-wU22aqUDdBxFsnt?SC_gY5)0?Z{6li!Mbk#&5+oO&rdSPrDnY<0O~#Bi z4L)d{5M9YE9yk}=rq2Ac=Eb5c{iA?b8X<~&S33o9hH+Sqxd|fYWcfF^{w<(H01e*WQM^>$S-LF7HBLrWWhIeLp za%DsQE(K<7qh@>>!5}J##*<5u7V1KyHqIy1kUGIm&gBRi8!|&nd+&oqVfb=x3OsIG zK6z}k^AqLI{w4p;M*gvteD7s`>}HVvY|ekQar{31VEmpk-(<}nD*Tjw<9Ei7dx`u3 z`P{$d%LV@+si*Ph`Rn9ctmQwQ;eY(n{Ppqg@gKzRkZ-=g-?$m%yX^Q0FOeT#`28)H zuen8j*X{f>h5u~h~A#ikRHz zcnCB_NAS6LUW;|MQQ>d*LQz4>G^8P1e>ihK#@r!U9BH;Eq|6UO=5ydhYCHszA(4q7BUgHMMF>NbKJcaA@o>h;6&8gE z?f`V@X|4V9!Y<%?V?i&Gra0ddR#-~w>m@0zDKrNeVH zXV%U%XOhgqzuzrp9{<>4U~4x6ODwoD>~@NV->53uBM4>IpA$lYrlLjZeZ-C#aT1@K zwWIMRW^@Pwd9qt_m<}W4Z}h`9OHNjU6CC*3_9h7idU6TUuR??}VH)70H`fs70WJAk z=SJr(;J(HO&$)A0ajVZu|_eUSm7=;KG#$c#{z(WgN3ZL9q`e*svXNF%fvveLay-%Pb z8-2x{xP7~F4n)Y`=C_qYwD(Hr`LW<94WhH3pkhQ%k5rUecC_9f^iJ-NK{)%=en1`d zYM2jj=AHcx&3}7%@z_(Fgd zIhPhk`iRIcAyYgllA`TAbXABqa4xt$Fn|%_@crDMNv)b9**|iioQAVg4cF@*dGBoE z|IUfk_EV-OBR!Y_Sega_)aUkNuOAbj<0q&<^>eV5Uf>IldxIGANBwRq zG%kV!tyk{hnMimFL|h3pj7gaH0Uwj$9fUGvSDO+N-VQ%QzD#cB<2Oc@{7_c`5T;9* zC_<}}BrT$D(}v~x9dJUEHz-!eVG04FByWR0L9;C5yNF4i>biKK z@Jr4T8-Y1%xt18z$$*&DGWl+br@%`!2bTPWb7Aw#w7vp3Hv0MqkwlcJY`qp?i;#rb z0kt+2Vgs|kE=W4*T*`Lp$TIno1Q88p?#1zvHC#&P;K) z5M9P9#{|`?8T}}wrkG#A#?4OUBIkP7d1Zw+aUec|VJbbO-;Q~z8PS+X7U*tD<)RZK zo}~HJ1<1Ju3=n}t49a7cd}4UDX396js0KA`oRK3yJQK}bGu!`anFnU}*(A-+FKYfb z!2EI+ia=WAw|~B#{q6KyRBZ`{^Mhuoc|4Q}T zz{u^LaDAlX4aek&C8C2?ahC+u7i^86sM@yHPp^dlac#)Y4NEAHc3bOl7p@5@g0k-OKBbcJm5(HX^l56lhHQsCy;qlSaHj@Uyvo z)S`j;EYEbcF6kdjUB8+uCBuPLQ2qID7dwMfA~OsIDoyA&`m||Of|4wON)9IsovEm6 z!Zc#J=vFqJ!jgQLJnO-t;yn(@8b8$_yj(dNIS|Y7ZJ^b$+1j|wX`Cb1Ba_=orJHM8 z&OFyd;BSTq&^~O|*85RLw*y{@O5ye+Y|EK2Kz?^?G5_CO4f%cgTzGxhE;W~D|9=Oj zI#8HOqop(bv0MAPsFR}gh9&G(Dddy6l%y5-1MCGonO?rZb!bbAK5&;ST;?I7PBLU{ zrOjM~tJv8M^JWgtFgLqlJ_3RleTAKxseYEj&jbjb0Frr_=*@|U%L7zLb$TK70)Y-n zMsr#VkRw#t-bu*u{5%|A@Rkw~6U{@-{lb5?n45VeCoc%Bq4bA_gVLuMrdK%jp;0a- zDZOQAA(R4+`pfT`91m6#*HU7qcgFLovuCBBxbKBH|7}`XI@XIS$aMIx+e`MX5|Zyn zJ^u%_{BHYt4VJdkL@tK1=EhgB?w7kSa_R6gmM=`rk=G(S4uvGsL=O-JOE;^ba}SVn zJ`c8?6+pTo5uo!^r=Fo^G1B2z(1fl<*vCTe98$yzkhBti35=9}djq8~P`lsYn}uH= z)E~2U`_Bh^a~#?nQ!>I1c7mX}`>`+3-u(Ni#`TXW$h7n&|_=)z*Z5h-)S z#-&35UdOPFnKZ|?7*+xA+3D{;!o`+S^#sZ7ub+bGN$?1z)=m7_T&FPzBw9NXO1r&2n& zJgvQ>W6s^5R;u4Y%ua&vR$O><401J-G0nS>hw{pm2j{gbpZ@e`Bo>zzM$CrSM2`SY zspaU{P&IHfy)uM=lq9J|W~Nlek;F2cSvCf?<28Uk9_*JX!@3SJq zN<9D0=!cDRkkmYrf(Kg{?ELvgfMxI3hZNxO4sb(GCKHA)Y>6j(5ziX{9FDL9em?Ew zN~sOb(+LQ~@M-T;0^khAA`k7g4%?>7l!Y<}NPWaz{PZm98r<26n7IMLY<%;^cE`GB zgd##1j<8(n{p3M*_pr=kbDqu8wjyROv7L)hz*(WU_>lF5_xt;pwC(4&7;HVHTxD(g zDTRfB`rF5Jhzh zMp7rl;mL2MUtpD9otr;)tH1YWb$f4hGe7ZP>;CS4@^8KtzdK*`=XO_3utp@pBI>ke zVLy6lSO!7KEkTA}m|26>FPF!w&BSU1W{P{ORsCMXw*=OG-P+9k4M7;8Hd8hp3=t|v z=@;pu%cn)HK5Z}!O!UznP!RYfImPV>0d_{9I|@HKig#(_3+r?52)Y|`zw6jj$aH`B z6O+JfyxjVZyPrS=9c@&$!hf=s$Q~eFckpXI920_mm^m=0B0`WI-VoW3(gMgUJHDS8 zNQz>B#mQ-BaA;D~E)_bd2hieYN%Lt@*VSP3P9l466^l*QnYmlVeI=s^D-9h;2B6(! zmjW}j9oCjI=-HfPfZ;D4PtBWa{LzVH=u3F$5yJ3$l1#inSklyG5(RQgSEwOq)2-j@ z))#8C(y)+c)7lLqu+u8jIA;$+54l2s`c@I>G1mTu;9-)qJXEe+WAED0aaF8C>O6ya z1mJf#P-*ol;3>QH^^P{9BN`oHbeO!6hu&a*e#LF!>)5enIs9jDKB}Sf;B}^#CIIXD zDWRK*KVxdA zs~m8rk~22NgnN>f>6YJ2O@k81nCcJ>(kN_jkc4LE5G?21(ZD1$TLZXvfr~B71>_@5 zI|(&8?vZ_;~05`~|E?8)9BR zs(#~~eM7fEQ=B-ws$2;L;@fG^%N6ot);UdWjr|Lda~Sjo5#lQxVFRhO!0{yfK=SwK zJbZ#k`@L4Frbvu37P;Ex(C8*tgSn1 zsO+PAN4#zJBlR4RFNn)EoI$E5spT8a3pOv8a-#6vg(F-%RBk@a- z7c)~XWQBab``p$46;WEo*8E{dU@KcB8(-1);YaQ z6(B1RSsBcLj#0AiUAXgIR`)g^ z5-MNZ_-+jIZkfAHu`e_0*jAil%kKqWuG5Am^2h2|=gsTgy!;04oMfHtPfCTE4GguA z#ViIcAT*YIlfeWMiG)zD$@t128DAsge)YF+mX%#muJNa|z@%x|r44KDmay<~(&+dH zRzrg;Zk^Swu=fw-R;3xc0Xg}%Tb2&~DY`b(ULGEDZ_(mW?(e4@mLRm8NuC9%pluJ1 z=jRaY{AR1e3Ttcrx{|hLS(|2i8<_1~U=|8NYDho1$^&X%siJdTbo;MWas$;W>BXI8 zzw2%n-KXPt^Rk=MmSN&zp}@D7JPGUZFJVc@Uf07 z>{*1c>?21a=1?Uaz$BISwPm4*pQx9mqg)&~ahIGye0z=%%bGoUrG}w)n3Nmlx;nX@ z7htJ|b5|BZj558+8KYCL@uczU6>dmRD>qpCI|TOHWhti2j>vy=F9PD? z3!Uw%WHcn9c(US4c=$FMU*-oAYzK#ryT|br9#@}S&(MS}(ZwJf)k|{PiIZ(EZA(>8 z{jYrbN}wV($1Jsn3^~lid^&zdT0Y;l$M!_09t!stYy+SvoGr#uJJcIli;6ZpoqN8= z)&Y!5ikZo`&rtpxC0x}gZ8Ro zeDboSwmsvB>{8UVoEP&nj$TD#E$Y~V>%lZD`=l>{ z0xD+(bw%g-?J_$;P~az3;PJrujhAC>q+t#Mrpa7H2XZLZL|Xj!LF66nXU(sS!Bd-r zOvgs(CYsd=MBo~_0E4ayK@3PJLLwpvafd69i9#*8>o=pv#WJxlo>#Qa4+}gEwL3-5&pswr-1S)m+n0>bj84Mv!BcOrozw_t>XH$OjeeJ%>(A&lXv>41 z7;Ll`Z&RAb^5_p9FoO3Bm>i#pr|hjaie=X+369#gb%{YxFcr9$`yC9rPhWn zq9M{!{BFM4qVT(*wkBL&>iOmL;Id}?@rP4gBi@d(y-)&h%MG%(jXC(_IlHM67ZnVDG>*Qs@8 zO6X{qFm+6*LqR~lW;_S+EX^)IMDyL)i^Nk&uZ=mxPRU=kVuATfPAs&pBdNkxFR6&T z`Pi+a#?^Kma`^IW7do^HKMd723fz>x5ik<<@BU=);MH9g6YwP>#V`|j7`lb2$SvX) zbI)+Makm3@NT)@v94mq~klo8K*x2y)(*H+6vNN49WJU#jT8bSI^RDhE>gNL?tohvA zTM~C)zLPaGim)#U>}TVG;+asd0SQPhLxP&1B{_4V@ytqN1fk_xR8fF#g5B!92kKMl z{j%0M&}T`1TvZeruNjI0sw6bsB^PByn{9ZYS1rn{By~F6F1!n~HdMLrmP|>{L7KO- zWs-i_2QjK9mTQ$I0-X9oJm9{wAxq~M$m>YxG%EREX>Z^9e}s!^v`a2e9e^1nP;;iH9Ik zZW@&jyLV@gI<@Al`78-PmUV1gT%?ZA8FUun4)vD>%9G2xwWqKL@`b+8TIkDJSz$q5 zaF0e$kQQll{3LN+kw=5${95G@eLKefQeJkb#$inpolN+gch=_uaQA%_2BSbKlH4Kh z$o%s=E<3UNi6L`?IzEqw1Ua=YDg~V-c8wT+P2<2qKGTdU$#bn}SRL)(7&U)C2BDkg zkKiAr;4QJdSzU@h9zfO8lJ^8dUG&-tg?eY;px%4{$G_2q@2u&`{PR#o$LF$$z>Y0j zj)HH6qEKoaWv+S3w_0v@y?6Hix_jA#(Z6&6UF_K??=*w?PbeNYeC!)t8;_6$HHZ(v z9ShGPx+JwU6vSRJH+FCTrqVCWB$`JbKoiLH*qzupjCH{N8#-$pF06vDc1e3>U3Bi2 zYoc@H=vF%|iYzx5SCk4Z?|;&8p!<05-+^UWPNGo;WiAKO%jq}+XZ|n(btnIKQL6(* zs^}{@ktTDQe;xvY8fXl5i|l~vWPG<(k0r!1+9e4D3RrbaV_C_w`eCR3WfLofu=9T+hSi$RmbgqXy8q6hW)Xi=CY zP@(YmDpw#_qbk52f%WOnsh!pbFrcL{tq-6E56l*F29kFLN8O?P7-LJq{59WtaSUcx zVOQTdZIffRuEKEHC+TOebvg+ZdfC$i0ukMmJZ1BLSr5;tQuu0yKYYQun&BV(1fTJT zKS5{rt&3z$Q2rp?iJ?VegTKy6o6P%8F5DScq3Qd{oy-AL7=?{xF1GuHJ9cv#bP!Qq zjOx%f)s@N#+}D6J^}fj+IxcM>vq3A+Y|5^4y4kH zL3?0)`dMIDzKA{GZ_w)c8&EjC&D^h#@soz~KR?(w$c!tXk3d1{iD)Fh>t7X24LJ%EE+n|7jbndA$Sqx}GFP@`)sZGrP5jg~{ZkD6gl&ibdvV zgjaj)C^q(*49BUrWbAjLCy^y(tmjp2(I>Qhw}77~q;CEWJ{e)R0AV)+Vbg)7TX*za zuAOs}@o7<$C(+f1Ge&)rc2_SsMnjXeG7ek3AVNNaU8U_e8c?c!^=y`3@E7~Aq$=zm z4X0mzul?&%YJ%MG--6Vij~Occ?W`&@>mx*!S`W@mc6b@{^ulq@%_ft8{!@+ejPC&k zuJMock*Rc_nFIuW3eIgNI4^KMxB%S0j^RRZ5#e2t^5KAqoXq58u5%50lm!gyA^-C> z%V_}@!<+oL+qU*bS|D_hRQDPMT@x(8lMvHZONSqNI z&Y;Sp(pq|EhAM8meNp(0u%0Q3SkN#+!iHMuPZCt=PV!szZ~fGiqKDI}V> zEA`CQuW#~SWxD4x!Txnn@?4l=T`*@-<9*?Bf+4`|egr?Bh4|obO{e(|f4e&XecL7}Fj)MGMZ(;ZZf6z@e0%%@vuY zS#h#EZY8obZ}i>#%{;-r5$5ueL3JQnq>ElP+e|A}YJLKDjBwN0=BaL{z27*Nc9rnK zQWBva1b=SMYC~5^7g0070vJr#`@GvN4&{4tul@h2;>RmMq`2j+SCE77neTxFdWC5 zkSis~BRfwun^>Vx1ey?LCZl0}DLz^ulN|EybRlHFzCAZx6Uut*Ooi zZ!wHlN`~(vC}w|}>W=?9L5P>MTo-fKJ|Z~c8gOh;^fwa8t>A94^WZNwv!H6SAn9aN zpsqR~LL=h7Uz)R9(KLQ_RnK;*WE)*93GlXpSp37(y<(RjsA2ViE3QIf660rrGpc8M z0LGlFIAUD!tpNZ(HNfBG8WMQ|omJml&7mLY<%SNhuV5cJ7wt2eipURs@aa;dQLw zw?B>byw3QeIbCG(_wtceO?TaJ5Mq3!nS`Y#X`@Q%yWO4mI?x)TH1YN5phHYF0K~5) zhl@I=dyJG3ys)dV7nVMK8BlNq3Xv}Z-USTVL_}wAp_V5#bowjHa}pl5$RNgg zMMOlJLUvuR;E^hA~ zzvkA9jreOflle|-`19Cf$B-$I06##$znnlofqYqx{CT~PcT=^it;Q%}~yr(fp4)~)Mk=R<%P8VIzEHqP??*4^-Gn* zC6{o9*P-ys!+xL2JFK0iLI6%*1@l>PkDjUc)BYvHZb0CFn=X?ryl~5^#Sz{6@j}tv zEf-0b9U$a}Vm49t?0;$P0ih&qWTveY>6P}XBZ%m77u4;Bj_RVy2n;l;xKRiy>*39t!C6TjXP=PF}LkqN_aDOfR(bBN5rq4RP01p-%C_ z_9A`@q8cfv0Gh{7SjhH1p9`28h9Ku7xrfss-8KSi%-#_E+Ol|B38&(?4KRI)4R_P} zM2B|f!{IUG&%4lhanm}PHas`)?I4bHUoO8!GWy;y&rr5~K1;!#7pUV5nTU&Y=l~v# zKZ6CYX3J4ckEWtG+iiw@l=`O+CRHFs%jtq>*X4>!@NWK5=p5omJNqo3V((5xIjg!H z>Wtka7HSU9hO^sj$Qx4={G*-@<5JmTsYhO3(Y{X-r0+E7cEd~%=ozW!hCRl7BeVs; zdmmR%3h=ZT?5U)!(1N=2n0FX4!f&X|)KPHj2?frDTdu{kWTJ;l3kZ_6& zQ9}52cOUfs4rYW2k$Hd9{Qn<}CB6honLD`sYu{=96I~Uu7zuw8k8Q7;{qU)R;6e0R z#oc=+0FZ6_oJiP9qW+LU)1_KmuA?Qu_y$5?8dp^A-TJ9Nz}>Bssm77CpQb&t(UQ6}Q$(yKDet;Jgh%M_3c0#Sf*oD(C+@1B6YlX}@Z&UJOWAm$-GfHeS zH_~Nnm!AMwXrOe=WUqWJNn=KTh2siCV9vvwAi5*G73XJ%lTixbL421{;T-tHXp`pj)H||0q@$@H1}W(IG(dpX@kJY-oL3 z;|c;A1|BR&XC-dhH{fyqzoHkk>Hf73Nl4uy@;KA$O+c&hZke8(K#)EEXYK*ehn8Mw^CCXkIRmPO@?j!#P;j1bjatA$8B(;BZ7NpmvrG45Ndh@L$mCN@8DfnOd44wX8}+ZRa)d~Z{C=F4buE-oO2eA zkafLPMK8b@*?kAu=Vl&q6<*Nl`r!6c4+1|Dmn6h6_jUibhTPPT4n`yx2P7EGpN;rw z=c!DBRZ_;_vFr3=~szax*U1K*&`4wdB;uQi!*px85nX)y`!=ErBe+!UWy&jtm zqWXdU=w=|xk?}{1)#genSXw>a#icuDVfTPPGVng4r0NmakWjZwrJnuP+Fc*)g1U8G z85gT*@O3>9Rdpv(P-e;-NdN$RR(Cx0slq%S)PjRRV(4sFOO070j1N^pa82j`&-S)B zK5fBNm&`w1d@~pd!F=5RLI3};V(w{X*-nRku%oW+r2`hjQhMovmld@uX_+PKRp>g1 z>xua+KCzr>l)Lr2D|nG3-Fn)+@_zVUS>&3Yn$Eke{Yqx~UVJ)&Z0;fwQ}YGoy`$sz zhVH@WEuv-I-zS`?7Vq*-Z+qr}qmSpFh zBvMvM7ACFs$Hqm3U;t2SKM9|;dSxM~`kmFZU!xcLh>;8)-*ja#0!p$K6H`q+v2i1? zLp=Sj*{sCm7VSpWKon-Ts8*FE#b$NW1?8$Q;M?Fv=+z)Gyn2^0Kx><)tHffmxw4@M z7;93ilwlvb1ZH^i)#b=nAW$Fy6;m(MlCsAXJR?Tt_keqofMDs z$nTWrvTG)%n2;JkUJ>LY z@+Xhl{mQ5_$?&==s`uPKj6pwIPvc7i{do=gf?nKoT5r*tCI*PL%O}|`+rcUQ@}hpd zLzr#^R&*}D!<2)PA!r>O4NQ0U79H5zyO|@pP80CDAtnmE^K_49;NJDM&_U6le&gKo zOs`A$)C52A;k3i!%sRuw`vQ*#JB!?5>oUW&r&%Y|rs;vNAv&O|UTVPI`+NFEps6m% z!77;Vh5Ld0JHYYT*JSkp4yHD$N^g^zo&1-$qq_W5J|L@EurkV5EPDklD>6sStYk3} z5a~+Q*LM-L{WKGae@N1pSsTbmxe>r|rZ8~Dr%bl2=p=QN_P;nRwvtEzNVz$#sXAcy zbT5@sVrm@V8Ie6Kn8G<%Ro5(BncP+`2Pv&LcW<>8xT8bd*kG6P7tIwel5k(VQ{hQn z<1yjhuwYlko+7u_v<^QBlDj5Z7GatrGJx)#G|AfV;J>rdpQsJhY1F$zoT8SwZAyr` z4}vT!tot-L6t=`f;(TQnLE}GwSN1QdzwL7*-HWtyk(;%XW5(-eId^!Q?%;|#hOp^} zBOW+t25XvBIkDbs%eyq;^8DkS_V9uJYyDgLfBMb+H{MX!%!~60f zs~(Zlmg!)hkDWuveyHs7z(RX`My$;?>~=L7&O8O#>24;i0*y#{j6m?;Vct2m>q;0^ zIUp>0T)*<>KFs0Ceiklo1U;GSz24O58NvgK;^~0MGr!FbJ(6`~B>kX(;EvGSIZ>+r6-m zTZSW$z=i>L_0MZVW@Y?6LZ=)&DB6K}ifElr8w#+aWaN&2TRNctc;m+?Fk>y}A(8LY zxKWD6iAnu|Lv1|UIa+B%&k0tX?YX2cK~xbB%*{HVtxl6>41&hdf71ft{DRx3FKbmm z9qCGnvUR>z#6}1EE5EMHcilP@k601$G3t<6>`VMIyd> zMtHovCnc2@l_T)c8 z@n{0itsieXX@J+Vqs@p&+f@P5pK|$yTSqUObIFQ^PK3p_{W)!njzZrg_aAwn>@TF4efWbY5#=dWWK4Re7+Lb zRq5)%i;%b2!dr{l=NmaPkK9pr^eMeU)id{qPb7&p2KzM9Zo zsGjzv@uqfr+Fyvg<%6zAHKKYTc(=jT(`7ChpAzM6*fcA+wR(i+UFcBvbh8>B&2d>x z*zaP4pp{&e;EAq%71Gg@UVI!&!ejZC5>(MW$<)(ViZf!kbQ`n`RHf7A@$R3hOr1;u ziU=nWFRKo~)4Ss4o9eL52PY5g_k5K<9$fNZ(nlZ6skY?d7c{%!6oHxxrt1sZ%X|Kh zUjTgPhMYa$cWJD|_1bSz%Z`>VbSZKPu<}**8a4k&??O%svkW7FtjCs{`{E0`yfX4i>dddOzkltc=C>skNK#BLsyF|m@oXdPMTs{dyzKv>Zb;-kh)G42>|*(L2-Z6J60c`{Uz_PjLt174%MIae~jQHf|CsgPhaQOTF0R7 zY?WQ~e}ucs2_?9#cpcuhEcW11( z#Ygb}u?O_LuE_61jxfyBJG-_ecpo z++Y<=1JA_`384X#`iuTA!E{{4tF{1wQl9*#%~SrdPLTnmFO}@|0;NrB`=o+Q*r$@C z`uvjvENF%^UK6+Y<^0@1=r)|ajQp>M%@#A!_Ph88g(r3t0kaXu5%)Xre>zOkc4cM~ zU>*EdHLkOwmhSW!!Qm$mu1QQdmpmjM!(p$BAhzRm;uHgb{1t;YuR5?OzwQQ01|C6DDfT7rRV9OcU#pUc_S@+Hx=mEjnm}0S zkG;N+;Kd|VBasmt_+KN7dT4IV~s>+_`?XK8~UGzcv zW_KEzf24tQh~dg;EVL1`@wU&RJcs1Rn*S3sRIqUh%kmJZL!K*W%+1_g#h?0rD1z|3 zJR^?ztHr(io|;Uk(G+!WXMb5Z=d(q|hVEY>Zh)d;C14iC|FY^yNc(xrvf3EpHp$_2 z1_t}*OR5{rpdxsDay-0?hju2~F4}^4mh6X(fH!Ow=Zpb)6Br?7?X14(2z{Q`hp*Mn zY&9(ImDnff0IHSzyTlMS+GcnF+bSI}v^peF?CSgK$qNC)yGacav+n;mLQ$z`5w>8R z_Lq5XrsgcK0%w2M|D8jGPTF+Tt=Jci9J!!qO?Z&ggc0K)>b z)BZoiCpw*b19+Rv`ke}hb(F*`?WK;^glHS#4&Q^8f>s7&cZ8+auK;WXV$25qC|B!!_oo?o} z4d`3BL3g7Ex4E{@7NQDvCEknS*$CECHdJ$pHT;mF`d^GSmgLjJjb>oU6;X%PwFOeV zdHIQ=&rGT)G{)7{w*QZPfJGr+6hp!SAIVP}cW3U-!RlQu#+ZQ_Is;|R-{h%|_CQ*{ ze)=o^pFIzrkV1(|du#Swel-V9!Pm3ZpX6js4VC6YB1yFs{`t{o8F}ysCHcA;Lq2YU zSJ#e7saC<{D8tLPS=F!1DKHzO;4yaVH~t|TckGesZnReb4>bRg!A->%(2+*@W_2nU zL%riFE-Cg_=(OU9fg?v6MmI`^ix4i={_rnu?et&MSLucC!ZskW29e)$l~69+Tc{sZ zS=5=5jg`mxR*}m+k6C)i0PLINpH*O1&S-S6Yd!;)E%Xzjz#m~7GU2!_*C}XjytuLYkkId0isn-T^X@EVk9h%l<`uF=Q89YU~+n`nqU(VhIRmReH6K;hrm3L;G`QMy`{@e38eCNwv% z-M3ON-cahfwwQ5Y4ftB{5q?l z+Y*7Zu9;hYzp{a?U~ zoBh+e%me$={0tiqGpu)DpQ}FgMO{MD2R37w_~D{!|$?X~wB6p=urn=puqwmY<>_@Js5?`M>M~?5&24@($GfTz(LE2L>hC;GdP2 z-YoKqh3ok8-M0d{GC|+w1ENLii@;#kgye$4=H}#|D^}C?7g9DW-#1d z1@R3%|782n<=m-5G0D1Bn@;*ag-TkqT<-YT!X@`O%>D@4V?{}uuVpfvXn|Qf+D59( z?Ee(Kdgj#L;cI`6cY@IS@tkt{*Zn`#3p&B)7jeZc7>qTe&$)|8?&p@Q%YiNm$7PCw z_aGcKt$K(3xj%^AUZsfJzH&g3cx-hSV~A4Lz? zmvU83vHmOqUGqjR_XE1AgY$DE`c=)0WPL6L%$b{e>e}OkBQ$@`=nk74Bl6duiwP_C zxTWLbgTHm~)5T@TyE4Kd>pKft>(CsKwn$ql;s$_@Bi$U8$$x^EcSeZBASq+&Kt%;Q z6#LKuImUgpdd6sJsR3<+fgi8HNfTWiQrN!P-$bDRa z+;GsP!WV???5_zx(m3quVoOwkDtGFxmz~GHl?!)`vM@rur~AToZj4vvBy;_L|2!Sd zZ>#H?ykhk%>1OhS`=eOZX`FpFd!i0*tDXC&$j1i{$BAo#TP^As;A1TW+KUU_Kvu)S zThzs3Iv0{m0WaodsCqWx(hwR)X#P-ZFBFI+ia++SzEE#0fPA<71JBF!tUZO@6S7ES(;pw^7kST8)eb!lfZ1_gO)X@S@@8!Q z)QvEe!W9jlxxm%e^u~S(NNEsIf%l+HU^>~RNXdg_LW^=n9Ebk-;K!)&F2*j}=>x8- z=^3AWMm>%BZ?KhbVNmE%VD-l`fAc$3Sc3PP1+*a!g^en{#m8g9S~BIvxSb+7*C;E!~)T*OEe0N3|YWZF4$LRypZH#BaYjkf8R zszrN!#~R}ZF+T2Gd75`CP;VG_I@$wX_t`XdunHy6B|{cFH|B3SJsp-gdk%O`DZJR_ zQCn9N)4L9S(6=ORQ)q{9{Q)|saBvW`OMdm>$*Xh7SV=3+0SlM8LJXt>HSRzH1)OLE z%)#JXKR4<_E)|80>jZw?jK|bZRv;9M{1}3|H|fSc)3MIkHw59)<&9qBZ z$aGW6)x2+$^&b-Ft8IG^#@}K2h`ISek?RI^!TZurVwyya<7SqzzhQ55i+v zm+4ZBzGc;tP|QwnJQzsD;Txzqb@32$rMV<}mVg{P@5;2$EWFNLYu9P>M-lCQC%Y5f zk6cjqA_sMR9zY`}6$cOK>W3cCE*ET@oVP<&*{}blz#i#R%k|*}S4w;SGRMLng1t50 z5ZNfL8(5iO^1CQB{f5c&nLN&d+cxKq=N*xN=x^6zlZ4n(L}e+5b5rS_<86N7_h+yI zY!br%_6ypAj5est_AWwDifvL5i@KW~KL=p-JQF3ZiL1p5`4r+}Y@PoHKHRup|26;8 z^( zv}h5Z-loQrH>X*;+kFxmAP`(81~SOJz(VylKetHpzJfkMkT{XtJ-<3Eg$mgX ztMqR%G|TiMX!5K9aQ<<=08wm&Q?JLg&am^ze;-yH1T;W^{!;+sUvC3Aa)$JJwBHB9 z)i48j6am}J0h5PMdlVQCUlV2bte1NZ#tGJ0q6=W#Uf#3nT$XB4q^qZ&_5k6)x;Ovs ze|WMwZ3vU#99K_w@G!c|41FY4s#8Fz`kcKQ#ow=RFL8=prZlVHIedMgR=3-$$q)Ms zP&hHweX?x#+wEt^q{cv0Wnp+z#dVj?#h)8$55mIM9CKKKDcP(s;Ho7YoS@`LEk_xB z`|TJFj?3AJQ&uq&9-`EZo0S33xO4;C6+n*QmLuOhE3|yY>YVNY+Ykn4ezCYrdUcxD z>SASH&CGA}E8Cpz-ss}IXnOoX3zwO1g|=X4;4oXE(Q(B+>rwV{K-(I_GVsta|0@68 znJw^e(u+-p?iY6B)&upDNva)IaV+TU0?+7TlQhix_I&<~ngUtI%0{Gvbv(3Pn_(|z zWhr8xM!^~xvR;e;j_tCj3e=P`lWauvljgsD-v3fRqfO<cOJ#NxfWvXPPhkR-Rdx3oFJ5^R$ZE7(2|A- z)T*>=ELL1&CJ9!_GhA>E-Rz(Lyew{U*q*d~$KT(<%tyUrm0m0!ZEzA-5p%T4Ll2aTE-ng{_R+wD2_Y z^n`<74v|C-fmPGh+%XsXW290`#qy5=y7pEZ58iuMrM@TM3rMgZbx?74Ph)Gr)m~m} z(rs^XO3=T{q6^&SXg0puA0TQN)aIT&iV|Zb0YBvN?#uPTvV_4N z^oS#clnu-}SqI4LJwn1eh1^(?D$7vzg6ICy+SB2G<}x)wO>|N0Yp0i;qEt?fI_bhG z6=oiFc}Xgc&f(*VT^2NupILLtiEe`QqI>va`ME?XB!< zDbTeur9SHB%9Xp+&?09$!pSE$7@d+*MBp>vVFb!uuywXg5-USKXAleSjQ(+RzRFE9 z(!8O`(Z{~w$PI@M3~hXe+Q!HptA-WiA$~{&wUxqF&5lSr>Yzaj5U8_%V3=23g&4Mw zpuwGk9lvBVq{w}lRO;!Le0kiY`&z$AcO`4m^_Klgt9N12b2;eE>li}uqvCc^j`e%+ z>Xlk6r;cdRyiRP>9~@Xs`2Hp1DXQzp>u<%KxlUDI+Ss&sI1Gc@{F}TAq|MXvuqW2EE9N#{dGr0|M2V;R-m)OF{n3(9>a>yC8wd&-9KtK4| zqwAFq@=o@%3ee~&l$aip%iaxndb_pdMArVbK-PYBAZtHB&vM540NDeP_248AQNzB> zag;;)=XjbiURJp)l%+Ex{P!X_s+LnpOc|9tca_*l@S;>|@QbaX_pUb?@iTh^&o^brrJD(TW3I(61IxP_umr-$8R*ZY1b(;^P}YuUf( zR!c5hyOV?^t7t7#k)iaJEl~gGn=Vy%iTqPY*dL>%JIEQk|lN|Y#T_`DDIB~H^ z<20P${zKu^j$LWKJJWvLu~zmfI{NMdcl+LMW?ZhhyfSBWhy455+@ zcUbd(FO!Em;jS?`=Qx z5VA&PQ(#XJYwt>BLqG;=9DC5mdT_LkrVsXdvEpH!wTOE)UW}Q;S{AlsE=TWA0pp*f z@tcy%-mK$X$T%Sv&KyLuCm9g`tkyC$^N8Pb97IR)NJl-MvRrgoix=>}A5y*gEE{Ut zsQtK`8KP2+DKiDoage@OWvvU_(m{Pq8w ze)o>o|GsytLgo&>H`aN{jC)R-Gpuqs_F)MO-_Z-0^MyZKVQdF+b0ADnHfK7X=%NGA zsfBT(UMjlmv9&-KSp+JJkl$oM>P@{ra_bYl#(eI%r2jSo4bL0*#1?=y&fogK`27$5 zZGvTH3dPPrD4E2(lL$Sd;58TYnC@4g%PQJxB;cV2=>e29Q z8!$FbRw-NgPfr#}04`Wi#fslV6?n&(zg`8_$$>hDvk_05jRe|k#L?=Jn9tG&)mc-njh+Y^4s|dMZ|q+4q9lfMHM#}Ty;&TE(6da+npuG^0$2SvwE8T z!X|u9Z*9!yPWOhVRp)x$LK2(vc}Zlid3utl1GWFN2l4^9!cA~_RG?gg;t*_oxLlnG zAD3N)Sc^bSw!sx`TU=%JnaM)_W_Ev!z3YUcE$+A-XIo_L{gexaqb_(W2?Hu$dWbSs zKT2?!LMU{WNir~TFnWa^Vs`+s5rJZsQrkfMv^p{h8kkaoZoR+I43z5d7I;HO}?ZWVz;FH z#nKYPpRX)52z z3ED92EzHJr)Haqa-252lqMY`blUlhtuGAI3Yv$akz^F2sY`9yo(PUCA@BbPEY#a-h z?n(ugsSLdOZc>uK%b`qin8SbMZmZCAz0IfnKBnK&mq~PmcdsJ|*UPop$DEo_Sx7vT5SbBGchU?gJj6UR#{mRJ^G7GpK8z!$t#vm<4aPJ)#euX+6J>I zYzk5_IsMYz(w<<7x7WPjar`dw{U_=6kH{*avi`4fCsEp}%D|ccI~vEO}vvEpBy-cO2P!1t3jOQS816 z7iPjZKK7WfL3OZQGjF)^*j`j4ydGjhp_8|lGv=DV=#&G;S3Cmy7OD#8fjXbcm7W*2 zK2c&aa{3rKV;#P866j+}?=6>`k1ikP@B^HWEPcH-$q1Sc2Qj7pcAZ6mDg9IT34BOl zg8^qf;c$f2PilWEqw4+b7e?T%3Zga}cZxrgkes$Y(_wd|BN|OAlF=aZDneGATYVjd zbDb}Exf_u*)EGnV@MkOLHp;kEapdP_%ncF2i@8me?A~gK;U8Tt^M*V7eN4+^}ep54LJ*mf=KPQBeP%&)!NrynTc!`>tkWr z0Vn&xnpTbzN4S~=eD-JW8S!)2dTiw~Wa5oCxKGRVN6-}b3vebpJrEH*FX^Yz8N8qm zFpED^2{{Iy(H`|wD5{J@hNwB5ce^e?30X%>%Rc9mXeZ*IHYkTr_5y5q`#XF@6dpuS zFQBeonlNxRs-h|ZualI|Y#eQNqnLhXk+kvD9AMprIs7jWyD6lL1Wwzf5~@`a!8v*zKJaiy%B683hs zWb#D!1jfH z?sJQ}x0vv6DNAzZ`RIt^PPC%7$BcfwQ2F9ld%PJ4ee#_VneSs7g_~&{-gE?91Axen z!vLFHnfufDHlUe~>4>*?ddK6q=zUE?P5yuRzZ{-{+BzP1S$4YgD0UdrU9i0GHT?Tr zSCc6LzTymI@Af&UpOY=dX_Xlm+GU@w(>w#%TvuQ|BtLlV&yAgbK6}$)xP%Weo zw+VtA2bV{jDutcpT(n7*TT;a;kopI#3o)UvM|BXeXLdnhpjt=TVkxo+X)F>hgJ1#^+1wTWd>eye#&xy%d}hh80N-jK}GI={*+MG`Vc^9HKMbtB)>OL?idW7+!fsg05MG*)0@@UBSL= z&rJD>IMww^n);}8PQ-?{U$e{eKke74l{X0GEnOd3E`2gI)r5gu?(WHa9B?R-z@&@+d~%>D~zs*G^YT@4@lp98qZf4esYmOU?&gDPrGLVI<+ z_4hk*Q^e|dH)#G8QL1?CytGmSV}rt)QinkW_SSr;9?!4^dk>(Jq8RXM(f~gDy$CAK z#wT!vYU^Z+_NZ(o{JyfC+a8pajECKM%`M~Azg^HYo4i)?C8gi8J+Hy?Q21r1lE2gQ zKM%9)qxdc3Hj@%NFIbkHwk!3@t*du5Z!M216f1t^)-5I#3YFD%FuM$oi12 zfZ3pALt4y*5~vQvbZtOmgD6bnHXJ)%aQ1HWyG!->m^R({TvymdJ?;as9Jz|7vRLa; zo;pVsGsn(HuyUWT-?wQ|pKtV7AZeZc+6vS2q~q=s(rt(zH-P17vVMNuO|&iUR%NqV z*u8@7B&y@>AUZmOF@161d(&P>BYF}qM<>@dzvy`)C9|=xN|JSJX73K!vjjK)7z}Dq zrj6o==cq~}Ye^Tp(e(SyB8gGPe)PgCd+*FOK{FrvTP1r04b8>}P&~ek*uanYJ68yS zg+diuS~m~s?S>H5Z&*J$_rTOd{bb4^-_~K29i&}uVEIj@zIM>~&C!xo8)uW!`WYO(0^Q znt%lT>=Ot4mZD>^`RP!FQ60vuq)4m%uYKI{14mG7$8p2X)_<~^c-V1Q?RyGLo zIRx1<`(||vEXg!im~X^_3vZi=Y`A#H@WsNEwd=OWvorRH5x7aK=cA)tCr2^rTW(CW z&%ZeA_AR&QnH101PWrA4+hY_+D@&BDABBsr2Po-LSw#IOa{1?mPKPBY8iDOJ*o^Fg zpCQ-fKwD0$o`sQrCGZuncj&Hg{&)l*-zWscskhiUO;#Zsu;4+5ioWxO(-a-1ctwFp zFN!Jz%NUbY8FILH%@*Zs0;R;TMd+A|6rVc|)(v@k`BeA^N!E!G7u0jjHkZJ@M{+8)MYu7!FVMcS!AjTVU{&w z=IX||N9UxcpoW62_K`TZn>=1d;O)cPxUAfaG``FIIy~$!9~|1jPGRhGoC)8D zQ-WCvSSV|rKfr>yg=Uc-t;GfHa3ER{Bl>=I3MEAY z;} zO7-=y4Q!O*FXAiP3}&0QT`tST;NwDwDc3jIK|m2N-(5I z1$r;K_`r)@tdcopi>5KI%s~|Iu4lq&PbF=P5DpwKN&p>ivEnaeRVq6MJr_!B))VLR z0D<*z9uAaNv9Yuwtnc}gd}KKTPM#AgK~5(b&1xeab7n>Q5U^8bVlWK})p*q^NmdiE zXO~xH41b26FPh>qC%J2^bmki-ow-Ix=jfM;&hD`wb2IgLK;s4~vPQ5Jfre!I33ef|3z_ z6wR5=bwCSgOpg|7@i8Nle6{<5E0h&EhMt4;y@5^)1WdL}SCRy*OMRMi1|i-W@T_>U z?wWRmeg++whu;X{J_Z>J1Mli&DF9iH$j$50C)c$NS;sTw5!W>O+M3Bov69LTa(X5{ z7E1bi_I+;Ti@q4EVz^x*~$Dg-9>*# zL-96wgA5>XndV@{YeqTjq6Z11R7f#*cB+cx!CA}PT7cfm#qsW(wo=bav*4All~9ht zpOm4A)NBWGAg~Ld7$DI0CEx%Ab=#amQo5@52X29<{xWXYWXdY6k72Uf0aSJL?BTR3 zq+tBw$_{ZXu}As)K8Mosi~D!Npg*5pf=Q9IM=?QA&z?8U4+K&Ntfy8XoknTY;h1G{gZgKrbV7f3}$-K~%{U>bB z>A+HPfD3gE&D>jtut}aN0H2_3qp}utS&_un=BP?tT@Ix2r%e=b*Q2^;+_sJ>!wWLdL^C z#;y6O>J4%&c>*9a4LS*F-G=fO^4PsZ5^t`b;|2gt;)&ck$88IRKXrGbXZm7jq1%hP zo^g^toT1Y@t|UKn^}FKw6_Gh=U0d0D;4;J30orK5Z#W7QdanLR7h>7;B31H zZ+6Yk6`oQ1+l;ObXDzvF$~n&qVOQ91Y9+<^1tvo(K?ry(gy)2=sS0YERG~{76TblcA^e(?2bVndkG5{W&#OqGAc=2Qb9s5$)B9}* zgSO1=e4Mg7p_sr}Y?k8A#dTI5=}NGx<@e20N;14Y?fcc_VQhO(8~C9J`QX|-Lgh=U zDql`3n+_&z&u$HO4+10Lpf^*#jiGmF$oPFCaV6BT6PtSNi(~tAMVz(*}1(ur(oO2RRe5!Kh^Du7Pz_u~UCSGJSAV z@u1S7y$01AG^BrQmjPJ)-pZ=Rm;j8Ph|Sn${HWp<_gb}AO1NuaS6+Q(Wr4oDu^h-4 ziy))p_jZG|k}pg9$1xohfq|uQ6nkxQbI#BBU~8|G!z}_Qe#o3Mj*#~-c}U>;$d0+B zv;E&3maF|hv-4Dd=_x0}I)722FSnnxgV*w{a{RXEKPMY*kbwc)t z-S(#7jkg5v+;5m-eq$KittH@sF#VqXu{IWm!qJDKU%b^skVtr1&%T468%9+0!)#N~ z?Wcy(=JQeBE+{$(^lJ#X(vH+)L+mQ7#eOEn?0PnE7CamkK#guAyG^>3-s@I){J#?~ z^H66k)-enh6jx`b5A`F~lj`iK$CM{|$-2DqmEzmSn*~JtGje3f z2en7mq^54jSMSv(*WPa&Zwt}87nWFp6{DoPJg0ZL;Lya}Lze-b0D3@$zl|rxgvlR& zM~&l4u`j*F6^`M8<-*z73`{uTrUvnDEtI538@d}10jy9aP~bwKKMobi*pi09I}fDn zj(ZAY7{wTluAFRKJaGFtpyIV)xoVkIc10mTBkw_6MfBl?Lwk z&M94!bD{ux_J2XEYx9q{ZT|f4=j(WNp@$VeJ8RZ?1XW6MdH8bSp%ctM#L?wyz02hu zPps5K^yA;UuB3LIYo-vunMoz8WH~HmCA#a}_eH`QY;EB8SK|BQS1V|*uf{X-p2~f_ zUbP%TGAJz}Qj$@a&AVNiZj3PLsl_-wmzNzcSKudAj@4`Y8S`+}?-w%~<%Zey?x!jL z^>TI7j{I@LTmp8Nx=&tAc4KscHd9b8A1Gpv7%X^?*X&4J{~&<;D+NkdAV175PYHVF z3Y25*nj$#t!+!o~Hq$J==NX*{);pADG29<6Ef;Qqq(JmpJmq}L-S$C;UAR)~pKFDQ zaENJQcr_qL&m}QUdp@w?Vzm{A!4l+hJF2!PP<5Hpn;tgeRJ~FjrL1ad7T7(Y4f@}i z2}B+HJewnzJ-S;|olt%X#=lHdubNVQ>Vs0KO(j#4>b+W4>uOF7DxvC8AC*Y0sA;t@ zMFvgp0@aclRuVO;hE#_Vt5r3xx~8b0=~JK@Q3GmG^{X+prY6*e`l3FoZZ)gMl~Q#o zX)Nco>cw_44Ruhl=M7z<=n-hyvc!Yazh)zLGXb%>VPu&gdz+SWM~6H8EWQgG$-}6O z_|)VYceM(Hcb0u!e5gx}TnjRk9wP_kCzTW|%kN5mP-+!oDI!F^tEwJku9r6%!W8z4dP4c}S88}Q$zWvZR`_0@m+KJe|D{-ZQ02$J z^#L1s7?mplHRILA75U+sPRYsVhWti}pdR_jPmvV3npTS|2?3iiFc^bTx#pG0Wyk9H zbc22+T|_ndlrxU5XHo(cso!Q4JQf8TZ)NdJmenzk1sg;9#e7pc|qiy;s!MH(V{*S{CkR5^x2kg;R^RbeRaAn-xHzs$j zP9K@Rgv(lOF6rcl)3Np;bRIP2?Rd9LOYPZxRhFXp%vk?8{=4}XMeL)d#HO-=u|6IO`?y3QVO9Ut2ez%Xz% zrgB|G;n~sm;v(~UL+D;M(WJfbl1Zy4s%4yT?qJ|J!C9TIrGK@&Sj)nqFAHsJgQDsl ze;u@F{4c?s6;Z$475zt1zV}Ul9cua>I}gv`C+{*S)=xpA;|$%_95scjpMc|lIZf#5 zQerRgr2@9O@pNEh6-?kkLBm?uZR(R)FRXEOnVKSFiBl2+A;K$n~QUS+YEkNdiPpECsj7WD;pOmEP#@ zq2X6XH%>;8hyUw2;*PLXU251VA{T?n`mH)7DI4Z&twjAiQ#%Rs)M3NCh&k81>s_?W z^P#A>79Enx!fDMOf>N1|{T@YptNf&zF+r`g$LI&9UGWivKv=DqR-(_P zRwH%m|+3JgWzEBEB z0eSa2wIR>J=H-C|JI};>*Mn%k@#5|AUkoiD6&Shc8h>l(NJPYFS+19Y>eG6h5l2;# zylSknYH!Y9;U6mljC?CvB@W0RQDf`O>BP}g1;%tKCr(|z}?|*)RLu9`aSb|DcFDRSvC~?qP8h}9- z{l@C0G#G)T=cIo*ycxWE!=Qv+Snv$on}S6T>^ZrzBdj@iq@ZXsSkzwY`EQ_HEOmde z;$x1s#gDy{1Y}rTbBJ;Vy z$cF5BLT|JS>;jW-Bz&WAebV`4nlo{rh&QZUuo9xuivvD#IHqTdKgV7J)yu4;_0b&u zYe^wYgy>O6^%<_#|8DZxEfNy~C7EV^xz_J{590~#O)Bbte9FbdQst4FzetWN-4`F+ zb?nM@tst%4JB+QfQiH0;!*Mq2%b&9yj;m8EY4jyFmyMG}SDo{4JHyo=M7tO}?xA8E zh%@=6u%LD=%XZuJY;X@1SL`Yg>3Ry}#xQ{z$K={AwnaL{F0uRgs_#1X7zYfy7xauc zw@siX(tL->QpYJb-NjtD`qlNvQSO=o_f}XQafpU>FhBwTy^{*(mmRTuzwBP?IGoA5 zIbQ>}?2K2WCSl<{R!Tztq^Z*dUlH-Q}-jgPf_q`S%FmOpofXwlX10j%k-&ptl3$(^HTpGcV z;oJre=C~B-A)^^QZ4TvXn9VB z{+R%TPcb+Dula}C*OJ~stFG!@zw^>&L#uN`*eS)1wr?%+HRAeEjaCfy8EyW7ilRki>Rr?Qhv?(2;5pnO;P2?R5q6h%E8XMPlc*d zy5m>4%D=Z;E7~tYbm;kgPlXl=|3dAiiu-OLrs#FYB|}>CbecJTr(N~0KH&fTDeAji z{o%s1!^G;on+;(zBG0N`SD-}Fbc)tm|8&G6n# z0K)D5T}C+X<=P#%U&tD749;OT+|g0FJ05)5)cLoqa!|vahv0h)q4+&fT$`U|#OYxA zjn{Ql%tZ(F?Yh9g#mY;FXCU+fz(J~sXJ(2&s`z9AE5s&2T{aV(Q0NNmndfDKX^yE4 z0diU9r?%3oiwwFZy=O)_8E#hjD2bv6!(+Ez*f@#55l7W$v6T@trF_9lH~O zz9^1-R-mYH(4bcPS&E}?^h?=3Q3EK!*m(Rf z)Bq(LcVnPr<5V4>WaDSw10@@;_<^1|wwS_hy|8(=c+&V7me!IKSzQiWb{~!t{iM1F zY*bD^7=X_*L>M7aeM zDtmU25C<2RqYhr~a=+jr_Z4)x>GX$R4zI`$>|L~em2 z8H(C=^$HlHzYg^pN~T(mk{|_uby`P$_;msgo?) z+jS60j~Mw7zi#TJ$8C2jnt&kfT(+D9$G$NVNKSNAkVJjOH)(t_S3@K*$*Dl4PSycE ztm7Uk48byWelV0&|<^H=>ySZd^l<8j4Y-mZce=nd25jhkiU?Em_t6xv45qM2|4 zSb!YCQ9NGt!!ztC^;$CFF0`yWsfI1=^ftUDsE@hLL}J0-+XeC4_GLo8!3$rBh!W>0 z-Ou?omib4gbQv}>Ci-k@SDe9RMBWMa@nO^|Fm2{fUc=xQsya4fIduz8Az5sgO4N@0c(AI% z+9Av-H0oAF#FEP>$7=_6peWWuto$5kSh24HwyQtLSQzj)1np!PqtlNc^}ofU!CmrY zaIsG|)!{_?&l%L>k$Yo%D*3X-cDC=~Ox}LRVEMQj?K&bBdz#G=gYV*z5?Ed;@j=g_ zG*t9Rw)ey@Wa^TjmRbc2g>Yl?cLPyy*e+lodWq^6=h8%Dt{r9(X^mp}rFWf%TJrBo z4?iOi0i1`lMbR5YvuEQUii-uy@sYryknd!5Wn>5`j|W}WB%_!Vzam#WpS_#Eq7;ORkp0z z5Svbuc$w=#f7dCy1M#x)SD%#K`=lx-FJ5zG^2Qq{&Kpm$Gps-bJXL}U?Mg!rznyGb zV36l(JZVo0lYpTLqB+@I72N0{3|yOzE40|ynu2#4Vr4VX;JllgoGAs**E+SRPjOxR zKBfg+-&jepR-e<2AeAn%bBxF}K(EwqUFH)DZw-i3*}hxL-3OeIVCR~{e~xN76a9Y9 zD`)f~I&*7CyVq>v3m!NEcta+Fz3oQdnK!&%s<0R~=vSp#KR@eIe?f6>PC_nWD&L&g zZI0$S(9?^iVc_Z+GP>C+#vK8+IeeIW>S1ds>@A_OL9^7+asaW>4QB|)gii9E^o!jq;N!w= z$JWduIvrX*VM!`A>=@dMNSqQY4V<4=6B%O-BURn2Vz^EmbW9+|V3*H`nu~rSbB!dbqSjIc z^#@c#rqId>7z>PN4Oba;o38{cqGvUz)1V3w&|g&z7jw_84`tTibFr-5{(ifQE!Wqy z&b9cb_89p4PAF$<35qr@B#x`+SiVU7$N^Zg1#HuYDvU}an|>rtYNDgmi~eyP^g{t- zjKNZFV%}C7#u-PirHHJ=dO!@KC2(O2IACNM3+1a766^GHz|Tg?qS}--QedOLa-P8G9f{Qj7-{wcyvnt# z2lKar$y(rZ1F*;fe5j|a1(;^2jBBwnl@cEzN*vMv_*Ne*Gx`#ThR1i<`MhI1X{50; zQXO=6Wv z;DfQ3KgsN_b&&WuV65uqGQUjT%xc(N1lNKSANT`h)N0sH<*wrm-io>-6^>)6=!{+K z@=~Sy6eiqA2uKa8-knF*tk>K2J9-!hdI8YoA@vJV*@*?Q$qC;w-=&)8$3?X=t*J>qK0 z;yBl}SjCR+5|hq9sh)KXb3F&utdgNJEPm!~x+3O9Jxw>3k#6c!y!dUTDUPvN#h~KH zUEEB{m=Rc)0%)7Ft#l@_UVSY(G!;fMw<`0z;ftE`$~>uRB-#tFIO=DL7uHmi$2g&O z)m3vsD=J_yi%D$9GsqYdkWoox>}OCAIh&QGJq>(9>H0cPbYmFyV|BZb5ySekc;CF> zbhu^^rDV74eRkwTy3Nm}Ek+w)2Wh|k1?P)?=xJc2X^-0OZz1a-pi4=yalZuJ_#UO6 zmi+(si%u#q#Ga0F2o=fl;#ILBsbDD9f6T>w0fAA?XtAy7Mg{4^jMIOyjhz~cn@mMM z87ss#C0NU<{YnAT2oyVx&u4FIplvJ#jIjhJT~!V|!QV+C+NNdIMLr8V$WlN2EGCKx z^l-%yEn@>4G3O(_eC*u-zzotJrqk;{rxF#7SHN>#yxF&}`DyYTJ57v6db!9owi?(v za0J2e%AV*D{we;cQaJqY@1qBpCDDHhv?xd4#HxlAUmn1Qax3jglwFj0(Wa>_RUMQ2 zyMy*;>KS&`opz91>=B`Mg*w;O!iqP2r>CG-OQkq0#bK?yzLc13I>&0AJ@JgsaT>7; zJ<4NjpS$3H?CSlbsq{7qcl?D8A4cC@c*ATjk3F<3;!FI$$q7z$J~wP=Lbiji4&@}3 z%=&;BI(I@)0;-``DGGC)8S(I42QtX6L>1(!LMiq*8#ve!2V)GhiEbo5F}R$-q@xKC za}f#Am-ncjH*cnzt(ryE%#W7bXaShg@D;=eQZ?^J4m+-1u0b3(Zp6x$dvt}KNK+{CW8$3%}+P*_it zj|g=LX_FQi9h)PAG!W2*25B&}tt^d;t*l7c;QlLMrp+bkBgK&bOJD`ClT)7p&?7;N z>z#tIZ@3bWa5(B=M-)(+3z2X)0oz##3hyic43BJC(d5m~n~aXJzFN6NZ%ZwaEl0X= z%&EGN(d|Hb^udlbvi3X(VEp?A@lWul?#zLHY;2kUSngR~x)lGO>d)DI*>>>`{~6Yv z+CV@3&EIaCN^bijV8-OC63;x4+lT=@&eh?d`qE*cxF`YsUZPB8bXD2KAor(Bv2k-6 zm7qyWjdpF9e4wveb4m5gO;g{VM*q8j*}|YrG+dQS-Nb6lH8&hIXW?>LqO9W))gjz( zk1S^uvxg{2*BY_yI%h#Q!=Zb2?6ZF}k?)kNP&=(s03t^Xwu2~fe&aB+wsb78qy=`V zvE#fumAf9HhOJ}!JOKP1MG5BOt;uQT%D+Y_B*IGnLg>~3VX$8U@Y0QOaRFc z=i<4!8cKi*hBmA3&2+eF$rK+0Zc*s4K#15S1B~g)SP>hn<6Ms=OB51)Sd?6lwUe1Q zrdR+^TyIB^T-~a+GhLC^p0(Gy@6AGx27$WXOg=;te!rEEF2~)zmUGkrWh&;^VPxd! z8hq?hZ`sAGo-nA&w?BI^ArqoEaw(T+C2aFxzSxx!kIvX3$LL@WZtfJD`~GQi!C$eI z3n0DmKU2SvQPsVk8B_9xCcVm{Kql&CxB@YpcXN}gP$&+&o-F3E*4#?Z zovQl$CMIQRh0XEt`)@k!z#%?X0@Wk?z#j;!KhC7Vf4-``9*yHxU(2^qpd4y%*f((+ zIlbPCVro6zf)uSt+yTu>{aQF(fgH;|_q6W5i;WS&C-2g9!Xc;<7YLt?Tc-Hx^K$^z z`JXUOwKN1fMXtv%NqatwE-(VG=hBehoJVvO!6e?GNp?Wt%}iqTGMV_OQNVLMlBDxA zxu+DD0faxkGtmz4cK{2+5^chLlz#H;*PS|EHt*A*85h22Gf`%gve8*#hHm%=FMhn> zqBXFxl95(jT^W)0=_f&4pR*3T`p=j zY#qyiul#TuxM4C=#Wk77Q#J^e89wo8!L}*`Y-2<>%xSQFV4sGVq8MTSMACNZi!#XM zu>A%-T)u0_-3LS$kfIh07*4lMPr z>x6T83y7|_hwd>LjWC(Bp*vNmQ>LdC?@-lfS8tn3@Ry$W;;@SRa!G%?qQydKT9=iG zmg{0^W3>*#ZH5Lc-N%p((}*)urrjZ#jbIp-5rg8LO-{2etCWzR)jaq>+S`|j z8zW?E_Rj5wW#i`FAGN1qc=>zFz&n^|5D#L8dFOTqA|f`wAei158tw<)A!8P?Q=)K| z$Ef2e3DxiB)^}-Ua8(3*SyA(TQh;J#XQ}2rfmi(#(9U2rAQ;JJn!oWCjM9k5?HGOzT1msm8G>MnQxYKB}mJrH`uEJR+ni zXjm1seQuzkcmKp@5A~ebBat-N)IK=iXbcW!+Li|Cqa0B^NDGW%p)T3R&NEoFp_mT~ zZ}(N3KIpuKj!}I3U&tu6PUoJ&Q zTu)2{iC@(f!e3Paxmr7s9UUftE&T~lFHILP43d?GF3a}UfdRx`K?Hm;iQ3M4@?C!O zU;M;GI}U$6>5>QE8$WIYli|&C_$vCDosP`y+mLE;EJvBufpUY-jyA0hI(0ZUv%!2+ zKY-aYOK~u-8Vv*SUdbvyuayD*1H7@qjSPV?%FObhC=O(|X0Oq{SANX|arsd2C?p zbQc}`I6Qo&xT$o9wnR2xNvCQyEEn6hLZ;@oEpBJqdNdXL$*Aa3=lnvU?ZmXXSav?^ z;K*h6)9>$#OYPabwqgqX+Z?dmIxyDoHhBtwbjz4zI)T=&=3B5Lx&Qlr(sH9>wd3|O zGDQ256Wm+L||5lpGueF5D!shlf zaXn2A(4%us-EeU%9c6NU)VxPW79P(8tv}&+pRk=5$8JxE%J5$)4=E$iS8j;IZrbP# zlNjU5^Vt8tDJAy*1FQ1+kf2)C%1xkZciRI~n$mYpPrYmYfd`JQn3yde- zasA!Ja{Jp;MRTwBVe4@$jn0}j`XW8IaSgY5UC`1DS`y^uStpi~w3cGE&1-{}+O(H^ z^~Omjv4LWfm!oo4O>Jg>Sbh`OT;#K~ftE6Ib6JQcKo zScw&Q0?&R!J`3xBWtrj|ToJJkbi6E}YtdqLB+9s7eAMj~(uI$Vs{#O8S%R^=psj$e zLg9cOIvF0|y#gy1koV-Q)I|XF2_A4VeuYlnE4LD~1ubH;dy+j%C~z>epdAaKL7 zA{xIsoAljYtEnjZh_J{=J45?jV+$tL!sQ4F*g}Anq`#CQ#q@;$8;5Mu)mJ#6G{lf% zkfO5nH-`LzS(Qlfkb~ZJ=N@CuXVkNYI03O-$?E=oRnUxM>4tqeYMXfh>%rXV&4P`v z?Z0QP>Jf^3`Yu zu!Pk&F#Oea-@V|Nn=&=(8ow%Jha^lBf|exA-vR&njQD%J6kj29Z4?trcX*#YO@4iN zl8-r@S|-GE&IQ^EDXEb)6 z!hRpRF_OGAtv44kHjtj!q)lUvsLsuYB2y*LiJfTz#I?++l@L~C%IuwwLH+GlujQx- z-O0ZIXwdSR34$>#ig4!ivlE@vXTSQwM5m%Kst%Ym*KuGb!p0Uj(-(4Qa=A@o;@z>p ztN*ILW}jw3_!an8PJe|uM)ndzOo;fC0MxBdhq@2NfhxC+QEx1hO3*ty%1lw&Epvhx zZ7v(3$A1t603KAK9fz03B{x$W0m?|L!I7D#Ya@Xab{Bbo=@ft4MZa_m(Z|K} zvhu}*BL2>$b1NE66vrWrj?sj`M-Q84i{=Epy)C_M_wA3kPY+e!J?rE5&WXN`*4^F7 zt~tTM3{&#CcWgYDc-)^vMH5qMHfGS!5HsUVZq? z57?Wk5i)?jK{*!)Hf%Z(uO9O6v(lRN(`BJhR_U5R>Fqg3uy=~bL_R+L+k zW7`{4pw}9MkIt!N=~Jdi7qZ3*YjaQLq>cvRmQPgjY{*Ts-SMLs6(FpUbSr_nAgE6j z#6YY|8J38u!1iA7fF7fy0zv47gd3`6-GKE?WkIM3!M>5Pn+h90l=`O+b2o+D8Evp; z4e86r>UO}Fr*&)76v-d@o9mvh+@_F_z?pIsJn15EwlJl5eFhqGp<3OaJza z=a^yRMuU9>M;3M6aUSr;R?5?oADw$3@#=<${1e`vZNH}0$FxU{P-qq3`~bSmcKt1n zG11w-;gKR{??K5UIGo5SMW#&Q5be<}aZWpIF>f#9DRpB=g**`+HZ9rutuOu3%^?-g z@V^&kVh+7gJi}}QGQ~;&Acg+&{o;43V@0FsOFhDD{WTB`V5r@J-KzF~m*CnPfW9-q zt-EoP$nkh@Zg2#%?i!!VW)VI2{Cl?#6`=2g;WE!^U{~M;zjHI!o72>}?%apy%o9$3 z_80|+_^U7w({QFfO~vlKR{M>zXAoKtT`(O8^@8LMs|+LlRnyjs1}CoP&HwmSkME#z zql5il53%&oZg2S6y5X4VE*Eg`hO2z^YNqH72p)3+2JJ)YcNAhBQS~{|4fb_vuQM`&>ru||eSj`KoH?1);m~yQ79+cY0 zG7t@9zs!DxxhmMI>?dSL9{rSqJu9WVnnLif$UU{Sy`F&2x)@SB*35;Zf!iqX(w zF146BnUC{TVajHP6(gDSXPuY{DrhTkqY;~UA_HL_vzPOMqY*u$e48i#0Doym& zF%o|gS?*gT2(&RU=QS%XG0GH8P=H#DKqW@m0T4a?kb(Yc}gP z8#bF3CoEq(73TI{_hFyjvV6{We~^T~n-!tSlJDK3Z=&lu-Ge&Tl{&Q4=@~<-@pswK z9r0^~&ddAI^_~E`(b*5hK|OYRmj=2)zJXTbClu&r?+-f>bdzkN7sTWGp}Ln+-HNvU zz<1EZ-nU^3RT*ZBH$G!@5@ECIc z{npL#C~qh(^Iq6rp2!h8FW*Nmh^YcC#$U$;W@_$&dzHPm5NJ4|dOy)a-e>Yf{<8xd z{lCFu)Htha;ErGBOHW{eJlP4M>%2}kgc|W1m8ji>PH%Qwb>HcsmH4(ubUywD=*E}> z-QYghM}Oq@`^x2m56Dx84*=@i&NCW9H|n96?A9A6xfk71`7OA#zuG)YYCoEo+^@!3 zO5mioxiIk4WURn;|@mg zSbTK8U!D&TO!DGmmR6x+-gsofKWpDK;eL2&EGmqGX;CbfrPZ@wBA%N$V{_;hFDe{# z#UnJWLdEi=F$bIFS-fBsPv>+|DVB)od{eAovBDLcBhAXpYjDE(%|J>Bh}-qsT>_B) zZifh_pEC)xfk{XvL?7UMXJ<5h4=<9W0IMSz<~J4u-w3f^g#EUn1GH{iGc{w z0Ui6&107;N@b0_JDVfAh`l1`O)P^d3vQ_jnD(;3|cgvk5EhSJ4OKWJ)=(xCm8=S}n zDJhVKOkyC~DkV@zPUW147Tks<1yX292n2!DKn-Ilfec9vQDPuKR$#e6c3==!c;s&2Q-PFmTvc&Jt={rFFxQ&(p2oF1sX&Jlwonxvg2Oe zI~^K(0koTrDz%|Xno>qgz z$*`z^l9}kKQjlHQnx%IbOKM0m1CwP;<*(#GCW%w=kT4~#_$fU_O)R(BlN`t-ecFbL z3cHXQm>v}~#iQ)NhJ-*cEV4n0t2ot?TOhe1OPS_;S%F2e2GT6O$JxDx^UR%0TtkK z;Ycn&HCdAnheQtHd&Ku>PuDlxzy$3sO}xvI*w|W zX=onW?~ciuMAt18#dq6V5ajphf}0W13*8qJsJYwQ3bWfM)-LlPB-^BuR8K@4RH=3$ zi6=hki%<8&9|j}yBpY7`G8^Mw zLb)my2E1&NgCF`1erPMwNP_J{WS1{CBKx4!MS>!J7$G!#Ov3B~ zH;LBIy--P)bUJh{b1s!$#o|XI(Fwt*MCL?)OHiiIK7KF!}Sb+c0c(o6~`s`E)xB%~)dzkZ?8( zX8dAri=3q!_VU5dT=JYlmOm^n1teRI($&f^*?7~p@n)lf!e2s(kMZ|tQsDeK4py3y zwD@6z=jU>5B|MWRyvq;YRK8>@)=20ymH@h@BV6ET0uoDFB8f9lUY7UI?P*bsP~(so ztrtJ%Agl`>6YSncZd(X+w*YrLp<8v&ygkSv03&MH4h8!`JXF+{&q;LE zud24K_YD!dlXjbq-7mW^ZX(krF>f-1vjJSUe|gFxOeWh2y$(l*9!xt+2u>+-~C zkhCH4hAA7NZj|<=`ROlI{Dxh>`FDDK+EY-&Rmcykoo_yc4p&9QH9xO5|1#{D;3YR1 zh`EV(2$V%NcP9kh=za;VpI@$s;12>R`BD;Hgat>u-|9}*8Yd-<$zPk?x7?`dhDWtq zD1KjoE_S*lz=Q{nS&-{cY6R381+B)wPU8qX_Jd=Hdx-nzW|{i+-mlCyabC$!6XalMy!+XkoYStyS(K#%}8}!r|!} zy9xVShb1$lQhQu}*D$Bj(9Hv99j;ruHaHvXkpUga$@N-cn_{C5xkop6;*PuvJ01<= zOyp=xfv%6=)3DpdTtVvex#pP$T&5wDVZO;Qdqj(-4=(f-9Kw#23RqzMq;1Y$KiBE* z1=r4ebb$+5vKZ!H3`=U!+5q; zWx7ud0$=B%3=1EexNO6M;zfB`YiF3jbGPs>8ZNAM_NM;7`L|vaH9@_tdI5#N zrSe>&8W>+0slrBuj$wZeOX$i9T`W}rnjN-*?OL}Q{O{pxPz<`IJ!9uOL%4?rc!U$2 z;v8hTo%gnBrld~iptBP4iF__Kd*a_edKY9MHGD|3G7S7x#@Cib0^uzy$$`GEn-+YH z(1h-1p=GRwv5&wmX*a6crzb1bP^#f4G!Ge7nhaTK4{UbXpx)UI8n+6~D%{%*cg*H6 zh5B=*qW{BueWMjpdeW-5z8T@C81Md=pnoruz_9O}J|$@AUe@UBKq~%Tneh%wFkyr? zKbQT_@$yEKW}$2PkJjC4od-JBOr}EP2&dW**g=ua*>)u(XLt~V1?=;jENnFrLMu3< z(VnV=DED)4-(DKFvRYS|;$EkOP{bzBMg4D!4-2W;2ls9zWm%X?v|ZFa1b!>BB2@5y zP4@?cK=M6>68eXze0hjXIPXJ82xzdzI5$&Yh3$_m0w^@q{{t(Sm`SDi&gDDkA`f-1 z!H2Ghb2QV!_8G^vSkFdeq!v>XP_(eu;34K}!Qm57~!1QJN_BOw`XjeLbl z#3Urct(C7(vDlOgbyrM@m_)es3Kfeqa<{U}tdMC^&LC+L5M!O~H=Vngc^ncJd$ z>l~{8g^X3zb+G8iR+dfCW#+yp{i5?4iZ>gIsHEZTo-)})UySN0KyL`CvzW1lhEfO& zezBTaQqfV4W?e&qZj+2PRwdma_*(|Ij%|ZmtlUXlQ#2VMhg%_4N0|h51Nl0_2DcQ= zGQ3YsNgW*3cQi;<2|B6}y)tRj#b_v%&%i2)F(gHd?fnwobsHO!VsORUk{SH97Eki zhNQ|DWxQfTMU)vtv7I8Djb?a=X`$j21cafm}rTqSF zS8SWYdU;;lOBFwR9)pY8%N&(DqE%_%Bc@WobD~O|E#`R$Zfz*6yklG~-e~Q`OXRZl z1vT8ZUr#Urmi={)lf`Swv13EW?4P%l}?aN=-K!j((XA`?Lji<^Lr zvFV(~cwGya#F#YWgzO<;4al3Cp$YL+b2 zy>c1v`0 ze(3!WcZHn}|1q-h&I`?2(bjQmG9`wm&kdAft1&F}r%Lh3^F|#m>qD+HkLb-rTcg2YAC5^7lIg zaQ&q`MUYMQi4*v+{DM@b=sTeuIW?0E&fqI&^;2Lc?OS)A=~>a+nWGdRd^$30ZLgoJ z6sNCEApx{S|7B2_pt@w4EZYa|Q5+77_TZP z-RS8X)OmdU`eM*y4%O%|jBXM~Qu=Xph*@IQFR4>BN~mGUQFuLy!rnue%m4DZvVhv4 zHkF%OD-TmA$}`kiby;0i*UIbm;s|a$!AB-lzTQpm2G0V8C}$B>4m+y0574#7MENpy z`Wp6Ef52+iuC97Z&%dtePty{AIMg!Uot9}1{C#xummE}n7Uij`LvPMBaTlmNtwBuq z`PDXcu|TKl{vYg=TA!4!nd4rml+q?UrJm-yD-@pK;zo)WQGm`cv zu%SI=x9D9K+{!(^Ld%;@$eBrhe{yBk1lm6j<6+~DQ-C%754(3i3BfgYG zn6RH5Jx9>c$sT)Ted?XjT}5Wv%`1UU%k}S$`(noYK#(w&`Hf#-D-m}*>N8gOS4@b- z>v!_kL19g%4I|W-e<`rW1w#(k@oIv6!rQvM(8Ad(upPhFAxCVKZ>u4REYhXEKjdPCfd(CgwvojF| z2TkgAQss`4imgzWD*WiM?%tH20g8oWGk-UO=4WPQ%h+xcGaV71L)vbU`*D)FQTF#Q zzPq6a9$5NDdh-TBHJC5}ML@d0WqK8Nk$K=OGN(t@oRs8Jc_n?Ox1Sf#M_Mnbt=}$& zEa;rU>5yk+f4MXyDc&tyU4?&kf6Q;NpW#i~l-{&Wc~o>tATR7t-itcc(2(T(I#7L^{s8T+o4dAop#x6uVN+k+3&!!MxAu5b}cja3&o8C7BEkTYBi~`6no2K z#1-ZD-g<~>ahSdYljzzo$Ce1YVe#z)9eQ)27Q>TU4plO>6bE-ZV(;VjoNRcj=bd9F z#d@zqLavoyn9mSy-Dxsn`hu;l$gX#G|;hpdkK>uEx)T=7rOt9pJ|J?a*J35m!n)Nv-= z96wu0KQN*$hAzq;tN+&%j0e$MiZ~xBvX%N95VY@X0=`;T-&DUd4{23MTVKgQ#@eP$ zC#173x(N{`Qj8R-(qzh4s9KF$b?P-})TCL9R&CmK=q_phrtdU0}x;!K-mNaoGrFNunP(_7_i{LLx2bw3RGzD*oTh* zAtJ;`kRn5l0wpRm=+I-phzTJ|o6Vm~qAx z*W9GH+hc+|+~H1VY6aUMz(Ion8!=`qSg|{2^z7y1+QTn@%x-?C<+B}sB zCb<)F(nmQ>Xcg{Oe0(m1aTb_TS=OGSdNj{kO4q9b{X0n8AbP~CNlkhZ&RFB54}S%Q zs0;0Z@^hmz9J;Gm^)CjE*k5_56T4?`n;Nib7SBLMo@{E);)s`_7f~V0UVtm|Uy45I zyxj>QY9Q#Pn2rLt7iyt;bE zP-70NN>`;BD&X)XyfK^*WDFv+h0 z?%{vIS(=z~@Z*UtHt>NtJ`S#*WA}3CKG$C{4$hB%py~VrP3s?t-Tou7`v*9&+VL+# z1SLk|0|E)pQOz()NW{IE5r>)7tQi5~{hob*7sUv_l?WXE-KX#S1QqrLR?WAy@xVt;4g-TY=I zBtg*|Qn~`a#ltKkO4sE=0Ho&%Gn%Jk=K$nZ@9H|ux5ksc-fEwn5}5D5w@avk{r{dE zcQLwF;h}rH2_EFo0PwH0#|UK|yL%xd?}7o~TRV3=4bpb~gpGh#M{nHF0v&tokXy^; z=OBzz8es9|>%u_V{Uk#$SpD~%uWFF(956kLTt}pSrv?B3Z;i$0cO7hsdl3beSeU=%c_Jh!-r{($V2ZHy3CI*G6J#cJ zM}d;;E9koeEbJJ2u;EI7{E%h#FUDKMr^tgi+w~&t@2+*$li~^u#dLU0quv4Ta?b|k ztmXUQV>IB~?wyC_qgxl>h$^pt0rOQ)^e#zC7xL-Xlu;2VZyE7nA{C+g+ zIk-B|vvc{z&L~knMLKG7rze_UR)_6OEZYX5Wj_M|+4}(~>j<6*o_$wON51Av^Y*kD zqzbx%Z>=-MzdBzJv&Avth?S1t9=sCW91r;Xev{E_Ck?g6Ps0(!^CT|d)bRs|NULic zhR0Erk49(ePNKzGT202cDiGN9Fs&0$YNYgrDMjZPQHK7#vf;OhRuQ3@#)+HpSA#gA z83rXWJY{dvvWmf@@C={nr<*&-J{N_-!Uv`4tY+eQP%J&~*!QW(-Au^K8nF{~@uAx8 z_9+P)mWh*_-46Vz4x?sVWkos01pfGJ2Kj`kQtM{Y`EnPTkF+*#iM3G~=~8MS-={YjjHC(Fx1^p^N z{CX2txE7W^$L>4?jY63QmLh&Rim!gCHU<(IWKSc*eHNpCo=s!+4EcPI7^jJfN-fHp-rjY=P$4f6F9r z1r-pb;Sfjy8@aJGdQZPMMu4@Q253i~?e<0?@=BgD+VHnDqNrMU`Nrn;w8CC$!ga*I zF+yKe@M87o5TMl3Qk3(Q#4SY^MyYe>>0BL#C86lCREd~ z<+Yug%|mRc$CLd$I&{MxKxg#u^C z(mO?(!c(!Lt|?tf1`!hRk_z(Cu7iS-doW08yk1}+?HC3NKe6>xf8j>M=FvA*_6cJ^ zf_b1|@CiHDFOcN;_e7xtDc9f$RFJ^Hq(}~Or&FdN6VpqsTa^MU2=84$+wkPwV?LoD zx8{kugceZHN$bY64K6%S>e|S378~n9H3`*bjlj&|1C39~p@g)?NWq5tC5Ly&QeckW*CG^o`K8Sx(#PPFr&Z zEWoT12gxz=EI1@H2VBdhtYv@wJ>YlqJMcJ22Wk zQ1%8lA8N+#Uvirer5+sB-m+17Q-naFMRA_{f?1WPzE%K#q3@D$u`_z5X=e;XJ3Nn( zR9KziZ|AjOYnO`Z*~uD;(E3}`?8Hf`t@ z<@~@=0Lq`IjHxl|?fCT4KA@-K!K9HMRo^$0wdq7>zt<>;`!~|g`Yg_$y(%5^bIczU zK`a|YrF5XF+=b2mx#bU*4q8VW+ zU+Bzhlt?bUTxyjlU_`dWQ}Up*7aWEB^H2qu1!+}pObfVMCTZQ#nZJ?=;7aY-9l@W* ze+TPKw-FE^BdDe9zHb^CHZJ;{qq6l0wP2aigM!XDZm%pB{PJW4w^hdSl>(jH7 z?K~tY>wZG%)Q!)0iQTXywO3WRg=vKe z#&DTvt{|b_UUr0UE&=1y62#q z=@4sVsQSCbMGg^QUMOoBwYUE!U8v}mR(+_Vf#Z!I655CW|5Z5(*^T$H!21B_#50ID z-WAYC_?3)qfV50}dblQkH)3}I_@Srop4rY-;E6XE2KZA@JZ=Yw|0%61>81J$xp7tr z;oKmic;K?+w?m#$;gj@r)#v!wn%u?ATjIQfc)HapXNFnLj|slJd^S}THSMFY&iMmp zP&yCLxjq*(6lpNDJ40pzNsBM^G>jAq*N`rlHbTsLF}x~%(+`cjn8QM(o2h}V-Rp>` zL}P4QFkSIq61ULe!)k7)1UHfNn2l02)67-Q(8-9G>f=tRm1c>10MlPrq6#Q-5cIffM28 z>pLNYE4@a^kAi3uhk<5opVwvVu^_@hiE2uIIsO@_CpHdE%^c;|yTNKdf65 zu6mwzw1SUO_Bj>oLGko)2=Y3`LMN%ymXvKaTK9Ab;{|^NfEZKkXbe^EIi2L*O1&vq z%6T<*PJo8I8d)D{6Tsj5_2vanlb#Svdj3a|#*tV*n~aTTn8mxv^?0rLsO{7NJ4yEp ztPKGmuS#omuBtCFUjk2@OlWL<&V35LvDk8J6;3dv|Dbz}`IHBsAYK|;0jkOuQt%@3 zK7`Mo>3u@^L|h8wladAKI6pU~(WaEig|p`s0L6?p7OmB4L^kBPwOvQ zQ#Of?tCL|1LtSe9F}G#f!$Y98eVWL*U*j!;jJBxPW>W1mMj95H1=74qHaY|Nboq-V zsZeoYR1^UHr*x(e74(ww0NK{}6=sW%M|93y?kr@kFv^rD3)ls}Ut$guMNe22IxV=* zUoAOLO4w);5XE!sX%D5shI27};w~@CTq=x<`#K5o>O3rZi3#&U&zUS-4_rOJFT>U- z-qYuiuLjPAbCg$F`j#+UN7>OzauD}>-%8inu9G~Y)J)qrPy5hr`7cwTm~($6bs0=1 zFXJAR2Na?rzZG&-qZoyZ@8)N1TBEf=!+|EOgwKZD2feA?GC}CylhM><$CMi&BKU$V zlP^eOk34T6K=xuG8812s(5(I^k(EeTeZcx%1DeSHM`cgAj}fK!rCbYt;!5!?@`kEB zOeF}yT)&ceooQ;vgtOH}-j@Uya&uu+kfQvPQTwDAFZzveKB@QVJe`I8$IFfaa_w`BWXn=Cw9Z)s|$bgY)%NxlX%HdX2VlOA@ zmVK~E&!U)mn)OOSnQz9Xoj162J3FL3K2PP?V3JLoof~^Buw7DRg9BYX&7%x##PAN{ zXtc`rA{ty8GFLd1l?aK8Ga2Mwg=ykxFscK3U}k)4CvT|egyy*3OvF5QX-9hXjPLhv zMMX{Y`EzIA4If=cpMN);>|X$!#Qc3@Y3?2~jEcdK=Xq>|d_0%U>a+aBD4a#ZyV}D4 z=F1=3s9PPWTbM_O8(ps(b=FDE_KNWY4YZf0VyZ!MP@%)buRCJt)Q~c9SDl#~56ZLD zA0SEcYF~3PPITsgUXrh+fg8o0car^5(Syc|VpP+aubS^5?FNHM^n4h1t(68ED@Reg zorE%|L15jMoNrpkJ@-AiVPDkm$3OTw2sp)VnSfZICu3qUW80q1Wvt zZ!~%nZj_7r)G7PS-QcILZAd<|GS%rU>Ro5?57sE7kOsE~Tf?{qJC;)iDCirBD5moKG&7Q3Kc{9@^;1+28-F#X-`CK>d6gkR^ORn8{vY(fGEg zdxt#+6^IrsrrBx*EC9W`%erjoCRs?(IQ5!1#d6aF6FEQLA1aXDIdHVSJfM~NJ5n%B zbHxPKih+^$*V99SU)ev4F+m^Z zw_$3xYM|dpKwSOz>Gzsv2iz9!%R*~zT}M>h{{eKn_q<=ZFCWlGOPRWF?H!uorM;4X z-IZ^-6h{L;yPxY*H)L=Q_=i1!?)*U3=+oGX0*mM+eu8zG_x(Q7!YU(smr6e`WxH4A7NzDY5?%d~CYX|2G46N&isu!AxCKV z|Jc1|&IDu-Y(lY0wB{FCe-$*}iTz+78;=hq0B?F)@=9|Gd!Vb|xP9*l6fvM8k(5PJ z2jGp)QE25+9kh50uz5YMSIvjiPv-|yBs6P(%*g7h^c7bve^Lv}4r4Fvs7pb^U1r5b zm-@A&M`RPi1$YkoRECyT^N>j85SK7d1&c)|2!mbn|M6O{5%!# z((-}X<5H8RQ=QMr@|4hfTusbGux-g%n%dyW9aqouzdk@{mx=wrL7WjI!^xs~k;6qvr#(tm0 zk$n0DxBNc>(-yd-$sAZ)-poVVYN7>aF7JHvmcSOU1M}oPAb|FO-W8tH%5Fo4% z?)@@WaX?wa>0S(fK9lcFxh`Ux6U7eTmqDq4o}*}?{gAZQQIr!;yk_R6Q;qtI6wm^) zh#*-;4mFi*M%JVZ=(T+p0A%y~i>Yk@aLp%|xFr0K_`Z7?eSDt1wOF1n&6jL=<+k{1 z!DPNudXy^8sf^la?uqY06SMZrnrx_gV51AgH2Adyt(tgOGn>gBhu|w^Q<=Iy*Uyp+ z;SKI)e08Jc75_vstw!UJE-3`ka|V($pO~32zIpcXsRNSc|Av{z#1cAiRLaM>hKZUV zdxYi9zn-*peV_^MA6=^Nv+5?!r-1&uZn8Ii`}PAzMFpyx=TW%(_27zBm@cIXe2)pD zPq)3~^7Ttg!oPcgZ^{;G<1iJwN#+1Uo&QLfTh%3zFC?yuomIJ>Y4cPyTi%Jh{%RjQ z_^yVseX|>QL9h_H?}mGwX9%Z0(eb9g9`Jsv!D__j*K84-C!5SQ@M~uHIukybg&O%s zchF}rmo{iKv%VBAu_*6vsKo+6d43dh-HRBsqP{^y+}&P4P0xeiNz!kVS^?;2{ocG1&4{*Gf#+|~BnCEUJN8+p!VPB9I%qyW z_y#{Cbq*Fk1`#+w|7<+7@}|Elj?C{_PxjApJzR1HU8XP?8S7&i(O_Hb0V8q;!Tuh4Ps8~hsQYw*?k zBO5_=9rqwS(*l>~k3T~}-D(EU*fSMZeX?M?oI6vqsUfk#SZbo->fd>~tX~_TBTl8K zj_efC+7}_~faT6Mp*7dXUQ~~F$j4Mm_Hm5GS>}l7qTfX;42)wP$lQn=pgk8$gL^Q+ z{B9Adb>HNNF9{yTInm|Sl4Ikik?01`192QDJw-2Lo`{cfck?`LKo=FMM*lrIX|%jG z9t1!kJ-J2~)0U(7`PxF7rbiv-J?v@iw_)Mu%%)SW^qe43x>RLEohIBf&PND!EnzuyQ#qY2HO@2> z*GvS2Hrv-D^#kmcet$|aea@1+lKA=tqV%XbW@$-3`?!B|EI7SFh1d~1&Sq@}m{(>mp%ME=M6+3*~O zJl%F@T>jV_d9!3GdDmj>Y|S+hayMCQ^dO6nJ9Lw|e*sXr{)%_u_EZ=UdFDZ_tlJrB zSSkoyQ9XT;!^|QdX92+w-I2UN(SmwRNW!C+`P}cB&%$P3@gjKwl ziFZ{GadT1uC-JEQ)AC9c?l$ zP{?BgvEHAr7ubORgkwQ$4UTFil1VC8EY9|L@F32&^ddZOKWVWt$x`(KN1PMqoV*@f z(RTLCjFBf(KbWER*NoVwEzoAzJ~jk*r=3pUzg|mjuX=iFzO@=|uP1;-a=$jBitZ=* zwCHfP#ZGI7*>=#6b5I1cS`*3-r15xsNmytSVqo64W{rtHI1=(yaRVA?&@teYxhGqJ zdhL@p77qh(*PeM1%3#X&<1IbGB%Yep;)OwW;9~C{Dukgv$YS3!jVB8A;0-ZuAK!rE z&pIL8e1wgVcA=|z!pKxF{|Pb#H`*};+Z;K6q(4-LCUAgq5U4{#RM`}*Fu45);J0V4 zJ@AjYnCrlkru}rlpu0_ej#(c&)gEQ>ujdX-iyeBf%26FM%w&6`pW ze-Ie&BQzD5iJ$iif=gz*u=IhM&t&}J=HCuzN+|Alq5CpxD-O-Wn&~6 z`cr77s|no9o1@3&#JUIHKDaza&N~mb3WP+zuuu)wK%c=Zby)P#`RD4gG;kPgmY*^D z_Pj)@_maOE_Q54;`YaoHebg-EdJ%FSE0)6Gmi^>(Oz1KB(z>gb49(4I7_xWme4T zeu>6W12TLFFX|1V4MW}^eK2j(;)+QJu#ar90wL_n4<;vn za*lqnYK78_Wd>Kx%3OsIEZG`P_|7%KXAmp=aI(uE{Mi88H__BCjIk z11ftk&Gvw>vO`h@{erq0A|yhND>Ptzu`0A_%whuN{k!#TUN9m5!ST^TV{wr#clZk1 zLA1$VXCcHAg(~!rJtbX9Nl)eO2uG<*foxUlsTLprrYEtX$$ox0Q%ts+TA_&ufRSU1 zVECvxk;YlEfgib{2|y^}Y%O`gZ>6GvI4m@O=rM!&$I9P~{L{4r@_>h)j0%uBRB=8f z%$41LroddzskI`)Ab6pIlI$gBP!n~dWWvlc3JQ{S2ZmP6->QEVQ6MP3l?1k@lQekC zg&-X!oj>$|Q-1G#`dg4RfUUb}btxmxlL%rm7{(*X#cHi& z?nqBkx&DTXqym)?6ke&M* z#I~Fwkb;M03h^xE#ezOu`$}s~Sx4Rg=L;@n7X2~@y61mMy6k{=y`zUV8S|YldltH( zGfUm;cFf-V*GFk!y?wZ-iN8p1))+*Y;{E3C#=`TE-zNJ&g(^dN8=L70b$FNkz1l4h zAX#2b0$*Wj@?iRW1*Pqa3l#`L>Sy1Y$}S+w;?%-K8RP{fZ=k)m6{*>AT|BSOV;t5y zK<-}ebY}1H_(U=2;_a^fhj|4W_`zKOib^&n)NzCLVD5R0o5Bf+8+IPRI#0B8weOUY@j(6cry#Vg$uSz@ePd^lDNhMcG4wK0) z*+|~>BK2+l%G+fVYfYo1J?XK$d-2v96cH6RM}Uv{CuPE0NLL#B&4k`W`n|+Nw6aDd z&DTpH+xs27Q&?jV2%ix6R9PnjuB2_8wtC5E=glC#uew-Q8=y{i1j}5;eJ+T z4XtLIFAH~STwR%nd=9(oPEyq-vh);#Iq#}rtsUBJS|nfyoL;>(wSxPsP+$FY?%lVO zd7)+}bL++jy+on0ud$};dUZKo_@p7gfRi`OI%s0uyFs~rJR38qPao9iwBC~Bq~1Yh z08GjL01nr%49baAI&MLslCK>QjrA7NB!x; zW^z)bDiji2;jvZ-hxF@@yg+X#2ko_RQ2w(WF*d9bmVbZy#wp& zlY%q&xpoL^cq^_I{}Ftass-g zR;xRMGc8?7AD<3bR}|T&uCB3u84a@p%GuR1S$W3wikq{G5lhPFhPZ+p6E9 zJ_!SsRy$iyQO_$ybJpN-gk+7mg&0}r)D{Z7eD zfIsdhYvgJ*r@U5HggChl6r+{+X-Du#oaZTpI@AUo6G>5JdRWcp;5{U6aI6z;A3LCBo*(nUbLf9 zsAaw&mZi3SktTt5<{yE5@}%1QZP_l!xS;=RoH@Ix-|H3mM>VV*mY3 zHMg)=Wy8{>7q+$k=autwf5|v*Y1i-Xm0=6XZ7|+Qi;PhP1K!U+r;h?1>s_wd?gN?6o%I1)h(W@G|-TZq~t_LqBkgD7939Aub&JgDQj|NWs;E zt48rSp5LI$93V<>buUOrQLbL5fa$w3A#L_J4vA_^;HUjuYzZOCM6zV;Q^vBIo?Tb( zWnV7ze%v*^ic4O@k+%y)dfKi2P4^`FEUDE83=NpMU44kb1>;{<^NwBFFp@dk&~;ss zXB99g(MO*Q)LMAn)a?(@dl9R)5s>OJ>zJm;P!>4%IadQVx4ojV5<;%tELS{XJ|zuS z+`9#Sg^2B_wmI=+;Y;uVw1hcvA}PP#eVO-)Ld^wn4#b-~g;{=qoR_Z3H#0>n%K>$x zAjk!ixmy0xLTdHkl#1Mk7VQsWAwosQOX4{Z<=rln?IxH)kVu^0W7}D%5VyU|-4G?D zFe2Y(mgH{e%81yv5Q3Uk&Fl0bX-IqLZFhWvgnuBflt{2C>R_}39U;n*o#O=Asn|Hv zt-sdzmbQ&FuFZ;a07<<9)w058O_sq?V7^SNl2h{`L~M+ZGb<@Fpnlu=B$V_=2fA34 zn6q04r8*p7$o_pQo2$r4GPJ@Pq}C$6a8BG>ArsWQo1h&gqi~v78;?=b+Q?11^1q7@^QD^I~3#QJUj=;IdvU zEci^8T^$PzeHCWEYH+3VWC<|g|E@WrinA(WOgmU-k&wHu=LBwDVF~4m4l8gy(R>+? z)4xg5DvllHmd$jjBokIg2%gdl=03g$ zoZcraUH_u6ucpBr8?iQa?|m7c@)q&W8dC16GihqU&%>dW0OQs;~O zD3U`-6L9>vKtUSQ|3LEd&&Vp$9gQ||xHSN$dZxxWK0bgYE%teSi zpwBlkj>#px?j3UtaG1l1PRhyfj7AlbPK@)L5*a;tDpz?ZL}kAtxzf=`7*Uq}IV}vk z@D$2fFP=I{>rTh^6>!)fTaGVA(DV8>i#S;*(<75h=Z{tiMMXg0`;>rk2T9?OSJV(? zD{_)0ENdX6J;p($?{`H*BAH{5bLx*Q1J-)DAj&srNUQLEy!a;7nCb}O*d56YDeTy# zFpZI~lLeKgRy5kUPdH;d38un#9$AAMI8g4N_$lPP1!+7zMTLB3BQ5QV*Vk<1I1q-n zFxdCX%22AH(8HmDx7U|&O_%3G4w!`I3Js8vz*fYx=I1q0`e&DsV4Xg5Qb1R;Xq-y4 zNg$qOH^T;(fPt0MX`=KE1oNxRjF9`1KP5m8|bpYhm8oL+7=$!j}&hMZBUirNcnR=7%OHoS6Q4-0em;ZmcO}MQDzq_~l)wWriM5hA=^CHBCP_4zT&<(e z5Z_KVA`_$=u!NQ17ozkLQ72QD2pwA??Ig=}B8irdyfpo=+1oZG4|wM1vf;U0HH_qq z7c-MWHoQW;?XSob*oi-iZ~7C!c^j2jY3YP1@=!nMa2_|D4qM^W&!PF35)HQlO0Tbe zs?*wL!?ru4kw_L#S%nuaq-Iz8>%wtO3965)i4lxR5Rp|?sV;d5)%2@+#ZJ7-BN zB^u6kPsJWJoL~A~Jt1@|B^u6l#Lp9cZ#W`#*{@CZxj*y65MVCj|E_06p~r6pu=|B@ z75bu_agMVF=@l-rL3S3-$nzGYW>OQ0hM4fi{-2K`33oO*+?MyKJJbq!s$Zk3xqGquade>Q_|77uyE_f^5q-bZFR-bBVj;`X4lImCfBMvH2!6KEOC11_dhihe+koNZs>{65uSZz&iwX`>hB!ydX;wbWUxRs`)H)Z zzEh(b$COuVj15O!|2)d1!AkdxiKMAegBn66^()l|&L|s6A&>0lA}KY zu*Ux)45o8u1>W0T*vHfK17H8IQQ$x9Fm(||MPK<(U%d&r0xQ)4xTzlxf&lZ^Z~Hum z@z=;d>eB(S1#imPPv=zJF++%>X9VWb6xv(&lL$!@W5h2QcdDsIa| z3i{8OeUXlaEu8$7p8>$%Pki>;pm8*uK~<2Iuv~v0FRsuoA{H0zpt=^E*wCy_>O#Uk zHGfT_9zfRlPibEwVNiMgH(IDQQHp`{uRyH+M^Ln*KN79b_J7qcvzwVwU-}r&(7!%v zJ(K&yzE<74W8Vge^f$l29`vIK^D=)=9fEfME84R#e`|USD3`X5mKhW-kXVyH&u;KX z6W+%D*9=*jI!7X2q5w2ef7R{%QZ889OQhq(YFK@gRjf>)z5h$W@C64v4-DsevhW8# zU2!#!-7{5e5HCP+`h5@U0$nXQ3288s{`EGwOTq}Mf3-bP0)UF>2TtXGEg(0UnrgOI zhd+f`IRHB1B@FIPg4va4^&ZlCq&f$6;U^;hZ$uiHzJAXw36t=@o>JkSh4fBQQz?pr z;59QRizz}j$JQGpPHHC=VyVBzoJd~0++9uFG=AfRJh|PeMYdga$6}NJii9P^SYz$p z%`-R6hwyHxxaw%piRTbU76Dwn^R|ZBAK#7vE&Hpu@~%7N1Hi?cbh9p%vkYSJX!$)m zY0h81`6mYcuSrdW0R#NMIH0ACwE?YiANW$xb=FqZLV<1+RixHa|U!70WQ&k&}(Hl}bp^8hY?#J*KZ zTOd|1J&m2wvp-=WG_$cY`SJRGy;@=O+p1xMXyf}(gPTJwKzWjdnU#}u&4b32Gj3bH*?c9E} zTwZJy_*9N&!}5NmF6RPBSN}+W!jC_L;GT4+WwP?yZ2Gpld>hW+mM=c92uAWh(|3pV z`#%S14lc6Cu1v23Vg749S!LZb!-BjOD@=UsdYom4l=vE_`d7J8@6CTg$3Y$GiHt~O zdyB`v)KxDK(OYEKFTVpubEPEdewV*;89)@K2pjRa`A{!!yU)tO-6HKjf{%8B2&8BS z`WtZSoAqkA?$1@!Q{$WTTndF?6SYy*qcPEI>^Y=jJIr z5AZ|&(xd6Gqtx9thPBA$5OJPg4!`iVcV{{EfyLtL;iamFkyog+D9ZGeFJA47*I51z zDP&8^u_RLa!HjUHeLUUEr#XMqemFF&eRg(;bYxL}BoQAu6dx&+9~qQq`uHgsibT8* zvCg7r`@Z7TDH$`=`MF=XyC3h~i{C+SKB<#G@YU@jzV#5D6gW-ElL1uMfA7!%W;~lf z#QqAy`i~*V{?qf2K*;^4!I!Zd{tJ2bPjxj_-yJFjfKOiw4C705p5rvfdTEI3Pr^9< zA~y5V)!Q$Vh)VX??Q`4KbJf8g_e9*1J^xstyB$tr^_@uLFU{-vti$;3(%f^miRYM( z@7$Yyn3F+%P>R|3@75NVd-v78We&48%J<3ibtC(95`H65Q#f4UALwxZCM37N9d!fo z#S20KT4!F2LTI|bAVd4ly=uR*D6fx*?efK{1J~^Vsq{u~8%IRDR7%bMtek`jok+=%6=DiPmD_q6lP(t$68isQ{MnD1o4+ zBW7jbzEgj0^Sjk1JazkdtVK&V1qKudAPf?Hzr_;4|3?7uD;{(ufE5&=u)cYUb$?d6 zB1DU}Sc|trOSV)?GaCCM{uS=Hk3ssEYupO~!NnG8M(q59N)@L{9!OubcE2ngc9bFk zs`WG4>ECxV@8_#86|nN}V^{vYKTtyb>AlGHjYh@tTep!oKriwe%H`#Y*jSplpEZ1?~OG%-7liRoKf{agv@eo8ik zzPgQRZ6%96T$R2&!7R^JqM@oh!G*{7WSuXz2qr>T4=@xcMEcYcRPw8isIx+ul@u7; zy2uoO2HkcgorvLS(ofj!8Plzbvgt%e}~wH{GE|S+~4pj(*FjhRs5Z? zMeW~UHLaKWf>Vh%ZTR(Nw^#FUOzmj3A;Yu&8PxVK0=3bv#UvMcg$jp=qrifg$}Nh?2BBZf}_e6bTRB%$~rUM}$}s^F$sGR4?df>F~kU0OGLU4zbWa z0$(9#|D59Ln4bjg6xs60*NCQE_1C#YZjeDXS>F!egb((!Zus}v=m|f_>W6LvWYp#V z41)Nn1^Z3nqKuWS43rvJ^PW}t1b=`K>nm;aZ>3=l|MwCJr~Efm-akLWratOVsR=WA zbg6yipBzotn+3Hdm6h#x|H+(Lr};YJHd}D?Q-khGQV-%JY6JgOs3ZMdjU7u`A^R6G zx&?~2)HUL{UvgFWuk`R}BVN5Y6#BcB% zdTGIme?R1`qDZFxAu#;7Wc^KzBTA)%s3)VL?1f1x-Gltk8()1GK9$y&KK)oCjKe{{ zA(m1}oqEq9cQ^PSeCstiBUMGP#e2?Z-o7h<^8cBDKmT9VS-j=n>DECP?+#57$aDy8 z%ahFFXEv*A>h*Zze$84pJxy!MtsnFvbH%$pCs|_S^b^_c^Ymyuln>j;y9elJ98x|q z|Eslk<%TJ9g(aWtp9hZOTiWbdFLxsPJqwlpR|9_VOZ8$0jbPhS4&98Wo!hDo_kJ>s z+MFy*3UF~XSfBM?jo*t=h7F#lF;o$(}6FZuQ3-eKxEt~VKyjbPkfNsR4jSv^N0|#BNR(X_aJ0 zl0WARWDVok&05Z1d5SRv5Hf?5|k*B#7dGx$x2bG(v+?YWhzVA%2BTJl&=C6N~$6ii;_%o zDWsH2YL%!|8kMOWCMurs09^Ef#XkgWEO`Y2G|LJArHVD+VgUf!|KQ+I=-J<{Wy20n z0|G+h!vgVA+6S=Os70`qpa73g&-t8H`V6lI(l273(@?kQuuv;82~q49f?&}=<5@KM zG}97lrH%IIgq{vMLk5hPLT0+K(4Bh-I=%GW`YO-m&`|SSnr|l{y3(T`0O-)MVq*Y% zJ*f7auc2Chq87VcB>o|L?_Hk>jraL-z<>^>zr^8mYRv|gex%ME0B$@zJO1Lrjs>=7 z4Iih|yJ_yryH9Ri^*^mS{Sd0f8#;Y3m4ABAL)++b{dQy-Nsin@ytzfD9XxILprXld z2=D<=di&|=!v|DNKmK9zNyC0fQGaJC-b`9(bqjKO#`kteFTHqL1OQ4vwZC>dzuQkQ zgvIu;%5$|C`Kd_A4b@(lRdecq-KPB>jx^jcpgxUFSHhca3$?%H!PpY|nH}=s-;kR~ zj%VSB2H?y?^Q~9v*zIHw{tO$NkvxhR<~Ff)lBYm|l-0i_`bElrCrpLvgR>srJqn=G zPX(!#xMiROSd1|~POz_wPKsKAf=sj~tC&~Mug&~AmXFJaGvy^LhFe(b8ZHbwIla>z z$j;93*H8KQL(g1}K$y&hKK^x89q>j9J5}lbd(2Pjo3sd*i8id3vM+N>O9I1?I9%}X zJP1AX)L+5J$(t5RTOVpkiz??6ehIeC?$rNPAs#ck%OL)dl+4Tb12ar+rZE*~{ZV0G zGiOUnDFi44NcnF&-ArE1F7&}kew1NIFg5KO(>?9>I2s|}rSla7v) zsGA2&0!#KKKWN|0|7~_7`m-W1WZfrn?pN^4qjGBZ$JscWcJk{}q-7k{?#MXPzfq@A zZ8}7wGhIT$l6aalVCPq!aHFAda%^%Z??Q~0)M|VwRi_ws4c#(z=dD^-+C5uOnQ?8V zZT_>1yJ)Z(?;K}rSdBk*ogsO3tMNBwN2%LZLnGoSI4tZypdhT_~1#WJY$F8vMJ z6-62B(rBkgUb3xvA%)7iJ;}M?JE;N|Ywz1C=?O;FD)kdsu(l#*N&Ur($HQe&!7+W| z|98(#XiH9EcbWr&zt8EU!-uJtX6j%=Kl$JLRy4F+xunYj@3~7)hG!QxyjR_m7Ydm&lgex?eW_;HD6+=Fd}1-uP-0hb(Bi zgluLTYrJP{$?FRz%%;kU8*VEvlepK)6(^3GDcRH}Th$9u+8%bo@@UJa`rmoeaf9_Q zC=u^Jj=AlRG7ys6P0||RV%6jMhs;oaBPlO(Pkeo!(n-)i4Th$2Grc4Y)Z5lV^@VN< z!7>_$Z+MfDffR}h3+um>vt7+givQ~nQ1q(g7zpemqX|WFHTv8liQ3%}kA(!bu=;3| zJ_K>sdT3VlJKZ z+w8GydhZ~MdvUABFKCCe>u$i^dB$~a$24NPs~|)kfV7KM*OkRj!Byu0e#og zaHucLNa*R$^l7Gjpl{pwAd0%$Zi6bhAayYH@}fz;XE?#YLtp1+q-I6k`}s?2H5oQx zst+@hO$ePIweJ=hOZY&6u3URG%!{}Vb3JO$eoN$zE$E{TrE_^?f*jk^he^fzCoO%@ zd>ix3{KOfwfeyyi&r*3eVU@;*CZ5HCaI5l=P9r4VSz96kqO$|7GWi?JmYLqFSKV1BH8O=RlI`npNEqVA5d+gNy1Y>Ln{?`46+^V?3RAv^HVse2Aq}LqnVvU-?t- z_SE9NST&G0{vbRM4jI@(x>p{rIbElTPv{B43o!h#d6`2L1s7SN@@Qj9>`K_Oh~MHk?+lgFSIvo9xj-Ojx!&Ly zJ(X(gQtg6gGk2v)R;eL&s3ttf+CWUQ)RXpzMHul69lDcy&rZA*kd`E|&MgYZV!H4Q zF&L^X0-|;k2!Sp@Rk&5v$cSW!{fiAPfnPHS+^vdooNB9Q?;aPS@9uQ9pwH|jMWw}$ zgGu)t97?ytWt$~>Sui83w#V8UliJXt({s7e*{+2ZHHe|6DYo&!IMO4&K zUxpB#)tH~SGy*^IP4OphaRuAv(3iru{)fh5a*l0J7)SM{JGa-8%2>oGJ?vOx4XuUc zNxFm3qtf1PD&+wq)buCfs~fKYsS`I9oI!T;)c{*jZ^n(RhFklIL?kuMcyBFG(w5(SlyuQp{N*i1L0Zd@)A$w6KM z0_tQ#4(ua<0Zu4*mYYP8up9`Rz=Wm%(HX`7Z>6$7+ttT?(_}B$GTrf-*eGTy=A}Z_ zuW%!rhdz{6S>NTYyv|zH%qql)P6=GuqAEA)4@+$@Q@h1aK?Ox=x5WO!avpOL`&N#p zsV$}IPOG)oxG!#&+BY1)xb?EeDqK}DQ5QA@C`klE#NW%nNFJ&=9U!OUaz`F`BLM)w zJ*serE(QiElr>V*YEfl$lm_C~s})B*hJf;Nz1)W2H%)s%B03_b(R$}jkKeS>QYIKv z3^iMHYT1K=7$6c#(esC+YVZh{Ndg81QSYf9<4CmHyz79&jpgfJe`PLAt`MWqM?ck0 zX$l`fY;9rod`n%HNj=hR_tM(ivLdGlJJAF@9x1Q0IWdpA_keL1NZTB0Oq4=!`Whn4 ziy`?O(_}KBCI~^!Bg##17G6!8ckedoF-*KI{Esibkg_M*Me2j*_Sf&!J{TN?JTsuO zSR7MfOh-sGI~X)ZG=JC*z%lg+{SeXXgUSV620n8#Ycr-?7V7Q$I)CQ3WY-pnCm~H^ z(9qS-^_3+;4DB{9v!JR)6}R6Wl3Yn*i;dnMp1*PrKs1Jn`F@xoq9PsB7K8QYSZ#6% zTU+?4;H)#bET$mFKrm@D;RLwQPmVaL@>nV;cq)iO<(br?USo;>*evzK2>{3vI6y-Z zYB5E$sh#N54J+=J1a{OUK(-2|e8!gW#~=UC7dFI^|>%1OU=)%GP zCh0WaNH`ZY`8Ebd!pxdhDes-@qf;dl%b`J={4X7zq@j+vt1=`3@b0E&JFLki9jzC$ zJN&mBG&>J`e3f<&)uc)~;BV)3mZ5fvK-r`}qgYd4^&qxf6KlJ^4lvw5h2~Q7+p~2@ z%ElR7wpK@m{QYv%LiSFDCkTDW?~G*zpXorLYy(&4{{#3K$Zf=OR{&IF&FXWeR-19a z>*7vYc0VqcZ<2~pb;N`5cNNodfnN$6N2bfkxnW{i%K#}ux>YbiIDlaZ=tH|N7YLXQ zpki`_W4BdXWXZrpmj%Kgj>qDQ1!`JjbLV`0F4)WD`w;((@9fZu5_Lbw~jw0oTO?iC!jALb{0>f-j#He5QfTsQNvcl zEUWrJa~*pi`R~p_Jr^{(BK{O0HKpHSOK&Q?15h7bCB&(UJAwYKJv^c@%N|oJ>z09R zb9UF!Y@eX%?8p9_QD^9z_C|Zh<_FIBMQ@hkc52)5-;TWV$2!f7(Sg0i;SQX z7ww)phi_y)rIy^a zX}kapVf@x|lW27xfYplt#WAaW50Xm#E0?=R9UhZJQ2R~WNX3#>RK$3nwENxw7&g3E z$VUo$`D!-bEmnUxTF3#Jy#n~!G*zhD+ul_hX5+t&Z}qLVGI7a_u~OiGltxAImay+gQgt1-v4g@X zEFS7QQf&5r-eIeS;i5>lW>{?%y|9^43O*?EPW*199y)V$(|_k8m8MwSd8Mws2t89< zuDxxemFm1=Jd{9nFs_P9G5>_(F|vMhLMu|Yb8{WEz)$>jR=R2+;?ZlD4U63}QzRIK9XBtoSt$f+t|&}UjVv^!ZnC^1 zvsh3?3ZT=aQ#6{eCL_flT|kr@6JAb`oHi}J!2L*1BwYLo{->>^BE`KCmTINgZE-Q) zb5z?wQ$@_~p9F53$3=yN?P9}<&of_CwBv{yEAn_rQI|BuEGPo2(*7O1(>Mpwq~(j;jNZbY^%vt`70;5;{|y^x{evQc&z@e$1O9aIz+x2G!V zZ5e29DIXn$$pe<0)d{g*1mJ8By#F3*WgQu-(f}kRc2FZ>O{E|LdQSdFhUFG3bYt_lh-|NS&XAuBQX(y~Bm>pVwj)-yby)(+?N~=F%gST^38w}2(tzpj27JO# zXcfhpy2*o9cQ6?ay252v9w^Wo8tt7`xoVaUv&wUW3yeO=c*WQ(LZ<87L-}u2zZC3N z@%LM~-%`G`WmWeW4+huqf&CL(5oYD8K|(Ej9va}`Rq)4&%8HCt7F*5HHCBXg9Z9uN zvla}+*v6Y`u`SJwkCkFbI4cf&H_OZ)Pyw%4T@9c%v_B6yD7dhQI*S*RCo}s&kR|I183Eu=SI~F)3CEDU^_~x zaedCJnNNEWI$BqA6oU2Rq713{qHs%L~6w+w?h5d>ED6A2(XlZQvXATR9q$hDh1I1dP%3HOPIDH$+;<|+h=S5&zF_~yqi zz!pHYo6BZtt&lN%(=JYR37m&O?9mZ7TIZ*TM^%}<)HzN&8vsC+2Oyx@`F%vve4{UJq!nD+$`2xB`)r|<50cXQ=9cWGVO5Z zro|~oWjc&+M~E!HShb^OC`p*NxOScEuX(MZdi;Hw9l#jLRap)L-gM2dO4S7sQNtLs zinchbwCt^cp216~p~(8BJ!3_AM+D5qNsFmx@^!}GA~n|F7C5_8`J~jnjkute3TKUn z(cZ7{XgbafCs*m~8UPsYty7}78ftWN9IZ{=7n;Ao&Uxm5Fq?`Qm3%(| zh(mWLDaxdCF0PBI8;N@>2gXK-ASRhwN~N$~OypAGYLI~5MOD3NjZMv#1tSOw?q;hd z0I7S9S!z7hC2G6-LM-nC7)Yw%61T++U3Y1BA37pMWL1RCWjp9o(pa+zAx%nVnt-VV zM^I3_HNdY4HFg1Nve~Xqp0!aVEg+qoYgr$+0z!{stsN2sgmMVN_Hwyy0})kn{#d8dPlw(UgLzNn`>1vQR#z6!m18b%JyP&;PZLhC^EW?|@S z>uLJ44lr-LJ*4WZ6K}&RgrEvE?i%c{1iKC}Wv(*Uxp`HX_1X79Ku}vRMqLQja2N;v zhXRHG!vF`%UI-kq=$iEDVLn425GFukWo#7uuYf}{>Y>0U6z1j5C=N z0A7GBZl9JaZ@&uEzz)^+hSJo`_Su%VQ*W-hBo;g-vE$l-xiEHsw$&!nJ4R(uZTGhC zsA<*x>#grVptQ;;V(0q+IL&U0uML}utqn;0ZFG7Ut#H|sx}B9g-v8#!yB;!WpRTPc z8QWRxD((Fp`bMSi25%FES9!TusVr+>XClNXj@wx|bO(`FnEI2si&2bMpnBUuvPol997b-spSOKjFmE!h?t2B<>U zW^xe}RHilCwa!GSS6jQ3WH(T4c576Lqiznn0fs&ocySmr>r8_mHMy%^1E@Q!dO!!g z!K-7DPzNIXingUd1`u*|YdYpkgTblQ#`a4;c0JqN$~(?$6TaNrd7gA@H(PNx+@x$L z{f~?C9DeJBaTPg9?diJJ@poo}9)eewvXcGhdzn%8U5Lghf7`RHiR2LO-eRtvnbD#I zOq(DrMJl*A-qJYbZn2txxiQWn%`U{rl3SOW6AfpdezqC^2CwaFcS1K}*Di~QX+>Vf z6|_%@n;);4DasVxbd>IVb1USk9~Ts6fApF8YC)@^)eOR(azN z2j22r%>uzek%!{3%g8QD{gw$YirdHfwCL}3J)=3VWx}`XJ+pw@XE!;yRWZA+_F0fH zp#(@4)UkZF`4}p^luDm~6-ncvu_lysMgo!t3c;j344|#5R|x*V_)}|k0nx(VdhR6) zDW-6VKU$AUF2aLh?onzy7)$%Dnkg+V-iPA2vd)?oFaURRr&W^M$VKzJni>Z{?h-_d zB#s0bdpo`^0eutT4P-%ToQCah!=koSPm(WVqp94vbN^#Y{U!JZoiir>pl1N!ECBRt zZ3_T8b4CVK6aWKIzu>haQ@&rCdwPsVHfO<$9?zI<`0?(T?w___gmVt^)&Qg-rW^U$ zCtP`;u;7MFXS5f}joA)uUFdW?z86J}1j6cg0QranM$1ynmSlIM|3}Rl@W=gZ>;d38 z1VDnN-MEls$UX;T?rvl2ma^>~q0i2a4B6dL3=IH*7cm11)+-y(L7`B&(irMklsT-@;j&+e7v#Z1zVXmB|+GLC3vpSV`7Me5dJIyZ9FcGwvsyLN!ek?dYt-0jKf z_Lg*(vjav0v6pe;B^beycqt;jOd=U+5tj>*zWPoe>==-azeL4$aOt+Ii-$FPw!I^# z;a;V7;1}jxT#_P_7HKp5S+&D=T7L&y)p`F8&4w6s+EEFq?<%3sSXJ)4a3~P=@=PXU z&{9#-P}o0C1|TLDHoka|{XYmqG^yFgdpDi{GHCkf{lq(yU&&ebfhUtMLi2fn+`7pt zT=L1g`pO^&1q4utbX-IL#fSaY-z>!B{}UPL{`3<+2`B={G7Q+P1k@_RYI;rHMGS3ha{?`Wa}&{c}|CcBb31o-2=4yi?!m<#)7x ziaCMQG8j6fRCP>MNU{poUPWS6l*OiT>m{a1%~gu4wDvg}X<4}e@K9c1Fuv!mV#>5+ zX;rSVs-RU>Q(upHPD8S4;;t5J59o*030j@1%T=$IR^MPc?6vBYjEvU+JjtY*qBX1L zJzSmjQfpD2*WS9Ab1Bujs+Lq;yVWW-=O)K(UNJ(3T=)SBr%0*{3$ke>tqe2G2b@@w zUNVs3yEa3)h@=%6OJ-yU%tsQzMJhd1W<#4wza%GB-c{&gRZ&`LXH8W(RVAx3AXMvE z{h~!$_mNhyBpWh(7=EBlYS6wjy`)33DGm5H_r0aL2CT3PfX6TZ$-i{MjTy%#u2FKY zX>D3U0LeJKK!-^jFI2wsde_er!l@W{4}dR}QU;CEfoc4vg$*8khSjZn_If=hyatgc zLp`ies?Laga>K{4!>6&=$A|WXyrBc3Zab)sd32HKqbcz*Au|nLXpZP+4jbYlQ{xnr zBVM(jkEk_X4R~DhnYbq(F0}gz5wrX)CIZRmoYi$liO-ul;cnsi43ep8CjiggP0lbhyz{G6K8^#R4kH}j zyCVoF`Z4@rQqgTe68??oma(T~)dhx-U?tE-g~btoUc6liNg*eJdjK7FIwuvuX}W7X zoq=e0-X{S*4iH5k)8MXoF81tMw|Ku$B+)pbc%13i@*y2Jp|-}`X>UPeE^9JJ!=lOkJs z>Ew)wt@aEzuEdDHx211xe{91m2B`xR*vRWwl~IZIyMn)4ItRugBd1#zQ-Tmwm3LDw zLoq7j(tp6@Y{s>cZ@U@C?2}9oX(;3L2LQ>Jctk}H0o21r15C)WX z)n$~=M8c@81}KlJT=NYe^dJG!M`ux=ys}%jSnh8?Y(<=CPIcl?e-*qMe;{*<#YKRR z$}aa-!$Sab=G#_@FkAS^^>Abhgdji8)nlC^uM`s0oTFXJ|6Ra%u;PWo1E}yRfcK{& zT|6K_b5#bMm0T*gXu0(6`4BM>j&6gvSFIvyeykB$WB~Y(u@S`sCQ`k%NPH`c^0{ee zr1|_cB0}M(vs+J>1?u%C?Vp^btQ)wEy_DNr@ii9Qw~Lt&|5+?pxkSa)1u5#=Q>XJG zgSxmj4K|c0(X0Xhm6x6XAj!JbY9J5JCKIn0KWV`S4OLbK4{f2>Op-5v!lRDvwUE(o zbO_UbK-)G!u;$wh%VSym8uTuZ1^FA}harPQJIxqAz!7%DpKa9dhCGP=F-f45ynwk_ zB!Tr(@WzcuS`uiegv^x>On>7P`@P7*XzMY~dZ<1@~fK z+R|XJB@2d-Y*Vm|oO6NIns&+L@lU|I{ZPiH3z@6e!O(U5RZpCjAxK*_aNmpgUZAG z72B8X_Q^HLF9Z+sx1yntu0g){dw+<(rRLZZXvr@d%7K$>pJHi#XIT<3liN1P7+# z7ZW(e!+`C?0(Gv*RNV+i;o#O(KnBlYO1qkjj0Sc8nCfvu!G z4DgW+*+7rwkT4_-DNL+=0|*)y%q15UKt;c3I>aYEYFZ)OheM|)O6X{8=j}!g`$XR! zy)nXtJ_X1kBk0Ss6adI-8QQcI-9+EOZ)()nx)uO5j7bO6#5 zh}8F5z+s?^XlhVI<~@2=!vgFz^DojlqN&hqOw>K*b{(T&q{ry9?_AqYQ=`z|NH+x^VtFbx;#Jgy)t>H?}QUd z2UEBEz0Z=B^?doTSeo@ueVo%m0RWSRwp?^3XunRr+g4L!`2zrIpVt6jx}e5a{6#dc zH1?c@gvpJ9PlGywM(>}_Y^HC&WOe{}nx*ef`Kt43M$5TB6TCZ;3jpAc&EJ>9b0r-e zDb8|vnsR|!{+e=KLfReb@S*Tr)smxXv7`M-w8+|!s0u>78duXiB*s{Z0D#1^+7VRE zN&_%u@_vX9uybED0KnhQ%T_jY?83sH=*tpq|7-8P(aypJ4*>M9eP3xZTSeDjq-&C6 zttoW@z~=Ud7xG=ZUpX3I901_i-2-VW=iGxuThS*m-&HIazt}a%3jm|LkgKcH(mosZ^_l_;OPO-=Bs3F5SB=W9yK0C~z1{-h#y!M!B7=Lw9)GviwK2%G!K z(r9m!P7_0<#9sh@m3SKyp272^qre1GoS4<;`I?~#!0!V@oU?Zzegq0n_;lDM3JT~j zpzZ#kfWVG^9t|w^y|UJu6W{FL#<1$*M-%{Lqu&(S3(Y0rZc&dMx#xv6_U}KYQ5Q@F z&q+5^ItZOkv11$Kcxh{eI6gS(R>W_{pl7L`Ixrrk;%0D6{lbT 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

    f&9D{tmqEy6oE*y%amzLzJsU>&4_ z%ziqxX)`@fXh-_}M@$W^$->l#I#C>D?JO*SA@6Y>Du;~XhNw{j@O}fZ)-;Rq+MBZV zUD2*UV>)5e2(5?Bwdy=E5UnrPFgqXkmIA1rJvi}j8Cv)TOr^LxqCC$g`T&NYetZVV z=Go|346C=dJB1)$xDc$o$INw0%U3 z%Tn*-xLM36gVjAd@I^I#mZKnXEdX97!~?5I*y_eJrV{4gzc@ zXbsc8N9!yztUd9L_11aJHVaKYi>vJdbZZplb4Cr{()Pvclj|8If6nyWAbycFE-Sq+ z3_NY>UFn2v=5)wyIxb!O>aD>O{H#3c@6YmeunIQ5VD)vF$TNS@y0Y#g%as|FStjDR zvl1HLH;?Q!8|DCj3qe3i+jH{I$#eb%@-Y*oszcGgmADQpDNgA*dW0BfewFowu3s|&cNlXM!Thc$3h%VvH-ejJx4X-g0&iH zzcZalVALksSX&R3u`_b+cW4%n!ns_~P`E0W6pe@}KUIV5C+aEb_?}Hzpy2odW33!A z7?aQb3uPMld4Hk9umW}7AkTydge&tvn+A>Nro7F5`satUX5gYN*iM0o6a5xk2a&)v zX^zwt&Fyymnx#DYi*BYqmqm1=V}wk8doE)}sVj@xQN63c+w1sIc71e0;M#Iuuo~T~ zmk1Beq;~(>-8{2mZCj$;GvR;!FVnW#$}A!eu7BPmnF(qf+8^mJh2CyCXs)br%~-Nu zt4kJ^U)vhjHkX2qN_rY_ zA)fttRhLVy2xRwsoL3@Ti}|M=5Wnz2$EOWCJ;4hT2Sle4r|`Ay zr`QQVhLzr5wE2pQ)Ut7^=84F|Osn+#$H>_4Q)<8zxSe!68V@LH?G~1g>W1}0^J}4O zae{OMhk9JS6QQmZ$TZ|lEbexf&SNx9S8I8g5W6!hIaT1N2?Ye9Q=jln$O8C-uPcig z9_qb5;9U3aM7a_HP234YFSse&|w@hF~Y)esGxipaK+|Chjl&&QW` zm(G77N_NHp{}FF<=vpBfdLli`Hx_-@Bie$w4QWiWwn`ZRCw;~P5{`x;2@C1TPq5g} z!ybJe#w<9O5n>*IpF?lq^U3!*!1lD%4vUJEtxS(B^dRUbm)K0Ee^8a2CRc{x1oRZ6 zX8PT-Q*Y2qpnL=P>YG1&K#wCG0Y$fe9;od?6x0c;rvhWIRs;ZybQWZv$HQ>oRZv&n zFwyihuumRw7|cl8<9u4SrEuri2fkJv{CpgN9)2?(v9@K@^*;|J*oqP0BtjWY0{cXH zfd9^(~fE4D8q-+FSMS? zN1AhBPA_6PCV*giPK?iswTSH^nZsOQkvLah;`!WJQ@8qSH3EV z`Z-HZk$(Ak1GDKl>m@Zb(%zTh($s@yT7umHYU2$jugnCinuAR%W=hz}ImBcIvlQ?a zjx1ve;q^)*<)kc|8<#UROZ>|GB>J6HWL46o3uQ*83;gT!WuSy^@%4ifo*(CI%S@GUA{TWU8}jyAl=2Pp%b6rIATa^%@?DhLxO1V?MR z8v84RwPIGnpBQ{2*=hV|npH0m38y zMo5e%(^p`ML>a~f|!fcwtP`m(KRRsFm{rQ3{ zNa$tzYjEQt+?6d8^F|fsdPG5l&_~L&9t*2R@j27%jdDYut>Gyx>k|`3dnJta4An>? z%E>?veAI=*VX06xH2V93v{IhDh_E(S%I6JPBU{%)9<|% z<#Qf)tb=$wMOk9zTt9$C9DYV7hQw~h5<4I!go7Kmn%zhT#DHjREch;?9 z*$0i~)Pi5hqW!{K05?F$zi6cFb0aXY(db+?bBYU83neYsYdlQDo;40l-A$g@V@A1* zGez!k3P96^QeX|F)1`H;1iol<-SWlvMPZL*qe!MK4b#3+xQ0 z=7;hzCNubm_*TNeEuP$x;W<`=85as6UF}wjz6V3$L4%@cb@u3ZcKR1~D2xm`i6Gw9 zQqsQ7i{s<%9`PXzGGtF!-I?3tLx|{jvCkL5J4|mM$IAszsN}or1Xk<``KM72Ax?d(0<=(aZH`)GnK#NCGgleH{!PjGf0TL467{b~JYM?2JC+RF6-D31`dl>;JvW%6FJTJlHQci_du3%8; zXjJ0;VyLlk-zJ$_rw7~=bA=s&j&wksIWThAzZ&RT!@$e04gJOzZ@_uutTFbx2c-ic zJvX_P#AuL^SjeagGf)ThM48u2m-u>JtAPyW85xVhFVa?Hj#S87VvKQ_hiT;fALyNN zfv4j=;I4TwBxt4vfYZlF1UPn(;4}1vHCp$f>7S`($bg6D=@C6yQ7*o@Gsq73$M<47 zOS~2J3r6>sk)0Sia+>prkzbq?K!`8)A!14r(G39x5pNi3#>X!ebTphtI<@O#ElCbC zd|GtCr}Xa^YE_?KuZ}5*g+!i3A>U>y?a*DJIj}3BdWZGFLUD@*z95*zdQ~nCGBN)o zj(?`~fzAy7eE-@656*B#)=Ze69`ImAYshOWf3#c zpj@y}ctM)TQ~~Mx49jU06GnUs2Jm#-z3fY0=JD!OZ?s`|N}heQRl5JC8x#YM3PfN_ zZS`$hy8NY-O0xxl4n&rslV&3jeSA41O{}qP2R&WIU)G4+T$V5N!!?c^Z+js|xA)!h zPe!zfWO7)gG?vmyRo%SuDUk&!Sg-*XczLm+%fF9@GpVM{XL4`rZIKDpmbCTUXhBZW z`*8DHLWDVYtyLerdgcdV*NzRWDCo!YQ9wY+T3fu}iG)3P#>SNB>P+a)&+ESY9iPJ| z9s||53hL3H2-iq0NIvTIykVvVaiGzw1w&2i{V8@E2(96yR%(l zyXqG9^WkM|G%X%TjOi8MZEv2g?A3htsub9_CBTa< z`Bi%2tOX_>q0^z{=H}?RD$`ElEGv606%4O5xOXnw{@ie~HN?^v< z1y##nZJ8EU+4mAX3AN?ij|&y{D3fzPO{fLApDpNzQzzR>h7F?aWw&MTNo`~o5AZOY zh@OYl1R>NR<*h(a`T_%X;*?#c*aZ=D3#O0~lTl{1OJTKvB@>L3%|G>3Btb`nr4jY0#YgZ3tD?H2EJe5$VPP`z}5 zt3ci;DXSyn2Hcjwn8OV{`9O7?`EHPZ3hO0yH~?wK9Foenxa)zI>7-~eYYV1>e4Cr| z>19_!mLP%3umO!r0cYv9f`@S`LSBEQN@snOVMu@JXQ1>62zQy19+wiY-q0HA^JFU> z@(&39-c&Vwz|0eliM-Qxv}^hT{s?d2t^<*7#^4hXERC`>QmuL$_X4+HX#tTjL{w0( zSy_#!MO$JIx_tp1n~~vEAUEEGT443c8mM79PrTA8ZSD>szd$pE zjTxtHuiWM#_`di79UUw|;@Z|bBXKN`8qQPT2%YunIzN58Tj%yBOZrjtOA4wT+kA&4 z1R;B{*ZF!5v>~4-UFlTr#GxrQ*p<%zy?0>vB~I!jK)Pbqst(4&)o_}ZgeTK|PoT=U zG?a+;?6jUuY)r|YR$hlZkZ1ci!LX0r`)I&QT4$>w!bF^U)~i)$ZRkkVmUZ=fG^z4{ zmDTzN@PMD8@x&ZLC>U1L{P+V*l$fP!6Kqvhu^yRC-_u9IlcV2UXpP!K#?MB%V-9RG zychwOx(Ihll9w)@&XjkaE$Z{QOJ)?qL_cj%`1g4wza7hR2abP}9 zuVf8BMZu@I3tU$ufRUtf7^7 zbaWK^)u~L`%v~&Ax=;X*QGNMU173cTvp^EfL$BjtZn0)mpnqv;X9H8L7-T{$?jtUW z?9P|WVc}`iFgk`JZo?MbXI}~(J)Wx55Iwxmc{r!G7{?6qsH-{Z8k+o8@YyXjgwXXO z1LjVO1Ac?%v;eJ#LOLR7_B9GnEF^yrKYeYB14hK`s^C0c&9f>db8Jp~4f`0E>F#>=z&~1EEONIGsVhZ2Fz3Y%aEA z=5Teb7Z6=RejexB=G_S0N2~+@^}0AfcM;(!k1Xz&9Mlj?9~t^&XTN4P$=rTFmF-$m zMqMT})dkx9%m`%PGh&Z%yvs$cGA-TZeTQ`CtowhDPuKMlz8FJDyDUgGZseKDoTk?s zz92oA&bQ1Cbu}{D#NuF2V#CHhodAgLQdC$5ANz)rji^&Jbf@)+ZZx4MKJwZyffTqM z<{{)#y$$q;<@N8*4mq|$pu^_U4}b%SB!E-W?20swVt_44OYHq!uu>!R$vKBdinbki z6Hns;bOQ(4YWU!$kv(0f`}o{g8kV&sOEdyoMm4|-l$OFTx8dVjIcYhzkc#$$Q;h*b ziy801f{0asPIzUVE-?lJm}|=~`D#8`+5nK$YK}0?RP%|dvyzA=s!@ocjtVpE*llp} z0T8KGZQwDG&=WkFinPH8oDdhev9bCoIrXSUn*!F@`Y0=CN7MTk4`KUsn957$e)6iM z1JDTUQG-2J&eP&Dy(}s-_!yx^dHTIU(SAa$R_WNR=4M*eP=dQOe-Iz+n1G%HJ~QvT zw5Aj!PpwK9oA)HTC-Ptyc}ZC70j7|K!IU+wcA6l%@UM9W&!jpG1C`AXItg8_Oh5xx zdZX0T9Le+vlB+FsEq;`h)3Eba$*t(JU&^>^4RyyeQEeHCC{sxdj2TF$J9~~?ev$&airq~*kf^EDy$e1K2{Ivllz48fr;GZ9 zoO?(hbeUh60$&SJM%A^W=m~&I$kMGG&1b~0h^VoR_8!GlWpRW<9~3Hv9jup`NrA)$ zG-a1!YC(jlz{VOQP&Gfmn%HalnF)<3Rxy|Xno%0Hw0nt|lnaOvL^q<3qo>Ht;6n&h znVH5J<~gcKC<~jox@Ssue%?iPr`qjsj>+ zv|=#Sb19K);B|#UrrRJM1CT9BzqT=*a z=XPNR6e((4pwroer8NaWH;qDIt!fxWi_IbO5-F*ToKF zm+U+m?i4Yth7*$!_3HuRl#5e2CVHk5XQuI4hMZIaDMCl3%Ws#;UjWvIAq8&cOyAfm z&orS3!_y{|yDhZl_6 zTY}W2AJgDSK4Qn$P(neRZ1!rzSPVZ*W z+NxuIKG>=-zdYEf0IL6tyB3GuCk2S!Jzz7GpMpGw|E-aC*AXpHCKX*gn zlHZzfnWPw3P2fzGbA+o*Jbf6;H{x9Su-E-J`7tZ!`OZ!ES~#L&1iM3xT5jxR$RPToLq#Lunwrsddzlo*z#$2q3NTAJ%nX zSgCkk!0w0o8<8Ka@_z;Z_(gE=(y+srWttyo8KV~En^d3{+sppe@z->0_#!uM_bz0^RcEZ)se@re7 zmiR~dpf9r{5~3Hx9v@7BWHUfK5;d<1)Q?Rbv9BTdeC&*b_|Sq=5TS#~2KBf#JVBT+ zhig!5BRw#l!AH8$sfT(lvqG=HMtbgPAVsqa+<7eWR=WekoeYercgh{TKFOfUMF%OQ zXm3yo(B8vzSbL6wG$Jl6MvNnO6WxWk1ZIy=fZIHZ%mut1(2-@sO zodLM=Vj&JBldIA=i?0OA&mQ1`OdS$FwgFL1M*{Do6wcRr#c6~;dj{_433wV3ZcZxT>9v-Ca7?WEG)@eLAX+c3C>P_$p$vDMzRGtBGJnAG2 zuMiJEG(=~6!Zt`$P5aCvW&kx@_tgZ{jWJ133oBk8l;kz?)yTiu1P|r)8UTHd-4SfT z+js@a{DRc7z;tx~tI^i!Nv3~>^Gidr=it>$JJ->#t0ups^@BSE10fer1uij3-Pa@- z@FX<$8w?-(JwE4S0CLUwmZ;URar^y`WzPa(U5CTJJ1DUb5OyCS{5yf-!wLWTpZLJx z-|`b42>(8xL^7BpT3rj}o7asW&!Awro)( zEe;CkB(y27k?s?fBAYB)w;^5OV8j(M%rmYIBbHd-kQ4n22-0>$_9nfXLt-)-8NYcZ zwpDFOo$v+En zZR21z^_N6PC~Oi381iiiVGsv?Cqfv3^0EX8iOYR+LW1I?Y)0HBN(sJ%KC}Y{dfz_k zjb`W&KcnQMfR7SY=JTN!45j2oqYA{&B+We!LvAWqI}{6DXZ5M&`BAUB???&5^xAk2 zM7+BtBtJuF=IG_Lg}s6hR?L(>tlK1%`dBrD(>IbP92tyi2;e(-S^gp7#95g$IfvDX zQkr=znP<`O)+U~l@ya?g6$Zq|2ZC=PP9L*~e3?!#78m@DoZ!*Rz)is+p|^-a67mqn zv^{Ee0ML%JU;X!0QL1r>C4^E6e5F@lV_VIwJbbDx(?mLK3ghwD*u1cgI@`BNhNI1u zC1?$v2FXphQTA*V>Pm@L+RJlf6*~ai1*B8hirdB_%1pF)^L$NU#rjPiTxQV?rf!nT zOVRG$(Y5lBBT=D)P*Vc(CRUX;LmdcS{=uhV`g~!ImU_TF*KVk30Rc3~=M_dCIlJzJ zpx8I;0k<*h)=rjfs;0JNAVJ(ThcPHnLAUleoL92kqKpdzAx)R1MRmCL zBJb9oJ`uvb__piOC>(d`lU1@K$GAIZf$S=J>M4O}d$z`y&ge2yp>+QA8g_tQJfy5O zgB<~s|BR;(5?9_}BMESBsBlVom#}D6V#%albY$65yVEX=56J6ol=TrcOodZkH+n!f zfvi5$^)XX#+j6|*!iWKfexQjqQasMr+t~YgK+P2NyN|!XJQ~yXd@dkt=6%I&O)(RH zy^a6SBCFyD!aU5NZ~u?YEDWot$NDn*^IJ5N=mAC3Sax=pJ;BEy8BFWd)~U}_H#A?b z9Da5VX|5J4%vsg)O|y|NioEQkggw-?5cT8A1?W znrbq%2>AqXl;O}g!J*fP5II&pA65gnxK;#& z1TX->U~@Cq1O)g=A6H+Sf@2o#k{NZVjK?czL;%H&;7nD@1`FVVY)6*tBov;u0sX9a zFbO>zWsbDyd7dZDn2e8~Ydwny8zE_x;NdH*1+wgsz)@E&GjX8#J1iRL2kiMU!Rpbu($b%v#QPz8=cV?W*jgDa~ltn%~Q ziw9MJWBatjZjPxRgD>fAn)v%>EUK%ouG&0R+md60b+K^gZD?(kc^R38GgB zR0=qx>|YcNm{ep_RqKGi6{K>M`Y5PCuz|Cd-MrNx9H)3t^uU1%{AfZc@taScTSw0S zZ2*8}s^q}v>GO#vkI8A61+t76-W;cJP!*0P{kUO0GRJXcMGs6UKbN%&#ZP$6!Yiqe z1p*14Kvm)oax&buZ$>E9KPrT@3vTv#0 zu@O1#QYl{grhalm%G#v>4iiOB{UCqH@F5JYG0FGH(aS4l`~`hz2E;>=Nz)}oh#?c? zz$>X@?sOC{!WP3meHj=asU2attNx_C^bu1CJh0fr?dQqS5F#4-#zmNUBSi>lAm~|B zvGbvsM8XXJeL8h;vOj*MMtX}$;tqFM@JZSh|K*RYIduh4Nj30NL;v9aKnN;R;y&H{ ze=@&+&L915^uDzO&NDfvZEKB=i2G#5HfhlnMZ|LMK{}YKQ1H`wF}a7&+?)=z%DRIy zUvL&A^~|dKLif0jPitnime7na(<3kcds%HNDBbs0MXdAMD90-|@Cy~tA}Q?Q7Us?s zO^a&AN~%;YquyFMT0crIviDx*Be42|cbA;ePXOgv&R4v6+e{m|rF}219@zjQ{;AgbZrvL#M@w(SrX^ z=hV-X7(ArqDwF^wX@4*tUm;*)wi43-k=!8@cwYJO)CDAgNWDQrf}P+A8&s%#=?M0C z?)QJvp3Zf;xO~@jSaP1_@VvzB?A6@S%)d;5J+K#aE^Jbf8MD3`jKmHl0*GR{E6AA? zlCnd8fSTv`hGnoLdscO)_FW-isk7_UyJRVPi)WQy?qBHSb~UBF!}D&WYgWic0^ z_}lh`CAAWxPr~*wBd{b@ZAmee8c)kMIty1D1f+dC+tj9Oo2>b|tQgrV|uy@II| zo94z*AQZ92&MlFsHQdlvhq!)zhLz1LX+I*qwD28i3P=2@HoU8k8g`dpP0Z@r0ya#` z?S>GEnXv1vlEiKkiQ@%ZJnue>rcQvLi zMoU!S1R`fb07uW)f}>_=#sxpQm2g_WBBw*Zi=MB;a|aPHJTDVnWEzdqS;gwyUS%03 z*aOfHikz0#R`dn2!>wNUDly?ne{XLu$aQaz_doorOhwa5+$;O@^h3$P90l<*#iX|N za>HVOaXqv6F^)nh=vci)ERnOji8afw?r#h>+b_SzQ^K=wkUY9`=ql!%Dw4Y#$eedBe_ zc#Nw?Z!^Ukl4C7jCMt(vNzKy@xUs+hkwRVH4u2YNxt23H%0v4N!bS{Xn83YJp6`@_ z8`$XidjFv7#V)+cq!#=_>|Kd??BuvfhpJ~XP`O@?uB)t5vZ$*Lg-uiuSE~~$q#(H!06h`=9-zhF5f^Q#8 zL_~IuM%Vc6!#EEO?J?;ScIJ)wOHGl~jR{P~7AOF*0tLwj{mZ`<1Y)2QOr?i8``{YHH6H4_r2+0&zKp*dtlx!3;jk?g27|x z1rpFU%c+bdbes^qMV39y(Y5{-3OhTZ3XO+0Hq>fK;34x5c&zp()gMp&h=$2L1Z zU#^NUM53iSSm$7`CKPjHJPgjVr4rR)pUHFu;~*e^pf2UAD0B(5D0T!D0D*|(uTVX7 zxX%zgIq>^Rqp)*#zII2*Cfeos(9-}k?ZbFj62^Cy@k!1p4IZ+3y+npyWMJ>9nDZ|Z z0M-k&*TH4DRE4|0E!Q6e-0Q`F#|)|ji(-E2)mEh^)E5(rumh$b7M{R-iIG?>$35dM zF)!~iKFs~^awyWvbKJaI45)|gEK{xG{PZEg_G`%lv8e9(X;+%P8C~kV-c%%4zT~Rb zQo#<_!PT*CN`tce6tiFBik02yLTPgO?tEd^i~0Qlj4b;Ky5Bv&1gT>CEDf>CNTFuHUx3?WFFHRfV; z{mCpY@CAeN4d!A9?dsb?pqwkwg$_G=&cgs(7Pe#@^;&NFczR6cr5|BDM(D9V%e}3| z=Jw^Lf!<2I`VFbfD%r_uj|>-9Z*@%PWUIH|DPh=C%53{@JEoU|f>AP?;p1evRhp?> z6Ez1F2dYD(NZ54pMrtQs8^muE(lHxHw%31Tjw2_~G{juVFA~;pdt(z3dGENnhQPWg zL}>xw8Nb*~*hoDUMP^X!n#7Ko2_2o{_A>xqpc4@#+lDR_O6Hh9dW0Th zE&A57wmO>yW_{eiiHK$aTpyL`^PIs%|Acr{8&z=Rv%=O<_0tB8bRBJoYT{em7}fdT zRv073;l|y#`INOUJ8A{PsD-~10q3Gt_D#4G{^?+0+({EJF95~IuWtkqMIXy@EMrdK zDV-l{FF+jDa9TkMfxi=sJcnZaFEh(U)^G-nGY}s*cr?XhDse$ufzr5-^9n=~Cg;qI z4Pl~qvS2Q$;^j_3$@Bz9JhH8!D_85SN+cul6*JJ~r6hAK-ig}46Bj!6iWa*&8dFz_w zmoEtl$Bnd47A81!#zngnp3bu>W|}L6V5z|Jt^pNkt+u>+(%^|;FURZ4T*!MxAQMw_ zX8EkS=uct~o4mGu)PiyCPFEQz4BKOjrnnXwqb+R=81x0m~$pIwds`BLNJS{aDRgxl>{!&$_ zexve`!!YqhN9r^tW8g)yV^4Uvh*89+b{;_H^ggP~jOP+tatEW$@TgU^h{xl!wAmaF zgL7ILD@jB3_M0gfV@R?yKJ9=CBO^vOa|&jP!?@gu$rL;k=Oj}Tg>Z_;vVbI5r?kI) zt!uyEMx0YRn0KrQe2n z%Bpy_BQ?p0MZ~bKAfps6k^!eX+S|P=8PYapEaZzosJs;QbB}EE;`i5woEGz(hu&6XP zF%GO)Nv4S18D~y*&Y+~n$Lagvl0rS*I0hAV6C&yJtj!r5pu9crUS(g36p4vp1dqdu z_?&3^LlG)@Gm@}ZFfp%d%O8cl8f$}H;aJT6`0E`$GU5Q9gV%c9iM4PdN^=Vx`jcAt zO$@R81!&Q#L7wsiT!2N9!r2X_k_57%<1$JWtP)9PYVfv^tjUSW=D|%>63J|rnv|sE z>rriq67hsO%01Qq@BomvITg35pXLv-d3{n#IhjtDnv#E!d zLa@)=XVMd+a~k`l^v9e5FU8jXO=!8uNjpNdD*yoZweT7T#4 zWAv|S!wygBP$W7;XT77^(!6A?LsMGs+qX~LS^FiNeDAi*>%Td-2F+-VFVJ0pD?X!^ zGx0^tNt7wOh7;uSp^_*OyE-u&IL0Y5ac61|O5`dvV5e?m2~ntuf;k?e)pd&$xz7-5 z-m&&GM*m&&uT;&ft?+qjQN*Yj>|i8ae2o{WWswXR`FB=9UX)$ujRhFpXlRq6e=vezK#)x9mzwcQxC~|R}q=h`MC`4 zZ4%y?4Nx9i5>A%=FO*E-S*j;8_FA%~{z@-*B@4|ZQ2tlpl`1Rwv_`y2Q&dv^A3kI0 zUk0D0mekQKO`A?s{pG`t6{rTQW?jL|-xGT7ZIA2PeNRQ`)s|mzIyjx`o_;I88cTGx z^dGSIW(~d!)#9&weZbdlBfMers~jQh?J?sDRA87TMXU=e3vm>I66F$cF_?@KsGqF$ zUdU>d?>&U?<7c6)Lhgd9r3WyjeBa-xaJhUHs0^SWMgh3uud&~r>4zupMgt#L$yb*i zWKUA*RwhfMQ5g*J0h2dLG->&cQy|$Di_Kt?FC4-3m!gFu_|9E4RPK4XzU6CjrT2W^ z-^@(mIF4_b#x!LfzXTS#Y`WuT7&8;6Y6k-aHXj~G=ct%-rYB#_^Ym}Yuv`OH%655~ z<%2DsYF80+RRy=d0D5&Idj;^Z$nYc42KG!MX z$1o}a^39#wLOk5qB0R$z`&tQwU0YrfE6-dxocS*$#uCH6@G1z-&-SX%D-H2IVcYMs3W4&mc4gRpHjdmfXHto|v$4OkvlZWn>61q6 zjqr*a2Woq&K`)q?)*ct3GJ);4ty*f-h1kzbtRGs-CYZ;$6Y{a0bieML4f+xzD_A4m zAy!Nm<1EdRTM&hMGZ71#X#E9zzOtz^4{uVniG3sczi{kFw9K_wZQ`2%B6T!D`b$aX zQedT(EEMQaDK3TKlGaRq1s}4-W)y`BMnzoRke(>CL}EHvX{|Ia2tV1*r#hloQ|a*$ zjKhr@j~t$fZ$Ty&3mh-M4xYICgeGldGLqv2o?38#`kgYg%}>Bn_8JNiJaotzkMKl@ z`-doo6gddT3qnC|9q zsO1staSjc;i+CWG7Cvh$Vwo&rL#jmk$v?7@HxCvPm}8tY{sJ*qsEy%-~(Z&n(MV#|^Ec9b?RbCqO3)XYjNei(~97 z*_W)s&`z7N0L5j;I`lpTg1b440#gZGGr*3rKX5Mp*7K2qh0^$#e;NG!{m*ybQ3F_P z<|qk!8iO8F+GWqNazlHT3|QiHxy<32StB#b0ozy17dwivtU{f->3ta;+s~aXjJC&v z^Qy|^6-n9MYjX~0A#QY+oB;xDKZy|^qPRLYUPDDrs)hkbPaMsB{ z*8DTaHqTtBW@bvrh$=dgGJfX5EUadh&IY-59%eFXlF?f^c1yr$6{^e_>Q88ZJTUf` zZ0?wWX)-FajAEu&UCNb98BVg2{w&#DiJ;BhazC$Qywb>+WmcEdndXbRP`!QRd^VH< znMD)~z8{;Oq?xX?s2Ms{hFp`KIx7;Y`%hq-uDExJNDoYp8+)MzGSjM=^AxgTk^M_; z%|GvG^Z87tAtl0~!^XTlq>jBh`WwV)+H|ko1lq?4(+&SZ8}8O%+WRA|tiEcSV3VFL zu^fJJWa=w=i=(!iGSoV1au!GBV74}ZM(>G{Ci`^RGuBQWOJp%)K|p|J*BvByKGA_^ zIuYj|#U}`_>tjW3-cID+AjIhZ*mkj~~85kfNvHCP86%W~?biahTTH6p;mGcvXnN&S28~JRJ{OVKQT?Ltl_& zrjgE+x*6?AjtU}$<5ov1;zoy4q-4G;G;zJdCMBTS2UnO%pxqs?FQ}EbbQP)p8rS@_ zz8S}apUD7^Lvnko@|OmuC^RE0Zm1;+hCkXI*)g_9gA|GX<-DH={wU7F^Qj$US}@C8d90eFAgIWK5#%HjgJk^8bvk%k z)p=L5|Rvr0`4S3cTpD7+L(t_BJ z#C}P6a?Q7OT_U$gA(>LNq^Ezj6E7JnGVvr9y1`Y7=*8pYQ)>!3+5B>{>_;O3QtL+BEk5#g?u8gaTzM0jUXyG{{E*D38LqGWGqsb=FuUk&2$tya3- zcZ|y+PWU=rhWAXsa8(;)p#?{fiB-czqOHR)4J8{J?j$+XF>ZwI#(W|>5#HD_I;Xu+ zqI)_;38y;8Qx}voxKFgYI542j$5(eeIxI{@&Ld+aBj`*~vxj>1>A} z27g|Jl1$f7DM^y>Ve2z~>ryD1mu$`o1s4$-@mDVnSx>7FB24TCu}=tnm&8k&bwwlg zH1Kir*RFe)PCHL3j5s>k8RyDxOA=bmjK1AASL|Dvtmx?s^pm2QiZ4-Ru21K7G)|*D z-kg$6q{yB!iWpnFig-duUa}x)lhSGMR7fXKo<&S)KLx^NG4AI{!jJ&HaGFec%s-EZ2}Mi~i;Dx9KmwB1=} zWuDy{v!%LQoSm!9DrHCU9WaeLPHR@zZ7jB_%L$?;T`9N*C zgv%=J$5&vf7*7~Z+@2T!iJpJ>{X3Fl;)NCv1rwF1Gwu#s2?6>{dG!1x*^>~=$uvPV zO8)qMLnH><3g$NUn2)nds@h-3^|&YgAxq0=B+iUC^x9$!rSfROCBpkNs089*iY1Z4 zP~MF1*}dWiWQ_+zR7EM2Ldwz~)|JAqac%id#-ecZ_A#DDyTdG1cDc&zxnZ)lSXZUW z%hv|ChLwdhVNbSj~bzfv-QkE3z=+@nz%Ds`TE*IigLJw85$Wk~r?SZ7Jrt3011DaJU}TR{4*Al%?e%f#S(*zdZSA|io4yC9Ual{F z)ap4XE`XnFW8Y)V;LxzegD6tb{TF+K8REOOAmV;x&Gmq#e4zi+`#%wn<4m6$FPAO2 zRw>-ql(pcr6n=SdN-8Vmublfai#At;Z^(-@7m8IhQ0yZeIJc}yDI^u_&_>09RLb}s zWn3zyB+~A5JhGk-aeC$L9F*~Ki1Q!~^mu(rVQ42KB0M6tsDS@^?I-)Sixj1|b@<1k z-g8e^7J?$K>lj)?A;wnvJeP@6WWTOr4~<=dlHAgHlbbwjWhqMHP|bFxjw6^vTqfh1 zmMd1$4pb{H1TIKXFzuJeo7ow6R;?u9(G|(O1b?mLVZ5UU9}l$4&1$iG01Y!%FyNBj z>~S~8(Aad!5MfR+(eiylDOqgj+E!04aY$Tg9S_iavs^5i(Kd5#kO@=C-cYF!_h$2y z^HMPw&gP9<;kX1VPTEGH^hh83ga)V=i4I2Q%NH-7k#JO-k-|_d^;pzHlfrVQ`Ci8> zw9;lS`&)An>GG`IhGIQQWhSBI0ZtXqupn1iQEq0q<#1ryD)QPUi#aWO5F^XE1n1pP zj;ng~N{NUGx#`ua#x8f{lN0Y0ePmX>P=|RV%IM&%Wcrs(Z#nD~+s6wy|X!<>UAz zi^aG7#}bNkcL_X<@Zr$N8t6L?h0Eh5Wl*ePMHxIIYD2RooupK8UQ_7|G)l=@WXOkE zEbcmfJ&Ib=I0txe6*MDa6Sf*zw&lU0*4)aHRv``Wt`ql1q2?JO@8Osxu5PJ*g7&f3 z&bYO;GZ)&VoRfU2wMKYG)JnORqTm9m=iE3_Mk$ZC*k!pMx&x>Ig=-8wl*_E6d#d>` zFL~wxdq=_Bxx;*QXZ8*5ENHvdVe8H!wijHfRo2WqWt?knT9THebRs-kVUNieeu{$T`~i;$wJ5aa>gWJ2 zJdjnqz4S;FK%|89bmpi*iPW5aD$uI1uicasr0rPM4K$o&TfKEzE>BiQmTsnIHNh`*Smgk~oYSdf~7dmU& zlH9U2s69hEKM${ihjk@mh8`pfo2PzqvRnhlI3~> z_+j07c>xc9dJWnJhYE9%fSL48TiT8d;-In?4D`-OegqDyG- z-%YpgM$R+WN#rSK29ML&)sx^UWX-RXE)lakhGfp6mMQnxY>Bux?kXFCR5X9qzZ4*1 zMAs`4;kvAm>PNboLK7)$3sH*tq&K#Q$$~ehG8yniTN&C+Gt$fp9MBvUxi1$^BE^jEM1`(1G%SKAb@uqSI-pY(T=`R zd=VvIf)W@8Jk%bn4#PZ(qI&jtAD33R)uI*;_~PbP6}JfM48RV*PM5jVBS zoXv`8UeoSr%mDXas+(Uy=6AF3Uymy;1Vfqv;G9e1|62M513^7G9`Q_`!Wiz^ki|7DLREhARYns2V#A$nTo;Ci%$ejb=2_gB?ocLD>tOOOjDi-{QeG4lidnkYrsU}=Bp?<8lN?18 z_r-Vss`~4FAUvsk6>O5%@rs&^+(1^EQ4oqe5p`>d(86py8$ns{PHQFA_#(ixA>)T$gY0*D+iEemHeXWDEflY393OQ{7A zY(8plR2s}!cj18VRiOd0S(0#KPM7nNeY$*BE4AahNmX3`&uldq=U1&+VSSrMi4tQP z7D&{_?EYef^!YOX_ok#)qO5 zLvA9L|C3dyjpQVruauG<)!0Lli7ibrBf_6-FQKM%+1wo3)+_2Lu9~rRW&-|&*;R3R z#W`vt{>NDnbd=100K5qVW>dO)<1v7@F$Dj1=cEr{NeeP`wVnS8)I&Db}TxPCa#F zS}F+LNn-!&+zn%qpJF8Sl1=F8>T|-l1XNW!am7)LLrW6^rwR z?Fz-5t7Gjhmlih$F>$#jUk5}qq{ioQC-3SImEb$-K~H&>1~5g^SZQVu&0auu2L%hNqNN0W90n})SL?(NfVoClt^uvuO}T9{{wQ721r^-LQUzrklx8YRU0$buj7gSC=M@*o)u zC7_?SJ9fwY-A&aW*pMyCya*1FjNks~(qa8=mNTNJi_4-NZ;5o4o7FS@n|u2Dm~pa+ z9^E3eu|?csw^LwQ1#IE_Vx`ChYxo$hG*d`{uEW2=Oj2g+@8!2>=-8!fw)%rY2W}ZQ zcGS=V+z%$;V1lAZiyLa}M`)d7!vO`<$#U4IzZ|tZL^lNid)KdCOBgND>$xoJuWY5ugIo#^wB#0RMkJQ9b zN@7xvyn{jTRJ+%AfU!Q>7>?24QkrhcTd%_uM;_%17FMKi}+V#H~X>;mGnxhj@$%`)<_B@Y=eYu+Ubu3M`Vkwlgf ziu$U@Df1!1F122!EVA%w%L?yWK4a0mEQu702FsHyIuFbKwuqSnn_a)QY=l|!D^m*| zvpfRCBj2*_nh-2`n9rl`=qsrz|*XH2M=yB@6k)}J!6>^iCJ{1S7M|)PezRB;vYZFQM5PB}vVoo&?u^ENjqYyczs9QL zgv^65j};TqOEUep5}@MAtxPoqA0<>W#keTKCdFhiML5ZThPfJl`x$oNkh1zY&z+`V zv#9p(_$<4WZ{Wth$@vM7=nE9^)pesRfwTXW)NdzJx$$H~nm)HiZeLuwIm ze2$hjIMJ}VL%bwcMsxd)1?PJEBX!gg1h-dO=g6EAweKQM2kXjniib_cc4X`SPc{b( zofz`wi*_25??{TYNQ~`5IXO%thFY&>)4fmwK!A)fGEK-}us%P)S_JkL%&59)@#pXF zj)AM0Wf7})0vVAfxJBd*&&b4Tl(-d)BcZ`j=oZqokq2@rCDRe0^d}5SbDA2)A5syw z0w;%Tr`ST78Oln86$Qyd{9tY?G=FwEaL!uah{BH4%XXPm^VGcNW``z@pD#OL)r_G| zHcEPA#vN*+gIeyM_bTN~YOt9rv8p(Bpm@S*D&otzcmWoTttO&4M}%Z~`$nN?47ANx zOYaWpNxi99%sw};(p&kDwL;d^0L}~a{g@$;7KZsyHBvoB4tEuWFD5E)#iv7*^ST!c z%uvw1sKN2L7`Pz|O}mLRb0rH|^(x}tIXA7crKW{(Vh)yGF;33ev?#=5YWSGFY|8A! zfwTr6!k--UkD1vyH0(H671Ww9*)>evQ%ziflDTGhqOTGK(q?H_XLG(e(2@Nz+ZAiH zEAeeQBzphEE2;H`R-S0z0&&9}s2(;=YAEW+VB&GWruoV7o0TpluO_Y?StVqW!@336 zusM7&C&A>w(J@5WB{)9x5SH?ebUp@01dX|cy+ZPkge_fN_PmRQSyCq(vsX|YYwMna zbak^=iXG4r7E}~+m)1Zve)e;8NoC^M+cC(LQRvg?vXcTx3a z?{nr zq>+i%c1K?q*?B>=i{*%WO^!mb=5OhVM1d?!N1JH^GiAT4g(ki$kB>xPU-B6uzUAS$ zDxLVAYXdBhC{K{qLh|NEn*$5cI)v}|U?u~OhZBWh1u8y}c^YfG?`<-RDatS39Aj;` zXR=@eGWkw1lDvhPN&!6Y)=Dk-IOz)z;ZmoVahWrEM0JEcY9F_cOn#TugCS_yRz>*A z-99^m4a1A>p+OvWeH8aj8J2~`7L8gSpRn?1NcV&cS*mh+gh^JTBD`atvrgYW6p=4& z^q=3b@~JGD4aNZHZ=aUL!ZcDD%E6PH5`)vR-ZfhjQ%0+_TyhJ|Rnzlnvb>%&PBn%~ z#3eBf+bm|6m1HR0LIfy=l!-}HNNd!Wx8PgPi@0F*WGwj3A*l2y!Qd2 zTsWaBQfK}rSkc)|1NA%QP4=8{d#y3y$^lxp@qj>u=CC6sK3SzXYOCi1i=*LT_@8uqzA&H~H#zz;re6`OIbhscGE{+p% zcO}Obo>2n1Kh3)QU|J!M%cj?>(z*1!TvUf9oztXzUKZoVow;Jzkh}f;m9ZWSk`$se( z+@^~x+d-50qgLIVePCzYqIK@c4$yIxiCx{z*_=DPP*Kg{R#>ZvowN<(tUNiV13z#V z*69&z4yDiN%wu-Hhi9fwZVV%Q0A1;@q}E`iC6(K92XB>5<3KBw^a*b=Riq}?CdINy z29!GLnRr|hRnhHWj{W?k28sUe$~vv*HP{j}aXg_sYTC7_h2Pk&QAhyB^`u2P36wf) zL&>-Ld&kVsG)b09Oh;wpP2{di4ez9Gog}Q&;W4JS^5eqg~thqC2zQ z2|Q?ay&qoRh?W~hZHq~!?LZ>#)NH*%q%~F;z_f&&@unY4!J9hI`tkPp;o@w`yUv~wpKK~?K{w}btbq~NuhR+oYF1+5S8 zxG6ja)oJtn^`#woULbE*;7Z<6e4B!A&3la^3eVUE@NR@A`hq?`Wx+HY%VtW0f9B_e}?5xNg@L zF4v{%F;uPOsgS6m#5`adjo}?19b39d>#r2-*Rug#X^n`_43XdjSX4Z*7296M$2C=^ zdtV1L7RCq0*lA#Vk6$KTL;V_RbJCb8Y#J}&n?6+g@ZZmN=#oZZP^N4ZUYt1>j(t->yG7IDiy(S8gkOKjt`1huP|m|#kkajufGmQ)@gS< zEzo=`S2UKgA9+=2e0(4uyVa?hBnZDlX4eq*-}EW=Y0*Xbb@r2Fg>36VS+I)ptSouw4;^3);s3fOw{1ot+r%Ygx{=|V`J_#3?_%>S zv;-gMOa^Ss4OJ-|bx==Ma*s=M3o>yXYS%jI)l4Q&x8}NJ#to>6Gju{SHNe^t^Hgdg z^9)&&MM`(6^PMCgGL|hvs9_2_^oZ!iGoa07`?jxnSz0ojGEou%(WuS0c|PdmWQq%P z!?U2~{^TmU^9NvJJ|UGn9)h8W6Xr9AupvOnKD}q$=q35krr1(K-uUOxWGX8nhp8`H zI&8H)TrX8wREatyYsv_wWid#$Yo;7PTRghfa7dD z=`X9;7pI@Nx@`>A_&BR<;oL#7h+-Z)&r~joZ_HD3E{TW0ha@mWm`bD`h?C4xde8Pa zl3tKcG^VZmVb2@qJR*GtE#GdFi@cc3BxVDVIL&Tq!|6^IEn<=XdpS@W6??NBPT%QO zEr15F|6yA91@ziMrU`I1usR<87h#Pa6BH=MEZPsuWKQ8Gk{ zr@TN?a;+O_&+h@`5{>ju4a>n&PU6lcfcF0SDO>`>DZ-t*8SA7dg@>71N!7*1-{S;} z8K>}?Ok$Q`tAd?wHO6v_2|l`F%9OY8~SRXRX}62zWBWaO4@MN zss2(uGZ#i0iUr(;WsB1jI#kdkyA`0?sQ7?hsgC5^)*xp!pc3ot-MC3?kV*|SS(1`i z(iRm;gzAa>3m4_BFg{V+v@Uijcf`bxh!3qg7%dcv?73tN&h|ht>AhjLJ2P&;r`8t8SiEjGGg+?ooJMg+NDS9ybd&uZEsn)|CPrJJAf3wcd2zODWhDOcwIWtO*nz;?eh`l< zg&toxtePkamQ3dJirZQ_yuBn!r2jJ(6|48U20_hN#+3DfQLj(yJH|KG?sqH|ynU2v z6$?M^j9-~t(xYa>D%IT|+FuIUwzZvB*N&S+>+!4zZqk5u0i4j?+9}JA` z($ScgK7x(#=4K&L?YEGFs) z17eoySMKVPA~v*KoZd|HO7`ZLYd@YTHNO^pX#X7{TXYC&Jyc8%32ZE2A|p1X8BQke z^f|9k#A6pYrQ$4>dUP5bZp5@e;wW-88Lw<>Qv#~br(J@YuTMp~saBOJWyiq6ImI}0 zHj=-x#XSGbB~uK#*Sonnyg3~Qd&tLcM#}@J*2&|cbol$-JZ90Ef_F01nvO}Ubvq_X zQFti!GyD)0iTVV+vzQKH3N7EF6me(J8=_Rho@(fDb>z;=q@=o5#sDNo37syL{>8Dc zXZf%i(X!Tmplr4tLKC_7k1Xrl^kHzO3u4g{Fha{Y#jYfKi1DCpD$7)XPexylr!liL|#R4GB z8!M>ura*x4b|vY>zwx!>RVN&CW+$V*E!HgouSlkti(1Bg<+$U4q4ghdjv0Oo^%11niNqMP$SHhKzKHIGFP+#n=(nLNK2i1yd893 zbDjz=?37x%{}XI=>STVL$pBw4V6stgQ%WN_O2*#AozXjNkYqL~758s4iP0I$hV5mt zph7WG9W0qTaJP~;kzR?JhVKk%nbHs0mjk@j7R99KdM4#5$zl&P zzAfmXbVr(8ZN^iqi(^8wcN0&@gU-;ulGNG0m@ECO96A2W%B<;_C$G@+&w22XHVTau zY{;P-u{9%d{X^Q|TJTcaGbx4lSn<^d0!v&7%z)E08y`)vr z5oxt_SXv_;lGfsbQ2EEBlQF*6`h5K)O6o1ERD06(L-7C%g*5){811IW=Fr15ksP+% z{*>S$M+~?h8H&MV-YrtJA{q11qKRjs#w4>ts*(X!Iqv<{yD|76w?#KE7U2+|zbjfp z87pJms0B6BM{#IfDJF|Dunpp=aJ?LN@me2jl&F)7?*Si1JF5+s!XxQa`Hv}D`xx|# zCJR=ekHV!mGUB$DB}y1X?m>#fY2l)nqU682NfDcQWgNLr$;;f(mO)?s`_az0Lo!j7 zvoIM^fp&8DleLbiZ7Hi|H8kjj2EQ&=4d>>_c68ZWL$jC;)14|NHB7q&Q?Jt*jD$+e zvy9bYQ&YJBY8v*yHu3f8q&BhSm{xLqregewoyh2I((7g;_W_s6UQhlePlN(nlLvn1 z7uepGs>-`{IQu%zxtmWT%Py?oh!d&2li!>LU8m^ho9pGEuwR>NyTMz!I4qpPhd5Z> zRmuM|N!Tuqv8~4NKxZWCL>^K2Kn5o8^_1)-TE@5*$rR@n^Gu3%GB=M$g=4n7i{vxE zT2^URk?1Y)LX?oqypNmYB{}9i%}r$jD<3FS(k&izMuC_Gg)^51! zgr@xRU|*luRiD+Nrb>`a@GP^aCHX{XpPHw8uS|v0=k7E0$ zyUi0<#KyAbS`hK87D#xPpOTV-_?r7P*|x2vt+kPZqCUQ$=62*pj_uHkr@WGr{Oeol zy?D<~V@6)_$G?pmfLuKP|wW&UeTR_s8n%e_v8VgT^PDk>WT}~g|ktw=49N(QW zs#oMR>teT(g}L#!W@p(EEm^g#a~%cHN*@0X zNHmcsDSAqjxwK;^QS3vP|HSdEZfhv6V8yL@j0y_X%VD)kA1YI=eVPjbt>sddncrC; z84rI>jzxBSB+7Xgg-V@SkAu>O;x=l-cy|I&*M~BVjM8@BPyl8A&x&nUJ(zP0xdwdo46{^TvH7o%5$a$ zvHDKlEB{Go2snnGImarOub9o=PhA>yrk)2b$T9gzzhi+iGojLa&Q`E9+Nu4yfX9~Q zl$s8JJm(uaD&tTY&r+U`izL}0?epdY2j$}(P!Q-2bm5=D!W=8j2~#|`Je*H$sg|I8 z3jQ_P&7_u2x_5V$QUG>?q61nhrd;n9b(i#@F-O3KuX`wcPj=Kd3FCksu9g>0``FS} zOfp>3mrLDI>DuVWO(t%*jW=ZTumNw=ay)~XIg1H5nr&x2Rdhe>%3(H?u8qomB=zT^ z7ediEVy(*gmyt;-PFm%UHK51p4Fo>Cv~nR?Htm6MMgs-&%&*n#~5_7r`U1B zH;r>{A7kxLi2a!BInFEO0A@jN}>uzz~b3)Au!&nFX>$~AR7>l-MBqOGr81t{TH^@5&T^kBkAGH3@I&c z+n1Ns>5>z>B#r^zVGQV;yJbKUc(W`0ZHJ9qU`iaeKOE8;YX$atCjhfYxHN zSw#G%bEA1v`E3@a0C%3=*7}3hX|E>U@=a;RGsgHeORJrUQ+<5-7%kC(uO7NqW6S^A zft>~CUW&s@mUNZBrYNA~-YpAUIAHMA>zystyMf;&&BrAs?pk^RDSJr!%e|SqK@lv- z%NNEb^MRM+3!HDGHox6P_PZ#4=W&N~T)s?Bo{n68adRz<(dBFF_EV^YQuY!!b2Ti(Ch;}XD|<#c^&~7mqwi^N9Gu*Wfp$L95Olm7nkdeQ=+nWZMED-_tXO7(;wz2E zLSN0tcnO134p+G(4l~KnI!pSo&_1}OI+U^6n!Xeq$6NP4&&uLrusfp@h z@!9~EFFRkmm8;o!!|-d^cmO)*Ki|5JCZ%`8=TR_`21YKx_|$6wIL2p=_PL{c;Yb@p z{uwoSo$I4Ooaar!kQa(cz4i?+(hDOau};1}8=G?%y!|;Ahqs8_hU==kXIG9pHHd#f zlHL=)GT73F{r7Zpb}kuPye_lU={lX$Mw?2S?K&hC$ds+>k@}hK0alf`ef-t>h)Mw{ zv!yLFm1W29rizs|Q$d5-8LoSCm(2n7@?@)r%(p>t9Z;)E(m#xCAn}g)(U)wq4D0=) zovZZ@>t_9*y+YoYd|1AIn;~-&pIS-yv{jh~rD#?ZxCRsvxcG6%R6^dBU$s=%V3rCxH z<*|$yXGw6Pq8v?JBQd>Mx{8L1Z3e9|>5LMh-_UG(<*q!$n9{-4Os4RP7gVZj+wCit zcg9e+Df2`;CPNF9Bbi5$;?3Y>d@l7>zrgaKmT@rh?K=vW3K%;UIy*mUaNS)Lg)lN; zrnSP2wB~C;AwcUdMHY`ZYP&MUp^OqhXI>dl3g3ti$p`ZD6iHEgJ>xlQh}t-P<$lgH z9Goy|leldGU7|9d^SoZfT@$ju)e>9Ejr{B672hRuCxu?4ubR2JOOxQn%&CeWTrj0zk_o?sv2 zn6JN1t9?Q8s*>N&!fx}zZZfc2_>485x1_&FW?Wsc*8Fe6DAWi>Gkn_|F;{|3OPX5o z7hSl(VZSsQn-U&s`Sp~C$pHU5SGmc?H##7CFRX0|I5FJa>5g6cB$%b_{%@-dZhPWV3N;_&}%zgC`6bo$HR4y0)>{)Cpg3#?$7JCL z1@5<$I0N!uT*@Wf@#^+}%A!WpTk-pjz6z_v9;f5pX{GSpc>><62*oFSQn;`?;^n_+ zd-7ZMR%vpr*wX2yzVJmzCd0}4oAOtfOwGCe;|@AsV)8ONCiwou`OS9lr%{+ooIag7 zZ$CWl#sgf?Hi?WFMSO>D>dvl|ij_Oyx3-vs7u*wG!@!=F)JVXni2a7NG4JHgQTxlE zxOJNX^tk@&D~kbm(E|1D>0y4&cEIB#1@ZkzX1#pATYT((sT$6Z`56-n0^C!I#{W|m z`;lQOBx`2zM++nKepu@+W3{v!>m~*&o4eL<#n^pc;8AU&tRp zJ!krKW?y2J<``&f>qYVn=h{cd`Se@sn^+mTqq^MvNvV9{NVDK-UQfTT7{tBFTueqK zGtc1v3J=B7?=W|lqZqU>fPL#N>)N94V|;)>$jqntVx*O_$Mb9O-vhsYyD+sMDSZ&4 zuYCpb;wg#@*ZnV^@n>VqpGfN0Xv|QtQM5>wUM*W$A5;Ke&10 zIJ8C-E^o*hr#0|mKULo%uH?03ne?s2(9^_Or7_I!1n=O~``L_EeU`rYID8C$XfuOs zmkYC+7h-v8d+_qEb(x^yoPWkv4z08mLyM?7+>QliwW6{5Oig4Yo%3w?v?Cy-X_%i1 zS4K{4MuBZE+hcJ_Sj#07V`5A^4XRW>M!5=lu>uc6*7<8L^E0ZreFF6-s!Sf^fv*DJ zy35r`7f|y1Gp(kUC|vBI`NcH?dHVrKUmTP{6Km_{4)MEaM-$J99#E!q!G@A07K`^D zZ{{VX%`rb|)y}_ImZdC@7CL`eyZ2j`|C03Mq-3P;{0lMHo4pqdvithEFN02~M_bCFhqhjK zY{EwMaKjl7MNA>fkCf|=J4wXXhSJ$Qun?;_4CZk4m|`|%7E#E9`8WLbUyl_s<9}*c zAp(1+_Yf3Xmc;#m1>u&IUm!+Gv(~y>bV^_+1ju49TOczwfs;&xDx}%naZhf1i(Qhj zpU|}YL>jgp5o+}QEr$u=i|i9z(9yR12_bPJ6_kS?&lS+Bl(y@+HX&nX{F^6ZI(8zW>is6#Xr_=@%t5=%C3@X z!NkjHXWb4aIb6w&Z$Xh!R?g5EALs13oi+`T!RT1kn;#3EsjFin6l)apU?!ISHh5$s zkWl!31o8mq1qa*Ek@ZSO&#GC6z${y8JmRUdczwdgoE^Ccnng_i#NEO=@RMaAWwU;^ zL5?5~0ey9LPlKU`X(-`7tO#E!i=Rd|={V-*-% z1ds^7S}m@H`x?ICCb1kI(Pf}2Lyy^5#kpYO_jdF5x93zV?{SJpzF>9IHRPt>TEy)AMF91dPh-_0J9*k7O8wt9b5wf>wV{H9&*Oc@9oMa*=ZEdNG)Pk2NZ zeg1E7HJa7PS+UDrO~JSzJR(a^XDV~M^@wmw7&Z*4J2_0RaWA0>>e%%p$SMAYl1!e| zy@~~`PSV_2q?8^jk$E0t zej;<@h%iIy{WV;?-|lD3*6x^JXMKgupo7YYbkc)$MGP9CMql@@2dth#gX_^SJsP1d=Bt)oLspVz z|BiENWbVxKk>SK!jF37`$^P(>jpC6}3ggQtJWASoe~!EOpRHFQRr>G`;An05%tJ`D z_W+)1zL5gHoU$LF`hBud;aU7~E_zfE45_rU);za}6)8th! z6fZ6*;!cGJya2e=&IT>{>wW+XYm{4Nt_rtWDQ?QeT}B_QSmRwbz9}=#r$5T`E@sTi zipaK91yeMZ^FfQvxxhBz?KbT86iRjDtFpD7`j=!qCH-(1*J@B~m{HA**r&y0m!zGk z9hm;^ByA};WuN%e>zvg%XBc_>Hq4cr|F7JjT#HvYBA&Ab^>{MljBt{S%-*FR3GQDM zI3w^A#-0j$X|A;TL44SGaf!O?7D@JD4^RiTtv_yq{9iYgV4a5U`ca!NYlxe3 z<|`))H}hvKv_`nnCl>eh`v2G+G`OCy{mC`N1@Vd~Cqkr^aXtOce_Jr+-ZM$S)t?vN9SKQEj<(ahdyYZsU6I%deQOG5BRR>g0kz|LM>&6&GLh zpi;6CaBZAEc{ygd+bJ)58Z(r$o13|7lr8*7E>@dPCWBo()le#eqHx%Zri(5;@#Bae ziLur+sKQ*eP#?#SW2I0`iz(6WBSw)#WH)`*#v5scxBaA$awnxTGaiNR^@4sJwlOiO?j#=;VHSk`8PJ1Q1$den=+4=43 zQAF$xYOT@k|H>r`ycXa2)raxq)J(d&o_a!wB^Gje5`NK&uJf~v%f0m3mIrg%1@I3z zsBK&Rg9C1T7WjU1vOdvwZO)5%Y->!uaQi%+JsaZb>dqD1{D?{lLxXJg-U@e<^`Rc_ zmla*eGB~BVK1H8CMR%n!5v<*7RmsWdnRnj2dX&@xjfekAjCHfS zPv-Kp2Jz^hXp8|)q;9LXin3<){cToVsJW^;R2MZ<+C%g+Bso9SlPq-@ab&0fZ z^)t)S0e6T@$A?W&&o|xN2|wLn<+a^5S>4ax$1N_69o))SnmzhUtW>KHNB{od!_;9D z^g<)r>2!_pO7=7&tch3FwJ-ugr%{x2ZzSUFr3&m{vQW$@FesLrF6wI+5Zm#+`Ka+G zQhi=#qeFK9zp7m5K)WIRAHjl2zcdWw4Q@Q{)WI2nUHbH>gK=h76xEctm05zXIraBo z+zJb73>v31D4Ve&|GjLC1| z{CmZ*rhN7?B@SflGgkUm63~?I32DmV{%)WaPHwkEYia}&$-meMYq*K|oDaIc+CU!k zjO`4;V}LWK@r|0|zEw*gtN3?u(iE%XE;^5TG zsbZF^r9$I1zZyKJU7XLc%-BONFfdUcEWL)K$<}(is|6#}AWDFf33Xg3VjGME@?H3tIyM$VfluL<2$DbPMIf4A6Uf>rVg7H85hC|L;g

    !_YKDMC{E}t#+hkGK7aO2Qecx{9BL&XY|K4wb7w;S4(v!K4M^S3 zZ;DA1q!FBT;4|m|}!(dL@Qz$BS4fyg+mz61brd*#! zsNC1)!(;1_YuZ7k5oWolp5#44yC)A}sJ?gPCzpI+`VX+x z%cE9MMr^bStXX2zH(Td->|Y2ISk{8l6}|=Dc83Mt?hNfxyIO|);9^@`-$PhOR%1kY zI*^x+8w*sa4?8eh`aP?srgxDwn$YQNkyp?xmg#U$3xzXzh9V$#DZoQOw<4 zLGzMIN9f)1$|vGt$?$vKV{a-n8ndW>!p^UXEi$S%*zoo%#X28*^X7-E9Y%ui+u~|o zrCImXC1Mc39zr3s&GLvBu(aSH%@JRDsggei1msqO(uv2mTo|xS2JxyGgPT?}3ZIOS z5_Jg&#Q(jacj5=X=S|Y&@}%aqU>Q~3`UQk!%6~J-pWm`|B}Ur1Tz zSmu~otuf*<*WC3o3C|e@d26XbxM?hUUIt$A%-stze!aZLyWHNi+Gyp#5>Cc_>G3xJTY2mGF+p5IGdt(|ppFfm*N*YN%IW@_>>QbdvP_1txXV5F; zWEKzaK~PqAm7j>e{O|4BS%EURubD=^hYr6{2_$n&DB`#wuHq;PA@+sHj4R+3P$X87 zjl;iBk$nr3OrYiBAGVAwld>cVL>4>*PfW|q}x`0$@=iZ1xu*vCb!1t*%$A_V)6_~e?gEuq7Ys$Q@wz%%?%ps;qe zc0AC2f{&wCSG@$dqzkYhcst%q&0DEZcXKnYH z_dxV0dipv|-&q~0IL+tJ>BtS_pQrx2;&G5zH$#jcB$5ojG-G>rH!!(G9S@w4K!ggZ zbLBaw+%)L6^Aa16q+<7cDx3RS?pLfo(JZl^#Zd7skULzVR`!IeO4`<2*=PN!oHTH( zF_$#b6RYLNlk(Oh`Ps6+O!9|$a?0Py9M1Gi;9Rk>r}ewT=QYuAo@2g4C5v!9MBE+q zfd>%dHPN1>EeBJj>PWsxI$1>&@%~pTo+7bb$4p-&%b;`i%k~HT5?U#bWT~L(HNQ|) z_Qfj6)oUkO9Yb{u|AFJEAc~OtwV^1js3)eR-R+pIheWqZnxrTkB)9qVDwOQ^klc!+ zD%4GK$s_Z<+z$K1VMkEVu$+QJzP`RAE%Q$Z!%f0_?f9l+OMTM(ekx%QExd2uHCis! zvm|pyj2DdO_Q%wceN{^c&t_zhr|-C)rrBsX2a?S9kMClsMsI65*d0y#tGUri%ZYdo z7VEiKtc`8JvnH9&=&`2Z`Hbnt0*|dHbF45#RPma)W_aY2xz^l(12qnki4Eq?$WHO+ zM@8CpB!4stWG;RnU26K-wQF_Bg(L6e^D|ZiLAKfiYgUelC9#=k~>-Qf5 zH}CwIF><(zeq>_#@RBd4ia3SaLh6f3G_`XT@vfLTs|wDzjC&BH9zCIMNp4YuDQ~a0 zaiAKuZmTNug@^cY@VknqZoHy=Ci2fnFt+Ir65+5Ie%a#JT9?FsFwuBJUB z2$@rrnCM4sf_hMD9Q-T}=4>p6IouOl$)mllKM|uoBl_i^b2+o+fK)-4Q zF>$=(^T&{#GjXH&!K&#jP!tuUmJ0U0Fr6f9J&&UBH))PrW1u|74ar&h!jmsCO6Izh zaJU&vRxO{m7GYsE+2G+lu2c*4wLD^bD!V-cmft&rb>Ji;7BC|$Lkxf9@0G2_!rsu8 zVsMW=iaH5+W8PYnp2SYW=6i5Tur*u4D#7D~UJm-vo=c)!NU-&&$%db0qQSPkHHWb) zvPKqcB;^C+Jxcir@jp7bnbbvnELsEc4mh0Hl_g0{ifP8FrkhJ}l=w!aEUl|8*GrY* zcyq(Jqy>cBe?Z}!6}#H3#u;WGt}S8}N(xC0J7z&E*7+HRcJ1fPwt!n!|EE@&qIELq zpCWag5Gthm}~j5AH!1CpBGH5Ey?B9I8Q3PI|JUsM<3kQwPn#21WqXv`SJm^YAIQIpPUIfD{8}1|XF2YeM z{L!(yOANlkJv++2iOg4S=J`T_2jY9i@+?IbTrhK~uf$l2Y;U~@5yspGs1=}AozY1@ ztp6Awz_Z$jqPR2OU9h{EDe)xUUYLyItkW=0#9qdX7dOh)qx?^LVnutgf3p+JkY7Os zOot8ky}bXqm8RGT4AYb4pW_eK7K$6agD2NyHkn^Vt0$1?!j8bZk_szF0*(04I zys&N&jj}@Wqu7*iLTEU6081h&qVdC9d@|-?49reV_O~0Pw=Dsa`FgToUrDC#7Olfh z!7vYDY={bq#w@8y7L{PZEucqA*rNf%0;yPE{>d;}2M3CW%tm05)Jm9Q?Zr;`=f+`+ zv|*L`Pv_&{LSFm-7;+c~olMTLLJ13pHnL)E%tgi`G9AIe;g*%gSYE}XjC8Vas52O@ z!7dhT+fpkC)CvjbWn6xi@nj=d!EK8~V@11>ITMp?St28xoQ*zQ6pJFsmM=A{SZ}kq zWT2AxT+=fa#LETir1CMzAgt5skUUwXCBeGtXYi;UWb7{%whVtW5M!lpjT+%AmjnMkC~XJ>_nV*gQLMTk z5o3o@(kv@7nOW&awGj__S;T~)%osJC{XcwOD}K^N8b7j$Y2dWu0Hb`T+~wu0pB0P$ z-4lE@V|>ezgHF0wk8O`GTarS@VkPR^t~)PU<=En?(dz0RYvg6VXpuo}h{l=zN;-?$ zc4JEOyxN*f(I|{LMci){6pJabddf-R6#KSv$qEqTH@m|Mh|ZMmmbLTv2HNZa zXDf-o(s-?uQ?c=ftSqAVeHHCH*4H$XYQ`xcQ7j2rxG5fohP4+}Hg2{a-@z44s*Yk} z1XPf5KjU85otm3Nc2Gnfm29vlM$SKOrF=iKeHZ>+aq<~=!_^4Alc9)r!X=u1{br#3 z^#vZ1ek1GKFMr(#*G3I%rMJ=;2#*7C$IAmblF4e<<%0bbv(^FKh1FtT#V+$KBJYAR zQvZrEKU>=TQ20jh>9jsIE#DM}z=LK(@b+WL9_4ov(r^3B|_TQ9L(W?PXmd zkNuLd`TJw`wAwOuVdjJgiOHGjw+e6g#El~Mw)y#{m24+x5Lu8L$xLWgWXPk|`U6Q8 zH}fD^%^&8s!apYhOxB6XQYzb43WdlQC(r> z0jDHUDU#dm}D3{TbQON_tdYfN(k-~9ZE>ZLVvNA>YF!Zom=!c8* zoK3S7591|zPSl*e%`yAhKtuK+cthh)Z+)1_X_U87Tt7^%7|UdadvGoaSB+{{@Y5^o zaZo3ZlIBV#hPw3Ex;^LIT_D8fSV~`pH%Q}u{`bc?ure3 z+61tt^c%g{if1rPUXN!K6k?6@JZ>5piOo-(Jk4L(CkynTKG~k}q!HxS$=E$l_D$e) zr7AQZf)|}$leM?lGl^2BIQHkp`?ZIk%uah^+lYu2%#EO-)yEK3iP%1024Y53!98H7 z14E+Ha_*~i>|(0-(Q5m`g`Ud4@}&|{yGLrGSBy6fw}aD2caJ_e zVerbA{Ape{U7#~fHN=B;KmG-04Km#{_II#{53v^9_V4{(WV~YPE9Wi;*XE{COyNSB zKHzfacD~-#+#hKiMYTnFf0Xm+ify;laWMPiS~Dr&muEwD zGTm?S#PF}9u^K#8v0U42{|K@li?#@9BgA!>kHDY%#CFy$Eh~ zd;jQbhg;Yc3#ZkWTl$*-RIq&qRfE$|R0Bexp+|~UuOk*rpz0_J!L+8AzK^o2Z&csb z{#ZfOyBZRl@P1-n;<5f#2k~tt4jw5G%s3?_jlm(yi7F#s8&jHn3O((ESWhNSH?Gl> zV&sQbv>+_(G}HxciOtYhO`W*m?Wq#>gVSE-IYs;t%Ggi1Bs;bm#QDpn?Ea&#dK?Ri-bH*QCS5-K`EX=O&kql-8V+J zN^cSHfTY58q$e@c*3&t*nQQS_qvm5#0B>snWgH`gzlsV4%-MOo) zlZCd8F`Gj0V^MaW7cZt&sCaLG{okLt<9% zOH|xmY_n&qdN3_Dn9-Hg%`1?GFGH9hMAOo%Oa>qf%>#w4D_CwDOX3RJK=fn}<%vBv z%4Qd6c2m2>4qsCE#%j`I^F$`{vM1Z<9rb!F0?y;DK7h$iI+G~Lxpp>sn3NG4vD)O= zr+Fdt;Zfj%6o!y`8pf5>2X&*015GljNSjago$T|}d@GZzFWALNEm|$Ak4AZQMv+zD zx5GGD0xmAUlr$i1{@HNqgU)T5FNyj&;6DdCij_8WVl73J!cZdrli{9%woYcU%RGbW&!em_#%eDcIV>P+(%;ZyNnlc3qF!zc0 zc5UJE*>%iLJd1Rf@S5tkVlp>LJp&FE$(kvdh%l(Ctb>_xz~1GO)#UE*tRz1R_a@!Du#Qa|Oa!PSPhPSEmdLwA*&e`M5HSY}k^Uo~m4RK=g53jbh+ z{box0w|%Lu(I!GjV)^f6S=2c0+67W$^BM5J=rq>V5xk1+md+%UlAu;RBsC4KvU(N9 zomm%)x}G_)WpF#m9mH#Ec#94l;XgJpiiXMG@e;y09| z4%A)Ql`~BwVQ;7=v-gK_9i)@yT~=n2bvFgJ9ESz2XO$oOPE93LRi zz}QsIZafOy6LHuRresyYDru7$*6H?5$Qd|&hez+$U+3qUj?93mx7jJ^A6qJ|J)F9x zP6(yrOZT*IX6=Ad%G5G9+P!Qdhf|Tqpg4hd3C#>uW+9cMO4po4pt3@Nr}S0?c^*4~ zcS()2MPubmbUEu$-ZL1DgNHMC96m4NOUBPU5@A`48Ie@9@KgEv*2#EG7WuUzrCKr$ zW~^`5DYl?_jAP-35qSFVIPZP>urtFeiP3*&9Qm(xY0L*>lEb3GLVny<$N53@8l0Jb zW#77O=C)1glUV$0LXb!FY}d$ubL|3k=bJ3*cPJd|tlq`sNt;lIbmuZrQZIneluv@& zGF)jhsLxSs#j&{_^p&O#ZxD{8O+Suqs0I7m04uUnMRfBk>aK0lb97#90aHRa5}UT- z^!&i4gSJ^N8QK|*)j6+Pw07^)fk~k@D`X^7(E#;pWSTD1H&SGeY1eq%6eu2r8T*o? zH@Li!(Wk?m+m6XOZ4YSLtYpNDBNM{~MGg!jQ_!tJ!~2W6QrNUeH$CLYu2vF4Jm$#5 zP@>T}+Ed|5Qzk%YW8;y^$e=os;B-h{im2%$aUE`v!Up=QUI>E|$>`)nun~J89<7Bo zwCu_e`Aa&$`mN@-Pp8!*hzN7hv>vi3liBrQ{wp6(mAc824-XygM4qlmks;H5In6WM}jSB7yN+ns}xk_c+Shxu_a8uIbVvYWWbr(VRTbu?$0ms|>z z#i1gC_@0$_z-`eu!#mcG5Xe1q`s4J3swf@nIjxj%GZG;AoOPs7csnVN+L#vleNzf- zT6FypE%9)`+Xht3JAZd{*&TN^#qq~vmSXH$waDI3t2&zYCROr2HAs&Su~37@##1T< zojCb*Hl~NM7<_@n-#wA@WJNg>YAi!n*RC0P4jrD!JySMGH4`)^bqxH!tH?QZD%A3yT^UwI{h6C zBNJ($a_N6geEaEYz&Vj4QMG-12FkfMI^pkxaq&^~zOqIsln7VG>epj%y#)zd=|h=rceusm z^s*SqYkRq(k&sJ1vJIWw`f27c-pU#+2`O5K7rR}$Hl?9HFK9=M1mWqe&LBa|ixry8 z^=%hP7#2=Y(5v-q&-8i^nk1Dw=`FuUr-RmOLbE z9lOgKF;*OrO5Ng#-oEmWChoJ>5Aw_tf0$TFc551hsac`Asf=5JfS_S>UU?|2NWEf3 z`-qI|Br0$7YOI5YTvGq|Lsj3iLJp55m<=ldyT|e;_L5vVW-fIEfZAP>_|8H&oVr<+ zUVatBSgszOU5)4i!z54Q|4~?TQy>}E*M`qZytTR2yXCjNx@6#2)lb?x-^s}x^rha{ z6Z%ms%735J8GXC5gj>Q%!QS-!qg;pn9E6?xtK>`f(W~u)p?Le_;JjpxF577J zf~a`DAcgBDb|)LU(RMYVS@vlU2?6*33==@8R!R#knZ% ztFmada@n)}Ac%BD5?1l5_%y_tTaUNcxPvO{ft!fQaIr!0ECd{nW_@}&MNWVltp3BP z)gqVIypxlBn-*vDSx)vJdZc>Ld7>8JC#0?zml^v9B&=(p?1pY8sm7ukKU%^XXW~BQ zA`P&&4*)QKTRN5Mi|R}?hs@9o*J4w` z1wdpK=~*@x88J_djOQIPDGG8SR-Zyt*eh1cz$FvyYkBG-##P&*$KQ=weiO^1OCB0a z8^V#8DXY-Z&^yg|@U{YeLzcKiczB)h*a*P#3)iAv?txYtbh;{Eul4w}&w-{QA+KW;yuVq6j*cH*aea~4hSJP@ zBV42yEib-9v5+=6aTX@=$624dIl5zWvedma+U&!IaS6)#=-W|(x7|GOc>D+`H*vmY zU~Hr^Ml`7 z)?4!3=FWJDg5Z~^4(NZ?6wDRf@PW$N-*UL@7LNQ%P)r=}s-rkdV+l;#a|K6L0O z$G3gB{dqGnVX196?~D`(8Dp7-WB;pZ;p8ZnNS&wMg2$SY6{>|*gC^4F)r?<+d*cKA zbNnTKEw7d~-0$?iY8_dtPfsLuysq@1-EM$&c#a?O#SpCPXLHewhj&-M@AX^&|9!-7 zCiXJr_7givq%=d>@4UHqi3U7lyT9kL+&o!p$jbFB$8>VUGdbsx8iZeJz7M}l{yp!@ zGc+Gu>2e&8#+WOU*^hT;6>}2n z;c3eWw`pzLbzYe1xPHolrTXId+=qEdhm0-K*$Kp&n6N@^zH)fmh&@~wlgIgPM1K-J zwufj~d@4GI4_}jpg5?vY7Kp{H_q|@@A0S_wlr%_c}h<6$_y!CGTYgi1%yrhDJbvpq2==^L(zt!D%txD^(^u8 z;nckW5x*j4C!1N?W95%kJS@5faWR%EjvJRKXaHp1(=<4FJ9#%-D|$*v^;kOt1v}!6 z?RL#Uq=FVB9WT1C!{lNjoOGT^(D=00L4=&f5wAgD;~!jAmk_Fd%_wPgSZX!};ps%5 zr(u$$OekzX9eE;Fmtx#Zbz)X)c-`hYz<3_(^}t!*{_K#-=29tVir-MegdOOBjqV85 zcl-lr*hX7wm3ZKh+_EBy(xhlnT?|--3$c_}eINy81$s)^xs_Xq60G8}&08Kd>XuZ5 zkxkXMY-b3CV7d1*9mTi8Nq)Q`3YIb@1EvIR1;TCRryDv|dQxv6QQC#$AW6%p!+IPy ztOZ^?ZD-u=wMOX%)4sksE&|FElZG8YRZ5|;7fl^oKsM$NRm?<_#3?N3vy~`rM8t|` zh~v%Hr5(F}z*Q-u4Y0(AF_Wjec_KwzE)Wx+&M@{1$XA<;eLfU&hCK2qJ_y5^d$tR% z;AZ-wG$!DFub$t~{xs?{K9k~t)R`}49qHf?e@$;d;Pn)5s9$>M{ckoLptcO^508JS zbCN~*%bMSpzqI?kgWYllmuTO0ottzz;S7 zkY^Tf_}N*HuJtu{4fjA||DN2;N)WC9TxY9rc-LBzch_z?O`7+^#Ir8Qtd~75r3aZ3li7{BN3u}_~ z-S!SQngru_$IbeLj9H96kwWlN)G=R8$$<;tvh+{p0ms?KxvA*6n6ss#P9){_RgxKf9shh6KiLJQ5MQ<{8|0~)faJ1g8yntopajefMOSR zmijDf1bJTSafiq}l95BhA|&TUcqC4;F8r+k^qyotJQ6>icmA!F%@Qt9!|(iT3la|| z5AczF*cjvU&FZf|r9D0x9_G$ff9sDBL|F3buOL>8ZZ(T_NVjeOFf(;!Nu!n)m*)Jr2jB-1S-w(f0P?}1fsgj%-ey=kDdG70XWn7yFa zCCI@2(A-phE9&jF?=&r?Oc$M_cx*GSe!)U*@48wg^HWe*w~3NZU!L>l+`gREhK5a}X;wGB_pscdFHBZU`m-|@ z=-{*B$;8178@TX_6oZ?S$2Bo6t)SsFO!@}wEQPe`M zVz?*f5k$&hU&|_Pri^DPPNr9GV@eJlF#)_KN>KAuUYe4Ml;9F6W-en6mECw8lFaX5 zZOmSk#@<#?{1*uF)vi`H7!-dBTssc#FCNg>{G+HSeR&zEQ$0c7HS=3f=GWn-xn1G8mALUbAN6PA!lti1 zdNk;iM6g^tG=>2_6%;Yo%mjgvf9%4Hqtcc3A%vt}*Wl(!`E=O;^I5JV&n6Gg1>NS# zY!<&NzDG3RxIJ-Qf`QT;{0j(1gHNG5J%3>`c&vnHeliEEi^l*Rs;2uEBP#_MPuv~DaHNv2}~ zRRP{j+YPe=I&IzcE)p_4W*2WQrtH{&=C6Ds*2}c;tEC>ozo>Sqb5t zOBmKfH90nf(Li%! zzza1lFD6)|r_j-~YIxo9e?mT0oO0Tl$Fw*VTc4t|q@FZ)?HKYi4(js@$8kN-iwf#< zRz)N;S&}&4 zoO^~!bCz$%hIqq|-YZH>=Rr*7b)@2!1OvBlbT*$zop>Z>6R$Nl76gjHMPYaxySIlZ zC1yrO%5@adRU_}P=LSt{%p^5+Sc-Codi^2>Yaqp-qsoB?R?gAF*4)w4i5lU7VA>w4 z5N~l)jJtE2WVIlllaS7_nV8i@@5lZlZ31h)F>t9Cy3J6e z%t=ogRWi>#I&PY?MZ?Xn=xUnA#*8{$n5rhmrRAZ3qH}ZkF!z-i*-_}s!Dj!!jlwu6 zs9G78ewqJ<(5Mq|(Bege;fiOMM|}gbWO~u8F%^Dg8YV&*VT%NKb`z2`we@pWoiR3g zo*5kfl#EyvBHaRj$5aHh$i^d;N{j;WuECTJ^>6l~YtSKy#FAJfVKB~@8#Y~KI3IKX z3|xFSmkP1Rvb1J4T>N6JiQ{CJA&h!OH|gd?JYera=HabP|$wM zU?{S>LOapwIk>Z@V11Wk4)Di@)qM$UuS%_QI9ZuCJ$KXDaenIonBU0X=(No_t~&}R zUB{2OFj3;UA>0LbqyP<-P@Lj|_VS)GJd$6Q58xSq(U%X*0Dv8k;qeEDD|JJ&vtTX4 zaF+~LK<&7ri3@yv`)Pd(_69>Cio!7+XD73$71=<-Rb9ou;Ns*OPIB^G46bPRZU>%| z9=vl(G~mk7gwZ($hhQdxHU^Em0X!2@{L=1=pZ?;Pu|b~709r|rsh_|?!NZcOASNk) z^&^uhs*pVY`l-+iczMTKJ24YkveY8nj{q1N$N7UcO#fd$_B;3O%ST#&%Rs8rD+wXj z+6;pLi7_ftAOMxRqNODQ2n#$1q{+m*ONt#>@r1x1jkUv(*{y4_A$)O`UL*Zrnpe&a zUh=WN^p{2%{(7V zf@3fr*ySBM{pg~y`)EGW6iZf66tchYRb36zu{g4uNj_3EMXmSap(?s2uQkUWWWF`-U%cn zYOU6&HMI_}(WWB`#!y3>y+{dn(+@OV)#J{&&=7}?7Un}8i+dOE?_bPsWeTdK>h7v7 z_fem*cCMopqd*69Hhct1^iqimEjo;tv|-n&zd@jc6a*U)l29}~W5I)ec3)K?0P9=^ zzA9!=FubH}gt-RaFwtf4ldTy4>E?S=gsWD>h?kLFn5e7P=uF^`WXnzipb9T>tsb$u zDnCo%pjHK*@INf$3zD!()Z}e<#RJrD=ik*GN7B;Q);KMyX+?ur{X)_mpa#hz1x~(I znse(!(N9R)99eA&OVcynRAK?6JszyK|hi1xGB@M$adn&b=+e-A!3Yj##m-_5mZb? zTSyAjHrZSKu38=^PE-9GGZ8owq!46DRj)r(W(iBt z;=G47oGQZH5P1rj8us-d$Avr9B}_yB`I|A5q<*hIOlFN*ceDK2!CJMzp?Px_WZple&$ zjNT@Q9>WL(Un%uu@n-apI}ptB_0GJh*7_aRRTm)!Gj^@!a-Dqy66e&+#SC8YYA>1! zOeE@ECk!+n(CU|FKzZl9YA&EJk)Tbrd=EgYpyCHuf!>gQ*7E|;sQqFHpea?q77Lit zmSaFH^}vfD%~u8ppa|ycLI(lSVEKP&Gn*1i9+Or)Ci2)pbOAev9Ap6p!z`fShbYsZ zqG}XGc`3q{D#FDGl_bogWPJ_j2H%3D@_`5R$EItv04=GDRDfea#wDWAzE*i51nd@T zAr}E@9;x@_C>CrQHFy&b1t}6D$T-m-iQtwnzM)i&B+I~=awqA(4MKJCp!DH7)W1x` zMIz`^#4jeWa#G>{x?ib?5g0I|(o&e?r6|5p4v;t|-ZBOdRLM&|ImIbSeHzj&9Cr@s z9#Z|oX89Zw^pb@v)kIS(OB{f6r74SDTGF&K3{chUG%7HV-G+w#Zl#A$&S#yp&;#ps z1#XZ7;(f_C5CYl#KjcdYKw;fSkO!U>)#nZbq*$$1A z7D!f+hAR)WcoJIkwP9g)1Xb?}9k`9uF!dh634D!E+GYN9AmbTzl}JPD@Hmg*Mt<<9 zH4w54GlN+M(Yic>=(WtXTXL?0p`>1yd?7pj*ynTRs~`}?)akO37kqDGU>|7%lQc<| zv)X5~@*46;f+>)E3iLR8$QyGnIu#4ug0wPdYs&*3oZ8Z=}sZP2{ z4xoZ-n|xA&SD{i$#-~o7LwQE18co(5MZ~tmrPo2s6tCIozma$=I~{S8cx8HwUBAWq z92&lsZGHe__ucGE^9qKosM`wL?J?-OFxm~=y$h@XlGlpR%qn2$0)Os6hJV?AgSSck z%nKc3&h>%|Hkg_)YuQFtC-}>T1VOUd{X+vGm}Sk^h51mw;=*m}SxF-y$Y~Ns9YKvv zs_~vEPfj{~{6Kf3ZbN^9*EFx#v{n23yxzo>KjmuLvG25`QqtZa!a8Ycq0>~>xuvbF z_r!U4@)L56thMCCi><+c9ii*6x=dKe(q%9p%_qWJ-2{F!l6{creoI++x#8PLCof=w z3;T%ho3@rNyPV*)#3j2bt>K3izNtfz%s5?r)0WAx4Ur!B?;`^HNIJIi#BZBHZZ zywTg3jVlE4`!buz!z$fy$Qa`xW&)(ID)W{J-fCXq(_=uJxrHdhzR`q*T{UR?r7O6W zgsrB$w&IpA6>W``5Z)CX*f)By9O8ELf#dhC>z)gFcYq2#?rmDCVOeV*v_yCleb`6l zu;3M`&0)p)>Jhe@99!R;llZnlx}QuvmauPZV^xz0&~YK?4v?c=KYD2YgZ8izPdn=Q z#17W)Bu=p5*BJ+0_0z_I5=WL2_4TvJIRjr<;paHcyWZb+?Lh3Ic&)l>NQ`#grdGCT zsb*oF_ALif*TuU#kn3Y|vnUu%FLk82|Do`Q0NGSuEFl2jI0>BB3-h5Ef@KsGK`PLV z#jLW!we<~zD{#v~2y+5o??ssp4}l4Dj(Xb#<=$!B*E`j=ZQkDA+0e&1Kfmguamdyj7z-eBL4>nU5NZ{y!HzTbY> zc&$);b204>SgQ%LI`r9PoI|GkMPFaeTc)Ts=N2{X%hwgbtAn|2 z`b4{?m{)NY&r32svA2Raa1w0A1X~Wiy7%H6b|C3cic0V5Jy@SCZ_}b?aGmyz*me-H zZ%>lm24!tIO{mq;U9UV3))ETIWaPFH0VjuHRQHHk9nY#77%i~teSgkS6jmHQ*^;oX zd&8xUIv>0jk?sJT-1=U4o`J1a(s+tJ9)gp%XE} zl{{@md1!pr>ZBeVXzBshr1OSDK?Pk!8z!OFuIB{sDQ3l1(!0~Bz=$YL*OCNvdd1WF zQWuyxw>}=y^u+VmM6S?cB&dxHp^TCU8@?&q_JTI^glA5O&M8F-lxfg!%YIfFg_)Ul zg~u&zLA?XF*_|YV3Q!e0-lX%)r2>4^Xj`v%msN1=UvlwDvURZLAPBSH6J^hbB9Dh( zbJ0H2m}>}%mZF6o?>Bv|Dcl>&hqv0ZoCQu((QuJ`U)e+jYWM92Uvo)ez|ad8OV2hv z`Bw;AN@#_RcuDI$b^fUQDEBAzt1GqMwN`P4YG%WPyHH^$HM=0eM*a3UjM=HL^F08Y zjSxYx*`10%2++am5fS3#X*dZS0i>utXWmYaU-GZn$-956&vmbO^5QSJVzkMU6;$c8 zWuYq&`T~(6c#M z9n6E-^=;K%0$NFE6){9K|DQZV!)`Wk$k7fjuwY(lnbg?QH$E;W9{5 z7u*|5F4>)Jk`d@rrZVZ!V~pStDs<>_mg%i`CfB!$W#BB)UC>Qubph@Qa2NxI*PZ{w zQvs%AY0zkXVGdq84-(#_s8=x*i@qS^Q;^-sEf|12FJ&a1){+4*@q{NY*$Z=^tJz3W z)2rrVHNvc7)aoyctkeAKe5U1CMXF)E*S+-oYke729xXl^S~QDt8Ag_373#cSH2-?P z*5ilUAk;vWdRBYO3@Go2k(AWe`vZ5k{V5FuSVvbl&?c?|kG2?%Qp7H;KY>SgLO>V% zc}fYr(SY9mg-x%(IYPO9^p8WfGwGV{R$K3bk9OKGzBu!@z3gL_Jgx+e760UziGWxY zFLI+gbQpWqn9WNQ82jjd^4P)OaT@~p#Gn{ySo+ISISv@}_Ejh8#X=rZU|MF8ZzZHUB#H$+#)Y?{-)B)o7v@ndDSqJG$B+~UaiJ7n>JcYi zNm7Fo(+Sa@SUt(E&AYxO?j@kWM=DjQ&}YfDLL%{_f1~*;9uUYwWkn3Sl6fg7d6r!V zgLgeq(vm1liQwrKPj=Gj&t)+KBlSs+6>7!1b|xGn0wjHsW24&mzS9ZA7w&?%D~YtO z%A{zl#*k_A?NXmS=QYO{CrPMWlp1=TC9F7dYdyPSi3G8vt4)qk?k^j7K?a4Y5*RHy zrmhX&PisKHzfjery}{~h_L8e0L|^n1z-I>z90rvpn(QKr#}e#ZkK)Q}mc7DLku^Tf zC^`zOi_hj0U3y})_++X$42#N`AR#JMM|-iJ_1l7TxRiJJCbH!!ZeMpUS{`^&rXo;K z_9z%8vvDaoa~ZgFK}MJA0%|QF`I{yC^}YSPYA7Zxr0O(v7MB6k*Z1;sDkc&&>UrgC zTB|gtEQT%5)Xis-)|Oav>{oO1B={NlIo=WJ8gZ);ROk~Hbd|Zh?+$bsP8oAh$6O@+ zQ>Qp<9JpPWZQB2apv${54G*Yc&O(md>=7NNpz$nq>roEiH0pd>zx`hSn5iUH0iLMdGmzq~5mv)4X=Q{N!9TGqa zIEJo#RXXmbW1O)u@th6Es-|}7d1W$btI5-n?{!j3Z2Tc{;2+KcB;QTPm|H`S2{(ZX zBxLD%Wuk8b{lDRF;I)1hctYO={XhCceZgR;$LGMf4h(eApO^>b`{@{j*&+<$VuH0S zrnPo`BV1`M>^OlQ^{c#vTj-yB4Bfu!*sy?2WVz4nmxv9TqFXy_)?+Vd{IM$tgD*r4 zKpB93rG)223l?H4B))~5oQ3?sw%wn%2{A|`J!_)Aw=xSERp|9zTC-&|zM$IIr@LFp;UQ_nQfrV8tOR z&sE-W`xk^Kz5_3nsH=~RS#{`dc2z~SKK->7+o@6twP-jQ7tcJ)nxO*r^J6kN7B;F} zp*+hx3CP@^KAf9QR_99yWozxRrf~cGn*B!@tFedgPs9)EPJ7z!!G~VEh`>Uahd#&s%>6emoE?O>FCr5kFoU z9bKMR#@gww`-hD|*>XulS+m|=1l@Vj!;UkdC|^Na1gq1K;rh&c_Ht@nSnt%q|09<; z0RD0zAek&)6>0Qs31ZmbOtO%}2vgkg>U%PdPM3_z_)OKzYyX-5T=D=$L=i)a$JlMM z-#f!uzUBsW>stUBGc>o@b>>q2-r46+3@gtAS($Gui>}L!>{W2buSm87fB~i?0&z6a z?t3!Wkr5c1$<_uFzxWL~6mY|X(kA6y{N*~+Z!%#+lWhHH{_(3Z}#YyWkGn*qo* zQp&ybE-osvi)9sSs4-q&-SZoHab*;CpQ=~6X#Fc;RdJlWbfH7Z-l_LVUyXWsBHht# z<03^<**9L5^7E0CvKACi$dw5e2|3Ch(i% zEF!EbH&{IIak8zR45imT?#K9)9!&gT|HHIY1uMdB zVh731A}nA9l!eM|hGDKn%%Q@$5`Q-Xb###= zMNl$q6-e?(O%Y>D)66{lfgrvTfxGB)I6z9S68_Tzy&LU%%fMvqc^@M_0F=eDbG^Ia zRemdXTOkZ~h{p}dlk9=ip!RNl#(E?-l^d57b=-(~ev7%lkQY@nNORIH6@kZ1n0(*@ z1%)9r^s?nR9GRUR!dqY{j-5NCt6V>NAcyA13_&>{g9jA_NWCq2nNLUzI3@*ovqTCx zJQdXRP%392CL)Mj?X^yjwuv%FUjfpl{zwf0c)NHqfyZkEO=-^AqAi;m3k8v0ghB<< zb7>j)z&8_Fu0bJWLwXZ1)K6+=RtDkA5lIHZKM4?eEfeH^B;Zhj3-fe{+|<{I{Mo*$VFp!u4qXPLT2@`Y z>L&G`?xkkarth;?iWItfsOA5#SoLlCTC^X7I9C2pP|q=-1!YyEBeCw>zeflR9lhqH zN@5jaC=6ybt2{-8@kyPrQ~wpW6(QZMl!u4!$`xWwKf z13OziW6)F*u4|Pl+}HUTFdlpxMA!HJ^OJ1(&%Tgjcn{&mv%4(HakwS@#aS3a#e+#~ z?74{$n_W@Q>QB{rsosxiK9p4V715v`8H5cF{#K%|&&u$d3s*@XA4(4s&ll#;`UR z;ri;2i{u!Lesi|k<8JD6j2rP%HXO3(ie*g5KZHG_M14|pgN1*ks)o^% zUG%{$vP~jOmr47)tLMoO5@AXcx`+IFlQBKG7Q`mB=*GkoGeP$>ySkorka!UG^+>heP8lWaGz( zAA&S9+NEJEaylivf=QyY^|JdNd(;bk7q$M}Ij7F%aHc8%h zO+V)T*kQ$~TacEoXjU;7|7fHxUb+lY1OyHmB4vnc*SUThaemfaYEdn#OtRyFOfew= z^^;Albdjg%xPXCG(KnJ&+g}F$Sq*kU29)>}31d2?$ zSy&CY33NF3#CVW~`+kB*3jc61V#ma(kJ=J|<3zMmT)8GixQZfZF{jEV5%xa@TY z_8lc5+Pf5a9Fe|(_6sV1j4ZQ9sa)Dg^z!1?st+-2B~{;3|Krka>QDWA zc1*2FQC}C`DLJ zKn?b|DqKYa)6#1|i6SY^RZ@RwF<`@a(HcBqk@N>dlF$uK0?AYB7yj2k(E^~$6)gar zVZ=PCf>lLPrXkhmg=oMMhkiPDxo|)HJ4l36ixU#|QXT4}j)#d*nPJW`;UiF3oAPux z_W#+k0CIH|=2G7sXt(6&Uy$VI*&L1E!pNBdv8eRIupGjpaw&LCNA_a0oTQH#vznJM zD_)FdgBrE#N3CU9Elg5<%=qax@CpX$O<)kVt7@m|g3S+KcbbT*tjNq-aQyTQm>T;q-SRm>347 zY394{%Zcv@7N&=zMn(AAC8j%&q4<;Cg|nr|p+IM0wn=_4@fp%AM>{a#gnUVEqDrkD z3Y}%MFTxG@@PGe*UbO#RUh}j72%sgP&%TZN$5U()eRQOo_;M6CG`UT|=og?Z43QxS za5DA655qjRO?X2T84S<^UugGyZT^u~A0rm|9jF4pQl+ZAD5}Dnh%29A56SXwi(k6w z^o=ZhD9e7uuU&%<%D<0XR1@v`-6|1z%gax>3irQ@lUV|AP5{tygYaVk;8y}5p9K(3 z0Lmhdiar32CM#MJNw8hyoEKR{){FW>M-9mY-BX|{i-GDO-SWkTbkellXpKh#b}#^` zM*&5apWUrOu{Oa5JdDxH6t7I-FQ^_z0oYA)*oiq73>}EY#=%ZnI>h)BoW*1^w20D8%(x zpF`O_<|zP9#%w{*A(!%yrMlKKrFK%TIsczf(x1YA=a`a1{g~KL|o;2n8c5J zMD}L^>Zyg!g)}#(9z}V509=!k4$(|+5;YX9X^MfVsEtOG#HXCe1DL&#e$E5xYB!OZ zT58q2NRCxn(nam4sZPy)(9~_AA2$K7EDoAh>*z=E--(MI#o9Cc-6CB7r?3|-dW;@Z z^oLSsI_j_df;Np2my(y!=Lny- z$f?j6lZ}-pdmaH;qL8*V0ZtWN;5V{GzExYn-pUX&UDIoT@6=X2*5u8d;m&}1m;53V zVx3WK&_R=~vMKa6t&vuI28GKe8Y%Ah0sMQgL_l4yjXyJ~3_;ibI+uR@dju)(*Da%`LR7`sdtO_u&08*2fqFG*7D z54bx7uznKaD-$n;swM_&kVZdKC^ZZAP6l+ESmkZ#cqJ{x^kOnyoHFAzE!>(axTndp zX3ex0F^zre^K@uLHPh+KcGq1UNHz!_0Xk5R4uw~_h9d0}(P~k@>fHcxY!+ZcgJ?&r z6VPy8P-w%LMArN&QIP=SY(ZpfBX~WRU@X|k^q0Bxb1t=x>icw~cDViitx*8uWTc0J zTl6Msf3({!aJ~HiX&en)aZ2|t@@Dzx>y1?FKW3j8z>rQ585aZC>HrLD6anthI3NQ{ z|4k*P^8Z5GVPcZE=+U0{0YfjOL(9Q&Q`Q0fC!+XT1ysEuXiH8ReupxtmVo;#+jvl`tE-GL|1s6iz99do zMKZV6<61}8yzu>YY3?TC=!LtyTm<;*Z;=iBz!U&4Uj`5oZ%oR!ENcahsHnu{O*0T% z3zq4J%jo4YYS-p!?FBBZ7cB2&E+0|7s!gc$zr&FH2)c0`y>QeoPHm^JimTcdLUR~3Z>N^i5rX}i$72Tt#j7dw*P=i@ zL?&utB|g{|aM8s8j9k4%+O>5S@S z?-%GedB5sdn63Al`Sf>B9oGSuXkw$U&~Xw^w4>Eez0_Ui6xY$`x#O@L7fm~1n|L}u zlArc}+tdeM!!72tbRYkHBLJKwSo!)0eycsGT5e2~5Y=cDFETpi z7s>BnOA{G}S_q7Dcp*45Tm^tV3HGJa`;w+hj7uqz&QI6rs-Q^S#l}MYVhu0+Txb4x z;!j}F|9|Mnwr?Il)NXJn%e{T^i^z4NwIAAitpnq>sHIGkBcx-QFgW&VM72^do>rSbx=`q|O6a!sbyNqT$I!EcU;nj--o`vd&l zC7k910bPp#=@&}VLeF?XeOR>wzGaIE>3XnkSAfh!IQEXTefP`N+#MoP;$P}?Q}9zq zcAyKCc>DtBoM45zPOpjQ+PynH7O90F0rHWm4n|+xt*x9%!M}&jomWKa`jrMMP^f<5 zDr$7kp3$o=kOA*@Jg)Udx+wX>4xh0al^S0NPSwk!Y+V3ky+H_6Ki`^0GeidV#xanh zlRa)X2K;xNY%?MN?$v8WKO%$d6&EWi{puEf8ZQo`MFv0pbO$=3piy0Fn|8L*7lE=H zb&t-35W8KMwbM7gu&e#_;hbX*p;*7z6wcuBGIJb)#@C~cZg^6=eRI2>h(+({^BgFR?s^d@AuMJvW@HMZZwtqCSYH1McWd4;{05(}ht@0D}JAg#W0{eAV;q z(8BbvSGA=aFPe*cV89&S@oX#X%d!i+gld{Ez>P$f#P(l#4?9e z5hk0a{xIQtoE5h!61|f23y#KGdMjFhuZt@`KS6=lSPcNs&ELS3YOc6fX+nSEEcicL zprAM(Z^C;1De68nDY4=au5Cg9;rD9zUNu1KAKtE*_l~NFeksjVMH6enQxz#5KU1OH z^(q1YW?Lh{EF%?@_ZS)YGyJ%}t8tBOLaiCk zTP}B4_pFO9DmtM-QUlt^J~w&o!o5)>Xk9gm1bS?Qawsxqs3?j+i=Ao$iiS64Cdv-o zbWAOW+6@`DogEgxAyzg<4fL77sF}ckGI!U43P3KL3>SyxL%QBr4!x<=3-kccn0EJw zp)=X14gCZ>6-d7!fT1%$b|OS1H|h(=QMv+GG#yGO)8gq7i9xevI}ZA?hb)NC(*T%#s=>;RwMNt1H2~h_!c=y=)rBvAnpb33wZQHXz=i?hPF;3g zA^A>ydP#|3e(+mb#dfV*P7`R@{1mu13Y>de6ii6qX>Ghbrd^;o+9tBi z)gf7`W(PE?_?!xLWxFMJ#&21Q`3hXx4;pt|?>LT=a4eUOi=rKB!SIge`?DdZ)tj4g zBlJmFSQJ!uxEH=7zkMg3PSJ2(IDBxG3vF!zxE#7eWZ5keO&s1+lr4zO{9bPKo199u zz|IB$RRSPesBl(19_8KUQ4wgP*VtWMlP!uRn&!&p$xwS#w;ab|^@Ot?lEXAq3Of?# ztGp~T?x}Rea18@}nQ%?))lLigza-o-A1;=)rjj5Xl3SmWeq**1{dRyC;WmDpRw>^5 z_w!tRIOhcXTaGgSeZb1H6h;8yhu_ovmo6UAY($iW8OEWzpX`d5oyqrRJGn*OwT!eQ zTP&CBJ?CVnWP~M7*$A(CJx2=5;+eVqp!y@0L=bnU?-o&yILT1iVQ6=Q@%sHq>I3OU zdi5TuRHL?$I^6ldAw8nrR)EVr`QUI#MRQF3c^}Iy^jH4HqM#1_^D8oOnbelPpDtLL z)zTjsyML{}#>`*skLEvfE;wA$+Iv@GvUsGgsAuRdU!JVk0NzmAW_cW z*Q2#v95Q+|uk~nnb1K$R=$Lld7+oOO7M(B_YrXmc7h37ID~@#WSW`u{`nQmtZ^)6! z-ScGXKhj1kbHn}q>NQqJPmIicMxw8oQJ{>gle%i(O}&EP(`u!)sCh}L;mTUmaO`Q1 zT-iEq&T$+kVL2`x7e&7bXbA(5H|9{NGprW#_qP5<+FM=%)`kHR2td8k2C-?sE%3P8 z5ZT)yT^*wv$wwnzsnoH%%NR9gi$&qf#;v6CmR8eg7?8PWRHSSBUL9GpYv5A`(bTXUsw+d+ zLsVTzZJxiq{oeDe3+8vndxmYs0qglJtc$nM7%t8)1!ffhDiuIIOHJ&fcCP^7QjVP2 z^7cpmT9?8DTHa~)@%9@DpE6-0H||DO;6)11A?$KQ2L)pHu+-2z zrtcf#dy!VBHbF zgUmf$H*RtKqWHz}i{fK`LQ6eby=6*csh@{y9akL}j*Ftw%x4EEOIbA7$A#k}u_%ir za0xj%VjiOPcOvqh6U{?Qo1YynVc$f_JW>vz2OYrm`ktQFzq3s1@c0^^NQq%rfE)_o z8s_Ha2fq!g*AajICE4eQn1tL;1{yAj0MF&e3b!+X>f$D?kUcG~g@;MKUfp<*2+*58 zb=&5&SLEu7)ptJ-b&(oqJ6`K&XIOSLg|(iPZ}ljsO7yP^O85PeuU&T2pXBX2HFVP6k=7AbV@sI+<7pOyB$S4U37L^rq*<$?+s2aP?OIBAnlM zR0I$JxDbWwYoa|rJqPpvAX=(}x21^oo$z(R7wju)25>E66T+H{$ z(t>*3`U@GN&RkM5J18sZpm+fw0E&i>#%LEOvvyZ$j*97m-30=)rX@vY7SvbjqxGDu z4RB4N-pp6a;`!w&jr8|&0RRY!#__amYHBNhpq03_mBz@oZ5qNyE%~^57k_Ja@>nhx zC>yDJ90U*mMZ^8rCuz_^8flX_fdH*hi@0&Sxaaqotnsg1JF(qC=5mFGP&U#AArL?S z6b*06zA2S~|3+ltECu^Pj?*ok&0PlD3kgI2@l{WEmQ*|(HEqjlR zft|F?zo+-oK;#VlOFohH0RX7=dJ#66Z*B-r_RmhgaalcVa%U;muc(Gl8bBaMj0hkt zZ=OH^5F;R=_+6cxT@tfu#4N5>1WG6bCX~HIW)ydK)ia*VvgT#|q0vX57c{wL(7Oz# zl|gP9>@9<bq)68baCdA~gyC5I}0aiGBP)V-ygeH62TUqT&Ch zVo6W6IX~UV#4=gkbj!1(Zc*z&-twM?vxBmd9 zSUi5zz9?VaitpQ{k$Sib00B@m+#jP|oJ9JmG{>^EnY%!M)~1#Ff<3Q#3PqWGmX;<7 z>DUW;xfapG_VzM79xq&-=g^A)fc=s@mmz$K#J@*K!-TV-Y19&8UUO2 zzrSA;Y`g@BI9G8m*0P?;dHAceu>_SgciPrsi&gU6b*tg^%qda%q(i&FhSfgH<6xCF zD*OmwlRjR|th@&Xbh`6Pi3^+w005Yq2B4xA81NclIQZIE6oCj(#oP*6EydI7{hccV z6^+&4BU6bT>{w~4)Vl+qJx7VvCu6+Hh|n^{twC{S0d2M7Orm8Osq#DL-;9x!WaiPib`HE$opzqbSQin{qIGd(X}0`;14$j0Mag0^D+ZLrLRx{`gK3 zpSL1w@aj`BY>km!E%$HbexBf%Vi8>;0>n-Zy-UYb>&j;hf1^0?lkH$55gfHa z3|?s`Ip6nM;3)_&`p$d}{A+vJ23c(9`@nS9N%^6P)bSWO15w~YS4$y$QvR!}qT=#; z5Zl1HUjys_6TmIV6BalYS{K?|6Mpa*&JOLss4co$ViYJGQ5Cz|EJg&7mWL$}0K^DL zDE6VCK(CYiMaK*)@seU+_><%P2w<$uwmN3o+W`30na}g_A7bQ}m=n%^FR0%~ z^B`Zwgo8mB4Wciq0GH8R&?TdxXZ!DuWyJ;;I(EVQibSVq?4v%`PLevfj~Q^vvewHb z)?l`7tFdC+P5%UENMoJB3Y^7tW1OGJatv0w$ihQrSo@|lfUhwF9$41;6^Wc|_CkPD z_idHs7)1BnK{|Ri1y0%yYRhL&NxfRqaxUzlBia3-en+R>8p(fh7=64!jy*uU`XVLM zz4vf??c@{aq_Fil#De4i$qIkY##|8FGkQVog-&F1HiF{9)YuS~dx8NzN3_qn$EE27 z=g)?HaBZ$Sj>8hnap|~7jPSYyuw?UQtF*Tq%lBu)ez=6TEeq@JG+OSDJ9XmkO-r6X zsb5Lw{<&vV^x|BKOO8X1=pc|$$-tg?wKxWt^kWcUFnUP?y0xl2!!O2-q62QeY7#H2 zLKjU!4R#YQcTZ949GbGZbnHA^$c9!{M2%u%p>vAN$UEe?qLrlWw!=k*vM^<=md<6I zj{5iM{ZEf*#8tE_x69Rar&9D(7U?= zR@bsGzYV1lM6&;lZ`0=fBk@|BPqHSG73;R+Izc?8@<3y?K)HQP40>FDNoIOFd|3e<;9LX1v?0*Z| znVzm&vdmPm^k0a0HU37i62TiAbSBSyAv6^ld$OsC>lq8VQm(jYOehcpn5E9qm#&dRlB`z$DdLCjf9cU_h?wbr&?a7TM3o7;_MP8V*h#hDMV`8#wz$NqI5 zDB?_A0aO7%Uur)&quZxNdz4u}hdTHS3}F9H|CKh_xw*_Bucogx%cYxybE}`OgI~7b zM~YiD29L2t#r#~FafO}Ll#;6DxCQ6c>^2HPdhT+MTc3zNz~oO`4Oni~ZX&jMo}8OZ z;^_e-km$RB>*W|$R5=BZVnba_Xj#lZp6e5;-K=1TR%KRIB6q&sOqKL6(1v?^q3WwH zQO#YO*9PUDK+Q=|+Ldd2=F>8AY95fnh4nD;TyJXt(Vz)R38Pv@?+Mvr5(X@mc- zXMdA5Vx~?51bpp8p1!tyEH|a!$MkZxb;D>VTVzSXyL*bTGinb2?Dix;~2+U?}{6J!rrAG3~Q!k6HJOz+9ld$rg zw8~K}s6K86xg#XN&a9i;$Mka2DQ*09E*lE~3%5)Fr~nA?V>bOZ;CQ(y0aj4y%JrR; z34csoF$;>y)@ys!&_~-RyJus&kXgvFtYr1>dSi)&J|XfgHmt(quqmLa{MMVeZj|k7 zCQP_B!V>|d5`cMRX_m;ZAxZ%lm;#8jXB1o(z_0oVuzhI43HULQ{({)Uc>sHU!Tj+s z5y-^rfPJN#?r4+)c7;TSpT$h*g5y`bBG)zMi>fCCssP5RE-?EKyq&L$j1x6quA(po z7ijsT)wYoZq9@1MQ;h#g9ym*LfH)PvW+j|w7oR9M?#Cxl4swT$m&A#CZ?ki?8_XnJ z*OVcqmvbSj*=g1KvEXyPC5AyJz5*y;w>PaYSHHD?w0HZC{@YUk@xcJlsxb)skuHGR zG?Ooj8)KOOmmj4-p5HLCKEbijaaSNA36*y`v~Vu~>~z)i>_dMFEI1v;I1{hh@!%4z zg`H3QkabG~E$FX<(`L+ZEE7g29c?jQApUIN7GTe4zudTqc0?Did#z9C19Hwm{Gc(L z9l7sqmTr$B!eBtZ>3AaD7gtlKt14wAn|jQ<)wd29G6>w+`GSIZ#vHowPs4Op(Nbxu zx+i_Av;lBiZULHh_}`FnKjr`+0C<^V8TUrc_*mMptK;VQL#^6-DJ{gcPf%{Q)(Qi! zq=(zGUe-WzG|aF}WPuSjWjzpR_MzlBmSc8xfP};TVB@c)%#{8211!%4g$-y+y6w0B zoJ(2$5)0Obw#4`Df1%_DE<o^fyrT<*}D3c7Qm%3lJ^uXz++YRG1rD-sSng%ShTs_{?Z;6??AoJb*@BV5*K3 zikkaxrmr_{Evs;8*Dm<>tY>19>}D4vQ}t=fG8{67oa)wU!lX=>zD>?(yr_@ac?`Tu zVs#W7NxpKNlF4#M3*B5gtq{fWEhq%0o40$dRL$tf>}%@Tj}ia?K*%$ucm@7ERRe?q zSK=%Nu4I-Iw}!gC&oXeuSqyQ>vl!wc%fOYIW#9`-C;vW_FVlB{s#lhim<#x8VmpL< zhJKSo1*Sf$z~syVQD&uexyOy)1|O*Zib$nsxNq};D18UxQM&QJ4{>>0R)oaj`_*Ar z0m_Qi@5idC$HZ-zcZS+;`&{*^KbEW2n%KEQwGpE#06>fYP?|w)MwI4Sg8~W>s6zG_ zP1*Bd{8KTQuL=QaCSg0aS^LyZbSN)c4+bXL(z{e>$TIMy&$7&b)LoN?Xg1Lr9msvW zW;GmBG-^#Jtz5}VZ7#rKfkpulr8!nt>H5Rmk$M0C03px0BgKMyWYQdVR77cFT}2@Z z5vW4Ug7>C_W!JZIU}gt?H?(p=56ye9T#ZDnCA~>~Ez@wzag1f3V7VHPnU+d3c#w@o zEU{ETL}_l_6#iRx(mVhFfRN{gA7f2bL}_9}RUrxys6zHgTdNX7yd?MfZp zwN#UaXwzuzCSI${Kz)k#MblCk7ifp3p()nX)XEX}dh=92>mQPcBX{iTlAow{4&5J( zFkR;U9`%$Az$kUugRfg*Vpkc@l?Uy>Me~amr8%OyQNYo0kE79Dr&h|0z6#N8^tK|- zKdQbFqjgG%D9y1+&wJWo9!os{0DzF^d?y!5FIv|pvD%q?Q>26-ZTmyr{cSXl3U^?pkG+a)> z7`Y-!@_8OWYQH{;lF9*e|3&~v1w^_q3eNNJxc%0_b}sc+&W*_b8wmx+2lB{9n8HKW4POeQSPvIyR3(jDc3YE)u< zvi1(|_sUwVZB-(K_YJL&3n<@)gVrn{qBO^Hg(HQ{D5`KgrZD>2lxXzfHV+DUd&$7& z`PVi&JZcCkU2n@p!P~K^;f~x2wf7_4?l_B0OA(QES;*%TBtR%&DOE-~DGrQ(lw{*YhaI=uRParis#7xX5*F4Fg6EC=;L&%?jb@>H7G^P_0Q)=vdQl;+rB zpE%~jJOD8QKxszfKhgRW$x?KR{Oq6}xptR`JIh%^gcN`ZwAv}KDa<{b@EiMFyt{fz zKg0nJ_<$Q-M(#m)(F?e)Q>?C~>ML=)Dj}jY$GWe2$YD089smG9$aABxe~y+(L}_B6 zUm*$+s6zHgm*@DbM|5@T`hiE@a0YGAvMqh3PZeHt25pX4)=DGp7nBfDnqym@jkSV# zleUTUsTgaEJqj;6gM!_vm20U~;?%5!h|(OpVZWyyW=rY;004wMH_EW0V-``GI3I;5 zM4$@UBTW`RoX;iG`TM&E_rHTUa*{cb_IvtWh#rM&9W1v zs#$g-xnwzuuBlBX4i?JQ39my+E4rRDYU&!fmu@b=?YxD9y3^_V}U0 z+?RR)001G+`DHGM*wihev=c+5&I(b8fGV;_YVUk}%Y(lPK$e*Rem{7ic^prKKsXt<@#E=tU1iVMU8DRhVBCeXPIDWJ~aAZXCTs7R9xDj^CDyA96HCM zy*jt(rtf@vi^xjakP!75Eo=E#C=UU*_-pAIN`reT(p{L;EzJL`jFBT$66;{Va&-IU zB)!3ks~Y=wyza=NNu=eXNHVv4g`h$x{?&AUfh;9OMPCDme0PiY%{ zeb1FmVdo86vw(=w96Q!$q;MJTy+w8Obt%#4!(FZ}*bN@WjFt$G(uJ8Y5^xtiOF&Qf#lA@VjaM@!(>9?1XA#D;lNW?`l0J$#ydmb}Twq~6@ z{_L5P@-^^jgXcUuDU$zh!=2XwXs=K}?m9pe<$^9q$`y@+WD`ONH|9Vyd1bap)}y#} zP^Rx5MYyH|WM|ltN1}&!%l>lQe?36%hJrOW|9B?S;I$6i5ZOu({AD6Ha@bhjvysrI z^0H01QSO%|+wq_1J0j4wMfb>ls0(6WnLf~d;twRGJzwTsu1zqJD5o!5iURG;Pd05N zqXkRVv8xMF{t8;^C!RVbUu(V`%LR~G5s?qTY?(c1Wi~4Au#T6z0A%h$W_M7v*S8>d zf~>lpL}dlYj!3%!q}!NOwu837YR+(Tn8-pjeq3<8!%Vh_g8ZH<=s8&|b5#JaeJ%j? zTqPq6_#6;~4<+G*w%B|%G8o;2ORLNr38dEedDgL|Oa}V`-v@s`=jpS8cIx(503Grg zVC&N?Wy~(U4d`EwihbRxe%_*X%prvTQ?{w*a$o9cFs7dN_YslX z%dbx9Z;Jq*?@&|3e;yx;&y#Rs5p-GbSepVw5}eP8Zj z883b5L*%O0hwlzA`#=|DmaYTDg*T0EYh87s>)Z!UVTxZ^xIPampB7eG+GYKST+3Mb z#?gMq*PR8wq}^EEkOTnOf?t3mcjelt zPibmTsFM%cja{YB4`%sYKkDWC&`4h#3aDSCNSkV2>$jkGx7`PeQ7hc4n%K)7o9x~7 zbC!!%=9^+(eI(A`VD-rD1)t{GW&}gB?{5P_*1l_jIYVl!y_^+i-aRGJV(z2xrmFa= zEb-))_^6crc9HXkE}{Z62ih+4Zm0KLGwpMwqZbDog!`1xofMFXEaT`om2d}G$f25I97Q8aq@F2wU z^pKR*K3953N@Y?WhT(|%bC*A(vPbf8`omyCKL0*aC!8SS1_uBpH=R34M;0!(?(Dth zvKjvHE6>a8LWE;kaxy2u)xk>nvdh^ky@(E$8COF>IB@+2LePGR7?ABV0;Sl4Mp>cpFw=pv>In z!Xt*_%&CvH`hyxbms1~&lUV_>*^82%kM3q3itr>q5j!HuE&~A9f4;dhVO=dQ&PB~Z z1pw7nG#*r#QOAR6WVuhncp_%B>|mPqn5ScWBM?Y~gi^F^4D>8@xBD2~eQZi@+k`y9 z6YM0HPaa%FO;;}i+Eqm)+>-H2?A-wosdVBl3;=}a{k62>A6%&DYmxK(ucNu(>}qku z(4sG0ENe8<%nl}Fd{B}b7_ooJS1JzMV=S$kE@u%}a{kk0fVX(%p1KQi_KuD_yc3Z} z>un|p_faPS!E6!paoyCPPZphDXf<& zIa5xyw9^qkSQz5WR3BA4@gNldbX-1Q|7|IEkqBr_z%LqgJC7v=09d(ds*?ozqq!hh z_om)$!4c13lizi&S2|#n3F^PY=jpx-ePD+i)^W2!fU(xZHn%{1)vrtl4lJ=Ldc6El zU6IcO{By}kL^}Zy`Eka0q_lKMi!^ukDtmT*n|*V$poePfrv7fVbXd4$oDK)$aO@ZQ zE}%_aU0>Fi~(@Sc$_#Cv5r5L-`9 z^ff9?@?%(G(kNp>y?H<}Nw1deW0%FC$aqYYAU)=+`sFbky6-Of|1L7#i)GK>_HpJ8 zHn0VA^RGjBYDxR~dp+;+d>qI~*PGZ2@j1csfailc^+2q5~ORuK{^?n7Q&LdsjmZgYC+O9Y{@`;c+Zfl4pItJ>v z=NIa|yj7A0SsD5|!gW^$PgJsd>U$BmV;5*h7gCo;Kl@$?=2c#UBzL8ka?$e|*Q2`Q zo$gnHN4y5Lqgozb5;}D2rOeJts_zF7U!E{D@{j5GAByR}py!>I8F)_?UR#o(dfK&( zp8f&z>Ez~qI17?h${=nDB2m(AQOzT3v{thtWh|~&5DO-B0iRq3d~pb}%aZgZ6c~RCOcK<&r}z}SxB6GRsH0Gfj#~T4Kh=1n&jFj#ptSC(Zi!hIB;6_dRNpMB1#^H z@Kyl{?I}`bo<0;AoYt9-6J_J_^rw>3FzaLTw z5ST_1)dOG$2f+rW(~6~@2vBMGfXg@S$(bW^MYo|X{)UHlHQk~+leZ_JXZ3Qo{p)_v zC5(KWcQY7Bww?&ct`i-Izo+--0RUK4xx%1D?PN*#QMc$KLN$_LINi0F-u&w9(ivk- zuRjgdq%L1#BBl%lG)?yRbj6eqoZskHP?UTSSc87X1a!GiO23|V*MbiQc~wzNRp^pM zu?A))3%&@2D~kvp$}-S94I$Idci9x9^afzgv_}drz4p2K_Gg`_YN8pY@sT~5#6|$d z4(?hZ9oehsM`q?PqoeLp!!E8z<^^a}J>}%_I{S2jRt1vDm>cz)U1U|1>zcD3tyuC! z5E)o)K3cQx1H!=~ahfkkF(_7y)LLp#u7rzifveZI}!Z(PHKYf&2V1prM&VADQ7d`N(^vh#a^o3*a%> zZDmSo>k#d|!;cMkD$e{f_*e8yqK5kcS`Wb3Q7sz~Px*SV#BWU-lK*nR?#%@B9$J8U z)K8X~90Lrr3#6m2Q%pvpG0`rO0C0m|`0xg8Hn98g`o_Et^yLvZsWF!`S2!*@+W>IT z5n5nM?vXAjG3n>a9(d5*QfYM;aOb*-gQE!5w7;Z;LGdd?!0DDnIadK+&!O()3GI0P zagt($=&ECYh~sJP3)<-f8Bc_@FKP56(EU}woru6@0<#j_%cKC!;(1<4YIihLN-Nlji$_DuJ z*8mbrX^jo5RPNZAkR+`H%oy+KEFK%#O{e6R{dx|KDMZ##l0z{er)dl&FFB%V)x*V+ zE_#ICcb*QN@6i*ltx^t-c`69-R|}yFy3>Vp<$TxOhIGUQ8Is1uQvj3vT#&m+Bb`Z| zmbAv#T3e5a<`>Pr7`_)9tXNq+m*>eVFDbJ1$G^KmezX00?P>wonOlef$~^$sN1eFi z?;G)>M*6pAKo1eM=a`4-lQh0vCMrid(mkKB1^@Ai= zuybFK`BH1&KMkT=zwlJx`(r@E5J29U92v>Rx|RHTDzZjw#mx=_;0Yk>tsOrbGi&=3 z!~mdlNvgnuDWZM(&lJ$NhRgPz2%vzZXKL|mInWbNj7uujIl3y}_)cQxnt=*4g)%2WR5q0nTD;teaz zRbRGp&EXZTymY!7*)MUqxc<>f-^FKhL;16u%Jj5#oFpb>kR2g|^(dLFj!PYqc1*xt*`^nObOV1>c##aZ6cTKxW83Sz#CdkwyxPH+|%Q|X+! zQKK=&t3+6Ce56%;l-7Kvf)t@^pWt=lv`)Ef?nujS!5hjKvn?{j(XVFOQz2n?*Dh&*0&(WQ40~+%i_y|IeWy$P{#IuFv=)R)4 zv5xxrM|APbJ6{psBH~p20U_Q1-=>;;Jpy=7Dq<6|BFcq;DP>;qNn~WsCewLEg3nSx z?yPNTtjC1zzoTuh)`uNt(@SsABV9J!%IH-*K$eQbL$V!byswn-$Otd=j_-m#eg9p$bPf5uZEZvyOLw@2#_1F?jx%Y}5_p^({1)G3SefQ^;t+?HUMrt_ zPj}pXqIT)e-=k@f)8!a2U5mgIAKWhgVrqAtCiNkqF3{m#Z@PZ7F;B_903j?7kf)_L z`mYisZTqcsv<TS< zWMAhe>3E7o>hSdfIg(z&Ypc=pTVCk=5Brxblp(S$3c&qo1riR(>{wzhfNgm}58;v2 zh0QAJ>qjJPNq}$c<7b@Q|ISDr|6*e|oY#IjyRvat0vZ|*ru&VwOR6O6wuGF2kQQvg z0DVTORgPG*b8!^;M>mqpqA=Qi4K<`=u8Dpr)B}(?HvkdaRr2H`<*nYRbdPlH1oh9Q zTCTEuOWh=Za5Ki_vQ;R36esM;I?C>PAJF77bU?1c91Z*^1bOoIj+c;Q&Nl$R^c7~F ztGyF>y8G4pv?-YkImEU7NGz0PnbEcc=<*7oHnk$90t4u*Gub{1;R9H>lrq*t8OIez z;cXN3AC(QMx&-6Wl^oa2NjwdL6`WXR2VVLWU9q8*Gj*%9TW$;WU5L}wZo)THD|NYb zO(Q%`XsAmIdySDY@WY*w8D3!yLQ5|zPm^BJLSLQjPHml}bCo%ZI_?@f++m;466XqAA4*gq`0diehE6_5w z7F4cIpZsI)D}J;Pp!ETC&~-3*4}eav0Xs#J%!w^Q#`6O6Q^scfxZ{M;Ppq{4?NUcQ zL!|5Bxaup^EH*+q>rOsgn3he>mt>@I9Nz zPO|ecwRqysY#Eak6#(4S`RY{)eNfVG28@uD({Tgs6WCm%aCUK~WR4S@JC5TDCzgG9 z+n3CGFfC_?xhq>^d5>|JC&ynnG=8D4`FnGHPS-yCNF_HeGKM`BvK8tQvEI@I>5UV& z9+7AhUVmJr}L98un~#qH!6{tcab+1=3ZMKoK4D)vzuO zY$$AAG0pHq9NGKbuURGBjKPzrFF<&o@c83Z#q!5)9{~7Dy?wlFMpKO%V`6O^5HqQ2 z*b*%O0Eh1(a9B82QgXWNbb_Ht-B|a(0v5&frBj)%YoXtwc0`U8mylH54N4zTH?*l0 z0D$ybmHjho;H*D8H-~vryG^cj&wQEHWl94!FVI?ir9tYcfEf41oCKybIL<20LB$2R z0GQ-F%%pD^f6mMc7^L4KeNc1qV>*MUW6BgS`jX*NpoU&Xfd83cvU;a@6Fz?aCuOzr!Rx~f`?86XE zzJBkk4*Xk6m^ju_QeyMfgKJ4hZFNOjWo2EhRrD6(JR zvu>g8cDQX_H+v-Pm-xum1PYKP?J540uT4}ctp;Z)a*U=_@zj@@dg)TFfy9mLx6-Tn z6eA0C{J@v2EH|L(5vg}n}@eoc~4SF6%AQi8pGL2#KwUkdQ zyd0dv{%hgAnslAXDa$406|dox)tXOW1XA%eD$@fdU(fmdFv3T_XR_%1uU-)Bl%#GI zz+#~tnD8fE#(w$$kW#+)FkwvY&T8K$;Cmut2jA^Ov1ezlf6svdUoASa^xp~9Kg%O# z;hTf1WZt66yAx{{!LNHttBOAh0PNuhfQN@)Ljg5KHL>XtFYDy}3gBt4d+8}RH_NS+ z8xM&9C;_Wh^g)>=5W>^KHx8XVjQ= zIx#i7t2^CYJ?FI~L@m3LX@LevSJyXQ6~I$%e-DkvEXensp9azj!zd2ESicyH3TvVY zjyo#FhR02dp$mB45^%y2=<-!gg`DLIgy>}#f^9t35!}~7_oIAw$b~>dwlX{C+#WeZ zm#L~k70yrnvTHrP@;dWdZ{v-_6xLI4{g-uHZ;9#>z;=}q#BSME$6l`l_?Exf7f#q> zUASrpAi*Et*60enwBq*6Pc18bu18hAWxW29FBji9OZz50vpSGO)B_gQ%g!2$ z(EDJx9TOT$XZQ7!M4Id7Z>`6F8#FR8W~(O1&~D<7=~hioGV2mxbG_%??$V`Fs+zh_ z(i6|CTVu)Z5v}Zmxc&q{TuVoe(TdC2R=hcfkw*vc) zXIqtZBuA%&s>p}Zd5Hc$8I;-QnN8}?5-L*E)qfJOq|&sr&D-V?7zPd zQ;QX{2c9AW?l6@|gZV^(ajY4b3!}g|x{|F&)?m9RlD*z~HJOx4(X0BF#@wKP{fDLD ztC$m;NoxS7Tsze{sy7N{l7%N7G+Urv?!mAl1TdlqVv0D`#?fNb^t@NAyi;&XLn`Yp{#R6T6#!FZGz zMWFx@((3uWvR?#t?`-7PLVVr{c;aMtxq$9A?Y!F;P(FcV8ICh@U#2KoI+@f@M1%rF zNUINDiykRy;#$XD{RL?$TV^KwTs4+S^uozg+kCaIO#h@gsh$ek1~49PMo}n0ga{ox zD@`~$jJpm1mnUuup3$$D5xJ)i)IsVp<@D9b?hGTp8q3}I8UG@rDn&(az3TgY91>?6 zKhg!8zwZmLoYnT3mw40{Z!g-O+E%{u&$}Y|+)N$9gu$&DZJPTKQO~HKggw-S&Tu_t za7g(I?inE7} zMHV;l#v6kL$$^RBKus91+xW?C%jby$){r_5bGmQs;@YVxCC=R3*Eq#pl2gWo!!aQW zB>u)^geU->X2N;Mb#q_F=SsCSJHg}z)Z7Y()T{W^)%NuOzfJ)GEt%O-7U*S(!Va!4 z@=?KPFL_@aOGIPSN3{h#f#MurS~b1Qp&4nfSgKVku)S*8tAc(X&+cmSSQnV|dj~>0I>6^NsZ>#Ytf_ zF1RmRa^H9!*9}EK4*;+*MDzbC!+i!edUlrGI3?4Y^_|I#GGQGdi5%g#;S5MDUIN3H zZ1ks#Br&2YF~~bu27EOIdVdXpuTFeM$TN#9u7g)5Dpn1jzMw8tWkvNGL+&63C8)qPOskyZqtt;dO zRr4aYXD?pM&aU|hBZ^5y-TV$Cib)l%Z}D6^W41TEVM!KY6eR1k<>O#o$ggtEJ|FS@ z0NK|;RKmBUCuMo8e+N+G8n*ww#{@s3YvKllH@4-@fgM=I z`~A$elLfVx2KA$UvMdttN;D7r=7SaCBr|488$W^!NX3vy)=}>#5yAM@<*@nDn zjPcv&WdRaC2hMz#=t`1gH?Z;3pW_LSR>(|8!wrwwN ze9boLD77|RKqern0}ymr+i_2ANUI%djGQ0W9dXsHS(+p)O&&g;EMcFe4S=oL2x#4o zZIz%Zb>y#ANqNx^waIaX8&&?hddmf_Hy_>UG5e~o@Hr|9?M43QPpA1FIgt&Jush?FzzUsheC&TXO{T7@(1Ep0I>O+V9;zp z9CTGf)eGlF1uXnYac6@7Qb4W0;Dt`!6z|<3^Pp>L!-VzuLa)m?Mw%|4*hyCb0P^B` zK>zKdiT;q-3V`2x4WMaR7-PSao<)GQlTn=kw#=D_(tWyYjk|VpZ&V0)P26A9@<)gK{K5ker`}MgUWqh%i`ODN&F7gyJ!=nTMaQX*; z=B@HPJWcqbr0@R(7=8l622bAqslPw@)*3Pgb&OVta7iowmv@NX`Edemm~J6X9hfB)LA zO3A9MP3_{K3e~9+0HnS`slWUXoBsD#GJc#OT&^PWWEEiABp(Ymt19xY#LD?bxKq`T zZ^(UFD%`DF6464G?*&4ARsOU~OvKBD@7q#tVDT44o~96D+T~-IVe(N~6QsdPY1NoD zkNC%F1q2J!MmARV=;A=AR`JEFAbG-ulRV^3cgm(7Rp$J!%aWV_7<^g>ReCl{Us z=wkO^AuG|4b1Ug))#R*(Uyudx&97ffl%)C&S3Yhg6f*-^gL3^bBJ4^cgl|2aWjz%^ z1AS%>xAl!u-n{zlCG#(;x3>dd)NUX4C;boM=q0KS?T~_ogUQf?qm7gc47~>n)rl+l zXeH4WQ@y*Y9OD#A3YBS+urW0h#M?jlr)(w=FPPw}d&;Q14lSaGD@gwo&lS8Xr z%b&f{pDOkLE~7Hqv`FQJ_T5MlFvxwMf=ScOxO1aOqI^Qel91&bAtp=6Lv@CfxZDW; z9zM<}m;N1B$g=#IZ{vq1-oo38f4O-nKzexDM{MYfD@Sa)-|S+*YN^KIL#aT`L`=h~flM?VAhU!prhO1WSFo1f*A13F)0AFCqEy8v(-yysCQn2;5_(0QKI zRcqv*n~>5G;FOz_^S8Y!nN*aM0WiZlp#F)>{lct_ZOg=eqjsWuFMGTpj56o8OIk;NztF9>THpV_8&CHXWq9IfTyE8b zbzZU#Xj^&imklbnEK8@aW|9xWrSxHNj_b4 z3jiCxy%jFdfI{X=PIzA-T^Y1jX7p(oq_s;l__9lz?1ldf0k5${>L-(|gg2F#+`0zP zQUcG0tTL1AdS4(HK2_$jf^>V(735o1%z6chmr185r+46HKB-{_VAUprWNAg6RI;B- z3`uO6nu%HEvNWWt+lgjcQW}0Fe5&jPM&-Gf_nvJ?_*3a&7A5Zh!O@$MB|TY~(z@XF z53psISo^6m;?C9?fOVinMJob-JH*8dr8~O*JMvNh*x*`#ZMX(HVU?wp969$Jxjq#I zaDn>(?tuUysp`sQ;=$nHY~1n?Alx|kKTBN4B0vnk#!hNTTquYS-vjB^m^ni?Dj_OT z!u0kr45r%$uw#3VJh+sO8z!XuuqPFgs+RLhjw-~nYHo6^&upM1$EnZr zT;EDaPWwlhcU+!|exCc+%yW4r8g^a&FZ0CZwRE$y!WL{16??nEJRi12#-!nOU_4T5 zUoYW$3?PrJm5j*W9J5sy0FpiyFwkzO_M$wTdyX@Bv0as-W;a!hf(>jHFLe1%Bp(tB zX;mv`N)PAh^N=r_Sm>~ZGB%|8idB%^V5)MVO|`ctGpefWzPVmN6WAb1X7ir46f!KW z)O_ci;NYyx%SAPd>My;p^P=Wg`LZ)9Bc^yR9wfx}ut$XqOOCiGa4MNc;=wKvGA+4X zQS=`#^^HyahI_Kcf3CUZ?N!N|EJJygcqU~fWTJ$dTMM8;0HG*MeNL7LIXPdik$dG4 z@|yKL`Hx0`IqX4Ydt!LDWa^jX@%2sXN~|)ib!zXgw6QRNlCZxj zXX{@Fgj(DK#bs4((mAm-Fz94-&^`dblUvtIwWhUx%7s}-^CUAH|6B8P&*He6vt7ue zPamSs24VKp*Jz-hXL{~SU$y;rGJa3~gsFVnOH2M!{r_%r#Tdam&gJ>;9@`%PpX$(; z$e>(Jk9z+20{ao;=ci?^>ZkwjR~bZ`TuA!FV{frW5uNx%d;EIvtPi`Pn|>7Z%NM3w zRRya1wB7M{6^;KrBDmanF}|r$f7p-YZo`e@`E8NpKRapLs-pYnN8Y*H<3TpHZJKNx zR;129*8$k;4!m+Cg+l!gMD;@;=!v+v=Dx$DL8#Ff$QsjLDKu56@%|dpBhkTT^q&;R zsu-!anSP-3Q-~AkJW-V5c2y#EwQYeiMHDEe4q#JP<9*2r#8dFGS&FR^Z{BFEkrkSc zYO$$eIDW(8s1&^pG=MC+n5+$a18eryPcwSRk#>}DfTnn<|CZo?IviGHQu2~cSKwjaF>JOVRM*4d}BTNK^8$@1%cTiy5#o9 zeW)TkWw|O}XhfXql48~UFD?$c80FU~g8TfDYL70i-@CN(_)9J1oWdUU=`>; z{<$|LqFH-sXr+)^TRB!EOI@~2S6_~kO|wGPEt#8j4GOgG4Yvg;)Zl3Yty7v}ZG1uP zY$?CZDvlK$u+;y1EjQqpv>c*xRaFgm9<%kLfE@Pzp17W|uBjx^l0-Q1V1 ztjcWa-O#t!fMcM=j&nuQvxO`T9J<9R{;bM@6)M$DI8Qv+3?Et$HfcmnH%<~#@zg}qyq+f%|^+5ss zPM$)W1Onxg4pk5aLgBGzU6WBvaCs>B5Ku&XgM0i@C1OgYeF|Nj`gu#H4d^}%X>eNQ zSO^tN|7XXsqm~)^-3;;~#fUK-$bV_oz34+gzlQ4Vp`VWPz!oHTM1pl&3?DQ9Jp?fm49s=WgPz+Qs3~zL|}|`ZS*P>2PG|eR#GYV%iiN zl02gPGlIW^49RBTL!B6uf2a>vRn!F7s($ZQ!TQdP6u4eScG(7b@rgS-oI2!HC66?D&PkfIktKg< zIPwjH@*7Uwk@=SM{4K!Zi?dN^c&8+ZAAKu}{<>JMFgXm3Y6oBlL!fk>;FSpoT}4EL z(eH1H3Lb!Q^U~XeRsS(rbsj?)8k?DtkPJZh;94bg*_1yaPT%1j^Sbp({Wihiw}*~} z-7fA*`Q05^ft;N5A=d;T{W1Wfw~wde&Ta$59?5`&ptkMU@pF?>-a|D#*;3D}k@_CK zM^Ya*A~sJwq8p@`RK?`?Vt=mWTxc3K#OVxQx3Zzxk@(A}U1$zg!m*c4+M7Czr zP}9--nT^G{bq#>tx~BspqUxjHv?IzE=JVzFXF&o zktF>p1^uW)|4P+vq>8MZ*qsJNRc`G;UIQwp_9TP8p4VabN{B#wi^9@FHbs*wJAcNW zUfy|7>Z&~U6a(nJFwl7rp-p;vU5kHwT}o(hdHp{89WHn&lg4gi-w<@4M=>2fG`J4C z?iUh7f4fk7fZyDN&^C5?y7fSWh!KZ=vmyPeVZum_F7kGLfmWvphUbKKy&@W;|HiIG z_s~Az(S@*8Q(Gwvoyj|nw95XVqd@m}q5YU1yH^gvD7|-L%Izud{x`MdG`!q;yKn(a<;RY;r9 zS-;@`K{3tlrs^$6$?kDDGh%IBjMVV;u+GvkV;Nab2a)wOjjS8=D`7>}fu493w;j%C zX|+WR!hje)oQ>1M_rsc|kv;^mGdZ2VsP{$}zyB(CckjMK*0Z4hsux!v(7P)T++#8H zJ1wGJV=+?nXhj!r_R^yTu?y?8K7$LYaShpyi&K|_UY$|1u_TTekLn=xoxm^1$j~Bq zWj;Znm->&a^|H9(Qyw{~u}rih$LMCj$Vn&>&)?9nF;_ePV5!ls&PbWK`t>#*AO!mJ zE@r={iOo0p4)#=Y|GVE0>KqCf_G__BRUP}o(}+zENK9QDuMZF3JtByieq*o2gG($f z((^a5>5$6xuxJI_-fp`bp%lL!lRT@X;<)EA>^EZj1JeojMb|kp*N^o1n6LfT;txyA z=5e0b1pswWH%0T*@jO;5uL1t4)2-!A%-+9SZVWTf46BYUwD*!_^CXJ|OCU_j4(sj6 zFJntys-+X)cTTu%uRBYXUh7IVc8>z|3UFmXuYazi?j6{)#- z^HWS$oD|_i4KsMm7my8^YUh91auXJ1I4u ziNFlX2lbgolAfTlb*-5Qfk43dGO^+Q!I2joRtt4Dk#<&U+#P}OaE!+TX(VG8s%*uS z&WaES1XMz8clf-Y{69EgMw`sf-?o2bCh^VdO3zL90?9KSx4xwIhns*HuSa0K6%*~d zNTchrXw9iS7tU=0yX0PofnAhBBHFRp!f_h7B=eN6_5gBGF9dC7c z$!>Dle9$(*%q5dL03e^fLj(TVQ#d_Vb#Xz{r1nIM+f!w>XWG>obaeY%r|1SR0vCDz z8|w5%4|@}b-z)dY+m$oLCc<+Mb8KH0w_RN7c4VZ?@tD$80Rlm}n#O{zSxC8xbwNwk z66M9jR$w1kPcjvlimaZno;OTrtqnvyLlY4mwYtBbh`w?;@f3h=vtRiEh0x_G zorKVJ(wK_PWPqq7+$=(_s-+EFVKz7D4>g3Y3HafDp!Ihi%}qw|v!=vyGQv>P?rI{0 zfA7&5ljquLzZA-0mGAlY`^~{X8;3A($8RyCGup>nnak0Q-)bFmV{&jCVC~?V*01xo z{~3j?(hG@ct1=>hzfPe@%6?P4y8c4e%jafoH_w>~MM8~F7t2^GpExMsNRV3o4?KkQ!)#@LcIWoMszG;>fjpf2RYllYUO?cd~S@oiab zi21xCUm~v!3DUa9s%~gti^xl#N{#z93~bNRwEDQ*j*Tq%X(0e_9W(PwqzstUqkcbr6-MV zib~Cr{)m@EjKkU|0T==lmmcJKoI~1h(_mXd^JpJ<@UrO(CYQE(kTc*Pcw+> zrl7t4#6iy^8RLDK0~Ngp zymVm409e2+z(45_AG9Ub2`wK*bJhk2Fz{Iq0OFdtnHZ~6l^89zjc2Uy%(g`_#FmUl zM7-->P|!wPSd{;y^h3m?p<^XO1pKTu854rodyv&uaR$JqXivO-0)odhL{Pb+Zx$M8 zhuSZ*bXEnMIW^MJBXbkPYjulg`DVIHG#x?L6Y3@TEuM+ znd~;aNbIpnSsz?3Ef1C*@u;P>^W{9ua0i#03(zpAEyGc)TG>`vE{WSu8>h_PKlI-` zl5LeQo_|q@{5el0Vsh!3=7^*oE7G~CzO|}#jagi&etn(A9ksjbHfCFPg|AW;chtVF z+c;AbHpIykX&JbOuz6{f;kzeS2PQ*8mJdo!Mu)7tAUTK+!Fj|87bmA>L9%pxA|)hR zu)I9E#;?9SFT@}(MsJzx;KTI#Q8N&Sb7#bm_lgu#860OGFpA8ScFE@T^y1M=ehx8p z;-$fUtY7I_aYD>xA~Gr$aB4D1AM=uRCMpBGDStp6)5wN;Ue;kn%uOmq!lKj; zv%B0B0rW;Rbj~W~1N&@bz_w&lxYR!S31$rDNocygtKi{vA!da%hjT9j)Rl%Qnzr^f zl|0=FsSRvOO7=a^TEu*zkqqWGGMH0bCKdL$OA_;l-sI%e$dC3s_dxrxrVv0(zW9@! zs&H~#Jh|`2-Ke@VTcq=e@hdMJtbB*vQp}bz9vu|I1Sqm~9ZRY14NsajOZyBWHI9{5|lk#H8tJNh!Za zRckmkADR}-S94=5uUbj8dyT7FUdT>=jaB)sh}6~6W_vYNPOR^$QPl4gca%;=Yh!L{ zws!A6u!)P{K3S)`57}-0+JHs;Ya^|@0f5iC4iM6N>N*_C9;=Gi%>k4FvuxF5zG(6F zZ=QzG?t`km5x*rC5S{+cRh*8bo8WA~h`8+bB=-$u7kd_}JWjn^NiosatM+icIrf53 z2tWw{LXmkwyepzh*oLl>`9;}D0TfVdOtr;jj>r%Pze#mZ`?CPR+6M!T$A4*__RDb) zEAIi|{49*vvwFxXc`>KTgdN^Fe#NF^zj)V`zIpexIjYxUJ<2OFzB|mxXSZd&1tX0& zqXIdI!+O`)H?ZnLtmD4=H8<58u`6OIp;+-yj5MZ!r5C)IE6hC@lI2aZRkcP*|y@``GEv>;#ZPja#9dTb5)&^`RH>9cg^Sb~PFL4}1}N^>&PR7C9-{PAnK zv3g&Dwk#lnNMOZ)s2Vb`OJ6K0!@*k380gO}4kiuGMn?<7Mt5^f8gKQBGXGHan z4d>Gz4S!hJ5-*;R8r~v(>u^P&ji$9~aqmp_ds6&k9J+w}7cn04Urk5JwNP!JB0&ry(MS_}hD8oA&(6gF11@(tWiWOFUd|{GAeS5%w^Sh7Ev!>v>2LT?ibT^bX_j( zOs9oO@3g<2M~I9Dpf-6=r~S3O7{p7z0Jv-zhBJGOahYEeAythYksQ6+q}A)!Oma$b ztN-9S{Qr5?8*3Z}+$EJj!&0NJv{3t|E9qG28esc13mMmtbJ`PZ8KQpagt_Te*znor zYcDRMzH9Z~ZU2OA3;lTC3O-ncsVjU3W@#7&+AK!A%=wfeY5Kix-m;M9WKc%NsPlP6 zY*x*w2l_hVT&F5dvks8b9pD_>h+&mEns-pf|9uNkqNc&q@wX3D{{L*?X$=*Rm};K$M$ps<>+{(>LeKFMqS0g!fWkn1q))F+wvNK zzq^~9*aP4^`!&|B159C5o#%MgS*fXAefPv$rq^$coaefH^#aBGYU{ixA#pY#G0L1Z zc;n0NGZo8ob9D};0NLgD0l8J~Elq{xoPRJtJBLCf3+A<~|UywuQRe7=?eMPKMwh49B&J}~rISc}? zI}XrLTGbur#=b2i>o5Dg^DXB|ejgsCcu_0>myrR`nqlvObLZ9+yc`9#mCp1pZOm+H z$!O3mJ?o2E$t;|4->2tkuNfIv|I$wra#vp3f;jHP zIi+6U-Y*&IH^?gdA@aSbX5{M=JX@Z14!?`wZ>4taM&eT{lqm9w9gP};}MoK z>e9GNt%Ct;=AC*`JV_+<*)>5xwQm7s_U=m)e%k;9x;2nzZ6Z(MQVGS_C5^Q;xGHNV zkxkM}^$T;d7m{Q#1W;155kM1X?QQA}MQhV0H=3T#UL&ZfT?}88NhVO8r|^ z6Lexx{O+tU88lS-Q}97PeX=rH&4WU~NGq=FCzA3;2VqMyR4eTwWENLB5rLRd3`Z4a zQREw#$!r32!~tTQGu((}V#w#{;IOPAO2%=Lb!I`?rVNMjDp}~2e6_$NrC6vku*OZv zFk7(`P358ke}7(T;@1aefN3@Ys>()??E>g2qSUyf3UzMw(~@jjk^R+rx-tIoH9$fy z=ot{QMd<*!ra@^u7K91}|A=2uTCP!t{?@xNaG}Y7@&<3Daeb?+%oj(s^B0^Zq`LY! zfdSdKEr43@A<~IGsW?+esoC>u_)%l}B`*hh_Ks?3X`7q2NGqFR2IceWos^wD<1&0y z;^l~!l2-3ig&DNTz0`g|KWyOA09(u9;c7+LvsNQz-!M}a_9}#38IAQNg>Z5uQVL4o z+$Tx%qaJSDk=WJtF#G%Pu!DBFuhO`%(SLVrwiW7+m=ad1kibypX<86AUQig97M62K z&61>k$;iCOXO>SPQBp(!BG7tvbE4=yGE|Ox7sW0`6d(evO~0bwj&G39qs!5C*CMFP zk8?U0Ak85+Yc$!X9Og);zd6&N2ROMmP^XtVlbm%l-#HZ6!S+w$W2@(xeWiKkSe^_0 zk$Z38U$SLVB;R-IGJ!Xg39l#N+mZ0SNTjh=UtrrMY0@~mJ(eq(;vNVYv87)J2rkl4 zqgNg)Wzh_y=igPe2f^!WdCV1F=Cm$B)H#Pnr|&Vw>zQ&on4nNq)BPCFW4l~L4|V0M z^}{JppQE4b@Nt)82WW)TeaM`t-|xMVlarNi<`1VX;1g}2msT0oOmICdh?;LE^oqgt zxJRU>*-_P1z!_o5)i`xI;1C}HhrB_5FRClF?9ua*J_+4CgO;p(%j;}P+c%!Cwb3S& zgD%eY_l;?1aZdiyZAQWRpL@K@R8ngX-Ec|qowl~l5&;pZK!w9{*C&Dir)!|uYY4V!qNZYc9RR;b ziMNxSwh>%XiExK)hi`{%BNRq2G`$>Lw+o#Y^4YFd)BnU?P4du2K6xsuvHr>m^g;?9 z@|*P|uV%_9@t1{ZraP_za%;PRpRK2XzW@J`&n>|Hgh45FE{Jn(M}LJkyH?%ok^^Z_ zwu9ilCL}rQ1cAElWp>U@JxxScI)6rw9=exjj8BQvk%iuxYPE8h1 z)}zF51i#aZa;VaTM|1$6Fb=F<>?=1%jx&Qc_sO({!wb~0kVCoe5g82bel#bpH5Jdg zLZGWV;)?p-0T}q|T2;hjlgmIcyULCC5G&S;AH4QRb)t1MXV#fnKc9QOQ1E)%zrJUW zKqrI2y(@{b|4aooZWJFO^n4So*+RwpQ|R`VamU4c))?}}zjg|Rb{&?v(|BjMaAZ%_ z7~1K*g7L;0Chga#-A%OD2fs9fd@A0x@sLn*qR3WtvG#X381t^-)ZsRovL8Updt{U; z-x2X-s-BQ0o-?^9g82&%WM9P8RzcoD&*t z(T0%CJ$J!FO;MFuQyS;@G(v^W?+d#iw9MVRWR+pkrGxK~LD#yXzkF=hzq06x_y6KX&xZB-olTh)$pEmh{@AN?YTu*xQfTm~UT0GLkc+a(0 zXQuARXR`2z-F2?Yh|2CpcYkEMEP?a+FReJwWsIo`5=URa+946``lXZwaA|1wzaKa`bmes z==|Tvqtlu1?P5REr8XV*5pN<%fh$O8GUJaPFf4 zcff{ z?f8S>}%Y>pEI)bN?Q@Kl9sNBoQ=!c zPcTfE9iqDXbaxGaW}gHzc^#Po^>ksb!qcZBEuqoA0+qIrSfleR(b^bKv-J4ria-;J zaIx0P&$|?F-43uxO*c>j%f8P*kE|iy_Cz0Pi)p%D7Oo#0-RjU6n`A1|-A=PX+mz-w zJvZ6eQ@l$h#EqPc*|Wi!L4!T?IL|M>D{-RCJkzORy?@faS53qpCyy2VnXJD~(Jjs7 zL|~XzFq+oSXpb?F5dhpUOCATv`-0*+HRHCXScBaR(BqeRL%(EBY zKG2n_=IVEI2O5-sn=SaEqr1^+=>k4j1zh=q-<~el;!%HzE*P6(*_L6t%s=?VWbTG! zdLf6~Vm(PaHB>p<#v6hMbLqkPmx@D9bfw+x^@d=z4a-jS@$n+TU#r|p{c6nzq?Jp* z5eM6#-RSl+YFzqBNV6-x(8{SNwoHG&yxf^Nzep z`=jwAXQLHq?YdM&6u{(%p zc^cv796Ss}oe>InUMEiwGqE2!(BD?xhNV0*VdZi0nxP zwHC{85n}$+TyZ%-<3w5PzjR|`iU0=p*}mAT^k)rutZN7=XEN=(hp@@Au)%T$xbq(Z z3i^KT8hyFn8a+AOvGjW4$DlYd4UANr)OjPpG4}?=XPb6{H?v6&b!`7j84u;>e!orZ za}Lm*pWibsmvXE=l+qFZ;$Y>>2L2HTm}y9PNvqW7FY{EfH|fGSHwX(H48j5jgOFf@ z#{dHP=YVm0wz0ps-BEcEgrAN5!**FVI6|~IE>FDn^l27yhXgB-mpkUUO~?C|z4@16 zL7uZpVlrikUkRKlyHTNLEAl)N{=DW}YS?y67Hi)vHe?0P6RvbP9w8YdSb=Qcv6xsV z`P??$i2cRtgJj+{$7V!N+3uXi{dA97z@bs})pW3A$@YY8_S3tV zVK%QnzVBJN`N9xS*b&nH@5_udDVk6iT9c0B014&%bV6~cAU$!0x9y}YkK_fvP$%pS zt<|?z12~L~+nDSr?ViNH3g0gq5EBke*dGq&?tKJE(EDYfj@xyC%z=r9HtzO%={DbN zp4w>en+c8=B(T+4tho2WgN747stBhO=?qM>g9y-+dKG+sL!*PM^^etZ3tGG;++M>M z@8ifZpy{*PVQ?uo9WzRxA8RY3m}1(TqQ8V3>@+J$VaV^RMw|U(_zA5_f>i1g=}}^3 z!8+Q%uJI}*G)b@h`KL6H$G@=6YrrxdP4N9?58!`WAy}&msp~y`F_ZtvR&1ytd&&OT zfXtWaGaKmwMSc>_3eX3rQJ5~=L~?UFzFE(lMtv5(6%j&RWTnffLUz+np9fE}y$WR9^=;tZkhXIUwp24Ux$6WA<}fL(18nh5a>9nK-jb zuTK+QDnHUGb7b~>2O8U>3G{M)(Z7C&XRvu&$eNUxe4_;QbX30~sNEz8l z!vJ3@`NQ4UkUXtCAk7OyX_y{-&nlanmTC5dIog~7nqBx^Jp)ZC(YCbX;*pE{EbfRE z=vf+EJfD^&W3;NpY<=lTw&nn1x|0i^N$TXixrRgZE-)403p?(2B7E9TQFz8 z8W%d5X)egc*&wA97oB-vjV>^xxA_MoZd-7 ziapc8$Qfo13X}_g){m2@`2vUL-(sG{ zCp|D$Y;W?A@*m%T}6nD!^w41%zc+%L9qg*!n>GOOUrzTmINl_310NB5w zl6gTnd(+WVUM1I?w|XrU2)wLFxbtZ`oehgMuw31z-+{a%8@>n?ZK;?SAG2X`2-Iq^ z9K)gyTi4?~HzFBssK}E!>r6_P6r(#^Q&N=t53lat9I6SH{?9lk0E*=XrDz$aFBLjM zkz?lkXB7FG`o&Y1CAV4wYUfGFGJ&3gr;Q%tjM}@?}p`EmoLrF}w*tWZBa;R=iAw z9Zq1d@WEhFxGHN`-71mw$?Vig7^z%5MH3P$H%^m#QYA}`ii-Ui3QL}DC-eG>=q#!$ zvx|yzfmB7AXIc%~QJj&^1xh|wVVo!J`AT#N^_EoDe@2a^mDQ{1%7qH^BK>-Cx*9{3 z6=hUdR+&~#<>h6w3jWU30S!n2;|H)KLB3Co0`nqt?H9bJE%!4Tys4-RDHUUy4oc(4GtM%&6aUomX}I8L;qw=N3^}^s&iUy04E0qz1jgr^ zt*VI5=$1^~<}N(~Xm|VzQtCAl|1B38bQZ**`9G@rpGmL(H4h#W7`aox{D)`83+CkO zQrFG~8pi>x7riVP?V|i$Mt9$B`2}&+33=h7FYLx(;j(z;LTPW-2IJ>`1DP#2My@Z9 zmln?knOy1&aO)Apo*gGX)2%Em)<=u-oIN*yEPbjDWvLoxd#3f7Vl2kArX^-y-R9-K zAHG*0E2nN-jL1Jlk8It$RYuG0dI&j@9sZ9S?GjoZ+pQ`B8BqId3(XS>C$dZml0ms| z_9&OV&wnVXJLY9_y@_M?%f?-LqbF^zJ zz?J5MsJx7JbiSt$y1moIe!8$yRnjI=mpyy4SsU6moc-%;df&8UCxRXRGScGW(6w`rnf@WN;7>T_1z)PBvqx+F zoo;r0n;9U5FEoSv&6T(x?raII5AXejjdy_=)5FnhI^DgD9uxAfbkAMy$5mup(IL|= zz+St3*k$4N0&0A-tHIP7EoudD$j9EZY9ilRqWZS=eo_tJgWL;2S*<_#0y_=}rn}y6`(K*Tw7s=)NL!{E?TwP> zr7zIq1CzZ>rIUe3D+Mo+eO^yb%sPBJJW=-Ii!jSu-BP?vZTuTw&lyuX=TiCC2k^Wo zXMJ?Y+OD7FlX!mOqdE4L}-@lpg zrk7lma_W#?(Esd>kH-%7jI`fkE)o+fc2xm^K%h&lOwVHhK;(DlpL-}882?S>WvYQ0 zFz!wzR_&@f6%SBI!|ND`0AxRp>WrcQfNA|Q0J;CMz=*4h;pd6|nw&kjQa%e^7KKTNhtVE`x#5*Sj*YNM1BXvxk?c3&b*v#YU0(mB+48m z#@hlnzn_wQAbvfUsDLPbuKr!2UU#Ry^V>gi#OU;RyZfw5 zIYJ%?6zf*xRsWff0=ZR(jGs38{~&(xQ;|;?=k4%xa{}l#mOVtHN6V~i&=TKThUHwu z6^BU5hZ%Y~6(QBcE{}zBg}ffC8NI9kz5n%DvhJ~LX_+d_xDlqzHAqhHN20N{PUET7b^K3sa|f?55dP-Vk!NMq)slUK$e

    !Uo> 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 WTa&#NaKf_XaAfhVd$ZHcKE+g`uL^-i!c0> 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%0AV9};0Z`7RGENhzYoo2)3$$p)!qi$W9R8q1Grqf7 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%0D?; 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®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

    XR>8y?FwqKm*06wXFptzK0s(7joupMf8{6r4 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�b7mcg@og)S1q-3up>{J z_C_V>ranabeK-N_R0ZwSlyFXCmQ^+;ps5^FWP_j$jVL^nBcM*{l>L(?Abi&e93`xd zFePbgFl@)CXE2<@RlDCF!d=M#3q0+sXIrsQNK8E&US-`b`2;4Z_3V*FL2*E@3bWXE zNkfaRC?wz*?uR{NX?Eodfm&NE7Z@i%Q0B9wW+X^RcCSP#@aLUrh9RFR8stiGnOdub z)|kQ2n$}!$jauV4sMXq46I&x+Xf1EHHdWf&eOuF^oV_Dovj6|etj|iAxRmewe-H2sJVSvhD z`-voQ{fP`{gR;tx6aGcar!Q)zovqnowD@{Y>pB^cV7L^y9XH%Xsp^ z7Oxz7`Kvw4-M!VwP6!}DA`-W4WtDE>kG{qLG}Id+RiG7~wv>y2goObb5LR}_i?F_x zTGeiU0Bs9B*f!5bPiJ#8)LGFy1qf$V#a|*VLli`QZhAdMQK2yJB7k2X;Zd`wk%B|% z2;g~-x^gdnXjb@}nN68kG{*Yy_3*(gpVTrWUZ{YM3vWl@?Ll6E-3Qb)H^AcuHkC%f z+i3Zq{mNiA%w_~Gz%38JQWnyC`;SLy$^@B_Y^oWTNNviisv#OPmakY>i|=^1G%Fm4 z#cGVq`cr3CG$XS$Bl^IMph=i#^XD^C6;4DAsapMTw0)?Wu!=QMd^Zd}0X;Hb*>#hw zW6WV##=A5{-wu6IrRtDDMILp3Ae=DnZATFrqW%dv%?!RWG`DK$aS`Nk7$#WQ8v?-| z&cAA&;-=OQX03hy%;vf*SKk&3n=7tx z)$2Z?*Mh>HZZVTuWkKAO#mg&OdpdP$4Mm(GVi0Fh@`c(?+7sD1bJ=U6`uq2=VvZ82 zBo9$;KTu>?N+I+JsgV-;@~R#_gWk36QQ!dXOgkVg=)oEMtoh3KfS@I$P#!O)0*lQH z2T}a+CtpyX@ubLZetwfUpCY~#M+R75jZXC|flpJ9fE2xV5+(xLYK%K%2~|32V2TW! zvynE7e9AF>fiGykMX5Pa`}JKLkW+hIU?g`@X#Ud*8bA2uK;sj?9B8cmB|xL>;ja=j z07rqw=YL~CLlgBRK;xo-HOA3nyIq2NHM7Yc|4+avoNOZXZE@fBFLL$aG5!Scn6fmx z>iIl*gi_^rOgTP(O!mdsgY6UJ`9<&6eTCN_1pkWdhh`Mlqa@}b%l6>WBBEoJ6c;Mr z2P~gFZj)lC=c{MC@SxKMl2BBCF~bq?WS!p+;l1@ejKqbRQ(Q++7?pmc0vfC zU=Qh?I1*oG=|S#zun^PALuhIAAf6{3ML)bDq{m2aByHZ_{3V8(>$bsZx-Nq+xLEu5 z?6#M~Ss|(hu?)s17*(^IU0qEEyJzN~V+@ps}?7=(LRB~|OU_HG|A6X_TIZ_}aXbk*t&HDo_k+OOc;Z@-c zTvc#y5EIc42s}i@MI#UPPb5)P-dvqIx)n~xbM{2GO63HuafA}_Xm4|_IIF3iywX>x zKu92jl4Z0(MuSxV!6du417kR>v1wliiL}p;xXB4+ydC6L zFT_<{&ZL+(lB`t3mdJz!!JR*^>czFMDw3?>7}0s_(!M0YZ=6@0jq)pKhvgAZCA%43 z2sm`}5_fz1W@vu?5}YjX1S2WbPfA{&DbOHeZyi{b^UE-3C{3b-7L231_P;wrS#gho z?I-eHgc0sYAPhB!eyC~`d5{{hw-CC_QxHEp2DQ_g9PYuGJn0FLFYF3qi+I68PdLQn z#GLw^JrWz2SWuElaLrUvNrspM3v)uQ458`vO@!&iM8woY*#&O_Y}2iG5+<{V;5L+` zNVq9xG*$r4s#myr*nF?6!}-`INy51BUTZEwK?1In;&FIREtC2tIgvHx1ktVy!Zttwd{t*+)H);b$oU@2n@Oy5w+wyk<;aUY|}zOvZ2E=(daD%pVr z0R~i_4Poa_nqp!lz$eQ>Mj#*NAu1kI6`%Rr1~-2H2PVVTKuFQHt+`p;^4AO*JR&}q zk;^OxtRX%(Oo}sgtLrc4FxVt2=@|sHHgiIjrXt#|4w|0{&OxpoT)#QIx;ss43d8zV zPC5eyNL);~#>_&+`7-~eHBhs#IO1TWcK}jZ2EKQ)#xOPIt8zUsd=QM7h6IsK>NW95 z{nZrsz}Oin26X=xd?<=%zr2^R8!ug`dQ!9m%`(MA38rnBn16l zX7|Q2v>KN-n4r)l?Ts46AZq+-X6{1G@#pc)6>o3z#U7d1ine{(3U#R+1UC5j&Z|HB zCs8!|68*WF2rR2kowgygtRAqA)&rLDz&V8xy5`v`FgeCTvMz)Q5DID22dQHMfbNIV zq}sf9SXRlhz_mS8&YaBzrW-6Yb58~#=?-ls0*=PmaC~`{f}7%+n8zrA&gUwOa@QmI zgk7I^Yh%L-x6bN$V0&8AgL~pjrLNviCJN zQd|8ozH`(dcdO6}s|_13C^R?2E~s%e`}yB9bA+FG=NtNy1NBn9Gpncxnm6j`3V5e0 z;Gxd&+!>zh;kmA7P$TeaZ))_R7~ObBgfYd1{A3Tl4)S`5UgX90=8N0)Vp{QN`Jy>r zPp#e9+Ff1890v<%+vrT6?Mg{`T3z}6bl;Q4y)s`Y!>5ZvvLp3_(VXZrsR5Bew3zD{%baR2ohfZtosif#8Dx}n7muoU(#RK^uizZvTT!v@^BheG zOvr5xhs+=)D$_!zWMSAVs@Ka%_=)pAA;Z4Br^JKi-xVvijTs%Y%2knh(Fv|6Ygq!b z00DiInqu;}tw{$=ko#TOI+=~x)P||4F|U$)0bL*-qTDJ_z`jgTSaA9+kZp@cZ-0Q^ zzgfBoL5r28YVAW=^ry>+nqlM_a1#sG!08uwg_QEOv&}$X@E9@>UBQ8eDw=sQ)(5S+ zn*pn4c`^MI;DeX!FO_Q2nM69PUXynB{|ilnJ%%=W~LCZn&UUP#h+VF61!e z@-wYkabqC<&_|3h6!?*;Y5*q z-CS*Q82f<2DA1V}!qcFN(V9}Fdda+(GMPGt6t?GkFIB`nOYc>Brl%iOdJbs{k1#}f zw7{Q+c%nP=d17D(zg1E<>l!$sWDZdf+Ao$Y1vDhJx^Zn^(hX!jM=Z1eSJuG6qg;Tf z?XbplP%oqTuQe-HG%j%EC5ol-vCs3jq*I?>O zAukH8hkKJq>fR(&jW(DngQ>(E(tLSHeG~-d0GH0}?=gKWCVrJ7=V`eqCR;&h71 z-lkwh?3qVLpcgqFCR;f6i=Fpl`gsDjQv2n`1@9T*1FdIiv2~SVQhD##=>Bx*9#)z? zgbw-8Q8JS(J82*%7`2`NRlhJU!pAB}>=6e?oBFe@sIA(g0*bE@HWV~rZzxc~YEkDJ zipWXU@@AQ0hdu5>nLNHondU(}`4Pv(4>E~#xROZ%{$=hQHYt;RTdO z`m$JmJ;)#u^K5_x`B_IhsT3A~qMa%!p5Q#52tcU44;{(*!KMQ2D^fWQc3r6Cj70aZ z3el3>h9d10&#;{gr}^6*WLWHPckytge{p!fhx%kAq!u6J z{g&|lA@XmIHLqLZe$arAZcAJELFFt)%>wje;RLs|(W2CRXIh3tH*KMt1k-dA_Re$@ zmNMOhrTlzJB?f)!NaZ$rqL^#cJ8-&q(_noCxml_1b0k|vRAe2F1%P;`6*C=Xw*Ai% zaBP!4now)E`1zqpa)uC}5zEuXm@qQ_ca~drK?=8g;nj1!N*=cAL6a#WIj#rIvic`2 zWm7w8Q%v_Z>Z2gSw3DXh(6aGGP(&%#Qzu>gCA?K})tc>5@rT*Rg4x)9O4XsJQgx)M zQ(ZVgrOJG$XVS>g_!`kiUHppr5Dn+=|YPTjp79l-%_%Urp1F z^75NfKucJeWJs_U*y13j@q+Vw-s*A=GU$j|dGPLr7mr>>upu$G(gcFNSDh+dXG%9< z2E_HEHHkF6@T_*KZh`g0LW>(F7qp7P5Kdh=sgiXI1=v;Wj>I6jy>j0Qfl)FV6!!mz8LmY-r>ib(5ON^>1uUZyE#OW zz1&7U*)@Nc_H%WS%{kT#kUpc}yi&m6(1z@6{%S?hr8vq9MS`ovAH5tXVlld2K1~7x zT!G@8&{UqjQYuj1TH>^g z)MCI(RkZ)hE3+b8W{bav`)BfrI;s`!OX3KNyUldEID&;^Yn+&UYcY~I-~qX0&$|!> z`;f=c|1ibysf5FfwVRKu0*i>9YrB-NR<1?uM5I{WMk)N|U!Qp{X3ZTdAa!UCoom3GOg z9}ZY4`w^;!plse5dT%XdpFfuTwilR8^caGs$W)rPTAE@q7w_UAaQ)4!>IFw1q|){( z_gyFri}Nv*W8VuQfzf!UzF8gbGS)#x69T?U5P^#WMvoMqCRqtS?fJ37KLa9&N|Ka~ zTp}?{@e~q0igO8*XkX1xR#*v_Ev|B>`T-Vv4rmDMJ0qz;#2985kj>hXOD_>qdpt#` z&?!pULDF1^i4ov8=a#B}=1j{?+I(bZu{nGWSizb2H)&ueI^ z=pdNId;qydi>OPb4`7n_yf_BTaRj6&jM$4~%4qu&`B^_*1Pt!Xd;5D>5`m><@KRLT zRgA_bftcertzghX6c)9X@ZT^}whv8z&vsf4x`3TItV%rqxk~NUG5}j7ThQ4=|>kGq4qJ|%(E;X}+_=RjG#IC_O7EfROx zy`fzwZu8DJdhAn`Nkf@VeV|}M!8i7IT9Li6>#YfHeP&w`?r1ZHsw|>=)!)drIP6SV z>AexfOFgFu0!`N~)(hH9u&%v$OVc^KS5jXY?j?l^@Llp1A&WsDx(&{BxN`6J%FxXS z)wu4KNHOiYTZs#*?fRQb-K|(ko$rYEG3-X5J;jF636!F+hPh`Q=@4kJ1C_Z=20jAI8hwSLb<^r3 z>hH5uFT+bU^}YEdRbnx1inza5RIkr`ejAfCCQ9|@efa-EdL+|=WO&ZDJlhZwm$M5S z_4k%qYqa&0$~hCF-T;U_JapHU2wD|%AN z`*b2PDeqfG>&^k9NTPqtaVNsX_Ag*YbMq0PI0gw6GW}raM{|unvuX%!by!pt|AU*{73&v14y+VmdVEgn+p zHEp+I%eq}r_U%7rR{+$DCG)ZRgMJIC_{XiE6URZMQ5Jt5HO=qU(1qNBgY%Q;YGPdl~z4Z0|~GYK8?N%A zpV{Uk*f$}Ao3y}n(^bixsE&$D{^d3({>ijnwSdM8c=x~u#(9V0sMto8QZ$$en#VXc zU3(cc8E)Ei4`j$mp^OlJd}f}AWm#+m71DS)-_@CS9AWs60~hgF64^Xt4UyzeW_PO+ z4p=rl+fg#Jo3(53sDVwzb|sh_+B2q~HIM*mDak0Lm_w5!EQKHPRPEiURK;W|JVva5?NJRnkYpLt zW1o>VAr84^kZR& z-a(pin_PA+ejw^sEgT%zngwe6^$W&UoUM9r$peUmwkYVun1iy*GW4A=bURfv%bhZd zinnKxOv3FM>~T(J3y+4woOg5n>7^+luspO~$d?c}k7besgN332} z2)|r;W=lQ|a?QoxLNxvLZOL2HxI?0;NGM7`VQd6ZL)`LN18K80#f8Rsw5;fPg9la% z`xkb#-eAwZ!i88_4M8h$SdhXnLRjs$3NcK9k^zE1(sW&SC3<3Y$3S81x9vu5vf=j* z>dd9nz9Fdb9pE!|oCA>DjvWoIMYlM*5QPJPO$#Z$QjK7!c zJ5H5hLIUMZwp~W(1iGs9cBQ3LC%sc?4h2iD6E&yQYA5Gu^I&g*Hw|`DtDNdlwTze5 zGrC02R6+$2o-NOw|Bi6WITe~qw05p}uz7>BYmUn4EAe3mGik1uKGAGxL}xc%LO~(% zSNcQhHZsX^OnJ_R=eynODWyJUaX#U~x2|GrbZA+tQt_*POg*G9C)Eiy5$}LSNS6d* ziw29Tk`P(0dxZxg<+ddnq8@sdnm${Xbn3P}GaQ4rx4S0&U3SjG=0_;IeH>KIamz33 zfS;WxbpSx6Gc;1B=v5!X0qk;`s?JCTr8hVK6TEj9^VzD=I5vFfmZ%uWKK=?{e4E{x zYn9=3RFd&n3U}BZrMN3a=cSyA%t&_ac$wD3(z}(W6MDZ#X+~dmL&IWGIaRJU;b4>p zu|zBRMo$C@)Xp3hXeD$GYPWSZ(?AFvSAo;KG8>SU1U@kCkwj#xYTRoVm2uSPS|--o z^%G|1Tyn0!&4X z+8xpgCZ&j1+Ar7B9^kH$&5&IxC+Edb3|~qmRcgeOivP9PlL`yA#FGl-wcL{|=6Gm~ z^Zx5Y5@*{TO2QQY3>QGx{Jh89Nos2N3%413ncCxY zeGL!oVgs|_ak?(pKavg~4;80tdn4E6wrc0eIwYJ)ivG;=6y1@fBkwlY%vf?G$%Xz_ z(YquElY!}2>?vkriKm#1<(~Q##Oc~?RvHI^ksXT8WiYb21tXh6;HBR~7`b^OjNHJa zIJh)px%~nd`SI@_jNH(Kk#m%CJhJZh7mw_m2qPbO$}sY-=W28RcH)t-N*P$GG#!8^ zM54>Z8p;LWU^RUuZU5A z1e4wP3M3Nrg(JaUZbmxPv_SxO!p!L__!Jh9Zb^F~E>}7gNu3^Q0h&6%3x0C_K$Ul6 zV5*DuW+p>^fu|a@TXW^RMIKmRRGA9JApHsKmnkotOK=MWI;ao9@BnIWY(lI`O5TPH zw_8bg9vXuG=2FQb#*AIv%RW6x33IaNt1;ZL)-z-HF7J?NC3 z|LDF1i=9<9yObJH!d$F}QR<=?*AEM59*7Oh9;G2?F>#-ro93Fw;RkQH>C2ne-TJAA zqP4z+>G1t`zWc%VZNL5Ud-N(JS7rF_d*1utE%)7e<$ZdkMXd}!e8X2(f8&zdE`Lz3 z#Na2{H(sa3HZ_85Nm=9TV?Q2%sW@&JySpB(mYw|VIkt-X)A}n7AaCYVa?<*_$oQS(Bkk*#u{D26zCr7 zXA9BmYVrMxd(SAc|1a;@gsuCgrNv87WfbS0#jYZ>SMdbiHN%hTN@M;Pt!AaTtoXb< zdDS!}hv{W($A6upXvD=UYmpMvrCaJ)K?SMuv+pE&x@xj+vs4b$-RNiXkBnFI2S zm7jm2+G`3LhKICZvRYjG78Fa!73ZFX3EQP(`&T*X&&j7sg5eL#5zdn>G?1BdJe>MX zzdFi7w4+)sXN!UU9d@~l#2UMHmM;=}27gmDV4l@ca3BKvK|1QaF}1M`X}PeVhKUUt-YJ$^ zET0uiEs`e-r^YV3B46NMBvEWCKgjHuFllf!7`fr6L^sVYcsBdtYt(0KDSSs6Hcv=^dSZDMYmvVLKH9yTc=wgEI0DCEDehFcXM)L5$36cY4%L4+z>(_ zB7R|~Tipj;_M3j2mi=FU3zz+Y|C`JHn?hQDN~G0iNGnA2kfe2W1xNGr>;&Se^D_v7 zDL-LEKqz(*wb-{(xhihCR$#U)=4%ocRu6Cc&NUz0eciX#J*&Sy{Iz$lyL9ZPZ~pHA zVd4H5w$n@k!ACQqXn4oBAKU)nH8-x|$|NYRDAFXT6JPSqwHU$YV`oF|p=bFRp{lPxbTkRK#!A)0zo6^Qtnm*QxW; zs-~pC#Oz7TAO-&?~V~_u+ zQH+D_JrvTz2$`BWQLZVXO&%Cn^2}IFg>m+-rM7CAq2QY>)vs~kP*+%V5<%wvz&9EB?a$Z<@pJJR<46j$agCGGsGJjJ$F7@BP*Sedh)b7b_T1Dz8Kv5sZd< zZX-f*EvZb7!AnRnYp3%A!w3t2m5EZY0B3oMPL9USepr{>n@8SO)+f1xUGX||lJKda zAhl1K8@*U<&xq#Dji^EMI{nz_PyF3W=0!a2-O-1mRD_QMP!ktNYHj1<-be0a z{n(+zb?PWtaPc8>wuEU`SEPuCu~z{L)Fwq8tjvHu1B!O$z$;zsKFBY(^8Re~xD*Vm z-@3zc*muoAayus}%raAy>?BE$s1Eo)es^`)HLk^x!85p89H|fLqLrcLT@=tW1<`~* zKYIL;*St4J;WTrv8SJEQDIzm$g&&9tbv8W7CxYz4qLU6ajfT9gOW zcBbh+nOOp~(Eg*zmL7RXs3WyA2y)D^Y}xJec!jL*>UtfV0tLm+j`9uQLqj7vAh48k zX>pGG$8P%EJc(hF?4ag>G)=HniB~>1DrVcAhyf5d>1Jy()YZqDD?giD+gfgk_BwbL zbQER?hMbBOGxH$V4fR`RG?wq1hf|=2S!iL0Iv{1!BxiJwRPGj4q))qd>@g}wuG zo85YtBA#Fh8`;Fwj!Cmd=T)U7BRQ!|Bh~yD1St&Zhf}u`=8Q!#741&PYhPC+d`YnJ zrTI>|OhHY&3rvuAT)k!i5QwsCU#Y&AKu)c3m>k|=SzCJaCw3fY0T~i=$ud`dCPC9D z=c7DKCXnNP!0da&nBvB@P&^6!aJh^6KtojsZzRT)xy&6S1r)E zPqkW++1mcUDID9s9Q_Q(CiTprIkt-`N#bs6<0Y}yX%kcjpb<($@RYuZchl!eg=a4Z zjI#1>Q1UwAETn5H9zx_xvL7foAEbAXAKY7VKJ3;9;ouD?3GCXvPyK+B(lZi-RP;Vd zA-ICzMX(TNq3ETWZXL~oPm?WM3Eo|Lo8pJcBQ$?w_&UyGZEmvJ9tr-(Z}X^95%SbI zbJ|@8;S9d0pirsv)@=PZXb={lI>y!jOutE+t{J6ka-Ni-DSaDbZ=Ir~`OmUh^m3(J zm70eW=4du?^|@xH+T)W@Y8Y6=#w0QjBvNl19PgW zoyia5hA+Xf+Ja3`$-=hLj;MVPO2OpY0e#bjmG{C3)-0;PaE(BDe%?Gte=vB*g^07h zDyR)ahv^|4i=66AVJ3Vbl?Eiw1Cdk>ZP{(Ee2{xjRfwiyh(?CLJR9~h3U7zgj=hY; zi%3E6hxh^8%!jln0Hgx3k8#vmoX1OOJSowAH~_vB-}&^os6BphPstE{3$jAJwt*0iTdvNcELS$v2WYp$z<6K{$zwe}BJa>=d7k9W&# z#;M3Xa9CJAVLzdDs+@%C&;2rF%Gq;Nun#HGwP!tVOY$rqR6&EoPm~g1RSY2ubq(I1fv%SF?7EuL}LVRb> z896#wj%gse^aGBN2Mtg^Vr4u6iXuWmp?S7juTfZ6LW<=sgQ3)wT$a}rVTIoD3nWO3v;V1_nFwl})JBc~{MsSpK7*ms^` z-I4ILIZg|<>oR~h*#`K`iNi9CKy!GY+Qj>ms=`BPB4ooF4=H1s08%us?%oVAAF9uQ!=t$d4F(F4I$t)1W{RjX8KB4 zlo8l=#+Ar!A-EJIL%yif9n+YwTg=gC0|&9rNr{B!bOR3^D&b}D25SL=2MsGfRTTb@ z{t6J-iUNc#)uk6~7OgAZSPlqXO+a8exe-HWPGF$^?ofcbWa(spKn_^@CLnYH2+B=3 z9rh?8b^;(s^~2oa(HZ~&>!+~%gXPI5A-7V%Mfs4nSv5u9u(hAp--DFXw&+x=MK^`C zt-TiAx)N)FLFQr6LFQr6A>v`tGhcMpS;pt6D(3OSI%~OEV9p%{KQs9;5=E@H8~0i6 zaUHyc5WMuuP;Mo*y9P(o35HAWY8o7TNV4t@Om>p&3X;&AbT_6mdxSJd%c^L1NXyu$ zG+f#P=fA*9HVv0lE*LJU7$iqEs1%e)$vq??FiP$v3FT4pQIg9&$()ae#%AwlxKxbM zOYn`I{DQ+QMzhrbS1HpZRfaTH8Z05AjlyXi(qQQ#SrKlfUN=~}$Yx-|)n9x(l)=(t z4R+g8G&I<1GeR-95nHGl{8qK;3 zC&I>O_cvzy1+ek`=l=G>#{2h!4OFd3_OF5n^hrr}TMIV6)&?60K(-Hs0Faa{Eex>H z(u0ZchImvk&IG&>kcEl`WT8?+UV-pNKrF%=i~X(eMnEBK^|8(jBBsl2v+^ zDSs`wJX}XQzY&=Yj64)zBBF$zh&`7y;J1-F(zq}HM#~b`0OKMN6a$P$gg)GY?F+VL z9Ltq>U8C3<7HA7;2N<`66<|=Z2^g}D41nQ-H*iv^AqN3j!Un()xGeU!yGXVGLm;4u zWKJ9irK)t;M4D!L4O~pHb|3;m3FdEQSdd+zI4iOvBq?(}$zr!z!nW4XL?GU4fxr0w zlGtG2Bj~uokw-gp@bO^KarrL+9UB<*h_CKOl7XnSS;0Qd(BU?)-;#uf6d~?1*vA7% za7>w)Jjs)pKTnqohE$JCz&c9dK-X{zjNN6TF zZ=P`Fp!|yMk77$<^+K1d|qWWQ#C{D�WlHTk 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®Qaeor}mT22={=1LwH)il+lVH7rMkZw}v4 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�wBb)UTDJ%OqPYMp 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

    ;ftyMWI?d%3>E~}e?YuQ3l|e@wGij?Xoj%x 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%0DuAGx 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

    L${#i5}RP zGRe?@Y#xVjFdOxW(9}UlYmrrSOl$);G<)E+2E3Ae<73*1(Hm+;LA^tq{4^*=MTK|< zBEl((VD{;h=S%(tOw-S71@UslN`=@dpFvc2s8`@}eFbc&_u$a5y$4k{rS}JT?{hBf z@&bb1LrT?q0WqPsSklmYXyz$Y@(^Y3J*ZQr9i#Il)zR>?O#Lup){CuKSi7$uqB&rr z^5+vYrW$iS$9Kn`vkJ{Ho`_DzS^vR&5XPp#{|OAX2#A~!<-New2F9c=A2garRszya-yR=P@+AyHSx5<*~naov6Sn!Kvd#0MVUfrs!+*V zRkdRy0zKx2AZn>ld?2-^ggVN013t8f0JY>*3+p86fiP7=Eax3wutz)O1zb|D` zo54Y`O}$RK)j@W0?`Ihl3tGbr7Yn{~GltnVI?Ghk`>=6}^Opyx4Y_@VlbrF_KC(FQ z2swNgZP_&tbsn=Bh=5qb7krhZycJp}WEx~y&BaJZ1X z5*agk} zEu}z>#Ch6EDAS@0on*HmLFlyJ>}Ma>XLqyUX)h7&EMAv;mVm_uVj<*uWC!=muAc;a zVErWEgBwo*W@FmmNx-kZi;)`Om;Kb95}JXdyx8&@Pd9deaNk27`8)49Ie>C65gs0( zA$D713rU?1H03c~L}kdX=+I8{5+g9vOWk#7fNQqj1Fi!ZX+KYrzm3o|o#XX#Gc$-BUm@vKBnQ*9-9O`u&orqv2(okjd-^x>bc?Z z%T7Ay!iRtSLNpKgxZ3+(?mc~LJa6uSl6qm1W<{2VF5V-GiuU`ogwcz_q>MfSaC9hZ*%V$+!ixMvhd!=~YM83Gx zSYkD#p-X%teLwED`f-Lm=C85rQ2Tk>GSeA+h%4zj`gCQ>U5Y+zp_RLmerWxoa38PT zbV;}`XWokdh<2C8A=FV2v$g75?zh_?6q}0^mzdsF#7Ws4v;L&B0zOkO5{0cmC2Vnv&=BmEZ!7NaAp3 zdvgs>vh(E{z5!Qqq^W`WiF=VReUL7^(&HUysz8^Jk(*z6V^>-?*6f}*shASSJ3q0O z?0~KoRhZ(>bq_^MtyRfwXopOiS_WRy1+_PVRa$gQ(WBf|D0gIzskOk0w)XU$aN^wg z3m5nI9e+}-@fS*Ii>;90Wch!qO_k?$qTJDJOB12|#;rZae>QJD$(73FHu|@72+cog zPH~*nM5M{-iS-7_x~L)5PB}Xz0g$*jR^;-M>ExbaNQ)z&A6SJ4%V<#h8%KW z^9R+TW}n5YSgDpj;X{1Du|>~kQ4jp3sd@tTwEe!=wXp6C=CCAT0jE1o#v;=AU!)(g z-$`UC0m+NX(F~D=JVRI>lRJ9~i`_-X zS{f2Y>Eo8TS8&P_7n}=0{f5Xiy^bZdh|#>VS+<7xsub&j!H71?qCOy>$lxpqge~qT z34mH#=xN*xLBhOaB|w5TTD>erH~OK*QP>&3Ci^o>w~6vbx~Q10q_RJp_YQgtI6;Gz z1`Sr~v}dU}Rw;g{impU0 z7SU98_xpmvQM)ypZ*ik)v=w*gA{n0^T&fmTQJ8HS|ET?ZS-U_Lqox=?+^K_r$9CRAl%NX;+S3v`p|M99s8=2fAb)*3Hr zThK0r3XW%>oy8IQBdc4(O3TwR*4w+Z5hrF%k+!wWwiBVnL|>Ti=A>;f(9#ikpE(UdZ~ zlD$qwMJDVdDUNM}vC$_#>3WO>OIi$s7Q|r2!u%^hm`rF#hid^Jc|5>$Da z3`h&xj8hDrMk>K^;Rh_Qu43W2tgNT;Jh%EH3K~bU_u#~#^%Gvia%M~-@XI(sFT^II zzZRDr(*xzT)K14GgZx`2XtA9U9Ry(_q|}Og|qDXLK#hi+XIayvOOAd$zGshy^4 zCM$r7MSLt)6uQ+a^ZGG+#0!`Fa}Hv4@{FvdH7c;Li{8h_DEY4*dkb18+_>hF@VUAk zz$zcrenA{pkGE|{24{B$6EPtT7oTg(D>D99ooT=WU>x=xE|S|2K;}@cjsIY+osWl_n%lhM`K!wdycSik6qk&_Bmv$%J! z_+#x?G@Ig7fd$1yoDWm0Ow3%2b+f5n-xQY?D~S)ZwM5$A$j%Lj`B+;SFc<~BuKDNrQGnmgh?Qtx^uf>UDoGJi}IojH_0v zdUKLsBs_RfOm_cN=qMWyZJQI5Es50Ay~K?JloA}j@P-lw5A_4EEsa=}=9Rr-Ga>o<7K3EnkG3u( zE4COUOE2EKko0dcNLFrTNM71vkX&@h)}51|ZZSyKUbb~1d3K9I(tkOSd~NH|t~>rn z^l(d1;gwfx-8t#seM>>|=#`rZ$$5bh!PNkTHq2X+bc^AT(-IduK2gj=hkSRq!6}MK zH~fBijv|Rp+mz@OjxFc>yO8Kqe2B51untXUD#pb-Oe+Md0Keo_#9`!>{U+&X#TXTb z*dVq{zQw_cp3qeKYFutFi9L5oeG@l6MSKCA$CcgAKN%Y(2MFV0)ST2$;x#1Gb#S3m z;&Hk>?VH|x)cg~-NYb?SM}lfAXor9cUAj04{j)CDDkD%jl4PYx>6hOg+JpVNG`TV(En@*Hd8yyM#EDV3*J^N%f9`Mfy8N3+AL)e#M}SSmvCyod9?K zvY~*xF3cQj14dUH8YAAey%M_c7sRMH{wP7wu z*QKFnF37eeMFu6yrZZ@Mx_o}7`26I|&-qsm0>NxN+sXVaxNQ({+Y|CF9}>9hgHjnI z1+h4gN(80GoM21;6zYL`4x<7R7Mi-@Gjpj1DO{C#T7fz&ap~;Upkxm#Ap=Qs&pia2 z9GN%7Kj79_$u9dRZses!Q|f|nmS>X%Q;|5?=O)qHX;AET4wz{(p}dM@KkLU9hUMiu~j zi^uMG>^uM85t8er#*4GF2z&5{+T&|YHMk>DJIa*uHS*s1 zhXy{W4xwBKxAn2cA7I?T6O0}8ZniHC%Yj{#<&boPFua@_EzW-XQCDb!3T9SO#F}+s zib$?3K2xY~KJmsKbTuvlH32^5iL{j2W$)BFsn#MJIUxye^FwP)oB~ID2IvMoYl=l9 z-eApDsCpG|U`LAbg&ef=UTZbTU}{h#u1nWQ=#!aT2u66^q#tD&XV3q0*)C2uWxFtB zrdzJJ%hWfvYv(-agPpOy+hL~P+;%xT#!{~Os4{ISCh95QP!lzV!F0e%039oWBr2Xk zFKNZNSfwJXGcmiU9{${vmeh-jm&#%ilG}4PEuJdxR*DzPVvDuOr0gEG7SES=+x)d6 zwlwoaqCPWqrryfsAjD+z4@Ybch>E<^{+HSPkKP@}r3C*~Dp4iIBxrt3Pd|FfYhSzb zTNgha{F?T}ujy4zUB|5{6^)TK+A6-Vdfr!W`Q=Y8{iRh*dv~MauUG%>_Md<0;fuoy z%p@-u`2y@0@4NS@R=Gh{dNm49-1BoXVYY}+Mx z^04w_uh3$Z;S-7TA`6rlZ(8=lo}}BgP${i&I+!yS01_6u@e<;;oxiY%O-nDT@P|JB zr4c*Qq?s@6TOGd8W#Cc&O!j*Li#Uu=wE=yLmEs_%mMzHjxlp z(SDBDdd-ssXtL74M;IsJ6eUoS?2?@Rq*%i6z^X)@OmWH=KPaxu^lpqKD<1CvMN5GR zrP0u|(ZP{FFJxD|mcwF+;VO3BZxYUF@lo2{cu-mI0l3Z{k?Q2PdVaNgFs}QiyjogG zy0^x**TW?}0R|LgX^bA)hSXMJIl2etk?k+?ju1VOBSBiw3WZ|1t1qpo8=+)}F;m#d zml0WU2u1engEe<-R(yl)uq(NhOp%?znA7+Pvj7;q`t`y3loKyBz^>9xgHIXz^B}9c zb>Egb@pijWlyUjE-V-q*}{ruv4oec z8GBjMu_)#Bc4}?pP7(H^>V(Era-mSjYAp8;W0_gl=Y1z=IH&Prc1+{Pl5W;eIHi$e zjs1|uTB}(n6k3TL1%r$I90wByu;>$b#m-`^jb}XM)BqdTiVJ{YE06s)=kV&)GQ<_s z!IDBB$2oSifgM_7JqoK#RzK|DT^aUOGht_zix7Logx>R zAYd&%tyoZ*2mJgxIt5F>4q*qQ;m{!UNNbLTC5B{EnX#m@$1yTq#Pt^|ml7KHr337P zB28E*QcL|>x>?Zsv&$$&yxGfeZ_%@F8~Y|g1)XCT5r!~JJXz#NF&2={du0Y%?9B-xVFkv3v9#9dAkGaYMr~8_M8@aVRPq z#w*9H+lj_qo<{XP=tro9KT-P~L2=_+Cel2!W5`Q|O$|RT@l{_tY`_;X9IEc5RLuU_ zv7}{rfoa6}X=WZ_DLuE4Q|WUEM1A8B##)=A7D`f_ed050Q`+3-u6~}9I8-(%bU;G* zYVp8>YYFV;Pj>k`ceMhG@N);yBheW7tg?&paT#8U(`dpNx;F{TI!j4j2WDN!?zsuT zoW1$L@bOUv2G7&RnR#H-fw^?^f#Kt$3e56mV8V91DQI@%<^#jWM-`Yik7f^SJ}~Q{ znPt?42&2sip1Go+$Z4`0a|xmf#DD{Z8)9co5A2b(BB!FMc#Eo*yoG2$M-%fqd*q{q zT>K$skh-u7a#N%gF00}EfQTQq^`X|Voep6zS7|pHUnfGx;Nab6V~O#WrrbGIDJ`LHXR&iI^tPv+AdX)nZyYDbzfNZt#1CL^-N5>;6A@Aj z^=!z+)yw*+SIo2&9I0Xxrl^tWwIrMOkBrv@&yGQz-IA$<9y6kprf~K*1lvBu?iyH8 z=Gz$=Y8XFgb&VgilK4S!9Q~1$NE-y@bi|FZ1xkrcup%)!J!88t_nY*si+n&3+{B0Y zNeGgxv`h6{Mf$MzIAAn% z9B82Kf=2xZ4D}xxl5=s)b?JRDK!DM|VK7i2GzHvnrl_-n`m(T_i%p;5lKAe$H$TA* ztqm^l=oG}QD|*gL8qGvzgfrS$E-+ub#RPICag$ags37UZB2Lom))`EC)ixjPE;KtU zQnO~YRGYN4;$7vkKu#e>$!36LZMH)~i`zttS>QR}Q=!awgO{0_+kx~DC>J}FB|=?S zW(YcoNJo&t4ewx1+IEk2U>>=2)Z(K%=_VgG^(&x(VQB8I<#K2=@C|- zn>xdji?2ixu&;Y~07nM9qqy}{q=?PI6?B?!gG%~AHEBOYaG_QFu7>O6>~jYiQH9TA zDHvg$nEhfue{1j(D3+H-EK<%xF4C0MJ?5^rd>FW&I?8wKeY9i zZl;N_z{v8WI%^*P_DO9r33bq6K2lcrQJ|c-SNDZm8pi2huojz+4gtxO1 z;jJbsTBIlS;W-KTvPg*{^6*bCNjFjkT4)INKOV~^*>6&f9}Kft0P7rZvI4R*;nWAZ zr$9h}Fs@Pvs5N6+?H>%;)3q|;>_u1i+8SM5JhHB0_b7=-!=S#}Mpu8Q^n<^Pw?=2b zJF?DVEhyPT$69t`VJ%b8h_#CjWUABMBg@>&b!X5?G^;Z)oHYi?Ou#}}=94BMl5jiqxtew5z%!{@*ps7T);x=46T&V!P+uCy7vvp5vFi3cN7;MhggAlE4pLOn zJGxVk-$a~s*)F?y7sx0m9NCwvy^{8jVy-+$+qyHfa;K?gYd_-ESXEGb)dugaqC(;< z-no`u-J`%(`!71FEWh$b^w%s$@x*A!pRJT1)K7x0_!KCwE)lswz{NW~FHxC?a zmUo9a7|>wZqI11lhZF$X5GO)KVb&pE1c_T3HTV>b9AmUw6wioQP%4d^5h?#9rEEro zI-M8!(|-}4?kMijCCQ%q2p|FAL>F~M{S07o(={oB%v1$8)+J9jYV4Ne(so!0wUD#I zb#b`_Ns&I5cXe%0ZD}Z_TVM<<1vCH&Dt>D-U#%D!C+4a*CVGJK4XIS^T7 zjNWc@Jc+WeOqMN&=PH@(cesGoJF8v89m!_PTqJg7tfVuE4V6$qI%!#J>MOV{Td=NH z-~~BqW(y~m^e_s70#JavA`hIh&!NCQG%jh;r0A>?sx@|>+_ zR=XK9)oW532J{H0qo}7lwP#QNM?{3>FQ1Q!4`iz-U)98yYvWMw`LJ*Tt6nsleMTm1 z7(5#U;@myxy#mk314#rS=-pF}gAOfjI>!t?9zG9gW zR=NdGaj;$RFeP|u#hw6!wz9 z6fIhGQ%IW)Ii22_Ff$U081WP;nA#lKd+Clz6dPp(nCza}68PERB=i+2sU@T`)9M8# zaE^5&t7r;hWheg`J0S8k6|x7$sb$L^WYy*SINdme?1n#sLfhxv0g!yUGifLJQ2TY; z6bPq|AM+rbGWJ1uWpfazKhXWU1x8A@5H}93hpT0EB6vax!Q7Z7qzt1*>WxkXeWU0~ ziptK(J$Yf}TAQskGRnHFCB8w5oxqn69#zU}`KCli55bYUxTDOG>1@DZvxY9Wk+3W9Qt5R}4)+lu`4s}p+ zQA}SeWpCkIf8dOhRu9S!oQ_BdU*ZB&BRHTOU?smffCHKUU`{FUfI6mV?=6lys@8&w zAk?#^w-`sd<^mp6oG!X1F+!$KvY2+jQYXZV(k0_XVXJ)kR0ri&32HvH9mX;Vj3j%d zpx?&ijCD#gcJckLAj)R-7y!o)%OI8~`$YP$`zzg_+5y2QPyPgwm=>#;Z&~%2eHh&0 zzGolQU1aG6Z-X@~JjO(xWw4f3MF=7}m0#em?A({VbkM8_#3`aZqDx*nXs^he{`f-u zi)Rh_t;ZX`B|ew0*|DQR?ZgJ_K7K~*-IP8+fzkmv1sgW#E7MwofKs+)JFC#!1(Y~j zeRz=r;`n3#5z}uWr^~keCTYcBnqpu=YBm;Gp3JeuCErE)27>5t^TK!d5J>|J0V84Z ztQcd{<*-&wmoqpX>B50{B=yK#O6uW8C_yZy2!*A|CNh*#V%L(OWJE$^(itUeLfV;5 zkZX#Vno9QEr^Fn@A?umRYiwnJC3|pvNj7fQ&=s_MG?KIhzfX9j1~V?tUQu(>mz>GO^iB7JI*7@s<49%D(h zjjgt|{rI$|$=g3@5;eZQ_K8nK0VN44NsOXsf{KEQiUt)E)CvAWMMZ-K4KWx|F+n8} z6B0>%zQ48hIrq*mGYl}Jj3jgSJ@=e_)?Rzv-NsJ1rK{+d+E>-1(`!Vi6RL^ zq0jA!g4?ZpX+adatssiKV#AB;7nnU1-NZQ|w;>*yPL}m!`w%~x>)^t;u(Ze$aWJhvX{f~$B`f*DAk1NSq^lqhL5++{% zj^pa@TvNN#A*j=i&HI-3)0<458agt88T2HRA>ksTFndipI>i>=NwGLmhDnJ=2Barayr)n9fp({b|l+%ma|n4y%wd*{{a;6rfgmQ zZ3HuuUhMjXJ(R%7?yMb^Rc1e|jVp78K9R2afRTuo%?lHG~sJtZB9N7cQmRvB6 z6l>K$ZPZ+&vsypt)#Hp*B}j=y5r0hNvW9~~g|v~oqB;dQRMI!8$*S!F7tl1;5_SM# zt_{%wTycv<89_|00ksv(47VAzr$Mn%W{07C2_zbh+iS?WSv{lJ**0iQjoA{Li_aQW8=N0HT&!0QSs5 zMZ~dMIH*{xYT=-grV(-q#?vIHVEIo!uG|4@->gJS5yZ%+kW;{Q8TWWX?^$n#=y!WOi(agaXNlTjJj>J`f#cb*p*EgPYKQS`QF{cA zXUQwI@hnq2jHg@e5jdVTzo?C8o!VhM8`K_x@jMv#LCw|8T2ANIrRUjt7N0b;FpF>K zG7W=|n@mH5c+NP?qbzCeSvl6SOdV?(tFo3@l{PJIFt8wJ)TIOj!Q@SU*gp4^U#jAi zRSRtEGdIG1Ax}rQO%At_kU=rvkV0YnzSC1E6hdd=J(fr@QD5-z*CkSTV2?uNJg`TW zd0Gy8(mdZIwSYNB{BXUk+;#Z*UGc1HnJ8mqURx!6ugq*~_y;B-#+ry;25l1oZxHk7xFaweei6b{NkUYLCG2ta-UMo^@*H{7CH~7|(sZ`H`!7 z<~$&WLb?HNr)(PW5QKN?M;wG9$<+2AC37N(Sz&mbhrhwtL2XBC&MWf$CUXPcAUF#V zI>EK2ygGMnRq0znz8?t&hk`j(BdKdJAbe=)eV-NsB4X2b&$OKx4ecOq41=iitN|vf zv4C2oC)0ON_dabppdaboWP9@%}6AM%a1OsKYKy~mZa(kEvx(Jg)x1HSQ40DRN zc=i}?G3w)iMP-~UJp9)O@wpPP{9^jjfi$MY(t7(D%aRH9q>tsR6ZW97yxnUo_w8^j z57m!l{+=|Jt-Z$btsRc#iFz8lY)=}?=3ZlYWQSwfP(Lr{?n&$AtzKhUvcs{wQa>-Z zj^BgU%QSdL{o21_hhte(KQG_elg9F!Ui0!?Z7c{Db12kD(P+br!YikO#b4o&m$Sr< zvus0|4<30r4aBOWu9@d7|JHeLym-+SXPeKUsq2NiF8cacUwnJT9cRy+VTV$wLkur@ zsDqMnFwf`+SQ8vdI)En!rCe&N;tuSZv`sT{cUcRgMP#jJrbn@!s>}3lt6&=+KBiD9 zH>({~maS?Jfy&Yy7pcS+#iz`F^cCsQA*I=;h-3%~G=e!}dmPIacB@{mx zrb^SR?#T-Rph)p%6ad5{2g8JDJ_svPXo~Di8#$XayZ9a|HQn?+c2*c-WMWD{pEg)+ zMoT*XQ3lpCJ!!El;~5TSuAEL}2)AIhD|PaSVgfzZOJ+X4R2%eY8K;U$6JlVBi9p2u ztS*%0Q^^()xmvNENuWf}@unIaFjr&w8|vcWjL>;b;W>Te5|J3p&Ii|IH99F9Q=dsh zm@FVdpRzut-N$2)vl?@>aFm5AH`cN$H`Y>>8<0nQ2Yw)Z0FMG~F_ckxg=iWfx8%sp z3pIw|E2fypaf_59oh8rfpbDLeU%L{Hs4h5sq8Tv6DT%u=xkA;PmA6`YS` z8*@NUzpXrDy;wRHFR3N6uo9cN=6gYDTk`a~21bijY^s}P+z+SB{eY1Q_xkbDS&IVL z8sxuiP)fdH!L>i+gIPX_5KfuqWXlvy6Z*_cj%-WDatoj*8kuOKiLI(e%(hv&voGdZ`GXhs4QVMw3k_n?m>bC|B6J@9#diw;tSE8Zb{;7gG3BxW z5pcpW-@>j$coxg^I{fmua*)AORgKuZ5aO2*ml0ARl>CGQhdJr=e>v=S1GJ+BctEfTWTK zpzGJ$=DoJ@m0w)BS1zcGEaZ05rc7NjnW9TR6g8J*{G#4|Eeu4W)>=^RFJ4#2OYp+bjHM9A|~8x zwyZ@{q5)`%5m8_$1sW^7!4 zW~@9TiLldBP0RqGf?HmKK99CFtN~7_Js)m%x@SoWq>{o^G`+;S_~1cw8J$IRqEt>6 zY8M_RF{ymA1ODNT20x75rYHk|w8C_69a!a-BB zX*2n06mlP*%i_|I=4;r;`Yl3OX9)@wG`TJ83s? zL95OOm##8D8_}8Yc}qm5?+H=!p^+($2SuYk7R5a8V+x~VoHk-xK1L#WpCU+ZuYarF zl&@DSpi@b}GixY-i((RG6HF#*d1k+R$D|Z1icYnFlzlK&jzDA?^c-%7dYPz(p0{hs z;^?;F*)*!4a#gC2zd_m%J`NeckM8WF@tmDY29b&{*1*Rs^eE%nZk$zDbC~WW6R?`nylJ zCfQ2WWYwSa;*SGydgmA0O6e`1Z!4#dOaqn7RXLl{Bs7-OZ~mo-r4+uG^gWx_l+OLU zbU33s;0)Ddg2)V(gz zieB|8b!Mv~Ukj#{h4q1^W-Q+ZwIYwJFd`{Vg4G-nzz8`>%kFjBaJkee;QBaixcf^| zTuqO!KW-Se`Z?#$m^Ej9_q4PB8iiJV_Ts`!6GV_snPYcLXP`?Hzfr0yS6Hf*E9Akm z&#IQEOB@y2u~ai1$eY_t`-yhqh9WA7Hl?TIbj$xM0z?W4an!izp|)%z*GBy-i+ky^UftMIc{L55#gQU!{*76=FcP zf@Bq92;~^r#Dbx%kj5X_Pb#EQ zWq3ZWDexu9-fBbh55+yjZ}iI1wobiG(l3Napcn~iXDQwU5)z+x^waY2>@!)+rB1|8 zd8!d))0k|CN-vX#TC*>6Aklo|oImu>{_>RD_>Qw-4j zDee|AksWCdY*$dluJ-Jn&V5R1RwotJWJ{P&PG{y`Vszo!GAoG)@j>K%B^ehN&r%g~ z7EafEyeI^g9RY^4RaR*%?e943_N%|YH&_%NC;L7e(wyi!ZTDelyXE#WZNuD#X4@+e z;Ja^4mQ~BFDl&8pFU?dX@d^0T{rWQd%Wt?2ccX_-<>NS|EoQ~FQA!Cr0)(R@Vt_Wu zPCPXe&1XsN(kZ8AC+bqkqxp!Y;=VIa%}zOTtcOZ574u^#Gr8$3>8i&W=b_%j{8+QJ zgrB-38LAS8Diphf>(!WwJ(H4CXmQV(aQ;I|XHwu}>AC2R-;Y(BM`!pVify0Bc34xZ zg;h$w`$a;6O3R)O>-e!he8CyVz-=vjCye}v= zR5Djcq&eB~tY+sSrA6WD6k(Z^$JT@)TgMVU>05aJnTS&Q$oseo1nJBJHT!&7w14iG z1UPNEm+oKHDFGX<2$eh*h5ZXtVm1;nAEW`3(ue(wL(b_HT*`h{I>RdQlq5!26sm3a z3M^jrc4X%ey0ux(rr&ZOuwfq~VN(+wEFZLj<9^p6ZE;Iq zJ)}>A_U$0ua!L0fAq8M4qflphL25@`!7Oc-WaZSlx4;p&n=O6&BJ(=a$A^g{C|F;> zBWLAkU9ofY-`m6QRsCMA`+cJS?o~pO{rVm6O!53-{`+C!c@JkPewX}X5R!toHmiI@ z(hQCpwzno2XO7i5_6bctD<<7!iRE4~V&f52D)2y)l~+hHl1El2kDcDw6LN^ z4=bJCFl85JfBA@6Q7`OMoBgXlTHthe*ZyPKF5vVBwwrm+R#cs@B+_2X9e-Qg@h4ei z_9`T`+L8Rqq~jp!X`E@n^694EM=y|!2o`MaQ`r$dTFmB6!#6?59OW}sORX^?S+X&m zfgu`Qp*03^Az@eg3M!ZqHP8akj}>o372NdpKc{VmkUMJ|a@0u#F2*HO%Su*xK>`Tj zBJ-UbA+iU{Ey8zs=jy93fciYq%%mHcuck7F`fps52e4Fi*;kcXZ`aIfWKWo*4M?T% zvWuiH^s1l@t)-Pc2YYhkyOnSyJ0 zSgX|r97Q-=%xx;~DN3j+G3XRE={L4vfnfO}u)z7($3i)cipF)Tf}iOL?6~L!yVjzK z2{s}aWR3)0GiUc%JwoT3=~Zov6fM5P!1N^JFxaV#%@9+nM>NPNX&v^c9-)pz zmSwLSfk|edK3Ht-tZ!&uqJm_GX7;EpJ&zNaeYtY-da)+ctA13gWu(g1}xdn8=a5 z8jveJoU!t;;?GA1F1ykzo@DV10=!{6pDcXJeX-`&HYco%1Lk3~-}-bQ-#ZED@@*8Y zo(|-m5X0CE)*dzO2k;^{3=72FI{|S|94~?@s7D?FRw%zuk;iud$LDko9>+Z)ey^xv z`YuDfXX1E8%`joMBI8-V`IwL`TMa4*EUWyU#S}>Kk;ml}W7bi2+Ns(5w9QV^7v5Kx zi*74Is&eyfGBF4r_I^Evg%Ax=9|G*NurZM#RM8Q5|^u zWLYElsmhhj_v=_j5@K>QC})>&xe6}E+XU$`GWTxyAQ&;F5O;-w2GA}rsgKT9+NnJp zj~b)Psbd1tJ)ls*FqWLFfOa${p10^LG^q?FtCNl~SV;6?#hUv7K9WPYbokV4mfEZN zV?r5Ck$1?ZfDg0Yq+vlE2>Rf*!RDUM_zO)Yh35=(nq^|E3@EdkWGHYg5`_HHg7h{4 z0XWj=q}UM%A*mr}1|LA%atNrQB?57Es>Od`XmZQOrcX@vTgFH&w8t1ORjZ|(T4#`w zTRN_faU;P06gL98R1vt6{oxtFmVGG`+T)`r!#_3q!_&=M(^wKCs93y2>C|e&Y5qu4 z6|sI~TbbCGiN1!I8ph1PvY1gdSyV;IPPR#B2sk7RlT4nMNkVQicfVfU+9YtQjdnB+ zFzGmP1ZY{#Z9m(IY+E0H$-$OS+hf;|w@|buKvoXNC^rFgrAk&iio58&6;LRWc-mXr|d7Ysq!Jg+4F+T%G|@B zV2G^h!K%nzj$p-R^Q$#3eo2>5n7n4i!qho9cMsh|TwE$!(#mY`gfAPVj)64!L0`MT` zTA(WZJ^qbPs?uMgN`I@q@kuKE@eFhzf?@)RQ3^!@!H>N-TcX!KdputPA7VMe3H`@z z{rLJMz8G)3FZPg`8gKOdu%W0aJ%3cvX+V2dHV^u4g_L5D0c$9Y0eA+!YV9dmjABFA zPr^Z9u(VXfzn#zZbDv=89YzbjiPbjSY!~3Nx&Yq|7sh9|KhUi%@RAFUu-xf~`dkOk zIun!o*aPEK#MOwNggV8*h)86_DVDZvQp6Qs+rg_PjJG>W*R_d?jgQqD4|yn_Mhs3| zP7WZ|*b%XIJ^SRf-~7sB>mFN3w4vy@>wD*3{hM#!H2Z7ck5o(tZb=3713y^R3)nX% z>4O~gX{6k45NP^joRD-{wAx~?;_O4jUfug7B!2yB7fHJ`!agO1qDO(#L4yqh-2#hZ4@dwst7t#cFE};9QKUd#u5+5SQgZcWpUkDmJaV&qTv|J^189yUpJOj!#kGpaExW^bu}8Bwy;KH zv(z3w8Y>OQSZ356;yJtS5YLN;=nzjd4~u%0Ahh67*~F0I66I;PawZUaq`I`LWvMQf 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

    py(! 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 z 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

    ouJ{%1{_fS? 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

    Ys!o3J7Vi!7PDOoD9blLRx*ze1G}+t29QU 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

    E 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

    @U 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

    tY_!O$~ag#Ug=gGNO`_;`JZ`j23X_GCwi1+ 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

    =p&zf5c3PiTZTkO+3fB;HG=a#vej8E>CF9 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�CDP`cm${u(dv5mAHCEKwn(U{pq{C!L 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

    @)J^4KunSG= zLlq|?OOpUg5l(Wf)>HoWKYeoun3w-nt~RAxax6G zr?3dbnITgI;;?@xEeXV>p|A+P!eD3ol_EF{kB-Nx7QsIFqhN|a?45{Ai{M#`;A}vP zpch3j70@DBfHegzf?pysMesJcK2E}tBG@qmErJs%g4ZPExCksKc?~yDF_&vPQs47t%UQ0&*P(rL(h1g`=88VIwNqNUh;j4IG~TiR=9I1i zb3t86VxDoxMLY`BZr4=(#YWGhMbJ#*7L90SmC5WrkFYJw(LXQtg7!`j;K^AC^_YiX z9n>lE(n@{!5-q*htgO)uEnCqK?_8vd=|iz*9LY57y^xt$%-=wBHv%jk-nlaWtq5v< zEKKKLH9Qn)X0}-q65ky6EPfhZA$Eqg>Y?HFL@(h<2uDWI($J?yp>w1jL7W99qVN>r z@C?b5T*6a|!VA8|=?t9a3~jZIrTM_PPnz!(yt9Og7$%I9R@1Xf7Ao3SR%97(JKdq4gO? zvJg=Jk{F%$9%VW5y3mNXyD?h`>dQ6TXe;_yB>ju0*LLKdEDCq3pUm#nv*$$AoM4|< zMF0HOZk>PS&PLXr7X?c5+t752ySyW&*hTr1LRsEXH`v9&xQLEe$A$qb|JaaokCgfe9Y41i)iX^1Xkj{2bzlo3$A@ zl>5Neh7?`tP}^8ZMvf1iJ`FXrQJ=YR^7 z==1Net+Ve$KOFlD80(@i$Gg&dqHwFwJ%Q?3C*}nbDSaO)_g-Ehx{tSb&*8+E`x)sx zfS#>u)elpz7O6S!kYYWVTFfZ?5llwg$@i8p?e(bYE$79@u=+NaX-{Bsi1`2IlZ2~> z&-{SyzNdJVi2ZW9o6gB!hV^nTFQ8Zk!9Fg^mq#&egYHh$@J^U$9AANscp8&^*{k;~ zX9_%reiYId&?MJ#8TkSxZ6xFsFJrFn(msoB&sTW2=K&}3dKRcgc+^6VvxZl(vnvmQ zWH)pjUbC&yrID*Yp=qyUa;O9_@(s-8D7@qz=w#OIfHWrB=B~r!wl$bs#3N$s+qSjt z9Rp!z?Eii!--kEKKM2M9h_9c1h#zt|Tk4_AF1vq<$&Ey$b|aI{n+#ZbCSdZB%}m^Wfzds@fZmrrv_>E~ z0NqJnW4xGlWYRa()Nc(C?xWxFPUjECNtoQTehhv2QlhfWN2KGypCZ4Oq3g5-`*#wB zm$uqg?_Ui_X=~M3^&49*{=je~Il#tO?m1I(2mDDLMm65cgzraao<-C+E=@m3Dv5U<%N;5e+{a+!f@d{4?j_Q)k~0ym1$8k)P7U_LgH{H2AQY}c(ehm#aj z2M4>3H7wy+z5CeCshB22B+Wv)Zc0R`RP@JdHB;Vk2Y#NhQ+_K4*a=g3-fm!MRHAhNAGlnlWQI8$huH6 zv7=)(v8_cVwOt(RLzHI2zFi$_LL;!blnzCU)L6-{pVjH2@=x}SSt z{Cy44p*3vaaxRzTyL}w%@_vrB_hyQmIqL0jqP_nw&>gisienRS5*{w_K0|La$3GL< zYp8C&rS0VZs}QajtZo@VO9*$h6z$+}P6ZKofqrjGu$;;3N!bKsQ3Q$f1u4vK#_Sn1 z-7aC#=T+c0@nGSttFUW)e*j$z-@T?R-+zmJ-xGnjYPvyuKM((c$0Oe-Milyf46RD;qkjyw%vrRT z<5c=wO`PGZ2a1X)zv)}Qgv1sdjorIryYEJJ&*ywoIiprY`AruE*yZttfzx>qaqr6| zIgpF&FCElDvTd@MUn1sLad{JU==;)S>Ic^jd7=+rzS0@!caTVQ4n4rme|S7osffBC zIwqxG+*K&OvLr`Oo)l^$U);6whZ4@UVD6y@b_jN$6*lmJU1L7Sy8+ozhmK9_7c~+~ z`?UDdt5W<$4WY~zHOisP7d3i^)RV-@&yiuDqxZLVLAnlhbR;_ z4H93#E=D8EN#nnx>~r`2xy;&})EN?YsEO+Mg|ZKn?)+F}oyI?5w+{-T zS&%z^Df`>{yk%LpL1&I%W|wL;*aQXRAL2y`{Y-( zp=kTM6`X^~F_^R&|C`+}C7Zu2hQ;Im;G;!XoI!m@9_v=fU^NiW*nhGA5MSGByXwY#B4uV$0Yah|QL-_2 zUNPh{z2mb#q8-_V7DD!(Pxvi*Y$RXAXeG8L%+U^)v(qqIo*{DCl}mD8F0)aG-QdyA z-gQ20_?+e&kVpe{*v&b1a4*GsEVA6gZpmpK^rzuC4N4z&M^0fd6j}zE zEuGgfo3|cv4_lDay6g=edF^I}GAFn@LOo_YZ})3hW+4X;yEkXw)EziHL*V|Ls?_aB zW&($owMo5kk&8MarU?x8G8udynX|=k9N;I61;%X(8)cJ};IKOjA<_>qPgHVU_ zs>osdKPvhn(k;^(tHr55L~&zG2n=dg=DK8IZ( zK8IZ)Jcm8`48ivpK@_TOiKx|#N?3=xT-Bg@0K%s}V2z4@d4h~{s5O>3cvqgL?mPrn z-H*{<;)U}v=)5JDbzIy}xD4GHO+WR{8E__cmdHiYn@}G$z58Hk7(2b~QrqiA2qMX| z%UXGRhQLfcPfdQ~Pzh^MCW_bMbjF94wSj;6EhDwgUx1S{l1n}pSG+R^BvpamjV7QD zwwl&z@Dnh-1!Z^Dcpjl)e3}X49%S;Jy_*q;U#?TLOX#iHK+y;ugmT*3iFxgKV@ECZ z_7ayy;I{X?(;`T0Dq%8`-?6BK)jttu_&YQ;2d+0EISrr7i^=KvvNI2)ASt%fi%aUZdS%sB0dxdWL zqB&PU+{{F?+uot%12l8?0h+yk$LqkOeIxO2a{j?%Q03?@v5tFzeu)iq5@&iwsYk z%Vgc>2{C$xOW)Dh+L&XzW6``Quu`Y9W!m5U7M3dN&I)XI{{tMWd`t*Wpph!7k}Sw_ zlLcFFGxk8^CbOd8He+ncr-+j&s<|3^9iE^K#;P)QuSTCX6)yy%* z6Y*}%A&zxFs_Ja<_)m0F*VN-I*lwJuQ7SndkV^FL;s3p)ZoH`->L$y#aY!CQspM@m zdrSyn3YrZOIEOmcAt-m1Z@XFPYzZy4y1Hj$yW3%omG~lUyN{tc{&0Y8tL`6Y4mcu| zoR8*10g>b!=~y?S61OL5v(emi6fiXp$v++IYE*(vqwY0FJJz6MfH!jSS~SO^p2vei zG{;9U1C8uqO|Xa6{R>!qTnxP|HVw@Y6aSO7UMFG=rHPx0 z<~xB+gj0JGwHT#dUvjczHJt)T67EEkJ~gz~8_k~rlAd!<;}%D0pueM8emZa&`PTIe zo_MIlZ``g~5xoo3A4Ed3&4=vWKf$qQVsvqd?H+~ZqY${K=yCFFgpWOoZ2@;vh_{L6 z><|W^SscL@G%uYKN)A2OvDTo}P3a`ZnuSvM7|n_2h43Dlp_4;69nGo;enNA_`Jp8D z0(yTa@gQ-)lY^`S^`Sf+qlzhN><#zn+aTFp?09EE$3erCj?1EPS+q|UT@6jbT^DtC zaTZ<0gLfvfN|E`u)7hxmjV{@=f>yzKbOb~cRQ_dm^=^f3fO4Rr!KD#Zo!gcdHDBft zeLF(8e0o8pcSb}Nueuf9F)^*>TOVU$`qZ4Ti0fwJaKE_L_=#Uiv0qBDUxp&T48?xQ zv)nzE-22VspzZE*ArpMGDB`!f2 zG9>k<3R$N99M!V^h$vHkIzpNHqm-#X-4SN$k5ZgALs8lc#c9*}v#q$+LXi5S6xSc6 z*e^qoUxs48r2Zr?+-s=SM(@SLnf3Cd=)|bCc<)QuO^!-c$}R>eJAt_DF2_-(>~4TE zWv3L!$xsw0LoMQzxFwF!?NrN>i%shw5fe!!Vsl$YECz{~Kpe4qvLg0aR>YLzh#86^ zW~fEP+<`>p2@@UL-GYX$foae>jv8vU(@Y#Y&9UA>k$wJXGIU`WNl$WjC#;!rlhkBL zvN=PN&l!^RC`p3!zAzNs7fNvw3`I#W)FKJeiMfQ%CrZjU^D2vfTWAUVlJ1r(aIVO-L_jk0% z&kFApedkdY65RVSl6L^N=e56VD8HJ1D@r9R(2SgIz|yxR-DAPv8jN`F&>e(Ea$|d5 zX>_j!BsT;IB00xoXlgS(!8w3rsKVEPWT?X6xsJ6ACAYF$bgg4uhf??v%^lZ;(B*o^ zT7gnY`x_kVJe0y+Xv%L4p$W~h2y$*>M1oRl_o5lz970w}%*C{JUMM*YjdybhhoPyw zC4_}&cDpr%SJ51PTL_EL9DI8SOVL!{5yA*G_eQV@%>j3YlB?0|Fh7L(Xo9;8Sk4hF zi8#GLcUvwOpbDO7Ydf>VK4#EXeZuNv!-S*5*-??meN`A5$~3+zdf-394W%zGcDR zTg!@0R-i3`Q6T<)Eq|$AvB;lNkFVkLGy~h z*Z&HiVcPS4BrpG~qzTjMB3Xwd3$lD`DWQO$=I+(QA>6uqndM`@QXwxsx%&baq6%N) zUe1!V1T+2Y-b$#k%Qt}QSgI^!Va)XxGMjb}@G66;|5DP@H?u9seVs_g0rbbuPZ!`P zC$+g*@J}TEeMsg}q&EV?1)ij7dIk6kRro8APa+3OLfM1iE?<~QD6=ZL=)SyT=L~-VaEe_Lw2_8M@x-MoXMUtatu@2$myLzs|05*_(^| zA#pkGK^loa$dY!gn2kqOUak?7#Z&hwgoAdstX*ahv27l5tQ$}Q_;B*sY~&qqoOyxN zZ+;v};$bH5CcAddnXz$OjE)SA&4RBx1ze75!-u8+9>V=1vg^Wq4coHoqAj~F+|(ko zXQC~;F0vuZ+6b&&h!Sg-dnG#cfn68w^N|niy2yqsYkx&PV9l&+_rH_K^k3{)Gf{2X zHexxqpmXoxBAYhau3-b7r8_X(&oLYD2-aq$uqL}H+{3^*Vsw$_aD2YLdn1M~=CO9d z`TFibOPD*@g=2>PmtZ+^QoXwdZ<-!;tagh@%VvN_mY+#n2#m9TS?+kPt#H^DYp}Acqhwz zXnGb#^5tZVQ@vi|bwDI8z<9N#3$vZYeGl6;&)~^}mE_5?kI1XjzaV2eVRjR0^yTE0 z`NVbN;+$VqPuMg#cLO0aj*N@xAK0NWQ4`N7PLuw)_E*` zVKvojVR|?3Efxq3%`PbRN*Hq~wVLmg27XK*C8*E*yt^vdVuRzkHa_R%&3}qJB|F!P!}WfTJQwJUsH)wXRJn$zglt!hua)?afv))| z^&w={A11qkKFk;Vh{V@2NqlDwvp8Lb*`DK{rK5tvJouTGcncCwE#>Ba7nSalSO`lu zF@MAm%dBH2o(oHHNx7eHZSk_BmjA%uH5P;)#9F}t|7aDw54;T62aF~M5}RY^yWo5# ziopCDoLAE3OTfYBxcD)0{xgu~?M>s{y&ea@7)R8c?@lHg%bqv)Xx-c87-=6t-sg8m zgyskAhw*uUdr3=^}`dxrO0TaH{?-DS1u;4aoqJAXv{;N}TUg@lxM<#tgp(`1 zW->@5sk-wkbAktu$5M-sMHsG*NYr*xvJXmUSnhh1@B2 zEANjOC-CL)^ta%)0)j26(Zw|Y0z1ddL3vG&1X+B=*u#zVX8_i>`F_cFJb z(m%Gk++veM>h)~vv^Ob|?YeD+cVY-_dc9Mg_V4HJJA)8!~IyU!qY|Cq~h+ej_ z<$294^9znr+S)y&+*xjZa6VDK3Rz9gYj$6+_DGIhfKoXh%^fIb}h;%AC2AOAzL8jSakXbf? zc-Bz7%S>mkSBj?Gl;SBjL(!C*kXw;8<)%~7Utyk^iq4QsMQ2E+qJP3>W-8k6)2GE$ zbcSRqx)NDtDtax^kC!q;l$naIgECXmN|~wXZU{3|(MoaJ3`J=(6sJw6qWg<$Ed-g0 zR*I*hm14gPMSdBI{gMKw_I*GtJN6Az``pqu8I?WB9v7;jI~_QDjghd^8=bp>%b{;! zv?pz*?)}tp!)F-X_%_BjIdmSV*ZQev{f4J}9MY{?OMetifBnFueAd&QkI{ASFdxI` zHr?`fnFT^AG`wftGw9F9AKiJtcJCt*7>j0W2$sI~;kI4J>KAIqA6)jY%NQp8fnz<5 z+HtE6TTc4`GxtNsnupr)OOYPCx_+6{z3L;n zupeVzu4epu7Mc-5X~y}Sp1U4swE@Ys4oj10CJFErNQMa9lkRQc ziXog}#20sU@c0`Bl3ME80@uexqYOh7$9{CX)Jx+R2Jr%XqqHVd;C6#93ZFal3vVMq{Q9 zYUCqqZi}z6xh=lNMvm#%t8T%GZq9WVpv&J(iS{I-I=X5NO%fAE>0#Wj1l3Zm)FpHL z;Fp-WKXH-ChJk#y-0ewW$OeXiE2tO~02yQtyh--D>G0u3jN0CT(L&w8@Hyyw#l`)O z%Vl3uY_H?LZo+rp0;hk4(d>MTN{%C$tHH@%WArqm&Xz!oemIfK7P&l+4fho;x!*90 zKq*OtbuV%W25u`ZQ&Ia~Lse-;^H~TcrHNL{d2Z5J}a(SCFPe zzu3}gSa>Y7)B#H(F_s8bKZvD=JwA^WcQu#d@96X#p>c}e)OMp+fhX`@u&L0|8^sfN zqu7n!D4xI@#a5POH+ofg0p@h&M-1E# z(OmYckr0KBzY#DcZ8<&Ax&632jPkx0j|&#@G&UdqEBu`a4wT3HYPNF#I(Gt>55!1z zX`9N__YXEVpuA6{eRF#MiRatNWhXA~FfNy)l1y+E&Jp9k6y!dZ7kb^^@O&}bNDe=M zW+b!g0%83-6Ku`odGbSy@P8C~XABqjP%gt9*UFp9P5%~}`(1!HY}{=Vt~JsFE~o8y z)pxC@17In6G%4v?({lj6ARgvHZVJE3xYXrgE}z&Yl-u(OW+ExYj;&m+Wdxq$U=<^=3RAUV-p|O2XUI4f^8o z$B2sTQ8nHkfVXB_%eD8f_69}ZEOOHUjkysy=O<{Z{Q8b;JEsF-Pbl)vORy}Avov=` zmw-FOP~xj}j+MR?VIdwP>*Y7&s*{0EemA;-O@Q~SUFDtG-LmTOV~5;F-74>Q>?!3` zR(hXx3nBTXTj?E0v_w?pm(&DQR|6(i_|=XM(Zz^!a$k3IyyA$o!_lTblqr3Ww`w!F z*=ysSinmIBWtn$W1e$beo)JZXASFG^=%3dTl5LNz^%@CiCg9qK<$J47oCy%gWIl+Y%emD6x_4SHi!$rRrm2+xobyTk77 zpTIzUrh(4>c65XUN@?i5Nn|arlv+K~YrQJ(#E9~iJEh)XA*J%>xV7H?A?4)VU>A8~ zh=;h#$-5{~;?3wBQg9`cDo>LFmD#=M8d0`0a9W7vn!M{6Iv$BrLpR}c4o;P*XQh50 zWJ^r){9AD)dIX))BT1b=-pz?#_$b9zCBa9@*aCkm)@slv z79`93PJ7c!6Tu0sJQ=DE5%1o`fTmQ*wAujh}+X&+`7{rn?4VVac0L2ai_Hkl&^(I2^B4WW4rV?xMS~T2Qja zsrClotD$2ngTcgJpupDw z|A|4n^e0}9H;hn}w9pHn0$bv~fUViP5T>CpOocGa-0qC0u$#_1N8lf9k3G}=zzo_+J~ZP-fHx>kEOEbPetY@?Ti zEJEu%Ar~296t6%hGkbi}96#&pc(ylkISJMAE_t?}Ek@^Yd0LF-;rYvGN@$@wo{_C@ zi`j8v{<`%0EVCe{`~Brb33oZ;XIUfbT4TGDvGymbD~}Do-nA}7b={T;fBp*_(05`L z@ITuZpW9%?>A=Np;BpA6CmRX=3q5X+5x2*S+q1YVMD=~2bh?Ysr8>D*zwPYeLHr*p z`V%Bm^h|bf;hc(@JDJNW)K2xb`wsuxbVlC=dy+~=B<`*l$-9R;HJHkCGwf(RyAPfF zI2Y->?KP9!Eb8LwS1BL~i+3yV!d)qKf4_ex}CsvXkT4Ob4mWiq-Z=@3F%pIy}c)+#`gV z=iJg@`XwQCt)tO0KW`=Tkewx*eF|*vQKF!rje$&(D8-W`O7SF#p=grCP>V?t=jAB% z?rL=TU0v&7=}kJN=*;o@73kb{T#i7EV=e6r{vQ)P<4Jycr#jDJ;JnJkeUFQjMeZW) z$4aF)U(5ZlN0W7&&i%;*pC|Krn=u+4&+C=nX+adP>o}p4+-H4Dl*@ z){_7^u|KyN*Z|0>rn&QoOWEeP%UP4r6`zsa%w3qvsZ6@sQL(n%s>;2h=1&4j(`+jrn_y*@9eXw9MNLIHb zC_}QkB_S#4>Xrm#C|cdJ(%YQQE1{D9YuvJOS)f@WFxM@2f~ll)@O$N!r>jz4U&3Ju z-%90P>$VLVBI>oNg6~ld#+#uCi*m1XOM+Tx9Ml$S?XBjnm;&WPBZGaBDambNrH^M$ zNSHBqqHsG&2lPlONY4Q5qpqJ-ge|kGnP|WZdb7f@llc$ zzeL5L7|E1G#kb^&k&-KkiV_B?>9+`n%!;ED@dL-%Cg2Rc6#_za91hth*O*HhBbl2 z^t?(^Gkh{@PI!{W*}fG=5q%{|jbCwKh`F+W=~w(gYDAjbi`4iP>@?}-isXPPhhgDxH5W8JuUVmq?e2?qt26F*z9c9n| zW!T(PN%m}KNG8fNBopPcusKp~%AW1ppv<2C49P_KVq`i|?#Z5ip|W_UTqrNz^uGei z%#*7sU;*nXr$&l2^3`w2rgU!t1%}^*)Co?2<@*l`Di#K!0lDJBWD6@Do0m@WK zrA(DP24SX3D#d9t6s65joHnhJr;6*iN-D)wQYrS!P~?}P*e@;RQ%Tc8Ddj8O693a) z2F7mVrMveq`h%0SHi1hkH`wJ+oqN7Z|H8S0=e)a+%h#w}c7~Om za$vO3`ZGp-yJLKtV|!0+&qo3fmF3><uPvJ=YXEu)IypyH6sAo@gv7b5g>FL#Q9 zeN?-8^p|UT(ly zd3sJxfj286=Tw!Ya=aOV&P@D8>{QfZVhGROQ>fz)qS8~iA7uYw@f(or zvPfT%WPn!o$h7UO+srnt>Yl6$pwd%wZT~moNZLR z7gn3aI;&ia7Vkn^ypW5`ail-xFeS4ZR(9_CTI(C$$hQ*BpCi_=?@HSKi+DOsLbyAb z_TMJi^8`K*I{Afr)1L)OZe;Rqclu-kI(at;n2moWGI@6>_1%C>-o4K4wMy)TlXsiY z$CG!=%Egm+_u@W?Chrt7lXs6Hizn|M2U<+tJrBl{cM2^g?><8qPu>{_C+`%rjAZi8 zP&9i)>9=Oe>suV>mE6MQT|U)AC>2fKDVWJSzdMzol7y7p&V<}V68|SQ%VZvY48324 zaPF=FPuqS(GE45jYAZZ76wae5g!5>hknx?cT3&K1b9W~(ch?Kb)w#QAbiR5+CKIgS z1G4zQk8AnV+N}=5Gw(I_sO*CLahozM^OnZA-;#oSk7t!N18HKv?-Ff-*CJ|nu~%Rk zr}+r?-tYH>d3W?7XoOaJ=|^Tr8mA0N<0O=MWu zkD*NCq?Bo#zCf61oRs1Q#Zc6s7>XMdZJd4**Ky;d6gN&vv0sKFzYN8GNmF5YU(!~j zD1llsyw>|LBK3Z63SDJN+f!NUuo>w5=yYm}lC&J>MxeFwNa~J?!j{A9gFjty>FOkG z1C_^6Sa}rUhcS^d(-?hvx!igqbcZ)nh}(fDp_)FXc;)d!;o7q-{D0QtuYBFm?Ti!kjSpCwRl%~OzN)pZ=kt~v8*xD-y&!3)FCD^gimKQ& zC0Uxcm=4t(EOu|2nk>#MW|yc^9S5~(XG^HfXgR1YaC-BtOVDk)IN9D$Llec9X~{aj z?L`L0rK|l^sNet9@*ICFk0PS68fnKi%rT!6g;sshgV3&Fa0QT3l9J=+OTj0IJ z;7Q1B^}5@`yDFl%fK^rz6|kYGfDMHOtPmHlQdR+bZ5g-b6H;C8XWhCWh^Wse;kntt z!Q@6SEEJLGVoQGdmgm73RW@CctkRchmE;!EmuZ)fC}0Jo zz2)A0!Wuq@Iy@H-R*?ZsbCXqC6}Jjpmu#z5Q6Q>{qK~VhLR1wMqN-T9Pm8K35LZQo zs46N%Rk4#;i>jhPTonc4s<Q(DjJHaqM@)VD#TS$>EEkj6Crhq ztD;hNRXhp{nW|V>Sjj{gMpaGMCyRWonTx>6rW=y^S~Hd6n%P7eOgnUYidqz9}MRv z-vKIZx-r>{+9fAImrWlq$Qq}u;ic51O{k_jsY$m{lO~F<^OIFp*%z^;ud%ReUo7!T zPI@7hrirBou*9bD_vqTa(lpfSq{~%%V@=!M&+Jw*K%FNxKeGwc${aE2-iNKCe(Vw1 zqVwjx(CQ;0S=U1&#zRZ?P3v~)z8LKpZ+xdjerq@|NA|P3eV|EV@^FEj zIQp3W)~hnUNHpJu*)PW2+n=orXCYc-YhUqanzKcq=_`I7QKqlB8eyidxDLwn6*DA# z#SBSbQ7F?_{2I#i6*DA#MeEr9E&7VqzAgHSBFgj?^Po&$Q7O|`EJK*-D=Nh|n4#zf zGZf!o+E;8RuH~lIa|4v(zM@j>m!ZfnL$P1-WTPCqZ|ho9QBpFj^}WUIAd@BT3e03` zr1UcSD#g)ZWThNNmeeEC^rkwO0`d+W7apxv+TIJwdW6tH4@z^t#GCx>T&wg1+bQPX zt>>ct$}3y$!H@)3I)hoEZ@%BonlH7$Yd#-yv0ggYw*4Vwd?i_3y1@4QSqB@~Z6h6z zGeW4ImniX{BQj#GdS#-MzZmE#Ztk^<{UaF=?ksRpJHJh+*O6io@CTt5$Vjm*71e-@ z6gx4D8Hbx_q<9AUc%(Q}1mQN1q93-)j1(0zBgMAJ;*nxIpv6eB5sXKQ3N1#8yC955 ziUz`wqCz}UG}L0GxFfSr|G;rjdQ#fEy(om8+Z5}543&i4a&HvbdN5WCOYgTUy?JD% zl4PtmH6qE`;LjRf3J_HRSGb7*v%$&c32kI!1Jvo$o!tpig8$a5HOiUCC6X za7_-^)UXFBTIW%@Ea&1r!=)X!a~a*~E$I7f&oJQ_+mU~FCoWQ9$~fxWJs*%o+nr*sGfadiBM$>o{r05#Eo)Kz*0!vE z-?pfJeQ+O7R48PsUlX#p`V9hFRKGpIxcVuysD8&HjH{o4u=**))z45|{k$S--wfQA zmn~pQVO4ENg9qe#UFcS;i2crm-aFJxp^{-A7B>cW7l%~vu9@%hC5MxEhCfB+lEDI! zzfQSiu#iN;X)PJ7L?p;S%agph6Q6CI)_IdI42e?}a)J{h8g_oV1k2iz4c3;-p$F={ zLa5TX6_?F+S_ftLr?l5)cA@3{fyaV&*<7caHv_Mf2H)@W^tLSsY1p^vc0t#O`fLd5 z2*z(ibZaCv*E*H{I&wvTO!51ZDWcar`HVafFUvGf9wASZqCByRx2O8aO;dKY^DhpjuBCxBn~U$oNVc99)5MuA%VHttg?Nv0-i|EMql!C{x#8_O23E_( z$D#Y}WMa$)Aj>HmAgwqT83hdPfCJ|usBF#sovo+MDBv%6eDb-6v5&7}D;4PD}-ygxb^;Q>Q0VId%g{A-QXenYAY ziEOZlhGQ+f&EQIDoBS(rJX!)gqP2fvs2?`pFY+b=w`0*A_D5lf_t)VO-R;+TUq)2( z7B9nn)+3bF%(2UYj~NlGyRi4}&nLt)2mycUf?KHwB@c9FQ|nuK6_$4sfjq5&{8d=& zotuuRxu{d{D)mBT-KM7~T`Jr}1UkE%eD9T(`aD^(65kD;fL?n=mGY^|oZ^ijKOMP(=l@ z*U|F-r1-VAi_INEKkdYfl3H&ox1d`$kyKhd+c{M606{i6+^-= z6Fh?14`R+X7hCsBmG!@Eu(gK{bNrEJSTgEM$JU|x5JcTaedVNdo<}JjstcK+IvL~~ zh10UC;(^u~_+&Mo1m23;`^tpvOLI1pQrdfVB1fCGI_wq2&6-lCSsRWp)2u1Q&6-l& ztSPl@*5(sP+^h*i&6?=rW^Dukn5JHuHKn*&^OtZNFEeqi@)v}lgVvi`Ld8^LO?$pS zQ0KA|&0p?f*a@Y%OW8{>ZELWnbI3Ks@Ey7iXC%Po;Po!ca5~VJMo0 zFceNhD8$ncN-d@#G)V^&j$Qq6m?R~Wr0}%oyDElST{L0)kf^66Vc&W>icbE6xPR}p z4fY(z?hvd6P$%{Db;zmyA@o!!^we@*!HbeB`VO?Fo6gmHu=Me&AMk9ilrj1B$U0O% zh{v;`TcFmp_i)-`&;YIlz3RnYdC&)1r}PLUvfO?mTN=s=l%C{;eSJl!>4)$`PHr}X+_P@BC2Lp4PD%-y~+1Gm~Bu|eXc;Q?l z^JL?W_siKK>E^62V~RItd52Z9*@bZ0RbTBD`Fj)hZHa=+wWU`8qk!6nZRw_%_AYlL zr!JURiY_Jc(zI32^Kw7oO>y(Gf9~$)nOuFFSN2r*A$;ZNE2b-EV4B{86626|&tlHy zO+;<0Z}eL09J^3vj$J5I;gsSEXDF(0hN22*D6DV_afMTAQQ=69yqQ=wi^Y3$l0gNr zlbM<7yThV5ilkRBU;&7;gORy6bLspwWKR_K_Xzi-p{2x4?+^+`NsDPOWRo++6!hWV{#0Dz4>M3!*>d`!n@wb1BQjbH7le^{4cW2P z7kOPZGKQkaY(|!ej8G;rTcJ#3l;X(D{g=peTZ>B*8E_Z^EW%tYRDa^y z-o-o?M3htgDVr|OifGi`>{edOSiJz5Et^fGwfI%Mb^j51dzW}S>4U-6-sd9WfEq(15eC_a?{@JHpP{VdSy#)b!D~K`m_3B5o<-sMQ&?c!B;G9ai~P~u z4ea@hQyFZ_&AuXi?n*VUlP=C@4bSsHI(nIq%i*y ztJTl@o;Qw6H}o(?uunu<1dl{Eb&t_S1YvA0W;yN5h%|XG5gC=W$oS%?$?2aZx2KTX z<}(DP(Ps!cn9mUC*JzB&z0R*Y;Q7ViY-9^O{@bUxN#Qu6^tMg3H z*nA1>jxeyJ@gWn~sZb^`p)jyuA)d^GgDwl~YVU?J=C^;UwDP*#YgY$jB5Hd_UeXHQ zNL$u&gauvhvy1#EaJWoDyx%U@w5}D1()up;GQoceWr7!q(&~36E4~$%ck!*KZGaU- zrm*o1&b+Q6UsgkIxyEXXSjxS zJ+?bG&I`l3FA6JH9UH`PxjI%9$K?{1#B?+E>l&{NUH=%lPO58zxGq)KisG8~$LN{a&mg2C^#PIhbUw|hcf<1cP2%^E|vO{!Z(am&VFD?N>%MoDJ8@0NQ3sG;685d599{_ znD*>lZgA;?G}UaR&adGfQ|j7SAG{Dkb(ag6EI*ydh{*3U#qJo~LS&R0r#Vc2S2}?p!XR$69lR80m{- zQ!$!-5Jr6U)ZGAd5%>^!;x}HFOPPoJ0j_l}s%C@ZJxKd2lH8i_n9Q6>qpMVKyHBkx z_@;iSRj1wLYp^ekd>FnSJ)y75$r)P3Pa>7hdHo-G5|!#P#I6IE!%_9?c}vM0NO=-C z7k}%oks}8V8bt5>dyG;?V>Dlkxv%5a8S7dN&+*09QZy|lhi@Sn-XVA*#ai7ktEwhQ^)%!*yx`E+ zFRsGHKH{A7MeVZdiUwNeYNzH9%w~!Cj}^9m6J8ueg>Lw%qS~KMd?pLLR?@*gL>?_b z{YOE)zhtt3j(0ol{RJWPj&?VQwcgS0hPeXK?goK)cY{E@yWw`?(>mU0vl#N?jW$Yg zZ{ASUn>Q5o<_(3td4;$)uawoB*NryI2&o|6-JlfjZm@z!kEK6|jWV);_U&cxQ!uaL z=Zbu*?3%>`tVvp{uONnBzHr9lq ze%pKAh)B|DPcP^|W~-yV>l}J|{JhJlySL)&M11Y(jVQ3JN1#30J(cI_rs!o*W>a*A z#`!#lW0|ZaXGk_hzm6=kmYgA3OWuGiv+r;r%Y2|>^y?&cr95eUQ1Sr{W28!WhnMbGqLzh$|(O3%IWed+b*s|x2MqW zrQ8uGP3~^}C_`bl`2Y-Oir}|$+gr%3buqHN8h&SfMQ${qZ5sY4P3s*eR21KFv!U>g z3zj8#Z3|9gmyPVNfNR0i@TisdSdC@93!NfM4c@aSgd}SX{xj{_06}gyyzP|x4}{SF zl0>zCQwTe5NVfLRh+qv{*Lne)aKn*LZTz-?bpU4q%yzp3W2q}e=XbaA`ZtzZ-gHF0 zAiMt@w=!5uxJo$dN-f)hbZ4agj(@sCD)#FT(zX|QtsJjkgge}uXsoP@>3TPxC#n8| z@2IXj;XzKrJ5JJjm*?C!Br?C@Rj8gRdZo567Ul<=2};P_u2-qIE28g#-0gZZe2O8J z6Z)I{V#EOJLQ^_YAX*N;W0olgp-egC?o72YEniy7p_1ItVsNjcU{^`uUL)U_e+Qkr zfr~63H7qT_Xv{c_CUB9)z2VVZyR5jehqZ;knXI}4^Y>8=OW9n$@CbT1;_*|tCH{>e z)ZgW${gZkaN&OtJ-rt{DII-68HoMU~4Csu1W=ifBrsNFCl-x~B!YS#L+?6rKQ*z9e zNUlqe%W`X&2;qyF_?3hjJo}`Oq(%ijXiv67<|0Gu-9g(m0Iq7dAXTZ^CsffeC#=SX zq6f!5$ZV5+!QvAc&B6|LTU-7&q;s6aU`DFceOhW=oF2u~dl0$_@`&hQ?+H9I^f|TSL!2sU ztymqCsTIK-I&-&%PWKG-EK11Dq}a>hp}tbg8ZM;h=a5RJ`c;Yc!BYgR)N!>fy?x95 zcpRHr##6&zk!}VWw}Fd{s2kqmg?#4_F*=&d?(;E{Q;3|G#prD=tta4a2?soNMWZ*_ zC%}=w0+D-|=qeA`Iu6*WBSRRmuk5-Mzabt)}0$<~LE4Yl{4s|hJF*Q*Rlai=nAY)P_TIgy)6 ze0|Jo3Q|D2qJirEy;tOQg!(~t!&a|0sOTBdv)&+ac?GxQIB|J{-{?;Wfj72;W#|vY zU4eOF+Z#x0cQiZ*n*%&)pM~1Q4YW|1Hqe{6-R^|6f%bY6z7p<61+|24s73f^NccDT z^{pj*0eNHGY9mp54u5!uDiDe45n1V-@N=d(y4i2EvWsdZ`D`CXUN56`T9&BU{pd(J zxVc!+`fvlUP_u8I_Slg&(H$EJmgS1zt1S#^Nrs0dRb~Xkn}BbDNif?429PdZg?wbP^Weeex;>dLuyy!IZdpt4|hb59gc( z)HV;5ahK_N7jo1^+0&aEt=rAbaR%bYQ3HNvO?490V;(UYuq9FGAI4L339wT`VX%d< z)dx6A4}9C}nig7xWZ=7AFaJcWZ4&s1W3CdC!;IPnK5rKX<0-28&!dBXf{ny%5m-3z z1=)4(zbj8w?C#Xi(Z891d!kRglUwCqiH`z1HT2O)>?|HWkdxL}48Vs>EXIi_ip3cM zQ7mQ(M6sBf9gAl(u?T)77H`8vgwRfMF1Vh%`zB1v$c2tp@rz`Rtk)0VqnBjjUFU~` z>+#yQspy5lZwD=V$@oZ6Np6EIgcnfm&)ZTF79ny>?2)k(EE&{ zOVAuAaG7H#7F<(hy&!i|(0mSN>%{yy+aGo+HxjuuXbnBu`4zO_bE>S0LEqZ>94$az zv;rMLU!}XL^m}ILRC*|w7z8F&dX!3kvhy94o~LfXgi0S!>6Xat^C|_6+dgw8+{sQi z6YegcCuqXmPo?KOt&Gpdf{8((@p*|#|FXLqx37WDAkf#hN8VQH6sJ6p1bwZ-DV(&i zH%VV6Nx#@Bu3SXY2V5&rxW*x^Be1zI=m;iNdXP%lX62~#WR-%6KrBD3c!QIpc2}$2 z8xgAA&s7NeDlNWF!nxTYU&Lu=&=oY&CY9bsI28B3$k&?U$+z4eD6|nrQE*G7GVX=W z9m_?wA`R+lySJnNTEx2`)l+4EgyaOiK@aonrCInVE>7k01ZvD$p3u5fx$*cu)_Un3 zJI${lkQs(C-#NB_)alHg68M-4+#KE9KK2BT%^mXzFC>pAUgIH8C_S@|xo)QG$9zWD z?Rwgy8i9>YPyd7vXsLpi(O-d^z&zB{$CK5^^`VcaL5VSt)a-#r6WNhmBza>NN$26C zT`(7PXJal85l*8ZVVKH?6WooM?syE_YCdC569(G5U#1 zyW?DItb7LAoNe^Q$>_e4JE1FrS5f5`6mX8?@vikSN?{|K{Z9zt3^YIQ%jgzs!~v?D zh-eE7U^*An08J4SIRUa6%`OA6EU*FSbYdvUg5H=;4<(lKPkP_(?ckXwVfiijDz|<` zqwZve8L0ARF*^GrY_&ZlG@2`?foY0dmo98SRK5%?0xMl|hc_A53ZX=yE-%zF-*%->b8hT--@BQtvy z%l@z4&I8PfB5T;4``*bj%rL`%Bt=pqVnP%Z1G`2{xZoNP6qOYLkzm+e38Ek>C_s}2wRd}+ z!=>o2k{&0;X%{@Zx<=Le=l`Zem)7K4(^EG0CVVKRGIGzJ5$LLerh+ z)#%4$N|`Y(L&+G|ILR}!B9x(cj7uRi#-)@U<8lueO3(Qus^nwp`Uap}>SsOh0dSN^ zJ_q)_48N2b{f$oF4ZsG0aloz<_#=|_B;EaT*O+rVfr2XlG3O`(PYZ~l+X!58Wi0t4 z`TT)6re$*HkgYTXwal=y+{Sf$tO8b(~#Fm^sgY)d05IVKPpC z_SqQSi=Er{Dr0mzo)p{>z-j05^gWHmu*I-S5L3G6_&#)BI`B=`2$UG6J1VvFxd1u4*fu4BM3xe4Uk*wgW2gMtabE%;+Ip1Pq>U% z5!^yZ@fYwh!RxuBoOr!!UC*}9_c-+~C2=WkNAYV>epw%Wv+JPiGK11NF@1)u=#035 zR`y!$-#FWNK6UTmfOHCu8ZMn7?cf#OXgYXD@x*O8Ti$1aV0846)?wP2>yJ=6b4QK9 zXr2HW;nN?Tab8E@zQ?Y|IM?bdOPN{D9R%HJ?4BIYu^(BW{NtNgr{ZQ{7B|tE1g@C? z+=e?Ga|>%)vvq#D%=Vtya=3M}J`VlFq04XO@JnUE52ZZO(n@t+URDu&8iUR$kwuY2 zq9AJ`Wk9|z&VYQwDUkVw^KJ6Ue#7}8lwICQDKnIBC>hE(lslB~JKUcCO#)3juPF2V z&##V2EDB$V$?ZI)ep`PmUD2=6tkZc~{pxTCPp(Qj57%Ex!(1p+SUb)H9JTprCF?HDUHmyfrz5#d;(H>HferZDbO5*@%F*38F zR?A!p_aAO#=H=HSz1~KaeaWJfvD;8$x1p@vJj$O$;_`KsRA%rK z)hD2J`3~@bB&~Hhk-Gd4GIcqUx>VA-43<-u3nUS$GAQDaML=pY_^z#i#v7Rm@)fVC zMUqT`d5dsnT8OubCATwEV2UATWyDip3?)-wxEw6^4yw5FcB*+Y&FXOkRtapU`EEGT zwWhFj{-T7dN`B42Sp&LXvMZd-@oln7zjN?$Lw}t~HFUoBr0+I703ucAv|k*X4Jz^oOi&Ti?pM z+l*r!#t&OfW$SiZtv_@WZ$A;ua=P7KTjKvM#yZ``6xM`;uQI|q-IkQFrqxq>Fnomz zb-S*xUdeqi^t#5EwT+1P4#_m=HkJWldDUR(g>;1u)ho%D%{o-CBt!MS4Al!2XTEI~ zN@w0TtcNn+Hd|`mW)6kj#uc7bBjy>xJUVG3;4Mgfq<{7cFhZ%F4D4S?YpJ9I`~5N$ z59~k0z`nJil~qF2uKq^KRtinC!QzrtphZ`y*VARCRydAa9!KbR8(+vB+8Z?LaO(_h z(eI;910FuRjc0i$DnulI?RFE@dM9xVy^*T$i-yIN`6OIr$x9A_7MZs+HDsLmBwQf# zmS%4O-f-wIXi229Otp=HGS#N9Kknp6_BGAXl4#~NjrlRMM$CUO6C}zggWL(b-CpId zrW_(E?l!Tifj>J#GXMQ?N@Zj+|NXw0Qab;=`kzLY()sVVQs1JP(%K)Lq0GxR9o~r0 zaLFglMJWT_Ub~D*^+7dhT9yAXMu?=a+w`hhe?f-Cq_;4_$i$?@F$HSU9+)JuKuwy5 z5lU*(zcQ3DiF0m#nzi>6lg3vve@raG&5bgtxELz~6$nG|_Rzp~4dM3>mTPtSj zxKjvxEHDk&rB<%Mo5cbKY^{d>hZu3*eb96Jv%8-ydYX249)T|f)&M^c*za!OdRnbR z2wWlXGLpPF!#Vn#NY)~Gl|acoz*eA^z@-9T0=E)aA@CEhmOztxfwzIY)bcFIgS@2o zBJxF&!0RNCr#6tIkBej&R_Eojn4_ilA^DCtyS8oDCCxK5uXgezd4~S~vTY9vHb4ru zk;3I!Fp8reh~%^XSnOS^<)xN)8uK!B?x*w17F|un=T%5v(s`-v`Yh}^>AVE;lFqZ> zkDU6v)bjHA69pR~g-*$az=B5@mLZd0(k5a@r zbVcgVW<@==Xgkfw90Jk`MQ_p-VPP+87+b_}t2>iG-3Ne;NDd=#kH9Jrtp@~APNpu0wwc(!3JKmI{ z)16<)OE7Ak81@V0avot2ge_V`QKk{7coY~8bR=-Ez#CNNs{}ec20V}CYyz(cyd2uz zh7nDz(X95xfa;eVJL7SVPxAeF*U=S0R1i(}EB$epZisoY;fRDxLBfUTet~XrbcbIY zz6@=L>}U$F(Y}EW9NE-r9L=SZura1O(dOc`zYRJLS#k7zaXKs*%SQ`PTBjCU{wk!U zaA9BkKj$D^b;#WL1q?E`#GbUXSrEceGl_SH?9 zW3nZzC>aU8B#Kw3nuhlS)rd+X)@JkPLwiDn(KV^vsvoCBhF%MsIW_ksD49}`s@(zY zifBw~H(#_3p&g2{QheU0ka7vSb~GYYLtH8SYPcj?99Q)FP=Qpmr-c{P!h2eHgA_i{ z!YfMBffn8!hAVCscU*~|=UvRZ&FA+)*rHeP<^=?rEdbu&`hD*G7S=-ZfN>1R7RvDn zDgW%7d0ZniXc3>0d``B8_#~oc zZ9>UKavaLbP) zL?nhC{gy5-X%GD@E_O{p-S8;j-0lr>J&Xx(9qJVTZ48<^i^DSYc(akPNg`4 z@pUT2F-UPrv^a{Abfi@$4N+qfzc|{SHVsh=F*#|74nUM`h&n^rhR9H+AySltlZL1} z+S!K4P|^@7nF5B=5Vb)!Ziw7zTp@)Exk6afGQSzwi=%gnWIF?-c^#3w+hy(@(tQs7 zgPtbN2HK&&5m+s-mIU$|rMynXHdHQLgxXic$%DK&*P*gm)P~XfseFc)8*I@AUc^l$ z5IhU41aeyfcTbMqERtKW;4uPCp99uW(mxS+RDiiH`I0ppJ^Fbh-=LNo$2)68^bjI@)SE_)7J>x`+!jkY(gmb~d=$llLcKg;s*=}E#lw_K8`wS)BJ|$C3 z?e=w-%9Czi*oR{NOiV9&J}mY}LSZ^>RYi-T@lYXDE_YCWNKATRRzE;VMCM0amtM{E z1SOM{UYF8$Xn@8Dn(VMbdk=!y-a}g`+j|(0d(n1Al)Y%XLfMPfQ0AgljH^?74;P@F zy=V<37p;=12fb)JqMP&{rcl27;kwbYlwC?Y7xJTziz~IXhA6G0rB#%qq_^PTkNOf# zY-yPGrE(07;qpaAqw8I06J$!*gM}V9WH;gBXK`qTC7DjCqQAeKB(_^CaNLvz5^4IgmA8B z$+a80sp!L?UU)t}eIZm4eat7#;_wS3i_L*?_fd$l?*1s0b@wKio^^LaiMuPA4AtG= zl0?+$wVB$3Yt?1 zpGrQz1{K;l9)tQt(dM{wY@LHBxhG9SRFdf&KLBOj+fc^66(yJCp7adbS@$-SxVKVV z(Q;3^4c)}OkDxpb?O9Fq17(%c1&}%UQaVHG-cmY6NlJb2MAY{|-Hx^fXnZ*hXD1bX7Vu%?dd_hHOaB)}_c43ScWrlcq-9V%|&*J9Ub z^zXEz1x`bCj2U3oF=}!hW4`8-JT)zWvW{UW;~0vPPvRKwpq+ILLy2Q3i87~09AhrJ zv15eKP>*lZzLZAeSxW3RXuaM)Z*m$3hhzQTV&GP%B=qiQF-UC^N4izTXR%;xcM*+t z4=!vBI0dBHwyL)9P{0L(wsraZ=W(WqoC>9)8~GWnK?&)k5q}Q8aXG^BXgWWD^&+)- zE#yis(y4heK{1>*$X`t4L-=jpg6IK$kac)M@=0s>0!0&9y5Xa#B1-uLDPIZu(ZlYZ z{$R>67P`ZY7VxtZ7sl8&nnd%p6xAu3taN3!kn7!$>B@eUkf}T?ID@DIq}UIzjN5!% zV-31twAL@I-hi$ly^2;OC{g7q3SU6IuvBb%C`boiK%*t4SAybj9dHGrVjYcV>fw{2?W^b(Xq3n%yy5y0xJg+0l-dNvA@Z< zRuXZ_NVibq>1bL|Po+vC4S4s($@u|k5KZMql)@zpePEY_zb4dXYEc8uMlcTL1yVPU zyG_Ch>iF<7@zSsTbQnQ{pps}rP#$)G#zJ;9GT6;;1WkneXjIUkx+AF?;+zLHZ4*pN zb1K?X&~6ir<}CjyrW!rV=Rl7ktCF)^eKGU|q@69NTCx$;cE-_s43bYu^HG$1iYQI& z7OxNkw-^(E7HLoT1d+6KI4M82P zEJL`MIVp;wUzeJax;+U?!stsrxRKNik$Na+P{~;B--nkRqq<-CP5e7!3Zl*S?&@G7 z3!=oql#GMu(L*GQwI6lbGN)Ojdpn``Nytd9zCLzTnA^#TYIOG#%KYGrs(U#p1>M3p66-9k76lb8lJKCw}1=d8E3$=#q zXo*{`aSd@cOEj*c#N8Wf^_F}dPDtO-snMIeA+mbDp>$*wMg8BrwbY)$Fw|4g_xz&P z734KqBmd}BYh**@wL&8+O62c}tX=45P_G*?iM?97(2F%P4+);eHb~a{X>3J_J%rfC z)QuY9J*U3v8$y3?)mIe#fs&haM1DZMGFnG&(h>OuDwF=HqnQiFErfJM43gMBnwX*_ zHb^ozB~RlEUi1O|e<^u|y3wY%%6cDh&g4|O=d+t7=kzY#gx*i!dx4t)_XUQF>9t2Pu{2j= zxkn%x$rhb!J9qNmoyl&!9C!-dJot#CdoDpTdk2Z-?#ZqYJl=b3XVFy4c}-MS$!;w>_ak;k9Zf(!3_+~3BNi~Ar4vHE zQxWO%QGEL^^3T~k>x*p8*D-zZV&cw_$eOcE_He%8u=^`JnN?#yQpO0{F>msNx@`7C zRZyputo*}fkC$KkzKP>+ifo?b<2<{8T!Mcy2+rm#Wi8L4Uy$BncBgOT$OpRAm8?$U z2zz@WkgsH%^)kiNn@FtX67y`^>%#xh628}w`BY3=at~uCM%uSkOQ9U;dOHp-=AC+y zZ7pMS-zr4FD@rYG(-4tzgPEMycjD5%b;=RevCe@@`6R90(WLPHBGNt)TC7XRHYcca*D%n}d0z}SBkoyL^idPUfwJ~%S51*z@*o|WsvH4v%ZaISqI#cy8|}h&bJd^*B#w%DCeC_C5`yYZ~Utu8qZwgQ>+E<0Bx>dS)aU;Djf zTM-csSNCe3kkhr$KMQ!aCuWw^_b0|-e6wTjNRCwd)7B6LcR^+ZuYG(*u; zGOFPcxD%?bQ`*}58*n7xIHmQyhZFEGYZuN+!2L;b2sgr=O|){&?i8TNNmpxj3YqMb zOmdI>my44P{-dniB{BQuTxR~VD~(m%>;Vybpldf>MH-q0gB#Wsymx^ zJE!{^0^bP?)iaiNw)NYE-w^KoCYjyCml=l=kf`p9%uwGzu6>cTp z8oOVDhtk%#o0(nAjN>QR9VWYmZ=u(M-MMW3WEye#dyI~bXSE_ie2w%$`qLq%_@c17 zXP$MM$M(6bOC&ARB+9al2yNb`1}5^-xC4Pc0v{A&kQSvKPAdjE7~~E{mQkLSr>tJS zl0%u46EAnf<-=wCz#K_AEGOk22qbA@V~#)fLE`>{-5LqBv)ym`fAn%n{E=;Y^4atl zU!D96j?HG{hu4^-tRGbS_AI+muwP8vSsOSRa@|h*Fs?{tm@l#I*>>~P`k1P1D?B_7 zhyKSbRoEq_GJliZ*h;SlKP9f+Z=Z~!o2OW?gW@GwML$n5rHVO*jI~>5)1P3s&1A5% zc$u=M>;qecNl~S68Sp80Zb47UN&c_@IrXd^ts4DDGqQ^3?*1PYEq6ZWsAL7_k55sX z@Za5wU6%*x57pxnD#9yqieNV`#YxkvtT8G5PVRe-i!uWtH&XR;kTePQZm94&P$y{D zG`tr{`J_J@LH^?WHcr7R4+8YWbjwg^k!CBrNLH*wOA1eg`yeKk+KS*lt0{VY^mzcGbH;J zc70V<(nQk_kxpYt^j*8T+M-a~!b(4lq?1VAvsfo5Bny*0C#N(l|tciWW!r;v2swv=R3ez7lg-J`fCrSoA z_Eg1Th_XqJh6*%EReVqsdl|(ki2O{7_dq48h{1GU**xo&Y{S)gB@2@tZW^v%`yFX@ z$Y~YUAamBSb5)`~BB*z{_N#0w=zpZuOzv`;wsnvup5}2YZWTX8`K%*M;ya}4{(Tj_ z3Q0_Q3liU$)-D_SNi-J3vG*gV-_$uABhIC>uLuuimyLLt92%K-Xe0B<+$TBoqsSiSv^v`) zlzKlm;t`PBgWi zo8v+2IMkV4HmxJ2v|aLwtzQ9Mg;vH0%bBx;Dt$_#FJag4ZaibPlvL;X|HdI%sKmRF zBeIHud%y=dNBRNoW$d!ieq&g`eJEE+UE#A_B{I~<>AYSzR7?0N4Jja^ke( z(2Is$dc1+${vV;cAsqu%?uueoIj`fO@}x%`&?9zF$w@iWah5bOrpw>S>@;@n2(;F* zrEX+S->)Pw5q21AxuDySy?LI?T%=Gy!H@D4)rcC}wsn+RzsGmt3 zayD`|lNmRK1oYWq8xx5K1Mi81k3ub{vfrj{&}8^DnjCt^Aj|GDhS*i-^G&Zpuky6_C|E;uFsC@$3>CsfouyXORe&vU{?z zZP{nB`qrmB!m`;fk@@`u>U{>>1GFYEP2lgg`#AsWe@>Vf&G$o7y4?R$7K;7k_pNNZL9u_TYvQD=-h8_vs0T)TI9#s=5Eq{hE0&epRp*)Ke6lWnc0dA0{O z3XhA!VO8VQzJw)9KWxTWOu7ZusoK!WOnloOTI17R$CWUoj#Y3PhN{}Wg=xt~!^`Z} z1=nYxIz2m1%>T_{YIG*)W&8-#6Q9K9ylpowygLSep;Ie2@VFKl+3iDrPF#qTvJ6)LSj|Z@H)FrDjlEfrvA)aVRd*@j<8yVse@wOFdT3DMavU6 z347H|ZBD>=Y1aB9@~lst9_#sGWzqk-C>ewN@So|T*W+@PhNJ9esRnUIrT#6s<@)1= zcBRl(YIb}%>>hTg#|X)*$=Ms)GF%jg(;MuP!mko|+ukh;%W`3PF08P3V`STbQ+J8Na3Wzc(s!N*_o{}U&)5II`_(Gx$$(lo(V>ztC=%6)m)zSQ$zWYHg)u7)g_xYd5zFW+X*As5EOhE!zKq z;n`D4due4WtfOD>ZPM^`4Ab8wrI6+@cr`9YwcI>cBa$n-T5q1|^AgJ&Rc1>e&EaQf zHnJA+VUWdVMKpyCzSbN01X`=`tVWjJ$R8wbnF2TR=}5{A6#JKuNkav0u2Jpq%R zT(s7CDyj-%eeKIygF+G}4 zpkz7S6RVS6xXqJ7{3Or;h5OjFo1MHqud46)`jY9q?Ztk$MK0yAJh;DCobJ#pSOQ1%b?AU=m;U^FEKEnlw`J9E#v#!im z`FtX;Kl;B_dEQfztxrYA{YdsFv3rEgeu@XFMFg7v1Uw70Coow+BzF@i{n<$3m3|t7 z@`$C0scEK`vLg+7!{&|*n>!Yqm^ocKrA$H(jU<8=uc) z;^mEGNW45})g=<=JnraE1G_6_I4jS8UGZPDYT`j8D?cD?v~+}Q=xQ@`rCOFVf|_)P zqV_zS`yj&#xj?>;{gd4nGN~YM<>nhftP`ycd@= zv{uP&*_k#Kxg6tBX(5SyjpQzmhwVU~wuOqk%9#6G@L+F+eDh z(w`8i6W;6XQJNY;a^qF4YjNsN2yQZvDzJg>qIG(@a3bLW5Z-D0WWLw3Ol1lx3&xWC9Fq6F>at)e@DLCJ)RJ^DpD;7j zHsYr(Y1-_9qL)bgKq}EL^n)Hm5Uo%gvkd|P_0mo;sF!Z$1c{`vcxh+Oh(Nh`>AV=! zODkiw67|v~Qa$m~{~pPB>2{J3i!cyR zdOH>d>Pasoq@FZBL*hvzlVmcU)HAMJ@uXm2d=AuGK8pdjD$7WGfkdL-Qbvm@mH>V* zAvtfxTN0UiOCs})w=9m6S8rLB0|e!-6Y275gljtP2DSwkofzN0-$o;6xHuUhwsVJz z6_SBu0it9(5_z{u^G;zWBm9fW)P0j(c7%T??-cTGs3xtQyb;N}6YEQo_#XTFfqAFe zCf}y)`mlMEuzhE*1_p`NRk>Oeafi;{QpADdS^jVqH#YB%k~^dH|J*dPjGXAV)?s&~ zOm)*Y2*)5^E-E9rb2!J*gLOXyH&ybIZnfM@;#UaziXeFr5XxHvBs!-j+gZ=vA1`q| zi(z59P`0~){|EC>=p1gl$MXMP33L2O{#W{XoTPTRZzeqGJ=(edP5AKIa|lCH6>U5mVagdW;Ssj`-7-%+0~a-Jx1pEP#zbn*M=lO5hRxZ1DI zd%AJ;>1KE8#@&luz2TgcCwb>){wfG~)<@YwOK1LsQ*sNfFMVF)t)sJooqGp~$eRm$ zBWtUC0*reY7>;wa3UVYvfJ8!6J>ySstUKDy4QPK6D>ze%@fCfkR2k;T{{%<^D(Bx0 z?vbs?12#~E{;{_Ei1eAA6`=b8yG(ISpX~UQXFbj4&X%{1@&?Fz8D<{Yg*XEe>3Nq7?Q;AMck*<{^v;5wn>6ODNXNULGf6XTTJ_$S# zC%!|v?tlW%^wW};z&Gd#86pf{1~eIvL^oQ7z&-^4^+6HNVao)t$+Mawly0_JIC|WAupr%sEGXX z_L{aZB~9OTxZ!IJlm%)?hi*T_ja? z!ntwS;iChMGC%~iCW?eLiq{IYZ^*~@>oxIDPau$)k}CT_Wwp&zreI`J6U&f=ejQ_< zg4mb*ZC79UCVN6;qTO04-oPn8g7LH~T82{zL&ps|`Fx?{0Jk_@6 zOq)5R$8yN+!fqU!Lu=_xBB1BhxW!JVE?&uX;jTncW?uPY<+9L;zef~%`fApfUt`q2 zoWTWs#+nyvcw1$fS`Ng|ZtFQDiF%KgX$lNKak(^SSTw#|%9(;+*)6vb$=*t5A#>-k zlLv4+p30WvvszC&GVnP{?Mo@KG*bM@D;Li?A)C$72yc$F=|5{Hb0gnJfd#XWsOt-= z>!19KZC%M>GdJ?6gq(qe{=LAph+L=RG2Ruxb%5h^JkWb70hy8LKb25CSMpl;dQ?+R z$NJuf2{7l;UzvcJ^XOZ@+SV;5hjLG%-43LkLrgSzC&B<%$v*wqZ0KNLG_j^7@|C%2uEl` zc}PO3;wrBwfpod={kp~I@d0hAw?2Ww0^h$ffk2*%SVaZyLyC4my3lJy8h-;0ElB%b z!x#<@Q-08lhpW*vVPQ$7S3_8|DuM^?5>Fnjgu-C9%_5|6q%fG{)V2Io;3bke!W!>n zR0l#H#G*e5@h+8jBv$wkrc9SSS~N}^C*wOu$b=)k_8OFwd)EGE3*`m%eI&AFeE#dipFt_!ffKUzA&J+EizNzc%9mAaw# z5}PMorTFg_yL3>`ffw{1)Z_f#JqHaQ*!$8{>%v}x`(D)M;@%hcA9#7|(i~{hf54#D zb2gZd2V*>`a7)}XA26tYpMHZ{mk#WGe(!<3`<>gn&7jK%^uDxp P>e46b65-fSQRj=^;$CGaNzm+qyZ!>>7N%m)d=zC3IvVZA>YK64TLZHMDv1l7g z0IgK4h$8C8i0TRerJDV>S_aSm81wJLUI`?kp_IC?#yQKs{l^hGs)Ufr{gf)Is;a80 zs;a80s;a80s;a80s;a80s;a80`m^Le&zoE4yg&cm_uv12S~8hQG9?uPlS)V%B!ncC zkRUOk3j_!fL|RlZN)ZqgQE^pNth?)~t83ZSbqk4jP>aB$O}OJQqL`BgrId%Xw+v;y zYh8V=!RAqDY-;vaEG1ev$dyqkBoRf@B5GUHZS5W0xlXX&dg>C&a7;NvBP+7lu#xJj zt;m|Y{n5i>?q%`NhkoS&7Q-eI?}M`0if_EL+TqJ))t|hco$zrTEbQ6jd>R4QAjmmX1Fq)y5b2H}tf28onaNJIsC{sk{3|G{Bgo}t^S;LobS{!uAuyKd$|P# zbapuD<&Z-OGCF(lZ@&zf2!q z#>{+A=AIa4Bc&F>07cW%6hukPM1!G)BFnp>+jcFwrEE%OWMOm0)(Jj}Pwt}@j3lNv zF~{gayE)C3`hx{q=$f0u0eK8ns9X;Lb%j4F|O5N3>kVMG$4i& zmlAW9T*k`@oW|=9K7FvOZ_VC)659tjt9iV3s|isQJjm8Q%jPpNK7UtT(EMgP8zx1< zbnNUqmewQ?a{Jx;hSiZlgm{9^^NM37dK{7noff`H$F7rGE+YKmOE`;MhCZvKo@y6K zgG7=aZL=W+r}Uw9gU|z`)w$um-BCJq$6g>gnTI0G>P$Xm9b99!p+5`})EmP7J~wt6 zTF~+MU=3>M!}~G1aBsC+gHAe%2ubXNtj#T3ytqfHCY98>gWQGV*kW#`^*+l?3T`9B z9Cz0)AxWCRG%S`+G?icS*2X!U$MGt1d3IP#M57tGu|Bc zH_CQH0cEt}1}s`oG@taI;}mYSRnTKv=4I0&+6>JQs%!SJB{8es`&cSfgdAA<%DX}# zEG$Aox2z=*vO??4TbHoStO;TgW_59|N! z-k0XD>H>E)J;3=wjebCv;ai%;)3k$=#{T{v1q}$WB!Z^4KzO^i{sTk=* z9EK!n;b%2J=`tt}ncnJD4Ca+?$dij%yGJ|ir2BFG+xA#^*&IU1%FpB)2i`TNxYiH_?}R;Z20sS{ARXhVPRo03k!?4 zb^MXP7YrE@5s8JAL~uv0S(Og?+Nuad?tWzLapoz56S&M6eq z^2e1GJLK=w!x1k(CT3S+4tnb~SNRoh%~%J^ir*mS@2=fPWa{Q=(`><*!T^r(%XGoh z^CoBB%MGOXodk~|xO9WI`l%b&z5c{g{immI`dhJxkqOjQ_*=wC9n?QkcuDogR%_AJ zdfL*PhWlhK^(ZAR*)}?EX`Z)T+6Mb}e!(u1>g=0W{g_uo;Oy-AC~`v}8nM1yV6B1!2fs6G#k=%+(uElGO5pi|?yD0pcm z8Ia`9V-mYIUxGEw@E$LtB%W_$&a|GEH)7$-2|9BIDKE|sw^Q`6fyOgrt>RpeutR=o zP2p-nHh6r`W1ry#1e~v@Nx`^5I7#Uhsxvq9I`0-2^07iMtKl*Phmi4j+WQESHhIR`Ez$g)_h*OGjY_z8Grr{xgG!a_q78eWZO-CEO-!Y z6r;jONDwQeI8vVyh?1dsD2!&A#}*>Kop1`QBMX;DVWV;j0=y) zIk)W8t2$%dV56#AL3YNNezhlta43$OQwZT~gS`k9S8iDDBs_@nG`cTrTi=HJ%>0)U zUm5x{|KW{4*zHs1pwM;-(Lt5;tq3RO(X*E2e!QzC?>` zmR(gn-7`yCiH~*o1`aYHnJE7F4B2O<)W_pA`!{dij3wK$C7Y9MqGb8Hafw`@10QhD zCCXC5ib>M*H6?P1Qlhk5z#O*w+n=@vxFt%Fj`jdDe$P|CR3&}x8^9pk{#9;-vN%Ts zz*oPP^@I$fjUrGufnV!Fdn0Ui?e&CvYFfK@1#mweS*kpv7=%l*rDto&AWtGB{UznY z6hU^A9}W*Nj5y;&Lrbv|8-su2_UYYrNe=*nk4R?I0(4Zc~(s{;rKjEeJD;@<|26ZY0$%HPx-?8@? z{QtkL|9y9@J?AK5)5feYJK)hp!$QOhvrDKKa$bgakkDAF7U4G|6Z_(4&3X@)6wo*O zQ<`4`<-U7`q!BZk(K=JA zh12o@;9gN5EJx(96Wq-z5kk0OJ~49T|QCWGu*romukL0 zIOj;mRHg88kSyMbJc*)CJQCIs3pio-X0Y0W2kdQEAr_6B&g1D_bg>HmPj7lY4=now z)bWt_c|;4<0(GV*_y6;A_Mda^P3^+4N0gDB`wiO1jKh?EVKa|WUw@5QEkU#jNgxRX zJeUPf&|+3GN~b9*74z5b|6blbDKn<5sL}sq+yIJ7*te#Ak4J;>xI`!TKz@=XXH%H= zXC@1NpR;m;{DP#jwG4MBKQhLLdI-7(#BKGb_E#}9GI73XAp3Wv2EgJX(;jk<6BVHA zq!VYnJ1<&~BK@CQtPmHVFjgL(=Ja2Z;uU~wjd;#ZXt#C5en4mbo2@v7Qe!Hl-6`a~ zyS-$i4NGwI1tuRP56_SNJZRGhB|-bN`^6s?sbZ4EHg7A%v=sBa<*{b(9lr*aZtARB zs@13&21C6+vbQ6J>-|CiD>`%grWGpFSp7Xp$rLkQC}080_;B$<;qc?)$Hga|SqvTq z7Ye~UAl+(qlTKLDDukW@DGfpoJ+z{9A&>xpG}1^YO0$BE!;Y=I=jj!_^Samds$MOg zUa8)n*HL-CSoZvS&n3_7XK^8Qw?jj{C8SwmR7v3w`hx-`LNpF7_}^Ex{yN#}ZJyQ< zXNou$sn{uJmQFHDNtUfxg`;9mM<4serogt~SwzcmS{p|Nqs# zZh;G^_f@ zJR|Nrm6EEuXW#5nLj&{)HAAK+f1%Dx;Mr0`i*`Q&j%pGesLFWff35Uy4l>6|E|1Kncv)IX(D)p7(S1f7jk8-Mi1N+9io#%IzNeJoo>% zOqb=*uChdTzdNg25^BJb3gdCG~9;M5QHuZa9+_tx%dymYn3<`E87U-6AsMOBpqVjh$z+`J6NbzfBxuAaK_bSPbWfbl z(^fNMp7ZmBI_tgB$oh^a$qyCXxpsE@#;e;-uhZ+WtHK=Ut}{K=o+RQjfC7^{Z96T# zyJ4z!WtjD;R}+h^3))@N6|EQ4)-)nXiYX=-2*qr(AW{cR>Lj+~5QR9Y35MEiAch7A z-K70_UZ?&4+UKYtfho4*JGK*JoJ??V>~Rv8B!7bKaf}PW6~~@9#x@@Ru^ne}Tjt)E zo1uszY7wG~E@}}V)DV&Yi6R6@2)YDFqIJR3Yg$=V0J@tEG#7Vr?qi}^IYaJ@Y*BBh zowYpcv!+6YnnxLzgsZ4!GiT#KR+*olsj8}bW}esua7Su@(y`Y8D79feDq+&R_!gPH z`Gw4^>Yf31N$;O}gyWp8gkzo`nP2vA91$wB>UQ@4*d_GsdcT1A(ncchpdWwi7A`GdVn3SWb za|l(?bv()4&x|H&tYr)eA@myXPw$(Vvsn56-^Y!&lY37gXe@~ZZBG?O?xL#EGc+z# zrijvOIe^@aWNeUakjo7+xll|JC879#;ELayb6ZyMnE{J7D$9!k{EDr>pFQ~hfAUqU z-mCiYz5)sWDUbrgzE5GmwqbS>*(N9a^H&ql7tDbIJII}Kl}2kQxr1hbp)E=yIfNi} z8%~r{RO%42I>;fV7@+56CoAchknqiRN>oZhRh%TY29blQ4v+-(g`bD`wYHMr50>?9 z#449(kdW{Ymq;dFq>DCMV{@9<;tHTLTmV2JO!8wbCsMNQysRI4dirYn{`|7)boc3= zGeZs>n1neqrkXkhbJV_T33a87XT0b8^J0w+_B}RsBA&4^ahKTb-JRIi_c_qnGbN;0 zToNp#)Dlu{wUiPPZM1|I4^Uu&g(Oe|DHcq^6p%mx2^5e(!TkOAs(Q}7cX#hD_7ayQ zNL>Pycqt*)dQ3^{44Xg_^LYN2edqZ=-^`nCU;%ow9XO@m^b9=OvFLG2Od`Z$|7tsY0f|WuH5pCH3 zK{S|VgJ`H?5-5aOhWVdtj2?DyHy`jAb~28pM)>KAnN9xzKbuPm5-_BgwUg7C5sfMS9N9`E(f zkV;AVGUz(V483+BK42X2?_9I{-pdC9gpeQbfCnTbK!67X2oPw1v<;Bbv`yRC#+tTi zO*N%yO3Ra~c&DHF}(fii&qp@r1|NZ=)`B z?jHEJVd;BHcrs5=JG33o=jQ*Mb8pCjo00KCAO%b*an0e7BO0spb;;cNNN$I0-+ZBc@>M_Yg)FcF7mmxBj>pq zO0#;iGGoqoG*I1*Wi^ashw*Os4p*E&E4*b$i0ojN~#*JP|6 zx-7F#wo_5WgTBJTP^mbCWS-d8^N(YWalyfR$8m}YM`v!QZ}k?tcm87eH#;Q^I<0_K zvZTufM8%*?l=)A$|6U~v^4qR7mVa8`j;q-&N5GEyN+f)^`U;ncnya)p3FTGv2Zs2t zhiD>}gbFgea^-@XjM^wnN3(4TfMrFFOb zE!}0D4$~o(GS0ZY43hS)&A5cKY_VloGD?=%0<;Be5rG8&)AKs5_k=72#*?ovpTpvk z4?PKBxvWDnVa|UmlXz~qIVZz*GVx@*-PfIDcM(mfG=u;NWDs3+(NsWyXlkHBkr73- zZV+8m|H<4}@4B+st~H}Uw>E!k{>EUyauzV}%>cPOV@@-wT1sD1`reIf8J4W2&F5uE zTb8eMgXo8l;0A%T~wXp7g@)h<0?;I{hYqI$ji&P%pdu+-ED9C|Ds5R zwgSYU42(h|RYI`HHX00+5Q}I75QzvSRKO@O8pXtn4w!?Z3tzVECCG>w84$ytviHJj zHJh$W^;&bpsjYtabH0$2rm$dZd(a;@{%&W-LqF<4Kic?~Dr4glpNUErCYv_&(sBx% z@)5g;`wTb%PAlTDI>&I0i!%krnKRfJ1db~)`=;S@G5}i9UneICp-@j{_|L4xPz*0(yT0jP>A)^HZC?HA!87MGf z0f8VNyRdN zfC&f~K){3um=qBv*=gezrDs0)edzppRdq{9R7+~e25jGw!vlLglX(+%_ftNfH$TM4 zhMdE_n)(4V1Rx8?fFR|_5)}_2P^3s(Ih_3C=HKgVYNy(E-+%p9-45!i#}}X_*#b1s z@b2wlh%Q(GS5Wb5npAD_5uPtn)y3UPT5>g>p)xYfUMQGef0RruK3~X{gzW5ET z009CCEU@?_fju7i0fxu7?f-wRWF=W`lbH;ZAxf11qedMy$31Gdd;Hw@``+)z_xJs| z_wwH1o`X&X3q-9FwQ7_q(cQg`S~R+=M(x%mR*YJ8Aw}a@Wr0P*wm^h}K?+#pyPllx zsy5@E0Upc3vLF84$ygUfiWDnUlqhq5F6;l*2}wulR`-OR-MzC{JwGM(o2fLvTQIWe^!6Kg_71Cnen1n7tg zpJzK&nX4)tt?F*6UG8po%XZrq(13hvz&rF1-sAe6@jt)!Yo9yO3D)2orohP}m}D#< zZDdH6G9-+E0t8Mx!X!}G$-00X5GH{#6sCY2Tr<=T1wh3wZIWJ_?xt0I?TB=1_L8udTsHL*5?TTQ zLTE)m5rQZn7O;aAtXSShg|{^9C(AR6^|f1-vxt*Y)%MbOFDKW9rP zLC|Tcq)Jd=2(p|9k)Qd23ck zE9`W_?Uvpjl75J$kv+tXkr6Tmh6ldRD)9f6rfSS{-uO6|GkiE3$v_LYkUh3p$<($~ zi5E(lk{MJSqB?Vk?$;mxDjLkh`{thS?t;_`RNy?u^gJ8#41pePgRlSnbpG2(frX+c zl*(+th{6pVU**7>-DUvcdQjF2WqUF~NM;fQ2}iLzN5|Ntg|lcF~zs@bE6mp8Ki)Zy+SX z1Q>tm?Ih_nrNpo;l~KOwghY}E5+Fi0aecf> z^OJ1vJ%E!C5?s&{iux13w%*MAnc2V9zyeDynI>X^1!7?%MxkP(o{EiNfQd@kCWG_H*M*Br(yX@Ln*cL!C-U&q(ibv^Sr-n>n%fmp3dworaS3GyZ(N^ zVk)Ojdq`Gl7bg@%dZm<;3*vZwI`8>^-;$rCNt!wo|LBl0@D;OJ8De9Kd6A~2g#s14 zco8e&LtKl?7Bv-1C;pk3Wgxd&XB$csHz zbPDMKE?}`3z`;iu97qPi1cD=G&y#KaPj~fcyI}@qV1^Jc0wSoR7&h4$HvZQe|E{~X zZph;XH`*9Tqk|!>3@QfHF$KnqX;2Jl6vaH40w&CeiVAAg5`O=+>yJl1_)~1#Co0 zYBC;$S*m&<%YIc2E*YlWAPg^!{@Szp;TMC!m;^&Mw<}Q)YcUvv+qSpW14I%TJ@*L? z2v4ZxqKtj{!Zei`AlWklC9!m$Pa#@>RLgzZ4Zkuodp$N%_FzvY0p2rGKmdjd|HRxv zUG+D$I{(}#5ii+Ff>ud~2jY8sr|EXh)~TAA?Fhs(c84upl@N@UJE&aK|Jwawwt5Gdhb7m>S-n;idwp87ErMAiIHNNdWS-7sW}VJrWy=~NSECo3tf~=0 zta_HSSutxAt43wd=$+7u^=!7A@xM2-^4<3`f$0RMNfszEL)Am8cP(mLC}GmDNU!qT z`!ezF%>=q$CVE+!g`GuJtw7ZXPF2qi8|Yya#7uzb9txpM>aRpMdN)3M=d0cb~O#`TERp{XW z)k4k_KT$suH9Y{Tr-`aA?pBLs^a>$bt{g6vFxPUZlr5xX*X(L<*P~G8(z59I^ep-| z9g9KR<^Nx$+PA&;#e10%iAV&LBn4YF=$HREp8bmiKs|tz45{aNvFT$*+?S7tjF)L8 zB9Px8K$ay^@*t^B*^+DW?~{?403#D19RMj6DcjYOtNuUoA6?bMG^~c*dK&h<+tca^ z(jS`cd0tM7#b&y)w9>6=fP26IGY4{buk}m&IF6p*Qk-XXXI25-Rn;WAs=x)hnsa0~ zMj`?7Bs9R;Ai=o;t6KK( z|C?%k>3anfSs>M#hhkF=ezQv*t)bTVlY^$EHs5My!=L1;`>Fuedj(Laf=JbS1l0tn zW&=e@Lx3$U0ZL7fvhH_F`o>!V9Q8J-?m0t_ZT9z?S?gR7ZIJ!%*;;F|4YCbV7sNh` zewOX}eM?I!&70~v+oOxfgc-o9-(g!Vj~pU2!7(zLwVUT05<0}p%?v2f3U#%UP5>Gi z5a=UQ?Z33Tx~dx>ha4^_QQ!I0To6@P&kP$wk;}E`ToMT!aNg4C8Ljr5F$6$RBuGir zO5Zr2UwT2Ba&->WCej%nWEVuy`Tv=f^{M_)>7B1<48!VE5zC06JE9^BKvq`I>Dito z6rT#>9+bP8-S*0~%xRP-YJe&RsPHb8IV&W2SIA}?|t6w?rBHKDZvm~ zicdRE?GRB+)BqV!n&wlr-WD7J8cC~k@h9iX&sCIaBw|RB0Gw0h+VAZX1#-?@X>l=B zcdc`&{R9CJ6iEdtImA%jI;k!kw|7~AfWAGz%=v+UoI~kS{(ZHdf6z&@dt%8yA??JD ziVBh$Gl4MxJz+=?Mgz}((>LjzJC;{(drA{a5Hv-xzLYDC+nAEB$S0%Ior>K+q6Bg}9El%1B0{LIxxx zMW+8V)hb0p-7pkHa&}j%Gd{9O&<212O6+m*CAnBtzyAG-;qBb&~c{(4>7;S9#Pc`#fJ`g07*C9q}XKOrKH^Xx!7o|Iw z8g~YP#fV||(%vbrLkt9Ufq+&Hd36pe$N#$&x>OgxFaJlF+`PqbEA-F;@jxL6@z)hfRaFvc1f~dw`99k z*YJi(?s@$CsCx5XkDnh2KwX^xRck?14|2JudfoGH|MmZ0m1*DhzH86SB9M^@ha&ta`~XyU#Ad>^(Cg+&x?j#L&c8Vh(JPndIq` zNZE69514xdK#u@O1&~R8B$85*l>TpuRsCC4Jy%KUaoF~%m%Z4J^R9Qx6ianZQqu2J zQ%}>b&tLVhZ631yTQ8jxrB-EW`2h4jbOBox92kaHPJHbisV9E|9%0+guT{t~U}2BY z@c;M=Q<@X$N(K`Gg4j~LuD6<1Uy%zz*;g!_DwUnF50}AQ(YvU$h$@nmH5Jxw!n5mV z8QnkzVu+LYmyLzO3v3q&1Y@EWgT7fLR)dYdnVe76`bw+70?=$qVo!h5Yom>VEda$L z1VX5_CcGfsra;zz64}~6ZS-E>m~%e6Tp&;Y34jnKv8f(^#+k?kaX{%@LFWpLX0!X* zK}E|l+MT1jo|da+G7izWy_ViBnthMhS-bnjF~LUF=07c-F4UQpZzT;ng z>?dSr*4VCo4-Yj367vRw@n6PM&f3fcu@4gCOlEwh4A@zD7b?gU#6HL~1-anq-_l-F zHq@gb{_u#Wmq<)4?}sueHY|C5e|t|DeYxx?XoUkp{lwRg;oz#D?*_W zsws@bDx^o^`Tx_j`nC@*9s&#|MNyQp_?_SVF>Z}O1cM=xqS9B7^Se2J*#zFht&9Ky zol=lIrIcxt=A16quB!g`cz6#8I0l18hLkEhOWFOMv&+pGzw_%^EfLIK02&w4xU3n! z`@NeF|Np;VYXAK^c!DTQj67>pWSkq|7sQtm2nXaw$fgQhg{)0^o;V!0USpFiu#a7c zdjck&by1MebeeQKq)c;<6>MwgE)`%1EYOlIo-SC)pS4g=f752xQab#IML{eN9=^HK zW@od)C6T7U%G^uxo4)k#UKw2#c?LzsREb(qEdg~U!1r|nt=YXEdbIy$K3ZW8 z32Jm0{QtKsrSl5Rx!;~TryZD)nFw~u3~IW!xBW}8S6faY|5eYdVn$HR0Rv+w1LptV zOzqqCT?87C#!%nbAm1P#pdB=%G;6b<``vfz0##kzWTQdM5G4N@ks2e7IbUPGarMl- zuRTG~d}~~ouJLK~s-ZaxYS!>?^v^__?gr8FRKI_}Pddvn86i*)86YF3Ff?TS)MsCx zac3i4#w}LpGcK%xSNKU6g$aPR^M+ps}E~}ASyX!27CV=wUMNbcXeU^iG zfA3e)E@`iPEqxOZ2`^pe@092vaMHieJ@(tp$T={}$Wp)GGqcC1w>P{^fR32~fXk=} zvkc7~4M1TY`Yk*TaU@Q5r!wkM-1mPNH>1;vzq%2$KfPI}N zGK!4x@RZ%j(7C=lAdH%nF&{Da-};I;_b zGHENpKrm4+s*jI<$P)#yQj`kYvIUYp$=xRzT6jSCKt5qxbMXJ4nN}{Mim1*UvO3VC zFtb`4X6MRCtiqvZH6z}w&z}Gj4We6*6qXe6Yesw0G*;L`!~cKxy>ZaSQ=SPmA0w6( zlB$g7hem6&&~4?msOA*CZymE<+o{(hn4MOwodtnBs67At|1myIhN`#LF`sCKsH731 zKX~nL;@_PHvDDfg)OLXM14>i^s}2OP1Uj<^YF}#wHS<50+F)P*kllo$|7VYKBUA#S zc1i9J%HZlM>z4F>=(5X_G72@Ij6k?4QWnTsmi~KL{vZFQA7Tju#J09X_2Iz_!Ca`W zoYj#JFDA`d{oJmDg#N7wS%`25OpAwY`K8biMl3`w3C)IFgVn zQBgazxZjm*T#suz4#~kwLJ1z;x6;q_p8*QKJo49lD3 zEtDg@OzF>5YRPyY`3D5OrxTfnYNj84psV^HjDA3-g7$zUm)2YBu!UeOjqK`gMcEtB zlMs-w@Vslw3qxBrq~n3b5Sym);Y#gx0!lPeOsMGQi3Aj%{0jWqf(^b<=N<+WL6K?v zKm5sfHqt<#YY*r|gTx~E;2hEK7i#}P!~~*5gs{1!;#~=}u*OsrS|QI>M#-iZ_Vg2k z5Y@_cV#0Aq(dE`rp&LyKJ%8J=zSK6ASjKNlv}Cm4f>sJ38YO|8^(qkYI%3>?xR0MZuS3f zVFQlw?R)?43e1==fTY|FStO|#Cd3^lYlhs3rZXKNpL4JO^UdBl_ZGR!1fmAx8lf5? zj4FgMLKqW_3C08yOb8)ew!dZjfBVPRF!Q{d-~Tr>p&e4nyK7648c-ktA%Z1{7Q96& zNCjyNUbI-1%C^}yGiT=SeQz25ZL|L#P}^JASrLzl8Wl9Q5u-&-Eh@IrrZ#F+s_BSI zr?xV8YzHk!T3G_wPRJ2>+wZ$yS%zrS_|K39a?$s`TmwlPF(kMre)W^uwXr5ZLIS>m ztg);hD@fZLqN&xt%BhwdxYZm@3XeN_;Rp&DsCw(22AZcwg>aLJcdXHA-c7-(9i0TQORS zSQ3(u_()_tW16u@Y2o|2u)K|6@E~vySO_c(3=9nXsx)+^8otnh-SDJa|9=LPkX4cQ z>s{2lB9@9I0jyiV-WH@tXlanzXC`Gz%9Knp=S)ooRV&do+9Txy%eL^ySTM_nrur&{ zruf|SKlQ!Sat{wD!4K{^UXQboOk%~EIFrz^$4)yQe|D#4OqA$YI|8Xyodng9Q7{ohSJ z?Df8;4Eg{E1!NeclnM*5QQ{m#IKp+qZ3=9MU1A&2thK9lW1G)FT|9i{%|JiC|=HN3biAV%g5&@M&fKHB* z=;jEhfCvSa?ZTGr0+;Oqge{EP7N&=4TivbhmfOwnb=UuWqlX>~*!VkNZuU({`THuX zK*cZ#CJF8#cyywZL00a2`!~6qg>Z486CBfvbRHyy*uVSc^&XfR{U1)P&6>KVycFW4 zkeAM)D#61q=XdkkPO1`K7=jPl6(B)?1OZC4f=dEi4uO*t6r>>V0Sly9Vi!vySS1Xq z!k{UNHAMwIvHekD^@S4bTpysTm4CFWENBM}O;??^!*R5DXjThi;{!3oL?a~FKYoTC z?k|XLF+v%*OQq6SI8LYAD)I4oN$l;VP{|D_|0$=TEt#z1FDdBvLSkOLRjNYZPtkM= zhFZ8`0;9s@#*u`AERonPn+Fsx7{8SDYX*a@~?N|_tE3R*G^#68$H zaCL%n~rb7$1X6C7P67&E9Uj61$aQ#P!y^bGP+FUFGbSr zGaJQzakHv;*JVN70=0^O($ez`K_#MVfv9+FYdWz|zQ$g%wQ+1IB}b5uEjeXu!>J*s zgJIDkL^jr*c%P(#!I-cQ#OM3b?-=Fj4=a@6PEI3R(PutxtozbtY&t-GT@-3Ku1=K~ za{5J8?w-eoS1j!*1=X3Qo{x10*$EyiYK0eF*bC36w0GT#|H(VR}mPJ zL6R$kg`d`n$<Ca(sX2JDt#-2?AF!>`l^G90b-GoY*W#JJ z@1qQ0XXrUA9~Wo-@{B2M(nM+p*l#i)3`wb{&jfAmYzAfwDMro6_3{eyn!~jScE1?- z*07jKB5ZTT2{?vFCGR@1U_z$Wgt}edaTI1ggTp6VaTMHOw}g-AMR~5Ig-pXqU?wax z`R*PQpk3%~><3q*qpa2EZ#8T)j8=K=4xC>|0vRHsDNEFYG&w1KG`8_YdA+9S8brD@ zq=2GSB=$ZdFmyLQrWTQ-P-L2AKm~JQz{$Ht@(=8D^ZLb86r>V^vS7G-Iv?Gn5a$$b zN8n`pf~o9VNTT!E#)pa8EeeGX3`vL162diNH(J)XCH^AU$+{G9v2i@$;@DDqP!GUJ z>Z^K?B+zI4fiqYJ(v^BV9Iq(?F5&=MDfhtXXUVniDCSwy#m z+m4al++2Ja?1laO@uU$pdAej*d-A>nPwhap@ci(WzVsuxaoH~j<7KBjeu2P)o~a?E zTF^X1^6Z!HEk}N7JAP!WuX`bsWCXp54M( zwfd9-mdI3eCh1PI8EY4;AMrSVdv7W7OH#)rW8)7v*X=`Ftkts-+_zRXY(}F+z&fzw z#Yc#W!h4koCL?o%A=!oLGfTXdLpjJ%E%^C_xXWJ%@Jiew#wqiKPr|n58;rmS!u^C6G9(cUgl)<*$kgjakbJtX zzV79{#$_%aB;hIcy|J~xMa`wpsVt{XlSVBV_k9A2vg4~)9c z`{hDcqL}-nQPXwvfJ)b7ST+PN1tah439>Z?+~7!F4;YWC>a<>b>`#N@S_ZZu+0@7{ zu?(145(c8{ug5T4m554>6p^Z&eb{LYj6FizedR@cKgW~7T(H4~5`Vj%+eWVl50TAu zFH}W!SVR>I@lo@Dl?ie+y`lT0~L+!Zn3}V|)E__C7Bm>QQOYb?c z(SXUf1h4)kWxa#$7{`jmuxwSp6#l+sPxPriR-JcxvACE;gSk_S=X9sY4<`p{#!*A! zR&?d5xiJVWK;7(1&<>b=;UYRfG&-;532Wve0(75{tRDR(gBZpEpK(>#oleK?x=PLu%1-m^vVe+6<>9d@5)j!&NVWuFJrfDjc z*Fu{nsv-G+5?`0QRLU>yjHtzspEbLjKhgj;$VA&z#(|a=ax=5S5 z7PCITg*;41$02ydB8vll^xEx3tgT4ZYgD?rr0TcP)=sUeErS@wbdtDNZv+Y{vSvx$eg8eX9I z{*{-#P9d;xubMUk;lXi46jxpsSebT?drP?P>DKLTh~nZ$&)h!`DV)@M1rIObbu|mf z1)(8ejcM!-EKpDL zLmJ&vUsPG%PI?#|k3h>yj{Sk!BYr1q8)+4vk>NjCAgq$P(o|(l(kByBj{ZmSPBsvT zWV5C>)c<@ywLu~@NgrEI@{naHNB^TkUMpP*V4fV}p8w-d%oPanC77e;*F{?QpLDbD zTm6yDeQwU}y>e9Krj5`Wm?Sl)I5Nf55LYc_IpFnk9n&%d17mu$)^8-fZDm7e&IfJ9I09D|Zc4r9@cxvNXEI zV5A>st_OcwLd^d)^|~j3U2KK36*d=?fbf%U|KHY_9>1ZOagt!tqWkga6f^e(f4yoW zNmzSQ-(PWT848>>&4KT?A3V!%@V z1*>t1bPDh8J@Z@bO1M$LKtNoCOgiMD0>Fmb!PeToF^9tjd{Z?S2%vz+{vi^QBQ2AxG^uEb zqP|p}Jf)GXhC+xiX(&tWSp{>$!RCuBy$pF~_}RbqTtwF%v$!lkqxIMGCf0r_`)(}P z(bATxafBSv&UvO$0rjaM$a?a#o3v7$k^lu$LR#5_y-zt?b7|`qXi4p}ObRZtgicQ^ zgmi$NIJOH$l0t8laq1}3Vy=TE7bGDqYuIr+C~i8mb2sp+EGK(5QoS^y)viD)&`$B0 zuJa&Lr^g!*xQr$e=Pdz>Hz!YJ4qK)GF z$O1hEKy-oI+_$$ci&Pk0jn{&>&vs@_w`pfdZxdzbPFkC*-H%)M$L3jqptxUqt3-*o z&DqHR@(dnRN}92?9%))5*v5Ewt3`3Qh=9~a>li{EYB!elm|y0deab8Z+Gm+TDh}M# zK`{$%yQ>ilQ$7ev$OSxPe3^Ycc4|R_&D2`Uk?g4<_3P*&>V^;j3lQkdb?;m)Ou9RWjfn7lHkuv5K@2gtzQEqc{j2^GE$(enAeFk!de z^x1^myybHU46gE~-KJV{C@VjaV0onoJ*S{@gF6Et9ht+0(Dthux6{EK z3eka=?!L)NW)X4EU@k_sF4SyJCb+JA@M#%fdRU&2{4N{6AK|9ujDO&l%m9}glYU8G z3_(|-o0By?n zQiymZbcneQji#!th3;2`ITxPn>0whhcpd!d6BZt^MlGDN#ln!4+v7VG=QBH{HIK8_ zqGWA3=7AGTTUc+_Q!UXv-lhp_E6(6({K(SXQ_u9FwZ9caypD(<@y05PgJoQZ@0i>| z;^8Ga(;KVq^saifwh&mGZCSWQ3!&yN5~hg7^rQ?YXs(Bw-Id^3{%W|aw4ub_i3{~H zVXTtaS#)J`%50<4~eahw_^y=O;OiZx&u#6 zS*klz6hyCJvFN&$7Icsrv~^1**kEUdKWfihcBH| z_eWCp7hb+^w#5gnpTA&psV(+;G*55Zi@AP2sZXqX#dfSB*lIENhsdJ-5XkjFTwHbC z6Dm;3kJSlzFE=JF)IN8syubbxDROL2K<$dXPb`hYcpuiBu%D_{58U&Ij&bYlT+;FO z0*f13q9>IM8tsT-@L#WVdCO*k)O)lrFBen{9fvMX-eP$d`L$@A!IIp8{YFL)hIZ0G zAl^!law)cHi~PWknwGp)uKh=D@%g@0TBG#$=}tm+ziQN828Uh8t=0nv=}uzW$;9NI z?ooAf^U~beZ4-)xGqptM)H__nUYB{sm_lD#gLj_Se;q-*lTTU2in47=wO^LMk_Ddv zM#t*lSUtpEwS4i7@3y7u%o?D(9YjA-Q5=(7OcMb}PKa!M0UgkYk*FsSaD!uQ?u&9x z*If4(p{@%n1!Ej38f+M73|`Y7dS6(G%obPr-LZ z&*p%5rcqecz>d5$`84zdIR?N6Mez5mi~gX`^n4unw87+TuPB7B zTA@0@kx|C<$1DJn!V3UdIG?KSHySu`q$I$0RTS2up_6LYkh+OM%2M3f<4~~j)8Ua* zx2o}kxWeCKHQGu|j8MWR^a()6doi6$Q=-I$>hZS!`qV!15G;UUGzCD=Il_eZJbL&)8jm|4 zq9Y=B4zPhDrpce-h`<)^Nrjrgsk4LN)18fuM?8pdJe|0xG<6C`WGU!iM`=0fhW7i$ zZ#Z?qu+F|AOUN04CAuB9Z)9++`&wIsv&f~O~Lnp+@J-l?|M7l%9do} z8IImefZj-`*JJ423p#HPL_AoeXjgGyUX($d5vKn1c7XH23Fv(2+JzMcl}`wXV-N})0H!Fh8g zy6OVhCcl=)8s(<4SM}g}LVdFxVV5~!8M4t=IzCv6(ct2a5jaBnS_lte5NCPqDIVHR9vAnk#h14kQ7fTyLC97+UEa#I2^ zvCDAqd2Ni*6MmAy$xe2?E(P{$+jkeqo+L$Qeq-Q0sBa)<9|o6Od6efA7d4#AkI|C5 zm7o5cWXDvziFQhdbBWCW74x?jjg^+EBvG~&5S*U{a7b5{V}2gYnY?EB;5N1MpR$v< zGF8XrLPoX9FEtgJYXLvd)1lVgD$vLhv)wRQ16AppZzBSJ4Vj&A7C^enY zI>n)(JXH_2uzki8Eqv?KRM-^5PCMOFbp%R~LJw|mF$88B9N>gZm9<8=^?7*J3~|>@w(aDCiQ?K&TkaNVb4qAK z+Q?Gnq%^j}{6Pk@S5&l}HN&4@r{!7TF_5L6h3_R^8(s(k=Eg!Hf*iKOx>6V~n7k2) zs_If(Eb+%JSU3n;HWiVs@{(Xj@m;UcQqUA^gbxu2nv5GBd}8o=o{HIH6If^);ddqB z>Q3%wMiR&QVgpmJk;o+&zTBWyQ4bv#mNh~4A#J8LRX8r^>%d%9$mYYcW)5+c4L9ZR z0lztoW_?Ni`sb$Io`UoC@PH5~IYNnV!Vn=hX+fLo z62jSlJ@azFj?Z(*tr*cP6;&;@c8Na;&%hYnHmO+CZeFYb5%ajI2?^6se^lhdqegGsKL32DZOw%HVDZ(Cu^B>dvy#E9sFRGgvqda^&_`Ppev<9AFB zE$zI43_Y82>+h?2zv1E$ZHHEMHpZY2>k3oh9|>jD@T>J?L!jXB`st zR^V_~*vBR{T*ST7noZQXBptB8~lh z-$hhd#qP0^nxDkdc2v^*k;Md2%BYOafr`bM~)P zD_n>c;on%lhDllyV`T)Xt=+~ZWli03H!_@Gkl6-1s@M1-_-KwBv>XV7K3>?be(u5 z;Ss`K{`4^u`BrMY-;lofBN=>OMwq2vY~KXNBF8w>;Ipx~mxdzqf5^TDYQGo$NLK!n z57imBrYbWTR4D*HXAb&^)XYc&Xi&VFHbud;U?xbf5Z|@1wHXZM+LEZ9QY&yDp1lJ)XVK*|I* zhM-N5Mm{Tm@PO3{q%z6K*GMkBoGK2;&5LJesMO7ngha_XdjG4^lx7)A1>n?QE|foG zD3+SOmev`A?AU=pOJMJRE-A(eusJO_k^vDB(i|;Z3X(f8do__R0X3UK3~(l_S4PJ)0+OcgwFto8)$(2(I%G@-HNlUL8HFMAS0rMKbZ< zO>izRKThJ5E=>*_q7c_sf24sp&L)4zJX?U#S34$7ji0`Xt_EuUI)kOCG4pcLIm{i! zE3fF{h3YF1ZjbqS%aYI1><(s98tTAYf}6-Tii%fqav2AgpduxC>Qm#L9|5YmY&-t` z_iKWc@_~RGqjKd?@{2ho`!7;!9;pm--LX+j z$H4LvX_RD6h=JHmrIgz19Vt?u*6?h^aB>qU=!xCuBju163%Xg-=T$>Vz*u$1lxdm+ z4lwxJWep~WeFx1B2a4VSg`(ZPt9@c4q8?|Ba|#1i!u|y3z2qRB(eMAugPe){u*}VW z&O^hegZ#}ia<*NIl|DUV|h-7N`njCw#KwGFW5U4amwa6KUxkgLZ zFoes!hB5$6uzKB8cCR@84Z3D<;khC!(l3Btdl5nCH1HC5p5xx@!-iKjcjVfF;n%H7 zK^Q!vOpw~ZH#EY7kZ&2RAa0if6waP~FgJMRl^_#;VD;)f(Ym}^C`9{dfxPTe(maERTSI(fYCz3FT&W?-8DCHb!AgUdxW!foWb5X( zIuzSYV((Pe8xJPvls)z?6aP0d!bEZ)G%E0yyXy>SKw*a>g*w5>THSw`m=9w;(vz%K5?2QBtd>a!Gx$4E;QSV>^QQf~n7QTZ*GLo^I4Mz)No0VW z_;__&wk8oE8v~MnSlsObw=qUJRB4mLwl!&|VLI~=tgW2zv-W1tZ|0wvoV0M!ELbvt#ytm)O4I@k8_5F$=_2`huhvshyFeD9FC zcqRFrN1RHP+=8%UIE`iX!FBLzgdJ4{Ki0iz@j3@wQZHE=y-WP}x$4|5<$UPQ@FnE* z#gpBv>i#==Qy^HmNjIlrDsIM{DrIS6uPzA<{JBF!jMi`z0X*l*C5y@ly5eYipPVq^ zNE;$Qw9I^H>uPecoZ4c8*Ew`Z`k(7uC`Ox!%(A#dtT)Aom2nzugmmx=Hdob27;0xF zo`31U9QLVAhOGsp$=(ql4b7f%Yb!2?mPA_f-0L5(n~)=VEp_TlP+U=LjG*MB!}wN2 zaBL?WCk;}=pH<_i*g;mjBmy_%!*{LzdsNG-snE*^Z`_%>cw30((*2k$AkLd{a zl~AGG46TC2k@|oknLddz{Y74$Zr>UI>!)P_8Kgev*2H_k@JM!N6>GC>I*^6EBcdnsIA zp;DlQIj?pyoj_CU;U|#wWKpowqSE+<5x(vq%6e?Y1I_UTU0D{U8+kW`7Fxc}d*m54Z*`D?VFw^h0(i2`RDu?S31 z%Nbh&P-_q|Q%j#{k8(!y(RIxD_DIBafJ}5>z=&cK`q1UA8O2~@_r)Ms=x+kTB~P-1 ze<*p%YUj8&oh8#IWv9Xj2Rg|X9$2#15N3QrGob}s;xt>vO*s0NiZ56kJDGMnw{|Ax zpbEBBvq82v5QuZ*b}{1;JvUF*QTHdtKv86+&Ta-AJ$r?If4uZRgn|*HoM^`T$imWS=US5 zWGa(cynv>NyFwj@i1- zJc=XXA+U!R&|pqxeo2WbmTSj~lqUZprxj0W$jC&zl1+5daFA|X#q+pj9Q@pMF**0E z1AHFx7(P!~S?ex67lHbQlS z!?p#;HP6hxt~L)YM9lmz(e>HXsc7Sft@SI~7C6$XB$UkIgX}AU+IRrtZySH@UVrnC zUV92bT0k1eA$qfxu*&CG^s#~x=M(3fKJw`}M4USe!O7AVTm$-IrogWx zX67jzGu;lTH@`rU+YLDzX^Z2^bOWvv3Z6oUzQLGwq5H;SUvN+*fe$D4=XYKyz=d;YE07G zo{i1NA`g}EW=bqkcQM_#Is>nfr+5yPG^yRZIf2@QRttA2kU z)C4Vz748&nyS4fQ2L}!cu?v1F6JCkc((2=3=K`lmnh#JnHhH zB;xy3EVMrq#dUL=i<;^{XtB2Ir&UCkMrNlC;6L)Tp5OKIU>k;PSm0+`_yB?`7z=#5`jQ?^yB*MX!`S7^ zK}xgoXilsfaO1O3zAlUnj<=Gx1o8%hQ$mb;*d*K6Un28<_%0A=GIPowMt4RbQad6ycR7-f0* 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 hs=*4<|Lh3Le=khD8f@RsF6IK+ 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

    a+c@`RGZzhmx~Z*Y$2fQ! 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�pX!_O=)VzDjMVuIN?u~Bfzc-u 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�zaEl&>RT> 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 V2dXV9P{2)sZAK~FMo*t-?w@>$ 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 z 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±w*_5uL}oalnH^sa@U^Nc~gJK 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

    p7XlPnH+6nl8tomrA`{x_#l|~H!o^u26 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

    W~u5 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

    W;^Z+xrQ^ZcV4V64On+5 zvVx5w`vWT|2jLql7|hu?a6XRH@Od4%CFcg*Fm>YAch{L3d?NOKV@K3xoW7#7lXCS{g*U#Om4vW0f1NHgbwXwPf0w#qcpRf_6WdxP3ed$d zOLDszh*&7~S|uPl_{q1bPiT8>@^zC)o>gH71XA&3XIH{!U^PuZwwpVbm$jlt3U z@mA8vDb$9h@PYs0z;m;TLN_J>|N0FgK5Kj{Jj#)oYPiKw9~y|R%_eq?6CqKNrpCF@ z(F+m{FsHg~)u0*r8#a(*fUfaqz_3^Dn|d2sL@xX>l3hi^fA|v;lFbrNvFwp1mV)?* zGFX!qeaK&@G{s~V>_v@?PM6UF@PXyy%u4NQ*Hia@gXuJ1k~WDsrF z28Z&{7#S9%zfqkq^L7s2Qq3D*)mfH!&A&3YS2FLNXf=D3_{DAs*AYoLFY_Bo?L+NA z9Mnf{d#Nw$PgChs25pJ~e;I~(3}|jP1be;W+7wQ|+VinGk7kOyPZKwT7=Vx?{l7K* zrqn&7rvzvoC)7&GqXk6_h=R317jO5P@S;%!zUMLIy4eIp3pIkG^>Ei8m&$(B;kIi^ zcx{1L$B@`=+NLV{ffQ0w-}aFOXoLxF)O13WDzIbC^ADSu+LYUkiN-~rC)hwTrY-+p z4m6V|3L37@Bb4OA(WZtpYZs0*AFm-z4KNE5FUMn-T3>lhWo^P&a-hkH^Obt8l8?Ip z4w^&_BT-@u>e~RnF!IO)3&2QMYYiU>J50UOCQcr1^{E=_E{^9Lw}R(MOEYoiSL}`- z&f!*^&9PC7TS-VQlv~x%ZV|ldo*LRMZcy_ZB3$nq@T%vE9z#$=zB!8rjC>0h$i$y_ zdR(3*nglc(9L;=jAvDv7i!TK2i8q>EmOzAL(X(oXT&1+*T-BNm&8=pPWr)ervS6Mgn%$_ z`PHkG;qSfOQ5C9ZO#!HBMvcwE3l%LimC6~8CAx*_)|@vb*h+kiF|%MGh#AK%0i@CQ z0~oPU(Qc3_prq7w*p~x@`gb3_mr%`StSf9FV>%G=+pdaKm33n_%zRs zwKFCUeKa*DmlCtH;u^~2m$mouiOj{CFTX68(yjHx!*6wvvc(rajz5zS%rL)XlNWEcDMYGa}=que7}#u+9C@g&(5o%%_7M!RW52&2}}iTnpY|#vO#Ov zmOHa2w^W;4Y_s~+Pp0sH zw!2u{0I56ljcrKZcIGiWV!y`D<@PMI)hf{VomjimYMCLRQWYg(W;g2%Fx4fg)T<+7 z(3`L&e4p*08be6f0Bp{TQqBedn1G@kRtDJ|ox2sDkS$qq<>PPAUc>d?h^JiSp;0bm zRKIjiiBEGQ&O}G1G>5JudD-AO1jYhg&&k$uo7-bd7I}$w@b~n~j{Q-mM zIb-@Y-{RULfLEC&h}&mb3{sI$KzXU=cb@*GE=2qw=!wN;_wE&^9w^@didn)ss9kH z%`dW`TDNb5nO?g%ac7y`Vr-U5W5@)-DToD4Ib^nV!6H4wM~+j&wvTj>J!G!<|d7*9ZGQw)y;^7c?NfPwCL5_bN>XmA^-6Hry?m9o>mM zd6|y```f;Uk>LniQTP2<5Ha1S2MgJ{k~Re82<-o-sENOdYfXe-BtrG9>T@{q%&uPCzIY+N zDGZsrgNb0&)bZB;l<&K>Nq#d`=Qkrjg->0Q5C)p2v=0U8%>gjKy$W#5|Ic-p&75A& z)Y^<*Vaoa&PKt$>j@$piqQw(GU7L2{`XO zSG&$kr)g!}lWML&_VWxxFu|ccBEMT?THM`o)C!k`oaAug924a^1XDD>Nmb-GK0$>l zjkuEG(|Mei@UCI2o8j7gtCD9hC{H{-6@ff~%I(xpd|IBU zNqSEvJ!Zpo<@aau4_bcO<9kmL>1+t9cr5y9FZ(q|*+(`(dRSX!?<-LD*SHaf+WJ^- z_rG`eXURW1{j~&D7e~-XXVE=0!O1y_Z&cUe&pZnI~fFVW1!B z?46#hqNns+iQ=GVFN%Yn=m(mmXcc!Y>v@XzPezm0Oe$XTxSnf>a-%0AeN0b|s_)g4 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�^Xv0Hzqe}@ zO9tkLkhk>1A-25g zbkLGiiAt%Gbkm1b%Ie`o<@E2~Ga)Xa%Cg(5V@Q#^)Sg5IYt+B8@akxkS05%_8;I`a z&EEUj3)4{0rRkeXBrQxSl&?|mCs2Z7YlSsY+0_|<%=s;P8uyI17h0SIT+JgioxuFv10KN7`0{^#kygYFyjK_ z1k44-X^;|Q+*=^VeTrnnxL*+?M)s|y1T3l*Evx!T#kC3xeKp1@0haB7*bWf|4LKQR zSO*!>HszRxRNd&;O@67IO0CSHhXhRfeA*tJbKK@%?q5e?>><#pF|jSBv;THq6o1Re zJYn}7jss{`HNcW+IT#efaNsLqHcvZC_kXGYm;;JrfH|m0%Ph71u&0~$+yA;y;SNQz z3U?~fQlS(ko8$CzKJfPBAh3Ckxkk(2`}4u`PQ$#xw+!DDG;y{k&mbN89oet z!Xwpnkxs#AUzXau(o!fm*}kr%176BawO`qzjjX2|{Fbj22ER>_Z1AIsv<#lwAQT+p z84U1-XE5M7bPVH+%Gu7~$W02>*848jM6~c`g@srg;)sHB01`LaIh+A5ePTN<;9nH~ zVx3Pe>XRuvfM&t0$;G2HOfCx^A*eMm#B`K-#!*pmsAA{)ZY>OLzarVt4k%(nqiW5d z{9wbT4+t(!AC2>=#?5GGw<^p3Mw`8QZgt&c`*rIiir5uY~m9$6PXqVs-bMUG@z?AYw-0(G+vCk%(#K#_-MZ8R2qWCKYW-Pl< z-&{+5+rM;=Fau{ketk!+>t3JU7R>sCO@ob#@yG8!i?BM`nt@XVFx(9G<`|8X6?rZEcYHZj%@xiGa*xXwknd%k?o4K z%#qvpR!(+~Ge-i?x)o0f1KSgd26e5sQM3TvL&ZDqI^@6VME4^5Wwl z(srZ2%<^Vbkwg4(i<%OcvL#klI$3;WQ7}WSOxP-iZkQTkbP|Tbtg}dS96c;iIHahVUl&fe7Kvgr`GzE8&?CmamA>5XMZaGG<}U0uhtr zA$=d|+d^0_eYb@09>ODpWzf>1y~Mfp(%YiFQ1s*!@VJ3cxg9-ujt$vkQNcQCO8?Wy*2qW6X)z4B8m zqVk0Ur&`U0Lv&j`UpTyr;BgiX$hTH_)N^=rb4Du*BS*Ej#2!v5>F^z(j&*fyQ+1>V z_xdWN!|(RN_{@C1bcvoYwDIv5buQiFSJD`rU9O!7lI2RsBLvqY;lyHH1r%idtocYA z+x?!E?LrIw#*w$$S}a@Pq+j}p0aj8y11!o!^!@-?l!@r0noU|hYM-1IS4ST*Kw0q5 z41C$vX68aDTWp10&1@8zkY^N`IAs)BU%bQdV_`3yZ9aDHNR*Ja+qQ(C-6(bxMzJ%D z!i?=}3H?vV>dIh7%)Cxu+HY;SYE0HN7Y*kEzRQ4|< zG7HH1$8h?utVSvoPoxkL|Q$*64EuMakAg59as`M zuwy^>Y!BkD8-0yb?U_qovjTG6y556Z2wv$yoV)TonF`>lK+ls|ke6M`*Lje~I*ZSf zX?Gi{xC(+g-t%P0h{CQh0=TeijABvPHAX8a>>9J%T-Y^cuizhqo_%N2)b6=2(a-uChF z^oQeAeT*l)zV_nEvRf)|ugGF_9E;J)DyD--heKN?irv7$9u!$gT;#=HS?zxJ>`V~K zV0t%)s&=D7w#s|>YFswepUXby6D_o?3jDxejF~?E6$FDm1SK?bsb`{}b633cwGDIKUPjLADi}LxFBfYju>=_IQmL2Q zTsA~Za1frpoMVmf8{i-dE{6l9MfVyS+IC@RX1grTV2dNv!_U%JK_&l`n9PwH;CYZN z>SLzSjkKik$o^#HXG6Ammd^e3;fT8u|MJ^BJ((pB$jFubkjmUohZ-x^m2Os#2-9ID z-jDoR^x>ZkHCAd1zLKn9@4mb?DRXpItl!EE;9t{f9^k)SOcW2BYP zMnWam6`H!T(A3ompHsdW7B5T>b6$I+#+qQpY=d6K?Wj`P{}%REc;ra9h6fzdFT^X{ z%W)A%W0Tv1r5grH>TL60A_O+7Y0VBYz+7nqmYyOnp|Qgw@FOCzM|jyesa_C4yVbPq zQoEfuj2{Ke-i7mW{H^oV$C1*aa=Z$_dQy2QldyZs#JGHdjm zW+y3ks3sm&J3l+rjRsBz!nO3B-UP&FvcIa@bi>2PBQF*8MU|)|PX<+XoBnp-WEr?B z_yvNrSv{i?51ib!E^=r7>ASt9r>KxN7gl*nv&vKQDo^QJR}zYA>3gX$evDh5gzpSt z=A3b#TDn#3Rhd2UZ7*^h?uKl!9XFDefd+Qx9%iL6Wno{LOqb{lAiNm|Rs7s&91GLn z4e^(*GT6Qi6?!Iu7OKf9=T~%e3LQuM=p59&r_!$Jc(UWr%9FAWzjF;iX6L28PGakN(fVCgffsZ-4WlsS>RfT>L#G{C`1M* zX>|o46|fAYF&3CWW}Vn1VTIK0?h?4pENccjMK|4k=)_r!@uDtW!>41ZuUHtYXIi!Q@Xi;v zM7Ss+B4p0nL6sYVb|&^JOK0|gt=UgeFbRiM7%5`^1GCjJx0tTtES`Oaxho6YMmSx@ ze{Tddo*!v~M$N=sM0CR0p3Zn*?j18% z9&utn2pH{_B4Bh$QLoD<9FSgSzwD6o$L~sAmcmaDihs^vg8bD>)xDbsfF8!y12!kq zPiq5fH}Zvs%Uqhaz*60whE?(*5-a||t5jK8vy!vcnP{L~SxYtrI5!ihltriMvO4^H zNh@&>6HyXZVl4%EHKyJputvpAo}t8=D5VQT)?}#G#G~m;l8I`N`!0a#Mh6q{0w;nV zQ`49efW>RBDP`08MNsVzzfRlDlZHKfgLyg3+(Pms1WT2Zo^fMQX)$ioBeu8sC2?Ri!U7JG z5L+w$6Bsw4uIg6f529Ba$<@*?-onL?YDY&0*Lh)`_aIua6{IypEJ7EE*3yrtOr>70 zSFOxL$|HF$y0i!8QaJ;e&^S34wMjF0?TTjVNq1wmxuQ_+S}o2Ewhks$G*eDaj{iaM z-2zk~a4!&lCdQFZURYwEym(iy#;0*jqwm5$M3c5+)=#y;!WRqlYNKysqh?Ha_#L-y z8rd>BF?`EyjgxfF7p3)qWuS)F8|8^%nRM7?)Xgh1$NYx9NV^P*Z2Z6PPAfMhtkJFH znSgbfTjZnHfZBD1wyY>!0QLjCMn|XiR|jAo?5$M?maDl9Nng7BrbeI4!ilDDQ?=&q z%97ap&^|Y>x@;VhmTPgYOu|B71I(`4P}+;+E~9Qs!V=7V@dQdpnQ@cAh^C~6Knv%?YM}wvL9knmo1jj*WNJXr zmnCL?yNVQ6%!y}cTXs-E*L`FLLveqv+)~F_hhIp80Be0x&L9OPfPI52vM9(1r##VI z#q2{juaH*&j1>S#!|Yq37B(jvokEQZNcsC9(S}h=C&Cq3z3+Aryi+iw#1-t`T3{_R zQu;Z@KxB#Acs1FF@D%TSln~?;lFrkT#yi3VS)YGl`VfQSPyKk~l$LpzoMNyj7boB! zGSlPaM8j)cAwz3~4`*KEvNyO0h1^9v=caSkh#eS0;Jof3P#&}4vow?=6v{CYE;E9w zZK4w}iFI)$IraR?tj0JWobZzXP74))H-5_o)?&MG!^}dTw+E;^~a1Af6iZ zB;vvOD#Sw*;_!i`!YmxA;U=pA7|!i5%X!pOa2}5Ni~NXs#g9xYmF_TdwelsefB1$3 zA)K%=e`!xy20|RMy4f5CEFQ>+O8W+r>>Fs+)P?$ixmflk9ESR)P#pf`Qict_x0j5& zq2Woff@Ei)Vf{|?D+$Pn1wdt*QIO3XONEsM{fX#cd8>3DQubOVI9hkh?L{7CM zNms~EV52%DySs$7YX@u{96g9=#6RKQYdDxhe{KYj9i4Gw$5 z8yN@db~qHwpOMAmdbhiZ{@IYPa-$h2Lbw;Iyqn$=%BuqUg&Hm0SUO7-f9?cr_C~(g zi=5YzyShBeDP^w;s?YM1pH0`^v>v~kWv4l^tFTp7k3ZcYiYi`7V`7_?iKW6ny+PCC z_=>Z0fV|2r#$OeE&+%K(n~cycZ25F zm;U~SMT^>&pItt?zWnU7_EHgOD~iV>Pv6hu&CPkidS^L!eB$fU!VlmYNhr# zu2{L-iC0ft+PnA_LIjp*eM!e_dtRgWrG8tICY>Yqmo5?c4rROKC!#LIe? z>1T)r`MIR0pSID#2KsdbESWE) z3pH*4#d}_HQui7u^6G?RNzEA*;t=4Ho;CA(Yj2xhm{*yyTQ^v!jZQ)+%#YKHn15+r z=L2BvrNYxZAV}K>kJh)WyD1(VigkCNxv(?V@7Ax{=6!YAGy3X|vY=J~OC!*cZdG7T zXb2jL_lhN;h2zjRg{;nyYSPag*jAJZ&I8?m6>4}BduIGxB~^BD{1>kWLy|7o{&Q;^ z>~*8fF3oi*LP5WR5rLC)%5S24>j0Ow4v_hG3;uSyR}136(B|4pjJ(sAUfT1L9QGDz z?Wn+>kwgymznnlwKs71riy}x;TwHVyI$kq^JuxTK)deywuPqSjSsXnagHAQNf#vD@ zCYY353xTW`RaWx?v8-Y^v(OxUsV2o`J+v{f%y_U(WnE$BV4PNs5*kn3CVB=-RB zw49b444s#(7+5A@X&Fq}WkL{t&>rO)PVfV-FbDdL9%U2k0Hi7;C=)i+XEQ|NG^xNN zj0{M#H!tBeueEM;I3Z}x=Zq^oiFZ>WT^knYIPqfsbR^3z>sgxA*fHW<&weyPNoEnJ z8QadPQ)doNks_9zrT9Z8Y__t3R}GNf8cH?#F6-%YBGt?#qi-nwrViLyQg8xbA*_BS z(M7G|MnYBx&-QXFIzDo;lH*HzRy)C7=LCC=2v#0Wa6|*q(t&FOwbCWZYneev`aYU< zMy=N|QThOFdM1ND1K7f?jPb(JfGsPi0`mgr0;=gK$x<;dBMM_;x7mCQQ^lB$;8T_G zn9sm)nkj}7$mY_XRp7>%(2K&9=oWrXqjur+G)m`0MwC8wTc<>IN3DPeeU|lm~YHK6IM@})42?rJM@m3ij7m?nXu7h*#!|iF@bZu zgdaH7YABOBGeS0rlgmstHZJK|!PG)@E=iDer)G`O**=B0`)zM}YyB97lfa9$6+#H8 zW5HA+XkE1Ec&Yo;Oe9m_k{R(}OXeEs%OSPZA zvZt5o`;w&tE7iM|zHM!U-6M)dK{_@mqNX@0G9{f9mpLi+OM}TtkrlrY?1EBRkyoP= zWu$mikP#_TVF!>pD$+FfnGhVabF=alH)-3EZqMUherFz+G{)U<9uM^$$?Dszn(xG8 zI}=bPw`VO0L&SIHarKRDt#pr4)HjBEQgRZmjI+LEy+4qZm``trtgMy;>XD5w`|5C> z(gc(s`6unLtcAiDcGx29bsDM()$bFEd8G-(QG0Phi5}SGhyBRiIkZ6$M0mn?E44;r zB4QH)bu9ChMIU9BCMyR{f?M?sz>9#lB*TUjR>X#(^qs!6V*3*R`Fdp~11t2yCtc!A zqPnfj>TVqpC4u$J%I_liAl{*K~E!g zHKTF`ZJFd9Oj2ensNzKq^d|flAA>vMOL9IkgEl@-fz!rQuJd#yCrX%bd@#_9qgi!n z6#rXEA0ma((XNV<3QN{vhS2s>x?I9qJU!=<7evdE-fZS_fKp0%J|2Dtk7kNh;s+Way?X<-8ub(uXHKa#sWRZ$&*+A5CzG&MJ9 zD%0EknCjDI$W&>6H>U3y9GFgC(m6_? zgO&WSpz7xbMZTLK9*pkbhuO&?po-|25J>?P;7kY>7Nt?T#Q9FhRMAE~mq6vL4>NH;Vs5 zHnGGkBOZMzpK-#)^Jf)VDC_)U3qTnU*D#eg%uPc(g8`gm%V=M4CI_2+W*{nmIHs`A zxAXatl2yyY>AZdBVHK8{l9f>%n6ID`aS*|8%9UjP>Y0`Ayo_YO>}n+lVnS*k62!1n zEuAx8ZZ zq$hEuqRkQTr9%gMxSUV1A>~7%R$**5z#e6|X`zzfdEV^?nMlEQ5JFJ`l`+O1^wgKu zwL@gs*REX2hrOQ;GiY&Bjj%ufmOVGtzri}Vfb$)Nl=^=Kk z=M6UR?p84fs@tMpy2qK8b#GX|PFLpZD&rEPq^IL{GfqVCm~1x&AySNXSPnsP^>{1b zcgh7pN;@Y;{Tyy1fAkjBmv-BbD%%Jj=^ zm$!auUFkM3rzlvnyP~B$*;p-zn^881o7QhF&z>Zzo@R$pHvVP=kmeD#BJg^yu8!-9 zdj_c))SZe!T!`7u9i}P9n6%NzNQq4@OmsA8VRKTy;iA?w;dIs*3C+j9VlD~vp*4g( zoPtU)T#6?zhpw#KJZnkA>cWvW+`bz|=Gw4svX1eIN&@q-X17ZV8Jn?#_ zv5_E`p@6AjLDMqa*<-e92(SQD54hoIO-o!8o8fk{(Xf z?0hV>cX1JvNH{s$`{?agzcND1rO{yYq1&%MCyGRBMz=UBLga&$nIyQhfErXL*QW=(YS1Jkdy#Kc@OUVOz*^s9|43QZGpi%fQR__EPW6yIv{WaU;|iP-t=$* zAe$A*0J2q)X8{lwWI0ga{&Ynn5m4N~wY=`h>_0S5QKH)(32C>$BIT?M`DPBWnG>pj zv4?6t`8x>768TIZTj`b886|A1HMm+?sQGvCe5_Z`bx(esU_`|YOn!AaK|A{O*W>LK z2a2fs0>TK=4TI$PgBKCmPJjRDGMg=2rbS)|Y}}iy5EfvhPzs$w@hno%=z+OynB`ZP zRC&o7!HzJ_R8c+&YhLnKAbHQLbupOT%YaU3BP=6EkZ)lbv4vn*Mr=a>;%r^O<>r&n zzMV{Y&?2~l;3@@CTPVl5n^L*u#@3JpcN65Il~N}Nu2rY_kF}2xo|Yg#El|O@A{iCz zR>Y`)wna4SvWxmH6s19#6D{|8DSiX7iGQfi#&eMT#6-*4{d@)wmes9Uh#1#j3LYY8 zHzro2JD995b~axPwX`0(rU^d&sjHh4e77RmNG23%rDyHi2^_7{HE=zcbAjva`Q(JA zv$~J#b2!7P0ex6n&~EfF>?2y{;e!gxlNsp;6xNM2!uu6gEvL?7B*eA&DN_3f*AsPu zq0RK3kE7t77C*Kw=K|JlPBy}JARA#jkj;dV%>ry6EYA7E#W{Z@pYs{EkI6qWZ0iC5 zh&CnAW`Zv%C+q3AGwN11A36Blh!nfeR3?C48rHI#q;e|37RK(uL8}@Yy|2AVJjUn^ zqWS23%f!g%>DS&P#kKdA;@W%L^RV`2Jc7>18-Y!lUE@b`*Zdk^o^lM&03~Ru<@P_H z0mqgks(&geJ8^^PB5d^{ew_` zGxJc30@b;d@K^|MCp=!mSUF6E61Zm8J13*%Trkbh2qdXYXJ0fQ*cWSVGGSlJbbeLA zQww)iLFXV{a0i35yp2?}Aa#O!hrLc2_t253rfEfy(_y&_CKKe!iV=~EnqbWii zzTH_Be&m8;Byl^j#BO>bt?gW_yf*vC*H|k>v|qOESX5P>FkqLrEcDjw7LILOm;H#X zW_z?K!ZJ3~y&@`zwcX2N7b)Mq5jS>`c7puXr37O{S_IA=JZga&d?v zEtzr1Wd0~~aZBdnkcq%i=AxF&MIn=&U}g5SWcGwiEK8Ny-ICcIGTB^JW@k%gXUJ4e zS4&Qp<#gyC4_D1(@!g&-=I~Mym*+7{HjxHo`l5-Y16uCi$e(U!1&81XPoZ`Agkn;o zwvu4YAFGjeI)zr;m zA22<2qhDPl`1?A-t*5mclg=C1h3=refko5|I~A3+>1{j-1YmUe+iGVqZ)3+1ncYsZ#J7{k z0a&9p(dbb%I=TiDRYog#(W(F0ETKtqg%w%sMabsHi7H6jHwrc<7+}Q273*n<)fIy= z4-fCfDiS`@5ez4w4g4C@7!wGg#dX_yiWTl~PoaJpvf!%z!3C>t@Q+k^cThn-ONW!ZXPxd>Z@wLm>)RtNoZN;gqTbX80lAY zVyp`VH5;9gVl9v&7f`MGoD}(_Ns9H16l+F`Dhw$KlTNo3c2cZ0NwJ9zN<)%W$2wPo zp8-Z>$0;&(j9AS2{LC=Iig*C+zO#st&h)`2pNtAf=?qBe3`jAe#>ut`dJO1slRcD{ zG+kx24udPl-?97cu{ah5y4l*Uid$d^tMlvo%{WVjh42vW-o{CDx{)npRDD+JdUS*P zYTZsb*yD36E`BUEOj2`ygAJrC(u?gfv}?~LKyAXO@SP6xz&)F8mXKCbS?F+9N9_>@$%cuWU;~p8s5OOD;mro#xN8CmxdaLCRS)M7wbk`Ez#5P)D`aO{;V@(-6}G$K0_)rL%0o{B6f z06`eYfdD;W-4#fZ971N9k#sTVn3c{hZAt|?>2eS?r<4*}rW9w=yb8+LjQ-fM8_K5? zY$E3iKoSUwFNjL4p`PM|(o70K3XM5ZMJYLuvWYYgNHCC$Qf!v+h2uX5k`3H|WO*W{ zB9Jtjb09I1hzHOxIM`SQ8o1^HZbRC9ZX@OzxDD^43++xl)h1{VLG!5xK-NHnJ`ll) zFJ#k5ik!F&>7hBGZTtqeR2c<{SsY^;b!Nb^FE~JT(&M>3r(CRXqeG*KG zE%uWVi-TTdCu{JL@AFQp8ETTq>Y_KD`(8--?&?yPZj6n$4>d}wBKBV54e`5Q%WtwF zJ@`p>rvG!0$ax#mBZ_=a5d`xbo3-gScIA1Go^8-~zC`a;&ee2tQ`T{FQi;lb(ag%R zKe72QzaGWE{2lB%5==T|nuFnwg=NZvnUIBL;)9uxf3)eZCea{xp}efp-f3#S5;`w+Q@{4Iups<(V6ZN_+o%;)ed$C>*7u)lG zfHWH%7l`HjC!%?j->|dfDB0>LnFQ&Rj*=E^aDn2O*to`;EMM2e#x+fBoY%z0+9o#E zKLcz`Lyilv@%%zq_87;9@c3UppAg>Bgzyhu3>Mk;*!#Y(V|+z={Nc+5NYv0XD$)5B zwlyUm?Z$I3J>rAEWIJ(~Qt6%}UuQf0WqmAtH5x1N$}?MoTpO@^w>Vk+_NC`W@*cur z$GE}>G=;|$rcF&wO?Gh-g~bGhX<4nI&bOIC+Ke*W>`dVhLG?5JI&k2r>BrCV2`3PY z>Ox|~k{AL;)la3Sq2rLled#vV0`#oiHZ4&p5Y)bDX*V6^1bm*;OEx^j!;++J9oCh- z#P-sp79bSW9tie1Zi7NBb9$McZjH#BXnVT-QSfzobDq+Y_CK}Gvx=+kXtJ8#{bgZ@ z-H`NjRm``l*kW3MP&i;G%tCj5kAOra(k8hc)}s?TE44jjMq_*K2uM5AGdyz=w(pbc zapx@964|fF&Ja1Eh@n*X>P zcD6BFID1X4hICLXDW5t{~lqd9^3l?}T=#+1lMgc4+rVvt97q(*J!ejnV&dRu5RPdOp~! z=RmU_(A`oG25kj6q^S1x@%HA&yP6-L7Y4n z@4>v@94XMWRaVA6H`Fs?;!VUD@YI&&WL-VntnzSPWeOBp#<_idJ+-W!jBbuJ>zQcQ z1I?tfK%QZaV>mY#kgse)e5{`xXL(M9ibdz_D z4c}1D(ySi6Hqe|(dd9_2J=?6ONym9Ty?H&oSv_vno1r@0!w&u9)WNx_CVF1)FPrsl z&p{``Rll+EytdxQDU`v(h z9EWxPe3^H2RG;j9hbol(O*dOdts)tGIkfh#BY-aHg{@vIJl-rk+FE!Q>eruN))atK zHKv>dpoY7zW^3!R2|~M6VyAW$6M*byVYuM}&~9XEBcv=*)s^d%NRdncngfis^t;w6 zdo{rYAhX?!Fbe|k4m31J7Jy9YVV>I$jd5dmew~r&J6IlLRg`E_PK8{0fZBY^&BglD_cdpYr z*O_CgmPG# zEAtSJtXF!FH$O2nuyS)i_)M=)-mxghGYHrmSddo`BbJYy z2W7X1vU-+fYY2}M-b`3<7!76jQ+8L#-$y>gYi;Z$yd#uFy|l3%qU^qqKSTcB5XN_! z`~g|LsJB-3C}j_Z{3GO}u3Ei^38ThZ*+Zf17G&_zkUye}At5|W_;4sYY(`FUd326l z?-3mIW{&RtD6FS+%m9k9Z3|^}Uub8@mnoAj`>3oeoQk)CgtvW^-5c`vlCMWERdx?y zd)bnDCoOHTJVV(7A)hydaO&=5d0VKwkFel76UrW;?2(XvnEb;be308+^5Z+99D`E9vER-Fm?4FP>6Q5lnEX$vr zq3lE`yO*;2L;fD}_l58-!h5UfgmF$}lpIpRA1-8L4K-h$sEM6TtW%ap7CVy|TH2t; zRuMzBNIZroC@p&A_SCoxLR8B*i|LFU>X8&A50Um1YqDKqg*Dk8MVN%PK-;Sbvy-)d zSd%exnSFM{l^M@`v6<}rlC>GmtTIy~a&l85U*h}zO?hn@wG-XEu(yMsu%_Wqi7i04 z5~{<0?VXxDpvC>&Z$?8Xq?|r4rOMiL{#U33^F9lz$MGsEA&KXGh0vOply@W#RME4u z=XF4{x^nQea{ZRl+ck6>ew03@Lu&vLrTd=ze>ihUxdcjtoz)WF(gq+q-m`xMqbRm9 z(o;EK#`ME7v0n--PFLnvAI$KZEsawYh1eS|ZDS`yLa(0zPr5x*{FYi{aip%!kZRT(2@7Xy4RvufZ#V%&&O8wvDU zfX$Zv%o}9Cb<8LBO*C$yf|~_R!JFd`$L0DW*=00#}Ii zOlD6YOhO+}bYntbF>v4(7}mWg5p1+`&J^wETY4VbS+Mt8j?Ac{pUzv~43HX7Z^)1j zOrRV<$(Ri*94D^;tU!q|uvNkyS~nZ?slfL3r1r-fxsChCkj!!a!)hp0|&} z6xt`G3sund5XMB_1Df5S8i1)N3A&O^I$ann&pk3Er^=oo;>OPjeW=`YW24SKJPmO) z$S}wv`E46BI>u_y_ONk982S#fn|&W3Gw99qM1AKh(tn_Ixpxrrq;Udtj2;0%fl2QS z*i;3)U}~jC$iy}9fmKceWSxRRVi+zVjHXEUkrHC@#YnSpqToZ!K2C<;94FR^=<*t; zz37d_OHvKv#0_UQP6%7$R0@zW96{=}97h9C4TheQ3edXG5_r2NOF$KU1p<&n-r;%l z;phYi4h=dFG&ILJC4#0)vhDz>%x-mG|5$Dn89Ld@1jv{Fw>vZ89^>-s+VovT4d0JLp%!zWCftNv;*qxHgbVkf)p&d$aQ9E)@uc3X|}v{%9*8*s4fC1ftfJ}W=ZcsBdw4` z-?bk=F_x=|g7R{1G>1)b5UW_lG9Hf9?3oy!r`p)gWUcs-bsaJ0V~o z!XuWx)xut8#KK!FeS4wI77K5)^c{sV+bm4w2dtq{E3mUrc+|q4K4#%DE3>N*9=Gtg zrSB<(cUyS3rSC0-CoDW+>H7-dNefR}`u;+A%ED8YexMMZw(zv2A1s7tEIecBhb?@_ z!bb|}hb%m6=|>A?W-UBt>6;{!+2<4R=PZ5r5krKfdzoPik68Lv3wxOn3vaRX?S(R1 zEWFLqcNEHOv+$^;?<|xVweXmw?<$lTv+%g3?Kq?P!E3CReMxyi$Rl`cvVv{|W2lD5m3>qLoQ7TKQq1oxSrO>=ZbEh+Np zU6wtG)yI6!KB%lM=Ul;Bl&GYX7}aI6-PPyl6G7Jv14JY}<3TZ^_Vk(!Ql)TeE{-Bg z4wg!_lrb=V9I(s|VfJ1lS+VKaA(^?zPZGsD2m{&$oJP!>k^+oPU&^oC;5<&}2egBk z0^c(VL?}wbB|P|COXMjleLK2jm41;5n+q5*wJj1ff*dL(k>pT4XNrW?b7_(;{!|R2!_&pixr-n zzElTjU08ECA<**WgN%(_T9$3E3TA(Uw-2AWJ9ABzpQ1l8jygbp!7I5X!jO)0K(o#sk!A%77g z5geUMg-Yltz|`kCrhPON48ymjqJ~640U|G`kdp*zl?_DNOz0k3iM&obIG!7d1emU$ zo?c#hOWWJAVcViLz^X{7DjP+!xnO%HCJwdz#U@Y|4RZFDnD7^>D|U&XRSLuqGp#c=PLQ$_7gdO;j-!VB_sSyT6=?JRk*~ z-zWGjSu1~vg~Qy3a4GfxhbQs>%ih~S`BhbS|M&MY?{7EnFO$Ii{Y>rTF)2_fK}a=s z3K(8g+T!!1t2|w_^;wG*SpP<4t$+G|s0}Wv{Zve86aYmXrl&= z8fDZGqNEsQ(5R^Y&v);0@9$+M$pnb_|34a;-#Pc5d(J-l?7h!E`|PvN$F7>PJz^A6 zdU<5g0K3kMWYkcMQ?oCLO%*m&VV&{X!rF})Nf{_?p zU+LMK544W&scf+2?Y)5|O0ckDG?ciWK71G+Xc6z;? zG5oczQWBXCNnPzv5A*bLe>%a_HU9J{PiatPhmaAgZIC&xVN}A#Dzkc_(ht4SGBGC` zd5kO9nK z6Fv+hS_v4h^oHksOvi&!r61WAXOF^fRwVl*t3rpH48GE;$#No$3|&F388YX5WU{)( zb-EhUWF`Vxzq63H`em#|QwhElhxChY#<+e7uBvV+P^B>x{#wRRFxGxO2iN=bOW;fs z4KUiC0>>nAt>tmbP_ZZ1nr?agUWEMyB|+|We83fzMa0Uw^y}ZgCn6_#c-#3f^$doP z9lQdn1fL)}%`}k9AaPb3=U$Vx_|5Qz2?_nION$qAJF``rSQYDI|M_kd*mba`A4QbQp{!fyrn}(&lJ`%z8jIfe)?EP!u4fX zm+X9|K+gzf|HQPh9yc<#^8=ThW&P=|^o3_V`SA2J-5K8`-8r@ObGF={DZ2QLn#s6w zVt%q{Fd4p0Dk2WY%;#ZV=fZ`hOh?>b#qW_q<@99HZHQA-XR=Nlhsm2}7;l)fh+(U& zE&i|mYL})5Q`_2tl6M_f7-(LphQ3KBU8s{loOJt5PNtd#Oxm>5{EVcJ^X4tCRUZ>@ z`(PbsybZAcE}*AHW&TB_M|+>v=uAZ1EFx%Y;$q4@2Bt!TL6)3Mg8(+A>Jb3x&H5a45a*P zyTW804wWp<)^h=Rp%M?mSU?%pD6XkW6Is{eJI;k>b)H#bntf8iDTh-prbMG&OxZ2H zFlAC^u4y(;xhY%c`IL?Ge9E?Y?s_aNz#23c*B%bxC>9ayJ&KhBPXs3OSBD#31$OXP zV-2qYf%>cc4X<(~LjsAlb=Fok&iPWNKydr{fLe%OJF7}Rc80lRhkglQf4hEh|Hjd; zH91|^4D$#(S~8hOSuWt zEF-MrvLOj`iVPjxo|~h|s3nYAm}0z0ZD{I?gjJLmsSQzmk=C?sd@{J32B8q&(qpEF zDbbdV4K!$D!x-4uAdzisV9l${SJRfaS7UeA2=J8ShBi3#d5!sw+tXF%n`vcNo6F|p zfze`zfw3)45~8H05n_XO%CSIxH4IvAeR07X243}p0vVKaGMkZNL8dl*{1Y=|u_KHz z%0~|Zl93$y8V+Jz-+Okk_lA<}Z6mEAM1D%FXq?SFsvBmu)jA!yJi3fscx-9QqZgeQ zU4u!J8^Yfrr-5R6n027?+?6<>&|X}!K~QWS9Stwyi9gfxb3GpM+3e%16uL!`5LWsY zucmav1h%oAzfTU+TvBGgfRQPt@8EH|nLqZ3K`O``h67Cz2O73X9=?##CNV?;69Tr< zhc2vu5DXb4y2T@i2DPUxPC0On$`@Jzs0p7fml(Bz=;be6D8Ir$Us_sKkw5l6#)@(r zOpNa(_P<56lP4qxRZ%?TDoIjdAcuq;E6=K4?vZ=pgI{bMrAft@^q`;A7DNbzW6nv^ zG)EhVa_{6pOY5DiWjs`U#KgooP&)xS>0l5p(yw85pm;%lfOeS4gvYvkl1gwp1|fAI zD^j|FY~GYaAGOGp4l>_>4ix}S_Ej>d0oI|WKm*k3s-QMcQ9`TXX<8b#y11|!9Z+7O z4vEz`U}6YjE)Ev0s}N~OlF)rELYGj}8GmpQW*0Uv^iO?Qggrc*1T0{=;dTxAr0`0>X0v77<96^y^m)as8_@vKak=IiK`N$aI-B*t!FPNkLXp(~+2NeGZXqD$y!fpb z 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

    HZ< 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

    u;O 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

    I|`3Vr5W|NW?cb<#pM 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�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
  • QYru6L|#Twa;Vf%-K_WPCjMUoVg2nduE=R`vA-W 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
    olGrnnr8-xL)Zy(zweFn&`s5WXoY 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 z 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�S0!OqbU0*ahd)dC(oO57%RN{i#8O%PV=)>R~XJX2t!8a3IW?<92C z7%l-%W=Vy*7O~-NpcRTIRm4-2C}laD5whq(J|_l^3c6<%X`mpd4}E6r97r+L1q`>1 zp>!5#E_k81m4_whp}+~WZyrQ|iou?iLLf*qGlRr|l`1eqhv*0Zt4EZ^VuiDvO8h(UWcAR z6F|Qdx8s~p*}--KEM9ABkIhhWetW7H1q3eOVUF(AGd@EPt23-MaC`zItWhyL)cy-~ z8%((=JCc`*_cwn572?(uGEA*@wR8^9=56`Uj47^51Bz{G?#WD@?7Arw||R+&EY4mi)YFn%)r+pVB; zrG*>?!H}tSQw`0fSOyXW{tG&r0}m#Xu?fQRkQ9O~H4AJ70s{=D5%8I25n>GKG_NEZ zlm>36-{nK|r+u6L$3M;YKcx@s``mv?##8z;ey-Qweg^y}dY5Yh>eE_kOTA(1BR4v- z&&8io;y;&7ugSB|&Y$+3J%2v(!IMibtiV^edE3{fk7pc{w2GwAH{%x)^YsCDq@xHU z;!L*_HZrn*uTh@He8R@;bN5iY{5@J{Ct$Edk5uMNoK2m7X9%2`&dH1v)A@sPLAjQ?J+As^sMMyqT+P&g*AK(H4F__JR0BIUW}Zr zU)=N(aiT+sz)5s|I7W_~E`8m=U?#@xv=fbl?{MQ>B2-#FU8>3BzEK=kPS0C&WpuV3 zbbcSeKFy6_=}57{Bm1_C)ayyo*rg{NOq-;a>0|h&PL9yPX*W&PV8bZuY!ePP?s!;J zZ{SoXVc9qlcj^i6#b*?;r~OBNRmbHzu;cvkwF**Ivs!Fn}RC;P8h{r~wd6UP8Y zo?e%%lsgf*|M8iIWxmyHotz;PHh>du#32zwz@olnoZosH6KJ${q?wT)-H;O|pCmwU zeTTOMYMB+;Soiok#JCKCfZ<&YZrz#d?5qFD6xe>CsZlyQ|1o|d!7AK$gC)ocM&0XZ= z1t(2_QP%dNl|aN{hSduGiTO#uQfiUGk61|kb?#iYT;?szJ0J5ASI2RO>3WmgGe!T> zf7VPTT7rcv5;tdC_Bk$CuXTso+jBaY3(l{-ep^5L#^2pl_V|n%s~5qO*(y?2XWlA0 zOB0?*C<&vVjZGDDE`f3{p90&B&LvNhUB2?K{_N_1*7}q7WaLPTHXf{7ZzC#Q;b&q% zt-}VEGr4rVHk+?c<4JeT?1e404##0ZhWQT@(>Y-0nl{bW0ya$lD;eZC*-;t}8K^Tw z^)6Yb8+Dox1N=)3$J4|(14YrKX{Y@+Q~MmQP*}LOjsU6YQM-lzvBT&F6&h7A4r{BH zS7;(}lbi5vS82x$wZmyW)qldIi#KnnLIE>Qt-=-O3PpnBgl0*zvm$bMmq^q+-na+% z4s3~WEX{8_GG3tk$o^q7^d1sy39EmeGWIH#ijx9J&h z0-MjZqE&9fUQH);1b>yI4hHjeh-{N7s^kQpVSh0J01Bs==E-@A2UPdL0P=f)?QThk z3a}2jKi-sr-gv2@M=8?xTLpo}M1k7_+=-3_cer+SA$0E6m{7<1LtiQuv9>&>{+n71 zDR`e<`>($@zMCUMA^mCDFt^{!J$~nD3um@$lrnW`plyg>?lF2U%2WUqhue50<{T^r zHLntTf<*L^dXJMNuZ5?>dOAv(Npm3e(m9zjR!9Up96`g`Vd=gyCgFh6^rMq*OTafJ zB8C4zR2XCv9-C&P;8|y%>rUH z3Apf!oy(E-t}`2G!=uHV_D;Mg9hY(6!_Cnt2`g)Ch8VbAAYPl={$xmq>#{*QIH5x@ zeZEa3(t3ueb8BshN)R?`#Sm2bNe3w=1PVncbgEBYpeXh*vZBNwSDOG3SE=So>;;@tb#X>b& z<&`Jnn7es;5-*i@aimzhI404Tgc11cQn3OnC+o8dWXJSRiJX;Q?mUtBF!L-1z zdI)=hTg*jcomzWXP24AudmK?AYQ2(LI8dQP{LpZMNI{Vu{kE@ z**$bOr@6MvyIi9mD_>_jZiNVQAe`XCjuvR`l{wIubaDqOv_qL@M^z%W?jqWOUaluT zf0~>=>Kt;Ha8eA+k7GpWA})wT25>{N5S7pynY&Q|6DVw_j&Ot#h9M>OD~pTjHT`wH zUE+rBtjSUL!NfKc-WjV{W3x!LG>Dw~7YJ#gBA!zs#HOSj`kr&%lEG*8qLp2^m7A-!@U^8iIcwK4ZY~`?-fnVbOsqNiES}*o5*zE{-Il z=D?ebMnaFx_!{2KZ+LIP09pBvg7zI|7TPm6wYgXg%T|{_GZkcCiPsg&IfF8scbHVO zY-JgE3ZRXSysY)}$pH|7flv*&kt$&q7cqrd?O3Z0MVQn+Qg=l>xiQI*Nn-OZ2TMbK zMZ)Jk!S8yYn^?ekb)C1u_V%>m?n<6EeBJVJUopLCb5rUxdamKSM%R5$dd_A-%2w9f z45(&n*S0O&ev~W8cc`+1joCS9i-$zi8iL)mMD$)>L9lund6HYB>)3q{pM`h0Q;_nR zxl`Re#0>&=55k@}I2JFM8-N`rF*|#=uiJx>u+oSFRcl=1Jt$6VF`HY=3Qg5xZdkP% z(`kcgw9YcNwUGuz1n9CC^UCQ8gkArEFdUNAYY;x(ZG8dR529gt@q7ez%a-A)NY~wE zu^<#-&{AcsDooG*vgEOBAPdUiMFJ3uQoRpV$9dmuEXGthR`z}!u{t*)7S*ZQq?|IC ztoet)oTF#7HKg>IgyK=G1i@hF9C@T0`<2Xnn1v!@KKFnnC{W%+ z_)jD}#%r39dSIGHNvu&ng6wm8m&2S3jUO8PW4$0HpmoGa2SD*qa>=@b;TT?}c$a4d zo?{t-VJ;&ZpADkBaL*vCmf+R_fWG_pM^^3WnNytK^C7mGXNg|oG&$f4eQsFWCtLSo z`9o28Q1wkw{DPj(3j5cf*`R?A+KJ81ol4cOL14apKdR5cw%ID$TT*uqq1$~>n2_R; z$X{JtdbZyt$r-?LF`K!LAQ6~n++}t+dGWDyc2U~-B&olZuM*c2Q`#dKNbFOQPA5+uP88%q9nhn3*f$Fb?uV!*3WqGW1G7M|w2on>TbdaFln-)}XDR?_w6WTdMjg3~uOp zHl~?+Vr%s{XnA6eHo=TF8g0mwqVCDxQ(poqZD<{w?a8c~l9@6j8#$Vt|94fYd;gu^ zz2TtCe#a372F0Af?0M1l0Ck*ru!@;FM>jL|<*x30&roT3Pe&alI~ugLzjvhf5YauD z}47hi4^jdXt-j9n@kzSjz1AK?azJXv5pteuckR+g|N zfi3DubB@D+W+I5kZs^|;vYORk9wC)nN#&qPSU|Hbdls<^Ax0L;gxxT_BV<%oi+K_> zl#=h`@~%1&xB@A$I9g=qldk<3$p%?TxKRa)9PS(cu39j9r?A`&x&~7$L;|jv!w(TqjjtB3K z&#)yIra)J;FPTQdbRdz0Az~7laiD#fYRIx*0Z)1(kW65|L%fs#p-8`l=ffvHNl2&l zC0I>qH5rz4x}q+y)W$Az12>dWEt%gy>}t0qoe^CU9A1fjmLGL^%E6~wm_TB8GjY9` zH}hEos^8E5AVcV%KSP$Saepmrp zkiTOp^)^-3tP?ztR6w_r&C>kGO8sai*X8nyn3@z@aW1-gyTUcOmhiwnFeAhi$}ei_ zm@a40www+F+eJTHh`GHpaY?7zY{^Gsk7+Wtfu@V*{AOP`mJG263X6us_(6J&h}RPZD)$luZB<2Y@625YRw|`80CA z69wOelAnijn&jBsz(jpVG;dd-4Q-B zBV9l(KhNBaPwL%{lksLo6Jx}}Z-DRf%bygbh|vl%Fw_0mJbUqa;seiKd)3!|xb)gL z7>fSp*icXkagBrnVktBPzTa6fG)x+(q^^O!LK4&9K?)fUHfv$v(-Li?PVW zmJFH5yEa9>B4XSj+nOpuTsF#^W@+HD5H9oKhL}G3zk>$Ax#n%qaER?64#HirEVf`rUK(iQZklV)a7*f2v8~0xb=osDHZW@ zy_W-fm5?h{oh|PZ1YCf68=Kc%2ur0DjK~efZjar3(|PMs1$x_WEg>`u@Wc7!JW;X&V*leE2Lj@U}r0+JKH%6jC0u( zb33@?;cuU(`p7rZl_lqQ`oSP+QC&tziqIqkDq;f@ci-n=*h8|ijRI+rl}@=67kau7 z$Dc-BQw!Xp&3P|C`kW?yRRVsCr)-~mD)GFiG7bvj3MC~&Cq+1aOF)N}; zqm+7CZ6@tfTBT@I%qA{trViNDKwME4>S-Hj^{`0BLY23?-HczlZUgn)3tFfN7Zu_7 zi2z$=&PE2PsW9HilrSNr?Pp{4*#&es++63-ohD%1`9kv13l5~5@Tc-RRS zM+9FsMb<-@7BJoes8DhkP?M=kD@91%j_?_X0qc;UH_N3sRfCK@D^T|FpLu4m=`!&F zG*77Mlt*;hYGbV}+gNR{;tdye7b}Be-3i2s?PU(l0z?(bD{{M|uRlj~Gf@OE>6}pGg+5D|k)1U;bwMiitwtx}{T6oeAnuA?=T%*CxpIQl##e=4D95j!yy{n}WZ&b{Ha&ZH{u zv(C!C|GGSx=7^DHqNG7=1ks5-zU_UQ%}~wRqWPVq)e7tfkh=O!Gpu{E@w?j`cF!ml za~ijJ!)#JRsb%q`vbW>`P65N)%U@FM5iU*W?K!WVzk;B(;UNQ|hzSCQ3vh{-{5cRd zb{djlVMA!KCeQ6RG*dxy&tf&2^BnNk%R*Hj+1g>VkmNJMTXJ<>uR%?fq#g(KObp+K zou`-aEtd@?+d3xuXma@`ex;2FH|4B->Dc&MY;XortmMvaxc9*bzRcGh|&-? z{v8~vV0e%HuCP!t4hzgfZ4)#EJzn)Q@QO*KEoj(jRz{kgrM!Q4F_jHoTpCl8<~j?# z3qm6)aBr68?Ax+_aD_9VIV zBxNpwa}CXYA%2*6LrGYFd^xccRZ0wbk5YhQ0}W@Sh~$gQj@ozssQupmX4s$o=mGNH zmTrw1yS3){kSYzcUn5<{S5ol{&MCMeUBsQkIv~Np|Gy>hc=WI(YA-g$j6KdPPuFDJ z!`Q>fe{Y1|E*CxUkIBgcAsSY8m>zc-a57S}P+_PsFi5Ad)(JUmFle#ZC>!<|`c@0f zy66xtXLrvd+;=t_DUsI_K;qz`C%V8zuJeM*G26kKei#kr9+|lVmh1+ zm(!wTw7ecKH+$oThU>M84j+aYa594-l0|Y>Jg}H%lyS;T?$@N?MvmC*w=Fx-pEbSc zYU;6KrUT60XTz^NDtNO)-nCKyq{Y3W*|3mV;t}9Yew|q`$Rc5Qu z4bPdJt6hu}O z5HqxCH6NB|GA|i}(*7)LqJuo%H(G==nHtK8A$1i@4l^ZhBUe`_05O zFqpXYI3iE47*!=WeED~NPW4VoydR%!3aW=bl-11p%Sdu<=io++D_3sF_Id+0 z(<$;w)4*-*Dz9U?0~pMyLny|cb4V-$OVkCdDf&!VZ8x_#51~5|47tjYUVBk2r4Xg8 z-f#PLB7rRUlDJ~Mk8i#NlBN0QvXCOK{TL*Xx82yHrRg}KA8j~kbKy{tNwim$`FoBV zP;^hO7I#o7Qs}$@JSwVU=NrO1wFsEl0PkSa9k4RZ_F2yV;a-dV_(VRBV zLx5@631-wu{YjV8M0u6fa=?_|MN#*KD5&fEDuiX>yk*FNQF|J|-u0&DYkXadP; z7)9}^7In!#=tX>hcIWd!51dC)f>7Q?lvQWKKDV6`XbwK9|&#`}Ai#Q*l_2=g9{^x{MP zM54%fZtqL$*xztiA2TDtA=3?2$0q1zwQu}Fh0-sk$*|cys>vYV>D4qWO)bg{OUEf3 zuh^e#86XtC?`--0-Cxl1b!l&u4wQEr1*Grpi!oSW)H)Dk>?$0g}@6IReH*| zqK#b=n&dmVO0b}cf2|+vcQ35=jr;%CF9rvouToGB@$g+WN&QXNNIj*G=*ig$mEny@ zXv{dg2J`8R!A925A)>d{;RaJ10oywL&FeB1x3w7t&9dWGzQ}T{CyY-B!{EXI)CLks z8QYrl0d=^7_JX4sv`lMamL-9j85fGbyUJ$FN?5d5#oDbou8TvfRQ&QzMA(IlyvsneGj3>>tB;cNZDK)9Og?kW zG}ErW+H7&R^rsvUXcKj%L=XfcF^l#SiOJ->Wcps1y|-6vEF$wronzum-%mr&YOSkn z*!PtWEaTt$-pIbx8B(>Pt)*42WB%??TCr|syi761%2R&h^)WvV-_B3cnKn@5HFL2s zYgY}v(J>8_&W>&C?JB-s_F25_t{69y$pl2G{i#V@W?m;rss509;Ra%I6wh&E_ zr`P!`p^-C>tXt$~WaMM!ZtZCU>Fk7P!%2D-R`caR zly6>&4T?|ifE_u(9?6&>og`a{0%m8lPO`*EDkEH=i`KbX=sZt7 zLl7Ip12@}!qti!4xj}(K2kiQWMc=Cx&8{`LF<)C*KJpMSInW!nJnVVf2gBiX5&FvK zGYq#tMnDlX9qd1~hz^WbG)*g2q%Kk}X+cAAC13yn0>ePQUs=t?V*~XD#rhA!vBIsL zTjd6GP~;+YPQM+E_B7>d=Q^Kbgr@JL2T9`C*wGM4ZPAwB27B-|`gHkG&gcgzj82cBjrf`bR8~p=je$1;{*~r5PuZH)m@h z5f)-f?S;~lg*Gd3Uh)z|Il`aG0mfrKtc35QN(4TxCd0&FY`cyz0U4^O(qMv!@32&1 zrJlZ4NqKWp-F)Hn&0|uE9{oCmVk~fnc!Nc9BtOgl&u2O3T$)bl#Q*B& z>^3bHa>WA0uiH>d!BOJ|GS}R|7s|CP{t-jjP8i*7CuMY%-nG8Q{ne#w^uNA@%E>eQ z!>kH(?db|_?{M2Y7@z(?F9W6)FzgjUBuY*WeECy%jy8x zWs@m@O>7gSw!(q~ zwBJ7v(W`{KvRgRjyje8YLf8pW=L3v8SbW!`ePqaX-$bYMb}sT|JD8D{?6e7+;4WvF z8kUpLR)zguD^XrxzjIN1>gTcqZh2Z)obq=MP!x5A}hoyov zEIU6jC>RabOjXF%M+#VY0GZkNY}g&TPI<aIhOp8IK# zzWZ6I2W&MEp&xZbgt3S*nN64|ry_`jckH+S3rIByBeon{9tzH92G(O|gQEKWZrzm2 ztvA?upI^3r|1zzK#Q*klYRi!a2m=p8{~$-6;vJ--lsdASHF`uRdOKhM^BA>SidJ%4 zm2tvJbr-P01+7SsFD!t^Q6l3SMDgI>iKrB>5=11H!77Bi+Lt^%FZ7lyQbubY*tFM% zmzaaDStmMkFDm`WsVbVf`9=rZ=+HMhSg*SYFkA;4_HLH zlgu-B-w|`(s>`g+)TYezR9KiyF4u*bOXI+9)q06uSkd?Qoh0$n6@>S*ueXErtb!!@ zr3<&(sYxNPyi;3+drNic5mM^u%)>ueIDrW$LL%?Gz1RoeF$DQ(d#nJ@6ymWFR<4B} zuH@sH91dJ0n^d1Io?>=(5HKrSKEcf3z=p1)Ro0_5)~9vm(*_F$2B}%d&6?`DQ=3z6 zv)QplB1H;p9`@AC=qXcn4K`|Y6@=*2cYA;QwicBuRp&8?@yVeR)-tGJ?JtnRMG-le8Tx(G$`eHzf2JNiM+?O{zEGA| zvR{ca9#z2I=R7ACxo5`4;t=EAlK>`>IpFkd{KG{}o--&*2dp>FoR~%WG#)*n1tAJa zjIo^^k5c!3E&_L+lTSFfmoe*8NB8iEl}Z`8lI|6_fH043fT_zaz<~=vV}$cusG{oH z5{+=Rm_>eT_T=B}O}F1C%7i0#$fs9TE6xyY#);(n=7CTDkr*ro`7xUexjg5io08bka)sFoow6IAY+; zl1Z?+Q^Ivu{JsA9toGb^T1@axOlaf9}VsX~jjVUj1p1=^5kIuUeLn&GHt2x*VX9 zcg-Iy05|cuYN5Cj@$!{{Rf+aDRD>ITr>P6`WuY}lkixuy*{IVGZ2=8sv&Qd0UXB=> ze(xlCBcrRtwQ{SW9fGt*hEtqDO1#i+XEnGBjnt%gMsXAv*!0*kaL3kIBv&{IE717= zG&c6}9;oF`W506Q0(V2NwcW-pl5YGg{nudl>l2u97iU8i2m36a87os3{5psl%(+L) z0S+GjS#S9lyctWvm5oP4YmXoOCS#-9c%c<1OKTs$$W~xy<#4u27>&c|7!l6i2_yHk zFLV{kA1Y|V@%*t=e=~8yBHE1IBPc6H7YbOPHK`%fo#kqDM2z1jzpm|*ck}{O`kzJ&J_Pokj7YL+sEW|O}m2pNC)`Y4rbVQHXBI=KnVCtQZh6u(RwQa;se3C>$?gu_T+sB-wpjUM8uEWrgN^B`&^@R!(W)uRRg-g8tjHnnZ5-iuoMYv^un$XIk$_3yAonnzz|f`Fe7eKr zxXiw8DgQGm>#10!>L0A^@$x?cG9|R}x%rZ%tqZDfa;wq0qpK2ULq}cEH zyMMaGw9fUCc59m{9I2U1#*y{t_11p)Sb7yCOLIh-`B>6apn~I$JC~r^BaA8|K8e=+ zlTDXedlUZ)GzI!^3U(D>i=(ZU13(E|B-k_3^HG4+ZTDAtTEXzjM?5@*+N@ zYP!^|d6MqntimxtKnHg}^KlwwJ@1Pz-rqTvu1rVs60YP} zO`p*)I_=L1V?a0k;EDbo=3<>4qqzY#yKNQz2tT?7sohTQ8mqZsZB8C5R13Tqas1|h zMB|RcSS>`a(L9iZiBd7x4`s0^c6|FMcttN>FI3jC?=za-Jbr|5Vh46So2fM4B}(5XUm)>NJ09>foTvYvg*s4uhgs3M#NwyU1K-m)K1O0MZSH^`|24!!{g zyu+khm-%5`Eek0Jyi&DSt0L&Z)|P`m(%W7ktdi55UCQJ2>FirLxNA zW;GA~CnLOllFK_0g9w0EyZi4IoBQm5tjrU?sM^i~68ycizKhx}3+5vw_vGyY48$ns zV_D|P72R|foxxA-*rwE07!~UYdOLL2vM@SVxBY6YD>j7Q%~8VKW}_Q&45Qf6Vz#K| zppT4I*=!hv1WeNK$wMU+eIv37y~9B7pNb!%zVzj7(=6133`%Nxgyx8<%o@5c`ME@C z_eKhtxlNyQhx7(5f;eLn1aluY%w_ft@Umf4tMVU=Zv(=XTDhszQ-ksjM`n12TV?Dq zO*<{~vj>-mZzFmK4wTpNuObmF^=N*rd_~&7t>-1CshONf|^rP<1x1GMllt z+y0inD8l7lHiy;LE>?OI|22ftQUHRvq!M+>)Lj&}MZZK2Uhx+%fUZTi^#0d~kX7K~L;jNYT9XMjp=c3)~OpEC* z6ZiMg!!>(};LIec)hm!&s@5AEOBcam_M)ZHO)Sja@)2DxVw|2Q9^|(FPD3mnkKV_~ ze6`mpAMg(M9}F3B;t7~Z%4u4Ue^2q!7s-=&9$sadQ#Rkk7G>O3_F(rmi(20$`SzPa zQys#9ymaeAx5Y;^y{>MwDIy81mq)Ii{ol)V5O}VzFRTbQ2f;0NqIJNffpe7|w8o;# zXq9ATSb6?k2jdpM+xrq%+V?2ZTj0=tK0{C*d~vmWSo(Dz*!NZ5gU*)NvV%v+p;lMTE^}-v`FXKJEm`=+H&7&u406&G1HE{i?8W znAsS7VWyB9NjnZ#AY5S+*0JXWRHe=Pp3vM;jv%CkfCz=?vo9Z9GYDZ z`egLD^QZ&RB~4y{5d8m}mqF3uz$4%w(ruFY)`kcfd)Oas`UHp4Zy;j_S6(P*$ovjc zLZkQ{q=H)U+p`7>TvAxFF7e5e*B7p!V1L-{BH=-Wx!<9~Xsl2K_?=Ohe$55N@@#8X zI1aL;Tl@=j6##WmIxkmA=>lq3xz$j4sI8K_M)gWh0P5c=2ecWd z+|w_4z0I)|M`zg~?E4KppFnVY>6AR2A)`YN%vC?LW5}o#fMgOzBdNUgt;i_(safd5GS{d5GM_kp^@SVrI;kvPm{+I&7%f=RjSF zP6%fXf!ZfwA)-DG<&YLgIicpz+y*_+H*Cnr{j`qOPQEot=@H<%QZoF`Q!}j_G`}5y zcOhhw{}p+5aFs7;?1YqX)c%C~Xq-)i){y_n0N<~KcECTZc$(pT_%yqi`DJ-*e&<;a zu71vz+J_tT-{xG`*L42^>W=YzkyACR?iljW9t#WII^DX`iQk-!hGpbH!?!xw+UV0d z-P#z?I@{V9(sW8239XOlu9&WPZbPi|;e0pn4e|UTQ2TGuLqX9j=@0pN)g^;lTCtaZ zh7Iv`NC$OU@!A$K`9Q*)JZnHzZ*H%>%M1{>zu;!1?T23c7)*cO6h~giM2~^?AT$mp|tReFo1-Df%BW zjvrfzlj1O`qHvihQD*PWevSibr#=J5FPT6@iwHa%<3`9j|I4YX(p5}q5~)-Zn5h$t zUt$6P^!k;Y4#D2ax%L@rmv*;xl|^aFcgu51+WPS|C-!eaBcJ0s z<2h#W+`D3~Q1OMyFt>bTkG{WG2yeE&vlTzrX4Yo>K#Q`C_=YA0>yc=XPg^uTe>Rz(G7SgcjQGP5=Yu?L`{=?ToB&DAAh~ zjpzZvQqzEX$nL4I6H>d7d&oRVovbp!n{0<*w^jTD;Y z*3>ZAQ{%R()O6lf)u-@Q)#>vvFc%CVsVL))o8ydJfg)-#YVbL!GbQ=x8?%=ePkU8d z6N#yQ7wf)#?W>bp9ruDKfA_-YcBnhgJTy8F$<@U2JHsl+{{r>pAnyl&oq6h!lRv?Bz;s8~B0>d66w@1v^}SR)gnLiWDbS zs{06-Ui)~NOabtzWziQ?L9KyHpo-K1O;?|26@uxdmousQAh7~bYE*_R{)Jblrj-|| z3dj5#uUG}u3Q>U~C9{Y38<)ocg$P{Xtpz#6E8X zUOa$V`@f#lcKk@67TZp@!|6^~@Pc-~-E9n#I!${00duPNj*2T>))$FM1HBec!;rxO zLYF2r;oY8E@LdmBA%WR|WjL{&^_t#Q=RK*%izaNw(=FjjQ+RLMNG7QHS3)TZVjo;B zz|DxxPzrD#@IPk(3m@5!*{j&|AMx=q579wYsyp^chAM z?v3euneh_6Cq|XF11{WDdhPk+-3ZV#W$Ghma#l}ivzSSKOv`GKz`P`4mc21v?4Rbj z*md*a>H0mPNLI0MrsGh9Cqo9=4J%d8pz+@x3w2g^j5ow?WDc`$4mfZ)?L#EKpH%@m zZ(gZ5yk$EpULyYp;P80m;I+rh#56up_0vrRQ)|@KoEapUNEGeL z$x?zP^a%U38RoMdHv;B&yXooEJ7(jo&xxHUOm(iux!o)lETAW4v@0!xBd9omh8~P9 zSzL^&DwO()3vSEXYTK$%w23~b;QwMVYz6y2tdfK9$v43bW;{!;rOGw1nTVfH#^n$TV)hKq~ArN?Vmp(F32Mgr@T zayeZJF!O#_iiNmnvXaU`yFOAB=beHgG4z-F^Z|o$U=8aHQGXh+A5_4>SK-NDg_gHi z%h++?Z>;9)86czLn;A=~+u~dmsYTV(%*R9>+up9ozTL7?wL3Rk!M~k zd6R6W#5m|gX>xDQ&@Dd`VX3_@rlYagkdz&T!3T#{aJ{g3pOKc;Gzel!0m$b-1Cs7gC-52mqo@#B`wlYTfYJ5u)l5VwM zDvC=);Y?RroCjIBNd~bvFmO>hq=xc%G+wzVV^ac(75g>uJxhm6;CNbzEwS3xvvVg=hXziB*YEV!Hq6?1L{merQAml3Njrmg6xjKnu_=D&G2M3&Erz4W#K;PGnW-~;h z&|6x2wA-#li?bTCvs&VT(oAOZeumDh`k%7CRy|~M0`EQ|=)v{!kscx~Tw4igs4jT4ByB5^%2AWM+{5p~5gs>7prel| zv%5wTC3T`MU!%uv1XI!hX_*ePIbB&%#}I{0$C1_w3YR!gS-7X8emd^2Cw+p4z#9L@ z&@Mb2H*5zZ2!ztHL#Y%^AezEwa|Zdd@j*oS=y8&-OEL$4{+ef=EZ%#p?95cl7!`mi zhKgF3Ls{~ySEpMVHf+rJceOjt;cD7de29_^AQta=6ks7rG9=PD2`ZM0?=wx~^n!wZ zRkOEFIyaCmSD)?y?XqC+Ur~SEu(R6Q`ycpeqE`Rb0ZE_GhfQy;I>G7+m+*K>)n>>)^x`-JMU%XZK58s9yphaCq(o7E1P8(@vJ zU%p_#sx=O2j8G=Fze3B=>ulbfd@!|p=OpC0UV9104*>sw!MSg0lMFKBCl^P?g!fQ# zC?GK6&vquJrQ2-Wqw4r+++enAEqH+&Z&xEYz^_~Qo5lJ4A`G(y@8?>maW?HoQ2p(w zdgVzQ04n>@z3#8Bzy#7&o;mUB>un5ESY0xIJrg{t2|R@0^_K{0nwQ)OD@)>Nat|~e z_Mh6C7sIeCnilSQvxtSkH0+zp&0}s>M&ela4){Q7bjZqCTO?>argpy=)27nj^JAm@ z{x=4%I-GuYm#_MA0-B#GnM}>-|{QUd|mAVW-e4?$^W6Puq|m{M7{{%3#spZ^(san)|-G{yYz zW|KGn3^k=mA-Qqbn4m+Ye-49BQ|$ELJBo_yryt8{nMJx&EC`Nm(lXn0e!OgqKqbJo zg*F$v!??Ux!AG7so9o3C)A=ZM5!?8>KGA4+8+?NuO$AGWenl#=Xqfw<6*n)n5hfdi1t{mu2TY_@ z6sWLoXZOrxuH2Y_a$CC}%!o@|plk+|pqy9r>jD0^`M9{UuaM?db}iTiK9f~ccy-(L zU?=!oHeP{>%=UsE+gJhzWFsC#Ic5)l4gQ->vT>e6IAxF+O&c#H;81u-yii<7-HDBQ( z0p>n~R;{vG)|gFr6*@~v<|IaQDPzOUF#~eM=+^zIlUWz^w(BdiC@$$PQ1&Go7}Lkx^F~}7_8VB z@wHK)YSOQe^v&Zlad}WK-%8&*&vu3(TR&XpixYxI7+e?iyLTHK?zN#R?a%imR+bH4 z`9cU7s;`WS<8HIb*Sb^<`Td1O`mDjqHHl7$2wASPDgQ0DLB%A8+uFZT@423RgzHbS z2iLrX^rf0lwySMzeMKY(zE#TiV{^l(TYN4!3a;;60Wt4Y%dsUFSB>D}o&USUz91eh^@!=!zuTgftLU}`!**i3*UPWW zUX^*IGos0Bn$YSG-H8-oCTZTOO)zLP0=>^ecHCeNOY6hF$!?9*GugCa(mg(9N*u!j ze(tHu=X@uK%RUapfJ6X^5E33Fd`LJHxL^X>1R!Bki7(dlMFxR;R64e$5y;SHb}`Zs`(#n!N+Gn;$q}<47a(t( ziI)Cq4Vc14K0x_YR=47>P6d7#f;@rYv(dWeBKR{Pda(bnu+{nYvAG6D!<=++F;^5M z6zORE91+d@vq7G7a7LL!vY5&n?$?kdydogqrO>Yk$ah?!#|8Rx!g@opwv3;c7#q5hSSE%KvuRAX@*pGSY=$mBq0|D85@<7zp2Z>}H1)~YDrvm| zRqw3lIISp*vS15w+uo!Mlw7feEBGT!9{ceI8R_e#S+&R4O2Mc?J*|YRACvbFCg!N# zYD|IWLjWEOxVhU;%+p1Oa1`7mU3K*H8Zv1LR2qM)>=+g=%q&Q_i5Q^? zn3{n|SWP$nYlE1T=UesrfZCZ&wMKlsARqY#<8g=KAjs7`;(%+;8jexj!(vYvPRq-k z!)NmeGN?Z3kSBBT=u{HE;s7_2i5^&-WO}az+ng|)M z8=Giq$vovO$jBlCff4yD=Stv-Rc1fswy&HowKE*q_Y8eYi}XF(J}00O4~?4KvSTup z9G~!+3T%%xGadBduo>BlkP>XkpotuP?CH%pa-38UyX}JJ-je*BrjKSp3hy>j3eaXl% zO-Qa;S%GBRi*>_^B%rZIm{)zcdGm+J5=~xi`}q40RZB&NA0jJdGu7(bKLd`_M3FqL zFz+&?k9T95A158xd$6ZpU82eR=-V!uRv`QI8%wnAa z-3bw#@pZEEmd1Afc|e^4{4wA0A~VZjSM`k2`?>j4$qNK+u?B!=0N4Y-5ddlcxCMZF z3qUKeP>Hvj2%z>txM~lJ#9r`Mv&aIm#B8z3JaN#v00DEvTElVTP}im4EMZk=Z^H~f z%)JwIn)AdJ244Kir#lp0s0`=hmPEtIdERz5!Mfcpdz?4lW_oi zSid2x-4R0B#D6~%gAKu1GUfy4OBhh+8m$`aL0iUfmpg+Rt%e+6mfjyNrnh`2STchQ z$sl8AlV)NdK{BTkR&_#}1DGTO=W_*=Eccm1F~r&w?A(BJdjsKaT_)VNJ=WNEU?yX# zw2FZ@lBy(PQD0BjfPxwf9k48K8w>U!%_24M@bWw1G8C5FLD9d9Y z8jfpvmG-*zD-H0i>MO%6%Ufs8UTy(Wrf^#7R}2+bB8XClAa=k7M%JW!t;*n68UR7t z176n%01kRs``mT~lAA!Qj+0Iito1;K4=ilTdyb5~g`E&B8w@X-3}-gO*0O%t!)2OR zH36Eahf_SLM`I(mKE>S>*p!z;0Ej*U1r-BZkrp%(9azt$o^9BvPQH5t@N@;B>~ zp__pNGP8y`!=}8PIB-hPu~ETRM^0wf7@PwFLIp=uT*Dq&0BEJjHe1nXNBVfsS8(SG z72Lf8=!Xmx-YX#vj-Gt9Y`I1j(`YRK{SOHcbRd~Q z55d|3czWWZ5D)-%?gH_hPfs8VaWb}u>-5-2gwZ4EMZ3eQWgy z!e^Lk<9x5yi&{7&1{L{vgd`79A$35)9`M3IFX1UjB+^&-W>h*9O5Qqh6nqI;bOFI- zCd>BEGeQgC9AMcYEWecz5E2?LD1(9oex1NW%1C`?AhB80v)bbdV)F?j3`Hw3?S=)z zs>_sl;8>=doz$@C6n7bV1|eq%^XYMZC1e@B>i6xVJg>E>@s@Vx%7TQeg_75Y8rF~% zD4ecj+yL@TC_IIpCjczQ{G`LCpQ%yat>RJ+5KP{)hTQM_tv;YBz|1=ZK>&Fl3&@~T zExH7qQPLYcZly+Xgm&lPta;EQDMT?Hw;U&kTq_RFvE1?c^|6M|%O8jb$`zlo($_ zr}G9hGVssc+67ekitU<8FUc9~-_-&E95PY3Xl>aYpk4$3G6djjvWzI*gnPL?xV=sbGJqXMD^2Bflul{23 zqb}A&QUv~*2>U;?fD_v=B|R;4o4hJR@YG5!px;wjgANoG`GL8HNB4D5;D26l07qtoJn9*>AV@A$naENKb;q9r*r8`Z!RI8cLw0OyGQV{J8y?`+~3}?mEVB^$2}D# zOJ56af-tgKod&HNgu|uD4=6KUo zUw*RAz;(yJxPZ}^JwwvH1tig&>1xiy8TZhaIWC=0JUIA6YC=y)Y3qSZaBxxwCy37T z47TX@9`(6(ll840wfnLXJhuS34T0zR-CU^)l5q16&ei#LQIk(Vi@;A20f@H}*`^1s z`kKhp*VSL20ZyPEG@XEd{j*0i<3vnHFzrGS)Tg9e(Z}8KHO|n)x$OquDek|Ne}o3@ zR)zX!F$@Xe@*+Da6VRy0x z%o4;cX)_m}E)bLCrd5Nu`d8=aqkN+3n@yFvk>?UtD#%LsNGr;5DP+hjN%Z_CY*E|2 zS;nd6o3C)?TQKh7h>E*4mqF`8{#hA9Q)SyPtV*Q5`LV?2f(|C0EBqwWu9b!ah90ez zCvjZ`No)#3{vFpJ9TtljR(i_vU|6jB6JurbmM*VYOis?k>2OHAYsmUG9%>DW<0+3c9r&v0RxLL*d2F_R>tAMfM!;WXmkvs8e$r3qsRoRR z7wYTV^9%g1{72MaL0}$NYwf>BaBygc!Pk5vTX68n-IBw8%Stvk3yAP95JVd66}n;% zAvh}5Pm|5LjI*w-j0;f)qmG@G0JkQTgXoMJ_WMPjs1aPNdGsP{q_@h!BX329AG@=8 zT*PwU`Ja{sE=k?@TpSAeueYDR*L`$?$Xvl5)L|X;U++8;6mCAOG!m80H9M2`7rYyX66n((Nq+f3? z3iz{~jLwvoYUOZ(6qU9#1vrG*nQ*zb*;NrQGTFga>!^D}4)-0(Z*AS>ylMxgbRPT@ zbzSGVjGGRH>uUs4kad{+rl0l=-(1dc0#MoE=DXc|#?P9UT)5gmcGo0*w?p~2?a%oM zk=IlYLt7WkB|(-3#qS$K4-J}GTimNSwmsA*1=@ceSC&4cl9;(Fq?cnCdUe`?njxj8 zeYJ^uV;He)R*|`WmL$JfcX?@Q?i`1fv}vH3cd)FO?o`{I3aC#$ra2`w@|5XLEx2Yt zH>X?>|AD>YQu*j<9FLMuwz1WYJzNrbaGB~*3>h-yzMa1O7x|x-e5?)g%v1hYObjx1 z3o&cn)kwe8B=wW1%{kw^ex3nkVi0t4|2T>`q6>cOMAso7O$NIo!sA?EXaOImn47PBDB@+q-*i3zmi(IS0e?b z&HuF2B`&cOaa1by3coaKim_6cey@POkXL?taikm$ur-k+6rbr zU>l^`3&Yxvd7lnLy>QMW5o^INFfW&+bYEngsIBClvjvk}|J#66-ort}aevxKyT;%~ ziV#&N^_&%w2}**O84k{M`h17FKiQ*4q9ka2&I2wTeE4#1bDjjZjlp<}P8MisxnJJO z#B?Z$_zM82_`*4J1+TqGZ`Oo)6f zXH1D2LL|;d8Kz9?z0xsTO5%T{eu2U?P=LRr7!dEX_s&$!N{EqO+NU|`TBe0XRkY%7 z^4V&iI93`~d&5Qi8=kB7hzt3Y=d0a9EbkKWoaypTa}TI?iu338hDiZ}>3Mpu9s_y- zNNG<11tU)rZxUk&NnzM6imZYQ|}exP3!0JQoU*UJoU*bQ~%6A z*9fTEP^U5wRInP*=Zx8(#le+VFE=nep0Lrv)WD)!V#oYGQO4{uCv!RMNa-7iA(-c~ zGT>{$UJ;2S&a{iqlh{Gs(m^3G6+LsH;%i({k%I=4q&`3LZK8~G3X|o+ILe}UT{)FU zgvbtkbe5{|8z}%M|5aWcUSeApli0z^jnYAzxZhh0BfaoO95z%Giy)_)5)l-+sOt-2 zms@$7*ZQOpVxclQ2#w7N5>fe3+;N5PnCFnj!_PX=$||Yq5|1RrUlL zLc;&4A}3;dNz4Ht&y>y432>y|z5}WT3MUF22!En;QL7y?@|bm4`D}K8UY*1k;4BnY zah(@~$3cP02F^0EZL`o3R!>jPH!ytvy(VXq6uacK(4L%CaLeFTt{NM{@-b%mvXF*y zo0n(fLgMGId8X!lT|i=C*`-9?Ej&*j;-1A_xAuK>jCN{G!QwB6CTGExtfJQEF`TQj za5E!AM!nFgdw>z7`2ke8HNF7;&z+oAA1y1lGCMr5P8Z#@QNJw`gE{oa9=?R}?zVK;#yf~B;Fz)9 z6s#D9ulP<$dhS8c4IVu=uzzSsarDe}xJKwe*v&r&VZoP|KAeIKG6y$Iju$VVV3I2! z1b;91#qjNLq@j7mdO*T)$KGb;nTXo>Qo-8;4wJ%Dos;ngAaZt{P#^9Q)Q5e7`f!J! zeqE0qRvv8JB=lQp>a_6i4)pjhJE=vaa?SKRGbuFPlT#}*YDXl?uWm|!xe}9`!H$wX zwoU^WrK5?tfU^k()kM@pz;jJ?UxJ9C6}Cz1nf#JefuNI{EQ)BsyYGWU%{aoch>9g8 zB|qt@)Ya>3%8k;OYO7>VP?*y3P_*r>BqGz6L5jXWY%->V@lC#FXP8)>0hf8R=CWYa zEXTNbI@4&_QEhZGB~>C0+O)phXDfDdLr0fOWJegHiW}pZarsE;P0U~I>0S?1Sx(8! zPzrnDJRh_|CEKs}|M01rn{T*rs$4Yk7o~7wcHG*HTj2%}s_`<_)<~^9R@f)1^O*;? z2jrTSW8=8fYjO{Bx~J}XidGeQJDy(`Wfl;zVqdEac`A`u%R@SU&h5|Vbsw$F(B^F! z9}caL_*HH6JV>uRdwSJzTXf6YeBp5x@lNwIXIa8~gDduJg>U9l#vwZtHxRcoUW3Xk zEtDd8Y%Qkw4W@%rq}kmLA{o49CBe_6035TtjLex8TyQDi)q#}tCG9~^>aWR;kHy8E zMvmOL$;GCJWp|CV_9|jd8`@nXp3s+XrDUL*p7b@ogkX|N&5baOJQ#%-orht86 z{;_86h$BEIN8X&@SsmLi00!aNe`UpjW6J^|Qw0HFp1icA|5||{w^_ud`qcaLuPtLb%;fAakmOm)PrI%44N@m_O8X8s$jNR9_jYJ?mLAyQHI(NEbm;5 z*WP1S_O7{7;VQVU6Hu@m`!sEKk>dhh$J(1!W0CBMh>5rDMqT72nJ z)cirFnLX4noPs>ffU?nqf_yCAZ*z;083D+go??7{yz#!Xr75EQ0a}nwSlhf6oxMWv zbW0*|+R6;x!Mk%2D@AM8#+P0wkEDtuPI0%BDBqnx|1b19%vrQ?ybRNYL#@Dl5hvil zL3cWqJqRDz30mHa^NL(l4(ru^?Di8>Oa|ol*A)F<;w9ZitPN3PgrE7 zUR|#GD;?iO!WloN^@)rpa_$U+h@}~kbgbz$N6eR0IKHCJ1*p+ex8fn2TwjofQqm9s)#LmRWs{ig^wahg|}-;3HvqrYbkZm5-kLlm?`>Q4c!3qjo` zhA=U?l$lV=y|_rrkJ6E$a*27-9(VgNimwK2058Xd%H_V#kIO#`8h)FvSN?H&=B>(; z90>Z|(=q{oOd1KfGXZ9y`l0QYA*X4HO#A<*-!?8 zcCikxAeS(MK*A&IQE)SV_hXzFc{O1&d8ds#2^g|Wv=liKks%f-f*B)4`-GW#Rw5BR z<${M^8qJZ5gj^)#kgk#!LM78N?l1k6C%XQ7NjAIrkA&M=1O6Ushl%PDf#Z@HjSX1K zNMcitXP@pyy4bn#b=Zs4_bbR!R(-wswvx}sRe-7%Ox7ykG6*Z4gQ&8(j)U^U_mRqn ztijD>TGdD*)nuZfkhzA^85W?DX2++M2z^$G$mbQrBz|lY74Qb1(#PQ1j8|ch)54P8 z^V&>BApP#i8$80l;rI8jjBQQQhtB}G^}0X0*kxOWU&M&q-q>1o*c3C9;A4BQpOMYBdpsm}|MzSa_|(QY{=3tNJA(gWy< z&}ZFF4OUSoi0ot^qi%I5Nu;tA{B{DByy1($+N{Ig@S=4n_&?i zU;XRXPZD0ctM))&U+!l->oV$@U3jKUw3@H9Eug(>E*w_A4>?3sgesKJbg4~+v_|hd z3>?b)LB@CxoF{mXN#P^ft`-yA3p~aw`&rIZChnqjc}zHNE$nw6e>;9-6jg-|huFC72YruES+OwL1feUmZbz`)Ym@K%WjY zYfrKEG;3}gyy4*b*9~_Ycoh6#*7)0Cr&O9kP=iU!R&dzlziKbIg#Vf}d;c9HZnE0^gadqIZjoVRK~cY0DSE0dld}>ka-v1Zgq3@TQYh zSTUEUS-hRmrC3e?%$QRbD|9Dm{Y3a%3 zEtcgIU(2d)+MTZMp58vi&3;+=yn&koMvhgC&M&>gE}Zrn{d(@c(5H>VMTrz4{Px@Y zWX%3SGu7pK>*8(fuwRDyDn=}ZQw&AK25^W_beIcUw1vs)u!JGEpqE2i0RpC?AlN1h zmcs9_G5m%l&@fsse3aQ}Q`51)o)$we1gJcMg~n9h{#VhfWBH4QEY8NYKRzgu_Ffg^ z?S-dH62>YpCB$g&s9f0tc4)e8tQ&mv=Bmu#Rh%fZQg`&1K6sV0;FUdH{Dr|GlxsT{ z#ca^q?PXQ)m)`K6J#gAToBV}g037ewC}v8)iw4T?bqLz_Y5u}sk;&1Hjbqm73TrC< zr3KeywmL41=7q!T?N}zQ@sAUP73Kf22ZH8ol$(R5C$*Ws_^%ld%kho{((3N#Y=?J4 zwtWq5fef1D1aOb46XomHAdjWpn;gT8`ZL&LQO1TcjRt%S7Wn68FAO?l_{@$?q)Fo= zj`SIpS%UBXZX14<4M(njgE_v00~mq4IT$$di=!S{&dDifv_X zDAd^bAP8O@`U*b##oEP|#@F%O4K-BztQWTNGIyYa{TBuWe{Ss9U8jul9rP^>kxe>o*YkDYSMpTEM?El{#vDO8p&d?J$y259n1ZrY$i6Y{Ri%m-D#qx?$Fxh6Rf(GL%_s-NqN` z2M!#!MnEMR3F@eW7PU~K#~Sl-4I&TlJKAxr4X8}L=v?30^jJH&Lr(0)hbn#MdE z#Ts!hsQ?JA^(;^e9xy?Y4LfK zm?z9+j^*ZhI~N)9Z9;lGWj1cKlA~sLPA9u|MD)Uc;mtgstSfz}w=ptx?D`M)uIKz3=mbyFZx43~f`o#?2ab+&-Q4@#v5uyn zA2@0c_lkcZE3N!MP^x3;^>7IA%|x@w0qCM12)sIuzKO#N$^OOT`}{6X%m>qGDS~TZ zXT?u$N5FSplA?{rQ<7Mz5f^Z!QH#|i8EdXwP|)9#cDw8Kk?X}V+lKVYTo;%E#-$El zC9c#5J;DPl396%5Uk0oRl>9lWP-ZaPD=(Tdy|!%n2Mh6UV|FWk4R1*5&!9!UFOX`i zes1ZRpO_y>l+FH`jPuVjq|g5ZN?XbB?eA9QAD#&T*|R;V$kiMo3C^`{Vv#30fk=i+ zx0Ty=R^v%THbShAa7996h~3EtUX;K@A_sF2X$hebCDA_P5gM{V6Tx+bb9l)1GmJP# z2UExPY8z`lvcT^GRhm7d+%AfK|-IWWgBaBe%{AXfxc2l8gZq{AXaO}3&E673( z&rHW&MFSMF>$68FMng(OH0$l8YpU(y@`2c&Y>kg0dE2WBN9T+jakM;dr*%v(o%Y33 z0Xo8uT|+uckE?yv-8Dru6C)QjUl-!QN!6rGcA|}mQf$|l;aY~0%T3vlJ5^sxHv9bv zIELL1Q^?%jN&;sEZabs3ZU`Sk6Ws2c3Rw8^G&`R?o~I^QSWMR6M0wrAI>8vxi%nF~ z@x6y5F7a9Qsm=xzob@P}&{yDW*MTz+z=$0MG8aH&Z5WsX7i+XAOlAMw|H8I4w;T=%rUadlJ3{zO4&rOm z*w5o9JaVUk*P2sLmo*_#NAhLn~vKT*7Y6JID)z;<+1j z>td1-e{;!Q{(>Fft^)-?z2kyBv$<<2Vnu7A(EVzqdzJKiITKHR)sySy6HQQ$2fFdqG%{aQGQ2 zeWUlb%Jkl|=94`Bj*|%68CX-e^RUlf$@{fJiJpsYvq?6Kr8?{rA4UCKrE&y)7L;xO zpMZ*sb`ZQ8IQInKCiC_z`m9^~^t}ZY{HzQ3_OTB*>oR415)qPhaWMV*OQXrAB*@JS z-LryYDql~qvlsz4Uhu{3lU7wjs0O;K$ipNYo37dLdEgqPCM){Df!j-IQx7 zDCIibphXO`2(MvzGAY&C{HNLkQ^EzqXi1vhz2OgSL8V+_MIM1~Y0 z(vYTWY#oI;?@+Yuo`8xC^g?wqgsR*+ zkt5o%Z2{lII5YzL5O)#@huUI%Yk$>`8!=)s);!X<-!r#;bMXGO{uucY1JOf)wp}=* zp)oVB;I{ePgxeYu)1y_uRz34E5_^;Wmnfv*mqbr~ni8=xz~K^+`hcy(Rt1e5Ksy_Q&(dI6AFBbhPjBq%$1e?r4wuA$*clWXf}XVfL@YaWgfHncn-wv zpVypei@qxQX2Kl}Lh!zW(cXuEkw`|s1}}oMp7$2*!jg)uMSx8gmY$7}T4d4lswXy6 z9qrc~4ur${c{rx!4~GB|$(VLWMteD$G~mb9x6+hUklwJSjnDPm0e)I?s43i)lbI-l z>J?qEt#JbPrBY1n@qd(ItLE(Lg1}zwbeG75%q(I0REJL`fwN88vw3l9OAv%w$GHSOkBKAjrEZF1? zUbwQPS_p_u-r43q%aC`e0G&${&HuBDA?>H*;sEp}&3gQLK#CGQE?@LTk1Dq7!8!!e zTs&GZXhLyaSpFvoLBjei0Ru^c!N#x#MjlWF`sY7l1KTK$m!rSgO{vMM%;8a2MQ3Qc6Dj8Ce*Un-jhwHq%c z4*K4;)$ub7zn;x*A#{CW`09|-Sg~{S?w#;-9T2@1XP{z(h-8fEkD9MQ<`J0RYZI(R zL9wDCYgmyBX`FZ^6!+Qkx`RWj5zUp-#i`w?gdU}%GA_gh0>H*wEX{5jIF?O8qBuWi zvTsnlAbKGRh`(@#I3lWlNhdo3;e<(!iwjr8UFM6#s95^}kq5%6Ah{v`2+?ncG=)>G zO^CHK{Y3cb*AZ1EZeSwx0iT7Z*0@GOOn23L$i36c>Rc1SnlF;-uR zJ$ZD3oqv!<0rC435s0Bvq)R|(0;gaIs8qr@Vc_(D0tE{c0wAduDbOi;pJ|9xI#W{r z9e_i6Fpae_TW}kCUz}8G`~+i`=uwmFyCatBA;A$<#!hjRZ7K5N9gDBi9VY z&>!*ui^N;(MsBLplP}#`&SURi0}h z7-xoAJ5ij(>i4rGJvvZ*u4zFqOlP{BCQ1Ig3$$cZsWnzXDI~usUYNzQH2p`h`3weg zZ=}4gf)f*Xy+U%Lzj**Y*q@qq?5P(Qqaq8OmSPcE;Phcc+(WOAAhM+llIR%jTOIPb zGz~*QqLugyOu50a;i6!umqG%jh_ZLeBa8I1OKh=LA)-p6VXp$%z4&@b|L~XDr~dL< zSa)BL-v0}T+3IK^RSD!rUobC z@k_~ytO!b9~Ty;Y|3t7dLjF zfTAFKu?N(Oap}rpCkV1CVZI+)AA!g~9Df0ql?#0xc z@6A4>p-0b}|2&ngKbKGZyIrF!*YBRO-QQP<_`KzjNw;x0P+_W4#TeiVg^D!BjcUjH z!zzC4!s8T20F}Yg%)BA#fo@GJOKN$9yVd9KDCM7z3cVKan;Q^WbF{0lKBZCk9`hsnUx9n`w%%+{=87!rllYAQ=M)RSo3cB4Drqc{I72` zE)sWnYTjwY{{OQE!sV63xv}L{h<o7 zF@5zYh*31Gd)(|Xl|JWsYFGy7bdQ9+NYIYHm?EUb7@m^8(UNSYfsFU}aLp)Ckrfib z4?K0>ZyetT?Kw!`V(89nHSg~kFiPdJTY!B0QzRh&@CW{HEs^|UPO|a4BH&d!i2yuK z2gL|8Evq&^0JQoGdt7{vrHfI%b z{pK*Yt2*Jl?RqrNS&K}Psi!=cdeVb_wC-K}PPQv%KX4m7C2juE8)AynkY{TeyqNJE z3qB@q7?{j0n3Jz`80gfo%ne?bB4!{$`t6`mI10uHM_l-j_XU>5Vik81pq0bi7kRLD zm{}0oeK5rvtjshc{>X-V=;qo$HO!evMythQu-#O7T6h;}DSk}drTHv+24gZx)}#zF zLmcSs$?%L%FLIs^{dRVcGp97|3Km>8lY!g2uM-VePOBTXTgy9XkPD|dQyGM+(-NM~ zEUO)*Z06QfcPI6K?a-QSCoU3!Oc4uHL}H3qnIbl(h@B}#@qWH)lsWz0d^c6WNj3Cf zUPwMa$sgi&dmX=X#~=L3dk*}?Ee|{fgPV^a4S+EB(%H>R+@u@^!juB08Dss+7Ir4; zY6IR0OjZs9uo^$1q4{w|SUbkxzcZLh&_2a?yHgL$TD9C!^2gM3Qwe&_sVCuV9>>fb zUtVYy*^5P!yxrp(p9V6uafbCi+4($YnY~FB#PI#A)0-fMH`Cwg%&5GNqdng*2|zCf z7#WLpf1dz)9`H0UfNx3Hr3f3iVolD3 zl)MX;q(xw29yrqAj-9S5eR!ubylik-R5^?Sel35Oo=ywe9bIPfI1zhh~!E!HvnW~+= zF2-|(`%50`OnUy4`jaIB=WnQn1NPW@#)C1IOWa7{ez_FDWJ= zF`5fpUJ?k=i7EJq_!2Q*%7zv7E7IDjA5lMMG=tVI{%&NI?{^)EsX8#!DlmwHn&S7G zf!wx(0~8huu2?9bUP#mniFzTSU!7$8w=|H@&l#cO?)Ko`z+OAmI$S&LorW`iF?TA% ze%|n0b%1uB3+9vQ+TozkXQr%_{^*n>lt%bkw zTuSFPgL|xR&swGLr<*QKIlh-q+60ZrnFIF4m5Bc4c(lXohy>Y7-i`1i=q=?z!cTN3OWk z&0O$4W=OesogStfO4%fvvL)-XAuFhjyKp-{{M{i7zKEIwkBQ?S1M<$R7esomLz7}V zU$Y$FYK#QyzVSkCTV~zMO>X{B7j*AOJJY^qjP8W=m3*c-=Cy7`Yn7u)X?`h5YBb2H zW_7``e}bFL@>T+sePsSJR_fNa(=mXI`<%JA%b@R1y7SI*ZJ8@|PW;;3uHX1>7@TS9 z%R&nM&T~jz=|EOO9+p9qswIJDirE674Vq`tVlhX$ZBm=Uy#1J#W(;AL)eM_yxCXlm z9HtmelGXS5%DM*)%{!ZOYgX4$_l|h<7y4$fzT(+8yt-A}0q+jEOixpuGJ>u)+vy;v znwD}RCXu`MS8H3^pElc16owsw(}$Pc^DoC!PX3%cIW$7GBip=i4fOqcxGzu+#a!FA zqj4Mj!|mk-@Rz>$qnrh&tRLJLs2#`Q8myyZ&rnpbVOMZrff;y5{!s3}E^53ycmSy+CONN88p~IhYR-~v2Gd4qp(e-xTZN~*SgpBTK3*%!|(((s?=1`F(wbMyyKRFI*qKTV;;el zf#Lm@h22m{-)fP5QlR12>-*&Z{zg6D-Ki5l+9A%pA8ixoZbmup*tUPGOZtNX=k=cr z?wQx)j83KHKnO5D8`8@H*#4`U!ae-*HooNwKTl8Ul#1(+hR6P|{>X{H*e4;`41B^j z?ttX|mjGYSr?6A}zHfgq4yteL_`cByRn)7Xk2EgD74s&cZfi;get4UoyNBdYUOS>Y z27^zy=mRf)tBXrzbf+_|w-<;3l^D;%j`xM{Z}NDzdh|C?&_UtvpcHhKi{C+MX#Eb# zK=i7uK4D|Wq2CepP%`-!bofyi8lziFo6(q8BL7`bo81KcT4<&n140ZqfL|hg{l~~7 zn323dG*Gpu`(LdVSlqYpqCTC6_HQ5(hC;b#yEO|vLAjU0EWRziLamEm<3uBuB0-qS z@&_)|R!Lp1dL<3ix?+416swL)y=%%GC{9hk+@bBJvpf$Z8FAE!(F@slCwJ&2{=gT; zN%nvF>FfPt4P6fwpmU&#+_EMfk_OtX>+O#2f_W#!+wfF7ijj=5J)r}UBU3pu1&LFu zu+FGTnksa4+b1YfaB&!p^ws1{1jP{om|jBR{!v%=jnp*j?`1*}DkE_Sy>zfWn9tzB8$RgvkU2k zXT?i9Hb^#f$$~Kb`3YBDp!dR*?AUuT1M)7JOXdjOGL)Cr$6vc3nCExw1E~*pv}flH z52OFzdbXv+Wdlbaeh#jcdZnVJJb4+TrN!?8V%>vJ_XJT}6XGhU$|I%^6LvmE>~bZ# zHbQRIhR978h@!0x8?SG@W8XS(^tPbinxS}75aA2P2XFW2@JQux{H>b9f(hb3lfBKc za)e&n)b>>CQ-uv9j~!$hS z`}&KCXHOXd>Q2ioft6h4)!ncAq{hhfi!E+KnNNvIZfdnFET*Wf$WVJRLLDC?j0~oY zxfp<2L0}a7-fqk2#vmiDjVnaQ@7#m)j`>S)3Gj`L&Iw%05}&X&Rja1^s8M=YQmGe9|EfVC;BU~0BzzCKt!+IB!# zKiY9X*m_+@s{ud_=mnHslF)7V6s%FrCi)%FEU$PrWWe0>N97%FV&+nypsyLP8^WP1 zuLv{=UW~LN?Q?V-T<74f+X&B$rmx^*YYFl;nST&6fD~V3bm>uS3`chb-Nelt#@(V0 zO0-w@1_pLXBieRD1uXzEK+eCujwWA216EUJiMg^Pe$%$+-Ue2eE=qSFB?kjk4i!d2 zwSidDhjzZawnuM_&X2dx$T)w$TY1@VS71PgVD7*|4F7dGGEj~NJ}%`YU2{}Q53WVL z9?YmQ`;G!_V?-9#LTLYVFk-Jh4u(V$chloSH%zC=XKrZ4Ky3;)bwxDN9%Ri4SL046 zg@bflMl<&qalFQLh}c4SYyVy6tPt5wjZTXVkK^VxA= z#C{#O@{lpmUwT>v6p^KivvrZJ7jYxN@>+sG?dR`n95o}AxTs{*v;3NdZif|4 zt9}0@$OI~0+xMz$)^>}uiYM54&mpnhu!h$5oD=<_m40Qsp*^q>TU^oKq_zi^QU>hg z5@+8U^cSi1Oy`g$6!%>b>LT>;OVIsM>_UgBm$KV`(=8K`g>(0%(_2zvw{hkFaWf5S zcj0Z5oN9KV;ayubrdjD?2Vp6(EmY;Y3R+TRRe?b;D1vFjiKPer8N{JjPH65ovK!$FqT~IeXmnChj%r#pfpx?S-dudY5tt;20n*TfyI86W1Hke^~-QLX@Ogf+3JX(QRe+lT)ccUi~3CYVpzxxut0f6k@E5r z-q8y)@|;|QV>BLjp-?xwHDii^$Cs@u7bkOEj7%3#<~Z(N3BGu3J1g38s)^NiQ+hXl zZ87_fT>cMqo)nEG4M^v&g^=JF&7jdsGaIRF;xN#zPWmM|t&k0+%6rug%^n>NGmLKa zvB1tw^`2j`_d*A+N{n4i-A_CJ^WblPeb@iLcWL~S>pyaP0y*L>N$jE|--qBP@BdFr z7%_Bp6Ujx9S1`A|`Ch(r6{q=QXN8WLae2{{8`&|lb23bqU@w3&`}66L%v zB6Qk#<%J)DlES#C;W$tnhY7~*+6^4k8C42Xzw8K(i7}~Ndx43A?|0Q@yuagBm*w~W zgs;kvg1orTs2qFUfkkxTz1OTzm-B!3e^@hme*o_V!b66GKFf^!*yFu_G4?Bw?DD-0yHHh3inQV3j;6S$%zv+IBtL0)0M6Gs|wD6 zt+O4hh1v`;=yN>lZcu*d{T(bhT%v518e-yu9Tav@U$@M+eZClI!@B-eBKEY(C{|Gy zsqD*cHHcq`DHAx0d81gY=)lRu=B%+RxL)mLiI`?7lr!QiSsVB%#L1J)%UF7VXDTW3V_0Oq-Q z|Cc}ddk;kVrp;%)N$}lN0D-28z7+AQdmeMS2uT_Q){T#jI96qpmC3JKSn&0f{+L{L z@Hq*F&&u8}Uz4)587p29o5}f=vNW(co)B%ji@>wjf?||&N zC_Le=Gk>CVowFM#d^lTY9@1ljh{8wU+v<@FsJdIW&O;y+E&}2B9YX3e zENg$Jf1sOUonD*&((`W6QEj6y3ai^_ddQmM7SAFnzti{M%KcdQdk zFZu&YwGbJPRSq{jyp)IgAv?R!ya{i@ zM9GaN!hr$UI+Buy$yn{i%?zVWfL_1o^0+0wLx*994>Q=X^SGBO*2bvcuTuauj=ff1 z^@VJO;I@OH372&Sz+9MEaBDsF9JFy@x&$l`ZnyU_wIvlyxWc$Zn0gl^v4SK~kn8{? zfr2DdkVJ}*4D>DV1HJ>kjFPYT3izt8fv@=n4p{e}i|9vg8G~COpg8tuT$Jga3$09{>FHmzy zaf^gpYc!N(sK?;9+r4H{DOPavLPy(i*f&|I+a1<1?y&KG-BpJsr^6|{tl19=kY?um zO|R@JJgzmNHI)|k!JrERwg*u!igIKkKrK?HGy3v4PVA2P$#Q7Nv*%3&f`l;u^TGhSAgW^KBnn`5vfKuXZlvv#?i?gI@PXl%y?*q*|YSSr$TL}t{7Ds$>14Gg!KUoE5@ zS_K9Wr&f{S|CT5)H$lDe{U?Z2q|R9k!Q<)fG;X{?J7#4Xv% z=t~UDO%O7dIe3P_;vV64HO#UJn8F@2MtFqB`AkejT*$>`Op}{bPH56}Y524)_l@C- zNbfv5ktC8n%-Mz__-YS$(|RMCs?TB~r5SE+0;&Y6+)WYVhV2M7*9|Xvz#I2qjQws<5%9-EiWfr7Mrbp)R)LQ+^;S(~zLRyV3Z?v*bug zc$w1&>{$F>uGSjeG((nC=*z)sz0>$Wit{}WE>F{9NeFoEo;#yAqve$HR?}DhegIb6 zd;k5^e3xsMBcZ6v%1l3^5sf<4qG-#S_or{*BKqU6WDIVBj05e-2f9|v@7L)BshacA zvoTziX!OZ3>#D`S`g^DCThj{YR9EjnYO>zpEqVm zd~^wLD504@raexzzO5c|E&Un)OQ-5@D~{buLvw^v&Se6=0grpiBQMAGmibr`ig3v^ zt-p{qU+7tQD*3FF%_dyqT2+gjV`_eFK|b(QNl=|51ik_HGS%#jUaOM*Uxo9~a_#&1 z^V6UHaikOBAOFb@mSms!)3@eeH(vGcKJvj#dZk_+Yv}e9XEongJQeT*_=u;o6&RYF983=O3S_*uwC@JIG!Q#fB~{OBy`lDxJFAAX9ZcCKpyvht z+KC1AsP4zhvG1xS^*YRZwqD6R)Ojc!8UVVif##j#3>F@7QJM{$yI200rW1}{`gVd7 z1}qa36QJG=23M^8BEB^2&W;R_N-8RDUnf;RTnxXDpR6XMZK!~l@mK$ zQl4Iw;IurNR!8^LM|prU-E-M*JW(0by?-DM?M#D&IX5xh>#beeJLjME7DDOP^q$-pSrwlbPA@kz15 zxr&ddCb`UUHr0759~*^x3Rx?8-{*QR;1KjF&W~F1I0!bE%ljK4X4ZF0aTc>Imkbrk za@82e>2`uA_iC}eVEJi6AP^Pb9Uic*94_nNnbQkwlOKO~oHy~OC+-{^jIYSs+mpq#>rSt`3>u8H|90N+lt~0HU8#bFAI=@Mj0F;-V0eq&o z^E`;1TlJAEgjC~4mLczO+@rlxC_N8l9``#3I1vJ2PQ!u*CDmC|iS;u*5?CnC$92Rw z1;{pt8X)Y7!l%ZUd}4M{ftWA!{RqM!24N%%5%Q}M<#mB`S6~FrLHHdC8=bJwdL~UU zzU`_9X*ko-Nlmm#77_(`{$i;VEkTNv+fc>MLH>=*>10Z#B-}||v=xB3W71{oOFXc2 zB_URi)hl(O3N_J-Wsh%w(Yd&W&Sa&cPE{yJJJLxH(KCFb_g2vb)L%2c=zKXQK=A)t zT=kJlPV-&V$i|5;hSSskhnXGmsi9jM8Twh#FqY@V*|dqq=Upwahw^c{c}VC77Oy%+ z{{UB}7sMk<5Xq&bOA%j)S^K&e0RCyb{LVzUOBDAbLj-F-${={$kD23+_k}%Rzurpr z79p+&?#lQ=@jh-}`)*6&#FTI<&Fj+R!F`>m?Gu!n)6bYhYtnm7zc4bzC3poO;FoZNd#G)@B&AT`?_xPPCSzTR(|ThxEo&_3@qef;)mm>QE(KL z4#+3-<$7HW$}a%?KA>L&`TxQBB`SVD+x`HuKgh8^gys)p_#?RfD4t&?@W-m?Q-2)N zpMdfw0sa)wp9c9eaDGC?udwY`ktZDVGjSz8-cjST-p~<2_&&!@X*NNAR>y-;Mx%dl zRF@}We(wD}Sjpbgj5up?bVrO|GWq+NN7k|(WXx|+?zC#>Yl*mcE^)(ylcjukA)Ke9 zx?uFW6o+;0_p3`N3K7ec;l@XsarG3q_;LD%`=OAstz+<^RVD=0{{;aSkP)=Z-VQN z>?~6Py1bgfG!0E~9sQ_xBz3t~A#4*O<;d$XXL2GV333tt*R~MRx z6wjH`-b{^UO41$NGvLJdF5|{0^O-}%vM<^v-@?*4rs&(hu4qzOn2Hpnx4MSMfqpch zb-1oME#=2HSTnC;Ec524Z>49fSFbn{?9D2bD!#oc{Zs#tz+TPw?K7#cqVxWHPf>1) z_uG5stA-ASvAINd?0Q5Qt~329#X!6x>YVzA_m(DmS&|u2Mj}%dLmNH0u{N-b_eF@s zfJsC-N2XdzrrZvp|9@R)#5&i)e5j;=X~%(ZW=ga_2yL-1QY?DTBkh)O5wW}2KYF6f zz@Qb zIgS<^D-=-|13(dPQ2|Hl&$P)hDvMGRKN|jn$p_K@Hr3TBPBc9X3QUr-MC1>bk}Uk@ zm47sV+Pr3C^s{JHfld>jSZp5FBG?M*jmWRTswJFAc)TvRqLU5EjYJ>JShd>b$Bl~S^mrL-vd90)0DLzk%-d{M_B{FAUGaI0B&sf^>(i%_5n;Cp z(v_Ex|1EaEjx%bg_?|%<9SH^k=0hZ1bYLU(VjH-~bWXvu(3nxDbX*Xu4i9u_A-+s3 z77#VE7Tu=GXOSZfyrG+EE5ErGgXwl@Tx-wmIQH77Pu}Y zoo7=b+EFQHIlmhhYd2TFzVdD&WWf)zAu&@eR7{M-Q^8VHBQd;$FGylEdz;X9$C|be z=wm3LkY1FP_y25khhhDTeEN>RChm-+3({Va^_sl56bp2bvQVnRsf(cLE^RS%#nYF> zP%2{?Ol32d%ThjTMQoKisDiy}j_StwsKz;r9bxegMF0vQa(WgiXkQ|HGs1*d;Bv1Z z{=OMCihD2Nur)8pI0KHtcYCK$3>lovJ+`u?r!O2@^k)zb$3&&!{(?b*sO0nTOZqc_ z!{+ETMLLb}299ODbC|p18hFS|CQj)2_Odr|4++hrY0$q&qK+`erw>i#F|*F74Y7Fm zLybXQ(=~JXY@5`+E5+ADAlcb^?(?f64e-)h@S3+5{Np?#)RXd7f8UX z_Ooi!wf-YVN2q^l8aM;MN=lV{GXH~bdqu$D4s2qUKg@*^D}NJyZpRRHD{9ow**OW( z-L#9Qnm3zb=cm?eTw1afjq+?H(wcb#;&7w@+?t5+?4RqHXq`TAPtiJ5w4!jhTKZ@?#66*r?|H*2n&8DzoSOT zl6(Z>Wb^c0vl~-WXY21yZvH?2^I+@04~Q`$jm^r_=DuB}O+MqB*x4fa{Q2yun@Zb;T@K?rx!v5M;2V5f zXaE2>IM#`4MD zKU^lGnaS?q1Z$twkUDA9{3?PGDH}3*FlJ{LsmWY#bTOx;^NbzHrlxGi39VMWq$57V zzN`*)Sy#3APFHcPg^1dX+NoOC?$hoeuin~*Xush2o_D*Sa@qBt+kXmcCw;YB+vCoL z{QslLi!c35OmvT)Fvy&JH@h(1a=pK87{R|djsFfOgMOiFP@Kb7gHKDbxJf>Lf)nrM zlk4Uad@46Yza`DLt_<&c*pn&qp`Nu)Wk{o7xO&;0vMSF!nDc$b6&1%TuCF*%acjk$ zcIF=h?yva55}@LE#q|}ZDsHW~lg|9Z0aScr2~cso;`)kH6}ML0NoW4y04l!qHGfE6 zKJ{mcz5Hdr?P5RWvg2RrDcyH=O7c?$61vjA=C3iNYDZO7?0gl<%8TxQE*mae!Xp)D zD()>I~*ynXifbN7Iwf4q0Zt;(Zs2QMSq zC-)*3Z^pY2U39(h_)gD#d{tIhb@4xa9#{M%{I|njw&3nqAsjnF#7?$iyz+~h!hS4n zG2VBhJ<1QS2!U0C6k=I}-&x-${6HpOWs}Zu?*TpI^axsk)$AI@5<+AN>mUNr#rl;VXqH zLtTCm9kB;bI%Q>;P($KYU-*1nQ2p=OLbKAFu%1>gF zaZ6>Z&YqpYBNX?}PzR^8Rc$05aoiXwX1N;r4ZrQu4wDJ)@wezw==EO4om=)?UJ49X zX3s)EE9YKbP^V|(XGvGHCwVzHlNR4m&v*n&#XHmYc5TISPZG(0@d*%u!_6e&$6cfa*8>QIi;D#Oh1Zi&Bo5zV_ zg*EVb&Jz%JmX{ll&@lFz>|fyNX%)H}woENj&-j}wo8OY_l~i(qAKB3EOmE2~@kVfE zjS1R7##4KSf`)f&Ei_$$(D5P%H`gDkFY}ek^fw({U(T~N!T_aMH+W5yXF(}7; zG1J0h?w8o5osqh;ei1D8%ps<-GEZVc<=$JghCyeiaH;ag*z=v_xqrIV;a?|!V2=0J zzx}&9)?1EUxamTyC(RHLO}}2vf{gHG+aVZkX@;^;y0S+C8_7p6u&um8ZV+`40i)lE zOBM56S;93ZlW(i|0*g8GEEp|c6468k`fjlb2F_%{n0yJBocBR9{)Qf#cNvC7vLzFJ za;{j3gLJB+RFcL>7F131XL*zP@{zHVg(ml-$|rr={OkhW)t$t`^R54Ln6K@*ON1|) z3|-Fld)w6e3RC68sL7^GG_7q$h_Uj9%^EbPiR-sR-C3%3Dzg-w&ELD+7oW|7o~ax9 zVw+hEl;)*~Fs2EDk^Z4$5rf@AFe%EANIWAc2~h3JHrFO#gTO*1qXHo#)l!h;2BH4J z8pIWNJ&`RJv2I6umfEKGzh{l|2E{r{et}7Ss@z*1=%BJ{jN}$+yWp1}&=AA$eO3FC zW(eLn6u;4xSSRM2Vi#8=snkFuFpRlTHE8Bgq6!X%8bW<)Bb9xIauTq~6f8#!=k8fS zPP^nr^89QWp2L*^>uL&9Xal?>AxQ9xpy!V4Bo(8oQrG{e3m}{niPrR>`B&9A#I-pN z8!VuJ#-$vN9+qAH@47wFZyMi=jk>TH3|z;dXSL@?=v&RQs6sD-;}ykpRjfB}MMx_j z{E=>OCzOwBpAwKFk`2<;3ul9R+P`QTSn?nk!ocxO4f&Z26rjhEDivfi>El4xnGP7w z1D%TXR*S&%g^8vw?iyf@@E!^gYGCy;{cH*ArG6TtjgQOB^cmep9JKF`xW5?vQ>r=yH1&J1)HrFght;BU!Ri+0iH!2p=) z_g-fiQJRQl%YV6y@JA`7TS`wvQiHWNeH~umd%&h9{kD&C^VA#dzPXU>@W%md@7QOh zyeuH>c>|FPgxAjK8PTzM(F0K1V2see59%zspv7j^EUNUb<5-PDVC$u|ItZ(Qb;2{v zoI`N zu3m#J?Pjkq(+X^TJ&+Q$K5#Em)4>Ob}YDFSoJ5vI=*r9_ea)zXm% z79eDv1NrQ>pG~&D&MMBBa*vdbKK9vdtY>%-@W$gS@wADQ)Rlh5%vcFlj1@_fW(?C~ zS(pyX#4_xRaXKn$K6IY}aX1CG>+d#Vtw()$gIuVDS|2;{d~d}&ZZ6J|AApB1tiU%4 z)>EqAj{~f_kh#%yj;ZRfbtA*>KcvQ5hRktmS){ZB0F|umWS!`KV!YIGqM&M~E5^4I z9^?`w)~HztU_=-CNXAI|NT=E~t4Z;|VzRo=VORafl;~I5aEIx` zYdQ@3uXi!3fm-P7gug4{+3CR}iBhgx>JfPYifpT#W=2=c%%?Vxdf%p<_%N_UNxV3W+(}AaZrP`;MuIr z%qP5B-`UiP?Y-KXv&m7I>jp;c5!0@A&7+yv?X5O+Hnw#<3T30tPDIf}HRDG^66Uq= z*}&%KlmAV;8rgM1gZb?KzT81`x%Rx)@l^+*>gJEaNW8A-5YmjTeJc$g=l7-@9paR^Tv^T!7s0gFewe7c(O@g z;a9wVbL(bxZ%BI2U*2c2o56MRcH+9Oc}857lENfff5U3*oVimnAeu=u4|vazp#J5JT7Qj0fKg z15N3=8~ENG4zFGO;{Y0sZcX5qS?kiAa-5~{SaLzqN`1bDR%E1|U^ z9Oc7i25kVCm(|5`axp>p?YBmPfW2f+b4j{1i-&*sCkR5;yr56Y;Ge)qIsumoY=y$i zC;4~^I3O2RbmL%OI5(!Y z77bF`0H-+VZP*Yfws0np~W!5>TH%6@Fj^r&eS2;>Qe(E^cpyWY|CxL(eF)(su%*Eg%0YOgxQ8^XTTpuOu9ZU~dw zuK!ER;ga7F_MNs<^-iNMHtzWK{i-%Sm~C5i-M}-#&TH$cH?DOdMn9N6p6}ef7h`s# z0MNEfGHBZ|H6-0|!U`@{Brz+)5FO>HjF7BM0Tsl4OGUAgx(NJ^8f_a(4;t{JX3^ae z_p!Ow<#e!+B|FEi3#!;>Z`t~UV1V0$EVDM8YsluXuJu@-6u9;=XQ;Dn(mu_53s~=? zVJ*VmFSKk~+`ww^|5@CM2t-d8hco9fxxiay&p%)s=hknt5nN>sfd{{kGZcj2)|^g@ z+WD^#oK=H>_n+K&Ou{N2zi`e{6?FR3)>~y(DKk=#A0IOKHlG;N4-BO}T5J!el4WpM zk=@e$`R6ouo0}Lfei{m#XT&bica9(gejuEA(b74*K)fIpd;QpTK-~SXAI3fTyPguB zY%`8{$MFBmM@ZSDb(TChB+0JE!!h4Ge_f}a{g5Gx5h313a04`}ptK1=Wu4<@;VJ?t z^-K^>)vo?Pe=1V5si*N%p*kNN0L-F{6>VXmliQ@gzA$hgO!VwJg#Ok>LCP4I!n0R( z$Fye%b!)I+C=8S%^y&$Nc9>k!RK++{?E$TLcLb)=!1qYxE>w=3T<5wssv^2GFds(% zH8d6b>iB#z__+(&cK5@l+D2MZKLH4rzBDYj_5OQ4U8&`iSvtt90m{rbf2#fnh3!S^{nG2#kH%fDE*wy^&tDG&3hEZ6j?{ZsxyUWOyl`G_2;%ALvbtypI-3s4*i(J zRvhiy6^GdqRDhX?#Wyq0F?rLy=?S51Z*ipb@fW^q5qilV%(nT$Gs!R@9WRvlvGD8) zEl&)%%07tTs2ni=PE34f&W7Ug**IeFHa&aB*B^eM7mMXwe^$9rs<&0-rxtq60!@#< zaBHY{81jO7|JSg3i*jJGSn5r?-0cz#f<0vA(eoLUk+flT+46hc1^qD`s-@Di?eneNa2E|FO zw=;8{JTd3}u2W-HgR)(aSQ#?x^bP501798NZ1adS>s8^N(bQ59THn?}+IE#814 z>wdEokzu?w=N5)V&r`ZTyvHaT{;6#x;vge;Mld zf(d3^A?^r__CdtOPPC{nXg=_n&NlzHl5tbdc=&TU#Cc(SU0@608rZIw+xNGRtklJ1 zMZV(obJs02x*^ZB|8CJY!8V-HnJK_E{e;Wmm~n@t`&eyk<3Kg^CkPnZ|)wr>0}Ey~!+A z<80Y>Mm9vSAl)tm{R#~tOWV=A;wVj~INj+c7(fp)wA>VDf;glEHsBi(lLg09SaA1{ z$GDVi+%6Lk0BQUr-0aC*i-H*2X*WNj+kyA$7j1Cu8KQ)C$N9OS7zcM25?e}F7&^$W zk|6eh*C3{^TaW-T1*zy`)xjimBj=FI(RS9KnC9|al%0}Ok2;Qw-H?zHxfk0|Tq9^q zF)t^*iC$5_)MzenXQa>27S^dd=K4i31>vi$XR)SdvlcjY>do}Znur#xh=~}9E^DE$ zJSc*;!XiltNQ^u*85a*ZEQX;ls1+5-NI+KPq2AO>y)h&*(+DyV$>RVj-YFIqZzL{I zRnH1>ya@Wk0=P8%)cL`oo-jGxT2?HULo$GRbE!yp-zL&$wvCE2^%=1ceWzvHPRqAB zqlaK^Fa_R;D+Fv3LTn~O3@Ed(SnU1wlwE>0vSN+63fH&Vwq0Bve3i7G3%4Vf;st)P z>8Dcs(MI-JPpPw>l%Dly3pCJi!*xtks`uLE-FErAJ*D8m<$qG|n{KrX@5XRa4}rgM@e( z@?Q~UWT*Lfkh3gFvDX&yf23HMjub0oiotO8v{(U@^p$^~rH!!L#6=_`>7Yb3NIs`o zz0>U8X-=>0_7bE_Ml%>Cfly*Dbym9dL`w-U`R~+{HLk{@OxImERSun(;Ixxap|B3T zMM?KTLwL1b#%4?9<9SkY%rsg=tuZ^%vA+xSno2|qBiL>kKPl4+MLdfGpIWF_>u&N_zk08P6DTCE#s(sYuUZ8YAO4YxnYHLa-AY*oq2VsKpX^ zuy0NSu?7(lF=~HVIWNMljCu-MXVhE&JVX2 zLO+}G6p4aWl!AvI-@xVo-F!ezL-lZO<402~Q!kGhe0sa6)O58As&#CjJS69ksHrMM z2sZLEHuiEhiH%lbSJ`c@82->y-cg6 zVTPr+&c}5;fVQ4)1HGPX1Kq_4j3Bxh)BE1b6r2CBK7GKIb-TC>PUr5ni;T=(3mY-S zKn&1l{j5yn&~<^lCuzU*CF@c^&Wr6GH%sn+j1b4`fC4fq*qa4aHCi& zdi(d&%Yf_^JNm+=5tjNhQGUuORosbrB?t?Yn0s9WYRp$$d>a}VW}B_9SeuEi@F<1J z`grv)WIb3J%c4DvKpg{P;rVV~7gLGFKqiEU4!MZl5ukVEDtbp?w5_#PRY&p;b2S1T z;i8SsWn&sop_sB9eKw+rWDCb>H0D%Oi(AY)A_jma!a}X}VhT%Ti+D%PgwdPRdpF1Q zt^XxgXDH1!E-t625D7RY+Slw}A;NcKOh1!w+nEI09*f^qVt+`)=WZFQMBx*3>W)Ci z*$A|Rg(jNUjTDxK8&hA|rBA$$We;8nm%ja@HBMzPdDd~Jfb^^qyC8M51aSrewHrAv z2O|f%^;a&t`&TZz0m#diLjOIlL`rA=m(+LWE0Ynzmxdq&Rib-yPR64Fg4vMOh;4_0 zvAT9QDyl&{THkpEZjCiQ4k{v}Y+T}8s(7TH>@P+or^zn8{(ySro$9oyGRPbA>#-H%4pkanSz?ZH4P%^FPl(7EE>mZLHPre<%k&eDNlwJ*Ir=` z5qrp2l?A|*T@JhID>=3{cFB#LB~*Nf`!?CMrO|#=)ZF^aFH!nEiau*GRBPYv>b#38 z2WLj5SOY=??8Jj-(QpA z(2L?Ean2#2hdvsgg$Ew$A_?@M$B%L$_hWRjMLXXTwM81#?b_#L60yT(@9<_C6v-Q?toa^ zn#6x#*W9=?SGBKvf8;TDse7g<)!89Q(bLq8asyb1rrCCFZ22ht_I*o_(jdgB zPriI==ANXnd=ox#YA(*vGmKPidYR+aU?c>1;i@Om9*?}<5`Yn7a9&y1FShdxm(Ld9 z;_2;gs&BdRPOkk;ZoCP$r>D?;6jm`g<%~meh6^x}(cILdiqG6Czc!+(FbrX+0G0+Z zi2XmZXNM)D!R}68XRlM21e<&ybBw$7x6I;GIH~L{!AM(YGmeu3IMiyHiVA{eqS7h8 zZP?OUv!^kJM`zzt^eEcY?7VF*G&G9>1A9Q1w-Os+`=G``8+QL84))5kx3{tX^kBW! z3o4ht2YYz_R|>V=-(PWPwt_gmvg`FfJa+EizrSaB2vXzBd!r(;=U;gqnKNPs<8IN? zV(WS3X$g<8qP~FfKGUw`0^C>g0h_9tlfx%4(h{wqV|j>2IPgIKIEtPdAz)AHoDn&y!`pHIluA$2;GXLMDf1 zB?K7tb#oBXu+XIn!&IhHsmc;XJ;dY6LQWt}^F@;H!iZz-LX)R7oT{>%Wk^d)qG0%v zEWod+fSW*^Q(mLM6UKPTILlnlF$ z^!h$$ZY;TcmPI!EJr1=z`K$u;fp(vlOu@+wTj*d%Dob4f9=HO0QvT2YU?e|v2~HiZ zT@XwOFw=KE1(JIyCu=bCs0K0*k2{Iak;LF&Fa?5-!O9?`2fH!P0AWD&1Gq^L+7w*! zNKnZ`fo1JMpe@-4DSC_mBOMZl1R6m`un}T}+7)I?k#`&_h@?bN!i^{-8i~Pf7Q^Hg zS||R?wKFHOi;8j#KJ-UAIMCudyqe@WJ^-GpQ%vQGZ!0deyh#v9DO!e=F?E^leIoeq=B=5dh-K6>hCUhBI&)qd~?T9CcSygkA`_%$)cuO5a4e9oBm5cK-% zm*uyUWcDY=h=?(q=wq}u7g)!7MA>jXxQ2J^$(2}7p(!R(S=G6hC5MWbR5Y$LQZ?G6 zmu;!n16<8j-A9_>inNl;dG;;LX9Zlz7OBY|eapl*(!%??j zG+j99(%G|e$cMy1t7TIQTwueH3zSEhGZnKKGR@ki zoH0An9ht%6^w4HiI~<0?*?G3!EH3C5b^Z?-UZum3FQ#>eyhb=W>HW|ERMJw!h~rw+ zm$klXx|{Nfa19;;Z|dIC4dX4|PO z=puKKaKi8>qvs6AftbxFMZZscFBu9ygOC7+4km}`vn&&9C#(CfySkQILq%S6iIuJg z1(+T_FNCL^NX)KStBF(M(kVXiHQ7L(n(XM?BE*CdD8^BdFiQ?8E}zQEf|C~PBudm@ zYU5miYo&Mm@a*%i^Y+O%u)!t!$_}SVAIYWq#M{snV{E2nL!b0@F$!`7Z21E)rRSby zrIVtX)+Z|_9>fN;+%LNO(ClIPFw7-peGiMj?Fh@nGclHw7ZQY}g%n|VA;ZQBGQ><^ zhKX-l$+e^pEelO^hMyT*XSA*5{|(${0F`DD$C-hOWiw97Ev1`KB)la3gh~bybuW~B zv){&9P^MK6Wyq~|F{F|pt&|~!(+GqjM$nGTdmeXOqggSAYhQO!`ox0Gsfdx^<>-IP zfi>DIEG^PN*$d#Np9u7G3X)ki7SQMzEV_C7{Op)9x09BahUYc|I`N`X81+*Q0o8bT71I21#ns4OZU2rrho+}ztc z4;Sqf8+YF|&L+B#Bn(#r7w(Z1Nt3BWa)kTAR=klG-I=x;C!i^e`Vks&blTfS3Z?+N zk=c?7vvy8_jL#$I3#j-CO1^~R>SB%$prA-K(4zu9nSLvoeQQ4dCWi{-^=eR+#_#u~ z1e2iD@Zi#y#btGdj1Ii;+j?ni)2#4P$mJ$=NH z@2I!(XG8-^XC5^m@WUf;MPG<)YDP=vyb?)~slm^XH=%QvNxmiF_X+CwIMk3&j_z$= zhc2J;{8L!4rh!4@|t@&>{=cy>x)o&L}G3H#YoW#zmE4P-R$}uX-UAl z9`%=+@rm@h$}9d_FL@*)9WesyL|pT zUs~TBkXUc<%v4JuDe%_~@$Q9N)hjw`zyC&l3GZ~IaV-Pi9QWLrW!AAj|`%8hbej<0pdLug0|iQd`MlnQE8(iSQ=L(wPh2EWD9Bs?lwZ5 zm|>>FSKr&K7yMUkVPlL!LhBg5ggkF!{+C*I-^$J>-$Sn}uQV|zxxOe+-`($*){weL z+^;{Ob}73A>X)!B^nhPO4W0URlRJlJPgcV6^Yu>QS+Vd7$8gv?vy83jY0pjDAsiah z_(OF2Fm0RBScpGgyViw6ykWnD{+#@kwOTP89G7=%QQy%WgY33peG}37KRe%qgGBV( z`8pgZTK|jlRXBhee$FfY3;t#J;-CJDof}Mv-PHZ{*~7p1;M?1m_V2IG_`U7V9l~1k z{%qk}u{dI%Q_}~-0AG}W7!ONI&6;R;quYRLwc;&W% zMHReO{f?UM)3}&R6TEqku0ZUEL`K=BuEjs%F>3K64BI1OfA(#n!Ah0jogl@rHhz6M z8l_;o+OYg0AR6Dfg;fBTZ}W~DI5T~(`CNeXy1P{cmo~iMow(?}Q-C<2tr(Y6!?n5C z{D0)9cUliIu425e)hcxkHL45HL=cmzMB+u%9)V=|7$ki zyZ&A|Ir>e9yH=h>prN4wirg(g07*c$zZUS8q{{;!3*xW_5GNmk1!BJy#D5D*KmZ56 z)POC5f`#9zi`r=fLch(Sr-5uYM<5~lCu`N4@i7N)kYK?l3^*lQP%bb8zhfT|G6&Ql z&ddAmrvFYZ=Wc#`BZeLjVGHR=muG_#_}z9Ib_bp%^tALIB(Dhn9wGvR!k|z-Wr>A& z{2+!BET}x;|J;YgJxP4s-@bLbCAv>v*==t+rG^)FU@eOShQRC7I9MqY>wyy*U~X1^3z{yyO+6HI)wD=MG2_<#6FK zD(LR~ZVp{^lk9zr)Y=d^-^7#u98)_C6UNoHczzH~I(k8bNig6ILoRG@;>Wxkz%3=j zXAV`WTV39sV-sT#oIM~WO2ae~qUUd@fz^3qHhy=QD4U-1jp6Aq`}|&q=QKC|?Q9Xk zPmXbYhgOgWduH09y_xb3U<8S={>E0$328sw{k z{{f?7KUv<(#W_ys^bmf>j$WJEqW;0ZY2^a>qZJ8=F(V!q2)ZImAKHD=85D-@@?|f02jCZw?br1h?OmZgL zD~`F@!#wL-_COsyr38m(qi>4ZK3taNcAwQo{}jB7jetVvcx}1cN3#SM$FRCNQe`~1 zTpwXScuE9!&YpcEH3~ioH1`9Zmu+}hbGF8ax4Em?%IlXA^7c@CKre{$U?sF(9WnPX z?&DcwI6cN;qEVa;a~)L@VFwJi!IO9~4l8G^+RS&jpQIaOFxH~#_|Jp-DGZ*5Q?Z<1+a$Jhm1xf?@`p$XD=dHnZ!mQgA4bd;TUe*g%=;;5Z*X|2m1#K zN%t6N2433L*_FGZLo{bj(Y@_a_Q5D_ayX;t++l=1@cD@hLHfN{eO%Gg=IemGInLk| zyfy<HL8^^`MjgcP-End@lm_c;QApy>QV`{?J-Yg{f(dwOb^cG`+<@ z!gT!0wF4wfPC|6YG~^`9#5tO4+nKuJ=ec2j3qgC6?=rYf4o2jI5nV)_mMh!CGj+>M zj+})97u66sj;+?F)I#Ivn$?nIFU8eZs>{@L7qD7CkIaaW&HqjOv9EjBAq;Fv&mAWF ziMWG-g{ltBmy%fg*TV#RP(@-ZxoY_A4l98le14smV_sAK#y|MfLqJ|cXCF{uR1~J) z3t2O=hu8YJ&YmzH1XJ+K72i=1p(WBxXoxyq&wP>Qu0XnH^W4)TY{lmvKtP@(J)$=_ zPl8#2I-zJNH0`$YEP})W{9Th6)OoN5D8zvqw#U0*BvFqvtsZGw9ZrWJ_9bvHMz33OohDS?Lep+vyp=ngO^&O*Q=)(>eX_ws zAt5WWR;jBh4OOM8s?=1KlB%S+Efv+!Cl~Bza2&>=efX0N42p(2!f`D+J>h^MD3kqJ zN)gb@E3|Y1SzAocz=BN??O?V17haV|f2V;S^md0iomX@yp8EPf1sm`LdvLU^w`;A* zL2522yP89OU0T;(N4!~OZChx)WhU?4byTbua;dJSE{e%(2WC;*K~jA5Y=#M4GL1M0 z>5No!Hnz6<*RCntd969?-pUVS?togmlcAFSx$aF3D5bsyOT?{LxXhbgx^8^}h^Pa{ zYBrLf{qQ!7n<}~)Ai~4FE_EmN#CWeZ!>FlR9-;Xhl)fap((;bft=n5=-QQqF;};s} zGqLc{ba>VznAT}>`#B7_sWw67d1JE+*Op?zLl`(M>xGa~LDea(p~OXVxpp=pNMF)_ z6>D1Ie>xU9TABfFi>eo06UK6k9%nhn_w>ZN|M)unIAd5CjHu-ugTln1l8mvw_f*Rn zD1dVf;HtMioK_KNq4@&4jUeX`=d)Qx40=2_=0mE5^rD0@Zfx1BD&x4IY^l%ct&7mm zhYP!~uru#o^-Vtbn?Jn6rxRC65An?-@*k8AqFtZZpyJ*N-{a%eGNWAAdCj3i*X-1k zN!|VTs_QRY=c7WjrkcS)!rIIN^p}4heW2?TTEPpb`#tL2C40(^tF6Ds18K?rbUx!s z7lo(2s;l4k!`n;t?D>o;Lj>;GF}3yowm<(5@~$W@SquZig1q10c#&VK1G*|4L*_d= zN>s%P_Pvv#X2*0@eMe0yjiR_1@;x^0j)9OWR)ZqcLythpE!ILym}m+EjiWjX^tf4) z-Of0Azg}5_(l zk9LqII*z*FIeJ*L*h(LB;NMr;k|0mbrlddc$g%TXj*bCgOoP8kxZc1LavDZ) znfUd@<5gLETHE0D)r7-el~61Nl4hfAlv7cO`yG2?Q0Mjxe19lWPZjl{MBNd*B|7_i zk|egMcsQTXCnP&SMf}3+=#x#+A9C!3%g=++uc(1@45bW1X|QVlIRf&`EfX}T3#q=+ zgDErj@n4VU7!KQNtrfu5;66J-OAsM~ui2D^>l!>fmuf)GQSx%C6Ol&Bh#!E<^K>;!tpV@w2ubqvYzE)8;ExA^Ghy zWg++=LBXmqnrp_|E*HLLuBTcXOzj4ujASemnaV(hl>?{52Fll=glA<9n%NKe*X@VU z{sB`ZDBa?bOf_g1kPsdHodGS)bG{(3ILMdT5?=xT)9+jXo2D9705c@Pycu(q2V^8F z*z6cewqM5npYdt{LL;HNuySu4rqkjkE_n+%{V!Rs3L2BpRjeZ?fafa zENH~g7{Xx$6Om`R@8Ta`KCqG0&wR;eB#ifJyWT^t3iyMMP=!(Gs8z)1j!Imc(^Y$mdj z3ge_0J451u$$13Mfg-O3|H=D9PMUyY`vCVlfXT|d|F^{2_{L~@uLoHHNtON@q)XYk z?&Ot}edE6B4>^b?ZOdyG)>5&=cb#%h2>1ph_j2h)$K54LT?B%cVE6eq{(UciyPy|> zY4O`0$k^~MIOohHFPe_0xl?g)o*Efc=O}@1z@Y~lbzYJ+CDS`!rZU-GlX;9EhrcKS ziJ>|&%HgnoFzmd7le8X~2ZEd-AuE)hJpB}~4iD8*|L&2nno_aJ7gBOB?h@ww}IY(qfH*<+1h;1s9NJr4$M>^E4zab8&C z$YUf$B*YEoaUZzpcY6@)f=8j72)hfr(+nceopgr_pP)oMev^gB+S2%@G`VR{dehjM z`C|s6Ad6UxXsna?tgd7`W9vpYHN14#Ng2?9@g=_YF@(#kqTQ*Wcyb>+c?bJ;wQhLO z^L}EQQo<5CYnUw3_5JDQ{=M7#PfPXjKBc3$bH0}grdd>YRK~*?K>|_7Kf{g}lg75U z%*x8G^r910aC6XqY2uwArva>nT+U1LZ%hHJz%g{QuFFk1@EdXN@f7MKBDNKJ0iU$I zl*SnefsxDwhIuCH*+mv(dk9m2674Nn9Q#i2X}=S$90HK0&0_m}h7;Mjd@L8mzH_49 z0Rs0+gqmFwA83IXP+Yx!??%E1wt@uOb|k3CJbG^cpmyDWK_hz!ZP=G_j}(zIOj4Mp zFiY>Zd}DaY(eV9>d6z>g=NT+B$u7=DpcRgAoH<(&zxGH4?oTu(PDQv%! z;7~%Fo5)}QK_-1)HGVQ2l(UNiwHU-Tz;_^dY|Y$nbLN@PC1HqE@GyW{TylB<@A^Q< z%g&cB=!Ah*<`PZIcG_9aM*+D7q!tb8E;^PxBQ!#p8Cs_UNopX;3?V6UY(P(1j@_fl zF782Omvtj_2hwCfu>vSo0mT|vX?@+gL^fs&fpb%=bk;Tm>B)VAc}rklqirGrs-@?;uNGl3>s1ZnS} zLg`?`Yp+`FKnrAn^sYL>xL(AKQ5wpkGj=+_VMDgOwEZ({`qFC4N$~jb*JjN}D{5NT z%YMZLKIt~w9$@S!y269bXcu>41gP3~oQP?`1*@It8-gMsFaiX&1+huKslKDPZwu?4 zc2_{goOeX`n9}HMk(SyJ>U~D1Eys6&MWgcUjxIhoY&{qCgpXZeVNck;5`=4$@ecz` z%cCa!rh8z{OT^oYgku#JHGEw|ZA!^*+CrJ^z&abJj9*g>4s=1+KmoTg5hcg zqc4f8s1mgeo5zyHHi8OZJnqUk;6 zo|GjRJx6S7ev{$3f;>Ds=*M?9f8Q#O^hKg}q=uP8CwIX@0YMQUOYB zx7jrHB?-v&H))KLDV@t{An4|Vf_y?jt4M54MD7{RB5bBcALfs`ykz_zAf}ZE$W*=e zP!}<3GZCVDCP06XA)@I#b+ov@P>90vBXl;R@3KYuc!cBG4y(DFh<2I~N02pzqQT13 z|0IgJIF>8xwDq}YcyNQ2vJ8nqH}!o{Og}n(j!{ATzb&XhPw=+qe(Shc7PQp*!lb_F zG-D_$c|4Tr_o4MT8FYDnNZ00%=b+44nc!ZMQa)ih zKgZA?&sRk=fj*u6jOjb9QKEGL>x9S!TH)hi6;(j$twEwCmmOD@hv6^XWr~6}MsY8} z3;8{?px|zr%mr9!JGM&Jf))b1C71Ga(F&fY&aTU;$1GqiR4_KwNp~g;#NF|PhJFF0 z=uN)TJBJ=&05h-jqy};_LtGKX?vD>kac)&3t{TK#bf#Wl zwR{u@4bb!uOeEx^wwQK)YF&1SD}?`kx4d6B^wg!=@B{!({PmTNGoZplWh$_hXA);k z3>-5IgKy+H^f^Mh6+2x_r;jxI|3#Tizqpg#udjI!w=Fqzv}^P(CNtf87f%{AEuP5T zx1Z)9T5-}F6u`8LJ?wbb*39MsR2E#5wb&B=pgf+23h4mXAi`Z17<(2`0|SLN=Q4YC zL3;f|QXaKU3i;Xuz|GQQHlbJ%Vh+%9%VbFyezqSp?oU%Wvlln&xO(u+b3E{z=QFRy zpcl??Rnfg@vX?OLBc&gHFB&gqA+^X89(lsT*p8ht_BrZbU%>8zE&af-4|40@*cthv zLlHB)5fgC{VpI zcg@0kRA4{t_ry_G`ja~?iv>#gu3NKbro0u%+T)%fT zfVm1V)vCp;saZ)q)R~&W6|U*n&~U4PYlwRdRez4nPh<6+N zOAkaDz~7l)`t1>8)@IscSvtSK9L1cw{-#4>J5?TG5xZJa@1R>cV0XM*OL1GYCl+fj z2oabkKw}w}=#@}&o?61D=s>uMj5L=_E(ZB|=E^B#gJNV`;CHFF9sv~{ ziRzSF2|%E!k=dv%I=wSxo!G^o_Zf8Cp!DV6tbkp(o zE+u~5QYC$Y$x~oPGd}!K1L2`LX4w`K*c{s`h(+O}7BHVy%ZObF_*`LuyM=|C3T%57 z*eSS;%6W^(u=^OP$}IY?by59E7!h2Y*CrFH+(KHWE|P0RP?;#G-WNv>}DAFAu=F)L^~3V67a!Rzg4 z1&wcOb7HnqbAmk|ORV+n*Dfu1Qek1L?rUvN^4z!aQOp(OPZAS(cpy!aIYbV9;!r4& z7_NG!o^7$E_D~LSFaZn&wGeHh>GCG?tDPucnH29)gnF~ay&&U~9>s4F^pvU+ zub6U7w~^8eDrf|im6Rq6!XUWHnvw=~Ou#e2Dw@G6WV#l7*QP|Ql_Y*N!irXGLWT_k zm8=*MQ)3ZVHe6{?oBtiI8=PMxsR?(lF7be)y(y`%2q)48Rx-4Sy?YBc$?k2u#GD;I z47%$C3e?#}1kN7J+Sw-toC8uIbjasJN66jBWaM*BC~_F5tPVVy4On=GArTed?Q{5C zJoxO#dt}RZCfU9-WYtHCg^g)JxpoEph4__iXvIw%-1_EgIMB`(J1%s-i3i=dy&HY# z#htx4g2PxhjAJFdosZmj8S~Hc z=m#IWbsBvc7L)Z10*ahQ&2*7^v#J)!H?bt^06N`-78|rRw7Ai>+SoAtbN8pdI;?+{ zh?m`JbeI49orCy##&kP4Cbpnop;EFIqo`~KqxvX+5_waiil(qwSMK;E5MY=im6@*m zaxjkXVbb!!z%K|hpSB+|9(M17AK>9oyHj9FZypH<8I0~RjdMWg&QqI#mX5!?b@%$G zOI_8;Z7P+eYqWsBJifatX)>K`=`wV-6tv0B4}OdCR|hx2^qxlUF4-i-eW<7@%b47@ zzCJg$rd=B_fG-Q9{L~kIu))8>qZ{1@ZudgK%mGNNMiHcQ>VX$C<0Z^ON?r$M58?!v zSyo{>YPu1a*V?q~qW!?QmAw{#M_2sMULeyDm7ee7M6OhQm{H1@4|PHN z9BMlLUZPH5hE}yV0fl!RHWcIk&d;knbVOrB4avS_~206GGlLm zQ2YC|S90{R^>~|q&y+Q>)E`aH?J!<8yUYMNOh-B@MG&GDLslm97}x5{M#dyi%0#4@ z3~SF@PM8iSsu&VnHol>^BORo0Fhd?gt0>d=n(+7U^?q|n2mQXneXN=ezVth~ei9Io zY{6TZ#&V@;nJ5id`1)qY!m+mYIFw1EeLlZs#{92N%bKhzeBHcB@@pW zm?PQsB3{8@L>T&_PXjPRU#dC=Ts{A}qPt*mRL{*~#_&Y>00iaLfo>12z;Nb4S{@m> zmrIGHWOl)Bjm!as&ZO4)?Kc8ZCwk42o1#OIVP{xW|K8XqRAD3k{*F`ioo7_#Q^yp1 zpE5Jx>2^T<&_eokAY@r!q>m~FE3Z?Db35|0%D&!hz5!^__1prV1-!es-yCd63;uKL z%g_;8XW`%)+p|(rT~|XE=Bnfi>co0DY~Z(W7SGvnCK{X5Bjo|f1?7$f9dlz+M-gvE zM=!x(G{5)#Wg8^`Wb~>!pKs9`ucGpZoX2j$YKh+>uPL`xQ7gih1s#yKCTYL;P=j(8l-F0q}hI<8+iRWRtXbx3K77+Pt2~$i@)J(dWe*e;YP6FBQPmy}*iIbw3 z^)(DRL-up)u1)Q2ys9%+GkD$FP?85_KsVu+?lk}(&B56!NB4X52kT$MLe`#PCZwH+ zmCk1I#gGt-4?vwR(k6PGWoO{?-aiP|dH)9Xd9>kT2z#FwN#~UfTW#8V`wP2+jT2kh9j~U^(qiDIKi1;zpKsjgJp37-2zUhzV^=a-EB zh*JB@x9a@}M_6~?KVzzq3pm2A5lEpdI+w{~^SJ_D;R0F&mqI0AF;a$>W7`OLCXq#E zGkJ6_#VIMTGUh&VH0VfLTm=elXjruwISIcCEQsHK+O>8vDcVe7M}e~e16^-)@A9rY zrO<{aX+*ijgPePEQ*v5_Iq8|^z!$;!^pIMLjxf#LuV!>Di_uPbTWIScGH!o^3R(d% z;BII!L}vBFoEGwaFOFiN^kdkK&fCX2HTpcbw3a#YM>@nJI1^-{jyzi=_o3D}HqLbY zro6KdC^~k8fe4P_c#**Mj&#vqi0bG2315TymL{N*;cPORt;MrCU`7WJK{DW?hrV8g zBNvIeOVlyMv5`mxQLcd>Mc7PFNg+ck_QiN@0JOwmvlrLLXmn9?{^%rN!hA1wQGUpR z@ajYuMUQdXHb_vIw1HmJmMIma7VjM&Z91rAL`G|jcWQ;eW9;^m-tIY%MHlbz?QQ98 zr~5u8Zxy{LR`lA7#dU66E3b!df!4zO-(IYZibga zp0}q0KF818@|u^xVcgpoS`2XItARo*%(`*3ccR}TdU5x+*j0q2Z3dW)~-(Ap#w2@&8xwfdk7}0 z_Sn~fbu#e^t=%3dJ0Hf&dX!75abt77L-*tra@onsJ(hKxEh?)cwaWc1^ zl>=?b-DWS@K)|VTv%tXjCOCu1I0E-M<7s>GRyxWm*tMtmrY{GnIXY{y>aWYY@fQki+#tbsJgOxn#X+QV$v+o|!zXkt1Y zU#iYJ3g@p;-o>+4XHAOTT5kDS?Wnh=F{1T|24Rg-?uC}TlXcCBJN>=vs+850BD&0O zjACavgfF8aUN z)Jo);cY&{X#$+X`xwMfm=KPtMMHaA-{R_Nv!&+{5H?UY2MqoEi?L_+-^`Ln~f4naK zq)+o*Z)W=wzxT)3>$chKo%7{iVQ+-JVVloup`ubZLNI(? z&dRDWw1&HJa4)h%&BzOfov{3;6p)J$a1>$rLLuP2JBXJCjM~$tb^+HS&!k7*p6s99=XONKc%7)?#iIcnu`m2! zwOe((7IJs0z9}TAHCPrup@J`zIQZP83)LWjBsJ*Og^$uuf*j9hdc~h&q#`_$z#|DP zYDhWDcLzDb`mD}CwqDN3ovu0GVdgFN8+BrcS7sP>sK}UWF8QeVC|IDOBx)hF9b4Mr z_r6Ku+x7Jf8~XBobFrp28uwqH3hjU=VF%g)L%UZjeriGwF{K2*MTp>vbH`5QY<$J8 zTrG!~2@_nT=~p`^hR*2w_2MmCxjLANX)rblHc6Xr(&;N}35=O6%|Ie1t!}*px@;|B zc*nQB%^N83+<%yGa}PvbeKG3O5wXMVVDq4>HhYDe2`Z^*3b9<#i5X}JC38J2LpzIl zTH;G3h!X)kqYx5ZIEPQzl&~maP{O3Bme8rxfSN0#DXak_A;<97QJ~41SR2(y%bwo+ z?9Y6KOULL^*`EuzlF3#@C4E8yy|5pN2C~O#?Hn#)LTUg$tK?BCKb&1!gh~sLorln| za}X-s)jP$zE4Q1MmOhm>AiEBsmaWC>a`j5&RxNE4ZD|o&(j+urWe}`c!|ZhB*O%<^ z%TP{|(G(J=yGqmFga%B433RzTUJfKjG&!bn zlO_!xg(1QD4Du7#Q z;bJcCj^oJ~33Q#rhui}w{Zh`j|DhddXQ;uB6P?DoAqRcEv3doMU+yyO8`*VYuW8NR z|KuP2*WKIS9-ojp@VPd$p)=$_m93ujcXn-xEp*UJR4eEVA<{FfQ;EI8tiJUFq_WmB zbBJw#oXUQ*+@qN}FEQbt^Vbj{@Io0ec< z0n1A`HlirNKtLLP!exu-bWxWrJ_=rOnxPaF;c!>P)Zg^T)aOYeVyR^k?M~v|E0W!G z$vnB4qfQ_~1vI|J0Z4LiuXYGNrH_c$_!00Gl`-=*?I-M;P2HGt4pw&-cAT)Fht+ho z2pu%;>E>(7TlYrvB^=W4_H+<51(6}rKb~n%T$iBK*C5XL2E?DBPA7_$SF?gwMv+^1 z^UNyfj|6;{`}Ao?$D@A{Z$a3)q<8)u_G$M9@#yg`J_6I_i!fl$*Mmjj!4%xIVv;fK zN3`P@GNG_4QwsZCrh+w*!vSeHtP8V@zHt|Y0`$qy$pw5<4wN_IOM?OzP+A>%vn4%b zTp`^iw9-yzUheU1K=Fvz!CCcO1YdE=5ZnS?Txd)~1Ov|Dg_%(J>!Cygo)0Nu%)rYZ zFzc?6R`Ap<&9#T`UBBAs!kC*jMhaEcQ*}lj#)o^S&+g6id}W!PP@BlnWA5Q*^!o{Z z)tlr-J&@|P;~TZQ!%>Npb`ml3#7rOU>X^KNU3P?Y;;Uh=>2w4@J=h~0Vubn?<^dXDEkbM{`WK1bwOuPht_6LM-cRP6$zpTGa#I6S zHVzU#o<%i>HlsI@wyBP0+H^0lVb6H-d@PWVB4$HK7S$%`(Ux$m2}+mckQ%ooJ%n7f z!2{HIx*T^@H|<112ka_llFh5h_SLM1izl|RA?AaL2I^$0`}>rbe~=Q`Ztaegw9q+m z0#veEMBTOgH&efCV{}N3>|jkbb0}jD-YlzGXy4f6cA5He?K-qD+o7)vYaKy7E?oaq z{0t7{?Wm@DkG}bjLgy0pr4i+=m4cM``4gcu&HDOCN%2V&8tUGaY+J##6+-%{_>@)0 zj+?(8isx7>hX&95Ubt!rLk=j8%`43DPDnQrwG5uM1nqU0!O3bO#`y^SkglBk*{3Ft zZ1$OjH*St2JQO~K!<*mj;vkUclRHd(fXcSd&D`GCeSdnezIPbV`@)|ejIaN1bzetc zDxBev)h*J28!@P6f_Q`>3Ox93`9nE6I^G)obRV^`wbb>^u7)OzY(7^ob@T;7{hXa- zN1{l~5*nBDBzI=4*U$so|AkGi71%3#O8N2SEv(3jtzTT%f8u$oGV|!@>e_rH4Ktd^ zY1E3EXl#Hq_|fMZGOy3D>MnWL@ja~=QqLbt;bTdBRs#QG87tkY&nm)w>>t!EpOE7X1K^BW_Dnz;*QDUrr@}1 zjB?UACtu(-k)ms^C@X;FW`##hQ_LJ&(W6`(^<_2DHFUC`TK!|Jc4AlJ6*p8jEmG14-jG9hr?E2UaNP#54qod?kVzvI5L^qQu?ib>tMy9Y?Np))yd<<>++ba zX5Q7JIsG<%ySg33D#XB6;#K4SQNGuxtY7blA%)55j&?Vl^Vh{SzdIZ-TFfzBMxasr zJ;P8h4wwl=@ehnZUVNPykg>N!LY>ij+no!y3LjK9T>b~n+=>r5WH;~Caog*4P9uJH z_kVz?<0%8a)$WHMat*lD{eXcgU`FGV#CU*yC%AL^aZ1tLj4eDjJpmHP<7N-3Io$;_ zeB=!bThRh98PEz8+&QCgsrftyK{< zw%WS-sHoUBVbPhXRd_t9)GSEt(N5BIltvGzOSL4Nq9$FLsEV#Fm1aH%3vmWXp?q?&jnT{=&ttOzNA)gmc*T}TLSm?r{SPP{|J zr0!uJV|jOhs8o{;M1)s{u#9ygBxUOe&XH#X%AX5@U&5~A>ki&Gp_eo~b(v^_Te1@1 zlCZQm%Y;MHa$px&32ai;46CI5ghg;8FiX`6OcM4FMoBw{LCUV7e-n8{&=n8vF=%n# z6Ij6&fRUy~(9-r3T8UZ#B}p>$3PsdMsP6qn*0jw0iKI{>qO|o0l8(bGbsbKzr;sTo z@Ds0$2Lh=qbAG`Z^Q+RswB`$*#fBV!I8#i=e6P~Du{WqieMF_&r$%1< z$d{ZeIc766{h$9wKbe}bxW_Pk#<55Tp&i#2dN2)ZPy3ste&qAa(2|y~2dDq!`U!cs zf*31uLLyn{q&v1yqsgi6`r{^>t{H!Fp|4^(5#wa%HF3A^+c>@9{{QxGgqSf4Elc0} z*PbW@YQc+vAe++y|Ch4vYDWH{i0B5=LYMfdBt5J~{h>vspxG8@!O8LA)<+V(^Odse zH}>f{O{QHoj7BP8;7;aXZGBO3JK~V1+;4ukLp*Re%wOTRLFu{^Ny~cgMo4fvp55tw zQRR7@e(-bHy9b~0GiqoX#|qA$nk%KB{Zyejz=n#slS!WAo=Tp9{ru{<=wwGOO}8bS zhB&TUIB}&`X3M&QLJzM-l7Yo<>@n|?S5-MvmbOeb@ojM#5PF$c1O{7_p2>;^MCdUv zZS_<&qiaD-QH6GToIWsM-qV+e(57zZBk_U{rKVp7Vs0+E$^$5O=k4W{_%GL^9%82u@zbR8Lx+jBZ*D(%bJ4E4RR zJJlLZg(z)%HaNm0@<)+M+@}|8g6a$IZ0z80xc!rUarvm}hku9DpH*sI#$irc%xz&p z(w>r4Mxqa=j(c6=c$j3;z&lR&B7;jPaQfKo->iM5|^#4Rq8f9Qesm^nEVQ54RdhM8?z zdXOEb^f~Fkh}uBhnx?0m@k7;7ISJjE*axeG2fV}3!LZxTG&+ZvUVe>ZV1|x241_@> zZ6N^$pDFIQ_*`|GeB!}@=_$RFmEB34tC2ETaFkDLQkeGINm-&G4(nMmy&Q`st;XE3 zj$-aN(t^wsY`2n&)R7%A8bO6XY~MMOVt47CLJF45hwq6eb;Lh!s0MJ}ynGhK=GLR< z3ip$44)|Tgi}_Q<3u+JY54b6F?vAprx#1AKH1d?!GjK(l7hC;Z)Q90FPzp5uDY>R> zuNFWsko1;^#WA|1LB{Q_UB$J5*pH(qS|pTH0MiXJW!rSNy{tF; z7HPD&j&+d$OgDdOBxl%+p-ZQa#8yBXPVj;g{q}DF&O7^lozI`c^09EKs|~E_Jm-;t z0dIxvW$mJ1EgKe$i(tx|AucvX5t6&{@ zxdr*tK=87;S)yEFErD(DQ{~XTtEnR4+H`XbAAo#^(97qq^$-VOzbTIXMG+pl9)2j_ zKMsul8MEE_S|{JmzE+woZ30sthRdFrr+G`NxsXsHtfr(>YdNJo{!qy z(Q1w1)1>_WCKSsipa8oa`HA`N61f#@Xq|pzMD8Y$a|JuGa{kFrUwff(DOdAyfKPF| z>-VPpY$4l;3hW!aVXFUgYRT(R|7F1pyYEZn9Y0pw{`3_sidPm5i&+6SBc?$)b;L-|J8 z;?)%}nt|+*3PUTOko69~ejmZ+BmTN_97(bu(q}{l&BR8>50KM~Vt`64D*mW_YLagV ze;qM9B)6I3&yw;>V z=ePg9JbEqOKxUMFEEQ<}{eR8;BgH~HkTNG=zFOJm#1LmmenQRZx5RX4-b1T<=m6kzStNrZNlaWMM^q2T* zp~l6*hc0-O?+k6BskJS7En%wRP&_^W^h0Ym$!Nb>dyg42<*X8h06E7Qh(ob?C8}8J zwf$$DDs2Ue4$D|KQ=3Cl$UaR!H#?3S6+jmp zE(s5FAViDVwE=qmJ``>LM?J8L$^+->=N`J@D)hm&{lQt^_tZZ`)_{%`BHsUNF* zvxG3g$0{R<_9}rMT(NyoiyBxDGnjN;t`3*H+ZixjgoW73j;%}+yigf_eXh*PBa?q^7} zVDUgW2P1q2IcumErAkz#E4 zKg(65hVLB3ec{rdFJ5?W$jQEij7V3$rB1ZN^->sa`uXDXP1>+6__-TSj-8hCO9cYQ z2pmwmffaLi7~==VJ?WW}3M++T#Q`BDw)zl$&l+cSmuV^6!|66+o7?#LPZ>%FbjT+z z$mvR(oUU}pY1#!p`(}Zxn!ZAJClB$wOa8J}Tww3KiE=m0+JAB6-qdUsgDM-E)Y_E5 zSHUJuHI;#_z{bt>jkTENo&CjfEC5Tqr|Xn=*PUum%AY-M)9GPqn9DQj-jYeci+X61o)f>poCY@d?__vne*E|b@Jp76D&raz#j z4%S;I)YM@e@GPKC&o%B9csv`0qz}-{g<@@J=6EeH82o*w=bYTu-X84}E^F87UuVu& zg?!NeyipKC&C>x8>fhM{p?w$PNuwiiyimf8JNqT2>=I`vbmBQ|?K^4lAb^$Fp0 z17w~xicQ^VuYvw<0O1}JYqC6+td6Z%AKQEKPeyB!@tPHrH7XMq6VV<$eOW|9b<%uC zajVA$1kOMBDt&BW%iC*#s&0%1UG}z6G#z$GU&Ay+nLJxP6YFKg=@y^!l1Cyexxkd#&mI&>YdK%6ebLV!U-Nd;S`e+Gh{jz~z! z;<{vc-F$T&2L_~{MC{f3IT&yxpV)hi&xBV!7z!5#=xmS%uph7+jepksYFpmN(;KU9 z`ns31pMT~$p*CSQILiE*TZ9w2B;eB+M6%}cS|W#-8<#)-=>Gc>Q${1cLgr*c(5AjX zYm1Wy^fhd6@fc^WnDGknX%rDM5hI60{}}s7&tRJm+gQ%LpIAN-7?ShWB%DY;GR-3@ z=|*2l%CH2V?c$j~@OmO4)MHr+w)SZdp)a{h5vW9ldNMCa$TA8?K`d<38MLlAXP+dO z1iLW8OBnR;np<5HpZ0skccPEG0Ps0K40g8)Ms|;Gj1SnGQj)=~$?(<{qg&5&BqJ#Y zvKPw8o(0_z+fE#wOb3D?>~OFznJuZH;0pQsjwEnzn8a0ci!Hh75F^$byP>+R|ID)Y z^ohceqFVZXxBG^Q=ld*ri{j3Xm=%L=6*1~qftfDvsK3rplTiV5V$v27r(eu=q9g@s z7EVE(n?}3gbA1ajxyWqT^U#mK7lOD!xnthe*3ghKm*9y6sPD5A$|mosdHtPjm~KKb z;}8p%X>LVNpQwKMFH^1rZy_2*iu~YlTp7V zO@PoBF5ij-#ljLa=P6s`lON)5DCpQgo+V?7<#9AhG10hr``-rSMOCn6_`y*7+}305 zKv+h>E-4sM3bH0CBskrNIs6( zSEAt`7`5=gzu*NRLmOjL`_PC{Ur+wj&LHHbj@wXZ^d%7+J3Q7lPCk2E@uxxqyaWJ4 zK)kN&E7o?jwZ4gaDKNAclM3pQE(?JU?kGp;`2h+{^W`s?<=onn{;BA8K3%nOD5J!8LTFSmrlWK+@vAhP=;hj;Gj7)QRkP z0Ly;Eb&^WNbpP1Pp580&`ci*5ZDYo31hw1aL?Gq{ILtqVwLGGO7%*F>xat=Pw)KdK zd)5?O#7%8doV0~1>sx(DSdFL}0ZPmLy!z}X82>N8r(y>9RK%>lRu-EfqqE1{-9~IO z6!_~(*775J2_1G;!EWw(R5tPFb=L5uFzlOT$7%1JV&gl55b*G7Ni$8;|C+SYVJowH z(^Q&!2}+7u)2F`7ZPuca(j~Ltd*PS(gvHWNerqdCV=@g^bYGe8!qpa zghBiNg+FDUEa{zH%oXO4tX}XFg@5cX<*L9zmpyUk?#&?7(w7%mY`TX)FH4d-zM1}< zA!);<=I(cyT3A9_cy1;59;+xJUwN%4y^w(VO44-&aY1YRO?o4-3cG<3?0+7S&i|#~ z{Pqp0v$sO8`U_s*w*_Q(cGC}bm>QGag>XQGhGflX89HIyeaQ%p>7{TE*rXBQybhkB zIA3f~5BEQc(;n2AfM~wiuo_>Z`lo&!tUs#`Yht9q(;jU_OnweV-80Zhm~5Xh=!}o6 z0g}v$FJsgRijgeaoH9YWFTU4?ECzWIWnnzw7Z>O%`w!D_be3nI(;!B(T<>znp1RD{ z|Big_=ORCoJyV=sAk8>O%kqnPP#wpb^;E!qmsD9#e~kSA*J1Arh^vfa#Q;@_q5c7N zeuwu6q1&gaN7tLR0M1VbxbwI0v>QgE((aIhncG;h z&#&rbi`udmoviX~Ey+IxC-(mtV9uDEB`3cU3&H|5#&*ER<@uY8^XMN-mj_G9qEzmk zT1?&UEJFeEVl0%;Nh;&(#6HN#AI${RI{yL5wU$kSk6Q$14T67)Y=YmxMR?gmc-bMi z+ahW4Jw0S3BwjKjFw5dQkbU2Ex0gD|C-W;Y<#82Q@foU2vP^pRjT%C_WBpVnv2iMs z+{^>Duz1O)vS1ik&Eza5^H|(!1eQ7UZIg{Vb;X$GoAXgZEzS;iAkQ523b`swGf?t~ z5(Idzwiv3_9Hhm~hZ1igcDafV2s>2G?Ub2s;g}vI{~XMcu4l*4+Zge^-a@+ zLO}K^{IQZ{9qmr6MJIpoQ?9OS&pu-Khmf$05|sVMrTo+QTKK21H-1)iOVwIaek_$Q z5MR>IH-;pB(k%y3B)Xu3RQhr`jinq$k&fN;hLQJ<2eP!m)xx^VnhWs0^>s5u^Uldb zC(mqe5$=HS?%mkj+3aH@#kq4SY7k2wfJPO2bQT^-EE1jY$D+4U_FaiKHJeimZ^95%C3zM+`1rUg6 zPOB@b00|jIn;%TS6nx7A5yq}3G47SAokTw7CUO$J{H=M=^tJ`LaY$^t^a32qJkn*+ zn=?GjGe+oCD{*}eo2#~it+=tHBDcb`qVV3AmIfq;DEg z!PQ@>v1j$mN9H&#-ug4d6tpON46{FgZZyTEcIku8bu0ux1Os}Lqv6yo0RlZJ36L9> zmpN+3slWW&u+en9*0Bg^+=-4YsX|L7j;_^_Z3y57XW{6qrCZm?ZafRdbSAFT&rt>V z?|Vcqq{pD%S#|KHASzEKIn7N3?(#kI& z(Utl=87l7{L{?Pbc=G<9Ur`5<@Ih7(gjdIg_uzp@fEN+AfRTS zq8@|HD@swJKP`TM_8eufyiF4J#pAqsmscA>0AokqY5Z?e(ascf7AgqXFOyFXes0@W>EGLJT$>oTvU3_^!S#iR+~b(;F(nl7WQydH-cE`y$nZweDQ zeQzTz+1?R!7=P=L-qxzkE3%E^Ol!XFNXsUw-+hvb&@)UvZQxrt&!WV_Nfhs5W4k^N zDZ_(!uoyS7ZPtH{PPgT$;83PyhLOU$b1G!zDshH#a6=@bWIW&?ev z8c>$qS^O9uS@B&S6rv?N3~@zpKkgIZ(WHtnv|9;D8EwvhJp!4k|4wQ+uN$>k0z4jd zN4Njv!7q~hkb3gVka!$ZHZk{k)jX!PL!sz)8rhhZ)Q+rFeG-DI`NQcMV>1Wz_}oU}s0d*1H=87;pt`@X zb~T+sb3a+Jg#WG7=N?BdiA%|k|M0i}NZJx?b8OO0Le};xe67Ta@Z1Y?aHyqn52tUo zK1GWl3XYB@UKi^soRCi}XeBVKgtdLeife4P3RSaJvaBn1evUk+IQW2dE){f^*UKDc zMeh-PcQnTr2Q0cf1Zd|TI9ZZ*&Wu9jxrzEtxZ)5AGZSIASx48}yJr1p>(zHa0{NGg zQ;)MCMfK?|^F%Sb)Y=d9G479wFA45&DI$ciZ$j0@Mk>O?Q}&Xi(&l{C1Q0YmaAj46B>tA2>?-u*{Tp>D~~6P`TxN}doxbB%c}!j5DYClxy#2L%G4BMgkxvd(U;U1UNOh(BXld4 zh!M+&qG3?~h{ugbT9=!@-DRWV+2f;MvmeAo+!c0<|AW1XW{d@u7j5k8BCSpR$vnbH z6X32zH+q+$?Zt=dR9TsuBWCRH(y{+F4-jFs&lJh408giv()A#l7CRab@yllT$oB%Er+eI(rT@ zn7x^hFoy*v^m84UV3iEY)vfB~q*%p?y5IwQ8;4QVO>?T(9S#zzcMQAm?9%||gCA`b z0e$lX(a;lpPIH@w7m@Ra#)W$1q)O>7$2?ggTSU)U->$0kv6%Q!=_YP+7$;vY5Av1w zBv*Lnd&VhxeTI+=HRNsv+;^~&@{0>j2i8g15Rn}fX;fbiTyl$+XiuUPrpg=+5Nm_H z^R(+2>@RC+=97d68ijFDOM8epO4h>SER^H&KEy-0gG(UtPjo*1_h4dU3*jSbMDxp# zW@asX3_3JjE(?NbS{{T|Hn(ZH_GpHYwU17`Mo+y3P5wd^OWc5JdYfD38 zooPSfRQs5dq2A-+Rb|z$`c3_$;+CA{A$to_w5?xj_#G9R7(zYZH`Kd`!miiTfLV-Ix1*u_p2KG>q-+}6vq*2VncJyDXl`41?mCki~ zZ@RaqUP=`D7UPZ6`zP{@9$ztO{mhp zN$zy(9!QT*7lqAw;b z3Z<8%IGbB;dnGun)RIN9)@tprB|7cl>wU}|h*~>j{(|Ww)$gn)D~ra?D%)BQ6B95q z^`qNn1L)Lf9YZKCf?#q>VtJFI+Sr8GAI?HcADP&;4Gp68wVaVfT2GAGq|L+oC)TcC zA?WwI(6+U0kzQ5%%wT8I^kqn2hT)-m_P3nFmQP8V{p&*C(-PW2gx*cfP=nfYz z!L|*8(Z!eohC?Tqi{W)Lc#3$@BdMLF6amDUiMQNX$$X2910ZW_?(M`{zn{t>PaJD7z= z58QJS#L8y(PJ%kRf0hS!uhS}ADdR3E-FvCr>g;5L02lh&t@N_R9~tuk3AX< zxlQ)7_86*}adJE31nYD}KBCbIjZ)EZ4LDD`K0}nZJ_1pn+oLwxeT5546I?n%pX>rh{7S^+DHbsa0gjg7U_6-nD>2+*N<1}%)x_h6 z1B%}io=SmRk>@xdr%aJpeF7TB#P(i3%!%qsdHfF-OxR3OP z3OREF#Tqs;V08#7ChfQG0a{N~yJyFt{fQ_ZW@&jYlc6e3Yit0Jr(o9K0h?s7;{t{| zs6;dHiM9=qJO^b_*gY@G76qfL*J(Ak5xEF=K!844UhtXmBVa^;qT>)yi59gZJhq35%d5C?P$TA}OvX*}TqJHmAop%`-8( zfGOr&q`EsXq}lEU-)+#Rty;08^NE_i(me9mrgEO7OX)uzIT=|Q898~fb|5`e(MXL1 zk0>S6x_nG+q_aEQC1TFzMNnqrmBmlfJ9{-kC9Ftc*$!;p<{Sk#S4*PriWsz9g`JQ8 zQ0Ke>F4`rAI_o>&fpq;+x_N2O_NByw2cu3tw~Qk73q!?s!Lz-u&U!R>_b%A+@_}iV z9@gy@X4q>v96B@0m?G*SGtW;Zkmv)0PB)cxSS))OaB(b-PKq|GJeD2ZrYP6p5AcI#Wff z&)g6AosJ^A|Dabz3ri{@xu|@_$@^h&IhH z3&d}?;#{~IJLbP3I&xTSOnnF9u1?o0z71ct`nrg>V$ zjL-F^_W*OAA6@Q-DP&+5U!h2Hx^XzCZ`JLtd(bv8<8<}ft$FqxCDnali@NGS`=7UG zpq)$r0v)b<0iWQyQy3hB(?84vb>R+DGbp=%|5<7A`zwDg;$G~5alPmONfPZZkz)*u zgo1xM{C-%`KUvW~+e-XIz+8r*LSbKHc$)`_GZoGiQaI=KWGQ?tQQ@51Go%m2msJtW zD)$~W%<9VQ*;1xpZMl6Q4n-qAv~AYJp!gDr-?TpB!dXF1El zJW7@|88iBm={?)!{8avj#$FVnwIbvU=w zuW@owPaNHtJh&G4pE^}M7$!%w*Z^OX&_kkslSNe&h>pGIARxt03c!r$P&IolBfL#09Y%! zE=v*avyXqRGv;YnE`R&l)s5#~^E}0BgjNL@P3HglF4o=p&XCma&dNYD+rpz~&bIig zPsI%BXh_iuI9H({keK0g($xqjnz&798v5$S_wIrEgZlz~3nce-qU160m5I~6cm2EM zn2NY-=1W+5;P`Cs+@O?lK2`G9BJy0H_AZBif zYWR>z&YcM!kyO@tdu`^XB8Rug9FE=lb7;VWp@>#RY`8x&I+VS0Aj$v6-t{6Ubyp_N0uQ% zaq7sV#bZJOFtTE#AwxLOIgzoj>p*BEv4=j$!u{4oxqvpES3Y3l!bJRH zbxL5pf0q<4D&)(&>`@Ibv|j626cQ8o2ZErI59|@ubC0(^w93o8I>XC!H0h**SHb6H z?y%SHJn9GpSSjw*FZ0sx@QQc06<7mc2Y_D4khlY{qTB~(5{%Vu-)P7~NS?qd_aLC7 z(aB_vzz}ij61mZK)-hiT4u^*b(66y!vCBGSQqv0=t%T34(ug50U3^%{tDL$vms25$ z_Q;}d(2@CQ&bbMg+s+5RKgC?7n{iBFW9Ij1{o?ubL`TRG`A_nS2Y!6QUfwGCH?R3VYIic#T3c2h%~bcynOM&aX(&d{RR_r2cCtcrk;{S`Y8*>rX{^)cwyX9-$@mvochi%<8Z7YT>n3cC!eghz$PjbkoH}-q z9X(wf@i@QA)zSWA#kwPh>vlVwV@aGc^q^P>7j`!}&r8`U6YE4dENj9))8m7_m90U} zSudRvt@Fh3?viDQFQPmdga*$=^}DYo-}xCg__fh(ckdqYp8SNlv&Sw*XQh8Fwt@!Q zMdNs;*87noZrDrQEk$b3S)L*#bSCBalJF;#XsO^^g=m5}DTs{NA*2+-mV{yuD_MQ= z*xiy+anA0ByC+`F{XwjNV27v`$7Vr{Y#^#IjIbMAYdhtTbj#{>C*|K{nQHvWzFC}WezaIfP zqH%3RO7wD&zF`LqnNS~3PRX1Pmp%LHajwNR)=r{-Yiyl#dw6(~*{gG>zU#Ic&=V9C zxl+z(5~_For>uiDc)@yAU+?-9W56k|Q&F(eKtNO?7_qpc$4++jvcuzY<=O%uz(62| z1kxe52|-sS?VN0Lj`bpU0+Xs!`$2v#Ov^wqO%+#)REWDXB#l}>3T)_#@a@jhNTOIwiXOc76@%_ z!^FF3qTMjzu3I)<2dj+n-jHh4IU3M|58vD2I2KAvb%`CXOO$o?< zb^EJ~^~qm*>A&c3T27e+Co!?(*Ieeiw2gzm|L1D}4gVs1xB>yz{Pv8%@cV!LQdQQi zjrw}c`~4VGdi55LSoeNF;{!MS8)yl`bA!|q74(nY*Fl;SS-;DkRN(fj;z2N%z04&l z!(lTeR)*MjN2n2fSJh`uXaPoQ(()@k=};kBOEp_s@7E9Ba5+4PKSJ4UwSfS=&!GQN z9QNY-mO*=^=C|*+3oHc$ifS*}s2OZ}-Ah1oJ+*s)G-T<4vK<8-jWBJdEf%aESBj6u zqce!J6j^ZQwGk-L`kGE*>*xB>Ec=2m&_*i>vL~tyE;b_<=-nDKu0lie(4e8Q)mxZe zNiH%ms8A4yZMKHNLznRiq2Y~zERr%+--v+f_{jr#-*DrJFh3(palDuc{)A!Lp+t{b zN)GreU;!j0F_ok@a-Z{m?pM_~YZ!EN#mtxOC#wpVJ zliWC$dzW&A`+E6L&o>yXKQApf$5)p<8+%#h-y2G7o zgf{VKezvFZpcH6n5-FltAw8;yBP1rJ5+q_iSrX|OqgEH0aF5?c5U79DFiT4C@p8m8 zI7DyM*{y1JFba#68bq=|sOZtB?;rQ#U>Mgx80#hD9@};FVs)?mGs&#CFx{+o6 z?K{p!WLIr>6s^&WdCs+cpyM-K^o{K*s%E-T3Evt`F`TPk51HJFRzOS)nTP(FNJ)sem=uZ zwv9L3UFF(~RNZLRSQ}`gzec%`HT)ob5j_rr;hZM({k>1BNY8!LnsiDQ?WG3`v0NjE z=N21?+^Iy-3xKR?gahkN%u;A#3npP?5@$_R@JV+QLy1Ez`ra_ne>YaU`9-QFgIOSOI9_allGT zI4HTr+8*Z~Ib1b~ytEbw z_Jl`jq}|RG5<+^{CbsqE`c?xX9&i(D z0Uhq3W<)FIt??7=nddY}!bF&fH;D#=qRxmrVzH!9T$e;~k1@_vR2uX0efL%e>lFPl zzJOqLP0NM7JQe+ z8C?9277zpeL{cmw9#(XJkr>}{;%d@(_ktTd+p+6*xYi91Lu9FQi#leW4SxbL?KQJE zqU)yN2`1Sae=act6Bs2^ZVU6-sZ4I!8RI0`7gT<+&I=UQrkov=&XT@CEQmsF8{B9m z{sKb+eL{Z9fdM|vdob7H#f%gJV6y>K?;jgY6T4`~@OjS!k+?1f1=qXSkTe7C3y*;W zlk4zf<1s_77ruaSFAN|}TNs%KLvs`pnG)Fzx;#ZfixnJR($nmY*E^bu^n z>voL;)VL0zM%E|`6^GIl?`rVhe8$6co6S7!_}i;{Vk>-T6wZ?9lttwCn$uoz zBX-$j+03kF@MoGR&Yj7e58UWLyK2xQJnXPr)I~1=0C6}p?bY!~#%cK>RAjrJ&e$st zwFI~*vV+Z@F!oS@+)QWn=}IvY|U`xX2|SG#AF($ zWbpDq5yE=E0Ig*Z^smRoy)wx5pk5tkGpsx7N<;IXf~b0rh701p75d4sb>;TOZq@i= zK`PVZ1TP;k5l;HST;A_L9-XITs)-QDMl%WaP$nHD+1t=w(=MtyXjst)rdHuXifaLn4#WaE?Pxv*Y;Hp8GT zG_77}TD_2{3&{r0Db<8N1Fxj@Dzxu+6m|wqGr}=~9LjW!y|%^kbs;G@+eE<6URHd5 z(KoQK5S}%{4W}bwerhDK+Sy-Qst{<>@^?YVVCC$yIpG$83sm)>y9hp0OGNkdl%d`f zNUgjcd)I3fN|~OGK}BI7<;R=C`#tJuN6lkL_;wocupwKSLjSla@Ok~k$+W#BGgAj5Z^W;C%HScMN}Qe#R+gR z@{Hg2fVnv+T98D%w(ZhX;pIY;CcA2rAXLfn7wBI|rAF+^+`JY3@pY+q~eyK%= z%*!2V+`nF7Q;9dgC1&E=78)Rr23s7%-T)Rq{PqPtm_2Ap2au5ILOSx0KJO}L=wKlr z$=qiHfVWu(ex;_XZU8lt}t@7>`#*b3?{@JPsnrBj(+H zcWl)uTOk5zcsZwpPQvuu^1ZdiZh3vs3o9+;LdeXpi(70dh zkd7tiG3O9dZL#Xf{eHVww}T<|4cYY)&&CeGKlGy$+L9qJj$WnPtlJ%8Zkke*tb3y2 z#c$pkkUPE_v|PyFJS$gr3~xIL6CW|_y_#?^u5m%>t0O%e$s+kfU98}Go-uI?VIMwW zN62~7h>GZk+N|JwZC668L7^BBgy&Mmww?AFyQ9w~7)5AUs9B)cgX)W+E+2GtLg0wu zutXeApFEj)FWLA!uN6YR(WE~!-bN1S0<@YpDn!aCRrh8=Z~ik4M(ndcMvVX?FQ+B& zw1XrkFjZ8!3p>Y0w3=g7 zu|3Rq7fWo>8*6O2zDnVTZ4O^_kLXDxp zkZUL~lo%*9(@ckcVp)*H6-Gc;442v!2>F$W?4cbIyTe`>Sd9u#9z$!sdBdHPQ{?Kz zBR-gh7lJ2}y?ZrT3X2BISTjR)2%%HZ_PfemSc}SW6oJR#Tx*8;2^dLSp>O|hazg_@D>tD$n(Um5MJ?#cp*1=3wra3#ttsS20Ug1 z;oLA%n)7mnbqNrB-cgc30#t6&E88*K3J*^ebF;PFyoT!O_OXe&Yk(~6i8lpJq3zM+A<`#=Q<=MxaVPg z!iAG$htMJP($+U~$~$hjw{Co+;5MqcHkfZo(qVT<&1-pFx|xk?cso2H)x4Ew=_I4XJ^Ss*5HGy)c zotrSomP^gv)*)LGevJ=SS=f-wY4``4z2OdB+)a(1kb3?IVc`CEvX`n;-wP zN(`32(F+e^SVMhB1))^Xm0wQeX@p>2R>i;*PbOswv4ra?=Eo9UM=VY#Oo=6yJ>%gI zq>btoKN1+K;crbV=IucTa^? zZYXXTRLjp1=p&3u#ZxY?j7oN=30RwwQ+Cloz}?C}9b2l&Dae-%IWc`CYcmYT2r<;; zSF8Q?I3p%W-1PiSQyGHwf68*pN+~8>N#5 z`MpAd*M<9CH=1I)(ZM+vC{Pbr)eNxqHhVmaKp9sscx-6xaoyO1SVPaG-Pr7mcl5m*rZ)i%-&p7hb{j3oeAK z;^k9GbxXBZ$OA?kWMM`cxZcy=W}?*XOQnBglaQ%qd6v`kE0`>o-o2du`zxt*nUl+0 zn;vcH%I}@!=AA6wS1vH#$iz-$b@jX_Q_AkBnqv)A!E>}!ouMkNHY|Ilno7nL<(0k^ zb#yw$wNg)NI45!m#ao05)nO`Cj}aCt2GQnmC91%-;W@g@BhrpD2@V*Q_}+#v)AOk5 zDw#Ltpr;$G+VG?fQF11}wo&NiJ;IP6xReAfNBWG|P-t9R2pDdWd7&8w;!S!?p+O-N zBu_rnS(EBxC$_u}tXrA_ zEpd4n*{%miKi$?bskC-zowxGORGzM--2L|W&r zIoGrjuZ7~341{K;cZQEbQfwcOo4ki-vlm`ynwa^)S9x!hDBzq=^Y^%q3XpL~_yFc6 zud#9OtosKQ?|1=sR~q1j`X#-H3mH>Nv5ixo?xF%oj5UaBOFbVy1BcNKKh1t zdl}4onCE@ah-qU;4A!!c8bZDVA~Xd3TbM=4QPhn%R@mWV`=8Phb) zQrgKf+Qsthyw_Qi&FQh0=2@RDm`RH@U+F+CP+G2qS{%#=S{mtiHl55~S2~*j9egfb zD9*t83V$JPZ?<*_wU{U(xL=sPmt}^Lz=-Qvvz#E^KAG;H+{=F?|4ucwkq)&F+-YC* z2YF-ldCSwq^QrQAH|yXhG`m`Pc9;6X=1EY@cNhCsgygBqcPI2j8b6&TPk&QsPHedqI1+`hm9 zG8^kRGXi3BAt*#pGy_Z_0wkUZqq#A-WDMRjr61fk3iDP6W*??O{wvdzljG0VI(6+@ zDGs>yk14?X2SxId88zgn0pV#Y#K4m;i(LtgZt(uH=6Ky z{e@3XblX-vq!0?>)ii6mDQylGoXMS)_Q&!X64>Al zYzPLdOXh{flxmL|0Oi%tcXIe62qy;?$Q#&0#C5wJ}lh<`~xx>5An;&TG;3n*Vxzd8dYA+c& z$(!@}v`ccynLFA`rc6s^nq>vev6ALlMGHmCj>(ipsv$SOAa73ep&v?Ie9^v)0Uuxp z!;b1OE1U522NAuQlnvP|H`J0_{%g#sUL~TKfUhmz@;X7|O>Kj$Etnc#DguCeRck@FtPv~Q= zI=^D|{O7ezefXXJ&+~hCul&8fk_$E8BXyaOy8LPA@))VhXF`{6g`AgP>20;n4v&E^ zfu|v_xpi{zr=S2I0!#1|_$v4=BxKTSz+1qdf)9fyz!$;OaGtPoCamm_!Q0{dT}#fp zm+bxEG4Lty8So_d3$TSe_@sxy2)qdr{-^WSjq3BRR=xe6ReYesXTV>AZ$pN>>{TEE zZv*cD?*)&8uY&Kw`A|r2YVfv#cY#lWC3q5Sz&F9ukXMSbSA*XLV=y(A_hTy>*t}+@ zXGqWsj5?un3@SP!NM|Z)*K>?|yL_F#{PrYhU!yM*@!jtSmRT0BXgLvf$aGn6UaM#ntyL@2Ix%S;xJw^fL>R}ju4Y2jmwl8O4~W>{;9 zCB$%5FVoD8<<%!HO0ZA2(sgAV?JtDu{n1C1m-OvXz#uN#b-*4LNBsVYo3J((lr0!c z#5`Oyn2FAPa}t^~tbjYOU&i&}DK@^;dzZz4(r&e_n{1h9z=0^J#xmglQDU zQs?PPCb-?m#6{I;FGwq&%q>7&j~GQ{F|0KK%Yn~=>;-@l1fUWIE2r#=qNdB&ixBa$k=uGF$njc*+J5Z>OgP8j3!-pg? zm`G;qN?AjR3Y(sQKT5NvOP3HSt=Y6evsRZFgnt)GKl(Yuz^p$^gb^~81>dihHFNsN z6St-macI|?8+E$%{a!QdIWm;*ADHvYPu4kUx9gm>A5RaY$Xd=pAx&^PBCIsh(01%L zQSZw_io`8R-}dU*2tH!+<@u=`)i>`GxMt*0yAv3_nPlw__`POw<_Ir4U|uIzh=OQB zy9Rze6f;SC3@?fbN;H&2ioNv?0>QPw7puYGl4weY(}#|wAG5TbL6U-I`it(9;_q@M^k{}&LUOMGfivS1yzFa)8^J9+ZnB5?#q34CjvZoK zs7h8@pZZw!5jtKcQ$x; zK>@qmjIzPU3LXc44n7aQ2>uFu4>G7V1aAaW$n5`l`9}4bx9aW3R#A2MJop<(zX4tg z#^5dBQSe@{01end9{%)N)n?j=M+0;4XW(<-i{M+32Y(<0uLFMoQt&qL9%FewzTzv8 zu~*;WV$J7tqwnru0I%jN7na@~<>)&LW!=d9;73k~tF`a#lBDo&7t9Z9?h>AWX@4cc zUNivq2Mfd)Za3_sH2Vt8p7v|kf7|@<-m~%{4a21kerH-5zz(rLUgxHKCHAirSIo88 z)NfM5W?JSU!4+|LVsP0$4FVr>c_d=*O6AAXx|haDmN)L+m@)Eq(K#W?@S0@;_*ANY z1eW5ZI3C-FeLSP7&yOu*E6F|lm@UG)Jt^cM!O%Y$%^-)A(A7x}J>xi(O5yRa+Qwko z-1x#4^-BMidF+XlPslu)?mcBt#@Q8&ZXBFyBtC+? ziN$|1^*Ln*+`v1_MDRv^z*G8yaxpGIb2$zy5(vlats}xxHWy^^>wSunOb|REb9|*6 zN;e(hc@e)cF`IB?qhf?&;GwdkP3WUZJIFIq#u@!w@*y&ebE7uV{ddfL)+3B9Y=e@a z^8kKf%rZCn3w#a~ZuAw{D4f|WVFs*+)Q(eEr`OywtEF7RI5i&9O-rv`zgKTf?)y-;kCA36bK$=MJA9PQ8}^ags8ms z0QZ&h+YI0yTaXIvGCQL@?z}}&!^;5F4kIx)BXU^_O?fFexA+LbQRDMo`lTg&+k+v< z!|?Uz6zb+|)hOp=tHM@qeKiN>TEd>Pu;YUlJ9N-z?QQ~to znle5OV~%Oi@MiPVdG|O$546uaaNYp{G}n+2L)QET{N^oD#>eUjIA$kt8OjoKo-}G$ z2;i3cBFdg=kx5!Im)fpubTa3!mqA_O%zV{|rs%uUh@DuTC@q({tJ77!UgyqR#M&hEDOfQ6Quxb~gw(GKxpob5P|HT=D$fs0O0^jM3Fy030-sN-Z( zt9uwn5uU#;qaVny$rd~1GnX701YE;zMUg3aLQq0 zWHhOtYO{9;D|Yuh;^n|KFrut#1fRhUB`J z{cde){NOid>gJ|>Tn#H$C#vDZ>Xw2$H%Oi(3SZ}tNG1mLFtp5g0E z(6k z9TOP43_c4%=Nj?=Ad92sdu1&NM#G_NZf{gf^jb>Bx~7p>+GN9`8(6_itq)im10EYe z%hK?t+d&~k1%)uA4{0BrIioIgN&5w7+rtr9_s=;&Xi{gJD9p@09-2K8bv5C0n*M)0 zN9IAIpKp0o#P0}t++vf#7n_4&`Dk>_>w7m@USE{S(6pAzKLBo80_UE}7>U)sP8HkQr+qf;Z|l&`_Il=J5Ic-t z*^p*E?04QpDAE}3&yH-}2nt_K_GsUSlpGRhkXV?GE1L&#J}w_z#Tr zP#Lyz!xO*>Zo&uYRs}qR03<`Y>;$J0lrzS=o@Og%I~L9qb{v?=XAMOyz}qC5k=p`vJp4~?_dWMZ>ssl^MF<{3^&}` zU2{jYy9g$x2HEaEbgA^fO3f){{rB0IOCRl;F8A307`olh%#I_oHijkVxR zq-WSx|1;h>ukqO9DVP6NBt#y88|Og6>>CP|YK|0=E^Nw+;<2;SZGmyv_W7uN)TXn= zG(3H*JUAG{aAI55_nVP zXzkMxZS@|pKP<}cNYFi(gsyS%J}9WDF8#EGafLZ+e#;!e(~<8G<~wMrg`;_n@i1T* z01-WNc8|EbNNJs-0udrOLx%|S_O(GGqvBiJK{AI z9K_^fV_Pt8QybsbkMbs(;}#tK@lARHsRFvPSzk3KJ3qYheOjJ~%>U72><}Fzd6qcw zQJo}?Z`~^bF%Ko+W?jV&(rvnAiEt^s(adHi3-A?=W4|>*DnXqdve8qFTaTmd(}67L zg-7S|ErPC`T%EsegYj``p=F8A7*A&Sl%F@~KQW1c1#i2qa@G>2;T#NjmqUc6E6K$g zx(YCGlUX2o7C~DlBCid(a}19MiM1TLP@FY|a~7Ml6V-q|=LtO$lhU!%^zUr8?l~C) z(t~%w=myV~{E(Vg{g-O(o1T8fx9B92 zs(_S0*c8m?Qj5eH^9-RRTaY=L0Vu)`TK0Z**Vs5ExfqWhUL}OalKO<`sxbnW9$ zJv?vaCH)|`jQKUyCnl)L36+5uH*>TS{fDkG?H^=|2`!$YlU zANrXbec@XA1TkJq4J&Ro-(Ea0Q$<1l*$3gb(A7Z90I9=tl-$m7-uShNk|F?fZ>UNl ztNfk_lQuq_6GZ{#0*WxPqonyO@lSwI+w&tW%f)EwAVh$2a>s#*ChsV~BZIo_5CWmie9_ox<*-Nu`W znf*7U#A*k3!1kRR>Pv1*|Ln<&j^A>dj(-`j7wmD@6uy6^hb_aW1DjXSnfki*^bWR% zcsqa%_Qw+9U}99y28#tC`kLOJQUy(ENKWg|w#l0*&*%4RqTreJh(mXT>5bY*p}}@d z6=FN4tjD&XnCk=Evot!*5oc;c(CCu^U?Gr(fWk+#cuzOissF4}4{B^+s25SUZ?fdv zaol4vSKg%9-dx8`@mJY~Ew~;tQ;rRAoI|Us-fD-VtBK?8rNZ-4K}c+jN*UZw;2VQP zi7<{#-1u41tcHDrX8zH6#Ue!E=}T0jU186eazN%7@0X*9bow~(kN!Uhh>MgT`|Sed zk5ZwzNs*cr$W);s7xQuD$3%DWR@Z>Uh7!2Kn>h~7B`J+QR4&{dpU{nzC@W3xIe$&2 zgOeb8K}%x_BlP9=p}(C=i5nQ%WMs33vXfc-)5Vw8AkY$NA{b)$A{n=e|CplP#*hVR zJ%g190;8)0?N}yjnB~j_B@t*8mI{%4sr;uAuv72!9_zqcpTLdpGatP1)=quwKm9?m zg|%A|W|x2Qqe5uqq&^v#)2Y)2)0rN{@eB#^x2-m$p z*a)>L{!4vPj`krFnAk8D{%`OMk1OG`c>%s4|YS8l+N(FR`fJ6eV^q%JLg`y}^>Mt*e1&3E_II3dF3li19PzhKqGga({(Gb2>&Sl@D~m5o1Mr%f_Mb@fL| zKZy-AW`AY|M@n)i$*2zP-vlkZl0&FhLHEwOoM))r`Mgz?PGXi!W$|`a_2fB)TtJ@b zefg{ua^{}=Ahj}u^xM_NS1yInbrI|~!CTdMZ8OBk_6XHY4EzwWDB2pO2L(Ck{~rQt zA!;6J>lr@-RZ$~%ZhrOJj~`xQ(+Z&6LsEJ%WGF{LYQDuU)ta@*ThR>%sIYQIlfq)9E#ZLG-hDo)6c z8qNj-X;=8CpO;#w)(ipx%o=3CJl|oy->Q%{cMye&>GO03Y;?(OZ=BLNwNnE>kF};r z3|8Bk)Fh?{Z!Fb*rA#TsQ|7Pjlt4$G3kBp|VOeIK)h_P}?LorJ-7pO<-Nnr>c6(Pz z1Z+(c@>;=oct(18zOfm&iRtRSb~u34FuPJ+U^iI};^r{)C+)ApE?jBIL{k%P^-FIV zX=$4Obyj7P`1%1fd0km5jIO^7g?<*7px{DyNT9Bi=p`i|V^sb_(&)S9-dK%N1LuM- zcG_vrc5HD(!*1+h*Mk)+_o|w%{d=sp?+D?wIq(uM@uC;K`macGWss>t&(}^kx|TwxPG}HdeEvgrmzoW0b7F}l7A;!E!Xyt{RPjT0znl&4&4sski#NULt$ROC znUf8(A75t-`XM`;vklMY#v>l_&_fS1y$fCa=!e{fqM|{MGKJ*DcN6O;^=a}D4 zOhWO!#r3pfTEL-6KHIs$?Gz6?ZKD^oTd?yiPU<<*jSFcte6rQ>l-7iIwi;HpCcH{( z!d_YvdTC9#N^8O>T}{Zx8qS5d9z02qSjlq-<>j@Vp3NK=+Eg@1Q*%tn)P4xE9MX@h zbgUj`YIzg&my;4=X)GzPK$WUFo+{zHCPQl6NHrf>s(Hv#%|#bN08X#!^=*cLMuY?h ztsgqlbDoTr61}PG>3X0xmgio-kWg5zwcXae_rGu0Su0Pp7?LPRTg~l?Lh&R{d;Uep z2LcLKg|KAw9Avxs)zf!;zw1Eyl?na61Z;ocCGz|Hn~x12)put2m6tbyd zTlhMgpIMl13+8=R_ghR*avSre;D_MA6ueI7iJ8rp(50Fi4As{hPS+ZpoAE2m<^jq) z%e|&g3tsZyudz+tNwJ?59$AISkq3xS!$8)a99l`Y7 z(Ab*Q5Xq^gaFPA!S%h8hDgrkS^p&8tkS_UHQ|!W?4#7a1a1u1keu^d$=otBypb?L( zaKj}xvnr>Bx~aMXY9*hlGZ0r1RTgf~#at$g>5+nacKLGvl*Pzt@JfQSc2(%9$jwti z#2nRJ=i`)52+>W^4)4M;r{Q~4w&oZLH1z}6r%Xt<=tm?w=!dlJAxN@3EoaNNzzd<} zK$cxob~#FXO8{`w&Dwi@x>ACMrerG}BxAKe`7b(`En&8;8jYsX23I_9`fN6x`e>#1%tbEry3 zxH2!SDaf-_t);Q=J1u(X{-t!6xlgoQKXgX*)cpr>@=LHFZMYP+%SB(QWMb~O50^?3 zrl+}`+j|b=gf}bNj99ngQae&?ldXl+{PC=JGV>ZHraoxb2S3qHK5AbV%eb)N}}aHRZq8qc7RGoGwFNq*biP3yo%zC(%$7;vT(s zf%eR$v5F8Pmhku20f^7*);(gVp`Eyt z?=NGR5X|w-#6I2(u!xroUx;+KJ!h}`^6=a=TNi3NEXVY4Nd1KZ$09&wvXG$GMOn3} zU+X(IAiYciIxAO?(YC#%X-N;bn;nYPuPmP6{k8ss*m)dV!8 z(1_Kk2aD1xL0Df_&yR`T!lLPH)QRpi;p`U5)~QUF^pt-ihf&7Y6G5UjV<8bs=(Nlr zzN{4<+@0D2UI)2w0WKo0or791-{Sdy7a3Tg#?f!O#mU37V1ab`Eg4>2v1%A-N`23R zW0lZ9!ayb!jVnWjrwPdFS_wZ?O#)i3aNOrs;^+@Ussa_TgnV$ga}%q8t5AJw0D-P{ zghJF))g)Fuv|^y1Xn+vZ_WlPAMH*PNcF^x7kLP346*`)KC-nrfT7Loh!M~FIG;)O4Emo zPD#N)rgiCdn_f18fYwnGGjZIdTX%`s0eXRB$_@&b3o zLR-8CRZ1lGZ~3BEtPk13{;{jhF;7!O%i5^@hH-;wqdsd548*fm2Z(2(zkNz&m4iq# zEc8d>tib}yeZ9rHSL3~b6e?4S`)!QFkb?E75|rhJIMKi~5bx&Bp_C*fxy#(b`0OM} zYeZKw8cA!VdwJRUBJBkB&>wRa@w_GE+f&Nhp{r@b_n=`AuE5*XL%EsWmPfSMtSfmM zvD{ZoH01;idIu3^IG`uC$2l~Ts7IPsN7JzqPG|djA@)N7LyPj~z~PTo^GG&w6bm5F zRBe5)g6TwT<`3R^(FDKXfeGw>ze|c#oOv)zybM@z3s((=1(W;jXc7S;t~W*}M7}bc z5XTHUB?!&!;2%>ZfmIVy7hJBZdg~MYapBl&Ns3}bNVK+z%7imtsAaU6QQ*=~aFhrup<$f%$;glqkjDV6`imbep z>RjCATk`N>hZ3GE&xC@}X`q^L*&oGS+4 zdZ_&Otv;r1teH~Tlv7f?K@|+qpi{9f3_VmEc-}LWt*N@;LUyjY^WK3|&kOVCz9E8Z zJ9IS3fL~$b`;85snPQr`DO~p42QoO`q4$&Y`5gwIy*7AMhZvvde$NkAakN7pCrSJf zI`4le1;1L+6^3Zf#~%^k;@(8&6`BE_`%1WQyhERBy4s-d2mBC2 zp=TI9;4W@(sF-7t!=4{L?Tsv6vH2cg9>cJo-;!xk!qNNa#3{z!X%)cYg11KTZcOS|$&{v%X(!YUE zelmcH(a8^OlD+Z&U=QBFxsD2NS;oT!I!%)h^P`FMwc2fw!B{e_P6Ul>c+*}IhX5Ue z0B-_F-)>SAOFVHFX|fSQsqiBU8YSBd77WZ2Ain}c1LPARUx5Mg6CnROiwydoq!6q= zlk_DRd_vR|pX$m7sa@7T?>5w)UBl;JtLroxx0t|pg=Qq%v? zzyZ-;(b8Y^)6=kjw;SL)94G$Y`2-<>L{0x}xE66$=akB4OB5w7KYL8dd~B(tiCo1&Q8fQ!K^Bmi!lOmn)3 zZwz1yCXBICSnxA;RE`eoUV!RF`L>k#$p-#J!^A94ofkQxu885HxrLz{4KD?7ryy|B znc|~9i!o;B`~>nEr>XH>*H#8v?9A`L^Q!HReck=Fj_p(#(Ws6?3$X}pP?HD;FpWVxC znua+^>3BKP*o|0G3|K3E^q6ATx5_(v7x)@p$5n@h_5)wS{m>sfidthD(YFLAwC-P@ zuA6(kRQj?kd!;K4pDRKkjDhf{5ywOs;Q%gx_}Ou zXor<-r;0mu|MRMghxyD&Zjx*CZf~Pb;53_D4WRYbGlM)S_3P`Y<-5<>r%*R&h9SO5 z8Yxyfk~VKS96@Bq(~h83U8TJ!{xu@}hUYd{KsK!K(~BPTDSm^78r(}uclH}U77-^S&~ApTU96c3 znrD=|LD8jkr60}$Safe?%lncm{yx_XrOT@jYkQ9?bM7K&xbG^$yXu9OLV1{i51j?+ z-t({XKUOX;(qJnTM_+#jVqK_D)f-1ZxNOOYj^xGd z876s#P4AI460SzVY9wr@5_)kQHNDs%q`E5RykxUFKzIhYZmN#x?9aiq%ku=o$H&O6 zc?zp`b$ADTf6DjIoM&PXNvHT)h6;;>y+Tye#f`lKTVWBoEXhTlE0jUGBc28sxN7&rC+57e@UBNEx z8HZqhHvCj)Fs*Npy04SETC#<`*JmCTt#cb>Hy|+a*<~N{O!?v^ha+)UO-dM>ID3i zC8JGG`~tJOO?#||wUnMw>351OT6bl&vC0x_zqy8hTd0GV2F{M(_^brp=66_8bc?v8 zxUP~E-2=cTUFFBl94N+JNC#vteyOmn@bIO)-h<;fu?pe{g#%!g8J&uNWkA4mXO$89 zQ3Vc!>P@S2{EkQSB*HiX==IODvEwfQIDP*=7;CeFWg&SFNu(9MwICx)m)NXwy`a(~ zN;lL~NJ2N!y(HjHr-7WJT}D);%w<9}ZB121xI4rFi(eIFkbKP#1s~}kFpUWkm2{g! zM6au|T%#6GU->exQ3(|)PfP?ft*kJq0O!&eo3b*)Z{JH8WMQ?$NyP4{+T$B~k^$rG z5)`D6_b}zy?EZ+bm3l{c%3y4xhvc#&n$ ztS7c+h6o~FZHzqmFLPpzdtQL_U%xvECLA5gez`;H+$OcAH6a;j&_JN7gyb&Gyh2qH zBehz4Dm|!ZO5H@zk2MnOjYR+i{&-i(ma{(a!J#t(cKZGs6*cdr?Kh+rzQMMkYT)JdUDlYk1lxH&$K$aZRg72xZmmAe7=mz4fGr*hxbRQ)sQzlC+xVFHVjR^PK{yuI-{XbXiZ_YSoN#2F|9p^VDfSuPyeuu)`e1udwLW>l9Y;slndO z>&D_nr)#7-&0c1GUuWtJGQB8_1g_u zueK&Zo*}D~<(sRYjG6C+9SwFT=py9ETl!AQ{m_rF`jpPZ?DO0E)mGLF2EepO`6_ zGi7!*S*;&FY(dGkn~S_?5Vf^h#hx&)VeYqt>06Nn2bc^tvTxlT{7c#9nze<*HO3zZ zNNK>C-F*E5dJ~tW*&##?#e} zU)(#TN~C|+qJ`T^A_>K5z(V)Oo?MseXSI;9;#V# zX_u`b>bVr(0iK6vToDF>AIPNfI`Fp9>bt-M_|5C*GyDKyQ%pL=uJ5GqxE)^Hc0oMic(3beib zu@63la5c^m-)~Xgf%M`ciMXPacsU)6VuKFbiXgM&c(|E&{5fmtssWMxgficx^$JmN zXdUB?*(945<(s*&ttKsV_j({G!x9;I*X90F9DPTN0eYY&){y zNLpL^*uBER4sKwPh=mRd`cCfWsDP+`PdYF?O;O1KT4=4VMR%=wBw6G%^duEHIw(|W zj?7e$r9Tk8QE5NxEbuD2@9-9QX&#^`c;6f=qIh9`KeLFIKPrt!_P)lyH}Fs$n1Sz` z=1YMu%p)HxBJyV?aAo(mi*EzlC*H+DAN^nlP-si^MA`?vlJg8S2+{&0yu{)QK-_31 z!T-peLGc5|J8KYzlW!aVPxi%&9XA{PGEtY*;oD|1yBfvTrk;RC18{Hh3rvs-$R=n4MD z$mM#utm`%0__l^6L|F{@rhwI4hm|?VweNG7-Ej5H#|$KEPNvV5c=(QhPG9urOItxb zE$Pe)6O`-OkcBlyx8dX9vSvPVwyZ<&!_yBzwi?AKi z$^i;;9pvf7P#VRi-QnSN2nU<-CcwJXm`aIDuG>SKQbRdK@y16^ayzHY^s|WvqDo@< z1yp+eG)^@nB>qKyAUS1E$GNmW{rcTXn#y=G+obxyumfqTLl=OsU1xG{A)k9>0fkFctHrWeISi)bogl=6FS1);{C&#V| zT*b@Rv|=Gmd-Ma(^H5e|s>k#mfgB|ylh5A~Ok&<4eObj6Z)|CP$|q=QPuuBPYk6~9 z!N=wd=1LJ?K9Sd8VT?g(4gjDqB9H`S)PWz5$-m^wsvF>x!*v6ka;c)?7%)@YKtVa> z5eoW*wOxx6T4qvar%A9m*d}C8Hm>E{Rh)@mO|}WlZklZd#y>$7(B5nvu%=Bx4Yq9& zUOr7OJuGo=_Wh4C!$dJW0a*=mF+Qk7Q@gSb2+J)NEPN<3w($}-}Ryy#3W03>*&n3+F94Ze<+EA?n2Q- z{^YbH${kRV)&VX<&-6DM*yFu}Ck6GLFH_uJcqlS3Gujk;J^)pk3&3hxt%p15bOe;} zO~9~^I-4PD0lOpu@1sve8duv1HSp9bZAM3-}KPcH>S&)P7; z@yU1W4Fm%N1sLkBqN0K4C>|r6W)6XCG~)&+0VL9*wQOsk}eUUnG$M0 zpDtx>NgK6Om4$fQ$~-1h>T)Ln>8S|^+C$|-B3zPAnA8HZu)vTGU)90p$ZX!V5Q8wk zl>IO+XgLefVCERA!nM5BVns`E$4B+LxKj;-#i!2|U*m#xVG9+s#*_6~tpaDLb-~=S=q#@r~eP8P^e)7%@Ubxh?}sEW{CmH3?&7sKhWq$qqIjmFeU2y|LaV)rv#j`w*0iKm!M zq@3u40gYY^JoT`vO>G|@U!a8vC zr8u$>g2Baa1%gX#=#A*-;#ywE;Q%W3paj0g=@J#=L&dC*n91%vI1p5;wb{VzKLfEC zx#I;3daGIX2)Sc&sz4in2~(^j2nvXLmP83B`Zc$j948!vQ%C4By>O+@8O;V5OCvY* z&%;v1x(Wc)oq6X-SB;fli`uit2!p5yX|M?>pyp zG7|%~esDIoQr4tK2(RS!@;la$E?lVxO~c9hI|m7Ml8Q^^OlzWJvT(#y2XV>E^bq>f z0mo3bBL=b+ec*u=wN;soxFI(|>j7@5^ehjOr^of=zG=v=KaPsr=iVr3Eo#SvX+X{O zd|LMAvzPo`VKD5wo5)?O1h9X-9@&Qe<=YhI-Dr~DZQzZ9H(uFrW8SF$>c$8Lk&yxs z=Md*y(MGT(7mSmz_ouD(aSYNe+2RC76UHKpLKue?k^pGH$La=ttYKic*}KC6t}KKx z^ROhz(U}ODi{h!AD0-5bz*v+RqcqKLaMrMa6;ncnSG`VDg}_7TheL9F^QfuzsG0Vz z&9zOu>qXOJligiMVCeW5W3d>LBvPWa96V)cKOgacUrAGPU?o& zC9bp_Pdg02ri>qUIND<@DyMROY{d5Q)7&!o6A}~lHP^zrq^J=Z3YVK#L4t2n;o@KyzTYOCjvK0MwaHDwT?zCDk_61Mm?jNMGbp& z%fP;P?-l!!y;t;7cuLvF78gA7$YP%4gr$nWJ<=>vtRb0mb*Vd?2d9&y+-h|`Z_;@q zV(p<(lj>@Nqy1c6wSOm@fXZYo;TjT%^^hx)jjS~awJrNvU9MhH8lo&*JLhTeS{lA~ z*aNcjpzwbWLJwjxPlFdSyjo&r;O73+<&_D zI=BmN1zx@4cqINAGXRF8X_d*AWhPhQG&bDAy-Bdn&z&pPpc>0e_ngb57i;>jZf)3s zHt_2sEe=zLu2^ceGsW9Xv(A9)$#U6Y;Ey$2xL1GCK;}6Zo>kOSTF0|mgLRGI*Hp(^ zHY^UvMZP=b?@hbTdm}&W{deI{gPuv^hjbLEY2}L>me?T_aq&dZSo=t@3-3HdLNNLs z=JgP^=O+=}Q)6f>T=rwyT{;UtY zVG`sp(EV&+GMyDQA{SK(F^>e!d?A=qn`q{& zSuiYH?p^(K--6%FS{UB^Yse+L!O|5c)6vB}7jkXitVLjN{W`JrU zRGj!LeS3 z18)%w1Rk1jAdyf>)x-nI>cFM~?Ko;@u#|13g0TL|0;Gq0yKX=$>KR@Ee;@36ZqF5; zD@$~1YsM53H77QN2|v$9)ENWf;?59-WB<2ql`LE&2x&}Q*t^|7Pgg1zzZ0lzeB`6e zW9&f;)J9`!rDHeTmmAl+RbbC^*F3kW2I};c=E$6^Ne|7l!XkeZU^hPau=Lz5$rg}h zk_sKjp*Fvrev*#pq>T?vT4B9Nh?)o?9Qi$jdMsc6Vz3Af)o<)_fK86wwq-qGEW{fx zf=tWJx@{YYIG{+P=A=r58UPIs4RJFN`{5vJW~`KaW2N*PE9Kr;Dg3APUl~Q>i!5^k zFqV8^^ltI=EdyOR$JqPUc|GTmif+w0J4~uFPGLh8P&3ucrU~X8wNZVWs$>aiNb*b` zMK&g&jRpM!C@C#KnR^6rrW}jJF1g)gUry&0V@bRzB)kw0F6&@DS78qkZZ9p*98)Z; zUu3Wpp2faQ#1+J+UD!p?O6fw59!aL>^3V-nt90!R4o_{=08!4V_yu@(6DEGy{eaa; zg;bLWB5JNY(6z}ClUw2sWT0qro}LaA1Yv1NteACcJ(#A7AhtF;Ci_f+Pt+9TI?X1` zl*~2lx+dX_?jsk^)!etvo0TieQD6a;H}fWx40|d!*+X47E}m>QQAZk>EX@ zS_D?z zLbg%4E{bLf$G8Q`uxo8kNj>LA7&LLG8r|2gUzJRQ&!Nr)9mkr?<1J<-M1pky(y^^^L-R1#QNbTR2j*N(qVg*Gnf8T%d&ZHqtY<&BfTVFLDAlmC+~WNcXN@2 zt%sWR4XmfmW(o=9&>2{vvo4o3Cf+UN)?tJ%S8!VORW!xT0|Czq847Oa3z=m<;J)0W z8Rv`YXhIa+7gsM4?7MrDepCleRP6ZiTApOpqSR^3XaV`nXtH^MZ-MJIbknh~(N-0X zB6x%B2Vz^bV{2ijDsp!UbQJ!Y3Wz~ij&0}BBnY6!4luAy7G5<7njcIg^Ss8eYPr8| zQn_qHpO6NYG6FlIMgvte86O2GEF!!njOu=SR}$?K7V&rvrDC3g`%%~JI}vy+e#jc{ zNG2_4puiX6d23l47pAi#m`otvYEGh99E>?cUm?zx)PhIsgH#YzIf;+2vqEH>J(tUD ztCg~53i~T>n#08k%OO1IGjr}2hBi$CIiSE33kNmJM!D}!Q(}9Ven%aR?EJjrk+nOX&0+hD9y9!hO3xIL%?~)0akKAhF zJ1{?Ur=Us$$QloItxGIS{pz8UsVX!)UTDd&5)tzvePhHjvdlz6K(XTZ}U< zI>4_q{;o{DaMnzw--rvPFv)%(|d?jvjlUN!TR=_Mo=+|H;Oq zzdT%d_NyoF`_qH<>uv*j>99Q*g6qD!l2rYtlGDc2@eq+5uoPy{-Am|3+$Mt=NwIFf zKCcBn-_e=pLbb91{inTtkEL_zO5VO9Og+H}DXjZ`eWf*&5gdC72edQ!fUMJ=epSQ< z{o&Wxt0LG06MQz+-oRxEUWk1iCbMl8Qf81Ka0dHl62>@6&R{9bSScUk2+{~JlxBdj zv-DshZ19+K<@L}4m%Y7!4HO9Nsw1L{Nmoxs4DoqJ&Pcy7_8{@rP|prE;-e>H<|GAB@VQh>(m%c0lbn*OVh0Z3;{yE z=!OWKO*>(9FBF4K41^Jkv)SfBBqZAhW&fZFW-Mq&5y3OT?vuF7OyRsi7LD?Xitwv= zA>dnV1-Z-NcqVoE`mq83p;1#O8w)_0;25joor7p+fbImaQt3q7WyOl|fwDj)q|V^j zs3!!K6Go_FtQn7-7_f4b<$3rXc5CddWh1Axbpk9!PI01+T+Lphl-=5lm^WNK0Bo64 z`4}O8P56?@nEQ_tN1h|i6hLL`KSydSz15wOoD6-G{gPjWuqaawQ<-pB&{a;We9k$y zRM4ja9VSc{Ga`j$kxXB*PK3kw+bA(a1kAsU3R9H9`rD|nV1MCYq#GJF&lba5wU^SZ{_MI`|K^%lp)#P&aU4=%DtU^X-k`f`GP@fgmYQY z!>>(M4H7oPFv3s_FOl*v;X^~hB?E)o9HSa6K7X0-Kx1lf^b%d(%YMYZ)i&;ovc@R; z2x#%|v;tf+2z-AnL(tSNeSn?q}b) z@8IH65uzL0W|I>(jTb8Bw@5ZPVY^F(QZkpATxxg`g70mX?D zL5Apc-vPhU?|>gd!>@+RUh3lD#gz?O>k({2%l&q;9x+`5{HpT?M~m1(reN_!s( z#>umd(`OfF&+0`T^`b>d6i`*vmw@`k4zg)ma1U&em&F-RR^>mJpfSK`=&kQ1_x`1a zP6^9!4Pp#$ZTBLUM zU_hHeg|uHU3NqYus5^y`t`9Xnq(f`bp$F-ZdKv~hpe{umFx!`#(cATUl^_9}(?XnH z7o1I`#T_kcAUpF7(4$u5B0W8N@f?YqT1f=DfJ7X zWBc1C8n*Kp2>S(tats-wGH=BD?R1#GSTAr=qnj$1quXUKF@?wsDHPs2=lvC$GACV(C$6q`rG&+5RRhp}I z+h*+;vLYnWP{YnR_m~QDu!DQGDYw>9O|dG#kj|>vk%NPb^1n{{S@#;#(sN#2rb1iS zAV})DrgATSegeAPMBtRIyYXbtiw)ASnd=IvVUV7R_sv0F5j~;FkWi{K_GcBG7K_CF zi3caS$h{?u)G3Tn&%C=ekADr|7+((7St4Cqu>>ee48~6BJ38Moy`e19rHD#in_w;H zN$?=v?li zsK7u1>3a7XFVmI*V`@o}q=4td9EL6e8rwlyKSl8;Uz*|gy?Egp#NLm!6}D$I5PN^F;n$mLay=~M z(7hq6a^5jr6nRYg#2Cl)ey!?%e=;V`xHTHfst1U$Rioj;w8jbr2H*P$_U*DFXT z)o8@CCV+n)8?2O}%D7v;;K;eha=I}%;<~)f)^VW$iFBL%s~H_AoRm#L{QIzfPOO9& zfz9vsm`uCE{9*d1$tn;|?3ct354Y%E4bPj+F0`6MtUW0J3wYEn4{C2$Q%GmW2b$HI z4lh75!Y(iE8FdG}(vdq}M!t)vDLRy%LUs$^*Vy$bj>RsITW|Q2Mzw88 z)+L+Vo)ibo_Hm^kzp;0RftccLMN}p&2(Ys`yC0(u1afiRa+n>c$odaBuVcX}kJC!f zv;*b%ZsBV08>7kRf7nHQO z9yRYGsyXM&A#0~~EOSKgAxgYE=v%V*nrcs?2rdc`#d?qjkYwWYsp;jlZ+zo-xts=k z#XBg=2-`XOWlKzN7FvvsX)hhKZRK{Rf&Qt{;4L4DFW~18GaOFUAqFA}dkY%dM}4FWt9ZvY6y82OG*OZUyDF!%G){ZOAr<)XP|<9Lqq#dT^|bxzUBQ7`8@t-3xWQsJ~u26h}JsTY+1#Ixl?*<>hI9 zDMcD=Cd%aC2uAY9E_p#DfFM2x7MYuJi1H;CUCH=|yh&9dHulkk)gBg;;sn|-M3@a9 z#Xmp{(*Z7rcp`pXHLP>9U5dcBllKMjN0bLi0Ebo0P!d9toklj|bIc${H4@w4 z(7V0t-M0t0pb6FiCs%tm8LE2}RG*p)4Z?FFhU)-FGhA$G4yMXkqSSQ5EVfc4w3Q^G zrNn^uZ|vgnuHcOE6iC|j+L)Gx;T}#GgIKI~0UGbi;38;aJ4hfP#@_BFjci_I_ne{` zlO_(w4BxX``8y4H!`pbK+VA{fzw-#G*UXVvWX**(f&=*msk|PslUv|u_s9p_2n%# z=t(7eM0(hwB!c#B`WGX{Y|&^kw88)}iw!H2NUk)wwgv5qek-&cHMdtUhFYBaYT1md zcJw?|{HjwnDPf#A!W_c_mzOB4h47NkiB=ZDqRnF00kJ^%tSh{M(2}vp(i=jc5#eX* z#)$H@n6Z`pOVUxFYHq0&7|D)fJkgC*0XnNlq$a4F#Ju_eI+{S(X`-u6M=mHhf{aM% zF(e)KoQ}gqfV>#%L$Kir$EX4US!0Mf&#=L;#fP|$se5>4k_#mJQF*c@klloE#jYz8 zB#EemBzz_YWtCD|6qJuR)q1cXto5b4So1KuY;qcWd&OjF&2i1(rqz_oGE)orzTnbG zzU0zO>8%yDL1`g|N>j)!LegU`T***av3RpdlgYx5QZ}8qBJQN5UL+!jKwxwX9yQV) zHP*g?CRwdV6D28IrG}8GDlz=8t^|vE4h?#78LAomM_?ji5gXw{2fsN4=(Zv#VpX^R zpyJjBAI_CsE?w8zr0u79(ZAl2u-^XtD14K zz4(Y^ksOK#xI7x2n8ZAPeqcG7|dJe;A&;bXZKF;?l5 zDRkg=vV{x;!}g&fbD;heSw8gCUfpp} z3Pb(ojzk};_(C^@Uh4Y^KOT+jL>wr}omBtN8?XDf8$-Z0myDk2ZQ^si=4!2-YbHr0 zg!DQ|UgWish>w#nW~@}rIGNP^PKtbnCRCbXNxd>pQQ<`u7QCAJu^+`XdzPqX0|vtX zby(qqlTJ`e6=0WmBym3gpw;?!J^~;>Evg`*7BQ=HGq1BYThU_;EwP#}0;5&d&>Cw` zSx08Nxhvh?wP$}<;@NRe1{wlN=X4eIh%7`7K8qb-!X%*Ks1FCL7u@t3;FSN95Sd)4 zO~t8$Aw}Db~q-INkjUTP)Yd-t<`Q#|{D(pj-!;80JV<-w2ewAcqVv zy0#lpY(nb>;UPoUDSv9dJ0BzEd%Aa%XIQz8p) zU$^KL<|Wx}>ZdC~mqoozJeM?x**fuqB%4m49;@nllY}tfp?YFcf1fZ^PiUseFps$SxZH&ieOfg=deIHb&FRfFCqOlET%fL{&#~0D z#9OA8suz0l6w)d*ykE)KLnVg)l`Q)2&$QqWnrDQmsa{(e-^sIOYG2Jc{5>BQk=|n0 zk`kPIo?0>DM#`QDZITPv^?xzfwMqsWDnLQoY*Q?c9~n{)H&cLI04FgTVuqL(NTv%Q zG&X0ran~q07s@>5aB~C-%xO*;6#Sg6T3|s#+*TFvAh+oAQLiB^Is(31CKx_;XT+K5 zvp{}A&J!4@-4WYD*T@;^W!m4KL>NIP|F$9lneq%Jc|1AU&Z?D6;hp8=ZIsp@m4Y6u zFjlahO4johCKlS_f26rjRrRbEbO`dc|b{Y#!WR2}+`I-eC^I{5y>3eD(I zKpKAeYfz^@HFb-9<4fS7_!!i*O!11A7U`s?D!E&q#SMrw8dXKtkp%RH9EExSU>vkh z-9Cq$$&xu~X{kQPGNihU$#N3-k7P}Z9TB6 zZtW`=kdf?x9mjxMVDAg?m|R^9Y;l(NQ46#*Btem{6uNTa6t|PX)JVf*R#*}Sfz7+g z^b*3>hlI@F4<>`k(%&m>xmww+%~^Iv^?G0F?7=*(|BR}D*&D6_z6XQF-&7s^G&_I{ z;~z1g-t%>$pq{`P%c7m2IK$5p1ss%Dit@^k_KMdMp=;Y+v}Gs<@bgMH4DF~ZYSkvT zj>xd4EUal~X_|6IgVRt#i(@^$AN@E!`Z_-PI6itEA3ctb-(;#6U5<~AAm<3noB4{s4c5WNgz;M)1KQB1HmDAeel599F-~JUC z?`Uaiy)tW@3=K@Nro&i}VSvk~I&-p@osdm+5oUKrEWJMWTYOxxz|@Q}$@WQ7Nn!*Q zA_$hDH503}qi+$U`D)PMd$yEYFVf%TjZuv}nQRoM1v z+4cFYiLL5=l0uRg!GJE55u2f((j5D2DlKU%zNs{+q~M!Mld4MUz!k+e5(y=+vuliM z#U5}n=3+tyInx`|@-&m4O`tUg%)a9?do*dQmZ$1~v`1JN1wlz&MA&&if60=NNcMq- zBp(#;+_Rb#VelXq{uY91J`|@#h6{t7oV#yL=4p>y^{Y;}1JPIGm1SqCjasW(MP(Kj z+CU3aX-c&zwe2Iz2b9$6P*S%(aj|{bnsPPy_S7}D2tA2{+gUTMJlq}Va&il~s{1=) zii@9Lu|N52-~V}D&|*0PSRl_1)qB|G(V2JRGm2Vg#97{?fu$yNO$p=J zf#_(c-DLle_G#fomTu?|s{^ZHiyI(>FIW>g0Yk-?J;a6plb!jc(>3f#j0aazw793AwHZou`Ps1z&Z+53$ z^hyfZ#qs$S_HKIsG;h|Q8BjCM+T0tdGW>&$BEB_aLw4%`z$&f)KAeE&fKN0J89O%- zh007wW)2z<#);+Okb&oKU?-?^7uze7+qi?RU<7stvG4Wp42yWiAAiiL+voD{To;mI z9~WA17JPKe#(UTSa*4_$RXJ@>L{vm_j>9n9n_-UJ@!yE}$`Sx|t5O zkeWr^4cj;3ubg$#Msh9s`x4cmwOYQQo)4_0Y(-Wop7!DOuI{CwCQmRGcZW&q8j z%cc;`A1|9iG;dxu#ptJ|HLl~6(EuiUUXo7Zw8nat12^hh zV%9BGg|4-itefQ{LUtcpo5$n;A=Z7mGQV&j=QrO*owo)=3x+Xn>mbuTdhT@#V$cTwI-;x5?cMx()c<-d;d@`5R^{!LWd*fK zlvGktjU19J(+whLfZrteW03!6y%5D3B|1M9i{KI_as*B;`Kti00$u?$daR)pR?`xz z?k{H4BPrNUaGGX2po&r*b2k(p>2zs2Te_axGBSoEGyMb%_Ffm@jiVfQ6Wgf}9YOE| z3p)C?*Nh{P4RGxrygKypidsP1tZs`@?lK16bnc)5WM+&Y0?Ff?WsRX=>DoYmuLS}; z58HSFzMYd1%{W{u&I-n3`=FkhD~(;Ixko4EUO5>W6+|V=Skm?i`8n6XLE8+$>DX&v z)7F8;cn6p*1I$)q#C#yRYb}W+y{x%TF$3*0aG!xzr9>Elu-^!%EiWLhc>%hSdRGsUGPTRe3TjuKy#8H@=}z9D!}Og-l6W~Nn_lvd6%+gfXr^>2=y2) zz+232;2<(NmWY|abilC+1!$Ij(bMc~<}}t(dpAfv2h#c0TGQ+1Y1RhSsfyIK4E=D{ ziWwkR^tdT)vOnSHjxwOFG!#wy8K1}1SepgwDC$uMlKTh@&qL1HjE_hdi5}v3g|FXo znbT5#7nRv8yQe&7e$U9J5e*1YMHLleF$%?nk});)Zoa2)W_(h{vA*jJe$M0FdIoiM z(9YqCu7*UJ;kA%Q!T^Z~5woB@tD#Ocod+3LEuhgD#A0un2qK8VPL|vDsAT(U?Y5NX9C780De#u&nH_0 z65o`5k&>O(L(a=6-0W|kv}p)pw+#Ro2tJ~^JOOuJp~(;|1`HR=%JUp0piAVMzkJg& zuLaz&88o=*!(D2)k*;c7ww{Q~&`!lfAss&D1!eFOl}fXBkMpGT-RfF7vO_5=xj+1y ztsW5*d;pdcHue?%*(8*+KRb@3K5Ko{N8cTuEAX*R+J2zz@ItoAa~Dsfw}#sKxfyA> zWuOK$-q`36ZQXjzJ7}ek$+35GU?bT^BG)D_KOf)fRHJ@e!*YXB3EuK+7fQ@FwXoVGyHCxNaT4M5|2rhirAPyIt-e*&!cV24Kvtkb(Ta{l^v7rLQS0*vRT0P=wx;-Mj( zAAZmSzV|q97KkPT5#9$VYIU*PQrVFc+&WQI+S~s<<3oWiOmcY0@V99$RsYJeS z_7zdQFu$K!M2Fv%%5|mVr#boy3Zb)YJnUEzxeGG5tlEI%Kzcg2cT{L%Dj8d4nVo8A zO=+uMHTY_|^+&^i$~E5XXPIRCwZ30o8X>7*C!bkoC{K~9!}vK8p`^BJY60Yi`8?cj+TM{~0Y<=h#Y%xHcw`n^>^*9(~Yr_UdIU14J4Ia&y!0r~*Ekl#r zkQgj@XPxA(l=-mOV}UD!m?cbB5n{FGs+{oNBF}iN^QO0_kTDBJb_(f=IyJwUs}ULy z_iCXkKg`9I(ccPeMK)M{zdAUW#i3uf>kr87Z3nwWb+I#vrA88o z4ombY?~!$e*DFlBAdHhVDooOkR<*|p3XH<-h-OL1WuBEl<>^*0uz3zFuK*a7xQ2qJ zX|bNB>K0Kit{@%5yh>yOrZ6%<^YcLKSYAY+^Z02Y+J-7e zMJo6BC?kmE{qI=F+qb>==vVG(-chkYDkAvE;}|e;8CxF{!4HI}e_t7as=do{sdZtL^aQI9`G;aoxIAhA_uU-TL_W9ZgI`e_U&KY0-5>g)%pgap*8MNe3 z*>v0>g=qn~Igy)ReY}Xd`IX0u2!76k>cdGGOD>q&k~-j8PiH!h5$}*z-0k3K#Z@0l z2i_-QI9PEh5T@R+GLme*QH+dL6hEU-r!)QP)e>5Wyp_)R{-;lX%!7#P)ETD^pZ3!C3Rs2!<%cu;-mtFg0- zi+s^bcq5d`Ig0OE&k?zlxAXuDS{J%a}E*WCy_*RX=HvxE=C?+zx}jZh&oK*y^-n z!Jux4%Ho>wkZm?M;@%NKp1rU{QX~!a^5WpUq4vCy_A_pLjQ*HoP^-7t6?^*q9Dd6Y zpl>bwgxpjl?Y}&1=MRXjhNyX&f6-+};EaWiicQW$j+zPhvtao)wWO8Kql`E+dSRBE zj7xxIw3T{1v7&Gg$eo|xeflaMG6LZ6m^L)nl^lW5-6U@AXCx+bzkDy(gWNvO_m}|% zq%5mYg^{(E$dH?iq6z>~z*kgB;UtWV%s6B;W|KG(T)qv2=beNCO8v%|l}Dj~Iug4%9m7-)RKye3;Dy zi2W@_GUzBGRY4=7S zSIqJQ0z3U5f@Y^ynkUCJ%p*#$u;cB!;1Vnq$ZLRYH-?DC z&t)c#RaGxBJp=N&9H|G=vlz_%i0U0e52S7pde`r+cP!FF_s;vf17MCNH})qwbmCZb z!=nSwS=V3hsQQLD>KC3$gR9Wepl)lBf)bR_N{EdZ69n@cZs~GM2*N-S!D&b0muj$0=!8qOXoCaOCTSaMF=UP?dFp&l*UR2kIa+4rDR>0)&U^+_|EJZY{pPBTrP3^U*{xl9WN6Tf^(BbayO2)^CL)jLoZ zNoa@^?2A~e{^-xaZ@9lHY6C@0SewMUtR=$CiduixFsbiQ(MOhyF&9`RELj0YJO~OH zpMY@(j4NQA0pk@g-Yo{$3f?M!t>Wq(TQn&EC9!A=!wP^bQXq;f@n&e_3F?~@gm5g#G z%n}7=|1+1I(yK1J?{9eIsjisRJqu!u8Jlm7^G{(ojzSBZ)`vDYkL&5$>n4lBn#wGu8DmP<3L2=%%0$0d3v#F7Fhc zGFOZJeXMe9sf?(c4hN4qb33B@!P ziYNM|0)^hw>=s|7QAo1oa(6c-LTpwIolnNntT2{pWm4moaWNvt_K{%pdgSQYMOWjA z;#yMr599Hrvs2XATh&khLRYY#v~8boss&n0yC z*s*@HH51>e7goAl{Fm|~%sYlMil}xtX2;^`&<~{)kaiNjP9dJU7L7n^r!bG1eZkt# zVN2opm;Y4>nx5q6J9{7Er1=*eJb{Z!XRVVMxFZkz-452IX!xC!GAGKeeAL8M>;^70_>|uFpUeo6#Vw2py(F z!%9%IO^;N90;P=(ShKd$)H}U_48Rv=KANieQ*H!E$>Bu*`xSh!mj*VMWnj+@S2v+ z6o&1^UV#fsy+iyu=;z)DuRh(=ZbBzYie92CP>~HM%1+_^Rp>(`A?unupQD7GS4w); zKU@a(V4sWhny9>Vm!r%n+kc}22}6F4Na zC5wUzpc~CcF&(Ij1Tv;FG5GE0^gV#kyy;USr`Lz>6g?i>e{rNhfOB>n7)CAnML2ZWU;)cunw>OB>cUR&>iHPsgk*tqPHD*j>DNleM zdtUBh7lC?}&A`vQUGo z_1Kd>f?-O7?JU-zN=ATiPBDk|1BVq~XEaaT*e)I!8VNWEo1!F5KTp(TUE7{?dKkG}CiEnj%{0b8Cf?6I$fZcw8)+Vz%|}AP!^{cRChTTMg0egs?a&k$_qTEXP|$} zvXm)o75$_tEcUVGNLrmuh*WI7cxLGyHa_az;{9E{MaE~Vrt0V(92rX*(t)<*Tr=vX zeStU@#ew`6io)VR6n><2=0e=g|4#8RTi`BwUJ~)8vSWmx4*LlM=LpR0%s+m|Iu6+nA3Gjx; zrJ$5yYfFYE3@5~AM5XN?mMoZ?p0TcH?O=PkANnV_)E_o5E?*s~C714n3uDI{uj_iU zUSx*W6aPYCG)pnH*_lYv-;3`lxhs28dcktmNFK*!J4;U$7Ne23cf#jBSsrOrGPfv( zM>+2n-fTS7k^YYaMZeVA+b1PK6uzK!-J}h8kGR^}uWQYtS!2W*t@y-^%>+!d9Ix)| zPeNW2(QaLCNHJPuJU~<*QATP!uuYu<4^^%!xX_A)XPke#79oAW4DWRBO5w3G*p$@- zsU6HJrpIm+{Ogcm^XZLGAimT@VCK#g8HxqfaH*Q^#)#|J+A~^>1(h9G$86kfbiR8W zFd{x!VJ#KjT1Z|qdvb;}RmgzhcZQ@jQZ4&is$3z?V;E=Vj5kJ;^D~JJR!a;6wakAh zYKk|4&7~gW)YB6uhRUg`+U)^K$wM8z-yoV`;_2(28|RE(e)A5GUVc{gAACZ5ftV#@ z&Z}`{PFUT|1~uvh zs+_cAiXB8be!`7I`ztlydtS_^UNE3bFsFdepZFH1S?P(-aeeJ2A91bqDXuDkwogg? zG2A$x_+rs>qo$CnoLa7_o?FI25}g6(#Cz3K-GW)Nf>bxCynRI2(_TpUedT-8S2~Q;X^iYI1q+h~AXO@m3aoPH#bvYX*_3rvA{>Rl~g6?=>a zx;HdsGxc>Tzh2cMYk)@Y*#r!-0JGJgJZvnK51KL<=i(Y6$|UIbGY_~U8XQ2LZ=|Wm zt`5$d@P*bL`_5?=ul^UkGc z%r9Grj`DbnQrcc0b?=bRpJ%(2STIkY@@B|S%qVNuN9@2C*E=@wrL_7NK=}ws6&23Y zH#=+Ho|b{sdFELbhu}poy}hW~ep2OpD>9BRmFA73j&#ftoiEaZeoRIJRgb}dFOM@; zbMTe*h$Vb=>@lo`udOS3`1%P(2cvaFo_yo>W62Y`#{^0&h$~TiV&$9Nul)}aqCPgY zFF|4{deVj$RGm8Io;*m>P%PyM;OaxKn`C;IA@M5)}=svWapAlkp%eZWxEz;n%2qIO6(( zoaB1|@e)C{HJ55T*dIhpT$+4yq!aflfzZQtz+E3f5|tgK(WPac{Eb&*s-Q$-K^{m!=7E{r5_TR@3-9XhrjSpcZGMFf@K$vhSymW!r;0a+ z?yX$MzFbPt^Q#{>J45+3sRoGm>f;oPc5*`d06s4!OW(V*z%3EM;3Sd?2xjv$OsHXIH&kt~)1EdiXLCI;G_nC);55!b{UV zKAhciq_w(|578!hug8AFnTs@p0lc5Bx=5cwA6^$b!s12BrX);g-l+ttAP>j=f3Lh;)`=WDWBvJ16Rwaxx}UtB)eb|CY34?ZMS<*f~^*dWSQLe zp3uu(gw0F1{hVv-7w5c>!Gi<~Adp^uww>5cQH;!wSY|WDuf5rL1MqX=h}^flIgbGB zOR7mv5-gIr2G-WWV4k$zss?{iu+odVb3oWGsusRT11C1cBg**`e9KbxwD&o4(}#g> zCHoW~k>A`7#QE2VPd%-b(2_JL_~TSKD<^u5!CR`fxnX;DTmKBc0P~0nLpxCnL$;SgAX}U5f&P=0uRQLf;Jt%Y}1U z<7ml~H?YM#{9i4)y%lcHda{90_#}@t3vW$K@$U4bi)Go0_bE{*?+^Y1-9f@11r--| zL!nRbsmtxPjYM)&(a(z5cYENRt$l;(y`YF3E{5`?Nkiloxi>?l21K*KN?Sm29$cuQ zouc@`=j@_t&ItlA`rn)iWkT$RQV0Vc>6uC4LXGzODjv5YUNj@$4vVmopv#k0gme+B z)hCpT-k!5#lVw)YyElL0w*4*TU(hYlj0ep%C^m`!n_k4V8t?Zof*tY4plNc zG|E`@h>bN=YK~~d+JHVz^95w178Nuq>F$c23k7X+DMAsM0O?%#@{n^*G7)0%hz~Ga z>CzyvGJ3S0e!*)K3k&bLY!Dl-r``hxi$3kEq{*BQB4sdAmrRzF7!qgDGbEE|7u*|3 z@g_4{2$QdH@|udg%+l`8FtM626i?x2VJxYZ@+E*2Gy#7Zqyf5N zKQl$tt>*Pn)IdGEI{O+)7AaQO%+>bV`gReWCa70}wI*1PD2!1Mcl+`5&|?NX_2@Ns z@Km*cn??+~ZKo3n-<3>x2%Otyx5YnV%tMHF)bpt2H@M+x@nTxO7^xR0P4ByVoOLTj z1)^q4QHqyVyqF+HB{B4L^$?93J2Y6oaUt_0;8h>UfgA=78+D|Muuo(uW+`fQV%ChM zjSN`EbCx#@Wu_5B)plV=I70(J26VtmVL;byoh9rKHPw+@vlan!B{|}3QI;lCouLXI z*#=ZAIIXjs)>uZXwItFCi)o2Pzxra{@7&ohin4k8y)_jX7SDTKDa)1mc#$f#bSW-f zrs*oZp>;axqANIly)lilarsB}`_|z{9&yu32UX35R2!%*x07Ne%6T<~TWP$=VA)Mq zY6D0W@NoTjKSwy6AKOQUn)51z;&q@_e1*VhabPp|B=%fc+waRcR}%2n&|` zrVfR8TKR*&7jbmf&P#mKIF?$JSz})BQ1^v=5%3r3 z8vdiv0s)ZN9|fPW{7^JUjtQ_9J615zKz($hT07jXX;M$7zYvQcXQJzw3X}!>b+kjvuKQ*C zcX%FxE<7$GMlkvTae7t*VZq}F5uUL+DAuS~i@{E;?g!U@Y#$5tHsbz+d8DtxhV4Gv zXR+C<(+PuU1pBvd)}c3Hm;bnp-xu~FA96XUre-(b;eSBrq^;|h*ZQ$}!Pqp&8Eja$ zdKvBl;x8fE;Gpz!OD7Cwzcs~*-YuS(^ls}K+gy6P<1^%C$C#{P_3VU2q`X+r?40b!I?Hvg#k>Wz?LEBqFKbgN+3e4N=FUzzt@GLDSa1FZirY7+>ilSKeW!V* z;yHj{_Ez&ts-iTj8#|xP?6J?zw~p^EkzcX^Moa;CSl^GBS+d7rSf`|F&Ob6vL3yvw zHhPthZ?67SKS!zfbID%lc3o0km~4$L6x^#AJSgG5G$6>OJ?K*tIX@g3anhVuty*IBKqRJFte)k_M(%9V&G-0rR$0Nj6rPicn0eFsxr|MP2MkCA909*23&E|fO+go z-w>VHC{W~Z-xi&-OkhEnup&HI7A`C?XN!H~9<#OKk&UNrB75W|H?FH|y~O zw{v$#OQjLS7Um6R;K?EG5o^Ppf6D(MI=w-e-~1&GZhaVD5=jlvs&r9-A+BB2g-`i% zvV|kaT>e*%+k=AxBS-TilTTt7dx~s2q3BPH`S1zPrSF}tB}X)RFly2*Z0@U*wMdx0<^0VlN0b|BZhFMK&An0B2sW+4} z!8%8e_Vg|<%&%yd=)Txe<3dXM~WwtVawetBt1T#^y-h{xQ-PO`i{ zSzSM0U(bO7qn;O=BesW#ijH+}YXRyB0Mt_es7CE#Y&&;~xk`_ym;CGT_smA`GBu{zpA^B{1Om^KUolKmCom z=%$!Joh}qB?`2j8yV-G2TrK0cnn9vI9*Ww9tU|xJ(M4o0Ms;jll!2)*I0HikQUd~W zpP7W+kv*{Y&V+Zbp*9S5mOqa)kFhDyd)7o)gh#Sy4#lWXLFokq6u2&a8hVDoi)ajc zJfp?OG)R4j=nVk@U@dnB2Eg>4E?%*1hX-_Y*XBVyJx6(9vDa5^C4s$}AqrtG@KSjiQpSoFp z>v@idQT^!6cQ0@}qDQ}*tu5^rZOcPIt@4x`_*F}ImFgfWrus8NAX9>XOqo21$?GRS z2^$hjm&)H8y#KDFty7pe-fvI=HTS{zSIXA+D*15&HwA*o^QZ5rEZO&@*67CEYtLy{ z_snnwiyAnjf^P{!Ef%}9QlJGs0V*@~ZIcLp9BU9BSIVQ7%9LRDX>Q#2iC)a4 z_vl8Tzt-S22HYahTdU*wzT#1QC~beg!4Z|xc)>&;R8(ViDJ&gX zj@a|I9t+DZ6DCrF*ALPVwu{t6gUw<6px4s=MThx(W}9AwE*!1aHoXRI5md*R6dpHb z@>_^-CKWH8(OFehewVf=9N_v5aevn?#eHaJ2y0S?sZXUs;y0x*gZ7!dm`a>5S@(~$ zy|39=a}!A|vtwtfN9&(%;-#}adnErCvbnChaqjQzXqYR{BlUcu-rg1%( zXt`skY$(dlDH(7qV}^-l#E<2#%$iYDA=olEh)CEqJ1VTSf}F+z373R!l&W|)Chf_3 zSo-9ZMfo9T-FGp;-ws$9HcvkhcnYQiV-%A7VbVUd)E3Vyl+4Tss1@nq#*ko&W1kajDydzGyu zejxMVPbT3|JAz52h7Pkm8Z9jlomx{0$baf77=%^>7Lkxplj3`7%M<)btov*r21zDR zO6UL)G2m>p*NsnYqxkC2?En{@ZDCcXfE|^Jy{VsCNUzyXhO> zR%<<(rYl^iQZ0hfnV}<$&@hf17~9K6JTogP@T`PA_7ML%k|c6uM8rp6cX=oZJ&3xo zNQq=6F33Vvn&Gy&!}B(8-%@ znENgqM~@gONFe^C8|rnTAb>CNw~^Ht3vk401m>T_Yg<9`E}$Uk*COab?Lit&J=W_H zdSr*~W;C~f5vPcb#?%G{8%i31BoctXO6*nn%P!Cf^O19C=9P$$3^Tn2h3F9v)03fm z=aNco!*jQ=X-2b_{9zI8744YPv0@Skew9c@!Y(P6kgp>hKys%AD zhhLtN2%KNsOko@u$ZvjkMNJn;NfH+;xL=VJi7a*=Drs9~I&-4#qR$P^`RDT9A4EJW(rZ9p}eMqWjslu`PL=Bhq^~}u_%1hwl|-f zUKDmrvzqmZs4I1uO>V@&dEi)keMS5%pAOJy^^-V;t8)a9^I(La4H34@PJFCp7Neio zybMys?4yn#@zXr>sv6M@r*tAg9(iZ<{|qgo(uzHLNzAsta@POcC)Gt!)P+A=S{KvE z{mT}T&6RbRX=dd}NH(b7I>9TW8x7&5)p9x=z4O2$+fn<{vaJ}zBF0TRa@a@4E zHQ!)RQ#B2sWuqa1jZQwmW(_ACvZDXXbtBXr^$AaZwynk7SY~I1Bh&ABa#>y z6*@3+69gNuunrsAz*vJF^_fHQsoWJ^z>fMiQF|8cybm_hyrhFO+=Spws$sXVI81fm zZ**Mg$LOK=Juw?=+?Dso=XiHJt9af*a%8J44H~X;5V0og93>e(I2soo^LC%@mQ2U& zFHB7EaYZDH>4tWll$qNbRoBA<&-%6V4N8yCmr`~ec}5$ya8)z)rs5VB*bwGXx`rn{ z48!rgj4v%TCkt7;_DIsPU%?xc)}Z5PDAw7Ez2OsQfc;n{WbOO|^&c(>dSaHC028__ zmj%~g;ABQbxXq$ANTX2)2xkZ$6HD=JqhJY2%HF1~ys*HP;rRsv!=&{>Vb&VN$V`Zp zCw0z!zdW(!by&J#*>;HHzFrg5@F9w)G0zXyPVR8iFI9%c$uJM@sbSN-`IhIvrbjtC z>((7TJ)gh3JpZW@w123>({eulOJ@$~%90upxtc?(45oY*EAEc#)A_qwKW%pD=QDk~w?JCtTAG#G`> zxDMN^&m@ENAR?y}ad`uHnd@=7>@xaxaY=6{O7b6$-!L-NHa3%N=uPWvEkqUNQse=hrH_;paP+ z)5_Yr?=kYH{{}}NPJ?0m;)ZYS=<3cPp9};3>``+hxD0~&UcpD}sg>T;z5d4G(f z2e+|8?CE3IG(tZ3`2UVLT#~Q-xkJ6z=2-1@1s99`#uqn`+USo9e-k`*;}4R7fd7*b zO7ZukD&Ukk$tZ~~;ME0`ZNS$A0PDix{AuD0^NF4(PL5v7O(+JCSnL6zBz{fQy@>N6 zMrEOIgAwIn9z*Rr;LPzx;O?R#*{R=3rjD`Ne#Au*-y{rlqA|kIk+n+-7Us^_6b*gp zt0C0mVClhh=;YU2R`BDld)YH5jpu=`R!%y;NogKWdYT)6(-h|(cmK(PuLqMo^Wlu- z0Z~*3As!_yL+*r*0^$*+NN=kh*I1Dosc}cTLlli8kr#>P#p)ZFK0}fK3{EVsb9{q- zU4T#qCVw2+3QIPqI946GTv4xW(XHGkLZQEw@QL}Epz!5_ zlL7kg6??+Ck!6)l6Scyw!C@Iu=e)9kT-hA9fy9&Zyyv(sDQf5&b%32jPn>$4e{=?QZNbEvfTN5) z+(v^w+ws%N?=1&ST_dO%3wWQA;9&&h;91As- z^~iyMzY<+c2Q>`%gN#!P)3CM{D7CWc1|?kqpA#((0yTbV<5P@flH`X9MqH3THy`PO zRV<)Lo1oMjVkN5q`1LoEMKMS?6(l*LcSPFW3%1CyBUl*D0<-r3%JH!y=)a3&NXZNd zfc?V8fG}u^|5y;0l)Cl+?FIlhK*+xU+R)JTO5l>J0I*~MfsnBD*NQ^RB*SB}E@66F zRDXcQ2s)tY$I5z^;-+n0bVp|=VaulPA;(h0YTQ#QGXbo`3rbvYV&_N*XJR7~H=jh~ zop=JrtLOcz*OABIysu(X>wocq(0{#J5O@5|)$vCaI&L`?_Cz|@^7D{FX)~PdR)<)N`yN|j-Ax0*-)S)i)!rG| zH36lmV(v@!6eb$#W#Rjea~rB!@(ERM+0;D(WDw$eQoY5$WoZF`fN_><}UQm?;CJWNtVEa-xqLK z!(4(fCVf+GmE~N-Nd8V?j-yVwbW?e2a$k#Nf7g~jHlx(uvG~`db@|8KqhG{1##H)M zG+zX}kpJx4y9f(*o#XYK2kOmhHUjz>^bMhbkIsc&hqsfJ&ztyn_MH_3I$vBX`%)PY zsLoldMY_`h2Y0?Z>r#Fe!+_amaZo4MqKjT%pS?&ffD5nBXQwm^Fv7TR!Yq-q5h1Qi zl>CL$_O*zQaiBi$9i+P2i;68mLHQ-&b?e+48q52QHZH54IVN3?)Ne79U(5bslnARs zE!scXwJdEaZ8p+5rPBy$`%<=gH^wP+H@|bfakNZfr@FEBXxO&!KZ71y6964$;O&-{U!R{!>@*8b=shCWU99)XevmkD%nFw`v(#v`pe21kv!qdgJd zMB;r>DRMT|7Lh7iK09?(Xzfv<#==y{&QC=aOzAe7w#T*|jo+@L<`hfA$E#{Buw&7MS+_z7h z`~A+oj9C^v2SIE(t(UQ z4kooBZFXAmWJS}4LQvE;n7eK_60|7HKs@(t9Ka{zrP~*9lg6TIG$*mtuXTA;{lEgP zCk+ikLVn^Y#cx`=t;J*pax$S_S7B{kxIGaQT4KT`U=PYA0@vIfkI}PbB8zl7I@yK? z7FtQ#q-@Tgm$?et3Uz^7SZ71Eo^#QOE%s5@Qot2gjiuq)h_oP+eusr9(nI>%6x5$v zHoD~#PWt5~?S3Jp9&fRa)V!M2tn@#TX{QDr z9CG3G2xwAl|C+Jaos`kjwNFJWw`&#H4sBW#x{_C>&Gb67nAn5SG!W*nt_Y#2#8b3q z$PtRFX-$q^6&U(BQ-j`-%lbmAIHzD%#&%A+uql6tBWdA84%pQy>D1DO4 zP_+1-0eioi?MyRfU};RlkT)ICAm-3&jqkb;JPswQ+1M*PQ(Ocj#k z&mezfWQGuN^MVVRq+6)%p>*!3$rkCpB(0GtMoInBMVTyNkCOS|8{fI{m^psMWw<*6 zEvND;x$KnE;>{q9-7rP8=VG&Gt&gRV@MsWl;VrWlGHgiQ#=AGLm%;9hpDhlJii|Ie4} zB7_h0nKwh6XwxfT&YXp&jst=uDUOk27YdT}=Ar+BZELW&E&;H@=i} zHG61PWV!yiJu$HDi6-$X;I?x(e8gO$4#elszPuvA(v9_}1!&{*szO&YC9I#A{lUR! zanC0+d3qAIYbrvlImCvvO*OYM&olgR*s>&CS#X=L9F0f(mpXnvDnp8Kac| zQfT&K;bQ4AS@~dA4Js^`heP=c9$W~YaaBWz$m>8w&yeq zIX-rAfH*`?+W`QEgR~`0sMJfP_^+??BkW4Ap7Is$LIcY>cl^rwm-3@UdftIDFD_)9 zpRZF#B=;*`bj)74adLmzE3~E7WM|t)UrR`+U(o6PI+x}Iahm)&4^f?yIu{(B0U9Z4nZyrhIfys`ZWvc%VS&%_?_wS` zsx4~Y!vg3&391L?7g~v9(AKx#ia=>_9C8fmfk+U2MVj2F4Qy?4dq=BZkH6PH&H++{ zkFE{?$jl-b8(9sAni6^1FuTQg=v5>|ms7fVGa{`O@lw?S`;qpfE+>vNY8aI0HkK0{ zOjrkqF)cEb6*BNEE|cqvr>V2!#*}c zuf+vK7a~R|5@mEIC^@<|t&Cp)xo{JI?wpFs%Y*Dc9qDb~3)Ao3@Pqosw7BE(GlR3E z?U+a)h!qjW__u{gL7+VI{fBErqng-_hz#?uK>6Grl7JHH_V>_bu&wDUe0s75tH`#D zO?78*HgnTId(+4NtkHA_JFa%JVl(wd=|Oq{Adj}Ut+s?UUY>>>+y-5S*H+ppM~B!s zs7DWF%LlQE{`hPFnal~{nWSFf=c)Uqyj>}#+B8Mj%D6C@yE!qzdSbm5H;VR9DO8a* z{J^>TF4T$E9fJQoMW-gR+3&?DZL>xn3E zYuYiY=ul+q!K;TQ&sjeA=ifj7D{hq{JCq(JSb1X<03BN$%G#&`Yl7b8?h+w##^Jqh`Ff&WS zCk?KK-bzV#tM@NVwcCpj2>{+2i_OR->b9WsVn>Rkj1+J}kKiEUEDfb}+#kdv{v2g1 zqDFpJNNzt?Xj|X`?e`DmcKGDiBG&2i`|d5JSy>$c=9c9tZ4VrsXE_LriK_S$3X#N?g5{uyWVx&314UJVMx7KtgHl?iwH;WHUdU8OLD*E zy_IZt2+iY>6+6xW{y!-~cOcHmiG17ydwYb+mk^qf%f-TQ8e z(|eBe)-)LXmhO^M_r0>N5Fo*iLfmZWhh^u3iVVR{({07BhCAbgSh@~mhXxxE(+JSk z<0tt~PwtN(WJwUdL2tkKekWj@b3qZdMNQM&9}))8D^YFc|B^HOBLHjwNVl);Pj02R ze`;>@th|YOqv4ka`hUFl0kxHRSXbV$BW=cZ&Ekn1W%C;WW-ee5fwQk;%{OWjq*FWd|vYg5Mi)l=$4RU6m+5cERM}AFm(AL2Q z)9J0~e_4II8nBwZ7SrYfHpFUPk85q;^M!iJ`WwwiQa{7=>v-4tc}Mz$<^0M1nf)^N zh0W+wXh!x{Pyf9L{I07{jLev61g z+0CKLZqB{6SfOuZ3VM@p(`oaA;1Kiq=(C~S;24JvI0#yuD34i(2ib8S9b|PE^LBU> znB(^YUk+7)S_h4vC9;Jw}~{WOAwm@cTLXTyVUEUMWB%2PXcA@F0fW~==C-)P-$4ORAO#iM2`7yTq;aJod-4W?u*vlcra2P$NJ(V_FpMG-l9XQ;Iv=2Ks;PRVo|ewPlwHwI zz1361lP1ifOV}`OsVk8e HZY(iV#g}) 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 CZp3z{m#u&x`nsa49Vaal^fX@HlQ$c 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ℜLSU$ZYc13^ogZ2EiE%{F{e}kv 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�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%0D6{lbT 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

    f&9D{tmqEy6oE*y%amzLzJsU>&4_ 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 - Probing Web InterfaceProbing Web Interface + Probing Web Interface - +

    - + diff --git a/scripts/prune-bundled-web.sh b/scripts/prune-bundled-web.sh index 2d598f31..a562bae0 100755 --- a/scripts/prune-bundled-web.sh +++ b/scripts/prune-bundled-web.sh @@ -7,18 +7,25 @@ INDEX="$PUBLIC/index.html" ASSETS="$PUBLIC/assets" if [[ ! -f "$INDEX" ]]; then - exit 0 + echo "error: missing bundled web index: $INDEX" >&2 + exit 1 fi entry_js="$(grep -oE 'web-dxh[^"'"'"' ]+\.js' "$INDEX" | head -1 || true)" if [[ -z "$entry_js" ]]; then - exit 0 + echo "error: index does not reference a Dioxus entry script: $INDEX" >&2 + exit 1 fi js_path="$ASSETS/$entry_js" -wasm_ref="" -if [[ -f "$js_path" ]]; then - wasm_ref="$(grep -oE 'web_bg-dxh[0-9a-f]+\.wasm' "$js_path" | head -1 || true)" +if [[ ! -f "$js_path" ]]; then + echo "error: index references missing entry script: $js_path" >&2 + exit 1 +fi +wasm_ref="$(grep -oE 'web_bg-dxh[0-9a-f]+\.wasm' "$js_path" | head -1 || true)" +if [[ -z "$wasm_ref" || ! -f "$ASSETS/$wasm_ref" ]]; then + echo "error: entry script references missing WASM module: $ASSETS/${wasm_ref:-}" >&2 + exit 1 fi declare -a keep=( diff --git a/scripts/verify_web_assets.py b/scripts/verify_web_assets.py new file mode 100644 index 00000000..e8feeafa --- /dev/null +++ b/scripts/verify_web_assets.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +"""Verify that a bundled Dioxus index references files present in the bundle.""" + +from __future__ import annotations + +import argparse +import re +import sys +from collections.abc import Callable +from pathlib import Path, PurePosixPath +from urllib.parse import unquote, urlsplit + +_HTML_ASSET_RE = re.compile(r"""(?:src|href)=["']([^"']+)["']""", re.IGNORECASE) +_ENTRY_JS_RE = re.compile(r"(?:^|/)assets/(web-dxh[0-9a-f]+\.js)$") +_WASM_RE = re.compile(r"web_bg-dxh[0-9a-f]+\.wasm") + + +def _local_path(reference: str) -> str | None: + parsed = urlsplit(reference) + if parsed.scheme or parsed.netloc or reference.startswith(("data:", "#")): + return None + path = unquote(parsed.path).lstrip("/") + normalized = str(PurePosixPath(path)) + while normalized.startswith("./"): + normalized = normalized[2:] + if normalized == ".." or normalized.startswith("../"): + return None + return normalized + + +def verify_web_files( + index_html: str, + exists: Callable[[str], bool], + read_text: Callable[[str], str], +) -> list[str]: + """Validate index/entry/WASM references against an abstract file collection.""" + errors: list[str] = [] + references = [] + for reference in _HTML_ASSET_RE.findall(index_html): + path = _local_path(reference) + if path is not None: + references.append(path) + for path in sorted(set(references)): + if not exists(path): + errors.append(f"index.html references missing asset: {path}") + + entry_paths = [path for path in references if _ENTRY_JS_RE.search(path)] + if not entry_paths: + errors.append("index.html does not reference a hashed Dioxus entry script") + return errors + + for entry_path in sorted(set(entry_paths)): + if not exists(entry_path): + continue + javascript = read_text(entry_path) + wasm_names = sorted(set(_WASM_RE.findall(javascript))) + if not wasm_names: + errors.append(f"{entry_path} does not reference a hashed WASM module") + continue + for wasm_name in wasm_names: + wasm_path = f"assets/{wasm_name}" + if not exists(wasm_path): + errors.append(f"{entry_path} references missing WASM module: assets/{wasm_name}") + return errors + + +def verify_web_bundle(root: Path) -> list[str]: + """Return bundle-integrity errors without mutating the bundle.""" + index = root / "index.html" + if not index.is_file(): + return ["missing index.html"] + return verify_web_files( + index.read_text(encoding="utf-8"), + lambda path: (root / path).is_file(), + lambda path: (root / path).read_text(encoding="utf-8"), + ) + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "root", + nargs="?", + type=Path, + default=Path("python/probing/bundled_web/public"), + help="bundle root containing index.html", + ) + args = parser.parse_args(argv) + errors = verify_web_bundle(args.root) + if errors: + print(f"error: invalid web bundle under {args.root}:", file=sys.stderr) + for error in errors: + print(f" - {error}", file=sys.stderr) + return 1 + print(f"ok: web bundle references are complete under {args.root}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/verify_wheel_contents.py b/scripts/verify_wheel_contents.py index eb878430..0e41a6e3 100644 --- a/scripts/verify_wheel_contents.py +++ b/scripts/verify_wheel_contents.py @@ -8,6 +8,11 @@ import zipfile from pathlib import Path +try: + from verify_web_assets import verify_web_files +except ModuleNotFoundError: # Imported as `scripts.verify_wheel_contents` in tests. + from scripts.verify_web_assets import verify_web_files + # Paths that must exist in every release wheel (wheel archive member names). REQUIRED_PATHS = ( "probing/__init__.py", @@ -43,6 +48,19 @@ def verify_wheel(wheel: Path) -> list[str]: if "probing/bundled_web/index.html" in names: continue missing.append(member) + web_root = ( + "probing/bundled_web/public/" + if "probing/bundled_web/public/index.html" in names + else "probing/bundled_web/" + ) + index_member = f"{web_root}index.html" + if index_member in names: + errors = verify_web_files( + zf.read(index_member).decode("utf-8"), + lambda path: f"{web_root}{path}" in names, + lambda path: zf.read(f"{web_root}{path}").decode("utf-8"), + ) + missing.extend(f"invalid web bundle: {error}" for error in errors) return missing diff --git a/tests/unit/probing/test_web_assets.py b/tests/unit/probing/test_web_assets.py index bed37d22..f10ac2bc 100644 --- a/tests/unit/probing/test_web_assets.py +++ b/tests/unit/probing/test_web_assets.py @@ -3,11 +3,14 @@ from __future__ import annotations import os +import zipfile from pathlib import Path import pytest from probing import web_assets +from scripts.verify_web_assets import verify_web_bundle +from scripts.verify_wheel_contents import REQUIRED_PATHS, verify_wheel from tests.conftest import is_wheel_install, repo_root @@ -90,3 +93,54 @@ def test_configure_assets_root_respects_override(monkeypatch, tmp_path: Path): monkeypatch.setenv(web_assets._ENV, str(override)) assert web_assets.configure_assets_root() == override + + +def _write_valid_web_bundle(root: Path) -> None: + assets = root / "assets" + assets.mkdir(parents=True) + (root / "index.html").write_text( + '' + '', + encoding="utf-8", + ) + (assets / "tailwind.css").write_text("", encoding="utf-8") + (assets / "web-dxhabc123.js").write_text( + 'const wasm = "web_bg-dxhdef456.wasm";', + encoding="utf-8", + ) + (assets / "web_bg-dxhdef456.wasm").write_bytes(b"\0asm") + + +def test_verify_web_bundle_accepts_complete_reference_graph(tmp_path: Path): + _write_valid_web_bundle(tmp_path) + assert verify_web_bundle(tmp_path) == [] + + +def test_verify_web_bundle_rejects_missing_entry_script(tmp_path: Path): + _write_valid_web_bundle(tmp_path) + (tmp_path / "assets" / "web-dxhabc123.js").unlink() + errors = verify_web_bundle(tmp_path) + assert any( + "missing asset" in error and "web-dxhabc123.js" in error for error in errors + ) + + +def test_verify_web_bundle_rejects_missing_wasm(tmp_path: Path): + _write_valid_web_bundle(tmp_path) + (tmp_path / "assets" / "web_bg-dxhdef456.wasm").unlink() + errors = verify_web_bundle(tmp_path) + assert any("missing WASM module" in error for error in errors) + + +def test_verify_wheel_rejects_broken_web_reference(tmp_path: Path): + wheel = tmp_path / "probing-test.whl" + with zipfile.ZipFile(wheel, "w") as archive: + for path in REQUIRED_PATHS: + content = ( + '' + if path.endswith("bundled_web/public/index.html") + else "" + ) + archive.writestr(path, content) + errors = verify_wheel(wheel) + assert any("invalid web bundle" in error for error in errors) diff --git a/web/DESIGN.md b/web/DESIGN.md index fbe62a45..43c76e37 100644 --- a/web/DESIGN.md +++ b/web/DESIGN.md @@ -4,6 +4,42 @@ **技术栈**:Dioxus 0.7(WASM)、dioxus-router、Tailwind(dx 构建)、reqwest、`probing-skills`(技能执行 SSOT)、async-openai(浏览器 BYOK LLM)。 +## 双 UI 渐进迁移 + +`main.rs` 通过 `ui_version.rs::RootApp` 只挂载一个应用根: + +- `classic`(默认):原有 `app::App`,路由和组件保持不变。 +- `next`:`next::NextApp`,独立 Router、Shell、信息架构和诊断首页。 + +Classic 用户可通过右下角入口进入 Next;Next 用户通过侧栏底部切回 Classic, +也可使用 `?ui=classic|next` 手动切换。选择保存在 +`localStorage["probing.ui.version"]`。切换时整页重载,避免两个 Router、hook +和全局监听器同时存在。 + +Next UI 代码边界: + +```text +web/src/next/ +├── routes.rs # 独立 NextRoute +├── shell.rs # 诊断优先的导航与任务上下文 +├── components.rs # Next 专用页面原语 +├── model.rs # 首页/分布式健康派生模型 +└── pages/ # Dashboard、Investigate、Training、Distributed、Profiles、Explore +``` + +Next Router 保持 Classic 产品 URL 的兼容性,并在新壳层中直接承载成熟能力: + +| 工作区 | 路由 | +|--------|------| +| 诊断 | `/`、`/agent`、`/training`、`/distributed` | +| RL / 推理 | `/rl`、`/rl/train`、`/rl/spans`、`/rl/process-timeline`、`/rl/perfetto`、`/rl/inference` | +| 证据 | `/spans`、`/stacks/*`、`/profiles`、`/profiling/:view` | +| 工具 | `/analytics`、`/python`、`/pulsing`、`/cluster`、`/system` | + +Next Shell 同时挂载 Command Bar、全局快捷键、Investigation URL 同步、页面 +snapshot、后台任务与 Torch overhead monitor,以及可浮动的 Investigate 面板。 +Classic 继续作为独立应用保留;已知产品路由不再依赖 Classic fallback。 + --- ## 一、产品信息架构 @@ -88,6 +124,36 @@ APP_OVERLAY: None | SourceViewer(path, line) | Monitor(Tasks | Overhead) ### 2.4 侧栏结构 +Next 侧栏以用户角色和分析深度组织,并且只展开当前路由所在的活动路径: + +```text +Logo + 紧凑模式 / 移动端关闭 +快速搜索(⌘K) +├── Dashboard +├── Investigate +├── Distributed health +├── Cluster nodes +├── Workloads +│ ├── Training +│ ├── Reinforcement learning → Rollout / Policy training / RL Spans / Timeline / Perfetto +│ └── Inference +├── Advanced analysis +│ ├── Profiles → pprof / Torch / Chrome trace / PyTorch / Ray +│ ├── Stacks → Local / Distributed / Distributed Python +│ └── Spans +└── Deep tools → SQL / Python Trace / Pulsing / System / Catalog +nav(flex-1 独立滚动;仅当前活动路径展开) +Tasks · Overhead +Switch interface: Classic +``` + +活动路径同时承载当前页面的控制项,例如刷新、数据范围、cluster fan-out、 +采样频率和 profiler 启停;右侧页面只保留结果和直接操作图表所需的过滤器。 +展开状态完全由路由决定,非活动分支不可同时展开。桌面侧栏支持 288px 控制 +模式和 80px 图标模式;窄屏侧栏为遮罩抽屉,支持显式关闭且不产生横向滚动。 + +Classic 侧栏保持原结构: + ```text Logo ├── Overview: Dashboard, Investigate, Stacks▾ diff --git a/web/assets/tailwind.css b/web/assets/tailwind.css index 06bbdaba..13b04594 100644 --- a/web/assets/tailwind.css +++ b/web/assets/tailwind.css @@ -823,6 +823,11 @@ video { right: 0px; } +.inset-y-0 { + top: 0px; + bottom: 0px; +} + .inset-y-\[7px\] { top: 7px; bottom: 7px; @@ -848,6 +853,10 @@ video { bottom: 0.75rem; } +.bottom-4 { + bottom: 1rem; +} + .bottom-6 { bottom: 1.5rem; } @@ -888,6 +897,10 @@ video { right: 0.75rem; } +.right-4 { + right: 1rem; +} + .right-6 { right: 1.5rem; } @@ -972,10 +985,18 @@ video { z-index: 50; } +.z-\[10050\] { + z-index: 10050; +} + .z-\[1\] { z-index: 1; } +.z-\[51\] { + z-index: 51; +} + .z-\[60\] { z-index: 60; } @@ -1020,6 +1041,11 @@ video { margin-bottom: 0.125rem; } +.my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + .-mb-px { margin-bottom: -1px; } @@ -1108,6 +1134,10 @@ video { margin-top: 0.5rem; } +.mt-3 { + margin-top: 0.75rem; +} + .mt-4 { margin-top: 1rem; } @@ -1164,6 +1194,10 @@ video { height: 2.5rem; } +.h-16 { + height: 4rem; +} + .h-2 { height: 0.5rem; } @@ -1240,6 +1274,10 @@ video { height: 7px; } +.h-\[calc\(100vh-8rem\)\] { + height: calc(100vh - 8rem); +} + .h-full { height: 100%; } @@ -1252,6 +1290,10 @@ video { height: 100vh; } +.max-h-24 { + max-height: 6rem; +} + .max-h-32 { max-height: 8rem; } @@ -1268,6 +1310,10 @@ video { max-height: 14rem; } +.max-h-64 { + max-height: 16rem; +} + .max-h-72 { max-height: 18rem; } @@ -1316,6 +1362,14 @@ video { min-height: 0px; } +.min-h-16 { + min-height: 4rem; +} + +.min-h-28 { + min-height: 7rem; +} + .min-h-\[140px\] { min-height: 140px; } @@ -1332,6 +1386,10 @@ video { min-height: 36px; } +.min-h-\[36rem\] { + min-height: 36rem; +} + .min-h-\[4rem\] { min-height: 4rem; } @@ -1352,6 +1410,14 @@ video { min-height: calc(100vh - 11rem); } +.min-h-\[calc\(100vh-12rem\)\] { + min-height: calc(100vh - 12rem); +} + +.min-h-\[calc\(100vh-8rem\)\] { + min-height: calc(100vh - 8rem); +} + .min-h-full { min-height: 100%; } @@ -1384,6 +1450,10 @@ video { width: 0.625rem; } +.w-20 { + width: 5rem; +} + .w-24 { width: 6rem; } @@ -1480,6 +1550,10 @@ video { min-width: 180px; } +.min-w-\[22rem\] { + min-width: 22rem; +} + .min-w-\[28px\] { min-width: 28px; } @@ -1549,6 +1623,10 @@ video { max-width: 14rem; } +.max-w-\[1600px\] { + max-width: 1600px; +} + .max-w-\[16rem\] { max-width: 16rem; } @@ -1565,10 +1643,18 @@ video { max-width: 480px; } +.max-w-\[85\%\] { + max-width: 85%; +} + .max-w-\[90\%\] { max-width: 90%; } +.max-w-\[92\%\] { + max-width: 92%; +} + .max-w-\[960px\] { max-width: 960px; } @@ -1739,6 +1825,10 @@ video { grid-template-columns: repeat(2, minmax(0, 1fr)); } +.grid-cols-\[4\.5rem_minmax\(0\2c 1fr\)_5\.5rem\] { + grid-template-columns: 4.5rem minmax(0,1fr) 5.5rem; +} + .grid-cols-\[minmax\(180px\2c 22\%\)_130px_1fr\] { grid-template-columns: minmax(180px,22%) 130px 1fr; } @@ -1958,6 +2048,10 @@ video { overflow-y: auto; } +.overscroll-contain { + overscroll-behavior: contain; +} + .truncate { overflow: hidden; text-overflow: ellipsis; @@ -2133,6 +2227,10 @@ video { border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); } +.border-blue-500\/25 { + border-color: rgb(59 130 246 / 0.25); +} + .border-blue-500\/50 { border-color: rgb(59 130 246 / 0.5); } @@ -3563,6 +3661,11 @@ video { background-color: rgb(191 219 254 / 0.7); } +.bg-blue-300 { + --tw-bg-opacity: 1; + background-color: rgb(147 197 253 / var(--tw-bg-opacity, 1)); +} + .bg-blue-400 { --tw-bg-opacity: 1; background-color: rgb(96 165 250 / var(--tw-bg-opacity, 1)); @@ -3590,6 +3693,14 @@ video { background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1)); } +.bg-blue-500\/10 { + background-color: rgb(59 130 246 / 0.1); +} + +.bg-blue-500\/20 { + background-color: rgb(59 130 246 / 0.2); +} + .bg-blue-500\/85 { background-color: rgb(59 130 246 / 0.85); } @@ -3785,6 +3896,11 @@ video { background-color: rgb(168 85 247 / var(--tw-bg-opacity, 1)); } +.bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1)); +} + .bg-red-200 { --tw-bg-opacity: 1; background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1)); @@ -3897,6 +4013,10 @@ video { background-color: rgb(2 6 23 / var(--tw-bg-opacity, 1)); } +.bg-slate-950\/45 { + background-color: rgb(2 6 23 / 0.45); +} + .bg-transparent { background-color: transparent; } @@ -3956,6 +4076,10 @@ video { background-color: rgb(255 255 255 / 0.6); } +.bg-white\/70 { + background-color: rgb(255 255 255 / 0.7); +} + .bg-white\/90 { background-color: rgb(255 255 255 / 0.9); } @@ -5017,6 +5141,10 @@ video { padding-bottom: 0.25rem; } +.pb-2 { + padding-bottom: 0.5rem; +} + .pb-3 { padding-bottom: 0.75rem; } @@ -5033,6 +5161,10 @@ video { padding-left: 0.5rem; } +.pl-3 { + padding-left: 0.75rem; +} + .pl-4 { padding-left: 1rem; } @@ -5217,6 +5349,14 @@ video { line-height: 1.375; } +.tracking-\[0\.12em\] { + letter-spacing: 0.12em; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + .tracking-wide { letter-spacing: 0.025em; } @@ -5285,6 +5425,10 @@ video { color: rgb(147 197 253 / var(--tw-text-opacity, 1)); } +.text-blue-300\/70 { + color: rgb(147 197 253 / 0.7); +} + .text-blue-300\/80 { color: rgb(147 197 253 / 0.8); } @@ -5332,6 +5476,15 @@ video { color: rgb(30 58 138 / var(--tw-text-opacity, 1)); } +.text-blue-900\/75 { + color: rgb(30 58 138 / 0.75); +} + +.text-blue-950 { + --tw-text-opacity: 1; + color: rgb(23 37 84 / var(--tw-text-opacity, 1)); +} + .text-emerald-200 { --tw-text-opacity: 1; color: rgb(167 243 208 / var(--tw-text-opacity, 1)); @@ -5376,6 +5529,11 @@ video { color: rgb(6 78 59 / var(--tw-text-opacity, 1)); } +.text-emerald-950 { + --tw-text-opacity: 1; + color: rgb(2 44 34 / var(--tw-text-opacity, 1)); +} + .text-gray-100 { --tw-text-opacity: 1; color: rgb(243 244 246 / var(--tw-text-opacity, 1)); @@ -5426,6 +5584,11 @@ video { color: rgb(17 24 39 / var(--tw-text-opacity, 1)); } +.text-gray-950 { + --tw-text-opacity: 1; + color: rgb(3 7 18 / var(--tw-text-opacity, 1)); +} + .text-green-200 { --tw-text-opacity: 1; color: rgb(187 247 208 / var(--tw-text-opacity, 1)); @@ -5520,6 +5683,11 @@ video { color: rgb(127 29 29 / var(--tw-text-opacity, 1)); } +.text-red-950 { + --tw-text-opacity: 1; + color: rgb(69 10 10 / var(--tw-text-opacity, 1)); +} + .text-slate-100 { --tw-text-opacity: 1; color: rgb(241 245 249 / var(--tw-text-opacity, 1)); @@ -5654,6 +5822,10 @@ video { opacity: 0.7; } +.opacity-75 { + opacity: 0.75; +} + .opacity-80 { opacity: 0.8; } @@ -6178,6 +6350,16 @@ video { } } +.placeholder\:text-slate-600::-moz-placeholder { + --tw-text-opacity: 1; + color: rgb(71 85 105 / var(--tw-text-opacity, 1)); +} + +.placeholder\:text-slate-600::placeholder { + --tw-text-opacity: 1; + color: rgb(71 85 105 / var(--tw-text-opacity, 1)); +} + .last\:border-0:last-child { border-width: 0px; } @@ -6210,6 +6392,11 @@ video { border-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); } +.hover\:border-blue-300:hover { + --tw-border-opacity: 1; + border-color: rgb(147 197 253 / var(--tw-border-opacity, 1)); +} + .hover\:border-blue-700\/40:hover { border-color: rgb(29 78 216 / 0.4); } @@ -6223,6 +6410,16 @@ video { border-color: rgb(100 116 139 / var(--tw-border-opacity, 1)); } +.hover\:border-slate-600:hover { + --tw-border-opacity: 1; + border-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); +} + +.hover\:border-slate-700:hover { + --tw-border-opacity: 1; + border-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); +} + .hover\:bg-amber-100:hover { --tw-bg-opacity: 1; background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1)); @@ -6530,6 +6727,11 @@ video { background-color: rgb(91 33 182 / var(--tw-bg-opacity, 1)); } +.hover\:bg-white:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + .hover\:bg-yellow-50:hover { --tw-bg-opacity: 1; background-color: rgb(254 252 232 / var(--tw-bg-opacity, 1)); @@ -6801,6 +7003,11 @@ video { color: rgb(91 33 182 / var(--tw-text-opacity, 1)); } +.hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + .hover\:text-yellow-50:hover { --tw-text-opacity: 1; color: rgb(254 252 232 / var(--tw-text-opacity, 1)); @@ -7140,6 +7347,11 @@ video { box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } +.focus\:ring-blue-100:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(219 234 254 / var(--tw-ring-opacity, 1)); +} + .focus\:ring-blue-400:focus { --tw-ring-opacity: 1; --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1)); @@ -7370,6 +7582,17 @@ video { --tw-ring-offset-color: #854d0e; } +.focus-visible\:ring-2:focus-visible { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus-visible\:ring-blue-400:focus-visible { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1)); +} + .active\:bg-gray-200:active { --tw-bg-opacity: 1; background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); @@ -7422,6 +7645,10 @@ video { display: flex; } + .sm\:inline-flex { + display: inline-flex; + } + .sm\:max-w-5xl { max-width: 64rem; } @@ -7466,6 +7693,11 @@ video { padding: 2rem; } + .sm\:px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; + } + .sm\:px-6 { padding-left: 1.5rem; padding-right: 1.5rem; @@ -7475,6 +7707,11 @@ video { padding-top: 1.25rem; padding-bottom: 1.25rem; } + + .sm\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } } @media (min-width: 768px) { @@ -7504,17 +7741,37 @@ video { grid-column: span 8 / span 8; } + .lg\:flex { + display: flex; + } + + .lg\:hidden { + display: none; + } + .lg\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } + .lg\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } + .lg\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + .lg\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } + + .lg\:flex-col { + flex-direction: column; + } } @media (min-width: 1280px) { @@ -7533,6 +7790,22 @@ video { .xl\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } + + .xl\:grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .xl\:grid-cols-\[minmax\(0\2c 1\.4fr\)_minmax\(320px\2c 0\.6fr\)\] { + grid-template-columns: minmax(0,1.4fr) minmax(320px,0.6fr); + } + + .xl\:grid-cols-\[minmax\(0\2c 1fr\)_320px\] { + grid-template-columns: minmax(0,1fr) 320px; + } + + .xl\:grid-cols-\[minmax\(0\2c 2fr\)_minmax\(300px\2c 1fr\)\] { + grid-template-columns: minmax(0,2fr) minmax(300px,1fr); + } } @media (min-width: 1536px) { diff --git a/web/index.html b/web/index.html index 5f0eb166..9948cba2 100644 --- a/web/index.html +++ b/web/index.html @@ -3,7 +3,7 @@ - Probing Web Interface + - +
    - + From bbc73ae2fd85d65bbd15bde4045c78fb00e76f6a Mon Sep 17 00:00:00 2001 From: Reiase Date: Mon, 3 Aug 2026 14:32:27 +0800 Subject: [PATCH 30/37] Refactor Next shell and diagnostic contracts (#84) * Refactor Next shell and diagnostic contracts * Fix report module item ordering * Align hierarchical fan-out regression counts * Fix Web UI Clippy warnings * Keep local auth test client connected --- .cloudstudio | 5 + .rgignore | 1 + Cargo.lock | 2 - docs/mkdocs.yml | 1 + docs/pyproject.toml | 2 +- docs/src/api-reference.md | 22 + docs/src/api-reference.zh.md | 18 + ...raining-placement-64-ranks-tp2-pp4-dp8.jpg | Bin 0 -> 63322 bytes docs/src/contributing.md | 2 +- docs/src/contributing.zh.md | 2 +- docs/src/design/torchrun-cluster.md | 3 +- docs/src/design/torchrun-cluster.zh.md | 3 +- docs/src/examples/index.md | 1 + docs/src/examples/index.zh.md | 1 + .../examples/training-placement-validation.md | 75 + .../training-placement-validation.zh.md | 69 + docs/src/installation.md | 2 +- docs/src/installation.zh.md | 2 +- docs/src/reference/env-vars.md | 6 +- docs/src/reference/env-vars.zh.md | 9 +- docs/src/versions.md | 2 +- docs/src/versions.zh.md | 2 +- examples/README.md | 3 +- examples/megatron/README.md | 39 + examples/megatron/megatron_64_rank_mock.py | 435 ++ examples/megatron/run_64_rank_mock.sh | 40 + examples/megatron/run_64_rank_worker.sh | 26 + examples/probing-acme/pyproject.toml | 2 +- probing/core/Cargo.toml | 5 - probing/core/src/core/mod.rs | 33 +- probing/core/src/core/semantic_catalog.rs | 56 +- probing/core/src/runtime.rs | 357 +- probing/extensions/python/Cargo.toml | 2 +- .../src/features/stacktrace/tracers/pprof.rs | 146 +- probing/proto/src/lib.rs | 2 + probing/proto/src/protocol/http.rs | 48 + probing/proto/src/protocol/mod.rs | 2 + probing/proto/src/protocol/training.rs | 44 + probing/server/API.md | 31 +- probing/server/src/auth.rs | 20 +- probing/server/src/engine_lifecycle.rs | 4 + probing/server/src/extensions.rs | 5 + probing/server/src/lib.rs | 4 +- probing/server/src/report.rs | 34 +- probing/server/src/server/error.rs | 90 +- probing/server/src/server/health.rs | 1 + probing/server/src/server/local_auth.rs | 3 +- probing/server/src/server/local_query.rs | 11 +- probing/server/src/server/middleware.rs | 26 +- probing/server/src/server/mod.rs | 2 +- probing/server/src/server/settings.rs | 27 + probing/server/src/server/training.rs | 29 +- probing/server/src/torchrun_cluster.rs | 27 +- pyproject.toml | 19 +- .../bundled_web/public/assets/tailwind.css | 570 ++- .../public/assets/web-dxh2bd1b3fd6bc6d181.js | 5 + .../assets/web-dxh2bd1b3fd6bc6d181.js.br | Bin 0 -> 13351 bytes .../assets/web_bg-dxhba4994a23785c69.wasm | Bin 0 -> 6751870 bytes .../assets/web_bg-dxhba4994a23785c69.wasm.br | Bin 0 -> 1302861 bytes python/probing/bundled_web/public/index.html | 4 +- python/probing/handlers/pythonext.py | 8 + python/probing/profiling/runtime_debug.py | 401 ++ src/lib.rs | 20 +- .../server/hierarchical_fanout_query.rs | 16 +- tests/regression/spec/api_spec.json | 27 + tests/regression/spec/test_api_spec.py | 15 + tests/unit/probing/fakes/test_fakes.py | 46 + .../fakes/test_megatron_64_rank_example.py | 102 + .../probing/profiling/test_runtime_debug.py | 218 + .../profiling/test_torch_profiler_handlers.py | 19 + uv.lock | 3682 ++++++++++++++--- web/DESIGN.md | 123 +- web/assets/tailwind.css | 570 ++- web/src/api/cluster.rs | 10 +- web/src/api/cpu.rs | 2 +- web/src/api/mod.rs | 190 +- web/src/api/pytorch.rs | 74 + web/src/api/rl.rs | 2 +- web/src/api/stack.rs | 16 +- web/src/api/trace.rs | 2 +- web/src/api/training.rs | 45 +- web/src/components/callstack_view.rs | 50 +- web/src/components/flamegraph/model.rs | 29 + web/src/components/span_timeline.rs | 180 +- web/src/components/timeline_viewer/mod.rs | 1 + .../components/timeline_viewer/vertical.rs | 593 +++ web/src/components/timeline_viewer/viewer.rs | 194 +- web/src/next/components.rs | 275 +- web/src/next/model.rs | 57 +- web/src/next/pages/analytics.rs | 190 + web/src/next/pages/capabilities.rs | 126 - web/src/next/pages/cluster.rs | 315 ++ web/src/next/pages/dashboard.rs | 638 ++- web/src/next/pages/distributed.rs | 551 ++- web/src/next/pages/explore.rs | 34 +- web/src/next/pages/inference.rs | 338 ++ web/src/next/pages/investigate.rs | 72 +- web/src/next/pages/mod.rs | 102 +- web/src/next/pages/profiles.rs | 171 +- web/src/next/pages/pulsing.rs | 95 + web/src/next/pages/python.rs | 185 + web/src/next/pages/rl.rs | 337 ++ web/src/next/pages/stacks.rs | 283 ++ web/src/next/pages/system.rs | 166 + web/src/next/pages/tracing.rs | 525 +++ web/src/next/pages/training.rs | 234 +- web/src/next/pages/training_placement.rs | 551 +++ web/src/next/routes.rs | 26 +- web/src/next/settings.rs | 30 + web/src/next/shell.rs | 250 +- web/src/next/sidebar.rs | 770 ++-- web/src/pages/stack.rs | 284 +- web/src/pages/traces.rs | 256 +- web/src/pages/training.rs | 957 ++++- web/src/state/investigation.rs | 41 +- web/src/state/investigation_url.rs | 65 +- web/src/state/training.rs | 53 + web/src/utils/callframe.rs | 113 + web/src/utils/error.rs | 35 +- 119 files changed, 14272 insertions(+), 2870 deletions(-) create mode 100644 .cloudstudio create mode 100644 .rgignore create mode 100644 docs/src/assets/screenshots/training-placement-64-ranks-tp2-pp4-dp8.jpg create mode 100644 docs/src/examples/training-placement-validation.md create mode 100644 docs/src/examples/training-placement-validation.zh.md create mode 100755 examples/megatron/megatron_64_rank_mock.py create mode 100755 examples/megatron/run_64_rank_mock.sh create mode 100755 examples/megatron/run_64_rank_worker.sh create mode 100644 probing/proto/src/protocol/http.rs create mode 100644 probing/proto/src/protocol/training.rs create mode 100644 python/probing/bundled_web/public/assets/web-dxh2bd1b3fd6bc6d181.js create mode 100644 python/probing/bundled_web/public/assets/web-dxh2bd1b3fd6bc6d181.js.br create mode 100644 python/probing/bundled_web/public/assets/web_bg-dxhba4994a23785c69.wasm create mode 100644 python/probing/bundled_web/public/assets/web_bg-dxhba4994a23785c69.wasm.br create mode 100644 python/probing/profiling/runtime_debug.py create mode 100644 tests/unit/probing/fakes/test_megatron_64_rank_example.py create mode 100644 tests/unit/probing/profiling/test_runtime_debug.py create mode 100644 web/src/components/timeline_viewer/vertical.rs create mode 100644 web/src/next/pages/analytics.rs delete mode 100644 web/src/next/pages/capabilities.rs create mode 100644 web/src/next/pages/cluster.rs create mode 100644 web/src/next/pages/inference.rs create mode 100644 web/src/next/pages/pulsing.rs create mode 100644 web/src/next/pages/python.rs create mode 100644 web/src/next/pages/rl.rs create mode 100644 web/src/next/pages/stacks.rs create mode 100644 web/src/next/pages/system.rs create mode 100644 web/src/next/pages/tracing.rs create mode 100644 web/src/next/pages/training_placement.rs diff --git a/.cloudstudio b/.cloudstudio new file mode 100644 index 00000000..dc7d1680 --- /dev/null +++ b/.cloudstudio @@ -0,0 +1,5 @@ +[[app]] +name = "frontend" +cmd = "cd frontend && npm run dev" +autoRun = true +port = 5173 \ No newline at end of file diff --git a/.rgignore b/.rgignore new file mode 100644 index 00000000..cd4d8a6d --- /dev/null +++ b/.rgignore @@ -0,0 +1 @@ +web/dist diff --git a/Cargo.lock b/Cargo.lock index 82a18b09..36933ad2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3429,10 +3429,8 @@ dependencies = [ "libc", "log", "once_cell", - "probing-hccl-shim", "probing-macros", "probing-memtable", - "probing-nccl-profiler", "probing-proto", "pyo3", "serde", diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 96a6158e..4332ff53 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -173,6 +173,7 @@ nav: - Examples: - examples/index.md - Training Debugging: examples/training-debugging.md + - 64-rank Placement Validation: examples/training-placement-validation.md - Memory Leak: examples/memory-leak.md - Performance Analysis: examples/performance-analysis.md - Reference: diff --git a/docs/pyproject.toml b/docs/pyproject.toml index e7a4460a..1a96c2e3 100644 --- a/docs/pyproject.toml +++ b/docs/pyproject.toml @@ -3,7 +3,7 @@ name = "probing-docs" version = "0.1.0" description = "Documentation for Probing - Dynamic Performance Profiler for Distributed AI" readme = "README.md" -requires-python = ">=3.10" +requires-python = ">=3.8" dependencies = [ "mkdocs>=1.5.0", "mkdocs-material>=9.4.0", diff --git a/docs/src/api-reference.md b/docs/src/api-reference.md index 525324c1..3cb0a6e9 100644 --- a/docs/src/api-reference.md +++ b/docs/src/api-reference.md @@ -54,6 +54,28 @@ probing -t rank0:8080 cluster query "SELECT _rank, _role, AVG(duration) FROM glo In-process equivalent: `probing.query("SELECT … FROM global.python.torch_trace …")` when peers are registered. +### PyTorch runtime internals + +`GET /apis/pythonext/pytorch/runtime-debug` returns two independent capability +snapshots used by **Cluster → Distributed Status**: + +- PyTorch C++ wait counters for the connected rank (`active_count`, calls, + cumulative/maximum time). +- The job-wide torchrun TCPStore key catalog, classified into debug workers, + rank assignments, roles, process groups, and Probing keys. + +The endpoint is read-only. Known operational namespaces receive a short value +preview; unknown values are redacted. Full previews require both +`?include_values=true` and `PROBING_TCPSTORE_INSPECT=1`. Wait counters require a +PyTorch build that exposes the experimental distributed debug worker handler; +unsupported builds return `available: false` without affecting TCPStore data. +Older TCPStore bindings that do not expose key enumeration still report the +store's total key count and set `catalog_available: false`. In that mode the +response probes known torchrun and Probing key names with non-blocking +`Store.check()` calls, reports their count as `identified_keys`, and returns +store/rank/node/role/restart context in `facts`. These entries are explicitly a +partial catalog; the endpoint never presents them as all keys in the store. + ### Diagnostic skills Structured multi-step SQL playbooks (CLI, Web Agent, MCP). Skills from the bundled diff --git a/docs/src/api-reference.zh.md b/docs/src/api-reference.zh.md index d6224d44..5c6a65e8 100644 --- a/docs/src/api-reference.zh.md +++ b/docs/src/api-reference.zh.md @@ -54,6 +54,24 @@ probing -t rank0:8080 cluster query "SELECT _rank, _role, AVG(duration) FROM glo 进程内等价:`probing.query("SELECT … FROM global.python.torch_trace …")`(需已注册 peer)。 +### PyTorch 运行时内部状态 + +`GET /apis/pythonext/pytorch/runtime-debug` 返回两个相互独立的能力快照,供 +**Cluster → Distributed Status** 使用: + +- 当前连接 rank 的 PyTorch C++ Wait Counter(active 数、调用次数、累计/最大耗时); +- 作业级 torchrun TCPStore key 目录,并分类为 debug worker、rank assignment、 + role、process group 与 Probing key。 + +接口只读。已知运维命名空间只展示短预览,未知 value 默认打码;完整预览必须同时 +传入 `?include_values=true` 并设置 `PROBING_TCPSTORE_INSPECT=1`。Wait Counter +依赖 PyTorch 实验性的 distributed debug worker handler;不支持的版本返回 +`available: false`,不会影响 TCPStore 快照。旧版 TCPStore binding 如果不能枚举 +key,仍会返回 key 总数,并将 `catalog_available` 设为 `false`。此时接口会通过非阻塞 +的 `Store.check()` 探测已知 torchrun 与 Probing key,以 `identified_keys` 返回已识别 +数量,并在 `facts` 中给出 store、rank、node、role 与 restart 上下文。这些条目明确是 +部分目录,不会被包装成 TCPStore 的全部内容。 + ### 诊断 skill 多步 SQL 剧本(CLI、Web Agent、MCP 共用)。来源包括内置 `skills/` 与已安装包注册的 diff --git a/docs/src/assets/screenshots/training-placement-64-ranks-tp2-pp4-dp8.jpg b/docs/src/assets/screenshots/training-placement-64-ranks-tp2-pp4-dp8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..270e575fc27b2faec651ec3a79ac0ad398d268dc GIT binary patch literal 63322 zcmeFZcT`hL+c%72S5!(ssYjYpl`bG~loC1yvgt)a4+$t$DSB*_0KotOLRCUZfnb0H z2nP@W=|~`*UX-4<~RH2 z=+F0Dr_D{wOt|*#JALff(WA!%PM$h( zT1eo`86g2dL18f&31JZ_Q9;396n~MDJufFOcUD5_lG24sG8g17{6``C4j(>z?8q_x zW5@U}2nz~d_Y`YPkjlLer;&yu9(!8V_C`F$`Om(J~4zs$SFFD^vJCr2R+uPl0=?+JAui z;Gw-d4cPeS=H#xBp$0zx#Kfrr^t|*rsBmKk%7E*?Vpry)x9XLvPiDMhpjB zB+pG#^VRdK?352%S!pP6_{7s4lu6q8!=nvuAFH?Xkp@pAWS(v3@#6C~Qk|3GB)?9= za)Z8R?OaS#lLgR?8Mb4SRiP>>f*Qlcog*q#Qayo0Sn@U+uK)n6tew2WJVDEW)L#f2v=$}C-xda+Mu=>5!S8T6}t95ZZE`lY;x69f>u z63+kXs~Dn&v+HVQWJM3bze%VaWm)4nWm;!_bG6im41!S-L`0P7 zOS-4lXf~y=UK5aRIzv=|f|U-kCj}e3jGc_Yz_1X1TEsa#qPR`LE78rmqc>3iZCw)1 zG=P4;zWsVoJY^x1Cu!kryr-}(3dU9*wr_c8m{6`h=%%*f|KM_GI>$4ENvmlZxtAC$~Qt;HWO;@@ev3um&R_<2M1y4Lv%CZ z2b}0IVFYuIL1 z`Tc<&WZxxH<<`6AX*XGq0UbG%{jmSmS^X#NX2wZSaE|lsQZP*{{F_2}Q;%}HON=#5 z#z(_TbjLiw&&xrcaUPEmntJ{Nu#`U$Qn+AqqCAXfWp~ghg!8sM6qm22xkyvaGOo4F z&so-M1~;2KyBR-A&P3<$T-0#+CGgFLcLkE!6%GK##?bH30M#FC7SKe>hFw2dtI{ zMLGN8-}IMhJHRgXMEwA#>8ETM>IUGF&9^#dtjwJ?6-K_rn$_(5eo)}ev|MSE2g|3g zjjcX`i)R5(28ZNJDQBdRJ2}H;MdEPe#TVgAe6SM^?jzmHO`6pCnp%EJ+lQBzNOUD> zEMGlbc-C=ruBa6H+K2NUQ5<4tD}8*w=eDikkm{^C)(xlnu`4?KUF=rjGjejJeXe5y znrg7|wPrNgx3&^Hz-kHWQoLxBo-?CwQMzsE=zf7+YWdun9qlsaUSpG`HsIeFA=v-}wff?;&bt=wp1$CgSx78^*(kP=LH!P;w>qS;#y7ml5d_oK&lI zgS9VHi=@d(gQJc+zc6E@%x@u(Ilu1A4NTP;ZKsv+k9LVt$$GiGU>9iJ~pqPpgt~kpnbjE#E7^Ex@@@- zmU=%WszVox>d+P?;2UZkZvzGO!7=3h#TzF8<8zGpa^B?)W(&ZwQtHeekn%EOwbKuR=1pD`^ z6)!fHgwdJ8376cAwjW)tQLtno;4CZiA75OXeVhViMxvg5&veZDjqB-OyXd}gW{z{f zU1~WwzPRc^Zn2CGsmOGB8RkoWLo8VGv1$>$9_6QBDDq<6JpQ^ZlYL!P+etLv3H?J4db& zaupL$3v5I}LSk)*c$+x=qXS&_LIHwp1oXXR=ASKQ&fDwfMB!#hAv$LAqHH%5*}I!% zWKrMK5JjBi>g&O}l7Ud1a{$Wg^yl%wqRaL;PZrB@LN-QVQ;C!!nJzgG*XCPVtIqPw zmtiViG+kE|Y~c5%6doa(lK^iVL>$E)&ku-rwy-ac+!@fpT-{e1E`YuKyINHh26T>C zii2S)-0FjJhX$9B^IE5Nq?lLq3(q`2=agQc!Xt*DwZ+;&EIJFA2!}E%ok@jPxmB;E zNHDh!nxPi9q)vn%wYzVpB*RxuB4Efs(_nZ-UW4Vd@V@&aAF}(EAY#{sVH+n~;aC}{ z@#9Vw)QIEZqghaMBK54r#x49t)dC9xw#x-$R-XOdT@UFA?;BShUU+ zMuGz32RE9Jy23Jru1bQPELXghp$w1rO-J9~36Ooox30^bR2)dlX*25D3i%<}G&xU7 zJ@br^BEjQ*627}(y!I9>6Kn7#;rE5RMPE+ASKLZK(|)B|G2QZ{?4e8R*#`~%smFfT z5_&Mi>O@gEA#WE7AAb?vJ=d&8;GZi0$u%CiM7q?D#cJ@`DPm%?$QZzYyEQ;rHX9qF zqs#HKEN}Mc{d&cFsCA9)#OB9MP}K4#BZ>m+K~v&KAFw|t*fGVdU)h|2A@8P{8RmDob&){Lxngf# zS5#T%ZIziL*gdD<>z(U7U+qUl?)q8Rnq3-OymjnMQMr$FMi>kFG1R$A!3$d%`ZmkR z*aO~~MQ>|%T9=e-rTB(S0XNR%E8cb~DY^HPE0HQ;nzEH?)q0V%?cN8`6QJ02upkY=~Y) z)p=kDY#$CV=X{vUwlevZ#Tc0f6*U)Aqc{8eunD=tU&R`BGF9{h+AnRjRr=^%GgGy@ zXiV@PlXYV@$Wt7YvS1&pCPE4x6k1RFo{iIigL{&gu&_;Q93q7fC)juf?e>)^k-7CI zaX9zRr|E2Qk$4O6LkpC3H=`3S8&mFmD(*77I~j)0kNg(6GRCWzt4V0rbI`Z|EKtsw z+1Z@SRmCkek!V7l5Co^T$MdZ++H8ooChtp@W~U{}#!G32m` zpc=RC0Mx>;)MI8?4t;1APOIt=U5^u}~#zVzUUi@YzQbj2K8oGD3mN^XjlnYa{Vu!=8i zF6SGsnxqroH?5P}wG3pES)f0wjCo9^!39ul^?tZZ@k-Urgz(XiFQ0yd|I6!mZpOB4( zyKBH`fGFCEKn&9z2=JAN!xIVTGD|a0$gxiAQx566NRjybw3iu0T7ek8Ra*LVNoUiO z8^vuZsBRsHhNVM;)p#=z5z$*z)Yv(A(Kn^4S$L8AyMyn-m~1rF zyC6|c-T0XAvI%KPFEVJ1rhg&8swlg}T1YJBL|Le`cbY1Q;N=_Y)fA3^*JqA7gecGI z=IEy0xa^9(UOt+>Mk9@c>7XvlpS@yl;|b~CeUm%n$aX2A%aqp?53Z)(AAn3jsfJfn zSVoJ*iQ?N63UBBs91?Mv(M>mgs{(EhwTsv1aXZ8VMp^7H0lB84&MGJ2`rcJ{tXF+M zz8#kcW2s2Zq4WFA&YqxlT<>T)+^|eHDVjtz>o+FVdQOxN$sfI0>-l7AOpf@h)L9NI zTBSHp@lgukv;|hbjv?MdYK`KPVV4h#mXFdz*1^NjVNK$InTT*FuRA3=)EB@6Qw96R zXlCj|tUhZKz5Bq8kUd){iXnV4nX_Yq6|(1+p&=R$7w1A!?aJyV#dQ;ONT{L!-p>}2 zU|Era@~_Y?MG7B6%9B1vei$yxRD&8>_t~kb)N!c}aB(@e26AqW(^-(NG$Uj9Bw?Ay4Q{;h;Pd-%5!{?AJ2e$ihNb+JR0 zhz~-Cx;5(jxNztNmw|H2MU%pZ7ctA=MbLuWUOt^mJeE#ECC)U)(s4X8seei>4?I9uosG zyO)DOp@ZlY+&hf&yc>jo+3e=!d9 z?DC0hy80K6@ElbtNxpLvFxqk^Wzklff6+UArF&7KcreP`d2czbMYbr7$X=;TRn?}@ z(sUm{|5o%GR5zdM|4e->5;#L6HnT`95ZeHh-m$0~sFgD?IY9iG1yz5npH z)`p5r+mJu-x+<5vf%1#P7Qg)Uwtqs>h|R2C=>w1kPq`H^qN=KDbzrJf*X*q>i5Uo<^~E z@XSuOkhis)eV5;7NuO9QYvHH#>`DfRLS9iEKX`$9A{Cqy!@p*pKN|n(jk@~A&c%&} z-`+!chZgMuIWlo)0z#}dgBS`lw8>8{9_J)q$qBfVX6}NUrjP^rs?%?4v7aSa5 z^Z3S~oragAYXbI^1IZ6O7DOPC3h(clI#l3MRdJa*VBsNVoe>Saej5ubVe;Ai z)b4L8^sP`Iz=+<)G1AK#py`Vl3~EHk{07?qLEqWag|naMo!bb@>PNMQ)OY8!Su7h( z-ot%K=YeY|vW#pV{KBTj{dx%c4;J#@bm5nKzw0vI0q6fj?qBxfKP_{GRf$cCyh!Ku z-W*L{GJY^9ABHNg1%OG>fL)>(E8k_fGycdMr07T9TQA#z7+i%g5M+3b>9x`|EN-LS>45CovFd)lG=3Br6WsJ z9mgd(e;-1$ET&3kJTbzjx50Mg?VVGEb)cdg?jfY^{> zb?y@AVSjyDhShJ(fvIf`0l>L?PI0|Sx4zF56RJQja+!|Yh%{X*2lKY8kX(a{=y)-w zcNY5c89ZnK6TFZ8gnF&fc+UiR?(mC+wQH&p%DKD#VQy8r?dy zFnlW6wnN5CMf?eaAQ_s^cWsUa40BvN#%?OYQImJAEWY$r@HvUwMFaoBk2SB62@^O4qZ|g{7G;RVYijI^LoyOAS0_d)~NeA zK%~&Z5Kt2)jp$ramtkvSK25gcTTy zupBIEHmFJ(iAG-e$u)Q~!_WdRY<3d;;d+ORZ-#|Jt}!%W@kY3A&_|!3atGPn?x!&m z;4m=nD;J0?$=TU|VZPk^)5{reB0tbQOqm6!^EM0Py&-ZcJW_42!Cn=0_u74FCk&1| zv%n_1*CfG2U`rH*{#vmzd{3K;>)_w_w7>Hdt{K?8IIM*~ zrFEM`*@`!Q+geYczopu*s(lyfgipS@_wdeX(<7Tf9}HT4kNYE=Z@->P-RrgBbL7ag zKX_&i{PpgAzeuqgl7Dg?`XpR?tML8XU;q8|-<0}qt^M0t{&%1HKlYN-25-eCgGsrZ zzjZ<0F&ABoD`m?LJ~7?AKjpW55?MF6OP(}>lVM@kIsR1P?%S0y80$IBpIjo68NUjV zRg$ggVpc&?P7u(?G^aOP?>_k0Cj9-#@R#&|IZQnHbGX3#`j=<^XA=K%QhK-s-*PE? zBPx!LKi7Zm~!`^3+?U#Bj>SXQ0txxfc18i&iJq{%~yMMz&o|NEM^-csoJX zM=?BOmDnap@Mbc+6Js-9wp-ORc51~hap`UkqhPmPo)4D?KslTvw*+MrTsOT#@!HPa8fn{|u>CYn^!|SMbJ* zE9+DxsUR$*Mc#D&X|)9Z0byn!Jx@tRWgMTpqA7Xu17yr5(EGcyxvJjaLPa z-!r)X@KmkC^niug1~$&q*)=`T!$L!P6CetiniMUKcOU{Yhl5_z6LS0WeJ@%$=a?Nj ziXNJxrA=+a)Ii=8w#u0v{qt7B$`wEi0MbdF|3Jp?7$z;O7^T0@ezak0`X<#epSrjP zebb!%;@hg4`q5&6PwaqWyEhmYO-3h&epH%oI!WaBsHLrp`Axtox^JVO*s=oLb*V2|OUYc*INrOwi{lbiK<4*ZKo!_{){$XoT zrua);^vb5>pLpbN3#-px-wqCcOR)a+Pc;6k@%_)Fj!1kwxmwFM>-+u8U8uN?CeLL)du#_&i}+`Q|kPtf!>ABJ_Pq;Lo9dBj(jui5*;yWR;LZkG)qku z*cKYQukZy40cvNR1O}m3A;(CZVkglpZ4gAr*W37e&yf=RxDD`4?|xgxXIOTlw@tdF zUip^utZ`^w1FzQk-i;iCWVJJ;xSd2flH6<tNVV-op>khq#reOw_;B#X z(13-p>^ZQFjN*FtymSclbsx1e%h=e6qszGX7&^rqew|<@fMwH;Lo`djo~7~%PwctK zRvf36lQQBN)0Yg){M!71fSdCqnuwJ0ga$d?_uJ$iR|~@q(o1NH(;oW`C{J%1Xse>? zCD-+Cz=__*JlmypP;A@mTRh zF%g}vNl&X-Mc7Uf5@x%TXml4h9TwtTgn^*s8>NqEdS=9Q{z+3W950`d7Z$?F0#^;Y zgirFohQLkvG)fD{DNY7#l16rX?K$>I5+6wpMmFm=fS$+lQi|emRXX=`e)qfu@;)+0 zrItH|(3Bd5HkOnq$-~Nzx*jeC>{yTly(9d*YfXng(mrO*Hn$;yRu>N`2p)Z8<8i&C z5#wW7PGh^yz-2~YNa%Q3LB~casEk=|U8*SWY|e;~8j~va#>{%G&?fQ&kv2JE$=10- z)I)t1%UemAD5?3KBW(Tozk$x_t zqg@db(y^7ZwEX>JLx7C{Gx=H*=^-Bx-$Gi#mpVHwl0f~BA)=%am9e0tTI5iLd3c@u zxwvUzC7$D#76NmXprlTiz1^hO_+)M*qOX}UY3R9h=|sRSv%o!rk}j&mhq|br3eoAD zX>dhbp-@?Ca_q$`$?fC|3pYt9R*}7oAs$26=uK$q0R=5dmc7UYUt(}#4EfsDBZoG+ z*(nT0IN*(d$!qWeyg&qr(uyh3QA?QK9AaE}Ui>->;#&WKSVpVdvYS|cokQ>EwUIgB z6brfI!GgNt=>b}-{-V19=e#m2Tqm^8Aq#Mj;LkRgas~+CzEt-#NFrfqa4;-9uF*Xi zftn5J9xjqs`WSf8R+gC{<}q>TwczQx2oVUNEZyZMdS|>H_KJW8%P(6fZGCU@6)RP# zj$zog9h!Zh|;dNeaG{Y z>l9ALBo%hl3Z;5^t-F*xtxR&1AE$VIu-BjiwN*3rZx>LST2Uv&=}{cNCQ=;yZ1$!X z9s?Pvb#cuV&5itVUfxO$bw!d1-kis>Q}v7{9;;~PeE^>P4MTxKIxa?q^&Sy`8zBMUxjUMiK{*8HkFDY)*T z=iLU&s4KK8<2a~I{PoV~Y(Ukd6nuWXyM25Hxm7uheEi{dial;x;AE+BD;}jqU6hJ_ z6rv6J$pz~39%F@&YLuVV#r;ylaul=F2tS!m15p)9;#DWRye+hOgOP;Dr!N%!so`cBc#*#Q5!^)i!fBcuzS5uSId1jvdh4&9YXNe2%xZsicdC6o zXLc-YWa|+RXXB-#8%kePxHQUD(+_N?<^z+Il$0k!B1mJw!L0hE03KuUJ93v$Io+mH zW-|mZU2_)Nn47zz#CVd#IaW!mDN1)bR4tHm=bTGLPHIYp<%A~Enw)3pV0h~oDd#bJ z3P9%MT=q(%y3gAxIAKFH_eR|&_7)OCWw1tfU1}IIFNyG5N8r!1Ns?t|wwfA(U`lu| z-IxyDUX`(oy=7@*GE?TX=*%Hy%M;%&DY$p$M>O)o#vnp3(79Y4H@n~HSDs8iiD7L+ zFUL?VzZB{90zino7A&Z?BdATLHO!uJbgdgjT%5ttuo_rgPy!`WOS9J^$fERH(D%5P z=14Wf>(cyD#QKzmo%HG9@|3MSvM;IXD~8nQ=VC^szlYXT>*P3>L7}QROdApBI^*K} zlk0J_TKAMNKjf;Ck`D8Rt=(05-O?sdxZ!A0m@%>(&FQ<>xfFY@1EQpPWc<7aR>JvO zdFVKa1qC}VCPx1z_tKN2BuVB9M65JUt<4cQ^XP^#Ww`=Dvpwd903VE{@ zlK_86kRdVgJr)SBQ+(dvnTC?f{!+9zwQt9O8Z^fuR-TUrm=zD{^5IJ>U&{N#DnfBK z(p4(1qy(~`ir@-E^1I~?21Hg#-KOj%NuQDfHt8;ocJo0FeuOEFCj~WQT3R;LPM5UZ zyfgdoNTR=YpZXekQp2W-i0iI+7v9(uSPK)93-jXJ*-2yguQ422RlAhj1S8CBC!2b3 z2x4@}@KPN@30#^SjVJCf!di+8@$_cL3HiBhbXQF0n+av7q3$ulrEa;!NgZv4MP}dQ z;joncEWiG5ziQ>C#2bL*^+)aFMfsHdCAzPcs+HGI7tWPBiOIf5PP<4u;7FR94< z8udfA5Hda5BxR$I(TTep@HA5vY%;Iyz9@p}2SQ}hm6mfOQ{q@ru3rlcHLUpot2l?w zQ6lN>7R4uWw71QLCdO*M?*LYhGYZ?dknS+e2h+HKnQtl;>?Gp)J*rr55=ZJ!+xh>{ zR?_E>gQ;DQb&9tTO;j}BMRZAw!fCdBZ?eW4QvAcrYfqHlJs)pj*=x0#Zl>V+1<%xh*HBV<0NDVTFI8%Y%*N?13s)s$wBc`tI}G_sYm zw&0!E@8jLG-!zGe-rM~jn#W%M%)jtT27+$2pYsg+h$6~5a}dh~rp#bWuTeLNNCkj< z+|4Doy|*bRwl8>l1Juqg;!Nyv*O{3R`7xpQ#D?SdcS%%xqci3kFgnY`6Av^n?vZ@g`ehJlEpQbLN{g#3UWDns_e z?GpVAuUqZ$fIVJrvBZ%t0)J!6m14vg=QQ(d>FJ3p9P~XXu3(LJlsME_;g%HW-t(Cw zH+9>`_42Ti2lV-QtGIkZ=NmG%HxM(y)O4FLcqS+m*Y{{a_vTK#%I6l-Ep0Ero-`Ke z#(VGTWdTB1*XKQ1toNJhqduWy0^!yevR?ztjYtzFQ^k5G)mwN~v}arWe8u7|6x9I5 zl&Z!gZ zF{;?t5mn%7$@($O9%HqE?^}PkV2an$gQ+^PnC(b*&Bv5aeSD4H(T+1AD!dT>C`sR@ znKzn(6UCOTwiU3l%8E3E=Z00vXDO^ix~kMg??BBU4ucrD)%e7A+9F}V#>(Z|!YIc( z)Z0nWW(p5zDvi8&oTK50MPhx*y0eF<3clf+fx`5OCiYHkOs6{jK=}Hy$(?*rTY9Fc z1h=4>WQ_c5Z#kXSkRHC}adR|mZAFTZEBf$Q+a(+U?(=x4h+*IPhCs*#HH-w$e$86X zGa)4ofDPlU+!V8b?yXm^BqQ=x63DR$x8EG1)SewWqTu9W;l^Ajfi)Ez?l@o_QY$ZC z4*=bSTI*uNl9cyn=yJ*;fRiA|Me(|h_Tu@l#QmnEq;lVO#xkAtMx`$4^kDbm^oz2W z{srYEau~nS*E2~t!i?j`y``0yuC=dOmwpcw$TFugbaI5kbnH#$@Zuxd2^Ar4yJ+1@ zvi(IVvWe4Sj)G!5S2B*f87AmcE4Ffv=hQdmCq^tswjjOm!2M}-`+DLcTyFZIKrzAw zBRZ3LRJcQfG?@u)Xu5#+R1#0`ta~I-M>(r0Hs}@eT*t|A3D36*mQ)(2PxxrO+$e~e zAGF$3Lfl5We7XumFuuH*SJ9-AkxQR0-?o1YbRXEufa9k=v8EQ|A!AAE{EHCc#9PJC3U^i{XBOzKkNBbaoi3hpLcHjTq3OIsdpe&990Lk^LzNQJ?8~(y zeLM7O)yF=~w$(}hJfFRV@QvjPg!6<+dFb%l4!a-scpi6K$%TwuJt-6SI=_KXVTPztE<=Fc|L#Ir;2mB3Q;}^fDXp2w_06aJX4QZt`5 zwb}uWZ;l@+Yr{E+i6PDgoh#T)~9I4=?ONe~ww|iG>j@OKvsc!)AH?qWA!U2N?=9=0RXh@N~a_ktQ zw%6fqc8AT?ggrvIA}GTaEReA%B^GIhK&3X8*S@9GP}y%$Bg0TwNUMy(2SP<$iQH^7 zGhGF<$Mbd4L{1Fn^36El9$+u2ugNBNt5}ST<1%9BndPTyl zWMak7Ism9Cta{~r$6=EZO{07dDp4dIR`KQg5wAhk!!orqt#i)^C8f@N&ZcAGn4&R& z#HKM3sHFAFD+4Ip+V8eUbwI*UeYt>zsnFR6TGSv?Jw|_c*2rjV{o<6cwu>b#jUKz3VjVaBynJaQWmShU9d0{ zRk;olO-QLi7#S_S4a8@FG-`w|eNm7~KbU47MR-d>8zX{Jl&XWb9M&MuCwGun!q}l* z_W`=j;Teispg~A;WN^ZnK%M?>WHYu_tgQ%gD>ac6%m}7niQ8QTxrBK5_1# zI~wSFv}mm0eP6m=HtY$h9>KELXd3Rzb#9;p%JQN;M^j?9MYE$nPy#`V(0Q6Crrcx> zi3yb~k{m?=$#eYHYiW-xIdlFdflu-78s*gYRUtZwqFa9TIYaT+s;E z2)|sz+F+%INHHVvAOOLFyYHIXnBmW4aw|({aw|!HM5SDq_pz-{iOr*ci)ey9k-B~_ z2)oBAxyPX7^i#x2Um2MwO_TZ?Sn)mnrBc`~(pyBN^i>!d{=2e&n%vs5NhTeeZj@H^ z?IMN_4UJF$lnX9Ir?++#g$K3zrO4fkI$J_4!%7vyXoSwUXxDz)8!~-@_w>eX!E^fO zlx3@4y)v}1=iCMewILdOoaP-$Ax8RoTUe$)c`4xe8(I8mbHO6EX_s&tjO5$R@~Bxt zR-NuDS=959(L5Emx1a@>U@@~8YLSX7aYdol`K^K%$kAHcIB`1thV6Bo6ULBLb8NKR ziG(+#nJQ&(sF8~jJr9mh;BBcXeUN@2{L1T+mRyk?YhSw2aK-S7an-wEr(65yX^XkqXmJHJ%WBml|L|)U$q4eT>{8@AH7+bS_p(!n#^&oQ>gC5)KcZ zShv;kZ<5Z|1Yy3OhJ37#1Fg@adMg6C^p)pvojS>WS|h9ueP+i5GE`w@MAY>*%?&J4cBfU1 zY2jMKD%hZmTlQ0-Ok-DexO623{o1?FPf}@=l#3|2avr=6ZCSecJ0wGxF*>uTam)Hk zpLD8)AJks*uES_Tf-!zv4ls5y<>VP~J+A44I-~rtzBr_}8v&=U@H;|H-@qef0qZVj zXbg$3Iuhk}r5|SyHK)WTvBoQ)##Rll-E3S0>b%4IU7zR+;DCEoY~=2#i+~yAeys4W zldKszGxr&lDo@fk)61YSbsfH^f=`ORdT-e(4LA*j3ew}F=$zGzf z#z6DSiS#=rdg@-2Vm9odQXc7DG1|_nF$Ya(gvFf6+*oMEp|k2yfKy^UlOtP#KD6f> zOXbYVla^_X#YG@?3dFB!(Nx;zX-j@`GkfCKMPe;Wju_o`@)(*p7S9^DD>FY)K*CmI8jc z3D@XOU_m2hpp!KSMG98QKO}9LpOA=!C{x}f5NdZ%_G3I(+n>wt9MY4D zHBwHYxOI|pl|wHrpXb|ocf7Jq5K~!-Ps=fR@kJX1^mP-%tTKb%6}DmSCwrKYF4fwo zZ)-TPH#n@E5^pbLw3{>ArJnCwH;rLOC5oh0|L*>omrtlTQW2x=N(OlH4|{? z(X?Z79YZA>x>}C)M$w7x)kbU@-l(cb(z%n+z(CW_;Xzo9x{Th;d=Wb*@bxwaorO^d zVa6?YM1EpN$Scy}aEDBJ`}tP#+E;%Csl;j;8dD|p0e~_TqL{Ybk8bxr(N7XeJ@M>m zEHdz^GZtn($~+s5a0qrOS~i5gQEk{l;RT9fHGNt$b7Z?I^je*IP-o&+WROeVu2hSP zqEpQ{=ZYYGK*}5Ob(Cr`yzn-G((`GwK`SLrwqqR};104lB%$EX3CLIYfbH`d3JfA8 z(LlA(TBnR56ZsNz&!Jt*>W#aF<;cohSwvQo>%_&KW3dwL7f3aCi-ZaCvqkq=Y-K_y z#(hKqaAh005re9+#!o*pyEDq4y(le4aJGhR_Uv2A!MD4DhV7~s{KklTwOYR8p<}@B z?8-+fE#$$iLwmcl#qZ)9xPu0|I zUR%`D7vKmEL8sMT%|rdbZKUC%db%+f0Uf1}$5Z1^#)_jm;s!d~V${111Y>bIq?9U! z+~Gn2{`)S zHks6m&RWn!S>qE$i29cVCS&}Bt{5dvR6kD3GqjC^(0grfxe23$!;7Sl$b`h$hMsMA z-V~VnxPGs-v)~j<0c7DJh(u5V^&W-DJJFja$#t;9R^wLc8XN1wo*;ErIOwPa$S4)b z=8#f=y+cGGJ6Oj25V);-=TQsCBYptdlvDalI=C7;2J{7e3Ew-BAr~ga=VL9t==6wT z?!3V9rZh}Kt`9e>P6B$^T7a#bShw;TAD-s_>WOEUjDGWJVu61i#kB(5w3zGjalPuo z=p?M#Y{pl~$@uEy*KPw7X(lMsGiv*2T)DlQzX~egiY}b>5Gw-FGl_)Aeb;rC3#^ zcnuywP0SaGP=ScoKCpO4T>pMeKQQS=4Rl-acBV)ogAO7%M`~;=@zKUYJ>V6C9S6RF z2Yqxt=%}GbtX$MeUs4sRs;<}IaSV-4bhSGv8F2bgbsicLb1Lcn>hnT;6r)%7B!Tkk zX0kkC)BsY1OTQzTl4&&juMK{K0a5mn)$ZO(C}9Isl(4&Mwf$h z667}O2bW5r-l_3;TB2GuiDDwZNstgWcYgfX$5h5K&B{I|DNFx*?e=#x9aNM(EQ7Z7 z3}?&p?X>x_>^=MzZiP))ihL76mmWsh4g&UzQtuQmhntsHDJQpurhBlYdjdne$yKm79d2cfz4`946KFJ_(*?F(|DQ9`tIwrqFrDOXYbPL-jH!p%r$ZTLm< zUq`TOTZqHWzo0&P;iI#+$gb?Fq7tk?3-i_bp=l5=<1)KEF;Q6G`1dr)@W!Z-9jB8w z_dDA}$2YyRmHY#*|AiI!|Bdc*MCDip{wa|Zy0_3^jd9Mu1F?Vil>cEzYbl_rv|pCn zJ}IH2An8l_E~iMcV(XinPvZ!g&|pF4GaM(I_O~uxc`97u;Ky ze$nKVoNP8-_^fyC$$a^#ax~i6zL655y=6}ZH09;xV-D=Nb97>?ZYe6mok?eKIxnke zJDqQq351!krY~pGFWR5S7)(@j}7`VO^}b$kB*?f~<@;x_-6oBey4e;&-h{E3h5 z7XEh9chv89EyhRa`CtCT|KgK0|GNBxuFm0Hnlwd;{ElE%%`v z%BXtpxKXGzI#B+b`SY2*N%_P&y)`RgAwQ;%WUqscFhl9n0(_$fOL94V|WZ>1OtGsdXJV3ze(p_zH~ZGwNyfeU09v^%r0kdbb;cE^PG)+ybV0 zOJEi3K1`MN7bty&II=z(^;At(Tr)<{04_585LBSv~D#GONd zBi+S})%g`%8-RXzQOQs^CUSIs!Ro;3U6lmSRJ5s-ncU4R%Moe+_K;5Uy8T>;%n-3` zfUD~fl(Cw0%ACECoLJ6&ryPjviKRD9UqABnU#s?C=IrC%othlpA!`4DgtJ_rKgfS) zP3oQJr2ywiPGVj6tF5`-4p|ppMo@E`)b*fkAGD_F_S?~STcQCgE-qi4p9Pg5q(gGn{w{J3GPTk1y4kO$|8SeUlc8b^gZJh z82))S!eX`$nYHc8bG6|ahFXkHSrlFkp&^>H5vn@p%}3u-X^45eeb+WYm}~!U|D-Yh z_edyD|H+g8-IxBAg0pIN6bY@9$@Wu@vzE|N_w$xi3+a9nD#a^T3IOgRpw{b)>L1P4 zlI;%SEAKOvOf+0Xw^P*NIJ}RJA~G=Ti)Ckh`UkI>_Zvy+0*iP0c-68-YdZMBQ##P^ zh9XbfE}__|9A{I%z)3zl)43u=vmKiiNJ)&H2r?^5i;7u0}0 z*C|+XNG#rz>L_7W4DflWYX~a=@tUF+dAwH~z)Co>QG84gtZ2^V{CsGkgC`W3TKClB&nOZwZ%FQYMef^pzp&xR z|GuKt&Ay|_Da!>*18v^nU#ZBM~Q|st=J%9yAMfV@IQTlPrhjWn$BqlMqEz zE-$A!fRMRGDa$D*q){kv9Gk3I>Cm76A%?pw8;vG@y7mj)PqFRB-%-I-D~Hzp*`c<7 zko`Y!;qNAxCw@DY+EZmJ88#^8^0o3sa`U5)S)YECx$)v!`~6O1E^V*SUISkpU$fUE z3a9gu9YD60Q#j zypdT@dfq2Z&bcB~=sls~`Xm3cXC&y4%A}f~Tmm!tf1+FW#|PVIlu=Q_B{rPx2Ag$j z!#@CQl2Z^xOcQqW&H;>}-be>+2;UM_{|Ktsh-qU8CGL6%1^kffjQs-^`fRSKv`Pi_vc6;VfgTM~23FJho+YnsW#|3?$@l+6p79HHy8*WRJ%{%3d#DhJ zKR|h3Q9&HhZl_6k=)2vMKLB%+M_@z4yzmd*#Q&+H-~MUq_P$c`PoxXWEx@q`f6ww$*{~_spcZbQQSM9ULKaSUF%I%T%%1Hl zGVA_Eajc_Qs3OG@nuI1@x=KQTPy|xwNSB17RHcqO3IqcN3`p0|LIOd8fPo396zNC_ zy(rSF^bR*8&UfFLci#2?-|v3wyJZcFwH|m*&Uv1kviCmw?EU*a+t0jAUeOjkZI)cQ zyv^dJSm|fjuu^2&j#ECE7zLHyW4RTD*DPjiTkd`~JSGS2b-~|%+P0c7YU2p|{79aj zbszbnN!m3PK6dDzfB)%?eMyfqMEU8gsZ*zI`Eks^#?|!13a6fP zK3myf&p}gmzFNy#jM}aO9qH7epz8JcD1i%G_DfT5v!#Z(==$StA`S|5;*ds)!4B7P3kcb zo$dq&w3nbe8tBwh#J%HSbbTdR6?7%sCk!mZdan7UdjPUh?#i|?iZ_z;ls7z9fz59v zd&FDbA1rS|31)jgeP!ySJgA<+xYO4yukb(HzGX2dW{1upW2p*IEXhE}uXmPbOU_pG41^Sp zT;q0;Xy@P`ZKziNLLZvS;M~VIUC;hascZ-KFm~|Ed`ZVh{$M;^EscqFik&!k%1c42 zV&{V*e7Dkc!GG((GY1KJ-2M1x4bo1jP9sOIKc%jkkJ)JL-#m9jwxP!*;Xdp4o7Wt9 z_CK|M^Pj5!bkjdm;yvsdJ?Y+-Ei2TWeF5Mgmp~Td`+mriX_M8z0%8%_SVrjM#TOE%VZ=m z=GFeYeO_GY*W9q8fNW1tKFE}dOyEmp&O^Q&V51XRL_7{uRhGIYXpx4=;W~c_VnNXZ zmIgd6L&61ZJrDm>3;gmHe@g6Nb|qSjd+0nd%Zqt?1A*W0RDu;*{`EAz_C+q|0Au+d$P9ByL zH3b99Q}B1&Z;Y3@8J4wamwhXQGk4b4Gu{et33CJ9_)x26G&0{zi;p)_2}8XIOQ*HW z(r8IxCs*ualS!;5;xU(+4Ga!DIg#72&%{?e zv5I*Ej<)C=4&PQI&FkTvU*-adz$vlh<-)jgTnVw`4)Rx1d=HKUpL7DNjzHC0b@GrQ zii0|&pCba^`j}vBDPop4=i(0sn3yPAQ^AE@fE55q!GxKgENaer)tT#*Y6hoiYn{B0 zu3CW<-J;lejM7xHo@!hqSFGURjOWSMg%ekbedsBkQOq7yv?#?Vy2cTl;v8Z4jV?K6 z7*ITA$DcR-RTi^9pWeFaEc!@;lqKx!I*uY45+}Yox(7J9$E##^*>OjIei3XSby@%} z30ks`#zm@mIq3zF9edDBE8W$z<31{&m*j&Ln{tT|^r9ySAx6D2@yrM|V>T&IgNQDZ zwgv+ObK{e06;)BnTzUS84kMgBal$~3;ZboKBXFTo8~~AMZ%`HTl5A^4SPVL;yp20~ zqlw2I&TnK9PI#i*zro*CU|YUGBVwxI`Xq*FOJzh?rS_%{nv|Xy094`D8*#`lpQRT^ z+*O$*rl-eInQ6E?FRTG%zHd~Uszx6CwF6Jy{mT;k>&Z>@-+HBxExTznB*JY^cL<$WQ)?6D9e*shRN^xU*~GE<{UEjCfzq7E(?-H=|u zNHLu1RPpr*eqZ;^!ip1oW3+9fDbojr0tMMM64-L=K!^cayS{kwV}c z67MeGC-iDzCJ*}wM7NomYEP-ewJ+ai_pj|^tDkIrKLZt|(tl(oz*frh5Yc>XB#wg<U)WS2d_XC*e@(oO5f@9-HSFE23UvMIcDiN{s z52`%f?wNs{*nRBaQFDiOE(0ElD8?^ej^IchS144jB~oBi=C2#5&sWOcRyV+uVCI)% zw_ao*B^`N-!Fk8HQ&=&FGARiM`?%ZA5Zpk6Wm4I#pEu>-e}4DI_Gc%K1gikiKIB4g^~z2-o+3CTti?FXuXZ?b~4GL5!C&v(Qk0fP2smbVAEVrFgVq_Pmp z6E9?>Q|wBEGnZv1ITgG+?Vo@9jOXfDPhJ+Gu(|*#~YA!OW3r@4LCf^QjVw0f#%3YGLYZwM6&} zkqDuvCua$S5q)BZ-@sJllx^&_E7@(g@hTmNk=A(aDFq01QJe>B;8Iv(@9T8#5&O4_ zYn(4S0-3vcQ^=e1k08tBvmdYY zHtI%Vl-oLtRU9pxn915yK}jFKrnP=jK%ty+%>OpD;s12J$F4NM)Ud5pj@UJG)!F5{ zcEaZ-?g(&DswYdetohGK)zH?;Dh?T@w_HHCc4&X*K>^HFoa6wl4y~NZpZ|0p_Q!Se3KP8M(VaBu+_!-PgZar!fc?LGK*lfrSQY7uZqA*} zx>uGx3-87i+?PPYHnpE82OT@TJj!=)(ldhfsgI|(5UOYv4pA_vkNn0q6LRW4BsXPl9@(tPQx{S^0?-=P4d?AdH97NR}H)n2ZYn4j`Jx72FK2!2U{TI4&{^WFl-0t+xA|KF2EPqBz}avXL*rJCkY{l|#0Jv9%c) zGwGyYK~jQ&Tux%KPaQ9r3H3Jnu0HKwD?vHHLeh2ep4e4z{W8oFXnl4G3|2siCu32} z=sA$#Yp2uy`tg5z#>;cyPk`O!RPY64O&KXEG>PlX^Mg`8-^zcs=8td@eYoAY??;Zi z>%L6xe9h$4xNEV$Js00MS$`O+Hd8&lM20`LjD3i6Jq9iCJ~Z;U1($ty{{K=t+qL!@YUv`SfvI8AE z`s&>R(&YA_vQfJbM)%yQSK%vAk{)I{1gZ8-#;f1zsnPQtQAtx+yK-1tdd(G!eDW8{ zCcQB;yHd7xB38qh79j`kWFl58wEDRzuP1j)Bwm8mri4KdT{H)V3?&9`jyIXgg~)hG zo8pT>-I(mhMqhDahW_G;V%*tPwxsYzMycJ{1B7n0;};g^ITwWwYq!!M=wrR#ktu7zo?<9GE#YujXX)!)9v zm6=U+_iguffQ>#q-42{$VL3_;)-F3uNR2;>iQ&1Na_ITgXiHLWV~6v&;CzMOKykt7 z0myG|Z`Iv{nNZfof_8~#^$SJ&uwq|5U_Hgn=$IjyUy)yY?tbPH7d|B0-tmqq2ylx+ z40zKTaQv8*+oTaXo)o9XbFfFlO<3N;Pp9{1aXfX}ih(|BnQKMCva60Z#MLsi=SweD zwlPz{3pPI*%O*T`!#6$<8%FcyLYQdx!fW%^<;T3P{Z34Fh$nxKC1a0;shR^Z9p9b6 znaS4f5^VXsQ4$oRhh#jn1Agcm1^(Y%!T91out@&6zWkSM&;PDJ|5G@~GhF$!XmELy zppa*2-H>N`4#SIduOy$bZ0t^Ejb@eT!i6_)Kd%3}E7~6F{Mz%|x*BIl)2*Q| z-|mU6s);|{u{HPdCu>SG^Au;LWOgrUhX1Igk+h}oC^YQ-=k!(d5hiBCqxX=ofJ?Q*#%^wfBhdj5*G>ZP;)$|KZody3Q zi?@%#@t>#pvzd9GRwPmx9GSZ%I@5V__rlSK(LK3*+Zv}2%h(p&OG@3TO&fF~ewA#m zkFUL$lXxOSR+(7Vde(jyRAI)r8~^@v-jBY#yp#C8qVn@M)AI)c$D(Z~16Kru7j1J< zZyP>8n&zd*u3uWo|IzY=A04H3WUc9ZMe7i8Vne!9!OH2|^%X4gT+o@#uD`s>`GdbV zIWgbi6BPfwt&5vA$IZH9fo9E2MuP-zAhwtm zr}FdfYd5>5%!3SX;_?o2QUDv1ey6F6n5g_=A^zdgWX{nFr{CVkHzwtQ^d-T=H7qv587%neF&6c%x)qha7Zc>22sXF2k1q? zQGuZ@3T>UzCa%JUm$Kft8kuw4F-HX4`=U>pOyd!8Zyh%^oT7cYFU--JUCpspi@m5ZRNf+cv8`xBz;w`{0>A{$`6k$N!)_EI6 zX78eMx^%DT9e3rgsj!CM#O^Ya>S5pw7hEJ$zbvW1vBRNnuHq#*UnI+SyGwY}I<8a- z<9p)OA^-#$5!+qkZmBvFz=Q$Iih&J#(McaoJ{p|h2y`1)o~po*gEE6$w21{4@h$TB zo8@Lj9Lx9PS>Ke$#byu;jCt z?w$3bBLe_R!vR>q>d_B5t`~H5dh1B2b4GmJ))v-XRB~>aV$ew$b?)~vmwkQB+yQxC zt?fbmtM)|}33-8mm*dvmq&w|8R@^h(@?h=~d5J>yJ#0;2(01`0-)SXymQ;G%aVuF; z9G2VMK06j}5siycCzdcqw=R>>Gz)TtWVm44R4>U{MPK2~GXwzZVmGO?aGx|)QS zz+mCv(z)I+8+VS%%&N{JTSS+nsW^hWc_hNw9d{xAt8;d3g1qNxJ=9g%I&!8tLen!m z3Szq$5bxlh{GNGK{s#OunKLTy$&u>^rv!i{Y7KZHZyYbFQ*jMxu{9IdTTX`D)y(@w zBy+u)ZKfD)tKTrl@Z#EY@EQc}FUvG(Xge;K$vRc1@`O?X^| zg_~sx|AiCTA6x|vOBEO|svyfDeDRh|FPos-EA+{lTE~r7c4bSNMNH`L-d!5U1VZ(`Up-iP{r`$Ch6)o zn8b1czf0Bv;3F46n;+YuF}%7=SIMA?GazJzOS(XM{epGoyF2xIn*sF}+FHg&2A_rz zz;yGItzPM#?h{GwUU5pV-kwqlFD~PFsY_zZL&uw~W`r|J1$!~!Bj9yHnqJ!N?k5+9vZ??`oI-JHAgFDeErF6H=839Yg?ie&*CayHvU6ds*xYzOmEC}Q}$ z9wAZ!ZEtQjTg{=Iz|_20mk*UEJ`i7LkoAuF>cVes=FqcM<@2`;d&%fNFE@>hg=N=7 z`|we=hK3-f3EOVv5IedlkVW~p8=JVtk{7zIL5V@M-xQ2%M9^i)v3~vv=jUT2OQR{z zkw3q(vR5-r&o+wU%621;LS^7wCSAqL2F0{{qr>@@WiW%%yKFqpIT0gIicjGo>Kesn zzPa8C&&tGme2RMMdMSEAPw@EVQkiVu$*8X;El)aNt)|mx{t>iACs4Jb$S=)N`9%6X zy-)Vfq0l{+Csm_C47X0rwdeqVvS(oCOj0iT@i2h7Yp8ct7Y)6U_mc?}9x0Eg4HIm4!+aF(e`+1EU^&wp5S`9F41EAI2yZYKmS-5nJP@}{^vSk# zY$g{^7x~RnQ+~6Bd~0+#qA$*t)nzw<1x1>T?W7eJah-K47rDcF^wc}Cj7P_x=n!xl z{m}`F1McqgUL+57>ANuN5|{&r+=Y_`=kJeeawQV%+F35B|MI`yp8dO+(ANjrYITNu zW6OsiY%%+e#p++5yY$I3`L!-phHl=jz@3grb8BTD6@)RNza|O0Af|)xwPu~|%$Kk9 zZXcGTQx~p$f7Ju?@i!)fD*JL`*_~_|?o|kvDn=IAtaYl|uiEHwGv}sY#C7f7h%}ul z1Cz$;6xw7TfFRSRv~{_}=)P`r0qRv|P`OOS>+>R4Fa-l7`n}5X3Ggwsw z)x_t>WH4(S3@oH%qO41bTdL=jA_ThbcCZDrXihujXDOmDXd4@4~QT5@NK}*@Zn@i zZcET+HEOQ7!D*ecPeKS%gplz$xHk=FA@P zYV1@LF{k0-h@RjK>Iy-uDH<%EnNG}k81QopcY_E;C5}AAk0Op2l`+b=LR^bZw6sm6 z=yhiC=iGd&_r*jvf7Pm^0YA}S#>GbVDeqgcbk7wx>1i#zK+sp%Diqkhdqg7f*O_Xa}wc_as8ZiMw&g;;x% zRMUjLBx^qYDZyQ~gv(;XmCIVyMAKd62$Q6m7D!vz- zAL82mx%QUX;n4j8_3saO_xkwm_kzIhkN@Yve;SB?y88dKlWULVx8brS&gP;enaGh5(TP0nJ!w@bzYq&Fm6EH>`tnP#)6{Twjr(w|}}89=CtpQ0Ri!XO(8lNfEQeo@z1A-0sqO z{+gyqAP$`k+!TAHz&AV}3cdn6@KqiY0Qv~*i9)tO^y?8Ckw{enL}RWw2X89Z)>!B_ zKTxFS3%~lt_-4D2&iM%ff}wwO1?pWkc!hS zTlc^-jO^3-zno59`(J0B!zuY$FR}S#ydXNRwiw>GaRk{`XEue5q}Hu7F&sxoK46jy zTe-{966wpp(X%@Cf!URDDv2*l^qy2LW56hJIK@^V+_)0SmL!00El(#@!dCSrg-|sU ztx3F{^G!^Y;llj;Uw#ev<=%x1R%aE-i|=peEYPlOYv1Qtb{Iup)G?k+vB9MFCCA$< zaIf`I>$A&w&M=QVpzIB*txpZ6(Kw|unLY*Du_E^^6C#{?9|viPc0P{}j4{wJb}`Ai zJx5+LNChIQy@HYEd4cKCCfh9@t6A{U?8c?U0x5JnDa%>#^W4F(j1`IO5T2fC1SZiU zOi|Ya7VVrf6_F5fJM3rF-GGiKD!QmN+4r*Vf$9ZC?!aPYNAMt~pX_K*GVo@(GIQ?w zNJwnK@nj`!b4f|l9Ggv|Lr@L?)PbVOIpd6dT|H;b-8WKB9?T_H$txWt<;LlfgtO2Y zG1}?y=3)jlU}b)qr|WO6gHUGB8wDM@!j(I*p0Odc`YNU&jA zDONg{36;k*%*l=eftTtxC9A~m3h)FjD5G3RPpE{WP-9-17VX**gNV{P#}X4lw()O* zUBBEfl`y0LkNc$Ra9OjS?xK^O1(yKioxBQ{;C9s0(>kX(&5BGrxu?v=^#&Zch{fKP zNwV2ro%_m@YQJsUPz!H%==tTwq{CMs01=3?NmIaVk2|^R?X7?_cNg@HmtWu&RAqrW z6Rou)y~Od+Zd$A#qdRh`fLjUnx}!b@rg4PIUC!yyn!p68^4pmT$M!7o2z_@tHZvFG!3YeaO*b5nKo8~7a?qhMO;ScWNc$6fr;)#8V3RZq83E{&rqb1u&`A} zyJP2vHEkwdQ}INxB@+(cbS%;d@E;|}e~&{0lOAL}Kas`S;TcKa;e2oW7-VV9=3c~_ zNT4;t9E{!Ra5tAfXGHLTEy-4KUI$()z%A1);=L07oIjz>Wz_{xC&u>^OAb14gXppM zyhfq(=bUB=8-M$yRwmA-L9L;-vgj$;ySG25yqR8cO_7CB`Z3E{frj)QK=1zI#_AML zZINC4qskRVV|>3ISF=|-Z>0Ma`Ih2eGBbDyc?=3v`6to>I7$i1wmPmv-&2j(&fU zKdM~({Y8#k`;Q&|p9@U$E5GJ~;4x;l)WsV!6d1IJD})cmcUx4q>_wJ$EG+p*z4|OCFB%hAYsONUeS++?{p|6bZu|l{BcaK`OPqhJ zXwq|5)chXDnX0}l7daM|yw^lboHfyrMIn%Pbu<8wRZYbQ9Q0M82Sa+Bk~E9fZ9iKb zP4Oe<2c%1ay^X|BH451J4v@jvyYo1n-gEn3fz_;*s1^(Ud6MPWLM7gh&N8n=Nawmch%SXB0m6NVP){I(CE0ATSX6xQ;Yz(|#F5!DW z5fk;WL|9hYrhDWuQwaEvHZzK5JJ_b)1ac5^v)W26e8|y9JOotJpTN*Kw}=>X+rVjV zM@(NU*HnaKcg0oJw>5EJ?^Uz6Av?#jkb(pJcV&gVvSxaC_WF0rEbhkm%+;+*4PKE+6HYb5C*Q_@JFoT*$1;u~9qWN+e zdg_Bq>(ifn-kY*L;&NLYHpqP6qoM)!8i-W%TMjCdB>(`PYQw5WncZ{rSj?l7(Wk2W z$2vP34l2w=0P$=J6+PW?NWk1Q^}?lx<(IGpu-3E}Mwzg-^h}DRj&LvDkV@ zE&|pssKcR?BV#3g{N<|;@|d_pV!8 zf?Za9!mXWC73K?=#Lapl0Yjn?ZVyAX>x7Vk93z;r!`8u04ge=>YtT%DB%c$G8Ts+h z+V6nbzvqgvu>2*3{y(s(fQ`$g)|O3=pp>cycQLn!O&S}4L#?OW{jR(z^1AVwR{K## z4j`FJB$fHw+O<9~E@gNT0II0`&%a9h9vsXMoMhA!N8thPuzs_r3D+Ok8&$o+w`q5Z z^T#159{~g)Fr*@Cm-=-dNP~<0X1fwxXTmJXl9@Q?QCz}2o(JWxh51`fWxRN|Pjtn# zV0HaALVAEUu^g}^35OMWc9`v3=1OtLMq%bWQ7|y5qDkT<>}6geA!nh1-_0XS`9+== zQ>xAP6y8PcOK+TUd$lnoN{u?IZOs)@@1YfdUGT3UJcfvjttCw{sV^+_#9Xw;5CF+? zRZvpWpeKo=flmZ$E@<3nJ@JbFd9^66(Z^U0*nv{;fCxoFGZ`GDI$z7}Q<;#mh5_3f zXYH0LDI#XE78oX|C(JSrAABY;ePDDh|0N=;V|V_nulh-YoSi|bsenUXm#W8z5FukH zZwGTOYrcU%l|DAb{1M+Pn~zDavWectWC{0xBJNc zVHCAE1S5#G-Qk@@N&wNDFt$1W`-3E1qjHQTwHLtzsRuFSvGw=u@Mm3IK~MjNTIo5FcpV;Eq&#s1L&a{lUT2(dc8F zuY|SN%Z6HYM*0Vrf^S}mfaM8u7N&cPvvCgzWJ}6)spJ))sM;|=^?8S4C0PYUU&$_J zxJ!wLS&uxbjyKAF9xPrL)>bFz7{rQ9FC=WwMNWlRJbMa6Mf=B>mOsg2oS&EW4L*4T ziVF3QEKLmqs5$GV<1A{xEa z4}K~ak=Y6I>fJ$rO*fCnuHW2aiD{X-zu-61JM3ZkWq}~Sm|SJ3WC5g*nMk~;do0a$ zJ>SWhPN^m@Ct8%&2|aGr08tIcYH;bvSg+!Zkfyk))UY44Yo8?*)SV9dO1TQKw!uIv z)=~N`0m>Xp@RItEl13+(Je)6l-n@-EPX;5ALco=>QV?;KrU;bmk_|cP5$6K4Tjo%Y z!nVoeBQyiy=7G|UUvBTRH*!DtqzK2i1k?#(;u?!V6^~4&J41uQal3&$=s)^n^VC63 zxK)Kx!DU(&2F&G&o{s@_N+zalR}2*P>{e_(ZEqSy4?SMQ2Q+=kIma$V0c-1x(JaOa z1>+`&L?R8BQ#fp`+?|zg`WVeWR%VqTNwX$}RBtdjM^dnix_N(;a1)W4!$V?5wiIW^ z(z+g#je+F2wbi&SPbaFfUyt!AX1AXQ<{Ca*P86*j*FY*`5oD8E3@IY0p|mebN;v&n z*H@nxPh;qm2fUF2l&JcdCfgVSX?7i$)sWMd4&Uq*(#3HY3lGl*>aSKvGQIx9r6>;z z^$DA3@3Q6<6P5TTfy3UDX3<2n)kJR@zP5^bF9z~m5+FGlI|i8P{IOy zb>k*)91Sn+V$Qv0IX4JvV+E+8FjuXCH3hXX1+@t=t1xP|1rV57?(|}^2Lb^b9O{j` zu?}!ZE`zhp>Q`V0mP=~=Qv0fxxUWJ_f7i9I_Sphgf{zL`2N+0NJI36YNCTLQdOPT} zHfz%?gDRXGe2s2U1SF*d!$_@gM%{6`#~co*PBFkl`ZlILC~Y_Gyood!!+mNJ1{uM- zM;h1CaheL2LAl`cb?6m~qt|*6NcCx<7@(zW5Bu&(XuicjK#OS0*j!uV)KiUzE(NWn z+6q%2=TT&7r;V8X`FZ&8E~(PnAm7?j8W`%?y=9xacwb5Bw;`CiU~Fl$AEyigYHT*) zXl}0G-My+Imcoah%7*~RaPHdhA@;}W?!ty*a8`xbQi@`)PMa$mF^SSqZawLQn6pg? z$Vaa9cX}5MoR?^_rDB_e@fv~i8~kq4kS~=BiH+A|=<_Ky#4ge9<`M6h9oGb@2!`)E zDb>5_qb*%(j%QR4*zK-pW|ND~#I+y+1r+)~@nBo_i0x&&dh!v$tr46;q;vKji}ae? zYH0p0VPn!r6rS(JN$&J`tW%5g^#aNw73#Yb68KBN%%4WAK^jM_F&qMggCXkfP*Lyv z69@tvDLFqYxjNY3=rv0v2uPSBb3PPBd0SKTk_>;c-YoMak!amBZ`4+8p6cU<6i| z00Y;~)DnppOk^hpgMn#;Ek7WRe%l4o{1GO=S7uFaN`De)?|{9%1l( z54rQc>3tk?@7GpSJNyd#*a{|vlHe7b?-bv&)O{!8!x$cA3;2?cpZm?o?>wWS#3QhD z-qLqV^V7V&IM9wKv0dZpxK0{5D9wpdSAZP#ev~O6({&4e)3j>R#XHomBLu3N%B2GRc|xaI>>m|Le9_`5KJCH30g5$jp3&DLksFa zf}#@$3Xma2Y~<7sJ2im5?y`C-sfW#moEo-j212ZTyD*6_L1eDAVobUG8Kjl5{uHVXJ^&;luBqBX$#YP&d zjO4|^?4?Lasq>TsNx-sW*&d5P8FXSKSY5o8*x?%w^e}Sr6;Gtr=gn?#;Kz3lpS`b%dk-t8WHU6R!opCgGtDkwsB#D}e$bNO;6SEo8FrOw zmhj(4G{LCS4X!Qu*|>Ge1+|;BI*#NRO%)L)eyEbI2Lrqv_5A#H%i_>fYq+ymmhug= z?}F$GMcb62ZV{zD;8qsjWAMbGe{P8mYYX+tn=9KmBcJsKmpd)n{wcTF10D)l#cP}` z|8i1ZzTqd?xQJZG2)y8fb9lJBPhWxGGl%6i_!rYkR?D6wUEYK9L}D?0zQT^w z3Zmc}pkd@Js1E%c)2aEy zt~&Yqt+h;0{td1e45yEjo|U@5aSMfsIzQ2YzQRSxmid-F7RgkK@*CJ9_$jjfHSKj{ zCs5rcGNCSThTa};eln;QBN0m-;$P!4I^PY`VZjc@~*{(`l5JjRH$I{rCtd{eGCM?d7 zQV4BP*=h|)P97~KZNuLE?Kk-eNB{yzfXw(YX7PV7?fkD&I2>sAknphdc!eL1;#lTB zLuNbciD*b}(wol03q+*z_G81=&RH`O$mKgBZMzWdLTSd^C-*uLBf;GRbNWfK3s*Od z%%=DOy6ME2pFObHMl@oMNd$*8X5Z?{k@6ZE_OM8iH*5*?srqpHcB?g*zirrS6h|cw zzGjA%wdU7H6mW6OWDORQ%fP7zdrhd|0 z{wm|KN@C&RFMfzrqlVmAWE*wNa-b#)m zj>`^VynvX=2tDm=TM6tQxy8i}x2uz<<`T!t1e3#~8iEsW5(#;WD$fG(XMHPb3EGPu zp7+a%V9VGHx2|c~%$588*6u+=2@>DEL2O1pmeNlrD^}80BhNTa_?}ZpC?0D;4*`P| zJqqexl7hOceZ*AiSal-svmiu89-kw)KEj)&UYJf*uv-c=z0f(#b%l?I^@0*!n^M@4ak9E{3$; z-%*=8ZP~k#?+5~~rWZEGTFa-9f+$6ToyxLW}DWXpyA(FlYCk~Igqjox|mn8 zTe#aA=hO+woiz6rE*vSEr>^#uSF43&cDz83IJRJ*>1MegOPW7mfQwC<9&-2%Qso%e z96FhTg*>ihmg^-S2LnjPs-50nbIT z-@f<%nSUFXBSV`lTcD+_r9GAg7jhK*u<2Nh_$%E`9ea>|J_=B@bGr{91%tX<&JMgy z&pTomW*lpt#DxIt4=pHt<5a9<5LS38U^hyGvx3P>8Uu;_& zr`|lT%FubaHWnJU$AXC2_Xi#M{I~1+fA;1NyZP3>dzR(-Ujk152g>~~|HT9Tdsx6k z(!Mvi>ANRRpNmbGFEf)IrL5o?Aa1c+Pd0TmvM6O3xU+wZcPQF|hj16qHyF3 zF*GYQw~II59#a@vy1mEJwZ~##b+Sl6YpI}TZr-j3r~cf4$$8!Kkk)2j#AyP;nsvu0 zOpIDJ!AmSehCVRE1ke7MiZ9JBrj(>-hxjQ8r_7cCrKvd;OaCGrtoK+Hqjy4AMF~5j z+J)vPs702yhmr!a8%AzYD89l@{7`lkm9VL$G0URPiVvOJa1EWz_21<~8RO-?HhpED z`!FZI7+pNg@O$}v<7cY7Q(sa#KXOeRT`|TCJwQUMbjg^rK-!PgTn7x zWZ(P*HK~oUHgQG_n7UZ!Vk%w%bzipiOH=V|0++w!b_&*-kSSkxg0m{sUafmLfdc@xk1*cDI;#)EEz|lgF6hBnN z-kkcy{4 zee1Rh*Hq3ZcKDud{^(Lh4|4{s8Y}IBM(^zlZP#1JMBOJQhf=V0E`c8PkuxOE?fT6> zW|G<-%R9on=;GB^)>cz`^;hGBe0)zc#v4n}d7+Q<)=5FQYZc(FdaN_`tP`rZwL)>l zDE?0}V*ZDSApSq(Dn6M0;9VUsO=1@N>0LFh4$wm?OT<(tz@#ABy+IImx0_Ty>Pfd_ zdCeHiSdZz~0=c!AUwRexPzP&at8xzNBQ6z#D%IJ{DtuIR~rWS>Wg?{R}GXbDfUh;wfHO|tx z6oncRrW$q?Q6axHv^=6g*;^vM9#e_(VLa&SnpWT**uU#AGo+#=*{lIt}8=A4y=)jUTA^(B?Zxbrmmw{q3mpg@nK^)puh~lY;*});na8I4*L+~cG*MJVw zkXiP=^Z9iAkYdl!tD_eMrg;4f9t&C;cHkUvQyTy{q<71BauqH~^Sg&L)jAG+ES}Q| z3zGKktr@T)j`z5Cp+#D7`fuM&e0?^R{kXQfRS3(Uz*8`U%4Cpfe!gzXRV*ww|4%6| zaQs-0vHogDLBYEQ5)5E&R&kmh`ecu#WBk{jUH=4#c5O$Kg}>?bzN9p~_Tviv>j5A} zn>>l??kG#fgr}(yO~@GFTZGt`6y~Ye)4<>p)KY{ALL-GZnHYso@E50M##W7W=^9-J z!%fXi)QA%2zUs=y5!V2yuJ?hpu#wiQp zjhllP3mSajHgAj`#+!e4+aJFjDVX7%5x3EwB;+NGW7?pct9D!xH`_o3?eFC*NEF)v zI`c$~#N?9+WuI|Jn6$~%xiE9?HSWVQbtSl-O}mnWV$_;Foa?8pxr_sLFK2f5=VxXF z#?5&FNZX4{E{5s(4A(x^1dvrK5*rLE@8EwV@q4CW0*)QuC zxd0E3ksMQ=8Bk&!k_+g5HmlIAstObC&)|t7Lj;X^da7UNR17m1!og$SZRWTp7z<`c zWwhtVqoz4cuObPz((Bh zCDO75B0agoiy#H3_5mq-EVajDuODKt8Ax!b=&Tkml-E}9S#bTqDbouFvYZ|@G?_qbA#xWgJ70xlVF|h>n)z-aazwv51->+y%rNMreNg=6 z58szH=L=sT?H@Ax3(TYmT=LMdMf-swP@dz#XQxM8Z^g>Tq;5^(!7!gDMyWKxtgF%% zVoAy|g!)*-5XOg46>khuD7OKboXL$qSU}_mgZ}=Sa7Tf{X6t)H#bPPgy~npP4s`~G zR;e(}RZd*r{`YHv^7sp#3JZkMc!Fs1cmq2ok_iakkNZb6KFU~Px|R&L(`G zFW#M^$zPkbX;LQ{TZuak<;!E+V@mSa{SO_l?I!WG90xOqFb(;5KICY);q@nfS_aDN z{=5u`3fH$%fl2lX0fY(Pw_${EO=ceZvL9BkT$=rp1hR833xR_5ECT*|!q@XudhG5P z=}ER|0i1XOorQ%@+tz4_Oeh=WsJ3s``~CpbpV$GheY-$W4oT?_qF(#ux9#Y^;p{)l zuq$T}MIivl?%+_1wd(TS56(&Jkh6yn@elE-9U={vKI z6*QMptokYM+U@$eu&lWt-_A4ZinEE+axsL-U_T58X8S?Cur|*)w?L`MpI8$hD}z$bha{ZKNyNhRFSEZnSP7tSKsw}ThdR}X{#sfBj-Wt4OE+pskL9O1-OcvI` zlcxBa*B8dA^J}mjPo93)B~QrD^(Bl*PS}ygU8~LRWO}S%}q2qX(z%w$>-;GzM&JI?vU@boA4A~YT`NBOj)nw005>@-CV-3o{C3Tq} z+;D8mSr=LkHJGF&g)Nv}R>Y=k?;ThnG6-!~b~lE| z17N;z`%01)8{ca=;X^XfG`r6((ws>jzU=oSj9BAQN@-K_L`7nt3cII2K=<|8pF%I8 zfKBD|MY@y0p2${2$GcN2UsytIE#awGo6x^>ol?@Ybzu(YC7`KKgjy+G5EOAohHe>red`HWU-<4j{1%b>hvsqg5a41-G+@Fz9ME_L?5lYzc^Zuvw zsl(GpZhUP(`NUX5vxclx?8KZDaW~(vYw?3Qos-ZSX3i%J)2tk8OghgyUo?saLBXH{h}S}WRHg?RWw&z1F+ z7EadcqvLsaHge4K0N!eadVJ=1XN|b6?0#zYvc>uQU9fgm&y_^O)_(+mrf&k^6|P@; zz%UYMNWf?)GfvQ9$PV#{m$z(Gbge=%>W8wiUD%ScjR%9hGYL!7^N$CYFM1%OedibV zGz%2)GX#?Qk6h(vlTc)fz)M&1s>JW1@z@VpVf3W>0xXg$w>lZu*Klk$@8z*O+i-E> z6ncyaj3;6cB0ZKhNxRb0Bd4E^5D?eS3;}ViJ*}ZR>ylRWx5-%lHv<0p7U!7s#66t} z=O1;FOS!63wGXxlaDz4WKJ6dOLBpS>OKJ4V0OVJp^iOZBwv=hCu!A3eVfM*oK@b}6 zd1oEmSrgSs`LMXg_5W{?^uOOR{_6Z+)Be!^!qH;_aCqJ?m*)UiE-6-$3s1DF)2jxIReh27iyLH6WjAYHtanSQ+8x16l!+zCqf3SZq>CYM{&O{ z!oFu47qw-Mg?acUVjSnWWirW(lP}8^vlApq)N2X$9}`Lz0pu<=vq@cN5SONrx4Qh6 z9{)9Bh?D;VZ?C@wtnaHN(GV+ooHAhwW``yLQpDb2pMh^Y9b*iZift9>H1EUV(g;}c z%=Hxcnp|U}n3|%+*tx}3xbt?QYJr}oX-%R^ntWbZ0;_9I@hi2ywp;&^1RLVk`Kp)) zVulp)^;xpx9Qd1(&|9i9?6F7P)&kUM|Uk z_rtYXk=&?I)+i>gYOJMyL<+oAO9^upd=gxa4z5jw!MiK#*-y%<8lP?4t1V+>;UTbC zZJ+0+i6rM*p8UFBW7M`C%Bmz&AEH{0qo%?Q(MNqJ0%~IxNjbISR&nV~LoFWs1o^yB z+IxP{K-elOy#CS}9-EoJs*`7E7??|A#31BhpEAN4fppjJuU^W3J?}rMg zV>n>j;|GfQX%iZl$*v_yh~?d*;-O7u+h++AM$9QBgYQj}77{*4PmF_G91-TJy@G=& zAMbG*^Kt_kdhz50T}xMOs3o&SOS6N~^3&5Bulr~R4d^3&QLgpfQAC7bA@SLEF2g3) zGzz(>V%Ej@BNxb?;H&sO;j=$^CT;q0)b+?zn27LuCQa&4!#*-4-@lml;nd{8bX6T|l|=zs*be$ail`L7&@u4_zZ>jzn~Pjw`)(G|L9GnMrkChQb-mZ$9mB4pl>T`90UBQgzANsrm zj=E(w>^JeCR^dZ_!j5UUSlP77?x7LHTD&1X33CvLQ*sb}Zc+#P_fuN+8~h#h zn`}i2tsODsR@l}3q7WFOm@FXnFuze=QBiQ%$vcpye8zB|K`8<`34oWc5QqY^5J;R6`IMK8UQX@K(^Ppt8#h18R5R8 zX@~!J_u8s|wwwQJrboh`1`u6A(+A7|)G)wCo?2x!*aFUB1hZWa!U%yYxy}UYk|PVO zIs_ygd<6n{oF4KpIZLdojVUOf7$#GA?+rG97y%b(9mLTE9wLPAuTYclg*QXfWHY?o z;uqVC-2_Nk6^&{A6=YerMpb3kR#n3yapTht03RGDA@`RrG8RMoE?J~ByMBN#MN}4O ztB|jryvZwN5gV(;-Jpc`{Ji>TBDaIY*F^3nmweG;vAZUlbMx*C;aoi4h)EG=0mBW+ z?YUW*Zn5=fASm>2z?#ITm0yLXJ4X8))^-(YF^D(%lIB!NQgURpaKLJiVQ8> z(WUWpycws89QA>FRUkM^Gdu}4zgS>l3!C{r&M+>vEUVpLAU^E^K|?JdlA3RRn| z>gpa7=pMh6t$f&4$s_KALcle(uq zsH&3YIAO~IwtsYyTchuad0*+fKLe-#R*c_qRLrP1qwFT}IE4xVAvMz>KO2L&xfuC* zQdaF?!sAz<59&gdULoewc^cnEWBubNZO?3`MhE!Y)$40zO=xhR)LvCfa&FS4)jrR7 z&=2SA>L7?!J{8u|kY@|8hCuW;Ktuz~WoIf9<-6>|H16h`-TH0B*c@6JwIX&v)dA=@(o+sjG?J1veawj(4w z+u!VS0LR3y_k8Y&`aj$3|BK~cj6A4RATsa(^C&;0=)qV{ue;UoKUS0dXD$4P#$WIv zbvvyf2S?hw63(vg(n&AG=q;L{dF#$~`$($dx@55Eg~WkVCpHF0{$f7;u-WjrCvmHg z=qRvPgL?zAduu9GPRN)X{qrl3h=G&BW$U}&Zu>SQ|1PV9q%Wq@s0kFj3_=@su9E1P z10fj$A#qp&xlGFCzLd}x6W@RK2L3g{7dQpxk^JDmP*Lu!HzMi>y*^hY~`$obnK2-d^5LHJJ$0{C1pkDIm$Ln-j-bQcm@w-_kGvt(7@CChUf*m~Dy|I~40!oLu5j5De!7U?i1aiRmtd??g z1?-b-+zWy-qH9s|+CJlp`RG53k$a_`ScbGxRtafW>YOxqq@5ZKkXnmC#szD+Ny1{j~RRKE<( zhGBmz88)f30>%9NzwZ?6(+Owr|JP~6dZBTw_EmeBF|W@c(siipd!AG-+Rf=iOOolYrWYE zYpL!Ciu{~Jq0X^F)S2)>+)a3XZ7_4hQ(@+ZdX{C!6Qj?G0i*~%;ED{}ZesYJ$X*0q z`|F18aT$NR#SHnmOOVyxZT=sAY|2d%B18-fe?xKIYq$D%V7WVvWQg;C`NY`bT`g*> zk`oS>43LOj^Z2%Axpt0SJPp>24k?qh-m?F+QV#w=`t$Cd+)?T1eIA2GYSM|_{p0N; zA7BRhk1j9aA|K%oP-uC@htR!vJQ+IY<`0;6OITLqFmT1Y&sRNCIb+W|c4$|ggOqpQ z`A@*jMPpI~Zfm$hQdv&<*gnk7=C)e|efUkI`e-HB zQ&2}@a<0QWl;nuwN-+PUd8o!Y-RNWZf%6S@dLW3cLLBQmFPCG5uH{@-ExmLy3)$Lv zt8FmKOQLznEMw;0z1Xw%lR#pbeNl!IrELK3j(+LQsU~2kDy*yt*YTLVMyo~@1$?i4 zKU8w$qT{xJ;F3e`@!!c|oHe;KW?*DN6|E(i5s{N@@~9nKiO^*j_e$i_at-isIX~|Q zxHOsDf#nPPk2fI!jh88pTZNw~DpE%RqUutJ8qm>}ly;WdxW5nklcW+%GX&x5I+$>7 zGFC^l@$oZ7FVLGtVFhhHAEq_~FS}Q1*F?dfp@~?_m<7us<9nSXIKJGdK8}-^j>}>-$Nf1SHDfFbH=Iv;ZXY*+S(ggs8CF`n)W0eS1>lAS2QX z!uB^ZU&P`vcA6W$F5SX1)?@fYxd(@s;-dYsEDLs$dVj(z9KO}$x+h>FH6|-c&gQ6p zQdvy%%5L<&^CmNuBKw+zcZ!r#&ndoZ9}P})rwE+UaTi*2>Bbg3GbG^Yj zhDO})F7)H6C1QKy?aHYG7?K_Y&;bvNvD3+Da&-*LSjc#D-RBrCmT@T743yDtU%;o8 zjsK*Sa4k%>0eWT@J3Hw^4?JueVQm~?G}2?&*2$4B_x*sRB*OHPecS9C4`+fvDjVsI z$_m?(y39~$!-h;loSln?hnceu$N}c-_NrmnPwNKEw(qgTJ*Gy3+b?);MP{|6nT2hl zxDwriBM#yRI*$0~Sfnpxxiox=@0}Gy=fsU{WWuzwOI&1hve4k$aD*>`UPL+%%MUb8 zNB;Ptw}G#gG<%lLZO~+Nd4Jc&=3R>dz&bU zYXx@MVwQCphawt%l=i;}k9uE~f3QrqElcX%k|XyetSBW#VWZJ8fzpZwkj~=oYK4ey z7!F9nUaO1fW5(4%PSvW=!r*552>MxcdRAY^?h~V*_M;+Un%r(StWsuEsT&jYm z33-4-Anuh3W%!^IFe(Yy`9u9`Dc?7WDBdv{qfsb77PWKHroq}Max2&_6_tD>2CeW? z3o~v;y0kCC=t8GQp7~h79hvkSB6TPC?H5tTZq*@*PKKlo2^=C}fCsD3pN-u6TIQ!a zCXbBmco5j@TrZ9OSjWqIw}E4|iud&w(37#2S!GX0hUa4u1E7uTe&96(uCQJYRFav5@GAf5!0s z%jN60wHF0TVpAD*FSdce&a(wTDqpn(0oz(NgwyH`wN)!Hm=VZ(%`ylv+xpn{c`~Lg28&@52>Jb9t`Nh95RNa-5>w z5h~-w_k=gRE>)!MJt=APLd?Q)q(9Wc09x3c+}Uqnh0>(_{B&f=>5+=rgE6Dw`xPFZ zvK>hyK@Kf#@rE7EPCJk7n04MOb~XTP6-du>b92I%JjlZe{Kj5)&#q~C(%+6&^6CvKC@_(%2zmza^?x+i1kIKgAI``|0X^K_ zmU{4qI~he2FvIt!VuW<+o;t>j_NP`~-WQ#(VbE-*JxWgHEwxfkQ-9>1{(+jvQzZ~a z8=@qct?-QadML~yF_^Js&%XG)E!nhkxtJJZgTYtQR^CaG&Bi2p2b%^WCTz)Z;L}oE zcFO&7Og?H&plNN!x?Lng^uN*@SVd?HT-@awrlX#AF9Ojw&3y zK$FDNQs@Ro8J&?)yvN_25DWr9P2%IYcgr9$6m~ovu%`Q{Dm&LVd1cZDWEB!o+GD*I zn_0(Xb*)97Wv?Drv;JF(>g4gUg>t#x`~WA0 zSyqEz8oA|VxhGDb-x_>R`hvPzKzEJOKXFW^F*g8mFkJuFPf@& zmKA`Tqk8=taEFA?Wg^m0JoH|jTn(j(M0>}NbY{mkf$hbAJv=7;eO=7YID_8rq`DmAAU zYXhyIH5ykDZHB@a?2dfp=mip1;IYZ_g7ju(4HJi-&)#`RZs;@x$%N#DwB+9r1P<%R z@MV&8tK+LZ{f@bxCZLEsWdkG283R`h*ID48)uwh=Mgb|m&M^@QWX+Yq=84Zv2%Y%6 z@hZ9Q_t^g|%uL=#fBeP5VY2;s{mJ^NUxiN9nmeG}eY=NbZ9gbkFBb}2I=oHXO%Z9*ay zhoeSDF#(z`z6p$S@s?g@Y>^IkeZ=7>i@D_7K!GTFGo(-(>yZw*~XlQRfx zXfbRUmtYl}b|P)~?G8%0M~pPG*%sE)cVtE)4B+ldA==dwTm*(w^5e9HIM8Ad946Ob z8dseg6(uEerJyIGmuYT=u(ghrYtkB?MRRuNfj|eZgHorHhx@c2D6Oa6*cDplU|}X4 zgCok_+LXe_(AsC6#*q{L4%jwa=1h;#kFK!C@87gdnP!`EhDQhE39j}?32z_`k>XEc z?&?6W1d(doUks&a=IHb=g0&{Sc@Q7!;G_$;zXsQ;+}<6#vItADE1*yKcFd)Amkm$e z5eY-W!gcfC%*?zqFElodt-nK@baM-^hy#I?q^TU9itl{BzIa3D=7bXmE4(ghjVUGK ziee5qSkiF34pZFRj6-K5*7c%bF!xk?+M3FVQWrrp9!Uy`U2F=_s&#(L8 zVay!>&F7KYh*H7xN^N)sCZpdU0+=)!FJ|PV{&qE5q#&=RV)N%pByaf8rr)0=hC3^6 ze%Jw8d18%nNx-f9UDas2@?*8fuP?~NFb5O;iwVIjdU z8pSW!(K->M({zYh6f`w5NG3k1(@IZDNW~0u-5HRa_6K0tCq`J@X?6+c)&}%oc;&CJam`Q8<<6>c3{{t{Hv;Z0Pn7@dP@`gA>d`+3}i1${jM{_UA%t$ja_ zth%5rfmH4D6?>pYS>1!oW1xq&<>8&kS0A~CYax?7sL*%>dz|EO_?_BXj%0Y+)g5*n zhI0x1Xy0A);YJUI6ybf%P;qrh3bBC0X`til5zeh`xJ~b@A6AfQgQ3turA%*sC8w8Q z-=by6_BZPW->YagtQ_6rq)IIb_J-jJgp+a8r<-Co@;qRZtpDLB8^t zPlr$lB~U}n1_2;R0p!9tVrHl!plZ!+V-v+kE5SFmQc(!BQcCPrZJqetI!Y-C4nCaR zmnw`c=L8(7_xo*5dXKbOfv5O`C|&f_#Oc{W$2735&nZC=fNe?K+e=B8QZ%O3oX6>g zutHljJr1+(jA#>=|0d?#2X_K_ZqU%MAZv~^DJQhfxwIg82Pw6n=+el@8P{s%0v#p$ z=5Fdk`zhy9loUmA9HH)wg?qSo>7}K3(un<%q3Vsuy}pvCv>qKB|fw z9U^OA$+vrjWH0Yn*w;V!>{{<5XcJW5w586nmY}1)d}tzc?jw6@;!va5G0&Nh+h^~~ zd&IwXgUvj)PkPG~*Vc}5e95hLir$`tV`G#sB**34%X$a%yj`-|er{tzwO#aY8(ZCM z)XX18!uoh>cY*u~g7nz3Qb^v@WnW7ffmuDk&_d=2PxQ(T2cY+ZSI=Oow;HV>H3%8^ zd-tYjc;)IYNu~C*jabG_uC8Ai%(i#Q>mif*p~Aw5OC|T{)*GoYuo?|y1~Lk3aqAdi z>=5Om%9e7_K^$n$`=8;>dcy>!jD|KiMt?Kte>lrPjYNW6frc&N`YK?%QXaR!F#lpUUlZj@H5S(Vr_;zEg zm(8P(inbM9dPq&rO8t&bi#hE$SkRG+i`NgPZqqJ;W>d3rQWI6qW#XmFSrfQ;Rfxbv zU1qM*`Z&WGS0)kj>XxnRy^8_Na(REL^|g@<_)tOnTs~fyt~d933@_nq`n1VE zkjTk96Yobi)FpD_5$Ne}{qe~$$8#eC z=~3Nj#;dugwv;+PTHF3L4D0=58cND zlC>Ko1(>0s9uWXg*|=3iTF2|P)8e%*?nj?Zcy7dA4t&A|R&o6)tikoAgI9 z%VIR5BjXO5bog2DD^^4A<0BTt#{tmh3F3L6p}75>6`y2t+unN;&Gp$iq%2%YeeG~Y z6dj#c0TF9$yBYQTc*@0Y!nKCC(GjkD;s6MIBU{fWuUc9)%GGEP(;={WwJ2?z(Ayzu zthzVbU;iXLvUDL;HljdFNuDSsM{=)om3>g03B%5J1*Q4KUXL-rn3!1h2cn!BNIgf} zN5@z_QAIXQETrp6F_T1>#61bM6cl0wrs?tqyeIUIen70UDSNmeHf`4kOzG#^(Ki0E zAkWjXR^3^jTHJ%$I|6KOT|22FecWiF0N$rz*H_ql(tc#LpHOH_NvuQXbLr;P%J!<{ zQgm2Snn-#!5tU8K#u;KtT%;|~w1nU;@!(kX*hKuz+?<>Ao9D%3MMa}gR-V22@St+{ z(79;Q=fkDu)H9I2i4gI3if?v2zbJF)CFn@T?j&JM zoTUAsLp_nDB2J2fqmosGsu=GE2;6lL4)Q%lnAP0f2o|`fYViKx*@Biz22X{w&zCtU zw_zn_FT$*hE##ptFB0E_onJlUCY*8)l`_lk_X8uM&oaNaZnb%v|2o6HA}0*W@$lY{ z4jJtbV}p|@KE*+8vq^?G-uxJ*)=+obe94~rj*{A16KS^HMcrz50k1xabDp4yZCi4> z@4R2$Y*a2i3u_P=xrp2jt2cl`i`vIf2Jhr)nc2DC2)LE-1bPr{T8;s(*bG!hyef?y zyD%zput74byu%DJn`v!XpOkAElV3aVYM&3QE}#>)8eWstcs+0lrHO}4>4+z5o zlv5VT}Abdm~NwZy`jWz&N3~T56%GSWg@2d z(``4E9Z5OjuRnfQp(bp3D@Sz)5n%5dsJyfV#&NqdUo|&{0Ud7VPs|>gV_ughqU`S% z&@f8VS-j$jD-l&R+n>)eA^I|Q`;CuW$RhdN6^PoxnxXu~-N4kFt@=^JG20Pl00ZcU zhVliz&1@(h%~X!TbUBq>4w}+25*7T!s#1*1$^Y!T`Cl!ERvgNvrpJQN361qEJM(fw zJI=0=0OZJf%f~8Lb!pyePaw7;j$S{GWFYM9*xo8UGOU}ikjG!~3BG3rl%HBi+_e6P zKyA{NXYyT>z(JH1?1#HTTRwaCMKwPS2ANrpRu;Ou6o=;ezjgbd(3%n0-fCGwP2Q38 z<|53lYD7jx+1$QA&W5_sD37mqkP2hX1s(SK{=*EGC}ER(ub}9tmU>YKr1~8ciMuuJ z3dWe|^gw_`f&GN@b4l?9;ZovH$rE7~GEy!8$3X&Z7l+(jd|oNp-I*R4y_jUzYaa>& zs|GODo{n-3rF-wWV@LDFB8zR?4Gg+-_Mw+3DN0$X#@gl_9vnTed~DZ2b5Bv9xYO+% z$On~faxu);`;+Ea_m)$6J2GOgA2k>%pla`eYLUyUrqDI4`O*$TuYCaQeyC-t1p*w$ zsdqoeC_G?1HMX(?ZcZ-9X13VR9$z{fT6R?sOKK1EqUm5^M_bxu4ze#YIdaU&vKk!+1Xeurc#6ahT`UGtQB6x8op~PAMUp4;0Zk z*XTa#C6RnFD3?{(g!!cC5Uvq-K$&7YgM>k)z_~U4paAU1D?K zPajeRKQ?SkNCq6YvVg1#I7B{E zF+7IcCGptbd{ncttv#=Op2G+@J*JZ4+sdx}@RNtU!_E2;^1)DbE$T~0ZVY-Bq*`GW z8&@V%vEODX0&c|!$p|h3$B!@XT0o7m`Z5}=NP;;HNPI7Y1RL0J$cyPPxWM^37$01j zP#et*bg+G+zkJAoQtn6uSkiMsBinuQGwE*jF~&-Od5j8A?{C1Zw;+@e2jZ0I>kT5Q&`VUkmJOqGv7(Fv+AOSpW-)`xFw?H#1sE8z?VkEgx&9=w zQC-DS7IMV8EaRlqxsi5iOqk9-hF#ZD4~q^bwr-ZPNSx@cl)5CNA}HQwm$NaDUJ}ok z4;Al2W;aSZ#yiO6@}t&qrAsC zw()r+K1Sip$T(B18ru?L_8!)qgUgNjftD&^0+A)u8W0or#Uny2iumD&!hT-xIA|MT zr%BxctSxtn32T)lD#sWsWX}kI;7R}Pp%U(pmLHXdg)LmW?zk$evjMIht&dwh-J;=3 zTDAoL$S!H{A)m-4msVf-q`2v-T{Wb_3M5RFhE6}+brK` runs `exec(open(SCRIPT).read())` after activ |----------|---------|-------------| | `PROBING_PORT` | unset | TCP port for the embedded HTTP server. Set to `RANDOM` for automatic port selection. Required for remote access. | | `PROBING_SERVER_ADDR` | Inferred from port | Explicit bind address (e.g. `0.0.0.0:8080`). | -| `PROBING_ADVERTISE_ADDR` | Hostname | Address published to cluster peers when the server binds a wildcard address. Accepts `host`, `host:port`, IPv6, or a `{port}` placeholder. Required when the process hostname is not peer-resolvable. | +| `PROBING_ADVERTISE_ADDR` | `MASTER_ADDR`, then hostname | Address published to cluster peers when the server binds a wildcard address. Accepts `host`, `host:port`, IPv6, or a `{port}` placeholder. Set it explicitly on multi-homed hosts or when `MASTER_ADDR` is not the current node's peer-reachable address. | +| `PROBING_NODE_HOST` | OS hostname | Explicit host label reported in cluster heartbeats. Intended for container identity and local logical-node fixtures; it does not change the advertised network address. | | `PROBING_SERVER_ADDRPATTERN` | unset | IP pattern filter for multi-homed hosts. Selects the first matching interface. | | `PROBING_SERVER_WORKER_THREADS` | auto | Number of Tokio worker threads. | | `PROBING_MAX_CONNECTIONS` | `max(128, fan-out concurrency)` | Maximum number of in-flight HTTP requests. Runtime `SET server.max_connections=...` updates the same limit. | @@ -139,6 +140,7 @@ Non-PROBING-prefixed aliases are also recognized for Megatron compatibility: | `PROBING_TORCH_PROFILING` | — | Set to `on` to activate PyTorch module hooks and write `python.torch_trace`. Default when enabled: **5% step sampling** (`rate=0.05`), full-snapshot (`layer_rate=1.0`), **shadow cadence 4:1** (`shadow=4:1` — one baseline step per four probed steps for in-run overhead in `python.torch_step_timing`). Spec is `rate[:layer_rate]` (`layer_rate` = per-layer hit probability on a sampled step); a leading `random:`/`ordered:` token is accepted for back-compat (always `random`). Override with e.g. `1.0`, `0.05:0.1`, `shadow=8:2`, or `shadow=off`. **Backward** timing (`backward=on`) times each module's backward via output/input grad hooks; off by default. | | `PROBING_TORCHRUN_CLUSTER` | `1` | Enable automatic torchrun cluster registration. Set to `0` to disable. | | `PROBING_TORCHRUN_STORE_TIMEOUT` | — | Timeout for torchrun distributed store operations. | +| `PROBING_TCPSTORE_INSPECT` | `0` | Allow `pytorch/runtime-debug?include_values=true` to preview otherwise-redacted TCPStore values. The endpoint remains read-only. Use only in trusted environments. | ### Megatron autostart @@ -214,6 +216,8 @@ Hierarchical side-channel registration when `WORLD_SIZE > 1`. See [torchrun clus | `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `30` | Per-peer timeout for remote federated / cluster queries (seconds). | | `PROBING_FANOUT_CONCURRENCY` | `128` | Max concurrent in-flight remote fan-out HTTP requests per query. | | `PROBING_FANOUT_STRICT` | unset | When `1` or `true`, any federated peer failure or dropped batch fails the whole query instead of returning partial results. | +| `PROBING_STACK_FANOUT_CONCURRENCY` | `32` | Max concurrent peer captures for Distributed stacks. | +| `PROBING_STACK_FANOUT_DEADLINE_SEC` | `15` | Overall Distributed stacks fan-out deadline. Completed peers are returned as a partial flamegraph when the deadline expires. | | `PROBING_NCCL_CHUNK_BYTES` | `65536` | NCCL profiler mmap ring chunk size (bytes). | | `PROBING_NCCL_NUM_CHUNKS` | `64` | NCCL profiler mmap ring chunk count (~4 MiB total per table at defaults). | | `PROBING_NCCL_MAX_COLL_SLOTS` | `512` | Max in-flight collective/P2P event slots per rank. | diff --git a/docs/src/reference/env-vars.zh.md b/docs/src/reference/env-vars.zh.md index 1832a72d..7a9e4662 100644 --- a/docs/src/reference/env-vars.zh.md +++ b/docs/src/reference/env-vars.zh.md @@ -27,7 +27,10 @@ Probing 读取的全部 `PROBING_*` 环境变量参考(按子系统分组) | `PROBING_CLUSTER_FANOUT_HIERARCHICAL` | `1` | 分层集群查询 fan-out;`0` = 扁平 fan-out 到所有 peer。 | | `PROBING_REMOTE_QUERY_TIMEOUT_SECS` | `30` | 远程联邦 / 集群查询的单 peer 超时(秒)。 | | `PROBING_FANOUT_CONCURRENCY` | `128` | 单次 cluster fan-out 的最大并发远程 HTTP 请求数。 | -| `PROBING_ADVERTISE_ADDR` | hostname | wildcard bind 时向 peer 发布的地址;支持 `host`、`host:port`、IPv6 或 `{port}` 占位符。hostname 无法被其他节点解析时必须显式设置。 | +| `PROBING_STACK_FANOUT_CONCURRENCY` | `32` | Distributed stacks 同时采集的最大 peer 数。 | +| `PROBING_STACK_FANOUT_DEADLINE_SEC` | `15` | Distributed stacks 的整体 fan-out 截止时间;超时后返回已完成 peer 的部分火焰图并列出失败 peer。 | +| `PROBING_ADVERTISE_ADDR` | `MASTER_ADDR`,否则 hostname | wildcard bind 时向 peer 发布的地址;支持 `host`、`host:port`、IPv6 或 `{port}` 占位符。多网卡环境或 `MASTER_ADDR` 不是当前节点的 peer 可达地址时必须显式设置。 | +| `PROBING_NODE_HOST` | 操作系统 hostname | cluster heartbeat 中上报的显式 host 标签。用于容器身份和本地逻辑节点 fixture;不会改变向 peer 发布的网络地址。 | | `PROBING_NCCL_CHUNK_BYTES` | `65536` | NCCL profiler mmap 环缓冲 chunk 大小(字节)。 | | `PROBING_NCCL_NUM_CHUNKS` | `64` | NCCL profiler mmap 环缓冲 chunk 数量(默认每表约 4 MiB)。 | | `PROBING_NCCL_MAX_COLL_SLOTS` | `512` | 每 rank 最大 in-flight collective/P2P slot 数。 | @@ -41,3 +44,7 @@ Probing 读取的全部 `PROBING_*` 环境变量参考(按子系统分组) ## 其余变量 激活、存储、Server、认证、Tracing、采样、NCCL、RDMA、PyTorch、调试等章节与 [英文 env-vars](env-vars.md) 同步;尚未单独翻译。 + +`PROBING_TCPSTORE_INSPECT` 默认为 `0`。设为 `1` 后, +`pytorch/runtime-debug?include_values=true` 才能预览默认打码的 TCPStore value; +接口仍为只读,仅应在可信环境启用。 diff --git a/docs/src/versions.md b/docs/src/versions.md index 331beca7..59d0410c 100644 --- a/docs/src/versions.md +++ b/docs/src/versions.md @@ -20,7 +20,7 @@ pip show probing | Probing | Python | |---------|--------| -| 0.2.x | 3.7 – 3.12 (see `pyproject.toml` classifiers) | +| 0.2.x | 3.8 – 3.13 (see `pyproject.toml` classifiers) | ### PyTorch diff --git a/docs/src/versions.zh.md b/docs/src/versions.zh.md index aa194901..d3191701 100644 --- a/docs/src/versions.zh.md +++ b/docs/src/versions.zh.md @@ -17,7 +17,7 @@ pip show probing | Probing | Python | |---------|--------| -| 0.2.x | 3.7 – 3.12(见 `pyproject.toml`) | +| 0.2.x | 3.8 – 3.13(见 `pyproject.toml`) | ### PyTorch diff --git a/examples/README.md b/examples/README.md index 19d2cf6f..418b4d2c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -5,7 +5,7 @@ | 目录 | 主题 | 快速入口 | |------|------|----------| | [getting-started/](getting-started/) | Tracing / hooks / 冒烟 | `./examples/getting-started/run_tracing.sh` | -| [megatron/](megatron/) | Megatron-Core / fakes / 真 LM | `./examples/megatron/run_fakes.sh` | +| [megatron/](megatron/) | Megatron-Core / 64-rank CPU fixture / 真 LM | `./examples/megatron/run_64_rank_mock.sh` | | [imagenet/](imagenet/) | ImageNet soak / DDP | `./examples/imagenet/run_soak.sh` | | [inference/](inference/) | vLLM / SGLang | `./examples/inference/run_vllm_soak.sh` | | [ray/](ray/) | Ray tracing / actor spans | `./examples/ray/run_tracing.sh` | @@ -29,6 +29,7 @@ uv pip install torch # 多数示例 ```bash ./examples/getting-started/run_tracing.sh +./examples/megatron/run_64_rank_mock.sh # TP2 PP4 DP8 SP2 ./examples/megatron/run_fakes.sh ./examples/megatron/run_real_lm.sh # 需 ../Megatron-LM DURATION_SEC=60 ./examples/imagenet/run_soak.sh diff --git a/examples/megatron/README.md b/examples/megatron/README.md index 47807f88..ed758029 100644 --- a/examples/megatron/README.md +++ b/examples/megatron/README.md @@ -5,6 +5,10 @@ Megatron 相关示例:真实 Core 训练、fakes 本地调试、真 Megatron-L ## 入口 ```bash +# CPU 单进程调试靶场:64 rank / 8 节点,TP2 PP4 DP8 SP2 +./examples/megatron/run_64_rank_mock.sh +# browser: http://127.0.0.1:18080/training + # macOS / 无 CUDA:scripted fakes(非真 forward) ./examples/megatron/run_fakes.sh @@ -20,10 +24,45 @@ DURATION_SEC=60 NPROC=1 TP_SIZE=1 ./examples/megatron/run_soak.sh 契约测试(mock):`make test-python-regression` → `tests/regression/ext/test_megatron_contract.py`。 +## 64-rank CPU 调试靶场 + +`run_64_rank_mock.sh` 通过 torchrun 启动 64 个真实 worker 进程,并将它们映射为 +8 个逻辑节点、每节点 8 rank。每个 rank 绑定独立 HTTP endpoint 并自行发送 +heartbeat;rank 0 不再代写其他节点。torchrun 同时提供真实 rendezvous +TCPStore,用于调试 **Cluster → Distributed Status**。它持续生成层次化 +`train.step → forward / TP communication / backward / DP communication / optimizer` +span,并写入 64-rank NCCL mock 表,适合调试 Placement、趋势、timeline、stack +交互、诊断 skill 和部分节点不可达状态。 + +启动脚本默认将服务绑定到 `127.0.0.1:18080`,不会对外暴露调试接口;如需远程 +访问,必须显式设置 `PROBING_SERVER_ADDR` 并按部署要求启用认证。 + +这 64 个 rank 都是可达的本地进程,但 8 个 host 名称是为 Placement 调试提供的 +逻辑分组,不代表 8 台物理机器。该 fixture 仍不证明真实 Gloo/NCCL 通信; +需要真实通信行为时使用 `run_soak.sh` 或 `cluster/run_multinode.sh`。 +PyTorch main/nightly 提供原生 `wait_counter_values` debug handler 时,页面优先 +展示原生计数器。PyTorch 2.8 等尚未包含 `torch.distributed.debug` 的版本中, +fixture 会记录模拟 TP/DP/PP 通信段真实经过的时间,并在页面明确标记数据源为 +`megatron fixture`,不会把兼容数据冒充为 PyTorch 原生计数器。 + +Megatron Sequence Parallel 使用 TP communication group。本例中 `SP=2` 等价于 +`sp_rank = tp_rank`,因此 world size 仍为 `TP2 × PP4 × DP8 = 64`,不会再乘一次 SP。 + +只验证映射或导出 manifest: + +```bash +PROBING=0 python examples/megatron/megatron_64_rank_mock.py --validate-only +PROBING=0 python examples/megatron/megatron_64_rank_mock.py \ + --validate-only --manifest /tmp/megatron-64-topology.json +``` + ## 文件 | 文件 | 说明 | |------|------| +| `run_64_rank_mock.sh` | 启动 64-rank CPU 调试靶场 | +| `run_64_rank_worker.sh` | 在 Python 启动前把真实 torchrun rank 映射为 8×8 逻辑节点 | +| `megatron_64_rank_mock.py` | 拓扑、心跳、训练 span 与 NCCL mock | | `run_fakes.sh` | `pretrain_gpt.py`(fakes/meta) | | `run_real_lm.sh` | 真版 `Megatron-LM/pretrain_gpt.py` + bottom fakes | | `run_soak.sh` | megatron-core torchrun soak | diff --git a/examples/megatron/megatron_64_rank_mock.py b/examples/megatron/megatron_64_rank_mock.py new file mode 100755 index 00000000..cf70498b --- /dev/null +++ b/examples/megatron/megatron_64_rank_mock.py @@ -0,0 +1,435 @@ +#!/usr/bin/env python3 +"""Long-running 64-process Megatron topology fixture for Probing UI debugging. + +Torchrun starts 64 real worker processes. Before importing Probing, every +worker maps its global rank onto one of eight logical hosts with eight local +ranks. Each worker then binds an independent HTTP endpoint and reports its own +heartbeat; logical host names affect placement only, not network routing. + +Sequence parallelism in Megatron uses the tensor-parallel group. Therefore +SP=2 is represented as ``sp_rank == tp_rank`` and does not multiply world size: +``2 TP * 4 PP * 8 DP = 64 ranks``. +""" + +from __future__ import annotations + +import argparse +import concurrent.futures +import contextlib +import json +import os +import threading +import time +import urllib.error +import urllib.request +from dataclasses import asdict, dataclass +from typing import Any + +WORLD_SIZE = 64 +HOSTS = 8 +RANKS_PER_HOST = 8 +TP_SIZE = 2 +PP_SIZE = 4 +DP_SIZE = 8 +SP_SIZE = 2 + + +class WaitCounterRecorder: + """Record elapsed fixture waits using PyTorch wait-counter payload semantics.""" + + def __init__(self) -> None: + self._lock = threading.Lock() + self._counters: dict[str, dict[str, int]] = {} + + @contextlib.contextmanager + def wait(self, name: str): + started_ns = time.perf_counter_ns() + with self._lock: + counter = self._counters.setdefault( + name, + { + "active_count": 0, + "total_calls": 0, + "total_time_us": 0, + "max_time_us": 0, + }, + ) + counter["active_count"] += 1 + try: + yield + finally: + elapsed_us = max((time.perf_counter_ns() - started_ns) // 1_000, 1) + with self._lock: + counter["active_count"] -= 1 + counter["total_calls"] += 1 + counter["total_time_us"] += elapsed_us + counter["max_time_us"] = max(counter["max_time_us"], elapsed_us) + + def snapshot(self) -> dict[str, dict[str, int]]: + with self._lock: + return {name: dict(values) for name, values in self._counters.items()} + + +@dataclass(frozen=True) +class MockRank: + rank: int + host_index: int + local_rank: int + tp_rank: int + pp_rank: int + dp_rank: int + sp_rank: int + + @property + def host(self) -> str: + return f"megatron-node-{self.host_index:02d}" + + @property + def role(self) -> str: + return ( + f"dp={self.dp_rank},pp={self.pp_rank},sp={self.sp_rank},tp={self.tp_rank}" + ) + + +def build_topology() -> list[MockRank]: + topology = [] + for rank in range(WORLD_SIZE): + tp_rank = rank % TP_SIZE + pp_rank = (rank // TP_SIZE) % PP_SIZE + dp_rank = rank // (TP_SIZE * PP_SIZE) + topology.append( + MockRank( + rank=rank, + host_index=rank // RANKS_PER_HOST, + local_rank=rank % RANKS_PER_HOST, + tp_rank=tp_rank, + pp_rank=pp_rank, + dp_rank=dp_rank, + sp_rank=tp_rank, + ) + ) + return topology + + +def groups_for_rank(topology: list[MockRank], rank: int) -> dict[str, list[int]]: + focus = topology[rank] + return { + "tp": [ + item.rank + for item in topology + if item.dp_rank == focus.dp_rank and item.pp_rank == focus.pp_rank + ], + "pp": [ + item.rank + for item in topology + if item.dp_rank == focus.dp_rank and item.tp_rank == focus.tp_rank + ], + "dp": [ + item.rank + for item in topology + if item.pp_rank == focus.pp_rank and item.tp_rank == focus.tp_rank + ], + "sp": [ + item.rank + for item in topology + if item.dp_rank == focus.dp_rank and item.pp_rank == focus.pp_rank + ], + } + + +def validate_topology(topology: list[MockRank]) -> None: + assert len(topology) == WORLD_SIZE + assert len({item.role for item in topology}) == WORLD_SIZE + assert len({item.host for item in topology}) == HOSTS + assert all( + sum(item.host_index == host for item in topology) == RANKS_PER_HOST + for host in range(HOSTS) + ) + assert {item.tp_rank for item in topology} == set(range(TP_SIZE)) + assert {item.pp_rank for item in topology} == set(range(PP_SIZE)) + assert {item.dp_rank for item in topology} == set(range(DP_SIZE)) + assert {item.sp_rank for item in topology} == set(range(SP_SIZE)) + for rank in range(WORLD_SIZE): + groups = groups_for_rank(topology, rank) + assert len(groups["tp"]) == TP_SIZE + assert len(groups["pp"]) == PP_SIZE + assert len(groups["dp"]) == DP_SIZE + assert len(groups["sp"]) == SP_SIZE + assert groups["sp"] == groups["tp"] + + +def topology_manifest(topology: list[MockRank]) -> dict[str, Any]: + return { + "world_size": WORLD_SIZE, + "hosts": HOSTS, + "ranks_per_host": RANKS_PER_HOST, + "parallelism": { + "tp": TP_SIZE, + "pp": PP_SIZE, + "dp": DP_SIZE, + "sp": SP_SIZE, + "sp_uses_tp_group": True, + }, + "rank_0_groups": groups_for_rank(topology, 0), + "ranks": [ + asdict(item) | {"host": item.host, "role": item.role} for item in topology + ], + } + + +def _request_json(url: str, *, method: str = "GET", body: Any = None) -> Any: + data = None if body is None else json.dumps(body).encode("utf-8") + request = urllib.request.Request( + url, + data=data, + method=method, + headers={"Content-Type": "application/json"}, + ) + with urllib.request.urlopen(request, timeout=3.0) as response: + return json.loads(response.read().decode("utf-8")) + + +def _wait_for_server(base_url: str, timeout: float = 15.0) -> None: + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + try: + _request_json(f"{base_url}/apis/nodes?limit=1") + return + except (OSError, urllib.error.URLError, json.JSONDecodeError): + time.sleep(0.1) + raise RuntimeError(f"Probing server did not become ready at {base_url}") + + +def _configure_worker(topology: list[MockRank]) -> MockRank: + rank = int(os.environ["RANK"]) + worker = topology[rank] + if rank != 0: + # A caller may set a fixed single-process bind address. Only rank 0 may + # retain it; every other real worker must use the torchrun random bind. + os.environ.pop("PROBING_SERVER_ADDR", None) + os.environ["LOCAL_RANK"] = str(worker.local_rank) + os.environ["LOCAL_WORLD_SIZE"] = str(RANKS_PER_HOST) + os.environ["GROUP_RANK"] = str(worker.host_index) + os.environ["NODE_RANK"] = str(worker.host_index) + os.environ["GROUP_WORLD_SIZE"] = str(HOSTS) + os.environ["ROLE_NAME"] = "trainer" + os.environ["ROLE_RANK"] = str(rank) + os.environ["ROLE_WORLD_SIZE"] = str(WORLD_SIZE) + os.environ["PROBING_NODE_HOST"] = worker.host + os.environ["PROBING_NODE_ROLE"] = worker.role + os.environ["PROBING_TORCHRUN_CLUSTER"] = "1" + os.environ["PROBING_NCCL_MOCK"] = "0" + return worker + + +def _wait_for_live_workers( + base_url: str, + timeout: float, + *, + report_progress: bool = False, +) -> list[dict[str, Any]]: + deadline = time.monotonic() + timeout + latest: list[dict[str, Any]] = [] + previous_count = -1 + while time.monotonic() < deadline: + payload = _request_json(f"{base_url}/apis/nodes?limit={WORLD_SIZE}") + latest = list(payload.get("nodes", [])) + ranks = {node.get("rank") for node in latest} + if report_progress and len(latest) != previous_count: + print(f"heartbeat convergence: {len(latest)}/{WORLD_SIZE} live ranks") + previous_count = len(latest) + if len(latest) == WORLD_SIZE and ranks == set(range(WORLD_SIZE)): + return latest + time.sleep(1.0) + observed_ranks = sorted( + rank for node in latest if isinstance((rank := node.get("rank")), int) + ) + raise RuntimeError( + f"expected {WORLD_SIZE} live heartbeat ranks, observed {len(latest)}: " + f"{observed_ranks}" + ) + + +def _verify_live_endpoints(nodes: list[dict[str, Any]]) -> None: + addresses = [str(node.get("addr", "")) for node in nodes] + if len(set(addresses)) != WORLD_SIZE or any(not addr for addr in addresses): + raise RuntimeError("worker heartbeat endpoints are missing or not unique") + + def check(addr: str) -> None: + payload = _request_json(f"http://{addr}/health") + if payload.get("status") != "ok": + raise RuntimeError(f"worker {addr} returned an invalid health payload") + + with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor: + list(executor.map(check, addresses)) + + +def _emit_training_step( + probing: Any, iteration: int, waits: WaitCounterRecorder +) -> None: + # Deterministic variation makes the trend useful without claiming a diagnosis. + jitter = (iteration % 7) * 0.00015 + spike = 0.008 if iteration > 0 and iteration % 17 == 0 else 0.0 + with probing.span("train.step", source="megatron64.cpu_mock", iteration=iteration): + with probing.span("forward", phase="forward", source="megatron64.cpu_mock"): + time.sleep(0.0038 + jitter) + with probing.span("tensor_parallel.all_gather", source="megatron64.cpu_mock"): + with waits.wait("pytorch.wait_counter.fixture.ProcessGroupTP__all_gather"): + time.sleep(0.0012) + with probing.span("pipeline_parallel.recv", source="megatron64.cpu_mock"): + with waits.wait("pytorch.wait_counter.fixture.ProcessGroupPP__recv"): + time.sleep(0.0008) + with probing.span("backward", phase="backward", source="megatron64.cpu_mock"): + time.sleep(0.0058 + jitter + spike) + with probing.span("data_parallel.reduce_scatter", source="megatron64.cpu_mock"): + with waits.wait( + "pytorch.wait_counter.fixture.ProcessGroupDP__reduce_scatter" + ): + time.sleep(0.0016) + with probing.span("optimizer", phase="optimizer", source="megatron64.cpu_mock"): + time.sleep(0.0010) + + +def _verify_runtime( + base_url: str, probing: Any, nodes: list[dict[str, Any]] +) -> tuple[int, int, int, int, str]: + _verify_live_endpoints(nodes) + node_count = len(nodes) + spans = probing.query( + "SELECT count(*) AS n FROM python.trace_event " + "WHERE name = 'train.step' AND record_type = 'span_start'" + ) + span_count = int(spans.iloc[0]["n"]) + if span_count < 1: + raise RuntimeError("synthetic train.step span was not persisted") + runtime_debug = _request_json(f"{base_url}/apis/pythonext/pytorch/runtime-debug") + wait_counters = runtime_debug.get("wait_counters", {}) + wait_rows = wait_counters.get("counters", []) + if not wait_counters.get("available") or len(wait_rows) < 3: + raise RuntimeError( + f"wait counter snapshot is incomplete: {wait_counters.get('error')}" + ) + tcpstore = runtime_debug.get("tcpstore", {}) + if not tcpstore.get("available"): + raise RuntimeError( + f"torchrun TCPStore inspection is unavailable: {tcpstore.get('error')}" + ) + return ( + node_count, + span_count, + int(tcpstore.get("total_keys", 0)), + len(wait_rows), + str(wait_counters.get("source", "unknown")), + ) + + +def _parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--port", type=int, default=int(os.environ.get("PROBING_PORT", "18080")) + ) + parser.add_argument( + "--duration", type=float, default=0.0, help="seconds; 0 runs until Ctrl-C" + ) + parser.add_argument( + "--startup-timeout", + type=float, + default=float(os.environ.get("PROBING_MOCK_STARTUP_TIMEOUT_SEC", "180")), + help="seconds allowed for 64 real worker heartbeats to converge", + ) + parser.add_argument("--step-interval", type=float, default=0.5) + parser.add_argument("--validate-only", action="store_true") + parser.add_argument("--manifest", help="write the deterministic topology JSON") + return parser.parse_args() + + +def main() -> int: + args = _parse_args() + topology = build_topology() + validate_topology(topology) + manifest = topology_manifest(topology) + if args.manifest and (args.validate_only or os.environ.get("RANK", "0") == "0"): + with open(args.manifest, "w", encoding="utf-8") as output: + json.dump(manifest, output, indent=2) + output.write("\n") + + if args.validate_only: + print("validated: 8 nodes x 8 ranks = 64; TP2 PP4 DP8 SP2 (SP uses TP group)") + print(f"rank 0 groups: {manifest['rank_0_groups']}") + return 0 + + worker = _configure_worker(topology) + os.environ.setdefault("PROBING_PORT", str(args.port)) + os.environ.setdefault("PROBING_FAKES", "megatron") + os.environ.setdefault("PROBING_FAKES_FORCE", "1") + os.environ.setdefault("PROBING_FAKE_DEVICE", "cpu") + os.environ.setdefault("PROBING_MEGATRON", "on") + os.environ.setdefault("PROBING_MEGATRON_STEP_SYNC", "on") + os.environ["TP_RANK"] = str(worker.tp_rank) + os.environ.setdefault("TP_SIZE", str(TP_SIZE)) + os.environ["PP_RANK"] = str(worker.pp_rank) + os.environ.setdefault("PP_SIZE", str(PP_SIZE)) + os.environ["DP_RANK"] = str(worker.dp_rank) + os.environ.setdefault("DP_SIZE", str(DP_SIZE)) + os.environ["PROBING_ROLE_SP"] = str(worker.sp_rank) + + import probing + from probing.profiling.runtime_debug import register_wait_counter_provider + + waits = WaitCounterRecorder() + register_wait_counter_provider(waits.snapshot, source="megatron fixture") + + probing.step(0, micro_batches=1) + probing.set_role( + dp=worker.dp_rank, + pp=worker.pp_rank, + sp=worker.sp_rank, + tp=worker.tp_rank, + ) + + base_url = f"http://127.0.0.1:{args.port}" + _emit_training_step(probing, 0, waits) + _wait_for_server(base_url, timeout=args.startup_timeout) + nodes = _wait_for_live_workers( + base_url, + timeout=args.startup_timeout, + report_progress=worker.rank == 0, + ) + if worker.rank == 0: + from probing.nccl.mock import seed_mock + + nccl_rows = seed_mock(ranks=WORLD_SIZE, ops_per_rank=3) + ( + node_count, + span_count, + tcpstore_keys, + wait_counter_count, + wait_counter_source, + ) = _verify_runtime(base_url, probing, nodes) + print("validated: 8 logical nodes x 8 live ranks = 64; TP2 PP4 DP8 SP2") + print(f"rank 0 groups: {manifest['rank_0_groups']}") + print(f"UI: {base_url}/training") + print(f"rank 0 NCCL mock rows: {nccl_rows}") + print( + f"self-check: {node_count} live worker endpoints, " + f"{span_count} local train.step span, " + f"{wait_counter_count} wait counters ({wait_counter_source}), " + f"TCPStore available ({tcpstore_keys} keys)" + ) + + started = time.monotonic() + iteration = 1 + try: + while args.duration <= 0 or time.monotonic() - started < args.duration: + _emit_training_step(probing, iteration, waits) + iteration += 1 + time.sleep(max(args.step_interval, 0.0)) + except KeyboardInterrupt: + pass + if worker.rank == 0: + print(f"stopped after {iteration} synthetic training steps per live rank") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/examples/megatron/run_64_rank_mock.sh b/examples/megatron/run_64_rank_mock.sh new file mode 100755 index 00000000..6bfed8f1 --- /dev/null +++ b/examples/megatron/run_64_rank_mock.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# Laptop-friendly 64-rank Megatron fixture: 8 nodes x 8 ranks, TP2 PP4 DP8 SP2. +set -euo pipefail + +cd "$(dirname "$0")/../.." +[[ -f .venv/bin/activate ]] && source .venv/bin/activate + +PYTHON="${PYTHON:-python}" +MASTER_ADDR="${MASTER_ADDR:-127.0.0.1}" +MASTER_PORT="${MASTER_PORT:-29584}" + +export PROBING_PORT="${PROBING_PORT:-18080}" +export PROBING=0 +export PROBING_TORCHRUN_CLUSTER=1 +export PROBING_ADVERTISE_ADDR="${PROBING_ADVERTISE_ADDR:-127.0.0.1}" +export PROBING_CLUSTER_REPORT_INTERVAL_SEC="${PROBING_CLUSTER_REPORT_INTERVAL_SEC:-1}" +export PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC="${PROBING_CLUSTER_REPORT_MAX_INTERVAL_SEC:-4}" +export PROBING_CLUSTER_REPORT_BACKOFF="${PROBING_CLUSTER_REPORT_BACKOFF:-0}" +export PROBING_CLUSTER_STALE_SEC="${PROBING_CLUSTER_STALE_SEC:-15}" +export MASTER_ADDR MASTER_PORT +export PROBING_MOCK_PYTHON="$PYTHON" + +"$PYTHON" -c "import torch" 2>/dev/null || { + echo "error: torch is required to launch the fixture with torchrun" >&2 + exit 1 +} + +echo "runtime: torchrun 64 workers · 8 logical nodes × 8 ranks · TCPStore ${MASTER_ADDR}:${MASTER_PORT}" +exec "$PYTHON" -m torch.distributed.run \ + --nnodes=1 \ + --node-rank=0 \ + --nproc-per-node=64 \ + --master-addr="$MASTER_ADDR" \ + --master-port="$MASTER_PORT" \ + --local-addr=127.0.0.1 \ + --no-python \ + examples/megatron/run_64_rank_worker.sh \ + --port "$PROBING_PORT" \ + --duration "${DURATION_SEC:-0}" \ + "$@" diff --git a/examples/megatron/run_64_rank_worker.sh b/examples/megatron/run_64_rank_worker.sh new file mode 100755 index 00000000..e77f03e4 --- /dev/null +++ b/examples/megatron/run_64_rank_worker.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Configure the logical 8-rank node before Python startup hooks import Probing. +set -euo pipefail + +: "${RANK:?torchrun must provide RANK}" +: "${PROBING_MOCK_PYTHON:?run through run_64_rank_mock.sh}" + +logical_local_rank=$((RANK % 8)) +logical_node_rank=$((RANK / 8)) +tp_rank=$((RANK % 2)) +pp_rank=$(((RANK / 2) % 4)) +dp_rank=$((RANK / 8)) + +export LOCAL_RANK="$logical_local_rank" +export LOCAL_WORLD_SIZE=8 +export GROUP_RANK="$logical_node_rank" +export NODE_RANK="$logical_node_rank" +export GROUP_WORLD_SIZE=8 +export ROLE_NAME=trainer +export ROLE_RANK="$RANK" +export ROLE_WORLD_SIZE=64 +printf -v PROBING_NODE_HOST 'megatron-node-%02d' "$logical_node_rank" +export PROBING_NODE_HOST +export PROBING_NODE_ROLE="dp=${dp_rank},pp=${pp_rank},sp=${tp_rank},tp=${tp_rank}" + +exec "$PROBING_MOCK_PYTHON" examples/megatron/megatron_64_rank_mock.py "$@" diff --git a/examples/probing-acme/pyproject.toml b/examples/probing-acme/pyproject.toml index 150f59d3..02dac2b0 100644 --- a/examples/probing-acme/pyproject.toml +++ b/examples/probing-acme/pyproject.toml @@ -7,7 +7,7 @@ name = "probing-acme" version = "0.1.0" description = "Example probing vendor extension (skills + magics)" readme = "README.md" -requires-python = ">=3.9" +requires-python = ">=3.8" dependencies = [ "probing", "ipython>=8.0", diff --git a/probing/core/Cargo.toml b/probing/core/Cargo.toml index e7c2262f..ec77f9d6 100644 --- a/probing/core/Cargo.toml +++ b/probing/core/Cargo.toml @@ -25,7 +25,6 @@ similar_names = "allow" [features] test-utils = [] default = [] -builtin-schema-docs = ["dep:probing-hccl-shim", "dep:probing-nccl-profiler"] python-bridge = ["dep:pyo3"] [lib] @@ -35,8 +34,6 @@ crate-type = ["rlib"] probing-proto = { path = "../proto" } probing-macros = { path = "../macros" } probing-memtable = { path = "../memtable" } -probing-hccl-shim = { path = "../extensions/hccl-shim", optional = true } -probing-nccl-profiler = { path = "../extensions/nccl-profiler", optional = true } anyhow = { workspace = true } arrow = { workspace = true } @@ -64,5 +61,3 @@ pyo3 = { version = "0.29.0", optional = true, default-features = false, features [dev-dependencies] tempfile = "3.8" -probing-hccl-shim = { path = "../extensions/hccl-shim" } -probing-nccl-profiler = { path = "../extensions/nccl-profiler" } diff --git a/probing/core/src/core/mod.rs b/probing/core/src/core/mod.rs index f736ed41..b3d071af 100644 --- a/probing/core/src/core/mod.rs +++ b/probing/core/src/core/mod.rs @@ -121,48 +121,65 @@ mod tests { } #[tokio::test] - async fn engine_column_docs_serves_code_first_hccl() { + async fn engine_column_docs_serves_code_first_registry_entry() { use probing_proto::prelude::Seq; + probing_memtable::docs::register_from_name( + "unittest.core_column_docs", + &probing_memtable::Schema::new() + .table_doc("core registry table") + .col_doc( + "value", + probing_memtable::DType::I64, + "registry value column", + ), + ); let engine = Engine::builder().build().await.unwrap(); let df = engine .async_query( "SELECT description FROM probe.probing.column_docs \ - WHERE table_schema = 'hccl' AND table_name = 'tasks' AND column_name = 'task_name'", + WHERE table_schema = 'unittest' AND table_name = 'core_column_docs' AND column_name = 'value'", ) .await .unwrap() .expect("column_docs query should return rows"); assert_eq!(df.names, vec!["description"]); let desc = match &df.cols[0] { - Seq::SeqText(values) => values.first().cloned().expect("task_name description row"), + Seq::SeqText(values) => values.first().cloned().expect("value description row"), other => panic!("expected SeqText, got {other:?}"), }; assert!( - desc.contains("Memcpy"), + desc.contains("registry value"), "expected code-first column doc, got {desc}" ); } #[tokio::test] - async fn engine_table_docs_serves_code_first_hccl() { + async fn engine_table_docs_serves_code_first_registry_entry() { use probing_proto::prelude::Seq; + probing_memtable::docs::register_from_name( + "unittest.core_table_docs", + &probing_memtable::Schema::new().table_doc("core registry table"), + ); let engine = Engine::builder().build().await.unwrap(); let df = engine .async_query( "SELECT description FROM probe.probing.table_docs \ - WHERE table_schema = 'hccl' AND table_name = 'tasks'", + WHERE table_schema = 'unittest' AND table_name = 'core_table_docs'", ) .await .unwrap() .expect("table_docs query should return rows"); let desc = match &df.cols[0] { - Seq::SeqText(values) => values.first().cloned().expect("hccl.tasks description row"), + Seq::SeqText(values) => values + .first() + .cloned() + .expect("core_table_docs description row"), other => panic!("expected SeqText, got {other:?}"), }; assert!( - desc.contains("MsprofHcclInfo"), + desc.contains("core registry table"), "expected code-first table doc, got {desc}" ); } diff --git a/probing/core/src/core/semantic_catalog.rs b/probing/core/src/core/semantic_catalog.rs index f2fb6eb5..60ad20f2 100644 --- a/probing/core/src/core/semantic_catalog.rs +++ b/probing/core/src/core/semantic_catalog.rs @@ -84,15 +84,6 @@ fn column_key(table_schema: &str, table_name: &str, column_name: &str) -> (Strin ) } -/// Register compile-time known collector schemas (HCCL, NCCL, …). -pub fn register_builtin_schema_docs() { - #[cfg(feature = "builtin-schema-docs")] - { - probing_hccl_shim::register_docs(); - probing_nccl_profiler::register_docs(); - } -} - pub fn parse_semantic_catalog_yaml(yaml: &str) -> Result { let file: SemanticCatalogFile = serde_yaml::from_str(yaml).map_err(|e| { DataFusionError::External(format!("failed to parse semantic tables.yaml: {e}").into()) @@ -144,8 +135,6 @@ fn sort_catalog_rows(table_rows: &mut [TableDocRow], column_rows: &mut [ColumnDo /// Merge in-code doc registry with YAML overlay (registry wins for descriptions/columns). pub fn build_semantic_catalog() -> Result { - register_builtin_schema_docs(); - let yaml = parse_semantic_catalog_yaml(TABLES_YAML)?; let mut table_map: HashMap<(String, String), TableDocRow> = HashMap::new(); @@ -494,20 +483,29 @@ mod tests { } #[test] - fn build_catalog_prefers_code_docs_for_hccl() { - probing_hccl_shim::register_docs(); + fn build_catalog_prefers_code_docs_over_yaml() { + docs::register_from_name( + "python.torch_trace", + &probing_memtable::Schema::new() + .table_doc("code-first torch trace") + .col_doc( + "duration", + probing_memtable::DType::F64, + "code-first duration", + ), + ); let parsed = build_semantic_catalog().unwrap(); - let host_ops = parsed + let torch_trace = parsed .table_rows .iter() - .find(|r| r.table_schema == "hccl" && r.table_name == "host_ops") - .expect("hccl.host_ops"); - assert!(host_ops.description.contains("MSProf Host API")); + .find(|r| r.table_schema == "python" && r.table_name == "torch_trace") + .expect("python.torch_trace"); + assert_eq!(torch_trace.description, "code-first torch trace"); assert!(parsed.column_rows.iter().any(|r| { - r.table_schema == "hccl" - && r.table_name == "host_ops" - && r.column_name == "event_class" - && r.description.contains("host_hccl_op") + r.table_schema == "python" + && r.table_name == "torch_trace" + && r.column_name == "duration" + && r.description == "code-first duration" })); } @@ -546,22 +544,6 @@ mod tests { })); } - #[test] - fn build_catalog_nccl_culprit_column_from_code() { - probing_nccl_profiler::register_docs(); - let parsed = build_semantic_catalog().unwrap(); - let row = parsed - .column_rows - .iter() - .find(|r| { - r.table_schema == "nccl" - && r.table_name == "proxy_ops" - && r.column_name == "send_gpu_wait_ns" - }) - .expect("nccl.proxy_ops.send_gpu_wait_ns"); - assert!(row.description.contains("Culprit")); - } - #[test] fn build_catalog_yaml_fills_description_when_registry_empty() { let parsed = build_semantic_catalog().unwrap(); diff --git a/probing/core/src/runtime.rs b/probing/core/src/runtime.rs index 298c2706..31426538 100644 --- a/probing/core/src/runtime.rs +++ b/probing/core/src/runtime.rs @@ -1,11 +1,11 @@ use std::cell::Cell; use std::future::Future; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::{mpsc, Arc, Mutex, OnceLock}; +use std::ptr; +use std::sync::atomic::{AtomicBool, AtomicPtr, AtomicU32, Ordering}; +use std::sync::{mpsc, Arc, Mutex}; use std::thread::{self, ThreadId}; use log; -use once_cell::sync::Lazy; use thiserror::Error; /// Async bridge failure — probing continues but callers should treat results as unavailable. @@ -92,11 +92,23 @@ fn try_build_core_runtime() -> Option { /// Shared Tokio runtime for sync→async bridges (Python bindings, local server, etc.). pub struct CoreRuntime { - inner: Option, + slot: AtomicPtr, + origin_pid: AtomicU32, +} + +struct RuntimeSlot { + pid: u32, + runtime: Option, degraded: AtomicBool, } -static FALLBACK_RUNTIME: OnceLock> = OnceLock::new(); +struct ProcessRuntimeSlot { + pid: u32, + runtime: Option, +} + +static FALLBACK_RUNTIME: AtomicPtr = AtomicPtr::new(ptr::null_mut()); +static EPHEMERAL_RUNTIME: AtomicPtr = AtomicPtr::new(ptr::null_mut()); /// Last-resort runtime for the server-side `block_on`/`spawn` methods, which — /// unlike the free [`block_on`] function — cannot return a `Result`. Tries a @@ -105,8 +117,9 @@ static FALLBACK_RUNTIME: OnceLock> = On fn build_emergency_runtime() -> Option { const MAX_ATTEMPTS: u32 = 8; for attempt in 1..=MAX_ATTEMPTS { - match tokio::runtime::Builder::new_current_thread() + match tokio::runtime::Builder::new_multi_thread() .enable_all() + .worker_threads(1) .thread_name("probing-runtime-fallback") .build() { @@ -126,56 +139,135 @@ fn build_emergency_runtime() -> Option { None } -fn try_ephemeral_runtime() -> Option<&'static tokio::runtime::Runtime> { - static EPHEMERAL: OnceLock> = OnceLock::new(); - EPHEMERAL - .get_or_init(|| { - match tokio::runtime::Builder::new_current_thread() - .enable_all() - .thread_name("probing-runtime-ephemeral") +fn build_ephemeral_runtime() -> Option { + match tokio::runtime::Builder::new_multi_thread() + .enable_all() + .worker_threads(1) + .thread_name("probing-runtime-ephemeral") + .build() + { + Ok(rt) => Some(rt), + Err(e) => { + log::error!("probing: ephemeral runtime build failed: {e}; retrying minimal"); + tokio::runtime::Builder::new_current_thread() .build() - { - Ok(rt) => Some(rt), - Err(e) => { - log::error!("probing: ephemeral runtime build failed: {e}; retrying minimal"); - tokio::runtime::Builder::new_current_thread() - .build() - .map(Some) - .unwrap_or_else(|e2| { - log::error!("probing: minimal ephemeral runtime build failed: {e2}"); - None - }) - } + .map(Some) + .unwrap_or_else(|e2| { + log::error!("probing: minimal ephemeral runtime build failed: {e2}"); + None + }) + } + } +} + +fn process_runtime( + storage: &AtomicPtr, + build: fn() -> Option, +) -> Option<&'static tokio::runtime::Runtime> { + let pid = std::process::id(); + loop { + let observed = storage.load(Ordering::Acquire); + if !observed.is_null() { + // SAFETY: installed slots are intentionally leaked and therefore remain valid. + let slot = unsafe { &*observed }; + if slot.pid == pid { + return slot.runtime.as_ref(); } - }) - .as_ref() + } + + let candidate = Box::into_raw(Box::new(ProcessRuntimeSlot { + pid, + runtime: build(), + })); + match storage.compare_exchange(observed, candidate, Ordering::AcqRel, Ordering::Acquire) { + Ok(_) => { + // SAFETY: the successful candidate is now process-global and never freed. + return unsafe { &*candidate }.runtime.as_ref(); + } + Err(_) => { + // SAFETY: this candidate was never published. + drop(unsafe { Box::from_raw(candidate) }); + } + } + } +} + +fn try_ephemeral_runtime() -> Option<&'static tokio::runtime::Runtime> { + process_runtime(&EPHEMERAL_RUNTIME, build_ephemeral_runtime) } fn fallback_runtime() -> Option<&'static tokio::runtime::Runtime> { - FALLBACK_RUNTIME - .get_or_init(|| build_emergency_runtime().map(|rt| Box::leak(Box::new(rt)) as &'static _)) - .as_ref() - .copied() + process_runtime(&FALLBACK_RUNTIME, build_emergency_runtime) } impl CoreRuntime { - fn new() -> Self { - let inner = try_build_core_runtime(); - let degraded = inner.is_none(); + const fn new() -> Self { + Self { + slot: AtomicPtr::new(ptr::null_mut()), + origin_pid: AtomicU32::new(0), + } + } + + fn build_slot() -> Box { + let runtime = try_build_core_runtime(); + let degraded = runtime.is_none(); if degraded { log::error!( "probing: no tokio runtime available; marking async bridge degraded \ (queries and config may return empty/error results)" ); } - Self { - inner, + Box::new(RuntimeSlot { + pid: std::process::id(), + runtime, degraded: AtomicBool::new(degraded), + }) + } + + fn current_slot(&self) -> &'static RuntimeSlot { + let pid = std::process::id(); + let _ = self + .origin_pid + .compare_exchange(0, pid, Ordering::AcqRel, Ordering::Acquire); + loop { + let observed = self.slot.load(Ordering::Acquire); + if !observed.is_null() { + // SAFETY: installed slots are intentionally leaked and therefore remain valid. + let slot = unsafe { &*observed }; + if slot.pid == pid { + return slot; + } + } + + let candidate = Box::into_raw(Self::build_slot()); + match self.slot.compare_exchange( + observed, + candidate, + Ordering::AcqRel, + Ordering::Acquire, + ) { + Ok(_) => { + if !observed.is_null() { + log::info!("probing: rebuilt async runtime after fork for pid {pid}"); + } + // SAFETY: the successful candidate is now process-global and never freed. + return unsafe { &*candidate }; + } + Err(_) => { + // SAFETY: this candidate was never published. + drop(unsafe { Box::from_raw(candidate) }); + } + } } } + fn is_fork_child(&self) -> bool { + let origin_pid = self.origin_pid.load(Ordering::Acquire); + origin_pid != 0 && origin_pid != std::process::id() + } + fn resolve_runtime(&self) -> Option<&tokio::runtime::Runtime> { - if let Some(rt) = &self.inner { + if let Some(rt) = &self.current_slot().runtime { return Some(rt); } self.mark_degraded(); @@ -188,11 +280,11 @@ impl CoreRuntime { /// Whether the shared runtime is healthy enough for probing async work. pub fn is_operational(&self) -> bool { - !self.degraded.load(Ordering::Relaxed) + !self.current_slot().degraded.load(Ordering::Relaxed) } pub fn mark_degraded(&self) { - if !self.degraded.swap(true, Ordering::Relaxed) { + if !self.current_slot().degraded.swap(true, Ordering::Relaxed) { log::error!( "probing: runtime marked degraded; async/query features may return \ empty or error results until process restart" @@ -235,7 +327,7 @@ impl CoreRuntime { where F: Future, { - if let Some(rt) = &self.inner { + if let Some(rt) = &self.current_slot().runtime { return Ok(rt.block_on(future)); } if let Some(rt) = fallback_runtime() { @@ -261,7 +353,7 @@ impl CoreRuntime { where F: Future, { - if let Some(rt) = &self.inner { + if let Some(rt) = &self.current_slot().runtime { return rt.block_on(future); } if let Some(rt) = fallback_runtime() { @@ -285,23 +377,38 @@ impl CoreRuntime { /// /// ENGINE and CONFIG_STORE must only be accessed from this runtime. Creating ad-hoc /// runtimes (especially when Python already has an asyncio loop) can cause SIGSEGV. -pub static CORE_RUNTIME: Lazy = Lazy::new(CoreRuntime::new); +pub static CORE_RUNTIME: CoreRuntime = CoreRuntime::new(); /// Whether probing's async bridge is still operational. pub fn runtime_operational() -> bool { CORE_RUNTIME.is_operational() } -static PYTHON_MAIN_THREAD: OnceLock = OnceLock::new(); +struct PythonMainThread { + pid: u32, + id: ThreadId, +} + +static PYTHON_MAIN_THREAD: AtomicPtr = AtomicPtr::new(ptr::null_mut()); pub fn register_python_main_thread() { - let _ = PYTHON_MAIN_THREAD.set(thread::current().id()); + let registration = Box::into_raw(Box::new(PythonMainThread { + pid: std::process::id(), + id: thread::current().id(), + })); + // Registrations are tiny and intentionally leaked so concurrent readers never observe freed + // memory. A process normally registers once; a forked child replaces the inherited record. + let _ = PYTHON_MAIN_THREAD.swap(registration, Ordering::AcqRel); } pub fn is_python_main_thread() -> bool { - PYTHON_MAIN_THREAD - .get() - .is_some_and(|id| thread::current().id() == *id) + let registration = PYTHON_MAIN_THREAD.load(Ordering::Acquire); + if registration.is_null() { + return false; + } + // SAFETY: registrations are intentionally leaked. + let registration = unsafe { &*registration }; + registration.pid == std::process::id() && registration.id == thread::current().id() } fn is_inside_core_runtime() -> bool { @@ -394,6 +501,11 @@ where } struct NativeBridge { + slot: AtomicPtr, +} + +struct NativeBridgeSlot { + pid: u32, tx: Option>, } @@ -403,9 +515,15 @@ struct BridgeJob { } impl NativeBridge { - fn new() -> Self { + const fn new() -> Self { + Self { + slot: AtomicPtr::new(ptr::null_mut()), + } + } + + fn build_slot() -> Box { let (tx, rx) = mpsc::channel::(); - match thread::Builder::new() + let tx = match thread::Builder::new() .name("probing-native".into()) .spawn(move || { while let Ok(job) = rx.recv() { @@ -419,10 +537,48 @@ impl NativeBridge { let _ = job.done.send(()); } }) { - Ok(_) => Self { tx: Some(tx) }, + Ok(_) => Some(tx), Err(e) => { log::error!("failed to spawn probing-native bridge: {e}; using direct calls"); - Self { tx: None } + None + } + }; + Box::new(NativeBridgeSlot { + pid: std::process::id(), + tx, + }) + } + + fn current_slot(&self) -> &'static NativeBridgeSlot { + let pid = std::process::id(); + loop { + let observed = self.slot.load(Ordering::Acquire); + if !observed.is_null() { + // SAFETY: installed slots are intentionally leaked and therefore remain valid. + let slot = unsafe { &*observed }; + if slot.pid == pid { + return slot; + } + } + + let candidate = Box::into_raw(Self::build_slot()); + match self.slot.compare_exchange( + observed, + candidate, + Ordering::AcqRel, + Ordering::Acquire, + ) { + Ok(_) => { + if !observed.is_null() { + log::info!("probing: rebuilt native bridge after fork for pid {pid}"); + } + // SAFETY: the successful candidate is now process-global and never freed. + return unsafe { &*candidate }; + } + Err(_) => { + // SAFETY: this candidate was never published. + drop(unsafe { Box::from_raw(candidate) }); + } } } } @@ -431,7 +587,7 @@ impl NativeBridge { &self, f: impl FnOnce() -> R + Send + 'static, ) -> R { - let Some(tx) = &self.tx else { + let Some(tx) = &self.current_slot().tx else { return f(); }; let (result_tx, result_rx) = mpsc::channel(); @@ -477,7 +633,7 @@ impl NativeBridge { } } -static NATIVE_BRIDGE: Lazy = Lazy::new(NativeBridge::new); +static NATIVE_BRIDGE: NativeBridge = NativeBridge::new(); thread_local! { static ON_NATIVE_BRIDGE: Cell = const { Cell::new(false) }; @@ -509,6 +665,12 @@ fn run_on_native_bridge( } fn needs_native_bridge() -> bool { + // A bridge worker inherited across fork no longer exists. Recreating the std mpsc/thread + // bridge in a macOS post-fork child is not reliable, so child calls use their rebuilt + // process-local Tokio runtime directly. + if CORE_RUNTIME.is_fork_child() { + return false; + } (is_python_main_thread() && !on_native_bridge()) || is_inside_core_runtime() } @@ -554,6 +716,9 @@ where mod tests { use super::*; + #[cfg(unix)] + const RUNTIME_FORK_HELPER_ENV: &str = "PROBING_RUNTIME_FORK_HELPER"; + #[test] fn try_block_on_completes_on_current_runtime() { let value = CORE_RUNTIME @@ -599,4 +764,90 @@ mod tests { let wrapped: Result<(), RuntimeError> = Result::on_block_on_failure(err); assert!(wrapped.unwrap_err().to_string().contains("bridge broken")); } + + #[cfg(unix)] + #[test] + fn runtime_recovers_and_bypasses_inherited_native_bridge_after_fork() { + let output = std::process::Command::new(std::env::current_exe().expect("current test exe")) + .args([ + "--ignored", + "--exact", + "runtime::tests::fork_runtime_helper", + "--nocapture", + "--test-threads=1", + ]) + .env(RUNTIME_FORK_HELPER_ENV, "1") + .output() + .expect("run fork helper"); + assert!( + output.status.success(), + "fork helper failed\nstdout:\n{}\nstderr:\n{}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + } + + #[cfg(unix)] + #[test] + #[ignore = "subprocess helper for runtime_recovers_and_bypasses_inherited_native_bridge_after_fork"] + fn fork_runtime_helper() { + if std::env::var(RUNTIME_FORK_HELPER_ENV).as_deref() != Ok("1") { + return; + } + + register_python_main_thread(); + assert_eq!(block_on(async { 21 + 21 }).expect("parent runtime"), 42); + + // SAFETY: this dedicated helper process intentionally verifies the supported + // post-fork recovery path. The parent waits for and reaps the child below. + let child = unsafe { libc::fork() }; + assert!(child >= 0, "fork failed"); + if child == 0 { + let block_on_ok = block_on(async { 40 + 2 }).is_ok_and(|value| value == 42); + register_python_main_thread(); + let native_bridge_ok = block_on(async { 6 * 7 }).is_ok_and(|value| value == 42); + let completed = Arc::new(AtomicBool::new(false)); + let task_completed = Arc::clone(&completed); + std::mem::drop(CORE_RUNTIME.spawn(async move { + task_completed.store(true, Ordering::Release); + })); + let spawn_deadline = std::time::Instant::now() + std::time::Duration::from_secs(3); + while !completed.load(Ordering::Acquire) && std::time::Instant::now() < spawn_deadline { + std::thread::sleep(std::time::Duration::from_millis(10)); + } + let spawn_ok = completed.load(Ordering::Acquire); + // SAFETY: `_exit` avoids running inherited parent-only destructors in the child. + unsafe { + libc::_exit(if block_on_ok && native_bridge_ok && spawn_ok { + 0 + } else { + 1 + }) + }; + } + + let deadline = std::time::Instant::now() + std::time::Duration::from_secs(5); + loop { + let mut status = 0; + // SAFETY: `child` is a live direct child and `status` is writable. + let waited = unsafe { libc::waitpid(child, &mut status, libc::WNOHANG) }; + if waited == child { + assert!( + libc::WIFEXITED(status) && libc::WEXITSTATUS(status) == 0, + "fork child failed with status {status}" + ); + break; + } + assert!(waited >= 0, "waitpid failed"); + if std::time::Instant::now() >= deadline { + // SAFETY: the child exceeded the bounded test deadline and is reaped below. + unsafe { + libc::kill(child, libc::SIGKILL); + libc::waitpid(child, &mut status, 0); + } + panic!("fork child timed out while using inherited runtime state"); + } + std::thread::sleep(std::time::Duration::from_millis(10)); + } + } } diff --git a/probing/extensions/python/Cargo.toml b/probing/extensions/python/Cargo.toml index df507dc9..f8487abb 100644 --- a/probing/extensions/python/Cargo.toml +++ b/probing/extensions/python/Cargo.toml @@ -38,7 +38,7 @@ cpp_demangle = "0.5.1" rustc-demangle = "0.1.27" pyo3 = { version = "0.29.0", default-features = false, features = [ "abi3", - "abi3-py310", + "abi3-py38", # "extension-module", "auto-initialize", "macros" diff --git a/probing/extensions/python/src/features/stacktrace/tracers/pprof.rs b/probing/extensions/python/src/features/stacktrace/tracers/pprof.rs index 645e6644..e8f911dc 100644 --- a/probing/extensions/python/src/features/stacktrace/tracers/pprof.rs +++ b/probing/extensions/python/src/features/stacktrace/tracers/pprof.rs @@ -838,6 +838,24 @@ fn remote_pprof_folded_lines_fallback(addr: &str) -> anyhow::Result> }) } +fn stack_fanout_concurrency(peer_count: usize) -> usize { + std::env::var("PROBING_STACK_FANOUT_CONCURRENCY") + .ok() + .and_then(|value| value.trim().parse::().ok()) + .filter(|value| *value > 0) + .unwrap_or(32) + .min(peer_count.max(1)) +} + +fn stack_fanout_deadline() -> std::time::Duration { + let seconds = std::env::var("PROBING_STACK_FANOUT_DEADLINE_SEC") + .ok() + .and_then(|value| value.trim().parse::().ok()) + .filter(|value| *value > 0) + .unwrap_or(15); + std::time::Duration::from_secs(seconds) +} + /// Cluster fan-out + merge for distributed CPU stack flamegraph JSON. /// /// `mode`: `mixed` (Python + native) or `py` (Python frames only). @@ -868,38 +886,85 @@ pub async fn collect_distributed_stack_flamegraph_json( .filter(is_node_alive) .filter(|node| !local_addrs.iter().any(|local| local == &node.addr)) .collect(); - - for node in peers { - let addr = node.addr.clone(); - let peer_rank = node.rank; - if let Some(r) = peer_rank { - if seen_ranks.contains(&r) { + let mut scheduled_ranks = seen_ranks.clone(); + let peers: Vec<_> = peers + .into_iter() + .filter(|node| { + let Some(rank) = node.rank else { + return true; + }; + if !scheduled_ranks.insert(rank) { log::debug!( - "distributed stack flamegraph: skip duplicate rank {r} from {addr}" - ); - continue; - } - } - match tokio::task::spawn_blocking(move || remote_pprof_folded_lines_fallback(&addr)) - .await - { - Ok(Ok(lines)) => { - if let Some(r) = peer_rank { - seen_ranks.insert(r); - } - line_sets.push((peer_rank, lines)); - } - Ok(Err(err)) => { - log::warn!( - "distributed stack flamegraph fan-out {} failed: {err:#}", + "distributed stack flamegraph: skip duplicate rank {rank} from {}", node.addr ); - nodes_failed.push(format!("{}: {err:#}", node.addr)); + return false; } - Err(err) => { - nodes_failed.push(format!("{}: task join failed: {err}", node.addr)); + true + }) + .collect(); + let concurrency = stack_fanout_concurrency(peers.len()); + let semaphore = std::sync::Arc::new(tokio::sync::Semaphore::new(concurrency)); + let mut tasks = tokio::task::JoinSet::new(); + let mut pending: BTreeSet = peers.iter().map(|node| node.addr.clone()).collect(); + + for node in peers { + let semaphore = semaphore.clone(); + tasks.spawn(async move { + let addr = node.addr.clone(); + let result = match semaphore.acquire_owned().await { + Ok(_permit) => { + match tokio::task::spawn_blocking(move || { + remote_pprof_folded_lines_fallback(&addr) + }) + .await + { + Ok(result) => result, + Err(error) => Err(anyhow::anyhow!("task join failed: {error}")), + } + } + Err(error) => Err(anyhow::anyhow!("fan-out semaphore closed: {error}")), + }; + (node, result) + }); + } + + let timed_out = { + let collect = async { + while let Some(joined) = tasks.join_next().await { + match joined { + Ok((node, Ok(lines))) => { + pending.remove(&node.addr); + if let Some(rank) = node.rank { + seen_ranks.insert(rank); + } + line_sets.push((node.rank, lines)); + } + Ok((node, Err(error))) => { + pending.remove(&node.addr); + log::warn!( + "distributed stack flamegraph fan-out {} failed: {error:#}", + node.addr + ); + nodes_failed.push(format!("{}: {error:#}", node.addr)); + } + Err(error) => { + log::warn!("distributed stack flamegraph fan-out task failed: {error}"); + } + } } - } + }; + tokio::time::timeout(stack_fanout_deadline(), collect) + .await + .is_err() + }; + if timed_out { + tasks.abort_all(); + nodes_failed.extend( + pending + .into_iter() + .map(|addr| format!("{addr}: stack fan-out deadline exceeded")), + ); } } @@ -989,6 +1054,7 @@ mod tests { /// Serialize sampler-map mutation tests (non-signal). static SAMPLER_TEST_LOCK: Mutex<()> = Mutex::new(()); + static FANOUT_ENV_TEST_LOCK: Mutex<()> = Mutex::new(()); fn with_sampler_lock(f: impl FnOnce() -> R) -> R { let _g = SAMPLER_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); @@ -1142,6 +1208,32 @@ mod tests { assert_eq!(unique_contributor_rank_count(&sets), 2); } + #[test] + fn stack_fanout_limits_are_bounded_and_configurable() { + let _guard = FANOUT_ENV_TEST_LOCK + .lock() + .unwrap_or_else(|error| error.into_inner()); + let previous_concurrency = std::env::var("PROBING_STACK_FANOUT_CONCURRENCY").ok(); + let previous_deadline = std::env::var("PROBING_STACK_FANOUT_DEADLINE_SEC").ok(); + + std::env::set_var("PROBING_STACK_FANOUT_CONCURRENCY", "8"); + std::env::set_var("PROBING_STACK_FANOUT_DEADLINE_SEC", "7"); + assert_eq!(stack_fanout_concurrency(64), 8); + assert_eq!(stack_fanout_concurrency(3), 3); + assert_eq!(stack_fanout_deadline(), Duration::from_secs(7)); + + if let Some(value) = previous_concurrency { + std::env::set_var("PROBING_STACK_FANOUT_CONCURRENCY", value); + } else { + std::env::remove_var("PROBING_STACK_FANOUT_CONCURRENCY"); + } + if let Some(value) = previous_deadline { + std::env::set_var("PROBING_STACK_FANOUT_DEADLINE_SEC", value); + } else { + std::env::remove_var("PROBING_STACK_FANOUT_DEADLINE_SEC"); + } + } + #[test] fn sampling_active_folded_export_skips_on_demand_fallback() { with_sampler_lock(|| { diff --git a/probing/proto/src/lib.rs b/probing/proto/src/lib.rs index bf987f28..c32b6e88 100644 --- a/probing/proto/src/lib.rs +++ b/probing/proto/src/lib.rs @@ -7,11 +7,13 @@ pub mod prelude { pub use crate::protocol::cluster::{ Cluster, Node, NodeListResponse, NodeReportRequest, NodeReportResponse, }; + pub use crate::protocol::http::{ApiErrorResponse, ApiProblem}; pub use crate::protocol::message::Message; pub use crate::protocol::process::{CallFrame, Process}; pub use crate::protocol::query::{Data as QueryDataFormat, Options as QueryOptions, Query}; pub use crate::protocol::query::{ErrorCode, QueryError}; + pub use crate::protocol::training::{StepDurationSample, StepMatrixResponse}; pub use crate::protocol::version::ProtocolVersion; // --- Core Data Types --- diff --git a/probing/proto/src/protocol/http.rs b/probing/proto/src/protocol/http.rs new file mode 100644 index 00000000..719aef6e --- /dev/null +++ b/probing/proto/src/protocol/http.rs @@ -0,0 +1,48 @@ +//! Shared HTTP error envelope used by Server, Web, and CLI clients. + +use serde::{Deserialize, Serialize}; + +/// Machine-readable problem details for a failed HTTP request. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)] +pub struct ApiProblem { + /// Stable symbolic code such as `NOT_FOUND` or `SERVICE_UNAVAILABLE`. + pub code: String, + /// Human-readable explanation. Clients should display this instead of the status phrase. + pub message: String, + /// Whether retrying the same request may succeed without changing its inputs. + #[serde(default)] + pub retryable: bool, + /// Optional operator action that can make the request succeed. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub action: Option, +} + +/// Canonical non-success response body for Probing HTTP APIs. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)] +pub struct ApiErrorResponse { + pub error: ApiProblem, +} + +impl ApiErrorResponse { + pub fn new(error: ApiProblem) -> Self { + Self { error } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn error_envelope_roundtrips() { + let response = ApiErrorResponse::new(ApiProblem { + code: "SERVICE_UNAVAILABLE".into(), + message: "engine is starting".into(), + retryable: true, + action: Some("retry after /ready reports ready".into()), + }); + let json = serde_json::to_string(&response).unwrap(); + let decoded: ApiErrorResponse = serde_json::from_str(&json).unwrap(); + assert_eq!(decoded, response); + } +} diff --git a/probing/proto/src/protocol/mod.rs b/probing/proto/src/protocol/mod.rs index 7857ccee..dc5ffb47 100644 --- a/probing/proto/src/protocol/mod.rs +++ b/probing/proto/src/protocol/mod.rs @@ -1,5 +1,7 @@ pub mod cluster; +pub mod http; pub mod message; pub mod process; pub mod query; +pub mod training; pub mod version; diff --git a/probing/proto/src/protocol/training.rs b/probing/proto/src/protocol/training.rs new file mode 100644 index 00000000..b24469b0 --- /dev/null +++ b/probing/proto/src/protocol/training.rs @@ -0,0 +1,44 @@ +//! Stable wire types for training observability endpoints. + +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +pub struct StepDurationSample { + pub rank: i32, + /// Display index (chronological, zero-based window into recent steps). + pub local_step: i64, + /// Original `local_step` from span attributes. + #[serde(default)] + pub coord_step: i64, + pub duration_ms: f64, + pub host: String, + pub addr: String, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +pub struct StepMatrixResponse { + pub samples: Vec, + pub rank_count: usize, + pub step_count: usize, + pub cluster: bool, + /// Some peers failed, so the samples are useful but incomplete. + #[serde(default)] + pub partial: bool, + pub nodes_queried: usize, + #[serde(default)] + pub nodes_failed: Vec, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn older_step_matrix_without_partial_remains_readable() { + let response: StepMatrixResponse = serde_json::from_str( + r#"{"samples":[],"rank_count":0,"step_count":0,"cluster":false,"nodes_queried":1,"nodes_failed":[]}"#, + ) + .unwrap(); + assert!(!response.partial); + } +} diff --git a/probing/server/API.md b/probing/server/API.md index 190788c1..f82e11e7 100644 --- a/probing/server/API.md +++ b/probing/server/API.md @@ -28,7 +28,7 @@ Registered in `server/api/mod.rs`: | GET/PUT | `/apis/nodes` | Cluster node list / register | | GET | `/apis/training/step_matrix` | Cross-rank train.step samples (`cluster=false` default; set `cluster=true` for on-demand fan-out) | | GET | `/apis/training/distributed_flamegraph/json` | SPMD torch module flamegraph at one `local_step` (legacy; prefer distributed stack flamegraph) | -| GET | `/apis/training/distributed_stack_flamegraph/json` | Distributed CPU stack flamegraph (`?cluster=true` default, `?mode=mixed\|py`). Frames may include `ranks: [i32]` (contributing training ranks under that partition) and payload `rankCount`. | +| GET | `/apis/training/distributed_stack_flamegraph/json` | Distributed CPU stack flamegraph (`?cluster=true` default, `?mode=mixed\|py`). Peer capture is bounded-concurrent with an overall deadline; completed peers are returned on timeout with `nodesFailed`. Frames may include `ranks: [i32]` (contributing training ranks under that partition) and payload `rankCount`. | | POST | `/apis/cluster/query` | On-demand SQL fan-out (`{"expr":"…","cluster":true}`; read-only SQL only) | Flamegraphs are served by profiler extensions (extension fallback, not public routes): @@ -76,6 +76,7 @@ All handlers live in `python/probing/handlers/pythonext.py`, one canonical local | GET | `/apis/pythonext/pytorch/profile/start` | `pytorch/profile/start` — `steps`, `trigger` | | GET | `/apis/pythonext/pytorch/profile/stop` | `pytorch/profile/stop` — finalize capture | | GET | `/apis/pythonext/pytorch/profile/status` | `pytorch/profile/status` | +| GET | `/apis/pythonext/pytorch/runtime-debug?include_values=` | `pytorch/runtime-debug` — local wait counters + read-only job TCPStore snapshot | | GET | `/apis/pythonext/ray/timeline` | `ray/timeline` | | GET | `/apis/pythonext/ray/timeline/chrome` | `ray/timeline/chrome` | | GET | `/apis/pythonext/magics` | `magics` | @@ -87,6 +88,15 @@ All handlers live in `python/probing/handlers/pythonext.py`, one canonical local | GET | `/apis/pythonext/extensions/list` | `extensions/list` — installed `probing-` packages | | GET | `/apis/pythonext/flight-recorder/snapshot?include_stack_traces=&only_active=&persist=` | `flight-recorder/snapshot` | +`pytorch/runtime-debug` reports wait counters for the connected rank only; the +TCPStore catalog represents rendezvous state shared by the job. Unknown value +payloads stay redacted unless the server has `PROBING_TCPSTORE_INSPECT=1` and the +request explicitly sets `include_values=true`. Runtimes without TCPStore key +enumeration report `total_keys` with `catalog_available: false`. The wait-counter +snapshot includes a `source`: `pytorch` identifies the native experimental +PyTorch handler; an explicitly registered compatibility provider reports its own +source label instead. + Skill HTTP endpoints above are **discovery only** (catalog, routing, load JSON). Execution uses the Rust `probing-skills` runner: CLI `probing skill run`, MCP `run_skill` / `plan_skill`, or Web Investigate Agent (WASM). @@ -177,6 +187,25 @@ Do not register the same capability in both places. Do not add path aliases. ## HTTP status codes +Control-plane API failures use one JSON envelope so Web and CLI clients can preserve +the real cause instead of replacing it with the HTTP reason phrase: + +```json +{ + "error": { + "code": "SERVICE_UNAVAILABLE", + "message": "probing engine is still starting", + "retryable": true, + "action": "retry after /ready reports ready" + } +} +``` + +`action` is optional. Query endpoints retain their versioned query DTO/message payloads, +extension handlers retain their documented native response body, and `/health` plus +`/ready` retain their orchestrator-specific responses. Clients accept both the canonical +envelope and these documented endpoint-specific formats. + | Case | Status | |------|--------| | Extension path in spec, wrong HTTP method | 405 | diff --git a/probing/server/src/auth.rs b/probing/server/src/auth.rs index 3719d5b3..61347eab 100644 --- a/probing/server/src/auth.rs +++ b/probing/server/src/auth.rs @@ -1,6 +1,6 @@ use axum::{ extract::Request, - http::{header, HeaderMap, HeaderValue, StatusCode}, + http::{header, HeaderMap, HeaderValue}, middleware::Next, response::{IntoResponse, Response}, }; @@ -9,6 +9,8 @@ use once_cell::sync::Lazy; use probing_core::config; use std::env; +use crate::server::error::ApiError; + // Auth token environment variable name pub const AUTH_TOKEN_ENV: &str = "PROBING_AUTH_TOKEN"; pub const AUTH_TOKEN_CONFIG_KEY: &str = "server.auth_token"; @@ -92,15 +94,13 @@ fn unauthorized_response() -> Response { HeaderValue::from_static("Basic realm=\"Probe Server\"") }); - ( - StatusCode::UNAUTHORIZED, - [ - (header::WWW_AUTHENTICATE, www_auth), - (header::CONTENT_TYPE, HeaderValue::from_static("text/plain")), - ], - "Unauthorized: Please login to access this resource", - ) - .into_response() + let mut response = ApiError::unauthorized("Authentication is required for this resource") + .with_action("provide a Bearer token, Basic credentials, or X-Probing-Token") + .into_response(); + response + .headers_mut() + .insert(header::WWW_AUTHENTICATE, www_auth); + response } /// Authentication middleware diff --git a/probing/server/src/engine_lifecycle.rs b/probing/server/src/engine_lifecycle.rs index 3640bbcd..197c9f7d 100644 --- a/probing/server/src/engine_lifecycle.rs +++ b/probing/server/src/engine_lifecycle.rs @@ -13,6 +13,8 @@ const INITIALIZING: u8 = 3; static STATE: AtomicU8 = AtomicU8::new(UNINITIALIZED); static FAIL_REASON: Lazy>> = Lazy::new(|| Mutex::new(None)); +#[cfg(test)] +pub(crate) static TEST_STATE_LOCK: tokio::sync::Mutex<()> = tokio::sync::Mutex::const_new(()); fn lock_fail_reason() -> std::sync::MutexGuard<'static, Option> { FAIL_REASON.lock().unwrap_or_else(|e| e.into_inner()) @@ -98,6 +100,7 @@ mod tests { #[test] fn ready_roundtrip() { + let _guard = TEST_STATE_LOCK.blocking_lock(); mark_engine_ready(); assert!(engine_is_ready()); assert_eq!(engine_init_state(), EngineInitState::Ready); @@ -106,6 +109,7 @@ mod tests { #[test] fn failed_surfaces_reason() { + let _guard = TEST_STATE_LOCK.blocking_lock(); mark_engine_failed("memtable missing"); assert!(!engine_is_ready()); let msg = engine_not_ready_message().unwrap(); diff --git a/probing/server/src/extensions.rs b/probing/server/src/extensions.rs index 16669209..4fa0f926 100644 --- a/probing/server/src/extensions.rs +++ b/probing/server/src/extensions.rs @@ -183,6 +183,11 @@ mod test { assert!(ext.set("addr", "127.0.0.1:8080").is_ok()); assert_eq!(ext.get("addr").unwrap(), "127.0.0.1:8080"); + // Wildcard addresses are valid bind addresses. Reachability is handled + // separately when the bound endpoint is advertised to cluster peers. + assert!(ext.set("addr", "0.0.0.0:0").is_ok()); + assert_eq!(ext.get("addr").unwrap(), "0.0.0.0:0"); + // Test invalid addr format assert!(ext.set("addr", "invalid").is_err()); diff --git a/probing/server/src/lib.rs b/probing/server/src/lib.rs index 33755734..4942ce95 100644 --- a/probing/server/src/lib.rs +++ b/probing/server/src/lib.rs @@ -24,9 +24,7 @@ mod vars; pub use self::engine::initialize_engine; pub use self::engine_lifecycle::{engine_init_state, engine_is_ready}; pub use self::report::start_report_worker; -pub use self::server::start_local; -pub use self::server::start_remote; -pub use self::server::sync_env_settings; +pub use self::server::{bind_address_from_port, start_local, start_remote, sync_env_settings}; pub use self::torchrun_cluster::{ is_torchrun_cluster_active, master_http_base, maybe_start_torchrun_cluster, refresh_torchrun_role, diff --git a/probing/server/src/report.rs b/probing/server/src/report.rs index 3197b3cf..dcdd6484 100644 --- a/probing/server/src/report.rs +++ b/probing/server/src/report.rs @@ -11,6 +11,14 @@ pub fn get_hostname() -> Result { Ok(hostname) } +fn node_hostname() -> String { + std::env::var("PROBING_NODE_HOST") + .ok() + .filter(|value| !value.trim().is_empty()) + .map(|value| value.trim().to_string()) + .unwrap_or_else(|| get_hostname().unwrap_or_else(|_| "localhost".to_string())) +} + fn cluster_report_enabled() -> bool { match std::env::var("PROBING_CLUSTER_REPORT") { Ok(val) => { @@ -86,7 +94,7 @@ async fn report_worker(report_addr: String, local_addr: String) { } pub(crate) fn build_local_node(local_addr: &str) -> Node { - let hostname = get_hostname().unwrap_or_else(|_| "localhost".to_string()); + let hostname = node_hostname(); let address = { let probing_address = read_probing_address(); if !probing_address.is_empty() { @@ -125,3 +133,27 @@ fn request_remote_blocking(url: &str, nodes: Vec) -> Result> = LazyLock::new(|| Mutex::new(())); + + #[test] + fn node_hostname_prefers_explicit_logical_host() { + let _guard = lock_mutex(&ENV_LOCK, "report test ENV_LOCK"); + let previous = std::env::var("PROBING_NODE_HOST").ok(); + std::env::set_var("PROBING_NODE_HOST", " megatron-node-03 "); + + assert_eq!(node_hostname(), "megatron-node-03"); + + if let Some(previous) = previous { + std::env::set_var("PROBING_NODE_HOST", previous); + } else { + std::env::remove_var("PROBING_NODE_HOST"); + } + } +} diff --git a/probing/server/src/server/error.rs b/probing/server/src/server/error.rs index d2b150f1..1d4893d7 100644 --- a/probing/server/src/server/error.rs +++ b/probing/server/src/server/error.rs @@ -1,28 +1,44 @@ use axum::{ http::StatusCode, response::{IntoResponse, Response}, + Json, }; use probing_core::core::EngineError; +use probing_proto::prelude::{ApiErrorResponse, ApiProblem}; /// HTTP API error with an explicit status code. #[derive(Debug)] pub struct ApiError { status: StatusCode, - message: String, + problem: ApiProblem, } impl ApiError { pub fn new(status: StatusCode, message: impl Into) -> Self { Self { status, - message: message.into(), + problem: ApiProblem { + code: code_for_status(status).to_string(), + message: message.into(), + retryable: retryable_status(status), + action: None, + }, } } + pub fn with_action(mut self, action: impl Into) -> Self { + self.problem.action = Some(action.into()); + self + } + pub fn bad_request(message: impl Into) -> Self { Self::new(StatusCode::BAD_REQUEST, message) } + pub fn unauthorized(message: impl Into) -> Self { + Self::new(StatusCode::UNAUTHORIZED, message) + } + pub fn not_found(message: impl Into) -> Self { Self::new(StatusCode::NOT_FOUND, message) } @@ -35,6 +51,10 @@ impl ApiError { Self::new(StatusCode::PAYLOAD_TOO_LARGE, message) } + pub fn bad_gateway(message: impl Into) -> Self { + Self::new(StatusCode::BAD_GATEWAY, message) + } + pub fn internal(message: impl Into) -> Self { Self::new(StatusCode::INTERNAL_SERVER_ERROR, message) } @@ -43,6 +63,10 @@ impl ApiError { Self::new(StatusCode::SERVICE_UNAVAILABLE, message) } + pub fn gateway_timeout(message: impl Into) -> Self { + Self::new(StatusCode::GATEWAY_TIMEOUT, message) + } + pub fn from_engine(err: EngineError) -> Self { match err { EngineError::CallError(msg) | EngineError::PluginNotFound(msg) => Self::not_found(msg), @@ -60,22 +84,52 @@ impl ApiError { } pub fn message(&self) -> &str { - &self.message + &self.problem.message + } + + pub fn problem(&self) -> &ApiProblem { + &self.problem } } impl std::fmt::Display for ApiError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.message) + write!(f, "{}", self.problem.message) } } impl IntoResponse for ApiError { fn into_response(self) -> Response { - (self.status, self.message).into_response() + (self.status, Json(ApiErrorResponse::new(self.problem))).into_response() + } +} + +fn code_for_status(status: StatusCode) -> &'static str { + match status { + StatusCode::BAD_REQUEST => "BAD_REQUEST", + StatusCode::UNAUTHORIZED => "UNAUTHORIZED", + StatusCode::FORBIDDEN => "FORBIDDEN", + StatusCode::NOT_FOUND => "NOT_FOUND", + StatusCode::METHOD_NOT_ALLOWED => "METHOD_NOT_ALLOWED", + StatusCode::PAYLOAD_TOO_LARGE => "PAYLOAD_TOO_LARGE", + StatusCode::TOO_MANY_REQUESTS => "TOO_MANY_REQUESTS", + StatusCode::BAD_GATEWAY => "BAD_GATEWAY", + StatusCode::SERVICE_UNAVAILABLE => "SERVICE_UNAVAILABLE", + StatusCode::GATEWAY_TIMEOUT => "GATEWAY_TIMEOUT", + _ => "INTERNAL_ERROR", } } +fn retryable_status(status: StatusCode) -> bool { + matches!( + status, + StatusCode::TOO_MANY_REQUESTS + | StatusCode::BAD_GATEWAY + | StatusCode::SERVICE_UNAVAILABLE + | StatusCode::GATEWAY_TIMEOUT + ) +} + impl From for ApiError where E: Into, @@ -104,4 +158,30 @@ mod tests { let err = ApiError::from_engine(EngineError::PluginError("boom".into())); assert_eq!(err.status(), StatusCode::BAD_GATEWAY); } + + #[tokio::test] + async fn response_is_structured_json() { + let response = ApiError::service_unavailable("engine is starting") + .with_action("retry after /ready reports ready") + .into_response(); + assert_eq!(response.status(), StatusCode::SERVICE_UNAVAILABLE); + assert_eq!( + response + .headers() + .get(axum::http::header::CONTENT_TYPE) + .unwrap(), + "application/json" + ); + let body = axum::body::to_bytes(response.into_body(), usize::MAX) + .await + .unwrap(); + let parsed: ApiErrorResponse = serde_json::from_slice(&body).unwrap(); + assert_eq!(parsed.error.code, "SERVICE_UNAVAILABLE"); + assert_eq!(parsed.error.message, "engine is starting"); + assert!(parsed.error.retryable); + assert_eq!( + parsed.error.action.as_deref(), + Some("retry after /ready reports ready") + ); + } } diff --git a/probing/server/src/server/health.rs b/probing/server/src/server/health.rs index d7e801ec..e94f510e 100644 --- a/probing/server/src/server/health.rs +++ b/probing/server/src/server/health.rs @@ -61,6 +61,7 @@ mod tests { #[tokio::test] async fn readiness_reflects_engine_state() { + let _guard = crate::engine_lifecycle::TEST_STATE_LOCK.lock().await; mark_engine_ready(); let resp = readiness().await.into_response(); assert_eq!(resp.status(), StatusCode::OK); diff --git a/probing/server/src/server/local_auth.rs b/probing/server/src/server/local_auth.rs index cf6f1339..7aa4805b 100644 --- a/probing/server/src/server/local_auth.rs +++ b/probing/server/src/server/local_auth.rs @@ -108,9 +108,10 @@ mod tests { let (accepted, connected) = tokio::join!(listener.accept_authorized(), UnixStream::connect(&path)); - connected.expect("connect unix socket"); + let client = connected.expect("connect unix socket"); let credentials = accepted.0.peer_cred().expect("peer credentials"); assert_eq!(credentials.uid(), nix::unistd::geteuid().as_raw()); + drop(client); } } diff --git a/probing/server/src/server/local_query.rs b/probing/server/src/server/local_query.rs index 715cfbfd..d3e098ad 100644 --- a/probing/server/src/server/local_query.rs +++ b/probing/server/src/server/local_query.rs @@ -8,6 +8,8 @@ use hyper::Request; use hyper_util::rt::TokioIo; use serde::Deserialize; +use super::error::ApiError; + #[derive(Debug, Deserialize)] pub struct LocalPidQuery { pid: i32, @@ -19,11 +21,10 @@ pub async fn query_local_pid( ) -> impl IntoResponse { match forward_query_to_pid(params.pid, body).await { Ok(response) => (StatusCode::OK, response).into_response(), - Err(err) => ( - StatusCode::BAD_GATEWAY, - format!("Failed to query local pid {}: {}", params.pid, err), - ) - .into_response(), + Err(err) => { + ApiError::bad_gateway(format!("Failed to query local pid {}: {}", params.pid, err)) + .into_response() + } } } diff --git a/probing/server/src/server/middleware.rs b/probing/server/src/server/middleware.rs index 38f29a4f..ae78177a 100644 --- a/probing/server/src/server/middleware.rs +++ b/probing/server/src/server/middleware.rs @@ -2,7 +2,6 @@ use super::config::get_max_request_body_size; use axum::{ body::Body, extract::Request, - http::StatusCode, middleware::Next, response::{IntoResponse, Response}, }; @@ -10,6 +9,8 @@ use bytes::Bytes; use http_body_util::{BodyExt, Limited}; use std::sync::atomic::{AtomicUsize, Ordering}; +use super::error::ApiError; + static IN_FLIGHT_REQUESTS: AtomicUsize = AtomicUsize::new(0); struct RequestPermit; @@ -47,10 +48,8 @@ pub async fn connection_limit_middleware(request: Request, next: Next) -> Respon "in-flight request limit reached (max {})", crate::runtime_state::config().max_connections() ); - return ( - StatusCode::SERVICE_UNAVAILABLE, - "server request concurrency limit reached", - ) + return ApiError::service_unavailable("server request concurrency limit reached") + .with_action("retry after an in-flight request completes") .into_response(); } }; @@ -66,10 +65,8 @@ pub async fn request_timeout_middleware(request: Request, next: Next) -> Respons .await { Ok(response) => response, - Err(_) => ( - StatusCode::GATEWAY_TIMEOUT, - format!("request exceeded {timeout_secs}s deadline"), - ) + Err(_) => ApiError::gateway_timeout(format!("request exceeded {timeout_secs}s deadline")) + .with_action("retry with a smaller query or narrower time window") .into_response(), } } @@ -89,11 +86,10 @@ pub async fn request_size_limit_middleware(request: Request, next: Next) -> Resp if let Some(length) = content_length { if length > max_size { log::warn!("Request rejected: Content-Length {length} exceeds limit {max_size}"); - return ( - StatusCode::PAYLOAD_TOO_LARGE, - format!("Request body too large (max {max_size} bytes allowed)"), - ) - .into_response(); + return ApiError::payload_too_large(format!( + "Request body too large (max {max_size} bytes allowed)" + )) + .into_response(); } } @@ -106,7 +102,7 @@ pub async fn request_size_limit_middleware(request: Request, next: Next) -> Resp Ok(bytes) => bytes, Err(e) => { log::warn!("Request body collection failed: {e}"); - return (StatusCode::PAYLOAD_TOO_LARGE, e).into_response(); + return ApiError::payload_too_large(e).into_response(); } }; diff --git a/probing/server/src/server/mod.rs b/probing/server/src/server/mod.rs index b0a940b0..b35c8861 100644 --- a/probing/server/src/server/mod.rs +++ b/probing/server/src/server/mod.rs @@ -17,7 +17,7 @@ pub use app::TOP_LEVEL_ROUTES; pub(crate) use listener::start_local_listener; pub use listener::{local_server, remote_server, start_local, start_remote}; pub use runtime::SERVER_RUNTIME; -pub use settings::sync_env_settings; +pub use settings::{bind_address_from_port, sync_env_settings}; pub mod cluster; pub mod cluster_fanout; diff --git a/probing/server/src/server/settings.rs b/probing/server/src/server/settings.rs index 37675049..28653c80 100644 --- a/probing/server/src/server/settings.rs +++ b/probing/server/src/server/settings.rs @@ -3,6 +3,15 @@ use log::error; use probing_core::config; +/// Convert `PROBING_PORT` into the numeric wildcard address used for binding. +pub fn bind_address_from_port(value: &str) -> Result { + if value.eq_ignore_ascii_case("RANDOM") { + Ok("0.0.0.0:0".to_string()) + } else { + value.parse::().map(|port| format!("0.0.0.0:{port}")) + } +} + pub fn sync_env_settings() { if let Some(message) = crate::engine_lifecycle::engine_not_ready_message() { error!("Cannot sync env settings: {message}"); @@ -35,3 +44,21 @@ pub fn sync_env_settings() { } }); } + +#[cfg(test)] +mod tests { + use super::bind_address_from_port; + + #[test] + fn fixed_port_produces_an_unquoted_wildcard_bind_address() { + let address = bind_address_from_port("9922").unwrap(); + assert_eq!(address, "0.0.0.0:9922"); + assert!(address.parse::().is_ok()); + } + + #[test] + fn random_port_uses_port_zero_and_invalid_values_fail() { + assert_eq!(bind_address_from_port("RANDOM").unwrap(), "0.0.0.0:0"); + assert!(bind_address_from_port("not-a-port").is_err()); + } +} diff --git a/probing/server/src/server/training.rs b/probing/server/src/server/training.rs index 2e29efac..c81cf62f 100644 --- a/probing/server/src/server/training.rs +++ b/probing/server/src/server/training.rs @@ -8,11 +8,13 @@ use axum::http::StatusCode; use axum::response::IntoResponse; use axum::Json; use probing_proto::prelude::*; -use serde::{Deserialize, Serialize}; +use serde::Deserialize; use super::cluster_fanout; use super::error::ApiError; +pub use probing_proto::protocol::training::{StepDurationSample, StepMatrixResponse}; + const STEP_MATRIX_SQL: &str = r#" SELECT s.attributes, @@ -35,31 +37,6 @@ pub struct StepMatrixParams { pub cluster: Option, } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct StepDurationSample { - pub rank: i32, - /// Display index (chronological, 0-based window into recent steps). - pub local_step: i64, - /// Original ``local_step`` from span attributes (may be wrong on legacy data). - #[serde(default)] - pub coord_step: i64, - pub duration_ms: f64, - pub host: String, - pub addr: String, -} - -#[derive(Debug, Serialize)] -pub struct StepMatrixResponse { - pub samples: Vec, - pub rank_count: usize, - pub step_count: usize, - pub cluster: bool, - /// True when cluster fan-out returned partial data (some peers failed); HTTP 503 when set. - pub partial: bool, - pub nodes_queried: usize, - pub nodes_failed: Vec, -} - pub async fn get_step_matrix( axum::extract::Query(params): axum::extract::Query, ) -> impl IntoResponse { diff --git a/probing/server/src/torchrun_cluster.rs b/probing/server/src/torchrun_cluster.rs index 3bf63042..a7cf6bf4 100644 --- a/probing/server/src/torchrun_cluster.rs +++ b/probing/server/src/torchrun_cluster.rs @@ -182,10 +182,11 @@ fn reachable_addr(bound: &str) -> String { } } if matches!(host, "0.0.0.0" | "::" | "" | "*") { - return format!( - "{}:{port}", - get_hostname().unwrap_or_else(|_| "localhost".into()) - ); + let peer_host = std::env::var("MASTER_ADDR") + .ok() + .filter(|value| !value.trim().is_empty()) + .unwrap_or_else(|| get_hostname().unwrap_or_else(|_| "localhost".into())); + return format!("{}:{port}", peer_host.trim()); } format!("{host}:{port}") } @@ -584,6 +585,7 @@ mod tests { "RANK", "LOCAL_RANK", "PROBING_PORT", + "PROBING_ADVERTISE_ADDR", "MASTER_ADDR", ] { std::env::remove_var(key); @@ -662,6 +664,23 @@ mod tests { assert_eq!(reachable_addr("0.0.0.0:9922"), "10.0.0.1:9922"); } + #[test] + fn reachable_addr_prefers_explicit_advertise_addr() { + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); + clear_torchrun_env(); + std::env::set_var("MASTER_ADDR", "10.0.0.1"); + std::env::set_var("PROBING_ADVERTISE_ADDR", "10.0.0.2"); + assert_eq!(reachable_addr("0.0.0.0:9922"), "10.0.0.2:9922"); + } + + #[test] + fn reachable_addr_preserves_specific_bind_host() { + let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); + clear_torchrun_env(); + std::env::set_var("MASTER_ADDR", "10.0.0.1"); + assert_eq!(reachable_addr("10.0.0.3:9922"), "10.0.0.3:9922"); + } + #[test] fn bind_spec_global_rank0_uses_probing_port() { let _guard = lock_mutex(&ENV_LOCK, "torchrun test ENV_LOCK"); diff --git a/pyproject.toml b/pyproject.toml index 03f95ae9..f668374a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ authors = [ ] license = { text = "Apache-2.0" } license-files = ["LICENSE"] -requires-python = ">=3.7" +requires-python = ">=3.8" dependencies = [] classifiers = [ @@ -18,12 +18,12 @@ classifiers = [ "Intended Audience :: Information Technology", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Debuggers", @@ -58,8 +58,7 @@ otel = [ "opentelemetry-sdk>=1.20", ] test = [ - "pytest>=8.0; python_version >= '3.8'", - "pytest<8.0; python_version < '3.8'", + "pytest>=8.0", "pytest-cov>=4.0", "coverage>=7.0", "pyyaml>=6", @@ -67,8 +66,7 @@ test = [ "ipykernel>=6.0", ] dev = [ - "pytest>=8.0; python_version >= '3.8'", - "pytest<8.0; python_version < '3.8'", + "pytest>=8.0", "pytest-cov>=4.0", "coverage>=7.0", "pyyaml>=6", @@ -89,9 +87,8 @@ build = [ dev = [ "coverage>=7.0", "ipykernel>=6.0", - "ipython>=8.0; python_version >= '3.8'", - "pytest>=8.0; python_version >= '3.8'", - "pytest<8.0; python_version < '3.8'", + "ipython>=8.0", + "pytest>=8.0", "pytest-cov>=4.0", "pyyaml>=6", "ruff>=0.1.0", @@ -100,7 +97,7 @@ wheel-test = [ "coverage>=7.0", "ipykernel>=6.0", "pandas", - "pytest>=8.0; python_version >= '3.8'", + "pytest>=8.0", "pytest-cov>=4.0", "pyyaml>=6", "torch", @@ -108,8 +105,6 @@ wheel-test = [ ] [tool.uv] -# Lock resolution scope for CI/dev (does not change [project] requires-python). -environments = ["python_version >= '3.10'"] default-groups = ["dev", "build"] [tool.maturin] diff --git a/python/probing/bundled_web/public/assets/tailwind.css b/python/probing/bundled_web/public/assets/tailwind.css index 13b04594..4ee18716 100644 --- a/python/probing/bundled_web/public/assets/tailwind.css +++ b/python/probing/bundled_web/public/assets/tailwind.css @@ -828,6 +828,26 @@ video { bottom: 0px; } +.inset-y-\[-2px\] { + top: -2px; + bottom: -2px; +} + +.inset-y-\[2px\] { + top: 2px; + bottom: 2px; +} + +.inset-y-\[3px\] { + top: 3px; + bottom: 3px; +} + +.inset-y-\[5px\] { + top: 5px; + bottom: 5px; +} + .inset-y-\[7px\] { top: 7px; bottom: 7px; @@ -837,6 +857,10 @@ video { right: -0.75rem; } +.-top-px { + top: -1px; +} + .bottom-0 { bottom: 0px; } @@ -873,6 +897,10 @@ video { left: 50%; } +.left-1\/4 { + left: 25%; +} + .left-2 { left: 0.5rem; } @@ -885,6 +913,10 @@ video { left: 0.75rem; } +.left-3\/4 { + left: 75%; +} + .left-4 { left: 1rem; } @@ -929,12 +961,8 @@ video { top: 1rem; } -.top-8 { - top: 2rem; -} - -.top-\[1\.125rem\] { - top: 1.125rem; +.top-7 { + top: 1.75rem; } .top-\[10px\] { @@ -989,12 +1017,12 @@ video { z-index: 10050; } -.z-\[1\] { - z-index: 1; +.z-\[100\] { + z-index: 100; } -.z-\[51\] { - z-index: 51; +.z-\[1\] { + z-index: 1; } .z-\[60\] { @@ -1017,6 +1045,10 @@ video { z-index: 9999; } +.m-3 { + margin: 0.75rem; +} + .m-4 { margin: 1rem; } @@ -1086,6 +1118,10 @@ video { margin-left: 0.25rem; } +.ml-10 { + margin-left: 2.5rem; +} + .ml-2 { margin-left: 0.5rem; } @@ -1098,6 +1134,10 @@ video { margin-left: 1rem; } +.ml-5 { + margin-left: 1.25rem; +} + .ml-6 { margin-left: 1.5rem; } @@ -1194,6 +1234,10 @@ video { height: 2.5rem; } +.h-11 { + height: 2.75rem; +} + .h-16 { height: 4rem; } @@ -1234,6 +1278,10 @@ video { height: 1rem; } +.h-44 { + height: 11rem; +} + .h-5 { height: 1.25rem; } @@ -1274,10 +1322,6 @@ video { height: 7px; } -.h-\[calc\(100vh-8rem\)\] { - height: calc(100vh - 8rem); -} - .h-full { height: 100%; } @@ -1326,6 +1370,18 @@ video { max-height: 320px; } +.max-h-\[420px\] { + max-height: 420px; +} + +.max-h-\[520px\] { + max-height: 520px; +} + +.max-h-\[620px\] { + max-height: 620px; +} + .max-h-\[70vh\] { max-height: 70vh; } @@ -1362,12 +1418,12 @@ video { min-height: 0px; } -.min-h-16 { - min-height: 4rem; +.min-h-20 { + min-height: 5rem; } -.min-h-28 { - min-height: 7rem; +.min-h-9 { + min-height: 2.25rem; } .min-h-\[140px\] { @@ -1410,14 +1466,6 @@ video { min-height: calc(100vh - 11rem); } -.min-h-\[calc\(100vh-12rem\)\] { - min-height: calc(100vh - 12rem); -} - -.min-h-\[calc\(100vh-8rem\)\] { - min-height: calc(100vh - 8rem); -} - .min-h-full { min-height: 100%; } @@ -1438,6 +1486,10 @@ video { width: 2.75rem; } +.w-14 { + width: 3.5rem; +} + .w-16 { width: 4rem; } @@ -1490,6 +1542,10 @@ video { width: 1.5rem; } +.w-64 { + width: 16rem; +} + .w-7 { width: 1.75rem; } @@ -1522,10 +1578,18 @@ video { width: 360px; } +.w-\[38\%\] { + width: 38%; +} + .w-\[66vw\] { width: 66vw; } +.w-\[calc\(100\%-1\.5rem\)\] { + width: calc(100% - 1.5rem); +} + .w-full { width: 100%; } @@ -1538,6 +1602,10 @@ video { min-width: 0px; } +.min-w-2 { + min-width: 0.5rem; +} + .min-w-\[100px\] { min-width: 100px; } @@ -1546,6 +1614,10 @@ video { min-width: 140px; } +.min-w-\[160px\] { + min-width: 160px; +} + .min-w-\[180px\] { min-width: 180px; } @@ -1554,16 +1626,20 @@ video { min-width: 22rem; } +.min-w-\[260px\] { + min-width: 260px; +} + .min-w-\[28px\] { min-width: 28px; } -.min-w-\[320px\] { - min-width: 320px; +.min-w-\[2px\] { + min-width: 2px; } -.min-w-\[36px\] { - min-width: 36px; +.min-w-\[320px\] { + min-width: 320px; } .min-w-\[3px\] { @@ -1586,6 +1662,10 @@ video { min-width: 640px; } +.min-w-\[960px\] { + min-width: 960px; +} + .min-w-full { min-width: 100%; } @@ -1603,14 +1683,26 @@ video { max-width: 48rem; } +.max-w-52 { + max-width: 13rem; +} + .max-w-5xl { max-width: 64rem; } +.max-w-72 { + max-width: 18rem; +} + .max-w-7xl { max-width: 80rem; } +.max-w-80 { + max-width: 20rem; +} + .max-w-\[10rem\] { max-width: 10rem; } @@ -1635,6 +1727,10 @@ video { max-width: 320px; } +.max-w-\[35\%\] { + max-width: 35%; +} + .max-w-\[360px\] { max-width: 360px; } @@ -1699,10 +1795,6 @@ video { flex-shrink: 0; } -.grow { - flex-grow: 1; -} - .table-auto { table-layout: auto; } @@ -1817,6 +1909,18 @@ video { list-style-type: disc; } +.list-none { + list-style-type: none; +} + +.auto-cols-fr { + grid-auto-columns: minmax(0, 1fr); +} + +.grid-flow-col { + grid-auto-flow: column; +} + .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } @@ -1825,8 +1929,44 @@ video { grid-template-columns: repeat(2, minmax(0, 1fr)); } -.grid-cols-\[4\.5rem_minmax\(0\2c 1fr\)_5\.5rem\] { - grid-template-columns: 4.5rem minmax(0,1fr) 5.5rem; +.grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); +} + +.grid-cols-\[120px_minmax\(0\2c 1fr\)\] { + grid-template-columns: 120px minmax(0,1fr); +} + +.grid-cols-\[140px_minmax\(0\2c 1fr\)_110px\] { + grid-template-columns: 140px minmax(0,1fr) 110px; +} + +.grid-cols-\[3\.5rem_minmax\(0\2c 1fr\)_3\.5rem_minmax\(0\2c 1fr\)_3\.5rem\] { + grid-template-columns: 3.5rem minmax(0,1fr) 3.5rem minmax(0,1fr) 3.5rem; +} + +.grid-cols-\[6\.5rem_minmax\(0\2c 1fr\)_5\.5rem\] { + grid-template-columns: 6.5rem minmax(0,1fr) 5.5rem; +} + +.grid-cols-\[80px_minmax\(180px\2c 1fr\)_minmax\(180px\2c 1fr\)_120px\] { + grid-template-columns: 80px minmax(180px,1fr) minmax(180px,1fr) 120px; +} + +.grid-cols-\[auto_minmax\(0\2c 1fr\)_auto\] { + grid-template-columns: auto minmax(0,1fr) auto; +} + +.grid-cols-\[minmax\(0\2c 1fr\)_auto_auto\] { + grid-template-columns: minmax(0,1fr) auto auto; } .grid-cols-\[minmax\(180px\2c 22\%\)_130px_1fr\] { @@ -1885,6 +2025,10 @@ video { justify-content: space-between; } +.justify-items-center { + justify-items: center; +} + .gap-0 { gap: 0px; } @@ -1952,6 +2096,10 @@ video { row-gap: 0.25rem; } +.gap-y-2 { + row-gap: 0.5rem; +} + .space-y-0 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse))); @@ -2012,6 +2160,12 @@ video { margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); } +.divide-x > :not([hidden]) ~ :not([hidden]) { + --tw-divide-x-reverse: 0; + border-right-width: calc(1px * var(--tw-divide-x-reverse)); + border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse))); +} + .divide-y > :not([hidden]) ~ :not([hidden]) { --tw-divide-y-reverse: 0; border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); @@ -2082,6 +2236,18 @@ video { border-radius: 0.25rem; } +.rounded-\[1px\] { + border-radius: 1px; +} + +.rounded-\[2px\] { + border-radius: 2px; +} + +.rounded-\[3px\] { + border-radius: 3px; +} + .rounded-full { border-radius: 9999px; } @@ -2117,11 +2283,6 @@ video { border-top-right-radius: 0.25rem; } -.rounded-t-sm { - border-top-left-radius: 0.125rem; - border-top-right-radius: 0.125rem; -} - .border { border-width: 1px; } @@ -2130,6 +2291,11 @@ video { border-width: 2px; } +.border-y { + border-top-width: 1px; + border-bottom-width: 1px; +} + .border-b { border-bottom-width: 1px; } @@ -2182,6 +2348,10 @@ video { border-color: rgb(251 191 36 / var(--tw-border-opacity, 1)); } +.border-amber-400\/25 { + border-color: rgb(251 191 36 / 0.25); +} + .border-amber-50 { --tw-border-opacity: 1; border-color: rgb(255 251 235 / var(--tw-border-opacity, 1)); @@ -2227,10 +2397,6 @@ video { border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); } -.border-blue-500\/25 { - border-color: rgb(59 130 246 / 0.25); -} - .border-blue-500\/50 { border-color: rgb(59 130 246 / 0.5); } @@ -2386,6 +2552,11 @@ video { border-color: rgb(254 202 202 / var(--tw-border-opacity, 1)); } +.border-red-400 { + --tw-border-opacity: 1; + border-color: rgb(248 113 113 / var(--tw-border-opacity, 1)); +} + .border-red-50 { --tw-border-opacity: 1; border-color: rgb(254 242 242 / var(--tw-border-opacity, 1)); @@ -2485,6 +2656,11 @@ video { border-color: rgb(221 214 254 / var(--tw-border-opacity, 1)); } +.border-violet-500 { + --tw-border-opacity: 1; + border-color: rgb(139 92 246 / var(--tw-border-opacity, 1)); +} + .border-violet-700 { --tw-border-opacity: 1; border-color: rgb(109 40 217 / var(--tw-border-opacity, 1)); @@ -3612,6 +3788,10 @@ video { background-color: rgb(251 191 36 / 0.6); } +.bg-amber-400\/\[0\.06\] { + background-color: rgb(251 191 36 / 0.06); +} + .bg-amber-50 { --tw-bg-opacity: 1; background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1)); @@ -3626,6 +3806,11 @@ video { background-color: rgb(245 158 11 / 0.85); } +.bg-amber-600 { + --tw-bg-opacity: 1; + background-color: rgb(217 119 6 / var(--tw-bg-opacity, 1)); +} + .bg-amber-800 { --tw-bg-opacity: 1; background-color: rgb(146 64 14 / var(--tw-bg-opacity, 1)); @@ -3671,6 +3856,10 @@ video { background-color: rgb(96 165 250 / var(--tw-bg-opacity, 1)); } +.bg-blue-400\/70 { + background-color: rgb(96 165 250 / 0.7); +} + .bg-blue-50 { --tw-bg-opacity: 1; background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1)); @@ -3680,6 +3869,10 @@ video { background-color: rgb(239 246 255 / 0.3); } +.bg-blue-50\/50 { + background-color: rgb(239 246 255 / 0.5); +} + .bg-blue-50\/70 { background-color: rgb(239 246 255 / 0.7); } @@ -3693,10 +3886,6 @@ video { background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1)); } -.bg-blue-500\/10 { - background-color: rgb(59 130 246 / 0.1); -} - .bg-blue-500\/20 { background-color: rgb(59 130 246 / 0.2); } @@ -3801,6 +3990,10 @@ video { background-color: rgb(249 250 251 / 0.6); } +.bg-gray-50\/70 { + background-color: rgb(249 250 251 / 0.7); +} + .bg-gray-50\/80 { background-color: rgb(249 250 251 / 0.8); } @@ -3809,6 +4002,10 @@ video { background-color: rgb(249 250 251 / 0.9); } +.bg-gray-50\/95 { + background-color: rgb(249 250 251 / 0.95); +} + .bg-gray-500 { --tw-bg-opacity: 1; background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1)); @@ -3834,6 +4031,15 @@ video { background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1)); } +.bg-gray-900\/45 { + background-color: rgb(17 24 39 / 0.45); +} + +.bg-gray-950 { + --tw-bg-opacity: 1; + background-color: rgb(3 7 18 / var(--tw-bg-opacity, 1)); +} + .bg-green-200 { --tw-bg-opacity: 1; background-color: rgb(187 247 208 / var(--tw-bg-opacity, 1)); @@ -3916,10 +4122,6 @@ video { background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1)); } -.bg-red-500\/90 { - background-color: rgb(239 68 68 / 0.9); -} - .bg-red-600 { --tw-bg-opacity: 1; background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1)); @@ -4004,6 +4206,10 @@ video { background-color: rgb(15 23 42 / 0.4); } +.bg-slate-900\/55 { + background-color: rgb(15 23 42 / 0.55); +} + .bg-slate-900\/95 { background-color: rgb(15 23 42 / 0.95); } @@ -4013,10 +4219,6 @@ video { background-color: rgb(2 6 23 / var(--tw-bg-opacity, 1)); } -.bg-slate-950\/45 { - background-color: rgb(2 6 23 / 0.45); -} - .bg-transparent { background-color: transparent; } @@ -4941,10 +5143,6 @@ video { --tw-gradient-to: #0f172a var(--tw-gradient-to-position); } -.to-transparent { - --tw-gradient-to: transparent var(--tw-gradient-to-position); -} - .to-violet-100 { --tw-gradient-to: #ede9fe var(--tw-gradient-to-position); } @@ -5028,6 +5226,11 @@ video { padding-right: 0.375rem; } +.px-10 { + padding-left: 2.5rem; + padding-right: 2.5rem; +} + .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; @@ -5043,6 +5246,11 @@ video { padding-right: 0.75rem; } +.px-3\.5 { + padding-left: 0.875rem; + padding-right: 0.875rem; +} + .px-4 { padding-left: 1rem; padding-right: 1rem; @@ -5141,6 +5349,10 @@ video { padding-bottom: 0.25rem; } +.pb-1\.5 { + padding-bottom: 0.375rem; +} + .pb-2 { padding-bottom: 0.5rem; } @@ -5161,10 +5373,6 @@ video { padding-left: 0.5rem; } -.pl-3 { - padding-left: 0.75rem; -} - .pl-4 { padding-left: 1rem; } @@ -5213,6 +5421,10 @@ video { padding-top: 0.5rem; } +.pt-2\.5 { + padding-top: 0.625rem; +} + .pt-3 { padding-top: 0.75rem; } @@ -5275,6 +5487,14 @@ video { font-size: 11px; } +.text-\[7px\] { + font-size: 7px; +} + +.text-\[8px\] { + font-size: 8px; +} + .text-\[9px\] { font-size: 9px; } @@ -5324,6 +5544,10 @@ video { text-transform: uppercase; } +.normal-case { + text-transform: none; +} + .italic { font-style: italic; } @@ -5333,6 +5557,10 @@ video { font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); } +.leading-4 { + line-height: 1rem; +} + .leading-5 { line-height: 1.25rem; } @@ -5349,8 +5577,8 @@ video { line-height: 1.375; } -.tracking-\[0\.12em\] { - letter-spacing: 0.12em; +.tracking-\[0\.14em\] { + letter-spacing: 0.14em; } .tracking-tight { @@ -5425,10 +5653,6 @@ video { color: rgb(147 197 253 / var(--tw-text-opacity, 1)); } -.text-blue-300\/70 { - color: rgb(147 197 253 / 0.7); -} - .text-blue-300\/80 { color: rgb(147 197 253 / 0.8); } @@ -5529,11 +5753,6 @@ video { color: rgb(6 78 59 / var(--tw-text-opacity, 1)); } -.text-emerald-950 { - --tw-text-opacity: 1; - color: rgb(2 44 34 / var(--tw-text-opacity, 1)); -} - .text-gray-100 { --tw-text-opacity: 1; color: rgb(243 244 246 / var(--tw-text-opacity, 1)); @@ -5683,11 +5902,6 @@ video { color: rgb(127 29 29 / var(--tw-text-opacity, 1)); } -.text-red-950 { - --tw-text-opacity: 1; - color: rgb(69 10 10 / var(--tw-text-opacity, 1)); -} - .text-slate-100 { --tw-text-opacity: 1; color: rgb(241 245 249 / var(--tw-text-opacity, 1)); @@ -5906,12 +6120,6 @@ video { box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } -.ring-4 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - .ring-inset { --tw-ring-inset: inset; } @@ -6098,11 +6306,6 @@ video { --tw-ring-color: rgb(254 202 202 / var(--tw-ring-opacity, 1)); } -.ring-red-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity, 1)); -} - .ring-red-50 { --tw-ring-opacity: 1; --tw-ring-color: rgb(254 242 242 / var(--tw-ring-opacity, 1)); @@ -6196,6 +6399,14 @@ video { --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity, 1)); } +.ring-white\/70 { + --tw-ring-color: rgb(255 255 255 / 0.7); +} + +.ring-white\/80 { + --tw-ring-color: rgb(255 255 255 / 0.8); +} + .ring-yellow-50 { --tw-ring-opacity: 1; --tw-ring-color: rgb(254 252 232 / var(--tw-ring-opacity, 1)); @@ -6246,6 +6457,12 @@ video { backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); } +.transition-\[width\] { + transition-property: width; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + .transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); @@ -6350,14 +6567,18 @@ video { } } -.placeholder\:text-slate-600::-moz-placeholder { +.placeholder\:text-slate-400::-moz-placeholder { --tw-text-opacity: 1; - color: rgb(71 85 105 / var(--tw-text-opacity, 1)); + color: rgb(148 163 184 / var(--tw-text-opacity, 1)); } -.placeholder\:text-slate-600::placeholder { +.placeholder\:text-slate-400::placeholder { --tw-text-opacity: 1; - color: rgb(71 85 105 / var(--tw-text-opacity, 1)); + color: rgb(148 163 184 / var(--tw-text-opacity, 1)); +} + +.first\:pl-0:first-child { + padding-left: 0px; } .last\:border-0:last-child { @@ -6372,6 +6593,10 @@ video { padding-bottom: 0px; } +.last\:pr-0:last-child { + padding-right: 0px; +} + .focus-within\:border-blue-500:focus-within { --tw-border-opacity: 1; border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); @@ -6397,6 +6622,11 @@ video { border-color: rgb(147 197 253 / var(--tw-border-opacity, 1)); } +.hover\:border-blue-400:hover { + --tw-border-opacity: 1; + border-color: rgb(96 165 250 / var(--tw-border-opacity, 1)); +} + .hover\:border-blue-700\/40:hover { border-color: rgb(29 78 216 / 0.4); } @@ -6415,11 +6645,6 @@ video { border-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); } -.hover\:border-slate-700:hover { - --tw-border-opacity: 1; - border-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); -} - .hover\:bg-amber-100:hover { --tw-bg-opacity: 1; background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1)); @@ -6563,6 +6788,10 @@ video { background-color: rgb(249 250 251 / 0.6); } +.hover\:bg-gray-50\/70:hover { + background-color: rgb(249 250 251 / 0.7); +} + .hover\:bg-gray-50\/80:hover { background-color: rgb(249 250 251 / 0.8); } @@ -6625,6 +6854,16 @@ video { background-color: rgb(238 242 255 / 0.3); } +.hover\:bg-orange-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(234 88 12 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-red-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1)); +} + .hover\:bg-red-200:hover { --tw-bg-opacity: 1; background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1)); @@ -6816,6 +7055,11 @@ video { color: rgb(30 64 175 / var(--tw-text-opacity, 1)); } +.hover\:text-blue-900:hover { + --tw-text-opacity: 1; + color: rgb(30 58 138 / var(--tw-text-opacity, 1)); +} + .hover\:text-emerald-200:hover { --tw-text-opacity: 1; color: rgb(167 243 208 / var(--tw-text-opacity, 1)); @@ -7064,6 +7308,17 @@ video { --tw-ring-offset-width: 1px; } +.focus\:not-sr-only:focus { + position: static; + width: auto; + height: auto; + padding: 0; + margin: 0; + overflow: visible; + clip: auto; + white-space: normal; +} + .focus\:border-amber-100:focus { --tw-border-opacity: 1; border-color: rgb(254 243 199 / var(--tw-border-opacity, 1)); @@ -7362,10 +7617,18 @@ video { --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1)); } +.focus\:ring-blue-500\/20:focus { + --tw-ring-color: rgb(59 130 246 / 0.2); +} + .focus\:ring-blue-500\/30:focus { --tw-ring-color: rgb(59 130 246 / 0.3); } +.focus\:ring-offset-1:focus { + --tw-ring-offset-width: 1px; +} + .focus\:ring-offset-2:focus { --tw-ring-offset-width: 2px; } @@ -7582,17 +7845,49 @@ video { --tw-ring-offset-color: #854d0e; } +.focus-visible\:outline-none:focus-visible { + outline: 2px solid transparent; + outline-offset: 2px; +} + .focus-visible\:ring-2:focus-visible { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } +.focus-visible\:ring-inset:focus-visible { + --tw-ring-inset: inset; +} + +.focus-visible\:ring-amber-600:focus-visible { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(217 119 6 / var(--tw-ring-opacity, 1)); +} + .focus-visible\:ring-blue-400:focus-visible { --tw-ring-opacity: 1; --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1)); } +.focus-visible\:ring-blue-600:focus-visible { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity, 1)); +} + +.focus-visible\:ring-blue-700:focus-visible { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(29 78 216 / var(--tw-ring-opacity, 1)); +} + +.focus-visible\:ring-offset-1:focus-visible { + --tw-ring-offset-width: 1px; +} + +.focus-visible\:ring-offset-2:focus-visible { + --tw-ring-offset-width: 2px; +} + .active\:bg-gray-200:active { --tw-bg-opacity: 1; background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); @@ -7606,6 +7901,10 @@ video { cursor: default; } +.disabled\:cursor-not-allowed:disabled { + cursor: not-allowed; +} + .disabled\:opacity-40:disabled { opacity: 0.4; } @@ -7614,6 +7913,11 @@ video { opacity: 0.5; } +.group[open] .group-open\:rotate-90 { + --tw-rotate: 90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + .group:hover .group-hover\:bg-gray-400 { --tw-bg-opacity: 1; background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1)); @@ -7628,6 +7932,12 @@ video { background-color: rgb(107 114 128 / var(--tw-bg-opacity, 1)); } +@media (prefers-reduced-motion: reduce) { + .motion-reduce\:animate-none { + animation: none; + } +} + @media (min-width: 640px) { .sm\:col-span-2 { grid-column: span 2 / span 2; @@ -7645,10 +7955,6 @@ video { display: flex; } - .sm\:inline-flex { - display: inline-flex; - } - .sm\:max-w-5xl { max-width: 64rem; } @@ -7669,10 +7975,6 @@ video { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .sm\:grid-cols-5 { - grid-template-columns: repeat(5, minmax(0, 1fr)); - } - .sm\:items-center { align-items: center; } @@ -7693,11 +7995,6 @@ video { padding: 2rem; } - .sm\:px-5 { - padding-left: 1.25rem; - padding-right: 1.25rem; - } - .sm\:px-6 { padding-left: 1.5rem; padding-right: 1.5rem; @@ -7707,11 +8004,6 @@ video { padding-top: 1.25rem; padding-bottom: 1.25rem; } - - .sm\:text-sm { - font-size: 0.875rem; - line-height: 1.25rem; - } } @media (min-width: 768px) { @@ -7719,6 +8011,10 @@ video { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .md\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + .md\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } @@ -7741,12 +8037,8 @@ video { grid-column: span 8 / span 8; } - .lg\:flex { - display: flex; - } - - .lg\:hidden { - display: none; + .lg\:grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); } .lg\:grid-cols-12 { @@ -7769,8 +8061,8 @@ video { grid-template-columns: repeat(5, minmax(0, 1fr)); } - .lg\:flex-col { - flex-direction: column; + .lg\:p-5 { + padding: 1.25rem; } } @@ -7779,6 +8071,10 @@ video { grid-column: span 2 / span 2; } + .xl\:block { + display: block; + } + .xl\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } @@ -7791,20 +8087,28 @@ video { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .xl\:grid-cols-5 { - grid-template-columns: repeat(5, minmax(0, 1fr)); + .xl\:grid-cols-\[320px_minmax\(0\2c 1fr\)\] { + grid-template-columns: 320px minmax(0,1fr); + } + + .xl\:grid-cols-\[420px_minmax\(0\2c 1fr\)\] { + grid-template-columns: 420px minmax(0,1fr); } .xl\:grid-cols-\[minmax\(0\2c 1\.4fr\)_minmax\(320px\2c 0\.6fr\)\] { grid-template-columns: minmax(0,1.4fr) minmax(320px,0.6fr); } - .xl\:grid-cols-\[minmax\(0\2c 1fr\)_320px\] { - grid-template-columns: minmax(0,1fr) 320px; + .xl\:grid-cols-\[minmax\(0\2c 1fr\)_minmax\(0\2c 1fr\)_auto\] { + grid-template-columns: minmax(0,1fr) minmax(0,1fr) auto; + } + + .xl\:border-l { + border-left-width: 1px; } - .xl\:grid-cols-\[minmax\(0\2c 2fr\)_minmax\(300px\2c 1fr\)\] { - grid-template-columns: minmax(0,2fr) minmax(300px,1fr); + .xl\:border-t-0 { + border-top-width: 0px; } } diff --git a/python/probing/bundled_web/public/assets/web-dxh2bd1b3fd6bc6d181.js b/python/probing/bundled_web/public/assets/web-dxh2bd1b3fd6bc6d181.js new file mode 100644 index 00000000..80269f1e --- /dev/null +++ b/python/probing/bundled_web/public/assets/web-dxh2bd1b3fd6bc6d181.js @@ -0,0 +1,5 @@ +function lt(u,t,e,n){if(n==="style"){u.style.setProperty(t,e);return}if(n){u.setAttributeNS(n,t,e);return}switch(t){case"value":u.tagName==="OPTION"?Y(u,t,e):u.value!==e&&(u.value=e);break;case"initial_value":u.defaultValue=e;break;case"checked":u.checked=S(e);break;case"initial_checked":u.defaultChecked=S(e);break;case"selected":u.selected=S(e);break;case"initial_selected":u.defaultSelected=S(e);break;case"dangerous_inner_html":u.innerHTML=e;break;case"style":let r={};for(let i=0;i{for(let n of e)this.handleResizeEvent(n)})),this.resizeObserver.observe(t)}removeResizeObserver(t){this.resizeObserver&&this.resizeObserver.unobserve(t)}handleIntersectionEvent(t){let e=t.target,n=new CustomEvent("visible",{bubbles:!1,detail:t});e.dispatchEvent(n)}createIntersectionObserver(t){this.intersectionObserver||(this.intersectionObserver=new IntersectionObserver(e=>{for(let n of e)this.handleIntersectionEvent(n)})),this.intersectionObserver.observe(t)}removeIntersectionObserver(t){this.intersectionObserver&&this.intersectionObserver.unobserve(t)}createListener(t,e,n){if(t=="resize"?this.createResizeObserver(e):t=="visible"&&this.createIntersectionObserver(e),n)this.global[t]===void 0?(this.global[t]={active:1,callback:this.handler},this.root.addEventListener(t,this.handler)):this.global[t].active++;else{let r=e.getAttribute("data-dioxus-id");this.local[r]||(this.local[r]={}),e.addEventListener(t,this.handler)}}removeListener(t,e,n){e=="resize"?this.removeResizeObserver(t):e=="visible"?this.removeIntersectionObserver(t):n?this.removeBubblingListener(e):this.removeNonBubblingListener(t,e)}removeBubblingListener(t){this.global[t].active--,this.global[t].active===0&&(this.root.removeEventListener(t,this.global[t].callback),delete this.global[t])}removeNonBubblingListener(t,e){let n=t.getAttribute("data-dioxus-id");delete this.local[n][e],Object.keys(this.local[n]).length===0&&delete this.local[n],t.removeEventListener(e,this.handler)}removeAllNonBubblingListeners(t){let e=t.getAttribute("data-dioxus-id");delete this.local[e]}getNode(t){return this.nodes[t]}pushRoot(t){this.stack.push(t)}appendChildren(t,e){let n=this.nodes[t],r=this.stack.splice(this.stack.length-e);for(let i=0;i0;i--)n=n.nextSibling}return n}saveTemplate(t,e){this.templates[e]=t}hydrate_node(t,e){let n=t.getAttribute("data-node-hydration").split(","),r=e[parseInt(n[0])];if(this.nodes[r]=t,n.length>1){t.listening=n.length-1,t.setAttribute("data-dioxus-id",r.toString());for(let i=1;ii.nextNode()?i.currentNode!==f:!1;for(;i.currentNode;){let p=i.currentNode;if(p.nodeType===Node.COMMENT_NODE){let y=p.textContent,A=y.split("placeholder");if(A.length>1){if(this.nodes[t[parseInt(A[1])]]=p,!w())break;continue}let et=y.split("node-id");if(et.length>1){let x=p.nextSibling;p.remove();let z,B;if(x.nodeType===Node.COMMENT_NODE){let bt=x.parentElement.insertBefore(document.createTextNode(""),x);z=x,B=bt}else B=x,z=B.nextSibling;i.currentNode=z,this.nodes[t[parseInt(et[1])]]=B;let ft=p===r||!w();if(z.remove(),ft)break;continue}}if(!w())break}}}setAttributeInner(t,e,n,r){lt(t,e,n,r)}};var I,T,v,M,F,U=class extends Z{constructor(t){super(),this.d=t,this.m=null,this.p=null,this.ls=null,this.t=null,this.op=null,this.e=null,this.z=null,this.metaflags=null,this.u16buf=null,this.u16bufp=null,this.u32buf=null,this.u32bufp=null,this.u8buf=null,this.u8bufp=null,this.attr=[],this.attr_cache_hit=null,this.attr_cache_idx,this.get_attr=function(){return this.attr_cache_idx=this.u8buf[this.u8bufp++],this.attr_cache_idx&128?(this.attr_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.attr[this.attr_cache_idx&4294967167]=this.attr_cache_hit,this.attr_cache_hit):this.attr[this.attr_cache_idx&4294967167]},this.el=[],this.el_cache_hit=null,this.el_cache_idx,this.get_el=function(){return this.el_cache_idx=this.u8buf[this.u8bufp++],this.el_cache_idx&128?(this.el_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.el[this.el_cache_idx&4294967167]=this.el_cache_hit,this.el_cache_hit):this.el[this.el_cache_idx&4294967167]},this.evt=[],this.evt_cache_hit=null,this.evt_cache_idx,this.get_evt=function(){return this.evt_cache_idx=this.u8buf[this.u8bufp++],this.evt_cache_idx&128?(this.evt_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.evt[this.evt_cache_idx&4294967167]=this.evt_cache_hit,this.evt_cache_hit):this.evt[this.evt_cache_idx&4294967167]},this.namespace=[],this.namespace_cache_hit=null,this.namespace_cache_idx,this.get_namespace=function(){return this.namespace_cache_idx=this.u8buf[this.u8bufp++],this.namespace_cache_idx&128?(this.namespace_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.namespace[this.namespace_cache_idx&4294967167]=this.namespace_cache_hit,this.namespace_cache_hit):this.namespace[this.namespace_cache_idx&4294967167]},this.ns_cache=[],this.ns_cache_cache_hit=null,this.ns_cache_cache_idx,this.get_ns_cache=function(){return this.ns_cache_cache_idx=this.u8buf[this.u8bufp++],this.ns_cache_cache_idx&128?(this.ns_cache_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.ns_cache[this.ns_cache_cache_idx&4294967167]=this.ns_cache_cache_hit,this.ns_cache_cache_hit):this.ns_cache[this.ns_cache_cache_idx&4294967167]},this.s="",this.lsp=null,this.sp=null,this.sl=null,this.c=new TextDecoder}update_memory(t){this.m=new DataView(t.buffer)}run(){if(this.metaflags=this.m.getUint32(this.d,!0),this.metaflags>>>6&1&&(this.ls=this.m.getUint32(this.d+24,!0)),this.p=this.ls,this.metaflags>>>4&1&&(this.t=this.m.getUint32(this.d+16,!0),this.u16buf=new Uint16Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%2)/2)),this.u16bufp=0,this.metaflags>>>3&1&&(this.t=this.m.getUint32(this.d+12,!0),this.u32buf=new Uint32Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%4)/4)),this.u32bufp=0,this.metaflags>>>5&1&&(this.t=this.m.getUint32(this.d+20,!0),this.u8buf=new Uint8Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%1)/1)),this.u8bufp=0,this.metaflags&1&&(this.lsp=this.m.getUint32(this.d+4,!0)),this.metaflags>>>2&1)if(this.sl=this.m.getUint32(this.d+8,!0),this.metaflags>>>1&1){for(this.sp=this.lsp,this.s="",this.e=this.sp+(this.sl/4|0)*4;this.sp>8,(this.t&16711680)>>16,this.t>>24),this.sp+=4;for(;this.sp{this.handler(r,n,I)});break;case 25:this.nodes[this.u32buf[this.u32bufp++]]=this.loadChild((()=>{this.e=this.u8bufp+this.u32buf[this.u32bufp++];let r=this.u8buf.slice(this.u8bufp,this.e);return this.u8bufp=this.e,r})());break;case 26:{let r=this.stack.splice(this.stack.length-this.u16buf[this.u16bufp++]);this.loadChild((()=>{this.e=this.u8bufp+this.u32buf[this.u32bufp++];let f=this.u8buf.slice(this.u8bufp,this.e);return this.u8bufp=this.e,f})()).replaceWith(...r)}break;case 27:return!0}this.op>>>=8}}run_from_bytes(t){this.d=0,this.update_memory(new Uint8Array(t)),this.run()}};function nt(u,t,e,n){if(n==="style"){u.style.setProperty(t,e);return}if(n){u.setAttributeNS(n,t,e);return}switch(t){case"value":u.tagName==="OPTION"?V(u,t,e):u.value!==e&&(u.value=e);break;case"initial_value":u.defaultValue=e;break;case"checked":u.checked=N(e);break;case"initial_checked":u.defaultChecked=N(e);break;case"selected":u.selected=N(e);break;case"initial_selected":u.defaultSelected=N(e);break;case"dangerous_inner_html":u.innerHTML=e;break;case"style":let r={};for(let i=0;i0){this.waiting.shift()(t);return}this.pending.push(t)}async recv(){return new Promise((t,e)=>{if(this.pending.length>0){t(this.pending.shift());return}this.waiting.push(t)})}},D=class{inner;constructor(t){this.inner=new WeakRef(t)}rustSend(t){let e=this.inner.deref();e&&e.rustSend(t)}async rustRecv(){let t=this.inner.deref();if(t)return await t.rustRecv()}},$=class{weak(){return new D(this)}};globalThis.__nextChannelId=0;globalThis.__channels=[];var W=class extends ${js_to_rust;rust_to_js;owner;id;constructor(t){super(),this.owner=t,this.js_to_rust=new j,this.rust_to_js=new j,this.id=globalThis.__nextChannelId,globalThis.__channels[this.id]=this,globalThis.__nextChannelId+=1}weak(){return new D(this)}async recv(){return await this.rust_to_js.recv()}send(t){this.js_to_rust.send(t)}rustSend(t){this.rust_to_js.send(t)}async rustRecv(){return await this.js_to_rust.recv()}close(){globalThis.__channels[this.id]=null}};function st(){return window.__PROBING_BASE_PATH__||""}var K=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Rt.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingbytesource_free(t,0)}get autoAllocateChunkSize(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingbytesource_autoAllocateChunkSize(this.__wbg_ptr)>>>0}cancel(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();o(t),c.intounderlyingbytesource_cancel(t)}pull(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingbytesource_pull(this.__wbg_ptr,t)}start(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");o(this.__wbg_ptr),c.intounderlyingbytesource_start(this.__wbg_ptr,t)}get type(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");o(this.__wbg_ptr);let t=c.intounderlyingbytesource_type(this.__wbg_ptr);return At[t]}};Symbol.dispose&&(K.prototype[Symbol.dispose]=K.prototype.free);var q=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Ot.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingsink_free(t,0)}abort(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let e=this.__destroy_into_raw();return o(e),c.intounderlyingsink_abort(e,t)}close(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();return o(t),c.intounderlyingsink_close(t)}write(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingsink_write(this.__wbg_ptr,t)}};Symbol.dispose&&(q.prototype[Symbol.dispose]=q.prototype.free);var H=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Ct.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingsource_free(t,0)}cancel(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();o(t),c.intounderlyingsource_cancel(t)}pull(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingsource_pull(this.__wbg_ptr,t)}};Symbol.dispose&&(H.prototype[Symbol.dispose]=H.prototype.free);var L=class u{constructor(){throw new Error("cannot invoke `new` directly")}static __wrap(t){let e=Object.create(u.prototype);return e.__wbg_ptr=t,ct.register(e,e.__wbg_ptr,e),e}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,ct.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_jsowner_free(t,0)}};Symbol.dispose&&(L.prototype[Symbol.dispose]=L.prototype.free);function tt(){return{__proto__:null,"./web_bg.js":{__proto__:null,__wbg_Error_92b29b0548f8b746:function(){return s(function(t,e){return Error(l(t,e))},arguments)},__wbg_String_8564e559799eccda:function(){return s(function(t,e){let n=String(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg___wbindgen_bigint_get_as_i64_d968e41184ae354f:function(t,e){let n=e,r=typeof n=="bigint"?n:void 0;g(r)||Lt(r),_().setBigInt64(t+8,g(r)?BigInt(0):r,!0),_().setInt32(t+0,!g(r),!0)},__wbg___wbindgen_boolean_get_fa956cfa2d1bd751:function(t){let e=t,n=typeof e=="boolean"?e:void 0;return g(n)||b(n),g(n)?16777215:n?1:0},__wbg___wbindgen_debug_string_c25d447a39f5578f:function(t,e){let n=Q(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},__wbg___wbindgen_in_aca499c5de7ff5e5:function(t,e){let n=t in e;return b(n),n},__wbg___wbindgen_is_bigint_2f76dc55065b4273:function(t){let e=typeof t=="bigint";return b(e),e},__wbg___wbindgen_is_function_1ff95bcc5517c252:function(t){let e=typeof t=="function";return b(e),e},__wbg___wbindgen_is_object_a27215656b807791:function(t){let e=t,n=typeof e=="object"&&e!==null;return b(n),n},__wbg___wbindgen_is_string_ea5e6cc2e4141dfe:function(t){let e=typeof t=="string";return b(e),e},__wbg___wbindgen_is_undefined_c05833b95a3cf397:function(t){let e=t===void 0;return b(e),e},__wbg___wbindgen_jsval_eq_e659fcf7b0e32763:function(t,e){let n=t===e;return b(n),n},__wbg___wbindgen_jsval_loose_eq_db4c3b15f63fc170:function(t,e){let n=t==e;return b(n),n},__wbg___wbindgen_memory_de265df8aadd6273:function(){return c.memory},__wbg___wbindgen_number_get_394265ed1e1b84ee:function(t,e){let n=e,r=typeof n=="number"?n:void 0;g(r)||o(r),_().setFloat64(t+8,g(r)?0:r,!0),_().setInt32(t+0,!g(r),!0)},__wbg___wbindgen_string_get_b0ca35b86a603356:function(t,e){let n=e,r=typeof n=="string"?n:void 0;var i=g(r)?0:h(r,c.__wbindgen_malloc,c.__wbindgen_realloc),f=d;_().setInt32(t+4,f,!0),_().setInt32(t+0,i,!0)},__wbg___wbindgen_throw_344f42d3211c4765:function(t,e){throw new Error(l(t,e))},__wbg__wbg_cb_unref_fffb441def202758:function(){return s(function(t){t._wbg_cb_unref()},arguments)},__wbg_abort_8bae0f33e7833997:function(){return s(function(t){t.abort()},arguments)},__wbg_abort_eee9248a6d680839:function(){return s(function(t,e){t.abort(e)},arguments)},__wbg_activeElement_4bc99dc1a7094c27:function(){return s(function(t){let e=t.activeElement;return g(e)?0:m(e)},arguments)},__wbg_addEventListener_d85450ee1320c989:function(){return a(function(t,e,n,r){t.addEventListener(l(e,n),r)},arguments)},__wbg_altKey_50f830d1793a2eea:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_altKey_c5e44fde6beb66ef:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_altKey_f3e24c4c9cfcf271:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_animationName_e80680fbfd3da8a2:function(){return s(function(t,e){let n=e.animationName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_appendChild_f553e8704c4f14a6:function(){return a(function(t,e){return t.appendChild(e)},arguments)},__wbg_append_01c74e5c6b58aa64:function(){return a(function(t,e,n,r,i){t.append(l(e,n),l(r,i))},arguments)},__wbg_append_58377ae3be2fb5ef:function(){return a(function(t,e,n,r,i,f){t.append(l(e,n),r,l(i,f))},arguments)},__wbg_append_8e24caa53c80c631:function(){return a(function(t,e,n,r,i){t.append(l(e,n),l(r,i))},arguments)},__wbg_append_91733ec40ee3b1f9:function(){return a(function(t,e,n,r){t.append(l(e,n),r)},arguments)},__wbg_arrayBuffer_3b637f0fa65c5351:function(){return a(function(t){return t.arrayBuffer()},arguments)},__wbg_arrayBuffer_a158e423a87ee756:function(){return s(function(t){return t.arrayBuffer()},arguments)},__wbg_back_939cbdbdfad8aff7:function(){return a(function(t){t.back()},arguments)},__wbg_blockSize_5af477b962b2b031:function(){return s(function(t){return t.blockSize},arguments)},__wbg_blur_e902dcc79406e89c:function(){return a(function(t){t.blur()},arguments)},__wbg_body_40ec34e0a2931fe8:function(){return s(function(t){let e=t.body;return g(e)?0:m(e)},arguments)},__wbg_borderBoxSize_ff7f5405dcc6554e:function(){return s(function(t){return t.borderBoxSize},arguments)},__wbg_boundingClientRect_0776888095b16b8c:function(){return s(function(t){return t.boundingClientRect},arguments)},__wbg_bubbles_07bec919f30033ab:function(){return s(function(t){let e=t.bubbles;return b(e),e},arguments)},__wbg_buffer_54b87055582c8a81:function(){return s(function(t){return t.buffer},arguments)},__wbg_button_f6a9a7b725f1838e:function(){return s(function(t){let e=t.button;return o(e),e},arguments)},__wbg_buttons_d8acd46cf8f40ae9:function(){return s(function(t){let e=t.buttons;return o(e),e},arguments)},__wbg_byobRequest_06b654bb15590436:function(){return s(function(t){let e=t.byobRequest;return g(e)?0:m(e)},arguments)},__wbg_byteLength_41862ca4020b9c43:function(){return s(function(t){let e=t.byteLength;return o(e),e},arguments)},__wbg_byteOffset_d42e18c4441f628b:function(){return s(function(t){let e=t.byteOffset;return o(e),e},arguments)},__wbg_call_8a2dd23819f8a60a:function(){return a(function(t,e){return t.call(e)},arguments)},__wbg_call_a6e5c5dce5018821:function(){return a(function(t,e,n){return t.call(e,n)},arguments)},__wbg_changedTouches_dbf6eeabddd3c2da:function(){return s(function(t){return t.changedTouches},arguments)},__wbg_charCodeAt_2a30bc7c17474cc6:function(){return s(function(t,e){return t.charCodeAt(e>>>0)},arguments)},__wbg_checkValidity_3a31dcce278f31a1:function(){return s(function(t){let e=t.checkValidity();return b(e),e},arguments)},__wbg_checked_596d0d7b35f55a01:function(){return s(function(t){let e=t.checked;return b(e),e},arguments)},__wbg_clearData_1297d08581746c08:function(){return a(function(t,e,n){t.clearData(l(e,n))},arguments)},__wbg_clearData_a7a19d854ec1a3b7:function(){return a(function(t){t.clearData()},arguments)},__wbg_clearInterval_16e8cbbce92291d0:function(){return s(function(t){return clearInterval(t)},arguments)},__wbg_clearTimeout_113b1cde814ec762:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clearTimeout_333bba87532ab9d3:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clearTimeout_6b8d9a38b9263d65:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clientHeight_994541cde34d3ca0:function(){return s(function(t){let e=t.clientHeight;return o(e),e},arguments)},__wbg_clientWidth_6852617da948be39:function(){return s(function(t){let e=t.clientWidth;return o(e),e},arguments)},__wbg_clientX_a7dcb4081126cd4b:function(){return s(function(t){let e=t.clientX;return o(e),e},arguments)},__wbg_clientX_c396b0fb11d601d3:function(){return s(function(t){let e=t.clientX;return o(e),e},arguments)},__wbg_clientY_a4650836fdf58f01:function(){return s(function(t){let e=t.clientY;return o(e),e},arguments)},__wbg_clientY_c0560910b20ee192:function(){return s(function(t){let e=t.clientY;return o(e),e},arguments)},__wbg_close_249a23304523681b:function(){return a(function(t){t.close()},arguments)},__wbg_close_72d318d9c16e83ef:function(){return a(function(t){t.close()},arguments)},__wbg_code_89c999e407c79eef:function(){return s(function(t,e){let n=e.code,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_contentBoxSize_74fbbc51859ff90e:function(){return s(function(t){return t.contentBoxSize},arguments)},__wbg_createComment_003419d0740789d4:function(){return s(function(t,e,n){return t.createComment(l(e,n))},arguments)},__wbg_createElementNS_013b3fb26f4796ec:function(){return a(function(t,e,n,r,i){return t.createElementNS(e===0?void 0:l(e,n),l(r,i))},arguments)},__wbg_createElement_fcbc0805de826d62:function(){return a(function(t,e,n){return t.createElement(l(e,n))},arguments)},__wbg_createObjectURL_416e527781e6fd6d:function(){return a(function(t,e){let n=URL.createObjectURL(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_createTextNode_4dad5b18435dda7c:function(){return s(function(t,e,n){return t.createTextNode(l(e,n))},arguments)},__wbg_ctrlKey_2e52816fa7160097:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_ctrlKey_50bd8324959ca786:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_ctrlKey_57171169eab54da6:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_dataTransfer_c1c4745cee7e05f1:function(){return s(function(t){let e=t.dataTransfer;return g(e)?0:m(e)},arguments)},__wbg_data_f994b1bb75d8337a:function(){return s(function(t,e){let n=e.data;var r=g(n)?0:h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_deltaMode_d869228efd74f393:function(){return s(function(t){let e=t.deltaMode;return o(e),e},arguments)},__wbg_deltaX_5d829ffba565ed10:function(){return s(function(t){return t.deltaX},arguments)},__wbg_deltaY_6cfce8f8da250c23:function(){return s(function(t){return t.deltaY},arguments)},__wbg_deltaZ_42c86f225c34aa04:function(){return s(function(t){return t.deltaZ},arguments)},__wbg_detail_a90dcd774780ebf6:function(){return s(function(t){return t.detail},arguments)},__wbg_documentElement_b7ec99417969bfbc:function(){return s(function(t){let e=t.documentElement;return g(e)?0:m(e)},arguments)},__wbg_document_179650d6cb13c263:function(){return s(function(t){let e=t.document;return g(e)?0:m(e)},arguments)},__wbg_done_89b2b13e91a60321:function(){return s(function(t){let e=t.done;return b(e),e},arguments)},__wbg_dropEffect_8187d3b019f3e6bd:function(){return s(function(t,e){let n=e.dropEffect,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_effectAllowed_ca2550f3a73fb833:function(){return s(function(t,e){let n=e.effectAllowed,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_elapsedTime_0330f570ff694c6f:function(){return s(function(t){return t.elapsedTime},arguments)},__wbg_elapsedTime_4c2a1fd1473438d6:function(){return s(function(t){return t.elapsedTime},arguments)},__wbg_enqueue_6d83b4c6281bafd6:function(){return a(function(t,e){t.enqueue(e)},arguments)},__wbg_entries_015dc610cd81ede0:function(){return s(function(t){return Object.entries(t)},arguments)},__wbg_entries_8ddbe5d352d85237:function(){return s(function(t){return t.entries()},arguments)},__wbg_entries_900cefd6f70eb290:function(){return s(function(t){return t.entries()},arguments)},__wbg_error_744744ff0c9861e6:function(){return s(function(t){console.error(t)},arguments)},__wbg_fetch_074561c3e313c86f:function(){return s(function(t){return fetch(t)},arguments)},__wbg_fetch_9dad4fe911207b37:function(){return s(function(t){return fetch(t)},arguments)},__wbg_fetch_b5951fc96f52f786:function(){return s(function(t,e){return t.fetch(e)},arguments)},__wbg_files_116196bc012ac3c8:function(){return s(function(t){let e=t.files;return g(e)?0:m(e)},arguments)},__wbg_files_a4eb87e5e4343c46:function(){return s(function(t){let e=t.files;return g(e)?0:m(e)},arguments)},__wbg_focus_2f77051f98540625:function(){return a(function(t){t.focus()},arguments)},__wbg_force_368c1897f399d783:function(){return s(function(t){return t.force},arguments)},__wbg_forward_4bb54c7f45451c64:function(){return a(function(t){t.forward()},arguments)},__wbg_getAsFile_adead4fd4f4ce592:function(){return a(function(t){let e=t.getAsFile();return g(e)?0:m(e)},arguments)},__wbg_getAttribute_5a601ba4718b922a:function(){return s(function(t,e,n,r){let i=e.getAttribute(l(n,r));var f=g(i)?0:h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,f,!0)},arguments)},__wbg_getBoundingClientRect_e828e6c31c66dea6:function(){return s(function(t){return t.getBoundingClientRect()},arguments)},__wbg_getData_fcb88fae21d94f1e:function(){return a(function(t,e,n,r){let i=e.getData(l(n,r)),f=h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,f,!0)},arguments)},__wbg_getElementById_1cbd8f06dbe8eb8e:function(){return s(function(t,e,n){let r=t.getElementById(l(e,n));return g(r)?0:m(r)},arguments)},__wbg_getHours_9f6561095682ce51:function(){return s(function(t){let e=t.getHours();return o(e),e},arguments)},__wbg_getItem_b96269ddc16cf24a:function(){return a(function(t,e,n,r){let i=e.getItem(l(n,r));var f=g(i)?0:h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,f,!0)},arguments)},__wbg_getMinutes_b0d5cd90bf9b8f22:function(){return s(function(t){let e=t.getMinutes();return o(e),e},arguments)},__wbg_getNode_2f3b1f608db7c9d0:function(){return s(function(t,e){return t.getNode(e>>>0)},arguments)},__wbg_getSeconds_40c565b3a6cb05fe:function(){return s(function(t){let e=t.getSeconds();return o(e),e},arguments)},__wbg_get_507a50627bffa49b:function(){return s(function(t,e){return t[e>>>0]},arguments)},__wbg_get_757c867e2520bbc4:function(){return s(function(t,e){let n=t[e>>>0];return g(n)?0:m(n)},arguments)},__wbg_get_78f252d074a84d0b:function(){return a(function(t,e){return Reflect.get(t,e)},arguments)},__wbg_get_base_path_39628b0b6ddfa96a:function(){return s(function(t){let e=st(),n=h(e,c.__wbindgen_malloc,c.__wbindgen_realloc),r=d;_().setInt32(t+4,r,!0),_().setInt32(t+0,n,!0)},arguments)},__wbg_get_c7eb1f358a7654df:function(){return a(function(t,e){return Reflect.get(t,e)},arguments)},__wbg_get_e73985d6689d2245:function(){return s(function(t,e){let n=t[e>>>0];return g(n)?0:m(n)},arguments)},__wbg_get_select_data_60af93fcbe2f391c:function(){return s(function(t,e){let n=rt(e),r=Mt(n,c.__wbindgen_malloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_get_unchecked_6e0ad6d2a41b06f6:function(){return s(function(t,e){return t[e>>>0]},arguments)},__wbg_has_8374cf06984d8bfc:function(){return a(function(t,e){let n=Reflect.has(t,e);return b(n),n},arguments)},__wbg_hash_508149c4291ec8c2:function(){return a(function(t,e){let n=e.hash,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_head_41a60f9034e0b41a:function(){return s(function(t){let e=t.head;return g(e)?0:m(e)},arguments)},__wbg_headers_cf9c80f30e2a4eff:function(){return s(function(t){return t.headers},arguments)},__wbg_height_6f29ab40ae50636d:function(){return s(function(t){let e=t.height;return o(e),e},arguments)},__wbg_height_96c07d9559d0200a:function(){return s(function(t){return t.height},arguments)},__wbg_height_9f27216001e3c804:function(){return s(function(t){return t.height},arguments)},__wbg_hidden_c08eb1c29c138ab0:function(){return s(function(t){let e=t.hidden;return b(e),e},arguments)},__wbg_history_e648b4314d9b256e:function(){return a(function(t){return t.history},arguments)},__wbg_identifier_d30bb260fab6b02a:function(){return s(function(t){let e=t.identifier;return o(e),e},arguments)},__wbg_initialize_169e37fbdd472b20:function(){return s(function(t,e,n){t.initialize(e,n)},arguments)},__wbg_inlineSize_3c8412828bef21eb:function(){return s(function(t){return t.inlineSize},arguments)},__wbg_instanceof_AnimationEvent_3a83c3d21fbd4d01:function(){return s(function(t){let e;try{e=t instanceof AnimationEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_ArrayBuffer_4480b9e0068a8adb:function(){return s(function(t){let e;try{e=t instanceof ArrayBuffer}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Blob_c6523f92a32c8695:function(){return s(function(t){let e;try{e=t instanceof Blob}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_CompositionEvent_6fef075df3b5dbf4:function(){return s(function(t){let e;try{e=t instanceof CompositionEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_CustomEvent_9b848ed45794fd3e:function(){return s(function(t){let e;try{e=t instanceof CustomEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Document_d1955f84f5d0351c:function(){return s(function(t){let e;try{e=t instanceof Document}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_DragEvent_7bd2cb4c087838f2:function(){return s(function(t){let e;try{e=t instanceof DragEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Element_beebfaab75d12d9d:function(){return s(function(t){let e;try{e=t instanceof Element}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Event_512f3841fa744d1e:function(){return s(function(t){let e;try{e=t instanceof Event}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_File_ee62de53bca2e697:function(){return s(function(t){let e;try{e=t instanceof File}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_FocusEvent_cadb56dad3dfd4ac:function(){return s(function(t){let e;try{e=t instanceof FocusEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlElement_4493a09212d3586f:function(){return s(function(t){let e;try{e=t instanceof HTMLElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlFormElement_ebf2bd35b418e93e:function(){return s(function(t){let e;try{e=t instanceof HTMLFormElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlInputElement_ad3be04339d0e4df:function(){return s(function(t){let e;try{e=t instanceof HTMLInputElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlSelectElement_b4698f847dc49da5:function(){return s(function(t){let e;try{e=t instanceof HTMLSelectElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlTextAreaElement_37795f65e16b7ed0:function(){return s(function(t){let e;try{e=t instanceof HTMLTextAreaElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_KeyboardEvent_be49f2d8e15d587a:function(){return s(function(t){let e;try{e=t instanceof KeyboardEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Map_e5b5e3db98422fcc:function(){return s(function(t){let e;try{e=t instanceof Map}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_MouseEvent_89eddfc6203c1749:function(){return s(function(t){let e;try{e=t instanceof MouseEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Node_d29e7ded486fd76a:function(){return s(function(t){let e;try{e=t instanceof Node}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_PointerEvent_8ef1feb51407c0ed:function(){return s(function(t){let e;try{e=t instanceof PointerEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Response_c8b64b2256f01bec:function(){return s(function(t){let e;try{e=t instanceof Response}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_TouchEvent_62e9e212135a784b:function(){return s(function(t){let e;try{e=t instanceof TouchEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_TransitionEvent_a1842850468877e4:function(){return s(function(t){let e;try{e=t instanceof TransitionEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Uint8Array_309b927aaf7a3fc7:function(){return s(function(t){let e;try{e=t instanceof Uint8Array}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_WheelEvent_8a8f43ee9318fcd4:function(){return s(function(t){let e;try{e=t instanceof WheelEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Window_05ba1ee4f6781663:function(){return s(function(t){let e;try{e=t instanceof Window}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_intersectionRatio_7c65292cc5ad712c:function(){return s(function(t){return t.intersectionRatio},arguments)},__wbg_intersectionRect_be1020a3be2ed245:function(){return s(function(t){return t.intersectionRect},arguments)},__wbg_isArray_0677c962b281d01a:function(){return s(function(t){let e=Array.isArray(t);return b(e),e},arguments)},__wbg_isComposing_919a0fdf6ac030c9:function(){return s(function(t){let e=t.isComposing;return b(e),e},arguments)},__wbg_isIntersecting_fc6d9529a49c5d62:function(){return s(function(t){let e=t.isIntersecting;return b(e),e},arguments)},__wbg_isPrimary_e59b27f91017e844:function(){return s(function(t){let e=t.isPrimary;return b(e),e},arguments)},__wbg_isSafeInteger_04f36e4056f1b851:function(){return s(function(t){let e=Number.isSafeInteger(t);return b(e),e},arguments)},__wbg_item_74998074fc497f92:function(){return s(function(t,e){let n=t.item(e>>>0);return g(n)?0:m(n)},arguments)},__wbg_items_350b6f2d566d3def:function(){return s(function(t){return t.items},arguments)},__wbg_iterator_6f722e4a93058b71:function(){return s(function(){return Symbol.iterator},arguments)},__wbg_key_803dca86cdcfa8dd:function(){return s(function(t,e){let n=e.key,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_kind_c494ca014c671a6f:function(){return s(function(t,e){let n=e.kind,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_lastModified_41250e8004d0f7ce:function(){return s(function(t){return t.lastModified},arguments)},__wbg_left_7e76a74d0db1754f:function(){return s(function(t){return t.left},arguments)},__wbg_length_02c64e687322fa34:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_1f0964f4a5e2c6d8:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_370319915dc99107:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_e08fc23135c66d6f:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_eea4bfa35e75c87c:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_ef21514bf74fe712:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_localStorage_5bf6ce3f8e51412a:function(){return a(function(t){let e=t.localStorage;return g(e)?0:m(e)},arguments)},__wbg_location_8f24df2c257fb974:function(){return s(function(t){let e=t.location;return o(e),e},arguments)},__wbg_location_c9a2271428996698:function(){return s(function(t){return t.location},arguments)},__wbg_log_0c201ade58bb55e1:function(){return s(function(t,e,n,r,i,f,w,p){let y,A;try{y=t,A=e,console.log(l(t,e),l(n,r),l(i,f),l(w,p))}finally{c.__wbindgen_free(y,A,1)}},arguments)},__wbg_log_ce2c4456b290c5e7:function(){return s(function(t,e){let n,r;try{n=t,r=e,console.log(l(t,e))}finally{c.__wbindgen_free(n,r,1)}},arguments)},__wbg_mark_b4d943f3bc2d2404:function(){return s(function(t,e){performance.mark(l(t,e))},arguments)},__wbg_measure_84362959e621a2c1:function(){return a(function(t,e,n,r){let i,f,w,p;try{i=t,f=e,w=n,p=r,performance.measure(l(t,e),l(n,r))}finally{c.__wbindgen_free(i,f,1),c.__wbindgen_free(w,p,1)}},arguments)},__wbg_metaKey_7a85debd51844822:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_metaKey_d961c7572a9f84f5:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_metaKey_f934f09e37889d70:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_name_14e920dc23fffd96:function(){return s(function(t,e){let n=e.name,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_name_d7d79f5466e37447:function(){return s(function(t,e){let n=e.name,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_new_0912d735e8fbc1d3:function(){return a(function(){return new FormData},arguments)},__wbg_new_0_3da9e97f24fc69be:function(){return s(function(){return new Date},arguments)},__wbg_new_0d809930cd1354c6:function(){return a(function(){return new Headers},arguments)},__wbg_new_22598f2b091dadf2:function(){return s(function(t){return new W(L.__wrap(t))},arguments)},__wbg_new_26bdcffba762c064:function(){return s(function(t){return new U(t>>>0)},arguments)},__wbg_new_32b398fb48b6d94a:function(){return s(function(){return new Array},arguments)},__wbg_new_41e6f99b2fd20423:function(){return a(function(){return new FileReader},arguments)},__wbg_new_4339b2a2675a03e3:function(){return a(function(){return new AbortController},arguments)},__wbg_new_7796ffc7ed656783:function(){return s(function(){return new Map},arguments)},__wbg_new_9792ad3275d1dd31:function(){return a(function(){return new DataTransfer},arguments)},__wbg_new_b667d279fd5aa943:function(){return s(function(t,e){return new Error(l(t,e))},arguments)},__wbg_new_cd45aabdf6073e84:function(){return s(function(t){return new Uint8Array(t)},arguments)},__wbg_new_da52cf8fe3429cb2:function(){return s(function(){return new Object},arguments)},__wbg_new_from_slice_77cdfb7977362f3c:function(){return s(function(t,e){return new Uint8Array(J(t,e))},arguments)},__wbg_new_typed_1824d93f294193e5:function(){return s(function(t,e){try{var n={a:t,b:e},r=(f,w)=>{let p=n.a;n.a=0;try{return It(p,n.b,f,w)}finally{n.a=p}};return new Promise(r)}finally{n.a=0}},arguments)},__wbg_new_with_args_200d82645b6544eb:function(){return s(function(t,e,n,r){return new Function(l(t,e),l(n,r))},arguments)},__wbg_new_with_byte_offset_and_length_54c7724ee3ec7d82:function(){return s(function(t,e,n){return new Uint8Array(t,e>>>0,n>>>0)},arguments)},__wbg_new_with_form_e4ca634e481666c7:function(){return a(function(t){return new FormData(t)},arguments)},__wbg_new_with_str_and_init_d95cbe11ce28e65e:function(){return a(function(t,e,n){return new Request(l(t,e),n)},arguments)},__wbg_new_with_str_sequence_and_options_9db076dc44ddbeb0:function(){return a(function(t,e){return new Blob(t,e)},arguments)},__wbg_new_with_u8_array_sequence_and_options_2c1900e5a5c93850:function(){return a(function(t,e){return new Blob(t,e)},arguments)},__wbg_next_6dbf2c0ac8cde20f:function(){return s(function(t){return t.next},arguments)},__wbg_next_71f2aa1cb3d1e37e:function(){return a(function(t){return t.next()},arguments)},__wbg_now_86c0d4ba3fa605b8:function(){return s(function(){return Date.now()},arguments)},__wbg_offsetX_fdc5eb20edabaadb:function(){return s(function(t){let e=t.offsetX;return o(e),e},arguments)},__wbg_offsetY_0a05e99022d21c5b:function(){return s(function(t){let e=t.offsetY;return o(e),e},arguments)},__wbg_open_221b279749ba2e4e:function(){return a(function(t,e,n,r,i){let f=t.open(l(e,n),l(r,i));return g(f)?0:m(f)},arguments)},__wbg_origin_ed66c06e67ad2049:function(){return a(function(t,e){let n=e.origin,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_ownerDocument_5a7a5473f8709b3e:function(){return s(function(t){let e=t.ownerDocument;return g(e)?0:m(e)},arguments)},__wbg_pageX_56e23ef1ade65aa7:function(){return s(function(t){let e=t.pageX;return o(e),e},arguments)},__wbg_pageX_9c5f057472795ea1:function(){return s(function(t){let e=t.pageX;return o(e),e},arguments)},__wbg_pageY_12d134258ad141c4:function(){return s(function(t){let e=t.pageY;return o(e),e},arguments)},__wbg_pageY_d421aa8cfce954d6:function(){return s(function(t){let e=t.pageY;return o(e),e},arguments)},__wbg_parentElement_5030754e30795652:function(){return s(function(t){let e=t.parentElement;return g(e)?0:m(e)},arguments)},__wbg_pathname_d27a358088ce7b2b:function(){return a(function(t,e){let n=e.pathname,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pointerId_ea33d2695be12e7f:function(){return s(function(t){let e=t.pointerId;return o(e),e},arguments)},__wbg_pointerType_d5e932608aa61bb6:function(){return s(function(t,e){let n=e.pointerType,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pressure_9a7845d9744ae9f4:function(){return s(function(t){return t.pressure},arguments)},__wbg_preventDefault_b64888c857500682:function(){return s(function(t){t.preventDefault()},arguments)},__wbg_propertyName_835d4a18e8327b10:function(){return s(function(t,e){let n=e.propertyName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_prototypesetcall_4770620bbe4688a0:function(){return s(function(t,e,n){Uint8Array.prototype.set.call(J(t,e),n)},arguments)},__wbg_pseudoElement_174adc902d41a1c1:function(){return s(function(t,e){let n=e.pseudoElement,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pseudoElement_6013088f8877903f:function(){return s(function(t,e){let n=e.pseudoElement,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pushState_3d01701623122bc8:function(){return a(function(t,e,n,r,i,f){t.pushState(e,l(n,r),i===0?void 0:l(i,f))},arguments)},__wbg_push_d2ae3af0c1217ae6:function(){return s(function(t,e){let n=t.push(e);return o(n),n},arguments)},__wbg_queueMicrotask_0ab5b2d2393e99b9:function(){return s(function(t){return t.queueMicrotask},arguments)},__wbg_queueMicrotask_6a09b7bc46549209:function(){return s(function(t){queueMicrotask(t)},arguments)},__wbg_radiusX_06f8dad66dfba7a4:function(){return s(function(t){let e=t.radiusX;return o(e),e},arguments)},__wbg_radiusY_0658ca1fd998f494:function(){return s(function(t){let e=t.radiusY;return o(e),e},arguments)},__wbg_readAsArrayBuffer_7db0a55c6c3a2b4e:function(){return a(function(t,e){t.readAsArrayBuffer(e)},arguments)},__wbg_readAsText_a8f6dfc210ba1a8e:function(){return a(function(t,e){t.readAsText(e)},arguments)},__wbg_reload_83ac0dd969ac6d23:function(){return a(function(t){t.reload()},arguments)},__wbg_removeAttribute_1e7d2c409776d836:function(){return a(function(t,e,n){t.removeAttribute(l(e,n))},arguments)},__wbg_removeEventListener_a3f23c70077bdcc1:function(){return a(function(t,e,n,r){t.removeEventListener(l(e,n),r)},arguments)},__wbg_removeItem_78e03a38da96e0ae:function(){return a(function(t,e,n){t.removeItem(l(e,n))},arguments)},__wbg_repeat_4e131e99bff9b9f4:function(){return s(function(t){let e=t.repeat;return b(e),e},arguments)},__wbg_replaceState_9a0a4a53d3bf3439:function(){return a(function(t,e,n,r,i,f){t.replaceState(e,l(n,r),i===0?void 0:l(i,f))},arguments)},__wbg_requestAnimationFrame_1a85deeab66448c2:function(){return a(function(t,e){let n=t.requestAnimationFrame(e);return o(n),n},arguments)},__wbg_resolve_2191a4dfe481c25b:function(){return s(function(t){return Promise.resolve(t)},arguments)},__wbg_respond_510e32df8aeb6817:function(){return a(function(t,e){t.respond(e>>>0)},arguments)},__wbg_result_53fd7283ffc3cdb8:function(){return a(function(t){return t.result},arguments)},__wbg_rootBounds_f45f30011740fdb2:function(){return s(function(t){let e=t.rootBounds;return g(e)?0:m(e)},arguments)},__wbg_rotationAngle_d0a0b686498034d7:function(){return s(function(t){return t.rotationAngle},arguments)},__wbg_run_9f0b5ec848bddc2d:function(){return s(function(t){t.run()},arguments)},__wbg_rustRecv_ce812a5965920185:function(){return s(function(t){return t.rustRecv()},arguments)},__wbg_rustSend_27a0ddfb6f0fa952:function(){return s(function(t,e){t.rustSend(e)},arguments)},__wbg_saveTemplate_4aa5c34bf8b14cc9:function(){return s(function(t,e,n,r){var i=zt(e,n).slice();c.__wbindgen_free(e,n*4,4),t.saveTemplate(i,r)},arguments)},__wbg_screenX_0a3f7a47942676bd:function(){return s(function(t){let e=t.screenX;return o(e),e},arguments)},__wbg_screenX_bd1fb25d48033c9c:function(){return s(function(t){let e=t.screenX;return o(e),e},arguments)},__wbg_screenY_30eadec06612b80f:function(){return s(function(t){let e=t.screenY;return o(e),e},arguments)},__wbg_screenY_7e467250657a3c56:function(){return s(function(t){let e=t.screenY;return o(e),e},arguments)},__wbg_scrollHeight_8cf19eb16ebc9b9b:function(){return s(function(t){let e=t.scrollHeight;return o(e),e},arguments)},__wbg_scrollIntoView_d8b806f471b7418e:function(){return s(function(t,e){t.scrollIntoView(e)},arguments)},__wbg_scrollLeft_5be50f489b342a09:function(){return s(function(t){let e=t.scrollLeft;return o(e),e},arguments)},__wbg_scrollTo_cac0dff19f631942:function(){return s(function(t,e,n){t.scrollTo(e,n)},arguments)},__wbg_scrollTop_b3effa9c5de14d21:function(){return s(function(t){let e=t.scrollTop;return o(e),e},arguments)},__wbg_scrollWidth_38006a7134cdfeff:function(){return s(function(t){let e=t.scrollWidth;return o(e),e},arguments)},__wbg_scrollX_9da7f7defce2297e:function(){return a(function(t){return t.scrollX},arguments)},__wbg_scrollY_b4c56e98c6d976ad:function(){return a(function(t){return t.scrollY},arguments)},__wbg_scroll_4a3297b235bee8de:function(){return s(function(t,e){t.scroll(e)},arguments)},__wbg_search_af2555aa41bd23cc:function(){return a(function(t,e){let n=e.search,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_setAttributeInner_11a30d36aa43287e:function(){return s(function(t,e,n,r,i,f){nt(t,l(e,n),r,i===0?void 0:l(i,f))},arguments)},__wbg_setAttribute_71039043be82d098:function(){return a(function(t,e,n,r,i){t.setAttribute(l(e,n),l(r,i))},arguments)},__wbg_setData_19a2f9f5b313cbd6:function(){return a(function(t,e,n,r,i){t.setData(l(e,n),l(r,i))},arguments)},__wbg_setInterval_84b64f01452a246e:function(){return a(function(t,e){return setInterval(t,e)},arguments)},__wbg_setItem_364a11cf21db9039:function(){return a(function(t,e,n,r,i){t.setItem(l(e,n),l(r,i))},arguments)},__wbg_setProperty_e4e51b1b1d681d15:function(){return a(function(t,e,n,r,i){t.setProperty(l(e,n),l(r,i))},arguments)},__wbg_setTimeout_3a808dd861dd3c12:function(){return s(function(t,e){return setTimeout(t,e)},arguments)},__wbg_setTimeout_ef24d2fc3ad97385:function(){return a(function(t,e){return setTimeout(t,e)},arguments)},__wbg_setTimeout_f757f00851f76c42:function(){return s(function(t,e){return setTimeout(t,e)},arguments)},__wbg_set_4d7dd76f3dae2926:function(){return s(function(t,e,n){t.set(J(e,n))},arguments)},__wbg_set_575dd786d51585f8:function(){return s(function(t,e,n){return t.set(e,n)},arguments)},__wbg_set_6be42768c690e380:function(){return s(function(t,e,n){t[e]=n},arguments)},__wbg_set_8a16b38e4805b298:function(){return s(function(t,e,n){t[e>>>0]=n},arguments)},__wbg_set_behavior_af2ac621388b739f:function(){return s(function(t,e){t.behavior=ut[e]},arguments)},__wbg_set_behavior_f9f984e684b645bc:function(){return s(function(t,e){t.behavior=ut[e]},arguments)},__wbg_set_block_8135b3acafa1ca88:function(){return s(function(t,e){t.block=it[e]},arguments)},__wbg_set_body_029f2d171e0a005f:function(){return s(function(t,e){t.body=e},arguments)},__wbg_set_cache_b4a740b195c051f4:function(){return s(function(t,e){t.cache=xt[e]},arguments)},__wbg_set_credentials_bb34a40189e3b43b:function(){return s(function(t,e){t.credentials=Tt[e]},arguments)},__wbg_set_dropEffect_ee044779833a313d:function(){return s(function(t,e,n){t.dropEffect=l(e,n)},arguments)},__wbg_set_effectAllowed_70e1a79093efb47f:function(){return s(function(t,e,n){t.effectAllowed=l(e,n)},arguments)},__wbg_set_headers_9c61d123c3ee1f10:function(){return s(function(t,e){t.headers=e},arguments)},__wbg_set_href_960e4284e5cae151:function(){return a(function(t,e,n){t.href=l(e,n)},arguments)},__wbg_set_inline_77b0fb4f96d76814:function(){return s(function(t,e){t.inline=it[e]},arguments)},__wbg_set_left_18508443258534ad:function(){return s(function(t,e){t.left=e},arguments)},__wbg_set_method_5532d59b92d76467:function(){return s(function(t,e,n){t.method=l(e,n)},arguments)},__wbg_set_mode_66c79886ad78fc05:function(){return s(function(t,e){t.mode=St[e]},arguments)},__wbg_set_onload_4dc1f96725e4138c:function(){return s(function(t,e){t.onload=e},arguments)},__wbg_set_scrollRestoration_29b3e9dc74898bc5:function(){return a(function(t,e){t.scrollRestoration=Nt[e]},arguments)},__wbg_set_search_6f7cde7f191dc1a1:function(){return a(function(t,e,n){t.search=l(e,n)},arguments)},__wbg_set_signal_c4ef8faddb4c1446:function(){return s(function(t,e){t.signal=e},arguments)},__wbg_set_textContent_54dcad83ae15772d:function(){return s(function(t,e,n){t.textContent=e===0?void 0:l(e,n)},arguments)},__wbg_set_top_29926a592a2d228a:function(){return s(function(t,e){t.top=e},arguments)},__wbg_set_type_8ce203e412e28cf6:function(){return s(function(t,e,n){t.type=l(e,n)},arguments)},__wbg_shiftKey_42866b295d317445:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_shiftKey_9bcb8bdd60c2f152:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_shiftKey_9f797da486b2ade8:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_signal_dad7cb35193abd31:function(){return s(function(t){return t.signal},arguments)},__wbg_size_6304a694765921a9:function(){return s(function(t){return t.size},arguments)},__wbg_state_edcc5b2da67f07f2:function(){return a(function(t){return t.state},arguments)},__wbg_static_accessor_GLOBAL_4ef717fb391d88b7:function(){return s(function(){let t=typeof global>"u"?null:global;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_GLOBAL_THIS_8d1badc68b5a74f4:function(){return s(function(){let t=typeof globalThis>"u"?null:globalThis;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_SELF_146583524fe1469b:function(){return s(function(){let t=typeof self>"u"?null:self;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_WINDOW_f2829a2234d7819e:function(){return s(function(){let t=typeof window>"u"?null:window;return g(t)?0:m(t)},arguments)},__wbg_status_c45b3b9b3033184a:function(){return s(function(t){let e=t.status;return o(e),e},arguments)},__wbg_stringify_b54333f60f1e4dad:function(){return a(function(t){return JSON.stringify(t)},arguments)},__wbg_style_6657aed849e5d757:function(){return s(function(t){return t.style},arguments)},__wbg_tagName_d99c8072027f3c98:function(){return s(function(t,e){let n=e.tagName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_tangentialPressure_979a239d3db31d90:function(){return s(function(t){return t.tangentialPressure},arguments)},__wbg_targetTouches_3e9bdb053b2d5023:function(){return s(function(t){return t.targetTouches},arguments)},__wbg_target_e759594a8d965ed7:function(){return s(function(t){let e=t.target;return g(e)?0:m(e)},arguments)},__wbg_textContent_37277f66248f39e6:function(){return s(function(t,e){let n=e.textContent;var r=g(n)?0:h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_text_d3a29f7525a132c3:function(){return a(function(t){return t.text()},arguments)},__wbg_then_16d107c451e9905d:function(){return s(function(t,e,n){return t.then(e,n)},arguments)},__wbg_then_6ec10ae38b3e92f7:function(){return s(function(t,e){return t.then(e)},arguments)},__wbg_tiltX_1327e8185e612854:function(){return s(function(t){let e=t.tiltX;return o(e),e},arguments)},__wbg_tiltY_b44744ee36b60a24:function(){return s(function(t){let e=t.tiltY;return o(e),e},arguments)},__wbg_time_2e33e99ff5e53342:function(){return s(function(t){return t.time},arguments)},__wbg_top_fe120acfa924a430:function(){return s(function(t){return t.top},arguments)},__wbg_touches_a631c50f1b367753:function(){return s(function(t){return t.touches},arguments)},__wbg_twist_6cc18194426f8a4f:function(){return s(function(t){let e=t.twist;return o(e),e},arguments)},__wbg_type_06f2150affb3c059:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_type_9d13c17ea2611dd0:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_type_c1987e7fbaf7340e:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_update_memory_ddf6b41a329aec73:function(){return s(function(t,e){t.update_memory(e)},arguments)},__wbg_url_abdb8fb08377f8c0:function(){return s(function(t,e){let n=e.url,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_1f687dfa7d6c3d08:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_a5d5488a9589444a:function(){return s(function(t){return t.value},arguments)},__wbg_value_c40f8f7227bb3a9e:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_d7621df0105931d8:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_view_21f1d4a4f175dfa9:function(){return s(function(t){let e=t.view;return g(e)?0:m(e)},arguments)},__wbg_weak_4a47d74ffa0a7f96:function(){return s(function(t){return t.weak()},arguments)},__wbg_width_16032a5bda5e6fa9:function(){return s(function(t){let e=t.width;return o(e),e},arguments)},__wbg_width_20c45c895834b83f:function(){return s(function(t){return t.width},arguments)},__wbg_width_219185400361db86:function(){return s(function(t){return t.width},arguments)},__wbg_x_71553b4e719d215a:function(){return s(function(t){return t.x},arguments)},__wbg_y_111b04aa46dc0f86:function(){return s(function(t){return t.y},arguments)},__wbindgen_cast_0000000000000001:function(){return s(function(t,e){return k(t,e,Et)},arguments)},__wbindgen_cast_0000000000000002:function(){return s(function(t,e){return k(t,e,yt)},arguments)},__wbindgen_cast_0000000000000003:function(){return s(function(t,e){return k(t,e,vt)},arguments)},__wbindgen_cast_0000000000000004:function(){return s(function(t,e){return Bt(t,e,kt)},arguments)},__wbindgen_cast_0000000000000005:function(){return s(function(t,e){return k(t,e,ht)},arguments)},__wbindgen_cast_0000000000000006:function(){return s(function(t,e){return k(t,e,wt)},arguments)},__wbindgen_cast_0000000000000007:function(){return s(function(t,e){return k(t,e,mt)},arguments)},__wbindgen_cast_0000000000000008:function(){return s(function(t,e){return k(t,e,pt)},arguments)},__wbindgen_cast_0000000000000009:function(){return s(function(t){return t},arguments)},__wbindgen_cast_000000000000000a:function(){return s(function(t){return t},arguments)},__wbindgen_cast_000000000000000b:function(){return s(function(t,e){return l(t,e)},arguments)},__wbindgen_cast_000000000000000c:function(){return s(function(t){return BigInt.asUintN(64,t)},arguments)},__wbindgen_init_externref_table:function(){let t=c.__wbindgen_externrefs,e=t.grow(4);t.set(0,void 0),t.set(e+0,void 0),t.set(e+1,null),t.set(e+2,!0),t.set(e+3,!1)}}}}function ht(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h790c723772977d15E(u,t)}function wt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h59cad6d2488dca29E(u,t)}function mt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h9761498151360b23E(u,t)}function pt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h8e4f100a6c778e58E(u,t)}function yt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h7dd8c6f9e9c12966E(u,t,e)}function vt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17hd9e6853fc436a5f1E(u,t,e)}function kt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_1_6invoke17h3dab76294ffea566E(u,t,e)}function Et(u,t,e){o(u),o(t);let n=c._ZN12wasm_bindgen7convert8closures1_6invoke17hceaf1cd31a005417E(u,t,e);if(n[1])throw Ft(n[0])}function It(u,t,e,n){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h04eb02ab906308ebE(u,t,e,n)}var At=["bytes"],xt=["default","no-store","reload","no-cache","force-cache","only-if-cached"],Tt=["omit","same-origin","include"],St=["same-origin","no-cors","cors","navigate"],ut=["auto","instant","smooth"],it=["start","center","end","nearest"],Nt=["auto","manual"],Rt=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingbytesource_free(u,1)),Ot=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingsink_free(u,1)),Ct=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingsource_free(u,1)),ct=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_jsowner_free(u,1));function m(u){let t=c.__externref_table_alloc();return c.__wbindgen_externrefs.set(t,u),t}function Lt(u){if(typeof u!="bigint")throw new Error(`expected a bigint argument, found ${typeof u}`)}function b(u){if(typeof u!="boolean")throw new Error(`expected a boolean argument, found ${typeof u}`)}function o(u){if(typeof u!="number")throw new Error(`expected a number argument, found ${typeof u}`)}var X=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbindgen_destroy_closure(u.a,u.b));function Q(u){let t=typeof u;if(t=="number"||t=="boolean"||u==null)return`${u}`;if(t=="string")return`"${u}"`;if(t=="symbol"){let r=u.description;return r==null?"Symbol":`Symbol(${r})`}if(t=="function"){let r=u.name;return typeof r=="string"&&r.length>0?`Function(${r})`:"Function"}if(Array.isArray(u)){let r=u.length,i="[";r>0&&(i+=Q(u[0]));for(let f=1;f1)n=e[1];else return toString.call(u);if(n=="Object")try{return"Object("+JSON.stringify(u)+")"}catch{return"Object"}return u instanceof Error?`${u.name}: ${u.message} +${u.stack}`:n}function zt(u,t){u=u>>>0;let e=_(),n=[];for(let r=u;r>>0,O().subarray(u/1,u/1+t)}var E=null;function _(){return(E===null||E.buffer.detached===!0||E.buffer.detached===void 0&&E.buffer!==c.memory.buffer)&&(E=new DataView(c.memory.buffer)),E}function l(u,t){return jt(u>>>0,t)}var R=null;function O(){return(R===null||R.byteLength===0)&&(R=new Uint8Array(c.memory.buffer)),R}function a(u,t){try{return u.apply(this,t)}catch(e){let n=m(e);c.__wbindgen_exn_store(n)}}function g(u){return u==null}function s(u,t){try{return u.apply(this,t)}catch(e){let n=(function(){try{return e instanceof Error?`${e.message} + +Stack: +${e.stack}`:e.toString()}catch{return""}})();throw console.error("wasm-bindgen: imported JS function that was not marked as `catch` threw an error:",n),e}}function Bt(u,t,e){let n={a:u,b:t,cnt:1},r=(...i)=>{n.cnt++;try{return e(n.a,n.b,...i)}finally{r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(c.__wbindgen_destroy_closure(n.a,n.b),n.a=0,X.unregister(n))},X.register(r,n,n),r}function k(u,t,e){let n={a:u,b:t,cnt:1},r=(...i)=>{n.cnt++;let f=n.a;n.a=0;try{return e(f,n.b,...i)}finally{n.a=f,r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(c.__wbindgen_destroy_closure(n.a,n.b),n.a=0,X.unregister(n))},X.register(r,n,n),r}function Mt(u,t){let e=t(u.length*4,4)>>>0;for(let n=0;n>>0;return O().subarray(p,p+w.length).set(w),d=w.length,p}let n=u.length,r=t(n,1)>>>0,i=O(),f=0;for(;f127)break;i[r+f]=w}if(f!==n){f!==0&&(u=u.slice(f)),r=e(r,n,n=f+u.length*3,1)>>>0;let w=O().subarray(r+f,r+n),p=C.encodeInto(u,w);if(p.read!==u.length)throw new Error("failed to pass whole string");f+=p.written,r=e(r,n,f,1)>>>0}return d=f,r}function Ft(u){let t=c.__wbindgen_externrefs.get(u);return c.__externref_table_dealloc(u),t}var P=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});P.decode();var Ut=2146435072,G=0;function jt(u,t){return G+=t,G>=Ut&&(P=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),P.decode(),G=t),P.decode(O().subarray(u,u+t))}var C=new TextEncoder;"encodeInto"in C||(C.encodeInto=function(u,t){let e=C.encode(u);return t.set(e),{read:u.length,written:e.length}});var d=0,Dt,Wt,c;function ot(u,t){return Wt=u,c=u.exports,Dt=t,E=null,R=null,c.__wbindgen_start(),c}async function Pt(u,t){if(typeof Response=="function"&&u instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(u,t)}catch(r){if(u.ok&&e(u.type)&&u.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}let n=await u.arrayBuffer();return await WebAssembly.instantiate(n,t)}else{let n=await WebAssembly.instantiate(u,t);return n instanceof WebAssembly.Instance?{instance:n,module:u}:n}function e(n){switch(n){case"basic":case"cors":case"default":return!0}return!1}}function at(u){if(c!==void 0)return c;u!==void 0&&(Object.getPrototypeOf(u)===Object.prototype?{module:u}=u:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));let t=tt();u instanceof WebAssembly.Module||(u=new WebAssembly.Module(u));let e=new WebAssembly.Instance(u,t);return ot(e,u)}async function _t(u){if(c!==void 0)return c;u!==void 0&&(Object.getPrototypeOf(u)===Object.prototype?{module_or_path:u}=u:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),u===void 0&&(u=new URL("web_bg.wasm",import.meta.url));let t=tt();(typeof u=="string"||typeof Request=="function"&&u instanceof Request||typeof URL=="function"&&u instanceof URL)&&(u=fetch(u));let{instance:e,module:n}=await Pt(await u,t);return ot(e,n)}globalThis.__wasm_split_main_initSync=at;_t({module_or_path:"/./assets/web_bg-dxhba4994a23785c69.wasm"}).then(u=>{globalThis.__dx_mainWasm=u,globalThis.__dx_mainInit=_t,globalThis.__dx_mainInitSync=at,globalThis.__dx___wbg_get_imports=tt,u.__wbindgen_start==null&&u.main()});export{K as IntoUnderlyingByteSource,q as IntoUnderlyingSink,H as IntoUnderlyingSource,L as JSOwner,c as __wasm,_t as default,at as initSync}; diff --git a/python/probing/bundled_web/public/assets/web-dxh2bd1b3fd6bc6d181.js.br b/python/probing/bundled_web/public/assets/web-dxh2bd1b3fd6bc6d181.js.br new file mode 100644 index 0000000000000000000000000000000000000000..4850962e17fd4bb461165b815aca31e8b964bf35 GIT binary patch literal 13351 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
    l%9#3% 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

    WP=bzgA7s670U~sEfchPZi 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

    9$d_bH~0YzV|Y} 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 z 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∾WZ*5aHcH~o0a-MAb(*j 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

    r?ACynUWv`rkM_k1P?*GGD7s4FocjOV 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

    Aar1-T5_1i*@5mEK3&>C0uq`fuaO-kCiF5 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

    BK5xK8&EAL;&R;Bl#er$Iu!} zf%3p2LndB*w&UyJrN*Y;Zi8PnR=jTmBiTWOwGAgxm-TG`_(Ix1vL(I^$rUFEBkwV7 zpc#Y4V_ndAPC?^Gjqh_08kd*i2&@rqM3OXtHz4dmW7FXcRQ$jECXY8B|8al=YLA^{ z65bFDPr@5u#*`7j@745p!{jm3;0=UbkW|8^lwjt^KM}maDQhy`DD8v@ZLe8q$9(tA z@dmqJ=bH5wIty>GQiV5!Cut+eI`GD`7~kg}IA)ADzV+jPMt4imj`*}&%8we~{}9lK zCaWlivm@962f-SpHrCktd}YG0p+exWIr35A301shb) z*^ZN<&Jm!@^%AeTSx9&J5;}7z2ThY)yetji@nZ`T%N8Vt^S|uJvo5*!Al4=KzCf%? z=D2|8!k`}_=2qO`wKoe*`FxNo`%jLwpp zqW4QAxrAvdG7QpEjCIc@jQbu~4(!3EI3O0>K-Oz~7K@@u+-s>undCo7tF77O?PD0N zOU%hE-{NczZKgm?gWU_C)i6GsJb`m%D4;}0@I)oFCvc;mz`4vMozH6A_d96<$)yRz z_vAB}z;{ec;8$W;2$gf7>W13tK_WF0Di3u0H?>g4mZNiKr)EB$2u$!;DNcF+Sy0Yl}0z1`S0{nYGS`jqZ}z(=Ya;=b_nwU< z(MCCX<-EG_?5s&F|4$l#?$lXsNQNDsZ%YRXk9c%mVgY*qUtT%@t%|!gW2fl6J4m=R zSvrtf)FkPEyxWyW?t9>!kALNnuifxSuvLdyL9u3UH^ zO)FakTO+g2Z>QO)Drzb~`d})6PieI%eWJ>CzO+(&oXFX(xHG3JRbAF1wG7?hjg+qH z2~$Uj9uVBx_=#}&uKvaY|2epPH_(xparyEgz;IVZy!g3%SJ+5Q=JM?+;=UJ0)lKmP zUI(v$vDsX7G?gc6VH88lp|lNs*j;eR{Xz0YM8r8V2Bjjxmq>{OCKy74&fRxscqYp+ z8ePoGBf*(xVDlJDL}l6zM@aEq>Za_y$<121;x@5v>O0r5Z`4O#x@}~CuzBPyZ{4zO z`;PIk@Eq_kNiYcq5t{!qtb=2kz?zFk7Y0FwA8IY+OT~h|5nr&GFH!lNyQ>AhK zi6LR~;ePFAIVmuyh#k+o2;qCEV<~~=h#yC&^%s@8FH#4A<~+>}W5l5GgP5nS@H-^c z1*|pN3cpLFPO>;CZU;)0Bem>|YgT0oCj+4xpMURd*_}tMJ`{keFDx?P@q>^7itmyEZ1_)02JDOD zO2L7hq|0xh>=zO8Je^Dcpr(A87y<=JBVzhLEDZOv$H{+fT0P5MGB#EMW3v^2$T{vA zSV4cWia=_Sv{VLxDj_yhc)tAy$Tl4(K`>UaHxy4$;$pE~D>BC0j|d(+K490f9y#i^ zO9k-GCb;$sZ!QXfO7+#6V9SU^7bM^8^9#a^kOa<9Uh!|39UvdTto{QbmU3vx?MyNf zYmG<4X>BK7H)EZH;zOX~x&2KSLv#2@>#v5&RZsY#P2(T_YLMKxn(n|_Wl4dUi>5(` z1B#rl5O<_8556Ld{1h$Au@k?iOqlL#%0 zR>&}p-Ykr;qPGwh2l}eJ1tYsLkWhYOphm54tvl)u)e72Rt#e11zlvERF=lOMoOiZH&vxA#rBY2Z>&eUTOB`y7 zMJ{mY)e6R?gl3_d+&7yj6b&(Kp@~zOA`akZ?^cpYBmgQ{U z>^V&#WnakOS>-EyRx|byb7pz2-b0(Dk%309=o0XycobkxVM9V3I#Nr`4-C1Tukpor zQ`wGUyb1@HNSf^8^g(&E+;G`J*Azkz6-8AoJQOD9`Q*q1rKba|p$97_3Y4VRmOvXv zOV-{)I1d-hzj!by(A#a>a>((dBnDb$O*tAQtx-aYmA28tM{^Pma!DyY4Kk1f zf`%9nFe=zoP@;lHLhhlJn!0j&m@6h)#D}P!>o6& z_1-Vf{drzMydrp%ibI7(!R0n)t7DHPa*WR$XzzPC#n@%k8Slr}#b%eWXR7H_OW?3z zwXrLWdqvFeiiy-C`yOqE3iiu(D(jAS9}{#J=oND!O+Mh)l0Z2?uq6S;xE$-de64yt zNufSZ0kY+Q#Am=YfwGjsRa=5goyI4zsY7^)h@zk|dtpFrGD&ySW>F5hp4GiVEW8*TU8jv31D0BjndF z1|0H(azH?BKW3Eq2-KxH3ZL|AXR{9AkwVIZZ~Db>L;bax(Zk4_Spr^!IL?7S2xy4(*NH5nCz5D$h*%F9 z>>5KHW#7Y`jp_#xVk(jnU9zhf6lo6b-FLCQqo?rF1jrovPE4x3gsvHZ&%J;N^Gx=0qR%R^BCNd2q$3Qf*8N!uo%W)k_GK@g1m_$ z;-w%m%p215|X=gDSAH(XzXUNY)Qbgv9ax_omm%mt2Gz|5Otf4?i%*C%5Fzz&_fv>cp?<)CvFTJuR`b2Z+> z8921C8hSVeH-)|}^rZR*-Kw|h+hQbPPaKse(qHxaBlibnrI3^8%#b&0)gU|=>IF}M zvoKuM6(LHUFvsX;Qm}AG(~+$*w)JsrWqj)WZMFgkvT9MkV)xp6F7BB*mCL~KM%3L9G3(|H~Y-wOEGR2@U(iHW%;54Oq#K)7?9jRy== z-~?d-BAcc#y0i2W|EEt4MZ_e3ZIcG7go`YJK=1m(x$P0}CE=!&V zt)RZhjZq!s^_BD<3j$pz24&9R2^1(LC4(On`KvHM@Y9T$xURNjf%zvZp$C~jWreh| ztzg>QH$8hB?d&`M5re6;*u%_Hn_KIX6m0h2YxC@9oLY7YYgzvlT4w(u8{*psHU!YF zX?L4Ww7Z4wYqz^KYY~=lKkW6hXPVmI%nh;Qz=rr$ZHQ-@+F$*K_>5%4LgqAubi(d= z#@qNzcPQm0P<&$`-9)${Smbal&k-IWd`H|*^q0 zUK#g`@wC1bTgg>C*I#UUJ-B#WW*UNsL9&@wB_mf`nmX(%E6kBDJXUZ4x|esH8G;Ti z$1_#kW^zpGs1b2%v{?;MnS>k`Bq1VDrE)@-`0%;DvfV|iBGOP&B1W4G3mZ3Gw4euB znl$@pPteSjUt7*syKtEpPlq zl$W`S7JWKAS;#BKJS-szR(T7>u2^cmxByEHH{f+F=)Jjcsrwz*FxV!@XB&uiV_E1L zRB;0_e>=!Gvq60jjVuwG;y}?ZW^3ehZ;RFxQ$3lo21^HFt+mjW7~g=%0M1g06EvpCO~U+Tk8=&Y zR&bTbWE4!5;%W?jm6?}Uh)! zBMc#41|Cu31`{{qYdhalaKdy>B4`s*1Yxu()HMv5F7am!HA6MiU{v|3FsQA8Xt)x2 zr^O(qys-tGFcjHK%6ziMeS6MGzbo{j2;>zEpZK1)8n@ii@ zzir#%%3sg6SUXOBkVbx6jARDD6ea{&kHP)_S7)`7WE)=MMKSaqaj1P=& z$Li+8uMeW3r4te{MSWy*n&DYZt_DQ?dl4R}Ztnoo*xmsTqNxseF9&2_NC(K~G(~D| z-Dw~wF0RBi=@d)cf$ijc7q!h6WvWY=5Y>T72(M8?f(Y(2u^>IeBo|K;C0Js)+d#nB zWnLY2nU}6T;D{(~2*q~`n z0Me_w0m7%#L~fZZtQ}Nnv}d{#XfsYdAvPSz{SFRi#Y~o~ws2T!)P+W8H9C>ef|omw z3qcC7<;&}5k1%WO>#52besij_spOLFj1d-7iJM{?_DBI#I09Pn_zZp^fMt!#TY&60 zJO^hP4H0r{<;Wo;wh?Ex>=MM%Ipz{4h9)E@bd3-xuU8iD9#s14#fEYf(zy2=Hh*tj z6&FD>4KdkzBC&6Fo3!=S$;Y<7SN#5;ns<=%{EQa>J)RQZkCQEr{3>iB$5>zvMTKue zXt7+NNpu=!S^|63;#}S?;Aa(5$b;AqE-hAmV2t9j4#{qkFCX6#%B04hT)bLZt#f ztdv3$oM7*?I=Zw#Yx1pH_VL$|-fkS?d6l@QTz1|1BnSuDPlQbq5!i4{rSk`_(Gk92 zgsAYiAgwAGP6-7puDD_cn=MBn6$j-(?vE{yfFZU+oLO6MG%zx&)zVi^ALs&6V9sH_ zlHd`)T?0zKMm(!V59Pom)|Vc^>|V)k+6a2Ccj_gBDBh$5ltaVoQo>&aN7`=;({h_X#kuhv!v%SjSn|4S&Eyr^i>R& zh$#UnQV>|--3fk9(JI0X7&H_5WjebhCh88XBYRk67zhE_pxv$B`ySYy#@)eCsN(cp zIdNKC;(Z+!|1BI;w`j8}EK?bux8#5R+0HCU8M zvR1?JQ4ZE_0*oyUF~!)Rb$fP{``vyvaMQECikOR-cC&4gax7kYMEtkD?K-tQCJWLv zg^W$yq&B2XPW!Xb*RwIJ%tQxQZL%Qs;vcbSD{69VfJ+l7+iR(Y%woHw=VMT6jE9Mv zSb3l^cB!>&7t$vYY}CY&G56kB^TZSgIPtKNT4edyM`%XM*rxURK+CtiVW4@p`fqW! zA)VD?55FW#<3VS&ZVWNPTFvGn&b!LF5ZP!lznljbgP9eTn953FR-tcf67h23jLSt1 zB0d2*=)JsQ58x@d&-Mo_e6jQD`*@w*F`Qj^G6;tIFS6TSH=c?YRj1%gS6ra5dPc%u zdO<5VlPF3x!A2QME+vmPUoy=0GZH>-MP}lo#9Cz3pyM|BT}J*MVTF{SaV#m#e6m8n z$GT{azk+T~zgrD+dBr$}q-KT?w8%`BGWy+8Si$KSSvq(6od_%5F#|V=)9-94v&=$b z$6`;E%JDT*Oh9c1x(`y;kq$Dyz0WK01NSzs%nG&ajeu|UU~dGx^}v94k3-+MMZm-G zBN4O<^#&1#i_yn|#C!l`L4qx)Z|^Do;54ZZ#NN~XK}@Eluvc6nL#SPm0rs<^7>3i7 zqljLt+%l--mF}bAmuh7}I4Sqev8hCMHNRoeb}*?Gg2dnxDvLXF)+PiF+0v2?(Q z>B;(J4tSg3`0@y+S{msmv(xj#dSifkuBQOZvuI8RrR~iv_vTcb2Jz7K2DyAEX>W?O z*(SZaThPeTC9z$T=sMf^I^K4J7Q)A^_kJ%buI5iRws?RwE#PZ7jhbfGNwOa+0nz1T zj4;f8S3uV62Y*9;Ga2c=t_dT8VUcY`m^<6qoXE^mw(dPjYiID_XtFkfU4a{_6O*y< zb&SRN*xv*d_;VbQq#rAivS=s#G=_a;zFc9 z2u=nqI^3aiGo#nci(YRP#3vmQi$!$Qyu?$W=2HckDX~BYht%}sXx!s{acjl z5fNQhhh9G~g83E^DsWF_O9Y@Sb*ka{umhb!g8Ag~4#W90!2$q+^aT#$jo*)oo&3q} zI%#0<(}54;A%g-vx}<#iteVu2(~cqhMvU|C+!5@e!&Va*GI?LKDe zGHpR#s05@0d^#ZvwD7wQU1`t!Wxbug6Z0MfGj1200%dwehSpre#CY~>B~H0Xj|_YA zx)hUG*g_k;SRTD?gTW=FOF~!Wi6PhEbW{3>b+;y8j2a^Z8N8^s+JpXwe8s~bVhJ92 zjR;PDJ=y%VNBd=k904mCJG*}nyo6ZVAn|K07E8r~>h3GSoSzv3 zP)DWVt1ONgB8@prEFX9Tol&DcGl~H6_t~wqokc_0(0{U~>QP!?Vy^wJoeLHH#3@<| zx@-6NK@CgLo;~oYwj#8RwDDuTin7Y&M#A(uOrmd@dm85~aPv2B_Nbv&$?Mz z-+C>0FII)wnK)4pz#@vTzWTAS&!A}e{U!bW>A_5m|Gr_u@7tQcnS5!5t_Z3^@&BxO z(NQvhq9ot}igWAP9TzbjOl>uL&m}P&0g+pEV;`Mmf@m~)@w{ldAfyG@Aln0PVnxCA zu(xEum+}PMCyP{C5@eimZ3MlT99C0!B;}rHm~^)I3C~3;g8)vXw^Bo-78bXDbc`ji z`+?s)Qr@2o2S|YMhpvu zP7wUI5(}m7N(-E+Llx7gf=~a!flwu~LY=86j?=+Ri?z(b0xAag&gUm;+Z{i&v5U|} zNRk$ln|;tQG^zjbPSA{ZLR~Nhk=q|Wpj)1FNTfE?a>vr)0t(;-nXjsZWhUrG{97A9 zT?(6sZy@8aB}ry*{GprWc$aYK$yJw!FNPJur!%9N3zqC9mL3Qm`1*I^7b`_=d0stz z06GH?LwByP>K#S!zdh}A(N~anHk$7LCLtrl@jx)$M25K5cybVjs2n10> zj;C{|Wdf*PpMA!vi#Q`AkT=?#w?4Yns78v2D=@_iXU}OH%dE`+H#eKd=sQ10=2`w?29KTheV!LX zqZOZG#-O|@Uerf>7<+t4T7iKZ8 z^fslB^!N8DeKcuGN&W=-T9hXv=x-PBlJO#^2LP15faGG4T_VCEHCRDDJEi;Y6nJTf z>#>b{;H%(!p?wzs)BrMAL;U!a>=)#_OfDg*AaD|nICM>e7;ZY{=KG4bRQ8P%^;O^M zjUFM}9+Ae(iDvrcj>ToWS1h81h>kO8`Prg8qt`}8A3GifOb1*w)>St zwK75g6qMpT4ZqLwPMxF&?C6sx&PkSddV|uZdhU%OH+Q~Qb3B-bct9Eql5>-+ z{E=BO-gVCr56DoN12M`G1MTQ_*)D^6Qia)3yY&Qq-=`;A>mHsyG5kg)C0~Z^`bJvL z3_C;mM$+<_$Tg8;I2GLfI>c8@Sw0YE(mGPCEma+|NwSQ0znsLjL^NNm`|Cjg5XgC5 zOZ2l>(okMZ3w|Z^g7%p{^WH-2j`NlzyBc{xvcd`Yc+4QH3g#>K( z@8hE-mEXzR?<9k^Z$AWsAvCwSXeRlTdo2V_vRRy_R;F1kY;t2Ty`%yyq|Kypjf1AP zq>e$C6BretBMxT?C{U0luYsFcNQ(BE!8dbElDVhd&KC4S>Tj!yChOrlplX6z=x8zG z&<``j2N?Y@+a+7Pn=87--VF;|SiYlWENbr%;0$SSgHXRfa>uIdE^wAYj|0W&fSih<9`jCLq!@V!+OehCjdnMJF037p*co2M;#MZ26aavAwN-Cx zOPfM%C90KMSLLUzc|K8|jDzUL)nSQ%=mfX0O8i4gx3E5S==f_`O_i!0&NZyk3;8vy z?A*Ow!wRJ$uGX$$C5&g@P1pkNE9V+kV;tx}g||F(4Qsc|d7Ia;LV62d#n~<48rJdo zP+w`vCeZ;|ksESs;(rl`U2G_>VdWu+PfQ_ZwgF1yv>=NUl|&vV=S3}ao6Dz(+R6Z& zu{uT|JOlf)eL3`MP~8%-IH-4!zPz)Gd{WbsfN$xP?(q@f1yUCo2C1fdd}P5i^5~~O z_|A22T6Ogoqt$vbH1hNJKl?vd1l;?6hdp> zbf(>cSnOW+BX(@IY2hIfHsVUTd)=9hj*%G4QBo`?uhzfY&YGn+C_UuwN8fa&1sjz& zDj@(E2vwxnC;vt$ZXae@#^l?Oq%XC>!y0FIjf5#_5E~j9aUX@968z)}dlz)~LPO)tW^?WV>Iu{DDL@ zogPIa-@4_Zdw=x)4L9w;Pm_2+S{%f|;(nm4RTVU`Krg>kQ#3u=_}OFUM9|7gzg_7F z`79@heJ}o&FTETQWJEB@=};6E58Z#~$2$~olDN&C>CJ^3dge!?Gphgo`K!Iw79nq39VUzWcqq z-0vd_>0;-ovYhzq3K-6WVIIUxX(Plq-zY>ir}|VxLn%lg85RN8(*S+yLHtS3Z{B%~ zi{5z0PSYPz7-S+{$MixurV`Us<_vk~vb<|*ap;-m_{?^tf~k$p=@{U1EJ0sRk$}`I zihz#2#~Dg>S=(qv)V8opqubl=4sG)eBMki^rM5}e(d?k1@U{szmUl19dzx*tpFx)? zREC5id6z8qWY2|Cq}3r<{?MVSCPClTvqpWHE#soqL^3Y%4v?w~`}qPWuhnbQed z-$vPSOrtuL(4XZ%Ng*i+-(ISDwr*hjM#@}Zki-c;fKaHD)THig?L`D>`qyV|BZ)>e zm`L{TzlEdOOdX6>6#2ylBGT_+@g!OhU~Y^ z&4N|7lnvgfSIR2$D@-ZRinyI5_ufNHvZjn&vWm_S*z2G9p6AlVfnvp)`3Q4cPBa zKCrPM2cgI46XsD0G2G}ZgGVvH%9Rs)P17YI0gKpaE66t1C-!`h$}(Uou#X6eav-dK zQDgnKB}gbDe`jw+8YObdHXaG$Kt!!EB&(NJr~$}VePQ+6s!x_f+BZzKChDdW)m+&& zP(-#*<_wCYWrreFrNaU(AdPp(pBB#2SY7Eh+X+9aD-{W1(7Sv#MmoX)$Xxo6kfG%lqEt(1K%8fjA z9rSi0V-7jfq$K4!8A}D0mf_I%3Xvq0>LRtkQqr{SWS%RE90@g5p}cb7B~_ffR1rwU zOq^sXNK|4^>K(3O#Ui_GpwB=p+i#+2WNJ1srEO&D6x!j*a^v7AzK1O(S&&=qQD7A2 z8%=!nv12(z>GWiYwxVH_Q$?{TlnlOKyd#CBjovXM)05FyFG&s|VAb1HjLi<6IRvuX z^+fV}qhLCu%*}dEdSN=MXZFGrfoPgfexZb$Y2FtEo<6_ZOW!tiSKC)x(B~e|q!b^r zFETM|dpp}&2j0qN|NdI>hT8EJ_Iq>Zr7XG>p>Ge0&{;-88xbYaR~wNB7fR~XHvKXU zv%x>v3Wz)zx$pX){B*>(vz=mE3hL!Y9m*jyWR|Nhxf$sr#XTI%q9I;TxHkH3DghO}J0mESvBBH0+JJl=}4ws(-xUqR=k(o^vDUY-Q z`uMdoMIb9giekTN>LvSO>a$|Qc@IX#^R3xpjndn{^DW(=itXG5!T)8K3){#u##HU! z_Mmk(#PEa-GJo$Iq&X{!$^*>s4Z>zAdr8w~{bM37ejqiI=**ZgzW7HB#O|2KN0Y~| zd5CcG|MF^~eQ12<919WKwxp#IJV!@F(*+F~W5kE=non#+a%o1z$Ux=81#~to6{T2ElKO5hT+K0;6`&TrzSFp*x}V zJI%^KwoBwz9MyW>)rz628$8Kv*);HdW%Eo_zlG^ohR*H(NY}9~Zp3+V_BA+lM<=_7 zB2I^SeD*bZfjmyiIn9VkyVSca0DLG6%vDPd!nzIU&_BIVUX#maNOsm&6)T*t&Rat6@udhfA5MBXnXItaQjVNlcI_T^nRd zu9nr_iQMjEW`u&$L{q#fwsXT#@o&23=$2PeqnwLPy@TKikt=b{e$My4>@%k)!%Rm4 z0CjUo>{D#xNNR*=r^rSXSQbz^yq3EJ2XsyjTuMj`%M*4Pv``# z&?QjR0L( zKoCw{N=Gc$08pmvhD3Mm(`C^_{39?zza(2IzOH)j_raKrbFr;#iCVQieGHds4F9Qp z3>vgm(LR9_JBt)*-<{Rz-`mR2DBhTD-H^(f4vQk>kf+@{gFklZhnMI!3eF{BCdG;2 zL7W&pVVOrEXE6mSDc*6htF~H~9`ymvP%@lq>);#|>5*4${joeB1kwb> zDso=C=LlP?ZlyZ;++%_z)N$0WccC$t=pYhWIAAkb%rFrTVk7>;JF7^tccMJdQoPY4HraWqb8_KR~W8I*wjJ)09C;)K;%VRlS8H~9F!#J&+MHear&=nV>db>@XlRX8 z@?zw4+}XtQbyN$go{0D#cp9~IZ{wlKTA}TB|#lA9pT@Fnrd!{ zz`6={C2r6ToVUGTzEqlE-DSvQ(Dza9(fdr44b-7lzL`6iwkK>yxN#F0>hZSm{R1j# z;}*lxw*hIRwgB5J8{KWcEZlbci`4^Yg}N0*yNAW=CfxS!=(J@h$kcW(17<675_DYU z(7{g>GZ++n>J$@nO1asScdw+I=qXHD)@x%mO_Qv#@k|i+luG?Xbr#CfHWa)fE=&); zN^2;orzS-+>GmwKb{31wI}_2ns)MP>n@*2|4Md`VSA`%^fDBcY6uB1u!VrT`6kIUW z5ms2>N`?g*4L|3r?EKOslbW)J4hc2R7XF~SF1)Mhk@k7V<&;V-C%sUYnl60n}i=tzY4q5){nVI&Y@=t~YcbbN84( z6gA*ip2KOXcSzrm&wh4#S#+qq=xlv<>mch!IKs099C6$*bV+kzuuvsK$*?I%q@%{q zI%6<8-wcF322Ck`qRmK?-qFm~86ICLAtsTO?5mEmlH zS?*BGJDk20Wr25tGSRerv*)nV_U=eIDOif2f~=AqIK@aV123OSw|CgtIwOSNomxWm(>lYgef3a(HrAluAKY6@dUYPo47aAr} zEN}=+(Z>uUE4eI2&)0AMyt-Mu{GKYh20N+;aXr&b@Or2;v&hncH+%#ffpA65o_*)P z_#IoaXyt720KDj6QKI7a+xphRzw?sPvezoNiYzidKk2ys$VyozzvYO-Fe(!RxL9Cb zHUs1FAe0)m7!Z30EnU|b5>ZkzRoNq-Xo5skdFzH%eiOi@ZnQ!BmokityR5Z;DTBGl zjv{-fww1uGdJ)zgO3+gD445IGv&6taUKOsdEA|T7M)b`Zyj10y1BKd^X`vrFnI7uU zNik@c_|&ryBxc4Ke8sivl%9(M!8Pe)pCQeutCZ>gvuun&^$}C zFi!8=UV-Y#!u@`%tep_^d*r6H3bR68jT<8)c}=s~La_sM_pYoWSU( zG=lQ}vNOh7bH)t*Xg81z5WDVw0xd$dR-IKmvD(2^aRRq8o@}3g}`OO zH9=Zvy3)e~ZJido9g+}DNg)58u+kfwVOJ-sh^RiDbO4soPQdVDa<+y`N?39I!5{A* zd8Z}fA#-Yj1Ui`W!K`M$j8S%8f$pmUDknSN$!7s;9Vu`iyDkoAh-0aR>L}UM+Ad zl9Q)-F+!HVoVTrEv_o=x8%h>6f|UhTi?$>nqea7}plzT<)Fj&!vwcax(mE$~AH3K$ z0{k#|9Ae$9%?2O);NjSX80-M)ATT0Bud?3WOFj*YcD&!?mD;VomV02MQE@*{%YZ6- z_+S9I)tDAl(i3U-BNkj+MyWhdqPxH=GZ;2|X^@A0n*V`i9U^N2B`isbQaz;lH4x2# z0Z;aI@v%#9qa6{exAoc)fATJ3hnS$eXY%BTR}7ZZDzd4j^bC#$eE_AJ-=$VaEpZ@q znyn*Dg(4ZN+1i9#T7kA~5p{4GSKEImjew$tWsT8ZZy@;>K~9DbzdF0`#{WDUZ(Eu z^KNH_izK^>am)HDHt-7DJ`Gad+@+zvj8L-U!IGvf4A9Ds<8IX&D6EHvK_q!sP{+ML zfott(a;;gLG{DiJI*l~I8nH^-nb`mj*a2aek`h|y(IaYID_S+?*<=FZ!h?q`m;C_O zbwKGeFkCm`?XAxm7OSM71zM1g{`AxA31(g|v@~C(|2F@6p*8x-`M2|eWhkC+C!lzr zy}(d_SB&MKkLU6ziZwjn9`23b@S3m@P>uY_7CR z#bX)i(3~rZRZU`2R-|eGSwGZz0^_MNyW}X{Vr4y`GIM=piKQPJ&)HM5r1L&gi4$S^ zz}5TgPy8!t?uvu@Dp5U&850XrTswLP_BO|m-i)oCVSr+1)8vl)my$oJ#gT}+nb9i! zszd}}v+{`8R~?kION+}6VqcG1ng~b-%}F;S;AIH&q9-Tw1Ww=F$#d6Lcd!IElGJpK za#!bWK8tMJj7V$DG*^%sQE{Vgc!nj}4H#kQNRG}AOg{l0m~c^1m(rY`s}6z;D|SAuSVtck`LFsWS{tZ3b;2F zdonIot1m92ViSU66kmx`V>N`5+Ej|V^v<)2C)J5Nv{wV)0ZKP9r51kexqMvrLf)js z6-r-mjGtQAfQ55XwyT(g`A&e68g>Gd6nqKj6MvPhq5f8-_vwvQniLN!eZ?^>$5682 zpzK4hJ%rN*&I0AmV>_rYUaj@5WeP`QG&D(LICkEeiK*#njOP30Qu6 zi6N@+61k@+0eT=m)NPrGEf+Guek(<$S)@Rmk`?<4*!hrYp{MB22?y5lcW5o&FCY2@ zoM=*-{23!5|H4-OSVOR@Wj&&;@!5N zo5=mV<7)v$3q{7!YBTSbV3{_}Hec)?Ci;@ZohXhr1qN*B{fbmR-MiwTj3!z#?~`XkBdHj8pDDuwGiI-=6i_DnE>h zWMx5eAGj8fipjUo+ojU2qD(LM51v~r}p z>M?%(05!2cjkK&m+;wPIQx|}K>2xG7qf8Kpf@lf0_i)$!EFyV*#l5$wk7L14FQ1UAN*Ft7nl5WhJlM6 z;3SGBhi|HP@6T$k-^*%Veqc3!OIB0lulOZ9n`ovl*vo2O@|&@mDQDA^N-z68JDWam zMf7h!n|HfrlEeCq&wk?_|9EnafY(#Sq5pBO;|t>x4k84B#GkP4sp?@qIAS9ZUV#=Cc@Wge;{sm3*vSMxJt=q z32M7h2`pA zsv|)_Co^oqfJ=hXA!0R4vIV9>=O6;h2tl+0>yTNM-^r`5COWq&6^@Y}N-^MB74TJ2 z<8W$`c*mOIBYa(M;Sc3bhE7G(Nor6rdhP2Bb0>tgwN8+IE{rgbSq(HL>xlDU{Q(yZ zz_J|{6Z#pdSwyIPCT^ezL{Sd1F+jH~DLO3>u$f`Q!x9rjFA%n?x8zt8OV+F`3q5QY zGa$n!%S4pO^+NkdQ*s_Cd?dT-l<6B}DpD_>Wac-qE=i7{)|sf{Qv3%K1_%L9?{qO8 z_Q6dDH8vu7S%B$jP)Cx=<$-PQxKmBb!<6PMI%_87BrDi2t;lvWLfTx3W0;d<*k~ik z%UlqSL|BS3Y3ubR*B8S1@B=NDzVwGLu(qaIwl8qE*lmR`@UzGjLK)axOu53BCHk@? zd|9k7i^G@ESf57S5^;KZmcE@8zHP8?8_I7?DIeFz;p=Amy1D$i$-ZtXzizRwTlBSv znL$P|W;w>0ms_FnPhm@7+fBfTx8w~%Ji?EM(&v6#IE z$V=qyR*}fECD_LHjzw#!9oR!0>~Ke=ncW9pNbNKKCkbml!Rc*i?@n*~^oo?W1a&;n zLUbm7h~AS=u0@3SXnQln8<~Ld7C|U9IH`nXnTdHChe7yCoF|gRUb#N=euS*!-s|O` zNoRwIiE+YPCMannHT=joPp@XwZ?K;=;>+J&sZcngR(&S%3Z4O*27GNBKGLoQ%rX0NdX@LLjh-*snSwPD^mLe2gxx59p4DL zODq(yIn@?G@sDT=6^m{F5S#)2BcQ+O(1Chu;Y)iw)mtzAl(?xpo(C@GaTq+1I#n-@ z5;s(5>TV;rj@hOl37iIy<^~X1Ch{=&C@GdVDTpQq2kq}E)n!&u_7KUojg0t8VLnv+HQiv`A^GL zocOekfu2lGen#;J9H?miRHnAC9w%I_Q|qXUjtrnx2iHMsos9{liR1)fT1-4}kRF;%8e0Gfov4UQh>1t1&Tmbb?J# zcB1mMoiKxo3FB{--PhQy|1_xai&tdt#o4Yu3F|NUxsE&a*!r)kKp2_{5@sl|4mkTX z+m4yBdh9k2N=<1b*-aO-W&}J+cfXmNoQp_?{v>^yaQmSvylb{rW25mRMp_%m*Ibj` z^$GzVk5;eNr-dR>_TAUAq@%4{W5GWbYtLb3%qKzIm|jU=?j)4@IAdw{(dS9&tRFyW z9bRH*(+YhZ9N;ZjqTH$&FKHX3#j3j5sn8$&PQq`3gK;ftlzm%zq$xOIKKLpRxW4uL zFLRf7_VJ78)t-Z9Y&r-wP;@2c7BOk1+iaG@))r8s97|1twt;#!B$L)5(hPQx2j`MO zY8%UhuJCqQsA~4TGkhT|<_0BuAn<(@-0ncH+Xg>zgkgMwv`i0kY=NhI(9DyMTGvHk zpz>vTl@zS5riDpm+f*a~%Yhlt#`Fx3WRhimO1{KTncM2}Hv?ATS;KbAUYqeQ1vVRcUq{|pUu28nt3hdeXxib)a%b?-nq@Zmh!x_L%sfN=EY=? zrme%C^xR|inyN!0AJLQQ6N=ap&`QwDQz3h>u0=>WmoWiP{GgU4AqGsy8%pLRbGa5qOAOH=aL4ufVf zb7!a+J4hZzla*(GMRtaDJoO8ZXD7^%m|lR=!Wold&v+@f@?x(l#5+BQ#bQ&lmt>!w z)3s25x{=?*f%I}1Ti_13=`^iOj}tQG}qS2NUAMx$uPT>ycJ4v}S)a?c>Q z6ouGGGnpJ?2o)YPJc<%JU%Z=gj*N&eoo`ap758(7zati?j7ouj0>Wk-WqAi(ZW`|H zqH-}H%)t~M%%zwWYJ?T;AqBdeJ1>&9S_gL$n*K7}`})pum7f)*?lk&E?^yT!vE7fa z{L|I?Jv6fZ!Sf%z^INOGd-XZ(p-c9hp;$=R>@_s5e!4|?kxMrLH@9C!$cg(F+hoj) zjGWdaH;K*?2U+gy!oRRF0xnT6<5*$AjTtp|)S{uZYrFtv!ngO^`pXF8xuBuv%CH^b z12qGtqt#dcuQ`#CCex!)r4==Y_q(qmO$;!lcPVZ0^$w+iL&sNewF*7QGhW$N!DUK^ z3NBLGWM}aogS2oTm4CZ~QWNH~0{33u6n! zUM&{^CWZ$7c)q9LkB8|NU=ifI6R-wo3YHSU++yr5-nwG2wct!LcyD7IRMAFeR*BGArMECZ`x?NY9DL?tmfAH zqINh_D0>rv+}t2n5`HGnPbuJ`JvdZZm)VV`3*&wjksHxu#UTY zlo})4*M7vV*)Gjh z#V{2NF#$uXU)bK8w1A3yyqZaE=5mB_7$K6xew*gkiRPB z;Uq&3sY%6C>9NKxk0dWYjegK%hFIdspZ+lH?i9$xDW%+{mCn=0s!j<@rLq@2Mhi}T)!Z&dO1{9yxt`m0lm zgA3fqr>aePsR*~ye>=6#jZ;IkfBnd=>ry8?KRu|F`m4qwDdyUKwKkFyoXJunX!7?J?yT8=5 zHxIU?Hnw(=jaPww#!invIKS{SR8^&$EV#gpgqqZgWOIGL*ap@O3=LDtA2C1tn64jy zV}6M9tf(!Vb?j$dKcI%PuT2*qA%lni51(^=&chE_T%bevA;O%W?yU($s2^P2o2@xf zyT^nrbY49K93UR-h7%B;Aq^~7hfQ|GNEizn#z7}Ouk!!M*5*zsVB5*B-T%c}7H@#p z7N-YjHe`Zb;!{!=k`Bd4%TvFN{M%s1*aN z*u>hLN7=P2?EKpq_uNFDZC2rnYBjlOXO;UmQO`i8?efr*49oV6peN7QfWEu=Sx^cd+)mL5v(LH&2Mm&{hpX_Y&nRm@ars7WX_-{0Ot za}B>9n-qNyq>6nsYKAK1 z5a`M|F~DBIjz7w^!&(AZSwNQue)piu*PGkrPWDKEE?)xB9Dptljo&UGv`Kk3+hxsfF?6{S2P9V@1&Y)N zGl)7^Os77P4uF7{t`H}+Txgqj7LywD71W5%tuB#`EY-rpmR%ipw+Z*jmUo*tEg1wh zM>>N<$rIW;1O-8U=uO5nF8};y{*&7COMo92(4Q0YFA~v+xKQ$5$R=@%!Ic;m63ReQ zD$IYxOp=<_j6pD0IwX4sg{6%o#@ysfnh-9BmC%`YQ{*fOTRJZiJ%WJsG=Gm^dA?Fc z^FVSa@6o!8Qt!AlH(B8C79O4~_I&f5;340MhbJd{zD0AAlQevIMS3eT*@)ZjpR|WK zklk5?HgdFIGjFp`B``ro#Ajc4wN0RjiM4-XbtThgllgy2$c;oOBWRy9NL)`}n~W=fI@gd?NwqKY6k{TjQRccU}Vn z(Hi%ZwlOMvq_}gQ?PKgqlQ@D2yka{6>$w`}K@2(+XDp*fg%Tkda>CIgJkGxKD+-!4XZK`>tRcud5-L>aDSRVk)yVvng?q#QjF%* zI8rW{30>P(cCFa1l*#9aRcAItl0LKaKJxK@b^IemcBo=NfZ@xzD87&>@p9@wj442I zUcFe!fRG*NMNLa$S{dU%d$M!SvA1+b9FtGW6-Q_=Q+!MrT(m?IaIUO?gm$)Ns@Ve< zprVpSR^y@|f0At7U#V!17p+qi_7ko-`;szC_QvL(O9{yHS^Q#_XYgR^htvWE_=Sc+ zKPruQs@-QDZat99XOR~b&&7^=vE=>>NK>hJFEWT(qwZl1Tc->x3wG0&VQA@_S+F)hmf8&5UVOQRE=@EZhtw;HU-v`<3BQ9i`}MTJ`elK z$Vv!g>Adrx_Z$&44G1c_Zwd_U=4QYH_Ra+-8;llfwI=o?ywzw(0`lOxbxr|el0Msv z8atP$Rt_};SoYANBoLWjyK*~C>qBH0a&hyDrkj;k0d8=z7U}K^ z|0!M{1uTE5zxc+*=&t@Sd*@&J6=62j0lLtq>B$1whFS`Urvt}H0t!kI5b%WR!|89; z`HSZuBljO`^%`WR8P&f0SE_1hG=<;y0%UHDjD!UBOaCxWgipV>Y6r1JBYL`;^ z?N|lZP-GupC$HdU>IV0tONPsT;)!t%_33rV70MSv$pexRQuQM+G+n$-UQYpZwx10S zJJ`V_S2|6aitLgKjU&Y=1Pelqs2fRQ$0S&b>og}W`JW<4q)`-f8US?a!7s^PsYjwZ zPP%@n(Y%lp^^@2_BI7O&IcDnVN`MLVA=={uaybOV-Nh8sMIen8;B|#kYfOZ`(`(G3 z8BzFAj-bqJpELpCdk~u0yo4!9TZ4&zRfECiuBxC`cKO^`JE%7}Ug*L^ttInjkqp;v zCpbktTlbnEVPaSx zcW#vf5W%FZQe3LmYN0h|FtnyMm#9Rop*U`}cK`U+$QN46o2~Ub))?QK4DhT6<$BE8lB@&e| zC(`r=cs^|)V%Z_8kS#xP90>v@M7C*zR!NwH^VSm#rdpLSfaVu9*t6G~#+ma&8hK3` z{g}c2%Y)8YTVXF35$eo>@vD)U3>s#RijP0SDt&}M`WjD+0r`O0W3g$#)7jdi2*hF1 zQy^aqI23rWV@`Mn4mU%^L_*;(SXIEE1d~t{B3=lGVY(USUF6fcVDQ z%7>Qk_YA;aWxz~Q8y7X4smfCp(tEpMz;+BDp)FHUpSpQwa6#%fc}B56A`#j?2C2h((-+;K9G9p`?Z9khfLyK6BO*p*Tc zpT#xj-x~3Y@n+wg)1>PbiK~H)g>lm8RKF60$?MT3MU@$dnHPau4UZS7PC=}uyd(oQ zKcp=-59OFXxEiafoIf>MPShTK7t;d!IYT4ZWgz2Mx;5Vai*1eVHlk;}H9q$XY>l#q zzs#+{cGT8*`+2{qTSF7IA6w(!(zJ%-T6{L@vAi^JGeoe;y!Hg`G4V6H(6G4gQ86W) zMz$s2JAvQq>++R>2ZQ!(-YG~Kcz~3}e(MwrRMTPTk62oAWDNfxgV*OA+nW@G8e3kx zd33a5G6tX$1YiRK7wu)P4gducMV{i|k^m_E@PEUcwgMR z1*{Z`K#c-o1pahsgcoLy$tOrsdsk3Eio{XIa< z>@)wD=7HYo3$4WCTQN)!T49>h4k#Ij-TBFn{8F>`K$+k zy1nNVPuMj#0sENvK?T5Egoo97w=s+An6%p654MR3+)NdQH_on@1qO*7nrj_pHqBg_ z=elSoUJMSfcxJt)2?G1|6J0AD7k%^QRH%nI4Jiv$b~o~k#4uR@mpVrvJEfrUu2j9 zi$8~7lC*k`Ey}U(1=$9oo%2efA5pIN==BpEB}spv{t8_az>lnX6Pi_0>{PzpmQOx9 zgeLTS_3TQ5VhRZ8;G4y%7LId^X|oN4-bw00r7nF4@^HtY@^H5y0*;U#MR~j-q}Pz%NLrJizg(j^E5wBaua9XzKUq#ew&nz2 z6e7zYo?|BjXD+7Pn@IUDQS#d*BD9eH6=b&PA{@gojrgg z#CrSjoHPl>*sAY>W6sjV|L9up{G61TB8Om~yfJi^y#_H;%qZfx0wZ>;hiv z570q7>)s3Y)<8_u8v{U7Bq>lcKm=$uAtd=pW3whdv9XIdIs~4|ZaI5E({7G6?fq2$ z%vy4y{H`l_fpi65md^0IGyJZH-*x@g5yfdhej_zHQEdAPeuoDa5A(=$v0w3|UgX6U zUoBr;ONu*Hx0ElMGxqG-1tin%$~snh__mqD3KMAiz+r=&;v56?%KpV8yD&#EE~t<6 zz-LNyH>p96DvuoEmB%!QR~{JW>oEm6Jdcb8^-sF$X(q1)cPLo@>R|9P*ww@2BXuLJL-@>%0+vFS%l z-~+NnRWFDu&Z6>Fw0d4W25`@#xUreZUb4}6c~9#lZu|f*>oupvZqe0#>CA3_L7tk8 z7-JX^M|zgI)f@YT$0Vo#^GPPI>{Lm4w0&w&6Vst#@YHdXHifpL5cRj%qK=sKz8Kqu z(&1ZCarF<-W7q|dW;14dI7KQ`L$Bmv)+=FHFGDd2S)VAQzFdKwjVQ99FELkPMCD}f z`DAJSNsffIC`r4k9mY~dm_+UP#D{8U0C2fvIT_-`LwA4heYG=A?^O_qq^HdG*xh$M zVA&8cLGeY!gAsWW7AG+$L!s11|NX+N-g42EA9)aW_j-}=1#ga6Umm#s%a7jv`7dsM z1OzOE)JTMFA9QR>EM~ISb#!BO;IaGfdLvC)D-WxcsHj>7|NP^-FTScn9dl^({gYv+4G`R+&E`HQ;31RjXXS^)y$l;%B*+t5z92P6|!> zqupAq&3^>}K+8#CHeF*fXSJ?c#e#C8|4O)N)uu!@t$rt1ID;3e&;vN^YdNq6g~_t{ zWx@mVM{0`6Ye+y77?tgpLa_{Htlr-+?@#QsA&Rw+@lI557RdOQ$hVGYjRmrg;+{($ zkFt+mApZjD>Ictw-2wn|?@pHyU%hQ3B0yf&0L4X6916cKD%kzVg~HgW%7BZQgFLEe z=IvLDnUANHfJ8(n|K-^kjChDlq#1 zSrq^ckDeDDt(3{;XL&y4ci?W7$b)N~leL*$f95#3D3E*5&l(fi7DbvmO~Q-&H%C6FpV?B z7Sn_U%!TD*=oF?~x@lb{;mAmJ!N-W#bd_M<{X%4Qv9#}6cwHFM#f4E*UD(VdihH!V zMC}2^li22glmR6vf}?j|)TO?J0i+Co|H}b%_yD+QitX8<0kHoRJ3&Jrwz+q#5n6`! zk!!7WnmS>2S$fTbSuAr*&@S~i??!2v36LKTVn3D zQ{)j&f)VK9N>0~3n3qKKeKZP4PTkw7d}$mJ@e`^xKJcZHkc}dsl-r1;0*aH0OIJS zF`z;rSUF?FXhmSfvGL%?ma?u|%11#*VXJIpT?60(cvC`3QZV>!TT0v%bcp1fz()LO z<;K**LwJ~nadcoA;AVICHEEIn$TbUMbeR^RMn=q}%8kn=TA^q=B(xM8qbnB8*}FqY zcR6P%`Bt0SCYOWtv1zPXF|JWlF%W?2U~YAPVgsOOF!MP5Bv8xQ{szyiv%v)LZX?n0 zQyZPf13l~fEo1z5L$rOaltleXow zN3AE!x2yr^VMR(fe(f0m_dS&)KBumLs-sPb+>J<{N+V3cTXDfW%=iK5tF3~Qgmj*| zxRb0H&NyAX&3?KWq%zHgZsH;SoCk7dJ!TDb*%ESi))10{|2$5+T}B!gYmgaDFrvKA znOGgSOUISiY3*IQXNjGy5*x>rc+5&{+_S`EoG{@B!wjWqroTZw#US~c-6-KPc_e|0 z4RT*7lT(7Q2qD!B8|A6=cWgx?0)$S5wmQtiStgx1zn~ZTd4NL4pbi!)IXzL>uKAw4 z4Ppe?uMAtsAf!MB#q3(_Z|~vl5>M_RDJ-KL_erQ|>7is7?+wxLekb+GoJbWu$@|SA z|6}Ce6l-2L#~gfiyhgV<_ER9rMLF3TlF$4=HaW_hx0x~^0?19SB_V~Z50ac$gUU9D zcc#gx1&#PUAq$ zEbPKVPNe+wo6-;$diae*0y7a5R!nYd%!Br-3DYTu;2{}K06d%wi}%tt0|Gnj^g8k8 z+J|#=SwwC=PusTz-nRvzZ}Zhr_QwA94SUD3Z+?H^xW3`A$eC>Kn*ls_G+-~g^tBS@ zq_UCf{;1+Yr6JsMWiV2u3^^@cxwJSDi0;4bUDB7JIWnRezP(^ODg2U5r@&;#FO^+Y zB65=#a-ajtn9}O`XqN$+Y|ZL2?{sJ(Lr21tPd-Lc!}Pj=juG%LaGotD{2{>2D_tiW z+K}nh-6YDvg1pt@g~!4K(A%zKrvkKu3=|-lrt%dC&sKG#u z#@AHR60xpqFQL`{Ic6#6o~Hhpi8yP^6oF*L+(}8qS$!;M)7A&mOSaE6ollvlqgC5_ zg0C6sf5qe!SU9n4B~n%JDt2^*Nl$fnMrw(JG*XLUcvMCEzq~RtBHjW5yh5v6Id-a6 zxG#w#EO^&Eg;B_VX5rv$UYtF73I~Jj0hHt*nVF3Dj2;eRBYK4Q2#l^CRts(^jrlZW z5vSc56F6ngl&V9L5?0l$Zgd5qa%Oi=7C$v8RLe{XWef(-u4Og3uu!zH>PSkuB|%3;9&Bp_H?U`t)|B)1 zRIEcK`cp*l%;*rIXOYN2tHa`c&@)>E3RxUEDWhqpcnU(XCxKyQgXL~{FQziizDGO_ zsvl&*<$VwHJYCmgV*U&#%3#Gs+e=&!dOS5n?hCwQOR6Ev)Qy_XJq2w#M2frXkX})% z6mUaoLY})kbc<;ffj&Y_L4yHJD9e!75NFdtAdAHhNEAPyw~QZ<%C~VANV$<~DQo!?*+qc9;}49!tnP(-X;M_`{KBoybkx0NO*iAR=Gan5YU~8eA1+ z&G|8P`2ooM8wi=7y!NqYgv_^z$+b=3C?28KGQWF~ZD+wQ#1(?BQe$h_*pk3V8pXz_ z37yu*#Np{!nQYhuReXqxqfTQF*Na0>6M;?Qn|9p0(C*}&r-ztWltI^EWjghNf(Zpr zm!SzocEzsT;s)g9ZABFCO((f5lBx*D;-KZwM7tu2my%5(1nQ|Fa z1WR^h;EhnRiVZ44OoCORZ?fo!Rg3kMLr4~9w`F!*75q&Hv=JC5uodD25kz*Xb+}=7 zqwY_oabHVUNq3zq1*ZNX6^FA=981Qg6D$T?;>w!fuceVr+o<5#QTsp{erG?kfG|A+W-@}Nv=mgM(xVi6t%G{QPE?qaPK7fh z0xTv`Ik%s&aC*6{F=;8&*$JJ>dxku1pigB5=PP-i^p=zIzGbxTBp?C=`o|o1A_cnb z4lcp^>A}D_2FW%w&KjcT4{hK~(O~F{aIdW_wTG$BCDft0Mjw=dkgB!SVQp#cCOKf% z+A(S)k=|HwzoasRMuN-|+DJUP)~eXFgYJCk&zMqR^I{2nDLRy#WMmZ7$F>Jih@N+p zbqXX0+xFXTk-f?1N(T4L^#q4?Ncv zo(*b3lSJ7^$pdm(OgE5i>gZTMvn>ZR=^=v$q=06ltCHNqZx)aJ>u15e3uwJ+cO@Rp zyYIYxjCXLG#WxY;7*i>88oxf#qHoC>HP9}yXH`-WH<3n)x>}wmLU@bqy)IikmG4Yi z_U?o2@DOTK7+M6s2WqoufU#9V9FARw_e%TsGpl&Hg=gNxks*x&FN&Z*97(sx1Hv{*G@FS*%#2Q&7cDNfe&VxH@qF)dv0FcE zjc6;k!u<;37d6K?acu_V62lnSlke2gPKW9TFJ2Z$kF0 zl|6*oEwg)EoC(?cTiNmRYwwH)-a>~)T z+@?ABaWb27@UvRkU1rnFK2Ba^*`qdTo41FpM^oB%-fLwKkQ_j^zXD{t>)lvC{`!#Z z0eb0|PcL14>)i*Ia2RO++e`9pe$Q8bolE#gnsm5rt<0%njA<-JT~s`|16uYIuNJf? z#Jl)UG(M1NVqlC?ebbqCDN?a}-H#$X6`pu0S3N-to8h$Z9l9XNk+8cUs@0p$M4$xc zM7*g-P89iO=`Bh_ngtz*KJQ+4W&`@J9|oX460g84cioxB&>0me>a+f$Mj|I8RyhG1 z!R%!>a9x13XajY_N>yWjOwk~bZ@RpZEJM31DxIsCipeMyWdH|W7Uwq11L+L1e(5Wr z5yYF!;sHS{v6GCAJ=T1E&->2xU3H4M1$T;hl6Eya_hi+}G&C^LGL(ruTdJmL0}@;l z1k;wznZ@{q-&3=cP>( zw();p76IQzDrp|6XaGr!6gL(uBInvR7$!iszJmrprGJjjQn6hdDWbWe3!V)D7}Ahp z^t@FkdeS#sx@lW<#xnfK3SG#0)@lAg?DKT>(4VwOPg@3(NeXy{n9S8iTGZ$F zrrrX$4~?iBJt3XhM>BFoONBe}fL6b1!7QrQEKu8{Ux@D{zf%u(TwN{->Obb7?6N8y zH*~X^F)xNPi;A~r0huvt%fPgR$0$5tFqjYNFmgfW8nLfAXp+e$^hHLnD7!R|)C5%^ zRS7RlbZc@y^|HeCw3P#h@mIi5uG)YE{?~UT-x*>HZO3W}T_Xj%yl#* z5iaiz#gQ)WA}QT3e<2X}5+V271TrZ$Fbf_b_XB&zu;k;@MabPEEA95$`DGnK$fgwi z*&{;k2AdiCypiNW&#Ab%zpeT z5TCwXno*RWVUJuj{daDUyhS_1_Q($eQGAd5%x1>JWdEMQkq5``k;k9)9=Y$2e&_bc zElh&%k@Eyme2-lD`-^LKjNc=dJ!@QZ^Y7js*(xf;;K&0lIP#U>UtIIh_&u`PW@22B z&8}4}Q9Hly8lO&qNk)um? z41S@kd@x9fU_``9%3VSvz0{AMrS_$tS`^pPT>a3lSIwWu-ep@(Y<@&=Xdl_C?Kv)A zBx?>MPw}J3J5^<(J_fz}sWion=#aM|5XCHoo>IU0qjB82fk2vr*^mF){i~3VVkYla zfe1oXlJQuI2zNb7alyEpOz^_Qx9Yurt>!GfO=&uz_xC8x=*w=*ghp?3x@i#>9TQ>EiUGX87Z#+`W0ZYS1T}Kw-k=sz}pESln>AYTiK{2x)se zMl}0lezj`HgsW9uLQ#yCm#HG4&}d|EiQF4sMLx-GM{?vIDF0cB2>BSV>g)^0hR|z# z2ooclDSCz;K#v|o2e$C2j8%b@1x#40ZW)OXQKY!!o^4TaP|nI`_p~Bov=66!5E{`_ z{5NT(Uz=JEiKfT(gg!AWyT6na|6%x{frN44j=b?KFXL|7R=Uki+kO+cMb6sV?HY8k z<0spq>|>_zpVf%6)&JLKg9#Wk9|*=cyJ02*tP|6vshUd|HASFnyGJ%37ny@RE`Wbj zUQlK}za4#xv#Gjo2QCncu;lEUvRlzT$Uml5%9ixhE49#qVIp|ua1bY%)weH`tGOx>hMUrm~~UQIp%JP|H{~3 zm=sBBVhvWkcYAMeNKIRVd3%G%SBhxg4XP9k4tj&Rnlk41WNoFB!mt_@^gW`ic7E!s z%=S>S1Oq&ah*_+nFp;Y5xhOmrs1j${_4!DeFxMrE(9AbCUlK!;v3$n5WB%+>_fj^1 zR6GnvT5O|5mI75-9~+X{?q)6x*7|nj$8-CBCjp_JHy_>RNI%Iv4_) zVn=Z#)n0B<8{<4$R`i_W*W&s5%Q&Up;Kcrg8xhJ;8$>|pAz5s5FR^*0k%x&+mm?gb zgIpC1j!05!rtTQ|SnSuCM(!%90QVR;;!uP@g; zni;s{DrzMA=7|o&DF!sKs9rhZ2lFfBg|=e94rC$-ef1sqzA|>DuT@%34Ww^SI-|mH zez7wbcw!ZsfE($HnjZF6E%q_OLGKyw>6uEXU_JB<0L?^Tf~O`8#mH-!c~kTQ=BS*$ zQc~N&OfqFGgH1FL9MeSyEEtH&{E(fb{a~lK9gts};w@K`Kg<}bYw@cDp)vQ#z?gO1HGgm+pE;c?8kLd!!WE5< z)kL8qhwjBpM|v;JE2|r+e;j!#UTvl7DpjXkb+zVyWb%d0JS)^hhbpjG2~@zRyjIrU zYO+}_ua+NMC7TVmmsF!_%X*}qfty!QyP79W8!00oxw?Bz^HPe^4Tj^T8;H#=i@XbR?SwHgDpj|0EX1pB-rUgq=0aP{;<6Sjj;g)WU1SQ#6yFfdI0w+KYmlxT&3k$FL49RXT?`Nb=d>~jaxarq zM=ip@M6*!Wv&;Su$9p59e*Bj>!3jV++h(!YfLM@T_3Rco0=Z+%Cv;(6Rp&N$pd1xX zVG@jCsm?7ct)0LCnry%L2?0M4w8Rt zbezvoF-J5&kcCn-xo9I9c`9AW|1v>jBNXeerChP|zlO4{GW71Cff^e^$*M!CZ@{Cv`}y(x1*o;Bs?AFKA7u4sS?5p=2+xBdhAD5&=H z&cea(x;1-NIq5ISr%Hlb6w4us8VGE$w9VP&M`>IaN|mX06-ZVE5$0^+Y;)!lAWGEG znXw~-fgPEi%#d8(-p!U+o)mtbvRmc}(WQq>$$4;RxE@F2LBV4fKOG+P2h3tw%c0YQ zox9rRg7SnDUd;)Au|Oy0u=qwO|3xHyi!SsImW-EN?f{e7WzSWe)=^ATIQ0p8Pi%%c zT3JU)A=Ot$IaOfOeRR}&WBcBQbgIskhKYwBw3DS4>&9_QoiHcCJxhl#=YghS8V{rY z=)2K>8XOHq9@RvQk!F{Zn>~RpQc#JXO7w`{2kEFBQxW(p{bG5=#@qDRXg_+4ma*Fo zS$W}U7o}h+icN3%|Ji#NK)b5y-g`av-e;dzvVyS8qmL5zqR5G57Ss8NFg28d zaL;q=FJ1Vfg_oT!_Ea=!B=m_ldFLV`d*q8xgY|==<%=Ph{`#~zph;D)@o7^s}}9606Dzsn>W< zJ=P4S6v}UmmByr8Q4bLA6lkz|mY$0E6g@3$E18#7ptVkUzmzp4t(jh%ji&8$MKwco zz2gUWeCoZ&HD<=<>9o9ZoW8D7o8z-~ zEI+V}Fabz&F2AM=JVhsmV_NZkSUhJBScP*$W_?nWl=c5$F~EFk_>kI1PmT^%+vB4t zlOt--Y>zuQ`eV;KY;sf;h+4&_%DDDuJrP^^Q4(S+q@d-Od#i}p`Zf<=;rVeh-y*rj z7Rfa!h@}Flek4s3*54wxO|rnfnwo^EGLu+%wQn6}>Lr#{3#s@lIUTI~+IJM@+=i5j zUoWezUD6}59M={{QAKnEb zMtH~7Ycc*r_`P&iLf^$;NmQfOSnYcruBH~woTr3$G0d}8$YRXdZQV=)HMx2sOeXB1 zq&9;x+auz@G=A7n0UTGQs}D3(wr0Eque5BH;(kdbR;d~`##YU2S8Z@>Z>d%*GD!>m zn?j>+`2E*tw3IV1PNUb$g3&g({NwzeaA35n$TfsX(e_J1Af6WsD02X@jAH)0%dtiM zliXWUEBW@V9FSsc&!6o+8LWST1ZHO)Krn1XaJ4&J{XaaotJPa+LyV(l^+VQb<9(j+?fhO zp`WtI16y5k4SEnTFyxYOj0iRM`)Q{Z)Fn-f_!T3#|1>-k;6^!4ulAP`JK1wnezilJAJH~ItVtN^eP%f;s1<|)oLIY*q zrv8G{>qc)N`eD%OiyFP%&s{IYYU*{PwC^mgw+F7d+`Sb9B6 z(VrcR-d5X;*lXF4&G3@44E&EWdK*rKmp`@xY(V^y>?eYVT&c%(xZ<$!qZZg$*#a9Y zT3}fA=L$9gm@ubsYqrP`^Q9pxIymnLDFqSB_#VA?!zL2W$!pBMS&(q>5IeQVCP8ke2P<@^K*hjg ziKnNL?OjxNva7}$Xf$iC14IA~`Vv5c4o-3)cuCM;7G`@#9r+U8dC{6R?CuV2Op4BA6b#EA-yub;#y`u?wVepTJ>2fblumyg6Xp7Oa?F zMM&d;cBHX+N6VC#KpL0)79)*|1JY<(QybFwq9DSM#ZcV*9 zq*s#f$i%Iwg*5oGK~Nk!+Lrf?VM%>8=!n2^rsWEi%=TO%m?qK?dJs-#zc_-jBa{`& z^@v=ylg*mi5e(Ri+g9uwu=mFBIlFa3NU~kmkt{ZwHFa};r{<7uxG1~tO%zyWs709L z=eA4QFb6L!)-VlmS8p5U_}ae#b1Y-f(|zYJCmD#!3X*}Syuz5n?WlJ_Qr3vwFzC2g zDaRZ?Xu%u~1y#u8na>4j- z9Z7jk$ihg<7nE|q*w(^pYz=!(dwO$73ov|JI$-PteCWOHB;~$6CMh@nfgs?wlMh{9 zs@p!TsVfA9ngM3i6cTDU-qPVWdE+K0!{{EA*>5P5yaAmGa*2TCzv2mawMyypk^+lr@_aYdj89(-yLsx<@MGM2GUSjzeXf4CZjILZ>4?I&>YYg$7g3qM(9z6sn0sK+m zTU2b^%Y*`r17L3}4+6Kx(5c7%;eEfsWq6C)f`B;TVS*ke@PO9N`fKqLRA&g|gK_}7 zT{=M)R+9WtNMzbp9xpv=frsxhYYglfWSA(s9jth?@mW9=j%3!ihX8|`h|wv)P@T38 zTHonzV#4RJMFKMNX1MtgsX`V^o)9$S@f!uzPU#4ldd8jXXW76AWCuza~9gjBD1gx-v zZBV4@=)J>W9fm^iqE^@eY*d{sI)@8bwD1SDl!m>-iuwL$Nt1pL>AjP+3o>q4=K50E z@`WXBTgaJOT-yumW`RoCdH@KvtryCrTCAmH(NNGS#iC`NV$s+P$}@xq$MmdfdSc}U{~)pP^=)cI2!vQU9!qk+3;J*P9#?@3z zn;cD23jOcF(UfFR|B3;1!y2WpoOp1ek&cfh>fFmx2ThK!>CvkkyGQ8RXr8XP;U`e0 z%qgVdXKZZ6DX=c%lQE)@q@W6%t6)P$3&Cf>$QoleuA*+1rt!cwEc@xvlauM5UamAs zG3BpN8vU1AIF9~fJc9_Ur(=0yT4wV!%?KzoqE0|*qJ@AqZ1E}DbXYJsBV4sJkbUc% zn82P5cLTG2v%H5xKPp*616;|r_9!{61bE9q9wNQJ5%z_W*|ghkl3ZMh;t`=iUO{J5D= z*R9&2DTYhLxsyFB6VTTkKA=P%!kG7;UbOD8(Hm9adxIX@=6|Zc=VJ zwNU-qI-5i$;^HoC&yA$Lq%GM-qdY2fiwe=t4Jz;}+bNileqp2WfTXCrY!P2QDROlS z?UdrET+#rRU%fHPK76)-c-s32b#H1I?_(Eu$zH#*~v$)REP;E#Y zND#J^Qg-)Ul09vwpg^?tbuB5*lJAH(0K!EHZ(vKW9~pIH6)yOyWLy6qZ!MyJYW`EI zu_&GBZXudeR$!6p(cZA#$XgQlS_Rh;kel9{NC1|_n9mpyp_w_N$cETviy~VJsxErK zTUfSGC0ywD$;y6ss*ZZS6*t&rKR^JzgD{ta#ru6saeWkg;CTQ`k$U_qj;1%$hV$gz zcZ*&_6NDSeby(4KX4;}cMj4~zd7LP!@vh3pR^Xqp>m_3hN5MEDi0TP2*>M6)pxAb> z;9Qm21HM`!)(9J8l#-nSIisucvgKv)oDW$%wZi56p#Lrxmo{@+E2sx zSu*PWmo)9hDkIf>dO^ri9WpQHCs2HGK?s@K29F%8SlVn3;muC{ zj0TJHll7VO)YHdy)J&vi^cAx$4#HO@9kfB~8oCj7651CDDJO#gXB+>mbm@pbZba=m z05*1H-X#IAH}BDB8AzBdj>w#6hoJdP@)3ui3nl3E)JTeek%y#`f_q)k>4p!M!i;N{ z4F^apHnSNng19C)ADV3o-4JAfKm~+`Pf4*#J<2l$#ApBw;(gg#b78Uc7nGJC4*9E; zrgwE706|N2($R)8K)of)#Ca592*`Frg^H;(TZ^s(6a3*V?kh~224J9KXTri=eJn9s zfwj^FrwWTM9#61JPhG%j^-b9l_A~b;minWiEL-?jwenCjIRgIl1F#B5>&7nQF!(`4 z0EuchC4)MrU*OjoU=)!3T)dH4KWnk)PmH3X&lioG+~#I$ULU^Tl3Hdne4tqG$zW== z`A4vkGv+F)b9qze!ae^gi*;QHJ;0ZGy=w@!Bs#A((Yn4 zC5!csT@PO43K{i*xszaQs}L3UeDymls;Dvx2<-{dv%#X}Azn@AEt9*PV>}7UBv+8k zJ-L$PfGl+w9lN2<&o0oNZL%PM2fg=Q^q!^a=iBb{1BDkS?^bp)FPAiE+t4FgZ~5b7 zP{2I11_q@Ye!B}1zS~2VM~#r>^b){yAf#uOVl-otL7WEvjUmft(uYRKayq&5kmcH_ zFbvuc9_ApC*>NW!%Mnu=A6A{)VXr)J`>pkJ;wFxj8v--cJ3V7|og*&1^<5XD+vkUjE}C-pS>#O^?>1 z+hR2g7+BA7&ijuuTNR0KU;RDt&LvGJugdldQ54om4eRjH1ZIjpO5G)lFrbG4rl=l5 z8w*HfO$qOVW~KR_3$OJ4@bG?64**Exd-ylVh`lvn=8rsQ$jr34^@D-~v(C@Ir-h$A31 zKFw|0Qb&s>42ek?UGMQRfs=1npz!@*Lz6be>;Pz^?fau78r%1WqhV$LOVn|P!@Sge zcEfXRxUM{xmKQsjFcKT)LG}PMeS+xu#ArU#lK6<(BMiw&l#Bpv9{tgUxvi#JB;x)J zQ~5>;c9ZQk>pD9Ib(}hFsgupYO;dsfntG&gs_Jo$@FB}nf|KIMsJl0GRBJ=75%U`Y z#eyaN5^c6q7e1ZYS|0B+x*~kBot$}0qkP>}Sg1{Okn&i^ZeM=3HW&RwKMKOupwNFK zNhyVFc96f#g=gS2r$$=%($r|amq1%LsFZPa!r&kiF?V2gadyB30SiWZYKo*fE6b__ z3t}Ei{2;ipSJd8g>GrL}45{`lHA~{Zy*)-s0?V5tjAeP8SsbgmGUM9Uz+uPbeHDYl zZ6S_G-Xi4Zvf&jP;r}v0EaPMW@5t6q*tB>Vz~0n4)}Wg~tpaFHjJ7;|Vx7Z7X-8Z| z6{WDrBh_MXx+Imn)VOWOZl9~dyd5P~H%OOvQcupymi-O9qDWl~%8<9`rZu;P%hN-h z9mW5LVSE%*rVNrI?Ef>5VYY5xrux!zzwj)%70Y$4eeuSrkuD|cC`O(zG5X50Cr&jD zX9rSBc_++jCOxb7KGy>K=w@RT_=gpV2L~O2~%e8B;8~;C5XIBAsNhR_O=T z@wM+lgo@EvnD(g*NrL}kc71m8L|khEO#<2K8g3?|IZc{dLQ^&;BPrH5CPPc(GgpT7 z#~+eDDJMm@0CQLFzA4;vzXKiL1#uKrG|V1|>X=%}?Rv@?LnsdreVBeD{3sk1;FE9Q z3PLe%Y-e};*qR5C*dSly-Bpk^mDL&Lbd}g+&MXh$(C*}wgsU_4BNXl z4n4crG-F(Zd^x9~EVA>*e^2Ywe2Z?4$;oy1Va!W&Y7*6c0} z>SA?mx+w?MHCz^19;KiI+Jb;fosvi0KS+}<4*`N#1iTsVQyQkZ9%qPpw03M8KNcpR z!va@Jx=wryFKt;$Fc7eZZVy_aNznlE?r{CL?rI_ML^n;Gern#M3V}z(o&~l>1Iw&jUBqP z==hhlg%2Q(ONeZrpgu^~Jbk?MdzN0OG|ZIpEqs6$o121Byy>52U~%j+91&YirlaI6 zjQe6uVf~*iyTGR8Y}82wsENZH?g8i4Rd6m5bW7yHAR^{)))WpkDl}lYzEa%sIG1z& zm_OWio|pXerU8;LGyM*rxwa~u6>FOep>Q0|CY$88;pvCT1kQ$*lZnZ|;e6oombBZ6 z80>HL5d+zFHHXXtN{vq@AqG27n8U=uz^QuU$o(K(Rai~rB_PS{sUAZMt^8u+Je!Rv z(XdZilfj1IqJ7C>rvz_OV0|%hq?&vjaxOWISRd>NJI*S$F{olPZ+?utwN(!*pW)(F zQHS@JTySA0=nVoYzv*vHVR2 zTmR+h#0XUFH>;u;2{)^D#EFE@l0Y=qG|TqvXGcoY4vqjMr0ofPT~Rx#lCuS8_&Ft&Z+a3!O8h3nz-_NA3@qI>3~X5Vio?L&ufc%bu>2BuVAWe+ zQ9N+ou3=#FD-Q!dpY$3YfE|R+zbGxZc-kup10UHn3_SYE!@$Njy#@oj0RtOfSz2)Z zu3=#KmFEZU{mr2Tt0lW5jg-W=nXv2$j~Nl$&93lhrkvqW8)h8!HM({wY2a9;YR6Jl zGDNq;(&H1cY}B#7^>Z=9R>!)1=oetxJX!r8KIk82?4*8 zr$pq)b(*_iF5dqrUbqefgFEk$4y1B=kKo&C!r?(CI)OlL_}GdwLc8yd5gL9(C9Gj&JB2W2fY ztl$93e6EAv-!qkPv3|)7u(yljh$D8&)y;XFOT6a0NO=0IPC zM>942C=@F{ih#k7%!K)Qw4<*BOkZrglp9xr9ZfU&AZ>=+&6hWllAEo2Ptd&~oG&C8 zQP;K(UG@DanR?TR@FgGTDf^sB2c#K!co!OVhFiaf` zES7}6!R(nsH;;HV!OYgLy#_Nc3(S19K%GWg^iN7lb0<1EnojrE z@;);>=H7}rj^iWdKsb)nfab+g%)oq4{k#3Lmzu-=v#EncAV1(5o%Ci`{0U&Nb$p!; znRY`Oc*CI}F*Gs|1^p?F%A#b@5L@v(cDjo`$#iSNh2sRhMjeFJUShnx?oZHqpz+}Yn&6y+}olped90q{T+-2h48HoW}QydM+1xG z4UQ>(r_o@)S&^v7IJ0KaS^39aM@0~W=k8h$Zl|A(S%QA3D2KRE8LyYvgs$|_!iQ{G z@tV@7X@=dRDr8E{^4+R^sR0*T9;*+uxZrMx(dXw!-7mKI_wVWA@Arx={wH5#@gHa` z{(g|;z-tPzuj8=W`n!2_z#4|XO{j07Js_|?{x9Eq#P$Se51;;!SxV& zaj`PSVih))Sfd@F?5GxJ7tHH3hN+1Wzy?*$*kH%>gKpl)!DwS*MsNSDvo>~kcFkCn zwwAWiJyyC$knit6av~~CyWKduaep^O0|?ySSz$$Wf;s?WO$wBsdkS4T2EOLip>U|i z9QvaIrRw$t?fkNgVXi%!-C(9h+V)n@G#Qdk9zi}&Us|bwkOYg%ObE;S{+(??^%z3 z|L#Q(5Cd_c8DCOMwdPiACiO_Xz$+#OUBZsraiPqv?L>f%Qa^Msc4iWdD2PLPsV&H&2js|ds@CXpU+M6F`c@PJt?DKR0}&65!Vu-X2~o~&}^P}gZS ziyo+pC8+>g&{{{)N#I~ewOO|6vPMK1M9$0QMTI~ovrC=o0sW9Wu`8_~G7A3?9=YH(A^b?u z8>S5r*$i!qW$(W?Dh}Z7VkI`;f45G65Xl}2NAibIZ;AiUSk& zTpG^9H99+n<9u4#npQt`@)J2Gx$PKErdUW&6TEK&^aj%l5jKMId#g!shq41bPXFZd zR2u4#iBhT9a@Q8NK&Gvv;CjK`L2Lk`I0jwpWD!@Hc4_}wik%FHK@mlhLegczm$%tY&bR5PLQw~7Z&&f1G zEUnkyb*wodD}9U7vIr%;NokIV3fRt>>aMvMhyc z#C*ESxZHiJnQC>U%KYsO!Q=+x>Xf5k;flJuTx!d1OV7-nz!pL~&>^lNHhW^NRry4} z;lsdFcpUiq2kO zq2|L)Jju2pIK4?U-D~E(n5@I|Ko0*{BNU-V!qaj4CMJiqWw<4^??tP0xtb8+QmFl&Jed&1tyi_s)6xl=luB_Y>O4kO zar-FkbHEey6sneoW^wh`ABl=v_``P#ODFLEBWfLE8IbvzFjHeu1-TGLhFOyMLTAYT>18c>7IfrHcN(&RC(M2kaBX~#?#?Wz)sHNs$A{Lkh1Bx=e z5cQX&6}bfz6GMg1(eLaVABdS#ZFT+s!Dg1Vn`qsn%Jczgxb+SILh3>-EfhAEPOw5H zu_!b*K6?FRti054M66PLTIhgwu9PoyO$)6jfrUE74EgsOu8?;3jcGhWu1qXyNnBJi zDB6m(!-4T%7u_ODWo}t9YZ$%s*Hvuc%1*L6F#_oTg?9nY|4)W$qIh^TiF`75It4f5 zWqb}HrP;?%Lq}Tfi}Oyr5g9|Zc<)@C4lAOMn7{4#6;aUjRZUKeT?!gXV~56ntsmQT z3=L!&QS(^!2L0jHE{Q1fi(lPOgnmxskjfbDlD?x7KtULnR+6 z02nbh&)kkfnY!tyHcD?swY-T#O{|$jC;NzHVReL0a()=C3|j#h*-wDUW$@Z-P@ls?BZl9gh7S}9$@LJr`PUH2AWOEtj2@PJesID_H%g08LPYxytD4cai5 z@IHC@)ys&^C{EH+xzbUMx-kjFgBLp|z)LP0>Z*gkJ8;A@-}(8c-a0iB zHRS4|pMC1BhY~xr+Ax{nx)AO`P%V(w&ScOT^ipyD@S3PNhd+5bwtj(*)vYF+)TpHh z?XKDsvio4(1AyoOmgAcJ{b){a)UTvqCZV__q&#M7iyyB2u4p1=8&{3?ov1Ipux-^{ z76$u-HiHWS+b~#D8Nm7LG4(JP_6b&hYb*FE+6|l(;b^EDFxCKcv2>y1|PY)Gp z7|s%RvoUN`T$p-Q!x-mYUaTrGf=cc`w|I2@_o8eg+)j4m`*zW4=(0y)F%$ndJM)d? zTKn-_wa&P*PmGi%eoS+{dcdVkfsDb^duZTjk#)dEC^Tixm=EWIWhP4>U?&)pamyM5 zmSH{c$l9s?3ALC@y)n&CoJD>r6IDpzi;RKxBo7)2U^Yb}d^6viCY`636yl|>-C{8n z{TpL8cB>yg(PUZ>tz9wM*~8mNc90}nTr)=;foleTJJ(zR5b-@$uL9RB+f-FYXB8a+ zoUQl>AZdknA0rtJA(3D_Qd+_onls20J(vrHCYAI!ECngqoYkaQi@{P?ee2Y@)59eS z5|BQP`jpBn#Ud-CS3B60Us^V11?89R>H&F#u+5c+M+h^fa!1v=8pd#k*G7mBN1*Xe z3;SvpL(uV&RSHbnZ7F#@Dg%eq5$LB#;pRe3N{M4PmR=7spTj=Z-{8N`8(A^&MizBO z@gcj?nlg7SUWQ;bN0tyXBgCp9D89PaG!_+ZSOTqWP}{Lp$Tm+}34ZVlad@@8O9*zL zn%2+(>xfAWPtq-2lC~woGg2sUhgOkp*1EZFlAoR&o6n=i@>h#9w$=;9u(#F5+joqu zbrY?-n{fzH1HT-sYL3La*^GfFjDK^f1M!JrvE~SoC=rU-fJTk7psKyECmE#AqSIrv zx-{CI_gW`9=%w{zMBc;eN#S)*-b*ifbzM-04^UNy<6QIu%(WPD<`8KBo*B6#%dR`# z*1#dT%I!jPiD>{3a2=4ZaH66}1nPUETB@-lOsa$;i`=-p6&NGvGI?g5sgP2U_M$jn zlXaLN;a$Q)G+e&};uXJ*9krHijB#jEF7rSDj)setEThTl5ASn5`>cASEV7l7ho9*akR7y42TgX$Iomz+mGV3oGXVHXNNc6v)}}*=;u8(4VceS_SC!m5m)8_2{<`Lph6Qs*w<{& zwEKc^^0b-IFcM!S3vs$|yUv@0FS4H!oG*m;TyMuNe#v?L0BALO|CP{IZOoOVS6JG^ zdmipzHcp-t-ZLC5>9cSMrLU%Y1v+(^?Ma;{%<-f`0nYa%=M_ssW2pU?g(OIGxsq_G z7RVE?&c$$*>JrB^eimj2KI_5Ya{h%P>0X@mg?)D=m zl8s2w7SQtot5Vd!kD`Q$y@Icg*K+CbBGk^4b!bre)}JY!qB|_O@|M|LSaRndHGq?bM@>+*d=Dr6v)PjjxHS z=Vu;F4wAA>nn+UR5Qvr`;C)VtuIg^B)7$s{b^1ygj|%&#q0ew7g0Az0V?qNlrdHN1P<<6Wyb&=+tc|u9{FQ)a zV$=_3%u@)uQtj)}Q;A(uMu*imA{n$@CK=U)8CYfsQ>do2bt@CmCyq3;x{PwYIc9&O zLb>X^+CGKEEp~7R;JS~cMwvR6$5EK&@pTT{CZ2ATM6rF?&tl=p(m~Crd>>a^CfcbZ z`DCB$`8SBO?O`PRRQpD;&#b*s!Ich<7<0cmYYUrxBrJPXohHnSRJimJ|42eG5S>6Q zVQxC9aq6V>CJaqHaW`snf^3j0JP~Ej?hC`qu)#Z=B1zvyx2HyLluGIZrh>@? zf1n4I36*0JQ}nd_{8Q|x zwnH~{CiF>uUmT(NE6@@{{xc#F!p59`N^bGb5L(rFqHt1`O_8KOIMN`plA1 zDt?gER5YV83SrC`#o}}5h7c&h9d#)#ZN=%*79)2tt-O~e($pS=o3I#H#2vwd1z{8g zK7zkgdI~C1Ed92qiG?l~1?(Fkt$2PAvJcWWOuKFPzzb+~^@tfU#B5xm5 z&VMN`_z@XbV2APTH0kgacbV2_Km)M>=!c_PL*#;M6K|_J>ZFLcX%@||YuEB2#mS{u zDJVqVbu{v+uB)14FI;4_7l@3V@91SqnPC(}Niw2@J3rfKk>WHdFrg+|O2Y!J2%1f% zMlvn}RNg7AKvEZV4N4lKE_Ks;?FjYxW#}~>YV=x1M&^QL`@JdX>g>E#(6vF}yp5pC z4YcYsqONs1pcHNDMy+8k43n5pTNiY9Ceq&7IAzy~Yz&oT;|*y43p@rGaEE!IntLU4 z#aozbh2I;H7> z^3AVPwUgd<4u^iU8n6R4ap#;Oz%bNH7twcVp;7-6Osf{nlkv4sAFjWnuslHN1+2sp zfo7=VI_Lx_WZhursX(hvA1sm}gOO4nb;J&i!UHO%I)x~R(;~DT!|`Wl97i93bV8_V zcarMqi&E7}Q?q=uAR@If(>mESTQD^h(~-%rfDdQZ7{0bn;N_?o;A2H;X(MvT&3~hT zgjQ{L_1SkA9oP=AH;dmZEWKGmZ1>vVEI;axm?Pzj`%$0&O8QYZdF@J@7j;oSd0wr% zm@VvU)6JoN-d)TQHu|%d!+%;=S#{&2&F{NG`{q48G2)Wx_yqD7h+9w^WCITYC2n(| z-WnACb!~70&erPhrZr4HwCO9)JiF}4hdw#RtYHR*9vpu5v&+7>?DP2^8pDY4Exh0^ zNW$ayMA>b#g=Dm&6Kw|4nL_b$g1~0T9+7lY2{ch`O)a&Pl0xhSbj&ol!UJ~L)M2M2 z9Q5eftOJeIDVUzi1hkRQEgn4ot|1-S zFZqVHn#M5z!cbUlI)XjR1H6%L2laWWpN6k9LjxZb#7A^S?PZM)}ADZ~W2(Z29fmqJYH5eD?nm_iy-b=p+_wSSD8Bl}>}yAI z%O@g;<}T2^;uEURk4?hV(FaYPB648}VaI^=>gsbNo~1rF^+83&@|F>apYTP}U|Qgh$|}V$Kf;{%RQQ`hdmTS!D+g{nfa_5$@;)(;Uu( zh#zjeEYRW%6l*7R%hqe0Ga&pxy1YI=jnqUbBDux3k?;V=Njr8@$vY0;_@k2r&W^$X zgP$mfGiCKCrhj5RULMXy4kX_5qxf)>#44t0Yf84+tH(%~3k?+fkAP46|aCYahUn(jAb5;dg6I za4F#tEM}lAW{iV^?D=<*1@Y+N$95Q#*gU(V1KO;hQ8C6+ADt791U58|1Vs3bQsUQ-0alP+0rM#>w6xgEEj^H|hB;MKbiQmH3Fy0U4xrD%Ie@-G zcv1yACev{wPv2IGwg}bmnoj2E8#d` zF~gkhnM+B|@T3k2W_psr&-N5!pW`WHm-(LhcYC35Jrn#jw*%UdphB8RdXiL7d|}0{ zQSpT@$ydP+17(|yKL%vY{! zpuoBvEWJj6)rhppoPyceFw0@M9Yxxh?e7zS8Q2jvF1|#t@#Q^*jkmPG#;tr^yd}WK zTiRfQrv_}O)V_3euYrvZe;wGkF3KMG?E#Lr>=HO`O_QGOVq$4`i(t#X9zf&N@J6-~ z>TIP~D{X2HvxV^RN|OqmcW~P)hE6q+xKhKAgvvznkdZnetkO%M*lamo5iT;5CmGT9 zp%+Ea-A?7faZv)gK$D(upblRxLf9u;<(|A8&a6h5A{T;Gt@V0EX)*jyI`ipOg{`5? zMzlPksqM~NGZyuY5TV5YAT6SNgvB?TS4`q!nO?jfWP`vtR57b*jnIp1?m<}BfH-=& z(nU}7(QE{&N}1h&bl0Q?C9sgfcSU@(=Aw6AG2`#m1PxfzfvSyAq_h!dGWs5APB8;F zyOF>o1j`<{2o_1}g_Q|f^k7oUp5MmTp?{bswe5MH>U;j5Z~xJM zDn0nZhu+?x2dk70^x$fx|8wcV%hR>ppa+w7x#f3F57vHYPhsQDEwJ$rUl(r<^x(~H zu)$LuHf~X=|3rH5@+^Q$7tSlZeDvVu>Dz7q$D4Nv98VCC4tfyl$_c6YB1s%z)NJ#K zpmGUf;S5lSJI<~;FYZf37q)SJhL%X$dXnNO^U~#Bv}D$7Ylh=vkiAMn`Qpp7o8D=H ztsf%6(I5heD>Q?uh35hwz1cH|Ia?Z}QNIm^E3GJmfI~+R@6q05Kd@8RT#hes9vzSl z)XIlP_TS$P{vSzu;c?CT2me-&ps%^bhR*@$Uxio4CMz!=l2R*HpLM3#MY@Qi@$5G9 zVNU%n7@d=;pV@c*QQcRvp^5WeNzrwl`adG{U-jm-@cp0C`?ji3@mWjXGdoI}PwERc zT9=7c>R-qUs&SPVhlxQeq$W##Ee)wEd>ud1#AqO7pi#w$C2H5L;3b{Nq%kkQ(Qa}#i8N)h@YZT zh@aE_Ef*gJ*Th+5z;n&y2mQ=3{LtbQe!Bcl3%IaJJi(n!pjq$(oTQr1o*$)V#=+t8 zllOJn9FZKuFy&pwo~0<~so9w|hG>()M6;<}DMT}H;N~f4%W6V$v01xU`k;GKk3ykU z?POK4$3}5#jR13*?IN3g7*5%2$remDSO79sR`Oy-@vD7FY7A4xkK#yoGS9Zr^d~qT z1I86CP^LflX$Wjb$wX0sr^?x?!}vsMDB)3q8 z3a8Us+lx$zYPMTUKsr`HXIq^*Zy)fVoS)4b?m)CYNZkRxwTzv`;+vH>h1BJ_-~{*t z2g#OKDTTwBWGN7&_#9>G(?L>nfzj&@lj)Y9lRuO9>dNQ#WiuBSZ{8FY-Nm+_aOcyC z)7Y~>DG;P%046kBb&~pM>&zl26}NKGwGxJ$Q zpK!sUbV=$CzA!W>l#UEi$<9QQl7efnX6N~qp04w7o$i>gM6FB4Cuz=)bb;oHzdXPfnsAB?B42*&$O}_-%U~#1V$5{CQ79@-s21Y49&@T1a zaf|-lD@uopVY@8itP%`Z;tbfM0Y`()#G}N{*bJUKm|X$iRn?p&06-)AGtX7f#8-xf zKT|#(+a`Wa`zL1Lun*)F4&#Qt_1G1|3r;m|Z2mE9*vjR_w;nrSZnkmlV1^#EkNz>=_PD28ag%Trq{o zOutZr%{tpku<(i2MQ;Vh*{9!1g1YC>q5ufES{CSdi+qDR;hVroeJKy)na<)K{EE!3w8V;`CLUpYuoT zK@5op5-Ygye|cp@wHjP1(GO6*hw`9b&Rf6{pb9;3HyXz`Z|&`ni(^|EJEN|b!BN$U zRb<51Rt!SYtP1NFD`rk?Up@=SN0l~-niW^9nyT?$o2pz zH`uG>yu7#3pinADMWwt;`v#LC?AKrhz!NRqC~LgRRDWun1URCa%3S5bylCTgNWUt} zcvQP|k-4&X3!G@%h^j}{nuAg^)wgRRtwq&IqmtvuXFu^pMKzJcN_5HDan!v$jeCM| zcG+dtLf5+l%qJuLY_2Gi)`%{}#Ylpp7IH)dcL;-m6;f4S?_P%-^ug4Kh3CqK83u+# zFd#5bcX0-0iVMbqXv!$Jp280v<%pdTGiuc$n31)ls@eQrvO=T0fHO`-@$C(kfgOh7 z!B2ra`JX%nz;3`>Z-#T)&kd8Vb!gy9%2*LV1; z3QS|hm}cjVqMsB++I&Qc1vAAKFB5B#=qLK3m9gwOO<%;BG#M)pnq_;fD#{kxa|M(X zYX}5rrhMr1>?>paV?ri!t41-Coj5UqI0`n>;+2mIzrGc-VxfR(miTxr2q zQhHWDK$#jn7$cFR8O!~Lb5T7_0y^l6>^;RW*0|yvC8^RJmncGxr87)UVWXf=;w@Qs z@u}E_8uwYO59$Rl$od$ACVto29H7YoxT0bmf7w~ZTHNKXsOkNBG;*vNC=4tUWci zxKK5AXE#bKNi|tv*4^UZ)MQYZx7X#h|3W!xg4+22^B{OoH@`^O zSjEl1<~@^_edMtEeIW2F-XJy}>ZQ%cPI}2q(M!g5o9d|SW*7At%BJwoM@=A#^Zz$rPLxHViUCK`YVvf%n< z(PjF~D7!~U)An0+DAje9%mnHTKVer*hWUj^OkYFc>g9GP55V8~?XUlF6b&DyKi@{g zKm8qJm-Th&gU+w<%NFZg#jn}bSK4mTRfmZ#vF1qt?^aNGc7aEiXzjY~Q0ry98@*KN zJ?f=;r(S|#)l1=7FphYUo&<32v-3N&f=)ef1hva7CR2TAa7?u5s2vxt%7W@#Nr zN$W6#T2xGjyoyA%h4Jc!#X;HxXxZm4eI4yLOGz9|0LAHr2f|?F7A}|_@KO;oUq&AR z+GQKSwVLW$VL9`J^Fir%#7NM^`-nC9k-s&ZkG?=+fzznA-2)a@%==c?31N$8z_5=!r$%fK2}Q30&%k$!%t z^hI3;E=l8R5XQ{&TpJk(ii}Hi@Zx8vP*h(h!vB^ z`D&S$itHu^wK`9Of?Mv8da;tN+b0YjcN*RneR6MAT3kZhQY-1~QfifhL8z{et%w+- zN;xUAFPr_SWY>&T9b$qwYW(Db?lVvflPX?UEK!ESRMQcY#@2@=(!qWy$YShCM2`dG zkE9lAkDlUy!X7D^)Qlx+it@!dmHEel8e|6`XA=IPDShN0b%vy4z$GBx&Y}l^K>8)C ze!{3u*U&jgOI;Sc%LYm*m&%>@;ys}d_`24mGmo;Cq?~t&m`R%6;Vb59%yBY*)na$r zrIw0tq@w;!J(ndmStFbpnCjp15bgA>V*eaU4_QeKs+eM`8{kihX9%^9iYSKwC^pO} z2eR{~H-SF_-4LK75-=)#K%_lto}%*z&YY30?+teRbuL>+W9!d3#RQXL?Kw{YIoXe9 zzM)%7Q?NPKo^uMLQfl2frN z_vawCo^(abB`2kFQDy}!q>ZH%(k9ebE6dxaSzpavp!fk0EGB9hjV|v|4}&rg-|dPR z{~DIn?@cTPSLG^));*j*Oc1RVKLiRKIIu736jsHDUR zG6V&ZD}d(W+$)TEAUxaE6tNu$g&gg6xs(&g7n`5KkK+cqz*H8SC|9gd;kECgN$IWE z>*=2V6Lqgk(`wx!ClFQNZi%f-yG*4n@IPk74l78Z_R?rOm`-^`NiR`V0KU$80KU%M z3cxqOJj7Hwpb&gb;fg*~cPU=ohvBA_8C^0X5wf$=Gv=Dtd6y${)p;0RJd!R$s6Ewg z5~ZmQ;*4sv%v3c-RsFfnm{=5mvb7(Yle`P@ERIqNm?L)=QkmJ5Biauz@f==GvN5zY zx@NZP2+E@AT3wuVRJQw&wz5mPUN!qRWz{wyN;o~W4)Rq?CPJxtRCm6!P-j?4qr^g` zY*=m(F+*&e>cknb5h+Zs*|!$Bmx{^SPU#U9$<&B_M5BtiTRid{!g$#f3VaGgqoR-| z0`Q|F(h&&;r1~%$0;_Qcm4bF)ldIz?_%Vq-=?l*P?v&6k4GGE-n_H9Zqyxv!EB4Au zrcWvE@ls4iszr#=2hyP($70oJ)IpmejKfqHpu&EB9(wk>tY}W^Hq;cp$9Sa;cAve{ zCVZX91-EirhQ`XqCCI7NST^pTc6!&CFRvWzsmj09sN6niZNmsrQv709ZOHu1D}Rm{ z3s7u8O8hO_X;zz~H#-y%Nw*SOT)5;D-`pB4qK@j^HU%Fhg5XoJh%8S%=*PP>+&S~Bc7i3r&MtXdHm*wwIsA#Oy%hr ze_|P1E7_oe>p!T1hN76W+$gnFN#6T9+TPv z-bXQr;kBi@2&U|2vBuXvTT)9iyqBR1ny?<4*|C0~OnH)mW`sSgvjl@tz4!I9>L>66!3M|S@Qs(aZDNHtsGM##v!c)`$Q=}6nixQ`SoK5PY(9Q;eGh1v zVCxpRJz*J*nl1|==j6T)-(rbqHE~3%@EjoZJdz@)THG3Gi*V*G?{s|^HW;f(Hvln& zPq_fYnVmC=KmYoA5e;H+DeTGwDs_>@NGEl>dMMcQrZQ4{>SRM#J%KF?lBQ05vY){5 zv=EJ0=)&ee%&T=xA#S3q47lmENG4C}Gc>&OISwm;b)JATGg)ZT9u#3=DxvVqOdALP zA2Ke@p3~>s(zIOXw4l*dma*Ehetv3-3DNj;cCFWrsAg+T3Bk*rFzJF&1M)HMGDkDp zy4XXoqbk@Ph@x4xR zbpV{FvJ>g+5$3c&20a$Yz^ooy0~zRq!vh(xR8oI;3ld>>FuhVs-8$3BKKS>DY5*jw z40OuJo!yB6oPvm(ZJe9DjnK*tkWH}G9340yk5!;_kPJ`a)jf$7DNHs05f`QRmR=Jk$IPK6MUjMaxkshmNcbQ zk63Q3Bfl8ViIJ4bENU#4c(lScSR~ugno%|!nVBD#R*0Vu923$=axVGAZxy1%8093L zp7yW~z52@d9Yv-S9UP(iQ7leZEisB^_GWiykUAPmhn9Wy zm+L>y|M#6qyXlaU_W0*u?yM*ipGyh{){7Y%O@Xe{@{v~#y%3*ys?a~~OUy{GXg1R! zb5xqt{;oHrPGlD!BjQ`n>dlt!ry>M0vq6ei(!4QOyBa4VIy1VHajF)bB6VM>o0ZDa zBC-u*TQM}GcKRCo={qNU){4SIXG=!fg7(oT(L2N?6)v8RhhDhstcKzoqY( zVB{T_EVmZ7FJ+1`a0t3ZvvuUTi?q~bUB`|^3)5b4WOwyIiQyGG?L3H1v-&`m2qRpa z=(Z-x0zqASG-=~nC5d*ATb8GZpMDl$*;j1n}~LJfbw9DVWN>h&Qwq#_JhB2DGlt0bO^KF7W)C= zTZBM1eg?5MH-kXpaDaeb`;-W{O0L;2gK0VXQnAoK?0GsS2fHw$=DfhBA z^E{$K)*l7%hRYWd(N@MjX)9y8>$Wm%^_F_ff|6P$Mu*Fh=5X;AydP9MgW&<#!4||G z(4^`lGqV#55*?wVNxhIpkf1|*c82)a)hZ`m>@?lE8YX<9MA*0suk~{NmwI? zNYdpI`=#6c7wI|n%!H9A;`vG^8U!^0g|}x3&9|2FK;f*R&C#F$j4}5yCE2q7owKY{ znFip>HMuBi%*GrtWQVsP+~BvHr}ED!OB=AcE=Wj5A*`NBB|1PX*~*&0m0)=23(TW>DT$)E|LHY+ zA?}z{P?S!vxn^=(k*ay&^T$guMS36_e*XA_Bd>fw?Mb(tiiMeF4a!*p<9}rw<3C4P z{si);lhJ5<8X0mgX!ZgZnoFL#zS#@C9G^@Qze$SKN6Vw`3Zl_(f@}mR(v)Sl!^D!o znOo5h4~sIH19+D&(A?*et?OKihhecN_k@u8TH&Mk1eLbh!hea*;VY)yjiW&=*!a>I zZHH}Z?n7#RvlM<7bEj+qGFPRfSaZ`;HUVcEz8f;dDgsD~t1f(;g~+}*awL3Q{hx|f z-KMK#%2M&ChQtV7t`9Ok;CnLqG8i~_V)d_$$m)+w2O7v3jI zfD{R#B{1gl#Z(v56SQrgUeK19Ae#`z;ceDOEDxo6_rD9n8|97Rk+Mo9BK3s(*Tb09 z*;Q?wr6J@hy4oDL3Ngs9NQK_>gU_gd4Anr)pX|!_I2{SWta7uA z=7sBiRWam{KWbOU5O(_sM=c0akn$_v6J(W1sFx@^3Aw}b3-Kr%o>_B7dY~CJ$+-c+ zD?G!3^x*5f89$sH(Q5|z5Wy)bhhwzv;1T(nBTQ_m*=BaByqWGwMQVmL0a5nDQ?+@` zj7fYCDf70nR68YP@KfsAHSI8`o1pmV4bnNtAt*c0tkm58wA6i8OE@eyI?;Htul^yO z)?{W+A4E#wu;OezNp&HF!?LvETCD)vC_jY5B3%!MWnU^BR^vM+Lq+x3^yXKCp7d~7 zR=~qyS#lj^=XinK!eLqNz+_#PVM%D(G9|&2!(@b6S{L3jO>07u#lQoZRl>A45pfOy zITERE$l-#X>^p@LjMp-=t8L7BZ#Q62xn5dOB&9`m7hCQ2@h1ngNG&zjmu%1%kG@Rt z6kVC*DXgEE3M*I-gT(~Z!(fqQ(6jwLW1izFhCJU>jWAf0To5kBAUR*2eyqc^8r#H} z8YE({ZbDChdG*}x#9%Tk4Aw5-;8Xvdq6P;yD&=tSIKZ*j!@&*haPXl$f`cdjK#Q{% z!NIx)KG^c#8gTH!s{syfZ-;}s_6QE1-`n6|<-v7)@Z%;v_~omCF5J`(2OnnmOvP@} zg)fcY%kaUs8+2i#FoV;Di)~K!a{l0_?QpPSkKo{uy^TLu)}RYt6J~HY_~5GnAKcOo z2N&%TU3g$`qYFQ4z`>FxJ~$VU*z5Vkd)wh);~wFIReKvgct+fz$qRQj`NUPP1~^#N z4hI+R5gc5+xA6xzHt@kmoA}`VR|9`=Z95$NaF6K1EqfbXIJW@@=d$>LKlm3i_j~Gy$ueoZNR~Wq7V)T%U=y}u%#Ui9@`^0_`u!<2R8}} z7+rW&6vE-)&Q}9nxV{|@E;ZQSU3_r=-X<^ntf5!Ft;r`oWjxbfE;s(L9S(-~NN&7! zZ^H)hl3CA5ge@et%ZXP!G$YC3rGerXq88g67Eip3tCj{Baa)q zvY5Eg2S!Ub&N!4vM5M<@i#N`g9N|f;^sv$xe;5164aGugDgG=^az!z}3!Llp&Yo~i z!sFPy)cTK;=MdTB6gl8jx$c;+Ty~p$aPGn}U4A_J)pf%9oq#J0HBQnGZlUrDS5e(} zGQcmMhnIbPjhe;zipYt26FmGGqC92X52xv+^FrNAhsa!b=@62D&8iL@KWYSt{JK4Q8`c{ZzB9$^n+hyUaB`l zvffY!@mo|DlWRP?`~%W$9{@%AplUs<(zp$mR&f&;ONSNPg8KCp&j0!`?_(doT#Ffr zim4--&DdRpfjnXlF(_ikh2Zzm^jb7l@ggW^-mT*k{NHdQq7(zESCKcW!101!ROm+y ze{st8>y>>!p?h`MbGVcf1VGSHY$Mp0N2JHRoM!?LrbYGST4k<1u1Sxpbr4MhUy8@} z=~MrRQ-})z!2s%+YL6DNvv0}7QK&2rL|UFA#|nO@=@ukLGQg7KY(#1Ti@@yEqqLSy zJ`5koJ0yIN>jPW7euY14{eaLKJ85BzJ^+yT!68l&^g<{JMP%2)T9;%~A6m%t0pKQp z4Hs!y>%Ck`ZCRRgBABn{p6v#;v-aq77*VNxL~;aYS!t8N zjO@0uyP8McSEosr2a#v(+B{y>9v#7p6+?BQIKoM3QgHUQNK&k+Lb4INL^T7KAS0f~ z=^1~S?JkDLdp1(=&!qQT1zH#`4O4XcU^T_4aZ2R={?fIvS88ljCF zXXj_Np36^QQhJ8=T|D$cbmq_*?_aoh>GCzh@o9a%xUY1nQl^-VJa>FV@QA#3QLTp# z@x=?zKl|%Pe(~)WPCNC?mb+@tto0~lzV$4%Z?!T#c110ftx{KLD@r))wWpP3Lftjncs#D2?A_ zW0WSr^|nrF)I;^&ZXL?aJ)GxhMrSZD;Z{oG|1%!Crb}_$k+&ApN5wA!OXo^Mb*%47 z6RhO&P|mgms1T1G+ZiE<275&45hrw-VtRpG^9?RGfB2E8*vg;mrek+DpEfJmuioeG z&)G-04zF95L2OwFBRl?d0%pI?d-xv95suyo(I zw7Rb=M~e??fA*20pi| z2AEI{r*vX17PQv+TXrac5Mg7No_njV7)ve6rqb*9V_`;LDu0SPQAC3v|jvdE(zIo>}SNM^L)qvBEg7R}dm@#_UJ6QkKvqjib- zsxnU^z62g&V*(muL?()b^4mm^FsIXEsXei(azXWa54LFL^2Z)FcI=RJTTInl?E9z@ zfX&t-fBl;+R>Lhk{>$$>$Zi1rZ`P+Yy^g!~Hiq;X(i<#oZi)CJim1w2aaawIUQBv% zNG~OA-kjtwBkk^-c$AV}9?GmBy&|Mnl3p3ot4ZV4N&9nr2IdPjInTj_6`TF$CwR?6 z@R_u+&EW?h$*p)^Zd5I#Hq1GiV$PVqRVd;UJ4X@g zcLPPNS$g{`iz0TjfqyfK*vbIvC}N}1%g?(#pom?++5;5v*%lO04}hugChnJ{hwbyX&7BmY3q^+T!ry{ii>yG@kSzb+Y=~*xNf5B&;^(VgcndU zbiE$fhp3*u+h**wCDK@9ZJldF7$wHI7@(H;(M_tEOEI2{Ip{+5AlB2n9 zx?VLh%bIulJk}=-#Rz?f7(;3-8=}vxeSbSjuOT3t6);yoP{?tQ>W1xUVj9b! z$rKi&)R!u9u4YJb9=ZHfiL>i~1Y_dmdib!KE}UH(9l-=5*=x3A zkRDZ{fDz#64t9i5g>*&Wvei)Uh$O>;3hCn6PGw5Lb0I`1#n734L?AU#4h_UUnrb?z zPWcjc_%J$XPcji5XBZugVepBD!R2hU&o}hY&~o;jnLf_80(20(4OfM#3|80G1r8$Z zeW4DM)Ou+r0tWh!YUt#j;9gfhK~VIvZaa zpAHV)@{3K^U9OUCq}+aLe*cP_g4;F6XV#{dd`0Q-h-24DTmPFrTZ-^Kl{nD(rndVNPZXR&i&Hu zoIAZ#lPoYP>xQL(=!lik)Wf+;ZqN#qo18m(B}p^I(u4V7OMJd*10|jiCsyJKx&$eREQaW| zKV_*+z_ZYPre@H-4$Oz~EVLaqF2sbMy!16(+!hd9$S`fP?f+5TsdGp4MqSmeu5#SP zf0a^~5r}~Z4bGiE{EX-XTa<`pqUvPcweGz0$pp~J^s?ilXz0N^&;IcD9{Si-cSVaB z4I01Xzmxm$Ph(=J1JOldrI`Y9e|_io@A=+?w_SBVWv$pVH+nHBCdCLgY%M)@{Z&7Q zYNEv<6M5Xey>H7kSA5{%W;?B|RJa@_(d|DiC2#xIBcVrX`LT`XJ^QsUUUbd93hhp` zv7*8U74#7bA8G~e{PGn~{ov;-AF2-{eKVhh;%U)AaiWzqi#~A2Hy*R19a6t;Uw>M3 z@&TNpkB7P$Pf~P|iE7g_AK$v@GaV-}Wgb-i$zLj{d|Y%>1ew3t&<{4Pe3*u;I}dnZ zdVl-GPri1=*U!15(PQ=ZQ6FAZ^iT~!(0g@NC(9_c6xd{H6n77&Ny7b#>~1^Qg7eXx zwV)ghWzd#MA&AnxGPc%XG2uiZEB-9MI+^uTKaUlo)cj9ovM{X zu~fVk9koXSQPsH-wVI=anh*Dt4AMAb;(<}6`XMB7u|T@#_MW66v%NDq6$_n#l!nfz z2F->P=Z*d_6~w_}$ZD2}3~~Lq5km|gdJLOq4WVQg0ClfwA)r!pn&K~p19_y&&l!{Y zZq;K?AQ2PUg3qcYsY|d06v?^s>o+T`-sd$y;%zBEyM#-3p=>7KupXqx6e;2h>&7E9 zBI3#qHMuBLnmd82zl{VStviv6Lv%0)h@u4B3m%Xvybys#o-czAAmT5a@f>Fc)dft- zm<9fHBH0h$`NNwlN0MoYx6K>dr=>b|E>{$L&(V$dQi9&4?qraRQJ;o~M@qy7h4~-uM zV*U_TGFB`|ZQcB=g`y1u$!wQHXK`5sYi;~XTx=qQ<_$-PAAo1k4+<_@t*Ma&qvSv; zJTy|MH7LVlsG-M_MDgFx56pbd51bO`R>dvwEV>6R=(40t6SHDmF7L9BQJ+8QRjj+Z zva9x?*YOk<(zqHUS|53fy3r#}M-m2|D%M%mf}*<=TIUzu}&{$FnQ_Fc!hqEqSvLU$1FXNY=Hgqix&};)5&&uq&l*R z{L54Z1Pi+?>J{cR!@dXVcTlx_ov`9G02L_KcG5 z<@8e9t}%It3O+%mN;Gl~D}|(B0Kia>b^W4gp^c*~w%B`L*luD__8)|kl5HXkMQQz}M+Du>qo^14rK{_fpNUe{L{y7{~%S1!Kk z_D}b-G)Z3s1>*iX=x^0{gbnvRxBk+FKU#R%>5FQWA;~-=&*UI2g6UgS>ln%xpEi_# zkjp~y#d$|~ecB=^BAf(@bu5dHm5cqs;kNsUW+&=J6%{YZ*(wj!MYgjNXnY}IDjBq- ziCCrHxV4|H{TC`t{t#T$7zg!e_2+`VmERaEjfqRKSEn2Ls-C5%B0fb=3)@QOiSS!% zod*7Nv@O$Xv(dDD&b9zU)n~-!=d`?ZCD-+6rs@-^xno){uP>dII6+F{$oQ>_^IL*B5X70)|Ir(6Bs1k1*Oe`Q_KqlfJ_D$^+`C!W+R00HU7R4c zhX&E#fwt{PiE{%x%+9ewIMJI2#1g1Jf6!RmbC`_)3XlUN@1s8{3}4Pb>{v64YV2%K?4Gdvu7w@&q*NHWr7;HnR-!J zSQlVneG?WwUx$VLT47;)^ee41r;J+j2U}oaOA9P)s>8y5ZLq-8Yq0RLLGDY!!hXAi zg~yC>|IN5k8eL>mEWY#}u3G+E;kFE^&iQ$com|~sKcPZn?r0b6jsU}{5f~bj9Im0x zMVX;S)CXEyrYij=>RsP0O;H%D70se{X-ud3!3`TGB?VKz1d>v0_}q`9?5i+=(7MAT z{kP`*gPw@~ZZMan8uz!zMzE3jztI}hA1Qq7*h5lKhcuFnb2LLHvZ=Uj45Wm>SEmL&uV~|o-X(oo>UT+t7I04<6iBQ(->2D!M+@m| zuDQ@ij5#T^CHk4hobn@Hvm)V;zt|%Wm>!w@8GUvk-gG!^o{oak=4TN3lApu-Oz5Lx zmT7fb>yes7pZE2O3)H<=$MBOL7;mNTvq<`V05iR7mEsnf6QxwMG1pgJzQ3xqE?VDq z)y3Xs|C(K?cfyRt)QkV0y>|h$vaIv{-^*HSuYCbukP^cg-@S(ZXLEuhH69`3f86gL zj$zt~%9+1sj?G%wh9d;C6iW6QsSj#)QT}HHL7izS4^hVLyAdi<&@J< zUcw~#f4;xp^RBh_1{4sx9i{eq-uHbjzvuRQe)p%rU399t%&cqmW&#A1kD!AQm?7w7 z!^Vj(!b1}x(_B<9I<&~6N-No?=L;^~bhceZS+*IO?NobhQZftqwrbdHMyxGezTqR3duiyGXk0@0Q81Ifqt4oSaQq}f?7 z%h_Z67!?d%UaDvm&)uc5_4bscQ-wI#gbTt{1OH6y)kw2@-_MKC9Iwr;YY=mhd*6@1 zu>&~@FrfdSj|Ig4JQfr`0lF?L&?}(^9GOP0HVVCbBstaAvBbYYe5KqIT{@BuN?j?A=(=qQ$+ zt~k*)j3LFoGEOG8b}QvR%?j19EoC8XGr~_tGHgbEK30n^`}tVruO4Q_xK4<$rp-4i zPfB4(6jJ^bVC%zYMUDY!cE8VxHAxLJ!q%SPJ+o3DF)LhMrdg>62sJBqh1+w^N_`iz z(jm36W`%actWZ&ym5%mV3E-hPZp97VS zD)$P;5S&o$vr=!)3MqZv-Co(eo4vC6cV@46=d@RRp=nmGK4`D@%JMP4fmu1*G1%Gr z1A~2kH?#8n-yuU%jsS3GYzJ>D3@^JML{L5Yv8P#c<)=Q0+Q4%ex=xRTVQ zq)+!6SSpvm&QjQh%uz0+u%Jm2Go%TTg*2ks>vcb&;DOVY0P(Q++Jw*QgMS7INsk9D zbqKhy$~{9M6qLi0Qus%hcSLyLeS2||cspK<0|DBLQzUi3F2USF)Fd)XOj})Ghy}my z_Fx`#e*>rsV-_Q@@QI=|fg`DgTIQrGhPW6r0Z@oSAS>4E5vUn6`A~5%nvjk*P7qHD zQr8_I45FnV1?rya7s5x}Ag#YKhB;3VGqSklphX(+r8KSuLP0_vMgnPz0P}x2vOdh9 zM5UQVi^p+jB*=!a1BmEJ)$TI0d&+o3H^(V2s2N^zN3|B z`^FIth3U0&pEXEQ)I9I%JP3g{pHXXRtW=*>Wy&5hBJvMV^AH8i4lVFR!vaCIiQEw> zYuC2xMc^nHW;fw!-7_b`qKGMwh^lZQyw&A&xQv!Wr{jnad)3GYEVs@f-R;RxGrQKB zek7ViH)Jjaq9U0uzm+cB&@2HP8JI57e5#xJME5b}vGiopaxhC#_k-r_5pM2u>k@b- zdIK@4ANoskte4UjE!YHw@sZ`!z~-xe^~|a#|Ls%bmr3t9e&DgeXFjv)=2chZu93DL zF^k4>&{eZ_GABu6FC>Mb3lj7gx3=|1k3`w(zfw1`962(werv7BQYVb8_?SjDyIE2r z3bA}S9vL0}7uYok>qCW-Lj9OJFY-EdnO~^Wus~U76%I)!s)XRhN)=dPEF-JK=7O<+ z7zlO3*R5%Qd^(HDht=r+g7& z5D(1yRvQJRaQ1Mw^!&V$vt7NIK3^B@icYJdm+ew*d>V?x1Hfd61g6jz@wBp?#dDYT z7b@UzuktaC9%wMTGkFw#V-RrMtSbjH-7l{jn+JoN`GqZ{XeZ{>l81Hs%_9FnV7=vryE z2-!pbsg-ng7qwzqR#w-my#(f>Qg*tPwDGYPYT1s_ssnt(u&lW3u_$}yV5Vd1rH@6$ zfyH)y%r65#jF5k!v-8j&;_Upx@5=08BwJkqM!4?r2Y&wE`Qn-+KGJn^oDUqT)uQuQ zx2X%eN2X@1EPPZAL9@wEwKBqfdB@R>jtRnNV(@hbV4@9|P=ticIApVlMJy*&dlkvB zDy#xC!H8wkrh6T)`pBXpMzB(>`p8qP&Fo{vE4l?w!Mb|#&&e(_#LR-MVe8=zsJdwzYZJ#r@{Y?pvacL#%~_SQ1K^!Gt8x$r#70**voP2| zbwGcxe9i99!2;|KhONMe1Zrhi8QVx!K%=ISurgl2=osOITCwI9gcT3}E&GUFjvks0 zgTafz3x2veef^QqT0M*QTU{nDBe9mz$ku!q3C9O2NxYUZ+sV-HUjlSs@5UXMauAbux^*tV3TLQn|P4=xDEl@$*}v+W|1h zdb1UJ6;EWDswWK*wkM(= zSyiT`wuL_p($Zewfv4l1rH5CZ&M`_N@KoiqRKbzaLa*nPJTVR25W2-;`*~cWsoBTyxcV}AOgi#!k zyYpD{K@$&Qjp>A9Az>xNO4J?nBHj>j&CP!CcfpWt*xPFsnC%+7h#?g`v9Hat9k%fg zF<_Ep>|5dYKVjv^z==yxG0m)FD&vu~ujx9~2~yk4#@^J_@mgCa8GXd53*>K6YhG~A z#>vi|>VWF22>4xeLuO4f4wB>$5;W<)I&cn6{V>w%JkFMmw*856wa+E<CA!6r>8eQQzJXLXSn9p_1fxdu;3MQM2Iqf%MH*aD1~ARIjRF zoQ1)RM-j*j?1$K^Qz8WBvC-H8AfY{@wpntlJbK0ABj2baBN4@e3BxOphfMdon>ic& zJ(#nfy~{>p&*$tO&DjMb=j`EqowKsw3!F0nw0Cp%onVI{Pm!3N7iV8MqhY!SaUsZS zzw*}-Wr$oyXMln_IGuCRw{6z!;>F_Kavnic3PvIRu$PL=(u!r4T@9^bi!?{oO~MojRPNRS)$BHfcae?2m*p~*^ow*^x?&N|3))XQ&^CTxQ3J#en^D~Q z0S@*r{E<;vEJ^M%76_EMl{|2gC$O0~!iD&}(pwJ}!Q~kg>40r5#f$xLS9$T+vo~{e z%~ZeeN0Djydv&fo&c$x*{q^Lq>$0s|Ig@%|3?o%Fem`71w)f-3(@x`)+c_^$4QK@^dl| zjnUi|_l%*F>nx4?+!&l=u_70e;@jFzmJ#b}t?4-XV2?f^i#xU{rB@$A_P%7(nCy%1dPRXoh)3P9yLk+4+x*i_A7RWh1~n+wQ^&tvdPqLc8k^o?^s6&a5JUM;ctA>UrhDtv4bLM@u9SaoK$7@Gpz_< z#mGtryL}q37l>@9A>Xu5Xp<+>7Spf!SF;#eZ2jPyo4%vll;#ZA`@s*9HgeW|N6)4d zbgWr<0{d)o0WbDJB4mQ^DDU-T6tn_evB*QvtB^>fIYZ1k==aj^u`dDg50hVaAPL!H zUjh}v=`n`@p#MZ`Vjwvhs z2o70P)ECH{4Uw!nHY!WbCRl7*N!pg{K(8<|KU!?oo`7I+vI{)+8Q3O7L8C6x4iBAQW6@8Au~Yx+ha#A`~c^ zw#^#(5MMDmi4;MG&lVFwv{iF49o~({j)|Z9hDn_nOC4d_H_($h8!V}@`qvzPX?q3Ov0|9~BgjwVVd+B1jcBI8&idAb5bAefcL}rMu zMS%b-{i7ZnbX8jIj4sxRsh8C!8vl=a_K-7x(H4WQv;3muKo#6vi#uoMyGL-GK}FNtyDps)#3v{kNSp` zB3U7sFIL@)i~b|O7?OmC^>Ndv-qc*LSRL>rLUC9L64XfBfBf!iSbyDp?KQ|xYcFfK zdw2~<7j_Ho=HXfKeE<=0x_gUaeA7LF`HA7x$fIjts#$UUu&!4ShFr~<-Vha6(SWo4 z<(r#!dh^ImZ?>0j7ytoeXP<3>aBLbqD>R|qVg^jMJ!*QB>fBPmODgRW!1; zNMr|^gq+}GV+mHq?xE)1186Ku`csx`j%$Jp(i`LQ1D8=4SM9O8jZQWePi-qSDyNEk ztOq8;erWW9c@~*)3^KFYLopcHC9Js*2cW30y}%g5#8b`h71k;JS8 z_5wA{Xh1fb{xOq_1>G_=GjW96*m?Z=ZKLMh3-#79ez%{}Nkn zGhKR#(D{uJI=4RjjwYeAQR#jr3qog;(k~XF^WA0?I)t{V7#ovoBIksPh>E3>?*7wU zWJz#}5_0F2DN!9Od@w&Ua{L{&r)q#|DkIznU0j@f^uSk?@)}M`^olx5!NIU$;%>*u zU`%JI!nOueuW+V<&@I#)pm?Q_FQL*eb+Ux5MKHjmH17?^hboft)EyOM>I2Hft|{9@ zgcX`~H7)X15IanC7k+Ajl`vQGJ)t3KV&I{v=VqBDMLsL0W3Z?Z$hglNTV76 z)uw=HD311_QITSTfzj#6x9n-mqEf@H>{zvKC+)}682_IoqAXfxtEBFcAtL%{GP!EI zsF8Vi5Yg&4P(e$?`U+_ptHoRAnjIpkXHB$8CJ>dxih>8y5~KmUWzVuWJ&AOUVsS=9ErQml!2-vKZ!P&ix?BqGcz zuG+(Z0Uw+8NP~|)7b-|u1cHh)Magm#VVxDULn#FlME5D-e3P!OC zmI!vH-gXNfgQCC;Mn1fAkk?Zdn^qli42J_Og9-BSrKY}j6#ZhD8C&fe_3TXbOf~7@ zjAl1A;LJ{OGQwo$qqeXZI&=X&=vi0{Zb=uMiqQP11*d9UcOIR*V(*7HL0MIDzyfNs zlEtrgq}@Mi27Osm+D?gN7!kTLp>_`@Gwm;Efx9@{LuWe(ZA>egaYg z+n~OIyFdKc&(?n8tS|iMGV047M{fj`fm)LRLuefX(VH10vtP;?vRvZoJmC+L4Kn~w z^};@^_$msWAHFgGuLzA;a|xZHj$>5|E(@M$DT1+x^WdG(DqV){fHjjDi%~MWh|suo z&3=i{xF-0?lyP2C*6L0X8t=XyjnpfP?fhg{DnR3Nglzmx&hv-v_|e@zd-8$n{wPfI zg)6^!|E5cRa^21hfvv$BVU}S6;O7`=9*e_dj(}xu5U4 z7MG7 z7T?}Ym9Cw7Pei(-gWg1%b-qE3nw-S2=}Dd$Y&yqNU{h4@sucV^Tk1>Lvv3|lM@w>H zU_eL8dK4g$-53}qyP4?kCQg%7M$MxMno0^;5#*`bMV=#Jke`lLV~>}i#ui*wcaR2I zE7TZTp~i_OVORA4v@gY-a@p77nlZ%EI(6tx7+jbBxfr**``ij1@a+*-1?*M??B#mc zo5-siZ3=CKc_`9r6V~l%crYse8>4C0|%S&98Lnc8yf1GWuX8{W_wy`)U$ifY#?NnAv{W%w7|Fg&ZAkURG&Ax91VyD=6NFRjO*LyIx{Hs< z%iWEX3r;*S&iSxTs|B+pd7J}gJv`UV1HB2aZP#G)4D;TG#f*eErkKy-gZYde-&t;T zpIJ+?+g`^|e4pUdiFmGDV#)d1PP62r0 zC3AhR6#s=Em|FB5c-s-1j7gM4BPo`zBnJJ%nCLb8_SktR11g<-l!QeyI!PT$`biWJRHlie5!WyOx&eBQN3+f&u~|6|w6^ zD#d!T*}zIPq%!uPV@x^-9WdhZPV;Yd9k zsR!@{+sDhu4Ofvw*^kc1Hj}W`x=n=4lY@UkpC0!!=zdZ-1RLp-tvrpnv-)NT>uTFby@o~|lv?S& zuE{LR(I{9*sAJ>Z!GUWj=&kk39a9vX)D(3q$NNk$`Td&Ue$53Bg&qof&=e!=;U_%i zHhf_6?@f}Zjb_RTum=_q4n-j^W+pflg$Kfy>XB))jA*b}9MrS?MC$Qr*DFmrGlN9| zbeIuiZ??}Egz-{fyAsg_Q;7xRsAem2%9u%)#)-My_Q%$?4md0?m=7G7`Vq$~KnbHUCNr!I+z3UeqzCG$N=3(?C3I|e`iTBt$Gs2KwzXiS1d15ZdF3r0th89wNi z2(w{G&A5P<0Mcf|AcQy4h5_&a%Zh zd0M2AVsRdR1aog7HYKk@a@f)E!#a-s$fLNBny4e(KII5oF+M^1T5P-P4unye%Q;w> z&=O8=qXsemPDGSy2Nh^fQExk`p~tE736_Bgz)IAS+Y|KLP~F;kW!WmCg-0xKw9sLmNuU{>{oW@ zs03Ds z=N;W&5r(bGyk6qSrVW~^;5rr1$>0(T0@)$kR>JR{si(Yl#( z+&YLe!$bx@CpveyoatDaPnIEY3DN7dAPt~uFUP%nk*Z!^D2qwaK3{Nc)|@Fu-;KLov-Y;Mk_v8q+L5`dUm<^nYcHRQ9~l=X)HJbaU!9CqjS5 z`$_k}Ob!TREACjGHHmziJxNTD`DUuGGXQtNC$w0I^TARfgeI#vF&veu2KnRiV}1)s zf6;ABt7?hG!d?2*TaJj37Kn9R{nT4v7s*a!5{rPX1Kgfw^TU#{wmxxKowj4Qg%r-0b?3wW?FQkIDEgP`h(rgfwI6 zsslh|BY}0E!0}6cX7F+iqXRucrM!m5v->P*$*cZ;6+BKe=FTjHMk~n0_|?D>fla?~ z@D_p10KEQW-jzod(SU>Pp{l@gDKFMuNI^{MuRB~s2vsb%`Jz$+;o^|a<)*R zp0KJ)z)(7fmdhw8upFXYD9l|iYyaqZM*#NXZ zHcvY6^jAIMjv;&GZ+0znQ*5_K{$?LMn5n|uNQVrVEZ4;OfmG4n!vsW&4(BizXBz6` zU=!+Ne;5%oODQ9a`aOjf`#Ar~;yT{n<x@ zyqcZ;PD`R6>w`{{w@ENY$}c#haZ(tE=u894!9eItV~2svRgXci=6q1y!Pz5kY${rz zM}?T#5}~|nUUlKGNLOmYei{XY@e`N-x$3v{dZo49;WKVhnnSLHP%Q>ze-=1PM$%w= z*?Apj_#Hm8a(XFQ88c7S3nds)3*xX8CtBz%Cg>Y6t~ix6?6jL@iw3 zWJ>OoMRf~P8y*!K62t@0_2M+f86N>dUP@V7jK6))^*wKX$7xMc0&xW@-4?{62(o@w zNQJ2#oko=y?to0?-KZS3rp9Q!K`3B3pnh!`xs*tRT%QoE*&Oq5xE}o0HMK2?V-c$e z%`Yr=Jov1{$mHV?lG%JL&%*ouhHAuk^z#D(g<#H)^DeRRtpkth#f zv`7yrO?Q>PR%sPJXjt?~o=)K9OOZ(TOWf3^Uj(QC(%KPEdnD3>TwBoG#4Q=abI$)Q zVg3itYR>;-uhyz#r#nQx^Q*ne(8!*Jvq6>>C6F@4g2ID&e9^rQ zXR}GbDVz;XtR@roi^Y9J?1VG%`JO~8y7HfI`NXGpJpJUPWjaE}4_y4QPI;X!3iA@973>(Bk*v3J=>Ra%mD+!rQhA9yebfpxoz``Z@Bq2JMY%44u z>{_x_C({i{)+HJOuJx+ryTn-!$EpPVP+xU!0_K(jWGj^}%bmikAMA5}T4Niz6 z7llBD0&O1SOY!b(`BAMgXLjjM~pzMHnnuWjASULFDME>=n6G!?X7ww7NvF^r^f)oiUl4NDGT4UfPcNbLsPSw}S>J2VU8!cL2I;kE_IeqD%FXppl zeS!Q@Un+d09hCU8UL!6`lm

    %?k+k+q83B{YKT?a_)Otizl9JteipvXK$Kuyb`1w3edE`J9 zAD#W<3`F`O7`>PXMk^K!dnpT;Z7dWPB!KPpLyaQyv#Sa_6`9$>^X?cKVdnXps{3O)Ia8gS`x-0k(S3Ka3?v89@}$u% z;c-o(yWSp4A9Gdwn>NR0yE{b4%72f!-Nvw2b+;R8d#ED zJ;C+`&2EbuX>kIk4xC^PQCj?WnM{=rC!u1Jo|3_oq~FC+n;2BQ;-SKPwqb=3l02cDG7@L zU|MkjT$ZK?NmMTi*g%SC8#6pLXIe57kTz&)fRfSNz-a3CCYxL6V7XEixAM2j?@dsv zS2jGK%tN5_HE^k@3az%{aJMs2D`>H2k%1JW$_OY0@YAWts9|J8l+`r5i3wuD)4Crq zhEbC}6m)U1WM+qBRU$s>a80`Y>E#Rcrn&CUEi3-z>5pA>aPYEt=Be-gZ0%<@e>L5& zP8MMRke7x*L1ZdSkwVEA=1jA-0dYou(9iF0XPPaa-Y-rT$SBQ3acFj#E5^IQ1l@P+ThD*kW?S>LO*v&Xomjf#I*J)#zeAwR`8kqJdJn#7N+s8-|#fj-tXKr-k8Q+!QT}B7oE&3 zgrGmGOBJpsGu`6wgch=uEdyuczmArnlPDst_YDM+nY3`o+ugJ*xz(|#B$0%!ut{W2 z!<$|vJny7E9Ph-+X^AGqwVoS_hlYx4{0Z(=Wi6g#XjogTSr8IF(OCuE%tp7p6euPP z%O5yJ2L>;lK*9sl2qdWfvJ0Z7y?mPJbV-UWiNP!h0#BR$sjUb245$Y%Ib`o4lgT2= zK5X;+7VtbNp71B{14NcF9Nx4#8A_U7DFs+<#xCF;is$Q?7z+Liz~9T4lrDBlmDX)! zcqFt|@77+luqj(g6Bd!-((Zvw$fE#p(BH&I=asBNz#a+^7i)GE*bFRWUE#wxBhHis zWxZ5@s3^zTVeW`m0pj>L3kgLiEW|}|T;N3ufSt3e-wC8x1&2KNQag#uEU3$tsi>Tq zefNLT+oZo>1??PS4q*<~=)*$HF#vKx;khqx(fqrtH zHeI$Ey6JG8$Y{dc+Qmc6P3P;AhbsJ>ELs#P&TL{Zlqpr69EIX?^f@EduS&#urEhx9E)R-WH}2roU;sr+M*zGI)+gcSMA`sZ?vi z$vy*{uHTGA%Qh-=JZ20erm=fscoGquifwK*Eax8UL2`&EzPgzUu3nja=@{aG*loHt znM>DGmGAjIs|sFr1!bC5;pP&cTCJ*F61>M%t!b|cO>C%YovPZK4&r%qO?y?)s-dcz zRF&y&VP>9ptbBNcU3{cBsPrE9$xCa^YLi`Y-H1+TJBzfCk7@V6>t=HEbqJKNPr26l zBj+z-8<5y?{vu9(Ri=F`G|i+QLW+fr{h^j1Y)!8H#k6cXmk88@4?ls8GrMC#_U~_C zuPJWF-RDwGL5+mLJ9m-Vk&Yfrr#5ancM-(4?q}uh9=4f2v7mWf+)9P=r%<+Ad6s;# z)k*+RP07M`7?j$k+BCq)789J%!$M60wGSc)-~dP=1F5%!!*B)-3nA`Jb=GNWWLpK? zCFNePLFXdjhD5q)xUrRr_<_0Xllg_Ern>(p z^-pJpw7)?dMnkWBh>Gq+dGbIYf+16qM0D;cagI$KJ1SC=z}6qqJR5=?{LoX)7@o|Wg%nIQ zorC0&`8hCX38@WJ(>D<;85B+<5oVq4KU4X6;_I@PpGoUgL$Gk0#lK$YF+7vvLEOP) z%Fcl+WNJ*QkYzA?a6`i5EW>zSia`d5`FWys0}nt!kKyUSgczO^8$moFL4#;&t4Vn5M5%Bx~z~h2X1JDiN0i(%xwhm#-%uih$kRr`zLrhAd{>>kdTR=yi0ir zRyQfxa>ZXt0A%S$l}0kG_gj@#PmJW#vSGp$g0w1W<~#jq4o|ES;Fpam(HUt}=0^Sg zeg;o0Fck%dSRU+;5S5ud3LB8uY?DrkaZw|i8^1W-x)29cq`?Z)*$RgPThqEpHF!q+ zFjYiX-G^T8QtliVP0Vp%5-!fyKZ~MU2lx|FYhJa)Urmt8&py0u!gPAu@>c;eN&b>z z2KSn5WZH(gtjw4e^=g452tITql+B`Lqep)%mlaFBQsyxBDJRaYxva#+ zrN7?D2&v^ALGY-PrrGq08*bdWX|`@?db&3nTwSbDu+F4tiW;@l;cArQ!Hk5x(X_bs zj(<_3&UIVxLJkjcl*n|2EA5GG8d&ji2?#yV+ckHTp*kleYn5i_>-{>V#rrdJU;&|B z*z+E1ZO=1^T$y&QLSm zVw+58i;&71)D-45b~&>~RwTOYa!wA7G~2PkrWiQt?;G`HdHoC?Fnh<@g82Wu>s*$1 zp3&$$p72tEV@Dw;`$S~OdFNlMHr;{cQ9P}3Fkp?vZUOo#fN4njX;hwzNJ$Zb z>PJ?2CzfdL$5)5(t%4N5Bj%IOw`t+^ab)5Z`l^Ua%!kT=bwJ66o&Yr3rdL_xwi!2f=d6aVOyr;(^`Q^e7{Ss5x7qudFMIJ=F)3 zahnlcQ7>ooZjdXL09daqIaz)Ht2WAibOq^47sPd=dvvWD8GWtly4W+5qG(!lkUezT zgW2SDamwgRT37Uij#f@N1b4B^t(b>dDkje5mD%?(WNhxqN3eNFDe!ir`2xr?&uv5% z+(jNE70W!oK4n*V5G`0Y@@^ps0jM>`edKx|th7-F_8@82r05_wokB+-9u$reR=h-% z^&D*G_|inco9MY ze5zT48@3>?X?Cf)8B?v4`^wRmN{D9(nqKsQ3jG zyRWb#*QB5t^$mvJIPLyIm0Xr#*Mt|62*^__bi$POEn6AY4EK$a^XPcXq zXD!xt_fJBY?&SW-0@RVja|6T!B{maa72JA3xky^|wE?wyaUd)SUG3u6`HIdF>T zJZG}aqJossQGw`jiLw(t!0ks(AZP?Dr`CpbtvHQ$E8Xw!H!D4hG%cJ+@7P{C+jtU9 zOqX@)?Q=-#=X3RZ3GeO>?{3%wy!(X(za_kTeZafx+^173$=6(u(9RFu&Wov18sKJn z!$hq#X_L~DWt$q@8Dx~+Tj2yWVFp;~B&AHNQMbQ1^1sP}pAt@C!Gkvlp&Q#(6#dO=oB z%yfcC%FUU%F-@xob}Y=0%tnG-&*hj1noTz})!a(BYQUbLY2{xAq2TDYPg0*(p}U68 z$C#$Kv#6QA7Ctt^)DC|@Fm3B!UK>Wl$R~kIPoou|bj&6M$%SAmBZn@q;h5)((D(0+)$C zNerSbra96xTWY>E-1c>$99i@(T|6y1*i$UJsMnGJH7)A16)n-3c_ynPQOTst5@>EP zf)S88skEJosQCr1X-#}fA@GCb^hp_c8k!ozPD6sm7O~`jkmpXi8l@~6dSoyJwu(9* zPDAL8=Lm-I_@zVIOU%^%4~FpIPj6|RmPY;11z{tmQg}kdfMx^yvgfDe@~_UC20x$Z zhTUJ_U_0#jV<21`#5Lud`t?lg9M-xfQL{Vj27xj#$%rs3 z$oj~MyAS&Y2GI*fSRhM$X3vN_Kt|;!WI^IpC?m@heo)b9-RT8f8g`5k$`hApp+q@u zl#y27?5nGteS7(C4g##V;vxl5D9sN5U?7^%{b9UqW1VvuB`CVLyD zaHQ~EqSzj`b4={RFzf3?BUVJSh;*S1?KfmpGx$MXqdmv^WUGQjMH;HXY=_ymPZXli z$aGlON#=AcgnA{bbZh4{=#+Jz)hjm1#HlnRVwU>pJ459sA9&NnaUZPsZd_M!D%CI- zp%MB31{~JsVo*{oyhiLkZ6)6IJE9;pOGYa84nqJ|oW2s%K^-RrLOH=xi``6scc)BC zPx5ysO-tu^N~hRjPs-tcF!r?K1S}6}g%2p>B*>a*Rd_FRqBS8sMEcs0zLxa5kd|qX zjzfX8iS)*h-bnh^kiM1lP)Khj{b)!(N_tC3Zy~)Yq?dES!XUG&ItNK_3-7m)XKO53 z>BsT#* z)sQqzUrcr_F|8z#l7HR!l_44s@_29>+m4e!Yt~@5_$dz6_Saxk6(X3MNyL&7aMtQipK3)7GQ#QZ$jy@mu>vA~tW z3p>Pco^T;gQ$v!vhD6E<#xcolgeeiST8#1Jd6XZ_hcq9oR!*-Gij&-8@AV9q`9U>l z`t(l|%E86SsL_q}2pz#6%mu_Q=%t1cWg%hx{^2&vBmWDfnC`wN?LOI#I0PzD@%NrX z-wC5;)5Ym!v?>;4QSrgn_wlkxX7S5l43wr_$PH($?+9eW_i?>sGr3E9{q+Xw6D!}- zt3xzyubjg>e5~~LsFz$S+8CuyqL~O$;;?g8w~51u+qgWMIRri8IR$q52nX6jcDM`< z;5^P1p081z0BEChdkv$-avP<=YBd3sjwVLs5ZDyD_}9x(%4vAxq#{XcUC{T^Z2g|i z))$-ZA}!IZ_RtJ>oF}lIZD`_Vp^}ohZNia?N*Ny{#S(sqz=T&eEpIcTi%HWdIa|e#7YnJT1+=(lg#F^B z*#wH$3o$_*x~l{SoTuN)(-3Nt=7S=?5V;F7K_Y{RM%}QN#DPLzivxu+mCL7*B$$#L zfa0Jn1^oV5!Qik0DWv-GBf}>t*TvNBPR>&4;s&8)b zsh@4c1R}dD1SfIgp(J<_2oU;*?npF%^?(R?4%&&LoNMCmANeN14%tCUKc+O!P)a|c zG^|D`ed!|!H1J>pXR#P%;VjO~h;w)snLc=M63eFC7Mvu}%CoQ72QW6lK0u^0_(?IM z88Oi~OhKCmim9u0)(0k&T^LLQR_Hd*M8w`UETrTr$wK8HqtA7>AZ!!v8%l^pC2JCN#wI03vf703X+| zwV@UmKhLg}lg`U45GqDm@o1IXv%K+elC11ocmXYjY+&=%zj|iXlmGUq@yql)e&Dge zXFjv)=2chZd*puJ!_2{mGDELQ=Wwp@a{}jzIrZDiI-AreN(;%d^5gi;U;XFS<3=i4 zo!&`|iJh*F6sS)hVNvOU@YcbWeRq6W3wNia*)_5skvfd?OMk{g+jU$#GqV4-9wkI^ zG0TR3e+|B9y>BJo$@@!X8*_19zcl+Owu7z8iZudr>Fa5OohAp{92~}>XpI)@^!1J- zcp!kl$J;&8#pJTEY-06s-=YhACV1mv0Xx$FJYMvh_dl<5$m4sVc{X0g9zEJ5Bd$^{_>#FU^&27;g8vAP_vH5 zw^QqXQ!1qDKLCR_*ce>io|UvkYCZ(oFrwz4dlOJXatk#M-+hT zJQW>6JV&g9WXzZ{NFr-wa#U~gmgq1J*Kf(wcRP(V%U$*X?A6;PouRSiT{#KO6PC-q zC71|E1UD|=;49+Z9_6m7h8|O=@X*`SO~Ib9R&+|^x}MjpB4JD4w9qgt3vFMpDe(-H zVq(KPNQaOQ@pPBI%3Pn}A^JbZw)dItx^OuyOb+1;0+gDXqJXI`65R4 zHcdgBX$M@B_9`0*3z+fAi+FAL_NB))^-fEdk?yDS(4Q-mo~5*@ItI=TMCb92LT39A z?Oy8yTjuO!pdq{O5UG;1#bx%v&9x~%|8gx*7+YPVXP6L9cV*n@kX3h0e<1$fBB5Mg zvMSc}uaX6u#A0lgr32AhB<`X7+P3m*cU>M$0_E2sXtV0Bwa06BRh_i+c7)I>aZF7# zhX5cJ6nN!R%Zm8u(%m^eO`L5E)r*AzIwr&XV%8*g+UmgWtEyn8cSfMP$JYl z6+so5^qFORg>j1_LbX#EsXJaqeKt@H8y8bbv@20uxngKZ&^weI$?(u`Vytb$Eq8}1 zhSn4@z;%Q=Wa9bd`h^md!iJ%?wCY^L04K#7DfIJHa_N`0=8L^GFMHsP&8>Nr(*4W; zTk{&F_vhC9MxZ#iw9MRwv*ffa#0`tY4+>isLs)D}c0tK{bAodq8^OJyaEM4AcQ zpL)vlKl;PBYdczctI{Iyc)v~QSxRdyq-`gqjniztFhrb`>>e!$R%Ng(Rtc?=a8gQo zBD&`nNnF*X#0f3L#hp9ePdQ`{MFztV%~OOEJrf;#Zn1cQei4cxnd_Mw7B%=Bt1T6$ z0%@U;nRu+#UZ+?U0may=nkwMq+=4piEua*XJV~}gGEeR4!gGw*<9T)t)`~R9dpO}h z1enL2S|mgtla#{l^u?o)xAq2V*m$>QCTgN3U}?+5n{10-=+$!s-I&S=t$T7TuyPn-jR76*AsnBU-_(IGfA;>%ue*HZkE_e{JbmDz zH6Od>p!nI%S^8|&%HWzFN?75CfDK;5) z=SpG!5HTgp4id+PY;D9O)v|y3Uq*5WB_f5zByZ)#9(V%}1ub&xyb62DDztaj2+IwO z2Wp`b8)JLY7Bn?DHodLD8+W0c7!i5nIWDc;q?=vLskF(btAU<|8`Np{%XCLFV^>e3 zxGA=L-p(VKOBs(z{4iK2>4%w9Kv!&w29_)v7(DCjrOQ{Y85&%2 zj+^1wp4EuG6VO~T1>o8F{~skdH2dwGQVQcSL}yCPp2pAfF%l9Z$UTYONWf*eEm5+r z+AIa~9PcSa3%REdH}nBSz?GbW!ig(B@L#7HY@{zxdcMD3t@J{rEudA>M3y!pbe<8B z?o8;C&0L~O#|b66bmkpHZX-c8uO=r8{{A|Pdvqcopf|e&pQqf-&(eNA*s(<`AfHPJ z?G2OV;L9;Tmc&6~A6Q)7MNUojib{(iyLFKb!US10#Z(iZaBj;Y#!g2hiHfYk&4#S9 zUYRkH$mIUZeHMa^^MEX@Yo=Jfr7PkDG;iP)a4!a+U`vY?7y=7IzEj7X5=Kx{JB%#4 z0HT5r%qBC8I9NdY(jpz;zle|DR0(EyuZubPnJtq`4)|i~d^JUbWnXv)mS&NvLk1tv zQR4VU@M)r23yh$1j8hZ!#?I0fiFOcJr!HtQn|uaOa;vXNe}K%Tq&0;}wAStVF*tnf zFpNkwX-U5Zqr7TR)28v_7%{wu-y2x`+}9%vG&xi&Y9TQ(+9!$?%&HFSmem^8GAmd( zjjya~RchY}CK+c^jH zb*4+zJQ64i7zD+crxqY^G=1cO=-GMtq+OD}!3h!zc*Brt`ZhH2=@92+Z095{kO$c; z+J&JuWX>!zcs-3IyY3$dG7nZrx8c2y;A{X6m!u{byKB$tu{(zbW`0VvIFNo)p52tcb7BO5gc0TMPhLMz!^)d7XIh_fs%4mehRgCshf z_)4-nCgz;~gmHxg)pFqzeb$Vw@b!GprbD$plCsqO2!L!TeO$bSCq zux=K1SE5e<%S3Hw5>C^*G#~8_B_wV4y ze{Sza{&TI7fBJ>5`7H{P05jBD^IOKXt@%lb&?j?VX3?7WmpiX{QOm?U@{y;;)|wxJ z40_->hu*U9k40}idCo;2`lLnwz>Jo>f<5wli+;n)nu~rv4E&N7U;NoN4wE=b* zo{K-TM1<0s(BlNy7$c@l)84E0ICV}FAni{6dV~UkxaH{3saRW>L%a5)bq)=uJTz)* zR<6>dJCyE}$Pzi;F@Arig1~~u$zZ>;EMAY43|Lx}fRMIfNHq+k12Bw&>WZyR(OC*x z23fXSPyg=*ig#VpbrHhO?q&%-ZawTFhz_Vb{pgxleoAd4$zfhM@Gjw29Z^R~Nic9i zNvy~>Z0_%X0|aP_2F6AJ2bC{&LL(e@rt3`Y@cj7Hh;Lx*`;vYUJ)|Zj(-8z{`!L>9 zA~*-$!mb*hY8K20(gn!)es9i+DyUEU$78&oB{oIWjCYDsGk zC4}+CEA@*b!d2lD*Y~Wpq{;8N|IErlx~>Tspl8>T)P*-9n~loOE@oljMTb2KKUi!g z8WfVmZ7W)CH`wuv^t3o$v;+IYiDdY6$Zlrbd5?AG(|E5e*(zsN6&b}1PBmnwXeJSt zK!NZyDE*6;u`s!rXrfw;i{@2&vKKIBx8-2<&XN$-d`;AMzpifBTu-#xPxp1A$S{Ot zIRxxYlk#TbX&jUbPqOXgsi$|0o@9!{Q>AyTp18V8PYZhw6vWe^lK7d52^>FtB9pkM z&*X_nQtL`voRB=ud#0t+`5840UMS8-PfPpw!6Yu{=YZ*=#wFPh0h>*S4UXj<1vL4X z=|+$div^(avD1+=#I96k;t;6F--ML$TeFlhMgDRA4yUZ+NkI}1#{9D0PUna9wwRv- zr?bT1Q6)jK8uD-#j)|*I@OP8t9$>Xjlw<6KnAuz8W^G8{Z`T`lsQV zZd)GdEq#Zn@U1!%62NDn-_@3M!Mx{@;WNURi1AYj|EiM7LYImbg+r&u1KaQ0@Z=>w zyz%ijm?*G5aPN2ib=B=VzH{a0m$>m2ds@}BeAtCqaPf<>ukz{1g7SMUPg62S)O+ z<7i-2IifBy`)JLiZU)Vat}CT%kg+k@U`Mg)DTN;_;bB&!?;u=OU`|;ufjKogiV0`@ zEyr{Sbdk?+q|2#;D_CG3V32!!bzT#^WyG4o&rq#49B0s{|JY{|=oqn{)+S>Jw9GId zv%$bzP<$V~V{w7}*-hj>M3b9pA!za#Ib0Z64mB{19*|IAEzaPfjMi3Xc026c;fzW- z85EX^FFgg8I>@9bGQrS66`7-;QxgQVLWGdrb-Y7}dl93Tedw(;qilg~wW``!SU!@? zM~i-NF`BYtlFG>`OYSOsW_H)9V#UaaqqHqc02ouXRS>=l!~lx=a@X-ziHbNJ#koJ{ zE`Too&;-UI4S*Y@QF#~*gF?&A07amvX$4TkF>rlV4Hm4>XVZAJBtrN&X`nUR!Su7I zQP;_3;rl^e7R(>CRg>4b1{=3C@K#OxaTGsO=k|`~XZ&1np#_i6IM~LpCp+>na~osj zT0SL;KzLa`)+a&`>7gf(=P-3+Dc>Y^#}>KfOW8*Ag}auWwAaJ*^2;b5W|Uv_z#$Y0 z_3(tGuk8ttLml0Gn_Pafk5w7yUs8rg zk@Z{G8IH%Cy0THo4?Hr8G%6-X)Y#;TNW-y`kJY|ZAz3rn5hx6a^fKyxF!cbd+FccP z7x^T7;fNEu$B2j3oc-vua;NE6s-AI$g^(qcaREXU75{eoofmcxe-;g~9v}bar>?A> zcB;IatVlE^QZ(79c;=T+5NR^I%rFi^L zg{o1+NMETqIg$$w*QNvPy@;W!1S%hE2DF?;t3uB?Gwo@$?KTdgebSRi$}Z;q#Qfd0sR!} zfTj{cDK=_cUPVDdkPj)noj>Mxw)3Zz4ApKvttmfIlW)ZPf*8gJ?=WIU{4aL0Csn z$eZg+*6TI{$<1upFrcixqIIzVb=gs{J}xg8u&V`3u^pDlV=+h-;hfB3&_}rW&9rom zC*?tW62cfR7f2iq`$31Hr=X^v-pVT)*bI2ofo8pkh()!WF#I9`dv}su^=nrOh=Zb! zTq#i1@6J~Wu(^g`DPUoNj37~zY=}Tsm|rP?1CG%%c;G6960qM>C>s=g)u_3V@*R#_`FM6nbJmd6Kdj;Vz3mh*+D4 zGDY*Z~zSUlxV!db(mUcgoo$>&*NR%3a$B%lESC5rOTV9 zt4v*--E}ZKG$w*wgLC{~Ga=FZLVuTWT-?4sgmYn8B20Bp187n?Ce$X#a>G4N^Xi-2 zt}a2{$>9JZbBYX|pqL50Ksm@KlqljS^a5>)_6axmYUkLk*a&gK1pvr$ciwrnIqHbC zVlf-rBKk_J4{RQKp&v!_d0PMz3eZ+W^*jVJUPd8bu-8?HiEZS&DwT{s_}OSC-_WW-#99TB3>O z9vEWfAQh)+$;IiZ-p2Sd`4usI4LT$?sB~(Kj{cCUH^BM&K?;q`VuCzeyOflZNu#S+ z@`gq?GHY_^bYOVH#9&FtXn_g%(H~N(iuACmdc3M0s-UU~x(&xFsy1(}i3n)ggB7zN z>naXiWDjzitrv&Bhf?}RLp|bTGB_-K z9)s8JE;?b~-V|EY&N4vkVD@b@e4>!Ki~3WhS#LbAnVSWFkr z&)49K@n%j{780FRm$_tM9BZ4W3M-nQy5AQBwAavsD7*LFLWN9C_Uo59jx`kx%a|@{ zeDf}?Q5*A4%$@B*W}e0wNu~FhhRrwxBLD({Ag!#3bcilzDi~{YeOlbmwyc8eo`Z5@ zh#<+g9S8}ej;I6GV%wQ$LZxIN*LVL1sNS|KA*9bxL9$7ZW+RS@xm(+Xy7>{HarW$d zwTZb71b)P@Fg(Pc4yB5i7HAf<)`03^_)CB)#d(hEq5>UJO!ZOmGKmWXWF`C2TclL8 zl05zVPeiI2bX2G z-q0htjsyDrIiLeED?)WA8w4Xa;R-`^0pSU9Wfvs+!RN9vCHh-00C<;GHn5w_EFkuUfax zP7AA9R%5jrJ<8`8aFmks@=+5&NWDyvbJ?K3?g@FPAfb*RMDA2T=F?=0s#ik$U38&a zNQ7>vb>xi3q_bv57PcZB1NaN721ZmXf}(1~h2binnrS4jBHI5a5Y|*QQfg6)vf5zv(N{ z!7tiSco>s%p*bi#0k!i@Us#surZ0>0!ZugPpS`{5OF?PrgjSRjlAkEC)?)gs2{I58fJ{2ovIX5$U)rw=>@5}Mk|3n5by<041`kspzSl%1{n zy)0#9xuxc`?)PFRYYZXAIf3?w7zd$Yr>w1O#u%oycVb*(agpG&SO=saZ|JvD06&5l z7qT66vw7X`b$99)!n@Cr0Ab?@vMCXAJgrROnqtdS--?PK@F)A`+qG-K14c$L++gmg z_{p<;@5ydI)wY+0yuc|(%ThBg&MOfmbfzXNo*|`Q4#v&9L7V5<-)NeaTL_x|7PqDG;46EY2SstUxHSoS1BmVMG|j zXw7v+14u6^g!cJn^ZSdxV_rZ7TBEESgg1bzd4&L*V#mGJVGe*MCm}-Zk7WZP^w6je zq_Q`q?|>)4kJn_T8^R);zC!Z)<)c$p2FFL|H{3I=^Ll=nhtBKxRg1JYd#|NINVA-?tJl*efnX!g;5QsnQ&{&RA4d}j}uPQpPoDBGyyKauMdo&Y_Ihn(E&9@3LQ{ z@O^mkX#%vGjN*5_F>F`%#0PlaVRE78gpH+W>={eZTo0QQ_oXy}7SWODh|_>#FO3&< zPSmA0GRAa4##|P3g-s%vcU##h$pWnxW|U6(Eib8@Y&%;1wyED~3QN-= zRfpUNxwslCg=h1;HL40oON&8I5ZtUCWY2lUa zn81!OT+EoLN^sJ}C6mY(dFMHzli=krhq6(pGu*7l?XFsSNH$7tgGyKi>Mg0~GaWQD zr!~7$r%_3z84n-KDw2$PxwXk;z`oWL={_Rtz4pB*LRed41Tm2HCE5C$R}YJ$594?toiiuo1NV{5}~MorpoEP~x0C9PbuJ>efU$4FXh73)Xw)DDaiiSWDQ(76lvUA1kR9=HB8 zkEa!57BS{hvUgaBVvijJ81=biBHNA~DcJShaNk|?=M_^=l?Stu%sue5=EK7ZUXnvW(kfF1@Mwu8###!iceWqQQ<#ad0k$H2y~i@Bmj8jus1 zaacZTVhZS-sB=K*E;fIXORpvr+xW42z$&WZ5C$ zR2`sG4~cx6GH)9)R2woi9{MOQ=-`61Y&(SdIIpKM^6AJpc{vm&<$r)Bve-3aF!UysLFN2 zned6-a0ZK|`Gp{8-f)(9pSaB=$Vtj!$= zqn#84NP(Taypn#s+`XTdzCNduS2XbCk8b()jaU5BcV4qhmLBziZ-4biE7#m}|8=ik zwwFF$Hpbe3O+v0#5@BLz{1l!@$_y8@UQrm?rOIEJ=;!LLFIAQg8K^|S8M9~xDX5O= zyAW6(D4$tnIU@^d`gX~lRcFDv%XYq08J;s@C6*Oh${LX+g;v+jzFji7VYRkgyAIpQ zvukheRKCCI!uR6N?L+@(^VVm-{L_yf8|L=DUv9ni%13W}`omc5?41MOzEAGwUcAZO za`ErtZF)E(zx>HA(o+`b%;t zm_PWmu9MhhATBm%%q5NjH@Ixfl+1gsz5G!y)7n@X#3DFDk0_ayQoTRO$U|;GZEZKw(oxj&r2cWlI)WAxf3f?TnugpJzjt(nxuv#SCBNx$s}w} zMKw0Ds*Fo<=Si;l%&ci{NXo-{JrFI#zTBh-VukQ<1R}&dX-46@i3gbw4(TIzcgS^7 zuaH*Ek#VG@PBO~^y*ot$LJ+S93|JCGh;~<`s%HJ7;p7iiT-!g$bwsbpKJ!1CeWD>{ z(y>KT|mskB3L7Kcn3Sdbna#}~|n ztv^jyOx_!9qp$%pX0HSChFSMI?k=D4{VcdKML1cO10<5tk?k z;`x;7Ak93Ap3zBy&O)!rEcVCTBjFXKMa8NY4mFn!vNnG%9AI8M7UBsivIFbCB8IDz z8izjcS&WR)>sC#}<7)9KkqFMoK=hHEc98U^Nze&}XfE>+;%If)I#GdXJ1k~TcnO@# z)e~Ta$!`Hqk9h^3w5Q;6s6H3?I&%en7z30=;x1bwS;7W8Lbe)Ei9ff8O7MTT2RZ6T zVkP7V(Ebmuv3>%5=jRNi#ARSAdPZLJx3z)z1AO4`UygznC1TnMqhR5b;L1L}`~{ED zB5#BM=iFylx2%M7dFEj8rM6xfB~S>;6h;X%fnF0)ri@eGCEZsSTb%cPsWLK+q-4$qTV2@jfz*h2rw>QP4;3cl}gpu;EGO- zk`?Kuh%<9HG+^d$IF3)iEZHpjTeXr396HKdgtC%`TIZ6`xve{OE_~S7`XE+Vvml8q zKa$Tf20j?w_vlW|^h_OGQNz$I1b5PJ2U#O6#%LX;y1K72aMO=&xNyt29$Il=Z*}0i z|FGh7%m3xRi!6w@F`9?0&wq#kO8vG8yrV-m>S)+zS<(UKd z2lFb4ycRy6xePs#Fevz{16@%Cxe@60Q0*L{Ch#9y*qB@r}kDAhnTv z@Cy^8AuMZ$vmJhuD*xvwYJI03YX%<-y>IrF#!OrS1Wewm`BeXaGP3LSv~*a`JW+<` z*f?xp#}O~RA?wYs;w`> zJqN~~tXqXWmX&L#a@Y`e7Vn=sI!UF)?JVA_%~b2vC4B5D%1T1n&3fpP))}NIJ7!Z6 zBL)>1=1p3WPl0S9vmd;tyjf*Eew!xiU@^#QU1Ai$B%r~soy@S12`ktqT~;W_6Y!I? zsPAT`M&x#r?Sza-1-KM6u}w$ax~J2OpsB{Q#r~El?bC}qHhJUgXff9qO`KcIu=i|9 zos6tuos71RW&j0QB)Ha`W)HrOZH2T~+e~H`o*z4;9*#NXgiydN=ZXEN%Py7JrnjCk zQkO0L9HUt3v|Wj9S?i6Se7CynraF3;y6oRqMfNqi(p{KN0uPX!p}0apfLV}Q?V3Z` zqGVUhHYBd4*ZLE13%Al5KounCg% zO2^5-nQpz|p9Q?VRl(RoYnt(nm0AYOq2)49_dr6X1o_miV1g16=%xlo{8v348lWZ* zdXX(C*Vz*&_Sf*M2y~naO9&jVmjm(Xc8?BYz-?f8g{Q^cm{Z+!0pojfNuPtrLR?Iy zj=3mfFiR}JqvI9!pxHd}VjMI(Gi#wIc!ccMpYWaZc-M5hlEwrYrtgN9DI>be_1@~p zHGtHCJCXia9d701xdlR67S!OF^P78FS!h!;xYSZo1#O{N%}0zi2M!$J2RAbeF&5Vn zjX+=%aZEf3Dcsb?`2_UK=H1@Slnt{@*KxYulx2k`P4V-!5>Thsm6Cjgb%n0J>6KyM zxk?plaa9c!-@|u|7GrurI80Jz5HJjE>bBaAkYXlOJuA!w;hX?w^Bec-;Fb|ElC7v4 zfk?OvXsC50l|vG>#xW!v!;1rx3nB!qS56!5<)I{V?<>5a{3s1QzbQq(sslHDY!-f59SVv{;pvD#QfY!X35y>U@Bk&~|3 z6LSB^-!`}(&dFU1#9R`4o_k6p3)<00W>Y%e)+*v-BJ0{#Y$OwaPI^4E<#PFcT72)8 zJEG!l{^ZGoQos*7@>y%6+C+$yLt&vEF#FVST=w-1j1S%q18eAOZJM378X$9hV;XJ9 zvR@v>l_YjBP4}ufn5MEIbcoTMFyDQDLkrobPF6cZnmI&bF)B@|8jB4yQ%vK_QFDv+ zN-zD!1~=#@W?wS`qX{yFeSAmCB2BhGP_1U9(&s5S?A%k}2E~UEkY=bEMAE!smMJ`r znS5i=yLyZi7RD;4|$~!Q?6ZS3L%f4%PZT8)zW_Q$#RFS zT=Z$SvI*h(b8HNFBc$bT{Kj>^0g_!MI+SgKDw#XiRT;X6=B4ZQ%qn6juvNfL%8}Dq zMZb!ZewvlZEl-?J+zG%h4!1>rq3ODIiAbdq44k!jTN(BiP;kf&pkQ!p?Q_V&dN!e9 z0K`Pb-XyasjfGf$VMCsv#zl#$3*qkdmkzi;j05h;!~{$UyVcZ*sqjLKT*$;R&=E4U zvZJEfs7*#&hM}d{eJLb3;>^azG@5x$6y#B|1@0&gUC=A0tfTm!VttSdc&^NN7Fq{$% z-uIWX?zO8|+g`~iUj_lX8UuS*(+O(><>+s9NU_=H1t|s$x$qk%1K8rUT{;0GA0ER% zH>2~CXrF$JfCV5-ZI>dvBZN2}!_;iYjjlopH?`yyJ*51}e*DLI2bFMujkoAYfb*)f z4?7ip^4=~Gvd(mDZOn2&H%GvO>K39zRym^8;0amfisRLz@m2GXXeKvN3sj}ndbbafsvz8H><*LK5K@d)(Od7hqVuZ))FWWqa5lQ8IcbEERzAur4-H*A|9X+ zE63UDlYK@6?6{JCc3S|WlYwL>t0{S4_)LO;uej%mdm^HTKyyl&OUG;WVE5Zw2zqQL zk!!G|Fo|-5DKZ=NV@I{c77Mfiq@zB7q&<$D&z_JIBv_A6q9}08sfZmZxj8Acic>uW zMZ>wJcThArh4H-QFK(3Trn)$@)x{o=f=z!pS8{nJw=58qRUYOTV=j>g6!L{Iaja|Y z4OxpQ6O=yp^9WpGt5Lc+cM!MCIt17-Alg7^o6;t4Am=G|thH9P|pwB)&&U*`grjrghxx9c)ttzaz42y*twI!=wDW|=2T4XhW zqmyGb;XFB6vD9g6JZOg_yHgS=cmfHe>Y%CK9(FW7UQ?ndx8a$W-S_g=!eXD<*osAD z(3z#)uatM+6282Mvmbq ztR-QlYa837w62%1@oT&!pgr*SR6yG{qu{4<8?b3!61o4L&gg|{(&c`zn0#=`InI>a z2&|^<>gTbxw+;&4V;U!10yYBiizyUd;=PzVo+a9`&@3Z^?jp;QqQuA=MC67FWaBJ6 zs3Sy3BfI=a;a>5yxD=WS8qOm&d|Ln!9`7iW(8R;YxEEWm=ZgF{md`_{lRbSIP>&#+U$VOY4q6T5+;8HAkZF& zu?KtLbP<*09ascED!#3|SY;fSWT(`4dfua=92uA?>Zllmu*^UDF9ky$b1C#l=@=yyePf9^4B%Mj^3S^Eri3x8T9D)cI6{G0Wl2M@4 z5EX=^0i}l67es^%nFtP1ARN#*05U0@&^o{r@f(%L*JKY>k;yzW5ZmUE2%g2hp6n9* zNj*jkF8dMZ0iZgX)vx8vbi^W*3fY#Ttq9 zjV9C`q^eKUp{1Z5`w9ytAx9Y&T+4T@;(I_4s_O=`JjX>P8PO@Sf)tgBVs)Yu%AuHp z(Xx!+D)cBfe@%t{tk7MVGFnwzZS=OsjYP^YuiOThNt8*=b`fVbYk68q;rE#uT>XDJ zHMr@5C-*-!_=Vqs<4|z!DrMXUlpX{?`k8Rs-{U>dMAzX_rG19dWZOqmupTo5g z-V#iYU;&+7>Dt)m&X#%)F@^cRBqTg|s(o)s*U{#uIes9;^^3ex40z{PtaRf%IZ; zDc2sIfzmfdJv<;RD^*e*0-#Ht5O>I{%u?-Al3FT7YZ`UReS68$MG|Y}CEj;FQT4Lj zhGmUayoWN(g~fnT$Rcp!fJ``iwdk)Fuci>BS4N8aO? z^^4Hr5`R;DKSfQ*HxnH@s6e?i9lG8{nR5Nx-bu7Qe#rDF?`uemi8MNf9 zT=Bz%-koQo+QH6p`(Y;Zy5nBiUpj@kMJF6B#~{8qDL7+#usGXvBPODUyVkQEJb;Z2 zC+rq`Hw=ZnpN?SfwSm1`hQi*K5$wInuy?5f9~aDZju1j=#7QbfVndvyf=-Va1AhycM*$P6a zVkxtYxU3C)PeIjWD6{=cS=hd>MXDzqw?^ldBX``&?Q<(nyFhB}$; z!Hm(s<>HKR0snurT+i18I^G9^TXB#nrsQI^p_8zo3w}b!!`)>DC83djTj4x zoMTX@!>d?ZlclUovmIA8r#NN-h+HWwz%5w#?+D*fL|MTw}}3 zli4!sSGLS^g=9PL8m+TOOj=>DydinY0|OC`)fkvrMP;aIrq*a*j|1j;Y(u@ccBr`u-lI8&lGu4V z(a38*H2?_B0)1DuCjy!Sa0-{+?;^(J(^_8`&gg!>63RvQ6_|UADAZ(_Rne%)5%fFi zRMzgJ^f1>{V2^=%(ys4)?KgKX{o=z$$*k9En;_b@ zxby<6CboI)l?aUTB*REWQz8`l;2C%*0J@x|?Da%`5QeZzlXWzXYmr84GFbW9^aU)Ar+XDiQzH54g8x?GBFlARt-3XU}D zgUPc-ytWfEfdLc#_zxGt+q@OIGf7q-I46uc_bpm+A^UwE-B*|wHW+P5l7PmHL23TsQR%V#ojkZA(CF|8EOy?j+ z!gebJb%d%@9BXdf%cP2oE$huv*wlBr6t0@6L2wyEqXP8F$_{@2!h!M}y;uH}NSX@n z1>f}QoBTqvJ7DqL`?v=U^VA%z*K3DN0OnG}{P#pkUgZ2&d1V3o8oEMR2JY^OHrEtDx*bR8A#-p}45%FzKGk&=(d5nj(#>$+ji zCZ@5}jgfT~#UIR-Gl7ew0}`d$RqXQph&0-Tjp=WGBqEFofOQQ9?Z?vd=^m7)O^)zmIyj6B|7VCYn>;XB9>$PhLNo& zbP8)r8*Fm+8<~cRwYBk>sqwv9*E}rO!)85fB|I4puT+4@)WJt>M7fwGJKpMZWnEs~ z2$aG@H#p>tbV1v9O#{ip9}vOgDo*t+!K9j>F)XFLd7QKp!ljyYu6Or_h^uxVsV?O~ z-^rZA15&F4I!C~=2Rm@%GI~*RHcIMKUPs}dspI^pusSBP79y(lp*UNH0>r+Wf33En zF13(y6(>MQikubsBxEs6e!7sq(r)v|ZG67J34Z4w&yEWM#e5Me9qX#$u@6>0CGJ|3 zdTX8IQ`a$~Zp-;$&UyOya(rf-1R>UxKWuRF++Pz7>viP?t(F)qho@GOD z^)I15R4kh39NS2pmtT&OOu1jjlPc+jq9Z1Q{h%C9Ll@aa_v4Xc~vTGyT4BhUe9=fa+8yb)27}s8>}SgW}nlH zPsMTN5_ex2Uk1e7edUw}_yDt?nef}g(eR zoS`2Z3pDgp>6UcV`+1bKPXM6z%L%j%2<5wGqH6q-604gp+jWW>`=s{jto!!I*3;lU$Z*DIj&XK|% zX|dN4p1Uk>ax?@uGvTUUCn7EFBC!lhi&0M(<+0MkxBq*M2dpI4DnJWY_CoRY&#`VGi z;1@)k>MTsRU5!<6?!mF+F;N|ff-pth9tF9-<{lQlj@??2ShMv!WbkdpGCcn>3w`?-p?*Dy5XnO3J1dZo91k1R~@~v0InIdN*<$%E3gV zR(mr)3~Gx3(I{5J&>7KM+Tx-a(OTN9WGQXZ4_}xNalw(Ul_N#e65a1jYNq-uh80N0 zi|RA|2m1OqoND1t9GWo>4~Bs%{Lj+IOdFPs`Lbg7ecAFSme-^4x4H?`MCnzLm~FC%R`KKUz1Yu8p8T`;R{ zQ)yjlrCn3$e$xFuy`J=XpVnzL(vxjt#Pw$}2j!+b3S>(7LuY|Xf@H+4{s$)BdO>ono*a2C#D$+^~Spg-b zzk8tsd7QMhKAFWrq)bV`Cd_7^1@$8z1h1gYv@o4-!U^oW@Mkas+VzkMh5BWYP`?+& zpma<5O;kmFR;%JyU;lZKJ<1=nIi{~u=2yQ)<`w+eomxR6Ymfvja`4kR5BWFHYOKwuL&xgY{!Lv z3~+1s(|Zr2H8{<92NyloTO>MCMACwVfl_8mAKk*V(Z%A-H(laG(Tz{R5~nV`S!p5| zDZl5UMWPDqLLw7|2GQr6{sSilx}$QjA19;Ipp-QJJQ)(ov>67FdDydj@hH zAe+m0+&j-UBqBb)_zp5=h}Sv@Yr(xV(h$gQ}YdFKw$j=g$wwU0u<-b$xbSP zntRxv_?yF`PWMmWBPy7FxcO3nZwvtV@^02HerfD=EDw$_=FTohcOJ05#rpSQ_CW;R$-QE zeHEL&;$>KcZ-H-wD{|UHEi5TNc|xzKS#Ao%bN zKG3Z}Vs98+cekjmUE^&SUwAObnuQ9J5sN<~5}Vdzs(0qitnEWlU=)*t+D`1!+OUcm5au!0kNAofokwe&hA-7P^0i%#Th@Ej0P! zsl&2~-4B=0*FCcK&rRUg{dW^c?*8!W30W_v#rft<`(<(d&=4zYm=@>B6~kLuyT3V- zy>Dn|>(~3r+A3u2yFbUDhPYO9xMc9+;UQ~;46-#NWJ=c+!Wj_CplAR55qBH_vc5cm zEQ=@!OU`kwygiiIz0*|{S=;vySug(0{xcYTA9_9QSudws+uHr(25;`ze`Hu+~mS;OT9R}F8^8sP?aVKDml zj~o2{0g%B9PkueEte11o>e)Xsc=iEsgFk*<3B@lbvX<>1vYtBtWS!kTvafR79RN4jJF>F&Qz+iLf5_T)0LWVQx>{K;C+prL zp?Kd}_eX|6)^J((-r*tZHNv{ToXA?Xf5_??g25Orvd$hJ>;4)+*2~EaZrwk1)5Alo ztl=^kUl`uX8euSYVKBDuAF>`l0AyV-f~@^yFnTuc*Ll{412`!@@1P;;wm6Q@iUx$b zlHEzw1TIW=yu;itFswGmFuC8GT}g0woRsTt^cQBosQ-d<%XPE4AoZ*>>|SVc>gSxw zjnJ~3=D)>fnm}v__>qOd-(6gF2W7E7V)0u{Lnz;yvfR_g+0R|laB*xXp_c7dzAFbdBN#p!mzvRY*g zgaxPt%W^$5BO4jajk9YZI3dPb#~HzKR?OX|?y5^?;T^cK3&|bIW$wD6!(x4>5#yV| zVX=0;%NYobgvG)rYbld?FJZCL^3eWsLx#nYwJz58&KU<(VU)F(m{_|(-TI+Ww|xY4 zn58XbRELMU6JHV3T|X4+R>@x#Q@fE>H$2qs&TI80T6NbCO)zg73U$99S#|rg>UzRg zWZCr(g}XaOaJNsmE4?D9yLl+oJwAfEeL~&*R|Iw69}0EbMo_m;s2l%^pzhY8P`7e~ zPuVBb9b`UbH`2kzp-}ha$g0~X)ajy2yujo!C2tqGhH(ud0-?P82FE*o$ppI}4u!g3 zkD%_=ggT^yM)|$>yD%t`>BPLxo_?4)a;tK_zcPX#W#L$eT4FIAb;aaFxwP|Q4B=+@ zNw~+9pXRnkJi4TpVxIN6NHawBoD>kBN+CmhEDZB?b^$WhD7S%mYO_=h(U=EY3)!u= zYzngfBU$$UxG0ECie-m~sOBnKBD?dl;8LiQnw2sYlWt4LQ*q1X$IIKx(vK*OH@xzn zR2m=WJn%_Mk~U|jQP^^B@M^3#wI&IqKG0{Yled*0qXU~Qbf*IdJGYK2nJyV%es5E z?&P$7ERh+A)G3$=Ka{l+eN^4xu37YYG<$Md7+a3Bvrfy#Ey_wn4^~8CIiXU3OG;fH zjRUy@g|q@O)AjsAB=Zl|kF~f%LKxwEJnVxi5XDFpN(LG6SkNx$V?;wC4}i-eZqhjv z2tP`?P;Ml!Xrt@DZ2sv9#eB#I=pG$uQi+q(CTlZr@0h;4Au^16ly@s}Q}~9}Y;EFl z=&%|~%^aGePW>}Pxml#;666!g6q^JPQnXKekrnR|=hdmWK*~FqKOKaUdpGq9x<)Qq~=k~=;zs1-$<3EHOyI14M)HZ`EDN*y{i5Y)OxGzTVAU^dz*5QvbtXczu7Zu)Yz ztp&@K73i!;yn;u?VH5`g3dNdixM?e%W<)$qxqqTkE~t{?S;W~FxKuq`&Yv_Io7xgL zmtLpamCHp6?O^)K^CIuR>34DT)fjBM@E!&QH}0-gthc(U%zygCs7M!X(F1HSo_nWV zFbrm=xuy#fqK;f`Oga4R@B1)cNUr}EeW%|?B@J=v*HsGHvWtiVGL<*n$=9RwM*diw z{x4Rdj0r!2n!Ogz)-JKoAo?H(!T+!*A5qp*xTY&Tk7ZfvzGjKLq@pf+%0W{0Tu#L`=|@^Q|0!A(@n-$et2C4HiZi>~`D zv0U_yy}eOB%NB*HnIB3vGiv$Vn8bJ_rwD!F5#gw|P(+;~i5d&D7hjBz(Ny7xL0z$q z`Su|dd2bV~pzM<0-B$x$WSwHltRg$RnJtCi}=xpf}D?Rpr~oqhHO=J4B+Z~T2Fz%JF?)}n)!sC_Ea z*iuY64JbHe8jhhhbGBzOSCWuqH(7GteC-#OUaItLmtL;)T%~neMOfKdPIU0i=M6Bi zwa|1Hz9SsZ4?D~__gd?KihPd5nC|47zpKEhJ%?AqwM9(K;Uv1Hhch`ya6&Nr`Hih{ z2Sr#3Ai(gug;&|Ds=L~5d6`P%;P+Fzq)GGbT#mn6bup zxS&Ux(q!sHE+hs35s-H3C{9Uj|LlBqnkgmoSSLJbJ=Eg#j3Ye)UxTO3L)HGFv@!$CS2=FLimA1aLO8O&TQ zB)@*(+K96AARmGu^1&i$+kr&i07-~hxZ`OT=d7Oi0kIW2bEOv@0r&5Y8NPFU~!j8P0YDzMJ@ zDLH|e*l9#sfrXPv2Ou{3yJtqH1d>d2_e`?eyJwR8?ird$lbV}nPR_;?`=mKLv73=h z8-&ef?#s{vmqH*PTE;@lu;`D?*#dj0OY36!j~4sNIF^73PKepl*JxL9(MC#BEn-Kh zYVie_W=gS06)}jEHnpa^W#t|lPL}I7oo+7uN%66c`KEaEXY3r;6n44J%FgLprV2)68 z^HqC-Ld~7zQYTG~7plEJ0w3yk8KH+HXRYAMZC65J=KAcb6Ji3=_4wpM7n_dmD&8Ek zM?F`#xx^(EZ4N6U3W(}Rr^ zk*!j{e(M+kel?aZvL98Fb8I#{;M=2>1O$pSftlLNLxc)lPy_A>1PHUwJjy~ZcBsTE zkPA@~D<(urX!J5*e(weZQQ8rm=E@wBEuilt;ebff7Rk;kRO*Mxyq>dbqlRci>qazh6 zj0QWH&HPMkYse;x!9^Gk(=eq~`P5s0OAEk9k2I`|mvC%Rwn#zhOuAMctH;C)R)Uyb zi{974PlI+d7NB;sAlvf2K{5KE-%>>(+7*DnLWMmLySoEc6?`nJY@^MkzHebgc6O!?g&Nqwlc;tUJ7>;55oqi=$)Na9t?cle<^$-!#dip;oFcSH%oMxk37Xb6%_frf z?A4EgWa)l0wgbjB$}YY65wa9CI%Bd)7o7cKt+K9Ga=TS9s?7Xct*rB{!YU=1?<@8D z6RWU7$<^2B3(J+{3(NHTmwq*e^;;yJfJkcg?COWfTB796Z>U0#k}XrBGx+(vm0wJX z;-~X-r!~Kj)Q0PSP2mNkSRYXGY@3xmkrZX;tHesRJTHxm5!=j`0Bu&t#AZM(2OC70w&Qg=bmPYv`IhG`IWc`v4OUGd8 zex(Hs`5ToMsDMT9D)WPmX?3et0s^*J+?N;XMT2>w3Zx@h@gWMC^11283cuRnR(U8o zG#TMsByw_Oi(FZ|zj4V37t))qm$JZxD4=14puC4Pv09NTx<3D_D|>H$_6y(n4jhjJ zj;_yb{>*=Fxc}_mYyj&GrM3wSeczIs*anfK$W8?06w8_*6KvC*_AQN<3oP`9t% z5M<|RX&w*}eTxa$Dzg0zK9HYQ#( z^ON;02FG+Xf=8?p@Yvl#MFS}YGJS|MiE@LWYvhx@!L7f_8$?getsJyl=*|MgQm$xV zn%nq*ZNu7sxs|DdA4UJ;$M!x^IYqoo$smOaL(G*a+l=E1j|ke{5&W(4CIxSs9{iuA z02}>+wqawgU~f&QpfHT$QIaR$nF0(G-fPfM0=N}zyK2)2l3oo+dScH=suIFnTgJ?^ zTdy1q%>PQTL=og}L6YnnSCfUTSHkwuKFl#%wB>LI1TO>byX+;{ufc?Lr*WOYpr zMwrYBw6MJ%N?qk7DB1|lZpt@E9}M_y(|LM?sJF&}Z#|R+fF4WBiR~W=$d-ahK%FiR z323J4w?#Ikw)FAIQdXLnd%~P*y;?TMSXHF}#Hj{w8>QsyXGmgT3x=G!O00Aj-8`@p z6PR@)EEeE44Vtd?5jhn&)yoqHj=Xp%MqCuXO3T-=2B4C4wqtQY-ba(Z=rof;;U==s_xk_x!$v&6wr_dx}!@I-F}P7 zzmJw;9++;>l{SpX4Hhk*3>Z!x`OD3UQhVUo0|fl}pnG6>aW{}Xw2Kv`@Y=jCr!cnC zs0E8_aO(nJT21vPH3_!{1=ZpA#ips)G+&HEqV{N}Jxl=gj6$a`Hd}9IAEg~q`YU?H z;#%{+co2g4;~v;5c;YXQi~*b@=+ZdAO(mat6A$Z5i@{&X#_FUL40Mkjk1wnZ+Yk+t z?-TW!>2_~^^DV`5wG1O;{5WbNcUzLV^4P|818-pBNl$=t*Of1tEXE9mN60vs$;FFY-)TWK)M$b>k;Bhz{VDKI@8 zDkw@J=v!SCX1qN7$ZPELweZ89%hF)1&a3KFLzga~c;cDda)YuO)kq231gAH^;NeJ_ zyf6sp005L4!B_^)q)9_D@Nr3MO&%jdj?5Bj%1PLUljZhcSGVc0C@g>nyIzNe3*1}5 zdlDxz2=oG`NSE@~i#5`iv@Xc6o^2ieEz7D@Vg_qmOo73w*-e@kzC}&z@xQxyj@Ftib)V z+G-o1YA#ipRgU+3-LLLtRtI#+FC*+=K=4t}@X$UbfeR1-pr8$eC&Jhpc@a{DqNb)_ zdjE=5@SwJrObXVR7SAt1oYGi=HXB)ZOPG$@acwDR&G4lqwn!bxwU^R2y6H!aWdmw# zvKlDgXmdb~P1PDJ2h`y5F1~@jb8wA&t2Kg5`Y{&qb`?%O{RY=GN{;PX+nVKC^b(%^ zqK{crmPUza!nMk5q>N;5mDz+wQ6jnW?`papL=F6%$Kew zKoYB`QC(YAji#SruwXYBSx3tTzLy zBQW~Wu(3Hajjrh>i%}}(qr|u|q*rD4-*Nw!KC!@xUDcia@a7#a1Pih&e|z0Z*uc^M zdQH=lGL+L`fJHVCjO5^vyzncS$Ya^Vh?#AHST7!I!xTxu%%*^*mGZF~sLN0VL#N~J zw0_oD8O41{q9kI)jz58l6Fxz{E0uAmkFjc~=iWGIy)%mc^R^#GPIS5Znt}N);e<#7s(> zkbVJ59WkM`zNNp>V_J92SO>25in`<~2`BV`v`PS~Rj`|;Boa8#QKpJ|P=y86)U?Ih z>_`(Vg2-7qOV;$jPvm;wJ53L47o2mw;4SEZ@61>Jok;)ffI?&AsjJ77U+HPBCH|&W zJ+Sj|uF(U>(*1fpu%*2oIP!X6YZyJSJ);NC+jQ-FJ+LTPt_L;>=Jmiv*}NXu^1U8d zAi0)uJ#f`>b&wtyfHen9x5oH+J+P%r4{U@C=jbuC=Qo3mT46PMV0*~*!1j>qfq5`J za8%Lrp$E1eqX)L0?m^QR)#!o2&u;XU{wM##2Adv-jGmzb1)`}u+`$u5zKmET)^8&_aR0d^}Cb_TJ zojmmS>?{!^cT&*Tq8HEzdvP~*M_hKp{{74p(MFeh&e0^cLFG95)lH9;5~9%AvN{+T z$w514`9~jC(PB-}4dnLzoBP-cjz!DXR|=>Btj=GMR{QEouFL$3GFR1RE~l*@+ZPV& z=G~6Ny0M>jJyk2`z~X0p+$sOe6cR%KY<i%m`E$59iZEjaMjz1?1&q08$w2esF{V66M?$C`J! zy^ec^Z2#9LCy|ij#3J@`r8e-w#^CJbY$-=#$FLA`W}t|o>?4-PO?9YI^|n9g#+1R5 z@Gh7lu$9Ga&9Qd5Cb89xu%h{Kt?o$j=e1PXW>3hs5?7HLWKkhC6IK&;_ocG=VkfW^ z(H?L96h7OARm=y-3Xaxmyei&}ZYJeTs9K!o@<&UGKmfL~;8K)VItq1=lmyhVis<+} zE92hhN})0CyB4j3!l*9vCpHa87FO+vH4z1tHRgmIeFi>M5VYC7K*}gPQ-2_Kr{eel z_)~GlqnQ?EXd#m+WA@Y|cZ@Fn!G?;ip)FU_blOTcQyK=zjimJLnppa1s2|EfVO}_a zp|00ym}4{efqfSm?0CRw|7cI_3^NS2!_KF_<8Mgv_QT*4C5d!1yr=1Ghin?3dRJuK zp6hIifo)zJ%@43?)RdG>W2jllfk3-UA=0KUg_zqKb;5`YwrPyB7^W%fIscDA@~yv8 z6iqw+kQ5oJxNI8f!(3p9ofu|74zy`B?HV0Mi{xw?!-`EKiqL_RZoULBbWLsrc82JT8Pmva)u#ABb4L4wyH(rpvEhWEX>W*I^9YE$ zZv=7Z3ttt8Gkgef*Tqr2zYaZDu1^Y9JB0{heyFSQMB{zrAjrNuJ4p48ORn9!iF(pL zsoj8Ezubu=8b9jcvKVH%NZVT3VEe|3O3^tIT~VPzL-?87R?^yL@s=B$NwQnMoRr)4 zg1HtnG)1?tI^>sq0*jb=N|{B>i7pSu{3MqLW4_SkrBg8uuyXA>S+}|qr?Tn0%*m!L zG3s-}Wj>qyK<(hOH%hHn6x+fHAq0L*sp zXZ!cZ>iw~`4a{=|=J^71RbZ|)z?LnRNo2A@_b^n|2qyn-u6#*3N*>kJ!)3=Scr_#j zSl}tDNNI9^t9H);Z3Wa6KOzf&rY#YREIyNV(yT+h5S>{Plu3q9zLwL>|r)$H@R=@h`V=#1p!Xif#g}E^qy{H72C>+?kn;6Xy}QP=X}iW!QcO-h?O(C6`d1y*(N#{VrYmm1 zS_cf68wa6O14f1R0Yk+-gEh~`p^}yw#YWH#HSE;Dk9ef2;GoZ|wz^ge5{kqD&-v)e zq?loJql+G#(Jk5NqVZ6#RZVN3VW^C*#%edC%YnvFqbq#KH^&;&=(@%&rLi>vkR7T8}0(d&<@DREu2_^IJ1K6Pf6zi0sl-WCKNHuBQA=5)}Qdf7iYQHY(od}&-&m-k^s zn(3^A>Bs3VYh$pT?sC4~ETmT1Zf%{w$|}yBy8QBi21XjHiTYM%yL&G9+2(F`x+>6~ z8zALFJJ3GYo`zOmn=)WY!+db|3&xt1-_7D#STw z)x`Rc^cadGU<|dY@rV_{qE+t3st~c8vm!%nVa8eME{N7pJ zl9#f>W^sOcD*nw-Y~&yO;+Uwq47UQYzLcHWJ*qA$#>Fte-~pI8hzx@4;d^^8t3M4P zDel(eGmm}cvbxhw9SeYkno>{R{>9JKsZ^o+2vvGIbY+-N1!es4A@upkYgCK4C^(}7 zYVEhT|LV&6qtqCe^I9&2SxKeS0kr2Y@hMqp(W!E(Jte#L$xsEEpK>~-8`5z_tPHVQ zO>6yC_oxlx@j;G=+Fwac>8L``5QRDfk}$?WYpF#CMP|1NbkhS_a~Ci<(+$^}Z90U~ zB+Vxrq9UTX4ty-dxY6vmQH7{J4AA({Y^#}N+J(RFJIy+0*C7H-c+n}YQ5L{ID-$%r z7Ydu2yi)Gy%dIjlVQOi!Q6XAAB!Ot^!gHYtxH-WRxyfRLMT{gtu2>%4@HuNIdEzvt z8K24UY^PhQQ!%i&Rih#BIcR5W%@(sBcBCvkWvp2z)-!*@WX%V3eoH69G@2fysWIT% zgn^VPW$FUFvYxn-D|`ReUD=!ca&^taQr;w=xqxxcwtP8Hu8!kk#nZ%#I?{Xqa7V3# zgKMu7Vnhk)1@x|Bh#|9#hOEx+fd>y9o@aF&r3^rO-Ke@^Al<7>qWlP(3Sy=P*S6PA zmkP>UDLyT&zX}YaFfa)R`lWJCZs-I9hI|Q83Jzcn#kfnvWHYVhj5y%c58r5fXl>~i z7G^~=%z0(!BEDZj_*okv5Q%`Sxb2pMTB9oD)HoSNGU@i}WjBfaY1%kZ z;C8)(AGu>fUbVf}F2g*DOcy<%>f|OifKmj_Wb1bxmn^MzT`I1<4Amt z#s|z5-#saq-Nt^1q-`7lgs-5qGxaz6DQXQt5~+q$pr7ItAYYpL?G@etUo^)X;Axrj z2IC!XKsj6k#D%j&a1|1V0NWsbfee@m;HEJ#8sf*BrU$e6fuoqm4;;l@epsDz_@O-3 z$t+ua9P4COTefA*Q0#>ib+KHt;3(?d#$}qnvigBkWW>L@+;GStM5RW?ZIhNd>I4?{ z_{OY4sm@(8G*y@Al`A|qH;r5ct#sy(uBC@qD5x9nC-amk2IKEG5fHL-)b>&Aylc9 zt!WN~poIW011h^VkwC1CHrcwTh3UZt0R}<3LBE)yVZsnd+}y^mNg85)R+-$KW@0)0o<`g7xCP1-1QCiuFd!-Coonr-IQfMyVt{qnO0MXuEYhx^hZ*>Nhja@ z$#vg`pJaP!4}$EQ7Y};6w!k|h#t!cQb4K^5D0G4VHLlsR`Wb{G8Gx5L*9o%6g40fY zH|sQ1d%S&`w?n@uxN55O16N6_(dvD3OYbuVm3vy*`;6f5?^gCcZBSVUkspf59d%Ks zLd&zS%E~A{JjNsG#{Av|-NlfnpL;Plo)Uq=a)`WOv0O6idpAG`J^3q}K8)$k7a6*e zmbjZyWG$9f%#{9KV+Gb&r%#( zChAeFHNc3vF<_{sk!BcD-XOiGW0*THIY#ohh$JRoge)<^U#LejWM>cxLq>{L5xA7% zO9Ab|2EkpG*`yGd`Eb=04i8VdSC_55%(=p0C@cmCl)B0;Wer+ht5h#qAtL6xy22TM z4=t_w!u=TQh}GL~#bV&T1LBqd9bg-q z=+4YJY|xBj6xyAS3a?*UnqfH$p|fhQD6>Wg7~opvnl)Ks#( znaG56MKm1pDy~+N97vzY53DW%Ag(*4_4%w_yBGYmC|MS^u{C-bE)ANl_DrUZ@g4Eh zF+StNps^1!Uq3Y?Vl)+($VH|T_szaJ;0&L6W@q>qQ`p3nx4D~pjFeKWg4U=rWBisZ zT_pV2)^$GT^Vu$E_z2i$yTfuCDlQRLjYusU4~2L21tby2I=pASxikE@a)uA*p*6+^nmGo!$O8PT=CEXc5&FBn2c5#W6@6PZYFgn8*+BtuK-yI?rtO63+ z89o?swk@LkPDip`(zG4l)9k?Gdu!c}@4I`4iO?kZFOV>0bEYOxkmjrz{Nse|K@R)!7qGX+CW;l4gWNj zqIGD!V2Fs)fG!A5%i65g@sIYS@=UL^G|j0Zp}fJ-Cp$Y+h~o@iF_4}7Fm>h2DPht( zaGUow87UcPR$%t{gO2C&`AiohlXWKCKQ+?KhcLJhauJL~ zw0-&CS;$ePcPKrZBBXmhPkOG>F7VXZ)KYMx69JBOHQ&L27q>V<@5OCWBrD3KNW{%% zg(Jd{*7PDz$B~a@xz_tFI2z#WbiZ?m3fi$k3EA6*0OpL%Vk-n$;$aUnWLs$XWA$$j z%j_XWtMoFrtmn;E&O6|nHQ`OcXO)*yd5bl~0S8eP?sjPv77t}*)CSxaC@?lF$~fW& zsD2Lm&pVoI7C)4xhq6jSeqgpN*)bJxToM8V!)Cd&jTg4$Tw{+dIbUqAD{#`(c#Tgk zB>sa>_6Z`N?jhap(~GBC6cl~Bok8)rDU72}w!%C542KmNz-7x<5qNIX$5G9$R_abt5YrBJ2dL5GNAX~vu(}X@3D9gl zh>ywr^R!|3Kz^jgz*=)6JRxeuuK;a9)G44l^MPS|(JmQC9YvB;`iJLHgo@~;#fM{e z!Y4PLpe;`ots9+;g@(tzZ(G~C9AFv|51AI5I5w-V4R0e0Hn@Rr&ST)E#Y!%>@KP`m z$+s^y9~Z5%ab5$(uFv3;k($n%#F%ouo?E4aNgj@Yt?1)+6@A>UNL`7O=Qw^WCO`eS zO0$b1(I@}0SdB>*dONc~gmHQ>O&Qw6nXOoWCTqCbN1Hikj7uKi#YA4%ejeHeL&q%u zPGx@CMp-?4Gq%t2@&@>T8qf!5SXy44EL%jMy5tVGXH=&M%Cr_kzL0*&10Lyd@~zLp zz4*^a+-4?5Ac*cqa-6*91L|RiJGnCcheCXn(Xk?E?SHXItHnnbGiu4s3!9HmzO9_C zZa-uC$F6hgFE%T7QpUH~%3xh$Z%`}Mi5b+!Facz<|MP4oW{!2xWY3Sq7!(Fn8;(Yk zr*w84+fx6x{z;;8($!}P#HHTzd9rr;@y>`dESL38uGzVko*H>(B`$1DE z3Mc+;+Xag<`KM&tmtukW>F$caE52;|(nV#W0Um1;fN2X!ohgn@5c5t&cBlx$tdOHP zpDtY_Mq0@w7c3IaSoA^`KPd<9B3flpIyWs&=S%Zvc%^LJvzfQKDKTst+QFQ@+ zMzIu_3gM}odtdj={lEXjg4{+h>Wqa(*2-E`h!EoB>-dt1#4^j+aZX0EQUa@YZT+N} zgyx)G6;Ut+b9CHDSt0q(F)U!;r1LxTW!+q-;VdHfAU_0sVRz&ILh{R$32l4|5(ruh z%`W#j^Y7QGzeN<5i#h8Gx@oe?yE$Appv>NYO;p9qQeCeZD!|po33*{cawbk)Ef6tD zP!cPIpI@v`Q+wHMzYR>yt0!b=&nN`hCr?pREKv#8rrEpv0_ld0kH}vS?55yX4^=Ia zMqHh2!i*qN_(N8b->Srk1Z{yj?66_13Cn*mw2Hd*1XPZ*Lqs1PV*$YzQLz1S>5b0@ z8Eg$5(GdpcAW$Pg2{AXSz)_MY`6HBb1|X{-6&A%^oC1NRbXo=35T$#nh0!zuGDll; zqV$C5Sm}=#sb;pAFnP43aicVvfv?V{j}YEgAA%htM{y>~YBzQ$+q3nFQ^pxYD0@+`dN1`R(Hdi?y@a@)1i0y?UtH_`G`vK~Z5wNszjK#mE^pB8JOwknpjbQ{|d z?E=cSa7RKO9WjksK!8$C$!)I~D=$yQ_J<>hOm8G^G!$`craZf^1t+A67+09e2=`7V zsjedk*=ooZ(;x(lDTln{QLTr0!^TX5TYkk37#s%HxGXw7+kDX<2|1y$)0APQ0GE~m zI5Y=F;;?FL^~7)!+C(7QOR%3G>Y1p4If$Cz`wnuDSz_D*E%a>{FUrnjNa98R$~xf* zUo&GVJcph*m5+57(A5O?CpJK)3$hn%v-V8)-1)wsac+yE{UTCw|KCCMr|QB zkN?@4-9Me;Cbbc=nlV42_oeb4B4nv5L{0LIk5Rruq7E+EG+p9euy$B6I=)28(zLN3GmqoEvkeZImN+Ds>3%AKvBF&fW91pu&|3|- zG=l~)o|z(LRd4mJM9LERmZ3(<4_F$<4~m9Xewv&zkdRo1yd!8MgW-DP^x$ozfO#T6 zoJPYq(!4@qjrUUz4NCIkze)Kjol)ON8AB>K%-Z>y+^W#Iw|QiMIjNKQ8CGcPi9?3A z&QNw&FQ*Y{TOSJ0NtH`#Tuke=%5_1l*N_zZ7EyQbwKTg#wQd$)-KY+kb1y08o1IRJ zcep{(tC4k--k>xGjY@AC6xEus7HE*Q3Ue_Ncp6Pr1sLL^X4`~ z_G8ptORrbjX@}gvzO_3`Gwp=(icBsm+thIL96dwSsb|?rHNf#o@@6~r_JzFDnkZx1 zDWMnY%tExhg6(zgssB5e8Y|m|M=J6Ake9HoS(^;CktY_F=!cXI zO%Fw!Fh>NmIQVg4>KRbs20B5%%MdO7G?<0DlUohI${CfDZ`nfF|Jwqpq1k=E1%iQq zpzRS+vqxfLFjv`2*jva**;7v%6c+}zl03+RwEBG7AmGzn6{K@AjVF?s|FoqLt(`fD ziwHyPnf&XFrkzjPN3?ypg;LNF1y8$1gt;{iL#cD*j%%kC+Ib{Hvmc9JgBs4}i67ic z#4=&Qs=9;%9SNwg{8F^hZn<^uvrLF;sWq`z& zEY;~Q0by63DT2d{=07eg(Kn$nYaTR>vZdE5J>TW8SNbHS<<=Be2+ry1tGu5aoF>k| za!UfX7ZY8Tc7EV0VksQ%UHU6Uz+E}y#VWuGN%XK{%OrjUSjP_qYkv)_8*5rz$omSWZjWt^OO~;%1Md@uyCt1((C$^Y5J@d-+FrP(7Cgg}e z5Vyr{CG}j~DO#oZgukn^46*nc?3FNbEO9J6!mL5eP`%kcKNzqhYpx6F5w%A}ae#DQ zrwVa)Joh$5VdOK!HYi$*jHVAis;rh>rIe`{TKt+WxDJ2-HnxVe)D?6!cHsic-ok1S z9klbEAe+r8O4e|U9wEb!LaATd=$tL$wEmhiSXK@H=)@Z}YF9$hatvUV+ThgHE_F4Y zsY)s*q7{0gg&r$_34%>Dk_C})bn0h1ST{?U&6V>BR9s>5^S5X$2{8^t?YK#3TbO|B z1ScQ-_E{Wt^g8$HrX|GJip*Q1RMhki_|6Mts&Ni zTr}<`v+$97QMj*V((8j#?yvD_Dfd?amQFp?&k6CiP$qzrf@edGoI)4zmzB|132HPY zdRBOVTHCPzF%#`b0NawS%EzW{lUhey+^AnnQu_7Fu&viG*w9gc9WSscu7|?(xO~Nz zUgDE1GzChcw5$e~Thf-=N|G5zDo)V|c*%2=QXnUWm)}h$6Ef>aZwQ$|RSyxVGS4k% zbj)-`DzTZbH|KbSph5J6R-<~H<=Ppbx?r2ta25_@)75F7MSXo`ppPiVqGJk2YC?F07DKHrP(iU0sRh5Zz_Q z^JB(e$vq#`0KX$-*AyE*X!OaH+LrcA>0)m2u?}(9#V(k)H(F5#^MC68^3te67za=l zZE?;AblbOaxW)$*pbJ`aS)Wc2=t0se1CZ(&2d_9h=z-<1sLH^cTx-?5ajrrVu{UZ( z3bxn;*KCKHHxqld6PleUnSzvVFtUxA6nBf1Kt2HWlrjq^5+;Na0dpcV@64vF;+QNv zM!&60np4XKlt&kP4yx6VR5@k*%3Rgr$`^!PoC~) zCUXkocILlOT($J8YBmf)AjPeMwZVCCwrOBRnnL*}mk-0@5G2ks9*mtdzA#1>`bj4z2_0$SyZ$jo0}-(~eiBu4b=1W0#w= z+F67!^Q;zrav0Pm%5(kXH)ruV&LAt2XX<4UmW}0A)!$;G_lSuNZ+=Z+LSU-TuOucm zy!oJF;?IY@CNLo|UujJI`LLG;6JOh%jaG*?NR+k7XGUzaB=5I#84;S$?aaN#Oc2tuKmHw#4WKvl0+Uw$WG0^(z?oj2J z8&LK9yKMciDa{qDE~Z}h{25IQ_%?j0u|5{8E+pz5`PstZPV^kJgvATtzuUsdOgplX_SG-cfb-2&!J?sH(6Py(6f4 zb)ahRocco}64k3fqS`z4dv=8Vdvz?Sy`$=`5mXHmRp}sI#7nHAy+~n{V;P_1(Rfp= zmSjA!?#@j?w*Egi1MlDQSwjQmD+uGQH&z=5thh@rCD~``v@zd-2RO&aJV6 zJGWdyyNKb3G>j!o-{M7S5iRv81c)Uj5SDD{AK!-^39X!wmQ)-VvE5Si*6_RmP4R|9 zM9jQO1PV|a_}!~$J*IJXSUx?FDVq)~avv0L+#!Q<4wD%le4u{(2K%+4O1^NM8y{RaNp7Rs=>X;GgRW&YPGV0QR>m1z765Me-r-~JQ zHz{m1Qig;SpWrZCr;svXBdFoxQ?R9!l@#iH%m&5~98XFojl0ezqwKHEpjsvX18NRPF6(f+FS=S zC)~5;H^zjs?x<*T-iM?L=M^SwG6E*mQ8|hQV$+Ln^^RaW_%;Uh_{d}Yw@nXgm*HL{ z@AJ)hY-9ydAl$Kq3obYGrVXET@q4E+sTDW4+(-oBPnH|!WbJnM9C0HQO-I${mkG?H zB2B$%(>c#Q1@j#UjoPpoGXO@JDh@8EYx>A# zopKVSIYf|U3+bC+sf&LLE23_!3!uPsZSUr2Jdfn-d*FL)qc8`nh)Q7;vF2-8lSKet zz9OJqsiq!pEwTzDvLaI-12zt!EM%z7PCs>>&y2Z3nzMiz#9)@?gN9=1ATzH5&vJo` zI-L~{y~$&P(ypxk=%H4#J=xVES(;(DfmsntRwEN)nca{sXiOH^c$wCacR z`o3@h8q9G#;WS4o)ey4mlFz?c^V;HB^2vN&ds7O`fv~Sp0c)XbUYus4Z_h?4_0zJ>1KwW*xk%8NoIG4o*s%fMR8PZQkv=j(~7E$DJ%kYa{;n%wC!OdM>m za1h377ZM9C>56r>79`JSqrFX_AAebHW1_`c>{(3cOlCqbb1a5DgpSlHQ~rUQj#E9^ zTs4>ZbF4^0V78~LPV+B<%&r5J$B4mn({ZYQH!&JCbb_#iNf04A zL?K;~WEF9VvSx#qxA?ROa=zgQSz~|?Wmq!~rR;2(aEk8M^qcg!9IUKeuETsH&*0@W zTxB0Up{eQf^1HI_TE3@M%QkEP1GnXXx^|fa646DbWdby@p(l8O@>^ZL-r(uv>u_03 zb%e;D#s*G9Jy<)kS3~bbK=HZdu4Qw>Wg41;_I2;3ooG_P4bfShGpJ$8|L7AgENC<# zAX+9aI8dLUZEC=cJxU!qHDJXk@|MikxNS!3r*LZao&KK(Sz~hHKg+rZ=N=ZK>;M@& zKk+zV#0BQ6QE?E-YfXo~+-rE&@hzaNo-G~YGv!&-(4_xgSRqAju$J8x7I*eSy`B_w zI*0bUt5lKRrWytMHk+?fjvbqk`Q&vo0{-h+@;BL)ilf^8A!pea(X!$an57&033MuM z`VYTpd!*1G*%cY9q#y34VMf(#$UHW)@u^>;%xTw_YybTGia$K{#nxUuw|70+^ZZv< z{9wh`)7~ZGV%&7|)^99v&afaa8YMI7)DT0`nwcnEhZI)^jCswm@Tk9v2mKf5Idqwk zb%f;tHBm@zB4EmZQ9Y>5G7?pjb=!3DN5GL%REF4ABf0Bs>XEGD{DKSYwXMZJvAV6< z4Z5k|)Bm^1L2)$=NR2PEAjEDtt|*e*_7AX$Who_>d<=5Vn28rFGZPuOG|;F(AG|NU zVZt1?AnGy^li^&p;+#i=>~QzhKBc!l{*ZQWj>8FrY_9gs1&bosj}0GV$smli?jy#` z3SHz`-_4dR|5cFu7pBp&m4f&327LKu!3@*-qc8(2UxV6VYGpS{)@q<==*iF3G=xou zYpAm8XiKU#KV_CimSU!K;K-M#G5AbFbb z9iFOaUICZ|w+2e!)arCBtn5!^M6R_(uEe6~bmt4HS`q{BOwc9{7rk4H@E>odYoRcjzH!oU_;8d+2x~c^>o4wjMgxuF>77q)_v=u zS>+N~jLb6u#sGg9C=hY0$$`lr~HX2$B`^te1R5arw)+r;Z9|q4LFBXuID{ z6Yu5au1(0*N9f>IUBc0&g!HubiAzaJ@}Vx{>Bb1OEd(UdD_BCth=dz%s1J`;z6ri1s1G_OsMXd$~Tcb3VeDOQfO!fb)vE@)JA`3G3w`8N_Osm=SR740D`!F_J zOC#N;3KXR>EXM*Sk`1RBBf^X0a)a*U#@B;FLL?~@@TPFD3PY=L3f>V~KqR)ZzRHZCiZRhm=ZfEo1n3%E(C`KM%^@O@n}yN4$M%rIMc3arz7af4yD18`C?Sdf|~9wG!6+qq$}XG9d%ONTF5nex<~O zcrh9rZZa9&lx$cIr}s@b75Ng%(Q~U~d)e-qL4ueByPZpNks=1!1EJE~-HrCtp(nY# zRWCKqx{ThTX0N<3jfS# zBf+T6ox8R~%yfAuG>&z7(-fM(-eUE?*uBN-e<3NtmMUlhq4DL_0a}>#F!*uG4`fVq z%~q9tWu_v0SUa;72F_CRrbJ7GF+iL%6(_z3?65sF^(s;axMG{Gkx(4(LcfzT!L~GC z(K@jZ*lgSC;!X`@{!gO1XgylJW)=`+_g}lUfrJDBi#mCnk2hK|lssFXwP>fP&tAZJ z()iXxB-@7oGp0Lv`XdBMB9eyfhF}nis+9z{A)b|wCwIR|BWJ-6Y|x!VYO~9h;ke|w z|0xNF8z;H>QbiK6{va^9{of>4*p(6t0z*~Mr=qNJFaT&HXrV>anQGU!Iq!*qHFb@F zwpxvPJ!{qlG!VF2>tm$OaAJKVPm%#0l$>nK+yNmFv`fFv&~Q`N2pV1mtKkX!DfYA) z8noZ+*J`M(d4Q{-rm5HIYS{LF?HLW+KeL}`sI7T`XsBuGb&7^Ryl(^zuL7d<*|+Q& z4W<2F4Yf57a5dC4Rap((jbWTpf6mpysmMRntc0p;qT`DYT>LqJ_!xHq7R;A883nN6 zyyO1GDWOIjACv3fnz9Zl1@JFMRj60U`*Ng(X+sB~`fwdmAj0yYmCE=*(ImDEc~LHx zCNIJiMljo`gAtDb1Zm6^!gidiR>w=pZ4fGOEAMj%RT1D6yLbSE9TgtjSUR;~x4A|P z0PGwx6@i3r{+ROdM3z74_oOV{x$ z4;BqZ2fuN4Pas~_si!41&_;elQwtDbe_e1IVOPZ%VO38pnoE6_TF@rbjO(TddM3=( zC=$i90}AIth?C$c6lBV%z^3!=TG;9;up#)=xsR&0-SA$Qe_37EfC^|nik=u{goSKc zXXx=kqzIgacfFyXpn9{b-i*-!)$__h z+9Y7w1VLjqZc$b`MS)@n-JHGk)9gV(Fo9dT8maBf7N%UssW|%t877Bw zzmrods#Rp}SzIaYfwkxNT1!e6-N#LzWf7sMAdi0t8XBsl7oed!&+p@vhzX1#_Ccn9 z(z%l2I&l4A8Lf@l~m zGOq2%?U_zGrMqx81+FbKj}SSw{ltt5tZ8&2R$9BdjwIMj9C7BO(CBsx2B;K#Kqr#} zV#FB({?$rx0x?4=R44MUv(HcFhb_2+AC##R`9V_w2cd&0HVyF)$tH-s)Gel+9Ov%{ zA&01tSvBShy28ORU(k0ogA4kgO`Y}!gnV&Z_{hG&`Oa%<-?&`Smn`&EW#yPjVJ)Y{ z1mplEH)Vrx)SjGobY1YJ3xC(Y;}7Tl&tB$bJgsZlqvt*I!-smGSbf&8j?PmzO$jea zd`M9>Gh=LKM#?bFv#vyrWGTDHY}r$sj^6QMt%7zf6{a@|ILvTX>BafHfcNCk4U(jZ zZEFmc76Z%fY;CnjGvv$`P{|JHI(evf%L^L|))2*$zla(`VsjfrfAp(Z+X801GZ3-s zeIYQ*Yfs5pdJvQ}79oLF`BQSNu&QUSTCWuAsGhk3;h;0u*CK*8=Lo7`W@~lW4KqgI z3^T$Zcw&Scg0@#njv(k@t)NxE^(&}?ptZ`WSvpk&RWQ?EEut0UR+q;SSkxiNt8xX6 zu*R>gEorp{1k_REtH3e{q6G7F_oWX9$+gGZ#v+YDY8wk`gh7Tt$xk`YQ@~da6c6XD zlC$)~<4#U4`I(7Hgx{*#IrL7}=?sjWE8=WZe_G)HOIOSY?7!{r?t_Ff zt>#ygCz5}qnD8sox+{~5b(C0XEPF&CFFD#M>p)u|*-5ZgWpY!qG3~1@5J!x5lMN~w zvjh_Foc}`$Wel#2cf#ZaJ91UrJY$Es5YjCFx$Xxj$l{O@(|~db6-~Jz+rlZL%m&IT zCWBkC*{}o|+9Vy#NjJk`|DQhAjDG+^%`8Q#mt=!2bn@^CHC6aF@olbeF=k#zbh5vt z1+lK26Y_Dm1MEx4*;6wpa$G&w4cYPNh|yOFoQaP$z@=h3-pt`eo&h9%38f_v4+b9Q zS>6w;R}&omVeW%Pc+&ITdVc=U%JaHG&l@Vw((ZA@xF(KDE|R%4m|y}J7}Lo}}zN>@Eg$l+%U>#wn`K@yhks)UsVpUICu z!6LN~O?W3Ls-2uIxFUNZKgc-K+$Um1xQmki{0F)t0axRdeC=IyL!&m{Cg*r^a}{Rw zipqBmzM+zvh3xw5?H*62VwCv-C==5gB|m>x-s_Q2O#2x(roFt+abuVanoroDu$=ae zq!&hzbfB)N^A9?b9vnf^fg)*e&gu z4~!t`K#?@=ps%FQj*zkYY2iWNlkOi` zNe7Cgi3c4?UmRIU2a2TG2OUZ0k09wlk)%j%^7GHH{&?v%4iArzy8}hi!RPM&FoL94 zKawsUA$PBSB;7l*l3r;fUGZ{V;I1p$iDNS8w)V6n0}ojY>2h}ksEF{PN^bhctW~~S z`*>;l)t6Tc7vE&vxsRkPEma)f3V1P)9it3rkxYsObl{l96dt@EHm&e-1!mN8G!=t zWkHL%PoA6~d2}&6-sb|j#db4mdqj9l)tcj*o2>`Jj=JV(f4+M^-@l)y_w(}iq=^S% zhm^GMqrMWp&OS#>SFDu=d`Ra`FF?@mG*7w;cXfa)`=E8UE%u?a=}U!~ze* zNdn@e9Ed>XBh=t;@|(HVYCDlRT$LqqEzvmjn9&e_67T zV1MrjkHk_5TeWF=nnJWcTt24<9sDq(Cc1a+?%jCzl=6d-+BjDPLqg4bZcy(|{%fp8 z225l5MATcsK^R;nuXDk~i3Hn3<+RGGs+cKwX7QM@*xUuR5X6zL)niIcCkHHt*`spazSq(aA4SyhwS2L=m4SU9@msPLH{8qm zN>s0%I#Z&}z8)J(t8Bu!9++bC^Ts;wPi9Owvm9mTVPv?NSTwrPn5pg}zhq}Cmku|_ zP1!11c6S_S+t=KeUw2$gw*7C)TU4pooL%$<1>Uq9bZuHiS+ClW4J?ji?gC>gglml4 zP263(u@<<&m#oBYQOzXl{+@)HKMDxhNGi%)rv;=|YMNr&Szd>R#Zv7UYHAJ1rc(ti zWx?+(Wr4yhr9fd!S|K4NsKg^O$Q`c5+{N#{aqs!I3l?RHew%Gy`bVOG zc4G;xe;GT}_N9x;gjYURvrj}DgV&iYqS<-a+ZvX;pB^1&bhkS>FYJge0>#eo1&P z(;9q~H0z_)lm9h9bdjiItA9;5RbZAg;di7~H0qWVu%w3fojOMukUO}Bf?3vws zIUcJhRQx8(->e{kmB9nm3>D>qV_Txp(5GzammeUwaJGh@8~9DW zPR_Pd3)M*Tzj^MjG+;gu=YSZo4n$g(_Vr0)P7}qRf~aZ*Z`&J zS#1_X!eF$94MGYzKvlv6N-_r&`X)aD+=x#b+a_YybV(dV&SYL3Kw&({tFSte1vQ7# zLGi^yMiLu}ECF(0et1@J1ih2dKO^m8AksPQq4dW^3gZb{%OuoI1o8$UU7$@y({}A? zq$ty&AB9Df#DWPvyRNn`t}{=Gs@z+9^}^IRW$S=PDoCLD(R4-&-C@ZEGLuVYTNIO} zy>^D)$hVFknZV=bEUPsrh_-l2yJQf!xh_)P_KD2A#SeRSliMqhClqhoz$cHRwEIeF8+GO_`xS%m$mw?wz zDoj^v0>=*3gjQt(3t`tb_8K`hw#c!BB?wt6f*KeY7~>Q9O&i}H^P{*0VJdl~O@2rR z8aej*H`1hw9D9Q#??F)+MMbOsL@I-Fa6~wBRDBQ<&c9d(wSmmBezF}s&oG1ZR8Xk= z=0gr4q)lBj`1S>Q&!)he1{B~ubj!cLRPPaqYZ_=Nxfd~neaA(gB~6C_B9irHoY-2QvnU%qvVn`Fs` zmX-osat_u*`qEzy1S?hqbPsmVIlLb?@V&*y@$Xma{b2*&TWDPkrmZnnMQ9<_Q@AvN zeg&Z8epi7MAhV~wS%uHSJunxIW~3~OG;BIR>}|LJDEEZDyHsEg*n3Rxhl{;SE~M~Z zsIgn@^}j^e`=-9M2kdRq`#oT9o8Ipm_HNz}?0sQiuzAKsPI9sBymG@wuV6QVXf5iU zJmzo}%RS~`AH2t$`E2rlpO_RCx>tY`JlpEDCKa+kYN$J2{N2jmKk)fyI(qfo+O_=G z53bt$=Z$Ai&Hd$YYa?d5?TzBJO?`pdiVxZ64Y2WPXp2BZh?&b9$iLK@$>!6vpM}Y{ z{|!dl0ap$clY7?|S(iR;mGN>kW3)ZM4^O^z#wQn(uYJ@wz=AbTF2%ojE|mKQZmA^Glwgl@U? zWk$_~J3sfOwg2_G?_bJQSB9HAp8NJ!e|zI2KO6tj;AYc7$IY@YzFu+j_>%ATty{U} zTKq~KZhrN|mv-K|<({7({?g#)j)RVy{?#uRZeDJZ_Svge-1notM{YU9qvomKU47*( zKYaX0AAV_2bMQ&p=F46#)ZFZ&QMveq#%4f2@9O*>6q6lrbiHPRQPUJ2% zGFcn~&CVqGLo80V^^dm(*{}GMeE$R|%}VmgcB;8Ta{H+irwu3Wh^g_4&j>awS@&@# z-CILyBYVg-q+OvQ5Zv;o2k?^GTuas`D{pcYux0=895uLNAi3wiBOV&d=D$)Ya=nVwvlFxD zRZIB~S4!QiQfQi`v#yrXxJpi!@TOs`1<)~<1F~QerJpw`D2DC(vZPHVMKqFKqV;SvTS?^B@;^Z<&EPmry7Ag_p!EaiX? zep6JqAs-;WNT|-T`Ks3p7(qtsDB$E+%ZG=lSw@m=L8f+ldZmC967H_gmvLnLV>7$pWK>Car6Br{_*Sl9GGM zB?#Q(tT_}zp^{VZ7OTCDNV{?+NGt*7((MN=_exgu%J^<%0Wf?qqD~W^5IAuEDJ;NFGX5`Jv^rRH9KmA7nuDrQ;?-h@2_-qt3a*@T(miE)y5SjI z@S`E=Ojc<}^M|~E6AVP=wnx(nyz~MPltT;9^@@%YalgwM?CkPB+tU`XI>=8!J|l0DZJB>n%YXlb4F7k&5>+}Pd9m&p5=^Vs z?n$@;ja}?|w@wl=Z#@W_;`@#=3T4U;tal#HeWqSyc3|fnQF;1jST%GSR}suZ?~-l&|eV79Qc znpunKYIK@T0_G)cCtJv&O4_flY}7WkHuX*Pj*!Z{{g>M)Rhkl2hoz=2AmGsfw`H(! z0`!ri^;?b&;UpKnwF5{-{>xGJBF8G8?dWlNsU{06Ag=LYX@>H@Mz1xDAs7qACK`XT zHZ3_So+B~C5fMSM3(94SXMMwQ>vF5_9 zQSrm5SaQ+UC|i9haG~*S%v7@vw2EXt8Jx$~?Vd~L&_CE9Pc%&-L!2;ou(lxqO~xqC z^Ox3$Xcq%N*^_`)rXH0BwXoiFSU|N)Z`e*<+P>(bC9>-RaDZEDgsB?)Dn0P7s^IL5 zRfX1K>?%enM0A0kMtHL9Adwz+AnD7|1C|OAsJ@==9MBWUzZhB`K4zpsgrL%c^)3U! znyi;`mEO{(LgWuK+oEdv?PvCr&6(XPJjh4GgY17hc(7uX!-Hpe?g@CXT53Fpv@-kH zeD2AvCDo5j=bjvFWSG^ zdbz9gmKP4E!Oq;aDjX-oM|KLdABJ5e&|HTX(F3x0ApgB*o!kRyAlo>Sf?j64sJ3oa zH-Ni4c5p{yqDqW%;B~R?tf#0v=~uROWJ?MWT*U@n7efy}L3K7r`bd-XfL>`Tz$a$q z$}8;i1O=fHT8G()pAHG2Oj50Zh04)T!wbg~24WPkkpYDhQ&qGBWaSTyLQv`*nqHKgx-O~`mBpZ zLF2CJ35A*cvO-H?At+l(R+_n=uI1Cj*{@!@38iK?h?Huew73i8vT7Tmx$T#s^tt&x zW2%9;ztq)0TrT`7E!J%duRs51w=Vh3yTW4q?CalnN@?t=Ij>$3FMj>u!BdSg0*$FWm8s%a>iXf2ncM#X9wuf2hvebBAj9 zqSx4=S{d(I2zdVDTb}!m`!C-3cVVs0-*MriXFa?Ad-v@Ap_0AYaU-DLC-&SztzG$w zEEK*XqoCi#@$NvsSMN|Q*m}e8IU64O)xU&=x_D^EjThW?&*u+*g$~t{J-Akvz9MV& z+hVF$Z>=u9@N2h!>9%J#mH=?mSFii{N7vqUZrdxgRu}KNwb~Yxt-oVrwdPerRv$m( z%RgLy&bgm|J_-lxx|>#i;@qEp=ReNo76-Qp{VmbexqEK4RtAfb-|=cSPu8ABSNEPh zeC|CfmOcI#VX^MLf8`wyed6kC|7G{r>U3nXIR5mFz*wK!b89v9%8-G-KNxHHiT44250rsht;q=AGqC3t>$O3%zj}+cV*OX1U;XL(7jB8d zYMp!b1s5)O{F2B1`|h8tuvqejYcAG~J;w|WU;G-Q1!ax0Cq+zGJ-7Wg&#n03_YMkc z^`D=4`s|;$im;on~nB{zl}Fr>ACi?G1mk?Y;hHmA&C_qaT=| zQ4fDrvm!a5b>-2A)-@?M*+=RvRTE~XXz+t31SbZK!qzGQeEd}Zw%Sp*cee=u{@YWx;v zj_XnbPXbXR|FMYwHaLD<+*$36+Bz$pNqc9?r?D)K_2eavdW&i>C2!0{??6O zq5?9u%gk=z!P~Ao>vK!)ze;)yDs4xd9h(Q5K0bWY-DlnMi~FyBFtk3ZM+>PX8*J$k zkv=HRbz0Wk=+gfeHU8p(Pkz4LTEg~;yz*sJtxr6lmcIWL?^<>6FL?L#k7LW37H#Cj z(c5zVblrK6-}1!^uGY;}anWIe_~~t*eC8`(_`&s$`yi5{odV{M#?1WqrjK9RagrNU zKdwok6rWMP`NVC!`&>TbB{QgbeC(d{KGQ)a%#Xm zeI?C(nB_oCgALzYIUfUKFfNc~aE`NU3^V~AU}q)6kvwtlXd+F>CdSGX)5xVNT8kEc zK4wv>!nT}lq05uWM`{>=x`YTm%q7iwqn?7wB%~To|arI?CCz3(!Le(1a+=`;9o#yd1cK&*Qxc6 zfqe1hdB^24w)qfYN7w<;Ozf4k1bG`lm@o{11%I1*EL;#OG* zgiu&}Us+0*2jUYIG4@Kp0AA}HVO>VQ@4{`7Zg8A<92%WiIx`LCgR<{~%@sfS`yYkqr5J z037y|!Jnq1*%37S!TdT_3<5|VSsS6>mFXuZKww5R6*}^$))d2GMEUY~8cpqs>dd2o zkDPn?qnDn&;K?g7+Lp?B;EF5OuUdZ7XFl=1-RC|zgvj5F)EOq46^sq1B!_UyEx2@;#@Pr{Jpf|eCcOj$btq-T34Z0wK@g^UQBT=8_5>;$#k^)IceP07&A~9U-bwv} z^)IxcujV_q;qHLmR-ly%_)vjX;DB_ZXhpW&ApIA!p_gs@p0lCXfQV%f_dprp?&9#C z6BN}xnWi!gjKgKM9h@GGqqyeIJEH8;W-wo?XXz;FKBZY|S~*Dlp%`9!~)V zAQh^4r$r95a2TDr+T$uqcO$|q>`34dx4ddUcjukix(Rg}-zGko=>!uj9)dd!=MA#`gNnU*jq9T1Y)J(Cz^I6M`m6lY>Qjjz_> z-MxQyBF6u5M8E|_T&t}O zUGWLswSN+YV3~#2Eg?$95{kEB32h=vu&F%JRVHd>g4jkP)5X{023Nk_+Y&{aHc|{B z&Nr&p%+V8OZs2TYdOZuo3t59Ly?xd}5r_)=t!T;Zvkq`C1nO<6eEi5d+g_^9^IGcs zWV6l*Wgl_-@iFV$!~1ZbBpnF8amuVlQe6M~siMRYJY76&d#Jl$A@VBiu! z>Bw?bFQdP8f<0Sy?2epND1=*QzU>jz?Fm7|)}# zR!rbgtrhq{z&96r@o29Vd-G_k6|ds~Cq(Qf@kOua!GPYtgY`q~qyd|+7gPm|rQWhP zm;p^yrp5Y13H&@ll@_O%F2hjF>;D?Ux2;GHj$7bko_+%Zz<4Id3+h-qPTYm!ywp=X zV93wr?B*NW5cn^Y&pp?e8p1}3^JkIlTkgfDcmtCfH+UY=b*iU1wTMP|H!&WScK615X`bP`R9e zL@(sFwe%}AY)n$G031hFlO7v(By(MOOtUAlrL_ui50U{TghR}>9Ht&j?4heIttboK zrnA5Tdhs@XDxhih)VuurH#^kQpfISWDNjvQfwX$dVLBgoT)xrmd&!#?8};j9u23(w zDz*6IVmGh(RhcD$Y%->1nFO5;V_u7Jg2TV~`KDdk8OK zfhxAvZtdMzxa#=!HU}60S!y6$Xvz2UGsprgh3A_j?46hQRCRLfT`msKQkd8FbEp(Q zl+GNexS-U=9NqViY}Km6HUN9;r(0jA^&9c(xf1|X5URpK(aagqex52s(Am4U7)|GH zphAT1n@uD)fGd&>iX{_gm{%`faq~KqckKUtd4QVwc%*NE4rBopE(=Q2={E3AJ|o(T z7o_@TMEh7O+HXdb1En~>vmi=D{UM6hklkJw3L3{H&`YbgUed3vgDa73Jrjaywpr^b zHu)r8?~<_0gdf`RmKSNdG4@cK?0gH(jOU(Viq<^HOZ2%Vj{yQ+HtUH;WFL1j=jhsuD{;yt?>$KRa2)B*u2m+U)jq%m}F&4x?fmqCxaC4f_O1Vt|6#AeN~d z6v6zpL}5m5U}U3%J2eCxRMi%EklfuN3bUZ0b*cwY$p|G>RX$ca+wfkd8RDjepYa7S zpH03ApOmvM#GR)TU|qH(aW$L;gf0$X)c7HFCM38#Dios44*qa)ap)kOwf^A?85cA4 zlQ9!t+aqDhr?zcQUY)G4mI2$fy&d3gL!t=NEJYJf#f^}B7MK0$CX6Ce(T_e0DqFu< zQWydqJCu_|!H83iBrnyqL#$nSIYJVP&{MC}p{jo%UG)xiDLE(a@(z&$5*~hEATO`J zU4g*cXjJQ{FZMTdhH!>#6ZNQz8Lvt%-sPo*y5-N#0|2FnRpO?o2(4Ng24l$m5aAwe z^4gEXOoNu2Go65xk*EixthLqEJpYeeBp`+un(&vhbQH1e80DrJ7Zw*?!q2IclWd5h zGrQ$5ZKX-9lQ~?Hp5k}}0>`WVbIoR3F%=+IlPjX_Ea;!Zts+4Yveu=Cg=Xr6ReHjz z%%pf^=BaUFy<(I^m-28rtVdO9FHRmDUx||>hJX~Ah5FTy_A zpLHbREaKk82;5f zqT%O>gdRZ1fdz)MhQQOP$cydUo}i^Z|IEs`Xv7MxQ^B0ZQ&v($r)Vc0eLUcVCJOE9 zMDQmc%%1;ywJfN?1HeTO4aAxYv_PN*Gi6sy8f0ByHqw5Z+DQs-|3B%;fqIXJEjUPL z0Vi9=z{f}4qg4@r;lXt1eA=G>av(*Q{@I+m79*BY0z{zxkpdB@^Q0KK=8#mM)EJgx z_y>9lGG%%Z_WIo}&#bs<&44i9rNeX!W5 z5~sh{WbT zR#ZbG@7j{PfgW!UixPOQ(tJ1tZ?6~na{ak zJUavsXa|bviUvfzPneM)GszQQ5OQRo<<(m~G?F=fXZL)R=BB3G&$R&D+Poww)9#Y< zq4*fVIj?QOKrFFKyR=W)-R}fxW@|nfTLTO6Tjp%o+qCdssr|Aph4>^4g8)>U6rM_Z zJnRz(0p2a-KWph<_M21dY4)GLP2X%jm+^rFu0aR_!^FXxjKFaPKL$JW$F(n?Dy`3{d-VKZo_y_ zp`@Z>3*=y`gEsP?K;4$+RTNQiFZn=^_}R8zMFAGWQB~X#dx+~Ks1ai+5!qC2Mc7}; za|hpa4+T4`*mmi+K`NHHk3t6|>q0@!XC`vKZ;)K5K_H8=?U1Yp0T5fA0cHxFsv`oTvENI+4Ar##=So8@FX_TrkYTi3x?eWLJ6z5`t;bQS?#j}?a zj^sMDlPFRh^OKUY7FIC|G`49pvrV8-6|tstNrnAF1^Mvb05~pr2bjLNp6(SBh}*FR zL%HmdQ$+1c=*%r2Kn4XH2l0DMqr`8U;P~07534-~X(P%a!~nBl=nOlGH&T?JhFy{9 zHm(v1L12so;Jd{rCQ^IjJ0h4IV1@aEK{AV5JEid*L`n~k7u-KCa5so$lz-olA6zN{ zjn~I$O!6w8frT?0La1x~;7{YX2u84c5Ie|9PX&rzz3#Qw%&g4@yNT%@Y3apuk-7DI z9)Q=>WYP@VUf|@$cXp+Ce5%=3QZZ6flU~s~5p6ZI@%=z&`T0(?uU_adlQKe->y*@X zBq;MmoF)C*;ZWxM5xO9(Hj~Pq_xcYgi8rT{><75j5UgdBC$ml6^e}b%+B`O_`z_PO6sE-{SQmcVQwLBYGDtBUa6-{hIe$atl!wPIH!16>PQ$i> zvC2&vxZm9aS7p2ifh%=ECf1Uy#gLg- z+SpV&Td|MErn{VgWGj`sU0T6(xhP|LbX@LwdYL40iqL(o+a?UpR$0+kAkWYRB%+{!a_ zvquUcRV+V)dsx2o$5K9snK5w&;)cFtIeA#T1DS@@m`|1t`{Z@|AdL#&WeSCDCI}1mRam(2>vW6Xe&XN@F-k8FX~Sz`-IIThDxJJBojU>ep+DUjqMT zLuHc7=w)miC$=EHgai4-j+P)=tmj9B@L+6cLCQMUC5wkvXAOAW2*xNSiw`Gp=V^8d z>iW*2Go#fy@KQIZh!v+E`Y8^(vR{05QtwpwH4}=kb0s<{6<9FKRf_d=Q39pe992>K z%R2NWT}Nluk=KMQQMTK59Z@(}E}b~VLbJTw)Dp5|Q-C0aSyiX>UAyyuWU18su3lfv z*J5d6-NjZQQ6#oVk2dwy`jX7^a8){v2{)(7Qb5o4vP=GxsiYryd@v(r81Sw~sRs3c zAX=2bXs=jCOPzo@vp^7qLa(KsOvn!yQ2vT;UZ4bru~w`7VUokT@5xCvlLqbH?&g+n zpnbNy_Aye7){g<_H$L{Zehiqt@o{?VNBD733yqJ5w0=Bf)W?~vAI1NUD0)omR}8{O zex2R=6+!8$w~qcgzxC_((O(xLp%kbPXo!l1nDUS4*3uE5myZ6tV#Mba&CdvS zzx{S9tQLJtk5BsQ5t+eWWm7ex1f?QSm%6zlFi%vGG$)pt^cFBEDMO9Y)sX_L=0-2` z2ZHdk|H|_bc!Upx=WMb`(JLIPly2F0H&2MN;`HwhL(B<_XI$pP*Qs3n7D1^Crp!Db zI#%E=>8I;%Fal5&8^VLE(O=JqVox121A74bl;`n4#|)FBtz7c}$RqQpGr(*ibsA8} zS5H|$SbNtu14f`~(mIhhhMK?{0^#bPt&8^>S=-_@|L+VN9qFY?pFkGU%axu_no^iX znEC=pXulWgH^6L2zct*?%?E@!+|dx6gkU^nDC2Env~WVBo}_gLW5x$ z1kD+wa2*fz+$Jh6rpd&?t`9;X-4iE<^3cly!(mUdJD0=~;c5?P-HQJ*NX+94>Pf%; zsm*Q}#DI-s!^U>w3Li{KV(Vkr81g|}rQK?U9g$E3za4d0pVT#@0PUB|E($~DWY)B^ z5-puKBtyf~qQ@4`J}6>W7twyvw#Bm#W;7B-Gw@*eQ&IpUg?uKddC-mUe$plxTK4me zY4(-QKPt&Z$ysyMrF<^<&kAZYEAW|}T)W(gDkMTwC^623QU78fC)Fb?*b!3mJ(6KQ zN`bVw^8p2eO|UhsR7KVyhI>S6^O0_F3z}Js2yXV~NvWqtg^@^76rU&vq<_$cdgJ4KY#&X) zw5SgP`(K&!6pL7&l3r)ArudX#7V@}HNe+!lThd)ljUpi(%_v43CTW(MFazCb z$$a(Ny^Bnm2`vO8W%EQAsCVT**b|&QDSPy2soR51m|?&vGom-=;Y|K5A20&YX6MF`RWpH#i5)=l<+{#;}^evi@-77r@+v2>#_?K$@{ z_p}d0Jylx6EDHiL8o=ARa85$cu?MsGol%p9=vptaj+4H6*V8bm-78brDoV%B58Qnm?>0&dg5uEwl~gfiba!L7JA608#K3gx6@ zN{1n3Oqak*jMQ6Unai}=4b%2TQL%aRWmn68RU$8FZ@K!$=EWLOgKVt}ZW9n;4!sZzz(4L6+I z(c|M(_0U^8PJgyzZc&{tYGl6uI+53wQxovS&u)0Qy$1||j2lW$-nS5&jZ$!JEu}28 zP-k&k5wktg!zW9#i`lYn88ucUwFw1y0+cPJgXuLMNZcGTZ>)pQwN?X8LJzd+LeYZx zE*!_YR`0t-^O$8%dtpiq_R&!ou7bJ^m(Owp3_g~TH{0eYe^HfvHjAomj1!e+h7pqQ zAQb2B0GY99IlzQ8qPqiJu&UZ)4#%kaJ7u>mS~7G_v;^}flQa)AH* zs)DjP){`yZ%`t0~Rvt#qXhV~beUBKqfp|GQ%>y~gKGs8HBF3`iy*@HC!cE*yw?h$m z<>(=eD`r;sed++`5Fgr@VA6085@}!g|bTca00@N2gxItHsz8>a_ zGm5a1M?`#e8hVHOIcsDslB>Y*kKv*TKBw@pJ;Km{mk;p32WmEt_8IB1JaChO$k7c* zGkI`3Qa=y#Z%9v2idB<`lin#V16RuE9U457VvrFNlf|*W%}wx|=pH3hCCv6g(Rq4; zHt{1#gr22TkhCXz&NvR!6%x)kjLPsYM%Dra01PxEc_mv=XN$Y5fSN|D*R9>*Ts!=b z**iFg!jg!Fx;D^I906M&fuaAripbB9hU^ITAQ#Vytq>ik6{CX!&#I)@K*k<|1(Xa~ z0wgQ{>5%l-E90xxjwnuWu)q!C0n0BJh|OM7ZWVY!{M_Fo0Qr@_m!Acqho}8L8*+!G zIMad03(Sm>pvC6Lr0vM)BSVCVAu-9BFH#bliIiD>HG>i`k-CX=wq>6`(ym&g_mYVt z?OYMwYYgHPP(!e2A)KE$hglrnq_|o|QMSzEm@9xp(VB!9hfS1peW*VPVWJoV?n@)=&#TEb~;xJR}7Yuj(HBeTW*kuM@;Q1j@ zu^g1@9$i6OaT@0mZwl|1|4lWU>=?myJW>Ug-29Q_Z5k1`YXh9tJJj}m0$>!t43hOa z!UR_`cq1=+1*aRnab-?CKE>t{jHT^}=k<43i)Z$sWSb2@-3Dy<4>ir6(k~*R!x&+V z$*#hW2dJgJ%(6-K1xeu>+;~*c`q=(3V*XuI)_-xsdkqm{Dww8|vOnNa)bsx3io95q zaTRz8cj=$6zU#u}=RSV@rKP*{g2z6yDsAv4{<^SMuLS;vJvbcpeqX>ZJ?KJ;e!xhYzrSw z;aC;R7~0h{>lKj4^b0O2%+mAc{9RGfxIM>o{B9 z6V{B5A*eGDVxd=nLg5RHId@!{{9E0}%9bgJ$qB10ik9zE=bI27g9~1ZIOKOz3@$r~ zAO<(owm)+UE}6~);IJ>9fhtSnWc{EdJvok(*{9xEOb>GXSddJDfmo;?e;R66SMaC7 zAwr*IV#}v|hT91vTQJdENzy?J)kid@i2c#NT;Dckl ze-I_=nyE$-*+i=QG)nhXg33L^mrhitK%sg>?(!z0AgALl*4U&q0pwvB;Mx)lugqa* zl!(P}ngkf2HX}d)fCdFo^%Gu$!+~{~xsW?w4ZbNawgbgvJ}(cc%cd=Kt9 zOjK$0WfokAG-yzo3d+)_k7mM{L8vPQfPt>VG8j86Q4qe(dCOs%>Ddl-rz%$e5O=f^ zg*u9l)o>9(X2Pu^N?d4Csc|UGM`YN^=cHf%)O&nz^yoHsDUF&PE_6rACKAb_?t5UU z+8QE~bue@ELRT&NSqM*^Pha>Oi6xKme-{)&YUe zcAP`fe%9LOnRHSy)1IR6l z$#&z>nl2*;Sggavx3FpeQ_khaDH&xZEBMXqX^>n5E3I7E1U>sWdH==8}5b=F~CQ?AOi;k)j-L3hVX77ZNbVq8= zRYHG4N20fB?`hmMTJI2HSF<|h!vMF`&4bym@-RpQ@u;oUZt@Bm^AXi*_Xjux$rU#x zCZl+C@(Uzrr?>eKHB1|5$*On%6~Ljr_?JOZ%i#{b_To+cmS9!pXfn@dP%1XI(Q3*oju9`XT*mo=B5q#tQ+;(2hks za@L$*o6Ww_IC00;;`eN%5WQzeX2ljO7AfJJAo2+NrJV=oWzi=Q3}287IxH7jwq1)U zhs}Zq!^CofU)aEI+J`xHfVeUy$*G?2;7Cb1lp2&Gy_od1Ru#mAw}f+K*facw$)`$Z z^|emME~*c+1-eypa;&R>NF68W%)7qicn3RBEqGcQp%M<3jm7zLhVvQNVT%lD_;e*$ z#5No6R>aUFP0k!@ZZv1U8iXsJ!@6V~IvXP@(Xc_B+BZDhOrmfz>r44bU$UC{)AUT@ zWSPwal#Jmjj90WMVU3q`GZ-v742<7wbG!dw_On0bEt$9$d02Ccl}g`Rm_twIZ}F+6 z_I?*~kecaI4^p#S3_^-oo2?>K)7dU4A@zY7NI^j8tS{uxn^_zQW!{`F6*#lJTDry7 zl&$DcNS-hwolgdqU?~|O4V7F@5(J^-N|I2YN_r?YCF!WE@km}v5?V)Zhe`U%rt3)B zE?tGbNn>V(+LM05UK!OUj!$GPRM0ze_a>01 z-JLXvg#xRccT6tcbTZV3)yE$0CXZFc<8VK*Ru!K@RkrP`*fHYVTsokVGzV0wvbcL} zeE^l!2|gA);BmN1x2;oF9VtvTb($dYH6LCb1Ip7md7Jf&MPd`t*XX3llHx|f2`@Ie z)yCuwr;W+IW30*LiOIzoR@L#C z`KnCrm^=5*u_l+7FPvOnHg~Rkn3-eL0zQP6oolo#LK&lUwTrbYUux$@WA0qwicqsv zWh=m?v%kg84b@qfZ0E{@aaVWl_x+C1rj0-%nu5AG_#Cg|qZd35_nMvl_XD^ebG+#} z)fbtWlk*!kSYHf_>dXMIpnUWy1saec-Zzq#1^0Jq6ctPkH#j#YK~k`{5_yf6y3kcM z7XLuykUH)2^0pI&U{DpfB)LuRfa?iGPV^vc#R<}h=qB#&d7hc}P3&A|PL-MOd+V~* zZ4m`kB@)6I07GlCNcacL6~v0n(x0~+F_Kw8TCtcp@o*nG zS-=wmak$)Eyi@}5gEadOWFnK3>>)Do@dPrF)#C`sSU_9ELICRMIya>tH2`ugqV_R8 z*}_%LLTBWWP&n-u5v-r`RyF4Dq(a*;n#uC3W-jb*zQ;sr=46O+8Um+Ti{# zPsg`+m~uf@Dbu1zBE0A@9MfZTQJarLkP%ulv_jwBhKA01rZJc-;xEU_l&T$hX0U0= z*h6)CMDzkKDoy*XfoG=Fk$+262bV*=(96oHN0}2Hr0hDqLzn(Tv#kgM5kUjhMs=0Q zmJLA9gW~8sb6IToD$?wS33Ky&2+z^t`DQ1ak~uR*_e|cw&r#lMZnVPpF}>B)@_}A{ zCjy*lks&=E5|!tyVRoenU=A^SRd&K5v_vk_kBA}+aZxP4K^qp;*)m08^Lh$MG2n;7 zy^DP1y!2_4UTqAYHhkXpr9H?-eBOF(VVdQU&m5wU zqs2Jv7_6QW>D}Os+9iQ8-l!p#WQa1|7Mbei+>8h%Uk|%Ln?Qq&DKB{;Hr?e$Ev<8b z+>G6vHF47P5=|P{7xJl1{Gp-35L|)1F73Y+8s#}!X$UuS|32#MHNWrc-$$K2|85&V`<^56`Gc7e zlipxOXghvqXCcaV%=Hb6*aSL8i)O+uvHZ<_&4xzdZ2s(~goer7>A8{1=u4g(ZEGC} zlND5IUrCaV(<-OZevE*TK&*9<9$H;ZqTX`jI3ZNHYc|zg<1*;sBVeK4Wgw!CEGh3A zcC;V-MM1Kh9BdOu2&}un-k&13z#tuIhuJ!lq&r58(x=X_WP(%6W#UNMcI%~un=J*^^lrS%a(i`26OjKsBr2sMMei$wr+cw^F;malS}tG zn{y;FG)vd{B!r9%ju{sOAv@TG|7$9ZTrGcK-4svegCuR}#9K_LC@+~7G?ze-s$(C^ z+9;S%;Wvi&$tmDD;c@{Rg#Z=`1cpyX=mCR2n!5wk6C#3XGBd(;Ey za_N?|{j3PTPy{>YOt&Ohto?50le1M$Ar5lQAA4**TiO6jk7%&HT)m_F>^6z|_i-DwNz6Sy+l z3vr$&{Oje&NhIy4%$pbecIMj zlQ9Fi9pWM+5@5C{#s;4&xa5nV3*ecoUWw{aT;@UYq{oT4#Uuo}BzM z|1kN@%`Z2K8V05PxMb!kXd+JMJ9UU+(LkEet5vl(kil58E{&!g>VrOOG(S%!RP?d4yoS2z@xh@ z=!Z-sNI-x)0wf-$oSC53;@)y3i$YK~_eLp6Wu!v}svF@p?L%738ypYA6UnMYGAEOp z`(YU}Ws=u1NpO<_*t_bF72w6Rs8@`8Z}^&f z=229&XJ)V-K^MqenOE$1@cDQybtY2BNU{X=ERx#PhqRHiKX^=m#!~~*Oyb?c>Z^Un zQ;o=aHtHyjYy_2(m}WSlv8!T{EalX8jyqB>FPLp;XX!9SYy-}np{9ed=y!-o<0DIslFk+5)JH;);~OWnM_jB~`v5KQb0YPb370tw!%vy2 zqnIeWGd|q`ZFbk1VND9Ep3*V+$Qe;T)o_%LIUt(pr)xAnN%f31`o9~F!H3R>SX*(A zd6U)r$f_|NgZFK)lQ5QnorJMOzhaK3&TJX7V@X7FCM6a;lBBEz*5UvxMv?RirDuD3 zmC_#|O{r6SZRh*1dHiDdC-93wzo=92(5^TIKjmBv93^(JshK4~2SGz;Uu+i`@eqR? z8QGV1jX?$>;SsGwe2B|MDG8QnRZNA;F=jJVedbdgZeWnErV{tFs6I{<(YT#bMB|Ji zqCObIaSei~ZEn3YTU$dwMe$SeaSQ6>oZf-k;p&MOP&>dWSRbez--@#>X@3vCTSSlPLSydo@=&w-bXSsE)3=5+Khjzr7v?^A{1C zd$Oj*kCftBm*$>JRs69LwnAamd2mQMcl;n+#1?L5yybJ-1&>SX)I!7Q}FqT=7+vV&P?_H7xxM zAWA*mj6VV8Z1&OoFGy{W8mJ9cH-wGvOe;yHQi&=t2Sw#ZSv*TQhHaGjB(;vTCtic{v+?fty--oHvX{Ej>{t6BakTO^e6MWTlxwevlzU zyR~mMbXfbAtXlh)?6meR*=6ms2DA^tvyrON*xT1YESXqKmQ0JS@on2xuA3egBBK(Lp)nJywYaE4Bfv*=h&H;ga9!W07x2HiJEnV2weck{qp^=4?eC>CyY# z&k17)J9$iGnVk_Z3#+fV1;CbVo@E_pNJTTNJ6E-ix5U)7MQPIIapQqW!Ku_?JEB|W z2x-djZATbQp!Bs$H{-q~#hV6;tN;lz-$299)D3<*ErLI*&qW3^*~xOaq!;yv$u#)J zlB1Q>YsK1vN|6~O=%JNGhAkIS0g>AQW@?i*f|A{K1zw5|FKmJpO)YM7n%7iCD~sLT z@(X{18fBZG7xmy?18&W`K{fHbVp}|SPRV#kyxfWT*1W;&X2{_jT(h*T$9jb39HvK!b%S_VT5XEp+!$?`M;H$YB= z@S=jxju%LQo3iUZiMmFsp-87~MI=vRi*(Awv@r~w#I^xxn}!wh6vjP7ITdKNumzDL zcxhs2h(N-d?^_=g`((d)D^<`6(d&xSDL=nNH}*sIn)2qB52@pdjH=Ug_d6XMP!1J~ zQ-n}97>P>Q+D8jg)}+~0vsAep>e($E4yC8ERa9kh{nP7l^PgpnyVE?Sa58B1)0H1d zcE7nHH&i23={;dcig(KIIK)4VE&eIHE>^AkGI2lo5FaNN702kKGGcTjQGD%mUACCY zi7U{qeuz~^pVp1;tMh1naOtv$i+UU3|9lG7cXIDud}=OOxWNFyhA`1$uE!}po`J~MnTWPAie$RyHxM#SIj+aGdY5HX6(&c1q& zy)@!>`pDJ0dbl;!CYAA9l2I{3Y|8aZROW#y!)%*~e$-9T&4#W$!s*gJ!N3`5&I6ky zOr%&0r7)2a%SZ~FC*Y$}n6|Mkvh)5aCsVP>qOSwVOy+L1YhJ0{A?rthH?6K_iEW11 zI_=kQ6sDZ6L>hnGZ)}6|x>69k4iXObeHbv?PpCE+S84lMA_Ks>-?NdUTIQJGIVg`r zSLNZhWdKk$?LVq9GZE+*@vF@(1GLxLgo)b3tGCIBQfuEfA?@Z*J&|pKFb^)O zJX$`NUy_}E5!xNQ%uc?vRL?$74r4sY;aEse51;DThF^5QDXhS*>g4NB?!hs(Ef^nS z&>=exu0g2i3&@^122i^!LUzc}T(`lX+Tyg6kc$9!Y{pn}?SWd5wl4z)}B%!IQx**D%^N7_)aQ`=FTCb-w0 zU42~L6oHMK@{|YcsxyV&Aji6ioAe^BmtBy6t;BpxF=EQScmL;awWXK)5+!D^(Ns*yfK zBf9B)Ph|qJInISfmI^s|i2;mJ=R>!MyrMDWDI~g?mgzk4>^OJX%{mj9YDlmmLP4+b z2XeSEkIyUZqYKsJd_9h0Kn@P zmdTJMWs~Zg5fr&nX2Jlzbay1R+Hl|DObg`c;DU|imqf~(kGlQSB>N=Fjj*Bmgv(Md z&4^ec_@}2+K#~@dJ_zM( zS0=QJNU8S3z%!QDU4$S1KU{3azG96vJuEN@1=`z}Cr%(2+&dhRf<&;Twt2?~g{7XP z1&k!oVrez8d8q-^#$U7E5r-xOou>1&kMQR4meN`v~#8CH|b1=bP+qA5$SE?zOm z-ign#5cE;ml-vEgjO11qaePtuPy%Am9PyUKBDxZr(-AEHcu4cD!)ru1XhEG9xdDY| z{$3$Y-tRxL_ru?JVvjqr;^5aUpfdU&tA>oGJ&L&}O5V?0h8Pv!xhK{w^$D00e2v86 zq!YpQDfZ@Fp5fLXNAS-2_Fo&H;L=t0R&uwL-M{f2NUZO-j8POZx_#PNQN#iI{#}BR zc&m*b+0o$=v6$NtIoD*m>7pAR!VpZSoL~3e_M=NNp@{QHalc|NPXsO_7`XYSyU)7i z%KN_hNW;90iP*mEM-g}LY@X%pz2$~aR5>}`h`~3}5`qAwBq@+vtNODg=_S8@EPA&9&1B z%?AGctgEj0-b1I~{Y11#FD4D#_0{LETyoZ9Kll_*-KLXv3{o-dYy`StmS{Rp-YhQc&?x-xeN1rk*Kx92v|=!sLT6M!0pJqh z+YjCPKd$|gML+-5TeF|k1>nl}#qg&djigMtDiS+V>h1gU$oRZ}chdecuI zin5#E1DY+?s*nN)?z}zk;-86TD5o#1Y(%7jEY!V3k2g^^8T8(xoKHMRAA_)rAf=?VOXeG z;w$^D zBLYDv;*O1JS8cTz<`qQbE^xlkO1=MN6N&L6HdF8Rc|Dx62Bpo68Rrre!#;VDre5S* zF^u4hoYqIuy4n_o`Qg`b`J9H}YBrGL6xNt7PU68Y#p%)faW8A&X;ht%v>El;eUx{2 zoI;2o3m7h1nUX@IrwlrU(uTB4;v@>HQpHvuHnYJr#Kh*kB z$HE2LRTPYw+<~6i?vV#lB_6vQMV^xqlFP2Q zL~4w}%J=E$zuMW+_-bbqD*#J75Z6vY_fg|mPHlQ~i-ZyOU6^P+>~2qeC6{SS)stkN zRN2@p51l%f>HG+k%6!xfvXl*3K^9h_2r(p%j8s=?DU(49uMdplnMT#O@P%3Jq^jvg zeTzaSHgMUfGv#Ha1XY)O20&OTdn&_2&H5QHENgX)Xkf8t5(c2ptc#>IEWCDvNN7{f zpU7r+q(N?rPp=ba&If4P-B}xnWd}&2LmDE^kP-STC)s|s%gv46Cp8^9l}Ddsxd`MC z=kmxQ)p!s{NslQ#u^y9p>}vOkJ>9;<0)NNWO~=mHtYkyLT z+0r6+tt%bH{<>0LauEPnb_-0MRvZ9+iTI$$fSbpZ=OX^Hr9|n}i_=^Zcb?(JoY^W(GA>>-P6+_D{D;HV?zbSh>ff>7CwM=@Zlz=J!mkWjoVmn?bF_6cZ zfLv-VV}g}F&xx=lX90}tH9ZP8KsRdvlKxjUisqX|y71?H*b~*;!OS*RF6kK+L6ec6 zWFa$w4W;>a#mv8VBZ8(Ht5{=%>wNL(nM45d_JAv*rFT7g<{9aTZLD<%lQ6BZ7_bi` zu_et8%j^7^uT3qH$$Vwd>xHp&=_H2KsD=o^Q0`bK`T!gPSPt`e0K2TjVzqEUvN-&l zZ^(7NU=To)CJI&W*Z#ywzXFf1KJ#Qq5xe$h<(bWEe>eheQKJ$o$wTP_Z3I%1vwzVv z>Dr$peD`fcPuRpFzv0u0#W!rER4>Diun9Bjx43AHU;C33SLUS%)35zu?}H~S%n2#K z_DAo6fK#+Br^>JW(R;u4$2#)4eZ(BBxt%N40~=@iS$DE|)Clk_6lk&jk&OU?>}P)s z7zQN)=NJhm5@^!G3X41=uCl=gXda{BeMlna_QmMRARGEo!uJTWP1OAI%@F<}p2E9E zR1G{6e6J?!wm;*^806L@l25KtO&-w*>^8#>3-bNn3)q%V=1U3Gn4;q%OLgYhNFK54 zyr2QeIt*^n#@6TNAB;;5htQ{YgLdN)!h;#qfP)>tL0>en`-#G8umk(b@ z*(g*;2|Bj*D+Ega_m9RvJQJuy67Wbtkdqyvvn{)5Z;Ai2@yM-W)|9rVi1iNKAcDoSN;$Quj7z>+W<)zFD)TpC_rrdNU&{utqqzZLoN&d;y&tB^UERla$a3 zs%h&+Hq0ofPQn6L*YrpPr?%Q;d*^NWz2ppGWLvDNwUrDOe@a`_?Pp5D0|e07_utN_ zfL~e+CaNSUVbNU>7hbxAK|Cab*J47L*%_9ehq=GB5rL7-59pzGnti1sFn(^$`kU{# z_{P%@TVx<*;Ethlzkd4J_dQr$6as<@o7Oup&!mS~3+T~6t4d{%8U|__Lb#CF_Ey-h z=l+U4N4KZfIcm`V!B*A|lb6+=3~1U?LfuI}%M}A(Esm5{ygj?Z@3oe00A?BG`r20} z3ZwQpx`A!0ZjOpGL|kLrv})V82ws2L&64hMN`}to+cWLO@TYlm|TiPK-5i5Fs*`65)p;D74(}@v&HpUip3XUrF|&!Ft*e1IGKt0*NuM*C*oh-5HKokrZ==d1xJksAXbfR zAoihnlE3Ax%mTga+85Tm4jhkMSju~pcKqPhP5-fpAL64`Q?Wf6%%1#55{v&dB$j`Z zDX>>tTQc?~_tHj55G%+X#~@FHTZ?-&X|ghjifc()OIG<}D*x`$HNwn0Co(i8xDm+F z9PEpYp;GwP^mz&lntQ5G;mz!8J_FgQr6v(NOsifl?#wX5F0q5tAAWc<0=U^a8Iz_( zxFRSuMcSk$9iKooStLH03l{5D;`H|_Uq&7;Avt7gi2zT1yV2kN8R-UG*wl4o6zfA0 zA;mg5wyo=gh52Vdwq+pia5L|<&Ae-sWbZybnWs!KDISuHeSJt$=?0Rjl)vzG;U*i( zpeOyt-n;~q42S3TP>Nn{3Q5}E5|T4#q}x=N32fBMPfdj!EQY3tWc$Msh2?zhF44~c zV={<>qp3hsLvjjdptusWv0pGx`epnLK;HP8;z5}dT0EzHP+-EjNWvT-WJQdRgtEr? zr2TfXQoEgso2dlD5Os4!hEhjcNKU2R?1JEfFbCzAB1QetQ80U)p=v#8@;kCZ)E*bG z0o=Th-=T1RB5a5-!^1^fE>;R^65AZC* zpM6Cl$NzRb%T+RUH?8U>7i#%FZvCre-`YxwZN%GxNeKj6B}x;7Gwd6tX)_}FEs#>u zhnjwLlVn5&QXwgfI@_QpHs(AEtBIl|^(K-`CXU-KEhGF;=LYH|4!yy25F5t-fh5CU zQ6$-RC&_j~ke%K_kZq^hK#*;_yi7unEoc&CR<~ahra5q|Wn{k2p6Dsz72Yc)^yw)> zz4neC_EAYm*J)C=RI?lDG-S9;EpSQ&DQXB%U`E1mK^XwURL43y?J`<~_~GmbH`|Fk zh!vpBCR6wANK&rBIMt%04mF)?nKx`g&muID=m?3qT6H~dMl0N9a`7H%!(as_)~lFr zV9X&k-wC`!hWG&_0K!S>Q^t9gfil^cMil--RZV*q%|VTEX;F?0liTarX5A~ zM_YLZe~z0>p*GLmj5lMIv2c=k09{FJi;TXL*V$lk*@HJRc-bLR79U^)C8$CHv&A** zSu+z|Sx&}_X{z}^BcS4!h3ln4hJ&~`@AA8dYi~)Z&nH+HyW803NnC2g*C{SXCg5*_ z$|AQrC1`abw-lhH6iY)!5^oDe%Q`Y~Z)6h=2^nz#ywHLEGtEz|MMQrju&Ch(llU*r zgow_H$UbyR`qHfz)gGorvTu8pE0+dikBFkZj5E7Y(Wlr~y|T-Un0dY+Shg$H4y9s#9q7OI=NCeDS%ie19jP}`t6R^~BKDp!zq9y4 z&*+98P@T5nZ9#6JciIiQRe}DILFsp^cg?7STt=Am$r-B>Rme z5o`rPo-a0?p;1kzb+9p=p`9?DR{5?>=dF^Av(?H2_EL8R zTB9#>GKrN@?#;gBggOUQkM@~$q8YznGC{O&w;?tsv%`O5AJ^QQyEK^=@WZyIrz$hK z*|%&`v)wY4mC$NqXYTS;?*7i)(%hLOcX?-8u@O77>N~RknsJweHH%{@QLH?fn~Ia{pc5iz+nYTu=9NJw2Rjzgi-~n9V?> zoodQ7Cl5O}evUZP``a!&vUT!~^vUC)Eoh;7>^ytQ&$BnB@9LD#9jDo=4|AtVcV+Ir znOcM|80;3&`%pryiPYtB_Wd^s*RPNRD^H^6L+{Bx2nvGh=7hx7*0 z8x7wESz_sk5@-on*`+Tm zG2AS%Vnm5MtOOTAjBewOW{Ic>#wHt-IXiQ2-!zc88*IaXN@e9X1X9(q$jWWLCuQWe z&|dekC}tmHS#v+FB6upD|rBU3yykBMS3)(F)Ci8cVZFse*4bCBH>RCva zdKOJ^(5bM+u8nikxv)t90|!u+CxXk>v6k?g7=@!yr-Da6!VJqppY>Izhy6zY6HeHj_ z>y<_WrS#AzPBvMHggrSW;_R6Z%jPPzI0dP~Sdm6&xRFY;U%y2Xm03tg5VN466{{>+ z2+TXInALCf7X5tHF1Sb8teCi?n}+e(WE@C| z`Vt(XCYnQ(dV`kk5mYi4m|I3(hl@vaj1G$>3}!;4g6R-%dP`M}TZRe8)!VYQGQ+dV z2)i*nc6|eqVVOM_%dh2oVQrxztjCwVv`5phgk2UKo`LqVZ^3MN)A1??_kLuA}JBjkVH_O071a?HdxDU}`G z)tm9^^eYMY6+YXSuWqp~;-Sl;SC3UxvL`R9&&{IP1xDrrDR0Z*7pWT+LgsU=E(M^_ z3v<_0N7@=0E^VVWeKY4xuAhfBbMH+JMtyJir%vNX!x!`~$Jy0#@l^af8PBE5mi+Ll zd!t2+IaPQ(`FwufeLl@QQkJgfIV$g*u{=6+=!)W+2Y(4@Yw-y+uTT6WF=CB&>fy<0 zG38f~`#VS%WQTT;tl2`oAc%czQqs>f16B^L2Ljtf;R+eBFWCjcbw{B|w7;y-;x-e2 zQ{f0Rf{|bxgLGt|hBvTF06!$lpZ}m-?9);-d#F{xAGMrHmi-KdwS9OAp`TWwuM}vj z{Sl2=_5j#~0%=ex8-p9xq~RZlS}`^=9HhSOr0r~7hmV*zMTI1I)`{ZMGarqL*JVFC zeykCa$5hucnkR*lS=ftI9|%mCV@fHNZS86UrAS$9c*Fyu878vOH{fXO7EL<{QYkh) zg)Q2T_>DO&R^ zz!=TTPs0j5|LahwQGo1Y6hIMT{e4h#pow4(7!KPU>?hpdgDX~BeNY?cytN+TbxJq7 z<(2_9s%pIJRsL=-Z-&--d7oZB5MHu@BKgxW2=SCMz{HhdNm!zAFDx5ys2dL1Cnih} z%Qe(Jz7nSqAs4MMd~Q^%t_>Dju0eUR!jLe=;4&4ZL%K6T>X2ZDEi-jpJIst96!oxy zFn+CZxTaY02_^Z++hHXYgq2}qqQsG7yxVMy5r^aqt&uEkQ=A)7o@`g!XMH>_dz83> z3$vXE{)-A18|dKTuaN1=cO?DlSY#@nV5Y$as${FN7817y%Uc=?@l*6yn_}-Yhrs^& zmZ*is$d{|)a^wswjC@ov>ZPO&o`Ht5tdoq-IweFiiu(**YFtv%qW=oU3u7gfFh7{8{OPkJI0$7CNx_gJ!s3^ZOsO*%!UWa1(3IHI7AB|Hp4VsnMxv=?r@ze zmiu;P3QnuJMH;NB?HWoJ>Q;}{TU`UIbHFC$F*)z_sNA}01>Z{RtZ8KkIP1q4!HkY@ zmv|dvak_cHn;GBZ_7iMK&NzfOT>R&P$rp1Ar_l;_%CuxN5zr?|D|XVI2yaq?9HLL$ z#Y@h^z)H3bie^)Sni(Xk09pP(8$=E}pXKq6um|O9CwqJg<%6{z859pz-DE?F@Zpz^ z<}ZKt<%io3!1@H+N1QFx9lRMQW7g;Uw=H3oq=%~%-?;k@O!fGarx;L4yaCL0%EP9D zT5XRDKqrBl*u{Zp&)Hah{nnj~Mev>OmI1VFdSU9eGdaZ!%3}1rMd`Im?+QlWWOi@# z7&xmt)L$g?Gl}~|`#NbeObLF1B(vsjQy=LCWX>qzWw*)1w5Ya|j0-J)!BCnKSI0-x zD2J(C1P>|9lnoGL4ezWQ8uugR#bONql)_wJ<#b!#nytXU0r}LCB*AP;TdSIS+I2pd zi7Dj9k41teHiZC^-Sl8kkUMvb#hU`l&VHHX{pr=|mH%yL12$5pwl%U`)x&22ASuAj zw>EZE&!!}0+YW`fgqFQLI4L;~KolsjSn=6WvJssNIR>%Y!p%vq#3318df#i~kbLfn z??=TY{CSy&XICJYz=fl(&5J7(${Iif z+g`*3>N33gAByW8(x$T4A*9*qeC@~)w&+r$Isx8*7Wf-clq{VNM?5bvNeCxGybOVx zjUW$2qrwIOtU`bco^77HLs&-+S@xD(z6p;bpToX)Q+^A1#Ds7&kt%`}0~x7b>Wg9& zcBvg*6Hk~2o_60)-sLTnKiS3VZQH?&in`F?%PrH|7Y)WmLzr%C6%GWOD4GCMU^78T z>`j~<9h+mxkMWJ1*A#8JR;&GCCSR$UM2p`YtU=p?QBUlY2|O`ynozd@QGgx4xbdq4 z?V@f16CUJ|I*2Z8yJ|0_*^kFT#6ifBATEu;X)ScnPx2uoMV%-dsPHx9L;Dd zWN}|a=hvN^%m2!*44Bh=~mZG@9_VqX|!efBVHBi%YmA*$kr;BjKH3 z&&{cK39Qxx%yfBzz-mWc3xLwZIiUzc1?pMc?skK&?9l-G1j#7og*pXYH8uVg5cqC3 z_7VX(t)PW((>HuS1WwflRczpt&Usa#>Htm^ZAvW|(aC8%m_bn&TUFrH8U!kng&QZN zK{VnV&s&*QmEd$S6o!bAW62LV6BbO_5$Y|)!yD^Wj;>)PpGoRL=8=e%j@ix& zaw=l&+Kelp6;_kd#$XU`n-{43RVkg1f;PV4V+{=(WtSDk zpg8Mij1#1gm^jJNcvvusD!n(Mmf~7=a!Nx$ww_MWg~G7nx@f^WWyM1N)a?>0Jr*TN zlRyWvy}Bc@Ty^*+*a@TwqTf0Xlb=I+*km!|j#Q0ypu-0nUm=AK~$ERD8CY-Sn##$PV_7wc}c_kUIMI& zWGR}o{X-0Z{liY=Rj+lH01~~nH;v7huCrxU8v6p~feYr0iyaA$)9?@qcOZM8Xkgt{ z!)sPOd-Li4v`D|J18Y8d-aRY7`pjJ$qSF4}?zybG4>7_S)?LJ?Mc*~Sl12=sFqK}v zr^t4or%VkA+k%V+q_ap!ksb%*{ORH|*_;+vwwNvm#0m&qqr>9-*!>jgXy@UySh>;- z@hK+~EzT3;pr+@H$*a*}*UZ@aUf!BCs>M^dQrv~9(k{3PPcQX`NyW|X_vmVT@v?6} zH1zbA~z(&8&pLh6jLwI9tcG!NVk!8rVtuSs9MIt;sqfinmi!@sDU&bs%}MX%YRIhSbPmqoa{38is?aVU3j=PSHev442)meSpA^ z;OLTyV6V8pzoYPUPqFNT_7hOAhGURGAC&P_xczugJDm2tcdTZz*ltINTfjF>(Fr#)TLz!5H>~uKSwXWt7L>=mRqu(-nP~=bg z#J|4bI1;;#zYR zK>tkR9MO83Jv56$Tq*V^I*9ekHg6yKDb`CS#8A0{vx(V^=Vjj>XYtTDTW!aCs|3r6 z+5ND-be;EQCIn9vwI_WfMAr2uB%zz;wL^y|$w5RknMrxMGHFM8K&%?D72*pROrnhJ z=6%#JQL>WJ8qQJEh1>4`2zAvSYFN{A_s%LtfmZ!nM&>N z(#U;GC5eFo{!SqZTK@oWh z7o&iW094&4ji-ujbBV{8CbiOLt&rCU2z{td2sHF=^~)rs*2|abSJ??Q38D*qvCh&} zGiBw%?H!Lr?!}DkqS*RO__e1t_ODwv_M^YUjlFJHHnwGYr8f4rMsIAcN5D^0ypMyA z5^89Bn~6O821ZfaN7s)wzzW;T;$dT!^x>k!4jZwj=eKCpBjR z8iK0aDg$_@v*s_VG8#hDF8h1fTbVsY*%#lax0< zMS$5_krW&z>&j$vX;17}6F*sykO-I;FgOBEPmsA>QfL-#e6a*c`_D_|6r$VGx;g?fvM8WA)gO27ysH^W7U5+Dk~|MPv<+P~S8gdwpa zGkroH=C}6RYp=_@-u15cw$?lBB9+#3?w{o+LO`EHoJ}A>rgd?QA?yC`220u94VFUB zDB*>-5Zg2ldqU$Gk$E7EzN2=eosOC~wyz!a{RDb8$aXje2mlNT5e~k7k{634{G*RX z!3ts1K;V3BAS!AkZ?X?$O&@G$XOM1ZH&wACrjAz{|^cJ;(Vc-~Zhy7;FqpLJ?KSH$)y=iN!Ol=aaF$ z+nj*lTm&maVbyug=%UX^-9#WXmQD&C%$l_3SoNR>Ah9?1VCtqibHp6}M1r8WQL}}* zVyJI?Z;jPQ47T3NF4947J0v5REGqL*C7Ayn`Z;iUn6d<=~3$cnCI;9u7{PjwosI<8)_Mh&Rf6LtPmhwjana>?-jfU*H zjvq)sEr9PWZ2-!MjW`oGAuKRw`qgBx`n*62`vaOBH3qO6T1Byx367<;@xU80=`Y&L$0wG|e|Z!NN(c@0@JZ%(6Mc8ep(fkFp5I3K? zN$N1i=hUYJf_d>z>;Fyqb5zz?EGA%LRFySb+1hv|xq#KO@yQg4ixtx@s)EO@_}XrM zXupdeXugUGjC!zd1WW>F0zxMg$@LX2V30h040@GKr%KXcOLHuHRWZ<1hkcuw;|r>I zHEh=j)EKgMNcisLV?FTE%7=!dy6M0YTS0u`durIU^QZn2>n%#TORQ;zdWVWvk@mDI z3nr6cUi=4rrvBs%g*ZY_#C+;U?pmmMwHy>-MKV!ymDj$oU!vhEK&fBhC@c^Q*5!)J z(+PlD;7$M-ZKx!VoR-`*6&TWC+AtJjYb9JY*Sj0J$t}E=)JAl`bh&L^mpNzB5X}ozalBJS_gm5$Iz)7A2OUsxP9hUcJ+>_n%-nYFoyEZe>tk1b z?^$;S`KzsC`K?MntRnIsbfefyiKmMaJH71hxE6+lwoc%8>eJ^tYnk+qRDpH(@1F`x ziyS6_WoSI7YaZp-{V2aaXy-cckz!!emSj5cg-FbZ0{9QzZ3C=!1q1=ZsaR%^jp9oj zF@b+jNy8%3VTr*&ZSV=Pt6YYEAp!rAv;W#S6)il7fIgwd;ZJ;NG+X ze$_{PcCPunJiD@466bT5sr9yd{DMNrC_rYUSEc)*F!aXh!vG^+E@K{Zb78$Ov&I zSqwu3!Kca0@K&di(ZX0zr}gfJw*s_)L9!ROfE|sBD>S%>UcsvB-1RjpjEC^&v;YBl zeaeDximam?xBXwNB73`7MTokX!y$CeaXuH^%jcL<+#M-yKVU6`6x-3^n%j?6I})wF z0PzVJo@*1Rfadaz0xA2W3f@#J(%J_bf;(N@RQB=DBDOVrPxu7lM)G{M$VBC;iRCUj|dK~ z6C_6Fan_-P8;f6@xo}Lg#zgo-0?y}yE8bxoTWz_; zt?&)X5t6f>{B-7Vn9UI!%?Jn0jx_MM-?3NOx@7JpeZo@%KIP%bX{>Pjncx#bA=PJ9 zQBOguBuEt`r+m7?BuXEpK~;JpjrnMI6RQvpEPzUgmhA0x1tpkh=`~bS4-4E%<2X<< zv1;oNMQKcArw*NOX}^9YuXwd#RY7RDLcz^y;D4Kg`g>4F7-;i(}_{fUrPRjF4&R_M4B433EKM z6!^o{t>T`FaCGw+7hgTUBLhTZWOeA5AuJ=R%ZJ?p-tS!pcGwQg-=xTS+H&|?MJCMaMVxeW17oAv(fJop#aR@7x%@!}bR@Nt?)@Yv~fPxKNt)WzHfid}ck zFgIx|r@zQo8+PPg!B<1?z&U)~`AKxHmldH+0lelg3_ps!N|S%%kB|wo%k`#W2c`Vk z?XV>~2Spc&tpbIlrJEWruuI=|l)|2nF0SLk)r|GXUCCObX@|46bjsQi>X?Rh9d1_B z76pZ;6zf%+It(X^l{^{Y=eRu7_j6sj)Wv3?T(5X?2+*NuKJC2ZB7Wd$7xKeRZ43Az zbo<}%gQ$HRyYbW8b~_Yl+UNf~p?jSlWWknXZR2aq=XV33W&|RukGu z&0yj3(+i>DXBwU3r(3E#xnluj92FoM{G@UtwF;227G&lsOLmtXrQnov zljJGP3laf%RHBs;Gg@pb9ShVQsTi!AiR)6)o3Ei3WI~)+ix-&$E_vdzjlVAr-zN?r+!WLjE-S$Pv#&q$`LEvkp$%XCox#5C z4*~WygLnQ1z`pC*J;DBnH<4_*9lr#$`mmR%&r#65RrBb5tSbl-#*5PULQ?!J&=0&P zmX8cBX%XlrzBPt#2Pq*oymp2=>Ew>q=kBU0>HVeJx2yS_uAX+Z>|4nYoT{-WUzaaD zv>n_70a5i!ytj5$LXNnnlQ5hXr(h|L99j$No!T=Em!00^b{j|QtnM@Vxey8YUD$7K z3^TN@c-!Q-xrvPyqo z0;yiE_p7X;snHb_;ErORtZ=-;(yk8fEQTYnJBlOJn(7X> zFeF#f9~TVFzUrM7Z*Y~x@X+ghlDI7El!QgzrC-KO)<&PC;I%%<=bLxq`=u>PZW1()Qo|MT2#&d#FUk>Q`8&hCC{_i`=7{Gb)aEAS$ zc8qN#Z9Sh_ljcd65qLEp=5f?hn7%_}vgol4^V0G0<3Okp7-Mu))+id$tq$srG*dOg zP5X+yVoKF%_s}MT+~Ibay+jImz+0i<3B!UX1c*Y8%!@s7>~ToPka&Tj-aM{g>XAzF zZ`rY1K~#KFgF!j0Gt4tI;v4+@WYwzWpZG8yg^@f8vCsHMLZ!4Jt8%H#F&C9v_`-^T ziBS}?Q3lD+YuvCY+jP+$FoveRT)Kh4TsB1tlc#4-kfI)J*W&eEV_t&f)7*f?o(OXZ ze({${UA94i69z)t(vEee2Z7%7Occ zMw59y_7Z~@y!(Gx<}sPW#DL#H=K22q%RIFAd@|3cmi%rq&o4)jdA@wv&V7=3-rGL= zi`ojQ2Xuk^`+c8^Uw7x1&O7TDE5GtU;Dw!)H?OVld@d@h0$XBrbbxI)RiL|fO~sd%i{tJ|K)OAPce}Zu zxR2f@b9j_bQE}kU=E% z$&^{TAkt<}mRh^ZafI8piAGNCVq#I*LAb(=@oXvhCxUMB<%LYkm}DEMxv@52Bfudy z?V8g_q!6EpejV*9`2nMbh4wSs=HQFdZjZTnls}PnLuP-l6|=v5%-B=W`_Kcvt)L@N z6>?mrU!CN3;&Rhz+lD!$VHuYM?i{bX)E9_r4-Q&v#m*I&nkVywj3-xMyb^Kmo#ImH zaHo-?3u2EE^Jepd)@3F=G56q^1Ig-_IPmV_9_*AY2e5riVLM6~r*I5m2gT@=u&9+a z%+*EQM~5+5(j{v3_Ha{xn5)97DrDb+>ldgarVB(mjvpxL{8VZ-XL}Vr7%pL z)GAdIk4yBxipRYdwV)#}xPeeW&8t993vzC$tfd#jg{hs^h!=x@q(uoqAEg!mVPPnNH#%B!4-0Ry03X7W(-#DgvA5t1UkaPC>Ij12#3~!DhQWt#qD6HGCs=c|a)-jgHF$TcGMdvku?H zeQfp?4W@tFnZnCMIEdWF9X*|awp48i=!DQQcVHVWy-=(p`3jZuhz3seK(i>;oj=ipGTFa^?@CEbeFl1OB~^+ z6)svQ2V(98iJJYUxw5K=Q54u^GUA#W{V1>02#mCpC#;FeJ9IgkjgN!O<{~Rjj^4_B z7pDLQ3jdj0-zqAd9;A%dI*N91M3sDjlFRLus@yE?2Uf$FS`7!LV@yp)aTC&zJNpaM z^x~Y^kk)O-$LUZ(GZ))x#XGe2lCZtM2#i-{so{6HW zGXx3fenXJnl3*j!v5GxdF>rV=4GQKBhTcF)*Rd!n6C`@GwBa z%!w=iDB=NC6jw;T3k__HFM)D!yOSaSZyd=rv2NE&9#i-<93Wu)yJ6t5w@(d%Spo8r z+?mj8D5Ehe&?Tg#4w@A}pD8Sr@$q)xnXfrV?5kVnxl1+`+3>g8TxPpipvf zVjHx*blvqp32DW3SJM$CKY0Zi4Nhlh0MxObhQ*HH`w>d747fpeyVGH$iNXV0!=yb7 z-|#J{@R=yh91&?go>PQn!6XPzN#VoqzDjJR~$jBdg8FcO}X%ly#$GCIR>j?s=y@)CXof)dz?Zob59-UtbtP$ZFM8W!>&fZPy!> zY$ZhJ&{sCrE?YF5&*Wqkf;j9I)()oIU0j=7+yN9gCLH9~>1GOD-arOkLR27-2UfyY zmDVm@?3^zlcxI$H0B-C#`vLANCOjXwRpL3py(2;=zUS>3V1p=05q-;CylrDy+0E*R z^4Tb%ZOxHR1_pBO5MP|!J%bg%+v&kvk`-Nr{yPaPV0?$~7J$x9Y$pIJ=bFvM$)GJv#qf%?*E^uivm! zYi+kt)4-nn)R@`GLGYk?0OEgWh<~SGSkN`HVG~UWs+%s(u=Q{jT=s#gwrfHjxPwpx z`d}B1L^~s_V4Q3e-Qp#LFB5mf3(@tgzA0bvmymY7irgzB^BicSse1lLgdd=6J-;iI z$E*S_qzH^Uy=UJj{-cZxiX*QNBR+hG*Zu4Wr9YK&w6(1Ci6U2)KZ*4Tgp{1A&;N0((Qq`Jok)T!B~UVvfl3Jby_RxaYE&SCl|$CA#$sLB1utTJ zjLdUEbBotxK^pepJOnP92=dgNgrodlkYt%@PHXBC0QOUk+lE9LwiOEnpiQ@bi6Pd5 zS9Qf~8C-j2b-4>%{eIuImr}IXzB?Bpr*W{o^F4!94W&k0xsi?VdAlPa5ABZ7bAV$N zITEuU6|u;ND-t>IBO)6b00k;B7h8wDA4-}P^;^CUkz7bfTYvz?922TV1J0}ZXj%RB zXf{^HlQybf&cRz*XsQV}R%GRaXL5!AjC@Er8%_(F z?~}Wlv27bC7w(rxTVcNb)7KN0@a+y3-A-g-CE&-MJoYwm*=!UaIYAi~PELCj>8|90 zzcq!Byq6^5VRhT03xLcH8gKSV%%rzkk_kLC+NLDznS8^1GQ~H{C(-_F@=1KdQdgAS z68*kD>XSj1y;N@BmVtlRJeR^fjG0uSc{0~pYT>L{-kRi{D6dLOEj3Tee5ivVurBjW z7Ql!!g4h+4DT85ggMOpKgO9(|<*(-~!l9g}g>#HRUNm0i0#>o;~4ou0^c#KWSZ#?}eVvcGSi+iL*O!UuD(aLbF z&UiRk$yZAXd?Rygi8rvc`NC&Qu?x9N)^ejjgp8q@TH1E`;RJP#qmyEN)QsMNX5=?4 zI29sGa{Iw@667WT=#MO*`bC(RV8%Cf$?VqB8P)+>YIm#JbR9Irwbw@AiY`(#%JD1- zlXFt7)pf{zx+L_YyW2UqdvT)L2 zEYM+hL9R+S+ZiOMI2Qc;rZh93)m-JytmayvjT102ss%`m>V?<90jOwXzb$DGd5`)X zPT2=sy*z!Q>`>TswfitVi}bL_?A$H`uN_d!-a^nsB%METZfg9?r(Rg*EDEPB z{F~CD*j^@#H+}YIday){+Y)==K&jr$_utGj0_|(#Tpik}HyBTa3Ir^hF_2vLc0iBX zjwdPaF0)OE9!L3*W%5^=LN&lj36$%t17I2&r6v4;z$fY~AE~J^o4`U+8lMQSrA)VE zsYH^PrPz=}ohg@U=dl#qQLoSwPbAPYZvG@{M~wFV3WlXs;4rrM4DFdDv- zEM%=xMnqz_yZg7l!aAt&m+$V^0HrdbMt!Yw#4s|(J3+g4od!c>UW)z#e{`rmJd18$ z2_zUML+=o9Xw>P8NO6~Va^3sTn{X#tyz2wYdr$+({6*4r;!;<%;@q1C!{a6}5&h|! zOOu=5V(KkT8JJ-n^Kbz43_qqD&-hW0|9{DEUSCl6G>h~1h>Rl4&$G+vEh*DMrTCi$$OjW^K`0w9U&>WI z&OdND0ZDy)_fX6)PlVXwt^7Z*mV$#ujpHeC17hxJk21%)5}NHW8oA87-&mIn1v zy!%HW`CdLkIC39dtdDBDf5azy`AB*$YiZ?P$3#c>@{zFCKKi6S0^$mEKRhN@@}3{@ z3D_?%gVnl8OC$u-It$%LCkYj1H;Vd%qEnohO)BjP;y%dEQ*UL)?YKZY#Ehzx@8YkI zW$w6&+kZQ={p}3@?K4O5tyJ~kfyiHMn5U1=v3s1%4Yv5)-^4-FC;HFtTs}(EuD@6K zxMTR5VMcpmfg7Ep4^S;X(Dt;n4YU$Qt;gI|+i$Uy{5RNb~BA;27* zb`Nia9P6GMb{H`nJOF5WcE2tw@mcokvSz3%j94|e1X5NH6QSi_^S^aAM5}R5yR4;L z+1b9V`}JjO-~m;*)3o%(o^TrTmJy`$;bav*TJIaJtgVMug3Q2V{}p*H{O_OOTGpDqTPX*A_dCBNY-_h9$o5AXf)p}becz$K< z`W|LG(X!JH!2H<`;0T))#zL#Fsa=w|^J13ukksT^&`nF>vCA^@oe{e$qn-F3ZDElE ztX=l2`$Y$TbiypT^eVkZ={}cUtMok5e04lfpeqa9({Vh}Kbg&@*#)B^_{)iDQEh9< zQEgriiGSlHFynE4&6$?xM1a)JOxYXsiWqd;6y#qb{amJ1(-Q^|MmV;UyfV%LMq z*TeuFwQPJYJuLdI{SrkGv_x|$<^SHmy~8-3{D@KDeZ-#dp7XoGo6q(M-bd^^yg61W zfPeJ&4DgMY7{IsiQvx`R?GME9yWR_e@2VSy|27;22K`{M`|q%J-x!dq;E{+aHMUosyfEP~I2?&E@gE8zt}9E0RAi!1+u# z{=5J;t$zu{M*;X;gZKL1GrWg3KO#y#_}xd!gk|o2f%_}E^WAZy)%?p?@@jf$WC5E8 zib~s1CBbIgqkc&EU|fX77C*pl!WPz%!uMF1>vlYB=}SuSu#I=<%zKx(K-kz-NSjB# z{gy*uv-`jh=xvl+lv{Slhq3X|5#&9LlUT>}QxjEJ%i8076zrP1OuH`Z^=?tH+1pT` zq~Q^afx6($WIF1QW}~huml1zD-$6?qaKbt=o{)UGHLH@vId}*}oLwtehPS{K4&RcH2r>5I_ z;k->|yf1j?JK#k^E9J^Ow*7-E>+f_TMVzz@&2vb7d0^Ykmw)=a3$Jr!YtkR||LTUD z&;Isj@A%>)9Osl2pQC&e+ijIU_TU#D`p}KrzI>OjTp#Sb;R`FjbLBcUs1L%tgAZWH z?Sn^d_}L{-K6Ih=#yYaYcO=L=DF(08lvgt>rE_}Y4%V=F7PedG_O}t0mE?NKooLa| zhjWy%EOgVThsjx->v|EYI8%Bh@z*eK4)w)1TWE}YmEF34@@JaqevHE%4BomK>=sUkziDl}R|6jVl(kPaJC!Rc@^s$|&F3S@H7)n&+- z*Dg_`1e8u0u7oo1VXN~KHz7Ud|JTWnkrv1h#6ym;cyF7ckfZUTDGHJ9SVyMLCcKMN zuSgk-p6bR0QJ*@A*CT|5M3+@to=uVWG~3AGQ=ifmKWrJx>RlkXErNpK@%ETAC;8 z(mvC0v{H3JszxVOhumT=dQ5M~kC*55CDhY6iW6zN2_&t;k_OmJ++A(!*@@ z_#g(zwCJ2UKWjs0Xm&Zk0e*392;XS$G6P55iWIf+scAMTTZR9i9x(}g#;#-dYg;n ztt4l@%vxhURBsQO4pj&<$M2eulge@O4gC3;et*amJHlbSVNN;@QwLCi97eB91tLud z9HAx*Q~6rGREyepErs*Si7thw#8QR~<%xi@khk7k6U!G{a4&R*f`cF~^g_Kwc=4*B zmvU?G+`#_Z@p|WQ2Ug%n;4=erj!wPNn(O}3`af_rkCMQqMDXX2-xAZ-&E6AFi^2eP=%)>N(VBkPoo#vNbQ!2ex3!^@#XRI+DZA~5W zPoZ$Mlqno7C50oO!d{8LqEb^Pe)-L9#o}6}`&|AyrROPaip6%|BB>RbhheoMQcR&% zB%j%`^&yO=b2#fqPQTdvd=xe89(YliWeV|x2w*E#*EceidB|-II`790N}MQM(KUMB z*p1;JDthp&bu8BjWgR4CuI7dVxA!4$DBh10B!WJ^)euK;e zOZ3b_@{Xgj&PiFb4Kh*=5C$^N9wRGYL;F{dYw(Wf_%-r&<)NN@4!&7?Q`^d{1qd^(ZM-CD9~wUk>&+)jYOO9qqozf97} zy%szIpFKQ~qCOCmylo*iLUY%I+OX|H#aCu|XyP9zN{Q{rYuauhSq*-~9I|W+gT@ZC zqZ7`gI&A4x-4W<7(afpx&Cir7%#@$n+feVPNy8+CJUf@P@MQI}EY1lrbmOHF}i0d zxPwn%XZ*%-nQn4QYWA{}AJ7CjSB`ZU-_*AYEf#REf_{ND%sId+xpkNa6z3H~y_<4q zv{fb)1c=FCK1ng++myvd!P*8pluF%w=cJ$kcxc%+qP1-)*1b~XB52pa16#(Ag#!_oZQFm^i^DA^gQw(O{O6mZKj0?;z)+IpO&3eB?C7pM%2D|S|~6A>%i3Z+Wv*;t~*Jq#5_$!#vWd7+b$ zWa5{L8yR3j^6usEFQI-ybw-G+ZH}(6YC7p-cudhRbM4c03}&ZegMw2Q3k)4luhl3X z!^wkxX{@^Lq5-AAF){IGx=nF6H{|Hli2QgApRtnT*%Y0Y3ny_ME=WTE_WE%w`7Zk6 zSTE~5><`y?15urXphNVs-oN(y!63)(`8n;~m%`LN)w?8r>2eJ0;j%-*U7tURtHc=k zX;6mz!WBy}x0hek`=7ny?#lmUWRaW=#RteIAwuft@BCky0ivIqkR?4MjnV;4DU#m` z%!rpFJ^J=4Ry+COGHDfm{rQuetQJF8rw8;ykCiK7*by_RC*S^g)XDd7w|RbQ`Kf?_ z4%cy+fbrJOSwd}tqYR#g^BIbHL`|4(SCqg1?ug)`Vze~-6|EW$#){9-GL{&D_(Yx_ zTY3*XRm2dq29cAX7#1c%@4+#DkIK=t?5XkPrnNnLyFzkR zL)II0#12(Zxx7$D?E@v?x?-s^@$Cf{1WGtM$xtSKKoG1WpzqX3J)kea8=2O2Skbze zHw!B&rvg!MJO@S3Wtg{%%5hv^H4s+xhYHUf`|#W`5(V3ds1~i+%?%<|IIn3PFrfp< zwm&tx3DM??K}e|-_fR*~5h{~>w#G&z@(;9Yc!se+_Tm{jEi|HIEKw&zYOyE1Ign}Oj}fSYFb;#VNhs| z`B^}MQm&XdV`bUXO!{Eft(;M^s_H?JLUBg65d8=7jCxFW5fjLci3Z*LK~qw#G_q4M znx<4TS2 z?T8X6G#>A%B$b6IGHxMSv9;to3k7cibV+bP1gUDm=(K>^yhnaq4tAzA0W1K@?!Sr( zP~w7UzE?r^xq692_{A0HHY6(TOPkG9zVcm-ADUνmE7DRbMEQxuBk5(O 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%0DC&wY^ghP9kRF1ZB`gr9^2| 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≥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%0A9?BZAWi$nqs=ZfBX?siinPp0% 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

    Xc8i=F+J#IaB3OGVWlatPZkDI0FuGs;SsKK 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
    (4XbG*8UL!q`MUNC&;H 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

    }(g$vurB7x0jJ^3#L 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

    pH*e4K(k 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

    XD$!i-hsnTs-`|@|63RnK@dc#GF$cDz^s(yT9%I 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ΞM_k>1CU-4JOg^JhXg+n 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

    lJ=A$nu-= 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 literal 0 HcmV?d00001 diff --git a/python/probing/bundled_web/public/assets/web_bg-dxhba4994a23785c69.wasm.br b/python/probing/bundled_web/public/assets/web_bg-dxhba4994a23785c69.wasm.br new file mode 100644 index 0000000000000000000000000000000000000000..97f93ca3ab06433074269772ecb8d1487a5b6fc0 GIT binary patch literal 1302861 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

    vu_-^xdg(Z4 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�!duyW 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

    0X}XGaB|l`eC9--gQSiNzhllJ_f#Th7 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�Jt6Mw{FKxAGdtzpb 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⁢WigDmBSW`q?U-#V#e0f(Q4+L9E< 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�ALmOV&rvzmqtmkGzjqP1ZDXmI8E5*(x1M_KxtU( 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 z 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�Fn83HkiwNO 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�*6d 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

  • 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Ƌk)nzwSR3T*3uo$nX*AX$bR7&2kD0p9 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ã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%0AN-^ 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

  • tEr3(Wf#X0A0k_nF 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/probing/ext/engines/__init__.py b/python/probing/ext/engines/__init__.py index 0be3db5d..cd75333f 100644 --- a/python/probing/ext/engines/__init__.py +++ b/python/probing/ext/engines/__init__.py @@ -15,7 +15,11 @@ register_slime_sglang_router, unregister_engine, ) -from probing.ext.engines.scraper import ensure_scraper_running, scrape_all, scrape_engine +from probing.ext.engines.scraper import ( + ensure_scraper_running, + scrape_all, + scrape_engine, +) __all__ = [ "ensure_scraper_running", diff --git a/python/probing/ext/engines/mock_sglang_server.py b/python/probing/ext/engines/mock_sglang_server.py index 3f3e52c0..41830762 100644 --- a/python/probing/ext/engines/mock_sglang_server.py +++ b/python/probing/ext/engines/mock_sglang_server.py @@ -14,6 +14,8 @@ import time from dataclasses import dataclass, field from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer + + @dataclass class MockSGLangState: num_requests_running: int = 0 @@ -107,7 +109,9 @@ def do_POST(self) -> None: # noqa: N802 except json.JSONDecodeError: payload = {} - max_new_tokens = int(payload.get("max_new_tokens") or payload.get("max_tokens") or 16) + max_new_tokens = int( + payload.get("max_new_tokens") or payload.get("max_tokens") or 16 + ) sleep_seconds = float(payload.get("mock_latency_seconds") or 0.05) state.begin_request(max_new_tokens, sleep_seconds) response = { @@ -151,7 +155,9 @@ def stop(self) -> None: self._httpd = None -def start_mock_sglang_server(host: str = "127.0.0.1", port: int = 0) -> MockSGLangServer: +def start_mock_sglang_server( + host: str = "127.0.0.1", port: int = 0 +) -> MockSGLangServer: state = MockSGLangState() handler = _make_handler(state) httpd = ThreadingHTTPServer((host, port), handler) diff --git a/python/probing/ext/engines/prometheus.py b/python/probing/ext/engines/prometheus.py index 6b488b9f..88abc063 100644 --- a/python/probing/ext/engines/prometheus.py +++ b/python/probing/ext/engines/prometheus.py @@ -25,7 +25,9 @@ def _parse_labels(raw: str) -> dict[str, str]: return {} labels: dict[str, str] = {} for match in _LABEL_PAIR.finditer(raw): - labels[match.group(1)] = match.group(2).replace('\\"', '"').replace("\\\\", "\\") + labels[match.group(1)] = ( + match.group(2).replace('\\"', '"').replace("\\\\", "\\") + ) return labels @@ -102,8 +104,12 @@ def pick_histogram_avg_seconds( return total / count for base in wanted_bases: - total_sum = sum(value for (metric_base, _), value in sums.items() if metric_base == base) - total_count = sum(value for (metric_base, _), value in counts.items() if metric_base == base) + total_sum = sum( + value for (metric_base, _), value in sums.items() if metric_base == base + ) + total_count = sum( + value for (metric_base, _), value in counts.items() if metric_base == base + ) if total_count > 0: return total_sum / total_count diff --git a/python/probing/ext/engines/scraper.py b/python/probing/ext/engines/scraper.py index 6f1f9662..0c25a32d 100644 --- a/python/probing/ext/engines/scraper.py +++ b/python/probing/ext/engines/scraper.py @@ -101,11 +101,17 @@ def _scraper_loop() -> None: def ensure_scraper_running() -> None: global _scraper_started - if os.environ.get("PROBING_ENGINE_SCRAPE", "1").strip().lower() in {"0", "false", "off"}: + if os.environ.get("PROBING_ENGINE_SCRAPE", "1").strip().lower() in { + "0", + "false", + "off", + }: return with _scraper_lock: if _scraper_started: return - thread = threading.Thread(target=_scraper_loop, name="probing-engine-scraper", daemon=True) + thread = threading.Thread( + target=_scraper_loop, name="probing-engine-scraper", daemon=True + ) thread.start() _scraper_started = True diff --git a/python/probing/ext/engines/sglang.py b/python/probing/ext/engines/sglang.py index 0b17a3a6..4f6d88e7 100644 --- a/python/probing/ext/engines/sglang.py +++ b/python/probing/ext/engines/sglang.py @@ -42,6 +42,7 @@ def resolve_metrics_path(metrics_path: str | None = None) -> str: return DEFAULT_METRICS_PATH return raw if raw.startswith("/") else f"/{raw}" + # Canonical metric names consumed by the Web UI. NORMALIZED_METRICS = ( "inflight_requests", @@ -78,7 +79,9 @@ def _latency_seconds_to_ms(value_seconds: float) -> float: return value_seconds * 1000.0 if value_seconds < 10 else value_seconds -def build_metrics_url(router_addr: str, metrics_path: str = DEFAULT_METRICS_PATH) -> str: +def build_metrics_url( + router_addr: str, metrics_path: str = DEFAULT_METRICS_PATH +) -> str: base = router_addr.rstrip("/") if not base.startswith(("http://", "https://")): base = f"http://{base}" @@ -110,7 +113,9 @@ def normalize_sglang_samples(samples: list[PrometheusSample]) -> dict[str, float if queue is not None: normalized["queue_depth"] = queue - throughput = pick_metric(samples, "gen_throughput", "generation_throughput", "token_throughput") + throughput = pick_metric( + samples, "gen_throughput", "generation_throughput", "token_throughput" + ) if throughput is not None: normalized["throughput_tps"] = throughput @@ -157,9 +162,13 @@ def normalize_sglang_samples(samples: list[PrometheusSample]) -> dict[str, float def _resolve_kv_cache_usage_ratio(samples: list[PrometheusSample]) -> float | None: """Map SGLang KV pool occupancy to a 0..1 ratio.""" - max_tokens = pick_metric(samples, "max_total_num_tokens", "max_num_tokens", "token_capacity") + max_tokens = pick_metric( + samples, "max_total_num_tokens", "max_num_tokens", "token_capacity" + ) if max_tokens in (None, 0): - return pick_metric(samples, "token_usage_ratio", "kv_cache_usage", "cache_usage") + return pick_metric( + samples, "token_usage_ratio", "kv_cache_usage", "cache_usage" + ) # ``launch_server`` exposes pool occupancy via kv_* gauges; ``token_usage`` may stay 0. kv_used = pick_metric(samples, "kv_used_tokens") @@ -229,7 +238,9 @@ def flatten_samples_for_storage( rows: list[tuple[int, str, str, str, float, str]] = [] for sample in samples: - labels = ",".join(f"{key}={value}" for key, value in sorted(sample.labels.items())) + labels = ",".join( + f"{key}={value}" for key, value in sorted(sample.labels.items()) + ) rows.append( ( timestamp_ns, diff --git a/python/probing/ext/ray.py b/python/probing/ext/ray.py index 7a64b074..d38636e8 100644 --- a/python/probing/ext/ray.py +++ b/python/probing/ext/ray.py @@ -330,7 +330,9 @@ def on_start(self, span, parent_context=None): span_kind = kind_map.get(span.kind) if span_kind: attrs["otel.span_kind"] = span_kind - attrs.update({k: _safe_str(v) for k, v in _process_identity_attrs().items()}) + attrs.update( + {k: _safe_str(v) for k, v in _process_identity_attrs().items()} + ) span_context = span.get_span_context() attrs["otel_trace_id"] = format(span_context.trace_id, "032x") @@ -512,7 +514,9 @@ def _collect_worker_info() -> dict[str, dict[str, Any]]: return result -def _process_id_for_worker(worker_id: str, node_id: str = "", worker_pid: int = 0) -> int: +def _process_id_for_worker( + worker_id: str, node_id: str = "", worker_pid: int = 0 +) -> int: if worker_pid > 0: return _stable_int(f"{node_id}:{worker_pid}") if worker_id: diff --git a/python/probing/ext/slime.py b/python/probing/ext/slime.py index 5b7bce21..b4edc6ad 100644 --- a/python/probing/ext/slime.py +++ b/python/probing/ext/slime.py @@ -29,7 +29,9 @@ def apply_env_bridge() -> None: After this runs, callers should only read ``PROBING_*`` / ``POD_IP`` / ``RAY_NODE_IP``. """ - if not os.environ.get("PROBING_RAY_PROCESS_ROLE") and os.environ.get("SLIME_PROBING_ROLE"): + if not os.environ.get("PROBING_RAY_PROCESS_ROLE") and os.environ.get( + "SLIME_PROBING_ROLE" + ): os.environ["PROBING_RAY_PROCESS_ROLE"] = os.environ["SLIME_PROBING_ROLE"] if not os.environ.get("PROBING_NODE_IP") and os.environ.get("SLIME_NODE_IP"): diff --git a/python/probing/ext/torch.py b/python/probing/ext/torch.py index 964b35e8..b09d243a 100644 --- a/python/probing/ext/torch.py +++ b/python/probing/ext/torch.py @@ -79,7 +79,7 @@ def optimizer_step_post_hook(optimizer, *args, **kwargs): def collective_hook(): - """Autostart low-overhead collective tracing for distributed torch jobs.""" + """Maybe start collective tracing (off by default; opt-in via config/env).""" from probing.profiling.collective import maybe_start_collective_tracing maybe_start_collective_tracing() diff --git a/python/probing/fakes/README.md b/python/probing/fakes/README.md new file mode 100644 index 00000000..54cf1cd5 --- /dev/null +++ b/python/probing/fakes/README.md @@ -0,0 +1,82 @@ +# probing.fakes — macOS / no-CUDA bottom-layer fakes + +Two modes: + +1. **Real Megatron-LM** (preferred) — run the checkout's `pretrain_gpt.py` with + only bottom-layer replacements (CUDA→cpu, triton/flash_attn stubs, FakeStore). +2. **Scripted fakes** — invent a Megatron-shaped surface for role/step debugging + without a Megatron checkout (`meta` device; no real forward). + +## Real Megatron-LM (bottom fakes only) + +Requires a sibling checkout (or `MEGATRON_LM=`): + +```bash +# ../Megatron-LM next to probing +PROBING=1 python examples/megatron/run_megatron_lm_pretrain.py --train-iters 2 +``` + +What is **kept real**: `megatron.core` / `megatron.training` / `pretrain_gpt.py`. + +What is **faked at the bottom**: + +| Layer | Mechanism | +|-------|-----------| +| CUDA device APIs | remap to `cpu` (default for this runner; `meta`/`mps` via `--device`) | +| `triton` / `flash_attn` | MetaPath stubs | +| Distributed | Megatron `--fake-process-group` | +| Dataset C++ helpers | pure-Python `helpers_cpp` fallback | +| `torch.compile` | noop | + +Do **not** invent `megatron.*` or `transformer_engine` on this path — Megatron +falls back to `--transformer-impl local` + Torch Norm / AdamW. + +## Scripted / import-surface fakes + +```bash +PROBING=1 python examples/megatron/pretrain_gpt.py --train-iters 4 +PROBING=1 python examples/megatron/megatron_meta_debug_loop.py +``` + +```python +from probing.fakes import install, run_scripted_loop + +install(force=True) # cuda → meta; fake megatron / te / apex / flash_attn +run_scripted_loop(steps=4, tp=1, dp=0) +``` + +## Environment + +| Variable | Default | Meaning | +|----------|---------|---------| +| `PROBING_FAKES` | unset (off) | `1`/`all` or comma list of specs | +| `PROBING_FAKES_FORCE` | unset | `1` to shadow real packages | +| `PROBING_FAKE_DEVICE` | `meta` (scripted) / `cpu` (real Megatron runner) | Remap target for CUDA APIs | +| `MEGATRON_LM` | `../Megatron-LM` (sibling of probing repo) | Official Megatron-LM checkout | +| `MEGATRON_LM_ALLOW_ANY_VERSION` | unset | `1` to skip 0.12.1–0.20.x smoke gate | + +### Megatron-LM location & versions + +Resolution order: **`MEGATRON_LM` / `--megatron-lm` → sibling `../Megatron-LM`**. + +- **Not multi-version in-process.** Point `MEGATRON_LM` at another tree to switch + (e.g. `Megatron-LM-0.19` vs `Megatron-LM-main`). Pip `megatron-core` is purged + from `sys.path` / `sys.modules` once the checkout is bootstrapped. +- Smoke CLI defaults target **megatron-core ≥0.12.1 and <0.21**. Outside that range, + set `MEGATRON_LM_ALLOW_ANY_VERSION=1`. +- Unit coverage: `tests/unit/probing/fakes/test_megatron_lm_env.py`. +- Opt-in regression: `PROBING_MEGATRON_REAL_LM=1 pytest -m integration tests/regression/ext/test_megatron_real_lm.py`. + +Built-in specs: `megatron`, `transformer_engine` (`te`), `apex`, `flash_attn`, `triton`. + +## Correlation / verify + +Fake steps and hooked `torch.distributed` collectives append `python.fake_event` +rows. Collectives also dual-write `python.comm_collective`. + +```python +from probing.fakes import verify_against_probing + +report = verify_against_probing(require_train_steps=4) +report.raise_if_failed() +``` diff --git a/python/probing/fakes/__init__.py b/python/probing/fakes/__init__.py new file mode 100644 index 00000000..3c38062c --- /dev/null +++ b/python/probing/fakes/__init__.py @@ -0,0 +1,211 @@ +"""``probing.fakes`` — invent missing CUDA/Megatron packages for macOS debugging. + +Opt-in only. Typical usage:: + + from probing.fakes import install + install(force=True) + from probing.fakes import run_scripted_loop + run_scripted_loop(steps=4) + +Or via env / CLI:: + + PROBING_FAKES=1 PROBING_FAKES_FORCE=1 PROBING_FAKE_DEVICE=meta \\ + python -m probing.fakes loop + +Real Megatron-LM checkout (default ``../Megatron-LM``):: + + python examples/megatron/run_megatron_lm_pretrain.py --train-iters 4 + +**Limits:** ``meta`` has no storage — real forward/backward will fail. This +package is for topology, import, and probing observability debugging. +""" + +from __future__ import annotations + +import logging +import os +from typing import Iterable, Optional + +from . import registry +from .device import ( + install_device_remap, + is_device_remap_installed, + resolve_fake_device, + target_device, + uninstall_device_remap, +) +from .finder import ( + clear_injected_modules, + force_enabled, + install_finder, + purge_prefixed_modules, + set_force, + uninstall_finder, +) +from .torch_hooks import ( + install_torch_dist_hooks, + uninstall_torch_dist_hooks, +) + +# Register built-in specs at import time (no journal / tracing import). +from . import specs as _specs # noqa: F401 + +logger = logging.getLogger(__name__) + +__all__ = [ + "install", + "uninstall", + "is_installed", + "maybe_install_from_env", + "target_device", + "resolve_fake_device", + "run_scripted_loop", + "run_pretrain", + "registered_specs", + "FakeEvent", + "record_fake_event", + "begin_run", + "current_run_id", + "verify_against_probing", + "VerifyReport", +] + +_INSTALLED = False + + +def registered_specs() -> dict[str, registry.FakeSpec]: + return registry.registered() + + +def is_installed() -> bool: + return _INSTALLED + + +def _env_force() -> bool: + raw = os.environ.get("PROBING_FAKES_FORCE", "").strip().lower() + return raw in {"1", "true", "on", "yes"} + + +def install( + *, + device: Optional[str] = None, + specs: Iterable[str] | None = None, + remap_device: bool = True, + force: bool | None = None, +) -> None: + """Enable fake specs and (by default) remap CUDA onto ``device``. + + ``force=True`` (or ``PROBING_FAKES_FORCE=1``) shadows real packages for the + enabled prefixes — required when megatron-core is installed but broken on + macOS (missing triton/CUDA). + """ + global _INSTALLED + from .journal import begin_run, record_fake_event + + use_force = _env_force() if force is None else bool(force) + registry.enable(specs) + set_force(use_force) + if use_force: + prefixes: list[str] = [] + for name in registry.enabled_names(): + prefixes.extend(registry.registered()[name].prefixes) + removed = purge_prefixed_modules(prefixes) + if removed: + logger.info( + "probing.fakes force-purged %d modules: %s", + len(removed), + ", ".join(sorted(removed)[:8]) + ("…" if len(removed) > 8 else ""), + ) + install_finder() + if remap_device: + install_device_remap(device) + install_torch_dist_hooks() + run_id = begin_run() + record_fake_event( + "install", + "probing.fakes", + device=target_device() if is_device_remap_installed() else "", + attrs={ + "specs": sorted(registry.enabled_names()), + "force": force_enabled(), + "run_id": run_id, + }, + ) + _INSTALLED = True + logger.info( + "probing.fakes installed (run=%s specs=%s, device=%s, force=%s)", + run_id, + sorted(registry.enabled_names()), + target_device() if is_device_remap_installed() else "unchanged", + force_enabled(), + ) + + +def uninstall() -> None: + """Remove the finder, device remap, and modules injected by fakes.""" + global _INSTALLED + try: + from .journal import record_fake_event + + record_fake_event("uninstall", "probing.fakes") + except Exception: + pass + uninstall_torch_dist_hooks() + uninstall_finder() + clear_injected_modules() + uninstall_device_remap() + registry.disable_all() + _INSTALLED = False + logger.info("probing.fakes uninstalled") + + +def maybe_install_from_env() -> bool: + """Install when ``PROBING_FAKES`` is set to an enabling value. + + Returns True if install ran. + """ + names = registry.parse_fakes_env(os.environ.get("PROBING_FAKES")) + if names is None: + return False + install(specs=names) + return True + + +def run_scripted_loop(**kwargs): + from .loop import run_scripted_loop as _run + + return _run(**kwargs) + + +def run_pretrain(**kwargs): + from .pretrain import run_pretrain as _run + + return _run(**kwargs) + + +def __getattr__(name: str): + if name == "FakeEvent": + from .journal import FakeEvent + + return FakeEvent + if name == "record_fake_event": + from .journal import record_fake_event + + return record_fake_event + if name == "begin_run": + from .journal import begin_run + + return begin_run + if name == "current_run_id": + from .journal import current_run_id + + return current_run_id + if name == "verify_against_probing": + from .verify import verify_against_probing + + return verify_against_probing + if name == "VerifyReport": + from .verify import VerifyReport + + return VerifyReport + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/python/probing/fakes/__main__.py b/python/probing/fakes/__main__.py new file mode 100644 index 00000000..741a3c89 --- /dev/null +++ b/python/probing/fakes/__main__.py @@ -0,0 +1,117 @@ +"""CLI: ``python -m probing.fakes [install|uninstall|status|loop|pretrain_gpt]``.""" + +from __future__ import annotations + +import argparse +import json +import sys + + +def main(argv: list[str] | None = None) -> int: + argv = list(sys.argv[1:] if argv is None else argv) + # Allow ``python -m probing.fakes pretrain_gpt --train-iters 4`` + if argv and argv[0] == "pretrain_gpt": + # Prefer the examples script so CLI flags stay in one place. + from probing.fakes.megatron_lm import probing_repo_root + + root = probing_repo_root() + script = root / "examples" / "pretrain_gpt.py" + if script.is_file(): + import runpy + + sys.argv = [str(script), *argv[1:]] + runpy.run_path(str(script), run_name="__main__") + return 0 + # Fallback: in-package minimal runner + from probing.fakes.specs import megatron as megatron_spec + from probing.fakes import install, run_pretrain + + install(force=True) + megatron_spec.set_args(megatron_spec.default_args(train_iters=4)) + megatron_spec.ensure_sys_modules() + result = run_pretrain() + print(result) + return 0 + + parser = argparse.ArgumentParser( + prog="python -m probing.fakes", + description="Fake CUDA/Megatron packages for macOS meta-device debugging", + ) + parser.add_argument( + "command", + nargs="?", + default="status", + choices=("install", "uninstall", "status", "loop", "pretrain_gpt"), + ) + parser.add_argument("--steps", type=int, default=4, help="scripted loop steps") + parser.add_argument("--tp", type=int, default=0) + parser.add_argument("--pp", type=int, default=0) + parser.add_argument("--dp", type=int, default=0) + parser.add_argument("--device", default=None, help="meta|cpu|mps") + parser.add_argument( + "--force", + action="store_true", + help="shadow real packages (or set PROBING_FAKES_FORCE=1)", + ) + args, _unknown = parser.parse_known_args(argv) + + from probing import fakes + + if args.command == "install": + if args.force: + import os + + os.environ["PROBING_FAKES_FORCE"] = "1" + fakes.maybe_install_from_env() or fakes.install( + device=args.device, force=args.force or None + ) + print("installed", sorted(fakes.registered_specs())) + print("force", args.force) + return 0 + + if args.command == "uninstall": + fakes.uninstall() + print("uninstalled") + return 0 + + if args.command == "status": + print( + json.dumps( + { + "installed": fakes.is_installed(), + "device": fakes.target_device() if fakes.is_installed() else None, + "specs": sorted(fakes.registered_specs()), + }, + indent=2, + ) + ) + return 0 + + if args.command == "loop": + fakes.maybe_install_from_env() or fakes.install(device=args.device, force=True) + result = fakes.run_scripted_loop( + steps=args.steps, + tp=args.tp, + pp=args.pp, + dp=args.dp, + device=args.device, + ) + print( + json.dumps( + { + "steps": result.steps, + "role": result.role, + "device": result.device, + "last_iteration": result.last_iteration, + }, + indent=2, + ) + ) + return 0 + + parser.error(f"unknown command {args.command}") + return 2 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/python/probing/fakes/bottom.py b/python/probing/fakes/bottom.py new file mode 100644 index 00000000..36c97a00 --- /dev/null +++ b/python/probing/fakes/bottom.py @@ -0,0 +1,65 @@ +"""Bottom-layer patches applied before importing real Megatron.""" + +from __future__ import annotations + +import logging +import os + +logger = logging.getLogger(__name__) + + +def _noop_compile(fn=None, *args, **kwargs): # noqa: ANN001 + """Drop-in for ``torch.compile`` that never invokes dynamo.""" + del args, kwargs + if fn is not None: + return fn + return lambda f: f + + +def apply_bottom_patches() -> None: + """Disable torch.compile / dynamo paths that break on fake Triton + macOS.""" + os.environ.setdefault("TORCHDYNAMO_DISABLE", "1") + os.environ.setdefault("TORCH_COMPILE_DISABLE", "1") + + try: + import torch + + if hasattr(torch, "compile"): + torch.compile = _noop_compile # type: ignore[method-assign, assignment] + except Exception as exc: + logger.debug("torch.compile patch skipped: %s", exc) + + try: + import triton + + if not getattr(triton, "__version__", None): + triton.__version__ = "3.0.0+probing.fakes" + except Exception as exc: + logger.debug("triton version stamp skipped: %s", exc) + + +def skip_dataset_cpp_helpers() -> None: + """Prefer a pure-Python ``helpers_cpp`` when the pybind11 extension is absent. + + Real indexed datasets should still compile ``helpers.so`` via Megatron's Makefile; + this path is for ``--mock-data`` macOS smoke runs. + """ + try: + from probing.fakes.helpers_cpp import install_helpers_cpp_fallback + + install_helpers_cpp_fallback() + except Exception as exc: + logger.debug("helpers_cpp fallback skipped: %s", exc) + + try: + from megatron.core.datasets import utils as ds_utils + + def _noop_compile_helpers() -> None: + logger.info( + "probing.fakes: skipping megatron dataset C++ helpers compile " + "(using pure-Python helpers_cpp fallback)" + ) + + ds_utils.compile_helpers = _noop_compile_helpers # type: ignore[method-assign] + except Exception as exc: + logger.debug("compile_helpers patch skipped: %s", exc) diff --git a/python/probing/fakes/device.py b/python/probing/fakes/device.py new file mode 100644 index 00000000..b605d421 --- /dev/null +++ b/python/probing/fakes/device.py @@ -0,0 +1,468 @@ +"""Remap CUDA device APIs onto ``meta`` / ``cpu`` / ``mps`` for macOS debugging.""" + +from __future__ import annotations + +import logging +from dataclasses import dataclass +from typing import Any, Callable, Optional + +logger = logging.getLogger(__name__) + +_SUPPORTED = frozenset({"meta", "cpu", "mps"}) +_FACTORY_NAMES = ( + "empty", + "zeros", + "ones", + "randn", + "rand", + "full", + "arange", + "tensor", + "as_tensor", + "empty_like", + "zeros_like", + "ones_like", + "randn_like", + "rand_like", + "full_like", +) + + +@dataclass +class _DevicePatchState: + target: str = "meta" + installed: bool = False + originals: dict[str, Any] | None = None + + +_STATE = _DevicePatchState() + + +def resolve_fake_device(raw: str | None = None) -> str: + import os + + text = ( + raw if raw is not None else os.environ.get("PROBING_FAKE_DEVICE", "meta") + ).strip() + lowered = text.lower() or "meta" + if lowered not in _SUPPORTED: + raise ValueError( + f"PROBING_FAKE_DEVICE={text!r} unsupported; use one of {sorted(_SUPPORTED)}" + ) + if lowered == "mps": + import torch + + mps = getattr(torch.backends, "mps", None) + if mps is None or not mps.is_available(): + logger.warning("mps unavailable; falling back to cpu for probing.fakes") + return "cpu" + return lowered + + +def target_device() -> str: + return _STATE.target + + +def is_device_remap_installed() -> bool: + return _STATE.installed + + +def _is_cuda_spec(value: Any, *, torch: Any) -> bool: + if isinstance(value, torch.device): + return value.type == "cuda" + # ``torch.cuda.current_device()`` returns an int index; with remap installed + # ``is_available()`` is True so factories treat bare ints as CUDA ordinals. + if isinstance(value, int): + return True + text = str(value).strip().lower() + return text == "cuda" or text.startswith("cuda:") + + +def _as_target_device(device: Any, *, torch: Any) -> Any: + target = _STATE.target + if device is None: + return torch.device(target) + if _is_cuda_spec(device, torch=torch): + return torch.device(target) + return device + + +def _wrap_factory(orig: Callable[..., Any], torch: Any) -> Callable[..., Any]: + def wrapped(*args: Any, **kwargs: Any) -> Any: + if "device" in kwargs and _is_cuda_spec(kwargs["device"], torch=torch): + kwargs = {**kwargs, "device": _STATE.target} + return orig(*args, **kwargs) + + return wrapped + + +class _FakeCudaStream: + """No-op stand-in for ``torch.cuda.Stream`` on non-CUDA hosts.""" + + def __init__(self, device: Any = None, priority: int = 0, **_kwargs: Any) -> None: + del priority + import torch + + if device is None: + self.device = torch.device(_STATE.target) + elif isinstance(device, int): + self.device = torch.device(_STATE.target) + else: + self.device = ( + torch.device(device) if not isinstance(device, torch.device) else device + ) + self.stream_id = 0 + self.device_index = 0 + self.device_type = getattr(self.device, "type", _STATE.target) + + def wait_stream(self, _stream: Any) -> None: + return None + + def wait_event(self, _event: Any) -> None: + return None + + def record_event(self, event: Any = None) -> Any: + return event if event is not None else _FakeCudaEvent() + + def synchronize(self) -> None: + return None + + def query(self) -> bool: + return True + + def __eq__(self, other: object) -> bool: + return isinstance(other, _FakeCudaStream) + + def __hash__(self) -> int: + return id(self) + + def __enter__(self) -> "_FakeCudaStream": + return self + + def __exit__(self, *exc: Any) -> None: + return None + + +class _FakeCudaEvent: + def __init__( + self, + enable_timing: bool = False, + blocking: bool = False, + interprocess: bool = False, + ) -> None: + del enable_timing, blocking, interprocess + + def record(self, _stream: Any = None) -> None: + return None + + def wait(self, _stream: Any = None) -> None: + return None + + def query(self) -> bool: + return True + + def synchronize(self) -> None: + return None + + def elapsed_time(self, _end_event: Any) -> float: + return 0.0 + + +_FAKE_CURRENT_STREAM = _FakeCudaStream() + + +def install_device_remap(device: str | None = None) -> str: + """Patch ``torch.cuda`` / ``Tensor.cuda`` / ``Module.cuda`` onto ``device``.""" + import torch + + target = resolve_fake_device(device) + if _STATE.installed: + _STATE.target = target + return target + + originals: dict[str, Any] = {} + + cuda_mod = torch.cuda + for name in ( + "is_available", + "device_count", + "current_device", + "set_device", + "synchronize", + "empty_cache", + "is_initialized", + "manual_seed", + "manual_seed_all", + ): + originals[name] = getattr(cuda_mod, name, None) + + def _is_available() -> bool: + return True + + def _device_count() -> int: + return 1 + + def _current_device() -> int: + return 0 + + def _set_device(_idx: int = 0) -> None: + return None + + def _synchronize(_device: Any = None) -> None: + return None + + def _empty_cache() -> None: + return None + + def _is_initialized() -> bool: + return True + + def _manual_seed(_seed: int) -> None: + # No-op: torch.manual_seed() itself calls cuda.manual_seed_all when + # is_available() is True — must not recurse into torch.manual_seed. + return None + + def _manual_seed_all(_seed: int) -> None: + return None + + def _get_rng_state(device: Any = None) -> Any: + # Mirror CPU RNG so Megatron's CudaRNGStatesTracker can fork/restore. + del device + return torch.get_rng_state() + + def _set_rng_state(new_state: Any, device: Any = None) -> None: + del device + torch.set_rng_state(new_state) + + def _get_rng_state_all() -> list[Any]: + return [_get_rng_state()] + + def _set_rng_state_all(states: list[Any]) -> None: + if states: + _set_rng_state(states[0]) + + def _lazy_init() -> None: + return None + + def _lazy_call(callable_fn: Any, **_kwargs: Any) -> None: + # Host CUDA queues these until real init; with fake is_available we run now. + try: + callable_fn() + except Exception as exc: + logger.debug("cuda._lazy_call suppressed: %s", exc) + + # Always overwrite — host CUDA stubs exist on macOS but crash when called. + cuda_mod.is_available = _is_available # type: ignore[method-assign] + cuda_mod.device_count = _device_count # type: ignore[method-assign] + cuda_mod.current_device = _current_device # type: ignore[method-assign] + cuda_mod.set_device = _set_device # type: ignore[method-assign] + cuda_mod.synchronize = _synchronize # type: ignore[method-assign] + cuda_mod.empty_cache = _empty_cache # type: ignore[method-assign] + cuda_mod.is_initialized = _is_initialized # type: ignore[method-assign] + cuda_mod.manual_seed = _manual_seed # type: ignore[method-assign] + cuda_mod.manual_seed_all = _manual_seed_all # type: ignore[method-assign] + + for rng_name, rng_fn in ( + ("get_rng_state", _get_rng_state), + ("set_rng_state", _set_rng_state), + ("get_rng_state_all", _get_rng_state_all), + ("set_rng_state_all", _set_rng_state_all), + ): + originals[rng_name] = getattr(cuda_mod, rng_name, None) + setattr(cuda_mod, rng_name, rng_fn) + + originals["_lazy_init"] = getattr(cuda_mod, "_lazy_init", None) + cuda_mod._lazy_init = _lazy_init # type: ignore[method-assign] + originals["_lazy_call"] = getattr(cuda_mod, "_lazy_call", None) + cuda_mod._lazy_call = _lazy_call # type: ignore[method-assign] + + # Megatron's CudaRNGStatesTracker indexes default_generators[current_device]. + originals["default_generators"] = getattr(cuda_mod, "default_generators", ()) + try: + cuda_mod.default_generators = (torch.Generator(device="cpu"),) # type: ignore[misc] + except Exception as exc: + logger.debug("default_generators stub skipped: %s", exc) + + # Stream / Event are dummy base classes on non-CUDA builds. + originals["Stream"] = getattr(cuda_mod, "Stream", None) + originals["Event"] = getattr(cuda_mod, "Event", None) + originals["current_stream"] = getattr(cuda_mod, "current_stream", None) + originals["default_stream"] = getattr(cuda_mod, "default_stream", None) + cuda_mod.Stream = _FakeCudaStream # type: ignore[misc, assignment] + cuda_mod.Event = _FakeCudaEvent # type: ignore[misc, assignment] + + def _current_stream(_device: Any = None) -> _FakeCudaStream: + return _FAKE_CURRENT_STREAM + + def _default_stream(_device: Any = None) -> _FakeCudaStream: + return _FAKE_CURRENT_STREAM + + cuda_mod.current_stream = _current_stream # type: ignore[method-assign] + if originals["default_stream"] is not None: + cuda_mod.default_stream = _default_stream # type: ignore[method-assign] + + class _NoopCtx: + def __init__(self, *_a: Any, **_k: Any) -> None: + return None + + def __enter__(self) -> None: + return None + + def __exit__(self, *exc: Any) -> bool: + return False + + def _stream_ctx(_stream: Any = None) -> _NoopCtx: + return _NoopCtx() + + def _device_ctx(_device: Any = None) -> _NoopCtx: + return _NoopCtx() + + def _set_stream(_stream: Any = None) -> None: + return None + + originals["stream"] = getattr(cuda_mod, "stream", None) + originals["device_ctx"] = getattr(cuda_mod, "device", None) + originals["set_stream"] = getattr(cuda_mod, "set_stream", None) + cuda_mod.stream = _stream_ctx # type: ignore[method-assign, assignment] + cuda_mod.device = _device_ctx # type: ignore[misc, assignment] + if originals["set_stream"] is not None: + cuda_mod.set_stream = _set_stream # type: ignore[method-assign] + + # torch.cuda.random binds current_device/device_count at import time — refresh. + random_mod = getattr(cuda_mod, "random", None) + if random_mod is not None: + for name, fn in ( + ("current_device", _current_device), + ("device_count", _device_count), + ("get_rng_state", _get_rng_state), + ("set_rng_state", _set_rng_state), + ("get_rng_state_all", _get_rng_state_all), + ("set_rng_state_all", _set_rng_state_all), + ("manual_seed", _manual_seed), + ("manual_seed_all", _manual_seed_all), + ): + key = f"random.{name}" + originals[key] = getattr(random_mod, name, None) + setattr(random_mod, name, fn) + + originals["Tensor.cuda"] = torch.Tensor.cuda + originals["Tensor.to"] = torch.Tensor.to + originals["Module.cuda"] = torch.nn.Module.cuda + originals["Module.to"] = torch.nn.Module.to + + _orig_tensor_to = originals["Tensor.to"] + _orig_module_to = originals["Module.to"] + + def _tensor_cuda(self: Any, device: Any = None, *args: Any, **kwargs: Any) -> Any: + del device, args, kwargs + return _orig_tensor_to(self, target) + + def _module_cuda(self: Any, device: Any = None) -> Any: + del device + return _orig_module_to(self, target) + + def _tensor_to(self: Any, *args: Any, **kwargs: Any) -> Any: + if args and _is_cuda_spec(args[0], torch=torch): + args = (_as_target_device(args[0], torch=torch),) + args[1:] + if "device" in kwargs and _is_cuda_spec(kwargs["device"], torch=torch): + kwargs = { + **kwargs, + "device": _as_target_device(kwargs["device"], torch=torch), + } + return _orig_tensor_to(self, *args, **kwargs) + + def _module_to(self: Any, *args: Any, **kwargs: Any) -> Any: + if args and not isinstance(args[0], torch.nn.Module): + if _is_cuda_spec(args[0], torch=torch): + args = (_as_target_device(args[0], torch=torch),) + args[1:] + if "device" in kwargs and _is_cuda_spec(kwargs["device"], torch=torch): + kwargs = { + **kwargs, + "device": _as_target_device(kwargs["device"], torch=torch), + } + return _orig_module_to(self, *args, **kwargs) + + torch.Tensor.cuda = _tensor_cuda # type: ignore[method-assign, assignment] + torch.Tensor.to = _tensor_to # type: ignore[method-assign, assignment] + torch.nn.Module.cuda = _module_cuda # type: ignore[method-assign, assignment] + torch.nn.Module.to = _module_to # type: ignore[method-assign, assignment] + + for name in _FACTORY_NAMES: + orig = getattr(torch, name, None) + if callable(orig): + originals[f"torch.{name}"] = orig + setattr(torch, name, _wrap_factory(orig, torch)) + + _STATE.target = target + _STATE.installed = True + _STATE.originals = originals + logger.info("probing.fakes device remap installed (cuda → %s)", target) + return target + + +def uninstall_device_remap() -> None: + if not _STATE.installed or not _STATE.originals: + return + import torch + + originals = _STATE.originals + cuda_mod = torch.cuda + for name in ( + "is_available", + "device_count", + "current_device", + "set_device", + "synchronize", + "empty_cache", + "is_initialized", + "manual_seed", + "manual_seed_all", + "get_rng_state", + "set_rng_state", + "get_rng_state_all", + "set_rng_state_all", + "_lazy_init", + "_lazy_call", + "default_generators", + "Stream", + "Event", + "current_stream", + "default_stream", + "stream", + "device_ctx", + "set_stream", + ): + if name not in originals: + continue + attr = "device" if name == "device_ctx" else name + setattr(cuda_mod, attr, originals[name]) + + random_mod = getattr(cuda_mod, "random", None) + if random_mod is not None: + for name in ( + "current_device", + "device_count", + "get_rng_state", + "set_rng_state", + "get_rng_state_all", + "set_rng_state_all", + "manual_seed", + "manual_seed_all", + ): + key = f"random.{name}" + if key in originals: + setattr(random_mod, name, originals[key]) + + torch.Tensor.cuda = originals["Tensor.cuda"] # type: ignore[method-assign] + torch.Tensor.to = originals["Tensor.to"] # type: ignore[method-assign] + torch.nn.Module.cuda = originals["Module.cuda"] # type: ignore[method-assign] + torch.nn.Module.to = originals["Module.to"] # type: ignore[method-assign] + + for name in _FACTORY_NAMES: + key = f"torch.{name}" + if key in originals: + setattr(torch, name, originals[key]) + + _STATE.installed = False + _STATE.originals = None + logger.info("probing.fakes device remap uninstalled") diff --git a/python/probing/fakes/finder.py b/python/probing/fakes/finder.py new file mode 100644 index 00000000..db4a2890 --- /dev/null +++ b/python/probing/fakes/finder.py @@ -0,0 +1,157 @@ +"""MetaPath finder that invents missing third-party packages.""" + +from __future__ import annotations + +import importlib.abc +import importlib.machinery +import importlib.util +import logging +import sys +import types +from typing import Optional, Sequence + +from . import registry + +logger = logging.getLogger(__name__) + +_FORCE = False + + +def set_force(force: bool) -> None: + global _FORCE + _FORCE = bool(force) + + +def force_enabled() -> bool: + return _FORCE + + +class _FakeLoader(importlib.abc.Loader): + def __init__(self, fullname: str, module: types.ModuleType): + self.fullname = fullname + self.module = module + + def create_module(self, spec: importlib.machinery.ModuleSpec) -> types.ModuleType: + return self.module + + def exec_module(self, module: types.ModuleType) -> None: + return None + + +class FakeFinder(importlib.abc.MetaPathFinder): + """Invent modules for enabled fake specs when the real package is absent. + + With ``force=True`` (see ``set_force``), shadow even if a real package is + installed — needed on macOS when megatron-core is present but unusable. + """ + + def find_spec( + self, + fullname: str, + path: Optional[Sequence[str]], + target: Optional[types.ModuleType] = None, + ) -> Optional[importlib.machinery.ModuleSpec]: + del path, target + spec = registry.match_spec(fullname) + if spec is None: + return None + if not _FORCE and _real_module_available(fullname): + return None + + module = spec.factory(fullname) + module.__name__ = fullname + module.__package__ = fullname.rpartition(".")[0] + module.__probing_fake__ = True # type: ignore[attr-defined] + if not hasattr(module, "__path__") and _looks_like_package(fullname, spec): + module.__path__ = [] # type: ignore[attr-defined] + loader = _FakeLoader(fullname, module) + is_pkg = hasattr(module, "__path__") + module_spec = importlib.util.spec_from_loader( + fullname, loader, is_package=is_pkg + ) + if module_spec is not None: + module_spec.origin = f"probing.fakes:{spec.name}" + module.__spec__ = module_spec + note_injected(fullname) + logger.debug( + "probing.fakes serving %s via spec %s (force=%s)", + fullname, + spec.name, + _FORCE, + ) + return module_spec + + +_FINDER: FakeFinder | None = None +_INJECTED_MODULES: list[str] = [] + + +def _looks_like_package(fullname: str, spec: registry.FakeSpec) -> bool: + del spec + return fullname.count(".") <= 1 or fullname.endswith((".core", ".training")) + + +def _real_module_available(fullname: str) -> bool: + """True when a non-fake finder can resolve ``fullname``.""" + saved = list(sys.meta_path) + try: + sys.meta_path = [f for f in saved if not isinstance(f, FakeFinder)] + try: + found = importlib.util.find_spec(fullname) + except (ImportError, ModuleNotFoundError, ValueError): + return False + return found is not None + finally: + sys.meta_path = saved + + +def purge_prefixed_modules(prefixes: Sequence[str]) -> list[str]: + """Remove ``sys.modules`` entries under ``prefixes`` (for force reinstall).""" + removed: list[str] = [] + for name in list(sys.modules): + for prefix in prefixes: + if name == prefix or name.startswith(prefix + "."): + del sys.modules[name] + removed.append(name) + break + return removed + + +def install_finder() -> FakeFinder: + global _FINDER + for existing in sys.meta_path: + if isinstance(existing, FakeFinder): + _FINDER = existing + return existing + finder = FakeFinder() + sys.meta_path.insert(0, finder) + _FINDER = finder + return finder + + +def uninstall_finder() -> None: + global _FINDER + sys.meta_path[:] = [f for f in sys.meta_path if not isinstance(f, FakeFinder)] + _FINDER = None + set_force(False) + + +def note_injected(fullname: str) -> None: + if fullname not in _INJECTED_MODULES: + _INJECTED_MODULES.append(fullname) + + +def clear_injected_modules() -> None: + """Drop modules previously served by probing.fakes from ``sys.modules``.""" + global _INJECTED_MODULES + names = set(_INJECTED_MODULES) + for name, mod in list(sys.modules.items()): + if getattr(mod, "__probing_fake__", False): + names.add(name) + origin = getattr(getattr(mod, "__spec__", None), "origin", "") or "" + if origin.startswith("probing.fakes:"): + names.add(name) + for name in sorted(names, key=lambda n: n.count("."), reverse=True): + if name in sys.modules: + del sys.modules[name] + _INJECTED_MODULES = [] diff --git a/python/probing/fakes/helpers_cpp.py b/python/probing/fakes/helpers_cpp.py new file mode 100644 index 00000000..9b50016e --- /dev/null +++ b/python/probing/fakes/helpers_cpp.py @@ -0,0 +1,179 @@ +"""Pure-Python stand-in for ``megatron.core.datasets.helpers_cpp``. + +Megatron's mock/indexed GPT datasets import a pybind11 extension built via +``make`` in ``megatron/core/datasets``. On macOS debug hosts that extension is +often missing; this module covers the symbols needed for small ``--mock-data`` +runs without a C++ toolchain. +""" + +from __future__ import annotations + +import logging +import sys +import types +from typing import Any + +import numpy as np + +logger = logging.getLogger(__name__) + + +def build_sample_idx_int32( + sizes: np.ndarray, + document_indices: np.ndarray, + sequence_length: int, + num_epochs: int, + tokens_per_epoch: int, + drop_last_partial_sequence: bool = True, + add_extra_token_to_sequence: int = 1, +) -> np.ndarray: + return _build_sample_idx( + sizes, + document_indices, + sequence_length, + num_epochs, + tokens_per_epoch, + drop_last_partial_sequence, + add_extra_token_to_sequence, + dtype=np.int32, + ) + + +def build_sample_idx_int64( + sizes: np.ndarray, + document_indices: np.ndarray, + sequence_length: int, + num_epochs: int, + tokens_per_epoch: int, + drop_last_partial_sequence: bool = True, + add_extra_token_to_sequence: int = 1, +) -> np.ndarray: + return _build_sample_idx( + sizes, + document_indices, + sequence_length, + num_epochs, + tokens_per_epoch, + drop_last_partial_sequence, + add_extra_token_to_sequence, + dtype=np.int64, + ) + + +def _build_sample_idx( + sizes: np.ndarray, + document_indices: np.ndarray, + sequence_length: int, + num_epochs: int, + tokens_per_epoch: int, + drop_last_partial_sequence: bool, + add_extra_token_to_sequence: int, + *, + dtype: Any, +) -> np.ndarray: + """Port of ``helpers.cpp`` ``build_sample_idx`` for small mock datasets.""" + sizes = np.asarray(sizes) + document_idx = np.asarray(document_indices) + seq_length = int(sequence_length) + extra = int(add_extra_token_to_sequence) + epochs = int(num_epochs) + tokens = int(tokens_per_epoch) + + if drop_last_partial_sequence: + num_samples = (epochs * tokens - extra) // seq_length + else: + num_samples = int(np.ceil(float(epochs * tokens - extra) / seq_length)) + num_samples = max(int(num_samples), 0) + + sample_idx = np.zeros((num_samples + 1, 2), dtype=dtype) + sample_idx_index = 0 + document_idx_index = 0 + doc_offset = 0 + sample_idx[0, 0] = document_idx_index + sample_idx[0, 1] = doc_offset + sample_idx_index = 1 + + while sample_idx_index <= num_samples: + remaining_seq_length = seq_length + extra + while remaining_seq_length != 0: + document_index = int(document_idx[document_idx_index]) + document_length = int(sizes[document_index]) - doc_offset + remaining_seq_length -= document_length + if remaining_seq_length <= 0: + doc_offset += remaining_seq_length + document_length - extra + remaining_seq_length = 0 + else: + if document_idx_index == document_idx.shape[0] - 1: + doc_offset = ( + int(sizes[int(document_idx[document_idx_index])]) - extra + ) + break + document_idx_index += 1 + doc_offset = 0 + sample_idx[sample_idx_index, 0] = document_idx_index + sample_idx[sample_idx_index, 1] = doc_offset + sample_idx_index += 1 + + return sample_idx + + +def build_mapping(*_args: Any, **_kwargs: Any) -> np.ndarray: + return np.zeros((0, 3), dtype=np.int64) + + +def build_blocks_mapping(*_args: Any, **_kwargs: Any) -> np.ndarray: + return np.zeros((0, 4), dtype=np.int64) + + +def build_blending_indices( + dataset_index: np.ndarray, + dataset_sample_index: np.ndarray, + weights: np.ndarray, + num_datasets: int, + size: int, + _verbose: bool = False, +) -> None: + del weights, num_datasets + for i in range(size): + dataset_index[i] = 0 + dataset_sample_index[i] = i + + +def build_exhaustive_blending_indices( + dataset_index: np.ndarray, + dataset_sample_index: np.ndarray, + sizes: np.ndarray, + num_datasets: int, +) -> None: + idx = 0 + for d in range(num_datasets): + for s in range(int(sizes[d])): + dataset_index[idx] = d + dataset_sample_index[idx] = s + idx += 1 + + +def install_helpers_cpp_fallback() -> bool: + """Register this module as ``megatron.core.datasets.helpers_cpp`` if missing.""" + name = "megatron.core.datasets.helpers_cpp" + if name in sys.modules: + return False + try: + import megatron.core.datasets # noqa: F401 + except Exception as exc: + logger.debug("helpers_cpp fallback skipped (no megatron datasets): %s", exc) + return False + + mod = types.ModuleType(name) + mod.build_sample_idx_int32 = build_sample_idx_int32 # type: ignore[attr-defined] + mod.build_sample_idx_int64 = build_sample_idx_int64 # type: ignore[attr-defined] + mod.build_mapping = build_mapping # type: ignore[attr-defined] + mod.build_blocks_mapping = build_blocks_mapping # type: ignore[attr-defined] + mod.build_blending_indices = build_blending_indices # type: ignore[attr-defined] + mod.build_exhaustive_blending_indices = ( # type: ignore[attr-defined] + build_exhaustive_blending_indices + ) + mod.__probing_fake__ = True # type: ignore[attr-defined] + sys.modules[name] = mod + logger.info("probing.fakes: installed pure-Python helpers_cpp fallback") + return True diff --git a/python/probing/fakes/journal.py b/python/probing/fakes/journal.py new file mode 100644 index 00000000..2c9455a6 --- /dev/null +++ b/python/probing/fakes/journal.py @@ -0,0 +1,195 @@ +"""Ground-truth journal for ``probing.fakes`` (query as ``python.fake_event``). + +Fake Megatron / Torch stubs append rows here so they can be JOINed against +probing observability tables (``python.trace_event``, step coords, optional +``python.comm_collective``) to check that instrumentation saw what the fake +layer intended. +""" + +from __future__ import annotations + +import json +import logging +import threading +import time +import uuid +from dataclasses import dataclass +from typing import Any, Optional + +from probing.core import table +from probing.parallel import current_role +from probing.tracing import step +from probing.tracing.coordinates import row_fields + +logger = logging.getLogger(__name__) + +_SEQ = 0 +_SEQ_LOCK = threading.Lock() +_ENABLED = True +_RUN_ID = "" + + +def set_journal_enabled(enabled: bool) -> None: + global _ENABLED + _ENABLED = bool(enabled) + + +def journal_enabled() -> bool: + return _ENABLED + + +def current_run_id() -> str: + return _RUN_ID + + +def begin_run(run_id: Optional[str] = None) -> str: + """Start a new journal run (resets seq, sets ``run_id``).""" + global _RUN_ID + reset_journal_seq() + _RUN_ID = (run_id or uuid.uuid4().hex[:12]).strip() + return _RUN_ID + + +def reset_journal_seq() -> None: + global _SEQ + with _SEQ_LOCK: + _SEQ = 0 + + +def _next_seq() -> int: + global _SEQ + with _SEQ_LOCK: + _SEQ += 1 + return _SEQ + + +@table("fake_event") +@dataclass +class FakeEvent: + """One intentional fake-layer action (ground truth for correlation).""" + + seq: int = 0 + run_id: str = "" + kind: str = "" + name: str = "" + expected_iteration: int = -1 + expected_micro_batches: int = 1 + expected_role: str = "" + device: str = "" + nbytes: int = 0 + duration_ms: float = 0.0 + attrs: str = "" + micro_step: int = 0 + local_step: int = 0 + global_step: int = 0 + micro_batches: int = 1 + rank: int = -1 + world_size: int = -1 + role: str = "" + + +def record_fake_event( + kind: str, + name: str = "", + *, + expected_iteration: Optional[int] = None, + expected_micro_batches: Optional[int] = None, + expected_role: Optional[str] = None, + device: str = "", + nbytes: int = 0, + duration_ms: float = 0.0, + attrs: Optional[dict[str, Any]] = None, +) -> Optional[FakeEvent]: + """Append a ``python.fake_event`` row and mirror a short log line.""" + if not _ENABLED: + return None + + from probing.fakes.specs import megatron as megatron_spec + + state = megatron_spec.get_state() + exp_iter = ( + int(state["iteration"]) + if expected_iteration is None + else int(expected_iteration) + ) + exp_mb = ( + int(state["micro_batches"]) + if expected_micro_batches is None + else int(expected_micro_batches) + ) + if expected_role is None: + try: + expected_role = current_role() or "" + except Exception: + expected_role = "" + + coords = row_fields(step.snapshot()) + try: + role = current_role() or "" + except Exception: + role = "" + + if not device: + try: + from probing.fakes.device import target_device + + device = target_device() + except Exception: + device = "" + + seq = _next_seq() + row = FakeEvent( + seq=seq, + run_id=_RUN_ID or "none", + kind=str(kind), + name=str(name or kind), + expected_iteration=exp_iter, + expected_micro_batches=exp_mb, + expected_role=str(expected_role or ""), + device=str(device), + nbytes=int(nbytes), + duration_ms=float(duration_ms), + attrs=json.dumps(attrs or {}, sort_keys=True), + micro_step=int(coords.get("micro_step", 0)), + local_step=int(coords.get("local_step", 0)), + global_step=int(coords.get("global_step", 0)), + micro_batches=int(coords.get("micro_batches", 1)), + rank=int(coords.get("rank", -1)), + world_size=int(coords.get("world_size", -1)), + role=role, + ) + try: + row.save() + except Exception as exc: + logger.debug("fake_event save skipped: %s", exc) + return row + + logger.info( + "fake_event run=%s seq=%s kind=%s name=%s expected_iter=%s local_step=%s", + row.run_id, + seq, + kind, + name or kind, + exp_iter, + row.local_step, + ) + return row + + +def timed_fake_event(kind: str, name: str = "", **kwargs: Any): + """Context manager that records duration_ms on exit.""" + + class _Timer: + def __init__(self) -> None: + self.t0 = 0.0 + self.event: Optional[FakeEvent] = None + + def __enter__(self) -> _Timer: + self.t0 = time.perf_counter() + return self + + def __exit__(self, *exc: Any) -> None: + dt = (time.perf_counter() - self.t0) * 1e3 + self.event = record_fake_event(kind, name, duration_ms=dt, **kwargs) + + return _Timer() diff --git a/python/probing/fakes/loop.py b/python/probing/fakes/loop.py new file mode 100644 index 00000000..4447f7b6 --- /dev/null +++ b/python/probing/fakes/loop.py @@ -0,0 +1,96 @@ +"""Scripted Megatron-style debug loop on the fake device (default: meta).""" + +from __future__ import annotations + +import logging +from dataclasses import dataclass +from typing import Optional + +logger = logging.getLogger(__name__) + + +@dataclass +class ScriptedLoopResult: + steps: int + role: str + device: str + last_iteration: int + + +def run_scripted_loop( + *, + steps: int = 4, + tp: int = 0, + pp: int = 0, + dp: int = 0, + micro_batches: int = 2, + device: Optional[str] = None, +) -> ScriptedLoopResult: + """Install fakes (if needed), sync Megatron hooks, run scripted ``train_step``. + + Places a tiny ``nn.Module`` on the fake device for shape-level sanity. Does + **not** run a real Megatron forward — ``meta`` cannot compute. + """ + import torch.nn as nn + + import probing + from probing.ext import megatron as megatron_ext + + from . import install, is_installed, target_device + from .specs import megatron as megatron_spec + + if not is_installed(): + install( + device=device, + specs=( + "megatron", + "transformer_engine", + "apex", + "flash_attn", + "triton", + ), + force=True, + ) + + megatron_spec.build_megatron_tree( + tp=tp, + pp=pp, + dp=dp, + iteration=0, + micro_batches=micro_batches, + initialized=True, + ) + megatron_spec.ensure_sys_modules(tp=tp, pp=pp, dp=dp) + + megatron_ext.init_parallel_state() + megatron_ext.init_training() + + role = probing.current_role() or "" + dev = target_device() + + model = nn.Linear(8, 4).to("cuda") + assert next(model.parameters()).device.type == dev, ( + f"expected params on {dev}, got {next(model.parameters()).device}" + ) + + from megatron.training.training import train_step # type: ignore + + n = max(1, int(steps)) + for i in range(n): + megatron_spec.set_iteration(i) + train_step() + + state = megatron_spec.get_state() + logger.info( + "scripted loop done: steps=%s role=%s device=%s iteration=%s", + steps, + role, + dev, + state["iteration"], + ) + return ScriptedLoopResult( + steps=int(steps), + role=role, + device=dev, + last_iteration=int(state["iteration"]), + ) diff --git a/python/probing/fakes/megatron_lm.py b/python/probing/fakes/megatron_lm.py new file mode 100644 index 00000000..74b758c3 --- /dev/null +++ b/python/probing/fakes/megatron_lm.py @@ -0,0 +1,415 @@ +"""Run **real** Megatron-LM ``pretrain_gpt.py`` with bottom-layer fakes only. + +Philosophy: keep Megatron-LM / megatron-core source intact; only replace what +cannot run on macOS — CUDA device APIs (→ meta/cpu/mps), and missing packages +(triton / flash-attn). + +Path resolution (first hit wins):: + + 1. ``MEGATRON_LM`` / ``--megatron-lm`` + 2. sibling ``/../Megatron-LM`` + +**Versions:** probing pins to **one checkout at a time**. To exercise another +Megatron-Core release, point ``MEGATRON_LM`` at that tree (no multi-version +matrix in-process). Smoke defaults are validated against **≥0.12.1 and <0.21**; +see ``SMOKE_MEGATRON_CORE_MIN`` / ``SMOKE_MEGATRON_CORE_MAX_EXCLUSIVE`` and +``MEGATRON_LM_ALLOW_ANY_VERSION``. +""" + +from __future__ import annotations + +import os +import re +import runpy +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Optional + + +BOTTOM_LAYER_SPECS = ( + # Invent only packages that hard-fail imports on macOS. + # Do NOT invent transformer_engine — Megatron falls back to local impl. + # Do NOT invent apex — Megatron falls back to torch.optim + WrappedTorchNorm. + "triton", + "flash_attn", +) + +# Inclusive min / exclusive max for bottom-fake smoke (major, minor, patch). +# Other versions may work; set MEGATRON_LM_ALLOW_ANY_VERSION=1 to skip the gate. +SMOKE_MEGATRON_CORE_MIN: tuple[int, int, int] = (0, 12, 1) +SMOKE_MEGATRON_CORE_MAX_EXCLUSIVE: tuple[int, int, int] = (0, 21, 0) +# Backward-compatible alias used in messages / older docs. +SMOKE_MEGATRON_CORE_RANGE: tuple[tuple[int, int, int], tuple[int, int, int]] = ( + SMOKE_MEGATRON_CORE_MIN, + SMOKE_MEGATRON_CORE_MAX_EXCLUSIVE, +) + + +@dataclass(frozen=True) +class MegatronLmCheckout: + """Resolved Megatron-LM tree used by the real-code runner.""" + + root: Path + source: str # "env" | "explicit" | "sibling" + pretrain_gpt: Path + version: Optional[tuple[int, int, int]] + version_text: Optional[str] + ready: bool + reason: str = "" + + +def _is_probing_repo(directory: Path) -> bool: + """True for a probing checkout (``pyproject.toml`` + ``python/probing``).""" + return (directory / "pyproject.toml").is_file() and ( + directory / "python" / "probing" + ).is_dir() + + +def probing_repo_root() -> Path: + """Locate the probing git checkout (not site-packages). + + Editable / ``PYTHONPATH=python`` layouts resolve via ``__file__``. + Wheel installs in CI still have the checkout on disk — walk from ``cwd``. + """ + seen: set[Path] = set() + for start in (Path(__file__).resolve(), Path.cwd().resolve()): + for directory in (start, *start.parents): + if directory in seen: + continue + seen.add(directory) + if _is_probing_repo(directory): + return directory + # Source-layout fallback: repo/python/probing/fakes/this.py + return Path(__file__).resolve().parents[3] + + +def sibling_megatron_lm_root() -> Path: + """Default checkout: ``../Megatron-LM`` next to the probing repo.""" + return (probing_repo_root().parent / "Megatron-LM").resolve() + + +def default_megatron_lm_root() -> Path: + """Backward-compatible alias: env ``MEGATRON_LM`` or sibling path.""" + return resolve_megatron_lm_root().root + + +def is_megatron_lm_checkout(root: Path) -> bool: + """True when ``root`` looks like an NVIDIA Megatron-LM tree.""" + return (root / "pretrain_gpt.py").is_file() and (root / "megatron").is_dir() + + +def read_megatron_core_version( + root: Path, +) -> tuple[Optional[tuple[int, int, int]], Optional[str]]: + """Read ``(major, minor, patch)`` from checkout ``package_info.py`` (no import). + + Does not load ``megatron`` into ``sys.modules``. Returns ``(None, None)`` if + the file is missing or unparsable. + """ + info = root / "megatron" / "core" / "package_info.py" + if not info.is_file(): + return None, None + try: + text = info.read_text(encoding="utf-8") + except OSError: + return None, None + + def _int(name: str) -> Optional[int]: + m = re.search(rf"^{name}\s*=\s*(\d+)\s*$", text, flags=re.MULTILINE) + return int(m.group(1)) if m else None + + major, minor, patch = _int("MAJOR"), _int("MINOR"), _int("PATCH") + if major is None or minor is None or patch is None: + return None, None + ver = (major, minor, patch) + return ver, f"{major}.{minor}.{patch}" + + +def version_in_smoke_range(version: tuple[int, int, int]) -> bool: + return SMOKE_MEGATRON_CORE_MIN <= version < SMOKE_MEGATRON_CORE_MAX_EXCLUSIVE + + +def resolve_megatron_lm_root( + explicit: str | Path | None = None, + *, + env: Optional[dict[str, str]] = None, +) -> MegatronLmCheckout: + """Resolve which Megatron-LM tree to use. + + Priority: ``explicit`` → ``MEGATRON_LM`` → sibling ``../Megatron-LM``. + + Multiple installed / checked-out versions are **not** selected automatically; + set ``MEGATRON_LM`` (or ``explicit``) to switch. Pip ``megatron-core`` is + ignored once the checkout is on ``sys.path`` (see :func:`bootstrap`). + """ + environ = env if env is not None else os.environ + if explicit is not None and str(explicit).strip(): + root = Path(str(explicit)).expanduser().resolve() + source = "explicit" + else: + raw = (environ.get("MEGATRON_LM") or "").strip() + if raw: + root = Path(raw).expanduser().resolve() + source = "env" + else: + root = sibling_megatron_lm_root() + source = "sibling" + + script = root / "pretrain_gpt.py" + version, version_text = read_megatron_core_version(root) + if not root.is_dir(): + return MegatronLmCheckout( + root=root, + source=source, + pretrain_gpt=script, + version=version, + version_text=version_text, + ready=False, + reason=f"directory missing: {root}", + ) + if not is_megatron_lm_checkout(root): + return MegatronLmCheckout( + root=root, + source=source, + pretrain_gpt=script, + version=version, + version_text=version_text, + ready=False, + reason=( + f"not a Megatron-LM tree (need pretrain_gpt.py + megatron/): {root}" + ), + ) + return MegatronLmCheckout( + root=root, + source=source, + pretrain_gpt=script, + version=version, + version_text=version_text, + ready=True, + ) + + +def smoke_version_allowed( + checkout: MegatronLmCheckout, + *, + env: Optional[dict[str, str]] = None, +) -> tuple[bool, str]: + """Whether bottom-fake smoke should run against this checkout's version.""" + environ = env if env is not None else os.environ + if (environ.get("MEGATRON_LM_ALLOW_ANY_VERSION") or "").strip().lower() in { + "1", + "true", + "yes", + "on", + }: + return True, "MEGATRON_LM_ALLOW_ANY_VERSION" + if checkout.version is None: + return True, "version unknown (no package_info.py gate)" + if version_in_smoke_range(checkout.version): + return True, f"in smoke range {SMOKE_MEGATRON_CORE_RANGE}" + lo, hi = SMOKE_MEGATRON_CORE_RANGE + return ( + False, + f"megatron-core {checkout.version_text} outside smoke range " + f">={lo[0]}.{lo[1]}.{lo[2]}, <{hi[0]}.{hi[1]}.{hi[2]}; " + f"set MEGATRON_LM_ALLOW_ANY_VERSION=1 to override", + ) + + +def _purge_megatron_modules() -> list[str]: + """Drop already-imported megatron modules so Megatron-LM path wins.""" + removed: list[str] = [] + for name in list(sys.modules): + if name == "megatron" or name.startswith("megatron."): + del sys.modules[name] + removed.append(name) + return removed + + +def bootstrap(*, megatron_lm: Path, device: str | None = None) -> Path: + checkout = resolve_megatron_lm_root(megatron_lm) + if not checkout.ready: + raise SystemExit( + f"Megatron-LM not ready ({checkout.reason}). " + "Set MEGATRON_LM=/path/to/Megatron-LM" + ) + allowed, why = smoke_version_allowed(checkout) + if not allowed: + raise SystemExit(why) + + os.environ.setdefault("PROBING_FAKES", "1") + # Do NOT set PROBING_FAKES_FORCE for megatron — we want real Megatron code. + # Force only the CUDA-only deps via install(force=True, specs=BOTTOM...). + if device: + os.environ["PROBING_FAKE_DEVICE"] = device + else: + # Real Megatron ops need a concrete device; meta breaks collectives / autograd. + os.environ.setdefault("PROBING_FAKE_DEVICE", "cpu") + os.environ.setdefault("PROBING_MEGATRON", "on") + os.environ.setdefault("PROBING_MEGATRON_STEP_SYNC", "on") + os.environ.setdefault("PROBING_NCCL_MOCK", "1") + # Faster failure loop while iterating on bottom fakes. + os.environ.setdefault("PROBING_CRASH_NO_GRACE", "1") + # Single-process rendezvous defaults (used if --fake-process-group is off). + os.environ.setdefault("MASTER_ADDR", "127.0.0.1") + os.environ.setdefault("MASTER_PORT", "29500") + os.environ.setdefault("RANK", "0") + os.environ.setdefault("WORLD_SIZE", "1") + os.environ.setdefault("LOCAL_RANK", "0") + + root = str(checkout.root) + # Prefer the checkout over any pip megatron-core. + while root in sys.path: + sys.path.remove(root) + sys.path.insert(0, root) + purged = _purge_megatron_modules() + + from probing.fakes import install + from probing.fakes.bottom import apply_bottom_patches, skip_dataset_cpp_helpers + from probing.fakes.journal import record_fake_event + + # Bottom layer only — never invent megatron.* when running real Megatron-LM. + install(force=True, specs=BOTTOM_LAYER_SPECS, remap_device=True) + apply_bottom_patches() + skip_dataset_cpp_helpers() + record_fake_event( + "megatron_lm", + "bootstrap", + attrs={ + "megatron_lm": root, + "source": checkout.source, + "version": checkout.version_text, + "purged_modules": len(purged), + "mode": "real_megatron_bottom_fakes", + "specs": list(BOTTOM_LAYER_SPECS), + "version_gate": why, + }, + ) + print( + f"[probing.fakes] real Megatron-LM at {root} " + f"(source={checkout.source}, version={checkout.version_text or '?'}; " + f"bottom fakes: {', '.join(BOTTOM_LAYER_SPECS)}; cuda→" + f"{os.environ.get('PROBING_FAKE_DEVICE', 'cpu')})", + flush=True, + ) + return checkout.pretrain_gpt + + +def main(argv: list[str] | None = None) -> int: + argv = list(sys.argv[1:] if argv is None else argv) + device = None + megatron_explicit: str | None = None + filtered: list[str] = [] + i = 0 + while i < len(argv): + if argv[i] == "--device" and i + 1 < len(argv): + device = argv[i + 1] + i += 2 + continue + if argv[i] == "--megatron-lm" and i + 1 < len(argv): + megatron_explicit = argv[i + 1] + os.environ["MEGATRON_LM"] = argv[i + 1] + i += 2 + continue + filtered.append(argv[i]) + i += 1 + + checkout = resolve_megatron_lm_root(megatron_explicit) + script = bootstrap(megatron_lm=checkout.root, device=device) + + # Baseline smoke flags; user argv overrides / extends them. + defaults = [ + "--num-layers", + "2", + "--hidden-size", + "64", + "--num-attention-heads", + "4", + "--seq-length", + "32", + "--max-position-embeddings", + "32", + "--micro-batch-size", + "1", + "--global-batch-size", + "1", + "--train-iters", + "2", + "--eval-iters", + "0", + "--eval-interval", + "1000", + "--save-interval", + "1000", + "--log-interval", + "1", + "--num-workers", + "0", + "--mock-data", + "--tokenizer-type", + "NullTokenizer", + "--vocab-size", + "1024", + "--no-gradient-accumulation-fusion", + "--no-masked-softmax-fusion", + "--no-bias-gelu-fusion", + "--no-bias-dropout-fusion", + "--no-persist-layer-norm", + "--use-cpu-initialization", + "--lr", + "1e-4", + "--min-lr", + "1e-5", + "--clip-grad", + "0.0", + # Skip real NCCL/gloo — Megatron's built-in FakeStore path. + "--fake-process-group", + "--disable-jit-fuser", + "--transformer-impl", + "local", + ] + merged = _merge_argv(defaults, filtered) + sys.argv = [str(script), *merged] + print(f"[probing.fakes] exec {script}", flush=True) + try: + runpy.run_path(str(script), run_name="__main__") + except SystemExit as exc: + code = exc.code + return int(code) if isinstance(code, int) else (0 if code is None else 1) + return 0 + + +def _merge_argv(defaults: list[str], overrides: list[str]) -> list[str]: + """Keep defaults, then apply overrides (last flag wins for valued options).""" + out = list(defaults) + i = 0 + while i < len(overrides): + tok = overrides[i] + if not tok.startswith("--"): + i += 1 + continue + # Valued option: --flag value (value does not start with --) + if i + 1 < len(overrides) and not overrides[i + 1].startswith("--"): + j = 0 + while j < len(out): + if ( + out[j] == tok + and j + 1 < len(out) + and not out[j + 1].startswith("--") + ): + del out[j : j + 2] + else: + j += 1 + out.extend([tok, overrides[i + 1]]) + i += 2 + continue + # Boolean / store_true flag + if tok not in out: + out.append(tok) + i += 1 + return out + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/python/probing/fakes/pretrain.py b/python/probing/fakes/pretrain.py new file mode 100644 index 00000000..f6a7ce0f --- /dev/null +++ b/python/probing/fakes/pretrain.py @@ -0,0 +1,172 @@ +"""Scripted ``pretrain()`` entry used by fake ``megatron.training``.""" + +from __future__ import annotations + +import logging +import time +from dataclasses import dataclass +from typing import Any, Callable, Optional + +logger = logging.getLogger(__name__) + + +@dataclass +class PretrainResult: + train_iters: int + role: str + device: str + last_iteration: int + elapsed_sec: float + + +def run_pretrain( + *, + train_iters: int = 4, + micro_batches: int = 1, + model_provider: Optional[Callable[..., Any]] = None, + forward_step_func: Optional[Callable[..., Any]] = None, + train_valid_test_datasets_provider: Optional[Callable[..., Any]] = None, + **_ignored: Any, +) -> PretrainResult: + """Run a Megatron-shaped pretrain loop without real compute. + + Builds an optional meta-device model via ``model_provider``, advances + ``iteration`` / probing step coordinates, and invokes the scripted + ``train_step`` (wrapped by ``probing.ext.megatron`` when enabled). + """ + import torch.nn as nn + + import probing + from probing.ext import megatron as megatron_ext + + from . import install, is_installed, target_device + from .specs import megatron as megatron_spec + + if not is_installed(): + install( + force=True, + specs=( + "megatron", + "transformer_engine", + "apex", + "flash_attn", + "triton", + ), + ) + + args = megatron_spec.get_args() + train_iters = int(getattr(args, "train_iters", train_iters) or train_iters) + micro_batches = int( + getattr(args, "global_batch_size", micro_batches) + // max(1, int(getattr(args, "micro_batch_size", 1) or 1)) + if getattr(args, "global_batch_size", None) + else micro_batches + ) + micro_batches = max(1, micro_batches) + + megatron_spec.set_micro_batches(micro_batches) + megatron_spec.ensure_sys_modules() + megatron_ext.init_parallel_state() + megatron_ext.init_training() + + model = None + if callable(model_provider): + try: + model = model_provider(pre_process=True, post_process=True) + except TypeError: + # Newer providers may require a builder callable as first arg. + try: + from megatron.core.models.gpt import GPTModel + + def _default_builder(args, pre_process, post_process, *a, **k): + del args, a, k + return GPTModel(pre_process=pre_process, post_process=post_process) + + model = model_provider( + _default_builder, pre_process=True, post_process=True + ) + except Exception as exc: + logger.debug("model_provider skipped: %s", exc) + model = None + if isinstance(model, nn.Module): + model = model.to("cuda") + elif isinstance(model, (list, tuple)): + model = [m.to("cuda") if isinstance(m, nn.Module) else m for m in model] + else: + from megatron.core.models.gpt import GPTModel + + model = GPTModel().to("cuda") + + if callable(train_valid_test_datasets_provider): + try: + train_valid_test_datasets_provider([16, 0, 0]) + except Exception as exc: + logger.debug("dataset provider skipped: %s", exc) + + from megatron.training.training import train_step # type: ignore + + role = probing.current_role() or "" + device = target_device() + t0 = time.perf_counter() + + n = max(1, train_iters) + for i in range(n): + megatron_spec.set_iteration(i) + if callable(forward_step_func) and model is not None: + try: + data_iter = iter(()) + forward_step_func( + data_iter, model[0] if isinstance(model, list) else model + ) + except Exception as exc: + # meta / empty batch — expected; train_step still advances coords + logger.debug("forward_step scripted fallback: %s", exc) + train_step(model) + + elapsed = time.perf_counter() - t0 + state = megatron_spec.get_state() + result = PretrainResult( + train_iters=n, + role=role, + device=device, + last_iteration=int(state["iteration"]), + elapsed_sec=elapsed, + ) + try: + from probing.fakes.journal import record_fake_event + from probing.fakes.verify import verify_against_probing + + record_fake_event( + "pretrain", + "done", + attrs={ + "train_iters": n, + "role": role, + "device": device, + "elapsed_sec": round(elapsed, 4), + }, + ) + report = verify_against_probing(require_train_steps=n) + if not report.ok: + logger.warning( + "fake pretrain verify issues: %s", + [(i.code, i.message, i.expected, i.observed) for i in report.issues], + ) + else: + logger.info("fake pretrain verify ok (checked=%s)", report.checked) + except Exception as exc: + logger.debug("verify skipped: %s", exc) + logger.info( + "fake pretrain done: iters=%s role=%s device=%s elapsed=%.3fs", + result.train_iters, + result.role, + result.device, + result.elapsed_sec, + ) + print( + f"> fake pretrain done: iters={result.train_iters} " + f"role={result.role} device={result.device} " + f"elapsed={result.elapsed_sec:.3f}s", + flush=True, + ) + return result diff --git a/python/probing/fakes/registry.py b/python/probing/fakes/registry.py new file mode 100644 index 00000000..3c84a296 --- /dev/null +++ b/python/probing/fakes/registry.py @@ -0,0 +1,102 @@ +"""Fake package registry: prefix → factory.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Callable, Iterable, Optional + +import types + +ModuleFactory = Callable[[str], types.ModuleType] + + +@dataclass(frozen=True) +class FakeSpec: + """One fakeable package family. + + ``prefixes`` are matched with exact equality or ``prefix.`` child paths + (e.g. ``megatron`` covers ``megatron.core.parallel_state``). + """ + + name: str + prefixes: tuple[str, ...] + factory: ModuleFactory + description: str = "" + + +_SPECS: dict[str, FakeSpec] = {} +_ENABLED: set[str] = set() + + +def register(spec: FakeSpec) -> FakeSpec: + _SPECS[spec.name] = spec + return spec + + +def registered() -> dict[str, FakeSpec]: + return dict(_SPECS) + + +def enable(names: Iterable[str] | None = None) -> set[str]: + """Enable specs by name. ``None`` / ``{\"*\", \"all\", \"1\"}`` enables all.""" + global _ENABLED + if names is None: + _ENABLED = set(_SPECS) + return set(_ENABLED) + + normalized = {str(n).strip().lower() for n in names if str(n).strip()} + if not normalized or normalized & {"*", "all", "1", "true", "on", "yes"}: + _ENABLED = set(_SPECS) + return set(_ENABLED) + + aliases = { + "te": "transformer_engine", + "flash": "flash_attn", + "flash-attn": "flash_attn", + } + resolved: set[str] = set() + for name in normalized: + key = aliases.get(name, name) + if key not in _SPECS: + raise KeyError(f"unknown fake spec {name!r}; known: {sorted(_SPECS)}") + resolved.add(key) + _ENABLED = resolved + return set(_ENABLED) + + +def disable_all() -> None: + global _ENABLED + _ENABLED = set() + + +def enabled_names() -> set[str]: + return set(_ENABLED) + + +def match_spec(fullname: str) -> Optional[FakeSpec]: + for name in _ENABLED: + spec = _SPECS[name] + for prefix in spec.prefixes: + if fullname == prefix or fullname.startswith(prefix + "."): + return spec + return None + + +def parse_fakes_env(raw: str | None) -> Optional[set[str]]: + """Parse ``PROBING_FAKES``. + + Returns: + * ``None`` — unset / empty / off → do not install + * ``set()`` sentinel via empty enable-all handled by caller using ``{\"*\"}`` + """ + if raw is None: + return None + text = str(raw).strip() + if not text: + return None + lowered = text.lower() + if lowered in {"0", "off", "false", "no", "disable", "disabled"}: + return None + if lowered in {"1", "true", "on", "yes", "all", "*"}: + return {"*"} + return {part.strip() for part in text.split(",") if part.strip()} diff --git a/python/probing/fakes/specs/__init__.py b/python/probing/fakes/specs/__init__.py new file mode 100644 index 00000000..383f7c39 --- /dev/null +++ b/python/probing/fakes/specs/__init__.py @@ -0,0 +1,6 @@ +"""Load built-in fake specs.""" + +from __future__ import annotations + +from . import cuda_extras as cuda_extras # noqa: F401 +from . import megatron as megatron # noqa: F401 diff --git a/python/probing/fakes/specs/cuda_extras.py b/python/probing/fakes/specs/cuda_extras.py new file mode 100644 index 00000000..e82cabcb --- /dev/null +++ b/python/probing/fakes/specs/cuda_extras.py @@ -0,0 +1,263 @@ +"""No-op / attribute-synthesizing stubs for CUDA-only third-party packages. + +These are the **bottom layer** fakes: real Megatron-LM / megatron-core code stays +in place; only packages that cannot install or run on macOS (triton, TE, apex, +flash-attn) are invented. +""" + +from __future__ import annotations + +import types +from typing import Any + +from ..registry import FakeSpec, register + + +def _mark(module: types.ModuleType) -> types.ModuleType: + module.__probing_fake__ = True # type: ignore[attr-defined] + return module + + +class StubModule(types.ModuleType): + """Package that synthesizes missing attrs (nested modules / callables / types).""" + + _SUBMODULE_NAMES = frozenset( + { + "core", + "language", + "runtime", + "ops", + "pytorch", + "contrib", + "testing", + "compiler", + "backends", + "amp", + "optimizers", + "transformer", + } + ) + + def __init__(self, name: str): + super().__init__(name) + self.__probing_fake__ = True # type: ignore[attr-defined] + self.__path__ = [] # type: ignore[attr-defined] + + def __getattr__(self, name: str) -> Any: + if name.startswith("__") and name.endswith("__"): + raise AttributeError(name) + if name == "__version__": + ver = "0.0.0+probing.fakes" + setattr(self, name, ver) + return ver + # Nested packages (triton.language.core, te.pytorch, …) + if name in self._SUBMODULE_NAMES or ( + name.islower() and "_" not in name and name not in {"jit", "autotune"} + ): + child_name = f"{self.__name__}.{name}" + if child_name in _CACHE: + child = _CACHE[child_name] + else: + child = StubModule(child_name) + _CACHE[child_name] = child + setattr(self, name, child) + return child + if name[:1].isupper() or name == name.upper(): + sentinel = type( + name, + (), + { + "__init__": lambda self, *a, **k: None, + "__call__": lambda self, *a, **k: self, + "__enter__": lambda self: self, + "__exit__": lambda self, *a: None, + }, + ) + setattr(self, name, sentinel) + return sentinel + + def stub(*args: Any, **kwargs: Any) -> Any: + del args, kwargs + return None + + stub.__name__ = name + stub.__qualname__ = name + setattr(self, name, stub) + return stub + + +_CACHE: dict[str, types.ModuleType] = {} + + +def _package(fullname: str) -> types.ModuleType: + if fullname in _CACHE: + return _CACHE[fullname] + mod = _mark(StubModule(fullname)) + _CACHE[fullname] = mod + return mod + + +def _wire_triton(mod: types.ModuleType) -> None: + """Enough surface for megatron-core *and* torch._inductor triton_compat.""" + language = StubModule("triton.language") + core = StubModule("triton.language.core") + + def _view(x, *args, _semantic=None, **kwargs): + del args, _semantic, kwargs + return x + + def _reshape(x, *args, _semantic=None, **kwargs): + del args, _semantic, kwargs + return x + + core.view = _view # type: ignore[attr-defined] + core.reshape = _reshape # type: ignore[attr-defined] + language.core = core # type: ignore[attr-defined] + language.constexpr = lambda x=None, *a, **k: x # type: ignore[attr-defined] + language.tensor = type("tensor", (), {}) # type: ignore[attr-defined] + language.constexpr_type = language.constexpr # type: ignore[attr-defined] + mod.language = language # type: ignore[attr-defined] + mod.__version__ = "3.0.0+probing.fakes" # type: ignore[attr-defined] + mod.jit = lambda fn=None, **kwargs: ( # type: ignore[attr-defined] + fn if fn is not None else (lambda f: f) + ) + mod.autotune = lambda *a, **k: lambda f: f # type: ignore[attr-defined] + mod.heuristics = lambda *a, **k: lambda f: f # type: ignore[attr-defined] + mod.Config = type("Config", (), {"__init__": lambda self, *a, **k: None}) # type: ignore[attr-defined] + _CACHE["triton.language"] = language + _CACHE["triton.language.core"] = core + + +def _wire_transformer_engine(mod: types.ModuleType) -> None: + import torch.nn as nn + + class _PassthroughLinear(nn.Linear): + def __init__(self, *args: Any, **kwargs: Any) -> None: + # TE Linear has extra kwargs; keep a usable torch Linear when possible. + in_f = kwargs.get("in_features", args[0] if args else 1) + out_f = kwargs.get("out_features", args[1] if len(args) > 1 else in_f) + bias = kwargs.get("bias", True) + try: + super().__init__(int(in_f), int(out_f), bias=bool(bias)) + except Exception: + super().__init__(1, 1) + + pytorch = StubModule("transformer_engine.pytorch") + pytorch.Linear = _PassthroughLinear # type: ignore[attr-defined] + pytorch.LayerNorm = nn.LayerNorm # type: ignore[attr-defined] + pytorch.TransformerLayer = nn.Identity # type: ignore[attr-defined] + pytorch.fp8_autocast = lambda *a, **k: _NullCtx() # type: ignore[attr-defined] + pytorch.is_fp8_available = lambda *a, **k: False # type: ignore[attr-defined] + mod.pytorch = pytorch # type: ignore[attr-defined] + _CACHE["transformer_engine.pytorch"] = pytorch + + +class _NullCtx: + def __enter__(self) -> _NullCtx: + return self + + def __exit__(self, *args: object) -> None: + return None + + +def transformer_engine_factory(fullname: str) -> types.ModuleType: + mod = _package(fullname) + if fullname == "transformer_engine": + _wire_transformer_engine(mod) + return mod + + +def apex_factory(fullname: str) -> types.ModuleType: + mod = _package(fullname) + if fullname == "apex.optimizers": + import torch + + class FusedAdam(torch.optim.AdamW): + """Apex-compatible AdamW that ignores CUDA-only constructor kwargs.""" + + def __init__(self, params, *args, **kwargs): + for key in ( + "adam_w_mode", + "set_grad_none", + "capturable", + "master_weights", + "use_decoupled_grad", + ): + kwargs.pop(key, None) + # Apex uses `bias_correction`; torch.AdamW uses `amsgrad` etc. + kwargs.pop("bias_correction", None) + super().__init__(params, *args, **kwargs) + + class FusedSGD(torch.optim.SGD): + def __init__(self, params, *args, **kwargs): + kwargs.pop("set_grad_none", None) + super().__init__(params, *args, **kwargs) + + mod.FusedAdam = FusedAdam # type: ignore[attr-defined] + mod.FusedSGD = FusedSGD # type: ignore[attr-defined] + return mod + + +def flash_attn_factory(fullname: str) -> types.ModuleType: + mod = _package(fullname) + if fullname == "flash_attn": + mod.flash_attn_func = lambda *a, **k: None # type: ignore[attr-defined] + mod.flash_attn_varlen_func = lambda *a, **k: None # type: ignore[attr-defined] + return mod + + +def triton_factory(fullname: str) -> types.ModuleType: + if fullname == "triton.language" and fullname in _CACHE: + return _CACHE[fullname] + mod = _package(fullname) + if fullname == "triton": + _wire_triton(mod) + if fullname == "triton.language": + # Ensure parent got language wired even if language imported first. + parent = _package("triton") + if not hasattr(parent, "language"): + _wire_triton(parent) + return _CACHE.get("triton.language", mod) + return mod + + +register( + FakeSpec( + name="transformer_engine", + prefixes=("transformer_engine",), + factory=transformer_engine_factory, + description="No-op Transformer Engine stubs", + ) +) +register( + FakeSpec( + name="apex", + prefixes=("apex",), + factory=apex_factory, + description="No-op NVIDIA Apex stubs", + ) +) +register( + FakeSpec( + name="flash_attn", + prefixes=("flash_attn",), + factory=flash_attn_factory, + description="No-op FlashAttention stubs", + ) +) +register( + FakeSpec( + name="triton", + prefixes=("triton",), + factory=triton_factory, + description="Triton surface stubs so megatron-core can import on macOS", + ) +) + +# Bottom-layer default set used when running real Megatron-LM. +BOTTOM_LAYER_SPECS = ( + "triton", + "transformer_engine", + "apex", + "flash_attn", +) diff --git a/python/probing/fakes/specs/megatron.py b/python/probing/fakes/specs/megatron.py new file mode 100644 index 00000000..28699d26 --- /dev/null +++ b/python/probing/fakes/specs/megatron.py @@ -0,0 +1,753 @@ +"""Scripted Megatron-shaped module tree for macOS / meta-device debugging. + +Exposes enough of the Megatron-LM / megatron-core import surface for a +``pretrain_gpt.py``-style entry to boot under ``probing.fakes``: + +* ``megatron.core.parallel_state`` / ``megatron.core.mpu`` +* ``megatron.core.enums.ModelType`` +* ``megatron.core.models.gpt.GPTModel`` (tiny meta ``nn.Module``) +* ``megatron.training``: ``get_args``, ``pretrain``, ``print_rank_0``, … +* ``megatron.training.training.train_step`` +* ``megatron.training.global_vars.get_args`` + +This is **not** Megatron-Core. Real forward/backward on ``meta`` will fail; +``pretrain()`` advances probing step/role coordinates with a scripted loop. +""" + +from __future__ import annotations + +import sys +import types +from types import SimpleNamespace +from typing import Any, Optional + +from ..registry import FakeSpec, register + +_STATE: dict[str, Any] = { + "initialized": False, + "tp": 0, + "pp": 0, + "dp": 0, + "ep": 0, + "cp": 0, + "tp_size": 1, + "pp_size": 1, + "dp_size": 1, + "iteration": 0, + "micro_batches": 1, + "train_calls": 0, +} + +_ARGS: SimpleNamespace | None = None +_CACHE: dict[str, types.ModuleType] = {} + + +def default_args(**overrides: Any) -> SimpleNamespace: + """Megatron-like args namespace used by fake ``get_args()``.""" + base = dict( + num_layers=2, + hidden_size=64, + num_attention_heads=4, + seq_length=32, + max_position_embeddings=32, + micro_batch_size=1, + global_batch_size=2, + train_iters=4, + eval_iters=0, + save_interval=0, + tensor_model_parallel_size=1, + pipeline_model_parallel_size=1, + context_parallel_size=1, + data_parallel_size=1, + seed=1234, + mock_data=True, + fp16=False, + bf16=False, + tokenizer_type="NullTokenizer", + vocab_size=1024, + padded_vocab_size=1024, + untie_embeddings_and_output_weights=True, + use_cpu_initialization=True, + perform_initialization=True, + iteration=0, + consumed_train_samples=0, + consumed_valid_samples=0, + variable_seq_lengths=False, + sft=False, + fim_data=False, + create_attention_mask_in_dataloader=False, + dataloader_inter_document_masking=False, + hybrid_context_parallel=False, + sequence_parallel=False, + overlap_moe_expert_parallel_comm=False, + check_for_nan_in_loss_and_grad=False, + check_for_spiky_loss=False, + logits_load_dir=None, + modelopt_enabled=False, + rank=0, + world_size=1, + local_rank=0, + distributed_backend="gloo", + DDP_impl="local", + # Fields referenced by Megatron-LM pretrain_gpt / gpt_builders. + yaml_cfg=None, + transformer_impl="local", + experimental_attention_variant=None, + num_experts=None, + heterogeneous_layers_config_path=None, + normalization="LayerNorm", + qk_l2_norm=False, + mtp_num_layers=None, + spec=None, + record_memory_history=False, + memory_snapshot_path="oom_snapshot.pickle", + use_legacy_models=False, + ) + base.update(overrides) + return SimpleNamespace(**base) + + +def set_args(args: SimpleNamespace) -> SimpleNamespace: + global _ARGS + _ARGS = args + _STATE["iteration"] = int(getattr(args, "iteration", 0) or 0) + _STATE["tp_size"] = max(1, int(getattr(args, "tensor_model_parallel_size", 1) or 1)) + _STATE["pp_size"] = max( + 1, int(getattr(args, "pipeline_model_parallel_size", 1) or 1) + ) + _STATE["dp_size"] = max(1, int(getattr(args, "data_parallel_size", 1) or 1)) + # Ranks default to 0 for single-process macOS debug. + _STATE["tp"] = int(getattr(args, "tensor_model_parallel_rank", 0) or 0) + _STATE["pp"] = int(getattr(args, "pipeline_model_parallel_rank", 0) or 0) + _STATE["dp"] = int(getattr(args, "data_parallel_rank", 0) or 0) + gbs = int(getattr(args, "global_batch_size", 1) or 1) + mbs = max(1, int(getattr(args, "micro_batch_size", 1) or 1)) + _STATE["micro_batches"] = max(1, gbs // mbs) + return args + + +def get_args() -> SimpleNamespace: + global _ARGS + if _ARGS is None: + _ARGS = default_args() + set_args(_ARGS) + _ARGS.iteration = int(_STATE["iteration"]) + return _ARGS + + +def reset_state( + *, + tp: int = 0, + pp: int = 0, + dp: int = 0, + ep: int = 0, + cp: int = 0, + iteration: int = 0, + micro_batches: int = 1, +) -> None: + _STATE.update( + { + "initialized": False, + "tp": int(tp), + "pp": int(pp), + "dp": int(dp), + "ep": int(ep), + "cp": int(cp), + "iteration": int(iteration), + "micro_batches": max(1, int(micro_batches)), + "train_calls": 0, + } + ) + + +def get_state() -> dict[str, Any]: + return dict(_STATE) + + +def set_iteration(iteration: int) -> None: + _STATE["iteration"] = int(iteration) + if _ARGS is not None: + _ARGS.iteration = int(iteration) + try: + from probing.fakes.journal import record_fake_event + + record_fake_event("set_iteration", f"iteration={iteration}") + except Exception: + pass + + +def set_micro_batches(n: int) -> None: + _STATE["micro_batches"] = max(1, int(n)) + + +def _mark(module: types.ModuleType) -> types.ModuleType: + module.__probing_fake__ = True # type: ignore[attr-defined] + return module + + +def _make_parallel_state() -> types.ModuleType: + ps = _mark(types.ModuleType("megatron.core.parallel_state")) + + def model_parallel_is_initialized() -> bool: + return bool(_STATE["initialized"]) + + def is_initialized() -> bool: + return bool(_STATE["initialized"]) + + def get_tensor_model_parallel_rank() -> int: + return int(_STATE["tp"]) + + def get_pipeline_model_parallel_rank() -> int: + return int(_STATE["pp"]) + + def get_data_parallel_rank() -> int: + return int(_STATE["dp"]) + + def get_tensor_model_parallel_world_size() -> int: + return int(_STATE["tp_size"]) + + def get_pipeline_model_parallel_world_size() -> int: + return int(_STATE["pp_size"]) + + def get_data_parallel_world_size() -> int: + return int(_STATE["dp_size"]) + + def is_pipeline_first_stage(*_a: Any, **_k: Any) -> bool: + return int(_STATE["pp"]) == 0 + + def is_pipeline_last_stage(*_a: Any, **_k: Any) -> bool: + return int(_STATE["pp"]) == int(_STATE["pp_size"]) - 1 + + def get_tensor_model_parallel_group() -> None: + return None + + def get_tensor_model_parallel_src_rank() -> int: + return 0 + + def get_context_parallel_group() -> None: + return None + + def get_hybrid_data_context_parallel_groups(*_a: Any, **_k: Any) -> None: + return None + + def initialize_model_parallel(*args: Any, **kwargs: Any) -> None: + if "tensor_model_parallel_size" in kwargs: + _STATE["tp_size"] = max(1, int(kwargs["tensor_model_parallel_size"])) + if "pipeline_model_parallel_size" in kwargs: + _STATE["pp_size"] = max(1, int(kwargs["pipeline_model_parallel_size"])) + del args + _STATE["initialized"] = True + try: + from probing.fakes.journal import record_fake_event + + record_fake_event( + "init_parallel", + "initialize_model_parallel", + attrs={ + "tp_size": _STATE["tp_size"], + "pp_size": _STATE["pp_size"], + "tp": _STATE["tp"], + "pp": _STATE["pp"], + "dp": _STATE["dp"], + }, + ) + except Exception: + pass + + def destroy_model_parallel() -> None: + _STATE["initialized"] = False + + ps.model_parallel_is_initialized = model_parallel_is_initialized + ps.is_initialized = is_initialized + ps.get_tensor_model_parallel_rank = get_tensor_model_parallel_rank + ps.get_pipeline_model_parallel_rank = get_pipeline_model_parallel_rank + ps.get_data_parallel_rank = get_data_parallel_rank + ps.get_tensor_model_parallel_world_size = get_tensor_model_parallel_world_size + ps.get_pipeline_model_parallel_world_size = get_pipeline_model_parallel_world_size + ps.get_data_parallel_world_size = get_data_parallel_world_size + ps.is_pipeline_first_stage = is_pipeline_first_stage + ps.is_pipeline_last_stage = is_pipeline_last_stage + ps.get_tensor_model_parallel_group = get_tensor_model_parallel_group + ps.get_tensor_model_parallel_src_rank = get_tensor_model_parallel_src_rank + ps.get_context_parallel_group = get_context_parallel_group + ps.get_hybrid_data_context_parallel_groups = get_hybrid_data_context_parallel_groups + if int(_STATE["ep"]): + ps.get_expert_model_parallel_rank = lambda: int(_STATE["ep"]) + if int(_STATE["cp"]): + ps.get_context_parallel_rank = lambda: int(_STATE["cp"]) + ps.initialize_model_parallel = initialize_model_parallel + ps.destroy_model_parallel = destroy_model_parallel + return ps + + +def _make_num_microbatches() -> types.ModuleType: + mod = _mark(types.ModuleType("megatron.core.num_microbatches_calculator")) + + def get_num_microbatches() -> int: + return int(_STATE["micro_batches"]) + + mod.get_num_microbatches = get_num_microbatches + return mod + + +def _make_enums() -> types.ModuleType: + mod = _mark(types.ModuleType("megatron.core.enums")) + + class ModelType: + encoder_or_decoder = 1 + encoder_and_decoder = 2 + retro_encoder = 3 + retro_decoder = 4 + + mod.ModelType = ModelType + return mod + + +def _make_gpt_model() -> types.ModuleType: + import torch.nn as nn + + mod = _mark(types.ModuleType("megatron.core.models.gpt")) + mod.__path__ = [] # type: ignore[attr-defined] # package: gpt_layer_specs, … + + class GPTModel(nn.Module): + """Tiny stand-in; lives on the remapped fake device (usually meta).""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__() + del args + hidden = int(kwargs.get("hidden_size", get_args().hidden_size)) + vocab = int(kwargs.get("vocab_size", get_args().padded_vocab_size)) + self.vp_stage = kwargs.get("vp_stage") + self.embed = nn.Embedding(vocab, hidden) + self.lm_head = nn.Linear(hidden, vocab, bias=False) + + def forward( + self, tokens=None, position_ids=None, attention_mask=None, **kwargs + ): + del position_ids, attention_mask, kwargs + if tokens is None: + return self.lm_head(self.embed.weight[:1]) + hidden = self.embed(tokens) + return self.lm_head(hidden) + + def build_schedule_plan(self, *args: Any, **kwargs: Any) -> None: + del args, kwargs + return None + + mod.GPTModel = GPTModel + return mod + + +def _make_package_info() -> types.ModuleType: + mod = _mark(types.ModuleType("megatron.core.package_info")) + mod.__version__ = "0.0.0+probing.fakes" + return mod + + +def _make_global_vars() -> types.ModuleType: + mod = _mark(types.ModuleType("megatron.training.global_vars")) + mod._probing_args = None # type: ignore[attr-defined] + mod.get_args = get_args + return mod + + +def _make_training() -> types.ModuleType: + mod = _mark(types.ModuleType("megatron.training.training")) + + def train_step(*args: Any, **kwargs: Any) -> dict[str, float]: + del args, kwargs + _STATE["train_calls"] = int(_STATE["train_calls"]) + 1 + try: + from probing.fakes.journal import record_fake_event + + record_fake_event("train_step", "train_step") + except Exception: + pass + return {"loss": 1.0} + + def update_seqlen_stats_from_cu_seqlens(*_a: Any, **_k: Any) -> None: + return None + + mod.train_step = train_step + mod.update_seqlen_stats_from_cu_seqlens = update_seqlen_stats_from_cu_seqlens + return mod + + +def _make_training_pkg( + *, + training_mod: types.ModuleType, + global_vars: types.ModuleType, +) -> types.ModuleType: + pkg = _mark(types.ModuleType("megatron.training")) + pkg.__path__ = [] # type: ignore[attr-defined] + pkg.training = training_mod + pkg.global_vars = global_vars + pkg.get_args = get_args + + def print_rank_0(msg: Any) -> None: + if int(getattr(get_args(), "rank", 0) or 0) == 0: + print(msg) + + class _Timers: + def __call__(self, *_a: Any, **_k: Any) -> _Timers: + return self + + def start(self) -> None: + return None + + def stop(self) -> None: + return None + + def get_timers() -> _Timers: + return _Timers() + + def set_startup_timestamps(**_k: Any) -> None: + return None + + def pretrain(*args: Any, **kwargs: Any): + from probing.fakes.pretrain import run_pretrain + + model_provider = kwargs.get("model_provider") + forward_step = kwargs.get("forward_step_func") or kwargs.get("forward_step") + datasets_provider = kwargs.get("train_valid_test_datasets_provider") + + # Megatron-LM current: (full_config, datasets_provider, model_type, forward_step, ...) + # Older: (datasets_provider, model_provider, model_type, forward_step, ...) + if ( + model_provider is None + and datasets_provider is None + and len(args) >= 4 + and callable(args[1]) + and callable(args[3]) + and not callable(args[0]) + ): + datasets_provider = args[1] + forward_step = forward_step or args[3] + else: + if datasets_provider is None and args and callable(args[0]): + datasets_provider = args[0] + if model_provider is None and len(args) >= 2 and callable(args[1]): + model_provider = args[1] + if forward_step is None and len(args) >= 4 and callable(args[3]): + forward_step = args[3] + + return run_pretrain( + model_provider=model_provider, + forward_step_func=forward_step, + train_valid_test_datasets_provider=datasets_provider, + ) + + class _InprocessRestart: + @staticmethod + def maybe_wrap_for_inprocess_restart(fn: Any): + return fn, None + + pkg.print_rank_0 = print_rank_0 + pkg.get_timers = get_timers + pkg.set_startup_timestamps = set_startup_timestamps + pkg.pretrain = pretrain + pkg.inprocess_restart = _InprocessRestart() + return pkg + + +def build_megatron_tree( + *, + tp: int = 0, + pp: int = 0, + dp: int = 0, + iteration: int = 0, + micro_batches: int = 1, + initialized: bool = True, + args: SimpleNamespace | None = None, +) -> dict[str, types.ModuleType]: + """Build a full megatron module dict (also usable outside the finder).""" + reset_state(tp=tp, pp=pp, dp=dp, iteration=iteration, micro_batches=micro_batches) + _STATE["initialized"] = initialized + if args is not None: + set_args(args) + else: + set_args( + default_args( + iteration=iteration, + global_batch_size=micro_batches, + micro_batch_size=1, + tensor_model_parallel_rank=tp, + pipeline_model_parallel_rank=pp, + data_parallel_rank=dp, + ) + ) + + ps = _make_parallel_state() + num_calc = _make_num_microbatches() + enums = _make_enums() + gpt_mod = _make_gpt_model() + pkg_info = _make_package_info() + training_mod = _make_training() + global_vars = _make_global_vars() + training_pkg = _make_training_pkg( + training_mod=training_mod, global_vars=global_vars + ) + + models_pkg = _mark(types.ModuleType("megatron.core.models")) + models_pkg.__path__ = [] # type: ignore[attr-defined] + models_pkg.gpt = gpt_mod + + core = _mark(types.ModuleType("megatron.core")) + core.__path__ = [] # type: ignore[attr-defined] + core.parallel_state = ps + core.mpu = ps # historical alias + core.num_microbatches_calculator = num_calc + core.enums = enums + core.models = models_pkg + core.package_info = pkg_info + + megatron = _mark(types.ModuleType("megatron")) + megatron.__path__ = [] # type: ignore[attr-defined] + megatron.core = core + megatron.training = training_pkg + + tree = { + "megatron": megatron, + "megatron.core": core, + "megatron.core.mpu": ps, + "megatron.core.parallel_state": ps, + "megatron.core.num_microbatches_calculator": num_calc, + "megatron.core.enums": enums, + "megatron.core.models": models_pkg, + "megatron.core.models.gpt": gpt_mod, + "megatron.core.package_info": pkg_info, + "megatron.training": training_pkg, + "megatron.training.training": training_mod, + "megatron.training.global_vars": global_vars, + } + _CACHE.clear() + _CACHE.update(tree) + _wire_training_cli_stubs(tree) + _CACHE.update(tree) + return tree + + +def ensure_sys_modules( + *, + tp: int | None = None, + pp: int | None = None, + dp: int | None = None, + args: SimpleNamespace | None = None, +) -> dict[str, types.ModuleType]: + """Materialize the fake tree into ``sys.modules``.""" + state = get_state() + tree = build_megatron_tree( + tp=state["tp"] if tp is None else tp, + pp=state["pp"] if pp is None else pp, + dp=state["dp"] if dp is None else dp, + iteration=state["iteration"], + micro_batches=state["micro_batches"], + initialized=True, + args=args or get_args(), + ) + for name, mod in tree.items(): + sys.modules[name] = mod + return tree + + +def _ensure_tree() -> dict[str, types.ModuleType]: + if "megatron" not in _CACHE: + build_megatron_tree() + return _CACHE + + +class StubModule(types.ModuleType): + """Package-like module that synthesizes missing attributes on demand. + + Lets real Megatron-LM scripts (``pretrain_gpt.py``, ``gpt_builders.py``) + import deep ``megatron.*`` paths under ``probing.fakes`` force mode. + """ + + def __init__(self, name: str): + super().__init__(name) + self.__probing_fake__ = True # type: ignore[attr-defined] + self.__path__ = [] # type: ignore[attr-defined] + + def __getattr__(self, name: str) -> Any: + if name.startswith("__") and name.endswith("__"): + raise AttributeError(name) + # CapWords → lightweight type (HybridModel, PackedSeqParams, …) + if name[:1].isupper(): + cls = type( + name, + (), + { + "__init__": lambda self, *a, **k: None, + "__enter__": lambda self: self, + "__exit__": lambda self, *a: None, + "__call__": lambda self, *a, **k: self, + }, + ) + setattr(self, name, cls) + return cls + + def stub(*args: Any, **kwargs: Any) -> Any: + del args, kwargs + return None + + stub.__name__ = name + stub.__qualname__ = name + setattr(self, name, stub) + return stub + + +def _wire_training_cli_stubs(tree: dict[str, types.ModuleType]) -> None: + """Concrete stubs for Megatron-LM argument / config import sites.""" + + def _apply_argv_overrides(args: SimpleNamespace) -> SimpleNamespace: + """Best-effort map of common Megatron-LM flags from ``sys.argv``.""" + mapping = { + "--num-layers": ("num_layers", int), + "--hidden-size": ("hidden_size", int), + "--num-attention-heads": ("num_attention_heads", int), + "--seq-length": ("seq_length", int), + "--max-position-embeddings": ("max_position_embeddings", int), + "--micro-batch-size": ("micro_batch_size", int), + "--global-batch-size": ("global_batch_size", int), + "--train-iters": ("train_iters", int), + "--eval-iters": ("eval_iters", int), + "--vocab-size": ("vocab_size", int), + "--seed": ("seed", int), + "--tensor-model-parallel-size": ("tensor_model_parallel_size", int), + "--pipeline-model-parallel-size": ("pipeline_model_parallel_size", int), + } + argv = list(sys.argv[1:]) + i = 0 + while i < len(argv): + tok = argv[i] + if tok in mapping and i + 1 < len(argv): + attr, caster = mapping[tok] + try: + setattr(args, attr, caster(argv[i + 1])) + except Exception: + pass + if attr == "vocab_size": + args.padded_vocab_size = int(getattr(args, "vocab_size", 1024)) + i += 2 + continue + if tok == "--mock-data": + args.mock_data = True + i += 1 + return set_args(args) + + def parse_and_validate_args(*args: Any, **kwargs: Any) -> SimpleNamespace: + del args, kwargs + return _apply_argv_overrides(default_args()) + + def core_transformer_config_from_args(args: Any = None, **kwargs: Any) -> Any: + del kwargs + return args if args is not None else get_args() + + def core_transformer_config_from_yaml(*args: Any, **kwargs: Any) -> Any: + del args, kwargs + return get_args() + + def gpt_config_from_args(args: Any = None, **kwargs: Any) -> Any: + del kwargs + return args if args is not None else get_args() + + def pretrain_cfg_container_from_args( + args: Any, model_cfg: Any = None, **kwargs: Any + ) -> Any: + del model_cfg, kwargs + return args + + def import_module(*args: Any, **kwargs: Any) -> Any: + del args, kwargs + return None + + def get_torch_version() -> str: + try: + import torch + + return str(torch.__version__) + except Exception: + return "unknown" + + def get_te_version() -> str: + return "none+fakes" + + class StragglerDetector: + def __init__(self, *args: Any, **kwargs: Any) -> None: + del args, kwargs + + def __call__(self, *args: Any, **kwargs: Any) -> StragglerDetector: + del args, kwargs + return self + + def __enter__(self) -> StragglerDetector: + return self + + def __exit__(self, *args: Any) -> None: + return None + + args_mod = StubModule("megatron.training.arguments") + args_mod.parse_and_validate_args = parse_and_validate_args + args_mod.core_transformer_config_from_args = core_transformer_config_from_args + tree["megatron.training.arguments"] = args_mod + + arg_utils = StubModule("megatron.training.argument_utils") + arg_utils.gpt_config_from_args = gpt_config_from_args + arg_utils.pretrain_cfg_container_from_args = pretrain_cfg_container_from_args + tree["megatron.training.argument_utils"] = arg_utils + + yaml_args = StubModule("megatron.training.yaml_arguments") + yaml_args.core_transformer_config_from_yaml = core_transformer_config_from_yaml + tree["megatron.training.yaml_arguments"] = yaml_args + + utils = StubModule("megatron.core.utils") + utils.StragglerDetector = StragglerDetector + utils.get_torch_version = get_torch_version + utils.get_te_version = get_te_version + utils.get_attr_wrapped_model = lambda model, name, *a, **k: getattr( + model, name, None + ) + utils.get_batch_on_this_tp_rank = lambda batch, **k: batch + utils.get_batch_on_this_cp_rank = lambda batch, **k: batch + utils.flatten_batch_for_packed_sequences = lambda batch, **k: batch + tree["megatron.core.utils"] = utils + + spec_utils = StubModule("megatron.core.transformer.spec_utils") + spec_utils.import_module = import_module + tree["megatron.core.transformer.spec_utils"] = spec_utils + + # Attach under parents already in the tree when present. + training = tree.get("megatron.training") + if training is not None: + training.arguments = args_mod + training.argument_utils = arg_utils + training.yaml_arguments = yaml_args + core = tree.get("megatron.core") + if core is not None: + core.utils = utils + + +def megatron_factory(fullname: str) -> types.ModuleType: + tree = _ensure_tree() + if fullname in tree: + return tree[fullname] + mod = StubModule(fullname) + tree[fullname] = mod + parent_name, _, child = fullname.rpartition(".") + parent = tree.get(parent_name) or sys.modules.get(parent_name) + if parent is not None and child: + try: + setattr(parent, child, mod) + except Exception: + pass + return mod + + +register( + FakeSpec( + name="megatron", + prefixes=("megatron",), + factory=megatron_factory, + description="Scripted Megatron surface for pretrain_gpt-style macOS debug", + ) +) diff --git a/python/probing/fakes/torch_hooks.py b/python/probing/fakes/torch_hooks.py new file mode 100644 index 00000000..bf024d91 --- /dev/null +++ b/python/probing/fakes/torch_hooks.py @@ -0,0 +1,214 @@ +"""Monkey-patch real ``torch.distributed`` APIs to journal + dual-write. + +Prefer this over MetaPath-replacing ``torch.distributed`` (which breaks an +already-imported ``torch``). Hooks wrap the live module when present. + +When the process group is not initialized, collectives are **simulated** +(journal + ``comm_collective`` only) so macOS fakes loops still produce +correlatable rows without gloo/NCCL. +""" + +from __future__ import annotations + +import logging +import time +from typing import Any, Callable + +from .journal import record_fake_event + +logger = logging.getLogger(__name__) + +_INSTALLED = False +_ORIGINALS: dict[str, Any] = {} + +_COLLECTIVES = ( + "all_reduce", + "broadcast", + "all_gather", + "reduce_scatter", + "all_gather_into_tensor", + "reduce_scatter_tensor", + "barrier", +) + + +class _FakeWork: + def wait(self, *args: Any, **kwargs: Any) -> None: + del args, kwargs + return None + + def is_completed(self) -> bool: + return True + + +def _tensor_meta(tensor: Any) -> tuple[int, str, str]: + try: + import torch + + if isinstance(tensor, torch.Tensor): + return ( + int(tensor.element_size() * tensor.numel()), + str(tuple(tensor.shape)), + str(tensor.dtype), + ) + except Exception: + pass + return 0, "", "" + + +def _dual_write_collective( + op: str, + *, + tensor: Any = None, + duration_ms: float, + async_op: bool = False, +) -> None: + nbytes, shape, dtype = _tensor_meta(tensor) + record_fake_event( + "collective", + op, + nbytes=nbytes, + duration_ms=duration_ms, + attrs={"shape": shape, "dtype": dtype, "async_op": async_op}, + ) + try: + import torch.distributed as dist + + from probing.profiling.collective.record import record_comm_lite + + group_rank = dist.get_rank() if dist.is_initialized() else 0 + group_size = dist.get_world_size() if dist.is_initialized() else 1 + record_comm_lite( + op=op, + duration_ms=duration_ms, + group_rank=int(group_rank), + group_size=int(group_size), + nbytes=nbytes, + tensor_shape=shape, + tensor_dtype=dtype, + async_op=async_op, + write_trace_event=True, + ) + except Exception as exc: + logger.debug("comm_collective dual-write skipped: %s", exc) + + +def _wrap_collective(op: str, orig: Callable[..., Any]) -> Callable[..., Any]: + def wrapped(*args: Any, **kwargs: Any) -> Any: + import torch.distributed as dist + + tensor = args[0] if args else kwargs.get("tensor") + async_op = bool(kwargs.get("async_op", False)) + + if not dist.is_initialized(): + _dual_write_collective( + op, tensor=tensor, duration_ms=0.0, async_op=async_op + ) + return _FakeWork() if async_op else None + + t0 = time.perf_counter() + result = orig(*args, **kwargs) + duration_ms = (time.perf_counter() - t0) * 1e3 + if async_op and result is not None and hasattr(result, "wait"): + inner_wait = result.wait + + def wait(*wargs: Any, **wkwargs: Any) -> Any: + tw = time.perf_counter() + out = inner_wait(*wargs, **wkwargs) + _dual_write_collective( + op, + tensor=tensor, + duration_ms=(time.perf_counter() - tw) * 1e3, + async_op=True, + ) + return out + + result.wait = wait # type: ignore[method-assign] + return result + _dual_write_collective( + op, tensor=tensor, duration_ms=duration_ms, async_op=False + ) + return result + + return wrapped + + +def install_torch_dist_hooks() -> bool: + """Wrap ``torch.distributed`` collectives to emit ``fake_event`` (+ comm rows).""" + global _INSTALLED + if _INSTALLED: + return True + try: + import torch.distributed as dist + except Exception as exc: + logger.debug("torch.distributed unavailable for hooks: %s", exc) + return False + + for name in _COLLECTIVES: + orig = getattr(dist, name, None) + if not callable(orig): + continue + _ORIGINALS[name] = orig + setattr(dist, name, _wrap_collective(name, orig)) + + for name in ("init_process_group", "destroy_process_group"): + orig = getattr(dist, name, None) + if not callable(orig): + continue + _ORIGINALS[name] = orig + if name == "init_process_group": + + def make_init(o: Callable[..., Any]) -> Callable[..., Any]: + def _wrapped(*args: Any, **kwargs: Any) -> Any: + result = o(*args, **kwargs) + record_fake_event( + "dist", + "init_process_group", + attrs={ + "backend": str(kwargs.get("backend", "")), + "rank": str(kwargs.get("rank", "")), + "world_size": str(kwargs.get("world_size", "")), + }, + ) + return result + + return _wrapped + + setattr(dist, name, make_init(orig)) + else: + + def make_destroy(o: Callable[..., Any]) -> Callable[..., Any]: + def _wrapped(*args: Any, **kwargs: Any) -> Any: + result = o(*args, **kwargs) + record_fake_event("dist", "destroy_process_group") + return result + + return _wrapped + + setattr(dist, name, make_destroy(orig)) + + _INSTALLED = True + record_fake_event("dist", "hooks_installed") + logger.info("probing.fakes torch.distributed journal hooks installed") + return True + + +def uninstall_torch_dist_hooks() -> None: + global _INSTALLED + if not _INSTALLED: + return + try: + import torch.distributed as dist + except Exception: + _ORIGINALS.clear() + _INSTALLED = False + return + for name, orig in _ORIGINALS.items(): + setattr(dist, name, orig) + _ORIGINALS.clear() + _INSTALLED = False + logger.info("probing.fakes torch.distributed journal hooks removed") + + +def torch_dist_hooks_installed() -> bool: + return _INSTALLED diff --git a/python/probing/fakes/verify.py b/python/probing/fakes/verify.py new file mode 100644 index 00000000..cb9e44f3 --- /dev/null +++ b/python/probing/fakes/verify.py @@ -0,0 +1,146 @@ +"""Correlate ``python.fake_event`` ground truth with probing observations.""" + +from __future__ import annotations + +import dataclasses +from dataclasses import dataclass +from typing import Any, Optional + + +@dataclass +class VerifyIssue: + code: str + message: str + seq: int = -1 + expected: Any = None + observed: Any = None + + +@dataclass +class VerifyReport: + ok: bool + checked: int + issues: list[VerifyIssue] + + def raise_if_failed(self) -> None: + if self.ok: + return + detail = "; ".join(f"{i.code}: {i.message}" for i in self.issues[:8]) + raise AssertionError( + f"probing.fakes verify failed ({len(self.issues)} issues): {detail}" + ) + + +def _rows(table_cls, limit: int = 10_000) -> list[dict[str, Any]]: + try: + table_cls.init_table() + except Exception: + pass + try: + raw = table_cls.take(limit) + except Exception: + return [] + fields = [f.name for f in dataclasses.fields(table_cls)] + out: list[dict[str, Any]] = [] + for item in raw: + data = item[1] if isinstance(item, tuple) and len(item) == 2 else item + if isinstance(data, dict): + out.append(data) + else: + out.append(dict(zip(fields, data))) + return out + + +def verify_against_probing( + *, + require_train_steps: Optional[int] = None, + check_step_alignment: bool = True, + check_collectives: bool = True, + run_id: Optional[str] = None, +) -> VerifyReport: + """Compare fake journal rows to probing step / optional ``comm_collective``. + + Checks: + * ``train_step`` count (optional) + * after probing Megatron wrap, ``local_step`` should equal ``expected_iteration`` + * fake ``collective`` rows should have matching ``python.comm_collective`` ops + when that table has data + + ``run_id`` defaults to the current journal run (see ``begin_run``). + """ + from probing.fakes.journal import FakeEvent, current_run_id + + issues: list[VerifyIssue] = [] + rid = current_run_id() if run_id is None else run_id + events = [e for e in _rows(FakeEvent) if not rid or e.get("run_id") == rid] + train_events = [e for e in events if e.get("kind") == "train_step"] + checked = 0 + + if require_train_steps is not None: + checked += 1 + if len(train_events) != int(require_train_steps): + issues.append( + VerifyIssue( + code="train_step_count", + message="fake train_step count mismatch", + expected=int(require_train_steps), + observed=len(train_events), + ) + ) + + if check_step_alignment: + for ev in train_events: + checked += 1 + expected = int(ev.get("expected_iteration", -1)) + observed = int(ev.get("local_step", -2)) + # probing wrap syncs at train_step *entry*, so local_step == iteration. + if expected >= 0 and observed != expected: + issues.append( + VerifyIssue( + code="step_mismatch", + message="probing local_step != fake expected_iteration", + seq=int(ev.get("seq", -1)), + expected=expected, + observed=observed, + ) + ) + + if check_collectives: + coll_events = [e for e in events if e.get("kind") == "collective"] + if coll_events: + try: + from probing.profiling.collective.record import CommCollective + + comm_rows = _rows(CommCollective) + except Exception: + comm_rows = [] + checked += 1 + if not comm_rows: + issues.append( + VerifyIssue( + code="comm_missing", + message=( + "fake recorded collectives but python.comm_collective " + "is empty — enable collective tracing or use " + "fake dist which writes both" + ), + expected=len(coll_events), + observed=0, + ) + ) + else: + fake_ops = [str(e.get("name", "")) for e in coll_events] + comm_ops = [str(r.get("op", "")) for r in comm_rows] + for op in fake_ops: + checked += 1 + if op and op not in comm_ops: + issues.append( + VerifyIssue( + code="comm_op_missing", + message=f"no comm_collective row for fake op {op}", + expected=op, + observed=sorted(set(comm_ops)), + ) + ) + + return VerifyReport(ok=not issues, checked=checked, issues=issues) diff --git a/python/probing/handlers/pythonext.py b/python/probing/handlers/pythonext.py index 5dc57345..2fe21ce5 100644 --- a/python/probing/handlers/pythonext.py +++ b/python/probing/handlers/pythonext.py @@ -651,13 +651,7 @@ def extensions_list_api() -> str: return vendor_extensions_json() -@ext_handler( - "pythonext", - [ - "engines/register", - "pythonext/engines/register", - ], -) +@ext_handler("pythonext", "engines/register") def register_inference_engine( router_addr: str, engine_id: str = "inference-engine", @@ -684,13 +678,7 @@ def register_inference_engine( ) -@ext_handler( - "pythonext", - [ - "engines/register_slime", - "pythonext/engines/register_slime", - ], -) +@ext_handler("pythonext", "engines/register_slime") def register_slime_inference_engine( router_addr: str, engine_id: str = "sglang-router", @@ -715,26 +703,14 @@ def register_slime_inference_engine( ) -@ext_handler( - "pythonext", - [ - "engines/list", - "pythonext/engines/list", - ], -) +@ext_handler("pythonext", "engines/list") def list_inference_engines() -> str: from probing.ext.engines import list_engines return json.dumps({"engines": [engine.to_dict() for engine in list_engines()]}) -@ext_handler( - "pythonext", - [ - "engines/scrape", - "pythonext/engines/scrape", - ], -) +@ext_handler("pythonext", "engines/scrape") def scrape_inference_engines(engine_id: Optional[str] = None) -> str: from probing.ext.engines import scrape_all, scrape_engine from probing.ext.engines.registry import get_engine @@ -747,13 +723,7 @@ def scrape_inference_engines(engine_id: Optional[str] = None) -> str: return json.dumps({"results": scrape_all()}) -@ext_handler( - "pythonext", - [ - "engines/snapshot", - "pythonext/engines/snapshot", - ], -) +@ext_handler("pythonext", "engines/snapshot") def inference_engine_snapshot(engine_id: Optional[str] = None) -> str: from probing.ext.engines import list_engines diff --git a/python/probing/profiling/collective/config.py b/python/probing/profiling/collective/config.py index d5759555..8979bb42 100644 --- a/python/probing/profiling/collective/config.py +++ b/python/probing/profiling/collective/config.py @@ -2,7 +2,6 @@ from __future__ import annotations -import logging import os from dataclasses import dataclass from typing import Optional @@ -13,8 +12,6 @@ from .record import CommRecordMode -logger = logging.getLogger(__name__) - def _parse_mode(raw: Optional[str]) -> CommRecordMode: if raw is None: @@ -58,25 +55,20 @@ def collective_tracing_enabled() -> bool: """Resolve whether Torch-side collective hooks should be installed. Policy: - 1. Explicit ``probing.torch.collective.enable`` always wins. - 2. If the NCCL profiler plugin is active, default **off** — the plugin's - ``nccl.*`` tables are the precise source; keeping both on would record - the same collectives twice with conflicting timing semantics. - 3. Otherwise, default on for multi-rank torch jobs (coarse fallback). + 1. Explicit ``probing.torch.collective.enable`` always wins + (``PROBING_TORCH_COLLECTIVE_ENABLE=1`` / ``SET …=1``). + 2. Otherwise **default off** — including multi-rank jobs — to avoid + silent Megatron / multi-process overhead. The NCCL profiler plugin + (``nccl.*``) remains the preferred precise source when configured; + enable Torch-API tracing only when you need ``python.comm_collective`` + / ``global_step`` context. """ explicit = parse_bool_flag( probing.config.get_str("probing.torch.collective.enable") ) if explicit is not None: return explicit - if nccl_profiler_plugin_active(): - logger.info( - "Torch-side collective tracing disabled: NCCL profiler plugin is " - "active (nccl.* tables). Set probing.torch.collective.enable=1 " - "to force both." - ) - return False - return is_distributed_torch_job() + return False @dataclass(frozen=True) diff --git a/python/probing/rl.py b/python/probing/rl.py index 750e4f12..bd91ea1c 100644 --- a/python/probing/rl.py +++ b/python/probing/rl.py @@ -76,7 +76,9 @@ def context(**attrs: Any): @contextmanager -def span(name: str, *, phase: Optional[str] = None, kind: str = "rl.phase", **attrs: Any): +def span( + name: str, *, phase: Optional[str] = None, kind: str = "rl.phase", **attrs: Any +): """Record an RL span with standard rollout/sample attributes.""" merged = merge_context(**attrs) @@ -124,7 +126,9 @@ def export_context(**attrs: Any) -> dict[str, Any]: return merge_context(**attrs) -def import_context(carrier: Optional[dict[str, Any]] = None, **attrs: Any) -> dict[str, Any]: +def import_context( + carrier: Optional[dict[str, Any]] = None, **attrs: Any +) -> dict[str, Any]: """Normalize a received carrier before using it with :func:`context`.""" merged = dict(carrier or {}) diff --git a/tests/ext/test_sglang_real_engine.py b/tests/ext/test_sglang_real_engine.py index 758b5b55..a0f7df21 100644 --- a/tests/ext/test_sglang_real_engine.py +++ b/tests/ext/test_sglang_real_engine.py @@ -41,7 +41,9 @@ def _cleanup_registry(): @pytest.mark.integration -@pytest.mark.skipif(not _engine_reachable(), reason=f"SGLang not reachable at {ENGINE_URL}") +@pytest.mark.skipif( + not _engine_reachable(), reason=f"SGLang not reachable at {ENGINE_URL}" +) def test_real_sglang_engine_metrics_scrape(): registration = register_engine( router_addr=ENGINE_URL, diff --git a/tests/regression/ext/README.md b/tests/regression/ext/README.md index 6dbcc1c7..457375cc 100644 --- a/tests/regression/ext/README.md +++ b/tests/regression/ext/README.md @@ -10,7 +10,8 @@ Contract + integration tests for Megatron-Core and vLLM / vLLM-Metal probing hoo | `_vllm_contract.py` | Helpers | Mock vLLM module tree (not collected) | | `test_megatron_contract.py` | Contract | Import hooks, role/step sync (mock, fast CI) | | `test_vllm_contract.py` | Contract | Import hooks, role/step sync (mock, fast CI) | -| `test_megatron_integration.py` | Integration | Real `megatron.core` via `torchrun` subprocess | +| `test_megatron_integration.py` | Integration | Real `megatron.core` via `torchrun` subprocess (CUDA) | +| `test_megatron_real_lm.py` | Integration (opt-in) | Official Megatron-LM + bottom fakes (`PROBING_MEGATRON_REAL_LM=1`) | | `test_vllm_integration.py` | Integration | Real `vllm` import hook + optional generate smoke | | `megatron_integration_worker.py` | Worker | Subprocess entry for Megatron integration | | `vllm_integration_worker.py` | Worker | Subprocess entry for vLLM integration | @@ -31,14 +32,30 @@ PROBING=1 pytest tests/regression/ext/test_vllm_contract.py \ PROBING=1 pytest -m integration tests/regression/ext/test_vllm_integration.py -q PROBING=1 pytest -m integration tests/regression/ext/test_megatron_integration.py -q -# Real vLLM generate smoke (opt-in; aligns with examples/run_vllm_soak.sh) +# Real vLLM generate smoke (opt-in; aligns with examples/inference/run_vllm_soak.sh) PROBING_VLLM_RUN_GENERATE=1 PROBING=1 pytest \ tests/regression/ext/test_vllm_integration.py::test_vllm_offline_generate_smoke_subprocess -q + +# Official Megatron-LM + bottom fakes (opt-in; default ../Megatron-LM or MEGATRON_LM=) +PROBING_MEGATRON_REAL_LM=1 PROBING=1 pytest -m integration \ + tests/regression/ext/test_megatron_real_lm.py -q ``` +## Megatron-LM checkout (real-LM path) + +| Item | Value | +|------|-------| +| Env | `MEGATRON_LM=/path/to/Megatron-LM` | +| Default | `/../Megatron-LM` (sibling) | +| Multi-version | **One checkout at a time** — switch by changing `MEGATRON_LM`; no in-process matrix | +| Smoke range | megatron-core **≥0.12.1, <0.21** (`MEGATRON_LM_ALLOW_ANY_VERSION=1` to override) | + +Unit tests for path/version: `tests/unit/probing/fakes/test_megatron_lm_env.py`. + ## Notes - **Contract tests** never import real `megatron.core` or `vllm`; they mock `sys.modules`. -- **Megatron integration** requires Linux + CUDA + `megatron-core`; skipped on macOS. +- **Megatron integration** (`test_megatron_integration.py`) requires Linux + CUDA + `megatron-core`; skipped on macOS. +- **Megatron real-LM** (`test_megatron_real_lm.py`) is opt-in (`PROBING_MEGATRON_REAL_LM=1`); uses bottom fakes and can run on macOS/CPU. - **vLLM generate integration** is opt-in (`PROBING_VLLM_RUN_GENERATE=1`) because it is slow and depends on aligned vllm / vllm-metal / mlx-lm versions. Import-hook wiring runs without that flag. diff --git a/tests/regression/ext/test_collective_autostart.py b/tests/regression/ext/test_collective_autostart.py index 32530af5..b085cad6 100644 --- a/tests/regression/ext/test_collective_autostart.py +++ b/tests/regression/ext/test_collective_autostart.py @@ -12,13 +12,13 @@ def test_single_process_job_disabled_by_default(monkeypatch): assert collective_tracing_enabled() is False -def test_torchrun_auto_enables(monkeypatch): +def test_torchrun_disabled_by_default(monkeypatch): monkeypatch.setenv("WORLD_SIZE", "8") assert is_distributed_torch_job() is True - assert collective_tracing_enabled() is True + assert collective_tracing_enabled() is False -def test_explicit_off_overrides_torchrun(monkeypatch): +def test_explicit_off_keeps_disabled(monkeypatch): import probing monkeypatch.setenv("WORLD_SIZE", "8") diff --git a/tests/regression/ext/test_comm_collective.py b/tests/regression/ext/test_comm_collective.py index c9467a15..80cf4f61 100644 --- a/tests/regression/ext/test_comm_collective.py +++ b/tests/regression/ext/test_comm_collective.py @@ -22,21 +22,21 @@ def _reset_tables(): yield -def test_tracing_yields_to_nccl_profiler_plugin(monkeypatch): - """Torch-side tracer must default OFF when the NCCL plugin is active.""" +def test_tracing_disabled_by_default_including_multirank(monkeypatch): + """Torch-side tracer defaults OFF; explicit enable still turns it on.""" import probing from probing.profiling.collective import config as cc monkeypatch.setenv("WORLD_SIZE", "8") monkeypatch.delenv("NCCL_PROFILER_PLUGIN", raising=False) monkeypatch.setattr(probing.config, "get_str", lambda key: None) - assert cc.collective_tracing_enabled() is True + assert cc.collective_tracing_enabled() is False monkeypatch.setenv("NCCL_PROFILER_PLUGIN", "/tmp/libprobing_nccl_profiler.so") assert cc.nccl_profiler_plugin_active() is True assert cc.collective_tracing_enabled() is False - # Explicit enable always wins over the plugin default. + # Explicit enable always wins over the default-off policy. monkeypatch.setattr( probing.config, "get_str", diff --git a/tests/regression/ext/test_megatron_real_lm.py b/tests/regression/ext/test_megatron_real_lm.py new file mode 100644 index 00000000..167d4be5 --- /dev/null +++ b/tests/regression/ext/test_megatron_real_lm.py @@ -0,0 +1,89 @@ +"""Opt-in: real Megatron-LM ``pretrain_gpt.py`` + bottom-layer fakes. + +Skipped unless a Megatron-LM checkout is ready (see +``probing.fakes.megatron_lm.resolve_megatron_lm_root``). + +Run:: + + # default sibling ../Megatron-LM + PROBING_MEGATRON_REAL_LM=1 PROBING=1 pytest -m integration \\ + tests/regression/ext/test_megatron_real_lm.py -q + + MEGATRON_LM=/path/to/Megatron-LM PROBING_MEGATRON_REAL_LM=1 \\ + pytest -m integration tests/regression/ext/test_megatron_real_lm.py -q +""" + +from __future__ import annotations + +import os +import subprocess +import sys +from pathlib import Path + +import pytest + +from probing.fakes.megatron_lm import resolve_megatron_lm_root, smoke_version_allowed + +_REPO_ROOT = Path(__file__).resolve().parents[3] +_RUNNER = _REPO_ROOT / "examples" / "megatron" / "run_megatron_lm_pretrain.py" + +pytestmark = [ + pytest.mark.integration, + pytest.mark.slow, +] + + +def _opt_in() -> bool: + return os.environ.get("PROBING_MEGATRON_REAL_LM", "").strip().lower() in { + "1", + "true", + "yes", + "on", + } + + +@pytest.fixture(scope="module") +def megatron_checkout(): + if not _opt_in(): + pytest.skip( + "set PROBING_MEGATRON_REAL_LM=1 to run official Megatron-LM smoke " + "(MEGATRON_LM or ../Megatron-LM)" + ) + co = resolve_megatron_lm_root() + if not co.ready: + pytest.skip(f"Megatron-LM not ready: {co.reason}") + allowed, why = smoke_version_allowed(co) + if not allowed: + pytest.skip(why) + return co + + +def test_real_megatron_lm_one_train_iter(megatron_checkout): + """One real train step via bottom fakes (cpu + fake process group).""" + env = { + **dict(os.environ), + "PROBING": os.environ.get("PROBING", "1"), + "MEGATRON_LM": str(megatron_checkout.root), + "PROBING_CRASH_NO_GRACE": "1", + "PROBING_CRASH": "0", + } + cmd = [ + sys.executable, + str(_RUNNER), + "--train-iters", + "1", + "--megatron-lm", + str(megatron_checkout.root), + ] + proc = subprocess.run( + cmd, + env=env, + capture_output=True, + text=True, + timeout=300, + cwd=str(_REPO_ROOT), + ) + out = (proc.stdout or "") + "\n" + (proc.stderr or "") + assert proc.returncode == 0, out + assert "Megatron-Core version" in out or "training ..." in out + assert "iteration" in out.lower() or "lm loss" in out.lower() diff --git a/tests/regression/training_observability/test_collective_policy.py b/tests/regression/training_observability/test_collective_policy.py index d9c87aca..149b366c 100644 --- a/tests/regression/training_observability/test_collective_policy.py +++ b/tests/regression/training_observability/test_collective_policy.py @@ -17,12 +17,12 @@ def test_single_process_job_disabled_by_default(self, monkeypatch): assert is_distributed_torch_job() is False assert collective_tracing_enabled() is False - def test_torchrun_auto_enables(self, monkeypatch): + def test_torchrun_disabled_by_default(self, monkeypatch): monkeypatch.setenv("WORLD_SIZE", "8") assert is_distributed_torch_job() is True - assert collective_tracing_enabled() is True + assert collective_tracing_enabled() is False - def test_explicit_off_overrides_torchrun(self, monkeypatch): + def test_explicit_off_keeps_disabled(self, monkeypatch): import probing monkeypatch.setenv("WORLD_SIZE", "8") diff --git a/tests/unit/probing/ext/test_slime.py b/tests/unit/probing/ext/test_slime.py index 821e2d2c..8eb91b71 100644 --- a/tests/unit/probing/ext/test_slime.py +++ b/tests/unit/probing/ext/test_slime.py @@ -49,7 +49,8 @@ def test_infer_role_from_slime_cmdline_markers(): slime.infer_role_from_cmdline("ray::RolloutManager.generate") == "rollout_actor" ) assert ( - slime.infer_role_from_cmdline("ray::MegatronTrainRayActor.train") == "train_actor" + slime.infer_role_from_cmdline("ray::MegatronTrainRayActor.train") + == "train_actor" ) assert slime.infer_role_from_cmdline("ray::SGLangEngine") == "inference_engine" assert slime.infer_role_from_cmdline("python train_async.py") == "driver" diff --git a/tests/unit/probing/fakes/test_fakes.py b/tests/unit/probing/fakes/test_fakes.py new file mode 100644 index 00000000..a7fcbe41 --- /dev/null +++ b/tests/unit/probing/fakes/test_fakes.py @@ -0,0 +1,284 @@ +"""Unit tests for probing.fakes (no real Megatron / CUDA).""" + +from __future__ import annotations + +import sys + +import pytest + +torch = pytest.importorskip("torch") + + +@pytest.fixture(autouse=True) +def _clean_fakes(): + from probing import fakes + from probing.ext import megatron as megatron_ext + from probing.fakes.journal import FakeEvent, begin_run + + megatron_ext._PARALLEL_STATE_INIT = False + megatron_ext._TRAINING_INIT = False + megatron_ext._LAST_ROLE = None + megatron_ext._LAST_ITERATION = None + if fakes.is_installed(): + fakes.uninstall() + try: + FakeEvent.drop() + except Exception: + pass + try: + FakeEvent.init_table() + except Exception: + pass + begin_run("test-clean") + yield + if fakes.is_installed(): + fakes.uninstall() + megatron_ext._PARALLEL_STATE_INIT = False + megatron_ext._TRAINING_INIT = False + + +def test_device_remap_cuda_to_meta(): + from probing.fakes import install, uninstall, target_device + + install(specs=("megatron",), device="meta") + assert target_device() == "meta" + assert torch.cuda.is_available() is True + + t = torch.zeros(4, device="cuda") + assert t.device.type == "meta" + + m = torch.nn.Linear(3, 2).cuda() + assert next(m.parameters()).device.type == "meta" + + uninstall() + # After uninstall, cuda availability is whatever the host reports. + assert callable(torch.cuda.is_available) + + +def test_megatron_import_via_finder(monkeypatch): + monkeypatch.delenv("PROBING_FAKES", raising=False) + from probing.fakes import install + + # force=True: this machine may have a broken megatron-core (no triton). + install(specs=("megatron",), remap_device=False, force=True) + + from megatron.core import parallel_state + from megatron.training.training import train_step + + assert getattr(parallel_state, "__probing_fake__", False) is True + assert parallel_state.model_parallel_is_initialized() is True + assert train_step() == {"loss": 1.0} + + +def test_skip_real_package(monkeypatch): + """Finder must not shadow an already-importable real top-level package.""" + import types + + from probing.fakes.finder import FakeFinder, install_finder, uninstall_finder + from probing.fakes import registry + + # Use a throwaway prefix that we make "real" via a custom finder underneath. + real = types.ModuleType("probing_fakes_real_sentinel") + real.__probing_fake__ = False # type: ignore[attr-defined] + sys.modules["probing_fakes_real_sentinel"] = real + + def factory(fullname: str) -> types.ModuleType: + mod = types.ModuleType(fullname) + mod.__probing_fake__ = True # type: ignore[attr-defined] + return mod + + registry.register( + registry.FakeSpec( + name="probing_fakes_real_sentinel", + prefixes=("probing_fakes_real_sentinel",), + factory=factory, + ) + ) + registry.enable({"probing_fakes_real_sentinel"}) + install_finder() + try: + import probing_fakes_real_sentinel as mod + + assert getattr(mod, "__probing_fake__", False) is False + finally: + uninstall_finder() + registry.disable_all() + sys.modules.pop("probing_fakes_real_sentinel", None) + registry._SPECS.pop("probing_fakes_real_sentinel", None) + + +def test_scripted_loop_syncs_role_and_step(monkeypatch): + import probing + from probing.fakes import run_scripted_loop + + monkeypatch.setenv("PROBING_MEGATRON", "on") + monkeypatch.setenv("PROBING_MEGATRON_STEP_SYNC", "on") + probing.step(0, micro_batches=1) + + result = run_scripted_loop( + steps=3, tp=2, pp=1, dp=3, micro_batches=2, device="meta" + ) + assert result.device == "meta" + assert result.role == "dp=3,pp=1,tp=2" + assert result.last_iteration == 2 + # sync uses micro_step = iteration * micro_batches → local_step == iteration + assert probing.step.local_step == 2 + assert int(probing.step.snapshot().micro_batches) == 2 + + +def test_pretrain_gpt_entry(monkeypatch): + import probing + from pathlib import Path + + monkeypatch.setenv("PROBING_MEGATRON", "on") + monkeypatch.setenv("PROBING_MEGATRON_STEP_SYNC", "on") + probing.step(0, micro_batches=1) + + # Import the example module as a library and call main(). + import runpy + + script = ( + Path(__file__).resolve().parents[4] + / "examples" + / "megatron" + / "pretrain_gpt.py" + ) + assert script.is_file() + ns = runpy.run_path(str(script), run_name="not_main") + rc = ns["main"]( + [ + "--train-iters", + "3", + "--hidden-size", + "32", + "--vocab-size", + "128", + ] + ) + assert rc == 0 + assert probing.step.local_step == 2 + + +def test_maybe_install_from_env(monkeypatch): + from probing import fakes + + monkeypatch.setenv("PROBING_FAKES", "megatron") + monkeypatch.setenv("PROBING_FAKE_DEVICE", "cpu") + assert fakes.maybe_install_from_env() is True + assert fakes.is_installed() + assert fakes.target_device() == "cpu" + + +def test_fake_event_correlates_with_probing_step(monkeypatch): + import dataclasses + + import probing + from probing.fakes import ( + FakeEvent, + current_run_id, + install, + run_scripted_loop, + verify_against_probing, + ) + + monkeypatch.setenv("PROBING_MEGATRON", "on") + monkeypatch.setenv("PROBING_MEGATRON_STEP_SYNC", "on") + probing.step(0, micro_batches=1) + FakeEvent.init_table() + + install(force=True, device="meta") + rid = current_run_id() + run_scripted_loop(steps=3, tp=1, pp=0, dp=0, micro_batches=2, device="meta") + + raw = FakeEvent.take(200) + fields = [f.name for f in dataclasses.fields(FakeEvent)] + rows = [dict(zip(fields, data)) for _ts, data in raw] + train_rows = [ + r for r in rows if r["kind"] == "train_step" and r.get("run_id") == rid + ] + assert len(train_rows) == 3 + + report = verify_against_probing( + require_train_steps=3, check_collectives=False, run_id=rid + ) + assert report.ok, report.issues + + +def test_dist_hooks_dual_write_collective(monkeypatch): + import dataclasses + + from probing.fakes import FakeEvent, current_run_id, install, verify_against_probing + from probing.fakes.torch_hooks import install_torch_dist_hooks + from probing.profiling.collective.record import CommCollective + + install(force=True, device="meta", specs=("megatron",)) + rid = current_run_id() + assert install_torch_dist_hooks() is True + + FakeEvent.init_table() + CommCollective.init_table() + + import torch + import torch.distributed as dist + + t = torch.zeros(8, device="cuda") + dist.all_reduce(t) # not initialized → simulated + + fake_rows = [ + dict(zip([f.name for f in dataclasses.fields(FakeEvent)], data)) + for _ts, data in FakeEvent.take(50) + ] + assert any( + r["kind"] == "collective" + and r["name"] == "all_reduce" + and r.get("run_id") == rid + for r in fake_rows + ) + + comm_rows = [ + dict(zip([f.name for f in dataclasses.fields(CommCollective)], data)) + for _ts, data in CommCollective.take(50) + ] + assert any(r["op"] == "all_reduce" for r in comm_rows) + + report = verify_against_probing( + check_step_alignment=False, check_collectives=True, run_id=rid + ) + assert report.ok, report.issues + + +def test_device_remap_int_index_is_cuda_ordinal(): + """``torch.cuda.current_device()`` returns an int — factories must remap it.""" + from probing.fakes import install, uninstall + + install(specs=("triton",), device="cpu") + try: + t = torch.zeros(2, device=torch.cuda.current_device()) + assert t.device.type == "cpu" + assert torch.cuda.Stream().device.type == "cpu" + finally: + uninstall() + + +def test_helpers_cpp_fallback_build_sample_idx(): + from probing.fakes.helpers_cpp import build_sample_idx_int32 + import numpy as np + + sizes = np.array([64, 64], dtype=np.int32) + docs = np.array([0, 1, 0], dtype=np.int32) + idx = build_sample_idx_int32(sizes, docs, 32, 1, 128, True, 1) + assert idx.ndim == 2 and idx.shape[1] == 2 + assert idx.shape[0] >= 2 + + +def test_merge_argv_overrides_valued_flags(): + from probing.fakes.megatron_lm import _merge_argv + + merged = _merge_argv( + ["--train-iters", "2", "--mock-data"], + ["--train-iters", "5", "--transformer-impl", "local"], + ) + assert merged[merged.index("--train-iters") + 1] == "5" + assert "--transformer-impl" in merged + assert merged[merged.index("--transformer-impl") + 1] == "local" + assert "--mock-data" in merged diff --git a/tests/unit/probing/fakes/test_megatron_lm_env.py b/tests/unit/probing/fakes/test_megatron_lm_env.py new file mode 100644 index 00000000..070419f9 --- /dev/null +++ b/tests/unit/probing/fakes/test_megatron_lm_env.py @@ -0,0 +1,131 @@ +"""Unit tests for Megatron-LM path / version resolution (no real training).""" + +from __future__ import annotations + +from pathlib import Path + + +def _fake_checkout(tmp_path: Path, *, major: int, minor: int, patch: int = 0) -> Path: + root = tmp_path / f"Megatron-LM-{major}.{minor}.{patch}" + (root / "megatron" / "core").mkdir(parents=True) + (root / "pretrain_gpt.py").write_text("# stub\n", encoding="utf-8") + (root / "megatron" / "core" / "package_info.py").write_text( + f"MAJOR = {major}\nMINOR = {minor}\nPATCH = {patch}\nPRE_RELEASE = ''\n", + encoding="utf-8", + ) + return root + + +def test_sibling_default_under_probing_parent(): + from probing.fakes.megatron_lm import probing_repo_root, sibling_megatron_lm_root + + repo = probing_repo_root() + assert (repo / "python" / "probing" / "fakes").is_dir() + assert (repo / "pyproject.toml").is_file() + assert sibling_megatron_lm_root() == (repo.parent / "Megatron-LM").resolve() + + +def test_is_probing_repo_marker(tmp_path): + from probing.fakes.megatron_lm import _is_probing_repo + + assert _is_probing_repo(tmp_path) is False + (tmp_path / "pyproject.toml").write_text("[project]\nname='x'\n", encoding="utf-8") + assert _is_probing_repo(tmp_path) is False + (tmp_path / "python" / "probing").mkdir(parents=True) + assert _is_probing_repo(tmp_path) is True + + +def test_resolve_priority_explicit_over_env(tmp_path, monkeypatch): + from probing.fakes.megatron_lm import resolve_megatron_lm_root + + a = _fake_checkout(tmp_path, major=0, minor=18) + b = _fake_checkout(tmp_path, major=0, minor=19) + monkeypatch.setenv("MEGATRON_LM", str(a)) + + via_env = resolve_megatron_lm_root() + assert via_env.root == a.resolve() + assert via_env.source == "env" + assert via_env.ready is True + assert via_env.version == (0, 18, 0) + + via_explicit = resolve_megatron_lm_root(b) + assert via_explicit.root == b.resolve() + assert via_explicit.source == "explicit" + assert via_explicit.version == (0, 19, 0) + + +def test_resolve_switches_between_two_versions(tmp_path, monkeypatch): + """Multi-version = point MEGATRON_LM at another tree; no in-process matrix.""" + from probing.fakes.megatron_lm import resolve_megatron_lm_root + + v18 = _fake_checkout(tmp_path, major=0, minor=18) + v19 = _fake_checkout(tmp_path, major=0, minor=19) + + monkeypatch.setenv("MEGATRON_LM", str(v18)) + assert resolve_megatron_lm_root().version_text == "0.18.0" + + monkeypatch.setenv("MEGATRON_LM", str(v19)) + assert resolve_megatron_lm_root().version_text == "0.19.0" + + +def test_missing_checkout_not_ready(tmp_path, monkeypatch): + from probing.fakes.megatron_lm import resolve_megatron_lm_root + + missing = tmp_path / "nope" + monkeypatch.setenv("MEGATRON_LM", str(missing)) + co = resolve_megatron_lm_root() + assert co.ready is False + assert "missing" in co.reason + + +def test_incomplete_tree_not_ready(tmp_path, monkeypatch): + from probing.fakes.megatron_lm import resolve_megatron_lm_root + + root = tmp_path / "half" + root.mkdir() + (root / "pretrain_gpt.py").write_text("#\n", encoding="utf-8") + monkeypatch.setenv("MEGATRON_LM", str(root)) + co = resolve_megatron_lm_root() + assert co.ready is False + assert "not a Megatron-LM tree" in co.reason + + +def test_smoke_version_gate(tmp_path, monkeypatch): + from probing.fakes.megatron_lm import ( + resolve_megatron_lm_root, + smoke_version_allowed, + version_in_smoke_range, + ) + + assert version_in_smoke_range((0, 12, 1)) is True + assert version_in_smoke_range((0, 12, 0)) is False + assert version_in_smoke_range((0, 19, 0)) is True + assert version_in_smoke_range((0, 11, 9)) is False + assert version_in_smoke_range((0, 21, 0)) is False + + old = _fake_checkout(tmp_path, major=0, minor=12, patch=0) + monkeypatch.setenv("MEGATRON_LM", str(old)) + monkeypatch.delenv("MEGATRON_LM_ALLOW_ANY_VERSION", raising=False) + co = resolve_megatron_lm_root() + ok, why = smoke_version_allowed(co) + assert ok is False + assert "outside smoke range" in why + + monkeypatch.setenv("MEGATRON_LM_ALLOW_ANY_VERSION", "1") + ok2, why2 = smoke_version_allowed(co) + assert ok2 is True + assert why2 == "MEGATRON_LM_ALLOW_ANY_VERSION" + + +def test_read_version_without_importing_megatron(tmp_path, monkeypatch): + import sys + + from probing.fakes.megatron_lm import read_megatron_core_version + + root = _fake_checkout(tmp_path, major=0, minor=19, patch=1) + before = {k for k in sys.modules if k == "megatron" or k.startswith("megatron.")} + ver, text = read_megatron_core_version(root) + after = {k for k in sys.modules if k == "megatron" or k.startswith("megatron.")} + assert ver == (0, 19, 1) + assert text == "0.19.1" + assert after == before diff --git a/tests/unit/probing/test_entrypoint.py b/tests/unit/probing/test_entrypoint.py index f8b84ac6..8d972529 100644 --- a/tests/unit/probing/test_entrypoint.py +++ b/tests/unit/probing/test_entrypoint.py @@ -15,10 +15,14 @@ (["python", "-m", "torch.distributed.run", "--standalone"], {}, True), (["-m", "--help"], {}, True), (["/usr/bin/torchrun", "train.py"], {}, True), - (["python", "examples/imagenet_with_span.py"], {"RANK": "0"}, False), - (["python", "examples/imagenet_with_span.py"], {"LOCAL_RANK": "1"}, False), + (["python", "examples/imagenet/imagenet_with_span.py"], {"RANK": "0"}, False), + ( + ["python", "examples/imagenet/imagenet_with_span.py"], + {"LOCAL_RANK": "1"}, + False, + ), (["python", "-m", "torch.distributed.run"], {"TORCHELASTIC_RUN_ID": "x"}, True), - (["python", "examples/tracing.py"], {}, False), + (["python", "examples/getting-started/tracing.py"], {}, False), (["-m", "probing.skills"], {}, False), ], ) diff --git a/web/src/api/rl.rs b/web/src/api/rl.rs index 7f25230b..2e60dcc7 100644 --- a/web/src/api/rl.rs +++ b/web/src/api/rl.rs @@ -17,7 +17,10 @@ pub struct TraceProcessInfo { /// RL-specific tracing API (multi-process fan-out, rollout filters). impl ApiClient { /// Get all trace events for spans tagged with a rollout_id. - pub async fn get_trace_events_for_rollout_id(&self, rollout_id: &str) -> Result> { + pub async fn get_trace_events_for_rollout_id( + &self, + rollout_id: &str, + ) -> Result> { let span_ids = self.get_span_ids_for_rollout_id(rollout_id).await?; if span_ids.is_empty() { return Ok(Vec::new()); @@ -232,15 +235,17 @@ fn span_ids_from_df(df: DataFrame) -> Vec { let span_id_idx = df.names.iter().position(|c| c == "span_id").unwrap_or(0); let nrows = df.cols.iter().map(|col| col.len()).max().unwrap_or(0); (0..nrows) - .filter_map(|row_idx| match df.cols.get(span_id_idx).map(|col| col.get(row_idx)) { - Some(Ele::I64(value)) => Some(value), - Some(Ele::I32(value)) => Some(value as i64), - Some(Ele::F32(value)) => Some(value as i64), - Some(Ele::F64(value)) => Some(value as i64), - Some(Ele::Text(value)) | Some(Ele::Url(value)) => value.parse::().ok(), - Some(Ele::DataTime(value)) => i64::try_from(value).ok(), - _ => None, - }) + .filter_map( + |row_idx| match df.cols.get(span_id_idx).map(|col| col.get(row_idx)) { + Some(Ele::I64(value)) => Some(value), + Some(Ele::I32(value)) => Some(value as i64), + Some(Ele::F32(value)) => Some(value as i64), + Some(Ele::F64(value)) => Some(value as i64), + Some(Ele::Text(value)) | Some(Ele::Url(value)) => value.parse::().ok(), + Some(Ele::DataTime(value)) => i64::try_from(value).ok(), + _ => None, + }, + ) .collect() } @@ -251,7 +256,11 @@ fn trace_events_from_df(df: DataFrame) -> Vec { return events; } - let record_type_idx = df.names.iter().position(|c| c == "record_type").unwrap_or(0); + let record_type_idx = df + .names + .iter() + .position(|c| c == "record_type") + .unwrap_or(0); let trace_id_idx = df.names.iter().position(|c| c == "trace_id").unwrap_or(1); let span_id_idx = df.names.iter().position(|c| c == "span_id").unwrap_or(2); let parent_id_idx = df.names.iter().position(|c| c == "parent_id").unwrap_or(3); @@ -335,10 +344,26 @@ fn trace_processes_from_df(df: DataFrame) -> Vec { let pid_idx = df.names.iter().position(|c| c == "pid").unwrap_or(0); let hostname_idx = df.names.iter().position(|c| c == "hostname").unwrap_or(1); - let worker_idx = df.names.iter().position(|c| c == "ray_worker_id").unwrap_or(2); - let actor_idx = df.names.iter().position(|c| c == "ray_actor_id").unwrap_or(3); - let actor_name_idx = df.names.iter().position(|c| c == "ray_actor_name").unwrap_or(4); - let role_idx = df.names.iter().position(|c| c == "process_role").unwrap_or(5); + let worker_idx = df + .names + .iter() + .position(|c| c == "ray_worker_id") + .unwrap_or(2); + let actor_idx = df + .names + .iter() + .position(|c| c == "ray_actor_id") + .unwrap_or(3); + let actor_name_idx = df + .names + .iter() + .position(|c| c == "ray_actor_name") + .unwrap_or(4); + let role_idx = df + .names + .iter() + .position(|c| c == "process_role") + .unwrap_or(5); let nrows = df.cols.iter().map(|col| col.len()).max().unwrap_or(0); let mut seen = std::collections::HashSet::::new(); @@ -424,7 +449,10 @@ fn build_span_tree_from_events(mut events: Vec) -> Vec { for event in &events { if event.record_type == "span_start" { let process_pid = trace_event_process_pid(event); - span_process_lookup.insert((event.span_id, event.thread_id, event.trace_id), process_pid); + span_process_lookup.insert( + (event.span_id, event.thread_id, event.trace_id), + process_pid, + ); let span_key = (process_pid, event.span_id); let span = SpanInfo { span_id: event.span_id, @@ -498,7 +526,7 @@ fn build_span_tree_from_events(mut events: Vec) -> Vec { .keys() .map(|&key| (key, depth_map.get(&key).copied().unwrap_or(0))) .collect(); - spans_to_process.sort_by(|a, b| b.1.cmp(&a.1)); + spans_to_process.sort_by_key(|b| std::cmp::Reverse(b.1)); for (span_key, _depth) in spans_to_process { let parent_key = span_map @@ -604,9 +632,7 @@ pub struct EngineListResponse { impl ApiClient { pub async fn fetch_inference_engines(&self) -> Result { - let response = self - .get_request("/apis/pythonext/engines/snapshot") - .await?; + let response = self.get_request("/apis/pythonext/engines/snapshot").await?; Self::parse_json(&response) } @@ -623,14 +649,4 @@ impl ApiClient { )) .await } - - pub async fn fetch_inference_engine_raw_metrics(&self, limit: i64) -> Result { - self.execute_query(&format!( - "SELECT timestamp_ns, engine_id, engine_type, metric_name, metric_value, labels \ - FROM python.inference_engine_metric \ - WHERE metric_name NOT LIKE 'normalized.%' \ - ORDER BY timestamp_ns DESC LIMIT {limit}" - )) - .await - } } diff --git a/web/src/components/overhead/panel.rs b/web/src/components/overhead/panel.rs index 0bbbbb2b..a97774d4 100644 --- a/web/src/components/overhead/panel.rs +++ b/web/src/components/overhead/panel.rs @@ -458,7 +458,7 @@ fn nccl_footnote(nccl: &Result) -> Element { p { class: "text-xs text-amber-800 bg-amber-50 border border-amber-200 rounded-md px-3 py-2", "NCCL profiler health: pool_exhausted={pool_exhausted}, write_errors={write_errors}. " "NCCL has no in-run shadow baseline — offline: " - code { class: "font-mono", "examples/run_nccl_profiler_bench.sh" } + code { class: "font-mono", "examples/overhead/run_nccl_bench.sh" } } } } else { diff --git a/web/src/components/rl/metrics_line_chart.rs b/web/src/components/rl/metrics_line_chart.rs index a05e232f..aa9c2132 100644 --- a/web/src/components/rl/metrics_line_chart.rs +++ b/web/src/components/rl/metrics_line_chart.rs @@ -170,7 +170,11 @@ fn bounds(series: &[ChartSeries]) -> (f64, f64, f64, f64) { } if y_min == y_max { - let pad = if y_min.abs() > 1.0 { y_min.abs() * 0.1 } else { 1.0 }; + let pad = if y_min.abs() > 1.0 { + y_min.abs() * 0.1 + } else { + 1.0 + }; y_min -= pad; y_max += pad; } else { @@ -188,7 +192,12 @@ fn y_axis_ticks(y_min: f64, y_max: f64) -> Vec { .collect() } -fn x_axis_labels(_series: &[ChartSeries], x_min: f64, x_max: f64, count: usize) -> Vec<(String, f64)> { +fn x_axis_labels( + _series: &[ChartSeries], + x_min: f64, + x_max: f64, + count: usize, +) -> Vec<(String, f64)> { if count <= 1 { return vec![(format_time_ms(x_min), x_min)]; } diff --git a/web/src/components/rl/mod.rs b/web/src/components/rl/mod.rs index 5661d103..8d3bb7af 100644 --- a/web/src/components/rl/mod.rs +++ b/web/src/components/rl/mod.rs @@ -1,5 +1,3 @@ //! RL / agentic training UI helpers. pub mod metrics_line_chart; - -pub use metrics_line_chart::{ChartSeries, MetricsLineChart}; diff --git a/web/src/pages/rl/inference.rs b/web/src/pages/rl/inference.rs index 0bcd0cac..59b20fac 100644 --- a/web/src/pages/rl/inference.rs +++ b/web/src/pages/rl/inference.rs @@ -3,12 +3,12 @@ use std::collections::HashMap; use dioxus::prelude::*; use probing_proto::prelude::{DataFrame, Ele}; -use crate::api::EngineInfo; use crate::api::ApiClient; +use crate::api::EngineInfo; use crate::components::card::Card; use crate::components::common::{EmptyState, ErrorState, LoadingState}; -use crate::components::rl::metrics_line_chart::{ChartSeries, MetricsLineChart}; use crate::components::page::{PageContainer, PageTitle}; +use crate::components::rl::metrics_line_chart::{ChartSeries, MetricsLineChart}; use crate::hooks::use_api; const REFRESH_MS: u32 = 5000; @@ -32,15 +32,20 @@ const SERIES_COLORS: [&str; 6] = [ pub fn Inference() -> Element { let mut refresh_tick = use_signal(|| 0u64); let engines = use_api({ - let refresh_tick = refresh_tick.clone(); + let refresh_tick = refresh_tick; move || { let _ = *refresh_tick.read(); let client = ApiClient::new(); - async move { client.fetch_inference_engines().await.map(|resp| resp.engines) } + async move { + client + .fetch_inference_engines() + .await + .map(|resp| resp.engines) + } } }); let metrics = use_api({ - let refresh_tick = refresh_tick.clone(); + let refresh_tick = refresh_tick; move || { let _ = *refresh_tick.read(); let client = ApiClient::new(); @@ -124,6 +129,7 @@ fn engines_panel(state: &crate::hooks::ApiState>) -> Element { th { class: "py-2 pr-4", "Engine" } th { class: "py-2 pr-4", "Type" } th { class: "py-2 pr-4", "Framework" } + th { class: "py-2 pr-4", "Router" } th { class: "py-2 pr-4", "Metrics URL" } th { class: "py-2 pr-4", "Status" } } @@ -134,6 +140,7 @@ fn engines_panel(state: &crate::hooks::ApiState>) -> Element { td { class: "py-2 pr-4 font-medium", "{engine.engine_id}" } td { class: "py-2 pr-4", "{engine.engine_type}" } td { class: "py-2 pr-4", "{engine.framework}" } + td { class: "py-2 pr-4 font-mono text-xs break-all", "{engine.router_addr}" } td { class: "py-2 pr-4 font-mono text-xs break-all", "{engine.metrics_url}" } td { class: "py-2 pr-4", span { @@ -253,12 +260,12 @@ fn group_metric_rows(df: &DataFrame) -> HashMap<(String, String), Vec<(f64, f64) let name_idx = col_idx(df, "metric_name"); let value_idx = col_idx(df, "metric_value"); - let Some((ts_idx, engine_idx, name_idx, value_idx)) = ( - match (ts_idx, engine_idx, name_idx, value_idx) { + let Some((ts_idx, engine_idx, name_idx, value_idx)) = + (match (ts_idx, engine_idx, name_idx, value_idx) { (Some(a), Some(b), Some(c), Some(d)) => Some((a, b, c, d)), _ => None, - } - ) else { + }) + else { return HashMap::new(); }; @@ -314,16 +321,15 @@ fn build_chart_series( .map(|points| ChartSeries { label: engine_id.clone(), points: points.clone(), - color: engine_colors - .get(&engine_id) - .copied() - .unwrap_or("#64748b"), + color: engine_colors.get(&engine_id).copied().unwrap_or("#64748b"), }) }) .collect() } -fn engine_color_map(grouped: &HashMap<(String, String), Vec<(f64, f64)>>) -> HashMap { +fn engine_color_map( + grouped: &HashMap<(String, String), Vec<(f64, f64)>>, +) -> HashMap { let mut engines: Vec = grouped .keys() .map(|(_, engine_id)| engine_id.clone()) @@ -334,12 +340,7 @@ fn engine_color_map(grouped: &HashMap<(String, String), Vec<(f64, f64)>>) -> Has engines .into_iter() .enumerate() - .map(|(idx, engine_id)| { - ( - engine_id, - SERIES_COLORS[idx % SERIES_COLORS.len()], - ) - }) + .map(|(idx, engine_id)| (engine_id, SERIES_COLORS[idx % SERIES_COLORS.len()])) .collect() } @@ -349,7 +350,10 @@ fn dedupe_time_points(points: &mut Vec<(f64, f64)>) { } let mut deduped: Vec<(f64, f64)> = Vec::with_capacity(points.len()); for (ts, value) in points.drain(..) { - if deduped.last().map(|(last_ts, _)| (*last_ts - ts).abs() < f64::EPSILON) == Some(true) + if deduped + .last() + .map(|(last_ts, _)| (*last_ts - ts).abs() < f64::EPSILON) + == Some(true) { if let Some(last) = deduped.last_mut() { last.1 = value; @@ -451,10 +455,7 @@ mod tests { let grouped = group_metric_rows(&df); assert_eq!(grouped.len(), 1); let points = grouped - .get(&( - "normalized.inflight_requests".to_string(), - "0".to_string(), - )) + .get(&("normalized.inflight_requests".to_string(), "0".to_string())) .expect("series"); assert_eq!(points.len(), 2); assert_eq!(points[0].1, 0.0); diff --git a/web/src/pages/rl/mod.rs b/web/src/pages/rl/mod.rs index 86699b2a..573ad840 100644 --- a/web/src/pages/rl/mod.rs +++ b/web/src/pages/rl/mod.rs @@ -1,21 +1,21 @@ use dioxus::prelude::*; use dioxus_router::use_navigator; +use crate::api::{ApiClient, EventInfo, SpanInfo, TraceProcessInfo}; use crate::app::Route; use crate::components::card::Card; use crate::components::colors::colors; +use crate::components::common::{ErrorState, LoadingState}; use crate::components::page::{PageContainer, PageTitle}; -use crate::components::common::{LoadingState, ErrorState}; use crate::hooks::use_api_simple; -use crate::api::{ApiClient, SpanInfo, EventInfo, TraceProcessInfo}; use crate::rl_contract::{ - self, is_rollout_submit_parent_span, - is_step_parent_span, is_train_timeline_span, is_rollout_worker_role, logical_step_key, - LogicalStepKey, ROLLOUT_TIMELINE_EMPTY_HINT, TRAIN_TIMELINE_EMPTY_HINT, + self, has_trajectory_identity, is_rollout_submit_parent_span, is_rollout_worker_role, + is_step_parent_span, is_train_timeline_span, logical_step_key, LogicalStepKey, + ROLLOUT_TIMELINE_EMPTY_HINT, TRAIN_TIMELINE_EMPTY_HINT, }; use crate::state::rl::{ - estimate_detail_panel_height, ROLLOUT_FILTER, ROLLOUT_FILTER_INPUT, RL_DETAIL_PANEL_HEIGHT, - RL_DETAIL_PANEL_HEIGHT_DEFAULT, RL_DETAIL_PANEL_HEIGHT_MAX, RL_DETAIL_PANEL_HEIGHT_MIN, + estimate_detail_panel_height, RL_DETAIL_PANEL_HEIGHT, RL_DETAIL_PANEL_HEIGHT_DEFAULT, + RL_DETAIL_PANEL_HEIGHT_MAX, RL_DETAIL_PANEL_HEIGHT_MIN, ROLLOUT_FILTER, ROLLOUT_FILTER_INPUT, }; use crate::utils::tracing_viewer; use std::collections::{HashMap, HashSet}; @@ -85,7 +85,7 @@ pub fn RlObservability(view: RlViewMode) -> Element { let is_perfetto = view == RlViewMode::Perfetto; let limit = use_signal(|| if is_perfetto { 2000 } else { 400 }); let timeline_depth = use_signal(|| 2usize); - let selected_batch_key = use_signal(|| String::new()); + let selected_batch_key = use_signal(String::new); let process_filter = use_signal(|| { if is_perfetto { "all".to_string() @@ -93,8 +93,8 @@ pub fn RlObservability(view: RlViewMode) -> Element { "driver".to_string() } }); - let function_filter = use_signal(|| String::new()); - let discovered_processes = use_signal(|| Vec::::new()); + let function_filter = use_signal(String::new); + let discovered_processes = use_signal(Vec::::new); let state = use_api_simple::>(); let navigator = use_navigator(); let view_key = view.internal_key(); @@ -103,23 +103,19 @@ pub fn RlObservability(view: RlViewMode) -> Element { let uses_rollout_filter = view.uses_rollout_filter(); // Create dependency, recalculate when limit or rollout filter changes. - let data_query = use_memo({ - let limit = limit.clone(); - move || { - let rollout_id = if uses_rollout_filter { - ROLLOUT_FILTER.read().trim().to_string() - } else { - String::new() - }; - (*limit.read(), rollout_id) - } + let data_query = use_memo(move || { + let rollout_id = if uses_rollout_filter { + ROLLOUT_FILTER.read().trim().to_string() + } else { + String::new() + }; + (*limit.read(), rollout_id) }); // Refetch data when limit or rollout filter changes. use_effect({ - let data_query = data_query.clone(); let mut loading = state.loading; let mut data = state.data; - let mut discovered_processes = discovered_processes.clone(); + let mut discovered_processes = discovered_processes; move || { let (limit_val, rollout_id) = data_query.read().clone(); spawn(async move { @@ -137,7 +133,10 @@ pub fn RlObservability(view: RlViewMode) -> Element { if local_pids.contains(&process.pid) { continue; } - if let Ok(mut process_spans) = client.get_span_tree_for_pid(process.pid, Some(fetch_limit)).await { + if let Ok(mut process_spans) = client + .get_span_tree_for_pid(process.pid, Some(fetch_limit)) + .await + { spans.append(&mut process_spans); } } @@ -149,7 +148,10 @@ pub fn RlObservability(view: RlViewMode) -> Element { if local_pids.contains(&process.pid) { continue; } - if let Ok(mut process_spans) = client.get_span_tree_for_pid_and_rollout_id(process.pid, &rollout_id).await { + if let Ok(mut process_spans) = client + .get_span_tree_for_pid_and_rollout_id(process.pid, &rollout_id) + .await + { spans.append(&mut process_spans); } } @@ -248,9 +250,9 @@ pub fn RlObservability(view: RlViewMode) -> Element { button { class: format!("rounded px-3 py-1.5 text-sm bg-{} text-white", colors::PRIMARY), onclick: { - let mut selected_batch_key = selected_batch_key.clone(); - let mut process_filter = process_filter.clone(); - let nav = navigator.clone(); + let mut selected_batch_key = selected_batch_key; + let mut process_filter = process_filter; + let nav = navigator; move |_| { *ROLLOUT_FILTER.write() = ROLLOUT_FILTER_INPUT.read().trim().to_string(); @@ -264,7 +266,7 @@ pub fn RlObservability(view: RlViewMode) -> Element { button { class: "rounded bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100", onclick: { - let mut selected_batch_key = selected_batch_key.clone(); + let mut selected_batch_key = selected_batch_key; move |_| { *ROLLOUT_FILTER_INPUT.write() = String::new(); *ROLLOUT_FILTER.write() = String::new(); @@ -302,7 +304,7 @@ pub fn RlObservability(view: RlViewMode) -> Element { value: "{*limit.read()}", class: "w-full", oninput: { - let mut limit = limit.clone(); + let mut limit = limit; move |ev| { if let Ok(val) = ev.value().parse::() { *limit.write() = val; @@ -380,8 +382,8 @@ pub fn RlObservability(view: RlViewMode) -> Element { class: "max-w-[360px] rounded border border-gray-200 bg-white px-2 py-1 text-sm", value: "{selected_process_filter}", oninput: { - let mut process_filter = process_filter.clone(); - let mut selected_batch_key = selected_batch_key.clone(); + let mut process_filter = process_filter; + let mut selected_batch_key = selected_batch_key; move |ev| { *process_filter.write() = ev.value(); *selected_batch_key.write() = String::new(); @@ -404,8 +406,8 @@ pub fn RlObservability(view: RlViewMode) -> Element { class: "max-w-[360px] rounded border border-gray-200 bg-white px-2 py-1 text-sm", value: "{selected_function_filter}", oninput: { - let mut function_filter = function_filter.clone(); - let mut selected_batch_key = selected_batch_key.clone(); + let mut function_filter = function_filter; + let mut selected_batch_key = selected_batch_key; move |ev| { *function_filter.write() = ev.value(); *selected_batch_key.write() = String::new(); @@ -446,7 +448,7 @@ pub fn RlObservability(view: RlViewMode) -> Element { class: "rounded border border-gray-200 bg-white px-2 py-1 text-sm", value: "{depth_value}", oninput: { - let mut timeline_depth = timeline_depth.clone(); + let mut timeline_depth = timeline_depth; move |ev| { if let Ok(val) = ev.value().parse::() { *timeline_depth.write() = val; @@ -466,7 +468,7 @@ pub fn RlObservability(view: RlViewMode) -> Element { class: "max-w-[320px] rounded border border-gray-200 bg-white px-2 py-1 text-sm", value: "{selected_batch_key_for_view}", oninput: { - let mut selected_batch_key = selected_batch_key.clone(); + let mut selected_batch_key = selected_batch_key; move |ev| *selected_batch_key.write() = ev.value() }, option { value: "", "All batches" } @@ -556,7 +558,8 @@ struct FilterOption { #[component] fn SpanView(span: DisplaySpan, depth: usize) -> Element { let indent = depth * 24; - let duration = span.end_timestamp + let duration = span + .end_timestamp .map(|end| format_duration_ns(end - span.start_timestamp)) .unwrap_or_else(|| "running".to_string()); @@ -941,14 +944,25 @@ fn RlTimeline(spans: Vec) -> Element { }; } - let selected_rollout = use_signal(|| rollouts.first().map(|rollout| rollout.rollout_id.clone()).unwrap_or_default()); - let selected_sample = use_signal(|| String::new()); + let selected_rollout = use_signal(|| { + rollouts + .first() + .map(|rollout| rollout.rollout_id.clone()) + .unwrap_or_default() + }); + let selected_sample = use_signal(String::new); let sort_mode = use_signal(|| "time".to_string()); let selected_rollout_read = selected_rollout.read().clone(); - let selected_rollout_id = if rollouts.iter().any(|rollout| rollout.rollout_id == selected_rollout_read) { + let selected_rollout_id = if rollouts + .iter() + .any(|rollout| rollout.rollout_id == selected_rollout_read) + { selected_rollout.read().clone() } else { - rollouts.first().map(|rollout| rollout.rollout_id.clone()).unwrap_or_default() + rollouts + .first() + .map(|rollout| rollout.rollout_id.clone()) + .unwrap_or_default() }; let rollout = rollouts .iter() @@ -956,30 +970,57 @@ fn RlTimeline(spans: Vec) -> Element { .or_else(|| rollouts.first()) .unwrap(); let selected_sample_read = selected_sample.read().clone(); - let selected_sample_key = if rollout.samples.iter().any(|sample| sample.sample_key == selected_sample_read) { + let selected_sample_key = if rollout + .samples + .iter() + .any(|sample| sample.sample_key == selected_sample_read) + { selected_sample.read().clone() } else { - rollout.samples.first().map(|sample| sample.sample_key.clone()).unwrap_or_default() + rollout + .samples + .first() + .map(|sample| sample.sample_key.clone()) + .unwrap_or_default() }; - let selected_sample_row = rollout.samples.iter().find(|sample| sample.sample_key == selected_sample_key); + let selected_sample_row = rollout + .samples + .iter() + .find(|sample| sample.sample_key == selected_sample_key); let min_start = rollout.start; let max_end = rollout.end.max(min_start + 1); let window = (max_end - min_start).max(1); let window_f = window as f64; let window_label = format_duration_ns(window); let sample_count = rollout.samples.len(); - let segment_count = rollout.samples.iter().map(|sample| sample.segments.len()).sum::(); + let segment_count = rollout + .samples + .iter() + .map(|sample| sample.segments.len()) + .sum::(); let sort_mode_value = sort_mode.read().clone(); let mut display_samples = rollout.samples.clone(); if sort_mode_value == "slow" { - display_samples.sort_by(|a, b| sample_duration_ns(b).cmp(&sample_duration_ns(a)) - .then_with(|| a.start.cmp(&b.start))); + display_samples.sort_by(|a, b| { + sample_duration_ns(b) + .cmp(&sample_duration_ns(a)) + .then_with(|| a.start.cmp(&b.start)) + }); } else { display_samples.sort_by_key(|sample| sample.start); } - let slowest_sample = rollout.samples.iter().max_by_key(|sample| sample_duration_ns(sample)); + let slowest_sample = rollout + .samples + .iter() + .max_by_key(|sample| sample_duration_ns(sample)); let slowest_label = slowest_sample - .map(|sample| format!("slowest {} {}", sample.label, format_duration_ns(sample_duration_ns(sample)))) + .map(|sample| { + format!( + "slowest {} {}", + sample.label, + format_duration_ns(sample_duration_ns(sample)) + ) + }) .unwrap_or_default(); let detail_bottom_pad = if selected_sample_row.is_some() { *RL_DETAIL_PANEL_HEIGHT.read() + 12 @@ -1020,8 +1061,8 @@ fn RlTimeline(spans: Vec) -> Element { button { class: format!("rounded px-2 py-1 text-xs font-mono {}", if is_selected { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-gray-100 text-gray-700 hover:bg-gray-200".to_string() }), onclick: { - let mut selected_rollout = selected_rollout.clone(); - let mut selected_sample = selected_sample.clone(); + let mut selected_rollout = selected_rollout; + let mut selected_sample = selected_sample; move |_| { *selected_rollout.write() = rollout_id.clone(); *selected_sample.write() = String::new(); @@ -1049,7 +1090,7 @@ fn RlTimeline(spans: Vec) -> Element { button { class: format!("rounded px-2 py-1 text-xs {}", if sort_mode_value == "time" { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-white text-gray-700 hover:bg-gray-100".to_string() }), onclick: { - let mut sort_mode = sort_mode.clone(); + let mut sort_mode = sort_mode; move |_| *sort_mode.write() = "time".to_string() }, "timeline order" @@ -1057,7 +1098,7 @@ fn RlTimeline(spans: Vec) -> Element { button { class: format!("rounded px-2 py-1 text-xs {}", if sort_mode_value == "slow" { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-white text-gray-700 hover:bg-gray-100".to_string() }), onclick: { - let mut sort_mode = sort_mode.clone(); + let mut sort_mode = sort_mode; move |_| *sort_mode.write() = "slow".to_string() }, "slowest first" @@ -1082,7 +1123,7 @@ fn RlTimeline(spans: Vec) -> Element { button { class: format!("grid w-full grid-cols-[minmax(300px,34%)_1fr_auto] items-center gap-3 rounded px-2 py-1 text-left text-sm {}", if is_selected { "bg-blue-50 ring-1 ring-blue-200".to_string() } else { "hover:bg-gray-50".to_string() }), onclick: { - let mut selected_sample = selected_sample.clone(); + let mut selected_sample = selected_sample; let sample_key = sample.sample_key.clone(); move |_| *selected_sample.write() = sample_key.clone() }, @@ -1164,14 +1205,25 @@ fn TrainTimeline(spans: Vec) -> Element { }; } - let selected_rollout = use_signal(|| rollouts.first().map(|rollout| rollout.rollout_id.clone()).unwrap_or_default()); - let selected_batch = use_signal(|| String::new()); + let selected_rollout = use_signal(|| { + rollouts + .first() + .map(|rollout| rollout.rollout_id.clone()) + .unwrap_or_default() + }); + let selected_batch = use_signal(String::new); let sort_mode = use_signal(|| "time".to_string()); let selected_rollout_read = selected_rollout.read().clone(); - let selected_rollout_id = if rollouts.iter().any(|rollout| rollout.rollout_id == selected_rollout_read) { + let selected_rollout_id = if rollouts + .iter() + .any(|rollout| rollout.rollout_id == selected_rollout_read) + { selected_rollout.read().clone() } else { - rollouts.first().map(|rollout| rollout.rollout_id.clone()).unwrap_or_default() + rollouts + .first() + .map(|rollout| rollout.rollout_id.clone()) + .unwrap_or_default() }; let rollout = rollouts .iter() @@ -1179,30 +1231,57 @@ fn TrainTimeline(spans: Vec) -> Element { .or_else(|| rollouts.first()) .unwrap(); let selected_batch_read = selected_batch.read().clone(); - let selected_batch_key = if rollout.samples.iter().any(|batch| batch.sample_key == selected_batch_read) { + let selected_batch_key = if rollout + .samples + .iter() + .any(|batch| batch.sample_key == selected_batch_read) + { selected_batch.read().clone() } else { - rollout.samples.first().map(|batch| batch.sample_key.clone()).unwrap_or_default() + rollout + .samples + .first() + .map(|batch| batch.sample_key.clone()) + .unwrap_or_default() }; - let selected_batch_row = rollout.samples.iter().find(|batch| batch.sample_key == selected_batch_key); + let selected_batch_row = rollout + .samples + .iter() + .find(|batch| batch.sample_key == selected_batch_key); let min_start = rollout.start; let max_end = rollout.end.max(min_start + 1); let window = (max_end - min_start).max(1); let window_f = window as f64; let window_label = format_duration_ns(window); let batch_count = rollout.samples.len(); - let segment_count = rollout.samples.iter().map(|batch| batch.segments.len()).sum::(); + let segment_count = rollout + .samples + .iter() + .map(|batch| batch.segments.len()) + .sum::(); let sort_mode_value = sort_mode.read().clone(); let mut display_batches = rollout.samples.clone(); if sort_mode_value == "slow" { - display_batches.sort_by(|a, b| sample_duration_ns(b).cmp(&sample_duration_ns(a)) - .then_with(|| a.start.cmp(&b.start))); + display_batches.sort_by(|a, b| { + sample_duration_ns(b) + .cmp(&sample_duration_ns(a)) + .then_with(|| a.start.cmp(&b.start)) + }); } else { display_batches.sort_by_key(|batch| batch.start); } - let slowest_batch = rollout.samples.iter().max_by_key(|batch| sample_duration_ns(batch)); + let slowest_batch = rollout + .samples + .iter() + .max_by_key(|batch| sample_duration_ns(batch)); let slowest_label = slowest_batch - .map(|batch| format!("slowest {} {}", batch.label, format_duration_ns(sample_duration_ns(batch)))) + .map(|batch| { + format!( + "slowest {} {}", + batch.label, + format_duration_ns(sample_duration_ns(batch)) + ) + }) .unwrap_or_default(); let detail_bottom_pad = if selected_batch_row.is_some() { *RL_DETAIL_PANEL_HEIGHT.read() + 12 @@ -1243,8 +1322,8 @@ fn TrainTimeline(spans: Vec) -> Element { button { class: format!("rounded px-2 py-1 text-xs font-mono {}", if is_selected { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-gray-100 text-gray-700 hover:bg-gray-200".to_string() }), onclick: { - let mut selected_rollout = selected_rollout.clone(); - let mut selected_batch = selected_batch.clone(); + let mut selected_rollout = selected_rollout; + let mut selected_batch = selected_batch; move |_| { *selected_rollout.write() = rollout_id.clone(); *selected_batch.write() = String::new(); @@ -1272,7 +1351,7 @@ fn TrainTimeline(spans: Vec) -> Element { button { class: format!("rounded px-2 py-1 text-xs {}", if sort_mode_value == "time" { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-white text-gray-700 hover:bg-gray-100".to_string() }), onclick: { - let mut sort_mode = sort_mode.clone(); + let mut sort_mode = sort_mode; move |_| *sort_mode.write() = "time".to_string() }, "timeline order" @@ -1280,7 +1359,7 @@ fn TrainTimeline(spans: Vec) -> Element { button { class: format!("rounded px-2 py-1 text-xs {}", if sort_mode_value == "slow" { format!("bg-{} text-white", colors::PRIMARY) } else { "bg-white text-gray-700 hover:bg-gray-100".to_string() }), onclick: { - let mut sort_mode = sort_mode.clone(); + let mut sort_mode = sort_mode; move |_| *sort_mode.write() = "slow".to_string() }, "slowest first" @@ -1305,7 +1384,7 @@ fn TrainTimeline(spans: Vec) -> Element { button { class: format!("grid w-full grid-cols-[minmax(300px,34%)_1fr_auto] items-center gap-3 rounded px-2 py-1 text-left text-sm {}", if is_selected { "bg-blue-50 ring-1 ring-blue-200".to_string() } else { "hover:bg-gray-50".to_string() }), onclick: { - let mut selected_batch = selected_batch.clone(); + let mut selected_batch = selected_batch; let batch_key = batch.sample_key.clone(); move |_| *selected_batch.write() = batch_key.clone() }, @@ -1382,10 +1461,10 @@ fn ResizableDetailPanel( segment_count: usize, children: Element, ) -> Element { - let mut panel_height = use_signal(|| *RL_DETAIL_PANEL_HEIGHT.read()); - let mut is_resizing = use_signal(|| false); - let mut drag_start_y = use_signal(|| 0.0f64); - let mut drag_start_height = use_signal(|| 0.0f64); + let panel_height = use_signal(|| *RL_DETAIL_PANEL_HEIGHT.read()); + let is_resizing = use_signal(|| false); + let drag_start_y = use_signal(|| 0.0f64); + let drag_start_height = use_signal(|| 0.0f64); let height_px = *panel_height.read(); let height_label = format!("{height_px}px"); let resizing = *is_resizing.read(); @@ -1396,7 +1475,7 @@ fn ResizableDetailPanel( class: "fixed inset-0 z-[60] cursor-ns-resize select-none", style: "touch-action: none;", onmousemove: { - let mut panel_height = panel_height.clone(); + let mut panel_height = panel_height; move |ev| { let current_y = ev.client_coordinates().y; let delta = *drag_start_y.read() - current_y; @@ -1408,7 +1487,7 @@ fn ResizableDetailPanel( } }, onmouseup: { - let mut is_resizing = is_resizing.clone(); + let mut is_resizing = is_resizing; move |_| { *is_resizing.write() = false; } @@ -1422,9 +1501,9 @@ fn ResizableDetailPanel( class: "group flex h-3 shrink-0 cursor-ns-resize items-center justify-center border-b border-gray-100 bg-gray-50 hover:bg-gray-100 active:bg-gray-200", title: "Drag up/down to resize panel height", onmousedown: { - let mut is_resizing = is_resizing.clone(); - let mut drag_start_y = drag_start_y.clone(); - let mut drag_start_height = drag_start_height.clone(); + let mut is_resizing = is_resizing; + let mut drag_start_y = drag_start_y; + let mut drag_start_height = drag_start_height; move |ev| { *is_resizing.write() = true; *drag_start_y.write() = ev.client_coordinates().y; @@ -1453,7 +1532,7 @@ fn ResizableDetailPanel( class: "rounded border border-gray-200 bg-white px-2 py-0.5 text-xs text-gray-700 hover:bg-gray-50", title: "Expand to fit all phases", onclick: { - let mut panel_height = panel_height.clone(); + let mut panel_height = panel_height; move |_| { let h = estimate_detail_panel_height(segment_count); *panel_height.write() = h; @@ -1466,7 +1545,7 @@ fn ResizableDetailPanel( class: "rounded border border-gray-200 bg-white px-2 py-0.5 text-xs text-gray-700 hover:bg-gray-50", title: "Reset panel height", onclick: { - let mut panel_height = panel_height.clone(); + let mut panel_height = panel_height; move |_| { *panel_height.write() = RL_DETAIL_PANEL_HEIGHT_DEFAULT; *RL_DETAIL_PANEL_HEIGHT.write() = RL_DETAIL_PANEL_HEIGHT_DEFAULT; @@ -1606,7 +1685,11 @@ fn RlSampleDetail(sample: RlSampleRow, min_start: i64) -> Element { } } -fn build_timeline_spans(spans: &[DisplaySpan], max_depth: usize, selected_batch_key: &str) -> Vec { +fn build_timeline_spans( + spans: &[DisplaySpan], + max_depth: usize, + selected_batch_key: &str, +) -> Vec { let mut rows = Vec::new(); if !selected_batch_key.is_empty() { if let Some(selected) = find_display_span(spans, selected_batch_key) { @@ -1630,7 +1713,8 @@ fn build_rl_rollout_views(spans: &[DisplaySpan]) -> Vec { continue; }; let Some(rollout_id) = attr_string(&span.attributes, "rollout_id") - .or_else(|| attr_string(&span.attributes, "step_id")) else { + .or_else(|| attr_string(&span.attributes, "step_id")) + else { continue; }; let Some(trajectory_id) = attr_string(&span.attributes, "trajectory_id") @@ -1639,20 +1723,23 @@ fn build_rl_rollout_views(spans: &[DisplaySpan]) -> Vec { let group_index = attr_string(&span.attributes, "group_index")?; Some(format!("r{rollout_id}-g{group_id}-i{group_index}")) }) - .or_else(|| attr_string(&span.attributes, "sample_id")) else { + .or_else(|| attr_string(&span.attributes, "sample_id")) + else { continue; }; let sample_key = format!("{rollout_id}:{trajectory_id}"); - let entry = samples.entry(sample_key.clone()).or_insert_with(|| RlSampleBuilder { - sample_key: sample_key.clone(), - label: trajectory_id.clone(), - rollout_id: rollout_id.clone(), - group_id: attr_string(&span.attributes, "group_id"), - attempt: attr_string(&span.attributes, "attempt"), - start: segment.start, - end: segment.end, - ..Default::default() - }); + let entry = samples + .entry(sample_key.clone()) + .or_insert_with(|| RlSampleBuilder { + sample_key: sample_key.clone(), + label: trajectory_id.clone(), + rollout_id: rollout_id.clone(), + group_id: attr_string(&span.attributes, "group_id"), + attempt: attr_string(&span.attributes, "attempt"), + start: segment.start, + end: segment.end, + ..Default::default() + }); entry.start = entry.start.min(segment.start); entry.end = entry.end.max(segment.end); @@ -1679,15 +1766,18 @@ fn build_rl_rollout_views(spans: &[DisplaySpan]) -> Vec { detail_parts.push(format!("attempt:{attempt}")); } detail_parts.push(format!("{} phases", builder.segments.len())); - by_rollout.entry(builder.rollout_id.clone()).or_default().push(RlSampleRow { - sample_key: builder.sample_key, - label: builder.label, - detail: detail_parts.join(" "), - start: builder.start, - end: builder.end, - process_labels: labels.join(", "), - segments: builder.segments, - }); + by_rollout + .entry(builder.rollout_id.clone()) + .or_default() + .push(RlSampleRow { + sample_key: builder.sample_key, + label: builder.label, + detail: detail_parts.join(" "), + start: builder.start, + end: builder.end, + process_labels: labels.join(", "), + segments: builder.segments, + }); } let mut rollouts = by_rollout @@ -1695,7 +1785,11 @@ fn build_rl_rollout_views(spans: &[DisplaySpan]) -> Vec { .map(|(rollout_id, mut samples)| { samples.sort_by_key(|sample| sample.start); let start = samples.iter().map(|sample| sample.start).min().unwrap_or(0); - let end = samples.iter().map(|sample| sample.end).max().unwrap_or(start); + let end = samples + .iter() + .map(|sample| sample.end) + .max() + .unwrap_or(start); RlRolloutView { rollout_id, start, @@ -1723,7 +1817,8 @@ fn build_train_rollout_views(spans: &[DisplaySpan]) -> Vec { continue; }; let Some(rollout_id) = attr_string(&span.attributes, "rollout_id") - .or_else(|| attr_string(&span.attributes, "step_id")) else { + .or_else(|| attr_string(&span.attributes, "step_id")) + else { continue; }; let train_step_id = attr_string(&span.attributes, "train_step_id"); @@ -1734,21 +1829,25 @@ fn build_train_rollout_views(spans: &[DisplaySpan]) -> Vec { let batch_key = format!("{rollout_id}:{batch_key_id}"); let label = match (train_step_id, batch_id) { - (Some(train_step_id), Some(batch_id)) => format!("train_step:{train_step_id} batch:{batch_id}"), + (Some(train_step_id), Some(batch_id)) => { + format!("train_step:{train_step_id} batch:{batch_id}") + } (Some(train_step_id), None) => format!("train_step:{train_step_id}"), (None, Some(batch_id)) => format!("batch:{batch_id}"), (None, None) => batch_key_id, }; - let entry = batches.entry(batch_key.clone()).or_insert_with(|| RlSampleBuilder { - sample_key: batch_key.clone(), - label, - rollout_id: rollout_id.clone(), - group_id: attr_string(&span.attributes, "role"), - attempt: attr_string(&span.attributes, "rank"), - start: segment.start, - end: segment.end, - ..Default::default() - }); + let entry = batches + .entry(batch_key.clone()) + .or_insert_with(|| RlSampleBuilder { + sample_key: batch_key.clone(), + label, + rollout_id: rollout_id.clone(), + group_id: attr_string(&span.attributes, "role"), + attempt: attr_string(&span.attributes, "rank"), + start: segment.start, + end: segment.end, + ..Default::default() + }); entry.start = entry.start.min(segment.start); entry.end = entry.end.max(segment.end); @@ -1775,15 +1874,18 @@ fn build_train_rollout_views(spans: &[DisplaySpan]) -> Vec { detail_parts.push(format!("rank:{rank}")); } detail_parts.push(format!("{} phases", builder.segments.len())); - by_rollout.entry(builder.rollout_id.clone()).or_default().push(RlSampleRow { - sample_key: builder.sample_key, - label: builder.label, - detail: detail_parts.join(" "), - start: builder.start, - end: builder.end, - process_labels: labels.join(", "), - segments: builder.segments, - }); + by_rollout + .entry(builder.rollout_id.clone()) + .or_default() + .push(RlSampleRow { + sample_key: builder.sample_key, + label: builder.label, + detail: detail_parts.join(" "), + start: builder.start, + end: builder.end, + process_labels: labels.join(", "), + segments: builder.segments, + }); } let mut rollouts = by_rollout @@ -1791,7 +1893,11 @@ fn build_train_rollout_views(spans: &[DisplaySpan]) -> Vec { .map(|(rollout_id, mut samples)| { samples.sort_by_key(|sample| sample.start); let start = samples.iter().map(|sample| sample.start).min().unwrap_or(0); - let end = samples.iter().map(|sample| sample.end).max().unwrap_or(start); + let end = samples + .iter() + .map(|sample| sample.end) + .max() + .unwrap_or(start); RlRolloutView { rollout_id, start, @@ -1826,13 +1932,11 @@ fn build_chrome_trace_json_from_display_spans(spans: &[DisplaySpan]) -> Option Option Option Option String { @@ -1962,7 +2074,9 @@ fn perfetto_track_label(span: &DisplaySpan) -> String { if let Some(trajectory_id) = trajectory_id { return format!("rollout:{rollout_id} / {trajectory_id}"); } - if span.name.starts_with("rollout.") || span.kind.as_deref().unwrap_or("").contains("rollout") { + if span.name.starts_with("rollout.") + || span.kind.as_deref().unwrap_or("").contains("rollout") + { return format!("rollout:{rollout_id} / control"); } return format!("rollout:{rollout_id}"); @@ -1979,9 +2093,7 @@ fn perfetto_track_label(span: &DisplaySpan) -> String { fn rl_segment_from_span(span: &DisplaySpan) -> Option { let end = span.end_timestamp?; - if attr_string(&span.attributes, "sample_id").is_none() - && attr_string(&span.attributes, "trajectory_id").is_none() - { + if !has_trajectory_identity(&span.attributes) { return None; } let phase = attr_string(&span.attributes, "phase") @@ -2006,12 +2118,7 @@ fn train_segment_from_span(span: &DisplaySpan) -> Option { let phase = attr_string(&span.attributes, "phase") .or_else(|| span.kind.clone()) .unwrap_or_else(|| span.name.clone()); - if !is_train_timeline_span( - &span.name, - &phase, - span.kind.as_deref(), - &span.attributes, - ) { + if !is_train_timeline_span(&span.name, &phase, span.kind.as_deref(), &span.attributes) { return None; } @@ -2068,7 +2175,12 @@ fn rl_phase_dot_class(phase: &str) -> &'static str { } } -fn collect_timeline_spans(spans: &[DisplaySpan], depth: usize, max_depth: usize, rows: &mut Vec) { +fn collect_timeline_spans( + spans: &[DisplaySpan], + depth: usize, + max_depth: usize, + rows: &mut Vec, +) { for span in spans { if depth < max_depth { if let Some(end) = span.end_timestamp { @@ -2101,7 +2213,8 @@ fn build_display_spans(spans: &[SpanInfo]) -> Vec { } fn build_display_span(span: &SpanInfo, counters: &mut HashMap) -> DisplaySpan { - let counter_key = span.phase + let counter_key = span + .phase .as_ref() .map(|phase| format!("{}:{phase}", span.name)) .unwrap_or_else(|| span.name.clone()); @@ -2137,26 +2250,31 @@ fn build_display_span(span: &SpanInfo, counters: &mut HashMap) -> } } -fn collect_process_options(spans: &[DisplaySpan], discovered_processes: &[TraceProcessInfo]) -> Vec { +fn collect_process_options( + spans: &[DisplaySpan], + discovered_processes: &[TraceProcessInfo], +) -> Vec { let mut by_pid = HashMap::::new(); let mut all_spans = Vec::::new(); collect_all_display_spans(spans, &mut all_spans); for process in discovered_processes { - by_pid.entry(process.pid.to_string()).or_insert(FilterOption { - filter_key: format!("pid:{}", process.pid), - label: trace_process_label(process), - }); + by_pid + .entry(process.pid.to_string()) + .or_insert(FilterOption { + filter_key: format!("pid:{}", process.pid), + label: trace_process_label(process), + }); } for span in all_spans { let Some(pid) = process_pid_from_attrs(&span.attributes) else { continue; }; - let role = attr_string(&span.attributes, "process_role").unwrap_or_else(|| "process".to_string()); + let role = + attr_string(&span.attributes, "process_role").unwrap_or_else(|| "process".to_string()); let actor_name = attr_string(&span.attributes, "ray_actor_name"); - let worker_id = attr_string(&span.attributes, "ray_worker_id") - .map(|id| short_id(&id)); + let worker_id = attr_string(&span.attributes, "ray_worker_id").map(|id| short_id(&id)); let mut parts = vec![format!("{role}:{pid}")]; if let Some(actor_name) = actor_name.filter(|value| !value.is_empty()) { parts.push(actor_name); @@ -2171,18 +2289,29 @@ fn collect_process_options(spans: &[DisplaySpan], discovered_processes: &[TraceP } let mut options = by_pid.into_values().collect::>(); - options.sort_by(|a, b| process_option_rank(a).cmp(&process_option_rank(b)) - .then_with(|| a.label.cmp(&b.label))); + options.sort_by(|a, b| { + process_option_rank(a) + .cmp(&process_option_rank(b)) + .then_with(|| a.label.cmp(&b.label)) + }); options } fn trace_process_label(process: &TraceProcessInfo) -> String { let role = process.process_role.as_deref().unwrap_or("process"); let mut parts = vec![format!("{role}:{}", process.pid)]; - if let Some(actor_name) = process.ray_actor_name.as_ref().filter(|value| !value.is_empty()) { + if let Some(actor_name) = process + .ray_actor_name + .as_ref() + .filter(|value| !value.is_empty()) + { parts.push(actor_name.clone()); } - if let Some(worker_id) = process.ray_worker_id.as_ref().filter(|value| !value.is_empty()) { + if let Some(worker_id) = process + .ray_worker_id + .as_ref() + .filter(|value| !value.is_empty()) + { parts.push(format!("worker:{}", short_id(worker_id))); } parts.join(" | ") @@ -2230,9 +2359,16 @@ fn collect_filtered_display_spans( ) { for span in spans { let mut children = Vec::new(); - collect_filtered_display_spans(&span.children, process_filter, function_filter, &mut children); - - if process_filter_matches(span, process_filter) && function_filter_matches(span, function_filter) { + collect_filtered_display_spans( + &span.children, + process_filter, + function_filter, + &mut children, + ); + + if process_filter_matches(span, process_filter) + && function_filter_matches(span, function_filter) + { let mut cloned = span.clone(); cloned.children = children; out.push(cloned); @@ -2264,8 +2400,8 @@ fn function_filter_matches(span: &DisplaySpan, function_filter: &str) -> bool { fn collect_span_process_pids(spans: &[SpanInfo]) -> HashSet { let mut pids = HashSet::new(); for span in spans { - if let Some(pid) = process_pid_from_attrs(&span.attributes) - .and_then(|pid| pid.parse::().ok()) + if let Some(pid) = + process_pid_from_attrs(&span.attributes).and_then(|pid| pid.parse::().ok()) { pids.insert(pid); } @@ -2305,8 +2441,8 @@ fn collect_batch_options(spans: &[DisplaySpan]) -> Vec { fn collect_batches(spans: &[DisplaySpan], rows: &mut Vec) { for span in spans { - let is_batch = span.name == "batch" - || is_step_parent_span(&span.name, span.kind.as_deref()); + let is_batch = + span.name == "batch" || is_step_parent_span(&span.name, span.kind.as_deref()); if is_batch { let duration = span .end_timestamp @@ -2417,7 +2553,10 @@ fn display_logical_step_key(span: &DisplaySpan) -> Option { return None; } - Some(LogicalStepKey { rollout_id, step_id }) + Some(LogicalStepKey { + rollout_id, + step_id, + }) } fn expanded_trace_fetch_limit(limit: usize) -> usize { @@ -2544,7 +2683,11 @@ fn submit_parent_matches(span: &SpanInfo, key: &LogicalStepKey) -> bool { && submit_step_id.as_deref() == Some(key.step_id.as_str()) } -fn attach_to_single_rollout_parent(spans: &mut [SpanInfo], rollout_id: &str, child: SpanInfo) -> bool { +fn attach_to_single_rollout_parent( + spans: &mut [SpanInfo], + rollout_id: &str, + child: SpanInfo, +) -> bool { let mut matches = Vec::>::new(); let mut current_path = Vec::::new(); find_rollout_parent_paths(spans, rollout_id, &mut current_path, &mut matches); @@ -2584,7 +2727,13 @@ fn attach_to_time_parent(spans: &mut [SpanInfo], child: SpanInfo) -> bool { let mut best_path = Vec::::new(); let mut current_path = Vec::::new(); let mut best_duration: Option = None; - find_time_parent_path(spans, &child, &mut current_path, &mut best_path, &mut best_duration); + find_time_parent_path( + spans, + &child, + &mut current_path, + &mut best_path, + &mut best_duration, + ); if best_path.is_empty() { return false; @@ -2620,7 +2769,13 @@ fn find_time_parent_path( } } - find_time_parent_path(&span.children, child, current_path, best_path, best_duration); + find_time_parent_path( + &span.children, + child, + current_path, + best_path, + best_duration, + ); current_path.pop(); } } diff --git a/web/src/pages/training.rs b/web/src/pages/training.rs index e34e3ed3..8e7488d1 100644 --- a/web/src/pages/training.rs +++ b/web/src/pages/training.rs @@ -889,7 +889,7 @@ fn render_comm_local_result( }, children: rsx! { EmptyState { - message: "No collective samples on this node. Auto-enabled for torchrun (WORLD_SIZE>1).".to_string() + message: "No collective samples on this node. Enable with PROBING_TORCH_COLLECTIVE_ENABLE=1 or SET probing.torch.collective.enable=1.".to_string() } }, } diff --git a/web/src/rl_contract.rs b/web/src/rl_contract.rs index 42407d7e..cd29aa5f 100644 --- a/web/src/rl_contract.rs +++ b/web/src/rl_contract.rs @@ -20,7 +20,8 @@ pub fn attr_string(attributes: &Option, key: &str) -> Option { /// Rollout/sample timeline requires trajectory or sample identity on each span. pub fn has_trajectory_identity(attributes: &Option) -> bool { - attr_string(attributes, "trajectory_id").is_some() || attr_string(attributes, "sample_id").is_some() + attr_string(attributes, "trajectory_id").is_some() + || attr_string(attributes, "sample_id").is_some() } /// Training timeline spans must be tagged as train phases and keyed by step/batch. @@ -36,8 +37,10 @@ pub fn is_train_phase_span( if attr_string(attributes, "actor_role").as_deref() == Some("trainer") { return true; } - matches!(kind, Some("rl.train") | Some("train.step") | Some("rl.phase")) - && (phase.contains("train") || name.contains("train")) + matches!( + kind, + Some("rl.train") | Some("train.step") | Some("rl.phase") + ) && (phase.contains("train") || name.contains("train")) } pub fn is_train_timeline_span( @@ -46,7 +49,8 @@ pub fn is_train_timeline_span( kind: Option<&str>, attributes: &Option, ) -> bool { - if attr_string(attributes, "train_step_id").is_none() && attr_string(attributes, "batch_id").is_none() + if attr_string(attributes, "train_step_id").is_none() + && attr_string(attributes, "batch_id").is_none() { return false; } @@ -99,7 +103,10 @@ pub fn logical_step_key(span: &SpanInfo) -> Option { return None; } - Some(LogicalStepKey { rollout_id, step_id }) + Some(LogicalStepKey { + rollout_id, + step_id, + }) } #[derive(Clone, Eq, PartialEq)] diff --git a/web/src/state/rl.rs b/web/src/state/rl.rs index 5da09838..2cddf6b9 100644 --- a/web/src/state/rl.rs +++ b/web/src/state/rl.rs @@ -2,8 +2,8 @@ use dioxus::prelude::*; -pub static ROLLOUT_FILTER: GlobalSignal = Signal::global(|| String::new()); -pub static ROLLOUT_FILTER_INPUT: GlobalSignal = Signal::global(|| String::new()); +pub static ROLLOUT_FILTER: GlobalSignal = Signal::global(String::new); +pub static ROLLOUT_FILTER_INPUT: GlobalSignal = Signal::global(String::new); /// Height of the pinned rollout/train detail panel (px). Synced for main content padding. pub static RL_DETAIL_PANEL_HEIGHT: GlobalSignal = Signal::global(|| 256); @@ -14,7 +14,5 @@ pub const RL_DETAIL_PANEL_HEIGHT_MAX: u32 = 1200; pub fn estimate_detail_panel_height(segment_count: usize) -> u32 { let estimated = 108u32.saturating_add(segment_count as u32 * 44); - estimated - .max(RL_DETAIL_PANEL_HEIGHT_MIN) - .min(RL_DETAIL_PANEL_HEIGHT_MAX) + estimated.clamp(RL_DETAIL_PANEL_HEIGHT_MIN, RL_DETAIL_PANEL_HEIGHT_MAX) } From 0fd054de0161e582a96eacbda2bbd13f8ad67527 Mon Sep 17 00:00:00 2001 From: Reiase Date: Sun, 26 Jul 2026 17:50:51 +0800 Subject: [PATCH 22/37] Enhance documentation and refactor profiling features (#75) - Updated the extensibility documentation to clarify the handling of column types and schema stability in Python, ensuring users understand the implications of dtype variations. - Improved the profiling documentation to delineate the independent paths of TorchProbe and Torch Profiler, emphasizing their distinct roles and operational characteristics. - Refactored the fanout statistics handling in the federation module, introducing a new `FanoutStatsHandle` for better concurrency management and encapsulation of fanout statistics. - Streamlined the federated scan execution process to utilize the new fanout statistics handling, enhancing the clarity and maintainability of the code. These changes aim to improve user understanding of profiling tools and enhance the robustness of the federation features. --- docs/src/design/extensibility.md | 5 +- docs/src/design/extensibility.zh.md | 4 +- docs/src/design/profiling.md | 34 +++- docs/src/design/profiling.zh.md | 34 +++- docs/src/design/torch-profiler-sql.md | 7 + docs/src/design/torch-profiler-sql.zh.md | 6 + .../src/core/federation/cluster_executor.rs | 43 +--- .../core/src/core/federation/fanout_scope.rs | 191 ++++++++++++++++-- .../core/federation/federated_scan_exec.rs | 22 +- .../core/src/core/federation/global_table.rs | 2 + probing/core/src/core/federation/mod.rs | 2 +- .../python/src/extensions/python/exttbls.rs | 91 ++++++++- probing/server/src/engine.rs | 8 +- probing/server/src/mcp/helpers.rs | 21 +- probing/server/src/server/cluster_fanout.rs | 36 ++-- python/probing/profiling/__init__.py | 19 +- python/probing/profiling/torch_probe.py | 35 +++- .../profiling/torch_profiler/__init__.py | 7 +- .../profiling/torch_profiler/controller.py | 15 +- 19 files changed, 466 insertions(+), 116 deletions(-) diff --git a/docs/src/design/extensibility.md b/docs/src/design/extensibility.md index ee4b0cc5..b05c2022 100644 --- a/docs/src/design/extensibility.md +++ b/docs/src/design/extensibility.md @@ -79,7 +79,10 @@ Reference implementation: `python/probing/ext/example.py`. - Default: class name converted to **snake_case** (`MyMetrics` → `my_metrics`) - Explicit: `@table("custom_name")` on the dataclass -The first appended row fixes column types. Changing fields later requires a new table name or `MyMetrics.drop()` before re-init. +The first appended row fixes column types. Python integers/floats use the wide +`I64`/`F64` representation, and later values are coerced to the fixed schema; +dtype variation never recreates the mmap or discards earlier rows. Changing +fields still requires a new table name or `MyMetrics.drop()` before re-init. ### API added by `@table` diff --git a/docs/src/design/extensibility.zh.md b/docs/src/design/extensibility.zh.md index 631404fa..43caacd4 100644 --- a/docs/src/design/extensibility.zh.md +++ b/docs/src/design/extensibility.zh.md @@ -85,7 +85,9 @@ ORDER BY step; - 默认:类名转 **snake_case**(`MyMetrics` → `my_metrics`) - 显式:`@table("custom_name")` 写在 dataclass 上 -首行写入后列类型固定。改字段需新表名,或先 `MyMetrics.drop()` 再 `init_table()`。 +首行写入后列类型固定。Python 整数/浮点数使用宽类型 `I64`/`F64`,后续值会转换到 +固定 schema;dtype 变化不会重建 mmap 或丢弃旧行。改字段仍需新表名,或先 +`MyMetrics.drop()` 再 `init_table()`。 ### `@table` 提供的 API diff --git a/docs/src/design/profiling.md b/docs/src/design/profiling.md index dd6eff7d..264fa33b 100644 --- a/docs/src/design/profiling.md +++ b/docs/src/design/profiling.md @@ -11,7 +11,34 @@ The profiling system collects performance data through: - Columnar table storage (memtable / Arrow-backed tables) - SQL query interface -## Data Collection Architecture +## Two independent PyTorch collection paths + +Probing provides both **TorchProbe** and **Torch Profiler**. Their names are similar, but they +are not configurations of one collector and do not share sessions, event buffers, or lifecycle. + +| Dimension | TorchProbe | Torch Profiler (`torch.profiler` / Kineto) | +|-----------|------------|---------------------------------------------| +| Role | Low-overhead telemetry throughout training | Short-window drill-down after an anomaly is located | +| Primary granularity | Step, `nn.Module`, optimizer, memory deltas | CPU op, CUDA kernel, runtime, memcpy | +| Start | `PROBING_TORCH_PROFILING` / `configure()`; training hooks | Explicit HTTP or REPL capture for N optimizer steps | +| Control | Step/layer sampling, shadow baseline, deferred GPU-event reads | Capture `steps`, then finalize Kineto output | +| Data | mmap memtables: `python.torch_trace`, `python.torch_step_timing` | Bounded in-process session store exposed as `python.profile_capture` and `python.profile_hotspot` | +| Typical overhead | Low and amortized for long-running observation | Higher, especially with CUDA, shapes, stacks, and FLOPs | +| Answers | Which step/rank/module is persistently slow? What is hook overhead? | Which op/kernel is slow in the target window? Where does GPU time go? | + +**Independent** has three operational consequences: + +1. Enabling TorchProbe does **not** start Kineto; starting Torch Profiler does **not** change + TorchProbe sampling or shadow scheduling. +2. They may observe the same optimizer step, but correlate only through step/capture coordinates + in SQL; neither collector calls the other. +3. If both run together, their overheads add. TorchProbe shadow steps estimate only the + TorchProbe module-hook path, not Torch Profiler/Kineto overhead. + +The intended diagnostic ladder is TorchProbe first to locate the anomalous step, rank, and +module, followed by a targeted Torch Profiler window only when op/kernel detail is needed. + +## TorchProbe Data Collection Architecture ```mermaid graph TB @@ -43,7 +70,10 @@ graph TB ### Design -TorchProbe targets **always-on, module-level training telemetry** after probe injection or `PROBING_TORCH_PROFILING=on`. It is complementary to episodic tools such as `torch.profiler` / Kineto (op/kernel Chrome traces). For on-demand Kineto capture exposed as **virtual SQL tables** (not memtable), see **[Torch Profiler SQL](torch-profiler-sql.md)**. +TorchProbe targets **always-on, module-level training telemetry** after probe injection or +`PROBING_TORCH_PROFILING=on`. It is the long-running path described above, not a lightweight +configuration or frontend for `torch.profiler`. For on-demand Kineto capture exposed as +**virtual SQL tables** (not memtable), see **[Torch Profiler SQL](torch-profiler-sql.md)**. There is **no warmup schedule API**. Skip cold-start steps in SQL when needed: diff --git a/docs/src/design/profiling.zh.md b/docs/src/design/profiling.zh.md index 6e6fdc7e..6b93397b 100644 --- a/docs/src/design/profiling.zh.md +++ b/docs/src/design/profiling.zh.md @@ -11,7 +11,34 @@ Probing 为 AI 工作负载提供低开销、可 SQL 查询的性能数据采集 - 列式表存储(memtable / Arrow 表) - SQL 查询接口 -## 数据收集架构 +## 两条独立的 PyTorch 性能采集路径 + +Probing 同时提供 **TorchProbe** 和 **Torch Profiler**。两者名字相近,但不是同一个 +collector 的不同配置,也不共享采集 session、事件缓冲或生命周期。 + +| 维度 | TorchProbe | Torch Profiler(`torch.profiler` / Kineto) | +|------|------------|----------------------------------------------| +| 定位 | 训练期间长期运行的低开销遥测 | 对已定位异常做短窗口深挖 | +| 主要粒度 | step、`nn.Module`、optimizer、显存变化 | CPU op、CUDA kernel、runtime、memcpy | +| 启动方式 | `PROBING_TORCH_PROFILING` / `configure()`,随训练 hook 运行 | HTTP 或 REPL 显式触发若干 optimizer step | +| 控制方式 | step 采样、layer 采样、shadow baseline、延迟 GPU event 读取 | 一次 capture 的 `steps`,结束后 finalize Kineto 结果 | +| 数据出口 | 持续写 mmap memtable:`python.torch_trace`、`python.torch_step_timing` | 有界进程内 session store,经虚拟表 `python.profile_capture`、`python.profile_hotspot` 查询 | +| 典型开销 | 低且可摊销,面向长期观测 | 较高,尤其启用 CUDA、shape、stack、FLOPs 时 | +| 典型问题 | 哪个 step/rank/module 持续变慢?开销是多少? | 异常窗口里具体是哪个 op/kernel 慢?GPU 时间如何构成? | + +“独立”有三个直接含义: + +1. 开启 TorchProbe **不会**启动 Kineto;触发 Torch Profiler 也**不会**修改 TorchProbe + 的采样率或 shadow 调度。 +2. 两者可以观察到同一个 optimizer step,但只通过 step/capture 坐标在 SQL 层关联, + 不在采集器内部互相调用。 +3. 如果同时开启,两条路径的开销会叠加;TorchProbe 的 shadow baseline 只估算 + TorchProbe module-hook 路径,不能代表 Torch Profiler/Kineto 的开销。 + +推荐诊断顺序是:先用 TorchProbe 长期发现异常的 step、rank 和 module,再只对目标 +窗口启动 Torch Profiler。仅在需要 op/kernel 细节时支付 Kineto 的较高成本。 + +## TorchProbe 数据收集架构 ```mermaid graph TB @@ -43,7 +70,10 @@ graph TB ### 设计定位 -TorchProbe 面向**注入后长期开启的 module 级训练遥测**(`PROBING_TORCH_PROFILING=on`)。与 episodic 工具(`torch.profiler` / Kineto 的 op/kernel Chrome trace)互补,而非替代。按需 Kineto 采集以**虚拟 SQL 表**暴露(不写 memtable)见 **[Torch Profiler SQL](torch-profiler-sql.zh.md)**。 +TorchProbe 面向**注入后长期开启的 module 级训练遥测**(`PROBING_TORCH_PROFILING=on`)。 +它是上一节两条独立路径中的长期遥测路径,不是 `torch.profiler` 的轻量配置或前端。 +按需 Kineto 采集以**虚拟 SQL 表**暴露(不写 memtable)见 +**[Torch Profiler SQL](torch-profiler-sql.zh.md)**。 **不提供 warmup schedule API**。跳过冷启动步请在 SQL 中过滤: diff --git a/docs/src/design/torch-profiler-sql.md b/docs/src/design/torch-profiler-sql.md index caef9467..bcd3791c 100644 --- a/docs/src/design/torch-profiler-sql.md +++ b/docs/src/design/torch-profiler-sql.md @@ -4,6 +4,13 @@ Turn on-demand **`torch.profiler`** capture into **SQL that answers diagnostic q mirror of Kineto events. Virtual table schemas are derived from **conclusions we need**; the Adaptor compiles timeline data into those conclusion slots. Full Chrome timelines stay on HTTP/UI. +> **Naming boundary:** Torch Profiler here means short-window `torch.profiler` / Kineto capture, +> controlled by `python/probing/profiling/torch_profiler/`. It is independent from the +> long-running module telemetry in `python/probing/profiling/torch_probe.py`: lifecycle and +> storage are separate, correlation happens only through step/capture coordinates in SQL, and +> overheads add if both run together. See the +> [full comparison](profiling.md#two-independent-pytorch-collection-paths). + Read with [Profiling](profiling.md), [Federated query engine](federation.md), [NCCL Profiler](nccl-profiler.md). 中文: [中文版](/zh/design/torch-profiler-sql/) diff --git a/docs/src/design/torch-profiler-sql.zh.md b/docs/src/design/torch-profiler-sql.zh.md index 09d36ec2..29a01150 100644 --- a/docs/src/design/torch-profiler-sql.zh.md +++ b/docs/src/design/torch-profiler-sql.zh.md @@ -4,6 +4,12 @@ 虚拟表从 **「我们想得出什么结论」** 反推 schema;Adaptor 负责把 timeline 填进这些结论槽位。 完整 Chrome timeline 仍走 HTTP/UI。 +> **名称边界:**本文的 Torch Profiler 指 `torch.profiler` / Kineto 短窗口采集,由 +> `python/probing/profiling/torch_profiler/` 控制。它与 +> `python/probing/profiling/torch_probe.py` 的长期 module 遥测是两条独立路径: +> 启停和存储互不依赖,只通过 step/capture 坐标在 SQL 层关联;同时运行时开销叠加。 +> 完整对照见 [性能分析实现](profiling.zh.md) 开头的两条路径对照表。 + 阅读:[性能分析](profiling.zh.md)、[联邦查询引擎](federation.zh.md)、[NCCL Profiler](nccl-profiler.zh.md)。 英文版:[torch-profiler-sql.md](torch-profiler-sql.md) diff --git a/probing/core/src/core/federation/cluster_executor.rs b/probing/core/src/core/federation/cluster_executor.rs index 69c1d497..21af2f0c 100644 --- a/probing/core/src/core/federation/cluster_executor.rs +++ b/probing/core/src/core/federation/cluster_executor.rs @@ -1,4 +1,6 @@ -use std::sync::{LazyLock, Mutex, MutexGuard}; +use std::sync::LazyLock; +#[cfg(any(test, feature = "test-utils"))] +use std::sync::{Mutex, MutexGuard}; use std::time::Duration; use datafusion::error::{DataFusionError, Result}; @@ -9,7 +11,7 @@ use crate::core::cluster::{ remote_peers_excluding_local, }; use crate::core::federation::fanout_scope::{ - current_fanout_scope, resolve_fanout_scope, FanoutScope, + current_fanout_scope, current_fanout_stats_handle, resolve_fanout_scope, FanoutScope, }; #[cfg(any(test, feature = "test-utils"))] @@ -73,20 +75,7 @@ pub struct RemoteFanoutResult { pub result: Result, } -#[derive(Debug, Default, Clone)] -pub struct FanoutStats { - pub nodes_succeeded: usize, - pub nodes_failed: Vec, - /// Peer partial DataFrames dropped during coordinator merge (conversion failure). - pub peer_batches_dropped: usize, -} - -static LAST_FANOUT_STATS: LazyLock> = - LazyLock::new(|| Mutex::new(FanoutStats::default())); - -fn lock_fanout_stats() -> MutexGuard<'static, FanoutStats> { - crate::sync::lock_mutex(&LAST_FANOUT_STATS, "LAST_FANOUT_STATS") -} +pub use super::fanout_scope::FanoutStats; #[cfg(any(test, feature = "test-utils"))] fn lock_remote_query_hook() -> MutexGuard<'static, Option> { @@ -94,25 +83,13 @@ fn lock_remote_query_hook() -> MutexGuard<'static, Option> { } pub fn reset_fanout_stats() { - *lock_fanout_stats() = FanoutStats::default(); + current_fanout_stats_handle().reset(); } /// Record the fan-out outcome so callers (e.g. cluster fan-out meta) can report /// how many peers were actually queried and which ones failed. pub fn set_fanout_stats(stats: FanoutStats) { - *lock_fanout_stats() = stats; -} - -/// Increment the success counter for one peer (concurrency-safe). -/// -/// Used by streaming fan-out where each peer partition reports its own outcome. -pub fn record_fanout_success() { - lock_fanout_stats().nodes_succeeded += 1; -} - -/// Record a failed peer (concurrency-safe). -pub fn record_fanout_failure(addr: &str) { - lock_fanout_stats().nodes_failed.push(addr.to_string()); + current_fanout_stats_handle().set(stats); } /// Env var: when set to `1` or `true`, federated fan-out failures fail the query. @@ -156,12 +133,12 @@ pub fn enforce_fanout_strict(stats: &FanoutStats) -> Result<()> { } pub fn take_fanout_stats() -> FanoutStats { - std::mem::take(&mut *lock_fanout_stats()) + current_fanout_stats_handle().take() } -/// Check global fan-out stats without consuming them (for post-query validation). +/// Check request-scoped fan-out stats without consuming them. pub fn check_fanout_strict() -> Result<()> { - enforce_fanout_strict(&lock_fanout_stats()) + enforce_fanout_strict(¤t_fanout_stats_handle().snapshot()) } pub struct ProbeClusterExecutor; diff --git a/probing/core/src/core/federation/fanout_scope.rs b/probing/core/src/core/federation/fanout_scope.rs index b076006f..fc74238b 100644 --- a/probing/core/src/core/federation/fanout_scope.rs +++ b/probing/core/src/core/federation/fanout_scope.rs @@ -1,12 +1,10 @@ -//! Request-scoped fan-out tier for hierarchical cluster queries. +//! Request-scoped fan-out context for hierarchical cluster queries. //! //! Coordinator → node aggregators (local0) → on-node leaf ranks. -use std::cell::Cell; - -thread_local! { - static FANOUT_SCOPE: Cell = const { Cell::new(FanoutScope::Auto) }; -} +use std::cell::{Cell, RefCell}; +use std::future::Future; +use std::sync::{Arc, Mutex, MutexGuard}; /// How remote peers are selected for federated / cluster fan-out. #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] @@ -35,6 +33,85 @@ impl FanoutScope { } } +/// Outcome of a federated query's remote work. +#[derive(Debug, Default, Clone, PartialEq, Eq)] +pub struct FanoutStats { + pub nodes_succeeded: usize, + pub nodes_failed: Vec, + /// Peer partial DataFrames dropped during coordinator merge (conversion failure). + pub peer_batches_dropped: usize, +} + +/// Shareable stats sink captured by physical execution plans. +#[derive(Debug, Clone, Default)] +pub(crate) struct FanoutStatsHandle(Arc>); + +impl FanoutStatsHandle { + fn lock(&self) -> MutexGuard<'_, FanoutStats> { + self.0.lock().unwrap_or_else(|poisoned| { + log::error!("fan-out stats lock poisoned; recovering inner state"); + poisoned.into_inner() + }) + } + + pub(crate) fn reset(&self) { + *self.lock() = FanoutStats::default(); + } + + pub(crate) fn set(&self, stats: FanoutStats) { + *self.lock() = stats; + } + + pub(crate) fn record_success(&self) { + self.lock().nodes_succeeded += 1; + } + + pub(crate) fn record_failure(&self, addr: &str) { + self.lock().nodes_failed.push(addr.to_string()); + } + + pub(crate) fn take(&self) -> FanoutStats { + std::mem::take(&mut *self.lock()) + } + + pub(crate) fn snapshot(&self) -> FanoutStats { + self.lock().clone() + } +} + +#[derive(Clone)] +struct FanoutContext { + scope: Cell, + stats: FanoutStatsHandle, +} + +impl FanoutContext { + fn new(scope: FanoutScope) -> Self { + Self { + scope: Cell::new(scope), + stats: FanoutStatsHandle::default(), + } + } + + fn child(&self, scope: FanoutScope) -> Self { + Self { + scope: Cell::new(scope), + stats: self.stats.clone(), + } + } +} + +tokio::task_local! { + static FANOUT_CONTEXT: FanoutContext; +} + +thread_local! { + // Synchronous core callers and tests do not necessarily run inside a Tokio task. + // Async server entry points install `FANOUT_CONTEXT`. + static SYNC_FANOUT_CONTEXT: RefCell = + RefCell::new(FanoutContext::new(FanoutScope::Auto)); +} + /// Whether hierarchical fan-out is enabled (default on). pub fn hierarchical_fanout_enabled() -> bool { match std::env::var("PROBING_CLUSTER_FANOUT_HIERARCHICAL") { @@ -74,24 +151,112 @@ pub fn resolve_fanout_scope(scope: FanoutScope) -> FanoutScope { } pub fn set_fanout_scope(scope: FanoutScope) { - FANOUT_SCOPE.set(scope); + if FANOUT_CONTEXT + .try_with(|context| context.scope.set(scope)) + .is_err() + { + SYNC_FANOUT_CONTEXT.with(|context| context.borrow().scope.set(scope)); + } } pub fn current_fanout_scope() -> FanoutScope { - FANOUT_SCOPE.get() + FANOUT_CONTEXT + .try_with(|context| context.scope.get()) + .unwrap_or_else(|_| SYNC_FANOUT_CONTEXT.with(|context| context.borrow().scope.get())) } pub fn take_fanout_scope() -> FanoutScope { - let scope = FANOUT_SCOPE.get(); - FANOUT_SCOPE.set(FanoutScope::Auto); + let scope = current_fanout_scope(); + set_fanout_scope(FanoutScope::Auto); scope } /// Run ``f`` with a scoped fan-out tier (sync). pub fn with_fanout_scope(scope: FanoutScope, f: impl FnOnce() -> T) -> T { - let previous = FANOUT_SCOPE.get(); - FANOUT_SCOPE.set(scope); + let previous = current_fanout_scope(); + set_fanout_scope(scope); let out = f(); - FANOUT_SCOPE.set(previous); + set_fanout_scope(previous); out } + +/// Run a future with task-scoped fan-out state. +/// +/// Nested scopes share the same stats sink while overriding only the routing +/// tier. Tokio task migration is safe because the context moves with the +/// future instead of being attached to an executor thread. +pub async fn with_fanout_scope_async(scope: FanoutScope, future: F) -> F::Output +where + F: Future, +{ + let context = FANOUT_CONTEXT + .try_with(|parent| parent.child(scope)) + .unwrap_or_else(|_| FanoutContext::new(scope)); + FANOUT_CONTEXT.scope(context, future).await +} + +pub(crate) fn current_fanout_stats_handle() -> FanoutStatsHandle { + FANOUT_CONTEXT + .try_with(|context| context.stats.clone()) + .unwrap_or_else(|_| SYNC_FANOUT_CONTEXT.with(|context| context.borrow().stats.clone())) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::sync::Arc; + use tokio::sync::Barrier; + + #[tokio::test(flavor = "current_thread")] + async fn async_context_isolated_across_interleaved_tasks() { + let barrier = Arc::new(Barrier::new(2)); + let first_barrier = barrier.clone(); + let first = tokio::spawn(with_fanout_scope_async( + FanoutScope::Coordinator, + async move { + let stats = current_fanout_stats_handle(); + stats.record_success(); + first_barrier.wait().await; + tokio::task::yield_now().await; + (current_fanout_scope(), stats.take()) + }, + )); + + let second = tokio::spawn(with_fanout_scope_async(FanoutScope::Node, async move { + let stats = current_fanout_stats_handle(); + stats.record_failure("rank-1"); + barrier.wait().await; + tokio::task::yield_now().await; + (current_fanout_scope(), stats.take()) + })); + + let (first_scope, first_stats) = first.await.expect("first task"); + let (second_scope, second_stats) = second.await.expect("second task"); + + assert_eq!(first_scope, FanoutScope::Coordinator); + assert_eq!(first_stats.nodes_succeeded, 1); + assert!(first_stats.nodes_failed.is_empty()); + assert_eq!(second_scope, FanoutScope::Node); + assert_eq!(second_stats.nodes_succeeded, 0); + assert_eq!(second_stats.nodes_failed, vec!["rank-1"]); + } + + #[tokio::test] + async fn nested_scope_shares_request_stats() { + with_fanout_scope_async(FanoutScope::Coordinator, async { + let stats = current_fanout_stats_handle(); + stats.record_success(); + with_fanout_scope_async(FanoutScope::Node, async { + current_fanout_stats_handle().record_failure("rank-2"); + assert_eq!(current_fanout_scope(), FanoutScope::Node); + }) + .await; + + assert_eq!(current_fanout_scope(), FanoutScope::Coordinator); + let stats = stats.take(); + assert_eq!(stats.nodes_succeeded, 1); + assert_eq!(stats.nodes_failed, vec!["rank-2"]); + }) + .await; + } +} diff --git a/probing/core/src/core/federation/federated_scan_exec.rs b/probing/core/src/core/federation/federated_scan_exec.rs index 01f45537..5e4e5213 100644 --- a/probing/core/src/core/federation/federated_scan_exec.rs +++ b/probing/core/src/core/federation/federated_scan_exec.rs @@ -27,11 +27,9 @@ use datafusion::physical_plan::{ use futures::StreamExt; use probing_proto::prelude::{DataFrame, Node}; -use super::cluster_executor::{ - fanout_strict_enabled, record_fanout_failure, record_fanout_success, ProbeClusterExecutor, -}; +use super::cluster_executor::{fanout_strict_enabled, ProbeClusterExecutor}; use super::convert::{align_batch_to_schema, dataframe_to_record_batch, tag_record_batch}; -use super::fanout_scope::FanoutScope; +use super::fanout_scope::{FanoutScope, FanoutStatsHandle}; fn log_federated_peer_failure(context: &str, addr_tag: &str, detail: &str) { if fanout_strict_enabled() { @@ -61,12 +59,14 @@ pub struct FederatedScanExec { local_host: String, local_addr: String, local_rank: Option, + /// Request-owned sink; explicit because DataFusion may poll partitions in child tasks. + fanout_stats: FanoutStatsHandle, properties: Arc, } impl FederatedScanExec { #[allow(clippy::too_many_arguments)] - pub fn try_new( + pub(crate) fn try_new( local: Arc, output_schema: SchemaRef, projection: Vec, @@ -76,6 +76,7 @@ impl FederatedScanExec { local_host: String, local_addr: String, local_rank: Option, + fanout_stats: FanoutStatsHandle, ) -> Result { let projected_schema = Arc::new( output_schema @@ -100,6 +101,7 @@ impl FederatedScanExec { local_host, local_addr, local_rank, + fanout_stats, properties: Arc::new(properties), }) } @@ -142,6 +144,7 @@ impl FederatedScanExec { let full = self.output_schema.clone(); let projection = self.projection.clone(); let projected_schema = self.projected_schema.clone(); + let fanout_stats = self.fanout_stats.clone(); // Best-effort fetch: failures (network, conversion) drop the node from // the result set and are recorded in the fan-out stats rather than @@ -161,7 +164,7 @@ impl FederatedScanExec { &projection, ) { Ok(opt) => { - record_fanout_success(); + fanout_stats.record_success(); opt } Err(err) => { @@ -170,7 +173,7 @@ impl FederatedScanExec { &addr_tag, &err.to_string(), ); - record_fanout_failure(&addr_tag); + fanout_stats.record_failure(&addr_tag); None } }, @@ -180,7 +183,7 @@ impl FederatedScanExec { &addr_tag, &err.to_string(), ); - record_fanout_failure(&addr_tag); + fanout_stats.record_failure(&addr_tag); None } Err(err) => { @@ -189,7 +192,7 @@ impl FederatedScanExec { &addr_tag, &err.to_string(), ); - record_fanout_failure(&addr_tag); + fanout_stats.record_failure(&addr_tag); None } } @@ -280,6 +283,7 @@ impl ExecutionPlan for FederatedScanExec { local_host: self.local_host.clone(), local_addr: self.local_addr.clone(), local_rank: self.local_rank, + fanout_stats: self.fanout_stats.clone(), properties: self.properties.clone(), })) } diff --git a/probing/core/src/core/federation/global_table.rs b/probing/core/src/core/federation/global_table.rs index dd9a929b..e2bc5275 100644 --- a/probing/core/src/core/federation/global_table.rs +++ b/probing/core/src/core/federation/global_table.rs @@ -4,6 +4,7 @@ use super::cluster_executor::{reset_fanout_stats, ProbeClusterExecutor}; use super::convert::{ cluster_rank_for_endpoint, extend_projection_with_probe_tags, federated_output_schema, }; +use super::fanout_scope::current_fanout_stats_handle; use super::federated_scan_exec::FederatedScanExec; use super::sql_gen::build_remote_table_sql; use async_trait::async_trait; @@ -134,6 +135,7 @@ impl TableProvider for GlobalFederatedTable { host, addr, local_rank, + current_fanout_stats_handle(), )?; Ok(Arc::new(exec)) } diff --git a/probing/core/src/core/federation/mod.rs b/probing/core/src/core/federation/mod.rs index 9d4b350d..a206f3cd 100644 --- a/probing/core/src/core/federation/mod.rs +++ b/probing/core/src/core/federation/mod.rs @@ -29,7 +29,7 @@ pub use convert::{ }; pub use fanout_scope::{ current_fanout_scope, hierarchical_fanout_enabled, is_local0_from_env, resolve_fanout_scope, - set_fanout_scope, take_fanout_scope, with_fanout_scope, FanoutScope, + set_fanout_scope, take_fanout_scope, with_fanout_scope, with_fanout_scope_async, FanoutScope, }; pub use global_catalog::{install_global_catalog, GLOBAL_CATALOG}; pub use query_guard::{ diff --git a/probing/extensions/python/src/extensions/python/exttbls.rs b/probing/extensions/python/src/extensions/python/exttbls.rs index f61c5fe5..e6f160dd 100644 --- a/probing/extensions/python/src/extensions/python/exttbls.rs +++ b/probing/extensions/python/src/extensions/python/exttbls.rs @@ -9,8 +9,10 @@ //! query-side materialisation happens in whoever runs the SQL. //! //! The first appended row fixes the column dtypes (the Python API only -//! declares column names). A leading `timestamp` column (microseconds since -//! epoch, `I64`) is always present, matching the previous TimeSeries layout. +//! declares column names). Later values are coerced to that stable schema; +//! dtype variation never recreates the mmap or discards existing rows. A +//! leading `timestamp` column (microseconds since epoch, `I64`) is always +//! present, matching the previous TimeSeries layout. use std::collections::HashMap; use std::sync::{Arc, Mutex, MutexGuard}; @@ -210,10 +212,10 @@ fn ring_chunk_bytes(capacity: usize) -> u32 { /// Column dtype inferred from the first appended value. fn ele_dtype(e: &Ele) -> DType { match e { - Ele::I32(_) => DType::I32, - Ele::I64(_) => DType::I64, - Ele::F32(_) => DType::F32, - Ele::F64(_) => DType::F64, + // Python has one integer and one float type. Use the wide MEMT + // representations so later values cannot force a schema change. + Ele::I32(_) | Ele::I64(_) => DType::I64, + Ele::F32(_) | Ele::F64(_) => DType::F64, Ele::BOOL(_) => DType::U8, Ele::DataTime(_) => DType::U64, Ele::Text(_) | Ele::Url(_) | Ele::Nil => DType::Str, @@ -280,6 +282,8 @@ pub struct ExternBacking { columns: Vec, capacity_bytes: usize, dtypes: Vec, + /// False only for the empty placeholder schema used for SQL discovery. + schema_fixed: bool, table: Option, table_doc: Option, column_docs: HashMap, @@ -301,6 +305,7 @@ impl ExternBacking { columns, capacity_bytes, dtypes: vec![], + schema_fixed: false, table: None, table_doc, column_docs, @@ -331,14 +336,36 @@ impl ExternBacking { } fn ensure_table(&mut self, first_row: &[Ele]) -> Result<(), ExternTableError> { - let dtypes: Vec = first_row.iter().map(ele_dtype).collect(); + if self.schema_fixed { + return Ok(()); + } + + // `ensure_registered` creates an empty, name-inferred placeholder so + // DESCRIBE works before the first sample. The first row may replace + // that empty mapping once; after this point the schema is immutable. + // A leading None keeps the useful name-inferred dtype instead of + // fixing the whole column to Str. + let dtypes: Vec = first_row + .iter() + .zip(self.dtypes.iter().copied()) + .map(|(value, inferred)| { + if matches!(value, Ele::Nil) { + inferred + } else { + ele_dtype(value) + } + }) + .collect(); if self.table.is_some() && self.dtypes == dtypes { + self.schema_fixed = true; return Ok(()); } + + // The placeholder contains no rows, so this one-time replacement is + // non-destructive. Never enter this branch after `schema_fixed`. self.table = None; self.dtypes.clear(); - let dtypes: Vec = first_row.iter().map(ele_dtype).collect(); let schema = build_schema_with_docs( &self.name, &self.columns, @@ -350,6 +377,7 @@ impl ExternBacking { let filename = mmap_basename(&self.name); let table = ExposedTable::create(&filename, &schema, chunk_bytes, NUM_CHUNKS)?; self.dtypes = dtypes; + self.schema_fixed = true; self.table = Some(table); Ok(()) } @@ -812,6 +840,53 @@ if not hasattr(probing, "_made_{name}"): ); } + #[test] + fn dtype_widening_does_not_recreate_table_or_drop_rows() { + setup(); + let name = format!("dtype_widening_{}", std::process::id()); + let mut backing = ExternBacking::new( + &name, + vec!["value".to_string()], + 1_000_000, + None, + HashMap::new(), + ); + backing.ensure_registered().unwrap(); + + backing.append(1, &[Ele::I32(7)]).unwrap(); + backing + .append(2, &[Ele::I64(i64::from(i32::MAX) + 1)]) + .unwrap(); + + let rows = backing.take(None); + assert_eq!(rows.len(), 2, "dtype changes must not truncate old rows"); + assert_eq!(backing.dtypes, vec![DType::I64]); + assert_eq!(rows[0].1, vec![Ele::I64(7)]); + assert_eq!(rows[1].1, vec![Ele::I64(i64::from(i32::MAX) + 1)]); + } + + #[test] + fn optional_value_does_not_recreate_table_or_drop_rows() { + setup(); + let name = format!("optional_value_{}", std::process::id()); + let mut backing = ExternBacking::new( + &name, + vec!["rank".to_string()], + 1_000_000, + None, + HashMap::new(), + ); + backing.ensure_registered().unwrap(); + + backing.append(1, &[Ele::I32(3)]).unwrap(); + backing.append(2, &[Ele::Nil]).unwrap(); + + let rows = backing.take(None); + assert_eq!(rows.len(), 2, "optional values must not truncate old rows"); + assert_eq!(backing.dtypes, vec![DType::I64]); + assert_eq!(rows[0].1, vec![Ele::I64(3)]); + } + #[test] fn test_create_table_in_python() { setup(); diff --git a/probing/server/src/engine.rs b/probing/server/src/engine.rs index d92c43bd..f49e5810 100644 --- a/probing/server/src/engine.rs +++ b/probing/server/src/engine.rs @@ -13,7 +13,9 @@ use probing_core::config; use crate::server::error::{ApiError, ApiResult}; -use probing_core::core::federation::{reset_fanout_stats, take_fanout_stats}; +use probing_core::core::federation::{ + reset_fanout_stats, take_fanout_stats, with_fanout_scope_async, FanoutScope, +}; use probing_core::core::UnifiedMemtableProbeDataSource; pub use probing_core::ENGINE; use probing_python::extensions::python::PythonProbeDataSource; @@ -187,6 +189,10 @@ pub struct QueryHttpEnvelope { // 处理Web API查询请求 pub async fn query(req: String) -> ApiResult { + with_fanout_scope_async(FanoutScope::Auto, query_in_fanout_context(req)).await +} + +async fn query_in_fanout_context(req: String) -> ApiResult { let request = serde_json::from_str::>(&req); let request = match request { Ok(request) => request.payload, diff --git a/probing/server/src/mcp/helpers.rs b/probing/server/src/mcp/helpers.rs index 3dac25eb..48ef896e 100644 --- a/probing/server/src/mcp/helpers.rs +++ b/probing/server/src/mcp/helpers.rs @@ -2,7 +2,9 @@ use std::collections::HashMap; -use probing_core::core::federation::{fanout_strict_enabled, take_fanout_stats}; +use probing_core::core::federation::{ + fanout_strict_enabled, take_fanout_stats, with_fanout_scope_async, FanoutScope, +}; use probing_core::core::ProbeExtensionManager; use probing_proto::prelude::{Ele, Query, QueryDataFormat}; use rmcp::ErrorData; @@ -99,15 +101,18 @@ pub(crate) async fn extension_request(path: &str, body: &[u8]) -> Result pub async fn engine_query_json(sql: String, limit: usize) -> Result { crate::server::sql_guard::ensure_read_only_sql(&sql).map_err(tool_error)?; - let reply = handle_query(Query { - expr: sql, - opts: None, + with_fanout_scope_async(FanoutScope::Auto, async move { + let reply = handle_query(Query { + expr: sql, + opts: None, + }) + .await + .map_err(tool_error_from)?; + let mut payload = dataframe_reply_to_json(reply, limit)?; + attach_fanout_quality(&mut payload)?; + Ok(payload) }) .await - .map_err(tool_error_from)?; - let mut payload = dataframe_reply_to_json(reply, limit)?; - attach_fanout_quality(&mut payload)?; - Ok(payload) } /// Surface federated / global-table fan-out completeness when peers were dropped. diff --git a/probing/server/src/server/cluster_fanout.rs b/probing/server/src/server/cluster_fanout.rs index d9a15385..6dc9a6d1 100644 --- a/probing/server/src/server/cluster_fanout.rs +++ b/probing/server/src/server/cluster_fanout.rs @@ -18,10 +18,10 @@ use probing_core::core::cluster::{ local_listen_addrs, node_aggregator_peers, }; use probing_core::core::federation::{ - can_fanout_via_global_catalog, cluster_rank_for_endpoint, current_fanout_scope, - enforce_fanout_strict, fanout_strict_enabled, is_local0_from_env, remote_fanout_concurrency, - remote_query_timeout, reset_fanout_stats, rewrite_sql_for_global_fanout, set_fanout_scope, - take_fanout_stats, validate_global_query, FanoutScope, FanoutStats, + can_fanout_via_global_catalog, cluster_rank_for_endpoint, enforce_fanout_strict, + fanout_strict_enabled, is_local0_from_env, remote_fanout_concurrency, remote_query_timeout, + reset_fanout_stats, rewrite_sql_for_global_fanout, take_fanout_stats, validate_global_query, + with_fanout_scope_async, FanoutScope, FanoutStats, }; use probing_proto::prelude::*; @@ -49,20 +49,9 @@ pub async fn query_local_df(sql: &str) -> anyhow::Result { } } -struct FanoutScopeGuard(FanoutScope); - -impl Drop for FanoutScopeGuard { - fn drop(&mut self) { - set_fanout_scope(self.0); - } -} - -/// Run a local query with a thread-local fan-out tier, without blocking the async runtime. +/// Run a local query with a task-local fan-out tier. async fn query_local_df_in_scope(scope: FanoutScope, sql: &str) -> anyhow::Result { - let previous = current_fanout_scope(); - set_fanout_scope(scope); - let _guard = FanoutScopeGuard(previous); - query_local_df(sql).await + with_fanout_scope_async(scope, query_local_df(sql)).await } pub async fn remote_query_df(addr: &str, sql: &str) -> anyhow::Result { @@ -310,6 +299,19 @@ pub async fn fanout_query( cluster: bool, hierarchical: bool, scope: ClusterFanoutScope, +) -> anyhow::Result { + with_fanout_scope_async( + FanoutScope::Auto, + fanout_query_in_context(sql, cluster, hierarchical, scope), + ) + .await +} + +async fn fanout_query_in_context( + sql: &str, + cluster: bool, + hierarchical: bool, + scope: ClusterFanoutScope, ) -> anyhow::Result { if cluster { validate_global_query(sql)?; diff --git a/python/probing/profiling/__init__.py b/python/probing/profiling/__init__.py index 130f9528..2fe9c1df 100644 --- a/python/probing/profiling/__init__.py +++ b/python/probing/profiling/__init__.py @@ -1,15 +1,12 @@ -""" -Profiling Tools +"""Profiling collectors, including two independent PyTorch paths. -Spec ----- -This package provides specialized profiling tools for AI workloads. +``torch_probe`` is sampled, long-running module/step telemetry. It writes mmap +tables such as ``python.torch_trace`` and ``python.torch_step_timing``. -Responsibilities: -1. Collective communication profiling (NCCL/distributed ops). -2. Framework-specific profiling (e.g., PyTorch Module/Optimizer steps). +``torch_profiler`` controls explicit short ``torch.profiler`` / Kineto captures. +It keeps bounded capture state in process and exposes conclusion-oriented virtual +tables, ``python.profile_capture`` and ``python.profile_hotspot``. -Submodules: -- `collective`: Distributed communication analysis. -- `torch`: PyTorch specific profiling logic. +The paths do not start, stop, or configure one another. They correlate only by +training coordinates in SQL, and their overheads add when both are active. """ diff --git a/python/probing/profiling/torch_probe.py b/python/probing/profiling/torch_probe.py index c1f1e274..c783e9a3 100644 --- a/python/probing/profiling/torch_probe.py +++ b/python/probing/profiling/torch_probe.py @@ -1,3 +1,16 @@ +"""Long-running sampled PyTorch module and step telemetry. + +TorchProbe is independent from the on-demand ``torch_profiler`` package. This +module installs lightweight training hooks, applies step/layer sampling and +shadow baselines, and writes mmap tables such as ``python.torch_trace`` and +``python.torch_step_timing``. It never starts or owns a ``torch.profiler`` / +Kineto session. + +Use TorchProbe to locate a persistently slow step, rank, or module. Use +``probing.profiling.torch_profiler`` separately when that target needs a short +op/kernel-level capture. If both paths run together, their overheads add. +""" + import hashlib import logging import os @@ -246,9 +259,10 @@ class Variables: class TorchProbeConfig: """Configuration container for TorchProbe runtime behaviour. - Torch profiling is designed for long-running, always-on module-level - telemetry (not episodic ``torch.profiler`` windows). There is no warmup - schedule: skip early steps in SQL (``WHERE step > N``) when needed. + TorchProbe is designed for long-running, always-on module-level telemetry, + not episodic ``torch.profiler`` windows. This configuration never controls + Kineto. There is no warmup schedule: skip early steps in SQL + (``WHERE step > N``) when needed. Sampling (``PROBING_TORCH_PROFILING`` prefix token — ``rate[:layer_rate]``): @@ -478,16 +492,18 @@ def apply_shadow_spec(self, value: str) -> None: self.shadow_baseline = baseline -# Configuration key in probing.config +# TorchProbe-only configuration key in probing.config. The historical +# ``profiling`` name does not configure or start ``torch.profiler`` / Kineto. # Rust sync_env_settings() converts PROBING_TORCH_PROFILING to probing.torch.profiling _CONFIG_KEY = "probing.torch.profiling" def configure(spec: Optional[str] = None) -> TorchProbeConfig: - """Set a process-wide Torch profiling configuration. + """Set the process-wide TorchProbe telemetry configuration. This function stores the configuration in probing.config for persistence - and sharing between Python and Rust. + and sharing between Python and Rust. It does not configure or start the + independent ``probing.profiling.torch_profiler`` capture path. Parameters ---------- @@ -1036,6 +1052,13 @@ def trace_variables(self): class TorchProbe(BaseTracer, Timer, Sampler, PythonTracer, VariableTracer): + """Sample module hooks across training for long-running SQL telemetry. + + This tracer owns TorchProbe hook, sampling, deferred timing, and memtable + state only. It does not wrap or configure ``torch.profiler``; the independent + on-demand controller lives in :mod:`probing.profiling.torch_profiler`. + """ + def __init__(self, config: Optional[TorchProbeConfig] = None): if config is None: config = TorchProbeConfig(enabled=True) diff --git a/python/probing/profiling/torch_profiler/__init__.py b/python/probing/profiling/torch_profiler/__init__.py index 0608bd34..eaabf55e 100644 --- a/python/probing/profiling/torch_profiler/__init__.py +++ b/python/probing/profiling/torch_profiler/__init__.py @@ -1,4 +1,9 @@ -"""On-demand torch.profiler → conclusion-driven SQL tables (profile_capture / profile_hotspot).""" +"""On-demand ``torch.profiler`` / Kineto capture and virtual SQL tables. + +This package is independent from :mod:`probing.profiling.torch_probe`: it owns +short capture sessions and bounded in-process results, not long-running module +hooks or memtables. Starting either path does not configure the other. +""" from .controller import ProfilerController, get_controller, profiler_status from .session_store import SessionStore, get_session_store diff --git a/python/probing/profiling/torch_profiler/controller.py b/python/probing/profiling/torch_profiler/controller.py index 3d47b8fb..ad6f15ff 100644 --- a/python/probing/profiling/torch_profiler/controller.py +++ b/python/probing/profiling/torch_profiler/controller.py @@ -1,4 +1,9 @@ -"""ProfilerController: short-window torch.profiler with SQL row materialization.""" +"""Short-window ``torch.profiler`` control with SQL row materialization. + +This is the on-demand, op/kernel-level path. It is independent from TorchProbe's +sampled module telemetry: no TorchProbe hooks, buffers, sampling configuration, +or shadow baseline are reused here. +""" from __future__ import annotations @@ -29,7 +34,13 @@ def _now_us() -> int: class ProfilerController: - """Drive torch.profiler for N optimizer steps and publish hotspot rows.""" + """Drive ``torch.profiler`` for N optimizer steps and publish hotspot rows. + + Captures stay in the bounded :class:`SessionStore` and are exposed through + ``python.profile_capture`` / ``python.profile_hotspot``. They are not written + to TorchProbe's mmap tables. If TorchProbe is active for the same steps, both + collectors run independently and their overheads add. + """ def __init__(self) -> None: self._lock = threading.RLock() From be610a2688baba3edbf65495d4e913988179cd63 Mon Sep 17 00:00:00 2001 From: Reiase Date: Mon, 27 Jul 2026 09:45:11 +0800 Subject: [PATCH 23/37] Add next-generation diagnostics UI (#76) --- .github/workflows/pypi.yml | 8 +- .github/workflows/test.yml | 8 +- Makefile | 2 + REVIEW.md | 183 +++ REVIEW_COMPARISON.md | 784 ++++++++++++ REVIEW_METHODOLOGY.md | 420 +++++++ probing/cli/src/cli/skill/backend.rs | 17 +- probing/crates/skills/src/backend.rs | 6 +- probing/crates/skills/src/runner.rs | 70 +- probing/server/src/mcp/skill_backend.rs | 10 +- .../bundled_web/public/assets/tailwind.css | 273 +++++ ...34ffc43ea1.js => web-dxh3f25885a213214.js} | 6 +- .../public/assets/web-dxh3f25885a213214.js.br | Bin 0 -> 13337 bytes .../assets/web-dxh50ad7a34ffc43ea1.js.br | Bin 13319 -> 0 bytes .../assets/web_bg-dxh397f70ff35dbc871.wasm | Bin 0 -> 5893374 bytes .../assets/web_bg-dxh397f70ff35dbc871.wasm.br | Bin 0 -> 1179846 bytes .../assets/web_bg-dxh9628c8b4a0d6e07b.wasm | Bin 5365209 -> 0 bytes .../assets/web_bg-dxh9628c8b4a0d6e07b.wasm.br | Bin 1103986 -> 0 bytes python/probing/bundled_web/public/index.html | 6 +- scripts/prune-bundled-web.sh | 17 +- scripts/verify_web_assets.py | 100 ++ scripts/verify_wheel_contents.py | 18 + tests/unit/probing/test_web_assets.py | 54 + web/DESIGN.md | 66 + web/assets/tailwind.css | 273 +++++ web/index.html | 2 +- web/src/agent/runner.rs | 4 +- web/src/agent/skills_backend.rs | 11 +- web/src/api/cpu.rs | 359 +++--- web/src/api/gpu.rs | 341 +++--- web/src/components/profiling/sections.rs | 2 +- web/src/components/sidebar/mod.rs | 2 +- web/src/components/sidebar/profiling/mod.rs | 2 +- web/src/main.rs | 8 +- web/src/next/components.rs | 177 +++ web/src/next/mod.rs | 22 + web/src/next/model.rs | 205 ++++ web/src/next/pages/capabilities.rs | 126 ++ web/src/next/pages/dashboard.rs | 465 ++++++++ web/src/next/pages/distributed.rs | 278 +++++ web/src/next/pages/explore.rs | 94 ++ web/src/next/pages/investigate.rs | 338 ++++++ web/src/next/pages/mod.rs | 20 + web/src/next/pages/profiles.rs | 36 + web/src/next/pages/training.rs | 29 + web/src/next/routes.rs | 152 +++ web/src/next/settings.rs | 13 + web/src/next/shell.rs | 469 ++++++++ web/src/next/sidebar.rs | 1060 +++++++++++++++++ web/src/pages/profiling.rs | 4 +- web/src/pages/rl/inference.rs | 66 +- web/src/pages/rl/mod.rs | 38 +- web/src/pages/traces.rs | 59 +- web/src/pages/training.rs | 71 +- web/src/state/inference.rs | 5 + web/src/state/mod.rs | 2 + web/src/state/profiling.rs | 1 + web/src/state/rl.rs | 1 + web/src/state/training.rs | 6 + web/src/ui_version.rs | 180 +++ 60 files changed, 6501 insertions(+), 468 deletions(-) create mode 100644 REVIEW.md create mode 100644 REVIEW_COMPARISON.md create mode 100644 REVIEW_METHODOLOGY.md rename python/probing/bundled_web/public/assets/{web-dxh50ad7a34ffc43ea1.js => web-dxh3f25885a213214.js} (69%) create mode 100644 python/probing/bundled_web/public/assets/web-dxh3f25885a213214.js.br delete mode 100644 python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js.br create mode 100644 python/probing/bundled_web/public/assets/web_bg-dxh397f70ff35dbc871.wasm create mode 100644 python/probing/bundled_web/public/assets/web_bg-dxh397f70ff35dbc871.wasm.br delete mode 100644 python/probing/bundled_web/public/assets/web_bg-dxh9628c8b4a0d6e07b.wasm delete mode 100644 python/probing/bundled_web/public/assets/web_bg-dxh9628c8b4a0d6e07b.wasm.br create mode 100644 scripts/verify_web_assets.py create mode 100644 web/src/next/components.rs create mode 100644 web/src/next/mod.rs create mode 100644 web/src/next/model.rs create mode 100644 web/src/next/pages/capabilities.rs create mode 100644 web/src/next/pages/dashboard.rs create mode 100644 web/src/next/pages/distributed.rs create mode 100644 web/src/next/pages/explore.rs create mode 100644 web/src/next/pages/investigate.rs create mode 100644 web/src/next/pages/mod.rs create mode 100644 web/src/next/pages/profiles.rs create mode 100644 web/src/next/pages/training.rs create mode 100644 web/src/next/routes.rs create mode 100644 web/src/next/settings.rs create mode 100644 web/src/next/shell.rs create mode 100644 web/src/next/sidebar.rs create mode 100644 web/src/state/inference.rs create mode 100644 web/src/state/training.rs create mode 100644 web/src/ui_version.rs diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index b75e7c45..eb057b42 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -110,13 +110,7 @@ jobs: - name: Prepare wheel bundle shell: bash run: | - rm -rf python/probing/bundled_web - cd web && dx bundle --release - test -f python/probing/bundled_web/public/index.html - mkdir -p python/probing/bundled_web/public/assets - cp -f web/assets/logo.svg python/probing/bundled_web/public/logo.svg 2>/dev/null || true - cp -f web/assets/logo.svg python/probing/bundled_web/public/assets/logo.svg 2>/dev/null || true - cp -f web/assets/tailwind.css python/probing/bundled_web/public/assets/tailwind.css + make frontend test -f python/probing/bundled_skills/catalog.yaml - name: Build wheels diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9d33e773..1bd93a9a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -208,13 +208,7 @@ jobs: - name: Prepare wheel bundle shell: bash run: | - rm -rf python/probing/bundled_web - cd web && dx bundle --release - test -f python/probing/bundled_web/public/index.html - mkdir -p python/probing/bundled_web/public/assets - cp -f web/assets/logo.svg python/probing/bundled_web/public/logo.svg 2>/dev/null || true - cp -f web/assets/logo.svg python/probing/bundled_web/public/assets/logo.svg 2>/dev/null || true - cp -f web/assets/tailwind.css python/probing/bundled_web/public/assets/tailwind.css + make frontend test -f python/probing/bundled_skills/catalog.yaml - name: Build wheel diff --git a/Makefile b/Makefile index 806dde0c..90183ecc 100644 --- a/Makefile +++ b/Makefile @@ -215,12 +215,14 @@ frontend: @cp -f web/assets/logo.svg $(BUNDLED_WEB_PUBLIC)/logo.svg 2>/dev/null || true @cp -f web/assets/logo.svg $(BUNDLED_WEB_PUBLIC)/assets/logo.svg 2>/dev/null || true @cp -f web/assets/tailwind.css $(BUNDLED_WEB_PUBLIC)/assets/tailwind.css + @$(PYTHON) scripts/verify_web_assets.py $(BUNDLED_WEB_PUBLIC) @rm -rf web/dist @ln -sfn ../python/probing/bundled_web/public web/dist @echo "$(BUNDLED_WEB_PUBLIC) ($$(du -sh $(BUNDLED_WEB_PUBLIC) | cut -f1))" wheel-bundle: @test -f $(BUNDLED_WEB_PUBLIC)/index.html || { echo "error: run 'make frontend' first"; exit 1; } + @$(PYTHON) scripts/verify_web_assets.py $(BUNDLED_WEB_PUBLIC) @test -f python/probing/bundled_skills/catalog.yaml \ || { echo "error: missing python/probing/bundled_skills/catalog.yaml"; exit 1; } diff --git a/REVIEW.md b/REVIEW.md new file mode 100644 index 00000000..e2067a38 --- /dev/null +++ b/REVIEW.md @@ -0,0 +1,183 @@ +# Probing 项目设计与实现评审报告 + +## 一、项目概览 + +**Probing** 是一个面向分布式 AI 训练的 Agent-Native 性能诊断系统。它通过 Rust 引擎提供 SQL 查询能力,通过 Python 插件实现训练侧数据采集,通过联邦查询实现跨 rank 诊断,并通过 Skills 系统将诊断知识固化为可执行的自动化流程。 + +| 维度 | 数据 | +|------|------| +| Rust 代码(不含 web) | ~86,290 行 | +| Python SDK | ~15,188 行 | +| Web UI (Dioxus WASM) | ~21,479 行 | +| 测试代码 | ~7,694 行 | +| Skills 定义 (YAML+MD) | ~3,555 行 | +| Workspace crate 数 | 15 | +| 诊断 Skill 数 | 13 | +| 当前版本 | 0.2.5 (Beta) | + +--- + +## 二、架构设计评价 + +### 2.1 四层分层架构 + +项目定义了清晰的四层架构模型: + +``` +L4 Experience ─ skills/ · web/ · Python hooks (UX, 诊断剧本) +L3 Control ─ probing/server · probing/cli (HTTP, MCP, inject, fan-out) +L2 Collectors ─ probing/extensions/* · python/probing/profiling (指标采集) +L1 Platform ─ probing/core · memtable · proto (SQL引擎, 联邦, 存储格式) +``` + +**亮点:** +- 依赖方向严格向下流动,proto 不依赖任何上层,core 不依赖 collectors +- 组合根(composition root)只存在于 `probing/server/src/engine.rs`,不在 L2 层散布组装逻辑 +- `modularity.md` 文档以表格形式追踪已知技术债务,标注"Done"/"Accepted"状态 +- 6 个公共接口契约(`ProbeDataSource`、`ProbeExtension`、`@table`、`skills/*/steps.yaml`、proto DTOs、Federation tags)定义了模块间的交互边界 + +**不足:** +- `probing-python` 扩展以 53K 行占据全部 extensions 的 84%,承载了 spy/crash/pprof/torch/tracing/repl/flamegraph 等多个独立功能域,内部高内聚但 crate 级别缺乏拆分 +- modularity.md 中将此标记为 "Accepted"(maturin 单 wheel 约束),属于架构决策而非疏忽 + +### 2.2 核心引擎设计 + +**DataFusion 作为 SQL 引擎**是最重要的架构决策。不重新发明 SQL parser/optimizer/executor,而是嵌入 Apache DataFusion,所有自定义表只需实现 `TableProvider` trait。这使用户可以使用标准 SQL(JOIN、窗口函数、CTE、子查询)查询运行时数据。 + +`EngineBuilder` 采用 Builder 模式链式构建引擎,`ENGINE: Lazy>` 作为进程级单例。两个核心 trait 分离关注点: +- `ProbeDataSource`:注册 SQL 表(数据面) +- `ProbeExtension`:提供配置 + HTTP API(控制面) + +### 2.3 联邦查询系统 + +联邦模块(~3,066 行)是项目最具技术深度的部分,采用三路径路由策略: + +| 路径 | 适用场景 | 机制 | +|------|---------|------| +| Path A: AggregatePushdown | 单表 `global.*` + merge-safe 聚合 | 将 SUM/COUNT/MIN/MAX 下推到各 rank,合并结果 | +| Path B: FederatedScan | 单表 `global.*` 非 pushdown | Lazy 分区扫描,流式拉取 | +| Path C: Broadcast | JOIN/CTE/UNION/子查询 | 全量广播到每个 rank,本地执行后合并 | + +路由基于 `sqlparser-rs` AST 级别分析,而非字符串匹配。查询护栏强制 broadcast 路径需要 LIMIT,自动为无 LIMIT 的 federated scan 注入 `LIMIT 10000`。每行联邦数据自动附加 6 个标签列(`_host`, `_addr`, `_rank`, `_node_rank`, `_local_rank`, `_role`)。 + +### 2.4 Memtable 存储格式 + +自描述二进制格式 MEMT,核心设计: + +- **环形缓冲区 + generation**:固定数量 chunk 组成环形缓冲,chunk 回收时 generation+1,读者通过比较 generation 前后值检测并丢弃回收 chunk +- **单写者 + 无锁读者**:写者通过 `&mut self` 保证排他,读者通过 `Acquire`/`Release` 内存序完全无锁 +- **三种后端统一抽象**:Heap(进程内)、Shm(POSIX `shm_open` 跨进程)、File(mmap 持久化) +- **per-chunk 字符串去重**:`DedupState` 在 chunk 范围内对重复字符串做哈希去重,存储为 4 字节回引用,可节省 20%+ 空间 + +这是整个项目中设计最精巧的组件之一。训练进程写入 mmap 文件,probing 服务器通过同一文件读取——零拷贝、零序列化。 + +### 2.5 Skills 诊断剧本系统 + +声明式诊断知识系统,每个 skill 由 `SKILL.md`(人类文档)+ `steps.yaml`(机器可执行)组成。`SkillBackend` trait 抽象了查询执行,使同一套 skill 可以在 CLI、Web WASM、MCP 三种环境中运行。 + +**亮点:** +- `resolve_use_global()` 自动检测 peer 数量决定是否使用 global 查询 +- `cluster_integrity_findings()` 将不完整的 fanout 自动提升为 error 级 finding +- `ensure_read_only_sql()` 强制 skill 步骤只执行 SELECT 类查询 + +**不足:** +- `expand_template` 使用朴素 `str::replace`,缺乏转义机制(实际风险低但理论上存在) +- interpretation rules 的 `when` 语法是自定义 DSL,如 `step:xxx | column:yyy | max/min(ratio) > 1.5`,非标准表达式引擎 + +--- + +## 三、实现质量评价 + +### 3.1 出色的工程实现 + +**1. TorchProbe 采样引擎**(Python, 1554 行) + +多重继承的 Mixin 架构 `TorchProbe(BaseTracer, Timer, Sampler, PythonTracer, VariableTracer)`,三个关键设计: + +- **分层采样**:`_sample_period = round(1/rate)`,每周期恰好采样一个 step,均匀分布。使用 `blake2b` 哈希确保跨 rank 一致且不扰动宿主 RNG 流 +- **Shadow Step 机制**:4:1 节奏(4 个 probed step + 1 个 baseline),shadow step 完全跳过 hook 仅记录墙钟时间,用于量化探测开销本身 +- **延迟 GPU 事件读取**:采样步将 `DelayedRecord` 存入 `_deferred` 列表,至少等待 3 步(`_DEFER_MIN_SETTLE`)才尝试非阻塞 `event.query()`,最多延迟 16 步(`_DEFER_MAX_LAG`)后强制 synchronize。后台线程 `DeferredDrainWorker` 异步执行保存 + +**2. 错误处理链** + +`EngineError` 采用 `thiserror`,通过 `#[from]` 自动转换保持完整因果链。明确拒绝 `From` 防止"字符串化"错误类型。单一边界转换 `EngineError -> DataFusionError` 避免了每个调用点重复映射。生产路径禁止 `unwrap`/`expect`/`panic!`。 + +**3. NCCL Profiler 直接符号导出** + +`nccl-profiler` 作为 cdylib 编译,直接导出 `ncclProfiler_v3` 和 `ncclProfiler_v4` C 符号。NCCL 运行时通过 dlopen 加载此符号,实现零侵入的 NCCL 操作采集。pool/pressure 机制避免了在高频采集路径上分配内存。 + +**4. Python 三层导入模式** + +通过 `is_lightweight_module()` 和 `is_probing_cli()` 区分三种加载模式,解决了 `import probing` 副作用问题——很多场景下用户只需要检查版本,不希望启动整个 Rust 引擎。 + +**5. 跨平台 GPU 后端抽象** + +GPU 扩展通过 `backend/registry.rs` 实现多后端:macOS(ioreg + sysctl)、NVIDIA(nvidia-smi)、统一 trait 接口。同时考虑了非 NVIDIA 生态(华为昇腾 HCCL shim)。 + +### 3.2 测试体系 + +两层测试结构:unit(快、隔离)和 regression(集成、契约、E2E)。 + +**亮点:** +- Rust 内嵌测试覆盖充分:`engine.rs` 780 行测试、`memtable.rs` 1,030 行测试(含 4 线程并发读写测试) +- `test_torch_probe_sampling.py`(815 行)覆盖了 settle window、force flush、RNG 不变性、inplace ReLU 兼容等边界条件 +- `api_spec.json` 作为 HTTP API 契约 SSOT,`TOP_LEVEL_ROUTES` 常量与之对齐 + +**不足:** +- `test_engine.py` 仅 24 行,Python 核心层测试覆盖不足 +- 缺少多进程 mock 的端到端联邦测试(主要通过进程内 `set_remote_query_hook` 模拟) +- `aggregate_pushdown.rs`(642 行复杂 SQL AST 操作)的测试覆盖度需验证 + +### 3.3 值得关注的技术债务 + +| # | 问题 | 严重度 | 说明 | +|---|------|--------|------| +| 1 | `probing-python` crate 过度膨胀 | 中 | 53K 行承载多个独立功能域,maturin 单 wheel 约束导致 | +| 2 | CPython 版本绑定维护负担 | 中 | 12 个版本(v2.7~v3.13)的内部结构偏移绑定,每次 CPython 更新需新增 | +| 3 | `memtable_sql.rs` 职责过重 | 中 | 2,125 行承载 mmap 发现、schema 推断、冷热分层、compaction 等 | +| 4 | 字符串匹配的错误处理 | 低 | `is_missing_table_error` 使用 `msg.contains("not found")` 判断 | +| 5 | `expand_template` 缺乏转义 | 低 | 朴素 `str::replace`,实际风险低但理论存在 | +| 6 | `ext/ray.py` 使用 `hash()` 生成 ID | 低 | Python hash 随机化导致不可复现 | +| 7 | 部分 `ext/` 异常处理过宽 | 低 | bare `except Exception: pass` 可能隐藏 bug | + +--- + +## 四、架构决策评价 + +### 4.1 优秀决策 + +1. **DataFusion 而非自研 SQL 引擎** — 避免了重新发明 parser/optimizer/executor 的巨大成本,同时获得了标准 SQL 兼容性 +2. **mmap 共享内存作为 IPC** — 三种后端统一了进程内/跨进程/持久化场景,零拷贝零序列化 +3. **声明式 Skills 系统** — 诊断知识以 YAML+MD 形式存在,新增诊断不需要重新编译 Rust +4. **联邦三路径路由** — 基于查询语义选择最优执行路径,避免一刀切的 fan-out 开销 +5. **MCP 协议集成** — 让 AI Agent 可以直接查询引擎、运行诊断 skill,写入操作受环境变量控制 +6. **Rust 核心 + Python 薄包装** — 性能关键路径在 Rust,灵活性需求在 Python,PyO3 桥接 + +### 4.2 可改进方向 + +1. **`probing-python` 拆分** — 即使 maturin 约束存在,也可以通过 feature gate 在逻辑上拆分子模块 +2. **结构化错误匹配** — 将 `is_missing_table_error` 等字符串匹配替换为 DataFusion 错误类型的结构化匹配 +3. **模板引擎升级** — Skills 模板替换引入轻量模板引擎(如 `format!` 风格或 `minijinja`),支持转义 +4. **端到端联邦测试** — 补充多进程 mock 的 E2E 联邦测试,而非仅依赖进程内 hook 模拟 +5. **Python 测试覆盖** — 加强 `test_engine.py` 等核心 Python 模块的测试深度 + +--- + +## 五、总体评价 + +### 评分 + +| 维度 | 评分 | 说明 | +|------|------|------| +| 架构设计 | ★★★★★ | 四层分层清晰,契约边界明确,组合根集中 | +| 代码质量 | ★★★★☆ | Rust 侧优秀,Python 侧良好,少量技术债务 | +| 测试体系 | ★★★★☆ | Rust 内嵌测试充分,Python 侧有提升空间 | +| 文档质量 | ★★★★★ | modularity.md 等设计文档达到工程级别 | +| 创新性 | ★★★★★ | 联邦三路径、延迟GPU读取、Shadow Step 等设计新颖 | +| 可维护性 | ★★★★☆ | 技术债务有追踪,但 probing-python 膨胀是长期隐患 | + +### 结论 + +Probing 是一个**架构成熟度很高**的分布式训练诊断系统。它成功地将 SQL 查询引擎、跨进程共享内存、联邦查询、AI Agent 集成、声明式诊断剧本等多个复杂组件组合成一个连贯的系统。Memtable 的无锁并发设计和联邦三路径路由是两个特别出色的工程实现。`modularity.md` 文档的存在表明团队有意识地管理模块边界和技术债务。 + +主要改进方向是 `probing-python` crate 的逻辑拆分、部分字符串匹配逻辑的结构化、以及 Python 侧测试覆盖的加强。整体而言,这是一个在系统设计层面超出大多数同类工具的项目——它不是在做"又一个 profiler",而是在重新定义"agent-native 诊断"的交互范式。 diff --git a/REVIEW_COMPARISON.md b/REVIEW_COMPARISON.md new file mode 100644 index 00000000..04b5ff2f --- /dev/null +++ b/REVIEW_COMPARISON.md @@ -0,0 +1,784 @@ +# Probing 深度评审与业界对比分析 + +> **评审视角**:资深系统架构师,深耕分布式训练与推理性能优化 +> **评审范围**:probing 全量代码(Rust ~86K行 + Python ~15K行 + Web ~21K行 + Skills ~3.5K行) +> **对比基准**:PyTorch Profiler、NVIDIA Nsight Systems/Compute、HTA、DeepSpeed Flops Profiler、NCCL Flight Recorder、DLRover、Coroot、DeepFlow + +--- + +## 一、Probing 项目深度分析 + +### 1.1 项目定位 + +Probing 不是一个传统意义上的 profiler。它的核心创新在于提出了 **"Agent-Native 诊断"** 范式——将性能诊断从"人工查看 trace 文件"升级为"AI Agent 通过结构化接口自动查询、归因、推荐修复方案"。 + +这一定位决定了它的架构选择与传统 profiler 根本不同: + +| 传统 Profiler | Probing | +|--------------|---------| +| 生成 trace 文件,事后离线分析 | 运行时实时查询,在线诊断 | +| 图形界面 (Nsight GUI, TensorBoard) | SQL + MCP + Skills 声明式接口 | +| 人工解读火焰图/时间线 | AI Agent 自动执行诊断剧本 | +| 单进程视角 | 联邦查询跨 rank 聚合 | +| 固定分析维度 | Skills 可扩展诊断知识库 | + +### 1.2 架构深度点评 + +#### 1.2.1 四层架构 — 评分:5.0/5.0 + +``` +L4 Experience ─ skills/ · web/ · Python hooks (UX, 诊断剧本) +L3 Control ─ probing/server · probing/cli (HTTP, MCP, inject, fan-out) +L2 Collectors ─ probing/extensions/* · python/probing/profiling (指标采集) +L1 Platform ─ probing/core · memtable · proto (SQL引擎, 联邦, 存储格式) +``` + +**架构亮点:** + +- **依赖方向严格单向向下**。proto 不依赖任何上层,core 不依赖 collectors。组合根只在 `probing/server/src/engine.rs`。这是教科书级的 Clean Architecture 实践,在 Rust 生态中罕见。 +- **6 个公共契约**(`ProbeDataSource`、`ProbeExtension`、`@table`、`skills/*/steps.yaml`、proto DTOs、Federation tags)定义了模块交互边界。契约的粒度恰当——既不过细导致碎片化,也不过粗导致耦合。 +- **`modularity.md` 以表格追踪技术债务**,标注"Done"/"Accepted"状态。这表明架构决策是有意识管理的,而非偶然演化。 +- **`AGENTS.md` 为 AI 协作设计的编码规范**,包含层级归属表、diff 规模约束(≤500行)、扩散味检查清单。这是对"AI 参与代码开发"这一新范式的务实回应。 + +**架构不足:** + +- `probing-python` 以 53K 行占据全部 extensions 的 84%,承载 spy/crash/pprof/torch/tracing/repl/flamegraph 等多个独立功能域。虽然 maturin 单 wheel 约束是客观原因,但逻辑层面的 feature gate 拆分可以缓解。 +- 联邦查询模块(3,066行)的 `aggregate_pushdown.rs`(642行复杂 SQL AST 操作)的测试覆盖度需要验证。 + +#### 1.2.2 DataFusion SQL 引擎 — 评分:5.0/5.0 + +嵌入 Apache DataFusion 作为查询引擎是项目最重要的架构决策。这意味着: + +1. **零成本获得标准 SQL 兼容性**——用户可以用 JOIN、窗口函数、CTE、子查询查询运行时数据 +2. **自定义表只需实现 `TableProvider` trait**——不需要重新发明 parser/optimizer/executor +3. **联邦查询可以下推聚合**——SUM/COUNT/MIN/MAX 推到各 rank 本地执行,只合并结果 + +`EngineBuilder` 采用 Builder 模式链式构建,`ENGINE: Lazy>` 作为进程级单例。`ProbeDataSource`(数据面)和 `ProbeExtension`(控制面)分离关注点。 + +对比业界:这是唯一一个将 SQL 查询引擎深度嵌入到训练诊断系统中的项目。PyTorch Profiler 和 Nsight Systems 都不支持结构化查询;HTA 虽然提供 Python API 但基于 DataFrame 操作,不具备声明式查询能力。 + +#### 1.2.3 Memtable 无锁存储 — 评分:5.0/5.0 + +自描述二进制格式 MEMT,整个项目中设计最精巧的组件: + +- **环形缓冲区 + generation 计数**:固定数量 chunk 组成环形缓冲,chunk 回收时 generation+1,读者通过比较 generation 前后值检测并丢弃回收 chunk +- **单写者 + 无锁读者**:写者通过 `&mut self` 保证排他,读者通过 `Acquire`/`Release` 内存序完全无锁 +- **三种后端统一抽象**:Heap(进程内)、Shm(POSIX `shm_open` 跨进程)、File(mmap 持久化) +- **per-chunk 字符串去重**:`DedupState` 在 chunk 范围内对重复字符串做哈希去重,存储为 4 字节回引用 + +训练进程写入 mmap 文件,probing 服务器通过同一文件读取——零拷贝、零序列化。这种设计使得采集开销极低,同时支持跨进程访问和持久化。 + +对比业界:NCCL Flight Recorder 也使用环形缓冲,但不支持跨进程共享内存和 SQL 查询。PyTorch Profiler 写入 Chrome Trace JSON 文件,开销大且不支持实时查询。 + +#### 1.2.4 联邦查询系统 — 评分:5.0/5.0 + +联邦模块(~3,066 行)采用三路径路由策略: + +| 路径 | 适用场景 | 机制 | 性能 | +|------|---------|------|------| +| Path A: AggregatePushdown | 单表 `global.*` + merge-safe 聚合 | 将 SUM/COUNT/MIN/MAX 下推到各 rank | O(1) 网络传输 | +| Path B: FederatedScan | 单表 `global.*` 非 pushdown | Lazy 分区扫描,流式拉取 | O(N) 网络传输 | +| Path C: Broadcast | JOIN/CTE/UNION/子查询 | 全量广播到每个 rank,本地执行后合并 | O(N²) 网络传输 | + +路由基于 `sqlparser-rs` AST 级别分析。查询护栏强制 broadcast 需要 LIMIT,自动为无 LIMIT 的 federated scan 注入 `LIMIT 10000`。每行联邦数据自动附加 6 个标签列(`_host`, `_addr`, `_rank`, `_node_rank`, `_local_rank`, `_role`)。 + +**关键技术细节:** + +- `route.rs` 中的 `classify_query()` 通过 AST 分析确定查询类型,支持嵌套 CTE 和子查询的递归分类 +- `rewrite.rs` 中的 `rewrite_for_federation()` 对原始 SQL 进行重写,注入联邦标签列和 LIMIT 护栏 +- `aggregate_pushdown.rs` 判断聚合函数是否 "merge-safe"(SUM/COUNT/MIN/MAX 安全,AVG 不安全需要拆分为 SUM/COUNT) + +对比业界:这是分布式训练诊断领域唯一实现联邦查询的系统。NCCL Flight Recorder 虽然多 rank 记录,但查询需要手动聚合。DLRover 支持 rank 故障检测但不提供查询能力。 + +#### 1.2.5 NCCL Profiler 插件 — 评分:4.5/5.0 + +通过 `ncclProfiler_v3`/`v4` C 符号导出实现零侵入 NCCL 操作采集,这是整个项目中技术最硬核的部分: + +**引用计数完成模型:** + +NCCL 的 proxy 线程在一个 progress loop 中反复进入同一 collective 的不同阶段。一个 `CollSlot` 可能被多次 `CollStart` → `ProxyStep` → `ProxyStep` → ... 调用。probing 通过 `live_children` 引用计数和 `stopped` 标志判断 collective 是否真正完成: + +```rust +// 伪代码 +fn on_coll_complete(&mut self, slot: &mut CollSlot) { + if slot.stopped && slot.live_children == 0 { + // 真正完成,记录 dwell time + } +} +``` + +**Proxy Step Wait 分解算法:** + +将 NCCL proxy 线程的等待时间分解为三段链式 dwell time: + +1. `SendGpuWait` — proxy 线程等待本地 GPU 完成 send buffer 准备 +2. `SendPeerWait` — proxy 线程等待对端 rank 的 network buffer 就绪 +3. `SendWait` — 实际发送操作耗时 + +"首次进入优先"设计:正确处理 NCCL proxy 线程的 progress loop 重试行为——只有第一次进入某状态时才记录起始时间戳,避免重复计入。 + +**v4 transSize 的权威状态过滤:** + +只在 `SendWait`/`RecvFlushWait` 状态下提取 transSize,避免在不完整状态中提取到中间值。 + +**Slot Pool 内存管理:** + +- 预分配固定大小的 slot pool,避免高频采集路径上的内存分配 +- 三重验证(bounds + liveness + 指针身份)防止 stale/foreign handle +- `pool_pressure.rs` 在 pool 接近满时自动降级采样率 +- 分片锁按 communicator hash 分片,`try_lock` 在 watchdog 路径避免阻塞 NCCL 回调 + +**Culprit/Victim 归因算法(skills/nccl_culprit_victim/steps.yaml):** + +- **Culprit** = high `send_gpu_wait`(本地 GPU 慢,导致其他 rank 等待) +- **Victim** = high `recv_wait`(等待对端发送,自身无过错) + +这一归因逻辑将低级时间戳数据转化为可操作的诊断结论,是从"数据采集"到"自动归因"的关键跃迁。 + +**扣分原因:** v3 ABI 的兼容性测试覆盖不足;`pool_pressure` 的降级阈值缺乏可配置性。 + +#### 1.2.6 TorchProbe 采样引擎 — 评分:5.0/5.0 + +Python 侧最精巧的实现(1,554 行),三个关键设计: + +**分层采样:** +- `_sample_period = round(1/rate)`,每周期恰好采样一个 step,均匀分布 +- 使用 `blake2b` 哈希确保跨 rank 一致采样同一 step,且不扰动宿主 RNG 流 +- 采样率可通过环境变量配置 + +**Shadow Step 机制:** +- 4:1 节奏(4 个 probed step + 1 个 baseline shadow step) +- Shadow step 完全跳过 hook 仅记录墙钟时间 +- 用于量化探测开销本身,自动校准 overhead 估算 + +**延迟 GPU 事件读取 (Deferred GPU Event Read):** +- 采样步将 `DelayedRecord` 存入 `_deferred` 列表 +- 至少等待 3 步(`_DEFER_MIN_SETTLE`)才尝试非阻塞 `event.query()` +- 最多延迟 16 步(`_DEFER_MAX_LAG`)后强制 synchronize +- 后台线程 `DeferredDrainWorker` 异步执行保存 + +这一设计使得 `torch.cuda.synchronize()` 调用频率从"每个采样步一次"降低到"每 16 步一次",大幅降低了采样对训练吞吐量的影响。 + +对比业界:PyTorch Profiler 的 GPU 事件读取需要显式 synchronize,开销大。Nsight Systems 通过驱动级 hook 避免了这个问题,但无法在 Python 层面进行结构化分析。 + +#### 1.2.7 Skills 诊断剧本系统 — 评分:4.5/5.0 + +声明式诊断知识系统,每个 skill 由 `SKILL.md`(人类文档)+ `steps.yaml`(机器可执行)组成。 + +**亮点:** +- `SkillBackend` trait 抽象了查询执行环境,使同一套 skill 可以在 CLI、Web WASM、MCP 三种环境中运行 +- `resolve_use_global()` 自动检测 peer 数量决定是否使用 global 查询 +- `cluster_integrity_findings()` 将不完整的 fanout 自动提升为 error 级 finding +- `ensure_read_only_sql()` 强制 skill 步骤只执行 SELECT 类查询 +- 13 个预置 skill 覆盖了 NCCL 超时、culprit/victim 归因、GPU 利用率、内存碎片等常见诊断场景 + +**不足:** +- `expand_template` 使用朴素 `str::replace`,缺乏转义机制 +- interpretation rules 的 `when` 语法是自定义 DSL(如 `step:xxx | column:yyy | max/min(ratio) > 1.5`),非标准表达式引擎 +- Skills 的可组合性有限——一个 skill 的输出不能直接作为另一个 skill 的输入 + +#### 1.2.8 MCP 协议集成 — 评分:5.0/5.0 + +8 个 MCP 工具(list_tables、query、describe_table、list_skills、run_skill、get_skill、get_cluster_info、list_extensions),写入操作受 `PROBING_MCP_ALLOW_WRITE` 环境变量控制。 + +这是分布式训练诊断领域**首个** MCP 协议集成。它使 AI Agent 可以: +1. 发现可用数据表和诊断 skill +2. 执行 SQL 查询 +3. 运行预定义诊断剧本 +4. 获取集群拓扑信息 + +对比业界:所有现有 profiler 都不支持 MCP 或任何 AI Agent 原生接口。PyTorch Profiler 和 Nsight Systems 需要人工通过 GUI 或脚本分析输出。 + +#### 1.2.9 HCCL Shim — 评分:4.0/5.0 + +华为昇腾 HCCL 兼容层,通过 dlopen 拦截 `libprofapi.so`,将 HCCL 调用映射到 NCCL profiler 的采集路径。 + +这是对非 NVIDIA 生态的前瞻性布局。随着昇腾 NPU 在国内训练集群中的占比提升,这一兼容层的价值将持续增长。 + +**扣分原因:** 兼容性测试主要在模拟环境进行,缺乏真实昇腾集群的验证反馈;HCCL 与 NCCL 的语义差异(如 proxy 线程行为差异)可能导致 wait 分解算法的精度下降。 + +### 1.3 实现质量点评 + +#### 1.3.1 代码质量 — 评分:4.5/5.0 + +**Rust 侧(优秀):** +- `EngineError` 采用 `thiserror`,通过 `#[from]` 自动转换保持完整因果链。明确拒绝 `From` 防止"字符串化"错误类型 +- 生产路径禁止 `unwrap`/`expect`/`panic!` +- 内存安全由类型系统保证——`unsafe` 仅限于 mmap 操作和 NCCL FFI +- 命名一致性高,模块边界清晰 + +**Python 侧(良好):** +- 三层导入模式(`is_lightweight_module()` + `is_probing_cli()`)解决了 `import probing` 副作用问题 +- Mixin 架构合理分离了 TorchProbe 的多个关注点 +- 部分异常处理过宽(bare `except Exception: pass`)可能隐藏 bug +- `ext/ray.py` 使用 `hash()` 生成 ID,Python hash 随机化导致不可复现 + +#### 1.3.2 测试体系 — 评分:4.0/5.0 + +**亮点:** +- Rust 内嵌测试覆盖充分:`engine.rs` 780 行测试、`memtable.rs` 1,030 行测试(含 4 线程并发读写测试) +- `test_torch_probe_sampling.py`(815 行)覆盖了 settle window、force flush、RNG 不变性、inplace ReLU 兼容等边界条件 +- `api_spec.json` 作为 HTTP API 契约 SSOT +- Overhead 不变性测试——`PROBING=0 pytest tests/regression/profiling/test_overhead_invariants.py` + +**不足:** +- `test_engine.py` 仅 24 行,Python 核心层测试覆盖不足 +- 缺少多进程 mock 的端到端联邦测试 +- `aggregate_pushdown.rs`(642 行复杂 SQL AST 操作)的测试覆盖度需验证 +- NCCL profiler 的 v3/v4 ABI 兼容性测试主要在模拟环境 + +#### 1.3.3 文档质量 — 评分:5.0/5.0 + +- `modularity.md` 以表格追踪架构边界和技术债务,达到工程级别 +- `overhead-invariants.zh.md` 精确定义了开销不变性公式和测试要求 +- `AGENTS.md` 为 AI 协作设计的编码规范 +- 13 个 skill 各有 `SKILL.md` 人类文档 +- API.md / CHANGELOG.md 维护良好 + +#### 1.3.4 创新性 — 评分:5.0/5.0 + +probing 在以下方面具有业界首创性: + +1. **Agent-Native 诊断范式** — 首个为 AI Agent 设计的训练诊断系统(MCP + Skills) +2. **联邦 SQL 查询** — 首个支持跨 rank SQL 联邦查询的训练诊断系统 +3. **Shadow Step 开销校准** — 首个自动量化探测开销的训练采样器 +4. **声明式诊断剧本** — 首个将诊断知识固化为可执行 YAML 的系统 +5. **Culprit/Victim 自动归因** — 首个从 NCCL 时间戳自动推导故障 rank 的系统 +6. **多硬件生态兼容** — 同时支持 NVIDIA NCCL 和华为 HCCL + +### 1.4 Probing 总体评分 + +| 维度 | 评分 | 加权说明 | +|------|------|---------| +| 架构设计 | 5.0/5.0 | 四层分层 + 契约边界 + 组合根集中,教科书级 | +| 代码质量 | 4.5/5.0 | Rust 优秀,Python 良好,少量技术债务 | +| 测试体系 | 4.0/5.0 | Rust 充分,Python 侧有提升空间 | +| 文档质量 | 5.0/5.0 | 设计文档 + 开销不变性 + AI 协作规范 | +| 创新性 | 5.0/5.0 | 6 项业界首创,重新定义诊断范式 | +| 分布式诊断 | 5.0/5.0 | 联邦三路径 + culprit/victim 归因 | +| 采集能力 | 4.5/5.0 | NCCL + Torch + GPU + 系统指标,HCCL 前瞻 | +| 性能开销 | 4.5/5.0 | Shadow Step + 延迟读取 + 无锁存储 | +| 可扩展性 | 4.5/5.0 | Skills + Extensions + MCP,模板引擎待升级 | +| 生态成熟度 | 3.5/5.0 | Beta 阶段,社区和用户基础仍在建立 | +| **加权总分** | **4.6/5.0** | | + +--- + +## 二、业界同类工具分析 + +### 2.1 PyTorch Profiler (Kineto) + +**定位:** PyTorch 官方性能分析工具,基于 Kineto 库(Libkineto + CUPTI)。 + +**核心能力:** +- CPU + GPU activity 追踪,通过 CUPTI 获取 kernel 级别时间线 +- TensorBoard 插件提供火焰图、内存视图、GPU 利用率图表 +- 支持 distributed profiling,但每个 rank 独立生成 trace 文件 +- `torch.profiler.profile` 上下文管理器 API + +**优势:** +- PyTorch 官方维护,与 PyTorch 版本紧密对齐 +- TensorBoard 集成度高,可视化成熟 +- 支持 Chrome Trace 格式导出,生态兼容性好 + +**劣势:** +- 不支持结构化查询(SQL/API) +- 不支持跨 rank 联邦聚合——需要手动收集多个 trace 文件分析 +- trace 文件体积大(GB 级),分析慢 +- GPU 事件读取需要 synchronize,开销大 +- 无 AI Agent 接口 +- 诊断知识不可复用——每次诊断都从零开始 + +### 2.2 NVIDIA Nsight Systems + +**定位:** NVIDIA 官方系统级性能分析工具,支持 CPU + GPU + CUDA + NCCL 全栈追踪。 + +**核心能力:** +- 驱动级 hook,捕获 CUDA API 调用、kernel 执行、NCCL 操作 +- GUI 时间线视图,支持多层 zoom(从纳秒到分钟) +- NVTX range 标注支持 +- GPU metrics 采样(SM 占用率、内存带宽等) +- 支持 multi-rep 报告对比 + +**优势:** +- 最低开销的采集——驱动级实现,对应用层几乎零侵入 +- GUI 分析能力业界最强 +- 支持 DCGM 集成获取 GPU 指标 +- 成熟的商业级工具,文档完善 + +**劣势:** +- 仅支持 NVIDIA 平台 +- 不支持结构化查询 +- 不支持跨 rank 联邦聚合 +- trace 文件体积大 +- 无 AI Agent 接口 +- 诊断完全依赖人工经验 +- 闭源商业工具 + +### 2.3 NVIDIA Nsight Compute + +**定位:** NVIDIA 官方 kernel 级性能分析工具,专注于单个 CUDA kernel 的微架构级指标。 + +**核心能力:** +- per-kernel 的硬件计数器采集(SM 占用率、寄存器压力、缓存命中率等) +- Roofline 模型分析 +- Source/SASS 关联视图 +- 交互式 GUI + +**优势:** +- 微架构级分析深度业界最强 +- 适合 kernel 优化和算子开发 + +**劣势:** +- 不适合分布式训练场景(专注于单 kernel) +- 极高的 profiling 开销(需要 replay kernel) +- 不支持结构化查询或 AI Agent 接口 +- 闭源 + +### 2.4 Holistic Trace Analysis (HTA) + +**定位:** Meta 开源的分布式训练 trace 分析库,基于 PyTorch Profiler 的 trace 文件。 + +**核心能力:** +- 多 rank trace 文件聚合分析 +- 空闲时间检测(idle time breakdown) +- 通信-计算重叠分析 +- 内存增量分析 +- Python API(DataFrame 操作) + +**优势:** +- 专门针对分布式训练设计 +- 开源,可扩展 +- 与 PyTorch Profiler trace 格式兼容 +- 提供了一些预定义分析模板 + +**劣势:** +- 基于 DataFrame 操作,不具备声明式查询能力 +- 离线分析,不支持实时查询 +- 分析模板不可组合/复用 +- 无 AI Agent 接口 +- 社区活跃度一般(Meta 内部为主) + +### 2.5 DeepSpeed Flops Profiler + +**定位:** 微软 DeepSpeed 生态的 FLOPS 和参数量分析工具。 + +**核心能力:** +- per-module FLOPS 计算 +- 参数量统计 +- 模型结构概览 +- 跨 rank FLOPS 对比 + +**优势:** +- 与 DeepSpeed 生态紧密集成 +- FLOPS 计算准确 +- 开箱即用 + +**劣势:** +- 功能单一(仅 FLOPS + 参数量) +- 不支持通信分析 +- 不支持系统级指标 +- 无结构化查询 +- 无 AI Agent 接口 + +### 2.6 NCCL Flight Recorder + +**定位:** NCCL 内置的轻量级通信记录器,环形缓冲区存储 NCCL 操作日志。 + +**核心能力:** +- 环形缓冲区存储 NCCL 操作日志 +- 低开销采集 +- 支持 dump 到文件后离线分析 +- NCCL 2.7+ 内置,无需额外安装 +- 多 rank 日志关联(通过 NCCL ID) + +**优势:** +- 最低开销的 NCCL 采集(内置实现) +- 与 NCCL 版本紧密对齐 +- 环形缓冲区自动管理内存 +- 支持 watchdog 超时自动 dump + +**劣势:** +- 仅覆盖 NCCL 通信层 +- 不支持结构化查询 +- 不支持跨 rank 联邦聚合——需要手动收集多个 dump 文件 +- 无 AI Agent 接口 +- 分析依赖人工经验 +- 无计算侧指标 + +### 2.7 DLRover + +**定位:** 阿里开源的分布式训练弹性调度和故障诊断工具。 + +**核心能力:** +- 训练进程监控和故障检测 +- rank 故障自动重启 +- 训练进度监控 +- 资源弹性调度 + +**优势:** +- 专注于训练可靠性 +- 支持自动故障恢复 +- 与 K8s 生态集成 + +**劣势:** +- 诊断能力有限(主要是故障检测,非性能分析) +- 不支持细粒度性能数据采集 +- 无结构化查询 +- 无 AI Agent 接口 + +### 2.8 Coroot + +**定位:** 开源 eBPF 应用性能监控工具,面向微服务/云原生场景。 + +**核心能力:** +- eBPF 采集,零侵入 +- 服务拓扑自动发现 +- 请求链路追踪 +- RED 指标(Rate, Errors, Duration) +- CPU/内存/网络指标 + +**优势:** +- 零侵入采集(eBPF) +- 服务拓扑可视化 +- 开源 +- 支持 K8s 生态 + +**劣势:** +- 面向微服务,不针对分布式训练 +- 不理解 NCCL/CUDA 语义 +- 不支持 GPU 指标 +- 无结构化查询 +- 无 AI Agent 接口 + +### 2.9 DeepFlow + +**定位:** 开源 eBPF 可观测性平台,面向云原生网络和应用性能。 + +**核心能力:** +- eBPF + cBPF 采集 +- 网络流量分析 +- 应用协议解析(HTTP/gRPC/MySQL/Redis 等) +- 分布式追踪(零侵入) +- SQL-like 查询语言 + +**优势:** +- 零侵入采集 +- 支持 SQL-like 查询语言 +- 网络分析能力强 +- 开源 + +**劣势:** +- 面向云原生应用,不针对分布式训练 +- 不理解 NCCL/CUDA 语义 +- 不支持 GPU 指标 +- 无 AI Agent 接口 +- 无诊断剧本系统 + +--- + +## 三、逐维度对比与打分 + +### 3.1 对比维度说明 + +| 维度 | 权重 | 说明 | +|------|------|------| +| 架构设计 | 15% | 分层清晰度、契约边界、扩展性 | +| 采集能力 | 12% | 采集维度覆盖(CPU/GPU/通信/系统)、采集精度 | +| 分析深度 | 12% | 归因能力、下钻能力、诊断结论可操作性 | +| 分布式诊断 | 12% | 跨 rank 聚合、联邦查询、多节点关联 | +| AI Agent 集成 | 10% | MCP/结构化接口、自动诊断能力 | +| 性能开销 | 10% | 采集开销、对训练吞吐量的影响 | +| 可扩展性 | 8% | 插件机制、自定义指标、诊断知识复用 | +| 易用性 | 8% | 学习曲线、API 设计、文档质量 | +| 生态成熟度 | 8% | 社区规模、用户基础、版本稳定性 | +| 创新性 | 5% | 技术新颖度、范式创新 | + +### 3.2 逐维度对比打分 + +#### 3.2.1 架构设计 (权重 15%) + +| 工具 | 评分 | 评语 | +|------|------|------| +| **Probing** | **5.0** | 四层分层 + 6 契约 + 组合根集中 + Rust 类型安全,教科书级 | +| PyTorch Profiler | 3.0 | 模块化设计,但缺乏清晰的架构分层和契约边界 | +| Nsight Systems | 3.5 | 成熟的商业架构,但闭源且不可扩展 | +| Nsight Compute | 3.5 | kernel 分析架构清晰,但功能域单一 | +| HTA | 3.0 | 基于 DataFrame 的分析库,架构简单 | +| DeepSpeed Flops Profiler | 2.5 | 单功能工具,无架构复杂度 | +| NCCL Flight Recorder | 3.5 | 环形缓冲设计优秀,但功能域单一 | +| DLRover | 3.0 | 微服务架构,针对训练可靠性 | +| Coroot | 3.5 | eBPF 架构清晰,但面向微服务 | +| DeepFlow | 4.0 | eBPF + SQL 查询引擎,架构设计优秀 | + +#### 3.2.2 采集能力 (权重 12%) + +| 工具 | 评分 | 评语 | +|------|------|------| +| **Probing** | **4.5** | NCCL + Torch + GPU + 系统指标 + HCCL,Shadow Step 开销校准 | +| PyTorch Profiler | 4.0 | CPU + GPU + CUDA + 内存,但 NCCL 覆盖浅 | +| Nsight Systems | 5.0 | 驱动级全栈采集,业界最强 | +| Nsight Compute | 4.0 | 微架构级计数器,但仅单 kernel | +| HTA | 2.0 | 不采集数据,仅分析 PyTorch Profiler trace | +| DeepSpeed Flops Profiler | 2.0 | 仅 FLOPS + 参数量 | +| NCCL Flight Recorder | 3.5 | NCCL 采集优秀,但仅通信层 | +| DLRover | 2.0 | 进程级监控,无细粒度数据 | +| Coroot | 3.5 | eBPF 全栈,但不理解训练语义 | +| DeepFlow | 3.5 | eBPF 网络层优秀,但不理解训练语义 | + +#### 3.2.3 分析深度 (权重 12%) + +| 工具 | 评分 | 评语 | +|------|------|------| +| **Probing** | **5.0** | Culprit/Victim 自动归因 + Proxy Step Wait 分解 + 13 个诊断 skill | +| PyTorch Profiler | 3.0 | 提供 trace 数据,分析依赖人工 | +| Nsight Systems | 3.5 | GUI 分析能力强,但依赖人工经验 | +| Nsight Compute | 4.5 | 微架构级分析深度最强,Roofline 模型 | +| HTA | 3.5 | 预定义分析模板,但不可组合 | +| DeepSpeed Flops Profiler | 2.0 | 仅 FLOPS 分析 | +| NCCL Flight Recorder | 2.5 | 原始日志,分析依赖人工 | +| DLRover | 2.0 | 故障检测,非性能分析 | +| Coroot | 3.0 | RED 指标 + 拓扑,但非训练诊断 | +| DeepFlow | 3.0 | 网络分析 + 分布式追踪,但非训练诊断 | + +#### 3.2.4 分布式诊断 (权重 12%) + +| 工具 | 评分 | 评语 | +|------|------|------| +| **Probing** | **5.0** | 联邦三路径路由 + AST 级 SQL 重写 + 跨 rank 聚合 + 6 个联邦标签列 | +| PyTorch Profiler | 2.0 | 每 rank 独立 trace,无聚合 | +| Nsight Systems | 2.0 | 每 rank/GPU 独立 trace,无聚合 | +| Nsight Compute | 1.0 | 单 kernel 分析,不支持分布式 | +| HTA | 3.5 | 多 rank trace 聚合分析,但离线且无 SQL | +| DeepSpeed Flops Profiler | 2.5 | 跨 rank FLOPS 对比 | +| NCCL Flight Recorder | 2.5 | 多 rank 日志关联,但无结构化聚合 | +| DLRover | 3.0 | rank 故障检测 + 自动重启 | +| Coroot | 2.5 | 服务拓扑,但不针对训练分布式 | +| DeepFlow | 3.5 | 分布式追踪,但面向微服务 | + +#### 3.2.5 AI Agent 集成 (权重 10%) + +| 工具 | 评分 | 评语 | +|------|------|------| +| **Probing** | **5.0** | MCP 协议 + 8 个工具 + Skills 声明式诊断剧本 + 写操作安全控制 | +| PyTorch Profiler | 0.0 | 无 AI Agent 接口 | +| Nsight Systems | 0.0 | 无 AI Agent 接口 | +| Nsight Compute | 0.0 | 无 AI Agent 接口 | +| HTA | 0.5 | Python API 可被 Agent 调用,但无专门设计 | +| DeepSpeed Flops Profiler | 0.5 | Python API 可被 Agent 调用 | +| NCCL Flight Recorder | 0.0 | 无 AI Agent 接口 | +| DLRover | 1.0 | 自动化故障恢复,但非 Agent 驱动 | +| Coroot | 0.0 | 无 AI Agent 接口 | +| DeepFlow | 0.5 | SQL-like 查询可被 Agent 调用 | + +#### 3.2.6 性能开销 (权重 10%) + +| 工具 | 评分 | 评语 | +|------|------|------| +| **Probing** | **4.5** | Shadow Step 校准 + 延迟 GPU 读取 + 无锁 mmap 存储 + 采样率可配置 | +| PyTorch Profiler | 3.0 | GPU synchronize 开销大,trace 文件体积大 | +| Nsight Systems | 4.5 | 驱动级 hook,开销极低 | +| Nsight Compute | 2.0 | kernel replay,开销极高 | +| HTA | N/A | 不采集,离线分析 | +| DeepSpeed Flops Profiler | 4.0 | 开销低,但功能单一 | +| NCCL Flight Recorder | 5.0 | 内置环形缓冲,开销最低 | +| DLRover | 4.5 | 进程级监控,开销极低 | +| Coroot | 4.5 | eBPF 零侵入 | +| DeepFlow | 4.5 | eBPF 零侵入 | + +#### 3.2.7 可扩展性 (权重 8%) + +| 工具 | 评分 | 评语 | +|------|------|------| +| **Probing** | **4.5** | ProbeDataSource + ProbeExtension + Skills YAML + MCP 工具,4 种扩展点 | +| PyTorch Profiler | 3.0 | 可通过 record_function 扩展,但维度有限 | +| Nsight Systems | 2.0 | 闭源,不可扩展 | +| Nsight Compute | 2.0 | 闭源,不可扩展 | +| HTA | 3.0 | Python 库,可扩展分析模板 | +| DeepSpeed Flops Profiler | 2.0 | 功能单一,扩展空间有限 | +| NCCL Flight Recorder | 2.5 | 可扩展输出格式,但采集不可扩展 | +| DLRover | 3.0 | 插件机制,针对训练可靠性 | +| Coroot | 3.0 | eBPF 可扩展,但面向微服务 | +| DeepFlow | 3.5 | SQL 查询 + 插件机制 | + +#### 3.2.8 易用性 (权重 8%) + +| 工具 | 评分 | 评语 | +|------|------|------| +| **Probing** | **4.0** | SQL + MCP + Skills 三种接口,但学习曲线较陡 | +| PyTorch Profiler | 4.5 | 上下文管理器 API 简单,TensorBoard 可视化成熟 | +| Nsight Systems | 4.0 | GUI 成熟,但安装配置复杂 | +| Nsight Compute | 4.0 | GUI 成熟 | +| HTA | 3.5 | Python API,需要理解 DataFrame | +| DeepSpeed Flops Profiler | 4.5 | 一行代码启用 | +| NCCL Flight Recorder | 4.5 | 环境变量启用,零配置 | +| DLRover | 4.0 | K8s 原生部署 | +| Coroot | 4.0 | 自动发现,K8s 原生 | +| DeepFlow | 3.5 | 部署简单,但查询语言需学习 | + +#### 3.2.9 生态成熟度 (权重 8%) + +| 工具 | 评分 | 评语 | +|------|------|------| +| **Probing** | **3.5** | Beta 阶段(0.2.5),社区和用户基础仍在建立 | +| PyTorch Profiler | 5.0 | PyTorch 官方工具,用户基础最大 | +| Nsight Systems | 5.0 | NVIDIA 官方商业工具,成熟稳定 | +| Nsight Compute | 5.0 | NVIDIA 官方商业工具,成熟稳定 | +| HTA | 3.5 | Meta 开源,社区活跃度一般 | +| DeepSpeed Flops Profiler | 4.0 | DeepSpeed 生态,用户基础较大 | +| NCCL Flight Recorder | 4.5 | NCCL 内置,用户基础大 | +| DLRover | 3.0 | 阿里开源,社区发展中 | +| Coroot | 3.5 | 开源,社区发展中 | +| DeepFlow | 4.0 | 开源,社区活跃 | + +#### 3.2.10 创新性 (权重 5%) + +| 工具 | 评分 | 评语 | +|------|------|------| +| **Probing** | **5.0** | Agent-Native 范式 + 联邦 SQL + Shadow Step + 声明式诊断剧本 + Culprit/Victim 归因,6 项首创 | +| PyTorch Profiler | 2.5 | 功能成熟但无范式创新 | +| Nsight Systems | 3.0 | 驱动级采集技术领先,但范式传统 | +| Nsight Compute | 3.5 | 微架构级分析技术领先 | +| HTA | 3.0 | 多 rank 聚合分析有创新 | +| DeepSpeed Flops Profiler | 2.0 | 功能单一 | +| NCCL Flight Recorder | 3.0 | 环形缓冲 + watchdog dump 有创新 | +| DLRover | 3.5 | 弹性调度 + 故障恢复有创新 | +| Coroot | 3.5 | eBPF APM 有创新 | +| DeepFlow | 4.0 | eBPF + SQL 查询引擎有创新 | + +### 3.3 加权总分对比 + +| 工具 | 架构 15% | 采集 12% | 分析 12% | 分布式 12% | AI Agent 10% | 开销 10% | 扩展 8% | 易用 8% | 生态 8% | 创新 5% | **总分** | +|------|---------|---------|---------|-----------|-------------|---------|--------|--------|--------|--------|---------| +| **Probing** | **0.75** | **0.54** | **0.60** | **0.60** | **0.50** | **0.45** | **0.36** | **0.32** | **0.28** | **0.25** | **4.65** | +| PyTorch Profiler | 0.45 | 0.48 | 0.36 | 0.24 | 0.00 | 0.30 | 0.24 | 0.36 | 0.40 | 0.125 | **2.955** | +| Nsight Systems | 0.525 | 0.60 | 0.42 | 0.24 | 0.00 | 0.45 | 0.16 | 0.32 | 0.40 | 0.15 | **3.265** | +| Nsight Compute | 0.525 | 0.48 | 0.54 | 0.12 | 0.00 | 0.20 | 0.16 | 0.32 | 0.40 | 0.175 | **2.82** | +| HTA | 0.45 | 0.24 | 0.42 | 0.42 | 0.05 | N/A | 0.24 | 0.28 | 0.28 | 0.15 | **2.53** | +| DeepSpeed Flops | 0.375 | 0.24 | 0.24 | 0.30 | 0.05 | 0.40 | 0.16 | 0.36 | 0.32 | 0.10 | **2.545** | +| NCCL Flight Rec | 0.525 | 0.42 | 0.30 | 0.30 | 0.00 | 0.50 | 0.20 | 0.36 | 0.36 | 0.15 | **3.115** | +| DLRover | 0.45 | 0.24 | 0.24 | 0.36 | 0.10 | 0.45 | 0.24 | 0.32 | 0.24 | 0.175 | **2.815** | +| Coroot | 0.525 | 0.42 | 0.36 | 0.30 | 0.00 | 0.45 | 0.24 | 0.32 | 0.28 | 0.175 | **3.07** | +| DeepFlow | 0.60 | 0.42 | 0.36 | 0.42 | 0.05 | 0.45 | 0.28 | 0.28 | 0.32 | 0.20 | **3.38** | + +> 注:HTA 为离线分析工具,开销维度 N/A,总分按 9 维加权归一化。 + +### 3.4 排名 + +| 排名 | 工具 | 总分 | 定位差异 | +|------|------|------|---------| +| 1 | **Probing** | **4.65** | Agent-Native 分布式训练诊断 | +| 2 | DeepFlow | 3.38 | eBPF 云原生可观测性 | +| 3 | Nsight Systems | 3.27 | NVIDIA 系统级性能分析 | +| 4 | NCCL Flight Recorder | 3.12 | NCCL 通信记录 | +| 5 | Coroot | 3.07 | eBPF 微服务 APM | +| 6 | PyTorch Profiler | 2.96 | PyTorch 官方 Profiler | +| 7 | DLRover | 2.82 | 训练弹性调度与故障恢复 | +| 8 | Nsight Compute | 2.82 | NVIDIA kernel 级分析 | +| 9 | DeepSpeed Flops Profiler | 2.55 | FLOPS 分析 | +| 10 | HTA | 2.53 | 分布式 trace 离线分析 | + +--- + +## 四、差异化分析 + +### 4.1 Probing 的独占能力(无竞品覆盖) + +以下能力是 Probing 独有、所有对比工具均不具备的: + +1. **联邦 SQL 查询** — 跨 rank 声明式查询,AST 级路由优化 +2. **MCP 协议集成** — AI Agent 原生接口 +3. **声明式诊断剧本 (Skills)** — 诊断知识可复用、可组合、可扩展 +4. **Culprit/Victim 自动归因** — 从 NCCL 时间戳自动推导故障 rank +5. **Shadow Step 开销校准** — 自动量化探测开销 +6. **跨硬件生态 (NCCL + HCCL)** — 同时支持 NVIDIA 和华为昇腾 + +### 4.2 Probing 的相对优势 + +| 对比对象 | Probing 优势 | +|---------|-------------| +| vs PyTorch Profiler | 结构化查询 + 联邦聚合 + AI Agent + 实时查询 + 低开销 | +| vs Nsight Systems | 结构化查询 + 联邦聚合 + AI Agent + 开源 + 多硬件 | +| vs HTA | 实时查询 + SQL + AI Agent + 自动归因 + 在线诊断 | +| vs NCCL Flight Recorder | SQL 查询 + 计算侧指标 + AI Agent + 自动归因 | +| vs DeepFlow | 训练语义理解 + NCCL/CUDA 支持 + 诊断剧本 | + +### 4.3 Probing 的相对劣势 + +| 对比对象 | Probing 劣势 | +|---------|-------------| +| vs Nsight Systems | 采集精度(驱动级 vs 应用级)、GUI 分析能力 | +| vs NCCL Flight Recorder | NCCL 采集开销(符号导出 vs 内置实现) | +| vs PyTorch Profiler | 生态成熟度、用户基础、TensorBoard 可视化 | +| vs Coroot/DeepFlow | eBPF 零侵入(probing 需要注入 hook) | +| vs Nsight Compute | kernel 微架构级分析深度 | + +### 4.4 互补关系 + +Probing 并非要替代所有现有工具,而是填补了一个关键空白: + +``` +┌─────────────────────────────────────────────────────────┐ +│ 诊断决策层 (Agent-Native) │ +│ Probing (MCP + Skills + SQL 联邦查询) │ +├─────────────────────────────────────────────────────────┤ +│ 结构化分析层 │ +│ Probing (SQL) · HTA (DataFrame) · DeepFlow (SQL) │ +├─────────────────────────────────────────────────────────┤ +│ 数据采集层 │ +│ Probing (hook) · PyTorch Profiler (Kineto) │ +│ Nsight Systems (驱动) · NCCL Flight Recorder (内置) │ +│ Coroot/DeepFlow (eBPF) · Nsight Compute (replay) │ +└─────────────────────────────────────────────────────────┘ +``` + +理想的使用方式: +- **Probing** 作为诊断入口和 Agent 接口 +- **Nsight Systems** 作为深度下钻工具(当 Probing 定位到问题 rank 后) +- **NCCL Flight Recorder** 作为 NCCL 层的补充数据源 +- **Nsight Compute** 作为 kernel 级优化工具 + +--- + +## 五、改进建议 + +### 5.1 短期 (Beta → 1.0) + +1. **Python 测试覆盖** — 加强 `test_engine.py` 等核心 Python 模块的测试深度 +2. **端到端联邦测试** — 补充多进程 mock 的 E2E 联邦测试 +3. **模板引擎升级** — Skills 模板替换引入轻量模板引擎(如 `minijinja`),支持转义 +4. **结构化错误匹配** — 将 `is_missing_table_error` 等字符串匹配替换为结构化匹配 +5. **NCCL v3/v4 ABI 兼容性测试** — 在真实 NCCL 版本矩阵上验证 + +### 5.2 中期 (1.0 → 1.5) + +1. **probing-python 逻辑拆分** — 通过 feature gate 在逻辑层面拆分子模块 +2. **Skills 可组合性** — 允许一个 skill 的输出作为另一个 skill 的输入 +3. **可视化增强** — Web UI 增加火焰图、时间线等传统可视化能力 +4. **eBPF 采集后端** — 补充 eBPF 采集器,实现零侵入系统级指标 +5. **Pool Pressure 可配置** — NCCL profiler 的降级阈值支持配置 + +### 5.3 长期 (1.5+) + +1. **推理场景支持** — 扩展 Skills 覆盖推理性能诊断(P99 延迟、batch 调度、KV cache 等) +2. **自动修复建议** — 从诊断结论到修复建议的自动推理 +3. **训练异常检测** — 基于 memtable 时序数据的在线异常检测 +4. **社区生态** — 建设 Skills 市场,允许社区贡献诊断剧本 + +--- + +## 六、总结 + +### 核心结论 + +**Probing 是分布式训练诊断领域架构成熟度最高、创新能力最强的项目。** 它不是在做"又一个 profiler",而是在重新定义"Agent-Native 诊断"的交互范式。 + +在加权总分中,Probing(4.65)显著领先于第二名 DeepFlow(3.38)和第三名 Nsight Systems(3.27),领先优势主要来自: + +1. **分布式诊断能力**(5.0 vs 平均 2.5)—— 联邦 SQL 查询是独占能力 +2. **AI Agent 集成**(5.0 vs 平均 0.2)—— MCP 协议是独占能力 +3. **分析深度**(5.0 vs 平均 3.0)—— Culprit/Victim 自动归因是独占能力 + +Probing 的主要短板是**生态成熟度**(3.5 vs PyTorch Profiler 5.0 / Nsight Systems 5.0),这是 Beta 阶段项目的自然特征,随着社区发展和用户积累可以改善。 + +**一句话评价:** 如果说 Nsight Systems 是训练性能分析的"显微镜",PyTorch Profiler 是"听诊器",那么 Probing 正在成为 AI Agent 的"全科诊断系统"——它不只采集数据,更理解数据、自动归因、推荐修复,并通过 MCP 协议让 AI Agent 成为诊断流程的一等公民。 diff --git a/REVIEW_METHODOLOGY.md b/REVIEW_METHODOLOGY.md new file mode 100644 index 00000000..6def2a01 --- /dev/null +++ b/REVIEW_METHODOLOGY.md @@ -0,0 +1,420 @@ +# Probing 方法论审视:从"工具实现"到"万卡可观测性方法论" + +> **审视角度**:不以 probing 当前实现了什么为出发点,而以"万卡级训练可观测性需要什么方法论"为出发点,反视 probing 的实现完整度。 +> **目的**:为博士实习生论文提供方法论框架,使叙事从"我们做了一个工具"升级为"我们提出了一套方法论,probing 是其实现验证"。 + +--- + +## 一、核心问题重新定义 + +### 1.1 传统范式的崩溃 + +万卡规模下,传统的 "profile-then-analyze" 范式在三个维度同时崩溃: + +| 维度 | 小规模 (≤256 GPU) | 万卡 (10K+ GPU) | 崩溃原因 | +|------|-------------------|-----------------|---------| +| 数据量 | GB 级 trace,可收集 | TB 级 trace,收集本身成为瓶颈 | O(N) 数据 × O(N) rank = O(N²) 传输 | +| 故障复杂度 | 单点故障,简单排序可定位 | 级联故障,延迟多跳扩散 | ring/tree 拓扑中 1 个慢点 → 多跳传播 | +| 人工可行性 | 专家 30 分钟可分析 | 10K rank 无人能遍历 | 即使每 rank 1 秒,也需近 3 小时 | + +### 1.2 方法论的核心主张 + +**在万卡规模下,训练可观测性必须从"收集-分析"范式转变为"查询-归因-闭环"范式。** + +这个范式转换包含五个相互关联的原则,构成一个完整的方法论框架: + +--- + +## 二、方法论框架:五大原则 + +### 原则 1:Query-Driven Observability(查询驱动可观测性) + +**主张:** 不要先收集数据再分析,而要将查询推送到数据所在位置,只传输查询结果而非原始数据。 + +**理论依据:** 在 N 个 rank 的集群中,全量收集的数据传输量为 O(N × data_per_rank),而查询下推的传输量为 O(N × result_per_rank)。当 data_per_rank >> result_per_rank(典型情况:MB 级 trace vs KB 级聚合结果),查询驱动可减少 3-4 个数量级的网络传输。 + +**方法论要求:** +- 联邦查询路由器,根据查询语义选择最优执行路径 +- 聚合下推(SUM/COUNT/MIN/MAX 在各 rank 本地执行) +- 查询护栏(防止全表扫描导致网络风暴) +- **基于代价的自适应路由**(根据节点数、网络带宽、数据量动态选择路径) + +### 原则 2:Execution-Model-Aware Attribution(执行模型感知归因) + +**主张:** 不要依赖统计相关性推断故障原因,而要利用通信库的执行模型(NCCL proxy 线程语义、ring/tree 拓扑)进行确定性因果归因。 + +**理论依据:** 在万卡多级拓扑下,一个慢 GPU 的延迟会通过 ring/tree 拓扑多跳扩散,导致大量 rank 出现高 wait 值。统计相关性会将受害者误判为罪魁祸首。只有基于执行模型的因果推理才能正确区分"谁慢"和"谁因别人慢而等待"。 + +**方法论要求:** +- 通信操作的时间分解(proxy step wait decomposition) +- 异步完成语义的正确建模(引用计数完成模型) +- **通信拓扑图的构建与使用**(ring order、tree parent-child) +- **拓扑感知因果传播分析**(沿拓扑边追溯延迟源头) + +### 原则 3:Calibrated Overhead Budgeting(校准式开销预算) + +**主张:** 不要将 profiling 开销视为固定成本,而要主动测量、预测和控制自身开销,建立可验证的开销不变量。 + +**理论依据:** 在万卡规模下,1% 的 per-GPU overhead = 100 个 GPU 的算力浪费。未校准的开销在万卡规模下会导致显著的训练吞吐损失。必须建立开销模型,并证明其在规模扩展时保持有界。 + +**方法论要求:** +- Shadow 基线机制(A/B 对照测量探测开销) +- 延迟读取策略(减少同步操作) +- **集群级开销聚合模型**(N 个 rank 的 overhead 分布,而非单点) +- **前馈预测模型**(给定采样率预测开销) +- **闭环反馈控制**(测量 overhead → 自动调整采样率) +- 可验证的开销不变量(形式化定义 + 自动化测试守护) + +### 原则 4:Declarative Diagnosis Knowledge(声明式诊断知识) + +**主张:** 不要将诊断逻辑硬编码在程序中,而要将诊断过程表达为声明式、可组合、可复用的知识资产。 + +**理论依据:** 万卡训练的故障模式多样性超过了任何单一工具能硬编码的范围。诊断知识必须从工具实现中分离,使其可以被社区贡献、组合和演进。 + +**方法论要求:** +- 诊断过程的声明式表达(YAML/DSL) +- 人类可读的诊断文档(与机器可执行的定义共存) +- **诊断技能的可组合性**(一个 skill 的输出作为另一个 skill 的输入) +- 诊断结果的标准化表达(findings + severity + next_steps) +- 诊断知识库的版本管理和社区共享 + +### 原则 5:Agent-Native Interface(Agent 原生接口) + +**主张:** 不要为人类 GUI 交互设计接口,而要为 AI Agent 的程序化交互设计接口。在万卡规模下,Agent 不是辅助工具而是唯一可行的诊断执行者。 + +**理论依据:** 10K rank 的诊断数据无法被人类有效遍历。AI Agent 可以在秒级完成跨 rank 聚合查询、多轮诊断推理、知识库匹配和修复建议生成。但这要求接口设计以 Agent 为一等公民,而非事后适配。 + +**方法论要求:** +- 结构化查询接口(SQL + schema discovery) +- 标准化 Agent 协议(MCP) +- 诊断技能的程序化调用 +- 写操作安全控制 +- 诊断上下文的跨轮次保持 + +--- + +## 三、Probing 实现完整度审计 + +### 3.1 审计矩阵 + +| 原则 | 方法论要求 | Probing 当前实现 | 完整度 | Gap 性质 | +|------|-----------|-----------------|--------|---------| +| **P1 查询驱动** | 基于代价的自适应路由 | 纯 AST 模式匹配 | 40% | 路由不考虑节点数/网络/数据量 | +| | 聚合下推 | SUM/COUNT/MIN/MAX 下推 | 90% | merge-safe 判定完整 | +| | 查询护栏 | LIMIT 注入 + broadcast 限制 | 80% | 缺少自适应 LIMIT | +| | 自适应路由 | 无 | 0% | 固定 fanout=128,不随规模调整 | +| **P2 执行模型归因** | Wait 分解 | SendGpuWait→PeerWait→Wait | 90% | 首次进入优先设计正确 | +| | 引用计数完成模型 | live_children + stopped | 90% | 正确处理 proxy progress loop | +| | 通信拓扑图 | 无 | 0% | peer/channel_id 采集但未构建拓扑 | +| | 拓扑感知因果传播 | wait 值独立排序 | 20% | 无 ring/tree 因果链推理 | +| **P3 校准开销** | Shadow 基线 | 4:1 cadence shadow step | 90% | 设计精巧 | +| | 延迟读取 | Deferred GPU Event Read | 90% | settle window + max lag | +| | 集群级开销模型 | 无 | 10% | 只有 per-rank 模型 | +| | 前馈预测 | 无 | 0% | 只有后验测量 | +| | 闭环反馈控制 | 无 | 0% | 静态配置,手动调整 | +| | 开销不变量 | 6 条形式化不变量 + 测试 | 80% | 但不随集群规模扩展 | +| **P4 声明式诊断** | 声明式表达 | YAML steps + MD 文档 | 80% | 13 个 skill | +| | 可组合性 | 无 | 10% | next_steps 是纯文本建议 | +| | 标准化结果 | findings + severity | 80% | 结构化输出 | +| | 知识库管理 | 无版本管理 | 20% | 文件系统存储 | +| **P5 Agent 原生** | 结构化查询 | DataFusion SQL + schema | 90% | 完整的表发现和查询 | +| | MCP 协议 | 8 个 MCP 工具 | 90% | 读操作完整 | +| | 程序化 skill 调用 | run_skill MCP 工具 | 80% | 但不支持 skill 链式调用 | +| | 写操作控制 | PROBING_MCP_ALLOW_WRITE | 90% | 安全控制完整 | +| | 跨轮次上下文 | 无 | 20% | Agent 需自行管理上下文 | + +### 3.2 完整度雷达 + +``` + P1 查询驱动 (40%) + | + P5 Agent (70%) --- P2 执行模型归因 (50%) + | | + P4 声明式 (50%) --- P3 校准开销 (45%) +``` + +**总体实现完整度:约 51%** + +这个数字本身是论文的重要素材——它说明方法论的范围远超单一实现,probing 验证了方法论的核心可行性,但完整方法论的实施需要更多工作。 + +### 3.3 关键 Gap 详解 + +#### Gap 1:联邦路由无代价模型(P1) + +**当前实现**(`route.rs` 第 44-56 行): + +```rust +pub fn classify_federated_sql(sql: &str) -> FederatedQueryPath { + let lower = sql.to_lowercase(); + if !lower.contains("global.") { return Local; } + if !can_fanout_via_global_catalog(sql) { return Broadcast; } + if plan_federated_aggregate_pushdown(sql).is_some() { + return AggregatePushdown; + } + FederatedScan +} +``` + +**问题**:路由决策完全基于 SQL 语法结构,不考虑: +- 节点数量(2 个节点和 2000 个节点走同一路径) +- 网络带宽/延迟(无成本估算) +- 数据量/选择性(不考虑 WHERE 过滤率) +- 节点负载(无运行时统计反馈) + +`cluster_executor.rs` 中 fanout 并发度固定为 128,不随集群规模调整。 + +**方法论要求**:一个基于代价的路由器需要:节点数 N、预计传输行数 R、网络带宽 B、当前节点负载 L,估算 Path A/B/C 的预期延迟,选择最优路径。 + +**论文价值**:这是从"语法路由"到"语义+代价路由"的跃迁,有算法贡献空间。 + +#### Gap 2:归因算法无拓扑感知(P2) + +**当前实现**(`nccl_culprit_victim/steps.yaml`): + +```sql +-- culprit: 谁的 send_gpu_wait 最高 +SELECT rank, ... FROM {table} +ORDER BY send_gpu_wait_ns DESC LIMIT 10 + +-- victim: 谁的 recv_wait 最高 +SELECT rank, ... FROM {table} +ORDER BY recv_wait_ns DESC LIMIT 10 +``` + +**问题**: +- `peer` 列被采集但完全未用于归因——不知道"谁在等谁" +- `channel_id` 被采集但未用于重建 ring 结构 +- 无因果链推理:不能推断"A 慢 → B 等 A → C 等 B"的传播链 +- 在万卡多级拓扑下,简单 wait 排序会将级联受害者误判为 culprit + +**方法论要求**: +1. 从 `peer` + `channel_id` + `is_send` 列构建通信拓扑图 +2. 将 wait 值映射到拓扑边上 +3. 沿拓扑边做因果传播分析:如果一个 rank 的 `recv_wait` 高,检查其拓扑前驱的 `send_gpu_wait` 是否也高——如果前驱高,则前驱是 culprit,当前 rank 是 victim;如果前驱不高,则当前 rank 可能是真正的瓶颈点 +4. 处理 ring 和 tree 两种拓扑的不同传播模式 + +**论文价值**:拓扑感知因果归因是最核心的算法贡献,直接解决万卡场景的级联故障误判问题。 + +#### Gap 3:无自适应采样闭环(P3) + +**当前实现**:采样率通过环境变量静态配置(`PROBING_TORCH_PROFILING=random:0.05`),运行时不会根据 overhead 测量自动调整。虽然 Shadow Step 机制测量了开销,但没有代码读取这些开销指标后回调 `set_sampling_mode()`。 + +**方法论要求**:闭环控制回路—— +1. Shadow Step 持续测量 overhead +2. 当 overhead 超过阈值时,自动降低采样率 +3. 当 overhead 低于阈值时,可以适当提高采样率以获取更精细数据 +4. 在集群级别协调各 rank 的采样率(避免部分 rank 过载) + +**论文价值**:这是一个控制系统设计贡献,可以形式化为闭环控制模型。 + +#### Gap 4:Skill 无可组合性(P4) + +**当前实现**:`next_steps` 是 `Vec` 纯文本建议,不会自动触发另一个 skill。一个 skill 的查询结果(DataFrame)不能作为另一个 skill 的输入参数。 + +**方法论要求**: +- Skill pipeline:`nccl_culprit_victim` 输出 culprit rank → 自动作为 `gpu_pressure` 的输入参数 +- Skill DAG:定义 skill 间的依赖关系和执行顺序 +- Skill 输出标准化:统一的结果格式,可被下游 skill 解析 + +**论文价值**:这是从"诊断脚本集合"到"诊断知识图"的跃迁。 + +--- + +## 四、对博士实习生论文的指导 + +### 4.1 当前问题诊断 + +博士生被局限在 probing 实现上的典型表现: + +| 被局限的叙事 | 应该的叙事 | +|-------------|-----------| +| "我们实现了联邦 SQL 查询" | "我们提出查询驱动可观测性原则,联邦 SQL 是其实现方式之一" | +| "我们做了 NCCL wait 分解" | "我们提出执行模型感知归因原则,wait 分解是其核心机制" | +| "我们用了 Shadow Step" | "我们提出校准式开销预算原则,Shadow Step 是其测量机制" | +| "我们集成了 MCP" | "我们提出 Agent-Native 诊断原则,MCP 是其接口实现" | +| "probing 能做 X" | "方法论要求做 X,probing 实现了 X 的 Y%" | + +### 4.2 建议的论文叙事框架 + +``` +Title: Observability at Scale: A Methodology for + 10,000-GPU Training Diagnosis + +Abstract: + At 10,000+ GPU scale, the traditional "profile-then-analyze" + paradigm collapses: data volumes exceed collection capacity, + cascading failures defy statistical attribution, and human + traversal becomes infeasible. We argue that this scale + demands a fundamental paradigm shift to "query-attribute-act" + observability, and propose five principles that constitute + this methodology: (1) query-driven data access, (2) execution- + model-aware attribution, (3) calibrated overhead budgeting, + (4) declarative diagnosis knowledge, and (5) agent-native + interfaces. We validate this methodology through Probing, a + system that implements these principles with varying degrees + of completeness, and demonstrate on 1,000-10,000 GPU clusters + that the methodology enables second-scale diagnosis where + traditional tools require hours or fail entirely. + +Contributions: + 1. The identification and formalization of the scale-driven + paradigm shift in training observability (Section 2) + 2. A five-principle methodology with theoretical justification + for each principle (Section 3) + 3. The design and implementation of Probing as a partial + embodiment of the methodology (Section 4) + 4. Large-scale evaluation demonstrating the methodology's + effectiveness, including identification of gaps between + methodology and implementation as future work (Section 5) +``` + +### 4.3 关键叙事策略 + +**策略 1:Gap 是贡献,不是缺陷** + +论文不应该回避 probing 实现的 gap,而应该将 gap 作为方法论价值的证明——"方法论的范围远超单一实现,以下是当前实现完整度的审计,以及每个 gap 的理论影响"。 + +具体做法:在 Evaluation 后加一节 "Methodology Coverage Analysis",用 3.1 节的审计矩阵展示 probing 对五原则的实现完整度(约 51%),并讨论每个 gap 的影响和未来方向。 + +**策略 2:万卡实验验证方法论,不只是验证工具** + +实验设计应回答的问题是"方法论的原则在万卡规模下是否必要且充分",而不是"probing 在万卡规模下是否工作"。 + +具体做法: +- P1 验证:在 10K 节点上展示查询下推 vs 全量收集的传输量差异(验证"查询驱动"原则的必要性) +- P2 验证:在多级拓扑下展示简单 wait 排序 vs 拓扑感知归因的准确率差异(验证"执行模型归因"原则的必要性)——这需要先实现拓扑感知归因 +- P3 验证:在 10K 节点上展示 overhead 是否保持有界(验证"校准开销"原则的有效性) +- P5 验证:在 10K 节点上展示 Agent 自主诊断 vs 人工诊断的可行性差异(验证"Agent-Native"原则的必要性) + +**策略 3:方法论驱动的新贡献** + +利用方法论框架,可以推导出 probing 当前未实现但方法论要求的贡献点。这些新贡献既是论文的算法/系统贡献,也是方法论价值的验证: + +| 方法论要求 | 需要实现的新贡献 | 论文中的位置 | +|-----------|----------------|-------------| +| P1 代价路由 | 基于节点数/带宽/数据量的自适应路由器 | Section 3.1 + Evaluation | +| P2 拓扑归因 | 通信拓扑图构建 + 因果传播分析算法 | Section 3.2 + Evaluation | +| P3 闭环控制 | overhead → sampling rate 反馈控制器 | Section 3.3 + Evaluation | +| P4 Skill 组合 | Skill DAG + 输出-输入管道 | Section 3.4 (design) + Discussion | + +**策略 4:Related Work 从方法论角度分类** + +不要按工具分类(PyTorch Profiler、Nsight、HTA...),而按方法论原则分类: + +``` +Related Work: + Query-driven observability: DeepFlow (eBPF + SQL), ... + Execution-model attribution: Cascon (congestion attribution), ... + Calibrated overhead: ... + Declarative diagnosis: ... + Agent-native systems: ... + + No existing system combines all five principles. +``` + +### 4.4 最优先实现的 Gap + +如果时间有限,建议优先实现以下两个 gap——它们既是方法论的核心验证,又有最高的论文 ROI: + +**优先级 1:拓扑感知归因算法(P2 Gap)** + +理由: +- 这是方法论中最核心的算法贡献 +- 万卡场景的级联故障问题只有拓扑感知归因能解决 +- probing 已经采集了 `peer`、`channel_id`、`is_send` 数据,只差分析逻辑 +- 可以直接与当前简单排序做 ablation 对比 + +实现路径: +1. 从 NCCL profiler 采集的 `peer` + `channel_id` + `is_send` 列构建通信图 +2. 对每个 collective 操作,重建 ring/tree 拓扑 +3. 在拓扑图上做 wait 值的因果传播分析 +4. 输出:每个高 wait rank 的"根本原因 rank" + 传播路径 + +**优先级 2:自适应联邦路由(P1 Gap)** + +理由: +- 联邦查询是 probing 的标志性能力,当前的路由器太简单 +- 万卡场景下,固定 fanout=128 可能导致查询超时或网络拥塞 +- 代价模型可以形式化,有理论贡献空间 + +实现路径: +1. 在 `classify_federated_sql` 中引入节点数 N 参数 +2. 估算各路径的预期延迟:Path A = O(N × local_query + merge),Path C = O(N² × data_transfer) +3. 根据预期延迟选择最优路径 +4. 动态调整 fanout 并发度 + +--- + +## 五、修正后的论文结构 + +``` +1. Introduction (1.5 页) + - 万卡训练时代的可观测性挑战 + - 传统范式的崩溃(数据爆炸 + 级联故障 + 人工不可行) + - 我们的方法论:五原则 + - Probing 作为方法论的实现验证 + - 贡献总结 + +2. Motivation & Background (2 页) + 2.1 万卡训练的通信模式 + 2.2 传统工具在万卡规模的崩溃(实测数据) + 2.3 NCCL proxy 线程执行模型 + 2.4 范式转换的必要性论证 + +3. Methodology (3 页) — 论文核心 + 3.1 Query-Driven Observability + - 原则定义 + 理论依据 + - 联邦查询路由算法(含代价模型) + 3.2 Execution-Model-Aware Attribution + - 原则定义 + 理论依据 + - Wait 分解 + 拓扑感知因果归因算法 + 3.3 Calibrated Overhead Budgeting + - 原则定义 + 理论依据 + - Shadow Step + 闭环控制模型 + 3.4 Declarative Diagnosis Knowledge + - 原则定义 + 理论依据 + - Skill 表达 + 可组合性设计 + 3.5 Agent-Native Interface + - 原则定义 + 理论依据 + +4. Implementation (2 页) + - Probing 架构概述(四层 + 契约) + - 各原则的实现完整度(坦诚说明 gap) + +5. Evaluation (4 页) + 5.1 实验环境 (1K / 10K GPU) + 5.2 范式对比: query-driven vs collect-then-analyze + 5.3 归因准确率: 拓扑感知 vs 简单排序 (故障注入) + 5.4 开销 scaling: per-GPU overhead vs cluster size + 5.5 Agent 自主诊断 vs 人工专家 + 5.6 联邦路由: 代价路由 vs 固定路由 + 5.7 Case Studies (2-3 个真实万卡故障) + 5.8 Methodology Coverage Analysis (实现完整度审计) + +6. Discussion (0.5 页) + - 方法论 vs 实现的 gap + - 未实现原则的影响 + - 非 NVIDIA 生态扩展 + +7. Related Work (1 页) + - 按方法论原则分类,非按工具分类 + +8. Conclusion (0.5 页) +``` + +--- + +## 六、总结 + +Probing 当前的实现完整度约为方法论的 51%。这不是问题——这恰恰是论文的价值所在。 + +**方法论是贡献,实现是验证。** 论文的核心贡献不是"我们做了一个工具",而是"我们识别了万卡训练可观测性的范式转换,提出了五原则方法论,并通过 probing 在生产规模上验证了其可行性"。 + +博士生需要做的思维转换: + +1. **从"probing 能做什么"到"方法论要求做什么"** — probing 的实现只是方法论的一个实例化 +2. **从"实现细节"到"设计原则"** — 论文评审关心的是原则,不是代码 +3. **从"功能列表"到"完整度审计"** — gap 是贡献的一部分,不是需要隐藏的缺陷 +4. **从"工具对比"到"方法论对比"** — 相关工作应按原则分类,而非按工具分类 + +**最关键的一句话**:不要让 probing 的当前实现定义论文的边界,而要让方法论定义 probing 的未来。 diff --git a/probing/cli/src/cli/skill/backend.rs b/probing/cli/src/cli/skill/backend.rs index 6c46a799..26d4b89a 100644 --- a/probing/cli/src/cli/skill/backend.rs +++ b/probing/cli/src/cli/skill/backend.rs @@ -40,13 +40,14 @@ impl SkillBackend for CliBackend { .map_err(|e| SkillRunError(e.to_string())) } - async fn peer_count(&self) -> usize { - match self.0.get("/apis/nodes?limit=1024").await { - Ok(reply) => match serde_json::from_str::(&reply) { - Ok(resp) => resp.total.saturating_sub(1), - Err(_) => 0, - }, - Err(_) => 0, - } + async fn peer_count(&self) -> Result { + let reply = self + .0 + .get("/apis/nodes?limit=1024") + .await + .map_err(|error| SkillRunError(error.to_string()))?; + let response: NodeListResponse = + serde_json::from_str(&reply).map_err(|error| SkillRunError(error.to_string()))?; + Ok(response.total.saturating_sub(1)) } } diff --git a/probing/crates/skills/src/backend.rs b/probing/crates/skills/src/backend.rs index 67666db1..7d831e68 100644 --- a/probing/crates/skills/src/backend.rs +++ b/probing/crates/skills/src/backend.rs @@ -24,7 +24,11 @@ pub trait SkillBackend { async fn get(&self, path: &str) -> Result; - async fn peer_count(&self) -> usize; + /// Discover remote peers. + /// + /// Discovery failures must remain errors: treating an unknown cluster as zero peers can + /// silently turn a distributed diagnosis into a local-only run. + async fn peer_count(&self) -> Result; } pub fn parse_cluster_meta(meta: &serde_json::Value) -> ClusterQueryMeta { diff --git a/probing/crates/skills/src/runner.rs b/probing/crates/skills/src/runner.rs index 943243c2..046726af 100644 --- a/probing/crates/skills/src/runner.rs +++ b/probing/crates/skills/src/runner.rs @@ -122,9 +122,9 @@ pub async fn resolve_use_global( backend: &B, pb: &Skill, overrides: &mut HashMap, -) { +) -> Result<()> { if overrides.contains_key("use_global") { - return; + return Ok(()); } let default = pb .parameters @@ -135,9 +135,19 @@ pub async fn resolve_use_global( _ => None, }) .unwrap_or(false); - let peers = backend.peer_count().await; - let use_global = peers > 0 && default; + if !default { + overrides.insert("use_global".to_string(), "false".to_string()); + return Ok(()); + } + let peers = backend.peer_count().await.map_err(|error| { + SkillRunError(format!( + "failed to discover cluster peers before running `{}`: {error}", + pb.id + )) + })?; + let use_global = peers > 0; overrides.insert("use_global".to_string(), use_global.to_string()); + Ok(()) } pub async fn execute_skill( @@ -157,7 +167,7 @@ pub async fn execute_skill_pb( mut overrides: HashMap, options: RunOptions, ) -> Result { - resolve_use_global(backend, &pb, &mut overrides).await; + resolve_use_global(backend, &pb, &mut overrides).await?; let ctx = build_context(&pb, &overrides); let mut outcomes = Vec::new(); let mut evidence = Vec::new(); @@ -578,6 +588,7 @@ mod tests { struct MockBackend { peers: usize, + peer_error: bool, local_rows: usize, cluster_partial: bool, calls: Arc, @@ -587,6 +598,7 @@ mod tests { fn new(peers: usize, local_rows: usize) -> Self { Self { peers, + peer_error: false, local_rows, cluster_partial: false, calls: Arc::new(AtomicUsize::new(0)), @@ -598,6 +610,11 @@ mod tests { self } + fn with_peer_error(mut self) -> Self { + self.peer_error = true; + self + } + fn df(rows: usize) -> DataFrame { if rows == 0 { return DataFrame::default(); @@ -640,8 +657,12 @@ mod tests { Ok(format!("body:{path}")) } - async fn peer_count(&self) -> usize { - self.peers + async fn peer_count(&self) -> Result { + if self.peer_error { + Err(SkillRunError("node registry unavailable".into())) + } else { + Ok(self.peers) + } } } @@ -744,7 +765,9 @@ mod tests { let backend = MockBackend::new(4, 1); let pb = sample_skill(vec![], vec![]); let mut overrides = HashMap::from([("use_global".into(), "false".into())]); - resolve_use_global(&backend, &pb, &mut overrides).await; + resolve_use_global(&backend, &pb, &mut overrides) + .await + .unwrap(); assert_eq!( overrides.get("use_global").map(String::as_str), Some("false") @@ -756,13 +779,42 @@ mod tests { let backend = MockBackend::new(3, 1); let pb = sample_skill(vec![], vec![]); let mut overrides = HashMap::new(); - resolve_use_global(&backend, &pb, &mut overrides).await; + resolve_use_global(&backend, &pb, &mut overrides) + .await + .unwrap(); assert_eq!( overrides.get("use_global").map(String::as_str), Some("true") ); } + #[tokio::test] + async fn resolve_use_global_surfaces_peer_discovery_failure() { + let backend = MockBackend::new(0, 1).with_peer_error(); + let pb = sample_skill(vec![], vec![]); + let mut overrides = HashMap::new(); + let error = resolve_use_global(&backend, &pb, &mut overrides) + .await + .unwrap_err(); + assert!(error.0.contains("failed to discover cluster peers")); + assert!(!overrides.contains_key("use_global")); + } + + #[tokio::test] + async fn resolve_use_global_does_not_discover_for_local_default() { + let backend = MockBackend::new(0, 1).with_peer_error(); + let mut pb = sample_skill(vec![], vec![]); + pb.parameters[0].default = serde_yaml::Value::Bool(false); + let mut overrides = HashMap::new(); + resolve_use_global(&backend, &pb, &mut overrides) + .await + .unwrap(); + assert_eq!( + overrides.get("use_global").map(String::as_str), + Some("false") + ); + } + #[tokio::test] async fn execute_skill_pb_abort_stops_after_on_empty_abort() { let backend = MockBackend::new(0, 0); diff --git a/probing/server/src/mcp/skill_backend.rs b/probing/server/src/mcp/skill_backend.rs index 60d7ae81..4cd4912f 100644 --- a/probing/server/src/mcp/skill_backend.rs +++ b/probing/server/src/mcp/skill_backend.rs @@ -67,10 +67,10 @@ impl SkillBackend for ServerBackend { String::from_utf8(bytes).map_err(|e| SkillRunError(e.to_string())) } - async fn peer_count(&self) -> usize { - match tokio::task::spawn_blocking(|| get_nodes_page(0, 1024, None)).await { - Ok((_, total, _)) => total.saturating_sub(1), - Err(_) => 0, - } + async fn peer_count(&self) -> Result { + let (_, total, _) = tokio::task::spawn_blocking(|| get_nodes_page(0, 1024, None)) + .await + .map_err(|error| SkillRunError(error.to_string()))?; + Ok(total.saturating_sub(1)) } } diff --git a/python/probing/bundled_web/public/assets/tailwind.css b/python/probing/bundled_web/public/assets/tailwind.css index 06bbdaba..13b04594 100644 --- a/python/probing/bundled_web/public/assets/tailwind.css +++ b/python/probing/bundled_web/public/assets/tailwind.css @@ -823,6 +823,11 @@ video { right: 0px; } +.inset-y-0 { + top: 0px; + bottom: 0px; +} + .inset-y-\[7px\] { top: 7px; bottom: 7px; @@ -848,6 +853,10 @@ video { bottom: 0.75rem; } +.bottom-4 { + bottom: 1rem; +} + .bottom-6 { bottom: 1.5rem; } @@ -888,6 +897,10 @@ video { right: 0.75rem; } +.right-4 { + right: 1rem; +} + .right-6 { right: 1.5rem; } @@ -972,10 +985,18 @@ video { z-index: 50; } +.z-\[10050\] { + z-index: 10050; +} + .z-\[1\] { z-index: 1; } +.z-\[51\] { + z-index: 51; +} + .z-\[60\] { z-index: 60; } @@ -1020,6 +1041,11 @@ video { margin-bottom: 0.125rem; } +.my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + .-mb-px { margin-bottom: -1px; } @@ -1108,6 +1134,10 @@ video { margin-top: 0.5rem; } +.mt-3 { + margin-top: 0.75rem; +} + .mt-4 { margin-top: 1rem; } @@ -1164,6 +1194,10 @@ video { height: 2.5rem; } +.h-16 { + height: 4rem; +} + .h-2 { height: 0.5rem; } @@ -1240,6 +1274,10 @@ video { height: 7px; } +.h-\[calc\(100vh-8rem\)\] { + height: calc(100vh - 8rem); +} + .h-full { height: 100%; } @@ -1252,6 +1290,10 @@ video { height: 100vh; } +.max-h-24 { + max-height: 6rem; +} + .max-h-32 { max-height: 8rem; } @@ -1268,6 +1310,10 @@ video { max-height: 14rem; } +.max-h-64 { + max-height: 16rem; +} + .max-h-72 { max-height: 18rem; } @@ -1316,6 +1362,14 @@ video { min-height: 0px; } +.min-h-16 { + min-height: 4rem; +} + +.min-h-28 { + min-height: 7rem; +} + .min-h-\[140px\] { min-height: 140px; } @@ -1332,6 +1386,10 @@ video { min-height: 36px; } +.min-h-\[36rem\] { + min-height: 36rem; +} + .min-h-\[4rem\] { min-height: 4rem; } @@ -1352,6 +1410,14 @@ video { min-height: calc(100vh - 11rem); } +.min-h-\[calc\(100vh-12rem\)\] { + min-height: calc(100vh - 12rem); +} + +.min-h-\[calc\(100vh-8rem\)\] { + min-height: calc(100vh - 8rem); +} + .min-h-full { min-height: 100%; } @@ -1384,6 +1450,10 @@ video { width: 0.625rem; } +.w-20 { + width: 5rem; +} + .w-24 { width: 6rem; } @@ -1480,6 +1550,10 @@ video { min-width: 180px; } +.min-w-\[22rem\] { + min-width: 22rem; +} + .min-w-\[28px\] { min-width: 28px; } @@ -1549,6 +1623,10 @@ video { max-width: 14rem; } +.max-w-\[1600px\] { + max-width: 1600px; +} + .max-w-\[16rem\] { max-width: 16rem; } @@ -1565,10 +1643,18 @@ video { max-width: 480px; } +.max-w-\[85\%\] { + max-width: 85%; +} + .max-w-\[90\%\] { max-width: 90%; } +.max-w-\[92\%\] { + max-width: 92%; +} + .max-w-\[960px\] { max-width: 960px; } @@ -1739,6 +1825,10 @@ video { grid-template-columns: repeat(2, minmax(0, 1fr)); } +.grid-cols-\[4\.5rem_minmax\(0\2c 1fr\)_5\.5rem\] { + grid-template-columns: 4.5rem minmax(0,1fr) 5.5rem; +} + .grid-cols-\[minmax\(180px\2c 22\%\)_130px_1fr\] { grid-template-columns: minmax(180px,22%) 130px 1fr; } @@ -1958,6 +2048,10 @@ video { overflow-y: auto; } +.overscroll-contain { + overscroll-behavior: contain; +} + .truncate { overflow: hidden; text-overflow: ellipsis; @@ -2133,6 +2227,10 @@ video { border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); } +.border-blue-500\/25 { + border-color: rgb(59 130 246 / 0.25); +} + .border-blue-500\/50 { border-color: rgb(59 130 246 / 0.5); } @@ -3563,6 +3661,11 @@ video { background-color: rgb(191 219 254 / 0.7); } +.bg-blue-300 { + --tw-bg-opacity: 1; + background-color: rgb(147 197 253 / var(--tw-bg-opacity, 1)); +} + .bg-blue-400 { --tw-bg-opacity: 1; background-color: rgb(96 165 250 / var(--tw-bg-opacity, 1)); @@ -3590,6 +3693,14 @@ video { background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1)); } +.bg-blue-500\/10 { + background-color: rgb(59 130 246 / 0.1); +} + +.bg-blue-500\/20 { + background-color: rgb(59 130 246 / 0.2); +} + .bg-blue-500\/85 { background-color: rgb(59 130 246 / 0.85); } @@ -3785,6 +3896,11 @@ video { background-color: rgb(168 85 247 / var(--tw-bg-opacity, 1)); } +.bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1)); +} + .bg-red-200 { --tw-bg-opacity: 1; background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1)); @@ -3897,6 +4013,10 @@ video { background-color: rgb(2 6 23 / var(--tw-bg-opacity, 1)); } +.bg-slate-950\/45 { + background-color: rgb(2 6 23 / 0.45); +} + .bg-transparent { background-color: transparent; } @@ -3956,6 +4076,10 @@ video { background-color: rgb(255 255 255 / 0.6); } +.bg-white\/70 { + background-color: rgb(255 255 255 / 0.7); +} + .bg-white\/90 { background-color: rgb(255 255 255 / 0.9); } @@ -5017,6 +5141,10 @@ video { padding-bottom: 0.25rem; } +.pb-2 { + padding-bottom: 0.5rem; +} + .pb-3 { padding-bottom: 0.75rem; } @@ -5033,6 +5161,10 @@ video { padding-left: 0.5rem; } +.pl-3 { + padding-left: 0.75rem; +} + .pl-4 { padding-left: 1rem; } @@ -5217,6 +5349,14 @@ video { line-height: 1.375; } +.tracking-\[0\.12em\] { + letter-spacing: 0.12em; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + .tracking-wide { letter-spacing: 0.025em; } @@ -5285,6 +5425,10 @@ video { color: rgb(147 197 253 / var(--tw-text-opacity, 1)); } +.text-blue-300\/70 { + color: rgb(147 197 253 / 0.7); +} + .text-blue-300\/80 { color: rgb(147 197 253 / 0.8); } @@ -5332,6 +5476,15 @@ video { color: rgb(30 58 138 / var(--tw-text-opacity, 1)); } +.text-blue-900\/75 { + color: rgb(30 58 138 / 0.75); +} + +.text-blue-950 { + --tw-text-opacity: 1; + color: rgb(23 37 84 / var(--tw-text-opacity, 1)); +} + .text-emerald-200 { --tw-text-opacity: 1; color: rgb(167 243 208 / var(--tw-text-opacity, 1)); @@ -5376,6 +5529,11 @@ video { color: rgb(6 78 59 / var(--tw-text-opacity, 1)); } +.text-emerald-950 { + --tw-text-opacity: 1; + color: rgb(2 44 34 / var(--tw-text-opacity, 1)); +} + .text-gray-100 { --tw-text-opacity: 1; color: rgb(243 244 246 / var(--tw-text-opacity, 1)); @@ -5426,6 +5584,11 @@ video { color: rgb(17 24 39 / var(--tw-text-opacity, 1)); } +.text-gray-950 { + --tw-text-opacity: 1; + color: rgb(3 7 18 / var(--tw-text-opacity, 1)); +} + .text-green-200 { --tw-text-opacity: 1; color: rgb(187 247 208 / var(--tw-text-opacity, 1)); @@ -5520,6 +5683,11 @@ video { color: rgb(127 29 29 / var(--tw-text-opacity, 1)); } +.text-red-950 { + --tw-text-opacity: 1; + color: rgb(69 10 10 / var(--tw-text-opacity, 1)); +} + .text-slate-100 { --tw-text-opacity: 1; color: rgb(241 245 249 / var(--tw-text-opacity, 1)); @@ -5654,6 +5822,10 @@ video { opacity: 0.7; } +.opacity-75 { + opacity: 0.75; +} + .opacity-80 { opacity: 0.8; } @@ -6178,6 +6350,16 @@ video { } } +.placeholder\:text-slate-600::-moz-placeholder { + --tw-text-opacity: 1; + color: rgb(71 85 105 / var(--tw-text-opacity, 1)); +} + +.placeholder\:text-slate-600::placeholder { + --tw-text-opacity: 1; + color: rgb(71 85 105 / var(--tw-text-opacity, 1)); +} + .last\:border-0:last-child { border-width: 0px; } @@ -6210,6 +6392,11 @@ video { border-color: rgb(191 219 254 / var(--tw-border-opacity, 1)); } +.hover\:border-blue-300:hover { + --tw-border-opacity: 1; + border-color: rgb(147 197 253 / var(--tw-border-opacity, 1)); +} + .hover\:border-blue-700\/40:hover { border-color: rgb(29 78 216 / 0.4); } @@ -6223,6 +6410,16 @@ video { border-color: rgb(100 116 139 / var(--tw-border-opacity, 1)); } +.hover\:border-slate-600:hover { + --tw-border-opacity: 1; + border-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); +} + +.hover\:border-slate-700:hover { + --tw-border-opacity: 1; + border-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); +} + .hover\:bg-amber-100:hover { --tw-bg-opacity: 1; background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1)); @@ -6530,6 +6727,11 @@ video { background-color: rgb(91 33 182 / var(--tw-bg-opacity, 1)); } +.hover\:bg-white:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + .hover\:bg-yellow-50:hover { --tw-bg-opacity: 1; background-color: rgb(254 252 232 / var(--tw-bg-opacity, 1)); @@ -6801,6 +7003,11 @@ video { color: rgb(91 33 182 / var(--tw-text-opacity, 1)); } +.hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + .hover\:text-yellow-50:hover { --tw-text-opacity: 1; color: rgb(254 252 232 / var(--tw-text-opacity, 1)); @@ -7140,6 +7347,11 @@ video { box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } +.focus\:ring-blue-100:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(219 234 254 / var(--tw-ring-opacity, 1)); +} + .focus\:ring-blue-400:focus { --tw-ring-opacity: 1; --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1)); @@ -7370,6 +7582,17 @@ video { --tw-ring-offset-color: #854d0e; } +.focus-visible\:ring-2:focus-visible { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus-visible\:ring-blue-400:focus-visible { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1)); +} + .active\:bg-gray-200:active { --tw-bg-opacity: 1; background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); @@ -7422,6 +7645,10 @@ video { display: flex; } + .sm\:inline-flex { + display: inline-flex; + } + .sm\:max-w-5xl { max-width: 64rem; } @@ -7466,6 +7693,11 @@ video { padding: 2rem; } + .sm\:px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; + } + .sm\:px-6 { padding-left: 1.5rem; padding-right: 1.5rem; @@ -7475,6 +7707,11 @@ video { padding-top: 1.25rem; padding-bottom: 1.25rem; } + + .sm\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } } @media (min-width: 768px) { @@ -7504,17 +7741,37 @@ video { grid-column: span 8 / span 8; } + .lg\:flex { + display: flex; + } + + .lg\:hidden { + display: none; + } + .lg\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } + .lg\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } + .lg\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + .lg\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } + + .lg\:flex-col { + flex-direction: column; + } } @media (min-width: 1280px) { @@ -7533,6 +7790,22 @@ video { .xl\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } + + .xl\:grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .xl\:grid-cols-\[minmax\(0\2c 1\.4fr\)_minmax\(320px\2c 0\.6fr\)\] { + grid-template-columns: minmax(0,1.4fr) minmax(320px,0.6fr); + } + + .xl\:grid-cols-\[minmax\(0\2c 1fr\)_320px\] { + grid-template-columns: minmax(0,1fr) 320px; + } + + .xl\:grid-cols-\[minmax\(0\2c 2fr\)_minmax\(300px\2c 1fr\)\] { + grid-template-columns: minmax(0,2fr) minmax(300px,1fr); + } } @media (min-width: 1536px) { diff --git a/python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js b/python/probing/bundled_web/public/assets/web-dxh3f25885a213214.js similarity index 69% rename from python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js rename to python/probing/bundled_web/public/assets/web-dxh3f25885a213214.js index ad0206c2..de6e1717 100644 --- a/python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js +++ b/python/probing/bundled_web/public/assets/web-dxh3f25885a213214.js @@ -1,5 +1,5 @@ -function lt(u,t,e,n){if(n==="style"){u.style.setProperty(t,e);return}if(n){u.setAttributeNS(n,t,e);return}switch(t){case"value":u.tagName==="OPTION"?Y(u,t,e):u.value!==e&&(u.value=e);break;case"initial_value":u.defaultValue=e;break;case"checked":u.checked=S(e);break;case"initial_checked":u.defaultChecked=S(e);break;case"selected":u.selected=S(e);break;case"initial_selected":u.defaultSelected=S(e);break;case"dangerous_inner_html":u.innerHTML=e;break;case"style":let r={};for(let i=0;i{for(let n of e)this.handleResizeEvent(n)})),this.resizeObserver.observe(t)}removeResizeObserver(t){this.resizeObserver&&this.resizeObserver.unobserve(t)}handleIntersectionEvent(t){let e=t.target,n=new CustomEvent("visible",{bubbles:!1,detail:t});e.dispatchEvent(n)}createIntersectionObserver(t){this.intersectionObserver||(this.intersectionObserver=new IntersectionObserver(e=>{for(let n of e)this.handleIntersectionEvent(n)})),this.intersectionObserver.observe(t)}removeIntersectionObserver(t){this.intersectionObserver&&this.intersectionObserver.unobserve(t)}createListener(t,e,n){if(t=="resize"?this.createResizeObserver(e):t=="visible"&&this.createIntersectionObserver(e),n)this.global[t]===void 0?(this.global[t]={active:1,callback:this.handler},this.root.addEventListener(t,this.handler)):this.global[t].active++;else{let r=e.getAttribute("data-dioxus-id");this.local[r]||(this.local[r]={}),e.addEventListener(t,this.handler)}}removeListener(t,e,n){e=="resize"?this.removeResizeObserver(t):e=="visible"?this.removeIntersectionObserver(t):n?this.removeBubblingListener(e):this.removeNonBubblingListener(t,e)}removeBubblingListener(t){this.global[t].active--,this.global[t].active===0&&(this.root.removeEventListener(t,this.global[t].callback),delete this.global[t])}removeNonBubblingListener(t,e){let n=t.getAttribute("data-dioxus-id");delete this.local[n][e],Object.keys(this.local[n]).length===0&&delete this.local[n],t.removeEventListener(e,this.handler)}removeAllNonBubblingListeners(t){let e=t.getAttribute("data-dioxus-id");delete this.local[e]}getNode(t){return this.nodes[t]}pushRoot(t){this.stack.push(t)}appendChildren(t,e){let n=this.nodes[t],r=this.stack.splice(this.stack.length-e);for(let i=0;i0;i--)n=n.nextSibling}return n}saveTemplate(t,e){this.templates[e]=t}hydrate_node(t,e){let n=t.getAttribute("data-node-hydration").split(","),r=e[parseInt(n[0])];if(this.nodes[r]=t,n.length>1){t.listening=n.length-1,t.setAttribute("data-dioxus-id",r.toString());for(let i=1;ii.nextNode()?i.currentNode!==a:!1;for(;i.currentNode;){let p=i.currentNode;if(p.nodeType===Node.COMMENT_NODE){let y=p.textContent,A=y.split("placeholder");if(A.length>1){if(this.nodes[t[parseInt(A[1])]]=p,!w())break;continue}let et=y.split("node-id");if(et.length>1){let x=p.nextSibling;p.remove();let z,B;if(x.nodeType===Node.COMMENT_NODE){let bt=x.parentElement.insertBefore(document.createTextNode(""),x);z=x,B=bt}else B=x,z=B.nextSibling;i.currentNode=z,this.nodes[t[parseInt(et[1])]]=B;let ft=p===r||!w();if(z.remove(),ft)break;continue}}if(!w())break}}}setAttributeInner(t,e,n,r){lt(t,e,n,r)}};var I,T,v,M,F,U=class extends Z{constructor(t){super(),this.d=t,this.m=null,this.p=null,this.ls=null,this.t=null,this.op=null,this.e=null,this.z=null,this.metaflags=null,this.u16buf=null,this.u16bufp=null,this.u32buf=null,this.u32bufp=null,this.u8buf=null,this.u8bufp=null,this.attr=[],this.attr_cache_hit=null,this.attr_cache_idx,this.get_attr=function(){return this.attr_cache_idx=this.u8buf[this.u8bufp++],this.attr_cache_idx&128?(this.attr_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.attr[this.attr_cache_idx&4294967167]=this.attr_cache_hit,this.attr_cache_hit):this.attr[this.attr_cache_idx&4294967167]},this.el=[],this.el_cache_hit=null,this.el_cache_idx,this.get_el=function(){return this.el_cache_idx=this.u8buf[this.u8bufp++],this.el_cache_idx&128?(this.el_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.el[this.el_cache_idx&4294967167]=this.el_cache_hit,this.el_cache_hit):this.el[this.el_cache_idx&4294967167]},this.evt=[],this.evt_cache_hit=null,this.evt_cache_idx,this.get_evt=function(){return this.evt_cache_idx=this.u8buf[this.u8bufp++],this.evt_cache_idx&128?(this.evt_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.evt[this.evt_cache_idx&4294967167]=this.evt_cache_hit,this.evt_cache_hit):this.evt[this.evt_cache_idx&4294967167]},this.namespace=[],this.namespace_cache_hit=null,this.namespace_cache_idx,this.get_namespace=function(){return this.namespace_cache_idx=this.u8buf[this.u8bufp++],this.namespace_cache_idx&128?(this.namespace_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.namespace[this.namespace_cache_idx&4294967167]=this.namespace_cache_hit,this.namespace_cache_hit):this.namespace[this.namespace_cache_idx&4294967167]},this.ns_cache=[],this.ns_cache_cache_hit=null,this.ns_cache_cache_idx,this.get_ns_cache=function(){return this.ns_cache_cache_idx=this.u8buf[this.u8bufp++],this.ns_cache_cache_idx&128?(this.ns_cache_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.ns_cache[this.ns_cache_cache_idx&4294967167]=this.ns_cache_cache_hit,this.ns_cache_cache_hit):this.ns_cache[this.ns_cache_cache_idx&4294967167]},this.s="",this.lsp=null,this.sp=null,this.sl=null,this.c=new TextDecoder}update_memory(t){this.m=new DataView(t.buffer)}run(){if(this.metaflags=this.m.getUint32(this.d,!0),this.metaflags>>>6&1&&(this.ls=this.m.getUint32(this.d+24,!0)),this.p=this.ls,this.metaflags>>>4&1&&(this.t=this.m.getUint32(this.d+16,!0),this.u16buf=new Uint16Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%2)/2)),this.u16bufp=0,this.metaflags>>>3&1&&(this.t=this.m.getUint32(this.d+12,!0),this.u32buf=new Uint32Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%4)/4)),this.u32bufp=0,this.metaflags>>>5&1&&(this.t=this.m.getUint32(this.d+20,!0),this.u8buf=new Uint8Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%1)/1)),this.u8bufp=0,this.metaflags&1&&(this.lsp=this.m.getUint32(this.d+4,!0)),this.metaflags>>>2&1)if(this.sl=this.m.getUint32(this.d+8,!0),this.metaflags>>>1&1){for(this.sp=this.lsp,this.s="",this.e=this.sp+(this.sl/4|0)*4;this.sp>8,(this.t&16711680)>>16,this.t>>24),this.sp+=4;for(;this.sp{this.handler(r,n,I)});break;case 25:this.nodes[this.u32buf[this.u32bufp++]]=this.loadChild((()=>{this.e=this.u8bufp+this.u32buf[this.u32bufp++];let r=this.u8buf.slice(this.u8bufp,this.e);return this.u8bufp=this.e,r})());break;case 26:{let r=this.stack.splice(this.stack.length-this.u16buf[this.u16bufp++]);this.loadChild((()=>{this.e=this.u8bufp+this.u32buf[this.u32bufp++];let a=this.u8buf.slice(this.u8bufp,this.e);return this.u8bufp=this.e,a})()).replaceWith(...r)}break;case 27:return!0}this.op>>>=8}}run_from_bytes(t){this.d=0,this.update_memory(new Uint8Array(t)),this.run()}};function nt(u,t,e,n){if(n==="style"){u.style.setProperty(t,e);return}if(n){u.setAttributeNS(n,t,e);return}switch(t){case"value":u.tagName==="OPTION"?V(u,t,e):u.value!==e&&(u.value=e);break;case"initial_value":u.defaultValue=e;break;case"checked":u.checked=N(e);break;case"initial_checked":u.defaultChecked=N(e);break;case"selected":u.selected=N(e);break;case"initial_selected":u.defaultSelected=N(e);break;case"dangerous_inner_html":u.innerHTML=e;break;case"style":let r={};for(let i=0;i0){this.waiting.shift()(t);return}this.pending.push(t)}async recv(){return new Promise((t,e)=>{if(this.pending.length>0){t(this.pending.shift());return}this.waiting.push(t)})}},D=class{inner;constructor(t){this.inner=new WeakRef(t)}rustSend(t){let e=this.inner.deref();e&&e.rustSend(t)}async rustRecv(){let t=this.inner.deref();if(t)return await t.rustRecv()}},$=class{weak(){return new D(this)}};globalThis.__nextChannelId=0;globalThis.__channels=[];var W=class extends ${js_to_rust;rust_to_js;owner;id;constructor(t){super(),this.owner=t,this.js_to_rust=new j,this.rust_to_js=new j,this.id=globalThis.__nextChannelId,globalThis.__channels[this.id]=this,globalThis.__nextChannelId+=1}weak(){return new D(this)}async recv(){return await this.rust_to_js.recv()}send(t){this.js_to_rust.send(t)}rustSend(t){this.rust_to_js.send(t)}async rustRecv(){return await this.js_to_rust.recv()}close(){globalThis.__channels[this.id]=null}};function st(){return window.__PROBING_BASE_PATH__||""}var K=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Rt.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingbytesource_free(t,0)}get autoAllocateChunkSize(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingbytesource_autoAllocateChunkSize(this.__wbg_ptr)>>>0}cancel(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();o(t),c.intounderlyingbytesource_cancel(t)}pull(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingbytesource_pull(this.__wbg_ptr,t)}start(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");o(this.__wbg_ptr),c.intounderlyingbytesource_start(this.__wbg_ptr,t)}get type(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");o(this.__wbg_ptr);let t=c.intounderlyingbytesource_type(this.__wbg_ptr);return At[t]}};Symbol.dispose&&(K.prototype[Symbol.dispose]=K.prototype.free);var q=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Ot.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingsink_free(t,0)}abort(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let e=this.__destroy_into_raw();return o(e),c.intounderlyingsink_abort(e,t)}close(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();return o(t),c.intounderlyingsink_close(t)}write(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingsink_write(this.__wbg_ptr,t)}};Symbol.dispose&&(q.prototype[Symbol.dispose]=q.prototype.free);var H=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Ct.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingsource_free(t,0)}cancel(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();o(t),c.intounderlyingsource_cancel(t)}pull(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingsource_pull(this.__wbg_ptr,t)}};Symbol.dispose&&(H.prototype[Symbol.dispose]=H.prototype.free);var L=class u{constructor(){throw new Error("cannot invoke `new` directly")}static __wrap(t){let e=Object.create(u.prototype);return e.__wbg_ptr=t,ct.register(e,e.__wbg_ptr,e),e}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,ct.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_jsowner_free(t,0)}};Symbol.dispose&&(L.prototype[Symbol.dispose]=L.prototype.free);function tt(){return{__proto__:null,"./web_bg.js":{__proto__:null,__wbg_Error_92b29b0548f8b746:function(){return s(function(t,e){return Error(l(t,e))},arguments)},__wbg_String_8564e559799eccda:function(){return s(function(t,e){let n=String(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg___wbindgen_bigint_get_as_i64_d968e41184ae354f:function(t,e){let n=e,r=typeof n=="bigint"?n:void 0;g(r)||Lt(r),_().setBigInt64(t+8,g(r)?BigInt(0):r,!0),_().setInt32(t+0,!g(r),!0)},__wbg___wbindgen_boolean_get_fa956cfa2d1bd751:function(t){let e=t,n=typeof e=="boolean"?e:void 0;return g(n)||b(n),g(n)?16777215:n?1:0},__wbg___wbindgen_debug_string_c25d447a39f5578f:function(t,e){let n=Q(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},__wbg___wbindgen_in_aca499c5de7ff5e5:function(t,e){let n=t in e;return b(n),n},__wbg___wbindgen_is_bigint_2f76dc55065b4273:function(t){let e=typeof t=="bigint";return b(e),e},__wbg___wbindgen_is_function_1ff95bcc5517c252:function(t){let e=typeof t=="function";return b(e),e},__wbg___wbindgen_is_object_a27215656b807791:function(t){let e=t,n=typeof e=="object"&&e!==null;return b(n),n},__wbg___wbindgen_is_string_ea5e6cc2e4141dfe:function(t){let e=typeof t=="string";return b(e),e},__wbg___wbindgen_is_undefined_c05833b95a3cf397:function(t){let e=t===void 0;return b(e),e},__wbg___wbindgen_jsval_eq_e659fcf7b0e32763:function(t,e){let n=t===e;return b(n),n},__wbg___wbindgen_jsval_loose_eq_db4c3b15f63fc170:function(t,e){let n=t==e;return b(n),n},__wbg___wbindgen_memory_de265df8aadd6273:function(){return c.memory},__wbg___wbindgen_number_get_394265ed1e1b84ee:function(t,e){let n=e,r=typeof n=="number"?n:void 0;g(r)||o(r),_().setFloat64(t+8,g(r)?0:r,!0),_().setInt32(t+0,!g(r),!0)},__wbg___wbindgen_string_get_b0ca35b86a603356:function(t,e){let n=e,r=typeof n=="string"?n:void 0;var i=g(r)?0:h(r,c.__wbindgen_malloc,c.__wbindgen_realloc),a=d;_().setInt32(t+4,a,!0),_().setInt32(t+0,i,!0)},__wbg___wbindgen_throw_344f42d3211c4765:function(t,e){throw new Error(l(t,e))},__wbg__wbg_cb_unref_fffb441def202758:function(){return s(function(t){t._wbg_cb_unref()},arguments)},__wbg_abort_8bae0f33e7833997:function(){return s(function(t){t.abort()},arguments)},__wbg_abort_eee9248a6d680839:function(){return s(function(t,e){t.abort(e)},arguments)},__wbg_activeElement_4bc99dc1a7094c27:function(){return s(function(t){let e=t.activeElement;return g(e)?0:m(e)},arguments)},__wbg_addEventListener_d85450ee1320c989:function(){return f(function(t,e,n,r){t.addEventListener(l(e,n),r)},arguments)},__wbg_altKey_50f830d1793a2eea:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_altKey_c5e44fde6beb66ef:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_altKey_f3e24c4c9cfcf271:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_animationName_e80680fbfd3da8a2:function(){return s(function(t,e){let n=e.animationName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_appendChild_f553e8704c4f14a6:function(){return f(function(t,e){return t.appendChild(e)},arguments)},__wbg_append_01c74e5c6b58aa64:function(){return f(function(t,e,n,r,i){t.append(l(e,n),l(r,i))},arguments)},__wbg_append_58377ae3be2fb5ef:function(){return f(function(t,e,n,r,i,a){t.append(l(e,n),r,l(i,a))},arguments)},__wbg_append_8e24caa53c80c631:function(){return f(function(t,e,n,r,i){t.append(l(e,n),l(r,i))},arguments)},__wbg_append_91733ec40ee3b1f9:function(){return f(function(t,e,n,r){t.append(l(e,n),r)},arguments)},__wbg_arrayBuffer_3b637f0fa65c5351:function(){return f(function(t){return t.arrayBuffer()},arguments)},__wbg_arrayBuffer_a158e423a87ee756:function(){return s(function(t){return t.arrayBuffer()},arguments)},__wbg_back_939cbdbdfad8aff7:function(){return f(function(t){t.back()},arguments)},__wbg_blockSize_5af477b962b2b031:function(){return s(function(t){return t.blockSize},arguments)},__wbg_blur_e902dcc79406e89c:function(){return f(function(t){t.blur()},arguments)},__wbg_body_40ec34e0a2931fe8:function(){return s(function(t){let e=t.body;return g(e)?0:m(e)},arguments)},__wbg_borderBoxSize_ff7f5405dcc6554e:function(){return s(function(t){return t.borderBoxSize},arguments)},__wbg_boundingClientRect_0776888095b16b8c:function(){return s(function(t){return t.boundingClientRect},arguments)},__wbg_bubbles_07bec919f30033ab:function(){return s(function(t){let e=t.bubbles;return b(e),e},arguments)},__wbg_buffer_54b87055582c8a81:function(){return s(function(t){return t.buffer},arguments)},__wbg_button_f6a9a7b725f1838e:function(){return s(function(t){let e=t.button;return o(e),e},arguments)},__wbg_buttons_d8acd46cf8f40ae9:function(){return s(function(t){let e=t.buttons;return o(e),e},arguments)},__wbg_byobRequest_06b654bb15590436:function(){return s(function(t){let e=t.byobRequest;return g(e)?0:m(e)},arguments)},__wbg_byteLength_41862ca4020b9c43:function(){return s(function(t){let e=t.byteLength;return o(e),e},arguments)},__wbg_byteOffset_d42e18c4441f628b:function(){return s(function(t){let e=t.byteOffset;return o(e),e},arguments)},__wbg_call_8a2dd23819f8a60a:function(){return f(function(t,e){return t.call(e)},arguments)},__wbg_call_a6e5c5dce5018821:function(){return f(function(t,e,n){return t.call(e,n)},arguments)},__wbg_changedTouches_dbf6eeabddd3c2da:function(){return s(function(t){return t.changedTouches},arguments)},__wbg_charCodeAt_2a30bc7c17474cc6:function(){return s(function(t,e){return t.charCodeAt(e>>>0)},arguments)},__wbg_checkValidity_3a31dcce278f31a1:function(){return s(function(t){let e=t.checkValidity();return b(e),e},arguments)},__wbg_checked_596d0d7b35f55a01:function(){return s(function(t){let e=t.checked;return b(e),e},arguments)},__wbg_clearData_1297d08581746c08:function(){return f(function(t,e,n){t.clearData(l(e,n))},arguments)},__wbg_clearData_a7a19d854ec1a3b7:function(){return f(function(t){t.clearData()},arguments)},__wbg_clearInterval_16e8cbbce92291d0:function(){return s(function(t){return clearInterval(t)},arguments)},__wbg_clearTimeout_113b1cde814ec762:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clearTimeout_333bba87532ab9d3:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clearTimeout_6b8d9a38b9263d65:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clientHeight_994541cde34d3ca0:function(){return s(function(t){let e=t.clientHeight;return o(e),e},arguments)},__wbg_clientWidth_6852617da948be39:function(){return s(function(t){let e=t.clientWidth;return o(e),e},arguments)},__wbg_clientX_a7dcb4081126cd4b:function(){return s(function(t){let e=t.clientX;return o(e),e},arguments)},__wbg_clientX_c396b0fb11d601d3:function(){return s(function(t){let e=t.clientX;return o(e),e},arguments)},__wbg_clientY_a4650836fdf58f01:function(){return s(function(t){let e=t.clientY;return o(e),e},arguments)},__wbg_clientY_c0560910b20ee192:function(){return s(function(t){let e=t.clientY;return o(e),e},arguments)},__wbg_close_249a23304523681b:function(){return f(function(t){t.close()},arguments)},__wbg_close_72d318d9c16e83ef:function(){return f(function(t){t.close()},arguments)},__wbg_code_89c999e407c79eef:function(){return s(function(t,e){let n=e.code,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_contentBoxSize_74fbbc51859ff90e:function(){return s(function(t){return t.contentBoxSize},arguments)},__wbg_createComment_003419d0740789d4:function(){return s(function(t,e,n){return t.createComment(l(e,n))},arguments)},__wbg_createElementNS_013b3fb26f4796ec:function(){return f(function(t,e,n,r,i){return t.createElementNS(e===0?void 0:l(e,n),l(r,i))},arguments)},__wbg_createElement_fcbc0805de826d62:function(){return f(function(t,e,n){return t.createElement(l(e,n))},arguments)},__wbg_createObjectURL_416e527781e6fd6d:function(){return f(function(t,e){let n=URL.createObjectURL(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_createTextNode_4dad5b18435dda7c:function(){return s(function(t,e,n){return t.createTextNode(l(e,n))},arguments)},__wbg_ctrlKey_2e52816fa7160097:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_ctrlKey_50bd8324959ca786:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_ctrlKey_57171169eab54da6:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_dataTransfer_c1c4745cee7e05f1:function(){return s(function(t){let e=t.dataTransfer;return g(e)?0:m(e)},arguments)},__wbg_data_f994b1bb75d8337a:function(){return s(function(t,e){let n=e.data;var r=g(n)?0:h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_deltaMode_d869228efd74f393:function(){return s(function(t){let e=t.deltaMode;return o(e),e},arguments)},__wbg_deltaX_5d829ffba565ed10:function(){return s(function(t){return t.deltaX},arguments)},__wbg_deltaY_6cfce8f8da250c23:function(){return s(function(t){return t.deltaY},arguments)},__wbg_deltaZ_42c86f225c34aa04:function(){return s(function(t){return t.deltaZ},arguments)},__wbg_detail_a90dcd774780ebf6:function(){return s(function(t){return t.detail},arguments)},__wbg_documentElement_b7ec99417969bfbc:function(){return s(function(t){let e=t.documentElement;return g(e)?0:m(e)},arguments)},__wbg_document_179650d6cb13c263:function(){return s(function(t){let e=t.document;return g(e)?0:m(e)},arguments)},__wbg_done_89b2b13e91a60321:function(){return s(function(t){let e=t.done;return b(e),e},arguments)},__wbg_dropEffect_8187d3b019f3e6bd:function(){return s(function(t,e){let n=e.dropEffect,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_effectAllowed_ca2550f3a73fb833:function(){return s(function(t,e){let n=e.effectAllowed,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_elapsedTime_0330f570ff694c6f:function(){return s(function(t){return t.elapsedTime},arguments)},__wbg_elapsedTime_4c2a1fd1473438d6:function(){return s(function(t){return t.elapsedTime},arguments)},__wbg_enqueue_6d83b4c6281bafd6:function(){return f(function(t,e){t.enqueue(e)},arguments)},__wbg_entries_015dc610cd81ede0:function(){return s(function(t){return Object.entries(t)},arguments)},__wbg_entries_8ddbe5d352d85237:function(){return s(function(t){return t.entries()},arguments)},__wbg_entries_900cefd6f70eb290:function(){return s(function(t){return t.entries()},arguments)},__wbg_error_744744ff0c9861e6:function(){return s(function(t){console.error(t)},arguments)},__wbg_fetch_074561c3e313c86f:function(){return s(function(t){return fetch(t)},arguments)},__wbg_fetch_9dad4fe911207b37:function(){return s(function(t){return fetch(t)},arguments)},__wbg_fetch_b5951fc96f52f786:function(){return s(function(t,e){return t.fetch(e)},arguments)},__wbg_files_116196bc012ac3c8:function(){return s(function(t){let e=t.files;return g(e)?0:m(e)},arguments)},__wbg_files_a4eb87e5e4343c46:function(){return s(function(t){let e=t.files;return g(e)?0:m(e)},arguments)},__wbg_focus_2f77051f98540625:function(){return f(function(t){t.focus()},arguments)},__wbg_force_368c1897f399d783:function(){return s(function(t){return t.force},arguments)},__wbg_forward_4bb54c7f45451c64:function(){return f(function(t){t.forward()},arguments)},__wbg_getAsFile_adead4fd4f4ce592:function(){return f(function(t){let e=t.getAsFile();return g(e)?0:m(e)},arguments)},__wbg_getAttribute_5a601ba4718b922a:function(){return s(function(t,e,n,r){let i=e.getAttribute(l(n,r));var a=g(i)?0:h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,a,!0)},arguments)},__wbg_getBoundingClientRect_e828e6c31c66dea6:function(){return s(function(t){return t.getBoundingClientRect()},arguments)},__wbg_getData_fcb88fae21d94f1e:function(){return f(function(t,e,n,r){let i=e.getData(l(n,r)),a=h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,a,!0)},arguments)},__wbg_getElementById_1cbd8f06dbe8eb8e:function(){return s(function(t,e,n){let r=t.getElementById(l(e,n));return g(r)?0:m(r)},arguments)},__wbg_getHours_9f6561095682ce51:function(){return s(function(t){let e=t.getHours();return o(e),e},arguments)},__wbg_getItem_b96269ddc16cf24a:function(){return f(function(t,e,n,r){let i=e.getItem(l(n,r));var a=g(i)?0:h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,a,!0)},arguments)},__wbg_getMinutes_b0d5cd90bf9b8f22:function(){return s(function(t){let e=t.getMinutes();return o(e),e},arguments)},__wbg_getNode_2f3b1f608db7c9d0:function(){return s(function(t,e){return t.getNode(e>>>0)},arguments)},__wbg_getSeconds_40c565b3a6cb05fe:function(){return s(function(t){let e=t.getSeconds();return o(e),e},arguments)},__wbg_get_507a50627bffa49b:function(){return s(function(t,e){return t[e>>>0]},arguments)},__wbg_get_757c867e2520bbc4:function(){return s(function(t,e){let n=t[e>>>0];return g(n)?0:m(n)},arguments)},__wbg_get_78f252d074a84d0b:function(){return f(function(t,e){return Reflect.get(t,e)},arguments)},__wbg_get_base_path_39628b0b6ddfa96a:function(){return s(function(t){let e=st(),n=h(e,c.__wbindgen_malloc,c.__wbindgen_realloc),r=d;_().setInt32(t+4,r,!0),_().setInt32(t+0,n,!0)},arguments)},__wbg_get_c7eb1f358a7654df:function(){return f(function(t,e){return Reflect.get(t,e)},arguments)},__wbg_get_e73985d6689d2245:function(){return s(function(t,e){let n=t[e>>>0];return g(n)?0:m(n)},arguments)},__wbg_get_select_data_60af93fcbe2f391c:function(){return s(function(t,e){let n=rt(e),r=Mt(n,c.__wbindgen_malloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_get_unchecked_6e0ad6d2a41b06f6:function(){return s(function(t,e){return t[e>>>0]},arguments)},__wbg_has_8374cf06984d8bfc:function(){return f(function(t,e){let n=Reflect.has(t,e);return b(n),n},arguments)},__wbg_hash_508149c4291ec8c2:function(){return f(function(t,e){let n=e.hash,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_head_41a60f9034e0b41a:function(){return s(function(t){let e=t.head;return g(e)?0:m(e)},arguments)},__wbg_headers_cf9c80f30e2a4eff:function(){return s(function(t){return t.headers},arguments)},__wbg_height_6f29ab40ae50636d:function(){return s(function(t){let e=t.height;return o(e),e},arguments)},__wbg_height_96c07d9559d0200a:function(){return s(function(t){return t.height},arguments)},__wbg_height_9f27216001e3c804:function(){return s(function(t){return t.height},arguments)},__wbg_hidden_c08eb1c29c138ab0:function(){return s(function(t){let e=t.hidden;return b(e),e},arguments)},__wbg_history_e648b4314d9b256e:function(){return f(function(t){return t.history},arguments)},__wbg_identifier_d30bb260fab6b02a:function(){return s(function(t){let e=t.identifier;return o(e),e},arguments)},__wbg_initialize_169e37fbdd472b20:function(){return s(function(t,e,n){t.initialize(e,n)},arguments)},__wbg_inlineSize_3c8412828bef21eb:function(){return s(function(t){return t.inlineSize},arguments)},__wbg_instanceof_AnimationEvent_3a83c3d21fbd4d01:function(){return s(function(t){let e;try{e=t instanceof AnimationEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_ArrayBuffer_4480b9e0068a8adb:function(){return s(function(t){let e;try{e=t instanceof ArrayBuffer}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Blob_c6523f92a32c8695:function(){return s(function(t){let e;try{e=t instanceof Blob}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_CompositionEvent_6fef075df3b5dbf4:function(){return s(function(t){let e;try{e=t instanceof CompositionEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_CustomEvent_9b848ed45794fd3e:function(){return s(function(t){let e;try{e=t instanceof CustomEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Document_d1955f84f5d0351c:function(){return s(function(t){let e;try{e=t instanceof Document}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_DragEvent_7bd2cb4c087838f2:function(){return s(function(t){let e;try{e=t instanceof DragEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Element_beebfaab75d12d9d:function(){return s(function(t){let e;try{e=t instanceof Element}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Event_512f3841fa744d1e:function(){return s(function(t){let e;try{e=t instanceof Event}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_File_ee62de53bca2e697:function(){return s(function(t){let e;try{e=t instanceof File}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_FocusEvent_cadb56dad3dfd4ac:function(){return s(function(t){let e;try{e=t instanceof FocusEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlElement_4493a09212d3586f:function(){return s(function(t){let e;try{e=t instanceof HTMLElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlFormElement_ebf2bd35b418e93e:function(){return s(function(t){let e;try{e=t instanceof HTMLFormElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlInputElement_ad3be04339d0e4df:function(){return s(function(t){let e;try{e=t instanceof HTMLInputElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlSelectElement_b4698f847dc49da5:function(){return s(function(t){let e;try{e=t instanceof HTMLSelectElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlTextAreaElement_37795f65e16b7ed0:function(){return s(function(t){let e;try{e=t instanceof HTMLTextAreaElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_KeyboardEvent_be49f2d8e15d587a:function(){return s(function(t){let e;try{e=t instanceof KeyboardEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Map_e5b5e3db98422fcc:function(){return s(function(t){let e;try{e=t instanceof Map}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_MouseEvent_89eddfc6203c1749:function(){return s(function(t){let e;try{e=t instanceof MouseEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Node_d29e7ded486fd76a:function(){return s(function(t){let e;try{e=t instanceof Node}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_PointerEvent_8ef1feb51407c0ed:function(){return s(function(t){let e;try{e=t instanceof PointerEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Response_c8b64b2256f01bec:function(){return s(function(t){let e;try{e=t instanceof Response}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_TouchEvent_62e9e212135a784b:function(){return s(function(t){let e;try{e=t instanceof TouchEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_TransitionEvent_a1842850468877e4:function(){return s(function(t){let e;try{e=t instanceof TransitionEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Uint8Array_309b927aaf7a3fc7:function(){return s(function(t){let e;try{e=t instanceof Uint8Array}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_WheelEvent_8a8f43ee9318fcd4:function(){return s(function(t){let e;try{e=t instanceof WheelEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Window_05ba1ee4f6781663:function(){return s(function(t){let e;try{e=t instanceof Window}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_intersectionRatio_7c65292cc5ad712c:function(){return s(function(t){return t.intersectionRatio},arguments)},__wbg_intersectionRect_be1020a3be2ed245:function(){return s(function(t){return t.intersectionRect},arguments)},__wbg_isArray_0677c962b281d01a:function(){return s(function(t){let e=Array.isArray(t);return b(e),e},arguments)},__wbg_isComposing_919a0fdf6ac030c9:function(){return s(function(t){let e=t.isComposing;return b(e),e},arguments)},__wbg_isIntersecting_fc6d9529a49c5d62:function(){return s(function(t){let e=t.isIntersecting;return b(e),e},arguments)},__wbg_isPrimary_e59b27f91017e844:function(){return s(function(t){let e=t.isPrimary;return b(e),e},arguments)},__wbg_isSafeInteger_04f36e4056f1b851:function(){return s(function(t){let e=Number.isSafeInteger(t);return b(e),e},arguments)},__wbg_item_74998074fc497f92:function(){return s(function(t,e){let n=t.item(e>>>0);return g(n)?0:m(n)},arguments)},__wbg_items_350b6f2d566d3def:function(){return s(function(t){return t.items},arguments)},__wbg_iterator_6f722e4a93058b71:function(){return s(function(){return Symbol.iterator},arguments)},__wbg_key_803dca86cdcfa8dd:function(){return s(function(t,e){let n=e.key,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_kind_c494ca014c671a6f:function(){return s(function(t,e){let n=e.kind,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_lastModified_41250e8004d0f7ce:function(){return s(function(t){return t.lastModified},arguments)},__wbg_left_7e76a74d0db1754f:function(){return s(function(t){return t.left},arguments)},__wbg_length_02c64e687322fa34:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_1f0964f4a5e2c6d8:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_370319915dc99107:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_e08fc23135c66d6f:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_eea4bfa35e75c87c:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_ef21514bf74fe712:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_localStorage_5bf6ce3f8e51412a:function(){return f(function(t){let e=t.localStorage;return g(e)?0:m(e)},arguments)},__wbg_location_8f24df2c257fb974:function(){return s(function(t){let e=t.location;return o(e),e},arguments)},__wbg_location_c9a2271428996698:function(){return s(function(t){return t.location},arguments)},__wbg_log_0c201ade58bb55e1:function(){return s(function(t,e,n,r,i,a,w,p){let y,A;try{y=t,A=e,console.log(l(t,e),l(n,r),l(i,a),l(w,p))}finally{c.__wbindgen_free(y,A,1)}},arguments)},__wbg_log_ce2c4456b290c5e7:function(){return s(function(t,e){let n,r;try{n=t,r=e,console.log(l(t,e))}finally{c.__wbindgen_free(n,r,1)}},arguments)},__wbg_mark_b4d943f3bc2d2404:function(){return s(function(t,e){performance.mark(l(t,e))},arguments)},__wbg_measure_84362959e621a2c1:function(){return f(function(t,e,n,r){let i,a,w,p;try{i=t,a=e,w=n,p=r,performance.measure(l(t,e),l(n,r))}finally{c.__wbindgen_free(i,a,1),c.__wbindgen_free(w,p,1)}},arguments)},__wbg_metaKey_7a85debd51844822:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_metaKey_d961c7572a9f84f5:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_metaKey_f934f09e37889d70:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_name_14e920dc23fffd96:function(){return s(function(t,e){let n=e.name,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_name_d7d79f5466e37447:function(){return s(function(t,e){let n=e.name,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_new_0912d735e8fbc1d3:function(){return f(function(){return new FormData},arguments)},__wbg_new_0_3da9e97f24fc69be:function(){return s(function(){return new Date},arguments)},__wbg_new_0d809930cd1354c6:function(){return f(function(){return new Headers},arguments)},__wbg_new_22598f2b091dadf2:function(){return s(function(t){return new W(L.__wrap(t))},arguments)},__wbg_new_26bdcffba762c064:function(){return s(function(t){return new U(t>>>0)},arguments)},__wbg_new_32b398fb48b6d94a:function(){return s(function(){return new Array},arguments)},__wbg_new_41e6f99b2fd20423:function(){return f(function(){return new FileReader},arguments)},__wbg_new_4339b2a2675a03e3:function(){return f(function(){return new AbortController},arguments)},__wbg_new_7796ffc7ed656783:function(){return s(function(){return new Map},arguments)},__wbg_new_9792ad3275d1dd31:function(){return f(function(){return new DataTransfer},arguments)},__wbg_new_b667d279fd5aa943:function(){return s(function(t,e){return new Error(l(t,e))},arguments)},__wbg_new_cd45aabdf6073e84:function(){return s(function(t){return new Uint8Array(t)},arguments)},__wbg_new_da52cf8fe3429cb2:function(){return s(function(){return new Object},arguments)},__wbg_new_from_slice_77cdfb7977362f3c:function(){return s(function(t,e){return new Uint8Array(J(t,e))},arguments)},__wbg_new_typed_1824d93f294193e5:function(){return s(function(t,e){try{var n={a:t,b:e},r=(a,w)=>{let p=n.a;n.a=0;try{return It(p,n.b,a,w)}finally{n.a=p}};return new Promise(r)}finally{n.a=0}},arguments)},__wbg_new_with_args_200d82645b6544eb:function(){return s(function(t,e,n,r){return new Function(l(t,e),l(n,r))},arguments)},__wbg_new_with_byte_offset_and_length_54c7724ee3ec7d82:function(){return s(function(t,e,n){return new Uint8Array(t,e>>>0,n>>>0)},arguments)},__wbg_new_with_form_e4ca634e481666c7:function(){return f(function(t){return new FormData(t)},arguments)},__wbg_new_with_str_and_init_d95cbe11ce28e65e:function(){return f(function(t,e,n){return new Request(l(t,e),n)},arguments)},__wbg_new_with_str_sequence_and_options_9db076dc44ddbeb0:function(){return f(function(t,e){return new Blob(t,e)},arguments)},__wbg_new_with_u8_array_sequence_and_options_2c1900e5a5c93850:function(){return f(function(t,e){return new Blob(t,e)},arguments)},__wbg_next_6dbf2c0ac8cde20f:function(){return s(function(t){return t.next},arguments)},__wbg_next_71f2aa1cb3d1e37e:function(){return f(function(t){return t.next()},arguments)},__wbg_now_86c0d4ba3fa605b8:function(){return s(function(){return Date.now()},arguments)},__wbg_offsetX_fdc5eb20edabaadb:function(){return s(function(t){let e=t.offsetX;return o(e),e},arguments)},__wbg_offsetY_0a05e99022d21c5b:function(){return s(function(t){let e=t.offsetY;return o(e),e},arguments)},__wbg_open_221b279749ba2e4e:function(){return f(function(t,e,n,r,i){let a=t.open(l(e,n),l(r,i));return g(a)?0:m(a)},arguments)},__wbg_origin_ed66c06e67ad2049:function(){return f(function(t,e){let n=e.origin,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_ownerDocument_5a7a5473f8709b3e:function(){return s(function(t){let e=t.ownerDocument;return g(e)?0:m(e)},arguments)},__wbg_pageX_56e23ef1ade65aa7:function(){return s(function(t){let e=t.pageX;return o(e),e},arguments)},__wbg_pageX_9c5f057472795ea1:function(){return s(function(t){let e=t.pageX;return o(e),e},arguments)},__wbg_pageY_12d134258ad141c4:function(){return s(function(t){let e=t.pageY;return o(e),e},arguments)},__wbg_pageY_d421aa8cfce954d6:function(){return s(function(t){let e=t.pageY;return o(e),e},arguments)},__wbg_parentElement_5030754e30795652:function(){return s(function(t){let e=t.parentElement;return g(e)?0:m(e)},arguments)},__wbg_pathname_d27a358088ce7b2b:function(){return f(function(t,e){let n=e.pathname,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pointerId_ea33d2695be12e7f:function(){return s(function(t){let e=t.pointerId;return o(e),e},arguments)},__wbg_pointerType_d5e932608aa61bb6:function(){return s(function(t,e){let n=e.pointerType,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pressure_9a7845d9744ae9f4:function(){return s(function(t){return t.pressure},arguments)},__wbg_preventDefault_b64888c857500682:function(){return s(function(t){t.preventDefault()},arguments)},__wbg_propertyName_835d4a18e8327b10:function(){return s(function(t,e){let n=e.propertyName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_prototypesetcall_4770620bbe4688a0:function(){return s(function(t,e,n){Uint8Array.prototype.set.call(J(t,e),n)},arguments)},__wbg_pseudoElement_174adc902d41a1c1:function(){return s(function(t,e){let n=e.pseudoElement,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pseudoElement_6013088f8877903f:function(){return s(function(t,e){let n=e.pseudoElement,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pushState_3d01701623122bc8:function(){return f(function(t,e,n,r,i,a){t.pushState(e,l(n,r),i===0?void 0:l(i,a))},arguments)},__wbg_push_d2ae3af0c1217ae6:function(){return s(function(t,e){let n=t.push(e);return o(n),n},arguments)},__wbg_queueMicrotask_0ab5b2d2393e99b9:function(){return s(function(t){return t.queueMicrotask},arguments)},__wbg_queueMicrotask_6a09b7bc46549209:function(){return s(function(t){queueMicrotask(t)},arguments)},__wbg_radiusX_06f8dad66dfba7a4:function(){return s(function(t){let e=t.radiusX;return o(e),e},arguments)},__wbg_radiusY_0658ca1fd998f494:function(){return s(function(t){let e=t.radiusY;return o(e),e},arguments)},__wbg_readAsArrayBuffer_7db0a55c6c3a2b4e:function(){return f(function(t,e){t.readAsArrayBuffer(e)},arguments)},__wbg_readAsText_a8f6dfc210ba1a8e:function(){return f(function(t,e){t.readAsText(e)},arguments)},__wbg_removeAttribute_1e7d2c409776d836:function(){return f(function(t,e,n){t.removeAttribute(l(e,n))},arguments)},__wbg_removeEventListener_a3f23c70077bdcc1:function(){return f(function(t,e,n,r){t.removeEventListener(l(e,n),r)},arguments)},__wbg_removeItem_78e03a38da96e0ae:function(){return f(function(t,e,n){t.removeItem(l(e,n))},arguments)},__wbg_repeat_4e131e99bff9b9f4:function(){return s(function(t){let e=t.repeat;return b(e),e},arguments)},__wbg_replaceState_9a0a4a53d3bf3439:function(){return f(function(t,e,n,r,i,a){t.replaceState(e,l(n,r),i===0?void 0:l(i,a))},arguments)},__wbg_requestAnimationFrame_1a85deeab66448c2:function(){return f(function(t,e){let n=t.requestAnimationFrame(e);return o(n),n},arguments)},__wbg_resolve_2191a4dfe481c25b:function(){return s(function(t){return Promise.resolve(t)},arguments)},__wbg_respond_510e32df8aeb6817:function(){return f(function(t,e){t.respond(e>>>0)},arguments)},__wbg_result_53fd7283ffc3cdb8:function(){return f(function(t){return t.result},arguments)},__wbg_rootBounds_f45f30011740fdb2:function(){return s(function(t){let e=t.rootBounds;return g(e)?0:m(e)},arguments)},__wbg_rotationAngle_d0a0b686498034d7:function(){return s(function(t){return t.rotationAngle},arguments)},__wbg_run_9f0b5ec848bddc2d:function(){return s(function(t){t.run()},arguments)},__wbg_rustRecv_ce812a5965920185:function(){return s(function(t){return t.rustRecv()},arguments)},__wbg_rustSend_27a0ddfb6f0fa952:function(){return s(function(t,e){t.rustSend(e)},arguments)},__wbg_saveTemplate_4aa5c34bf8b14cc9:function(){return s(function(t,e,n,r){var i=zt(e,n).slice();c.__wbindgen_free(e,n*4,4),t.saveTemplate(i,r)},arguments)},__wbg_screenX_0a3f7a47942676bd:function(){return s(function(t){let e=t.screenX;return o(e),e},arguments)},__wbg_screenX_bd1fb25d48033c9c:function(){return s(function(t){let e=t.screenX;return o(e),e},arguments)},__wbg_screenY_30eadec06612b80f:function(){return s(function(t){let e=t.screenY;return o(e),e},arguments)},__wbg_screenY_7e467250657a3c56:function(){return s(function(t){let e=t.screenY;return o(e),e},arguments)},__wbg_scrollHeight_8cf19eb16ebc9b9b:function(){return s(function(t){let e=t.scrollHeight;return o(e),e},arguments)},__wbg_scrollIntoView_d8b806f471b7418e:function(){return s(function(t,e){t.scrollIntoView(e)},arguments)},__wbg_scrollLeft_5be50f489b342a09:function(){return s(function(t){let e=t.scrollLeft;return o(e),e},arguments)},__wbg_scrollTo_cac0dff19f631942:function(){return s(function(t,e,n){t.scrollTo(e,n)},arguments)},__wbg_scrollTop_b3effa9c5de14d21:function(){return s(function(t){let e=t.scrollTop;return o(e),e},arguments)},__wbg_scrollWidth_38006a7134cdfeff:function(){return s(function(t){let e=t.scrollWidth;return o(e),e},arguments)},__wbg_scrollX_9da7f7defce2297e:function(){return f(function(t){return t.scrollX},arguments)},__wbg_scrollY_b4c56e98c6d976ad:function(){return f(function(t){return t.scrollY},arguments)},__wbg_scroll_4a3297b235bee8de:function(){return s(function(t,e){t.scroll(e)},arguments)},__wbg_search_af2555aa41bd23cc:function(){return f(function(t,e){let n=e.search,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_setAttributeInner_11a30d36aa43287e:function(){return s(function(t,e,n,r,i,a){nt(t,l(e,n),r,i===0?void 0:l(i,a))},arguments)},__wbg_setAttribute_71039043be82d098:function(){return f(function(t,e,n,r,i){t.setAttribute(l(e,n),l(r,i))},arguments)},__wbg_setData_19a2f9f5b313cbd6:function(){return f(function(t,e,n,r,i){t.setData(l(e,n),l(r,i))},arguments)},__wbg_setInterval_84b64f01452a246e:function(){return f(function(t,e){return setInterval(t,e)},arguments)},__wbg_setItem_364a11cf21db9039:function(){return f(function(t,e,n,r,i){t.setItem(l(e,n),l(r,i))},arguments)},__wbg_setProperty_e4e51b1b1d681d15:function(){return f(function(t,e,n,r,i){t.setProperty(l(e,n),l(r,i))},arguments)},__wbg_setTimeout_3a808dd861dd3c12:function(){return s(function(t,e){return setTimeout(t,e)},arguments)},__wbg_setTimeout_ef24d2fc3ad97385:function(){return f(function(t,e){return setTimeout(t,e)},arguments)},__wbg_setTimeout_f757f00851f76c42:function(){return s(function(t,e){return setTimeout(t,e)},arguments)},__wbg_set_4d7dd76f3dae2926:function(){return s(function(t,e,n){t.set(J(e,n))},arguments)},__wbg_set_575dd786d51585f8:function(){return s(function(t,e,n){return t.set(e,n)},arguments)},__wbg_set_6be42768c690e380:function(){return s(function(t,e,n){t[e]=n},arguments)},__wbg_set_8a16b38e4805b298:function(){return s(function(t,e,n){t[e>>>0]=n},arguments)},__wbg_set_behavior_af2ac621388b739f:function(){return s(function(t,e){t.behavior=ut[e]},arguments)},__wbg_set_behavior_f9f984e684b645bc:function(){return s(function(t,e){t.behavior=ut[e]},arguments)},__wbg_set_block_8135b3acafa1ca88:function(){return s(function(t,e){t.block=it[e]},arguments)},__wbg_set_body_029f2d171e0a005f:function(){return s(function(t,e){t.body=e},arguments)},__wbg_set_cache_b4a740b195c051f4:function(){return s(function(t,e){t.cache=xt[e]},arguments)},__wbg_set_credentials_bb34a40189e3b43b:function(){return s(function(t,e){t.credentials=Tt[e]},arguments)},__wbg_set_dropEffect_ee044779833a313d:function(){return s(function(t,e,n){t.dropEffect=l(e,n)},arguments)},__wbg_set_effectAllowed_70e1a79093efb47f:function(){return s(function(t,e,n){t.effectAllowed=l(e,n)},arguments)},__wbg_set_headers_9c61d123c3ee1f10:function(){return s(function(t,e){t.headers=e},arguments)},__wbg_set_href_960e4284e5cae151:function(){return f(function(t,e,n){t.href=l(e,n)},arguments)},__wbg_set_inline_77b0fb4f96d76814:function(){return s(function(t,e){t.inline=it[e]},arguments)},__wbg_set_left_18508443258534ad:function(){return s(function(t,e){t.left=e},arguments)},__wbg_set_method_5532d59b92d76467:function(){return s(function(t,e,n){t.method=l(e,n)},arguments)},__wbg_set_mode_66c79886ad78fc05:function(){return s(function(t,e){t.mode=St[e]},arguments)},__wbg_set_onload_4dc1f96725e4138c:function(){return s(function(t,e){t.onload=e},arguments)},__wbg_set_scrollRestoration_29b3e9dc74898bc5:function(){return f(function(t,e){t.scrollRestoration=Nt[e]},arguments)},__wbg_set_signal_c4ef8faddb4c1446:function(){return s(function(t,e){t.signal=e},arguments)},__wbg_set_textContent_54dcad83ae15772d:function(){return s(function(t,e,n){t.textContent=e===0?void 0:l(e,n)},arguments)},__wbg_set_top_29926a592a2d228a:function(){return s(function(t,e){t.top=e},arguments)},__wbg_set_type_8ce203e412e28cf6:function(){return s(function(t,e,n){t.type=l(e,n)},arguments)},__wbg_shiftKey_42866b295d317445:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_shiftKey_9bcb8bdd60c2f152:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_shiftKey_9f797da486b2ade8:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_signal_dad7cb35193abd31:function(){return s(function(t){return t.signal},arguments)},__wbg_size_6304a694765921a9:function(){return s(function(t){return t.size},arguments)},__wbg_state_edcc5b2da67f07f2:function(){return f(function(t){return t.state},arguments)},__wbg_static_accessor_GLOBAL_4ef717fb391d88b7:function(){return s(function(){let t=typeof global>"u"?null:global;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_GLOBAL_THIS_8d1badc68b5a74f4:function(){return s(function(){let t=typeof globalThis>"u"?null:globalThis;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_SELF_146583524fe1469b:function(){return s(function(){let t=typeof self>"u"?null:self;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_WINDOW_f2829a2234d7819e:function(){return s(function(){let t=typeof window>"u"?null:window;return g(t)?0:m(t)},arguments)},__wbg_status_c45b3b9b3033184a:function(){return s(function(t){let e=t.status;return o(e),e},arguments)},__wbg_stringify_b54333f60f1e4dad:function(){return f(function(t){return JSON.stringify(t)},arguments)},__wbg_style_6657aed849e5d757:function(){return s(function(t){return t.style},arguments)},__wbg_tagName_d99c8072027f3c98:function(){return s(function(t,e){let n=e.tagName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_tangentialPressure_979a239d3db31d90:function(){return s(function(t){return t.tangentialPressure},arguments)},__wbg_targetTouches_3e9bdb053b2d5023:function(){return s(function(t){return t.targetTouches},arguments)},__wbg_target_e759594a8d965ed7:function(){return s(function(t){let e=t.target;return g(e)?0:m(e)},arguments)},__wbg_textContent_37277f66248f39e6:function(){return s(function(t,e){let n=e.textContent;var r=g(n)?0:h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_text_d3a29f7525a132c3:function(){return f(function(t){return t.text()},arguments)},__wbg_then_16d107c451e9905d:function(){return s(function(t,e,n){return t.then(e,n)},arguments)},__wbg_then_6ec10ae38b3e92f7:function(){return s(function(t,e){return t.then(e)},arguments)},__wbg_tiltX_1327e8185e612854:function(){return s(function(t){let e=t.tiltX;return o(e),e},arguments)},__wbg_tiltY_b44744ee36b60a24:function(){return s(function(t){let e=t.tiltY;return o(e),e},arguments)},__wbg_time_2e33e99ff5e53342:function(){return s(function(t){return t.time},arguments)},__wbg_top_fe120acfa924a430:function(){return s(function(t){return t.top},arguments)},__wbg_touches_a631c50f1b367753:function(){return s(function(t){return t.touches},arguments)},__wbg_twist_6cc18194426f8a4f:function(){return s(function(t){let e=t.twist;return o(e),e},arguments)},__wbg_type_06f2150affb3c059:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_type_9d13c17ea2611dd0:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_type_c1987e7fbaf7340e:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_update_memory_ddf6b41a329aec73:function(){return s(function(t,e){t.update_memory(e)},arguments)},__wbg_url_abdb8fb08377f8c0:function(){return s(function(t,e){let n=e.url,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_1f687dfa7d6c3d08:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_a5d5488a9589444a:function(){return s(function(t){return t.value},arguments)},__wbg_value_c40f8f7227bb3a9e:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_d7621df0105931d8:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_view_21f1d4a4f175dfa9:function(){return s(function(t){let e=t.view;return g(e)?0:m(e)},arguments)},__wbg_weak_4a47d74ffa0a7f96:function(){return s(function(t){return t.weak()},arguments)},__wbg_width_16032a5bda5e6fa9:function(){return s(function(t){let e=t.width;return o(e),e},arguments)},__wbg_width_20c45c895834b83f:function(){return s(function(t){return t.width},arguments)},__wbg_width_219185400361db86:function(){return s(function(t){return t.width},arguments)},__wbg_x_71553b4e719d215a:function(){return s(function(t){return t.x},arguments)},__wbg_y_111b04aa46dc0f86:function(){return s(function(t){return t.y},arguments)},__wbindgen_cast_0000000000000001:function(){return s(function(t,e){return k(t,e,Et)},arguments)},__wbindgen_cast_0000000000000002:function(){return s(function(t,e){return k(t,e,yt)},arguments)},__wbindgen_cast_0000000000000003:function(){return s(function(t,e){return k(t,e,vt)},arguments)},__wbindgen_cast_0000000000000004:function(){return s(function(t,e){return Bt(t,e,kt)},arguments)},__wbindgen_cast_0000000000000005:function(){return s(function(t,e){return k(t,e,ht)},arguments)},__wbindgen_cast_0000000000000006:function(){return s(function(t,e){return k(t,e,wt)},arguments)},__wbindgen_cast_0000000000000007:function(){return s(function(t,e){return k(t,e,mt)},arguments)},__wbindgen_cast_0000000000000008:function(){return s(function(t,e){return k(t,e,pt)},arguments)},__wbindgen_cast_0000000000000009:function(){return s(function(t){return t},arguments)},__wbindgen_cast_000000000000000a:function(){return s(function(t){return t},arguments)},__wbindgen_cast_000000000000000b:function(){return s(function(t,e){return l(t,e)},arguments)},__wbindgen_cast_000000000000000c:function(){return s(function(t){return BigInt.asUintN(64,t)},arguments)},__wbindgen_init_externref_table:function(){let t=c.__wbindgen_externrefs,e=t.grow(4);t.set(0,void 0),t.set(e+0,void 0),t.set(e+1,null),t.set(e+2,!0),t.set(e+3,!1)}}}}function ht(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h790c723772977d15E(u,t)}function wt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h59cad6d2488dca29E(u,t)}function mt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h9761498151360b23E(u,t)}function pt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h8e4f100a6c778e58E(u,t)}function yt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h7dd8c6f9e9c12966E(u,t,e)}function vt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17hd9e6853fc436a5f1E(u,t,e)}function kt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_1_6invoke17h3dab76294ffea566E(u,t,e)}function Et(u,t,e){o(u),o(t);let n=c._ZN12wasm_bindgen7convert8closures1_6invoke17hceaf1cd31a005417E(u,t,e);if(n[1])throw Ft(n[0])}function It(u,t,e,n){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h04eb02ab906308ebE(u,t,e,n)}var At=["bytes"],xt=["default","no-store","reload","no-cache","force-cache","only-if-cached"],Tt=["omit","same-origin","include"],St=["same-origin","no-cors","cors","navigate"],ut=["auto","instant","smooth"],it=["start","center","end","nearest"],Nt=["auto","manual"],Rt=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingbytesource_free(u,1)),Ot=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingsink_free(u,1)),Ct=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingsource_free(u,1)),ct=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_jsowner_free(u,1));function m(u){let t=c.__externref_table_alloc();return c.__wbindgen_externrefs.set(t,u),t}function Lt(u){if(typeof u!="bigint")throw new Error(`expected a bigint argument, found ${typeof u}`)}function b(u){if(typeof u!="boolean")throw new Error(`expected a boolean argument, found ${typeof u}`)}function o(u){if(typeof u!="number")throw new Error(`expected a number argument, found ${typeof u}`)}var X=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbindgen_destroy_closure(u.a,u.b));function Q(u){let t=typeof u;if(t=="number"||t=="boolean"||u==null)return`${u}`;if(t=="string")return`"${u}"`;if(t=="symbol"){let r=u.description;return r==null?"Symbol":`Symbol(${r})`}if(t=="function"){let r=u.name;return typeof r=="string"&&r.length>0?`Function(${r})`:"Function"}if(Array.isArray(u)){let r=u.length,i="[";r>0&&(i+=Q(u[0]));for(let a=1;a1)n=e[1];else return toString.call(u);if(n=="Object")try{return"Object("+JSON.stringify(u)+")"}catch{return"Object"}return u instanceof Error?`${u.name}: ${u.message} -${u.stack}`:n}function zt(u,t){u=u>>>0;let e=_(),n=[];for(let r=u;r>>0,O().subarray(u/1,u/1+t)}var E=null;function _(){return(E===null||E.buffer.detached===!0||E.buffer.detached===void 0&&E.buffer!==c.memory.buffer)&&(E=new DataView(c.memory.buffer)),E}function l(u,t){return jt(u>>>0,t)}var R=null;function O(){return(R===null||R.byteLength===0)&&(R=new Uint8Array(c.memory.buffer)),R}function f(u,t){try{return u.apply(this,t)}catch(e){let n=m(e);c.__wbindgen_exn_store(n)}}function g(u){return u==null}function s(u,t){try{return u.apply(this,t)}catch(e){let n=(function(){try{return e instanceof Error?`${e.message} +function lt(u,t,e,n){if(n==="style"){u.style.setProperty(t,e);return}if(n){u.setAttributeNS(n,t,e);return}switch(t){case"value":u.tagName==="OPTION"?Y(u,t,e):u.value!==e&&(u.value=e);break;case"initial_value":u.defaultValue=e;break;case"checked":u.checked=S(e);break;case"initial_checked":u.defaultChecked=S(e);break;case"selected":u.selected=S(e);break;case"initial_selected":u.defaultSelected=S(e);break;case"dangerous_inner_html":u.innerHTML=e;break;case"style":let r={};for(let i=0;i{for(let n of e)this.handleResizeEvent(n)})),this.resizeObserver.observe(t)}removeResizeObserver(t){this.resizeObserver&&this.resizeObserver.unobserve(t)}handleIntersectionEvent(t){let e=t.target,n=new CustomEvent("visible",{bubbles:!1,detail:t});e.dispatchEvent(n)}createIntersectionObserver(t){this.intersectionObserver||(this.intersectionObserver=new IntersectionObserver(e=>{for(let n of e)this.handleIntersectionEvent(n)})),this.intersectionObserver.observe(t)}removeIntersectionObserver(t){this.intersectionObserver&&this.intersectionObserver.unobserve(t)}createListener(t,e,n){if(t=="resize"?this.createResizeObserver(e):t=="visible"&&this.createIntersectionObserver(e),n)this.global[t]===void 0?(this.global[t]={active:1,callback:this.handler},this.root.addEventListener(t,this.handler)):this.global[t].active++;else{let r=e.getAttribute("data-dioxus-id");this.local[r]||(this.local[r]={}),e.addEventListener(t,this.handler)}}removeListener(t,e,n){e=="resize"?this.removeResizeObserver(t):e=="visible"?this.removeIntersectionObserver(t):n?this.removeBubblingListener(e):this.removeNonBubblingListener(t,e)}removeBubblingListener(t){this.global[t].active--,this.global[t].active===0&&(this.root.removeEventListener(t,this.global[t].callback),delete this.global[t])}removeNonBubblingListener(t,e){let n=t.getAttribute("data-dioxus-id");delete this.local[n][e],Object.keys(this.local[n]).length===0&&delete this.local[n],t.removeEventListener(e,this.handler)}removeAllNonBubblingListeners(t){let e=t.getAttribute("data-dioxus-id");delete this.local[e]}getNode(t){return this.nodes[t]}pushRoot(t){this.stack.push(t)}appendChildren(t,e){let n=this.nodes[t],r=this.stack.splice(this.stack.length-e);for(let i=0;i0;i--)n=n.nextSibling}return n}saveTemplate(t,e){this.templates[e]=t}hydrate_node(t,e){let n=t.getAttribute("data-node-hydration").split(","),r=e[parseInt(n[0])];if(this.nodes[r]=t,n.length>1){t.listening=n.length-1,t.setAttribute("data-dioxus-id",r.toString());for(let i=1;ii.nextNode()?i.currentNode!==f:!1;for(;i.currentNode;){let p=i.currentNode;if(p.nodeType===Node.COMMENT_NODE){let y=p.textContent,A=y.split("placeholder");if(A.length>1){if(this.nodes[t[parseInt(A[1])]]=p,!w())break;continue}let et=y.split("node-id");if(et.length>1){let x=p.nextSibling;p.remove();let z,B;if(x.nodeType===Node.COMMENT_NODE){let bt=x.parentElement.insertBefore(document.createTextNode(""),x);z=x,B=bt}else B=x,z=B.nextSibling;i.currentNode=z,this.nodes[t[parseInt(et[1])]]=B;let ft=p===r||!w();if(z.remove(),ft)break;continue}}if(!w())break}}}setAttributeInner(t,e,n,r){lt(t,e,n,r)}};var I,T,v,M,F,U=class extends Z{constructor(t){super(),this.d=t,this.m=null,this.p=null,this.ls=null,this.t=null,this.op=null,this.e=null,this.z=null,this.metaflags=null,this.u16buf=null,this.u16bufp=null,this.u32buf=null,this.u32bufp=null,this.u8buf=null,this.u8bufp=null,this.attr=[],this.attr_cache_hit=null,this.attr_cache_idx,this.get_attr=function(){return this.attr_cache_idx=this.u8buf[this.u8bufp++],this.attr_cache_idx&128?(this.attr_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.attr[this.attr_cache_idx&4294967167]=this.attr_cache_hit,this.attr_cache_hit):this.attr[this.attr_cache_idx&4294967167]},this.el=[],this.el_cache_hit=null,this.el_cache_idx,this.get_el=function(){return this.el_cache_idx=this.u8buf[this.u8bufp++],this.el_cache_idx&128?(this.el_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.el[this.el_cache_idx&4294967167]=this.el_cache_hit,this.el_cache_hit):this.el[this.el_cache_idx&4294967167]},this.evt=[],this.evt_cache_hit=null,this.evt_cache_idx,this.get_evt=function(){return this.evt_cache_idx=this.u8buf[this.u8bufp++],this.evt_cache_idx&128?(this.evt_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.evt[this.evt_cache_idx&4294967167]=this.evt_cache_hit,this.evt_cache_hit):this.evt[this.evt_cache_idx&4294967167]},this.namespace=[],this.namespace_cache_hit=null,this.namespace_cache_idx,this.get_namespace=function(){return this.namespace_cache_idx=this.u8buf[this.u8bufp++],this.namespace_cache_idx&128?(this.namespace_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.namespace[this.namespace_cache_idx&4294967167]=this.namespace_cache_hit,this.namespace_cache_hit):this.namespace[this.namespace_cache_idx&4294967167]},this.ns_cache=[],this.ns_cache_cache_hit=null,this.ns_cache_cache_idx,this.get_ns_cache=function(){return this.ns_cache_cache_idx=this.u8buf[this.u8bufp++],this.ns_cache_cache_idx&128?(this.ns_cache_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.ns_cache[this.ns_cache_cache_idx&4294967167]=this.ns_cache_cache_hit,this.ns_cache_cache_hit):this.ns_cache[this.ns_cache_cache_idx&4294967167]},this.s="",this.lsp=null,this.sp=null,this.sl=null,this.c=new TextDecoder}update_memory(t){this.m=new DataView(t.buffer)}run(){if(this.metaflags=this.m.getUint32(this.d,!0),this.metaflags>>>6&1&&(this.ls=this.m.getUint32(this.d+24,!0)),this.p=this.ls,this.metaflags>>>4&1&&(this.t=this.m.getUint32(this.d+16,!0),this.u16buf=new Uint16Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%2)/2)),this.u16bufp=0,this.metaflags>>>3&1&&(this.t=this.m.getUint32(this.d+12,!0),this.u32buf=new Uint32Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%4)/4)),this.u32bufp=0,this.metaflags>>>5&1&&(this.t=this.m.getUint32(this.d+20,!0),this.u8buf=new Uint8Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%1)/1)),this.u8bufp=0,this.metaflags&1&&(this.lsp=this.m.getUint32(this.d+4,!0)),this.metaflags>>>2&1)if(this.sl=this.m.getUint32(this.d+8,!0),this.metaflags>>>1&1){for(this.sp=this.lsp,this.s="",this.e=this.sp+(this.sl/4|0)*4;this.sp>8,(this.t&16711680)>>16,this.t>>24),this.sp+=4;for(;this.sp{this.handler(r,n,I)});break;case 25:this.nodes[this.u32buf[this.u32bufp++]]=this.loadChild((()=>{this.e=this.u8bufp+this.u32buf[this.u32bufp++];let r=this.u8buf.slice(this.u8bufp,this.e);return this.u8bufp=this.e,r})());break;case 26:{let r=this.stack.splice(this.stack.length-this.u16buf[this.u16bufp++]);this.loadChild((()=>{this.e=this.u8bufp+this.u32buf[this.u32bufp++];let f=this.u8buf.slice(this.u8bufp,this.e);return this.u8bufp=this.e,f})()).replaceWith(...r)}break;case 27:return!0}this.op>>>=8}}run_from_bytes(t){this.d=0,this.update_memory(new Uint8Array(t)),this.run()}};function nt(u,t,e,n){if(n==="style"){u.style.setProperty(t,e);return}if(n){u.setAttributeNS(n,t,e);return}switch(t){case"value":u.tagName==="OPTION"?V(u,t,e):u.value!==e&&(u.value=e);break;case"initial_value":u.defaultValue=e;break;case"checked":u.checked=N(e);break;case"initial_checked":u.defaultChecked=N(e);break;case"selected":u.selected=N(e);break;case"initial_selected":u.defaultSelected=N(e);break;case"dangerous_inner_html":u.innerHTML=e;break;case"style":let r={};for(let i=0;i0){this.waiting.shift()(t);return}this.pending.push(t)}async recv(){return new Promise((t,e)=>{if(this.pending.length>0){t(this.pending.shift());return}this.waiting.push(t)})}},D=class{inner;constructor(t){this.inner=new WeakRef(t)}rustSend(t){let e=this.inner.deref();e&&e.rustSend(t)}async rustRecv(){let t=this.inner.deref();if(t)return await t.rustRecv()}},$=class{weak(){return new D(this)}};globalThis.__nextChannelId=0;globalThis.__channels=[];var W=class extends ${js_to_rust;rust_to_js;owner;id;constructor(t){super(),this.owner=t,this.js_to_rust=new j,this.rust_to_js=new j,this.id=globalThis.__nextChannelId,globalThis.__channels[this.id]=this,globalThis.__nextChannelId+=1}weak(){return new D(this)}async recv(){return await this.rust_to_js.recv()}send(t){this.js_to_rust.send(t)}rustSend(t){this.rust_to_js.send(t)}async rustRecv(){return await this.js_to_rust.recv()}close(){globalThis.__channels[this.id]=null}};function st(){return window.__PROBING_BASE_PATH__||""}var K=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Rt.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingbytesource_free(t,0)}get autoAllocateChunkSize(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingbytesource_autoAllocateChunkSize(this.__wbg_ptr)>>>0}cancel(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();o(t),c.intounderlyingbytesource_cancel(t)}pull(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingbytesource_pull(this.__wbg_ptr,t)}start(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");o(this.__wbg_ptr),c.intounderlyingbytesource_start(this.__wbg_ptr,t)}get type(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");o(this.__wbg_ptr);let t=c.intounderlyingbytesource_type(this.__wbg_ptr);return At[t]}};Symbol.dispose&&(K.prototype[Symbol.dispose]=K.prototype.free);var q=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Ot.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingsink_free(t,0)}abort(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let e=this.__destroy_into_raw();return o(e),c.intounderlyingsink_abort(e,t)}close(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();return o(t),c.intounderlyingsink_close(t)}write(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingsink_write(this.__wbg_ptr,t)}};Symbol.dispose&&(q.prototype[Symbol.dispose]=q.prototype.free);var H=class{constructor(){throw new Error("cannot invoke `new` directly")}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Ct.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_intounderlyingsource_free(t,0)}cancel(){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");let t=this.__destroy_into_raw();o(t),c.intounderlyingsource_cancel(t)}pull(t){if(this.__wbg_ptr==0)throw new Error("Attempt to use a moved value");return o(this.__wbg_ptr),c.intounderlyingsource_pull(this.__wbg_ptr,t)}};Symbol.dispose&&(H.prototype[Symbol.dispose]=H.prototype.free);var L=class u{constructor(){throw new Error("cannot invoke `new` directly")}static __wrap(t){let e=Object.create(u.prototype);return e.__wbg_ptr=t,ct.register(e,e.__wbg_ptr,e),e}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,ct.unregister(this),t}free(){let t=this.__destroy_into_raw();c.__wbg_jsowner_free(t,0)}};Symbol.dispose&&(L.prototype[Symbol.dispose]=L.prototype.free);function tt(){return{__proto__:null,"./web_bg.js":{__proto__:null,__wbg_Error_92b29b0548f8b746:function(){return s(function(t,e){return Error(l(t,e))},arguments)},__wbg_String_8564e559799eccda:function(){return s(function(t,e){let n=String(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg___wbindgen_bigint_get_as_i64_d968e41184ae354f:function(t,e){let n=e,r=typeof n=="bigint"?n:void 0;g(r)||Lt(r),_().setBigInt64(t+8,g(r)?BigInt(0):r,!0),_().setInt32(t+0,!g(r),!0)},__wbg___wbindgen_boolean_get_fa956cfa2d1bd751:function(t){let e=t,n=typeof e=="boolean"?e:void 0;return g(n)||b(n),g(n)?16777215:n?1:0},__wbg___wbindgen_debug_string_c25d447a39f5578f:function(t,e){let n=Q(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},__wbg___wbindgen_in_aca499c5de7ff5e5:function(t,e){let n=t in e;return b(n),n},__wbg___wbindgen_is_bigint_2f76dc55065b4273:function(t){let e=typeof t=="bigint";return b(e),e},__wbg___wbindgen_is_function_1ff95bcc5517c252:function(t){let e=typeof t=="function";return b(e),e},__wbg___wbindgen_is_object_a27215656b807791:function(t){let e=t,n=typeof e=="object"&&e!==null;return b(n),n},__wbg___wbindgen_is_string_ea5e6cc2e4141dfe:function(t){let e=typeof t=="string";return b(e),e},__wbg___wbindgen_is_undefined_c05833b95a3cf397:function(t){let e=t===void 0;return b(e),e},__wbg___wbindgen_jsval_eq_e659fcf7b0e32763:function(t,e){let n=t===e;return b(n),n},__wbg___wbindgen_jsval_loose_eq_db4c3b15f63fc170:function(t,e){let n=t==e;return b(n),n},__wbg___wbindgen_memory_de265df8aadd6273:function(){return c.memory},__wbg___wbindgen_number_get_394265ed1e1b84ee:function(t,e){let n=e,r=typeof n=="number"?n:void 0;g(r)||o(r),_().setFloat64(t+8,g(r)?0:r,!0),_().setInt32(t+0,!g(r),!0)},__wbg___wbindgen_string_get_b0ca35b86a603356:function(t,e){let n=e,r=typeof n=="string"?n:void 0;var i=g(r)?0:h(r,c.__wbindgen_malloc,c.__wbindgen_realloc),f=d;_().setInt32(t+4,f,!0),_().setInt32(t+0,i,!0)},__wbg___wbindgen_throw_344f42d3211c4765:function(t,e){throw new Error(l(t,e))},__wbg__wbg_cb_unref_fffb441def202758:function(){return s(function(t){t._wbg_cb_unref()},arguments)},__wbg_abort_8bae0f33e7833997:function(){return s(function(t){t.abort()},arguments)},__wbg_abort_eee9248a6d680839:function(){return s(function(t,e){t.abort(e)},arguments)},__wbg_activeElement_4bc99dc1a7094c27:function(){return s(function(t){let e=t.activeElement;return g(e)?0:m(e)},arguments)},__wbg_addEventListener_d85450ee1320c989:function(){return a(function(t,e,n,r){t.addEventListener(l(e,n),r)},arguments)},__wbg_altKey_50f830d1793a2eea:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_altKey_c5e44fde6beb66ef:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_altKey_f3e24c4c9cfcf271:function(){return s(function(t){let e=t.altKey;return b(e),e},arguments)},__wbg_animationName_e80680fbfd3da8a2:function(){return s(function(t,e){let n=e.animationName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_appendChild_f553e8704c4f14a6:function(){return a(function(t,e){return t.appendChild(e)},arguments)},__wbg_append_01c74e5c6b58aa64:function(){return a(function(t,e,n,r,i){t.append(l(e,n),l(r,i))},arguments)},__wbg_append_58377ae3be2fb5ef:function(){return a(function(t,e,n,r,i,f){t.append(l(e,n),r,l(i,f))},arguments)},__wbg_append_8e24caa53c80c631:function(){return a(function(t,e,n,r,i){t.append(l(e,n),l(r,i))},arguments)},__wbg_append_91733ec40ee3b1f9:function(){return a(function(t,e,n,r){t.append(l(e,n),r)},arguments)},__wbg_arrayBuffer_3b637f0fa65c5351:function(){return a(function(t){return t.arrayBuffer()},arguments)},__wbg_arrayBuffer_a158e423a87ee756:function(){return s(function(t){return t.arrayBuffer()},arguments)},__wbg_back_939cbdbdfad8aff7:function(){return a(function(t){t.back()},arguments)},__wbg_blockSize_5af477b962b2b031:function(){return s(function(t){return t.blockSize},arguments)},__wbg_blur_e902dcc79406e89c:function(){return a(function(t){t.blur()},arguments)},__wbg_body_40ec34e0a2931fe8:function(){return s(function(t){let e=t.body;return g(e)?0:m(e)},arguments)},__wbg_borderBoxSize_ff7f5405dcc6554e:function(){return s(function(t){return t.borderBoxSize},arguments)},__wbg_boundingClientRect_0776888095b16b8c:function(){return s(function(t){return t.boundingClientRect},arguments)},__wbg_bubbles_07bec919f30033ab:function(){return s(function(t){let e=t.bubbles;return b(e),e},arguments)},__wbg_buffer_54b87055582c8a81:function(){return s(function(t){return t.buffer},arguments)},__wbg_button_f6a9a7b725f1838e:function(){return s(function(t){let e=t.button;return o(e),e},arguments)},__wbg_buttons_d8acd46cf8f40ae9:function(){return s(function(t){let e=t.buttons;return o(e),e},arguments)},__wbg_byobRequest_06b654bb15590436:function(){return s(function(t){let e=t.byobRequest;return g(e)?0:m(e)},arguments)},__wbg_byteLength_41862ca4020b9c43:function(){return s(function(t){let e=t.byteLength;return o(e),e},arguments)},__wbg_byteOffset_d42e18c4441f628b:function(){return s(function(t){let e=t.byteOffset;return o(e),e},arguments)},__wbg_call_8a2dd23819f8a60a:function(){return a(function(t,e){return t.call(e)},arguments)},__wbg_call_a6e5c5dce5018821:function(){return a(function(t,e,n){return t.call(e,n)},arguments)},__wbg_changedTouches_dbf6eeabddd3c2da:function(){return s(function(t){return t.changedTouches},arguments)},__wbg_charCodeAt_2a30bc7c17474cc6:function(){return s(function(t,e){return t.charCodeAt(e>>>0)},arguments)},__wbg_checkValidity_3a31dcce278f31a1:function(){return s(function(t){let e=t.checkValidity();return b(e),e},arguments)},__wbg_checked_596d0d7b35f55a01:function(){return s(function(t){let e=t.checked;return b(e),e},arguments)},__wbg_clearData_1297d08581746c08:function(){return a(function(t,e,n){t.clearData(l(e,n))},arguments)},__wbg_clearData_a7a19d854ec1a3b7:function(){return a(function(t){t.clearData()},arguments)},__wbg_clearInterval_16e8cbbce92291d0:function(){return s(function(t){return clearInterval(t)},arguments)},__wbg_clearTimeout_113b1cde814ec762:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clearTimeout_333bba87532ab9d3:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clearTimeout_6b8d9a38b9263d65:function(){return s(function(t){return clearTimeout(t)},arguments)},__wbg_clientHeight_994541cde34d3ca0:function(){return s(function(t){let e=t.clientHeight;return o(e),e},arguments)},__wbg_clientWidth_6852617da948be39:function(){return s(function(t){let e=t.clientWidth;return o(e),e},arguments)},__wbg_clientX_a7dcb4081126cd4b:function(){return s(function(t){let e=t.clientX;return o(e),e},arguments)},__wbg_clientX_c396b0fb11d601d3:function(){return s(function(t){let e=t.clientX;return o(e),e},arguments)},__wbg_clientY_a4650836fdf58f01:function(){return s(function(t){let e=t.clientY;return o(e),e},arguments)},__wbg_clientY_c0560910b20ee192:function(){return s(function(t){let e=t.clientY;return o(e),e},arguments)},__wbg_close_249a23304523681b:function(){return a(function(t){t.close()},arguments)},__wbg_close_72d318d9c16e83ef:function(){return a(function(t){t.close()},arguments)},__wbg_code_89c999e407c79eef:function(){return s(function(t,e){let n=e.code,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_contentBoxSize_74fbbc51859ff90e:function(){return s(function(t){return t.contentBoxSize},arguments)},__wbg_createComment_003419d0740789d4:function(){return s(function(t,e,n){return t.createComment(l(e,n))},arguments)},__wbg_createElementNS_013b3fb26f4796ec:function(){return a(function(t,e,n,r,i){return t.createElementNS(e===0?void 0:l(e,n),l(r,i))},arguments)},__wbg_createElement_fcbc0805de826d62:function(){return a(function(t,e,n){return t.createElement(l(e,n))},arguments)},__wbg_createObjectURL_416e527781e6fd6d:function(){return a(function(t,e){let n=URL.createObjectURL(e),r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_createTextNode_4dad5b18435dda7c:function(){return s(function(t,e,n){return t.createTextNode(l(e,n))},arguments)},__wbg_ctrlKey_2e52816fa7160097:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_ctrlKey_50bd8324959ca786:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_ctrlKey_57171169eab54da6:function(){return s(function(t){let e=t.ctrlKey;return b(e),e},arguments)},__wbg_dataTransfer_c1c4745cee7e05f1:function(){return s(function(t){let e=t.dataTransfer;return g(e)?0:m(e)},arguments)},__wbg_data_f994b1bb75d8337a:function(){return s(function(t,e){let n=e.data;var r=g(n)?0:h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_deltaMode_d869228efd74f393:function(){return s(function(t){let e=t.deltaMode;return o(e),e},arguments)},__wbg_deltaX_5d829ffba565ed10:function(){return s(function(t){return t.deltaX},arguments)},__wbg_deltaY_6cfce8f8da250c23:function(){return s(function(t){return t.deltaY},arguments)},__wbg_deltaZ_42c86f225c34aa04:function(){return s(function(t){return t.deltaZ},arguments)},__wbg_detail_a90dcd774780ebf6:function(){return s(function(t){return t.detail},arguments)},__wbg_documentElement_b7ec99417969bfbc:function(){return s(function(t){let e=t.documentElement;return g(e)?0:m(e)},arguments)},__wbg_document_179650d6cb13c263:function(){return s(function(t){let e=t.document;return g(e)?0:m(e)},arguments)},__wbg_done_89b2b13e91a60321:function(){return s(function(t){let e=t.done;return b(e),e},arguments)},__wbg_dropEffect_8187d3b019f3e6bd:function(){return s(function(t,e){let n=e.dropEffect,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_effectAllowed_ca2550f3a73fb833:function(){return s(function(t,e){let n=e.effectAllowed,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_elapsedTime_0330f570ff694c6f:function(){return s(function(t){return t.elapsedTime},arguments)},__wbg_elapsedTime_4c2a1fd1473438d6:function(){return s(function(t){return t.elapsedTime},arguments)},__wbg_enqueue_6d83b4c6281bafd6:function(){return a(function(t,e){t.enqueue(e)},arguments)},__wbg_entries_015dc610cd81ede0:function(){return s(function(t){return Object.entries(t)},arguments)},__wbg_entries_8ddbe5d352d85237:function(){return s(function(t){return t.entries()},arguments)},__wbg_entries_900cefd6f70eb290:function(){return s(function(t){return t.entries()},arguments)},__wbg_error_744744ff0c9861e6:function(){return s(function(t){console.error(t)},arguments)},__wbg_fetch_074561c3e313c86f:function(){return s(function(t){return fetch(t)},arguments)},__wbg_fetch_9dad4fe911207b37:function(){return s(function(t){return fetch(t)},arguments)},__wbg_fetch_b5951fc96f52f786:function(){return s(function(t,e){return t.fetch(e)},arguments)},__wbg_files_116196bc012ac3c8:function(){return s(function(t){let e=t.files;return g(e)?0:m(e)},arguments)},__wbg_files_a4eb87e5e4343c46:function(){return s(function(t){let e=t.files;return g(e)?0:m(e)},arguments)},__wbg_focus_2f77051f98540625:function(){return a(function(t){t.focus()},arguments)},__wbg_force_368c1897f399d783:function(){return s(function(t){return t.force},arguments)},__wbg_forward_4bb54c7f45451c64:function(){return a(function(t){t.forward()},arguments)},__wbg_getAsFile_adead4fd4f4ce592:function(){return a(function(t){let e=t.getAsFile();return g(e)?0:m(e)},arguments)},__wbg_getAttribute_5a601ba4718b922a:function(){return s(function(t,e,n,r){let i=e.getAttribute(l(n,r));var f=g(i)?0:h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,f,!0)},arguments)},__wbg_getBoundingClientRect_e828e6c31c66dea6:function(){return s(function(t){return t.getBoundingClientRect()},arguments)},__wbg_getData_fcb88fae21d94f1e:function(){return a(function(t,e,n,r){let i=e.getData(l(n,r)),f=h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,f,!0)},arguments)},__wbg_getElementById_1cbd8f06dbe8eb8e:function(){return s(function(t,e,n){let r=t.getElementById(l(e,n));return g(r)?0:m(r)},arguments)},__wbg_getHours_9f6561095682ce51:function(){return s(function(t){let e=t.getHours();return o(e),e},arguments)},__wbg_getItem_b96269ddc16cf24a:function(){return a(function(t,e,n,r){let i=e.getItem(l(n,r));var f=g(i)?0:h(i,c.__wbindgen_malloc,c.__wbindgen_realloc),w=d;_().setInt32(t+4,w,!0),_().setInt32(t+0,f,!0)},arguments)},__wbg_getMinutes_b0d5cd90bf9b8f22:function(){return s(function(t){let e=t.getMinutes();return o(e),e},arguments)},__wbg_getNode_2f3b1f608db7c9d0:function(){return s(function(t,e){return t.getNode(e>>>0)},arguments)},__wbg_getSeconds_40c565b3a6cb05fe:function(){return s(function(t){let e=t.getSeconds();return o(e),e},arguments)},__wbg_get_507a50627bffa49b:function(){return s(function(t,e){return t[e>>>0]},arguments)},__wbg_get_757c867e2520bbc4:function(){return s(function(t,e){let n=t[e>>>0];return g(n)?0:m(n)},arguments)},__wbg_get_78f252d074a84d0b:function(){return a(function(t,e){return Reflect.get(t,e)},arguments)},__wbg_get_base_path_39628b0b6ddfa96a:function(){return s(function(t){let e=st(),n=h(e,c.__wbindgen_malloc,c.__wbindgen_realloc),r=d;_().setInt32(t+4,r,!0),_().setInt32(t+0,n,!0)},arguments)},__wbg_get_c7eb1f358a7654df:function(){return a(function(t,e){return Reflect.get(t,e)},arguments)},__wbg_get_e73985d6689d2245:function(){return s(function(t,e){let n=t[e>>>0];return g(n)?0:m(n)},arguments)},__wbg_get_select_data_60af93fcbe2f391c:function(){return s(function(t,e){let n=rt(e),r=Mt(n,c.__wbindgen_malloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_get_unchecked_6e0ad6d2a41b06f6:function(){return s(function(t,e){return t[e>>>0]},arguments)},__wbg_has_8374cf06984d8bfc:function(){return a(function(t,e){let n=Reflect.has(t,e);return b(n),n},arguments)},__wbg_hash_508149c4291ec8c2:function(){return a(function(t,e){let n=e.hash,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_head_41a60f9034e0b41a:function(){return s(function(t){let e=t.head;return g(e)?0:m(e)},arguments)},__wbg_headers_cf9c80f30e2a4eff:function(){return s(function(t){return t.headers},arguments)},__wbg_height_6f29ab40ae50636d:function(){return s(function(t){let e=t.height;return o(e),e},arguments)},__wbg_height_96c07d9559d0200a:function(){return s(function(t){return t.height},arguments)},__wbg_height_9f27216001e3c804:function(){return s(function(t){return t.height},arguments)},__wbg_hidden_c08eb1c29c138ab0:function(){return s(function(t){let e=t.hidden;return b(e),e},arguments)},__wbg_history_e648b4314d9b256e:function(){return a(function(t){return t.history},arguments)},__wbg_identifier_d30bb260fab6b02a:function(){return s(function(t){let e=t.identifier;return o(e),e},arguments)},__wbg_initialize_169e37fbdd472b20:function(){return s(function(t,e,n){t.initialize(e,n)},arguments)},__wbg_inlineSize_3c8412828bef21eb:function(){return s(function(t){return t.inlineSize},arguments)},__wbg_instanceof_AnimationEvent_3a83c3d21fbd4d01:function(){return s(function(t){let e;try{e=t instanceof AnimationEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_ArrayBuffer_4480b9e0068a8adb:function(){return s(function(t){let e;try{e=t instanceof ArrayBuffer}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Blob_c6523f92a32c8695:function(){return s(function(t){let e;try{e=t instanceof Blob}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_CompositionEvent_6fef075df3b5dbf4:function(){return s(function(t){let e;try{e=t instanceof CompositionEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_CustomEvent_9b848ed45794fd3e:function(){return s(function(t){let e;try{e=t instanceof CustomEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Document_d1955f84f5d0351c:function(){return s(function(t){let e;try{e=t instanceof Document}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_DragEvent_7bd2cb4c087838f2:function(){return s(function(t){let e;try{e=t instanceof DragEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Element_beebfaab75d12d9d:function(){return s(function(t){let e;try{e=t instanceof Element}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Event_512f3841fa744d1e:function(){return s(function(t){let e;try{e=t instanceof Event}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_File_ee62de53bca2e697:function(){return s(function(t){let e;try{e=t instanceof File}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_FocusEvent_cadb56dad3dfd4ac:function(){return s(function(t){let e;try{e=t instanceof FocusEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlElement_4493a09212d3586f:function(){return s(function(t){let e;try{e=t instanceof HTMLElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlFormElement_ebf2bd35b418e93e:function(){return s(function(t){let e;try{e=t instanceof HTMLFormElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlInputElement_ad3be04339d0e4df:function(){return s(function(t){let e;try{e=t instanceof HTMLInputElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlSelectElement_b4698f847dc49da5:function(){return s(function(t){let e;try{e=t instanceof HTMLSelectElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_HtmlTextAreaElement_37795f65e16b7ed0:function(){return s(function(t){let e;try{e=t instanceof HTMLTextAreaElement}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_KeyboardEvent_be49f2d8e15d587a:function(){return s(function(t){let e;try{e=t instanceof KeyboardEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Map_e5b5e3db98422fcc:function(){return s(function(t){let e;try{e=t instanceof Map}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_MouseEvent_89eddfc6203c1749:function(){return s(function(t){let e;try{e=t instanceof MouseEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Node_d29e7ded486fd76a:function(){return s(function(t){let e;try{e=t instanceof Node}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_PointerEvent_8ef1feb51407c0ed:function(){return s(function(t){let e;try{e=t instanceof PointerEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Response_c8b64b2256f01bec:function(){return s(function(t){let e;try{e=t instanceof Response}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_TouchEvent_62e9e212135a784b:function(){return s(function(t){let e;try{e=t instanceof TouchEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_TransitionEvent_a1842850468877e4:function(){return s(function(t){let e;try{e=t instanceof TransitionEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Uint8Array_309b927aaf7a3fc7:function(){return s(function(t){let e;try{e=t instanceof Uint8Array}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_WheelEvent_8a8f43ee9318fcd4:function(){return s(function(t){let e;try{e=t instanceof WheelEvent}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_instanceof_Window_05ba1ee4f6781663:function(){return s(function(t){let e;try{e=t instanceof Window}catch{e=!1}let n=e;return b(n),n},arguments)},__wbg_intersectionRatio_7c65292cc5ad712c:function(){return s(function(t){return t.intersectionRatio},arguments)},__wbg_intersectionRect_be1020a3be2ed245:function(){return s(function(t){return t.intersectionRect},arguments)},__wbg_isArray_0677c962b281d01a:function(){return s(function(t){let e=Array.isArray(t);return b(e),e},arguments)},__wbg_isComposing_919a0fdf6ac030c9:function(){return s(function(t){let e=t.isComposing;return b(e),e},arguments)},__wbg_isIntersecting_fc6d9529a49c5d62:function(){return s(function(t){let e=t.isIntersecting;return b(e),e},arguments)},__wbg_isPrimary_e59b27f91017e844:function(){return s(function(t){let e=t.isPrimary;return b(e),e},arguments)},__wbg_isSafeInteger_04f36e4056f1b851:function(){return s(function(t){let e=Number.isSafeInteger(t);return b(e),e},arguments)},__wbg_item_74998074fc497f92:function(){return s(function(t,e){let n=t.item(e>>>0);return g(n)?0:m(n)},arguments)},__wbg_items_350b6f2d566d3def:function(){return s(function(t){return t.items},arguments)},__wbg_iterator_6f722e4a93058b71:function(){return s(function(){return Symbol.iterator},arguments)},__wbg_key_803dca86cdcfa8dd:function(){return s(function(t,e){let n=e.key,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_kind_c494ca014c671a6f:function(){return s(function(t,e){let n=e.kind,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_lastModified_41250e8004d0f7ce:function(){return s(function(t){return t.lastModified},arguments)},__wbg_left_7e76a74d0db1754f:function(){return s(function(t){return t.left},arguments)},__wbg_length_02c64e687322fa34:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_1f0964f4a5e2c6d8:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_370319915dc99107:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_e08fc23135c66d6f:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_eea4bfa35e75c87c:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_length_ef21514bf74fe712:function(){return s(function(t){let e=t.length;return o(e),e},arguments)},__wbg_localStorage_5bf6ce3f8e51412a:function(){return a(function(t){let e=t.localStorage;return g(e)?0:m(e)},arguments)},__wbg_location_8f24df2c257fb974:function(){return s(function(t){let e=t.location;return o(e),e},arguments)},__wbg_location_c9a2271428996698:function(){return s(function(t){return t.location},arguments)},__wbg_log_0c201ade58bb55e1:function(){return s(function(t,e,n,r,i,f,w,p){let y,A;try{y=t,A=e,console.log(l(t,e),l(n,r),l(i,f),l(w,p))}finally{c.__wbindgen_free(y,A,1)}},arguments)},__wbg_log_ce2c4456b290c5e7:function(){return s(function(t,e){let n,r;try{n=t,r=e,console.log(l(t,e))}finally{c.__wbindgen_free(n,r,1)}},arguments)},__wbg_mark_b4d943f3bc2d2404:function(){return s(function(t,e){performance.mark(l(t,e))},arguments)},__wbg_measure_84362959e621a2c1:function(){return a(function(t,e,n,r){let i,f,w,p;try{i=t,f=e,w=n,p=r,performance.measure(l(t,e),l(n,r))}finally{c.__wbindgen_free(i,f,1),c.__wbindgen_free(w,p,1)}},arguments)},__wbg_metaKey_7a85debd51844822:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_metaKey_d961c7572a9f84f5:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_metaKey_f934f09e37889d70:function(){return s(function(t){let e=t.metaKey;return b(e),e},arguments)},__wbg_name_14e920dc23fffd96:function(){return s(function(t,e){let n=e.name,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_name_d7d79f5466e37447:function(){return s(function(t,e){let n=e.name,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_new_0912d735e8fbc1d3:function(){return a(function(){return new FormData},arguments)},__wbg_new_0_3da9e97f24fc69be:function(){return s(function(){return new Date},arguments)},__wbg_new_0d809930cd1354c6:function(){return a(function(){return new Headers},arguments)},__wbg_new_22598f2b091dadf2:function(){return s(function(t){return new W(L.__wrap(t))},arguments)},__wbg_new_26bdcffba762c064:function(){return s(function(t){return new U(t>>>0)},arguments)},__wbg_new_32b398fb48b6d94a:function(){return s(function(){return new Array},arguments)},__wbg_new_41e6f99b2fd20423:function(){return a(function(){return new FileReader},arguments)},__wbg_new_4339b2a2675a03e3:function(){return a(function(){return new AbortController},arguments)},__wbg_new_7796ffc7ed656783:function(){return s(function(){return new Map},arguments)},__wbg_new_9792ad3275d1dd31:function(){return a(function(){return new DataTransfer},arguments)},__wbg_new_b667d279fd5aa943:function(){return s(function(t,e){return new Error(l(t,e))},arguments)},__wbg_new_cd45aabdf6073e84:function(){return s(function(t){return new Uint8Array(t)},arguments)},__wbg_new_da52cf8fe3429cb2:function(){return s(function(){return new Object},arguments)},__wbg_new_from_slice_77cdfb7977362f3c:function(){return s(function(t,e){return new Uint8Array(J(t,e))},arguments)},__wbg_new_typed_1824d93f294193e5:function(){return s(function(t,e){try{var n={a:t,b:e},r=(f,w)=>{let p=n.a;n.a=0;try{return It(p,n.b,f,w)}finally{n.a=p}};return new Promise(r)}finally{n.a=0}},arguments)},__wbg_new_with_args_200d82645b6544eb:function(){return s(function(t,e,n,r){return new Function(l(t,e),l(n,r))},arguments)},__wbg_new_with_byte_offset_and_length_54c7724ee3ec7d82:function(){return s(function(t,e,n){return new Uint8Array(t,e>>>0,n>>>0)},arguments)},__wbg_new_with_form_e4ca634e481666c7:function(){return a(function(t){return new FormData(t)},arguments)},__wbg_new_with_str_and_init_d95cbe11ce28e65e:function(){return a(function(t,e,n){return new Request(l(t,e),n)},arguments)},__wbg_new_with_str_sequence_and_options_9db076dc44ddbeb0:function(){return a(function(t,e){return new Blob(t,e)},arguments)},__wbg_new_with_u8_array_sequence_and_options_2c1900e5a5c93850:function(){return a(function(t,e){return new Blob(t,e)},arguments)},__wbg_next_6dbf2c0ac8cde20f:function(){return s(function(t){return t.next},arguments)},__wbg_next_71f2aa1cb3d1e37e:function(){return a(function(t){return t.next()},arguments)},__wbg_now_86c0d4ba3fa605b8:function(){return s(function(){return Date.now()},arguments)},__wbg_offsetX_fdc5eb20edabaadb:function(){return s(function(t){let e=t.offsetX;return o(e),e},arguments)},__wbg_offsetY_0a05e99022d21c5b:function(){return s(function(t){let e=t.offsetY;return o(e),e},arguments)},__wbg_open_221b279749ba2e4e:function(){return a(function(t,e,n,r,i){let f=t.open(l(e,n),l(r,i));return g(f)?0:m(f)},arguments)},__wbg_origin_ed66c06e67ad2049:function(){return a(function(t,e){let n=e.origin,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_ownerDocument_5a7a5473f8709b3e:function(){return s(function(t){let e=t.ownerDocument;return g(e)?0:m(e)},arguments)},__wbg_pageX_56e23ef1ade65aa7:function(){return s(function(t){let e=t.pageX;return o(e),e},arguments)},__wbg_pageX_9c5f057472795ea1:function(){return s(function(t){let e=t.pageX;return o(e),e},arguments)},__wbg_pageY_12d134258ad141c4:function(){return s(function(t){let e=t.pageY;return o(e),e},arguments)},__wbg_pageY_d421aa8cfce954d6:function(){return s(function(t){let e=t.pageY;return o(e),e},arguments)},__wbg_parentElement_5030754e30795652:function(){return s(function(t){let e=t.parentElement;return g(e)?0:m(e)},arguments)},__wbg_pathname_d27a358088ce7b2b:function(){return a(function(t,e){let n=e.pathname,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pointerId_ea33d2695be12e7f:function(){return s(function(t){let e=t.pointerId;return o(e),e},arguments)},__wbg_pointerType_d5e932608aa61bb6:function(){return s(function(t,e){let n=e.pointerType,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pressure_9a7845d9744ae9f4:function(){return s(function(t){return t.pressure},arguments)},__wbg_preventDefault_b64888c857500682:function(){return s(function(t){t.preventDefault()},arguments)},__wbg_propertyName_835d4a18e8327b10:function(){return s(function(t,e){let n=e.propertyName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_prototypesetcall_4770620bbe4688a0:function(){return s(function(t,e,n){Uint8Array.prototype.set.call(J(t,e),n)},arguments)},__wbg_pseudoElement_174adc902d41a1c1:function(){return s(function(t,e){let n=e.pseudoElement,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pseudoElement_6013088f8877903f:function(){return s(function(t,e){let n=e.pseudoElement,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_pushState_3d01701623122bc8:function(){return a(function(t,e,n,r,i,f){t.pushState(e,l(n,r),i===0?void 0:l(i,f))},arguments)},__wbg_push_d2ae3af0c1217ae6:function(){return s(function(t,e){let n=t.push(e);return o(n),n},arguments)},__wbg_queueMicrotask_0ab5b2d2393e99b9:function(){return s(function(t){return t.queueMicrotask},arguments)},__wbg_queueMicrotask_6a09b7bc46549209:function(){return s(function(t){queueMicrotask(t)},arguments)},__wbg_radiusX_06f8dad66dfba7a4:function(){return s(function(t){let e=t.radiusX;return o(e),e},arguments)},__wbg_radiusY_0658ca1fd998f494:function(){return s(function(t){let e=t.radiusY;return o(e),e},arguments)},__wbg_readAsArrayBuffer_7db0a55c6c3a2b4e:function(){return a(function(t,e){t.readAsArrayBuffer(e)},arguments)},__wbg_readAsText_a8f6dfc210ba1a8e:function(){return a(function(t,e){t.readAsText(e)},arguments)},__wbg_reload_83ac0dd969ac6d23:function(){return a(function(t){t.reload()},arguments)},__wbg_removeAttribute_1e7d2c409776d836:function(){return a(function(t,e,n){t.removeAttribute(l(e,n))},arguments)},__wbg_removeEventListener_a3f23c70077bdcc1:function(){return a(function(t,e,n,r){t.removeEventListener(l(e,n),r)},arguments)},__wbg_removeItem_78e03a38da96e0ae:function(){return a(function(t,e,n){t.removeItem(l(e,n))},arguments)},__wbg_repeat_4e131e99bff9b9f4:function(){return s(function(t){let e=t.repeat;return b(e),e},arguments)},__wbg_replaceState_9a0a4a53d3bf3439:function(){return a(function(t,e,n,r,i,f){t.replaceState(e,l(n,r),i===0?void 0:l(i,f))},arguments)},__wbg_requestAnimationFrame_1a85deeab66448c2:function(){return a(function(t,e){let n=t.requestAnimationFrame(e);return o(n),n},arguments)},__wbg_resolve_2191a4dfe481c25b:function(){return s(function(t){return Promise.resolve(t)},arguments)},__wbg_respond_510e32df8aeb6817:function(){return a(function(t,e){t.respond(e>>>0)},arguments)},__wbg_result_53fd7283ffc3cdb8:function(){return a(function(t){return t.result},arguments)},__wbg_rootBounds_f45f30011740fdb2:function(){return s(function(t){let e=t.rootBounds;return g(e)?0:m(e)},arguments)},__wbg_rotationAngle_d0a0b686498034d7:function(){return s(function(t){return t.rotationAngle},arguments)},__wbg_run_9f0b5ec848bddc2d:function(){return s(function(t){t.run()},arguments)},__wbg_rustRecv_ce812a5965920185:function(){return s(function(t){return t.rustRecv()},arguments)},__wbg_rustSend_27a0ddfb6f0fa952:function(){return s(function(t,e){t.rustSend(e)},arguments)},__wbg_saveTemplate_4aa5c34bf8b14cc9:function(){return s(function(t,e,n,r){var i=zt(e,n).slice();c.__wbindgen_free(e,n*4,4),t.saveTemplate(i,r)},arguments)},__wbg_screenX_0a3f7a47942676bd:function(){return s(function(t){let e=t.screenX;return o(e),e},arguments)},__wbg_screenX_bd1fb25d48033c9c:function(){return s(function(t){let e=t.screenX;return o(e),e},arguments)},__wbg_screenY_30eadec06612b80f:function(){return s(function(t){let e=t.screenY;return o(e),e},arguments)},__wbg_screenY_7e467250657a3c56:function(){return s(function(t){let e=t.screenY;return o(e),e},arguments)},__wbg_scrollHeight_8cf19eb16ebc9b9b:function(){return s(function(t){let e=t.scrollHeight;return o(e),e},arguments)},__wbg_scrollIntoView_d8b806f471b7418e:function(){return s(function(t,e){t.scrollIntoView(e)},arguments)},__wbg_scrollLeft_5be50f489b342a09:function(){return s(function(t){let e=t.scrollLeft;return o(e),e},arguments)},__wbg_scrollTo_cac0dff19f631942:function(){return s(function(t,e,n){t.scrollTo(e,n)},arguments)},__wbg_scrollTop_b3effa9c5de14d21:function(){return s(function(t){let e=t.scrollTop;return o(e),e},arguments)},__wbg_scrollWidth_38006a7134cdfeff:function(){return s(function(t){let e=t.scrollWidth;return o(e),e},arguments)},__wbg_scrollX_9da7f7defce2297e:function(){return a(function(t){return t.scrollX},arguments)},__wbg_scrollY_b4c56e98c6d976ad:function(){return a(function(t){return t.scrollY},arguments)},__wbg_scroll_4a3297b235bee8de:function(){return s(function(t,e){t.scroll(e)},arguments)},__wbg_search_af2555aa41bd23cc:function(){return a(function(t,e){let n=e.search,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_setAttributeInner_11a30d36aa43287e:function(){return s(function(t,e,n,r,i,f){nt(t,l(e,n),r,i===0?void 0:l(i,f))},arguments)},__wbg_setAttribute_71039043be82d098:function(){return a(function(t,e,n,r,i){t.setAttribute(l(e,n),l(r,i))},arguments)},__wbg_setData_19a2f9f5b313cbd6:function(){return a(function(t,e,n,r,i){t.setData(l(e,n),l(r,i))},arguments)},__wbg_setInterval_84b64f01452a246e:function(){return a(function(t,e){return setInterval(t,e)},arguments)},__wbg_setItem_364a11cf21db9039:function(){return a(function(t,e,n,r,i){t.setItem(l(e,n),l(r,i))},arguments)},__wbg_setProperty_e4e51b1b1d681d15:function(){return a(function(t,e,n,r,i){t.setProperty(l(e,n),l(r,i))},arguments)},__wbg_setTimeout_3a808dd861dd3c12:function(){return s(function(t,e){return setTimeout(t,e)},arguments)},__wbg_setTimeout_ef24d2fc3ad97385:function(){return a(function(t,e){return setTimeout(t,e)},arguments)},__wbg_setTimeout_f757f00851f76c42:function(){return s(function(t,e){return setTimeout(t,e)},arguments)},__wbg_set_4d7dd76f3dae2926:function(){return s(function(t,e,n){t.set(J(e,n))},arguments)},__wbg_set_575dd786d51585f8:function(){return s(function(t,e,n){return t.set(e,n)},arguments)},__wbg_set_6be42768c690e380:function(){return s(function(t,e,n){t[e]=n},arguments)},__wbg_set_8a16b38e4805b298:function(){return s(function(t,e,n){t[e>>>0]=n},arguments)},__wbg_set_behavior_af2ac621388b739f:function(){return s(function(t,e){t.behavior=ut[e]},arguments)},__wbg_set_behavior_f9f984e684b645bc:function(){return s(function(t,e){t.behavior=ut[e]},arguments)},__wbg_set_block_8135b3acafa1ca88:function(){return s(function(t,e){t.block=it[e]},arguments)},__wbg_set_body_029f2d171e0a005f:function(){return s(function(t,e){t.body=e},arguments)},__wbg_set_cache_b4a740b195c051f4:function(){return s(function(t,e){t.cache=xt[e]},arguments)},__wbg_set_credentials_bb34a40189e3b43b:function(){return s(function(t,e){t.credentials=Tt[e]},arguments)},__wbg_set_dropEffect_ee044779833a313d:function(){return s(function(t,e,n){t.dropEffect=l(e,n)},arguments)},__wbg_set_effectAllowed_70e1a79093efb47f:function(){return s(function(t,e,n){t.effectAllowed=l(e,n)},arguments)},__wbg_set_headers_9c61d123c3ee1f10:function(){return s(function(t,e){t.headers=e},arguments)},__wbg_set_href_960e4284e5cae151:function(){return a(function(t,e,n){t.href=l(e,n)},arguments)},__wbg_set_inline_77b0fb4f96d76814:function(){return s(function(t,e){t.inline=it[e]},arguments)},__wbg_set_left_18508443258534ad:function(){return s(function(t,e){t.left=e},arguments)},__wbg_set_method_5532d59b92d76467:function(){return s(function(t,e,n){t.method=l(e,n)},arguments)},__wbg_set_mode_66c79886ad78fc05:function(){return s(function(t,e){t.mode=St[e]},arguments)},__wbg_set_onload_4dc1f96725e4138c:function(){return s(function(t,e){t.onload=e},arguments)},__wbg_set_scrollRestoration_29b3e9dc74898bc5:function(){return a(function(t,e){t.scrollRestoration=Nt[e]},arguments)},__wbg_set_search_6f7cde7f191dc1a1:function(){return a(function(t,e,n){t.search=l(e,n)},arguments)},__wbg_set_signal_c4ef8faddb4c1446:function(){return s(function(t,e){t.signal=e},arguments)},__wbg_set_textContent_54dcad83ae15772d:function(){return s(function(t,e,n){t.textContent=e===0?void 0:l(e,n)},arguments)},__wbg_set_top_29926a592a2d228a:function(){return s(function(t,e){t.top=e},arguments)},__wbg_set_type_8ce203e412e28cf6:function(){return s(function(t,e,n){t.type=l(e,n)},arguments)},__wbg_shiftKey_42866b295d317445:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_shiftKey_9bcb8bdd60c2f152:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_shiftKey_9f797da486b2ade8:function(){return s(function(t){let e=t.shiftKey;return b(e),e},arguments)},__wbg_signal_dad7cb35193abd31:function(){return s(function(t){return t.signal},arguments)},__wbg_size_6304a694765921a9:function(){return s(function(t){return t.size},arguments)},__wbg_state_edcc5b2da67f07f2:function(){return a(function(t){return t.state},arguments)},__wbg_static_accessor_GLOBAL_4ef717fb391d88b7:function(){return s(function(){let t=typeof global>"u"?null:global;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_GLOBAL_THIS_8d1badc68b5a74f4:function(){return s(function(){let t=typeof globalThis>"u"?null:globalThis;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_SELF_146583524fe1469b:function(){return s(function(){let t=typeof self>"u"?null:self;return g(t)?0:m(t)},arguments)},__wbg_static_accessor_WINDOW_f2829a2234d7819e:function(){return s(function(){let t=typeof window>"u"?null:window;return g(t)?0:m(t)},arguments)},__wbg_status_c45b3b9b3033184a:function(){return s(function(t){let e=t.status;return o(e),e},arguments)},__wbg_stringify_b54333f60f1e4dad:function(){return a(function(t){return JSON.stringify(t)},arguments)},__wbg_style_6657aed849e5d757:function(){return s(function(t){return t.style},arguments)},__wbg_tagName_d99c8072027f3c98:function(){return s(function(t,e){let n=e.tagName,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_tangentialPressure_979a239d3db31d90:function(){return s(function(t){return t.tangentialPressure},arguments)},__wbg_targetTouches_3e9bdb053b2d5023:function(){return s(function(t){return t.targetTouches},arguments)},__wbg_target_e759594a8d965ed7:function(){return s(function(t){let e=t.target;return g(e)?0:m(e)},arguments)},__wbg_textContent_37277f66248f39e6:function(){return s(function(t,e){let n=e.textContent;var r=g(n)?0:h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_text_d3a29f7525a132c3:function(){return a(function(t){return t.text()},arguments)},__wbg_then_16d107c451e9905d:function(){return s(function(t,e,n){return t.then(e,n)},arguments)},__wbg_then_6ec10ae38b3e92f7:function(){return s(function(t,e){return t.then(e)},arguments)},__wbg_tiltX_1327e8185e612854:function(){return s(function(t){let e=t.tiltX;return o(e),e},arguments)},__wbg_tiltY_b44744ee36b60a24:function(){return s(function(t){let e=t.tiltY;return o(e),e},arguments)},__wbg_time_2e33e99ff5e53342:function(){return s(function(t){return t.time},arguments)},__wbg_top_fe120acfa924a430:function(){return s(function(t){return t.top},arguments)},__wbg_touches_a631c50f1b367753:function(){return s(function(t){return t.touches},arguments)},__wbg_twist_6cc18194426f8a4f:function(){return s(function(t){let e=t.twist;return o(e),e},arguments)},__wbg_type_06f2150affb3c059:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_type_9d13c17ea2611dd0:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_type_c1987e7fbaf7340e:function(){return s(function(t,e){let n=e.type,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_update_memory_ddf6b41a329aec73:function(){return s(function(t,e){t.update_memory(e)},arguments)},__wbg_url_abdb8fb08377f8c0:function(){return s(function(t,e){let n=e.url,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_1f687dfa7d6c3d08:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_a5d5488a9589444a:function(){return s(function(t){return t.value},arguments)},__wbg_value_c40f8f7227bb3a9e:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_value_d7621df0105931d8:function(){return s(function(t,e){let n=e.value,r=h(n,c.__wbindgen_malloc,c.__wbindgen_realloc),i=d;_().setInt32(t+4,i,!0),_().setInt32(t+0,r,!0)},arguments)},__wbg_view_21f1d4a4f175dfa9:function(){return s(function(t){let e=t.view;return g(e)?0:m(e)},arguments)},__wbg_weak_4a47d74ffa0a7f96:function(){return s(function(t){return t.weak()},arguments)},__wbg_width_16032a5bda5e6fa9:function(){return s(function(t){let e=t.width;return o(e),e},arguments)},__wbg_width_20c45c895834b83f:function(){return s(function(t){return t.width},arguments)},__wbg_width_219185400361db86:function(){return s(function(t){return t.width},arguments)},__wbg_x_71553b4e719d215a:function(){return s(function(t){return t.x},arguments)},__wbg_y_111b04aa46dc0f86:function(){return s(function(t){return t.y},arguments)},__wbindgen_cast_0000000000000001:function(){return s(function(t,e){return k(t,e,Et)},arguments)},__wbindgen_cast_0000000000000002:function(){return s(function(t,e){return k(t,e,yt)},arguments)},__wbindgen_cast_0000000000000003:function(){return s(function(t,e){return k(t,e,vt)},arguments)},__wbindgen_cast_0000000000000004:function(){return s(function(t,e){return Bt(t,e,kt)},arguments)},__wbindgen_cast_0000000000000005:function(){return s(function(t,e){return k(t,e,ht)},arguments)},__wbindgen_cast_0000000000000006:function(){return s(function(t,e){return k(t,e,wt)},arguments)},__wbindgen_cast_0000000000000007:function(){return s(function(t,e){return k(t,e,mt)},arguments)},__wbindgen_cast_0000000000000008:function(){return s(function(t,e){return k(t,e,pt)},arguments)},__wbindgen_cast_0000000000000009:function(){return s(function(t){return t},arguments)},__wbindgen_cast_000000000000000a:function(){return s(function(t){return t},arguments)},__wbindgen_cast_000000000000000b:function(){return s(function(t,e){return l(t,e)},arguments)},__wbindgen_cast_000000000000000c:function(){return s(function(t){return BigInt.asUintN(64,t)},arguments)},__wbindgen_init_externref_table:function(){let t=c.__wbindgen_externrefs,e=t.grow(4);t.set(0,void 0),t.set(e+0,void 0),t.set(e+1,null),t.set(e+2,!0),t.set(e+3,!1)}}}}function ht(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h790c723772977d15E(u,t)}function wt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h59cad6d2488dca29E(u,t)}function mt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h9761498151360b23E(u,t)}function pt(u,t){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h8e4f100a6c778e58E(u,t)}function yt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h7dd8c6f9e9c12966E(u,t,e)}function vt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17hd9e6853fc436a5f1E(u,t,e)}function kt(u,t,e){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_1_6invoke17h3dab76294ffea566E(u,t,e)}function Et(u,t,e){o(u),o(t);let n=c._ZN12wasm_bindgen7convert8closures1_6invoke17hceaf1cd31a005417E(u,t,e);if(n[1])throw Ft(n[0])}function It(u,t,e,n){o(u),o(t),c._ZN12wasm_bindgen7convert8closures1_6invoke17h04eb02ab906308ebE(u,t,e,n)}var At=["bytes"],xt=["default","no-store","reload","no-cache","force-cache","only-if-cached"],Tt=["omit","same-origin","include"],St=["same-origin","no-cors","cors","navigate"],ut=["auto","instant","smooth"],it=["start","center","end","nearest"],Nt=["auto","manual"],Rt=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingbytesource_free(u,1)),Ot=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingsink_free(u,1)),Ct=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_intounderlyingsource_free(u,1)),ct=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbg_jsowner_free(u,1));function m(u){let t=c.__externref_table_alloc();return c.__wbindgen_externrefs.set(t,u),t}function Lt(u){if(typeof u!="bigint")throw new Error(`expected a bigint argument, found ${typeof u}`)}function b(u){if(typeof u!="boolean")throw new Error(`expected a boolean argument, found ${typeof u}`)}function o(u){if(typeof u!="number")throw new Error(`expected a number argument, found ${typeof u}`)}var X=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(u=>c.__wbindgen_destroy_closure(u.a,u.b));function Q(u){let t=typeof u;if(t=="number"||t=="boolean"||u==null)return`${u}`;if(t=="string")return`"${u}"`;if(t=="symbol"){let r=u.description;return r==null?"Symbol":`Symbol(${r})`}if(t=="function"){let r=u.name;return typeof r=="string"&&r.length>0?`Function(${r})`:"Function"}if(Array.isArray(u)){let r=u.length,i="[";r>0&&(i+=Q(u[0]));for(let f=1;f1)n=e[1];else return toString.call(u);if(n=="Object")try{return"Object("+JSON.stringify(u)+")"}catch{return"Object"}return u instanceof Error?`${u.name}: ${u.message} +${u.stack}`:n}function zt(u,t){u=u>>>0;let e=_(),n=[];for(let r=u;r>>0,O().subarray(u/1,u/1+t)}var E=null;function _(){return(E===null||E.buffer.detached===!0||E.buffer.detached===void 0&&E.buffer!==c.memory.buffer)&&(E=new DataView(c.memory.buffer)),E}function l(u,t){return jt(u>>>0,t)}var R=null;function O(){return(R===null||R.byteLength===0)&&(R=new Uint8Array(c.memory.buffer)),R}function a(u,t){try{return u.apply(this,t)}catch(e){let n=m(e);c.__wbindgen_exn_store(n)}}function g(u){return u==null}function s(u,t){try{return u.apply(this,t)}catch(e){let n=(function(){try{return e instanceof Error?`${e.message} Stack: -${e.stack}`:e.toString()}catch{return""}})();throw console.error("wasm-bindgen: imported JS function that was not marked as `catch` threw an error:",n),e}}function Bt(u,t,e){let n={a:u,b:t,cnt:1},r=(...i)=>{n.cnt++;try{return e(n.a,n.b,...i)}finally{r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(c.__wbindgen_destroy_closure(n.a,n.b),n.a=0,X.unregister(n))},X.register(r,n,n),r}function k(u,t,e){let n={a:u,b:t,cnt:1},r=(...i)=>{n.cnt++;let a=n.a;n.a=0;try{return e(a,n.b,...i)}finally{n.a=a,r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(c.__wbindgen_destroy_closure(n.a,n.b),n.a=0,X.unregister(n))},X.register(r,n,n),r}function Mt(u,t){let e=t(u.length*4,4)>>>0;for(let n=0;n>>0;return O().subarray(p,p+w.length).set(w),d=w.length,p}let n=u.length,r=t(n,1)>>>0,i=O(),a=0;for(;a127)break;i[r+a]=w}if(a!==n){a!==0&&(u=u.slice(a)),r=e(r,n,n=a+u.length*3,1)>>>0;let w=O().subarray(r+a,r+n),p=C.encodeInto(u,w);if(p.read!==u.length)throw new Error("failed to pass whole string");a+=p.written,r=e(r,n,a,1)>>>0}return d=a,r}function Ft(u){let t=c.__wbindgen_externrefs.get(u);return c.__externref_table_dealloc(u),t}var P=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});P.decode();var Ut=2146435072,G=0;function jt(u,t){return G+=t,G>=Ut&&(P=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),P.decode(),G=t),P.decode(O().subarray(u,u+t))}var C=new TextEncoder;"encodeInto"in C||(C.encodeInto=function(u,t){let e=C.encode(u);return t.set(e),{read:u.length,written:e.length}});var d=0,Dt,Wt,c;function ot(u,t){return Wt=u,c=u.exports,Dt=t,E=null,R=null,c.__wbindgen_start(),c}async function Pt(u,t){if(typeof Response=="function"&&u instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(u,t)}catch(r){if(u.ok&&e(u.type)&&u.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}let n=await u.arrayBuffer();return await WebAssembly.instantiate(n,t)}else{let n=await WebAssembly.instantiate(u,t);return n instanceof WebAssembly.Instance?{instance:n,module:u}:n}function e(n){switch(n){case"basic":case"cors":case"default":return!0}return!1}}function at(u){if(c!==void 0)return c;u!==void 0&&(Object.getPrototypeOf(u)===Object.prototype?{module:u}=u:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));let t=tt();u instanceof WebAssembly.Module||(u=new WebAssembly.Module(u));let e=new WebAssembly.Instance(u,t);return ot(e,u)}async function _t(u){if(c!==void 0)return c;u!==void 0&&(Object.getPrototypeOf(u)===Object.prototype?{module_or_path:u}=u:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),u===void 0&&(u=new URL("web_bg.wasm",import.meta.url));let t=tt();(typeof u=="string"||typeof Request=="function"&&u instanceof Request||typeof URL=="function"&&u instanceof URL)&&(u=fetch(u));let{instance:e,module:n}=await Pt(await u,t);return ot(e,n)}globalThis.__wasm_split_main_initSync=at;_t({module_or_path:"/./assets/web_bg-dxh9628c8b4a0d6e07b.wasm"}).then(u=>{globalThis.__dx_mainWasm=u,globalThis.__dx_mainInit=_t,globalThis.__dx_mainInitSync=at,globalThis.__dx___wbg_get_imports=tt,u.__wbindgen_start==null&&u.main()});export{K as IntoUnderlyingByteSource,q as IntoUnderlyingSink,H as IntoUnderlyingSource,L as JSOwner,c as __wasm,_t as default,at as initSync}; +${e.stack}`:e.toString()}catch{return""}})();throw console.error("wasm-bindgen: imported JS function that was not marked as `catch` threw an error:",n),e}}function Bt(u,t,e){let n={a:u,b:t,cnt:1},r=(...i)=>{n.cnt++;try{return e(n.a,n.b,...i)}finally{r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(c.__wbindgen_destroy_closure(n.a,n.b),n.a=0,X.unregister(n))},X.register(r,n,n),r}function k(u,t,e){let n={a:u,b:t,cnt:1},r=(...i)=>{n.cnt++;let f=n.a;n.a=0;try{return e(f,n.b,...i)}finally{n.a=f,r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(c.__wbindgen_destroy_closure(n.a,n.b),n.a=0,X.unregister(n))},X.register(r,n,n),r}function Mt(u,t){let e=t(u.length*4,4)>>>0;for(let n=0;n>>0;return O().subarray(p,p+w.length).set(w),d=w.length,p}let n=u.length,r=t(n,1)>>>0,i=O(),f=0;for(;f127)break;i[r+f]=w}if(f!==n){f!==0&&(u=u.slice(f)),r=e(r,n,n=f+u.length*3,1)>>>0;let w=O().subarray(r+f,r+n),p=C.encodeInto(u,w);if(p.read!==u.length)throw new Error("failed to pass whole string");f+=p.written,r=e(r,n,f,1)>>>0}return d=f,r}function Ft(u){let t=c.__wbindgen_externrefs.get(u);return c.__externref_table_dealloc(u),t}var P=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});P.decode();var Ut=2146435072,G=0;function jt(u,t){return G+=t,G>=Ut&&(P=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),P.decode(),G=t),P.decode(O().subarray(u,u+t))}var C=new TextEncoder;"encodeInto"in C||(C.encodeInto=function(u,t){let e=C.encode(u);return t.set(e),{read:u.length,written:e.length}});var d=0,Dt,Wt,c;function ot(u,t){return Wt=u,c=u.exports,Dt=t,E=null,R=null,c.__wbindgen_start(),c}async function Pt(u,t){if(typeof Response=="function"&&u instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(u,t)}catch(r){if(u.ok&&e(u.type)&&u.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}let n=await u.arrayBuffer();return await WebAssembly.instantiate(n,t)}else{let n=await WebAssembly.instantiate(u,t);return n instanceof WebAssembly.Instance?{instance:n,module:u}:n}function e(n){switch(n){case"basic":case"cors":case"default":return!0}return!1}}function at(u){if(c!==void 0)return c;u!==void 0&&(Object.getPrototypeOf(u)===Object.prototype?{module:u}=u:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));let t=tt();u instanceof WebAssembly.Module||(u=new WebAssembly.Module(u));let e=new WebAssembly.Instance(u,t);return ot(e,u)}async function _t(u){if(c!==void 0)return c;u!==void 0&&(Object.getPrototypeOf(u)===Object.prototype?{module_or_path:u}=u:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),u===void 0&&(u=new URL("web_bg.wasm",import.meta.url));let t=tt();(typeof u=="string"||typeof Request=="function"&&u instanceof Request||typeof URL=="function"&&u instanceof URL)&&(u=fetch(u));let{instance:e,module:n}=await Pt(await u,t);return ot(e,n)}globalThis.__wasm_split_main_initSync=at;_t({module_or_path:"/./assets/web_bg-dxh397f70ff35dbc871.wasm"}).then(u=>{globalThis.__dx_mainWasm=u,globalThis.__dx_mainInit=_t,globalThis.__dx_mainInitSync=at,globalThis.__dx___wbg_get_imports=tt,u.__wbindgen_start==null&&u.main()});export{K as IntoUnderlyingByteSource,q as IntoUnderlyingSink,H as IntoUnderlyingSource,L as JSOwner,c as __wasm,_t as default,at as initSync}; diff --git a/python/probing/bundled_web/public/assets/web-dxh3f25885a213214.js.br b/python/probing/bundled_web/public/assets/web-dxh3f25885a213214.js.br new file mode 100644 index 0000000000000000000000000000000000000000..6b3cdb4179b40de718001d7a02911ef73ab9a0aa GIT binary patch literal 13337 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 z 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 literal 0 HcmV?d00001 diff --git a/python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js.br b/python/probing/bundled_web/public/assets/web-dxh50ad7a34ffc43ea1.js.br deleted file mode 100644 index 77798385fb065391461dc46fdf0d68509fef5942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13319 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 RdYtpb@~jfmrl?<^^bQgY-y;A3 diff --git a/python/probing/bundled_web/public/assets/web_bg-dxh397f70ff35dbc871.wasm b/python/probing/bundled_web/public/assets/web_bg-dxh397f70ff35dbc871.wasm new file mode 100644 index 0000000000000000000000000000000000000000..5f63ad6d2f28bb2b5937efdffc31310f2cad459c GIT binary patch literal 5893374 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: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

    0X}XGaB|l`eC9--gQSiNzhllJ_f#Th7 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�Jt6Mw{FKxAGdtzpb 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⁢WigDmBSW`q?U-#V#e0f(Q4+L9E< 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�ALmOV&rvzmqtmkGzjqP1ZDXmI8E5*(x1M_KxtU( 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 z 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�Fn83HkiwNO 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�*6d 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

  • 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Ƌk)nzwSR3T*3uo$nX*AX$bR7&2kD0p9 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ã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%0AN-^ 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

  • tEr3(Wf#X0A0k_nF zTbcuxO&HVR46Y8a$DEE*ATSdUNTz7U4X|%NddM_{vfj?k;Kwt3vc`X0=U*PxFjV)D479zMhIo-*SO#h*+8)!Ggu{iG~Pbkp%3-Kqw!!@r6-9x zI=l4FNPIjdM4s!h7(Y5(kK)1D^{WFh{pEgtJWK==N%6v~dwEs&hhyIqXZ-6?LUm(Y+6Zo9=oqaXjG$70=upRz;-PN_-s6JrLie=7;s1`A=G3 zQ_zp=%KHdy1hcP?59waYv#vCEGZz}#tPGSRgk(a)I4}DbB@qazuC0!2tSJ*qgjKd0 zWmV2d!va&Wa8rH2;G36`C*zs?VTFu*6!z=2j=pXTbAu+jE2|R7I~H@UMprgH@#!dAo*m<2QM&qRqDl}8*PT@| z?A557^?vFH#60f$Z!|Vml=c^;X)kFzIRhuJta^vo*D>7LR~@|&DK&meI|n->#e;Qq z^=+&Uuaf_7OMUgm>dR$l*WF#D&f(ZZ6*&^1Iv&d7lqWjU$~Bd@RfZA$uBqTQG_tu9 z4=o+J!|CpJr>$+M>^!{HDR1j=Pro+bWz(eD=`Y5BL>3*%zy2DjIU?Blw{9C=l|_uX zir{tCgPvQjs`%Sg+IXIvywZl%-v|mr*sC&8k zKykH!Gu&zO7@z#rFhts6Xe3~)$^_%BeH|QzLZti~u2CZi!D5zQkMdG_xQOAc6Z|5% z8IA#AMu6H4#VtzSo_T1TWdzhYk7;LsxSubnpu4UUSl~c}aC7We^5s_;^kj{3=-HoF z`i(K@OuqYTbyUhd3_>>9u{~2WpL%t2?{m4|(?Qa4T&Mhot+*rkotN?O7-E;bn(W{m zq}2*z%H8D_n=`F~W7|z@ltN_f6J`$A4a(=nVIr3HKm{aZCR7rzimV zfev;d@7$WM90-aETxA8gx05j7nK<8YrIqL8ShZ=85 zT&oXq?evEaRd0mcE7^&7d!2xmqIrG3r+QsQ%;%cQWR)+fNM^iw4sLPIC}IsH4dPN; zJ2VEwd;;_i9qlRXS2FeCt1RK!K{!P3#%Oqz&p%Cw6Y*d*W&-wYWMJgiqf=+%VXTvD ztEb}O)ufctE?IH9BckE1>ndk-WhnRHc{^rhSU1MY6XCg}nv>zV#G2D8U%9?Iqw8uM zAiA!?DWWR`dz5Q71L}K|$Avo>U!B0n0trGUV;nf4kXn^|uuqI&)eAMH?2u2RNhde3 zknH}MKvvz1lo3{WYl&0qigbB0t?G87df21n3oq2m6RbSC?qX%~m}#)v?UQCFtCtos zGN!XqGaw`JX^b(to`NUq3Q>z_DV?m;dkbSmD*gazFIJ>V=h`UR_~h|V{mEAkfBwJ| z(Y}tRD4%VBVe^R>+2(PC z1@0QiMVxRg7#`-tPLTuHn`XLh@U@2c>?((nE+ft9@^mFkh1E*TSAidu?A|fk@g|y6 z_E0T=$`fUQ&@7#{FO5)|?4Flm%&+3ow)Oqyy zX+r(C0%-5<-5AV z6V7qX&a-O;CN7X17=B~EW2exH>5R3YK*>=fNKwBq5Hq+e_|8Xv-%gOdA{*QF_2V$b zh$?t(CRR*+XLe88Nl3yBfr9q<2X-T7xBkNWfvvCaLEgoJZuD}z`|0GQ$Yb1yn zE@WVDv;mUMJ(+&7z4mZ?f%kO6$KfBto-XRtVUiH1)MRK=he;xQCtRRRRA?upZd0vQS|ID$>cS*4YqWv(QTb5~0~ z`W)aFvc{NflF-N=|Cd)(26VRDSZw+d)mM^tEp5oI%_Zs9wR%lB>QFhVqX*a)Fs=#; z>%4P&9ZW`&-{_I;;?hPfo?XdxQJ)^-Zq}q<$sRH;JV!FI?oU)U?%jX(505Itvxk2rYRqBY}Y;fbhu3rG1JnKgzj&2n}qa6qqpw zpECV5I}dgGJ{W90DxVUQCQMUhOXNL4z@4~T7bBSAisrdc{Rr7#y?Hbl467Q5*am{= z>Eu4i^Mc_Vc$*5HP(aOOD4(KC&9FQG`30s!Y2Il*4pyr%f-aQ~snSb>HVx2x(AEZ3 zwv}iORPDcVE>wZw`J&26uRs|5xWT9>g0Q%Pr6=3@k;e$v&BkZ`K1x2LU>{|XO`iNY z6*ONE0GZ7bi2Y=xch;oSSWIe};suE*bcQdq5o6wn*Ul)z-tB2+bsNH@{+uvHWEcc% z8IF+EGI48XSU`MZ_Cv++KbbrOpEc)oC7ZO4ahe3A!C*}w1!-Xuxk8roRcss5wwXgV z6RbdID%m~5=;rr77A2FUZx!D&;+&+v{1~}nK(bQ%frqC>r9glbWwQYE^dt}6D4eG` z|A8r&U=)8ipZB6=UfQfPnrWJKHoJU2G|jr4l;HN#J(+dD;@wMr|BAH1{+ebT@|=-U z3y69rMLH4w%OILV#2ABhqQMwA+pEL@a#(C23>H2Nusr-D7lWmh1Ay#;1Atp`fD4he z*nA6F?=8sM&Sw=_LjdX{xX;Pjijz>dd@In1leG||MaUNYIC=MGtvkJrmLt5E9r4xt zVf$v9U;*q!I`mb;%FiI!_h@8GC9sGGPOd9q0L~gglbyx`smm6ld@ePUHyl$i^R_Qt zTAs9Y*~IXfm(Sy4MTg^j9>?BcC5s93*oxj^ig|}^*@JS`;pF_y)b8_IZydtRA!@c| zRFDI=+80CGeTAv*TKR0{0#s*=Q#?DDmjX!5GpCsIIY_V-v7=l_4YP}}$#&T6LZ3-q|I^%##Zp`z zSQQU?atf&~wKX6@fBJqY$_baG-f77xB&l{)M_CLyEGtE~vQqTqSt)v&vQnTyZLdQT z5K`K~0*M$;o+Ml!Kvpv)aOca1JJ7z2u!wfU_sqKJZO`vtWL?iX(OqPnsF64Vd+hzC zgRffKkdeLE7vEzUC-A0uzKN`YR)A1w+R9SkL8!97i)eGfz+ocrg9kO5-=|o8dCQuY9?JXimpedN>Z!Mo_Zt(-7>WxmvTI^>5=qq}Hp?mSh z%FCIvJh%lh#h$~`O&D@aa12;2B$<~(iSjSHNEBYua*&*}Pi;S&g1PM{vRu`B&~{Am z04lTVu@YJl`v=V5if+H;BRK?g299E7XY+4b-_nZ)-gQoxQLf*CXR67n1p(b{yuV6N!Z)cUn_u!hTv$Lg-ztWF!HY{ zj>H=LhxubfX+ogU&~;<&1qECHv6c~_L;=2@Db`YX(;JXnpzH0b@XnjVI54~=dbF20 zpjoT*1qEAt*x6z_VAf<|S4Fs~tpF6UCZFM{1fXGYI#v=iQlfJk;9USwE#T>^128rw zGGRB^zQU3R|77n@@q-e3_UHty4(vEiYCT~|$k~Lr6ThW{1%xW*a8qOzP?TIw2tp?; z6$AG%g42>O{|F{;P{BL00b5ZD9(nBbRC=G*9i)syLJ4ax$zZT<2dMHDtta`4tzqyj z7&$L4kk)+tCnAG3ISl~xDmnTRDf}&U<-A@KsXX~U4XUj%1deHV8{a_1;EsJe>GS`RscN#H9S)ZG`Cd}k~0O>q*k`E#Sj49LM z^t|Rx1cvm}Z8K9D0gOrB$jqW<*;I6CB0G81eTC1{pTBVl?z39DL>6SD1}%GZdoveS z)4RDa;&*XbydE>M5egO(O){Ozv{fZDHgEH1qPDT{yU1-kltpiDTS&X0Ba(vaeT4oZ`7Ea8^xsOa?`-5BGk=BE&ZLN0VhqB3lL(FLC*YeJSaTs4o0@8{ z897ue<9Z8*IOIwgqWdKbAy@uf}01N{&Ok*U#wz-fZ zF499(o$E$tR>vKrOqW}SFgVhsV|-FHhI_^}#}&dw?#x$Y@tt)P#+mQD!cqoGQ#+{g zE&BClV)WwdBq9>xSaO_T1HF!Bb?Q5>7)HAQ2NZZ`Z8aV464>+kvvvvHA|MJgYwYs@ zn@KITUA*l0xW-!%SJU$@{aW+C2hn_yPN4vKV zt9b6%7b&WV>=52<|KjMzBH|pST;gFwM~Rm_L`*5&Q}HlG3DsC2kD~GsKU;=Z@SQkY zg71`Wa`?{Z#^9ssbF^KAQl8;P%9-`C03PlZXKMoRpKAbr>hlHg9xksh<^*2x@d0>6 z%?IF5J=?%T%yIUk0r-Dy0DrcD`O_E2{OJbp+NKbI*EWS`6Y~O{*i{jYM&&RYbP-XY zzCbej3cw%O8jtEv^sr&BEyT}5*0d<<4hwiE8Hr}G1-qM#1LsZCE)Hv#2`oxg`$ndU zXK^wmmcOcvAbg9bQ%N;Mrg;7|n*m+>CL5spy;VU-R8d6^^z}}@a?Zj4@F9mCl79(` zk1~^aHeKc65zTz)EPL`D)4Zzvkj1{+8KOM3!CXiR8~3@J`?IQxV56l>P`2It&Gm{z`KX|+Yr?y{sx zgJKMD1bO?Swb2LP^NRIRC?8NcLj0P&L8ViKRoMX0I&o+YzZCWSsrEBC7(% zJMXlowsP91uX0aNpN#e}m0ggGq97>lrl?>&X5Jpy(o#=Hf*}QwS!}3Zh8#6*cRUnt z5OZtcLKBlEiks9;PH|JZF^Yp-YDHI%M6jypis={pemmr$@DzDz&PAaL`a zA4?HH@Kp!Y`7-G|&Y8eEeaCDE1{Tou(Zd07IvyRWIlz#sOt`=#;U8c>V8B{&+PYvr zrj3LiVR~iLw$vacu;!_SDFi4@I*OANefuQDqWw6wEEAQbAIEs2L=E(39I{^HKgvbR zkMgfQ&wrGEO&%(`CN*f(iwcC^86Pzz+sFdpq?8?pyDQufa1#xSJ3=jk^DyA=(F9@n6vR~in z5L7b1BtKX@+)L%ERUuRT_5PIH62#X@!XypKO&%`CGYl5`hmr#4D0kNfv2qQP)BPPU zuMeqsTROBl`**J$b_2N%S?%W?tBT7_oa#t7tSWvARrTt%ZocnLhrFsp#oN-vs$y|f z)ZRckgf?wZ4yOHrjmu32x`SmE8c?A^VCM~kjkeSN+tNX+5F?plN}%y=MqXO6buaJ}?M}_^zKXaE%b{P)~$1GP8v-K&H@R2O9#lcNhXe zp4fW^`EnI+OPA*(LBL-+NW^e<2L{m9m^cK;^0d!(D6$VzCEG68O%4(4K7HDKhhZ~E z8!ve3g!&4>vpijK)9`Z9L?5vwC3t)T@N$Po;r}ZflPgucEnR8w;82Y*ac|uYd;ydd z=}-X0N&%GR4oW%;6x*gh8x+gnkfX*n`_o55%|$@jTml6w22iZj49dDDP!hU-y^X+f zVTIkTH~E&rzU+BrtZcA%0)6ojqZvktVm?Y(*5Y(98znv^9oU}s<)~>7PoGc&p}-c{ z&LRR6S;?f`f1Ax>S`qDOoQGgVWeV#DY$vWkf!z-$uwD`rc74)b6^Syl=-~o_?_I_~YFvkM% zp5LGqh9B}gUlbAlN*ceRmo#S%ntLT*nO->`9C=Su_#-T?d6g@{7T!^k#gi4f`_w; zrQm=WKOk1o#3mNyY+}(x*+dh6u({vg$|e{x?9+|m6r0Yu#Rb?zcfllLv5A2>*@TV8 za!|p$3?_YpQ&7w~1#5`$i4ru-tga14jWdBz2yfmM{CVagZGq5%zDBAJC7XA}V%;}=5(zX-S~n1(}>vkitW z=NA-9{337*sV3qVK3p*V0FspqK@hr+Q#+PH5}DhEyEUaWQ5LnbjGR{(A3!Q-W*M^y zjVT+Jr3%V6FT0b$s~dRc;_Jrb4(l1tt|bU+sk5P_T4%t8G%Ouyr);J;6Rvp!k8Wy={D7MD|ySfT{*qkpR=ee4X250FI ztW{xjqm*#cU5u+dMY)sUb%A)`Pjgz~W?Xh{`h=emYBr!gzud%UhHV1d!x^oQAZHw# z#Hl#z52Iq38;L&k(2JE9#zx|!VI(xp%2K3J(BPi|frcn{tBeH<7_PWKCxH0fu*xnm z2O*oDVx&frw_RV@b}>tpMhZg?izujbw^SIZ!D@&Sm7!rlC z?d^a35+h{Wj1Ae!b``@a(xy3>6mxLttT{->!>rPP-sQNGO?a0`i>px+6gdw53yPf3 zO-_-Mx-p8(iB9?fy7YxBJbHhr!sEKhD?F*2rV3RZWZX0Zb2fA&A6M(V%`}K9H>~ZW zJZ3~jhMHiA6CF~ac6LmJT>PS{O}39xO}s6KUZd4TX2f(xFn)c(A}4fg(sBW z5MNgj`J6JmX^-WXlGu2$Pp4MPd{6MKoQ`wTJTVFx0Y$AoHj?57*NVe}_T9sKM5`${ zwq!j!_IEQ3UgE}JS%_^qo?0_2HWb71L;I$<=il|9$SessWBbtV)y zW0KW0brN9Yk`KMWF~QLcvICSxi?T1D-Z!}@9~|CDg24G$0B1lu{>Vz!ARfxdl1)sbTTG)@B+;L5BQk#EJwp8&L}xWK?%+nF zvBB&c0k%Ph85@p*rQt8?h(XE}%Mr&E%Mr&EYeC%iH+VBcN`Q;n)dVTSWDNhnJ3av! z*`kxL$~)ex#mCsaX3l$`dc-K5p~#Kb)7XH2*QPe6WNg5{*WoR(ITa(8Qv$tS8?gZx zsIB-;inB8a|L&ts#WLoV1RjJ5bAX|TwZR+t%gCnb_#wGV2|tNrF)6SZQkmr=thG%1 z2!b;%|&?KFrEm=$DLzCE>E1(>{bcPn>f$=T|6w{XWK561GFxf`;OZ@u|a?${=@ z$=|$zJNE93`kgHCNEI9WP9}O>h#2kl-BsMd#zy>Z4R^SyQooa>AMt6W-vOZF$Rup? z9n)M7Zg%ZQW%&F{c!?83Ti)(wN|~knvJ`3}z+k9{ zDpdN+74ZNk@t`>EZ=AzJCMS&vSX~=$Q_QE8x^oo@1B0tjwhaSyN$)Y^81Jj2F#-t-*lTwmShrDT0|tG{=vC3aIYwtJu()bWnfw`H}L$ZRH+>e!RFu}oK`0Uvqt>k!LIaXal>wTPTpUmW2b=>14+Q_S)g zu-qfp9$7}S;SI8W(G;{V2dS<{bUk2A6Rk~NG%VD%H61WN`-m2R@S+QWQc7*JAN*7O zwn%c7=``A$YCx}5`K;AO3^-3V5|>HF68%QhDc@KL&W)Nk1$pNP7hZa5#eL zfK{vxNIdV_o~4p)v2$sY9Rn@odF3{IM?>tZ_W@cc51{IA9zfMEK$-{eXzKuK&>TyK z=O8L@z%Ga(hb72$82FXLXDXhsT+bSafj;TAon%IubmqE#ZbH*)j?5E+F8n7CpOQ=2 zaw?*SL*He#z-);m2K7X~|B>k16R&)JG^Fy{=$|KEDUr|0|D-a_XQZ35v1DP_u^_s) z0Tq)pf@i)3n(*d4)O?ACgl>{%iT;X<ku>3uEcp~_q^uS^#0oDex4ZPp81vGPPL-7 z4@8mVE6yg~rd7gl2eUWal>kWYzlD8cc8muaHS&*Z6`ii}bY|zq^)*NLNrtlgZEw{B z9g0l@1ea$uNL*B)^n_Wb^R4fiJjm$k2(?c`KiPLZnqG{{TMID>ro+^{wOY|yjrW^^ z6?Cg;g>IiuAebPI$WJP=D2`}f)$2t!=QUR)7?!osyU;n1`BWsH2fDH!)3jUm70zPM zW+tqQEu+I^*}(35Gv*rdD0Z{81(b@4;nSzW7$y(?(r`szbKppU^=U(sf7l-DLEQvN z9U^tt(R&0E2l551n{tkho}CX^cQu^{!n$`DWtyZDUO}NZAND@M*8x-}^*)~zY42)f z6krPx#`&I%(Wak1J69JqqA+*yfq_K&PJz^yJsN84lQ1J^J?u=rE>)3Fa8&^zK)=W> z5JON3v=U%**O7LI?|Y@r(vxrz&D_V7j{-TMuqaEewOQSWITN)cJL+u$tkNDry;55M zU%T+RQxx2QHA$oR4dIPhEwl-t#oBy2tDi4&ar-Y zuC-uy@-`0A0s{*J+z_S_)VI#X6Q91!OIDuFgu?4omUe1BRc2ioNgqX>1OOcZcgil7L6m(H%NDS>Ucg5JNZvPiC=Gu^kkPlqlwhP;+?Rq|3Pna|TnOb-r>|7_zApE?B zi4hMEh6p9xiG&Sc!XRSg5APu@BKDhAa)2jR{D~WpGx7YgBUzy^APVOk!U*!FT0e=f zBt|DExlE%(?C|tF(w%t(Z%f|5{34rPL`q=%hbOx^v5@d&N&mchb@XI+eX-43?bGH( zERV+5&DY33=emeS7|gz3c}cx*bsgi7g~P}+g9U^qIJo7&A7abQc9#9@C-CW+ds8p+ z4$j%ZhEEzjjXJxBaj)qM@Rx85s)7jqZ}#3lOs=E4^S*t%r>AG8dvrA#NuwVQw>!c+ zdLzZkuCfxw+30G8EQ0~BV>ZsSyc=a-|Di|rlgD=a@aWw&cx=lch#ZSxg8;p6hD3mp zctINsh{S}6Er`H^2rx#*PAp?VL@-z{7!Y8`@8^4}>h|rP9&04oPX1U6=GMJ^Z`G-D zPMtb+&Z$#nJffP4aJuT7AwA|-t5Uu_3+ULccIlhirk-QO5oNX4w2~#QQQc2SLJ<&E zC#Gw@9cH0(v_uGsmS3&4-9nMwi^amW7eQh+nX zKdM~J)>(bv=rafOCxF&U1aMj+EvGW#4mB4_e-oPYgrF@R4huB`At+SDX3UqaG%EB| zb*aE5Tq06Sj+ty_MJct1B%I;_BcmOld-#@by7Uw-+$^z}41&DiAStcN(C-x1AHKof zXyWO&AhkJLvtO2+vo}!r<(EF)zjQHGqBO+7PSPkl9|?~)orZ(6&$RhhOiPc2l$>Xo zM%05o<&NrS0$U{HLTsxAJDmW5?(mfQJxmQ?iL+eMxEK)Z$a58lPlot;UUQLFU8)oF zt=Y`M**rlr462zvUeoCFed5kgV!>}iwpG1V@YE3ijsUV#T(xs+-Mv5QPMK*2j4upS-HHrdO5><1hEX=kZX#m#n?}SIV<(VN zNPqS@+alqP*Mi&|(HR*T%DNC}uJOfdHug;-8S4TlF^YH-I+De*L;^;->3i z?F5=D&N8$mc`tq-cQ_nzJ!4tpA<61*g8k=)@7xDutj12{zF>us&UGIy!c-GJwAu)N z&~JKWk*~qMnPekx%C5C{jY$)lQ%oX5RG5QuOao%N66Ck6jdjE}14B0Howp*R6nA0w zuv0mERANhy94)QCi=AiGNXAJO<{a>()xePnzqoJwX8YgVT^c6Ysq&mS!@yzan)3>w91Z6~SiQ`gA(BrWE*OQ;E^WUI&)v|xqyyrfu*f$gY8&fe&6GFG; zo0MQO4buoXG)GAJI$4v_dfNh*`F1KQq>m~LIlfV%>Q zMloQ>>25a(Q5L}|2NM;2{`xT9eO^lTI8Zt8bOuqL^QF8qC zV2od~{rMfHpRLTG%%7LK`B!5Y^pQhfIN*Y2DeAlU4{jp@P!wSa&z8PMWvz;7V3o3$-|E4PPe_ z+b0pIk~V|vOEkmz`PX-M-6q=SA((}@0Riq&T4h1PdcR@wN(I|IZDD?7I>$%}oXcF8 zGBr!bw5-59O%?krbcT>TvXLnEj#c(DRJ%c1Qyp^c$*L5uWU*qT2=WGB@QC6DvT11O4wYv%{?l)0EBcCE*j&Q(Tiieq8G&^ zuz26hEG{1)ZFx?&sywH&>E?OZT#E_W#pci-8lnr>(Y2(lI#D8#(Op0y^bSi zY);TutoX43y02ZAC0eM*JO=80=zA=Tt12X@lOv!jWkA{>S_)p2i6qZUN4pl5woHZ} zO3Pyo-WX?Su;SPFNWQa49o9LwTxu5TuFUZci1y!hjS^8>%J!#du9b9-7A$u51A+n* zE)8-=UcgLHlwPw$l;X;(TrO@XJAI0wqJ&zA@w-2J*>#c;qE5D1vxoLjrM2swzoMoa z-i~?udK1w7*|mC0vt9j$uD8m1iyuaA09z*`zUViyXU|3AjE3MsY_X_BXDfMuWu2w* zpm!^bHrnDP#<9nQJ6971sjtT>P=agLW?P(M{&%krZRny~(DRn_jKyhwp3I zTO?;%jVYvxW+#C|*VUST;mzTNdj7&3_X1zvs2{U_)@wJUb%zWXTz3QQyO=pHdkd7Q zWvPm9&TgbQ!QLnxp@BV#<4MF1*aXE4=-CpOSo*{eEM*D|G3pp10YHuL70@fpsm7N! zokH1sIxWt-FanE1O>%O@uzv3sTZq`=iDO}G>$Pc&R$#fZP2EWRy(QdRT=$sUEz0)b z6Zzm9n3Uz2q()3N3~PGj^&0kwxm9c=7GyTqTS`lM8x4gtmo|&+m9r0B1O>%=BfPcN zy@m#(#UvNoJBK2J{ao)eCcO^B>3GCi`)YZS7xaErPkOz-6io+e=a97DwVGRfTeIC3 z;uk<2d_C(Ht4wY=O#Sj2t2>HB$-!g~o7(fx5tXwP0_o8UfV9v%kT&3(vCelPtpE+K zULnC~V@R;~L7LYBT?d#im75365*v<85+`#FPWs%$`+{~S>h8+#^xI^9r{DH>+)Wkk z2D2lDJGd^tQ{2JH{7$t@Xj;m($zA!Ko3{G1BY|T-q+CIEWZuLaf+UtjbPM18JzxE7 zlsqR>`uNuDpl%-14IRuL)ZKTMbEm{m$MfG#a`&|Eru5qm82YLCU;_6L?mzsBRwUSD z(ii32_eC6tI3eu?+=>T$@iJmcd=X#bAzyUP278xaJ$y=`iIcua6DNF;CXV^ymBh~a z;%4(2+GktLb7{qE&7Wz-Z9t}>0_bcaE>BX<_La38fnNDI-S(g^ma+jUx3Pq3tiY3< z55DTc2ydGlx!WInm7KRF`3QEghES61omxw9zeCq!7^i8Xx;43NQ+9!`h}W{)AN*{T zT_BT;fMP*`T$of1#OE9%7<0G2K458r_N#aSnKbn?4eayxdv)dB8ajfR*c!@?KKmdO zc=C~r$@l+D3;%>{IAt43(=XRF}PqKJnS@rb~2`iI8}UYx_Xyoy+J zHNee-y4mAz9@UMZkg5ejzR^MW7M_J~BOT72irdkFa|558xZojifkG_df-i{+YZqpi1(=9H7IKwx$|%vef6~zjY8oy!zqL7WFP_<3?u-lzR2J@<%^p@{~!QE z3I^8>^v2N8N#D>h8hRuU7>fG08B_axkukN;7pZy57peJ>FH-XnU)(jw2=(RNl#luH zB;^zB*8_V9JkK2hTFd~Xs$`dctV(wKvMQPM<&%{6`SK~s`+a$0h(7qT5ap|si10+fW!s zvTL+EwzJ)_JKG)GGrePsUh5H~*}B5$KC?amtMvhgtn~pHtPhGWg^=0($U=s!ibz2m zUmS~NkHk4M_Vl<(4E6Nh`@a%pOOmfYuf#htSKF3bZ`brsa_~Essv8rNrP1 zB@@M-frO8@NjT_9`1PEG8g(5^%6*ZEbyh5Ob&!&Kd3!Cg@i;XlM_wl}U(=G(1b)3m z)*v}f^8J1~bSDp;jL~6{!g|+F!e}ZWn zUrY5}^EL3;79p#fB3x?KQ-n)3@vCLi8)$i-?rE6`EN}S)8_U&Mwfb3Od*TA|m+kY@ z#|ap9(wBEM5T|rejqaj+%9nRjo(S&`)2=U{q`b?QPf^}YIcPk&Qsoiu$a}=?hqCGQ zsKnOOIg8)&ag)P)HssSj(MAOpf4a@$&$L;5JG6Qcr+wCgCV&j-aINWfl2u?jdo;jK zTioolqZXD=SAS`q|?cl2999smVu(ALqxVA{5&(DK1lSoUAii``UYM3vPT5 zU0?0qyO$zyyL#^+1AT-4nx{S-{5VA)5B?~{O@M5cskU~s=c})3PgZ+%6SSkdbiK;Cg#*OaS)!s_fM znbNT~VSGu0m6Q{twZeU~E5sV-H-W zU^ikJ!2Y?u876@`Jm!htY7Sey;%D}VKHUcq8S-R1B+>}Rf5^L-&jm9m%Cne zEY{yg<%pRScm0)3mwMI*45!b-(gwG=rD19p~J)K+>kmvn0J_9+8Y#z z=f;%C>N~7B8I38u96B6cb{!t>=&(iGS*kAU+#qbM+LTm>5Y$FCNK~AHQApqiNoDW62<^v!j+-@ zE4<>pOKuSFHPf@k3M7*yTr)H5)`z{_Oyv1z=1k?ql7A5~poTFX@S?e|W6a=jwx?rs zX}sMXo@9tB@B~xOf->ipjGKS5xw@#PbSrVpV1u5tU*bv-H)Bu~@g52?#`S9LAE|0Y# zV+e))WWQ|AI+FZ|VF~cnrf0%l;p%3k>~LJ0B3_WT!vw9YI$oIA^vxvt7_K>zZD}kv z3iC7?LqpHCTct1zg<4oU}F+PFfr4IB89y zOPj#hbD}U96J9!LZCxtoi3~5tFGI9NVHpwu7OzW#a_!IdFSCR@Z*4F?Z>^erlqKhZ zJ2`Jn*2(1d%{^OMD0KiKI3|HRy|a1R+q;cSRo2f2(_yxpbaA0LmNaocDBKuv;yECphH5Plw!-VtB7gZ zAPHTohFaIQxL?J(Yq&_o9rp%LjKw1(q^ zt}uWY476^8?HoQ7Wh)#rX7=g2<2fBnwO2*J-oWeCY_B+UojVxK4Jr;sv)<~MFEDm3 zoXJ-T+9rNCoQvkDpqy)j4}EFaq1N7Cm$9rEa5eLdP@jBemFxdrlmcV$GwKdi>?@(N zbexI?7k;pCDw+YBB;Q!l8e&&al6k+VXbo$1v^ouSPQE?FCsoxfc~ z4&%Y|szVJ^_mI;c*dM}D@XQb+`?gW`_L(W$4IaUCHOF)&P0p~vz)E+{zCqmLP>18B zeaFSEXTr@ak9{xqAPi>U-|k-4jfFLg6!fAEuhrQg%T56+&@vBGx!D8^F^N>9?(Ad$ zZBlVL!;qv3n%?u#Z*i#B=T_bI+L&JbnAG5N{a_=xjYAPo4_(Mc7>SHa9Z_hwTUS7x zI13|^vOrs#K%o3j#QE7!)4n%a-YwfQ*E>sOSJpU|AP=9x0sM4r%MTZcEzJc<;^gTD z->4$>t=Fv3d4H2d&r@hqQb@%No!s?X)TqN5cdIK*K_=me0^B7dj1j>athw>2&(vVe zPZD{9o-a}AR9^>=1Tm?@q70Zi)-nk|Tqn&&X5N#cyh>ogH})y4huNl(54 zBArxKwYd<aeNxr-g@`a)Io0$k4} z_np+9j=LE?^Ir)|^j9BC!0NUqh53ms7>*9FHvOiWaqO;VDt$?)uIG0DbDQUwJJ9lt zofM4ab*6B5*|Q^JIrZ%dF3fP3ae@4oa$$bcIAeO#d!>br zM-wUjX&;yO_@Ngc5g{j_L`~VUX(j6%>C$+7+@5I(JA_w{>Qb5 z;LzeU?Coe6_P|#Gd*E^w*h_QljrYc$cDKS=sIB$ z*ogML?rruhS|^G`sg|rnI!CQlc!mR6>l8|?wn4EWTR4Ynu#i?+m1vc6|NMBwpLxc4 z&}G@jEis4O5SOx+VQ#qsRVZ2+?Re^HGlOTRzW?2b<@(qD1DhZyEH9t>{?)Dd>q|G{ z&HDb;`i9gtw_d3;<*dA4<;|`<@zm8yj8jhMuPJYF)uZt$XedVILYbpz${aREQ|9b` zLeIIs(S5OvOX-y*1Zvr2X4y3IzteDIxxUU!-~2?rge<;ZR(C6wwFxeNs-sx+0#6lH zqGIWK*$hH)P<3r+#$^m>0EhaAZ6mETiP(IR-Qm2a;ZA1IMv>(@htJ$L= zlePbblo6s!lG%1*B zUxY{-xMwJG>L`EtHMy%Hy4+L3NDmjsGDN9+vJP9uVR|oj$yz@3H6;%$&?jqciN_~U zu_WVOs$I`URVeGN`$Lk9{C2hG^_l#FM;Hv0q2X4{(kTFNGi&`{YOVxtNe*wY1H7;UjNNlviM&~3#>Gmx3jFh4Bj zVRN878f@Eh`%=ZT#tFk-a0u}*kVCvV%|?tB-~+y*Zu14QY4e7ZPn_6Dj7lap6836I zZ0KdgM#sxeY>c!G<3JOfX0~@6hMJRm%KAaC<^6K5Q9_2q1ll5v+6O*qoxn9Wt={q(-#-9LT%(?8U2I!8Ekn%zngg>W!iSt)^MxOOh`Z$FaMd35dFAAB1!z<)y4 z6Q3)T|EXR6-l2B+hexnWFs)D-Tm7^h#%)N0<0`{(HNx;LTa7lK&2t@k!`9()U#X98 z^Z+51-IR&p;q>g6Hnti|sAL|yXJ90@hA~>TiLsQD@8D`pU7CX#($r{HYl}6~MsM2H z@eDMUR?MR|-+R=I5Ajab<$9A>QlERCG`Q;N{14*_PwTITH-(zABA$Z2AjYcm0hd~< zVrZmq?2*>DTH(kAIvu!%CI&YKT-)SI6L7q(k9_-l=zL_F#j)8EI3=;AssTd^{eC1# zX6M$afZB6VqNOawObPj{%p9o0t9i;4nEia`l$V=IhH9Y)It+Z$-eo%+b?ign@HT;1 z{GDXN{CM4`9FQTt2yj#t$keW)0WA{j;<84}1K zlQu8Yrn9XRUvVi3Zg|~wN=Z`d90LCK%Xu^rONo8wqS6w}sgI!@6;?u`^Iuw88Le=7 zq4Psu7_CUnJw&$zxy!iBq=|XcFDj%g+G<2gue|t1iaSjksclW(y;#^GTwOQ|YY~6- z_SdH0(3!9Ff?Ds5ATXL+0ZN|4o&$b!c3b{14;z(?WN%wCka>j zs!>0~Rl_2A>{ld)>zGF9RqSApz(AMtDmm5*?5nu0&AwWebpw?=9g%(2yllAUQgW(E z!G{m7;li2=JwN3bf~&YJ(2B~uf#5M+sH~dhlttndTyUibvDVzUPyKkjr_8ydDq zFqKfNgv=~kMu_Aueu6Fv{-qtOp_8|t2}RAI=0(^`PZu_ngmynZWzI+Lr)968+LktJurFAJfxmJwk_LE{0WR)#Z$WdJQ zDM%*!NehVfS3wThPo$hK{FJMWNK^%dho3qr56{^0n`Ejh1Qd%dmLz|?C|-0^tbFxT zy%!}jFG(&1wXoABmWr~8uq3(C^KfBFqIHO8KlJNRME?%O30oA(y_3AhFH@pks}u!2 zSw+)VD9(;3(|AqCusPFs1#2Qjp3DKj@U2HMR`O7n^5VGiSu9VwS10NP%M()iX}!j> zLvy&I39)V4`a`||tvqa0Jx(PD&k#~ah6IaZ%L zO*?)O8Y*Wjp6&&z?1!cq9#B!j14zo*0j-ZCzr4|mC8+EdVc-^9*Hl=!Xf_FM^o=Ax z<-UfFKgPnQ9u_q`+u|tTw5%7UGmyYK^X%+8BW<2;sx!Cx&X^JvwH5_XZPik18q0R} zz>bT%54Uz9wocOJpwd%~y%8kHJRE0a5=6VS zTr;H9e$o0t0Dw{C&(63XZ}t7ad?*jTI z)ttn?o{qBUj$|_M$+XK)gDMcYoMJx=@5D=FOl2iNfmCU%87N=}6#y_aBbGBt9AC8f zg^ag)xJ_@7W*Fx>g{ph~TK%%6HClLmp?m!ry)~b=*z$(~fWm_Ia)c)fvRaD4XNgku zvJj!*45FS$WZz}dK)FkYm&exY^78WjQj?Xpj%jJ0XFk1NUhpq>c)`zWd%+2E2YF=+ z6O>0B&v$caw*QIaOqw!qLc)j(_2X$*@GxBi2CaCor(MYftJ@V^m@h8lf+h7*E(qLB zTv*0#;KImU#|6r;y3=A@jX!VoK?fDdj_-XT;{Q`;@YDbIn*&z8?&$5u>w1UG=tlk=7kr5zKtQI z)tJ-qU-&i*{`N3?L2+bt<9`cM`8}8lS4I&Ik9^g$jvw8s$FFrP_9v`*V9tak4>^Dw zDjY}JQv5{%*`r*ChXC1&fNnS)MT$&}2tb;!V1shD4_$W*-@-dCmo6B@TqELU1aV%L zUED1lC|INgX*##IM$BnpW(GE{)(JzLwjSwRs?d6`S)OM2rKq(9oyX$?p_PlZuwY5P z^qau1l}n9i7`2_+IOohJWenwJgzf2)Hn=|g8fD7XC|_L|5BeNNtWlK1C|ZA0^5X?^ z6e!2jDOt|19PD+ya*4YzuxLW{xHzooR!>3N4aZDUfOT@2Aj>WJMx- z0rjSAZ#Qxrmk!#BvPa&o*lP(t1mq;1EJ-6p4_U0b6?LG>c=q(;|Kwvd5U2zX zWVe0iejb437?OyWd0D?aS(1-SioIQ~qR+nSEv~4luXROLy)BKBKmC>UNwRlStAfam z*de2fcI9K7A9t5j7hG1()Wrf%=M{y2YGB)Cn(U+XIM&$e_rgWN;uM!TL}kHMKrQL;$R_}^1z9l9BFhTjFFID(iAL1)qSsrzQpHXDabB2=<%a%w7X5c1&1uNi9dU>m7mv6B7u z6Zb{QUtTGka^FR#>NGmB`^a&#yRiNg`!cX|e&HT^q_%3y1{^QIq`j&yPpe*`KU4r4 zuzL4R@fN&v0+%ouB3Ms6fGm?F5p(jcLNX#qdGlA!h?E~aI16;jE~OD>JZe2Iz;fJR zS<)=?7T{E}#~mtdES)K5J@e2kzzIau21?V++$HUWTV}g_Jcl9XX@=pWYMU%@YB3CIP$ZU@cyolrzWh-gpD|m|y_j^bJHjKA#AVr&-?$H@ zlo1cJNp^K`;tK&goG94&*JeaS+XJ|)N@oUtDLeRg0#;vn4tD94JEYm5q?r%Ul^hd) zORg!g@1W$_Z7OOTt=&nwalG2fs4d;h8_zb%Aaxj4NF6bAcC2%lFjJVsWA~v-NIVWS zPzi~b!0hPxWKZzojv!nw?v&vH!KYQ1m)9DRNavb6;;vuvr$6QVIWK?Ieu-XmiY4?T z$D5c8CG`8P3QRy2oMY=yFAj*zWCId`*)mpYal+iDOPZE^4>%6U_kd%9d=CK0gHE43 z=sFp~fj&kECmrz>Bd1NWc@YFkU$}N4IpL+iFdkp!I=R_W&zeWO#{?`E4*%RFtfAT} zXPb!{tHd$EOW~D{pC7j=vFzqR2vWAJ-PLlr%CuT0=u~R7&5Y0@%#2nHyrbwWG)ntX z^Ot6-8Kn2~j(0Ys($avkgsUTzZMx23D#vk|@KvV>0a}Sgy8YGbW+0w^Dpz6&z_Mwv^q-6BOYC)}AX^0y6Cv1o_GSK=4A5tTJeTN0 z)5t*AcnOoQ%UM3CU(JFO2ANI!9Zw7@O^=6B`^xIdczn2oYQXg%DArG?)BHW8upq7n ziMsl$rS3gNBXe}5i;1$$!m;KZnM_#hODZWDjRGda(S1mcG3iQ-9up7iTnPS z2e=~mHY+tFH_WB+$rmC8erWfixc{c=jW`}AD_6H-o>3Efja_sWxsPmRXU~?lP|j1U zKORN-c6=tZm42ygGlFt$qXLrcwk4&PNIVkVD?$wUz))(kO+)+RwOcCHesdkTNr%_V zoWpuCC$OpzowI(edhy z|EBYGIO9(L{u>T+&aPs|`&C%9cv9Ct-q01%x`dA?{9hbuY53!o(;3o1-q5vJ$Dq}r zXA0IF;tgGW9TccTBuzN>By937gJ4*-2E(}#MR?)wKq-RWKd|9{jDFRCS;SKM5um1a#-WGEXy`sFC3!s0XRewc!OB&}N0QS%abY53F z42aQF4N^b_4PE1n0v)uA|YhEbY`QgT7vRHxcSO zLR~s`p4WD&E_VofN4*nzZuQcFulL>O$8b#y-x{}A2qkwVgc)h8C8PL3Y11vNvT9+K zm_@4G>)bdOP|4Wv0hP3mzsK4}AXtC6w>Iz1+k6MZ!2}9PxsyMvYEw>EIx&%10>Q?aN0g-$Ob39Hz_Lj)Xq*O0Swj_ zST|lC{XcdDsulOz5vcZK$`P34EY%U1N51!YrZ!@LHN)wgSsTFYNZTct@A>E#cr2*b zPck)-@6>~B!`k46H9W}Qd4p6JAwocZv;g!c*~^hkmRn>ACUDz<$Ir{7yA3=me$2qL zA5)@yLEk8^{{7z_IydlOwKjMLk^}Fr3*ddugE#E}*}pRIYJ&7W11~>7*1)S}|8TD0 zG5FfxkzY4p?~4WSzUINh#z9gUhdsvB^5_c&o)y1r;MtEU#xSxPj`Hg9a|Mq<+XfFV z3gA6j0Pna5k9DD)+$`RsC(EOU4LmCzGw^UExwCHVkk`KKyMJ%QWnK_-pr8yeeikvEp%f_Cb;)PAFxQnNoU2!+XEv`68@mg2hM{%1g?x#3Wa%COwy2GFI zi_$`To;pS*5lPI{-EpRl%$4lm)oFFa^CE+k zwFka;iJKlXZl-i2Nv@kix{m18dv#-! zmB@yId4l%YlT~Ywkckt@jcrZd`Wsw1e+(FLM^K)uur?X`#2D^|l0u>;%P)RHq7`2Hw6 zdh-4#x$SklMdXREY+OgTV@=Y(>f99xJS?p!XZkL1V(e{ z0&E-c7#ldY$u_*y(dzriLt$;%@!8rkFK1ij`W6Xv@Je%}yw5%mANECdupjhA6!&{o zgl-48&Hw{e!8Q~i%e~eC#rp#k`2CQi-B4@}K(NLPDG-!*fn*4_MAZieVh6T8QsM=d zDdF1u(`_nQrzYUQ10^+vAT3_sar#B<5FbuUxFlxu376hUf-W~a9HV8VTvB(AqG(&Pmi?vV6aT@n$k8|-Pmjio z6zvsp|I~|zV|JEeUBfCywh3@`xQ~MXEj?thZ*0-Dj%n=rjvZC8-7%WBj`>79p<~3V z3B=u4bcG0TV^!Q?xS3@YEZwQ%fEk4?Ba>C}XFn2pXITaQJFw4&1)Rgj09?GfGuGKK zLWP5n%u(VFKtzeJW)8%io_wMx4{a@dXE~4$Y8v@u1y!9KQNwu`Mrk~|l!=(L=cqo! z*tjwp5nf-{>Va4ZAZgYO9&(|(mpIypTZu4iga0`)I=(gLQ3;St?`VPy{M4Z)~YD!G*o7@RL0!^K;lw8;+&C3ZSVFRS0;&jcq1KQYOiMGr& z(M2Kh#2`jJm4FHcksQdPi+y$=;faQM$>XXpRU?qwod_TJZsfB?NFVgpc}?C|pO{%J zW6)t;Sr#19mC5{+uB^_V)D?Q{V5#B+GA9#I#^hkncT*r zM}2vs45O+H=}s`D>1Iw5qSv3>Z2j;5U)X#8Rk>@H~hSq>t{}cijpF>29P6ZUb#7aZa*TN6L%i&w6RAGP9myqR-8 zRP3hUG;B+m1KV&Z6c{v~KNGZL)-)1zBbbrVL5Vg>ilkQKGKfkw7A7O*wI^vE%x~mI zCK#bFO({vB#T$4@EECA1<|oTqH~ihaQcb(NmB7DmS!B%+L849d%KEB%eZ|;xh14>+ zv)sh5W!}y-$}_oJo^xV+lr5Hv-k?L}!W+(UDknHEDC>QSt|i5YZOdpvn5a2lP>BZm zvowp++DhDtwLEw7;!Bp0f!yMJ^ec(Sd;f|@8dqXL>j=;zfL;S^Tm+lq6#T)k$~28H z5t&B10f6Z^w7Adq#_Lsmd3Exx0UZ(e#wL#1@%Tyt_xjwS26}-S!V6b4aT`lP!M4)bZ1KD zBx?AvayT388}J=a%ep2Y(Mc#28Sr%R>efIJ_yGf6=@<-n$eh;<@Cuw!hl;>M$pHLX z!Op#h{UQhZ+GgZnr~4N-1`T#~J|&wtd{$@y*vZ?&6F_Ge1M%vMSv_%G)szDSi~~Os zTdW5lbORpXQszg)jkr+E6@iYHa?iN9GO=FNW<9z6d;TicYY-YV@!{hPxU`z=U)5|g zqBJid61H>-=Zj1MDF-cMh!Z&(rqZOx;q(FCS&`y;=lDrZi7mFTPb|& zvp(y5Sc%_(hO&v5={QDRmL66ML+)yNpxiSKFKJ|@!9X~$VT607!bjBB@V5~6K(|@3DU=vc5YBatI|t0pKNV0s6{mKzxwe?mJ#A+6F4F#j&_Yh zdd2_m1&fwrh2=LVBk9f`9|^|5&7O|mcZT0*-&+YNW7E*vmg}u$d4dm%y)C60lZe~C z43BcF(A#CMw<&4DXd0u1daRQKdiA(P64cHf57XlsEH1k6QPt>Bf?PJv%#R>(&$+lo zaxv+spP>U}h$xb)EOI%9&dEi1PUygx$i=-Um-4wouCXQ`l?A-?UyQsub%Nu&HO74H z7IM+=5F^P!^Xl{2LhI3e8fZyi-zq>m>Yz=4mZk?C#17rlA$I64LM(La=yr#0I?958 zk>%$&@gieF7e7acRad~OZjKOQ-22q27rE#~n?2fxnt0G)p^F=H;C80ee4qQUpBT!7 z$T08L=^4yi)5L5@5{bf(L@8)e=8(zpm`q4%nUt!?CPY#49qN`-mG3CWi2Zs(VC?!(pPNG#1pyIe(K`Ns}I4D-7Rnds1RB!f` z*MXz51P9xMh*a(mdGY%@^5U1(3EUj`s#2YmK}XD8v6>FX*=jQaqvnN001(S5awci< z(MO#jxSA)#kF%#xWeyY#!M)lbzfvhT1oyjy`2EhBr@39A3-DM8@d>|>A@3>!nm>w> zJ;)JcE2Gt#Me(k#jDD4aJy34tomnmSfZlm~z3Uy5k^Ct3BWNy}oafgreY&qJlqqJq zg$rFO=-zeVI;K5B8X);k3dZH~kaF(0Z&dqzNDwrcd?%Ml6rNn9vkErTC(3JEtnA(> z2Gahf>FqTdFv@^{qDg@tx$gwKzONuuxiAmgVtIg>1tWE#o&ugox@DDcqI_D$)KilX zVIv#6X>n0#gH(YnWMnLL5Qs5i##SbnPV!vg$U|_FLp@GcXGx{G)d*dW))Uj30)}l>scGodFZVp7nRDbV!wqnn*g$`{Y5@c!+p$Rk-jUlyY%tJUj+XwGBriQnP z{NfQz3mM#2XLUq2!?KPbC@+tq_22)8cmDY&zW?F_Ceq%B>^o-Ux2~E9 zzSbsFHmF{=gt?YFw9KCF5on2Iu6rGw8mip z)ip!4TWA~Kp8UdH@A}CDNB2MN`Bnqwi6eKt|0loy-cLQnfPuJ)G4sh|ftl&Hmi;sI zkS&ucm z^`WdjNJ%X8VRh(&bdDVLZ=enK{Yg`^7$E zN}*6y>?mCU6)OOXdA@f*1tVs9_{3AV$qv2yV9)T0yf#>^lq+SYIYw#{z@#>_xm*D9 zhm%936IWM8Ti?T&mar-DJOiqu2({W&b0iC@`MD$0^t0+eS`e0fX&TG-N*r}8%xYTrH(ChP!zNe9(x8jk`flMBO-kg|K_TK!C4rdKl_XV+jl}aZ z>Kt1K^?byC}JC*B!Qgg8cG^8U69OHu4Ahs(ltU(M-oTN&Oh1MXv z2s;F18MkDt50G2gafNE=$*SbO%nirmW`^WPiEs0Dk*2~%SAf5}Uo0#33fRtmQR#`2 zKMYIc`BrJTLUP+kkY}PGItc?#lh?Vmq?KYoqPghL5$=rsoS;A1$scNgB*&f>Dl34~ z5C$*16_U_wM<2-)1np#^IoG!FAX?k^e0R2OTT0d9Xgp^anAHr1Q)klu!qEKMe|0Rk z&{z$@WTQsMD2vgM6bngI!uT(2Mt(F3|1!!hGBxGZvlk<*NqOc0f_ zW*doXR6CyxCuE%}@C8c+1abZ9{ zjYtsZypm+M@clL&cWo7*qJ#=kKSPCJ0-`rqaZBqT=VF!>>ja9o%bIPG9G7v&bayEi ztS+0lFn6!xvRIo1HJ!r2Yn(J0hlyqOvcQ2WjBt5(P~U7a5dIXA;kF|3^_9&<()dw* z6*r37-ygy+EMx+abo+0G4&t!zDpdCjTv!O?%AKZaht=@CINX&PLpJ9WFl-33_rvS? zq#jU4{6!mOt|L%_Z9}0uU1&4|)pTsoxUk_?2K}OGXDtpX7;{V_cXglnrUOku;a4aS z{qqP{6M(PS2%X-`GRa~i9M(y6%a%#40uawa7d#NDwUd^zuGKMq8;m>i*8+i^DWzV?3$dKD7^*2 z$}3S*4r^>M(o0fOq{vLy!lidxtG528+xYOgXMg^aryl#vb8orv*7XzN^P6sM)h^Sb zQy*b`sr~m4XXQ8Xby~jeYHcmUihS)>8F~kWs%mzPZdl4<()iK0@A~1I44+sg5;{kcLhhOz~=vqZc5C~9M0c3%6*d48)O^F*}!Yges_I4VWuKU5ifs{9U> zS>0t!1=#VmUcq9fyIMBfu4=eY)yMV8eE0c&mD#SMs`eGCoeb5U*HJBZwQPR7+WCcQ z@7E_Rm{irL!{?}oOC3~WK*inYOi&%wCk^-cS5@{Md>~YXc2=m0yV02-`L;gskQ@u2 z)3z)Y;AfeGB+cfwJ2JP>k)P`m56O>J_KQ#jpS90 zM<09Ws(&BhSr?`54xf8t5ct6ulySFqI&(XmYgO%bA;;y)#(uT%(G<6g{p5vPTRH4WJD>P5~UMwsp%IVt*45e5uc=(^xC(lq%g#OK*p-3M%i#8j+ ze~Q%cW9KJo%QN*4Lc3U@Is^vyjEquK#yrIYX8p*(eqWhQ-{a9O55pfO1IDB0L^!lw z6NNRt)4?F)m` z3Q2e}Cluy|LOm4nC$;b-f4LE!^jqOQ3rlkqA+zfxuA7 z`0qg4p4#2p!k^bn^hT-6!ViP^eQpuIDN;$1F&M=zjILrSW>cboV^XQqHw zr&)S6Rv#Ci#_xr-F6&Ny(z*^`Qw#0s2FeH?8K9YGt}$ff^}CwA6F^1`_c`lB90(_{ zTIKsKLkfI_q0*vX%zC5sYF13HMaw~Ni}@RQ0*0}6w>zW_pRPkIBRkA9Qs-7izhWV@ zq}x&mi7eh0V(mU0k2fpw0Kire=WJ6RfZ77vI$AvDTnksZ*vt#DTK-joY68T{(trV; z5s}gZ*uJxOT7y2xYTCI8+bi4DlW_VvTqX$cDw_k{yn+idPc{q0fovAoFJ-g9&VY~W zB9*Wg$&F`pSQTg{r1z7p%?v!~${qZQD^s}k>-4oaJk61U?MV(#Wmj`0Ghx{?+f!n7 z!SVLtpfd!cXDV@abTAonw!{BEMoChleL%Oy!LhPob&6Q#uVnoQ(xtoXu1KXUlHB zg$rcSaDv@82Q+Wg;ct=zh}a#v?)k3F!rN7(m!hH_y$u1vPCpPx&`!mRN?;ltlQY4DA;n~dl2ezX#8e6VS9@yZxetYg8IJYj+%nlqy(AU*_ zThTutvf&>f@LfhN*;~#6nV99Nx+rDNvZ6qhS<%7oD=pH&i4yh6na07klMFd*4#(I` zN!V*<@%$*J7l4`CVBcdF{hsX81vXZ4F9C~SFK}Sz$FmT>C&4u@U4Z$yft?zAj~^$P zXU>{%ZG0n+jPDQ37I4V~cptiZAf4$bjGyO0fZyos=|=CF%e-KPkuZt1yVj~HS-ygQ zDKNmW$WxeWa*vh=F)9p9faU6sqaKBgjN3do<|mS;+|BQ%3=XrjMj^-O0~q zJ6=56RdEo55LO=DA}=^A{wgvm%0$;;T9qH{Y#R@PSv5!m%8P8LC7*4Dz8>L+@zy3D zvoJJL^j%pBftxxh5Mk5L)Ix*}{v0_dY>IAY4$qlhbS+G}R5l!hOxOV0W*tSj=1NFD zleu}BnMxr>ejY}~X-H4kIh+QfzVLQ^k>8|1R)Xidq?7lmmYWUaEPCl@B@h&K4D zq`sZy+>3t+hXN5s9S#Mvs864f?Q!>{FO#`Vm@Xv7v{dvlKiz_Idf*|{kYqD~Z0(jy z9)y~LkfxO6<05B{m58%YwpO087ZDOh;tXl3OqFsqDRm72H~+YxH1e-mF{j_t!)>ID zA2^*dekS2IGpXWE=;X?>AzNy=1!maY+FUQ@kiZrUh>DUSy%{(h_}6l3I8u(`fwQwq z8+Y+MrWWTBHl_is7wMHLa2uNOAX;+2^RQ{1P}GidwynV0YEuJ3DigFuWzzg&Vuf4j z0B4|`01qJwWFpX9z#Qn{InfEjbl8M-#(Y6Uezhu5@Ci za-AS$(F{wC4qdTsv;K4ycfKLJmBVJ*&sy}v`RI!y%FwYfr#DN+Fhkr0z)Y*}v3MU)Fr*Cs)P0Az3!#jah%auoC`3~iAh?Ewf z?W{OdU5826VgVT<7{@7&&)dF@lvOQHF()+7jn{&-5hEBZgPfDMP|FCey>-smxrJYl zc1I*mY)U$}>I6IUX_1wrU~0E#S@PT~m`aG$)SeP1l7VRxNf5#MG9MHXH?x_Kq>Q%p zR6pQQvfO-I)I~eYLY?X-yf5_=@l{Yik#|x*(LxcALH%T$71U4k0jGZYF37fa#_H$u z#IvA&9{VqzRkX^fyXDAi)K3@BVzlYd*h6jk^xI`70~Li1di5OLTlfJZ!Vfr*dfv-S z){PKpyC9@9cxBd#c~HT-a4=I)i_2aC*O}g}rq5E*rWex{?Vm1;$6RFlF0ug380eCc zg?J>340ukd_7MfpbW#lE(yr1Elty)EBWaA)oSrYQNre7&}})MW3b zUfM@g*G@i=VUAhAI?C2S_B~-kQ^)s{t>$(@4Ai=6HU*i*j=g;NJ~b{lLMGk=l-<_? zDqiRQ@dO0=+U_VrU|!Neyp}_VGD%N?cB;gP<@xd0ae|BX^=4weemCcMlbno{+?JUv z&J;NJp4+FWPW2})J+a)#ANmEi3+{$io!)-&a=t6^9XGpmLo_DEd%t)&XrQp4LPLrPqF>atk$y&ZlIb6)!i^K2cv@C>Ny) zBo?A;_s39W+0+>@<+o^VYDkdwSrF*3mI5?*DVn5JKWv%7xlycQJ@s)u*4i-l#nz4q zU&u$p8?BSk4URBk2xafs)YnT&<^tLe< zceZT~eb=_bcp`pqxD|ZXpt_5SD!wkT&a-R}6d?!&HBq7HTqA_r`$Y=2I$vi`!4c9$(Y!x<+vOKV&_#g*r`~q?D~X{f6GmTd>MUOe z=U8DU@lwl%7-ye=2Q+>FbGK6Tg)x*J{M#w@iecp0((yX(W$~#mhD6EZ8%8b$-?B~sM zvQBU#UVO&mHzC!oMm?!^O?>dvPH}T~_j@0TlHFHK|536*wbFOV2>z<8@7o-ZwK-78 z4^9>~itRA!<=QpBX&9kebA@^hHED!lKVcs_MVl~`3xpYgF!MBQM%A7p&xuku@6PwU zd%T1KZv$t(F)ugG`9mD==_A=};LPWK+Q7kR)xo@yicZ$pz$vtTXj_~(+cry!Z$ zm-L;0h(#PeIIR~8eJ_sWy;zv{VxfAmupj^y=Do-)wfd;2IO-B?kFKvM|MzJ2|9(`H zMxs~6%+#Q*Aa+-AFNHc%>hpzOyqUF3jT6o4X1+=~olInPA~JdulxNfR0N6i4Vt4B4^X_!6{jd(>E7GM6ZGwC zxS(=w;evPID)-xFcR{YG0@!a2#tCbEg4S8_TD?#5_)aU2$4}FdJsb_;B{XM`sB5Fl zE}T`JxVt)csM9rfSK*H7!i&RQ5`n(FyC51Tdx=JNz)Cc#@7uX5&%pCY$GgQ+@a;aX zl7D-3JqBa?1(VZB@|&sRFHU$UlqzM$vT^Qx3iFL}fwMTM7N{r;S?un2gr+1`H{PR=mj=d;K7dOriNo$y;>^+=wIUX7qKmb2#&fOOZO zHFPL0<^U;53`%r*Wh-HM!(SFNd2~$7_HNAJr2e=W1#Fv^YTRGNLC?88w(3z5vwBaXu}H`T(p^3$Awia24u${)++3anwzjp0~0kR`5@>Cm3lTE!{Pfhjhkq_0yGT-?s8N!O=Nf`Ydr_e*N9VJ+rpW$mdpMJhXa<%QOv^4GTl6W?1Mk=BkK*8gK?G?k3DqP z10=;^`I7r{I9kIGIQ5;73)h$~oADV~XD&ufF!CBhW9=}8W;M)o1RZQTDr*Lw3|OdH zt~NFKJ@VjG1%Zh$e8Du2Ob-=9mmbXzyXNz^)co@{%kOX`}~U0~Uk5(Lt4whYtBEIX_hdp7N3bzDbHIB0;J9)mO0 z$8+lnaMGS+W_HX{o0!aGL~1CS*py?*ybgw1ML1P7R(c_t!7MuG!;rTmR&-8YEVK74 zkuVFG>AS&vV)ig=01KKr&@|*dw7dRv7}IcxY;KssUnuwj0&pham~D>^M7lJy(?M?G zFa>PGO`dnnCs$dHV_c$`^71*DR%w%}!cM8x`5R=kvCzC&y1ffsA;( zKeOIRb*7lD)mc-NmX}w#m>EjrE@p-j0lYPSWzs-*6$5DGOA(E-WoAORCO)=GlLLCQ z!@u5gDs&F9V6OySiZUxPf^PoTf;e%TUXPG5vb0P!aNsse6&<*(jElSnVeIHtq%Q{y zabM;7G}nHvr?>)O#wJ>Zm^;gLkn17t#Z9ZXI#aH+4V~RWzyN>5JyG)21))wZ(wO0@~AWOHMK{m8sOY%47|m`|m-A5{)t zQ{;Gc+xqBoG$uPincusP9w+0O{i34`)Q;0!lmePuEtXx`PTW$yeGis__q1hEB-1w0 zRwrMr*agB=@P#Y6K~0vrSC)WRcZs`xwki3t7nN1qb|r?S}NdQkHJbRv5>zt;CH& z6A9Ju*-%1X?Wda%P<^az|pE14z1b1=(#ENY|bTGF2QK!E9taL`^_IcETA?`SjTB8IkqwDKDYEc#3 zO4QhJka_it`-5yCzpfj{WEM@^J5&MYzY)D!tVfCS)SC-O<}W-yp1bJ$^ON(3%9Zom|IMK|I=oO^lQmw` zczISz8#iPVhokEn3+gX-RQ#Fh;`a~Uv~{>zeR=KWFJIt)xs4~~{*eLuT*M~u8?J+o z>&t}y$IFdn)MCVCIIO&wQy+~7DYXoX+?DyoPEO}r>_5ZV!q2Pi@B4orf)GuG$Xu1|va`@4G?>3QOen_3R&9uAC zU#P##+N@+6O}_vHhW$=D%p0CNuQjhRztyU@`fIJie?yd$!FhoW%>o@pLR}qnh?|vW zllV7l#pqBTw!v>mW3sT(Pmk!W8~!hIhzM9q1hDc+Jd`wER_DbitE+4siP$-R?{MS1 zI!6^nSwrQe_4ACRNn=TUsjC(l?@`*2U$`e7aR_zdbg=_NbhKhQr{nzk;!ZlwQwmn# zj}52u>e&3;FlPb^+*877>9{8m_cR>$X!JVa$n~2vHMiX=XM4i{d8>&6`i<+~H8D{^ z;~dt~C2w_DYPxGRbXFMc*(xHbv(=>Csxf}M)dnhkN2^0xsN}6$qLzr910St14q4Dg z**ul!*Ku)0$;bN}qjfOr;o{d)az~|M_;Sw%c^2u}NS(yFDo>RgbCnWW(1TA>%7^d! zq0p}@MQ|g#kc(n!c*!xcZMjnQQ=|+X*8Z!+O%?aoIByM*6Q(F2dSs|EVDX1V%Jdr7 z$mLFcFmj;N15pQMxJ8JAqxQJAY0=||^G9UYZ76Os%I<&QK2uuoE}PPty~iGCDd4ps z6c8&*8$yw>va}&|n^?L{#KnGzrS~MFdV{%$u6<{SB^fhR!#bXkH4+rq1Z!Q-`t-m+ zi;`QV?+>{d5&X_!1~Frp9dH2hN>XT0j~hcjUQk|$%3Qipc61j&W1axCWlP-BVGeUh zb@K>XG>TEHk3=lL+d_p_T#fST^k2e06KS_{AV`N+)?h`=aNHZ>5Jxgzdx~}aQbWVV zL4Z}1>~_NxkGSF-Z21X#7|tro^TMm61OZrGBkn`Abp`O?TlVLRt#u`|wpFfVS|kU@ zr^(h9-lGkkC6r>8mJ+#oNn>=+9~_R7pILI*(I!6tEg3bK?o*2)dczVtHsRBfK1H2l9!D}b&yy`LqKsu$ zMBJ6a34Zz-DdJY1_!(smNVISQmDOQe=sLfW^zH*#o%3*l{oJHHyql}Yr*HzH5WiCD zej$mAz8V7tqW+wlhF|FCn_Fa-#Iad=!;-&jEqz7#GTvnOR=PB~_uo<^xift zRTSbS$`K(#rTy8!>mgKsQz3&{jRxnfh;)9Eoo;0C+&~k!C9l<&+nQ1{poi9CL?FaE z6e35zA>UY%^gt=KzGev(mJIod-}lHD_UXnp1AwKI>(%xWxDbAbi@H&RJb8Led{t3i*MI5OD&Vc2Y_9D7=awu#-v}osU0aojBoRuChHY0K`5Ez-}+KtX<%qfVUldqz9?e7yCgw z?WO@liyZ(>6>82oSL<+Ij8ZVk0n@mlWh*FeS z@%8ibv$!mT!)O>9iftIwBf6 z&4)}A(cHV z98vjsNXeZ zj70oG03**&S=oZY%2WQiqQMUNa%zTSt8&b8@v2x}YX_HFaTWDZ(9>}{3N%*4#DqpY z06P>XyZ@bwl5u(Z+)qC1ok;_uHyMWd1xdBy3RYdsk;}!1dex6?Co*v-oHTD#P)EcHDYf#}H+gx#y;zY@n z_fbaZTT&sin+!7X@HqxC@wnpqxM;%}o)AA(@A-o^Pw!RP^Yq;+ck#4ldrjN2s@@~I zbDjOn&HI|aumic1*qNByH%!>UZOwa(TK;l;dx&#^M(Fv%^eN+fD{|^5&{~mUA3F46 z=^-}V!8YPxKUQOON^Zosgt^FHqF5FiwZJ?hf5ILo)UVO2f7l ztyfBEX?ADXYik-TzZuTg2Fy&(h>$ycRjWHmOAYH}ye?h`Y^JPA(X(wXj2zpm6H>I` zw$)C!!LCiAe{-SUTGh&Tox0tm>?J3-0A-r}QF)4%JOF_O7gIkeSu$&^uq(BWQa2&p z(N)7nLfe(cd;L~sn`paN9obr#bzOQEM!qF%;fy-}GEU+=LyO;`E!%6}&tira7KQXj zyQK^Ztm+I66JT^)MW3NXuPN90zoKoPK0p}PGE=?LG7sknKb`S5Pr?>N4Xp@g& z-vrixw#np0@H-UE7W{iM=a?*TohmfRlD;z-TYoSYqnW<{1+?EytxNDSn#`8}YG zv}PH=wFeZW7lPQ^$sW!X^auaH+3vx_pYO#-G1ZABFJIN(zKZoo5`Y+MEEOZqlj`Jb z0cY2l4TW#a8gMp`qPwsVcQRTVtzA|U+i|U|Bz~jyXpZ6*nb8T!N*5|cx;A5vs4x;X zpIYXUx`e&t=|H~uv{&X541s4U0{qxri;1cqqtdjjC1-^}FWg3;PhFO}0!c&0lCXR9 zoJLy^qOh>vJ$g>niK}|-9zFB)B*j70m7XLYexfTAf39EF+tGiyDlzNSBr@~C0l0e+ zn+j6Dhzs&wTPINql$#2*U{$vo(J#3V9JAg5iJ)fQ1${j(2o7A-#Ql}LWfeQQr z>XSnFHd?f-mqx`Es48PTqgL%+#=e(ydZkp!yEIoyU&F$Vd=t`+>PR3!J3kPx&8-7KmCCZf8^*r z-*4v_Eqnp;Mmg}Z`-}I!?IXKC`NNsNNQQ6*`Mgves2d z(L%f2jpF3;*|A@R*A|S7M}MMP`W<%mgfHRs!k65Q>iD*hI@W*rQGMy#{BZb^AyD{| zyHVUncuNY9uZ%wVFchh{_CKat1TE29g)g}q#nY6hBlT_mmEOi#BFGPfFByx4FS#2f zKL{?HLYo&vPalPrzRi${q`8TAo@FT0l_fhpT8~O`7@!Of5=aRhpT9!xuptmil>hkE}LM>kowV*Z^YT<5Fv!oJ0E1Ww8L!ZRvKuT;%DNior zI=VHRxP404Q+C=vn2Q%L=l*$ucx80UH`?6)v(Q!#?niFg8s2uI@TZ>a$LQo&@M@i* zGOh7z_V;+XLVJpYQwRKh8LK5x*kE zk?&odm03t z!k{B|Hu*j3_yh`Ep%S=)PoUc1n(`Jd18d5gMTkoqqwzYK)i~e5fwJSNt6l2SQ{VqC zH6)$KlMQs{ET8)P#x-TJ03aMvd0ZtjmJ1lIz)B{O)eRs3X=+~%LfU5`toF^FZQOJv zpYs!zp)KwuN}KhbJ-f^r;z*HKH5SkyDyWz|nH*-}O;gKSoL$c87o1t&HK4OF24*}9V<4P`f!+Z%2Ha^F7q| z^Fp5X*qxEUS9wNczpJ~%0P&w!L&2Sbz{_sCZ?Ubs(fsA<^{DkBrs#VPeJ;wDW=FUr zpZ-lAoOtAmQO5svJ^IBcxwq#NQ=dfItp5^_PHC)F8jo};@@?;DHwOFLY(K~o4}J0H zF&i@M6&OkQT(vbjd6Xur$;Wb5LVJ6DR&vbKSH@^?cC6FMIMq(Z$*N)<&p2!jYIj82 zN-p5`yWcM9tY;L}*>RJC^1}%#)xb^WUC%knCW>%}^_eLW)tX~SvkUMUAL1Tw4 zd{g?$O^*I`e6jwe4eqDxkKHV$C~t_ilVDZU6$&2 zT{=^)yP0g&4i;xp8VVZ>ZT&*#y|#U`-@oVAKe_E1ACTE_e1=1{Q1M}R6PL1P(biMR`oHpndc9u zMEH>~O^NWM$mJr(B#`f!BwrQZO-C0@w*zN?1@7jO<|f1|G7SD;U|q`4%2R7L6Rxyg8sb&mWEk zY{tdsN$S^OXK&|Ngy$uX(O}w}InB1Fgl6ebo?{U$w=h1lf_)v%k$wHy^$huH(Y{V7 z$2oM7O0loA_NQgl+bhQ+W;DyOcy=v0!+IEDF921lXPjKo(LtJU)sE&4`NIvT@~=75 zFMfaFxCxzX6CoJ!Y-iF>K{MxqX)S|{eZDudo2J7bFa+v=cpBKF0y94lfgK1A>;~CA z=cNN?R0niFh+Y`bQ4tLEr)LX#ro7WKZchi_r?kxBGjY3?V9EI;->#E<+YXt?k9%Mk z&jxdy1CMXoCR*7e%#I(VJXukRyG!RQJ*t+8h<4<=fqQn6LcIliN3e6_6IB&t9t8CV zPv$%jtne;x_>io*Lt(F@<;^`iCiN}aFqi0KmJ4~q&#uBCLgCcaI$*R-ZSh2VT9(); z4zl7*%1^^V2KUMd&M0le-7(kVrB_aHKey5Y&8>+0f`OSiK!$hh@5nvP$uhh%2Nb4e zO|_E70R|1Fp|;_DcJnDK59BAoe;uSEPEI4EdzQ7w-LCImhIf=GH!p@0blt61LxavN zEmbaM?9A3IO=qQOGW`|I(!0h={nD!^eVjFm1Uo%9)pEi1n_>A?3DrTtJ>y%G-+#SU zmE)Kfd^ii|Z{BnBp(r_G*|uscqlo>Cyi)fj4{z`&vk5^5Zi4P|R#!)2lotMQBG+@T zbJ2I+{jgRmhMz^*?WE_)DwniM1Ts9R1<8(gl3MNOcYGyE_2`Hmv0(B6jz^RZO#xpD zmCinNa7r!Y5sq|U(P-I0Ky{yF_dNUv#S_#aJBSuQ{(}dZg8`GoD%W9%3h{`F5Oj0* z^uO-7Nmhv{n_B*T`Q}YJ8`8=Ts2uqN1-0oFW6$#Fq@Mbt`M#sFH=aJOvbP34Y+nKt z=lfY89Gz7V-1Ot!Rw8sS6uX@mawF|Vn0PRS%3pDJ>1{z|;gEkaEb0_q5V9rkN9pKzm`;79uqZrgktuW7_XnUXWDiE$LgUP{oqH8n@^Ic z!{wZGk*gX3s!9>9YDw?%mywV>b#b=BQ&^6RJ8uOUZg*+N7iwKGur`+dfA-!6%C4)r z^StlgSKnV(s?xWN?|UdosUv~1;z7c=LtTwy3v6iPHi^@5r_mf+&n2N>US)Sj>nZh%!-vCRE!3i$pl0BRZn3l?V_-0R<``hypgA-+%9O@4K(` zN-lrVnbja%@7%9*_St9eefHUVpMBI48H1>RcI;rpHSL6#b8R`RSj`xxv7^x9+^|oc zAf!&%6FjGYN3@xr?l7VjNm~SAN+{9E)uhW*B&`+CQXEuqJU$QV#;7L<25XbO1ILt# z@Pazb#R**)X>oB%7X~88R$y=$Vr_6zoyFtPQ*9Zbjn0F_eQ*#~mXbz?ts_G0`!^#R zB$nDlgU)i|ev%L0o%d@ViSr}8{HfP?;4s}qY-^1Wx_bm{h3+1u7`l5LyuFy+bt$_a zz&<+{V2U3OfGK`B0CxCA223c1TO^^yEt2R$mW{V>5zvSg(VdP>QOy(}A~;ptLs14X zii9|W=QgV8Oa_5QL`Cx-WUvQuv4Zh=JNk%_w{leQyz~#y8C*3bTB>Y!I&Lh zwBx~fHsG+3lN8Ii8q*QumafvS$grzCUnB_JIHYj+u6&xgL;%`bnayBHMmAzGFB1W~ z0c_TzNaliKVgap^o*#Urx5j=vPG@&qd%SNlCkR zJLY9C-6wG6Iu?D zVH6EHOhWQnm*LzsMmz|gx);hvWuXp2L!h_EcN@_pc)*5}s1`{JLG`XoaZ`#gANb6Y z+OSpxGh{F%bvZAw&Su5&P1~#}ZrI$keA>!sQ=?a*vr*_-P;W>@u|AoqIYrz>&e%}I zpSi0hNIL&h)|!mWX#YEaK?e03R%rY5a1T)|NtD#J`zWI(g4j9p^T&0<2`OOkDY`1< zpz`<>k58->u(xZSBADxWmkcT9gs>=lnGZ-0IqnLg{3usZ8AE7ZR;}H>k;pz%XELV= z+rEnLC?+??mVD|-Hq^p6SAMRG1 zP}F5qLCb&pV{&=HpW>R6U|b7msi@k@aa_Ns@5l6uu6$I#@YA$@(F~91m*w|i{esX# z`ek);P`@~;4(Jzr@7J%%o7h2z3EfT^dTDypiw%Le_cV~?CqI9-pd-fPc3=x>cQ;co zyPc2cM}Jf@qYY%P#3eRplWZat-C3$&c*VPR9r_=)@4$@Ig8@&gdg$8*?EBM8#=&~| z`7b=jUSjK;yO(8GEUrL_+j=Z<8@;R~u6)s{N%`@tm*07=y_7_mb1ciQm`u5Y$c`TD zcNUyoq>+>6|DsbYJY&6l>ldHfSfZ+o@Sk~hWEAbtV~ZrIqz8mSM7@^X@kQ<+G*dE7 z6eF_=Msb_bya?Hh#n!EKHoMYs9hhhp7X#WHwsE72+EaIi&Pw4xiA~6JWinAS$_H-~ z*H+Vy$!>j)w{stfvnrOd@Lu*Pww@*XMkhUIwEoosmyHT*6;$-e4HPI`6^4M8YGbdi1JoSI+WuP zO@XH2JhP0vOg}wJ?}eH(fW9h#+sIkq&W{1T&x(Zd(hD?!DMoO90PtSNSu+4u>Eg4R zK`}^I7v>-(pe!q6m5WJqQV275 za8%h#-vU@r?M%8Uf5`LDDFL4OCtnw`E}+CqrT?SFao7E|x1iKt_B^5(Q9JveGO>NQ zHryT6x{{cfH1vIx)IX?6?~h+qLz9crcm0s%0a3C-(x(ucDTN$;TjEd9gu!QZrU=eD zpW-oy^7ri^)C})Jo^9F48aGSQFOTpH73^N*P9lBw5U-@W{}*faB%5Qqcz%%IZV(4x zCu_r9^(g7;CT3&bN5iWOX)=&hI+7*Baa6NmW$*au2TqXLL-l^h609tRH++e(vT2!^ zLt+&nA|td5KG6w1(?9VVPid1{(nfqPYolH}afiozsTb?IWh)f2O0x3RI)V~w1BqHn ztPL{jZ~D7=z?D83EztK2m?L?Gvcr(BLzpA(csAy)1|y7rBy+!M+mzjGgZ$vLDh9>( zfZpB>>n|%X?*^-*^sTQGg$@csv_@_eUG}DbdOhvHThnTf*@zsPDEC$zU+;Q9PdV+B zajc8XZQK;LoBrz0fvP0^>QC{yp%#-1L$2ZG?K~l4F=?3$Uzf+><2MhI%Zg+ekW=#+ zG0xkB^^2|$gGNwTI8OFC5Xzo@MDT+y9bz?Y)Uq2}Ix$QhZk&E`fnZbjcL$PIf?vbO zURDsSjja2-v1=V8Dlh%B+tj@yHGPv$vg7+bnp+R?s^(uy-)VEO-CD&hd&^_k&tr#w zk7qo|+~BVo3N68u&kIzfTumVVyjeSqA*0VN0t}?_Nq+NBzwZyf#xR`FJz|li&K&bH z>La}*O;*gP^5!`@iESx;r`4UYXz3#KD6f;WR@NUyJ!){cHg!N)z!Pv7pasAx(myZ< zq}zX%s=!yH?%b2teQCqnvLBmE1)~sVWo$(*7Q$&~s!*@&_Zsb$DXJ{G99wQA<)zS@ z`{Q&{&PYJ#iV`6==@+iDMk&i$XEMhms-9-S^(5?@f##1W$dW@PQ+9}wm!DL5l5(yQ zAermbp=n0dhEHx6@~6hlM1I~Rxa1uHGu9)ON%CMl&0{D{R21-YhJv1gwE_+67y-L$ zNi&Xx;)Gkw^zJ72>8ws}^0j1!U~_;qEG2G?lnO+dcs?mwWZ+>tng`eG<7-tMr){~& z?d~)%-{i$(6p01ZyC*1aR?&SpcTntEpD2d}nhNoM={w-te410|l9=kr5L87q8Lp9b za{VdUHR29jN@gKGcy(PxWM1{`L?*)#hT;766g2P}qVy|D*fi^*2KkU-Q%{hCl=D4I z=pQ>XO~-V0l=;wXjDzJZ&Y^MGHc+LTFuZ4OwkXQ`^bQSV{J@%rua_a%kglmPM=yYn zl6-?1m1cDvt`Hio(s^6pQ`nHIrkUaLlJ0kN|MCKU5A}e~&=zMixsNW)uL!Ubd|6uB zKxWdm?o~lYE_=Oa$b!iK?iII2`572kEFi(a$#`@Nx~ZkVzEDJw`J0MM1aPJT_w=@g z+eMuDaeyEJ|K`gP{@?pC!@tJu!Pn5hb49tjR!YM#k6oy-_0fm2qX(R0rtTif|Z$*NTwMbSPqUM}zlt!8bKK=Zkn*0N6pL= z@BA6>+yPJYDpl@)k+v}q&rVS7QUb-_0USo?E%9df=5G4#ABiXQ%TJXsrk zsK(sIR8Oz#iVD`t)Dzy&U9P4|(Df=WX`1`6_{I(g%94TKTkMwbpfodV9vgF$ml%gl zUSe=2_)aNl_WadjQTnmfToKcr@7LAtf5jDM{EG*li1Nd_^BXq^yVn?(k=RHV8^p@4 z{}ua#FaYN}KFBx6^vy?X`dQZ$EdoD3wop*;l@_o>Ih_$7U-;6S!cWKR0>_S55-%;jC(k3IThr721H;xDY7)N_V&_y-msIa*bOwtCm=clZ9 zS8_FOw?M%;-SWtw@wHLZ0Kv?HVUgfK#1o8U%_Lh8W$J|50#nkFa?TxG$CnnGIYKFZI4QvAL6qjsDpfBVrl-3Q!^%Zy~_*y zB{7}n$g|l`43hwW)nhSxEA?~CX7DSPZ6GGjzAZe(92bqM9hkiqE4b4B7U1^hHN})FL-O zv+yxES6*261s6_WMhI;&vVmZCucb%}zTYlSk=B(LPHS)X9Y5*y5D`^p+N=y8Wme%c zA3?6|0qpdBCJR}H2GOvxqiD##5;c1G6T%#NaD#9EnVg*Y@&0%ivFD$5cFJShRUvpxoq!C+MjEAva)%LOtY44uMt-D|Gvk|qPTe?7dw zDIR?og(|(yfi9lVKQYoS7^z6BiQHpC(gqnl*(oK$Hk|caKmm(%T|caV0-NXXIAnIP zb8y<@q~n%sGFjH+UFykqe%1pBc-4K~{pRb|6~1mCRUfCR05JiqM6p&OcE%*FT*%OHhznxP>d+z{CaV>PD_` z5)&Gvt82M}Oi=`MrPv}I$s7DiK}Wcm*ZCDeNn*}%zgoo=?tsj%6vo7oguo`%GR74O z5wnA?6iI`>g9$=cb*@;_inptC0galF=ZzxL!-PC@d7*?%{#8Y1*rAI;XV|5SHk|=I zvt!T)3R(J~vW%ks6}oLuJh4($LO9CfC3`)VqkL2rY7&bQ5Y&VGvr_r+1uxWd=qf~& zFxV=6cTv1-p4Mfpd*(jz{wxWSi@Abq+*(aZ!jgu&m*Pd97BZCsbPyc2`rxVL)*5B+ zmYk8bK`cm#w}ul0uB1D`GG-Z-A(Lya|Qg&TAY$$ie11@jJgjamZHJ($iBH z-G%s`z`kUgtJCp_LvK!eN~hd$aJTKN{?a4w{wn*bf3mSavr@#S7pXAekoJY_Q-;KC z{l73HfXXH(cpgeTqbZqPY?{$^ZPU4j&uS(oJ2F|qYh^Hcmlig$tmXP}qiC31(3gCq zcXVR-EmUf$t!@9W;WdO56ZKxI2~r1K6LIZRnn>=tEfzu@-EPVk@GC?N9>I(uk$?sR zLs4X}8I5Tq01QSVM%sH#@x*n*!9 z2NWHmnT9H$F;>Tnpshq?;8BonFm;eNW&YxTx@xRIKFUvphN-f>v{FBHK`^rpEVSx8R;J^Q&$0dgJ`MVaV zM=j6~#Iqw0#{%s8;{y1x5_pb;;E-$A7L3NmIswm8u?_e=mjJ)C4S1HjRoJ1I06TcT z9PEcLfxS2#{ZI+JpN=lXV~b8_osQmtKM2rogB@T3=0g5xC~%F_lRN4_YBm@c`BdCo zTzMuEZ!8hbat?edZcQ{}raD19RTSlSe&yz?qgdt2Iq-||0+8t(z9Md(IZv78DEgFY zMW1Lz1!iSG0S~E>v#^V6@T;-=6tQvgCWJsJ-Y0}P*%jWO;{KjcCPlywD=Hik?SMWD z`AlS<8CO(PUeJzkR6WNWH03)Vd!$8WXpw+)t1=T&QmqjWDcOoZm?@D1D_lnlpokS*4j(!(8$|A~{@M>j~|7`Xjo%Oz0`@3OG3u@`o zF#_9tJqp7pA-2`9hfi-&(Nt(Ab-TNRyLbAi!raIiwXh0t12trRwUR3~5ia#BiOuEG z8|}?OuGq2H>sNKIn5DyXcJytnsqMJRVQM?6@~o-NHZ{v&Kp#xEL>cWk%RzKZa<__6 zY~t4RCLs)sx47IX7V0ZEMKDHT7+9>A!(b*6VT2j7oP~GqZ-Kp6B69zo!;V*9uxlp^U#mhhdhmvy?%vy2k<}y?>Kqn?%Y=8)$63dLV`ao%AxJS{ z;=m&w52dksx;wSHR&PpPFN)oqr@J$|n?79bv6#>4?w9J!)tuQOpLS8>e_9+5-5)Eo z;vn(T-K(N_;&T7gNsjyQS?HJZMOuw-T9MzmWjLDG!e;{I{V_#n1#*{v& z!$*k-Bh^yMCBgXuwLjNJIXpv32Myb#dVy9vwMFmh80+jB?y+3Q?KU)_Q zDQ7mreuq@fSZ?gCbp)Paw%i>YkSoTv3MX0FDgTx(dvV4Dpwebv0TfTPqeh?fQ;ZaT{aPS4NZ%NTYNp>i4jU>c-Q<63XzVVi>7dKlU3^xXyaeXp8+{fPV;kXY{@A~EvPd?03KMdM zPLRR`6@e1AWQK%dF;uq6dk?mw+5d|D=VCZg#KCYJ&NotvqB!#ZDMO}lAJxjVC8#Lw zp{RaVIq;-&AR9kKd{~Wk)#QTgUK<%@Ga9<3M>$b#knf5d{#j|x>ymG$P|R1piIa zjAy+iU_BET`v|E#XB|!}4BqfMp&cBNvCUjyOWSfFZP{}*XDBp?SA}-bb z?%HsI zB7pq-TV?lU(O{xl$qx({wBp+ryeSTa?=*cNZNdf;m$>uBm-d@m^V8d(d-FD=WHOz3 z4@Ubn`QBe=o>R)ZOVJ9-O2jI$$7K-fvysUC&(^6TI5c%BgDWd^R+QC|4%#F&DjPOZ zs16Zsj7D5^JRfLVuqMwM*4`45c^CjqQ9*(kevkrct;jwy$#MjT9Hy%KXUky zrpHKncFGT|KA53H1{_?cBtT)dRw@vmt)UN#h1ewh!GcgE%Lr8O$l64BY>cgDZ6 zyco#rw8U~;!L5v=p=Z3Cp8N$(AD2)S@3kfyX@@e79?oQC9Pb9hF(p z$>$fx-JTiyU@HlUNlPswd`q1#A@W^^a2xLY@@J#;?W~TqW;7)gTW+R{!DcmrmsQ7p zy}wuQ@43O>7aeH1u}bgPXTQ%#p5J*iNX?T|w(7imNuMmu-@IkGD;bSOYonUhEDz?) znNNKe!?W^WHkpZ{{L7INVdBjh=i!__OJKty)?F;o|Y@% zso?hC%dg0!$RvSv@{9<9M$AmawON-~%^QIL({W*n`s7H>kCdH!bRUHJ!|8jkDLaYp zw$jNX^o$j<`g^q1$>X7uLBqeOwnLA|Dr{XL$?&u2gANsT+WN+4oVMJl@%6Lse6$-H zT99WN-olT*Iy&=ZNQL~oBAZhxr(QmxGG27uKc;e2rjce{sx}hKP;RX`IpNYXa-vU0 zPFzDymVBDH6t-Bf81k>I6o{~moTeCx$L7jwF=ajqL!nY!1Ufm$@=f{SYC%8#m%AB>N!jeIf zKwmNmv_NtBb>-&$#v?TesMsFJ2hhW9MLbEe=>W%UB&OAeQjaERI+;-3$pmTHRXG zDD=9!v{dh?VeGaU(w5m4i`U6cqGQms*4)Wpv#-EvJ8VWrw^ma#P>Dqis*1H*Z9@A2 zDx|echyn}S@=g^or0mdd08J$Td@CT!l5dOi2>YA?>6_1hgQyQ3FG~s4Ps?6jo`(8@ z>H2VKx;ASuhP_Kn*EVEP*ssv7bc~m?R?Fq|_RXFF>&QdZ)okYl;o+9Wk|pO0Xwb%* zS7rhkwUU+>n=r^M+BM-+!Xm4@!A?i;_2sT=bo}bHLBYm z#uq!cc!ZIbhX7C+qRw`1V(w*~z)E~mY3G)QG}yW2A=Pun&`HjPeDU{L*}12&2@5LP z!dGjKiz@RTE$rNf=!ERt2Mas*5m`sg>Uz)~&9ZZUq_A^O*BUq}WSzD5n0S`F~gfZMs_($4+&7?*2qv_7k1n??JJvON34(smuYJz95@mX*4mf4z9Ot7Y8o z&i}T!+h)-&-|bVTqt>VWB+8{l=ImLvZedfl?vI$Q8yarex(^0hH)d@UD44!XpkUuN zry6lfllmIV7~C_iJxiTLT(^;aK~at12dzY> zhCjcE^-T0nk&(YeBrHzGM_yRDHSlv-xpDHftX_ON&$dCNwSB=%+|R9T8_5n@I?yLZun!S)V_CKx&XYQ)?|?|dr2nYjX)*o1ufp(Kg-g)xWK0;USOcvoHVt!v8 zlh{#x0{rbZBiNv|Y~6A(p$teZaAy;0fo7bbIB-rQlRW709g2n2FU;Kn%+1|>m!i-< z)%?%dZI_t0qr6=qxb$;Bcyb<`+!;x9arT&YG-YeLFHQ2qT8E2Z*Dgm74BAdje-(0& zUE8E8I?&}!*Vrd9T|YUNEWW?%EnROW{$ncS%d@Bpc9Dpw>yQVS?`?MJXRz7*Z{PJ|ugVsz)0Moo|FjR23N0+t@QiYr;>2<{*Z=C?=n!DKCeJ49d`eOYR)PIfS1;xDxFWUYy! z;>r24r4Q$CE8mpgIQ^r4hXBJ`(_jw;Nv~Mq8aXK@TOQM9P@WYj!VO$)X6)X>Hx%TA zv36LRq4iq!xLy2evly$w0rqcrH?|r0v{%gj49CESHfC?jk`HZfEX(>EeU+xQ{87}l zkkm}_!(RtYF=*NtHI{mPcNmIV*LS`EX!00ML&}byZg9Ghn)ki=XVjhi?Si9E!xeFy z3D|O2HXAIh>)T&gSbpWFm4?3s3)@kFN3hfyL-B+|a;rh2ak}jVfT6kE$tGLg zfoL>ZI`Du@Qh`vCLJl$hMks`fD^LiPJi)EndS9c9FtRS??^8dF1ww$dKDw#w$1UHF zeh|%1KWra71b<0Ca7kG|hUmva^&`BmejF?M@muQ0ppVCBF&>-Be%$!|=?C@~W7&?`Hzx-q`B8x~ z04NT^h604;etpdg4#M&(2prjw(b8zUl=BV`UW#wpu6o=L)j=A0z(P zxWXYBH%QuUY3ud#ohK^8@~f|JTu}uk6EI&YfPn)R@n7Q5WCl$^^Q)c>AS}kjPGw4! zSrb&HqtgEiq~-fLLlEiRM=}`#a&KzvKKVa9|FfH{0jX zc2KTtfnv#a*okDI?3e+R1(E_$V=@2rJBA2`wF%v?#-1%ms%TzdWi7BQyC2cH2G;uo z)^Hn!2w{_E3x)=pOFCg_$@9ZdqXo)h`E*baBJ8W$fOW+ND@sK`eb8Oa^~+=!(N?!D zGJ~k7NtYF^il-^E$W>9(A6s2iJV_C~UPa9(Y&uktNK238u9$jMYKV@Ib=@1=l4X96(Z{T*dmIUNrQZYf z*rIihgBM=n_t5)L1iP`YD>fSRqqvHcv8C(PSk@7=&u=WOjVM#|q#JTgk8JidFmssp zne}Mk*efYjik%|ge51Xgzz^xD8Cz?0oTb0P;i{OHiZ6TpOUC{gzl^u&oIn|+fQ1~hzkj}EvP}#u(D1#zscGs@>kz& zH?O?gG{@fjKipuQ=-!sa_pn~*$=M3&$B5+IJ$0JW{s6Clkg7hOK2_)KB+ptkX zjdnqVG^wibt+MYsh7 ztab~?y0Rf+c2OZ&xaU`2clS_@HbhU&F%1VBeIYU20~SA>{?_n7Hk$RjW%uk?zk<1F zCD0;7mhyvZUv^2@vX;)gjEZZorC*F#)+0`1x3E@hJsQfpSJ=idyJMk)ye!s8`CtJJ z@CMt2Byzdq5b@BN2U*_6JlGzn7~X)dLeLGA2K zd2?8j$g=Xo)W7=d8vLT=8H4tV)mV{@;%p8P=@}Vx-BY&Q3C;V(iQ0TO9>hFGe z?VeZFeom#;wJqywKjo!gSYLZRB{ufIj-Q^ZBc#)KybU1uxfe*g^KbpI9|>vHL&{zU z$3P-t@1MRB<^R_c(=?%(COtktYX%weV{LR}lS~b&>Q?thwGNle_nqfUnJM+z{$?Wv zF@#b%zK~QInVE#3eAf&w{wOa#jk#x17rXg1{oD;US_o!IQix=;D&Rk`X?5;fo?oqc zX#I9|MAD47p|w%gU^AYzH>h49hOij7swqD=)1WwC>@>jXz|E1oU-F}^Mo1OI9V6P$ zf!?t~I9>YWat@w?pDud?8T>5Zbn? zpKMrifgi~QXowBerCgxSZfz*irs^kN!rP2I(%VE7#eNGi0bIqJAbSa`ZjA62twh=I z^%^|_t=pM%B*37CMw~(Ytu0LqreaRD37;_%^8Ic`pi?J^LimP$vCt}L+`uKJrbSZ=IdlMpJP^7we={66l$4+^RjzthZ#y74{HUlvFk(2H} zzSi%fRc-JRNhC$4u+*BXqfPX+FB>z)UK?!?nb|IS^-hd0hZM4lF~T`2QH~r*FW7|6 zDJKHLE$R~TMIttTQJWSyN0W00b!0B+U_xW!=t;lUEjiANB^8SR28BC1k$i7LgO5oK zoooN1TECq`-BsD`C8UorWAKwUd&NJL@NLtfKIHvcCj5R5zk}PB+%Oa)5(c*Azs_Vx zpA@_#EkJVs8)-~u6CM?~xQ%BPmYeRpnNCHDE)r(J2!3UHli8*;Y zp4PR|HnDX#UsL{%ObQ8U=1DO6^rO||pyfn29iNdp8K;koXvns;Y>3c-?%byX9*;8K zy0}+3n$`tM^brw(775<;-@nS_vCykHq1CIPa(FlFRtVoS$l z?}f)+{aN)8z4i>hm1ZhElxa8gFrM8zh0;`d_wWLTO3I8GU!hs?#1Rhgn^r@>e3Y>z zCRBZvsL{+Mzco1?`AaVXbZkpCAxEBbp@ZgL6wHh@SeiHtP$=HQyTuDo4Fh)gmV&vHQ~B%$)#^C9V?A1vx`` zJYiYhXY-r-D@1)N8Lo5SitQW9g~{VxO%fFK@LJhd5%3)7Fa#VI3pfIfsaPTaD20G< z(lDJe1layY0;361bhm3~Om}P3hE@HMuM4;Hs#@$!VzG)fac;;JX(e#KWkWZw>d_O8 zNlqi1Pw=gn=On2TjwO!I(5oh?rywD9U{Vy}9e7eR1h^5sPibc8qFW zpon%)7qY_og=XXQXC&&a$1}#p${s=B8f7uD^X_!w+SoRnBiuGB%J-rcu#JMcT@Kk+ zBJJuhSREVlgOzGDsDJhIVl)Oj{i|Qn;P$2eumWXN-8Di^UG5Y#49$l=7_9f1PSiGP z!rc+7`|hp6HJJ!<-x~}5*`f|GQb{jLskrw z3A5xV<42FLqNGbUS&o>(zzj@~-yn~<41&M5#g264q+}^YLbXIBBe{+K<6CZOj)5>y zBsDeij4AdU0#-ddt6zG4M!!(Q>6(v)Po6y{hta|ZiBr+XI!DH{(J4Q6PxZ)Zp*nqZ zvpUYow%;Vtr4yEvud0UQLWMEbUz@K+Oy+BQ7(V~>TSJX2b+g`F zlwJAo-Hlpy<;G<@Ha;CaxbcCvZr`zMYI?HvmPV#mB92MJ_U@)fpsa0KjhfE0hniPz zy#FCSeEO;H{?ph0_Tx{#<-P|uP8Ofv|6udVo5YOqL?(W@@_&1n-tl#|=(N%mR4)E(6R(v?dP@VF0MDez*h4X~wz2{=Z5! zuxwT;L)E232J0xHtzXLzIGW%GvcIMzd$22HWc}&qu`uYlkZ#sBtVvJ=U2W2BZtsUy zu2Zcb^CfS%n`6?!+-KG88t0=om<+9n+q{We`6*Zl&=?E0PQyMN&F4)z`*5?~TyE?W z&A~pr!uZf>T)&AxWLTa(`z+?Oz&_~R%bk6eR@rCivt}Q*T4pQ6J}XpXBQo|`3YEhn zjhALiVH)_caV3aciUo_cRHN7$@=`BoBuhqWH0j(jSXqqLVEt~HL3oEF0EbuIrVP%k4VS!Ud^vPh{uZ4ehRfDnuZ@6kwvx{QsL6scud{kln#p zaZbAUks3EMK7R)r9T3kzEc^7U8{##UqGBZ~me-2HK-6i#(wf6VzA#LYRvu^p7b_yH!*$tgW;JB|_Rt+o`fF z>u#(Z$d+ZkzbDhN>)Fa|N!IN`!3GIIz-CsUSmJ}U#G6`@|J`|OO0R3SS&|Wm-|JU( zf0>pI3^;5RrSkgnjm3KB!!&1f6VEOT&{<>v!9 zyee?0LEzX`-Cq{6;n%}8e(|PrvhNWUUz#-$edHF@#g$ApOYue`5sb;F^xF@qa~ek| zvM*WWp}Rz(+psgnVaVSZva2mp*0V)n_$?sN$CUoaP!4IWV$ws#XMQEO3UrD$LC<87 zL-xta&lS3*h&O!4qC;|ysp15z#lCeO1QCpGyRwWE zB%?{V4SuvUMw`WHPP_0#O8i_?QgEzX`hl9Yld4sA6p)yzI9eR)?K47+?-C>;S*4|e zWL4T+LVdB)gURi!9_&zgb`JnZJt#L2+n8~)LpN-UcqA59M*<70ujJ0^$r4MD1xHy9 zkp$ZX_E4EHnq%1lv<}pT(oH-qlVvrZY)!()_Qdrvu9n92GKG5aPO*vTp#`;389&pl z&7LCD6~eAz7EkwI#vCuK<&FL&{AZ` za!;;zng7vkFo|MtNuOTqOD`0|dUGfn&`;1a`*nr7$$KNOS&_c?W|U63m{~;WE!=b} z^fnh#SZFU$0mZG^&#Ce za*9yR;0mn#e8C^8u`gCMSPXI687CnzWGJ-AW@TC&vH7sdbef+Brkfc*11Vmdku?yw1<4~&gK}-QN$gXMAIH^EE4X) z{sKu_q{f@KP-B0#h~tz8apEi%b{AN%2p`E|w=kKYs*#MNv<4VLK3vErxH6dP9jty$ zt4p{9ed-bT$A{;zEmd(V5~#TpB&=Zhs#b-S;K$5CBpcy6#kPY}i0GSXEG;-Jt2#iG;4giHnSkq1l5N}`tN}&dQCm(oY5n7Qx z)T>SMjGD@jEwsrT$Kf*L%OOtXDV#%0>2YFxI+xeWQ$SkT5{qXmbJ&WFQ##bL(l zv)N2!*MLyKH5ZIlsk!7Z)jUkiqI_qsfs(zzaFxA! zbJ#1iQ1VzW^wgghT!xTtu@^2q$AMB2`*kMNwQ8!1KZD$W;#3Y?c~zmXh#v ziBxbC_-N-QmNZW9P(Kdk#%SOzedzY_2x1;Ac#AD?HCSvw+YtIP$Qx4=-y!n1G?_%< zt-+FWDV1#*Zw-pK1{r7PE-4>yF|{EHm{PjhSxK&E+R6_<$*$mUE{a?UpgXqOSLV3< zw|SJ0=KJ-=k)Iy0SBNBmJK5Dl3`q~O29~Yg|Nd=ZKKX+!%<^fMxg9ZiJ(n%a-!>1y zzsN1jhue~GL6pVPL$eTSo7^edC+w>Sou6hlQA@J=ymNB?U<2bp(sn0*k!+DN*D29Yyei5G;Mr z?c5y4*zKErlnQl?cC=tp#nvqoPP8_9C7yDAHjt$irym9aMfNpxpb@!oHCynu62iMl znh)`iWA@||OilX1UCftVp*f6}W&NdP2 zl0Y;2b^zIo!`{KE06l!W-@JMBP-k2WdIxp#g)D%)JV{X&a9-HK3z^@=guTXZ-m7#< z_9ob(tM;alwaJUpK;$Q+Dw3$gw@}1?gfU%iiE)02%(#XhJHCx{{E)9?13!aTM?b_5SwUCv(|>iOG_FLO$_9g(KeF-Z z%C(yyRf^s!_k$H80&?xZYjm-Q zg>JL41%nYGby^@}bJK@b8TDYcuw5!%pW+{6(B?<~-LS&zW1EjZ_g1WWqh_kdFq=hk zq-O(aM5ZLXeXO7Xn^mg(U_G7V&cbeh?K=wY< zM%iB$>*_C#mC#=?rus{$PuA=GbwI4YT9>m5Z&-+?)uT0z*5L#6(rQthdr?_`s7!Vi z?_Iz54!2ILcij!@gz*_eLeN?xHP|*%w&|f9sils?&W+&;@Md6p4pTSCtuljtkQ1HZ z1iM{~lui@{?$&@2+A6&C`)ic}lOz#-7|PJ4y4q4|?n;+vLtPS)N;-7mxd;R~&BnaC zAxMT2wV@GBTD>Ofze1m>0bkJP1b|?-NgGKr!B@h2LhA}~04k+_x6MHQkyT_p9`P+m zc3WF!MVqo*@*ks?@DWWGRi~k9{NP59X{7-=#W$^yOSCP=`PAehFpbLiI+`tjKvj|M ztRX6f%yZhUHp;g;9K#yafmzw8mJ;k%)6BzelTqzflNky~xyL8I zTP?MhZMT||#%i~kURGRC^=03!mQ;4DDSe0btRRIXAw~o60(bVmEFB(?YvF%MSFKhr zE~>vhy6AFVfFzplS2AGtf+ zddzS2R&IULZw*#%eZp_0m0L%-mE*0W{@Ojin8$Bw5}TJ0zAyiIg6*31nu`8Xl)nXu zp%_)a_Y}XM@=8lkj@9yhHc@HX+!(E|Stm}Pv2IAutlT_TQ{Uv2tK2;6H=)VO&C`BU z%+adzu-{aYkJinj-Vn>%%FW09rnonYUtT-Lhe$u|+y%AV@{>g+kPznZD6C@C8^aoT zgq0BerS03wH^x^GKOa{~A5q*!@=RmQO4=M4T&3&-(grHq#}uX&!eR=xwMp`pg172c zJsaMDs@a9mU@pf5Z!cQ~u&Z`O88_2Qd(s3PacqpIQ~nz+^&egWoP(qOPSF5z0r=r1 zV_nGxnyCS7bUji>oXeYaWH=Z?slybSbqyRGje9(wz&VV{yd zq8nb3VHhf)y#d_Q__`(`yQp3k(W$2( zRWLQBD^MN?g9BQtgCkXl$9bh<4K<%>0->~0geK{Eo0H?MPL8+erefr}H_FOK>Pjb2 zZo?kwpIpsr;BZZom4o(@6KT)3uuTToU@nDSk8gZ=BnLl%;vq)qd$=j`5C0A7mhBa+ zKG4wM)1!ad_uV4Zj3JaFD0r>+D4O)%N2J-M-ct^}$8lTjy`{;g-m>@56W*k-kTL}- zP-R!3N>e*4RB20~0#|tax1eGT1fPsmMcc+ZG_07JHkOVj@)IxxJKBvJ_czstHp;UH zvx%G`MDh%#-$^|F`cgKiyrJDHZTvM5dLl7U{Q`A4PV*m(_1!o@R7039LY!6%wb&KUvfF}L_7gG zSL-&o!)&W;A4s@D3XnymA_c@cE(NqF0ban!q^Xe7xZhaCP?jIFd7|>MSl&M#^mlu0 z6LSX@;n~TMa^U+blLVVsBDt^MIhHIWX<(v_88evX5=?V7r3%!U!#lpdRr_b7{NmTX z3Jay5{fXtR+pJ4-ZgK+6*S0nnZLHnbT)bXomI%7}>6?{3*vgZSQ}(kslF6^LD`9<- zp$acrpDZ=Zk_28WNN!K?LoFLB->s|EH=Zrp$d*)v=(K@UK(Sa*P;EOD!pr`Hn49+-%yW3OM-lJ1=a>rl@3kwMaXK@+oQLCEvL)$1T2Va{7to%SEAlez-Su752NFLx`7CUe3Mcw-fIh!9na?Z$QTRCJZF9=}=W~Q(bka#*_-iVdh9A z5R4H+E$S0ChBCw6dv}x6ljQqH_sIK@j(IP3SzyK5cSbNHpHBzaPwAIA=!AYT6I$P- z@z}x*B4WEtb%V@$u%kD#I$m>LVsV>T<|gm`QzHWRPRlt$;V#1AVx$n@_U4ORo{EUS z4x&D?K~S@`KUWpH^D8g6&W=|)dsVBmYi4&g*+w@(F`JgU1kQpj?D`2k#k^@frN=L5 zPublS#`*6_XlPr{G#EY{Y-lffJCKh_2}k&ry?fis)nD#}-u}r39&ywA;4i({JX#SknOS(`??G_p<#jA8)9Fapicn0lU|)*dESax;e#6MYJqwFvFr$#M-fkaz4R*bfsLYy|J7e(HQ zDc^6LCoXx%0!P`wTGOS~IN{RbHr|I6WHaXlEP6;wD;V)G%skik2aR~RHuUPw$(IQ) zl=wTzUonj6LOgNr-D2GIJvvuL8n`+LEQZpjCXf{3Q`Yw}>wAtIjy=pDSjOX90&7s* zq#bOt`Gcxhv$S}@+U>wIaOt4KcWo5@m;Uz48Y`c}h}j@bhe5J=K?t|u(})=-BS8fz zK%-=;8*UUZV4Fkc8et5F@}+k+Yg>sZWM3bqku7;cF_66qa88s0)nYR_jDY|FR+Yqa zB1$yq19{KgB7}um4``m%UAB;kh&S8~^FzsvQIpk+?N~KPrMqckz~Vcfehb3MF;?A! zx1=I)-XIBBz41_kOmaPWlr6T+d0XiMTMNS`pyiD39hw2eB$RDKkmkp!8s=+^GJV-% z?bKWRAV4B2pk5QE24NT7TnKH9YIezBM=9ip7i67;?;>c4&esWnU2=0U29X4qfvxd6 z=BkWchS1!SH{8QZ>LXxHvuvdUU8)B|1lMHX64ff74U3}XmSB?s+G)w%HK|WQ%%_Jn z<0t_%^T#6F>$s@HUPt1w8)JHJ5*5SxK*P3IYgxARA(RNVIxd=XtK%ZJI>r;gz69tO zm0KO-yUF>twb|v!djmXAJ@;jc9&GYKY?~{*APnp2v!Ly>Ah`nCq@OpGAyUU?-3G0`@ zs57r-`w{;%O}B2fikh~iU`+yVnx{zV&)m%AjAfL0&-eEP@w1nSXq527at90W(~Aj5 zs=5?ot>v_px8IiIAuLWmsO6Y0NVoEX6T}IG(oXdsoFFdC9LK3BlfxcnP#v)1F@0qU z7ApY5C}g?zne;_$DVa{biSq_x^uNgyfIDpZE7Y& zA4KTp`jOiKANU6US*ITiY-sm$zIv^{dQJK2#GJ3*@n)ZSmYAUP>kIvH!KT+!e}KC--hlehLfJh0lM5 z|I7i(*&)J$xSfbtw>aw5ctQZq%A+Q*(qpsVYtA z&o#{jTd{LcVtg^AG)K3x=B9L8u@AdYkE*{dbj=0-;(W>LSWY{{H6R8>22B11fYHuMtlyT zaubt>xCWaT{^9-G_}&I2A@*59BgvyIesTc9i=g&vwxr)kYgGH9wa*jsnvO) zJD4T)nz?q9yiap&m%4tiMmStP`R9*7>58U`(hvTa@Jvw+2tu^1Scs6*X- zT1i53gsa$~HAquMe-g4iH|rvosc(wN&b8HZy8SFy0~pg zz6PZ8Lky3(`j+Gm>1jmF?Lhv?w;L-XU!MBJBdqmtxfZF|Fp`r0XoK*vI=MssA}igc zoJe3*8{`N|!m4Ek5tT?ZlKDOIjEqC22HX-k5rMAY)FpvamvrRRp}rsiVxt!A4h8m- zQR5b)CMAi>!<&)z1%6p90Tl~lhJvnImu*c=yw7&YGcZy&;CR#MK(UXDu0zU^Kp{&I zJQ9l}AQ*J&z#Q70zWvou8R5^j*-K;ga%?1G-CTh9%PqoTgi?{FegiB{kOu^L71sQ+ z+Vrn~LiaW(t__w^G@qs_8Mim6$Cc){$_P5mMj-6=O548o_rxkAe4U1`RVyaX1jCzTuO7!dPD)N%C#Inp2A<)ziOXqV z5@rm9aj&7q*y8f+Eao$orkw#S?LO(yE3mXK*xza2d}ag*Mp)9meS?ObwpJ(5v(b>}6p!S2K5qmC9M`x!nGJ== zji;L~`}CGMo|ZFcew>LNd$aidI7dwB_b8Gxf+43_s7LuR{t|ATAH@dzF`_f{p3%=n zGf5^=8_e;mC=k*b$YPgl#6!!V2}w(3__PvX6!>X%k1z^+zAC}R7%EkQi{T%Y7}iZR zY4|4PH%7m_W-;W9mMBaXgjE1IaCS8AyT9)(xV5vb&AKaX>dM;aR82id&qF^x5gn^F zJ=41=qw_ySDn#r^StxIK4G$&RP52KnxjI?b9KszzVZ2FrvW~d=||Nm@i z2BLs=b>uiEi6+8o2dI-F7#X)y?2S(_LhwV)TxbJ=)fMX26mP8wDYXndtm9``R7Q&% z{H=-NtxY<5*52CWZ%yz+A6QypKbFdRswQYw<9;#!8eSMc6DH)1(6cTbPve_S04Kig z>gZ1_FqhUgwOX^b7h2U=))f9fN9|T`->iE3LcL))0L@__!INWGY(?Vr8drAG!(5Ha zOswubL;L-++9$Zl`W4y-yrO+=ChCtTY~1rvg?tRzNh;(uBK`pBGZ!R8m|hkIB7!Pv zaluwWAookFofbGUC(Y3$1jrYFGmf6ePsVfsD&~oiX8?zYuL2`l8&8H7s6&7(~sQ>GxYJ(>^aaJ%LWeI*Bs5pZozFey77Lp zQu0%~kJVFSkP0jwk;8EO+Ypb)eT(lKRB#{JTRrG#FdKas&e4R`Eoscg6_JgkG0uSY z8`{`_V_Gi(_dbOYN#`Lj%`}J+S1A^lj*-9ZbA|eW;DTAQQE^+8jk!*t_!WkF`mgm? z-NSil&5V^r^Q>n2jC!R)r0@NYh^Rqfu3>R{*`P}i23L~8g1lg%&LSuv-e$e-Tt`tz zw7dzmsg`s(K~|)Iktf@{^8TuDS!J>%Ti8iDfC32?P$0nq3YflfA}=E4hNiksm9qh> zCApqcNH5L1;#c7zhmPt9Xqaa2Y>LKq&z6EK!d)v8d!nGfdHcf)wr4 zl&puP;M^35e)>G|QV%2zz~{1 z3N!_>-St>ZsD_Y~DUodmS4Rzg*w-NpG6+)l5XNL!T{YLN5Ckj$Hfn%gog2z&*O9xf zr3x?v9IM0YodlQSqO@posg)o5;u0Q1*464%1@3qXwvA=A#rvmV70nMG=th@SNglLjouIP*=H&%r^t zrb1+B9Z#KUc@Hd#$L^1%iNpqtY163EsIAG*`1$rs| zgEaX{6MZK7C8l!DJ!Z$4mgaI*VU*Glx!tjj z2OinZ?TKz&fYP=5m5od1IgDVlO)0G~t$eNT&Vn-Z7C*OBBR`u>-qIj>+@5uVzWLc2 zysO%vl-X8;dW)8}d4qQemxMk>I`U9sBJ(erri$I^Dd~M9jtA~@{-N%p{*i)J-5g}o zGe5nagw1sE1!f>oqzbRf@}*ucutccJIkiAZ=@xi|l*O!&nCb~5aw4WXHQw1{ z^&KOr{yR2>-Vw)8%_}>qZdel6QG*?al@5hxd0$E5I!X+QCvl|>M3TXdd^Om)HrV&I z!>-i4#|_mC%kPd{`rRZknwAszq8bwf2BGac zdqw=DLj#wD9*CC$@YI?=_J3Fdpx6Q9czAfqa0fbrdIWWFzGjO$;)#rP9r9|->4DV3 zq6du8qK7fVDHjb65bn;#D)gW{v6s*TXLYvGgQ9_iG?7E(LAwP5vOuP7mYEKWWL@OB z9*f3Nl)D6;J?hjN)YaA+=L?k0K(LQ_J22A1Rx* zkA3K8*Yl>8PpHg}9^F5sGTYl7c1L-c2X;4urlhsIGCR7&yrK>`DR^j&kVeYd)xAIZS$HF^DcxO7?ClSWsaGUHH z2Sbsy$y9iO4Kw>|F~k{9$cpB|X2f`8k$7Z8gtf>R12da~+lgv-#;|a;MeP3cliWP* zGW09Kj%J#nXm+hf4iYfvxw11e?MXEv9ka|?81PU>O^wA?6i7I!k}yasNq7f+9Q21$ zP{{i*Q(JG_eL&tts9xF=KWH_2c!q}xjuY{7m#sp22xsac(QxsN{_qrcZ}Eql{pVi) z*;Vs*iKk;Cw2F@L?wx*DNh$90yGly2J-j@{ZK7oC?fu**ra%o6%(yip zqRg<^J9{V-U*9W4pbjaI8#VBw87DC6#R~CH{y~drcc?szY4tVCZj-NB(tE zzKSP+bHo=PXDI(5<|L)=k90k+F1mz|{?D&&(tCQEgnh{E=34XLAqf|03AT3#Z*C8r50 z8*9JW0m@v}Qwi#2HCJ_AL~JRl392m$ORez1#kIN;+f3D60ad0DD1Ygeu&o!KF|(yI zj<_k4VNeP4=D4$GJRwrH#T3*cRVF|Bm!FN&4~-*!^=NEuTwk3 zpoEQes1&EHes?O`SJZ*%Kk%2N0>2P04(Z~_aB)Nz+vUeSmzdDksSX8T{_8-c-^Tq# zk%jJzzWwdr`z#}LUd7{|dxE0ccbl+Pb#kLmUWMTBC6pvT+<hlA9JIz?{;zFFYb5^gYy#w$^TEHKYLHqK+A8G-A zqy_xZ7a904^$PE%qzcmo#`l&$hdC*^i5x_F6UxUDydxARn5gs}!_41F2K)bfrHgjl zm_&K|quev?o7%z1v6Rv{9iXdPBU0Q)Q6iq=UW!`jA=R*;6DBTOflD^FGHARn8O~#W zQ5nt?x+sS8lrC&I!KH>%CJ2$TD(pO>IGu|*yH)6&ohhD2&a+g7csML{Q01Wn?og0B zcswY)Y&Sd}1TVs4Koi;cwd4}I{9gL4>nWVJce$Cr>)_*2{=?}PHpUbBCrTa+D;BO? zC+*UF%Y$CRC2TV6vS}A%BykfJT@<9X>7q8=U_m@4kd48J)DDmoYYA&thQU%*V|3cP z%5~ArCoA2Y{eh7R4Q&@b_`v98x2blb7sCrO2uT2Cq+k2lh8l8us#g#d?xu%+vV83L z8{d+??Z=!jcaWQFTK$4ZCn?*oP`;R;&4l~sC?B)(I3mZ++XIWc>ej5+$Z$EuI)?TO za3%)+YH+rHl)?GY^bfBqB~eXUNhyg~D;JXJ0>vPSo8mtdC9y%B5uHs$1o~GhYf;d@GDc%{^f^AD?<$_5 z2m{a3(!aRc z0g|^Z)8ME>E@ILkH(+!jgKf`p;VYp5S8N6p#dnY(dp})~Ap3MtNRR`%FbTo{Rwal} zh5;g$HK1W$>;VHqZ>zM|4M0@Rny{m~DDag3IxuI!Q`=R3%gdEXDfsmuRXrJ1#p)v+@=?h-r@y9C_ zp43HA;b~p8SBMNQC2m=$=V`l^RElR>KnCv+1{vNtB@3!2G6tErF`Kq$xv&idXkxHvlq96;$SLc?H1n!%j`0tY@;j=LCr76W@l@* z+pgKp#fR*=ymy*A*x*$>OL3Ko80YBN8s6hat`ub2y;`r>vq^3$u#Yduhj*)&*#9GI zJ@+=RXBlIqTh~K;R${>z-{r-<2D;tdO>wi|<@8aV%wo5XQ=Savqm)5Kb+m;z)0E!U zNmGKBcKmr|=y&O&82UZBXd8OgQjCjM^K=UPvddKy8;5_6cBksDMc0L2DbMd8i$^>? zkg`B_mri*Mk1xWB)rOMpT!+=1y$MTi8AXISstDPOCuaZ4IvrU3m)L&yzn=rEPZ6=0 zzVp%ptMNjC^!XiFtvGcMMx44}<1cHm^dUB?u;Ct}Ar5FZOi%(3-_Aq)m3)A3Chq#K z^n*jWvI9|GiKCGpmJoLj=`ium6bK7M;~@bx4UC6&Fb|!%(>@i!99v+utuuT3-V9YhPyciyWSOH z^GqxXfhz83j;8;0g)&n`gE+rN(=XL^F#vO91c0l#d37=zfL(SH*YX0LZ`PgTdpIUs zed2OBn*BLDo(Zng!O~=>vd{m^v-unrV+`%+?Hr4pRq%ypQvord&^zV_AmGe3tKgrW zO$CPBBa- zRVhV6-E2RT5+fyd*{(QMJmeLNZB+3P5-(ItR-I6>$veVRs91u=Wg9C`>z0Anqgv#3 z&BX%hp5ixqm`GH`RW6>_g_Lh5rI|F5MSWH!A1%bsKdU-9ep}U%x1^|UO@qlmiEliK zRi(Oqs*`=bu^?EQ^d9^!=#&ttRbAGqZWVHo*Ro5i!;Nd<=Sm@3OdKxET#QkprW6|n zlc+FH5R-N$wFDZ|`cn%V^o`_gkTn)c4I)Tn;1wHWMGV6U$kyHc6gOm~Swdb9A+h+- zLY4+}crw{E^15yGRvsqNh7OqCL7NVr=_8oii?C)>NJI+;q95z+ML_Fm=@wOJcMQ=s zQ;f18D$|AKdos{Am+;kLsXp*vHDU2XkEsF6JXpxAg zz>T}0V#E4aMte#V3g@)aCWUiyK9=^q5EkHj*|AZtvtTPN>%cH-m{4=VcAg(zRO^=+ zb+YHh*9`Z|sMVeCXI&OFLm3X)h$gTus~sBcchV4_?nXm=-z*JrcCFgdK3^^I0Lc&W^HPxm|rZ8f`^1o%Uyz$KUKCKFjC-y9X#s%tnRk}O+VCZy$X!#jYM7>dM|my zld@L&n||OW!XW)LfkZ!t^S6qA)KAGGQ#L#FPa^rStXmTGln+wgFG5u6h@qmdaHy~) zZdFamY)nZ`NSw?fVnsH#6BlBLT@G%+^}J?MpNJkm8T?Ksgh(5afK=-Re-GA}Y@x{obP}dPe9F z`~j$ln-IJDSSW|$RZ|XqragfY)=@hYRkmq|;tmZLRiPa+VyfA-!-Glsl^=I%nZf47 ztgja@bTNcdEsB2v{2#l9yQCYU8tNUI4>SEBbG&PWec}*iFR66%>RC|f%AWZgb*k<| z!iF#^LKqo}{`4O%gQD3Lp_^GY`Mlc|JoHnmb!;uY{9&`?hP!Z*5hT?d9x{Fx25%!4YuKcI(e=A6NuPB5Q}7b!xfmh?<@Fzuc)|A7P3?~0&^L%{Tx zLQPI(lW6^l#cYGT5SYW4it1JmOb}pvpki^zKtNzIXa!Xo=tzbC^eP%LAo;?8B%iB) zTcF;(hyj!iswc*QLRTy-18vHkshwmQtZ6TB5Wu-hB$q~|Vkagq$jtf<-CBQiIzfSI z^d4*tv*dEOG&hY+$##_vmJ-zzFIN$nH`HsBQfM$p;qDwCL{ohyf~t_>hLQt94NS9N zzsz9A^vl5%NA-(tG_7BT{9HGaLMYErK5P~sh9HayY-0VuU^7S>69unHt3>lAI#~*5 ze^5A0?-yO9fA$OhF``*huV}f$q#+&D+Nh{L7>L1#VN|H|p}qtYsGpa^1T$I-6JWqF z0VTI#qAy?q`BY#+YIT7LY1{3Xkc0*kwg#b~k*cCZ0d$=@4?DDBsiYLwmBOVeXTP#p z_aGH8BjXhf1dK~_Wxxv+QEg53VBj41)S|f8_lKVdF{s$7S@(FzAX#QJZGz&S34_c_ zNV0J+u|>*51GEanUQ9Y*#jma=k1obWZOFr6usXhmk>rQn5xRM;9G6lh$^9>PByk%2 zeT=|?C%^fhqx7RcQcPZR|KesbY2+cKg9?N(kE?}_j>$EHJsgc9kH({KU%2@dQL6Il z=xY~l4(_AX(U(<@XqkAqN?a*dA+EGuZDT-oZ2Zgw+6cks0fUd?eBZbJGYSB#WViO| zcemY|3b*#^ce~xPXqWSJ^xUp#wY&#ne-}ZXajq?Cah_RB3XWaxx$N;vD*>cq3JR`z zWuJ{ZR^Z4fEpVip8!V@+S%Km1*bI$LQr_{3L+i;JZ}(%C=kLaBM|1Gu0yrS)-x&Q2 z3tsK>wPo4hO9Q$qglH+21zfxA~rZ_ z+2ABB)Zp9^3q1}eh2Oa%JjY$CKumiFPjCLzR0XfphgSk$L-d>KGsxTqFWhXFbzCW{IPgx7n2O;IjB3nT0DFtV=vHy;-Tr0yfb zRagg$AXwW3X@3Wf4DP7;U5XSdO*g$)$z`6-n>3Gg5qMgE{x!~ z*sF^})Ts)NsY4*@XtAX422lLjbNiAse@gLbL{tr1o{%{0I&NkoR3(N<4ZCUQtdIV+!{yvNGp@fpT* zD%_V-ZZee5Q^o{i?_Z$2i?VTnMv~$gae<8{aONNX^dmxn#;0((L+#Pm>|Fvnak+mx zP&?#`C&Q$Mg8K^|q)XGy?Ac1uXoTZW{4cFXVt zVEOrT(=7?;9TTHH6<|CCr#_T8M-p==_0>4CTQGjdV6@@`77kz!GtNS=z|QU#jJ%y- zNIGM+u2yJ~u>f~BIrob}0;)b7;)!e-)XPnw(wzOVXcmV8V$HMv2H!uqKoEG)9h01i zF^89cq`r*kHN~3N9i)2x?a!N#(5s3TAVNUy0lTXE%bvP=o6~hUYhmK(J)W~Ap3{eP}B_sjtE@~JO07#_6*d5$d z?&(%aHQy%&KjPOOx91iFi}FI1Fxh&nepcK?kzvQ`)Wl}3%w(whnyL2Oq-MiAPwM3SU4Vner==Ah<-OT`~7{)g|^hXhWE7S(!+@+OAMv8qkN4Hs*o?J-*Vf5s1gn>e+>qrzElY|GWAFj1>8T?d zYvI_B~>-bS+>-Bpp=bFDaZ+&Y52tBSs>aP3a{^xpD{m|7N~7BA+=`C5o0Dn z7-Q^{7dcoqZ>L?_+#Ci(*1kYg1YI}+;mq{$;N=!^87i5AXlo-|&rrRGim#pa5<^5m zhXLEP!$2w3AY&w2K_=aSWz$-_t~soglbHe0O0cIqCF`AM*i`tBrsCa}Sfwy;!UR}1 z`_v~hw2#M|Arn60uo@jc)^dL{p#AcG_owe(XjI}(yA3(kP1VabMdksKQu?J$-n~i0 z&Gj0;PB8Q4_L@;@wTlnbhU?fn&D<$rmLBht-_RVLMK5Kb>{z4BpCYQz?@1LI74J9j zG0J%`H->%(m;bhaKUNQO)QnKJn!jZjolni!Nk(qcXmkd(sPLcXU7`7G!5ZnCQ74V$ z?~wb}iD{hl?STjerPz>tmf&S!z(H2%gODM*ptMui*jKaJbE@w@Sy$hSp^%%hQL&&Z|WeCaoq()1RdeLm=}1h`Q3h z`XvolfBFx&lFeKwl1!gYMQn&S>vczDBhskHT+<2r$RYNjjWi>3WvETYG^@?U6|Y;B zg~T+e1!Wh`^a9m}XU-g;Yr-3LCW%l)S|L5@unkXWM#EywxI`|S36$-Ex!Q$7A_RB* zM1w>YSRB0?J4ywaVv=O2ZW+hhs7)|QKFE^k&fRL=;h{PTAbMw5Hc6+R7CBY>7{KZ0 zwc$eOT#u(G;)eXXIH?hfu1Crl!jKMVm&<@V!Zn!@Q#6R0Im@@q-1)XqI!6-E_3^d* zAl<~apmGC0h`d|*VNM`P&y6aP2}xV5Y>qNHiEwiA2i^f=JHl}|KXQPxaHO_TiJ9?b z;dbk|(vAsgqMoY0bBm1-x$gXhqPy7uw=(HIHG9}ZoU^v=ZO^vsK83m z;-%<$=g@r6v$RA{))_q#$Dqe8nGB0?`HXln`{tz>fqmLA7qaBq@fvi!)HZO(yKbZ@ z94s+-42jOvVnBPfozF^apBbbC4)M;TWw}BI1+e|IJD)OV{Rd?7tZCc*OrIa;%|0Wh zPVG06vjYodZ_a^rkxHz(#v`5aJ#*$${~vqr9%t88-FcpS?ydJjS1(&&flplolt2PO z9Bhm`(NWv7zy{nIlaF~!x2D4%{z#r_+h`d5VL}kP8z#zEz)n$uPmrdl|9 z=L3jGc!(FY(~G}zEPJ0D#(4c2b2(l4llpJJz(1U4cZBT^2FD@B)_L1&H(2ptjuY`IzI7xCzJf8^-xhET*A6 zQ5y@Pbi1mCxfa5Nu!DZ>-Y^u<;KX=E3Fy|!C=%_y8>UY~=6_LEJ+(C0PqeE^OCRlQ zbTH2#qlY)Op4^~RHNLaBO>+>>(#3=87`n}M-D$3Cv^JA;n}2!-=A4G;w>H|WnHeP2 z%%au!HDO&r6u)Cv!F+n2%QM`-tw5U^^EtnYrqkx^FcAFYIc{D{35O6oBO!t35*+kI z;IXTT-=_!aIZtST@D60;@B8Sa#2Tq`f6wtt6L`Ey;EDf11WHau4O1a*d%)Bt@4U$! zH_Qw0*YJ)gENvd7qu`cTBaK5ta5Ikq1~>C4VAwq9{z5ft4LQ+RLvah*arUd)j1YRx zoGxO|nb(E&912j+k+pSLokfPWt`~KlWttM}f`+WSpQP}>6mE7(#PzdS0+4%)KrFr} zfWi$^-0{7LwjVGbTEtWv4n!4j7i4hJN35?f?jJDG-OR@@TE7HO0ym)oR=`K55*?Qlho4GM* zi!PGdNP-5qNkmySPQbFM03QQBRT`WzK8jC}t#M%sR|$@>Wg}-4%U)fyK%is_cqqV= zz+#}PnFbyS_h*1d13U{n2ArRXT&+L06W4YaH8FDdIvr{DEcR2zp2c=b2)8i`x2fKn z;*K1tfTsZEVWqLBk(Mp~-Zp=DhKJWUcoy&mfA1Xc-3Tfgvc6XCg}Nwup)Oj+ueT$v z+Kt`P1q%_TJju7MtSvQ`X$teE^5}D~{ADFwi*G1Saww|H_8KMH5Db&#)%?Vo$_7Q0 z&T$kunW4glksLMNTCTyKB?z3PE_7WntOXNdpaZ3_X<9h(O^3oj=#MZ%?BO!#9718OB)`+jf)& zl=s@bx+=5BiVe$1W>@`t>nXshZnP9|I` zA6!k}FahVz8wM}{b(YQVLpC&F2Fcdo&d)A2gG>!{8^crmSN`ol zXLdz)CC6>b%~%6oqyJydE)_l0TABf@pg}O!(JTAlH0wnbIL6X^x&91}++vnn7ds!m zj6*%;_s4Rqvo5wlarG&toIfJ1i#@95T|A=YLGZY`&CrnT=*oM!O=g{*e1rV#f0*Xk zJy&rnWets6tg_jqmel->eS7To|E85iVU3(f&)6y5G z5o8-A|FM&7c(oZE{8*1Yk~TJE===?_M-Y~xJwb`cjuO zK5}$J1TbDDOWB53_H~=Xha35U4~0&a&;RGIC-q9&1)9dud3llH2q1AB+l2UWl{Bm3r+>edsN9?2UBXHqwI0jBLxV zkZf3s5*VY3GwG2GCsJtKPH9P^tnqAGp^>#x1quu|jbTdPnQbZ}f3DV^y0TsltjcJX(m{LOhsWN}Kpj339C|$MXr;Dqg`^+WT zW?TB08iF z<9!niiIGzA_E=3Q`T7{j%*TIg(l}zqifp)RkdPB2R)Ks#1otrj2*Uldi~d5CBF8{8 zX4t61-*dE}Mv?mOn0#rpsOMLph^dcZRpgkN*Aaqs|*ZfHOM=sqJ7RKLxh1i zpDjjugC!< zR)T*OSH?kY#Chx|v=XeP1m=+}B?v?Q&V#2`N98u<@Ree1^tOTMd1Wa;u05O~^p90q zDP>_phCsJ|c(0`_UshImTa#VIHiTP!+ZFd-u6yd?7=?Vkzdp8BzrDWh8aGq3(`?D= z%UH*nE>RcuXt|;qs*w8d?qL29WU^F6=9O=HoXl(UhPY%7a~785dnqxy;iGs=JT?a%YhM5zkCtF&Z$*^qCh)Yi zZmq&=5xP|#&CqFy8$gBG&KmX0mi1>=nI$XQ+HaMW#YVgQ~SqA9}q}|wicuOMc^Knl+~SBQ+AH(Fr=k7%&5`A zh8bT_hPPtfE*Z0GCrZ`u2v6(BUhEBdATB6tKdaRcu@=4$RQlTz7LPgRL`$z4y;p#B zSP(9-W>6-+UCSbjZ$|Rm{n|smB*_auMt`$@rapsVXCI$Cw=BOFek=(@_PhmU4>wWx z-pWz1Wv6Zp`$?&Qi_j3ZpA-zR0(xTsE1+Y^0z?TdZ_;>k3n~|(WpPPiY1o#6jXgsw z-il544fK1Ei^Q8C0cLnLX}u0D5BFI6nS_O&9EB^QWHAfsu3>w0!F4fBiuP@BMRy2M zmo*`Ej5zJb_>|CjMa&oEd=6WhH)vmpE6I)64q&;Vbzey*GHd&fdu;(OmeRU0nlU?; zvd%SNy|ok+p{7SHkZZUO1ZxG`34VgbPP&oghp5TsayRS?1Bq({(*@v<%gRF%kp z0^P#qY;fFGEatL09~N^nU(AJ8j9^>T)%rNik8ZZq9_(M4Tc5Uv^9|c$3QJ54wo18U z7uS#_$|Pka+P*WY`iuX{)o~|MExYwVWuT^CbcPm(d2(IeArgSDX|xX}N&dCz2Y#zV z>%Y}Ky8P}p-p6wAz05bvuT8u`19#{QQ+2jSkX9=sByN`*9kj*>V6qmWz*2WfNeVB+ zTYALPrjNDk&EV~E{BK0($P-IUH{M$1zRaH~Cuj2t>yVLy!ZH2V&ZFs-V#XmUr0Q*(Jy zOOKo1@dAk;*#WKgA$Gum?=eIU8UHLHB-3)-FgwnE^D_iff9d1j;eZP9M@ut&Ei*|U zS>jr#>$=Sx5FB?euIL3oaV3D_ie8`k{1irj?dTXaP`nbhvV9cP3v8ivVrM>_Mjrm! zD|`XbL%fB(a%r)pNuY9R;S3U}j9^03_`^DhO2O@Y_OD;wfXo;*e2&Ym5I4-z^IWpQ zC+>+j#Ye^B?UZnWSc@rEYc|u*ou)=TI>oR2dnfffZ_Q5Q=imSApC|cG)gNnSQ6*;E zmU$i3d4j9ySHfDUlobp~BPx}0Y2De_6EM#L%G!+d6T#K@un5;r3fF7vf3*V&ywf4$ ztX*;G>F6a*kNh^PLeHvyZ%4i@1fk=HEfJ*M8i62f)(8ZhheOIV4TG47i&`Z_3t88c zE^m_){xF1Zp}qwzH~pzsG}~=P7Z&YJtIg`7g%8^Qt_6$b+6)xVsEt?zT(a%7kKa0O z{tofur|a(uF#|{)XAzW0RoHzXmHjP|ROO&v&~`!inj|24O%f2i1ti>mQ4)%E7AlG{ z159s<_P~(HC;xnk(;&1L16mkUTrY(_$Mpi`WNm!X`k4fw*~T$}EJ~n6xbo8l!j-lz zwDFn6Li^+s4tbq8U~W=cCvB7RjtDrDqD!nZN@{=qM~{dT5a(<5LpG-HqzFo2q#$O} zgA!P=qdQhbBp}_90j8JFOH$dY8W<-`H6UBk8zOuB&v!N3dqNjcWRK~>L{{~qNo>a- zMVLaQ2x}a~)3o1gq5Xbyw-#cxn#gzjZLVLMbwl7&SS;<(VyV`K=h*_@o>l9%Pv zkbIgKtDdOlnKr2}Y6k0vhV#STb2v_2c)gIb>j&WB^;B^{JhOa0d-PkJtshPmEL4 z`?G);DS`D*@Jtr5nHJ2|*f!3e9&JQ?6@ zOC*0_b;en>egdHW+bO|HvZs^Ecnwh7 z-Uq{Bqq6&K7hKXj;5uc^7K|_@!OD&vM`_3}vee1n7LITyoeHtttsnfw_~(~>b)Ua_ zSMloI%f33qNT_0!Y}Jds4=9jzP!9uLW?u)wF!^*oak^dq^uqoSxX8I@ewea9YW`KT z+zq|NbG$}J1Xr{tA(qiB;Zo;DD<1l-@bdXPS)5VTq10-A8|x2p=jC0m#EHPpYfUPu zc4wQ`qL`Ml;GqY6&ddI&TZ=GAq5MP3VZ#Vpkmc>iBut{!$Mk_Ul&a3MDKH82r8)w+ zgsa|ig4K7J$`C!vq}oC9?O?fU1GnxfKt&*Ty8+p@p}YD_Ab0VJimrjaz zs+xaF=eP%IDz#cg(+-1|Iw2quV6v(H{lBB;F ztCg|MXIPm-=qa5xk#2Vxxd{@HY^_%z03tVe#Z`9t)d3-aOvx{7QpjHhCH~5F`QH@c zK_N?ZZCqvT)hJ)sM!0gRU_#ALe*nXxPj;zWRdsGVKTu79gxL5r7g^4F@qU=BXWh6< zIB}YFKyxTa(!*1_3J#zSp7O4EByJ2kC>~`FigOzr+@*7g?bX|KCbL28e6BOLv}Kj6 zWIy55(4XCn3THE~3QAcPG%gORVMabsb={@S&Y6rr$yVOI^B!COwXV1reLmdpfk=X^ zXBii{x)be$Ee7;PEd&$==(uh@mUd|O`j1`gZe^m2^Rblgi{y`FlIhW?6xk>$Z6~I1Jz2sM&r( z#s|(XL`4j;c&76UCC5C!OMyEIOkDCQ&A;T+=BUq9#Il&sU-0Fi(3U!uo9?vuSZ)~# z8#8>=noDyCd&}wE%n3`UbJJni#gg$B5N<@B&J8r^r*i|LM07eg5Oaa;4xvPLA@oKt z&P~)49mDp}Cj%yRwtXZ^dXBHJ^eZ-R((NyK2Rr?w8l{R%h36)I+ONmI#v}su`Gj_~W*B2RO$t#~~#&`4?-b3SGExzx9j?%9QtHuR_AF}q8NgyoOLx2)!}dZf}V zfcZ#;Up&xb`lZ3lYu4>vGkI{?PHOWfGq3Pl%iAc&wV7UU1MQkh^AG8lq@A+PV8wpI zUEo@v(p0Ke44$moAeDK>QE7tmf(B<(KgsJFYv9y9mVLB zn(*{Z>PNTA4q}M~)6iI_^-8W;Ov*agR%mHwL(}|o&{JoXZ z+1@I*^jV#Vw2J?=vAf?l+!Sgk%CO1oE=Ktv!}Jf)+^O;LNmT?bS|DWz$7x_VxFxj$ zakh2hi*;KgJ1kekMs4)Vj1iHeXsHRvWei~vM!tSo0j3n{?|(z7wH+bai~Hl?O*YykYHk3X%% zNVy{=%}yeOS2iFyPnbuikvo?=6t<$GQCLxQE3BUP@Ln#iGN2{#3Z|tIwA$ z6|+sSl@%TEPsEGwk(@=i1au`)0p0ye;H7@KvQ}A+Ez4BTZ5bu%c(*P!@M~t(&;Qb( zoVd``l42AG-vwEhvLH@h;kQAJsw?7}EcoB8m^2{YW)oHh%5j z^E+wVpZ`Gq!^&H*UuW1`@?=LxviJqvoH8A9m4{|Z&?qLdu3u9W_@(}3OQp{F3JPO< zlz_?d*)|L7;MC-bN1P~)!1c)n_#J}a5}vdK!7)fn(rz%M`NRI{x4n$_2~k)VQ~ye% zbG?DsnR>LUwXGvG9tN*Hq$Gfi4YY)UFVH^CkPSHEg+G8>YimM=6cnne*_y0(Z-AJl z?{BDo*>YLfD;yc}JnAKca;X9=42c4m4W#+;a*A>x8op79r#GqObp$5f56&cew4+Gk zF+9XZ^$?A;MxML{rQpi92$q&sm1)q*-^g9F92Ro;I_K~;k%ntLNw={<6B$DZood`H zlEe2Z<|!c%$sdR0?9JDz+ne%ZTvQvW(~I>S&>_|{k5J$c?QtVNvfUobs%=8TUVuhISnr0pxVYf!vmwWoUvo*^4 zjjyZS-Y=-XES6bZ;l-I0ViU_uaJV1+Fogvru`Uq(#~psMN6N^7#1NbS)ortA39V%;3zB5TN^O)rjrh;IyB z<%{BE{6uE~5cWC}gj>rlZzEb+J>OeEy~=5M4R0l7$LNEWBhBM%7}t zU-E60C?#Qo`N}>CUx<7pyb!Qk#R)U9-Nr4({iuHIdC{C`5hAOD8Z1<7GidThYqSAs z8eMWMKWt)_fhwSVflT(GBb zMAgr72cMLy9RP^8z5Ju*%NM3~(73&f@344Ttsy*_K8w-9UnJH) zx}M)plYaFqxcdVVI0%B^{K3gdy*=ZhJ@#4XJbKwkt?K2-fmwZc+N#wzF)0a+jHAlq ze;~**+-Qof&(6R&0xrr;zjRxMhL&8Mc|SYpqgQ=v(jtQTQfD`GHR%LesCpfDPG? z#NE0wHg#%&k{mR;v2LIfL8#LGv>O0z!}A*QURA(hM>C6h)l<>f>K0C9R=2v7q{k7Z zIq@lI0gc53^Ql=8wH29-B-sMrN$4?uN0nK8#i7K_m3l5L|)_X5f-1e+cdDVK=5kavpebtS5aurH|Y3RJUM!Ko%R9cJKG>EikW zzo5l8b&{@(=OwCHiqI)ef$Cm#u2F4wxY8iVYN}J+QBcjq@3N`>!$36~W3ho+scvoT zCdo;oAEjI(nN4X0$^9ak=bC+4L-!lW%qVo-B)MPLC6d{{(4||_nWQApc4521q}0Mm zXV&ZF_7>!_9p|#i{jY)CRcuqn&CnwMD6D~y(i!gsMC4Ur(N7a;e|!IqPDS$f=Z6q} zWzXvumX|4H2Sfc#19~$8-z0x69rXVU{cp8gkE>f>kO;3-nm-&WVxMrtnGI@?pWk-f(@f4z670`?5z zXyr}*)_!?lbr0XMmM#rEVMCaKCjqyUbxsx2F9_(89)BatnYMx1uHL{E^WQuC+3j4h zE9N%8x|J(rWtU&w$Q4s$G>}TUfh+7PR!Mbr4OiHe+x%(^S11xzRrPEWS6C^mw(3eN zw5V@ZXmz!YD?G;mGXzv_M;2=Jti~1Yvjk?BZ40U)sR+lddqxsPq?z47A2z#zF=lMC zG{%hUB91W=x@Z|=mNYM@lJWJIcK5DUG+q&V7l0z~(LX0pWPSl5T2wh;z;ZHG$lu?r zPS<T$zVoX3 zVKa{pX*(chGN&n{ylkTo;%i%f2$g(c`Em-!dHU2|Q zg5I5tHDY&{V0h0(Mc^B=ReA4Sq;BZMiN`e_?cP0&H5pl>lqZ1hSL3JtvI;o}veiHSU^{;eUA#AXO z^i~2lD4>xsn8=rIW}K_w*zq4mvF_sPWXsi=;!5d1kNiV?Q#NERKdvtD-SzZeC9|pJ zC*yULkfncl7hW;pb0*nOlSxv!`0`=WpfPC>Dguwl@&kwvucM=_rFq-)r)##U^NH2a z{mO7eGK;L=f`QK@I|tUPCk+x|SwHY>TeD*W9)-h&HQBnI4SY7eD)YX^`V0=3D*45v~i*#2cL5GkVsCc;D4r)#IP6rh`cehZy4`soR zL~$(!W8twU3XH1PD}x0Xs1aP4S0l((mQV6-QWUX`fQNelT|vCI&O&@e;wg}%H%vve4l5sD zcEuhPiz#ysPgj6wlK&rj8msdw`I3&edSCwF&``~?EReO1H>JxwpTr&vcY@I_GXO?tWgmn|8 z*h39bH><%^57=4)7mDQ-l}V;EQE;{NB)KF#0&cB3XD8j0B|h;Q3&x@gh{ZboNj zp6C$7C91yRsQR*{iA^C^$c|}cGD~}Yu&&Y}_tr#P*vl(hnJvp1GgqwOZ6584wLIwQ zYJjq9s}?S2nHLGJ%SqUc;k1odVL52Pr}uG{-Se1rqr;7C^!Q{a_-#^>cqL zrSaJ=t}Ok{1T8fGJD*PK@4iK=y>|{|1ES7{u6MEQDx!#+}p+c*Uolpx5=Oylxv#|vKvoYisv>N6e+%Q%EIi7 z9)@{-^W*rD`~a|Uwp&f{^L&jA6f1vlJzC%TXa{){wWCYFzPpeV!S7_Nq3_Y!oSxK0 z+(~*`7q-2Nvwv)FXxXEK*09}%&g5_klxz?oH&q~KDOoi`JgZokIk<+COQ6mZde^5O z5r#APYDyroci2&PVFtpE3GX7kJPcWg zN6`Bk{tzbU5wnMDc~6}g7cC)&PcoSNaP$=~NoW!LU&;B=SJ+-*1>Ovk#8lJ@J_IaI zJRZ>y&wnMKXP{}f}e8r1{%%w{E zFOAF0mDv2-Y(3k58C%cxU;5@eKRsxN_@OPNlfoHFO#+IhO?&b+fo`NR=OC$Hea|ai zmS|QE-M{=E=w_Fi;3onPa?H?{*5}&rI&6FLMC%WgZ1vgo?>F}e%MFJJFnth#har$V z0*^FlJ^JL+sy&BPo6ksnD1_oSwsJKM$}DeH`BVREG9zl3KzU5V5K{v8hXExr|sHXo{7#4+gP1L>F5^tfpwUAsZA!;@4eZLsCc-39| z>t$&*p?RE4^tdnhN1Qu;5nLN~Uxyct2AFg2(y;(f1CIxIhHr-qW+w~ZvT(pZJ0~$p z3L|0^6oy2}NmB;upAJ4PY;nR2{84b8T~;}73*}hAw{~wqU@S+D92*->zxy-r)HEEo zm{=3x^d9MQ>+llE558+sO(X6^T|Qg8HaTJfJ%}EENpiH!z1YnY^e~7ZIr;529T8{X zIH0n^nlrIDUhiFhrql}c%VW@JAdCz=-B>au!ibFus!m=Q2y%5qQwDXUOtQ8(qDCI! zZji-Mz_8O_$HQf=x^!sVpck~w?$EBvRg6MFaZ}I@{@y$ey*nJ#O4V%+&I0aoaK=1- znQ+75$Gl6p$>qkPXUXM;dMvrz%;#@!V$8}+SkOb%2__#Z_2(&F#QuCr7uKICReeUD zIoSw09B5M4pwKc>U}Lk8)0x3DnZJpv^VUNrWTwUCs#FVoz9dem6K$3ZnHy`&;=vyl z{Bjk>UD-h44qJhm&x)5;;#6?wRAT(mGj z-{708xOaD9mfji6QYM&T??yPB$iCG%V%t@W&s14`lzqpTrl3K|KENT~QP?i;3^Q5X z<#)%pD>cGhO<@rX1^HleD8w3*KuP(KTG_JOudQk;E6{bC>l%b^xKno$X1yMl{GHbW za0bgC-ozWotro~!*=Q%5`B{<2hbs+tc{jR!FiW>L|7G18&?G>d{>O|&i?m@pQ|jrM zhJa1MD6c8xTMBEY+UR9;6Ekf@YxJSE!qus2qaV$sE97ZhU*IBE?7CKMruED73H|cb zG5u23B){5=?S$o@`!pFVUQ++yjc^)4$H*<#6)U#Ifcrh3z@~@I_SUNC>ag{n(c2it zgkT0Rq-nA6c~8?~SQ*9mq=kXZd=LK)RyNDI_4mA@7^7qkz+dHy2zucJU>Ktq63RVL zg@<7XE?N1y#8iV#9yHFSvb6MLo7>CIm%>~-C6s8slX@sjnps+G=;0Bbb1H$q`sKt< zy~s++;w&w#)|Yb21nWx~XM#y^gk~<81je0!Ic;Pp(`G*bTw7)npo~^oOpt_|BaEG* zFz({YV_t?VXY#fNae@t@A!oI_D>UR_Y{*&X3hevUMGbkev>e~jqAxIVL^NEHzpY?uZM!gl~L2;T(;5R{t=3d58#nS@jk zX8<=zbO)J?wWNxOv{^zLaZVy?32AIs0~eN%rbRqsLYgJTli0o`)pw!CW0C}_QnOQ~ zL>w1>;;Y(WGnQxZk#p6p= zZ04HE?5=-gV`}%n86Cna6lmcmy7Xtor)OL^}`XbEeJQG(BYaaW6)<+7}1xm>8a-X3PfOUf}7Af8M1(V>Db z-&P-eQT?ZE$y0pg^dPjm83d>kbl(GieobJ}9XF;;~wmF2wH|P)+ zACj>(VIRNWxFgt-cJeu-=)+y+I?YEIL5LnhMaoO62e?M(V6Z?eq1gc9#+V5p&S1iU z?1e1MOnG+@pMG>97wot-`I(&Jmc=g{+=BQ)MyPz0O^EFFWV|3z>R4X%|VK`LFGM{bRjmc+a9&^pt1k0W0}FYeOcgx=D~1)*^jh z@j$Tf0)1bT1i(2!YgXQnyJ@DP3K;9F4c;K!uPT;uXb&^=|8_gFJP0*l%L<8O7Pbbm znaU;xXYos0d>gcM=M(gSZmskbOi+oC+sX{yG>uHOJ+Eqk*9R4 zIHHRSx|1d zIg;8Uj+DzGdgNOrM33qsBKoi{S`bxnjEjaHqu5#WzV^GT52^Uv$3~GA9c82PbHWmd zkCK_r1sEfsI-eHCE!v0AXR*LymOqoGP%P{`FjK;ESQin?L%J|5!D58scSH+S`b*ZO zHA&>PiO;2YGW%GmwmDtI+U9l9!V_ye$>gO9J@n;Lp@(%53q7KX#f8#STFvDq-%C8_ z#7nN6=f#j*5kJvd&B=m1kYTbQ$K*l@zCUQc7M=x$N}NypxP<&kT}0$h>!JnuMN(42 zc8n&r;iD`hn1R(v6AY|)wAmDJ?ny^&g~r6EDyJw^L6-(6;{_l?mWkd((H-9LuiV?n zPN)h>z#z(V%>G zI2xrqEm{+myE(ZZ2WUkm_vVBn&=LX)-LKi{!JD1=W1m;`b^n}hPf(t}(d*%rz4>{= zrjE8J{E~1YkHTDnEe!mTEf^1xEm#kcl0d|Pz!qYDSXC~w#d{$Ezinu7xS<^laCQCjU`bylI@H$Z zZ2+$S0}F#J@)u?brE#uFVfV3sxG7mxa#gO(Ls{ejbO+^+*H*fI(?M`(maZ&)4l5sq-NNw9WXaG~k%@Xvut5_MXV;jyQ27`;IZDD!%oe~B4; zj1#)B-SQvmq%MlFvc5uxAAR=;JNv{obC4f=se;)YLl!%_5HuQ!#skGRv+F<$ZoLeA zw5?&sUku%PIMSoKH5sQ}WaY31ew4IVhUV7fgLb$0hFOS3*{E6T@2EL#9`q+iDdA-{ z=!9~{RSt=)ECT6arep}1!3x?%n1Gez$OO$;f)TCfRk>g3kt;=%#)AMy6#~S3l{}Kx zziw5C9^DwPG{O*L+@&Tw9@y&vD|tfpI|8gRgvcoj`xrT;r3oCzhT%cLy9qr(norF? zn&i`Sk0$j8US;Rz<=O-={O@}rcVw4@hS5kz0g|7haZsidX^k@*mfLY&SEJmBCr(j5 zOSym26^jjGYfYziQ?-xB9$aN&OY*I@BGHe zGZWuV9zbt(?s*aSzMedAfb@lstj$S|A0f6>!?_a`i?>tb5`*RckU?+Q0sDlCic|s; zukOt$v$XL5GIyIWkT4ZnZ*;ud9LZRn&@^7E3Gw4g9MQ)LGzFBF)*;7ys%0+LlC*4O za!db5o8sUm@}i=1Ybt|Dl7IWNfA-FHGNFn8YCjIskWN>pKnGaIM01Z=-n0d`_`)4g z)%-9rhI#>eDfpwRhDK1(BdoT4yVfS!bFI{tC|c`>F6J%u@EzB9y-9@l_{s}46HT$o ztynK$olcS#YD5atKPC-L0{wxH1z5dlBEafo<48@!*0hGOn{HxvI+DyUDC6A~8+@0! zall9xGpx@k7|iNd*#}E?j+Ag24X|(=6Wp^oMK&;*3`AlkQ=(ldRO>84z}detTr8mx zLGZQd&w?We}YU(i8F}d zY+2Au5?7R9b1p*$M#Z*qdz5oHec(eWx$g!ije->0<-2M3;!KOU^G5ZXa1Eq54_cL< zAC@5tAikn1mg-qq7-IN|uUgA(O*Wxqe3)k2;xDbm-C@L-%+u9oLgQgt6@oNX5-=QQ zh2V_A@1frUk_v}S#Qy6P4>ocWApHGX z6mRL0cjOl$6>bl4WSw-y}sLyRom}ql#Tu#KMeQObI;mtSO9Vk9HKI6(ztE?niI|;aZUcGUyyL+*R@Cop3p+NP zlM7$2ANd6_ySK0(tBQSN3&@|WNqhZFyMNZKEf{wl5O69$V62TGaZy*STP05U!ltZUF`peVbWnlO+}Wrjla*-%c!M^lE8Pg3 z+7)+y?;NlV?oAwG&6d_BLF$Bs`z;-j-d@WXq%X=fhkOxeQ>yj^8r{T!l+y|*-Jo#t zR1X`-+MpXc8cx$G5o0G6+SuK~>MSJ1A;JK>-3THn>-EWXP{V*+PT8Wv;EdJMf+ijq zT>iT%{C0)kZiea{l^!n_JdUp~I6%%AB0c5%)fVQbAU^pDW3lu(bF@OsF>^6*NxnFP%f}XGaIx)nD?p#>@3>e77iGWjGs-$N zYzJz0G8bPti&nsw1?f>3WxKt>unCD_iQQ^&1mJ?u2=V&{eI7bN@=)dVU+H7gW2M-2^!F=^_epIZB} zZW7U;TS_Ow8DVFhZoOT5bWl_}Iw@#Wq!Ob{N|!vy%E{tNfPR!8r9p}*V~t#t6_v|rs=b`L~7W#(97oPjy9Ji#zs@0d3|IkEu(|~ zplqQgmlG?i)P8(6G8X?i?WuRIsq|@m zGMtGagAHq&*ey~$>4&}h+8qtVwpZ34+p?;yKelWAu_LZOc9hm1@m%7AXt2s}Tdy(u zEWD1%-mUm2IMa~OHQZBGj9>1_HN~r!c1;;x?ZG|OUbv^y{F8V=XUp!Xg(a^pENDE& z9iB$GBZSg`k+2o6sXQh}z)&uev4AOe$8g=tPElHuTf>PzgWAZEw+&Q#`+cIvvsZ>^ zw(*!PuEZ{_)hiy$q-7k|*+Ux9tc`de@G@=`b%Yv});E?%EP_Q-gz{8GjKi}m5%SG< zD4Q`AF>{;whmxl00J-IA2=o*<(cL3riD_LnoHQuwjdF8FFJz)4XoEv=$cL}(Ot%1C|qR}{Tkxp&!-&Wa*0M&`(q)E>*yuO8k`GN1lxB~9qb9a?64{N#Id(sTz$qc!?o z$c?YhR_vr{e|+w<|Md^r-;~*t^QU;i4Af#q>@1Z7VltDtA%1h#7$l?l-=CAyWK1BO z(HPR7cv3AT-ssuGvx`g<%3Aa2y*+4kl%=4W{k~_6})NAV*5;{@75GhvRj05v4N6OOs zx0FLWQIj^+H(7cSD#JkqQeDQ<}_J?4Ceg79S17 z*DxMH7W`=DembN27cSvci;$OM!NLm5?b2ant0z_I?k>%A@6grdhov^^aiNoZunj@z zv7l^_E&CZ{%YN;)?3Zqb9BX$1kV@@N-k#X*8$ENvhSqkMF0{kUY@8@}a8roEJw?oO zt5!jMED#PkpBCJ5;s}J0PBUKn@-sU9y)Ur4R9bN@Dv++|3+)fwXLt5rL7QBsCCa7Pl6jiQiak~Y82A(~u) z;oPIe2jyO3Ne`z?%aR^`B=6bpyWL5GcXn@)dX;mjJih9T2~%5(3AUxbOA@TG|3I+9 z{=;b`EMhJqSe_mTcGnV1w3kV_wUD}6iAEG@3nRSgB8OFBhr5;(ew5;k%o$^V`A;39kp<5UD_S;w#9IMg@&E_qt7P!$RSdK9=b)$T&Ho8 z;U%AWln1jPC2zZdusq`V3jnSlgN;H|Z!&asufg%Ly1Yoo-`kq0TTXnw9oL8VHc6_Am}zvnT)3=||wM znM}X3y4cET(OTA%ijP?@UtEf5JVJ&`1%9_&U?}-Nh18J@UaWWdO%MMhYM)?Dh8>H6 z!>WYo@I)xtB0)e@(XPKvzClBRi<7!|SQv3}S{KK4!MMtjymkGP{91|?-IqbgPEDMW z7ArjmL!=(gi81iSXgqIb3cMjsI#uK1VO_uvD`%uh3#l2s@CCF$gojNoN6Uec5-r2J zh_oEi#pTdqEf7bSXkQ>`f$A9Zz0cJbHXwU4c1aBEu%ha19%xDfi1YL&tgi*(-eclq zjNhK(LaaN%uUIE`s}0URSfc2hE+R$ebzu~RR_Ii|kB+<^8omu?C7YA+L$6U#uEAr1 zB?9=GTj=9j*hqpS>+2`kVXcM3=;X!o?lK|7yE{7Z6+5Ih)Q#mlpM0-CQ+hH9Rr1?DNo7g<^+54}cNT8xNeC4wd* zK_M%P#XPALu2oA5{v(Lsuf9O&PgNS^+8tD4Nt^Ky>k!XfA2$xLGwS9hrBjY0R1oJ8 zU{QV2V5eGJTg459DNcv`lW<@Lcx!TkWq7cm1B&hWBPh;bx6E1cZDamP3vO3qo(`#G zV1Tup`Yl4_yRl84=$yp2Ns~g(83HymXH_-`_R_w!W5yK!? zbZ+W~a)nztSEd*%h{7_8Pja7VJ^l@{!M8{c0vE8>!u=WUj~h&k9`~aJC>TD-5xbU@ zT_}}?P@EG564Ygym9bk4ffSLyxA--$Qn#$wo=MDB?%nRYZqA?YpuJ^}y|DeI>6z-3N`ywNOJNc6O&J{__Txx@*T&^yU{VdE^)rroficOFIy zJc+$iQC(2enT3F@#1Trdx$3|ETA#d!&4&;<79#nJ0R9?=g6-d2d?)V5A=-OZw zbupm}<)AyMt4V!9%7gq&@!}8-a;~@<{w{Kw<+K%nZzIEHiKrcTmmm zZbQ}ssCdV*04olX{$+17v8d9$44wiW5AZ4Ai2zRn9|O*{0S)S^@JJL)zaZVd_+Q>8 zbHFmr{_%oYp6f4i+&Ic3mk3v z8EWK?W#|H1G63=IB&`V#rFE;v)Uqd}rs@yfjA0T^@n~R6qQj+#$-$y`z#k!1Sb6=- zEBT&s7!iyE8bKH-3_b;XFu+s5L;7Z#@(s)SZ{Ohd7KAGL*!m=IVBMnkAXlJLnXto1 z*q*i#)81pdi5_apn350yN>y(1_mr|~i>gpehNTW-7a#`S_g;6cl3CcrurAn0YZr%f z!4_LC2sY=pFz`$^AP(Euh?dp_q(XRgt*jN`L3rr&!(20^U^c2w-{=N*77}bnaEuG2 z;~P^b_kgacbV$EPB4hIDADvFvp!Ct5UKKKEi1?=GS>6=_$m>i1uWO3#_NM6WYKrb{ zO$jCJH45(TraaRRB%Ugl-VvpiJ`;smLOvPZknm3hSe@cjfE5Hh9blPVGXWk4o(=FM z@KBrAB(rNi+@AoR3$Qv1Y2^$Xbt2Nu8LZAl8ajg&T|N=uA>i=<&-2b$fHyR?LcOUJ zI$bB^4;MZ0`@efq?EcFzL?DjV*Cg>Ucr!_;3UO4*haiq8Xg>lQ7mC@$N66)Xrn!9kpka7PWH}7qx$s7qxSg3$=5U7qxSgBLp;x1!5be<+`R2 zA)rxK?r4e%!W<>#;w^lV{IsrXAO9U%xKaOPvxSKjFDaapZAA;81`I8H1{M1xwlM9W zlYLBaqAw1GYbljwb;L0vi9sZP^ays%bL#I7$vP3*juw)RHA$Lmk~HFFLBE>q2>y@HEXv_VJ@c}m6Fj$jr{ndBsICJ{ueuo!9&}*C^Gcc zBPixDcpL=`ZTaw`!Q&hc!{DJrj$!b)@T3nO%eJj&#!%Zn_yqcYQ~fJpMoHVU{iH^4tnr+otw@~L7A;Q9jt~5To1Ddd(juAO`f@V8)?`cz zUOu!YUHjImvg1v#{nWDK>0}~AW{}K7wZ(>0x;-NgHoHspQ){qVgmYAmPD1`!yu@?J zPcJKL{B#a%7n@e|A=V@g zZI-6EAP>5-*;^xIi6-p?iDyYn(nO;UX+npq)FyviYeJZF?k|7g0VjB=cIw{db*qRr z&NWeG90{PxI2DK1@zPh5k9|?;oD9=ay7q9z(tU0WX0)O_hcuyl0gO6gf;<+=8K_1A zHyjjZ!;Kw%y<7zbj|=W}ctUWUcY`%3T8c^WmP7f z;&8)K;;>G&w=qjAiNm@A0Zu7iovkY&ux=>?)-6Eb;ezmY?4oS4YN~Jv0@=^J9-Gjc z)1W)Zl+K2jNt7U@rSVS{Wu1MYi54uJw(MQBi$I_EO9*5RPLd;gV6`ol<$PNI{QpFQ z0OXn$AIjPCVUY=cgHOP=*bA_|^#a_XVLp2IVbFsDcIv-D*j3u6ADYyRM@+U%Yd1(j zRUZU%+6dWK5l9Xd5s2l3z!``^Bze=_10c(qzi7}rUXB2@cdEzTPuYz$S7_^RSW$E2hmMhAd4G=aO z6@UrGA&b5UU&zLxb_#9xqZ_i$B{44IyRqRlC$ zyRW>F3M;I}rJT-?W%iWQ83w(KZFYlXSL|Bi5i6F8qO{_7aRa@#+pjo*NabqZ{;mGz zacaBW?jqt^m9+1txOywS;<9P72g&DrArFtC)?kATKSNl1CT>Y8e_R=wnif(7B>`XzXjk?DPllP#4M@v!ByRR^51$#(0F1U0jf;2 z{P71~OWZ$_YOw-s@^29a(4(*%ZJ8v4mU5%8ib<9%)}}E%#dVUpX#XVPL=}d_4>Yp} zWAKz*b65ML!jD$~HA!d4(N>Run@~?#MNe5pE3}FxKGd{|jtLG{(WGEH?o(FL{}-&H zxu>k6r>r8+zV(x`ik^7NDq=}ss-zxImDJ<(66*2)^;XeLiI~|EF>^~1^DoaT`uLhk zuU0PSiWBNFLl6DUr^A{dv(o&CuFlzdA|Y*)=eBcTnXPXs$3GW? zo~0H$J}$>r6bOvdi}J8%Pw2bvt|mh)eh38yS8YBAm^Cb1PI;M_p|c`k-iiu~OY%g> z>pxb}9G16w2Z)%FL&|&^Ea!#aNq&{rL(6g)*=)eo)cLrcva-$JW26}SyFOJ+E-iY6V^;Q|FMMeID~%5#nOg+>!LpkC5+3q~H^P$iRJfM0 zoGAv^DP#(P!_J6><8s=GZY9x?CyaxAErTs?JcV1^GnOw&NGsP3IaGkUfjBJ!NFnu` z48lwg91Ia&Rm6bOG<$)nl0k2I0f|enMZF3A;zK7wr;XQ$$|d~P()Zw9!}-9)i!I8A zw^f$-ctXv`q`;aJN52|S3xu}XdaU5-=dLzx!N%wKK`N!_XfFU%zwJEK}=Fptf5@zPdfj+&hzCuA?B^n z!W+w1t4i(Yd0~8DHdLxF>QtmuB`08?Z_QzMLQ_Ds*nddxzw@~ifp5$E*U{gZO6sQ! z@6N4Bz`M5vZx=BnstWSROa;*8SxhpH3*m~k^H?`h3tNg>YXu0Eqhm@f!pgT`wU%au z{8jfl8X}b_luxx9$jYP5c>!5?#G@ovl9-=4m#l6ZA!>V#Ynh@zsQQIgVg?Q+(n=5>WpXmi(dA!?4z5$1sR z>IhOIE0M~5Wzc9Oj5xxhB{V}(je^wcYkA^&PU1#!i~sV7!RJrNP= z5qhP1-W?LZlBKpS(+m|9LJ;u=an1J;sFpcuQ8o*}SwN+;0F=Xs1G|mE^75tfhHZhz z;4l3FCN~ zd_|W9#2!W0^3}HKI-3R3Ukswl!WbDMlZ>dNH!41z>x1@pnDnLE5|RJy*>5I!BY)@D z`T0hYzqeBV!A=HjlG^XjDzB5+>z_Uxsl+S4XOaBeAGQJyGRo~`EK*HW#46mYh%HL$ zU)q2lEkFE?Z=&!my=h*#m8?@z?Am$u#E&dnd?I^%go0=%87M-MutP$Ycl_e(kO8vL z?@)C2XhoZ`?8_fNVJ1Q~XUiL(sj$a?kiN+ZV0d98=9})#pLn9mQNr|4bJ>oFVnD=W z*}AkQRn*168$LA5w6~yy*;`&mzt-DT!>lKN;BOy=N(?sYw@NuPSovO?JiL?P4wl{B zsA?OljndS?@6BSCr1)+(sgPloNY!*&{7!v2k9HhP@6_POIn)_Tn()Ft+NXVL)hZQ* zhPz#D9vJxJC&GWp9dvw?P5HhF0+*xwU8f#F<>@{xkf7SExp9Qrq2JV}hE=`8B&@X^ z^J-IRG`okXXzyUBQaSyQ#xTL4tL?>z<>3g!^+0>%Li0DP_Sf2yN~O)J)Yq`BQJrKT z?^|D?O(cPB9r^Bi^6fiyG6q`~@4hGBEz__g-+xbjw{o(qd4sJbI%<0VG|j!f7@F-n zvAP@cmQ)Hnr3IkW`C@%c5@T+3c2)jmnYCqn`c(+S%0QP8;Qwylon#2o5@4gjDc#8q zVaammKIF#k+|2eG?%Zp;^=kRheDxmX5uUJPW&w`TooJHCk`K=;k3wKC$!29LcF^y{ ze^%Z0v5m(r?gbA{1t%Ta8L0~}>fT3{KYI^D;u9VB+=~*eVP%UM>e}A*wI?u&9(}hD zWKfW5pN}j=#`{^PHU<|=`~63j!8$eT02$S$srN*uX(fMZDXyL(Um<>ZxsMeBa?%yQJn&17QxqmM547T9`ALF-!@ zoR@LC7U>mzT~ZLg)Y7Z0oe{F&{DC^#3p0{7*c{O}WhebWN7H&hr z;_4`Fa>=?%WudwQW;08^s)s8>%L+2W7NUc8nsu0abaC$svK2kJ2NVJXJZ5V3!jY)y>*T5YpcAX`1cXrXUMnErqO}WKyDIETHDJ zrWL-olc|jMadU$Somx$3hna;nATx`}2buhfm6~Qu=|arb#VK8=IaGiJSu#*skR{g& zvXnfi4UMsiRo9dptTSlLIR&Y<#Wr*AAabuNYJp&UR%l+$$>U3 zk64e0VmrnARZj~Yv7V#Nda$ysp7%HF8CzVB(P5JlV_P*)^6rOT|0WS=d_%2{avkOw ztpr8}ezaM!H5m+iceCP$7gr3E5I99;kD6e6fZUi1xkZ=^1z0CT91QRY;E@U;#HbvE zUpp{d!4*y?Zgd`m>>WybT<5DEO4{ zo^)UbI{D?mBbY9w0;jNbsDRcBk;_VCBi`z6N;s0vK>!-!dD!`K5D-Y$F_z1_b$%vW#lyJOsaql4ps zclirCdwHMVeVDuVIjFOS51>y~v5ub~uH=~n4K>;2YH}mG5s%CUzgou?-kQ2!^>T$x z+38o(qUgCLH06P^rW`J7%0q>wr0<%hL>HN+q$JanbgdRmnH4@5o@jOpKUJlMdgRG{ z`)qV8;4KlR-`C8B$>JTG+2;MGYKT<{-$)maRTubfO757jr%zo{qkg^;w@x`s$PeuK zUVo)a>tNa5Mw^}2qj@T{z-U`}QWlh8jimi)lHz1#IN;y8k*~9qwH|W=`=FA)(9|MB z71N8KraWso&0AQs9eZ`c6x_nfXRU@e_A=vTPOP`8+mZer(|%uJV))6o?opPc z{Asr^-galyzNgUxr_4U>VUa;Oeyue8cUcEvRWDa8F-*oU$2p1^E}DX4Nt0tp%RwBZ zfDebG3HJ`5ECzbasX@W2vC)-pm3`Tj-{!S;YhuxrFF=IJR!0+)o~)1bwanKj9{q+E z=*?2FrSLw8VYRNhT@^V>Dqfg@i6InlP=Q7>X~w#gW(>K>y7uJ{GI?Rz*Frk!XQ|LR zN?EG7(IZ5G$+Hb3Q6Cg%Q~O4D-p%yRD(~6b!1W*uy7NAGn5R_Iq1Nl(dDVcO(aQr( z2HTXed}Cl^kF_7){EUD4Li0vY8SXd;>#{aOXGQ$GBmPY03;e6Fk*4Fo86<{~dL`Kb zMdl^WDoSzuB^J&KL@K;S12Tmtx349i0+VusJYA%7D{<_uzgd%HT8QdYBF(+0{`Q<+ zg=||0MyckeC^%rDwO6ZY>sGI3qR+~t=7y2+bdin0GjnIev!F_UZg;6g`mxYN6l($bg6fA z(uu|1SIriT3V;mLDuRTl`acyS#GVMZDE|m7F}ZpIVYyNLy4W z$Ufc4&lJ~Oy}GYMS;)hy=YFl!)N1o~(-eV^OCg*^Eg!1!8T zE{56ytMKm;{#{ZPeVj=u6-BRx|2E4HGYY06yl=zL1Gz{NyVCq{85^#T7uR@XxIS52 z`}@PiHESz8zfcg)a~W7~WiFhhTv@60fWlm$Qj91uyJHl@#9=8ZCcobhH5#~a) zbgdeGt``(|7q>^me( z?ARc!*~HVk;AH)GpU+Ax8z4%29eT06K8Gq=*|l|t0&!flikKN-PY1g$Iz&|9-jhod z=Bg3()xW+BqBybTVnh{)<4`i9*sHA_{^4?n!a%qfQ3c`_>_khU z9>~0?wIL>E)+L@?qL5c3>TO?Jc}p?a_4EHK{_oQ{J4+F0lE)HQK?DMAt=46u#)^6& zUEuP%Q>o83`uh^o20?73X7QV>L@q69qtRrY&8XDMEv3iik^!#{I*7_(W@epLbKELR zt)_9*Q$P5IQY(7>kaI*m+_^m_knhz1K&+EX0Tk!fh0e|sN{chLYJRSm%2`#;)&^?i z4wbSQ6dJ3qt=^V_AZrQQ`wg@?y-TW@tvg}gkD>_d4bAhhBZeo%^o{2=O^_(5T5 zoIzn}Z4HH$C|z#sh-ej-Y?|0$RIX5+Ex}>Qla|mpU9Y5vxx73HpqN55vu-q{kXn(j z#X&|3pDX)fN#sH??N&^A=<|V(M6a^1syQPA{tIo$sb5=VloZ5XF!@MqlMaj2Hg0|E zf3d&{(*&BzCkn%;*~x<|B5O$`xw&{q3YfRa=wFKMy1V!*-PK6uvbd75b;-h)EISk} zIo9BYm4t=ndIz=I)GXpB8+)UJBHf<#$%u-b)p|a;ic8N|MIpY~mix<{N_|#)@QmZ} zaZ}2%!2D6OF*Jv-VgCq?3Cmph`PJ3uU`D0);lUW{G#7@c58Oy>=ax6Ax1m`B)eyCd zWhfufDJbZW!3sQH%iw%`WqyKT(9DkQsdpgolP%EuM3yg zaQSRY=xL1k%5O}1tKs)mlUlQ4k&kwepF4RKO*%+WfJTcDH8-fqBrhE57})I5bAz@p z_MD#VIW5t1gBj0#Va(egxaio5KREDwuz?*$ts;OM*|X|D-U@2Z#}nRRztwU5G9?%y zqv=?H=iBk72Y3#6q$3-!c-h8gSX)2$jEwf=AXYvRCpJI7n!L0+*Y0=q0mSNV=S!>e z;jW5AT(ix#@pq`h-&LjJAkD{LiPog;mM2R94ux7{v+21ymq75n(;>FJCKQm_=GOq( zQ@ck?)%__MQiLCE>1aRciG2qChNnqm=TBQ}GwdMyY#At0HMg|2jdRoBY$_yxA2o$gevi4q| zZ76UB3b+C_ah)a0SLjaF8Q_SYvVujtl@*NcWI8qAI#&qU20Htd*%bxvfC3gk0W+Y$ zyLDwK;KM!pf&=ryQ-kcOLH2Ytd`J>)S2u`_>+GA>y}CBgyF{{5EIieDv}zpjCs$)Z z7YQnz?~EUu`*C$iLYRgNj$Mn1PrPWEtvP$G_ zb(0KQ}s)VGR$Z*OZ_*tT7fxTTU!UxgudlpI14EG59m;sLVTn4i-7IluB_G948fu;5in!&_rh}}*i#c| zoi86-w%+ZHYHQ?8toMeWM7v-{Zm-F`t_xx5SZfF|P|t zlf{#vPjT_Ep1@#BJ*c_DB?~LM0+P8Tf&syKw-I0*;ENr}I4@@T=ynA@h= zhPQflN|s0U(qOuakY9^zyK7JVp_h9|j5)X|a5KRZ#TxcmK=~56dj@bJe`2?tfD>G`c ztnob~lTEJ3qtsd_n}AM$n*=oq=;237)f~}9tmddLTB{*^Fsi+r7W9?uc!#={6SniE zHlXQY4nYXjgCQ(LQ3xXjla`$O^Sq&UQu^VcaDSo{Kc+P1iXT%sN&?6DYOo>{7fvppwM_J(RzLND)PNSnj$($d|{- z9(wo(L3APf!vfzt{DVL;?jpWI^%S67D1g&|w>hX?G;)M-_cV3O`wn;#@J*`zL_oK5M% z!HWlLq4MFQKlGp@6zVh63uNPd4hygw-&Ip16r7V7_8maux@> zltWte~pa>L4X zz||0()V=y&ycBz-LnX=nIat9HFaLx-<*i8C)^lDpWymo=K34I*}Q; zU|4A(2e2m%WVe@=lPnC5T@c!DhOuJlPkSaj;XN_u*@FBoU3-KUhR!fn8fqGJv2vB+kuxIlk)A!)952+Z-hpjuzXO$l7scgH zk1Mhr=Px#2Qb*P~@L~;usXEFy%h@qTYD{~2Ud;b5qTP{%&YKz?NYRV47iFF9YqITy z`Xpn=_YwW#`ycDgtoRox=0G33h)?1NMrUwNnY_hWh;bm>ChOaX;4iXick3r_WC^@a z4ky;u&2u!Oy6}A9S~?g&d{0B_&@V&^Z3Q`dVVDN8)iJQe#auq}QFd}2)0e;_z!L#J z2y6s#e+U?2jN^_8E_o}Wn!O;*unn>)ra?A6-I#5SU8+6X63_t(=vbXYMDeR^)qfB; z);R(kaTx^`j*^E^|G3xRo;^R*Z;;h*P^kZTv3~r5p?;uHKQp&76p-hh&5sSEX>LaB zW`HAhv%nF%Ibg#M*$>!FI(E;I`{$>!joGs!8dqeS0vbR?<)dxl1P)(B4x zvZn?$kz~ePAUOscksJq(NKOD7l62*OS zP;})P*UV)X+SFWj0iMUZ5fK`~yJ!fZkXjMim|fMxBs#yU8Bo9^I?3AQpt6QGC}0v@ zRU7aFa{3s9wLutdoetU2Z-%Ei%>r)bGz;()4z!5pDPY4B72Jv^MG#z#i(&}n`Ybx93^MEuGKwzcu&M{z$m=H$JhT~Pv?=vubqvSa z2FpTe=WpOMvL4P|&rL}#etC`4?5AE@ovHA9%}X&BL6U`0M>T){98Q~`u7Bu8w|@x1 zMvb`<(II+S3+0BOeKH|{2Gjdw{PfF$83e;r@54(iiTXHLMS+i|NxNeM5KCD~-ly9d zySHD(`KxbtNUw7TUtr9j8@4nyp7FAQ`Z3>?ApU$ zW!#ty;|z!4u4aH&8TxWkU)JnP!}sWFVLh?BeyGb{fktd~)<>~pS2NqShgddgUU^yN zPG|)GH*y7?yLI#WgroEFEm}3VXSe&a+x+TQelX5=`71Z_gS#qKe%Sga*SiTtL0OjC zK#Pa2x*<5wE@%rOQjDv42o%NpjOGT^By3o>*mZV{75Y0QAQ|Qi z@K$OZ=n#`m*I^RBr$Sok3-tkGXx=Lq7D0z{1+KbxKnrVF5b1U3NUYAIKEj zfnBCjaainQ86WnEi#OV5TH>q(9zIm30Hm6;E-mB}Y;bJ4?szG(6p_rQ>w6lwemfhGJfvHAhY^hZRBw`Lm8z=y zNbFt9KS?7IkpC@2REdu;&*8FmE%v73GS<4d%(EjETlL2OEspn-L?9DvTk6utZ3`zb zraQO$C?IgF-oousVdmWSSQS%Wc9)nn!p;hAkA&|FK9#vW61lB)_xZ)#CT7hV&AH9n zrBZ0Aa0Q((@?5<^l*u6M)eNV*KKUB@(xABBnfKmhfux>#xDzo0brKSzisVuk66fkw z$z(7{+q5_=_L9kz?F>jJ*-sIO8uEN7r{@}^jHIc!OfJz%5@g^>!AU`ZX`ICrP%jj8YcHk53nf&`>`DY^$F=r_p0k9=Y`Bb# z3Wov*+VU?p9Y2Q9_Txth>;=L|eyG%t?Ouz+_YY{bA&g$&}{H^OA1ZscH0_ zBpdxS*2O)7I1cKUq3}Gz^03bBRafE_)O4f95ubnAF8299$>@#jDEAX|{~zk!2g!uNd(2{0?gWdk7Su@O9tiZ1al%I>= zT0u*RSZeH!8Z=7OQlOI=106LsLD4QDO$Uq`Fk+B^QGx~y8YODf*!}x__dfT&`zn<` zh&}c%wes${_nv#sKKtym_dfgVvk!qc8YMltNRkDUDiW_6|M+#v3*s!0m@IVS#X} z@jb6E(1_z0qk%9UJC6IffN^+*OJj^2cl_6MhXmlBKj0y&by2!Uw+~9Cz^O;+?TaO^ z^$Bm+7c-aAO?hVA$33&Lp6%1(JC>bB%P_7rIN>--fOm%?<}<$^f=Bi4nC>Txjk}vP z(;n!t%GlsiYj(u<|A{HL*e5kuW#qKADl>hWg!#kF()f*qQ2& zQFQ}5LdyM7f2rTuT6H*r?)N_MYxcTUb=r9cP7j2+(P8JX9lbsD!~?hR)?Vzl7nmdM z#lE-eg+9|qPw}okkPZc=2n$P(e1fA(hBS+IUWs%={EGzdy!8_CN=t84TGmpYk1MU_ z!UnYs4+)8lcFAoJIeQRcY34(A5gCTW+32}!aWDOcTdC|f95MEX!lCUW#7-=iFnM0i z_lF8mztEp5MEzoadbQ>emK86^gi?LU5JLFZTRC-R8yo7wsxB?SyenA>c2vt!O%N=# zOcMlB!{y5~K?sAx{JCjadF{qa%!aJ=dZkCP;_Bu$-Hh1{3sPM3S%JBBg8}5LHB_^L zDt?tYjzPv$IJO{KCx>GJAtbYnF-P)sJYw`<5EqiK=Hlp(y7cW&fRA(Iv0yI-9TK6x zPjqlTh>=_Xr9g5|M1d5w1pb-ZppGZp_E{lenwPaRZ+h?9=7|qBrfm9qZ>NNBJAD<% z?w}r@5`X@sPDJYzKu*RTcVLy zbTuvkKiM+gVl?+CoiUnix-mv0@nO6KEjJrHF!e$Qh>^N-izLlhtD8f4b@brbiAr<4 z?z%;M6dC)T7UQ6Af1lkYA6(2U1)yn`m|db(5@Cq&iY7>~3?q@m*f|uY#%^UtjF|6D zf5+f21Q37t{)Z@92ScCLwm8UL$gFiNFBC5$sR2x-<)DvgPfn@S%=}iH z#1S~N+!u&cA_skYHheZx%Tf!^E)VCCH#*V3D2ylt8b*?;Ey|JP+4qSSr5sQ?qm)Cs zF-qZci6kkmqBHG5GO2`oXp>4wzU)O!%y7JC%b8AB(WKi?hiHuuNNn;jn7k9b8e;Y_ zjC{BFW7Er>enQq7g?~fCLgBV;ZY&6CmC|gwJeiCB&%$wp{?Da`vox<4M9DeP8M-za zOimU=O*HJXdc2&Tu_E365R(2GEzs!f8@gLRv*P>g%+jQ`A?bF7efhObbX6(-Y-jwF z@_`ax$RT(a36cji+1#mzEMKKZR!@*mKHJjYC~$YVrRI};xV+crYMPmFz-MJ?ZZ%>8 z7nWx#OMBBF0A0G9pQJQr%4l&+5;aBTAVngFsQM#hHopKiWZDVd1}Q-C&i$hdF75!C zU*5!DN=fYGv%@MuiGw6aq62ubq&1hcvIx$R{?n*6kRq&s*2Gd1!r9DcYShk>!WeB- zA+&UNcq-Qf;+ycN0J|JW64Lwlax7Sz_aGrhmF_vaEbFr7R3sQpTs3(2>K=Ay z$RVppRpl6l6hz4|l>VI#V*QWtje$$kWN_|dnGZ1kx0<}U)ns{}FjgivWyjlI*=ouz z-DFMKqnoy-ycNzQ_r)oj(#Q7e|C3bB8TZGg>g^y|sBo&D5XuWwE%%X(s&#(vbE4|~ z%w?Qu6sX!)MiT-?KMZ#wIy5w9p6PUm?G8!0FuHrN>hef=Bq_*;-}#3tf=QW zAQTzip=u2XbMJyW;IRej(0SrvK*(<-42awQjj2Pl0cG!1zfcvSZH%&gFlQK*Fju$f z#8{05C5O!?*^-I5BwH)_TD)RYaA0CZh%HV50Upi9WHpVasfEU0nYaC#yy=|A3@Z?| ztdy*_lx&iTCv_Bikk%M#kl!w?ZA+E-c#zf^Yq;lY1=g@lH`#dFp&J`dAi$U>wvbh@ z2$ANLLyA`?%N^t_do1pN{ic9|DYzckX3V$P>cO^R1H1VX{A$i-|n4-?%S)Ito!!s z=H%I7OV=tutWki7&J->Q_>hJrNHdT7b!!!R zY^ak46t=&a2f6ewlx3-+qz2Ef4D)&u?4tt}E1ei;3NReMFC5_8E?Zau*%Y`3NgWa= z?!h974v8CV)k4`4jN@aMo{jXh^hTx4jU5j(rP-GyqFh$+ipNo3yx~0FBsTRaO^HM_ zFELQGM_eBU3c8QZXP z>bkvzWbQCWNdx6)ujOtBnc<{*k3%xQ|rMiS<4mdrH2U z`XF6v+8u6q9XiL=KZtiN0XhoXRnnGU#1^oc`sBOU@YC~zN+3y;Z7-PgcBQSj-7FFO z>gM~@&vG?HgSDLe@+O!dEgDo#2l_0yecKhUTI;5RPa*TIQYkjN!8y?0jDC+BoCCcI z=`PZMPgvlXKFbPRqnoV2bw?Gb;*b%-n~-2g19{fObved9e7VRyF;7^bWK@d$MtuVs zrPtZ_q>=rh6qTk@$c^;I&C=5rP;#@UA$^^*Dd6a1)`xXQhQSS*`A&HK;>+FtfI*>5 z3;|{W##%`346KFZc4IB=sL52P39GPV zsJ;z-o^H-DjUGU|(6imE+Pe0zq@>0N&&9|00M;PrN zRy;;g)sk_V*U4Eo>Wna`0)0RSo3Y^O)E%(F=`Xye?{z~^Z=TpZKmJ%6UyaNzK?Gg3or*=ADrs-AZ8a*H9|rst+VDkWs3+o%8L{kp8bv6NNNzP^$nPX| z8TI@kJwJ#rW$oM_rT2auss6(FXTb~$2`Kav%6hMUGKmbG?K3b%Y6-4@) zf=FNY{6sonsuNcKH=#FkzRnb$mZF$H+0Rf;&nEBJkh!~cGp<4V=!N*wYQ(weDBNPGvSJkSfn!1&x=R5M8j7MKD>bFy-q_jV@z+spq;9I|2a{p2o%C zH2iuJ1qj5Hg)dfxu1&h}C^3;$nIA<>ra>3cl?-incP8o}VJ+zD%7UmweD6jN(&vn8 z<(xy}uP!8Sufn?byg}iBu+6i0Ozs{%~fV&F^R4DsE|WFo#h%~Xhx?pE`v=%thSnHS-7v8!5#?U&yQoN=tGYsb65Kdg zUrTrXkn=-$njXQlys>E=WsAVpvkct;)cmIO58Z2ipNOfVxT{(2zE;xBtR}(fG{SVk zha#6S=vF`jM4P;*-scg`IbjS1J>}!1dl>Q{?EYJibX}X)*vOL3y58^Jz~iTO-~O4- z3wdaX3$C)@;%1v4c5n@y0h!=IEf6t4z5lDi3J~LTE z4e*?{SP}t8fwIyUnsc34D2zrhcLApjAZ=VR_e36m9l^{+FcZJ0E9uFh!>6W;-h%_4 zkAkB&a%-T2Ra9Wggz!`W7Rl32+CdY_3((OpeAgNO@(;vsJdmLem(rx+Bc!t=ku}PO z)Kq!O8e-5srP4LEbk%_$MDbg%f^kk=u61WTHlR}|6yg<7)7?MKzTt`5p6<_|ba3*Y zhGU+G7C<|To$Zi1SCUDi0kU*YP2*?hdAF^C<}*z=bOtZv{Cf8}qF-%CY2qbzjc#NG zt6VAGNre{wocC9=It^c<7|Tczjb)>_ z3QZ&gciw3Du=Eq!eNKdOVtoH!MpW0h1?Bntw8|+sC|4AeN8(${Ob~n(R=_1{R5Sj6 ztgBq|B78Tw5XDCfkCbFQ7i7FHuyb8vgfbUGx$07DpdoRA7i(ixU0U{4Y2{5s>?x;* z@ZGlURE*LJTobk{heq2PgCu8*Lv!|cLUD`>9 zi_7>Q+sAXxi|pU52_9&DWOjHEkMMvMC~<}4wD`tzv&L#vUDHIcD2C0nhW3fkqmk*E z)1+te{%TYln-WYjb(0{3xDC3x$+`E6LBV@hH*rqXJfNK5a4at_?(pJL7;1hoS-%UQ zj5CQi@WLxgxg>u^cFKI-7dEl! zXqFMZERy|hmfVl@Cc08FWi0hS&yG&@nHF4twNRf^b&?5fJi^OO*-zEX%U&f(=Mp9! zgWNs*%$GxZo+Hp@9ou2;7TgHZ=Lh$6*%hWc-0Zmva4Y3-+p8p*?r={}cm4KoPguu6 zGy)vVJU_r^Xs$WK0cVq709+{t++HQg3BD+lvTC#eaT)&y6hkFhG}+Q!QYvvklA+Ffv&^ z#pz%_^SR?P%!OH28F$`%MT3?F7jJw@LJB_<;1n+K><%z)FTl970ORf{V5BO+m^(8X zfIM6+Kr;}HX$vZ~3Q(`%Qp>1DoIvZslwqd<+xzD&6ehXVOIe|F@ZPdqrVk%N@-=IITRB<1H0_hm*mNqq<1p zI7&&Wp`<8s9!g3<5n=bY6p_8rUz-hKBc=jP=QUrTJ9Ji{;$inop|D9vN7BEd$>yb~ zd1}(d<%ak}OM075G?Lh-M2y@)Z8evQHN8AytKuah8>64FU(CK>*Lg{1%h+@j*j}A` z+bm;q?l|FnrlT;zZi8$U;B;J9?$?WqcVQJHz_^`1rCUfj;dKoJ$eG(-rH9`=A<87A zy*z+4q}IFjnKZk0P)0`?nhgd~P&dH{~UrjX^Zy zWYA&PL?szyD`W@}Xzm{dJ6y?NhkF?8cI9dyHGJsLKh(PPak^#`bI%oh1C{DP8y;V}Jjb;(L}} zqcnS(^n9Jt1$m&Z%$e*q^$>+jsGrmgk^(5`c?29Lj>c%M`vT0W)d+%~3ZHQ}maXTg z*$%A2vjoX7N-~HB8SX{e1-QoxaBnQYz4^Jr&4hf@haQRIb<1glHjaexd9>Mfa-*QO z02U1sVug#~0>XkQCo-2n6o}tLckHyZ9jjc~8lLax`9yerfczW7^Fut}9G)-2<{loO zOYeu|P>{uR@LVkhmm#h4NHQ%O#nX(|PZ6z86M>&%1g@FXDX^v_?ChE*8aySLo=h_i zP0KA2xcaChyD^0fK~_0C&q$&|k_AY>~g*%+quIQw zXT}=0YpB2yryM#?SLgbmVgfBfU&I9lW>y26kHQaIHwdHFjWM4^ZF&|)0ge6n`Dhx- z2h-eqyzeZuWp|-1d#7rPkG-jR0H8V-aPE|kbW|;I0Az86UcY ziLRz>^+?&m=3Z2`c1}K;yBNe~lB3PRfl{BmOD3X1e9g(D7s14b?N&@?MNYpf`O*fo(HA>VQK}ovQFXCguW~dcl9M4lEgkU zGgA0aocs$hJ!VGf&h*z@F)>N@@cAp)uX-~+caIV6Ccf+PMwfOol;k!%OQ`5NCqjvl zp-)>692PTSXlYf(7Klu=GAtZJ1n-0oEr^D7)(i9b1<^dY5IdL}WQ*dz>6w(loRg>e z+?$XWB37rKR3YOt41UsmsB&Cb*tix$`jl{V=0#{Qgzt5&qW^JW$kVt|f>wy_RRu%a zn~vOvAM(NbqWJBv;W>uiDa)>wN33+%oxZCa^E*Mk5rY?4r^?|bNyCuhBX%cU(m1uT zk%bt#5qB?~ncE?-Qxm7^mD1#18S-99GKg8t{Aza#nZv-^ZD%JUX;EvburktmZ5;-# zWeBfmD4FFP`ZcpXb9;4lMN6ZV_`TRx9BQ>GdE zk|&?|?2Q}leDv;TqqkEWN;uD+e&X(5|I^=m`0l5ox3A)1-5&1Wck?apc;=RW*vG?V zk~n=b9-05GIN*~%ye}|8=zG4%2I6MK`N<=KBHr+F=mLG(>fQJ7S8n;hj`g4ZcA?&9 z_doFN`|o`8Gr#mIY@g_>s3bH-0^1t1(bmA`E2@+z11i$mLET5<@mqDrhdv)#6|ZP8>q+B zUUbT^Y2ZYSv6C2D-D?Xx#Ei;!92}Q6j`~=g2;;T>ET<=GPy6S>h1NGt+;i>Uv1z*1 z0g6}A>HsF1SqBU{!->5ESmd-0FeaAt&;b@a3+gmF`YJ*bo=#bkJT~BsP3Cf<#BoPB zxx_ckVDZ4)D;`D*Qo>TU^D&vuQ#LRhExgp}R=5`XJf$M2v*h9^tL8m&9-=Ct8QUFfurQDHhUos@V~xBXewm}v#o*~*Ubi# zCai*uX+{K;es1yWgJz7hT`_H6Un3mTxaC|>EaX^(lg~w5P&<}#892Kl&mdp zK>|i;%$JkIS!cvwqSs#G?{EsgniR2C$?TE`j| zX7x$U+oR=|GPPi;WPQExi4ams_Z|I-Fk+2jYnQc(X^b@sW1_VSTb(uRdM*HX4Hw$S zZX9{P@<#*?8pxc;S~#XF%^9_Kh6f!~!=EE!3n{s~$lj!%Y8Huy_j9FDI?x0MV4@l# zC*y@;QBBA)3r^9a`AgYmN@C&MZ}{)#bzxy=2%VJlxTU7&jwQ)WN%@Xdjp-r*jDhCv zLNVikAcRhso-HN`4byQV6|jtoaRDlula}E4ArOeIbjMoHFaD`zgU!Bv&JPrEEkH}{ zN-yO^!H$xS5z~W)j?l7>F%{9?mdX*(_n|ymoJ3%gpFm&Q&5|+=?}ApkHZAFSb94HV zWNbq+eFHHS&-i~>f3^}i(vw=cFVxy}8ofFp8r4;}r}Qm-qcTWGFJm4>G3CS|*dyjF zChwtGL8R}g>q0HcclCWLi^kkJ}yFbM4!C^U zm21+H`%&4e2}S|qf@K6=K&`3_ANNMxI-3I5V9gSNtkc!%>Tv>>D+pzemNs~XO@ShL z9!7w9YX!)3j&%GH0MkY@0%cO-R^ZSz`%t9JF*i9WV?@%p69`~Tq+Qt@><@twZPOym z-il$g6J*6!*%1>)t`4{FZL|~KDGa=_gl*Y6Bv$%2G$L;+cv?~-bV*|Ex;`2B^J_g{ zR48t|#9DFAm5Mygf*BdAF4sArRHcD9Ox%YE&k#sMJrKTChJ4onkEa!Y7^O3EC}2i$ zI~Yk=IuW*t{E<~^7CaefP5Bxy+En+IRyS3fFgCE&ZTWZVZt;=^dOCf1J(5Y};*x2- z!pQKN!`U#z*il3n4I#S%0yq{Mw%luh=hc&evK&JMkP`6{C9;I=+GwQ_TM30Wl+r_# zP@gOZ4jI|Q^G&|SUmpU=Ry+y_!!+Kkbq2#H7^Mi^=$z`_cX0?`4T3PP@lO}Swj|fG<;@)B9cAAz12n?zY z38GFb7Y&qE5ii$*Ky@O9IXF4$X(71<^fwEMafYvn90YiyMg`|<0)q9)j6^?=DBhMKI z+tUNVIbjgiucNG^9wGe-h(QskU8iaMn>>&P_utv4gR#@MqzFUZTrh{p3Opgh-aF7b zn0aWcP`Zzwq)Qpl@lOYpr-xoe8x*(?3tXM*MfxjB2ekf^(gCesc+O1mNr4pru*HFeWUI;uVocRazcz{sA@rSi^+s zrC~B~_m+I*?$MR|-MTV`7&)8GKuY4h88-dHLHF@Uer5OQI$uM8P3q}xZK&p;`t!NR zP8@&kf^yCT(ni3#R=2nOfU(rjSn>?cs*H_wiQQxztSr@M8+Byq zrn11`fRfpYvWv-2=*m4HTEUpok*a(k&gC32fbBX(;cFyC;p=RW)57@2ui_iuLC(le z-}`A++ULawmiPja=^ALEk_JrhvK{1>^d00j?F&1|b6~-CTXn2^?LBm9v-@l|&`}+? z`?)15fYxqwdyre=_o$0h*#WNkqL_L{qHeEV3S<_=q+vEf966ZtxL$FOu4Bt%@~RLp zOoXhw)w&WLkY6?OzS|f?XT=`~TN&9~0>ZtK6l|fV@OM;7D;L^u0~ zqOJzb@=PpO%=OeF1u(Gou;w-2TfNXDUDi;xx_u(qArMLjrhZzFs@AW@mqi047x9KLMgiX3JI>@^^-+V&>EVz0{LE@Q1 z;lVsMNh2`$Fxrk@Xygfa)Q*o|43ulZ&w>Swj-edef(+q5~bI#=pSBG!j61q zM`u^9yQjCW-aimei>60224|jf>a5wP&6#_8^nx>zM)QRzLmlathoqi#Xr-br{mBO> z#E1yux8nnx=6=tALHNaRmS(S{ZC}H}3idH~p26K2rUzG>aFXHj@@Ch?^(Kg&ZGP+o zc0{#PG)w7inu!qJlo_w)OyD21D;rZ6Uwwoz_4O?hI9SekEd#-$7im+-!UnQNRv_CV zGA#8=hN2$rE1E@tTw)Y(9s-?q%no6+9|XDuzq8V2QX0o~3aCO`6WaQM-@2_Y)vTuJ zIH2FaMyYS1)iKCynX2Mu>4G{&rB~KpoM4Z+piamdEpILCd+|}AoIzQq|JI;PUEZwU zx;zjcr9@x1PW;GO+*nyrTE^2lAhOuVd1|EWoiy?V-pF}#7F+83x<^9?F7qLxv%?{t|>&2*|HCvVuYp#xFoZccC7Ay{~V+BWZemTJ1v z7js#HowIK?Te8T+BEuw_V~O+RVCdrWQ}bq@Vs|MKO0fyCx}~tuX%83d*sU5a*9ay; zl_uX|=!RB`S=N-(TA3*wQQAup)7cNk1!b+yrPQ1DW0UUVz+FRm7kxn7`!J&4t&pi* z=o(RanmPt=9>P#7CFdm>g^ZP4EkKy3X(rBo2=NfuLa_K!>@3-~#inpAl2I}K7-yT# zD=!9f=(-(>Gis~^12ksqkMdGnr7QjoXUbv;a)v_SYG)e8P?j1)sf>uBuol^XYXXtX z&GjXm5v|#ZRO)+fhAHm5So8k2JEo{%1IVlE{e5`4x4&+`D`xJt)u+POTHQSE*D7mM zI~d~B0t#%(ypNZL?E3I0>3eeDV8Snlj=CoGM5@=M9{Z;|pZ4iYC$vBHf}JDJnpjk( zn=~9vjSO}lw8wmt3uul+>=L9txXE9-%GVUsJ}oO)AY4}U1+YMTD?3(H@N+DGE|3A> z(dA=?L8Y_u*Pp0-83hXPn@uUeZ;W$_@k3$w*RwjS=i%7>820`j@MD-o6K&$U zPw|X{8A+-e+BAJ=v!3JW8q;Z_PI;a}D)7%{* z-c`)TBZU@ZVvvy%fjvluev2;lwwF6#QhnL3*b0`+{aj-g;eDlL9rRa}MIupj^kt-( z3!okPa!Y&hUUbJ%MbqOU%mDOjWijrp>~2kXqjc|03Z)iY7(#?)GasQ7w!fqQ3t?4y z9aNc=N{$>~c%$+0SiQ-RlbwulC>tB&aF`3Tiy;@9d{IeLuS;^s=;iW^u#pXA7QTR2xuT)07zrB#z)*>*a9>yA} z9xj{%z#W*PI$??!sb1Lm+Quj3fXvIdtpA~05tfsJ_JmeB;KF}qrD5S0B$_XRmib}r zh+C6pw%pe8+Mt15E+xLoI-_mWa!_?MOTHUmUnRqcc#_0lywDr5+zsW{<0sV)zP=1Q zM6dc3OkUbwVFgLNOu*ISZ^@GbUL8MGm3soF(i0brLjZ+k2zpLfJqbMi=sWkS?HL}? zO2P<)9#;QVK$fA25pErRzLuAyrE_cwRA*Zv^T9}28XYHxtCRtxULHSYFSkP{GM2DD z8bTK7#e;G%AR$3mOS-YscOdZTg7ETH43qMSYi_46zR063nS;g&DcXiyH>A*p(Fe_& zU{<}uc0hM&Ile0_$Gfg@BHV>BXA(~X2P>Mbsy-LA8~x|_fPo4j>@f<{Wl@_gy5{{Y z0?C^%cY>Uu<{YQRC4V#hIdVyj#3FfP46}hgB`ajaFm7<2YD1mS0SUL}`%^PW&o+tw zO4%{GE(l%pUFU5g?iO@fCqk{4K$S9_fER5-(i)^v>|()Crsq1#+EVO>yxdc)12O#cc33U|mP**bYpKf8v)O%JPUoldk_xBE zjL|FUhxZc=_b1AP^Qk z+qXfzo$AOks1l!;w5(*yKfGW|c`%!{mVb)NN<|~8>a%+3W~-Nbt9OgF*Xsq0wHOmw zsV4BCVSofWgg#97g2oWh^T=*R7qZV4-OIt=wS0Kl_*;Z9%>+i#48F*!NomZm4x@kD;&)@cG@-@RoCmi)tmPgS=C!`AN7{q z5fUNv7J!S}+SnlpyS1@H5`H^r?A#n^8}}EYXB0a%?9_mqq>=Nn0$;)AmE27dON^2` zNk$A=;IY}lJjQc~F{}`SnsL}mY=~sHaEgnR^l*yj`qQ<1GU7=^YhCKe+el*R(q{_D zco_vj^_Tk-#q+wtldDNytt9Ka@Q~~LsiLP{?@0wu8!dTS!PD5kvE5c6VA5KZ1j_T6 z!lU~$oOGw75SRjRB!})6acA=>yVL0%Or(bW-4J&@norrgx!l2CHJ{?ULGEC>vESi8 zYkrP?#{iT18G-R2(~YU3XKs{?pj!#cXPZIBbx&!8bSrClY5VsHh`uV^?9>f$*zC=2 z-K^CO4CvUgzIc!4Bc0+Q4Dv9XJkK9)KIYNDdAuoRX}&^{KY31x;_eJOL(3SCO)Gc! zGR8RWWO+b!EmkGMfh}Q~UkECOR`M76Q?29=1N~y`Z0V?tA@1aUvi9MxMe#PhJ8Z{Z zF2-e1=lrhW=ul;q2V;4JUblhUrbe#mR2Dc%aBj)_X^q@{Mfq%5Qm{Hp%M(i-sOR#% zJV+{KEyrulfl@u|Af+|_S$PddRgPt8LiMThEDvO3{q0~=PN}E_IYwoBz*kB~cYKc=yh?p+-iLE8YdOW0e(m+E{^<4%c<;M@tW_-xDiv82+ zlEZ-4{tNYNQ$2rg_0%Mmu}@QogmM$Hyk8~KjJ;gtuu?3f3~E7cm-|E^AqDoHujgP# z2DU&0WJ3x zwpv&1f(}QKPXc;(NwGMO&;SkC!*)fmJL*?irgX1l(-`S=i;*Nf9Dn51h9_ueZ;5RV zcw>jHh9=dGc;j~l>5CAjcln$TL&QVdiw2*@2r0HxO~6n)Yf*k!$B~CFhIOcJZdN_a z&FXNoS~qKTLjfDPssXogRru8PdM-E>K2R89sn?oJ9yL~6S&dEC_?Ivoi3_9Nbnq4Qy*Ds2Sf`C~%{0vH~~jroBKmN92qzI~szeS&st^fX71Cexp9Y z_2J8%wpza;rcFh5qz7A=X5dn)!6%8xd9rJ|^htJ5<37VaM4hhI$w+6%KVIUF52g{C z>_kxO+kLcIR6_Cq$v!2A%ZDhv;1pmz3Np5RtALChy2+5SOE-p$&>6X#Lt9VfsAp9s zC+y>q(T)Ncnf9eDQuuPY(tT_jxzDeoXTiE2a`zcbLi8`q(cYh0}5Dw`AckzWK%z72Rkow+s0frF$cLi#Z2?WC2NUlU*D5xTrc8z#+A zV2_qm<~>BuCX83X4ufG%eOSW?R3d!JtL(80rPXQ{o#oZ#GAq=rUi_Q?lusm_2LV># zLD``(a%e>MLWDMweV=R~Ku~vV-n8$l1u{FJn~cm3>1Hb4BsI)<0ZN}JF6U7gN*Hxo zU9u{XAFxBP1}dEUi&iA`-fC5O^6&bhOI<}B58vi*dqj`YmVY#9@G6`R+mC0qK{GH?%REh1Y`3w3)1 zdskAv7@A{`fNe;vPBi+BAgbD#I-s4Y7$%Z|>(Y;n+RjwT&X~>xqzOCR%siY_uhLdgMP8|6T1t@;315`bp7ZB4rpv%& zFSt(A_D;5nQ)Kl5;Ow-`b5;k>t5+pm(`L|i?L*XFvRV@3PziuM!GQ-2e{5c76Ky=`!L?1Za_;FV9o}CGp+_ON~EA!$2-4LfG0*@L>dXhSCc*f>~2oUPF zZaA`3W<)dI_Y

    ni){u4}yY*3zP<%>ry_G^o)les-~b~Z1wp<#REc~PL$F8YMxb#jiwdnip63Y1|q zO|tN}NG>puu-NOSM#@#gstbqezKSlLj3GJvJKrsiW<6e$0!!TBtJ@L^uxwPp8af(2K>^W88Sm`=x2={zHQ1UecasTh82R=h5yag5JzigtCI!0P~mz#Y6WmgbB z!)2Vtg3r_neW#L_LugmbOLr)=-$pq2m5cDTC6&lJD{TPfNJAnf9SI}!fhhEpnHcTf zL{{9SAx?jQX%wTPL5 z@z-MNxLzl=P)3TeKkc3HR`!^Wu9iIAQT*~f7JTp*UXd0t`j~Z@_;XWK*87JOOTbT3 zgQ`S2#aBEJNUe4h>s)%lG!P2N4*!;4WQp%=q zGP%y{n38v$lPN=@D^gw?^SnkN(Ni24F~XGD;T9${?@ zINEl@4R~W-^x2K*I3WD-*&lVYRF}3B|J~jD%?~{m^xw}?#*I;@+iscN|88Xe8`194 zC}(pq9HWmvZXZ9uZ}9>U$7zi#G1`4G&{z6~acQ*7)7RJ9;JPJ@2VQB8o#KzVf}vC9 zp4`*!gpTt!9Vgw7m59)W+evlxa#o7D9*`!h+=;r~!AIdQh|WBJ@5XxqMq#I`FrJX{ zDE1Zf{yip0?9T(4qf#XMQ;5nn)Ia$B+Mf)w3@+)ct{WxQzW+QV(9y?Z(4&tZB1e>i zY%KLwF zNel?y!yI7HmPSPYS4cE;u7GqA`XOO)vyk-mu|RX!OBi{2MaMRBu~aLG6c*p775BRJ zyfKE~zZ0B#pL(gWkyrUSqv`l~V<=$BwT&Tnn0~hf!7m~Jc%WOI2lgE%BQ*HcUdtnl zsc-xqra_n0AFQMi{aGUEj$MMra>*2!Ftn=;7$|XtvxXJ7q7mF~aHEOlyqr##$Yv>PYjG0^lE(}e zLtYyrEP{E;8Q2vVofhfu+IA1xLzBO@rhWx^F?HbtqqptkGgrn|$(;&>r?rw**3D_W zfc@OXgO}gtpmuku)3ac6_9^jHr&|t>)}NnaFLu28_;hPqbuwC&;met;8(2Nu4C*TR zKWx2iPk;=%aw!3`zaTcfe)$C4s{fjXq&GktDxf0EGrJcF@UF?#Fkxh6@f~@P^%Sbp z=ru((iaWFcThP@YoR~df<;!F98S_%Ld(iatcnbT*vr0*<{I-Gm!EXOh0P*&OxKWm9 z)!42Urkgw=XlRMQ?2Ml+!5(n0yYZxF-`C?Ozg{mb_i$(Gfyv932y)i$h_1Z6$8>jd z9`RT&s=RrTomeX4gvav!#o+3|`nx0FKJ~W3Y%%pZ0{aM7I-OKEUB2^qrPgDxZ0)?D z*KyVf9*n(PqAgv>o~0*Ku8Ts-o-4PL_8+gT~NL?@^;e{Tx(Ci=tO%z ztMNoUZWsRGKJdWcBhzbp)zdJ3-VS95V+tX$BnaR>U*1QnF}K52y<>rn*V$afYMu$%)5Kb1`x-vk^XQp~wqQ zG0Z@#!4;>XemGNKJl`p*MXww@qFBggmGU%<-3^4cz)C0%B&S3!dis;m_g$p%^`fPqf)kYS6o|TjIzcS^6-HBuBC*qCG=Ls2QZP4xk z8?LuetA5`k>V|r~tN>TBnC|Z~i>BXjoO#02L=gM+@g{L-{)Vuf-d>VNtE`BgkhHK7 zDD*7-l7=V(uWdkMlAJl5HQq(A&6W{Pk#BDBJc?5rALiNiM8t?{(im^CBn7C+3HSx3 zjdarN=oQmxu9>OzA2NX?6vBUtqY6kxNr%%3&Z+{Y3APixj#sGkyOFp5*-fh3%}}l; z$HV>O_TTt{P+U5{+{EfH`3<|)$8MKG@jqzeko3Hf97a~RkPgQ@!Yt7=zWsG1vJg24 zrBj06f{0t89K8Xhn)I)W((R|`(g3-=L|2A09G32#hg$Cos!QRoRG5LcSZM;T*+&$s zO6(2;NMY|qOC0DEiQBp;Dgw!{n`zXf8mf(E);Vu>exR?uK2$A^43`51|0~7yx=Rrc z-ISvXFxJ5scMtF{At|4yf-S!Pf^1!P)Tadsh?;uk{CftUm3*iBQmwhgVdwh3(I^)8 z3}C-2^ZxiF9!CgU*r+d>Iu>H#oD#7H8pP@Zsll_=p96nO7mx`KGs1Te<5Ki=G0$=J zvX8H4Z0k@l683eYN~-xE7`-MC;&*N>2^r^Gk4gHFi?hPLWdMoKy@bn0C=c9(siomx zQfCyvzvqM+#Q`8*u&Rcau2Qc!%sBCO?8zD9*|EAvG@1%-ER?zY`A?--!db)U2@K#r zpZqac*qj3x&>~7QoQpGx_-#12q&S2Ut!Q~1%zOVCVMB1ZNgN(ZRLzYN@<+xLotKIb zjWR^BG*&t_`xM~vQ$s#(W%q6`8#?|8B=h-2XD+j83#ppVb7oUEsB zwc+d{49?z~ZM{Ns{R&$&ZW33scnW@&=B!xyz9|KQFM`W`d+ytadd;PKIf9l@Cv^a` zSltJx)9g#zkF60uh_?3U+?Z2-^dc;26*e}8HNFCZFGrq0VX8byN*w|2BQ&Ze%d&}O z#hTx%yU~AZ_hEIWmBlTbH?hb9oM13w(`*a!KHG;YdSPDGF#88~f{jpPh84GR(*5kp z&1UgtxNoK!<)+qGwUT+GC}0jVfollUc=8) zCXb@z^}wmB^kItOztl|M$7jO0{TK3rdAmyeCy1msR!W9dA9NJ?%IB z%aZ1QTb2a5Vc$#|{bA^;mKN_Qzj#p!Qt6WD=QFNa9C+L?MJPPuB~^C>O zS1-wO=Uyv=Iob3$3>9A@JYbatisP#%r_QyKykCP7UTgjO<*wY((AcdHKp}&6(qyy= z3ti(Q%pe;->|(j&F*oQ64gVs0|UCk+;T6ej!CVQV<(DJX>iqW55kY@VD zIz)9ZM8oyNWK>|RZ!8KIzWP-n=J*>cAz5zANzwh4R1v6mk>j+YvHYA4gn)RY0<)BWko@F@HwO;RxXaWR>>}PSQRLX>H?*p)5~7qb#> zxua)CJtQ@r9invEe<~p3$XVagQC>LPukJDv5);?lzMbnm9)}s1s1Kr_gDAocF&rEG zw!dqJK8zbCXXQPxs+Tk4H)}F`q^MoR)aubulebvi9zq-Rh!7a!T;jQueAP~T8w1#YB=xq0(+LKJ)7hh~tuC*c?=7ht8Zt!q>R?~7jGcKFZ zMBXq+I-*?0q`|VD%99(sIk>iIfR^k_btzz6srS+xWoFX%9%qU-gD@cjZ)W$PC}i;E zO9V~C0+&>d4DXTdDvuA|%7qP?t4R3u2M&3x|L`p`H+~s&ZU%JnKi;5?qW><4m--J! z!CxQi;XL7u?8@Lq@ywOMld$1lGb{6p19==X-!UhmZG`t$@$56l+@A{m!Hyq729IGp zcXhj%e47Y!83-)Ax-Cn@{kav7}u&RcCl*lRhH}{=g(ZIHV#}c7ndBVCfBIK zi1QF8J7>1I^@Hca zl8>1UzUoS0nq!#Je|p9#0ZLCq)UFBeBnXk0k4Q&B# zq)rkA-W8`bkX0$MY_0K@)lCIh8A0&plN*dXViAUwuU*Hc+YhV*GILt496N0K7B2K) zMNVOTi=MBotihUnH^m5p6#l&PuMu=PVj`#%2ZHs@FvLFyUfVV-8RB)2k5Y|fp;Z%(~Cg-OqeW}fTu3}SI;lbgUB^O z+x;J%b<3W2-AaCH%&4k7ef^Fsr{DLQ8YtgbeGuMUAgZt3ngLxAoTj{^E!S-=Z>dJz zA1#&A1fPma7n!BhpkDm#B?m)xx`{PU@s1$|9TQPCnzC}Y?{cpmAzdZMqL9&1?MfFw zEBHPuQoQ5Ht#k**;HT=gfiFGif?F?WOy@}Bd(Nu&o=^*IN?()eIz<_+^a}^G!lPmn zO0T{>_1DdMSjIbqc>*uz-x1iGBA`R2ovnt__#c{PeIyr%!{<~XheJlp=~+P=Cu}Q0 z_ybD%Thi-`d*QP(IpB2?Aa<7NaNb&J3Qs~2b2E>=R_PHk$~v!82;-q9ORIq{{L0S% z(v282vQ$crAiw!&b>?V0kr>A?fRSp0|9jn$-lTltkOTCzcKwxVvhlG}l_% z-cnNLo0t`~Jvcu-7LYag0h!2!nST+LH5Jw!_az2ZfDAV6+i4h*%td6t<%k`b^pZZg zCMtpchi^@Is z3vsXQBlleyANT(*mB#D@W5!HD6R5ap6dDUS(bFG{kydDJ=H8O zrvBK@A56k9N*LG4jMqqIZr=%Q;{b6Vnq&g?x5@VwH~<>&^Bd;H3ob1*buo7Ht6xES z6tc0@FxVD#csbj}fp=4##@;YhQQ=42KQVOY_%|%bZn3NO4_eNhPnY4dQ=GdsQ^I%^270?bc}n$;DVX{=65uFI0#mb8V=B9dCWe3 z`Qg4rnmb}|e8uR=kcIBcsdU6lp@#*aMN&{+$xIwfdH<5<^WXN03Tp%ZU3TD<=|$)q z`3?k)*pt(IDP3W(F)6*Q$1}YEC?mTM*#@*e8%FH?iE^qN)Q3cx_5v|qM=dbJ>|7hv zSNXyq%V{q4-=y0IICn9jBsTMCAnSO;JI_^o`V|=qak83N3zOdj2NKrDl28$}UmXtq zKTgeQITMB3qF-#=wr$(CZQHilvF&th+eXK>&9m!&g!2IFVqHvCjj~NcnB&19jZ|&R z3guLK4%z=MxIAO}>B^#VRkYIkn-!8-6x<2T<6?*(eg-IQY`$f5=7x&`j8t^oMEMblYNpbeQ3YM8U2ll97 zH~{%t6@7I2d#^tevMa>SBn|vIt0-YhuQno{`we>k{TVj}=fMn(Be|LN0A|vyU|t0S zO_1|t8v4HO2am6q#Mi$rdrx@%aR8>kZcf|sq<8CI{qb-5ZoYRweLz)PI&_hE>9i9d5y?= zDs_wDY>l^EX?o|w#?Sgqx!QAWfA7+JTfRL2C>|)FoVe;vm@tcp{%P$3Dyr^|wDgBS z#ZpsPtNxyC%%?K!weq4XP^A3RF9!;6fBTE0epKF1Zzxw7$PEFRt=m*5_;!J1?>AM$ z?W+aX3yVL!=Yhr_DH#n}{u%i^ZJzf#Rkc%1eCtxRRvEe55kDCaEOsHf>iTI$vp zH#0~RGj`5Eh%kEEccA*))30aoaGRjd#_T*PA$-DR{g5$;p;~gf=R9+YuD;yhR3vPMSJ?{(Bv30Xh6j5N3MHg>@wi?*{Skf7`?Tp>JVupqJ%-q z%@iufjP?+w2rKWNrakx<6;;VXik-S`=*5y%p%g*TcWWRn%cF+7J7eb&%VPkJ-V3>X zW`HAiynQeX8kwA`5F6fC2##LoPr(5j9i&4RFXK|AI5>UCoc2oFyS-XU%r)Ose!W(c zXCD$0NcU|2KVwg)BMG_aBhhZ+@G1VOf6vDN*nA(#7}cJEn4P7K(++0=53kYhF=*l3t@e3zQ0Omd(~=S8)w@C7No$Q{)&Eq5y1Q7VgK1{_Wv;hz#B^I%OZE z0oBbMJS9d-m2J6tFklpIXj0$oiPEMekD+p&Hqj^;8od-iu;j4G%)nVX=avxS3>%T&B%Qwnb-376o(y6>rfyX&?k^ z{#S>Fp@5??nLpHG>(JT12nurUeoRODhK2k#NZW@S-yGk@??^%6zMkBr?x6luh;z!j zl0l$7qzAkZ{Kr!h!TRrJm(O3ky*5j_VX^!FC*z{b^gqT0s96If5ljQ|O6x1273-fA zRjb`UdJ@_Z>XBAEov?NH*^|C)E;+fL+@_DG{P1t@S4f&b9s-}8TO4fS^!tO{hOgM6 z5U@y7911+9u8<89MTEwWhOXNBcaqjdlas7ra|77FTq$41?#9N93VCELg)g!%-ShSp zxmT*=0AgAad2ZKTx5!3T-mfc~UWxU+-Lmw!1InF(mg4{RWHF5gCCYmYSwU&UW@Eaf zv^C!S)oKkM`wUT&c={I0)n5|u?DlOepYW9~JQ`bAQD#$5rzRBMalUl63I!h`GS|$Fh!za~YR2 zqbY|Q(|zJ*)8$e^Qv1FVs)^|pgs5a`6E_ad1^4RAMMTe_g z#Lt#OHO;U%JG-C;9R*bN7hmpVAjPSpOjDBB{JF->@-}d^hD(+t^(80lP2)Dajftg* za&T`Ck-Mw&-arQD$I4nPoQm7@HkSd^5ez-3ptc7DW(26~x_w^@!@$qWKtbW>qng8T zWz>6FU8As~-7zNv5|}`AM>V%0L14*{R5YkxiYy81FK({>yWkDDRlD0XH@RQSB6+lf zUFW5YNw7;eR8%8uobXge&R1&f1XD-!ocghOXQg|d1v-b^T(^#P(-pEKK+goU=B*FP zt0Q1P!r=GG!1J(2hJpJvRRPf5VhC*C`opbBsqgn%O!D*FS6Ni|7dA{xjFO&8T*`}T zl4dd~|4)o6b*ZQdnxQ%vqjc$vMZ=Ou@F4Pp%X!5l=l!8nn`b8n1M=>PoviI-@H&a0 zA7n@_pX}5@Wdmi%bqUFfPRFrnzhlh+n&_dEetM3=Y>S zv5ZfMWx$?5M7W<5(0(N$ja>PANv!>eh%XbD7hx`=>|pj#rIh$y-kV;&6YF266()93 z@oJrtQP+?}WLecL#ogLr$%p-DS6&ayp_!Q~y88~2N@s__VejdTEG)ZqukLnJ$>v4Z z%4^LEZhLUcxwN?FGui&%mMX}1cw6w$Ajxwi7qZHV=;fs5y%R;9q0asP8nw|^2a>z=mRxx_uEK|MM5n0F=DZoz5Vt6kJ$-z|E{ZnzU&wP@gXn3 zd++Dxmvwb@JLsh%Sgn{J=-DfH_UQ?Zu83!wk4p1kK$;k?f7@-NMep~tFHO<8OoT?{ zlv8R}Q8iJg&T&5QkH;7PHU%-zW-=z$Y$@&TGpP|K?`V)>z!CqU)q0~p(B@SInmvt; zBXt2o&JS8w=|A8gnR$$4M3mx?6bEGw(n_aYVq{2kIq|^T@}qAbo4UTHTfJoKtQ%o; z<nUoAU+Vx`XZ#6+NxjakRI$_ut<$ zWkE7!&9hQDb4<*1a1PIll87mw)0l$H4dN%pa+P`GL+YCFnK1eLq(7FSISeC%0ql%7qMQB+?8V_dGneq+&L!Y8dVWRL(oMFT+1G`!&uTJ4rjYJHAatzhjY+|Db>t@ z!~lW9fVt3Em>E5$guXSFH9Dp$)AGovs5zw+ z%sE&QnS-_LoGOeCF?M8Z8t2<OVKdCviM*mn@H$UdfCM$ z@N>%Es4*N$MgJG5GD8OAC~hG*oaX!uzeDR>Nt{x#+}csyqMi^%=C$$_87Y6ki!d=u z@Sxk~*=SsM7s}Ce@+01g-v`9;S4f)?A!le3MVjAo1@+^`KJ558SxhzvT_5lws~N~5 zvu0*O?~;%Hno4D!`iWMp`7SQh(OWBOfcm(gX@Ugt8}KHq256dm3<&R?d;dChw#n#hq`q-6ZV#cX$E?{>_uq^29Da+EmVQXXi+9 zg~046a6J!dZ(x4_b145n&ctQ^`__j*er}FjM8>7YsrhIb`wFK2LGeiqj4Sl-h{ysf z@9)rUKmx({o)0H4XZtNta60Y7TiK`d2X`VeM{^Q0!n!8i-l8gkMF1toM9otQ~ouAgW{Rgr?-Ss6& zVt$9Ay86YJ;JzPC2L0vy&s4fO`AvEl3l;jB zwQD?<3S&J?8fvX${Eq_Gl(P_bDPA)2ue?S`FkV-;jnvjrqWzV(-qLS|Ci$#_9@`aQ zCNO%eVwb7wva*5>pcnLfiT$~m8GH6EgKK?1aK6tp27?b5NLeGmlzV((SXJZzso(DB z9s$4-$R31O{Sm5eI~O6@Kl7%6b4-=)<7`GR2c);#S0aqPIN;~dIx5D=uk|`>g6x!AGm`L^M%}f8AUX7kuLAR6 zYI!$RSAE)!7?PRMXOcJIDWUI>Lf~V6UBDkoK0ZD%m{1kAh+$bf8*Cb}TGcU9f4pou z_8fb!rlJ#@7<*@qOy_>H>EOtXg>DD;YgYdy_OFT?L8{Ve4%*g~q?&W4o6lP;4yf=& zqAaY{VD#t&QYN7mWL|-P%1Cj#g!Zk#H1nk2bq{0iCi;y-V?6_-_ zG0J=qyWP~qFQcgzb5ji}N<%CYD17JWWaJ``R?8en=XH8CH>aa81eT;-mC>2aAG2|1 z5nzUVw2DwHU?Pk3WW#V|s!APZ8E8&~+fwM%5B0M9@eJBtSh@o1h}Fr*WJGHnBp^&4 z>lzA-ZoY{somJ{orbI^eYjnR|uW_Xyd3Fk5z5x{6)Y)qUK{#(hXteOEI5LEp0~W0? zSfW;}#7`i-H6Q>+kH$zAvzCqV zVna1^xb{C8R|cDO^!ALApya~f=6)G;9P$$p;-(W?cXskva4=9svpb>~zMhP0Hu)w4 zw8V4gXZ!T(cm;Vc-ixSDX!qZ0?74Q2lz7Pju4j=1=838?>c^EtqXK$}+H#DaIKYEF zmaJeo?OTAGaP(47zB2<^b?Z^T;&hq^T_=9|u=;;C12Y8}>B82w-O-?#XBmK!a&9r* zYI>CEzL#^TgbG1QvdEBgG!S9~QfMsObU+IwntV}IvlRhR3DBIAI=#@%pojW6c8+S* ztLB*1%nc31g8&9^|?r;%9U$P%vD(?y~H-G9`BV^Qh`lO0Yc+jEE^pmSM zG;c+4VaeUm&B3zicv;4dRuDnkESGkkY*eet%|y}ya*@MzksWN*)SBekO}}fD02Rb) zV2Vx)D@a~zx$qYmQsA$Vb<$En3>LNc<%9HKU;2tb4Xq+qD`SE62)_t=(AN&EB9Wl7 z8g(;CRmQRu*U9?iefhegWp8~wnES~Tzz}#Etwz$<3KZw?q~&jmJF72mrrxj-7)4pc zS_rs1?|IV+ICU7iKlE|(bd@kiB-Dh=la7+*)UGNk8j?RF+SVy6f8sqd9;a3<^z_DW zXk8$FL$~u&a_pC?RiQ3EcPnW)shdz5Nf_!LXpXrpF$+-A{y~UmC z`|-WJydL~)D=_yb2ehC45SgDci>akVJ^u)u7D8j}}|6=8&Ar2rza=(gYkM zSBU}_O;=Nkv*%SPV$7IwifIS8NXfSboRt+I$GOP`$p>(q_DxdiMp4Bvk3+>V^z zJJHTD>;;G|C+_A9mYbzFR4M`qdJY!ZwE5B@kCV`7fUPOxI?bO1;d#?}*vgT&i!GE| zuJrGoEuhliERd(v=BU^tEgTcpa>iFg5)RkL^@^WVhX2>4SHhFXx|VT2#v;ET9+>m| zUNYaN0^S+M628|H_@u&5jqeS|Ip%6-dK|_+e#m|0v_fH%d!K6^MnWPGP#_5n1#f8J z*q#j^%dZ`#5Hj%1N3#C|8xFU|NGoGvQ0yzTVW?OnKOW#mGNXRrP}Ho z{oy;vUUxw$%6(%M`t`h3-zk6)&eSTtRT9#%y^ zd3=0{tU?W%tIdbl7zoe~Pb}>BsVbx|Itux3xs100SqnlJGSrpZZOtVx4IKWO(J8YS zn1@w-y0=h0faMj5(Wn$FE&w+`$iJg@f1%n_^f!3T5LuHRV}+Ui5vaA~uts3t8#VuF z`7E4$FR_rX?PTXQY)acwkpIDKj!e##90R~A1|xt-V(Tt&vZwEQ!t-6w+e3p{t?equ z%V5)o$)8sKB?xGr>2V)mo_R+lT6WlK8W9%C&_!FZQDeS(r4oKqJSNh@!fPH60(Ll) zvRBId5RS1~VjA`~&mJy{rwTpSS6AzIwIqs|wv%=2@*+p%uKaJT|?gg>NpR-?HDDXyB7HU>)748%ngbT@f}5|dnCiUSa3?9u z;yQu&(cPzf^2rj1S~ebER_~K%lTAa7uYBRHVC8f>8woX{h548wWyV(JSwIm7goXx$ z)7D}XqAMOfU2V0kcpuIkLC?V3%5d_ z36z*?bF@c6Po}E>Fj92$3s#BPLn2uN3)y?1NVshB0+*;OS;5za0Md$_g(oO*^X0_g z^sFC(NdIsQ)NG3$ZolwE8ahd#mQ)w2XQROvYK(GQbs$qkMzLS8*#L^u#LlNF|C=y6xj9;~it1P5uFT!O_ zht6|Wgs-40X|QRR{TnE86A5yI9X5 z{U{&E4|xP*EHWXVX+;yj2sAjSI%{GRAE0#*q^0}74Hx?eWDbMX2DSo9O9vn5+N9Lg zRiLD?)~~3mTvXoig$~bZFWxuTM&05S;AAkQr|tcf3$-;T$cb4hJnn&f?i{a1nvA>7 zr8Ijffae>Jb%fEHw6(cgz*2+2q5+kj7pC84KCk^}*`JNST<0g}->YA!7^jS&_IWPt zG$Jg4qLfn2mmmikk)!+0u35Phjj@V29K_A?3bGC7nFW|(amz$+zJ@?kEl2>ex%66a zx`KL8H#XF1xUrI0XkI1JV_kzei`j#RELdc_q`uYqh3Mj~Qy!qJIoi>w(`mh6*h!wf&s!-A4?228-RpF?Zs&+|`d+0)f!&JA-5G_ri zpQdf43#c+`7}ZuY%#uZbd&q%Y2OPq*=Sk!mjQ52hZA+!*K@t#l@_lIv9{2|}FDlmkQUKR4~ zkHFm784YaCIy}LJc^w%b)v@j4V`lXZO!lt3xb10RHhWXtQk}?(JwaP%zbeYzzz$sE zTbKQJGd@glIUvLk0x(=sjv^?Hy~Wj(@cZFPP$ep)tg7xLv|-L6*$0ds(vObW*d#ka zeqcp6%r*$?4nz~tjSjKCDRw5V{d3fWknjxcbZF(J}Z z1W$v|)L<+FOezE6Sb1zX1?MJ&RGVMMNz!MslbuOS^ct+!RjtD#Bh2`G-ncsd{yFuv zz7@oa?+ejq;;?#5@4EAgQ2puXS+?MD8_~<5xP5W-Eby_$^MZ>};9t*C*et4W4focn zUMut8JJeny*`gG^T3?-r4}*UP|1_X7{Ln)*J*T*AfwuFgMEF*t7~=n+27n(&cu^mXA% zhz4ubrfZ72_&LoV8({G`kTCEIt1v@ULw{c*jZz(_70^0I5qgZuC$&ZP&n?e<(9Esp z{wm2d`fw0PwL3(IsC?b3WU2W0bg-6$EE7!V=`Mi~atH(!EVT7=Twy0R*AyYPW%{lf z8VY%v)cDcpe!O`#wsGkS(UwZCOx6>RGBpBFm3|~VJ3b}N%Jhr?uGTH1Fqv3B0+SrWCrU63ivZ7@CQ(JexFjiNQ}oNsEv}&Sb`IoUHZ#@pkL}*h>Eg_ zLr(?+b@hZe6P#%075RRP$}pM2-SsWp?e{Y>Le-T_p@yb`=vB4zRJy+&rtYiz9&DU$ ze|jX(k}gV@^PJZ=c*#PWT?VEJeZg}yP}zSd6NT7{M@+e6q+>;_PkB7@qA(16DtoQ{;p)xQv07eVH~}f_1zy;$y-dxR{B!6l|WtvWz;HnVVn|4Z^TmBz^5y8&`P4VT5#JI&kxYvE94wdq7sZ7 zooguG9EjLry)dkv zkBzvnD>rVEk4kCUdEfdrG_lnez0c)8+PRLgE~?f*+xqxZZ~8Jy;uV zT#b&$JC^@c@fC}wf$I|GV@|br=Q$oouTQ01|7tZ{-k@J;UZ))UjJh_}>Y}o<)Tu>y-J1_V)V3!f%QLzbszdM68#JmUKoTIqp3~itog5UX zFa*Hrg&<01f(8`WYD6N+ZK2+~0~c*pQHv}U5>hziv@N9$^uNoev!Ux1$5bHahPRvN z9(VRbij|M!41b)YjH@6hE+ZjBfKo#X7XURd({aTzy~v@q8=j-)Pb31{(n8CT>nzyW zKmCSo8SSCqW*eqZe|7*@Y&>;X|3fwuU1d}w)I@HJ*+gMxesNKit*-EqL?K#EBz%2h zpbI1!-j#|p)`k^Dg36SKMCUTQ$QZ}T+IPl5@jVQ|W+e>DL4x9o{m+ zZQG|r_MQukTmc&@;igmx^OWN(G*5P@r&iU`6_{ovF@=9%I};RmD!nVp!@^e1cM}ba zbws?I3tygns86BEs#_b4@_W(Ou#2k7-mr?sArAy|Mom{H8r3Wzv@NDQ*gasuY?5cc zMBu84x<&d+6)Svj&lNRjs&T{6N{ctc-fckb_r(ErcwuT;$`t@?wq}GY9X%cZ5ap6I za4~J~J~nwTQ8B=RLj|m5Rx0pDb`6=}W|(b}nx~K@-u*?=Oqx&#XqW3G=U>*l-%kD? zJtLwKk6g+0GrD3gJ=ys3QMKnXis7k}(vtfev6j0$h2l=|!E#FNei&j5n;I=}iKWXH zC(*X{-qESDf>>6PvRKi=EO7OiDP74x>SVJ~gWJf!Xh(0Zl0a>FMo1F zEd}>*A7gwcp^uy~Vui@%=k}}*PaQEVmxi5;JWPrjId#)%v3XZtXo7s9d5?63@kL$z z1dc+EH52O3g<3=Ch~9l{pvo=I)xaLmS~5{y91C@QABUngwRvF|Zl~tN5UeEhDf=_0 zdAQ|!JOzvrrY5h>3S`K%TFR^%J#46$aDusFFt1Ivpl z6|C9QWK^#s0-~MQzK-7Qf%hbnOFq;FVzJ**P*Anmc}gxf401Yx&k@*eahNbUo|f=x z3e+x2WFXM;ynoFAoHIbGQbV> z`!tnjltQzYUbSPO&_{ck#q;66+d3jnLJ5a%xCB1JWie@zUmBr0f;>8`cDD@wCSHs6 z(h|=yFpyZ!jJsz|*Nr4fluk^zye{#Q?@GDUGTXuSu@a-VLekKU`j+-*M*TEh~{H7sgWFMB(k-ZAERy}Yk) z2txlDLiG zN02)v;gN9Ilpql8;P>1&eC&+YGL#x#*j6%$u&lvA9#|=esN68~*0y3@xu!HQKL^^u z5jY`wS@`&PqSCa=Miq7Udotsbehp#V#+e(=R7ecrIU|T2tl($s_h?aX$}!)?CItC< zvlCbE_nm!z#WFX1*p*Mt?d?L+lBX$sj1kO7b0(mKEQc<~UDyX_@yCSl#l6+UMw6F_ zP=U^~1J|UZJNDN9P082$_0jV{^&?g+%Uug$i z795~HEysWtZpTB#yb5;sSi5q|(-+zneQTpygv4k|wI3Yf0xL4ebkb(1&J)B5B5V6i z4AYoSp_$}$>3Y@ls5*$fN@Qo(Q~9gw>*0vo0L=UZ6I(mGv4r2Z1PXCQZG}{e&~Vii za~V-L(X@?RbwoBA@2gMPnDjE2_4UY+6ZNZ`>r#N<&-d-v>rTLL6hlVwgMt712xtkh za5nK4`}V7OQ*34qgD#`+5hXFus1nlOL{3ISmM`{g=Y6dyH7yG|%>aWcFYArN^>B6X z9@P*?n0%TRk)LrR_1Rj`QPpD$+LT5GP$|10l8tJ{5_b6@pTjr~l}}#(C(c>{YNR$Jb>XvIv3xW>>aFE#}SA`f1$Zz&0fM^BtDukinAoJWO;*k~E#L2akuLF=QKW<0Cu1a&Q)1Z(k?hl?*tLIZfc zNZ)GzkBNf=1Hn_%9DlYSZ3{KlbiHkR{h(aDGBo5@#@8$}?%ro7KD4{5kiHlQ93=9V zrCUoN<)k(Z(PKbrW%}xaP#M8cq%1imp&YNk9wgMFttAO)nkMT?WSZuU_PjEoAU^>f z{>c8y-1o5=F7DOXz`jtcGrdN&=i8f+ZLWhm5bl%5Fc(PyHOda=h(Q1Mb>O`EzWB1} zQpJo@%VcG0EwI_(JlBXwl64q4HTbNIuKnUzuuw z3Ti+|j;p8#Ah+!B=OBjRMDgS>#iWr+bipf*iqy%8$=P)MirT_oc0jm^i0x_Qsb7R} zlRl@Vb$w$;{`zZ}Y#hw(Sp=Ng9&Y&Bq*}1@%@34jU9(9+bb(=Cz=Wf^=C)`6daho4 z38B~L8oQwoDf4*=SD6pCQb<&>xg|+kY{{#$5|qZrinjd}jt*CF9AE8WJxDY=PHd;U zPA(w8!s3;B+iJ zyETfyXfDU|9QK{0kpb{r*SqX#g_BQYnKCu%KGGI)2FK7jGNLgXYne-4E6+Hz-7xQf z00Di^{Snh#0WPknsbjOO@#72S;DknXmX}htC3f+M2Hn5O$zw}74*vz5{KU?UKCYfv zkA#Fohk?Ab@=0KTPmA(5E=rHxU~Y)$JJsA0w)KW6SysCcN(r}Q>m)|3Vk>}NQcJ_6 zGq2ecvDrXW_*ui4b$e?wdRcv{biC#G=$~;>e^UIQOJF4D`TdfEX&Us`qF#p?@yFSj z{7)~m_+KL57U^U{K2R&0y**7UOv_PEB>2KCai$V=EavfcUZuYz>Y~lm8??~-XoCKt{ zOIKpEH+%^xDNW0fB0^@veK9T}r*Eg-4H1SBB1)Mb`xe~XVFyuyq7%p);u20%b4EAJ z74yFIQ0!_xm}1qZ93)q$gK@5M)^<+r{^HT_Qw+*cvj~CDGui^R$%kLF2ez?K2|Cpi z#N@x&K-+8$)v%On9DjE`-DP9We*qS)=~8>lwxioV9wb)d$QOJVa$WtQ1B2%&dJHw5 zL-sJSRr~D6fiP^eg+nJpMHcMo%@wr|5o+iy1DPkiLab4)ku`&~B*=cCG3oOZDa~$l z2h?WIIY55dp-xq49QYmV;mg7r5)@$_4#whg5WH$13O`SCqFS~ie|}E`Vjw(jXCI}u z>B~AtJmyon?J?c5Ke74SHmuH<^=dvCJu}<3esUkP@oX%Z0L!vb)$8&o@M@{ur2(1xq~oYUO7B``%=D;o5M-cpK06 z&Z#BhfL)%}!tbs^HDf!OX$zqA|H1I*-|;)`x__?skE>*4%wbFQ23+>d)U;<43}@3B zK%7BU*zoNo>;y2RpIT`Ber@ExpVPJ-PeNybT~0%QVItu?vT#9?5MQi0Yn`BMn#XY< zDokSWN7RF@^Sv->st^J$%kUp0Lpg2eZROm#+<~5I`gtvk1gnoLV)eh@R@eHl^YvCL z{<$@&1+otQsh@+G{-K2zvJ`ALW%nD(iXe_pP&gO}iEx}BSS*ut+PN4wby;*=GA`57 z^fUUE?9IRsc=5aQIcu0oP$@={Hx}npN!$ZHV*yo$^sLz(Me67!nq&*JWhGwAr=GS0 zH@(8Nd-FXjTd6;j01REKchOf^jpl!t&~U%*L7-jGg&%k<@Zz@lW8>5iEwam zGl*}@SKx~kBl#2vMq=9qUUuI-x(aAf0L6_M6SE4`VNu~%4--P1`GX3TtwmMjQ`GZ7 z9~`^))ORYbP&ptXuWhal#IKyi86Go#_X~T%q^4X2ab|M*$UQ!8nlG|0n+Mu4QH+>K znn3%T(}MFlK5^=XyjZHbR~=>KYnq2|G#`XJ9oXKdrn6Iua zzo_PqtRe0?LtFpOxW;Dntqvl^^?14LW1NYCTN7A7u1xsk$p9O=Ob$*Pq8y0PIQc&} zdX33-jv;PtFszgCWwAf7bQN4=ZG;HTW&(6~e5Wo$$R9a2y94hRE114NyAOtJjMj2e zY7|6@OZnDP!;_N7R#aeuhZ0D=kX)i5cFfD=4%_{C^#vc#uY82tJ$C_u&_4|uKT+g) z9p0)V%~HB#79+K`dS#2=TL1gWRSYaiQ(DSJNWx zqp_}txTC>f)f{zerFH6<)KHr*)oV*rg8QELudGt9>j%ArBt+c(S87!UK&7MGS?dgnE-%(oTy#_TpYUk+Br1 zQT0!&gHbcv%gETI0`a?Szl@n&Oei84{YyObp1q9&y+Iv8C+TzvBVV#Qw(a8DFuEp& zB7R%VG|gzb_#G5pxOsoxi+E-7svXmb^uOFdi5#8C*?~?miJmpClS+`6 zHto3$WGQWCNQh9Q2M5N)mac^N{(V6rSlUC)hhu!4`W%ga+%~Or<6kB{?cFYUjojno z>9lUB@anS;1O!D7r~(=XqjRX#3WfG2vBy|B1q$jsR+D;#vyM2c8r6eX;YJ=(ow09d z#)yupJ5)fU|0r>c7hA}vgL4-sK4Z687g$a^4Yc(l*)TjzhO3Mrz4*&54Bs}f#m_Fo z=xJcmjzr|F-c?KB=sH@~-~2FVP@A95)Wi$|aD= z3P||E)1AF?L_4==)pB!oqBt0&DHsHNv)yAR+ZmiQAtbG)hBN&g9EF@q9`6)FxY_Qj zqU%Kw_%IQ`7I-lcz}L~qrpgc-PuvKW7csRY`A@uz=@b>RhM;~=yffGy7I2;IFDwG- zK?6r2_l3^If%6093Y-q3rA}DOZ{}s(N$VA4I*K9bKu7`P>W{g%ehj@&#|$F_147+D zo7G6xU3lJ=NINy!=rC_jA8yUvmt8RQSB@4Es}`7={LB z9FToBc-Zp`1_c{|;X#K2!^HIT49Ew5zdze=`M=+N!wdUHMGWCPe&piRcXBizXe;#> zqlo>;rDS9JH*J{U?-_nA(r27XIk4p-XYcWLv5V{86XEr?E~tm8lP+~Fq0dt;Xw^0_ zvqOh?q+@KCwW0PCsvovyOzf~dKRc0~H=DLsr@9&45~ZOrzKE2>6jA;!=M+%oU7P}Q zKKavnEf#FSDJ*n|Ha4bX)_(=Ah8ni0-X+ujOnv!z`{L&NJ!tWI-!Zatv@L7a4%c&! zmB=o2i}}w6_d3VKaS4{eaGOcwVv6!fi>?SFI0jx4YPT?A3QS}A@yARiNl&clXNMDr z*TbDxbi-?6#&wb%h-+)s7kdS&tP2=(uHes5Gb_AXVNvGsdZU(_eTqu3nvvE}0ZY*- zy@gT4i!=^4288qdr6} z=RABi=BXW&d>W;EeIm#K0YvC%UGhaHQvF4#n8&6cHqc+gJ`>R-OIPQLv}U)K8W~@C zKH$A+eUmNBIyw%B*3KBuEWoeAL&WWTrLSmpK#=qnQBN~J-W5wpr#o3)<)J9i`;`6x z0|w(|6{~IG2=FoC4qbs*$#B{3W2iFcWyz#DaJ&UKnF@@Xsh9n5di;UrNU6947pi#S zqj?|S_@`5g(@z>V^C{-S6JmEyu78c8}>eH5N} zonNQC&!Ul25yq*^Ty(6LunYE7ChVr1MLs z`RT^rPqwA*?Gsax-d4(-W$ThM0LCt&S=|%4+_?d*3+$Ea3(W1U1UQ>|XN>kn`)s{) zo-HCxrr7~&g%B(p2~*}7tmqw(Z)@0u(Gl8GO+@y2!xqI?nUG6oW~n9Y_!;4;w|;q(AxYlDEJp$8uX2rXWpA zA_;(e^!~o>qcN~4QF*ymFdV0g`YjDr=seW8gGQcY~8XD}4H| zFaK}~o22F6TObEtMSGnc{Dk@6R4H|GhQj-XX9&P<4YbBt3O3NhAC&}j;f$@Orlq5> zpO}Crk~&|d`3jBA0;&dU^ED&v$r9LQmu}BPHS?X;vRU`zO#QIW?zefWa&o4it%gfa z+AwOXjQ~h6xnw$91WHEKVLxS;Ha&|_UsC{Lc8pLGB^$kFr|O-hl6BnbE7I|1g)`Q| zLG4H&O0o<`s*n-~M*R=Jq=AvMA6+dST*_2?MI9wW_!eWPf^D{xA2kfW?_1y&-GXtr?_${U!lb?= zJY^duc&>(RQ`YYgY*$Oj8IH#c`A|HCDK-~W0ofMxSR z*@}ivy7&Z<>z$AQb@~+mcKH)SEUFUUFG&NlH0-L5or&&Q)ef;Jin#eqUKG=&#psc$ zotS;NgBzF_r74dI4Wgo*yGHn&TVz)-y5FwUlQyj~C-7?f_1yQfb~xsLK!NOBvJ4U6 z`-oh8JM`+Q-<$CMSDP>j{^NwB7b$#TZV76uI)M~QxtL_)nGG4 zu6Vo6-j70k&#OB3GJS6__k%G~bLn+~Q28)(HG-Xto&E18o7zYpY2ee39}K_OePa|F z!tGH|g?60`gg)hcW8xHeMlC*%xmc;Nab-C|kc$j^2%spmRZ?bgap$QbZGt(!@(0ce z`<`)b{%AmS2amgqCG*u3?>_P=rG#Y+l)b_jf*5sN?BI57h=Q35Ume`}%d=sDvBpwf zP7c-EXlXcPcTq+3=~{-YN5$$`?QC<-?W5C&hJTchb;mNmo6(V&P5Fk7y<@fg;Y%mZ z{=in`{QEb_77MCmd68&f%Uw^EQqKyn;YUFjK$t|3wJJZZnF3?7LMqSKa#G=*t-M7CAKdEl0wgX$xVeg{ zNJ-D8@+R-Rk1u`rV|twz>U*;z;?`}p1OU+~!^(C<$lD!&%~Nc^PQF&_pD zF$<7lxn?Cs)`a_nJ{Ai8`9A-K?G(%?3ZJh0a{U} zG=+r@T_=my2DYG8Gg=p@<>z>n9;him<872(9_>!=oH%XU`ZK2KjRXk2lM+MbpOxPi zYInfH(0an9ZaQA&-Ng3);@yJw(zcJY!c?#@GG|tRb-0_^JG$2`y$SFV99*4ctPSfm z>b+TRQ*{E|!EC)bX%jo zh~U{oxlv64OP)n4)7McAqLM2wU$5l7BQutcX4If6V=FjT{qK{b-3Qe7;QZh_)7 z@QZF$CIuRs%h8ik#mhA#k5PE@1)u>f>gz2nX2L#ft8g(teT?IVeXgRN7a;r8Xy^l8 zMx?B>*Mr$7q&yv5T@--E2P8f)mU1XQs;kXef&3-kw_2Ao%6m0c>xCbGfYox5A(B@D zEE^66XpWd#rgfaqO0hcAWKb4u0^6Ul=I-NwDLdbO90JwQ2qTbI!D5!GU3^?0=;eRf zLLE5!+B1BLCj@dTVcw1?$s`pjk|Xg@7rK?uLPVWn!#oU@^d&z5D>H8R)yLE=J@_r! zf?g;xnFO08FZ6z~ljEs%#=bzoGOR*csx)Cj>9kK%m{L>PvX0Ne8XdDa^L>UZ>#u4N z5h#%yb^4HCTH2mcrx_p^oNhs0k)oQE3e8>URkgqRhob_PUs2B+Z0<$hS zqNV6!QND)X&GDp$DPenj#F)kCurkYjCi5J3I|~2D**CXk;s9%B+qP}nwp~wK?Pk|z z+qP?K!)Duj@{?`bIKTJ3&L=pZ;GUU#aQ`va%=>t7f3sL(A7Ev;c4n^&gd>2KNoBdm3^cA5UEdygSb@H@S_96ICGnr ztSiB4I%&YE#4uy8y|~dcY3G+Qs~rSx`(S-g%cv!`7$=>ulmS;-S5DP{Ul}@vxyD9A z$Ec*EdoPyh6f@l8LPztWbocL0jZ(EA^P?5kuirIN=;j7Oeryd?|2nj=3!x!#a|qU^ zlEvVNH$yvwan;xu=Ln9et7%bJZ0-?*22HXxg)<+OvkRT9vkub17!J;{teh{z8H&Io zuE+{0YjXZf#@zGqi^SK&#kHxj5UTb}@7r8(>Ry2EdbXq($0!cm>(VoBUtaj;=6Vjh z@z}xw7l}^*?4B_GM*G^pV_w3$&Kd6oHsFuTl;i=*zvtZG@5(ui*CPR6s^6ywv2R8wDjOS9r&uT_RAlMpDPJHV$HH^*8Q+Ga zpqDWG0r={;nEQp7kMYDzb97U$d*#A@^%lf>@WU3aoII_qdw)&e z6|P#lySb&q6|T8>&Rz<0oThh>^zN%P(3xQ!jtR;15ZXyzWtcK>yTk)TpM!3+JXUx^g-yc&vO?XG@MZ}Punke48|_=uXPTyC8DrGehbxN@zC zS;_#N`N3V(N8h&d>#c%WH?)Tn)eu)Ooz~ar$8&tmvKIBNFg&9y8wW43{QHV0H>T90 zh+dT05Jh_@!aZ87RVx+(zk+_8lZT^9M&h5Z zyyL2q^oZl0SmIP(tU2^7Og2Sn%=OCgKDMAgdIKZR#P0+7Igh{k`16ehLD=C{N}^&b z)jB3>bxoGG_a~nHEwPwpT$rRpS2tVS3F}He4PDX zk2=FOR8;xP1Y^XcQJMD><1#Ic#=~v%WZj>Xr^+1N0|$z(1EBqXS6E$SDNK6URujL- zSYfB~YGL*4*s=TRZ;G4NA3`_gVIT5$Ec}g1dCc8n#)Z#dgH&O6^=*b*6z(U7I57+L zLDky*P&rGomy(y`cNng%s~PAo)vkIW7Y#|DCgn>nZ{jEk zz%&C2z9M;7oaF`a0!th)ZvSjjSz2``kZ7&;^TGoBlsr4Yg#U*E!$!(nw#4f62t(e+ zR208jTE;1tEk-&PQMntRZ^xb=ravRkpi;>lSxRM7SX&irl2=YzA%03rEL;Kj07xh4 zXRO)J-?!ap9QC2-x_BL;Ts6$6f;fXtyf`=wicrUGTM&Qa_G{Fc9g&6 zFOOE0!`q2t10$1#GyH60!^so-?V*FR4bos6-=ysDQqq z2WHsq{vwWfc90-_8UIE^{QP^Y%4sY?Jn>H`rE&zd*L^2n4bht9@sHDdHV--~=YAIG zRMro10FfT^sF33=o{O>9Z<%AcIK!Nu8(H)h(Nvk14tK)B^wWLdP$FoUhzRerVUHd_ z9|i@MJ=@%Bb!0#iv4f-<|Ax-Z$9Qg&uliXjqztU0vlByVEdIw+)J!NP4xZKlfAYTmMzq-- zZh%|POKEe+v1U7Rm!tg=J>kBnnDLsu--DfoWlyqOaW!_MYfUI(7KoiN-Ze!;2@8uG zgWgDREnAZb@eiXxrA-xng_cBEfMpuE%&_utZ5xlMf+k(EGmU>m;21``fz5@tb8=at zs6LHC{Mh1DsvUe_3;nC z9a#JbX<$N7cC1oqe|orj_mq0fJU1T9^s*$=L$C$~gaBuS*Ck!L4jTS~o_A1?Hsyy| zYx6=QyFJDi7!LCrYcQO=*Ps?sxa1`7KC(IMO+NR{&QkWI}JDQ5c5J_8HO3`d#UFnZ0qLSoRI z{mVC^{)icmH<9a~U6$)LLn1%bcg zKTfPbbhdFpX-U*^lsfg(Gl_lAi!-~s;{R_^vVLV{s`O#?)cY$vxCpT?p7ST3d(d=L z(4%&P^=gFhxwL;zVx z1oK18r;Pp?;2 zeV*`k1F>$X|I6Xx+HUx23AlVTFjWr89g~2ZYnz=1YQl z?ML$5`z?+{m~;CwS8{>Ay0*o^WD)|6hZLz+^4P)IZ0LYRM*WcYQ^J7IdaaZQ#xKD2 z2A+F&ZKWQsM_q877frTa#ROz&11~Ue_ZLFVm!>GLXaRk;x=p!^hbdJKX1>nvlkj$@ zfAA$NuUn7!YV^oIs(TnM#sJ`*?8=Q1$H9~;!7v2BhTT^YJbY;TRL9n^y{R|!PkoOA z=!~BL1QwH!jz0I?K6*WOdlsjT)mQq?mYyYE%R&iw=PR<`$x|BZvPDR2UtqmqdsW@L z9(_h8novqs30b1v>%%l!w7X<6Gko^iaHd48Tn;x)+3g-1AT#ZDa&dEptBM2iS+ih*^L!zFMj_dE__b>yO4zZBz2n?{#MC_eXz_PUK|cy~$| z!9Py6LfU+O_?x~DoYx09;bBL*Z1T!%%*}=-VgL{PsS7Nu=Ld>FH(%cA<^QgXgqWq( z#@G~az&}>^TIroeJ^A+YLT9<*tK_mgGA1qK<2~<(tUjT~4L?k5a?|m?V zH+Bk&Zd6cfk3OS=BhTOtXxtL2`yf)C&dE$pVrfUubZe8Mhf@i#C!SONu|sdFyrOv| z=L(taM5if1IM$UIz{>{`)^=MDeHZe4kOR!dbf#7|H{)iYdOWcso%a=oJEPyG@K6%2^)okK(cW)un|Ni{p64<(Vuc`V--mpAk^4jn&x> zx5`r58_xwy??zZ6qg5_va%x=gdlzBgIFgvq%BSEe3J`@i7_ot(-@ftIdNn%qsTmo# zw_mW=qm4k36ap7lTS3Ag9KUQq1)F)aHn+X2+kdxU`~%HTGp!%%laqWR!f_F(SEH+| z@*C~0SgRxgsf!aiIfnU)OC!*>0X<$z;m_k@ZX-#Oy(YSS@|y0s)gh1OkiCuNWJ8=H zV}0nIyz$J9S8jIB-Yrhm)mAm4mF&7{WD{5d@!gKOnt#$}R5~O11Ug(FU9q08wv#q2?u$3cr+2CT5yF2d4MR~r!wFN#7Ql)zR2jwbr$Ug| zPF~cpK(`^zS?*;j?1wbu&Ws)&+F_pln_UWb8TQzR3}_89yB#zxCU}gW_)(7y2d(%c zcQ+)cgrjvd<;&KdJ0-vF*X=&gl9ny57frEZXm?JgjhjAl4A<9h=e0?0J}#J4fGYHA z&RNsD8R|1`W=_BPdw_n#HV`I4+(=+(H;UrIydzJ`9$j}6jP;G3Iq>)MVoF;y=^CaJ zb3+J(Q2b8egg6Pi2w8#Uh}wYwrL)v3{s}mNe`vRUtzv^4GZ26UX>dD&q0CbScA@fN zwGo>ifqlV6kpV;CNx5@>LyD-2V8T`@w?t7;uZI}xx^W8p-hSrh=a;h@z*({FFx+@U z_!VbRzuf$3KmO^rv9`hbaL$YVWXsVa^lbR+3;~)xHQFT& zo+1S7O)M5NtwiIsR=Z|{k@MN^$x+DHOH`#c^k(lv$d8lzNiEE4o3Ysl67X{$()u2K z9f1qgOAZILvbGW3-TiqHEU2*1Id-4<@-c9Y_^E;1xcq(!s50U)lqp-^Ny~yO>J6)1 z_B=JnyH8r|v8DLKwLW<)J&FU43v&`jd>PCB8L!snFw}pt1ry#lGzIzWAedv@(At|J zvUO#GV0LuSpd(Z(Fjxh{2e~HArwb6<$s{OEVd`zG*Au$sUVz=)+L{Tye|l1pl6nhg zJLKHF=FH{Z$OuA@7pHf!3bu&X3mHGATd(Tb#V?ZwU+@0h?I|CfuG-it`}8jX5l5Gh9_ zsCKUN5=WB4iDQBU>qcnqcVTo1o(~N8^QJz!(313aUCwXq$XV#I{WoD#7FNv^27FXp zMUkh_QM+nT#$&0ufr2FcLz3?y=|{Zf{<74O_#_6i+8gN;l9{mHT;b>4cJLC(qx~-AP!H zKr-CjSulL~>MtduqtY_104`!CH+{V0*ks#%ah@kjIw}wn%pwKuBe4lI+fuSYzwO$% z%*+bA3{(}ieU?V154~QN;T=%s%E_1k&g}Pxyx*=7I+i9>0iwphxiIjfA3?$TU>tZd1Y(a0r%VN0SPzH+i$z1QQL2u+sZF%xBCD~`qXd@A4s2Qkj%9B>CY!j zm0_I8n3$I^)0g3w{eX+_IH1TYSA;BU0oJZ~-3zNts*K|tw Gwj`ReVk4QULT+BcsBZ5=?_U2VXz%8P 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 z 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

    Uy7Xcj0#$k!-r4cdF&pL2u~jbmiW_{uALKd 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 z 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 z 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