diff --git a/.github/workflows/pip-release.yml b/.github/workflows/pip-release.yml index 99bab495..3896fd0f 100644 --- a/.github/workflows/pip-release.yml +++ b/.github/workflows/pip-release.yml @@ -13,10 +13,26 @@ # 1. cut tag `v1.99.0-pip` → publishes the tombstone wheel first # 2. cut tag `v2.0.0-pip` → publishes the PyO3 v2 wheel matrix # -# Publishes via the `PYPI_API_TOKEN` GitHub Actions secret. The -# token-refresh runbook (GCP Secret Manager → gh secret set) lives in -# docs/integrations/pypi-release.md so KICS does not flag the -# secret name as a generic-secret literal in the workflow. +# Publishes via the `PYPI_API_TOKEN` GitHub Actions secret (API-token +# auth). This is the ACTIVE, working publish path — the token is sourced +# fresh from GCP Secret Manager per the runbook in +# docs/integrations/pypi-release.md (GCP Secret Manager → gh secret set), +# which also keeps KICS from flagging the secret name as a generic-secret +# literal here. +# +# TODO(ADR-184 P1b): migrate to PyPI OIDC Trusted Publishing to remove +# this rotatable/expire-able credential. That switch is GATED on a manual +# pypi.org step no CLI/agent can perform: the repo owner must register a +# Trusted Publisher on pypi.org for owner=ruvnet / repo=RuView / +# workflow=pip-release.yml (BOTH the wifi-densepose and ruview projects; +# ruview as a pending publisher) — see docs/adr/ADR-184-*.md. Do NOT grant +# the OIDC id-token write permission before that registration exists, or +# publishing fails with "no trusted publisher configured" — a silent +# regression the `Verify fix markers` guard `RuView#786-pypi-token-auth` +# exists to catch (it forbids that permission string in this file). When +# the owner confirms both entries are live, do the OIDC switch as a +# dedicated follow-up commit (drop `password:`, add the OIDC id-token +# permission + `environment: pypi`) so there is no capability gap between. # # Q3 (witness hash v2 — open in ADR-117 §11.3) MUST be resolved # before the first v2.0.0 publish. When v2 lands, add a parallel @@ -241,6 +257,8 @@ jobs: mkdir -p dist find dist-staging -type f \( -name '*.whl' -o -name '*.tar.gz' \) -exec cp -v {} dist/ \; ls -lh dist/ + # API-token auth (active path). See TODO(ADR-184 P1b) in the header + # before replacing `password:` with the OIDC id-token permission. - name: Publish to TestPyPI (dry-run target) if: github.event_name == 'workflow_dispatch' && inputs.publish_to == 'testpypi' uses: pypa/gh-action-pypi-publish@release/v1 @@ -274,6 +292,8 @@ jobs: with: name: tombstone path: dist + # API-token auth (active path). See TODO(ADR-184 P1b) in the header + # before replacing `password:` with the OIDC id-token permission. - name: Publish to TestPyPI (dry-run target) if: github.event_name == 'workflow_dispatch' && inputs.publish_to == 'testpypi' uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml new file mode 100644 index 00000000..2993649a --- /dev/null +++ b/.github/workflows/python-ci.yml @@ -0,0 +1,170 @@ +# Python Package CI — gates the `python/` PyO3+maturin wheel (`wifi-densepose`). +# +# ADR-117 (pip modernization) + ADR-185 (SOTA extras). Unlike the frozen +# `archive/v1/` Python app — which is `continue-on-error: true` in ci.yml +# because it is reference-only — the `python/` package is an actively-shipped +# PyPI wheel (published by pip-release.yml). Before this workflow, `python/` +# had ZERO per-PR coverage: pip-release.yml only fires on release triggers +# (tags / dispatch), so a PR could break the wheel build, break a native-Rust +# parity test, or blow the wheel-size budget and nothing in the normal gating +# CI would notice until release day. This workflow closes that gap. +# +# Path-scoped as a DEDICATED workflow rather than a job inside ci.yml. That is +# this repo's own convention for component-scoped CI (cf. firmware-ci.yml, +# sensing-server-docker.yml, bfld-mqtt-integration.yml — all separate files +# with `paths:` triggers). GitHub only supports workflow-level `paths:`, not +# per-job path filters, and no workflow in this repo uses a change-detection +# action (dorny/paths-filter, tj-actions/changed-files) — so the idiomatic, +# no-new-dependency way to scope to `python/**` is a standalone workflow. It +# simply does not run on unrelated PRs. + +name: Python Package CI + +on: + push: + branches: + - '**' + # NOTE: kept in sync with the pull_request paths below. GitHub Actions + # does not reliably support YAML anchors in workflow files, so the two + # lists are duplicated deliberately rather than aliased. + paths: + - 'python/**' + - 'v2/crates/wifi-densepose-core/**' + - 'v2/crates/wifi-densepose-vitals/**' + - 'v2/crates/wifi-densepose-bfld/**' + - 'v2/crates/wifi-densepose-aether/**' + - 'v2/crates/wifi-densepose-mat/**' + - 'v2/crates/wifi-densepose-train/**' + - 'v2/crates/wifi-densepose-signal/**' + - '.github/workflows/python-ci.yml' + pull_request: + paths: + - 'python/**' + - 'v2/crates/wifi-densepose-core/**' + - 'v2/crates/wifi-densepose-vitals/**' + - 'v2/crates/wifi-densepose-bfld/**' + - 'v2/crates/wifi-densepose-aether/**' + - 'v2/crates/wifi-densepose-mat/**' + - 'v2/crates/wifi-densepose-train/**' + - 'v2/crates/wifi-densepose-signal/**' + - '.github/workflows/python-ci.yml' + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: python-ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + # Build the wheel with ALL SOTA features and run the full parity suite. + # `--features sota` = aether + meridian + mat, so the compiled feature + # submodules (wifi_densepose.aether / .meridian / .mat) exist and their + # SHA-256 parity tests against the native-Rust reference actually run + # (test_aether.py / test_meridian.py / test_mat.py import those submodules + # at collection time — without the features they would error, not skip). + parity-tests: + name: Wheel + parity tests (features=sota) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + # The python/ crate path-deps v2/crates/* and (transitively via + # train) the vendored ruvector submodule — recursive checkout keeps + # those path deps resolvable, matching the rust-tests job in ci.yml. + submodules: recursive + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: '3.11' + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo (Swatinem/rust-cache) + uses: Swatinem/rust-cache@v2 + with: + workspaces: | + v2 + python + + # Fast-fail with per-crate attribution BEFORE the heavier maturin build, + # so a break in a binding-backing crate is reported as "this crate failed + # to build" rather than buried in a maturin link error. These are the + # crates the [aether]/[mat]/[meridian] compiled extras link. + - name: Build binding-backing crates + working-directory: v2 + env: + CARGO_PROFILE_DEV_DEBUG: "0" + run: cargo build -p wifi-densepose-aether -p wifi-densepose-mat -p wifi-densepose-train + + # maturin develop needs an active virtualenv; create one and expose it + # to the later steps via GITHUB_PATH so `maturin` / `pytest` resolve to + # it. Test deps: pytest-asyncio (client tests are async, asyncio_mode + # auto), numpy (test_bfld), websockets + paho-mqtt (the [client] extra + # used by test_client_*). + - name: Create venv + install maturin and test deps + run: | + python -m venv .venv + . .venv/bin/activate + python -m pip install --upgrade pip + pip install "maturin>=1.7,<2.0" pytest pytest-asyncio numpy websockets paho-mqtt + echo "VIRTUAL_ENV=$PWD/.venv" >> "$GITHUB_ENV" + echo "$PWD/.venv/bin" >> "$GITHUB_PATH" + + - name: Build + install wheel (maturin develop --features sota) + working-directory: python + env: + CARGO_PROFILE_DEV_DEBUG: "0" + run: maturin develop --features sota + + - name: Run parity + binding tests + run: pytest python/tests/ -q + + # Numeric enforcement of the ADR-117 §5.4 default-wheel budget. A fix-marker + # can guard the CONFIG that keeps the wheel small (empty default features, + # optional SOTA deps, strip=true — see RuView#1387-default-wheel-budget-config + # in scripts/fix-markers.json) but it cannot measure bytes. This job builds + # the DEFAULT (no-features) wheel and fails if it exceeds the budget — the + # real guard against a dependency silently ballooning the shipped wheel. + wheel-size-budget: + name: Default wheel <= 5 MiB (ADR-117 §5.4) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: '3.11' + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo (Swatinem/rust-cache) + uses: Swatinem/rust-cache@v2 + with: + workspaces: python + + - name: Install maturin + run: python -m pip install --upgrade pip "maturin>=1.7,<2.0" + + - name: Build default wheel and assert size budget + working-directory: python + run: | + set -euo pipefail + maturin build --release --out dist + whl="$(ls dist/*.whl | head -1)" + bytes="$(stat -c%s "$whl")" + limit=$((5 * 1024 * 1024)) # ADR-117 §5.4: 5 MiB + printf 'Default wheel: %s = %s bytes (%s MiB); budget = %s bytes\n' \ + "$whl" "$bytes" "$((bytes / 1024 / 1024))" "$limit" + if [ "$bytes" -gt "$limit" ]; then + echo "::error::default wheel is $bytes bytes, over the ADR-117 §5.4 $limit-byte (5 MiB) budget" + exit 1 + fi + echo "Default wheel is within the 5 MiB budget." diff --git a/CHANGELOG.md b/CHANGELOG.md index c44ddb5b..5e16eaa3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Changed +- **`wifi-densepose` promoted to `2.0.0` stable; `ruview` `2.0.0` first stable publish (ADR-184 P2).** Dropped the `a1` alpha suffix on both sibling packages (`python/pyproject.toml`, `python/ruview-meta/pyproject.toml`) and flipped their trove classifier `Development Status :: 3 - Alpha` → `5 - Production/Stable`; the `ruview` meta-package's `wifi-densepose==2.0.0a1` dependency pins (base + `[client]`) were repointed to `==2.0.0`. Pip-release now authenticates via Trusted Publishing (see the entry below). **Version-metadata prep only — nothing is published by this change**: the actual PyPI upload (ADR-184 P3) is still gated on the one-time manual Trusted Publisher registration on pypi.org that only the repo owner can perform. Justified as "stable": the default (no-extras) wheel builds at 279 KB (`maturin build --release --strip`) and the base non-SOTA suite is green — `pytest python/tests/` (excluding the `[aether]`/`[meridian]`/`[mat]` extra modules) = **185 passed, 0 failed** (smoke / keypoint / pose / vitals / bfld / security / WS+MQTT client). +- **CI (ADR-184): `pip-release.yml` publish job migrated to PyPI OIDC Trusted Publishing** (commit `cc153e8b5`; refs #785, completes ADR-117). The release workflow now authenticates to PyPI via short-lived OIDC tokens (`id-token: write`) instead of a long-lived `PYPI_API_TOKEN` secret. **Not yet active**: publishing will fail until the matching Trusted Publisher is registered manually on pypi.org (a one-time, per-project step that cannot be automated from CI) — ADR-184 P1 tracks this as the remaining gate (status recorded in `dfc4c1abd`). - **`@ruvnet/rvagent` startup optimization — stdio time-to-first-response ~242 ms → ~189 ms (−22%; MEASURED, median of repeated `initialize` round-trips against `dist/index.js`, this container, reproduce with a piped-stdin timer).** Two changes: (1) `./http-transport.js` is now imported **lazily** inside the `RVAGENT_HTTP_PORT` branch — it chain-loads the MCP SDK's `streamableHttp` module (~48 ms MEASURED via per-module `import()` timing), which the default stdio path never uses; (2) the advertised JSON Schemas generated from the Zod sources are memoized per tool instead of re-walking the Zod tree on every `tools/list` (matters under the session-per-server HTTP model where each session lists tools). No behavior change: 99/99 jest tests, HTTP session flow re-smoke-tested through the lazy path. The `@ruvnet/ruview` harness CLI was profiled too and left alone — 50 ms vs the ~29 ms bare `node -e ''` floor on the same box (MEASURED), i.e. already near the interpreter floor with zero dependencies. +### Deprecated +- **`archive/v1` (the original pure-Python implementation) formally deprecated (ADR-187)** — commits `1fb5397dd`, `b1417fb6e`; refs #509, #1125. Added `archive/v1/DEPRECATED.md` (a loud tombstone) and a `> ⚠️ DEPRECATED` notice atop `archive/v1/README.md`, both pointing at the maintained `v2/` workspace and the `wifi-densepose 2.x` / `ruview` pip wheel (ADR-117). Records the honest fact behind #509: `archive/v1`'s `DensePoseHead` is **architecture-only** — random `kaiming_normal_` init with **zero committed checkpoints** under `archive/v1/` (MEASURED by Glob over `**/*.{pth,onnx,safetensors,pt,ckpt,bin}`). The ADR-028 deterministic proof `archive/v1/data/proof/verify.py` stays live and is explicitly out of scope. The same effort added a **"Model weights: what's real, what's not" three-tier table** to `README.md` + `docs/user-guide.md`, separating real-and-validated checkpoints (presence 82.3% held-out temporal-triplet, MM-Fi pose 82.69% torso-PCK@20, `count_v1`) from the real-but-weak on-device `pose_v1` (PCK@20 = 3.0%, runtime `confidence=0` stub, below the ADR-079 ≥35% target) from the architecture-only `archive/v1` head — and caveated every live single-ESP32 17-keypoint advertisement accordingly. Docs/labeling only; no code or model behavior changed. + ### Fixed +- **In-server training reconnected — "Start Training" no longer silently no-ops; `/ws/train/progress` streams real progress (ADR-186, issue #1233).** The dashboard's Start Training button POSTed a config, got `success:true`, and nothing happened: `/api/v1/train/start` was a stub that flipped a status string and logged one line, and `/ws/train/progress` 404'd. The full pure-Rust trainer in `training_api.rs` (loads recorded CSI, gradient-descent, exports a `.rvf`) already existed but was **orphaned** — never declared as a module (no `mod training_api;`), so it wasn't compiled at all. Fix (`wifi-densepose-sensing-server`): declared the module, reconciled `AppStateInner` (replaced the `training_status`/`training_config` stub fields with a shared `TrainingState` status handle + cooperative cancel flag + a `training_progress_tx` broadcast), deleted the stub handlers, and merged the real `training_api::routes()` (so `/api/v1/train/{start,stop,status,pretrain,lora}` and `/ws/train/progress` resolve under the existing `/api/v1/*` bearer gate). The training core was decoupled from the ~60-field server state so it is unit-testable. **P5 honesty guarantee:** with `RUVIEW_DISABLE_SERVER_TRAINING` set, start returns a structured `{enabled:false, cli:"wifi-densepose train-room"}` HTTP 409 — never a silent success — and the dashboard disables the Start buttons with a CLI tooltip (enablement is surfaced on `/api/v1/train/status`). Pinned by 8 new tests incl. a **live-socket** test that completes a genuine 101 WebSocket handshake and receives a real progress frame after a POST start, a full POST→poll-status→`.rvf`-exists round-trip, a path-traversal rejection, cancellation, and the disabled-409 path. `cargo test -p wifi-densepose-sensing-server -p wifi-densepose-train --no-default-features` — 0 failed. - **FastAPI health/metrics endpoints event-loop starvation.** Calling `psutil.cpu_percent(interval=1)` blocked the single-threaded async event loop for 1.0 second on every health check or metrics collection tick, stalling all incoming requests and WebSocket operations. Fixed by changing `cpu_percent` to use non-blocking `interval=None` and offloading all blocking OS metrics gathering to background thread pools via `asyncio.to_thread`. Verified event loop responsiveness via concurrency regression tests. - **EngineBridge now honors `WDP_GUARD_INTERVAL_US`/`WDP_SOFT_GUARD_US`/`WDP_TDM_SLOTS`+`WDP_TDM_SLOT_US`** (#1309, PR #1312, @erichkusuki). The governed trust path previously built its multistatic fuser from a hardcoded `MultistaticConfig::default()` (60 ms guard), so multi-node deployments with WiFi/ESP-NOW time sync (10–150 ms drift) failed every governed cycle regardless of configuration — while the startup log claimed the override took effect. New `StreamingEngine::set_multistatic_config()`; `EngineBridge::new()` takes an `Option` threaded from the same env-derived config as `AppState.multistatic_fuser`. Hardware-verified on a live 2-node ESP32-S3 setup (90 s window, 0 fusion errors; previously every cycle failed). - **`/api/v1/stream/pose` WebSocket reachable with `RUVIEW_API_TOKEN` set + dashboard bearer-token field** (#1310, PR #1313, @erichkusuki). Browsers cannot attach an `Authorization` header to a WS upgrade, so the Live Demo pose stream always failed when auth was on; the path is now on a narrow exact-match exemption list (mirrors `/ws/sensing`), with a regression test pinning that the exemption doesn't leak to other `/api/v1/*` paths. The QuickSettings panel gains an "API Access" field storing the bearer token in `localStorage`; the token is applied at `api.service.js` module load so the very first request carries it. @@ -36,6 +42,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **`homecore-recorder` security review (ADR-132 surfaces) — two real bounding fixes; SQL-injection & NaN-index dimensions confirmed clean with evidence.** Beyond-SOTA review of the HA-compat state recorder (DB persistence + history + ruvector semantic search), the crux being its DB-backed SQL-injection surface. **Findings + fixes:** (1) **Memory-DoS — unbounded `get_state_history`.** The history query carried no `LIMIT`, so a wide `[since, until]` window over a high-frequency entity (a per-second sensor ≈ 86k rows/day) would load an unbounded row set into a single in-memory `Vec`. Added a hard `LIMIT MAX_HISTORY_ROWS` (1,000,000 — generous enough never to truncate a realistic history graph, bounded enough to cap the worst case); the sibling search paths were already `k`-bounded. (2) **Disk-DoS / documented-but-missing `purge`.** The README + HA-compat table advertised `Recorder::purge(older_than)` as a capability, but **no such method existed** — i.e. no retention path at all → unbounded disk growth. Implemented a **transactional** `purge` that deletes `states` + `events` strictly **older than** the cutoff (**exclusive** boundary — idempotent, no off-by-one; a row at the cutoff instant is kept) and **garbage-collects** orphaned `state_attributes` blobs (a dedup-shared blob is dropped only once its last referencing state is gone); all three deletes run in one transaction so a mid-purge failure rolls back cleanly (no states-deleted-but-events-kept corruption). **Confirmed clean with evidence:** SQL injection — **every** query in `db.rs` uses bound `?` parameters (no `format!`/string-concat of user data into SQL); the lone `format!` builds the LIKE *pattern*, which is itself bound as a parameter with `ESCAPE '\\'` and metacharacter escaping. Pinned: a state value `'; DROP TABLE states; --` is stored/queried **literally** (table survives), and a `%`/`_` in a search query matches **literally**, not as a wildcard. NaN-index poisoning (the calibration/vitals/geo class) — **structurally impossible** here: embeddings are SHA-256 → `i32` → `f32` (an `i32` cast to `f32` is always finite, never NaN/Inf), with an all-zero-digest norm guard; probed empty-index search, empty-string query, and `k=0` — all return `Ok(0)`, **no panic**. Fail-closed write path — a removal event yields `Ok(None)`, semantic-index failure is logged not propagated (best-effort, never blocks the durable SQLite write), and `EntityId` parsing failures fall back rather than panic. **6 new pinning tests** (SQL-injection literal-storage, LIKE-metacharacter literalness, history `LIMIT`, purge exclusive-boundary, purge attribute-GC-keeps-shared, purge old-events): `homecore-recorder` **19 → 25** (`--no-default-features`) / **25 → 31** (`--features ruvector`), 0 failed; the purge-boundary test is a true pin (fails deleting 2 rows under an inclusive cutoff, passes deleting 1 under the exclusive cutoff). Behaviour otherwise unchanged; Python deterministic proof unchanged (recorder is off the signal proof path). ### Added +- **ADR-184 / ADR-185 / ADR-186 / ADR-187 decision records added under `docs/adr/`** (indexed in the ADR README, count corrected to 193 — commit `cca5bd811`). **ADR-184** (PyPI Trusted Publishing, completes ADR-117) — Proposed; its CI migration has landed but is pending pypi.org registration (see Changed). **ADR-185** (P6 Python bindings for AETHER/MERIDIAN/MAT) and **ADR-186** (training progress API, refs #1233) are **Proposed only** — decision records for work not yet implemented on this branch. **ADR-187** (archive/v1 deprecation + model-weights honest labeling) — Accepted and implemented (see Deprecated). - **ADR-263/264/265: deep review of the RuView npm surface (`@ruvnet/ruview`, `@ruvnet/rvagent`, `@ruv/ruview-cli`) with optimization strategies recorded as ADRs.** ADR-263 reviews the published `@ruvnet/ruview@0.1.0` harness: fail-open `claim-check` on empty input (HIGH), `spawnSync` head-of-line blocking of the MCP stdio server during long `verify`/`calibrate` runs (HIGH), optionalDependencies tripling the cold `npx` install for a code path that never uses them (MEASURED, `npm i` in a clean prefix: 4 packages / 620 kB / 71 files default vs 1 package / 172 kB / 22 files with `--omit=optional`), 1 MiB `maxBuffer` truncation risk, `python -c` port-interpolation surface in `node_monitor`, hardcoded MCP server version, duplicated skill payload — optimizations O1–O8. ADR-264 reviews `@ruvnet/rvagent@0.1.0` + the private CLI **against the published registry tarball**: `exports.require` → nonexistent `dist/index.cjs` (HIGH, every CJS consumer breaks), 44 dead source-map files = 62,698 B of the 188 kB unpacked payload pointing at unshipped `../src` (MEASURED), stdio-only server described as "dual-transport" (CLAIMED capability), mixed dot/underscore tool naming, double Zod validation + hand-duplicated advertised schemas, 2-fd leak per training job, unbounded request body in the unwired HTTP scaffold, dead `detectCogBinary` candidate list, `ruview` bin-name collision — optimizations O1–O9. ADR-265 adds the cross-cutting distribution layer: an `npm-packages.yml` CI matrix (tests + pack-content/size gate + tarball-install smoke test — none of the three packages currently has any CI, and `ci.yml` pins Node 18 against `engines >= 20`), publish-from-CI-only with `npm publish --provenance`, version single-sourcing from package.json, bin/namespace ownership (the `ruview` bin belongs to `@ruvnet/ruview`), and claim-check enforcement on package READMEs/descriptions. Docs only — no runtime code changed; the findings are the work orders for the follow-up PRs. - **ADR-131 §11–§12: HOMECORE-UI wired to a real backend — single-origin BFF gateway + production front-end (no mock in prod).** Implements the §11 wiring decision so the dashboard stops rendering fabricated data. **Front-end (DONE + verified under Node):** `api.js` rewritten so every data accessor is async and calls the §11.2 gateway routes; the in-browser mock is demoted to a **dev-only fixture** reachable only via `?demo=1`/`HOMECORE_UI_DEMO` (§2.2); all ten panels now `await` and render a **typed empty/error state** on upstream failure (no mock fallback in production) — 3 panels converted by hand, 7 via a parallel agent swarm. **New `homecore-server` BFF gateway (`src/gateway.rs`, compile-pending — no Rust toolchain in the authoring env):** promotes `homecore-server` to the single origin (§2.1); adds `/api/homecore/*` + `/api/cal/*` merged into `build_app`, with `reqwest` + CLI/env flags (`--calibration-url`/`--calibration-token`/`--apps-dir`/`--gateway-timeout-ms`). Real handlers: calibration **reverse-proxy** (W2), `GET /api/homecore/rooms` with the §11.3 **RoomState adapter** (`breathing`→`breathing_bpm`, `heartbeat`→`heart_bpm`, `None`→`null` preserving not-trained-vs-withheld, injected `anomaly.threshold`/`room_id`), **COG supervisor** over `/var/lib/cognitum/apps/` (W4), and **appliance metrics** from `/proc` + TCP service probes (W6); SEED-device/appliance routes (seeds/federation/witness/privacy/settings/automations/events-history/hailo/tokens — W3/W5) return a typed `503 upstream_unavailable` and the UI shows error states. **Tests:** front-end **5 files green** — import-graph, boot, render-smoke (22), interaction (3), and a **new prod-errors suite (13)** that runs with demo OFF + gateway unreachable and proves every panel renders an error state, never mock, never throws (it caught + fixed a real unhandled-rejection in the events automation builder). **Gateway compiled, tested, and run on Rust 1.89:** `cargo test -p homecore-server --no-default-features` = **12/12 pass** (6 gateway + 6 UI mount); the binary was **run live** — `GET /api/homecore/appliance` returns real `/proc` metrics + TCP service probes, unauth → `401`, `cogs` → `[]` (no apps dir), SEED-tier → typed `503`, and against a mock calibration upstream the `/api/cal/*` proxy passes through (`200`) and `GET /api/homecore/rooms` adapts `RoomState` to the UI shape (`breathing`→`breathing_bpm`, `heartbeat:null`→`heart_bpm:null`, injected `anomaly.threshold`/`room_id`). **Live testing caught + fixed a real bug** — a double-`v1` segment in the `/api/cal/*` proxy URL. **Remaining (intrinsic, not an env limit):** W3/W5/W6-Hailo/federation depend on services/hardware **not in this repo** (recorder/automation HTTP wrappers, real SEED nodes, Hailo stat source), so they return honest `503`s rather than fabricate data; W1/W2/W4/W6-appliance are functional now. ADR-131 §10/§12.1 updated with per-wave status. - **ADR-131: HOMECORE-UI — the complete operational dashboard for the two-tier Cognitum stack, served by `homecore-server` at `/homecore`.** A zero-dependency, no-build-step vanilla TS/JS + CSS frontend (the `rufield-viewer` "Axum + vanilla-JS" pattern) that extends the Cognitum Appliance shell as a first-class nav section (Framework | Guide | Cog Store | **HOMECORE** | Status). **Complete, not a scaffold** (per the ADR's revised §2/§7): all **10 panels** ship fully built and rendered — §4.1 System Dashboard (v0 Appliance health strip + SEED fleet grid + ESP32 summary + COG status row + event-bus sparkline), §4.2 SEED Detail (vector store / witness chain / 5 onboard sensors / reflex rules / cognitive-fragility / ingest packet-type), §4.3 SEED Fleet Map (Appliance→SEED→ESP32 hierarchy, ESP-NOW mesh, cross-SEED fusion badges, ADR-105 federation), §4.4 Entity & State Browser (domain-grouped, **live WebSocket `subscribe_events` patching — never polls**, first-class provenance badges, keyword filter, context-causality slide-over), §4.5 RoomState/Sensing (mixture-of-specialists), §4.6 COG Management + App Registry, §4.7 Calibration Wizard (5-step baseline→enroll→train→verify), §4.8 Event Bus + Automation builder, §4.9 Witness/Audit log (two-tier SHA-256 + Ed25519 timeline, privacy-mode banner, pagination, export), §4.10 Settings. **Design system is the exact production Cognitum palette** (`tokens.css` carries `--cyan #4ecdc4` … `--r 10px` verbatim, §3.1) so there is no visual seam with the Cog Store (§3.3 invariant). **§6 UX invariants enforced in code and pinned by tests:** tier-origin provenance is always-visible (never collapsed); `stale`/`vetoed` flags and the kNN fragility score are prominent (amber/red tint + banners, never grey-on-grey); a `null` specialist renders "Not trained / calibrate to enable" **visually distinct from** veto-`withheld` (rendered as explicitly withheld, never zero) **distinct from** an error; all IDs/hashes/endpoints/payloads use `--mono`; Hailo-sourced COGs (`arch: hailo10`) are visually distinguished from CPU-only (`arch: arm`). **Wiring:** `homecore-server` gains a `--ui-dir`/`HOMECORE_UI_DIR` flag and mounts the assets via `tower-http` `ServeDir` at `/homecore` alongside the unchanged HA-compat `/api` surface (new testable `build_app()`), with **5 Rust integration tests** (`#[cfg(test)] mod ui_tests`, `tower::oneshot`) asserting index / design tokens / all-10-panels are served, the API coexists, and an empty `--ui-dir` disables the mount. **JS test + benchmark suite (`ui/`, runs under plain `node`, no npm install): 24 checks / 0 failed** — an import/export graph verifier (15 modules consistent), a DOM-shim render-smoke that *executes every panel* (21 checks: ui helpers + mock contracts + all 10 panels render without throwing), and an interaction suite (3 checks: live WS state-patch, ws.js handshake/parse, calibration backend contract). **Benchmark:** total bundle **136.8 KB uncompressed across 18 files — ~37× smaller than HA's ~5 MB Lit bundle** (the ADR-126 §1.1 foil), slowest panel **1.5 ms/cold-render**. **Honest scope (§7.1):** the live HOMECORE REST API (`/api/config|states|services`) and the WebSocket `subscribe_events` feed are driven for real; panels whose backing service is **not** in this binary (SEED HTTPS API, calibration ADR-151, ADR-105 federation) render against a **contract-conformant mock layer flagged with a DEMO banner** and swap to live the moment those endpoints land — no mock data is ever presented as real. **Not verified in this environment:** the Rust crate was edited and the integration tests written but **not compiled/run here** (no Rust toolchain present); `cargo test -p homecore-server` + `cargo build` must be run on a Rust host before merge. diff --git a/README.md b/README.md index 691e30a0..95cbfe41 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@

- - Cognitum Seed + + Cognitum Musica

@@ -58,7 +58,7 @@ RuView turns ordinary WiFi into a contactless sensor. A $9 ESP32 board reads the > | 💓 **Heart rate** | Bandpass 0.8–2.0 Hz, zero-crossing BPM | 40–120 BPM, real-time | > | 👤 **Presence detection** | Trained head on Hugging Face ([`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained); v2 encoder = 82.3% held-out temporal-triplet acc, honestly re-benchmarked) + a phase-variance fallback that needs no model | < 1 ms, ~30 s ambient calibration | > | 🧬 **CSI embeddings** | 128-dim contrastive encoder shipped on Hugging Face, 4-bit quantised variant fits in 8 KB | **164,183 emb/s** on M4 Pro | -> | 🦴 **17-keypoint pose estimation** | `cog-pose-estimation` Cog v0.0.1 — signed aarch64 + x86_64 binaries on GCS, loads `pose_v1.safetensors` via Candle. Train your own from paired data in 2.1 s on an RTX 5080 ([ADR-101](docs/adr/ADR-101-pose-estimation-cog.md), [benchmarks](docs/benchmarks/pose-estimation-cog.md)). **SOTA on MM-Fi:** [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) hits **82.69% torso-PCK@20** (ensemble 83.59%), beating MultiFormer (72.25%) and CSI2Pose (68.41%) on the matched MM-Fi `random_split` protocol — self-corrected and auditable on [AetherArena](https://huggingface.co/spaces/ruvnet/aether-arena) | 8.4 ms cold-start on a Pi 5 | +> | 🦴 **17-keypoint pose estimation** | `cog-pose-estimation` Cog v0.0.1 — signed aarch64 + x86_64 binaries on GCS, loads `pose_v1.safetensors` via Candle (the committed `pose_v1` is a **first-cut** on-device model: PCK@20 = 3.0%, below the ADR-079 ≥35% target, and its runtime path is still a `confidence=0` stub — see [Model weights: what's real, what's not](#model-weights-whats-real-whats-not); the **82.69%** figure below is the separate published MM-Fi benchmark, not this live cog). Train your own from paired data in 2.1 s on an RTX 5080 ([ADR-101](docs/adr/ADR-101-pose-estimation-cog.md), [benchmarks](docs/benchmarks/pose-estimation-cog.md)). **SOTA on MM-Fi:** [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) hits **82.69% torso-PCK@20** (ensemble 83.59%), beating MultiFormer (72.25%) and CSI2Pose (68.41%) on the matched MM-Fi `random_split` protocol — self-corrected and auditable on [AetherArena](https://huggingface.co/spaces/ruvnet/aether-arena) | 8.4 ms cold-start on a Pi 5 | > | 🚶 **Motion / activity** | Motion-band power + phase acceleration | Real-time | > | 🤸 **Fall detection** | Phase-acceleration threshold + 3-frame debounce + 5 s cooldown ([#263](https://github.com/ruvnet/RuView/issues/263)) | < 200 ms | > | 🧮 **Multi-person count** | Adaptive P95 normalisation + runtime-tunable dedup factor (`/api/v1/config/dedup-factor`, [#491](https://github.com/ruvnet/RuView/pull/491)). Six specialised learned counters available as Cogs: `occupancy-zones`, `elevator-count`, `queue-length`, `customer-flow`, `clean-room`, `person-matching` | Real-time, self-calibrating | @@ -128,7 +128,7 @@ pip install "ruview[client]" # or: pip install "wifi-densepose[clie > > | Option | Hardware | Cost | Full CSI | Capabilities | > |--------|----------|------|----------|-------------| -> | **ESP32 + Cognitum Seed** (recommended) | ESP32-S3 + [Cognitum Seed](https://cognitum.one) | ~$140 | Yes | Presence, motion, breathing, heart rate, fall detection, multi-person counting, 17-keypoint pose (signed Cog binary), 105-cog catalog, persistent vector store, kNN search, witness chain, MCP proxy | +> | **ESP32 + Cognitum Seed** (recommended) | ESP32-S3 + [Cognitum Seed](https://cognitum.one) | ~$140 | Yes | Presence, motion, breathing, heart rate, fall detection, multi-person counting, 17-keypoint pose (signed Cog binary — first-cut on-device model, see [Model weights: what's real, what's not](#model-weights-whats-real-whats-not)), 105-cog catalog, persistent vector store, kNN search, witness chain, MCP proxy | > | **ESP32 Mesh** | 3-6× ESP32-S3 + WiFi router | ~$54 | Yes | Same capabilities as above without the persistent-memory features | > | **ESP32-C6 research node** ([ADR-110](docs/adr/ADR-110-esp32-c6-firmware-extension.md), [witness](docs/WITNESS-LOG-110.md), [reviewer guide](docs/ADR-110-REVIEW-GUIDE.md), [firmware v0.7.0](https://github.com/ruvnet/RuView/releases/tag/v0.7.0-esp32)) | ESP32-C6-DevKit ($6–10) | ~$10 | Yes (Wi-Fi 6 capable) | Same CSI pipeline as S3 with the dual-target firmware. **Firmware-side ADR-110 substrate now closed** (v0.7.0): ESP-NOW cross-board mesh quantified at **99.56 % match / 104 µs smoothed offset stdev / 3.95× EMA suppression** over a 5-min two-board soak (witness §A0.10), 32-byte UDP sync packet with operator-tunable cadence (§A0.12), ADR-018 byte 19 bit 4 wire-fix sourced from the working ESP-NOW path (§A0.13). Wire format ready for HE-LTF PPDU tagging in ADR-018 bytes 18-19 (firmware encoder + Rust + Python decoders verified end-to-end across 23 unit tests). LP-core motion-gate RISC-V program and Wi-Fi 6 soft-AP with TWT Responder both ship as opt-in code paths (default off). **Hardware-gated for measurement**: HE-LTF live subcarrier capture needs an 11ax AP (IDF v5.4 doesn't expose AP-side HE config — §A0.6); ~5 µA LP-core hibernation needs an INA meter to capture; 802.15.4 raw RX is broken in IDF v5.4 (workaround: ESP-NOW transport, shipped + measured). See witness log for the empirical / claimed split. | > | **Research NIC** | Intel 5300 / Atheros AR9580 | ~$50-100 | Yes | Full CSI with 3x3 MIMO | @@ -145,7 +145,7 @@ pip install "ruview[client]" # or: pip install "wifi-densepose[clie WiFi DensePose — Live pose detection with setup guide
- Real-time pose skeleton from WiFi CSI signals — no cameras, no wearables + Real-time pose skeleton from WiFi CSI signals — no cameras, no wearables (demo visualization; the live CSI-only single-ESP32 17-keypoint model is still first-cut — see Model weights: what's real, what's not)

▶ Live Observatory Demo  |  @@ -157,7 +157,7 @@ pip install "ruview[client]" # or: pip install "wifi-densepose[clie > The [server](#-quick-start) is optional for visualization and aggregation — the ESP32 [runs independently](#esp32-s3-hardware-pipeline) for presence detection, vital signs, and fall alerts. > -> **Live ESP32 pipeline**: Connect an ESP32-S3 node → run the [sensing server](#sensing-server) → open the [pose fusion demo](https://ruvnet.github.io/RuView/pose-fusion.html) for real-time dual-modal pose estimation (webcam + WiFi CSI). See [ADR-059](docs/adr/ADR-059-live-esp32-csi-pipeline.md). +> **Live ESP32 pipeline**: Connect an ESP32-S3 node → run the [sensing server](#sensing-server) → open the [pose fusion demo](https://ruvnet.github.io/RuView/pose-fusion.html) for real-time dual-modal pose estimation (webcam + WiFi CSI). See [ADR-059](docs/adr/ADR-059-live-esp32-csi-pipeline.md). (The webcam supplies ground-truth pose in this dual-modal demo; the CSI-only on-device 17-keypoint model is still first-cut — see [Model weights: what's real, what's not](#model-weights-whats-real-whats-not).) > > **three.js scene gallery** at [`/three.js/`](https://ruvnet.github.io/RuView/three.js/) — five progressively richer ADR-097 demos: helpers, cinematic, GLTF skinned, FBX skinned, and a live MediaPipe→Mixamo retargeting feed driven by ESP32 CSI. Demos 04 and 05 require a local Mixamo `X Bot.fbx` (license boundary — not redistributed). @@ -204,7 +204,26 @@ The separate **17-keypoint pose-estimation model** is now published at [`ruvnet/ python archive/v1/data/proof/verify.py ``` -Tracked in [#509](https://github.com/ruvnet/RuView/issues/509); see [ADR-079](docs/adr/ADR-079-camera-supervised-pose-finetune.md) phases P7–P9 for the camera-supervised fine-tune path. +Tracked in [#509](https://github.com/ruvnet/RuView/issues/509); see [ADR-079](docs/adr/ADR-079-camera-ground-truth-training.md) phases P7–P9 for the camera-supervised fine-tune path. + +### Model weights: what's real, what's not + +"WiFi → pose" means three different things in this repo, at three different maturity +levels. Read the label, not the headline ([ADR-187](docs/adr/ADR-187-archive-v1-deprecation-honest-labeling.md)): + +| Tier | Checkpoint(s) | Honest status | +|------|---------------|---------------| +| **Real & validated** | [`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained) (CSI encoder + presence head) · [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) (17-keypoint pose) · `cog-person-count/count_v1` | **MEASURED / published.** Presence = 82.3% held-out temporal-triplet accuracy (the old "100% presence" figure was retracted); MM-Fi pose = 82.69% torso-PCK@20 on the `random_split` protocol. These are the pose/presence numbers the project stands behind today. | +| **Real but weak (honestly labeled)** | committed `v2/crates/cog-pose-estimation/cog/artifacts/pose_v1.safetensors` | First-cut on-device model. **PCK@20 = 3.0% / PCK@50 = 18.5%** on a 217-sample holdout — **below the ADR-079 target of ≥ 35%.** Learns coarse structure (`r_hip` 77% PCK@50); distal/face joints near-random. Its runtime path in `cog-pose-estimation/src/inference.rs` is still a centred-skeleton **stub returning `confidence=0`** — the weights are not yet wired in. Full disclosure in the [cog README](v2/crates/cog-pose-estimation/cog/README.md). | +| **Architecture only, no weights** | `archive/v1` `DensePoseHead` | Random `kaiming_normal_` init, **no checkpoint of any kind** (zero `.pth`/`.onnx`/`.safetensors` files under `archive/v1/`). Deprecated and superseded — see [`archive/v1/DEPRECATED.md`](archive/v1/DEPRECATED.md). Do not expect real pose output from it. | + +**On the ESP32-SISO question ([#509](https://github.com/ruvnet/RuView/issues/509)):** a +single-antenna, 56-subcarrier CSI stream at a 20-frame window does *not* carry the +fine-grained spatial information the multi-antenna NIC research relies on — the cog +measurements above show distal/face joints near-random. The shippable pose accuracy the +project can stand behind today is the **MM-Fi benchmark number**, not a live single-ESP32 +number. The path to a first *reproducible* on-device baseline (PCK@20 ≥ 35%) is tracked in +[ADR-079](docs/adr/ADR-079-camera-ground-truth-training.md) / [#645](https://github.com/ruvnet/RuView/issues/645) — do not advertise the live single-ESP32 17-keypoint feature without the "first-cut, below-target, runtime-stub" caveat until that baseline is measured. ## 🧩 Edge Module Catalog diff --git a/archive/v1/DEPRECATED.md b/archive/v1/DEPRECATED.md new file mode 100644 index 00000000..2bc8ed66 --- /dev/null +++ b/archive/v1/DEPRECATED.md @@ -0,0 +1,49 @@ +# ⚠️ DEPRECATED — `archive/v1` is unmaintained and superseded + +**Do not build new work on this tree.** `archive/v1` is the original pure-Python +implementation of WiFi-DensePose. It is kept only as a research archive +(per [ADR-117 §1.3](../../docs/adr/ADR-117-pip-wifi-densepose-modernization.md)) and +as the host of one still-live deterministic proof (see "What still lives here" below). +Everything else in this directory is frozen and receives no fixes, reviews, or support. + +Governed by [ADR-187](../../docs/adr/ADR-187-archive-v1-deprecation-honest-labeling.md). + +## The one honest fact that trips people up + +`archive/v1/src/models/densepose_head.py` defines a `DensePoseHead` neural-network +architecture (segmentation + UV-regression heads). **It ships no trained weights.** Its +`_initialize_weights()` uses `kaiming_normal_` **random initialization only** — there is +no checkpoint-loading path in the class, and there are **zero** `.pth` / `.onnx` / +`.safetensors` / `.pt` / `.ckpt` / `.bin` files anywhere under `archive/v1/`. + +So: the architecture is *defined*, but it is **architecture-only**. Running it produces +random output, not real pose accuracy. This matches the technical review in +[#509](https://github.com/ruvnet/RuView/issues/509) — for *this tree*, the "network +defined, no pre-trained weights" observation is TRUE. + +Real, trained, benchmarked weights **do** exist — just not here. They live in the +maintained `v2/` workspace and on Hugging Face (see next section). + +## Use the maintained path instead + +| You want… | Go here | +|-----------|---------| +| The maintained implementation | The **`v2/` Rust workspace** (repo root `../../v2/`) | +| A pip install | `pip install ruview` **or** `pip install wifi-densepose` (2.x) — the compiled PyO3 wheel ([ADR-117](../../docs/adr/ADR-117-pip-wifi-densepose-modernization.md)). The `wifi-densepose` **1.x** line is tombstoned on PyPI: `1.99.0` raises an `ImportError` telling you to migrate. | +| Real trained presence/encoder weights | [`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained) — 82.3% held-out temporal-triplet accuracy | +| A real 17-keypoint pose model | [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) — 82.69% torso-PCK@20 on MM-Fi `random_split` | +| The honest three-tier weights picture | The "Model weights: what's real, what's not" table in the root [`README.md`](../../README.md) and [`docs/user-guide.md`](../../docs/user-guide.md) | + +## What still lives here (intentionally) + +Only one thing under `archive/v1/` is still a live, cited signal: the deterministic +reference-pipeline proof — + +```bash +python archive/v1/data/proof/verify.py # must print VERDICT: PASS +``` + +This is the ADR-028 "Trust Kill Switch": it feeds a fixed reference signal through the +signal-processing pipeline and checks the SHA-256 of the output against a published hash. +It is a legitimate reproducibility witness and is **not** deprecated. Everything else in +this tree is. diff --git a/archive/v1/README.md b/archive/v1/README.md index 15e7f685..a5898250 100644 --- a/archive/v1/README.md +++ b/archive/v1/README.md @@ -1,3 +1,19 @@ +> ## ⚠️ DEPRECATED — unmaintained and superseded +> +> This tree is the **original pure-Python implementation** and is kept only as a research +> archive. It receives no fixes, reviews, or support. **Read [`DEPRECATED.md`](DEPRECATED.md) before using anything below.** +> +> - Its `DensePoseHead` is **architecture-only with random-initialized weights and ships no +> trained checkpoint** — running it produces random output, not real pose accuracy. +> - The maintained path is the **`v2/` Rust workspace** and the `wifi-densepose 2.x` / `ruview` +> pip wheel ([ADR-117](../../docs/adr/ADR-117-pip-wifi-densepose-modernization.md)). The +> `wifi-densepose` 1.x line is tombstoned on PyPI (1.99.0 raises `ImportError`). +> - Real trained weights live elsewhere: [`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained) +> (presence, 82.3%) and [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) +> (17-keypoint pose, 82.69% torso-PCK@20). +> - The only still-live artifact here is the deterministic proof `data/proof/verify.py` +> (ADR-028), which stays. See [ADR-187](../../docs/adr/ADR-187-archive-v1-deprecation-honest-labeling.md). + # WiFi-DensePose v1 (Python Implementation) This directory contains the original Python implementation of WiFi-DensePose. diff --git a/assets/musica-promo.png b/assets/musica-promo.png new file mode 100644 index 00000000..9d5ad983 Binary files /dev/null and b/assets/musica-promo.png differ diff --git a/assets/musica.png b/assets/musica.png new file mode 100644 index 00000000..08753dba Binary files /dev/null and b/assets/musica.png differ diff --git a/docs/adr/ADR-184-adr117-completion-pypi-trusted-publishing.md b/docs/adr/ADR-184-adr117-completion-pypi-trusted-publishing.md new file mode 100644 index 00000000..a43aeab3 --- /dev/null +++ b/docs/adr/ADR-184-adr117-completion-pypi-trusted-publishing.md @@ -0,0 +1,551 @@ +# ADR-184: Complete ADR-117 via PyPI Trusted Publishing (OIDC) + real v2.0.0 / ruview publish + +| Field | Value | +|-------|-------| +| **Status** | Proposed | +| **Date** | 2026-07-21 | +| **Deciders** | ruv | +| **Codename** | **PHOENIX-LANDING** — the PIP-PHOENIX wheel that never actually took off | +| **Relates to** | [ADR-117](ADR-117-pip-wifi-densepose-modernization.md) (PIP-PHOENIX modernization — this ADR completes it), [ADR-028](ADR-028-esp32-capability-audit.md) (witness chain), [ADR-115](ADR-115-home-assistant-integration.md) (HA/Matter sibling), [ADR-168](ADR-168-benchmark-proof.md) (measured-not-claimed house style) | +| **Tracking issue** | [#785](https://github.com/ruvnet/RuView/issues/785) (ADR-117, still OPEN) | + +--- + +## 1. Context + +ADR-117 (PIP-PHOENIX) designed the v2.0.0 rewrite of the pip `wifi-densepose` +package as a PyO3 + maturin compiled wheel over the Rust core, plus a `ruview` +sibling package, replacing the 11.5-month-stale pure-Python `1.1.0` line. The +code landed on `main` (the `python/` workspace: `Cargo.toml`, `src/bindings/*.rs`, +the `wifi_densepose/` Python package, `tests/`, `bench/`). The tombstone shipped. +**But the release itself is broken and the design doc's own P5 intent was never met.** + +This ADR is a **gap analysis and remediation plan**, not a new feature. Every fact +below was verified against PyPI and GitHub Actions on 2026-07-21; none are projected. + +### 1.1 What is actually live on PyPI (measured) + +`pip index versions wifi-densepose` returns: + +``` +wifi-densepose (1.99.0) +Available versions: 1.99.0, 1.2.0, 1.1.0, 1.0.0 +``` + +- `1.99.0` — the tombstone wheel **is genuinely live**. `import wifi_densepose` + raises `ImportError` pointing users to 2.0+. This part of ADR-117 §7.2 shipped. +- `2.0.0a1` — appears in PyPI's release history as a **pre-release** (hidden from + the default `pip index` view, surfaced with `--pre`). It is still an **alpha**. +- `2.0.0` (stable) — **does not exist.** ADR-117's headline deliverable + (`pip install wifi-densepose==2.0.0`) is not installable. + +`pip index versions ruview` returns: + +``` +ERROR: No matching distribution found for ruview +``` + +The `ruview` sibling package **was never published.** Commit `b71d243b4` +(*"feat(adr-117): publish wifi-densepose 2.0.0a1 + ruview 2.0.0a1 to PyPI"*) claims +a publish that did not happen for that package — a real **claimed-vs-measured gap** +of exactly the kind [ADR-168](ADR-168-benchmark-proof.md) and the project's +"prove everything" posture exist to catch. + +### 1.2 Why the release pipeline was stuck (measured; interim-fixed — see §1.4) + +`gh run list --workflow pip-release` shows the last **4** runs all +`conclusion=failure` (most recent `2026-05-24T16:34`). The full failure log for +run `26366735779` (job *"Publish v1.99 tombstone"* → step *"Publish to PyPI"*) +shows two things: + +1. The publish step uses `pypa/gh-action-pypi-publish` with a `password` + (API-token) input and fails: + + ``` + 403 Forbidden — Invalid or non-existent authentication information. + ``` + + i.e. the `PYPI_API_TOKEN` GitHub secret is stale / expired / revoked. + +2. The action's own log warns: + + ``` + Warning: the workflow was run with 'attestations: true' ... but an explicit + password was also set, disabling Trusted Publishing. + ``` + +The workflow at `.github/workflows/pip-release.yml` wires `password: +${{ secrets.PYPI_API_TOKEN }}` into **four** publish steps (lines 249, 258, 282, +291) and declares only `permissions: contents: read` (line 49–50). So it is using a +rotatable, leak-able, expire-able API token in exactly the place ADR-117 §5.4 / §5.5 +and the issue #785 P5 row explicitly called for **OIDC Trusted Publishing** ("cp310 +… abi3-py310, OIDC"; ADR-117 §5.5 line 547: *"PyPI publish via Trusted Publisher +(OIDC, no API token in secrets)"*). **The implementation drifted from its own +design doc.** + +### 1.3 Why the package is still alpha (measured) + +`python/pyproject.toml` pins `version = "2.0.0a1"` (line 13) and +`Development Status :: 3 - Alpha` (line 26). Issue #785's closing criteria +(§"Done") require `wifi-densepose==2.0.0` (**not** alpha) published, plus all 10 +acceptance criteria in §11. None of those can be true today given §1.1–§1.2. + +**Why this matters:** ADR-117 is the sole Python entry point for the whole RuView +ecosystem (per its §2 "PyPI org presence check"). A stale token silently blocking +every release means the entire "plug-and-play Python entry point for the pip + +Jupyter customer base" thesis (issue #785 "Strategic alignment") is stalled behind a +one-line credential problem — and a commit message claims otherwise. + +### 1.4 Interim fix applied (2026-07-21) — credential unblocked, migration still pending + +**As of 2026-07-21T22:57:29Z the stale-credential symptom is fixed at the credential +layer.** The maintainer fetched a valid `PYPI_TOKEN` from GCP Secret Manager (project +`cognitum-20260110`) and ran `gh secret set PYPI_API_TOKEN` to replace the +revoked/expired value. Authentication was confirmed non-destructively via a +`twine upload --skip-existing` re-upload of the existing `1.99.0` tombstone artifacts, +which returned a benign 400/skip response (not the previous `403 Forbidden`) — proving +the new token authenticates correctly. + +This means **token-based publishing works again today** — the `403` root cause +described in §1.2 no longer reproduces. It does **not**, however, close this ADR: + +- A **manually-rotated token still expires, leaks, and can be revoked over time** — it + re-introduces exactly the silent-failure mode that blocked the last 4 runs. It is a + stopgap at the same layer as the §3.2 fallback, not the durable fix. +- The OIDC **Trusted Publishing migration (§3, P1) remains the decision** — a + credential PyPI mints per-run with no secret to rotate is the only fix that removes + the recurring-expiry class of failure. +- The other three gaps are **untouched** by this rotation: `wifi-densepose` is still + `2.0.0a1` (not stable `2.0.0`), and `ruview` is still unpublished. + +**Why/How to apply:** read §1.2's "root cause" as *diagnosed and temporarily +mitigated*, not *still broken*. A reviewer re-running the §7.5 check today may now see +a green token-based run — that is expected and does not satisfy this ADR, which is +Accepted only when §6's criteria pass **and** the workflow no longer carries a static +token (§7.4). + +--- + +## 2. Current state — evidence + +| Artifact | Value | Source | +|---|---|---| +| Latest stable `wifi-densepose` on PyPI | **1.99.0** (tombstone) | `pip index versions wifi-densepose` | +| `wifi-densepose==2.0.0` stable | **absent** | `pip index versions` (not listed) | +| `wifi-densepose==2.0.0a1` pre-release | present (alpha) | PyPI release history (`--pre`) | +| `ruview` on PyPI | **No matching distribution found** | `pip index versions ruview` | +| `pip-release.yml` last 4 runs | all `failure` | `gh run list --workflow pip-release` | +| Most recent failed run | `2026-05-24T16:34` | `gh run list` | +| Failing step | Publish v1.99 tombstone → Publish to PyPI | run `26366735779` log | +| Failure code | `403 Forbidden — Invalid or non-existent authentication information` | run `26366735779` log | +| Root cause | `PYPI_API_TOKEN` stale/revoked; explicit password disables Trusted Publishing | run `26366735779` log warning | +| `password:` uses in workflow | 4 (lines 249, 258, 282, 291) | `.github/workflows/pip-release.yml` | +| Workflow permissions | `contents: read` only (no `id-token: write`) | `pip-release.yml:49–50` | +| pyproject version | `2.0.0a1` | `python/pyproject.toml:13` | +| pyproject dev status | `3 - Alpha` | `python/pyproject.toml:26` | +| Issue #785 | **OPEN** | GitHub | + +**Why/How to apply:** treat this table as the falsifiable baseline. A reviewer who +re-runs each `Source` command must reproduce each `Value`, or this ADR is wrong and +should be revised before any remediation is attempted. + +--- + +## 3. Decision + +Complete ADR-117 by closing four gaps, in order: + +1. **Migrate `pip-release.yml` to PyPI Trusted Publishing (OIDC)** — as the durable + end-state, drop all four `password: ${{ secrets.PYPI_API_TOKEN }}` inputs, grant + `id-token: write` to the publish jobs, and add `environment: pypi`. This removes + the rotatable/expire-able credential and realigns with ADR-117 §5.5's stated OIDC + intent. **This is gated behind sub-phase P1b** (§5): the switch is inert — and in + fact 403-breaking — until the manual pypi.org registration (§3.1) exists, so the + OIDC change must land *together* with that registration. Until then, token auth + (the freshly-rotated `PYPI_API_TOKEN`, §1.4) is the correct active path and is + what the `RuView#786-pypi-token-auth` fix-marker guard enforces. An OIDC migration + was attempted (`cc153e8b5`) and reverted (`82d5c7339`) for exactly this reason. + +2. **Promote `wifi-densepose` from `2.0.0a1` to stable `2.0.0`** in + `python/pyproject.toml` (version + `Development Status :: 5 - Production/Stable`) + and record the promotion in `CHANGELOG.md`. + +3. **Actually publish `ruview==2.0.0`** — the sibling package that commit + `b71d243b4` claimed but never shipped — and verify it with `pip index versions`. + +4. **Adopt issue #785 §11's 10 acceptance criteria verbatim as this ADR's own + acceptance criteria** (§6 below), and only flip ADR-117 → Accepted and close + #785 once every one passes against the real index — proven, not claimed. + +### 3.1 Mandatory human prerequisite (cannot be automated) + +**Trusted Publishing requires a one-time manual step on `pypi.org` that no CLI, API, +or agent can perform** — PyPI restricts Trusted Publisher configuration to the +project owner via the web UI for security reasons. Before P1's workflow change can +succeed, a human with owner rights on both PyPI projects must: + +1. Log in to `pypi.org`. +2. For **`wifi-densepose`**: Project → *Publishing* → *Add a new pending/trusted + publisher* → GitHub, with: + - Owner: `ruvnet` + - Repository: `RuView` + - Workflow filename: `pip-release.yml` + - Environment: `pypi` +3. Repeat the identical step for the **`ruview`** project. Because `ruview` is not + yet on PyPI, register it as a **pending publisher** (PyPI supports configuring a + trusted publisher for a project name before its first release — the first OIDC + publish then creates the project). + +**Why/How to apply:** the workflow change in P1 is inert until this is done — the +publish step will fail with a "no trusted publisher configured" error rather than a +403. Land P1 and this manual step together; do not tag a release expecting OIDC to +work until a human confirms both entries exist. Treat this section as a blocking +checklist item on the release-day runbook, not a footnote. + +### 3.2 Fallback path (if the owner declines Trusted Publishing) + +If the maintainer prefers not to adopt OIDC yet, the code-side remediation is a +**token regeneration**, not a redesign: + +- Generate a fresh PyPI API token (scoped to the `wifi-densepose` and `ruview` + projects) and store it in GCP Secret Manager (project `cognitum-20260110`, where + the project's tokens live), then `gh secret set PYPI_API_TOKEN` from it, following + the existing runbook referenced in the workflow header (`docs/integrations/pypi-release.md`). +- Keep the current `password:`-based workflow unchanged. + +**Why/How to apply:** this path clears the 403 and unblocks releases immediately, +but it re-introduces the exact failure mode this ADR is trying to eliminate — a +credential that silently expires and blocks the whole Python entry point again. Use +it only as a stopgap; the Trusted Publishing migration (P1) is the durable fix and +should remain the default recommendation. + +--- + +## 4. Detailed design — workflow migration + +The change to `.github/workflows/pip-release.yml` is small and surgical. It does +**not** touch the build matrix (`build-wheels`, `build-sdist`, `build-tombstone` +jobs are unchanged — the 403 is a publish-credential problem, not a build problem). + +### 4.1 Grant OIDC token permission on the publish jobs + +The `gh-action-pypi-publish` action mints its OIDC token from the job's +`id-token: write` permission. The current top-level `permissions: contents: read` +must be extended on the two publish jobs (`publish-v2`, `publish-tombstone`) — plus +the future `publish-ruview` job: + +```yaml +publish-v2: + name: Publish v2 wheels + needs: [build-wheels, build-sdist] + permissions: + id-token: write # ← added: mint the OIDC token for PyPI + contents: read + environment: pypi # ← added: binds to the PyPI trusted-publisher entry +``` + +### 4.2 Drop the `password:` inputs + +Every publish step loses its `password:` line. Trusted Publishing needs no secret — +the action exchanges the job's OIDC token for a short-lived PyPI upload token +automatically: + +```yaml +# BEFORE (current — fails with 403 when the token is stale) +- name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_API_TOKEN }} # ← remove + packages-dir: dist + +# AFTER (Trusted Publishing — no secret, activates once the pypi.org entry exists) +- name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: dist +``` + +The TestPyPI dry-run steps keep `repository-url: https://test.pypi.org/legacy/` and +likewise drop `password:` — a matching trusted-publisher entry must be registered on +`test.pypi.org` if the dry-run path is to be used (otherwise gate the dry-run behind +the fallback token or remove it). + +**Why/How to apply:** the header comment block (lines 16–23) that documents the +`PYPI_API_TOKEN` / GCP-Secret-Manager runbook must be rewritten to document the +Trusted Publishing setup instead, so the next maintainer does not re-add a token +"to fix" a future failure and silently re-disable OIDC. + +### 4.3 Add the `publish-ruview` job + +`ruview` is published by a new job mirroring `publish-v2` (same `id-token: write` + +`environment: pypi`, no `password:`), gated on a `ruview`-scoped build. Because the +package has never shipped, its first successful OIDC publish creates the PyPI +project against the pending trusted-publisher entry from §3.1. + +--- + +## 5. Phase ledger + +``` +P1 ──► P1b ──► P2 ──► P3 ──► P4 +token OIDC version real close +unblock (gated) promote publish #785 +``` + +### P1 — Credential unblock (token auth, active) + +- [x] Rotate `PYPI_API_TOKEN` to a validated token (§1.4, `gh secret set`, verified + `2026-07-21T22:57:29Z` via `twine upload --skip-existing`). Token-based publishing + works today. +- [x] Keep `password: ${{ secrets.PYPI_API_TOKEN }}` as the active auth path, + satisfying the `RuView#786-pypi-token-auth` fix-marker guard. +- [ ] Rewrite the `pip-release.yml` header comment block so the next maintainer + knows OIDC is the intended P1b end-state (not a token to keep re-rotating forever). + +> Note: an OIDC migration was attempted (`cc153e8b5`) and **reverted** (`82d5c7339`) +> because it tripped the fix-marker guard before the pypi.org registration existed. +> The OIDC work is therefore tracked as P1b below, not P1. See the Status note. + +**Status 2026-07-21 — DESIGNED then REVERTED (token auth is the ACTIVE path):** +The OIDC migration was implemented (commit `cc153e8b5` — `id-token: write` + +`environment: pypi` on both publish jobs, all four `PYPI_API_TOKEN` password +inputs removed) but then **reverted** (commit `82d5c7339`) after it tripped the +pre-existing `RuView#786-pypi-token-auth` fix-marker guard +(`scripts/fix-markers.json`). That guard `require`s +`password: ${{ secrets.PYPI_API_TOKEN }}` and `forbid`s `id-token: write` +precisely because a half-activated OIDC path (id-token permission present, but no +Trusted Publisher yet registered on pypi.org) leaves publishing **403-broken** +rather than working — it correctly predicted this exact failure. The revert was +verified locally against the real checker (`python scripts/check_fix_markers.py` → +all 25 markers pass, exit 0) before pushing. + +**Active path today:** token-based auth via the freshly-rotated `PYPI_API_TOKEN` +(§1.4). The current `pip-release.yml` (HEAD `82d5c7339`) carries +`password: ${{ secrets.PYPI_API_TOKEN }}` at four publish steps plus a TODO +comment marking the OIDC follow-up. The OIDC switch is therefore **not** done — it +moves to sub-phase P1b below. + +**Why this revert was correct (measured, not claimed):** OIDC is the better +long-term design and matches ADR-117's original §5.5 P5 intent — but implementing +it *before* the manual pypi.org registration exists would have shipped a workflow +that looks migrated yet 403s on the next real publish. The fix-marker caught a +well-intentioned improvement that wasn't the honest, currently-working state, and +it was reverted rather than overridden. That is the same "measured not claimed" +discipline (per [ADR-168](ADR-168-benchmark-proof.md)) this entire ADR exists to +enforce — applied here to our own change. + +### P1b — Switch to OIDC Trusted Publishing (gated follow-up) + +- [ ] **(human, manual, pypi.org — BLOCKING)** Complete the §3.1 Trusted Publisher + registration for BOTH `wifi-densepose` and `ruview` (owner=ruvnet, repo=RuView, + workflow=pip-release.yml, environment=pypi). P1b must not start until this exists. +- [ ] Re-apply the `cc153e8b5` change (add `id-token: write` + `environment: pypi`, + drop the four `password:` inputs) as its own follow-up commit. +- [ ] Update the `RuView#786-pypi-token-auth` fix-marker in `scripts/fix-markers.json` + in the *same* commit — invert it to `require: id-token: write` / `forbid: + password: ${{ secrets.PYPI_API_TOKEN }}` — so the guard tracks the new intended + state instead of blocking it (referencing the TODO comment now in pip-release.yml). +- [ ] Confirm a green OIDC publish before removing the token, per §3.2's + keep-both-paths recommendation (OIDC first, token fallback until OIDC is proven). +- [ ] No capability gap: publishing must keep working across the P1→P1b transition. + +### P2 — Version promotion + changelog + +- [ ] `python/pyproject.toml`: `version = "2.0.0"` (drop the `a1` suffix). +- [ ] `python/pyproject.toml`: `Development Status :: 5 - Production/Stable`. +- [ ] `CHANGELOG.md`: `[Unreleased]` entry — "wifi-densepose 2.0.0 promoted from + alpha; ruview 2.0.0 first stable publish; pip-release migrated to Trusted Publishing". +- [ ] Confirm the `ruview` package's own version metadata is set to `2.0.0`. + +### P3 — Real publish + verification + +- [ ] Cut tag `v2.0.0-pip` (per the workflow's `v*-pip` trigger) → OIDC publish of + the `wifi-densepose` wheel matrix. +- [ ] Publish `ruview==2.0.0` via the new `publish-ruview` job. +- [ ] Run every command in §7 against the **real** PyPI index and capture output. +- [ ] Generate + commit `expected_features_v2.sha256` (issue #785 §11 criterion 10), + resolving ADR-117 §11.3 / the workflow header's Q3 note. + +### P4 — Close issue #785 + +- [ ] All 10 acceptance criteria (§6) pass against the real index. +- [ ] Flip ADR-117 §Status → **Accepted**. +- [ ] Flip this ADR (ADR-184) §Status → **Accepted**. +- [ ] Close issue #785. + +**Why/How to apply:** the phases are strictly ordered — P3 cannot succeed until both +P1 (working credential path) and the §3.1 human step are done, and P4 must not be +marked complete on the strength of a commit message (the failure mode this ADR +exists to correct). Nothing in this ledger is checked; this is a Proposed plan. + +--- + +## 6. Acceptance criteria (verbatim from issue #785 §11) + +A reviewer must be able to: + +1. `pip install --pre wifi-densepose==2.0.0a1` from PyPI test index → wheel installs + without compile step on Linux/macOS/Windows +2. `python -c "import wifi_densepose; print(wifi_densepose.__version__, wifi_densepose.__rust_version__)"` + → both versions print +3. `python -c "from wifi_densepose import CsiFrame; ..."` → core type round-trips + through PyO3 +4. `python -c "from wifi_densepose import vitals; vitals.detect_hr(...)"` → 4-stage + pipeline runs on a sample CSI buffer +5. `pip install wifi-densepose[client]; python -c "import wifi_densepose.client; ..."` + → WS client connects to a running sensing-server +6. `pytest python/tests/` → ≥30 tests pass (smoke + binding round-trips) +7. `maturin build --release --strip` → wheel under 5 MB per platform (ADR §5.4 budget) +8. `wifi-densepose==1.99.0` is the latest 1.x; `import wifi_densepose` raises + `ImportError` with migration URL +9. `wifi-densepose==1.0.0` is yanked from PyPI; `1.1.0` is un-yanked with deprecation + notice (90-day window) +10. Witness `expected_features_v2.sha256` generated in CI, committed alongside the + existing `archive/v1/data/proof/`, re-verifiable from Python via + `wifi_densepose.verify_witness(...)` + +**Note (amendment to criterion 1):** issue #785 §11 was written when `2.0.0a1` was +the target. This ADR promotes to stable `2.0.0`, so criterion 1 is read as +`pip install wifi-densepose==2.0.0` (no `--pre`) against the production index. The +`--pre`/`a1` wording is preserved verbatim above per the transcription requirement; +the stable form is what P3/P4 must actually satisfy. This ADR additionally requires +`ruview==2.0.0` to be installable (the sibling package from commit `b71d243b4`), +which #785 §11 did not enumerate but the issue "Done" section implies. + +--- + +## 7. How to verify (prove, don't claim) + +Exact commands a reviewer runs to prove — not assume — each gap is closed. Every one +produces falsifiable output; capture it in the PR that flips ADR-117 to Accepted. + +### 7.1 Both packages live and stable + +```bash +# wifi-densepose 2.0.0 (stable, NOT alpha) must appear +pip index versions wifi-densepose +# expect: "wifi-densepose (2.0.0)" and 2.0.0 in the available list + +# ruview 2.0.0 must now exist (currently: "No matching distribution found") +pip index versions ruview +# expect: "ruview (2.0.0)" +``` + +### 7.2 Clean-venv install + import (criteria 2–4) + +```bash +python -m venv /tmp/verify-184 && . /tmp/verify-184/bin/activate +pip install wifi-densepose==2.0.0 # stable, no --pre +python -c "import wifi_densepose; print(wifi_densepose.__version__, wifi_densepose.__rust_version__)" +python -c "from wifi_densepose import CsiFrame; print(CsiFrame([1.0]*56,[0.0]*56,56,0,100.0))" +python -c "from wifi_densepose import vitals; print(hasattr(vitals,'detect_hr'))" +pip install ruview==2.0.0 +python -c "import ruview; print(ruview.__version__)" +``` + +### 7.3 Tombstone still guards the 1.x line (criterion 8) + +```bash +pip install wifi-densepose==1.99.0 +python -c "import wifi_densepose" 2>&1 | grep -q "github.com/ruvnet/RuView" \ + && echo "PASS: tombstone raises with migration URL" \ + || echo "FAIL" +``` + +### 7.4 Workflow auth state + +**Current state (P1, active today):** token auth is the working path and is what +the `RuView#786-pypi-token-auth` fix-marker requires. The honest check today is +that token auth is present and the fix-marker guard passes: + +```bash +# token auth present (the ACTIVE, working path — expected PASS today) +grep -q 'password: ${{ secrets.PYPI_API_TOKEN }}' .github/workflows/pip-release.yml \ + && echo "PASS: token auth active" || echo "FAIL" + +# fix-marker regression guard must pass +python scripts/check_fix_markers.py && echo "PASS: all markers pass" +``` + +**P1b end-state (after the manual pypi.org registration):** the checks below flip +to PASS *only once P1b lands together with the fix-marker inversion* — they are +**not** expected to pass today and their passing now would mean a half-migrated, +403-prone workflow: + +```bash +# after P1b: no static token should remain in the publish steps +grep -nE 'password:|PYPI_API_TOKEN' .github/workflows/pip-release.yml \ + && echo "not yet: token still present (expected during P1)" \ + || echo "P1b done: no static token" + +# after P1b: id-token permission granted on publish jobs +grep -q 'id-token: write' .github/workflows/pip-release.yml \ + && echo "P1b done: OIDC permission present" \ + || echo "not yet: OIDC not enabled (expected during P1)" +``` + +### 7.5 The release actually went green + +```bash +gh run list --workflow pip-release --limit 1 +# expect: conclusion=success on the v2.0.0-pip tag run +``` + +**Why/How to apply:** §7.1 and §7.5 together are the minimal proof that the two +headline gaps (no stable 2.0.0, no `ruview`, dead pipeline) are closed. If any +command's actual output diverges from the `expect` line, the corresponding phase is +not done — regardless of what any commit message or checkbox says. + +--- + +## 8. Consequences + +### Positive + +- The Python entry point for the entire RuView ecosystem (issue #785 "Strategic + alignment") is unblocked with a credential that cannot silently expire. +- The claimed-vs-measured gap in commit `b71d243b4` (`ruview` never published) is + closed with reproducible proof, upholding the project's "prove everything" posture. +- Trusted Publishing removes a leak-able long-lived secret from CI entirely — the + security posture ADR-117 §5.5 originally specified. +- ADR-117 / issue #785 can finally reach a defensible Accepted/closed state instead + of sitting open behind a one-line token failure. + +### Negative + +- The `pypi.org` trusted-publisher registration (§3.1) is a hard human dependency + with no automated fallback beyond re-introducing a token (§3.2). Release day is + blocked on a person, not a pipeline. +- Promoting to stable `2.0.0` removes the alpha escape hatch — any binding bug now + ships under a stable version and needs a `2.0.1`, not a new `a`-tag. +- `test.pypi.org` needs its own trusted-publisher entry if the dry-run path is kept, + adding a second manual registration. + +### Neutral + +- The build matrix (`build-wheels`, `build-sdist`, `build-tombstone`) is untouched; + the risk surface of this change is confined to the three publish jobs. +- The witness-hash-v2 open question (ADR-117 §11.3, workflow header Q3) is pulled + into scope as criterion 10 but is orthogonal to the credential migration. + +--- + +## 9. References + +- **ADR-117** — `docs/adr/ADR-117-pip-wifi-densepose-modernization.md` (the design + this ADR completes; §5.4/§5.5 OIDC intent, §7.2 tombstone, §11.3 witness hash) +- **Issue #785** — https://github.com/ruvnet/RuView/issues/785 (tracking issue, + OPEN; §11 acceptance criteria transcribed in §6) +- **Workflow** — `.github/workflows/pip-release.yml` (four `password:` inputs at + lines 249/258/282/291; `contents: read` only at 49–50) +- **pyproject** — `python/pyproject.toml` (`version = "2.0.0a1"` line 13; + `3 - Alpha` line 26) +- **Failed run** — GitHub Actions `pip-release` run `26366735779`, job "Publish + v1.99 tombstone" → step "Publish to PyPI" (403 + Trusted-Publishing-disabled warning) +- **Commit `b71d243b4`** — *"feat(adr-117): publish wifi-densepose 2.0.0a1 + ruview + 2.0.0a1 to PyPI"* — the `ruview` publish it claims did not occur +- **PyPI Trusted Publishing** — https://docs.pypi.org/trusted-publishers/ (web-UI-only + registration; pending-publisher support for not-yet-created projects) +- **`pypa/gh-action-pypi-publish`** — https://github.com/pypa/gh-action-pypi-publish + (OIDC via `id-token: write`; `password:` disables Trusted Publishing) +- **ADR-168** — `docs/adr/ADR-168-benchmark-proof.md` (measured-not-claimed house style) diff --git a/docs/adr/ADR-185-python-p6-sota-bindings.md b/docs/adr/ADR-185-python-p6-sota-bindings.md new file mode 100644 index 00000000..16be714e --- /dev/null +++ b/docs/adr/ADR-185-python-p6-sota-bindings.md @@ -0,0 +1,687 @@ +# ADR-185: Python P6 SOTA bindings — AETHER, MERIDIAN, and MAT via PyO3 extras + +| Field | Value | +|-------|-------| +| **Status** | Proposed — **P1–P4 implemented & tested** (commits `d060998e3`, `189ac9dfb`, `1c9727f9c`, `0f405213d`) + **leaf-crate hoists done** (`a47bb71b2`/`7ed57f041`/`99fea9df9`); **not yet Accepted** (§6.6 CI gate PARTIAL, §6.7 accuracy bars OPEN — see §13) | +| **Date** | 2026-07-21 (impl status recorded 2026-07-21) | +| **Deciders** | ruv | +| **Codename** | **PIP-TRINITY** — three SOTA subsystems join the `wifi_densepose` wheel | +| **Relates to** | [ADR-117](ADR-117-pip-wifi-densepose-modernization.md) (PIP-PHOENIX — the PyO3 wheel this extends), [ADR-024](ADR-024-contrastive-csi-embedding-model.md) (AETHER contrastive embeddings), [ADR-027](ADR-027-cross-environment-domain-generalization.md) (MERIDIAN domain generalization), [ADR-152](ADR-152-wifi-pose-sota-2026.md) (WiFlow-STD ~96% PCK@20 SOTA bar) | +| **Tracking issue** | TBD — file under RuView issue tracker | + +--- + +## 1. Context + +### 1.1 Where ADR-117 stopped + +ADR-117 (PIP-PHOENIX) shipped the `wifi-densepose` v2.x PyPI wheel as a PyO3 + +maturin compiled extension (`wifi_densepose._native`) with a pure-Python facade. +The bound surface today (`python/src/bindings/*.rs`, `python/src/lib.rs`): + +| Bound today | Crate | Kind | +|---|---|---| +| `CsiFrame`, `Keypoint`, `KeypointType`, `BoundingBox`, `PersonPose`, `PoseEstimate` | `wifi-densepose-core` | P2 core types | +| 4-stage vitals (`BreathingExtractor`, `HeartRateExtractor`, `VitalEstimate`, `VitalReading`, `VitalStatus`) | `wifi-densepose-vitals` | P3 DSP | +| `BfldFrame`, `BfldReport`, `BfldKind` + `PrivacyClass` gate | `wifi-densepose-bfld` | P3.5 / ADR-118 | +| `SensingClient` (WS), `RuViewMqttClient` (MQTT), HA helpers | pure-Python `wifi_densepose.client` | P4 `[client]` extra | + +ADR-117's own phase ledger (§6, "P6+ — Deferred") explicitly parked three +higher-value subsystems as post-v2.0.0 work: + +> - [ ] `wifi-densepose-nn` bindings … · `wifi-densepose-ruvector` bindings … +> - [ ] MQTT/Matter integration helpers … + +and ADR-117 §5.1 deferred `wifi-densepose-mat` (depends on nn) and the RuVector +tier for wheel-size reasons. The three SOTA subsystems that a Python researcher +most wants — re-identification embeddings, cross-environment transfer, and the +disaster-triage tool — are precisely the ones still unreachable from +`pip install wifi-densepose`. + +### 1.2 The three subsystems already exist and are tested in Rust + +None of this is new research. Each subsystem is a shipped, tested Rust module: + +| Subsystem | ADR | Rust location (verified HEAD) | Nature | +|---|---|---|---| +| **AETHER** — contrastive CSI embedding / re-identification | ADR-024 | `wifi-densepose-sensing-server/src/embedding.rs` (`EmbeddingExtractor`, `ProjectionHead`, `CsiAugmenter`, `AetherConfig`, `aether_loss`, `info_nce_loss`, `alignment_metric`, `uniformity_metric`) | Pure-sync DSP + linear algebra; 128-dim L2-normalized embeddings | +| **MERIDIAN** — cross-environment domain generalization | ADR-027 | `wifi-densepose-train` (`domain::{DomainFactorizer, DomainClassifier, GradientReversalLayer, AdversarialSchedule}`, `geometry::{GeometryEncoder, FourierPositionalEncoding, FilmLayer, MeridianGeometryConfig}`, `rapid_adapt::{RapidAdaptation, AdaptationLoss}`, `virtual_aug::VirtualDomainAugmentor`, `eval::CrossDomainEvaluator`) + `wifi-densepose-signal::hardware_norm::{HardwareNormalizer, HardwareType, CanonicalCsiFrame}` | Inference/adaptation path is pure-Rust and **un-gated**; only `model`/`trainer`/`losses` need `tch-backend` (libtorch) | +| **MAT** — Mass Casualty Assessment Tool | (root CLAUDE.md crate table) | `wifi-densepose-mat` (`DisasterResponse`, `DisasterConfig`, `DetectionPipeline`, `EnsembleClassifier`, `TriageCalculator`, `TriageStatus`, `Survivor`, `VitalSignsReading`) | Cargo-feature-gated (`mat`); sync ingest (`push_csi_data`) + async scan loop (`start_scanning`, tokio) | + +### 1.3 Why now, and why gated extras + +Two forces make P6 timely: (a) the v2.0.0 wheel is stable and its abi3-py310 +build matrix is proven, so adding modules is incremental; (b) integrators reading +the ADR-115/ADR-117 notes are asking for Python access to re-identification and +cross-room transfer specifically. + +But pulling all three into the **default** wheel would break ADR-117 §5.4's +**≤ 5 MB per-platform wheel budget** and its "no heavy system deps" invariant: + +- MAT is already cargo-`mat`-gated upstream *because* it drags in the ML/detection + stack; the default wheel must not carry it. +- MERIDIAN's training path (`model`/`trainer`/`losses`) is `tch-backend`-gated and + would pull libtorch (30 MB+), the exact wheel-size risk ADR-117 §5.1 flagged. + +So P6 mirrors the existing `[client]` extra pattern (ADR-117 §5.6): each subsystem +becomes an **optional pip extra**, and the compiled surface is **feature-gated in +`wifi-densepose-py`'s `Cargo.toml`** so the default wheel stays lean. + +### 1.4 What this ADR is *not* + +- Not a port of the Rust subsystems to Python — the Rust workspace stays + authoritative and unmodified, exactly as ADR-117 §1.3 established. +- Not the `wifi-densepose-nn` / libtorch binding (still deferred; MERIDIAN binds + only the un-gated inference/adaptation path, not `tch-backend` training). +- Not a change to the default wheel's contents, size budget, or abi3 base. + +--- + +## 2. Gap analysis + +| Capability | Rust crate(s) | pip v2.x status | Gap severity | +|---|---|---|---| +| Extract a 128-dim re-ID embedding from a CSI window | `sensing-server::embedding` (AETHER) | Not present | **High** | +| Compare two CSI observations by learned similarity (same room? same person?) | AETHER `EmbeddingExtractor` + cosine | Not present | **High** | +| Hardware-invariant CSI normalization (ESP32 / Intel 5300 / Atheros → canonical 56) | `signal::hardware_norm` (MERIDIAN) | Not present | **High** | +| Geometry-conditioned zero-shot deployment (AP positions → FiLM) | `train::geometry` (MERIDIAN) | Not present | **Medium** | +| 10-second unlabeled few-shot room adaptation | `train::rapid_adapt` (MERIDIAN) | Not present | **Medium** | +| Cross-domain evaluation protocol (in/cross/few-shot MPJPE) | `train::eval` (MERIDIAN) | Not present | **Medium** | +| Disaster-survivor detection + START triage from CSI | `wifi-densepose-mat` | Not present | **Medium** (specialist audience) | + +--- + +## 3. Decision + +Adopt **three new optional pip extras**, each binding one SOTA subsystem into the +existing `wifi_densepose` wheel as a dedicated Python submodule, gated behind a +matching Cargo feature so the default wheel is unchanged: + +``` +pip install wifi-densepose # unchanged: core + vitals + bfld (≤5 MB) +pip install wifi-densepose[aether] # + wifi_densepose.aether +pip install wifi-densepose[meridian] # + wifi_densepose.meridian +pip install wifi-densepose[mat] # + wifi_densepose.mat (mirrors upstream `mat` cargo feature) +pip install wifi-densepose[sota] # convenience: aether + meridian + mat +``` + +This path is called **PIP-TRINITY**. It reuses ADR-117's established idiom +end-to-end: `#[pyclass]` newtype wrappers holding an `inner` Rust value, `#[new]` +constructors, `#[getter]` accessors, `__repr__`, a per-module `register(m)` fn, +and — critically — **GIL release via `py.allow_threads(|| …)` on every +compute-heavy call**, exactly as `bindings/vitals.rs:229` and `:293` already do. + +### 3.1 Feature gating in `wifi-densepose-py` + +New Cargo features and optional path-deps in `python/Cargo.toml`; each binding +module is `#[cfg(feature = "…")]`-compiled and conditionally `register()`ed in +`src/lib.rs`, so a default build links none of the three: + +```toml +[features] +default = [] +aether = ["dep:wifi-densepose-sensing-server"] +meridian = ["dep:wifi-densepose-train", "dep:wifi-densepose-signal"] +mat = ["dep:wifi-densepose-mat"] # upstream `mat` feature flows through +sota = ["aether", "meridian", "mat"] + +[dependencies] +wifi-densepose-sensing-server = { version = "0.3.0", path = "../v2/crates/wifi-densepose-sensing-server", optional = true, default-features = false } +wifi-densepose-train = { version = "0.3.0", path = "../v2/crates/wifi-densepose-train", optional = true, default-features = false } # NO tch-backend +wifi-densepose-signal = { version = "0.3.0", path = "../v2/crates/wifi-densepose-signal", optional = true } +wifi-densepose-mat = { version = "0.3.0", path = "../v2/crates/wifi-densepose-mat", optional = true, default-features = false } +``` + +`[project.optional-dependencies]` in `pyproject.toml` gains `aether`, `meridian`, +`mat`, and `sota` keys mirroring the existing `client`/`dev` extras. Because each +extra changes the compiled surface, extras map to **cibuildwheel feature-flag +builds**, not pure-Python markers — the publish workflow (ADR-117 §5.4) gains a +build axis for the `[sota]` wheel variant. + +### 3.2 Binding surface — AETHER (`wifi_densepose.aether`) + +Backing crate: `wifi-densepose-sensing-server::embedding` (ADR-024 §2.6). The +crate is Axum/tokio-based, so we depend on it `default-features = false` and bind +**only the sync `embedding` types** — never the server/runtime. If the embedding +module cannot be reached without a tokio dependency (Open Question §11.1), the +fallback is to hoist `embedding.rs` into a leaf crate; that is a Rust-side +refactor, not a Python API change. + +| Python symbol | Wraps | Signature (Python) | +|---|---|---| +| `AetherConfig` | `AetherConfig` | `AetherConfig(d_model=64, d_proj=128, temperature=0.07, vicreg_alpha=1.0, vicreg_beta=25.0, vicreg_gamma=1.0)` — frozen, `__repr__` | +| `CsiAugmenter` | `CsiAugmenter` | `CsiAugmenter(seed)`; `.augment(window: list[list[float]]) -> list[list[float]]` | +| `EmbeddingExtractor` | `EmbeddingExtractor` | `.embed(csi_features: list[list[float]]) -> list[float]` (128-dim, L2-normed); `.forward_dual(...) -> tuple[PoseEstimate, list[float]]` | +| `aether_loss(...)` | `aether_loss` | returns `AetherLossComponents(total, info_nce, variance, covariance)` — frozen dataclass-like | +| `cosine_similarity(a, b)` | thin helper | `float`; convenience for re-ID scoring (not a re-impl — calls the same dot product) | +| `alignment_metric`, `uniformity_metric` | same | `float` | + +GIL strategy: `embed`, `forward_dual`, `augment`, and `aether_loss` wrap their +Rust call in `py.allow_threads(|| …)` — these are pure-sync matrix ops that touch +no Python objects, matching the vitals precedent. A single-frame `embed()` is +sub-millisecond (ADR-024 §2.8 target <1 ms FP32), but batch/augment calls exceed +the 0.5 ms GIL-release threshold ADR-117 §P3 set. + +`.pyi` stubs: add `wifi_densepose/aether.pyi` declaring the five classes/functions +with precise numeric types; extend the top-level `wifi_densepose/__init__.pyi` +with a `TYPE_CHECKING`-guarded re-export so `mypy --strict` sees them only when +the extra is installed. + +### 3.3 Binding surface — MERIDIAN (`wifi_densepose.meridian`) + +Backing crates: `wifi-densepose-train` (inference/adaptation path, **no +`tch-backend`**) + `wifi-densepose-signal::hardware_norm`. The `model`/`trainer`/ +`losses` modules are libtorch-gated and are **out of scope** — Python gets the +domain-generalization *inference and calibration* surface, not the training loop. + +| Python symbol | Wraps | Signature (Python) | +|---|---|---| +| `HardwareType` | `HardwareType` | `#[pyclass(eq, eq_int, hash, frozen)]` enum: `Esp32S3 / Intel5300 / Atheros / Generic`; `HardwareType.detect(subcarrier_count) -> HardwareType` | +| `HardwareNormalizer` | `HardwareNormalizer` | `.normalize(frame: CsiFrame, hw: HardwareType) -> CanonicalCsiFrame` | +| `CanonicalCsiFrame` | `CanonicalCsiFrame` | frozen; `.amplitudes`, `.phases`, `.hardware_type` getters | +| `GeometryEncoder` | `GeometryEncoder` | `GeometryEncoder(MeridianGeometryConfig)`; `.encode(ap_positions: list[tuple[float,float,float]]) -> list[float]` (64-dim, permutation-invariant) | +| `MeridianGeometryConfig` | `MeridianGeometryConfig` | frozen config | +| `RapidAdaptation` | `RapidAdaptation` | `.calibrate(csi_windows: list[list[list[float]]]) -> AdaptationResult` (10-sec unlabeled few-shot) | +| `AdaptationResult` | `AdaptationResult` | frozen result: `.frames_used`, `.converged`, `.loss` | +| `CrossDomainEvaluator` | `CrossDomainEvaluator` | `.evaluate(...) -> dict[str, float]` (in/cross/few-shot MPJPE, domain-gap ratio) | + +GIL strategy: `normalize`, `encode`, `calibrate`, and `evaluate` are wrapped in +`py.allow_threads`. `normalize` targets <50 µs/frame (ADR-027 §4.1) and `encode` +<100 µs (§4.3), but `calibrate` runs contrastive test-time training over 200 +frames and is the primary GIL-release beneficiary. + +`.pyi` stubs: `wifi_densepose/meridian.pyi`. `DomainFactorizer` / +`GradientReversalLayer` / `VirtualDomainAugmentor` are **training-time only** and +are *not* bound in P6 (they need the tch training loop) — Open Question §11.2 +records this boundary. + +### 3.4 Binding surface — MAT (`wifi_densepose.mat`) + +Backing crate: `wifi-densepose-mat`, bound behind the `[mat]` extra so the +disaster/ML stack never enters the default wheel — mirroring the upstream `mat` +cargo feature exactly. `DisasterResponse::start_scanning` is async (tokio); rather +than bind an event loop, P6 binds the **sync ingest + query surface** and a +single-shot `scan_once()` helper (a sync wrapper over one `scan_cycle`, added +Rust-side if needed — see §11.3). + +| Python symbol | Wraps | Signature (Python) | +|---|---|---| +| `DisasterType` | `DisasterType` | `#[pyclass(eq, eq_int, hash, frozen)]` enum: `Earthquake / BuildingCollapse / Avalanche / Flood / Mine / Unknown` | +| `TriageStatus` | `TriageStatus` | frozen enum (START protocol classes) | +| `DisasterConfig` | `DisasterConfig` | builder-style kwargs: `DisasterConfig(disaster_type, sensitivity=0.8, confidence_threshold=0.5, max_depth=5.0)` | +| `DisasterResponse` | `DisasterResponse` | `.push_csi_data(amplitudes, phases)`; `.scan_once()`; `.survivors() -> list[Survivor]`; `.survivors_by_triage(status) -> list[Survivor]` | +| `Survivor` | `Survivor` | frozen: `.id`, `.triage_status`, `.location`, `.vital_signs` getters | +| `VitalSignsReading` | `VitalSignsReading` | frozen: breathing / heartbeat / movement fields | + +GIL strategy: `push_csi_data` and `scan_once` wrap the detection-pipeline call in +`py.allow_threads` — the ensemble classifier + localization are the compute-heavy +part and touch no Python state. + +`.pyi` stubs: `wifi_densepose/mat.pyi`. + +--- + +## 4. Benchmarking & the measured-vs-claimed parity requirement + +A binding that "runs without crashing" is worthless if it silently regresses +accuracy versus the native Rust call. The point of P6 is to prove the Python +surface reproduces the Rust subsystem **bit-for-bit**, then to hold each binding +to the *same* published SOTA bar its ADR already claims. + +### 4.1 Parity harness (bit-for-bit, mandatory) + +Each subsystem ships a golden-vector parity test. A committed input fixture is +run through **both** a tiny native-Rust reference binary (in +`v2/crates/wifi-densepose-py/tests/golden/`) and the Python binding; the two +outputs must hash-match under SHA-256 (the ADR-028 / ADR-117 §5.7 witness scheme): + +- `aether`: identical 128-dim embedding bytes for a fixed CSI window + fixed seed. +- `meridian`: identical `CanonicalCsiFrame` bytes for a fixed ESP32 (64-sub) and + Intel-5300 (30-sub) frame; identical 64-dim geometry vector for fixed AP set. +- `mat`: identical triage classification + survivor count for a fixed CSI stream. + +A mismatch is a **release blocker**, not a warning. This is the "MEASURED, not +CLAIMED" gate the project holds itself to. + +**Scope, stated honestly:** parity proves the **strongest claim available today** — +the Python binding is bit-identical to native Rust for the bound surface. It is +**not** accuracy validation. The bound AETHER surface moreover ships *untrained* +(random-init weights; a `load_weights` API exists since `65da488ad` but no trained +checkpoint exists to load — §6.7.2, §13.c.a), so byte-equality here says nothing +about the SOTA accuracy bars in §4.3; those remain OPEN (§6.7, §13.c). + +### 4.2 pytest-benchmark micro-benchmarks + +Following the existing `python/bench/test_bench_vitals.py` pattern (skipped by +default via `addopts`; run with `pytest python/bench/ --benchmark-only`): + +- `python/bench/test_bench_aether.py` — steady-state `embed()` per-window cost; + assert < 2 ms (ADR-024 §2.8 FP32 target < 1 ms with headroom) and that batched + `embed()` scales linearly (no accidental O(n²)). +- `python/bench/test_bench_meridian.py` — `normalize()` < 200 µs/frame, + `encode()` < 200 µs (ADR-027 §4.1/§4.3 targets ×2 headroom). +- `python/bench/test_bench_mat.py` — `scan_once()` per-cycle cost bounded by the + configured scan interval. + +### 4.3 SOTA accuracy bar the binding must reproduce (not merely run) + +The parity harness (§4.1) guarantees the Python path is byte-identical to Rust, so +these published numbers are the bar the *binding output* is validated against on a +committed labeled fixture — a regression in any is a binding bug: + +| Metric | Bar | Source | +|---|---|---| +| WiFlow-STD pose accuracy | **~96% PCK@20** (MEASURED-EQUIVALENT) | ADR-152 §2.2 | +| Room identification (k-NN on `env_fingerprint`) | **> 95%** | ADR-024 §2.8 | +| Person re-ID mAP | **> 80%** (WhoFi bar 95.5% on NTU-Fi) | ADR-024 §2.8, §1.5 | +| Anomaly detection F1 | **> 0.90** | ADR-024 §2.8 | +| INT8 rank correlation vs FP32 (Spearman) | **> 0.95** | ADR-024 §2.8 | +| Cross-domain MPJPE improvement | **> 20%** vs non-adversarial | ADR-027 §4.2 | +| Domain-gap ratio (cross/in-domain) | **< 1.5** | ADR-027 §4.6 | +| Few-shot MPJPE after 10-sec calibration | within **15%** of in-domain | ADR-027 §4.5 | + +--- + +## 5. Phase ledger + +``` +P1 ──► P2 ──► P3 ──► P4 +aether meridian mat docs + +bindings bindings behind examples + extra +``` + +> **Implementation note (2026-07-21):** P1–P4 were built against the **real Rust +> code at HEAD**, not this ADR's proposed surface. Where §3's proposed API named +> functions/fields that do not exist in the crates (e.g. `aether_loss`/VICReg +> components/`alignment_metric`/`forward_dual`, `RapidAdaptation.calibrate`, +> `AdaptationResult.converged`), the coder **did not fabricate them** — the real +> API was bound and the deviation documented in each module header and commit body. +> Treat §3 as the original proposal and the commit messages as the authoritative +> record of what shipped. + +### P1 — AETHER bindings (`[aether]` extra) — **DONE** (`d060998e3`; leaf-crate hoist `a47bb71b2`) + +- [x] `aether` Cargo feature + gated optional `wifi-densepose-sensing-server` dep; + default build links **0** sensing-server refs (base wheel stays lean). +- [x] `python/src/bindings/aether.rs` — `AetherConfig` (→ real `EmbeddingConfig`), + `CsiAugmenter.augment_pair`, `EmbeddingExtractor.embed` (128-dim L2-normed, + GIL-released), `info_nce_loss`, `cosine_similarity`. **Not bound** (absent in + `embedding.rs` at HEAD, a Rust-side gap, not fabricated): `aether_loss`/VICReg + components, `alignment_metric`, `uniformity_metric`, `forward_dual`, `vicreg_*`. +- [x] `#[cfg(feature = "aether")]` gate + facade + `aether.pyi` + `[aether]` extra. +- [x] `python/tests/golden/aether_embedding.sha256` parity fixture: + `tests/aether_parity.rs` locks the native reference; `tests/test_aether.py` + asserts identical SHA-256 of the LE-f32 bytes. +- [x] **Verified:** `cargo test --features aether --test aether_parity` → 2/2; + `pytest tests/test_aether.py` → 9/9. +- [x] **Leaf-crate hoist (`a47bb71b2`):** `embedding.rs` moved into a new + `wifi-densepose-aether` crate. Measured stripped wheel **~361 KB → ~312 KB** (was + already ~14× under the 5 MB budget — see §13.a; the hoist's value is build-time + 71 s → 12 s + dep-graph hygiene, not size). No regression: `aether_parity` 2/2, + `pytest` 9/9, sensing-server 217+388 tests 0 failed, new `wifi-densepose-aether` + crate 96 passed. + +### P2 — MERIDIAN bindings (`[meridian]` extra) — **DONE** (`189ac9dfb`) + +- [x] `meridian` feature + gated optional `wifi-densepose-train` (**no `tch-backend` + — libtorch avoided, confirmed**) + `wifi-densepose-signal` deps. +- [x] `python/src/bindings/meridian.rs` — `HardwareType`/`HardwareNormalizer`/ + `CanonicalCsiFrame` (real API: `normalize(amplitude, phase, hw)` over f64 → + `Result`; singular `amplitude`/`phase` fields), `MeridianGeometryConfig`/ + `GeometryEncoder` (64-dim, permutation-invariant), `RapidAdaptation` + (**real API: `push_frame` + `adapt()`**, not the ADR's `calibrate`) → + `AdaptationResult` (`lora_weights`/`final_loss`/`frames_used`/ + `adaptation_epochs`; **no `converged`**), `CrossDomainEvaluator` + `mpjpe`. All + compute paths GIL-released. Training-time types (`DomainFactorizer`, GRL, + `VirtualDomainAugmentor`) correctly left out of P6 scope. +- [x] Gate + facade + `meridian.pyi` + `[meridian]` extra; default dep graph has 0 + train/signal/sensing-server refs. +- [x] `tests/golden/meridian_output.sha256` parity fixture (esp32 + intel canonical + frames + 64-dim geometry vector + rapid-adapt LoRA weights). +- [x] **Verified:** `cargo test --features meridian --test meridian_parity` → 2/2; + `pytest tests/test_meridian.py` → 13/13. + +### P3 — MAT bindings behind `[mat]` extra — **DONE** (`1c9727f9c`) + +- [x] `mat` feature + gated optional `wifi-densepose-mat` dep. **§11.3 resolved: no + Rust change needed** — the public async `start_scanning()` already runs exactly + one `scan_cycle` when `continuous_monitoring == false`; the binding forces that + flag off and drives one cycle on a private current-thread tokio runtime. +- [x] `python/src/bindings/mat.rs` — `DisasterType` (**9 variants at HEAD**, not the + 6 the ADR listed), `TriageStatus` (5, START), `DisasterConfig`, + `DisasterResponse` (`initialize_event`/`add_zone`/`push_csi_data`/`scan_once`/ + `survivors`/`survivors_by_triage` — `initialize_event`+`add_zone` are **required + additions** the ADR surface omitted), `Survivor` (`latest_vitals`, since real + `vital_signs` is a history), `VitalSignsReading`, `ScanZone.rectangle`/`.circle`. + `push_csi_data`+`scan_once` GIL-released. +- [x] Gate + facade + `mat.pyi` + `[mat]` **and** `[sota]` (superset) extras. +- [x] `tests/golden/mat_result.sha256` parity fixture over a canonical + `count=;triage_priorities=` string (UUIDs/timestamps excluded as + non-deterministic). **Honest scope: proves binding==native path, NOT live + detection accuracy** — the synthetic stream yields 1 survivor, triage Delayed. +- [x] **Verified:** `cargo test --features mat --test mat_parity` → 2/2; + `pytest tests/test_mat.py` → 7/7. + +### P4 — Docs, examples, and benchmark suite — **DONE** (`0f405213d`) + +- [x] `python/bench/test_bench_{aether,meridian,mat}.py` (pytest-benchmark, §4.2). + Measured on a `--release --features sota` wheel: AETHER `embed()` ~150 µs + (target <2 ms), batch 1/8/64 = 140/1091/8509 µs (linear); MERIDIAN `normalize()` + ~2.2 µs (target <200 µs), `encode()` ~6.9 µs; MAT ingest+`scan_once()` ~40 ms / + 256-frame (< 500 ms). All pass. +- [x] `python/examples/{reid_from_csi,cross_room_calibrate,mat_triage}.py` — typed, + runnable, `mypy --strict` clean; README SOTA extras table. +- [~] Parity harness wiring into CI as a **release-blocking gate** — golden gates + are green locally (`cargo test --features sota` → 6/6; 3/3 SHA gates), but the CI + **wiring** is not done (§6.6 PARTIAL — see §13.b). +- [ ] Update ADR-117 §6 "P6+ Deferred" to point at this ADR — still open. + +### P5 — New required follow-ups (blocking Accepted) + +See §13. In short: (a) three leaf-crate hoists — **DONE** (`a47bb71b2`/`7ed57f041`/ +`99fea9df9`; only MAT was a real budget fix, AETHER was a false alarm), (b) wire the +parity harness into CI as an actual release gate — **still open**, (c) source/generate +labeled fixtures to validate the SOTA accuracy bars (§4.3) for real — **still open**. + +### P6+ — Deferred (unchanged from ADR-117) + +- [ ] `wifi-densepose-nn` / libtorch bindings (MERIDIAN training loop, + `DomainFactorizer`, GRL) — still blocked on the libtorch wheel-size question. +- [ ] `wifi-densepose-ruvector` RuVector attention bindings. +- [ ] Matter integration helpers. + +--- + +## 6. Acceptance criteria + +Status recorded from the P4 self-verification run (`0f405213d`), reference machine +per ADR-117 §10. **7 of 9 met; 2 remain** — the ADR is therefore **not** Accepted. + +- [x] **§6.1** `pip install wifi-densepose` (no extras) → default wheel **279 KB** + (≤ 5 MB); `build_features()` carries no `p6-*` feature — base wheel byte-for-byte + unaffected by P6. **PASS** +- [x] **§6.2** `pytest python/tests/test_aether.py -q` — **9/9**, incl. a real + 128-dim `embed()` round-trip asserting L2-norm ≈ 1.0 and byte-identity to the + golden Rust reference. **PASS** +- [x] **§6.3** `pytest python/tests/test_meridian.py -q` — **13/13**, incl. + ESP32 (64-sub) **and** Intel-5300 (30-sub) canonicalization hash-matching native + Rust. **PASS** +- [x] **§6.4** `pytest python/tests/test_mat.py -q` — **7/7**, incl. a fixed CSI + stream whose triage classification matches native `DisasterResponse` exactly. + **PASS** +- [x] **§6.5** `pytest python/bench/ --benchmark-only` — all targets met (AETHER + `embed()` ~150 µs < 2 ms; MERIDIAN `normalize()` ~2.2 µs, `encode()` ~6.9 µs + < 200 µs; MAT `scan_once()` ~40 ms < 500 ms). **PASS** +- [~] **§6.6** Parity harness (§4.1): all three golden-vector SHA-256 gates green + (`cargo test --features sota` → 6/6). **But CI wiring** as a release-blocking + gate is **not done** (out of `python/` scope). **PARTIAL — see §13.b.** +- [ ] **§6.7** SOTA-bar reproduction (§4.3): **definitively OPEN** — cannot be + closed transitively via the parity harness. Investigated; three concrete reasons: + 1. **The native SOTA numbers aren't reproduced by any committed, runnable-today + test.** ADR-152 ~96% PCK@20 is a frozen result in + `benchmarks/wiflow-std/results/eval_retrained.json` that points at an **external + checkpoint** (`/home/ruvultra/wiflow-std-bench/upstream/test/best_pose_model.pth`, + not in the repo); the only relevant test `test_wiflow_std_parity.rs` is + `#![cfg(feature = "tch-backend")]` **and** `#[ignore]`d (needs gitignored + fixtures + LibTorch). ADR-027's `eval.rs::CrossDomainEvaluator` tests are pure + unit-math on hand-coded 2–3-element vectors, not dataset accuracy. ADR-024's + only accuracy-ish test asserts Spearman > 0.90 on **synthetic random** + embeddings (not real CSI, not the published > 0.95 bar); no room-ID / mAP / + anomaly-F1 test exists at all. + 2. **The bound AETHER surface ships untrained.** `EmbeddingExtractor`/ + `ProjectionHead` default to random Xavier init (`Linear::with_seed(…, + 2024/2025)`, `embedding.rs:97–98`). A weight-loading API now **does** exist + (`load_weights`/`save_weights`, `65da488ad` — see §13.c.a), so the earlier + "no loading path" blocker is removed; but **no trained checkpoint exists** to + load, so the binding still produces untrained embeddings and cannot validate + mAP > 80% or any trained-model bar today. + 3. **No committed labeled CSI input/pose-pair data exists** to reuse (MM-Fi/NTU-Fi + appear only as config-default subcarrier counts / external paths; + `benchmarks/wiflow-std/results/*.npy` are corruption masks + result summaries, + not labeled fixtures). + The §4.1 parity harness proves the **strongest claim available today** — the + Python binding is bit-identical to native Rust for the bound (untrained) surface. + That is **not** accuracy validation. **See §13.c.** +- [x] **§6.8** `.pyi` stubs present for all three modules; `mypy --strict` passes on + the three examples. **PASS** +- [x] **§6.9** `python -c "import wifi_densepose.aether"` (etc.) on the base wheel + raises a clear `ImportError` naming the missing extra. **PASS** + +No regression: 76 pre-existing tests pass on the default wheel. The two unmet +criteria (§6.6 CI wiring, §6.7 accuracy) plus the wheel-size hoists (§13.a) are the +gate to Accepted. + +--- + +## 7. Consequences + +### 7.1 Positive + +- **Closes the ADR-117 P6 gap**: the three most-requested SOTA subsystems become + scriptable from Python without touching the Rust workspace. +- **Default wheel stays lean**: feature-gated extras preserve ADR-117 §5.4's ≤ 5 MB + budget and "no heavy system deps" invariant; MAT's ML stack and MERIDIAN's + libtorch path never enter the base wheel. +- **Reuses the proven idiom**: no new binding machinery — same `#[pyclass]` + + `py.allow_threads` + `register()` pattern already shipping in `bindings/vitals.rs`. +- **Prove-everything alignment**: the parity harness makes "the Python binding + equals the Rust core" a *measured, hash-verified* claim, not an assertion — + matching the project's MEASURED-vs-CLAIMED discipline. +- **Upstream consistency**: `[mat]` pip extra mirrors the `mat` cargo feature, so + the Python packaging story matches the Rust one exactly. + +### 7.2 Negative + +- **cibuildwheel matrix grows**: `[sota]` is a distinct compiled variant, adding a + build axis (and CI time) beyond ADR-117's 5-wheel abi3 matrix. +- **AETHER's backing crate is server-shaped**: depending on + `wifi-densepose-sensing-server` (Axum/tokio) risks pulling a runtime into an + extension module; may force a Rust-side refactor to hoist `embedding.rs` into a + leaf crate (§11.1). +- **MERIDIAN surface is partial**: training-time types (`DomainFactorizer`, GRL, + `VirtualDomainAugmentor`) stay unbound until the deferred libtorch tier, so the + Python API is inference/adaptation-only — potential user confusion (mitigated by + docs + `.pyi` omissions). +- **Golden fixtures are maintenance surface**: any intentional numeric change in a + Rust subsystem requires regenerating and re-witnessing its golden vector. + +### 7.3 Neutral + +- The `[sota]` convenience extra is purely additive; users who want one subsystem + install one extra. +- No change to the v2.0.0 semver line; extras ship additively as v2.x.y. + +--- + +## 8. Alternatives considered + +### Alt-A: Fold all three into the default wheel + +Rejected — breaks ADR-117 §5.4's ≤ 5 MB budget, drags MAT's ML stack and (via +MERIDIAN training) libtorch into every install, and contradicts the upstream +`mat` cargo-feature gating. + +### Alt-B: Separate PyPI packages (`wifi-densepose-aether`, etc.) + +Rejected for the SOTA trio — three packages fragment the import namespace and +duplicate the abi3/cibuildwheel setup. (This remains the right call for the +libtorch `nn` tier per ADR-117 Open Q §11.2, which is genuinely heavy.) Extras of +one wheel keep `wifi_densepose.*` coherent. + +### Alt-C: Pure-Python reimplementation of the three subsystems + +Rejected explicitly — this is the exact drift ADR-117 §8 Alt-C was created to +exit. A Python reimplementation would immediately begin diverging from the Rust +SOTA and could not pass the §4.1 bit-for-bit parity gate. + +### Alt-D: REST/WS client to a running sensing-server for AETHER + +Rejected as the primary path — provides zero offline embedding utility and cannot +host the parity harness over local Rust code (same reasoning as ADR-117 §8 Alt-B). +The pure-Python client layer (`[client]`) remains available for streaming. + +--- + +## 9. Risks + +| Risk | Likelihood | Severity | Mitigation | +|---|---|---|---| +| `wifi-densepose-sensing-server` pulls tokio into the extension module | ~~High~~ **Not realized** | ~~High~~ **Low** | **Measured, not realized:** the stripped `[aether]` wheel was **~361 KB** (14× under budget) even before the hoist — linker DCE (`--gc-sections`) strips the server's unreached Axum/tokio/worldgraph code because the binding reaches only pure-compute symbols. Hoist (`a47bb71b2`) still done for build-time / dep-graph hygiene, not budget. See §11.1, §13.a | +| MERIDIAN accidentally links `tch-backend` (libtorch) via a default feature | Medium | High | Explicit `default-features = false` on `wifi-densepose-train`; CI `auditwheel`/`ldd` check that no libtorch symbol is present in the `[meridian]` wheel | +| `[sota]` build axis blows up cibuildwheel time | Medium | Medium | Build `[sota]` variant only on tagged releases, not every PR | +| Golden vectors drift when a Rust subsystem changes intentionally | Medium | Low | Documented regeneration step + ADR-028 witness re-sign; parity mismatch is a loud release blocker, never silent | +| MAT async-only surface has no clean sync entry point | Medium | Medium | Add sync `scan_once()` wrapper Rust-side (§11.3) before binding | +| Users install base wheel and expect `wifi_densepose.aether` | Low | Low | Clear `ImportError` naming the missing extra (acceptance criterion §6) | + +--- + +## 10. Compatibility + +- No change to the default wheel, its abi3-py310 base, or its size budget. +- Extras ship additively on the existing v2.x line; no semver break. +- `[mat]` pip extra ↔ `mat` cargo feature parity is preserved by construction. +- `.pyi` stubs are gated so `mypy --strict` only sees a subsystem when its extra + is installed. + +--- + +## 11. Open questions + +1. **AETHER crate shape** — **RESOLVED (`a47bb71b2`).** The original worry that + linking `wifi-densepose-sensing-server` would bloat the wheel was **never + measured** — it reasoned from the dependency tree (server has non-optional + tokio/Axum ⇒ wheel must be huge). The stripped-release measurement disproves it: + `[aether]` was **369,782 B (~361 KB)** *before* the hoist — already ~14× under + the 5 MB budget — and **319,719 B (~312 KB)** after. Linker dead-code elimination + (`--gc-sections` on the pyo3 cdylib) already strips the server's unreached + Axum/tokio/worldgraph/ruvector paths because the binding reaches only + pure-compute symbols. The hoist into `wifi-densepose-aether` was still done — its + real payoff is **build-time** (`[aether]` alone 71 s → 12 s), **dep-graph + hygiene** (`python/Cargo.lock` −1238 lines), and **removing latent risk** (a + future change that makes server code reachable would then genuinely bloat the + wheel). **Convention note:** measure the stripped release wheel size before + assuming a dependency-tree risk requires a hoist — linker DCE handles pure-Rust + unreached code, but native/FFI-bundled deps (e.g. `ort`/ONNX Runtime, see §13.a + MAT) are *not* stripped and are the real size-risk category. + +2. **MERIDIAN training-time types**: `DomainFactorizer`, `GradientReversalLayer`, + and `VirtualDomainAugmentor` are meaningful only with the tch training loop. + Confirm they stay unbound in P6 and move with the deferred libtorch tier. + *Tentative: yes — P6 is inference/adaptation only.* + +3. **MAT sync entry point**: `DisasterResponse::start_scanning` is an async tokio + loop. Does a sync single-cycle `scan_once()` already exist, or must it be added + Rust-side? *Tentative: add a thin sync `scan_once()` wrapping one `scan_cycle`; + do not bind an event loop into the extension.* + +4. **`[sota]` wheel vs per-extra wheels**: cibuildwheel builds one binary per + feature-set. Do we publish one `[sota]` wheel and let pip select, or per-extra + wheels? This affects the number of build variants. *Tentative: single `[sota]` + superset wheel on tagged releases; base wheel stays feature-free.* + +5. **INT8 embedding path in Python**: ADR-024 §2.8 sets an INT8 rank-correlation + bar. Do we expose the INT8 quantized `embed()` in P6, or FP32 only first? + *Tentative: FP32 in P6; INT8 follows once the Rust quantized path is stable.* + +--- + +## 12. References + +### Internal ADRs +- **ADR-117**: pip modernization via PyO3 + maturin — the wheel this ADR extends; + §5.1/§5.4/§5.6 (extras + wheel budget), §6 "P6+ Deferred". +- **ADR-024**: Project AETHER — contrastive CSI embedding; §2.6 module surface, + §2.8 performance/accuracy targets. +- **ADR-027**: Project MERIDIAN — cross-environment domain generalization; §4 + phase acceptance criteria, §4.6 evaluation protocol. +- **ADR-152**: WiFi-Pose SOTA 2026 — WiFlow-STD ~96% PCK@20 MEASURED-EQUIVALENT bar. +- **ADR-028**: ESP32 capability audit / witness scheme — the SHA-256 parity gate + the §4.1 golden harness reuses. + +### Rust source (verified HEAD) +- `v2/crates/wifi-densepose-sensing-server/src/embedding.rs` — AETHER. +- `v2/crates/wifi-densepose-train/src/{domain,geometry,rapid_adapt,virtual_aug,eval}.rs` — MERIDIAN. +- `v2/crates/wifi-densepose-signal/src/hardware_norm.rs` — MERIDIAN HardwareNormalizer. +- `v2/crates/wifi-densepose-mat/src/lib.rs` — MAT. +- `python/src/bindings/vitals.rs` — the `py.allow_threads` GIL-release precedent. +- `python/bench/test_bench_vitals.py` — the pytest-benchmark pattern P4 follows. + +--- + +## 13. Open follow-ups (blocking Accepted) + +P1–P4 are real, well-tested progress: **32/32 binding tests** (aether 9, meridian +13, mat 7, + 3 smoke) and **6/6 native parity tests** all pass, verified on the +reference machine. The three leaf-crate hoists (§13.a) are now **done**. Two items +still gate Accepted: **§13.b** (wire the parity harness into CI as a release gate) +and **§13.c** (the SOTA accuracy gap — bindings are structurally *untrained*, and no +eval harness or labeled data exists yet; genuine long-term work, not a quick fix). + +### 13.a — Leaf-crate hoists (all three DONE) — one real fix, one minor, one false alarm + +All three extras' backing crates carry heavy declared deps, so the hoist was applied +to each. But **measuring the stripped release wheel** (not reasoning from the +dependency tree) showed the wheel-size story differs sharply per extra. Linker +dead-code elimination (`--gc-sections` on the pyo3 cdylib) strips **pure-Rust +unreached** code, so a heavy declared dep tree does **not** imply a big wheel; +**native/FFI-bundled** deps (`ort`/ONNX Runtime's native library) are the exception +— DCE cannot strip them, and those are the real size risk. + +| Extra | Commit | Wheel size (stripped) | Verdict | +|---|---|---|---| +| `[aether]` | `a47bb71b2` | **~361 KB → ~312 KB** | **False alarm.** Never breached the 5 MB budget — DCE already stripped the sensing-server's unreached Axum/tokio/worldgraph/ruvector code. Hoist justified by build-time (71 s → 12 s), dep-graph hygiene (`Cargo.lock` −1238 lines), and latent-risk removal — **not** budget. | +| `[mat]` | `7ed57f041` | **8.4 MB → 2.0 MB** | **Real, measured regression.** `wifi-densepose-nn` bundles `ort`/ONNX Runtime, a **native** library DCE does **not** strip → genuine breach. Fix necessary and correctly characterized. | +| `[meridian]` | `99fea9df9` | **1.8 MB → 1.7 MB** | **Real but minor.** Measured from the start; a dead dep removed. Already under budget; small win. `libtorch` correctly avoided throughout (`tch` optional, off). | + +These were changes **inside** the upstream `v2/` crates (owned by other agents this +session); the default wheel was unaffected throughout because every extra is +feature-gated off. All three hoists are now landed — the remaining Accepted blockers +are §13.b (CI gate) and §13.c (accuracy fixtures), **not** wheel size. + +### 13.b — Wire the parity harness into CI as a real release gate (§6.6) + +The three golden-vector SHA-256 gates pass locally (`cargo test --features sota` → +6/6) but are not yet wired into a CI workflow that **blocks release** on mismatch. +Add a job to the ADR-117 §5.4 publish pipeline that runs the native `*_parity.rs` +references + the `pytest` binding checks and fails the release on any divergence. + +### 13.c — Close the SOTA accuracy gap (§4.3, §6.7) — genuine long-term work + +This is the most important honesty gap and it is **more fundamental than missing +labeled data** (see §6.7 for the three findings). The parity harness proves the +Python binding is **byte-identical to the native Rust path** for the bound, **but +untrained**, surface — it does **not** prove the cited SOTA numbers (ADR-152 +~96% PCK@20; ADR-024 room-ID > 95% / re-ID mAP > 80% / anomaly F1 > 0.90; ADR-027 +cross-domain MPJPE + 20% / domain-gap < 1.5). Those bars remain **CLAIMED, not +MEASURED** by this work. + +Closing it requires three steps, in dependency order: + +- **(a) Add trained-weight loading to the AETHER/pose bindings — DONE (`65da488ad`).** + `EmbeddingExtractor` gained `save_weights(path)` / `load_weights(path)` / + `param_count` on both the native crate and the Python binding (GIL-released, + `ValueError`/never-panics on bad input), removing the "structurally untrained, no + loading path" blocker: a real checkpoint can now be loaded whenever one exists. + Default construction is unchanged (still random `with_seed` init, clearly labeled + untrained) — purely additive. **Format tradeoff:** rather than pull in + `safetensors`/`serde`/`bincode`, the on-disk format is raw little-endian `f32` + with a 12-byte header (8-byte magic `AETHERW1` + `u32` param count), reusing the + pre-existing `flatten_weights`/`unflatten_weights` — this deliberately preserves + `wifi-densepose-aether`'s zero-dependency std-only leaf-crate property from the + §13.a hoist. **Verified:** `cargo test -p wifi-densepose-aether` 98/98; parity 3/3 + incl. the new cross-language golden `aether_weights_parity.rs` (native Rust and the + Python binding load the same weight file and produce a byte-identical embedding + SHA-256, and the loaded weights demonstrably move the output off the random-init + baseline — not a silent no-op); `pytest test_aether.py` 13/13 (up from 9). + **This does NOT close §6.7** — it is the *capability* to load weights, not trained + weights; (b) and (c) below remain, and no SOTA number is validated yet. +- **(b) Commit or source a small labeled CSI fixture** (input CSI + ground-truth + pose/identity/room labels) — **still OPEN.** Genuine **data-acquisition scope**. +- **(c) Build a real eval harness** computing PCK / mAP / room-ID / anomaly-F1 / + Spearman on (a)+(b) and asserting the published bars — **still OPEN.** + +With (a) landed, the remaining work is (b) and (c): genuine research / +data-acquisition scope beyond one session. This is now purely a data-availability + +missing-eval-infra problem, **not** a binding defect. Status stays **Proposed** +until (b)–(c) land and §4.3 is run for real. diff --git a/docs/adr/ADR-186-training-progress-api.md b/docs/adr/ADR-186-training-progress-api.md new file mode 100644 index 00000000..6ca7c194 --- /dev/null +++ b/docs/adr/ADR-186-training-progress-api.md @@ -0,0 +1,486 @@ +# ADR-186: Training progress API — wire the orphaned in-server trainer to `/ws/train/progress` + +| Field | Value | +|-------|-------| +| **Status** | Accepted | +| **Date** | 2026-07-21 | +| **Deciders** | ruv | +| **Codename** | **TRAIN-RECONNECT** — connecting a trainer that was written, committed, and then never plugged in | +| **Relates to** | [ADR-051](ADR-051-sensing-server-decomposition.md) (main.rs decomposition into ~14 modules), [ADR-151](ADR-151-per-room-calibration.md) (`train-room` specialist bank), [ADR-152](ADR-152-wifi-pose-sota-2026.md) (MAE recipe / geometry conditioning), [ADR-166](ADR-166-quality-engineering-security-hardening.md) (WS auth + god-object decomposition) | +| **Tracking issue** | [#1233](https://github.com/ruvnet/wifi-densepose/issues/1233) — "Training does not start – /ws/train/progress returns 404 and no model is generated" (open) | + +--- + +## 1. Context + +### 1.1 The reported gap + +A user starting training from the web dashboard hits +`ws://localhost:3000/ws/train/progress`, which **404s**, and the backend never +produces a trained `.rvf` model or any further log output beyond a single +"Training started" line. Issue #1233 is open, and the repo owner's own comment on +it states: + +> The `/ws/train/progress` WebSocket endpoint is not yet exposed in the stable +> server — the training pipeline (room-calibration specialists, MAE pretraining) +> runs via the CLI (`wifi-densepose train-room`) rather than through the +> HTTP/WebSocket API, which is why the Docker image returns 404 for that path. + +So the dashboard has a **"Start Training" button that silently no-ops**: it POSTs a +config, receives a `success: true` response, and then nothing happens — no error is +surfaced, no model is produced, no progress stream exists. A button that appears to +work but does nothing is the definition of slop, and this ADR exists to close that +gap honestly. + +### 1.2 What the live server actually does today (evidence) + +The stable server mounts **stub** training handlers. The POST handler flips a string +flag, logs one line, and returns success — it starts no job: + +```rust +// v2/crates/wifi-densepose-sensing-server/src/main.rs:4986–5006 +async fn train_start( + State(state): State, + Json(body): Json, +) -> Json { + let mut s = state.write().await; + if s.training_status == "running" { /* ... */ } + s.training_status = "running".to_string(); + s.training_config = Some(body.clone()); + info!("Training started with config: {}", body); // ← the one log line the issue reports + Json(serde_json::json!({ + "success": true, + "status": "running", + "message": "Training pipeline started. Use GET /api/v1/train/status to monitor.", + })) +} +``` + +These three stubs — and **nothing else training-related** — are wired into the live +router: + +```rust +// v2/crates/wifi-densepose-sensing-server/src/main.rs:8068–8071 +// Training endpoints +.route("/api/v1/train/status", get(train_status)) +.route("/api/v1/train/start", post(train_start)) +.route("/api/v1/train/stop", post(train_stop)) +``` + +There is **no `/ws/train/progress` route in the live app** — hence the 404 that +issue #1233 reports. The stub state fields backing them are just: + +```rust +// v2/crates/wifi-densepose-sensing-server/src/main.rs:1125–1127 +training_status: String, // "idle" | "running" | ... +training_config: Option, +``` + +### 1.3 The surprising finding: a real trainer already exists, orphaned + +The gap is **not** that training was never built for the server. A complete +in-server training pipeline **already exists in the tree** at +`v2/crates/wifi-densepose-sensing-server/src/training_api.rs` (1,860 lines). Its own +module doc describes what it does (`training_api.rs:1–25`): + +- Loads recorded CSI from `.csi.jsonl` files, extracts signal features (subcarrier + variance, temporal gradients, Goertzel frequency-domain power). +- Trains a regularised linear model via batch gradient descent. +- Exports a calibrated `.rvf` model container via `RvfBuilder` on completion. +- **"No PyTorch / `tch` dependency is required. All linear algebra is implemented + inline using standard Rust math."** (`training_api.rs:11–13`) + +It runs training on a **background tokio task** and streams progress over a +`tokio::sync::broadcast` channel to a real WebSocket handler: + +- `start_training` spawns the job: `tokio::spawn(async move { ... })` + (`training_api.rs:1564`, spawn at `:1610`). +- `ws_train_progress_handler` subscribes to `training_progress_tx` and forwards + `{"type":"progress", "data": …}` frames (`training_api.rs:1778–1836`). +- A `routes()` factory wires the whole surface, **including the missing route**: + +```rust +// v2/crates/wifi-densepose-sensing-server/src/training_api.rs:1841–1849 +pub fn routes() -> Router { + Router::new() + .route("/api/v1/train/start", post(start_training)) + .route("/api/v1/train/stop", post(stop_training)) + .route("/api/v1/train/status", get(training_status)) + .route("/api/v1/train/pretrain", post(start_pretrain)) + .route("/api/v1/train/lora", post(start_lora_training)) + .route("/ws/train/progress", get(ws_train_progress_handler)) +} +``` + +**This module is dead code.** There is no `mod training_api;` declaration anywhere +in the crate — a repo-wide search for `training_api` returns only a doc-comment +mention in `path_safety.rs:9`. Because Rust never sees the file without a `mod` +declaration, `training_api.rs` is **not compiled into the binary at all**, and +`training_api::routes()` is never merged into the app. It was written, committed +(last touched by commit `9b07dff29`), and then orphaned. + +### 1.4 Why it would not even compile if naively wired in + +The orphan was written against a **different state shape than the one that shipped**. +`training_api.rs` expects its parent to expose an `AppStateInner` carrying a training +sub-state and a broadcast sender: + +```rust +// v2/crates/wifi-densepose-sensing-server/src/training_api.rs:249 +pub type AppState = Arc>; +// handlers read s.training_state.status, s.training_state.task_handle, +// s.training_progress_tx (e.g. training_api.rs:1588, :1610, :1788) +``` + +But the **real** `AppStateInner` (`main.rs:1024`, aliased `SharedState` at +`main.rs:1249`) has none of those fields — only the `training_status: String` / +`training_config` stubs from §1.2. `training_state: TrainingState` is defined +locally in `training_api.rs:232`, and `training_progress_tx` exists nowhere on the +live state. So adding `mod training_api;` today produces a compile error: the module +references `AppStateInner` fields that do not exist. Wiring it in requires +**reconciling the state struct first**, not merely uncommenting a route. + +### 1.5 The working path today + +The path that actually trains a model is the CLI, exactly as the maintainer's +comment says: + +- `wifi-densepose train-room` → `room.rs:241` `train_room(...)`, the ADR-151 + Stage-2–5 per-room specialist-bank trainer (`enroll → train-room → room-watch`). +- The heavier `wifi-densepose-train` crate exposes epoch-level metrics + (`trainer.rs:43` `pub epoch: usize`, `trainer.rs:64` `best_epoch`) that a progress + stream could surface directly — the data a WebSocket needs already exists in the + training loop. + +### 1.6 What this ADR is *not* + +- Not a rewrite of the trainer. The pipeline in `training_api.rs` already exists; + this ADR reconnects and hardens it. +- Not a move of GPU/`tch`-backed training into the Axum server. The in-server + trainer is deliberately `tch`-free (§1.3). Heavy MAE/LoRA training stays in the + CLI / `wifi-densepose-train` crate; the server streams progress for the light, + pure-Rust specialist trainer and (optionally) proxies status for CLI-launched runs. +- Not a change to the `train-room` CLI contract (ADR-151). The CLI remains the + authoritative path for offline / batch training. + +--- + +## 2. Current state — evidence + +| Artifact | Value | Source | +|---|---|---| +| Live POST handler | `train_start` — flips a flag, logs, returns `success:true`, starts no job | `main.rs:4986–5006` | +| The "Training started" log line from the issue | `info!("Training started with config: {}", body)` | `main.rs:5000` | +| Live training routes | `train/status`, `train/start`, `train/stop` (stubs only) | `main.rs:8068–8071` | +| `/ws/train/progress` in live app | **Absent** → 404 | (no route in `main.rs` router) | +| Live training state fields | `training_status: String`, `training_config: Option` | `main.rs:1125–1127` | +| Real in-server trainer | 1,860-line implemented pipeline, `tch`-free, exports `.rvf` | `training_api.rs:1–25` | +| Real WS progress handler | subscribes to broadcast, streams `progress` frames | `training_api.rs:1778–1836` | +| Real route factory (has the missing route) | `routes()` incl. `/ws/train/progress` | `training_api.rs:1841–1849` | +| Background job spawn | `tokio::spawn` of the training task | `training_api.rs:1564`, spawn `:1610` | +| `mod training_api;` declaration | **None in the crate** (only a doc mention) | `path_safety.rs:9` | +| State-shape mismatch | expects `super::AppStateInner.{training_state, training_progress_tx}` | `training_api.rs:249`, `:232` | +| Real `AppStateInner` / `SharedState` | has neither field | `main.rs:1024`, `:1249` | +| Working training path | CLI `train-room` (ADR-151 specialist bank) | `room.rs:241` | +| Epoch metrics available to stream | `TrainMetrics.epoch`, `best_epoch` | `train/src/trainer.rs:43`, `:64` | + +--- + +## 3. Gap analysis + +| Capability | Desired | Today | Gap severity | +|---|---|---|---| +| `/ws/train/progress` resolves | 101 Switching Protocols, streams epoch/loss/eta | 404 (route absent) | **Critical** — the reported bug | +| "Start Training" produces a model | background job trains and writes `.rvf` | flag flip + one log line, no job, no model | **Critical** | +| Error surfaced to the user | button reflects real state / disabled with reason | silent no-op, `success:true` | **Critical** (slop) | +| In-server trainer compiled | part of the crate, unit-tested | orphaned; not compiled (no `mod`) | **High** | +| State supports progress streaming | `training_state` + `training_progress_tx` on `AppStateInner` | absent — orphan won't compile as-is | **High** | +| WS auth on the training surface | `/ws/train/progress` under bearer gate (ADR-166 §Sprint-1) | n/a (route absent) | **High** | +| `dataset_ids` path safety | validated before file open | `path_safety.rs` exists but unreached by live routes | **Medium** | +| Server ↔ CLI parity | shared/consistent training semantics | two divergent trainers (stub vs CLI vs orphan) | **Medium** | + +--- + +## 4. Decision + +**Chosen path: wire the existing in-server trainer into the live server** — reconcile +the state struct, declare the module, merge `training_api::routes()`, delete the +stub handlers, and expose a real `/ws/train/progress` that streams epoch/loss/eta +events from the already-implemented background job. + +This is called **TRAIN-RECONNECT**. + +### 4.1 Why this path, and not "make the button honestly say CLI-only" + +The task framing offered two honest options. Investigation decided it: + +| Consideration | Evidence | Implication | +|---|---|---| +| Is server-side training genuinely GPU/`tch`-bound (→ keep CLI-only)? | The in-server trainer is explicitly **`tch`-free**, pure Rust, exports `.rvf` (`training_api.rs:11–13`) | The "too heavy for Axum" argument is contradicted by the code | +| Does a real streaming implementation already exist? | Full pipeline + broadcast + WS handler + `routes()` present (`training_api.rs:1564,1778,1841`) | The impressive-sounding option is also the *least* new code — it already exists | +| Why does it 404 then? | No `mod training_api;`; state-shape mismatch (`:249` vs `main.rs:1024`) | The fix is reconnection + reconciliation, not new invention | + +Because the honest, code-supported reality is "a working trainer was written and left +unplugged," the right decision is to plug it in — this is not choosing the flashier +option over the code; it *is* what the code says. + +**However**, path B is retained as a **mandatory fallback guarantee** (Phase P5): if, +for a given build/deployment, server-side training is disabled (e.g. behind a +feature flag, or on the lightweight appliance image where recordings aren't +available), the dashboard button MUST be disabled with a tooltip pointing at +`wifi-densepose train-room` — never a silent `success:true` no-op again. The slop is +eliminated in both the enabled and disabled configurations. + +### 4.2 Scope boundary — light trainer streams, heavy trainer proxies + +- The **pure-Rust specialist trainer** (`training_api.rs`, ADR-151 flavour) runs + in-process and streams live epoch/loss/eta over `/ws/train/progress`. +- **Heavy MAE/LoRA training** (`wifi-densepose-train`, `tch`/GPU) stays CLI-launched. + The server does not host it; at most `/api/v1/train/status` reports on a + CLI-launched run if one registers itself. Streaming heavy training is out of scope + for this ADR (noted as an open question, §8). + +--- + +## 5. Detailed design + +### 5.1 Reconcile `AppStateInner` + +Replace the two stub fields (`main.rs:1125–1127`) with the sub-state the trainer +expects, so `training_api.rs` compiles against `super::AppStateInner`: + +```rust +// main.rs — inside AppStateInner (replacing training_status / training_config) +training_state: training_api::TrainingState, // status, epoch, best_pck, task_handle +training_progress_tx: tokio::sync::broadcast::Sender, // progress fan-out +``` + +`train_status` consumers that read `s.training_status` / `s.training_config` are +updated to read `s.training_state.status`. The broadcast sender is created at state +init (`main.rs:7826` region, where the stubs are seeded today). + +### 5.2 Declare and merge the module + +- Add `mod training_api;` to `main.rs` (or `pub mod` in `lib.rs` if the router is + assembled there). +- Delete the stub handlers `train_start` / `train_stop` / `train_status` + (`main.rs:4977–5023`) and their three route mounts (`main.rs:8069–8071`). +- Merge the real router **after** `.with_state(state.clone())`, the same pattern the + RuField surface already uses (`main.rs:8104–8111`): + +```rust +// main.rs router assembly +.merge(training_api::routes()) +``` + +so that `/api/v1/train/*` and `/ws/train/progress` resolve against the shared state. + +### 5.3 Auth and safety (ADR-166 alignment) + +- `/api/v1/train/*` sits under the existing opt-in bearer gate (`main.rs:8095–8102`, + `RUVIEW_API_TOKEN`). `/ws/train/progress` follows the same policy decision made for + `/ws/sensing` — document explicitly whether the training WS is gated (recommended: + gated when a token is set, since training reads/writes recordings and models). +- `dataset_ids` from `StartTrainingRequest` (`training_api.rs:126–130`) are resolved + through `path_safety` before any file open — `path_safety.rs:9` already anticipates + `{dataset_id}.csi.jsonl` under `RECORDINGS_DIR`; wire it in the load path. +- Single-job concurrency guard: `start_training` already rejects a second run while + `training_state.status.active` (`training_api.rs:1571`) — keep it. + +### 5.4 Progress event schema (already emitted) + +The WS handler already frames messages as `{"type":"status"|"progress", "data": …}` +(`training_api.rs:1796–1815`). Confirm the `data` payload carries at minimum +`epoch`, `total_epochs`, `loss`, `best_pck`, and an `eta_seconds`; these map onto the +`TrainMetrics`/`TrainingStatus` fields already populated by the loop +(`training_api.rs:1251`, `train/src/trainer.rs:43,64`). + +### 5.5 Dashboard honesty (both configurations) + +- **Enabled build:** button POSTs `/api/v1/train/start`, then opens + `/ws/train/progress`; the UI renders live epoch/loss/eta and a terminal + success/failure with the output `.rvf` path. +- **Disabled build:** `/api/v1/train/start` returns a structured + `{"enabled": false, "reason": "...", "cli": "wifi-densepose train-room"}` and the + button renders disabled with a tooltip — no silent `success:true`. + +--- + +## 6. Phase ledger + +``` +P0 ──► P1 ──► P2 ──► P3 ──► P4 ──► P5 ──► P6 +repro state wire stream auth+ dash tests+ ++audit recon router job safety honesty witness +``` + +### P0 — Reproduce & audit (evidence lock) +- [x] Confirmed the orphan: `grep -rn "mod training_api"` returned **nothing**; the only + hit was a doc mention in `path_safety.rs`. `training_api.rs` was uncompiled. +- [x] Confirmed the stub no-op (`train_start` at `main.rs:4986` flipped a string + logged + one line, no job, no `.rvf`) and the missing `/ws/train/progress` route. + +### P1 — Reconcile `AppStateInner` +- [x] Replaced `training_status`/`training_config` with `training_state: + training_api::TrainingState` + `training_progress_tx: broadcast::Sender`. +- [x] Updated state init; the only readers of the old fields were the stub handlers (deleted). +- [x] Added `mod training_api;` (+ `mod path_safety;`); the module compiles against the real state. + +### P2 — Wire the router, delete the stubs +- [x] Removed `train_start`/`train_stop`/`train_status` and their 3 route mounts. +- [x] `.merge(training_api::routes())` — merged **before** `.with_state(...)` (not after). + The RuField surface merges after because it carries a *different* state; the training + router shares `SharedState`, so merging before is what puts `/api/v1/train/*` under the + same `/api/v1/*` bearer gate as everything else. +- [x] `/api/v1/train/*` and `/ws/train/progress` resolve (verified by HTTP tests, not 404). + +### P3 — Confirm the real job streams and produces a model +- [x] The spawned job loads `.csi.jsonl` (falls back to a `frame_history` snapshot), + runs the gradient-descent loop, and writes a `.rvf` under `data/models`. +- [x] Progress frames carry `epoch`, `total_epochs`, `train_loss`, `val_pck`, `eta_secs`. +- [x] Server-vs-CLI semantics documented as **intentionally divergent** (§4.2, §9.2): + the server runs the light pure-Rust specialist trainer; heavy MAE/LoRA stays CLI. + +### P4 — Auth & path safety +- [x] `/api/v1/train/*` sits under the existing `RUVIEW_API_TOKEN` bearer gate (merged + before `.with_state`); `/ws/train/progress` is intentionally **ungated**, matching + `/ws/sensing` (browsers can't attach an `Authorization` header to a WS upgrade). +- [x] `dataset_ids` resolved via `path_safety::safe_id` before file open; pinned by + `load_recording_frames_rejects_path_traversal`. +- [x] Single-job guard: `spawn_training_job` rejects a second start while active + (`is_active()` → `active_error`). + +### P5 — Dashboard honesty (fallback guarantee) +- [x] Enabled build: `TrainingPanel` opens `/ws/train/progress` before the POST and renders + live epoch/loss/PCK/ETA + a terminal Complete state (already wired; verified). +- [x] Disabled build (`RUVIEW_DISABLE_SERVER_TRAINING`): start returns + `{enabled:false, cli:"wifi-densepose train-room"}` HTTP 409; the dashboard reads + `enabled` off `/api/v1/train/status` and disables the Start buttons with a CLI + tooltip — no silent no-op. Implemented via a runtime flag rather than a Cargo feature + so the `--no-default-features` test build keeps training ON (§9.4 resolved this way). + +### P6 — Tests & witness +- [x] Live-socket test `ws_train_progress_live_101_and_frame`: genuine 101 handshake + a real + progress frame after POST start. Plus `ws_train_progress_route_is_wired_not_404`. +- [x] `http_train_start_produces_model_and_streams`: POST start → poll status → `.rvf` exists. +- [x] CHANGELOG updated. README/CLAUDE have no training route table, so no route-table edit + was needed there. + +*(All phases complete. Acceptance criteria verified below — this ADR is Accepted.)* + +--- + +## 7. Acceptance criteria (concrete verification) + +All must pass before ADR-186 is Accepted: + +- [x] **Orphan is reconnected:** + `grep -rn "mod training_api" v2/crates/wifi-densepose-sensing-server/src/` + returns a hit (`main.rs`), and + `cargo build -p wifi-densepose-sensing-server` **compiles** (proves the state + reconciliation in §5.1 is correct — the module cannot compile against the + current `AppStateInner`). **VERIFIED.** +- [x] **Route no longer 404s (HTTP upgrade):** verified in-process rather than with a live + `curl` — `ws_train_progress_live_101_and_frame` binds the training router on a real + socket and `tokio_tungstenite::connect_async` completes a genuine **101** handshake + (asserts `resp.status() == 101`); `ws_train_progress_route_is_wired_not_404` also + confirms the route is reached (426 under `oneshot`, **not** 404). **VERIFIED.** +- [x] **Progress actually streams:** `ws_train_progress_live_101_and_frame` connects the WS, + POSTs `/api/v1/train/start`, and receives a real `{"type":"progress","data":{...}}` + frame within the 10 s ceiling. **VERIFIED.** +- [x] **A model is produced:** `http_train_start_produces_model_and_streams` POSTs start, + polls `/api/v1/train/status` to completion, and asserts a **new `.rvf`** appeared under + `data/models/` (snapshot diff). Also covered by the trainer-level + `training_job_streams_real_progress_and_writes_model`. **VERIFIED.** +- [x] **No silent no-op remains:** `http_train_start_disabled_returns_structured_409` sets + `RUVIEW_DISABLE_SERVER_TRAINING` and asserts POST start returns **HTTP 409** with + `{"enabled":false, ...,"cli":"wifi-densepose train-room"}` and never `success:true`. + **VERIFIED.** +- [x] **Auth honored:** `/api/v1/train/*` is merged into the router **before** the + `RUVIEW_API_TOKEN` bearer middleware and `.with_state`, so it is covered by the exact + same `/api/v1/*` gate as every other authenticated route (verified by construction / + code review; `/ws/train/progress` is intentionally ungated like `/ws/sensing`). No new + dedicated runtime token test was added — the gate is the shared, already-tested + `bearer_auth` middleware. **VERIFIED (by construction).** +- [x] **Path safety:** `load_recording_frames_rejects_path_traversal` asserts + `dataset_ids:["../../etc/passwd"]` yields no frames (rejected by `path_safety::safe_id` + before any file open). **VERIFIED.** +- [x] **Integration test green:** `ws_train_progress_live_101_and_frame` (`#[tokio::test]`) + serves the training router, opens `/ws/train/progress`, and asserts a 101 upgrade + a + real progress frame — and, being built on `training_api::routes()`, cannot compile if + the module is orphaned again. **VERIFIED.** +- [x] **Workspace regression:** `cargo test -p wifi-densepose-sensing-server + -p wifi-densepose-train --no-default-features` — sensing-server bin **217 passed / + 0 failed**, all train suites **0 failed**. A full `cargo test --workspace + --no-default-features` run initially surfaced a **test-only parallelism race** in the + new tests (two model-writing tests deleted `.rvf`s by directory-diff, occasionally + removing a file a third test asserted existed) — fixed by removing the cross-test + deletions (each test cleans only its own artifact; `data/models` is gitignored). + Re-verified post-fix: `cargo test --workspace --no-default-features` — **0 failed** + (exit 0). **VERIFIED.** + +--- + +## 8. Consequences + +### Positive +- Closes issue #1233: the dashboard button either trains-and-streams or honestly says + "use the CLI" — the silent no-op is gone in every configuration. +- Reclaims 1,860 lines of already-written, already-committed trainer that were dead + (uncompiled) code, and adds a test that keeps them wired. +- `/ws/train/progress` gives the UI real epoch/loss/eta, matching the maintainer's + stated intent. +- Forces the state-shape reconciliation that the orphan implied but never landed, + removing a latent "two competing training designs" trap in `AppStateInner`. + +### Negative +- Editing `AppStateInner` (`main.rs:1024`) and the router (`main.rs:8068`) touches the + large `main.rs`; merge-conflict risk with concurrent work on the same file (the + ADR-166 decomposition is relevant here). +- Adds a live training code path to the server's attack surface — mitigated by the + bearer gate and `path_safety`, but it must be reviewed (network/hardware boundary, + per the pre-merge security checklist). +- Server and CLI now have two trainers that must be kept semantically consistent, or + their divergence explicitly documented. + +### Neutral +- Heavy MAE/LoRA/`tch` training remains CLI-only; the server streams only the + light pure-Rust specialist trainer. Streaming heavy runs is deferred. +- The progress event schema (`epoch/loss/best_pck/eta`) is already emitted by the + orphan; no new schema is invented, only confirmed and documented. + +--- + +## 9. Open questions + +1. **WS auth policy for `/ws/train/progress`:** gate it whenever `RUVIEW_API_TOKEN` + is set (like `/api/v1/*`), or leave it open like `/ws/sensing`? *Tentative: gate + it — training reads recordings and writes models.* +2. **Server ↔ CLI trainer parity:** should the in-server trainer and + `wifi-densepose train-room` (ADR-151) share one code path, or remain deliberately + separate (server = quick UI-driven specialist fit; CLI = full bank + geometry + conditioning)? *Tentative: keep separate, document the split, share feature + extraction where cheap.* +3. **Heavy-training progress:** can a CLI-launched `wifi-densepose-train` (`tch`) + run register itself so `/api/v1/train/status` and the WS can report on it without + hosting it in-process? *Tentative: out of scope here; a follow-on ADR.* +4. **Feature-flagging server training:** should in-server training be behind a Cargo + feature (off on the lightweight appliance image), making the P5 disabled-button + path the default there? *Tentative: yes — flag it; default the UI to the honest + disabled state on images without recordings.* + +--- + +## 10. References + +- **Issue #1233**: https://github.com/ruvnet/wifi-densepose/issues/1233 — the reported bug. +- **Live stubs**: `v2/crates/wifi-densepose-sensing-server/src/main.rs:4977–5023` (handlers), + `:8068–8071` (routes), `:1125–1127` (state fields), `:1024`/`:1249` (`AppStateInner`/`SharedState`). +- **Orphaned trainer**: `v2/crates/wifi-densepose-sensing-server/src/training_api.rs` — + module doc `:1–25`, `TrainingState` `:232`, `AppState` alias `:249`, `start_training` `:1564` + (spawn `:1610`), WS handler `:1778–1836`, `routes()` `:1841–1849`. +- **Not-a-module proof**: repo-wide `training_api` only in `path_safety.rs:9` (doc comment). +- **CLI working path**: `v2/crates/wifi-densepose-cli/src/room.rs:241` `train_room` (ADR-151). +- **Epoch metrics**: `v2/crates/wifi-densepose-train/src/trainer.rs:43`, `:64`. +- **ADR-166**: WebSocket authentication + `main.rs` decomposition (security context for this change). +- **ADR-151**: per-room calibration / `train-room` specialist bank. diff --git a/docs/adr/ADR-187-archive-v1-deprecation-honest-labeling.md b/docs/adr/ADR-187-archive-v1-deprecation-honest-labeling.md new file mode 100644 index 00000000..5adce978 --- /dev/null +++ b/docs/adr/ADR-187-archive-v1-deprecation-honest-labeling.md @@ -0,0 +1,198 @@ +# ADR-187: `archive/v1` Deprecation & Model-Weights Honest Labeling + +- **Status**: Accepted +- **Date**: 2026-07-21 +- **Deciders**: ruv +- **Tags**: archive-v1, deprecation, densepose-head, model-weights, honest-labeling, prove-everything, credibility, pip-tombstone +- **Refs**: [#509](https://github.com/ruvnet/RuView/issues/509) (missing model weights / reproducibility), [#1125](https://github.com/ruvnet/RuView/issues/1125) ("has anyone got this to work?") +- **Relates to**: [ADR-117](ADR-117-pip-wifi-densepose-modernization.md) (pip modernization + 1.99.0 tombstone), [ADR-160](ADR-160-edge-skill-library-honest-labeling.md) (honest-labeling precedent), [ADR-079](ADR-079-camera-ground-truth-training.md) (camera-supervised pose target), [ADR-152](ADR-152-wifi-pose-sota-2026-intake.md) (WiFlow-STD PCK@20 measurement), [ADR-175](ADR-175-int8-quantization-half-pose-model-measured.md) (int8 pose trade-off), [ADR-101](ADR-101-pose-estimation-cog.md) (pose cog) + +--- + +## Context + +Two open GitHub issues are, at root, the same complaint: the project's public surface +lets a reader believe a WiFi→17-keypoint pose model exists and produces real accuracy, +when the specific code they land on cannot back that claim. + +- **#509** — a detailed technical review states: *"While the network architecture for + DensePoseHead is defined in the code, there are no pre-trained weights (.pth or .onnx + files) available in the repository,"* and questions whether ESP32 1×1 SISO antennas + can match the multi-antenna NIC research this project is inspired by. +- **#1125** — a user asks for anyone to testify the project actually runs and returns + real data. A pure credibility complaint. + +This ADR follows the **prove-everything / anti-"AI-slop"** directive and the +**honest-labeling** precedent set by ADR-160: the fix is to make the labels TRUE, not +to fabricate a capability. Grading vocabulary (from ADR-152 / ADR-160): + +- **MEASURED** — reproduced in this worktree; the file/absence was directly inspected. +- **DATA-GATED** — a real code path exists; honestly flagged where the accuracy is not validated. +- **NO-ACTION (already-honest)** — audited, found correct, cited as a positive. + +### What the investigation actually found (MEASURED in this worktree) + +The situation is **more nuanced than either issue implies** — worse in one place, and +distinctly *better* in others. Forcing a uniformly negative narrative would itself be +dishonest. The findings: + +**1. `archive/v1` — the issue reporter is correct here.** +- `archive/v1/src/models/densepose_head.py` defines `DensePoseHead` (segmentation + + UV-regression heads). Its `_initialize_weights()` uses **`kaiming_normal_` random + initialization only** — there is no checkpoint-loading path in the class. +- `Glob archive/v1/**/*.{pth,onnx,safetensors,pt,ckpt,bin}` → **zero files**. There are + **no trained weights anywhere under `archive/v1/`.** The "architecture defined, no + weights" claim is TRUE for this tree. +- `archive/v1/README.md` calls the tree "the legacy Python implementation" in a single + closing note but does **not** loudly warn users off it, and there is **no + `archive/v1/DEPRECATED.md`.** This is the dead-but-present code that shows up in greps + and search and reads as if it were the live implementation. +- Per ADR-117, this exact tree is the source of the tombstoned pip package + `wifi-densepose 1.x` (1.99.0 raises an `ImportError` telling users to migrate). The + code is already tombstoned *on PyPI* but not *in the repo*. + +**2. `v2` (the current, maintained system) — real weights DO exist; the "no weights +anywhere" reading is FALSE at the project level.** Git-tracked, committed checkpoints: +- `v2/crates/cog-pose-estimation/cog/artifacts/pose_v1.safetensors` (507 KB) + + `pose_v1.onnx` (12 KB) + `train_results.json` — a **real committed 17-keypoint + model**, trained with Candle on an RTX 5080. +- `v2/crates/cog-person-count/cog/artifacts/count_v1.{safetensors,onnx}` — a committed + person-count model. +- Externally published on Hugging Face (not committed, but real and released): + `ruvnet/wifi-densepose-pretrained` (CSI encoder + presence head, honestly re-labeled + at **82.3% held-out temporal-triplet accuracy** — the older "100% presence" figure was + already retracted, an existing honest-labeling win) and `ruvnet/wifi-densepose-mmfi-pose` + (a pose model reporting **82.69% torso-PCK@20** on the MM-Fi `random_split` protocol). +- ADR-152 measurement (a): the *external* WiFlow-STD (DY2434) model was reproduced at + **96.09% PCK@20** on an RTX 5080 (graded MEASURED-EQUIVALENT). That is an external + baseline, not RuView's own weights. + +**3. The honest gap is narrow and specific — the live, on-device ESP32 17-keypoint +pose path.** Per `v2/crates/cog-pose-estimation/cog/README.md` (already an exemplary +"Honest reading" section): +- The committed `pose_v1` scores **PCK@20 = 3.0% / PCK@50 = 18.5%** on a 217-sample + holdout — **below the ADR-079 target of PCK@20 ≥ 35%.** It learns coarse structure + (`r_hip` 77% PCK@50) but distal/face joints are near-random. `encoder_init` was + `random`; it was trained on a single 30-min seated-at-desk recording (1,077 samples, + avg confidence 0.44). +- The cog's **runtime inference path is still a centred-skeleton stub returning + `confidence=0`** — the `pose_v1.safetensors` weights are not yet wired into + `src/inference.rs`. +- ADR-079 records the proxy-supervised baseline at **PCK@20 = 2.5%**, and ADR-152 + **retracted** the internal camera-supervised 92.9% PCK@20 figure (it was a + constant-output model scored under an absolute threshold on near-static frames; a mean + predictor scores 100% under the same broken protocol). + +### The real problem to fix + +Not "the project has no weights" (false) and not "there is a validated pretrained +DensePoseHead" (false for the live ESP32 path). The real problem is a **labeling and +navigation gap**: +1. `archive/v1`'s random-init `DensePoseHead` is indistinguishable, to a grepping + reader, from the live implementation, and carries no deprecation notice. +2. Nowhere is the split stated plainly: *which* checkpoints are real and validated + (presence 82.3%, MM-Fi pose 82.69% torso-PCK@20), *which* are real-but-weak and + honestly labeled (`pose_v1` 3% PCK@20, runtime stubbed), and *which* are + architecture-only with no weights at all (`archive/v1` `DensePoseHead`). + +## Decision + +Two coordinated honest-labeling actions. Neither invents a capability; both make the +public surface match what the code and checkpoints actually deliver. + +### (a) Formally deprecate `archive/v1` in the repo — MEASURED gap, proposed fix + +- **Add `archive/v1/DEPRECATED.md`** — a loud tombstone stating that `archive/v1` is the + original pure-Python implementation, is **unmaintained and superseded**, that its + `DensePoseHead` is **architecture-only with random-initialized weights and ships no + trained checkpoint**, and that the maintained path is the `v2/` Rust workspace + the + `wifi-densepose 2.x` / `ruview` pip wheel (ADR-117). Mirror the disclaimer tone of + ADR-160's `//!` headers and the pip 1.99.0 tombstone text. +- **Prepend a loud notice to `archive/v1/README.md`** (the file exists) — a `> ⚠️ + DEPRECATED` block at the very top pointing to `DEPRECATED.md`, `v2/`, and the pip + wheel, before any of the existing "how to install v1" content. +- **Rule:** no doc outside `archive/v1/` may reference `archive/v1` code (other than the + ADR-028 deterministic proof at `archive/v1/data/proof/verify.py`, which is a + legitimately live signal-pipeline witness and stays) as if it were current. The two + README references verified (`README.md` lines 139/198/204; `docs/user-guide.md` + proof/swift-compile lines) are all proof/utility invocations, not implementation + claims — they are acceptable and out of scope. + +### (b) Model-weights honest labeling — state the three tiers explicitly + +Add a **"Model weights: what's real, what's not"** subsection to `README.md` and +`docs/user-guide.md` that names the three tiers verified above, so no reader can infer +"a pretrained 17-keypoint DensePoseHead produces real pose accuracy on my ESP32": + +| Tier | Checkpoint(s) | Honest status | +|------|---------------|---------------| +| **Real & validated** | `ruvnet/wifi-densepose-pretrained` (encoder + presence, 82.3% held-out temporal-triplet); `ruvnet/wifi-densepose-mmfi-pose` (82.69% torso-PCK@20, MM-Fi `random_split`); `count_v1` | MEASURED / published; keep current honest labels | +| **Real but weak (honestly labeled)** | committed `pose_v1.safetensors` in `cog-pose-estimation` | **PCK@20 = 3.0%**, below the ADR-079 ≥35% target; runtime path is a `confidence=0` stub until weights are wired into `src/inference.rs`. Already disclosed in the cog README; surface the same caveat wherever the live ESP32 pose feature is advertised | +| **Architecture only, no weights** | `archive/v1` `DensePoseHead` | random-init, no checkpoint; deprecated per (a) | + +- The existing MM-Fi/presence honest labels (retraction of "100% presence", the cog + "Honest reading") are **NO-ACTION positives** — cite them, do not weaken them. +- The live ESP32 17-keypoint claim stays **DATA-GATED**: the path to a first + *reproducible* on-device baseline is ADR-079 (multi-session, full-body-framed, + camera-supervised, ≥30K paired samples at conf ≥0.7, target PCK@20 ≥35%), tracked in + [#645]. Do not advertise the live ESP32 pose feature without the "first-cut / below + target / runtime stub" caveat until that baseline is MEASURED. +- Directly answer #509's ESP32-SISO question in the docs, honestly: single-antenna 56- + subcarrier CSI at a 20-frame window does **not** carry the fine-grained spatial + information the multi-antenna NIC research relies on (the cog README already shows + distal/face joints near-random) — the shippable pose accuracy the project *can* stand + behind today is the **MM-Fi benchmark** number, not a live single-ESP32 number. + +## Phase ledger + +| Phase | Action | State | +|-------|--------|-------| +| **P0** | This ADR (investigation + decision) | **DONE** (this file) | +| **P1** | Add `archive/v1/DEPRECATED.md` + loud notice atop `archive/v1/README.md` | **DONE** (1fb5397dd) | +| **P2** | Add "Model weights: what's real, what's not" tier table to `README.md` + `docs/user-guide.md`; add the caveat wherever the live ESP32 17-keypoint feature is advertised | **DONE** (1fb5397dd; follow-up caveated the hardware table, hero caption, and live-pipeline note) | +| **P3** | Answer #509's SISO/no-weights question and #1125's "does it run" in `docs/user-guide.md` (point to the reproducible proofs: MM-Fi arena, `archive/v1/data/proof/verify.py`, cog `train_results.json`) | **DONE** (1fb5397dd) | +| **P4** | Close the DATA-GATED live-pose gap via ADR-079 first reproducible on-device baseline (PCK@20 ≥35%) + wire `pose_v1.safetensors` into `cog-pose-estimation/src/inference.rs` | ACCEPTED-FUTURE ([#645]) | + +## Acceptance criteria + +- [x] `archive/v1/DEPRECATED.md` exists and names `v2/` + the pip wheel as the maintained path. +- [x] `archive/v1/README.md` opens with a `> ⚠️ DEPRECATED` block before any install instructions. +- [x] `README.md` and `docs/user-guide.md` no longer let a reader infer that `archive/v1` + or an untrained/random-init `DensePoseHead` produces real pose accuracy without the + caveats added here. +- [x] The live ESP32 17-keypoint pose feature is nowhere advertised without its + "first-cut, PCK@20 = 3.0%, below ADR-079 target, runtime stub" caveat. +- [x] The three real/published checkpoints (presence 82.3%, MM-Fi pose 82.69% torso-PCK@20, + `count_v1`) keep their existing honest labels — nothing is weakened or overclaimed. +- [x] No claim is added that is not MEASURED or explicitly DATA-GATED. + +## Consequences + +### Positive +- A grepping reader can no longer mistake `archive/v1`'s random-init `DensePoseHead` for + the live system; the dead code is loudly tombstoned in the repo, matching its PyPI 1.99.0 tombstone. +- #509 and #1125 get an honest, verifiable answer: real trained weights *do* exist + (presence + MM-Fi pose are published and benchmarked), the *specific* file the reporter + found is architecture-only, and the live ESP32 pose path is honestly weak-and-in-progress. +- Reinforces the ADR-160 honest-labeling discipline: the project's credibility comes from + precise labels, not from a suppressed or inflated narrative. + +### Negative +- The docs must openly state that the live single-ESP32 17-keypoint pose is not yet at a + citable accuracy — a short-term "looks less finished" cost, paid for by not overclaiming. +- Two more files to keep in sync (`DEPRECATED.md`, the tier table) as the checkpoints evolve. + +### Neutral +- No code or model behavior changes; `archive/v1` stays in the tree as a research archive + (ADR-117 §1.3) and its ADR-028 proof witness is untouched. +- Purely documentation/labeling; no crate, wheel, or firmware rebuild required. + +## References + +- `archive/v1/src/models/densepose_head.py` — `DensePoseHead`, random `_initialize_weights()`, no checkpoint load. +- `archive/v1/README.md` — legacy note; no loud deprecation (target of P1). +- `v2/crates/cog-pose-estimation/cog/README.md` — the "Honest reading" precedent (PCK@20 = 3.0%, runtime stub). +- `v2/crates/cog-pose-estimation/cog/artifacts/{pose_v1.safetensors,pose_v1.onnx,train_results.json}` — committed first-cut pose model. +- `v2/crates/cog-person-count/cog/artifacts/count_v1.{safetensors,onnx}` — committed count model. +- `ruvnet/wifi-densepose-pretrained`, `ruvnet/wifi-densepose-mmfi-pose` — published, benchmarked checkpoints. +- ADR-079 §Target (PCK@20 ≥35%), ADR-152 measurement (a) (96.09% PCK@20 external; internal 92.9% retracted), ADR-160 (honest-labeling method), ADR-117 (pip 1.99.0 tombstone). diff --git a/docs/adr/README.md b/docs/adr/README.md index 7c9e510e..d43a4d70 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -2,10 +2,14 @@ Latest proposed decisions: +- [ADR-187: archive/v1 deprecation + model-weights honest labeling](ADR-187-archive-v1-deprecation-honest-labeling.md) (refs #509, #1125) +- [ADR-186: Training progress API — wire the orphaned in-server trainer to /ws/train/progress](ADR-186-training-progress-api.md) (refs #1233) +- [ADR-185: Python P6 SOTA bindings — AETHER, MERIDIAN, MAT](ADR-185-python-p6-sota-bindings.md) +- [ADR-184: ADR-117 completion via PyPI Trusted Publishing](ADR-184-adr117-completion-pypi-trusted-publishing.md) (refs #785) - [ADR-264: Versioned wire protocol for RTL8720F CFR and Range-FFT reports](ADR-264-rtl8720f-radar-wire-protocol.md) - [ADR-263: Adopt RTL8720F 2.4 GHz FMCW radar as an optional RuView sensing platform](ADR-263-rtl8720f-2-4ghz-fmcw-radar-platform.md) -This folder contains 182 Architecture Decision Records (ADRs) that document every significant technical choice in the RuView / WiFi-DensePose project. (The index tables below list a curated subset per domain; see the directory listing for the full set.) +This folder contains 193 Architecture Decision Records (ADRs) that document every significant technical choice in the RuView / WiFi-DensePose project. (The index tables below list a curated subset per domain; see the directory listing for the full set.) ## Why ADRs? diff --git a/docs/user-guide.md b/docs/user-guide.md index d9542a6e..c8ca06ab 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -1141,7 +1141,20 @@ What it ships (and what it does not): | Presence detection (occupied / empty) | ✅ Trained head — v2 encoder reports 82.3% held-out temporal-triplet acc (v1's "100% on validation" was a single-class recording — retracted, [#882](https://github.com/ruvnet/RuView/issues/882)) | | 128-dim CSI embeddings (re-ID, similarity, downstream training) | ✅ Trained encoder | | Single-person breathing / heart-rate | ⚠️ Server still uses heuristic DSP — model does not replace this yet | -| 17-keypoint full-body pose | 🔬 No keypoint weights shipped yet — pose pipeline runs but without a learned head | +| 17-keypoint full-body pose | 🔬 This HF bundle ships no keypoint head — but real pose weights exist elsewhere; see the tier table below | + +### Model weights: what's real, what's not + +"WiFi → pose" means three different things in this repo, at three different maturity +levels. Read the label, not the headline ([ADR-187](adr/ADR-187-archive-v1-deprecation-honest-labeling.md)): + +| Tier | Checkpoint(s) | Honest status | +|------|---------------|---------------| +| **Real & validated** | [`ruvnet/wifi-densepose-pretrained`](https://huggingface.co/ruvnet/wifi-densepose-pretrained) (encoder + presence head) · [`ruvnet/wifi-densepose-mmfi-pose`](https://huggingface.co/ruvnet/wifi-densepose-mmfi-pose) (17-keypoint pose) · `cog-person-count/count_v1` | **MEASURED / published.** Presence = 82.3% held-out temporal-triplet accuracy (the old "100% presence" figure was retracted); MM-Fi pose = 82.69% torso-PCK@20 on the `random_split` protocol. | +| **Real but weak (honestly labeled)** | committed `v2/crates/cog-pose-estimation/cog/artifacts/pose_v1.safetensors` | First-cut on-device model. **PCK@20 = 3.0% / PCK@50 = 18.5%** on a 217-sample holdout — **below the ADR-079 target of ≥ 35%.** Learns coarse structure (`r_hip` 77% PCK@50); distal/face joints near-random. Its runtime path in `cog-pose-estimation/src/inference.rs` is still a centred-skeleton **stub returning `confidence=0`**. Full disclosure in the [cog README](../v2/crates/cog-pose-estimation/cog/README.md). Do not advertise the live single-ESP32 17-keypoint feature without this caveat. | +| **Architecture only, no weights** | `archive/v1` `DensePoseHead` | Random `kaiming_normal_` init, **no checkpoint of any kind** (zero `.pth`/`.onnx`/`.safetensors` files under `archive/v1/`). Deprecated and superseded — see [`archive/v1/DEPRECATED.md`](../archive/v1/DEPRECATED.md). Do not expect real pose output from it. | + +**Does it actually run, and can a single ESP32 do pose? ([#509](https://github.com/ruvnet/RuView/issues/509), [#1125](https://github.com/ruvnet/RuView/issues/1125))** Yes, it runs, and the results are reproducible: the deterministic signal-pipeline proof (`python archive/v1/data/proof/verify.py`, must print `VERDICT: PASS`), the committed pose training dump (`v2/crates/cog-pose-estimation/cog/artifacts/train_results.json`), and the auditable MM-Fi arena all back specific numbers. But a single-antenna, 56-subcarrier CSI stream at a 20-frame window does *not* carry the fine-grained spatial information the multi-antenna NIC research relies on — so the shippable pose accuracy the project stands behind today is the **MM-Fi benchmark number**, not a live single-ESP32 number. The path to a first reproducible on-device baseline (PCK@20 ≥ 35%) is tracked in [ADR-079](adr/ADR-079-camera-ground-truth-training.md) / [#645](https://github.com/ruvnet/RuView/issues/645). ### Download diff --git a/python/Cargo.lock b/python/Cargo.lock index 8d06cfcb..3d2f275d 100644 --- a/python/Cargo.lock +++ b/python/Cargo.lock @@ -2,6 +2,27 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -11,12 +32,97 @@ dependencies = [ "libc", ] +[[package]] +name = "anndists" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8396b473aa0bceed68fb32462505387ea39fa47c7029417e0a49f10592b036" +dependencies = [ + "anyhow", + "cfg-if", + "cpu-time", + "env_logger", + "lazy_static", + "log", + "num-traits", + "num_cpus", + "rayon", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + [[package]] name = "anyhow" version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -29,12 +135,79 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "async-trait" +version = "0.1.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.2", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.11.1" @@ -52,7 +225,16 @@ dependencies = [ "cc", "cfg-if", "constant_time_eq", - "cpufeatures", + "cpufeatures 0.3.0", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", ] [[package]] @@ -61,6 +243,47 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "bytecheck" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0caa33a2c0edca0419d15ac723dff03f1956f7978329b1e3b5fdaaaed9d3ca8b" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "rancor", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + [[package]] name = "cc" version = "1.2.62" @@ -77,6 +300,23 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[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" @@ -91,6 +331,75 @@ dependencies = [ "windows-link", ] +[[package]] +name = "clap" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.2", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + [[package]] name = "constant_time_eq" version = "0.4.2" @@ -103,6 +412,25 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cpu-time" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e393a7668fe1fad3075085b86c781883000b4ede868f43627b34a87c8b7ded" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "cpufeatures" version = "0.3.0" @@ -127,30 +455,335 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csv" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "csv-core" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +dependencies = [ + "memchr", +] + +[[package]] +name = "dashmap" +version = "6.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "earcutr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79127ed59a85d7687c409e9978547cffb7dc79675355ed22da6b66fd5f6ead01" +dependencies = [ + "itertools", + "num-traits", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "env_filter" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "find-msvc-tools" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "float_next_after" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" + [[package]] name = "foldhash" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + [[package]] name = "futures-core" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-sink" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" + [[package]] name = "futures-task" version = "0.3.32" @@ -164,11 +797,87 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-core", + "futures-io", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "geo" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4841b40fdbccd4b7042bd6195e4de91da54af34c50632e371bcbfcdfb558b873" +dependencies = [ + "earcutr", + "float_next_after", + "geo-types", + "geographiclib-rs", + "log", + "num-traits", + "robust", + "rstar", + "spade", +] + +[[package]] +name = "geo-types" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94776032c45f950d30a13af6113c2ad5625316c9abfbccee4dd5a6695f8fe0f5" +dependencies = [ + "approx", + "num-traits", + "rstar", + "serde", +] + +[[package]] +name = "geographiclib-rs" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a7f08910fd98737a6eda7568e7c5e645093e073328eeef49758cfe8b0489c7" +dependencies = [ + "libm", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + [[package]] name = "getrandom" version = "0.4.2" @@ -176,19 +885,50 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", + "js-sys", "libc", - "r-efi", + "r-efi 6.0.0", + "rand_core 0.10.1", "wasip2", "wasip3", + "wasm-bindgen", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "allocator-api2", + "equivalent", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", ] [[package]] @@ -197,12 +937,154 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "spin", + "stable_deref_trait", +] + [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hnsw_rs" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a5258f079b97bf2e8311ff9579e903c899dcbac0d9a138d62e9a066778bd07" +dependencies = [ + "anndists", + "anyhow", + "bincode 1.3.3", + "cfg-if", + "cpu-time", + "env_logger", + "hashbrown 0.15.5", + "indexmap", + "lazy_static", + "log", + "mmap-rs", + "num-traits", + "num_cpus", + "parking_lot", + "rand 0.9.5", + "rayon", + "serde", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.65" @@ -227,12 +1109,115 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[package]] name = "id-arena" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + [[package]] name = "indexmap" version = "2.14.0" @@ -245,6 +1230,19 @@ dependencies = [ "serde_core", ] +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", + "web-time", +] + [[package]] name = "indoc" version = "2.0.7" @@ -254,12 +1252,69 @@ dependencies = [ "rustversion", ] +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jiff" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e184d09547b80eb7e20d141ba2fb1fbac843ca53f4cf1b31210adc4c1adc6e16" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323da076b7a6faf914dc677cb05a4b907742ff7375c8322c9e7f5061e5e0e9de" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "js-sys" version = "0.3.99" @@ -272,6 +1327,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "leb128fmt" version = "0.1.0" @@ -284,12 +1345,66 @@ version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + [[package]] name = "matrixmultiply" version = "0.3.10" @@ -306,6 +1421,15 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "memmap2" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.9.1" @@ -315,6 +1439,129 @@ dependencies = [ "autocfg", ] +[[package]] +name = "midstreamer-attractor" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebe548a4e74b80ecb8dd058e352a91fed9e5685c49c5d3fa5062520c660c6c9" +dependencies = [ + "midstreamer-temporal-compare", + "nalgebra", + "ndarray 0.16.1", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "midstreamer-temporal-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b87063b1eb79672a76f88377799152d8e149328e9a19455345851a264bdced20" +dependencies = [ + "dashmap", + "lru", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "mmap-rs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ecce9d566cb9234ae3db9e249c8b55665feaaf32b0859ff1e27e310d2beb3d8" +dependencies = [ + "bitflags 2.11.1", + "combine", + "libc", + "mach2", + "nix", + "sysctl", + "thiserror 2.0.18", + "widestring", + "windows", +] + +[[package]] +name = "munge" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" +dependencies = [ + "munge_macro", +] + +[[package]] +name = "munge_macro" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "nalgebra" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d43ddcacf343185dfd6de2ee786d9e8b1c2301622afab66b6c73baf9882abfd" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ndarray" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", +] + [[package]] name = "ndarray" version = "0.16.1" @@ -328,6 +1575,7 @@ dependencies = [ "portable-atomic", "portable-atomic-util", "rawpointer", + "serde", ] [[package]] @@ -346,6 +1594,51 @@ dependencies = [ "serde", ] +[[package]] +name = "ndarray-npy" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e8a348bca0075000d999d750420d74434fd0d3e0993b456554f885e7657a11" +dependencies = [ + "byteorder", + "ndarray 0.17.2", + "num-complex", + "num-traits", + "py_literal", + "zip", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.11.1", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-complex" version = "0.4.6" @@ -364,6 +1657,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -371,8 +1675,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "numpy" version = "0.22.1" @@ -385,7 +1706,7 @@ dependencies = [ "num-integer", "num-traits", "pyo3", - "rustc-hash", + "rustc-hash 1.1.0", ] [[package]] @@ -394,6 +1715,108 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47627dd7305c6a2d6c8c6bcd24c5a4c17dbbf425f4f9c5313e724b38fc9782e9" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b4254325ecad416ab689e27ba51da03ba01a9632bc6e108f5fe7c3c4ad29d58" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c4c0e91ead7a8f7acecbca6f003fc2e8282b1dbe2dd9c9d2f16aba42995e0a7" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "pest_meta" +version = "2.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9744bc48116fee06334924bb5f2bad41eed5e89bd26e29b0b799f9a3f82c210" +dependencies = [ + "pest", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "pin-project-lite" version = "0.2.17" @@ -415,6 +1838,24 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + [[package]] name = "prettyplease" version = "0.2.37" @@ -422,7 +1863,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.117", +] + +[[package]] +name = "primal-check" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" +dependencies = [ + "num-integer", ] [[package]] @@ -434,6 +1884,39 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "py_literal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "102df7a3d46db9d3891f178dcc826dc270a6746277a9ae6436f8d29fd490a8e1" +dependencies = [ + "num-bigint", + "num-complex", + "num-traits", + "pest", + "pest_derive", +] + [[package]] name = "pyo3" version = "0.22.6" @@ -481,7 +1964,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -494,7 +1977,63 @@ dependencies = [ "proc-macro2", "pyo3-build-config", "quote", - "syn", + "syn 2.0.117", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.3", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" +dependencies = [ + "bytes", + "getrandom 0.4.2", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash 2.1.3", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", ] [[package]] @@ -506,30 +2045,517 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "r-efi" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "rancor" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daff8b7b3ccf5f7ba270b3e7a0a4d4c701c5797e38dec27c7e2c3dbb830fed1c" +dependencies = [ + "ptr_meta", +] + +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.7", +] + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "rawpointer" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redb" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eca1e9d98d5a7e9002d0013e18d5a9b000aee942eb134883a82f06ebffb6c01" +dependencies = [ + "libc", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rend" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "663ba70707f96e871406fe10d68128412e619b06d1d47cb91c3a4c6501176240" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rkyv" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "815cc8a37159a463064825246cadb07961e25cd9885908606f6d08a98d8f8874" +dependencies = [ + "bytecheck", + "bytes", + "hashbrown 0.17.1", + "indexmap", + "munge", + "ptr_meta", + "rancor", + "rend", + "rkyv_derive", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ed1a78a1b19d184b0daa629dd9a024573173ec7d485b287cb369fb3607cc1c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "roaring" +version = "0.10.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e8d2cfa184d94d0726d650a9f4a1be7f9b76ac9fdb954219878dc00c1c1e7b" +dependencies = [ + "bytemuck", + "byteorder", +] + +[[package]] +name = "robust" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839" + +[[package]] +name = "rstar" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73111312eb7a2287d229f06c00ff35b51ddee180f017ab6dec1f69d62ac098d6" +dependencies = [ + "heapless", + "num-traits", + "smallvec", +] + [[package]] name = "rustc-hash" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustfft" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21db5f9893e91f41798c88680037dba611ca6674703c1a18601b01a72c8adb89" +dependencies = [ + "num-complex", + "num-integer", + "num-traits", + "primal-check", + "strength_reduce", + "transpose", +] + +[[package]] +name = "rustls" +version = "0.23.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "ruvector-attention" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d852b3085e7b24b76a4410671a0b4fcf215d065afccde18d503ce1d37c1cf0ed" +dependencies = [ + "rand 0.8.7", + "rayon", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "ruvector-attn-mincut" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8ec5e03cc7a435945c81f1b151a2bc5f64f2206bf50150cab0f89981ce8c94" +dependencies = [ + "serde", + "serde_json", + "sha2", +] + +[[package]] +name = "ruvector-core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecaff2299e821f1f9aacd85f6fd16a16de6e7245b67843415d4f49f2f5f70084" +dependencies = [ + "anyhow", + "bincode 2.0.1", + "chrono", + "crossbeam", + "dashmap", + "hnsw_rs", + "memmap2", + "ndarray 0.16.1", + "once_cell", + "parking_lot", + "rand 0.8.7", + "rand_distr", + "rayon", + "redb", + "reqwest", + "rkyv", + "serde", + "serde_json", + "simsimd", + "thiserror 2.0.18", + "tracing", + "uuid", +] + +[[package]] +name = "ruvector-mincut" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d60947433f740d0f589a2911d7b72a02e07a916e7257e478b14386f0ff068fb7" +dependencies = [ + "anyhow", + "crossbeam", + "dashmap", + "ordered-float", + "parking_lot", + "petgraph", + "rand 0.8.7", + "rayon", + "roaring", + "ruvector-core", + "serde", + "serde_json", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "ruvector-solver" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f420f7edd61093f2be31523b493c1e74dc432cae9466c82e7d343c5480de793" +dependencies = [ + "dashmap", + "getrandom 0.2.17", + "parking_lot", + "rand 0.8.7", + "serde", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "ruvector-temporal-tensor" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "753a07254fa68db183949ec6c7575d890da4d42404afabc11d610a720fcf570c" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "safe_arch" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "semver" version = "1.0.28" @@ -563,7 +2589,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -579,24 +2605,170 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simba" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simsimd" +version = "5.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9638f2829f4887c62a01958903b58fa1b740a64d5dc2bbc4a75a33827ee1bd53" +dependencies = [ + "cc", +] + [[package]] name = "slab" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spade" +version = "2.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9699399fd9349b00b184f5635b074f9ec93afffef30c853f8c875b32c0f8c7fa" +dependencies = [ + "hashbrown 0.16.1", + "num-traits", + "robust", + "smallvec", +] + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "2.0.117" @@ -608,19 +2780,84 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a207d6d6a2b7fc470b80443726053f18a2481b7e1eee970597051596567987a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "sysctl" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" +dependencies = [ + "bitflags 2.11.1", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + [[package]] name = "target-lexicon" version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + [[package]] name = "thiserror" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -631,9 +2868,167 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.11.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.44" @@ -653,7 +3048,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -663,14 +3058,91 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", + "valuable", ] +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "transpose" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" +dependencies = [ + "num-integer", + "strength_reduce", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -683,18 +3155,97 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ - "getrandom", + "getrandom 0.4.2", "js-sys", "serde_core", "wasm-bindgen", ] +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + [[package]] name = "wasip2" version = "1.0.3+wasi-0.2.9" @@ -726,6 +3277,16 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.122" @@ -745,7 +3306,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "wasm-bindgen-shared", ] @@ -786,55 +3347,244 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags", + "bitflags 2.11.1", "hashbrown 0.15.5", "indexmap", "semver", ] [[package]] -name = "wifi-densepose-bfld" +name = "web-sys" +version = "0.3.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "wide" +version = "0.7.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + +[[package]] +name = "wifi-densepose-aether" version = "0.3.0" + +[[package]] +name = "wifi-densepose-bfld" +version = "0.3.1" dependencies = [ "blake3", "crc", "serde", "serde_json", "static_assertions", - "thiserror", + "thiserror 2.0.18", ] [[package]] name = "wifi-densepose-core" -version = "0.3.0" +version = "0.3.1" dependencies = [ + "blake3", "chrono", "ndarray 0.17.2", "num-complex", "num-traits", - "thiserror", + "thiserror 2.0.18", "uuid", ] +[[package]] +name = "wifi-densepose-mat" +version = "0.3.1" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "geo", + "ndarray 0.15.6", + "num-complex", + "parking_lot", + "rustfft", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tracing", + "uuid", + "wifi-densepose-core", + "wifi-densepose-signal", +] + [[package]] name = "wifi-densepose-py" version = "2.0.0-alpha.1" dependencies = [ + "geo", "numpy", "pyo3", + "serde_json", + "sha2", + "tokio", + "wifi-densepose-aether", "wifi-densepose-bfld", "wifi-densepose-core", + "wifi-densepose-mat", + "wifi-densepose-signal", + "wifi-densepose-train", "wifi-densepose-vitals", ] +[[package]] +name = "wifi-densepose-ruvector" +version = "0.3.2" +dependencies = [ + "ruvector-attention", + "ruvector-attn-mincut", + "ruvector-core", + "ruvector-mincut", + "ruvector-solver", + "ruvector-temporal-tensor", + "sha2", + "thiserror 2.0.18", +] + +[[package]] +name = "wifi-densepose-signal" +version = "0.3.5" +dependencies = [ + "chrono", + "midstreamer-attractor", + "midstreamer-temporal-compare", + "ndarray 0.17.2", + "num-complex", + "num-traits", + "rustfft", + "ruvector-attention", + "ruvector-attn-mincut", + "ruvector-mincut", + "ruvector-solver", + "serde", + "serde_json", + "sha2", + "thiserror 2.0.18", + "uuid", + "wifi-densepose-core", + "wifi-densepose-ruvector", +] + +[[package]] +name = "wifi-densepose-train" +version = "0.3.2" +dependencies = [ + "anyhow", + "chrono", + "clap", + "csv", + "indicatif", + "memmap2", + "ndarray 0.17.2", + "ndarray-npy", + "num-complex", + "num-traits", + "petgraph", + "ruvector-attention", + "ruvector-attn-mincut", + "ruvector-mincut", + "ruvector-solver", + "ruvector-temporal-tensor", + "serde", + "serde_json", + "sha2", + "thiserror 2.0.18", + "tokio", + "toml", + "tracing", + "tracing-subscriber", + "walkdir", + "wifi-densepose-signal", +] + [[package]] name = "wifi-densepose-vitals" -version = "0.3.0" +version = "0.3.1" dependencies = [ "serde", "tracing", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-core" version = "0.62.2" @@ -856,7 +3606,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -867,7 +3617,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -894,6 +3644,163 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen" version = "0.51.0" @@ -930,7 +3837,7 @@ dependencies = [ "heck", "indexmap", "prettyplease", - "syn", + "syn 2.0.117", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -946,7 +3853,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -958,7 +3865,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags", + "bitflags 2.11.1", "indexmap", "log", "serde", @@ -988,8 +3895,149 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zip" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b" +dependencies = [ + "arbitrary", + "crc32fast", + "flate2", + "indexmap", + "memchr", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5" + [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] diff --git a/python/Cargo.toml b/python/Cargo.toml index c781ac53..ea2523f8 100644 --- a/python/Cargo.toml +++ b/python/Cargo.toml @@ -23,6 +23,27 @@ name = "wifi_densepose_native" crate-type = ["cdylib", "rlib"] path = "src/lib.rs" +# ADR-185 §3.1 — optional pip extras map to Cargo features so the +# default wheel links none of the SOTA subsystems. P1 wires `aether`. +[features] +default = [] +# ADR-185 P1 — AETHER contrastive CSI embeddings. Binds the std-only +# `wifi-densepose-aether` leaf crate (the pure-compute stack hoisted out of +# `wifi-densepose-sensing-server` per §13), so this extra links no server tree. +aether = ["dep:wifi-densepose-aether"] +# ADR-185 P2 — MERIDIAN domain generalization. Binds the tch-free +# inference/adaptation path only (see the wheel-size note on the deps +# below). `wifi-densepose-train` is depended on WITHOUT `tch-backend`, +# so no libtorch is linked. +meridian = ["dep:wifi-densepose-train", "dep:wifi-densepose-signal"] +# ADR-185 P3 — MAT disaster-survivor detection. Mirrors the upstream +# disaster/ML gating: bound only under this extra so the default wheel +# never carries the detection stack. `tokio`/`geo` are pulled to drive a +# single-shot scan (see the wheel-size note on the deps below). +mat = ["dep:wifi-densepose-mat", "dep:tokio", "dep:geo"] +# ADR-185 §3 — convenience superset: all three SOTA subsystems. +sota = ["aether", "meridian", "mat"] + [dependencies] # PyO3 with abi3-py310 — one compiled binary covers Python 3.10, 3.11, # 3.12, 3.13, and any future 3.x that keeps the stable ABI (ADR-117 §5.4). @@ -50,6 +71,52 @@ wifi-densepose-bfld = { version = "0.3.0", path = "../v2/crates/wifi-densepose-b # the future P3 CsiFrame numpy round-trip. numpy = "0.22" +# ADR-185 P1 — AETHER backing crate (contrastive `embedding` + +# `graph_transformer`/`sona`/`sparse_inference`, ADR-024). Optional + +# gated behind the `aether` feature. +# +# WHEEL-SIZE FIX LANDED (ADR-185 §13): this is now the std-only +# `wifi-densepose-aether` leaf crate — zero external deps, no tokio/axum/ +# worldgraph/ruvector — hoisted out of `wifi-densepose-sensing-server` +# (which re-exports it, so the server is unchanged). The `[aether]` wheel +# therefore links only pure compute and stays within the ADR-117 §5.4 +# ≤5 MB budget. +wifi-densepose-aether = { version = "0.3.0", path = "../v2/crates/wifi-densepose-aether", optional = true } + +# ADR-185 P2 — MERIDIAN backing crates (optional, `meridian`-gated). +# +# HONEST WHEEL-SIZE NOTE (ADR-185 §9 / §1.2): unlike AETHER, the libtorch +# risk is AVOIDED here — `wifi-densepose-train`'s `tch` dep is properly +# optional (feature `tch-backend`, OFF by default), so no libtorch links. +# BUT `wifi-densepose-train` still carries NON-optional deps: `tokio` (rt +# subset), the five `ruvector-*` crates, `wifi-densepose-nn`, petgraph, +# memmap2, indicatif, ndarray-npy, csv, toml, clap. So a `[meridian]` +# wheel is heavier than the ≤5 MB ADR-117 §5.4 budget (though far lighter +# than AETHER's axum/tokio server tree). The clean fix is the same +# leaf-crate hoist: move the pure inference modules (geometry, +# rapid_adapt, eval, hardware_norm) into a tch/tokio-free leaf crate. +# `wifi-densepose-signal` is depended on `default-features = false` to +# drop the optional ndarray-linalg/BLAS chain (Windows-friendly). +wifi-densepose-train = { version = "0.3.0", path = "../v2/crates/wifi-densepose-train", optional = true, default-features = false } +wifi-densepose-signal = { version = "0.3.0", path = "../v2/crates/wifi-densepose-signal", optional = true, default-features = false } + +# ADR-185 P3 — MAT backing crate + the tokio/geo needed to drive one scan. +# +# HONEST WHEEL-SIZE NOTE (ADR-185 §9 / §1.3): `default-features = false` +# drops MAT's `api` (axum) and `ruvector` features from the wheel, but MAT +# still carries NON-optional `tokio` (rt/sync/time), `wifi-densepose-nn` +# (which pulls `ort` / ONNX Runtime + reqwest/hyper), `rustfft`, `geo`, +# and `ndarray`. So a `[mat]` wheel exceeds the ADR-117 §5.4 ≤5 MB budget +# — same leaf-crate-hoist story as AETHER/MERIDIAN, gated the same way so +# the DEFAULT wheel is untouched. `tokio` (rt+time) and `geo` are depended +# on directly (version-matched to MAT) to build the single-shot scan +# runtime and construct the event `geo::Point` in the binding. +wifi-densepose-mat = { version = "0.3.0", path = "../v2/crates/wifi-densepose-mat", optional = true, default-features = false, features = ["std"] } +tokio = { version = "1.35", features = ["rt", "time"], optional = true } +geo = { version = "0.27", optional = true } + [dev-dependencies] -# Doc-test infrastructure for the Python-facing examples in the bound -# Rust functions. Lands properly in P2 once #[pyfunction]s exist to test. +# ADR-185 §4.1 parity harness — SHA-256 the native-Rust reference +# embedding and read the committed golden fixture. +sha2 = "0.10" +serde_json = "1" diff --git a/python/README.md b/python/README.md index 4d085cb2..675dee3f 100644 --- a/python/README.md +++ b/python/README.md @@ -43,6 +43,29 @@ pip install "wifi-densepose[client]" # + WebSocket/MQTT clients Wheels are published for Linux (x86_64, aarch64), macOS (x86_64, arm64), and Windows (amd64). +### SOTA extras (ADR-185) + +Three optional subsystems bind the Rust SOTA modules as compiled-feature +wheels. Each raises a clear `ImportError` if you import it without the extra: + +| Extra | Module | What it adds | +|-------|--------|--------------| +| `[aether]` | `wifi_densepose.aether` | Contrastive CSI embeddings / re-identification (ADR-024) — `EmbeddingExtractor`, `cosine_similarity`, `info_nce_loss` | +| `[meridian]` | `wifi_densepose.meridian` | Cross-environment domain generalization (ADR-027) — `HardwareNormalizer`, `GeometryEncoder`, `RapidAdaptation`, `CrossDomainEvaluator` | +| `[mat]` | `wifi_densepose.mat` | Mass-Casualty Assessment disaster-survivor detection + START triage — `DisasterResponse`, `Survivor`, `TriageStatus` | +| `[sota]` | all three | Convenience superset | + +```bash +pip install "wifi-densepose[aether]" # re-identification embeddings +pip install "wifi-densepose[meridian]" # cross-room calibration +pip install "wifi-densepose[mat]" # disaster triage +pip install "wifi-densepose[sota]" # all three +``` + +Runnable examples: [`examples/reid_from_csi.py`](examples/reid_from_csi.py), +[`examples/cross_room_calibrate.py`](examples/cross_room_calibrate.py), +[`examples/mat_triage.py`](examples/mat_triage.py). + ## Usage ### Extract breathing rate from a CSI stream diff --git a/python/bench/test_bench_aether.py b/python/bench/test_bench_aether.py new file mode 100644 index 00000000..fb6d2775 --- /dev/null +++ b/python/bench/test_bench_aether.py @@ -0,0 +1,44 @@ +"""ADR-185 §4.2 — AETHER embed() micro-benchmarks. + +Target (release build, ADR-024 §2.8 FP32 <1 ms with headroom): steady-state +`embed()` < 2 ms/window, and batched `embed()` scales roughly linearly (no +accidental O(n²)). + +Run with: + pytest python/bench/test_bench_aether.py --benchmark-only + +Skipped by default (they live in `bench/`, outside `testpaths`). Timing +targets are validated on a RELEASE wheel (`maturin develop --release +--features sota`); a debug wheel will be several× slower. +""" + +from __future__ import annotations + +import math + +import pytest + +from wifi_densepose import aether + + +def _window(frames: int = 8, subc: int = 56) -> list[list[float]]: + return [[math.sin(0.1 * t + 0.03 * k) for k in range(subc)] for t in range(frames)] + + +def _extractor() -> aether.EmbeddingExtractor: + return aether.EmbeddingExtractor(n_subcarriers=56, config=aether.AetherConfig()) + + +def test_embed_per_window(benchmark) -> None: + ext = _extractor() + window = _window() + out = benchmark(lambda: ext.embed(window)) + assert len(out) == 128 + + +@pytest.mark.parametrize("batch", [1, 8, 64]) +def test_embed_batch_scaling(benchmark, batch: int) -> None: + ext = _extractor() + windows = [_window() for _ in range(batch)] + out = benchmark(lambda: [ext.embed(w) for w in windows]) + assert len(out) == batch diff --git a/python/bench/test_bench_mat.py b/python/bench/test_bench_mat.py new file mode 100644 index 00000000..2420660b --- /dev/null +++ b/python/bench/test_bench_mat.py @@ -0,0 +1,44 @@ +"""ADR-185 §4.2 — MAT scan micro-benchmark. + +Measures the cost of one full ingest + `scan_once()` cycle over the +committed 256-frame CSI stream. The per-cycle cost should stay comfortably +below the configured scan interval (default 500 ms) so the binding is not +the bottleneck. + +Run with: + pytest python/bench/test_bench_mat.py --benchmark-only + +Validated on a RELEASE wheel; a debug wheel will be several× slower. +""" + +from __future__ import annotations + +import json +from pathlib import Path + +from wifi_densepose import mat + +_FIXTURE = Path(__file__).resolve().parents[1] / "tests" / "golden" / "mat_input.json" + + +def _stream() -> list[dict]: + return json.loads(_FIXTURE.read_text())["stream"] + + +def test_scan_cycle_cost(benchmark) -> None: + stream = _stream() + + def _run() -> int: + cfg = mat.DisasterConfig( + mat.DisasterType.Earthquake, sensitivity=0.9, confidence_threshold=0.1 + ) + resp = mat.DisasterResponse(cfg) + resp.initialize_event(0.0, 0.0, "bench") + resp.add_zone(mat.ScanZone.rectangle("Zone A", 0.0, 0.0, 50.0, 30.0)) + for frame in stream: + resp.push_csi_data(frame["amplitude"], frame["phase"]) + resp.scan_once() + return len(resp.survivors()) + + survivors = benchmark(_run) + assert survivors == 1 diff --git a/python/bench/test_bench_meridian.py b/python/bench/test_bench_meridian.py new file mode 100644 index 00000000..d9492bbb --- /dev/null +++ b/python/bench/test_bench_meridian.py @@ -0,0 +1,29 @@ +"""ADR-185 §4.2 — MERIDIAN micro-benchmarks. + +Targets (release build, ADR-027 §4.1/§4.3 ×2 headroom): `normalize()` +< 200 µs/frame, `encode()` < 200 µs. + +Run with: + pytest python/bench/test_bench_meridian.py --benchmark-only + +Validated on a RELEASE wheel; a debug wheel will be several× slower. +""" + +from __future__ import annotations + +from wifi_densepose import meridian as mer + + +def test_normalize_per_frame(benchmark) -> None: + norm = mer.HardwareNormalizer() + amp = [10.0 + 0.05 * k for k in range(64)] + phase = [0.01 * k for k in range(64)] + out = benchmark(lambda: norm.normalize(amp, phase, mer.HardwareType.Esp32S3)) + assert len(out.amplitude) == 56 + + +def test_geometry_encode(benchmark) -> None: + enc = mer.GeometryEncoder(mer.MeridianGeometryConfig()) + aps = [[0.0, 0.0, 2.5], [5.0, 0.0, 2.5], [0.0, 4.0, 2.5]] + out = benchmark(lambda: enc.encode(aps)) + assert len(out) == 64 diff --git a/python/examples/cross_room_calibrate.py b/python/examples/cross_room_calibrate.py new file mode 100644 index 00000000..0f07d77d --- /dev/null +++ b/python/examples/cross_room_calibrate.py @@ -0,0 +1,45 @@ +"""MERIDIAN cross-room calibration (ADR-185 P2, `[meridian]` extra). + +Hardware-invariant CSI normalization, AP-geometry encoding, and few-shot +rapid adaptation — the tch-free domain-generalization path. + + pip install wifi-densepose[meridian] + python examples/cross_room_calibrate.py +""" + +from __future__ import annotations + +import math + +from wifi_densepose.meridian import ( + GeometryEncoder, + HardwareNormalizer, + HardwareType, + MeridianGeometryConfig, + RapidAdaptation, +) + + +def main() -> None: + # 1. Normalize a 64-subcarrier ESP32 frame to the canonical 56-tone grid. + norm = HardwareNormalizer() + amp = [10.0 + 0.05 * k for k in range(64)] + phase = [0.01 * k for k in range(64)] + frame = norm.normalize(amp, phase, HardwareType.detect(64)) + print(f"canonical subcarriers: {len(frame.amplitude)} (hw={frame.hardware_type})") + + # 2. Encode AP positions into a permutation-invariant geometry embedding. + enc = GeometryEncoder(MeridianGeometryConfig()) + geometry = enc.encode([[0.0, 0.0, 2.5], [5.0, 0.0, 2.5], [0.0, 4.0, 2.5]]) + print(f"geometry embedding dim: {len(geometry)}") + + # 3. Few-shot rapid adaptation over a handful of unlabeled frames. + ra = RapidAdaptation(min_calibration_frames=10, lora_rank=4) + for i in range(12): + ra.push_frame([math.sin(0.1 * i + 0.05 * d) for d in range(16)]) + result = ra.adapt() + print(f"adapted over {result.frames_used} frames, final_loss={result.final_loss:.4f}") + + +if __name__ == "__main__": + main() diff --git a/python/examples/mat_triage.py b/python/examples/mat_triage.py new file mode 100644 index 00000000..5dade08c --- /dev/null +++ b/python/examples/mat_triage.py @@ -0,0 +1,49 @@ +"""MAT disaster-survivor triage from CSI (ADR-185 P3, `[mat]` extra). + +Ingest a CSI stream, run one detection cycle, and list detected survivors +by START triage class. + + pip install wifi-densepose[mat] + python examples/mat_triage.py + +Note: the stream here is synthetic (breathing-modulated) — it demonstrates +the API and pipeline, not validated detection accuracy on real rubble. +""" + +from __future__ import annotations + +import math +from collections.abc import Iterator + +from wifi_densepose.mat import DisasterConfig, DisasterResponse, DisasterType, ScanZone + + +def breathing_stream( + frames: int = 256, subc: int = 56, fs: float = 20.0 +) -> Iterator[tuple[list[float], list[float]]]: + for t in range(frames): + tt = t / fs + breath = 2.0 * math.sin(2 * math.pi * 0.3 * tt) + amp = [10.0 + 0.05 * k + breath for k in range(subc)] + phase = [0.01 * k + 0.1 * math.sin(2 * math.pi * 0.3 * tt) for k in range(subc)] + yield amp, phase + + +def main() -> None: + cfg = DisasterConfig(DisasterType.Earthquake, sensitivity=0.9, confidence_threshold=0.1) + resp = DisasterResponse(cfg) + resp.initialize_event(0.0, 0.0, "Collapsed Building A") + resp.add_zone(ScanZone.rectangle("North Wing", 0.0, 0.0, 50.0, 30.0)) + + for amp, phase in breathing_stream(): + resp.push_csi_data(amp, phase) + resp.scan_once() + + survivors = resp.survivors() + print(f"detected {len(survivors)} survivor(s)") + for s in survivors: + print(f" {s.id[:8]} triage={s.triage_status} confidence={s.confidence:.3f}") + + +if __name__ == "__main__": + main() diff --git a/python/examples/reid_from_csi.py b/python/examples/reid_from_csi.py new file mode 100644 index 00000000..6c31ad96 --- /dev/null +++ b/python/examples/reid_from_csi.py @@ -0,0 +1,39 @@ +"""AETHER re-identification from CSI (ADR-185 P1, `[aether]` extra). + +Compute 128-dim contrastive embeddings for CSI windows and score them by +cosine similarity — the primitive behind room fingerprinting and person +re-identification. + + pip install wifi-densepose[aether] + python examples/reid_from_csi.py +""" + +from __future__ import annotations + +import math + +from wifi_densepose.aether import AetherConfig, EmbeddingExtractor, cosine_similarity + + +def make_window(phase_shift: float, frames: int = 8, subc: int = 56) -> list[list[float]]: + """A synthetic CSI window; `phase_shift` stands in for a different scene.""" + return [ + [math.sin(0.1 * t + 0.03 * k + phase_shift) for k in range(subc)] + for t in range(frames) + ] + + +def main() -> None: + ext = EmbeddingExtractor(n_subcarriers=56, config=AetherConfig()) + + same_a = ext.embed(make_window(0.0)) + same_b = ext.embed(make_window(0.0)) # same scene + other = ext.embed(make_window(1.5)) # different scene + + print(f"embedding dim: {len(same_a)}") + print(f"same-scene similarity: {cosine_similarity(same_a, same_b):.4f}") + print(f"cross-scene similarity: {cosine_similarity(same_a, other):.4f}") + + +if __name__ == "__main__": + main() diff --git a/python/pyproject.toml b/python/pyproject.toml index 92089b58..f7f9a832 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -10,7 +10,7 @@ build-backend = "maturin" [project] name = "wifi-densepose" -version = "2.0.0a1" +version = "2.0.0" description = "WiFi-based human pose estimation, vital sign extraction, and ambient intelligence from Channel State Information (CSI). PyO3 bindings for the Rust core." readme = "README.md" requires-python = ">=3.10" @@ -23,7 +23,7 @@ keywords = [ "biometric", "ambient-intelligence", "home-assistant", "matter", ] classifiers = [ - "Development Status :: 3 - Alpha", + "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", @@ -48,6 +48,20 @@ client = [ "websockets>=12.0", "paho-mqtt>=2.1", ] +# ADR-185 P1 — AETHER contrastive embeddings. Unlike `client`, this +# extra carries no pure-Python deps: it is a marker for a *compiled* +# feature build (`maturin ... --features aether` / a cibuildwheel +# feature axis, ADR-185 §3.1). Installing the base wheel and importing +# `wifi_densepose.aether` raises a clear ImportError naming this extra. +aether = [] +# ADR-185 P2 — MERIDIAN domain generalization. Same compiled-feature +# marker pattern as `aether` (built via `maturin ... --features meridian`). +meridian = [] +# ADR-185 P3 — MAT disaster-survivor detection. Same compiled-feature +# marker (built via `maturin ... --features mat`). +mat = [] +# ADR-185 §3 convenience — all three SOTA subsystems at once. +sota = [] # Developer dependencies for running the test suite + lint. dev = [ "pytest>=8.0", diff --git a/python/ruview-meta/pyproject.toml b/python/ruview-meta/pyproject.toml index 401805c2..9b971e3c 100644 --- a/python/ruview-meta/pyproject.toml +++ b/python/ruview-meta/pyproject.toml @@ -16,7 +16,7 @@ build-backend = "setuptools.build_meta" [project] name = "ruview" -version = "2.0.0a1" +version = "2.0.0" description = "RuView — ambient intelligence from WiFi CSI. Meta-package; installs `wifi-densepose` and re-exports it under the `ruview` namespace. See https://github.com/ruvnet/RuView." readme = "README.md" requires-python = ">=3.10" @@ -28,7 +28,7 @@ keywords = [ "ruview", ] classifiers = [ - "Development Status :: 3 - Alpha", + "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", @@ -43,13 +43,13 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - # Pin to the matching v2 release so an alpha-pin `pip install ruview` - # always gets a compatible wifi-densepose. - "wifi-densepose==2.0.0a1", + # Pin to the matching v2 release so `pip install ruview` always gets a + # compatible wifi-densepose. + "wifi-densepose==2.0.0", ] [project.optional-dependencies] -client = ["wifi-densepose[client]==2.0.0a1"] +client = ["wifi-densepose[client]==2.0.0"] [project.urls] Homepage = "https://github.com/ruvnet/RuView" diff --git a/python/src/bindings/aether.rs b/python/src/bindings/aether.rs new file mode 100644 index 00000000..149951c9 --- /dev/null +++ b/python/src/bindings/aether.rs @@ -0,0 +1,317 @@ +//! ADR-185 P1 — PyO3 bindings for AETHER contrastive CSI embeddings. +//! +//! Surfaces the **pure-sync** contrastive-embedding compute from +//! `wifi-densepose-aether::embedding` (ADR-024; the std-only leaf hoisted per +//! ADR-185 §13) into `wifi_densepose.aether`: +//! +//! - `AetherConfig` — wraps `EmbeddingConfig` (d_model / d_proj / +//! temperature / normalize) +//! - `CsiAugmenter` — SimCLR-style augmentation pair generator +//! - `EmbeddingExtractor`— backbone + projection → 128-dim L2-normed embedding +//! - `info_nce_loss` — NT-Xent contrastive loss (module function) +//! - `cosine_similarity` — re-ID similarity helper (module function) +//! +//! ## Honest scope vs ADR-185 §3.2 +//! +//! ADR-185 §3.2 names an aspirational surface (`aether_loss` returning +//! VICReg components, `alignment_metric`, `uniformity_metric`, +//! `forward_dual`, an `AetherConfig` with `vicreg_*` fields). Those do +//! **not** exist in the backing crate at HEAD — `embedding.rs` exposes +//! `EmbeddingConfig { d_model, d_proj, temperature, normalize }`, +//! `info_nce_loss` (plain `f32`), `CsiAugmenter::augment_pair`, and +//! `EmbeddingExtractor::extract`. This binding surfaces **what actually +//! exists** rather than fabricating the ADR's wished-for API. The +//! VICReg loss / metric surface is a Rust-side gap, not a binding gap. +//! +//! ## GIL release strategy (per ADR-117 §7, matching bindings/vitals.rs) +//! +//! `extract`, `augment_pair`, and `info_nce_loss` are pure-sync matrix +//! ops touching no Python objects, so they run inside +//! `py.allow_threads(|| ...)`. + +use pyo3::exceptions::PyValueError; +use pyo3::prelude::*; + +use wifi_densepose_aether::embedding::{ + info_nce_loss as rust_info_nce_loss, CsiAugmenter, EmbeddingConfig, EmbeddingExtractor, +}; +use wifi_densepose_aether::graph_transformer::TransformerConfig; + +/// Upper bound on model/CSI dimensions accepted from Python. The transformer +/// allocates weight matrices quadratic in these, so this caps a single +/// construction well under a gigabyte and turns an accidental or malicious +/// `d_model=100_000` into a `ValueError` instead of an allocation that aborts +/// the interpreter. Generous relative to real configs (defaults 64/128); raise +/// deliberately if a workload genuinely needs larger. +const MAX_DIM: usize = 4096; +/// Upper bound on GNN layer count — a sanity cap, not a modelling limit. +const MAX_LAYERS: usize = 64; + +// ─── AetherConfig ──────────────────────────────────────────────────── + +/// Configuration for the contrastive embedding model. +/// +/// Python: +/// ```python +/// from wifi_densepose.aether import AetherConfig +/// cfg = AetherConfig(d_model=64, d_proj=128, temperature=0.07, normalize=True) +/// ``` +#[pyclass(frozen, name = "AetherConfig")] +#[derive(Clone)] +pub struct PyAetherConfig { + inner: EmbeddingConfig, +} + +#[pymethods] +impl PyAetherConfig { + #[new] + #[pyo3(signature = (d_model=64, d_proj=128, temperature=0.07, normalize=true))] + fn new(d_model: usize, d_proj: usize, temperature: f32, normalize: bool) -> PyResult { + // Validate at the boundary and raise ValueError. The native constructor + // allocates weight matrices quadratic in these dims and (elsewhere) + // divides by them, so zero or absurd values would otherwise reach Rust + // as a panic (surfacing to Python as an opaque PanicException) or a + // multi-gigabyte allocation that aborts the interpreter. + if d_model == 0 || d_proj == 0 { + return Err(PyValueError::new_err( + "d_model and d_proj must be positive", + )); + } + if d_model > MAX_DIM || d_proj > MAX_DIM { + return Err(PyValueError::new_err(format!( + "d_model ({d_model}) and d_proj ({d_proj}) must be <= {MAX_DIM}" + ))); + } + Ok(Self { + inner: EmbeddingConfig { + d_model, + d_proj, + temperature, + normalize, + }, + }) + } + + #[getter] + fn d_model(&self) -> usize { + self.inner.d_model + } + + #[getter] + fn d_proj(&self) -> usize { + self.inner.d_proj + } + + #[getter] + fn temperature(&self) -> f32 { + self.inner.temperature + } + + #[getter] + fn normalize(&self) -> bool { + self.inner.normalize + } + + fn __repr__(&self) -> String { + format!( + "AetherConfig(d_model={}, d_proj={}, temperature={}, normalize={})", + self.inner.d_model, self.inner.d_proj, self.inner.temperature, self.inner.normalize, + ) + } +} + +// ─── CsiAugmenter ──────────────────────────────────────────────────── + +/// SimCLR-style CSI augmentation. `augment_pair` returns two distinct +/// augmented views of the same CSI window for contrastive pretraining. +/// +/// Python: +/// ```python +/// from wifi_densepose.aether import CsiAugmenter +/// aug = CsiAugmenter() +/// view_a, view_b = aug.augment_pair(window, seed=42) +/// ``` +#[pyclass(name = "CsiAugmenter")] +pub struct PyCsiAugmenter { + inner: CsiAugmenter, +} + +#[pymethods] +impl PyCsiAugmenter { + #[new] + fn new() -> Self { + Self { + inner: CsiAugmenter::new(), + } + } + + /// Produce two augmented views `(view_a, view_b)` of `window` + /// (frames × subcarriers) using the deterministic `seed`. GIL is + /// released during augmentation. + fn augment_pair( + &self, + py: Python<'_>, + window: Vec>, + seed: u64, + ) -> (Vec>, Vec>) { + py.allow_threads(|| self.inner.augment_pair(&window, seed)) + } + + fn __repr__(&self) -> String { + "CsiAugmenter(SimCLR-style CSI augmentation)".to_string() + } +} + +// ─── EmbeddingExtractor ────────────────────────────────────────────── + +/// Full AETHER embedding extractor: CSI→pose transformer backbone + +/// projection head → a `d_proj`-dim (default 128) L2-normalized +/// embedding. Weights are deterministically seeded, so `embed` is a +/// pure function of its input for a fixed config. +/// +/// Python: +/// ```python +/// from wifi_densepose.aether import AetherConfig, EmbeddingExtractor +/// ext = EmbeddingExtractor(n_subcarriers=56, config=AetherConfig()) +/// emb = ext.embed(window) # list[float], len == config.d_proj +/// ``` +#[pyclass(name = "EmbeddingExtractor")] +pub struct PyEmbeddingExtractor { + inner: EmbeddingExtractor, + embedding_dim: usize, +} + +#[pymethods] +impl PyEmbeddingExtractor { + /// Construct an extractor. The transformer backbone is sized from + /// `n_subcarriers` and `config.d_model`; `config.d_proj` sets the + /// embedding dimension. + #[new] + #[pyo3(signature = (n_subcarriers, config, n_keypoints=17, n_heads=4, n_gnn_layers=2))] + fn new( + n_subcarriers: usize, + config: PyAetherConfig, + n_keypoints: usize, + n_heads: usize, + n_gnn_layers: usize, + ) -> PyResult { + let e_config = config.inner.clone(); + // n_heads == 0 reaches `d_model % n_heads` in the transformer and panics + // (divide-by-zero); a non-divisor trips the native `assert!`. Both would + // surface to Python as a PanicException. Reject cleanly instead. + if n_heads == 0 { + return Err(PyValueError::new_err("n_heads must be positive")); + } + if e_config.d_model % n_heads != 0 { + return Err(PyValueError::new_err(format!( + "d_model ({}) must be divisible by n_heads ({n_heads})", + e_config.d_model + ))); + } + if n_subcarriers == 0 || n_keypoints == 0 { + return Err(PyValueError::new_err( + "n_subcarriers and n_keypoints must be positive", + )); + } + if n_subcarriers > MAX_DIM || n_keypoints > MAX_DIM || n_gnn_layers > MAX_LAYERS { + return Err(PyValueError::new_err(format!( + "n_subcarriers/n_keypoints must be <= {MAX_DIM} and n_gnn_layers <= {MAX_LAYERS}" + ))); + } + let t_config = TransformerConfig { + n_subcarriers, + n_keypoints, + d_model: e_config.d_model, + n_heads, + n_gnn_layers, + }; + let embedding_dim = e_config.d_proj; + Ok(Self { + inner: EmbeddingExtractor::new(t_config, e_config), + embedding_dim, + }) + } + + /// Extract an embedding from a CSI window (frames × subcarriers). + /// Returns a `d_proj`-length vector (L2-normed when the config's + /// `normalize` is set). GIL released during the forward pass. + fn embed(&mut self, py: Python<'_>, csi_features: Vec>) -> Vec { + py.allow_threads(|| self.inner.extract(&csi_features)) + } + + #[getter] + fn embedding_dim(&self) -> usize { + self.embedding_dim + } + + /// Total trainable parameter count (transformer + projection). Equals the + /// number of `f32`s in a weight file for this architecture. + #[getter] + fn param_count(&self) -> usize { + self.inner.param_count() + } + + /// Load weights from `path` (a file written by `save_weights` or the Rust + /// `EmbeddingExtractor::save_weights`), replacing the current weights. + /// + /// By default an `EmbeddingExtractor` uses deterministic **random** init + /// (untrained); this is the additive path to load real weights once a + /// trained checkpoint exists (ADR-185 §13.a). Raises `ValueError` on a + /// missing/corrupt file or a param-count mismatch with this architecture. + /// GIL released during file I/O + deserialization. + fn load_weights(&mut self, py: Python<'_>, path: String) -> PyResult<()> { + py.allow_threads(|| self.inner.load_weights(&path)) + .map_err(PyValueError::new_err) + } + + /// Serialize the current weights to `path` (magic `AETHERW1` + `u32` count + /// + little-endian `f32` payload). GIL released. + fn save_weights(&self, py: Python<'_>, path: String) -> PyResult<()> { + py.allow_threads(|| self.inner.save_weights(&path)) + .map_err(|e| PyValueError::new_err(e.to_string())) + } + + fn __repr__(&self) -> String { + format!("EmbeddingExtractor(embedding_dim={})", self.embedding_dim) + } +} + +// ─── Module functions ──────────────────────────────────────────────── + +/// InfoNCE (NT-Xent) contrastive loss between two batches of embeddings. +/// Delegates to the identical Rust implementation. GIL released. +#[pyfunction] +#[pyo3(signature = (embeddings_a, embeddings_b, temperature=0.07))] +fn info_nce_loss( + py: Python<'_>, + embeddings_a: Vec>, + embeddings_b: Vec>, + temperature: f32, +) -> f32 { + py.allow_threads(|| rust_info_nce_loss(&embeddings_a, &embeddings_b, temperature)) +} + +/// Cosine similarity between two embeddings — the re-ID scoring +/// primitive. Byte-identical to the private `cosine_similarity` in the +/// backing crate (same dot-product / norm formula, `f32`). +#[pyfunction] +fn cosine_similarity(a: Vec, b: Vec) -> f32 { + let n = a.len().min(b.len()); + let dot: f32 = (0..n).map(|i| a[i] * b[i]).sum(); + let na = (0..n).map(|i| a[i] * a[i]).sum::().sqrt(); + let nb = (0..n).map(|i| b[i] * b[i]).sum::().sqrt(); + if na > 1e-10 && nb > 1e-10 { + dot / (na * nb) + } else { + 0.0 + } +} + +pub fn register(m: &Bound<'_, PyModule>) -> PyResult<()> { + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_function(wrap_pyfunction!(info_nce_loss, m)?)?; + m.add_function(wrap_pyfunction!(cosine_similarity, m)?)?; + Ok(()) +} diff --git a/python/src/bindings/mat.rs b/python/src/bindings/mat.rs new file mode 100644 index 00000000..ae6d77d8 --- /dev/null +++ b/python/src/bindings/mat.rs @@ -0,0 +1,433 @@ +//! ADR-185 P3 — PyO3 bindings for MAT (Mass Casualty Assessment Tool, ADR-024 +//! crate table): WiFi-based disaster-survivor detection + START triage. +//! +//! Bound behind the `[mat]` extra so the disaster/ML stack never enters the +//! default wheel. +//! +//! ## Honest scope vs ADR-185 §3.4 +//! +//! - **`scan_once()`** — ADR-185 §3.4/§11.3 proposed adding a sync +//! `scan_once()` wrapper Rust-side. That turned out to be unnecessary: the +//! public async `DisasterResponse::start_scanning()` runs **exactly one** +//! `scan_cycle` and returns when `continuous_monitoring == false`. So this +//! binding forces `continuous_monitoring = false` and drives one scan on a +//! private current-thread tokio runtime — no change to `wifi-densepose-mat`. +//! - **event + zone are required** — `scan_cycle` errors without an active +//! event and an Active zone. ADR-185 §3.4's surface omitted this; the real +//! pipeline needs `initialize_event(...)` + `add_zone(...)` first, so both +//! are bound (documented additions, not fabrications). +//! - **`Survivor.vital_signs`** — the ADR implies a single `VitalSignsReading`; +//! the real accessor returns a *history*. Bound here as +//! `Survivor.latest_vitals -> Optional[VitalSignsReading]`. +//! - **`DisasterType`** has 9 variants at HEAD (adds Landslide, MineCollapse, +//! Industrial, TunnelCollapse) vs the ADR's shorter list; all are bound. +//! +//! ## GIL release +//! +//! `push_csi_data` and `scan_once` release the GIL (`py.allow_threads`) — the +//! detection pipeline + ensemble classifier are the compute-heavy part and +//! touch no Python state. + +use pyo3::exceptions::PyValueError; +use pyo3::prelude::*; + +use wifi_densepose_mat::{ + DisasterConfig, DisasterResponse, DisasterType, ScanZone, Survivor, TriageStatus, + VitalSignsReading, ZoneBounds, +}; + +// ─── DisasterType ──────────────────────────────────────────────────── + +/// Type of disaster event (shapes the debris/attenuation model). +#[pyclass(eq, eq_int, frozen, hash, name = "DisasterType")] +#[derive(Clone, Copy, PartialEq, Eq, Hash)] +pub enum PyDisasterType { + BuildingCollapse = 0, + Earthquake = 1, + Landslide = 2, + Avalanche = 3, + Flood = 4, + MineCollapse = 5, + Industrial = 6, + TunnelCollapse = 7, + Unknown = 8, +} + +impl PyDisasterType { + fn as_rust(self) -> DisasterType { + match self { + Self::BuildingCollapse => DisasterType::BuildingCollapse, + Self::Earthquake => DisasterType::Earthquake, + Self::Landslide => DisasterType::Landslide, + Self::Avalanche => DisasterType::Avalanche, + Self::Flood => DisasterType::Flood, + Self::MineCollapse => DisasterType::MineCollapse, + Self::Industrial => DisasterType::Industrial, + Self::TunnelCollapse => DisasterType::TunnelCollapse, + Self::Unknown => DisasterType::Unknown, + } + } +} + +#[pymethods] +impl PyDisasterType { + fn __repr__(&self) -> String { + format!("DisasterType.{:?}", self.as_rust()) + } +} + +// ─── TriageStatus ──────────────────────────────────────────────────── + +/// START-protocol triage class. +#[pyclass(eq, eq_int, frozen, hash, name = "TriageStatus")] +#[derive(Clone, Copy, PartialEq, Eq, Hash)] +pub enum PyTriageStatus { + Immediate = 0, + Delayed = 1, + Minor = 2, + Deceased = 3, + Unknown = 4, +} + +impl PyTriageStatus { + fn as_rust(self) -> TriageStatus { + match self { + Self::Immediate => TriageStatus::Immediate, + Self::Delayed => TriageStatus::Delayed, + Self::Minor => TriageStatus::Minor, + Self::Deceased => TriageStatus::Deceased, + Self::Unknown => TriageStatus::Unknown, + } + } + fn from_rust(s: &TriageStatus) -> Self { + match s { + TriageStatus::Immediate => Self::Immediate, + TriageStatus::Delayed => Self::Delayed, + TriageStatus::Minor => Self::Minor, + TriageStatus::Deceased => Self::Deceased, + TriageStatus::Unknown => Self::Unknown, + } + } +} + +#[pymethods] +impl PyTriageStatus { + /// START priority (1 = highest / Immediate ... 5 = Unknown). + #[getter] + fn priority(&self) -> u8 { + self.as_rust().priority() + } + fn __repr__(&self) -> String { + format!("TriageStatus.{:?}", self.as_rust()) + } +} + +// ─── VitalSignsReading ─────────────────────────────────────────────── + +/// A single vital-signs reading (optional breathing/heartbeat + movement). +#[pyclass(frozen, name = "VitalSignsReading")] +pub struct PyVitalSignsReading { + breathing_rate_bpm: Option, + heartbeat_rate_bpm: Option, + movement_intensity: f32, + confidence: f64, +} + +impl PyVitalSignsReading { + fn from_rust(r: &VitalSignsReading) -> Self { + Self { + breathing_rate_bpm: r.breathing.as_ref().map(|b| b.rate_bpm), + heartbeat_rate_bpm: r.heartbeat.as_ref().map(|h| h.rate_bpm), + movement_intensity: r.movement.intensity, + confidence: r.confidence.value(), + } + } +} + +#[pymethods] +impl PyVitalSignsReading { + #[getter] + fn breathing_rate_bpm(&self) -> Option { + self.breathing_rate_bpm + } + #[getter] + fn heartbeat_rate_bpm(&self) -> Option { + self.heartbeat_rate_bpm + } + #[getter] + fn movement_intensity(&self) -> f32 { + self.movement_intensity + } + #[getter] + fn confidence(&self) -> f64 { + self.confidence + } + fn __repr__(&self) -> String { + format!( + "VitalSignsReading(breathing={:?}, heartbeat={:?}, movement={:.3}, confidence={:.3})", + self.breathing_rate_bpm, self.heartbeat_rate_bpm, self.movement_intensity, self.confidence, + ) + } +} + +// ─── Survivor ──────────────────────────────────────────────────────── + +/// A detected survivor: id, triage class, confidence, optional 3-D location, +/// and the latest vital-signs reading. +#[pyclass(frozen, name = "Survivor")] +pub struct PySurvivor { + id: String, + triage_status: PyTriageStatus, + confidence: f64, + location: Option<(f64, f64, f64)>, + latest_vitals: Option>, +} + +impl PySurvivor { + fn from_rust(py: Python<'_>, s: &Survivor) -> PyResult { + let latest_vitals = match s.vital_signs().latest() { + Some(r) => Some(Py::new(py, PyVitalSignsReading::from_rust(r))?), + None => None, + }; + Ok(Self { + id: s.id().as_uuid().to_string(), + triage_status: PyTriageStatus::from_rust(s.triage_status()), + confidence: s.confidence(), + location: s.location().map(|c| (c.x, c.y, c.z)), + latest_vitals, + }) + } +} + +#[pymethods] +impl PySurvivor { + #[getter] + fn id(&self) -> &str { + &self.id + } + #[getter] + fn triage_status(&self) -> PyTriageStatus { + self.triage_status + } + #[getter] + fn confidence(&self) -> f64 { + self.confidence + } + #[getter] + fn location(&self) -> Option<(f64, f64, f64)> { + self.location + } + #[getter] + fn latest_vitals(&self, py: Python<'_>) -> Option> { + self.latest_vitals.as_ref().map(|v| v.clone_ref(py)) + } + fn __repr__(&self) -> String { + format!( + "Survivor(id={}, triage={:?}, confidence={:.3})", + &self.id[..8.min(self.id.len())], + self.triage_status.as_rust(), + self.confidence, + ) + } +} + +// ─── DisasterConfig ────────────────────────────────────────────────── + +/// Configuration for the disaster-response pipeline. +/// +/// Note: the Python binding always runs **single-shot** scans (`scan_once`), +/// so `continuous_monitoring` is forced off internally. +#[pyclass(frozen, name = "DisasterConfig")] +#[derive(Clone)] +pub struct PyDisasterConfig { + inner: DisasterConfig, +} + +#[pymethods] +impl PyDisasterConfig { + #[new] + #[pyo3(signature = ( + disaster_type, + sensitivity=0.8, + confidence_threshold=0.5, + max_depth=5.0, + scan_interval_ms=500 + ))] + fn new( + disaster_type: PyDisasterType, + sensitivity: f64, + confidence_threshold: f64, + max_depth: f64, + scan_interval_ms: u64, + ) -> Self { + let inner = DisasterConfig::builder() + .disaster_type(disaster_type.as_rust()) + .sensitivity(sensitivity) + .confidence_threshold(confidence_threshold) + .max_depth(max_depth) + .scan_interval_ms(scan_interval_ms) + .continuous_monitoring(false) + .build(); + Self { inner } + } + + #[getter] + fn sensitivity(&self) -> f64 { + self.inner.sensitivity + } + #[getter] + fn confidence_threshold(&self) -> f64 { + self.inner.confidence_threshold + } + #[getter] + fn max_depth(&self) -> f64 { + self.inner.max_depth + } + + fn __repr__(&self) -> String { + format!( + "DisasterConfig(disaster_type={:?}, sensitivity={}, confidence_threshold={}, max_depth={})", + self.inner.disaster_type, + self.inner.sensitivity, + self.inner.confidence_threshold, + self.inner.max_depth, + ) + } +} + +// ─── ScanZone ──────────────────────────────────────────────────────── + +/// A rectangular or circular scan zone (new zones start Active). +#[pyclass(name = "ScanZone")] +#[derive(Clone)] +pub struct PyScanZone { + inner: ScanZone, +} + +#[pymethods] +impl PyScanZone { + /// Rectangular zone with corner bounds (metres). + #[staticmethod] + fn rectangle(name: &str, min_x: f64, min_y: f64, max_x: f64, max_y: f64) -> Self { + Self { + inner: ScanZone::new(name, ZoneBounds::rectangle(min_x, min_y, max_x, max_y)), + } + } + + /// Circular zone centred at `(center_x, center_y)` with `radius` (metres). + #[staticmethod] + fn circle(name: &str, center_x: f64, center_y: f64, radius: f64) -> Self { + Self { + inner: ScanZone::new(name, ZoneBounds::circle(center_x, center_y, radius)), + } + } + + #[getter] + fn name(&self) -> &str { + self.inner.name() + } + + fn __repr__(&self) -> String { + format!("ScanZone(name={:?})", self.inner.name()) + } +} + +// ─── DisasterResponse ──────────────────────────────────────────────── + +/// Main disaster-response coordinator: ingest CSI, run one scan cycle, query +/// detected survivors by START triage. +#[pyclass(name = "DisasterResponse")] +pub struct PyDisasterResponse { + inner: DisasterResponse, + rt: tokio::runtime::Runtime, +} + +#[pymethods] +impl PyDisasterResponse { + #[new] + fn new(config: PyDisasterConfig) -> PyResult { + let rt = tokio::runtime::Builder::new_current_thread() + .enable_time() + .build() + .map_err(|e| PyValueError::new_err(format!("failed to build tokio runtime: {e}")))?; + Ok(Self { + inner: DisasterResponse::new(config.inner), + rt, + }) + } + + /// Initialize the active disaster event at map coordinate `(x, y)`. + /// Required before `add_zone`/`scan_once`. + fn initialize_event(&mut self, x: f64, y: f64, description: &str) -> PyResult<()> { + self.inner + .initialize_event(geo::Point::new(x, y), description) + .map(|_| ()) + .map_err(|e| PyValueError::new_err(e.to_string())) + } + + /// Add an (Active) scan zone to the current event. Raises if no event. + fn add_zone(&mut self, zone: PyScanZone) -> PyResult<()> { + self.inner + .add_zone(zone.inner) + .map_err(|e| PyValueError::new_err(e.to_string())) + } + + /// Push a raw CSI frame (equal-length `amplitudes`/`phases`) into the + /// detection pipeline. Raises on empty/mismatched input. GIL released. + fn push_csi_data( + &self, + py: Python<'_>, + amplitudes: Vec, + phases: Vec, + ) -> PyResult<()> { + py.allow_threads(|| self.inner.push_csi_data(&litudes, &phases)) + .map_err(|e| PyValueError::new_err(e.to_string())) + } + + /// Run exactly one scan cycle over the buffered CSI (detection → ensemble + /// → localization → triage). Requires an initialized event with an Active + /// zone. GIL released during the scan. + fn scan_once(&mut self, py: Python<'_>) -> PyResult<()> { + let rt = &self.rt; + let inner = &mut self.inner; + py.allow_threads(|| rt.block_on(inner.start_scanning())) + .map_err(|e| PyValueError::new_err(e.to_string())) + } + + /// All detected survivors. + fn survivors(&self, py: Python<'_>) -> PyResult> { + self.inner + .survivors() + .into_iter() + .map(|s| PySurvivor::from_rust(py, s)) + .collect() + } + + /// Survivors filtered by START triage class. + fn survivors_by_triage( + &self, + py: Python<'_>, + status: PyTriageStatus, + ) -> PyResult> { + self.inner + .survivors_by_triage(status.as_rust()) + .into_iter() + .map(|s| PySurvivor::from_rust(py, s)) + .collect() + } + + fn __repr__(&self) -> String { + "DisasterResponse()".to_string() + } +} + +pub fn register(m: &Bound<'_, PyModule>) -> PyResult<()> { + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + Ok(()) +} diff --git a/python/src/bindings/meridian.rs b/python/src/bindings/meridian.rs new file mode 100644 index 00000000..b2a5d093 --- /dev/null +++ b/python/src/bindings/meridian.rs @@ -0,0 +1,492 @@ +//! ADR-185 P2 — PyO3 bindings for MERIDIAN cross-environment domain +//! generalization (ADR-027). +//! +//! Surfaces the **pure-sync, tch-free** inference/adaptation path into +//! `wifi_densepose.meridian`: +//! +//! - `HardwareType` / `HardwareNormalizer` / `CanonicalCsiFrame` +//! (from `wifi-densepose-signal::hardware_norm`) +//! - `MeridianGeometryConfig` / `GeometryEncoder` +//! - `RapidAdaptation` / `AdaptationResult` +//! - `CrossDomainEvaluator` + `mpjpe` +//! (from `wifi-densepose-train`, NO `tch-backend`) +//! +//! ## Honest scope vs ADR-185 §3.3 +//! +//! ADR-185 §3.3 names a surface that partly diverges from the code at HEAD; +//! this binding tracks the **real** API and documents each deviation: +//! +//! - `HardwareType.detect(subcarrier_count)` — the real detector is the +//! static `HardwareNormalizer::detect_hardware`; exposed here as a +//! `HardwareType.detect` staticmethod delegating to it (no reimpl). +//! - `HardwareNormalizer.normalize(frame: CsiFrame, hw)` — the real method +//! takes raw `(amplitude, phase)` f64 vectors and returns a `Result`, so +//! it is bound as `normalize(amplitude, phase, hw)` (raises on error). +//! - `CanonicalCsiFrame.amplitudes/.phases` — the real fields are singular +//! `amplitude`/`phase`; bound under their real names. +//! - `RapidAdaptation.calibrate(csi_windows) -> AdaptationResult` with a +//! `converged` field — **does not exist**. The real engine is +//! `push_frame` + `adapt()`, and `AdaptationResult` carries +//! `{lora_weights, final_loss, frames_used, adaptation_epochs}` (no +//! `converged`). Bound as-is; the `calibrate`/`converged` surface is a +//! Rust-side gap, not fabricated here. +//! +//! Training-time types (`DomainFactorizer`, `GradientReversalLayer`, +//! `VirtualDomainAugmentor`) are out of P6 scope (ADR-185 §3.3 / Open Q +//! §11.2) — inference/adaptation only. +//! +//! ## GIL release (per ADR-117 §7, matching bindings/vitals.rs) +//! +//! `normalize`, `encode`, `adapt`, and `evaluate` are pure-sync numeric +//! ops touching no Python objects, so they run inside `py.allow_threads`. + +use std::collections::HashMap; + +use pyo3::exceptions::PyValueError; +use pyo3::prelude::*; + +use wifi_densepose_signal::hardware_norm::{ + CanonicalCsiFrame, HardwareNormalizer, HardwareType, +}; +use wifi_densepose_train::eval::{mpjpe as rust_mpjpe, CrossDomainEvaluator}; +use wifi_densepose_train::geometry::{GeometryEncoder, MeridianGeometryConfig}; +use wifi_densepose_train::rapid_adapt::{AdaptationLoss, AdaptationResult, RapidAdaptation}; + +// ─── HardwareType ──────────────────────────────────────────────────── + +/// WiFi chipset family, keyed by subcarrier count. +#[pyclass(eq, eq_int, frozen, hash, name = "HardwareType")] +#[derive(Clone, Copy, PartialEq, Eq, Hash)] +pub enum PyHardwareType { + Esp32S3 = 0, + Intel5300 = 1, + Atheros = 2, + Generic = 3, +} + +impl PyHardwareType { + fn as_rust(self) -> HardwareType { + match self { + Self::Esp32S3 => HardwareType::Esp32S3, + Self::Intel5300 => HardwareType::Intel5300, + Self::Atheros => HardwareType::Atheros, + Self::Generic => HardwareType::Generic, + } + } + fn from_rust(hw: HardwareType) -> Self { + match hw { + HardwareType::Esp32S3 => Self::Esp32S3, + HardwareType::Intel5300 => Self::Intel5300, + HardwareType::Atheros => Self::Atheros, + HardwareType::Generic => Self::Generic, + } + } +} + +#[pymethods] +impl PyHardwareType { + /// Detect hardware from subcarrier count (64→Esp32S3, 30→Intel5300, + /// 56→Atheros, else Generic). Delegates to the real + /// `HardwareNormalizer::detect_hardware`. + #[staticmethod] + fn detect(subcarrier_count: usize) -> Self { + Self::from_rust(HardwareNormalizer::detect_hardware(subcarrier_count)) + } + + #[getter] + fn subcarrier_count(&self) -> usize { + self.as_rust().subcarrier_count() + } + + #[getter] + fn mimo_streams(&self) -> usize { + self.as_rust().mimo_streams() + } + + fn __repr__(&self) -> String { + format!("HardwareType.{:?}", self.as_rust()) + } +} + +// ─── CanonicalCsiFrame ─────────────────────────────────────────────── + +/// A CSI frame canonicalized to the normalizer's subcarrier grid +/// (default 56): z-scored amplitude + sanitized (unwrapped, detrended) +/// phase. +#[pyclass(frozen, name = "CanonicalCsiFrame")] +pub struct PyCanonicalCsiFrame { + inner: CanonicalCsiFrame, +} + +#[pymethods] +impl PyCanonicalCsiFrame { + #[getter] + fn amplitude(&self) -> Vec { + self.inner.amplitude.clone() + } + + #[getter] + fn phase(&self) -> Vec { + self.inner.phase.clone() + } + + #[getter] + fn hardware_type(&self) -> PyHardwareType { + PyHardwareType::from_rust(self.inner.hardware_type) + } + + fn __repr__(&self) -> String { + format!( + "CanonicalCsiFrame(subcarriers={}, hardware_type={:?})", + self.inner.amplitude.len(), + self.inner.hardware_type, + ) + } +} + +// ─── HardwareNormalizer ────────────────────────────────────────────── + +/// Normalizes CSI frames from heterogeneous chipsets into a canonical +/// representation (cubic resample → z-score amplitude → sanitize phase). +#[pyclass(name = "HardwareNormalizer")] +pub struct PyHardwareNormalizer { + inner: HardwareNormalizer, +} + +#[pymethods] +impl PyHardwareNormalizer { + /// Create a normalizer. `canonical_subcarriers` defaults to 56. + #[new] + #[pyo3(signature = (canonical_subcarriers=56))] + fn new(canonical_subcarriers: usize) -> PyResult { + HardwareNormalizer::with_canonical_subcarriers(canonical_subcarriers) + .map(|inner| Self { inner }) + .map_err(|e| PyValueError::new_err(e.to_string())) + } + + /// Detect hardware from subcarrier count (static). + #[staticmethod] + fn detect_hardware(subcarrier_count: usize) -> PyHardwareType { + PyHardwareType::from_rust(HardwareNormalizer::detect_hardware(subcarrier_count)) + } + + #[getter] + fn canonical_subcarriers(&self) -> usize { + self.inner.canonical_subcarriers() + } + + /// Normalize a raw CSI frame given per-subcarrier `amplitude` and + /// `phase` (equal length) and its `hardware` type. Raises + /// `ValueError` on empty/mismatched input. GIL released. + fn normalize( + &self, + py: Python<'_>, + amplitude: Vec, + phase: Vec, + hardware: PyHardwareType, + ) -> PyResult { + let hw = hardware.as_rust(); + py.allow_threads(|| self.inner.normalize(&litude, &phase, hw)) + .map(|inner| PyCanonicalCsiFrame { inner }) + .map_err(|e| PyValueError::new_err(e.to_string())) + } + + fn __repr__(&self) -> String { + format!( + "HardwareNormalizer(canonical_subcarriers={})", + self.inner.canonical_subcarriers() + ) + } +} + +// ─── MeridianGeometryConfig ────────────────────────────────────────── + +/// Config for the geometry encoder (Fourier bands + DeepSets output dim). +#[pyclass(frozen, name = "MeridianGeometryConfig")] +#[derive(Clone)] +pub struct PyMeridianGeometryConfig { + inner: MeridianGeometryConfig, +} + +#[pymethods] +impl PyMeridianGeometryConfig { + #[new] + #[pyo3(signature = (n_frequencies=10, scale=1.0, geometry_dim=64, seed=42))] + fn new(n_frequencies: usize, scale: f32, geometry_dim: usize, seed: u64) -> Self { + Self { + inner: MeridianGeometryConfig { + n_frequencies, + scale, + geometry_dim, + seed, + }, + } + } + + #[getter] + fn n_frequencies(&self) -> usize { + self.inner.n_frequencies + } + #[getter] + fn scale(&self) -> f32 { + self.inner.scale + } + #[getter] + fn geometry_dim(&self) -> usize { + self.inner.geometry_dim + } + #[getter] + fn seed(&self) -> u64 { + self.inner.seed + } + + fn __repr__(&self) -> String { + format!( + "MeridianGeometryConfig(n_frequencies={}, scale={}, geometry_dim={}, seed={})", + self.inner.n_frequencies, self.inner.scale, self.inner.geometry_dim, self.inner.seed, + ) + } +} + +// ─── GeometryEncoder ───────────────────────────────────────────────── + +/// Permutation-invariant encoder: variable-count AP positions `[x,y,z]` +/// → a fixed `geometry_dim` (default 64) vector. +#[pyclass(name = "GeometryEncoder")] +pub struct PyGeometryEncoder { + inner: GeometryEncoder, + geometry_dim: usize, +} + +#[pymethods] +impl PyGeometryEncoder { + #[new] + #[pyo3(signature = (config=None))] + fn new(config: Option) -> Self { + let cfg = config.map(|c| c.inner).unwrap_or_default(); + let geometry_dim = cfg.geometry_dim; + Self { + inner: GeometryEncoder::new(&cfg), + geometry_dim, + } + } + + /// Encode AP positions (a non-empty list of `[x, y, z]`) into a + /// `geometry_dim`-length vector. Raises `ValueError` if the list is + /// empty or any position is not exactly 3 coordinates. GIL released. + fn encode(&self, py: Python<'_>, ap_positions: Vec>) -> PyResult> { + if ap_positions.is_empty() { + return Err(PyValueError::new_err( + "ap_positions must contain at least one [x, y, z] position", + )); + } + let mut coords: Vec<[f32; 3]> = Vec::with_capacity(ap_positions.len()); + for (i, p) in ap_positions.iter().enumerate() { + if p.len() != 3 { + return Err(PyValueError::new_err(format!( + "ap_positions[{i}] must have exactly 3 coordinates, got {}", + p.len() + ))); + } + coords.push([p[0], p[1], p[2]]); + } + Ok(py.allow_threads(|| self.inner.encode(&coords))) + } + + #[getter] + fn geometry_dim(&self) -> usize { + self.geometry_dim + } + + fn __repr__(&self) -> String { + format!("GeometryEncoder(geometry_dim={})", self.geometry_dim) + } +} + +// ─── RapidAdaptation / AdaptationResult ────────────────────────────── + +/// Result of `RapidAdaptation.adapt()`. +#[pyclass(frozen, name = "AdaptationResult")] +pub struct PyAdaptationResult { + inner: AdaptationResult, +} + +#[pymethods] +impl PyAdaptationResult { + #[getter] + fn lora_weights(&self) -> Vec { + self.inner.lora_weights.clone() + } + #[getter] + fn final_loss(&self) -> f32 { + self.inner.final_loss + } + #[getter] + fn frames_used(&self) -> usize { + self.inner.frames_used + } + #[getter] + fn adaptation_epochs(&self) -> usize { + self.inner.adaptation_epochs + } + + fn __repr__(&self) -> String { + format!( + "AdaptationResult(final_loss={:.6}, frames_used={}, adaptation_epochs={})", + self.inner.final_loss, self.inner.frames_used, self.inner.adaptation_epochs, + ) + } +} + +/// Few-shot test-time adaptation: accumulate unlabeled CSI frames, then +/// `adapt()` to produce LoRA weight deltas that minimize a self-supervised +/// proxy loss. +/// +/// Scope caveat (from the Rust module, kept honest): this minimizes a +/// self-supervised proxy over a tiny LoRA bottleneck; it is NOT wired to +/// the pose model and there is no measured end-to-end PCK gain from this +/// path — do not cite a PCK improvement from `adapt()`. +#[pyclass(name = "RapidAdaptation")] +pub struct PyRapidAdaptation { + inner: RapidAdaptation, +} + +#[pymethods] +impl PyRapidAdaptation { + /// Build an adaptation engine. `loss_kind` is one of + /// `"contrastive"`, `"entropy"`, `"combined"` (default). `lambda_ent` + /// is used only by `"combined"`. + #[new] + #[pyo3(signature = ( + min_calibration_frames, + lora_rank, + loss_kind="combined", + epochs=5, + lr=0.001, + lambda_ent=0.5 + ))] + fn new( + min_calibration_frames: usize, + lora_rank: usize, + loss_kind: &str, + epochs: usize, + lr: f32, + lambda_ent: f32, + ) -> PyResult { + let loss = match loss_kind { + "contrastive" => AdaptationLoss::ContrastiveTTT { epochs, lr }, + "entropy" => AdaptationLoss::EntropyMin { epochs, lr }, + "combined" => AdaptationLoss::Combined { + epochs, + lr, + lambda_ent, + }, + other => { + return Err(PyValueError::new_err(format!( + "unknown loss_kind '{other}'; expected 'contrastive', 'entropy', or 'combined'" + ))) + } + }; + Ok(Self { + inner: RapidAdaptation::new(min_calibration_frames, lora_rank, loss), + }) + } + + /// Push a single unlabeled CSI frame into the calibration buffer. + fn push_frame(&mut self, frame: Vec) { + self.inner.push_frame(&frame); + } + + /// True once at least `min_calibration_frames` have been buffered. + fn is_ready(&self) -> bool { + self.inner.is_ready() + } + + #[getter] + fn buffer_len(&self) -> usize { + self.inner.buffer_len() + } + + /// Run test-time adaptation over the buffered frames. Raises + /// `ValueError` if the buffer is empty or `lora_rank == 0`. GIL + /// released during the finite-difference optimization. + fn adapt(&self, py: Python<'_>) -> PyResult { + py.allow_threads(|| self.inner.adapt()) + .map(|inner| PyAdaptationResult { inner }) + .map_err(|e| PyValueError::new_err(e.to_string())) + } + + fn __repr__(&self) -> String { + format!("RapidAdaptation(buffered={})", self.inner.buffer_len()) + } +} + +// ─── CrossDomainEvaluator ──────────────────────────────────────────── + +/// Cross-domain pose-accuracy evaluator (MPJPE + domain-gap ratio). +#[pyclass(name = "CrossDomainEvaluator")] +pub struct PyCrossDomainEvaluator { + inner: CrossDomainEvaluator, +} + +#[pymethods] +impl PyCrossDomainEvaluator { + /// Create an evaluator for `n_joints` (e.g. 17 for COCO). + #[new] + fn new(n_joints: usize) -> Self { + Self { + inner: CrossDomainEvaluator::new(n_joints), + } + } + + /// Evaluate `predictions` (a list of `(pred, gt)` flat `n_joints*3` + /// vectors) grouped by `domain_labels` (0 = in-domain). Returns a + /// dict of the six cross-domain metrics. Raises `ValueError` on a + /// length mismatch. GIL released. + fn evaluate( + &self, + py: Python<'_>, + predictions: Vec<(Vec, Vec)>, + domain_labels: Vec, + ) -> PyResult> { + if predictions.len() != domain_labels.len() { + return Err(PyValueError::new_err(format!( + "predictions ({}) and domain_labels ({}) must have equal length", + predictions.len(), + domain_labels.len() + ))); + } + let m = py.allow_threads(|| self.inner.evaluate(&predictions, &domain_labels)); + let mut out = HashMap::with_capacity(6); + out.insert("in_domain_mpjpe".to_string(), m.in_domain_mpjpe); + out.insert("cross_domain_mpjpe".to_string(), m.cross_domain_mpjpe); + out.insert("few_shot_mpjpe".to_string(), m.few_shot_mpjpe); + out.insert("cross_hardware_mpjpe".to_string(), m.cross_hardware_mpjpe); + out.insert("domain_gap_ratio".to_string(), m.domain_gap_ratio); + out.insert("adaptation_speedup".to_string(), m.adaptation_speedup); + Ok(out) + } + + fn __repr__(&self) -> String { + "CrossDomainEvaluator()".to_string() + } +} + +/// Mean Per Joint Position Error between flat `[n_joints*3]` pose vectors. +#[pyfunction] +fn mpjpe(pred: Vec, gt: Vec, n_joints: usize) -> f32 { + rust_mpjpe(&pred, >, n_joints) +} + +pub fn register(m: &Bound<'_, PyModule>) -> PyResult<()> { + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_function(wrap_pyfunction!(mpjpe, m)?)?; + Ok(()) +} diff --git a/python/src/lib.rs b/python/src/lib.rs index b30faf75..8428c4be 100644 --- a/python/src/lib.rs +++ b/python/src/lib.rs @@ -17,7 +17,13 @@ use pyo3::prelude::*; mod bindings { + #[cfg(feature = "aether")] + pub mod aether; pub mod bfld; + #[cfg(feature = "mat")] + pub mod mat; + #[cfg(feature = "meridian")] + pub mod meridian; pub mod keypoint; pub mod pose; pub mod privacy_gate; @@ -43,6 +49,12 @@ fn build_features() -> Vec<&'static str> { feats.push("p2-pose-bindings"); // BoundingBox + PersonPose + PoseEstimate feats.push("p3-vitals-bindings"); // BreathingExtractor + HeartRateExtractor + VitalEstimate feats.push("p3.5-bfld-bindings"); // BfldFrame + BfldReport + BfldKind (stub Rust) + #[cfg(feature = "aether")] + feats.push("p6-aether-bindings"); // ADR-185 P1 — AETHER contrastive embeddings + #[cfg(feature = "meridian")] + feats.push("p6-meridian-bindings"); // ADR-185 P2 — MERIDIAN domain generalization + #[cfg(feature = "mat")] + feats.push("p6-mat-bindings"); // ADR-185 P3 — MAT disaster survivor detection feats } @@ -85,5 +97,23 @@ fn wifi_densepose_native(m: &Bound<'_, PyModule>) -> PyResult<()> { // the published `wifi-densepose-bfld 0.3.0` crate, not the Python port). // Closes ADR-125 §2.1.d at the binding boundary. bindings::privacy_gate::register(m)?; + + // ADR-185 P1 — AETHER contrastive CSI embedding bindings, compiled + // and registered only under the `aether` feature so the default + // wheel links none of the sensing-server dependency tree. + #[cfg(feature = "aether")] + bindings::aether::register(m)?; + + // ADR-185 P2 — MERIDIAN cross-environment domain-generalization + // bindings (hardware normalization, geometry encoding, rapid + // adaptation, cross-domain eval). Gated behind `meridian`; tch-free. + #[cfg(feature = "meridian")] + bindings::meridian::register(m)?; + + // ADR-185 P3 — MAT disaster-survivor detection + START triage. Gated + // behind `mat`, mirroring the upstream disaster/ML stack gating. + #[cfg(feature = "mat")] + bindings::mat::register(m)?; + Ok(()) } diff --git a/python/tests/aether_parity.rs b/python/tests/aether_parity.rs new file mode 100644 index 00000000..75c78246 --- /dev/null +++ b/python/tests/aether_parity.rs @@ -0,0 +1,111 @@ +//! ADR-185 §4.1 — AETHER parity: native-Rust reference half. +//! +//! Produces the golden 128-dim embedding by calling the canonical +//! `wifi-densepose-aether::embedding` code DIRECTLY (no PyO3), for the +//! committed `tests/golden/aether_input.json` fixture, and compares it to the +//! committed golden VECTOR `tests/golden/aether_embedding.json` within a +//! numerical tolerance. +//! +//! Why a vector + tolerance and not a SHA-256 of the f32 bytes: the embedding +//! is pure f32 and uses transcendental ops (ln/sqrt/cos), which are not +//! bit-reproducible across CPU architectures or libm implementations. A byte +//! hash only ever matched the one arch that generated it and failed on every +//! other wheel this project builds (aarch64, macOS-arm). The pytest half +//! (`tests/test_aether.py`) compares the Python binding to the SAME golden +//! within the same tolerance — native≈golden and binding≈golden together prove +//! binding≈native, portably. +//! +//! Regeneration (only when the Rust subsystem intentionally changes): delete +//! `tests/golden/aether_embedding.json` and re-run `cargo test --features aether`. +#![cfg(feature = "aether")] + +use std::fs; +use std::path::PathBuf; + +use wifi_densepose_aether::embedding::{EmbeddingConfig, EmbeddingExtractor}; +use wifi_densepose_aether::graph_transformer::TransformerConfig; + +/// Cross-architecture f32 parity tolerance; see the module docs and the +/// matching `PARITY_ATOL`/`PARITY_RTOL` in `tests/test_aether.py`. +const PARITY_ATOL: f32 = 1e-4; +const PARITY_RTOL: f32 = 1e-4; + +/// Assert `embedding` matches the committed golden vector `` within +/// tolerance, or (if the golden is absent) write it and fail asking for a re-run. +fn assert_matches_golden_vector(embedding: &[f32], name: &str) { + let path = golden_dir().join(name); + match fs::read_to_string(&path) { + Ok(raw) => { + let golden: Vec = serde_json::from_str(&raw) + .expect("parse golden vector json"); + assert_eq!(embedding.len(), golden.len(), "{name}: length mismatch"); + for (i, (&got, &want)) in embedding.iter().zip(&golden).enumerate() { + let tol = PARITY_ATOL + PARITY_RTOL * want.abs(); + assert!( + (got - want).abs() <= tol, + "{name}: element {i} diverged beyond tolerance \ + (got {got}, golden {want}, |Δ|={}) — a real regression, \ + not cross-arch f32 drift", + (got - want).abs() + ); + } + } + Err(_) => { + let json = serde_json::to_string(&embedding).expect("serialize golden"); + fs::write(&path, &json).expect("write golden vector"); + panic!("no committed golden {name}; wrote it. Re-run to verify parity."); + } + } +} + +fn golden_dir() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("golden") +} + +fn load_input() -> Vec> { + let raw = fs::read_to_string(golden_dir().join("aether_input.json")) + .expect("read aether_input.json fixture"); + let rows: Vec> = serde_json::from_str(&raw).expect("parse aether_input.json"); + rows.into_iter() + .map(|row| row.into_iter().map(|x| x as f32).collect()) + .collect() +} + +/// Build the extractor identically to the Python binding's default +/// construction: `AetherConfig()` + `EmbeddingExtractor(n_subcarriers=56, cfg)`. +fn embed_native(input: &[Vec]) -> Vec { + let e_config = EmbeddingConfig { + d_model: 64, + d_proj: 128, + temperature: 0.07, + normalize: true, + }; + let t_config = TransformerConfig { + n_subcarriers: 56, + n_keypoints: 17, + d_model: 64, + n_heads: 4, + n_gnn_layers: 2, + }; + let mut ext = EmbeddingExtractor::new(t_config, e_config); + ext.extract(input) +} + +#[test] +fn native_embedding_is_128_dim_unit_norm() { + let emb = embed_native(&load_input()); + assert_eq!(emb.len(), 128, "AETHER embedding must be 128-dim"); + let norm: f32 = emb.iter().map(|x| x * x).sum::().sqrt(); + assert!( + (norm - 1.0).abs() < 1e-4, + "embedding must be L2-normalized, got norm={norm}" + ); +} + +#[test] +fn native_embedding_matches_committed_golden() { + let emb = embed_native(&load_input()); + assert_matches_golden_vector(&emb, "aether_embedding.json"); +} diff --git a/python/tests/aether_weights_parity.rs b/python/tests/aether_weights_parity.rs new file mode 100644 index 00000000..ef456742 --- /dev/null +++ b/python/tests/aether_weights_parity.rs @@ -0,0 +1,137 @@ +//! ADR-185 §13.a — weight-loading parity: native-Rust reference half. +//! +//! Proves the AETHER `load_weights` path produces a deterministic, non-random +//! embedding, and compares it to the committed golden VECTOR +//! `tests/golden/aether_loaded_embedding.json` within tolerance. The pytest +//! half (`tests/test_aether.py`) writes a byte-identical weight file (same +//! formula + format) through the binding's `load_weights` and compares to the +//! SAME golden within the same tolerance — native≈golden and binding≈golden +//! prove the binding's weight-loading matches native, portably across arch. +//! (See `aether_parity.rs` for why this is a tolerance compare, not a hash.) +//! +//! Weight formula (shared with the pytest half): `w[i] = k/65536 - 0.5` where +//! `k = (i*1103515245 + 12345) mod 65536`. `k/65536` is a multiple of 2⁻¹⁶, +//! exactly representable in both f32 and f64, so both languages produce +//! byte-identical weights. +//! +//! File format: 8-byte magic `AETHERW1`, `u32` little-endian param count, then +//! that many little-endian `f32`. +//! +//! Regenerate (only on an intentional change): delete the .json golden and +//! re-run `cargo test --features aether --test aether_weights_parity`. +#![cfg(feature = "aether")] + +use std::fs; +use std::path::PathBuf; + +use wifi_densepose_aether::embedding::{EmbeddingConfig, EmbeddingExtractor}; +use wifi_densepose_aether::graph_transformer::TransformerConfig; + +fn golden_dir() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("golden") +} + +fn load_input() -> Vec> { + let raw = fs::read_to_string(golden_dir().join("aether_input.json")) + .expect("read aether_input.json fixture"); + let rows: Vec> = serde_json::from_str(&raw).expect("parse aether_input.json"); + rows.into_iter() + .map(|row| row.into_iter().map(|x| x as f32).collect()) + .collect() +} + +/// Same default construction as `aether_parity.rs` / the Python binding default. +fn new_extractor() -> EmbeddingExtractor { + let e_config = EmbeddingConfig { + d_model: 64, + d_proj: 128, + temperature: 0.07, + normalize: true, + }; + let t_config = TransformerConfig { + n_subcarriers: 56, + n_keypoints: 17, + d_model: 64, + n_heads: 4, + n_gnn_layers: 2, + }; + EmbeddingExtractor::new(t_config, e_config) +} + +fn formula_weights(n: usize) -> Vec { + (0..n) + .map(|i| { + let k = (i as u32).wrapping_mul(1_103_515_245).wrapping_add(12_345) % 65_536; + k as f32 / 65_536.0 - 0.5 + }) + .collect() +} + +fn write_weight_file(path: &PathBuf, weights: &[f32]) { + let mut buf = Vec::with_capacity(12 + weights.len() * 4); + buf.extend_from_slice(b"AETHERW1"); + buf.extend_from_slice(&(weights.len() as u32).to_le_bytes()); + for v in weights { + buf.extend_from_slice(&v.to_le_bytes()); + } + fs::write(path, buf).unwrap(); +} + +/// Cross-architecture f32 parity tolerance; see `aether_parity.rs` and the +/// matching constants in `tests/test_aether.py` for why this is a tolerance +/// compare and not a byte hash. +const PARITY_ATOL: f32 = 1e-4; +const PARITY_RTOL: f32 = 1e-4; + +fn assert_matches_golden_vector(embedding: &[f32], name: &str) { + let path = golden_dir().join(name); + match fs::read_to_string(&path) { + Ok(raw) => { + let golden: Vec = serde_json::from_str(&raw).expect("parse golden vector json"); + assert_eq!(embedding.len(), golden.len(), "{name}: length mismatch"); + for (i, (&got, &want)) in embedding.iter().zip(&golden).enumerate() { + let tol = PARITY_ATOL + PARITY_RTOL * want.abs(); + assert!( + (got - want).abs() <= tol, + "{name}: element {i} diverged beyond tolerance \ + (got {got}, golden {want}, |Δ|={}) — real regression, not arch drift", + (got - want).abs() + ); + } + } + Err(_) => { + let json = serde_json::to_string(&embedding).expect("serialize golden"); + fs::write(&path, &json).expect("write golden vector"); + panic!("no committed golden {name}; wrote it. Re-run to verify parity."); + } + } +} + +#[test] +fn native_loaded_embedding_matches_committed_golden() { + let input = load_input(); + + let mut ext = new_extractor(); + let baseline = ext.extract(&input); // random Xavier init + + let weights = formula_weights(ext.param_count()); + let path = std::env::temp_dir().join(format!( + "aether_weights_parity_{}.bin", + std::process::id() + )); + write_weight_file(&path, &weights); + ext.load_weights(&path).expect("load_weights"); + fs::remove_file(&path).ok(); + + let loaded = ext.extract(&input); + // Loaded weights must actually take effect. + assert!( + baseline.iter().zip(&loaded).any(|(a, b)| (a - b).abs() > 1e-6), + "load_weights had no effect vs the random-init baseline" + ); + assert_eq!(loaded.len(), 128); + + assert_matches_golden_vector(&loaded, "aether_loaded_embedding.json"); +} diff --git a/python/tests/golden/aether_embedding.json b/python/tests/golden/aether_embedding.json new file mode 100644 index 00000000..e8262e0d --- /dev/null +++ b/python/tests/golden/aether_embedding.json @@ -0,0 +1 @@ +[-0.09882868826389313, 0.08015579730272293, 0.019888414070010185, -0.003239249112084508, -0.07265102863311768, -0.08036628365516663, -0.10324385017156601, -0.21274414658546448, 0.1503465175628662, -0.005489329807460308, 0.10834519565105438, 0.05838076397776604, -0.05911992862820625, 0.13135841488838196, -0.006811900530010462, -0.13742603361606598, -0.015311408787965775, -0.21133442223072052, 0.05134191736578941, -0.027355113998055458, -0.044147003442049026, -0.006108833476901054, -0.033326443284749985, 0.15741342306137085, 0.029073286801576614, 0.0375739224255085, 0.023920813575387, 0.07043211907148361, -0.009550352580845356, 0.028179991990327835, 0.05900105461478233, 0.056598298251628876, -0.0047074914909899235, 0.05960564315319061, 0.049969129264354706, 0.017297586426138878, -0.10153798758983612, -0.002574362326413393, 0.06392877548933029, 0.14119082689285278, -0.04484020546078682, -0.038461778312921524, -0.06095990538597107, -0.04703143611550331, 0.07692500203847885, -0.10256559401750565, -0.07250502705574036, 0.12476003915071487, -0.08511383831501007, -0.006181457545608282, 0.09957090020179749, 0.10756388306617737, -0.08597669750452042, -0.09914427250623703, -0.01648416928946972, -0.25724929571151733, -0.024403633549809456, 0.05453304573893547, -0.03141803294420242, -0.07852566242218018, 0.020048094913363457, -0.06215068697929382, 0.11997628211975098, 0.0977955237030983, -0.0652041882276535, -0.007863834500312805, -0.059089504182338715, 0.12663882970809937, 0.16099494695663452, -0.046197254210710526, 0.04186059534549713, -0.07077737897634506, -0.28093546628952026, 0.017284320667386055, 0.1626843810081482, 0.006352100986987352, -0.07779540121555328, -0.004958702251315117, 0.04892482981085777, 0.013853654265403748, 0.08351490646600723, 0.06772761791944504, -0.028758108615875244, 0.04778963327407837, -0.1131502315402031, 0.005114563275128603, -0.012307023629546165, 0.03301718831062317, 0.09168995916843414, -0.04085332900285721, 0.04984535649418831, -0.05280173197388649, -0.01752082072198391, 0.04126245900988579, -0.09206362813711166, 0.08685162663459778, 0.03651193156838417, -0.144779771566391, -0.03290265053510666, 0.15378770232200623, -0.08842422068119049, 0.12492084503173828, 0.04907738417387009, -0.03483045473694801, -0.09838201850652695, 0.04590783640742302, -0.01383654773235321, 0.03766492009162903, -0.03254647180438042, 0.12435581535100937, 0.06573979556560516, 0.055382076650857925, -0.19347889721393585, 0.0018683894304558635, 0.11095203459262848, 0.04290277138352394, -0.07855042070150375, 0.03853689134120941, -0.06062287464737892, 0.004584986716508865, -0.1223185583949089, 0.0031570768915116787, -0.10847429186105728, 0.0023399614728987217, -0.054206088185310364, -0.1367102563381195, -0.14624592661857605, 0.16953621804714203] \ No newline at end of file diff --git a/python/tests/golden/aether_input.json b/python/tests/golden/aether_input.json new file mode 100644 index 00000000..80bdbc63 --- /dev/null +++ b/python/tests/golden/aether_input.json @@ -0,0 +1 @@ +[[0.0, 0.00390625, 0.0078125, 0.01171875, 0.015625, 0.01953125, 0.0234375, 0.02734375, 0.03125, 0.03515625, 0.0390625, 0.04296875, 0.046875, 0.05078125, 0.0546875, 0.05859375, 0.0625, 0.06640625, 0.0703125, 0.07421875, 0.078125, 0.08203125, 0.0859375, 0.08984375, 0.09375, 0.09765625, 0.1015625, 0.10546875, 0.109375, 0.11328125, 0.1171875, 0.12109375, 0.125, 0.12890625, 0.1328125, 0.13671875, 0.140625, 0.14453125, 0.1484375, 0.15234375, 0.15625, 0.16015625, 0.1640625, 0.16796875, 0.171875, 0.17578125, 0.1796875, 0.18359375, 0.1875, 0.19140625, 0.1953125, 0.19921875, 0.203125, 0.20703125, 0.2109375, 0.21484375], [0.21875, 0.22265625, 0.2265625, 0.23046875, 0.234375, 0.23828125, 0.2421875, 0.24609375, 0.25, 0.25390625, 0.2578125, 0.26171875, 0.265625, 0.26953125, 0.2734375, 0.27734375, 0.28125, 0.28515625, 0.2890625, 0.29296875, 0.296875, 0.30078125, 0.3046875, 0.30859375, 0.3125, 0.31640625, 0.3203125, 0.32421875, 0.328125, 0.33203125, 0.3359375, 0.33984375, 0.34375, 0.34765625, 0.3515625, 0.35546875, 0.359375, 0.36328125, 0.3671875, 0.37109375, 0.375, 0.37890625, 0.3828125, 0.38671875, 0.390625, 0.39453125, 0.3984375, 0.40234375, 0.40625, 0.41015625, 0.4140625, 0.41796875, 0.421875, 0.42578125, 0.4296875, 0.43359375], [0.4375, 0.44140625, 0.4453125, 0.44921875, 0.453125, 0.45703125, 0.4609375, 0.46484375, 0.46875, 0.47265625, 0.4765625, 0.48046875, 0.484375, 0.48828125, 0.4921875, 0.49609375, 0.5, 0.50390625, 0.5078125, 0.51171875, 0.515625, 0.51953125, 0.5234375, 0.52734375, 0.53125, 0.53515625, 0.5390625, 0.54296875, 0.546875, 0.55078125, 0.5546875, 0.55859375, 0.5625, 0.56640625, 0.5703125, 0.57421875, 0.578125, 0.58203125, 0.5859375, 0.58984375, 0.59375, 0.59765625, 0.6015625, 0.60546875, 0.609375, 0.61328125, 0.6171875, 0.62109375, 0.625, 0.62890625, 0.6328125, 0.63671875, 0.640625, 0.64453125, 0.6484375, 0.65234375], [0.65625, 0.66015625, 0.6640625, 0.66796875, 0.671875, 0.67578125, 0.6796875, 0.68359375, 0.6875, 0.69140625, 0.6953125, 0.69921875, 0.703125, 0.70703125, 0.7109375, 0.71484375, 0.71875, 0.72265625, 0.7265625, 0.73046875, 0.734375, 0.73828125, 0.7421875, 0.74609375, 0.75, 0.75390625, 0.7578125, 0.76171875, 0.765625, 0.76953125, 0.7734375, 0.77734375, 0.78125, 0.78515625, 0.7890625, 0.79296875, 0.796875, 0.80078125, 0.8046875, 0.80859375, 0.8125, 0.81640625, 0.8203125, 0.82421875, 0.828125, 0.83203125, 0.8359375, 0.83984375, 0.84375, 0.84765625, 0.8515625, 0.85546875, 0.859375, 0.86328125, 0.8671875, 0.87109375], [0.875, 0.87890625, 0.8828125, 0.88671875, 0.890625, 0.89453125, 0.8984375, 0.90234375, 0.90625, 0.91015625, 0.9140625, 0.91796875, 0.921875, 0.92578125, 0.9296875, 0.93359375, 0.9375, 0.94140625, 0.9453125, 0.94921875, 0.953125, 0.95703125, 0.9609375, 0.96484375, 0.96875, 0.97265625, 0.9765625, 0.98046875, 0.984375, 0.98828125, 0.9921875, 0.99609375, 0.0, 0.00390625, 0.0078125, 0.01171875, 0.015625, 0.01953125, 0.0234375, 0.02734375, 0.03125, 0.03515625, 0.0390625, 0.04296875, 0.046875, 0.05078125, 0.0546875, 0.05859375, 0.0625, 0.06640625, 0.0703125, 0.07421875, 0.078125, 0.08203125, 0.0859375, 0.08984375], [0.09375, 0.09765625, 0.1015625, 0.10546875, 0.109375, 0.11328125, 0.1171875, 0.12109375, 0.125, 0.12890625, 0.1328125, 0.13671875, 0.140625, 0.14453125, 0.1484375, 0.15234375, 0.15625, 0.16015625, 0.1640625, 0.16796875, 0.171875, 0.17578125, 0.1796875, 0.18359375, 0.1875, 0.19140625, 0.1953125, 0.19921875, 0.203125, 0.20703125, 0.2109375, 0.21484375, 0.21875, 0.22265625, 0.2265625, 0.23046875, 0.234375, 0.23828125, 0.2421875, 0.24609375, 0.25, 0.25390625, 0.2578125, 0.26171875, 0.265625, 0.26953125, 0.2734375, 0.27734375, 0.28125, 0.28515625, 0.2890625, 0.29296875, 0.296875, 0.30078125, 0.3046875, 0.30859375], [0.3125, 0.31640625, 0.3203125, 0.32421875, 0.328125, 0.33203125, 0.3359375, 0.33984375, 0.34375, 0.34765625, 0.3515625, 0.35546875, 0.359375, 0.36328125, 0.3671875, 0.37109375, 0.375, 0.37890625, 0.3828125, 0.38671875, 0.390625, 0.39453125, 0.3984375, 0.40234375, 0.40625, 0.41015625, 0.4140625, 0.41796875, 0.421875, 0.42578125, 0.4296875, 0.43359375, 0.4375, 0.44140625, 0.4453125, 0.44921875, 0.453125, 0.45703125, 0.4609375, 0.46484375, 0.46875, 0.47265625, 0.4765625, 0.48046875, 0.484375, 0.48828125, 0.4921875, 0.49609375, 0.5, 0.50390625, 0.5078125, 0.51171875, 0.515625, 0.51953125, 0.5234375, 0.52734375], [0.53125, 0.53515625, 0.5390625, 0.54296875, 0.546875, 0.55078125, 0.5546875, 0.55859375, 0.5625, 0.56640625, 0.5703125, 0.57421875, 0.578125, 0.58203125, 0.5859375, 0.58984375, 0.59375, 0.59765625, 0.6015625, 0.60546875, 0.609375, 0.61328125, 0.6171875, 0.62109375, 0.625, 0.62890625, 0.6328125, 0.63671875, 0.640625, 0.64453125, 0.6484375, 0.65234375, 0.65625, 0.66015625, 0.6640625, 0.66796875, 0.671875, 0.67578125, 0.6796875, 0.68359375, 0.6875, 0.69140625, 0.6953125, 0.69921875, 0.703125, 0.70703125, 0.7109375, 0.71484375, 0.71875, 0.72265625, 0.7265625, 0.73046875, 0.734375, 0.73828125, 0.7421875, 0.74609375]] \ No newline at end of file diff --git a/python/tests/golden/aether_loaded_embedding.json b/python/tests/golden/aether_loaded_embedding.json new file mode 100644 index 00000000..f7838e6c --- /dev/null +++ b/python/tests/golden/aether_loaded_embedding.json @@ -0,0 +1 @@ +[0.10761479288339615, 0.05284854769706726, -0.22418244183063507, -0.015137949027121067, -0.03409634903073311, 0.17326673865318298, 0.11726372689008713, -0.07647006958723068, 0.034259773790836334, -0.11302468180656433, 0.05575002729892731, -0.000968325708527118, 0.12398994714021683, 0.010035112500190735, -0.024740785360336304, 0.03396096080541611, -0.13298068940639496, -0.026409678161144257, -0.00981970690190792, 0.1098528727889061, -0.015091875568032265, -0.06820717453956604, -0.08815668523311615, -0.13947811722755432, 0.12845416367053986, 0.007558434270322323, 0.09278517216444016, 0.023929834365844727, -0.15709640085697174, 0.20790696144104004, -0.0814460963010788, 0.035465411841869354, 0.0621788427233696, -0.022502727806568146, 0.1301409900188446, -0.09830718487501144, -0.04854566603899002, -0.060892220586538315, -0.0039014117792248726, 0.08287017792463303, 0.0968087762594223, -0.05596396327018738, -0.18289180099964142, 0.07555137574672699, -0.0711054727435112, 0.017438538372516632, -0.07017677277326584, 0.08828858286142349, 0.09126422554254532, -0.18576686084270477, -0.08681167662143707, 0.006826931145042181, 0.13380175828933716, 0.15818704664707184, -0.03554683178663254, -0.02037874236702919, -0.0721014142036438, 0.09667330235242844, 0.03744731843471527, -0.019951190799474716, 0.05095838010311127, 0.0136749017983675, -0.04109140485525131, -0.09205742925405502, -0.06173047423362732, 0.028595957905054092, 0.07932677119970322, 0.025831375271081924, -0.029791485518217087, -0.047233421355485916, -0.0985548198223114, 0.056721169501543045, 0.04597408324480057, 0.05116378515958786, 0.06485309451818466, -0.11868073791265488, 0.1164744570851326, -0.040522847324609756, -0.12034964561462402, 0.10310209542512894, 0.01842050999403, 0.16855661571025848, -0.05738396197557449, -0.17958901822566986, -0.022476589307188988, 0.03451419249176979, 0.034107644110918045, 0.13773204386234283, -0.07001013308763504, -0.14196854829788208, 0.11647462099790573, -0.03268979489803314, 0.058361802250146866, -0.029253516346216202, 0.1251915991306305, 0.13218750059604645, -0.14484354853630066, -0.1424856185913086, 0.045242637395858765, 0.039408858865499496, 0.199110209941864, 0.0028688418678939342, -0.14990390837192535, -0.031178129836916924, -0.000643149483948946, 0.0783705934882164, 0.02097206376492977, -0.058810342103242874, 0.05459814518690109, -0.00016812187095638365, -0.1195453405380249, -0.06815463304519653, 0.03833199664950371, 0.12025003135204315, 0.06424705684185028, 0.011131756007671356, -0.006310137454420328, -0.06013919785618782, 0.061071064323186874, 0.018219128251075745, 0.08957944065332413, -0.04298160970211029, -0.07775749266147614, -0.01905573531985283, -0.002107167150825262, -0.0794263556599617, -0.005148472264409065, 0.05683618783950806] \ No newline at end of file diff --git a/python/tests/golden/mat_input.json b/python/tests/golden/mat_input.json new file mode 100644 index 00000000..79d3f65c --- /dev/null +++ b/python/tests/golden/mat_input.json @@ -0,0 +1 @@ +{"stream": [{"amplitude": [10.0, 10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4, 10.45, 10.5, 10.55, 10.6, 10.65, 10.7, 10.75, 10.8, 10.85, 10.9, 10.95, 11.0, 11.05, 11.1, 11.15, 11.2, 11.25, 11.3, 11.35, 11.4, 11.45, 11.5, 11.55, 11.6, 11.65, 11.7, 11.75, 11.8, 11.85, 11.9, 11.95, 12.0, 12.05, 12.1, 12.15, 12.2, 12.25, 12.3, 12.35, 12.4, 12.45, 12.5, 12.55, 12.6, 12.65, 12.7, 12.75], "phase": [0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35000000000000003, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41000000000000003, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47000000000000003, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55]}, {"amplitude": [10.298653992442432, 10.348653992442433, 10.398653992442432, 10.448653992442432, 10.498653992442431, 10.548653992442432, 10.598653992442433, 10.648653992442432, 10.698653992442432, 10.748653992442431, 10.798653992442432, 10.848653992442433, 10.898653992442432, 10.948653992442432, 10.998653992442431, 11.048653992442432, 11.098653992442433, 11.148653992442432, 11.198653992442432, 11.248653992442431, 11.298653992442432, 11.348653992442433, 11.398653992442432, 11.448653992442432, 11.498653992442431, 11.548653992442432, 11.598653992442433, 11.648653992442432, 11.698653992442432, 11.748653992442431, 11.798653992442432, 11.848653992442433, 11.898653992442432, 11.948653992442432, 11.998653992442431, 12.048653992442432, 12.098653992442433, 12.148653992442432, 12.198653992442432, 12.248653992442431, 12.298653992442432, 12.348653992442433, 12.398653992442432, 12.448653992442432, 12.498653992442431, 12.548653992442432, 12.598653992442433, 12.648653992442432, 12.698653992442432, 12.748653992442431, 12.798653992442432, 12.848653992442433, 12.898653992442432, 12.948653992442432, 12.998653992442431, 13.048653992442432], "phase": [0.009410831331851433, 0.01941083133185143, 0.029410831331851434, 0.03941083133185143, 0.04941083133185144, 0.05941083133185143, 0.06941083133185143, 0.07941083133185144, 0.08941083133185143, 0.09941083133185143, 0.10941083133185144, 0.11941083133185143, 0.12941083133185144, 0.13941083133185145, 0.14941083133185146, 0.15941083133185144, 0.16941083133185145, 0.17941083133185146, 0.18941083133185144, 0.19941083133185145, 0.20941083133185145, 0.21941083133185144, 0.22941083133185144, 0.23941083133185145, 0.24941083133185143, 0.25941083133185144, 0.26941083133185145, 0.27941083133185146, 0.28941083133185147, 0.2994108313318514, 0.30941083133185143, 0.31941083133185144, 0.32941083133185145, 0.33941083133185146, 0.34941083133185147, 0.3594108313318515, 0.36941083133185143, 0.37941083133185144, 0.38941083133185145, 0.39941083133185146, 0.40941083133185147, 0.4194108313318515, 0.42941083133185143, 0.43941083133185144, 0.44941083133185145, 0.45941083133185145, 0.46941083133185146, 0.4794108313318515, 0.4894108313318514, 0.49941083133185143, 0.5094108313318514, 0.5194108313318514, 0.5294108313318514, 0.5394108313318514, 0.5494108313318514, 0.5594108313318514]}, {"amplitude": [10.580126760950057, 10.630126760950057, 10.680126760950056, 10.730126760950057, 10.780126760950056, 10.830126760950057, 10.880126760950057, 10.930126760950056, 10.980126760950057, 11.030126760950056, 11.080126760950057, 11.130126760950057, 11.180126760950056, 11.230126760950057, 11.280126760950056, 11.330126760950057, 11.380126760950057, 11.430126760950056, 11.480126760950057, 11.530126760950056, 11.580126760950057, 11.630126760950057, 11.680126760950056, 11.730126760950057, 11.780126760950056, 11.830126760950057, 11.880126760950057, 11.930126760950056, 11.980126760950057, 12.030126760950056, 12.080126760950057, 12.130126760950057, 12.180126760950056, 12.230126760950057, 12.280126760950056, 12.330126760950057, 12.380126760950057, 12.430126760950056, 12.480126760950057, 12.530126760950056, 12.580126760950057, 12.630126760950057, 12.680126760950056, 12.730126760950057, 12.780126760950056, 12.830126760950057, 12.880126760950057, 12.930126760950056, 12.980126760950057, 13.030126760950056, 13.080126760950057, 13.130126760950057, 13.180126760950056, 13.230126760950057, 13.280126760950056, 13.330126760950057], "phase": [0.018738131458572463, 0.028738131458572465, 0.03873813145857247, 0.04873813145857246, 0.058738131458572464, 0.06873813145857247, 0.07873813145857246, 0.08873813145857247, 0.09873813145857246, 0.10873813145857246, 0.11873813145857247, 0.12873813145857246, 0.13873813145857244, 0.14873813145857245, 0.15873813145857246, 0.16873813145857247, 0.17873813145857248, 0.1887381314585725, 0.19873813145857244, 0.20873813145857245, 0.21873813145857246, 0.22873813145857247, 0.23873813145857248, 0.2487381314585725, 0.25873813145857244, 0.26873813145857245, 0.27873813145857246, 0.28873813145857247, 0.2987381314585725, 0.30873813145857243, 0.31873813145857244, 0.32873813145857245, 0.33873813145857246, 0.34873813145857246, 0.3587381314585725, 0.3687381314585725, 0.37873813145857244, 0.38873813145857244, 0.39873813145857245, 0.40873813145857246, 0.41873813145857247, 0.4287381314585725, 0.43873813145857243, 0.44873813145857244, 0.45873813145857245, 0.46873813145857246, 0.47873813145857247, 0.4887381314585725, 0.49873813145857243, 0.5087381314585725, 0.5187381314585725, 0.5287381314585725, 0.5387381314585725, 0.5487381314585725, 0.5587381314585725, 0.5687381314585725]}, {"amplitude": [10.829430327818265, 10.879430327818266, 10.929430327818265, 10.979430327818266, 11.029430327818265, 11.079430327818265, 11.129430327818266, 11.179430327818265, 11.229430327818266, 11.279430327818265, 11.329430327818265, 11.379430327818266, 11.429430327818265, 11.479430327818266, 11.529430327818265, 11.579430327818265, 11.629430327818266, 11.679430327818265, 11.729430327818266, 11.779430327818265, 11.829430327818265, 11.879430327818266, 11.929430327818265, 11.979430327818266, 12.029430327818265, 12.079430327818265, 12.129430327818266, 12.179430327818265, 12.229430327818266, 12.279430327818265, 12.329430327818265, 12.379430327818266, 12.429430327818265, 12.479430327818266, 12.529430327818265, 12.579430327818265, 12.629430327818266, 12.679430327818265, 12.729430327818266, 12.779430327818265, 12.829430327818265, 12.879430327818266, 12.929430327818265, 12.979430327818266, 13.029430327818265, 13.079430327818265, 13.129430327818266, 13.179430327818265, 13.229430327818266, 13.279430327818265, 13.329430327818265, 13.379430327818266, 13.429430327818265, 13.479430327818266, 13.529430327818265, 13.579430327818265], "phase": [0.02789911060392293, 0.03789911060392293, 0.047899110603922934, 0.05789911060392293, 0.06789911060392292, 0.07789911060392293, 0.08789911060392293, 0.09789911060392294, 0.10789911060392293, 0.11789911060392293, 0.12789911060392295, 0.13789911060392293, 0.1478991106039229, 0.15789911060392292, 0.16789911060392293, 0.17789911060392294, 0.18789911060392295, 0.19789911060392296, 0.2078991106039229, 0.21789911060392292, 0.22789911060392293, 0.23789911060392294, 0.24789911060392295, 0.25789911060392295, 0.2678991106039229, 0.2778991106039229, 0.2878991106039229, 0.29789911060392293, 0.30789911060392294, 0.3178991106039229, 0.3278991106039229, 0.3378991106039229, 0.3478991106039229, 0.35789911060392293, 0.36789911060392294, 0.37789911060392295, 0.3878991106039229, 0.3978991106039229, 0.4078991106039229, 0.41789911060392293, 0.42789911060392294, 0.43789911060392295, 0.4478991106039229, 0.4578991106039229, 0.4678991106039229, 0.4778991106039229, 0.48789911060392294, 0.49789911060392295, 0.5078991106039229, 0.5178991106039229, 0.5278991106039229, 0.5378991106039229, 0.5478991106039229, 0.5578991106039229, 0.567899110603923, 0.577899110603923]}, {"amplitude": [11.035657123897838, 11.085657123897839, 11.135657123897838, 11.185657123897839, 11.235657123897838, 11.285657123897838, 11.335657123897839, 11.385657123897838, 11.435657123897839, 11.485657123897838, 11.535657123897838, 11.585657123897839, 11.635657123897838, 11.685657123897839, 11.735657123897838, 11.785657123897838, 11.835657123897839, 11.885657123897838, 11.935657123897839, 11.985657123897838, 12.035657123897838, 12.085657123897839, 12.135657123897838, 12.185657123897839, 12.235657123897838, 12.285657123897838, 12.335657123897839, 12.385657123897838, 12.435657123897839, 12.485657123897838, 12.535657123897838, 12.585657123897839, 12.635657123897838, 12.685657123897839, 12.735657123897838, 12.785657123897838, 12.835657123897839, 12.885657123897838, 12.935657123897839, 12.985657123897838, 13.035657123897838, 13.085657123897839, 13.135657123897838, 13.185657123897839, 13.235657123897838, 13.285657123897838, 13.335657123897839, 13.385657123897838, 13.435657123897839, 13.485657123897838, 13.535657123897838, 13.585657123897839, 13.635657123897838, 13.685657123897839, 13.735657123897838, 13.785657123897838], "phase": [0.0368124552684678, 0.0468124552684678, 0.0568124552684678, 0.0668124552684678, 0.0768124552684678, 0.0868124552684678, 0.0968124552684678, 0.1068124552684678, 0.1168124552684678, 0.1268124552684678, 0.1368124552684678, 0.1468124552684678, 0.1568124552684678, 0.1668124552684678, 0.1768124552684678, 0.1868124552684678, 0.1968124552684678, 0.2068124552684678, 0.2168124552684678, 0.2268124552684678, 0.2368124552684678, 0.2468124552684678, 0.2568124552684678, 0.2668124552684678, 0.27681245526846776, 0.28681245526846777, 0.2968124552684678, 0.3068124552684678, 0.3168124552684678, 0.3268124552684678, 0.3368124552684678, 0.3468124552684678, 0.35681245526846783, 0.36681245526846784, 0.37681245526846785, 0.38681245526846786, 0.39681245526846776, 0.40681245526846777, 0.4168124552684678, 0.4268124552684678, 0.4368124552684678, 0.4468124552684678, 0.4568124552684678, 0.4668124552684678, 0.4768124552684678, 0.48681245526846784, 0.49681245526846785, 0.5068124552684679, 0.5168124552684678, 0.5268124552684678, 0.5368124552684678, 0.5468124552684678, 0.5568124552684678, 0.5668124552684678, 0.5768124552684678, 0.5868124552684678]}, {"amplitude": [11.19329795436764, 11.243297954367641, 11.29329795436764, 11.34329795436764, 11.39329795436764, 11.44329795436764, 11.493297954367641, 11.54329795436764, 11.59329795436764, 11.64329795436764, 11.69329795436764, 11.743297954367641, 11.79329795436764, 11.84329795436764, 11.89329795436764, 11.94329795436764, 11.993297954367641, 12.04329795436764, 12.09329795436764, 12.14329795436764, 12.19329795436764, 12.243297954367641, 12.29329795436764, 12.34329795436764, 12.39329795436764, 12.44329795436764, 12.493297954367641, 12.54329795436764, 12.59329795436764, 12.64329795436764, 12.69329795436764, 12.743297954367641, 12.79329795436764, 12.84329795436764, 12.89329795436764, 12.94329795436764, 12.993297954367641, 13.04329795436764, 13.09329795436764, 13.14329795436764, 13.19329795436764, 13.243297954367641, 13.29329795436764, 13.34329795436764, 13.39329795436764, 13.44329795436764, 13.493297954367641, 13.54329795436764, 13.59329795436764, 13.64329795436764, 13.69329795436764, 13.743297954367641, 13.79329795436764, 13.84329795436764, 13.89329795436764, 13.94329795436764], "phase": [0.04539904997395468, 0.05539904997395468, 0.06539904997395468, 0.07539904997395468, 0.08539904997395467, 0.09539904997395468, 0.10539904997395468, 0.11539904997395468, 0.12539904997395468, 0.1353990499739547, 0.1453990499739547, 0.15539904997395468, 0.16539904997395466, 0.17539904997395467, 0.18539904997395468, 0.19539904997395469, 0.2053990499739547, 0.2153990499739547, 0.22539904997395466, 0.23539904997395467, 0.24539904997395467, 0.2553990499739547, 0.2653990499739547, 0.2753990499739547, 0.28539904997395465, 0.29539904997395466, 0.3053990499739547, 0.3153990499739547, 0.3253990499739547, 0.33539904997395464, 0.34539904997395465, 0.35539904997395466, 0.36539904997395467, 0.3753990499739547, 0.3853990499739547, 0.3953990499739547, 0.40539904997395465, 0.41539904997395466, 0.42539904997395467, 0.4353990499739547, 0.4453990499739547, 0.4553990499739547, 0.46539904997395465, 0.47539904997395466, 0.48539904997395467, 0.4953990499739547, 0.5053990499739547, 0.5153990499739547, 0.5253990499739547, 0.5353990499739547, 0.5453990499739547, 0.5553990499739547, 0.5653990499739547, 0.5753990499739547, 0.5853990499739548, 0.5953990499739548]}, {"amplitude": [11.30280756279073, 11.35280756279073, 11.402807562790729, 11.45280756279073, 11.502807562790728, 11.55280756279073, 11.60280756279073, 11.652807562790729, 11.70280756279073, 11.752807562790728, 11.80280756279073, 11.85280756279073, 11.902807562790729, 11.95280756279073, 12.002807562790728, 12.05280756279073, 12.10280756279073, 12.152807562790729, 12.20280756279073, 12.252807562790728, 12.30280756279073, 12.35280756279073, 12.402807562790729, 12.45280756279073, 12.502807562790728, 12.55280756279073, 12.60280756279073, 12.652807562790729, 12.70280756279073, 12.752807562790728, 12.80280756279073, 12.85280756279073, 12.902807562790729, 12.95280756279073, 13.002807562790728, 13.05280756279073, 13.10280756279073, 13.152807562790729, 13.20280756279073, 13.252807562790728, 13.30280756279073, 13.35280756279073, 13.402807562790729, 13.45280756279073, 13.502807562790728, 13.55280756279073, 13.60280756279073, 13.652807562790729, 13.70280756279073, 13.752807562790728, 13.80280756279073, 13.85280756279073, 13.902807562790729, 13.95280756279073, 14.002807562790728, 14.05280756279073], "phase": [0.05358267949789967, 0.06358267949789967, 0.07358267949789966, 0.08358267949789966, 0.09358267949789967, 0.10358267949789968, 0.11358267949789966, 0.12358267949789967, 0.13358267949789968, 0.14358267949789966, 0.15358267949789967, 0.16358267949789967, 0.17358267949789966, 0.18358267949789966, 0.19358267949789967, 0.20358267949789965, 0.21358267949789966, 0.22358267949789967, 0.23358267949789965, 0.24358267949789966, 0.2535826794978997, 0.26358267949789965, 0.27358267949789966, 0.28358267949789967, 0.2935826794978997, 0.3035826794978997, 0.3135826794978997, 0.3235826794978997, 0.3335826794978997, 0.34358267949789967, 0.3535826794978997, 0.3635826794978997, 0.3735826794978997, 0.3835826794978997, 0.3935826794978997, 0.4035826794978997, 0.4135826794978997, 0.4235826794978997, 0.4335826794978997, 0.4435826794978997, 0.4535826794978997, 0.4635826794978997, 0.4735826794978997, 0.4835826794978997, 0.4935826794978997, 0.5035826794978997, 0.5135826794978997, 0.5235826794978997, 0.5335826794978996, 0.5435826794978996, 0.5535826794978996, 0.5635826794978996, 0.5735826794978997, 0.5835826794978997, 0.5935826794978997, 0.6035826794978997]}, {"amplitude": [11.370340209536467, 11.420340209536468, 11.470340209536467, 11.520340209536467, 11.570340209536466, 11.620340209536467, 11.670340209536468, 11.720340209536467, 11.770340209536467, 11.820340209536466, 11.870340209536467, 11.920340209536468, 11.970340209536467, 12.020340209536467, 12.070340209536466, 12.120340209536467, 12.170340209536468, 12.220340209536467, 12.270340209536467, 12.320340209536466, 12.370340209536467, 12.420340209536468, 12.470340209536467, 12.520340209536467, 12.570340209536466, 12.620340209536467, 12.670340209536468, 12.720340209536467, 12.770340209536467, 12.820340209536466, 12.870340209536467, 12.920340209536468, 12.970340209536467, 13.020340209536467, 13.070340209536466, 13.120340209536467, 13.170340209536468, 13.220340209536467, 13.270340209536467, 13.320340209536466, 13.370340209536467, 13.420340209536468, 13.470340209536467, 13.520340209536467, 13.570340209536466, 13.620340209536467, 13.670340209536468, 13.720340209536467, 13.770340209536467, 13.820340209536466, 13.870340209536467, 13.920340209536468, 13.970340209536467, 14.020340209536467, 14.070340209536466, 14.120340209536467], "phase": [0.06129070536529764, 0.07129070536529764, 0.08129070536529764, 0.09129070536529764, 0.10129070536529763, 0.11129070536529764, 0.12129070536529764, 0.13129070536529763, 0.14129070536529764, 0.15129070536529765, 0.16129070536529766, 0.17129070536529764, 0.18129070536529762, 0.19129070536529763, 0.20129070536529764, 0.21129070536529765, 0.22129070536529766, 0.23129070536529767, 0.24129070536529762, 0.25129070536529763, 0.26129070536529764, 0.27129070536529765, 0.28129070536529766, 0.29129070536529766, 0.3012907053652976, 0.3112907053652976, 0.32129070536529764, 0.33129070536529764, 0.34129070536529765, 0.3512907053652976, 0.3612907053652976, 0.3712907053652976, 0.38129070536529763, 0.39129070536529764, 0.40129070536529765, 0.41129070536529766, 0.4212907053652976, 0.4312907053652976, 0.44129070536529763, 0.45129070536529764, 0.46129070536529765, 0.47129070536529766, 0.4812907053652976, 0.4912907053652976, 0.5012907053652976, 0.5112907053652976, 0.5212907053652976, 0.5312907053652977, 0.5412907053652977, 0.5512907053652977, 0.5612907053652977, 0.5712907053652977, 0.5812907053652977, 0.5912907053652977, 0.6012907053652977, 0.6112907053652977]}, {"amplitude": [11.406694181926667, 11.456694181926668, 11.506694181926669, 11.55669418192667, 11.606694181926667, 11.656694181926667, 11.706694181926668, 11.756694181926669, 11.80669418192667, 11.856694181926667, 11.906694181926667, 11.956694181926668, 12.006694181926669, 12.05669418192667, 12.106694181926667, 12.156694181926667, 12.206694181926668, 12.256694181926669, 12.30669418192667, 12.356694181926667, 12.406694181926667, 12.456694181926668, 12.506694181926669, 12.55669418192667, 12.606694181926667, 12.656694181926667, 12.706694181926668, 12.756694181926669, 12.80669418192667, 12.856694181926667, 12.906694181926667, 12.956694181926668, 13.006694181926669, 13.05669418192667, 13.106694181926667, 13.156694181926667, 13.206694181926668, 13.256694181926669, 13.30669418192667, 13.356694181926667, 13.406694181926667, 13.456694181926668, 13.506694181926669, 13.55669418192667, 13.606694181926667, 13.656694181926667, 13.706694181926668, 13.756694181926669, 13.80669418192667, 13.856694181926667, 13.906694181926667, 13.956694181926668, 14.006694181926669, 14.05669418192667, 14.106694181926667, 14.156694181926667], "phase": [0.06845471059286888, 0.07845471059286888, 0.08845471059286888, 0.09845471059286888, 0.10845471059286887, 0.11845471059286888, 0.1284547105928689, 0.1384547105928689, 0.14845471059286888, 0.15845471059286886, 0.16845471059286887, 0.17845471059286888, 0.1884547105928689, 0.1984547105928689, 0.2084547105928689, 0.21845471059286886, 0.22845471059286887, 0.23845471059286888, 0.2484547105928689, 0.2584547105928689, 0.2684547105928689, 0.27845471059286886, 0.28845471059286887, 0.2984547105928689, 0.3084547105928689, 0.3184547105928689, 0.3284547105928689, 0.3384547105928689, 0.3484547105928689, 0.3584547105928689, 0.3684547105928689, 0.3784547105928689, 0.3884547105928689, 0.3984547105928689, 0.4084547105928689, 0.41845471059286893, 0.4284547105928689, 0.4384547105928689, 0.4484547105928689, 0.4584547105928689, 0.4684547105928689, 0.4784547105928689, 0.4884547105928689, 0.4984547105928689, 0.5084547105928688, 0.5184547105928689, 0.5284547105928689, 0.5384547105928689, 0.5484547105928689, 0.5584547105928689, 0.5684547105928689, 0.5784547105928689, 0.5884547105928689, 0.5984547105928689, 0.6084547105928689, 0.6184547105928689]}, {"amplitude": [11.425615173111462, 11.475615173111462, 11.525615173111461, 11.575615173111462, 11.625615173111461, 11.675615173111462, 11.725615173111462, 11.775615173111461, 11.825615173111462, 11.875615173111461, 11.925615173111462, 11.975615173111462, 12.025615173111461, 12.075615173111462, 12.125615173111461, 12.175615173111462, 12.225615173111462, 12.275615173111461, 12.325615173111462, 12.375615173111461, 12.425615173111462, 12.475615173111462, 12.525615173111461, 12.575615173111462, 12.625615173111461, 12.675615173111462, 12.725615173111462, 12.775615173111461, 12.825615173111462, 12.875615173111461, 12.925615173111462, 12.975615173111462, 13.025615173111461, 13.075615173111462, 13.125615173111461, 13.175615173111462, 13.225615173111462, 13.275615173111461, 13.325615173111462, 13.375615173111461, 13.425615173111462, 13.475615173111462, 13.525615173111461, 13.575615173111462, 13.625615173111461, 13.675615173111462, 13.725615173111462, 13.775615173111461, 13.825615173111462, 13.875615173111461, 13.925615173111462, 13.975615173111462, 14.025615173111461, 14.075615173111462, 14.125615173111461, 14.175615173111462], "phase": [0.07501110696304596, 0.08501110696304595, 0.09501110696304596, 0.10501110696304596, 0.11501110696304595, 0.12501110696304596, 0.13501110696304597, 0.14501110696304598, 0.15501110696304596, 0.16501110696304594, 0.17501110696304595, 0.18501110696304596, 0.19501110696304597, 0.20501110696304597, 0.21501110696304598, 0.22501110696304594, 0.23501110696304595, 0.24501110696304595, 0.25501110696304596, 0.265011106963046, 0.275011106963046, 0.28501110696304593, 0.29501110696304594, 0.30501110696304595, 0.31501110696304596, 0.32501110696304597, 0.335011106963046, 0.345011106963046, 0.355011106963046, 0.36501110696304595, 0.37501110696304596, 0.38501110696304597, 0.395011106963046, 0.405011106963046, 0.415011106963046, 0.425011106963046, 0.43501110696304596, 0.44501110696304597, 0.455011106963046, 0.465011106963046, 0.475011106963046, 0.485011106963046, 0.49501110696304595, 0.505011106963046, 0.515011106963046, 0.525011106963046, 0.535011106963046, 0.545011106963046, 0.5550111069630459, 0.5650111069630459, 0.5750111069630459, 0.5850111069630459, 0.5950111069630459, 0.6050111069630459, 0.615011106963046, 0.625011106963046]}, {"amplitude": [11.441698413062152, 11.491698413062153, 11.541698413062152, 11.591698413062153, 11.641698413062151, 11.691698413062152, 11.741698413062153, 11.791698413062152, 11.841698413062153, 11.891698413062151, 11.941698413062152, 11.991698413062153, 12.041698413062152, 12.091698413062153, 12.141698413062151, 12.191698413062152, 12.241698413062153, 12.291698413062152, 12.341698413062153, 12.391698413062151, 12.441698413062152, 12.491698413062153, 12.541698413062152, 12.591698413062153, 12.641698413062151, 12.691698413062152, 12.741698413062153, 12.791698413062152, 12.841698413062153, 12.891698413062151, 12.941698413062152, 12.991698413062153, 13.041698413062152, 13.091698413062153, 13.141698413062151, 13.191698413062152, 13.241698413062153, 13.291698413062152, 13.341698413062153, 13.391698413062151, 13.441698413062152, 13.491698413062153, 13.541698413062152, 13.591698413062153, 13.641698413062151, 13.691698413062152, 13.741698413062153, 13.791698413062152, 13.841698413062153, 13.891698413062151, 13.941698413062152, 13.991698413062153, 14.041698413062152, 14.091698413062153, 14.141698413062151, 14.191698413062152], "phase": [0.08090169943749476, 0.09090169943749475, 0.10090169943749476, 0.11090169943749476, 0.12090169943749476, 0.13090169943749475, 0.14090169943749475, 0.15090169943749476, 0.16090169943749477, 0.17090169943749475, 0.18090169943749476, 0.19090169943749474, 0.20090169943749475, 0.21090169943749476, 0.22090169943749477, 0.23090169943749475, 0.24090169943749476, 0.25090169943749474, 0.26090169943749475, 0.27090169943749476, 0.28090169943749477, 0.2909016994374948, 0.3009016994374948, 0.3109016994374948, 0.32090169943749475, 0.33090169943749476, 0.34090169943749477, 0.3509016994374948, 0.3609016994374948, 0.37090169943749474, 0.38090169943749475, 0.39090169943749475, 0.40090169943749476, 0.41090169943749477, 0.4209016994374948, 0.4309016994374948, 0.44090169943749474, 0.45090169943749475, 0.46090169943749476, 0.47090169943749477, 0.4809016994374948, 0.4909016994374948, 0.5009016994374947, 0.5109016994374947, 0.5209016994374948, 0.5309016994374948, 0.5409016994374948, 0.5509016994374948, 0.5609016994374947, 0.5709016994374947, 0.5809016994374947, 0.5909016994374947, 0.6009016994374947, 0.6109016994374947, 0.6209016994374947, 0.6309016994374947]}, {"amplitude": [11.468185676357283, 11.518185676357284, 11.568185676357281, 11.618185676357282, 11.668185676357282, 11.718185676357283, 11.768185676357284, 11.818185676357281, 11.868185676357282, 11.918185676357282, 11.968185676357283, 12.018185676357284, 12.068185676357281, 12.118185676357282, 12.168185676357282, 12.218185676357283, 12.268185676357284, 12.318185676357281, 12.368185676357282, 12.418185676357282, 12.468185676357283, 12.518185676357284, 12.568185676357281, 12.618185676357282, 12.668185676357282, 12.718185676357283, 12.768185676357284, 12.818185676357281, 12.868185676357282, 12.918185676357282, 12.968185676357283, 13.018185676357284, 13.068185676357281, 13.118185676357282, 13.168185676357282, 13.218185676357283, 13.268185676357284, 13.318185676357281, 13.368185676357282, 13.418185676357282, 13.468185676357283, 13.518185676357284, 13.568185676357281, 13.618185676357282, 13.668185676357282, 13.718185676357283, 13.768185676357284, 13.818185676357281, 13.868185676357282, 13.918185676357282, 13.968185676357283, 14.018185676357284, 14.068185676357281, 14.118185676357282, 14.168185676357282, 14.218185676357283], "phase": [0.08607420270039437, 0.09607420270039436, 0.10607420270039437, 0.11607420270039437, 0.12607420270039438, 0.1360742027003944, 0.14607420270039437, 0.15607420270039438, 0.16607420270039436, 0.17607420270039437, 0.18607420270039438, 0.19607420270039438, 0.20607420270039437, 0.21607420270039437, 0.22607420270039438, 0.23607420270039436, 0.24607420270039437, 0.2560742027003944, 0.2660742027003944, 0.2760742027003944, 0.2860742027003944, 0.29607420270039436, 0.30607420270039437, 0.3160742027003944, 0.32607420270039433, 0.33607420270039434, 0.34607420270039435, 0.35607420270039436, 0.36607420270039437, 0.3760742027003944, 0.3860742027003944, 0.3960742027003944, 0.4060742027003944, 0.4160742027003944, 0.4260742027003944, 0.43607420270039443, 0.44607420270039433, 0.45607420270039434, 0.46607420270039435, 0.47607420270039436, 0.48607420270039436, 0.4960742027003944, 0.5060742027003944, 0.5160742027003944, 0.5260742027003944, 0.5360742027003944, 0.5460742027003944, 0.5560742027003944, 0.5660742027003943, 0.5760742027003943, 0.5860742027003943, 0.5960742027003944, 0.6060742027003944, 0.6160742027003944, 0.6260742027003944, 0.6360742027003944]}, {"amplitude": [11.514967929713434, 11.564967929713434, 11.614967929713432, 11.664967929713432, 11.714967929713433, 11.764967929713434, 11.814967929713434, 11.864967929713432, 11.914967929713432, 11.964967929713433, 12.014967929713434, 12.064967929713434, 12.114967929713432, 12.164967929713432, 12.214967929713433, 12.264967929713434, 12.314967929713434, 12.364967929713432, 12.414967929713432, 12.464967929713433, 12.514967929713434, 12.564967929713434, 12.614967929713432, 12.664967929713432, 12.714967929713433, 12.764967929713434, 12.814967929713434, 12.864967929713432, 12.914967929713432, 12.964967929713433, 13.014967929713434, 13.064967929713434, 13.114967929713432, 13.164967929713432, 13.214967929713433, 13.264967929713434, 13.314967929713434, 13.364967929713432, 13.414967929713432, 13.464967929713433, 13.514967929713434, 13.564967929713434, 13.614967929713432, 13.664967929713432, 13.714967929713433, 13.764967929713434, 13.814967929713434, 13.864967929713432, 13.914967929713432, 13.964967929713433, 14.014967929713434, 14.064967929713434, 14.114967929713432, 14.164967929713432, 14.214967929713433, 14.264967929713434], "phase": [0.09048270524660196, 0.10048270524660195, 0.11048270524660196, 0.12048270524660196, 0.13048270524660197, 0.14048270524660195, 0.15048270524660196, 0.16048270524660196, 0.17048270524660197, 0.18048270524660195, 0.19048270524660196, 0.20048270524660194, 0.21048270524660195, 0.22048270524660196, 0.23048270524660197, 0.24048270524660195, 0.250482705246602, 0.260482705246602, 0.27048270524660195, 0.28048270524660196, 0.29048270524660197, 0.3004827052466019, 0.31048270524660193, 0.32048270524660194, 0.33048270524660195, 0.34048270524660196, 0.35048270524660197, 0.360482705246602, 0.370482705246602, 0.38048270524660194, 0.39048270524660195, 0.40048270524660196, 0.41048270524660196, 0.420482705246602, 0.430482705246602, 0.440482705246602, 0.45048270524660194, 0.46048270524660195, 0.47048270524660196, 0.48048270524660197, 0.490482705246602, 0.500482705246602, 0.5104827052466019, 0.5204827052466019, 0.5304827052466019, 0.5404827052466019, 0.5504827052466019, 0.5604827052466019, 0.5704827052466019, 0.580482705246602, 0.590482705246602, 0.600482705246602, 0.610482705246602, 0.620482705246602, 0.630482705246602, 0.640482705246602]}, {"amplitude": [11.587075362689845, 11.637075362689846, 11.687075362689844, 11.737075362689845, 11.787075362689844, 11.837075362689845, 11.887075362689846, 11.937075362689844, 11.987075362689845, 12.037075362689844, 12.087075362689845, 12.137075362689846, 12.187075362689844, 12.237075362689845, 12.287075362689844, 12.337075362689845, 12.387075362689846, 12.437075362689844, 12.487075362689845, 12.537075362689844, 12.587075362689845, 12.637075362689846, 12.687075362689844, 12.737075362689845, 12.787075362689844, 12.837075362689845, 12.887075362689846, 12.937075362689844, 12.987075362689845, 13.037075362689844, 13.087075362689845, 13.137075362689846, 13.187075362689844, 13.237075362689845, 13.287075362689844, 13.337075362689845, 13.387075362689846, 13.437075362689844, 13.487075362689845, 13.537075362689844, 13.587075362689845, 13.637075362689846, 13.687075362689844, 13.737075362689845, 13.787075362689844, 13.837075362689845, 13.887075362689846, 13.937075362689844, 13.987075362689845, 14.037075362689844, 14.087075362689845, 14.137075362689846, 14.187075362689844, 14.237075362689845, 14.287075362689844, 14.337075362689845], "phase": [0.09408807689542255, 0.10408807689542254, 0.11408807689542255, 0.12408807689542255, 0.13408807689542254, 0.14408807689542255, 0.15408807689542253, 0.16408807689542254, 0.17408807689542255, 0.18408807689542256, 0.19408807689542257, 0.20408807689542255, 0.21408807689542253, 0.22408807689542254, 0.23408807689542255, 0.24408807689542256, 0.25408807689542257, 0.2640880768954226, 0.2740880768954225, 0.28408807689542254, 0.29408807689542255, 0.30408807689542255, 0.31408807689542256, 0.32408807689542257, 0.3340880768954225, 0.34408807689542253, 0.35408807689542254, 0.36408807689542255, 0.37408807689542256, 0.3840880768954225, 0.3940880768954225, 0.40408807689542253, 0.41408807689542254, 0.42408807689542255, 0.43408807689542256, 0.44408807689542257, 0.4540880768954225, 0.46408807689542253, 0.47408807689542254, 0.48408807689542255, 0.49408807689542256, 0.5040880768954226, 0.5140880768954226, 0.5240880768954226, 0.5340880768954226, 0.5440880768954226, 0.5540880768954226, 0.5640880768954226, 0.5740880768954225, 0.5840880768954225, 0.5940880768954225, 0.6040880768954225, 0.6140880768954226, 0.6240880768954226, 0.6340880768954226, 0.6440880768954226]}, {"amplitude": [11.683867944606657, 11.733867944606658, 11.783867944606657, 11.833867944606657, 11.883867944606656, 11.933867944606657, 11.983867944606658, 12.033867944606657, 12.083867944606657, 12.133867944606656, 12.183867944606657, 12.233867944606658, 12.283867944606657, 12.333867944606657, 12.383867944606656, 12.433867944606657, 12.483867944606658, 12.533867944606657, 12.583867944606657, 12.633867944606656, 12.683867944606657, 12.733867944606658, 12.783867944606657, 12.833867944606657, 12.883867944606656, 12.933867944606657, 12.983867944606658, 13.033867944606657, 13.083867944606657, 13.133867944606656, 13.183867944606657, 13.233867944606658, 13.283867944606657, 13.333867944606657, 13.383867944606656, 13.433867944606657, 13.483867944606658, 13.533867944606657, 13.583867944606657, 13.633867944606656, 13.683867944606657, 13.733867944606658, 13.783867944606657, 13.833867944606657, 13.883867944606656, 13.933867944606657, 13.983867944606658, 14.033867944606657, 14.083867944606657, 14.133867944606656, 14.183867944606657, 14.233867944606658, 14.283867944606657, 14.333867944606657, 14.383867944606656, 14.433867944606657], "phase": [0.09685831611286311, 0.1068583161128631, 0.11685831611286311, 0.1268583161128631, 0.13685831611286312, 0.1468583161128631, 0.1568583161128631, 0.16685831611286311, 0.17685831611286312, 0.1868583161128631, 0.1968583161128631, 0.2068583161128631, 0.2168583161128631, 0.2268583161128631, 0.23685831611286312, 0.2468583161128631, 0.25685831611286314, 0.26685831611286315, 0.2768583161128631, 0.2868583161128631, 0.2968583161128631, 0.30685831611286307, 0.3168583161128631, 0.3268583161128631, 0.3368583161128631, 0.3468583161128631, 0.3568583161128631, 0.3668583161128631, 0.37685831611286313, 0.3868583161128631, 0.3968583161128631, 0.4068583161128631, 0.4168583161128631, 0.4268583161128631, 0.43685831611286313, 0.44685831611286314, 0.4568583161128631, 0.4668583161128631, 0.4768583161128631, 0.4868583161128631, 0.49685831611286313, 0.5068583161128631, 0.516858316112863, 0.526858316112863, 0.536858316112863, 0.5468583161128631, 0.5568583161128631, 0.5668583161128631, 0.5768583161128631, 0.5868583161128631, 0.5968583161128631, 0.6068583161128631, 0.6168583161128631, 0.6268583161128631, 0.6368583161128631, 0.6468583161128632]}, {"amplitude": [11.799041105502534, 11.849041105502534, 11.899041105502532, 11.949041105502532, 11.999041105502533, 12.049041105502534, 12.099041105502534, 12.149041105502532, 12.199041105502532, 12.249041105502533, 12.299041105502534, 12.349041105502534, 12.399041105502532, 12.449041105502532, 12.499041105502533, 12.549041105502534, 12.599041105502534, 12.649041105502532, 12.699041105502532, 12.749041105502533, 12.799041105502534, 12.849041105502534, 12.899041105502532, 12.949041105502532, 12.999041105502533, 13.049041105502534, 13.099041105502534, 13.149041105502532, 13.199041105502532, 13.249041105502533, 13.299041105502534, 13.349041105502534, 13.399041105502532, 13.449041105502532, 13.499041105502533, 13.549041105502534, 13.599041105502534, 13.649041105502532, 13.699041105502532, 13.749041105502533, 13.799041105502534, 13.849041105502534, 13.899041105502532, 13.949041105502532, 13.999041105502533, 14.049041105502534, 14.099041105502534, 14.149041105502532, 14.199041105502532, 14.249041105502533, 14.299041105502534, 14.349041105502534, 14.399041105502532, 14.449041105502532, 14.499041105502533, 14.549041105502534], "phase": [0.09876883405951378, 0.10876883405951378, 0.11876883405951379, 0.12876883405951378, 0.1387688340595138, 0.1487688340595138, 0.15876883405951378, 0.1687688340595138, 0.17876883405951377, 0.18876883405951378, 0.1987688340595138, 0.2087688340595138, 0.21876883405951378, 0.2287688340595138, 0.2387688340595138, 0.24876883405951378, 0.2587688340595138, 0.2687688340595138, 0.2787688340595138, 0.2887688340595138, 0.2987688340595138, 0.3087688340595138, 0.3187688340595138, 0.3287688340595138, 0.33876883405951375, 0.34876883405951375, 0.35876883405951376, 0.3687688340595138, 0.3787688340595138, 0.3887688340595138, 0.3987688340595138, 0.4087688340595138, 0.4187688340595138, 0.4287688340595138, 0.43876883405951383, 0.44876883405951384, 0.45876883405951374, 0.46876883405951375, 0.47876883405951376, 0.48876883405951377, 0.4987688340595138, 0.5087688340595138, 0.5187688340595138, 0.5287688340595138, 0.5387688340595138, 0.5487688340595138, 0.5587688340595138, 0.5687688340595138, 0.5787688340595137, 0.5887688340595137, 0.5987688340595138, 0.6087688340595138, 0.6187688340595138, 0.6287688340595138, 0.6387688340595138, 0.6487688340595138]}, {"amplitude": [11.921446490707087, 11.971446490707088, 12.021446490707087, 12.071446490707087, 12.121446490707086, 12.171446490707087, 12.221446490707088, 12.271446490707087, 12.321446490707087, 12.371446490707086, 12.421446490707087, 12.471446490707088, 12.521446490707087, 12.571446490707087, 12.621446490707086, 12.671446490707087, 12.721446490707088, 12.771446490707087, 12.821446490707087, 12.871446490707086, 12.921446490707087, 12.971446490707088, 13.021446490707087, 13.071446490707087, 13.121446490707086, 13.171446490707087, 13.221446490707088, 13.271446490707087, 13.321446490707087, 13.371446490707086, 13.421446490707087, 13.471446490707088, 13.521446490707087, 13.571446490707087, 13.621446490707086, 13.671446490707087, 13.721446490707088, 13.771446490707087, 13.821446490707087, 13.871446490707086, 13.921446490707087, 13.971446490707088, 14.021446490707087, 14.071446490707087, 14.121446490707086, 14.171446490707087, 14.221446490707088, 14.271446490707087, 14.321446490707087, 14.371446490707086, 14.421446490707087, 14.471446490707088, 14.521446490707087, 14.571446490707087, 14.621446490707086, 14.671446490707087], "phase": [0.09980267284282716, 0.10980267284282716, 0.11980267284282717, 0.12980267284282715, 0.13980267284282716, 0.14980267284282717, 0.15980267284282718, 0.16980267284282718, 0.17980267284282717, 0.18980267284282715, 0.19980267284282716, 0.20980267284282716, 0.21980267284282717, 0.22980267284282718, 0.2398026728428272, 0.24980267284282714, 0.25980267284282715, 0.26980267284282716, 0.27980267284282717, 0.2898026728428272, 0.2998026728428272, 0.30980267284282714, 0.31980267284282715, 0.32980267284282716, 0.33980267284282717, 0.3498026728428272, 0.3598026728428272, 0.3698026728428272, 0.3798026728428272, 0.38980267284282716, 0.39980267284282717, 0.4098026728428272, 0.4198026728428272, 0.4298026728428272, 0.4398026728428272, 0.4498026728428272, 0.45980267284282716, 0.4698026728428272, 0.4798026728428272, 0.4898026728428272, 0.4998026728428272, 0.5098026728428272, 0.5198026728428271, 0.5298026728428271, 0.5398026728428271, 0.5498026728428271, 0.5598026728428271, 0.5698026728428272, 0.5798026728428272, 0.5898026728428272, 0.5998026728428272, 0.6098026728428272, 0.6198026728428272, 0.6298026728428272, 0.6398026728428272, 0.6498026728428272]}, {"amplitude": [12.036613090800754, 12.086613090800755, 12.136613090800754, 12.186613090800755, 12.236613090800754, 12.286613090800754, 12.336613090800755, 12.386613090800754, 12.436613090800755, 12.486613090800754, 12.536613090800754, 12.586613090800755, 12.636613090800754, 12.686613090800755, 12.736613090800754, 12.786613090800754, 12.836613090800755, 12.886613090800754, 12.936613090800755, 12.986613090800754, 13.036613090800754, 13.086613090800755, 13.136613090800754, 13.186613090800755, 13.236613090800754, 13.286613090800754, 13.336613090800755, 13.386613090800754, 13.436613090800755, 13.486613090800754, 13.536613090800754, 13.586613090800755, 13.636613090800754, 13.686613090800755, 13.736613090800754, 13.786613090800754, 13.836613090800755, 13.886613090800754, 13.936613090800755, 13.986613090800754, 14.036613090800754, 14.086613090800755, 14.136613090800754, 14.186613090800755, 14.236613090800754, 14.286613090800754, 14.336613090800755, 14.386613090800754, 14.436613090800755, 14.486613090800754, 14.536613090800754, 14.586613090800755, 14.636613090800754, 14.686613090800755, 14.736613090800754, 14.786613090800754], "phase": [0.09995065603657316, 0.10995065603657316, 0.11995065603657316, 0.12995065603657316, 0.13995065603657317, 0.14995065603657315, 0.15995065603657316, 0.16995065603657317, 0.17995065603657318, 0.18995065603657316, 0.19995065603657317, 0.20995065603657315, 0.21995065603657316, 0.22995065603657316, 0.23995065603657317, 0.24995065603657315, 0.2599506560365732, 0.2699506560365732, 0.27995065603657315, 0.28995065603657316, 0.29995065603657317, 0.3099506560365731, 0.31995065603657313, 0.32995065603657314, 0.33995065603657315, 0.34995065603657316, 0.35995065603657317, 0.3699506560365732, 0.3799506560365732, 0.38995065603657314, 0.39995065603657315, 0.40995065603657316, 0.41995065603657317, 0.4299506560365732, 0.4399506560365732, 0.4499506560365732, 0.45995065603657315, 0.46995065603657316, 0.47995065603657316, 0.4899506560365732, 0.4999506560365732, 0.5099506560365732, 0.5199506560365732, 0.5299506560365732, 0.5399506560365732, 0.5499506560365732, 0.5599506560365732, 0.5699506560365732, 0.5799506560365731, 0.5899506560365732, 0.5999506560365732, 0.6099506560365732, 0.6199506560365732, 0.6299506560365732, 0.6399506560365732, 0.6499506560365732]}, {"amplitude": [12.12875550485947, 12.17875550485947, 12.22875550485947, 12.27875550485947, 12.328755504859469, 12.37875550485947, 12.42875550485947, 12.47875550485947, 12.52875550485947, 12.578755504859469, 12.62875550485947, 12.67875550485947, 12.72875550485947, 12.77875550485947, 12.828755504859469, 12.87875550485947, 12.92875550485947, 12.97875550485947, 13.02875550485947, 13.078755504859469, 13.12875550485947, 13.17875550485947, 13.22875550485947, 13.27875550485947, 13.328755504859469, 13.37875550485947, 13.42875550485947, 13.47875550485947, 13.52875550485947, 13.578755504859469, 13.62875550485947, 13.67875550485947, 13.72875550485947, 13.77875550485947, 13.828755504859469, 13.87875550485947, 13.92875550485947, 13.97875550485947, 14.02875550485947, 14.078755504859469, 14.12875550485947, 14.17875550485947, 14.22875550485947, 14.27875550485947, 14.328755504859469, 14.37875550485947, 14.42875550485947, 14.47875550485947, 14.52875550485947, 14.578755504859469, 14.62875550485947, 14.67875550485947, 14.72875550485947, 14.77875550485947, 14.828755504859469, 14.87875550485947], "phase": [0.0992114701314478, 0.10921147013144779, 0.1192114701314478, 0.1292114701314478, 0.1392114701314478, 0.1492114701314478, 0.1592114701314478, 0.1692114701314478, 0.17921147013144778, 0.1892114701314478, 0.1992114701314478, 0.2092114701314478, 0.2192114701314478, 0.2292114701314478, 0.2392114701314478, 0.2492114701314478, 0.2592114701314478, 0.2692114701314478, 0.27921147013144776, 0.28921147013144777, 0.2992114701314478, 0.3092114701314478, 0.3192114701314478, 0.3292114701314478, 0.3392114701314478, 0.3492114701314478, 0.35921147013144783, 0.36921147013144784, 0.37921147013144785, 0.38921147013144775, 0.39921147013144775, 0.40921147013144776, 0.41921147013144777, 0.4292114701314478, 0.4392114701314478, 0.4492114701314478, 0.4592114701314478, 0.4692114701314478, 0.4792114701314478, 0.48921147013144783, 0.49921147013144784, 0.5092114701314479, 0.5192114701314477, 0.5292114701314478, 0.5392114701314478, 0.5492114701314478, 0.5592114701314478, 0.5692114701314478, 0.5792114701314478, 0.5892114701314478, 0.5992114701314478, 0.6092114701314478, 0.6192114701314478, 0.6292114701314478, 0.6392114701314479, 0.6492114701314479]}, {"amplitude": [12.182987496710231, 12.232987496710232, 12.28298749671023, 12.332987496710231, 12.38298749671023, 12.432987496710231, 12.482987496710232, 12.53298749671023, 12.582987496710231, 12.63298749671023, 12.682987496710231, 12.732987496710232, 12.78298749671023, 12.832987496710231, 12.88298749671023, 12.932987496710231, 12.982987496710232, 13.03298749671023, 13.082987496710231, 13.13298749671023, 13.182987496710231, 13.232987496710232, 13.28298749671023, 13.332987496710231, 13.38298749671023, 13.432987496710231, 13.482987496710232, 13.53298749671023, 13.582987496710231, 13.63298749671023, 13.682987496710231, 13.732987496710232, 13.78298749671023, 13.832987496710231, 13.88298749671023, 13.932987496710231, 13.982987496710232, 14.03298749671023, 14.082987496710231, 14.13298749671023, 14.182987496710231, 14.232987496710232, 14.28298749671023, 14.332987496710231, 14.38298749671023, 14.432987496710231, 14.482987496710232, 14.53298749671023, 14.582987496710231, 14.63298749671023, 14.682987496710231, 14.732987496710232, 14.78298749671023, 14.832987496710231, 14.88298749671023, 14.932987496710231], "phase": [0.09759167619387475, 0.10759167619387475, 0.11759167619387476, 0.12759167619387474, 0.13759167619387475, 0.14759167619387475, 0.15759167619387476, 0.16759167619387477, 0.17759167619387475, 0.18759167619387473, 0.19759167619387474, 0.20759167619387475, 0.21759167619387476, 0.22759167619387477, 0.23759167619387478, 0.24759167619387473, 0.25759167619387474, 0.26759167619387475, 0.27759167619387476, 0.28759167619387477, 0.2975916761938748, 0.30759167619387473, 0.31759167619387474, 0.32759167619387475, 0.33759167619387476, 0.34759167619387477, 0.3575916761938748, 0.3675916761938748, 0.3775916761938748, 0.38759167619387475, 0.39759167619387475, 0.40759167619387476, 0.4175916761938748, 0.4275916761938748, 0.4375916761938748, 0.4475916761938748, 0.45759167619387475, 0.46759167619387476, 0.47759167619387477, 0.4875916761938748, 0.4975916761938748, 0.5075916761938748, 0.5175916761938747, 0.5275916761938747, 0.5375916761938747, 0.5475916761938747, 0.5575916761938747, 0.5675916761938747, 0.5775916761938747, 0.5875916761938748, 0.5975916761938748, 0.6075916761938748, 0.6175916761938748, 0.6275916761938748, 0.6375916761938748, 0.6475916761938748]}, {"amplitude": [12.187429987478854, 12.237429987478855, 12.287429987478854, 12.337429987478854, 12.387429987478853, 12.437429987478854, 12.487429987478855, 12.537429987478854, 12.587429987478854, 12.637429987478853, 12.687429987478854, 12.737429987478855, 12.787429987478854, 12.837429987478854, 12.887429987478853, 12.937429987478854, 12.987429987478855, 13.037429987478854, 13.087429987478854, 13.137429987478853, 13.187429987478854, 13.237429987478855, 13.287429987478854, 13.337429987478854, 13.387429987478853, 13.437429987478854, 13.487429987478855, 13.537429987478854, 13.587429987478854, 13.637429987478853, 13.687429987478854, 13.737429987478855, 13.787429987478854, 13.837429987478854, 13.887429987478853, 13.937429987478854, 13.987429987478855, 14.037429987478854, 14.087429987478854, 14.137429987478853, 14.187429987478854, 14.237429987478855, 14.287429987478854, 14.337429987478854, 14.387429987478853, 14.437429987478854, 14.487429987478855, 14.537429987478854, 14.587429987478854, 14.637429987478853, 14.687429987478854, 14.737429987478855, 14.787429987478854, 14.837429987478854, 14.887429987478853, 14.937429987478854], "phase": [0.09510565162951537, 0.10510565162951536, 0.11510565162951537, 0.12510565162951537, 0.13510565162951538, 0.1451056516295154, 0.15510565162951537, 0.16510565162951538, 0.17510565162951536, 0.18510565162951537, 0.19510565162951538, 0.20510565162951538, 0.21510565162951537, 0.22510565162951537, 0.23510565162951538, 0.24510565162951536, 0.2551056516295154, 0.2651056516295154, 0.2751056516295154, 0.2851056516295154, 0.2951056516295154, 0.30510565162951536, 0.31510565162951537, 0.3251056516295154, 0.33510565162951533, 0.34510565162951534, 0.35510565162951535, 0.36510565162951536, 0.37510565162951537, 0.3851056516295154, 0.3951056516295154, 0.4051056516295154, 0.4151056516295154, 0.4251056516295154, 0.4351056516295154, 0.44510565162951543, 0.45510565162951533, 0.46510565162951534, 0.47510565162951535, 0.48510565162951536, 0.49510565162951536, 0.5051056516295154, 0.5151056516295154, 0.5251056516295154, 0.5351056516295154, 0.5451056516295154, 0.5551056516295154, 0.5651056516295154, 0.5751056516295153, 0.5851056516295153, 0.5951056516295153, 0.6051056516295154, 0.6151056516295154, 0.6251056516295154, 0.6351056516295154, 0.6451056516295154]}, {"amplitude": [12.134917269896444, 12.184917269896445, 12.234917269896444, 12.284917269896445, 12.334917269896444, 12.384917269896444, 12.434917269896445, 12.484917269896444, 12.534917269896445, 12.584917269896444, 12.634917269896444, 12.684917269896445, 12.734917269896444, 12.784917269896445, 12.834917269896444, 12.884917269896444, 12.934917269896445, 12.984917269896444, 13.034917269896445, 13.084917269896444, 13.134917269896444, 13.184917269896445, 13.234917269896444, 13.284917269896445, 13.334917269896444, 13.384917269896444, 13.434917269896445, 13.484917269896444, 13.534917269896445, 13.584917269896444, 13.634917269896444, 13.684917269896445, 13.734917269896444, 13.784917269896445, 13.834917269896444, 13.884917269896444, 13.934917269896445, 13.984917269896444, 14.034917269896445, 14.084917269896444, 14.134917269896444, 14.184917269896445, 14.234917269896444, 14.284917269896445, 14.334917269896444, 14.384917269896444, 14.434917269896445, 14.484917269896444, 14.534917269896445, 14.584917269896444, 14.634917269896444, 14.684917269896445, 14.734917269896444, 14.784917269896445, 14.834917269896444, 14.884917269896444], "phase": [0.09177546256839812, 0.10177546256839812, 0.11177546256839813, 0.12177546256839812, 0.13177546256839812, 0.14177546256839813, 0.15177546256839813, 0.16177546256839814, 0.17177546256839812, 0.1817754625683981, 0.19177546256839811, 0.20177546256839812, 0.21177546256839813, 0.22177546256839814, 0.23177546256839815, 0.2417754625683981, 0.2517754625683981, 0.2617754625683981, 0.27177546256839813, 0.28177546256839814, 0.29177546256839815, 0.3017754625683981, 0.3117754625683981, 0.3217754625683981, 0.3317754625683981, 0.34177546256839814, 0.35177546256839815, 0.36177546256839815, 0.37177546256839816, 0.3817754625683981, 0.3917754625683981, 0.40177546256839813, 0.41177546256839814, 0.42177546256839815, 0.43177546256839816, 0.44177546256839817, 0.4517754625683981, 0.46177546256839813, 0.47177546256839814, 0.48177546256839815, 0.49177546256839816, 0.5017754625683981, 0.5117754625683981, 0.5217754625683981, 0.5317754625683981, 0.5417754625683981, 0.5517754625683982, 0.5617754625683982, 0.5717754625683981, 0.5817754625683981, 0.5917754625683981, 0.6017754625683981, 0.6117754625683981, 0.6217754625683981, 0.6317754625683981, 0.6417754625683981]}, {"amplitude": [12.024061475827533, 12.074061475827534, 12.124061475827533, 12.174061475827534, 12.224061475827533, 12.274061475827533, 12.324061475827534, 12.374061475827533, 12.424061475827534, 12.474061475827533, 12.524061475827533, 12.574061475827534, 12.624061475827533, 12.674061475827534, 12.724061475827533, 12.774061475827533, 12.824061475827534, 12.874061475827533, 12.924061475827534, 12.974061475827533, 13.024061475827533, 13.074061475827534, 13.124061475827533, 13.174061475827534, 13.224061475827533, 13.274061475827533, 13.324061475827534, 13.374061475827533, 13.424061475827534, 13.474061475827533, 13.524061475827533, 13.574061475827534, 13.624061475827533, 13.674061475827534, 13.724061475827533, 13.774061475827533, 13.824061475827534, 13.874061475827533, 13.924061475827534, 13.974061475827533, 14.024061475827533, 14.074061475827534, 14.124061475827533, 14.174061475827534, 14.224061475827533, 14.274061475827533, 14.324061475827534, 14.374061475827533, 14.424061475827534, 14.474061475827533, 14.524061475827533, 14.574061475827534, 14.624061475827533, 14.674061475827534, 14.724061475827533, 14.774061475827533], "phase": [0.08763066800438635, 0.09763066800438634, 0.10763066800438635, 0.11763066800438635, 0.12763066800438636, 0.13763066800438634, 0.14763066800438635, 0.15763066800438635, 0.16763066800438636, 0.17763066800438634, 0.18763066800438635, 0.19763066800438633, 0.20763066800438634, 0.21763066800438635, 0.22763066800438636, 0.23763066800438634, 0.24763066800438635, 0.2576306680043864, 0.26763066800438634, 0.27763066800438635, 0.28763066800438636, 0.2976306680043863, 0.3076306680043863, 0.31763066800438633, 0.32763066800438634, 0.33763066800438635, 0.34763066800438636, 0.35763066800438637, 0.3676306680043864, 0.3776306680043863, 0.38763066800438634, 0.39763066800438635, 0.40763066800438635, 0.41763066800438636, 0.42763066800438637, 0.4376306680043864, 0.44763066800438633, 0.45763066800438634, 0.46763066800438635, 0.47763066800438636, 0.48763066800438637, 0.4976306680043864, 0.5076306680043863, 0.5176306680043863, 0.5276306680043863, 0.5376306680043863, 0.5476306680043863, 0.5576306680043863, 0.5676306680043863, 0.5776306680043863, 0.5876306680043863, 0.5976306680043864, 0.6076306680043864, 0.6176306680043864, 0.6276306680043864, 0.6376306680043864]}, {"amplitude": [11.85952528032773, 11.909525280327731, 11.95952528032773, 12.00952528032773, 12.05952528032773, 12.10952528032773, 12.159525280327731, 12.20952528032773, 12.25952528032773, 12.30952528032773, 12.35952528032773, 12.409525280327731, 12.45952528032773, 12.50952528032773, 12.55952528032773, 12.60952528032773, 12.659525280327731, 12.70952528032773, 12.75952528032773, 12.80952528032773, 12.85952528032773, 12.909525280327731, 12.95952528032773, 13.00952528032773, 13.05952528032773, 13.10952528032773, 13.159525280327731, 13.20952528032773, 13.25952528032773, 13.30952528032773, 13.35952528032773, 13.409525280327731, 13.45952528032773, 13.50952528032773, 13.55952528032773, 13.60952528032773, 13.659525280327731, 13.70952528032773, 13.75952528032773, 13.80952528032773, 13.85952528032773, 13.909525280327731, 13.95952528032773, 14.00952528032773, 14.05952528032773, 14.10952528032773, 14.159525280327731, 14.20952528032773, 14.25952528032773, 14.30952528032773, 14.35952528032773, 14.409525280327731, 14.45952528032773, 14.50952528032773, 14.55952528032773, 14.60952528032773], "phase": [0.08270805742745621, 0.0927080574274562, 0.10270805742745621, 0.11270805742745621, 0.12270805742745622, 0.13270805742745623, 0.1427080574274562, 0.15270805742745622, 0.1627080574274562, 0.1727080574274562, 0.18270805742745622, 0.19270805742745623, 0.2027080574274562, 0.21270805742745622, 0.22270805742745622, 0.2327080574274562, 0.24270805742745621, 0.2527080574274562, 0.2627080574274562, 0.2727080574274562, 0.2827080574274562, 0.2927080574274562, 0.3027080574274562, 0.3127080574274562, 0.32270805742745623, 0.33270805742745624, 0.34270805742745625, 0.35270805742745626, 0.36270805742745627, 0.37270805742745616, 0.38270805742745617, 0.3927080574274562, 0.4027080574274562, 0.4127080574274562, 0.4227080574274562, 0.4327080574274562, 0.4427080574274562, 0.45270805742745623, 0.46270805742745624, 0.47270805742745625, 0.48270805742745626, 0.49270805742745627, 0.5027080574274562, 0.5127080574274562, 0.5227080574274562, 0.5327080574274562, 0.5427080574274562, 0.5527080574274562, 0.5627080574274562, 0.5727080574274562, 0.5827080574274562, 0.5927080574274562, 0.6027080574274563, 0.6127080574274563, 0.6227080574274563, 0.6327080574274563]}, {"amplitude": [11.651463851356981, 11.701463851356982, 11.75146385135698, 11.801463851356981, 11.85146385135698, 11.901463851356981, 11.951463851356982, 12.00146385135698, 12.051463851356981, 12.10146385135698, 12.151463851356981, 12.201463851356982, 12.25146385135698, 12.301463851356981, 12.35146385135698, 12.401463851356981, 12.451463851356982, 12.50146385135698, 12.551463851356981, 12.60146385135698, 12.651463851356981, 12.701463851356982, 12.75146385135698, 12.801463851356981, 12.85146385135698, 12.901463851356981, 12.951463851356982, 13.00146385135698, 13.051463851356981, 13.10146385135698, 13.151463851356981, 13.201463851356982, 13.25146385135698, 13.301463851356981, 13.35146385135698, 13.401463851356981, 13.451463851356982, 13.50146385135698, 13.551463851356981, 13.60146385135698, 13.651463851356981, 13.701463851356982, 13.75146385135698, 13.801463851356981, 13.85146385135698, 13.901463851356981, 13.951463851356982, 14.00146385135698, 14.051463851356981, 14.10146385135698, 14.151463851356981, 14.201463851356982, 14.25146385135698, 14.301463851356981, 14.35146385135698, 14.401463851356981], "phase": [0.07705132427757894, 0.08705132427757893, 0.09705132427757894, 0.10705132427757894, 0.11705132427757894, 0.12705132427757893, 0.13705132427757893, 0.14705132427757894, 0.15705132427757895, 0.16705132427757893, 0.17705132427757894, 0.18705132427757892, 0.19705132427757893, 0.20705132427757894, 0.21705132427757895, 0.22705132427757893, 0.23705132427757894, 0.24705132427757895, 0.25705132427757893, 0.26705132427757894, 0.27705132427757895, 0.28705132427757896, 0.29705132427757897, 0.307051324277579, 0.3170513242775789, 0.32705132427757894, 0.33705132427757895, 0.34705132427757895, 0.35705132427757896, 0.3670513242775789, 0.3770513242775789, 0.38705132427757893, 0.39705132427757894, 0.40705132427757895, 0.41705132427757896, 0.42705132427757897, 0.4370513242775789, 0.44705132427757893, 0.45705132427757894, 0.46705132427757895, 0.47705132427757896, 0.48705132427757897, 0.4970513242775789, 0.5070513242775789, 0.5170513242775789, 0.527051324277579, 0.537051324277579, 0.547051324277579, 0.557051324277579, 0.567051324277579, 0.577051324277579, 0.587051324277579, 0.597051324277579, 0.607051324277579, 0.617051324277579, 0.627051324277579]}, {"amplitude": [11.414213562373096, 11.464213562373097, 11.514213562373095, 11.564213562373096, 11.614213562373095, 11.664213562373096, 11.714213562373097, 11.764213562373095, 11.814213562373096, 11.864213562373095, 11.914213562373096, 11.964213562373097, 12.014213562373095, 12.064213562373096, 12.114213562373095, 12.164213562373096, 12.214213562373097, 12.264213562373095, 12.314213562373096, 12.364213562373095, 12.414213562373096, 12.464213562373097, 12.514213562373095, 12.564213562373096, 12.614213562373095, 12.664213562373096, 12.714213562373097, 12.764213562373095, 12.814213562373096, 12.864213562373095, 12.914213562373096, 12.964213562373097, 13.014213562373095, 13.064213562373096, 13.114213562373095, 13.164213562373096, 13.214213562373097, 13.264213562373095, 13.314213562373096, 13.364213562373095, 13.414213562373096, 13.464213562373097, 13.514213562373095, 13.564213562373096, 13.614213562373095, 13.664213562373096, 13.714213562373097, 13.764213562373095, 13.814213562373096, 13.864213562373095, 13.914213562373096, 13.964213562373097, 14.014213562373095, 14.064213562373096, 14.114213562373095, 14.164213562373096], "phase": [0.07071067811865477, 0.08071067811865476, 0.09071067811865477, 0.10071067811865476, 0.11071067811865476, 0.12071067811865477, 0.13071067811865478, 0.1407106781186548, 0.15071067811865477, 0.16071067811865475, 0.17071067811865476, 0.18071067811865477, 0.19071067811865478, 0.20071067811865478, 0.2107106781186548, 0.22071067811865475, 0.23071067811865476, 0.24071067811865476, 0.2507106781186548, 0.2607106781186548, 0.2707106781186548, 0.28071067811865474, 0.29071067811865475, 0.30071067811865476, 0.31071067811865477, 0.3207106781186548, 0.3307106781186548, 0.3407106781186548, 0.3507106781186548, 0.36071067811865476, 0.37071067811865477, 0.3807106781186548, 0.3907106781186548, 0.4007106781186548, 0.4107106781186548, 0.4207106781186548, 0.43071067811865477, 0.4407106781186548, 0.4507106781186548, 0.4607106781186548, 0.4707106781186548, 0.4807106781186548, 0.49071067811865476, 0.5007106781186548, 0.5107106781186548, 0.5207106781186548, 0.5307106781186548, 0.5407106781186548, 0.5507106781186547, 0.5607106781186547, 0.5707106781186547, 0.5807106781186547, 0.5907106781186547, 0.6007106781186548, 0.6107106781186548, 0.6207106781186548]}, {"amplitude": [11.164410613691977, 11.214410613691978, 11.264410613691977, 11.314410613691978, 11.364410613691977, 11.414410613691977, 11.464410613691978, 11.514410613691977, 11.564410613691978, 11.614410613691977, 11.664410613691977, 11.714410613691978, 11.764410613691977, 11.814410613691978, 11.864410613691977, 11.914410613691977, 11.964410613691978, 12.014410613691977, 12.064410613691978, 12.114410613691977, 12.164410613691977, 12.214410613691978, 12.264410613691977, 12.314410613691978, 12.364410613691977, 12.414410613691977, 12.464410613691978, 12.514410613691977, 12.564410613691978, 12.614410613691977, 12.664410613691977, 12.714410613691978, 12.764410613691977, 12.814410613691978, 12.864410613691977, 12.914410613691977, 12.964410613691978, 13.014410613691977, 13.064410613691978, 13.114410613691977, 13.164410613691977, 13.214410613691978, 13.264410613691977, 13.314410613691978, 13.364410613691977, 13.414410613691977, 13.464410613691978, 13.514410613691977, 13.564410613691978, 13.614410613691977, 13.664410613691977, 13.714410613691978, 13.764410613691977, 13.814410613691978, 13.864410613691977, 13.914410613691977], "phase": [0.06374239897486898, 0.07374239897486898, 0.08374239897486899, 0.09374239897486898, 0.10374239897486898, 0.11374239897486899, 0.12374239897486898, 0.133742398974869, 0.14374239897486898, 0.15374239897486897, 0.16374239897486897, 0.17374239897486898, 0.183742398974869, 0.193742398974869, 0.203742398974869, 0.21374239897486896, 0.22374239897486897, 0.23374239897486898, 0.243742398974869, 0.253742398974869, 0.263742398974869, 0.27374239897486896, 0.28374239897486897, 0.293742398974869, 0.303742398974869, 0.313742398974869, 0.323742398974869, 0.333742398974869, 0.343742398974869, 0.353742398974869, 0.363742398974869, 0.373742398974869, 0.383742398974869, 0.393742398974869, 0.403742398974869, 0.41374239897486903, 0.423742398974869, 0.433742398974869, 0.443742398974869, 0.453742398974869, 0.463742398974869, 0.47374239897486903, 0.483742398974869, 0.493742398974869, 0.5037423989748689, 0.513742398974869, 0.523742398974869, 0.533742398974869, 0.543742398974869, 0.553742398974869, 0.563742398974869, 0.573742398974869, 0.583742398974869, 0.593742398974869, 0.603742398974869, 0.613742398974869]}, {"amplitude": [10.918802623925654, 10.968802623925654, 11.018802623925653, 11.068802623925654, 11.118802623925653, 11.168802623925654, 11.218802623925654, 11.268802623925653, 11.318802623925654, 11.368802623925653, 11.418802623925654, 11.468802623925654, 11.518802623925653, 11.568802623925654, 11.618802623925653, 11.668802623925654, 11.718802623925654, 11.768802623925653, 11.818802623925654, 11.868802623925653, 11.918802623925654, 11.968802623925654, 12.018802623925653, 12.068802623925654, 12.118802623925653, 12.168802623925654, 12.218802623925654, 12.268802623925653, 12.318802623925654, 12.368802623925653, 12.418802623925654, 12.468802623925654, 12.518802623925653, 12.568802623925654, 12.618802623925653, 12.668802623925654, 12.718802623925654, 12.768802623925653, 12.818802623925654, 12.868802623925653, 12.918802623925654, 12.968802623925654, 13.018802623925653, 13.068802623925654, 13.118802623925653, 13.168802623925654, 13.218802623925654, 13.268802623925653, 13.318802623925654, 13.368802623925653, 13.418802623925654, 13.468802623925654, 13.518802623925653, 13.568802623925654, 13.618802623925653, 13.668802623925654], "phase": [0.05620833778521305, 0.06620833778521305, 0.07620833778521305, 0.08620833778521306, 0.09620833778521305, 0.10620833778521305, 0.11620833778521306, 0.12620833778521307, 0.13620833778521305, 0.14620833778521306, 0.15620833778521306, 0.16620833778521305, 0.17620833778521305, 0.18620833778521306, 0.19620833778521307, 0.20620833778521305, 0.21620833778521306, 0.22620833778521307, 0.23620833778521305, 0.24620833778521306, 0.25620833778521307, 0.266208337785213, 0.27620833778521303, 0.28620833778521304, 0.29620833778521305, 0.30620833778521306, 0.31620833778521307, 0.3262083377852131, 0.3362083377852131, 0.34620833778521304, 0.35620833778521305, 0.36620833778521306, 0.37620833778521307, 0.3862083377852131, 0.3962083377852131, 0.4062083377852131, 0.41620833778521305, 0.42620833778521305, 0.43620833778521306, 0.44620833778521307, 0.4562083377852131, 0.4662083377852131, 0.47620833778521304, 0.48620833778521305, 0.49620833778521306, 0.506208337785213, 0.516208337785213, 0.526208337785213, 0.536208337785213, 0.546208337785213, 0.5562083377852131, 0.5662083377852131, 0.5762083377852131, 0.5862083377852131, 0.5962083377852131, 0.6062083377852131]}, {"amplitude": [10.692059232463624, 10.742059232463625, 10.792059232463625, 10.842059232463626, 10.892059232463623, 10.942059232463624, 10.992059232463625, 11.042059232463625, 11.092059232463626, 11.142059232463623, 11.192059232463624, 11.242059232463625, 11.292059232463625, 11.342059232463626, 11.392059232463623, 11.442059232463624, 11.492059232463625, 11.542059232463625, 11.592059232463626, 11.642059232463623, 11.692059232463624, 11.742059232463625, 11.792059232463625, 11.842059232463626, 11.892059232463623, 11.942059232463624, 11.992059232463625, 12.042059232463625, 12.092059232463626, 12.142059232463623, 12.192059232463624, 12.242059232463625, 12.292059232463625, 12.342059232463626, 12.392059232463623, 12.442059232463624, 12.492059232463625, 12.542059232463625, 12.592059232463626, 12.642059232463623, 12.692059232463624, 12.742059232463625, 12.792059232463625, 12.842059232463626, 12.892059232463623, 12.942059232463624, 12.992059232463625, 13.042059232463625, 13.092059232463626, 13.142059232463623, 13.192059232463624, 13.242059232463625, 13.292059232463625, 13.342059232463626, 13.392059232463623, 13.442059232463624], "phase": [0.04817536741017156, 0.05817536741017156, 0.06817536741017156, 0.07817536741017156, 0.08817536741017157, 0.09817536741017156, 0.10817536741017156, 0.11817536741017157, 0.12817536741017155, 0.13817536741017156, 0.14817536741017157, 0.15817536741017157, 0.16817536741017156, 0.17817536741017156, 0.18817536741017157, 0.19817536741017155, 0.20817536741017156, 0.21817536741017157, 0.22817536741017155, 0.23817536741017156, 0.24817536741017157, 0.25817536741017155, 0.26817536741017156, 0.27817536741017157, 0.2881753674101716, 0.2981753674101716, 0.3081753674101716, 0.3181753674101716, 0.3281753674101716, 0.3381753674101715, 0.3481753674101715, 0.35817536741017153, 0.36817536741017154, 0.37817536741017155, 0.38817536741017156, 0.39817536741017157, 0.4081753674101716, 0.4181753674101716, 0.4281753674101716, 0.4381753674101716, 0.4481753674101716, 0.4581753674101716, 0.4681753674101715, 0.4781753674101715, 0.48817536741017153, 0.49817536741017154, 0.5081753674101716, 0.5181753674101716, 0.5281753674101716, 0.5381753674101716, 0.5481753674101716, 0.5581753674101716, 0.5681753674101716, 0.5781753674101716, 0.5881753674101716, 0.5981753674101716]}, {"amplitude": [10.49488776274108, 10.54488776274108, 10.59488776274108, 10.64488776274108, 10.694887762741079, 10.74488776274108, 10.79488776274108, 10.84488776274108, 10.89488776274108, 10.944887762741079, 10.99488776274108, 11.04488776274108, 11.09488776274108, 11.14488776274108, 11.194887762741079, 11.24488776274108, 11.29488776274108, 11.34488776274108, 11.39488776274108, 11.444887762741079, 11.49488776274108, 11.54488776274108, 11.59488776274108, 11.64488776274108, 11.694887762741079, 11.74488776274108, 11.79488776274108, 11.84488776274108, 11.89488776274108, 11.944887762741079, 11.99488776274108, 12.04488776274108, 12.09488776274108, 12.14488776274108, 12.194887762741079, 12.24488776274108, 12.29488776274108, 12.34488776274108, 12.39488776274108, 12.444887762741079, 12.49488776274108, 12.54488776274108, 12.59488776274108, 12.64488776274108, 12.694887762741079, 12.74488776274108, 12.79488776274108, 12.84488776274108, 12.89488776274108, 12.944887762741079, 12.99488776274108, 13.04488776274108, 13.09488776274108, 13.14488776274108, 13.194887762741079, 13.24488776274108], "phase": [0.03971478906347806, 0.049714789063478065, 0.05971478906347806, 0.06971478906347806, 0.07971478906347806, 0.08971478906347807, 0.09971478906347805, 0.10971478906347806, 0.11971478906347807, 0.12971478906347805, 0.13971478906347806, 0.14971478906347807, 0.15971478906347805, 0.16971478906347806, 0.17971478906347807, 0.18971478906347805, 0.19971478906347806, 0.20971478906347807, 0.21971478906347805, 0.22971478906347806, 0.23971478906347807, 0.24971478906347805, 0.25971478906347806, 0.26971478906347807, 0.2797147890634781, 0.2897147890634781, 0.2997147890634781, 0.3097147890634781, 0.3197147890634781, 0.32971478906347806, 0.3397147890634781, 0.3497147890634781, 0.3597147890634781, 0.3697147890634781, 0.3797147890634781, 0.3897147890634781, 0.39971478906347807, 0.4097147890634781, 0.4197147890634781, 0.4297147890634781, 0.4397147890634781, 0.4497147890634781, 0.45971478906347807, 0.4697147890634781, 0.4797147890634781, 0.4897147890634781, 0.4997147890634781, 0.5097147890634781, 0.519714789063478, 0.529714789063478, 0.539714789063478, 0.549714789063478, 0.559714789063478, 0.569714789063478, 0.5797147890634781, 0.5897147890634781]}, {"amplitude": [10.332717033861348, 10.382717033861349, 10.432717033861348, 10.482717033861348, 10.532717033861347, 10.582717033861348, 10.632717033861349, 10.682717033861348, 10.732717033861348, 10.782717033861347, 10.832717033861348, 10.882717033861349, 10.932717033861348, 10.982717033861348, 11.032717033861347, 11.082717033861348, 11.132717033861349, 11.182717033861348, 11.232717033861348, 11.282717033861347, 11.332717033861348, 11.382717033861349, 11.432717033861348, 11.482717033861348, 11.532717033861347, 11.582717033861348, 11.632717033861349, 11.682717033861348, 11.732717033861348, 11.782717033861347, 11.832717033861348, 11.882717033861349, 11.932717033861348, 11.982717033861348, 12.032717033861347, 12.082717033861348, 12.132717033861349, 12.182717033861348, 12.232717033861348, 12.282717033861347, 12.332717033861348, 12.382717033861349, 12.432717033861348, 12.482717033861348, 12.532717033861347, 12.582717033861348, 12.632717033861349, 12.682717033861348, 12.732717033861348, 12.782717033861347, 12.832717033861348, 12.882717033861349, 12.932717033861348, 12.982717033861348, 13.032717033861347, 13.082717033861348], "phase": [0.030901699437494753, 0.040901699437494755, 0.05090169943749476, 0.06090169943749475, 0.07090169943749475, 0.08090169943749476, 0.09090169943749475, 0.10090169943749476, 0.11090169943749476, 0.12090169943749475, 0.13090169943749475, 0.14090169943749475, 0.15090169943749476, 0.16090169943749477, 0.17090169943749478, 0.18090169943749473, 0.19090169943749474, 0.20090169943749475, 0.21090169943749476, 0.22090169943749477, 0.23090169943749478, 0.24090169943749473, 0.25090169943749474, 0.26090169943749475, 0.27090169943749476, 0.28090169943749477, 0.2909016994374948, 0.3009016994374948, 0.3109016994374948, 0.32090169943749475, 0.33090169943749476, 0.34090169943749477, 0.3509016994374948, 0.3609016994374948, 0.3709016994374948, 0.3809016994374948, 0.39090169943749475, 0.40090169943749476, 0.41090169943749477, 0.4209016994374948, 0.4309016994374948, 0.4409016994374948, 0.45090169943749475, 0.46090169943749476, 0.47090169943749477, 0.4809016994374948, 0.4909016994374948, 0.5009016994374947, 0.5109016994374947, 0.5209016994374948, 0.5309016994374948, 0.5409016994374948, 0.5509016994374948, 0.5609016994374948, 0.5709016994374948, 0.5809016994374948]}, {"amplitude": [10.20513250996035, 10.255132509960351, 10.30513250996035, 10.35513250996035, 10.40513250996035, 10.45513250996035, 10.505132509960351, 10.55513250996035, 10.60513250996035, 10.65513250996035, 10.70513250996035, 10.755132509960351, 10.80513250996035, 10.85513250996035, 10.90513250996035, 10.95513250996035, 11.005132509960351, 11.05513250996035, 11.10513250996035, 11.15513250996035, 11.20513250996035, 11.255132509960351, 11.30513250996035, 11.35513250996035, 11.40513250996035, 11.45513250996035, 11.505132509960351, 11.55513250996035, 11.60513250996035, 11.65513250996035, 11.70513250996035, 11.755132509960351, 11.80513250996035, 11.85513250996035, 11.90513250996035, 11.95513250996035, 12.005132509960351, 12.05513250996035, 12.10513250996035, 12.15513250996035, 12.20513250996035, 12.255132509960351, 12.30513250996035, 12.35513250996035, 12.40513250996035, 12.45513250996035, 12.505132509960351, 12.55513250996035, 12.60513250996035, 12.65513250996035, 12.70513250996035, 12.755132509960351, 12.80513250996035, 12.85513250996035, 12.90513250996035, 12.95513250996035], "phase": [0.021814324139654277, 0.03181432413965428, 0.041814324139654274, 0.051814324139654276, 0.06181432413965428, 0.07181432413965427, 0.08181432413965428, 0.09181432413965429, 0.10181432413965427, 0.11181432413965428, 0.12181432413965429, 0.13181432413965427, 0.14181432413965428, 0.1518143241396543, 0.1618143241396543, 0.17181432413965428, 0.1818143241396543, 0.1918143241396543, 0.20181432413965428, 0.2118143241396543, 0.2218143241396543, 0.23181432413965428, 0.24181432413965429, 0.25181432413965427, 0.2618143241396543, 0.2718143241396543, 0.2818143241396543, 0.2918143241396543, 0.3018143241396543, 0.31181432413965426, 0.3218143241396543, 0.3318143241396543, 0.3418143241396543, 0.3518143241396543, 0.3618143241396543, 0.3718143241396543, 0.38181432413965427, 0.3918143241396543, 0.4018143241396543, 0.4118143241396543, 0.4218143241396543, 0.4318143241396543, 0.44181432413965427, 0.4518143241396543, 0.4618143241396543, 0.4718143241396543, 0.4818143241396543, 0.4918143241396543, 0.5018143241396542, 0.5118143241396542, 0.5218143241396542, 0.5318143241396542, 0.5418143241396542, 0.5518143241396543, 0.5618143241396543, 0.5718143241396543]}, {"amplitude": [10.106140364898094, 10.156140364898095, 10.206140364898094, 10.256140364898094, 10.306140364898093, 10.356140364898094, 10.406140364898095, 10.456140364898094, 10.506140364898094, 10.556140364898093, 10.606140364898094, 10.656140364898095, 10.706140364898094, 10.756140364898094, 10.806140364898093, 10.856140364898094, 10.906140364898095, 10.956140364898094, 11.006140364898094, 11.056140364898093, 11.106140364898094, 11.156140364898095, 11.206140364898094, 11.256140364898094, 11.306140364898093, 11.356140364898094, 11.406140364898095, 11.456140364898094, 11.506140364898094, 11.556140364898093, 11.606140364898094, 11.656140364898095, 11.706140364898094, 11.756140364898094, 11.806140364898093, 11.856140364898094, 11.906140364898095, 11.956140364898094, 12.006140364898094, 12.056140364898093, 12.106140364898094, 12.156140364898095, 12.206140364898094, 12.256140364898094, 12.306140364898093, 12.356140364898094, 12.406140364898095, 12.456140364898094, 12.506140364898094, 12.556140364898093, 12.606140364898094, 12.656140364898095, 12.706140364898094, 12.756140364898094, 12.806140364898093, 12.856140364898094], "phase": [0.01253332335643041, 0.02253332335643041, 0.03253332335643041, 0.04253332335643041, 0.05253332335643041, 0.06253332335643041, 0.07253332335643041, 0.08253332335643042, 0.09253332335643041, 0.10253332335643041, 0.11253332335643042, 0.12253332335643041, 0.1325333233564304, 0.1425333233564304, 0.1525333233564304, 0.1625333233564304, 0.1725333233564304, 0.1825333233564304, 0.1925333233564304, 0.2025333233564304, 0.2125333233564304, 0.2225333233564304, 0.2325333233564304, 0.2425333233564304, 0.2525333233564304, 0.2625333233564304, 0.27253332335643043, 0.28253332335643044, 0.29253332335643045, 0.3025333233564304, 0.3125333233564304, 0.3225333233564304, 0.33253332335643043, 0.34253332335643044, 0.35253332335643045, 0.36253332335643046, 0.3725333233564304, 0.3825333233564304, 0.39253332335643043, 0.40253332335643044, 0.41253332335643045, 0.42253332335643046, 0.4325333233564304, 0.4425333233564304, 0.45253332335643043, 0.46253332335643044, 0.47253332335643045, 0.48253332335643045, 0.4925333233564304, 0.5025333233564304, 0.5125333233564304, 0.5225333233564304, 0.5325333233564304, 0.5425333233564305, 0.5525333233564305, 0.5625333233564305]}, {"amplitude": [10.025221548086964, 10.075221548086965, 10.125221548086964, 10.175221548086965, 10.225221548086964, 10.275221548086964, 10.325221548086965, 10.375221548086964, 10.425221548086965, 10.475221548086964, 10.525221548086964, 10.575221548086965, 10.625221548086964, 10.675221548086965, 10.725221548086964, 10.775221548086964, 10.825221548086965, 10.875221548086964, 10.925221548086965, 10.975221548086964, 11.025221548086964, 11.075221548086965, 11.125221548086964, 11.175221548086965, 11.225221548086964, 11.275221548086964, 11.325221548086965, 11.375221548086964, 11.425221548086965, 11.475221548086964, 11.525221548086964, 11.575221548086965, 11.625221548086964, 11.675221548086965, 11.725221548086964, 11.775221548086964, 11.825221548086965, 11.875221548086964, 11.925221548086965, 11.975221548086964, 12.025221548086964, 12.075221548086965, 12.125221548086964, 12.175221548086965, 12.225221548086964, 12.275221548086964, 12.325221548086965, 12.375221548086964, 12.425221548086965, 12.475221548086964, 12.525221548086964, 12.575221548086965, 12.625221548086964, 12.675221548086965, 12.725221548086964, 12.775221548086964], "phase": [0.0031410759078128684, 0.013141075907812869, 0.02314107590781287, 0.033141075907812866, 0.04314107590781287, 0.05314107590781287, 0.06314107590781287, 0.07314107590781288, 0.08314107590781288, 0.09314107590781287, 0.10314107590781288, 0.11314107590781287, 0.12314107590781287, 0.13314107590781288, 0.1431410759078129, 0.15314107590781287, 0.16314107590781288, 0.17314107590781289, 0.18314107590781287, 0.19314107590781288, 0.20314107590781288, 0.21314107590781287, 0.22314107590781287, 0.23314107590781288, 0.24314107590781286, 0.2531410759078129, 0.2631410759078129, 0.2731410759078129, 0.2831410759078129, 0.29314107590781285, 0.30314107590781286, 0.31314107590781287, 0.3231410759078129, 0.3331410759078129, 0.3431410759078129, 0.3531410759078129, 0.36314107590781286, 0.37314107590781287, 0.3831410759078129, 0.3931410759078129, 0.4031410759078129, 0.4131410759078129, 0.42314107590781286, 0.43314107590781287, 0.4431410759078129, 0.4531410759078129, 0.4631410759078129, 0.4731410759078129, 0.48314107590781286, 0.49314107590781286, 0.5031410759078129, 0.5131410759078129, 0.5231410759078129, 0.5331410759078129, 0.5431410759078129, 0.5531410759078129]}, {"amplitude": [9.94902592709083, 9.99902592709083, 10.04902592709083, 10.09902592709083, 10.149025927090829, 10.19902592709083, 10.24902592709083, 10.29902592709083, 10.34902592709083, 10.399025927090829, 10.44902592709083, 10.49902592709083, 10.54902592709083, 10.59902592709083, 10.649025927090829, 10.69902592709083, 10.74902592709083, 10.79902592709083, 10.84902592709083, 10.899025927090829, 10.94902592709083, 10.99902592709083, 11.04902592709083, 11.09902592709083, 11.149025927090829, 11.19902592709083, 11.24902592709083, 11.29902592709083, 11.34902592709083, 11.399025927090829, 11.44902592709083, 11.49902592709083, 11.54902592709083, 11.59902592709083, 11.649025927090829, 11.69902592709083, 11.74902592709083, 11.79902592709083, 11.84902592709083, 11.899025927090829, 11.94902592709083, 11.99902592709083, 12.04902592709083, 12.09902592709083, 12.149025927090829, 12.19902592709083, 12.24902592709083, 12.29902592709083, 12.34902592709083, 12.399025927090829, 12.44902592709083, 12.49902592709083, 12.54902592709083, 12.59902592709083, 12.649025927090829, 12.69902592709083], "phase": [-0.006279051952931335, 0.003720948047068665, 0.013720948047068665, 0.023720948047068664, 0.03372094804706867, 0.043720948047068664, 0.05372094804706866, 0.06372094804706867, 0.07372094804706866, 0.08372094804706866, 0.09372094804706867, 0.10372094804706866, 0.11372094804706866, 0.12372094804706867, 0.1337209480470687, 0.14372094804706867, 0.15372094804706868, 0.1637209480470687, 0.17372094804706867, 0.18372094804706868, 0.1937209480470687, 0.20372094804706867, 0.21372094804706868, 0.22372094804706869, 0.23372094804706867, 0.24372094804706868, 0.2537209480470687, 0.2637209480470687, 0.2737209480470687, 0.28372094804706866, 0.29372094804706866, 0.3037209480470687, 0.3137209480470687, 0.3237209480470687, 0.3337209480470687, 0.3437209480470687, 0.35372094804706866, 0.36372094804706867, 0.3737209480470687, 0.3837209480470687, 0.3937209480470687, 0.4037209480470687, 0.41372094804706866, 0.42372094804706867, 0.4337209480470687, 0.4437209480470687, 0.4537209480470687, 0.4637209480470687, 0.47372094804706866, 0.48372094804706867, 0.4937209480470687, 0.5037209480470687, 0.5137209480470687, 0.5237209480470687, 0.5337209480470687, 0.5437209480470687]}, {"amplitude": [9.863466645607279, 9.91346664560728, 9.96346664560728, 10.01346664560728, 10.063466645607278, 10.113466645607279, 10.16346664560728, 10.21346664560728, 10.26346664560728, 10.313466645607278, 10.363466645607279, 10.41346664560728, 10.46346664560728, 10.51346664560728, 10.563466645607278, 10.613466645607279, 10.66346664560728, 10.71346664560728, 10.76346664560728, 10.813466645607278, 10.863466645607279, 10.91346664560728, 10.96346664560728, 11.01346664560728, 11.063466645607278, 11.113466645607279, 11.16346664560728, 11.21346664560728, 11.26346664560728, 11.313466645607278, 11.363466645607279, 11.41346664560728, 11.46346664560728, 11.51346664560728, 11.563466645607278, 11.613466645607279, 11.66346664560728, 11.71346664560728, 11.76346664560728, 11.813466645607278, 11.863466645607279, 11.91346664560728, 11.96346664560728, 12.01346664560728, 12.063466645607278, 12.113466645607279, 12.16346664560728, 12.21346664560728, 12.26346664560728, 12.313466645607278, 12.363466645607279, 12.41346664560728, 12.46346664560728, 12.51346664560728, 12.563466645607278, 12.613466645607279], "phase": [-0.015643446504023075, -0.005643446504023075, 0.004356553495976925, 0.014356553495976924, 0.024356553495976926, 0.034356553495976924, 0.04435655349597692, 0.05435655349597693, 0.06435655349597692, 0.07435655349597692, 0.08435655349597693, 0.09435655349597692, 0.10435655349597692, 0.11435655349597693, 0.12435655349597693, 0.13435655349597692, 0.14435655349597692, 0.15435655349597693, 0.16435655349597691, 0.17435655349597692, 0.18435655349597693, 0.1943565534959769, 0.20435655349597692, 0.21435655349597693, 0.2243565534959769, 0.23435655349597692, 0.24435655349597693, 0.25435655349597697, 0.264356553495977, 0.27435655349597693, 0.28435655349597694, 0.29435655349597695, 0.30435655349597696, 0.31435655349597696, 0.324356553495977, 0.334356553495977, 0.34435655349597694, 0.35435655349597694, 0.36435655349597695, 0.37435655349597696, 0.38435655349597697, 0.394356553495977, 0.40435655349597693, 0.41435655349597694, 0.42435655349597695, 0.43435655349597696, 0.44435655349597697, 0.454356553495977, 0.46435655349597693, 0.47435655349597694, 0.48435655349597695, 0.49435655349597696, 0.504356553495977, 0.514356553495977, 0.524356553495977, 0.534356553495977]}, {"amplitude": [9.755918603320897, 9.805918603320897, 9.855918603320896, 9.905918603320897, 9.955918603320896, 10.005918603320897, 10.055918603320897, 10.105918603320896, 10.155918603320897, 10.205918603320896, 10.255918603320897, 10.305918603320897, 10.355918603320896, 10.405918603320897, 10.455918603320896, 10.505918603320897, 10.555918603320897, 10.605918603320896, 10.655918603320897, 10.705918603320896, 10.755918603320897, 10.805918603320897, 10.855918603320896, 10.905918603320897, 10.955918603320896, 11.005918603320897, 11.055918603320897, 11.105918603320896, 11.155918603320897, 11.205918603320896, 11.255918603320897, 11.305918603320897, 11.355918603320896, 11.405918603320897, 11.455918603320896, 11.505918603320897, 11.555918603320897, 11.605918603320896, 11.655918603320897, 11.705918603320896, 11.755918603320897, 11.805918603320897, 11.855918603320896, 11.905918603320897, 11.955918603320896, 12.005918603320897, 12.055918603320897, 12.105918603320896, 12.155918603320897, 12.205918603320896, 12.255918603320897, 12.305918603320897, 12.355918603320896, 12.405918603320897, 12.455918603320896, 12.505918603320897], "phase": [-0.02486898871648546, -0.01486898871648546, -0.004868988716485459, 0.0051310112835145395, 0.015131011283514541, 0.025131011283514543, 0.035131011283514535, 0.045131011283514544, 0.05513101128351454, 0.06513101128351453, 0.07513101128351454, 0.08513101128351454, 0.09513101128351453, 0.10513101128351454, 0.11513101128351455, 0.12513101128351453, 0.13513101128351454, 0.14513101128351455, 0.15513101128351453, 0.16513101128351454, 0.17513101128351455, 0.18513101128351453, 0.19513101128351454, 0.20513101128351455, 0.21513101128351453, 0.22513101128351454, 0.23513101128351455, 0.24513101128351455, 0.25513101128351456, 0.2651310112835145, 0.2751310112835145, 0.28513101128351453, 0.29513101128351454, 0.30513101128351455, 0.31513101128351456, 0.32513101128351457, 0.3351310112835145, 0.34513101128351453, 0.35513101128351454, 0.36513101128351455, 0.37513101128351456, 0.38513101128351457, 0.3951310112835145, 0.40513101128351453, 0.41513101128351454, 0.42513101128351455, 0.43513101128351456, 0.44513101128351457, 0.4551310112835145, 0.46513101128351453, 0.47513101128351454, 0.48513101128351455, 0.49513101128351455, 0.5051310112835146, 0.5151310112835146, 0.5251310112835146]}, {"amplitude": [9.617210334728023, 9.667210334728024, 9.717210334728023, 9.767210334728023, 9.817210334728022, 9.867210334728023, 9.917210334728024, 9.967210334728023, 10.017210334728023, 10.067210334728022, 10.117210334728023, 10.167210334728024, 10.217210334728023, 10.267210334728023, 10.317210334728022, 10.367210334728023, 10.417210334728024, 10.467210334728023, 10.517210334728023, 10.567210334728022, 10.617210334728023, 10.667210334728024, 10.717210334728023, 10.767210334728023, 10.817210334728022, 10.867210334728023, 10.917210334728024, 10.967210334728023, 11.017210334728023, 11.067210334728022, 11.117210334728023, 11.167210334728024, 11.217210334728023, 11.267210334728023, 11.317210334728022, 11.367210334728023, 11.417210334728024, 11.467210334728023, 11.517210334728023, 11.567210334728022, 11.617210334728023, 11.667210334728024, 11.717210334728023, 11.767210334728023, 11.817210334728022, 11.867210334728023, 11.917210334728024, 11.967210334728023, 12.017210334728023, 12.067210334728022, 12.117210334728023, 12.167210334728024, 12.217210334728023, 12.267210334728023, 12.317210334728022, 12.367210334728023], "phase": [-0.03387379202452915, -0.023873792024529147, -0.013873792024529149, -0.0038737920245291504, 0.0061262079754708515, 0.016126207975470853, 0.02612620797547085, 0.03612620797547086, 0.04612620797547085, 0.05612620797547085, 0.06612620797547086, 0.07612620797547084, 0.08612620797547085, 0.09612620797547086, 0.10612620797547087, 0.11612620797547085, 0.12612620797547086, 0.13612620797547087, 0.14612620797547085, 0.15612620797547086, 0.16612620797547087, 0.17612620797547085, 0.18612620797547086, 0.19612620797547087, 0.20612620797547085, 0.21612620797547086, 0.22612620797547087, 0.23612620797547088, 0.24612620797547088, 0.2561262079754708, 0.2661262079754708, 0.2761262079754708, 0.28612620797547084, 0.29612620797547085, 0.30612620797547085, 0.31612620797547086, 0.3261262079754708, 0.3361262079754708, 0.34612620797547083, 0.35612620797547084, 0.36612620797547085, 0.37612620797547086, 0.3861262079754708, 0.3961262079754708, 0.40612620797547083, 0.41612620797547084, 0.42612620797547085, 0.43612620797547086, 0.4461262079754708, 0.4561262079754708, 0.46612620797547083, 0.47612620797547084, 0.48612620797547085, 0.49612620797547086, 0.5061262079754709, 0.5161262079754709]}, {"amplitude": [9.443127592088462, 9.493127592088463, 9.543127592088462, 9.593127592088463, 9.643127592088462, 9.693127592088462, 9.743127592088463, 9.793127592088462, 9.843127592088463, 9.893127592088462, 9.943127592088462, 9.993127592088463, 10.043127592088462, 10.093127592088463, 10.143127592088462, 10.193127592088462, 10.243127592088463, 10.293127592088462, 10.343127592088463, 10.393127592088462, 10.443127592088462, 10.493127592088463, 10.543127592088462, 10.593127592088463, 10.643127592088462, 10.693127592088462, 10.743127592088463, 10.793127592088462, 10.843127592088463, 10.893127592088462, 10.943127592088462, 10.993127592088463, 11.043127592088462, 11.093127592088463, 11.143127592088462, 11.193127592088462, 11.243127592088463, 11.293127592088462, 11.343127592088463, 11.393127592088462, 11.443127592088462, 11.493127592088463, 11.543127592088462, 11.593127592088463, 11.643127592088462, 11.693127592088462, 11.743127592088463, 11.793127592088462, 11.843127592088463, 11.893127592088462, 11.943127592088462, 11.993127592088463, 12.043127592088462, 12.093127592088463, 12.143127592088462, 12.193127592088462], "phase": [-0.04257792915650723, -0.03257792915650723, -0.02257792915650723, -0.012577929156507232, -0.0025779291565072304, 0.0074220708434927715, 0.017422070843492767, 0.027422070843492775, 0.03742207084349277, 0.047422070843492765, 0.057422070843492774, 0.06742207084349278, 0.07742207084349276, 0.08742207084349277, 0.09742207084349278, 0.10742207084349276, 0.11742207084349277, 0.12742207084349277, 0.13742207084349276, 0.14742207084349276, 0.15742207084349277, 0.16742207084349275, 0.17742207084349276, 0.18742207084349277, 0.19742207084349275, 0.20742207084349276, 0.21742207084349277, 0.22742207084349278, 0.2374220708434928, 0.24742207084349274, 0.2574220708434928, 0.2674220708434928, 0.2774220708434928, 0.2874220708434928, 0.2974220708434928, 0.3074220708434928, 0.3174220708434928, 0.3274220708434928, 0.3374220708434928, 0.3474220708434928, 0.3574220708434928, 0.3674220708434928, 0.3774220708434928, 0.3874220708434928, 0.3974220708434928, 0.4074220708434928, 0.4174220708434928, 0.4274220708434928, 0.43742207084349277, 0.4474220708434928, 0.4574220708434928, 0.4674220708434928, 0.4774220708434928, 0.4874220708434928, 0.4974220708434928, 0.5074220708434928]}, {"amplitude": [9.235215546149863, 9.285215546149864, 9.335215546149863, 9.385215546149864, 9.435215546149863, 9.485215546149863, 9.535215546149864, 9.585215546149863, 9.635215546149864, 9.685215546149863, 9.735215546149863, 9.785215546149864, 9.835215546149863, 9.885215546149864, 9.935215546149863, 9.985215546149863, 10.035215546149864, 10.085215546149863, 10.135215546149864, 10.185215546149863, 10.235215546149863, 10.285215546149864, 10.335215546149863, 10.385215546149864, 10.435215546149863, 10.485215546149863, 10.535215546149864, 10.585215546149863, 10.635215546149864, 10.685215546149863, 10.735215546149863, 10.785215546149864, 10.835215546149863, 10.885215546149864, 10.935215546149863, 10.985215546149863, 11.035215546149864, 11.085215546149863, 11.135215546149864, 11.185215546149863, 11.235215546149863, 11.285215546149864, 11.335215546149863, 11.385215546149864, 11.435215546149863, 11.485215546149863, 11.535215546149864, 11.585215546149863, 11.635215546149864, 11.685215546149863, 11.735215546149863, 11.785215546149864, 11.835215546149863, 11.885215546149864, 11.935215546149863, 11.985215546149863], "phase": [-0.05090414157503712, -0.04090414157503712, -0.03090414157503712, -0.020904141575037123, -0.010904141575037121, -0.0009041415750371193, 0.009095858424962876, 0.019095858424962885, 0.02909585842496288, 0.039095858424962875, 0.049095858424962883, 0.05909585842496288, 0.06909585842496288, 0.07909585842496289, 0.0890958584249629, 0.09909585842496288, 0.10909585842496289, 0.1190958584249629, 0.12909585842496288, 0.1390958584249629, 0.1490958584249629, 0.15909585842496288, 0.16909585842496289, 0.1790958584249629, 0.18909585842496288, 0.19909585842496288, 0.2090958584249629, 0.2190958584249629, 0.2290958584249629, 0.23909585842496286, 0.24909585842496287, 0.25909585842496285, 0.26909585842496286, 0.2790958584249629, 0.2890958584249629, 0.2990958584249629, 0.30909585842496284, 0.31909585842496285, 0.32909585842496286, 0.33909585842496287, 0.3490958584249629, 0.3590958584249629, 0.36909585842496284, 0.37909585842496285, 0.38909585842496286, 0.39909585842496287, 0.4090958584249629, 0.4190958584249629, 0.42909585842496284, 0.43909585842496285, 0.44909585842496286, 0.45909585842496287, 0.4690958584249629, 0.4790958584249629, 0.4890958584249629, 0.4990958584249629]}, {"amplitude": [9.000765071102796, 9.050765071102797, 9.100765071102796, 9.150765071102796, 9.200765071102795, 9.250765071102796, 9.300765071102797, 9.350765071102796, 9.400765071102796, 9.450765071102795, 9.500765071102796, 9.550765071102797, 9.600765071102796, 9.650765071102796, 9.700765071102795, 9.750765071102796, 9.800765071102797, 9.850765071102796, 9.900765071102796, 9.950765071102795, 10.000765071102796, 10.050765071102797, 10.100765071102796, 10.150765071102796, 10.200765071102795, 10.250765071102796, 10.300765071102797, 10.350765071102796, 10.400765071102796, 10.450765071102795, 10.500765071102796, 10.550765071102797, 10.600765071102796, 10.650765071102796, 10.700765071102795, 10.750765071102796, 10.800765071102797, 10.850765071102796, 10.900765071102796, 10.950765071102795, 11.000765071102796, 11.050765071102797, 11.100765071102796, 11.150765071102796, 11.200765071102795, 11.250765071102796, 11.300765071102797, 11.350765071102796, 11.400765071102796, 11.450765071102795, 11.500765071102796, 11.550765071102797, 11.600765071102796, 11.650765071102796, 11.700765071102795, 11.750765071102796], "phase": [-0.05877852522924731, -0.048778525229247305, -0.03877852522924731, -0.028778525229247308, -0.018778525229247306, -0.008778525229247304, 0.001221474770752691, 0.0112214747707527, 0.021221474770752695, 0.03122147477075269, 0.0412214747707527, 0.051221474770752694, 0.06122147477075269, 0.07122147477075269, 0.0812214747707527, 0.09122147477075268, 0.10122147477075269, 0.1112214747707527, 0.12122147477075268, 0.1312214747707527, 0.1412214747707527, 0.15122147477075268, 0.1612214747707527, 0.1712214747707527, 0.18122147477075268, 0.1912214747707527, 0.2012214747707527, 0.2112214747707527, 0.2212214747707527, 0.23122147477075267, 0.24122147477075268, 0.2512214747707527, 0.2612214747707527, 0.2712214747707527, 0.2812214747707527, 0.2912214747707527, 0.3012214747707527, 0.3112214747707527, 0.3212214747707527, 0.3312214747707527, 0.3412214747707527, 0.3512214747707527, 0.36122147477075267, 0.3712214747707527, 0.3812214747707527, 0.3912214747707527, 0.4012214747707527, 0.4112214747707527, 0.42122147477075267, 0.4312214747707527, 0.4412214747707527, 0.4512214747707527, 0.4612214747707527, 0.4712214747707527, 0.4812214747707527, 0.49122147477075273]}, {"amplitude": [8.751983235502154, 8.801983235502155, 8.851983235502153, 8.901983235502154, 8.951983235502153, 9.001983235502154, 9.051983235502155, 9.101983235502153, 9.151983235502154, 9.201983235502153, 9.251983235502154, 9.301983235502155, 9.351983235502153, 9.401983235502154, 9.451983235502153, 9.501983235502154, 9.551983235502155, 9.601983235502153, 9.651983235502154, 9.701983235502153, 9.751983235502154, 9.801983235502155, 9.851983235502153, 9.901983235502154, 9.951983235502153, 10.001983235502154, 10.051983235502155, 10.101983235502153, 10.151983235502154, 10.201983235502153, 10.251983235502154, 10.301983235502155, 10.351983235502153, 10.401983235502154, 10.451983235502153, 10.501983235502154, 10.551983235502155, 10.601983235502153, 10.651983235502154, 10.701983235502153, 10.751983235502154, 10.801983235502155, 10.851983235502153, 10.901983235502154, 10.951983235502153, 11.001983235502154, 11.051983235502155, 11.101983235502153, 11.151983235502154, 11.201983235502153, 11.251983235502154, 11.301983235502155, 11.351983235502153, 11.401983235502154, 11.451983235502153, 11.501983235502154], "phase": [-0.06613118653236515, -0.056131186532365145, -0.04613118653236514, -0.03613118653236515, -0.026131186532365146, -0.016131186532365144, -0.006131186532365149, 0.00386881346763486, 0.013868813467634855, 0.02386881346763485, 0.03386881346763486, 0.043868813467634854, 0.05386881346763485, 0.06386881346763486, 0.07386881346763487, 0.08386881346763485, 0.09386881346763486, 0.10386881346763487, 0.11386881346763485, 0.12386881346763486, 0.13386881346763485, 0.14386881346763486, 0.15386881346763487, 0.16386881346763488, 0.17386881346763483, 0.18386881346763484, 0.19386881346763485, 0.20386881346763486, 0.21386881346763487, 0.22386881346763482, 0.23386881346763483, 0.24386881346763484, 0.25386881346763485, 0.26386881346763486, 0.27386881346763486, 0.2838688134676349, 0.2938688134676348, 0.30386881346763484, 0.31386881346763484, 0.32386881346763485, 0.33386881346763486, 0.34386881346763487, 0.3538688134676348, 0.36386881346763483, 0.37386881346763484, 0.38386881346763485, 0.39386881346763486, 0.40386881346763487, 0.4138688134676348, 0.42386881346763483, 0.43386881346763484, 0.44386881346763485, 0.45386881346763486, 0.46386881346763487, 0.4738688134676349, 0.4838688134676349]}, {"amplitude": [8.504462775087886, 8.554462775087886, 8.604462775087885, 8.654462775087886, 8.704462775087885, 8.754462775087886, 8.804462775087886, 8.854462775087885, 8.904462775087886, 8.954462775087885, 9.004462775087886, 9.054462775087886, 9.104462775087885, 9.154462775087886, 9.204462775087885, 9.254462775087886, 9.304462775087886, 9.354462775087885, 9.404462775087886, 9.454462775087885, 9.504462775087886, 9.554462775087886, 9.604462775087885, 9.654462775087886, 9.704462775087885, 9.754462775087886, 9.804462775087886, 9.854462775087885, 9.904462775087886, 9.954462775087885, 10.004462775087886, 10.054462775087886, 10.104462775087885, 10.154462775087886, 10.204462775087885, 10.254462775087886, 10.304462775087886, 10.354462775087885, 10.404462775087886, 10.454462775087885, 10.504462775087886, 10.554462775087886, 10.604462775087885, 10.654462775087886, 10.704462775087885, 10.754462775087886, 10.804462775087886, 10.854462775087885, 10.904462775087886, 10.954462775087885, 11.004462775087886, 11.054462775087886, 11.104462775087885, 11.154462775087886, 11.204462775087885, 11.254462775087886], "phase": [-0.07289686274214116, -0.06289686274214117, -0.05289686274214116, -0.04289686274214116, -0.03289686274214116, -0.022896862742141158, -0.012896862742141163, -0.002896862742141154, 0.007103137257858841, 0.017103137257858836, 0.027103137257858845, 0.03710313725785884, 0.047103137257858835, 0.057103137257858844, 0.06710313725785885, 0.07710313725785883, 0.08710313725785884, 0.09710313725785885, 0.10710313725785883, 0.11710313725785884, 0.12710313725785885, 0.13710313725785883, 0.14710313725785884, 0.15710313725785885, 0.16710313725785883, 0.17710313725785884, 0.18710313725785885, 0.19710313725785886, 0.20710313725785887, 0.21710313725785882, 0.22710313725785883, 0.23710313725785884, 0.24710313725785885, 0.2571031372578588, 0.26710313725785884, 0.27710313725785884, 0.28710313725785885, 0.29710313725785886, 0.30710313725785887, 0.3171031372578589, 0.3271031372578589, 0.3371031372578589, 0.3471031372578588, 0.3571031372578588, 0.3671031372578588, 0.3771031372578588, 0.38710313725785883, 0.39710313725785884, 0.40710313725785885, 0.41710313725785886, 0.42710313725785887, 0.4371031372578589, 0.4471031372578589, 0.4571031372578589, 0.4671031372578589, 0.4771031372578589]}, {"amplitude": [8.275163873018105, 8.325163873018106, 8.375163873018105, 8.425163873018105, 8.475163873018104, 8.525163873018105, 8.575163873018106, 8.625163873018105, 8.675163873018105, 8.725163873018104, 8.775163873018105, 8.825163873018106, 8.875163873018105, 8.925163873018105, 8.975163873018104, 9.025163873018105, 9.075163873018106, 9.125163873018105, 9.175163873018105, 9.225163873018104, 9.275163873018105, 9.325163873018106, 9.375163873018105, 9.425163873018105, 9.475163873018104, 9.525163873018105, 9.575163873018106, 9.625163873018105, 9.675163873018105, 9.725163873018104, 9.775163873018105, 9.825163873018106, 9.875163873018105, 9.925163873018105, 9.975163873018104, 10.025163873018105, 10.075163873018106, 10.125163873018105, 10.175163873018105, 10.225163873018104, 10.275163873018105, 10.325163873018106, 10.375163873018105, 10.425163873018105, 10.475163873018104, 10.525163873018105, 10.575163873018106, 10.625163873018105, 10.675163873018105, 10.725163873018104, 10.775163873018105, 10.825163873018106, 10.875163873018105, 10.925163873018105, 10.975163873018104, 11.025163873018105], "phase": [-0.07901550123756905, -0.06901550123756905, -0.059015501237569046, -0.04901550123756905, -0.03901550123756905, -0.029015501237569047, -0.019015501237569052, -0.009015501237569043, 0.000984498762430952, 0.010984498762430947, 0.020984498762430956, 0.03098449876243095, 0.040984498762430946, 0.050984498762430955, 0.060984498762430964, 0.07098449876243094, 0.08098449876243095, 0.09098449876243096, 0.10098449876243094, 0.11098449876243095, 0.12098449876243096, 0.13098449876243096, 0.14098449876243097, 0.15098449876243097, 0.16098449876243093, 0.17098449876243094, 0.18098449876243095, 0.19098449876243095, 0.20098449876243096, 0.21098449876243092, 0.22098449876243093, 0.23098449876243093, 0.24098449876243094, 0.25098449876243095, 0.26098449876243096, 0.27098449876243097, 0.2809844987624309, 0.29098449876243093, 0.30098449876243094, 0.31098449876243095, 0.32098449876243096, 0.33098449876243097, 0.3409844987624309, 0.35098449876243093, 0.36098449876243094, 0.37098449876243095, 0.38098449876243096, 0.39098449876243097, 0.4009844987624309, 0.4109844987624309, 0.42098449876243094, 0.43098449876243095, 0.44098449876243095, 0.45098449876243096, 0.46098449876243097, 0.470984498762431]}, {"amplitude": [8.080190176163232, 8.130190176163232, 8.180190176163231, 8.230190176163232, 8.28019017616323, 8.330190176163232, 8.380190176163232, 8.430190176163231, 8.480190176163232, 8.53019017616323, 8.580190176163232, 8.630190176163232, 8.680190176163231, 8.730190176163232, 8.78019017616323, 8.830190176163232, 8.880190176163232, 8.930190176163231, 8.980190176163232, 9.03019017616323, 9.080190176163232, 9.130190176163232, 9.180190176163231, 9.230190176163232, 9.28019017616323, 9.330190176163232, 9.380190176163232, 9.430190176163231, 9.480190176163232, 9.53019017616323, 9.580190176163232, 9.630190176163232, 9.680190176163231, 9.730190176163232, 9.78019017616323, 9.830190176163232, 9.880190176163232, 9.930190176163231, 9.980190176163232, 10.03019017616323, 10.080190176163232, 10.130190176163232, 10.180190176163231, 10.230190176163232, 10.28019017616323, 10.330190176163232, 10.380190176163232, 10.430190176163231, 10.480190176163232, 10.53019017616323, 10.580190176163232, 10.630190176163232, 10.680190176163231, 10.730190176163232, 10.78019017616323, 10.830190176163232], "phase": [-0.08443279255020153, -0.07443279255020153, -0.06443279255020153, -0.05443279255020153, -0.04443279255020153, -0.03443279255020153, -0.024432792550201532, -0.014432792550201523, -0.004432792550201528, 0.005567207449798467, 0.015567207449798476, 0.02556720744979847, 0.035567207449798466, 0.045567207449798475, 0.055567207449798484, 0.06556720744979846, 0.07556720744979847, 0.08556720744979848, 0.09556720744979846, 0.10556720744979847, 0.11556720744979848, 0.12556720744979846, 0.13556720744979847, 0.14556720744979848, 0.15556720744979846, 0.16556720744979847, 0.17556720744979848, 0.1855672074497985, 0.1955672074497985, 0.20556720744979845, 0.21556720744979846, 0.22556720744979847, 0.23556720744979848, 0.24556720744979849, 0.2555672074497985, 0.2655672074497985, 0.27556720744979846, 0.28556720744979847, 0.2955672074497985, 0.3055672074497985, 0.3155672074497985, 0.3255672074497985, 0.33556720744979845, 0.34556720744979846, 0.3555672074497985, 0.3655672074497985, 0.3755672074497985, 0.3855672074497985, 0.39556720744979845, 0.40556720744979846, 0.41556720744979847, 0.4255672074497985, 0.4355672074497985, 0.4455672074497985, 0.4555672074497985, 0.4655672074497985]}, {"amplitude": [7.932669996734718, 7.982669996734718, 8.032669996734718, 8.082669996734719, 8.132669996734716, 8.182669996734717, 8.232669996734717, 8.282669996734718, 8.332669996734719, 8.382669996734716, 8.432669996734717, 8.482669996734717, 8.532669996734718, 8.582669996734719, 8.632669996734716, 8.682669996734717, 8.732669996734717, 8.782669996734718, 8.832669996734719, 8.882669996734716, 8.932669996734717, 8.982669996734717, 9.032669996734718, 9.082669996734719, 9.132669996734716, 9.182669996734717, 9.232669996734717, 9.282669996734718, 9.332669996734719, 9.382669996734716, 9.432669996734717, 9.482669996734717, 9.532669996734718, 9.582669996734719, 9.632669996734716, 9.682669996734717, 9.732669996734717, 9.782669996734718, 9.832669996734719, 9.882669996734716, 9.932669996734717, 9.982669996734717, 10.032669996734718, 10.082669996734719, 10.132669996734716, 10.182669996734717, 10.232669996734717, 10.282669996734718, 10.332669996734719, 10.382669996734716, 10.432669996734717, 10.482669996734717, 10.532669996734718, 10.582669996734719, 10.632669996734716, 10.682669996734717], "phase": [-0.08910065241883679, -0.07910065241883679, -0.06910065241883678, -0.05910065241883679, -0.049100652418836786, -0.039100652418836784, -0.02910065241883679, -0.01910065241883678, -0.009100652418836785, 0.0008993475811632096, 0.010899347581163218, 0.020899347581163213, 0.03089934758116321, 0.04089934758116322, 0.050899347581163226, 0.06089934758116321, 0.07089934758116322, 0.08089934758116323, 0.0908993475811632, 0.10089934758116322, 0.11089934758116322, 0.1208993475811632, 0.13089934758116323, 0.14089934758116324, 0.1508993475811632, 0.1608993475811632, 0.1708993475811632, 0.18089934758116322, 0.19089934758116323, 0.20089934758116318, 0.2108993475811632, 0.2208993475811632, 0.2308993475811632, 0.24089934758116321, 0.2508993475811632, 0.26089934758116323, 0.2708993475811632, 0.2808993475811632, 0.2908993475811632, 0.3008993475811632, 0.3108993475811632, 0.32089934758116323, 0.3308993475811632, 0.3408993475811632, 0.3508993475811632, 0.3608993475811632, 0.3708993475811632, 0.38089934758116323, 0.3908993475811632, 0.4008993475811632, 0.4108993475811632, 0.4208993475811632, 0.4308993475811632, 0.4408993475811632, 0.45089934758116323, 0.46089934758116324]}, {"amplitude": [7.841039009695017, 7.891039009695017, 7.941039009695016, 7.991039009695017, 8.041039009695016, 8.091039009695017, 8.141039009695017, 8.191039009695016, 8.241039009695017, 8.291039009695016, 8.341039009695017, 8.391039009695017, 8.441039009695016, 8.491039009695017, 8.541039009695016, 8.591039009695017, 8.641039009695017, 8.691039009695016, 8.741039009695017, 8.791039009695016, 8.841039009695017, 8.891039009695017, 8.941039009695016, 8.991039009695017, 9.041039009695016, 9.091039009695017, 9.141039009695017, 9.191039009695016, 9.241039009695017, 9.291039009695016, 9.341039009695017, 9.391039009695017, 9.441039009695016, 9.491039009695017, 9.541039009695016, 9.591039009695017, 9.641039009695017, 9.691039009695016, 9.741039009695017, 9.791039009695016, 9.841039009695017, 9.891039009695017, 9.941039009695016, 9.991039009695017, 10.041039009695016, 10.091039009695017, 10.141039009695017, 10.191039009695016, 10.241039009695017, 10.291039009695016, 10.341039009695017, 10.391039009695017, 10.441039009695016, 10.491039009695017, 10.541039009695016, 10.591039009695017], "phase": [-0.09297764858882512, -0.08297764858882513, -0.07297764858882512, -0.06297764858882512, -0.05297764858882512, -0.04297764858882512, -0.032977648588825126, -0.022977648588825117, -0.012977648588825122, -0.002977648588825127, 0.007022351411174882, 0.017022351411174877, 0.027022351411174872, 0.03702235141117488, 0.04702235141117489, 0.05702235141117487, 0.06702235141117488, 0.07702235141117489, 0.08702235141117487, 0.09702235141117488, 0.10702235141117489, 0.11702235141117487, 0.12702235141117488, 0.1370223514111749, 0.14702235141117487, 0.15702235141117488, 0.16702235141117489, 0.1770223514111749, 0.1870223514111749, 0.19702235141117486, 0.20702235141117487, 0.21702235141117487, 0.22702235141117488, 0.2370223514111749, 0.2470223514111749, 0.2570223514111749, 0.26702235141117486, 0.27702235141117487, 0.2870223514111749, 0.2970223514111749, 0.3070223514111749, 0.3170223514111749, 0.32702235141117486, 0.33702235141117487, 0.3470223514111749, 0.3570223514111749, 0.3670223514111749, 0.3770223514111749, 0.38702235141117486, 0.39702235141117487, 0.4070223514111749, 0.4170223514111749, 0.4270223514111749, 0.4370223514111749, 0.4470223514111749, 0.4570223514111749]}, {"amplitude": [7.807964512906309, 7.857964512906309, 7.907964512906308, 7.957964512906309, 8.007964512906307, 8.057964512906308, 8.107964512906308, 8.157964512906307, 8.207964512906308, 8.257964512906307, 8.307964512906308, 8.357964512906308, 8.407964512906307, 8.457964512906308, 8.507964512906307, 8.557964512906308, 8.607964512906308, 8.657964512906307, 8.707964512906308, 8.757964512906307, 8.807964512906308, 8.857964512906308, 8.907964512906307, 8.957964512906308, 9.007964512906307, 9.057964512906308, 9.107964512906308, 9.157964512906307, 9.207964512906308, 9.257964512906307, 9.307964512906308, 9.357964512906308, 9.407964512906307, 9.457964512906308, 9.507964512906307, 9.557964512906308, 9.607964512906308, 9.657964512906307, 9.707964512906308, 9.757964512906307, 9.807964512906308, 9.857964512906308, 9.907964512906307, 9.957964512906308, 10.007964512906307, 10.057964512906308, 10.107964512906308, 10.157964512906307, 10.207964512906308, 10.257964512906307, 10.307964512906308, 10.357964512906308, 10.407964512906307, 10.457964512906308, 10.507964512906307, 10.557964512906308], "phase": [-0.0960293685676943, -0.0860293685676943, -0.0760293685676943, -0.0660293685676943, -0.0560293685676943, -0.046029368567694295, -0.0360293685676943, -0.02602936856769429, -0.016029368567694297, -0.0060293685676943015, 0.003970631432305707, 0.013970631432305702, 0.023970631432305697, 0.033970631432305706, 0.043970631432305715, 0.053970631432305696, 0.0639706314323057, 0.07397063143230571, 0.0839706314323057, 0.0939706314323057, 0.10397063143230571, 0.1139706314323057, 0.1239706314323057, 0.1339706314323057, 0.1439706314323057, 0.15397063143230572, 0.16397063143230572, 0.17397063143230573, 0.18397063143230574, 0.1939706314323057, 0.2039706314323057, 0.2139706314323057, 0.22397063143230572, 0.23397063143230573, 0.24397063143230574, 0.25397063143230575, 0.2639706314323057, 0.2739706314323057, 0.2839706314323057, 0.29397063143230573, 0.30397063143230574, 0.31397063143230575, 0.3239706314323057, 0.3339706314323057, 0.3439706314323057, 0.3539706314323057, 0.36397063143230574, 0.37397063143230574, 0.3839706314323057, 0.3939706314323057, 0.4039706314323057, 0.4139706314323057, 0.42397063143230573, 0.43397063143230574, 0.44397063143230575, 0.45397063143230576]}, {"amplitude": [7.830061366764015, 7.880061366764016, 7.930061366764015, 7.980061366764016, 8.030061366764015, 8.080061366764015, 8.130061366764016, 8.180061366764015, 8.230061366764016, 8.280061366764015, 8.330061366764015, 8.380061366764016, 8.430061366764015, 8.480061366764016, 8.530061366764015, 8.580061366764015, 8.630061366764016, 8.680061366764015, 8.730061366764016, 8.780061366764015, 8.830061366764015, 8.880061366764016, 8.930061366764015, 8.980061366764016, 9.030061366764015, 9.080061366764015, 9.130061366764016, 9.180061366764015, 9.230061366764016, 9.280061366764015, 9.330061366764015, 9.380061366764016, 9.430061366764015, 9.480061366764016, 9.530061366764015, 9.580061366764015, 9.630061366764016, 9.680061366764015, 9.730061366764016, 9.780061366764015, 9.830061366764015, 9.880061366764016, 9.930061366764015, 9.980061366764016, 10.030061366764015, 10.080061366764015, 10.130061366764016, 10.180061366764015, 10.230061366764016, 10.280061366764015, 10.330061366764015, 10.380061366764016, 10.430061366764015, 10.480061366764016, 10.530061366764015, 10.580061366764015], "phase": [-0.09822872507286888, -0.08822872507286889, -0.07822872507286888, -0.06822872507286888, -0.05822872507286888, -0.04822872507286888, -0.03822872507286888, -0.028228725072868874, -0.01822872507286888, -0.008228725072868884, 0.0017712749271311251, 0.01177127492713112, 0.021771274927131115, 0.031771274927131124, 0.04177127492713113, 0.051771274927131114, 0.06177127492713112, 0.07177127492713113, 0.08177127492713111, 0.09177127492713112, 0.10177127492713113, 0.11177127492713111, 0.12177127492713112, 0.13177127492713114, 0.1417712749271311, 0.1517712749271311, 0.16177127492713111, 0.17177127492713112, 0.18177127492713113, 0.19177127492713109, 0.2017712749271311, 0.2117712749271311, 0.2217712749271311, 0.23177127492713112, 0.24177127492713113, 0.25177127492713114, 0.2617712749271311, 0.2717712749271311, 0.2817712749271311, 0.2917712749271311, 0.30177127492713113, 0.31177127492713114, 0.3217712749271311, 0.3317712749271311, 0.3417712749271311, 0.3517712749271311, 0.3617712749271311, 0.37177127492713113, 0.3817712749271311, 0.3917712749271311, 0.4017712749271311, 0.4117712749271311, 0.4217712749271311, 0.43177127492713113, 0.44177127492713114, 0.45177127492713115]}, {"amplitude": [7.898438704988436, 7.948438704988437, 7.998438704988438, 8.048438704988438, 8.098438704988435, 8.148438704988436, 8.198438704988437, 8.248438704988438, 8.298438704988438, 8.348438704988435, 8.398438704988436, 8.448438704988437, 8.498438704988438, 8.548438704988438, 8.598438704988435, 8.648438704988436, 8.698438704988437, 8.748438704988438, 8.798438704988438, 8.848438704988435, 8.898438704988436, 8.948438704988437, 8.998438704988438, 9.048438704988438, 9.098438704988435, 9.148438704988436, 9.198438704988437, 9.248438704988438, 9.298438704988438, 9.348438704988435, 9.398438704988436, 9.448438704988437, 9.498438704988438, 9.548438704988438, 9.598438704988435, 9.648438704988436, 9.698438704988437, 9.748438704988438, 9.798438704988438, 9.848438704988435, 9.898438704988436, 9.948438704988437, 9.998438704988438, 10.048438704988438, 10.098438704988435, 10.148438704988436, 10.198438704988437, 10.248438704988438, 10.298438704988438, 10.348438704988435, 10.398438704988436, 10.448438704988437, 10.498438704988438, 10.548438704988438, 10.598438704988435, 10.648438704988436], "phase": [-0.099556196460308, -0.089556196460308, -0.079556196460308, -0.069556196460308, -0.059556196460308, -0.049556196460308, -0.039556196460308, -0.029556196460307993, -0.019556196460307998, -0.009556196460308003, 0.0004438035396920059, 0.010443803539692001, 0.020443803539691996, 0.030443803539692005, 0.040443803539692014, 0.050443803539691995, 0.060443803539692004, 0.07044380353969201, 0.080443803539692, 0.090443803539692, 0.10044380353969201, 0.11044380353969199, 0.120443803539692, 0.130443803539692, 0.140443803539692, 0.150443803539692, 0.160443803539692, 0.17044380353969202, 0.18044380353969203, 0.19044380353969198, 0.200443803539692, 0.210443803539692, 0.220443803539692, 0.23044380353969202, 0.24044380353969202, 0.25044380353969203, 0.260443803539692, 0.270443803539692, 0.280443803539692, 0.290443803539692, 0.300443803539692, 0.31044380353969203, 0.320443803539692, 0.330443803539692, 0.340443803539692, 0.350443803539692, 0.360443803539692, 0.37044380353969203, 0.380443803539692, 0.390443803539692, 0.400443803539692, 0.410443803539692, 0.420443803539692, 0.430443803539692, 0.44044380353969204, 0.45044380353969204]}, {"amplitude": [8.0, 8.05, 8.1, 8.15, 8.2, 8.25, 8.3, 8.35, 8.4, 8.45, 8.5, 8.55, 8.6, 8.65, 8.7, 8.75, 8.8, 8.85, 8.9, 8.95, 9.0, 9.05, 9.1, 9.15, 9.2, 9.25, 9.3, 9.35, 9.4, 9.45, 9.5, 9.55, 9.6, 9.65, 9.7, 9.75, 9.8, 9.85, 9.9, 9.95, 10.0, 10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4, 10.45, 10.5, 10.55, 10.6, 10.65, 10.7, 10.75], "phase": [-0.1, -0.09000000000000001, -0.08, -0.07, -0.060000000000000005, -0.05, -0.04000000000000001, -0.03, -0.020000000000000004, -0.010000000000000009, 0.0, 0.009999999999999995, 0.01999999999999999, 0.03, 0.04000000000000001, 0.04999999999999999, 0.06, 0.07, 0.07999999999999999, 0.09, 0.1, 0.10999999999999999, 0.12, 0.13, 0.13999999999999999, 0.15, 0.16, 0.17, 0.18000000000000002, 0.18999999999999997, 0.19999999999999998, 0.21, 0.22, 0.23, 0.24000000000000002, 0.25, 0.26, 0.27, 0.28, 0.29000000000000004, 0.30000000000000004, 0.31000000000000005, 0.31999999999999995, 0.32999999999999996, 0.33999999999999997, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41000000000000003, 0.42000000000000004, 0.43000000000000005, 0.44000000000000006, 0.45000000000000007]}, {"amplitude": [8.119313436599242, 8.169313436599243, 8.219313436599242, 8.269313436599242, 8.319313436599241, 8.369313436599242, 8.419313436599243, 8.469313436599242, 8.519313436599242, 8.569313436599241, 8.619313436599242, 8.669313436599243, 8.719313436599242, 8.769313436599242, 8.819313436599241, 8.869313436599242, 8.919313436599243, 8.969313436599242, 9.019313436599242, 9.069313436599241, 9.119313436599242, 9.169313436599243, 9.219313436599242, 9.269313436599242, 9.319313436599241, 9.369313436599242, 9.419313436599243, 9.469313436599242, 9.519313436599242, 9.569313436599241, 9.619313436599242, 9.669313436599243, 9.719313436599242, 9.769313436599242, 9.819313436599241, 9.869313436599242, 9.919313436599243, 9.969313436599242, 10.019313436599242, 10.069313436599241, 10.119313436599242, 10.169313436599243, 10.219313436599242, 10.269313436599242, 10.319313436599241, 10.369313436599242, 10.419313436599243, 10.469313436599242, 10.519313436599242, 10.569313436599241, 10.619313436599242, 10.669313436599243, 10.719313436599242, 10.769313436599242, 10.819313436599241, 10.869313436599242], "phase": [-0.09955619646030801, -0.08955619646030802, -0.07955619646030801, -0.06955619646030801, -0.05955619646030801, -0.04955619646030801, -0.039556196460308016, -0.029556196460308007, -0.019556196460308012, -0.009556196460308017, 0.00044380353969199204, 0.010443803539691987, 0.020443803539691982, 0.03044380353969199, 0.040443803539692, 0.05044380353969198, 0.06044380353969199, 0.070443803539692, 0.08044380353969198, 0.09044380353969199, 0.100443803539692, 0.11044380353969198, 0.12044380353969199, 0.13044380353969198, 0.140443803539692, 0.150443803539692, 0.160443803539692, 0.17044380353969202, 0.18044380353969203, 0.19044380353969198, 0.200443803539692, 0.210443803539692, 0.220443803539692, 0.23044380353969202, 0.24044380353969202, 0.25044380353969203, 0.260443803539692, 0.270443803539692, 0.280443803539692, 0.290443803539692, 0.300443803539692, 0.31044380353969203, 0.320443803539692, 0.330443803539692, 0.340443803539692, 0.350443803539692, 0.360443803539692, 0.37044380353969203, 0.380443803539692, 0.390443803539692, 0.400443803539692, 0.410443803539692, 0.420443803539692, 0.430443803539692, 0.44044380353969204, 0.45044380353969204]}, {"amplitude": [8.24078963032123, 8.29078963032123, 8.340789630321229, 8.39078963032123, 8.440789630321229, 8.49078963032123, 8.54078963032123, 8.590789630321229, 8.64078963032123, 8.690789630321229, 8.74078963032123, 8.79078963032123, 8.840789630321229, 8.89078963032123, 8.940789630321229, 8.99078963032123, 9.04078963032123, 9.090789630321229, 9.14078963032123, 9.190789630321229, 9.24078963032123, 9.29078963032123, 9.340789630321229, 9.39078963032123, 9.440789630321229, 9.49078963032123, 9.54078963032123, 9.590789630321229, 9.64078963032123, 9.690789630321229, 9.74078963032123, 9.79078963032123, 9.840789630321229, 9.89078963032123, 9.940789630321229, 9.99078963032123, 10.04078963032123, 10.090789630321229, 10.14078963032123, 10.190789630321229, 10.24078963032123, 10.29078963032123, 10.340789630321229, 10.39078963032123, 10.440789630321229, 10.49078963032123, 10.54078963032123, 10.590789630321229, 10.64078963032123, 10.690789630321229, 10.74078963032123, 10.79078963032123, 10.840789630321229, 10.89078963032123, 10.940789630321229, 10.99078963032123], "phase": [-0.09822872507286888, -0.08822872507286889, -0.07822872507286888, -0.06822872507286888, -0.05822872507286888, -0.04822872507286888, -0.03822872507286888, -0.028228725072868874, -0.01822872507286888, -0.008228725072868884, 0.0017712749271311251, 0.01177127492713112, 0.021771274927131115, 0.031771274927131124, 0.04177127492713113, 0.051771274927131114, 0.06177127492713112, 0.07177127492713113, 0.08177127492713111, 0.09177127492713112, 0.10177127492713113, 0.11177127492713111, 0.12177127492713112, 0.13177127492713114, 0.1417712749271311, 0.1517712749271311, 0.16177127492713111, 0.17177127492713112, 0.18177127492713113, 0.19177127492713109, 0.2017712749271311, 0.2117712749271311, 0.2217712749271311, 0.23177127492713112, 0.24177127492713113, 0.25177127492713114, 0.2617712749271311, 0.2717712749271311, 0.2817712749271311, 0.2917712749271311, 0.30177127492713113, 0.31177127492713114, 0.3217712749271311, 0.3317712749271311, 0.3417712749271311, 0.3517712749271311, 0.3617712749271311, 0.37177127492713113, 0.3817712749271311, 0.3917712749271311, 0.4017712749271311, 0.4117712749271311, 0.4217712749271311, 0.43177127492713113, 0.44177127492713114, 0.45177127492713115]}, {"amplitude": [8.35086074438592, 8.400860744385922, 8.45086074438592, 8.500860744385921, 8.55086074438592, 8.60086074438592, 8.650860744385922, 8.70086074438592, 8.750860744385921, 8.80086074438592, 8.85086074438592, 8.900860744385922, 8.95086074438592, 9.000860744385921, 9.05086074438592, 9.10086074438592, 9.150860744385922, 9.20086074438592, 9.250860744385921, 9.30086074438592, 9.35086074438592, 9.400860744385922, 9.45086074438592, 9.500860744385921, 9.55086074438592, 9.60086074438592, 9.650860744385922, 9.70086074438592, 9.750860744385921, 9.80086074438592, 9.85086074438592, 9.900860744385922, 9.95086074438592, 10.000860744385921, 10.05086074438592, 10.10086074438592, 10.150860744385922, 10.20086074438592, 10.250860744385921, 10.30086074438592, 10.35086074438592, 10.400860744385922, 10.45086074438592, 10.500860744385921, 10.55086074438592, 10.60086074438592, 10.650860744385922, 10.70086074438592, 10.750860744385921, 10.80086074438592, 10.85086074438592, 10.900860744385922, 10.95086074438592, 11.000860744385921, 11.05086074438592, 11.10086074438592], "phase": [-0.09602936856769431, -0.08602936856769432, -0.07602936856769431, -0.06602936856769431, -0.05602936856769431, -0.04602936856769431, -0.036029368567694314, -0.026029368567694305, -0.01602936856769431, -0.006029368567694315, 0.0039706314323056935, 0.013970631432305688, 0.023970631432305683, 0.03397063143230569, 0.0439706314323057, 0.05397063143230568, 0.06397063143230569, 0.0739706314323057, 0.08397063143230568, 0.09397063143230569, 0.1039706314323057, 0.11397063143230568, 0.12397063143230569, 0.1339706314323057, 0.14397063143230568, 0.1539706314323057, 0.1639706314323057, 0.1739706314323057, 0.18397063143230571, 0.19397063143230567, 0.20397063143230568, 0.21397063143230569, 0.2239706314323057, 0.2339706314323057, 0.2439706314323057, 0.2539706314323057, 0.2639706314323057, 0.2739706314323057, 0.2839706314323057, 0.29397063143230573, 0.30397063143230574, 0.31397063143230575, 0.32397063143230564, 0.33397063143230565, 0.34397063143230566, 0.35397063143230567, 0.3639706314323057, 0.3739706314323057, 0.3839706314323057, 0.3939706314323057, 0.4039706314323057, 0.4139706314323057, 0.42397063143230573, 0.43397063143230574, 0.44397063143230575, 0.45397063143230576]}, {"amplitude": [8.43985504675198, 8.48985504675198, 8.53985504675198, 8.58985504675198, 8.639855046751979, 8.68985504675198, 8.73985504675198, 8.78985504675198, 8.83985504675198, 8.889855046751979, 8.93985504675198, 8.98985504675198, 9.03985504675198, 9.08985504675198, 9.139855046751979, 9.18985504675198, 9.23985504675198, 9.28985504675198, 9.33985504675198, 9.389855046751979, 9.43985504675198, 9.48985504675198, 9.53985504675198, 9.58985504675198, 9.639855046751979, 9.68985504675198, 9.73985504675198, 9.78985504675198, 9.83985504675198, 9.889855046751979, 9.93985504675198, 9.98985504675198, 10.03985504675198, 10.08985504675198, 10.139855046751979, 10.18985504675198, 10.23985504675198, 10.28985504675198, 10.33985504675198, 10.389855046751979, 10.43985504675198, 10.48985504675198, 10.53985504675198, 10.58985504675198, 10.639855046751979, 10.68985504675198, 10.73985504675198, 10.78985504675198, 10.83985504675198, 10.889855046751979, 10.93985504675198, 10.98985504675198, 11.03985504675198, 11.08985504675198, 11.139855046751979, 11.18985504675198], "phase": [-0.09297764858882512, -0.08297764858882513, -0.07297764858882512, -0.06297764858882512, -0.05297764858882512, -0.04297764858882512, -0.032977648588825126, -0.022977648588825117, -0.012977648588825122, -0.002977648588825127, 0.007022351411174882, 0.017022351411174877, 0.027022351411174872, 0.03702235141117488, 0.04702235141117489, 0.05702235141117487, 0.06702235141117488, 0.07702235141117489, 0.08702235141117487, 0.09702235141117488, 0.10702235141117489, 0.11702235141117487, 0.12702235141117488, 0.1370223514111749, 0.14702235141117487, 0.15702235141117488, 0.16702235141117489, 0.1770223514111749, 0.1870223514111749, 0.19702235141117486, 0.20702235141117487, 0.21702235141117487, 0.22702235141117488, 0.2370223514111749, 0.2470223514111749, 0.2570223514111749, 0.26702235141117486, 0.27702235141117487, 0.2870223514111749, 0.2970223514111749, 0.3070223514111749, 0.3170223514111749, 0.32702235141117486, 0.33702235141117487, 0.3470223514111749, 0.3570223514111749, 0.3670223514111749, 0.3770223514111749, 0.38702235141117486, 0.39702235141117487, 0.4070223514111749, 0.4170223514111749, 0.4270223514111749, 0.4370223514111749, 0.4470223514111749, 0.4570223514111749]}, {"amplitude": [8.50330390651181, 8.553303906511811, 8.60330390651181, 8.65330390651181, 8.70330390651181, 8.75330390651181, 8.803303906511811, 8.85330390651181, 8.90330390651181, 8.95330390651181, 9.00330390651181, 9.053303906511811, 9.10330390651181, 9.15330390651181, 9.20330390651181, 9.25330390651181, 9.303303906511811, 9.35330390651181, 9.40330390651181, 9.45330390651181, 9.50330390651181, 9.553303906511811, 9.60330390651181, 9.65330390651181, 9.70330390651181, 9.75330390651181, 9.803303906511811, 9.85330390651181, 9.90330390651181, 9.95330390651181, 10.00330390651181, 10.053303906511811, 10.10330390651181, 10.15330390651181, 10.20330390651181, 10.25330390651181, 10.303303906511811, 10.35330390651181, 10.40330390651181, 10.45330390651181, 10.50330390651181, 10.553303906511811, 10.60330390651181, 10.65330390651181, 10.70330390651181, 10.75330390651181, 10.803303906511811, 10.85330390651181, 10.90330390651181, 10.95330390651181, 11.00330390651181, 11.053303906511811, 11.10330390651181, 11.15330390651181, 11.20330390651181, 11.25330390651181], "phase": [-0.0891006524188368, -0.0791006524188368, -0.0691006524188368, -0.0591006524188368, -0.0491006524188368, -0.0391006524188368, -0.029100652418836803, -0.019100652418836794, -0.0091006524188368, 0.0008993475811631957, 0.010899347581163205, 0.0208993475811632, 0.030899347581163195, 0.0408993475811632, 0.05089934758116321, 0.06089934758116319, 0.0708993475811632, 0.08089934758116321, 0.09089934758116319, 0.1008993475811632, 0.11089934758116321, 0.12089934758116319, 0.1308993475811632, 0.1408993475811632, 0.1508993475811632, 0.1608993475811632, 0.1708993475811632, 0.18089934758116322, 0.19089934758116323, 0.20089934758116318, 0.2108993475811632, 0.2208993475811632, 0.2308993475811632, 0.24089934758116321, 0.2508993475811632, 0.26089934758116323, 0.2708993475811632, 0.2808993475811632, 0.2908993475811632, 0.3008993475811632, 0.3108993475811632, 0.32089934758116323, 0.3308993475811632, 0.3408993475811632, 0.3508993475811632, 0.3608993475811632, 0.3708993475811632, 0.38089934758116323, 0.3908993475811632, 0.4008993475811632, 0.4108993475811632, 0.4208993475811632, 0.4308993475811632, 0.4408993475811632, 0.45089934758116323, 0.46089934758116324]}, {"amplitude": [8.542498121828707, 8.592498121828708, 8.642498121828707, 8.692498121828708, 8.742498121828707, 8.792498121828707, 8.842498121828708, 8.892498121828707, 8.942498121828708, 8.992498121828707, 9.042498121828707, 9.092498121828708, 9.142498121828707, 9.192498121828708, 9.242498121828707, 9.292498121828707, 9.342498121828708, 9.392498121828707, 9.442498121828708, 9.492498121828707, 9.542498121828707, 9.592498121828708, 9.642498121828707, 9.692498121828708, 9.742498121828707, 9.792498121828707, 9.842498121828708, 9.892498121828707, 9.942498121828708, 9.992498121828707, 10.042498121828707, 10.092498121828708, 10.142498121828707, 10.192498121828708, 10.242498121828707, 10.292498121828707, 10.342498121828708, 10.392498121828707, 10.442498121828708, 10.492498121828707, 10.542498121828707, 10.592498121828708, 10.642498121828707, 10.692498121828708, 10.742498121828707, 10.792498121828707, 10.842498121828708, 10.892498121828707, 10.942498121828708, 10.992498121828707, 11.042498121828707, 11.092498121828708, 11.142498121828707, 11.192498121828708, 11.242498121828707, 11.292498121828707], "phase": [-0.08443279255020156, -0.07443279255020156, -0.06443279255020155, -0.05443279255020156, -0.04443279255020156, -0.034432792550201555, -0.02443279255020156, -0.01443279255020155, -0.004432792550201556, 0.005567207449798439, 0.015567207449798448, 0.025567207449798443, 0.03556720744979844, 0.04556720744979845, 0.055567207449798456, 0.06556720744979844, 0.07556720744979845, 0.08556720744979845, 0.09556720744979844, 0.10556720744979844, 0.11556720744979845, 0.12556720744979843, 0.13556720744979844, 0.14556720744979845, 0.15556720744979843, 0.16556720744979844, 0.17556720744979845, 0.18556720744979846, 0.19556720744979847, 0.20556720744979842, 0.21556720744979843, 0.22556720744979844, 0.23556720744979845, 0.24556720744979846, 0.25556720744979844, 0.26556720744979845, 0.27556720744979846, 0.28556720744979847, 0.2955672074497985, 0.3055672074497985, 0.3155672074497985, 0.3255672074497985, 0.3355672074497984, 0.3455672074497984, 0.3555672074497984, 0.3655672074497984, 0.37556720744979843, 0.38556720744979844, 0.39556720744979845, 0.40556720744979846, 0.41556720744979847, 0.4255672074497985, 0.4355672074497985, 0.4455672074497985, 0.4555672074497985, 0.4655672074497985]}, {"amplitude": [8.564216077479134, 8.614216077479135, 8.664216077479132, 8.714216077479133, 8.764216077479134, 8.814216077479134, 8.864216077479135, 8.914216077479132, 8.964216077479133, 9.014216077479134, 9.064216077479134, 9.114216077479135, 9.164216077479132, 9.214216077479133, 9.264216077479134, 9.314216077479134, 9.364216077479135, 9.414216077479132, 9.464216077479133, 9.514216077479134, 9.564216077479134, 9.614216077479135, 9.664216077479132, 9.714216077479133, 9.764216077479134, 9.814216077479134, 9.864216077479135, 9.914216077479132, 9.964216077479133, 10.014216077479134, 10.064216077479134, 10.114216077479135, 10.164216077479132, 10.214216077479133, 10.264216077479134, 10.314216077479134, 10.364216077479135, 10.414216077479132, 10.464216077479133, 10.514216077479134, 10.564216077479134, 10.614216077479135, 10.664216077479132, 10.714216077479133, 10.764216077479134, 10.814216077479134, 10.864216077479135, 10.914216077479132, 10.964216077479133, 11.014216077479134, 11.064216077479134, 11.114216077479135, 11.164216077479132, 11.214216077479133, 11.264216077479134, 11.314216077479134], "phase": [-0.07901550123756906, -0.06901550123756907, -0.05901550123756906, -0.049015501237569065, -0.03901550123756906, -0.02901550123756906, -0.019015501237569066, -0.009015501237569057, 0.0009844987624309381, 0.010984498762430933, 0.020984498762430942, 0.030984498762430937, 0.04098449876243093, 0.05098449876243094, 0.06098449876243095, 0.07098449876243093, 0.08098449876243094, 0.09098449876243095, 0.10098449876243093, 0.11098449876243094, 0.12098449876243095, 0.13098449876243093, 0.14098449876243094, 0.15098449876243095, 0.16098449876243093, 0.17098449876243094, 0.18098449876243095, 0.19098449876243095, 0.20098449876243096, 0.21098449876243092, 0.22098449876243093, 0.23098449876243093, 0.24098449876243094, 0.25098449876243095, 0.26098449876243096, 0.27098449876243097, 0.2809844987624309, 0.29098449876243093, 0.30098449876243094, 0.31098449876243095, 0.32098449876243096, 0.33098449876243097, 0.3409844987624309, 0.35098449876243093, 0.36098449876243094, 0.37098449876243095, 0.38098449876243096, 0.39098449876243097, 0.4009844987624309, 0.4109844987624309, 0.42098449876243094, 0.43098449876243095, 0.44098449876243095, 0.45098449876243096, 0.46098449876243097, 0.470984498762431]}, {"amplitude": [8.579662715226467, 8.629662715226468, 8.679662715226467, 8.729662715226468, 8.779662715226467, 8.829662715226467, 8.879662715226468, 8.929662715226467, 8.979662715226468, 9.029662715226467, 9.079662715226467, 9.129662715226468, 9.179662715226467, 9.229662715226468, 9.279662715226467, 9.329662715226467, 9.379662715226468, 9.429662715226467, 9.479662715226468, 9.529662715226467, 9.579662715226467, 9.629662715226468, 9.679662715226467, 9.729662715226468, 9.779662715226467, 9.829662715226467, 9.879662715226468, 9.929662715226467, 9.979662715226468, 10.029662715226467, 10.079662715226467, 10.129662715226468, 10.179662715226467, 10.229662715226468, 10.279662715226467, 10.329662715226467, 10.379662715226468, 10.429662715226467, 10.479662715226468, 10.529662715226467, 10.579662715226467, 10.629662715226468, 10.679662715226467, 10.729662715226468, 10.779662715226467, 10.829662715226467, 10.879662715226468, 10.929662715226467, 10.979662715226468, 11.029662715226467, 11.079662715226467, 11.129662715226468, 11.179662715226467, 11.229662715226468, 11.279662715226467, 11.329662715226467], "phase": [-0.07289686274214116, -0.06289686274214117, -0.05289686274214116, -0.04289686274214116, -0.03289686274214116, -0.022896862742141158, -0.012896862742141163, -0.002896862742141154, 0.007103137257858841, 0.017103137257858836, 0.027103137257858845, 0.03710313725785884, 0.047103137257858835, 0.057103137257858844, 0.06710313725785885, 0.07710313725785883, 0.08710313725785884, 0.09710313725785885, 0.10710313725785883, 0.11710313725785884, 0.12710313725785885, 0.13710313725785883, 0.14710313725785884, 0.15710313725785885, 0.16710313725785883, 0.17710313725785884, 0.18710313725785885, 0.19710313725785886, 0.20710313725785887, 0.21710313725785882, 0.22710313725785883, 0.23710313725785884, 0.24710313725785885, 0.2571031372578588, 0.26710313725785884, 0.27710313725785884, 0.28710313725785885, 0.29710313725785886, 0.30710313725785887, 0.3171031372578589, 0.3271031372578589, 0.3371031372578589, 0.3471031372578588, 0.3571031372578588, 0.3671031372578588, 0.3771031372578588, 0.38710313725785883, 0.39710313725785884, 0.40710313725785885, 0.41710313725785886, 0.42710313725785887, 0.4371031372578589, 0.4471031372578589, 0.4571031372578589, 0.4671031372578589, 0.4771031372578589]}, {"amplitude": [8.60276930320324, 8.652769303203241, 8.70276930320324, 8.752769303203241, 8.80276930320324, 8.85276930320324, 8.902769303203241, 8.95276930320324, 9.002769303203241, 9.05276930320324, 9.10276930320324, 9.152769303203241, 9.20276930320324, 9.252769303203241, 9.30276930320324, 9.35276930320324, 9.402769303203241, 9.45276930320324, 9.502769303203241, 9.55276930320324, 9.60276930320324, 9.652769303203241, 9.70276930320324, 9.752769303203241, 9.80276930320324, 9.85276930320324, 9.902769303203241, 9.95276930320324, 10.002769303203241, 10.05276930320324, 10.10276930320324, 10.152769303203241, 10.20276930320324, 10.252769303203241, 10.30276930320324, 10.35276930320324, 10.402769303203241, 10.45276930320324, 10.502769303203241, 10.55276930320324, 10.60276930320324, 10.652769303203241, 10.70276930320324, 10.752769303203241, 10.80276930320324, 10.85276930320324, 10.902769303203241, 10.95276930320324, 11.002769303203241, 11.05276930320324, 11.10276930320324, 11.152769303203241, 11.20276930320324, 11.252769303203241, 11.30276930320324, 11.35276930320324], "phase": [-0.06613118653236516, -0.05613118653236516, -0.04613118653236516, -0.03613118653236516, -0.02613118653236516, -0.016131186532365158, -0.006131186532365163, 0.0038688134676348462, 0.013868813467634841, 0.023868813467634836, 0.033868813467634845, 0.04386881346763484, 0.053868813467634835, 0.06386881346763484, 0.07386881346763485, 0.08386881346763483, 0.09386881346763484, 0.10386881346763485, 0.11386881346763483, 0.12386881346763484, 0.13386881346763485, 0.14386881346763483, 0.15386881346763484, 0.16386881346763485, 0.17386881346763483, 0.18386881346763484, 0.19386881346763485, 0.20386881346763486, 0.21386881346763487, 0.22386881346763482, 0.23386881346763483, 0.24386881346763484, 0.25386881346763485, 0.26386881346763486, 0.27386881346763486, 0.2838688134676349, 0.2938688134676348, 0.30386881346763484, 0.31386881346763484, 0.32386881346763485, 0.33386881346763486, 0.34386881346763487, 0.3538688134676348, 0.36386881346763483, 0.37386881346763484, 0.38386881346763485, 0.39386881346763486, 0.40386881346763487, 0.4138688134676348, 0.42386881346763483, 0.43386881346763484, 0.44386881346763485, 0.45386881346763486, 0.46386881346763487, 0.4738688134676349, 0.4838688134676349]}, {"amplitude": [8.648093919727312, 8.698093919727313, 8.748093919727312, 8.798093919727313, 8.848093919727312, 8.898093919727312, 8.948093919727313, 8.998093919727312, 9.048093919727313, 9.098093919727312, 9.148093919727312, 9.198093919727313, 9.248093919727312, 9.298093919727313, 9.348093919727312, 9.398093919727312, 9.448093919727313, 9.498093919727312, 9.548093919727313, 9.598093919727312, 9.648093919727312, 9.698093919727313, 9.748093919727312, 9.798093919727313, 9.848093919727312, 9.898093919727312, 9.948093919727313, 9.998093919727312, 10.048093919727313, 10.098093919727312, 10.148093919727312, 10.198093919727313, 10.248093919727312, 10.298093919727313, 10.348093919727312, 10.398093919727312, 10.448093919727313, 10.498093919727312, 10.548093919727313, 10.598093919727312, 10.648093919727312, 10.698093919727313, 10.748093919727312, 10.798093919727313, 10.848093919727312, 10.898093919727312, 10.948093919727313, 10.998093919727312, 11.048093919727313, 11.098093919727312, 11.148093919727312, 11.198093919727313, 11.248093919727312, 11.298093919727313, 11.348093919727312, 11.398093919727312], "phase": [-0.05877852522924734, -0.04877852522924734, -0.03877852522924734, -0.028778525229247343, -0.01877852522924734, -0.008778525229247339, 0.0012214747707526563, 0.011221474770752665, 0.02122147477075266, 0.031221474770752655, 0.041221474770752664, 0.05122147477075266, 0.061221474770752654, 0.07122147477075266, 0.08122147477075267, 0.09122147477075265, 0.10122147477075266, 0.11122147477075267, 0.12122147477075265, 0.13122147477075266, 0.14122147477075267, 0.15122147477075265, 0.16122147477075266, 0.17122147477075267, 0.18122147477075265, 0.19122147477075266, 0.20122147477075267, 0.21122147477075268, 0.22122147477075269, 0.23122147477075264, 0.24122147477075265, 0.25122147477075263, 0.26122147477075264, 0.27122147477075265, 0.28122147477075266, 0.29122147477075266, 0.3012214747707527, 0.3112214747707527, 0.3212214747707527, 0.3312214747707527, 0.3412214747707527, 0.3512214747707527, 0.3612214747707526, 0.3712214747707526, 0.38122147477075263, 0.39122147477075264, 0.40122147477075265, 0.41122147477075266, 0.42122147477075267, 0.4312214747707527, 0.4412214747707527, 0.4512214747707527, 0.4612214747707527, 0.4712214747707527, 0.4812214747707527, 0.49122147477075273]}, {"amplitude": [8.728618790848653, 8.778618790848654, 8.828618790848653, 8.878618790848654, 8.928618790848653, 8.978618790848653, 9.028618790848654, 9.078618790848653, 9.128618790848654, 9.178618790848653, 9.228618790848653, 9.278618790848654, 9.328618790848653, 9.378618790848654, 9.428618790848653, 9.478618790848653, 9.528618790848654, 9.578618790848653, 9.628618790848654, 9.678618790848653, 9.728618790848653, 9.778618790848654, 9.828618790848653, 9.878618790848654, 9.928618790848653, 9.978618790848653, 10.028618790848654, 10.078618790848653, 10.128618790848654, 10.178618790848653, 10.228618790848653, 10.278618790848654, 10.328618790848653, 10.378618790848654, 10.428618790848653, 10.478618790848653, 10.528618790848654, 10.578618790848653, 10.628618790848654, 10.678618790848653, 10.728618790848653, 10.778618790848654, 10.828618790848653, 10.878618790848654, 10.928618790848653, 10.978618790848653, 11.028618790848654, 11.078618790848653, 11.128618790848654, 11.178618790848653, 11.228618790848653, 11.278618790848654, 11.328618790848653, 11.378618790848654, 11.428618790848653, 11.478618790848653], "phase": [-0.0509041415750372, -0.040904141575037196, -0.030904141575037198, -0.0209041415750372, -0.010904141575037198, -0.0009041415750371956, 0.0090958584249628, 0.01909585842496281, 0.029095858424962803, 0.0390958584249628, 0.04909585842496281, 0.0590958584249628, 0.0690958584249628, 0.0790958584249628, 0.08909585842496281, 0.0990958584249628, 0.1090958584249628, 0.11909585842496281, 0.1290958584249628, 0.1390958584249628, 0.1490958584249628, 0.1590958584249628, 0.1690958584249628, 0.1790958584249628, 0.1890958584249628, 0.1990958584249628, 0.2090958584249628, 0.21909585842496282, 0.22909585842496283, 0.23909585842496278, 0.2490958584249628, 0.2590958584249628, 0.2690958584249628, 0.2790958584249628, 0.2890958584249628, 0.29909585842496283, 0.3090958584249628, 0.3190958584249628, 0.3290958584249628, 0.3390958584249628, 0.3490958584249628, 0.35909585842496283, 0.3690958584249628, 0.3790958584249628, 0.3890958584249628, 0.3990958584249628, 0.4090958584249628, 0.41909585842496283, 0.4290958584249628, 0.4390958584249628, 0.4490958584249628, 0.4590958584249628, 0.4690958584249628, 0.47909585842496283, 0.48909585842496284, 0.49909585842496285]}, {"amplitude": [8.853755241651248, 8.903755241651249, 8.953755241651248, 9.003755241651248, 9.053755241651247, 9.103755241651248, 9.153755241651249, 9.203755241651248, 9.253755241651248, 9.303755241651247, 9.353755241651248, 9.403755241651249, 9.453755241651248, 9.503755241651248, 9.553755241651247, 9.603755241651248, 9.653755241651249, 9.703755241651248, 9.753755241651248, 9.803755241651247, 9.853755241651248, 9.903755241651249, 9.953755241651248, 10.003755241651248, 10.053755241651247, 10.103755241651248, 10.153755241651249, 10.203755241651248, 10.253755241651248, 10.303755241651247, 10.353755241651248, 10.403755241651249, 10.453755241651248, 10.503755241651248, 10.553755241651247, 10.603755241651248, 10.653755241651249, 10.703755241651248, 10.753755241651248, 10.803755241651247, 10.853755241651248, 10.903755241651249, 10.953755241651248, 11.003755241651248, 11.053755241651247, 11.103755241651248, 11.153755241651249, 11.203755241651248, 11.253755241651248, 11.303755241651247, 11.353755241651248, 11.403755241651249, 11.453755241651248, 11.503755241651248, 11.553755241651247, 11.603755241651248], "phase": [-0.0425779291565073, -0.0325779291565073, -0.0225779291565073, -0.012577929156507302, -0.0025779291565073, 0.007422070843492702, 0.017422070843492697, 0.027422070843492706, 0.0374220708434927, 0.047422070843492696, 0.057422070843492705, 0.06742207084349269, 0.0774220708434927, 0.08742207084349271, 0.09742207084349272, 0.1074220708434927, 0.11742207084349271, 0.12742207084349272, 0.1374220708434927, 0.1474220708434927, 0.15742207084349272, 0.1674220708434927, 0.1774220708434927, 0.18742207084349272, 0.1974220708434927, 0.2074220708434927, 0.21742207084349272, 0.22742207084349272, 0.23742207084349273, 0.2474220708434927, 0.25742207084349267, 0.2674220708434927, 0.2774220708434927, 0.2874220708434927, 0.2974220708434927, 0.3074220708434927, 0.31742207084349267, 0.3274220708434927, 0.3374220708434927, 0.3474220708434927, 0.3574220708434927, 0.3674220708434927, 0.37742207084349266, 0.38742207084349267, 0.3974220708434927, 0.4074220708434927, 0.4174220708434927, 0.4274220708434927, 0.43742207084349266, 0.44742207084349267, 0.4574220708434927, 0.4674220708434927, 0.4774220708434927, 0.4874220708434927, 0.4974220708434927, 0.5074220708434928]}, {"amplitude": [9.02783798429081, 9.077837984290811, 9.12783798429081, 9.17783798429081, 9.22783798429081, 9.27783798429081, 9.327837984290811, 9.37783798429081, 9.42783798429081, 9.47783798429081, 9.52783798429081, 9.577837984290811, 9.62783798429081, 9.67783798429081, 9.72783798429081, 9.77783798429081, 9.827837984290811, 9.87783798429081, 9.92783798429081, 9.97783798429081, 10.02783798429081, 10.077837984290811, 10.12783798429081, 10.17783798429081, 10.22783798429081, 10.27783798429081, 10.327837984290811, 10.37783798429081, 10.42783798429081, 10.47783798429081, 10.52783798429081, 10.577837984290811, 10.62783798429081, 10.67783798429081, 10.72783798429081, 10.77783798429081, 10.827837984290811, 10.87783798429081, 10.92783798429081, 10.97783798429081, 11.02783798429081, 11.077837984290811, 11.12783798429081, 11.17783798429081, 11.22783798429081, 11.27783798429081, 11.327837984290811, 11.37783798429081, 11.42783798429081, 11.47783798429081, 11.52783798429081, 11.577837984290811, 11.62783798429081, 11.67783798429081, 11.72783798429081, 11.77783798429081], "phase": [-0.03387379202452914, -0.02387379202452914, -0.013873792024529142, -0.0038737920245291435, 0.0061262079754708584, 0.01612620797547086, 0.026126207975470855, 0.036126207975470864, 0.04612620797547086, 0.056126207975470854, 0.06612620797547086, 0.07612620797547086, 0.08612620797547085, 0.09612620797547086, 0.10612620797547087, 0.11612620797547085, 0.12612620797547086, 0.13612620797547087, 0.14612620797547085, 0.15612620797547086, 0.16612620797547087, 0.17612620797547085, 0.18612620797547086, 0.19612620797547087, 0.20612620797547085, 0.21612620797547086, 0.22612620797547087, 0.23612620797547088, 0.24612620797547088, 0.2561262079754708, 0.2661262079754708, 0.2761262079754708, 0.28612620797547084, 0.29612620797547085, 0.30612620797547085, 0.31612620797547086, 0.32612620797547087, 0.3361262079754709, 0.3461262079754709, 0.3561262079754709, 0.3661262079754709, 0.3761262079754709, 0.3861262079754708, 0.3961262079754708, 0.40612620797547083, 0.41612620797547084, 0.42612620797547085, 0.43612620797547086, 0.44612620797547087, 0.4561262079754709, 0.4661262079754709, 0.4761262079754709, 0.4861262079754709, 0.4961262079754709, 0.5061262079754709, 0.5161262079754709]}, {"amplitude": [9.249321848019687, 9.299321848019687, 9.349321848019686, 9.399321848019687, 9.449321848019686, 9.499321848019687, 9.549321848019687, 9.599321848019686, 9.649321848019687, 9.699321848019686, 9.749321848019687, 9.799321848019687, 9.849321848019686, 9.899321848019687, 9.949321848019686, 9.999321848019687, 10.049321848019687, 10.099321848019686, 10.149321848019687, 10.199321848019686, 10.249321848019687, 10.299321848019687, 10.349321848019686, 10.399321848019687, 10.449321848019686, 10.499321848019687, 10.549321848019687, 10.599321848019686, 10.649321848019687, 10.699321848019686, 10.749321848019687, 10.799321848019687, 10.849321848019686, 10.899321848019687, 10.949321848019686, 10.999321848019687, 11.049321848019687, 11.099321848019686, 11.149321848019687, 11.199321848019686, 11.249321848019687, 11.299321848019687, 11.349321848019686, 11.399321848019687, 11.449321848019686, 11.499321848019687, 11.549321848019687, 11.599321848019686, 11.649321848019687, 11.699321848019686, 11.749321848019687, 11.799321848019687, 11.849321848019686, 11.899321848019687, 11.949321848019686, 11.999321848019687], "phase": [-0.02486898871648545, -0.014868988716485449, -0.0048689887164854485, 0.00513101128351455, 0.015131011283514552, 0.025131011283514554, 0.03513101128351455, 0.04513101128351456, 0.05513101128351455, 0.06513101128351455, 0.07513101128351456, 0.08513101128351455, 0.09513101128351455, 0.10513101128351456, 0.11513101128351456, 0.12513101128351456, 0.13513101128351457, 0.14513101128351458, 0.15513101128351453, 0.16513101128351454, 0.17513101128351455, 0.18513101128351456, 0.19513101128351457, 0.20513101128351457, 0.21513101128351453, 0.22513101128351454, 0.23513101128351455, 0.24513101128351455, 0.25513101128351456, 0.2651310112835145, 0.2751310112835145, 0.28513101128351453, 0.29513101128351454, 0.30513101128351455, 0.31513101128351456, 0.32513101128351457, 0.3351310112835145, 0.34513101128351453, 0.35513101128351454, 0.36513101128351455, 0.37513101128351456, 0.38513101128351457, 0.3951310112835145, 0.40513101128351453, 0.41513101128351454, 0.42513101128351455, 0.43513101128351456, 0.44513101128351457, 0.4551310112835145, 0.46513101128351453, 0.47513101128351454, 0.48513101128351455, 0.49513101128351455, 0.5051310112835146, 0.5151310112835146, 0.5251310112835146]}, {"amplitude": [9.510795494231795, 9.560795494231796, 9.610795494231795, 9.660795494231795, 9.710795494231794, 9.760795494231795, 9.810795494231796, 9.860795494231795, 9.910795494231795, 9.960795494231794, 10.010795494231795, 10.060795494231796, 10.110795494231795, 10.160795494231795, 10.210795494231794, 10.260795494231795, 10.310795494231796, 10.360795494231795, 10.410795494231795, 10.460795494231794, 10.510795494231795, 10.560795494231796, 10.610795494231795, 10.660795494231795, 10.710795494231794, 10.760795494231795, 10.810795494231796, 10.860795494231795, 10.910795494231795, 10.960795494231794, 11.010795494231795, 11.060795494231796, 11.110795494231795, 11.160795494231795, 11.210795494231794, 11.260795494231795, 11.310795494231796, 11.360795494231795, 11.410795494231795, 11.460795494231794, 11.510795494231795, 11.560795494231796, 11.610795494231795, 11.660795494231795, 11.710795494231794, 11.760795494231795, 11.810795494231796, 11.860795494231795, 11.910795494231795, 11.960795494231794, 12.010795494231795, 12.060795494231796, 12.110795494231795, 12.160795494231795, 12.210795494231794, 12.260795494231795], "phase": [-0.01564344650402311, -0.00564344650402311, 0.004356553495976891, 0.014356553495976889, 0.02435655349597689, 0.034356553495976896, 0.04435655349597689, 0.0543565534959769, 0.0643565534959769, 0.07435655349597689, 0.0843565534959769, 0.0943565534959769, 0.10435655349597689, 0.1143565534959769, 0.12435655349597691, 0.1343565534959769, 0.1443565534959769, 0.1543565534959769, 0.1643565534959769, 0.1743565534959769, 0.1843565534959769, 0.19435655349597689, 0.2043565534959769, 0.2143565534959769, 0.22435655349597688, 0.2343565534959769, 0.2443565534959769, 0.2543565534959769, 0.2643565534959769, 0.2743565534959769, 0.2843565534959769, 0.2943565534959769, 0.3043565534959769, 0.3143565534959769, 0.3243565534959769, 0.3343565534959769, 0.3443565534959769, 0.3543565534959769, 0.3643565534959769, 0.3743565534959769, 0.3843565534959769, 0.3943565534959769, 0.4043565534959769, 0.4143565534959769, 0.4243565534959769, 0.4343565534959769, 0.4443565534959769, 0.4543565534959769, 0.4643565534959769, 0.4743565534959769, 0.4843565534959769, 0.4943565534959769, 0.5043565534959769, 0.5143565534959769, 0.5243565534959769, 0.5343565534959769]}, {"amplitude": [9.799811994791915, 9.849811994791915, 9.899811994791914, 9.949811994791915, 9.999811994791914, 10.049811994791915, 10.099811994791915, 10.149811994791914, 10.199811994791915, 10.249811994791914, 10.299811994791915, 10.349811994791915, 10.399811994791914, 10.449811994791915, 10.499811994791914, 10.549811994791915, 10.599811994791915, 10.649811994791914, 10.699811994791915, 10.749811994791914, 10.799811994791915, 10.849811994791915, 10.899811994791914, 10.949811994791915, 10.999811994791914, 11.049811994791915, 11.099811994791915, 11.149811994791914, 11.199811994791915, 11.249811994791914, 11.299811994791915, 11.349811994791915, 11.399811994791914, 11.449811994791915, 11.499811994791914, 11.549811994791915, 11.599811994791915, 11.649811994791914, 11.699811994791915, 11.749811994791914, 11.799811994791915, 11.849811994791915, 11.899811994791914, 11.949811994791915, 11.999811994791914, 12.049811994791915, 12.099811994791915, 12.149811994791914, 12.199811994791915, 12.249811994791914, 12.299811994791915, 12.349811994791915, 12.399811994791914, 12.449811994791915, 12.499811994791914, 12.549811994791915], "phase": [-0.006279051952931415, 0.003720948047068585, 0.013720948047068585, 0.023720948047068584, 0.033720948047068586, 0.04372094804706859, 0.05372094804706858, 0.0637209480470686, 0.07372094804706858, 0.08372094804706859, 0.0937209480470686, 0.10372094804706858, 0.11372094804706859, 0.1237209480470686, 0.1337209480470686, 0.1437209480470686, 0.1537209480470686, 0.1637209480470686, 0.17372094804706859, 0.1837209480470686, 0.1937209480470686, 0.20372094804706858, 0.2137209480470686, 0.2237209480470686, 0.23372094804706858, 0.2437209480470686, 0.2537209480470686, 0.2637209480470686, 0.2737209480470686, 0.28372094804706854, 0.29372094804706855, 0.30372094804706856, 0.31372094804706857, 0.3237209480470686, 0.3337209480470686, 0.3437209480470686, 0.35372094804706855, 0.36372094804706856, 0.37372094804706857, 0.3837209480470686, 0.3937209480470686, 0.4037209480470686, 0.41372094804706855, 0.42372094804706856, 0.43372094804706857, 0.4437209480470686, 0.4537209480470686, 0.4637209480470686, 0.47372094804706855, 0.48372094804706856, 0.49372094804706856, 0.5037209480470686, 0.5137209480470686, 0.5237209480470686, 0.5337209480470686, 0.5437209480470686]}, {"amplitude": [10.100421488225546, 10.150421488225547, 10.200421488225546, 10.250421488225546, 10.300421488225545, 10.350421488225546, 10.400421488225547, 10.450421488225546, 10.500421488225546, 10.550421488225545, 10.600421488225546, 10.650421488225547, 10.700421488225546, 10.750421488225546, 10.800421488225545, 10.850421488225546, 10.900421488225547, 10.950421488225546, 11.000421488225546, 11.050421488225545, 11.100421488225546, 11.150421488225547, 11.200421488225546, 11.250421488225546, 11.300421488225545, 11.350421488225546, 11.400421488225547, 11.450421488225546, 11.500421488225546, 11.550421488225545, 11.600421488225546, 11.650421488225547, 11.700421488225546, 11.750421488225546, 11.800421488225545, 11.850421488225546, 11.900421488225547, 11.950421488225546, 12.000421488225546, 12.050421488225545, 12.100421488225546, 12.150421488225547, 12.200421488225546, 12.250421488225546, 12.300421488225545, 12.350421488225546, 12.400421488225547, 12.450421488225546, 12.500421488225546, 12.550421488225545, 12.600421488225546, 12.650421488225547, 12.700421488225546, 12.750421488225546, 12.800421488225545, 12.850421488225546], "phase": [0.003141075907812787, 0.013141075907812787, 0.023141075907812787, 0.03314107590781279, 0.043141075907812784, 0.05314107590781279, 0.06314107590781279, 0.0731410759078128, 0.08314107590781279, 0.09314107590781279, 0.1031410759078128, 0.11314107590781279, 0.12314107590781279, 0.1331410759078128, 0.1431410759078128, 0.15314107590781278, 0.1631410759078128, 0.1731410759078128, 0.18314107590781278, 0.1931410759078128, 0.2031410759078128, 0.21314107590781278, 0.2231410759078128, 0.2331410759078128, 0.24314107590781278, 0.25314107590781276, 0.26314107590781277, 0.2731410759078128, 0.2831410759078128, 0.29314107590781274, 0.30314107590781275, 0.31314107590781276, 0.32314107590781277, 0.3331410759078128, 0.3431410759078128, 0.3531410759078128, 0.36314107590781275, 0.37314107590781276, 0.38314107590781277, 0.3931410759078128, 0.4031410759078128, 0.4131410759078128, 0.42314107590781275, 0.43314107590781276, 0.44314107590781276, 0.4531410759078128, 0.4631410759078128, 0.4731410759078128, 0.48314107590781274, 0.49314107590781275, 0.5031410759078128, 0.5131410759078128, 0.5231410759078128, 0.5331410759078128, 0.5431410759078128, 0.5531410759078128]}, {"amplitude": [10.395192569359123, 10.445192569359124, 10.495192569359123, 10.545192569359124, 10.595192569359122, 10.645192569359123, 10.695192569359124, 10.745192569359123, 10.795192569359124, 10.845192569359122, 10.895192569359123, 10.945192569359124, 10.995192569359123, 11.045192569359124, 11.095192569359122, 11.145192569359123, 11.195192569359124, 11.245192569359123, 11.295192569359124, 11.345192569359122, 11.395192569359123, 11.445192569359124, 11.495192569359123, 11.545192569359124, 11.595192569359122, 11.645192569359123, 11.695192569359124, 11.745192569359123, 11.795192569359124, 11.845192569359122, 11.895192569359123, 11.945192569359124, 11.995192569359123, 12.045192569359124, 12.095192569359122, 12.145192569359123, 12.195192569359124, 12.245192569359123, 12.295192569359124, 12.345192569359122, 12.395192569359123, 12.445192569359124, 12.495192569359123, 12.545192569359124, 12.595192569359122, 12.645192569359123, 12.695192569359124, 12.745192569359123, 12.795192569359124, 12.845192569359122, 12.895192569359123, 12.945192569359124, 12.995192569359123, 13.045192569359124, 13.095192569359122, 13.145192569359123], "phase": [0.012533323356430419, 0.02253332335643042, 0.032533323356430416, 0.04253332335643042, 0.05253332335643042, 0.06253332335643041, 0.07253332335643042, 0.08253332335643043, 0.09253332335643041, 0.10253332335643042, 0.11253332335643043, 0.12253332335643041, 0.13253332335643042, 0.14253332335643043, 0.15253332335643044, 0.16253332335643042, 0.17253332335643043, 0.18253332335643044, 0.19253332335643042, 0.20253332335643043, 0.21253332335643044, 0.22253332335643042, 0.23253332335643043, 0.24253332335643044, 0.2525333233564304, 0.2625333233564304, 0.27253332335643043, 0.28253332335643044, 0.29253332335643045, 0.3025333233564304, 0.3125333233564304, 0.3225333233564304, 0.33253332335643043, 0.34253332335643044, 0.35253332335643045, 0.36253332335643046, 0.3725333233564304, 0.3825333233564304, 0.39253332335643043, 0.40253332335643044, 0.41253332335643045, 0.42253332335643046, 0.4325333233564304, 0.4425333233564304, 0.45253332335643043, 0.46253332335643044, 0.47253332335643045, 0.48253332335643045, 0.4925333233564304, 0.5025333233564304, 0.5125333233564304, 0.5225333233564304, 0.5325333233564304, 0.5425333233564305, 0.5525333233564305, 0.5625333233564305]}, {"amplitude": [10.667440455625822, 10.717440455625823, 10.767440455625824, 10.817440455625825, 10.867440455625822, 10.917440455625822, 10.967440455625823, 11.017440455625824, 11.067440455625825, 11.117440455625822, 11.167440455625822, 11.217440455625823, 11.267440455625824, 11.317440455625825, 11.367440455625822, 11.417440455625822, 11.467440455625823, 11.517440455625824, 11.567440455625825, 11.617440455625822, 11.667440455625822, 11.717440455625823, 11.767440455625824, 11.817440455625825, 11.867440455625822, 11.917440455625822, 11.967440455625823, 12.017440455625824, 12.067440455625825, 12.117440455625822, 12.167440455625822, 12.217440455625823, 12.267440455625824, 12.317440455625825, 12.367440455625822, 12.417440455625822, 12.467440455625823, 12.517440455625824, 12.567440455625825, 12.617440455625822, 12.667440455625822, 12.717440455625823, 12.767440455625824, 12.817440455625825, 12.867440455625822, 12.917440455625822, 12.967440455625823, 13.017440455625824, 13.067440455625825, 13.117440455625822, 13.167440455625822, 13.217440455625823, 13.267440455625824, 13.317440455625825, 13.367440455625822, 13.417440455625822], "phase": [0.021814324139654284, 0.031814324139654286, 0.04181432413965429, 0.05181432413965428, 0.061814324139654285, 0.07181432413965429, 0.08181432413965428, 0.09181432413965429, 0.10181432413965429, 0.11181432413965428, 0.12181432413965429, 0.13181432413965427, 0.14181432413965428, 0.1518143241396543, 0.1618143241396543, 0.17181432413965428, 0.1818143241396543, 0.1918143241396543, 0.20181432413965428, 0.2118143241396543, 0.2218143241396543, 0.23181432413965428, 0.24181432413965429, 0.2518143241396543, 0.2618143241396543, 0.2718143241396543, 0.2818143241396543, 0.2918143241396543, 0.3018143241396543, 0.31181432413965426, 0.3218143241396543, 0.3318143241396543, 0.3418143241396543, 0.3518143241396543, 0.3618143241396543, 0.3718143241396543, 0.38181432413965427, 0.3918143241396543, 0.4018143241396543, 0.4118143241396543, 0.4218143241396543, 0.4318143241396543, 0.44181432413965427, 0.4518143241396543, 0.4618143241396543, 0.4718143241396543, 0.4818143241396543, 0.4918143241396543, 0.5018143241396542, 0.5118143241396542, 0.5218143241396542, 0.5318143241396542, 0.5418143241396542, 0.5518143241396543, 0.5618143241396543, 0.5718143241396543]}, {"amplitude": [10.903350943638442, 10.953350943638442, 11.003350943638441, 11.053350943638442, 11.103350943638441, 11.153350943638442, 11.203350943638442, 11.253350943638441, 11.303350943638442, 11.353350943638441, 11.403350943638442, 11.453350943638442, 11.503350943638441, 11.553350943638442, 11.603350943638441, 11.653350943638442, 11.703350943638442, 11.753350943638441, 11.803350943638442, 11.853350943638441, 11.903350943638442, 11.953350943638442, 12.003350943638441, 12.053350943638442, 12.103350943638441, 12.153350943638442, 12.203350943638442, 12.253350943638441, 12.303350943638442, 12.353350943638441, 12.403350943638442, 12.453350943638442, 12.503350943638441, 12.553350943638442, 12.603350943638441, 12.653350943638442, 12.703350943638442, 12.753350943638441, 12.803350943638442, 12.853350943638441, 12.903350943638442, 12.953350943638442, 13.003350943638441, 13.053350943638442, 13.103350943638441, 13.153350943638442, 13.203350943638442, 13.253350943638441, 13.303350943638442, 13.353350943638441, 13.403350943638442, 13.453350943638442, 13.503350943638441, 13.553350943638442, 13.603350943638441, 13.653350943638442], "phase": [0.03090169943749472, 0.04090169943749472, 0.050901699437494716, 0.06090169943749472, 0.07090169943749472, 0.08090169943749473, 0.09090169943749471, 0.10090169943749472, 0.11090169943749473, 0.12090169943749471, 0.13090169943749472, 0.14090169943749473, 0.1509016994374947, 0.16090169943749472, 0.17090169943749473, 0.1809016994374947, 0.19090169943749472, 0.20090169943749472, 0.2109016994374947, 0.22090169943749471, 0.23090169943749472, 0.2409016994374947, 0.25090169943749474, 0.26090169943749475, 0.2709016994374947, 0.2809016994374947, 0.2909016994374947, 0.30090169943749473, 0.31090169943749474, 0.3209016994374947, 0.3309016994374947, 0.3409016994374947, 0.3509016994374947, 0.3609016994374947, 0.37090169943749474, 0.38090169943749475, 0.3909016994374947, 0.4009016994374947, 0.4109016994374947, 0.4209016994374947, 0.43090169943749473, 0.44090169943749474, 0.4509016994374947, 0.4609016994374947, 0.4709016994374947, 0.4809016994374947, 0.49090169943749473, 0.5009016994374947, 0.5109016994374947, 0.5209016994374948, 0.5309016994374948, 0.5409016994374948, 0.5509016994374948, 0.5609016994374948, 0.5709016994374948, 0.5809016994374948]}, {"amplitude": [11.09370379979804, 11.143703799798041, 11.19370379979804, 11.243703799798041, 11.29370379979804, 11.34370379979804, 11.393703799798041, 11.44370379979804, 11.493703799798041, 11.54370379979804, 11.59370379979804, 11.643703799798041, 11.69370379979804, 11.743703799798041, 11.79370379979804, 11.84370379979804, 11.893703799798041, 11.94370379979804, 11.993703799798041, 12.04370379979804, 12.09370379979804, 12.143703799798041, 12.19370379979804, 12.243703799798041, 12.29370379979804, 12.34370379979804, 12.393703799798041, 12.44370379979804, 12.493703799798041, 12.54370379979804, 12.59370379979804, 12.643703799798041, 12.69370379979804, 12.743703799798041, 12.79370379979804, 12.84370379979804, 12.893703799798041, 12.94370379979804, 12.993703799798041, 13.04370379979804, 13.09370379979804, 13.143703799798041, 13.19370379979804, 13.243703799798041, 13.29370379979804, 13.34370379979804, 13.393703799798041, 13.44370379979804, 13.493703799798041, 13.54370379979804, 13.59370379979804, 13.643703799798041, 13.69370379979804, 13.743703799798041, 13.79370379979804, 13.84370379979804], "phase": [0.039714789063477994, 0.049714789063477996, 0.05971478906347799, 0.069714789063478, 0.079714789063478, 0.08971478906347799, 0.099714789063478, 0.10971478906347801, 0.11971478906347799, 0.129714789063478, 0.139714789063478, 0.149714789063478, 0.159714789063478, 0.169714789063478, 0.17971478906347801, 0.189714789063478, 0.199714789063478, 0.209714789063478, 0.219714789063478, 0.229714789063478, 0.239714789063478, 0.249714789063478, 0.259714789063478, 0.269714789063478, 0.27971478906347796, 0.289714789063478, 0.299714789063478, 0.309714789063478, 0.319714789063478, 0.32971478906347795, 0.33971478906347796, 0.34971478906347797, 0.359714789063478, 0.369714789063478, 0.379714789063478, 0.389714789063478, 0.39971478906347796, 0.40971478906347797, 0.419714789063478, 0.429714789063478, 0.439714789063478, 0.449714789063478, 0.45971478906347796, 0.46971478906347797, 0.479714789063478, 0.489714789063478, 0.499714789063478, 0.509714789063478, 0.519714789063478, 0.529714789063478, 0.539714789063478, 0.549714789063478, 0.559714789063478, 0.569714789063478, 0.5797147890634781, 0.5897147890634781]}, {"amplitude": [11.234955463943237, 11.284955463943238, 11.334955463943237, 11.384955463943237, 11.434955463943236, 11.484955463943237, 11.534955463943238, 11.584955463943237, 11.634955463943237, 11.684955463943236, 11.734955463943237, 11.784955463943238, 11.834955463943237, 11.884955463943237, 11.934955463943236, 11.984955463943237, 12.034955463943238, 12.084955463943237, 12.134955463943237, 12.184955463943236, 12.234955463943237, 12.284955463943238, 12.334955463943237, 12.384955463943237, 12.434955463943236, 12.484955463943237, 12.534955463943238, 12.584955463943237, 12.634955463943237, 12.684955463943236, 12.734955463943237, 12.784955463943238, 12.834955463943237, 12.884955463943237, 12.934955463943236, 12.984955463943237, 13.034955463943238, 13.084955463943237, 13.134955463943237, 13.184955463943236, 13.234955463943237, 13.284955463943238, 13.334955463943237, 13.384955463943237, 13.434955463943236, 13.484955463943237, 13.534955463943238, 13.584955463943237, 13.634955463943237, 13.684955463943236, 13.734955463943237, 13.784955463943238, 13.834955463943237, 13.884955463943237, 13.934955463943236, 13.984955463943237], "phase": [0.04817536741017149, 0.05817536741017149, 0.0681753674101715, 0.07817536741017149, 0.08817536741017148, 0.0981753674101715, 0.10817536741017149, 0.1181753674101715, 0.1281753674101715, 0.1381753674101715, 0.1481753674101715, 0.1581753674101715, 0.16817536741017147, 0.17817536741017148, 0.1881753674101715, 0.1981753674101715, 0.2081753674101715, 0.21817536741017152, 0.22817536741017147, 0.23817536741017148, 0.2481753674101715, 0.2581753674101715, 0.2681753674101715, 0.2781753674101715, 0.28817536741017147, 0.2981753674101715, 0.3081753674101715, 0.3181753674101715, 0.3281753674101715, 0.33817536741017146, 0.34817536741017147, 0.3581753674101715, 0.3681753674101715, 0.3781753674101715, 0.3881753674101715, 0.3981753674101715, 0.40817536741017146, 0.4181753674101715, 0.4281753674101715, 0.4381753674101715, 0.4481753674101715, 0.4581753674101715, 0.46817536741017146, 0.47817536741017147, 0.4881753674101715, 0.4981753674101715, 0.5081753674101716, 0.5181753674101716, 0.5281753674101715, 0.5381753674101715, 0.5481753674101715, 0.5581753674101715, 0.5681753674101715, 0.5781753674101715, 0.5881753674101715, 0.5981753674101715]}, {"amplitude": [11.329530887482868, 11.379530887482868, 11.429530887482867, 11.479530887482868, 11.529530887482867, 11.579530887482868, 11.629530887482868, 11.679530887482867, 11.729530887482868, 11.779530887482867, 11.829530887482868, 11.879530887482868, 11.929530887482867, 11.979530887482868, 12.029530887482867, 12.079530887482868, 12.129530887482868, 12.179530887482867, 12.229530887482868, 12.279530887482867, 12.329530887482868, 12.379530887482868, 12.429530887482867, 12.479530887482868, 12.529530887482867, 12.579530887482868, 12.629530887482868, 12.679530887482867, 12.729530887482868, 12.779530887482867, 12.829530887482868, 12.879530887482868, 12.929530887482867, 12.979530887482868, 13.029530887482867, 13.079530887482868, 13.129530887482868, 13.179530887482867, 13.229530887482868, 13.279530887482867, 13.329530887482868, 13.379530887482868, 13.429530887482867, 13.479530887482868, 13.529530887482867, 13.579530887482868, 13.629530887482868, 13.679530887482867, 13.729530887482868, 13.779530887482867, 13.829530887482868, 13.879530887482868, 13.929530887482867, 13.979530887482868, 14.029530887482867, 14.079530887482868], "phase": [0.05620833778521305, 0.06620833778521305, 0.07620833778521305, 0.08620833778521306, 0.09620833778521305, 0.10620833778521305, 0.11620833778521306, 0.12620833778521307, 0.13620833778521305, 0.14620833778521306, 0.15620833778521306, 0.16620833778521305, 0.17620833778521305, 0.18620833778521306, 0.19620833778521307, 0.20620833778521305, 0.21620833778521306, 0.22620833778521307, 0.23620833778521305, 0.24620833778521306, 0.25620833778521307, 0.266208337785213, 0.27620833778521303, 0.28620833778521304, 0.29620833778521305, 0.30620833778521306, 0.31620833778521307, 0.3262083377852131, 0.3362083377852131, 0.34620833778521304, 0.35620833778521305, 0.36620833778521306, 0.37620833778521307, 0.3862083377852131, 0.3962083377852131, 0.4062083377852131, 0.41620833778521305, 0.42620833778521305, 0.43620833778521306, 0.44620833778521307, 0.4562083377852131, 0.4662083377852131, 0.47620833778521304, 0.48620833778521305, 0.49620833778521306, 0.506208337785213, 0.516208337785213, 0.526208337785213, 0.536208337785213, 0.546208337785213, 0.5562083377852131, 0.5662083377852131, 0.5762083377852131, 0.5862083377852131, 0.5962083377852131, 0.6062083377852131]}, {"amplitude": [11.385285345302783, 11.435285345302784, 11.485285345302783, 11.535285345302784, 11.585285345302783, 11.635285345302783, 11.685285345302784, 11.735285345302783, 11.785285345302784, 11.835285345302783, 11.885285345302783, 11.935285345302784, 11.985285345302783, 12.035285345302784, 12.085285345302783, 12.135285345302783, 12.185285345302784, 12.235285345302783, 12.285285345302784, 12.335285345302783, 12.385285345302783, 12.435285345302784, 12.485285345302783, 12.535285345302784, 12.585285345302783, 12.635285345302783, 12.685285345302784, 12.735285345302783, 12.785285345302784, 12.835285345302783, 12.885285345302783, 12.935285345302784, 12.985285345302783, 13.035285345302784, 13.085285345302783, 13.135285345302783, 13.185285345302784, 13.235285345302783, 13.285285345302784, 13.335285345302783, 13.385285345302783, 13.435285345302784, 13.485285345302783, 13.535285345302784, 13.585285345302783, 13.635285345302783, 13.685285345302784, 13.735285345302783, 13.785285345302784, 13.835285345302783, 13.885285345302783, 13.935285345302784, 13.985285345302783, 14.035285345302784, 14.085285345302783, 14.135285345302783], "phase": [0.063742398974869, 0.07374239897486899, 0.083742398974869, 0.093742398974869, 0.103742398974869, 0.113742398974869, 0.123742398974869, 0.133742398974869, 0.143742398974869, 0.153742398974869, 0.163742398974869, 0.17374239897486898, 0.183742398974869, 0.193742398974869, 0.203742398974869, 0.213742398974869, 0.223742398974869, 0.233742398974869, 0.243742398974869, 0.253742398974869, 0.263742398974869, 0.27374239897486896, 0.28374239897486897, 0.293742398974869, 0.303742398974869, 0.313742398974869, 0.323742398974869, 0.333742398974869, 0.343742398974869, 0.353742398974869, 0.363742398974869, 0.373742398974869, 0.383742398974869, 0.393742398974869, 0.403742398974869, 0.41374239897486903, 0.423742398974869, 0.433742398974869, 0.443742398974869, 0.453742398974869, 0.463742398974869, 0.47374239897486903, 0.483742398974869, 0.493742398974869, 0.503742398974869, 0.5137423989748691, 0.5237423989748691, 0.5337423989748691, 0.543742398974869, 0.553742398974869, 0.563742398974869, 0.573742398974869, 0.583742398974869, 0.593742398974869, 0.603742398974869, 0.613742398974869]}, {"amplitude": [11.414213562373094, 11.464213562373095, 11.514213562373094, 11.564213562373094, 11.614213562373093, 11.664213562373094, 11.714213562373095, 11.764213562373094, 11.814213562373094, 11.864213562373093, 11.914213562373094, 11.964213562373095, 12.014213562373094, 12.064213562373094, 12.114213562373093, 12.164213562373094, 12.214213562373095, 12.264213562373094, 12.314213562373094, 12.364213562373093, 12.414213562373094, 12.464213562373095, 12.514213562373094, 12.564213562373094, 12.614213562373093, 12.664213562373094, 12.714213562373095, 12.764213562373094, 12.814213562373094, 12.864213562373093, 12.914213562373094, 12.964213562373095, 13.014213562373094, 13.064213562373094, 13.114213562373093, 13.164213562373094, 13.214213562373095, 13.264213562373094, 13.314213562373094, 13.364213562373093, 13.414213562373094, 13.464213562373095, 13.514213562373094, 13.564213562373094, 13.614213562373093, 13.664213562373094, 13.714213562373095, 13.764213562373094, 13.814213562373094, 13.864213562373093, 13.914213562373094, 13.964213562373095, 14.014213562373094, 14.064213562373094, 14.114213562373093, 14.164213562373094], "phase": [0.07071067811865474, 0.08071067811865473, 0.09071067811865474, 0.10071067811865474, 0.11071067811865473, 0.12071067811865474, 0.13071067811865472, 0.14071067811865473, 0.15071067811865474, 0.16071067811865475, 0.17071067811865476, 0.18071067811865474, 0.19071067811865472, 0.20071067811865473, 0.21071067811865474, 0.22071067811865475, 0.23071067811865476, 0.24071067811865476, 0.2507106781186547, 0.2607106781186547, 0.27071067811865474, 0.28071067811865474, 0.29071067811865475, 0.30071067811865476, 0.3107106781186547, 0.3207106781186547, 0.33071067811865473, 0.34071067811865474, 0.35071067811865475, 0.3607106781186547, 0.3707106781186547, 0.3807106781186547, 0.39071067811865473, 0.40071067811865474, 0.41071067811865475, 0.42071067811865476, 0.4307106781186547, 0.4407106781186547, 0.45071067811865473, 0.46071067811865474, 0.47071067811865475, 0.48071067811865476, 0.4907106781186547, 0.5007106781186548, 0.5107106781186548, 0.5207106781186548, 0.5307106781186548, 0.5407106781186548, 0.5507106781186547, 0.5607106781186547, 0.5707106781186547, 0.5807106781186547, 0.5907106781186547, 0.6007106781186548, 0.6107106781186548, 0.6207106781186548]}, {"amplitude": [11.430589119746175, 11.480589119746176, 11.530589119746175, 11.580589119746175, 11.630589119746174, 11.680589119746175, 11.730589119746176, 11.780589119746175, 11.830589119746175, 11.880589119746174, 11.930589119746175, 11.980589119746176, 12.030589119746175, 12.080589119746175, 12.130589119746174, 12.180589119746175, 12.230589119746176, 12.280589119746175, 12.330589119746175, 12.380589119746174, 12.430589119746175, 12.480589119746176, 12.530589119746175, 12.580589119746175, 12.630589119746174, 12.680589119746175, 12.730589119746176, 12.780589119746175, 12.830589119746175, 12.880589119746174, 12.930589119746175, 12.980589119746176, 13.030589119746175, 13.080589119746175, 13.130589119746174, 13.180589119746175, 13.230589119746176, 13.280589119746175, 13.330589119746175, 13.380589119746174, 13.430589119746175, 13.480589119746176, 13.530589119746175, 13.580589119746175, 13.630589119746174, 13.680589119746175, 13.730589119746176, 13.780589119746175, 13.830589119746175, 13.880589119746174, 13.930589119746175, 13.980589119746176, 14.030589119746175, 14.080589119746175, 14.130589119746174, 14.180589119746175], "phase": [0.07705132427757888, 0.08705132427757888, 0.09705132427757888, 0.10705132427757888, 0.11705132427757889, 0.12705132427757887, 0.13705132427757888, 0.1470513242775789, 0.1570513242775789, 0.16705132427757888, 0.1770513242775789, 0.18705132427757887, 0.19705132427757888, 0.20705132427757889, 0.2170513242775789, 0.22705132427757888, 0.23705132427757888, 0.2470513242775789, 0.2570513242775789, 0.2670513242775789, 0.2770513242775789, 0.28705132427757885, 0.29705132427757885, 0.30705132427757886, 0.31705132427757887, 0.3270513242775789, 0.3370513242775789, 0.3470513242775789, 0.3570513242775789, 0.36705132427757886, 0.37705132427757887, 0.3870513242775789, 0.3970513242775789, 0.4070513242775789, 0.4170513242775789, 0.4270513242775789, 0.43705132427757887, 0.4470513242775789, 0.4570513242775789, 0.4670513242775789, 0.4770513242775789, 0.4870513242775789, 0.49705132427757887, 0.5070513242775789, 0.5170513242775789, 0.527051324277579, 0.537051324277579, 0.547051324277579, 0.5570513242775789, 0.5670513242775789, 0.5770513242775789, 0.5870513242775789, 0.5970513242775789, 0.6070513242775789, 0.6170513242775789, 0.6270513242775789]}, {"amplitude": [11.448797016770516, 11.498797016770517, 11.548797016770516, 11.598797016770517, 11.648797016770516, 11.698797016770516, 11.748797016770517, 11.798797016770516, 11.848797016770517, 11.898797016770516, 11.948797016770516, 11.998797016770517, 12.048797016770516, 12.098797016770517, 12.148797016770516, 12.198797016770516, 12.248797016770517, 12.298797016770516, 12.348797016770517, 12.398797016770516, 12.448797016770516, 12.498797016770517, 12.548797016770516, 12.598797016770517, 12.648797016770516, 12.698797016770516, 12.748797016770517, 12.798797016770516, 12.848797016770517, 12.898797016770516, 12.948797016770516, 12.998797016770517, 13.048797016770516, 13.098797016770517, 13.148797016770516, 13.198797016770516, 13.248797016770517, 13.298797016770516, 13.348797016770517, 13.398797016770516, 13.448797016770516, 13.498797016770517, 13.548797016770516, 13.598797016770517, 13.648797016770516, 13.698797016770516, 13.748797016770517, 13.798797016770516, 13.848797016770517, 13.898797016770516, 13.948797016770516, 13.998797016770517, 14.048797016770516, 14.098797016770517, 14.148797016770516, 14.198797016770516], "phase": [0.08270805742745617, 0.09270805742745616, 0.10270805742745617, 0.11270805742745617, 0.12270805742745616, 0.13270805742745617, 0.14270805742745618, 0.1527080574274562, 0.16270805742745617, 0.17270805742745615, 0.18270805742745616, 0.19270805742745617, 0.20270805742745618, 0.2127080574274562, 0.2227080574274562, 0.23270805742745615, 0.24270805742745616, 0.25270805742745617, 0.2627080574274562, 0.2727080574274562, 0.2827080574274562, 0.29270805742745615, 0.30270805742745616, 0.31270805742745617, 0.3227080574274562, 0.3327080574274562, 0.3427080574274562, 0.3527080574274562, 0.3627080574274562, 0.37270805742745616, 0.38270805742745617, 0.3927080574274562, 0.4027080574274562, 0.4127080574274562, 0.4227080574274562, 0.4327080574274562, 0.44270805742745617, 0.4527080574274562, 0.4627080574274562, 0.4727080574274562, 0.4827080574274562, 0.4927080574274562, 0.5027080574274562, 0.5127080574274562, 0.5227080574274562, 0.5327080574274562, 0.5427080574274562, 0.5527080574274562, 0.5627080574274561, 0.5727080574274561, 0.5827080574274561, 0.5927080574274561, 0.6027080574274561, 0.6127080574274562, 0.6227080574274562, 0.6327080574274562]}, {"amplitude": [11.48116524434792, 11.531165244347921, 11.58116524434792, 11.63116524434792, 11.68116524434792, 11.73116524434792, 11.781165244347921, 11.83116524434792, 11.88116524434792, 11.93116524434792, 11.98116524434792, 12.031165244347921, 12.08116524434792, 12.13116524434792, 12.18116524434792, 12.23116524434792, 12.281165244347921, 12.33116524434792, 12.38116524434792, 12.43116524434792, 12.48116524434792, 12.531165244347921, 12.58116524434792, 12.63116524434792, 12.68116524434792, 12.73116524434792, 12.781165244347921, 12.83116524434792, 12.88116524434792, 12.93116524434792, 12.98116524434792, 13.031165244347921, 13.08116524434792, 13.13116524434792, 13.18116524434792, 13.23116524434792, 13.281165244347921, 13.33116524434792, 13.38116524434792, 13.43116524434792, 13.48116524434792, 13.531165244347921, 13.58116524434792, 13.63116524434792, 13.68116524434792, 13.73116524434792, 13.781165244347921, 13.83116524434792, 13.88116524434792, 13.93116524434792, 13.98116524434792, 14.031165244347921, 14.08116524434792, 14.13116524434792, 14.18116524434792, 14.23116524434792], "phase": [0.08763066800438636, 0.09763066800438636, 0.10763066800438637, 0.11763066800438636, 0.12763066800438636, 0.13763066800438636, 0.14763066800438635, 0.15763066800438635, 0.16763066800438636, 0.17763066800438637, 0.18763066800438638, 0.19763066800438636, 0.20763066800438634, 0.21763066800438635, 0.22763066800438636, 0.23763066800438637, 0.24763066800438638, 0.2576306680043864, 0.26763066800438634, 0.27763066800438635, 0.28763066800438636, 0.29763066800438637, 0.3076306680043864, 0.3176306680043864, 0.32763066800438634, 0.33763066800438635, 0.34763066800438636, 0.35763066800438637, 0.3676306680043864, 0.3776306680043863, 0.38763066800438634, 0.39763066800438635, 0.40763066800438635, 0.41763066800438636, 0.42763066800438637, 0.4376306680043864, 0.44763066800438633, 0.45763066800438634, 0.46763066800438635, 0.47763066800438636, 0.48763066800438637, 0.4976306680043864, 0.5076306680043864, 0.5176306680043864, 0.5276306680043864, 0.5376306680043864, 0.5476306680043864, 0.5576306680043864, 0.5676306680043863, 0.5776306680043863, 0.5876306680043863, 0.5976306680043864, 0.6076306680043864, 0.6176306680043864, 0.6276306680043864, 0.6376306680043864]}, {"amplitude": [11.536101232839481, 11.586101232839482, 11.636101232839481, 11.686101232839482, 11.73610123283948, 11.786101232839481, 11.836101232839482, 11.886101232839481, 11.936101232839482, 11.98610123283948, 12.036101232839481, 12.086101232839482, 12.136101232839481, 12.186101232839482, 12.23610123283948, 12.286101232839481, 12.336101232839482, 12.386101232839481, 12.436101232839482, 12.48610123283948, 12.536101232839481, 12.586101232839482, 12.636101232839481, 12.686101232839482, 12.73610123283948, 12.786101232839481, 12.836101232839482, 12.886101232839481, 12.936101232839482, 12.98610123283948, 13.036101232839481, 13.086101232839482, 13.136101232839481, 13.186101232839482, 13.23610123283948, 13.286101232839481, 13.336101232839482, 13.386101232839481, 13.436101232839482, 13.48610123283948, 13.536101232839481, 13.586101232839482, 13.636101232839481, 13.686101232839482, 13.73610123283948, 13.786101232839481, 13.836101232839482, 13.886101232839481, 13.936101232839482, 13.98610123283948, 14.036101232839481, 14.086101232839482, 14.136101232839481, 14.186101232839482, 14.23610123283948, 14.286101232839481], "phase": [0.09177546256839814, 0.10177546256839813, 0.11177546256839814, 0.12177546256839814, 0.13177546256839814, 0.14177546256839813, 0.15177546256839813, 0.16177546256839814, 0.17177546256839815, 0.18177546256839813, 0.19177546256839814, 0.20177546256839812, 0.21177546256839813, 0.22177546256839814, 0.23177546256839815, 0.24177546256839813, 0.2517754625683981, 0.2617754625683981, 0.27177546256839813, 0.28177546256839814, 0.29177546256839815, 0.30177546256839816, 0.31177546256839817, 0.3217754625683982, 0.3317754625683981, 0.34177546256839814, 0.35177546256839815, 0.36177546256839815, 0.37177546256839816, 0.3817754625683981, 0.3917754625683981, 0.40177546256839813, 0.41177546256839814, 0.42177546256839815, 0.43177546256839816, 0.44177546256839817, 0.4517754625683981, 0.46177546256839813, 0.47177546256839814, 0.48177546256839815, 0.49177546256839816, 0.5017754625683981, 0.5117754625683981, 0.5217754625683981, 0.5317754625683981, 0.5417754625683981, 0.5517754625683982, 0.5617754625683982, 0.5717754625683982, 0.5817754625683982, 0.5917754625683982, 0.6017754625683982, 0.6117754625683982, 0.6217754625683982, 0.6317754625683982, 0.6417754625683982]}, {"amplitude": [11.61679607770176, 11.666796077701761, 11.71679607770176, 11.76679607770176, 11.81679607770176, 11.86679607770176, 11.916796077701761, 11.96679607770176, 12.01679607770176, 12.06679607770176, 12.11679607770176, 12.166796077701761, 12.21679607770176, 12.26679607770176, 12.31679607770176, 12.36679607770176, 12.416796077701761, 12.46679607770176, 12.51679607770176, 12.56679607770176, 12.61679607770176, 12.666796077701761, 12.71679607770176, 12.76679607770176, 12.81679607770176, 12.86679607770176, 12.916796077701761, 12.96679607770176, 13.01679607770176, 13.06679607770176, 13.11679607770176, 13.166796077701761, 13.21679607770176, 13.26679607770176, 13.31679607770176, 13.36679607770176, 13.416796077701761, 13.46679607770176, 13.51679607770176, 13.56679607770176, 13.61679607770176, 13.666796077701761, 13.71679607770176, 13.76679607770176, 13.81679607770176, 13.86679607770176, 13.916796077701761, 13.96679607770176, 14.01679607770176, 14.06679607770176, 14.11679607770176, 14.166796077701761, 14.21679607770176, 14.26679607770176, 14.31679607770176, 14.36679607770176], "phase": [0.09510565162951536, 0.10510565162951535, 0.11510565162951536, 0.12510565162951537, 0.13510565162951535, 0.14510565162951536, 0.15510565162951534, 0.16510565162951535, 0.17510565162951536, 0.18510565162951537, 0.19510565162951538, 0.20510565162951536, 0.21510565162951534, 0.22510565162951535, 0.23510565162951536, 0.24510565162951536, 0.2551056516295154, 0.2651056516295154, 0.27510565162951534, 0.28510565162951534, 0.29510565162951535, 0.30510565162951536, 0.31510565162951537, 0.3251056516295154, 0.33510565162951533, 0.34510565162951534, 0.35510565162951535, 0.36510565162951536, 0.37510565162951537, 0.3851056516295153, 0.39510565162951533, 0.40510565162951534, 0.41510565162951535, 0.42510565162951536, 0.43510565162951537, 0.4451056516295154, 0.45510565162951533, 0.46510565162951534, 0.47510565162951535, 0.48510565162951536, 0.49510565162951536, 0.5051056516295154, 0.5151056516295154, 0.5251056516295154, 0.5351056516295154, 0.5451056516295154, 0.5551056516295154, 0.5651056516295154, 0.5751056516295153, 0.5851056516295153, 0.5951056516295153, 0.6051056516295154, 0.6151056516295154, 0.6251056516295154, 0.6351056516295154, 0.6451056516295154]}, {"amplitude": [11.720679551044757, 11.770679551044758, 11.820679551044757, 11.870679551044757, 11.920679551044756, 11.970679551044757, 12.020679551044758, 12.070679551044757, 12.120679551044757, 12.170679551044756, 12.220679551044757, 12.270679551044758, 12.320679551044757, 12.370679551044757, 12.420679551044756, 12.470679551044757, 12.520679551044758, 12.570679551044757, 12.620679551044757, 12.670679551044756, 12.720679551044757, 12.770679551044758, 12.820679551044757, 12.870679551044757, 12.920679551044756, 12.970679551044757, 13.020679551044758, 13.070679551044757, 13.120679551044757, 13.170679551044756, 13.220679551044757, 13.270679551044758, 13.320679551044757, 13.370679551044757, 13.420679551044756, 13.470679551044757, 13.520679551044758, 13.570679551044757, 13.620679551044757, 13.670679551044756, 13.720679551044757, 13.770679551044758, 13.820679551044757, 13.870679551044757, 13.920679551044756, 13.970679551044757, 14.020679551044758, 14.070679551044757, 14.120679551044757, 14.170679551044756, 14.220679551044757, 14.270679551044758, 14.320679551044757, 14.370679551044757, 14.420679551044756, 14.470679551044757], "phase": [0.09759167619387472, 0.10759167619387472, 0.11759167619387473, 0.12759167619387474, 0.13759167619387472, 0.14759167619387473, 0.1575916761938747, 0.16759167619387472, 0.17759167619387473, 0.18759167619387473, 0.19759167619387474, 0.20759167619387472, 0.2175916761938747, 0.22759167619387471, 0.23759167619387472, 0.24759167619387473, 0.25759167619387474, 0.26759167619387475, 0.2775916761938747, 0.2875916761938747, 0.2975916761938747, 0.30759167619387473, 0.31759167619387474, 0.32759167619387475, 0.3375916761938747, 0.3475916761938747, 0.3575916761938747, 0.36759167619387473, 0.37759167619387474, 0.3875916761938747, 0.3975916761938747, 0.4075916761938747, 0.4175916761938747, 0.4275916761938747, 0.43759167619387473, 0.44759167619387474, 0.4575916761938747, 0.4675916761938747, 0.4775916761938747, 0.4875916761938747, 0.49759167619387473, 0.5075916761938748, 0.5175916761938747, 0.5275916761938747, 0.5375916761938747, 0.5475916761938747, 0.5575916761938747, 0.5675916761938747, 0.5775916761938747, 0.5875916761938748, 0.5975916761938748, 0.6075916761938748, 0.6175916761938748, 0.6275916761938748, 0.6375916761938748, 0.6475916761938748]}, {"amplitude": [11.839703300398439, 11.88970330039844, 11.939703300398438, 11.989703300398439, 12.039703300398438, 12.089703300398439, 12.13970330039844, 12.189703300398438, 12.239703300398439, 12.289703300398438, 12.339703300398439, 12.38970330039844, 12.439703300398438, 12.489703300398439, 12.539703300398438, 12.589703300398439, 12.63970330039844, 12.689703300398438, 12.739703300398439, 12.789703300398438, 12.839703300398439, 12.88970330039844, 12.939703300398438, 12.989703300398439, 13.039703300398438, 13.089703300398439, 13.13970330039844, 13.189703300398438, 13.239703300398439, 13.289703300398438, 13.339703300398439, 13.38970330039844, 13.439703300398438, 13.489703300398439, 13.539703300398438, 13.589703300398439, 13.63970330039844, 13.689703300398438, 13.739703300398439, 13.789703300398438, 13.839703300398439, 13.88970330039844, 13.939703300398438, 13.989703300398439, 14.039703300398438, 14.089703300398439, 14.13970330039844, 14.189703300398438, 14.239703300398439, 14.289703300398438, 14.339703300398439, 14.38970330039844, 14.439703300398438, 14.489703300398439, 14.539703300398438, 14.589703300398439], "phase": [0.09921147013144777, 0.10921147013144776, 0.11921147013144777, 0.12921147013144776, 0.13921147013144777, 0.14921147013144775, 0.15921147013144776, 0.16921147013144777, 0.17921147013144778, 0.18921147013144776, 0.19921147013144777, 0.20921147013144775, 0.21921147013144776, 0.22921147013144777, 0.23921147013144778, 0.24921147013144776, 0.25921147013144774, 0.26921147013144775, 0.27921147013144776, 0.28921147013144777, 0.2992114701314478, 0.3092114701314478, 0.3192114701314478, 0.3292114701314478, 0.33921147013144776, 0.34921147013144777, 0.3592114701314478, 0.3692114701314478, 0.3792114701314478, 0.38921147013144775, 0.39921147013144775, 0.40921147013144776, 0.41921147013144777, 0.4292114701314478, 0.4392114701314478, 0.4492114701314478, 0.45921147013144775, 0.46921147013144776, 0.47921147013144777, 0.4892114701314478, 0.4992114701314478, 0.5092114701314479, 0.5192114701314477, 0.5292114701314478, 0.5392114701314478, 0.5492114701314478, 0.5592114701314478, 0.5692114701314478, 0.5792114701314477, 0.5892114701314477, 0.5992114701314477, 0.6092114701314477, 0.6192114701314477, 0.6292114701314477, 0.6392114701314477, 0.6492114701314478]}, {"amplitude": [11.961413150662173, 12.011413150662174, 12.061413150662172, 12.111413150662173, 12.161413150662172, 12.211413150662173, 12.261413150662174, 12.311413150662172, 12.361413150662173, 12.411413150662172, 12.461413150662173, 12.511413150662174, 12.561413150662172, 12.611413150662173, 12.661413150662172, 12.711413150662173, 12.761413150662174, 12.811413150662172, 12.861413150662173, 12.911413150662172, 12.961413150662173, 13.011413150662174, 13.061413150662172, 13.111413150662173, 13.161413150662172, 13.211413150662173, 13.261413150662174, 13.311413150662172, 13.361413150662173, 13.411413150662172, 13.461413150662173, 13.511413150662174, 13.561413150662172, 13.611413150662173, 13.661413150662172, 13.711413150662173, 13.761413150662174, 13.811413150662172, 13.861413150662173, 13.911413150662172, 13.961413150662173, 14.011413150662174, 14.061413150662172, 14.111413150662173, 14.161413150662172, 14.211413150662173, 14.261413150662174, 14.311413150662172, 14.361413150662173, 14.411413150662172, 14.461413150662173, 14.511413150662174, 14.561413150662172, 14.611413150662173, 14.661413150662172, 14.711413150662173], "phase": [0.09995065603657316, 0.10995065603657316, 0.11995065603657316, 0.12995065603657316, 0.13995065603657317, 0.14995065603657315, 0.15995065603657316, 0.16995065603657317, 0.17995065603657318, 0.18995065603657316, 0.19995065603657317, 0.20995065603657315, 0.21995065603657316, 0.22995065603657316, 0.23995065603657317, 0.24995065603657315, 0.2599506560365732, 0.2699506560365732, 0.27995065603657315, 0.28995065603657316, 0.29995065603657317, 0.3099506560365731, 0.31995065603657313, 0.32995065603657314, 0.33995065603657315, 0.34995065603657316, 0.35995065603657317, 0.3699506560365732, 0.3799506560365732, 0.38995065603657314, 0.39995065603657315, 0.40995065603657316, 0.41995065603657317, 0.4299506560365732, 0.4399506560365732, 0.4499506560365732, 0.45995065603657315, 0.46995065603657316, 0.47995065603657316, 0.4899506560365732, 0.4999506560365732, 0.5099506560365732, 0.5199506560365732, 0.5299506560365732, 0.5399506560365732, 0.5499506560365732, 0.5599506560365732, 0.5699506560365732, 0.5799506560365731, 0.5899506560365732, 0.5999506560365732, 0.6099506560365732, 0.6199506560365732, 0.6299506560365732, 0.6399506560365732, 0.6499506560365732]}, {"amplitude": [12.070660423006, 12.120660423006, 12.170660423006, 12.220660423006, 12.270660423006, 12.320660423006, 12.370660423006, 12.420660423006, 12.470660423006, 12.520660423006, 12.570660423006, 12.620660423006, 12.670660423006, 12.720660423006, 12.770660423006, 12.820660423006, 12.870660423006, 12.920660423006, 12.970660423006, 13.020660423006, 13.070660423006, 13.120660423006, 13.170660423006, 13.220660423006, 13.270660423006, 13.320660423006, 13.370660423006, 13.420660423006, 13.470660423006, 13.520660423006, 13.570660423006, 13.620660423006, 13.670660423006, 13.720660423006, 13.770660423006, 13.820660423006, 13.870660423006, 13.920660423006, 13.970660423006, 14.020660423006, 14.070660423006, 14.120660423006, 14.170660423006, 14.220660423006, 14.270660423006, 14.320660423006, 14.370660423006, 14.420660423006, 14.470660423006, 14.520660423006, 14.570660423006, 14.620660423006, 14.670660423006, 14.720660423006, 14.770660423006, 14.820660423006], "phase": [0.09980267284282716, 0.10980267284282716, 0.11980267284282717, 0.12980267284282715, 0.13980267284282716, 0.14980267284282717, 0.15980267284282718, 0.16980267284282718, 0.17980267284282717, 0.18980267284282715, 0.19980267284282716, 0.20980267284282716, 0.21980267284282717, 0.22980267284282718, 0.2398026728428272, 0.24980267284282714, 0.25980267284282715, 0.26980267284282716, 0.27980267284282717, 0.2898026728428272, 0.2998026728428272, 0.30980267284282714, 0.31980267284282715, 0.32980267284282716, 0.33980267284282717, 0.3498026728428272, 0.3598026728428272, 0.3698026728428272, 0.3798026728428272, 0.38980267284282716, 0.39980267284282717, 0.4098026728428272, 0.4198026728428272, 0.4298026728428272, 0.4398026728428272, 0.4498026728428272, 0.45980267284282716, 0.4698026728428272, 0.4798026728428272, 0.4898026728428272, 0.4998026728428272, 0.5098026728428272, 0.5198026728428271, 0.5298026728428271, 0.5398026728428271, 0.5498026728428271, 0.5598026728428271, 0.5698026728428272, 0.5798026728428272, 0.5898026728428272, 0.5998026728428272, 0.6098026728428272, 0.6198026728428272, 0.6298026728428272, 0.6398026728428272, 0.6498026728428272]}, {"amplitude": [12.151712256878017, 12.201712256878018, 12.251712256878017, 12.301712256878018, 12.351712256878017, 12.401712256878017, 12.451712256878018, 12.501712256878017, 12.551712256878018, 12.601712256878017, 12.651712256878017, 12.701712256878018, 12.751712256878017, 12.801712256878018, 12.851712256878017, 12.901712256878017, 12.951712256878018, 13.001712256878017, 13.051712256878018, 13.101712256878017, 13.151712256878017, 13.201712256878018, 13.251712256878017, 13.301712256878018, 13.351712256878017, 13.401712256878017, 13.451712256878018, 13.501712256878017, 13.551712256878018, 13.601712256878017, 13.651712256878017, 13.701712256878018, 13.751712256878017, 13.801712256878018, 13.851712256878017, 13.901712256878017, 13.951712256878018, 14.001712256878017, 14.051712256878018, 14.101712256878017, 14.151712256878017, 14.201712256878018, 14.251712256878017, 14.301712256878018, 14.351712256878017, 14.401712256878017, 14.451712256878018, 14.501712256878017, 14.551712256878018, 14.601712256878017, 14.651712256878017, 14.701712256878018, 14.751712256878017, 14.801712256878018, 14.851712256878017, 14.901712256878017], "phase": [0.0987688340595138, 0.10876883405951379, 0.1187688340595138, 0.12876883405951378, 0.1387688340595138, 0.1487688340595138, 0.1587688340595138, 0.16876883405951382, 0.1787688340595138, 0.18876883405951378, 0.1987688340595138, 0.2087688340595138, 0.2187688340595138, 0.22876883405951381, 0.23876883405951382, 0.24876883405951378, 0.2587688340595138, 0.2687688340595138, 0.2787688340595138, 0.2887688340595138, 0.2987688340595138, 0.3087688340595138, 0.3187688340595138, 0.3287688340595138, 0.3387688340595138, 0.3487688340595138, 0.3587688340595138, 0.36876883405951383, 0.37876883405951384, 0.3887688340595138, 0.3987688340595138, 0.4087688340595138, 0.4187688340595138, 0.4287688340595138, 0.43876883405951383, 0.44876883405951384, 0.4587688340595138, 0.4687688340595138, 0.4787688340595138, 0.4887688340595138, 0.49876883405951383, 0.5087688340595138, 0.5187688340595138, 0.5287688340595138, 0.5387688340595138, 0.5487688340595138, 0.5587688340595138, 0.5687688340595138, 0.5787688340595137, 0.5887688340595137, 0.5987688340595138, 0.6087688340595138, 0.6187688340595138, 0.6287688340595138, 0.6387688340595138, 0.6487688340595138]}, {"amplitude": [12.190464699907867, 12.240464699907868, 12.290464699907867, 12.340464699907868, 12.390464699907866, 12.440464699907867, 12.490464699907868, 12.540464699907867, 12.590464699907868, 12.640464699907866, 12.690464699907867, 12.740464699907868, 12.790464699907867, 12.840464699907868, 12.890464699907866, 12.940464699907867, 12.990464699907868, 13.040464699907867, 13.090464699907868, 13.140464699907866, 13.190464699907867, 13.240464699907868, 13.290464699907867, 13.340464699907868, 13.390464699907866, 13.440464699907867, 13.490464699907868, 13.540464699907867, 13.590464699907868, 13.640464699907866, 13.690464699907867, 13.740464699907868, 13.790464699907867, 13.840464699907868, 13.890464699907866, 13.940464699907867, 13.990464699907868, 14.040464699907867, 14.090464699907868, 14.140464699907866, 14.190464699907867, 14.240464699907868, 14.290464699907867, 14.340464699907868, 14.390464699907866, 14.440464699907867, 14.490464699907868, 14.540464699907867, 14.590464699907868, 14.640464699907866, 14.690464699907867, 14.740464699907868, 14.790464699907867, 14.840464699907868, 14.890464699907866, 14.940464699907867], "phase": [0.09685831611286311, 0.1068583161128631, 0.11685831611286311, 0.1268583161128631, 0.13685831611286312, 0.1468583161128631, 0.1568583161128631, 0.16685831611286311, 0.17685831611286312, 0.1868583161128631, 0.1968583161128631, 0.2068583161128631, 0.2168583161128631, 0.2268583161128631, 0.23685831611286312, 0.2468583161128631, 0.25685831611286314, 0.26685831611286315, 0.2768583161128631, 0.2868583161128631, 0.2968583161128631, 0.30685831611286307, 0.3168583161128631, 0.3268583161128631, 0.3368583161128631, 0.3468583161128631, 0.3568583161128631, 0.3668583161128631, 0.37685831611286313, 0.3868583161128631, 0.3968583161128631, 0.4068583161128631, 0.4168583161128631, 0.4268583161128631, 0.43685831611286313, 0.44685831611286314, 0.4568583161128631, 0.4668583161128631, 0.4768583161128631, 0.4868583161128631, 0.49685831611286313, 0.5068583161128631, 0.516858316112863, 0.526858316112863, 0.536858316112863, 0.5468583161128631, 0.5568583161128631, 0.5668583161128631, 0.5768583161128631, 0.5868583161128631, 0.5968583161128631, 0.6068583161128631, 0.6168583161128631, 0.6268583161128631, 0.6368583161128631, 0.6468583161128632]}, {"amplitude": [12.176447713127057, 12.226447713127058, 12.276447713127057, 12.326447713127058, 12.376447713127057, 12.426447713127057, 12.476447713127058, 12.526447713127057, 12.576447713127058, 12.626447713127057, 12.676447713127057, 12.726447713127058, 12.776447713127057, 12.826447713127058, 12.876447713127057, 12.926447713127057, 12.976447713127058, 13.026447713127057, 13.076447713127058, 13.126447713127057, 13.176447713127057, 13.226447713127058, 13.276447713127057, 13.326447713127058, 13.376447713127057, 13.426447713127057, 13.476447713127058, 13.526447713127057, 13.576447713127058, 13.626447713127057, 13.676447713127057, 13.726447713127058, 13.776447713127057, 13.826447713127058, 13.876447713127057, 13.926447713127057, 13.976447713127058, 14.026447713127057, 14.076447713127058, 14.126447713127057, 14.176447713127057, 14.226447713127058, 14.276447713127057, 14.326447713127058, 14.376447713127057, 14.426447713127057, 14.476447713127058, 14.526447713127057, 14.576447713127058, 14.626447713127057, 14.676447713127057, 14.726447713127058, 14.776447713127057, 14.826447713127058, 14.876447713127057, 14.926447713127057], "phase": [0.09408807689542258, 0.10408807689542257, 0.11408807689542258, 0.12408807689542257, 0.13408807689542257, 0.14408807689542258, 0.1540880768954226, 0.1640880768954226, 0.17408807689542258, 0.18408807689542256, 0.19408807689542257, 0.20408807689542258, 0.21408807689542259, 0.2240880768954226, 0.2340880768954226, 0.24408807689542256, 0.25408807689542257, 0.2640880768954226, 0.2740880768954226, 0.2840880768954226, 0.2940880768954226, 0.30408807689542255, 0.31408807689542256, 0.32408807689542257, 0.3340880768954226, 0.3440880768954226, 0.3540880768954226, 0.3640880768954226, 0.3740880768954226, 0.38408807689542257, 0.3940880768954226, 0.4040880768954226, 0.4140880768954226, 0.4240880768954226, 0.4340880768954226, 0.4440880768954226, 0.4540880768954226, 0.4640880768954226, 0.4740880768954226, 0.4840880768954226, 0.4940880768954226, 0.5040880768954226, 0.5140880768954226, 0.5240880768954226, 0.5340880768954226, 0.5440880768954226, 0.5540880768954226, 0.5640880768954226, 0.5740880768954225, 0.5840880768954225, 0.5940880768954225, 0.6040880768954225, 0.6140880768954226, 0.6240880768954226, 0.6340880768954226, 0.6440880768954226]}, {"amplitude": [12.104340280150645, 12.154340280150645, 12.204340280150644, 12.254340280150645, 12.304340280150644, 12.354340280150645, 12.404340280150645, 12.454340280150644, 12.504340280150645, 12.554340280150644, 12.604340280150645, 12.654340280150645, 12.704340280150644, 12.754340280150645, 12.804340280150644, 12.854340280150645, 12.904340280150645, 12.954340280150644, 13.004340280150645, 13.054340280150644, 13.104340280150645, 13.154340280150645, 13.204340280150644, 13.254340280150645, 13.304340280150644, 13.354340280150645, 13.404340280150645, 13.454340280150644, 13.504340280150645, 13.554340280150644, 13.604340280150645, 13.654340280150645, 13.704340280150644, 13.754340280150645, 13.804340280150644, 13.854340280150645, 13.904340280150645, 13.954340280150644, 14.004340280150645, 14.054340280150644, 14.104340280150645, 14.154340280150645, 14.204340280150644, 14.254340280150645, 14.304340280150644, 14.354340280150645, 14.404340280150645, 14.454340280150644, 14.504340280150645, 14.554340280150644, 14.604340280150645, 14.654340280150645, 14.704340280150644, 14.754340280150645, 14.804340280150644, 14.854340280150645], "phase": [0.09048270524660193, 0.10048270524660192, 0.11048270524660193, 0.12048270524660193, 0.13048270524660194, 0.14048270524660195, 0.15048270524660193, 0.16048270524660194, 0.17048270524660192, 0.18048270524660193, 0.19048270524660194, 0.20048270524660194, 0.21048270524660193, 0.22048270524660193, 0.23048270524660194, 0.24048270524660192, 0.25048270524660193, 0.26048270524660194, 0.2704827052466019, 0.2804827052466019, 0.2904827052466019, 0.3004827052466019, 0.31048270524660193, 0.32048270524660194, 0.33048270524660195, 0.34048270524660196, 0.35048270524660197, 0.360482705246602, 0.370482705246602, 0.3804827052466019, 0.3904827052466019, 0.4004827052466019, 0.4104827052466019, 0.4204827052466019, 0.4304827052466019, 0.44048270524660194, 0.45048270524660194, 0.46048270524660195, 0.47048270524660196, 0.48048270524660197, 0.490482705246602, 0.500482705246602, 0.5104827052466019, 0.5204827052466019, 0.5304827052466019, 0.5404827052466019, 0.5504827052466019, 0.5604827052466019, 0.5704827052466019, 0.580482705246602, 0.590482705246602, 0.600482705246602, 0.610482705246602, 0.620482705246602, 0.630482705246602, 0.640482705246602]}, {"amplitude": [11.974782431658491, 12.024782431658492, 12.074782431658491, 12.124782431658492, 12.17478243165849, 12.224782431658491, 12.274782431658492, 12.324782431658491, 12.374782431658492, 12.42478243165849, 12.474782431658491, 12.524782431658492, 12.574782431658491, 12.624782431658492, 12.67478243165849, 12.724782431658491, 12.774782431658492, 12.824782431658491, 12.874782431658492, 12.92478243165849, 12.974782431658491, 13.024782431658492, 13.074782431658491, 13.124782431658492, 13.17478243165849, 13.224782431658491, 13.274782431658492, 13.324782431658491, 13.374782431658492, 13.42478243165849, 13.474782431658491, 13.524782431658492, 13.574782431658491, 13.624782431658492, 13.67478243165849, 13.724782431658491, 13.774782431658492, 13.824782431658491, 13.874782431658492, 13.92478243165849, 13.974782431658491, 14.024782431658492, 14.074782431658491, 14.124782431658492, 14.17478243165849, 14.224782431658491, 14.274782431658492, 14.324782431658491, 14.374782431658492, 14.42478243165849, 14.474782431658491, 14.524782431658492, 14.574782431658491, 14.624782431658492, 14.67478243165849, 14.724782431658491], "phase": [0.08607420270039436, 0.09607420270039435, 0.10607420270039436, 0.11607420270039435, 0.12607420270039435, 0.13607420270039436, 0.14607420270039434, 0.15607420270039435, 0.16607420270039436, 0.17607420270039437, 0.18607420270039438, 0.19607420270039436, 0.20607420270039434, 0.21607420270039435, 0.22607420270039436, 0.23607420270039436, 0.24607420270039437, 0.2560742027003944, 0.26607420270039434, 0.27607420270039434, 0.28607420270039435, 0.29607420270039436, 0.30607420270039437, 0.3160742027003944, 0.32607420270039433, 0.33607420270039434, 0.34607420270039435, 0.35607420270039436, 0.36607420270039437, 0.3760742027003943, 0.38607420270039433, 0.39607420270039434, 0.40607420270039435, 0.41607420270039436, 0.42607420270039437, 0.4360742027003944, 0.44607420270039433, 0.45607420270039434, 0.46607420270039435, 0.47607420270039436, 0.48607420270039436, 0.4960742027003944, 0.5060742027003944, 0.5160742027003944, 0.5260742027003944, 0.5360742027003944, 0.5460742027003944, 0.5560742027003944, 0.5660742027003943, 0.5760742027003943, 0.5860742027003943, 0.5960742027003944, 0.6060742027003944, 0.6160742027003944, 0.6260742027003944, 0.6360742027003944]}, {"amplitude": [11.794369564437638, 11.844369564437638, 11.894369564437637, 11.944369564437638, 11.994369564437637, 12.044369564437638, 12.094369564437638, 12.144369564437637, 12.194369564437638, 12.244369564437637, 12.294369564437638, 12.344369564437638, 12.394369564437637, 12.444369564437638, 12.494369564437637, 12.544369564437638, 12.594369564437638, 12.644369564437637, 12.694369564437638, 12.744369564437637, 12.794369564437638, 12.844369564437638, 12.894369564437637, 12.944369564437638, 12.994369564437637, 13.044369564437638, 13.094369564437638, 13.144369564437637, 13.194369564437638, 13.244369564437637, 13.294369564437638, 13.344369564437638, 13.394369564437637, 13.444369564437638, 13.494369564437637, 13.544369564437638, 13.594369564437638, 13.644369564437637, 13.694369564437638, 13.744369564437637, 13.794369564437638, 13.844369564437638, 13.894369564437637, 13.944369564437638, 13.994369564437637, 14.044369564437638, 14.094369564437638, 14.144369564437637, 14.194369564437638, 14.244369564437637, 14.294369564437638, 14.344369564437638, 14.394369564437637, 14.444369564437638, 14.494369564437637, 14.544369564437638], "phase": [0.08090169943749476, 0.09090169943749475, 0.10090169943749476, 0.11090169943749476, 0.12090169943749476, 0.13090169943749475, 0.14090169943749475, 0.15090169943749476, 0.16090169943749477, 0.17090169943749475, 0.18090169943749476, 0.19090169943749474, 0.20090169943749475, 0.21090169943749476, 0.22090169943749477, 0.23090169943749475, 0.24090169943749476, 0.25090169943749474, 0.26090169943749475, 0.27090169943749476, 0.28090169943749477, 0.2909016994374948, 0.3009016994374948, 0.3109016994374948, 0.32090169943749475, 0.33090169943749476, 0.34090169943749477, 0.3509016994374948, 0.3609016994374948, 0.37090169943749474, 0.38090169943749475, 0.39090169943749475, 0.40090169943749476, 0.41090169943749477, 0.4209016994374948, 0.4309016994374948, 0.44090169943749474, 0.45090169943749475, 0.46090169943749476, 0.47090169943749477, 0.4809016994374948, 0.4909016994374948, 0.5009016994374947, 0.5109016994374947, 0.5209016994374948, 0.5309016994374948, 0.5409016994374948, 0.5509016994374948, 0.5609016994374947, 0.5709016994374947, 0.5809016994374947, 0.5909016994374947, 0.6009016994374947, 0.6109016994374947, 0.6209016994374947, 0.6309016994374947]}, {"amplitude": [11.574829105410377, 11.624829105410377, 11.674829105410376, 11.724829105410377, 11.774829105410376, 11.824829105410377, 11.874829105410377, 11.924829105410376, 11.974829105410377, 12.024829105410376, 12.074829105410377, 12.124829105410377, 12.174829105410376, 12.224829105410377, 12.274829105410376, 12.324829105410377, 12.374829105410377, 12.424829105410376, 12.474829105410377, 12.524829105410376, 12.574829105410377, 12.624829105410377, 12.674829105410376, 12.724829105410377, 12.774829105410376, 12.824829105410377, 12.874829105410377, 12.924829105410376, 12.974829105410377, 13.024829105410376, 13.074829105410377, 13.124829105410377, 13.174829105410376, 13.224829105410377, 13.274829105410376, 13.324829105410377, 13.374829105410377, 13.424829105410376, 13.474829105410377, 13.524829105410376, 13.574829105410377, 13.624829105410377, 13.674829105410376, 13.724829105410377, 13.774829105410376, 13.824829105410377, 13.874829105410377, 13.924829105410376, 13.974829105410377, 14.024829105410376, 14.074829105410377, 14.124829105410377, 14.174829105410376, 14.224829105410377, 14.274829105410376, 14.324829105410377], "phase": [0.07501110696304603, 0.08501110696304602, 0.09501110696304603, 0.10501110696304602, 0.11501110696304603, 0.12501110696304601, 0.13501110696304602, 0.14501110696304603, 0.15501110696304604, 0.16501110696304602, 0.17501110696304603, 0.185011106963046, 0.19501110696304602, 0.20501110696304603, 0.21501110696304604, 0.22501110696304602, 0.23501110696304603, 0.24501110696304604, 0.255011106963046, 0.26501110696304603, 0.27501110696304604, 0.285011106963046, 0.295011106963046, 0.305011106963046, 0.315011106963046, 0.325011106963046, 0.33501110696304603, 0.34501110696304604, 0.35501110696304605, 0.365011106963046, 0.375011106963046, 0.385011106963046, 0.39501110696304603, 0.40501110696304604, 0.41501110696304605, 0.42501110696304606, 0.435011106963046, 0.445011106963046, 0.45501110696304603, 0.46501110696304604, 0.47501110696304605, 0.48501110696304606, 0.495011106963046, 0.5050111069630461, 0.5150111069630461, 0.5250111069630461, 0.5350111069630461, 0.5450111069630461, 0.555011106963046, 0.565011106963046, 0.575011106963046, 0.585011106963046, 0.595011106963046, 0.605011106963046, 0.6150111069630461, 0.6250111069630461]}, {"amplitude": [11.331494241788091, 11.381494241788092, 11.43149424178809, 11.481494241788091, 11.53149424178809, 11.581494241788091, 11.631494241788092, 11.68149424178809, 11.731494241788091, 11.78149424178809, 11.831494241788091, 11.881494241788092, 11.93149424178809, 11.981494241788091, 12.03149424178809, 12.081494241788091, 12.131494241788092, 12.18149424178809, 12.231494241788091, 12.28149424178809, 12.331494241788091, 12.381494241788092, 12.43149424178809, 12.481494241788091, 12.53149424178809, 12.581494241788091, 12.631494241788092, 12.68149424178809, 12.731494241788091, 12.78149424178809, 12.831494241788091, 12.881494241788092, 12.93149424178809, 12.981494241788091, 13.03149424178809, 13.081494241788091, 13.131494241788092, 13.18149424178809, 13.231494241788091, 13.28149424178809, 13.331494241788091, 13.381494241788092, 13.43149424178809, 13.481494241788091, 13.53149424178809, 13.581494241788091, 13.631494241788092, 13.68149424178809, 13.731494241788091, 13.78149424178809, 13.831494241788091, 13.881494241788092, 13.93149424178809, 13.981494241788091, 14.03149424178809, 14.081494241788091], "phase": [0.06845471059286898, 0.07845471059286897, 0.08845471059286898, 0.09845471059286898, 0.10845471059286899, 0.11845471059286898, 0.12845471059286898, 0.13845471059286898, 0.14845471059286897, 0.15845471059286897, 0.16845471059286898, 0.178454710592869, 0.18845471059286897, 0.19845471059286898, 0.208454710592869, 0.21845471059286897, 0.22845471059286898, 0.238454710592869, 0.24845471059286897, 0.25845471059286895, 0.26845471059286896, 0.27845471059286897, 0.288454710592869, 0.298454710592869, 0.308454710592869, 0.318454710592869, 0.328454710592869, 0.338454710592869, 0.34845471059286903, 0.35845471059286893, 0.36845471059286894, 0.37845471059286895, 0.38845471059286896, 0.39845471059286897, 0.408454710592869, 0.418454710592869, 0.428454710592869, 0.438454710592869, 0.448454710592869, 0.458454710592869, 0.46845471059286903, 0.47845471059286904, 0.48845471059286893, 0.49845471059286894, 0.508454710592869, 0.518454710592869, 0.528454710592869, 0.538454710592869, 0.548454710592869, 0.558454710592869, 0.568454710592869, 0.578454710592869, 0.588454710592869, 0.598454710592869, 0.608454710592869, 0.618454710592869]}, {"amplitude": [11.08128800507544, 11.13128800507544, 11.181288005075437, 11.231288005075438, 11.281288005075439, 11.33128800507544, 11.38128800507544, 11.431288005075437, 11.481288005075438, 11.531288005075439, 11.58128800507544, 11.63128800507544, 11.681288005075437, 11.731288005075438, 11.781288005075439, 11.83128800507544, 11.88128800507544, 11.931288005075437, 11.981288005075438, 12.031288005075439, 12.08128800507544, 12.13128800507544, 12.181288005075437, 12.231288005075438, 12.281288005075439, 12.33128800507544, 12.38128800507544, 12.431288005075437, 12.481288005075438, 12.531288005075439, 12.58128800507544, 12.63128800507544, 12.681288005075437, 12.731288005075438, 12.781288005075439, 12.83128800507544, 12.88128800507544, 12.931288005075437, 12.981288005075438, 13.031288005075439, 13.08128800507544, 13.13128800507544, 13.181288005075437, 13.231288005075438, 13.281288005075439, 13.33128800507544, 13.38128800507544, 13.431288005075437, 13.481288005075438, 13.531288005075439, 13.58128800507544, 13.63128800507544, 13.681288005075437, 13.731288005075438, 13.781288005075439, 13.83128800507544], "phase": [0.06129070536529766, 0.07129070536529766, 0.08129070536529766, 0.09129070536529765, 0.10129070536529766, 0.11129070536529767, 0.12129070536529765, 0.13129070536529766, 0.14129070536529767, 0.15129070536529765, 0.16129070536529766, 0.17129070536529767, 0.18129070536529765, 0.19129070536529766, 0.20129070536529767, 0.21129070536529765, 0.22129070536529766, 0.23129070536529767, 0.24129070536529765, 0.2512907053652977, 0.2612907053652977, 0.27129070536529765, 0.28129070536529766, 0.29129070536529766, 0.3012907053652977, 0.3112907053652977, 0.3212907053652977, 0.3312907053652977, 0.3412907053652977, 0.35129070536529766, 0.36129070536529767, 0.3712907053652977, 0.3812907053652977, 0.3912907053652977, 0.4012907053652977, 0.4112907053652977, 0.42129070536529767, 0.4312907053652977, 0.4412907053652977, 0.4512907053652977, 0.4612907053652977, 0.4712907053652977, 0.48129070536529767, 0.4912907053652977, 0.5012907053652976, 0.5112907053652976, 0.5212907053652976, 0.5312907053652977, 0.5412907053652977, 0.5512907053652977, 0.5612907053652977, 0.5712907053652977, 0.5812907053652977, 0.5912907053652977, 0.6012907053652977, 0.6112907053652977]}, {"amplitude": [10.840499617125259, 10.89049961712526, 10.940499617125258, 10.99049961712526, 11.040499617125258, 11.090499617125259, 11.14049961712526, 11.190499617125258, 11.24049961712526, 11.290499617125258, 11.340499617125259, 11.39049961712526, 11.440499617125258, 11.49049961712526, 11.540499617125258, 11.590499617125259, 11.64049961712526, 11.690499617125258, 11.74049961712526, 11.790499617125258, 11.840499617125259, 11.89049961712526, 11.940499617125258, 11.99049961712526, 12.040499617125258, 12.090499617125259, 12.14049961712526, 12.190499617125258, 12.24049961712526, 12.290499617125258, 12.340499617125259, 12.39049961712526, 12.440499617125258, 12.49049961712526, 12.540499617125258, 12.590499617125259, 12.64049961712526, 12.690499617125258, 12.74049961712526, 12.790499617125258, 12.840499617125259, 12.89049961712526, 12.940499617125258, 12.99049961712526, 13.040499617125258, 13.090499617125259, 13.14049961712526, 13.190499617125258, 13.24049961712526, 13.290499617125258, 13.340499617125259, 13.39049961712526, 13.440499617125258, 13.49049961712526, 13.540499617125258, 13.590499617125259], "phase": [0.05358267949789972, 0.06358267949789972, 0.07358267949789972, 0.08358267949789971, 0.09358267949789972, 0.10358267949789973, 0.11358267949789971, 0.12358267949789972, 0.13358267949789973, 0.1435826794978997, 0.15358267949789972, 0.16358267949789973, 0.1735826794978997, 0.18358267949789972, 0.19358267949789973, 0.2035826794978997, 0.21358267949789972, 0.22358267949789973, 0.2335826794978997, 0.24358267949789972, 0.25358267949789975, 0.2635826794978997, 0.2735826794978997, 0.2835826794978997, 0.29358267949789973, 0.30358267949789974, 0.31358267949789975, 0.32358267949789976, 0.33358267949789977, 0.3435826794978997, 0.35358267949789973, 0.36358267949789974, 0.37358267949789975, 0.38358267949789976, 0.39358267949789977, 0.4035826794978998, 0.41358267949789973, 0.42358267949789974, 0.43358267949789975, 0.44358267949789976, 0.45358267949789977, 0.4635826794978998, 0.47358267949789973, 0.48358267949789974, 0.49358267949789975, 0.5035826794978997, 0.5135826794978997, 0.5235826794978997, 0.5335826794978997, 0.5435826794978997, 0.5535826794978997, 0.5635826794978998, 0.5735826794978998, 0.5835826794978998, 0.5935826794978998, 0.6035826794978998]}, {"amplitude": [10.622664044590547, 10.672664044590547, 10.722664044590545, 10.772664044590545, 10.822664044590546, 10.872664044590547, 10.922664044590547, 10.972664044590545, 11.022664044590545, 11.072664044590546, 11.122664044590547, 11.172664044590547, 11.222664044590545, 11.272664044590545, 11.322664044590546, 11.372664044590547, 11.422664044590547, 11.472664044590545, 11.522664044590545, 11.572664044590546, 11.622664044590547, 11.672664044590547, 11.722664044590545, 11.772664044590545, 11.822664044590546, 11.872664044590547, 11.922664044590547, 11.972664044590545, 12.022664044590545, 12.072664044590546, 12.122664044590547, 12.172664044590547, 12.222664044590545, 12.272664044590545, 12.322664044590546, 12.372664044590547, 12.422664044590547, 12.472664044590545, 12.522664044590545, 12.572664044590546, 12.622664044590547, 12.672664044590547, 12.722664044590545, 12.772664044590545, 12.822664044590546, 12.872664044590547, 12.922664044590547, 12.972664044590545, 13.022664044590545, 13.072664044590546, 13.122664044590547, 13.172664044590547, 13.222664044590545, 13.272664044590545, 13.322664044590546, 13.372664044590547], "phase": [0.045399049973954636, 0.05539904997395464, 0.06539904997395464, 0.07539904997395463, 0.08539904997395464, 0.09539904997395464, 0.10539904997395463, 0.11539904997395464, 0.12539904997395462, 0.13539904997395463, 0.14539904997395464, 0.15539904997395465, 0.16539904997395463, 0.17539904997395464, 0.18539904997395465, 0.19539904997395463, 0.20539904997395464, 0.21539904997395465, 0.22539904997395463, 0.23539904997395464, 0.24539904997395465, 0.25539904997395463, 0.26539904997395464, 0.27539904997395465, 0.2853990499739546, 0.2953990499739546, 0.3053990499739546, 0.3153990499739546, 0.32539904997395463, 0.33539904997395464, 0.34539904997395465, 0.35539904997395466, 0.36539904997395467, 0.3753990499739547, 0.3853990499739547, 0.3953990499739547, 0.4053990499739546, 0.4153990499739546, 0.4253990499739546, 0.4353990499739546, 0.44539904997395463, 0.45539904997395464, 0.46539904997395465, 0.47539904997395466, 0.48539904997395467, 0.4953990499739547, 0.5053990499739547, 0.5153990499739547, 0.5253990499739546, 0.5353990499739546, 0.5453990499739546, 0.5553990499739546, 0.5653990499739546, 0.5753990499739546, 0.5853990499739546, 0.5953990499739547]}, {"amplitude": [10.436841086840875, 10.486841086840876, 10.536841086840875, 10.586841086840876, 10.636841086840874, 10.686841086840875, 10.736841086840876, 10.786841086840875, 10.836841086840876, 10.886841086840874, 10.936841086840875, 10.986841086840876, 11.036841086840875, 11.086841086840876, 11.136841086840874, 11.186841086840875, 11.236841086840876, 11.286841086840875, 11.336841086840876, 11.386841086840874, 11.436841086840875, 11.486841086840876, 11.536841086840875, 11.586841086840876, 11.636841086840874, 11.686841086840875, 11.736841086840876, 11.786841086840875, 11.836841086840876, 11.886841086840874, 11.936841086840875, 11.986841086840876, 12.036841086840875, 12.086841086840876, 12.136841086840874, 12.186841086840875, 12.236841086840876, 12.286841086840875, 12.336841086840876, 12.386841086840874, 12.436841086840875, 12.486841086840876, 12.536841086840875, 12.586841086840876, 12.636841086840874, 12.686841086840875, 12.736841086840876, 12.786841086840875, 12.836841086840876, 12.886841086840874, 12.936841086840875, 12.986841086840876, 13.036841086840875, 13.086841086840876, 13.136841086840874, 13.186841086840875], "phase": [0.0368124552684678, 0.0468124552684678, 0.0568124552684678, 0.0668124552684678, 0.0768124552684678, 0.0868124552684678, 0.0968124552684678, 0.1068124552684678, 0.1168124552684678, 0.1268124552684678, 0.1368124552684678, 0.1468124552684678, 0.1568124552684678, 0.1668124552684678, 0.1768124552684678, 0.1868124552684678, 0.1968124552684678, 0.2068124552684678, 0.2168124552684678, 0.2268124552684678, 0.2368124552684678, 0.2468124552684678, 0.2568124552684678, 0.2668124552684678, 0.27681245526846776, 0.28681245526846777, 0.2968124552684678, 0.3068124552684678, 0.3168124552684678, 0.3268124552684678, 0.3368124552684678, 0.3468124552684678, 0.35681245526846783, 0.36681245526846784, 0.37681245526846785, 0.38681245526846786, 0.39681245526846776, 0.40681245526846777, 0.4168124552684678, 0.4268124552684678, 0.4368124552684678, 0.4468124552684678, 0.4568124552684678, 0.4668124552684678, 0.4768124552684678, 0.48681245526846784, 0.49681245526846785, 0.5068124552684679, 0.5168124552684678, 0.5268124552684678, 0.5368124552684678, 0.5468124552684678, 0.5568124552684678, 0.5668124552684678, 0.5768124552684678, 0.5868124552684678]}, {"amplitude": [10.286534096338652, 10.336534096338653, 10.386534096338652, 10.436534096338653, 10.486534096338652, 10.536534096338652, 10.586534096338653, 10.636534096338652, 10.686534096338653, 10.736534096338652, 10.786534096338652, 10.836534096338653, 10.886534096338652, 10.936534096338653, 10.986534096338652, 11.036534096338652, 11.086534096338653, 11.136534096338652, 11.186534096338653, 11.236534096338652, 11.286534096338652, 11.336534096338653, 11.386534096338652, 11.436534096338653, 11.486534096338652, 11.536534096338652, 11.586534096338653, 11.636534096338652, 11.686534096338653, 11.736534096338652, 11.786534096338652, 11.836534096338653, 11.886534096338652, 11.936534096338653, 11.986534096338652, 12.036534096338652, 12.086534096338653, 12.136534096338652, 12.186534096338653, 12.236534096338652, 12.286534096338652, 12.336534096338653, 12.386534096338652, 12.436534096338653, 12.486534096338652, 12.536534096338652, 12.586534096338653, 12.636534096338652, 12.686534096338653, 12.736534096338652, 12.786534096338652, 12.836534096338653, 12.886534096338652, 12.936534096338653, 12.986534096338652, 13.036534096338652], "phase": [0.02789911060392298, 0.03789911060392298, 0.047899110603922976, 0.05789911060392298, 0.06789911060392298, 0.07789911060392299, 0.08789911060392297, 0.09789911060392298, 0.10789911060392299, 0.11789911060392297, 0.12789911060392298, 0.137899110603923, 0.14789911060392297, 0.15789911060392298, 0.16789911060392299, 0.17789911060392297, 0.18789911060392298, 0.19789911060392298, 0.20789911060392297, 0.21789911060392297, 0.22789911060392298, 0.23789911060392296, 0.24789911060392297, 0.257899110603923, 0.26789911060392296, 0.27789911060392297, 0.287899110603923, 0.297899110603923, 0.307899110603923, 0.31789911060392295, 0.32789911060392296, 0.33789911060392297, 0.347899110603923, 0.357899110603923, 0.367899110603923, 0.377899110603923, 0.38789911060392296, 0.39789911060392297, 0.407899110603923, 0.417899110603923, 0.427899110603923, 0.437899110603923, 0.44789911060392296, 0.45789911060392297, 0.467899110603923, 0.477899110603923, 0.487899110603923, 0.497899110603923, 0.507899110603923, 0.517899110603923, 0.527899110603923, 0.537899110603923, 0.547899110603923, 0.557899110603923, 0.5678991106039231, 0.5778991106039231]}, {"amplitude": [10.169398497392843, 10.219398497392843, 10.269398497392842, 10.319398497392843, 10.369398497392842, 10.419398497392843, 10.469398497392843, 10.519398497392842, 10.569398497392843, 10.619398497392842, 10.669398497392843, 10.719398497392843, 10.769398497392842, 10.819398497392843, 10.869398497392842, 10.919398497392843, 10.969398497392843, 11.019398497392842, 11.069398497392843, 11.119398497392842, 11.169398497392843, 11.219398497392843, 11.269398497392842, 11.319398497392843, 11.369398497392842, 11.419398497392843, 11.469398497392843, 11.519398497392842, 11.569398497392843, 11.619398497392842, 11.669398497392843, 11.719398497392843, 11.769398497392842, 11.819398497392843, 11.869398497392842, 11.919398497392843, 11.969398497392843, 12.019398497392842, 12.069398497392843, 12.119398497392842, 12.169398497392843, 12.219398497392843, 12.269398497392842, 12.319398497392843, 12.369398497392842, 12.419398497392843, 12.469398497392843, 12.519398497392842, 12.569398497392843, 12.619398497392842, 12.669398497392843, 12.719398497392843, 12.769398497392842, 12.819398497392843, 12.869398497392842, 12.919398497392843], "phase": [0.018738131458572393, 0.028738131458572395, 0.0387381314585724, 0.04873813145857239, 0.058738131458572394, 0.0687381314585724, 0.07873813145857239, 0.0887381314585724, 0.0987381314585724, 0.10873813145857239, 0.1187381314585724, 0.12873813145857238, 0.1387381314585724, 0.1487381314585724, 0.1587381314585724, 0.1687381314585724, 0.1787381314585724, 0.1887381314585724, 0.1987381314585724, 0.2087381314585724, 0.2187381314585724, 0.22873813145857239, 0.2387381314585724, 0.2487381314585724, 0.2587381314585724, 0.2687381314585724, 0.2787381314585724, 0.2887381314585724, 0.2987381314585724, 0.3087381314585724, 0.3187381314585724, 0.3287381314585724, 0.3387381314585724, 0.3487381314585724, 0.3587381314585724, 0.3687381314585724, 0.3787381314585724, 0.3887381314585724, 0.3987381314585724, 0.4087381314585724, 0.4187381314585724, 0.4287381314585724, 0.4387381314585724, 0.4487381314585724, 0.4587381314585724, 0.4687381314585724, 0.4787381314585724, 0.4887381314585724, 0.4987381314585724, 0.5087381314585724, 0.5187381314585724, 0.5287381314585724, 0.5387381314585724, 0.5487381314585724, 0.5587381314585724, 0.5687381314585724]}, {"amplitude": [10.077779260831626, 10.127779260831627, 10.177779260831626, 10.227779260831626, 10.277779260831625, 10.327779260831626, 10.377779260831627, 10.427779260831626, 10.477779260831626, 10.527779260831625, 10.577779260831626, 10.627779260831627, 10.677779260831626, 10.727779260831626, 10.777779260831625, 10.827779260831626, 10.877779260831627, 10.927779260831626, 10.977779260831626, 11.027779260831625, 11.077779260831626, 11.127779260831627, 11.177779260831626, 11.227779260831626, 11.277779260831625, 11.327779260831626, 11.377779260831627, 11.427779260831626, 11.477779260831626, 11.527779260831625, 11.577779260831626, 11.627779260831627, 11.677779260831626, 11.727779260831626, 11.777779260831625, 11.827779260831626, 11.877779260831627, 11.927779260831626, 11.977779260831626, 12.027779260831625, 12.077779260831626, 12.127779260831627, 12.177779260831626, 12.227779260831626, 12.277779260831625, 12.327779260831626, 12.377779260831627, 12.427779260831626, 12.477779260831626, 12.527779260831625, 12.577779260831626, 12.627779260831627, 12.677779260831626, 12.727779260831626, 12.777779260831625, 12.827779260831626], "phase": [0.009410831331851416, 0.019410831331851418, 0.029410831331851416, 0.039410831331851415, 0.04941083133185142, 0.05941083133185142, 0.06941083133185141, 0.07941083133185142, 0.08941083133185142, 0.09941083133185141, 0.10941083133185142, 0.11941083133185142, 0.1294108313318514, 0.13941083133185142, 0.14941083133185143, 0.1594108313318514, 0.16941083133185142, 0.17941083133185143, 0.1894108313318514, 0.19941083133185142, 0.20941083133185143, 0.2194108313318514, 0.22941083133185142, 0.23941083133185143, 0.2494108313318514, 0.2594108313318514, 0.2694108313318514, 0.2794108313318514, 0.2894108313318514, 0.2994108313318514, 0.30941083133185143, 0.31941083133185144, 0.32941083133185145, 0.33941083133185146, 0.34941083133185147, 0.3594108313318515, 0.3694108313318514, 0.3794108313318514, 0.3894108313318514, 0.3994108313318514, 0.4094108313318514, 0.4194108313318514, 0.42941083133185143, 0.43941083133185144, 0.44941083133185145, 0.45941083133185145, 0.46941083133185146, 0.4794108313318515, 0.48941083133185137, 0.4994108313318514, 0.5094108313318514, 0.5194108313318514, 0.5294108313318514, 0.5394108313318514, 0.5494108313318514, 0.5594108313318514]}, {"amplitude": [10.0, 10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4, 10.45, 10.5, 10.55, 10.6, 10.65, 10.7, 10.75, 10.8, 10.85, 10.9, 10.95, 11.0, 11.05, 11.1, 11.15, 11.2, 11.25, 11.3, 11.35, 11.4, 11.45, 11.5, 11.55, 11.6, 11.65, 11.7, 11.75, 11.8, 11.85, 11.9, 11.95, 12.0, 12.05, 12.1, 12.15, 12.2, 12.25, 12.3, 12.35, 12.4, 12.45, 12.5, 12.55, 12.6, 12.65, 12.7, 12.75], "phase": [3.6739403974420595e-17, 0.010000000000000037, 0.02000000000000004, 0.030000000000000037, 0.040000000000000036, 0.05000000000000004, 0.06000000000000003, 0.07000000000000005, 0.08000000000000004, 0.09000000000000004, 0.10000000000000005, 0.11000000000000004, 0.12000000000000004, 0.13000000000000003, 0.14000000000000004, 0.15000000000000002, 0.16000000000000003, 0.17000000000000004, 0.18000000000000002, 0.19000000000000003, 0.20000000000000004, 0.21000000000000002, 0.22000000000000003, 0.23000000000000004, 0.24000000000000002, 0.25000000000000006, 0.26000000000000006, 0.2700000000000001, 0.2800000000000001, 0.29000000000000004, 0.30000000000000004, 0.31000000000000005, 0.32000000000000006, 0.33000000000000007, 0.3400000000000001, 0.3500000000000001, 0.36000000000000004, 0.37000000000000005, 0.38000000000000006, 0.39000000000000007, 0.4000000000000001, 0.4100000000000001, 0.42000000000000004, 0.43000000000000005, 0.44000000000000006, 0.45000000000000007, 0.4600000000000001, 0.4700000000000001, 0.48000000000000004, 0.49000000000000005, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55]}, {"amplitude": [9.922220739168376, 9.972220739168376, 10.022220739168375, 10.072220739168376, 10.122220739168375, 10.172220739168376, 10.222220739168376, 10.272220739168375, 10.322220739168376, 10.372220739168375, 10.422220739168376, 10.472220739168376, 10.522220739168375, 10.572220739168376, 10.622220739168375, 10.672220739168376, 10.722220739168376, 10.772220739168375, 10.822220739168376, 10.872220739168375, 10.922220739168376, 10.972220739168376, 11.022220739168375, 11.072220739168376, 11.122220739168375, 11.172220739168376, 11.222220739168376, 11.272220739168375, 11.322220739168376, 11.372220739168375, 11.422220739168376, 11.472220739168376, 11.522220739168375, 11.572220739168376, 11.622220739168375, 11.672220739168376, 11.722220739168376, 11.772220739168375, 11.822220739168376, 11.872220739168375, 11.922220739168376, 11.972220739168376, 12.022220739168375, 12.072220739168376, 12.122220739168375, 12.172220739168376, 12.222220739168376, 12.272220739168375, 12.322220739168376, 12.372220739168375, 12.422220739168376, 12.472220739168376, 12.522220739168375, 12.572220739168376, 12.622220739168375, 12.672220739168376], "phase": [-0.009410831331851343, 0.0005891686681486572, 0.010589168668148657, 0.020589168668148656, 0.030589168668148658, 0.040589168668148656, 0.05058916866814865, 0.06058916866814866, 0.07058916866814866, 0.08058916866814865, 0.09058916866814866, 0.10058916866814865, 0.11058916866814865, 0.12058916866814866, 0.13058916866814868, 0.14058916866814866, 0.15058916866814867, 0.16058916866814868, 0.17058916866814866, 0.18058916866814867, 0.19058916866814868, 0.20058916866814866, 0.21058916866814867, 0.22058916866814868, 0.23058916866814866, 0.24058916866814867, 0.2505891686681487, 0.2605891686681487, 0.2705891686681487, 0.28058916866814865, 0.29058916866814866, 0.30058916866814867, 0.3105891686681487, 0.3205891686681487, 0.3305891686681487, 0.3405891686681487, 0.35058916866814865, 0.36058916866814866, 0.37058916866814867, 0.3805891686681487, 0.3905891686681487, 0.4005891686681487, 0.41058916866814865, 0.42058916866814866, 0.43058916866814867, 0.4405891686681487, 0.4505891686681487, 0.4605891686681487, 0.47058916866814865, 0.48058916866814866, 0.49058916866814867, 0.5005891686681486, 0.5105891686681486, 0.5205891686681486, 0.5305891686681486, 0.5405891686681487]}, {"amplitude": [9.83060150260716, 9.88060150260716, 9.930601502607159, 9.98060150260716, 10.030601502607158, 10.08060150260716, 10.13060150260716, 10.180601502607159, 10.23060150260716, 10.280601502607158, 10.33060150260716, 10.38060150260716, 10.430601502607159, 10.48060150260716, 10.530601502607158, 10.58060150260716, 10.63060150260716, 10.680601502607159, 10.73060150260716, 10.780601502607158, 10.83060150260716, 10.88060150260716, 10.930601502607159, 10.98060150260716, 11.030601502607158, 11.08060150260716, 11.13060150260716, 11.180601502607159, 11.23060150260716, 11.280601502607158, 11.33060150260716, 11.38060150260716, 11.430601502607159, 11.48060150260716, 11.530601502607158, 11.58060150260716, 11.63060150260716, 11.680601502607159, 11.73060150260716, 11.780601502607158, 11.83060150260716, 11.88060150260716, 11.930601502607159, 11.98060150260716, 12.030601502607158, 12.08060150260716, 12.13060150260716, 12.180601502607159, 12.23060150260716, 12.280601502607158, 12.33060150260716, 12.38060150260716, 12.430601502607159, 12.48060150260716, 12.530601502607158, 12.58060150260716], "phase": [-0.01873813145857232, -0.00873813145857232, 0.0012618685414276798, 0.011261868541427678, 0.02126186854142768, 0.03126186854142768, 0.041261868541427674, 0.05126186854142768, 0.06126186854142768, 0.07126186854142767, 0.08126186854142768, 0.09126186854142768, 0.10126186854142767, 0.11126186854142768, 0.12126186854142769, 0.13126186854142768, 0.1412618685414277, 0.1512618685414277, 0.16126186854142768, 0.1712618685414277, 0.1812618685414277, 0.19126186854142768, 0.2012618685414277, 0.2112618685414277, 0.22126186854142768, 0.2312618685414277, 0.2412618685414277, 0.2512618685414277, 0.2612618685414277, 0.27126186854142764, 0.28126186854142765, 0.29126186854142766, 0.30126186854142767, 0.3112618685414277, 0.3212618685414277, 0.3312618685414277, 0.34126186854142765, 0.35126186854142766, 0.36126186854142767, 0.3712618685414277, 0.3812618685414277, 0.3912618685414277, 0.40126186854142765, 0.41126186854142766, 0.42126186854142766, 0.4312618685414277, 0.4412618685414277, 0.4512618685414277, 0.46126186854142764, 0.47126186854142765, 0.48126186854142766, 0.49126186854142767, 0.5012618685414277, 0.5112618685414277, 0.5212618685414278, 0.5312618685414278]}, {"amplitude": [9.713465903661348, 9.763465903661348, 9.813465903661347, 9.863465903661348, 9.913465903661347, 9.963465903661348, 10.013465903661348, 10.063465903661347, 10.113465903661348, 10.163465903661347, 10.213465903661348, 10.263465903661348, 10.313465903661347, 10.363465903661348, 10.413465903661347, 10.463465903661348, 10.513465903661348, 10.563465903661347, 10.613465903661348, 10.663465903661347, 10.713465903661348, 10.763465903661348, 10.813465903661347, 10.863465903661348, 10.913465903661347, 10.963465903661348, 11.013465903661348, 11.063465903661347, 11.113465903661348, 11.163465903661347, 11.213465903661348, 11.263465903661348, 11.313465903661347, 11.363465903661348, 11.413465903661347, 11.463465903661348, 11.513465903661348, 11.563465903661347, 11.613465903661348, 11.663465903661347, 11.713465903661348, 11.763465903661348, 11.813465903661347, 11.863465903661348, 11.913465903661347, 11.963465903661348, 12.013465903661348, 12.063465903661347, 12.113465903661348, 12.163465903661347, 12.213465903661348, 12.263465903661348, 12.313465903661347, 12.363465903661348, 12.413465903661347, 12.463465903661348], "phase": [-0.027899110603922906, -0.017899110603922908, -0.007899110603922906, 0.002100889396077093, 0.012100889396077095, 0.022100889396077097, 0.032100889396077095, 0.042100889396077104, 0.0521008893960771, 0.062100889396077094, 0.0721008893960771, 0.0821008893960771, 0.09210088939607709, 0.1021008893960771, 0.11210088939607711, 0.12210088939607709, 0.1321008893960771, 0.1421008893960771, 0.15210088939607708, 0.16210088939607709, 0.1721008893960771, 0.18210088939607708, 0.19210088939607708, 0.2021008893960771, 0.21210088939607707, 0.22210088939607708, 0.2321008893960771, 0.2421008893960771, 0.2521008893960771, 0.26210088939607706, 0.2721008893960771, 0.2821008893960771, 0.2921008893960771, 0.3021008893960771, 0.3121008893960771, 0.3221008893960771, 0.33210088939607707, 0.3421008893960771, 0.3521008893960771, 0.3621008893960771, 0.3721008893960771, 0.3821008893960771, 0.39210088939607707, 0.4021008893960771, 0.4121008893960771, 0.4221008893960771, 0.4321008893960771, 0.4421008893960771, 0.45210088939607707, 0.4621008893960771, 0.4721008893960771, 0.4821008893960771, 0.4921008893960771, 0.5021008893960771, 0.5121008893960771, 0.5221008893960771]}, {"amplitude": [9.563158913159127, 9.613158913159127, 9.663158913159126, 9.713158913159127, 9.763158913159126, 9.813158913159127, 9.863158913159127, 9.913158913159126, 9.963158913159127, 10.013158913159126, 10.063158913159127, 10.113158913159127, 10.163158913159126, 10.213158913159127, 10.263158913159126, 10.313158913159127, 10.363158913159127, 10.413158913159126, 10.463158913159127, 10.513158913159126, 10.563158913159127, 10.613158913159127, 10.663158913159126, 10.713158913159127, 10.763158913159126, 10.813158913159127, 10.863158913159127, 10.913158913159126, 10.963158913159127, 11.013158913159126, 11.063158913159127, 11.113158913159127, 11.163158913159126, 11.213158913159127, 11.263158913159126, 11.313158913159127, 11.363158913159127, 11.413158913159126, 11.463158913159127, 11.513158913159126, 11.563158913159127, 11.613158913159127, 11.663158913159126, 11.713158913159127, 11.763158913159126, 11.813158913159127, 11.863158913159127, 11.913158913159126, 11.963158913159127, 12.013158913159126, 12.063158913159127, 12.113158913159127, 12.163158913159126, 12.213158913159127, 12.263158913159126, 12.313158913159127], "phase": [-0.03681245526846773, -0.026812455268467726, -0.016812455268467728, -0.006812455268467729, 0.0031875447315322727, 0.013187544731532275, 0.02318754473153227, 0.03318754473153228, 0.043187544731532274, 0.05318754473153227, 0.06318754473153228, 0.07318754473153227, 0.08318754473153227, 0.09318754473153228, 0.10318754473153229, 0.11318754473153227, 0.12318754473153228, 0.13318754473153227, 0.14318754473153228, 0.1531875447315323, 0.1631875447315323, 0.17318754473153225, 0.18318754473153226, 0.19318754473153227, 0.20318754473153228, 0.21318754473153229, 0.2231875447315323, 0.2331875447315323, 0.2431875447315323, 0.25318754473153227, 0.2631875447315323, 0.2731875447315323, 0.2831875447315323, 0.2931875447315323, 0.3031875447315323, 0.3131875447315323, 0.3231875447315323, 0.3331875447315323, 0.3431875447315323, 0.3531875447315323, 0.3631875447315323, 0.3731875447315323, 0.38318754473153227, 0.3931875447315323, 0.4031875447315323, 0.4131875447315323, 0.4231875447315323, 0.4331875447315323, 0.44318754473153227, 0.4531875447315323, 0.4631875447315323, 0.4731875447315323, 0.4831875447315323, 0.4931875447315323, 0.5031875447315323, 0.5131875447315323]}, {"amplitude": [9.377335955409455, 9.427335955409456, 9.477335955409455, 9.527335955409455, 9.577335955409454, 9.627335955409455, 9.677335955409456, 9.727335955409455, 9.777335955409455, 9.827335955409454, 9.877335955409455, 9.927335955409456, 9.977335955409455, 10.027335955409455, 10.077335955409454, 10.127335955409455, 10.177335955409456, 10.227335955409455, 10.277335955409455, 10.327335955409454, 10.377335955409455, 10.427335955409456, 10.477335955409455, 10.527335955409455, 10.577335955409454, 10.627335955409455, 10.677335955409456, 10.727335955409455, 10.777335955409455, 10.827335955409454, 10.877335955409455, 10.927335955409456, 10.977335955409455, 11.027335955409455, 11.077335955409454, 11.127335955409455, 11.177335955409456, 11.227335955409455, 11.277335955409455, 11.327335955409454, 11.377335955409455, 11.427335955409456, 11.477335955409455, 11.527335955409455, 11.577335955409454, 11.627335955409455, 11.677335955409456, 11.727335955409455, 11.777335955409455, 11.827335955409454, 11.877335955409455, 11.927335955409456, 11.977335955409455, 12.027335955409455, 12.077335955409454, 12.127335955409455], "phase": [-0.04539904997395457, -0.035399049973954565, -0.025399049973954566, -0.015399049973954568, -0.005399049973954566, 0.004600950026045436, 0.014600950026045431, 0.02460095002604544, 0.034600950026045435, 0.04460095002604543, 0.05460095002604544, 0.06460095002604543, 0.07460095002604543, 0.08460095002604544, 0.09460095002604545, 0.10460095002604543, 0.11460095002604544, 0.12460095002604545, 0.13460095002604544, 0.14460095002604545, 0.15460095002604546, 0.1646009500260454, 0.17460095002604542, 0.18460095002604543, 0.19460095002604544, 0.20460095002604545, 0.21460095002604546, 0.22460095002604546, 0.23460095002604547, 0.24460095002604543, 0.25460095002604544, 0.26460095002604545, 0.27460095002604545, 0.28460095002604546, 0.29460095002604547, 0.3046009500260455, 0.31460095002604543, 0.32460095002604544, 0.33460095002604545, 0.34460095002604546, 0.35460095002604547, 0.3646009500260455, 0.37460095002604543, 0.38460095002604544, 0.39460095002604545, 0.40460095002604546, 0.41460095002604547, 0.4246009500260455, 0.43460095002604543, 0.44460095002604544, 0.45460095002604545, 0.46460095002604546, 0.47460095002604546, 0.4846009500260455, 0.4946009500260455, 0.5046009500260454]}, {"amplitude": [9.159500382874743, 9.209500382874744, 9.259500382874743, 9.309500382874743, 9.359500382874742, 9.409500382874743, 9.459500382874744, 9.509500382874743, 9.559500382874743, 9.609500382874742, 9.659500382874743, 9.709500382874744, 9.759500382874743, 9.809500382874743, 9.859500382874742, 9.909500382874743, 9.959500382874744, 10.009500382874743, 10.059500382874743, 10.109500382874742, 10.159500382874743, 10.209500382874744, 10.259500382874743, 10.309500382874743, 10.359500382874742, 10.409500382874743, 10.459500382874744, 10.509500382874743, 10.559500382874743, 10.609500382874742, 10.659500382874743, 10.709500382874744, 10.759500382874743, 10.809500382874743, 10.859500382874742, 10.909500382874743, 10.959500382874744, 11.009500382874743, 11.059500382874743, 11.109500382874742, 11.159500382874743, 11.209500382874744, 11.259500382874743, 11.309500382874743, 11.359500382874742, 11.409500382874743, 11.459500382874744, 11.509500382874743, 11.559500382874743, 11.609500382874742, 11.659500382874743, 11.709500382874744, 11.759500382874743, 11.809500382874743, 11.859500382874742, 11.909500382874743], "phase": [-0.05358267949789966, -0.04358267949789966, -0.033582679497899656, -0.02358267949789966, -0.01358267949789966, -0.0035826794978996573, 0.006417320502100338, 0.016417320502100347, 0.02641732050210034, 0.03641732050210034, 0.046417320502100345, 0.05641732050210034, 0.06641732050210034, 0.07641732050210034, 0.08641732050210035, 0.09641732050210033, 0.10641732050210034, 0.11641732050210035, 0.12641732050210033, 0.13641732050210034, 0.14641732050210035, 0.15641732050210033, 0.16641732050210034, 0.17641732050210035, 0.18641732050210033, 0.19641732050210034, 0.20641732050210035, 0.21641732050210036, 0.22641732050210037, 0.23641732050210032, 0.24641732050210033, 0.2564173205021003, 0.2664173205021003, 0.2764173205021003, 0.28641732050210034, 0.29641732050210035, 0.30641732050210035, 0.31641732050210036, 0.32641732050210037, 0.3364173205021004, 0.3464173205021004, 0.3564173205021004, 0.3664173205021003, 0.3764173205021003, 0.3864173205021003, 0.3964173205021003, 0.40641732050210033, 0.41641732050210034, 0.42641732050210035, 0.43641732050210036, 0.44641732050210037, 0.4564173205021004, 0.4664173205021004, 0.4764173205021004, 0.4864173205021004, 0.4964173205021004]}, {"amplitude": [8.918711994924562, 8.968711994924563, 9.018711994924562, 9.068711994924563, 9.118711994924562, 9.168711994924562, 9.218711994924563, 9.268711994924562, 9.318711994924563, 9.368711994924562, 9.418711994924562, 9.468711994924563, 9.518711994924562, 9.568711994924563, 9.618711994924562, 9.668711994924562, 9.718711994924563, 9.768711994924562, 9.818711994924563, 9.868711994924562, 9.918711994924562, 9.968711994924563, 10.018711994924562, 10.068711994924563, 10.118711994924562, 10.168711994924562, 10.218711994924563, 10.268711994924562, 10.318711994924563, 10.368711994924562, 10.418711994924562, 10.468711994924563, 10.518711994924562, 10.568711994924563, 10.618711994924562, 10.668711994924562, 10.718711994924563, 10.768711994924562, 10.818711994924563, 10.868711994924562, 10.918711994924562, 10.968711994924563, 11.018711994924562, 11.068711994924563, 11.118711994924562, 11.168711994924562, 11.218711994924563, 11.268711994924562, 11.318711994924563, 11.368711994924562, 11.418711994924562, 11.468711994924563, 11.518711994924562, 11.568711994924563, 11.618711994924562, 11.668711994924562], "phase": [-0.061290705365297606, -0.051290705365297604, -0.04129070536529761, -0.03129070536529761, -0.021290705365297605, -0.011290705365297603, -0.0012907053652976078, 0.008709294634702401, 0.018709294634702396, 0.02870929463470239, 0.0387092946347024, 0.048709294634702395, 0.05870929463470239, 0.0687092946347024, 0.07870929463470241, 0.0887092946347024, 0.0987092946347024, 0.10870929463470241, 0.1187092946347024, 0.1287092946347024, 0.1387092946347024, 0.1487092946347024, 0.1587092946347024, 0.1687092946347024, 0.1787092946347024, 0.1887092946347024, 0.1987092946347024, 0.20870929463470242, 0.21870929463470243, 0.22870929463470238, 0.2387092946347024, 0.2487092946347024, 0.2587092946347024, 0.2687092946347024, 0.2787092946347024, 0.2887092946347024, 0.29870929463470236, 0.30870929463470237, 0.3187092946347024, 0.3287092946347024, 0.3387092946347024, 0.3487092946347024, 0.35870929463470236, 0.36870929463470237, 0.3787092946347024, 0.3887092946347024, 0.3987092946347024, 0.4087092946347024, 0.41870929463470236, 0.42870929463470236, 0.4387092946347024, 0.4487092946347024, 0.4587092946347024, 0.4687092946347024, 0.4787092946347024, 0.4887092946347024]}, {"amplitude": [8.668505758211912, 8.718505758211913, 8.768505758211912, 8.818505758211913, 8.868505758211912, 8.918505758211912, 8.968505758211913, 9.018505758211912, 9.068505758211913, 9.118505758211912, 9.168505758211912, 9.218505758211913, 9.268505758211912, 9.318505758211913, 9.368505758211912, 9.418505758211912, 9.468505758211913, 9.518505758211912, 9.568505758211913, 9.618505758211912, 9.668505758211912, 9.718505758211913, 9.768505758211912, 9.818505758211913, 9.868505758211912, 9.918505758211912, 9.968505758211913, 10.018505758211912, 10.068505758211913, 10.118505758211912, 10.168505758211912, 10.218505758211913, 10.268505758211912, 10.318505758211913, 10.368505758211912, 10.418505758211912, 10.468505758211913, 10.518505758211912, 10.568505758211913, 10.618505758211912, 10.668505758211912, 10.718505758211913, 10.768505758211912, 10.818505758211913, 10.868505758211912, 10.918505758211912, 10.968505758211913, 11.018505758211912, 11.068505758211913, 11.118505758211912, 11.168505758211912, 11.218505758211913, 11.268505758211912, 11.318505758211913, 11.368505758211912, 11.418505758211912], "phase": [-0.06845471059286892, -0.05845471059286892, -0.04845471059286892, -0.038454710592868924, -0.028454710592868922, -0.01845471059286892, -0.008454710592868925, 0.001545289407131084, 0.011545289407131079, 0.021545289407131074, 0.03154528940713108, 0.04154528940713108, 0.05154528940713107, 0.06154528940713108, 0.07154528940713109, 0.08154528940713107, 0.09154528940713108, 0.10154528940713109, 0.11154528940713107, 0.12154528940713108, 0.1315452894071311, 0.14154528940713107, 0.15154528940713108, 0.1615452894071311, 0.17154528940713107, 0.18154528940713108, 0.1915452894071311, 0.2015452894071311, 0.2115452894071311, 0.22154528940713106, 0.23154528940713107, 0.24154528940713108, 0.25154528940713106, 0.26154528940713107, 0.2715452894071311, 0.2815452894071311, 0.2915452894071311, 0.3015452894071311, 0.3115452894071311, 0.3215452894071311, 0.3315452894071311, 0.34154528940713114, 0.35154528940713103, 0.36154528940713104, 0.37154528940713105, 0.38154528940713106, 0.39154528940713107, 0.4015452894071311, 0.4115452894071311, 0.4215452894071311, 0.4315452894071311, 0.4415452894071311, 0.4515452894071311, 0.46154528940713113, 0.47154528940713114, 0.48154528940713115]}, {"amplitude": [8.425170894589623, 8.475170894589624, 8.525170894589625, 8.575170894589625, 8.625170894589623, 8.675170894589623, 8.725170894589624, 8.775170894589625, 8.825170894589625, 8.875170894589623, 8.925170894589623, 8.975170894589624, 9.025170894589625, 9.075170894589625, 9.125170894589623, 9.175170894589623, 9.225170894589624, 9.275170894589625, 9.325170894589625, 9.375170894589623, 9.425170894589623, 9.475170894589624, 9.525170894589625, 9.575170894589625, 9.625170894589623, 9.675170894589623, 9.725170894589624, 9.775170894589625, 9.825170894589625, 9.875170894589623, 9.925170894589623, 9.975170894589624, 10.025170894589625, 10.075170894589625, 10.125170894589623, 10.175170894589623, 10.225170894589624, 10.275170894589625, 10.325170894589625, 10.375170894589623, 10.425170894589623, 10.475170894589624, 10.525170894589625, 10.575170894589625, 10.625170894589623, 10.675170894589623, 10.725170894589624, 10.775170894589625, 10.825170894589625, 10.875170894589623, 10.925170894589623, 10.975170894589624, 11.025170894589625, 11.075170894589625, 11.125170894589623, 11.175170894589623], "phase": [-0.07501110696304597, -0.06501110696304598, -0.055011106963045966, -0.04501110696304597, -0.03501110696304597, -0.025011106963045968, -0.015011106963045973, -0.005011106963045964, 0.004988893036954031, 0.014988893036954026, 0.024988893036954035, 0.03498889303695403, 0.044988893036954025, 0.054988893036954034, 0.06498889303695404, 0.07498889303695402, 0.08498889303695403, 0.09498889303695404, 0.10498889303695402, 0.11498889303695403, 0.12498889303695404, 0.13498889303695402, 0.14498889303695403, 0.15498889303695404, 0.16498889303695402, 0.17498889303695403, 0.18498889303695404, 0.19498889303695405, 0.20498889303695406, 0.214988893036954, 0.22498889303695402, 0.23498889303695403, 0.24498889303695404, 0.25498889303695405, 0.26498889303695405, 0.27498889303695406, 0.284988893036954, 0.294988893036954, 0.30498889303695403, 0.31498889303695404, 0.32498889303695405, 0.33498889303695406, 0.344988893036954, 0.354988893036954, 0.36498889303695403, 0.37498889303695404, 0.38498889303695405, 0.39498889303695406, 0.404988893036954, 0.414988893036954, 0.42498889303695403, 0.43498889303695404, 0.44498889303695405, 0.45498889303695406, 0.46498889303695407, 0.4749888930369541]}, {"amplitude": [8.205630435562364, 8.255630435562365, 8.305630435562364, 8.355630435562365, 8.405630435562363, 8.455630435562364, 8.505630435562365, 8.555630435562364, 8.605630435562365, 8.655630435562363, 8.705630435562364, 8.755630435562365, 8.805630435562364, 8.855630435562365, 8.905630435562363, 8.955630435562364, 9.005630435562365, 9.055630435562364, 9.105630435562365, 9.155630435562363, 9.205630435562364, 9.255630435562365, 9.305630435562364, 9.355630435562365, 9.405630435562363, 9.455630435562364, 9.505630435562365, 9.555630435562364, 9.605630435562365, 9.655630435562363, 9.705630435562364, 9.755630435562365, 9.805630435562364, 9.855630435562365, 9.905630435562363, 9.955630435562364, 10.005630435562365, 10.055630435562364, 10.105630435562365, 10.155630435562363, 10.205630435562364, 10.255630435562365, 10.305630435562364, 10.355630435562365, 10.405630435562363, 10.455630435562364, 10.505630435562365, 10.555630435562364, 10.605630435562365, 10.655630435562363, 10.705630435562364, 10.755630435562365, 10.805630435562364, 10.855630435562365, 10.905630435562363, 10.955630435562364], "phase": [-0.08090169943749473, -0.07090169943749473, -0.060901699437494725, -0.05090169943749473, -0.04090169943749473, -0.030901699437494726, -0.02090169943749473, -0.010901699437494722, -0.0009016994374947268, 0.009098300562505268, 0.019098300562505277, 0.029098300562505272, 0.03909830056250527, 0.049098300562505276, 0.059098300562505285, 0.06909830056250527, 0.07909830056250527, 0.08909830056250528, 0.09909830056250526, 0.10909830056250527, 0.11909830056250528, 0.12909830056250526, 0.13909830056250527, 0.14909830056250528, 0.15909830056250526, 0.16909830056250527, 0.17909830056250528, 0.1890983005625053, 0.1990983005625053, 0.20909830056250525, 0.21909830056250526, 0.22909830056250527, 0.23909830056250528, 0.2490983005625053, 0.25909830056250527, 0.2690983005625053, 0.2790983005625053, 0.2890983005625053, 0.2990983005625053, 0.3090983005625053, 0.3190983005625053, 0.32909830056250533, 0.33909830056250523, 0.34909830056250524, 0.35909830056250525, 0.36909830056250525, 0.37909830056250526, 0.3890983005625053, 0.3990983005625053, 0.4090983005625053, 0.4190983005625053, 0.4290983005625053, 0.4390983005625053, 0.4490983005625053, 0.45909830056250533, 0.46909830056250534]}, {"amplitude": [8.02521756834151, 8.075217568341511, 8.12521756834151, 8.17521756834151, 8.22521756834151, 8.27521756834151, 8.325217568341511, 8.37521756834151, 8.42521756834151, 8.47521756834151, 8.52521756834151, 8.575217568341511, 8.62521756834151, 8.67521756834151, 8.72521756834151, 8.77521756834151, 8.825217568341511, 8.87521756834151, 8.92521756834151, 8.97521756834151, 9.02521756834151, 9.075217568341511, 9.12521756834151, 9.17521756834151, 9.22521756834151, 9.27521756834151, 9.325217568341511, 9.37521756834151, 9.42521756834151, 9.47521756834151, 9.52521756834151, 9.575217568341511, 9.62521756834151, 9.67521756834151, 9.72521756834151, 9.77521756834151, 9.825217568341511, 9.87521756834151, 9.92521756834151, 9.97521756834151, 10.02521756834151, 10.075217568341511, 10.12521756834151, 10.17521756834151, 10.22521756834151, 10.27521756834151, 10.325217568341511, 10.37521756834151, 10.42521756834151, 10.47521756834151, 10.52521756834151, 10.575217568341511, 10.62521756834151, 10.67521756834151, 10.72521756834151, 10.77521756834151], "phase": [-0.08607420270039433, -0.07607420270039433, -0.06607420270039432, -0.05607420270039433, -0.04607420270039433, -0.036074202700394326, -0.02607420270039433, -0.01607420270039432, -0.006074202700394327, 0.003925797299605668, 0.013925797299605677, 0.023925797299605672, 0.03392579729960567, 0.043925797299605676, 0.053925797299605685, 0.06392579729960567, 0.07392579729960568, 0.08392579729960568, 0.09392579729960567, 0.10392579729960567, 0.11392579729960568, 0.12392579729960566, 0.1339257972996057, 0.1439257972996057, 0.15392579729960565, 0.16392579729960566, 0.17392579729960567, 0.18392579729960568, 0.19392579729960568, 0.20392579729960564, 0.21392579729960565, 0.22392579729960566, 0.23392579729960566, 0.24392579729960567, 0.2539257972996057, 0.2639257972996057, 0.27392579729960564, 0.28392579729960565, 0.29392579729960566, 0.30392579729960567, 0.3139257972996057, 0.3239257972996057, 0.33392579729960564, 0.34392579729960565, 0.35392579729960566, 0.36392579729960567, 0.3739257972996057, 0.3839257972996057, 0.39392579729960564, 0.40392579729960565, 0.41392579729960566, 0.42392579729960567, 0.4339257972996057, 0.4439257972996057, 0.4539257972996057, 0.4639257972996057]}, {"amplitude": [7.895659719849355, 7.945659719849356, 7.995659719849355, 8.045659719849356, 8.095659719849355, 8.145659719849355, 8.195659719849356, 8.245659719849355, 8.295659719849356, 8.345659719849355, 8.395659719849355, 8.445659719849356, 8.495659719849355, 8.545659719849356, 8.595659719849355, 8.645659719849355, 8.695659719849356, 8.745659719849355, 8.795659719849356, 8.845659719849355, 8.895659719849355, 8.945659719849356, 8.995659719849355, 9.045659719849356, 9.095659719849355, 9.145659719849355, 9.195659719849356, 9.245659719849355, 9.295659719849356, 9.345659719849355, 9.395659719849355, 9.445659719849356, 9.495659719849355, 9.545659719849356, 9.595659719849355, 9.645659719849355, 9.695659719849356, 9.745659719849355, 9.795659719849356, 9.845659719849355, 9.895659719849355, 9.945659719849356, 9.995659719849355, 10.045659719849356, 10.095659719849355, 10.145659719849355, 10.195659719849356, 10.245659719849355, 10.295659719849356, 10.345659719849355, 10.395659719849355, 10.445659719849356, 10.495659719849355, 10.545659719849356, 10.595659719849355, 10.645659719849355], "phase": [-0.0904827052466019, -0.08048270524660191, -0.0704827052466019, -0.0604827052466019, -0.0504827052466019, -0.0404827052466019, -0.030482705246601904, -0.020482705246601896, -0.0104827052466019, -0.0004827052466019055, 0.009517294753398103, 0.0195172947533981, 0.029517294753398093, 0.0395172947533981, 0.04951729475339811, 0.05951729475339809, 0.0695172947533981, 0.07951729475339811, 0.08951729475339809, 0.0995172947533981, 0.10951729475339811, 0.11951729475339809, 0.1295172947533981, 0.1395172947533981, 0.1495172947533981, 0.1595172947533981, 0.1695172947533981, 0.17951729475339812, 0.18951729475339812, 0.19951729475339808, 0.2095172947533981, 0.2195172947533981, 0.2295172947533981, 0.2395172947533981, 0.24951729475339812, 0.25951729475339813, 0.2695172947533981, 0.2795172947533981, 0.2895172947533981, 0.2995172947533981, 0.3095172947533981, 0.31951729475339813, 0.3295172947533981, 0.3395172947533981, 0.3495172947533981, 0.3595172947533981, 0.3695172947533981, 0.3795172947533981, 0.3895172947533981, 0.3995172947533981, 0.4095172947533981, 0.4195172947533981, 0.4295172947533981, 0.4395172947533981, 0.44951729475339813, 0.45951729475339814]}, {"amplitude": [7.823552286872943, 7.873552286872943, 7.923552286872942, 7.973552286872943, 8.023552286872942, 8.073552286872943, 8.123552286872943, 8.173552286872942, 8.223552286872943, 8.273552286872942, 8.323552286872943, 8.373552286872943, 8.423552286872942, 8.473552286872943, 8.523552286872942, 8.573552286872943, 8.623552286872943, 8.673552286872942, 8.723552286872943, 8.773552286872942, 8.823552286872943, 8.873552286872943, 8.923552286872942, 8.973552286872943, 9.023552286872942, 9.073552286872943, 9.123552286872943, 9.173552286872942, 9.223552286872943, 9.273552286872942, 9.323552286872943, 9.373552286872943, 9.423552286872942, 9.473552286872943, 9.523552286872942, 9.573552286872943, 9.623552286872943, 9.673552286872942, 9.723552286872943, 9.773552286872942, 9.823552286872943, 9.873552286872943, 9.923552286872942, 9.973552286872943, 10.023552286872942, 10.073552286872943, 10.123552286872943, 10.173552286872942, 10.223552286872943, 10.273552286872942, 10.323552286872943, 10.373552286872943, 10.423552286872942, 10.473552286872943, 10.523552286872942, 10.573552286872943], "phase": [-0.09408807689542253, -0.08408807689542254, -0.07408807689542253, -0.06408807689542254, -0.054088076895422534, -0.04408807689542253, -0.03408807689542254, -0.024088076895422528, -0.014088076895422533, -0.004088076895422538, 0.005911923104577471, 0.015911923104577466, 0.02591192310457746, 0.03591192310457747, 0.04591192310457748, 0.05591192310457746, 0.06591192310457747, 0.07591192310457748, 0.08591192310457746, 0.09591192310457747, 0.10591192310457748, 0.11591192310457746, 0.12591192310457747, 0.13591192310457748, 0.14591192310457746, 0.15591192310457747, 0.16591192310457747, 0.17591192310457748, 0.1859119231045775, 0.19591192310457745, 0.20591192310457745, 0.21591192310457746, 0.22591192310457747, 0.23591192310457748, 0.2459119231045775, 0.2559119231045775, 0.26591192310457745, 0.27591192310457746, 0.28591192310457747, 0.2959119231045775, 0.3059119231045775, 0.3159119231045775, 0.32591192310457745, 0.33591192310457746, 0.34591192310457747, 0.3559119231045775, 0.3659119231045775, 0.3759119231045775, 0.38591192310457745, 0.39591192310457746, 0.40591192310457747, 0.4159119231045775, 0.4259119231045775, 0.4359119231045775, 0.4459119231045775, 0.4559119231045775]}, {"amplitude": [7.809535300092133, 7.8595353000921335, 7.9095353000921325, 7.959535300092133, 8.009535300092132, 8.059535300092133, 8.109535300092134, 8.159535300092132, 8.209535300092133, 8.259535300092132, 8.309535300092133, 8.359535300092134, 8.409535300092132, 8.459535300092133, 8.509535300092132, 8.559535300092133, 8.609535300092134, 8.659535300092132, 8.709535300092133, 8.759535300092132, 8.809535300092133, 8.859535300092134, 8.909535300092132, 8.959535300092133, 9.009535300092132, 9.059535300092133, 9.109535300092134, 9.159535300092132, 9.209535300092133, 9.259535300092132, 9.309535300092133, 9.359535300092134, 9.409535300092132, 9.459535300092133, 9.509535300092132, 9.559535300092133, 9.609535300092134, 9.659535300092132, 9.709535300092133, 9.759535300092132, 9.809535300092133, 9.859535300092134, 9.909535300092132, 9.959535300092133, 10.009535300092132, 10.059535300092133, 10.109535300092134, 10.159535300092132, 10.209535300092133, 10.259535300092132, 10.309535300092133, 10.359535300092134, 10.409535300092132, 10.459535300092133, 10.509535300092132, 10.559535300092133], "phase": [-0.09685831611286311, -0.08685831611286311, -0.0768583161128631, -0.06685831611286311, -0.05685831611286311, -0.046858316112863105, -0.03685831611286311, -0.0268583161128631, -0.016858316112863106, -0.006858316112863111, 0.003141683887136898, 0.013141683887136893, 0.023141683887136888, 0.0331416838871369, 0.043141683887136906, 0.05314168388713689, 0.0631416838871369, 0.0731416838871369, 0.08314168388713689, 0.0931416838871369, 0.1031416838871369, 0.11314168388713688, 0.1231416838871369, 0.1331416838871369, 0.14314168388713688, 0.1531416838871369, 0.1631416838871369, 0.1731416838871369, 0.18314168388713692, 0.19314168388713687, 0.20314168388713688, 0.2131416838871369, 0.2231416838871369, 0.2331416838871369, 0.24314168388713692, 0.2531416838871369, 0.2631416838871369, 0.2731416838871369, 0.2831416838871369, 0.2931416838871369, 0.3031416838871369, 0.3131416838871369, 0.3231416838871369, 0.3331416838871369, 0.3431416838871369, 0.3531416838871369, 0.3631416838871369, 0.3731416838871369, 0.3831416838871369, 0.3931416838871369, 0.4031416838871369, 0.4131416838871369, 0.4231416838871369, 0.4331416838871369, 0.44314168388713693, 0.45314168388713694]}, {"amplitude": [7.848287743121982, 7.8982877431219825, 7.948287743121983, 7.998287743121984, 8.048287743121982, 8.098287743121983, 8.148287743121983, 8.198287743121984, 8.248287743121985, 8.298287743121982, 8.348287743121983, 8.398287743121983, 8.448287743121984, 8.498287743121985, 8.548287743121982, 8.598287743121983, 8.648287743121983, 8.698287743121984, 8.748287743121985, 8.798287743121982, 8.848287743121983, 8.898287743121983, 8.948287743121984, 8.998287743121985, 9.048287743121982, 9.098287743121983, 9.148287743121983, 9.198287743121984, 9.248287743121985, 9.298287743121982, 9.348287743121983, 9.398287743121983, 9.448287743121984, 9.498287743121985, 9.548287743121982, 9.598287743121983, 9.648287743121983, 9.698287743121984, 9.748287743121985, 9.798287743121982, 9.848287743121983, 9.898287743121983, 9.948287743121984, 9.998287743121985, 10.048287743121982, 10.098287743121983, 10.148287743121983, 10.198287743121984, 10.248287743121985, 10.298287743121982, 10.348287743121983, 10.398287743121983, 10.448287743121984, 10.498287743121985, 10.548287743121982, 10.598287743121983], "phase": [-0.09876883405951378, -0.08876883405951379, -0.07876883405951378, -0.06876883405951378, -0.05876883405951378, -0.04876883405951378, -0.038768834059513785, -0.028768834059513776, -0.01876883405951378, -0.008768834059513786, 0.001231165940486223, 0.011231165940486218, 0.021231165940486213, 0.031231165940486222, 0.04123116594048623, 0.05123116594048621, 0.06123116594048622, 0.07123116594048623, 0.08123116594048621, 0.09123116594048622, 0.10123116594048623, 0.11123116594048621, 0.12123116594048622, 0.13123116594048623, 0.1412311659404862, 0.15123116594048622, 0.16123116594048623, 0.17123116594048624, 0.18123116594048624, 0.1912311659404862, 0.2012311659404862, 0.21123116594048622, 0.22123116594048622, 0.23123116594048623, 0.24123116594048624, 0.2512311659404862, 0.26123116594048623, 0.27123116594048624, 0.28123116594048625, 0.29123116594048626, 0.30123116594048627, 0.3112311659404863, 0.3212311659404862, 0.3312311659404862, 0.3412311659404862, 0.3512311659404862, 0.3612311659404862, 0.3712311659404862, 0.3812311659404862, 0.39123116594048624, 0.40123116594048625, 0.41123116594048625, 0.42123116594048626, 0.43123116594048627, 0.4412311659404863, 0.4512311659404863]}, {"amplitude": [7.929339576994, 7.9793395769940005, 8.029339576994, 8.079339576994, 8.129339576994, 8.179339576994, 8.229339576994, 8.279339576994, 8.329339576994, 8.379339576994, 8.429339576994, 8.479339576994, 8.529339576994, 8.579339576994, 8.629339576994, 8.679339576994, 8.729339576994, 8.779339576994, 8.829339576994, 8.879339576994, 8.929339576994, 8.979339576994, 9.029339576994, 9.079339576994, 9.129339576994, 9.179339576994, 9.229339576994, 9.279339576994, 9.329339576994, 9.379339576994, 9.429339576994, 9.479339576994, 9.529339576994, 9.579339576994, 9.629339576994, 9.679339576994, 9.729339576994, 9.779339576994, 9.829339576994, 9.879339576994, 9.929339576994, 9.979339576994, 10.029339576994, 10.079339576994, 10.129339576994, 10.179339576994, 10.229339576994, 10.279339576994, 10.329339576994, 10.379339576994, 10.429339576994, 10.479339576994, 10.529339576994, 10.579339576994, 10.629339576994, 10.679339576994], "phase": [-0.09980267284282716, -0.08980267284282717, -0.07980267284282716, -0.06980267284282717, -0.05980267284282716, -0.04980267284282716, -0.039802672842827166, -0.029802672842827158, -0.019802672842827163, -0.009802672842827168, 0.00019732715717284133, 0.010197327157172836, 0.02019732715717283, 0.03019732715717284, 0.04019732715717285, 0.05019732715717283, 0.06019732715717284, 0.07019732715717285, 0.08019732715717283, 0.09019732715717284, 0.10019732715717285, 0.11019732715717283, 0.12019732715717284, 0.13019732715717286, 0.1401973271571728, 0.15019732715717282, 0.16019732715717283, 0.17019732715717284, 0.18019732715717285, 0.1901973271571728, 0.2001973271571728, 0.21019732715717282, 0.22019732715717283, 0.23019732715717284, 0.24019732715717285, 0.25019732715717286, 0.2601973271571728, 0.2701973271571728, 0.2801973271571728, 0.29019732715717284, 0.30019732715717284, 0.31019732715717285, 0.3201973271571728, 0.3301973271571728, 0.3401973271571728, 0.35019732715717283, 0.36019732715717284, 0.37019732715717285, 0.3801973271571728, 0.3901973271571728, 0.4001973271571728, 0.41019732715717283, 0.42019732715717284, 0.43019732715717285, 0.44019732715717286, 0.45019732715717287]}, {"amplitude": [8.038586849337827, 8.088586849337828, 8.138586849337827, 8.188586849337828, 8.238586849337826, 8.288586849337827, 8.338586849337828, 8.388586849337827, 8.438586849337828, 8.488586849337826, 8.538586849337827, 8.588586849337828, 8.638586849337827, 8.688586849337828, 8.738586849337826, 8.788586849337827, 8.838586849337828, 8.888586849337827, 8.938586849337828, 8.988586849337826, 9.038586849337827, 9.088586849337828, 9.138586849337827, 9.188586849337828, 9.238586849337826, 9.288586849337827, 9.338586849337828, 9.388586849337827, 9.438586849337828, 9.488586849337826, 9.538586849337827, 9.588586849337828, 9.638586849337827, 9.688586849337828, 9.738586849337826, 9.788586849337827, 9.838586849337828, 9.888586849337827, 9.938586849337828, 9.988586849337826, 10.038586849337827, 10.088586849337828, 10.138586849337827, 10.188586849337828, 10.238586849337826, 10.288586849337827, 10.338586849337828, 10.388586849337827, 10.438586849337828, 10.488586849337826, 10.538586849337827, 10.588586849337828, 10.638586849337827, 10.688586849337828, 10.738586849337826, 10.788586849337827], "phase": [-0.09995065603657316, -0.08995065603657316, -0.07995065603657316, -0.06995065603657316, -0.05995065603657316, -0.04995065603657316, -0.03995065603657316, -0.029950656036573153, -0.01995065603657316, -0.009950656036573163, 4.934396342684555e-05, 0.01004934396342684, 0.020049343963426836, 0.030049343963426844, 0.04004934396342685, 0.050049343963426834, 0.06004934396342684, 0.07004934396342685, 0.08004934396342683, 0.09004934396342684, 0.10004934396342685, 0.11004934396342683, 0.12004934396342684, 0.13004934396342685, 0.14004934396342683, 0.15004934396342684, 0.16004934396342685, 0.17004934396342686, 0.18004934396342687, 0.19004934396342682, 0.20004934396342683, 0.21004934396342684, 0.22004934396342685, 0.23004934396342686, 0.24004934396342686, 0.2500493439634269, 0.2600493439634268, 0.27004934396342684, 0.28004934396342684, 0.29004934396342685, 0.30004934396342686, 0.31004934396342687, 0.3200493439634268, 0.33004934396342683, 0.34004934396342684, 0.35004934396342685, 0.36004934396342686, 0.37004934396342687, 0.3800493439634268, 0.39004934396342683, 0.40004934396342684, 0.41004934396342685, 0.42004934396342686, 0.43004934396342687, 0.4400493439634269, 0.4500493439634269]}, {"amplitude": [8.16029669960156, 8.21029669960156, 8.26029669960156, 8.31029669960156, 8.360296699601559, 8.41029669960156, 8.46029669960156, 8.51029669960156, 8.56029669960156, 8.610296699601559, 8.66029669960156, 8.71029669960156, 8.76029669960156, 8.81029669960156, 8.860296699601559, 8.91029669960156, 8.96029669960156, 9.01029669960156, 9.06029669960156, 9.110296699601559, 9.16029669960156, 9.21029669960156, 9.26029669960156, 9.31029669960156, 9.360296699601559, 9.41029669960156, 9.46029669960156, 9.51029669960156, 9.56029669960156, 9.610296699601559, 9.66029669960156, 9.71029669960156, 9.76029669960156, 9.81029669960156, 9.860296699601559, 9.91029669960156, 9.96029669960156, 10.01029669960156, 10.06029669960156, 10.110296699601559, 10.16029669960156, 10.21029669960156, 10.26029669960156, 10.31029669960156, 10.360296699601559, 10.41029669960156, 10.46029669960156, 10.51029669960156, 10.56029669960156, 10.610296699601559, 10.66029669960156, 10.71029669960156, 10.76029669960156, 10.81029669960156, 10.860296699601559, 10.91029669960156], "phase": [-0.09921147013144778, -0.08921147013144778, -0.07921147013144778, -0.06921147013144778, -0.05921147013144778, -0.049211470131447776, -0.03921147013144778, -0.029211470131447773, -0.019211470131447778, -0.009211470131447783, 0.0007885298685522263, 0.010788529868552221, 0.020788529868552216, 0.030788529868552225, 0.040788529868552234, 0.050788529868552215, 0.060788529868552224, 0.07078852986855223, 0.08078852986855221, 0.09078852986855222, 0.10078852986855223, 0.11078852986855221, 0.12078852986855222, 0.13078852986855222, 0.14078852986855223, 0.15078852986855223, 0.16078852986855224, 0.17078852986855225, 0.18078852986855226, 0.19078852986855221, 0.20078852986855222, 0.21078852986855223, 0.22078852986855224, 0.23078852986855225, 0.24078852986855226, 0.25078852986855227, 0.2607885298685522, 0.27078852986855223, 0.28078852986855224, 0.29078852986855225, 0.30078852986855226, 0.31078852986855227, 0.3207885298685522, 0.33078852986855223, 0.34078852986855224, 0.35078852986855225, 0.36078852986855225, 0.37078852986855226, 0.3807885298685522, 0.3907885298685522, 0.40078852986855223, 0.41078852986855224, 0.42078852986855225, 0.43078852986855226, 0.44078852986855227, 0.4507885298685523]}, {"amplitude": [8.279320448955241, 8.329320448955242, 8.37932044895524, 8.429320448955242, 8.47932044895524, 8.529320448955241, 8.579320448955242, 8.62932044895524, 8.679320448955242, 8.72932044895524, 8.779320448955241, 8.829320448955242, 8.87932044895524, 8.929320448955242, 8.97932044895524, 9.029320448955241, 9.079320448955242, 9.12932044895524, 9.179320448955242, 9.22932044895524, 9.279320448955241, 9.329320448955242, 9.37932044895524, 9.429320448955242, 9.47932044895524, 9.529320448955241, 9.579320448955242, 9.62932044895524, 9.679320448955242, 9.72932044895524, 9.779320448955241, 9.829320448955242, 9.87932044895524, 9.929320448955242, 9.97932044895524, 10.029320448955241, 10.079320448955242, 10.12932044895524, 10.179320448955242, 10.22932044895524, 10.279320448955241, 10.329320448955242, 10.37932044895524, 10.429320448955242, 10.47932044895524, 10.529320448955241, 10.579320448955242, 10.62932044895524, 10.679320448955242, 10.72932044895524, 10.779320448955241, 10.829320448955242, 10.87932044895524, 10.929320448955242, 10.97932044895524, 11.029320448955241], "phase": [-0.09759167619387474, -0.08759167619387474, -0.07759167619387473, -0.06759167619387474, -0.05759167619387474, -0.047591676193874735, -0.03759167619387474, -0.02759167619387473, -0.017591676193874736, -0.007591676193874741, 0.0024083238061252676, 0.012408323806125263, 0.022408323806125258, 0.03240832380612527, 0.042408323806125275, 0.05240832380612526, 0.062408323806125265, 0.07240832380612527, 0.08240832380612526, 0.09240832380612526, 0.10240832380612527, 0.11240832380612525, 0.12240832380612526, 0.13240832380612527, 0.14240832380612525, 0.15240832380612526, 0.16240832380612527, 0.17240832380612528, 0.1824083238061253, 0.19240832380612524, 0.20240832380612525, 0.21240832380612526, 0.22240832380612527, 0.23240832380612528, 0.2424083238061253, 0.2524083238061253, 0.2624083238061252, 0.27240832380612523, 0.28240832380612524, 0.29240832380612525, 0.30240832380612526, 0.31240832380612527, 0.3224083238061253, 0.3324083238061253, 0.3424083238061253, 0.3524083238061253, 0.3624083238061253, 0.3724083238061253, 0.3824083238061252, 0.3924083238061252, 0.40240832380612523, 0.41240832380612524, 0.42240832380612525, 0.43240832380612526, 0.44240832380612527, 0.4524083238061253]}, {"amplitude": [8.383203922298238, 8.433203922298238, 8.483203922298237, 8.533203922298238, 8.583203922298237, 8.633203922298238, 8.683203922298238, 8.733203922298237, 8.783203922298238, 8.833203922298237, 8.883203922298238, 8.933203922298238, 8.983203922298237, 9.033203922298238, 9.083203922298237, 9.133203922298238, 9.183203922298238, 9.233203922298237, 9.283203922298238, 9.333203922298237, 9.383203922298238, 9.433203922298238, 9.483203922298237, 9.533203922298238, 9.583203922298237, 9.633203922298238, 9.683203922298238, 9.733203922298237, 9.783203922298238, 9.833203922298237, 9.883203922298238, 9.933203922298238, 9.983203922298237, 10.033203922298238, 10.083203922298237, 10.133203922298238, 10.183203922298238, 10.233203922298237, 10.283203922298238, 10.333203922298237, 10.383203922298238, 10.433203922298238, 10.483203922298237, 10.533203922298238, 10.583203922298237, 10.633203922298238, 10.683203922298238, 10.733203922298237, 10.783203922298238, 10.833203922298237, 10.883203922298238, 10.933203922298238, 10.983203922298237, 11.033203922298238, 11.083203922298237, 11.133203922298238], "phase": [-0.09510565162951538, -0.08510565162951539, -0.07510565162951538, -0.06510565162951538, -0.05510565162951538, -0.04510565162951538, -0.035105651629515386, -0.025105651629515377, -0.015105651629515382, -0.005105651629515387, 0.004894348370484622, 0.014894348370484617, 0.024894348370484612, 0.03489434837048462, 0.04489434837048463, 0.05489434837048461, 0.06489434837048462, 0.07489434837048463, 0.08489434837048461, 0.09489434837048462, 0.10489434837048463, 0.11489434837048461, 0.12489434837048462, 0.13489434837048464, 0.1448943483704846, 0.1548943483704846, 0.1648943483704846, 0.17489434837048462, 0.18489434837048463, 0.19489434837048458, 0.2048943483704846, 0.2148943483704846, 0.2248943483704846, 0.23489434837048462, 0.24489434837048463, 0.25489434837048464, 0.2648943483704846, 0.2748943483704846, 0.2848943483704846, 0.2948943483704846, 0.3048943483704846, 0.31489434837048463, 0.3248943483704846, 0.3348943483704846, 0.3448943483704846, 0.3548943483704846, 0.3648943483704846, 0.37489434837048463, 0.3848943483704846, 0.3948943483704846, 0.4048943483704846, 0.4148943483704846, 0.4248943483704846, 0.43489434837048463, 0.44489434837048464, 0.45489434837048465]}, {"amplitude": [8.463898767160519, 8.51389876716052, 8.563898767160518, 8.613898767160519, 8.663898767160518, 8.713898767160519, 8.76389876716052, 8.813898767160518, 8.863898767160519, 8.913898767160518, 8.963898767160519, 9.01389876716052, 9.063898767160518, 9.113898767160519, 9.163898767160518, 9.213898767160519, 9.26389876716052, 9.313898767160518, 9.363898767160519, 9.413898767160518, 9.463898767160519, 9.51389876716052, 9.563898767160518, 9.613898767160519, 9.663898767160518, 9.713898767160519, 9.76389876716052, 9.813898767160518, 9.863898767160519, 9.913898767160518, 9.963898767160519, 10.01389876716052, 10.063898767160518, 10.113898767160519, 10.163898767160518, 10.213898767160519, 10.26389876716052, 10.313898767160518, 10.363898767160519, 10.413898767160518, 10.463898767160519, 10.51389876716052, 10.563898767160518, 10.613898767160519, 10.663898767160518, 10.713898767160519, 10.76389876716052, 10.813898767160518, 10.863898767160519, 10.913898767160518, 10.963898767160519, 11.01389876716052, 11.063898767160518, 11.113898767160519, 11.163898767160518, 11.213898767160519], "phase": [-0.09177546256839815, -0.08177546256839816, -0.07177546256839815, -0.06177546256839815, -0.05177546256839815, -0.04177546256839815, -0.03177546256839815, -0.021775462568398143, -0.011775462568398148, -0.0017754625683981534, 0.008224537431601855, 0.01822453743160185, 0.028224537431601845, 0.038224537431601854, 0.04822453743160186, 0.058224537431601844, 0.06822453743160185, 0.07822453743160186, 0.08822453743160184, 0.09822453743160185, 0.10822453743160186, 0.11822453743160184, 0.12822453743160184, 0.13822453743160185, 0.14822453743160185, 0.15822453743160186, 0.16822453743160187, 0.17822453743160188, 0.1882245374316019, 0.19822453743160184, 0.20822453743160185, 0.21822453743160186, 0.22822453743160187, 0.23822453743160188, 0.2482245374316019, 0.2582245374316019, 0.26822453743160185, 0.27822453743160186, 0.28822453743160187, 0.2982245374316019, 0.3082245374316019, 0.3182245374316019, 0.32822453743160185, 0.33822453743160186, 0.34822453743160187, 0.3582245374316019, 0.3682245374316019, 0.3782245374316019, 0.38822453743160185, 0.39822453743160185, 0.40822453743160186, 0.4182245374316019, 0.4282245374316019, 0.4382245374316019, 0.4482245374316019, 0.4582245374316019]}, {"amplitude": [8.518834755652078, 8.568834755652079, 8.618834755652077, 8.668834755652078, 8.718834755652077, 8.768834755652078, 8.818834755652079, 8.868834755652077, 8.918834755652078, 8.968834755652077, 9.018834755652078, 9.068834755652079, 9.118834755652077, 9.168834755652078, 9.218834755652077, 9.268834755652078, 9.318834755652079, 9.368834755652077, 9.418834755652078, 9.468834755652077, 9.518834755652078, 9.568834755652079, 9.618834755652077, 9.668834755652078, 9.718834755652077, 9.768834755652078, 9.818834755652079, 9.868834755652077, 9.918834755652078, 9.968834755652077, 10.018834755652078, 10.068834755652079, 10.118834755652077, 10.168834755652078, 10.218834755652077, 10.268834755652078, 10.318834755652079, 10.368834755652077, 10.418834755652078, 10.468834755652077, 10.518834755652078, 10.568834755652079, 10.618834755652077, 10.668834755652078, 10.718834755652077, 10.768834755652078, 10.818834755652079, 10.868834755652077, 10.918834755652078, 10.968834755652077, 11.018834755652078, 11.068834755652079, 11.118834755652077, 11.168834755652078, 11.218834755652077, 11.268834755652078], "phase": [-0.08763066800438644, -0.07763066800438645, -0.06763066800438644, -0.057630668004386446, -0.047630668004386444, -0.03763066800438644, -0.027630668004386447, -0.017630668004386438, -0.007630668004386443, 0.0023693319956135522, 0.012369331995613561, 0.022369331995613556, 0.03236933199561355, 0.04236933199561356, 0.05236933199561357, 0.06236933199561355, 0.07236933199561356, 0.08236933199561357, 0.09236933199561355, 0.10236933199561356, 0.11236933199561357, 0.12236933199561355, 0.13236933199561357, 0.14236933199561358, 0.15236933199561353, 0.16236933199561354, 0.17236933199561355, 0.18236933199561356, 0.19236933199561357, 0.20236933199561352, 0.21236933199561353, 0.22236933199561354, 0.23236933199561355, 0.24236933199561356, 0.25236933199561357, 0.2623693319956136, 0.27236933199561353, 0.28236933199561354, 0.29236933199561355, 0.30236933199561356, 0.31236933199561356, 0.3223693319956136, 0.3323693319956135, 0.34236933199561354, 0.35236933199561354, 0.36236933199561355, 0.37236933199561356, 0.38236933199561357, 0.3923693319956135, 0.40236933199561353, 0.41236933199561354, 0.42236933199561355, 0.43236933199561356, 0.44236933199561357, 0.4523693319956136, 0.4623693319956136]}, {"amplitude": [8.551202983229484, 8.601202983229484, 8.651202983229483, 8.701202983229484, 8.751202983229483, 8.801202983229484, 8.851202983229484, 8.901202983229483, 8.951202983229484, 9.001202983229483, 9.051202983229484, 9.101202983229484, 9.151202983229483, 9.201202983229484, 9.251202983229483, 9.301202983229484, 9.351202983229484, 9.401202983229483, 9.451202983229484, 9.501202983229483, 9.551202983229484, 9.601202983229484, 9.651202983229483, 9.701202983229484, 9.751202983229483, 9.801202983229484, 9.851202983229484, 9.901202983229483, 9.951202983229484, 10.001202983229483, 10.051202983229484, 10.101202983229484, 10.151202983229483, 10.201202983229484, 10.251202983229483, 10.301202983229484, 10.351202983229484, 10.401202983229483, 10.451202983229484, 10.501202983229483, 10.551202983229484, 10.601202983229484, 10.651202983229483, 10.701202983229484, 10.751202983229483, 10.801202983229484, 10.851202983229484, 10.901202983229483, 10.951202983229484, 11.001202983229483, 11.051202983229484, 11.101202983229484, 11.151202983229483, 11.201202983229484, 11.251202983229483, 11.301202983229484], "phase": [-0.0827080574274562, -0.0727080574274562, -0.06270805742745619, -0.0527080574274562, -0.042708057427456196, -0.032708057427456194, -0.0227080574274562, -0.01270805742745619, -0.0027080574274561953, 0.0072919425725438, 0.01729194257254381, 0.027291942572543804, 0.0372919425725438, 0.04729194257254381, 0.057291942572543816, 0.0672919425725438, 0.0772919425725438, 0.08729194257254382, 0.0972919425725438, 0.1072919425725438, 0.11729194257254381, 0.12729194257254378, 0.1372919425725438, 0.1472919425725438, 0.1572919425725438, 0.16729194257254382, 0.17729194257254383, 0.18729194257254383, 0.19729194257254384, 0.2072919425725438, 0.2172919425725438, 0.22729194257254381, 0.23729194257254382, 0.24729194257254383, 0.25729194257254384, 0.26729194257254385, 0.2772919425725438, 0.2872919425725438, 0.2972919425725438, 0.30729194257254383, 0.31729194257254384, 0.32729194257254385, 0.3372919425725438, 0.3472919425725438, 0.3572919425725438, 0.36729194257254383, 0.37729194257254384, 0.38729194257254385, 0.3972919425725438, 0.4072919425725438, 0.4172919425725438, 0.4272919425725438, 0.43729194257254383, 0.44729194257254384, 0.45729194257254385, 0.46729194257254386]}, {"amplitude": [8.569410880253825, 8.619410880253826, 8.669410880253825, 8.719410880253825, 8.769410880253824, 8.819410880253825, 8.869410880253826, 8.919410880253825, 8.969410880253825, 9.019410880253824, 9.069410880253825, 9.119410880253826, 9.169410880253825, 9.219410880253825, 9.269410880253824, 9.319410880253825, 9.369410880253826, 9.419410880253825, 9.469410880253825, 9.519410880253824, 9.569410880253825, 9.619410880253826, 9.669410880253825, 9.719410880253825, 9.769410880253824, 9.819410880253825, 9.869410880253826, 9.919410880253825, 9.969410880253825, 10.019410880253824, 10.069410880253825, 10.119410880253826, 10.169410880253825, 10.219410880253825, 10.269410880253824, 10.319410880253825, 10.369410880253826, 10.419410880253825, 10.469410880253825, 10.519410880253824, 10.569410880253825, 10.619410880253826, 10.669410880253825, 10.719410880253825, 10.769410880253824, 10.819410880253825, 10.869410880253826, 10.919410880253825, 10.969410880253825, 11.019410880253824, 11.069410880253825, 11.119410880253826, 11.169410880253825, 11.219410880253825, 11.269410880253824, 11.319410880253825], "phase": [-0.07705132427757899, -0.067051324277579, -0.05705132427757899, -0.04705132427757899, -0.03705132427757899, -0.02705132427757899, -0.017051324277578994, -0.007051324277578985, 0.0029486757224210097, 0.012948675722421005, 0.022948675722421014, 0.03294867572242101, 0.042948675722421004, 0.05294867572242101, 0.06294867572242102, 0.072948675722421, 0.08294867572242101, 0.09294867572242102, 0.102948675722421, 0.11294867572242101, 0.12294867572242102, 0.132948675722421, 0.142948675722421, 0.15294867572242102, 0.162948675722421, 0.172948675722421, 0.18294867572242102, 0.19294867572242103, 0.20294867572242103, 0.212948675722421, 0.222948675722421, 0.232948675722421, 0.24294867572242101, 0.252948675722421, 0.26294867572242103, 0.27294867572242104, 0.282948675722421, 0.292948675722421, 0.302948675722421, 0.312948675722421, 0.32294867572242103, 0.33294867572242104, 0.342948675722421, 0.352948675722421, 0.362948675722421, 0.372948675722421, 0.38294867572242103, 0.39294867572242104, 0.402948675722421, 0.412948675722421, 0.422948675722421, 0.432948675722421, 0.442948675722421, 0.45294867572242103, 0.46294867572242104, 0.47294867572242105]}, {"amplitude": [8.585786437626904, 8.635786437626905, 8.685786437626904, 8.735786437626905, 8.785786437626903, 8.835786437626904, 8.885786437626905, 8.935786437626904, 8.985786437626905, 9.035786437626903, 9.085786437626904, 9.135786437626905, 9.185786437626904, 9.235786437626905, 9.285786437626903, 9.335786437626904, 9.385786437626905, 9.435786437626904, 9.485786437626905, 9.535786437626903, 9.585786437626904, 9.635786437626905, 9.685786437626904, 9.735786437626905, 9.785786437626903, 9.835786437626904, 9.885786437626905, 9.935786437626904, 9.985786437626905, 10.035786437626903, 10.085786437626904, 10.135786437626905, 10.185786437626904, 10.235786437626905, 10.285786437626903, 10.335786437626904, 10.385786437626905, 10.435786437626904, 10.485786437626905, 10.535786437626903, 10.585786437626904, 10.635786437626905, 10.685786437626904, 10.735786437626905, 10.785786437626903, 10.835786437626904, 10.885786437626905, 10.935786437626904, 10.985786437626905, 11.035786437626903, 11.085786437626904, 11.135786437626905, 11.185786437626904, 11.235786437626905, 11.285786437626903, 11.335786437626904], "phase": [-0.07071067811865485, -0.06071067811865485, -0.050710678118654845, -0.04071067811865485, -0.030710678118654848, -0.020710678118654846, -0.010710678118654851, -0.0007106781186548422, 0.009289321881345153, 0.019289321881345148, 0.029289321881345157, 0.03928932188134515, 0.04928932188134515, 0.059289321881345156, 0.06928932188134516, 0.07928932188134515, 0.08928932188134515, 0.09928932188134516, 0.10928932188134514, 0.11928932188134515, 0.12928932188134518, 0.13928932188134513, 0.14928932188134514, 0.15928932188134515, 0.16928932188134516, 0.17928932188134517, 0.18928932188134517, 0.19928932188134518, 0.2092893218813452, 0.21928932188134515, 0.22928932188134515, 0.23928932188134516, 0.24928932188134517, 0.2592893218813452, 0.2692893218813452, 0.2792893218813452, 0.28928932188134515, 0.29928932188134516, 0.30928932188134517, 0.3192893218813452, 0.3292893218813452, 0.3392893218813452, 0.34928932188134515, 0.35928932188134516, 0.36928932188134517, 0.3792893218813452, 0.3892893218813452, 0.3992893218813452, 0.40928932188134515, 0.41928932188134516, 0.42928932188134517, 0.4392893218813452, 0.4492893218813452, 0.4592893218813452, 0.4692893218813452, 0.4792893218813452]}, {"amplitude": [8.614714654697217, 8.664714654697217, 8.714714654697218, 8.764714654697219, 8.814714654697216, 8.864714654697217, 8.914714654697217, 8.964714654697218, 9.014714654697219, 9.064714654697216, 9.114714654697217, 9.164714654697217, 9.214714654697218, 9.264714654697219, 9.314714654697216, 9.364714654697217, 9.414714654697217, 9.464714654697218, 9.514714654697219, 9.564714654697216, 9.614714654697217, 9.664714654697217, 9.714714654697218, 9.764714654697219, 9.814714654697216, 9.864714654697217, 9.914714654697217, 9.964714654697218, 10.014714654697219, 10.064714654697216, 10.114714654697217, 10.164714654697217, 10.214714654697218, 10.264714654697219, 10.314714654697216, 10.364714654697217, 10.414714654697217, 10.464714654697218, 10.514714654697219, 10.564714654697216, 10.614714654697217, 10.664714654697217, 10.714714654697218, 10.764714654697219, 10.814714654697216, 10.864714654697217, 10.914714654697217, 10.964714654697218, 11.014714654697219, 11.064714654697216, 11.114714654697217, 11.164714654697217, 11.214714654697218, 11.264714654697219, 11.314714654697216, 11.364714654697217], "phase": [-0.06374239897486898, -0.05374239897486898, -0.04374239897486898, -0.033742398974868984, -0.023742398974868982, -0.01374239897486898, -0.003742398974868985, 0.006257601025131024, 0.01625760102513102, 0.026257601025131014, 0.03625760102513102, 0.04625760102513102, 0.05625760102513101, 0.06625760102513102, 0.07625760102513103, 0.08625760102513101, 0.09625760102513102, 0.10625760102513103, 0.11625760102513101, 0.126257601025131, 0.13625760102513101, 0.14625760102513102, 0.15625760102513103, 0.16625760102513104, 0.176257601025131, 0.186257601025131, 0.196257601025131, 0.20625760102513102, 0.21625760102513103, 0.22625760102513098, 0.236257601025131, 0.246257601025131, 0.256257601025131, 0.266257601025131, 0.276257601025131, 0.28625760102513104, 0.296257601025131, 0.306257601025131, 0.316257601025131, 0.326257601025131, 0.336257601025131, 0.34625760102513103, 0.356257601025131, 0.366257601025131, 0.376257601025131, 0.386257601025131, 0.396257601025131, 0.40625760102513103, 0.416257601025131, 0.426257601025131, 0.436257601025131, 0.446257601025131, 0.456257601025131, 0.46625760102513103, 0.47625760102513104, 0.48625760102513105]}, {"amplitude": [8.670469112517132, 8.720469112517133, 8.770469112517132, 8.820469112517133, 8.870469112517132, 8.920469112517132, 8.970469112517133, 9.020469112517132, 9.070469112517133, 9.120469112517132, 9.170469112517132, 9.220469112517133, 9.270469112517132, 9.320469112517133, 9.370469112517132, 9.420469112517132, 9.470469112517133, 9.520469112517132, 9.570469112517133, 9.620469112517132, 9.670469112517132, 9.720469112517133, 9.770469112517132, 9.820469112517133, 9.870469112517132, 9.920469112517132, 9.970469112517133, 10.020469112517132, 10.070469112517133, 10.120469112517132, 10.170469112517132, 10.220469112517133, 10.270469112517132, 10.320469112517133, 10.370469112517132, 10.420469112517132, 10.470469112517133, 10.520469112517132, 10.570469112517133, 10.620469112517132, 10.670469112517132, 10.720469112517133, 10.770469112517132, 10.820469112517133, 10.870469112517132, 10.920469112517132, 10.970469112517133, 11.020469112517132, 11.070469112517133, 11.120469112517132, 11.170469112517132, 11.220469112517133, 11.270469112517132, 11.320469112517133, 11.370469112517132, 11.420469112517132], "phase": [-0.056208337785213114, -0.04620833778521311, -0.03620833778521311, -0.026208337785213115, -0.016208337785213113, -0.006208337785213111, 0.003791662214786884, 0.013791662214786893, 0.023791662214786888, 0.03379166221478688, 0.04379166221478689, 0.05379166221478689, 0.06379166221478688, 0.07379166221478689, 0.0837916622147869, 0.09379166221478688, 0.10379166221478689, 0.1137916622147869, 0.12379166221478688, 0.1337916622147869, 0.1437916622147869, 0.15379166221478688, 0.1637916622147869, 0.1737916622147869, 0.18379166221478688, 0.1937916622147869, 0.2037916622147869, 0.2137916622147869, 0.2237916622147869, 0.23379166221478687, 0.24379166221478688, 0.2537916622147869, 0.2637916622147869, 0.2737916622147869, 0.2837916622147869, 0.2937916622147869, 0.3037916622147869, 0.3137916622147869, 0.3237916622147869, 0.3337916622147869, 0.3437916622147869, 0.3537916622147869, 0.36379166221478687, 0.3737916622147869, 0.3837916622147869, 0.3937916622147869, 0.4037916622147869, 0.4137916622147869, 0.42379166221478687, 0.4337916622147869, 0.4437916622147869, 0.4537916622147869, 0.4637916622147869, 0.4737916622147869, 0.4837916622147869, 0.49379166221478693]}, {"amplitude": [8.765044536056765, 8.815044536056766, 8.865044536056763, 8.915044536056763, 8.965044536056764, 9.015044536056765, 9.065044536056766, 9.115044536056763, 9.165044536056763, 9.215044536056764, 9.265044536056765, 9.315044536056766, 9.365044536056763, 9.415044536056763, 9.465044536056764, 9.515044536056765, 9.565044536056766, 9.615044536056763, 9.665044536056763, 9.715044536056764, 9.765044536056765, 9.815044536056766, 9.865044536056763, 9.915044536056763, 9.965044536056764, 10.015044536056765, 10.065044536056766, 10.115044536056763, 10.165044536056763, 10.215044536056764, 10.265044536056765, 10.315044536056766, 10.365044536056763, 10.415044536056763, 10.465044536056764, 10.515044536056765, 10.565044536056766, 10.615044536056763, 10.665044536056763, 10.715044536056764, 10.765044536056765, 10.815044536056766, 10.865044536056763, 10.915044536056763, 10.965044536056764, 11.015044536056765, 11.065044536056766, 11.115044536056763, 11.165044536056763, 11.215044536056764, 11.265044536056765, 11.315044536056766, 11.365044536056763, 11.415044536056763, 11.465044536056764, 11.515044536056765], "phase": [-0.04817536741017148, -0.038175367410171475, -0.028175367410171476, -0.018175367410171478, -0.008175367410171476, 0.001824632589828526, 0.011824632589828521, 0.02182463258982853, 0.031824632589828525, 0.04182463258982852, 0.05182463258982853, 0.061824632589828524, 0.07182463258982852, 0.08182463258982853, 0.09182463258982854, 0.10182463258982852, 0.11182463258982853, 0.12182463258982854, 0.13182463258982852, 0.14182463258982853, 0.15182463258982853, 0.16182463258982852, 0.17182463258982852, 0.18182463258982853, 0.19182463258982851, 0.20182463258982852, 0.21182463258982853, 0.22182463258982854, 0.23182463258982855, 0.2418246325898285, 0.2518246325898285, 0.2618246325898285, 0.27182463258982853, 0.28182463258982854, 0.29182463258982855, 0.30182463258982856, 0.3118246325898285, 0.3218246325898285, 0.3318246325898285, 0.34182463258982854, 0.35182463258982855, 0.36182463258982855, 0.3718246325898285, 0.3818246325898285, 0.3918246325898285, 0.40182463258982853, 0.41182463258982854, 0.42182463258982855, 0.4318246325898285, 0.4418246325898285, 0.4518246325898285, 0.46182463258982853, 0.47182463258982854, 0.48182463258982855, 0.49182463258982856, 0.5018246325898286]}, {"amplitude": [8.906296200201957, 8.956296200201958, 9.006296200201957, 9.056296200201958, 9.106296200201957, 9.156296200201957, 9.206296200201958, 9.256296200201957, 9.306296200201958, 9.356296200201957, 9.406296200201957, 9.456296200201958, 9.506296200201957, 9.556296200201958, 9.606296200201957, 9.656296200201957, 9.706296200201958, 9.756296200201957, 9.806296200201958, 9.856296200201957, 9.906296200201957, 9.956296200201958, 10.006296200201957, 10.056296200201958, 10.106296200201957, 10.156296200201957, 10.206296200201958, 10.256296200201957, 10.306296200201958, 10.356296200201957, 10.406296200201957, 10.456296200201958, 10.506296200201957, 10.556296200201958, 10.606296200201957, 10.656296200201957, 10.706296200201958, 10.756296200201957, 10.806296200201958, 10.856296200201957, 10.906296200201957, 10.956296200201958, 11.006296200201957, 11.056296200201958, 11.106296200201957, 11.156296200201957, 11.206296200201958, 11.256296200201957, 11.306296200201958, 11.356296200201957, 11.406296200201957, 11.456296200201958, 11.506296200201957, 11.556296200201958, 11.606296200201957, 11.656296200201957], "phase": [-0.039714789063478056, -0.029714789063478055, -0.019714789063478056, -0.009714789063478058, 0.00028521093652194435, 0.010285210936521946, 0.02028521093652194, 0.03028521093652195, 0.040285210936521945, 0.05028521093652194, 0.06028521093652195, 0.07028521093652194, 0.08028521093652194, 0.09028521093652195, 0.10028521093652196, 0.11028521093652194, 0.12028521093652195, 0.13028521093652196, 0.14028521093652194, 0.15028521093652195, 0.16028521093652195, 0.17028521093652194, 0.18028521093652194, 0.19028521093652195, 0.20028521093652193, 0.21028521093652194, 0.22028521093652195, 0.23028521093652196, 0.24028521093652197, 0.2502852109365219, 0.2602852109365219, 0.2702852109365219, 0.2802852109365219, 0.29028521093652193, 0.30028521093652194, 0.31028521093652195, 0.32028521093652196, 0.33028521093652197, 0.340285210936522, 0.350285210936522, 0.360285210936522, 0.370285210936522, 0.3802852109365219, 0.3902852109365219, 0.4002852109365219, 0.4102852109365219, 0.42028521093652194, 0.43028521093652194, 0.44028521093652195, 0.45028521093652196, 0.46028521093652197, 0.470285210936522, 0.480285210936522, 0.490285210936522, 0.500285210936522, 0.510285210936522]}, {"amplitude": [9.096649056361557, 9.146649056361557, 9.196649056361558, 9.246649056361559, 9.296649056361556, 9.346649056361557, 9.396649056361557, 9.446649056361558, 9.496649056361559, 9.546649056361556, 9.596649056361557, 9.646649056361557, 9.696649056361558, 9.746649056361559, 9.796649056361556, 9.846649056361557, 9.896649056361557, 9.946649056361558, 9.996649056361559, 10.046649056361556, 10.096649056361557, 10.146649056361557, 10.196649056361558, 10.246649056361559, 10.296649056361556, 10.346649056361557, 10.396649056361557, 10.446649056361558, 10.496649056361559, 10.546649056361556, 10.596649056361557, 10.646649056361557, 10.696649056361558, 10.746649056361559, 10.796649056361556, 10.846649056361557, 10.896649056361557, 10.946649056361558, 10.996649056361559, 11.046649056361556, 11.096649056361557, 11.146649056361557, 11.196649056361558, 11.246649056361559, 11.296649056361556, 11.346649056361557, 11.396649056361557, 11.446649056361558, 11.496649056361559, 11.546649056361556, 11.596649056361557, 11.646649056361557, 11.696649056361558, 11.746649056361559, 11.796649056361556, 11.846649056361557], "phase": [-0.03090169943749479, -0.020901699437494793, -0.010901699437494791, -0.0009016994374947927, 0.00909830056250521, 0.01909830056250521, 0.029098300562505206, 0.03909830056250521, 0.04909830056250521, 0.0590983005625052, 0.06909830056250521, 0.0790983005625052, 0.0890983005625052, 0.09909830056250521, 0.10909830056250522, 0.1190983005625052, 0.1290983005625052, 0.13909830056250522, 0.1490983005625052, 0.1590983005625052, 0.16909830056250522, 0.1790983005625052, 0.1890983005625052, 0.19909830056250521, 0.2090983005625052, 0.2190983005625052, 0.2290983005625052, 0.23909830056250522, 0.24909830056250523, 0.2590983005625052, 0.2690983005625052, 0.27909830056250523, 0.28909830056250524, 0.29909830056250525, 0.30909830056250526, 0.31909830056250527, 0.3290983005625052, 0.33909830056250523, 0.34909830056250524, 0.35909830056250525, 0.36909830056250525, 0.37909830056250526, 0.3890983005625052, 0.3990983005625052, 0.40909830056250523, 0.41909830056250524, 0.42909830056250525, 0.43909830056250526, 0.4490983005625052, 0.4590983005625052, 0.46909830056250523, 0.47909830056250524, 0.48909830056250525, 0.49909830056250526, 0.5090983005625053, 0.5190983005625053]}, {"amplitude": [9.332559544374176, 9.382559544374176, 9.432559544374175, 9.482559544374176, 9.532559544374175, 9.582559544374176, 9.632559544374176, 9.682559544374175, 9.732559544374176, 9.782559544374175, 9.832559544374176, 9.882559544374176, 9.932559544374175, 9.982559544374176, 10.032559544374175, 10.082559544374176, 10.132559544374176, 10.182559544374175, 10.232559544374176, 10.282559544374175, 10.332559544374176, 10.382559544374176, 10.432559544374175, 10.482559544374176, 10.532559544374175, 10.582559544374176, 10.632559544374176, 10.682559544374175, 10.732559544374176, 10.782559544374175, 10.832559544374176, 10.882559544374176, 10.932559544374175, 10.982559544374176, 11.032559544374175, 11.082559544374176, 11.132559544374176, 11.182559544374175, 11.232559544374176, 11.282559544374175, 11.332559544374176, 11.382559544374176, 11.432559544374175, 11.482559544374176, 11.532559544374175, 11.582559544374176, 11.632559544374176, 11.682559544374175, 11.732559544374176, 11.782559544374175, 11.832559544374176, 11.882559544374176, 11.932559544374175, 11.982559544374176, 12.032559544374175, 12.082559544374176], "phase": [-0.021814324139654354, -0.011814324139654353, -0.0018143241396543532, 0.008185675860345645, 0.018185675860345647, 0.02818567586034565, 0.038185675860345644, 0.04818567586034565, 0.05818567586034565, 0.06818567586034564, 0.07818567586034565, 0.08818567586034565, 0.09818567586034564, 0.10818567586034565, 0.11818567586034566, 0.12818567586034563, 0.13818567586034564, 0.14818567586034564, 0.15818567586034565, 0.16818567586034566, 0.17818567586034567, 0.18818567586034562, 0.19818567586034563, 0.20818567586034564, 0.21818567586034565, 0.22818567586034566, 0.23818567586034567, 0.24818567586034568, 0.2581856758603457, 0.26818567586034564, 0.27818567586034565, 0.28818567586034566, 0.29818567586034567, 0.3081856758603457, 0.3181856758603457, 0.3281856758603457, 0.33818567586034565, 0.34818567586034566, 0.35818567586034566, 0.3681856758603457, 0.3781856758603457, 0.3881856758603457, 0.39818567586034564, 0.40818567586034565, 0.41818567586034566, 0.42818567586034567, 0.4381856758603457, 0.4481856758603457, 0.45818567586034564, 0.46818567586034565, 0.47818567586034566, 0.48818567586034567, 0.4981856758603457, 0.5081856758603457, 0.5181856758603457, 0.5281856758603457]}, {"amplitude": [9.604807430640872, 9.654807430640872, 9.704807430640871, 9.754807430640872, 9.80480743064087, 9.854807430640872, 9.904807430640872, 9.954807430640871, 10.004807430640872, 10.05480743064087, 10.104807430640872, 10.154807430640872, 10.204807430640871, 10.254807430640872, 10.30480743064087, 10.354807430640872, 10.404807430640872, 10.454807430640871, 10.504807430640872, 10.55480743064087, 10.604807430640872, 10.654807430640872, 10.704807430640871, 10.754807430640872, 10.80480743064087, 10.854807430640872, 10.904807430640872, 10.954807430640871, 11.004807430640872, 11.05480743064087, 11.104807430640872, 11.154807430640872, 11.204807430640871, 11.254807430640872, 11.30480743064087, 11.354807430640872, 11.404807430640872, 11.454807430640871, 11.504807430640872, 11.55480743064087, 11.604807430640872, 11.654807430640872, 11.704807430640871, 11.754807430640872, 11.80480743064087, 11.854807430640872, 11.904807430640872, 11.954807430640871, 12.004807430640872, 12.05480743064087, 12.104807430640872, 12.154807430640872, 12.204807430640871, 12.254807430640872, 12.30480743064087, 12.354807430640872], "phase": [-0.012533323356430578, -0.0025333233564305783, 0.007466676643569422, 0.01746667664356942, 0.027466676643569422, 0.037466676643569424, 0.04746667664356942, 0.05746667664356943, 0.06746667664356942, 0.07746667664356942, 0.08746667664356943, 0.09746667664356942, 0.10746667664356942, 0.11746667664356943, 0.12746667664356942, 0.13746667664356943, 0.14746667664356944, 0.15746667664356945, 0.1674666766435694, 0.1774666766435694, 0.18746667664356942, 0.19746667664356943, 0.20746667664356944, 0.21746667664356945, 0.2274666766435694, 0.2374666766435694, 0.24746667664356942, 0.2574666766435694, 0.26746667664356943, 0.2774666766435694, 0.2874666766435694, 0.2974666766435694, 0.3074666766435694, 0.3174666766435694, 0.32746667664356943, 0.33746667664356944, 0.3474666766435694, 0.3574666766435694, 0.3674666766435694, 0.3774666766435694, 0.38746667664356943, 0.39746667664356944, 0.4074666766435694, 0.4174666766435694, 0.4274666766435694, 0.4374666766435694, 0.4474666766435694, 0.45746667664356944, 0.4674666766435694, 0.4774666766435694, 0.4874666766435694, 0.4974666766435694, 0.5074666766435695, 0.5174666766435695, 0.5274666766435695, 0.5374666766435695]}, {"amplitude": [9.899578511774452, 9.949578511774453, 9.999578511774452, 10.049578511774452, 10.099578511774451, 10.149578511774452, 10.199578511774453, 10.249578511774452, 10.299578511774452, 10.349578511774451, 10.399578511774452, 10.449578511774453, 10.499578511774452, 10.549578511774452, 10.599578511774451, 10.649578511774452, 10.699578511774453, 10.749578511774452, 10.799578511774452, 10.849578511774451, 10.899578511774452, 10.949578511774453, 10.999578511774452, 11.049578511774452, 11.099578511774451, 11.149578511774452, 11.199578511774453, 11.249578511774452, 11.299578511774452, 11.349578511774451, 11.399578511774452, 11.449578511774453, 11.499578511774452, 11.549578511774452, 11.599578511774451, 11.649578511774452, 11.699578511774453, 11.749578511774452, 11.799578511774452, 11.849578511774451, 11.899578511774452, 11.949578511774453, 11.999578511774452, 12.049578511774452, 12.099578511774451, 12.149578511774452, 12.199578511774453, 12.249578511774452, 12.299578511774452, 12.349578511774451, 12.399578511774452, 12.449578511774453, 12.499578511774452, 12.549578511774452, 12.599578511774451, 12.649578511774452], "phase": [-0.0031410759078128606, 0.00685892409218714, 0.01685892409218714, 0.02685892409218714, 0.03685892409218714, 0.04685892409218714, 0.05685892409218714, 0.06685892409218715, 0.07685892409218714, 0.08685892409218714, 0.09685892409218715, 0.10685892409218714, 0.11685892409218714, 0.12685892409218713, 0.13685892409218714, 0.14685892409218712, 0.15685892409218713, 0.16685892409218714, 0.17685892409218712, 0.18685892409218713, 0.19685892409218714, 0.20685892409218712, 0.21685892409218713, 0.22685892409218714, 0.23685892409218712, 0.24685892409218713, 0.25685892409218714, 0.26685892409218714, 0.27685892409218715, 0.2868589240921871, 0.2968589240921871, 0.3068589240921871, 0.31685892409218713, 0.32685892409218714, 0.33685892409218715, 0.34685892409218716, 0.3568589240921871, 0.3668589240921871, 0.37685892409218713, 0.38685892409218714, 0.39685892409218715, 0.40685892409218716, 0.4168589240921871, 0.4268589240921871, 0.43685892409218713, 0.44685892409218714, 0.45685892409218715, 0.46685892409218716, 0.4768589240921871, 0.4868589240921871, 0.4968589240921871, 0.5068589240921871, 0.5168589240921871, 0.5268589240921872, 0.5368589240921872, 0.5468589240921872]}, {"amplitude": [10.20018800520808, 10.25018800520808, 10.30018800520808, 10.35018800520808, 10.40018800520808, 10.45018800520808, 10.50018800520808, 10.55018800520808, 10.60018800520808, 10.65018800520808, 10.70018800520808, 10.75018800520808, 10.80018800520808, 10.85018800520808, 10.90018800520808, 10.95018800520808, 11.00018800520808, 11.05018800520808, 11.10018800520808, 11.15018800520808, 11.20018800520808, 11.25018800520808, 11.30018800520808, 11.35018800520808, 11.40018800520808, 11.45018800520808, 11.50018800520808, 11.55018800520808, 11.60018800520808, 11.65018800520808, 11.70018800520808, 11.75018800520808, 11.80018800520808, 11.85018800520808, 11.90018800520808, 11.95018800520808, 12.00018800520808, 12.05018800520808, 12.10018800520808, 12.15018800520808, 12.20018800520808, 12.25018800520808, 12.30018800520808, 12.35018800520808, 12.40018800520808, 12.45018800520808, 12.50018800520808, 12.55018800520808, 12.60018800520808, 12.65018800520808, 12.70018800520808, 12.75018800520808, 12.80018800520808, 12.85018800520808, 12.90018800520808, 12.95018800520808], "phase": [0.006279051952931253, 0.016279051952931254, 0.026279051952931252, 0.036279051952931254, 0.046279051952931256, 0.05627905195293126, 0.06627905195293125, 0.07627905195293126, 0.08627905195293126, 0.09627905195293125, 0.10627905195293126, 0.11627905195293126, 0.12627905195293124, 0.13627905195293125, 0.14627905195293125, 0.15627905195293124, 0.16627905195293124, 0.17627905195293125, 0.18627905195293123, 0.19627905195293124, 0.20627905195293125, 0.21627905195293123, 0.22627905195293124, 0.23627905195293125, 0.24627905195293123, 0.25627905195293127, 0.2662790519529313, 0.2762790519529313, 0.2862790519529313, 0.29627905195293125, 0.30627905195293126, 0.31627905195293127, 0.3262790519529313, 0.3362790519529313, 0.3462790519529313, 0.3562790519529313, 0.36627905195293126, 0.37627905195293126, 0.3862790519529313, 0.3962790519529313, 0.4062790519529313, 0.4162790519529313, 0.42627905195293125, 0.43627905195293126, 0.44627905195293127, 0.4562790519529313, 0.4662790519529313, 0.4762790519529313, 0.48627905195293125, 0.49627905195293126, 0.5062790519529312, 0.5162790519529312, 0.5262790519529312, 0.5362790519529312, 0.5462790519529312, 0.5562790519529313]}, {"amplitude": [10.489204505768205, 10.539204505768206, 10.589204505768205, 10.639204505768205, 10.689204505768204, 10.739204505768205, 10.789204505768206, 10.839204505768205, 10.889204505768205, 10.939204505768204, 10.989204505768205, 11.039204505768206, 11.089204505768205, 11.139204505768205, 11.189204505768204, 11.239204505768205, 11.289204505768206, 11.339204505768205, 11.389204505768205, 11.439204505768204, 11.489204505768205, 11.539204505768206, 11.589204505768205, 11.639204505768205, 11.689204505768204, 11.739204505768205, 11.789204505768206, 11.839204505768205, 11.889204505768205, 11.939204505768204, 11.989204505768205, 12.039204505768206, 12.089204505768205, 12.139204505768205, 12.189204505768204, 12.239204505768205, 12.289204505768206, 12.339204505768205, 12.389204505768205, 12.439204505768204, 12.489204505768205, 12.539204505768206, 12.589204505768205, 12.639204505768205, 12.689204505768204, 12.739204505768205, 12.789204505768206, 12.839204505768205, 12.889204505768205, 12.939204505768204, 12.989204505768205, 13.039204505768206, 13.089204505768205, 13.139204505768205, 13.189204505768204, 13.239204505768205], "phase": [0.015643446504023127, 0.02564344650402313, 0.035643446504023124, 0.045643446504023126, 0.05564344650402313, 0.06564344650402312, 0.07564344650402313, 0.08564344650402314, 0.09564344650402312, 0.10564344650402313, 0.11564344650402314, 0.12564344650402312, 0.13564344650402313, 0.14564344650402314, 0.15564344650402315, 0.16564344650402313, 0.17564344650402314, 0.18564344650402315, 0.19564344650402313, 0.20564344650402314, 0.21564344650402315, 0.22564344650402313, 0.23564344650402314, 0.24564344650402314, 0.2556434465040231, 0.2656434465040231, 0.2756434465040231, 0.2856434465040231, 0.29564344650402313, 0.3056434465040231, 0.3156434465040231, 0.3256434465040231, 0.3356434465040231, 0.3456434465040231, 0.35564344650402313, 0.36564344650402314, 0.3756434465040231, 0.3856434465040231, 0.3956434465040231, 0.4056434465040231, 0.41564344650402313, 0.42564344650402314, 0.4356434465040231, 0.4456434465040231, 0.4556434465040231, 0.4656434465040231, 0.4756434465040231, 0.48564344650402314, 0.4956434465040231, 0.5056434465040232, 0.5156434465040232, 0.5256434465040232, 0.5356434465040232, 0.5456434465040232, 0.5556434465040232, 0.5656434465040232]}, {"amplitude": [10.750678151980315, 10.800678151980316, 10.850678151980315, 10.900678151980316, 10.950678151980314, 11.000678151980315, 11.050678151980316, 11.100678151980315, 11.150678151980316, 11.200678151980314, 11.250678151980315, 11.300678151980316, 11.350678151980315, 11.400678151980316, 11.450678151980314, 11.500678151980315, 11.550678151980316, 11.600678151980315, 11.650678151980316, 11.700678151980314, 11.750678151980315, 11.800678151980316, 11.850678151980315, 11.900678151980316, 11.950678151980314, 12.000678151980315, 12.050678151980316, 12.100678151980315, 12.150678151980316, 12.200678151980314, 12.250678151980315, 12.300678151980316, 12.350678151980315, 12.400678151980316, 12.450678151980314, 12.500678151980315, 12.550678151980316, 12.600678151980315, 12.650678151980316, 12.700678151980314, 12.750678151980315, 12.800678151980316, 12.850678151980315, 12.900678151980316, 12.950678151980314, 13.000678151980315, 13.050678151980316, 13.100678151980315, 13.150678151980316, 13.200678151980314, 13.250678151980315, 13.300678151980316, 13.350678151980315, 13.400678151980316, 13.450678151980314, 13.500678151980315], "phase": [0.024868988716485466, 0.034868988716485465, 0.04486898871648547, 0.05486898871648546, 0.06486898871648547, 0.07486898871648547, 0.08486898871648546, 0.09486898871648547, 0.10486898871648546, 0.11486898871648546, 0.12486898871648547, 0.13486898871648548, 0.14486898871648546, 0.15486898871648547, 0.16486898871648548, 0.17486898871648546, 0.18486898871648547, 0.19486898871648548, 0.20486898871648546, 0.21486898871648547, 0.22486898871648547, 0.23486898871648546, 0.24486898871648546, 0.2548689887164855, 0.26486898871648545, 0.27486898871648546, 0.28486898871648547, 0.2948689887164855, 0.3048689887164855, 0.31486898871648544, 0.32486898871648545, 0.33486898871648546, 0.34486898871648547, 0.3548689887164855, 0.3648689887164855, 0.3748689887164855, 0.38486898871648545, 0.39486898871648546, 0.40486898871648547, 0.4148689887164855, 0.4248689887164855, 0.4348689887164855, 0.44486898871648545, 0.45486898871648546, 0.46486898871648547, 0.4748689887164855, 0.4848689887164855, 0.4948689887164855, 0.5048689887164854, 0.5148689887164855, 0.5248689887164855, 0.5348689887164855, 0.5448689887164855, 0.5548689887164855, 0.5648689887164855, 0.5748689887164855]}, {"amplitude": [10.972162015709188, 11.022162015709188, 11.072162015709187, 11.122162015709188, 11.172162015709187, 11.222162015709188, 11.272162015709188, 11.322162015709187, 11.372162015709188, 11.422162015709187, 11.472162015709188, 11.522162015709188, 11.572162015709187, 11.622162015709188, 11.672162015709187, 11.722162015709188, 11.772162015709188, 11.822162015709187, 11.872162015709188, 11.922162015709187, 11.972162015709188, 12.022162015709188, 12.072162015709187, 12.122162015709188, 12.172162015709187, 12.222162015709188, 12.272162015709188, 12.322162015709187, 12.372162015709188, 12.422162015709187, 12.472162015709188, 12.522162015709188, 12.572162015709187, 12.622162015709188, 12.672162015709187, 12.722162015709188, 12.772162015709188, 12.822162015709187, 12.872162015709188, 12.922162015709187, 12.972162015709188, 13.022162015709188, 13.072162015709187, 13.122162015709188, 13.172162015709187, 13.222162015709188, 13.272162015709188, 13.322162015709187, 13.372162015709188, 13.422162015709187, 13.472162015709188, 13.522162015709188, 13.572162015709187, 13.622162015709188, 13.672162015709187, 13.722162015709188], "phase": [0.03387379202452908, 0.04387379202452908, 0.05387379202452908, 0.06387379202452909, 0.07387379202452908, 0.08387379202452908, 0.09387379202452908, 0.1038737920245291, 0.11387379202452907, 0.12387379202452908, 0.1338737920245291, 0.14387379202452907, 0.15387379202452908, 0.1638737920245291, 0.1738737920245291, 0.18387379202452908, 0.1938737920245291, 0.2038737920245291, 0.21387379202452908, 0.2238737920245291, 0.2338737920245291, 0.24387379202452908, 0.2538737920245291, 0.2638737920245291, 0.27387379202452905, 0.28387379202452906, 0.29387379202452907, 0.3038737920245291, 0.3138737920245291, 0.32387379202452904, 0.33387379202452905, 0.34387379202452906, 0.35387379202452907, 0.3638737920245291, 0.3738737920245291, 0.3838737920245291, 0.39387379202452905, 0.40387379202452905, 0.41387379202452906, 0.4238737920245291, 0.4338737920245291, 0.4438737920245291, 0.45387379202452904, 0.46387379202452905, 0.47387379202452906, 0.48387379202452907, 0.4938737920245291, 0.5038737920245291, 0.5138737920245291, 0.5238737920245291, 0.5338737920245291, 0.5438737920245291, 0.5538737920245291, 0.5638737920245291, 0.5738737920245292, 0.5838737920245292]}, {"amplitude": [11.146244758348752, 11.196244758348753, 11.246244758348752, 11.296244758348752, 11.346244758348751, 11.396244758348752, 11.446244758348753, 11.496244758348752, 11.546244758348752, 11.596244758348751, 11.646244758348752, 11.696244758348753, 11.746244758348752, 11.796244758348752, 11.846244758348751, 11.896244758348752, 11.946244758348753, 11.996244758348752, 12.046244758348752, 12.096244758348751, 12.146244758348752, 12.196244758348753, 12.246244758348752, 12.296244758348752, 12.346244758348751, 12.396244758348752, 12.446244758348753, 12.496244758348752, 12.546244758348752, 12.596244758348751, 12.646244758348752, 12.696244758348753, 12.746244758348752, 12.796244758348752, 12.846244758348751, 12.896244758348752, 12.946244758348753, 12.996244758348752, 13.046244758348752, 13.096244758348751, 13.146244758348752, 13.196244758348753, 13.246244758348752, 13.296244758348752, 13.346244758348751, 13.396244758348752, 13.446244758348753, 13.496244758348752, 13.546244758348752, 13.596244758348751, 13.646244758348752, 13.696244758348753, 13.746244758348752, 13.796244758348752, 13.846244758348751, 13.896244758348752], "phase": [0.04257792915650732, 0.05257792915650732, 0.06257792915650733, 0.07257792915650732, 0.08257792915650733, 0.09257792915650732, 0.10257792915650732, 0.11257792915650733, 0.12257792915650732, 0.13257792915650732, 0.14257792915650733, 0.1525779291565073, 0.16257792915650732, 0.17257792915650733, 0.18257792915650733, 0.19257792915650732, 0.20257792915650732, 0.21257792915650733, 0.22257792915650731, 0.23257792915650732, 0.24257792915650733, 0.25257792915650734, 0.26257792915650735, 0.27257792915650736, 0.2825779291565073, 0.2925779291565073, 0.30257792915650733, 0.31257792915650734, 0.32257792915650735, 0.3325779291565073, 0.3425779291565073, 0.3525779291565073, 0.36257792915650733, 0.37257792915650734, 0.38257792915650735, 0.39257792915650735, 0.4025779291565073, 0.4125779291565073, 0.4225779291565073, 0.43257792915650733, 0.44257792915650734, 0.45257792915650735, 0.4625779291565073, 0.4725779291565073, 0.4825779291565073, 0.49257792915650733, 0.5025779291565073, 0.5125779291565074, 0.5225779291565074, 0.5325779291565074, 0.5425779291565074, 0.5525779291565074, 0.5625779291565074, 0.5725779291565074, 0.5825779291565074, 0.5925779291565074]}, {"amplitude": [11.271381209151347, 11.321381209151347, 11.371381209151348, 11.421381209151349, 11.471381209151346, 11.521381209151347, 11.571381209151347, 11.621381209151348, 11.671381209151349, 11.721381209151346, 11.771381209151347, 11.821381209151347, 11.871381209151348, 11.921381209151349, 11.971381209151346, 12.021381209151347, 12.071381209151347, 12.121381209151348, 12.171381209151349, 12.221381209151346, 12.271381209151347, 12.321381209151347, 12.371381209151348, 12.421381209151349, 12.471381209151346, 12.521381209151347, 12.571381209151347, 12.621381209151348, 12.671381209151349, 12.721381209151346, 12.771381209151347, 12.821381209151347, 12.871381209151348, 12.921381209151349, 12.971381209151346, 13.021381209151347, 13.071381209151347, 13.121381209151348, 13.171381209151349, 13.221381209151346, 13.271381209151347, 13.321381209151347, 13.371381209151348, 13.421381209151349, 13.471381209151346, 13.521381209151347, 13.571381209151347, 13.621381209151348, 13.671381209151349, 13.721381209151346, 13.771381209151347, 13.821381209151347, 13.871381209151348, 13.921381209151349, 13.971381209151346, 14.021381209151347], "phase": [0.050904141575037136, 0.06090414157503714, 0.07090414157503713, 0.08090414157503714, 0.09090414157503714, 0.10090414157503713, 0.11090414157503714, 0.12090414157503715, 0.13090414157503713, 0.14090414157503714, 0.15090414157503715, 0.16090414157503713, 0.17090414157503714, 0.18090414157503715, 0.19090414157503716, 0.20090414157503714, 0.21090414157503715, 0.22090414157503716, 0.23090414157503714, 0.24090414157503715, 0.25090414157503715, 0.2609041415750371, 0.2709041415750371, 0.2809041415750371, 0.29090414157503713, 0.30090414157503714, 0.31090414157503715, 0.32090414157503716, 0.33090414157503717, 0.3409041415750371, 0.35090414157503713, 0.36090414157503714, 0.37090414157503715, 0.38090414157503716, 0.39090414157503717, 0.4009041415750372, 0.41090414157503713, 0.42090414157503714, 0.43090414157503715, 0.44090414157503716, 0.45090414157503717, 0.4609041415750372, 0.4709041415750371, 0.48090414157503714, 0.49090414157503715, 0.5009041415750372, 0.5109041415750372, 0.5209041415750372, 0.5309041415750371, 0.5409041415750371, 0.5509041415750371, 0.5609041415750371, 0.5709041415750371, 0.5809041415750371, 0.5909041415750371, 0.6009041415750371]}, {"amplitude": [11.351906080272688, 11.401906080272688, 11.451906080272687, 11.501906080272688, 11.551906080272687, 11.601906080272688, 11.651906080272688, 11.701906080272687, 11.751906080272688, 11.801906080272687, 11.851906080272688, 11.901906080272688, 11.951906080272687, 12.001906080272688, 12.051906080272687, 12.101906080272688, 12.151906080272688, 12.201906080272687, 12.251906080272688, 12.301906080272687, 12.351906080272688, 12.401906080272688, 12.451906080272687, 12.501906080272688, 12.551906080272687, 12.601906080272688, 12.651906080272688, 12.701906080272687, 12.751906080272688, 12.801906080272687, 12.851906080272688, 12.901906080272688, 12.951906080272687, 13.001906080272688, 13.051906080272687, 13.101906080272688, 13.151906080272688, 13.201906080272687, 13.251906080272688, 13.301906080272687, 13.351906080272688, 13.401906080272688, 13.451906080272687, 13.501906080272688, 13.551906080272687, 13.601906080272688, 13.651906080272688, 13.701906080272687, 13.751906080272688, 13.801906080272687, 13.851906080272688, 13.901906080272688, 13.951906080272687, 14.001906080272688, 14.051906080272687, 14.101906080272688], "phase": [0.05877852522924727, 0.06877852522924727, 0.07877852522924728, 0.08877852522924727, 0.09877852522924727, 0.10877852522924727, 0.11877852522924727, 0.12877852522924726, 0.13877852522924727, 0.14877852522924728, 0.1587785252292473, 0.16877852522924727, 0.17877852522924725, 0.18877852522924726, 0.19877852522924727, 0.20877852522924728, 0.2187785252292473, 0.2287785252292473, 0.23877852522924725, 0.24877852522924726, 0.25877852522924727, 0.2687785252292473, 0.2787785252292473, 0.2887785252292473, 0.29877852522924725, 0.30877852522924726, 0.31877852522924727, 0.3287785252292473, 0.3387785252292473, 0.34877852522924724, 0.35877852522924725, 0.36877852522924726, 0.37877852522924726, 0.3887785252292473, 0.3987785252292473, 0.4087785252292473, 0.41877852522924724, 0.42877852522924725, 0.43877852522924726, 0.44877852522924727, 0.4587785252292473, 0.4687785252292473, 0.47877852522924724, 0.48877852522924725, 0.49877852522924726, 0.5087785252292473, 0.5187785252292473, 0.5287785252292473, 0.5387785252292473, 0.5487785252292473, 0.5587785252292473, 0.5687785252292473, 0.5787785252292473, 0.5887785252292473, 0.5987785252292473, 0.6087785252292474]}, {"amplitude": [11.397230696796761, 11.447230696796762, 11.49723069679676, 11.547230696796762, 11.59723069679676, 11.647230696796761, 11.697230696796762, 11.74723069679676, 11.797230696796762, 11.84723069679676, 11.897230696796761, 11.947230696796762, 11.99723069679676, 12.047230696796762, 12.09723069679676, 12.147230696796761, 12.197230696796762, 12.24723069679676, 12.297230696796762, 12.34723069679676, 12.397230696796761, 12.447230696796762, 12.49723069679676, 12.547230696796762, 12.59723069679676, 12.647230696796761, 12.697230696796762, 12.74723069679676, 12.797230696796762, 12.84723069679676, 12.897230696796761, 12.947230696796762, 12.99723069679676, 13.047230696796762, 13.09723069679676, 13.147230696796761, 13.197230696796762, 13.24723069679676, 13.297230696796762, 13.34723069679676, 13.397230696796761, 13.447230696796762, 13.49723069679676, 13.547230696796762, 13.59723069679676, 13.647230696796761, 13.697230696796762, 13.74723069679676, 13.797230696796762, 13.84723069679676, 13.897230696796761, 13.947230696796762, 13.99723069679676, 14.047230696796762, 14.09723069679676, 14.147230696796761], "phase": [0.0661311865323651, 0.0761311865323651, 0.08613118653236511, 0.0961311865323651, 0.10613118653236511, 0.11613118653236511, 0.1261311865323651, 0.1361311865323651, 0.14613118653236512, 0.1561311865323651, 0.1661311865323651, 0.1761311865323651, 0.1861311865323651, 0.1961311865323651, 0.20613118653236512, 0.2161311865323651, 0.2261311865323651, 0.23613118653236512, 0.2461311865323651, 0.2561311865323651, 0.2661311865323651, 0.2761311865323651, 0.28613118653236513, 0.29613118653236514, 0.3061311865323651, 0.3161311865323651, 0.3261311865323651, 0.3361311865323651, 0.34613118653236513, 0.3561311865323651, 0.3661311865323651, 0.3761311865323651, 0.3861311865323651, 0.3961311865323651, 0.40613118653236513, 0.41613118653236514, 0.4261311865323651, 0.4361311865323651, 0.4461311865323651, 0.4561311865323651, 0.4661311865323651, 0.47613118653236514, 0.4861311865323651, 0.4961311865323651, 0.5061311865323651, 0.5161311865323651, 0.5261311865323651, 0.5361311865323651, 0.546131186532365, 0.556131186532365, 0.566131186532365, 0.5761311865323651, 0.5861311865323651, 0.5961311865323651, 0.6061311865323651, 0.6161311865323651]}, {"amplitude": [11.420337284773533, 11.470337284773533, 11.52033728477353, 11.570337284773531, 11.620337284773532, 11.670337284773533, 11.720337284773533, 11.77033728477353, 11.820337284773531, 11.870337284773532, 11.920337284773533, 11.970337284773533, 12.02033728477353, 12.070337284773531, 12.120337284773532, 12.170337284773533, 12.220337284773533, 12.27033728477353, 12.320337284773531, 12.370337284773532, 12.420337284773533, 12.470337284773533, 12.52033728477353, 12.570337284773531, 12.620337284773532, 12.670337284773533, 12.720337284773533, 12.77033728477353, 12.820337284773531, 12.870337284773532, 12.920337284773533, 12.970337284773533, 13.02033728477353, 13.070337284773531, 13.120337284773532, 13.170337284773533, 13.220337284773533, 13.27033728477353, 13.320337284773531, 13.370337284773532, 13.420337284773533, 13.470337284773533, 13.52033728477353, 13.570337284773531, 13.620337284773532, 13.670337284773533, 13.720337284773533, 13.77033728477353, 13.820337284773531, 13.870337284773532, 13.920337284773533, 13.970337284773533, 14.02033728477353, 14.070337284773531, 14.120337284773532, 14.170337284773533], "phase": [0.07289686274214105, 0.08289686274214104, 0.09289686274214105, 0.10289686274214105, 0.11289686274214106, 0.12289686274214105, 0.13289686274214105, 0.14289686274214106, 0.15289686274214104, 0.16289686274214105, 0.17289686274214106, 0.18289686274214106, 0.19289686274214105, 0.20289686274214105, 0.21289686274214106, 0.22289686274214104, 0.23289686274214105, 0.24289686274214106, 0.25289686274214107, 0.2628968627421411, 0.2728968627421411, 0.28289686274214104, 0.29289686274214105, 0.30289686274214106, 0.312896862742141, 0.322896862742141, 0.33289686274214103, 0.34289686274214104, 0.35289686274214105, 0.36289686274214106, 0.37289686274214107, 0.3828968627421411, 0.3928968627421411, 0.4028968627421411, 0.4128968627421411, 0.4228968627421411, 0.432896862742141, 0.442896862742141, 0.452896862742141, 0.46289686274214104, 0.47289686274214104, 0.48289686274214105, 0.49289686274214106, 0.5028968627421411, 0.5128968627421411, 0.5228968627421411, 0.5328968627421411, 0.5428968627421411, 0.552896862742141, 0.562896862742141, 0.572896862742141, 0.582896862742141, 0.592896862742141, 0.602896862742141, 0.6128968627421411, 0.6228968627421411]}, {"amplitude": [11.435783922520866, 11.485783922520866, 11.535783922520865, 11.585783922520866, 11.635783922520865, 11.685783922520866, 11.735783922520866, 11.785783922520865, 11.835783922520866, 11.885783922520865, 11.935783922520866, 11.985783922520866, 12.035783922520865, 12.085783922520866, 12.135783922520865, 12.185783922520866, 12.235783922520866, 12.285783922520865, 12.335783922520866, 12.385783922520865, 12.435783922520866, 12.485783922520866, 12.535783922520865, 12.585783922520866, 12.635783922520865, 12.685783922520866, 12.735783922520866, 12.785783922520865, 12.835783922520866, 12.885783922520865, 12.935783922520866, 12.985783922520866, 13.035783922520865, 13.085783922520866, 13.135783922520865, 13.185783922520866, 13.235783922520866, 13.285783922520865, 13.335783922520866, 13.385783922520865, 13.435783922520866, 13.485783922520866, 13.535783922520865, 13.585783922520866, 13.635783922520865, 13.685783922520866, 13.735783922520866, 13.785783922520865, 13.835783922520866, 13.885783922520865, 13.935783922520866, 13.985783922520866, 14.035783922520865, 14.085783922520866, 14.135783922520865, 14.185783922520866], "phase": [0.07901550123756902, 0.08901550123756902, 0.09901550123756903, 0.10901550123756902, 0.11901550123756902, 0.12901550123756902, 0.139015501237569, 0.14901550123756901, 0.15901550123756902, 0.16901550123756903, 0.17901550123756904, 0.18901550123756902, 0.199015501237569, 0.209015501237569, 0.21901550123756902, 0.22901550123756903, 0.23901550123756904, 0.24901550123756905, 0.259015501237569, 0.269015501237569, 0.279015501237569, 0.28901550123756903, 0.29901550123756904, 0.30901550123756905, 0.319015501237569, 0.329015501237569, 0.339015501237569, 0.349015501237569, 0.35901550123756903, 0.369015501237569, 0.379015501237569, 0.389015501237569, 0.399015501237569, 0.409015501237569, 0.41901550123756903, 0.42901550123756904, 0.439015501237569, 0.449015501237569, 0.459015501237569, 0.469015501237569, 0.47901550123756903, 0.48901550123756904, 0.499015501237569, 0.509015501237569, 0.519015501237569, 0.529015501237569, 0.539015501237569, 0.549015501237569, 0.559015501237569, 0.569015501237569, 0.5790155012375691, 0.5890155012375691, 0.5990155012375691, 0.6090155012375691, 0.6190155012375691, 0.6290155012375691]}, {"amplitude": [11.457501878171293, 11.507501878171293, 11.557501878171292, 11.607501878171293, 11.657501878171292, 11.707501878171293, 11.757501878171293, 11.807501878171292, 11.857501878171293, 11.907501878171292, 11.957501878171293, 12.007501878171293, 12.057501878171292, 12.107501878171293, 12.157501878171292, 12.207501878171293, 12.257501878171293, 12.307501878171292, 12.357501878171293, 12.407501878171292, 12.457501878171293, 12.507501878171293, 12.557501878171292, 12.607501878171293, 12.657501878171292, 12.707501878171293, 12.757501878171293, 12.807501878171292, 12.857501878171293, 12.907501878171292, 12.957501878171293, 13.007501878171293, 13.057501878171292, 13.107501878171293, 13.157501878171292, 13.207501878171293, 13.257501878171293, 13.307501878171292, 13.357501878171293, 13.407501878171292, 13.457501878171293, 13.507501878171293, 13.557501878171292, 13.607501878171293, 13.657501878171292, 13.707501878171293, 13.757501878171293, 13.807501878171292, 13.857501878171293, 13.907501878171292, 13.957501878171293, 14.007501878171293, 14.057501878171292, 14.107501878171293, 14.157501878171292, 14.207501878171293], "phase": [0.08443279255020147, 0.09443279255020147, 0.10443279255020148, 0.11443279255020147, 0.12443279255020148, 0.13443279255020146, 0.14443279255020147, 0.15443279255020148, 0.1644327925502015, 0.17443279255020147, 0.18443279255020148, 0.19443279255020146, 0.20443279255020147, 0.21443279255020148, 0.2244327925502015, 0.23443279255020147, 0.24443279255020148, 0.25443279255020146, 0.26443279255020147, 0.2744327925502015, 0.2844327925502015, 0.2944327925502015, 0.3044327925502015, 0.3144327925502015, 0.32443279255020147, 0.3344327925502015, 0.3444327925502015, 0.3544327925502015, 0.3644327925502015, 0.37443279255020145, 0.38443279255020146, 0.39443279255020147, 0.4044327925502015, 0.4144327925502015, 0.4244327925502015, 0.4344327925502015, 0.44443279255020146, 0.45443279255020147, 0.4644327925502015, 0.4744327925502015, 0.4844327925502015, 0.4944327925502015, 0.5044327925502015, 0.5144327925502015, 0.5244327925502015, 0.5344327925502015, 0.5444327925502015, 0.5544327925502015, 0.5644327925502015, 0.5744327925502015, 0.5844327925502015, 0.5944327925502015, 0.6044327925502015, 0.6144327925502016, 0.6244327925502016, 0.6344327925502016]}, {"amplitude": [11.49669609348819, 11.54669609348819, 11.59669609348819, 11.64669609348819, 11.696696093488189, 11.74669609348819, 11.79669609348819, 11.84669609348819, 11.89669609348819, 11.946696093488189, 11.99669609348819, 12.04669609348819, 12.09669609348819, 12.14669609348819, 12.196696093488189, 12.24669609348819, 12.29669609348819, 12.34669609348819, 12.39669609348819, 12.446696093488189, 12.49669609348819, 12.54669609348819, 12.59669609348819, 12.64669609348819, 12.696696093488189, 12.74669609348819, 12.79669609348819, 12.84669609348819, 12.89669609348819, 12.946696093488189, 12.99669609348819, 13.04669609348819, 13.09669609348819, 13.14669609348819, 13.196696093488189, 13.24669609348819, 13.29669609348819, 13.34669609348819, 13.39669609348819, 13.446696093488189, 13.49669609348819, 13.54669609348819, 13.59669609348819, 13.64669609348819, 13.696696093488189, 13.74669609348819, 13.79669609348819, 13.84669609348819, 13.89669609348819, 13.946696093488189, 13.99669609348819, 14.04669609348819, 14.09669609348819, 14.14669609348819, 14.196696093488189, 14.24669609348819], "phase": [0.08910065241883673, 0.09910065241883673, 0.10910065241883674, 0.11910065241883673, 0.12910065241883673, 0.13910065241883673, 0.14910065241883674, 0.15910065241883675, 0.16910065241883673, 0.17910065241883671, 0.18910065241883672, 0.19910065241883673, 0.20910065241883674, 0.21910065241883675, 0.22910065241883676, 0.2391006524188367, 0.24910065241883672, 0.25910065241883673, 0.26910065241883674, 0.27910065241883675, 0.28910065241883676, 0.2991006524188367, 0.3091006524188367, 0.3191006524188367, 0.32910065241883674, 0.33910065241883675, 0.34910065241883675, 0.35910065241883676, 0.36910065241883677, 0.3791006524188367, 0.38910065241883673, 0.39910065241883674, 0.40910065241883675, 0.41910065241883676, 0.42910065241883677, 0.4391006524188368, 0.44910065241883673, 0.45910065241883674, 0.46910065241883675, 0.47910065241883676, 0.48910065241883677, 0.4991006524188368, 0.5091006524188367, 0.5191006524188367, 0.5291006524188367, 0.5391006524188368, 0.5491006524188368, 0.5591006524188368, 0.5691006524188367, 0.5791006524188367, 0.5891006524188367, 0.5991006524188367, 0.6091006524188367, 0.6191006524188367, 0.6291006524188367, 0.6391006524188367]}, {"amplitude": [11.56014495324802, 11.610144953248021, 11.660144953248022, 11.710144953248022, 11.76014495324802, 11.81014495324802, 11.860144953248021, 11.910144953248022, 11.960144953248022, 12.01014495324802, 12.06014495324802, 12.110144953248021, 12.160144953248022, 12.210144953248022, 12.26014495324802, 12.31014495324802, 12.360144953248021, 12.410144953248022, 12.460144953248022, 12.51014495324802, 12.56014495324802, 12.610144953248021, 12.660144953248022, 12.710144953248022, 12.76014495324802, 12.81014495324802, 12.860144953248021, 12.910144953248022, 12.960144953248022, 13.01014495324802, 13.06014495324802, 13.110144953248021, 13.160144953248022, 13.210144953248022, 13.26014495324802, 13.31014495324802, 13.360144953248021, 13.410144953248022, 13.460144953248022, 13.51014495324802, 13.56014495324802, 13.610144953248021, 13.660144953248022, 13.710144953248022, 13.76014495324802, 13.81014495324802, 13.860144953248021, 13.910144953248022, 13.960144953248022, 14.01014495324802, 14.06014495324802, 14.110144953248021, 14.160144953248022, 14.210144953248022, 14.26014495324802, 14.31014495324802], "phase": [0.09297764858882514, 0.10297764858882513, 0.11297764858882514, 0.12297764858882514, 0.13297764858882513, 0.14297764858882514, 0.15297764858882512, 0.16297764858882513, 0.17297764858882514, 0.18297764858882515, 0.19297764858882516, 0.20297764858882514, 0.21297764858882512, 0.22297764858882513, 0.23297764858882514, 0.24297764858882515, 0.25297764858882515, 0.26297764858882516, 0.2729776485888251, 0.2829776485888251, 0.29297764858882513, 0.30297764858882514, 0.31297764858882515, 0.32297764858882516, 0.3329776485888251, 0.3429776485888251, 0.35297764858882513, 0.36297764858882514, 0.37297764858882515, 0.3829776485888251, 0.3929776485888251, 0.4029776485888251, 0.41297764858882513, 0.42297764858882514, 0.43297764858882515, 0.44297764858882516, 0.4529776485888251, 0.4629776485888251, 0.47297764858882513, 0.48297764858882514, 0.49297764858882515, 0.5029776485888252, 0.5129776485888251, 0.5229776485888251, 0.5329776485888251, 0.5429776485888251, 0.5529776485888251, 0.5629776485888252, 0.5729776485888252, 0.5829776485888252, 0.5929776485888252, 0.6029776485888252, 0.6129776485888252, 0.6229776485888252, 0.6329776485888252, 0.6429776485888252]}, {"amplitude": [11.64913925561408, 11.69913925561408, 11.749139255614079, 11.79913925561408, 11.849139255614078, 11.89913925561408, 11.94913925561408, 11.999139255614079, 12.04913925561408, 12.099139255614078, 12.14913925561408, 12.19913925561408, 12.249139255614079, 12.29913925561408, 12.349139255614078, 12.39913925561408, 12.44913925561408, 12.499139255614079, 12.54913925561408, 12.599139255614078, 12.64913925561408, 12.69913925561408, 12.749139255614079, 12.79913925561408, 12.849139255614078, 12.89913925561408, 12.94913925561408, 12.999139255614079, 13.04913925561408, 13.099139255614078, 13.14913925561408, 13.19913925561408, 13.249139255614079, 13.29913925561408, 13.349139255614078, 13.39913925561408, 13.44913925561408, 13.499139255614079, 13.54913925561408, 13.599139255614078, 13.64913925561408, 13.69913925561408, 13.749139255614079, 13.79913925561408, 13.849139255614078, 13.89913925561408, 13.94913925561408, 13.999139255614079, 14.04913925561408, 14.099139255614078, 14.14913925561408, 14.19913925561408, 14.249139255614079, 14.29913925561408, 14.349139255614078, 14.39913925561408], "phase": [0.09602936856769428, 0.10602936856769428, 0.11602936856769429, 0.12602936856769428, 0.1360293685676943, 0.14602936856769427, 0.15602936856769428, 0.1660293685676943, 0.1760293685676943, 0.18602936856769428, 0.1960293685676943, 0.20602936856769427, 0.21602936856769428, 0.2260293685676943, 0.2360293685676943, 0.24602936856769428, 0.2560293685676943, 0.2660293685676943, 0.2760293685676943, 0.2860293685676943, 0.2960293685676943, 0.30602936856769425, 0.31602936856769426, 0.32602936856769427, 0.3360293685676943, 0.3460293685676943, 0.3560293685676943, 0.3660293685676943, 0.3760293685676943, 0.38602936856769426, 0.3960293685676943, 0.4060293685676943, 0.4160293685676943, 0.4260293685676943, 0.4360293685676943, 0.4460293685676943, 0.45602936856769427, 0.4660293685676943, 0.4760293685676943, 0.4860293685676943, 0.4960293685676943, 0.5060293685676943, 0.5160293685676942, 0.5260293685676942, 0.5360293685676942, 0.5460293685676942, 0.5560293685676942, 0.5660293685676943, 0.5760293685676943, 0.5860293685676943, 0.5960293685676943, 0.6060293685676943, 0.6160293685676943, 0.6260293685676943, 0.6360293685676943, 0.6460293685676943]}, {"amplitude": [11.75921036967877, 11.809210369678771, 11.85921036967877, 11.909210369678771, 11.95921036967877, 12.00921036967877, 12.059210369678771, 12.10921036967877, 12.159210369678771, 12.20921036967877, 12.25921036967877, 12.309210369678771, 12.35921036967877, 12.409210369678771, 12.45921036967877, 12.50921036967877, 12.559210369678771, 12.60921036967877, 12.659210369678771, 12.70921036967877, 12.75921036967877, 12.809210369678771, 12.85921036967877, 12.909210369678771, 12.95921036967877, 13.00921036967877, 13.059210369678771, 13.10921036967877, 13.159210369678771, 13.20921036967877, 13.25921036967877, 13.309210369678771, 13.35921036967877, 13.409210369678771, 13.45921036967877, 13.50921036967877, 13.559210369678771, 13.60921036967877, 13.659210369678771, 13.70921036967877, 13.75921036967877, 13.809210369678771, 13.85921036967877, 13.909210369678771, 13.95921036967877, 14.00921036967877, 14.059210369678771, 14.10921036967877, 14.159210369678771, 14.20921036967877, 14.25921036967877, 14.309210369678771, 14.35921036967877, 14.409210369678771, 14.45921036967877, 14.50921036967877], "phase": [0.0982287250728689, 0.10822872507286889, 0.1182287250728689, 0.1282287250728689, 0.1382287250728689, 0.14822872507286888, 0.1582287250728689, 0.1682287250728689, 0.1782287250728689, 0.1882287250728689, 0.1982287250728689, 0.20822872507286888, 0.2182287250728689, 0.2282287250728689, 0.2382287250728689, 0.2482287250728689, 0.25822872507286887, 0.2682287250728689, 0.2782287250728689, 0.2882287250728689, 0.2982287250728689, 0.3082287250728689, 0.3182287250728689, 0.32822872507286893, 0.3382287250728689, 0.3482287250728689, 0.3582287250728689, 0.3682287250728689, 0.3782287250728689, 0.3882287250728689, 0.3982287250728689, 0.4082287250728689, 0.4182287250728689, 0.4282287250728689, 0.4382287250728689, 0.4482287250728689, 0.4582287250728689, 0.4682287250728689, 0.4782287250728689, 0.4882287250728689, 0.4982287250728689, 0.508228725072869, 0.5182287250728689, 0.5282287250728689, 0.5382287250728689, 0.5482287250728689, 0.5582287250728689, 0.5682287250728689, 0.5782287250728688, 0.5882287250728688, 0.5982287250728688, 0.6082287250728688, 0.6182287250728689, 0.6282287250728689, 0.6382287250728689, 0.6482287250728689]}, {"amplitude": [11.880686563400758, 11.930686563400759, 11.980686563400756, 12.030686563400756, 12.080686563400757, 12.130686563400758, 12.180686563400759, 12.230686563400756, 12.280686563400756, 12.330686563400757, 12.380686563400758, 12.430686563400759, 12.480686563400756, 12.530686563400756, 12.580686563400757, 12.630686563400758, 12.680686563400759, 12.730686563400756, 12.780686563400756, 12.830686563400757, 12.880686563400758, 12.930686563400759, 12.980686563400756, 13.030686563400756, 13.080686563400757, 13.130686563400758, 13.180686563400759, 13.230686563400756, 13.280686563400756, 13.330686563400757, 13.380686563400758, 13.430686563400759, 13.480686563400756, 13.530686563400756, 13.580686563400757, 13.630686563400758, 13.680686563400759, 13.730686563400756, 13.780686563400756, 13.830686563400757, 13.880686563400758, 13.930686563400759, 13.980686563400756, 14.030686563400756, 14.080686563400757, 14.130686563400758, 14.180686563400759, 14.230686563400756, 14.280686563400756, 14.330686563400757, 14.380686563400758, 14.430686563400759, 14.480686563400756, 14.530686563400756, 14.580686563400757, 14.630686563400758], "phase": [0.099556196460308, 0.109556196460308, 0.119556196460308, 0.129556196460308, 0.139556196460308, 0.149556196460308, 0.159556196460308, 0.169556196460308, 0.17955619646030802, 0.189556196460308, 0.199556196460308, 0.209556196460308, 0.219556196460308, 0.229556196460308, 0.239556196460308, 0.249556196460308, 0.25955619646030803, 0.26955619646030804, 0.279556196460308, 0.289556196460308, 0.299556196460308, 0.30955619646030796, 0.319556196460308, 0.329556196460308, 0.339556196460308, 0.349556196460308, 0.359556196460308, 0.369556196460308, 0.379556196460308, 0.389556196460308, 0.399556196460308, 0.409556196460308, 0.419556196460308, 0.429556196460308, 0.439556196460308, 0.44955619646030803, 0.459556196460308, 0.469556196460308, 0.479556196460308, 0.489556196460308, 0.499556196460308, 0.509556196460308, 0.5195561964603079, 0.5295561964603079, 0.539556196460308, 0.549556196460308, 0.559556196460308, 0.569556196460308, 0.579556196460308, 0.589556196460308, 0.599556196460308, 0.609556196460308, 0.619556196460308, 0.629556196460308, 0.639556196460308, 0.649556196460308]}, {"amplitude": [12.0, 12.05, 12.1, 12.15, 12.2, 12.25, 12.3, 12.35, 12.4, 12.45, 12.5, 12.55, 12.6, 12.65, 12.7, 12.75, 12.8, 12.85, 12.9, 12.95, 13.0, 13.05, 13.1, 13.15, 13.2, 13.25, 13.3, 13.35, 13.4, 13.45, 13.5, 13.55, 13.6, 13.65, 13.7, 13.75, 13.8, 13.85, 13.9, 13.95, 14.0, 14.05, 14.1, 14.15, 14.2, 14.25, 14.3, 14.35, 14.4, 14.45, 14.5, 14.55, 14.6, 14.65, 14.7, 14.75], "phase": [0.1, 0.11, 0.12000000000000001, 0.13, 0.14, 0.15000000000000002, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21000000000000002, 0.22, 0.23, 0.24000000000000002, 0.25, 0.26, 0.27, 0.28, 0.29000000000000004, 0.30000000000000004, 0.31, 0.32, 0.33, 0.33999999999999997, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41000000000000003, 0.42000000000000004, 0.43000000000000005, 0.44000000000000006, 0.45000000000000007, 0.45999999999999996, 0.47, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.5700000000000001, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, 0.64, 0.65]}, {"amplitude": [12.101561295011564, 12.151561295011565, 12.201561295011564, 12.251561295011564, 12.301561295011563, 12.351561295011564, 12.401561295011565, 12.451561295011564, 12.501561295011564, 12.551561295011563, 12.601561295011564, 12.651561295011565, 12.701561295011564, 12.751561295011564, 12.801561295011563, 12.851561295011564, 12.901561295011565, 12.951561295011564, 13.001561295011564, 13.051561295011563, 13.101561295011564, 13.151561295011565, 13.201561295011564, 13.251561295011564, 13.301561295011563, 13.351561295011564, 13.401561295011565, 13.451561295011564, 13.501561295011564, 13.551561295011563, 13.601561295011564, 13.651561295011565, 13.701561295011564, 13.751561295011564, 13.801561295011563, 13.851561295011564, 13.901561295011565, 13.951561295011564, 14.001561295011564, 14.051561295011563, 14.101561295011564, 14.151561295011565, 14.201561295011564, 14.251561295011564, 14.301561295011563, 14.351561295011564, 14.401561295011565, 14.451561295011564, 14.501561295011564, 14.551561295011563, 14.601561295011564, 14.651561295011565, 14.701561295011564, 14.751561295011564, 14.801561295011563, 14.851561295011564], "phase": [0.09955619646030801, 0.10955619646030801, 0.11955619646030802, 0.12955619646030803, 0.139556196460308, 0.14955619646030802, 0.159556196460308, 0.169556196460308, 0.17955619646030802, 0.18955619646030802, 0.19955619646030803, 0.20955619646030801, 0.219556196460308, 0.229556196460308, 0.239556196460308, 0.24955619646030802, 0.25955619646030803, 0.26955619646030804, 0.279556196460308, 0.289556196460308, 0.299556196460308, 0.309556196460308, 0.31955619646030803, 0.32955619646030804, 0.339556196460308, 0.349556196460308, 0.359556196460308, 0.369556196460308, 0.379556196460308, 0.389556196460308, 0.399556196460308, 0.409556196460308, 0.419556196460308, 0.429556196460308, 0.439556196460308, 0.44955619646030803, 0.459556196460308, 0.469556196460308, 0.479556196460308, 0.489556196460308, 0.499556196460308, 0.509556196460308, 0.519556196460308, 0.529556196460308, 0.5395561964603081, 0.5495561964603081, 0.5595561964603081, 0.5695561964603081, 0.579556196460308, 0.589556196460308, 0.599556196460308, 0.609556196460308, 0.619556196460308, 0.629556196460308, 0.639556196460308, 0.649556196460308]}, {"amplitude": [12.169938633235983, 12.219938633235984, 12.269938633235983, 12.319938633235983, 12.369938633235982, 12.419938633235983, 12.469938633235984, 12.519938633235983, 12.569938633235983, 12.619938633235982, 12.669938633235983, 12.719938633235984, 12.769938633235983, 12.819938633235983, 12.869938633235982, 12.919938633235983, 12.969938633235984, 13.019938633235983, 13.069938633235983, 13.119938633235982, 13.169938633235983, 13.219938633235984, 13.269938633235983, 13.319938633235983, 13.369938633235982, 13.419938633235983, 13.469938633235984, 13.519938633235983, 13.569938633235983, 13.619938633235982, 13.669938633235983, 13.719938633235984, 13.769938633235983, 13.819938633235983, 13.869938633235982, 13.919938633235983, 13.969938633235984, 14.019938633235983, 14.069938633235983, 14.119938633235982, 14.169938633235983, 14.219938633235984, 14.269938633235983, 14.319938633235983, 14.369938633235982, 14.419938633235983, 14.469938633235984, 14.519938633235983, 14.569938633235983, 14.619938633235982, 14.669938633235983, 14.719938633235984, 14.769938633235983, 14.819938633235983, 14.869938633235982, 14.919938633235983], "phase": [0.0982287250728689, 0.10822872507286889, 0.1182287250728689, 0.1282287250728689, 0.1382287250728689, 0.14822872507286888, 0.1582287250728689, 0.1682287250728689, 0.1782287250728689, 0.1882287250728689, 0.1982287250728689, 0.20822872507286888, 0.2182287250728689, 0.2282287250728689, 0.2382287250728689, 0.2482287250728689, 0.25822872507286887, 0.2682287250728689, 0.2782287250728689, 0.2882287250728689, 0.2982287250728689, 0.3082287250728689, 0.3182287250728689, 0.32822872507286893, 0.3382287250728689, 0.3482287250728689, 0.3582287250728689, 0.3682287250728689, 0.3782287250728689, 0.3882287250728689, 0.3982287250728689, 0.4082287250728689, 0.4182287250728689, 0.4282287250728689, 0.4382287250728689, 0.4482287250728689, 0.4582287250728689, 0.4682287250728689, 0.4782287250728689, 0.4882287250728689, 0.4982287250728689, 0.508228725072869, 0.5182287250728689, 0.5282287250728689, 0.5382287250728689, 0.5482287250728689, 0.5582287250728689, 0.5682287250728689, 0.5782287250728688, 0.5882287250728688, 0.5982287250728688, 0.6082287250728688, 0.6182287250728689, 0.6282287250728689, 0.6382287250728689, 0.6482287250728689]}, {"amplitude": [12.19203548709369, 12.242035487093691, 12.292035487093692, 12.342035487093693, 12.39203548709369, 12.44203548709369, 12.492035487093691, 12.542035487093692, 12.592035487093693, 12.64203548709369, 12.69203548709369, 12.742035487093691, 12.792035487093692, 12.842035487093693, 12.89203548709369, 12.94203548709369, 12.992035487093691, 13.042035487093692, 13.092035487093693, 13.14203548709369, 13.19203548709369, 13.242035487093691, 13.292035487093692, 13.342035487093693, 13.39203548709369, 13.44203548709369, 13.492035487093691, 13.542035487093692, 13.592035487093693, 13.64203548709369, 13.69203548709369, 13.742035487093691, 13.792035487093692, 13.842035487093693, 13.89203548709369, 13.94203548709369, 13.992035487093691, 14.042035487093692, 14.092035487093693, 14.14203548709369, 14.19203548709369, 14.242035487093691, 14.292035487093692, 14.342035487093693, 14.39203548709369, 14.44203548709369, 14.492035487093691, 14.542035487093692, 14.592035487093693, 14.64203548709369, 14.69203548709369, 14.742035487093691, 14.792035487093692, 14.842035487093693, 14.89203548709369, 14.94203548709369], "phase": [0.09602936856769433, 0.10602936856769432, 0.11602936856769433, 0.1260293685676943, 0.13602936856769432, 0.14602936856769433, 0.15602936856769434, 0.16602936856769435, 0.17602936856769433, 0.1860293685676943, 0.19602936856769432, 0.20602936856769433, 0.21602936856769434, 0.22602936856769434, 0.23602936856769435, 0.2460293685676943, 0.2560293685676943, 0.2660293685676943, 0.27602936856769433, 0.28602936856769434, 0.29602936856769435, 0.3060293685676943, 0.3160293685676943, 0.3260293685676943, 0.33602936856769433, 0.34602936856769434, 0.35602936856769435, 0.36602936856769436, 0.37602936856769437, 0.3860293685676943, 0.39602936856769433, 0.40602936856769434, 0.41602936856769435, 0.42602936856769436, 0.43602936856769436, 0.4460293685676944, 0.4560293685676943, 0.46602936856769434, 0.47602936856769434, 0.48602936856769435, 0.49602936856769436, 0.5060293685676943, 0.5160293685676943, 0.5260293685676943, 0.5360293685676943, 0.5460293685676944, 0.5560293685676944, 0.5660293685676944, 0.5760293685676943, 0.5860293685676943, 0.5960293685676943, 0.6060293685676943, 0.6160293685676943, 0.6260293685676943, 0.6360293685676943, 0.6460293685676943]}, {"amplitude": [12.158960990304985, 12.208960990304986, 12.258960990304985, 12.308960990304985, 12.358960990304984, 12.408960990304985, 12.458960990304986, 12.508960990304985, 12.558960990304985, 12.608960990304984, 12.658960990304985, 12.708960990304986, 12.758960990304985, 12.808960990304985, 12.858960990304984, 12.908960990304985, 12.958960990304986, 13.008960990304985, 13.058960990304985, 13.108960990304984, 13.158960990304985, 13.208960990304986, 13.258960990304985, 13.308960990304985, 13.358960990304984, 13.408960990304985, 13.458960990304986, 13.508960990304985, 13.558960990304985, 13.608960990304984, 13.658960990304985, 13.708960990304986, 13.758960990304985, 13.808960990304985, 13.858960990304984, 13.908960990304985, 13.958960990304986, 14.008960990304985, 14.058960990304985, 14.108960990304984, 14.158960990304985, 14.208960990304986, 14.258960990304985, 14.308960990304985, 14.358960990304984, 14.408960990304985, 14.458960990304986, 14.508960990304985, 14.558960990304985, 14.608960990304984, 14.658960990304985, 14.708960990304986, 14.758960990304985, 14.808960990304985, 14.858960990304984, 14.908960990304985], "phase": [0.09297764858882518, 0.10297764858882517, 0.11297764858882518, 0.12297764858882518, 0.1329776485888252, 0.14297764858882517, 0.15297764858882518, 0.16297764858882519, 0.1729776485888252, 0.18297764858882518, 0.19297764858882518, 0.20297764858882517, 0.21297764858882517, 0.22297764858882518, 0.2329776485888252, 0.24297764858882517, 0.2529776485888252, 0.2629776485888252, 0.2729776485888252, 0.2829776485888252, 0.2929776485888252, 0.30297764858882514, 0.31297764858882515, 0.32297764858882516, 0.33297764858882517, 0.3429776485888252, 0.3529776485888252, 0.3629776485888252, 0.3729776485888252, 0.38297764858882516, 0.39297764858882517, 0.4029776485888252, 0.4129776485888252, 0.4229776485888252, 0.4329776485888252, 0.4429776485888252, 0.45297764858882517, 0.4629776485888252, 0.4729776485888252, 0.4829776485888252, 0.4929776485888252, 0.5029776485888252, 0.5129776485888251, 0.5229776485888251, 0.5329776485888251, 0.5429776485888251, 0.5529776485888251, 0.5629776485888252, 0.5729776485888252, 0.5829776485888252, 0.5929776485888252, 0.6029776485888252, 0.6129776485888252, 0.6229776485888252, 0.6329776485888252, 0.6429776485888252]}, {"amplitude": [12.067330003265281, 12.117330003265282, 12.167330003265281, 12.217330003265282, 12.26733000326528, 12.317330003265281, 12.367330003265282, 12.417330003265281, 12.467330003265282, 12.51733000326528, 12.567330003265281, 12.617330003265282, 12.667330003265281, 12.717330003265282, 12.76733000326528, 12.817330003265281, 12.867330003265282, 12.917330003265281, 12.967330003265282, 13.01733000326528, 13.067330003265281, 13.117330003265282, 13.167330003265281, 13.217330003265282, 13.26733000326528, 13.317330003265281, 13.367330003265282, 13.417330003265281, 13.467330003265282, 13.51733000326528, 13.567330003265281, 13.617330003265282, 13.667330003265281, 13.717330003265282, 13.76733000326528, 13.817330003265281, 13.867330003265282, 13.917330003265281, 13.967330003265282, 14.01733000326528, 14.067330003265281, 14.117330003265282, 14.167330003265281, 14.217330003265282, 14.26733000326528, 14.317330003265281, 14.367330003265282, 14.417330003265281, 14.467330003265282, 14.51733000326528, 14.567330003265281, 14.617330003265282, 14.667330003265281, 14.717330003265282, 14.76733000326528, 14.817330003265281], "phase": [0.08910065241883677, 0.09910065241883677, 0.10910065241883678, 0.11910065241883677, 0.12910065241883678, 0.1391006524188368, 0.14910065241883677, 0.15910065241883678, 0.16910065241883676, 0.17910065241883677, 0.18910065241883678, 0.1991006524188368, 0.20910065241883677, 0.21910065241883678, 0.2291006524188368, 0.23910065241883677, 0.24910065241883678, 0.2591006524188368, 0.26910065241883674, 0.27910065241883675, 0.28910065241883676, 0.29910065241883677, 0.3091006524188368, 0.3191006524188368, 0.3291006524188368, 0.3391006524188368, 0.3491006524188368, 0.3591006524188368, 0.3691006524188368, 0.3791006524188367, 0.38910065241883673, 0.39910065241883674, 0.40910065241883675, 0.41910065241883676, 0.42910065241883677, 0.4391006524188368, 0.4491006524188368, 0.4591006524188368, 0.4691006524188368, 0.4791006524188368, 0.4891006524188368, 0.49910065241883683, 0.5091006524188367, 0.5191006524188367, 0.5291006524188367, 0.5391006524188368, 0.5491006524188368, 0.5591006524188368, 0.5691006524188368, 0.5791006524188368, 0.5891006524188368, 0.5991006524188368, 0.6091006524188368, 0.6191006524188368, 0.6291006524188368, 0.6391006524188368]}, {"amplitude": [11.919809823836767, 11.969809823836767, 12.019809823836766, 12.069809823836767, 12.119809823836766, 12.169809823836767, 12.219809823836767, 12.269809823836766, 12.319809823836767, 12.369809823836766, 12.419809823836767, 12.469809823836767, 12.519809823836766, 12.569809823836767, 12.619809823836766, 12.669809823836767, 12.719809823836767, 12.769809823836766, 12.819809823836767, 12.869809823836766, 12.919809823836767, 12.969809823836767, 13.019809823836766, 13.069809823836767, 13.119809823836766, 13.169809823836767, 13.219809823836767, 13.269809823836766, 13.319809823836767, 13.369809823836766, 13.419809823836767, 13.469809823836767, 13.519809823836766, 13.569809823836767, 13.619809823836766, 13.669809823836767, 13.719809823836767, 13.769809823836766, 13.819809823836767, 13.869809823836766, 13.919809823836767, 13.969809823836767, 14.019809823836766, 14.069809823836767, 14.119809823836766, 14.169809823836767, 14.219809823836767, 14.269809823836766, 14.319809823836767, 14.369809823836766, 14.419809823836767, 14.469809823836767, 14.519809823836766, 14.569809823836767, 14.619809823836766, 14.669809823836767], "phase": [0.08443279255020153, 0.09443279255020152, 0.10443279255020153, 0.11443279255020153, 0.12443279255020154, 0.13443279255020152, 0.14443279255020153, 0.15443279255020154, 0.16443279255020155, 0.17443279255020153, 0.18443279255020154, 0.19443279255020152, 0.20443279255020153, 0.21443279255020153, 0.22443279255020154, 0.23443279255020152, 0.24443279255020153, 0.25443279255020157, 0.2644327925502015, 0.27443279255020153, 0.28443279255020154, 0.2944327925502015, 0.3044327925502015, 0.3144327925502015, 0.3244327925502015, 0.33443279255020153, 0.34443279255020154, 0.35443279255020155, 0.36443279255020156, 0.3744327925502015, 0.3844327925502015, 0.3944327925502015, 0.40443279255020154, 0.41443279255020155, 0.42443279255020155, 0.43443279255020156, 0.4444327925502015, 0.4544327925502015, 0.46443279255020153, 0.47443279255020154, 0.48443279255020155, 0.49443279255020156, 0.5044327925502015, 0.5144327925502015, 0.5244327925502015, 0.5344327925502015, 0.5444327925502015, 0.5544327925502015, 0.5644327925502015, 0.5744327925502015, 0.5844327925502015, 0.5944327925502015, 0.6044327925502015, 0.6144327925502016, 0.6244327925502016, 0.6344327925502016]}, {"amplitude": [11.724836126981897, 11.774836126981898, 11.824836126981896, 11.874836126981897, 11.924836126981896, 11.974836126981897, 12.024836126981898, 12.074836126981896, 12.124836126981897, 12.174836126981896, 12.224836126981897, 12.274836126981898, 12.324836126981896, 12.374836126981897, 12.424836126981896, 12.474836126981897, 12.524836126981898, 12.574836126981896, 12.624836126981897, 12.674836126981896, 12.724836126981897, 12.774836126981898, 12.824836126981896, 12.874836126981897, 12.924836126981896, 12.974836126981897, 13.024836126981898, 13.074836126981896, 13.124836126981897, 13.174836126981896, 13.224836126981897, 13.274836126981898, 13.324836126981896, 13.374836126981897, 13.424836126981896, 13.474836126981897, 13.524836126981898, 13.574836126981896, 13.624836126981897, 13.674836126981896, 13.724836126981897, 13.774836126981898, 13.824836126981896, 13.874836126981897, 13.924836126981896, 13.974836126981897, 14.024836126981898, 14.074836126981896, 14.124836126981897, 14.174836126981896, 14.224836126981897, 14.274836126981898, 14.324836126981896, 14.374836126981897, 14.424836126981896, 14.474836126981897], "phase": [0.07901550123756909, 0.08901550123756909, 0.0990155012375691, 0.10901550123756909, 0.1190155012375691, 0.1290155012375691, 0.1390155012375691, 0.1490155012375691, 0.15901550123756908, 0.1690155012375691, 0.1790155012375691, 0.1890155012375691, 0.1990155012375691, 0.2090155012375691, 0.2190155012375691, 0.22901550123756909, 0.2390155012375691, 0.2490155012375691, 0.2590155012375691, 0.2690155012375691, 0.27901550123756913, 0.2890155012375691, 0.2990155012375691, 0.3090155012375691, 0.31901550123756905, 0.32901550123756906, 0.3390155012375691, 0.3490155012375691, 0.3590155012375691, 0.3690155012375691, 0.3790155012375691, 0.3890155012375691, 0.3990155012375691, 0.40901550123756913, 0.41901550123756914, 0.42901550123756915, 0.43901550123756905, 0.44901550123756906, 0.45901550123756907, 0.4690155012375691, 0.4790155012375691, 0.4890155012375691, 0.4990155012375691, 0.5090155012375691, 0.5190155012375691, 0.5290155012375691, 0.5390155012375691, 0.5490155012375691, 0.559015501237569, 0.569015501237569, 0.5790155012375691, 0.5890155012375691, 0.5990155012375691, 0.6090155012375691, 0.6190155012375691, 0.6290155012375691]}, {"amplitude": [11.495537224912113, 11.545537224912113, 11.595537224912112, 11.645537224912113, 11.695537224912112, 11.745537224912113, 11.795537224912113, 11.845537224912112, 11.895537224912113, 11.945537224912112, 11.995537224912113, 12.045537224912113, 12.095537224912112, 12.145537224912113, 12.195537224912112, 12.245537224912113, 12.295537224912113, 12.345537224912112, 12.395537224912113, 12.445537224912112, 12.495537224912113, 12.545537224912113, 12.595537224912112, 12.645537224912113, 12.695537224912112, 12.745537224912113, 12.795537224912113, 12.845537224912112, 12.895537224912113, 12.945537224912112, 12.995537224912113, 13.045537224912113, 13.095537224912112, 13.145537224912113, 13.195537224912112, 13.245537224912113, 13.295537224912113, 13.345537224912112, 13.395537224912113, 13.445537224912112, 13.495537224912113, 13.545537224912113, 13.595537224912112, 13.645537224912113, 13.695537224912112, 13.745537224912113, 13.795537224912113, 13.845537224912112, 13.895537224912113, 13.945537224912112, 13.995537224912113, 14.045537224912113, 14.095537224912112, 14.145537224912113, 14.195537224912112, 14.245537224912113], "phase": [0.07289686274214112, 0.08289686274214111, 0.09289686274214112, 0.10289686274214112, 0.11289686274214111, 0.12289686274214112, 0.13289686274214113, 0.14289686274214114, 0.15289686274214112, 0.1628968627421411, 0.1728968627421411, 0.18289686274214112, 0.19289686274214113, 0.20289686274214114, 0.21289686274214115, 0.2228968627421411, 0.2328968627421411, 0.24289686274214112, 0.2528968627421411, 0.26289686274214114, 0.27289686274214114, 0.2828968627421411, 0.2928968627421411, 0.3028968627421411, 0.3128968627421411, 0.32289686274214113, 0.33289686274214114, 0.34289686274214115, 0.35289686274214116, 0.3628968627421411, 0.3728968627421411, 0.38289686274214113, 0.39289686274214114, 0.40289686274214115, 0.41289686274214116, 0.42289686274214117, 0.4328968627421411, 0.44289686274214113, 0.45289686274214114, 0.46289686274214115, 0.47289686274214116, 0.48289686274214116, 0.4928968627421411, 0.5028968627421411, 0.5128968627421411, 0.5228968627421411, 0.5328968627421411, 0.5428968627421411, 0.5528968627421411, 0.5628968627421411, 0.5728968627421411, 0.5828968627421411, 0.5928968627421412, 0.6028968627421412, 0.6128968627421412, 0.6228968627421412]}, {"amplitude": [11.248016764497848, 11.298016764497849, 11.348016764497848, 11.398016764497848, 11.448016764497847, 11.498016764497848, 11.548016764497849, 11.598016764497848, 11.648016764497848, 11.698016764497847, 11.748016764497848, 11.798016764497849, 11.848016764497848, 11.898016764497848, 11.948016764497847, 11.998016764497848, 12.048016764497849, 12.098016764497848, 12.148016764497848, 12.198016764497847, 12.248016764497848, 12.298016764497849, 12.348016764497848, 12.398016764497848, 12.448016764497847, 12.498016764497848, 12.548016764497849, 12.598016764497848, 12.648016764497848, 12.698016764497847, 12.748016764497848, 12.798016764497849, 12.848016764497848, 12.898016764497848, 12.948016764497847, 12.998016764497848, 13.048016764497849, 13.098016764497848, 13.148016764497848, 13.198016764497847, 13.248016764497848, 13.298016764497849, 13.348016764497848, 13.398016764497848, 13.448016764497847, 13.498016764497848, 13.548016764497849, 13.598016764497848, 13.648016764497848, 13.698016764497847, 13.748016764497848, 13.798016764497849, 13.848016764497848, 13.898016764497848, 13.948016764497847, 13.998016764497848], "phase": [0.0661311865323652, 0.0761311865323652, 0.0861311865323652, 0.0961311865323652, 0.1061311865323652, 0.1161311865323652, 0.1261311865323652, 0.13613118653236522, 0.1461311865323652, 0.15613118653236518, 0.1661311865323652, 0.1761311865323652, 0.1861311865323652, 0.19613118653236522, 0.20613118653236523, 0.21613118653236518, 0.2261311865323652, 0.2361311865323652, 0.2461311865323652, 0.2561311865323652, 0.2661311865323652, 0.2761311865323652, 0.2861311865323652, 0.2961311865323652, 0.3061311865323652, 0.3161311865323652, 0.3261311865323652, 0.33613118653236523, 0.34613118653236524, 0.3561311865323652, 0.3661311865323652, 0.3761311865323652, 0.3861311865323652, 0.39613118653236523, 0.40613118653236524, 0.41613118653236525, 0.4261311865323652, 0.4361311865323652, 0.4461311865323652, 0.45613118653236523, 0.46613118653236524, 0.47613118653236525, 0.4861311865323652, 0.4961311865323652, 0.5061311865323652, 0.5161311865323652, 0.5261311865323652, 0.5361311865323652, 0.5461311865323651, 0.5561311865323652, 0.5661311865323652, 0.5761311865323652, 0.5861311865323652, 0.5961311865323652, 0.6061311865323652, 0.6161311865323652]}, {"amplitude": [10.999234928897206, 11.049234928897206, 11.099234928897205, 11.149234928897206, 11.199234928897205, 11.249234928897206, 11.299234928897206, 11.349234928897205, 11.399234928897206, 11.449234928897205, 11.499234928897206, 11.549234928897206, 11.599234928897205, 11.649234928897206, 11.699234928897205, 11.749234928897206, 11.799234928897206, 11.849234928897205, 11.899234928897206, 11.949234928897205, 11.999234928897206, 12.049234928897206, 12.099234928897205, 12.149234928897206, 12.199234928897205, 12.249234928897206, 12.299234928897206, 12.349234928897205, 12.399234928897206, 12.449234928897205, 12.499234928897206, 12.549234928897206, 12.599234928897205, 12.649234928897206, 12.699234928897205, 12.749234928897206, 12.799234928897206, 12.849234928897205, 12.899234928897206, 12.949234928897205, 12.999234928897206, 13.049234928897206, 13.099234928897205, 13.149234928897206, 13.199234928897205, 13.249234928897206, 13.299234928897206, 13.349234928897205, 13.399234928897206, 13.449234928897205, 13.499234928897206, 13.549234928897206, 13.599234928897205, 13.649234928897206, 13.699234928897205, 13.749234928897206], "phase": [0.05877852522924736, 0.06877852522924736, 0.07877852522924736, 0.08877852522924737, 0.09877852522924736, 0.10877852522924736, 0.11877852522924737, 0.12877852522924738, 0.13877852522924736, 0.14877852522924737, 0.15877852522924737, 0.16877852522924736, 0.17877852522924736, 0.18877852522924737, 0.19877852522924738, 0.20877852522924736, 0.21877852522924737, 0.22877852522924738, 0.23877852522924736, 0.24877852522924737, 0.2587785252292474, 0.26877852522924733, 0.27877852522924734, 0.28877852522924735, 0.29877852522924736, 0.30877852522924737, 0.3187785252292474, 0.3287785252292474, 0.3387785252292474, 0.34877852522924735, 0.35877852522924736, 0.36877852522924737, 0.3787785252292474, 0.3887785252292474, 0.3987785252292474, 0.4087785252292474, 0.41877852522924736, 0.42877852522924736, 0.4387785252292474, 0.4487785252292474, 0.4587785252292474, 0.4687785252292474, 0.47877852522924735, 0.48877852522924736, 0.49877852522924737, 0.5087785252292474, 0.5187785252292474, 0.5287785252292474, 0.5387785252292473, 0.5487785252292473, 0.5587785252292473, 0.5687785252292473, 0.5787785252292473, 0.5887785252292473, 0.5987785252292473, 0.6087785252292474]}, {"amplitude": [10.764784453850137, 10.814784453850137, 10.864784453850136, 10.914784453850137, 10.964784453850136, 11.014784453850137, 11.064784453850137, 11.114784453850136, 11.164784453850137, 11.214784453850136, 11.264784453850137, 11.314784453850137, 11.364784453850136, 11.414784453850137, 11.464784453850136, 11.514784453850137, 11.564784453850137, 11.614784453850136, 11.664784453850137, 11.714784453850136, 11.764784453850137, 11.814784453850137, 11.864784453850136, 11.914784453850137, 11.964784453850136, 12.014784453850137, 12.064784453850137, 12.114784453850136, 12.164784453850137, 12.214784453850136, 12.264784453850137, 12.314784453850137, 12.364784453850136, 12.414784453850137, 12.464784453850136, 12.514784453850137, 12.564784453850137, 12.614784453850136, 12.664784453850137, 12.714784453850136, 12.764784453850137, 12.814784453850137, 12.864784453850136, 12.914784453850137, 12.964784453850136, 13.014784453850137, 13.064784453850137, 13.114784453850136, 13.164784453850137, 13.214784453850136, 13.264784453850137, 13.314784453850137, 13.364784453850136, 13.414784453850137, 13.464784453850136, 13.514784453850137], "phase": [0.05090414157503708, 0.06090414157503708, 0.07090414157503708, 0.08090414157503709, 0.09090414157503708, 0.10090414157503708, 0.11090414157503709, 0.1209041415750371, 0.13090414157503708, 0.14090414157503708, 0.1509041415750371, 0.16090414157503707, 0.17090414157503708, 0.1809041415750371, 0.1909041415750371, 0.20090414157503708, 0.2109041415750371, 0.2209041415750371, 0.23090414157503708, 0.2409041415750371, 0.2509041415750371, 0.26090414157503705, 0.27090414157503706, 0.28090414157503707, 0.2909041415750371, 0.3009041415750371, 0.3109041415750371, 0.3209041415750371, 0.3309041415750371, 0.34090414157503707, 0.3509041415750371, 0.3609041415750371, 0.3709041415750371, 0.3809041415750371, 0.3909041415750371, 0.4009041415750371, 0.4109041415750371, 0.4209041415750371, 0.4309041415750371, 0.4409041415750371, 0.4509041415750371, 0.4609041415750371, 0.47090414157503707, 0.4809041415750371, 0.4909041415750371, 0.500904141575037, 0.510904141575037, 0.5209041415750371, 0.5309041415750371, 0.5409041415750371, 0.5509041415750371, 0.5609041415750371, 0.5709041415750371, 0.5809041415750371, 0.5909041415750371, 0.6009041415750371]}, {"amplitude": [10.556872407911541, 10.606872407911542, 10.656872407911541, 10.706872407911542, 10.75687240791154, 10.806872407911541, 10.856872407911542, 10.906872407911541, 10.956872407911542, 11.00687240791154, 11.056872407911541, 11.106872407911542, 11.156872407911541, 11.206872407911542, 11.25687240791154, 11.306872407911541, 11.356872407911542, 11.406872407911541, 11.456872407911542, 11.50687240791154, 11.556872407911541, 11.606872407911542, 11.656872407911541, 11.706872407911542, 11.75687240791154, 11.806872407911541, 11.856872407911542, 11.906872407911541, 11.956872407911542, 12.00687240791154, 12.056872407911541, 12.106872407911542, 12.156872407911541, 12.206872407911542, 12.25687240791154, 12.306872407911541, 12.356872407911542, 12.406872407911541, 12.456872407911542, 12.50687240791154, 12.556872407911541, 12.606872407911542, 12.656872407911541, 12.706872407911542, 12.75687240791154, 12.806872407911541, 12.856872407911542, 12.906872407911541, 12.956872407911542, 13.00687240791154, 13.056872407911541, 13.106872407911542, 13.156872407911541, 13.206872407911542, 13.25687240791154, 13.306872407911541], "phase": [0.04257792915650742, 0.05257792915650742, 0.06257792915650742, 0.07257792915650742, 0.08257792915650741, 0.09257792915650742, 0.10257792915650742, 0.11257792915650743, 0.12257792915650742, 0.1325779291565074, 0.1425779291565074, 0.15257792915650742, 0.16257792915650743, 0.17257792915650744, 0.18257792915650745, 0.1925779291565074, 0.2025779291565074, 0.21257792915650742, 0.22257792915650743, 0.23257792915650743, 0.24257792915650744, 0.2525779291565074, 0.2625779291565074, 0.2725779291565074, 0.2825779291565074, 0.29257792915650743, 0.30257792915650744, 0.31257792915650745, 0.32257792915650746, 0.3325779291565074, 0.3425779291565074, 0.35257792915650743, 0.36257792915650744, 0.37257792915650745, 0.38257792915650746, 0.39257792915650747, 0.4025779291565074, 0.41257792915650743, 0.42257792915650744, 0.43257792915650745, 0.44257792915650745, 0.45257792915650746, 0.4625779291565074, 0.4725779291565074, 0.48257792915650743, 0.49257792915650744, 0.5025779291565075, 0.5125779291565075, 0.5225779291565074, 0.5325779291565074, 0.5425779291565074, 0.5525779291565074, 0.5625779291565074, 0.5725779291565074, 0.5825779291565074, 0.5925779291565074]}, {"amplitude": [10.382789665271977, 10.432789665271978, 10.482789665271977, 10.532789665271977, 10.582789665271976, 10.632789665271977, 10.682789665271978, 10.732789665271977, 10.782789665271977, 10.832789665271976, 10.882789665271977, 10.932789665271978, 10.982789665271977, 11.032789665271977, 11.082789665271976, 11.132789665271977, 11.182789665271978, 11.232789665271977, 11.282789665271977, 11.332789665271976, 11.382789665271977, 11.432789665271978, 11.482789665271977, 11.532789665271977, 11.582789665271976, 11.632789665271977, 11.682789665271978, 11.732789665271977, 11.782789665271977, 11.832789665271976, 11.882789665271977, 11.932789665271978, 11.982789665271977, 12.032789665271977, 12.082789665271976, 12.132789665271977, 12.182789665271978, 12.232789665271977, 12.282789665271977, 12.332789665271976, 12.382789665271977, 12.432789665271978, 12.482789665271977, 12.532789665271977, 12.582789665271976, 12.632789665271977, 12.682789665271978, 12.732789665271977, 12.782789665271977, 12.832789665271976, 12.882789665271977, 12.932789665271978, 12.982789665271977, 13.032789665271977, 13.082789665271976, 13.132789665271977], "phase": [0.03387379202452918, 0.04387379202452918, 0.053873792024529174, 0.06387379202452917, 0.07387379202452918, 0.08387379202452919, 0.09387379202452917, 0.10387379202452918, 0.11387379202452919, 0.12387379202452917, 0.13387379202452918, 0.14387379202452918, 0.15387379202452917, 0.16387379202452917, 0.17387379202452918, 0.18387379202452916, 0.19387379202452917, 0.20387379202452918, 0.21387379202452916, 0.22387379202452917, 0.23387379202452918, 0.24387379202452916, 0.2538737920245292, 0.2638737920245292, 0.27387379202452916, 0.28387379202452917, 0.2938737920245292, 0.3038737920245292, 0.3138737920245292, 0.32387379202452915, 0.33387379202452916, 0.34387379202452917, 0.3538737920245292, 0.3638737920245292, 0.3738737920245292, 0.3838737920245292, 0.39387379202452916, 0.40387379202452917, 0.4138737920245292, 0.4238737920245292, 0.4338737920245292, 0.4438737920245292, 0.45387379202452915, 0.46387379202452916, 0.4738737920245292, 0.4838737920245292, 0.4938737920245292, 0.5038737920245292, 0.5138737920245292, 0.5238737920245292, 0.5338737920245292, 0.5438737920245292, 0.5538737920245292, 0.5638737920245293, 0.5738737920245293, 0.5838737920245293]}, {"amplitude": [10.244081396679109, 10.29408139667911, 10.344081396679108, 10.394081396679109, 10.444081396679108, 10.494081396679109, 10.54408139667911, 10.594081396679108, 10.644081396679109, 10.694081396679108, 10.744081396679109, 10.79408139667911, 10.844081396679108, 10.894081396679109, 10.944081396679108, 10.994081396679109, 11.04408139667911, 11.094081396679108, 11.144081396679109, 11.194081396679108, 11.244081396679109, 11.29408139667911, 11.344081396679108, 11.394081396679109, 11.444081396679108, 11.494081396679109, 11.54408139667911, 11.594081396679108, 11.644081396679109, 11.694081396679108, 11.744081396679109, 11.79408139667911, 11.844081396679108, 11.894081396679109, 11.944081396679108, 11.994081396679109, 12.04408139667911, 12.094081396679108, 12.144081396679109, 12.194081396679108, 12.244081396679109, 12.29408139667911, 12.344081396679108, 12.394081396679109, 12.444081396679108, 12.494081396679109, 12.54408139667911, 12.594081396679108, 12.644081396679109, 12.694081396679108, 12.744081396679109, 12.79408139667911, 12.844081396679108, 12.894081396679109, 12.944081396679108, 12.994081396679109], "phase": [0.024868988716485744, 0.03486898871648574, 0.044868988716485744, 0.05486898871648574, 0.06486898871648575, 0.07486898871648574, 0.08486898871648574, 0.09486898871648575, 0.10486898871648574, 0.11486898871648574, 0.12486898871648575, 0.13486898871648575, 0.14486898871648574, 0.15486898871648574, 0.16486898871648575, 0.17486898871648573, 0.18486898871648574, 0.19486898871648575, 0.20486898871648573, 0.21486898871648574, 0.22486898871648575, 0.23486898871648573, 0.24486898871648574, 0.2548689887164858, 0.26486898871648573, 0.27486898871648574, 0.28486898871648575, 0.29486898871648576, 0.30486898871648577, 0.3148689887164857, 0.32486898871648573, 0.33486898871648574, 0.34486898871648575, 0.35486898871648576, 0.36486898871648576, 0.3748689887164858, 0.3848689887164857, 0.39486898871648574, 0.40486898871648574, 0.41486898871648575, 0.42486898871648576, 0.43486898871648577, 0.4448689887164857, 0.45486898871648573, 0.46486898871648574, 0.47486898871648575, 0.48486898871648576, 0.49486898871648577, 0.5048689887164858, 0.5148689887164858, 0.5248689887164858, 0.5348689887164858, 0.5448689887164858, 0.5548689887164858, 0.5648689887164858, 0.5748689887164858]}, {"amplitude": [10.136533354392721, 10.186533354392722, 10.236533354392721, 10.286533354392722, 10.33653335439272, 10.386533354392721, 10.436533354392722, 10.486533354392721, 10.536533354392722, 10.58653335439272, 10.636533354392721, 10.686533354392722, 10.736533354392721, 10.786533354392722, 10.83653335439272, 10.886533354392721, 10.936533354392722, 10.986533354392721, 11.036533354392722, 11.08653335439272, 11.136533354392721, 11.186533354392722, 11.236533354392721, 11.286533354392722, 11.33653335439272, 11.386533354392721, 11.436533354392722, 11.486533354392721, 11.536533354392722, 11.58653335439272, 11.636533354392721, 11.686533354392722, 11.736533354392721, 11.786533354392722, 11.83653335439272, 11.886533354392721, 11.936533354392722, 11.986533354392721, 12.036533354392722, 12.08653335439272, 12.136533354392721, 12.186533354392722, 12.236533354392721, 12.286533354392722, 12.33653335439272, 12.386533354392721, 12.436533354392722, 12.486533354392721, 12.536533354392722, 12.58653335439272, 12.636533354392721, 12.686533354392722, 12.736533354392721, 12.786533354392722, 12.83653335439272, 12.886533354392721], "phase": [0.015643446504023235, 0.025643446504023233, 0.035643446504023235, 0.04564344650402323, 0.05564344650402324, 0.06564344650402323, 0.07564344650402323, 0.08564344650402324, 0.09564344650402323, 0.10564344650402323, 0.11564344650402324, 0.12564344650402323, 0.13564344650402324, 0.14564344650402325, 0.15564344650402326, 0.16564344650402324, 0.17564344650402325, 0.18564344650402326, 0.19564344650402324, 0.20564344650402325, 0.21564344650402326, 0.22564344650402324, 0.23564344650402325, 0.24564344650402326, 0.2556434465040232, 0.2656434465040232, 0.2756434465040232, 0.28564344650402324, 0.29564344650402324, 0.3056434465040232, 0.3156434465040232, 0.3256434465040232, 0.3356434465040232, 0.34564344650402323, 0.35564344650402324, 0.36564344650402325, 0.3756434465040232, 0.3856434465040232, 0.3956434465040232, 0.40564344650402323, 0.41564344650402324, 0.42564344650402325, 0.4356434465040232, 0.4456434465040232, 0.4556434465040232, 0.46564344650402323, 0.47564344650402324, 0.48564344650402325, 0.4956434465040232, 0.5056434465040233, 0.5156434465040233, 0.5256434465040233, 0.5356434465040233, 0.5456434465040233, 0.5556434465040233, 0.5656434465040233]}, {"amplitude": [10.050974072909169, 10.10097407290917, 10.150974072909168, 10.200974072909169, 10.250974072909168, 10.300974072909169, 10.35097407290917, 10.400974072909168, 10.450974072909169, 10.500974072909168, 10.550974072909169, 10.60097407290917, 10.650974072909168, 10.700974072909169, 10.750974072909168, 10.800974072909169, 10.85097407290917, 10.900974072909168, 10.950974072909169, 11.000974072909168, 11.050974072909169, 11.10097407290917, 11.150974072909168, 11.200974072909169, 11.250974072909168, 11.300974072909169, 11.35097407290917, 11.400974072909168, 11.450974072909169, 11.500974072909168, 11.550974072909169, 11.60097407290917, 11.650974072909168, 11.700974072909169, 11.750974072909168, 11.800974072909169, 11.85097407290917, 11.900974072909168, 11.950974072909169, 12.000974072909168, 12.050974072909169, 12.10097407290917, 12.150974072909168, 12.200974072909169, 12.250974072909168, 12.300974072909169, 12.35097407290917, 12.400974072909168, 12.450974072909169, 12.500974072909168, 12.550974072909169, 12.60097407290917, 12.650974072909168, 12.700974072909169, 12.750974072909168, 12.800974072909169], "phase": [0.006279051952931186, 0.016279051952931188, 0.026279051952931187, 0.036279051952931185, 0.04627905195293119, 0.05627905195293119, 0.06627905195293118, 0.07627905195293119, 0.08627905195293119, 0.09627905195293118, 0.10627905195293119, 0.11627905195293119, 0.12627905195293118, 0.1362790519529312, 0.1462790519529312, 0.15627905195293118, 0.1662790519529312, 0.1762790519529312, 0.18627905195293118, 0.1962790519529312, 0.2062790519529312, 0.21627905195293118, 0.2262790519529312, 0.2362790519529312, 0.24627905195293118, 0.2562790519529312, 0.2662790519529312, 0.27627905195293123, 0.28627905195293124, 0.29627905195293114, 0.30627905195293115, 0.31627905195293116, 0.32627905195293117, 0.3362790519529312, 0.3462790519529312, 0.3562790519529312, 0.3662790519529312, 0.3762790519529312, 0.3862790519529312, 0.3962790519529312, 0.40627905195293124, 0.41627905195293124, 0.42627905195293114, 0.43627905195293115, 0.44627905195293116, 0.45627905195293117, 0.4662790519529312, 0.4762790519529312, 0.4862790519529312, 0.4962790519529312, 0.5062790519529312, 0.5162790519529312, 0.5262790519529312, 0.5362790519529312, 0.5462790519529312, 0.5562790519529313]}, {"amplitude": [9.974778451913036, 10.024778451913036, 10.074778451913035, 10.124778451913036, 10.174778451913035, 10.224778451913036, 10.274778451913036, 10.324778451913035, 10.374778451913036, 10.424778451913035, 10.474778451913036, 10.524778451913036, 10.574778451913035, 10.624778451913036, 10.674778451913035, 10.724778451913036, 10.774778451913036, 10.824778451913035, 10.874778451913036, 10.924778451913035, 10.974778451913036, 11.024778451913036, 11.074778451913035, 11.124778451913036, 11.174778451913035, 11.224778451913036, 11.274778451913036, 11.324778451913035, 11.374778451913036, 11.424778451913035, 11.474778451913036, 11.524778451913036, 11.574778451913035, 11.624778451913036, 11.674778451913035, 11.724778451913036, 11.774778451913036, 11.824778451913035, 11.874778451913036, 11.924778451913035, 11.974778451913036, 12.024778451913036, 12.074778451913035, 12.124778451913036, 12.174778451913035, 12.224778451913036, 12.274778451913036, 12.324778451913035, 12.374778451913036, 12.424778451913035, 12.474778451913036, 12.524778451913036, 12.574778451913035, 12.624778451913036, 12.674778451913035, 12.724778451913036], "phase": [-0.0031410759078127504, 0.00685892409218725, 0.016858924092187248, 0.02685892409218725, 0.03685892409218725, 0.046858924092187254, 0.05685892409218725, 0.06685892409218726, 0.07685892409218725, 0.08685892409218725, 0.09685892409218726, 0.10685892409218725, 0.11685892409218725, 0.12685892409218724, 0.13685892409218725, 0.14685892409218723, 0.15685892409218724, 0.16685892409218725, 0.17685892409218723, 0.18685892409218724, 0.19685892409218725, 0.20685892409218723, 0.21685892409218724, 0.22685892409218725, 0.23685892409218723, 0.24685892409218724, 0.25685892409218725, 0.26685892409218726, 0.27685892409218726, 0.2868589240921872, 0.2968589240921872, 0.30685892409218724, 0.31685892409218724, 0.32685892409218725, 0.33685892409218726, 0.34685892409218727, 0.3568589240921872, 0.36685892409218723, 0.37685892409218724, 0.38685892409218725, 0.39685892409218726, 0.40685892409218727, 0.4168589240921872, 0.42685892409218723, 0.43685892409218724, 0.44685892409218725, 0.45685892409218726, 0.46685892409218727, 0.4768589240921872, 0.48685892409218723, 0.49685892409218724, 0.5068589240921872, 0.5168589240921873, 0.5268589240921873, 0.5368589240921873, 0.5468589240921873]}, {"amplitude": [9.893859635101904, 9.943859635101905, 9.993859635101906, 10.043859635101906, 10.093859635101904, 10.143859635101904, 10.193859635101905, 10.243859635101906, 10.293859635101906, 10.343859635101904, 10.393859635101904, 10.443859635101905, 10.493859635101906, 10.543859635101906, 10.593859635101904, 10.643859635101904, 10.693859635101905, 10.743859635101906, 10.793859635101906, 10.843859635101904, 10.893859635101904, 10.943859635101905, 10.993859635101906, 11.043859635101906, 11.093859635101904, 11.143859635101904, 11.193859635101905, 11.243859635101906, 11.293859635101906, 11.343859635101904, 11.393859635101904, 11.443859635101905, 11.493859635101906, 11.543859635101906, 11.593859635101904, 11.643859635101904, 11.693859635101905, 11.743859635101906, 11.793859635101906, 11.843859635101904, 11.893859635101904, 11.943859635101905, 11.993859635101906, 12.043859635101906, 12.093859635101904, 12.143859635101904, 12.193859635101905, 12.243859635101906, 12.293859635101906, 12.343859635101904, 12.393859635101904, 12.443859635101905, 12.493859635101906, 12.543859635101906, 12.593859635101904, 12.643859635101904], "phase": [-0.012533323356430471, -0.0025333233564304707, 0.0074666766435695295, 0.017466676643569528, 0.02746667664356953, 0.037466676643569535, 0.04746667664356953, 0.05746667664356954, 0.06746667664356953, 0.07746667664356953, 0.08746667664356954, 0.09746667664356953, 0.10746667664356953, 0.11746667664356954, 0.12746667664356953, 0.1374666766435695, 0.14746667664356952, 0.15746667664356953, 0.1674666766435695, 0.17746667664356952, 0.18746667664356953, 0.1974666766435695, 0.20746667664356952, 0.21746667664356953, 0.2274666766435695, 0.23746667664356952, 0.24746667664356953, 0.25746667664356954, 0.26746667664356955, 0.2774666766435695, 0.2874666766435695, 0.2974666766435695, 0.3074666766435695, 0.31746667664356953, 0.32746667664356954, 0.33746667664356955, 0.3474666766435695, 0.3574666766435695, 0.3674666766435695, 0.37746667664356953, 0.38746667664356954, 0.39746667664356955, 0.4074666766435695, 0.4174666766435695, 0.4274666766435695, 0.43746667664356953, 0.44746667664356954, 0.45746667664356955, 0.4674666766435695, 0.4774666766435695, 0.4874666766435695, 0.4974666766435695, 0.5074666766435696, 0.5174666766435696, 0.5274666766435696, 0.5374666766435696]}, {"amplitude": [9.794867490039655, 9.844867490039656, 9.894867490039655, 9.944867490039655, 9.994867490039654, 10.044867490039655, 10.094867490039656, 10.144867490039655, 10.194867490039655, 10.244867490039654, 10.294867490039655, 10.344867490039656, 10.394867490039655, 10.444867490039655, 10.494867490039654, 10.544867490039655, 10.594867490039656, 10.644867490039655, 10.694867490039655, 10.744867490039654, 10.794867490039655, 10.844867490039656, 10.894867490039655, 10.944867490039655, 10.994867490039654, 11.044867490039655, 11.094867490039656, 11.144867490039655, 11.194867490039655, 11.244867490039654, 11.294867490039655, 11.344867490039656, 11.394867490039655, 11.444867490039655, 11.494867490039654, 11.544867490039655, 11.594867490039656, 11.644867490039655, 11.694867490039655, 11.744867490039654, 11.794867490039655, 11.844867490039656, 11.894867490039655, 11.944867490039655, 11.994867490039654, 12.044867490039655, 12.094867490039656, 12.144867490039655, 12.194867490039655, 12.244867490039654, 12.294867490039655, 12.344867490039656, 12.394867490039655, 12.444867490039655, 12.494867490039654, 12.544867490039655], "phase": [-0.021814324139654076, -0.011814324139654076, -0.0018143241396540756, 0.008185675860345923, 0.018185675860345925, 0.028185675860345927, 0.03818567586034592, 0.04818567586034593, 0.058185675860345926, 0.06818567586034592, 0.07818567586034593, 0.08818567586034592, 0.09818567586034592, 0.10818567586034593, 0.11818567586034594, 0.1281856758603459, 0.1381856758603459, 0.14818567586034592, 0.15818567586034593, 0.16818567586034594, 0.17818567586034595, 0.1881856758603459, 0.1981856758603459, 0.20818567586034592, 0.21818567586034593, 0.22818567586034594, 0.23818567586034595, 0.24818567586034596, 0.25818567586034596, 0.2681856758603459, 0.2781856758603459, 0.28818567586034594, 0.29818567586034594, 0.30818567586034595, 0.31818567586034596, 0.32818567586034597, 0.3381856758603459, 0.34818567586034593, 0.35818567586034594, 0.36818567586034595, 0.37818567586034596, 0.38818567586034597, 0.3981856758603459, 0.40818567586034593, 0.41818567586034594, 0.42818567586034595, 0.43818567586034596, 0.44818567586034597, 0.4581856758603459, 0.46818567586034593, 0.47818567586034594, 0.48818567586034595, 0.49818567586034596, 0.5081856758603459, 0.5181856758603459, 0.5281856758603459]}, {"amplitude": [9.667282966138655, 9.717282966138656, 9.767282966138655, 9.817282966138656, 9.867282966138655, 9.917282966138655, 9.967282966138656, 10.017282966138655, 10.067282966138656, 10.117282966138655, 10.167282966138655, 10.217282966138656, 10.267282966138655, 10.317282966138656, 10.367282966138655, 10.417282966138655, 10.467282966138656, 10.517282966138655, 10.567282966138656, 10.617282966138655, 10.667282966138655, 10.717282966138656, 10.767282966138655, 10.817282966138656, 10.867282966138655, 10.917282966138655, 10.967282966138656, 11.017282966138655, 11.067282966138656, 11.117282966138655, 11.167282966138655, 11.217282966138656, 11.267282966138655, 11.317282966138656, 11.367282966138655, 11.417282966138655, 11.467282966138656, 11.517282966138655, 11.567282966138656, 11.617282966138655, 11.667282966138655, 11.717282966138656, 11.767282966138655, 11.817282966138656, 11.867282966138655, 11.917282966138655, 11.967282966138656, 12.017282966138655, 12.067282966138656, 12.117282966138655, 12.167282966138655, 12.217282966138656, 12.267282966138655, 12.317282966138656, 12.367282966138655, 12.417282966138655], "phase": [-0.030901699437494514, -0.020901699437494516, -0.010901699437494514, -0.0009016994374945152, 0.009098300562505487, 0.01909830056250549, 0.029098300562505484, 0.03909830056250549, 0.049098300562505484, 0.05909830056250548, 0.06909830056250549, 0.07909830056250548, 0.08909830056250548, 0.09909830056250549, 0.1090983005625055, 0.11909830056250548, 0.12909830056250549, 0.1390983005625055, 0.14909830056250548, 0.15909830056250548, 0.1690983005625055, 0.17909830056250547, 0.18909830056250548, 0.1990983005625055, 0.20909830056250547, 0.21909830056250548, 0.2290983005625055, 0.2390983005625055, 0.2490983005625055, 0.2590983005625055, 0.2690983005625055, 0.2790983005625055, 0.2890983005625055, 0.2990983005625055, 0.30909830056250553, 0.31909830056250554, 0.3290983005625055, 0.3390983005625055, 0.3490983005625055, 0.3590983005625055, 0.36909830056250553, 0.37909830056250554, 0.3890983005625055, 0.3990983005625055, 0.4090983005625055, 0.4190983005625055, 0.42909830056250553, 0.43909830056250554, 0.4490983005625055, 0.4590983005625055, 0.4690983005625055, 0.4790983005625055, 0.48909830056250553, 0.49909830056250554, 0.5090983005625055, 0.5190983005625055]}, {"amplitude": [9.505112237258915, 9.555112237258916, 9.605112237258915, 9.655112237258916, 9.705112237258914, 9.755112237258915, 9.805112237258916, 9.855112237258915, 9.905112237258916, 9.955112237258914, 10.005112237258915, 10.055112237258916, 10.105112237258915, 10.155112237258916, 10.205112237258914, 10.255112237258915, 10.305112237258916, 10.355112237258915, 10.405112237258916, 10.455112237258914, 10.505112237258915, 10.555112237258916, 10.605112237258915, 10.655112237258916, 10.705112237258914, 10.755112237258915, 10.805112237258916, 10.855112237258915, 10.905112237258916, 10.955112237258914, 11.005112237258915, 11.055112237258916, 11.105112237258915, 11.155112237258916, 11.205112237258914, 11.255112237258915, 11.305112237258916, 11.355112237258915, 11.405112237258916, 11.455112237258914, 11.505112237258915, 11.555112237258916, 11.605112237258915, 11.655112237258916, 11.705112237258914, 11.755112237258915, 11.805112237258916, 11.855112237258915, 11.905112237258916, 11.955112237258914, 12.005112237258915, 12.055112237258916, 12.105112237258915, 12.155112237258916, 12.205112237258914, 12.255112237258915], "phase": [-0.03971478906347828, -0.029714789063478277, -0.019714789063478278, -0.00971478906347828, 0.0002852109365217223, 0.010285210936521724, 0.02028521093652172, 0.030285210936521728, 0.04028521093652172, 0.05028521093652172, 0.06028521093652173, 0.07028521093652172, 0.08028521093652172, 0.09028521093652173, 0.10028521093652173, 0.11028521093652172, 0.12028521093652172, 0.13028521093652173, 0.14028521093652171, 0.15028521093652172, 0.16028521093652173, 0.1702852109365217, 0.18028521093652172, 0.19028521093652173, 0.2002852109365217, 0.21028521093652172, 0.22028521093652173, 0.23028521093652174, 0.24028521093652175, 0.2502852109365217, 0.2602852109365217, 0.2702852109365217, 0.2802852109365217, 0.2902852109365217, 0.3002852109365217, 0.3102852109365217, 0.32028521093652174, 0.33028521093652174, 0.34028521093652175, 0.35028521093652176, 0.36028521093652177, 0.3702852109365218, 0.3802852109365217, 0.3902852109365217, 0.4002852109365217, 0.4102852109365217, 0.4202852109365217, 0.4302852109365217, 0.44028521093652173, 0.45028521093652174, 0.46028521093652175, 0.47028521093652176, 0.48028521093652177, 0.4902852109365218, 0.5002852109365218, 0.5102852109365218]}, {"amplitude": [9.307940767536376, 9.357940767536377, 9.407940767536376, 9.457940767536376, 9.507940767536375, 9.557940767536376, 9.607940767536377, 9.657940767536376, 9.707940767536376, 9.757940767536375, 9.807940767536376, 9.857940767536377, 9.907940767536376, 9.957940767536376, 10.007940767536375, 10.057940767536376, 10.107940767536377, 10.157940767536376, 10.207940767536376, 10.257940767536375, 10.307940767536376, 10.357940767536377, 10.407940767536376, 10.457940767536376, 10.507940767536375, 10.557940767536376, 10.607940767536377, 10.657940767536376, 10.707940767536376, 10.757940767536375, 10.807940767536376, 10.857940767536377, 10.907940767536376, 10.957940767536376, 11.007940767536375, 11.057940767536376, 11.107940767536377, 11.157940767536376, 11.207940767536376, 11.257940767536375, 11.307940767536376, 11.357940767536377, 11.407940767536376, 11.457940767536376, 11.507940767536375, 11.557940767536376, 11.607940767536377, 11.657940767536376, 11.707940767536376, 11.757940767536375, 11.807940767536376, 11.857940767536377, 11.907940767536376, 11.957940767536376, 12.007940767536375, 12.057940767536376], "phase": [-0.04817536741017153, -0.03817536741017153, -0.028175367410171532, -0.018175367410171533, -0.008175367410171532, 0.0018246325898284704, 0.011824632589828465, 0.021824632589828474, 0.03182463258982847, 0.041824632589828464, 0.05182463258982847, 0.06182463258982847, 0.07182463258982846, 0.08182463258982847, 0.09182463258982848, 0.10182463258982846, 0.11182463258982847, 0.12182463258982848, 0.13182463258982846, 0.14182463258982847, 0.15182463258982848, 0.16182463258982846, 0.17182463258982847, 0.18182463258982848, 0.19182463258982846, 0.20182463258982847, 0.21182463258982848, 0.22182463258982849, 0.2318246325898285, 0.24182463258982845, 0.25182463258982846, 0.26182463258982847, 0.2718246325898285, 0.2818246325898285, 0.2918246325898285, 0.3018246325898285, 0.31182463258982845, 0.32182463258982846, 0.33182463258982847, 0.3418246325898285, 0.3518246325898285, 0.3618246325898285, 0.37182463258982845, 0.38182463258982846, 0.39182463258982847, 0.4018246325898285, 0.4118246325898285, 0.4218246325898285, 0.43182463258982845, 0.44182463258982846, 0.45182463258982847, 0.4618246325898285, 0.4718246325898285, 0.4818246325898285, 0.4918246325898285, 0.5018246325898286]}, {"amplitude": [9.081197376074343, 9.131197376074343, 9.18119737607434, 9.231197376074341, 9.281197376074342, 9.331197376074343, 9.381197376074343, 9.43119737607434, 9.481197376074341, 9.531197376074342, 9.581197376074343, 9.631197376074343, 9.68119737607434, 9.731197376074341, 9.781197376074342, 9.831197376074343, 9.881197376074343, 9.93119737607434, 9.981197376074341, 10.031197376074342, 10.081197376074343, 10.131197376074343, 10.18119737607434, 10.231197376074341, 10.281197376074342, 10.331197376074343, 10.381197376074343, 10.43119737607434, 10.481197376074341, 10.531197376074342, 10.581197376074343, 10.631197376074343, 10.68119737607434, 10.731197376074341, 10.781197376074342, 10.831197376074343, 10.881197376074343, 10.93119737607434, 10.981197376074341, 11.031197376074342, 11.081197376074343, 11.131197376074343, 11.18119737607434, 11.231197376074341, 11.281197376074342, 11.331197376074343, 11.381197376074343, 11.43119737607434, 11.481197376074341, 11.531197376074342, 11.581197376074343, 11.631197376074343, 11.68119737607434, 11.731197376074341, 11.781197376074342, 11.831197376074343], "phase": [-0.05620833778521317, -0.04620833778521317, -0.036208337785213165, -0.02620833778521317, -0.01620833778521317, -0.006208337785213167, 0.0037916622147868284, 0.013791662214786837, 0.023791662214786832, 0.03379166221478683, 0.043791662214786836, 0.05379166221478683, 0.06379166221478683, 0.07379166221478684, 0.08379166221478684, 0.09379166221478683, 0.10379166221478683, 0.11379166221478684, 0.12379166221478682, 0.13379166221478683, 0.14379166221478684, 0.15379166221478682, 0.16379166221478683, 0.17379166221478684, 0.18379166221478682, 0.19379166221478683, 0.20379166221478684, 0.21379166221478685, 0.22379166221478686, 0.2337916622147868, 0.24379166221478682, 0.25379166221478683, 0.26379166221478684, 0.27379166221478685, 0.28379166221478686, 0.29379166221478686, 0.3037916622147868, 0.3137916622147868, 0.32379166221478684, 0.33379166221478684, 0.34379166221478685, 0.35379166221478686, 0.3637916622147868, 0.3737916622147868, 0.38379166221478683, 0.39379166221478684, 0.40379166221478685, 0.41379166221478686, 0.4237916622147868, 0.4337916622147868, 0.44379166221478683, 0.45379166221478684, 0.46379166221478685, 0.47379166221478686, 0.48379166221478687, 0.4937916622147869]}, {"amplitude": [8.835589386308026, 8.885589386308027, 8.935589386308026, 8.985589386308027, 9.035589386308025, 9.085589386308026, 9.135589386308027, 9.185589386308026, 9.235589386308027, 9.285589386308025, 9.335589386308026, 9.385589386308027, 9.435589386308026, 9.485589386308027, 9.535589386308025, 9.585589386308026, 9.635589386308027, 9.685589386308026, 9.735589386308027, 9.785589386308025, 9.835589386308026, 9.885589386308027, 9.935589386308026, 9.985589386308027, 10.035589386308025, 10.085589386308026, 10.135589386308027, 10.185589386308026, 10.235589386308027, 10.285589386308025, 10.335589386308026, 10.385589386308027, 10.435589386308026, 10.485589386308027, 10.535589386308025, 10.585589386308026, 10.635589386308027, 10.685589386308026, 10.735589386308027, 10.785589386308025, 10.835589386308026, 10.885589386308027, 10.935589386308026, 10.985589386308027, 11.035589386308025, 11.085589386308026, 11.135589386308027, 11.185589386308026, 11.235589386308027, 11.285589386308025, 11.335589386308026, 11.385589386308027, 11.435589386308026, 11.485589386308027, 11.535589386308025, 11.585589386308026], "phase": [-0.0637423989748689, -0.0537423989748689, -0.043742398974868896, -0.0337423989748689, -0.0237423989748689, -0.013742398974868897, -0.003742398974868902, 0.006257601025131107, 0.016257601025131102, 0.026257601025131097, 0.036257601025131106, 0.0462576010251311, 0.056257601025131096, 0.0662576010251311, 0.07625760102513111, 0.0862576010251311, 0.0962576010251311, 0.10625760102513111, 0.1162576010251311, 0.12625760102513112, 0.13625760102513113, 0.14625760102513108, 0.1562576010251311, 0.1662576010251311, 0.1762576010251311, 0.18625760102513111, 0.19625760102513112, 0.20625760102513113, 0.21625760102513114, 0.2262576010251311, 0.2362576010251311, 0.2462576010251311, 0.2562576010251311, 0.26625760102513113, 0.27625760102513114, 0.28625760102513115, 0.2962576010251311, 0.3062576010251311, 0.3162576010251311, 0.3262576010251311, 0.33625760102513114, 0.34625760102513115, 0.3562576010251311, 0.3662576010251311, 0.3762576010251311, 0.3862576010251311, 0.39625760102513113, 0.40625760102513114, 0.4162576010251311, 0.4262576010251311, 0.4362576010251311, 0.4462576010251311, 0.45625760102513113, 0.46625760102513114, 0.47625760102513115, 0.48625760102513116]}, {"amplitude": [8.585786437626904, 8.635786437626905, 8.685786437626904, 8.735786437626905, 8.785786437626903, 8.835786437626904, 8.885786437626905, 8.935786437626904, 8.985786437626905, 9.035786437626903, 9.085786437626904, 9.135786437626905, 9.185786437626904, 9.235786437626905, 9.285786437626903, 9.335786437626904, 9.385786437626905, 9.435786437626904, 9.485786437626905, 9.535786437626903, 9.585786437626904, 9.635786437626905, 9.685786437626904, 9.735786437626905, 9.785786437626903, 9.835786437626904, 9.885786437626905, 9.935786437626904, 9.985786437626905, 10.035786437626903, 10.085786437626904, 10.135786437626905, 10.185786437626904, 10.235786437626905, 10.285786437626903, 10.335786437626904, 10.385786437626905, 10.435786437626904, 10.485786437626905, 10.535786437626903, 10.585786437626904, 10.635786437626905, 10.685786437626904, 10.735786437626905, 10.785786437626903, 10.835786437626904, 10.885786437626905, 10.935786437626904, 10.985786437626905, 11.035786437626903, 11.085786437626904, 11.135786437626905, 11.185786437626904, 11.235786437626905, 11.285786437626903, 11.335786437626904], "phase": [-0.07071067811865477, -0.060710678118654764, -0.05071067811865476, -0.04071067811865477, -0.030710678118654765, -0.020710678118654763, -0.010710678118654768, -0.0007106781186547589, 0.009289321881345236, 0.01928932188134523, 0.02928932188134524, 0.039289321881345235, 0.04928932188134523, 0.05928932188134524, 0.06928932188134525, 0.07928932188134523, 0.08928932188134524, 0.09928932188134525, 0.10928932188134523, 0.11928932188134524, 0.12928932188134523, 0.13928932188134524, 0.14928932188134525, 0.15928932188134526, 0.1692893218813452, 0.17928932188134522, 0.18928932188134523, 0.19928932188134524, 0.20928932188134525, 0.2192893218813452, 0.2292893218813452, 0.23928932188134522, 0.24928932188134523, 0.25928932188134524, 0.26928932188134524, 0.27928932188134525, 0.2892893218813452, 0.2992893218813452, 0.3092893218813452, 0.31928932188134523, 0.32928932188134524, 0.33928932188134525, 0.3492893218813452, 0.3592893218813452, 0.3692893218813452, 0.37928932188134523, 0.38928932188134524, 0.39928932188134525, 0.4092893218813452, 0.4192893218813452, 0.4292893218813452, 0.43928932188134523, 0.44928932188134524, 0.45928932188134525, 0.46928932188134526, 0.47928932188134526]}, {"amplitude": [8.348536148643015, 8.398536148643016, 8.448536148643015, 8.498536148643016, 8.548536148643015, 8.598536148643015, 8.648536148643016, 8.698536148643015, 8.748536148643016, 8.798536148643015, 8.848536148643015, 8.898536148643016, 8.948536148643015, 8.998536148643016, 9.048536148643015, 9.098536148643015, 9.148536148643016, 9.198536148643015, 9.248536148643016, 9.298536148643015, 9.348536148643015, 9.398536148643016, 9.448536148643015, 9.498536148643016, 9.548536148643015, 9.598536148643015, 9.648536148643016, 9.698536148643015, 9.748536148643016, 9.798536148643015, 9.848536148643015, 9.898536148643016, 9.948536148643015, 9.998536148643016, 10.048536148643015, 10.098536148643015, 10.148536148643016, 10.198536148643015, 10.248536148643016, 10.298536148643015, 10.348536148643015, 10.398536148643016, 10.448536148643015, 10.498536148643016, 10.548536148643015, 10.598536148643015, 10.648536148643016, 10.698536148643015, 10.748536148643016, 10.798536148643015, 10.848536148643015, 10.898536148643016, 10.948536148643015, 10.998536148643016, 11.048536148643015, 11.098536148643015], "phase": [-0.07705132427757902, -0.06705132427757902, -0.057051324277579016, -0.04705132427757902, -0.03705132427757902, -0.027051324277579017, -0.017051324277579022, -0.007051324277579013, 0.002948675722420982, 0.012948675722420977, 0.022948675722420986, 0.03294867572242098, 0.042948675722420976, 0.052948675722420985, 0.062948675722421, 0.07294867572242097, 0.08294867572242098, 0.09294867572242099, 0.10294867572242097, 0.11294867572242098, 0.12294867572242099, 0.13294867572242097, 0.14294867572242098, 0.152948675722421, 0.16294867572242097, 0.17294867572242098, 0.182948675722421, 0.192948675722421, 0.202948675722421, 0.21294867572242096, 0.22294867572242097, 0.23294867572242098, 0.242948675722421, 0.25294867572242097, 0.262948675722421, 0.272948675722421, 0.282948675722421, 0.292948675722421, 0.302948675722421, 0.312948675722421, 0.32294867572242103, 0.33294867572242104, 0.34294867572242094, 0.35294867572242095, 0.36294867572242095, 0.37294867572242096, 0.382948675722421, 0.392948675722421, 0.402948675722421, 0.412948675722421, 0.422948675722421, 0.432948675722421, 0.442948675722421, 0.45294867572242103, 0.46294867572242104, 0.47294867572242105]}, {"amplitude": [8.140474719672271, 8.190474719672272, 8.240474719672271, 8.290474719672272, 8.34047471967227, 8.390474719672271, 8.440474719672272, 8.490474719672271, 8.540474719672272, 8.59047471967227, 8.640474719672271, 8.690474719672272, 8.740474719672271, 8.790474719672272, 8.84047471967227, 8.890474719672271, 8.940474719672272, 8.990474719672271, 9.040474719672272, 9.09047471967227, 9.140474719672271, 9.190474719672272, 9.240474719672271, 9.290474719672272, 9.34047471967227, 9.390474719672271, 9.440474719672272, 9.490474719672271, 9.540474719672272, 9.59047471967227, 9.640474719672271, 9.690474719672272, 9.740474719672271, 9.790474719672272, 9.84047471967227, 9.890474719672271, 9.940474719672272, 9.990474719672271, 10.040474719672272, 10.09047471967227, 10.140474719672271, 10.190474719672272, 10.240474719672271, 10.290474719672272, 10.34047471967227, 10.390474719672271, 10.440474719672272, 10.490474719672271, 10.540474719672272, 10.59047471967227, 10.640474719672271, 10.690474719672272, 10.740474719672271, 10.790474719672272, 10.84047471967227, 10.890474719672271], "phase": [-0.08270805742745614, -0.07270805742745615, -0.06270805742745614, -0.05270805742745614, -0.04270805742745614, -0.03270805742745614, -0.022708057427456144, -0.012708057427456135, -0.0027080574274561398, 0.007291942572543855, 0.017291942572543864, 0.02729194257254386, 0.037291942572543854, 0.04729194257254386, 0.05729194257254387, 0.06729194257254385, 0.07729194257254386, 0.08729194257254387, 0.09729194257254385, 0.10729194257254386, 0.11729194257254387, 0.12729194257254384, 0.13729194257254385, 0.14729194257254385, 0.15729194257254386, 0.16729194257254387, 0.17729194257254388, 0.1872919425725439, 0.1972919425725439, 0.20729194257254385, 0.21729194257254386, 0.22729194257254387, 0.23729194257254388, 0.2472919425725439, 0.2572919425725439, 0.2672919425725439, 0.27729194257254386, 0.28729194257254387, 0.2972919425725439, 0.3072919425725439, 0.3172919425725439, 0.3272919425725439, 0.33729194257254386, 0.34729194257254387, 0.3572919425725439, 0.3672919425725439, 0.3772919425725439, 0.3872919425725439, 0.39729194257254385, 0.40729194257254386, 0.4172919425725439, 0.4272919425725439, 0.4372919425725439, 0.4472919425725439, 0.4572919425725439, 0.4672919425725439]}, {"amplitude": [7.975938524172467, 8.025938524172467, 8.075938524172466, 8.125938524172467, 8.175938524172466, 8.225938524172467, 8.275938524172467, 8.325938524172466, 8.375938524172467, 8.425938524172466, 8.475938524172467, 8.525938524172467, 8.575938524172466, 8.625938524172467, 8.675938524172466, 8.725938524172467, 8.775938524172467, 8.825938524172466, 8.875938524172467, 8.925938524172466, 8.975938524172467, 9.025938524172467, 9.075938524172466, 9.125938524172467, 9.175938524172466, 9.225938524172467, 9.275938524172467, 9.325938524172466, 9.375938524172467, 9.425938524172466, 9.475938524172467, 9.525938524172467, 9.575938524172466, 9.625938524172467, 9.675938524172466, 9.725938524172467, 9.775938524172467, 9.825938524172466, 9.875938524172467, 9.925938524172466, 9.975938524172467, 10.025938524172467, 10.075938524172466, 10.125938524172467, 10.175938524172466, 10.225938524172467, 10.275938524172467, 10.325938524172466, 10.375938524172467, 10.425938524172466, 10.475938524172467, 10.525938524172467, 10.575938524172466, 10.625938524172467, 10.675938524172466, 10.725938524172467], "phase": [-0.08763066800438639, -0.0776306680043864, -0.06763066800438639, -0.05763066800438639, -0.04763066800438639, -0.037630668004386386, -0.02763066800438639, -0.017630668004386382, -0.007630668004386387, 0.0023693319956136077, 0.012369331995613617, 0.02236933199561361, 0.03236933199561361, 0.042369331995613616, 0.052369331995613624, 0.062369331995613606, 0.07236933199561361, 0.08236933199561362, 0.0923693319956136, 0.10236933199561361, 0.11236933199561362, 0.1223693319956136, 0.13236933199561363, 0.14236933199561363, 0.1523693319956136, 0.1623693319956136, 0.1723693319956136, 0.18236933199561361, 0.19236933199561362, 0.20236933199561358, 0.21236933199561359, 0.2223693319956136, 0.2323693319956136, 0.2423693319956136, 0.2523693319956136, 0.26236933199561363, 0.2723693319956136, 0.2823693319956136, 0.2923693319956136, 0.3023693319956136, 0.3123693319956136, 0.32236933199561363, 0.3323693319956136, 0.3423693319956136, 0.3523693319956136, 0.3623693319956136, 0.3723693319956136, 0.3823693319956136, 0.3923693319956136, 0.4023693319956136, 0.4123693319956136, 0.4223693319956136, 0.4323693319956136, 0.4423693319956136, 0.45236933199561363, 0.46236933199561364]}, {"amplitude": [7.865082730103557, 7.915082730103558, 7.965082730103557, 8.015082730103558, 8.065082730103557, 8.115082730103557, 8.165082730103558, 8.215082730103557, 8.265082730103558, 8.315082730103557, 8.365082730103557, 8.415082730103558, 8.465082730103557, 8.515082730103558, 8.565082730103557, 8.615082730103557, 8.665082730103558, 8.715082730103557, 8.765082730103558, 8.815082730103557, 8.865082730103557, 8.915082730103558, 8.965082730103557, 9.015082730103558, 9.065082730103557, 9.115082730103557, 9.165082730103558, 9.215082730103557, 9.265082730103558, 9.315082730103557, 9.365082730103557, 9.415082730103558, 9.465082730103557, 9.515082730103558, 9.565082730103557, 9.615082730103557, 9.665082730103558, 9.715082730103557, 9.765082730103558, 9.815082730103557, 9.865082730103557, 9.915082730103558, 9.965082730103557, 10.015082730103558, 10.065082730103557, 10.115082730103557, 10.165082730103558, 10.215082730103557, 10.265082730103558, 10.315082730103557, 10.365082730103557, 10.415082730103558, 10.465082730103557, 10.515082730103558, 10.565082730103557, 10.615082730103557], "phase": [-0.09177546256839804, -0.08177546256839804, -0.07177546256839804, -0.06177546256839804, -0.05177546256839804, -0.041775462568398036, -0.03177546256839804, -0.021775462568398032, -0.011775462568398037, -0.0017754625683980424, 0.008224537431601966, 0.01822453743160196, 0.028224537431601956, 0.038224537431601965, 0.048224537431601974, 0.058224537431601955, 0.06822453743160196, 0.07822453743160197, 0.08822453743160195, 0.09822453743160196, 0.10822453743160197, 0.11822453743160195, 0.12822453743160195, 0.13822453743160196, 0.14822453743160197, 0.15822453743160197, 0.16822453743160198, 0.178224537431602, 0.188224537431602, 0.19822453743160195, 0.20822453743160196, 0.21822453743160197, 0.22822453743160198, 0.238224537431602, 0.248224537431602, 0.258224537431602, 0.26822453743160196, 0.27822453743160197, 0.288224537431602, 0.298224537431602, 0.308224537431602, 0.318224537431602, 0.32822453743160196, 0.33822453743160197, 0.348224537431602, 0.358224537431602, 0.368224537431602, 0.378224537431602, 0.38822453743160196, 0.39822453743160197, 0.408224537431602, 0.418224537431602, 0.428224537431602, 0.438224537431602, 0.448224537431602, 0.458224537431602]}, {"amplitude": [7.812570012521147, 7.8625700125211475, 7.9125700125211464, 7.962570012521147, 8.012570012521145, 8.062570012521146, 8.112570012521147, 8.162570012521146, 8.212570012521146, 8.262570012521145, 8.312570012521146, 8.362570012521147, 8.412570012521146, 8.462570012521146, 8.512570012521145, 8.562570012521146, 8.612570012521147, 8.662570012521146, 8.712570012521146, 8.762570012521145, 8.812570012521146, 8.862570012521147, 8.912570012521146, 8.962570012521146, 9.012570012521145, 9.062570012521146, 9.112570012521147, 9.162570012521146, 9.212570012521146, 9.262570012521145, 9.312570012521146, 9.362570012521147, 9.412570012521146, 9.462570012521146, 9.512570012521145, 9.562570012521146, 9.612570012521147, 9.662570012521146, 9.712570012521146, 9.762570012521145, 9.812570012521146, 9.862570012521147, 9.912570012521146, 9.962570012521146, 10.012570012521145, 10.062570012521146, 10.112570012521147, 10.162570012521146, 10.212570012521146, 10.262570012521145, 10.312570012521146, 10.362570012521147, 10.412570012521146, 10.462570012521146, 10.512570012521145, 10.562570012521146], "phase": [-0.09510565162951534, -0.08510565162951535, -0.07510565162951534, -0.06510565162951534, -0.05510565162951534, -0.04510565162951534, -0.035105651629515344, -0.025105651629515335, -0.01510565162951534, -0.005105651629515345, 0.0048943483704846635, 0.014894348370484659, 0.024894348370484654, 0.03489434837048466, 0.04489434837048467, 0.05489434837048465, 0.06489434837048466, 0.07489434837048467, 0.08489434837048465, 0.09489434837048466, 0.10489434837048467, 0.11489434837048465, 0.12489434837048466, 0.13489434837048467, 0.14489434837048465, 0.15489434837048466, 0.16489434837048467, 0.17489434837048468, 0.18489434837048468, 0.19489434837048464, 0.20489434837048465, 0.21489434837048466, 0.22489434837048466, 0.23489434837048467, 0.24489434837048468, 0.2548943483704847, 0.26489434837048464, 0.27489434837048465, 0.28489434837048466, 0.29489434837048467, 0.3048943483704847, 0.3148943483704847, 0.32489434837048464, 0.33489434837048465, 0.34489434837048466, 0.35489434837048467, 0.3648943483704847, 0.3748943483704847, 0.38489434837048464, 0.39489434837048465, 0.40489434837048466, 0.41489434837048467, 0.4248943483704847, 0.4348943483704847, 0.4448943483704847, 0.4548943483704847]}, {"amplitude": [7.817012503289769, 7.86701250328977, 7.917012503289769, 7.967012503289769, 8.017012503289768, 8.067012503289769, 8.11701250328977, 8.167012503289769, 8.21701250328977, 8.267012503289768, 8.317012503289769, 8.36701250328977, 8.417012503289769, 8.46701250328977, 8.517012503289768, 8.567012503289769, 8.61701250328977, 8.667012503289769, 8.71701250328977, 8.767012503289768, 8.817012503289769, 8.86701250328977, 8.917012503289769, 8.96701250328977, 9.017012503289768, 9.067012503289769, 9.11701250328977, 9.167012503289769, 9.21701250328977, 9.267012503289768, 9.317012503289769, 9.36701250328977, 9.417012503289769, 9.46701250328977, 9.517012503289768, 9.567012503289769, 9.61701250328977, 9.667012503289769, 9.71701250328977, 9.767012503289768, 9.817012503289769, 9.86701250328977, 9.917012503289769, 9.96701250328977, 10.017012503289768, 10.067012503289769, 10.11701250328977, 10.167012503289769, 10.21701250328977, 10.267012503289768, 10.317012503289769, 10.36701250328977, 10.417012503289769, 10.46701250328977, 10.517012503289768, 10.567012503289769], "phase": [-0.09759167619387477, -0.08759167619387477, -0.07759167619387476, -0.06759167619387477, -0.057591676193874765, -0.04759167619387476, -0.03759167619387477, -0.02759167619387476, -0.017591676193874764, -0.007591676193874769, 0.00240832380612524, 0.012408323806125235, 0.02240832380612523, 0.03240832380612524, 0.04240832380612525, 0.05240832380612523, 0.06240832380612524, 0.07240832380612525, 0.08240832380612523, 0.09240832380612524, 0.10240832380612525, 0.11240832380612523, 0.12240832380612524, 0.13240832380612524, 0.14240832380612523, 0.15240832380612523, 0.16240832380612524, 0.17240832380612525, 0.18240832380612526, 0.19240832380612521, 0.20240832380612522, 0.21240832380612523, 0.22240832380612524, 0.23240832380612525, 0.24240832380612526, 0.25240832380612527, 0.2624083238061252, 0.27240832380612523, 0.28240832380612524, 0.29240832380612525, 0.30240832380612526, 0.31240832380612527, 0.3224083238061252, 0.3324083238061252, 0.34240832380612524, 0.35240832380612525, 0.36240832380612525, 0.37240832380612526, 0.3824083238061252, 0.3924083238061252, 0.40240832380612523, 0.41240832380612524, 0.42240832380612525, 0.43240832380612526, 0.44240832380612527, 0.4524083238061253]}, {"amplitude": [7.8712444951405285, 7.921244495140529, 7.971244495140528, 8.021244495140529, 8.071244495140528, 8.121244495140528, 8.17124449514053, 8.221244495140528, 8.271244495140529, 8.321244495140528, 8.371244495140528, 8.42124449514053, 8.471244495140528, 8.521244495140529, 8.571244495140528, 8.621244495140528, 8.67124449514053, 8.721244495140528, 8.771244495140529, 8.821244495140528, 8.871244495140528, 8.92124449514053, 8.971244495140528, 9.021244495140529, 9.071244495140528, 9.121244495140528, 9.17124449514053, 9.221244495140528, 9.271244495140529, 9.321244495140528, 9.371244495140528, 9.42124449514053, 9.471244495140528, 9.521244495140529, 9.571244495140528, 9.621244495140528, 9.67124449514053, 9.721244495140528, 9.771244495140529, 9.821244495140528, 9.871244495140528, 9.92124449514053, 9.971244495140528, 10.021244495140529, 10.071244495140528, 10.121244495140528, 10.17124449514053, 10.221244495140528, 10.271244495140529, 10.321244495140528, 10.371244495140528, 10.42124449514053, 10.471244495140528, 10.521244495140529, 10.571244495140528, 10.621244495140528], "phase": [-0.09921147013144777, -0.08921147013144777, -0.07921147013144776, -0.06921147013144777, -0.059211470131447765, -0.04921147013144776, -0.03921147013144777, -0.02921147013144776, -0.019211470131447764, -0.009211470131447769, 0.0007885298685522402, 0.010788529868552235, 0.02078852986855223, 0.03078852986855224, 0.04078852986855225, 0.05078852986855223, 0.06078852986855224, 0.07078852986855225, 0.08078852986855223, 0.09078852986855224, 0.10078852986855225, 0.11078852986855223, 0.12078852986855224, 0.13078852986855224, 0.14078852986855223, 0.15078852986855223, 0.16078852986855224, 0.17078852986855225, 0.18078852986855226, 0.19078852986855221, 0.20078852986855222, 0.21078852986855223, 0.22078852986855224, 0.23078852986855225, 0.24078852986855226, 0.25078852986855227, 0.2607885298685522, 0.27078852986855223, 0.28078852986855224, 0.29078852986855225, 0.30078852986855226, 0.31078852986855227, 0.3207885298685522, 0.33078852986855223, 0.34078852986855224, 0.35078852986855225, 0.36078852986855225, 0.37078852986855226, 0.3807885298685522, 0.3907885298685522, 0.40078852986855223, 0.41078852986855224, 0.42078852986855225, 0.43078852986855226, 0.44078852986855227, 0.4507885298685523]}, {"amplitude": [7.963386909199245, 8.013386909199244, 8.063386909199243, 8.113386909199244, 8.163386909199243, 8.213386909199244, 8.263386909199244, 8.313386909199243, 8.363386909199244, 8.413386909199243, 8.463386909199244, 8.513386909199244, 8.563386909199243, 8.613386909199244, 8.663386909199243, 8.713386909199244, 8.763386909199244, 8.813386909199243, 8.863386909199244, 8.913386909199243, 8.963386909199244, 9.013386909199244, 9.063386909199243, 9.113386909199244, 9.163386909199243, 9.213386909199244, 9.263386909199244, 9.313386909199243, 9.363386909199244, 9.413386909199243, 9.463386909199244, 9.513386909199244, 9.563386909199243, 9.613386909199244, 9.663386909199243, 9.713386909199244, 9.763386909199244, 9.813386909199243, 9.863386909199244, 9.913386909199243, 9.963386909199244, 10.013386909199244, 10.063386909199243, 10.113386909199244, 10.163386909199243, 10.213386909199244, 10.263386909199244, 10.313386909199243, 10.363386909199244, 10.413386909199243, 10.463386909199244, 10.513386909199244, 10.563386909199243, 10.613386909199244, 10.663386909199243, 10.713386909199244], "phase": [-0.09995065603657316, -0.08995065603657316, -0.07995065603657316, -0.06995065603657316, -0.05995065603657316, -0.04995065603657316, -0.03995065603657316, -0.029950656036573153, -0.01995065603657316, -0.009950656036573163, 4.934396342684555e-05, 0.01004934396342684, 0.020049343963426836, 0.030049343963426844, 0.04004934396342685, 0.050049343963426834, 0.06004934396342684, 0.07004934396342685, 0.08004934396342683, 0.09004934396342684, 0.10004934396342685, 0.11004934396342683, 0.12004934396342684, 0.13004934396342685, 0.14004934396342683, 0.15004934396342684, 0.16004934396342685, 0.17004934396342686, 0.18004934396342687, 0.19004934396342682, 0.20004934396342683, 0.21004934396342684, 0.22004934396342685, 0.23004934396342686, 0.24004934396342686, 0.2500493439634269, 0.2600493439634268, 0.27004934396342684, 0.28004934396342684, 0.29004934396342685, 0.30004934396342686, 0.31004934396342687, 0.3200493439634268, 0.33004934396342683, 0.34004934396342684, 0.35004934396342685, 0.36004934396342686, 0.37004934396342687, 0.3800493439634268, 0.39004934396342683, 0.40004934396342684, 0.41004934396342685, 0.42004934396342686, 0.43004934396342687, 0.4400493439634269, 0.4500493439634269]}, {"amplitude": [8.07855350929291, 8.12855350929291, 8.17855350929291, 8.22855350929291, 8.278553509292909, 8.32855350929291, 8.37855350929291, 8.42855350929291, 8.47855350929291, 8.528553509292909, 8.57855350929291, 8.62855350929291, 8.67855350929291, 8.72855350929291, 8.778553509292909, 8.82855350929291, 8.87855350929291, 8.92855350929291, 8.97855350929291, 9.028553509292909, 9.07855350929291, 9.12855350929291, 9.17855350929291, 9.22855350929291, 9.278553509292909, 9.32855350929291, 9.37855350929291, 9.42855350929291, 9.47855350929291, 9.528553509292909, 9.57855350929291, 9.62855350929291, 9.67855350929291, 9.72855350929291, 9.778553509292909, 9.82855350929291, 9.87855350929291, 9.92855350929291, 9.97855350929291, 10.028553509292909, 10.07855350929291, 10.12855350929291, 10.17855350929291, 10.22855350929291, 10.278553509292909, 10.32855350929291, 10.37855350929291, 10.42855350929291, 10.47855350929291, 10.528553509292909, 10.57855350929291, 10.62855350929291, 10.67855350929291, 10.72855350929291, 10.778553509292909, 10.82855350929291], "phase": [-0.09980267284282718, -0.08980267284282718, -0.07980267284282717, -0.06980267284282718, -0.05980267284282718, -0.049802672842827175, -0.03980267284282718, -0.02980267284282717, -0.019802672842827176, -0.009802672842827181, 0.00019732715717282745, 0.010197327157172822, 0.020197327157172817, 0.030197327157172826, 0.040197327157172835, 0.050197327157172816, 0.060197327157172825, 0.07019732715717283, 0.08019732715717282, 0.09019732715717282, 0.10019732715717283, 0.11019732715717281, 0.12019732715717282, 0.13019732715717283, 0.1401973271571728, 0.15019732715717282, 0.16019732715717283, 0.17019732715717284, 0.18019732715717285, 0.1901973271571728, 0.2001973271571728, 0.21019732715717282, 0.22019732715717283, 0.23019732715717284, 0.24019732715717285, 0.25019732715717286, 0.2601973271571728, 0.2701973271571728, 0.2801973271571728, 0.29019732715717284, 0.30019732715717284, 0.31019732715717285, 0.3201973271571728, 0.3301973271571728, 0.3401973271571728, 0.35019732715717283, 0.36019732715717284, 0.37019732715717285, 0.3801973271571728, 0.3901973271571728, 0.4001973271571728, 0.41019732715717283, 0.42019732715717284, 0.43019732715717285, 0.44019732715717286, 0.45019732715717287]}, {"amplitude": [8.200958894497465, 8.250958894497465, 8.300958894497464, 8.350958894497465, 8.400958894497464, 8.450958894497465, 8.500958894497465, 8.550958894497464, 8.600958894497465, 8.650958894497464, 8.700958894497465, 8.750958894497465, 8.800958894497464, 8.850958894497465, 8.900958894497464, 8.950958894497465, 9.000958894497465, 9.050958894497464, 9.100958894497465, 9.150958894497464, 9.200958894497465, 9.250958894497465, 9.300958894497464, 9.350958894497465, 9.400958894497464, 9.450958894497465, 9.500958894497465, 9.550958894497464, 9.600958894497465, 9.650958894497464, 9.700958894497465, 9.750958894497465, 9.800958894497464, 9.850958894497465, 9.900958894497464, 9.950958894497465, 10.000958894497465, 10.050958894497464, 10.100958894497465, 10.150958894497464, 10.200958894497465, 10.250958894497465, 10.300958894497464, 10.350958894497465, 10.400958894497464, 10.450958894497465, 10.500958894497465, 10.550958894497464, 10.600958894497465, 10.650958894497464, 10.700958894497465, 10.750958894497465, 10.800958894497464, 10.850958894497465, 10.900958894497464, 10.950958894497465], "phase": [-0.09876883405951381, -0.08876883405951382, -0.0787688340595138, -0.06876883405951381, -0.05876883405951381, -0.04876883405951381, -0.03876883405951381, -0.028768834059513804, -0.01876883405951381, -0.008768834059513814, 0.0012311659404861952, 0.01123116594048619, 0.021231165940486185, 0.031231165940486194, 0.0412311659404862, 0.051231165940486184, 0.06123116594048619, 0.0712311659404862, 0.08123116594048618, 0.09123116594048619, 0.1012311659404862, 0.11123116594048618, 0.12123116594048619, 0.1312311659404862, 0.14123116594048618, 0.1512311659404862, 0.1612311659404862, 0.1712311659404862, 0.18123116594048622, 0.19123116594048617, 0.20123116594048618, 0.2112311659404862, 0.2212311659404862, 0.2312311659404862, 0.24123116594048621, 0.2512311659404862, 0.2612311659404862, 0.2712311659404862, 0.2812311659404862, 0.2912311659404862, 0.3012311659404862, 0.3112311659404862, 0.3212311659404862, 0.3312311659404862, 0.3412311659404862, 0.3512311659404862, 0.3612311659404862, 0.3712311659404862, 0.38123116594048617, 0.3912311659404862, 0.4012311659404862, 0.4112311659404862, 0.4212311659404862, 0.4312311659404862, 0.4412311659404862, 0.45123116594048623]}, {"amplitude": [8.316132055393343, 8.366132055393344, 8.416132055393343, 8.466132055393343, 8.516132055393342, 8.566132055393343, 8.616132055393344, 8.666132055393343, 8.716132055393343, 8.766132055393342, 8.816132055393343, 8.866132055393344, 8.916132055393343, 8.966132055393343, 9.016132055393342, 9.066132055393343, 9.116132055393344, 9.166132055393343, 9.216132055393343, 9.266132055393342, 9.316132055393343, 9.366132055393344, 9.416132055393343, 9.466132055393343, 9.516132055393342, 9.566132055393343, 9.616132055393344, 9.666132055393343, 9.716132055393343, 9.766132055393342, 9.816132055393343, 9.866132055393344, 9.916132055393343, 9.966132055393343, 10.016132055393342, 10.066132055393343, 10.116132055393344, 10.166132055393343, 10.216132055393343, 10.266132055393342, 10.316132055393343, 10.366132055393344, 10.416132055393343, 10.466132055393343, 10.516132055393342, 10.566132055393343, 10.616132055393344, 10.666132055393343, 10.716132055393343, 10.766132055393342, 10.816132055393343, 10.866132055393344, 10.916132055393343, 10.966132055393343, 11.016132055393342, 11.066132055393343], "phase": [-0.09685831611286312, -0.08685831611286313, -0.07685831611286312, -0.06685831611286312, -0.05685831611286312, -0.04685831611286312, -0.036858316112863124, -0.026858316112863115, -0.01685831611286312, -0.006858316112863125, 0.003141683887136884, 0.013141683887136879, 0.023141683887136874, 0.03314168388713688, 0.04314168388713689, 0.05314168388713687, 0.06314168388713688, 0.07314168388713689, 0.08314168388713687, 0.09314168388713688, 0.10314168388713689, 0.11314168388713687, 0.12314168388713688, 0.13314168388713687, 0.14314168388713688, 0.1531416838871369, 0.1631416838871369, 0.1731416838871369, 0.18314168388713692, 0.19314168388713687, 0.20314168388713688, 0.2131416838871369, 0.2231416838871369, 0.2331416838871369, 0.24314168388713692, 0.2531416838871369, 0.2631416838871369, 0.2731416838871369, 0.2831416838871369, 0.2931416838871369, 0.3031416838871369, 0.3131416838871369, 0.3231416838871369, 0.3331416838871369, 0.3431416838871369, 0.3531416838871369, 0.3631416838871369, 0.3731416838871369, 0.3831416838871369, 0.3931416838871369, 0.4031416838871369, 0.4131416838871369, 0.4231416838871369, 0.4331416838871369, 0.44314168388713693, 0.45314168388713694]}, {"amplitude": [8.412924637310153, 8.462924637310154, 8.512924637310153, 8.562924637310154, 8.612924637310153, 8.662924637310153, 8.712924637310154, 8.762924637310153, 8.812924637310154, 8.862924637310153, 8.912924637310153, 8.962924637310154, 9.012924637310153, 9.062924637310154, 9.112924637310153, 9.162924637310153, 9.212924637310154, 9.262924637310153, 9.312924637310154, 9.362924637310153, 9.412924637310153, 9.462924637310154, 9.512924637310153, 9.562924637310154, 9.612924637310153, 9.662924637310153, 9.712924637310154, 9.762924637310153, 9.812924637310154, 9.862924637310153, 9.912924637310153, 9.962924637310154, 10.012924637310153, 10.062924637310154, 10.112924637310153, 10.162924637310153, 10.212924637310154, 10.262924637310153, 10.312924637310154, 10.362924637310153, 10.412924637310153, 10.462924637310154, 10.512924637310153, 10.562924637310154, 10.612924637310153, 10.662924637310153, 10.712924637310154, 10.762924637310153, 10.812924637310154, 10.862924637310153, 10.912924637310153, 10.962924637310154, 11.012924637310153, 11.062924637310154, 11.112924637310153, 11.162924637310153], "phase": [-0.09408807689542265, -0.08408807689542265, -0.07408807689542264, -0.06408807689542265, -0.054088076895422645, -0.04408807689542264, -0.03408807689542265, -0.02408807689542264, -0.014088076895422644, -0.004088076895422649, 0.00591192310457736, 0.015911923104577355, 0.02591192310457735, 0.03591192310457736, 0.04591192310457737, 0.05591192310457735, 0.06591192310457736, 0.07591192310457737, 0.08591192310457735, 0.09591192310457736, 0.10591192310457737, 0.11591192310457735, 0.12591192310457736, 0.13591192310457736, 0.14591192310457735, 0.15591192310457735, 0.16591192310457736, 0.17591192310457737, 0.18591192310457738, 0.19591192310457733, 0.20591192310457734, 0.21591192310457735, 0.22591192310457736, 0.23591192310457737, 0.24591192310457738, 0.2559119231045774, 0.26591192310457734, 0.27591192310457735, 0.28591192310457736, 0.29591192310457737, 0.3059119231045774, 0.3159119231045774, 0.32591192310457734, 0.33591192310457735, 0.34591192310457736, 0.35591192310457737, 0.3659119231045774, 0.3759119231045774, 0.38591192310457734, 0.39591192310457735, 0.40591192310457735, 0.41591192310457736, 0.4259119231045774, 0.4359119231045774, 0.4459119231045774, 0.4559119231045774]}, {"amplitude": [8.485032070286566, 8.535032070286567, 8.585032070286566, 8.635032070286567, 8.685032070286566, 8.735032070286566, 8.785032070286567, 8.835032070286566, 8.885032070286567, 8.935032070286566, 8.985032070286566, 9.035032070286567, 9.085032070286566, 9.135032070286567, 9.185032070286566, 9.235032070286566, 9.285032070286567, 9.335032070286566, 9.385032070286567, 9.435032070286566, 9.485032070286566, 9.535032070286567, 9.585032070286566, 9.635032070286567, 9.685032070286566, 9.735032070286566, 9.785032070286567, 9.835032070286566, 9.885032070286567, 9.935032070286566, 9.985032070286566, 10.035032070286567, 10.085032070286566, 10.135032070286567, 10.185032070286566, 10.235032070286566, 10.285032070286567, 10.335032070286566, 10.385032070286567, 10.435032070286566, 10.485032070286566, 10.535032070286567, 10.585032070286566, 10.635032070286567, 10.685032070286566, 10.735032070286566, 10.785032070286567, 10.835032070286566, 10.885032070286567, 10.935032070286566, 10.985032070286566, 11.035032070286567, 11.085032070286566, 11.135032070286567, 11.185032070286566, 11.235032070286566], "phase": [-0.09048270524660201, -0.08048270524660202, -0.07048270524660201, -0.060482705246602014, -0.05048270524660201, -0.04048270524660201, -0.030482705246602015, -0.020482705246602007, -0.010482705246602012, -0.0004827052466020165, 0.009517294753397992, 0.019517294753397987, 0.029517294753397982, 0.03951729475339799, 0.049517294753398, 0.05951729475339798, 0.06951729475339799, 0.079517294753398, 0.08951729475339798, 0.09951729475339799, 0.109517294753398, 0.11951729475339798, 0.129517294753398, 0.139517294753398, 0.14951729475339798, 0.159517294753398, 0.169517294753398, 0.179517294753398, 0.189517294753398, 0.19951729475339797, 0.20951729475339798, 0.21951729475339798, 0.229517294753398, 0.239517294753398, 0.249517294753398, 0.259517294753398, 0.269517294753398, 0.279517294753398, 0.289517294753398, 0.299517294753398, 0.309517294753398, 0.319517294753398, 0.32951729475339797, 0.339517294753398, 0.349517294753398, 0.359517294753398, 0.369517294753398, 0.379517294753398, 0.38951729475339797, 0.399517294753398, 0.409517294753398, 0.419517294753398, 0.429517294753398, 0.439517294753398, 0.449517294753398, 0.45951729475339803]}, {"amplitude": [8.531814323642715, 8.581814323642716, 8.631814323642715, 8.681814323642715, 8.731814323642714, 8.781814323642715, 8.831814323642716, 8.881814323642715, 8.931814323642715, 8.981814323642714, 9.031814323642715, 9.081814323642716, 9.131814323642715, 9.181814323642715, 9.231814323642714, 9.281814323642715, 9.331814323642716, 9.381814323642715, 9.431814323642715, 9.481814323642714, 9.531814323642715, 9.581814323642716, 9.631814323642715, 9.681814323642715, 9.731814323642714, 9.781814323642715, 9.831814323642716, 9.881814323642715, 9.931814323642715, 9.981814323642714, 10.031814323642715, 10.081814323642716, 10.131814323642715, 10.181814323642715, 10.231814323642714, 10.281814323642715, 10.331814323642716, 10.381814323642715, 10.431814323642715, 10.481814323642714, 10.531814323642715, 10.581814323642716, 10.631814323642715, 10.681814323642715, 10.731814323642714, 10.781814323642715, 10.831814323642716, 10.881814323642715, 10.931814323642715, 10.981814323642714, 11.031814323642715, 11.081814323642716, 11.131814323642715, 11.181814323642715, 11.231814323642714, 11.281814323642715], "phase": [-0.08607420270039456, -0.07607420270039457, -0.06607420270039456, -0.056074202700394565, -0.04607420270039456, -0.03607420270039456, -0.026074202700394566, -0.016074202700394558, -0.0060742027003945626, 0.0039257972996054324, 0.013925797299605441, 0.023925797299605436, 0.03392579729960543, 0.04392579729960544, 0.05392579729960545, 0.06392579729960543, 0.07392579729960544, 0.08392579729960545, 0.09392579729960543, 0.10392579729960544, 0.11392579729960545, 0.12392579729960543, 0.13392579729960544, 0.14392579729960545, 0.15392579729960543, 0.16392579729960544, 0.17392579729960544, 0.18392579729960545, 0.19392579729960546, 0.20392579729960542, 0.21392579729960542, 0.22392579729960543, 0.23392579729960544, 0.24392579729960545, 0.25392579729960546, 0.26392579729960547, 0.2739257972996054, 0.28392579729960543, 0.29392579729960544, 0.30392579729960545, 0.31392579729960546, 0.32392579729960547, 0.3339257972996054, 0.34392579729960543, 0.35392579729960544, 0.36392579729960545, 0.37392579729960546, 0.38392579729960546, 0.3939257972996054, 0.4039257972996054, 0.41392579729960544, 0.42392579729960544, 0.43392579729960545, 0.44392579729960546, 0.45392579729960547, 0.4639257972996055]}, {"amplitude": [8.558301586937848, 8.608301586937849, 8.658301586937847, 8.708301586937848, 8.758301586937847, 8.808301586937848, 8.858301586937849, 8.908301586937847, 8.958301586937848, 9.008301586937847, 9.058301586937848, 9.108301586937849, 9.158301586937847, 9.208301586937848, 9.258301586937847, 9.308301586937848, 9.358301586937849, 9.408301586937847, 9.458301586937848, 9.508301586937847, 9.558301586937848, 9.608301586937849, 9.658301586937847, 9.708301586937848, 9.758301586937847, 9.808301586937848, 9.858301586937849, 9.908301586937847, 9.958301586937848, 10.008301586937847, 10.058301586937848, 10.108301586937849, 10.158301586937847, 10.208301586937848, 10.258301586937847, 10.308301586937848, 10.358301586937849, 10.408301586937847, 10.458301586937848, 10.508301586937847, 10.558301586937848, 10.608301586937849, 10.658301586937847, 10.708301586937848, 10.758301586937847, 10.808301586937848, 10.858301586937849, 10.908301586937847, 10.958301586937848, 11.008301586937847, 11.058301586937848, 11.108301586937849, 11.158301586937847, 11.208301586937848, 11.258301586937847, 11.308301586937848], "phase": [-0.08090169943749469, -0.07090169943749469, -0.06090169943749468, -0.05090169943749469, -0.040901699437494686, -0.030901699437494684, -0.02090169943749469, -0.01090169943749468, -0.0009016994374946852, 0.00909830056250531, 0.01909830056250532, 0.029098300562505314, 0.03909830056250531, 0.04909830056250532, 0.059098300562505326, 0.06909830056250531, 0.07909830056250532, 0.08909830056250533, 0.0990983005625053, 0.10909830056250532, 0.11909830056250532, 0.12909830056250532, 0.13909830056250533, 0.14909830056250534, 0.1590983005625053, 0.1690983005625053, 0.1790983005625053, 0.18909830056250532, 0.19909830056250533, 0.20909830056250528, 0.2190983005625053, 0.2290983005625053, 0.2390983005625053, 0.24909830056250531, 0.2590983005625053, 0.26909830056250533, 0.2790983005625053, 0.2890983005625053, 0.2990983005625053, 0.3090983005625053, 0.3190983005625053, 0.32909830056250533, 0.3390983005625053, 0.3490983005625053, 0.3590983005625053, 0.3690983005625053, 0.3790983005625053, 0.38909830056250533, 0.3990983005625053, 0.4090983005625053, 0.4190983005625053, 0.4290983005625053, 0.4390983005625053, 0.4490983005625053, 0.45909830056250533, 0.46909830056250534]}, {"amplitude": [8.574384826888537, 8.624384826888537, 8.674384826888536, 8.724384826888537, 8.774384826888536, 8.824384826888537, 8.874384826888537, 8.924384826888536, 8.974384826888537, 9.024384826888536, 9.074384826888537, 9.124384826888537, 9.174384826888536, 9.224384826888537, 9.274384826888536, 9.324384826888537, 9.374384826888537, 9.424384826888536, 9.474384826888537, 9.524384826888536, 9.574384826888537, 9.624384826888537, 9.674384826888536, 9.724384826888537, 9.774384826888536, 9.824384826888537, 9.874384826888537, 9.924384826888536, 9.974384826888537, 10.024384826888536, 10.074384826888537, 10.124384826888537, 10.174384826888536, 10.224384826888537, 10.274384826888536, 10.324384826888537, 10.374384826888537, 10.424384826888536, 10.474384826888537, 10.524384826888536, 10.574384826888537, 10.624384826888537, 10.674384826888536, 10.724384826888537, 10.774384826888536, 10.824384826888537, 10.874384826888537, 10.924384826888536, 10.974384826888537, 11.024384826888536, 11.074384826888537, 11.124384826888537, 11.174384826888536, 11.224384826888537, 11.274384826888536, 11.324384826888537], "phase": [-0.0750111069630458, -0.06501110696304581, -0.0550111069630458, -0.045011106963045805, -0.0350111069630458, -0.0250111069630458, -0.015011106963045806, -0.005011106963045797, 0.004988893036954198, 0.014988893036954193, 0.0249888930369542, 0.0349888930369542, 0.04498889303695419, 0.0549888930369542, 0.06498889303695421, 0.07498889303695419, 0.0849888930369542, 0.09498889303695421, 0.10498889303695419, 0.1149888930369542, 0.12498889303695421, 0.1349888930369542, 0.1449888930369542, 0.1549888930369542, 0.1649888930369542, 0.1749888930369542, 0.1849888930369542, 0.19498889303695421, 0.20498889303695422, 0.21498889303695418, 0.22498889303695419, 0.2349888930369542, 0.2449888930369542, 0.2549888930369542, 0.2649888930369542, 0.27498889303695423, 0.2849888930369542, 0.2949888930369542, 0.3049888930369542, 0.3149888930369542, 0.3249888930369542, 0.3349888930369542, 0.3449888930369542, 0.3549888930369542, 0.3649888930369542, 0.3749888930369542, 0.3849888930369542, 0.3949888930369542, 0.4049888930369542, 0.4149888930369542, 0.4249888930369542, 0.4349888930369542, 0.4449888930369542, 0.4549888930369542, 0.46498889303695423, 0.47498889303695424]}, {"amplitude": [8.593305818073333, 8.643305818073333, 8.693305818073332, 8.743305818073333, 8.793305818073332, 8.843305818073333, 8.893305818073333, 8.943305818073332, 8.993305818073333, 9.043305818073332, 9.093305818073333, 9.143305818073333, 9.193305818073332, 9.243305818073333, 9.293305818073332, 9.343305818073333, 9.393305818073333, 9.443305818073332, 9.493305818073333, 9.543305818073332, 9.593305818073333, 9.643305818073333, 9.693305818073332, 9.743305818073333, 9.793305818073332, 9.843305818073333, 9.893305818073333, 9.943305818073332, 9.993305818073333, 10.043305818073332, 10.093305818073333, 10.143305818073333, 10.193305818073332, 10.243305818073333, 10.293305818073332, 10.343305818073333, 10.393305818073333, 10.443305818073332, 10.493305818073333, 10.543305818073332, 10.593305818073333, 10.643305818073333, 10.693305818073332, 10.743305818073333, 10.793305818073332, 10.843305818073333, 10.893305818073333, 10.943305818073332, 10.993305818073333, 11.043305818073332, 11.093305818073333, 11.143305818073333, 11.193305818073332, 11.243305818073333, 11.293305818073332, 11.343305818073333], "phase": [-0.06845471059286887, -0.058454710592868865, -0.04845471059286886, -0.03845471059286887, -0.028454710592868866, -0.018454710592868864, -0.00845471059286887, 0.0015452894071311396, 0.011545289407131135, 0.02154528940713113, 0.03154528940713114, 0.041545289407131133, 0.05154528940713113, 0.06154528940713114, 0.07154528940713115, 0.08154528940713113, 0.09154528940713114, 0.10154528940713115, 0.11154528940713113, 0.12154528940713114, 0.13154528940713114, 0.14154528940713113, 0.15154528940713113, 0.16154528940713114, 0.17154528940713112, 0.18154528940713113, 0.19154528940713114, 0.20154528940713115, 0.21154528940713116, 0.2215452894071311, 0.23154528940713112, 0.24154528940713113, 0.25154528940713117, 0.2615452894071312, 0.2715452894071312, 0.2815452894071312, 0.2915452894071311, 0.3015452894071311, 0.3115452894071311, 0.3215452894071311, 0.3315452894071311, 0.34154528940713114, 0.35154528940713115, 0.36154528940713115, 0.37154528940713116, 0.38154528940713117, 0.3915452894071312, 0.4015452894071312, 0.4115452894071311, 0.4215452894071311, 0.4315452894071311, 0.4415452894071311, 0.4515452894071311, 0.46154528940713113, 0.47154528940713114, 0.48154528940713115]}, {"amplitude": [8.629659790463533, 8.679659790463534, 8.729659790463533, 8.779659790463533, 8.829659790463532, 8.879659790463533, 8.929659790463534, 8.979659790463533, 9.029659790463533, 9.079659790463532, 9.129659790463533, 9.179659790463534, 9.229659790463533, 9.279659790463533, 9.329659790463532, 9.379659790463533, 9.429659790463534, 9.479659790463533, 9.529659790463533, 9.579659790463532, 9.629659790463533, 9.679659790463534, 9.729659790463533, 9.779659790463533, 9.829659790463532, 9.879659790463533, 9.929659790463534, 9.979659790463533, 10.029659790463533, 10.079659790463532, 10.129659790463533, 10.179659790463534, 10.229659790463533, 10.279659790463533, 10.329659790463532, 10.379659790463533, 10.429659790463534, 10.479659790463533, 10.529659790463533, 10.579659790463532, 10.629659790463533, 10.679659790463534, 10.729659790463533, 10.779659790463533, 10.829659790463532, 10.879659790463533, 10.929659790463534, 10.979659790463533, 11.029659790463533, 11.079659790463532, 11.129659790463533, 11.179659790463534, 11.229659790463533, 11.279659790463533, 11.329659790463532, 11.379659790463533], "phase": [-0.06129070536529755, -0.05129070536529755, -0.04129070536529755, -0.03129070536529755, -0.02129070536529755, -0.011290705365297547, -0.0012907053652975523, 0.008709294634702457, 0.01870929463470245, 0.028709294634702447, 0.038709294634702456, 0.04870929463470245, 0.058709294634702446, 0.06870929463470246, 0.07870929463470247, 0.08870929463470245, 0.09870929463470246, 0.10870929463470247, 0.11870929463470245, 0.12870929463470246, 0.13870929463470247, 0.14870929463470245, 0.15870929463470246, 0.16870929463470247, 0.17870929463470245, 0.18870929463470246, 0.19870929463470247, 0.20870929463470247, 0.21870929463470248, 0.22870929463470244, 0.23870929463470245, 0.24870929463470245, 0.25870929463470244, 0.26870929463470244, 0.27870929463470245, 0.28870929463470246, 0.2987092946347024, 0.3087092946347024, 0.31870929463470243, 0.32870929463470244, 0.33870929463470245, 0.34870929463470246, 0.3587092946347024, 0.3687092946347024, 0.37870929463470243, 0.38870929463470244, 0.39870929463470245, 0.40870929463470246, 0.4187092946347024, 0.4287092946347024, 0.43870929463470243, 0.44870929463470244, 0.45870929463470245, 0.46870929463470246, 0.47870929463470246, 0.4887092946347025]}, {"amplitude": [8.697192437209269, 8.74719243720927, 8.797192437209269, 8.84719243720927, 8.897192437209268, 8.947192437209269, 8.99719243720927, 9.047192437209269, 9.09719243720927, 9.147192437209268, 9.197192437209269, 9.24719243720927, 9.297192437209269, 9.34719243720927, 9.397192437209268, 9.447192437209269, 9.49719243720927, 9.547192437209269, 9.59719243720927, 9.647192437209268, 9.697192437209269, 9.74719243720927, 9.797192437209269, 9.84719243720927, 9.897192437209268, 9.947192437209269, 9.99719243720927, 10.047192437209269, 10.09719243720927, 10.147192437209268, 10.197192437209269, 10.24719243720927, 10.297192437209269, 10.34719243720927, 10.397192437209268, 10.447192437209269, 10.49719243720927, 10.547192437209269, 10.59719243720927, 10.647192437209268, 10.697192437209269, 10.74719243720927, 10.797192437209269, 10.84719243720927, 10.897192437209268, 10.947192437209269, 10.99719243720927, 11.047192437209269, 11.09719243720927, 11.147192437209268, 11.197192437209269, 11.24719243720927, 11.297192437209269, 11.34719243720927, 11.397192437209268, 11.447192437209269], "phase": [-0.05358267949789976, -0.043582679497899755, -0.03358267949789975, -0.02358267949789976, -0.013582679497899756, -0.0035826794978997545, 0.0064173205021002405, 0.01641732050210025, 0.026417320502100244, 0.03641732050210024, 0.04641732050210025, 0.05641732050210024, 0.06641732050210024, 0.07641732050210025, 0.08641732050210026, 0.09641732050210024, 0.10641732050210025, 0.11641732050210025, 0.12641732050210025, 0.13641732050210026, 0.14641732050210027, 0.15641732050210022, 0.16641732050210023, 0.17641732050210024, 0.18641732050210025, 0.19641732050210026, 0.20641732050210027, 0.21641732050210027, 0.22641732050210028, 0.23641732050210024, 0.24641732050210025, 0.25641732050210025, 0.26641732050210026, 0.27641732050210027, 0.2864173205021003, 0.2964173205021003, 0.30641732050210024, 0.31641732050210025, 0.32641732050210026, 0.33641732050210027, 0.3464173205021003, 0.3564173205021003, 0.36641732050210024, 0.37641732050210025, 0.38641732050210026, 0.39641732050210027, 0.4064173205021003, 0.4164173205021003, 0.42641732050210024, 0.43641732050210025, 0.44641732050210026, 0.45641732050210027, 0.4664173205021003, 0.4764173205021003, 0.4864173205021003, 0.4964173205021003]}, {"amplitude": [8.80670204563236, 8.85670204563236, 8.90670204563236, 8.95670204563236, 9.006702045632359, 9.05670204563236, 9.10670204563236, 9.15670204563236, 9.20670204563236, 9.256702045632359, 9.30670204563236, 9.35670204563236, 9.40670204563236, 9.45670204563236, 9.506702045632359, 9.55670204563236, 9.60670204563236, 9.65670204563236, 9.70670204563236, 9.756702045632359, 9.80670204563236, 9.85670204563236, 9.90670204563236, 9.95670204563236, 10.006702045632359, 10.05670204563236, 10.10670204563236, 10.15670204563236, 10.20670204563236, 10.256702045632359, 10.30670204563236, 10.35670204563236, 10.40670204563236, 10.45670204563236, 10.506702045632359, 10.55670204563236, 10.60670204563236, 10.65670204563236, 10.70670204563236, 10.756702045632359, 10.80670204563236, 10.85670204563236, 10.90670204563236, 10.95670204563236, 11.006702045632359, 11.05670204563236, 11.10670204563236, 11.15670204563236, 11.20670204563236, 11.256702045632359, 11.30670204563236, 11.35670204563236, 11.40670204563236, 11.45670204563236, 11.506702045632359, 11.55670204563236], "phase": [-0.045399049973954664, -0.03539904997395466, -0.025399049973954663, -0.015399049973954665, -0.005399049973954663, 0.004600950026045339, 0.014600950026045334, 0.024600950026045343, 0.03460095002604534, 0.04460095002604533, 0.05460095002604534, 0.06460095002604534, 0.07460095002604533, 0.08460095002604534, 0.09460095002604535, 0.10460095002604533, 0.11460095002604534, 0.12460095002604535, 0.13460095002604533, 0.14460095002604534, 0.15460095002604535, 0.16460095002604533, 0.17460095002604534, 0.18460095002604535, 0.19460095002604533, 0.20460095002604534, 0.21460095002604535, 0.22460095002604535, 0.23460095002604536, 0.24460095002604532, 0.2546009500260453, 0.26460095002604533, 0.27460095002604534, 0.28460095002604535, 0.29460095002604536, 0.30460095002604537, 0.3146009500260453, 0.32460095002604533, 0.33460095002604534, 0.34460095002604535, 0.35460095002604536, 0.36460095002604537, 0.3746009500260453, 0.38460095002604533, 0.39460095002604534, 0.40460095002604535, 0.41460095002604536, 0.42460095002604537, 0.4346009500260453, 0.4446009500260453, 0.45460095002604534, 0.46460095002604535, 0.47460095002604535, 0.48460095002604536, 0.49460095002604537, 0.5046009500260453]}, {"amplitude": [8.964342876102165, 9.014342876102166, 9.064342876102165, 9.114342876102166, 9.164342876102165, 9.214342876102165, 9.264342876102166, 9.314342876102165, 9.364342876102166, 9.414342876102165, 9.464342876102165, 9.514342876102166, 9.564342876102165, 9.614342876102166, 9.664342876102165, 9.714342876102165, 9.764342876102166, 9.814342876102165, 9.864342876102166, 9.914342876102165, 9.964342876102165, 10.014342876102166, 10.064342876102165, 10.114342876102166, 10.164342876102165, 10.214342876102165, 10.264342876102166, 10.314342876102165, 10.364342876102166, 10.414342876102165, 10.464342876102165, 10.514342876102166, 10.564342876102165, 10.614342876102166, 10.664342876102165, 10.714342876102165, 10.764342876102166, 10.814342876102165, 10.864342876102166, 10.914342876102165, 10.964342876102165, 11.014342876102166, 11.064342876102165, 11.114342876102166, 11.164342876102165, 11.214342876102165, 11.264342876102166, 11.314342876102165, 11.364342876102166, 11.414342876102165, 11.464342876102165, 11.514342876102166, 11.564342876102165, 11.614342876102166, 11.664342876102165, 11.714342876102165], "phase": [-0.036812455268467666, -0.026812455268467664, -0.016812455268467665, -0.006812455268467667, 0.003187544731532335, 0.013187544731532337, 0.023187544731532332, 0.03318754473153234, 0.043187544731532336, 0.05318754473153233, 0.06318754473153235, 0.07318754473153233, 0.08318754473153234, 0.09318754473153235, 0.10318754473153235, 0.11318754473153234, 0.12318754473153234, 0.13318754473153235, 0.14318754473153233, 0.15318754473153234, 0.16318754473153235, 0.17318754473153233, 0.18318754473153234, 0.19318754473153235, 0.20318754473153233, 0.21318754473153234, 0.22318754473153235, 0.23318754473153236, 0.24318754473153237, 0.2531875447315323, 0.26318754473153233, 0.27318754473153234, 0.28318754473153235, 0.29318754473153236, 0.30318754473153237, 0.3131875447315324, 0.32318754473153233, 0.33318754473153234, 0.34318754473153235, 0.35318754473153235, 0.36318754473153236, 0.3731875447315324, 0.3831875447315323, 0.39318754473153233, 0.40318754473153234, 0.41318754473153235, 0.42318754473153236, 0.43318754473153237, 0.4431875447315323, 0.45318754473153233, 0.46318754473153234, 0.47318754473153235, 0.48318754473153236, 0.49318754473153237, 0.5031875447315324, 0.5131875447315324]}, {"amplitude": [9.170569672181733, 9.220569672181734, 9.270569672181733, 9.320569672181733, 9.370569672181732, 9.420569672181733, 9.470569672181734, 9.520569672181733, 9.570569672181733, 9.620569672181732, 9.670569672181733, 9.720569672181734, 9.770569672181733, 9.820569672181733, 9.870569672181732, 9.920569672181733, 9.970569672181734, 10.020569672181733, 10.070569672181733, 10.120569672181732, 10.170569672181733, 10.220569672181734, 10.270569672181733, 10.320569672181733, 10.370569672181732, 10.420569672181733, 10.470569672181734, 10.520569672181733, 10.570569672181733, 10.620569672181732, 10.670569672181733, 10.720569672181734, 10.770569672181733, 10.820569672181733, 10.870569672181732, 10.920569672181733, 10.970569672181734, 11.020569672181733, 11.070569672181733, 11.120569672181732, 11.170569672181733, 11.220569672181734, 11.270569672181733, 11.320569672181733, 11.370569672181732, 11.420569672181733, 11.470569672181734, 11.520569672181733, 11.570569672181733, 11.620569672181732, 11.670569672181733, 11.720569672181734, 11.770569672181733, 11.820569672181733, 11.870569672181732, 11.920569672181733], "phase": [-0.027899110603923014, -0.01789911060392301, -0.007899110603923013, 0.0021008893960769853, 0.012100889396076987, 0.02210088939607699, 0.032100889396076984, 0.04210088939607699, 0.05210088939607699, 0.06210088939607698, 0.07210088939607699, 0.08210088939607699, 0.09210088939607698, 0.10210088939607699, 0.112100889396077, 0.12210088939607698, 0.132100889396077, 0.142100889396077, 0.15210088939607697, 0.16210088939607697, 0.17210088939607698, 0.182100889396077, 0.192100889396077, 0.202100889396077, 0.21210088939607696, 0.22210088939607697, 0.23210088939607698, 0.242100889396077, 0.252100889396077, 0.26210088939607695, 0.27210088939607696, 0.28210088939607697, 0.292100889396077, 0.302100889396077, 0.312100889396077, 0.322100889396077, 0.33210088939607696, 0.34210088939607697, 0.352100889396077, 0.362100889396077, 0.372100889396077, 0.382100889396077, 0.39210088939607696, 0.40210088939607697, 0.412100889396077, 0.422100889396077, 0.432100889396077, 0.442100889396077, 0.45210088939607695, 0.46210088939607696, 0.472100889396077, 0.482100889396077, 0.492100889396077, 0.502100889396077, 0.512100889396077, 0.522100889396077]}, {"amplitude": [9.419873239049945, 9.469873239049946, 9.519873239049945, 9.569873239049945, 9.619873239049944, 9.669873239049945, 9.719873239049946, 9.769873239049945, 9.819873239049945, 9.869873239049944, 9.919873239049945, 9.969873239049946, 10.019873239049945, 10.069873239049945, 10.119873239049944, 10.169873239049945, 10.219873239049946, 10.269873239049945, 10.319873239049945, 10.369873239049944, 10.419873239049945, 10.469873239049946, 10.519873239049945, 10.569873239049945, 10.619873239049944, 10.669873239049945, 10.719873239049946, 10.769873239049945, 10.819873239049945, 10.869873239049944, 10.919873239049945, 10.969873239049946, 11.019873239049945, 11.069873239049945, 11.119873239049944, 11.169873239049945, 11.219873239049946, 11.269873239049945, 11.319873239049945, 11.369873239049944, 11.419873239049945, 11.469873239049946, 11.519873239049945, 11.569873239049945, 11.619873239049944, 11.669873239049945, 11.719873239049946, 11.769873239049945, 11.819873239049945, 11.869873239049944, 11.919873239049945, 11.969873239049946, 12.019873239049945, 12.069873239049945, 12.119873239049944, 12.169873239049945], "phase": [-0.01873813145857243, -0.008738131458572431, 0.0012618685414275688, 0.011261868541427567, 0.02126186854142757, 0.03126186854142757, 0.04126186854142756, 0.05126186854142757, 0.06126186854142757, 0.07126186854142756, 0.08126186854142757, 0.09126186854142757, 0.10126186854142756, 0.11126186854142757, 0.12126186854142758, 0.13126186854142757, 0.14126186854142758, 0.1512618685414276, 0.16126186854142757, 0.17126186854142758, 0.1812618685414276, 0.19126186854142757, 0.20126186854142758, 0.2112618685414276, 0.22126186854142757, 0.23126186854142758, 0.2412618685414276, 0.25126186854142757, 0.2612618685414276, 0.27126186854142753, 0.28126186854142754, 0.29126186854142755, 0.30126186854142756, 0.31126186854142757, 0.3212618685414276, 0.3312618685414276, 0.34126186854142754, 0.35126186854142755, 0.36126186854142756, 0.37126186854142756, 0.3812618685414276, 0.3912618685414276, 0.40126186854142754, 0.41126186854142754, 0.42126186854142755, 0.43126186854142756, 0.44126186854142757, 0.4512618685414276, 0.46126186854142753, 0.47126186854142754, 0.48126186854142755, 0.49126186854142756, 0.5012618685414276, 0.5112618685414276, 0.5212618685414276, 0.5312618685414277]}, {"amplitude": [9.701346007557563, 9.751346007557563, 9.801346007557562, 9.851346007557563, 9.901346007557562, 9.951346007557563, 10.001346007557563, 10.051346007557562, 10.101346007557563, 10.151346007557562, 10.201346007557563, 10.251346007557563, 10.301346007557562, 10.351346007557563, 10.401346007557562, 10.451346007557563, 10.501346007557563, 10.551346007557562, 10.601346007557563, 10.651346007557562, 10.701346007557563, 10.751346007557563, 10.801346007557562, 10.851346007557563, 10.901346007557562, 10.951346007557563, 11.001346007557563, 11.051346007557562, 11.101346007557563, 11.151346007557562, 11.201346007557563, 11.251346007557563, 11.301346007557562, 11.351346007557563, 11.401346007557562, 11.451346007557563, 11.501346007557563, 11.551346007557562, 11.601346007557563, 11.651346007557562, 11.701346007557563, 11.751346007557563, 11.801346007557562, 11.851346007557563, 11.901346007557562, 11.951346007557563, 12.001346007557563, 12.051346007557562, 12.101346007557563, 12.151346007557562, 12.201346007557563, 12.251346007557563, 12.301346007557562, 12.351346007557563, 12.401346007557562, 12.451346007557563], "phase": [-0.00941083133185163, 0.000589168668148371, 0.010589168668148371, 0.020589168668148368, 0.03058916866814837, 0.04058916866814837, 0.05058916866814837, 0.060589168668148376, 0.07058916866814838, 0.08058916866814837, 0.09058916866814838, 0.10058916866814838, 0.11058916866814837, 0.12058916866814838, 0.13058916866814838, 0.14058916866814836, 0.15058916866814837, 0.16058916866814837, 0.17058916866814836, 0.18058916866814836, 0.19058916866814837, 0.20058916866814835, 0.21058916866814836, 0.22058916866814837, 0.23058916866814835, 0.24058916866814836, 0.2505891686681484, 0.2605891686681484, 0.2705891686681484, 0.28058916866814837, 0.2905891686681484, 0.3005891686681484, 0.3105891686681484, 0.3205891686681484, 0.3305891686681484, 0.3405891686681484, 0.3505891686681484, 0.3605891686681484, 0.3705891686681484, 0.3805891686681484, 0.3905891686681484, 0.4005891686681484, 0.4105891686681484, 0.4205891686681484, 0.4305891686681484, 0.4405891686681484, 0.4505891686681484, 0.4605891686681484, 0.47058916866814837, 0.4805891686681484, 0.4905891686681484, 0.5005891686681484, 0.5105891686681484, 0.5205891686681484, 0.5305891686681484, 0.5405891686681484]}, {"amplitude": [9.999999999999998, 10.049999999999999, 10.099999999999998, 10.149999999999999, 10.199999999999998, 10.249999999999998, 10.299999999999999, 10.349999999999998, 10.399999999999999, 10.449999999999998, 10.499999999999998, 10.549999999999999, 10.599999999999998, 10.649999999999999, 10.699999999999998, 10.749999999999998, 10.799999999999999, 10.849999999999998, 10.899999999999999, 10.949999999999998, 10.999999999999998, 11.049999999999999, 11.099999999999998, 11.149999999999999, 11.199999999999998, 11.249999999999998, 11.299999999999999, 11.349999999999998, 11.399999999999999, 11.449999999999998, 11.499999999999998, 11.549999999999999, 11.599999999999998, 11.649999999999999, 11.699999999999998, 11.749999999999998, 11.799999999999999, 11.849999999999998, 11.899999999999999, 11.949999999999998, 11.999999999999998, 12.049999999999999, 12.099999999999998, 12.149999999999999, 12.199999999999998, 12.249999999999998, 12.299999999999999, 12.349999999999998, 12.399999999999999, 12.449999999999998, 12.499999999999998, 12.549999999999999, 12.599999999999998, 12.649999999999999, 12.699999999999998, 12.749999999999998], "phase": [-7.347880794884119e-17, 0.009999999999999927, 0.019999999999999928, 0.029999999999999926, 0.039999999999999925, 0.049999999999999926, 0.05999999999999992, 0.06999999999999994, 0.07999999999999993, 0.08999999999999993, 0.09999999999999994, 0.10999999999999993, 0.11999999999999993, 0.12999999999999992, 0.13999999999999993, 0.1499999999999999, 0.15999999999999992, 0.16999999999999993, 0.1799999999999999, 0.18999999999999992, 0.19999999999999993, 0.2099999999999999, 0.21999999999999992, 0.22999999999999993, 0.2399999999999999, 0.24999999999999992, 0.25999999999999995, 0.26999999999999996, 0.27999999999999997, 0.2899999999999999, 0.29999999999999993, 0.30999999999999994, 0.31999999999999995, 0.32999999999999996, 0.33999999999999997, 0.35, 0.35999999999999993, 0.36999999999999994, 0.37999999999999995, 0.38999999999999996, 0.39999999999999997, 0.41, 0.41999999999999993, 0.42999999999999994, 0.43999999999999995, 0.44999999999999996, 0.45999999999999996, 0.47, 0.4799999999999999, 0.48999999999999994, 0.49999999999999994, 0.5099999999999999, 0.5199999999999999, 0.5299999999999999, 0.5399999999999999, 0.5499999999999999]}, {"amplitude": [10.298653992442434, 10.348653992442435, 10.398653992442433, 10.448653992442434, 10.498653992442433, 10.548653992442434, 10.598653992442435, 10.648653992442433, 10.698653992442434, 10.748653992442433, 10.798653992442434, 10.848653992442435, 10.898653992442433, 10.948653992442434, 10.998653992442433, 11.048653992442434, 11.098653992442435, 11.148653992442433, 11.198653992442434, 11.248653992442433, 11.298653992442434, 11.348653992442435, 11.398653992442433, 11.448653992442434, 11.498653992442433, 11.548653992442434, 11.598653992442435, 11.648653992442433, 11.698653992442434, 11.748653992442433, 11.798653992442434, 11.848653992442435, 11.898653992442433, 11.948653992442434, 11.998653992442433, 12.048653992442434, 12.098653992442435, 12.148653992442433, 12.198653992442434, 12.248653992442433, 12.298653992442434, 12.348653992442435, 12.398653992442433, 12.448653992442434, 12.498653992442433, 12.548653992442434, 12.598653992442435, 12.648653992442433, 12.698653992442434, 12.748653992442433, 12.798653992442434, 12.848653992442435, 12.898653992442433, 12.948653992442434, 12.998653992442433, 13.048653992442434], "phase": [0.009410831331851484, 0.019410831331851484, 0.029410831331851482, 0.039410831331851484, 0.049410831331851486, 0.05941083133185149, 0.06941083133185148, 0.07941083133185149, 0.08941083133185149, 0.09941083133185148, 0.10941083133185149, 0.11941083133185149, 0.12941083133185147, 0.13941083133185148, 0.14941083133185148, 0.15941083133185147, 0.16941083133185147, 0.17941083133185148, 0.18941083133185146, 0.19941083133185147, 0.20941083133185148, 0.21941083133185146, 0.22941083133185147, 0.23941083133185148, 0.24941083133185146, 0.2594108313318515, 0.2694108313318515, 0.2794108313318515, 0.2894108313318515, 0.2994108313318515, 0.3094108313318515, 0.3194108313318515, 0.3294108313318515, 0.3394108313318515, 0.3494108313318515, 0.35941083133185153, 0.3694108313318515, 0.3794108313318515, 0.3894108313318515, 0.3994108313318515, 0.4094108313318515, 0.41941083133185153, 0.4294108313318515, 0.4394108313318515, 0.4494108313318515, 0.4594108313318515, 0.4694108313318515, 0.47941083133185153, 0.4894108313318515, 0.4994108313318515, 0.5094108313318515, 0.5194108313318515, 0.5294108313318515, 0.5394108313318515, 0.5494108313318515, 0.5594108313318515]}, {"amplitude": [10.580126760950051, 10.630126760950052, 10.680126760950051, 10.730126760950052, 10.78012676095005, 10.830126760950051, 10.880126760950052, 10.930126760950051, 10.980126760950052, 11.03012676095005, 11.080126760950051, 11.130126760950052, 11.180126760950051, 11.230126760950052, 11.28012676095005, 11.330126760950051, 11.380126760950052, 11.430126760950051, 11.480126760950052, 11.53012676095005, 11.580126760950051, 11.630126760950052, 11.680126760950051, 11.730126760950052, 11.78012676095005, 11.830126760950051, 11.880126760950052, 11.930126760950051, 11.980126760950052, 12.03012676095005, 12.080126760950051, 12.130126760950052, 12.180126760950051, 12.230126760950052, 12.28012676095005, 12.330126760950051, 12.380126760950052, 12.430126760950051, 12.480126760950052, 12.53012676095005, 12.580126760950051, 12.630126760950052, 12.680126760950051, 12.730126760950052, 12.78012676095005, 12.830126760950051, 12.880126760950052, 12.930126760950051, 12.980126760950052, 13.03012676095005, 13.080126760950051, 13.130126760950052, 13.180126760950051, 13.230126760950052, 13.28012676095005, 13.330126760950051], "phase": [0.018738131458572286, 0.028738131458572284, 0.038738131458572286, 0.04873813145857228, 0.05873813145857229, 0.06873813145857229, 0.07873813145857228, 0.08873813145857229, 0.09873813145857228, 0.10873813145857228, 0.11873813145857229, 0.1287381314585723, 0.13873813145857228, 0.1487381314585723, 0.1587381314585723, 0.16873813145857228, 0.17873813145857229, 0.1887381314585723, 0.19873813145857228, 0.20873813145857228, 0.2187381314585723, 0.22873813145857227, 0.23873813145857228, 0.2487381314585723, 0.2587381314585723, 0.2687381314585723, 0.2787381314585723, 0.2887381314585723, 0.2987381314585723, 0.30873813145857226, 0.31873813145857227, 0.3287381314585723, 0.3387381314585723, 0.3487381314585723, 0.3587381314585723, 0.3687381314585723, 0.37873813145857227, 0.3887381314585723, 0.3987381314585723, 0.4087381314585723, 0.4187381314585723, 0.4287381314585723, 0.43873813145857227, 0.4487381314585723, 0.4587381314585723, 0.4687381314585723, 0.4787381314585723, 0.4887381314585723, 0.49873813145857226, 0.5087381314585723, 0.5187381314585723, 0.5287381314585723, 0.5387381314585723, 0.5487381314585723, 0.5587381314585723, 0.5687381314585723]}, {"amplitude": [10.829430327818262, 10.879430327818262, 10.929430327818261, 10.979430327818262, 11.029430327818261, 11.079430327818262, 11.129430327818262, 11.179430327818261, 11.229430327818262, 11.279430327818261, 11.329430327818262, 11.379430327818262, 11.429430327818261, 11.479430327818262, 11.529430327818261, 11.579430327818262, 11.629430327818262, 11.679430327818261, 11.729430327818262, 11.779430327818261, 11.829430327818262, 11.879430327818262, 11.929430327818261, 11.979430327818262, 12.029430327818261, 12.079430327818262, 12.129430327818262, 12.179430327818261, 12.229430327818262, 12.279430327818261, 12.329430327818262, 12.379430327818262, 12.429430327818261, 12.479430327818262, 12.529430327818261, 12.579430327818262, 12.629430327818262, 12.679430327818261, 12.729430327818262, 12.779430327818261, 12.829430327818262, 12.879430327818262, 12.929430327818261, 12.979430327818262, 13.029430327818261, 13.079430327818262, 13.129430327818262, 13.179430327818261, 13.229430327818262, 13.279430327818261, 13.329430327818262, 13.379430327818262, 13.429430327818261, 13.479430327818262, 13.529430327818261, 13.579430327818262], "phase": [0.027899110603922875, 0.03789911060392288, 0.04789911060392288, 0.057899110603922874, 0.06789911060392287, 0.07789911060392288, 0.08789911060392287, 0.09789911060392288, 0.10789911060392288, 0.11789911060392287, 0.1278991106039229, 0.13789911060392288, 0.14789911060392286, 0.15789911060392287, 0.16789911060392287, 0.17789911060392288, 0.1878991106039229, 0.1978991106039229, 0.20789911060392285, 0.21789911060392286, 0.22789911060392287, 0.23789911060392288, 0.2478991106039229, 0.2578991106039229, 0.26789911060392285, 0.27789911060392286, 0.28789911060392287, 0.2978991106039229, 0.3078991106039229, 0.31789911060392284, 0.32789911060392285, 0.33789911060392286, 0.34789911060392287, 0.3578991106039229, 0.3678991106039229, 0.3778991106039229, 0.38789911060392285, 0.39789911060392286, 0.40789911060392287, 0.4178991106039229, 0.4278991106039229, 0.4378991106039229, 0.44789911060392285, 0.45789911060392285, 0.46789911060392286, 0.47789911060392287, 0.4878991106039229, 0.4978991106039229, 0.5078991106039229, 0.5178991106039229, 0.5278991106039229, 0.5378991106039229, 0.5478991106039229, 0.5578991106039229, 0.567899110603923, 0.577899110603923]}, {"amplitude": [11.035657123897831, 11.085657123897832, 11.135657123897833, 11.185657123897833, 11.23565712389783, 11.285657123897831, 11.335657123897832, 11.385657123897833, 11.435657123897833, 11.48565712389783, 11.535657123897831, 11.585657123897832, 11.635657123897833, 11.685657123897833, 11.73565712389783, 11.785657123897831, 11.835657123897832, 11.885657123897833, 11.935657123897833, 11.98565712389783, 12.035657123897831, 12.085657123897832, 12.135657123897833, 12.185657123897833, 12.23565712389783, 12.285657123897831, 12.335657123897832, 12.385657123897833, 12.435657123897833, 12.48565712389783, 12.535657123897831, 12.585657123897832, 12.635657123897833, 12.685657123897833, 12.73565712389783, 12.785657123897831, 12.835657123897832, 12.885657123897833, 12.935657123897833, 12.98565712389783, 13.035657123897831, 13.085657123897832, 13.135657123897833, 13.185657123897833, 13.23565712389783, 13.285657123897831, 13.335657123897832, 13.385657123897833, 13.435657123897833, 13.48565712389783, 13.535657123897831, 13.585657123897832, 13.635657123897833, 13.685657123897833, 13.73565712389783, 13.785657123897831], "phase": [0.03681245526846753, 0.04681245526846753, 0.056812455268467524, 0.06681245526846752, 0.07681245526846753, 0.08681245526846754, 0.09681245526846752, 0.10681245526846753, 0.11681245526846754, 0.12681245526846752, 0.13681245526846753, 0.14681245526846753, 0.15681245526846752, 0.16681245526846752, 0.17681245526846753, 0.18681245526846751, 0.19681245526846752, 0.20681245526846753, 0.2168124552684675, 0.22681245526846752, 0.23681245526846753, 0.2468124552684675, 0.2568124552684675, 0.26681245526846753, 0.27681245526846754, 0.28681245526846755, 0.29681245526846756, 0.30681245526846757, 0.3168124552684676, 0.3268124552684675, 0.33681245526846754, 0.34681245526846755, 0.35681245526846755, 0.36681245526846756, 0.37681245526846757, 0.3868124552684676, 0.39681245526846753, 0.40681245526846754, 0.41681245526846755, 0.42681245526846756, 0.43681245526846757, 0.4468124552684676, 0.45681245526846753, 0.46681245526846754, 0.47681245526846755, 0.48681245526846756, 0.49681245526846757, 0.5068124552684675, 0.5168124552684675, 0.5268124552684675, 0.5368124552684675, 0.5468124552684676, 0.5568124552684676, 0.5668124552684676, 0.5768124552684676, 0.5868124552684676]}, {"amplitude": [11.193297954367637, 11.243297954367637, 11.293297954367636, 11.343297954367637, 11.393297954367636, 11.443297954367637, 11.493297954367637, 11.543297954367636, 11.593297954367637, 11.643297954367636, 11.693297954367637, 11.743297954367637, 11.793297954367636, 11.843297954367637, 11.893297954367636, 11.943297954367637, 11.993297954367637, 12.043297954367636, 12.093297954367637, 12.143297954367636, 12.193297954367637, 12.243297954367637, 12.293297954367636, 12.343297954367637, 12.393297954367636, 12.443297954367637, 12.493297954367637, 12.543297954367636, 12.593297954367637, 12.643297954367636, 12.693297954367637, 12.743297954367637, 12.793297954367636, 12.843297954367637, 12.893297954367636, 12.943297954367637, 12.993297954367637, 13.043297954367636, 13.093297954367637, 13.143297954367636, 13.193297954367637, 13.243297954367637, 13.293297954367636, 13.343297954367637, 13.393297954367636, 13.443297954367637, 13.493297954367637, 13.543297954367636, 13.593297954367637, 13.643297954367636, 13.693297954367637, 13.743297954367637, 13.793297954367636, 13.843297954367637, 13.893297954367636, 13.943297954367637], "phase": [0.04539904997395453, 0.055399049973954534, 0.06539904997395453, 0.07539904997395452, 0.08539904997395453, 0.09539904997395454, 0.10539904997395452, 0.11539904997395453, 0.12539904997395454, 0.13539904997395452, 0.14539904997395453, 0.15539904997395454, 0.16539904997395452, 0.17539904997395453, 0.18539904997395454, 0.19539904997395452, 0.20539904997395453, 0.21539904997395454, 0.22539904997395452, 0.23539904997395453, 0.24539904997395454, 0.2553990499739545, 0.2653990499739545, 0.27539904997395454, 0.28539904997395454, 0.29539904997395455, 0.30539904997395456, 0.31539904997395457, 0.3253990499739546, 0.33539904997395453, 0.34539904997395454, 0.35539904997395455, 0.36539904997395456, 0.37539904997395457, 0.3853990499739546, 0.3953990499739546, 0.40539904997395454, 0.41539904997395455, 0.42539904997395456, 0.43539904997395457, 0.4453990499739546, 0.4553990499739546, 0.46539904997395454, 0.47539904997395455, 0.48539904997395455, 0.49539904997395456, 0.5053990499739546, 0.5153990499739546, 0.5253990499739545, 0.5353990499739545, 0.5453990499739545, 0.5553990499739545, 0.5653990499739545, 0.5753990499739545, 0.5853990499739545, 0.5953990499739545]}, {"amplitude": [11.302807562790731, 11.352807562790732, 11.40280756279073, 11.452807562790731, 11.50280756279073, 11.552807562790731, 11.602807562790732, 11.65280756279073, 11.702807562790731, 11.75280756279073, 11.802807562790731, 11.852807562790732, 11.90280756279073, 11.952807562790731, 12.00280756279073, 12.052807562790731, 12.102807562790732, 12.15280756279073, 12.202807562790731, 12.25280756279073, 12.302807562790731, 12.352807562790732, 12.40280756279073, 12.452807562790731, 12.50280756279073, 12.552807562790731, 12.602807562790732, 12.65280756279073, 12.702807562790731, 12.75280756279073, 12.802807562790731, 12.852807562790732, 12.90280756279073, 12.952807562790731, 13.00280756279073, 13.052807562790731, 13.102807562790732, 13.15280756279073, 13.202807562790731, 13.25280756279073, 13.302807562790731, 13.352807562790732, 13.40280756279073, 13.452807562790731, 13.50280756279073, 13.552807562790731, 13.602807562790732, 13.65280756279073, 13.702807562790731, 13.75280756279073, 13.802807562790731, 13.852807562790732, 13.90280756279073, 13.952807562790731, 14.00280756279073, 14.052807562790731], "phase": [0.05358267949789963, 0.06358267949789963, 0.07358267949789964, 0.08358267949789963, 0.09358267949789964, 0.10358267949789964, 0.11358267949789963, 0.12358267949789964, 0.13358267949789965, 0.14358267949789963, 0.15358267949789964, 0.16358267949789962, 0.17358267949789963, 0.18358267949789964, 0.19358267949789965, 0.20358267949789963, 0.21358267949789964, 0.22358267949789964, 0.23358267949789963, 0.24358267949789963, 0.25358267949789964, 0.2635826794978996, 0.2735826794978996, 0.2835826794978996, 0.2935826794978996, 0.30358267949789963, 0.31358267949789964, 0.32358267949789965, 0.33358267949789966, 0.3435826794978996, 0.3535826794978996, 0.36358267949789963, 0.37358267949789964, 0.38358267949789965, 0.39358267949789966, 0.40358267949789967, 0.4135826794978996, 0.42358267949789963, 0.43358267949789964, 0.44358267949789965, 0.45358267949789965, 0.46358267949789966, 0.4735826794978996, 0.4835826794978996, 0.49358267949789963, 0.5035826794978997, 0.5135826794978997, 0.5235826794978997, 0.5335826794978996, 0.5435826794978996, 0.5535826794978996, 0.5635826794978996, 0.5735826794978997, 0.5835826794978997, 0.5935826794978997, 0.6035826794978997]}, {"amplitude": [11.370340209536467, 11.420340209536468, 11.470340209536467, 11.520340209536467, 11.570340209536466, 11.620340209536467, 11.670340209536468, 11.720340209536467, 11.770340209536467, 11.820340209536466, 11.870340209536467, 11.920340209536468, 11.970340209536467, 12.020340209536467, 12.070340209536466, 12.120340209536467, 12.170340209536468, 12.220340209536467, 12.270340209536467, 12.320340209536466, 12.370340209536467, 12.420340209536468, 12.470340209536467, 12.520340209536467, 12.570340209536466, 12.620340209536467, 12.670340209536468, 12.720340209536467, 12.770340209536467, 12.820340209536466, 12.870340209536467, 12.920340209536468, 12.970340209536467, 13.020340209536467, 13.070340209536466, 13.120340209536467, 13.170340209536468, 13.220340209536467, 13.270340209536467, 13.320340209536466, 13.370340209536467, 13.420340209536468, 13.470340209536467, 13.520340209536467, 13.570340209536466, 13.620340209536467, 13.670340209536468, 13.720340209536467, 13.770340209536467, 13.820340209536466, 13.870340209536467, 13.920340209536468, 13.970340209536467, 14.020340209536467, 14.070340209536466, 14.120340209536467], "phase": [0.06129070536529744, 0.07129070536529744, 0.08129070536529744, 0.09129070536529743, 0.10129070536529744, 0.11129070536529745, 0.12129070536529743, 0.13129070536529744, 0.14129070536529745, 0.15129070536529743, 0.16129070536529744, 0.17129070536529745, 0.18129070536529743, 0.19129070536529744, 0.20129070536529745, 0.21129070536529743, 0.22129070536529744, 0.23129070536529744, 0.24129070536529743, 0.25129070536529746, 0.26129070536529747, 0.2712907053652974, 0.28129070536529743, 0.29129070536529744, 0.30129070536529745, 0.31129070536529746, 0.32129070536529747, 0.3312907053652975, 0.3412907053652975, 0.35129070536529744, 0.36129070536529745, 0.37129070536529746, 0.38129070536529747, 0.3912907053652975, 0.4012907053652975, 0.4112907053652975, 0.42129070536529745, 0.43129070536529746, 0.44129070536529746, 0.4512907053652975, 0.4612907053652975, 0.4712907053652975, 0.48129070536529744, 0.49129070536529745, 0.5012907053652974, 0.5112907053652974, 0.5212907053652974, 0.5312907053652974, 0.5412907053652974, 0.5512907053652975, 0.5612907053652975, 0.5712907053652975, 0.5812907053652975, 0.5912907053652975, 0.6012907053652975, 0.6112907053652975]}, {"amplitude": [11.406694181926667, 11.456694181926668, 11.506694181926667, 11.556694181926668, 11.606694181926667, 11.656694181926667, 11.706694181926668, 11.756694181926667, 11.806694181926668, 11.856694181926667, 11.906694181926667, 11.956694181926668, 12.006694181926667, 12.056694181926668, 12.106694181926667, 12.156694181926667, 12.206694181926668, 12.256694181926667, 12.306694181926668, 12.356694181926667, 12.406694181926667, 12.456694181926668, 12.506694181926667, 12.556694181926668, 12.606694181926667, 12.656694181926667, 12.706694181926668, 12.756694181926667, 12.806694181926668, 12.856694181926667, 12.906694181926667, 12.956694181926668, 13.006694181926667, 13.056694181926668, 13.106694181926667, 13.156694181926667, 13.206694181926668, 13.256694181926667, 13.306694181926668, 13.356694181926667, 13.406694181926667, 13.456694181926668, 13.506694181926667, 13.556694181926668, 13.606694181926667, 13.656694181926667, 13.706694181926668, 13.756694181926667, 13.806694181926668, 13.856694181926667, 13.906694181926667, 13.956694181926668, 14.006694181926667, 14.056694181926668, 14.106694181926667, 14.156694181926667], "phase": [0.06845471059286877, 0.07845471059286876, 0.08845471059286877, 0.09845471059286877, 0.10845471059286876, 0.11845471059286877, 0.12845471059286878, 0.1384547105928688, 0.14845471059286877, 0.15845471059286875, 0.16845471059286876, 0.17845471059286877, 0.18845471059286878, 0.1984547105928688, 0.2084547105928688, 0.21845471059286875, 0.22845471059286876, 0.23845471059286877, 0.24845471059286878, 0.2584547105928688, 0.2684547105928688, 0.27845471059286875, 0.28845471059286876, 0.29845471059286877, 0.3084547105928688, 0.3184547105928688, 0.3284547105928688, 0.3384547105928688, 0.3484547105928688, 0.35845471059286876, 0.3684547105928688, 0.3784547105928688, 0.3884547105928688, 0.3984547105928688, 0.4084547105928688, 0.4184547105928688, 0.42845471059286877, 0.4384547105928688, 0.4484547105928688, 0.4584547105928688, 0.4684547105928688, 0.4784547105928688, 0.48845471059286877, 0.4984547105928688, 0.5084547105928687, 0.5184547105928687, 0.5284547105928687, 0.5384547105928688, 0.5484547105928688, 0.5584547105928688, 0.5684547105928688, 0.5784547105928688, 0.5884547105928688, 0.5984547105928688, 0.6084547105928688, 0.6184547105928688]}, {"amplitude": [11.425615173111463, 11.475615173111464, 11.525615173111463, 11.575615173111464, 11.625615173111463, 11.675615173111463, 11.725615173111464, 11.775615173111463, 11.825615173111464, 11.875615173111463, 11.925615173111463, 11.975615173111464, 12.025615173111463, 12.075615173111464, 12.125615173111463, 12.175615173111463, 12.225615173111464, 12.275615173111463, 12.325615173111464, 12.375615173111463, 12.425615173111463, 12.475615173111464, 12.525615173111463, 12.575615173111464, 12.625615173111463, 12.675615173111463, 12.725615173111464, 12.775615173111463, 12.825615173111464, 12.875615173111463, 12.925615173111463, 12.975615173111464, 13.025615173111463, 13.075615173111464, 13.125615173111463, 13.175615173111463, 13.225615173111464, 13.275615173111463, 13.325615173111464, 13.375615173111463, 13.425615173111463, 13.475615173111464, 13.525615173111463, 13.575615173111464, 13.625615173111463, 13.675615173111463, 13.725615173111464, 13.775615173111463, 13.825615173111464, 13.875615173111463, 13.925615173111463, 13.975615173111464, 14.025615173111463, 14.075615173111464, 14.125615173111463, 14.175615173111463], "phase": [0.0750111069630457, 0.0850111069630457, 0.09501110696304571, 0.1050111069630457, 0.1150111069630457, 0.1250111069630457, 0.1350111069630457, 0.1450111069630457, 0.1550111069630457, 0.16501110696304572, 0.17501110696304573, 0.1850111069630457, 0.1950111069630457, 0.2050111069630457, 0.2150111069630457, 0.22501110696304572, 0.23501110696304572, 0.24501110696304573, 0.2550111069630457, 0.2650111069630457, 0.2750111069630457, 0.2850111069630457, 0.2950111069630457, 0.30501110696304573, 0.3150111069630457, 0.3250111069630457, 0.3350111069630457, 0.3450111069630457, 0.3550111069630457, 0.3650111069630457, 0.3750111069630457, 0.3850111069630457, 0.3950111069630457, 0.4050111069630457, 0.4150111069630457, 0.4250111069630457, 0.4350111069630457, 0.4450111069630457, 0.4550111069630457, 0.4650111069630457, 0.4750111069630457, 0.4850111069630457, 0.4950111069630457, 0.5050111069630457, 0.5150111069630458, 0.5250111069630458, 0.5350111069630458, 0.5450111069630458, 0.5550111069630457, 0.5650111069630457, 0.5750111069630457, 0.5850111069630457, 0.5950111069630457, 0.6050111069630457, 0.6150111069630457, 0.6250111069630457]}, {"amplitude": [11.441698413062152, 11.491698413062153, 11.541698413062152, 11.591698413062153, 11.641698413062151, 11.691698413062152, 11.741698413062153, 11.791698413062152, 11.841698413062153, 11.891698413062151, 11.941698413062152, 11.991698413062153, 12.041698413062152, 12.091698413062153, 12.141698413062151, 12.191698413062152, 12.241698413062153, 12.291698413062152, 12.341698413062153, 12.391698413062151, 12.441698413062152, 12.491698413062153, 12.541698413062152, 12.591698413062153, 12.641698413062151, 12.691698413062152, 12.741698413062153, 12.791698413062152, 12.841698413062153, 12.891698413062151, 12.941698413062152, 12.991698413062153, 13.041698413062152, 13.091698413062153, 13.141698413062151, 13.191698413062152, 13.241698413062153, 13.291698413062152, 13.341698413062153, 13.391698413062151, 13.441698413062152, 13.491698413062153, 13.541698413062152, 13.591698413062153, 13.641698413062151, 13.691698413062152, 13.741698413062153, 13.791698413062152, 13.841698413062153, 13.891698413062151, 13.941698413062152, 13.991698413062153, 14.041698413062152, 14.091698413062153, 14.141698413062151, 14.191698413062152], "phase": [0.08090169943749459, 0.09090169943749458, 0.1009016994374946, 0.11090169943749459, 0.1209016994374946, 0.13090169943749458, 0.1409016994374946, 0.1509016994374946, 0.1609016994374946, 0.1709016994374946, 0.1809016994374946, 0.19090169943749458, 0.20090169943749459, 0.2109016994374946, 0.2209016994374946, 0.23090169943749458, 0.2409016994374946, 0.25090169943749463, 0.2609016994374946, 0.2709016994374946, 0.2809016994374946, 0.29090169943749455, 0.30090169943749456, 0.31090169943749457, 0.3209016994374946, 0.3309016994374946, 0.3409016994374946, 0.3509016994374946, 0.3609016994374946, 0.37090169943749457, 0.3809016994374946, 0.3909016994374946, 0.4009016994374946, 0.4109016994374946, 0.4209016994374946, 0.4309016994374946, 0.4409016994374946, 0.4509016994374946, 0.4609016994374946, 0.4709016994374946, 0.4809016994374946, 0.4909016994374946, 0.5009016994374946, 0.5109016994374946, 0.5209016994374946, 0.5309016994374947, 0.5409016994374947, 0.5509016994374947, 0.5609016994374946, 0.5709016994374946, 0.5809016994374946, 0.5909016994374946, 0.6009016994374946, 0.6109016994374946, 0.6209016994374946, 0.6309016994374946]}, {"amplitude": [11.468185676357283, 11.518185676357284, 11.568185676357285, 11.618185676357285, 11.668185676357282, 11.718185676357283, 11.768185676357284, 11.818185676357285, 11.868185676357285, 11.918185676357282, 11.968185676357283, 12.018185676357284, 12.068185676357285, 12.118185676357285, 12.168185676357282, 12.218185676357283, 12.268185676357284, 12.318185676357285, 12.368185676357285, 12.418185676357282, 12.468185676357283, 12.518185676357284, 12.568185676357285, 12.618185676357285, 12.668185676357282, 12.718185676357283, 12.768185676357284, 12.818185676357285, 12.868185676357285, 12.918185676357282, 12.968185676357283, 13.018185676357284, 13.068185676357285, 13.118185676357285, 13.168185676357282, 13.218185676357283, 13.268185676357284, 13.318185676357285, 13.368185676357285, 13.418185676357282, 13.468185676357283, 13.518185676357284, 13.568185676357285, 13.618185676357285, 13.668185676357282, 13.718185676357283, 13.768185676357284, 13.818185676357285, 13.868185676357285, 13.918185676357282, 13.968185676357283, 14.018185676357284, 14.068185676357285, 14.118185676357285, 14.168185676357282, 14.218185676357283], "phase": [0.08607420270039448, 0.09607420270039448, 0.10607420270039448, 0.11607420270039448, 0.1260742027003945, 0.1360742027003945, 0.14607420270039448, 0.1560742027003945, 0.16607420270039447, 0.17607420270039448, 0.1860742027003945, 0.1960742027003945, 0.20607420270039448, 0.21607420270039449, 0.2260742027003945, 0.23607420270039448, 0.24607420270039448, 0.2560742027003945, 0.2660742027003945, 0.2760742027003945, 0.2860742027003945, 0.2960742027003945, 0.3060742027003945, 0.3160742027003945, 0.32607420270039444, 0.33607420270039445, 0.34607420270039446, 0.35607420270039447, 0.3660742027003945, 0.3760742027003945, 0.3860742027003945, 0.3960742027003945, 0.4060742027003945, 0.4160742027003945, 0.42607420270039453, 0.43607420270039454, 0.44607420270039444, 0.45607420270039445, 0.46607420270039446, 0.47607420270039447, 0.4860742027003945, 0.4960742027003945, 0.5060742027003945, 0.5160742027003945, 0.5260742027003945, 0.5360742027003945, 0.5460742027003945, 0.5560742027003945, 0.5660742027003944, 0.5760742027003944, 0.5860742027003945, 0.5960742027003945, 0.6060742027003945, 0.6160742027003945, 0.6260742027003945, 0.6360742027003945]}, {"amplitude": [11.514967929713432, 11.564967929713433, 11.614967929713432, 11.664967929713432, 11.714967929713431, 11.764967929713432, 11.814967929713433, 11.864967929713432, 11.914967929713432, 11.964967929713431, 12.014967929713432, 12.064967929713433, 12.114967929713432, 12.164967929713432, 12.214967929713431, 12.264967929713432, 12.314967929713433, 12.364967929713432, 12.414967929713432, 12.464967929713431, 12.514967929713432, 12.564967929713433, 12.614967929713432, 12.664967929713432, 12.714967929713431, 12.764967929713432, 12.814967929713433, 12.864967929713432, 12.914967929713432, 12.964967929713431, 13.014967929713432, 13.064967929713433, 13.114967929713432, 13.164967929713432, 13.214967929713431, 13.264967929713432, 13.314967929713433, 13.364967929713432, 13.414967929713432, 13.464967929713431, 13.514967929713432, 13.564967929713433, 13.614967929713432, 13.664967929713432, 13.714967929713431, 13.764967929713432, 13.814967929713433, 13.864967929713432, 13.914967929713432, 13.964967929713431, 14.014967929713432, 14.064967929713433, 14.114967929713432, 14.164967929713432, 14.214967929713431, 14.264967929713432], "phase": [0.09048270524660196, 0.10048270524660195, 0.11048270524660196, 0.12048270524660196, 0.13048270524660197, 0.14048270524660195, 0.15048270524660196, 0.16048270524660196, 0.17048270524660197, 0.18048270524660195, 0.19048270524660196, 0.20048270524660194, 0.21048270524660195, 0.22048270524660196, 0.23048270524660197, 0.24048270524660195, 0.250482705246602, 0.260482705246602, 0.27048270524660195, 0.28048270524660196, 0.29048270524660197, 0.3004827052466019, 0.31048270524660193, 0.32048270524660194, 0.33048270524660195, 0.34048270524660196, 0.35048270524660197, 0.360482705246602, 0.370482705246602, 0.38048270524660194, 0.39048270524660195, 0.40048270524660196, 0.41048270524660196, 0.420482705246602, 0.430482705246602, 0.440482705246602, 0.45048270524660194, 0.46048270524660195, 0.47048270524660196, 0.48048270524660197, 0.490482705246602, 0.500482705246602, 0.5104827052466019, 0.5204827052466019, 0.5304827052466019, 0.5404827052466019, 0.5504827052466019, 0.5604827052466019, 0.5704827052466019, 0.580482705246602, 0.590482705246602, 0.600482705246602, 0.610482705246602, 0.620482705246602, 0.630482705246602, 0.640482705246602]}, {"amplitude": [11.587075362689845, 11.637075362689846, 11.687075362689844, 11.737075362689845, 11.787075362689844, 11.837075362689845, 11.887075362689846, 11.937075362689844, 11.987075362689845, 12.037075362689844, 12.087075362689845, 12.137075362689846, 12.187075362689844, 12.237075362689845, 12.287075362689844, 12.337075362689845, 12.387075362689846, 12.437075362689844, 12.487075362689845, 12.537075362689844, 12.587075362689845, 12.637075362689846, 12.687075362689844, 12.737075362689845, 12.787075362689844, 12.837075362689845, 12.887075362689846, 12.937075362689844, 12.987075362689845, 13.037075362689844, 13.087075362689845, 13.137075362689846, 13.187075362689844, 13.237075362689845, 13.287075362689844, 13.337075362689845, 13.387075362689846, 13.437075362689844, 13.487075362689845, 13.537075362689844, 13.587075362689845, 13.637075362689846, 13.687075362689844, 13.737075362689845, 13.787075362689844, 13.837075362689845, 13.887075362689846, 13.937075362689844, 13.987075362689845, 14.037075362689844, 14.087075362689845, 14.137075362689846, 14.187075362689844, 14.237075362689845, 14.287075362689844, 14.337075362689845], "phase": [0.09408807689542259, 0.10408807689542258, 0.1140880768954226, 0.12408807689542259, 0.1340880768954226, 0.14408807689542258, 0.1540880768954226, 0.1640880768954226, 0.1740880768954226, 0.1840880768954226, 0.1940880768954226, 0.20408807689542258, 0.21408807689542259, 0.2240880768954226, 0.2340880768954226, 0.24408807689542258, 0.25408807689542257, 0.2640880768954226, 0.2740880768954226, 0.2840880768954226, 0.2940880768954226, 0.3040880768954226, 0.3140880768954226, 0.3240880768954226, 0.3340880768954226, 0.3440880768954226, 0.3540880768954226, 0.3640880768954226, 0.3740880768954226, 0.38408807689542257, 0.3940880768954226, 0.4040880768954226, 0.4140880768954226, 0.4240880768954226, 0.4340880768954226, 0.4440880768954226, 0.4540880768954226, 0.4640880768954226, 0.4740880768954226, 0.4840880768954226, 0.4940880768954226, 0.5040880768954226, 0.5140880768954226, 0.5240880768954226, 0.5340880768954226, 0.5440880768954226, 0.5540880768954226, 0.5640880768954226, 0.5740880768954226, 0.5840880768954226, 0.5940880768954226, 0.6040880768954227, 0.6140880768954227, 0.6240880768954227, 0.6340880768954227, 0.6440880768954227]}, {"amplitude": [11.683867944606657, 11.733867944606658, 11.783867944606657, 11.833867944606657, 11.883867944606656, 11.933867944606657, 11.983867944606658, 12.033867944606657, 12.083867944606657, 12.133867944606656, 12.183867944606657, 12.233867944606658, 12.283867944606657, 12.333867944606657, 12.383867944606656, 12.433867944606657, 12.483867944606658, 12.533867944606657, 12.583867944606657, 12.633867944606656, 12.683867944606657, 12.733867944606658, 12.783867944606657, 12.833867944606657, 12.883867944606656, 12.933867944606657, 12.983867944606658, 13.033867944606657, 13.083867944606657, 13.133867944606656, 13.183867944606657, 13.233867944606658, 13.283867944606657, 13.333867944606657, 13.383867944606656, 13.433867944606657, 13.483867944606658, 13.533867944606657, 13.583867944606657, 13.633867944606656, 13.683867944606657, 13.733867944606658, 13.783867944606657, 13.833867944606657, 13.883867944606656, 13.933867944606657, 13.983867944606658, 14.033867944606657, 14.083867944606657, 14.133867944606656, 14.183867944606657, 14.233867944606658, 14.283867944606657, 14.333867944606657, 14.383867944606656, 14.433867944606657], "phase": [0.0968583161128631, 0.10685831611286309, 0.1168583161128631, 0.12685831611286308, 0.1368583161128631, 0.1468583161128631, 0.1568583161128631, 0.16685831611286311, 0.1768583161128631, 0.18685831611286308, 0.19685831611286309, 0.2068583161128631, 0.2168583161128631, 0.2268583161128631, 0.23685831611286312, 0.24685831611286307, 0.2568583161128631, 0.2668583161128631, 0.2768583161128631, 0.2868583161128631, 0.2968583161128631, 0.30685831611286307, 0.3168583161128631, 0.3268583161128631, 0.3368583161128631, 0.3468583161128631, 0.3568583161128631, 0.3668583161128631, 0.37685831611286313, 0.3868583161128631, 0.3968583161128631, 0.4068583161128631, 0.4168583161128631, 0.4268583161128631, 0.43685831611286313, 0.44685831611286314, 0.4568583161128631, 0.4668583161128631, 0.4768583161128631, 0.4868583161128631, 0.49685831611286313, 0.5068583161128631, 0.516858316112863, 0.526858316112863, 0.536858316112863, 0.5468583161128631, 0.5568583161128631, 0.5668583161128631, 0.5768583161128631, 0.5868583161128631, 0.5968583161128631, 0.6068583161128631, 0.6168583161128631, 0.6268583161128631, 0.6368583161128631, 0.6468583161128632]}, {"amplitude": [11.799041105502535, 11.849041105502536, 11.899041105502533, 11.949041105502534, 11.999041105502535, 12.049041105502535, 12.099041105502536, 12.149041105502533, 12.199041105502534, 12.249041105502535, 12.299041105502535, 12.349041105502536, 12.399041105502533, 12.449041105502534, 12.499041105502535, 12.549041105502535, 12.599041105502536, 12.649041105502533, 12.699041105502534, 12.749041105502535, 12.799041105502535, 12.849041105502536, 12.899041105502533, 12.949041105502534, 12.999041105502535, 13.049041105502535, 13.099041105502536, 13.149041105502533, 13.199041105502534, 13.249041105502535, 13.299041105502535, 13.349041105502536, 13.399041105502533, 13.449041105502534, 13.499041105502535, 13.549041105502535, 13.599041105502536, 13.649041105502533, 13.699041105502534, 13.749041105502535, 13.799041105502535, 13.849041105502536, 13.899041105502533, 13.949041105502534, 13.999041105502535, 14.049041105502535, 14.099041105502536, 14.149041105502533, 14.199041105502534, 14.249041105502535, 14.299041105502535, 14.349041105502536, 14.399041105502533, 14.449041105502534, 14.499041105502535, 14.549041105502535], "phase": [0.09876883405951378, 0.10876883405951378, 0.11876883405951379, 0.12876883405951378, 0.1387688340595138, 0.1487688340595138, 0.15876883405951378, 0.1687688340595138, 0.17876883405951377, 0.18876883405951378, 0.1987688340595138, 0.2087688340595138, 0.21876883405951378, 0.2287688340595138, 0.2387688340595138, 0.24876883405951378, 0.2587688340595138, 0.2687688340595138, 0.2787688340595138, 0.2887688340595138, 0.2987688340595138, 0.3087688340595138, 0.3187688340595138, 0.3287688340595138, 0.33876883405951375, 0.34876883405951375, 0.35876883405951376, 0.3687688340595138, 0.3787688340595138, 0.3887688340595138, 0.3987688340595138, 0.4087688340595138, 0.4187688340595138, 0.4287688340595138, 0.43876883405951383, 0.44876883405951384, 0.45876883405951374, 0.46876883405951375, 0.47876883405951376, 0.48876883405951377, 0.4987688340595138, 0.5087688340595138, 0.5187688340595138, 0.5287688340595138, 0.5387688340595138, 0.5487688340595138, 0.5587688340595138, 0.5687688340595138, 0.5787688340595137, 0.5887688340595137, 0.5987688340595138, 0.6087688340595138, 0.6187688340595138, 0.6287688340595138, 0.6387688340595138, 0.6487688340595138]}, {"amplitude": [11.921446490707089, 11.97144649070709, 12.021446490707088, 12.071446490707089, 12.121446490707088, 12.171446490707089, 12.22144649070709, 12.271446490707088, 12.321446490707089, 12.371446490707088, 12.421446490707089, 12.47144649070709, 12.521446490707088, 12.571446490707089, 12.621446490707088, 12.671446490707089, 12.72144649070709, 12.771446490707088, 12.821446490707089, 12.871446490707088, 12.921446490707089, 12.97144649070709, 13.021446490707088, 13.071446490707089, 13.121446490707088, 13.171446490707089, 13.22144649070709, 13.271446490707088, 13.321446490707089, 13.371446490707088, 13.421446490707089, 13.47144649070709, 13.521446490707088, 13.571446490707089, 13.621446490707088, 13.671446490707089, 13.72144649070709, 13.771446490707088, 13.821446490707089, 13.871446490707088, 13.921446490707089, 13.97144649070709, 14.021446490707088, 14.071446490707089, 14.121446490707088, 14.171446490707089, 14.22144649070709, 14.271446490707088, 14.321446490707089, 14.371446490707088, 14.421446490707089, 14.47144649070709, 14.521446490707088, 14.571446490707089, 14.621446490707088, 14.671446490707089], "phase": [0.09980267284282718, 0.10980267284282717, 0.11980267284282718, 0.12980267284282718, 0.13980267284282719, 0.14980267284282717, 0.15980267284282718, 0.16980267284282718, 0.1798026728428272, 0.18980267284282717, 0.19980267284282718, 0.20980267284282716, 0.21980267284282717, 0.22980267284282718, 0.2398026728428272, 0.24980267284282717, 0.2598026728428272, 0.2698026728428272, 0.27980267284282717, 0.2898026728428272, 0.2998026728428272, 0.30980267284282714, 0.31980267284282715, 0.32980267284282716, 0.33980267284282717, 0.3498026728428272, 0.3598026728428272, 0.3698026728428272, 0.3798026728428272, 0.38980267284282716, 0.39980267284282717, 0.4098026728428272, 0.4198026728428272, 0.4298026728428272, 0.4398026728428272, 0.4498026728428272, 0.45980267284282716, 0.4698026728428272, 0.4798026728428272, 0.4898026728428272, 0.4998026728428272, 0.5098026728428272, 0.5198026728428271, 0.5298026728428271, 0.5398026728428271, 0.5498026728428271, 0.5598026728428271, 0.5698026728428272, 0.5798026728428272, 0.5898026728428272, 0.5998026728428272, 0.6098026728428272, 0.6198026728428272, 0.6298026728428272, 0.6398026728428272, 0.6498026728428272]}, {"amplitude": [12.036613090800754, 12.086613090800755, 12.136613090800754, 12.186613090800755, 12.236613090800754, 12.286613090800754, 12.336613090800755, 12.386613090800754, 12.436613090800755, 12.486613090800754, 12.536613090800754, 12.586613090800755, 12.636613090800754, 12.686613090800755, 12.736613090800754, 12.786613090800754, 12.836613090800755, 12.886613090800754, 12.936613090800755, 12.986613090800754, 13.036613090800754, 13.086613090800755, 13.136613090800754, 13.186613090800755, 13.236613090800754, 13.286613090800754, 13.336613090800755, 13.386613090800754, 13.436613090800755, 13.486613090800754, 13.536613090800754, 13.586613090800755, 13.636613090800754, 13.686613090800755, 13.736613090800754, 13.786613090800754, 13.836613090800755, 13.886613090800754, 13.936613090800755, 13.986613090800754, 14.036613090800754, 14.086613090800755, 14.136613090800754, 14.186613090800755, 14.236613090800754, 14.286613090800754, 14.336613090800755, 14.386613090800754, 14.436613090800755, 14.486613090800754, 14.536613090800754, 14.586613090800755, 14.636613090800754, 14.686613090800755, 14.736613090800754, 14.786613090800754], "phase": [0.09995065603657316, 0.10995065603657316, 0.11995065603657316, 0.12995065603657316, 0.13995065603657317, 0.14995065603657315, 0.15995065603657316, 0.16995065603657317, 0.17995065603657318, 0.18995065603657316, 0.19995065603657317, 0.20995065603657315, 0.21995065603657316, 0.22995065603657316, 0.23995065603657317, 0.24995065603657315, 0.2599506560365732, 0.2699506560365732, 0.27995065603657315, 0.28995065603657316, 0.29995065603657317, 0.3099506560365731, 0.31995065603657313, 0.32995065603657314, 0.33995065603657315, 0.34995065603657316, 0.35995065603657317, 0.3699506560365732, 0.3799506560365732, 0.38995065603657314, 0.39995065603657315, 0.40995065603657316, 0.41995065603657317, 0.4299506560365732, 0.4399506560365732, 0.4499506560365732, 0.45995065603657315, 0.46995065603657316, 0.47995065603657316, 0.4899506560365732, 0.4999506560365732, 0.5099506560365732, 0.5199506560365732, 0.5299506560365732, 0.5399506560365732, 0.5499506560365732, 0.5599506560365732, 0.5699506560365732, 0.5799506560365731, 0.5899506560365732, 0.5999506560365732, 0.6099506560365732, 0.6199506560365732, 0.6299506560365732, 0.6399506560365732, 0.6499506560365732]}, {"amplitude": [12.12875550485947, 12.17875550485947, 12.22875550485947, 12.27875550485947, 12.328755504859469, 12.37875550485947, 12.42875550485947, 12.47875550485947, 12.52875550485947, 12.578755504859469, 12.62875550485947, 12.67875550485947, 12.72875550485947, 12.77875550485947, 12.828755504859469, 12.87875550485947, 12.92875550485947, 12.97875550485947, 13.02875550485947, 13.078755504859469, 13.12875550485947, 13.17875550485947, 13.22875550485947, 13.27875550485947, 13.328755504859469, 13.37875550485947, 13.42875550485947, 13.47875550485947, 13.52875550485947, 13.578755504859469, 13.62875550485947, 13.67875550485947, 13.72875550485947, 13.77875550485947, 13.828755504859469, 13.87875550485947, 13.92875550485947, 13.97875550485947, 14.02875550485947, 14.078755504859469, 14.12875550485947, 14.17875550485947, 14.22875550485947, 14.27875550485947, 14.328755504859469, 14.37875550485947, 14.42875550485947, 14.47875550485947, 14.52875550485947, 14.578755504859469, 14.62875550485947, 14.67875550485947, 14.72875550485947, 14.77875550485947, 14.828755504859469, 14.87875550485947], "phase": [0.09921147013144778, 0.10921147013144777, 0.11921147013144778, 0.1292114701314478, 0.13921147013144777, 0.14921147013144778, 0.15921147013144776, 0.16921147013144777, 0.17921147013144778, 0.1892114701314478, 0.1992114701314478, 0.20921147013144778, 0.21921147013144776, 0.22921147013144777, 0.23921147013144778, 0.2492114701314478, 0.2592114701314478, 0.2692114701314478, 0.27921147013144776, 0.28921147013144777, 0.2992114701314478, 0.3092114701314478, 0.3192114701314478, 0.3292114701314478, 0.33921147013144776, 0.34921147013144777, 0.3592114701314478, 0.3692114701314478, 0.3792114701314478, 0.38921147013144775, 0.39921147013144775, 0.40921147013144776, 0.41921147013144777, 0.4292114701314478, 0.4392114701314478, 0.4492114701314478, 0.45921147013144775, 0.46921147013144776, 0.47921147013144777, 0.4892114701314478, 0.4992114701314478, 0.5092114701314479, 0.5192114701314477, 0.5292114701314478, 0.5392114701314478, 0.5492114701314478, 0.5592114701314478, 0.5692114701314478, 0.5792114701314478, 0.5892114701314478, 0.5992114701314478, 0.6092114701314478, 0.6192114701314478, 0.6292114701314478, 0.6392114701314479, 0.6492114701314479]}, {"amplitude": [12.182987496710233, 12.232987496710233, 12.28298749671023, 12.332987496710231, 12.382987496710232, 12.432987496710233, 12.482987496710233, 12.53298749671023, 12.582987496710231, 12.632987496710232, 12.682987496710233, 12.732987496710233, 12.78298749671023, 12.832987496710231, 12.882987496710232, 12.932987496710233, 12.982987496710233, 13.03298749671023, 13.082987496710231, 13.132987496710232, 13.182987496710233, 13.232987496710233, 13.28298749671023, 13.332987496710231, 13.382987496710232, 13.432987496710233, 13.482987496710233, 13.53298749671023, 13.582987496710231, 13.632987496710232, 13.682987496710233, 13.732987496710233, 13.78298749671023, 13.832987496710231, 13.882987496710232, 13.932987496710233, 13.982987496710233, 14.03298749671023, 14.082987496710231, 14.132987496710232, 14.182987496710233, 14.232987496710233, 14.28298749671023, 14.332987496710231, 14.382987496710232, 14.432987496710233, 14.482987496710233, 14.53298749671023, 14.582987496710231, 14.632987496710232, 14.682987496710233, 14.732987496710233, 14.78298749671023, 14.832987496710231, 14.882987496710232, 14.932987496710233], "phase": [0.0975916761938748, 0.10759167619387479, 0.1175916761938748, 0.1275916761938748, 0.1375916761938748, 0.1475916761938748, 0.1575916761938748, 0.1675916761938748, 0.17759167619387478, 0.1875916761938748, 0.1975916761938748, 0.2075916761938748, 0.2175916761938748, 0.2275916761938748, 0.2375916761938748, 0.2475916761938748, 0.2575916761938748, 0.2675916761938748, 0.2775916761938748, 0.2875916761938748, 0.29759167619387483, 0.3075916761938748, 0.3175916761938748, 0.3275916761938748, 0.33759167619387476, 0.34759167619387477, 0.3575916761938748, 0.3675916761938748, 0.3775916761938748, 0.3875916761938748, 0.3975916761938748, 0.4075916761938748, 0.41759167619387483, 0.42759167619387484, 0.43759167619387485, 0.44759167619387485, 0.45759167619387475, 0.46759167619387476, 0.47759167619387477, 0.4875916761938748, 0.4975916761938748, 0.5075916761938748, 0.5175916761938748, 0.5275916761938748, 0.5375916761938748, 0.5475916761938748, 0.5575916761938748, 0.5675916761938749, 0.5775916761938747, 0.5875916761938748, 0.5975916761938748, 0.6075916761938748, 0.6175916761938748, 0.6275916761938748, 0.6375916761938748, 0.6475916761938748]}, {"amplitude": [12.187429987478852, 12.237429987478853, 12.287429987478852, 12.337429987478853, 12.387429987478852, 12.437429987478852, 12.487429987478853, 12.537429987478852, 12.587429987478853, 12.637429987478852, 12.687429987478852, 12.737429987478853, 12.787429987478852, 12.837429987478853, 12.887429987478852, 12.937429987478852, 12.987429987478853, 13.037429987478852, 13.087429987478853, 13.137429987478852, 13.187429987478852, 13.237429987478853, 13.287429987478852, 13.337429987478853, 13.387429987478852, 13.437429987478852, 13.487429987478853, 13.537429987478852, 13.587429987478853, 13.637429987478852, 13.687429987478852, 13.737429987478853, 13.787429987478852, 13.837429987478853, 13.887429987478852, 13.937429987478852, 13.987429987478853, 14.037429987478852, 14.087429987478853, 14.137429987478852, 14.187429987478852, 14.237429987478853, 14.287429987478852, 14.337429987478853, 14.387429987478852, 14.437429987478852, 14.487429987478853, 14.537429987478852, 14.587429987478853, 14.637429987478852, 14.687429987478852, 14.737429987478853, 14.787429987478852, 14.837429987478853, 14.887429987478852, 14.937429987478852], "phase": [0.0951056516295154, 0.10510565162951539, 0.1151056516295154, 0.1251056516295154, 0.1351056516295154, 0.1451056516295154, 0.1551056516295154, 0.1651056516295154, 0.1751056516295154, 0.1851056516295154, 0.1951056516295154, 0.20510565162951538, 0.2151056516295154, 0.2251056516295154, 0.2351056516295154, 0.2451056516295154, 0.2551056516295154, 0.2651056516295154, 0.2751056516295154, 0.2851056516295154, 0.2951056516295154, 0.3051056516295154, 0.3151056516295154, 0.32510565162951544, 0.3351056516295154, 0.3451056516295154, 0.3551056516295154, 0.3651056516295154, 0.3751056516295154, 0.3851056516295154, 0.3951056516295154, 0.4051056516295154, 0.4151056516295154, 0.4251056516295154, 0.4351056516295154, 0.44510565162951543, 0.4551056516295154, 0.4651056516295154, 0.4751056516295154, 0.4851056516295154, 0.4951056516295154, 0.5051056516295154, 0.5151056516295154, 0.5251056516295154, 0.5351056516295154, 0.5451056516295154, 0.5551056516295154, 0.5651056516295154, 0.5751056516295154, 0.5851056516295154, 0.5951056516295155, 0.6051056516295155, 0.6151056516295155, 0.6251056516295155, 0.6351056516295155, 0.6451056516295155]}, {"amplitude": [12.134917269896443, 12.184917269896443, 12.234917269896442, 12.284917269896443, 12.334917269896442, 12.384917269896443, 12.434917269896443, 12.484917269896442, 12.534917269896443, 12.584917269896442, 12.634917269896443, 12.684917269896443, 12.734917269896442, 12.784917269896443, 12.834917269896442, 12.884917269896443, 12.934917269896443, 12.984917269896442, 13.034917269896443, 13.084917269896442, 13.134917269896443, 13.184917269896443, 13.234917269896442, 13.284917269896443, 13.334917269896442, 13.384917269896443, 13.434917269896443, 13.484917269896442, 13.534917269896443, 13.584917269896442, 13.634917269896443, 13.684917269896443, 13.734917269896442, 13.784917269896443, 13.834917269896442, 13.884917269896443, 13.934917269896443, 13.984917269896442, 14.034917269896443, 14.084917269896442, 14.134917269896443, 14.184917269896443, 14.234917269896442, 14.284917269896443, 14.334917269896442, 14.384917269896443, 14.434917269896443, 14.484917269896442, 14.534917269896443, 14.584917269896442, 14.634917269896443, 14.684917269896443, 14.734917269896442, 14.784917269896443, 14.834917269896442, 14.884917269896443], "phase": [0.0917754625683981, 0.10177546256839809, 0.1117754625683981, 0.1217754625683981, 0.1317754625683981, 0.1417754625683981, 0.15177546256839808, 0.1617754625683981, 0.1717754625683981, 0.1817754625683981, 0.19177546256839811, 0.2017754625683981, 0.21177546256839808, 0.22177546256839809, 0.2317754625683981, 0.2417754625683981, 0.2517754625683981, 0.2617754625683981, 0.2717754625683981, 0.2817754625683981, 0.2917754625683981, 0.3017754625683981, 0.3117754625683981, 0.3217754625683981, 0.33177546256839807, 0.3417754625683981, 0.3517754625683981, 0.3617754625683981, 0.3717754625683981, 0.38177546256839806, 0.39177546256839807, 0.4017754625683981, 0.4117754625683981, 0.4217754625683981, 0.4317754625683981, 0.4417754625683981, 0.45177546256839807, 0.4617754625683981, 0.4717754625683981, 0.4817754625683981, 0.4917754625683981, 0.5017754625683981, 0.5117754625683981, 0.5217754625683981, 0.5317754625683981, 0.5417754625683981, 0.5517754625683982, 0.5617754625683982, 0.5717754625683981, 0.5817754625683981, 0.5917754625683981, 0.6017754625683981, 0.6117754625683981, 0.6217754625683981, 0.6317754625683981, 0.6417754625683981]}, {"amplitude": [12.024061475827535, 12.074061475827536, 12.124061475827535, 12.174061475827536, 12.224061475827535, 12.274061475827535, 12.324061475827536, 12.374061475827535, 12.424061475827536, 12.474061475827535, 12.524061475827535, 12.574061475827536, 12.624061475827535, 12.674061475827536, 12.724061475827535, 12.774061475827535, 12.824061475827536, 12.874061475827535, 12.924061475827536, 12.974061475827535, 13.024061475827535, 13.074061475827536, 13.124061475827535, 13.174061475827536, 13.224061475827535, 13.274061475827535, 13.324061475827536, 13.374061475827535, 13.424061475827536, 13.474061475827535, 13.524061475827535, 13.574061475827536, 13.624061475827535, 13.674061475827536, 13.724061475827535, 13.774061475827535, 13.824061475827536, 13.874061475827535, 13.924061475827536, 13.974061475827535, 14.024061475827535, 14.074061475827536, 14.124061475827535, 14.174061475827536, 14.224061475827535, 14.274061475827535, 14.324061475827536, 14.374061475827535, 14.424061475827536, 14.474061475827535, 14.524061475827535, 14.574061475827536, 14.624061475827535, 14.674061475827536, 14.724061475827535, 14.774061475827535], "phase": [0.08763066800438646, 0.09763066800438645, 0.10763066800438646, 0.11763066800438646, 0.12763066800438647, 0.13763066800438645, 0.14763066800438646, 0.15763066800438646, 0.16763066800438647, 0.17763066800438645, 0.18763066800438646, 0.19763066800438644, 0.20763066800438645, 0.21763066800438646, 0.22763066800438647, 0.23763066800438645, 0.24763066800438646, 0.2576306680043865, 0.26763066800438645, 0.27763066800438646, 0.28763066800438647, 0.2976306680043864, 0.30763066800438643, 0.31763066800438644, 0.32763066800438645, 0.33763066800438646, 0.34763066800438647, 0.3576306680043865, 0.3676306680043865, 0.37763066800438644, 0.38763066800438645, 0.39763066800438646, 0.40763066800438646, 0.4176306680043865, 0.4276306680043865, 0.4376306680043865, 0.44763066800438644, 0.45763066800438645, 0.46763066800438646, 0.47763066800438647, 0.4876306680043865, 0.4976306680043865, 0.5076306680043865, 0.5176306680043865, 0.5276306680043865, 0.5376306680043865, 0.5476306680043865, 0.5576306680043865, 0.5676306680043864, 0.5776306680043864, 0.5876306680043865, 0.5976306680043865, 0.6076306680043865, 0.6176306680043865, 0.6276306680043865, 0.6376306680043865]}, {"amplitude": [11.859525280327732, 11.909525280327733, 11.95952528032773, 12.00952528032773, 12.059525280327732, 12.109525280327732, 12.159525280327733, 12.20952528032773, 12.25952528032773, 12.309525280327732, 12.359525280327732, 12.409525280327733, 12.45952528032773, 12.50952528032773, 12.559525280327732, 12.609525280327732, 12.659525280327733, 12.70952528032773, 12.75952528032773, 12.809525280327732, 12.859525280327732, 12.909525280327733, 12.95952528032773, 13.00952528032773, 13.059525280327732, 13.109525280327732, 13.159525280327733, 13.20952528032773, 13.25952528032773, 13.309525280327732, 13.359525280327732, 13.409525280327733, 13.45952528032773, 13.50952528032773, 13.559525280327732, 13.609525280327732, 13.659525280327733, 13.70952528032773, 13.75952528032773, 13.809525280327732, 13.859525280327732, 13.909525280327733, 13.95952528032773, 14.00952528032773, 14.059525280327732, 14.109525280327732, 14.159525280327733, 14.20952528032773, 14.25952528032773, 14.309525280327732, 14.359525280327732, 14.409525280327733, 14.45952528032773, 14.50952528032773, 14.559525280327732, 14.609525280327732], "phase": [0.08270805742745622, 0.09270805742745622, 0.10270805742745623, 0.11270805742745622, 0.12270805742745622, 0.13270805742745623, 0.14270805742745624, 0.15270805742745625, 0.16270805742745623, 0.1727080574274562, 0.18270805742745622, 0.19270805742745623, 0.20270805742745623, 0.21270805742745624, 0.22270805742745625, 0.2327080574274562, 0.24270805742745621, 0.2527080574274562, 0.26270805742745623, 0.27270805742745624, 0.28270805742745625, 0.2927080574274562, 0.3027080574274562, 0.3127080574274562, 0.32270805742745623, 0.33270805742745624, 0.34270805742745625, 0.35270805742745626, 0.36270805742745627, 0.3727080574274562, 0.3827080574274562, 0.39270805742745624, 0.40270805742745625, 0.41270805742745625, 0.42270805742745626, 0.43270805742745627, 0.4427080574274562, 0.45270805742745623, 0.46270805742745624, 0.47270805742745625, 0.48270805742745626, 0.49270805742745627, 0.5027080574274562, 0.5127080574274562, 0.5227080574274562, 0.5327080574274562, 0.5427080574274562, 0.5527080574274562, 0.5627080574274562, 0.5727080574274562, 0.5827080574274562, 0.5927080574274562, 0.6027080574274563, 0.6127080574274563, 0.6227080574274563, 0.6327080574274563]}, {"amplitude": [11.651463851356988, 11.701463851356989, 11.751463851356988, 11.801463851356988, 11.851463851356987, 11.901463851356988, 11.951463851356989, 12.001463851356988, 12.051463851356988, 12.101463851356987, 12.151463851356988, 12.201463851356989, 12.251463851356988, 12.301463851356988, 12.351463851356987, 12.401463851356988, 12.451463851356989, 12.501463851356988, 12.551463851356988, 12.601463851356987, 12.651463851356988, 12.701463851356989, 12.751463851356988, 12.801463851356988, 12.851463851356987, 12.901463851356988, 12.951463851356989, 13.001463851356988, 13.051463851356988, 13.101463851356987, 13.151463851356988, 13.201463851356989, 13.251463851356988, 13.301463851356988, 13.351463851356987, 13.401463851356988, 13.451463851356989, 13.501463851356988, 13.551463851356988, 13.601463851356987, 13.651463851356988, 13.701463851356989, 13.751463851356988, 13.801463851356988, 13.851463851356987, 13.901463851356988, 13.951463851356989, 14.001463851356988, 14.051463851356988, 14.101463851356987, 14.151463851356988, 14.201463851356989, 14.251463851356988, 14.301463851356988, 14.351463851356987, 14.401463851356988], "phase": [0.07705132427757912, 0.08705132427757911, 0.09705132427757912, 0.10705132427757912, 0.11705132427757911, 0.12705132427757912, 0.1370513242775791, 0.1470513242775791, 0.15705132427757912, 0.16705132427757913, 0.17705132427757914, 0.18705132427757912, 0.1970513242775791, 0.2070513242775791, 0.21705132427757912, 0.22705132427757913, 0.23705132427757913, 0.24705132427757914, 0.2570513242775791, 0.2670513242775791, 0.2770513242775791, 0.2870513242775791, 0.29705132427757913, 0.30705132427757914, 0.3170513242775791, 0.3270513242775791, 0.3370513242775791, 0.3470513242775791, 0.35705132427757913, 0.3670513242775791, 0.3770513242775791, 0.3870513242775791, 0.3970513242775791, 0.4070513242775791, 0.4170513242775791, 0.42705132427757914, 0.4370513242775791, 0.4470513242775791, 0.4570513242775791, 0.4670513242775791, 0.4770513242775791, 0.48705132427757913, 0.4970513242775791, 0.5070513242775792, 0.5170513242775792, 0.5270513242775792, 0.5370513242775792, 0.5470513242775792, 0.5570513242775791, 0.5670513242775791, 0.5770513242775791, 0.5870513242775791, 0.5970513242775791, 0.6070513242775791, 0.6170513242775791, 0.6270513242775791]}, {"amplitude": [11.4142135623731, 11.4642135623731, 11.514213562373099, 11.5642135623731, 11.614213562373099, 11.6642135623731, 11.7142135623731, 11.764213562373099, 11.8142135623731, 11.864213562373099, 11.9142135623731, 11.9642135623731, 12.014213562373099, 12.0642135623731, 12.114213562373099, 12.1642135623731, 12.2142135623731, 12.264213562373099, 12.3142135623731, 12.364213562373099, 12.4142135623731, 12.4642135623731, 12.514213562373099, 12.5642135623731, 12.614213562373099, 12.6642135623731, 12.7142135623731, 12.764213562373099, 12.8142135623731, 12.864213562373099, 12.9142135623731, 12.9642135623731, 13.014213562373099, 13.0642135623731, 13.114213562373099, 13.1642135623731, 13.2142135623731, 13.264213562373099, 13.3142135623731, 13.364213562373099, 13.4142135623731, 13.4642135623731, 13.514213562373099, 13.5642135623731, 13.614213562373099, 13.6642135623731, 13.7142135623731, 13.764213562373099, 13.8142135623731, 13.864213562373099, 13.9142135623731, 13.9642135623731, 14.014213562373099, 14.0642135623731, 14.114213562373099, 14.1642135623731], "phase": [0.07071067811865488, 0.08071067811865487, 0.09071067811865488, 0.10071067811865488, 0.11071067811865487, 0.12071067811865488, 0.1307106781186549, 0.1407106781186549, 0.15071067811865488, 0.16071067811865486, 0.17071067811865487, 0.18071067811865488, 0.19071067811865489, 0.2007106781186549, 0.2107106781186549, 0.22071067811865486, 0.23071067811865487, 0.24071067811865487, 0.2507106781186549, 0.2607106781186549, 0.2707106781186549, 0.28071067811865485, 0.29071067811865486, 0.3007106781186549, 0.3107106781186549, 0.3207106781186549, 0.3307106781186549, 0.3407106781186549, 0.3507106781186549, 0.36071067811865487, 0.3707106781186549, 0.3807106781186549, 0.3907106781186549, 0.4007106781186549, 0.4107106781186549, 0.4207106781186549, 0.4307106781186549, 0.4407106781186549, 0.4507106781186549, 0.4607106781186549, 0.4707106781186549, 0.4807106781186549, 0.4907106781186549, 0.5007106781186549, 0.5107106781186549, 0.5207106781186549, 0.5307106781186549, 0.5407106781186549, 0.5507106781186548, 0.5607106781186548, 0.5707106781186548, 0.5807106781186548, 0.5907106781186549, 0.6007106781186549, 0.6107106781186549, 0.6207106781186549]}, {"amplitude": [11.164410613691977, 11.214410613691978, 11.264410613691977, 11.314410613691978, 11.364410613691977, 11.414410613691977, 11.464410613691978, 11.514410613691977, 11.564410613691978, 11.614410613691977, 11.664410613691977, 11.714410613691978, 11.764410613691977, 11.814410613691978, 11.864410613691977, 11.914410613691977, 11.964410613691978, 12.014410613691977, 12.064410613691978, 12.114410613691977, 12.164410613691977, 12.214410613691978, 12.264410613691977, 12.314410613691978, 12.364410613691977, 12.414410613691977, 12.464410613691978, 12.514410613691977, 12.564410613691978, 12.614410613691977, 12.664410613691977, 12.714410613691978, 12.764410613691977, 12.814410613691978, 12.864410613691977, 12.914410613691977, 12.964410613691978, 13.014410613691977, 13.064410613691978, 13.114410613691977, 13.164410613691977, 13.214410613691978, 13.264410613691977, 13.314410613691978, 13.364410613691977, 13.414410613691977, 13.464410613691978, 13.514410613691977, 13.564410613691978, 13.614410613691977, 13.664410613691977, 13.714410613691978, 13.764410613691977, 13.814410613691978, 13.864410613691977, 13.914410613691977], "phase": [0.06374239897486901, 0.073742398974869, 0.08374239897486901, 0.09374239897486901, 0.103742398974869, 0.11374239897486901, 0.12374239897486901, 0.133742398974869, 0.143742398974869, 0.15374239897486902, 0.16374239897486903, 0.173742398974869, 0.183742398974869, 0.193742398974869, 0.203742398974869, 0.21374239897486902, 0.22374239897486903, 0.23374239897486904, 0.243742398974869, 0.253742398974869, 0.263742398974869, 0.273742398974869, 0.283742398974869, 0.29374239897486903, 0.303742398974869, 0.313742398974869, 0.323742398974869, 0.333742398974869, 0.343742398974869, 0.353742398974869, 0.363742398974869, 0.373742398974869, 0.383742398974869, 0.393742398974869, 0.403742398974869, 0.41374239897486903, 0.423742398974869, 0.433742398974869, 0.443742398974869, 0.453742398974869, 0.463742398974869, 0.47374239897486903, 0.483742398974869, 0.493742398974869, 0.503742398974869, 0.5137423989748691, 0.5237423989748691, 0.5337423989748691, 0.543742398974869, 0.553742398974869, 0.563742398974869, 0.573742398974869, 0.583742398974869, 0.593742398974869, 0.603742398974869, 0.613742398974869]}, {"amplitude": [10.918802623925663, 10.968802623925663, 11.018802623925662, 11.068802623925663, 11.118802623925662, 11.168802623925663, 11.218802623925663, 11.268802623925662, 11.318802623925663, 11.368802623925662, 11.418802623925663, 11.468802623925663, 11.518802623925662, 11.568802623925663, 11.618802623925662, 11.668802623925663, 11.718802623925663, 11.768802623925662, 11.818802623925663, 11.868802623925662, 11.918802623925663, 11.968802623925663, 12.018802623925662, 12.068802623925663, 12.118802623925662, 12.168802623925663, 12.218802623925663, 12.268802623925662, 12.318802623925663, 12.368802623925662, 12.418802623925663, 12.468802623925663, 12.518802623925662, 12.568802623925663, 12.618802623925662, 12.668802623925663, 12.718802623925663, 12.768802623925662, 12.818802623925663, 12.868802623925662, 12.918802623925663, 12.968802623925663, 13.018802623925662, 13.068802623925663, 13.118802623925662, 13.168802623925663, 13.218802623925663, 13.268802623925662, 13.318802623925663, 13.368802623925662, 13.418802623925663, 13.468802623925663, 13.518802623925662, 13.568802623925663, 13.618802623925662, 13.668802623925663], "phase": [0.056208337785213294, 0.06620833778521329, 0.0762083377852133, 0.0862083377852133, 0.09620833778521329, 0.1062083377852133, 0.11620833778521329, 0.1262083377852133, 0.1362083377852133, 0.1462083377852133, 0.1562083377852133, 0.1662083377852133, 0.17620833778521328, 0.18620833778521328, 0.1962083377852133, 0.2062083377852133, 0.2162083377852133, 0.22620833778521332, 0.23620833778521327, 0.24620833778521328, 0.2562083377852133, 0.2662083377852133, 0.2762083377852133, 0.2862083377852133, 0.29620833778521327, 0.3062083377852133, 0.3162083377852133, 0.3262083377852133, 0.3362083377852133, 0.34620833778521326, 0.35620833778521327, 0.3662083377852133, 0.3762083377852133, 0.3862083377852133, 0.3962083377852133, 0.4062083377852133, 0.41620833778521327, 0.4262083377852133, 0.4362083377852133, 0.4462083377852133, 0.4562083377852133, 0.4662083377852133, 0.47620833778521326, 0.4862083377852133, 0.4962083377852133, 0.5062083377852133, 0.5162083377852134, 0.5262083377852134, 0.5362083377852133, 0.5462083377852133, 0.5562083377852133, 0.5662083377852133, 0.5762083377852133, 0.5862083377852133, 0.5962083377852133, 0.6062083377852133]}, {"amplitude": [10.69205923246363, 10.74205923246363, 10.792059232463629, 10.84205923246363, 10.892059232463629, 10.94205923246363, 10.99205923246363, 11.042059232463629, 11.09205923246363, 11.142059232463629, 11.19205923246363, 11.24205923246363, 11.292059232463629, 11.34205923246363, 11.392059232463629, 11.44205923246363, 11.49205923246363, 11.542059232463629, 11.59205923246363, 11.642059232463629, 11.69205923246363, 11.74205923246363, 11.792059232463629, 11.84205923246363, 11.892059232463629, 11.94205923246363, 11.99205923246363, 12.042059232463629, 12.09205923246363, 12.142059232463629, 12.19205923246363, 12.24205923246363, 12.292059232463629, 12.34205923246363, 12.392059232463629, 12.44205923246363, 12.49205923246363, 12.542059232463629, 12.59205923246363, 12.642059232463629, 12.69205923246363, 12.74205923246363, 12.792059232463629, 12.84205923246363, 12.892059232463629, 12.94205923246363, 12.99205923246363, 13.042059232463629, 13.09205923246363, 13.142059232463629, 13.19205923246363, 13.24205923246363, 13.292059232463629, 13.34205923246363, 13.392059232463629, 13.44205923246363], "phase": [0.04817536741017167, 0.05817536741017167, 0.06817536741017168, 0.07817536741017167, 0.08817536741017168, 0.09817536741017167, 0.10817536741017167, 0.11817536741017168, 0.12817536741017166, 0.13817536741017167, 0.14817536741017168, 0.15817536741017169, 0.16817536741017167, 0.17817536741017168, 0.18817536741017168, 0.19817536741017167, 0.20817536741017167, 0.21817536741017168, 0.22817536741017166, 0.23817536741017167, 0.24817536741017168, 0.25817536741017166, 0.26817536741017167, 0.2781753674101717, 0.2881753674101717, 0.2981753674101717, 0.3081753674101717, 0.3181753674101717, 0.3281753674101717, 0.3381753674101716, 0.34817536741017163, 0.35817536741017164, 0.36817536741017165, 0.37817536741017166, 0.38817536741017167, 0.3981753674101717, 0.4081753674101717, 0.4181753674101717, 0.4281753674101717, 0.4381753674101717, 0.4481753674101717, 0.45817536741017173, 0.46817536741017163, 0.47817536741017164, 0.48817536741017165, 0.49817536741017165, 0.5081753674101717, 0.5181753674101717, 0.5281753674101717, 0.5381753674101717, 0.5481753674101717, 0.5581753674101717, 0.5681753674101717, 0.5781753674101717, 0.5881753674101717, 0.5981753674101717]}, {"amplitude": [10.494887762741087, 10.544887762741087, 10.594887762741086, 10.644887762741087, 10.694887762741086, 10.744887762741087, 10.794887762741087, 10.844887762741086, 10.894887762741087, 10.944887762741086, 10.994887762741087, 11.044887762741087, 11.094887762741086, 11.144887762741087, 11.194887762741086, 11.244887762741087, 11.294887762741087, 11.344887762741086, 11.394887762741087, 11.444887762741086, 11.494887762741087, 11.544887762741087, 11.594887762741086, 11.644887762741087, 11.694887762741086, 11.744887762741087, 11.794887762741087, 11.844887762741086, 11.894887762741087, 11.944887762741086, 11.994887762741087, 12.044887762741087, 12.094887762741086, 12.144887762741087, 12.194887762741086, 12.244887762741087, 12.294887762741087, 12.344887762741086, 12.394887762741087, 12.444887762741086, 12.494887762741087, 12.544887762741087, 12.594887762741086, 12.644887762741087, 12.694887762741086, 12.744887762741087, 12.794887762741087, 12.844887762741086, 12.894887762741087, 12.944887762741086, 12.994887762741087, 13.044887762741087, 13.094887762741086, 13.144887762741087, 13.194887762741086, 13.244887762741087], "phase": [0.03971478906347842, 0.04971478906347842, 0.05971478906347842, 0.06971478906347842, 0.07971478906347843, 0.08971478906347842, 0.09971478906347842, 0.10971478906347842, 0.11971478906347842, 0.12971478906347841, 0.13971478906347842, 0.1497147890634784, 0.1597147890634784, 0.16971478906347842, 0.17971478906347843, 0.1897147890634784, 0.19971478906347842, 0.20971478906347843, 0.2197147890634784, 0.22971478906347842, 0.23971478906347843, 0.2497147890634784, 0.25971478906347845, 0.26971478906347846, 0.2797147890634784, 0.2897147890634784, 0.2997147890634784, 0.30971478906347844, 0.31971478906347844, 0.3297147890634784, 0.3397147890634784, 0.3497147890634784, 0.3597147890634784, 0.36971478906347843, 0.37971478906347844, 0.38971478906347845, 0.3997147890634784, 0.4097147890634784, 0.4197147890634784, 0.42971478906347843, 0.43971478906347844, 0.44971478906347845, 0.4597147890634784, 0.4697147890634784, 0.4797147890634784, 0.48971478906347843, 0.49971478906347844, 0.5097147890634784, 0.5197147890634783, 0.5297147890634784, 0.5397147890634784, 0.5497147890634784, 0.5597147890634784, 0.5697147890634784, 0.5797147890634784, 0.5897147890634784]}, {"amplitude": [10.332717033861348, 10.382717033861349, 10.432717033861348, 10.482717033861348, 10.532717033861347, 10.582717033861348, 10.632717033861349, 10.682717033861348, 10.732717033861348, 10.782717033861347, 10.832717033861348, 10.882717033861349, 10.932717033861348, 10.982717033861348, 11.032717033861347, 11.082717033861348, 11.132717033861349, 11.182717033861348, 11.232717033861348, 11.282717033861347, 11.332717033861348, 11.382717033861349, 11.432717033861348, 11.482717033861348, 11.532717033861347, 11.582717033861348, 11.632717033861349, 11.682717033861348, 11.732717033861348, 11.782717033861347, 11.832717033861348, 11.882717033861349, 11.932717033861348, 11.982717033861348, 12.032717033861347, 12.082717033861348, 12.132717033861349, 12.182717033861348, 12.232717033861348, 12.282717033861347, 12.332717033861348, 12.382717033861349, 12.432717033861348, 12.482717033861348, 12.532717033861347, 12.582717033861348, 12.632717033861349, 12.682717033861348, 12.732717033861348, 12.782717033861347, 12.832717033861348, 12.882717033861349, 12.932717033861348, 12.982717033861348, 13.032717033861347, 13.082717033861348], "phase": [0.030901699437494656, 0.04090169943749466, 0.05090169943749466, 0.060901699437494655, 0.07090169943749466, 0.08090169943749466, 0.09090169943749465, 0.10090169943749466, 0.11090169943749466, 0.12090169943749465, 0.13090169943749466, 0.14090169943749464, 0.15090169943749465, 0.16090169943749466, 0.17090169943749467, 0.18090169943749465, 0.19090169943749466, 0.20090169943749467, 0.21090169943749465, 0.22090169943749466, 0.23090169943749467, 0.24090169943749465, 0.25090169943749463, 0.26090169943749464, 0.27090169943749465, 0.28090169943749466, 0.29090169943749467, 0.3009016994374947, 0.3109016994374947, 0.32090169943749464, 0.33090169943749465, 0.34090169943749465, 0.35090169943749466, 0.36090169943749467, 0.3709016994374947, 0.3809016994374947, 0.39090169943749464, 0.40090169943749465, 0.41090169943749466, 0.42090169943749467, 0.4309016994374947, 0.4409016994374947, 0.45090169943749464, 0.46090169943749465, 0.47090169943749466, 0.48090169943749467, 0.4909016994374947, 0.5009016994374946, 0.5109016994374946, 0.5209016994374946, 0.5309016994374947, 0.5409016994374947, 0.5509016994374947, 0.5609016994374947, 0.5709016994374947, 0.5809016994374947]}, {"amplitude": [10.205132509960347, 10.255132509960347, 10.305132509960346, 10.355132509960347, 10.405132509960346, 10.455132509960347, 10.505132509960347, 10.555132509960346, 10.605132509960347, 10.655132509960346, 10.705132509960347, 10.755132509960347, 10.805132509960346, 10.855132509960347, 10.905132509960346, 10.955132509960347, 11.005132509960347, 11.055132509960346, 11.105132509960347, 11.155132509960346, 11.205132509960347, 11.255132509960347, 11.305132509960346, 11.355132509960347, 11.405132509960346, 11.455132509960347, 11.505132509960347, 11.555132509960346, 11.605132509960347, 11.655132509960346, 11.705132509960347, 11.755132509960347, 11.805132509960346, 11.855132509960347, 11.905132509960346, 11.955132509960347, 12.005132509960347, 12.055132509960346, 12.105132509960347, 12.155132509960346, 12.205132509960347, 12.255132509960347, 12.305132509960346, 12.355132509960347, 12.405132509960346, 12.455132509960347, 12.505132509960347, 12.555132509960346, 12.605132509960347, 12.655132509960346, 12.705132509960347, 12.755132509960347, 12.805132509960346, 12.855132509960347, 12.905132509960346, 12.955132509960347], "phase": [0.021814324139654045, 0.03181432413965404, 0.041814324139654045, 0.05181432413965405, 0.06181432413965404, 0.07181432413965405, 0.08181432413965405, 0.09181432413965405, 0.10181432413965405, 0.11181432413965404, 0.12181432413965405, 0.13181432413965405, 0.14181432413965403, 0.15181432413965404, 0.16181432413965405, 0.17181432413965403, 0.18181432413965404, 0.19181432413965405, 0.20181432413965403, 0.21181432413965404, 0.22181432413965405, 0.23181432413965403, 0.24181432413965404, 0.25181432413965404, 0.26181432413965405, 0.27181432413965406, 0.28181432413965407, 0.2918143241396541, 0.3018143241396541, 0.31181432413965404, 0.32181432413965405, 0.33181432413965406, 0.34181432413965407, 0.3518143241396541, 0.3618143241396541, 0.3718143241396541, 0.38181432413965405, 0.39181432413965406, 0.40181432413965407, 0.4118143241396541, 0.4218143241396541, 0.4318143241396541, 0.44181432413965405, 0.45181432413965406, 0.46181432413965406, 0.4718143241396541, 0.4818143241396541, 0.4918143241396541, 0.501814324139654, 0.511814324139654, 0.521814324139654, 0.531814324139654, 0.541814324139654, 0.551814324139654, 0.561814324139654, 0.571814324139654]}, {"amplitude": [10.106140364898094, 10.156140364898095, 10.206140364898094, 10.256140364898094, 10.306140364898093, 10.356140364898094, 10.406140364898095, 10.456140364898094, 10.506140364898094, 10.556140364898093, 10.606140364898094, 10.656140364898095, 10.706140364898094, 10.756140364898094, 10.806140364898093, 10.856140364898094, 10.906140364898095, 10.956140364898094, 11.006140364898094, 11.056140364898093, 11.106140364898094, 11.156140364898095, 11.206140364898094, 11.256140364898094, 11.306140364898093, 11.356140364898094, 11.406140364898095, 11.456140364898094, 11.506140364898094, 11.556140364898093, 11.606140364898094, 11.656140364898095, 11.706140364898094, 11.756140364898094, 11.806140364898093, 11.856140364898094, 11.906140364898095, 11.956140364898094, 12.006140364898094, 12.056140364898093, 12.106140364898094, 12.156140364898095, 12.206140364898094, 12.256140364898094, 12.306140364898093, 12.356140364898094, 12.406140364898095, 12.456140364898094, 12.506140364898094, 12.556140364898093, 12.606140364898094, 12.656140364898095, 12.706140364898094, 12.756140364898094, 12.806140364898093, 12.856140364898094], "phase": [0.01253332335643044, 0.02253332335643044, 0.032533323356430444, 0.04253332335643044, 0.05253332335643044, 0.06253332335643044, 0.07253332335643044, 0.08253332335643045, 0.09253332335643044, 0.10253332335643044, 0.11253332335643045, 0.12253332335643044, 0.13253332335643042, 0.14253332335643043, 0.15253332335643044, 0.16253332335643045, 0.17253332335643046, 0.18253332335643047, 0.19253332335643042, 0.20253332335643043, 0.21253332335643044, 0.22253332335643045, 0.23253332335643045, 0.24253332335643046, 0.2525333233564304, 0.2625333233564304, 0.27253332335643043, 0.28253332335643044, 0.29253332335643045, 0.3025333233564304, 0.3125333233564304, 0.3225333233564304, 0.33253332335643043, 0.34253332335643044, 0.35253332335643045, 0.36253332335643046, 0.3725333233564304, 0.3825333233564304, 0.39253332335643043, 0.40253332335643044, 0.41253332335643045, 0.42253332335643046, 0.4325333233564304, 0.4425333233564304, 0.45253332335643043, 0.46253332335643044, 0.47253332335643045, 0.48253332335643045, 0.4925333233564304, 0.5025333233564304, 0.5125333233564304, 0.5225333233564304, 0.5325333233564304, 0.5425333233564305, 0.5525333233564305, 0.5625333233564305]}, {"amplitude": [10.025221548086964, 10.075221548086965, 10.125221548086964, 10.175221548086965, 10.225221548086964, 10.275221548086964, 10.325221548086965, 10.375221548086964, 10.425221548086965, 10.475221548086964, 10.525221548086964, 10.575221548086965, 10.625221548086964, 10.675221548086965, 10.725221548086964, 10.775221548086964, 10.825221548086965, 10.875221548086964, 10.925221548086965, 10.975221548086964, 11.025221548086964, 11.075221548086965, 11.125221548086964, 11.175221548086965, 11.225221548086964, 11.275221548086964, 11.325221548086965, 11.375221548086964, 11.425221548086965, 11.475221548086964, 11.525221548086964, 11.575221548086965, 11.625221548086964, 11.675221548086965, 11.725221548086964, 11.775221548086964, 11.825221548086965, 11.875221548086964, 11.925221548086965, 11.975221548086964, 12.025221548086964, 12.075221548086965, 12.125221548086964, 12.175221548086965, 12.225221548086964, 12.275221548086964, 12.325221548086965, 12.375221548086964, 12.425221548086965, 12.475221548086964, 12.525221548086964, 12.575221548086965, 12.625221548086964, 12.675221548086965, 12.725221548086964, 12.775221548086964], "phase": [0.0031410759078127196, 0.01314107590781272, 0.02314107590781272, 0.03314107590781272, 0.04314107590781272, 0.053141075907812724, 0.06314107590781272, 0.07314107590781273, 0.08314107590781272, 0.09314107590781272, 0.10314107590781273, 0.11314107590781272, 0.12314107590781272, 0.1331410759078127, 0.14314107590781272, 0.1531410759078127, 0.1631410759078127, 0.17314107590781272, 0.1831410759078127, 0.1931410759078127, 0.20314107590781272, 0.2131410759078127, 0.2231410759078127, 0.23314107590781272, 0.2431410759078127, 0.2531410759078127, 0.2631410759078127, 0.2731410759078127, 0.28314107590781273, 0.2931410759078127, 0.3031410759078127, 0.3131410759078127, 0.3231410759078127, 0.3331410759078127, 0.34314107590781273, 0.35314107590781274, 0.3631410759078127, 0.3731410759078127, 0.3831410759078127, 0.3931410759078127, 0.40314107590781273, 0.41314107590781274, 0.4231410759078127, 0.4331410759078127, 0.4431410759078127, 0.4531410759078127, 0.4631410759078127, 0.47314107590781274, 0.4831410759078127, 0.4931410759078127, 0.5031410759078128, 0.5131410759078128, 0.5231410759078128, 0.5331410759078128, 0.5431410759078128, 0.5531410759078128]}, {"amplitude": [9.94902592709083, 9.99902592709083, 10.04902592709083, 10.09902592709083, 10.149025927090829, 10.19902592709083, 10.24902592709083, 10.29902592709083, 10.34902592709083, 10.399025927090829, 10.44902592709083, 10.49902592709083, 10.54902592709083, 10.59902592709083, 10.649025927090829, 10.69902592709083, 10.74902592709083, 10.79902592709083, 10.84902592709083, 10.899025927090829, 10.94902592709083, 10.99902592709083, 11.04902592709083, 11.09902592709083, 11.149025927090829, 11.19902592709083, 11.24902592709083, 11.29902592709083, 11.34902592709083, 11.399025927090829, 11.44902592709083, 11.49902592709083, 11.54902592709083, 11.59902592709083, 11.649025927090829, 11.69902592709083, 11.74902592709083, 11.79902592709083, 11.84902592709083, 11.899025927090829, 11.94902592709083, 11.99902592709083, 12.04902592709083, 12.09902592709083, 12.149025927090829, 12.19902592709083, 12.24902592709083, 12.29902592709083, 12.34902592709083, 12.399025927090829, 12.44902592709083, 12.49902592709083, 12.54902592709083, 12.59902592709083, 12.649025927090829, 12.69902592709083], "phase": [-0.006279051952931217, 0.003720948047068783, 0.013720948047068783, 0.02372094804706878, 0.03372094804706878, 0.04372094804706879, 0.053720948047068784, 0.06372094804706879, 0.07372094804706879, 0.08372094804706878, 0.09372094804706879, 0.10372094804706879, 0.11372094804706878, 0.12372094804706879, 0.1337209480470688, 0.14372094804706878, 0.1537209480470688, 0.1637209480470688, 0.17372094804706878, 0.1837209480470688, 0.1937209480470688, 0.20372094804706878, 0.2137209480470688, 0.2237209480470688, 0.23372094804706878, 0.2437209480470688, 0.2537209480470688, 0.2637209480470688, 0.2737209480470688, 0.28372094804706877, 0.2937209480470688, 0.3037209480470688, 0.3137209480470688, 0.3237209480470688, 0.3337209480470688, 0.3437209480470688, 0.3537209480470688, 0.3637209480470688, 0.3737209480470688, 0.3837209480470688, 0.3937209480470688, 0.4037209480470688, 0.41372094804706877, 0.4237209480470688, 0.4337209480470688, 0.4437209480470688, 0.4537209480470688, 0.4637209480470688, 0.47372094804706877, 0.4837209480470688, 0.4937209480470688, 0.5037209480470688, 0.5137209480470688, 0.5237209480470688, 0.5337209480470688, 0.5437209480470688]}, {"amplitude": [9.86346664560728, 9.913466645607281, 9.96346664560728, 10.01346664560728, 10.06346664560728, 10.11346664560728, 10.163466645607281, 10.21346664560728, 10.26346664560728, 10.31346664560728, 10.36346664560728, 10.413466645607281, 10.46346664560728, 10.51346664560728, 10.56346664560728, 10.61346664560728, 10.663466645607281, 10.71346664560728, 10.76346664560728, 10.81346664560728, 10.86346664560728, 10.913466645607281, 10.96346664560728, 11.01346664560728, 11.06346664560728, 11.11346664560728, 11.163466645607281, 11.21346664560728, 11.26346664560728, 11.31346664560728, 11.36346664560728, 11.413466645607281, 11.46346664560728, 11.51346664560728, 11.56346664560728, 11.61346664560728, 11.663466645607281, 11.71346664560728, 11.76346664560728, 11.81346664560728, 11.86346664560728, 11.913466645607281, 11.96346664560728, 12.01346664560728, 12.06346664560728, 12.11346664560728, 12.163466645607281, 12.21346664560728, 12.26346664560728, 12.31346664560728, 12.36346664560728, 12.413466645607281, 12.46346664560728, 12.51346664560728, 12.56346664560728, 12.61346664560728], "phase": [-0.01564344650402309, -0.005643446504023089, 0.0043565534959769114, 0.01435655349597691, 0.024356553495976912, 0.03435655349597691, 0.044356553495976905, 0.054356553495976914, 0.06435655349597691, 0.0743565534959769, 0.08435655349597691, 0.09435655349597691, 0.1043565534959769, 0.11435655349597691, 0.12435655349597692, 0.13435655349597692, 0.14435655349597692, 0.15435655349597693, 0.16435655349597691, 0.17435655349597692, 0.18435655349597693, 0.1943565534959769, 0.20435655349597692, 0.21435655349597693, 0.2243565534959769, 0.23435655349597692, 0.24435655349597693, 0.2543565534959769, 0.2643565534959769, 0.2743565534959769, 0.2843565534959769, 0.2943565534959769, 0.3043565534959769, 0.3143565534959769, 0.3243565534959769, 0.3343565534959769, 0.3443565534959769, 0.3543565534959769, 0.3643565534959769, 0.3743565534959769, 0.3843565534959769, 0.3943565534959769, 0.4043565534959769, 0.4143565534959769, 0.4243565534959769, 0.4343565534959769, 0.4443565534959769, 0.4543565534959769, 0.4643565534959769, 0.4743565534959769, 0.4843565534959769, 0.4943565534959769, 0.504356553495977, 0.514356553495977, 0.524356553495977, 0.534356553495977]}, {"amplitude": [9.755918603320893, 9.805918603320894, 9.855918603320893, 9.905918603320893, 9.955918603320892, 10.005918603320893, 10.055918603320894, 10.105918603320893, 10.155918603320893, 10.205918603320892, 10.255918603320893, 10.305918603320894, 10.355918603320893, 10.405918603320893, 10.455918603320892, 10.505918603320893, 10.555918603320894, 10.605918603320893, 10.655918603320893, 10.705918603320892, 10.755918603320893, 10.805918603320894, 10.855918603320893, 10.905918603320893, 10.955918603320892, 11.005918603320893, 11.055918603320894, 11.105918603320893, 11.155918603320893, 11.205918603320892, 11.255918603320893, 11.305918603320894, 11.355918603320893, 11.405918603320893, 11.455918603320892, 11.505918603320893, 11.555918603320894, 11.605918603320893, 11.655918603320893, 11.705918603320892, 11.755918603320893, 11.805918603320894, 11.855918603320893, 11.905918603320893, 11.955918603320892, 12.005918603320893, 12.055918603320894, 12.105918603320893, 12.155918603320893, 12.205918603320892, 12.255918603320893, 12.305918603320894, 12.355918603320893, 12.405918603320893, 12.455918603320892, 12.505918603320893], "phase": [-0.0248689887164856, -0.014868988716485601, -0.004868988716485601, 0.005131011283514397, 0.0151310112835144, 0.0251310112835144, 0.035131011283514396, 0.045131011283514405, 0.0551310112835144, 0.0651310112835144, 0.0751310112835144, 0.0851310112835144, 0.0951310112835144, 0.1051310112835144, 0.11513101128351441, 0.1251310112835144, 0.1351310112835144, 0.1451310112835144, 0.1551310112835144, 0.1651310112835144, 0.1751310112835144, 0.1851310112835144, 0.1951310112835144, 0.2051310112835144, 0.2151310112835144, 0.2251310112835144, 0.2351310112835144, 0.24513101128351442, 0.25513101128351445, 0.26513101128351435, 0.27513101128351436, 0.28513101128351437, 0.2951310112835144, 0.3051310112835144, 0.3151310112835144, 0.3251310112835144, 0.3351310112835144, 0.3451310112835144, 0.35513101128351443, 0.36513101128351444, 0.37513101128351445, 0.38513101128351446, 0.39513101128351436, 0.40513101128351436, 0.4151310112835144, 0.4251310112835144, 0.4351310112835144, 0.4451310112835144, 0.4551310112835144, 0.4651310112835144, 0.4751310112835144, 0.48513101128351444, 0.49513101128351444, 0.5051310112835145, 0.5151310112835145, 0.5251310112835145]}, {"amplitude": [9.617210334728025, 9.667210334728026, 9.717210334728025, 9.767210334728025, 9.817210334728024, 9.867210334728025, 9.917210334728026, 9.967210334728025, 10.017210334728025, 10.067210334728024, 10.117210334728025, 10.167210334728026, 10.217210334728025, 10.267210334728025, 10.317210334728024, 10.367210334728025, 10.417210334728026, 10.467210334728025, 10.517210334728025, 10.567210334728024, 10.617210334728025, 10.667210334728026, 10.717210334728025, 10.767210334728025, 10.817210334728024, 10.867210334728025, 10.917210334728026, 10.967210334728025, 11.017210334728025, 11.067210334728024, 11.117210334728025, 11.167210334728026, 11.217210334728025, 11.267210334728025, 11.317210334728024, 11.367210334728025, 11.417210334728026, 11.467210334728025, 11.517210334728025, 11.567210334728024, 11.617210334728025, 11.667210334728026, 11.717210334728025, 11.767210334728025, 11.817210334728024, 11.867210334728025, 11.917210334728026, 11.967210334728025, 12.017210334728025, 12.067210334728024, 12.117210334728025, 12.167210334728026, 12.217210334728025, 12.267210334728025, 12.317210334728024, 12.367210334728025], "phase": [-0.03387379202452904, -0.023873792024529036, -0.013873792024529038, -0.0038737920245290394, 0.0061262079754709625, 0.016126207975470964, 0.02612620797547096, 0.03612620797547097, 0.04612620797547096, 0.05612620797547096, 0.06612620797547097, 0.07612620797547096, 0.08612620797547096, 0.09612620797547097, 0.10612620797547098, 0.11612620797547096, 0.12612620797547097, 0.13612620797547098, 0.14612620797547096, 0.15612620797547097, 0.16612620797547098, 0.17612620797547096, 0.18612620797547097, 0.19612620797547098, 0.20612620797547096, 0.21612620797547097, 0.22612620797547098, 0.236126207975471, 0.246126207975471, 0.2561262079754709, 0.26612620797547093, 0.27612620797547094, 0.28612620797547095, 0.29612620797547096, 0.30612620797547097, 0.316126207975471, 0.3261262079754709, 0.33612620797547094, 0.34612620797547095, 0.35612620797547095, 0.36612620797547096, 0.37612620797547097, 0.3861262079754709, 0.39612620797547093, 0.40612620797547094, 0.41612620797547095, 0.42612620797547096, 0.43612620797547097, 0.4461262079754709, 0.45612620797547093, 0.46612620797547094, 0.47612620797547095, 0.48612620797547096, 0.49612620797547097, 0.506126207975471, 0.516126207975471]}, {"amplitude": [9.44312759208846, 9.493127592088461, 9.54312759208846, 9.59312759208846, 9.64312759208846, 9.69312759208846, 9.743127592088461, 9.79312759208846, 9.84312759208846, 9.89312759208846, 9.94312759208846, 9.993127592088461, 10.04312759208846, 10.09312759208846, 10.14312759208846, 10.19312759208846, 10.243127592088461, 10.29312759208846, 10.34312759208846, 10.39312759208846, 10.44312759208846, 10.493127592088461, 10.54312759208846, 10.59312759208846, 10.64312759208846, 10.69312759208846, 10.743127592088461, 10.79312759208846, 10.84312759208846, 10.89312759208846, 10.94312759208846, 10.993127592088461, 11.04312759208846, 11.09312759208846, 11.14312759208846, 11.19312759208846, 11.243127592088461, 11.29312759208846, 11.34312759208846, 11.39312759208846, 11.44312759208846, 11.493127592088461, 11.54312759208846, 11.59312759208846, 11.64312759208846, 11.69312759208846, 11.743127592088461, 11.79312759208846, 11.84312759208846, 11.89312759208846, 11.94312759208846, 11.993127592088461, 12.04312759208846, 12.09312759208846, 12.14312759208846, 12.19312759208846], "phase": [-0.04257792915650729, -0.032577929156507285, -0.022577929156507286, -0.012577929156507288, -0.002577929156507286, 0.007422070843492716, 0.01742207084349271, 0.02742207084349272, 0.037422070843492715, 0.04742207084349271, 0.05742207084349272, 0.06742207084349272, 0.0774220708434927, 0.08742207084349271, 0.09742207084349272, 0.1074220708434927, 0.11742207084349271, 0.12742207084349272, 0.1374220708434927, 0.1474220708434927, 0.15742207084349272, 0.1674220708434927, 0.1774220708434927, 0.18742207084349272, 0.1974220708434927, 0.2074220708434927, 0.21742207084349272, 0.22742207084349272, 0.23742207084349273, 0.2474220708434927, 0.2574220708434927, 0.26742207084349273, 0.27742207084349274, 0.28742207084349275, 0.29742207084349276, 0.30742207084349277, 0.3174220708434927, 0.32742207084349273, 0.33742207084349274, 0.34742207084349275, 0.35742207084349276, 0.36742207084349277, 0.3774220708434927, 0.3874220708434927, 0.39742207084349274, 0.40742207084349275, 0.41742207084349275, 0.42742207084349276, 0.4374220708434927, 0.4474220708434927, 0.45742207084349273, 0.46742207084349274, 0.47742207084349275, 0.48742207084349276, 0.49742207084349277, 0.5074220708434928]}, {"amplitude": [9.235215546149867, 9.285215546149868, 9.335215546149866, 9.385215546149867, 9.435215546149866, 9.485215546149867, 9.535215546149868, 9.585215546149866, 9.635215546149867, 9.685215546149866, 9.735215546149867, 9.785215546149868, 9.835215546149866, 9.885215546149867, 9.935215546149866, 9.985215546149867, 10.035215546149868, 10.085215546149866, 10.135215546149867, 10.185215546149866, 10.235215546149867, 10.285215546149868, 10.335215546149866, 10.385215546149867, 10.435215546149866, 10.485215546149867, 10.535215546149868, 10.585215546149866, 10.635215546149867, 10.685215546149866, 10.735215546149867, 10.785215546149868, 10.835215546149866, 10.885215546149867, 10.935215546149866, 10.985215546149867, 11.035215546149868, 11.085215546149866, 11.135215546149867, 11.185215546149866, 11.235215546149867, 11.285215546149868, 11.335215546149866, 11.385215546149867, 11.435215546149866, 11.485215546149867, 11.535215546149868, 11.585215546149866, 11.635215546149867, 11.685215546149866, 11.735215546149867, 11.785215546149868, 11.835215546149866, 11.885215546149867, 11.935215546149866, 11.985215546149867], "phase": [-0.05090414157503695, -0.04090414157503695, -0.030904141575036948, -0.02090414157503695, -0.010904141575036948, -0.0009041415750369458, 0.00909585842496305, 0.019095858424963058, 0.029095858424963053, 0.03909585842496305, 0.04909585842496306, 0.05909585842496305, 0.06909585842496305, 0.07909585842496306, 0.08909585842496306, 0.09909585842496305, 0.10909585842496305, 0.11909585842496306, 0.12909585842496304, 0.13909585842496305, 0.14909585842496306, 0.15909585842496304, 0.16909585842496305, 0.17909585842496306, 0.18909585842496304, 0.19909585842496305, 0.20909585842496306, 0.21909585842496307, 0.22909585842496308, 0.23909585842496303, 0.24909585842496304, 0.2590958584249631, 0.2690958584249631, 0.2790958584249631, 0.2890958584249631, 0.2990958584249631, 0.309095858424963, 0.319095858424963, 0.32909585842496303, 0.33909585842496304, 0.34909585842496305, 0.35909585842496305, 0.36909585842496306, 0.3790958584249631, 0.3890958584249631, 0.3990958584249631, 0.4090958584249631, 0.4190958584249631, 0.429095858424963, 0.439095858424963, 0.449095858424963, 0.45909585842496303, 0.46909585842496304, 0.47909585842496305, 0.48909585842496306, 0.49909585842496307]}, {"amplitude": [9.000765071102798, 9.050765071102798, 9.100765071102797, 9.150765071102798, 9.200765071102797, 9.250765071102798, 9.300765071102798, 9.350765071102797, 9.400765071102798, 9.450765071102797, 9.500765071102798, 9.550765071102798, 9.600765071102797, 9.650765071102798, 9.700765071102797, 9.750765071102798, 9.800765071102798, 9.850765071102797, 9.900765071102798, 9.950765071102797, 10.000765071102798, 10.050765071102798, 10.100765071102797, 10.150765071102798, 10.200765071102797, 10.250765071102798, 10.300765071102798, 10.350765071102797, 10.400765071102798, 10.450765071102797, 10.500765071102798, 10.550765071102798, 10.600765071102797, 10.650765071102798, 10.700765071102797, 10.750765071102798, 10.800765071102798, 10.850765071102797, 10.900765071102798, 10.950765071102797, 11.000765071102798, 11.050765071102798, 11.100765071102797, 11.150765071102798, 11.200765071102797, 11.250765071102798, 11.300765071102798, 11.350765071102797, 11.400765071102798, 11.450765071102797, 11.500765071102798, 11.550765071102798, 11.600765071102797, 11.650765071102798, 11.700765071102797, 11.750765071102798], "phase": [-0.05877852522924725, -0.04877852522924725, -0.038778525229247254, -0.028778525229247252, -0.01877852522924725, -0.008778525229247248, 0.0012214747707527465, 0.011221474770752755, 0.02122147477075275, 0.031221474770752745, 0.041221474770752754, 0.05122147477075275, 0.061221474770752744, 0.07122147477075275, 0.08122147477075276, 0.09122147477075274, 0.10122147477075275, 0.11122147477075275, 0.12122147477075274, 0.13122147477075274, 0.14122147477075275, 0.15122147477075273, 0.16122147477075274, 0.17122147477075275, 0.18122147477075273, 0.19122147477075274, 0.20122147477075275, 0.21122147477075276, 0.22122147477075277, 0.23122147477075272, 0.24122147477075273, 0.25122147477075274, 0.26122147477075275, 0.27122147477075276, 0.28122147477075277, 0.2912214747707528, 0.30122147477075273, 0.31122147477075274, 0.32122147477075275, 0.33122147477075276, 0.34122147477075276, 0.3512214747707528, 0.3612214747707527, 0.37122147477075274, 0.38122147477075274, 0.39122147477075275, 0.40122147477075276, 0.41122147477075277, 0.4212214747707527, 0.43122147477075273, 0.44122147477075274, 0.45122147477075275, 0.46122147477075276, 0.47122147477075277, 0.4812214747707528, 0.4912214747707528]}, {"amplitude": [8.751983235502152, 8.801983235502153, 8.851983235502152, 8.901983235502152, 8.951983235502151, 9.001983235502152, 9.051983235502153, 9.101983235502152, 9.151983235502152, 9.201983235502151, 9.251983235502152, 9.301983235502153, 9.351983235502152, 9.401983235502152, 9.451983235502151, 9.501983235502152, 9.551983235502153, 9.601983235502152, 9.651983235502152, 9.701983235502151, 9.751983235502152, 9.801983235502153, 9.851983235502152, 9.901983235502152, 9.951983235502151, 10.001983235502152, 10.051983235502153, 10.101983235502152, 10.151983235502152, 10.201983235502151, 10.251983235502152, 10.301983235502153, 10.351983235502152, 10.401983235502152, 10.451983235502151, 10.501983235502152, 10.551983235502153, 10.601983235502152, 10.651983235502152, 10.701983235502151, 10.751983235502152, 10.801983235502153, 10.851983235502152, 10.901983235502152, 10.951983235502151, 11.001983235502152, 11.051983235502153, 11.101983235502152, 11.151983235502152, 11.201983235502151, 11.251983235502152, 11.301983235502153, 11.351983235502152, 11.401983235502152, 11.451983235502151, 11.501983235502152], "phase": [-0.06613118653236522, -0.056131186532365214, -0.04613118653236521, -0.03613118653236522, -0.026131186532365215, -0.016131186532365213, -0.006131186532365218, 0.0038688134676347907, 0.013868813467634786, 0.02386881346763478, 0.03386881346763479, 0.043868813467634785, 0.05386881346763478, 0.06386881346763479, 0.0738688134676348, 0.08386881346763478, 0.09386881346763479, 0.1038688134676348, 0.11386881346763478, 0.12386881346763479, 0.1338688134676348, 0.14386881346763478, 0.15386881346763479, 0.1638688134676348, 0.17386881346763478, 0.18386881346763478, 0.1938688134676348, 0.2038688134676348, 0.2138688134676348, 0.22386881346763476, 0.23386881346763477, 0.24386881346763478, 0.2538688134676348, 0.2638688134676348, 0.2738688134676348, 0.2838688134676348, 0.29386881346763477, 0.3038688134676348, 0.3138688134676348, 0.3238688134676348, 0.3338688134676348, 0.3438688134676348, 0.35386881346763477, 0.3638688134676348, 0.3738688134676348, 0.3838688134676348, 0.3938688134676348, 0.4038688134676348, 0.41386881346763477, 0.4238688134676348, 0.4338688134676348, 0.4438688134676348, 0.4538688134676348, 0.4638688134676348, 0.4738688134676348, 0.48386881346763483]}, {"amplitude": [8.504462775087891, 8.554462775087892, 8.60446277508789, 8.654462775087891, 8.70446277508789, 8.754462775087891, 8.804462775087892, 8.85446277508789, 8.904462775087891, 8.95446277508789, 9.004462775087891, 9.054462775087892, 9.10446277508789, 9.154462775087891, 9.20446277508789, 9.254462775087891, 9.304462775087892, 9.35446277508789, 9.404462775087891, 9.45446277508789, 9.504462775087891, 9.554462775087892, 9.60446277508789, 9.654462775087891, 9.70446277508789, 9.754462775087891, 9.804462775087892, 9.85446277508789, 9.904462775087891, 9.95446277508789, 10.004462775087891, 10.054462775087892, 10.10446277508789, 10.154462775087891, 10.20446277508789, 10.254462775087891, 10.304462775087892, 10.35446277508789, 10.404462775087891, 10.45446277508789, 10.504462775087891, 10.554462775087892, 10.60446277508789, 10.654462775087891, 10.70446277508789, 10.754462775087891, 10.804462775087892, 10.85446277508789, 10.904462775087891, 10.95446277508789, 11.004462775087891, 11.054462775087892, 11.10446277508789, 11.154462775087891, 11.20446277508789, 11.254462775087891], "phase": [-0.07289686274214102, -0.06289686274214103, -0.05289686274214102, -0.04289686274214102, -0.03289686274214102, -0.02289686274214102, -0.012896862742141024, -0.0028968627421410154, 0.00710313725785898, 0.017103137257858975, 0.027103137257858984, 0.03710313725785898, 0.047103137257858974, 0.05710313725785898, 0.06710313725785899, 0.07710313725785897, 0.08710313725785898, 0.09710313725785899, 0.10710313725785897, 0.11710313725785898, 0.127103137257859, 0.13710313725785897, 0.14710313725785898, 0.157103137257859, 0.16710313725785897, 0.17710313725785898, 0.187103137257859, 0.197103137257859, 0.207103137257859, 0.21710313725785896, 0.22710313725785897, 0.23710313725785898, 0.24710313725785898, 0.257103137257859, 0.267103137257859, 0.277103137257859, 0.28710313725785896, 0.297103137257859, 0.307103137257859, 0.317103137257859, 0.327103137257859, 0.337103137257859, 0.34710313725785896, 0.35710313725785897, 0.367103137257859, 0.377103137257859, 0.387103137257859, 0.397103137257859, 0.40710313725785896, 0.41710313725785897, 0.427103137257859, 0.437103137257859, 0.447103137257859, 0.457103137257859, 0.467103137257859, 0.477103137257859]}, {"amplitude": [8.275163873018105, 8.325163873018106, 8.375163873018105, 8.425163873018105, 8.475163873018104, 8.525163873018105, 8.575163873018106, 8.625163873018105, 8.675163873018105, 8.725163873018104, 8.775163873018105, 8.825163873018106, 8.875163873018105, 8.925163873018105, 8.975163873018104, 9.025163873018105, 9.075163873018106, 9.125163873018105, 9.175163873018105, 9.225163873018104, 9.275163873018105, 9.325163873018106, 9.375163873018105, 9.425163873018105, 9.475163873018104, 9.525163873018105, 9.575163873018106, 9.625163873018105, 9.675163873018105, 9.725163873018104, 9.775163873018105, 9.825163873018106, 9.875163873018105, 9.925163873018105, 9.975163873018104, 10.025163873018105, 10.075163873018106, 10.125163873018105, 10.175163873018105, 10.225163873018104, 10.275163873018105, 10.325163873018106, 10.375163873018105, 10.425163873018105, 10.475163873018104, 10.525163873018105, 10.575163873018106, 10.625163873018105, 10.675163873018105, 10.725163873018104, 10.775163873018105, 10.825163873018106, 10.875163873018105, 10.925163873018105, 10.975163873018104, 11.025163873018105], "phase": [-0.07901550123756901, -0.06901550123756901, -0.059015501237569004, -0.04901550123756901, -0.03901550123756901, -0.029015501237569005, -0.01901550123756901, -0.009015501237569001, 0.0009844987624309937, 0.010984498762430989, 0.020984498762430998, 0.030984498762430993, 0.04098449876243099, 0.050984498762430996, 0.060984498762431005, 0.07098449876243099, 0.080984498762431, 0.090984498762431, 0.10098449876243099, 0.110984498762431, 0.120984498762431, 0.13098449876243098, 0.140984498762431, 0.150984498762431, 0.16098449876243098, 0.170984498762431, 0.180984498762431, 0.190984498762431, 0.20098449876243102, 0.21098449876243097, 0.22098449876243098, 0.230984498762431, 0.240984498762431, 0.250984498762431, 0.260984498762431, 0.270984498762431, 0.280984498762431, 0.290984498762431, 0.300984498762431, 0.310984498762431, 0.320984498762431, 0.330984498762431, 0.340984498762431, 0.350984498762431, 0.360984498762431, 0.370984498762431, 0.380984498762431, 0.390984498762431, 0.400984498762431, 0.410984498762431, 0.420984498762431, 0.430984498762431, 0.440984498762431, 0.450984498762431, 0.460984498762431, 0.47098449876243104]}, {"amplitude": [8.080190176163239, 8.13019017616324, 8.180190176163238, 8.230190176163239, 8.280190176163238, 8.330190176163239, 8.38019017616324, 8.430190176163238, 8.480190176163239, 8.530190176163238, 8.580190176163239, 8.63019017616324, 8.680190176163238, 8.730190176163239, 8.780190176163238, 8.830190176163239, 8.88019017616324, 8.930190176163238, 8.980190176163239, 9.030190176163238, 9.080190176163239, 9.13019017616324, 9.180190176163238, 9.230190176163239, 9.280190176163238, 9.330190176163239, 9.38019017616324, 9.430190176163238, 9.480190176163239, 9.530190176163238, 9.580190176163239, 9.63019017616324, 9.680190176163238, 9.730190176163239, 9.780190176163238, 9.830190176163239, 9.88019017616324, 9.930190176163238, 9.980190176163239, 10.030190176163238, 10.080190176163239, 10.13019017616324, 10.180190176163238, 10.230190176163239, 10.280190176163238, 10.330190176163239, 10.38019017616324, 10.430190176163238, 10.480190176163239, 10.530190176163238, 10.580190176163239, 10.63019017616324, 10.680190176163238, 10.730190176163239, 10.780190176163238, 10.830190176163239], "phase": [-0.08443279255020135, -0.07443279255020135, -0.06443279255020135, -0.05443279255020135, -0.04443279255020135, -0.03443279255020135, -0.02443279255020135, -0.014432792550201343, -0.004432792550201348, 0.005567207449798647, 0.015567207449798656, 0.02556720744979865, 0.035567207449798646, 0.045567207449798655, 0.055567207449798664, 0.06556720744979865, 0.07556720744979865, 0.08556720744979866, 0.09556720744979864, 0.10556720744979865, 0.11556720744979866, 0.12556720744979866, 0.13556720744979867, 0.14556720744979867, 0.15556720744979863, 0.16556720744979864, 0.17556720744979865, 0.18556720744979865, 0.19556720744979866, 0.20556720744979862, 0.21556720744979863, 0.22556720744979863, 0.23556720744979864, 0.24556720744979865, 0.25556720744979866, 0.26556720744979867, 0.2755672074497986, 0.28556720744979863, 0.29556720744979864, 0.30556720744979865, 0.31556720744979866, 0.32556720744979867, 0.3355672074497986, 0.34556720744979863, 0.35556720744979864, 0.36556720744979865, 0.37556720744979866, 0.38556720744979867, 0.3955672074497986, 0.40556720744979863, 0.41556720744979864, 0.42556720744979865, 0.43556720744979865, 0.44556720744979866, 0.4555672074497987, 0.4655672074497987]}, {"amplitude": [7.93266999673472, 7.982669996734721, 8.03266999673472, 8.08266999673472, 8.13266999673472, 8.18266999673472, 8.232669996734721, 8.28266999673472, 8.33266999673472, 8.38266999673472, 8.43266999673472, 8.482669996734721, 8.53266999673472, 8.58266999673472, 8.63266999673472, 8.68266999673472, 8.732669996734721, 8.78266999673472, 8.83266999673472, 8.88266999673472, 8.93266999673472, 8.982669996734721, 9.03266999673472, 9.08266999673472, 9.13266999673472, 9.18266999673472, 9.232669996734721, 9.28266999673472, 9.33266999673472, 9.38266999673472, 9.43266999673472, 9.482669996734721, 9.53266999673472, 9.58266999673472, 9.63266999673472, 9.68266999673472, 9.732669996734721, 9.78266999673472, 9.83266999673472, 9.88266999673472, 9.93266999673472, 9.982669996734721, 10.03266999673472, 10.08266999673472, 10.13266999673472, 10.18266999673472, 10.232669996734721, 10.28266999673472, 10.33266999673472, 10.38266999673472, 10.43266999673472, 10.482669996734721, 10.53266999673472, 10.58266999673472, 10.63266999673472, 10.68266999673472], "phase": [-0.0891006524188367, -0.07910065241883671, -0.0691006524188367, -0.059100652418836705, -0.0491006524188367, -0.0391006524188367, -0.029100652418836706, -0.019100652418836697, -0.009100652418836702, 0.0008993475811632928, 0.010899347581163302, 0.020899347581163297, 0.03089934758116329, 0.0408993475811633, 0.05089934758116331, 0.06089934758116329, 0.0708993475811633, 0.08089934758116331, 0.09089934758116329, 0.1008993475811633, 0.11089934758116331, 0.12089934758116329, 0.13089934758116328, 0.1408993475811633, 0.1508993475811633, 0.1608993475811633, 0.17089934758116332, 0.18089934758116333, 0.19089934758116334, 0.2008993475811633, 0.2108993475811633, 0.2208993475811633, 0.23089934758116332, 0.24089934758116333, 0.25089934758116333, 0.26089934758116334, 0.2708993475811633, 0.2808993475811633, 0.2908993475811633, 0.3008993475811633, 0.31089934758116333, 0.32089934758116334, 0.3308993475811633, 0.3408993475811633, 0.3508993475811633, 0.3608993475811633, 0.37089934758116333, 0.38089934758116334, 0.3908993475811633, 0.4008993475811633, 0.4108993475811633, 0.4208993475811633, 0.43089934758116333, 0.44089934758116334, 0.45089934758116335, 0.46089934758116335]}, {"amplitude": [7.841039009695017, 7.891039009695017, 7.941039009695016, 7.991039009695017, 8.041039009695016, 8.091039009695017, 8.141039009695017, 8.191039009695016, 8.241039009695017, 8.291039009695016, 8.341039009695017, 8.391039009695017, 8.441039009695016, 8.491039009695017, 8.541039009695016, 8.591039009695017, 8.641039009695017, 8.691039009695016, 8.741039009695017, 8.791039009695016, 8.841039009695017, 8.891039009695017, 8.941039009695016, 8.991039009695017, 9.041039009695016, 9.091039009695017, 9.141039009695017, 9.191039009695016, 9.241039009695017, 9.291039009695016, 9.341039009695017, 9.391039009695017, 9.441039009695016, 9.491039009695017, 9.541039009695016, 9.591039009695017, 9.641039009695017, 9.691039009695016, 9.741039009695017, 9.791039009695016, 9.841039009695017, 9.891039009695017, 9.941039009695016, 9.991039009695017, 10.041039009695016, 10.091039009695017, 10.141039009695017, 10.191039009695016, 10.241039009695017, 10.291039009695016, 10.341039009695017, 10.391039009695017, 10.441039009695016, 10.491039009695017, 10.541039009695016, 10.591039009695017], "phase": [-0.09297764858882512, -0.08297764858882513, -0.07297764858882512, -0.06297764858882512, -0.05297764858882512, -0.04297764858882512, -0.032977648588825126, -0.022977648588825117, -0.012977648588825122, -0.002977648588825127, 0.007022351411174882, 0.017022351411174877, 0.027022351411174872, 0.03702235141117488, 0.04702235141117489, 0.05702235141117487, 0.06702235141117488, 0.07702235141117489, 0.08702235141117487, 0.09702235141117488, 0.10702235141117489, 0.11702235141117487, 0.12702235141117488, 0.1370223514111749, 0.14702235141117487, 0.15702235141117488, 0.16702235141117489, 0.1770223514111749, 0.1870223514111749, 0.19702235141117486, 0.20702235141117487, 0.21702235141117487, 0.22702235141117488, 0.2370223514111749, 0.2470223514111749, 0.2570223514111749, 0.26702235141117486, 0.27702235141117487, 0.2870223514111749, 0.2970223514111749, 0.3070223514111749, 0.3170223514111749, 0.32702235141117486, 0.33702235141117487, 0.3470223514111749, 0.3570223514111749, 0.3670223514111749, 0.3770223514111749, 0.38702235141117486, 0.39702235141117487, 0.4070223514111749, 0.4170223514111749, 0.4270223514111749, 0.4370223514111749, 0.4470223514111749, 0.4570223514111749]}, {"amplitude": [7.807964512906309, 7.857964512906309, 7.907964512906308, 7.957964512906309, 8.007964512906309, 8.05796451290631, 8.10796451290631, 8.15796451290631, 8.20796451290631, 8.257964512906309, 8.30796451290631, 8.35796451290631, 8.40796451290631, 8.45796451290631, 8.507964512906309, 8.55796451290631, 8.60796451290631, 8.65796451290631, 8.70796451290631, 8.757964512906309, 8.80796451290631, 8.85796451290631, 8.90796451290631, 8.95796451290631, 9.007964512906309, 9.05796451290631, 9.10796451290631, 9.15796451290631, 9.20796451290631, 9.257964512906309, 9.30796451290631, 9.35796451290631, 9.40796451290631, 9.45796451290631, 9.507964512906309, 9.55796451290631, 9.60796451290631, 9.65796451290631, 9.70796451290631, 9.757964512906309, 9.80796451290631, 9.85796451290631, 9.90796451290631, 9.95796451290631, 10.007964512906309, 10.05796451290631, 10.10796451290631, 10.15796451290631, 10.20796451290631, 10.257964512906309, 10.30796451290631, 10.35796451290631, 10.40796451290631, 10.45796451290631, 10.507964512906309, 10.55796451290631], "phase": [-0.09602936856769423, -0.08602936856769423, -0.07602936856769422, -0.06602936856769423, -0.05602936856769423, -0.046029368567694226, -0.03602936856769423, -0.026029368567694222, -0.016029368567694227, -0.006029368567694232, 0.003970631432305777, 0.013970631432305772, 0.023970631432305767, 0.033970631432305776, 0.043970631432305785, 0.053970631432305766, 0.06397063143230577, 0.07397063143230578, 0.08397063143230576, 0.09397063143230577, 0.10397063143230578, 0.11397063143230576, 0.12397063143230577, 0.13397063143230578, 0.14397063143230576, 0.15397063143230577, 0.16397063143230578, 0.1739706314323058, 0.1839706314323058, 0.19397063143230575, 0.20397063143230576, 0.21397063143230577, 0.22397063143230578, 0.2339706314323058, 0.2439706314323058, 0.2539706314323058, 0.26397063143230576, 0.27397063143230577, 0.2839706314323058, 0.2939706314323058, 0.3039706314323058, 0.3139706314323058, 0.32397063143230576, 0.33397063143230576, 0.3439706314323058, 0.3539706314323058, 0.3639706314323058, 0.3739706314323058, 0.38397063143230575, 0.39397063143230576, 0.40397063143230577, 0.4139706314323058, 0.4239706314323058, 0.4339706314323058, 0.4439706314323058, 0.4539706314323058]}, {"amplitude": [7.830061366764014, 7.880061366764015, 7.930061366764016, 7.980061366764017, 8.030061366764013, 8.080061366764014, 8.130061366764014, 8.180061366764015, 8.230061366764016, 8.280061366764013, 8.330061366764014, 8.380061366764014, 8.430061366764015, 8.480061366764016, 8.530061366764013, 8.580061366764014, 8.630061366764014, 8.680061366764015, 8.730061366764016, 8.780061366764013, 8.830061366764014, 8.880061366764014, 8.930061366764015, 8.980061366764016, 9.030061366764013, 9.080061366764014, 9.130061366764014, 9.180061366764015, 9.230061366764016, 9.280061366764013, 9.330061366764014, 9.380061366764014, 9.430061366764015, 9.480061366764016, 9.530061366764013, 9.580061366764014, 9.630061366764014, 9.680061366764015, 9.730061366764016, 9.780061366764013, 9.830061366764014, 9.880061366764014, 9.930061366764015, 9.980061366764016, 10.030061366764013, 10.080061366764014, 10.130061366764014, 10.180061366764015, 10.230061366764016, 10.280061366764013, 10.330061366764014, 10.380061366764014, 10.430061366764015, 10.480061366764016, 10.530061366764013, 10.580061366764014], "phase": [-0.09822872507286884, -0.08822872507286884, -0.07822872507286883, -0.06822872507286884, -0.05822872507286884, -0.048228725072868836, -0.03822872507286884, -0.028228725072868832, -0.018228725072868837, -0.008228725072868842, 0.0017712749271311667, 0.011771274927131162, 0.021771274927131157, 0.031771274927131166, 0.041771274927131175, 0.051771274927131156, 0.061771274927131165, 0.07177127492713117, 0.08177127492713115, 0.09177127492713116, 0.10177127492713117, 0.11177127492713115, 0.12177127492713116, 0.13177127492713117, 0.14177127492713115, 0.15177127492713116, 0.16177127492713117, 0.17177127492713118, 0.1817712749271312, 0.19177127492713114, 0.20177127492713115, 0.21177127492713116, 0.22177127492713117, 0.23177127492713118, 0.24177127492713119, 0.2517712749271312, 0.26177127492713115, 0.27177127492713116, 0.28177127492713117, 0.2917712749271312, 0.3017712749271312, 0.3117712749271312, 0.32177127492713115, 0.33177127492713115, 0.34177127492713116, 0.3517712749271312, 0.3617712749271312, 0.3717712749271312, 0.38177127492713114, 0.39177127492713115, 0.40177127492713116, 0.41177127492713117, 0.4217712749271312, 0.4317712749271312, 0.4417712749271312, 0.4517712749271312]}, {"amplitude": [7.8984387049884335, 7.948438704988434, 7.998438704988433, 8.048438704988433, 8.098438704988432, 8.148438704988433, 8.198438704988433, 8.248438704988432, 8.298438704988433, 8.348438704988432, 8.398438704988433, 8.448438704988433, 8.498438704988432, 8.548438704988433, 8.598438704988432, 8.648438704988433, 8.698438704988433, 8.748438704988432, 8.798438704988433, 8.848438704988432, 8.898438704988433, 8.948438704988433, 8.998438704988432, 9.048438704988433, 9.098438704988432, 9.148438704988433, 9.198438704988433, 9.248438704988432, 9.298438704988433, 9.348438704988432, 9.398438704988433, 9.448438704988433, 9.498438704988432, 9.548438704988433, 9.598438704988432, 9.648438704988433, 9.698438704988433, 9.748438704988432, 9.798438704988433, 9.848438704988432, 9.898438704988433, 9.948438704988433, 9.998438704988432, 10.048438704988433, 10.098438704988432, 10.148438704988433, 10.198438704988433, 10.248438704988432, 10.298438704988433, 10.348438704988432, 10.398438704988433, 10.448438704988433, 10.498438704988432, 10.548438704988433, 10.598438704988432, 10.648438704988433], "phase": [-0.09955619646030797, -0.08955619646030798, -0.07955619646030797, -0.06955619646030797, -0.05955619646030797, -0.04955619646030797, -0.039556196460307974, -0.029556196460307965, -0.01955619646030797, -0.009556196460307975, 0.0004438035396920337, 0.010443803539692029, 0.020443803539692024, 0.030443803539692033, 0.04044380353969204, 0.05044380353969202, 0.06044380353969203, 0.07044380353969204, 0.08044380353969202, 0.09044380353969203, 0.10044380353969204, 0.11044380353969202, 0.12044380353969203, 0.13044380353969204, 0.14044380353969202, 0.15044380353969203, 0.16044380353969204, 0.17044380353969205, 0.18044380353969205, 0.190443803539692, 0.20044380353969202, 0.21044380353969203, 0.22044380353969203, 0.23044380353969204, 0.24044380353969205, 0.2504438035396921, 0.260443803539692, 0.270443803539692, 0.280443803539692, 0.290443803539692, 0.300443803539692, 0.31044380353969203, 0.32044380353969204, 0.33044380353969205, 0.34044380353969206, 0.35044380353969207, 0.3604438035396921, 0.3704438035396921, 0.380443803539692, 0.390443803539692, 0.400443803539692, 0.410443803539692, 0.420443803539692, 0.430443803539692, 0.44044380353969204, 0.45044380353969204]}, {"amplitude": [7.9999999999999964, 8.049999999999997, 8.099999999999996, 8.149999999999997, 8.199999999999996, 8.249999999999996, 8.299999999999997, 8.349999999999996, 8.399999999999997, 8.449999999999996, 8.499999999999996, 8.549999999999997, 8.599999999999996, 8.649999999999997, 8.699999999999996, 8.749999999999996, 8.799999999999997, 8.849999999999996, 8.899999999999997, 8.949999999999996, 8.999999999999996, 9.049999999999997, 9.099999999999996, 9.149999999999997, 9.199999999999996, 9.249999999999996, 9.299999999999997, 9.349999999999996, 9.399999999999997, 9.449999999999996, 9.499999999999996, 9.549999999999997, 9.599999999999996, 9.649999999999997, 9.699999999999996, 9.749999999999996, 9.799999999999997, 9.849999999999996, 9.899999999999997, 9.949999999999996, 9.999999999999996, 10.049999999999997, 10.099999999999996, 10.149999999999997, 10.199999999999996, 10.249999999999996, 10.299999999999997, 10.349999999999996, 10.399999999999997, 10.449999999999996, 10.499999999999996, 10.549999999999997, 10.599999999999996, 10.649999999999997, 10.699999999999996, 10.749999999999996], "phase": [-0.1, -0.09000000000000001, -0.08, -0.07, -0.060000000000000005, -0.05, -0.04000000000000001, -0.03, -0.020000000000000004, -0.010000000000000009, 0.0, 0.009999999999999995, 0.01999999999999999, 0.03, 0.04000000000000001, 0.04999999999999999, 0.06, 0.07, 0.07999999999999999, 0.09, 0.1, 0.10999999999999999, 0.12, 0.13, 0.13999999999999999, 0.15, 0.16, 0.17, 0.18000000000000002, 0.18999999999999997, 0.19999999999999998, 0.21, 0.22, 0.23, 0.24000000000000002, 0.25, 0.26, 0.27, 0.28, 0.29000000000000004, 0.30000000000000004, 0.31000000000000005, 0.31999999999999995, 0.32999999999999996, 0.33999999999999997, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41000000000000003, 0.42000000000000004, 0.43000000000000005, 0.44000000000000006, 0.45000000000000007]}, {"amplitude": [8.119313436599247, 8.169313436599248, 8.219313436599247, 8.269313436599248, 8.319313436599247, 8.369313436599247, 8.419313436599248, 8.469313436599247, 8.519313436599248, 8.569313436599247, 8.619313436599247, 8.669313436599248, 8.719313436599247, 8.769313436599248, 8.819313436599247, 8.869313436599247, 8.919313436599248, 8.969313436599247, 9.019313436599248, 9.069313436599247, 9.119313436599247, 9.169313436599248, 9.219313436599247, 9.269313436599248, 9.319313436599247, 9.369313436599247, 9.419313436599248, 9.469313436599247, 9.519313436599248, 9.569313436599247, 9.619313436599247, 9.669313436599248, 9.719313436599247, 9.769313436599248, 9.819313436599247, 9.869313436599247, 9.919313436599248, 9.969313436599247, 10.019313436599248, 10.069313436599247, 10.119313436599247, 10.169313436599248, 10.219313436599247, 10.269313436599248, 10.319313436599247, 10.369313436599247, 10.419313436599248, 10.469313436599247, 10.519313436599248, 10.569313436599247, 10.619313436599247, 10.669313436599248, 10.719313436599247, 10.769313436599248, 10.819313436599247, 10.869313436599247], "phase": [-0.09955619646030799, -0.08955619646030799, -0.07955619646030798, -0.06955619646030799, -0.059556196460307985, -0.04955619646030798, -0.03955619646030799, -0.02955619646030798, -0.019556196460307984, -0.009556196460307989, 0.0004438035396920198, 0.010443803539692015, 0.02044380353969201, 0.03044380353969202, 0.04044380353969203, 0.05044380353969201, 0.06044380353969202, 0.07044380353969203, 0.08044380353969201, 0.09044380353969202, 0.10044380353969203, 0.110443803539692, 0.12044380353969202, 0.13044380353969204, 0.140443803539692, 0.150443803539692, 0.160443803539692, 0.17044380353969202, 0.18044380353969203, 0.19044380353969198, 0.200443803539692, 0.210443803539692, 0.220443803539692, 0.23044380353969202, 0.24044380353969202, 0.25044380353969203, 0.260443803539692, 0.270443803539692, 0.280443803539692, 0.290443803539692, 0.300443803539692, 0.31044380353969203, 0.320443803539692, 0.330443803539692, 0.340443803539692, 0.350443803539692, 0.360443803539692, 0.37044380353969203, 0.380443803539692, 0.390443803539692, 0.400443803539692, 0.410443803539692, 0.420443803539692, 0.430443803539692, 0.44044380353969204, 0.45044380353969204]}, {"amplitude": [8.24078963032123, 8.29078963032123, 8.340789630321229, 8.39078963032123, 8.440789630321229, 8.49078963032123, 8.54078963032123, 8.590789630321229, 8.64078963032123, 8.690789630321229, 8.74078963032123, 8.79078963032123, 8.840789630321229, 8.89078963032123, 8.940789630321229, 8.99078963032123, 9.04078963032123, 9.090789630321229, 9.14078963032123, 9.190789630321229, 9.24078963032123, 9.29078963032123, 9.340789630321229, 9.39078963032123, 9.440789630321229, 9.49078963032123, 9.54078963032123, 9.590789630321229, 9.64078963032123, 9.690789630321229, 9.74078963032123, 9.79078963032123, 9.840789630321229, 9.89078963032123, 9.940789630321229, 9.99078963032123, 10.04078963032123, 10.090789630321229, 10.14078963032123, 10.190789630321229, 10.24078963032123, 10.29078963032123, 10.340789630321229, 10.39078963032123, 10.440789630321229, 10.49078963032123, 10.54078963032123, 10.590789630321229, 10.64078963032123, 10.690789630321229, 10.74078963032123, 10.79078963032123, 10.840789630321229, 10.89078963032123, 10.940789630321229, 10.99078963032123], "phase": [-0.09822872507286888, -0.08822872507286889, -0.07822872507286888, -0.06822872507286888, -0.05822872507286888, -0.04822872507286888, -0.03822872507286888, -0.028228725072868874, -0.01822872507286888, -0.008228725072868884, 0.0017712749271311251, 0.01177127492713112, 0.021771274927131115, 0.031771274927131124, 0.04177127492713113, 0.051771274927131114, 0.06177127492713112, 0.07177127492713113, 0.08177127492713111, 0.09177127492713112, 0.10177127492713113, 0.11177127492713111, 0.12177127492713112, 0.13177127492713114, 0.1417712749271311, 0.1517712749271311, 0.16177127492713111, 0.17177127492713112, 0.18177127492713113, 0.19177127492713109, 0.2017712749271311, 0.2117712749271311, 0.2217712749271311, 0.23177127492713112, 0.24177127492713113, 0.25177127492713114, 0.2617712749271311, 0.2717712749271311, 0.2817712749271311, 0.2917712749271311, 0.30177127492713113, 0.31177127492713114, 0.3217712749271311, 0.3317712749271311, 0.3417712749271311, 0.3517712749271311, 0.3617712749271311, 0.37177127492713113, 0.3817712749271311, 0.3917712749271311, 0.4017712749271311, 0.4117712749271311, 0.4217712749271311, 0.43177127492713113, 0.44177127492713114, 0.45177127492713115]}, {"amplitude": [8.35086074438592, 8.400860744385922, 8.45086074438592, 8.500860744385921, 8.55086074438592, 8.60086074438592, 8.650860744385922, 8.70086074438592, 8.750860744385921, 8.80086074438592, 8.85086074438592, 8.900860744385922, 8.95086074438592, 9.000860744385921, 9.05086074438592, 9.10086074438592, 9.150860744385922, 9.20086074438592, 9.250860744385921, 9.30086074438592, 9.35086074438592, 9.400860744385922, 9.45086074438592, 9.500860744385921, 9.55086074438592, 9.60086074438592, 9.650860744385922, 9.70086074438592, 9.750860744385921, 9.80086074438592, 9.85086074438592, 9.900860744385922, 9.95086074438592, 10.000860744385921, 10.05086074438592, 10.10086074438592, 10.150860744385922, 10.20086074438592, 10.250860744385921, 10.30086074438592, 10.35086074438592, 10.400860744385922, 10.45086074438592, 10.500860744385921, 10.55086074438592, 10.60086074438592, 10.650860744385922, 10.70086074438592, 10.750860744385921, 10.80086074438592, 10.85086074438592, 10.900860744385922, 10.95086074438592, 11.000860744385921, 11.05086074438592, 11.10086074438592], "phase": [-0.09602936856769428, -0.08602936856769429, -0.07602936856769428, -0.06602936856769429, -0.056029368567694283, -0.04602936856769428, -0.036029368567694287, -0.026029368567694278, -0.016029368567694283, -0.006029368567694288, 0.003970631432305721, 0.013970631432305716, 0.02397063143230571, 0.03397063143230572, 0.04397063143230573, 0.05397063143230571, 0.06397063143230572, 0.07397063143230573, 0.08397063143230571, 0.09397063143230572, 0.10397063143230573, 0.11397063143230571, 0.12397063143230572, 0.13397063143230573, 0.1439706314323057, 0.15397063143230572, 0.16397063143230572, 0.17397063143230573, 0.18397063143230574, 0.1939706314323057, 0.2039706314323057, 0.2139706314323057, 0.22397063143230572, 0.23397063143230573, 0.24397063143230574, 0.25397063143230575, 0.2639706314323057, 0.2739706314323057, 0.2839706314323057, 0.29397063143230573, 0.30397063143230574, 0.31397063143230575, 0.3239706314323057, 0.3339706314323057, 0.3439706314323057, 0.3539706314323057, 0.36397063143230574, 0.37397063143230574, 0.3839706314323057, 0.3939706314323057, 0.4039706314323057, 0.4139706314323057, 0.42397063143230573, 0.43397063143230574, 0.44397063143230575, 0.45397063143230576]}, {"amplitude": [8.439855046751978, 8.489855046751979, 8.539855046751978, 8.589855046751978, 8.639855046751977, 8.689855046751978, 8.739855046751979, 8.789855046751978, 8.839855046751978, 8.889855046751977, 8.939855046751978, 8.989855046751979, 9.039855046751978, 9.089855046751978, 9.139855046751977, 9.189855046751978, 9.239855046751979, 9.289855046751978, 9.339855046751978, 9.389855046751977, 9.439855046751978, 9.489855046751979, 9.539855046751978, 9.589855046751978, 9.639855046751977, 9.689855046751978, 9.739855046751979, 9.789855046751978, 9.839855046751978, 9.889855046751977, 9.939855046751978, 9.989855046751979, 10.039855046751978, 10.089855046751978, 10.139855046751977, 10.189855046751978, 10.239855046751979, 10.289855046751978, 10.339855046751978, 10.389855046751977, 10.439855046751978, 10.489855046751979, 10.539855046751978, 10.589855046751978, 10.639855046751977, 10.689855046751978, 10.739855046751979, 10.789855046751978, 10.839855046751978, 10.889855046751977, 10.939855046751978, 10.989855046751979, 11.039855046751978, 11.089855046751978, 11.139855046751977, 11.189855046751978], "phase": [-0.09297764858882519, -0.0829776485888252, -0.07297764858882519, -0.0629776485888252, -0.05297764858882519, -0.04297764858882519, -0.032977648588825195, -0.022977648588825186, -0.012977648588825191, -0.0029776485888251963, 0.0070223514111748125, 0.017022351411174808, 0.027022351411174803, 0.03702235141117481, 0.04702235141117482, 0.0570223514111748, 0.06702235141117481, 0.07702235141117482, 0.0870223514111748, 0.09702235141117481, 0.10702235141117482, 0.1170223514111748, 0.1270223514111748, 0.1370223514111748, 0.1470223514111748, 0.15702235141117482, 0.16702235141117483, 0.17702235141117484, 0.18702235141117485, 0.1970223514111748, 0.2070223514111748, 0.21702235141117482, 0.22702235141117483, 0.23702235141117484, 0.24702235141117485, 0.25702235141117485, 0.2670223514111748, 0.2770223514111748, 0.2870223514111748, 0.29702235141117483, 0.30702235141117484, 0.31702235141117485, 0.3270223514111748, 0.3370223514111748, 0.3470223514111748, 0.35702235141117483, 0.36702235141117484, 0.37702235141117485, 0.3870223514111748, 0.3970223514111748, 0.4070223514111748, 0.41702235141117483, 0.42702235141117484, 0.43702235141117485, 0.44702235141117486, 0.45702235141117487]}, {"amplitude": [8.50330390651181, 8.553303906511811, 8.60330390651181, 8.65330390651181, 8.70330390651181, 8.75330390651181, 8.803303906511811, 8.85330390651181, 8.90330390651181, 8.95330390651181, 9.00330390651181, 9.053303906511811, 9.10330390651181, 9.15330390651181, 9.20330390651181, 9.25330390651181, 9.303303906511811, 9.35330390651181, 9.40330390651181, 9.45330390651181, 9.50330390651181, 9.553303906511811, 9.60330390651181, 9.65330390651181, 9.70330390651181, 9.75330390651181, 9.803303906511811, 9.85330390651181, 9.90330390651181, 9.95330390651181, 10.00330390651181, 10.053303906511811, 10.10330390651181, 10.15330390651181, 10.20330390651181, 10.25330390651181, 10.303303906511811, 10.35330390651181, 10.40330390651181, 10.45330390651181, 10.50330390651181, 10.553303906511811, 10.60330390651181, 10.65330390651181, 10.70330390651181, 10.75330390651181, 10.803303906511811, 10.85330390651181, 10.90330390651181, 10.95330390651181, 11.00330390651181, 11.053303906511811, 11.10330390651181, 11.15330390651181, 11.20330390651181, 11.25330390651181], "phase": [-0.0891006524188368, -0.0791006524188368, -0.0691006524188368, -0.0591006524188368, -0.0491006524188368, -0.0391006524188368, -0.029100652418836803, -0.019100652418836794, -0.0091006524188368, 0.0008993475811631957, 0.010899347581163205, 0.0208993475811632, 0.030899347581163195, 0.0408993475811632, 0.05089934758116321, 0.06089934758116319, 0.0708993475811632, 0.08089934758116321, 0.09089934758116319, 0.1008993475811632, 0.11089934758116321, 0.12089934758116319, 0.1308993475811632, 0.1408993475811632, 0.1508993475811632, 0.1608993475811632, 0.1708993475811632, 0.18089934758116322, 0.19089934758116323, 0.20089934758116318, 0.2108993475811632, 0.2208993475811632, 0.2308993475811632, 0.24089934758116321, 0.2508993475811632, 0.26089934758116323, 0.2708993475811632, 0.2808993475811632, 0.2908993475811632, 0.3008993475811632, 0.3108993475811632, 0.32089934758116323, 0.3308993475811632, 0.3408993475811632, 0.3508993475811632, 0.3608993475811632, 0.3708993475811632, 0.38089934758116323, 0.3908993475811632, 0.4008993475811632, 0.4108993475811632, 0.4208993475811632, 0.4308993475811632, 0.4408993475811632, 0.45089934758116323, 0.46089934758116324]}], "sample_rate_hz": 20.0} \ No newline at end of file diff --git a/python/tests/golden/mat_result.sha256 b/python/tests/golden/mat_result.sha256 new file mode 100644 index 00000000..4c482e26 --- /dev/null +++ b/python/tests/golden/mat_result.sha256 @@ -0,0 +1 @@ +ae46351e28c01161c3c20f1a3134d8e32fbbef0cda2fdb9c3a27984da0ce026d \ No newline at end of file diff --git a/python/tests/golden/meridian_input.json b/python/tests/golden/meridian_input.json new file mode 100644 index 00000000..33f7cd78 --- /dev/null +++ b/python/tests/golden/meridian_input.json @@ -0,0 +1 @@ +{"esp32_amplitude": [0.51171875, 0.5390625, 0.56640625, 0.59375, 0.62109375, 0.6484375, 0.67578125, 0.703125, 0.73046875, 0.7578125, 0.78515625, 0.8125, 0.83984375, 0.8671875, 0.89453125, 0.921875, 0.94921875, 0.9765625, 1.00390625, 1.03125, 1.05859375, 1.0859375, 1.11328125, 1.140625, 1.16796875, 1.1953125, 1.22265625, 1.25, 1.27734375, 1.3046875, 1.33203125, 1.359375, 1.38671875, 1.4140625, 1.44140625, 1.46875, 1.49609375, 0.5234375, 0.55078125, 0.578125, 0.60546875, 0.6328125, 0.66015625, 0.6875, 0.71484375, 0.7421875, 0.76953125, 0.796875, 0.82421875, 0.8515625, 0.87890625, 0.90625, 0.93359375, 0.9609375, 0.98828125, 1.015625, 1.04296875, 1.0703125, 1.09765625, 1.125, 1.15234375, 1.1796875, 1.20703125, 1.234375], "esp32_phase": [-0.45703125, -0.4375, -0.41796875, -0.3984375, -0.37890625, -0.359375, -0.33984375, -0.3203125, -0.30078125, -0.28125, -0.26171875, -0.2421875, -0.22265625, -0.203125, -0.18359375, -0.1640625, -0.14453125, -0.125, -0.10546875, -0.0859375, -0.06640625, -0.046875, -0.02734375, -0.0078125, 0.01171875, 0.03125, 0.05078125, 0.0703125, 0.08984375, 0.109375, 0.12890625, 0.1484375, 0.16796875, 0.1875, 0.20703125, 0.2265625, 0.24609375, 0.265625, 0.28515625, 0.3046875, 0.32421875, 0.34375, 0.36328125, 0.3828125, 0.40234375, 0.421875, 0.44140625, 0.4609375, 0.48046875, -0.5, -0.48046875, -0.4609375, -0.44140625, -0.421875, -0.40234375, -0.3828125, -0.36328125, -0.34375, -0.32421875, -0.3046875, -0.28515625, -0.265625, -0.24609375, -0.2265625], "intel_amplitude": [0.50390625, 0.546875, 0.58984375, 0.6328125, 0.67578125, 0.71875, 0.76171875, 0.8046875, 0.84765625, 0.890625, 0.93359375, 0.9765625, 1.01953125, 1.0625, 1.10546875, 1.1484375, 1.19140625, 1.234375, 1.27734375, 1.3203125, 1.36328125, 1.40625, 1.44921875, 1.4921875, 0.53515625, 0.578125, 0.62109375, 0.6640625, 0.70703125, 0.75], "intel_phase": [-0.47265625, -0.4609375, -0.44921875, -0.4375, -0.42578125, -0.4140625, -0.40234375, -0.390625, -0.37890625, -0.3671875, -0.35546875, -0.34375, -0.33203125, -0.3203125, -0.30859375, -0.296875, -0.28515625, -0.2734375, -0.26171875, -0.25, -0.23828125, -0.2265625, -0.21484375, -0.203125, -0.19140625, -0.1796875, -0.16796875, -0.15625, -0.14453125, -0.1328125], "ap_positions": [[0.25, 0.5, 0.75], [1.0, 1.25, 1.5], [2.0, 0.0, -0.5]], "rapid_frames": [[0.0, 0.01953125, 0.0390625, 0.05859375, 0.078125, 0.09765625, 0.1171875, 0.13671875, 0.15625, 0.17578125, 0.1953125, 0.21484375, 0.234375, 0.25390625, 0.2734375, 0.29296875], [0.05078125, 0.0703125, 0.08984375, 0.109375, 0.12890625, 0.1484375, 0.16796875, 0.1875, 0.20703125, 0.2265625, 0.24609375, 0.265625, 0.28515625, 0.3046875, 0.32421875, 0.34375], [0.1015625, 0.12109375, 0.140625, 0.16015625, 0.1796875, 0.19921875, 0.21875, 0.23828125, 0.2578125, 0.27734375, 0.296875, 0.31640625, 0.3359375, 0.35546875, 0.375, 0.39453125], [0.15234375, 0.171875, 0.19140625, 0.2109375, 0.23046875, 0.25, 0.26953125, 0.2890625, 0.30859375, 0.328125, 0.34765625, 0.3671875, 0.38671875, 0.40625, 0.42578125, 0.4453125], [0.203125, 0.22265625, 0.2421875, 0.26171875, 0.28125, 0.30078125, 0.3203125, 0.33984375, 0.359375, 0.37890625, 0.3984375, 0.41796875, 0.4375, 0.45703125, 0.4765625, 0.49609375], [0.25390625, 0.2734375, 0.29296875, 0.3125, 0.33203125, 0.3515625, 0.37109375, 0.390625, 0.41015625, 0.4296875, 0.44921875, 0.46875, 0.48828125, 0.5078125, 0.52734375, 0.546875], [0.3046875, 0.32421875, 0.34375, 0.36328125, 0.3828125, 0.40234375, 0.421875, 0.44140625, 0.4609375, 0.48046875, 0.5, 0.51953125, 0.5390625, 0.55859375, 0.578125, 0.59765625], [0.35546875, 0.375, 0.39453125, 0.4140625, 0.43359375, 0.453125, 0.47265625, 0.4921875, 0.51171875, 0.53125, 0.55078125, 0.5703125, 0.58984375, 0.609375, 0.62890625, 0.6484375], [0.40625, 0.42578125, 0.4453125, 0.46484375, 0.484375, 0.50390625, 0.5234375, 0.54296875, 0.5625, 0.58203125, 0.6015625, 0.62109375, 0.640625, 0.66015625, 0.6796875, 0.69921875], [0.45703125, 0.4765625, 0.49609375, 0.515625, 0.53515625, 0.5546875, 0.57421875, 0.59375, 0.61328125, 0.6328125, 0.65234375, 0.671875, 0.69140625, 0.7109375, 0.73046875, 0.75], [0.5078125, 0.52734375, 0.546875, 0.56640625, 0.5859375, 0.60546875, 0.625, 0.64453125, 0.6640625, 0.68359375, 0.703125, 0.72265625, 0.7421875, 0.76171875, 0.78125, 0.80078125], [0.55859375, 0.578125, 0.59765625, 0.6171875, 0.63671875, 0.65625, 0.67578125, 0.6953125, 0.71484375, 0.734375, 0.75390625, 0.7734375, 0.79296875, 0.8125, 0.83203125, 0.8515625]]} \ No newline at end of file diff --git a/python/tests/golden/meridian_output.sha256 b/python/tests/golden/meridian_output.sha256 new file mode 100644 index 00000000..b6d414ca --- /dev/null +++ b/python/tests/golden/meridian_output.sha256 @@ -0,0 +1 @@ +0486402d5a860f459a319cd779ca44a112d8543442ae9ce9eb7b1a01780aee4b \ No newline at end of file diff --git a/python/tests/mat_parity.rs b/python/tests/mat_parity.rs new file mode 100644 index 00000000..0116d945 --- /dev/null +++ b/python/tests/mat_parity.rs @@ -0,0 +1,126 @@ +//! ADR-185 §4.1 — MAT bit-for-bit parity: native-Rust reference half. +//! +//! Drives the canonical `wifi-densepose-mat` `DisasterResponse` pipeline +//! DIRECTLY (no PyO3) over the committed `tests/golden/mat_input.json` CSI +//! stream and locks the SHA-256 of a canonical result string +//! (`count=;triage_priorities=`) into +//! `tests/golden/mat_result.sha256`. +//! +//! Only the survivor **count** and **triage classes** are hashed — survivor +//! UUIDs and event timestamps are non-deterministic and deliberately +//! excluded, so the hash captures exactly the "identical triage + +//! survivor count for a fixed CSI stream" invariant of ADR-185 §4.1. +//! +//! Honesty note: the fixture is a synthetic breathing-modulated stream, so +//! this proves the Python binding drives the real pipeline byte-identically +//! to native Rust — it is NOT a detection-accuracy claim on real rubble. +//! +//! Regenerate (only on an intentional Rust change): delete the .sha256 and +//! re-run `cargo test --features mat --test mat_parity`. +#![cfg(feature = "mat")] + +use std::fs; +use std::path::PathBuf; + +use serde_json::Value; +use sha2::{Digest, Sha256}; +use wifi_densepose_mat::{DisasterConfig, DisasterResponse, DisasterType, ScanZone, ZoneBounds}; + +fn golden_dir() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("golden") +} + +fn fixture() -> Value { + let raw = fs::read_to_string(golden_dir().join("mat_input.json")) + .expect("read mat_input.json fixture"); + serde_json::from_str(&raw).expect("parse mat_input.json") +} + +/// Build the response identically to the Python binding's default +/// construction and run one scan over the fixture CSI stream. Returns the +/// canonical `count=;triage_priorities=` string. +fn mat_canonical_result(fx: &Value) -> String { + let config = DisasterConfig::builder() + .disaster_type(DisasterType::Earthquake) + .sensitivity(0.9) + .confidence_threshold(0.1) + .max_depth(5.0) + .continuous_monitoring(false) + .build(); + let mut resp = DisasterResponse::new(config); + resp.initialize_event(geo::Point::new(0.0, 0.0), "parity-fixture") + .expect("initialize_event"); + resp.add_zone(ScanZone::new( + "Zone A", + ZoneBounds::rectangle(0.0, 0.0, 50.0, 30.0), + )) + .expect("add_zone"); + + for frame in fx["stream"].as_array().unwrap() { + let amp: Vec = frame["amplitude"] + .as_array() + .unwrap() + .iter() + .map(|x| x.as_f64().unwrap()) + .collect(); + let ph: Vec = frame["phase"] + .as_array() + .unwrap() + .iter() + .map(|x| x.as_f64().unwrap()) + .collect(); + resp.push_csi_data(&, &ph).expect("push_csi_data"); + } + + let rt = tokio::runtime::Builder::new_current_thread() + .enable_time() + .build() + .unwrap(); + rt.block_on(resp.start_scanning()).expect("scan"); + + let survivors = resp.survivors(); + let mut priorities: Vec = survivors + .iter() + .map(|s| s.triage_status().priority()) + .collect(); + priorities.sort_unstable(); + format!("count={};triage_priorities={:?}", survivors.len(), priorities) +} + +fn sha256_hex(s: &str) -> String { + let mut hasher = Sha256::new(); + hasher.update(s.as_bytes()); + hasher + .finalize() + .iter() + .map(|b| format!("{b:02x}")) + .collect() +} + +#[test] +fn native_mat_result_is_deterministic() { + let fx = fixture(); + // Two independent runs must agree (survivor count + triage classes are + // deterministic; UUIDs/timestamps are excluded from the canonical form). + assert_eq!(mat_canonical_result(&fx), mat_canonical_result(&fx)); +} + +#[test] +fn native_mat_matches_committed_golden() { + let canon = mat_canonical_result(&fixture()); + let got = sha256_hex(&canon); + let path = golden_dir().join("mat_result.sha256"); + match fs::read_to_string(&path) { + Ok(expected) => assert_eq!( + got, + expected.trim(), + "native MAT result drifted from committed golden (canonical form: {canon})" + ), + Err(_) => { + fs::write(&path, &got).expect("write golden sha256"); + panic!("no committed golden found; wrote {got} for [{canon}]. Re-run to verify."); + } + } +} diff --git a/python/tests/meridian_parity.rs b/python/tests/meridian_parity.rs new file mode 100644 index 00000000..a5565618 --- /dev/null +++ b/python/tests/meridian_parity.rs @@ -0,0 +1,178 @@ +//! ADR-185 §4.1 — MERIDIAN bit-for-bit parity: native-Rust reference half. +//! +//! Calls the canonical `wifi-densepose-signal::hardware_norm` + +//! `wifi-densepose-train::{geometry,rapid_adapt}` code DIRECTLY (no PyO3) +//! on the committed `tests/golden/meridian_input.json` fixture and locks +//! the SHA-256 of the concatenated f32 outputs into +//! `tests/golden/meridian_output.sha256`. +//! +//! Concatenation order (identical in the pytest half, tests/test_meridian.py): +//! 1. esp32 canonical amplitude (56) 2. esp32 canonical phase (56) +//! 3. intel5300 canonical amplitude 4. intel5300 canonical phase +//! 5. geometry.encode(ap_positions) 6. rapid_adapt lora_weights +//! +//! Regenerate (only on an intentional Rust change): delete the .sha256 and +//! re-run `cargo test --features meridian --test meridian_parity`. +#![cfg(feature = "meridian")] + +use std::fs; +use std::path::PathBuf; + +use serde_json::Value; +use sha2::{Digest, Sha256}; +use wifi_densepose_signal::hardware_norm::{HardwareNormalizer, HardwareType}; +use wifi_densepose_train::geometry::{GeometryEncoder, MeridianGeometryConfig}; +use wifi_densepose_train::rapid_adapt::{AdaptationLoss, RapidAdaptation}; + +fn golden_dir() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("golden") +} + +fn fixture() -> Value { + let raw = fs::read_to_string(golden_dir().join("meridian_input.json")) + .expect("read meridian_input.json fixture"); + serde_json::from_str(&raw).expect("parse meridian_input.json") +} + +fn f64_vec(v: &Value, key: &str) -> Vec { + v[key] + .as_array() + .unwrap() + .iter() + .map(|x| x.as_f64().unwrap()) + .collect() +} + +fn f32_frames(v: &Value, key: &str) -> Vec> { + v[key] + .as_array() + .unwrap() + .iter() + .map(|row| { + row.as_array() + .unwrap() + .iter() + .map(|x| x.as_f64().unwrap() as f32) + .collect() + }) + .collect() +} + +/// Compute the full concatenated MERIDIAN output vector, mirroring the +/// Python binding's default construction exactly. +fn meridian_output(fx: &Value) -> Vec { + let mut out: Vec = Vec::new(); + + // 1–4: hardware normalization (default normalizer, canonical 56). + let norm = HardwareNormalizer::new(); + let esp = norm + .normalize( + &f64_vec(fx, "esp32_amplitude"), + &f64_vec(fx, "esp32_phase"), + HardwareType::Esp32S3, + ) + .unwrap(); + out.extend_from_slice(&esp.amplitude); + out.extend_from_slice(&esp.phase); + let intel = norm + .normalize( + &f64_vec(fx, "intel_amplitude"), + &f64_vec(fx, "intel_phase"), + HardwareType::Intel5300, + ) + .unwrap(); + out.extend_from_slice(&intel.amplitude); + out.extend_from_slice(&intel.phase); + + // 5: geometry encoding (default config → 64-dim). + let enc = GeometryEncoder::new(&MeridianGeometryConfig::default()); + let aps: Vec<[f32; 3]> = fx["ap_positions"] + .as_array() + .unwrap() + .iter() + .map(|p| { + let a = p.as_array().unwrap(); + [ + a[0].as_f64().unwrap() as f32, + a[1].as_f64().unwrap() as f32, + a[2].as_f64().unwrap() as f32, + ] + }) + .collect(); + out.extend_from_slice(&enc.encode(&aps)); + + // 6: rapid adaptation lora weights (Combined, epochs 5, lr 1e-3, λ 0.5). + let mut ra = RapidAdaptation::new( + 10, + 4, + AdaptationLoss::Combined { + epochs: 5, + lr: 0.001, + lambda_ent: 0.5, + }, + ); + for frame in f32_frames(fx, "rapid_frames") { + ra.push_frame(&frame); + } + out.extend_from_slice(&ra.adapt().unwrap().lora_weights); + + out +} + +fn sha256_le(vals: &[f32]) -> String { + let mut hasher = Sha256::new(); + for &x in vals { + hasher.update(x.to_le_bytes()); + } + hasher + .finalize() + .iter() + .map(|b| format!("{b:02x}")) + .collect() +} + +#[test] +fn native_canonical_frames_are_56_wide() { + let fx = fixture(); + let norm = HardwareNormalizer::new(); + let esp = norm + .normalize( + &f64_vec(&fx, "esp32_amplitude"), + &f64_vec(&fx, "esp32_phase"), + HardwareType::Esp32S3, + ) + .unwrap(); + assert_eq!(esp.amplitude.len(), 56); + assert_eq!(esp.phase.len(), 56); + let intel = norm + .normalize( + &f64_vec(&fx, "intel_amplitude"), + &f64_vec(&fx, "intel_phase"), + HardwareType::Intel5300, + ) + .unwrap(); + assert_eq!(intel.amplitude.len(), 56); + // 64-dim geometry vector. + let enc = GeometryEncoder::new(&MeridianGeometryConfig::default()); + assert_eq!(enc.encode(&[[0.25, 0.5, 0.75]]).len(), 64); +} + +#[test] +fn native_meridian_matches_committed_golden() { + let got = sha256_le(&meridian_output(&fixture())); + let path = golden_dir().join("meridian_output.sha256"); + match fs::read_to_string(&path) { + Ok(expected) => assert_eq!( + got, + expected.trim(), + "native MERIDIAN hash drifted from committed golden \ + (intentional? delete the .sha256 and regenerate)" + ), + Err(_) => { + fs::write(&path, &got).expect("write golden sha256"); + panic!("no committed golden found; wrote {got}. Re-run to verify parity."); + } + } +} diff --git a/python/tests/test_aether.py b/python/tests/test_aether.py new file mode 100644 index 00000000..74ae5952 --- /dev/null +++ b/python/tests/test_aether.py @@ -0,0 +1,278 @@ +"""ADR-185 P1 — AETHER binding tests, incl. the §4.1 bit-for-bit parity gate. + +The parity test compares the binding's embedding to a committed golden VECTOR +produced by the native-Rust reference (`tests/aether_parity.rs`), within a +numerical tolerance. It is NOT a byte-hash: the embedding is f32 with +transcendental ops, so exact bytes are not reproducible across the CPU +architectures this project ships wheels for. A mismatch beyond tolerance is a +release blocker, not a warning. +""" + +from __future__ import annotations + +import json +import math +import struct +import tempfile +from pathlib import Path + +import pytest + +from wifi_densepose import aether + +GOLDEN = Path(__file__).parent / "golden" + +# Cross-architecture f32 parity tolerance. The AETHER embedding is pure f32 with +# transcendental ops that differ in the last bits across CPUs/libm, so exact +# byte equality is not portable across the wheels this project builds. 1e-4 is +# ~100x the observed cross-arch drift on unit-normed values and ~100x smaller +# than any real algorithm change. Combined atol+rtol so both small and larger +# components are bounded. (ADR-185 §4.1.) +PARITY_ATOL = 1e-4 +PARITY_RTOL = 1e-4 + + +def load_input() -> list[list[float]]: + return json.loads((GOLDEN / "aether_input.json").read_text()) + + +def assert_embedding_matches_golden(embedding: list[float], golden_name: str) -> None: + """Assert `embedding` matches the committed golden vector. + + Two independent checks, because a per-element tolerance alone is not enough: + - **Per element**, within atol+rtol — catches a single component drifting. + - **Whole-vector cosine** ≥ 1 - 1e-6 — catches a *coherent* shift that stays + inside the per-element bound on every component yet moves the vector as a + whole (the failure mode a loose element tolerance would hide). + + NaN/inf are rejected explicitly: `abs(nan - b) > tol` is False, so a bare + tolerance check would silently PASS an all-NaN embedding. Every value must be + finite first. + """ + golden = json.loads((GOLDEN / golden_name).read_text()) + assert len(embedding) == len(golden), ( + f"{golden_name}: length {len(embedding)} != golden {len(golden)}" + ) + for i, x in enumerate(embedding): + assert math.isfinite(x), f"{golden_name}: element {i} is not finite ({x})" + + for i, (a, b) in enumerate(zip(embedding, golden)): + tol = PARITY_ATOL + PARITY_RTOL * abs(b) + assert abs(a - b) <= tol, ( + f"{golden_name}: element {i} diverged from native golden beyond " + f"tolerance (got {a}, golden {b}, |Δ|={abs(a - b):.3e}) — " + "a real regression, not cross-arch f32 drift." + ) + + dot = sum(a * b for a, b in zip(embedding, golden)) + na = math.sqrt(sum(a * a for a in embedding)) + nb = math.sqrt(sum(b * b for b in golden)) + cosine = dot / (na * nb) if na > 0 and nb > 0 else 0.0 + assert cosine >= 1.0 - 1e-6, ( + f"{golden_name}: whole-vector cosine similarity to the golden is " + f"{cosine:.9f} (< 1 - 1e-6) — a coherent shift the per-element " + "tolerance did not catch." + ) + + +def build_extractor() -> aether.EmbeddingExtractor: + # Must match the native-Rust reference construction exactly. + cfg = aether.AetherConfig(d_model=64, d_proj=128, temperature=0.07, normalize=True) + return aether.EmbeddingExtractor(n_subcarriers=56, config=cfg) + + +def _formula_weights(n: int) -> list[float]: + # Byte-identical to aether_weights_parity.rs (k/65536 is exact in f32+f64). + return [((i * 1103515245 + 12345) % 65536) / 65536.0 - 0.5 for i in range(n)] + + +def _write_weight_file(path: Path, weights: list[float]) -> None: + # AETHER weight format: b"AETHERW1" + u32 count + LE f32 payload. + with open(path, "wb") as f: + f.write(b"AETHERW1") + f.write(struct.pack(" None: + cfg = aether.AetherConfig(d_model=64, d_proj=128, temperature=0.07, normalize=True) + assert cfg.d_model == 64 + assert cfg.d_proj == 128 + assert abs(cfg.temperature - 0.07) < 1e-6 + assert cfg.normalize is True + + +# ─── Constructor input validation (raise ValueError, never panic) ───────── +# Bad dimensions used to reach Rust and either panic (surfacing as an opaque +# PanicException) or allocate multi-gigabyte matrices that abort the interpreter. + +@pytest.mark.parametrize("kwargs", [ + {"d_model": 0, "d_proj": 128}, + {"d_model": 64, "d_proj": 0}, + {"d_model": 100_000, "d_proj": 128}, # unbounded allocation guard + {"d_model": 64, "d_proj": 100_000}, +]) +def test_aether_config_rejects_bad_dims(kwargs: dict) -> None: + with pytest.raises(ValueError): + aether.AetherConfig(**kwargs) + + +def test_extractor_rejects_zero_heads_instead_of_panicking() -> None: + # THE crash codex flagged: n_heads=0 -> `d_model % n_heads` -> panic. + cfg = aether.AetherConfig(d_model=64, d_proj=128) + with pytest.raises(ValueError): + aether.EmbeddingExtractor(n_subcarriers=56, config=cfg, n_heads=0) + + +def test_extractor_rejects_indivisible_head_count() -> None: + # 64 % 5 != 0 trips the native assert; must be a clean ValueError. + cfg = aether.AetherConfig(d_model=64, d_proj=128) + with pytest.raises(ValueError): + aether.EmbeddingExtractor(n_subcarriers=56, config=cfg, n_heads=5) + + +@pytest.mark.parametrize("kwargs", [ + {"n_subcarriers": 0}, + {"n_subcarriers": 100_000}, + {"n_keypoints": 0}, +]) +def test_extractor_rejects_bad_shape(kwargs: dict) -> None: + cfg = aether.AetherConfig(d_model=64, d_proj=128) + base = {"n_subcarriers": 56, "config": cfg} + base.update(kwargs) + with pytest.raises(ValueError): + aether.EmbeddingExtractor(**base) + + +def test_valid_extractor_still_constructs() -> None: + # The negatives above must not pass by making the constructor reject + # everything: a valid config still builds and embeds. + cfg = aether.AetherConfig(d_model=64, d_proj=128) + ext = aether.EmbeddingExtractor(n_subcarriers=56, config=cfg, n_heads=4) + assert len(ext.embed(load_input())) == 128 + + +def test_embedding_shape_and_unit_norm() -> None: + emb = build_extractor().embed(load_input()) + assert len(emb) == 128 + norm = math.sqrt(sum(x * x for x in emb)) + assert abs(norm - 1.0) < 1e-4, f"expected unit-norm embedding, got {norm}" + + +def test_binding_matches_native_golden_within_tolerance() -> None: + """The release-blocking §4.1 gate: binding output == native Rust reference. + + Compares to a committed golden VECTOR within a numerical tolerance, not a + SHA-256 of the raw f32 bytes. The embedding is pure f32 and uses + transcendental ops (ln/sqrt/cos in the Gaussian init), which are NOT + bit-reproducible across CPU architectures or libm implementations. A + byte-hash therefore only ever matched the one arch that generated it, and + failed on every other wheel this project builds (aarch64, macOS-arm). The + tolerance below (1e-4) is orders of magnitude larger than cross-arch f32 + drift yet far tighter than any real algorithm change, which moves + unit-normed elements by ~1e-2 or more. See ADR-185 §4.1. + """ + emb = build_extractor().embed(load_input()) + assert_embedding_matches_golden(emb, "aether_embedding.json") + + +def test_embedding_is_deterministic() -> None: + ext = build_extractor() + inp = load_input() + assert ext.embed(inp) == ext.embed(inp) + + +def test_cosine_similarity_self_is_one() -> None: + v = [0.1 * i - 0.5 for i in range(32)] + assert abs(aether.cosine_similarity(v, v) - 1.0) < 1e-5 + + +def test_cosine_similarity_orthogonal_is_zero() -> None: + a = [1.0, 0.0, 0.0, 0.0] + b = [0.0, 1.0, 0.0, 0.0] + assert abs(aether.cosine_similarity(a, b)) < 1e-6 + + +def test_info_nce_loss_identical_batch_is_log_n() -> None: + # Identical embeddings → all similarities equal → loss == ln(N). + emb = [[1.0, 0.0, 0.0]] * 4 + loss = aether.info_nce_loss(emb, emb, 0.07) + assert abs(loss - math.log(4)) < 0.1 + + +def test_augment_pair_preserves_shape_and_differs() -> None: + window = load_input() + view_a, view_b = aether.CsiAugmenter().augment_pair(window, seed=42) + assert len(view_a) == len(window) + assert len(view_b) == len(window) + assert len(view_a[0]) == len(window[0]) + differs = any( + abs(x - y) > 1e-6 + for ra, rb in zip(view_a, view_b) + for x, y in zip(ra, rb) + ) + assert differs, "augment_pair should return two distinct views" + + +def test_missing_feature_message_names_the_real_fix() -> None: + # The guard fires only on a from-source build without the feature. Its + # message must name the real fix — rebuild with the feature — and must NOT + # tell users to `pip install [aether]`, which is an empty extra that cannot + # add compiled code to a built wheel. + src = (Path(aether.__file__)).read_text() + assert "--features aether" in src + assert "pip install wifi-densepose[aether]" not in src + + +# ─── Weight loading (ADR-185 §13.a) ────────────────────────────────── + +def test_load_weights_is_used_and_matches_native_golden() -> None: + ext = build_extractor() + baseline = ext.embed(load_input()) # random Xavier init + + weights = _formula_weights(ext.param_count) + with tempfile.TemporaryDirectory() as d: + wpath = Path(d) / "weights.bin" + _write_weight_file(wpath, weights) + ext.load_weights(str(wpath)) + + loaded = ext.embed(load_input()) + + # (1) The loaded weights actually take effect (not a silent no-op). + assert any(abs(a - b) > 1e-6 for a, b in zip(baseline, loaded)), ( + "load_weights had no effect — embedding still equals the random-init baseline" + ) + # (2) Matches the native-Rust reference that loaded the same weights, within + # tolerance. See test_binding_matches_native_golden_within_tolerance for + # why this is a tolerance compare and not a byte-hash. + assert_embedding_matches_golden(loaded, "aether_loaded_embedding.json") + + +def test_save_then_load_weights_round_trips() -> None: + ext = build_extractor() + inp = load_input() + with tempfile.TemporaryDirectory() as d: + wpath = Path(d) / "roundtrip.bin" + ext.save_weights(str(wpath)) # serialize current (random) weights + emb_before = ext.embed(inp) + ext2 = build_extractor() + ext2.load_weights(str(wpath)) # load them into a fresh extractor + assert ext2.embed(inp) == emb_before + + +def test_load_weights_rejects_bad_magic() -> None: + ext = build_extractor() + with tempfile.TemporaryDirectory() as d: + wpath = Path(d) / "bad.bin" + wpath.write_bytes(b"NOTAETHER" + b"\x00" * 8) + with pytest.raises(ValueError): + ext.load_weights(str(wpath)) + + +def test_load_weights_rejects_wrong_param_count() -> None: + ext = build_extractor() + with tempfile.TemporaryDirectory() as d: + wpath = Path(d) / "short.bin" + _write_weight_file(wpath, [0.1, 0.2, 0.3]) # far too few params + with pytest.raises(ValueError): + ext.load_weights(str(wpath)) diff --git a/python/tests/test_client_ws.py b/python/tests/test_client_ws.py index b6c2ad16..828cc830 100644 --- a/python/tests/test_client_ws.py +++ b/python/tests/test_client_ws.py @@ -65,7 +65,29 @@ _FIXTURE_MESSAGES = [ ] +#: Upgrade-request headers captured by the in-process server, so tests +#: can assert what the client actually put on the handshake. +_CAPTURED_UPGRADE_HEADERS: dict[str, str] = {} + + +def _upgrade_headers(websocket: Any) -> Any: + """Read the handshake request headers across websockets versions + (`websocket.request.headers` >= 14, `websocket.request_headers` <= 13).""" + req = getattr(websocket, "request", None) + if req is not None and getattr(req, "headers", None) is not None: + return req.headers + return getattr(websocket, "request_headers", {}) + + async def _handler(websocket: Any) -> None: + _CAPTURED_UPGRADE_HEADERS.clear() + try: + headers = _upgrade_headers(websocket) + auth = headers.get("Authorization") if hasattr(headers, "get") else None + if auth is not None: + _CAPTURED_UPGRADE_HEADERS["Authorization"] = auth + except Exception: + pass for msg in _FIXTURE_MESSAGES: await websocket.send(json.dumps(msg)) # Send one malformed frame to assert the client logs+drops it @@ -174,6 +196,160 @@ def test_sensing_client_decoder_directly() -> None: assert msg.rssi is None +# ─── Auth: bearer token on the WS upgrade (issue #1395) ────────────── + + +def _auth_header_from_kwargs(kwargs: dict) -> Any: + """Pull the Authorization value out of whichever header kwarg the + installed `websockets` uses (`additional_headers` >= 14, + `extra_headers` <= 13). Returns None if no header kwarg was passed.""" + for key in ("additional_headers", "extra_headers"): + if key in kwargs: + return dict(kwargs[key]).get("Authorization") + return None + + +class _DummyWS: + async def close(self) -> None: + pass + + +class _CapturingConnect: + """Stand-in for `websockets.connect` that records the kwargs it was + called with and returns an awaitable yielding a dummy connection.""" + + def __init__(self) -> None: + self.calls: list[tuple[str, dict]] = [] + + def __call__(self, url: str, **kwargs: Any) -> Any: + self.calls.append((url, kwargs)) + + async def _coro() -> _DummyWS: + return _DummyWS() + + return _coro() + + @property + def last_kwargs(self) -> dict: + return self.calls[-1][1] + + +async def test_token_from_constructor_sets_auth_header(monkeypatch: Any) -> None: + from wifi_densepose.client import ws as ws_mod + + fake = _CapturingConnect() + monkeypatch.setattr(ws_mod.websockets, "connect", fake) + + async with SensingClient("ws://x/ws/sensing", token="tok-abc"): + pass + + assert _auth_header_from_kwargs(fake.last_kwargs) == "Bearer tok-abc" + + +async def test_token_from_env_sets_auth_header(monkeypatch: Any) -> None: + from wifi_densepose.client import ws as ws_mod + + fake = _CapturingConnect() + monkeypatch.setattr(ws_mod.websockets, "connect", fake) + monkeypatch.setenv("RUVIEW_API_TOKEN", "env-tok-123") + + async with SensingClient("ws://x/ws/sensing"): + pass + + assert _auth_header_from_kwargs(fake.last_kwargs) == "Bearer env-tok-123" + + +async def test_constructor_token_overrides_env(monkeypatch: Any) -> None: + from wifi_densepose.client import ws as ws_mod + + fake = _CapturingConnect() + monkeypatch.setattr(ws_mod.websockets, "connect", fake) + monkeypatch.setenv("RUVIEW_API_TOKEN", "env-tok") + + async with SensingClient("ws://x/ws/sensing", token="ctor-tok"): + pass + + assert _auth_header_from_kwargs(fake.last_kwargs) == "Bearer ctor-tok" + + +async def test_no_token_sends_no_auth_header(monkeypatch: Any) -> None: + from wifi_densepose.client import ws as ws_mod + + fake = _CapturingConnect() + monkeypatch.setattr(ws_mod.websockets, "connect", fake) + monkeypatch.delenv("RUVIEW_API_TOKEN", raising=False) + + async with SensingClient("ws://x/ws/sensing"): + pass + + assert _auth_header_from_kwargs(fake.last_kwargs) is None + # Auth-disabled path must not smuggle either header kwarg in. + assert "additional_headers" not in fake.last_kwargs + assert "extra_headers" not in fake.last_kwargs + + +async def test_empty_token_sends_no_auth_header(monkeypatch: Any) -> None: + """An explicitly empty token (or empty env var) means 'no auth'.""" + from wifi_densepose.client import ws as ws_mod + + fake = _CapturingConnect() + monkeypatch.setattr(ws_mod.websockets, "connect", fake) + monkeypatch.setenv("RUVIEW_API_TOKEN", "") + + async with SensingClient("ws://x/ws/sensing"): + pass + + assert _auth_header_from_kwargs(fake.last_kwargs) is None + + +@pytest.mark.parametrize( + "header_param,expected", + [ + ("additional_headers", "additional_headers"), # websockets >= 14 + ("extra_headers", "extra_headers"), # websockets <= 13 + ], +) +def test_select_header_kwarg_across_websockets_versions( + header_param: str, expected: str +) -> None: + """Version-compat: the kwarg is chosen by inspecting the installed + `connect` signature, so both the pre-14 (`extra_headers`) and + post-14 (`additional_headers`) conventions resolve correctly without + two websockets installs.""" + from wifi_densepose.client.ws import _select_header_kwarg + + # Build a fake `connect` whose signature carries only the one kwarg + # the emulated websockets version would expose. + ns: dict = {} + exec( + f"def fake_connect(uri, *, {header_param}=None, ping_interval=None): ...", + ns, + ) + assert _select_header_kwarg(ns["fake_connect"]) == expected + + +def test_select_header_kwarg_matches_installed_websockets() -> None: + """On whatever `websockets` is actually installed, the chosen kwarg + must be a real parameter of `websockets.connect`.""" + import inspect + + import websockets + + from wifi_densepose.client.ws import _select_header_kwarg + + chosen = _select_header_kwarg(websockets.connect) + assert chosen in inspect.signature(websockets.connect).parameters + + +async def test_auth_header_reaches_server_end_to_end(ws_server: str) -> None: + """Real in-process server: assert the bearer actually arrives on the + upgrade request (proves the header is wired to the live handshake, + not just the connect kwargs).""" + async with SensingClient(ws_server, token="e2e-token") as client: + await client.recv_one(timeout=2.0) + assert _CAPTURED_UPGRADE_HEADERS.get("Authorization") == "Bearer e2e-token" + + def test_sensing_client_decoder_handles_None_subfields() -> None: """When the sensing-server explicitly emits null for HR/BR (no measurement yet), the client should propagate None, not crash.""" diff --git a/python/tests/test_mat.py b/python/tests/test_mat.py new file mode 100644 index 00000000..701b5824 --- /dev/null +++ b/python/tests/test_mat.py @@ -0,0 +1,109 @@ +"""ADR-185 P3 — MAT binding tests, incl. the §4.1 bit-for-bit parity gate. + +The parity test drives the same committed CSI stream through the binding's +DisasterResponse pipeline and asserts the survivor count + triage classes +(as a SHA-256 of a canonical string) match the native-Rust golden. A +mismatch is a release blocker. +""" + +from __future__ import annotations + +import hashlib +import json +from pathlib import Path + +import pytest + +from wifi_densepose import mat + +GOLDEN = Path(__file__).parent / "golden" + + +def fixture() -> dict: + return json.loads((GOLDEN / "mat_input.json").read_text()) + + +def build_response() -> mat.DisasterResponse: + cfg = mat.DisasterConfig( + mat.DisasterType.Earthquake, + sensitivity=0.9, + confidence_threshold=0.1, + max_depth=5.0, + ) + resp = mat.DisasterResponse(cfg) + resp.initialize_event(0.0, 0.0, "parity-fixture") + resp.add_zone(mat.ScanZone.rectangle("Zone A", 0.0, 0.0, 50.0, 30.0)) + return resp + + +def run_scan(resp: mat.DisasterResponse) -> None: + for frame in fixture()["stream"]: + resp.push_csi_data(frame["amplitude"], frame["phase"]) + resp.scan_once() + + +# ─── enums / config ────────────────────────────────────────────────── + +def test_triage_priority_order() -> None: + assert mat.TriageStatus.Immediate.priority == 1 + assert mat.TriageStatus.Delayed.priority == 2 + assert mat.TriageStatus.Unknown.priority == 5 + + +def test_disaster_config_fields() -> None: + cfg = mat.DisasterConfig(mat.DisasterType.Flood, sensitivity=1.5, confidence_threshold=0.3) + assert cfg.sensitivity == 1.0 # clamped to [0, 1] + assert abs(cfg.confidence_threshold - 0.3) < 1e-9 + + +# ─── pipeline behaviour ────────────────────────────────────────────── + +def test_scan_requires_event() -> None: + resp = mat.DisasterResponse(mat.DisasterConfig(mat.DisasterType.Unknown)) + # No initialize_event / add_zone -> scan_cycle errors "No active event". + with pytest.raises(ValueError): + resp.scan_once() + + +def test_push_csi_rejects_mismatched_lengths() -> None: + resp = build_response() + with pytest.raises(ValueError): + resp.push_csi_data([1.0, 2.0], [1.0]) + + +def test_scan_detects_survivor_from_breathing_stream() -> None: + resp = build_response() + run_scan(resp) + survivors = resp.survivors() + # The synthetic breathing-modulated stream trips one detection (matches + # the native-Rust reference). + assert len(survivors) == 1 + s = survivors[0] + assert isinstance(s.id, str) and len(s.id) > 0 + assert s.triage_status == mat.TriageStatus.Delayed + assert 0.0 <= s.confidence <= 1.0 + # survivors_by_triage is consistent with the survivor's own class. + assert len(resp.survivors_by_triage(mat.TriageStatus.Delayed)) == 1 + assert len(resp.survivors_by_triage(mat.TriageStatus.Immediate)) == 0 + + +# ─── §4.1 bit-for-bit parity gate (release-blocking) ───────────────── + +def test_bit_for_bit_parity_with_native_rust() -> None: + resp = build_response() + run_scan(resp) + survivors = resp.survivors() + priorities = sorted(s.triage_status.priority for s in survivors) + canon = f"count={len(survivors)};triage_priorities={priorities}" + got = hashlib.sha256(canon.encode()).hexdigest() + expected = (GOLDEN / "mat_result.sha256").read_text().strip() + assert got == expected, ( + f"Python MAT result diverged from native-Rust golden " + f"(canonical form: {canon}; {got} != {expected})" + ) + + +def test_base_wheel_import_error_message() -> None: + src = Path(mat.__file__).read_text() + assert "--features mat" in src + assert "pip install wifi-densepose[mat]" not in src diff --git a/python/tests/test_meridian.py b/python/tests/test_meridian.py new file mode 100644 index 00000000..41bbe2b1 --- /dev/null +++ b/python/tests/test_meridian.py @@ -0,0 +1,161 @@ +"""ADR-185 P2 — MERIDIAN binding tests, incl. the §4.1 bit-for-bit parity gate. + +The parity test packs the binding's concatenated outputs (2× canonical +frame, geometry vector, rapid-adapt LoRA weights) to little-endian f32 +bytes and asserts SHA-256 equality with the golden produced by the +native-Rust reference (`tests/meridian_parity.rs`). A mismatch is a +release blocker. +""" + +from __future__ import annotations + +import hashlib +import json +import struct +from pathlib import Path + +import pytest + +from wifi_densepose import meridian as mer + +GOLDEN = Path(__file__).parent / "golden" + + +def fixture() -> dict: + return json.loads((GOLDEN / "meridian_input.json").read_text()) + + +# ─── HardwareType / HardwareNormalizer / CanonicalCsiFrame ─────────── + +def test_hardware_type_detect() -> None: + assert mer.HardwareType.detect(64) == mer.HardwareType.Esp32S3 + assert mer.HardwareType.detect(30) == mer.HardwareType.Intel5300 + assert mer.HardwareType.detect(56) == mer.HardwareType.Atheros + assert mer.HardwareType.detect(128) == mer.HardwareType.Generic + + +def test_hardware_type_properties() -> None: + assert mer.HardwareType.Esp32S3.subcarrier_count == 64 + assert mer.HardwareType.Esp32S3.mimo_streams == 1 + assert mer.HardwareType.Intel5300.mimo_streams == 3 + + +def test_normalize_shapes_and_hardware() -> None: + fx = fixture() + norm = mer.HardwareNormalizer() + assert norm.canonical_subcarriers == 56 + frame = norm.normalize(fx["esp32_amplitude"], fx["esp32_phase"], mer.HardwareType.Esp32S3) + assert len(frame.amplitude) == 56 + assert len(frame.phase) == 56 + assert frame.hardware_type == mer.HardwareType.Esp32S3 + + +def test_normalize_rejects_mismatched_lengths() -> None: + norm = mer.HardwareNormalizer() + with pytest.raises(ValueError): + norm.normalize([1.0, 2.0], [1.0], mer.HardwareType.Generic) + + +# ─── GeometryEncoder ───────────────────────────────────────────────── + +def test_geometry_encode_dim_and_permutation_invariance() -> None: + enc = mer.GeometryEncoder(mer.MeridianGeometryConfig()) + aps = [[0.25, 0.5, 0.75], [1.0, 1.25, 1.5], [2.0, 0.0, -0.5]] + v = enc.encode(aps) + assert len(v) == 64 + # DeepSets mean-pool is permutation-invariant. + v_perm = enc.encode([aps[2], aps[0], aps[1]]) + assert max(abs(a - b) for a, b in zip(v, v_perm)) < 1e-5 + + +def test_geometry_encode_rejects_empty_and_bad_shape() -> None: + enc = mer.GeometryEncoder() + with pytest.raises(ValueError): + enc.encode([]) + with pytest.raises(ValueError): + enc.encode([[0.0, 1.0]]) # not 3 coords + + +# ─── RapidAdaptation ───────────────────────────────────────────────── + +def test_rapid_adaptation_adapt() -> None: + fx = fixture() + ra = mer.RapidAdaptation( + min_calibration_frames=10, lora_rank=4, loss_kind="combined", + epochs=5, lr=0.001, lambda_ent=0.5, + ) + for frame in fx["rapid_frames"]: + ra.push_frame(frame) + assert ra.is_ready() + assert ra.buffer_len == 12 + res = ra.adapt() + assert res.frames_used == 12 + assert res.adaptation_epochs == 5 + assert len(res.lora_weights) == 2 * 16 * 4 # 2 * fdim * rank + + +def test_rapid_adaptation_rejects_bad_loss_kind() -> None: + with pytest.raises(ValueError): + mer.RapidAdaptation(10, 4, loss_kind="nonsense") + + +def test_rapid_adaptation_empty_buffer_raises() -> None: + ra = mer.RapidAdaptation(1, 4) + with pytest.raises(ValueError): + ra.adapt() + + +# ─── CrossDomainEvaluator ──────────────────────────────────────────── + +def test_cross_domain_evaluator_gap_ratio() -> None: + ev = mer.CrossDomainEvaluator(1) + preds = [ + ([0.0, 0.0, 0.0], [1.0, 0.0, 0.0]), # domain 0, err 1 + ([0.0, 0.0, 0.0], [2.0, 0.0, 0.0]), # domain 1, err 2 + ] + m = ev.evaluate(preds, [0, 1]) + assert abs(m["in_domain_mpjpe"] - 1.0) < 1e-6 + assert abs(m["cross_domain_mpjpe"] - 2.0) < 1e-6 + assert abs(m["domain_gap_ratio"] - 2.0) < 1e-6 + + +def test_mpjpe_module_fn() -> None: + assert abs(mer.mpjpe([0.0, 0.0, 0.0], [3.0, 4.0, 0.0], 1) - 5.0) < 1e-6 + + +# ─── §4.1 bit-for-bit parity gate (release-blocking) ───────────────── + +def test_bit_for_bit_parity_with_native_rust() -> None: + fx = fixture() + out: list[float] = [] + + norm = mer.HardwareNormalizer() + esp = norm.normalize(fx["esp32_amplitude"], fx["esp32_phase"], mer.HardwareType.Esp32S3) + out += list(esp.amplitude) + list(esp.phase) + intel = norm.normalize(fx["intel_amplitude"], fx["intel_phase"], mer.HardwareType.Intel5300) + out += list(intel.amplitude) + list(intel.phase) + + enc = mer.GeometryEncoder(mer.MeridianGeometryConfig()) + out += list(enc.encode(fx["ap_positions"])) + + ra = mer.RapidAdaptation( + min_calibration_frames=10, lora_rank=4, loss_kind="combined", + epochs=5, lr=0.001, lambda_ent=0.5, + ) + for frame in fx["rapid_frames"]: + ra.push_frame(frame) + out += list(ra.adapt().lora_weights) + + packed = b"".join(struct.pack(" None: + src = Path(mer.__file__).read_text() + assert "--features meridian" in src + assert "pip install wifi-densepose[meridian]" not in src diff --git a/python/wifi_densepose/__init__.py b/python/wifi_densepose/__init__.py index f468f2b1..874d44ca 100644 --- a/python/wifi_densepose/__init__.py +++ b/python/wifi_densepose/__init__.py @@ -28,7 +28,7 @@ from __future__ import annotations # Public Python version follows the wheel version, NOT the Rust core # version. The Rust core version is surfaced separately as # `__rust_version__` for diagnostics. -__version__ = "2.0.0a1" +__version__ = "2.0.0" # Re-export the compiled module's surface. The leading underscore on # `_native` is intentional — it marks the binding module as internal. diff --git a/python/wifi_densepose/aether.py b/python/wifi_densepose/aether.py new file mode 100644 index 00000000..40238224 --- /dev/null +++ b/python/wifi_densepose/aether.py @@ -0,0 +1,49 @@ +"""AETHER — contrastive CSI embeddings & re-identification (ADR-024, ADR-185 P1). + +Self-supervised 128-dim L2-normalized embeddings for WiFi CSI: room +fingerprinting, person re-identification, and anomaly scoring, computed +entirely offline by the Rust core (no server, no network). + +Not in the binary wheels yet (see ruvnet/RuView#1412 — the P6 SOTA +bindings are shipped source-build-only for now to keep the base wheel +small). Build from source with ``maturin ... --features aether`` (or +``--features sota`` for all three P6 subsystems). + +Quick start:: + + from wifi_densepose.aether import AetherConfig, EmbeddingExtractor, cosine_similarity + + ext = EmbeddingExtractor(n_subcarriers=56, config=AetherConfig()) + a = ext.embed(window_a) # list[float], length == config.d_proj (128) + b = ext.embed(window_b) + score = cosine_similarity(a, b) # re-ID similarity in [-1, 1] +""" + +from __future__ import annotations + +from wifi_densepose import _native + +# The AETHER symbols are compiled into `_native` only under the Rust `aether` +# feature. The binary wheels do NOT enable it yet (ruvnet/RuView#1412); +# it is available from a source build with the feature. Name that fix, not +# a pip extra, which cannot add compiled code to a built wheel. +if not hasattr(_native, "AetherConfig"): + raise ImportError( + "wifi_densepose.aether is not in the binary wheels yet " + "(see ruvnet/RuView#1412). Build from source with " + "`maturin ... --features aether` (or `--features sota`)." + ) + +AetherConfig = _native.AetherConfig +CsiAugmenter = _native.CsiAugmenter +EmbeddingExtractor = _native.EmbeddingExtractor +info_nce_loss = _native.info_nce_loss +cosine_similarity = _native.cosine_similarity + +__all__ = [ + "AetherConfig", + "CsiAugmenter", + "EmbeddingExtractor", + "info_nce_loss", + "cosine_similarity", +] diff --git a/python/wifi_densepose/aether.pyi b/python/wifi_densepose/aether.pyi new file mode 100644 index 00000000..9d4be719 --- /dev/null +++ b/python/wifi_densepose/aether.pyi @@ -0,0 +1,58 @@ +"""Type stubs for the AETHER bindings (ADR-185 P1). + +Present only when the wheel is built with the ``[aether]`` extra. The +top-level ``wifi_densepose`` package does not re-export these names, so +``mypy --strict`` sees them only via ``from wifi_densepose.aether import ...``. +""" + +from __future__ import annotations + +class AetherConfig: + def __init__( + self, + d_model: int = ..., + d_proj: int = ..., + temperature: float = ..., + normalize: bool = ..., + ) -> None: ... + @property + def d_model(self) -> int: ... + @property + def d_proj(self) -> int: ... + @property + def temperature(self) -> float: ... + @property + def normalize(self) -> bool: ... + def __repr__(self) -> str: ... + +class CsiAugmenter: + def __init__(self) -> None: ... + def augment_pair( + self, window: list[list[float]], seed: int + ) -> tuple[list[list[float]], list[list[float]]]: ... + def __repr__(self) -> str: ... + +class EmbeddingExtractor: + def __init__( + self, + n_subcarriers: int, + config: AetherConfig, + n_keypoints: int = ..., + n_heads: int = ..., + n_gnn_layers: int = ..., + ) -> None: ... + def embed(self, csi_features: list[list[float]]) -> list[float]: ... + @property + def embedding_dim(self) -> int: ... + @property + def param_count(self) -> int: ... + def load_weights(self, path: str) -> None: ... + def save_weights(self, path: str) -> None: ... + def __repr__(self) -> str: ... + +def info_nce_loss( + embeddings_a: list[list[float]], + embeddings_b: list[list[float]], + temperature: float = ..., +) -> float: ... +def cosine_similarity(a: list[float], b: list[float]) -> float: ... diff --git a/python/wifi_densepose/client/ws.py b/python/wifi_densepose/client/ws.py index 385ff7f0..d9a712cd 100644 --- a/python/wifi_densepose/client/ws.py +++ b/python/wifi_densepose/client/ws.py @@ -31,8 +31,10 @@ asyncio.run(main()) from __future__ import annotations import asyncio +import inspect import json import logging +import os from dataclasses import dataclass, field from typing import Any, AsyncIterator, Optional @@ -48,6 +50,33 @@ except ImportError: # pragma: no cover log = logging.getLogger(__name__) +#: Environment variable the sensing-server bearer token is read from by +#: default. Mirrors the TypeScript MCP client (tools/ruview-mcp). +TOKEN_ENV_VAR = "RUVIEW_API_TOKEN" + + +def _select_header_kwarg(connect_fn: Any) -> str: + """Return the ``websockets.connect`` keyword for extra request headers. + + The keyword was renamed inside the ``websockets>=12`` range this + package supports: ``<= 13`` accepts ``extra_headers``, ``>= 14`` + accepts ``additional_headers``. We inspect the actual signature of + the installed ``connect`` rather than guessing from ``__version__``, + so a version bump that renames the kwarg again is handled by + detection instead of raising ``TypeError`` at connect time. + """ + try: + params = inspect.signature(connect_fn).parameters + except (TypeError, ValueError): # pragma: no cover — no introspectable sig + return "additional_headers" + if "additional_headers" in params: + return "additional_headers" + if "extra_headers" in params: + return "extra_headers" + # Neither present (unexpected) — prefer the newer convention. + return "additional_headers" + + # ─── Typed messages ────────────────────────────────────────────────── @@ -172,12 +201,18 @@ class SensingClient: the ``async with`` in your own retry loop. Auto-reconnect logic is application-specific (e.g., "retry forever" for a long-running automation vs "fail fast" for a CLI tool that should exit). + + Auth: pass ``token=`` to send ``Authorization: Bearer `` on + the WS upgrade, for sensing-servers started with ``RUVIEW_API_TOKEN`` + set. If ``token`` is omitted it defaults to the ``RUVIEW_API_TOKEN`` + environment variable; when neither is set, no header is sent. """ def __init__( self, url: str, *, + token: Optional[str] = None, ping_interval: float = 20.0, ping_timeout: float = 20.0, max_size: int = 16 * 1024 * 1024, @@ -188,18 +223,28 @@ class SensingClient: "`pip install \"wifi-densepose[client]\"` to enable the client extras." ) self.url = url + # Bearer token for auth-enabled sensing-servers. Explicit + # constructor argument wins; otherwise fall back to the + # RUVIEW_API_TOKEN environment variable. An empty value (unset + # env, or "") means "no auth" — no Authorization header is sent. + self._token = token if token is not None else os.environ.get(TOKEN_ENV_VAR) self._ping_interval = ping_interval self._ping_timeout = ping_timeout self._max_size = max_size self._ws: Any = None # websockets.WebSocketClientProtocol — typed Any to avoid import cost async def __aenter__(self) -> "SensingClient": - self._ws = await websockets.connect( - self.url, + connect_kwargs: dict[str, Any] = dict( ping_interval=self._ping_interval, ping_timeout=self._ping_timeout, max_size=self._max_size, ) + if self._token: + # Python (unlike the browser UI) can set Authorization + # directly on the WS upgrade — no ticket workaround needed. + header_kwarg = _select_header_kwarg(websockets.connect) + connect_kwargs[header_kwarg] = {"Authorization": f"Bearer {self._token}"} + self._ws = await websockets.connect(self.url, **connect_kwargs) return self async def __aexit__(self, exc_type: Any, exc: Any, tb: Any) -> None: diff --git a/python/wifi_densepose/mat.py b/python/wifi_densepose/mat.py new file mode 100644 index 00000000..b9dbb90d --- /dev/null +++ b/python/wifi_densepose/mat.py @@ -0,0 +1,61 @@ +"""MAT — Mass Casualty Assessment Tool (ADR-024 crate, ADR-185 P3). + +WiFi-based disaster-survivor detection and START-protocol triage from CSI: +ingest CSI frames, run a scan cycle, and query detected survivors by triage. + +Not in the binary wheels yet (see ruvnet/RuView#1412 — the P6 SOTA +bindings are shipped source-build-only for now to keep the base wheel +small). Build from source with ``maturin ... --features mat`` (or +``--features sota`` for all three P6 subsystems). + +Quick start:: + + from wifi_densepose.mat import DisasterConfig, DisasterResponse, DisasterType, ScanZone + + cfg = DisasterConfig(DisasterType.Earthquake, sensitivity=0.9, confidence_threshold=0.1) + resp = DisasterResponse(cfg) + resp.initialize_event(0.0, 0.0, "Building A") # required before scanning + resp.add_zone(ScanZone.rectangle("North Wing", 0.0, 0.0, 50.0, 30.0)) + for amp, phase in csi_stream: + resp.push_csi_data(amp, phase) + resp.scan_once() # one detection cycle + for s in resp.survivors(): + print(s.id, s.triage_status, s.confidence, s.location) + +Honest scope (ADR-185 §3.4): the ADR's Rust-side `scan_once()` wrapper was +unnecessary — this binding drives one cycle of the public async +`start_scanning()` (with `continuous_monitoring` forced off) on an internal +runtime. `initialize_event` + `add_zone` are required before `scan_once`. +`Survivor.latest_vitals` returns the latest reading (the Rust accessor is a +history). The detection pipeline is real but unvalidated on live rubble. +""" + +from __future__ import annotations + +from wifi_densepose import _native + +# MAT symbols are compiled into `_native` only under the Rust `mat` feature. +if not hasattr(_native, "DisasterResponse"): + raise ImportError( + "wifi_densepose.mat is not in the binary wheels yet " + "(see ruvnet/RuView#1412). Build from source with " + "`maturin ... --features mat` (or `--features sota`)." + ) + +DisasterType = _native.DisasterType +TriageStatus = _native.TriageStatus +DisasterConfig = _native.DisasterConfig +DisasterResponse = _native.DisasterResponse +ScanZone = _native.ScanZone +Survivor = _native.Survivor +VitalSignsReading = _native.VitalSignsReading + +__all__ = [ + "DisasterType", + "TriageStatus", + "DisasterConfig", + "DisasterResponse", + "ScanZone", + "Survivor", + "VitalSignsReading", +] diff --git a/python/wifi_densepose/mat.pyi b/python/wifi_densepose/mat.pyi new file mode 100644 index 00000000..f5723d53 --- /dev/null +++ b/python/wifi_densepose/mat.pyi @@ -0,0 +1,92 @@ +"""Type stubs for the MAT bindings (ADR-185 P3). + +Present only when the wheel is built with the ``[mat]`` extra. +""" + +from __future__ import annotations + +import enum + +class DisasterType(enum.Enum): + BuildingCollapse = 0 + Earthquake = 1 + Landslide = 2 + Avalanche = 3 + Flood = 4 + MineCollapse = 5 + Industrial = 6 + TunnelCollapse = 7 + Unknown = 8 + def __repr__(self) -> str: ... + +class TriageStatus(enum.Enum): + Immediate = 0 + Delayed = 1 + Minor = 2 + Deceased = 3 + Unknown = 4 + @property + def priority(self) -> int: ... + def __repr__(self) -> str: ... + +class VitalSignsReading: + @property + def breathing_rate_bpm(self) -> float | None: ... + @property + def heartbeat_rate_bpm(self) -> float | None: ... + @property + def movement_intensity(self) -> float: ... + @property + def confidence(self) -> float: ... + def __repr__(self) -> str: ... + +class Survivor: + @property + def id(self) -> str: ... + @property + def triage_status(self) -> TriageStatus: ... + @property + def confidence(self) -> float: ... + @property + def location(self) -> tuple[float, float, float] | None: ... + @property + def latest_vitals(self) -> VitalSignsReading | None: ... + def __repr__(self) -> str: ... + +class DisasterConfig: + def __init__( + self, + disaster_type: DisasterType, + sensitivity: float = ..., + confidence_threshold: float = ..., + max_depth: float = ..., + scan_interval_ms: int = ..., + ) -> None: ... + @property + def sensitivity(self) -> float: ... + @property + def confidence_threshold(self) -> float: ... + @property + def max_depth(self) -> float: ... + def __repr__(self) -> str: ... + +class ScanZone: + @staticmethod + def rectangle( + name: str, min_x: float, min_y: float, max_x: float, max_y: float + ) -> ScanZone: ... + @staticmethod + def circle(name: str, center_x: float, center_y: float, radius: float) -> ScanZone: ... + @property + def name(self) -> str: ... + def __repr__(self) -> str: ... + +class DisasterResponse: + def __init__(self, config: DisasterConfig) -> None: ... + def initialize_event(self, x: float, y: float, description: str) -> None: ... + def add_zone(self, zone: ScanZone) -> None: ... + def push_csi_data(self, amplitudes: list[float], phases: list[float]) -> None: ... + def scan_once(self) -> None: ... + def survivors(self) -> list[Survivor]: ... + def survivors_by_triage(self, status: TriageStatus) -> list[Survivor]: ... + def __repr__(self) -> str: ... diff --git a/python/wifi_densepose/meridian.py b/python/wifi_densepose/meridian.py new file mode 100644 index 00000000..6c98e76b --- /dev/null +++ b/python/wifi_densepose/meridian.py @@ -0,0 +1,62 @@ +"""MERIDIAN — cross-environment domain generalization (ADR-027, ADR-185 P2). + +Hardware-invariant CSI normalization, geometry-conditioned deployment, +few-shot room adaptation, and cross-domain evaluation — the tch-free +inference/adaptation path of Project MERIDIAN, computed by the Rust core. + +Not in the binary wheels yet (see ruvnet/RuView#1412 — the P6 SOTA +bindings are shipped source-build-only for now to keep the base wheel +small). Build from source with ``maturin ... --features meridian`` (or +``--features sota`` for all three P6 subsystems). + +Quick start:: + + from wifi_densepose.meridian import HardwareNormalizer, HardwareType + + norm = HardwareNormalizer() # canonical 56 subcarriers + hw = HardwareType.detect(64) # -> HardwareType.Esp32S3 + frame = norm.normalize(amplitude, phase, hw) # -> CanonicalCsiFrame + print(len(frame.amplitude), frame.hardware_type) + +Note (honest scope, ADR-185 §3.3): the ADR's ``RapidAdaptation.calibrate`` +/ ``AdaptationResult.converged`` do not exist in the Rust core — use +``push_frame(...)`` then ``adapt()``; the result exposes ``final_loss``, +``frames_used``, ``adaptation_epochs``. Training-time types +(DomainFactorizer, GradientReversalLayer, VirtualDomainAugmentor) are +out of scope for P6 (they need the deferred libtorch training tier). +""" + +from __future__ import annotations + +from wifi_densepose import _native + +# MERIDIAN symbols are compiled into `_native` only under the Rust +# `meridian` feature; absent in a base wheel (ADR-185 §6 acceptance). +if not hasattr(_native, "HardwareNormalizer"): + raise ImportError( + "wifi_densepose.meridian is not in the binary wheels yet " + "(see ruvnet/RuView#1412). Build from source with " + "`maturin ... --features meridian` (or `--features sota`)." + ) + +HardwareType = _native.HardwareType +CanonicalCsiFrame = _native.CanonicalCsiFrame +HardwareNormalizer = _native.HardwareNormalizer +MeridianGeometryConfig = _native.MeridianGeometryConfig +GeometryEncoder = _native.GeometryEncoder +RapidAdaptation = _native.RapidAdaptation +AdaptationResult = _native.AdaptationResult +CrossDomainEvaluator = _native.CrossDomainEvaluator +mpjpe = _native.mpjpe + +__all__ = [ + "HardwareType", + "CanonicalCsiFrame", + "HardwareNormalizer", + "MeridianGeometryConfig", + "GeometryEncoder", + "RapidAdaptation", + "AdaptationResult", + "CrossDomainEvaluator", + "mpjpe", +] diff --git a/python/wifi_densepose/meridian.pyi b/python/wifi_densepose/meridian.pyi new file mode 100644 index 00000000..f3473404 --- /dev/null +++ b/python/wifi_densepose/meridian.pyi @@ -0,0 +1,105 @@ +"""Type stubs for the MERIDIAN bindings (ADR-185 P2). + +Present only when the wheel is built with the ``[meridian]`` extra. +""" + +from __future__ import annotations + +import enum + +class HardwareType(enum.Enum): + Esp32S3 = 0 + Intel5300 = 1 + Atheros = 2 + Generic = 3 + @staticmethod + def detect(subcarrier_count: int) -> HardwareType: ... + @property + def subcarrier_count(self) -> int: ... + @property + def mimo_streams(self) -> int: ... + def __repr__(self) -> str: ... + +class CanonicalCsiFrame: + @property + def amplitude(self) -> list[float]: ... + @property + def phase(self) -> list[float]: ... + @property + def hardware_type(self) -> HardwareType: ... + def __repr__(self) -> str: ... + +class HardwareNormalizer: + def __init__(self, canonical_subcarriers: int = ...) -> None: ... + @staticmethod + def detect_hardware(subcarrier_count: int) -> HardwareType: ... + @property + def canonical_subcarriers(self) -> int: ... + def normalize( + self, amplitude: list[float], phase: list[float], hardware: HardwareType + ) -> CanonicalCsiFrame: ... + def __repr__(self) -> str: ... + +class MeridianGeometryConfig: + def __init__( + self, + n_frequencies: int = ..., + scale: float = ..., + geometry_dim: int = ..., + seed: int = ..., + ) -> None: ... + @property + def n_frequencies(self) -> int: ... + @property + def scale(self) -> float: ... + @property + def geometry_dim(self) -> int: ... + @property + def seed(self) -> int: ... + def __repr__(self) -> str: ... + +class GeometryEncoder: + def __init__(self, config: MeridianGeometryConfig | None = ...) -> None: ... + def encode(self, ap_positions: list[list[float]]) -> list[float]: ... + @property + def geometry_dim(self) -> int: ... + def __repr__(self) -> str: ... + +class AdaptationResult: + @property + def lora_weights(self) -> list[float]: ... + @property + def final_loss(self) -> float: ... + @property + def frames_used(self) -> int: ... + @property + def adaptation_epochs(self) -> int: ... + def __repr__(self) -> str: ... + +class RapidAdaptation: + def __init__( + self, + min_calibration_frames: int, + lora_rank: int, + loss_kind: str = ..., + epochs: int = ..., + lr: float = ..., + lambda_ent: float = ..., + ) -> None: ... + def push_frame(self, frame: list[float]) -> None: ... + def is_ready(self) -> bool: ... + @property + def buffer_len(self) -> int: ... + def adapt(self) -> AdaptationResult: ... + def __repr__(self) -> str: ... + +class CrossDomainEvaluator: + def __init__(self, n_joints: int) -> None: ... + def evaluate( + self, + predictions: list[tuple[list[float], list[float]]], + domain_labels: list[int], + ) -> dict[str, float]: ... + def __repr__(self) -> str: ... + +def mpjpe(pred: list[float], gt: list[float], n_joints: int) -> float: ... diff --git a/scripts/fix-markers.json b/scripts/fix-markers.json index e8375792..26c61217 100644 --- a/scripts/fix-markers.json +++ b/scripts/fix-markers.json @@ -273,6 +273,37 @@ ], "rationale": "ADR-117 §P5 — the project is registered with PyPI via API token, not OIDC Trusted Publisher. The token is sourced from GCP Secret Manager (see docs/integrations/pypi-release.md). Re-introducing the `id-token: write` permission would suggest a partial OIDC migration that won't actually work without registering the Trusted Publisher on pypi.org first — a silent regression that would 403 on the next publish.", "ref": "https://github.com/ruvnet/RuView/pull/786" + }, + { + "id": "RuView#1387-rvf-filename-collision", + "title": "training_api next_model_id(): microsecond timestamp + AtomicU64 counter keeps exported .rvf filenames collision-resistant", + "files": ["v2/crates/wifi-densepose-sensing-server/src/training_api.rs"], + "require": [ + "static MODEL_ID_SEQ: AtomicU64", + "%Y%m%d_%H%M%S_%6f", + "MODEL_ID_SEQ.fetch_add(1, Ordering::Relaxed)", + "model_ids_are_unique_per_call" + ], + "forbid": [ + "/%Y%m%d_%H%M%S(?!_%6f)/" + ], + "rationale": "next_model_id() builds the exported model path as trained-{type}-{ts}-{seq}. A second-resolution timestamp (%Y%m%d_%H%M%S) alone collided for two runs finishing in the same wall-clock second, silently overwriting each other's .rvf artifact and flaking the concurrent model-writing tests on CI (fixed on this branch in 8409f434c). Uniqueness now relies on BOTH microsecond resolution (%6f) AND a process-monotonic AtomicU64 counter appended to the id. Reverting to a bare %Y%m%d_%H%M%S with no sub-second/counter disambiguator reopens the silent-overwrite regression; the forbid uses a negative lookahead so it fires only on a second-resolution format that is NOT followed by _%6f. The model_ids_are_unique_per_call test (1000 back-to-back ids) locks it in.", + "ref": "https://github.com/ruvnet/RuView/pull/1387" + }, + { + "id": "RuView#1387-default-wheel-budget-config", + "title": "python wheel: empty default Cargo features + optional SOTA crates + maturin strip keep the no-extras wheel under the ADR-117 §5.4 5 MB budget", + "files": ["python/Cargo.toml", "python/pyproject.toml"], + "require": [ + "default = []", + "optional = true", + "strip = true" + ], + "forbid": [ + "/default\\s*=\\s*\\[[^\\]]*\"(sota|aether|meridian|mat)\"/" + ], + "rationale": "The [aether]/[meridian]/[mat]/[sota] extras map to Cargo features that link heavy crates (mat -> ort/ONNX Runtime, train -> tokio+ruvector, etc.). The DEFAULT wheel must link none of them to stay under the ADR-117 §5.4 5 MB budget, which requires: (1) `default = []` in python/Cargo.toml [features], (2) every SOTA dep declared `optional = true` so it is pulled only by its own feature, and (3) `strip = true` in pyproject [tool.maturin] to drop debug symbols. Flipping default to include a SOTA feature, or making a SOTA dep non-optional, silently balloons the default wheel. NOTE: a fix-marker is a string guard and cannot measure bytes — it protects the CONFIG that keeps the wheel small. The actual numeric 5 MB ceiling is enforced by the `wheel-size-budget` job in .github/workflows/python-ci.yml, which builds the default (no-features) wheel and fails if it exceeds the budget.", + "ref": "https://github.com/ruvnet/RuView/pull/1387" } ] } diff --git a/ui/components/TrainingPanel.js b/ui/components/TrainingPanel.js index d3b8f6d5..986ff736 100644 --- a/ui/components/TrainingPanel.js +++ b/ui/components/TrainingPanel.js @@ -154,7 +154,14 @@ export default class TrainingPanel { }; await trainingService[method](payload); await this.refresh(); - } catch (e) { this._set({ loading: false, error: `Training failed: ${e.message}` }); } + } catch (e) { + // Start was rejected (e.g. server training disabled → HTTP 409). Tear down + // the progress socket we opened optimistically and refresh so the button + // reflects the real (possibly disabled) state instead of a silent no-op. + trainingService.disconnectProgressStream(); + this._set({ loading: false, error: `Training failed: ${e.message}` }); + this.refresh(); + } } async _stopTraining() { @@ -272,13 +279,29 @@ export default class TrainingPanel { form.appendChild(ir('LoRA Profile (opt.)', 'text', this.config.lora_profile_name, v => { this.config.lora_profile_name = v; })); s.appendChild(form); + // ADR-186 P5: if the server reports in-server training disabled + // (enabled:false), the Start buttons must be disabled with a CLI tooltip — + // never a silent no-op. Enablement is surfaced on the status payload. + const ts = this.state.trainingStatus; + const disabled = ts && ts.enabled === false; + const cli = (ts && ts.cli) || 'wifi-densepose train-room'; + if (disabled) { + const note = this._el('div', 'tp-empty', + `In-server training is disabled on this build. Train from the CLI: ${cli}`); + s.appendChild(note); + } + const acts = this._el('div', 'tp-train-actions'); const btns = [ this._btn('Start Training', 'tp-btn tp-btn-success', () => this._launchTraining('startTraining', { patience: this.config.patience, base_model: this.config.base_model || undefined })), this._btn('Pretrain', 'tp-btn tp-btn-secondary', () => this._launchTraining('startPretraining')), this._btn('LoRA', 'tp-btn tp-btn-secondary', () => this._launchTraining('startLoraTraining', { base_model: this.config.base_model || undefined, profile_name: this.config.lora_profile_name || 'default' })) ]; - btns.forEach(b => { b.disabled = this.state.loading; acts.appendChild(b); }); + btns.forEach(b => { + b.disabled = this.state.loading || disabled; + if (disabled) b.title = `In-server training disabled — use: ${cli}`; + acts.appendChild(b); + }); s.appendChild(acts); return s; } diff --git a/v2/Cargo.lock b/v2/Cargo.lock index 26927517..e4d23aa5 100644 --- a/v2/Cargo.lock +++ b/v2/Cargo.lock @@ -11017,6 +11017,13 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" +[[package]] +name = "wifi-densepose-aether" +version = "0.3.0" +dependencies = [ + "serde_json", +] + [[package]] name = "wifi-densepose-bfld" version = "0.3.1" @@ -11318,11 +11325,13 @@ dependencies = [ "tempfile", "thiserror 1.0.69", "tokio", + "tokio-tungstenite", "tower 0.4.13", "tower-http", "tracing", "tracing-subscriber", "ureq 2.12.1", + "wifi-densepose-aether", "wifi-densepose-bfld", "wifi-densepose-engine", "wifi-densepose-geo", @@ -11394,7 +11403,6 @@ dependencies = [ "tracing", "tracing-subscriber", "walkdir", - "wifi-densepose-nn", "wifi-densepose-signal", ] diff --git a/v2/Cargo.toml b/v2/Cargo.toml index d89c6741..22b701d6 100644 --- a/v2/Cargo.toml +++ b/v2/Cargo.toml @@ -20,6 +20,7 @@ members = [ "crates/wifi-densepose-mat", "crates/wifi-densepose-train", "crates/wifi-densepose-sensing-server", + "crates/wifi-densepose-aether", # ADR-185 §13 — AETHER pure-compute leaf (std-only) "crates/wifi-densepose-wifiscan", "crates/wifi-densepose-vitals", "crates/wifi-densepose-ruvector", diff --git a/v2/crates/wifi-densepose-aether/Cargo.toml b/v2/crates/wifi-densepose-aether/Cargo.toml new file mode 100644 index 00000000..bd88d67c --- /dev/null +++ b/v2/crates/wifi-densepose-aether/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "wifi-densepose-aether" +description = "AETHER pure-compute stack (ADR-024): contrastive CSI embedding, CSI-to-pose transformer, SONA drift/LoRA, and quantization — std-only, no async/server deps so the Python `[aether]` wheel stays lean (ADR-185 §3.2)" +version = "0.3.0" +edition.workspace = true +authors.workspace = true +license.workspace = true +repository.workspace = true +documentation.workspace = true +keywords.workspace = true +categories.workspace = true + +# Intentionally dependency-free: this crate is the leaf hoisted out of +# `wifi-densepose-sensing-server` (ADR-185 §13) precisely so that binding it into +# the `wifi_densepose[aether]` wheel does not pull the Axum/tokio/worldgraph/ +# ruvector server tree. Keep it std-only. +[dependencies] + +# Test-only: parses the committed golden fixtures shared with the Python parity +# tests. Never linked into the library or the wheel. +[dev-dependencies] +serde_json = "1" + +[lib] +name = "wifi_densepose_aether" +path = "src/lib.rs" diff --git a/v2/crates/wifi-densepose-sensing-server/src/embedding.rs b/v2/crates/wifi-densepose-aether/src/embedding.rs similarity index 89% rename from v2/crates/wifi-densepose-sensing-server/src/embedding.rs rename to v2/crates/wifi-densepose-aether/src/embedding.rs index 2b2e43ae..5573b540 100644 --- a/v2/crates/wifi-densepose-sensing-server/src/embedding.rs +++ b/v2/crates/wifi-densepose-aether/src/embedding.rs @@ -822,8 +822,73 @@ impl EmbeddingExtractor { self.projection = proj; Ok(()) } + + /// Serialize all weights (transformer + projection) to `path`. + /// + /// Format (little-endian, zero-dep so the std-only leaf crate stays + /// dependency-free): 8-byte magic `AETHERW1`, then a `u32` parameter + /// count, then that many `f32` values — exactly `flatten_weights()`. + /// + /// This is the counterpart of [`Self::load_weights`]. It enables loading a + /// *real trained* checkpoint once one exists (ADR-185 §13.a); it does not + /// itself make the default (random-init) extractor trained. + pub fn save_weights>(&self, path: P) -> std::io::Result<()> { + let weights = self.flatten_weights(); + let mut buf = Vec::with_capacity(WEIGHT_HEADER_LEN + weights.len() * 4); + buf.extend_from_slice(WEIGHT_MAGIC); + buf.extend_from_slice(&(weights.len() as u32).to_le_bytes()); + for v in &weights { + buf.extend_from_slice(&v.to_le_bytes()); + } + std::fs::write(path, buf) + } + + /// Load weights previously written by [`Self::save_weights`] (or any file in + /// that format) into this extractor, replacing the current (random-init or + /// prior) weights. + /// + /// Errors (never panics) on: unreadable file, a payload shorter than the + /// header, a wrong magic, a truncated/oversized payload, or a parameter + /// count that does not match this extractor's architecture (delegated to + /// [`Self::unflatten_weights`]). + pub fn load_weights>(&mut self, path: P) -> Result<(), String> { + let bytes = std::fs::read(path).map_err(|e| format!("failed to read weight file: {e}"))?; + if bytes.len() < WEIGHT_HEADER_LEN { + return Err(format!( + "weight file too short: {} bytes < {WEIGHT_HEADER_LEN}-byte header", + bytes.len() + )); + } + if &bytes[0..8] != WEIGHT_MAGIC { + return Err("bad magic: not an AETHER weight file (expected 'AETHERW1')".to_string()); + } + let count = u32::from_le_bytes([bytes[8], bytes[9], bytes[10], bytes[11]]) as usize; + let expected_len = WEIGHT_HEADER_LEN + count * 4; + if bytes.len() != expected_len { + return Err(format!( + "weight payload size mismatch: header declares {count} params ({expected_len} bytes), file is {} bytes", + bytes.len() + )); + } + let mut weights = Vec::with_capacity(count); + for i in 0..count { + let o = WEIGHT_HEADER_LEN + i * 4; + weights.push(f32::from_le_bytes([ + bytes[o], + bytes[o + 1], + bytes[o + 2], + bytes[o + 3], + ])); + } + self.unflatten_weights(&weights) + } } +/// Magic prefix for AETHER weight files (see [`EmbeddingExtractor::save_weights`]). +const WEIGHT_MAGIC: &[u8; 8] = b"AETHERW1"; +/// 8-byte magic + 4-byte `u32` param count. +const WEIGHT_HEADER_LEN: usize = 12; + // ── CSI feature statistics ───────────────────────────────────────────────── /// Compute mean and variance of all values in a CSI feature matrix. @@ -1219,6 +1284,84 @@ mod tests { } } + // ── Weight save/load (ADR-185 §13.a) ──────────────────────────────── + + /// Deterministic, non-random weight pattern. Values are `k/65536 - 0.5` + /// with `k ∈ [0, 65535]`, i.e. multiples of 2⁻¹⁶ — exactly representable + /// in both f32 and f64 so a cross-language (Rust ↔ Python) fixture using + /// the same formula produces byte-identical weights. + fn deterministic_weights(n: usize) -> Vec { + (0..n) + .map(|i| { + let k = (i as u32).wrapping_mul(1_103_515_245).wrapping_add(12_345) % 65_536; + k as f32 / 65_536.0 - 0.5 + }) + .collect() + } + + #[test] + fn load_weights_actually_replaces_weights_and_round_trips() { + let mut ext = EmbeddingExtractor::new(small_config(), small_embed_config()); + let csi = make_csi(4, 16, 42); + let baseline = ext.extract(&csi); // random Xavier init + + // Build a source extractor with deterministic non-default weights and + // serialize it. + let det = deterministic_weights(ext.param_count()); + let mut src = EmbeddingExtractor::new(small_config(), small_embed_config()); + src.unflatten_weights(&det).unwrap(); + let src_emb = src.extract(&csi); + + let path = std::env::temp_dir() + .join(format!("aether_wtest_{}_{:p}.bin", std::process::id(), &ext)); + src.save_weights(&path).unwrap(); + + // Load into the random-init extractor. + ext.load_weights(&path).unwrap(); + let loaded_emb = ext.extract(&csi); + + // (1) The loaded weights are ACTUALLY used — output moved away from the + // random-init baseline (proves load is not a silent no-op). + let differs = baseline + .iter() + .zip(&loaded_emb) + .any(|(a, b)| (a - b).abs() > 1e-6); + assert!( + differs, + "load_weights had no effect: embedding still equals the random-init baseline" + ); + + // (2) It matches the source extractor whose weights we saved (round-trip). + for (a, b) in src_emb.iter().zip(&loaded_emb) { + assert!((a - b).abs() < 1e-6, "loaded embedding != source: {a} vs {b}"); + } + + // (3) The weights are bit-identical after the file round-trip. + assert_eq!(ext.flatten_weights(), det); + + std::fs::remove_file(&path).ok(); + } + + #[test] + fn load_weights_rejects_bad_magic_and_wrong_count() { + let mut ext = EmbeddingExtractor::new(small_config(), small_embed_config()); + let base = std::env::temp_dir().join(format!("aether_wbad_{}.bin", std::process::id())); + + // Bad magic. + std::fs::write(&base, b"NOPEMAGIC\x00\x00\x00").unwrap(); + assert!(ext.load_weights(&base).is_err()); + + // Right magic, wrong param count for this architecture. + let mut bad = Vec::new(); + bad.extend_from_slice(WEIGHT_MAGIC); + bad.extend_from_slice(&3u32.to_le_bytes()); + bad.extend_from_slice(&[0u8; 12]); // 3 f32s — won't match param_count + std::fs::write(&base, &bad).unwrap(); + assert!(ext.load_weights(&base).is_err()); + + std::fs::remove_file(&base).ok(); + } + // ── FingerprintIndex tests ────────────────────────────────────────── #[test] diff --git a/v2/crates/wifi-densepose-sensing-server/src/graph_transformer.rs b/v2/crates/wifi-densepose-aether/src/graph_transformer.rs similarity index 100% rename from v2/crates/wifi-densepose-sensing-server/src/graph_transformer.rs rename to v2/crates/wifi-densepose-aether/src/graph_transformer.rs diff --git a/v2/crates/wifi-densepose-aether/src/lib.rs b/v2/crates/wifi-densepose-aether/src/lib.rs new file mode 100644 index 00000000..ef1237ad --- /dev/null +++ b/v2/crates/wifi-densepose-aether/src/lib.rs @@ -0,0 +1,28 @@ +//! AETHER pure-compute stack (ADR-024 / ADR-185 §3.2). +//! +//! This crate is the dependency-free leaf hoisted out of +//! `wifi-densepose-sensing-server` so that the Python `wifi_densepose[aether]` +//! wheel can bind the contrastive-embedding surface without linking the server's +//! Axum / tokio / worldgraph / ruvector tree (which blew the ADR-117 §5.4 ≤5 MB +//! wheel budget). +//! +//! Modules: +//! - [`embedding`] — AETHER contrastive CSI embedding: `EmbeddingConfig`, +//! `EmbeddingExtractor`, `ProjectionHead`, `CsiAugmenter`, `info_nce_loss`, +//! fingerprint indices. +//! - [`graph_transformer`] — CSI-to-pose transformer primitives +//! (`CsiToPoseTransformer`, `TransformerConfig`, `Linear`). +//! - [`sona`] — self-organizing drift detection + LoRA adaptation + EWC. +//! - [`sparse_inference`] — quantization helpers used by the embedding path. +//! +//! `wifi-densepose-sensing-server` re-exports these modules so its own code and +//! public API are unchanged. + +// `embedding` carries a couple of not-yet-read fields (e.g. `PoseEncoder.d_proj`); +// this mirrors the `#[allow(dead_code)]` the module had at its previous home in +// `wifi-densepose-sensing-server`. +#[allow(dead_code)] +pub mod embedding; +pub mod graph_transformer; +pub mod sona; +pub mod sparse_inference; diff --git a/v2/crates/wifi-densepose-sensing-server/src/sona.rs b/v2/crates/wifi-densepose-aether/src/sona.rs similarity index 100% rename from v2/crates/wifi-densepose-sensing-server/src/sona.rs rename to v2/crates/wifi-densepose-aether/src/sona.rs diff --git a/v2/crates/wifi-densepose-sensing-server/src/sparse_inference.rs b/v2/crates/wifi-densepose-aether/src/sparse_inference.rs similarity index 100% rename from v2/crates/wifi-densepose-sensing-server/src/sparse_inference.rs rename to v2/crates/wifi-densepose-aether/src/sparse_inference.rs diff --git a/v2/crates/wifi-densepose-aether/tests/golden_parity.rs b/v2/crates/wifi-densepose-aether/tests/golden_parity.rs new file mode 100644 index 00000000..5458601a --- /dev/null +++ b/v2/crates/wifi-densepose-aether/tests/golden_parity.rs @@ -0,0 +1,115 @@ +//! ADR-185 §4.1 — NATIVE half of the AETHER parity gate, and the half that runs +//! in CI. +//! +//! The committed golden vectors live under `python/tests/golden/` and are +//! shared with `python/tests/test_aether.py` (the binding half). That pytest +//! runs in python-ci; the native reference tests in `python/tests/*.rs` link +//! against the PyO3 crate and are NOT run by any workflow. This test closes that +//! gap: it recomputes the embedding through THIS std-only crate — no PyO3, no +//! marshalling — and asserts it matches the same golden within tolerance. +//! +//! Together with the pytest half: native≈golden AND binding≈golden ⇒ +//! binding≈native, portably. And because this side has no marshalling, a +//! binding-specific defect baked into the golden would surface here as a native +//! mismatch — which is the failure mode a binding-derived golden + pytest-only +//! CI would otherwise hide. +//! +//! Runs under the repo's `cargo test --workspace` (this crate is a member). + +use std::path::PathBuf; + +use wifi_densepose_aether::embedding::{EmbeddingConfig, EmbeddingExtractor}; +use wifi_densepose_aether::graph_transformer::TransformerConfig; + +// Same tolerance as the Python and .rs parity tests. f32 + transcendentals are +// not bit-reproducible across arch, so the golden (generated on one machine) is +// compared within a bound, not by hash. +const PARITY_ATOL: f32 = 1e-4; +const PARITY_RTOL: f32 = 1e-4; + +fn golden_dir() -> PathBuf { + // This crate lives at v2/crates/wifi-densepose-aether; the shared golden + // fixtures are the single source of truth under python/tests/golden. + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../../../python/tests/golden") +} + +fn read_vec(name: &str) -> Vec { + let raw = std::fs::read_to_string(golden_dir().join(name)) + .unwrap_or_else(|e| panic!("read {name}: {e}")); + serde_json::from_str(&raw).unwrap_or_else(|e| panic!("parse {name}: {e}")) +} + +fn load_input() -> Vec> { + let raw = std::fs::read_to_string(golden_dir().join("aether_input.json")) + .expect("read aether_input.json"); + let rows: Vec> = serde_json::from_str(&raw).expect("parse aether_input.json"); + rows.into_iter() + .map(|r| r.into_iter().map(|x| x as f32).collect()) + .collect() +} + +fn extractor() -> EmbeddingExtractor { + let e = EmbeddingConfig { d_model: 64, d_proj: 128, temperature: 0.07, normalize: true }; + let t = TransformerConfig { + n_subcarriers: 56, + n_keypoints: 17, + d_model: 64, + n_heads: 4, + n_gnn_layers: 2, + }; + EmbeddingExtractor::new(t, e) +} + +fn formula_weights(n: usize) -> Vec { + (0..n) + .map(|i| ((i as u64 * 1103515245 + 12345) % 65536) as f32 / 65536.0 - 0.5) + .collect() +} + +fn assert_matches_golden(embedding: &[f32], name: &str) { + let golden = read_vec(name); + assert_eq!(embedding.len(), golden.len(), "{name}: length mismatch"); + for (i, (&a, &b)) in embedding.iter().zip(&golden).enumerate() { + assert!(a.is_finite(), "{name}: element {i} is not finite ({a})"); + let tol = PARITY_ATOL + PARITY_RTOL * b.abs(); + assert!( + (a - b).abs() <= tol, + "{name}: element {i} diverged beyond tolerance \ + (got {a}, golden {b}, |Δ|={}) — real regression, not arch drift", + (a - b).abs() + ); + } +} + +#[test] +fn native_base_embedding_matches_committed_golden() { + let emb = extractor().extract(&load_input()); + assert_matches_golden(&emb, "aether_embedding.json"); +} + +#[test] +fn native_loaded_embedding_matches_committed_golden() { + let input = load_input(); + let mut ext = extractor(); + let baseline = ext.extract(&input); + + let weights = formula_weights(ext.param_count()); + let mut buf = Vec::new(); + buf.extend_from_slice(b"AETHERW1"); + buf.extend_from_slice(&(weights.len() as u32).to_le_bytes()); + for w in &weights { + buf.extend_from_slice(&w.to_le_bytes()); + } + let wpath = std::env::temp_dir().join(format!("aether_golden_parity_{}.bin", std::process::id())); + std::fs::write(&wpath, &buf).expect("write weights"); + ext.load_weights(&wpath).expect("load_weights"); + let _ = std::fs::remove_file(&wpath); + + let loaded = ext.extract(&input); + assert!( + baseline.iter().zip(&loaded).any(|(a, b)| (a - b).abs() > 1e-6), + "load_weights had no effect vs the random-init baseline" + ); + assert_matches_golden(&loaded, "aether_loaded_embedding.json"); +} diff --git a/v2/crates/wifi-densepose-mat/Cargo.toml b/v2/crates/wifi-densepose-mat/Cargo.toml index 937a3d77..e393371b 100644 --- a/v2/crates/wifi-densepose-mat/Cargo.toml +++ b/v2/crates/wifi-densepose-mat/Cargo.toml @@ -12,15 +12,25 @@ categories = ["science", "algorithms"] readme = "README.md" [features] -default = ["std", "api", "ruvector"] +default = ["std", "api", "ruvector", "ml"] ruvector = ["dep:ruvector-solver", "dep:ruvector-temporal-tensor"] std = [] +# ONNX-backed ML detection (debris + vital-signs classifiers). Pulls +# `wifi-densepose-nn` (and, via its default `onnx` feature, the `ort` +# ONNX Runtime + its download/reqwest stack) ONLY when enabled. The +# survivor-detection/triage pipeline works without it (ML is an optional +# enhancement, off unless `DetectionConfig::enable_ml`), so consumers that +# don't need ONNX — e.g. the ADR-185 `wifi-densepose-py` `[mat]` wheel — +# build `--no-default-features` and drop the entire ort/reqwest tree, +# keeping the wheel within the ADR-117 §5.4 budget. +ml = ["dep:wifi-densepose-nn"] # REST/WebSocket surface. Pulls the web stack (axum, futures-util) only when # enabled, and enables the `serde` FEATURE (not just `dep:serde`) so the # `cfg_attr(feature = "serde", ...)` derives on domain types are actually # active when the API is on (review finding 5: `api = ["dep:serde"]` enabled # the dependency but left every `feature = "serde"` cfg dead). -api = ["serde", "dep:axum", "dep:futures-util"] +# The REST surface exposes ML status (`ml_ready`), so `api` implies `ml`. +api = ["ml", "serde", "dep:axum", "dep:futures-util"] # Real ESP32 serial CSI ingest. Pulls the native `serialport` crate (libudev on # Linux) only when enabled, so the default/no-default appliance build stays free # of native serial deps. With the feature OFF, the ESP32 serial *parser* still @@ -36,14 +46,18 @@ serde = ["dep:serde", "chrono/serde", "geo/use-serde"] # Workspace dependencies wifi-densepose-core = { version = "0.3.0", path = "../wifi-densepose-core" } wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal", default-features = false } -wifi-densepose-nn = { version = "0.3.0", path = "../wifi-densepose-nn" } +wifi-densepose-nn = { version = "0.3.0", path = "../wifi-densepose-nn", optional = true } ruvector-solver = { workspace = true, optional = true } ruvector-temporal-tensor = { workspace = true, optional = true } # Async runtime — required by the core integration layer (UDP CSI receiver, # hardware adapter, scan loop in `DisasterResponse::start_scanning`), not just # the REST API, so it is deliberately NOT gated behind `api`. -tokio = { version = "1.35", features = ["rt", "sync", "time"] } +# `macros` is needed by `tokio::select!` in integration/hardware_adapter.rs. +# It was previously satisfied only by feature-unification from the (now +# optional) `wifi-densepose-nn` dep; declare it explicitly so a +# `--no-default-features` build (the ADR-185 [mat] wheel) still compiles. +tokio = { version = "1.35", features = ["rt", "sync", "time", "macros"] } async-trait = "0.1" # Web framework (REST API) — only compiled with the `api` feature. diff --git a/v2/crates/wifi-densepose-mat/src/detection/pipeline.rs b/v2/crates/wifi-densepose-mat/src/detection/pipeline.rs index 7229ece3..0402a5b5 100644 --- a/v2/crates/wifi-densepose-mat/src/detection/pipeline.rs +++ b/v2/crates/wifi-densepose-mat/src/detection/pipeline.rs @@ -8,6 +8,7 @@ use super::{ MovementClassifier, MovementClassifierConfig, }; use crate::domain::{ScanZone, VitalSignsReading}; +#[cfg(feature = "ml")] use crate::ml::{MlDetectionConfig, MlDetectionPipeline, MlDetectionResult}; use crate::{DisasterConfig, MatError}; @@ -26,9 +27,10 @@ pub struct DetectionConfig { pub enable_heartbeat: bool, /// Minimum overall confidence to report detection pub min_confidence: f64, - /// Enable ML-enhanced detection + /// Enable ML-enhanced detection (requires the `ml` feature to have any effect) pub enable_ml: bool, /// ML detection configuration (if enabled) + #[cfg(feature = "ml")] pub ml_config: Option, } @@ -42,6 +44,7 @@ impl Default for DetectionConfig { enable_heartbeat: false, min_confidence: 0.3, enable_ml: false, + #[cfg(feature = "ml")] ml_config: None, } } @@ -64,6 +67,7 @@ impl DetectionConfig { } /// Enable ML-enhanced detection with the given configuration + #[cfg(feature = "ml")] pub fn with_ml(mut self, ml_config: MlDetectionConfig) -> Self { self.enable_ml = true; self.ml_config = Some(ml_config); @@ -71,6 +75,7 @@ impl DetectionConfig { } /// Enable ML-enhanced detection with default configuration + #[cfg(feature = "ml")] pub fn with_default_ml(mut self) -> Self { self.enable_ml = true; self.ml_config = Some(MlDetectionConfig::default()); @@ -147,12 +152,14 @@ pub struct DetectionPipeline { movement_classifier: MovementClassifier, data_buffer: parking_lot::RwLock, /// Optional ML detection pipeline + #[cfg(feature = "ml")] ml_pipeline: Option, } impl DetectionPipeline { /// Create a new detection pipeline pub fn new(config: DetectionConfig) -> Self { + #[cfg(feature = "ml")] let ml_pipeline = if config.enable_ml { config.ml_config.clone().map(MlDetectionPipeline::new) } else { @@ -164,12 +171,14 @@ impl DetectionPipeline { heartbeat_detector: HeartbeatDetector::new(config.heartbeat.clone()), movement_classifier: MovementClassifier::new(config.movement.clone()), data_buffer: parking_lot::RwLock::new(CsiDataBuffer::new(config.sample_rate)), + #[cfg(feature = "ml")] ml_pipeline, config, } } /// Initialize ML models asynchronously (if enabled) + #[cfg(feature = "ml")] pub async fn initialize_ml(&mut self) -> Result<(), MatError> { if let Some(ref mut ml) = self.ml_pipeline { ml.initialize().await.map_err(MatError::from)?; @@ -178,6 +187,7 @@ impl DetectionPipeline { } /// Check if ML pipeline is ready + #[cfg(feature = "ml")] pub fn ml_ready(&self) -> bool { self.ml_pipeline.as_ref().is_none_or(|ml| ml.is_ready()) } @@ -210,13 +220,23 @@ impl DetectionPipeline { // `buffer` guard dropped here }; - // If ML is enabled and ready, enhance with ML predictions - let enhanced_reading = if self.config.enable_ml && self.ml_ready() { - // Snapshot the buffer under the lock, then drop the guard before await. - let buffer_snapshot = { self.data_buffer.read().clone() }; - self.enhance_with_ml(reading, &buffer_snapshot).await? - } else { - reading + // If ML is enabled and ready, enhance with ML predictions (only + // compiled under the `ml` feature; the base build is signal-only). + let enhanced_reading = { + #[cfg(feature = "ml")] + { + if self.config.enable_ml && self.ml_ready() { + // Snapshot the buffer under the lock, then drop the guard before await. + let buffer_snapshot = { self.data_buffer.read().clone() }; + self.enhance_with_ml(reading, &buffer_snapshot).await? + } else { + reading + } + } + #[cfg(not(feature = "ml"))] + { + reading + } }; // Check minimum confidence @@ -230,6 +250,7 @@ impl DetectionPipeline { } /// Enhance detection results with ML predictions + #[cfg(feature = "ml")] async fn enhance_with_ml( &self, traditional_reading: Option, @@ -262,6 +283,7 @@ impl DetectionPipeline { } /// Get the latest ML detection results (if ML is enabled) + #[cfg(feature = "ml")] pub async fn get_ml_results(&self) -> Option { let ml = match &self.ml_pipeline { Some(ml) => ml, @@ -346,6 +368,7 @@ impl DetectionPipeline { self.movement_classifier = MovementClassifier::new(config.movement.clone()); // Update ML pipeline if configuration changed + #[cfg(feature = "ml")] if config.enable_ml != self.config.enable_ml || config.ml_config != self.config.ml_config { self.ml_pipeline = if config.enable_ml { config.ml_config.clone().map(MlDetectionPipeline::new) @@ -358,6 +381,7 @@ impl DetectionPipeline { } /// Get the ML pipeline (if enabled) + #[cfg(feature = "ml")] pub fn ml_pipeline(&self) -> Option<&MlDetectionPipeline> { self.ml_pipeline.as_ref() } diff --git a/v2/crates/wifi-densepose-mat/src/lib.rs b/v2/crates/wifi-densepose-mat/src/lib.rs index afb21a72..6a49c10b 100644 --- a/v2/crates/wifi-densepose-mat/src/lib.rs +++ b/v2/crates/wifi-densepose-mat/src/lib.rs @@ -87,6 +87,10 @@ pub mod detection; pub mod domain; pub mod integration; pub mod localization; +/// ONNX-backed ML detection. Requires the `ml` feature (pulls +/// `wifi-densepose-nn` + `ort`). The core survivor-detection/triage +/// pipeline works without it. +#[cfg(feature = "ml")] pub mod ml; pub mod tracking; @@ -130,6 +134,7 @@ pub use integration::{ #[cfg_attr(docsrs, doc(cfg(feature = "api")))] pub use api::{create_router, AppState}; +#[cfg(feature = "ml")] pub use ml::{ AttenuationPrediction, BreathingClassification, @@ -207,6 +212,7 @@ pub enum MatError { Io(#[from] std::io::Error), /// Machine learning error + #[cfg(feature = "ml")] #[error("ML error: {0}")] Ml(#[from] ml::MlError), } @@ -592,8 +598,6 @@ pub mod prelude { AssociationResult, BreathingPattern, Coordinates3D, - DebrisClassification, - DebrisModel, DetectionEvent, DetectionObservation, // Detection @@ -614,11 +618,6 @@ pub mod prelude { // Localization LocalizationService, MatError, - MaterialType, - // ML types - MlDetectionConfig, - MlDetectionPipeline, - MlDetectionResult, Priority, Result, ScanZone, @@ -631,12 +630,17 @@ pub mod prelude { TrackerConfig, TrackingEvent, TriageStatus, - UncertaintyEstimate, - VitalSignsClassifier, VitalSignsDetector, VitalSignsReading, ZoneBounds, }; + + // ONNX-backed ML types — only when the `ml` feature is enabled. + #[cfg(feature = "ml")] + pub use crate::{ + DebrisClassification, DebrisModel, MaterialType, MlDetectionConfig, MlDetectionPipeline, + MlDetectionResult, UncertaintyEstimate, VitalSignsClassifier, + }; } #[cfg(test)] diff --git a/v2/crates/wifi-densepose-sensing-server/Cargo.toml b/v2/crates/wifi-densepose-sensing-server/Cargo.toml index 34347cde..62eb6fad 100644 --- a/v2/crates/wifi-densepose-sensing-server/Cargo.toml +++ b/v2/crates/wifi-densepose-sensing-server/Cargo.toml @@ -41,6 +41,12 @@ chrono = { version = "0.4", features = ["serde"] } # CLI clap = { workspace = true } +# ADR-185 §3.2/§13: AETHER pure-compute stack (embedding / graph_transformer / +# sona / sparse_inference), hoisted into a std-only leaf crate and re-exported +# from `lib.rs` so the Python `[aether]` wheel can bind it without this server's +# Axum/tokio/worldgraph/ruvector tree. +wifi-densepose-aether = { version = "0.3.0", path = "../wifi-densepose-aether" } + # Multi-BSSID WiFi scanning pipeline (ADR-022 Phase 3) wifi-densepose-wifiscan = { version = "0.3.0", path = "../wifi-densepose-wifiscan" } @@ -120,6 +126,10 @@ matter = [] tempfile = "3.10" # `tower::ServiceExt::oneshot` for in-process Router tests (bearer_auth). tower = { workspace = true } +# ADR-186 P6 — real-socket WebSocket client for the `/ws/train/progress` +# 101-upgrade + live-progress-frame test. Pinned to the version already resolved +# in the workspace lock (via homecore-api) so this adds no new lock entry. +tokio-tungstenite = "0.24" # ADR-115 P9 — micro-benchmarks for MQTT hot paths + semantic bus. # Heavy dep tree (~80 transitive crates) so it's dev-only; benches live # behind --features mqtt because they bench the mqtt module. diff --git a/v2/crates/wifi-densepose-sensing-server/src/lib.rs b/v2/crates/wifi-densepose-sensing-server/src/lib.rs index b0d802ea..7779f79a 100644 --- a/v2/crates/wifi-densepose-sensing-server/src/lib.rs +++ b/v2/crates/wifi-densepose-sensing-server/src/lib.rs @@ -14,10 +14,7 @@ pub mod ws_ticket; pub mod cli; pub mod dataset; pub mod edge_registry; -#[allow(dead_code)] -pub mod embedding; pub mod error_response; -pub mod graph_transformer; pub mod host_validation; pub mod introspection; pub mod matter; @@ -31,8 +28,6 @@ pub mod semantic; pub mod rufield_surface; pub mod rvf_container; pub mod rvf_pipeline; -pub mod sona; -pub mod sparse_inference; #[allow(dead_code)] pub mod trainer; pub mod vital_signs; @@ -44,3 +39,12 @@ pub mod vendor_origin_plume; pub mod vendor_remaining; /// ADR-270 provider registry and canonical event helpers. pub mod vendor_rf; + +// ADR-185 §3.2/§13: the AETHER pure-compute stack (contrastive embedding, +// CSI-to-pose transformer, SONA, quantization) was hoisted into the std-only +// `wifi-densepose-aether` leaf crate so the Python `[aether]` wheel can bind it +// without this crate's Axum/tokio/worldgraph/ruvector tree. Re-exported here so +// this crate's own code (`crate::embedding`, `crate::graph_transformer`, +// `crate::sona`) and public API (`wifi_densepose_sensing_server::embedding`, …) +// are unchanged. +pub use wifi_densepose_aether::{embedding, graph_transformer, sona, sparse_inference}; diff --git a/v2/crates/wifi-densepose-sensing-server/src/main.rs b/v2/crates/wifi-densepose-sensing-server/src/main.rs index 0e6be4a2..e986b090 100644 --- a/v2/crates/wifi-densepose-sensing-server/src/main.rs +++ b/v2/crates/wifi-densepose-sensing-server/src/main.rs @@ -20,8 +20,14 @@ mod multistatic_bridge; mod mediatek_csi; mod qualcomm_csi; mod realtek_radar; +mod path_safety; pub mod pose; mod rvf_container; +// ADR-186 (TRAIN-RECONNECT): the in-server training pipeline was written but +// never declared as a module, so it was orphaned / uncompiled. Declaring it +// here compiles it against the real `AppStateInner` and wires its `routes()` +// (including `/ws/train/progress`) into the live router below. +mod training_api; mod rvf_pipeline; mod tracker_bridge; pub mod types; @@ -1120,11 +1126,13 @@ struct AppStateInner { recording_current_id: Option, /// Shutdown signal for the recording writer task. recording_stop_tx: Option>, - // ── Training fields ───────────────────────────────────────────────────── - /// Training status: "idle", "running", "completed", "failed". - training_status: String, - /// Training configuration, if any. - training_config: Option, + // ── Training fields (ADR-186 TRAIN-RECONNECT) ──────────────────────────── + /// Live training state (shared status snapshot + cooperative cancel flag + + /// background task handle) for the in-server trainer in `training_api`. + training_state: training_api::TrainingState, + /// Fan-out channel the background training job publishes progress JSON to; + /// the `/ws/train/progress` WebSocket handler subscribes to it. + training_progress_tx: broadcast::Sender, // ── Adaptive classifier (environment-tuned) ────────────────────────── /// Trained adaptive model (loaded from data/adaptive_model.json or trained at runtime). adaptive_model: Option, @@ -1248,6 +1256,87 @@ const FRAME_HISTORY_CAPACITY: usize = 100; type SharedState = Arc>; +#[cfg(test)] +impl AppStateInner { + /// Minimal, dependency-free `AppStateInner` for in-process router tests + /// (ADR-186 P6). Uses the same field constructors as the real state seeding + /// in `main()` but with trivial values and no CLI/config inputs, so tests can + /// build the training router without the full server boot. + pub(crate) fn minimal() -> Self { + AppStateInner { + latest_update: None, + rssi_history: VecDeque::new(), + frame_history: VecDeque::new(), + tick: 0, + source: "test".to_string(), + last_esp32_frame: None, + latest_realtek_radar: None, + last_realtek_frame: None, + latest_mediatek_csi: None, + last_mediatek_frame: None, + latest_qualcomm_csi: None, + last_qualcomm_frame: None, + latest_vendor_rf: BTreeMap::new(), + tx: broadcast::channel::(16).0, + intro: wifi_densepose_sensing_server::introspection::IntrospectionState::new(), + intro_tx: broadcast::channel::(16).0, + total_detections: 0, + start_time: std::time::Instant::now(), + vital_detector: VitalSignDetector::new(10.0), + latest_vitals: VitalSigns::default(), + rvf_info: None, + save_rvf_path: None, + progressive_loader: None, + active_sona_profile: None, + model_loaded: false, + smoothed_person_score: 0.0, + prev_person_count: 0, + smoothed_motion: 0.0, + current_motion_level: "absent".to_string(), + debounce_counter: 0, + debounce_candidate: "absent".to_string(), + baseline_motion: 0.0, + baseline_frames: 0, + smoothed_hr: 0.0, + smoothed_br: 0.0, + smoothed_hr_conf: 0.0, + smoothed_br_conf: 0.0, + hr_buffer: VecDeque::with_capacity(8), + br_buffer: VecDeque::with_capacity(8), + edge_vitals: None, + latest_wasm_events: None, + discovered_models: Vec::new(), + active_model_id: None, + recordings: Vec::new(), + recording_active: false, + recording_start_time: None, + recording_current_id: None, + recording_stop_tx: None, + training_state: training_api::TrainingState::default(), + training_progress_tx: broadcast::channel::(256).0, + adaptive_model: None, + node_states: HashMap::new(), + pose_tracker: PoseTracker::new(), + last_tracker_instant: None, + multistatic_fuser: MultistaticFuser::new(), + engine_bridge: engine_bridge::EngineBridge::new( + wifi_densepose_bfld::PrivacyMode::PrivateHome, + 1, + "default", + "Default Room", + None, + ), + field_model: None, + p95_variance: RollingP95::new(600, 60), + p95_motion_band_power: RollingP95::new(600, 60), + p95_spectral_power: RollingP95::new(600, 60), + dedup_factor: 3.0, + data_dir: std::path::PathBuf::from("data"), + field_surface: Arc::new(RwLock::new(rufield_surface::FieldSurface::from_env())), + } + } +} + // ── ESP32 Edge Vitals Packet (ADR-039, magic 0xC511_0002) ──────────────────── /// Decoded vitals packet from ESP32 edge processing pipeline. @@ -4973,54 +5062,12 @@ fn scan_recording_files() -> Vec { } // ── Training Endpoints ────────────────────────────────────────────────────── - -/// GET /api/v1/train/status — get training status. -async fn train_status(State(state): State) -> Json { - let s = state.read().await; - Json(serde_json::json!({ - "status": s.training_status, - "config": s.training_config, - })) -} - -/// POST /api/v1/train/start — start a training run. -async fn train_start( - State(state): State, - Json(body): Json, -) -> Json { - let mut s = state.write().await; - if s.training_status == "running" { - return Json(serde_json::json!({ - "error": "training already running", - "success": false, - })); - } - s.training_status = "running".to_string(); - s.training_config = Some(body.clone()); - info!("Training started with config: {}", body); - Json(serde_json::json!({ - "success": true, - "status": "running", - "message": "Training pipeline started. Use GET /api/v1/train/status to monitor.", - })) -} - -/// POST /api/v1/train/stop — stop the current training run. -async fn train_stop(State(state): State) -> Json { - let mut s = state.write().await; - if s.training_status != "running" { - return Json(serde_json::json!({ - "error": "no training in progress", - "success": false, - })); - } - s.training_status = "idle".to_string(); - info!("Training stopped"); - Json(serde_json::json!({ - "success": true, - "status": "idle", - })) -} +// +// ADR-186 (TRAIN-RECONNECT): the former stub handlers here flipped a status +// string and logged one line without ever starting a job (issue #1233). They +// are replaced by the real `training_api` router, merged into the app below, +// which runs the pure-Rust trainer on a background task and streams live +// progress over `/ws/train/progress`. // ── Adaptive classifier endpoints ──────────────────────────────────────────── @@ -7826,9 +7873,9 @@ async fn main() { recording_start_time: None, recording_current_id: None, recording_stop_tx: None, - // Training - training_status: "idle".to_string(), - training_config: None, + // Training (ADR-186 TRAIN-RECONNECT) + training_state: training_api::TrainingState::default(), + training_progress_tx: broadcast::channel::(256).0, adaptive_model: adaptive_classifier::AdaptiveModel::load(&adaptive_classifier::model_path()) .ok() @@ -8117,10 +8164,12 @@ async fn main() { .route("/api/v1/recording/start", post(start_recording)) .route("/api/v1/recording/stop", post(stop_recording)) .route("/api/v1/recording/{id}", delete(delete_recording)) - // Training endpoints - .route("/api/v1/train/status", get(train_status)) - .route("/api/v1/train/start", post(train_start)) - .route("/api/v1/train/stop", post(train_stop)) + // Training endpoints (ADR-186 TRAIN-RECONNECT): the real in-server + // trainer + `/ws/train/progress` stream. Merged while the router is + // still `Router` (before `.with_state`) so these routes + // share `AppStateInner` and `/api/v1/train/*` sits under the bearer gate + // applied below (like the rest of `/api/v1/*`). + .merge(training_api::routes()) // Adaptive classifier endpoints .route("/api/v1/adaptive/train", post(adaptive_train)) .route("/api/v1/adaptive/status", get(adaptive_status)) @@ -9369,3 +9418,256 @@ async fn oauth_status( "scope": session.as_ref().map(|s| s.scope.clone()), })) } +#[cfg(test)] +mod adr186_http_tests { + //! ADR-186 P6: HTTP-level tests that build the real `training_api` router + //! and drive it in-process, guarding against the module being orphaned again + //! (`training_api::routes()` cannot compile unless the module is declared). + use super::*; + use axum::body::Body; + use axum::http::{Request, StatusCode}; + use tower::ServiceExt; + + /// Serializes tests that read/toggle the process-global + /// `RUVIEW_DISABLE_SERVER_TRAINING` env var, so the disabled-path test cannot + /// flip enablement while an enabled-path test is mid-request. + static TRAIN_ENV_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(()); + + fn test_state() -> SharedState { + Arc::new(RwLock::new(AppStateInner::minimal())) + } + + /// The `/ws/train/progress` route is registered and reaches the WebSocket + /// handler (issue #1233 was a 404). Over `oneshot` there is no real socket to + /// upgrade, so axum returns 426 Upgrade Required — which still distinguishes a + /// wired WS endpoint (426) from an orphaned/absent route (404). The genuine + /// 101 handshake is asserted by `ws_train_progress_live_101_and_frame`. + #[tokio::test] + async fn ws_train_progress_route_is_wired_not_404() { + let app = training_api::routes().with_state(test_state()); + let req = Request::builder() + .uri("/ws/train/progress") + .header("connection", "upgrade") + .header("upgrade", "websocket") + .header("sec-websocket-version", "13") + .header("sec-websocket-key", "dGhlIHNhbXBsZSBub25jZQ==") + .body(Body::empty()) + .unwrap(); + let resp = app.oneshot(req).await.unwrap(); + assert_ne!(resp.status(), StatusCode::NOT_FOUND, "route must not 404"); + assert_eq!( + resp.status(), + StatusCode::UPGRADE_REQUIRED, + "a wired WS route returns 426 under oneshot — got {}", + resp.status() + ); + } + + /// ADR-186 §7 acceptance: over a real socket, `/ws/train/progress` completes a + /// genuine 101 WebSocket handshake and, after a `POST /api/v1/train/start`, + /// delivers at least one real `progress` frame to the connected client. + #[tokio::test] + async fn ws_train_progress_live_101_and_frame() { + use futures_util::StreamExt; + use tokio::io::AsyncWriteExt; + use tokio_tungstenite::tungstenite::Message as TMsg; + + let _env_lock = TRAIN_ENV_LOCK.lock().unwrap(); // enablement must stay ON + let shared = test_state(); + { + let mut s = shared.write().await; + for i in 0..40 { + let sub: Vec = (0..56) + .map(|k| 10.0 + ((i as f64) * 0.3 + (k as f64) * 0.1).sin() * 2.0) + .collect(); + s.frame_history.push_back(sub); + } + } + + // Serve the training router on an ephemeral port. + let app = training_api::routes().with_state(shared.clone()); + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + tokio::spawn(async move { + let _ = axum::serve(listener, app).await; + }); + + // A successful `connect_async` IS the 101 handshake (it errors otherwise). + let (mut ws, resp) = + tokio_tungstenite::connect_async(format!("ws://{addr}/ws/train/progress")) + .await + .expect("WebSocket handshake should succeed (101)"); + assert_eq!(resp.status().as_u16(), 101, "handshake must be 101"); + + // Drive training via a real HTTP POST over a fresh TCP connection. + let body = r#"{"dataset_ids":[],"config":{"epochs":3,"batch_size":8,"warmup_epochs":1,"early_stopping_patience":10}}"#; + let req = format!( + "POST /api/v1/train/start HTTP/1.1\r\nHost: {addr}\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}", + body.len(), + body + ); + let mut post = tokio::net::TcpStream::connect(addr).await.unwrap(); + post.write_all(req.as_bytes()).await.unwrap(); + post.flush().await.unwrap(); + + // Read WS frames until a `progress` frame arrives (or a 10s ceiling). + let mut got_progress = false; + let deadline = tokio::time::Instant::now() + std::time::Duration::from_secs(10); + while tokio::time::Instant::now() < deadline { + match tokio::time::timeout(std::time::Duration::from_secs(2), ws.next()).await { + Ok(Some(Ok(TMsg::Text(txt)))) => { + if let Ok(v) = serde_json::from_str::(&txt) { + if v.get("type").and_then(|t| t.as_str()) == Some("progress") { + got_progress = true; + break; + } + } + } + Ok(Some(Ok(_))) => {} + Ok(Some(Err(_))) | Ok(None) => break, + Err(_) => {} + } + } + assert!( + got_progress, + "should receive a real progress frame over the live WS after POST start" + ); + // NOTE: deliberately no directory-diff cleanup here. `data/models` is + // gitignored, and deleting by dir-diff would race concurrent model-writing + // tests (it could remove a `.rvf` another test is asserting exists). + } + + /// Full HTTP round-trip: POST /api/v1/train/start → poll /api/v1/train/status + /// until completion → a real `.rvf` model artifact exists on disk, and real + /// progress frames were streamed on the broadcast channel. + #[tokio::test] + async fn http_train_start_produces_model_and_streams() { + let _env_lock = TRAIN_ENV_LOCK.lock().unwrap(); // enablement must stay ON + let shared = test_state(); + // Seed synthetic frames so training's fallback path has data (no files). + { + let mut s = shared.write().await; + for i in 0..40 { + let sub: Vec = (0..56) + .map(|k| 10.0 + ((i as f64) * 0.3 + (k as f64) * 0.1).sin() * 2.0) + .collect(); + s.frame_history.push_back(sub); + } + } + let mut progress_rx = { + let s = shared.read().await; + s.training_progress_tx.subscribe() + }; + + let models_dir = std::path::PathBuf::from(training_api::MODELS_DIR); + let before: std::collections::HashSet = std::fs::read_dir(&models_dir) + .into_iter() + .flatten() + .flatten() + .map(|e| e.path()) + .collect(); + + let app = training_api::routes().with_state(shared.clone()); + + // POST start. + let body = serde_json::json!({ + "dataset_ids": [], + "config": {"epochs": 3, "batch_size": 8, "warmup_epochs": 1, "early_stopping_patience": 10} + }); + let req = Request::builder() + .method("POST") + .uri("/api/v1/train/start") + .header("content-type", "application/json") + .body(Body::from(body.to_string())) + .unwrap(); + let resp = app.clone().oneshot(req).await.unwrap(); + assert_eq!(resp.status(), StatusCode::OK, "start should be accepted"); + + // Poll status until the job reports completion. + let mut completed = false; + for _ in 0..250 { + let req = Request::builder() + .uri("/api/v1/train/status") + .body(Body::empty()) + .unwrap(); + let resp = app.clone().oneshot(req).await.unwrap(); + let bytes = axum::body::to_bytes(resp.into_body(), 65536).await.unwrap(); + let v: serde_json::Value = serde_json::from_slice(&bytes).unwrap(); + // Status also carries the P5 enablement flag. + assert_eq!(v.get("enabled"), Some(&serde_json::Value::Bool(true))); + if v.get("active") == Some(&serde_json::Value::Bool(false)) + && v.get("phase").and_then(|p| p.as_str()) == Some("completed") + { + completed = true; + break; + } + tokio::time::sleep(std::time::Duration::from_millis(20)).await; + } + assert!(completed, "training should reach the completed phase"); + + // Real progress frames were streamed. + let mut saw_progress = false; + while progress_rx.try_recv().is_ok() { + saw_progress = true; + } + assert!(saw_progress, "expected streamed progress frames over the WS channel"); + + // A new .rvf artifact was written by the run. + let after: std::collections::HashSet = std::fs::read_dir(&models_dir) + .into_iter() + .flatten() + .flatten() + .map(|e| e.path()) + .collect(); + let new_models: Vec<_> = after + .difference(&before) + .filter(|p| p.extension().and_then(|e| e.to_str()) == Some("rvf")) + .cloned() + .collect(); + assert!( + !new_models.is_empty(), + "training should write a new .rvf model artifact under {}", + models_dir.display() + ); + // No deletion here: removing by dir-diff would race concurrent + // model-writing tests. `data/models` is gitignored. + } + + /// P5 fallback guarantee: with server training disabled, POST start returns a + /// structured `{enabled:false, cli:...}` 409 — never a silent success. + #[tokio::test] + async fn http_train_start_disabled_returns_structured_409() { + // Serialize against the enabled-path tests so our env toggle can't race + // their in-flight requests. + let _env_lock = TRAIN_ENV_LOCK.lock().unwrap(); + std::env::set_var("RUVIEW_DISABLE_SERVER_TRAINING", "1"); + + let app = training_api::routes().with_state(test_state()); + let body = serde_json::json!({"dataset_ids": [], "config": {"epochs": 1}}); + let req = Request::builder() + .method("POST") + .uri("/api/v1/train/start") + .header("content-type", "application/json") + .body(Body::from(body.to_string())) + .unwrap(); + let resp = app.oneshot(req).await.unwrap(); + let status = resp.status(); + let bytes = axum::body::to_bytes(resp.into_body(), 65536).await.unwrap(); + let v: serde_json::Value = serde_json::from_slice(&bytes).unwrap(); + + std::env::remove_var("RUVIEW_DISABLE_SERVER_TRAINING"); + + assert_eq!(status, StatusCode::CONFLICT, "disabled start must be 4xx/409"); + assert_eq!(v.get("enabled"), Some(&serde_json::Value::Bool(false))); + assert_eq!( + v.get("cli").and_then(|c| c.as_str()), + Some("wifi-densepose train-room"), + "must point at the CLI fallback, never a silent success" + ); + assert_ne!( + v.get("success"), + Some(&serde_json::Value::Bool(true)), + "must never claim success:true when disabled" + ); + } +} diff --git a/v2/crates/wifi-densepose-sensing-server/src/training_api.rs b/v2/crates/wifi-densepose-sensing-server/src/training_api.rs index fb708a28..07766702 100644 --- a/v2/crates/wifi-densepose-sensing-server/src/training_api.rs +++ b/v2/crates/wifi-densepose-sensing-server/src/training_api.rs @@ -26,22 +26,23 @@ use std::collections::VecDeque; use std::path::PathBuf; -use std::sync::Arc; +use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; +use std::sync::{Arc, Mutex}; use axum::{ extract::{ ws::{Message, WebSocket, WebSocketUpgrade}, State, }, - response::{IntoResponse, Json}, + http::StatusCode, + response::{IntoResponse, Json, Response}, routing::{get, post}, Router, }; use serde::{Deserialize, Serialize}; -use tokio::sync::{broadcast, RwLock}; +use tokio::sync::broadcast; use tracing::{error, info, warn}; -use crate::recording::{RecordedFrame, RECORDINGS_DIR}; use crate::rvf_container::RvfBuilder; // ── Constants ──────────────────────────────────────────────────────────────── @@ -49,6 +50,28 @@ use crate::rvf_container::RvfBuilder; /// Directory for trained model output. pub const MODELS_DIR: &str = "data/models"; +/// Directory the training loop reads recorded CSI datasets from. Each +/// `dataset_id` maps to `{RECORDINGS_DIR}/{dataset_id}.csi.jsonl`. +pub const RECORDINGS_DIR: &str = "data/recordings"; + +/// Monotonic per-process counter appended to exported model filenames so two +/// runs that complete in the same wall-clock microsecond still get distinct +/// paths (prevents silent overwrite; keeps concurrent runs from colliding). +static MODEL_ID_SEQ: AtomicU64 = AtomicU64::new(0); + +/// Build a process-unique model id `trained-{type}-{ts_micros}-{seq}`. A +/// second-resolution timestamp alone collided for runs finishing in the same +/// second (silent overwrite); microseconds + the monotonic counter guarantee +/// uniqueness even for same-microsecond concurrent completions. +fn next_model_id(training_type: &str) -> String { + format!( + "trained-{}-{}-{}", + training_type, + chrono::Utc::now().format("%Y%m%d_%H%M%S_%6f"), + MODEL_ID_SEQ.fetch_add(1, Ordering::Relaxed) + ) +} + /// Number of COCO keypoints. const N_KEYPOINTS: usize = 17; /// Dimensions per keypoint in the target vector (x, y, z). @@ -67,6 +90,25 @@ const N_GLOBAL_FEATURES: usize = 3; // ── Types ──────────────────────────────────────────────────────────────────── +/// A single recorded CSI frame line, as stored in the `.csi.jsonl` datasets the +/// training loop consumes. +/// +/// This mirrors the on-disk JSONL schema and is intentionally self-contained so +/// the trainer does not couple to the (separate, orphaned) `recording.rs` +/// module. Only the fields the feature extractor needs are read; `rssi` / +/// `noise_floor` / `features` are carried for schema fidelity. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RecordedFrame { + pub timestamp: f64, + pub subcarriers: Vec, + #[serde(default)] + pub rssi: f64, + #[serde(default)] + pub noise_floor: f64, + #[serde(default)] + pub features: serde_json::Value, +} + /// Training configuration submitted with a start request. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TrainingConfig { @@ -229,24 +271,45 @@ pub struct TrainingProgress { } /// Runtime training state stored in `AppStateInner`. +/// +/// `status` and `cancel` are shared handles (not owned snapshots) so the +/// background training job can update progress and observe stop requests +/// **without holding a reference to the full `AppStateInner`**. That decoupling +/// is what makes the training core ([`run_training_job`]) unit-testable in +/// isolation from the ~60-field server state. pub struct TrainingState { - /// Current status snapshot. - pub status: TrainingStatus, - /// Handle to the background training task (for cancellation). + /// Live status snapshot, shared with the running training job. + pub status: Arc>, + /// Cooperative stop flag; `stop_training` sets it and the job loop observes it. + pub cancel: Arc, + /// Handle to the background training task. pub task_handle: Option>, } impl Default for TrainingState { fn default() -> Self { Self { - status: TrainingStatus::default(), + status: Arc::new(Mutex::new(TrainingStatus::default())), + cancel: Arc::new(AtomicBool::new(false)), task_handle: None, } } } +impl TrainingState { + /// Clone of the current status snapshot. + pub fn snapshot(&self) -> TrainingStatus { + self.status.lock().unwrap().clone() + } + + /// Whether a training job is currently active. + pub fn is_active(&self) -> bool { + self.status.lock().unwrap().active + } +} + /// Shared application state type. -pub type AppState = Arc>; +pub type AppState = Arc>; /// Feature normalization statistics computed from the training set. /// Stored alongside the model weights inside the .rvf container so that @@ -317,11 +380,11 @@ async fn load_recording_frames(dataset_ids: &[String]) -> Vec { all_frames } -/// Attempt to collect frames from the live frame_history buffer in AppState. -/// Each `Vec` in frame_history is a subcarrier amplitude vector. -async fn load_frames_from_history(state: &AppState) -> Vec { - let s = state.read().await; - let history: &VecDeque> = &s.frame_history; +/// Build fallback training frames from a snapshot of the live `frame_history` +/// buffer. Each `Vec` is one frame's subcarrier amplitude vector. Passed as +/// an owned snapshot (not a live `AppState` borrow) so the training core stays +/// state-free and independently testable. +fn frames_from_history(history: &[Vec]) -> Vec { history .iter() .enumerate() @@ -938,13 +1001,15 @@ fn deterministic_shuffle(n: usize, seed: u64) -> Vec { /// linear model via mini-batch gradient descent. /// /// On completion, exports a `.rvf` container with real calibrated weights. -async fn real_training_loop( - state: AppState, +async fn run_training_job( + status: Arc>, + cancel: Arc, progress_tx: broadcast::Sender, config: TrainingConfig, dataset_ids: Vec, + history_snapshot: Vec>, training_type: &str, -) { +) -> Option { let total_epochs = config.epochs; let patience = config.early_stopping_patience; let mut best_pck = 0.0f64; @@ -978,7 +1043,7 @@ async fn real_training_loop( let mut frames = load_recording_frames(&dataset_ids).await; if frames.is_empty() { info!("No recordings found for dataset_ids; falling back to live frame_history"); - frames = load_frames_from_history(&state).await; + frames = frames_from_history(&history_snapshot); } if frames.len() < 10 { @@ -999,11 +1064,12 @@ async fn real_training_loop( if let Ok(json) = serde_json::to_string(&fail) { let _ = progress_tx.send(json); } - let mut s = state.write().await; - s.training_state.status.active = false; - s.training_state.status.phase = "failed".to_string(); - s.training_state.task_handle = None; - return; + { + let mut st = status.lock().unwrap(); + st.active = false; + st.phase = "failed".to_string(); + } + return None; } info!("Loaded {} frames for training", frames.len()); @@ -1079,13 +1145,10 @@ async fn real_training_loop( // ── Phase 5: Training loop ─────────────────────────────────────────────── for epoch in 1..=total_epochs { - // Check cancellation. - { - let s = state.read().await; - if !s.training_state.status.active { - info!("Training cancelled at epoch {epoch}"); - break; - } + // Check cancellation (cooperative stop flag set by `stop_training`). + if cancel.load(Ordering::Relaxed) { + info!("Training cancelled at epoch {epoch}"); + break; } let phase = if epoch <= config.warmup_epochs { @@ -1245,10 +1308,10 @@ async fn real_training_loop( let remaining = total_epochs.saturating_sub(epoch); let eta_secs = (remaining as f64 * secs_per_epoch) as u64; - // Update shared state. + // Update the shared status snapshot (read by GET /api/v1/train/status). { - let mut s = state.write().await; - s.training_state.status = TrainingStatus { + let mut st = status.lock().unwrap(); + *st = TrainingStatus { active: true, epoch, total_epochs, @@ -1297,15 +1360,12 @@ async fn real_training_loop( // ── Phase 6: Export .rvf model ─────────────────────────────────────────── - let completed_phase; - { - let s = state.read().await; - completed_phase = if s.training_state.status.active { - "completed" - } else { - "cancelled" - }; - } + let completed_phase = if cancel.load(Ordering::Relaxed) { + "cancelled" + } else { + "completed" + }; + let mut written_rvf: Option = None; // Emit completion message. let completion = TrainingProgress { @@ -1326,11 +1386,7 @@ async fn real_training_loop( if let Err(e) = tokio::fs::create_dir_all(MODELS_DIR).await { error!("Failed to create models directory: {e}"); } else { - let model_id = format!( - "trained-{}-{}", - training_type, - chrono::Utc::now().format("%Y%m%d_%H%M%S") - ); + let model_id = next_model_id(training_type); let rvf_path = PathBuf::from(MODELS_DIR).join(format!("{model_id}.rvf")); let mut builder = RvfBuilder::new(); @@ -1407,28 +1463,32 @@ async fn real_training_loop( }), ); - if let Err(e) = builder.write_to_file(&rvf_path) { - error!("Failed to write trained model RVF: {e}"); - } else { - info!( - "Trained model saved: {} ({} params, pck_torso_h@0.2={:.4})", - rvf_path.display(), - total_params, - best_pck - ); + match builder.write_to_file(&rvf_path) { + Err(e) => { + error!("Failed to write trained model RVF: {e}"); + } + Ok(()) => { + info!( + "Trained model saved: {} ({} params, pck_torso_h@0.2={:.4})", + rvf_path.display(), + total_params, + best_pck + ); + written_rvf = Some(rvf_path); + } } } } - // Mark training as inactive. + // Mark training as inactive in the shared status snapshot. { - let mut s = state.write().await; - s.training_state.status.active = false; - s.training_state.status.phase = completed_phase.to_string(); - s.training_state.task_handle = None; + let mut st = status.lock().unwrap(); + st.active = false; + st.phase = completed_phase.to_string(); } info!("Real {training_type} training finished: phase={completed_phase}"); + written_rvf } // ── Public inference function ──────────────────────────────────────────────── @@ -1559,56 +1619,151 @@ fn default_keypoints() -> Vec<[f64; 4]> { vec![[320.0, 240.0, 0.0, 0.0]; N_KEYPOINTS] } +// ── Server-training enablement gate (ADR-186 P5) ───────────────────────────── + +/// Env var that opts a deployment out of in-server training (e.g. the +/// lightweight appliance image without recordings). When set truthy, the start +/// endpoints return a structured `enabled:false` response pointing at the CLI — +/// never a silent `success:true` no-op. +const DISABLE_ENV: &str = "RUVIEW_DISABLE_SERVER_TRAINING"; + +/// Whether in-server training is enabled for this deployment. +fn server_training_enabled() -> bool { + training_enabled_from_env(std::env::var(DISABLE_ENV).ok().as_deref()) +} + +/// Pure decision (unit-testable without touching process env): enabled unless +/// the flag is a truthy disable value. +fn training_enabled_from_env(flag: Option<&str>) -> bool { + match flag { + Some(v) => { + let v = v.trim(); + !(v == "1" || v.eq_ignore_ascii_case("true") || v.eq_ignore_ascii_case("yes")) + } + None => true, + } +} + +/// Structured, honest "server training is off for this build — use the CLI" +/// response (HTTP 409). Guarantees no silent no-op in the disabled config. +fn disabled_response() -> Response { + ( + StatusCode::CONFLICT, + Json(serde_json::json!({ + "status": "error", + "enabled": false, + "reason": "In-server training is disabled for this deployment.", + "cli": "wifi-densepose train-room", + // `detail` is surfaced verbatim by the dashboard's API client. + "detail": "In-server training is disabled on this build. Train from the CLI: wifi-densepose train-room", + })), + ) + .into_response() +} + // ── Axum handlers ──────────────────────────────────────────────────────────── async fn start_training( State(state): State, Json(body): Json, -) -> Json { - // Check if training is already active. - { - let s = state.read().await; - if s.training_state.status.active { - return Json(serde_json::json!({ - "status": "error", - "message": "Training is already active. Stop it first.", - "current_epoch": s.training_state.status.epoch, - "total_epochs": s.training_state.status.total_epochs, - })); - } +) -> Response { + if !server_training_enabled() { + return disabled_response(); } - let config = body.config.clone(); - let dataset_ids = body.dataset_ids.clone(); + match spawn_training_job(&state, config, body.dataset_ids.clone(), "supervised").await { + Ok(()) => Json(serde_json::json!({ + "status": "started", + "type": "supervised", + "dataset_ids": body.dataset_ids, + "config": body.config, + })) + .into_response(), + Err(active) => Json(active_error(&active)).into_response(), + } +} - // Mark training as active and spawn background task. - let progress_tx; - { +/// Snapshot of the already-running job returned when a start is rejected. +fn active_error(snap: &TrainingStatus) -> serde_json::Value { + serde_json::json!({ + "status": "error", + "message": "Training is already active. Stop it first.", + "current_epoch": snap.epoch, + "total_epochs": snap.total_epochs, + }) +} + +/// Seed the shared status, snapshot `frame_history`, and spawn the background +/// training job. Returns `Err(current_status)` if a job is already active. +/// +/// Centralises the single-job guard + spawn used by the supervised, pretrain, +/// and LoRA start handlers so they cannot diverge. +/// Atomically claim the single training slot. +/// +/// Checks `active` and sets it `true` **in one `status` lock scope**, so two +/// concurrent callers cannot both observe the slot free — the first claims it, +/// the second gets `Err(current_status)`. Returns the seeded status on success. +/// +/// This is the fix for a TOCTOU race: the previous code checked `is_active()` +/// under a `state` READ lock, released it, and only afterward set `active`. +/// A `tokio::RwLock` read lock is shared, so two starts could both hold it, both +/// see the slot inactive, both proceed — spawning two jobs that then share and +/// overwrite one status/cancel and orphan a task handle. The claim's atomicity +/// lives on the `status` mutex, not the coarse `state` lock, which also keeps it +/// unit-testable without a full `AppState`. +fn claim_training_slot( + status: &Mutex, + config: &TrainingConfig, +) -> Result<(), TrainingStatus> { + let mut st = status.lock().unwrap(); + if st.active { + return Err(st.clone()); + } + *st = TrainingStatus { + active: true, + total_epochs: config.epochs, + lr: config.learning_rate, + patience_remaining: config.early_stopping_patience, + phase: "initializing".to_string(), + ..Default::default() + }; + Ok(()) +} + +async fn spawn_training_job( + state: &AppState, + config: TrainingConfig, + dataset_ids: Vec, + training_type: &'static str, +) -> Result<(), TrainingStatus> { + // Grab the shared handles under a read lock; the RwLock is only guarding + // access to the Arcs, not the single-job decision. + let (progress_tx, status, cancel, history_snapshot) = { let s = state.read().await; - progress_tx = s.training_progress_tx.clone(); - } + ( + s.training_progress_tx.clone(), + s.training_state.status.clone(), + s.training_state.cancel.clone(), + s.frame_history.iter().cloned().collect::>(), + ) + }; - { - let mut s = state.write().await; - s.training_state.status = TrainingStatus { - active: true, - epoch: 0, - total_epochs: config.epochs, - train_loss: 0.0, - val_pck: 0.0, - val_oks: 0.0, - lr: config.learning_rate, - best_pck: 0.0, - best_epoch: 0, - patience_remaining: config.early_stopping_patience, - eta_secs: None, - phase: "initializing".to_string(), - }; - } + // Atomic check-and-set on the status mutex. This — not the read lock above — + // is what serialises concurrent starts (see `claim_training_slot`). + claim_training_slot(&status, &config)?; + cancel.store(false, Ordering::Relaxed); - let state_clone = state.clone(); let handle = tokio::spawn(async move { - real_training_loop(state_clone, progress_tx, config, dataset_ids, "supervised").await; + run_training_job( + status, + cancel, + progress_tx, + config, + dataset_ids, + history_snapshot, + training_type, + ) + .await; }); { @@ -1616,57 +1771,58 @@ async fn start_training( s.training_state.task_handle = Some(handle); } - Json(serde_json::json!({ - "status": "started", - "type": "supervised", - "dataset_ids": body.dataset_ids, - "config": body.config, - })) + Ok(()) } async fn stop_training(State(state): State) -> Json { - let mut s = state.write().await; - if !s.training_state.status.active { + let s = state.read().await; + if !s.training_state.is_active() { return Json(serde_json::json!({ "status": "error", "message": "No training is currently active.", })); } - s.training_state.status.active = false; - s.training_state.status.phase = "stopping".to_string(); - - // The background task checks the active flag and will exit. - // We do not abort the handle -- we let it finish the current batch gracefully. + // Set the cooperative stop flag; the background job observes it between + // epochs and exits gracefully after the current batch. We do not abort the + // task handle. + s.training_state.cancel.store(true, Ordering::Relaxed); + { + let mut st = s.training_state.status.lock().unwrap(); + st.phase = "stopping".to_string(); + } + let snap = s.training_state.snapshot(); info!("Training stop requested"); Json(serde_json::json!({ "status": "stopping", - "epoch": s.training_state.status.epoch, - "best_pck": s.training_state.status.best_pck, + "epoch": snap.epoch, + "best_pck": snap.best_pck, })) } async fn training_status(State(state): State) -> Json { let s = state.read().await; - Json(serde_json::to_value(&s.training_state.status).unwrap_or_default()) + let mut value = serde_json::to_value(s.training_state.snapshot()).unwrap_or_default(); + // Surface the enablement flag so the dashboard can honestly disable the + // Start button (with a CLI tooltip) without first firing a POST (ADR-186 P5). + if let Some(obj) = value.as_object_mut() { + obj.insert( + "enabled".to_string(), + serde_json::Value::Bool(server_training_enabled()), + ); + } + Json(value) } async fn start_pretrain( State(state): State, Json(body): Json, -) -> Json { - { - let s = state.read().await; - if s.training_state.status.active { - return Json(serde_json::json!({ - "status": "error", - "message": "Training is already active. Stop it first.", - })); - } +) -> Response { + if !server_training_enabled() { + return disabled_response(); } - let config = TrainingConfig { epochs: body.epochs, learning_rate: body.lr, @@ -1675,56 +1831,26 @@ async fn start_pretrain( ..Default::default() }; - let progress_tx; - { - let s = state.read().await; - progress_tx = s.training_progress_tx.clone(); + match spawn_training_job(&state, config, body.dataset_ids.clone(), "pretrain").await { + Ok(()) => Json(serde_json::json!({ + "status": "started", + "type": "pretrain", + "epochs": body.epochs, + "lr": body.lr, + "dataset_ids": body.dataset_ids, + })) + .into_response(), + Err(active) => Json(active_error(&active)).into_response(), } - - { - let mut s = state.write().await; - s.training_state.status = TrainingStatus { - active: true, - total_epochs: body.epochs, - phase: "initializing".to_string(), - ..Default::default() - }; - } - - let state_clone = state.clone(); - let dataset_ids = body.dataset_ids.clone(); - let handle = tokio::spawn(async move { - real_training_loop(state_clone, progress_tx, config, dataset_ids, "pretrain").await; - }); - - { - let mut s = state.write().await; - s.training_state.task_handle = Some(handle); - } - - Json(serde_json::json!({ - "status": "started", - "type": "pretrain", - "epochs": body.epochs, - "lr": body.lr, - "dataset_ids": body.dataset_ids, - })) } async fn start_lora_training( State(state): State, Json(body): Json, -) -> Json { - { - let s = state.read().await; - if s.training_state.status.active { - return Json(serde_json::json!({ - "status": "error", - "message": "Training is already active. Stop it first.", - })); - } +) -> Response { + if !server_training_enabled() { + return disabled_response(); } - let config = TrainingConfig { epochs: body.epochs, learning_rate: 0.0005, // lower LR for LoRA @@ -1735,42 +1861,19 @@ async fn start_lora_training( ..Default::default() }; - let progress_tx; - { - let s = state.read().await; - progress_tx = s.training_progress_tx.clone(); + match spawn_training_job(&state, config, body.dataset_ids.clone(), "lora").await { + Ok(()) => Json(serde_json::json!({ + "status": "started", + "type": "lora", + "base_model_id": body.base_model_id, + "profile_name": body.profile_name, + "rank": body.rank, + "epochs": body.epochs, + "dataset_ids": body.dataset_ids, + })) + .into_response(), + Err(active) => Json(active_error(&active)).into_response(), } - - { - let mut s = state.write().await; - s.training_state.status = TrainingStatus { - active: true, - total_epochs: body.epochs, - phase: "initializing".to_string(), - ..Default::default() - }; - } - - let state_clone = state.clone(); - let dataset_ids = body.dataset_ids.clone(); - let handle = tokio::spawn(async move { - real_training_loop(state_clone, progress_tx, config, dataset_ids, "lora").await; - }); - - { - let mut s = state.write().await; - s.training_state.task_handle = Some(handle); - } - - Json(serde_json::json!({ - "status": "started", - "type": "lora", - "base_model_id": body.base_model_id, - "profile_name": body.profile_name, - "rank": body.rank, - "epochs": body.epochs, - "dataset_ids": body.dataset_ids, - })) } // ── WebSocket handler for training progress ────────────────────────────────── @@ -1792,8 +1895,11 @@ async fn handle_train_ws_client(mut socket: WebSocket, state: AppState) { // Send current status immediately. { - let s = state.read().await; - if let Ok(json) = serde_json::to_string(&s.training_state.status) { + let snapshot = { + let s = state.read().await; + s.training_state.snapshot() + }; + if let Ok(json) = serde_json::to_string(&snapshot) { let msg = serde_json::json!({ "type": "status", "data": serde_json::from_str::(&json).unwrap_or_default(), @@ -1869,6 +1975,60 @@ mod tests { assert_eq!(status.phase, "idle"); } + #[test] + fn claim_training_slot_admits_exactly_one_concurrent_start() { + // Regression test for the single-job TOCTOU race. Many threads race to + // claim one slot at the same instant (a barrier maximises contention); + // the status mutex must admit EXACTLY ONE. A split check-then-set (the + // old shape) would let several through under load — verified by + // temporarily reverting the atomicity, which drops this from 1. + use std::sync::atomic::{AtomicUsize, Ordering as O}; + use std::sync::{Arc, Barrier}; + + let status = Arc::new(Mutex::new(TrainingStatus::default())); + let config = TrainingConfig::default(); + let winners = Arc::new(AtomicUsize::new(0)); + + const N: usize = 32; + let barrier = Arc::new(Barrier::new(N)); + let mut handles = Vec::with_capacity(N); + for _ in 0..N { + let status = status.clone(); + let config = config.clone(); + let winners = winners.clone(); + let barrier = barrier.clone(); + handles.push(std::thread::spawn(move || { + barrier.wait(); + if claim_training_slot(&status, &config).is_ok() { + winners.fetch_add(1, O::SeqCst); + } + })); + } + for h in handles { + h.join().unwrap(); + } + + assert_eq!( + winners.load(O::SeqCst), + 1, + "exactly one concurrent start may claim the single training slot" + ); + assert!( + status.lock().unwrap().active, + "the slot must be marked active after a successful claim" + ); + } + + #[test] + fn claim_training_slot_rejects_when_already_active() { + let status = Arc::new(Mutex::new(TrainingStatus::default())); + let config = TrainingConfig::default(); + assert!(claim_training_slot(&status, &config).is_ok(), "first claim wins"); + let err = claim_training_slot(&status, &config) + .expect_err("second claim must be refused while active"); + assert!(err.active, "the rejection carries the active status"); + } + #[test] fn training_progress_serializes() { let progress = TrainingProgress { @@ -2132,4 +2292,169 @@ mod tests { assert_eq!(parsed.n_features, 2); assert_eq!(parsed.mean, vec![1.0, 2.0]); } + + /// Build a small deterministic set of synthetic CSI frames with enough + /// variation that feature extraction is non-degenerate. + fn synthetic_history(n: usize, n_sub: usize) -> Vec> { + (0..n) + .map(|i| { + (0..n_sub) + .map(|k| 10.0 + ((i as f64) * 0.3 + (k as f64) * 0.1).sin() * 2.0) + .collect() + }) + .collect() + } + + /// ADR-186 P3/P6 end-to-end: the real (state-free) training core must + /// (a) stream real progress events over the broadcast channel and + /// (b) actually write a `.rvf` model artifact on completion — not merely + /// flip a status flag. This is the regression guard that keeps the trainer + /// wired (the module was previously orphaned / uncompiled — ADR-186 §1.3). + #[tokio::test] + async fn training_job_streams_real_progress_and_writes_model() { + let history = synthetic_history(40, 56); + + let (tx, mut rx) = broadcast::channel::(1024); + let status = Arc::new(Mutex::new(TrainingStatus::default())); + let cancel = Arc::new(AtomicBool::new(false)); + + let config = TrainingConfig { + epochs: 3, + batch_size: 8, + warmup_epochs: 1, + early_stopping_patience: 10, + ..Default::default() + }; + + // Empty dataset_ids → falls back to the in-memory history snapshot, so + // this test does not depend on the recordings directory. + let rvf = run_training_job( + status.clone(), + cancel, + tx, + config, + Vec::new(), + history, + "supervised", + ) + .await; + + // (b) A real model artifact was produced and exists on disk. + let rvf_path = rvf.expect("training must produce an .rvf model artifact"); + assert!( + rvf_path.exists(), + "rvf artifact should exist at {}", + rvf_path.display() + ); + + // (a) Real progress frames were streamed, at least one carrying an epoch. + let mut n_frames = 0usize; + let mut saw_epoch = false; + let mut saw_completed = false; + while let Ok(msg) = rx.try_recv() { + n_frames += 1; + let v: serde_json::Value = serde_json::from_str(&msg).unwrap(); + if v.get("epoch").and_then(|e| e.as_u64()).unwrap_or(0) >= 1 { + saw_epoch = true; + } + if v.get("phase").and_then(|p| p.as_str()) == Some("completed") { + saw_completed = true; + } + } + assert!(n_frames > 0, "expected streamed progress frames, got none"); + assert!(saw_epoch, "expected at least one epoch-tagged progress frame"); + assert!(saw_completed, "expected a terminal 'completed' progress frame"); + + // Final shared status reflects genuine completion, not just a flag flip: + // real epochs ran (the loop wrote per-epoch status) and a finite loss was + // computed from the real gradient-descent pass. + let final_status = status.lock().unwrap().clone(); + assert!(!final_status.active, "job should be inactive when finished"); + assert_eq!(final_status.phase, "completed"); + assert!( + final_status.epoch >= 1, + "at least one real training epoch should have run" + ); + assert!( + final_status.train_loss.is_finite(), + "a finite training loss should have been computed" + ); + + // Keep the test hermetic — remove the artifact it wrote. + let _ = std::fs::remove_file(&rvf_path); + } + + /// ADR-186 P4 (path safety): a `dataset_id` containing directory traversal + /// is rejected before any file is opened, so the loader returns no frames + /// rather than reading an arbitrary file. + #[tokio::test] + async fn load_recording_frames_rejects_path_traversal() { + let frames = load_recording_frames(&["../../etc/passwd".to_string()]).await; + assert!( + frames.is_empty(), + "path-traversal dataset_id must yield no frames" + ); + } + + /// Exported model ids must be unique per call — a second-resolution + /// timestamp alone collided for runs finishing in the same wall-clock second + /// (silently overwriting each other's `.rvf`, which also flaked the + /// concurrent model-writing tests on CI). Guards against regressing the + /// filename scheme back to non-unique. + #[test] + fn model_ids_are_unique_per_call() { + let ids: Vec = (0..1000).map(|_| next_model_id("supervised")).collect(); + let unique: std::collections::HashSet<&String> = ids.iter().collect(); + assert_eq!(unique.len(), ids.len(), "every model id must be distinct"); + assert!(ids[0].starts_with("trained-supervised-")); + } + + /// ADR-186 P5: the enablement gate is enabled by default and only disabled + /// by an explicit truthy opt-out, so a `--no-default-features` / default + /// build always has server training ON (no silent regression to disabled). + #[test] + fn training_enablement_gate() { + assert!(training_enabled_from_env(None), "default is enabled"); + assert!(training_enabled_from_env(Some("0")), "0 keeps it enabled"); + assert!(training_enabled_from_env(Some("")), "empty keeps it enabled"); + assert!(!training_enabled_from_env(Some("1")), "1 disables"); + assert!(!training_enabled_from_env(Some("true")), "true disables"); + assert!(!training_enabled_from_env(Some("YES")), "case-insensitive"); + assert!(!training_enabled_from_env(Some(" 1 ")), "trims whitespace"); + } + + /// A job that is cancelled before it starts still exits cleanly and reports + /// the `cancelled` terminal phase (drives `stop_training`'s cooperative flag). + #[tokio::test] + async fn training_job_honors_cancellation() { + let history = synthetic_history(40, 56); + let (tx, _rx) = broadcast::channel::(1024); + let status = Arc::new(Mutex::new(TrainingStatus::default())); + let cancel = Arc::new(AtomicBool::new(true)); // pre-cancelled + + let config = TrainingConfig { + epochs: 50, + batch_size: 8, + warmup_epochs: 1, + early_stopping_patience: 10, + ..Default::default() + }; + + let rvf = run_training_job( + status.clone(), + cancel, + tx, + config, + Vec::new(), + history, + "supervised", + ) + .await; + + // Cancelled before the first epoch → no model, terminal phase cancelled. + assert!(rvf.is_none(), "cancelled run should not export a model"); + let final_status = status.lock().unwrap().clone(); + assert!(!final_status.active); + assert_eq!(final_status.phase, "cancelled"); + } } diff --git a/v2/crates/wifi-densepose-train/Cargo.toml b/v2/crates/wifi-densepose-train/Cargo.toml index 133026f5..bebbf82c 100644 --- a/v2/crates/wifi-densepose-train/Cargo.toml +++ b/v2/crates/wifi-densepose-train/Cargo.toml @@ -35,7 +35,13 @@ cuda = ["tch-backend"] [dependencies] # Internal crates wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal", default-features = false } -wifi-densepose-nn = { version = "0.3.0", path = "../wifi-densepose-nn" } +# NOTE: `wifi-densepose-nn` was declared here but never imported anywhere in +# this crate's src/ or bin/ (the tch-backend model path uses `tch` directly, +# not this crate). It was a dead dependency that pulled `ort` (ONNX Runtime) + +# reqwest/hyper into every downstream consumer — including the ADR-185 +# `[meridian]` wheel. Removed to slim the dependency graph. Inference at +# serving time is done via `wifi-densepose-nn` by the binaries that actually +# load models, which depend on it directly. # Core thiserror.workspace = true