From dad7135f11074b7e59e532b322bf85a11cfb79e9 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 10:30:41 -0700 Subject: [PATCH 01/25] =?UTF-8?q?feat(analysis):=20step=206=20phase=202/3?= =?UTF-8?q?=20=E2=80=94=20EF=20diagnostics=20compile=20+=20plot=20scripts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- .../compile_ef_diagnostics.py | 219 ++++++++++++++++ .../output/plots/keysector_impact_heatmap.png | Bin 235631 -> 0 bytes .../output/plots/summary_a_rmse_ranking.png | Bin 51605 -> 0 bytes .../plot_ef_diagnostics.py | 248 ++++++++++++++++++ 4 files changed, 467 insertions(+) create mode 100644 bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py delete mode 100644 bedrock/analysis/a_matrix_time_series/output/plots/keysector_impact_heatmap.png delete mode 100644 bedrock/analysis/a_matrix_time_series/output/plots/summary_a_rmse_ranking.png create mode 100644 bedrock/analysis/a_matrix_time_series/plot_ef_diagnostics.py diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py new file mode 100644 index 00000000..0602058e --- /dev/null +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -0,0 +1,219 @@ +"""Compile per-(approach, baseline) EF diagnostics Sheets into one workbook. + +Step 6 / Phase 2 of epic #337. Reads ``output/results/ef_run_index.csv`` for +the ``(approach, baseline, sheet_id)`` triples, pulls the EF diff tabs from +each Sheet, and produces: + +- ``output/results/ef_comparison.xlsx``: + - One tab per ``(approach, baseline)`` carrying the full ``N_and_diffs`` + joined with ``D_and_diffs``. + - ``summary_vs_useeio`` and ``summary_vs_ceda``: per-approach roll-up + with p50 / p95 / max of ``|N_perc_diff|`` and ``|D_perc_diff|``, plus + ``n_significant`` (sectors where the percent diff exceeds + ``SIGNIFICANT_PCT_THRESHOLD``). +- ``output/results/ef_scatter_coords.parquet``: long-format coordinates + ``(approach, baseline, ef_kind, sector, x_baseline, y_approach)`` for the + Phase 3 scatter plots. ``x_baseline`` is ``*_old_inflated`` (the + baseline's EF, inflation-adjusted to the candidate's base year) and + ``y_approach`` is ``*_new``. +- ``ef_summary_vs_useeio`` and ``ef_summary_vs_ceda`` tabs appended to the + run-report Sheet (sheet ID from ``last_run_sheet_id.txt``, written by + Step 1). Skipped with a warning if that file is missing. + +The compile script reads only ``sheet_id`` from ``ef_run_index.csv``; +``run_id``, ``useeio_box_ticked`` and ``triggered_at`` are audit-only. + +Usage: + python -m bedrock.analysis.a_matrix_time_series.compile_ef_diagnostics +""" + +from __future__ import annotations + +import logging + +import pandas as pd + +from bedrock.analysis.a_matrix_time_series.constants import ( + LAST_RUN_SHEET_ID_PATH, + PLOTS_DIR, + RESULTS_DIR, +) +from bedrock.utils.io.gcp import read_sheet_tab, update_sheet_tab + +logger = logging.getLogger(__name__) + +EF_RUN_INDEX_PATH = RESULTS_DIR / "ef_run_index.csv" +EF_COMPARISON_XLSX_PATH = RESULTS_DIR / "ef_comparison.xlsx" +EF_SCATTER_COORDS_PATH = RESULTS_DIR / "ef_scatter_coords.parquet" + +# A row counts as "significantly different" when |perc_diff| exceeds this. +SIGNIFICANT_PCT_THRESHOLD = 0.10 + +# Tab names produced by `calculate_ef_diagnostics.py` per run. Both +# baseline modes (CEDA-only and USEEIO-checked) emit identical column +# headers — confirmed via spot-check. +TAB_N = "N_and_diffs" +TAB_D = "D_and_diffs" + +# Numeric columns to coerce after `read_sheet_tab` (which returns all str). +_N_NUMERIC_COLS = ("N_new", "N_old", "N_old_inflated", "N_perc_diff") +_D_NUMERIC_COLS = ("D_new", "D_old", "D_old_inflated", "D_perc_diff") + + +def _coerce_numeric(df: pd.DataFrame, cols: tuple[str, ...]) -> pd.DataFrame: + """Coerce string columns to numeric, handling percent-formatted cells. + + Sheets returns formatted display values by default, so a column with + percent cell formatting comes back like ``"0.23%"`` even though the + underlying value is the fraction ``0.0023``. Strip the suffix and + divide by 100; raw-float columns pass through unchanged. + """ + for col in cols: + if col not in df.columns: + continue + s = df[col].astype(str).str.strip() + is_pct = s.str.endswith("%") + cleaned = s.str.rstrip("%").str.replace(",", "", regex=False) + numeric = pd.to_numeric(cleaned, errors="coerce") + df[col] = numeric.mask(is_pct, numeric / 100) + return df + + +def _read_pair(sheet_id: str) -> pd.DataFrame: + """Return ``N_and_diffs`` joined with ``D_and_diffs`` on the sector index.""" + n = _coerce_numeric(read_sheet_tab(sheet_id, TAB_N), _N_NUMERIC_COLS) + d = _coerce_numeric(read_sheet_tab(sheet_id, TAB_D), _D_NUMERIC_COLS) + # Both tabs come back with the sector code as the first column; align on it. + sector_col = n.columns[0] + n = n.set_index(sector_col) + d = d.set_index(sector_col) + # `sector_name` and `comparison_type` are duplicated across N and D — keep + # them from N only. + drop_from_d = [c for c in ("sector_name", "comparison_type") if c in d.columns] + return n.join(d.drop(columns=drop_from_d), how="outer") + + +def _summarize(joined: pd.DataFrame, approach: str) -> pd.Series: + n_perc = joined["N_perc_diff"].abs() + d_perc = joined["D_perc_diff"].abs() + return pd.Series( + { + "approach": approach, + "n_sectors": int(joined.shape[0]), + "N_p50": float(n_perc.quantile(0.50)), + "N_p95": float(n_perc.quantile(0.95)), + "N_max": float(n_perc.max()), + "N_n_significant": int((n_perc > SIGNIFICANT_PCT_THRESHOLD).sum()), + "D_p50": float(d_perc.quantile(0.50)), + "D_p95": float(d_perc.quantile(0.95)), + "D_max": float(d_perc.max()), + "D_n_significant": int((d_perc > SIGNIFICANT_PCT_THRESHOLD).sum()), + } + ) + + +def _scatter_coords(joined: pd.DataFrame, approach: str, baseline: str) -> pd.DataFrame: + """Long-format `(approach, baseline, ef_kind, sector, x_baseline, y_approach)`.""" + rows: list[pd.DataFrame] = [] + for kind, new_col, old_col in ( + ("N", "N_new", "N_old_inflated"), + ("D", "D_new", "D_old_inflated"), + ): + if new_col not in joined.columns or old_col not in joined.columns: + continue + chunk = joined[[new_col, old_col]].dropna().copy() + chunk.columns = pd.Index(["y_approach", "x_baseline"]) + chunk = chunk.reset_index().rename(columns={chunk.index.name: "sector"}) + chunk["approach"] = approach + chunk["baseline"] = baseline + chunk["ef_kind"] = kind + rows.append(chunk) + if not rows: + return pd.DataFrame() + return pd.concat(rows, ignore_index=True)[ + ["approach", "baseline", "ef_kind", "sector", "x_baseline", "y_approach"] + ] + + +def main() -> None: + RESULTS_DIR.mkdir(parents=True, exist_ok=True) + PLOTS_DIR.mkdir(parents=True, exist_ok=True) + + if not EF_RUN_INDEX_PATH.exists(): + raise FileNotFoundError( + f"{EF_RUN_INDEX_PATH} not found — populate it by hand from the " + "Phase 1 diagnostics runs (one row per (approach, baseline) " + "Sheet)." + ) + index_df = pd.read_csv(EF_RUN_INDEX_PATH) + required = {"approach", "baseline", "sheet_id"} + missing = required - set(index_df.columns) + if missing: + raise ValueError(f"{EF_RUN_INDEX_PATH} missing columns: {sorted(missing)}") + + summaries_by_baseline: dict[str, list[pd.Series]] = {} + scatter_chunks: list[pd.DataFrame] = [] + per_pair_tables: dict[str, pd.DataFrame] = {} + + for _, row in index_df.iterrows(): + approach = str(row["approach"]) + baseline = str(row["baseline"]) + sheet_id = str(row["sheet_id"]) + logger.info("Pulling tabs for approach=%s baseline=%s", approach, baseline) + joined = _read_pair(sheet_id) + if joined.empty: + logger.warning( + "approach=%s baseline=%s returned empty data; skipping", + approach, + baseline, + ) + continue + per_pair_tables[f"{approach}__vs_{baseline}"] = joined.reset_index() + summaries_by_baseline.setdefault(baseline, []).append( + _summarize(joined, approach) + ) + scatter_chunks.append(_scatter_coords(joined, approach, baseline)) + + summaries: dict[str, pd.DataFrame] = { + baseline: pd.DataFrame(rows).set_index("approach") + for baseline, rows in summaries_by_baseline.items() + } + + with pd.ExcelWriter(EF_COMPARISON_XLSX_PATH, engine="openpyxl") as writer: + for baseline, summary in summaries.items(): + summary.reset_index().to_excel( + writer, sheet_name=f"summary_vs_{baseline}", index=False + ) + for tab, df in per_pair_tables.items(): + df.to_excel(writer, sheet_name=tab[:31], index=False) + logger.info("Wrote %s", EF_COMPARISON_XLSX_PATH) + + if scatter_chunks: + all_coords = pd.concat(scatter_chunks, ignore_index=True) + all_coords.to_parquet(EF_SCATTER_COORDS_PATH) + logger.info("Wrote %s (%d rows)", EF_SCATTER_COORDS_PATH, len(all_coords)) + + if LAST_RUN_SHEET_ID_PATH.exists(): + run_sheet_id = LAST_RUN_SHEET_ID_PATH.read_text().strip() + for baseline, summary in summaries.items(): + update_sheet_tab( + run_sheet_id, + f"ef_summary_vs_{baseline}", + summary.reset_index(), + clean_nans=True, + ) + logger.info("Appended ef_summary_vs_* tabs to run Sheet %s", run_sheet_id) + else: + logger.warning( + "%s not found — skipping run-report Sheet upload", + LAST_RUN_SHEET_ID_PATH, + ) + + for baseline, summary in summaries.items(): + print(f"\n=== summary_vs_{baseline} ===") + print(summary.round(4).to_string()) + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO, format="%(message)s") + main() diff --git a/bedrock/analysis/a_matrix_time_series/output/plots/keysector_impact_heatmap.png b/bedrock/analysis/a_matrix_time_series/output/plots/keysector_impact_heatmap.png deleted file mode 100644 index 260046a55fb309ff296ab7d58a31d214508c27ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235631 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%0Djd=4C$kaYmTQa6&{AD? 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 diff --git a/bedrock/analysis/a_matrix_time_series/plot_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/plot_ef_diagnostics.py new file mode 100644 index 00000000..a7dc9f31 --- /dev/null +++ b/bedrock/analysis/a_matrix_time_series/plot_ef_diagnostics.py @@ -0,0 +1,248 @@ +"""Phase 3 of Step 6: scatter + histogram plots comparing approach EFs vs each baseline. + +Reads ``ef_scatter_coords.parquet`` (Phase 2 output) and produces, for +each ``(baseline, ef_kind)`` pair, two figures: + +- ``ef_scatter_{baseline}_{ef_kind}.png`` — 2×2 grid of approach panels. + Per panel: linear-scale scatter of ``(x_baseline, y_approach)`` per + Cornerstone sector, ``y=x`` reference dashed in black. Top-left + annotation reports ``R²`` of ``y ~ x`` against the ``y=x`` line, ``p95`` + of ``|y - x| / |x|``, and the count of sectors with that quotient + exceeding ``SIGNIFICANT_PCT_THRESHOLD``. +- ``ef_pct_hist_{baseline}_{ef_kind}.png`` — 2×2 grid of approach panels. + Per panel: per-sector ``% diff = (y - x) / x × 100`` clipped to ±100%, + 60-bin histogram. Vertical zero line. Mirrors the + ``baseline_snapshot_comparison`` ``compare_B_Adom`` convention. + +vs CEDA (v0) panels: 4 candidates (``useeio``, ``summary_tables``, +``industry_price_index``, ``commodity_price_index``). +vs USEEIO panels: 3 candidates (``useeio`` is the comparator and is +hidden). + +Usage: + python -m bedrock.analysis.a_matrix_time_series.plot_ef_diagnostics +""" + +from __future__ import annotations + +import logging +import typing as ta + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from matplotlib.axes import Axes +from matplotlib.figure import Figure + +from bedrock.analysis.a_matrix_time_series.compile_ef_diagnostics import ( + EF_SCATTER_COORDS_PATH, + SIGNIFICANT_PCT_THRESHOLD, +) +from bedrock.analysis.a_matrix_time_series.constants import PLOTS_DIR + +logger = logging.getLogger(__name__) + +PanelFn = ta.Callable[[Axes, pd.DataFrame, str], None] + +# Approach order (top-left → bottom-right in the 2×2 grid). Mirrors +# `summary_a_errors.py` and `key_sector_deep_dive.py`; consolidate per the +# redundancy cleanup plan. +APPROACH_ORDER: tuple[str, ...] = ( + "useeio", + "summary_tables", + "industry_price_index", + "commodity_price_index", +) +APPROACH_COLORS: dict[str, str] = { + "useeio": "#7f7f7f", + "ceda_default": "#bcbd22", + "summary_tables": "#1f77b4", + "industry_price_index": "#ff7f0e", + "commodity_price_index": "#2ca02c", +} +BASELINE_LABEL: dict[str, str] = {"ceda": "CEDA-US (v0)", "useeio": "USEEIO"} +EF_KIND_LABEL: dict[str, str] = {"N": "total EF (N)", "D": "direct EF (D)"} + +TITLE_FONTSIZE = 20 +HIST_PCT_CLIP = 100.0 +HIST_BINS = 60 + + +def _panel_stats(panel_df: pd.DataFrame) -> dict[str, float]: + """``R²`` against ``y=x``, ``p95`` of ``|y-x|/|x|``, and ``n_significant``. + + ``R²`` is the coefficient of determination of ``y`` against the ``y=x`` + reference (not an OLS fit), so values can go negative when ``y=x`` is + worse than predicting the mean of ``y``. + """ + df = panel_df[panel_df["x_baseline"].abs() > 0] + if len(df) < 2: + return {"r2": float("nan"), "p95": float("nan"), "n_sig": 0.0} + x = df["x_baseline"].to_numpy(dtype=float) + y = df["y_approach"].to_numpy(dtype=float) + ss_tot = float(((y - y.mean()) ** 2).sum()) + ss_res = float(((y - x) ** 2).sum()) + r2 = 1 - (ss_res / ss_tot) if ss_tot > 0 else float("nan") + perc = (df["y_approach"] - df["x_baseline"]).abs() / df["x_baseline"].abs() + return { + "r2": float(r2), + "p95": float(perc.quantile(0.95)), + "n_sig": float((perc > SIGNIFICANT_PCT_THRESHOLD).sum()), + } + + +def _scatter_panel(ax: Axes, panel_df: pd.DataFrame, approach: str) -> None: + color = APPROACH_COLORS.get(approach, "#000000") + sub = panel_df.dropna(subset=["x_baseline", "y_approach"]) + ax.scatter( + sub["x_baseline"], + sub["y_approach"], + marker="o", + color=color, + s=18, + alpha=0.55, + linewidths=0, + label=f"n={len(sub)}", + ) + if not sub.empty: + lo = float(min(sub["x_baseline"].min(), sub["y_approach"].min())) + hi = float(max(sub["x_baseline"].max(), sub["y_approach"].max())) + ax.plot( + [lo, hi], [lo, hi], color="black", linestyle="--", linewidth=0.7, alpha=0.5 + ) + + ax.grid(True, which="both", alpha=0.2) + + stats = _panel_stats(panel_df) + ax.text( + 0.04, + 0.96, + f"R²={stats['r2']:.3f}\np95={stats['p95']:.3f}\nn_sig={int(stats['n_sig'])}", + transform=ax.transAxes, + fontsize=10, + va="top", + ha="left", + bbox=dict( + boxstyle="round,pad=0.3", facecolor="white", alpha=0.85, edgecolor="0.7" + ), + ) + ax.set_title(approach, fontsize=TITLE_FONTSIZE, color="black") + ax.legend(loc="lower right", fontsize=9, frameon=False) + + +def _hist_panel(ax: Axes, panel_df: pd.DataFrame, approach: str) -> None: + color = APPROACH_COLORS.get(approach, "tab:blue") + df = panel_df[panel_df["x_baseline"].abs() > 0].dropna( + subset=["x_baseline", "y_approach"] + ) + if df.empty: + ax.text(0.5, 0.5, "no data", transform=ax.transAxes, ha="center", va="center") + ax.set_title(approach, fontsize=TITLE_FONTSIZE, color="black") + return + pct = ((df["y_approach"] - df["x_baseline"]) / df["x_baseline"].abs()).to_numpy( + dtype=float + ) * 100.0 + finite = pct[np.isfinite(pct)] + clipped = np.clip(finite, -HIST_PCT_CLIP, HIST_PCT_CLIP) + ax.hist(clipped, bins=HIST_BINS, color=color, alpha=0.85) + ax.axvline(0, color="k", lw=0.5) + ax.set_xlim(-HIST_PCT_CLIP, HIST_PCT_CLIP) + ax.grid(True, ls=":", alpha=0.3) + ax.text( + 0.04, + 0.96, + f"n={len(finite)}\nmedian={np.median(finite):.1f}%\np95(|·|)={np.quantile(np.abs(finite), 0.95):.1f}%", + transform=ax.transAxes, + fontsize=10, + va="top", + ha="left", + bbox=dict( + boxstyle="round,pad=0.3", facecolor="white", alpha=0.85, edgecolor="0.7" + ), + ) + ax.set_title(approach, fontsize=TITLE_FONTSIZE, color="black") + + +def _grid_2x2( + coords: pd.DataFrame, + baseline: str, + ef_kind: str, + panel_fn: PanelFn, + xlabel: str, + ylabel: str, + suptitle: str, +) -> Figure | None: + sub = coords[(coords["baseline"] == baseline) & (coords["ef_kind"] == ef_kind)] + approaches = [a for a in APPROACH_ORDER if a in sub["approach"].unique()] + if not approaches: + logger.warning("No approaches for baseline=%s ef_kind=%s", baseline, ef_kind) + return None + + fig, axes_grid = plt.subplots(2, 2, figsize=(11.0, 10.5)) + flat_axes = list(axes_grid.flat) + for ax, approach in zip(flat_axes, approaches): + panel_fn(ax, sub[sub["approach"] == approach], approach) + for ax in flat_axes[len(approaches) :]: + ax.axis("off") + + for ax in axes_grid[:, 0]: + ax.set_ylabel(ylabel, fontsize=11) + for ax in axes_grid[-1, :]: + ax.set_xlabel(xlabel, fontsize=11) + + fig.suptitle(suptitle, fontsize=14, y=1.0) + fig.tight_layout() + return fig + + +def main() -> None: + PLOTS_DIR.mkdir(parents=True, exist_ok=True) + if not EF_SCATTER_COORDS_PATH.exists(): + raise FileNotFoundError( + f"{EF_SCATTER_COORDS_PATH} not found — run " + "`compile_ef_diagnostics` first." + ) + coords = pd.read_parquet(EF_SCATTER_COORDS_PATH) + + for baseline in ("ceda", "useeio"): + for ef_kind in ("N", "D"): + kind_label = EF_KIND_LABEL[ef_kind] + base_label = BASELINE_LABEL[baseline] + + scatter_fig = _grid_2x2( + coords, + baseline, + ef_kind, + _scatter_panel, + xlabel=f"{base_label} {kind_label} (inflation-adjusted)", + ylabel=f"approach {kind_label}", + suptitle=f"{kind_label} per sector — approach vs {base_label}", + ) + if scatter_fig is not None: + out = PLOTS_DIR / f"ef_scatter_{baseline}_{ef_kind}.png" + scatter_fig.savefig(out, dpi=150, bbox_inches="tight") + plt.close(scatter_fig) + logger.info("Wrote %s", out) + + hist_fig = _grid_2x2( + coords, + baseline, + ef_kind, + _hist_panel, + xlabel=( + f"% diff = (approach − {base_label}) / {base_label} × 100 " + f"(clipped ±{int(HIST_PCT_CLIP)}%)" + ), + ylabel="sector count", + suptitle=f"{kind_label} per-sector % diff distribution — vs {base_label}", + ) + if hist_fig is not None: + out = PLOTS_DIR / f"ef_pct_hist_{baseline}_{ef_kind}.png" + hist_fig.savefig(out, dpi=150, bbox_inches="tight") + plt.close(hist_fig) + logger.info("Wrote %s", out) + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO, format="%(message)s") + main() From 81eed45abb046c3efdf31f0826768fec138a4595 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Wed, 6 May 2026 09:13:27 -0700 Subject: [PATCH 02/25] feat(analysis): rebuild ef_run_index.csv from Drive folder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds rebuild_run_index_from_drive.py — lists Google Sheets in a diagnostics Drive folder and parses each title into (approach, baseline, sheet_id, year?, scenario?) rows for ef_run_index.csv. Closes the manual- flow gap: users who triggered diagnostics via the GH Actions UI can now auto-build the run index instead of hand-typing sheet IDs. Title regex handles both formats currently in use: Manual: [DATE, BASELINE based, A matrix with APPROACH] EFs diagnostics Dispatch: [DATE, YEAR, BASELINE based, A matrix with APPROACH, SCENARIO] EFs diagnostics Also rewords the FileNotFoundError in compile_ef_diagnostics.py to point at the new script as the auto-rebuild path, with hand-write as a fallback. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../compile_ef_diagnostics.py | 11 +- .../rebuild_run_index_from_drive.py | 214 ++++++++++++++++++ 2 files changed, 222 insertions(+), 3 deletions(-) create mode 100644 bedrock/analysis/a_matrix_time_series/rebuild_run_index_from_drive.py diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index 0602058e..dfd62fa3 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -141,9 +141,14 @@ def main() -> None: if not EF_RUN_INDEX_PATH.exists(): raise FileNotFoundError( - f"{EF_RUN_INDEX_PATH} not found — populate it by hand from the " - "Phase 1 diagnostics runs (one row per (approach, baseline) " - "Sheet)." + f"{EF_RUN_INDEX_PATH} not found.\n" + "Two ways to populate it:\n" + " (a) Auto-rebuild from existing Sheets in the diagnostics " + "Drive folder:\n" + " python -m bedrock.analysis.a_matrix_time_series." + "rebuild_run_index_from_drive --folder-id \n" + " (b) Hand-write a CSV with at least 3 columns " + "(approach, baseline, sheet_id), one row per Sheet." ) index_df = pd.read_csv(EF_RUN_INDEX_PATH) required = {"approach", "baseline", "sheet_id"} diff --git a/bedrock/analysis/a_matrix_time_series/rebuild_run_index_from_drive.py b/bedrock/analysis/a_matrix_time_series/rebuild_run_index_from_drive.py new file mode 100644 index 00000000..a85e3918 --- /dev/null +++ b/bedrock/analysis/a_matrix_time_series/rebuild_run_index_from_drive.py @@ -0,0 +1,214 @@ +"""Reconstruct ``ef_run_index.csv`` from existing Sheets in a Drive folder. + +For users who triggered EF diagnostics manually via the GH Actions workflow +(rather than via ``dispatch_ef_time_series.py``), this script lists every +Google Sheet in the diagnostics Drive folder, parses each title to recover +the run dimensions, and writes ``ef_run_index.csv`` with one row per Sheet. + +Sheet title formats supported: +- Manual single-cell: + ``[YYYY-MM-DD, BASELINE based, A matrix with APPROACH] EFs diagnostics`` +- Time-series dispatch (``dispatch_ef_time_series.py``): + ``[YYYY-MM-DD, YYYY, BASELINE based, A matrix with APPROACH, SCENARIO] EFs diagnostics`` + +Usage: + python -m bedrock.analysis.a_matrix_time_series.rebuild_run_index_from_drive \\ + --folder-id +""" + +from __future__ import annotations + +import argparse +import logging +import re +import typing as ta + +import google.auth +import pandas as pd +from googleapiclient.discovery import build + +from bedrock.analysis.a_matrix_time_series.constants import RESULTS_DIR + +logger = logging.getLogger(__name__) + +EF_RUN_INDEX_PATH = RESULTS_DIR / "ef_run_index.csv" + +# Output columns match what compile_ef_diagnostics.py + dispatch script +# already use; required = approach, baseline, sheet_id. +INDEX_COLUMNS: tuple[str, ...] = ( + "approach", + "baseline", + "sheet_id", + "sheet_title", + "created_at", + "scenario", + "year", +) + +# Title regex: +# prefix '[' then 1 or 2 leading date-like tokens (date + optional year) +# then 'BASELINE based, A matrix with APPROACH' and optional trailing ', SCENARIO' +# then '] EFs diagnostics' +TITLE_RE = re.compile( + r""" + ^\[ + (?P\d{4}-\d{2}-\d{2}) # YYYY-MM-DD + (?:,\s*(?P\d{4}))? # optional ', YYYY' (time-series cell) + ,\s*(?P[A-Za-z]+)\sbased + ,\s*A\smatrix\swith\s(?P[^,\]]+) + (?:,\s*(?P[^\]]+))? # optional ', SCENARIO' + \]\sEFs\sdiagnostics$ + """, + re.VERBOSE, +) + +# Maps the human-readable approach phrase to the canonical config key used +# in ef_run_index.csv. +APPROACH_BY_TEXT: dict[str, str] = { + "USEEIO method": "useeio", + "2017 benchmark A": "useeio", + "summary tables": "summary_tables", + "industry price index": "industry_price_index", + "commodity price index": "commodity_price_index", +} + +BASELINE_BY_TEXT: dict[str, str] = { + "CEDA": "ceda", + "USEEIO": "useeio", +} + + +def _drive_client() -> ta.Any: + """Build a read-only Drive API client.""" + credentials, _ = google.auth.default( + scopes=["https://www.googleapis.com/auth/drive.readonly"] + ) + return build("drive", "v3", credentials=credentials) + + +def _list_sheets_in_folder(folder_id: str) -> list[dict[str, str]]: + """List Google Sheets in the given Drive folder (non-trashed only). + + Returns one dict per Sheet with keys ``id``, ``name``, ``createdTime``. + """ + if not folder_id: + raise ValueError("folder_id is required") + client = _drive_client() + query = ( + f"'{folder_id}' in parents and trashed=false " + "and mimeType='application/vnd.google-apps.spreadsheet'" + ) + files: list[dict[str, str]] = [] + page_token: str | None = None + while True: + resp = ( + client.files() + .list( + q=query, + fields="nextPageToken, files(id, name, createdTime)", + pageSize=1000, + pageToken=page_token, + supportsAllDrives=True, + includeItemsFromAllDrives=True, + ) + .execute() + ) + files.extend(resp.get("files", [])) + page_token = resp.get("nextPageToken") + if not page_token: + break + return files + + +def _parse_title(title: str) -> dict[str, str] | None: + """Parse a Sheet title into run-index columns. Returns None if unparseable.""" + m = TITLE_RE.match(title) + if m is None: + return None + approach_text = m.group("approach_text").strip() + approach = APPROACH_BY_TEXT.get(approach_text) + if approach is None: + logger.warning("Unrecognized approach %r in title %r", approach_text, title) + return None + baseline_text = m.group("baseline").upper() + baseline = BASELINE_BY_TEXT.get(baseline_text) + if baseline is None: + logger.warning("Unrecognized baseline %r in title %r", baseline_text, title) + return None + return { + "approach": approach, + "baseline": baseline, + "sheet_title": title, + "scenario": (m.group("scenario") or "").strip(), + "year": m.group("year") or "", + } + + +def rebuild_index(folder_id: str, output_path: str | None = None) -> pd.DataFrame: + """Build ``ef_run_index.csv`` from Sheet titles in ``folder_id``. + + Returns the resulting DataFrame and writes it to ``output_path`` + (default: ``output/results/ef_run_index.csv``). + """ + out = output_path or str(EF_RUN_INDEX_PATH) + files = _list_sheets_in_folder(folder_id) + logger.info("Found %d Sheet(s) in folder %s", len(files), folder_id) + + rows: list[dict[str, str]] = [] + skipped: list[str] = [] + for f in files: + parsed = _parse_title(f["name"]) + if parsed is None: + skipped.append(f["name"]) + continue + rows.append( + { + "approach": parsed["approach"], + "baseline": parsed["baseline"], + "sheet_id": f["id"], + "sheet_title": parsed["sheet_title"], + "created_at": f.get("createdTime", ""), + "scenario": parsed["scenario"], + "year": parsed["year"], + } + ) + + df = pd.DataFrame(rows, columns=pd.Index(INDEX_COLUMNS)) + df = df.sort_values(["scenario", "approach", "year", "baseline"]).reset_index( + drop=True + ) + EF_RUN_INDEX_PATH.parent.mkdir(parents=True, exist_ok=True) + df.to_csv(out, index=False) + logger.info("Wrote %d row(s) to %s", len(df), out) + if skipped: + logger.warning( + "Skipped %d Sheet(s) with unparseable titles: %s", + len(skipped), + ", ".join(repr(t) for t in skipped[:5]) + + (" ..." if len(skipped) > 5 else ""), + ) + return df + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--folder-id", + required=True, + help=( + "Drive folder ID containing the diagnostics Sheets. Find it in " + "the Drive folder URL: drive.google.com/drive/folders/." + ), + ) + parser.add_argument( + "--output", + default=str(EF_RUN_INDEX_PATH), + help=f"Output CSV path (default: {EF_RUN_INDEX_PATH}).", + ) + args = parser.parse_args() + logging.basicConfig(level=logging.INFO, format="%(message)s") + rebuild_index(args.folder_id, args.output) + + +if __name__ == "__main__": + main() From 599f4acc5c9b06773c9383b79c4b16f94c20eb6e Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 15:50:42 -0700 Subject: [PATCH 03/25] =?UTF-8?q?feat(analysis):=20step=207=20dispatch=20?= =?UTF-8?q?=E2=80=94=20workflow=20input=20+=20EF=20time-series=20dispatche?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/generate_diagnostics.yml | 9 +- .../compile_ef_diagnostics.py | 48 ++- .../dispatch_ef_time_series.py | 340 ++++++++++++++++++ bedrock/utils/config/usa_config.py | 3 +- .../utils/validation/generate_diagnostics.py | 12 + 5 files changed, 401 insertions(+), 11 deletions(-) create mode 100644 bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py diff --git a/.github/workflows/generate_diagnostics.yml b/.github/workflows/generate_diagnostics.yml index 5533a79f..73248c5d 100644 --- a/.github/workflows/generate_diagnostics.yml +++ b/.github/workflows/generate_diagnostics.yml @@ -22,6 +22,11 @@ on: required: false type: boolean default: false + model_base_year: + description: "Override model_base_year (e.g. 2019..2024). Leave empty to use the YAML's value." + required: false + type: string + default: "" env: FORCE_COLOR: 2 @@ -55,13 +60,15 @@ jobs: --config_name "${{ github.event.inputs.config_name }}" \ --git_branch "${{ github.ref_name }}" \ ${{ github.event.inputs.pr_url && format('--pr_url "{0}"', github.event.inputs.pr_url) || '' }} \ + ${{ github.event.inputs.model_base_year && format('--model_base_year {0}', github.event.inputs.model_base_year) || '' }} \ --useeio_baseline_pin_json bedrock/utils/snapshots/useeio_baseline_pin.json else uv run python bedrock/utils/validation/generate_diagnostics.py \ --sheet_id "${{ github.event.inputs.sheet_id }}" \ --config_name "${{ github.event.inputs.config_name }}" \ --git_branch "${{ github.ref_name }}" \ - ${{ github.event.inputs.pr_url && format('--pr_url "{0}"', github.event.inputs.pr_url) || '' }} + ${{ github.event.inputs.pr_url && format('--pr_url "{0}"', github.event.inputs.pr_url) || '' }} \ + ${{ github.event.inputs.model_base_year && format('--model_base_year {0}', github.event.inputs.model_base_year) || '' }} fi notify_slack_failure: diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index dfd62fa3..b930616d 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -156,6 +156,14 @@ def main() -> None: if missing: raise ValueError(f"{EF_RUN_INDEX_PATH} missing columns: {sorted(missing)}") + # `scenario` and `year` are optional. Step 6 runs lack them; Step 7 + # time-series dispatch populates both. Default to empty so the same + # script handles both schemas. + if "scenario" not in index_df.columns: + index_df["scenario"] = "" + if "year" not in index_df.columns: + index_df["year"] = "" + summaries_by_baseline: dict[str, list[pd.Series]] = {} scatter_chunks: list[pd.DataFrame] = [] per_pair_tables: dict[str, pd.DataFrame] = {} @@ -164,19 +172,41 @@ def main() -> None: approach = str(row["approach"]) baseline = str(row["baseline"]) sheet_id = str(row["sheet_id"]) - logger.info("Pulling tabs for approach=%s baseline=%s", approach, baseline) + scenario = str(row["scenario"]) if pd.notna(row["scenario"]) else "" + year = str(row["year"]) if pd.notna(row["year"]) else "" + cell_label = ", ".join( + f"{k}={v}" + for k, v in ( + ("scenario", scenario), + ("approach", approach), + ("year", year), + ("baseline", baseline), + ) + if v + ) + logger.info("Pulling tabs for %s", cell_label) joined = _read_pair(sheet_id) if joined.empty: - logger.warning( - "approach=%s baseline=%s returned empty data; skipping", - approach, - baseline, - ) + logger.warning("%s returned empty data; skipping", cell_label) continue - per_pair_tables[f"{approach}__vs_{baseline}"] = joined.reset_index() - summaries_by_baseline.setdefault(baseline, []).append( - _summarize(joined, approach) + # Build a deterministic 31-char-bounded tab name including any + # populated scenario/year prefix. + prefix = "_".join(p for p in (scenario, year) if p) + pair_key = ( + f"{prefix}_{approach}__vs_{baseline}" + if prefix + else f"{approach}__vs_{baseline}" ) + per_pair_tables[pair_key[:31]] = joined.reset_index() + + summary_row = _summarize(joined, approach) + # Stamp the optional dimensions onto the row so the summary tab is + # navigable in time-series mode. + if scenario: + summary_row["scenario"] = scenario + if year: + summary_row["year"] = year + summaries_by_baseline.setdefault(baseline, []).append(summary_row) scatter_chunks.append(_scatter_coords(joined, approach, baseline)) summaries: dict[str, pd.DataFrame] = { diff --git a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py new file mode 100644 index 00000000..55e9be00 --- /dev/null +++ b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py @@ -0,0 +1,340 @@ +"""Dispatch GitHub Actions diagnostics runs for the Step 7 EF time-series. + +Two scenarios: + +- ``isolate_a_matrix`` — vary only the A-matrix scaling methodology, hold + every other config knob to v0 defaults. Reuses the four Step 6 candidate + YAMLs. +- ``bundle_v0_2`` — full v0.2 release-candidate ensembles that bundle + A-matrix selection with every other v0.2 change. YAMLs TBD; populate + ``BUNDLE_V0_2_YAMLS`` when v0.2 is assembled. + +Per ``(scenario, approach, year)`` cell: + +1. Create a Sheet in the Drive folder ``EF_TIME_SERIES_DRIVE_FOLDER_ID`` with a + deterministic title. +2. Trigger the ``generate_diagnostics`` workflow via ``gh workflow run`` with + ``config_name``, ``model_base_year``, ``sheet_id``, and + ``use_useeio_baseline=false`` (CEDA-baseline only for this starting cut). +3. Append a row to ``output/results/ef_run_index.csv`` so the compile step has + a complete audit trail. + +The script is idempotent — already-recorded ``(scenario, approach, year)`` cells +are skipped, so re-running picks up only the unfilled cells. + +Usage: + python -m bedrock.analysis.a_matrix_time_series.dispatch_ef_time_series \\ + --git-ref main \\ + [--scenarios isolate_a_matrix,bundle_v0_2] \\ + [--years 2019,2020,2021,2022,2023] \\ + [--dry-run] +""" + +from __future__ import annotations + +import argparse +import datetime as dt +import logging +import subprocess + +import pandas as pd + +from bedrock.analysis.a_matrix_time_series.constants import RESULTS_DIR + +logger = logging.getLogger(__name__) + +# v0.3 Diagnostics Drive folder — same one Step 6 used. +EF_TIME_SERIES_DRIVE_FOLDER_ID = "1M2-Vopqfrx1vGcwoNi6wq55FmoELNV1s" + +EF_RUN_INDEX_PATH = RESULTS_DIR / "ef_run_index.csv" + +DEFAULT_YEARS: tuple[int, ...] = (2019, 2020, 2021, 2022, 2023) + +# `isolate_a_matrix`: candidate A-matrix methodologies, everything else held +# to v0 defaults. Reuses Step 6's YAMLs. +ISOLATE_A_MATRIX_YAMLS: dict[str, str] = { + "useeio": "2025_usa_cornerstone_A_useeio", + "summary_tables": "2025_usa_cornerstone_A_summary_tables", + "industry_price_index": "2025_usa_cornerstone_A_industry_price_index", + "commodity_price_index": "2025_usa_cornerstone_A_commodity_price_index", +} + +# `bundle_v0_2`: v0.2 full-model candidates that bundle A-matrix selection +# with every other v0.2 change (GHG methodology, schema, etc.). Populate +# when those YAMLs exist; until then, dispatching `bundle_v0_2` raises. +BUNDLE_V0_2_YAMLS: dict[str, str] = { + # "useeio": "", + # "summary_tables": "", + # "industry_price_index": "", + # "commodity_price_index": "", +} + +SCENARIO_YAMLS: dict[str, dict[str, str]] = { + "isolate_a_matrix": ISOLATE_A_MATRIX_YAMLS, + "bundle_v0_2": BUNDLE_V0_2_YAMLS, +} + +# Human-readable labels for sheet titles. `useeio` is renamed to make +# clear that the approach uses BEA 2017 detail benchmark A directly with +# no temporal adjustment — the same "2017 benchmark A" the USEEIO method +# applies. +APPROACH_LABELS: dict[str, str] = { + "useeio": "A matrix with 2017 benchmark A", + "summary_tables": "A matrix with summary tables", + "industry_price_index": "A matrix with industry price index", + "commodity_price_index": "A matrix with commodity price index", +} +BASELINE_LABELS: dict[str, str] = { + "ceda": "CEDA based", + "useeio": "USEEIO based", +} + +INDEX_COLUMNS = ( + "scenario", + "approach", + "year", + "baseline", + "config_name", + "sheet_id", + "sheet_title", + "useeio_box_ticked", + "git_ref", + "triggered_at", +) + + +def _drive_client(): # type: ignore[no-untyped-def] + """Return an authenticated Drive v3 client for the active ADC.""" + import google.auth # noqa: PLC0415 + import googleapiclient.discovery # noqa: PLC0415 + + creds, _ = google.auth.default(scopes=["https://www.googleapis.com/auth/drive"]) + return googleapiclient.discovery.build("drive", "v3", credentials=creds) + + +def _create_sheet(folder_id: str, title: str) -> str: + drive = _drive_client() + body = { + "name": title, + "mimeType": "application/vnd.google-apps.spreadsheet", + "parents": [folder_id], + } + file = ( + drive.files().create(body=body, fields="id", supportsAllDrives=True).execute() + ) + return str(file["id"]) + + +def _trigger_workflow( + *, + git_ref: str, + config_name: str, + sheet_id: str, + model_base_year: int, + use_useeio_baseline: bool, +) -> None: + cmd = [ + "gh", + "workflow", + "run", + "generate_diagnostics.yml", + "--ref", + git_ref, + "-f", + f"config_name={config_name}", + "-f", + f"sheet_id={sheet_id}", + "-f", + f"model_base_year={model_base_year}", + "-f", + f"use_useeio_baseline={'true' if use_useeio_baseline else 'false'}", + ] + subprocess.run(cmd, check=True) + + +def _load_index() -> pd.DataFrame: + if EF_RUN_INDEX_PATH.exists(): + df = pd.read_csv(EF_RUN_INDEX_PATH) + else: + df = pd.DataFrame(columns=list(INDEX_COLUMNS)) + # Backfill any columns this script needs that the CSV doesn't carry. + # The Step 6 CSV pre-dates `scenario` / `year` / `git_ref` etc.; we + # treat missing values as "not recorded by this dispatch." + for col in INDEX_COLUMNS: + if col not in df.columns: + df[col] = "" + return df + + +def _append_index_row(row: dict[str, object]) -> None: + df = _load_index() + df = pd.concat([df, pd.DataFrame([row])], ignore_index=True) + EF_RUN_INDEX_PATH.parent.mkdir(parents=True, exist_ok=True) + df.to_csv(EF_RUN_INDEX_PATH, index=False) + + +def _already_recorded( + df: pd.DataFrame, scenario: str, approach: str, year: int, baseline: str +) -> bool: + if df.empty: + return False + # `year` may be int or empty-string for legacy rows; coerce non-numeric + # entries to NaN so the equality compare safely returns False for those. + year_col = pd.to_numeric(df["year"], errors="coerce") + matches = df[ + (df["scenario"] == scenario) + & (df["approach"] == approach) + & (year_col == year) + & (df["baseline"] == baseline) + ] + return not matches.empty + + +def dispatch( + *, + git_ref: str, + scenarios: tuple[str, ...] = ("isolate_a_matrix",), + years: tuple[int, ...] = DEFAULT_YEARS, + use_useeio_baseline: bool = False, + dry_run: bool = False, +) -> None: + baseline_label = "useeio" if use_useeio_baseline else "ceda" + today = dt.datetime.utcnow().strftime("%Y-%m-%d") + + n_planned = 0 + n_skipped = 0 + n_dispatched = 0 + + for scenario in scenarios: + if scenario not in SCENARIO_YAMLS: + raise ValueError( + f"Unknown scenario {scenario!r}. Valid: " f"{sorted(SCENARIO_YAMLS)}" + ) + yamls = SCENARIO_YAMLS[scenario] + if not yamls: + raise ValueError( + f"Scenario {scenario!r} has no YAMLs configured — populate " + f"the corresponding mapping in this script before dispatching." + ) + for approach, config_name in yamls.items(): + for year in years: + n_planned += 1 + index_df = _load_index() + if _already_recorded( + index_df, scenario, approach, year, baseline_label + ): + logger.info( + "Skip already-recorded cell (%s, %s, %d, %s)", + scenario, + approach, + year, + baseline_label, + ) + n_skipped += 1 + continue + + approach_label = APPROACH_LABELS[approach] + baseline_text = BASELINE_LABELS[baseline_label] + title = ( + f"[{today}, {year}, {baseline_text}, " + f"{approach_label}, {scenario}] EFs diagnostics" + ) + + if dry_run: + logger.info("DRY-RUN would create sheet: %s", title) + logger.info( + "DRY-RUN would dispatch: config=%s year=%d use_useeio=%s", + config_name, + year, + use_useeio_baseline, + ) + n_dispatched += 1 + continue + + sheet_id = _create_sheet(EF_TIME_SERIES_DRIVE_FOLDER_ID, title) + logger.info( + "Created sheet %s for (%s, %s, %d, %s)", + sheet_id, + scenario, + approach, + year, + baseline_label, + ) + _trigger_workflow( + git_ref=git_ref, + config_name=config_name, + sheet_id=sheet_id, + model_base_year=year, + use_useeio_baseline=use_useeio_baseline, + ) + _append_index_row( + { + "scenario": scenario, + "approach": approach, + "year": year, + "baseline": baseline_label, + "config_name": config_name, + "sheet_id": sheet_id, + "sheet_title": title, + "useeio_box_ticked": str(use_useeio_baseline).lower(), + "git_ref": git_ref, + "triggered_at": dt.datetime.utcnow().isoformat() + "Z", + } + ) + n_dispatched += 1 + + logger.info( + "Done. planned=%d skipped=%d dispatched=%d", + n_planned, + n_skipped, + n_dispatched, + ) + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--git-ref", + required=True, + help="Git ref (branch or tag) to run the workflow against.", + ) + parser.add_argument( + "--scenarios", + default="isolate_a_matrix", + help=( + "Comma-separated scenarios to dispatch. Valid values: " + "'isolate_a_matrix', 'bundle_v0_2'." + ), + ) + parser.add_argument( + "--years", + default=",".join(str(y) for y in DEFAULT_YEARS), + help=f"Comma-separated years (default: {','.join(str(y) for y in DEFAULT_YEARS)}).", + ) + parser.add_argument( + "--use-useeio-baseline", + action="store_true", + help="Tick the USEEIO baseline box. Default is CEDA-only baseline.", + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="Print the plan without creating Sheets or triggering workflows.", + ) + args = parser.parse_args() + + scenarios = tuple(s.strip() for s in args.scenarios.split(",") if s.strip()) + years = tuple(int(y) for y in args.years.split(",") if y.strip()) + + logging.basicConfig(level=logging.INFO, format="%(message)s") + dispatch( + git_ref=args.git_ref, + scenarios=scenarios, + years=years, + use_useeio_baseline=args.use_useeio_baseline, + dry_run=args.dry_run, + ) + + +if __name__ == "__main__": + main() diff --git a/bedrock/utils/config/usa_config.py b/bedrock/utils/config/usa_config.py index b884b133..bb834ec6 100644 --- a/bedrock/utils/config/usa_config.py +++ b/bedrock/utils/config/usa_config.py @@ -16,6 +16,7 @@ 'useeio_baseline_xlsx_gs_uri', 'useeio_baseline_xlsx_sha256', 'useeio_model_version_label', + 'model_base_year', } ) @@ -31,7 +32,7 @@ class USAConfig(BaseModel): ##### # Model base settings ##### - model_base_year: ta.Literal[2022, 2023, 2024] = 2023 + model_base_year: ta.Literal[2019, 2020, 2021, 2022, 2023, 2024] = 2023 bea_io_level: ta.Literal['detail', 'summary'] = 'detail' bea_io_scheme: ta.Literal[2017, 2022] = 2017 # documentation purposes price_type: ta.Literal['producer', 'purchaser'] = 'producer' diff --git a/bedrock/utils/validation/generate_diagnostics.py b/bedrock/utils/validation/generate_diagnostics.py index 8c412c10..01ab32db 100644 --- a/bedrock/utils/validation/generate_diagnostics.py +++ b/bedrock/utils/validation/generate_diagnostics.py @@ -49,6 +49,15 @@ '--diagnostics_baseline_source.' ), ) +@click.option( + '--model_base_year', + default=None, + type=int, + help=( + 'Override config model_base_year — used by time-series ' + 'dispatch to vary the year without forking config YAMLs.' + ), +) def generate_diagnostics( sheet_id: str, config_name: str, @@ -56,6 +65,7 @@ def generate_diagnostics( pr_url: str | None, diagnostics_baseline_source: str | None, useeio_baseline_pin_json: str | None, + model_base_year: int | None, ) -> None: total_start = time.time() overrides: dict[str, object] = {} @@ -69,6 +79,8 @@ def generate_diagnostics( overrides['diagnostics_baseline_source'] = 'gcs_useeio_xlsx' if diagnostics_baseline_source is not None: overrides['diagnostics_baseline_source'] = diagnostics_baseline_source + if model_base_year is not None: + overrides['model_base_year'] = model_base_year set_global_usa_config( config_name, diagnostics_cli_overrides=overrides if overrides else None, From 93c30f76c54d55989d21966927e6b4d82e07556e Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 16:28:07 -0700 Subject: [PATCH 04/25] feat(diagnostics): wire usa_ghg_data_year override + bundle_v0_2 time-series dispatch Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/generate_diagnostics.yml | 19 +- .../dispatch_ef_time_series.py | 209 ++++++++++++++++-- bedrock/transform/allocation/derived.py | 27 ++- bedrock/utils/config/usa_config.py | 3 +- .../utils/validation/generate_diagnostics.py | 13 ++ 5 files changed, 251 insertions(+), 20 deletions(-) diff --git a/.github/workflows/generate_diagnostics.yml b/.github/workflows/generate_diagnostics.yml index 73248c5d..5681b8b4 100644 --- a/.github/workflows/generate_diagnostics.yml +++ b/.github/workflows/generate_diagnostics.yml @@ -27,10 +27,25 @@ on: required: false type: string default: "" + usa_ghg_data_year: + description: "Override usa_ghg_data_year (e.g. 2019..2024). Leave empty to use the YAML's value." + required: false + type: string + default: "" env: FORCE_COLOR: 2 +# Belt-and-suspenders against the Sheets-API write quota. The dispatcher +# in `bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py` +# polls for capacity client-side; this directive is the safety net +# preventing accidental parallel runs (e.g. UI-triggered ones) from +# overlapping. With `cancel-in-progress: false`, any third concurrent +# dispatch is dropped — the dispatcher's polling avoids that case. +concurrency: + group: generate_diagnostics + cancel-in-progress: false + jobs: diagnostics: runs-on: ubuntu-latest @@ -61,6 +76,7 @@ jobs: --git_branch "${{ github.ref_name }}" \ ${{ github.event.inputs.pr_url && format('--pr_url "{0}"', github.event.inputs.pr_url) || '' }} \ ${{ github.event.inputs.model_base_year && format('--model_base_year {0}', github.event.inputs.model_base_year) || '' }} \ + ${{ github.event.inputs.usa_ghg_data_year && format('--usa_ghg_data_year {0}', github.event.inputs.usa_ghg_data_year) || '' }} \ --useeio_baseline_pin_json bedrock/utils/snapshots/useeio_baseline_pin.json else uv run python bedrock/utils/validation/generate_diagnostics.py \ @@ -68,7 +84,8 @@ jobs: --config_name "${{ github.event.inputs.config_name }}" \ --git_branch "${{ github.ref_name }}" \ ${{ github.event.inputs.pr_url && format('--pr_url "{0}"', github.event.inputs.pr_url) || '' }} \ - ${{ github.event.inputs.model_base_year && format('--model_base_year {0}', github.event.inputs.model_base_year) || '' }} + ${{ github.event.inputs.model_base_year && format('--model_base_year {0}', github.event.inputs.model_base_year) || '' }} \ + ${{ github.event.inputs.usa_ghg_data_year && format('--usa_ghg_data_year {0}', github.event.inputs.usa_ghg_data_year) || '' }} fi notify_slack_failure: diff --git a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py index 55e9be00..dcf87143 100644 --- a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py +++ b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py @@ -34,8 +34,10 @@ import argparse import datetime as dt +import json import logging import subprocess +import time import pandas as pd @@ -59,14 +61,13 @@ "commodity_price_index": "2025_usa_cornerstone_A_commodity_price_index", } -# `bundle_v0_2`: v0.2 full-model candidates that bundle A-matrix selection -# with every other v0.2 change (GHG methodology, schema, etc.). Populate -# when those YAMLs exist; until then, dispatching `bundle_v0_2` raises. +# `bundle_v0_2`: full v0.2 release-candidate config. Single YAML — +# `2025_usa_cornerstone_full_model` carries all v0.2 flags (cornerstone +# 2026 schema, cornerstone GHG FBS, USEEIO B method, waste disagg). The +# `model_base_year` and `usa_ghg_data_year` overrides drive the time +# series; the YAML itself is year-agnostic. BUNDLE_V0_2_YAMLS: dict[str, str] = { - # "useeio": "", - # "summary_tables": "", - # "industry_price_index": "", - # "commodity_price_index": "", + "full_model": "2025_usa_cornerstone_full_model", } SCENARIO_YAMLS: dict[str, dict[str, str]] = { @@ -83,6 +84,7 @@ "summary_tables": "A matrix with summary tables", "industry_price_index": "A matrix with industry price index", "commodity_price_index": "A matrix with commodity price index", + "full_model": "full v0.2 model", } BASELINE_LABELS: dict[str, str] = { "ceda": "CEDA based", @@ -132,6 +134,7 @@ def _trigger_workflow( sheet_id: str, model_base_year: int, use_useeio_baseline: bool, + usa_ghg_data_year: int | None = None, ) -> None: cmd = [ "gh", @@ -149,9 +152,84 @@ def _trigger_workflow( "-f", f"use_useeio_baseline={'true' if use_useeio_baseline else 'false'}", ] + if usa_ghg_data_year is not None: + cmd += ["-f", f"usa_ghg_data_year={usa_ghg_data_year}"] subprocess.run(cmd, check=True) +def _busy_count(workflow: str = "generate_diagnostics") -> int: + """Number of `queued` + `in_progress` runs of the named workflow.""" + count = 0 + for status in ("queued", "in_progress"): + result = subprocess.run( + [ + "gh", + "run", + "list", + "--workflow", + f"{workflow}.yml", + "--status", + status, + "--limit", + "20", + "--json", + "databaseId", + ], + capture_output=True, + text=True, + check=True, + ) + count += len(json.loads(result.stdout)) + return count + + +def _wait_for_capacity( + *, + poll_interval: int = 15, + timeout: int = 1800, + workflow: str = "generate_diagnostics", +) -> None: + """Block until no `generate_diagnostics` run is queued or in progress. + + Combined with the workflow's `concurrency:` directive, this is the + primary serialization mechanism — guarantees we don't dispatch a new + run while one is still in flight (which would either get cancelled by + the directive or stack up against the Sheets API write quota). + """ + deadline = time.time() + timeout + while time.time() < deadline: + n = _busy_count(workflow) + if n == 0: + return + logger.info("Waiting for %d in-flight %s run(s) to clear...", n, workflow) + time.sleep(poll_interval) + raise TimeoutError( + f"{workflow} runs still busy after {timeout}s; aborting dispatch" + ) + + +def _throttle(mode: str) -> None: + """Apply the configured throttle between successive dispatches. + + Modes: + - ``poll``: block until the workflow has no queued or in-progress runs. + - ``sleep:N``: sleep N seconds (e.g. ``sleep:120``). + - ``none``: no throttle; useful only with a bumped Sheets API quota. + """ + if mode == "poll": + _wait_for_capacity() + elif mode.startswith("sleep:"): + seconds = int(mode.split(":", 1)[1]) + logger.info("Sleeping %ds before next dispatch...", seconds) + time.sleep(seconds) + elif mode == "none": + return + else: + raise ValueError( + f"Unknown throttle {mode!r}. Valid: 'poll', 'sleep:N', 'none'." + ) + + def _load_index() -> pd.DataFrame: if EF_RUN_INDEX_PATH.exists(): df = pd.read_csv(EF_RUN_INDEX_PATH) @@ -193,10 +271,11 @@ def _already_recorded( def dispatch( *, git_ref: str, - scenarios: tuple[str, ...] = ("isolate_a_matrix",), + scenarios: tuple[str, ...] = ("bundle_v0_2",), years: tuple[int, ...] = DEFAULT_YEARS, use_useeio_baseline: bool = False, dry_run: bool = False, + throttle: str = "poll", ) -> None: baseline_label = "useeio" if use_useeio_baseline else "ceda" today = dt.datetime.utcnow().strftime("%Y-%m-%d") @@ -251,6 +330,9 @@ def dispatch( n_dispatched += 1 continue + if n_dispatched > 0: + _throttle(throttle) + sheet_id = _create_sheet(EF_TIME_SERIES_DRIVE_FOLDER_ID, title) logger.info( "Created sheet %s for (%s, %s, %d, %s)", @@ -266,6 +348,7 @@ def dispatch( sheet_id=sheet_id, model_base_year=year, use_useeio_baseline=use_useeio_baseline, + usa_ghg_data_year=year, ) _append_index_row( { @@ -291,6 +374,73 @@ def dispatch( ) +def re_dispatch_from_csv( + *, + git_ref: str, + scenarios: tuple[str, ...] | None = None, + throttle: str = "poll", + dry_run: bool = False, +) -> None: + """Re-trigger workflow runs for cells already recorded in + ``ef_run_index.csv``. Used to recover from rate-limit batch failures — + re-uses the existing Sheets (no new ones created), so the audit trail + keeps the same `sheet_id`s. + + Successful runs that get re-triggered will overwrite their own data + with deterministic identical content; harmless but wastes a few + minutes of runner time. Filter with ``scenarios`` to scope down. + """ + df = _load_index() + if df.empty: + logger.info("No rows in %s; nothing to re-dispatch", EF_RUN_INDEX_PATH) + return + + # Re-dispatch only Step 7 rows (have non-empty scenario + year). + has_step7 = (df["scenario"].astype(str).str.strip() != "") & ( + df["year"].astype(str).str.strip() != "" + ) + df = df[has_step7].copy() + if scenarios: + df = df[df["scenario"].isin(scenarios)] + if df.empty: + logger.info("No matching rows to re-dispatch") + return + + logger.info("Re-dispatching %d cells from %s", len(df), EF_RUN_INDEX_PATH) + n_dispatched = 0 + for _, row in df.iterrows(): + if dry_run: + logger.info( + "DRY-RUN would re-dispatch sheet=%s config=%s year=%s", + row["sheet_id"], + row["config_name"], + row["year"], + ) + n_dispatched += 1 + continue + + if n_dispatched > 0: + _throttle(throttle) + + _trigger_workflow( + git_ref=git_ref, + config_name=str(row["config_name"]), + sheet_id=str(row["sheet_id"]), + model_base_year=int(float(row["year"])), + use_useeio_baseline=str(row["useeio_box_ticked"]).strip().lower() == "true", + usa_ghg_data_year=int(float(row["year"])), + ) + logger.info( + "Re-dispatched sheet %s (%s × %s)", + row["sheet_id"], + row["approach"], + row["year"], + ) + n_dispatched += 1 + + logger.info("Done. re-dispatched=%d", n_dispatched) + + def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( @@ -300,7 +450,7 @@ def main() -> None: ) parser.add_argument( "--scenarios", - default="isolate_a_matrix", + default="bundle_v0_2", help=( "Comma-separated scenarios to dispatch. Valid values: " "'isolate_a_matrix', 'bundle_v0_2'." @@ -321,19 +471,46 @@ def main() -> None: action="store_true", help="Print the plan without creating Sheets or triggering workflows.", ) + parser.add_argument( + "--throttle", + default="poll", + help=( + "How to space successive workflow triggers. 'poll' (default) " + "blocks until prior runs clear; 'sleep:N' sleeps N seconds; " + "'none' fires immediately (only safe with bumped Sheets API quota)." + ), + ) + parser.add_argument( + "--re-dispatch-from-csv", + action="store_true", + help=( + "Re-trigger workflows for cells already in ef_run_index.csv. " + "Used to recover from rate-limit batch failures — re-uses " + "existing Sheets, no new ones created." + ), + ) args = parser.parse_args() scenarios = tuple(s.strip() for s in args.scenarios.split(",") if s.strip()) years = tuple(int(y) for y in args.years.split(",") if y.strip()) logging.basicConfig(level=logging.INFO, format="%(message)s") - dispatch( - git_ref=args.git_ref, - scenarios=scenarios, - years=years, - use_useeio_baseline=args.use_useeio_baseline, - dry_run=args.dry_run, - ) + if args.re_dispatch_from_csv: + re_dispatch_from_csv( + git_ref=args.git_ref, + scenarios=scenarios, + throttle=args.throttle, + dry_run=args.dry_run, + ) + else: + dispatch( + git_ref=args.git_ref, + scenarios=scenarios, + years=years, + use_useeio_baseline=args.use_useeio_baseline, + dry_run=args.dry_run, + throttle=args.throttle, + ) if __name__ == "__main__": diff --git a/bedrock/transform/allocation/derived.py b/bedrock/transform/allocation/derived.py index 807fc398..ccf09891 100644 --- a/bedrock/transform/allocation/derived.py +++ b/bedrock/transform/allocation/derived.py @@ -159,8 +159,31 @@ def load_E_from_flowsa() -> pd.DataFrame: Only used when load_E_from_flowsa is True in USA config. """ usa = get_usa_config() + year = usa.usa_ghg_data_year + # Only the base `new_ghg_method` and CEDA fallback FBS methods exist + # for years other than 2023. The variant FBSes (`*_coa_allocation`, + # `*_electricity`, etc.) are 2023-only; raise here rather than failing + # with an opaque "FBS not found" later. + needs_2023 = ( + usa.update_ghg_coa_allocation + or usa.update_electricity_ghg_method + or usa.update_other_gases_ghg_method + or usa.update_ghg_attribution_method_for_ng_and_petrol_systems + or usa.update_flowsa_refrigerant_method + or usa.update_transportation_ghg_method + or usa.add_new_ghg_activities + or usa.update_enteric_fermentation_and_manure_management_ghg_method + or usa.update_liming_and_fertilizer_ghg_method + ) + if needs_2023 and year != 2023: + raise ValueError( + f'usa_ghg_data_year={year} is incompatible with the active ' + 'update_*_ghg_method flag — variant FBS methods only exist ' + 'for 2023. Either set usa_ghg_data_year=2023 or disable the ' + 'update_*_ghg_method flag.' + ) if usa.new_ghg_method: - methodname = 'GHG_national_Cornerstone_2023' + methodname = f'GHG_national_Cornerstone_{year}' elif usa.update_ghg_coa_allocation: methodname = 'GHG_national_Cornerstone_2023_coa_allocation' elif usa.update_electricity_ghg_method: @@ -180,7 +203,7 @@ def load_E_from_flowsa() -> pd.DataFrame: elif usa.update_liming_and_fertilizer_ghg_method: methodname = 'GHG_national_Cornerstone_2023_ag_soils' else: - methodname = 'GHG_national_CEDA_2023' + methodname = f'GHG_national_CEDA_{year}' fbs = getFlowBySector(methodname=methodname) fbs = map_to_CEDA(fbs) diff --git a/bedrock/utils/config/usa_config.py b/bedrock/utils/config/usa_config.py index bb834ec6..2455faf4 100644 --- a/bedrock/utils/config/usa_config.py +++ b/bedrock/utils/config/usa_config.py @@ -17,6 +17,7 @@ 'useeio_baseline_xlsx_sha256', 'useeio_model_version_label', 'model_base_year', + 'usa_ghg_data_year', } ) @@ -47,7 +48,7 @@ class USAConfig(BaseModel): usa_io_data_year: ta.Literal[2022, 2023, 2024] = ( 2022 # CEDA's legacy USA IO data year ) - usa_ghg_data_year: ta.Literal[2023, 2024] = 2023 + usa_ghg_data_year: ta.Literal[2019, 2020, 2021, 2022, 2023, 2024] = 2023 ipcc_ar_version: ta.Literal['AR5', 'AR6'] = 'AR6' diff --git a/bedrock/utils/validation/generate_diagnostics.py b/bedrock/utils/validation/generate_diagnostics.py index 01ab32db..7dabc73d 100644 --- a/bedrock/utils/validation/generate_diagnostics.py +++ b/bedrock/utils/validation/generate_diagnostics.py @@ -58,6 +58,16 @@ 'dispatch to vary the year without forking config YAMLs.' ), ) +@click.option( + '--usa_ghg_data_year', + default=None, + type=int, + help=( + 'Override config usa_ghg_data_year — used by time-series ' + 'dispatch to vary the GHG inventory year alongside ' + 'model_base_year.' + ), +) def generate_diagnostics( sheet_id: str, config_name: str, @@ -66,6 +76,7 @@ def generate_diagnostics( diagnostics_baseline_source: str | None, useeio_baseline_pin_json: str | None, model_base_year: int | None, + usa_ghg_data_year: int | None, ) -> None: total_start = time.time() overrides: dict[str, object] = {} @@ -81,6 +92,8 @@ def generate_diagnostics( overrides['diagnostics_baseline_source'] = diagnostics_baseline_source if model_base_year is not None: overrides['model_base_year'] = model_base_year + if usa_ghg_data_year is not None: + overrides['usa_ghg_data_year'] = usa_ghg_data_year set_global_usa_config( config_name, diagnostics_cli_overrides=overrides if overrides else None, From de0c9bb4166199ea0e1d37cde573d0034a15b096 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 16:56:25 -0700 Subject: [PATCH 05/25] fix(diagnostics): bypass-flowsa FBS load + Sheet1 cleanup + dispatch race Co-Authored-By: Claude Opus 4.7 (1M context) --- .../dispatch_ef_time_series.py | 10 +++ bedrock/transform/allocation/derived.py | 87 ++++++++++++++----- bedrock/utils/io/gcp.py | 28 ++++++ .../utils/validation/generate_diagnostics.py | 10 ++- 4 files changed, 113 insertions(+), 22 deletions(-) diff --git a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py index dcf87143..9c89977f 100644 --- a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py +++ b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py @@ -188,6 +188,7 @@ def _wait_for_capacity( poll_interval: int = 15, timeout: int = 1800, workflow: str = "generate_diagnostics", + initial_delay: int = 15, ) -> None: """Block until no `generate_diagnostics` run is queued or in progress. @@ -195,7 +196,16 @@ def _wait_for_capacity( primary serialization mechanism — guarantees we don't dispatch a new run while one is still in flight (which would either get cancelled by the directive or stack up against the Sheets API write quota). + + ``initial_delay`` blocks before the first poll so a just-triggered + workflow has time to register as ``queued``. Without it, the post- + dispatch visibility lag (~10–20s) lets ``_busy_count`` see 0 and we + fire the next dispatch immediately, which the workflow's + ``cancel-in-progress: false`` then resolves by killing the older + pending run. """ + if initial_delay: + time.sleep(initial_delay) deadline = time.time() + timeout while time.time() < deadline: n = _busy_count(workflow) diff --git a/bedrock/transform/allocation/derived.py b/bedrock/transform/allocation/derived.py index ccf09891..127061fb 100644 --- a/bedrock/transform/allocation/derived.py +++ b/bedrock/transform/allocation/derived.py @@ -132,6 +132,45 @@ def map_to_CEDA(fbs: pd.DataFrame) -> pd.DataFrame: return fbs3 +def _load_cornerstone_ghg_fbs_from_gcs(year: int) -> pd.DataFrame: + """Download a year-specific Cornerstone GHG FBS parquet from GCS. + + Bypasses ``getFlowBySector`` for the time-series case. The flowsa + regen path goes through `EPA_GHGI` loaders that are hard-capped at + `{2022, 2023}` (`bedrock/extract/allocation/epa.py:_get_epa_data_year`), + so years like 2019–2021 fail there. The pre-built FBS parquets in + ``gs://cornerstone-default/transform/output_data/`` cover 2019–2023 + already, so we load them directly. + + Picks the most-recently-uploaded parquet whose ``base_name`` matches + ``GHG_national_Cornerstone_`` so we follow the FBS regeneration + cadence without pinning the version/hash here. + """ + from bedrock.utils.io.gcp import ( # noqa: PLC0415 + download_gcs_file_if_not_exists, + list_bucket_files, + ) + + sub_bucket = "transform/output_data" + base_name = f"GHG_national_Cornerstone_{year}" + bucket_df = list_bucket_files(sub_bucket) + matches = bucket_df[ + (bucket_df["base_name"] == base_name) & (bucket_df["extension"] == ".parquet") + ].sort_values("created", ascending=False) + if matches.empty: + raise FileNotFoundError( + f"No FBS parquet found at gs://cornerstone-default/{sub_bucket}/ " + f"matching base_name={base_name!r}" + ) + filename = matches.iloc[0]["full_path"].rsplit("/", 1)[-1] + from bedrock.utils.config.settings import FBS_DIR # noqa: PLC0415 + + local_path = str(FBS_DIR / filename) + download_gcs_file_if_not_exists(filename, sub_bucket, local_path) + logger.info("Loaded cached FBS for %d from %s", year, filename) + return pd.read_parquet(local_path) + + def load_E_from_flowsa() -> pd.DataFrame: """Load E_usa (GHG × CEDA v7 sectors) from the CEDA FBS. @@ -183,28 +222,34 @@ def load_E_from_flowsa() -> pd.DataFrame: 'update_*_ghg_method flag.' ) if usa.new_ghg_method: - methodname = f'GHG_national_Cornerstone_{year}' - elif usa.update_ghg_coa_allocation: - methodname = 'GHG_national_Cornerstone_2023_coa_allocation' - elif usa.update_electricity_ghg_method: - methodname = 'GHG_national_Cornerstone_2023_electricity' - elif usa.update_other_gases_ghg_method: - methodname = 'GHG_national_Cornerstone_2023_other_gases' - elif usa.update_ghg_attribution_method_for_ng_and_petrol_systems: - methodname = 'GHG_national_Cornerstone_2023_petroleum_natgas' - elif usa.update_flowsa_refrigerant_method: - methodname = "GHG_national_Cornerstone_2023_refrigerants_foams" - elif usa.update_transportation_ghg_method: - methodname = 'GHG_national_Cornerstone_2023_mobile_combustion' - elif usa.add_new_ghg_activities: - methodname = 'GHG_national_Cornerstone_2023_new_activities' - elif usa.update_enteric_fermentation_and_manure_management_ghg_method: - methodname = 'GHG_national_Cornerstone_2023_ag_livestock' - elif usa.update_liming_and_fertilizer_ghg_method: - methodname = 'GHG_national_Cornerstone_2023_ag_soils' + # Bypass flowsa regen for non-2023 years: the EPA loader behind + # `getFlowBySector` is hard-capped at {2022, 2023}, but the + # already-built FBS parquets exist on GCS at + # `transform/output_data/` for 2019–2023. Load the cached parquet + # directly so the year-Y diagnostics get year-Y GHG data. + fbs = _load_cornerstone_ghg_fbs_from_gcs(year) else: - methodname = f'GHG_national_CEDA_{year}' - fbs = getFlowBySector(methodname=methodname) + if usa.update_ghg_coa_allocation: + methodname = 'GHG_national_Cornerstone_2023_coa_allocation' + elif usa.update_electricity_ghg_method: + methodname = 'GHG_national_Cornerstone_2023_electricity' + elif usa.update_other_gases_ghg_method: + methodname = 'GHG_national_Cornerstone_2023_other_gases' + elif usa.update_ghg_attribution_method_for_ng_and_petrol_systems: + methodname = 'GHG_national_Cornerstone_2023_petroleum_natgas' + elif usa.update_flowsa_refrigerant_method: + methodname = "GHG_national_Cornerstone_2023_refrigerants_foams" + elif usa.update_transportation_ghg_method: + methodname = 'GHG_national_Cornerstone_2023_mobile_combustion' + elif usa.add_new_ghg_activities: + methodname = 'GHG_national_Cornerstone_2023_new_activities' + elif usa.update_enteric_fermentation_and_manure_management_ghg_method: + methodname = 'GHG_national_Cornerstone_2023_ag_livestock' + elif usa.update_liming_and_fertilizer_ghg_method: + methodname = 'GHG_national_Cornerstone_2023_ag_soils' + else: + methodname = f'GHG_national_CEDA_{year}' + fbs = getFlowBySector(methodname=methodname) fbs = map_to_CEDA(fbs) diff --git a/bedrock/utils/io/gcp.py b/bedrock/utils/io/gcp.py index 99ca8c65..9385d02d 100644 --- a/bedrock/utils/io/gcp.py +++ b/bedrock/utils/io/gcp.py @@ -372,6 +372,34 @@ def update_sheet_tab( ).execute() +def delete_default_sheet1(sheet_id: str) -> None: + """Delete the default ``Sheet1`` tab if other tabs exist. + + Newly-created spreadsheets always have a ``Sheet1`` placeholder. + Diagnostics runs leave it behind; this helper removes it. No-op if + ``Sheet1`` doesn't exist or it's the only tab (Google Sheets requires + at least one tab per spreadsheet). + """ + client = __sheets_client() + metadata = client.spreadsheets().get(spreadsheetId=sheet_id).execute() + sheets = metadata.get("sheets", []) + sheet1 = next( + (s for s in sheets if s["properties"]["title"] == "Sheet1"), + None, + ) + if sheet1 is None: + return + if len(sheets) <= 1: + logger.info("Skipping Sheet1 deletion on %s: it's the only tab.", sheet_id) + return + sheet1_id = sheet1["properties"]["sheetId"] + client.spreadsheets().batchUpdate( + spreadsheetId=sheet_id, + body={"requests": [{"deleteSheet": {"sheetId": sheet1_id}}]}, + ).execute() + logger.info('deleted default Sheet1 from "%s"', sheet_id) + + def list_bucket_files(sub_bucket: str = "") -> pd.DataFrame: """ List all files in the GCS bucket and return a DataFrame diff --git a/bedrock/utils/validation/generate_diagnostics.py b/bedrock/utils/validation/generate_diagnostics.py index 7dabc73d..a754a989 100644 --- a/bedrock/utils/validation/generate_diagnostics.py +++ b/bedrock/utils/validation/generate_diagnostics.py @@ -14,7 +14,7 @@ GIT_PR_URL, ) from bedrock.utils.config.usa_config import get_usa_config, set_global_usa_config -from bedrock.utils.io.gcp import update_sheet_tab +from bedrock.utils.io.gcp import delete_default_sheet1, update_sheet_tab from bedrock.utils.snapshots.loader import resolve_snapshot_key logger = logging.getLogger(__name__) @@ -150,6 +150,14 @@ def generate_diagnostics( config_df, ) logger.info(f'[TIMING] Config summary update completed in {time.time() - t0:.1f}s') + + # Drop the placeholder Sheet1 that Google creates by default on every + # new spreadsheet — diagnostics runs leave it behind otherwise. + try: + delete_default_sheet1(sheet_id) + except Exception as e: # noqa: BLE001 + logger.warning('Sheet1 cleanup skipped (%s: %s)', type(e).__name__, e) + logger.info( f'[TIMING] Total diagnostics completed in {time.time() - total_start:.1f}s' ) From 5cee90d7e2d946b2e5b634627339d157fee4bfc0 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 17:02:47 -0700 Subject: [PATCH 06/25] fix(diagnostics): use download_gcs_file for FBS cache to avoid metadata-overwrite Co-Authored-By: Claude Opus 4.7 (1M context) --- bedrock/transform/allocation/derived.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/bedrock/transform/allocation/derived.py b/bedrock/transform/allocation/derived.py index 127061fb..c26b80b2 100644 --- a/bedrock/transform/allocation/derived.py +++ b/bedrock/transform/allocation/derived.py @@ -146,8 +146,11 @@ def _load_cornerstone_ghg_fbs_from_gcs(year: int) -> pd.DataFrame: ``GHG_national_Cornerstone_`` so we follow the FBS regeneration cadence without pinning the version/hash here. """ + import os # noqa: PLC0415 + + from bedrock.utils.config.settings import FBS_DIR # noqa: PLC0415 from bedrock.utils.io.gcp import ( # noqa: PLC0415 - download_gcs_file_if_not_exists, + download_gcs_file, list_bucket_files, ) @@ -163,10 +166,12 @@ def _load_cornerstone_ghg_fbs_from_gcs(year: int) -> pd.DataFrame: f"matching base_name={base_name!r}" ) filename = matches.iloc[0]["full_path"].rsplit("/", 1)[-1] - from bedrock.utils.config.settings import FBS_DIR # noqa: PLC0415 - local_path = str(FBS_DIR / filename) - download_gcs_file_if_not_exists(filename, sub_bucket, local_path) + # Use `download_gcs_file` rather than `_if_not_exists`: the latter + # downloads ALL files matching the parsed (base, version, hash) into + # the same `pth`, so the metadata JSON overwrites the parquet. + if not os.path.exists(local_path): + download_gcs_file(filename, sub_bucket, local_path) logger.info("Loaded cached FBS for %d from %s", year, filename) return pd.read_parquet(local_path) From c8d57251cc67410033cd8ffa94aa16b2f813e4d7 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 17:27:20 -0700 Subject: [PATCH 07/25] =?UTF-8?q?feat(diagnostics):=20bundle=5Fv0=5F2=20?= =?UTF-8?q?=3D=204=20A-matrix=20configs=20=C3=97=20full=20v0.2=20stack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- .../dispatch_ef_time_series.py | 15 +++++++++------ ...rstone_full_model_A_commodity_price_index.yaml | 11 +++++++++++ ...erstone_full_model_A_industry_price_index.yaml | 8 ++++++++ ...a_cornerstone_full_model_A_summary_tables.yaml | 8 ++++++++ .../2025_usa_cornerstone_full_model_A_useeio.yaml | 8 ++++++++ 5 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_commodity_price_index.yaml create mode 100644 bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_industry_price_index.yaml create mode 100644 bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_summary_tables.yaml create mode 100644 bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_useeio.yaml diff --git a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py index 9c89977f..e13fdd48 100644 --- a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py +++ b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py @@ -61,13 +61,16 @@ "commodity_price_index": "2025_usa_cornerstone_A_commodity_price_index", } -# `bundle_v0_2`: full v0.2 release-candidate config. Single YAML — -# `2025_usa_cornerstone_full_model` carries all v0.2 flags (cornerstone -# 2026 schema, cornerstone GHG FBS, USEEIO B method, waste disagg). The -# `model_base_year` and `usa_ghg_data_year` overrides drive the time -# series; the YAML itself is year-agnostic. +# `bundle_v0_2`: full v0.2 release-candidate ensembles. Each YAML carries +# the full v0.2 flag stack (cornerstone 2026 schema, cornerstone GHG FBS, +# USEEIO B method, waste disagg) PLUS one A-matrix scaling alternative. +# The `model_base_year` and `usa_ghg_data_year` overrides drive the time +# series; the YAMLs themselves are year-agnostic. BUNDLE_V0_2_YAMLS: dict[str, str] = { - "full_model": "2025_usa_cornerstone_full_model", + "useeio": "2025_usa_cornerstone_full_model_A_useeio", + "summary_tables": "2025_usa_cornerstone_full_model_A_summary_tables", + "industry_price_index": "2025_usa_cornerstone_full_model_A_industry_price_index", + "commodity_price_index": "2025_usa_cornerstone_full_model_A_commodity_price_index", } SCENARIO_YAMLS: dict[str, dict[str, str]] = { diff --git a/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_commodity_price_index.yaml b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_commodity_price_index.yaml new file mode 100644 index 00000000..2cee89b3 --- /dev/null +++ b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_commodity_price_index.yaml @@ -0,0 +1,11 @@ +# Full v0.2 model bundled with V-norm-derived commodity-price-index +# A-matrix scaling. A is inflated 2017 → target year using a V-norm- +# weighted commodity price ratio; V is itself inflated to model_base_year +# via apply_inflation_to_V. +use_cornerstone_2026_model_schema: True +load_E_from_flowsa: True +new_ghg_method: True +use_E_data_year_for_x_in_B: True +implement_waste_disaggregation: True +scale_a_matrix_with_commodity_price_index: True +apply_inflation_to_V: True diff --git a/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_industry_price_index.yaml b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_industry_price_index.yaml new file mode 100644 index 00000000..a0160375 --- /dev/null +++ b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_industry_price_index.yaml @@ -0,0 +1,8 @@ +# Full v0.2 model bundled with industry-price-index A-matrix scaling: +# A is inflated 2017 → target year via BEA industry price index. +use_cornerstone_2026_model_schema: True +load_E_from_flowsa: True +new_ghg_method: True +use_E_data_year_for_x_in_B: True +implement_waste_disaggregation: True +scale_a_matrix_with_industry_price_index: True diff --git a/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_summary_tables.yaml b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_summary_tables.yaml new file mode 100644 index 00000000..eba708f5 --- /dev/null +++ b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_summary_tables.yaml @@ -0,0 +1,8 @@ +# Full v0.2 model bundled with summary-tables A-matrix scaling: +# A is scaled 2017 → target year via BEA summary-table ratios. +use_cornerstone_2026_model_schema: True +load_E_from_flowsa: True +new_ghg_method: True +use_E_data_year_for_x_in_B: True +implement_waste_disaggregation: True +scale_a_matrix_with_summary_tables: True diff --git a/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_useeio.yaml b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_useeio.yaml new file mode 100644 index 00000000..8ffb2dc7 --- /dev/null +++ b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_useeio.yaml @@ -0,0 +1,8 @@ +# Full v0.2 model bundled with USEEIO A-matrix method: +# A is the BEA 2017 detail benchmark with no temporal scaling. +use_cornerstone_2026_model_schema: True +load_E_from_flowsa: True +new_ghg_method: True +use_E_data_year_for_x_in_B: True +implement_waste_disaggregation: True +scale_a_matrix_with_useeio_method: True From 1ba3b8017439c9b67af09d74f7d86071533f046f Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 18:41:36 -0700 Subject: [PATCH 08/25] feat(analysis): deflate D_new/N_new to common ref-year for time series Each diagnostics cell runs at model_base_year=Y so D_new/N_new are denominated in year-Y dollars. Cross-year comparison requires a single dollar reference; add D_new_ref/N_new_ref columns that apply inflation_adjust_ef_denom_to_new_base_year to land every cell on REFERENCE_DOLLAR_YEAR (2023). Step 6 single-year rows (empty year column) skip the step and behave unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../compile_ef_diagnostics.py | 61 +++++++++++++++++-- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index b930616d..72dec847 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -30,6 +30,7 @@ from __future__ import annotations import logging +import typing as ta import pandas as pd @@ -39,6 +40,9 @@ RESULTS_DIR, ) from bedrock.utils.io.gcp import read_sheet_tab, update_sheet_tab +from bedrock.utils.validation.diagnostics_helpers import ( + inflation_adjust_ef_denom_to_new_base_year, +) logger = logging.getLogger(__name__) @@ -49,6 +53,11 @@ # A row counts as "significantly different" when |perc_diff| exceeds this. SIGNIFICANT_PCT_THRESHOLD = 0.10 +# Time-series cells differ in `model_base_year`, so each cell's `D_new` / +# `N_new` lives in its own dollar year. Deflate them to this common reference +# so values are commensurable across years. +REFERENCE_DOLLAR_YEAR = 2023 + # Tab names produced by `calculate_ef_diagnostics.py` per run. Both # baseline modes (CEDA-only and USEEIO-checked) emit identical column # headers — confirmed via spot-check. @@ -74,7 +83,9 @@ def _coerce_numeric(df: pd.DataFrame, cols: tuple[str, ...]) -> pd.DataFrame: s = df[col].astype(str).str.strip() is_pct = s.str.endswith("%") cleaned = s.str.rstrip("%").str.replace(",", "", regex=False) - numeric = pd.to_numeric(cleaned, errors="coerce") + numeric = ta.cast( + "pd.Series", pd.to_numeric(cleaned, errors="coerce") + ) df[col] = numeric.mask(is_pct, numeric / 100) return df @@ -93,6 +104,34 @@ def _read_pair(sheet_id: str) -> pd.DataFrame: return n.join(d.drop(columns=drop_from_d), how="outer") +def _deflate_new_to_ref( + joined: pd.DataFrame, source_year: int, ref_year: int +) -> pd.DataFrame: + """Add ``D_new_ref`` / ``N_new_ref`` columns deflated to ``ref_year`` dollars. + + Each diagnostics cell is run with ``model_base_year=source_year``, so + ``D_new`` / ``N_new`` are denominated in ``source_year`` dollars. Time-series + plots over years require a common dollar reference; this multiplies by the + same per-sector price ratio used for baseline alignment. + """ + if source_year == ref_year: + if "D_new" in joined.columns: + joined["D_new_ref"] = joined["D_new"] + if "N_new" in joined.columns: + joined["N_new_ref"] = joined["N_new"] + return joined + for new_col, ref_col in (("D_new", "D_new_ref"), ("N_new", "N_new_ref")): + if new_col not in joined.columns: + continue + col_series = ta.cast("pd.Series", joined[new_col]).astype(float) + joined[ref_col] = inflation_adjust_ef_denom_to_new_base_year( + old_ef_vector=col_series, + new_base_year=ref_year, + old_base_year=source_year, + ) + return joined + + def _summarize(joined: pd.DataFrame, approach: str) -> pd.Series: n_perc = joined["N_perc_diff"].abs() d_perc = joined["D_perc_diff"].abs() @@ -130,8 +169,10 @@ def _scatter_coords(joined: pd.DataFrame, approach: str, baseline: str) -> pd.Da rows.append(chunk) if not rows: return pd.DataFrame() - return pd.concat(rows, ignore_index=True)[ - ["approach", "baseline", "ef_kind", "sector", "x_baseline", "y_approach"] + combined = ta.cast("pd.DataFrame", pd.concat(rows, ignore_index=True)) + return combined.loc[ + :, + ["approach", "baseline", "ef_kind", "sector", "x_baseline", "y_approach"], ] @@ -172,8 +213,14 @@ def main() -> None: approach = str(row["approach"]) baseline = str(row["baseline"]) sheet_id = str(row["sheet_id"]) - scenario = str(row["scenario"]) if pd.notna(row["scenario"]) else "" - year = str(row["year"]) if pd.notna(row["year"]) else "" + scenario = ( + str(row["scenario"]) + if ta.cast(bool, pd.notna(row["scenario"])) + else "" + ) + year = ( + str(row["year"]) if ta.cast(bool, pd.notna(row["year"])) else "" + ) cell_label = ", ".join( f"{k}={v}" for k, v in ( @@ -189,6 +236,10 @@ def main() -> None: if joined.empty: logger.warning("%s returned empty data; skipping", cell_label) continue + if year: + joined = _deflate_new_to_ref( + joined, source_year=int(year), ref_year=REFERENCE_DOLLAR_YEAR + ) # Build a deterministic 31-char-bounded tab name including any # populated scenario/year prefix. prefix = "_".join(p for p in (scenario, year) if p) From 0dc341892ed313d5d8c902cf9a381af084f07566 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 19:08:14 -0700 Subject: [PATCH 09/25] fix(diagnostics): retry _busy_count on transient gh subprocess failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dispatcher previously crashed mid-run when `gh run list` returned non-zero exit (transient API hiccup mid-batch). Now retries 3× per status with a 5s backoff and falls back to a "still busy" sentinel so the poll loop keeps spinning instead of unwinding the dispatch and losing the queue. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../dispatch_ef_time_series.py | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py index e13fdd48..fa0fec6c 100644 --- a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py +++ b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py @@ -161,28 +161,48 @@ def _trigger_workflow( def _busy_count(workflow: str = "generate_diagnostics") -> int: - """Number of `queued` + `in_progress` runs of the named workflow.""" + """Number of `queued` + `in_progress` runs of the named workflow. + + Retries each ``gh run list`` call on transient subprocess failures + (e.g. GitHub API hiccups). After exhausted retries, returns ``1`` to + signal "still busy" so the caller keeps polling rather than dispatching + blindly into an unknown queue state. + """ count = 0 for status in ("queued", "in_progress"): - result = subprocess.run( - [ - "gh", - "run", - "list", - "--workflow", - f"{workflow}.yml", - "--status", - status, - "--limit", - "20", - "--json", - "databaseId", - ], - capture_output=True, - text=True, - check=True, - ) - count += len(json.loads(result.stdout)) + for attempt in range(3): + try: + result = subprocess.run( + [ + "gh", + "run", + "list", + "--workflow", + f"{workflow}.yml", + "--status", + status, + "--limit", + "20", + "--json", + "databaseId", + ], + capture_output=True, + text=True, + check=True, + ) + count += len(json.loads(result.stdout)) + break + except subprocess.CalledProcessError as e: + stderr = (e.stderr or "").strip() + if attempt == 2: + logger.warning( + "gh run list failed for status=%s after 3 attempts: %s; " + "treating as busy and continuing poll loop", + status, + stderr or "(no stderr)", + ) + return 1 + time.sleep(5) return count From c0dde7432920e77616b3c563c6b1ba4885e8f812 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 22:11:24 -0700 Subject: [PATCH 10/25] feat(analysis): N time-series stability comparison across A-matrix methods --- .../compare_method_stability.py | 418 ++++++++++++++++++ .../compile_ef_diagnostics.py | 4 +- 2 files changed, 421 insertions(+), 1 deletion(-) create mode 100644 bedrock/analysis/a_matrix_time_series/compare_method_stability.py diff --git a/bedrock/analysis/a_matrix_time_series/compare_method_stability.py b/bedrock/analysis/a_matrix_time_series/compare_method_stability.py new file mode 100644 index 00000000..1b2a6f61 --- /dev/null +++ b/bedrock/analysis/a_matrix_time_series/compare_method_stability.py @@ -0,0 +1,418 @@ +"""Compare year-over-year stability of N across 3 A-matrix methods. + +Reads the per-pair tabs in ``ef_comparison.xlsx`` (produced by +``compile_ef_diagnostics.py`` after dispatching the time-series cells), +computes per-sector year-over-year (YoY) changes in ``N_new_ref`` (deflated +to 2023$), and rolls up to per-approach metrics. + +The ``useeio`` approach is excluded — it pins A to the 2017 detail benchmark +with no temporal scaling, so its N time series reflects only B/x drift and +does not represent a comparable method here. + +Per-approach metrics: +- ``mean_abs_yoy_pct`` — average |YoY %| across the 4 transitions + (2019→20, 20→21, 21→22, 22→23). The headline stability metric. +- ``max_abs_yoy_pct`` — biggest single-year swing (tail). +- ``total_drift_pct`` — ``N_2023 / N_2019 - 1``. End-to-end shift. + +Each metric is rolled up three ways: median (typical sector), p95 (tail), +and emissions-weighted (by ``mean_N``, the metric to optimize). + +Outputs: +- ``output/results/n_yoy_ranking.csv`` +- ``output/results/n_yoy_per_sector.csv`` +- ``output/plots/n_indexed_lines.png`` — top-K sectors, N indexed to + year-2019 = 100, faceted by method +- ``output/plots/n_yoy_distribution.png`` — boxplot of |YoY %| + distributions per method + +Usage: + python -m bedrock.analysis.a_matrix_time_series.compare_method_stability +""" + +from __future__ import annotations + +import logging +import re +import typing as ta +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd + +from bedrock.analysis.a_matrix_time_series.constants import ( + PLOTS_DIR, + RESULTS_DIR, +) + +logger = logging.getLogger(__name__) + +EF_COMPARISON_XLSX_PATH = RESULTS_DIR / "ef_comparison.xlsx" +YOY_RANKING_PATH = RESULTS_DIR / "n_yoy_ranking.csv" +YOY_PER_SECTOR_PATH = RESULTS_DIR / "n_yoy_per_sector.csv" +INDEXED_LINES_PLOT_PATH = PLOTS_DIR / "n_indexed_lines.png" +YOY_DISTRIBUTION_PLOT_PATH = PLOTS_DIR / "n_yoy_distribution.png" + +# `compile_ef_diagnostics.py` keys per-pair tabs as +# `{scenario}_{year}.0_{approach}__vs_{baseline}` truncated to 31 chars. +TAB_RE = re.compile( + r"^(?P[a-z0-9_]+?)_(?P\d{4})(?:\.0)?_(?P.+)$" +) +APPROACH_PREFIXES: tuple[tuple[str, str], ...] = ( + ("commodity_pr", "commodity_price_index"), + ("industry_pri", "industry_price_index"), + ("summary_tabl", "summary_tables"), + ("useeio", "useeio"), +) + +EXCLUDED_APPROACHES: frozenset[str] = frozenset({"useeio"}) + +YEARS: tuple[int, ...] = (2019, 2020, 2021, 2022, 2023) +YOY_TRANSITIONS: tuple[tuple[int, int], ...] = tuple( + (YEARS[i], YEARS[i + 1]) for i in range(len(YEARS) - 1) +) + +# Drop sectors with mean N below this percentile from non-weighted metrics +# to avoid YoY % blow-up from numerical noise on near-zero means. +MIN_MEAN_PERCENTILE = 5 + +# Cumulative-share threshold for the indexed line plot: include the smallest +# set of sectors whose cumulative |mean_N| reaches this fraction of the total. +# These are the lines that actually move corporate-footprint outcomes. +LINE_PLOT_CUMULATIVE_SHARE = 0.30 +# Hard ceiling so the plot stays readable even if the head is very long-tailed. +LINE_PLOT_MAX_SECTORS = 8 + + +def _parse_tab(tab: str) -> tuple[str, int, str] | None: + """Return ``(scenario, year, approach)`` for a time-series tab, else None.""" + m = TAB_RE.match(tab) + if m is None: + return None + rest = m.group("rest") + for prefix, approach in APPROACH_PREFIXES: + if rest.startswith(prefix): + return m.group("scenario"), int(m.group("year")), approach + return None + + +def _read_panel(xlsx_path: Path) -> pd.DataFrame: + """Long-format panel: ``(scenario, approach, year, sector, N_new_ref)``. + + Excludes the approaches in ``EXCLUDED_APPROACHES``. + """ + if not xlsx_path.exists(): + raise FileNotFoundError( + f"{xlsx_path} not found — run compile_ef_diagnostics.py first." + ) + xls = pd.ExcelFile(xlsx_path) + rows: list[pd.DataFrame] = [] + for tab in xls.sheet_names: + parsed = _parse_tab(tab) + if parsed is None: + continue + scenario, year, approach = parsed + if approach in EXCLUDED_APPROACHES: + continue + df = pd.read_excel(xls, sheet_name=tab) + if "N_new_ref" not in df.columns: + logger.warning( + "Tab %r missing N_new_ref — re-run compile after the deflation " + "step was added.", + tab, + ) + continue + sector_col = df.columns[0] + chunk = pd.DataFrame( + { + "scenario": scenario, + "approach": approach, + "year": year, + "sector": df[sector_col].astype(str), + "N_new_ref": pd.to_numeric(df["N_new_ref"], errors="coerce"), + } + ) + rows.append(chunk) + if not rows: + raise RuntimeError( + f"No time-series tabs found in {xlsx_path}; verify compile output." + ) + return pd.concat(rows, ignore_index=True) + + +def _yoy_per_sector(panel: pd.DataFrame) -> pd.DataFrame: + """Per ``(approach, sector)``: per-year N + YoY %s + aggregates.""" + wide = panel.pivot_table( + index=["approach", "sector"], + columns="year", + values="N_new_ref", + aggfunc="first", + ) + # Make sure every year-column we expect exists (NaN if a cell missing). + for y in YEARS: + if y not in wide.columns: + wide[y] = np.nan + wide = ta.cast("pd.DataFrame", wide[list(YEARS)]) + wide.columns = pd.Index([f"N_{y}" for y in YEARS]) + wide = wide.reset_index() + + # YoY % change for each transition. + yoy_cols: list[str] = [] + for y0, y1 in YOY_TRANSITIONS: + col = f"yoy_{y0}_{y1}" + prev = wide[f"N_{y0}"] + curr = wide[f"N_{y1}"] + wide[col] = (curr - prev) / prev.abs() + yoy_cols.append(col) + + abs_yoy = wide[yoy_cols].abs() + wide["mean_abs_yoy_pct"] = abs_yoy.mean(axis=1) + wide["max_abs_yoy_pct"] = abs_yoy.max(axis=1) + wide["total_drift_pct"] = ( + wide[f"N_{YEARS[-1]}"] - wide[f"N_{YEARS[0]}"] + ) / wide[f"N_{YEARS[0]}"].abs() + wide["abs_total_drift_pct"] = wide["total_drift_pct"].abs() + wide["mean_N"] = wide[[f"N_{y}" for y in YEARS]].mean(axis=1) + return wide + + +def _aggregate(per_sector: pd.DataFrame) -> pd.DataFrame: + """Per approach: median / p95 / emissions-weighted of each YoY metric.""" + metrics = ("mean_abs_yoy_pct", "max_abs_yoy_pct", "abs_total_drift_pct") + rows: list[dict[str, object]] = [] + for approach in sorted(per_sector["approach"].unique()): + grp = ta.cast( + "pd.DataFrame", per_sector[per_sector["approach"] == approach] + ) + cutoff = grp["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) + big = ta.cast("pd.DataFrame", grp[grp["mean_N"].abs() >= cutoff]) + weights = big["mean_N"].abs() + row: dict[str, object] = { + "approach": approach, + "n_sectors": int(len(grp)), + } + for metric in metrics: + values = big[metric] + row[f"{metric}__median"] = float(values.median()) + row[f"{metric}__p95"] = float(values.quantile(0.95)) + row[f"{metric}__weighted"] = float( + (values * weights).sum() / weights.sum() + if weights.sum() > 0 + else np.nan + ) + rows.append(row) + cols = ["approach", "n_sectors"] + [ + f"{m}__{r}" for m in metrics for r in ("median", "p95", "weighted") + ] + ranking = pd.DataFrame(rows, columns=pd.Index(cols)) + return ranking.sort_values("mean_abs_yoy_pct__weighted").reset_index(drop=True) + + +def _select_head_sectors( + per_sector: pd.DataFrame, + cumulative_share: float = LINE_PLOT_CUMULATIVE_SHARE, + max_sectors: int = LINE_PLOT_MAX_SECTORS, +) -> list[str]: + """Return the smallest set of sectors covering ``cumulative_share`` of total |mean_N|. + + Across approaches, take the per-sector ``|mean_N|`` averaged over methods, + sort descending, and accumulate until coverage hits the threshold (capped + by ``max_sectors``). These are the lines that actually move + corporate-footprint outcomes. + """ + avg_abs_mean = ( + per_sector.groupby("sector")["mean_N"].mean().abs().sort_values(ascending=False) + ) + total = float(avg_abs_mean.sum()) + if total <= 0: + return list(avg_abs_mean.head(max_sectors).index) + cum = avg_abs_mean.cumsum() / total + head = avg_abs_mean[cum <= cumulative_share] + # Always include the next sector that pushes us across the threshold. + if len(head) < len(avg_abs_mean): + head = avg_abs_mean.iloc[: len(head) + 1] + return list(head.head(max_sectors).index) + + +def _indexed_lines_plot( + panel: pd.DataFrame, + per_sector: pd.DataFrame, + out_path: Path, +) -> None: + """Head-sector indexed (2019=100) line plot, faceted by method.""" + approaches = sorted(panel["approach"].unique()) + head_sectors = _select_head_sectors(per_sector) + head_share = ( + per_sector[per_sector["sector"].isin(head_sectors)] + .groupby("sector")["mean_N"] + .mean() + .abs() + .sum() + / per_sector.groupby("sector")["mean_N"].mean().abs().sum() + ) + cmap = plt.get_cmap("tab10") + color_by_sector = {s: cmap(i % 10) for i, s in enumerate(head_sectors)} + + n = len(approaches) + fig, axes = plt.subplots(1, n, figsize=(5 * n, 5.5), sharey=True) + if n == 1: + axes = np.array([axes]) + for ax, approach in zip(axes, approaches): + sub = ta.cast( + "pd.DataFrame", + panel[ + (panel["approach"] == approach) + & panel["sector"].isin(head_sectors) + ], + ) + for sector in head_sectors: + sg = ta.cast( + "pd.DataFrame", sub[sub["sector"] == sector] + ).sort_values("year") + if sg.empty or sg["year"].min() != YEARS[0]: + continue + base = sg.loc[sg["year"] == YEARS[0], "N_new_ref"].iloc[0] + if base == 0 or pd.isna(base): + continue + indexed = sg["N_new_ref"] / base * 100 + ax.plot( + sg["year"], + indexed, + marker="o", + label=sector, + color=color_by_sector[sector], + ) + ax.axhline(100, color="black", linestyle=":", linewidth=1, alpha=0.6) + ax.set_title(approach, fontsize=14) + ax.set_xlabel("Year") + ax.set_xticks(list(YEARS)) + ax.set_xticklabels([str(y) for y in YEARS]) + ax.grid(alpha=0.3) + axes[0].set_ylabel("N indexed (2019 = 100)") + handles, labels = axes[0].get_legend_handles_labels() + fig.legend( + handles, + labels, + loc="center right", + fontsize=8, + bbox_to_anchor=(1.05, 0.5), + title="sector", + ) + fig.suptitle( + f"Head sectors covering {head_share:.0%} of |mean_N| " + f"(n={len(head_sectors)}), N rebased to 2019=100, by A-matrix method", + fontsize=14, + ) + fig.tight_layout() + out_path.parent.mkdir(parents=True, exist_ok=True) + fig.savefig(out_path, dpi=120, bbox_inches="tight") + plt.close(fig) + + +def _yoy_distribution_plot( + per_sector: pd.DataFrame, out_path: Path +) -> None: + """Boxplot of per-sector |YoY %| distributions, one box per (method, transition).""" + approaches = sorted(per_sector["approach"].unique()) + cutoff = per_sector["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) + big = ta.cast( + "pd.DataFrame", per_sector[per_sector["mean_N"].abs() >= cutoff] + ) + + fig, axes = plt.subplots(1, 2, figsize=(14, 5.5)) + # Left: boxplot of mean_abs_yoy_pct per method. + ax = axes[0] + data = [big.loc[big["approach"] == a, "mean_abs_yoy_pct"].dropna() for a in approaches] + ax.boxplot(data, tick_labels=approaches, showfliers=False) + ax.set_title("Per-sector mean |YoY %|", fontsize=13) + ax.set_ylabel("|YoY %| (lower = more stable)") + ax.grid(axis="y", alpha=0.3) + + # Right: per-transition |YoY %|, grouped boxes per method. + ax = axes[1] + transition_labels = [f"{y0}→{y1}" for y0, y1 in YOY_TRANSITIONS] + n_methods = len(approaches) + width = 0.8 / n_methods + for i, approach in enumerate(approaches): + sub = big[big["approach"] == approach] + per_transition = [ + sub[f"yoy_{y0}_{y1}"].abs().dropna() for y0, y1 in YOY_TRANSITIONS + ] + positions = [j + (i - (n_methods - 1) / 2) * width for j in range(len(YOY_TRANSITIONS))] + bp = ax.boxplot( + per_transition, + positions=positions, + widths=width * 0.9, + patch_artist=True, + showfliers=False, + ) + color = plt.get_cmap("tab10")(i) + for patch in bp["boxes"]: + patch.set_facecolor(color) + patch.set_alpha(0.6) + ax.plot([], [], color=color, label=approach, linewidth=8, alpha=0.6) + ax.set_xticks(range(len(YOY_TRANSITIONS))) + ax.set_xticklabels(transition_labels) + ax.set_title("|YoY %| per transition, by method", fontsize=13) + ax.set_ylabel("|YoY %|") + ax.legend(loc="upper right", fontsize=9) + ax.grid(axis="y", alpha=0.3) + + fig.suptitle( + "Year-over-year fluctuation in N across A-matrix methods", fontsize=15 + ) + fig.tight_layout() + out_path.parent.mkdir(parents=True, exist_ok=True) + fig.savefig(out_path, dpi=120, bbox_inches="tight") + plt.close(fig) + + +def _print_summary(ranking: pd.DataFrame, per_sector: pd.DataFrame) -> None: + print("\n=== YoY stability ranking (lower = more stable) ===") + cols_show = [ + "approach", + "mean_abs_yoy_pct__weighted", + "mean_abs_yoy_pct__median", + "max_abs_yoy_pct__weighted", + "abs_total_drift_pct__weighted", + ] + print(ranking[cols_show].round(4).to_string(index=False)) + + print("\n=== Top-5 most-fluctuating big-N sectors per method ===") + cutoff = per_sector["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) + big = ta.cast( + "pd.DataFrame", per_sector[per_sector["mean_N"].abs() >= cutoff] + ) + for approach in sorted(big["approach"].unique()): + grp = ta.cast("pd.DataFrame", big[big["approach"] == approach]) + worst = ta.cast( + "pd.DataFrame", grp.nlargest(n=5, columns="mean_abs_yoy_pct") + )[["sector", "mean_N", "mean_abs_yoy_pct", "max_abs_yoy_pct", "total_drift_pct"]] + print(f"\n[{approach}]") + print(worst.round(4).to_string(index=False)) + + +def main() -> None: + panel = _read_panel(EF_COMPARISON_XLSX_PATH) + per_sector = _yoy_per_sector(panel) + ranking = _aggregate(per_sector) + + RESULTS_DIR.mkdir(parents=True, exist_ok=True) + PLOTS_DIR.mkdir(parents=True, exist_ok=True) + + ranking.to_csv(YOY_RANKING_PATH, index=False) + per_sector.to_csv(YOY_PER_SECTOR_PATH, index=False) + _indexed_lines_plot(panel, per_sector, INDEXED_LINES_PLOT_PATH) + _yoy_distribution_plot(per_sector, YOY_DISTRIBUTION_PLOT_PATH) + + _print_summary(ranking, per_sector) + print(f"\nWrote: {YOY_RANKING_PATH}") + print(f"Wrote: {YOY_PER_SECTOR_PATH}") + print(f"Wrote: {INDEXED_LINES_PLOT_PATH}") + print(f"Wrote: {YOY_DISTRIBUTION_PLOT_PATH}") + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO, format="%(message)s") + main() diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index 0b5a48d3..61b9a095 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -228,7 +228,9 @@ def main() -> None: continue if year: joined = _deflate_new_to_ref( - joined, source_year=int(year), ref_year=REFERENCE_DOLLAR_YEAR + joined, + source_year=int(float(year)), + ref_year=REFERENCE_DOLLAR_YEAR, ) # Build a deterministic 31-char-bounded tab name including any # populated scenario/year prefix. From 50931d07b5f1751176505f766db9789ce00841dc Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 22:26:22 -0700 Subject: [PATCH 11/25] fix(analysis): drop redundant ta.cast calls in compile script mypy flags ta.cast as redundant since pd.to_numeric/concat/__getitem__ return inferable types. The casts were added to placate Pyright, which isn't a CI check. Switching back to no-cast satisfies mypy + black; ruff unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../compile_ef_diagnostics.py | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index 72dec847..0b5a48d3 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -30,7 +30,6 @@ from __future__ import annotations import logging -import typing as ta import pandas as pd @@ -83,9 +82,7 @@ def _coerce_numeric(df: pd.DataFrame, cols: tuple[str, ...]) -> pd.DataFrame: s = df[col].astype(str).str.strip() is_pct = s.str.endswith("%") cleaned = s.str.rstrip("%").str.replace(",", "", regex=False) - numeric = ta.cast( - "pd.Series", pd.to_numeric(cleaned, errors="coerce") - ) + numeric = pd.to_numeric(cleaned, errors="coerce") df[col] = numeric.mask(is_pct, numeric / 100) return df @@ -123,9 +120,8 @@ def _deflate_new_to_ref( for new_col, ref_col in (("D_new", "D_new_ref"), ("N_new", "N_new_ref")): if new_col not in joined.columns: continue - col_series = ta.cast("pd.Series", joined[new_col]).astype(float) joined[ref_col] = inflation_adjust_ef_denom_to_new_base_year( - old_ef_vector=col_series, + old_ef_vector=joined[new_col].astype(float), new_base_year=ref_year, old_base_year=source_year, ) @@ -169,7 +165,7 @@ def _scatter_coords(joined: pd.DataFrame, approach: str, baseline: str) -> pd.Da rows.append(chunk) if not rows: return pd.DataFrame() - combined = ta.cast("pd.DataFrame", pd.concat(rows, ignore_index=True)) + combined = pd.concat(rows, ignore_index=True) return combined.loc[ :, ["approach", "baseline", "ef_kind", "sector", "x_baseline", "y_approach"], @@ -213,14 +209,8 @@ def main() -> None: approach = str(row["approach"]) baseline = str(row["baseline"]) sheet_id = str(row["sheet_id"]) - scenario = ( - str(row["scenario"]) - if ta.cast(bool, pd.notna(row["scenario"])) - else "" - ) - year = ( - str(row["year"]) if ta.cast(bool, pd.notna(row["year"])) else "" - ) + scenario = str(row["scenario"]) if pd.notna(row["scenario"]) else "" + year = str(row["year"]) if pd.notna(row["year"]) else "" cell_label = ", ".join( f"{k}={v}" for k, v in ( From d4c3d133c95c456e8550b2d23a665beab30c0bb8 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 22:28:24 -0700 Subject: [PATCH 12/25] fix(analysis): drop redundant ta.cast calls + coerce sheet_names to str - Removed 6 redundant casts that mypy flagged. The casts placated Pyright but mypy infers the same types without them. - pd.ExcelFile.sheet_names is typed as list[int|str]; explicitly str() the tab name before passing to _parse_tab and pd.read_excel. - Apply black formatting. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../compare_method_stability.py | 78 +++++++++---------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/bedrock/analysis/a_matrix_time_series/compare_method_stability.py b/bedrock/analysis/a_matrix_time_series/compare_method_stability.py index 1b2a6f61..a3cec72b 100644 --- a/bedrock/analysis/a_matrix_time_series/compare_method_stability.py +++ b/bedrock/analysis/a_matrix_time_series/compare_method_stability.py @@ -34,7 +34,6 @@ import logging import re -import typing as ta from pathlib import Path import matplotlib.pyplot as plt @@ -56,9 +55,7 @@ # `compile_ef_diagnostics.py` keys per-pair tabs as # `{scenario}_{year}.0_{approach}__vs_{baseline}` truncated to 31 chars. -TAB_RE = re.compile( - r"^(?P[a-z0-9_]+?)_(?P\d{4})(?:\.0)?_(?P.+)$" -) +TAB_RE = re.compile(r"^(?P[a-z0-9_]+?)_(?P\d{4})(?:\.0)?_(?P.+)$") APPROACH_PREFIXES: tuple[tuple[str, str], ...] = ( ("commodity_pr", "commodity_price_index"), ("industry_pri", "industry_price_index"), @@ -109,18 +106,19 @@ def _read_panel(xlsx_path: Path) -> pd.DataFrame: xls = pd.ExcelFile(xlsx_path) rows: list[pd.DataFrame] = [] for tab in xls.sheet_names: - parsed = _parse_tab(tab) + tab_str = str(tab) + parsed = _parse_tab(tab_str) if parsed is None: continue scenario, year, approach = parsed if approach in EXCLUDED_APPROACHES: continue - df = pd.read_excel(xls, sheet_name=tab) + df = pd.read_excel(xls, sheet_name=tab_str) if "N_new_ref" not in df.columns: logger.warning( "Tab %r missing N_new_ref — re-run compile after the deflation " "step was added.", - tab, + tab_str, ) continue sector_col = df.columns[0] @@ -153,7 +151,7 @@ def _yoy_per_sector(panel: pd.DataFrame) -> pd.DataFrame: for y in YEARS: if y not in wide.columns: wide[y] = np.nan - wide = ta.cast("pd.DataFrame", wide[list(YEARS)]) + wide = wide[list(YEARS)] wide.columns = pd.Index([f"N_{y}" for y in YEARS]) wide = wide.reset_index() @@ -169,9 +167,9 @@ def _yoy_per_sector(panel: pd.DataFrame) -> pd.DataFrame: abs_yoy = wide[yoy_cols].abs() wide["mean_abs_yoy_pct"] = abs_yoy.mean(axis=1) wide["max_abs_yoy_pct"] = abs_yoy.max(axis=1) - wide["total_drift_pct"] = ( - wide[f"N_{YEARS[-1]}"] - wide[f"N_{YEARS[0]}"] - ) / wide[f"N_{YEARS[0]}"].abs() + wide["total_drift_pct"] = (wide[f"N_{YEARS[-1]}"] - wide[f"N_{YEARS[0]}"]) / wide[ + f"N_{YEARS[0]}" + ].abs() wide["abs_total_drift_pct"] = wide["total_drift_pct"].abs() wide["mean_N"] = wide[[f"N_{y}" for y in YEARS]].mean(axis=1) return wide @@ -182,11 +180,9 @@ def _aggregate(per_sector: pd.DataFrame) -> pd.DataFrame: metrics = ("mean_abs_yoy_pct", "max_abs_yoy_pct", "abs_total_drift_pct") rows: list[dict[str, object]] = [] for approach in sorted(per_sector["approach"].unique()): - grp = ta.cast( - "pd.DataFrame", per_sector[per_sector["approach"] == approach] - ) + grp = per_sector[per_sector["approach"] == approach] cutoff = grp["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) - big = ta.cast("pd.DataFrame", grp[grp["mean_N"].abs() >= cutoff]) + big = grp[grp["mean_N"].abs() >= cutoff] weights = big["mean_N"].abs() row: dict[str, object] = { "approach": approach, @@ -259,17 +255,11 @@ def _indexed_lines_plot( if n == 1: axes = np.array([axes]) for ax, approach in zip(axes, approaches): - sub = ta.cast( - "pd.DataFrame", - panel[ - (panel["approach"] == approach) - & panel["sector"].isin(head_sectors) - ], - ) + sub = panel[ + (panel["approach"] == approach) & panel["sector"].isin(head_sectors) + ] for sector in head_sectors: - sg = ta.cast( - "pd.DataFrame", sub[sub["sector"] == sector] - ).sort_values("year") + sg = sub[sub["sector"] == sector].sort_values("year") if sg.empty or sg["year"].min() != YEARS[0]: continue base = sg.loc[sg["year"] == YEARS[0], "N_new_ref"].iloc[0] @@ -310,20 +300,18 @@ def _indexed_lines_plot( plt.close(fig) -def _yoy_distribution_plot( - per_sector: pd.DataFrame, out_path: Path -) -> None: +def _yoy_distribution_plot(per_sector: pd.DataFrame, out_path: Path) -> None: """Boxplot of per-sector |YoY %| distributions, one box per (method, transition).""" approaches = sorted(per_sector["approach"].unique()) cutoff = per_sector["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) - big = ta.cast( - "pd.DataFrame", per_sector[per_sector["mean_N"].abs() >= cutoff] - ) + big = per_sector[per_sector["mean_N"].abs() >= cutoff] fig, axes = plt.subplots(1, 2, figsize=(14, 5.5)) # Left: boxplot of mean_abs_yoy_pct per method. ax = axes[0] - data = [big.loc[big["approach"] == a, "mean_abs_yoy_pct"].dropna() for a in approaches] + data = [ + big.loc[big["approach"] == a, "mean_abs_yoy_pct"].dropna() for a in approaches + ] ax.boxplot(data, tick_labels=approaches, showfliers=False) ax.set_title("Per-sector mean |YoY %|", fontsize=13) ax.set_ylabel("|YoY %| (lower = more stable)") @@ -339,7 +327,9 @@ def _yoy_distribution_plot( per_transition = [ sub[f"yoy_{y0}_{y1}"].abs().dropna() for y0, y1 in YOY_TRANSITIONS ] - positions = [j + (i - (n_methods - 1) / 2) * width for j in range(len(YOY_TRANSITIONS))] + positions = [ + j + (i - (n_methods - 1) / 2) * width for j in range(len(YOY_TRANSITIONS)) + ] bp = ax.boxplot( per_transition, positions=positions, @@ -359,9 +349,7 @@ def _yoy_distribution_plot( ax.legend(loc="upper right", fontsize=9) ax.grid(axis="y", alpha=0.3) - fig.suptitle( - "Year-over-year fluctuation in N across A-matrix methods", fontsize=15 - ) + fig.suptitle("Year-over-year fluctuation in N across A-matrix methods", fontsize=15) fig.tight_layout() out_path.parent.mkdir(parents=True, exist_ok=True) fig.savefig(out_path, dpi=120, bbox_inches="tight") @@ -381,14 +369,18 @@ def _print_summary(ranking: pd.DataFrame, per_sector: pd.DataFrame) -> None: print("\n=== Top-5 most-fluctuating big-N sectors per method ===") cutoff = per_sector["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) - big = ta.cast( - "pd.DataFrame", per_sector[per_sector["mean_N"].abs() >= cutoff] - ) + big = per_sector[per_sector["mean_N"].abs() >= cutoff] for approach in sorted(big["approach"].unique()): - grp = ta.cast("pd.DataFrame", big[big["approach"] == approach]) - worst = ta.cast( - "pd.DataFrame", grp.nlargest(n=5, columns="mean_abs_yoy_pct") - )[["sector", "mean_N", "mean_abs_yoy_pct", "max_abs_yoy_pct", "total_drift_pct"]] + grp = big[big["approach"] == approach] + worst = grp.nlargest(n=5, columns="mean_abs_yoy_pct")[ + [ + "sector", + "mean_N", + "mean_abs_yoy_pct", + "max_abs_yoy_pct", + "total_drift_pct", + ] + ] print(f"\n[{approach}]") print(worst.round(4).to_string(index=False)) From 24544a19586f0328861f087157d27b32bce3ebde Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 10:30:41 -0700 Subject: [PATCH 13/25] =?UTF-8?q?feat(analysis):=20step=206=20phase=202/3?= =?UTF-8?q?=20=E2=80=94=20EF=20diagnostics=20compile=20+=20plot=20scripts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- .../compile_ef_diagnostics.py | 219 ++++++++++++++++ .../output/plots/keysector_impact_heatmap.png | Bin 235631 -> 0 bytes .../output/plots/summary_a_rmse_ranking.png | Bin 51605 -> 0 bytes .../plot_ef_diagnostics.py | 248 ++++++++++++++++++ 4 files changed, 467 insertions(+) create mode 100644 bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py delete mode 100644 bedrock/analysis/a_matrix_time_series/output/plots/keysector_impact_heatmap.png delete mode 100644 bedrock/analysis/a_matrix_time_series/output/plots/summary_a_rmse_ranking.png create mode 100644 bedrock/analysis/a_matrix_time_series/plot_ef_diagnostics.py diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py new file mode 100644 index 00000000..0602058e --- /dev/null +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -0,0 +1,219 @@ +"""Compile per-(approach, baseline) EF diagnostics Sheets into one workbook. + +Step 6 / Phase 2 of epic #337. Reads ``output/results/ef_run_index.csv`` for +the ``(approach, baseline, sheet_id)`` triples, pulls the EF diff tabs from +each Sheet, and produces: + +- ``output/results/ef_comparison.xlsx``: + - One tab per ``(approach, baseline)`` carrying the full ``N_and_diffs`` + joined with ``D_and_diffs``. + - ``summary_vs_useeio`` and ``summary_vs_ceda``: per-approach roll-up + with p50 / p95 / max of ``|N_perc_diff|`` and ``|D_perc_diff|``, plus + ``n_significant`` (sectors where the percent diff exceeds + ``SIGNIFICANT_PCT_THRESHOLD``). +- ``output/results/ef_scatter_coords.parquet``: long-format coordinates + ``(approach, baseline, ef_kind, sector, x_baseline, y_approach)`` for the + Phase 3 scatter plots. ``x_baseline`` is ``*_old_inflated`` (the + baseline's EF, inflation-adjusted to the candidate's base year) and + ``y_approach`` is ``*_new``. +- ``ef_summary_vs_useeio`` and ``ef_summary_vs_ceda`` tabs appended to the + run-report Sheet (sheet ID from ``last_run_sheet_id.txt``, written by + Step 1). Skipped with a warning if that file is missing. + +The compile script reads only ``sheet_id`` from ``ef_run_index.csv``; +``run_id``, ``useeio_box_ticked`` and ``triggered_at`` are audit-only. + +Usage: + python -m bedrock.analysis.a_matrix_time_series.compile_ef_diagnostics +""" + +from __future__ import annotations + +import logging + +import pandas as pd + +from bedrock.analysis.a_matrix_time_series.constants import ( + LAST_RUN_SHEET_ID_PATH, + PLOTS_DIR, + RESULTS_DIR, +) +from bedrock.utils.io.gcp import read_sheet_tab, update_sheet_tab + +logger = logging.getLogger(__name__) + +EF_RUN_INDEX_PATH = RESULTS_DIR / "ef_run_index.csv" +EF_COMPARISON_XLSX_PATH = RESULTS_DIR / "ef_comparison.xlsx" +EF_SCATTER_COORDS_PATH = RESULTS_DIR / "ef_scatter_coords.parquet" + +# A row counts as "significantly different" when |perc_diff| exceeds this. +SIGNIFICANT_PCT_THRESHOLD = 0.10 + +# Tab names produced by `calculate_ef_diagnostics.py` per run. Both +# baseline modes (CEDA-only and USEEIO-checked) emit identical column +# headers — confirmed via spot-check. +TAB_N = "N_and_diffs" +TAB_D = "D_and_diffs" + +# Numeric columns to coerce after `read_sheet_tab` (which returns all str). +_N_NUMERIC_COLS = ("N_new", "N_old", "N_old_inflated", "N_perc_diff") +_D_NUMERIC_COLS = ("D_new", "D_old", "D_old_inflated", "D_perc_diff") + + +def _coerce_numeric(df: pd.DataFrame, cols: tuple[str, ...]) -> pd.DataFrame: + """Coerce string columns to numeric, handling percent-formatted cells. + + Sheets returns formatted display values by default, so a column with + percent cell formatting comes back like ``"0.23%"`` even though the + underlying value is the fraction ``0.0023``. Strip the suffix and + divide by 100; raw-float columns pass through unchanged. + """ + for col in cols: + if col not in df.columns: + continue + s = df[col].astype(str).str.strip() + is_pct = s.str.endswith("%") + cleaned = s.str.rstrip("%").str.replace(",", "", regex=False) + numeric = pd.to_numeric(cleaned, errors="coerce") + df[col] = numeric.mask(is_pct, numeric / 100) + return df + + +def _read_pair(sheet_id: str) -> pd.DataFrame: + """Return ``N_and_diffs`` joined with ``D_and_diffs`` on the sector index.""" + n = _coerce_numeric(read_sheet_tab(sheet_id, TAB_N), _N_NUMERIC_COLS) + d = _coerce_numeric(read_sheet_tab(sheet_id, TAB_D), _D_NUMERIC_COLS) + # Both tabs come back with the sector code as the first column; align on it. + sector_col = n.columns[0] + n = n.set_index(sector_col) + d = d.set_index(sector_col) + # `sector_name` and `comparison_type` are duplicated across N and D — keep + # them from N only. + drop_from_d = [c for c in ("sector_name", "comparison_type") if c in d.columns] + return n.join(d.drop(columns=drop_from_d), how="outer") + + +def _summarize(joined: pd.DataFrame, approach: str) -> pd.Series: + n_perc = joined["N_perc_diff"].abs() + d_perc = joined["D_perc_diff"].abs() + return pd.Series( + { + "approach": approach, + "n_sectors": int(joined.shape[0]), + "N_p50": float(n_perc.quantile(0.50)), + "N_p95": float(n_perc.quantile(0.95)), + "N_max": float(n_perc.max()), + "N_n_significant": int((n_perc > SIGNIFICANT_PCT_THRESHOLD).sum()), + "D_p50": float(d_perc.quantile(0.50)), + "D_p95": float(d_perc.quantile(0.95)), + "D_max": float(d_perc.max()), + "D_n_significant": int((d_perc > SIGNIFICANT_PCT_THRESHOLD).sum()), + } + ) + + +def _scatter_coords(joined: pd.DataFrame, approach: str, baseline: str) -> pd.DataFrame: + """Long-format `(approach, baseline, ef_kind, sector, x_baseline, y_approach)`.""" + rows: list[pd.DataFrame] = [] + for kind, new_col, old_col in ( + ("N", "N_new", "N_old_inflated"), + ("D", "D_new", "D_old_inflated"), + ): + if new_col not in joined.columns or old_col not in joined.columns: + continue + chunk = joined[[new_col, old_col]].dropna().copy() + chunk.columns = pd.Index(["y_approach", "x_baseline"]) + chunk = chunk.reset_index().rename(columns={chunk.index.name: "sector"}) + chunk["approach"] = approach + chunk["baseline"] = baseline + chunk["ef_kind"] = kind + rows.append(chunk) + if not rows: + return pd.DataFrame() + return pd.concat(rows, ignore_index=True)[ + ["approach", "baseline", "ef_kind", "sector", "x_baseline", "y_approach"] + ] + + +def main() -> None: + RESULTS_DIR.mkdir(parents=True, exist_ok=True) + PLOTS_DIR.mkdir(parents=True, exist_ok=True) + + if not EF_RUN_INDEX_PATH.exists(): + raise FileNotFoundError( + f"{EF_RUN_INDEX_PATH} not found — populate it by hand from the " + "Phase 1 diagnostics runs (one row per (approach, baseline) " + "Sheet)." + ) + index_df = pd.read_csv(EF_RUN_INDEX_PATH) + required = {"approach", "baseline", "sheet_id"} + missing = required - set(index_df.columns) + if missing: + raise ValueError(f"{EF_RUN_INDEX_PATH} missing columns: {sorted(missing)}") + + summaries_by_baseline: dict[str, list[pd.Series]] = {} + scatter_chunks: list[pd.DataFrame] = [] + per_pair_tables: dict[str, pd.DataFrame] = {} + + for _, row in index_df.iterrows(): + approach = str(row["approach"]) + baseline = str(row["baseline"]) + sheet_id = str(row["sheet_id"]) + logger.info("Pulling tabs for approach=%s baseline=%s", approach, baseline) + joined = _read_pair(sheet_id) + if joined.empty: + logger.warning( + "approach=%s baseline=%s returned empty data; skipping", + approach, + baseline, + ) + continue + per_pair_tables[f"{approach}__vs_{baseline}"] = joined.reset_index() + summaries_by_baseline.setdefault(baseline, []).append( + _summarize(joined, approach) + ) + scatter_chunks.append(_scatter_coords(joined, approach, baseline)) + + summaries: dict[str, pd.DataFrame] = { + baseline: pd.DataFrame(rows).set_index("approach") + for baseline, rows in summaries_by_baseline.items() + } + + with pd.ExcelWriter(EF_COMPARISON_XLSX_PATH, engine="openpyxl") as writer: + for baseline, summary in summaries.items(): + summary.reset_index().to_excel( + writer, sheet_name=f"summary_vs_{baseline}", index=False + ) + for tab, df in per_pair_tables.items(): + df.to_excel(writer, sheet_name=tab[:31], index=False) + logger.info("Wrote %s", EF_COMPARISON_XLSX_PATH) + + if scatter_chunks: + all_coords = pd.concat(scatter_chunks, ignore_index=True) + all_coords.to_parquet(EF_SCATTER_COORDS_PATH) + logger.info("Wrote %s (%d rows)", EF_SCATTER_COORDS_PATH, len(all_coords)) + + if LAST_RUN_SHEET_ID_PATH.exists(): + run_sheet_id = LAST_RUN_SHEET_ID_PATH.read_text().strip() + for baseline, summary in summaries.items(): + update_sheet_tab( + run_sheet_id, + f"ef_summary_vs_{baseline}", + summary.reset_index(), + clean_nans=True, + ) + logger.info("Appended ef_summary_vs_* tabs to run Sheet %s", run_sheet_id) + else: + logger.warning( + "%s not found — skipping run-report Sheet upload", + LAST_RUN_SHEET_ID_PATH, + ) + + for baseline, summary in summaries.items(): + print(f"\n=== summary_vs_{baseline} ===") + print(summary.round(4).to_string()) + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO, format="%(message)s") + main() diff --git a/bedrock/analysis/a_matrix_time_series/output/plots/keysector_impact_heatmap.png b/bedrock/analysis/a_matrix_time_series/output/plots/keysector_impact_heatmap.png deleted file mode 100644 index 260046a55fb309ff296ab7d58a31d214508c27ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235631 zcmeFZhd0~r-#@Ne9aMFxqUhF|ts1RarB!P0O=)T-_7+OttuC~+YVS?#7!lfPY3&^n z5u*eVp-2$nd*yw9?(hBk2Y$bE?sI<5=}}E3uUxO|dOjcPnYa478l3EW>?|xSoSKi- z4Ov)@AXr$~ZXZ1i{^hPpku~@x@B7f)*U00!Z@^P;2#d~BUr%=rUw0RWi~bOA9~TeU z9f{kwB<_k`boTZ2^pTg8g#O?EA>rZeB>BzCuNOSaG0(>qJ}fLerjHwSt1eT#x(n6%-Bf=KcHkcfjlZ_m{&} z$1>&f|NRsAe#w*be|~y%lNIwnKfU;J`G3QMk7z*s3wHb#b-ihW@g+6^E9c$MtY6CFMht`t`W1S zHg5^tE_>dSLj7?@Z>+?m^fUTSz5BSswI_+kLoo~VlPoM3(VZ7aY~U^3UkcjWCgSz* z%ks%mf__5?@43zh!q6GEf?7PkjO(*{ynkx?J9Zw4WvbrdV7?>z#{JJX&QIM7-KvC6 zHjkf^uwD?fgKs7%(U)u9PL4_HXT9KXR*xGasqAg#mfND`S83q=y71Weo(eg|;*jM* zXptCOF3ei%O;>>Srrlc^$kpHiJCnAIK&`yHo7tzbKe5tC6jTUYwYL`}jh5GZdwB$< zkw^JrW*hXAtz3y+iiE}?p*|6wO3FJ6SLi#WigG{FsHSbj5uwoj(K3s;Ka1d$IK2Jf z2Hsv?NN3zPHm*Z`;dqgI+o?vu?ynwEtIxsNO;ljt)HWmXoJ$C5{_ z4}$l^qU(|@1*zWIB%!qL_I^MOhtID<7>r`apM2$=AS68&~Q1~wCv$?LMa0_jR@3<`8Sw&X;ol5G|V zdCi2@Jt(%;i>$srP_4AluO=~jZ9*z&ZajRSK|3^yd(BU?qzvso*39FG7Y2bi~8=c42$Oj1UBRt(_mH^u659b=jr0-1VrdT zeehYPbPS=XN}w2?mnVKbq1_!eUY*Z<)9^>#P59^&N%Yyf0ox zuFbrc#C9f#zAVtw;^$&aMpO5))uNg%#v=1$+#oyK3T$s!)t1DvK9gL-Ir(LM>9T44 zJ`KIJfXSdjdd9%cVu%4jRQ}v9krSem5w^1k<4ac=ruu3}<<4sJuF4LhgCAJi$I z0(>y397bR8sTHcrBm@x!FbA&O#NAB$BbFN(={kfhaGfprvij|a(AA@dGu}vlc=4L^ zC@nqyEHze7S*skQcW9?ogE;%RR^{yd#A2hu>wz`|&63GW zv5J2mk4-~;l`hFAMf1x^EXXigE1~hvJa19p=H5Fe=bqkJVw4#N*EGb+t`Hs^GMLC~&Z8`EmF2$2(W#(01*V)+5dWMI@TGqK<3qlFW z``(aX?l)z%*T*$igI}?8vu3VOz2v$chz5;urOwI&E%VK-b@%TR`^n&Ezdv7-Fhf|Y zlEzR0ltUD&>Svnvd<;R?nICVxg8u$FrX6=hBc=fydK96qwFOl5Hx$ZvO<{;F9R>Oe zEV-F6ORyU$F?o-xa@3fDcO^*%;6|;&(0#2vn_Ey-a1V@oET1w^6H`1-iBF zMDC+#c9dP%?pj9{&6UwiHONta+W?xg)XduFv#uT4WFxv-t68z(Pk|$o{_lLtN_yz{ z00Mkv`v=x;wmll}3p%A$B*qqO{;au9uq5`4&3>7;9Ul!tf)}!*CMfcIe(np_Sr{eI zVLbcqsX~VpdiiAC&(r?I>AkjTjbFhyLPNra3iV zz2~>H+QxN|=(sOCk_+mQSE`)H3A(L74a%SVZi^RV7miL{$$2lKRYy772M*D}p=Qv3 z3|d1rLbMhd219Ep59wnHna-_(rMBo`HaM3nVW+izqaUf;dHaG3UTvGO-+ia=5Y}OV zMi$NtJsq&MI^Ez;#x}N&T;CD(i(388F-xToDD&Aq z4;%J5hQm&~38fVFa_>2+uOG!+{~X*h-U1Jq3RwilDW)Oa4?#;*CEWSF*2blBsQ1cr zi*U1}SQY%s*gYe{kv(V$ba{Wmr}v&PY;$SEK;=q4dAX`Xki+uP{=Icj8Dem#0FQ~c zorH63aABpjA7>2ebNA%d>#fj)@HA;CcDSx%7Jea9ta(q+0niv%nK1$$fVo$gtXsda0OlqNBb82vK^UhM~%4^p`-E>yDPiJo#eC$Tu1U-EJ;c;uy>vY&Vk*%PquLo#Yuptjd zxZo=}c%CgxG}drTbZ4p%*j_%QWGV)EPh3l~o|yz&`F8_2Y{G#Ru&p4uS0qdYg>_<5 zkxIr9_gX-|nw{@XKC{s>%wALr!()3iNK^F=Ki}Q2ysy%yM4LE7QJVd5=lkJDdwX=s zeS7UL1hgnMAO{`*0Mub5ak$th?n1+4HRL_&QUwNdD|%*r*COiQSL_Ah69utG1b*2*?OV=c@H108QW9qGBnW>fJSU`aV`gU{b74ItO{Z5 zY_7=Qzk)tqOt&Es#b=q7nl-7~sV}2JPlYke25+XGfe95pYb~fHyI{Y+;y_`zn@u&2 zNlumaVYa6mi5WhsOT(7)KejNMU5KC{Ql1YU0GA6#58L{Un5a@lNRvoYjSrr(?qeqx z8gAKtePK-3HApo)@&#MxhQho*C%)7x?!w)WaqDShYE&f89_57VyO(W<6N395T4>K0@6sk{pD8m zUloVniWtWVDoq4C^Dl;&`f7{WHjlx1mK5{*-i#VtuUhW`1xVni^7V7^P0Q6?GoKv? zavnz5!=w3RCV~S=S(_t`xP6od@ zPz&?{v%!;+Y=d2@M|CpGS)Mg?i?Y?D=Un@uij|jIIJ%IzY`G6zB*H_n*Is-%!8FYmpz8j8DFm>OiMXYjRq<5f+2k&hvM8;-@CRbgxx*-!pHX8qo*{Ni9(_*{Y+t6U?aqe?z2P>#5{J-uLFY*F)ktjuA5 zTa7Mx0iI!|dT}u52SND(Mlzo+lMmI4(5$ezDs$&feplL;eloX&=d|DBezo)`yG_1} zr*B`p=+UxW5Mm>@;&)Kx-Y)dJ9dGvIPnRRI3L`h=@V-Wo>t+p>P1U_~qrYhE1&$K@dLFTiKl-L`A3 zZNIt$NO{Z_L)^aeE7nh-#I$^=U;ufXQ~P})E>&-Tk1Wp&f0$M;0$Zr#hc#SU-W~bf7Sf7ooDLM|5I*R4a(z_N`scNZ*|#O{ z)P2CBHZ5+bXnQwPv2GE4`+y2u(Iqk{S-l)#|5os~FK+)^$n|FHU-5G=F{SRUj5NCf z?c|9u_~iNVPtMEA9`Y*Dn4N{(*d{{w&SGKZtg1#%-{=@-Ci)c-@a+%$LROPubf}yy zd2K#Av+(uh8YvCXUT>XCw3_H^ zfzw|L=-JLXzH6V|6zbr!GwCX*>SuIRXJX^pkzDxaVSK43#5bNm3z(x8D{lXZd)jw} zFW~NAAo=Ea#Z71kUl+!WhYw{qyLJ7ctAvk3tuA&iTbkP3{yEX3l_9$zQ|C1h_?@p* zZWy$Nl`ya<ko2%Sc$*GZKfUn{7Jk%0x@h>j(ttNALrbT8=h6=D^lH0Ziv06^ov zptE<0#{|v{>`A_n-G2-aBsWz-p_s@&aQEk=|JKHk-kD~^T9nM|D(qLVfm8lKh8j(X z+5@!o_Rte@{uS*MUF}-Get!UvY^SzH_ocEWT6eumjS6GvXuH<1MAM9*`Q*yJ5P~D0 z$|UZ(Fguh0_}3$)a98($Xe)tU0Qwxj@A|iD@Ch*{Lnw8puW2<9TDRv@zkvOiv%O9{ z(vr(3?QH)q;&bs|9-9sWUHi^bb2A3L825lESb-;n3&HLFxfAsFncQeIbsgZJj6d5< zl)>{~D5DRh%2#4u<*-r+n@W_lQ(ls0zps9JvHjzI9l%*Qz|&4QD~Ig{1~`@iewe5b z01LQ+4{2r+wUh)=v%_d7fQ46_0JkqUEw?3=XHs1n>{|mn%2=~_tUXo7Txyp;VNJEDZd$lW(EP1mba9-$ zX5uRD<1k!2^_@fVI6Wou_T=s2&7+)%AYv?&t$f?w06@!+{==%p(Jybue5%T+PcRj* zF;dYjAb7ZqRc3PvD&AdE^i@8d9=o4?LSee7Euz;8uyVi5GfmLuUO^^>sm44}y#gl` zLDRzbwk4diPw;7ykH#Cyw-NzTUZRz^V7{{@Fox6>`mR&cCF|TU$_3k!pxgQ(N-Sy$ zNQbh%meJD5Y@gLyYvO`i)&e6cDq40r;ZZ@u&zoa-fh3?YmgRZX66WXsIGXa^nKUI( zA>WbpobmFEeazyuUL0P*5*)J0MWvx-vL72bEV*oqYCM^W*rg?I~rL0Bl33u z0Ze-=)e#K7vlxo#Whg$)#6-6`SI`UBSnp4(ce)>gLjkN(t+?sLN7v>(lhQJjO6Bg~WCejlS-7{Bq6J^mG2WL=~-JMtCoc?fOAFV+z%IS~2S_K`b~ zpK?rP-_+U|R@)h2sm<%^-hJG~b=_|bI+8pssYr&HN7hFZ*U{b7dp zA4fFwQ`}pBM2_ZAj3Ch-6Ac59k$NajcGafIdEjzASFVZL(T+@f=HP!e!&?EuB<*3t ztb)u{q~JiW3ckUUk_aDlY!- zet3vjZMt!gW`f??_g{wHm z+DGT~=m{Y6GA_*mjCGN-$U2v&*3{xrLi0$EC!6|N&p|ag#I@Q`@4VxQ!&&^4Po3D; zhl?H@9GcXl1VK1Nvi^c&*J%F*wy@al*Z^+2^(benGw-{-sQJtbE{%A@POEUp{p)@V zz3aBJb@C4a$=VQWv{be2YnKLSL28fYxb3HEtGLf~fn`wPMEa(>^?aUTzX_3@?HKwq zcE^USA@9HZr67|6@evh;|M~T)Sl+|rFg!nryd1^mki#xuu0BhNAUsv=xUoQY=sXx zmewQt__)mS4b%=|_FOhnXic!PSI_Bzq`c!b&f~7X^G|n8`fo~UwrMUOcCdW%TY0m- zG!OZ6Lppq53&-c<3j{}5Anwp602*C}9WB+am($%`lRu&O@ZH&CwNJu-Pv#-$Yv%2b zcjXXq>)Rb}$#G3OZIFNxog(9El`nUoaQwty0?>@v)OV2dshKyA{MQHugYoWQ_ zt9&j1@0Y}JOY}a%J}!m_5*kt=Kxz~#Z{`x% zDsi}1@pq8=l5xTqRVk5jmBJY49H-mq^-?w6mdd`I!>LT{*K6kQ8*GFlUgxbvj*8?8 zM(+`5ll;X)k&zoq)>lR7>E`{G9ln4g*z{xhGZhEJObYKaGRvo$s;kw61Wh(qGuB`8 zg8KL$3H|DKm3E&zjC8LJP#O;Qg(P?E5qEvB^w>Gz`uN?<pb}L=)aw!FFRj`s3h1FRTq6iCbxexEika`Zwi^yMpwNdE4cbmqFYr$whN3kuXF ziOTfEUDeFTv(17Wb$2T80hCER041l^vLX5(^$6EWral>pL{+>fs$Nx}4HE4d%Y9M4 zj}lG$9Vd+Y-D%~KFdc3D$cC3x{7|5IgHi0L3dQkLEFt-Ry4r}pb6rQ;t98044=8~n zYh;180i=oZB5~N&DY&(>1PH4d1pd7_C4;SckG%Cl`D%4+>?GZ9Prv`p1%}W(98+lG zvJw{|RkyicrZOaN`SG4_Xu$SjVdi(;b->CS{6)kqYmX{KQ#1Dnru~*g4)Xes>Kf3= zbk8wy63glAubK_1|8$-Q+G{;)^2nr)P56A#Z%}!a2Y_Wd!gU__$aK;F)s$f98)gcZV*nA`D$liVLl*y z*H=Sa54Q||yKfQ5{>zOp2b{ARH4{)%ISoo0=)gjKA6 z{r!vHYg&0@;+`iUY^vnTGDS8a$t||OSAibH_@d=U8q~WGUKYMw>rxfz?PaeDD^yWQDBNu1C-Ma(rTO-tR0Lh2fiNM$6y`5{R zYUF453D^h{%hDy^ryz4trT&pqf2a764gDL(-zm*wmKvocXXQ6KYWkG<1AD_6z~%ZVc(MUF>5sp2Lh-xC_WBmLa!!YXSM*l# zi`#z1V|z5XkEx`EiJ;8o%+PkYOuD*gl^G<&A#oB7y0R|^L5vx^<6%JIXyN#^@Y)*R zlsh-kiJV)94UL#O6pVV!K9B^in$w>&=3=}Z+MQk`}XyiIRgsOhK8BV;x zc7CK?D16t8RzKQBK$tAHiGD)N-Y1@~yCjJ+B5pd~v;*N%9SL78S#8!2ek;xEScZiFYt41rT}MBeA-OOt)Op#4~;R4@GObxAKN#~uPy zEh2=`cV>}pPA71f(}2~Nt~Mg5zJI2LHW@OS|0L;tVRnj)n_yv`yjM|kJx}fES~26J zdC;n7$D0@@KU)*wYn0HO^)57MLPd%j?ff2B7m9MS4>sQ}-`tl;9tGl7{8`|Ce$-{! z;_sB3G>UFJwyTHs4AnU4(Sm{Fa+>ksQ8eGRKpo1E+y8hkAd29%{dbNd)c^Hy-Wg?J z1015@Tf@UAz`j2(Z4<%DHY4@Cdtna-yp0JXJtgk7ntV|0SJs<@7HB|h_z3|{)#?P` zqAw@c!4^DX+XdXx2@pG&AI$|_%d5kIDG_cj-gfx$=FrdtkQpK{eM}W*J@wYp2iAa2 z9vpJ&jQ?G36m#KTq;erxe${{Nmnj)wzW~?A3ozvq+HrTBdcP6?5soDhTEnO6064me zN>``v9z1g55H?B>+n16gxMST49P^)Zpv^c7xiA=Xi&&uF-TWqXTu52bS-z(O2fL;f z|AzjzOY)4;^_<0l+$gugNyXt_bYH1q{yT*em!XBu9iIqlTuNtaGXSnI%jw!&>k#UI z^rXmq^U8t}GtDxU;V~}Bc~6ogj>VXG>;ZKlI%MXp@C1d&F4PN1|D-S-7hD|E-Uo7wm)|NF05wUxNF114jFNqE zG$rpbeF^xM+N{i-~In0_& z9Vk|Iji zO7^?iqdxNGyKA2-#+Beobam^TF`~!D`=wpThJ3q{aExZu{-yeqP|%-K_0hHEwLP_D z<93S?4(Y?5T3Q(`KtrSgORT|N1!Cfg9}(QAweB~HnN&DD$V0|`W~A`V`iibw=W8Tf zDw{K#fBNb2!-*YdF$jeG(;+!wt%zKxb+q&ONG=eHB(8XaFwm(|-9Txy*`9f_2k;S) z!#QH=`)cEFc8){xON^_eRL^vc8sD4m-~LCr+2=*4swl~V^oP^q<9UH7CZ>Vrt$p^B z7!EUjUh?|6KB_;=)Q`<1sz2;#zMt8-@{)@SftbIp-4Hm< znnN}-L;q?9#OSxD^z`t?y`5fD z{(-ezXo1hi-a^oBq8reLrRg_IO}GzlFe>&ds-O2Py$%lqq6B{IJ4iRwpGoMfEPeN8 zuXWJ#>SVxYY|$Q}zv)r#dQ0`PiTGo>9r057!3~uZt!R?MojTE@X=1y)`#URo%NK+Y z)-4MP#wHFMjM8i&-wzAna&Vff&?Aw#mHk~Zu3mU&8?Xc6+~ej(YhrlQW-*OZT&-zJC3! zt|m}q6vJ9C(g+uuwG!5-hv6r@@?I20ItlZ!(WRT!fYoe$3<6$-MOa9R33ELShZ;WG z9^W>yS%%(2^T*(y&ddK$sVcC?I;i*75qf5B4<6yO)4 zoGn4?&*jdci#F;ae-}Rm{R#HLDPh#?aD992=-o!}+u_Vq&D$7BF6LEKJzzRYEW*uQ z5~%J3RTGz|(N9{uW*>nr_?~~LNi*)cgil3#o#_Y<@+90r4%FCC0@L!2fM6-TG(=Y!D*r zXo)Nk3`B6XE^%|eKD7y`f%a2XD({VTDa^+b!3}1)@7i^en170Sk^lKRdGLeR|GG5g zi&@v@v8u#NYKKJuRvBIdDaqvm(nzUUB<7r$xjg_`^(JNJ1Hi6@0ib{cEyD^ps>?vp zseZ-5b65xX`+bc;*Qn-AzAjTrI}>@$8l*E#FiYy=`JPlK0KO_r5Z2?M-$6iAsjKOg z?-C5#dTLeW@KCD$I&VV?qLUk+tZ7 zA|tQbcwFDFyP=05{>ImpcCRM2gA9N`H%WlpBy$tt1tDy-?|@AX6AgjHc`W|C+8_B_?cEJZ2f)* z|BX8i)&MFofM}fO;|YWV9iR-f3RR3VdoOiysKci9)pMIC0JK?C{k;D{A&jD?0K**x zcBupSj^uc*(Pe6S-+Y+YavakX)4aDsA_wjO+-Kcy$veB0Wdl;RSr}q>@+?B&z?AWW zVo$KhX}97H&|!>V1#<0>bu4_J^OV8Y9RTvR15^pXSQvMVRhsW?yUG7esP>#v1-~p1 zIx)x}eM{VJ1Tv9-PzmF#n$t7#>6)S5gcF zA`%Rgd>8sFhk5}YgGh_o?}AL_VYcd6VMuV-oj%35i_YSmx@IF1EO!(BCB=8ydcNFl zV|!xqUHmgBKm?uKRIUtgADcKr5}t#UQzq(CmLV2n6OaxxCy|~c94Wiv_K@yXp|GuN zQCflap=g_PZ>2cF-hlAS!SbAxm^;cB4yA!uOrx7L9LYL1P_*u4c^IL@<>}mIiaj z@Z^~mI@#pTfmn07Ps4}RTHhR70_%Otf8*Ys>?H=duTfbbzxNI(IX9N2Z7pOrEqS8% zN1B6t%x0i~DvmaIIl7IMB=FA$0iAcW!md@?4z~Fw2{p;%fW8kg zE+~gKm=x)M69lmvIXK>HzBzpP_@)VvyNo$%)zK^^ z9K&oqu^gsdz`pu}Xe-c7cLhy0Q=qSV6|9RD00r)VrBZtpC}V(RQX0Sivr4BZ?tvjSF64Bgw! zS{lOY+z3vwE7%oIaBiqg zw1WZ4^B5=}&wYr!bs*>6C4t^Bl(S9F3|>|N6g2SyyCrRDq$?&Nc*jkkR=LythDnL> z@FJ$djuHl<_FG?6&VW_@T72ys#-H84bQy{85ivuAYIotY)sE1Ti#2D>Ly||C!9hh8 z5TFO~$0&XR3gjtODF%m;tQc&VWXo0#>a`JfnTBA{)n%!W^wc#m)Q0#{|mgXYE`~g$6zyUedIG!Eso4c=yk6R>)Su6t;(T|7rDfmwavp>sCj)Dx6 z6H}y{>y~b>4PGW)R=L?MHus}Fk7{c+Ui;%&Ps)gRUq$QQ(tIn3%LfcySL&~J`5^Pw zw0$D?__4R~yud*LSaurQi+a9>cslr==~4IgG|3wOMD$BdiyT3Gt=S*Qf5O9KZd$PZ z&#^NTz9mcf*|`sdICvzqM>nC~2q^Q2ARNDe22)Da^zo~ft`BgczQ1A_a zC!1oA@cF8ME0<2=(}3Xcmd>ah(yiH;0YeBi%&8I3$)TVSo+=#TJRR*)AT?b-8BFrB zdBj|HVdN|vTIiN|`Qf_;@6k^6m`4ZvAa@Gu0JO$Tf}}GogxH&YuurrhY;{T%1!6aC zhjTYq5!d|i0EDz$h1<5h=EUpS;2t&Ensl%<0`vc6hTihdXxFl?9tO$sarEE0g|r!F z0*yJ~!g=9te+v-4-{k*k|G?{*s}Xx5K7D;*CJYQcAj&KaLq3Mcog9v{b3|;HThz3# zplP-=RJ&ytQ@*JK_|5{TEZ-9k5bE5L@IHM?5>w@CogfwCwD>A`sTFkimG*y-^#QZr zbBRFjSZvoC^55NE?>qCM@85Ezq$Y!9?w=Gcr2 zU&AP|NV+Mq4eURCd}-)hUrx*PYyKSD`bBv|H9bxsU}1G)%q-)6)5ynXW*{HEDIf6iQ zNwIkAIHayM(6n|^`K zkLFNLx@mNMndsWM`Q{H8_0c}rFsgG<>GA;Q>%2n<=J?D?dmEk7N(sih+0=^rUU?)J z1HkF$seeWzd@t2Mq1%7Q?-A2x5fQLfhCfgDiMeP= z0nG-ttNVWG@)Dvq!a$l9bz)%2_d>AJ0>sMg9)lbG-Qbm^O=|H*J@ScRXPKSnH#RE3 zh&Yg}pF^1Vr5Cc)$~%#oOd}RSj^uh^ChH#7mM_HW0E~f%Imjok72!$lLPBv(ZjV^* znml{+#Qh?3JnX-}22VQv*X+@M{e#21e^>TDk6tYJ&tTI3yAO)^xT^?)B~u4702ItF zm;w?hdzIy@1qdPm1kwdm)UI;}Sf;Lis}o|mcoq|OmzP;lrw$clZT6x=+`l2Ct8CBy zFfT~wbwD3w8GH*z(Z*KLbVoFpalDvN!2nTqmng1YCsf9al%YEJ*HcHRLX|dNs4>C2 z#Z3GSo=Mw{t^7&L=(W-Jk>^F_Mcm4G4lJr$Ka#(lw)C7U=*sAOumposSUpwJZ^w5v zP(824JI`Y`FS9%r?uFGVf`{|u+nH7VzrTK*{a3yD&yV-D|7`*P|AYVEuMi}L+%cAsG{j|TjaCaDCQ z=1@cp?p7%ITiq!&nDfQeIc0M4t;fQZopWA=*_eqK4X=3kWT)Fy<_n{P8p9qLma=O6sEn3)e(2I{IuH$9mk4O*IpcxovygH zteWQCKyCZ|!mZVa9}`x!PFrSB$A+w+^8|Xi^C#`mMTFvL6?~G>7-T> zkT3=J1d-=R4FzJIDG%{z%F1SaJ#I^dI=*2+hte|c;%b+rfjXqtFMTj-*+2I85Ea+1 z69x5b{XUxalqzjurY`43RVGb9U+U09GPxx`{}yagXvGJF?12}Wqv5F*nNZoFc4b`k z=0}tAFC!VthF=j4R~tCdWAK`2hGVQwawDeh6Ld25_ort+N5Z=cydeY(vO(vhbaaLqlLX z6bD8rb=-yuqEmGvQfGd?*GSt3v!P_rH<6+h&4bJcyc`@j+E;Wdriu&RZY+$HCZY7- z%0};JUwmHX!kZ(W3%kg2x25CCi+F`vcwu=6<4M<-D=6-uEz_={-B8@1(?8_2TX&Y| zC(5jyLiQ}2Ews3O4lH_7yKNUDr-LMmJst|VI0dB)S3zHPjEz#lPo%7@uAq_BIX&`J z3a4o$gBy15>{N_`=SQ2g!+(jtp9=Y+NBvjEJ-AwB#twhTfN)Jt{IDFY;M;^-NI6y0 zgi!5&=R09G1OZp2!@9l^Kd9v|_l3(0kwtK-uNAHVTBx))sUNbFdrEelkdP?zB-F0Q z-Qo^TJZTgl-SS#tmGiKQO+IM;ySe(<3}?rC)sSP|#P{FAvE)AZnT_)*KA)iYs*ZUH z+b6ik<;c|q8KhfZSjYldRdx!~x}43=Z`H-|x&NG?(%`vCq323rU!KX?7!JW&cXtm# zr`HRy*n)CY8Rr4`^g!)%S9p~*?8vV`ZWvljRxyr=tgvEOM zp;AYewstlDwarp7y^IgC8>OfH`=Hy)-<)Kz7{(cYu}yk2#b3eq*Yai|$9R_QwK7=w zvcDg_PWCUx=2$`3mw~dd^k4KK993;}tJ8!^_-jGzMMh`45#-;j=+1sDoEtr!jnheeWvjXN0qR%K3Eti#4PQ!*nb79Rp1 zMa*aZACy@5-U50MSdFp%yRr}Kj+A*8@{2hl%Mx=f*%TU{zK8PvO`U`3E6vcojVm1T zT{9NL?C5`;o)-Q#p-p6Ulb21ptR}M6kmM*k8(F`@Ha$x@e!tEer97|dpi~~Wm_3+e zc_J^mG&RGmNnrH{z0IAl_fpnx#aqJTviIBEs3|ZuX*W{q&sm19zmQJvvh2mBrjA~ zYUu1>lvb5D3M)Yn_FS~2mR_1vPS5mGM8<4A8QEjocuekj!KQ*sGpE|@N^$R~I zh^1jxg2>KRzv4tw@sm5D^qmfu2;^!YYMzR#WuxvAr*V;lbhFW#n?6Za)1k-ih}9~# zwf9sBzP#SlD%@xLd`?f)T>w$!X4Aw~ZN!NQ>)^tKvAl@;nPf+n+T5owTvWS~ujITaK~)&rYuXB)-)j#{ zp46?)c31&{RLrS2O|#dx86<2_Sptgmb*$xC{q@ds{1N{8^1&Ei&b7A zn)<7{=^^Bu#(V9AaS@xT;!g%5pAv{{>AAn-g{NORjSjs>X)mc+1(?rAZd)%-rO!J3 zNa9jCUHb@I65?->x`lDzDcabThqTz>b`^QP+M=IY{h%?>_I?-jdG}lP%ZzZZ{dIqS zmW8gci-ucXD)oPKEQCb5eM)7&lG-TgEY4rQ;+;Iav-{Z9SRC@|FR^+cd@re6=FtYS z@@kRzhm7j42&jKXy6M%-@^}5`mR>jU&^aCJ{*Sgn& zv6Svvi5$%kmF#+I7h2bqD5l^%*ZEJY5}C^~q{O7hq3zLOf`)09)NRe=!!8tJ6{;Lk zlP2LzZlwO5plVXc$iVRfqITDJ{TfxA$@hreWwOqH5YNa?_=8(ZbOGv=&Gtc6w+rF5 z2U*@~uJKwPAbDDR1^Snls#8K0HI_RKOhJI@F%xe7dm?&-S{EZQla@rfIslRyxCXCW zf%i7xV;iKlL?9K^LjSD}p>J{$N|t+IeCeA`DP&kjNxT(VMFgsoCux0~m>HGcaV1u9 z#+Hlm0f=B&6X{<-22lu;XkLB5FSF!K)pzE-BTfTJmuJ9_@J?WFUW)@JtBc%ZU~W42 z>;jn3xf}XlEs^dnXN23GPQJ3Nc^*w-F$A2OHV*JXJ(xCby8WWf@8ZBM7Rlz-$kGp4 z+dLx1zx*r>QWY(*QObI=nIWz8sEe!aIAjm`3FoV#hxh6b077-in{}J!z^Xbh zaGK7u+3(c=47es7qRPfOxa-k1E;P{L-X&mr;X08O5>YV8u;wna@ zw9qA-n}DN=1w_{am{a~x?XIjCjckFS+T$rJ07us`KQltscQHQ+3k;~ZW=;lK`esLx z+~IWU5b)tvTF!u6)A{q4FWtjg5gvl)gJoeg0H-6r>KrjOD#lN9Uc|PCX%69rY z*9&9VLY>ZpC^-{aCnr-z5$FAeGEJp3xqrnCnU--N+Gjx%=!6}gUtBk>NRJ*&k% zb1r#M+_gq>5>eoL*!PgM$Jraie4^P2~;) z=wknB+-xl%>%Tx<1R?UzWiJvGcURja778vFv4T(PkgR8Zyvy7dpn-DScohs@0{>Su zD`?;$4^y$UvDb>wV52Ltm&m#f{{l|WR3r^##wwY9AbfO>@taQ6sO995uyzJ&W-03E zGNvMvOcF- zcPSf}bG=@b`&IG-iZ;Cn+|x>Le2;=~l>n-Nmr&0qMSKANnuHGu&YlFPH4|UZP`I4< zagair&@WKRqvRq!AE+kgb9`HrUIX^KqmZ)I2CBh`1^zqS2mkpXns4fdY%b(K!Jbt4FYFZW*op zY2WI%E!xvtlWxk-#LDd=gUoj-?K&1G+tIl2!JGJjy^#zxW%dgaLaS3sQNy;utq*}Eah4FZ?NYrNFgd;tZubUnRS& zy1O+-8&C^U(2j!WOx|1pu>L56;bxfNvv7Y;X}bHc5Y(KbC>E| z*)1#>PYuczK5)(JsRs}f%2@cuL^9FZm=l8za%1BW(>y!9-q-li101$gZ^HE1{_hxO)0P9Qkr-QT?0-lG%mX zTR`)l;i%eRlPgX>yq&XbXM1f2IP4;22dGKrcD@G-d{!Uy_6d3K17G3er&Yk%At!Np z!8Udu(3)g_T;yz!d{sOHGm@=ESgo2k7fFyzwB^I&Io{Y^*C*X?bwtRqkKZLrZ8JzN zpOFc&II2bLb}ZZWa0HiAc&P=lvdRgOL8?ozvsadkEE9kE`DW8Pvb zo(HQR@T=vgj2G)5Y0Xi~Ttppc(+Qf97mlUQU>?He<56R)D#aO&(Kyd)ide^)8qHSM zbAWb66J1jC`$V_B_#K)em4xF6_9xD3 zeKXJ1-kWB~DgN1xEa^#DCre8GW0!aTO8vt7Pqh09qB17=u{3ZCTOQCpgBY3kAv}5{ zjzJ<`)#_nd))1LiGxhTp(j!fMxL>&`z&Pjyuw`|-YfMNlMtBp?7ohC|e@yH> z;(EGt<{0I`wOaW7t~3Eop9KzpiJ6f7vB5S`KGBnwIFK{5uJtu3Oyixz5B@p>yCN$H z#?;xI@X@Z9Snpd9V+%Jb{)5pfFB{=KPj&eYeKiN~4!M|_G*$0EX8;n|^r$Gb6oCXR zOpnkyu13bZj|N@#4i!Z3sIOf=FR{?2vsC1er@K@ZW6{;YrS~Svr}L^NKj*m+ZN(y> z&2Xvruw5Fhk3cX=wx-~TqwDntbX^jxRVhLBRH1*gD%bNPNsS|nR%OTnZ_s9-h0y_< zR!jJz)G;AF{OPlpcnk%^PZ~Feko%S$QUtWaeolhs*{h9FVayV{zP&=zYK|CYHdaES z6y%#2d`4QSMBQturQm;^YB3bnPJDp&{}MG9L9AvzsjALMa-(3m`mUTKw%=^E+iItI zizWq|=SQ+35xzot7uz)!J+qNapyeNipmhoc>R#hg1Tg$bC(Y+h3Lkw(>#Gp4k5Dy# zair}-RU=l$%o&VENUF-0{x{a9k0=*s5}mbesLQFP)=dU)v0opyM;O_9ICjn;*@ ztdp2$OG?)7qP?)OgoNaa_@E2c@}WZ;+N(cd*mN$tXjvg+FZxP&vRX%<|EnOufljZu zM;)b&$!ab>cU68;@WibNt?-GBY&Ylq`u@(0TCuAtdt+8ZibYJ za5}qmC-yN`7@_-ZZ?(q5CL-pg=#*)C31eoCl=3aVX2evJY1)RhCr%UPz_iAOzUxcr zU?02Uv)HUkRQ2ky?)-6_26J_P_q1qe2!8n6@a%9LtmuYw=-k#1ozC+N=vz6HC|vp0 z9qTpuvK#^!3ED5=y4ZYyot*0r zLo70~AkhbNQc*7QZZJzlhp?vVf^qHpYP__w;mvbW?cIAy#%S=bto8V5@q4eoA{_$O zEQXK9$09OnZ?27wbhvx4vJl&wwXo%NHEFQPZ_TpDyiJ7)iTs0*?_7W8R2A065B0y` zGr!(mXoqvY_h%bDe)?m#$rm3xe6nJdjGFvJg)$6h`IW&h@cyiI?fnO#3r#SkwGqqV z$jy>hS*YvIIiL7E|2(g~owPQX7jA`n^wi0n3oeFxv9m3s($5dzFd;J&iZEo+mtDkW z^!BBXvtOuC5;kG`F_l!$%GTJMFoGt^r3fj6f`Rxj?aQL9YoqftQq9bl66je&yVuMj z`GZ5%-p_}9z`ifIvHJ_>;28GWxo7{y`nG~p`l&{D5|iPJyceyHV_i=Vr^5fiC&zhU z&RFJcST2*_R+Kb0L!)EEg-c~@LOZNR_#@^me}5!KwSOOOKL3tW9DX0mt94UH?SRi% zN6j##kmCf{DAYp3OMYoXhWArL#knA*40s~QQ6Cz4ZF?=)vUh4e7@i?jQ&^&>U-rZ@ z*Ns8lj0kD1>Wv-GC4${_{k!anB*oJ5&TG)i#pge$9@sgw6fyC4S45rQ=jFSG82I46 z;)Ji?Eo=K#Du^l$PKd3$j24$v%fB@{b)Bx0`c;n?6XiAO)w*5V<-~*7BYtuH0FHKRj)+jnJ?Q`B&%fn*KZt;`qlBU<6{vneCHZ8%uon#Cpi^p z_fk4lhMwxe7JHs$j*wGhc*|o6XK;bJzp_};*d!qX^i-e@>|meuHhrCVzyrK0;MK24ZZEiNdz^buRgZJaX|D?Ik_fuvg` z@g_h03sT23cG*lcf9?QL9?J6?H|7oc7563su7tD*h;5Qbmx}F+jKleA8pI^j{ zi))&616^EDzo4OrN~~0gnI?VR&T%1(3bsyv(h75OB2_vigsXT~qQ`kzthc&ZdAiBJ zQkOTlP=vMP{%#y#b_ABb{c|ju4c(WLa*q8N{l{%sqCTAHQ9vP_aRDAH!G8F65w#o} zXQ=t5J@f)yWa1&~7jPGykaT~+dBptnx7P)?rqgMTJqTd5b;Q3D)6`S<*^xzAXvQST zooPJtO_-;&s(E&$>bTB5%c&b3!~DF|14A4 zqaehgI5jYcOgP%9y%em~Weu-wTwcuOOtH=NTRqEVL8$xeWa=UPDDud&YJ({pye51_ zpA3v#=JNX%8LkwuewPbdH5(Uj8I22y&ef`Xg(ab`w_mmU!fqW&NO@X9Nlk83{>jU-zCao*C#6|tU1Q|vZA!I9WZTix>~YG`>EE6siIHRE z+QoEA#7ai}52bC9hbkWC{@U~5TnWih-F{XNfMV1Xb(aZEBN9`z0%pGZ4{3DJWUL(3 zI__g{RNMbtxpzowpOzwIzL#W>La5g2D%XR@5Qp@;D+IJe`L2$Cx8orSJQF7fJYzkM zOvqFxuhe`gZS1SXhAX*#;e&o0QMIw`X%e|IL=$}_nr7u>x_wTSu+oHULXc`lnAUaO zvIw7idpED8SWV{14wbtVCpHd^UajkXd!ce%093!Y*|@A;~Ti8fX8 z`9(%DZVgd}=vJ1^SuQowJ1C(ngk0FVfA8ZDP0PPK10ps5+_C=Xmn)<0Qw#o*_e-yO zr{09nwth_Fvi&BuZTz1?|6#3GZVeYR-{IDnmzBFZx2(s-Fei3rDfPC&!G_-!XV5;( zF zmO3B)`uGPL0ce+=v*h*EdL7*r-_$C_ZoGTmy*Bb5Gmv?3d$dNfNo+7zl5SJG(O=+# zJ3Du~XY966UbK5Y1^Z zje=Q5M-N-34F`L6#x?@YltTN-y5oM$4h-`j0`Ju|)QXPr=M!>YsCxIIPtNMiJT^mG z5Udc)koSv(uWJJA++^B8RJ@dW+|?OB}t)9`wTT=SR?d*+ag| zkGpGT{?HC2#U`w|4v$46C z-0%KcQ3t+X<|}37{&ayDTz;kt(N;I%mDYULd5OH&$*`Slzb6y;Y_au>6u#5EV0VpX zD?3W5UTxkf>9nyIJ#NFQ|GwPon9_=lwyzLZJKT=#hE-tr7Q(8al1(1JrSXYcWqdUi zc{5(T;jV|yrJ>bmql_}1a$Rr4Y-J|jg|N9aGNnUn7NTF^`%+=A+m`dD=34VpngtM_ zZqGqIM=}}1s|5?g{;pw{2L@dJT-|Q+NXv48P-if=pvsmh%8@=ZdAEAZu4ynE_NLB^ zKpF#gb_hTw(>*lbS%R?0i8^`qjQx9lw_bjxa<52ZUQr{%A5&A*?X#mGW+0`Rq7E@%J(a6fFDhKWIJ*8k9^&S>E5Yp9s~R8YG~I8 zQdMAcTo!gzb0?yKZgY5=xVpohuQt1~H>PsuN*TX>DFQ;B@xo(eH8+QqhHVy)82y+~ zCs3YNn$Rq+;X3LSil+CyQ7vm0X3^O@-30R8V65B){dZqeJqH5|2!{;4%JJToPHmhn zmDQP0&uW_#Wq0eHfPJrR>QD32mom>;`EQE!P`$k>$>PE%-N`=YVaDGCR(Y|c(gYrx z5meH*BN3KgGeZJCYzfzV)8of`dTUybdNu#E@bm9Gg5Z|-J-3G02Kcp6?Vq<2)bdW~ z!FOK@o#89Gckmp-1@e~7iVd>UhQddSZ|=xckDU%;veWWqz`oeU*mU)Dgw*r?p|$@q zbMt`6Y3;88Y)q-vy>(!9*58n4Lw1kL@@^6g)z@!U%2$h_n>j+xrjfLmmBV0Vlc|y) z+ysC-+Lk3&DS}#%R)dSXt-SN|k~M@RZsoEM3v?L_J(Y3*}<#m_;OUv zvto|tIoyY(7DVc_9*f!cgys=6_N;qCmG=zIEb)n$--cv3yeX_zuaWw32Jz0Pp;O+z z`QdJvCec?|4%)nEo_ip{tJHSJlT=OO(1~=@|G4XeIaNcI?Ptx_>wIU`)CU zPtpR>;|k%Pi|IK8T4&~P!#9n6Z4bHY#LZHkWrlZ01!~~O{*2IacS>{Bk-#Pwv?y~d zX_eco-Zqf#>2t?=v}RnjS@DPL@=lX&e=W#S^M00zO?OYx+N>Q~UCSKb^R!Qs-*&Y= zHn%deM*{wy6Co=J&B+!dFMGlZ@bhF;!yn2;tXDzBBZ}D?$mIWdj`sW~hV;kycXzty z91*~7#oQw-OI}N^fb6WV)4R8$wp!w; zFs49)GlR{y0hXCNFiJI6L4(;R^@RBiX))&2<-aZ zgHncUfOwHR1U@KM4=|Bl_x%{?`|TncA&2vam?j6Pz*mj~IkF!3T`B4eP}%~u^FJ02$j!{fz)%;=>CG{8x31s=nOn)0=WRJ;Y%ELi|5||?VTPBQBlmtMvMdvcKQs-)78{o z>3!T@C6ghNLlGEZ-j5@pL+v*d==Q-ge99TBcMDH~OU0upG>RtBHsPCZD&uMfZ;m5UvQ-JoLR4d z_Em^1?_;C#o2~kgw#O!#gHH|~8q*Kc;Js!f>9FdpapOf(zC-nP_3VqBgO?#Zd~YAL z+&w4&dCnVV>d-GlCQ^1{1#Nxqr)GBUfwWyc*OR|X(HQD$JI3Q_V4;LUxQV#We+pt_a;u)EHXd}TUK|nbd~H6*;IK zIPjk*jEAij#XSEX$#d`I_q?I+E!~UFANUOnd<7HYkH?t|EdS$OlNE{+5uQDI;QccXtz2M8VUb|&BKrBPl|k|Vlus&E`)me=4)&HiQqA~x* zS0o5X;QVIvl$9!@K)=d=VGN(&|GiLf{I~uMn84{Re@~wkX|H)1eWmn&o(TJ&Cyq=y z#(Jd3{>PSJ|7iBt|L>jtzxyVzP0oi7JW1^QfGD#yL+}f2@NS#;P=Oo%jyNv!oy>5| z6AS!b|MkMSIqoh-Aqg27qcsIJ+F4CPOSi78t~bX8I5i%7RS|G>q%Gvs6I0!GcEI9) zef>Wa1NeUuGf!De_2ccg2A}FugH-8+I zMRZ-#9}KDnxH~36`Kr6p0)cD9#B=TK!t16oi;A$}JZc-VTcrTRdFhCqSC+IP^J$rW z$*I(WGE93MikRjdhj}N);#7~^9@j_PjdKE$fCy;!dE1rMJgmujSVDh|F)1=VwG^Ur z24$6BgCI8H_x9z-n}iggecMSAi6fac6{$ldrk%)@ahGT93@443hMdcR8Z3es;%igj zWKA<=MlfhoVa%c8tr zWa*0fMHJ5@FVLRU!TdCOGen~eOa2MQ_+N&1OPyhP4}D1u@RV?6*J8%yFlS)xx4T-V z@p$zXFjTLzR(Ti;a!XrXqNiBo$d&cs;mxm7w7q&Q!mBJ6w|bW1y-W3UTKjN`BOh>3 z#&l&?6DM|qFlY;`ilX_Mj>#;Qqsy-gstF~{H0!=Esml}bwP+o>%>%Lma?Fliyy}&v zG27n3ncfkw&(uom@^|>MkdfKf$RlMJefj zb?3K{5QN+SSj`Phyovh8t+w~;D1=YJI;_M>Tbae*GlYwp*&t3mi#{|EJFof^);;Rb zRX2p;?-{Ak=c*=T8%#gT*Cv8yh-k)YoRH^sX*lgsHB;&F{0Sg?&mtdCtG+bJ-Ald? zQq2e%!^~yc81-3+d71CGKVW8&(W`z8=7YI|9 zE3*Qh@yUErHXA;5e5NPkn`Xq?SyF9abHJ{{+bvOgipE%e1-95)adEcuy~>C1!I`u8 z6llH1-p|YQM?Wsq?|%7&?8uutn!g*k8{)C;-kcpRP?C9#KEIo1vmQn3W|$MAl7!F$ zq0c;*OK#CRGg7SL^zx!Ksh?iXjZ!Ic6%`5s1jZ`Up)7)mLQGVojep|&Z@P23l<{OU z+C%FcDlFLFVmpO6x}rfxFHsL6dS6*0BRiajzx+&n4Va?C_YlA}e~z{Z)me_wJhQxq zawo}*jBu$jREG2jwJs2r=-h%|&n@JGX$8u_#Po9Q$V!zklk0T8 z4w7;*O&U<7X!@%+hMB`Q!<1SCjqzlj;~HnAJxYHeyFvvlwv=WlBP<4@Dq1dKuPH7DN9xxav3&Pt zSK9k|sJ4rZ#h4ef*td5&D&B0&V`fRfUyEl&?a_x&x$*%IUL16y&`GAwtQrkP603zf zNX+r00}gQq)7Jz?Km$pjKoQ_`KLyK4JRr6J*p*Bbz;%p*ks~|kja@3Om%YpYVPF@4 zcf){a2?_95<~f=`U73re-y>ZAoIn)?6-fBgGiNn~|E-36VbbJyS1o7VZDpGo z7=K)?>odsxjHDD;Q)p%-6B@dQvM1<|w(NxvZHZgMv-o`2M#I;YS`PSzMV3;I=ae_9 z#5iV6+aR|TFIP5I8I~F8_?AKn>~-$8ac+y5t4{MS@@|gJ6kZRH6Eeg8ZrdPy z2?f^8`OW?GQYM>{K|b3sMTPS7ZR;|VE?a5W*g?|a!QH=H7DyK2+pJD@T+5aP!F7m` z{G;2&rEd<2I}V_VDfSR!rVIEgU<=KD>hX7a2$L7Rg>dbw z+YPmqwJlrbIr#+UvuMwe2?nj_y`uK22Q23cWvr@)`LXfB+L(-tJK@bqYs&6K&RFGr zy7vn+X|wMuHJJFWkInu1Cg%;gL)VBeX(7$_h##W*-! zB5P=BwKl#B!7JcMu@nByBxkLU_(312XJPB7IOxH@#$K&@_&LJC?J6rE;x~x#NHSSX z>a|rQG-8QReW+lR`IfaUIzRd=gtq%lWZ|)IZ`d3DZYP34SH?h3buKjM$UA}ds}nNQm1 zs;J?rb;F((L_c#MUXpI?ua{cTX+geKeOF!rj9peSI!Aw z5hx_#yCDl(B?|=~BH!7h@;CZ=b>!w+C!0|>KmK2{A`vFdRt^xoIow0DjrwK<7yP5Z zlOB!)stBdm=ywSRZT+Ga@oR<0@~?Zf0*Aj_)p6NC&!c|XMjDv|B;EfdsxSj|3L;op z*|uk8na`RN`q_iU$zX`af83j!8CRTM0-LAIeE8>9Gq@w5yc4=Lwr#9|5ggAnc*8Ga zH41j5;Le1Q-4WU22?B^j#7yUo&_j`=*RV;eGF?s^Hs%uj4P8CqzVJf6&k&@-s>eP* z^$0ljx02^ab_3-ph2D2zfV+T^GW#7G^A7@?N?HARVl3*LGaoAR@k$a?vZm^MX<1&8 z+xCx0uoX;Lo?mph{maq)M8C3;et*Wn!D&j5P1aN5Zhi zO8&!@EmRP{jt6ARpGik~1ZudkfvX2e&8%#AccNt5QuNxQ8Pwy9vz)KCN6-8MSBd^K zbs6(@*K?>HF+~n^wxoOXErLHKB2|g3YCq81t&x+f&+rDNX11oN_YCI9zXGG0btmAS zYtISVd6#qzv%JT>yjJAHxX-Eo(R;o$G`Nv8f4G-%c4oQ9 zE#?`MEUGr8RbOlt05Tm_O8czv0Qcl70u=^{8lIr9)HYURm~CB6Ti@;jhk%?a2`r0T zzeO_Dv?uFqQoklkn%quPrMk{!AV}MzUoV1&IrPTiQl~que`fWoYO}Eg0jP7sRMa@` zF+m$@eJO1It0;z+ZmAe^lI3gI>(6N=#;}z4ZA|hulAgCSn&Hp$bY@+|1&n0@*-W~Ksra>SH5!YlU6ZNkHH}p zFs;4YG4bHiV^@IE<|(-TlmiDqRoQb%eET4dHOg+X03T9#Qx?b2VmQip^ylZ64FH?5 z9j?xj|IT-eM<7TOfKP0EnBdA^4Umy3?MAf9;cb9~s@S}_LGYoSdr57988phbvO9-7l6`JT~U+ra^5}XC~dF8K=*h_GsgmWtWz&GywCw?jrpBWcD3v3q6Dw%g(ux36XZ{2M6BvYknj`a>I8yaC1fow zQ&7zk37ULbPB+Y&J6ZPj?=Cuh|VmTI9@@Sdz8SP#)v!#bfn z&||y0Ntx*h%}4Xx_je`#ga4>9)qEqh@)1Vn9&uu`}vy^Eifv{ zE$@CG2ktRq?PJsg8U9A#)lO4?+vz6nt$Ye@wWamds#-zVab;Orj|q!QJw?OA845d} zAalIx1gBMs)H(7x#)|M8=Sgv{FK#6$Eyl$w?dEiQ?JvJ65T>j}IsNAYWcyjf*$)D5 zzy$%nP{3C{1AWGt+h8Whg7^m7&_7`I$}a+$$Q7%;aSG!c$?(m~m@b?Jv&*6@g#VyZ8<~Xwhz6 z@_D-G(`p3KH1!)Zgx73E#GOGOAc0ePxzh%E9SM>awUr}9+JeNoW9Iyo?US_mRkjXy zQhCgwtYJehYFl#2>R={2wFJl@{F|SW0|A}x=iX6fP%Qw5jDMW6YGz}7*BY2K+^uU; zU8R1Db#8eT-}o+{1xbs5h5k19cc_sZXz$I#Pr!ceKuc@BLe8}{3-dmKy=;uqBhGRT zN=g*%0`SwE?16KOU_s=6@wZ|eM_}8VwuFFF@wC)-z7hE`z)aHyhz63k?6Dv~ID=$@ z;{nZu^hkdk_m0gHsc-o>eAny%Motk|mt|+(@*v~l3dj+S2xfyszSnr<&Q$cx?PtV9 zVjM0v-# ze9mJ;@!~((Gkt~$sybIe3?;*y&j?l^D9q)4NY(knS1uzDdpEU^j-0@-y=a$S7dQKb zzX@1q)AkqDd3HC{N_sx6801R$!$A#`>`o~yYs^6B3#H^bHBr(8AZM*z?b&KhhX0`K z4Jd!%ho|ux6mxWnl;^AXz>LVjD>v|k-JI^xplr=Qp?CEohPSjTY5v@YCCnf1f=vf< zJR@1gFgbg!Qg~sj&YRBU?Ft>qZ$vuu{6pVLT7a>bRWjZ`ZIq~K5T!p)*O8>Rz{v3K zT=MGX7%p<|AgMAenomMFvUC*dn1COIt)1T|bg0&zOIEIRa|lVeV6GTv4O1W}GDH zk$hkFjM~UM*6v?I*44tehTW*LMylwpb=k$C9}hy8dw$X>q_X)}KL3si&Dy<9IoRkO zy2yQMXSFa1Rv0D%HU4L>*8l!?q_knhIatNE4aeA7c|qPbdOAbY$e_=me6_F1OsNPL z6J-i;L_R&xHS{k-bQy<#-P+pG(ye-d%T$TK3-6l%mx62(L5lNVsq-U6CgK9IX6Hu? z@z+2SwD6#9LZu>KiP@yWRUh=+%~qoXO%rV=I8fq(29>bVfLe(O-}ou6P3>!Y8-?U7 zjKRf4y>Vx$awi@aeodqSxo}3d6Qg1Fbv);~<3p!dRHM79?b`041iQCZtqzccTb4iS zKAOC>()LKu{Klo1|DDa(7eBcA)yT3DkPZDwvuxJWVOUaai9hxi7QZzybwJ#YZ*X}YPkX|@@-&`f6z&_=F+H3DZ#G4(}dGvlDs z>J1f1%(ANJuG&%qxYWtMML+SbY1sm=cugyd#B6F4)VF zzEOFKw!O_oiK2JoGe?AI8x-W-45`w=YsT^aTOIpf$;fXN*U&d3>h~(oB1d%Wb<>^K z`%jks*mAoB5)$)^U^Vt)V*sJMY%yKx;RVHlAi@N|DD>6$-ye`xr5f~ zz8ORHIevo+`CGQGTpehvlIT$NFH1q$6L)yz^XEXs1SYxm2g04`Tb!Brj$`DLonS%d zur#2)a{Vn;)o(cM2zAY!EavcKk3QIa;KrStdPVn3v_58>=5&yJM&i1bAgIs||NAyH z4eh`#T|6rxx$@xkBS@o}tOfp~h+88jLdsIw${XE`)49f3>P|v6U_c6k;vwf@{d6tY zDEl61{D1nuhr-#lo7z%T}KaJsspn20x4-AS1fw~NY$w9v|@v@Me zMHNUrL)+tlbGhCUHgWa1&y`_19We6)miQ@e zEjvkXh$2IWqtG0udi25zj?eBcoL(W?9;^*XA1&A3?CkBG0_t;Q_N$vSBRbIgt`Vxk zi5X?tz7mkxMv!AMLOb0T=G=!@Vl_-d)G?m5@yA(L63^--OD}Njd>)kj7V!JQbvwG@ z+^;{z(SHkbb*|8kqVoW!t#sg(6ykYu^9XW7b^N(;(g}_Is~LJFqK0R0pC8i^MjDtB zHXa2Coc?S%x`KVX{xTjuVO$LBYw+@Ye9OhO= zD~IDsQe|AaOODSfM>4IHCumhY394 zU!_h6t%MIj)17Z|{o$56v!coRfvNR>9*am8YoY{Oj(;l9GccgWWuVuwDP?5$nR^!~ z^mDKOyP^CS4xS>eN|Z9b05jY7&&!KrwUsX!kz{;B{AQDnU|+32oTp*68+j73p9{e` zPIKckplP8&Gp+u6Okg^q-`TDjiKZZYvgjp`i=vbkM+mrJu4zL1`$|-xC(nv{Ipqi0 zZZ_bmb+rgih=@SWw2?z(B0tH98=KQEZ%5HqUa{1yCno9Mk`-VyuZCfjo4q!^6gE|( zNV5j9F+$Fq1%a9{p~dl+^@7s0)l&^fk!icNAik4mHj9>*HM^mbDBuH|&CwHqdKl$J z^8PW-?#;>mz^pa9Y{JvS4&ll#n%=&XnkluOZhW@NY^EdNV5z4A#E!W8G3O2 zE5ZYw2%-qF6S=RHy-5UEb=9LfywiIWRpvAWw&ec_)XPc=E2- z*_r5aM!vPYxTJH)g>&z@8TiDZ;FE zdGN2&!zuD`2HgsuGl|XQIhl=8uTecc|F_W`FGP1s6JZ^P7cOm-IVbQqHY?7XVnAK`8 z^|e>LD`_G9gVmtHegV;(;%5bIK$5fSuj_W$5dDOpHdi&%L)aX(I!t%6wMBl8~v>>1K8TE+=etgm?%FL9@ z;eGpr!OpKu;XzPRi&W3x4xzx(pSGRR0A6vPWyN;@Y|2#(vmvJ}8$*66QCPtAwt$xtE>h|=FlD;9%=tgdv7T@LNoyb~1D-HA2ZbRj z`txou$y)Naw>HckFv<2AYpS1v`Wi~l6qiC8fEg`W&RIZFMZvXBHc+|Ry0py0e0={M zJ#=PK21yFnuziUuv8o!f3!imQQ`Xwu7JeJjEs;gwe;x~Oba31!^WA7~;>Jcsreo{< ztAwxp*YJV zRBumu(rQN`-o7biYidKF0^a&Kp}6O>5C&83aIUD}c>aqsL--s-F*2v>eSrP83-ykC&h}@VA zUW+)SXK*W=q6|L)rCWD2z5M4dV9mK-EgyMi8h#XNVgVmWoI*M25Vq@Di(0}9b20yT zlWv`@JYU;!>*2p$h8Nq1YIWya;Dn|0=?s+FDY3D=i&&XZv%~)$ryTyvO>pRn7|^y? zY)TH)OPzJK@z*FbfGn0gb287jyFy>8e}VK_)yAi5G-b%1YwX`h=|=48%^0jVnC*qO z4Q@R>PkX9y6hT?;LVA%nk8=B$vUh|`3S=svWhDz7-SmW5 zfw4kIzCZ={u1`NQaQXVS4-?e=iuj~I;+4GPwep1&OP1veTzV`Qm=RR;yJWEoIW)?O zG9i%6Sdgy}`}zLj2Y}fha~2Ui#8c$mpPq*d|3I~A2_`>%_VoP(ei%_l7zK{Bz*d$XMO0u9S-|E0?}R| zQ$MhwUj$CJW&PBO?@3e|tC?IA0k^JjuR>c2?Xmz9V;t*$4{CZo1)=(0aJ)tvPOA0D zf-+>h8`L`e{v7M>4O_(um5^H`l_HG4vbOokli#;dtNG_YIbVJy4jXKTX;gyx}FVQk0K|!dl)Xk*TOK9oGB{5!n)&fj=O;UIfF z`t1R%fJ4v@>3Vg~r4g9iWbZIQRoIctGSi~>bivZ}itY4DoJmY&a^sT;;1SMAKE7Re z0Uh;k=MUj451)r-$uqAGBXW%wKJ(r&g*obp+&%f8?#940SlOeihqX@2wcr3k^>CSF zOa2y*!1H@64GnW&yP!6-`&T>vm>oSDcMJVX-}Zpy`J&|r*3Q5u1Jez4q7qDUe((zo zHHodP{eZW&OUg;WH83gp?`O|;SUT}S@pgnZ&OdIy{v>WxrZ7w+#+yZRDE=%ea{(J} z+V)R>!-vWY-b8bHEG7<^90hq#m<9Wy6I8z!@?tgb@%?)mbt#*g4$2k-(FaP3Z_G1P zag8UQJIzp5eMl-QB(b7@g!kv}l_{Eu-?08%wkv{w`u=uQ{*4}* z1(NJu^%8X3R4TDYSPiM35C8ta#Xj_9o3N5lU%-2rtcLFV$gMI4_1nK{%{pr@+Ul`% zQdU;?@qP4x&8R-;m{U)3IL?W((n8K0yX6n|A}Q5cnmZlL#pd4R{fhRNTJnAH{!G%W z>!cOcc5O+|`U*Tle`%}i*6(HkQ5s&T4t~DSMCSWo-J4)TlZu z$OGl;<>nC@fbbaKuvr@Se%SlC`DFNa;qz=)Vs}r2(o3>WCg)X}$ z1k{NGUp+r?X{_?7?=wGQdR}sqovN5`A|rMZLdVHa*b$fD>7C*TL~x+D*AJ%;h=o5} zO10ZzX^K9tZF{do95d(s9RFG3!}j7U_*lkbxre`>YOKb2~I*M;N_x(dC1DBL_FAo&4M| z$9vvDrc=c9t)8|)oc+1d!+zK7dMyrW!#$*~7t2rmJc$wUmimlZhhdwfDp0?^-)VT? zF4ZNXm%7^N37F5Y;he(5fqt`j6&S`qZle4=_5>$Ja>?xJLyftD)8C2aOyACdPv*31 zRxblDu<1%#3GiUEZUcl#UY;3}h?h2a{rb!^P*<(=j}$>V32KhiexxD#DXz5pOsC$k z#kL)+qSI_C>tD!u9mcw@kIw}n(s(ZQd%F-%9uB4VS7%cMDBQ3m!T4Uf^2^yRN9;wb z-dWkWz4RyB;LKuBHe#lLR^oW(y%f1{Js`~ucd_j-aF!#;k-p|Nuz;lz`&0nNF zbn3CDdGx?(drps9y z3rL8Gr2P@;jJH$tcLK#7w-eImqDDT1{;HVbVL2Y%7OwQr^m?SSA&Tbw+_F77;!^Wu zEB*7m677O2bVR`p^+bFEf8I<=E^EaBxTIOLj_jkrk`rMUW7_KjiNT${tec$msy`iz)?b%C+H!B-)&QB zJLhL`D`QUE4H~^0e>%NZk#(I!CA8OgGi&_zzTm!Ah%+V7J~$G7gS_2+J;jkR+lZ!2 zKo_maeG1Dl?>>A>K5h=9ZSJlM?tD)EKiGTAxG1}}Z&VRbLQo7q8bPEL1O%i6q`SMN zo1qy5L{w5FC6$ow9vDixI|dlKJBAoyFRuH3;<}y>``P>J`<@@>H!$bSS!*3@t>gGd z-n5OLAc<+T0=pHJD}3^YYN4S5lzZ^~N7=%aXXmAVD6J8H^y^Ba0m2Ni?R9*c-~IV1 z(npf-x|0GHZ4+4G{d=J|4#YHS4(pFZ6@2VHoXji7QedM6@Y+v4yQd`AMfQ(Z$ER0F zA@_DlkDB_fB4{;2ZB!&lHAuF!upSS-E%OzK28`=fa+O`xIppId5KSC;RG8wVhb3Z_P8?D36xAUJ$3MtFxE_P^)|ywwwPK^g zpzIb0f@J%vrpMy|(3PK9%(&~8<&mbYy~lZ=<2Up`{QyyCS!k|z7;|313>!4ot?zKC>2Vo0dgV6hEkYumnXz#Q;dTy=c$HMMD4->2epEuM5q z;)Af1KW|o@r~_JZ5Q;mhR?}1=!>)HVEQMcfmv%P!g4CresBGNkb3f_YV{BiI4%29@ zW_ohsG12|gtV!)sYm0{WrXUvNQ7wwk^ZDm&qQ!Om*--j|KBbjAW?zn12b#@3c)iMR zbw-*0v7%Zf(TKMXHQ$0*C{?eghuE_+5f&QZ0aA&e8+6a!r0^g(StYYvdTFEf;pF|+ zuJ`hJi8Zl}h1BIG=K|NnuN)VGepJ7!@~JfifAX~v?q=NKH!*&;2Wb%1_th0&>K}Ro zF36Tt2Y#KCX#Vr8p$~i(t0YpmkWWhdhrVrD0_)iE@ZaYLqa=HLy~7?7 zU32w&1q-4SjOT5s$wStj@`Xt`U)9+RZQ(XgAV1hRCowOQ3QY?z`vSi+0`y{0SM~ON zsqY0`Q@4uCEe1R{rZN3oFr7=x6J%?&{Qio2|aC?wRyG6HM1LK3F@rNZIx~T-mhJviXym z*8KcasiRp(YJCvFXF(sQ-_3g(dD2i=wT1)NA4NTLJ&Hp&_>dF5I~x&J>r<&-?;C&K z0dNRF*O{~3%Sg?{(0|f*1XvHwek@qO+%0$c>!A$+yZCjT(%YLH7OwmCN zt!mQ4RFwH49s`MMXN|~WUH$o?9;3qw5BF>CV%4OYMZ}(_CF#Q{wQNHyA)PXd`>*87 zB^p)p+j@AAf9VL~Em|i%>K`Uq1P}n|FRjXsEl8pAAnqA6nO0X8M7m#MQtP0RM8fPh*5_MHLE&L1g! zt!EbWa-C&!rxh2DFw)Yy%nZ6OTXFIQt;eZJP^&%fKjqOq z@^`3>L;$Wzx{jb3zcp2Msl4%Zby9;y7@`b$g<5&S|tbeXuM-*?k^o%<}CD z{?$EvzGoxx(ko{G*-de9hH=B;*Zg1O2bk~?{59?S>lOGIz5bRCYbeJMz?Eh?IRMa( z8sRv965GkLVm7@Rx^_i11rt!qbXRgMk^TZO6`cZwEc#epZ?DB4*~T;X+yQ?jHHq!~ zu+Q6~qTGK3_w@d_sFB)zU zV#?*t7Ws$#Q1>$gq4%OLZxg5ix0>-?JMgkuFMg||t^SG=a4h=|wqStQg!TzeI`pTm%ezQfUhQgI7k%Xv*^3~d3 z!nwUvPXe?>ytb@+WEK>?GP)u117+)CX}0NMFDHp{M{^cJVvWeZ@QGXa410*LyzP-# z>IKk__0~*z%UNy2yZD12^_A=p=m>PILdt4Zdn1?NF5mldKs*vz$pwBAkMaO#uu#wZ z2IPsddDOLm$d+6FMzL}r7R16Gv~j&4{BoJ36*WK6B--<6a-y_@pd868phEP$A_1;3 zOnFoXOyt5S#-I|{Vnzl|f4wRLb&gkmvCYy6N#{vY9|%8D!m)#34^$0yQe#J)sp=VS z%|yFyd>E!!#$ZUUr~E?Idvo0L-QnDGhy8>xA-LFbGOM*o-SZpr_rcG!txVdl?T4zD z&NbU?t4yUTAVZI6sgq8Stu@8^n19AsG};I)%N++$n(Vj{R{pm?VSi9f-;3uGd?8|e z%_Mp4;kb3}QAN!KJQpI~U-J;%{$&K`us?sziUMYee;NB+?|i*|X2by0q5s%E#QkO2 z^dEoz-w(l^`2TbhI>`~?;Qlj~d#Mnh)4V9S7a7@f3Yx*QOMg(UK@|cXW-A9}NHB1< zxbflDz1WulTYa%#Y`wnn*Z2Lk7x6j5w-W(B2v>oU%`S@mpGgtoXhSVr8|M6LOP9C? zN&#AemZu9afV{?P0@o2q@xLq+|Gf`gYU)u_;6dKo36?dh4HjKbYCy+&CH$A8>A!Xn z*2LAmI`E2jDTe?z5ti$Z8?IS%|FMClzi{n;`maqG)6sRD04$Uq5N}`!KcW6_AKkd8 z^52hqLwkyzG$7&knApuJ>b_QuOEy@=_9pwF zw7h@?=cXx->!zkP0Mg`?2Wh^Zn4JBRXS_y>TFsZsm##Lh@IcsI%Nrh13H(LMNgShu z<;Ra?In``UmiA$Xp0){6y&8DyW|_euzIDk>JUQ`5rskr~p#|Hkpe?)tu;GtASIC}d z1puKIi^ew*2(VuQHq(-fUzSrt@@MdkP^u#s$Xf>-of2GnFvpir& zXv2d3>k<$;@Ai#B+?s~tc@|g(bh@HLkMi9Iyen*4o}p*EUUDC#JQ5ii&Q+VSv-a|f z7O0EZnyl-)Osp6eJhe)+MHcg9B;0^k^q<<52hLY`1Wz`pqK({%5KVQ&fT)l}iF^z_ z>+(Fpv%`b-L2Pa1*z=4F>yN*Oo}BJ99B7rAmcS4^74PrnYN9r^Y*4i$s9uIN+m@Uj zqZJjntP%RW4lz}t?}cdFl(@kFcu0TM7(w0SOsQD*zE_o=O0F_I&UU5-0Vn0{!9Gtc zv#yu0w|_qpu8Y2VxkZJZ5854r9?#6eP&)9&p0J&}=L;+yfya+{mL@29yy54AMBhB^va zwM~<~JRdE#v(0tX#^Fy>q#@%zHt=#k2?zECF}$S$1L;4@bF?Q)OuH@W*>r8#LnuuU zD9XA|urg_SSgq9~@HHvsDCXbOXInQCs%&`C8}6IO!QN;e>3OuCd{^vPvi(5!dZIoc zbs^1>J!fq*2`?D4G$9?e9-C|6bo@&)wih^p(_+$Gb;Lpa`Fj~|dz`b{gq##>x8ZEdmi@(wmV`>pVbzFhU>Lym>l*wHoUOG1 zkBL@Lo<5X}M{sGBcku3G+n@(r{ocQj=R*}^3Yc9f3_(8qN7{&L^Ll~vQA4s9o-qRM z&JT#`!k)=2%c3q##x!SiC-OI7qWNtNUtCqXevHB))2VAYQLI)e0@I`1b_mPxdY<9r zON);^=WZEhJx*oe`k+L<1xqoXd}>cvu_AQQ!C}@t8#KpE1l*o!!e3|V*YFBA9X`0lq*LOZCUDwmxUo0lo~x5vD}dfLD+^GKWVa{SxKt)1 zcHcg05+-})6f^B>&S^bBw^y+{8VqaL4!AsB-W z6kg1D&1+v%1O@i%8@U}0SvG*Z2rOM>ehj)Jc;9#H_z%D6R_VPA3r>SKOsHvNOEf;m^* zp6n4GaS66r*SIek_vHGP1V6(^&th>-Sh|xqafG+&iGr)^o-u0XQNDksrB-$1qrUHm zR#vUfFur7T-4<7cGeBoMH&AczFR*WnzS+AdFmx{5C@emoC`DWZe42nQFidPgtS0M- z6RF~!seHmmnI+`veL&9{2~EnRwP`MJc4{4u#$xwuR6mx>hmzM&WzwwC1`Kla-jbF@bJvJesQCV>y9U~c#k3s!}qrma4HgGhDNml*8 zc$)aFU7>e`$bd@4NTC7pTFT?v8UXJfWT<2?aVqbn9Io!lH~r@A z+V%)?ExaV|ZE$eFto4QVbTe54jrhdMKkZ!eZQ%0jL4IF*HW|)!Eg}bu+ONaQZJ;rA`zT5Dk|ZJljkMah zTACiMS@IaQpN&dgBOA^)qz_(lrg*CTD!bM0cG%N`3xBZYpss`EoK~}mo^`k_6kcTZ ze5pslE^=y6Lm%76pgrrY2I%SILC})k)SzJd-W&YqtK~?O$~FUZ-H9)1`xeXBT)bPm z45^==f4(bT1eUQob=I4#uA%f#LW{-ZSoV0VLY_T)hMIx3f{!Tf=cP)rWTqGKG;|H>( zNM+IHh1#f-z;I6sEjpRZQC=4mTT_!(@s`S}Vo9788PaAZY_`(gaj=Ji4dqIrnT^41 zz=PyQAz|S@$J@Cn8ZMt}ka%f%Iyi3#rfY7&?2u|*`k0u8CSzgGgeM$HuL&1G|Xwt}VDXtJ^+9o4hbI=KK-=^{qdY-|Bt?IVk#@Z-rXzV}XTX_^h62{3t3qHjzSPPB+78}K$-Kt~G% zgP!sBR5cD03A4!IN9_teU?IOQA||C1_>0$Je*YF^;jQ&mJimp??~gTK_WlgDZMte~ z3l2kPS z<)lT4**8PhoUb^mT7wj(#MAhc%rID4S?@hOZ#C4pYEabFq^q-fmLgpp$*Xn>!O^y+ z;BzHoC2K2T6~oRiM;z@aJ=NB+Q2qTpFH*-4oy;miW!5K3;~P^@PW_1EV+Y32Ex+WsmP}x8AF4 zJLnDL4*y=sl+nj%`I*ZP_HxBaT;>Gip0hdrvD!qY+p0O3x|>^b+a@)(f8LY$nVJR# z2IcP0Y7>=tZ!QE|@j9<#jFCr12p6F9-3;6&w&xcZYEsMJ!}xO+-5AXo5}lkS{A5Yz zmM^pcT#|uO@U6Sp$IjXq?g$X68pXQXqd`#LuN8 zo*uI3NSpb}q$bkdiA&RXiUfkdj}}}4-}h7EcPbpL<_|3Ocfc4Ccgej zD)PP;SZ*o;^S1KPDB~+oow!G7_c}ZfvwLZ(lllWtCAtNyuasAG$RuN(MlySS3=LB| z4P!5UOGo3b4Q7Y}9?~_zH30IyJI)XI+&%>s5IJ^XKwdA3-(EaQa zECGaoR-1;+({3)E2~P~-G{-N^DWiK@uUTxojs{E!iU$nxV&h(y-)P&Yw>AgTByyta z61`3ffQLmuO3HFL6DhtD@cI}ZAJ5tWKt}IUGom0us)B;FL_A&wU`YPwJA;DDM*DHJ zHNC06xr*6BIF(Qs$TQOTUY;|VH23z(CoO^aU-?X!@J_sC6Fr`@#37 zK9 zxeQH;{W+RlAMX9-+fxZz1GsmNT>C35j$QE_Zi{2agJwLB(PX!a9q0W;sUx4n#Kd8) zC=m*vVAq1$LVO!H>ze-%q=1iTXlD4~VOnbL_@Z9#{p~98g5UJc>RoaXn_7d}V}VX) z>V2qe72}a%yVu3;B%_yux5_)0xvCWy?{6EL2l#E}jp%jNp3bJ`%R55&mRX&_ z*1Tr&c+AW)Rir&eo2V0da?Z(Yr+wp{xrFu~^sL&iSblQkEpgVAv4+DTkhm-uG;G@mrCsl1eR6fg zW8d`42Z~rW+nwaOcRS4L-O7W3l@>S>ZG=<^@DaL;x)?tWCR7eXRPC%h4u+=$uX8@R zNcz2n<`qX>?28>;sGkqsZHu|vyiO{hSgNavRPbNe=c(U=FOqPWe?Ch-Rop% zFr>8ks>8cPxhd1U;Uu&V={;OVyt7%9T)E*!g|ujFxm~DFqfrx%-~mr&O>ncOi)*Cd z_tM-#a73j&WK0#Kw{=Vx`-SAJwl4+Efx*W2EvF2b-w9NDIcy|5GWx%ZO8iUfroDXa zY0n(Gt1`vJG0c@Qbp6MQJ3dFI#$gVn)4AKwDJ1I(B;fvFFa-@tS!9q&EhkGj9`l6T zekKpY>NWwnVppit3wex23O*ObMm;Tql5Rjq&-1Upj$nd5PXJq1#jhGjJ;w`B`uh4l zdS2%+hXLqq8Q8d(w{I^1p_CIq{28&PY1EIm)(tBKO^a#V`)FM)dJlTIs+7nFk;c0E z1MGXV{410>^r54X9zB7Wd}dT2F|D?=L?6MlBIe%;ASEgpvrAeV06X*!c*>|bD33;? z=x&;whV95q#sR6RM9EYwJ4&F^(;GmQR--)0RRduKYj7_j^6favi1#*TX#}R$s`=S@V z6P?H@B zO7jBV@v_7FfM^!ny(}yK{ps>W?arg`$ZMC$+(w+i$Xl;)a#z#Y**6QCT*@Q`MvuM8lnRdqeeDQ8;_jJLs zSXwv(eNyPHdgx_i&GC#mKTX$Q`e@lL$HPNCwP(5O2J4^bZ zpX%$^OeB*gpU@P}%=ccboEYuDmwhsU-;5qp+exZByf*|5?;Oqye>&E*BZ_#t=y`U2 z%l~f0#weV28|FFRjn!Q8O`B4|AlIDnf$w%?0vo@?WU%dGJ!=zLYD^LTbxkYB0G) zhp4eFrnM@tiWk*+=+uqLjE9$A{zY5jVb}cU1wyVzHFN>mogb`Ms$v#AC?4i@2JgUf z8D-c_lU*Pz-_W$b`WCvr!taxQlU2caA^kWH27}=iNPke`GtUH;Qn!Fpb_>XR3{#yG z{fQ#@Q)W4246&mhe@^%P70tIBS=q{SgCdaxQKs_Nr4HqEUfLzzZJ}gA0k_j)HP1kY z0wrkfEOr21zt1YN0N9Fr+AkDKV$7(8XKFJ!$&aL7Xk&zPupeJt9@kqWiLnwB6CY_~ zl$K6)_=o`$@psJ(K!Y}doJl&_IJMdQ5;H|xw!ex_KXO>3Y4!Xxg<1wild0M6T z7-K{?Vmfa`iVUQR+?sYel^;}!*?690!7GTfDLtzV<%X~=PJ)tkkD)`5cQR(l5t zRvZ4^TjR7>o8yi!RAY&R-b6nIKRE&^bFqKv6h_Ca%fujQsDu6bPRC&E0d0M-QzFsk z<9&V>5o=yTr&4(t=qOeD?oZPfep6KuzB<>ooFzT$$l8b$`dd0F__z_iUW>uzULp$c-!@(Wp|^Jb--(o zsY+i zgp{5+kqZHyV@>H-wrv|@eyh`JOup%2aWj(Vf_k}g-5wgc^({!>Uni~b6l^qf6J5O1 z1~*X7+(O$5xIbccvp9pUJViq(ox{WbWVYIf=G4pbZSmR6qfg;Ih>6jZO#h{_BLt{8bTScsC zZptto*fP!9g<%#faW2)a-nPlWtiqJEpQ-%{V;`5C!x}5ES4(#GI;nM-RLDkaFWns>71H(IZHG*wl zx(Y~+5b7rqY^(iN9*+fNV zyI1zpQWpHm@=qyBs51CL?DRbnlCR#?oTT2L_TXjlRFkrs`bjynGq)7ZD`s!7=|kEs zpH}V;byH+%@e1KChn`(w_`HV5g+eP$5RYx-DgvWwwmjYPKc)TNZW`)R(6in;iYbZ6 zw)rLK+}WM9?y)yTIbQ3X%5?t{>1XY}M3I_s8)nz@Rl_;n)b|l z{CLO^xibysZB2j8#9{t(=t2>*!f<5GD7bB(nl&FgkN2ApEnS zzxVmS;~qVw+!xu%LT@s=G8QF(?Psa(&T@w?7ML`0Yr87JbDpXp!}6Ww^VGMcYr zrGqmg{XXkWeX!|O=Yoj^XC_iy$F-BZ10xzR9D1W0(xaBRdr?u;a6y%&A^HXF1Q8oq zp(>K^z+NUdwMdsCp5a6Y$C(a8d_h7=|&*4CL*@Mjm1=OJ<(|`;uH6G+0>Xb~`c(Fa*4a^p{YmgB(O! zTCQZddac_+VdgV6M`a~qy)w%vRn9S`;VH9$LWPfCs%^{DF{c9B^xJ>DT()*-+rqMn z>Uglg_mF>Eq4wLf#iikvcT;%Ca?7Zg`=|{zLLYpyAwsvYB$4mb*1~2;<#<5ec9%95nY0esm_ZZ&65r= zje&}x3M>x=z4|sxRnV*W#+PpnzMdr*bPWz-jC3tG7NqgS zshxhQ_VmjA@Do1u%^4pCe}&{WUYKLHuNp@@tq#PRSv4E5!ieG#vO*p@>KepXZLcAH zrk8$LjSY2L+5cWngYGg}@iT7utip4D$RPNi-zmfhaB!9M&8v43urin_99TtWv?r?% z9XoqnJn^lx3}aUKbs2ic^WgCXkDd5C9UZmzx?wP#_{d${I}IjO2HdxP^?mlUmVQWw zr?Omr3E)w)b8|mS1kB+2&hZgMs^1OcO|zv9HKh%@ygM^729=YwFw}|2r^>Bkas699 zVdm4rj!h(YcSWUDHt=w8lp0@l%tljRJHD%>b~iP>rARZ4?BZ*cH3NyR3T{PASZ_R(}^ z4dqA!*i;+TVKi1p1~ zGzS~q``-nEVu%`g!=x!(8v9pUF!gG0_rt?S$?j)=s;0;Fk4ALgv-@DUAUeFwB5_z3 zwcgFdvL?#q7pm2y1~-P{nsnr|C{YKcF)>qq|K*XmJN!K)$`UbM_gmxxhWljha_ zC#BHNQ`LsOHRppZ;blh3Be`4YZbdC!?Kb02qW5!o3ks)!*{f287(u#pG=>}H8;wFy z`X<>SF$rY~OH2GRP6XKW&F2 zgGtVy8kEMeDQDLSH+F;Ds}5xo)p~>Ny6FVMHUx%xe8uJhW&iSj(FljxnVW z@`qayJ^I*flwTjJe)?;|C}k2GEk7NW#wol^4)Mv7ekn8il5QWa5paI0`k`N7f2J#l z57mFSgOyc@S;6kyZKXh4ov!q0;?|bqA1>6;y8(up?F{5qO_!_6lMxj^Q`=VOfOC(L z+A-oc_`jVZ2WQ>tUJdPXvFj@KIM!{bAHq{G^TaF4P+5sjVYsSf-}@qix&x+bER1Zb zo*eB+Dl;?(G!bcL?|y{5dZN@AI?b)6?rE14naGfl$KY$=ki&yf=oS|OL58h8nJ+f+X=s!7oj}a| zjH$YAUR!T?Mx8f{%8H!VHr*|4Aq(4rEsMg&gOwkK-vx2JyLL>$Isv~|K{mx&7TfL) zDK)jNY|36k$gySV4sC$pB25a-Qh&yu>L`WSn>0d4-JkzX0W9%=r ze^loRp8M^4$*H;XXWr<38tUlH(TYt@ACK*7v z#cZ^c$ywv7SS-snoUeb6p;xd$#@=_aCtk|d`2zJIv5o{1U^P*r633fOapszz=|6I0 z{a87^d?8c(0$q7j&wS$H;_QtmBp^ts4aO&^Se?k`utR#ikI0sz8hGrg|282rJp&TqeSWW8{G#+SL7&WcFM__ z(Lp&`oMPqUJQmh_=gW8Bjb?p%Ku9$=zmR2}z~IBT*bzawM*F~|v&K{{HXQ+@pJ+-;fR(DK6oTd#zB0 zz4=_Dp~$bmW-6VejWx`fQ6YX@l3{3R)$^}ch9VLlFudaVd}KKm>oiHl1aj9oiKX57tY%%tOvG$$`dNxJ z0jcFx?t8zOj_nFWnas+|g{%Woi2#{yXy;7!Vt?9+fNnfrA&g(JleUv;Nts)K`>;>c z1|g~o<=HwKC^XzX*)vfa5iY4UNdw8a_0#cU6RS&?1=r^{&A0f7G-Ij}rXM~<{TyQ_ zW{W0TbPvf0Ww}dNk5q2b6|%kn^F8eN4X19WOQ5$?2(>qUl74@vdW^xg#Brf@oyHF` zQHi-GXBNlsxbVXN#cJ%)NrAO(H~9=vq4%wqUQ0%se0G{8GJJ85Jy$gCWbrSN*dd$h zw}*mWNeC-GSKks07uQMaTnk>}@5|nr9A@-$L1jB27wA9rj%P`S25SiV<3$--O4)m+`?;OOEzjMc5T46-dJwM+XFVFElW*4d$C=2u@Fz#zywQX$5 zVhxGl9&1WL2N69y+Fc)B@FklEA{Jy;qPPqM5c0?Uaz+t`~Ah z`=f#bO>*8WE$bFn5CI^1a!7?UXQVtbEA#gtpWDU#);@&aOg{5mE_TN7p>p$8rBw7w zo`NQ|d>2X^!FxX1oL{|&BsVMG--71p;9ZqjX8V6uAs}yE-gsx*+_Vc9K2yzpQ7Ntx z0O_o@$QfNaHOsV{I1xaJJFaZZVZG`d*1n0uqaM}IZ!vxvH;-(P zln*&LV71Ia3@ALN5v`XsG7dFuKkmk97II%&jNo6={IqIlreeU~39m^nm)Q6fXqZ5Y zwe3;&=d&$LwO_{|XR%|T^qrb%nOxw?b*-ZvU_?J+tkP>(*gYdANE7 zqhAs0jXg)u)suZm!t_I**YdSOIw7ZAlO+tvaHcyKY%*?%YJ@6uih}QFP$ZSHWb_ZN zxVz6Ysu-Nb3D0MW&P$4OdhoB1)al-bZV!0krk5{874S)6&(zzBu2xx(K7YX+3ca=d z@YvRs)|gE@p};h?~3e=fI-z zwHJy7VCb?&V`pQ#PrYXwZfff2EP!Ujb;qjGatNEpenz!1pNz*&jQNxmy*g9J567IW zhTp#XBz?IoCZ#Wl|96Qx8JE?^B!0IaQw7kAGbVR-5vzCwcR*pO@;YXNpDvT>-P;qD znsDk!k52uidy8?8VN8tUy`G*PB3}St zKb4zkkW0vM+IPZFK>*M8j7eia(He1!s9@aE$JS_vuo}Q?t*#~qC-&hiI}@c0PRrfd zVFvysCCT0ljCgE3H}M`mPfa${!5MD@5aH80Q0dCCGU3pCi!Iz<9cvQl{Df?OdhuA3 zBht)n6_k~7U7z2QTYTfPHTmc+8TW8Lpd=u3c{hB|)){cL?y5pB)tZDZ8PbIa6lhGrhyvUwf-a%Os8{P2Kx%sx<@=qbT8%N zxvXPw<7B9HP^=;-%c0D<_HR$EK8O|QRu6N1L$L-BEFvG+_9uJ>+pnS>Vy}NCghA*Q z1DgTgHGqW9&kP4w%1~B%^V6qKIfj{-B!GjF)AeQq6xU;MpGgVJV3aGjj!jHxvBuiS z4KV4`;*7wk4AJm^QN@=S(EP4tQbs2Cq6x` zl#q^+G1TYaE2C43)ZLSFv!Ly;5~KV4SmMZ(-_dku2i<>_GU#Y zv0S0sIag)yTgZU}gU1S?wX{9o{&p%#wZ_>F|Fr{n z$H5#@UcJU?*!n-t8T;?Y`utqKSoQVael7k{ud`^%&3~K}*zu*q-!E5e?`uZW-_Jb# z&J82UnAxx|L{#tp=Sj}~`0tkqp3)(o_6s^0 zMf0HOrUwlFt8=(D_MZ>%`i*H!6t03~c-6y)4?pfLv^@pj6UlfEdH^!%FEv+q13iB| zigv#^<5Dls{X#&&M{VAlDEW;R3y>88fR_F>tfd)LHM{M|9zXsBOx=EhvV2i-u}EtO z=|F)V|5U99XKUY7g)JEf__34z<3yqs0Tdw(D2<)~rN-Hvop4Z6 zZ*FP93VzJ`76`)Z%{B&TZkdDMT^-JT0D{J?+qZ9*S&iTV#j@t5uGp6@tBOaYetv!f z6?lY%5<6EBL{l+on_Btcgnsi{CH+Mwf|#J? zor$r`yxX06=E&VQam5h2`|!;JsU$2I)Nvl9Ia{+;ek&FmivvdbZSYpT3mp5)Tys!v z_Xf~$u5%WusHgyelny|xJ_9?CwHRcb7ctNqXe>5q8#b4V=V&p6feE8AuxyBmk!A0JXm05sb&*>x=Z#6 z)J3U*ochV&?v>NupL`^K0&ciuOe&@0%P8houT*1`-T)Yu9w=#HyA&I@IGpSnB?2qf zB=i#j&sWgXC1S8-jQDT}D%Zn(0CE4dA_=p-1(X>eBGv;n5bJ0qpPd;2a2+j%WQ+oA zOD)$!KAtunBSi3hH%YAzT0Q@O-uNG#A~FhC-8Q$i-L7_CQ8#N0m1-?@Wm^kZ0%Xyn z^Tmz_0ZRo11xyLr%jGddbHx|lTW>~zZggo+tiRvi7}Jojw<8#9qU+wYNw?% zK?!~ZR{$21gF?U2ibq^)NBdj?H;BE}fu~2M*@m$0z9bq^?5gVO#<4MCgD3wZyam!| z`SbIG6{-YiK5}q3V3h4iGS$UtIBlh)gM;FMRRW^7 zt4qdK1Hj?DrQ-e(GNr!O*VlW>M>9ot9GCkU2?^B`UWNdDY!fgzN+xi#!hr&A_@(!i zo6Q4_HVT7(e%;_0^*`WMkRZ{A$z1zt!ybvxI!(!trEKYzw?niFVO*pM=$q?}P8yf+=& zDnE{N{yl&R7K5joZB9r?czu%r*zTeZwXweb)$?e*5rH5BPB0CCH~+vqC56?AY@(7| zm_nm1=^mJ${;l0fNrQUp$N@NQS$LtIex7Er=FY*|(C;kZS?C$VF$eI13;aR`C8fw( zj|aJZvDGEzjT^zl?C%h*)6*3C`ua>3w&vzR?05eWKup!$#Y!-bKH~vy)u*~Tfo)`c zI9POud-;L~w_XjVQpJ-grXm33V6asv5l$HgtU5wAfMWUsFnJbJRJ?cXYO~R2KUG!S zh^BJx#`)&~qSDhPzhMMm-&Ga@Dhd6mhbW-7?zq(XNVQO(0@%onvZnC6vEe>^{sF)a z$u?z{6JtK?gVgMGAY{=jy3r9?$KP-XqEgNZ7%u0*AYZctCft8ON$nee{Bmhj2zD%1 zl$HHCKRs|HbNiFG}1 z9xt=}j{AA6Ku^b~6+|f`6O#ZCSaUDdx>AIM0IuXJJGGL$FzQ(>^*Q*4DhdT$cU2qE zGJpOtRfvChlN#SqC7GWsoRKYEHlFAw(8&VKzoS5Jp zHER;r)Qp=9=LM51JUl$$T}e=Xfl9!Q1b}7=5F#z6Yq*}tCw>OA<@l+-BBN$i2W^aT z@C4PmfI@v5M`gk*OMiB?5^!&-YAQfmJB$YoNF>MlwPFSEH23ZARpeciEypy98261# zD3C$Idz*0^LhBPkf0*Hff#6&7MLR3&dqni>;j_GQ^XG}I3+Q{#{q88-M@k6qZCwi0 zXRR0(nx~v!iTK%X8@J4iV>t-L%0mPqm^}1#>!AYRSLW~iWB6{*E4qW1OmVh2{*O-d zznWNtnBGxvs4nUNPki-(q(y$n-=BLV$^T+r1D*nlU-WW}$*(^_q<xe4(5h2xD0>W={xO>k557Pd?xMv&maco zQU8eDv|lw?9?Adh;P2@~HT}B+uperkH5n3gHte7RHCVV5|V*|_?SOYx-}cP$QH8=TDTrR~`L zazP)#YFyr*SARy^b-GDslA+^Ov-c`kc~QMv9K8I7{e8BIW!`p}XF-Nzo!>QIqJ_j( z^%lbdHhyYmylFRhL#CWr@@_%5`99@iyP}lEQFW`jCp|JWwx3?PqgLrFSl;+g=PIm? zW)Ib{{BSMA{k=(Q7(InSN%*E1dU=z4#`R@bANE?88Z{nvi0!9Z@x-~UrJ%dPVaABB z-*?_fg=tZ|aPW41$ee)ZciA{zy^XKlJzZ!`w#JbmvOzhbSmUH`>M9?kp$~lxUwIPK zhX{&D<#~3jRiO<%KXfD16}r0D%-^#TNJ}gI@m~r5mW(v1`=HonJW}C2 zzKeui#q=f)5Ilt!1Vjev-n;kEpA}tTICu5{`=aKqv)5CZXI=qYY`Si3sb8#J3KjAw zjGV6Q6!d>K_XiHd@Q?p)nnc1s*)mzH+Fmg?HSt9+4g-A~gQ5i=r|a6iR1T$?-4 zgs?om@Vd<(Vyl9e;cR(!yrH1qlH!GrJ`O`=@7WIJJdbU|8tuq;Sji?{-h3T~R}g*| zrB*K{h@WS0Uw&=V;p$YTd)yP#e8+<%Po>;Y{;<&CW;Ml7Bm3)z681I5D3r-A4u078 z17Tr57ScV@(jU(^H}A05-(cbO1g)dBfHlNgAI~hE6*I_qIzIQrq+Usm;bp1lr?u#5&SvwsGgP*ZHQ1s4g0;JOtJ>7NE z{+YBX0FeiRyw-gXoYnpKsHmu3^YZ?5SsNq~@GSEjbzAAB$kT&81|h$78s@flc4YmU zpFd6N`!kR}V*%J#3l0k_c`!;TXUcy0xHwhq90vxQFmhgh@Ow>7O&CBjNDP$32MP^@ z7W-0!;Dq0ZzTiA~W;p-ni-Ak3kRWe*Nn^c$_FPUI=b=FbX<#Bpws5JhqiI=USZ6bD& z(;hMT_#)Q+Gz7_ES*lfd+qjDWiQzio`H7GScKSFSM(}reK;a&SfY_frziIW65rBYz)Y$8F~&JQtVb; zk!R#SYKSm^zg0B6LtsBLB`afVAMo9)V7~FF?ap0~;IBu)v*>EQ`%m_<8IE<)nC720 zDQsSv&5cz#x7-p!>4dxqEcu08efIxw_SR8Re{I{hqJT&Vl2W3Cba#mg2uL$@N_Tfj zD@ceibVzqIbW3-4H$zD`&&KOs_gdHQx}W#C*XvsPkIQkG+26g-eICc>IG-G&w%>Nb zKT900LSwG2WX|g`T4a2qU+dwy9p5ydv@8VZttBIm@|G6ajveVuOtV!vt)L{7W{92X zp8V*dVaW8XrJWXJD4-wQxN4_$mi`bKUb2r*a^-nkUA%9kHO^TF)PPlTUga2TbiosH=WHjo~~v!EDEDwDi^sU?-R@$lRV_n19C6skp=Kj2?d` zf>@7$fR6n7jI^v}u_7u1(J;&+cqIB0a>}Jcc2M|WC9SoTO>6TwlGmA;zgbw4?x0Y- z+#t_$QO=@=jVZF`LS%M#w?z$cw>OoNFmk(Tc7iF5k;Xf-qD-%3dcuRNi9X%LS!@MP zQpM(742ZOYXb-JZ)ukS}oH}=m;L;$a z1=ljg#hDm=%J`?fs;ZRvUP_>D@}*J8eCcwynyp#Osa9!O09^q7-Fw&UQ)5Z64)3B< zft9|><%p_OzYBXI@EuOpbTnP2Xdi}V{i9~9`Q_0^PTYKxX6`5hl#X{uT&A(V47VWKc@zF4F7Gh(vz{EZ_$U!j(^pbh4Qq`uf#JEgrhybm>u zz}#-@oMe?T5|=|g(s1$exyft;|FegmNNe7Wa7xbwrjm)v4O+>*SR`|Kwz9^JCYRy55-ysc*Dh89>r|Q>{3-Ym&6InK zSaXo2G*FqWyejBJEF|o$AP?y(lSDS-ndfSfimt71_7uvlSUrp6yEKZWb^Sf4EydKi zwEI70YcVoGEqOzPHFLcdE2;E$X~8+t8f|=embG8=+KkujxIkU7y{SU~qmh(RAc&N2 zMNRI!t(THG&QZq*#xT7+<6+HI@IKJ;DpbD0-5_&boE&&0TOcc)&+jVE0N2a{&xvhY z{%+h;?TtOR?6(eQFASJ%5~;qZ7CCFx9sKDy=a74p$`C=>nqIU`?$C{MfNAIt3p;^a zd_I&xXwbx(!rKGS%yAwBybA~4&llli%@_iB`K_o6*|5P%B_4YIR1;Jlw)FSHS)Vqm zb?T>!YWfRFx&N#@P^1fgPA6?V?Gv8j`03&1Z3UgqNHsjBR$1W${(DZWb0tQLVZYJ& zNGv(<_uE1}l@Benxc!#|-xOMcn6ZY$dVW%4*45XiA%U_N5@;z_#rPi8OAW9(S$awt|i$`rWoKn81cntf=k@26Gyo+S&o1%SIu z%Y?FB+Lh!FS_m!98y()4?~f_-61ez6XKf%PgavaGdnxZPmU9(WmUi`AYx$>ax^BKP z8W+H7J&|9(P!#Dhmj;nZno%#E+%EoNZe;xO-ub2%cC6Mnu^%0erhK^|I`Z(%&>rLA zjHj%%=^bom(V3NbNn~6DLZgTUV~%`GOK`HdRM{XU_L?pT3fG**79B>a}z_8h#D>9u}2Xw5}c#Py8he zJJv?duom&_e<#B&`uci%RYwRP7w!&czRP-8!BV*YirrG%JNoBWZ1&R|(1jO^w2ov- zdPL1AC@XAM@F>eN4RV7``{icUf6G(z0-MMBpLA{AUPI>rd}ji-_}sQIUzSy z?hZ53YN&GD5HCLqaLoI*rry6;VYP_7pPZT(Da02#$G)?$U+s>(ONSq5$Lr?2Y0$Er zr}2`HQNTU*9y?{hgtt1clhP**q9|Ru zxi$~wyfvl5hiy;F8AIu|)^VS@#xG*LG< zRP?3?Xn^uSF>`*5<-v}k65s6#eVg^zI>Wu{Hsr=~u14g(DMZH@O5%1_mxfYdo}~YC zW^z&o%wQh!8Gi-fKb0DL8lY7X>>XpDeTRXlzj}!V%!KWq2rCDRYZ3q5Yes?`lv|04c zN5lFOa1Q(e1(~TE58lN*n8euxz&!NOO1+NIP5`dc!uJ*zQ;(YCZFi9l#ow-_N z52g#xh!Unpk9~a6A0gXbPw$hjZD)M1Coa3Kn{zwek;~ZH-PzGGGs`RO1Nw*I;Suou z1%fVS-VxPAD#*sMcHq!N`h=vl+WDh()va_^k>jD0lM_TuYd*UBam1hbY`NDbniW@( ztV{1gRU6{@j~l}@$Xu8dGCyt4N~+$1fe;?Y)iU(9=}t|Ln5=va3X|d{c-XjO78rdW zk$x!5I+>ioC%2m4hW&I2{mw@yuSLuM3Za@cJ-F3Mn58R@?e*+_BeP1T$8G}OikrpR z><#Wa--RX~<;*kQEw_ne;g$ZVAC=jt=H>-*Il^+0xlpoNC6Q#wsg_}c9C`ILwV&8; zR5^qk3s(2Hvm!Xekg9~3>)Kf>tE~HDm+E0|x0C8o4q+y>K9r@e`T68)~jPyfmcO+E_CCO54beb>YmmYxzMXb-*LlWY^2=2UUL@ zu^$VS+7dW25r1WQ^rDH;p_@Q5T$v#r8ChC%09FWL5h7-r)ZOhrD!KK<;hSRPZ94In zySuGkcL@E2v0pK_q8xWy?^s(aqn(Sr`iMyJ1709|v7|wW)eEI}Dk_g}Ywg7fRubmH z*ilVw0+@(PVq3E`B5hkgYGpWsuRuet;wJ+YFpdMvSMJGK!*0q9ixzl)Y?fOe`1;JQ z_s3akg@31;!1V5(pw~CEy#eN8X%Wc$+r5!z5?ROr#( zFkFG@d3f*MzlS_f^vS^1`1I!9eEsFigM0ZAbU1@-G*RAd|NMRex<0vI;9zoBLANbv zU&$dx4I~MeS>N9CwEGQL7$D$KA!D49fTmd-g^P2g9zo@zwDy-rwf`sH54Rl`sQj)oe3bVN;866(Z1?uV$^Qs~g?u=7|)> zw7ISAI?(r@mjSqTkQlG!)0fG9M0c11UyPe*Qj(I zm|w4lJumH@b<8m@7&6hZh>E@GW}}_q6%!O2HPL!{6W4e9)#}{`oI7wG|NGp``+GEo zMYoT?@bnJ2VQc)NGv~HmDT#9T1%#L1H9booLj6R>RU9sgm>sjx#xwMworMnO=&GD6 zgm=)b1^mrMou6?B5iD&V3)S*BobpF^sduug_n{T-(1caTeR;+Wo zEPSL(s4o8Ne2Dxg;BxpF%x>lacVIfPsrh5#LI+8 zoV)G3qVQ)Q-^#^wCwSna&`L79g1n&`gL>DKmd3l=JfEKFrowz`Zxa-lgsgmNu!t;( z+N7eK1YVf*Qd7X#T>x^4_9b1q-_?B=G8|HxM)`nYby|G9v{#tXdm(1MT+r*b?vlSN zKbohTP5b|&SrB*q}+{~AV4*opl;da*Ekf27Jr z&wQ>1B0$lqvT%EIHO2xrYH0Mld2!!u-q>vMN9{}!s8zdN2@}fAhbMd8sv@qS;xpz$ zB~jdCS7Zw1zyt4a^}`zkxH67f+>xih69%@LgTpmRbKn(5=Vrdud=7N-ct7w*a>z{5 z<7I{PkKUlE{tEPjk*=bfvG-GN3fn1s$xMbl7b_)s9W|;$$Q@{P<%4-+U`Nd61qwRu zBWlh>c!lw2(1-xXN2Y0?>tDqPm~tdlx&BgVt2uGkLe#PT8CxuF z5yCo#nsS$}bl^eqWu><8H~h~?$Cab0x(a3GZ*7H2BKm#48X8yue-10`+t&t)dox2; zTZ8uU{*|gq+5Xu~M7A4Vw599f(n@p;TOmm|{=hedXbmYSir4iuhvht1!VFBWjMe#q z_kmlOo%MFK=%IL~qj?HaDyC``t~a^WVD3At-mNJ#&Gmd1b=T?0I@Mu4i4LSm_fy_e z?fO786LZMvX(R?Zv-?)4%%#8^%juT#B6f?V_zZQ()Y-T}u#V+~;pVZCqWWMmTrHvQ z>&xk$4l( zc4+?ASrphHjgOopp+(`LSx_{zaMmNF#ap+Fy$djeGtWEi@+&D}>ogb$BJU!M{yDfP*8j@_$;~J=&5Q+o=ms# zM=t@e<c!_M-t1g==fQ}hbB$rGnrKkqvhFx#+}n)g2{`| z(n~mJ|FTy5O)tNzH4?4aRWBZ73r-4F5m^eJ{4Ov`Iyek_;V+pC)mNU$6encRQ@WbJ zGS8ah%-sDxl~pE^_3Px%*?{`N!uCj&>!qMl?=9vPXM#wWTnPF&IwoqzT;5)l?I9_i z^i1LSmf)~8Nf2Lz09n0-vDTHCp;m_@-!3c@2Ir}J*sa(X`0Ww&g}!=p0hG+;sX^N* zBy03`mAu&kwMT#3h=xe!L!|6IZJCUB&s|bJ_IyZA+p3y;T2W`@S*tS{*ZDij;^sO{ zd2)!?=>!YG=iLt`qhlIBio6>6oY|q$0-!hvZ>+BsJGatQc)6sPj~|b%5y(^ARlz=d zDbnwrAvhhO>`}c+;u#K%j+krLSGTxpFkG6=mS?6$Vww$lG_kibIwwX@;hxpKysK1Z zzv{_uLFKS2fH>#*O52RB1eqh-Z$^fn#bSg!p?bjIA|_g`4w4^{)qm}a8~Wa z>)8JNIlSY&lTrE@BFNE(qOe(4B$OvdtZ*JBIYs9_Mm&+Ihra}@6GI>$8k1pnVARC0uxj>-fup0ZA^CZbpzmf+i zRSE+UTQ`h{B!ei-gDlu=i0qt15E z_ESao?61`02ONFz$RTYw7VZBYAnd+trkqw?gbq6jYDiR2YcV`|=63=VoBYMp~)))`;uQHp<3q09Ryrk-(l?dz~g}>%Cy`QlxwJfH`h~n<|uX z>j%F-u7(xCZT#ip`twl>1;%y@vRUWvt`>S)fr7Iufm+sG2HXSHlB?Hiq=j1h6^VLE z$mzw>q!zUSyWPL~CdQauHYH}O*Rd=Lci2xkRa_UZjFU^2b{>D(Ra>{HofO;<{lWEvqPe&RBYTM|H$(-t9B@Lb2dk*8C8x2ekOdY4ShMN=xo} z6Xt2q;+tE@>)fHV>VNsZCI1@IjT6IC11Yxv6}q26yv)i#l-R;WtbS5_7MHCd>-K_J zgQqdOl}-6BameKv#(go)7mKXkEiB}{HYU$6gSf4Tg@lNCvVf8y# zIh94U&kN@!O4KpY1!WMXS|~l#G~Ch&iABiz`+f@$X{tMS)F){W_Lcj0?gDe83F?6R z_vx0hY}m81Y%eaK`MS16gBiu~`bebcl|993KU$vK-!oj}3tTM0Uq1#Ee|3@(zN`)d zejOm7Ve@pALtXA?xR7ydl=c?QmYXPW3>31UsB~-8%O6UVsv69%O-9HMMud25kLEZP z(g~a0TznJq>m?&rSXARnKB`4%$c%~0Q|Ftg^n9Qw;V#Z;|7k%)qJmKJCsjzZnT2Ta zAKRO=d7xvjuw0#=XPd7&IrvdFsTZhmXw*7NMe#?&8D_+rlna9+d4DG>}g!%9DNs`u@y-L$ws0)My8xaSnDoXs961lM%NOyec}m>MZf z>~*vM^JA&;p;c?E4HxU+Lb>xp6;&0Tvx?f}V>h|TBQeWgCKI`|*#s|AFPsV_(w1q@ zuY2dNrK*kst@JjJix$JXFy@)q8;>AFxXMRb3*1)DKgp?*WH@}oZ1MYp0xQ#QH9Hl4 z6AqAdxU=QUZY4PH{n;ZjJl3UnGh418l3omZXZ&@YN4w*R74+`M+K+CoO6$x@|mB4}rL*jc$%%H9d$x_chBxHs+{X9N<=H3|-A zRX`}~DrUNfCzSVN?rs>B>1&@#FW7kKmVT<5`Keq5H{|{}zA|NomQdWTqw0^%GngUb z;?8EmkkoFSfWt>^S^MjK)N--3<+t!op5JiXfjpl9mZ(EP&mQ!j4Y_$ffzv!eaJ+#$ z)^sL;(Q;p-qMPvXairLhOgSOcVEwM}0h&ks3tstJfeq*iLOn3`fw{rmM(H8`ZMJg# zD+E>aeQI3$@!71;#jKXZjVqZFw(tdbjxq%kscSmoKOac0gk9pSKNtFl;kxWV* zs5hd0kOB+Ti!%MDYUDVWjs&kdQDpa$Uqx1tsGE$SBxzR$w&7OGq^)4?&9kA6<~XMh z;$M4}84{Jda5$-iRZu>6cWR;7dUa}yVaKrJW^+&(R2fk0bnt(dd>7wy8TEE2>y@{m znVA`GFQ-!iaA>t`ylghw(wDqAjp@{w1v@x|autk!_W_1;^!vz~i4REJzY#59)q*s; z43A!aLVp@AKh<6iH<4_Bk1&oDrg?ClRKHtq;G}w}f8)}4LWn$3VK6SF|ICl&qCTRT z#P$=g4J+9F5+?$e&;hZ1J{A>^^`LE?UekrgxVF_PVr#?3%CI*;teV!T&wC!I^S1A> zW}>!mzWL`wL(E7C3hhQ$C}&2nj!wZ-75kmK?R?XaY;9Z))YW$x{8OXu6GD~wfp@!t zxur#0N0ZgpkLl?nmI8%petlT0GoH&rdf|}o2eCVSkzaXpi)K%(A#--Q85&G$%)eJe z`Ub)vv|Y&*7W#f$uhqxb`8nY#j!4gjlJ`Mfo5m=-8$BpzBDT~t(2!d;{vC7eYfDW}KeG)Dxs7ksyzxJ-d%<)@qy+qR_19RN z`1zipIT}3RDf-=@J^OiK0CYHeCA&Qu``j4w8sVO|Fd7N`t^f?Fo)nS9&$;xK4X^VW zM8d}9aA!`F>k1Is6~x%ZE|z%)%a!Dg%@t7SDicMF^%u)Pdp?G_ie+1g@r%5_<^g17 zIEK9(rEt#0hfNs`xqMoMS}a4pIyDLfUzps=`cFV@b1Q@GOLzv+9t+YWjpKMyRqEbZ z@8g_1Y7(`J*6jpvQzo61bNUUv%_e9qV1_+@VF!Wq|7L%Hr)$3@By zB{4)!_QPha+w6e&dh5V8$^gZWLe=lMt6`TX9EMAaBEGtt@Hu28CZfY>yUYKL!1pREIYTJ;TiPs~BBa7qA)zHz@ z=dfCHu-??9oIxAs2$KNj-}5st#cMYkR(#b>!hd?&W|bJ9VmrTMy0`t%fmY|wk8GIr zIW&`@cX#{~VnyC+PbeYDi)KnqwS2xb6Vx1V;WAlpG*&OnzPzTQe5xat410nZ)+AA1 zU1WyW>+iT0{7Zw;h@DaHLC;l%Z-&2rp$0dWham9EQj$;SD_EQsLz9z}y9=Qg@fnfl zwLUHD-7*WcP6IlE%jct+QbbW6^duj;UWRoA_HSvx%vCv_Ee>a73)wE0@uy5yT4{fW z3pgLV72q-(@71Y(JOvztgw!3MO@-ubrApf~6xGaen6yA9RUF$5u%aQsf#j@>{xUos z0sG|yH3VsPHdS=kRNS#__AN6bIS5618H&kM`A$7|_MH0@D6u$e^g1vgNwP^&Q5=${ z6ko1SQbUT%O4_d(83wCAqg@*IY3|0%xB0vFFhrC6$@Dd~A^ z9v)#5Ir?Y}Ppxb~9sY=At!G1-kQ=lciOl*%nY3k+LkIF6Tn}Ezq{AwkfBV-Dm8(PO z&s|V4%!6udUeXuPkM%JYaQ)IHm^lII27js=-BRHPqLbJAy7{+r2WO>6#YhB4Mo#ST z%vi&>2&;!R;Er44V2Gyf-8#dVs(CjZQ(VkNJH`~y=r!%bfEuq)-=EXw) z=7Ws{!asUph?Dh~a}bfuM>7FV4?H(7n1&~(bcVI(hVm6CuWx!Vb{1S&)MknYt%$5z znAhR{2WRN*RSUH#@Nn13@^b>EKA~*&thay6i=`5=LACgMhvN}C>6$6dBIWDU58ph5 zM(&F_nP87bnT-nVX92h67$)WgEGt(^#xp56>+}MCb7EE>;1h(`nrED7tyEUBM>>*# zD!HOnDO=%(nt#6}y1tOqj`|^xFUHVII)X$J4{c7;t7JAmbcK+rXh*SDkJXK}8?fOvXLA}AZYB}kMgFSnJ zm$}DvlBY@Pbz=ODEN((E>ZYbwJ9wi(j0=OCQ0 zUS4>d?9M0~WC54qGte_tPR`i}omJD=9QjF`0&uvV1HF#Lbo32}6ZE#ElLKn@I<}RS zx|$o9wS#bIQq_&X^z|B^G@)@|eJ(Z~qlF--6a9|*ZVAF0J5+YlfMNAxA}0oonpls+~wdW@6|^p93&dg*7IS@6DShx3{<3 zXJd-%F7o#9SZZD-6`~bh#E$+T*eB7YQ_UKl_T7N|>D!?WF|z&U5Nd*<^)rGAlNb+` za)W_6ZC&@uM!i`}#VeQnYj+gSJ08z8*O;S;^uBH3il?{M}v&pa@;H^S;! z3d1g*QoC^_Du(Q}>Hh%wCd=d%}An<7V=De=A2_|wzEk(->WCT2z-M5j- zW@f!sGbCI(+UHj)M_;H1&~q%{QSiBSmRjudx4*8` z9P|CUOa|Pm-+FxzQH$L#Y;hByE-40~tKiGl1I|d=GzEkL42-yloK&y7TUuX;PYpKC zC=$U5n}UIsIRna}#7o7}ki^79$c0hYhp3_Md%f#yL9Fo?v3A4Fsk(zZ(2V2^iZgIr zfpghGcn#dY^K6IS2cTV~+(gqtB>EuNb50B7!0S(IriqX*->tSD4yD)Y61*k$HtTu{ zeR~6NUI>yc=+uv*6IV0VI_}B~E2H$AZE%sX8;8e@sCkZ)8l{Pb6x(g|hY8~G3<$U$ zHvzMSBGN6ehFUMRAf8OM$Ih>Rto^y;H6;TY{6h^MZn!C0z%2=+g?rKfUYHTXX%S}{ zh`kEkr}O1X*Q~9n$)&eiIb0~!b`llRc>o44h<^}Ptaij+ov(E&y5u*(1a8nyAXt~L zr~<39>3BYXx%z)TF4YFsD!}t(JHC8qCkIA7om{tK3S|?0!*-AEwZ7Q1?Kdd)L!uqjP?zaFDeCFwd}8VH5Vxvnw>U1eMx)YmeF$Pn5~r-o0EHM2;z; zGu`g;)A`V9RxJ5L64H?V+qd=gzx!$b2Pz21TmOlqPIa;Er^s`Pd?nF;bEkd~$GErq zzL5q>+9QC9@W=n_ufGxe3&T6k`KRgK&|jpOoy)`ZpFY?Bl^K>wU|ol!$|MpYHslFKga*d2Q2?Mf}FSudzM9Rx%K}aoki~h9^_ZgO~J1T0}{%e5y zrOLddM_f!Ch}hu#<`y6Hvj+Qz=;OQSx8G#n5s?c2`!^wu_D=&jMb61H(jUdPx~g8U zY$R0v!vjtXwyJ+y#{a`A#tqQt=R59VS@{nX?f<=I{=y?-Dil?~Ku)b&!TN9h?pG4F z{~HH6fu!AtQPcl((a1&oU-7f^`cpdqB7I8W#<~Z&fIII8y(;Uyg<|ItlT1(%UI!ln zpqlS480|{DatTO>j_Cj3^zskB{*FZ@A}0P06u~8cB7j2#HIB=w5TX0Nc>(aLu|r_# zYctgbXJj)tP4#Z3fHP3E(sHi1q0zAKg@ZdJPl@Bg6Ob!%pz=2E0Wp|iOt}B}5F=Nw zua5?3xi$aAe2F3cYy*xd7WZ@Os9kp;x2x>t0ndr?42+>0%76+&pl}#9xZ6+I^gB~Z zv!tqlp%6;1iaxZM2P$~ztcR(%mr)&>%f zbnt=_(%s!X9ALAN;A5V?0<-eu1^`Ugx`Bg*1yW9wbCYZBw|vt5{y`K(rWKp`#BWr7G>-Q(9_Kj(RW7@szA8RO;sT-WF zef_UJ{<2ng_oNp6kz9PL=HB{xz<`O1e(VAGvOqGv`x__V7ux>CVKPjCTcuTIh)zsG z@`v(2z|hx(Ezc+4hi>UzTwUdDDCWq=x-X26D+yd(TzJ5sSlHM;_c7WkRQ%wijA7PA zVAQJ1mPqVzp9V*$h&KY_Xu>Q2rG!;f2pT^8W9vv|3hI?2iSONJ>Ix;{Tio3(@EJ7d zj%2Bp25)}seNTTs#=SZRFopZT@dQ363;&rj>Qv4+Nu@eBi)M4h^Q?0G7t5?%& zAXl$r;{ce*cV?@fgYxS=m=!5#Oa@AS$bd|;U|aN?e?HNvGWmalT!7Y0wJ^cRq?A8t zRE-DTGQ>_pxj^m2*LO|cP{Ye}??1q+$aG-TAUr)it@64P1Z4)!?hQ!8$TNx+;{6qk zGBI7O>+1@Z22R6=e{9x&`PaY9RnKz$0Xg(LNIfL%>P`S4s+~f!=7= zlv`c^%e!34+lSvt1$d>^gX80gz^5Jnh|W}t85m0;(C8JNU0ew1-Hz7L?`a|My*9VE zBi$FK(O>QUoz9huU;`7kc4jIusihNSkKRkhTB5wV56T9q6u-d-fIc4mE!+I;B{%WAN=yo>;rcofSm zU>9-Ep}o8Ls%6XnK}b>ZU~huMQSHsT7GxjIMhu2focV2@>I!?#aicG?ZmtJan-g*-F|BXFu{O5W4 zmm@k>1!DqG7TgsuFOCe_^OPT|RPLd1TJhZV?-G;jveKrsCXOl0+D59B5|_%s8r2R_XnDG1zng#)Zr_)Q?w`O9>H|VvwtSEkq@p#6kU>* z+sbsud!>g?FM5u5&-WYi$c|2EB;E{N4T-ex42YQc8 zr-4S!Jqggi)={!Nk(i4Uq12&^E>~wOxXKhuLZhIX_Tz}_2_`C6?EuwW?&rbsQ|{s= zv`kF3RCTQi6Pi&AWm1=*nx<(gL{cEowJB6CU&db5h1$&FWtP96U;bgSG;lKsW5%;+ zrYvPp?9MYm?FrRwLra4lSiHw6iV(_W;6@J`$8(i2_CIt8e&ws6R)^ve%ok0j`zMm2 z%I)Gu*8qchEwiT@&$9`ch1LT@wv|OR@GW6cN+Yrw{f?pHkfX?ZU3dMccyrPvpTA%$ zzU?YzCh@aWtamz zy|`2n&Q2Rg#z_;gGMq+zZgM5ee|*S!&JSX*k8_of3M6p7(-Il@ZxD*tcOdlKww#tS zAF(0K3Zmchw4aNx83h=-RBuD$J{A66CE@&Yv$?ulo z0d*}qfqEqs?OJaDm+sP}-4$cz9v|A>pzItk4Lt)(wge(Ojm85)bA{%c3QTB1{nv`< zLQykh4_c^5{Ad3q@bhY&BkP>B(VfF7W`yNUQAJq!Qq86!-b9U|OpRo;k#)%EjxRm8 zam4ug=JftNx%>z$q|IOh99sbx^me-oaPhE$I ztZ8V~IeP;Hbo2BMJhYKa+N5Bw4EhrTEYg2KqeTy#epOEUqzDKI;VgQhirKQleLq0< zJSqh^GNv7Y8vP#l>&6BExFZTS{vU%eyp{!k_|CJFKnbg_N5AE&e`Go5>O%eaEp&K}Gj)Tlm0@}RBHcKXhXcaSvtEUsmP1)onT15(Z#k%2 zk4l#I>oTGcFF%@ZI0qEW$8Fo-X zv}N2JV|51Q?e6?jLE&bCQd6SR$*kt=fH5pQ(oi8xlXb+XnTKBXmKea7d0lst^3>8P zR~Es`$?O}RU3BwJRG6BT#?QEHg*TXn*G@Q0H;;xYU3uuYhh9i+&_gtZ`rtwixBAz{h1L_hcU)9K*=S)2&p zgQqJ4WUQHyEM^1f9Ze42lSuK!IBASv(Ep@tZ8nKknlv5bkSPG82#-Rg;nf z=xNZYv2fHx`QUXn=al;h)R|g8n=L#*@KX~g>vT;_z5yCHr|G0Nf!pRCVy1wAz!)b; zsCqkHZZZY~2U%Nt2oa09p@6!17q(RUFXH6uglCT?UV$dVCZM9r*A4|}bWNwr zBVUZN*bGzo`PH?x1zUC|@G$T?v{UyDQ5K$nc$x>e`K?M#bVlyYjQgrBCfFA64let{@dvmvGpG5NzrGRL~1v*o*iKS=;OeO=Se%2uv z#XwgBCCQpropZ#UC#>3Iuft*_sSdFZbsU<%Dw%OVcR}9N(&o1%I>HPU9w8lL-l&C; z*&uz)vzf@oe7KQn$}> z^wvz=O~dKPD_gec4UB>J^MTe#(io)pdfY{sd#$$1$I+6gr{NWFSMf=GEXV> zJy0wqn`SszpI_y}jktxyKLkd^IUe-2?>_Oo!lNduY2_&(K~gGwrdM35+w9&MH;$pX zUeIdi)hF-(7;Fh-tNHN~c(V{9?`LOmg4tO|8(?KuBk~tw~5p zb)S`kpxet<5X-5`YS+}d@v3>X?5Zg5ZN~VJ1^!^U8;5>Blyrc!p1n*{c$WX{Eq?Z> zxf51>d&P%etku>R=Oh)M8Wrt7B^+_5dIm~tD%-J&UXN2wUtJ2D?Rt{UyZZDpZt2}< z(imo#;r*WSm`JVkCmjptadYLjV;jLU#cSy+YqwZJa1F8g_Rhd=>9FL?4E6FI!uxyL z657Rp4xPyWo;)ieU5zZ4nlF5yOp)5T@&I-@4;R{vzR=fB8jwLXv$G1mP1%O3r#f!V zS26R9GL9OyUVvZ8+bvvZ{)z;VV~u|-;lG~r)pOjwbB5Wk!6UC$JAzB$e$3V4 z@A~Y9R41KhmO@7#Dz13|wT74RG{?i#cO0iOceUHQ^-L3zB5yWPP`jyEd83~DsO(kFSM571`&=rF~=qEVWH{?G zBv(;R7(RKv6iBAneg>eaRA8vox0K901cN$W?AC*u#0qFCY)+QE28Pb`?!+Ph`f8`% z-=_2Jx_l~OFwx9Uv4i)jY_sJjgvH@z0sGBx+7(9CZE!0ZL~LIZAPheMm*EObWMt%Y z$!H7!`rc2o!qn^f%%oYvZf z*Ha0>Aotzni2fZ%#{R8?&N=H^qXBnCB;a1-Rfp(@y<6@>B|#?9w;revrtJy4If={V-9r;}fmTBz5Ajc%5k$$5HtWcCgtx z<5OH*{>39;bdv?f(=s2h(g{UH+IJ$H!r8!F_+4<65ajdqO^)6I(-Mf?Tk85T{}A)L zPxJqkf2qB?&Y%^(l`06bmWW3>f?nmijwIB7EzIwSciPu=xiH|CL&GimOnd!4H?wJsp?rV3Wog0 zr|o{171k!dUuqBwK567M>vRl%JcH0C%}tLz>Wlq1zljnXC}m)Vrtec*%opr$+8rpF z&CEgDiT2~ny@H|>?eVeNT7k0qc@01)@_t-^R2MlrH_1U&*3JyYn%)%#gXs_{(D}cQ z0099@6Zn_+hCvorUAEbHXtqTfmz@^e+{($ z?W2lVFCad&f{>E?i7pj|y-uE2rxw>28_6+(9=zDK>?ZOp3k%FEQv)&z7B3x4k0_7U z>K~--`ZanL(-IbrWk?##Hr^o^4G4ZcVL5>-qb4OaaFfOs&{5F2wRJzQvTf7UtlS<$ z)!7_GDweSP7DB}F`e>_FT-?ZO;ia#Er=WMu+2`5*4r@O0D~ZI@n{`q;^*rW7+<^d- z8@zT`BAVxkGZuC?7%zS%gN=fc7o%4%uQ#sP{TDIby9IU?cdl76V#uG{)Y6rIM! zO%I`k#b>^|m-KUf7n*81cTf82gC@L%H*4+L_-{C3r!AQ{#_EC$9e#hi3L71u$)|@< z!3rEk>%-A<6mlY#xsqK!Z*K3JTJHTo&(pQdb3Hd)gN5;<>KiS)n$CE8ppC4H^M#vP zmXdt1q$Y$}1mVja5t@}5qZ;)8ojo)*bH;QP*2F3D6!dk(@dpzQ7Cebvo^ib7NVA|V zr&S~1(yo)u$R{y3XReXv_++L*_K4Gb&HvLo3-7Pk825)DHVR5-1Aqa63@h)waYk-u zwLe`UY2Z{_Rh4aktpj!uy8DzI&{=s+{^#I;S(Ua9)NZsZs_Pg1KrCx^!=`{n?A?or zYr`RlJa$MR^M`|Qw83`msc0B!0c;Ga!KB^5&uKC32gtdcw=jJfR21`QdR1(&^o9`& zi?r&4fHWSHpsvAMqL&7ALExu7DJc)qMDqH)wz~QSuTN61sj01GJ`@9zM&Xoc>YQKa_-))jIKsikfQ5z;7j$(?*gf$6P{Ez75xub}1W}eI=%+ zmJr4S?C2w8tHpTNk#NrUFW9%$5T8e%bW} zgZA+56}i-K()!0-@4Mm5hY{*(I)gz4PtZJk@2z5%S%#bEXD=WD*Zp=(8m`BW7r1gm zvCN#7Aa7p=j2C=orzwCG)0%3>VK*=2PX}-u}BP>Q9m^a#>w&p6g z44}h5Z#T3SS4fAV{2jeh9->xcm0_D5&xGkYSt5qW-DBj`JXyoBv_zEsC$nU#D047@oA!<}-Q&}=(Ke-q`#Ic(&Th4O(M!+LD zJZ`UDqJ9V8G_zsSb*;FQY{c(Zo+Pmp(tIKy<#ZKSb8&kdcI*%%67Snk)JBrt} zmWi)`|DhrdKVC4QQRb!j$RvT5WUb=gXT9H=uMfs~;AP>-r-#l53CM_|47F@bnMtmL z2G(I5qjJU&O%3socxuezXPs%a9%?(aU)pWXu}`pPY{8zja&U|Vl+QHCsDGW-ezvFO znU4B-K!_j10%^Q00gFx!=BT?$6Ng?Fz&KHXpNFHATV7R%@$`vsl^lu$kZK0J|DuVk z3n|ai#Z6S!q|`mt=h-@_xgVPxv!TwBuU_qWUGF-mOU-^@gofEp2NzABJelly{7MZ#{NPsv2DjP?dt%3iq~ol-upm zG`uLff~52;EJ{g?%Pjg}kDjkhL-@YV?m={(iJH%a(1gI3Cl>{C>5r!+l_3wN>E8Zy zNoI^fZ^%)@N~_#&9*1*rOq~5dX3c=LeT{?IH%svJi_Hh@E|$kY^epe2geye4Lta_9PIg7g8X)X}s+z$a0sFlFm+ z8ZtdYLs|yH0A{`blj&?eB=QEt{_Pwl@v=}jA%_kOpW`&yR7bw=W zJN{h1D@k}lYdBrXKVu^;8fC%yO!>QskTPN|(BJNvC66hOMmMI<(G?`g|6&B>?8H(3 z0STy3R}NcH9~nuSSc6GXAGrX#8f`6(5BavU)H7jxdc~?AtZ}*-g?YOjO(8H+qmqW(FxW4LFb{*=ZyQFPj-e7<_j8bz~bHF8!a~@UR-iWti1YZ{{et% zaGUtq%7wXJ%geXHZ(!4=TzJ*Idj#F9^aLu7_4f8we;&VnisZzfAS>1zAj~ zA6kaw>{{=-exA`8xLq6?oEU=;G~v@C`*F%Vm33PXRb9Mo-biQ7Ff~Q?KAz=<1wfgy zg&I6j{x8?2DPF5dWT~sDWa~xln@WH}ws%hf;k=y!&YO8g;j7ux-7R6@8b-pW)c3x@ zBHpke9|7^H4(JmY&)4x_*OqN)fM%Krt~CbwSVH{v*wgH$7v!3} z>UFLegbeESYMxQwJa%gWT?IgcxVVIcIGowckUC%0PQu``nL)RHV3$y3TZW|N`O1Jt ziQs82=k9Hntb<`Z1Z3;r3dW0W^}Y<&uFR<@ndXBBgbCJtxpf=x_onqB3af8Mg8J^AJYl zyJvPB|J%T?#HC$fPHnfM<(^(W@Mm-a(?ntFWw6H!{*ylnJ@i2E0kK!sr@F_DeH1zj z6xo_IPMp5gd113QB6o4P;hYeOI*d_$E2YjTDRjfgx7;2HdYGiCcCpyBodnn}Ug^T# z?$#b#=w}n_GtEQDm@FAK0{Z0@{zm%k=DrAVj@Hes2cFT9z76o4YNfuX_MxY#^M;J(Q=>CVBSkfx7yPN>~*>pW_a5JcQxlmJ?#3fzY%^TNa26%w4<*!lgr# zNDc-A)#A}L8tKxm^~80q!Gy$i5Ss@vyad<&F%9E;-O_Fp7ihxYreNTroNGXM&E0@F zZp9s3=R!P`E{<}&?-j5XeYQvFp8*>5Q>820C%;;`hN>kEJ|#@Pkc1LLnl}nH^K?$) zMrx{a_GeuT57{W+cnYuQ<+_P_fd1QzNl1goMY+;^aI{Fa{Ik|I=VwY*BgrDtWsuJ@%k@-$ zI1uKaW;~vU|MP#&e$J7@InMB@JFn|~z23uC(hP-}HnZgWZQ{NgpmbNToLv_*@if3z zf}JQhy@fsJGi((HE3a++n?zLGrE8f|*7r(sO2(xO=1Ly7fU;!`Md>Pv>!~*CFMD3n z@8cH5SuQ_Flg69y5;AH6g0y(D^`<{l)?1addTBf)YRwE)T#A9@jBn}zC01$KwbSV@FkqQi2J%>bJ0 znPUNmzT{*%6L*f837fb#dN4I_wr|g8%0`ozRxg2Ox(LrMMWY>Vg|#3(0feF98h+Ab z-J^ACv2YO4<;s2a{K92}?OFSi?Wd9XYBw$B#NNPIQrTI()L7nUo>0G;hCahc$K9Fl z`X$U~7%N)ayH%9bj(r__0E>P~YKz2jrag<)b>!wMl^~#Fm=;-2Id3!5o|n=veuLg; z`q5|RqAt<(i$sV4yRK+NfG~KJkhcxGf=BduK!bH&guWISMPpAg5?X9e`U-a9^ zI(m)ej#Kh{6=znkjcREjA@k5Ldv<#&njIHcXSMfRPd>^uWGNtI4yD(6_*-ObC}!5+ zv(pz+%SmXOFu8yLr+hl}ruWH<%!;)6%pp1di`{Wu!nB`6u?a_^)roXh8KvmwlbPI_ zO6zIR(qS9iYzOY|?V^M!$7G%CTVK{c&mW$k7pB+=W@Yt-b+V{G%G^0hYHps;J$TSp z>RxpE8#^+-Q2nVM%E7{wUz5YEy*~aPYJMTLzcSdZ*<^9dEuXQzI*0S>YD8D3l*^W2 z8-AS%q^!>6#JGf%{^qnIP!@RnJP~pCi>6s4v@|Qx>&kUkWlPWHm9IV^HN8b;C*wPw zdz`LJU~3RsAqi&f#nzY@=s#oqz40?Y8b1f3cS=|#^SZlLHb!^zmT*u};uDuXYuOiH zuh8}djEsI&nKE2QCKg2ag8`{6A+09hG?XvU?iLAY1TDd&iN|F=tsg9(R8bCeue^8;<|(L!R$yL530w2X?@BKtdzwRLumd+4DW%@)(}& zAa1vN_onvONt1U@To6zyDFSXCm-NF{trsTqliVnYnJ22-PlM9^ zsbj2h+n9>Pw8>bpV0Rul4s9|u!RiP^9A2pD-d?bSMP-ja{-X4w{G~%GK5dCFm+OKN zn}|DiKFzy#S(_2A$TC0ni-~f)>w3N7)M{=8&MaBkFYMRWJI&SB`QGeWOZy*OZLan> zQ_)8(uKA+M^z;XovLtVTlP=KiyvL8&0F-Bq=}`(!{f=u4=>!54vk%w0SO5Wz1oKHU zzn%8Q*=ETUsH?BMWRm9K;Mh1t?yck+G&kAne+Kxk0>oW9T5+FT49@9tD;`v3WfxeC zM}1wqx}>1w8RM#$&@7r!{le~j+>iT3ro^{oh-ZH204~maVrRS3=>l}egOE*H%6T7i zAUy8o;hN#WyBo84C=&^bvb}_P)5YZ3QKnr*+GS6R%ml3jSoUQ|c!fLBz<<=tb*opH z_@JtC=)NC&qEd-@ZUBHg%Y(l>B;IXJ@G8C4Cvl-GUYybzNf0|ee!lQ6)nrz2y`Hwx z*d}uGC6H^rwu^}4M0xFXx);mPtpg*8x0+DqPS<_K@Oir3-M!}}e5uB>_QRdI<%o4q zGhz5M12f4qY3g2->7tuK)l&NTmyS7d5I^VgB$Pfpy~dm$el(3<217+&X4O!m_sPUS zpr}bFp=tLA$?B`HTMT2my3aBI+hVxU+kNi5a}9d5a2sHeC)r~!d#|dT*LuGNjR3LI zQ-F@$>*H+BC0zhw5RbFNM?kBC3lKNgO826Y^jPf)KAHJgz{Ur))Wu9UB!Fb&n&55V zdlY}RbIo)8vR4579@aOnX1_kEiNgXS3wnHVw%m2nX5VvY%BJ>u4ljq*-$0>w#OHo^ z1b@jbGgW!s$w;e7%Ta39iE>|S3V$)khEzCly*=H}E&K@}h?H2x-?pHssj01JGic>` zEmc?EGltb}T0kCk69_B7mh~~q8OZe(wB%CDfjlw5Erx;H%9FRjvu*Y|!Uwu+86bL9 zu6MJmSO8aL%%c1m3m_bFgXU)<*WbMw>;YyaZ}Q#>P4XbztE|Vz(k4lVqhngC`XwJi zuvcpsUG&!PySur)07wU}YvDfXZ=m{X{~ac_t@CS9Ba?U!{a3%o;5Xlo_!JzGq4xSL z27Z=4bof6i?g)r310-$s4S42>>|9x5!FUA7WU@C zJ2UJF?IpjSSg5G~aSw{_kPXQ#Tx^q;rFhv375N}!rvAU;jenCIQt{kQXnE!0LaDSI zH;n)DUugBWlu6tF|D}=@Z49L9d5*8r{wwS&^K(Eo|%|EHsX){4i+v!dxBr*!wP#-#aFt1vpE+fqlz`y% zRip~C;d!)L%*r_zONLlMUlZLeE6s+bg0&jiX2h18mN-i`Yrh9fR_T{xu9Jq%zm?8H5MbzCTu*D0r`BOvxk9PZO^m^6- zSzIgu0fE2ryd}U8JkPrs4B3LN8+U-bHVD)_bp5vA{o@|PxPTx~?XC}~eiC$9C!B%W z**K~LKLzFM+_9(!*WeKOpJUIp6VhiO3%30EHGI0_+5pAF!=vML`cF~2{QKd*S!@)N z(f)s#Z2YUrS^ePIL%9TbY!8#4V8*S=sOg;?LF5vEm8$4Y^f$`XXRy|An65N<9i2<5r z8J!FXf4|sG0Q9&A+$JFL@nnF2@TJ!sm?+7Z$pV)G1mzP;67jf-3SRr!np-QvKzST< z6c9n;(me}00jT(U$2)WH>s&Wqc>4o4 z5WvEJ*Q*j^1Fq!9gVU}8z|FH}jE-{;bHLm72qUF`G)^Bgb+so+$KeniNjXu$kH7BL z(Ki{WS+z~gztw~UG;fQ__Aq_d*X17w0Mw<_Y=MkT*B#@Q*IEF7|7H|h^43jgz2h7W zgt>5}k(Rd<{q7_SsU0eQW{}HcuGGuut)(`O7R~5#mBW2d5*_6~nep`HFBtLpvgv(y zS{WbSueAGQ-9Z{97^U_DR<_d~JLwiZ+!bOWJ}|T&5f)O0hAeKjjbY#3$NZWJEGpuA z5pAD;oC?yhKE4pgoh{6Z`b84`#>2_&hYBfil)DOgZ}QWK$rE}Uclt3eu3)qf*Sh1} z2z#;o=OQ7|+w04xyma~_AQ*fYU-03cYEE_6IO`6ju;n8dx-x0v@R|1Cp33p1c&09P z`Y@`Cyjy1s`SrXxLu^f%z8HhBxAL+Eo*0Q91?dHkLQ#c59&)xUu7q9#L{T{ z>d|~FSd%e_zui4P{85G~&UbwlL?{=ZkQ;|<5Mv!=>q)cMe@T{rg5t`!zc6cYy{k){ z9y-SBNj)0E(Y0ikD1Ii&=z5yQYdogGr_ADQ-f(!crQ8=@wmw`xWRq~{hRl|-iyPb| zL@kooih7axZwuy~dpExo2aA0>kyu!bp{A@%br`8)p8> z%?|2S$=4~*uadNR@NKXwlIlye-o(fLO=4~^y4cRukwx9*Qwc;Sa`H8Es^%#E03v<0 zaOYDtysa)ioZ{P$P9chS$H4&QwBAnz$aeY8=pZ;R1={oo(1%+x2z+&6ZGN}joqKbe zf1j1jmHlL(iHf*fz8_#BiXf~Y^DjK*wcgs2aHJSHVC8s>vNhE^C`}|Fk zcm)tY`b2PlnV@%Q>ZcUU<-oXrlsOFXRlt~(?8ARIy9Jaua4|>20wR;QxC~$GjT0qs zihb94$i;<4KtbL19xiT8gC~v>t)js>(s{S*s4(O<+o9f_GLBy1KNnnWWQ449S0Ibr zT7Vn83w<6HvU^O_QZr(6GrC>(X)LL`4oN}+`7eo5q6UMqo3Gp2|0)8FqXgJt1N!r~ z(4_LO#P$YGUGL^m^zKF$hcqxkbU#VK($gRS?9M6eSY`5ELgi!*Dk*;H0v(&-L87CmruLxla^>2!~PYm>r8A zpTvuSop+P^el=d}f!grqsvM`QZgz-C?j)3Yqw3Lnxh{lX`9bU(!LQKPiw8w&0gl}b z3M?N6ZZXVE1o*$c;g;4!wIUWEfeS=~Pq|)PRNajJ{nJo7b>jvBaaT}!&bV+jZR68P z19d9f#04RS&bRrH+XA0=WKJw!lgpIU8J}JqJRY9Tb9;0la=}`8Y4u3d;NF!Us&50c zX6IP<$V&K57?RIinZhcTNTm6ApxL)a6>A1Sb0$~AEmaT*CeZ1B$5^>8 ze(wrdJ((dnC$j zW&S8XMxbM8B4!w|QLYvwL61CjE$G$#lP=x+ce->*cYyL;Se$izyv`8)p+b_q-jIf0 zjo*n?WY;Z9>bon#Rjlx?Z>h9MlOMN^&Mx@e1*dYJrG_w3)kI?|q$aAQcgU^?+-F>6 z=g{{E>jy1GuKF=I4r{?A+l{V%D{h}|Q4i14-++MSS`@@rptP)DNvYpV)WN9=eNONM z<)Hqs##D~DI#i$K4I}HT#Gde0%!I`=KH{qA^Di1mcUihOMe1mw#4lV^7Mk$d2kt2? zFWZb#%#%wWsDE36Q$(f;(6&Fa5!P3I#RdH3qJj4sPbhGt{G!|y@$;xXPEzg`=><-r z;;icQ2o2776t|;Zm9mqdxogWw`c+3CyvbVYTH;Ij8g~;V{!Spp+T2GcSKZCk49EeUwA$_HLaMFddgWkBNc_<&I7HP;YhFAhhb=>@(@faJk`oFC<{`wXQ4Q*5o8dvIh3E7z3Aa_Dw;vV099SYtAEEkBf)&pTiz96+s=())|h5h5frQtyHwWxW*e3>OORyIn9-ee{8nzyX}mp z?{9tWxdU`uZ`hPbCsX+CB0xS$S_c72Ry+=0j_NC5!}N4@-$V`#3@98?F)1P+fXbpW z`#IrwO7ERnArEiwf~VJ|9%H(TnfREK;jckO&zoWG7it#(J85nDt_c8IFZR0V@;@fi zGqA{C@+8p*BEVXdKD$8W8$MVklPrWvO5=SX+{#ue@d>9EblMA)tlh?Z=|E=(J|;$%J0|S> zi#es5Es9O+=ko8-N#<%+9gakN4r|Q#<=yPmU!%?Z_!Lf^-w5oPt7Az=+Io9c#NdP5 zVOd$P^|Dk%-yU`JC0?-@JaDfxWbzd@P|+!^sFqB$SKDjv9)G;38215~O#-h2X;UKL z5*%tOkSX?76}zY^dZ#XuIi2-Eg`BV&6gKN7z*+PATGp7Z@un8>?3+t&fOCMsn?>2a zqXcG4rt=A$Vl#vK$&8VB%E_J0)J&a%etW7dOL^#!Mn85%lR#meG~IXOY-&NbIW_FZ zRmU04@7>1b?%UvaiyrTD*UzotDiQL0KFMf?WEbUUd)PlrYuvWy@Amw)?@QJ{_LKNc z#Nu%E?ygUfc&2zJXDxfTTTc<2@ulAF`WuXLj^EnWk{Go{XGMPk7bt(YcqO`Fa?H#f z&@3?gtvjbjKt=mA)YYY0kHaOF$~L#$*3iVn#Fmq{r)S;@hj!&J85#|+CmAU+kGD5DfUsRWsDSuH>FVwtcC-!KX1N{@w;^Y;2{MPJ| zcs28BSf%bWU_Wf|u4(sLCIctW%~w)BTRucQl#(x2ySZPzI0FKYF^fKKsv&f0Qqs@S z$~eN^o*(>MW~yvLL2QpIjrEZ-C-Ef_WC8@)KF~kMSEG8GSzj;Wb+S_w{bOcE+fD)q zw$-3gnbfh=sf6+$Mn=KzM(yDBuf(dv69@#NR`2fYtkU)PKs-&<^XFEYhO;h^lf7Ax z9drWwiQUz3<^#pv)joLlY2wG{pdA0n>D+vdLJxOunHMN#a{Zd#{p%Yb7_a;u&HV^* zW;d;j|M2swJpK6AJvwLo7+SG>d$jMb;_*R6y!wH9gXckK*1)S|#|J|*E8H2;PY0{x zNIo9ihkpU~gBvH^$k`qXYgj5_`NxBYcG4n9X_UL^1#)jgr2ESB5SGBM^V!$J?%oGU z5f%F9S2=c8R(Uo<&W%wqYJ;kv(CY)M21k_xRkk`H-}EOL2~w2TIIV=#S+T)i3|eJ~ zdXAO#B0|Nf9z8@UcC!cqZ05M)+KEn6%oU$vVY!)Xs7%aFhu1aFn+DfS#l1&<^q||v zd|9U^RWd;SFTL8D@@i;a@2P-iqY;{agpCu}?j}BH4<)4G>7;}?CPs1Nn6z|;MB1Uy zZ&U7=OgV-ClUp69-zd>)p9iwBKNI2-j!)BLN10FA7TjZx*BcSu6sY68*PzOP!#ZBxC}YR( z(dfz1x*>VZlTD^Js+=PZ{hDAI;>`OBce{>|PTl2$k5rkszGa^52tiC_E?)tt6D_t< zCNeWMV)~xdPhs`c@XY)C>sO;>?-Nftf0eO+Y<^m2*kFuDY?rOJ={yBptKr#Y>Q`Ri zM2?-PF2szT9DHfYJoC#)cq~PlCge7~#J%aa5h;tQkEmJkN*vVh`Vt!RQ5a&h zJP-&*Yvu%tkW7WyMIe_1n3bAjhg5D1KZ(Jb7q6pFU1{83DtEdH0ttM0U~Xc3ldIaY z$miuyba>mk&mtj)%V9TA|0+{VY#m^q+U2A$=QPel$cGx%l2)pFHSvj zsSWKOW@2B*84yv`3 z-=Z!Y2CdgH6PK3QfLCVmiQUXtT!7*0BI6$sR|#f00p}Md3;qMML?B+lUlRQ77trS! z2h|h$@EUfT+!gn!!K>p%vyS=3Nr|;~#fD2n%{3Xw#0j?hCQYxW>fJg0kW07~b6|Qr z?>n?`JlZU2=AVp)M+Yi;vt#{v zE_D_&9Vt}z9)kHIlF}$>;6hdu$37Mw2CD+r*-D%( z=p>-lmKS10*|0uD#;Ts=)^4*4JmyYC^qabB{5cFN%oT1+Lnq5jWK?^D5s&nF^;Mf5 zdPIAsr-P{05LUfsQD8T_VA?=l>pHPD=FYj?QP{r=FWgCl+UGdSjr~`VRbT* z=}NDUZoLp0l4w6YOZ&rCUYHb>f>#LPW&m~8q= zWdxv)OHYP9Z*wVq;v&)>V-2BewtYuFhidr-pH4;DiG?gRbF{Z`@D2F9s`MBTzu@`d zu%qkw!;M4$$7e^d3L@f{TpIO91jcS=J-p6?A*E68hE*{jkk z>U4kL#>;;*03p`CPN#v|pAp**p^*Gg0?6F3#RMHJD6IxQK>$LoaJo zpfAL?G~GMg3YP;BXlZBr)d(>Z(fx#T)QJ}UjHlSL$<9Q9ir_u_1>b<1=a_>bwi*Rk z8K-B)S0NNsNilR1KjO$lN|#z>V}o^gG`uSFl>4bs?!4;Fhpw-XRs;#j29?qwtA636 z{ti>2+y@ibHSBo4@`U*E=B}EZi1Tf;?hojhKKtRP9GN}Z@*&30$YV$JA71(Mf?Uql zR9X8)jOl=jT?`7Cv+sZY9Q2UInQCx1)7%(B#LVj2JDerSfw{PoK+K*d zJ+GGMxLL;8glxm2)Y49$&LzhgPfG5~WNTIg>q(wKQS-oZldeKp8!e3kJT7E^%MPwoSC!Z?R#4-e2@V`B=^gK zg`&+~MRG{q;8eKDa0=6JszPXVXi0E-ZH)L?cN(2B|6|NaLN;OC;#10sH&kybD=kOb zu!ubsw%`xop^Oq8RF>Ow_0{ceU~q8a(wQbRzr)*YmF}P6jq}a_d|SZZrIGhMetNIp z(tJ0ClEmy`tfUf7EU1pLriE9n(UIz7p0~KZo{96-F~W5RvUX@!%>dA!!-B3v>2wnV zZLVnJNRh2VC895`0*$jWlAiZVB>3nNvK`D!gG&;@6`2B}gHKj6z;2u?{Swd+W_UhK z>kFk6g0YlEzoDkxOH|Phy`>kYc-LnyMLSc2y0qO;95>eSb@0I=cEL?egqAyHnnfqy z5I1DyxLD8o<64(X>+v9(AWV26k^G9GmA^Hh@hHO-D$2_4s8yhMs{p;`>N#nxo+*2e&vIU+fRKJ#JQPtFk=w=4hVC;N}2Vi z){`ZstxMd&BN#hzQSfa}R9!$|A6@FdUQqIF7En&ijv`^QHoe%7M{U?hw%Q`(g;b3O zv6}s|8?+u%^hS`0#4Puyo-7o_4JG0!u-@qi2$yrbj9$2pQ|EQg5u)I~=Zn#&B;mJz zrzrnUE2qChzz}9vUI*g^6kG1Z;ELZx2QHsVXlHXrrrN#FiUdNlz@`3p_I4p6La1e& z%r8?>p2KGjq)^RB3qT>iRZ|7D$=!dN+k3f&O2EiA$ces_DarPv?voK&4Ut9Ch-~o- z2Og16x65>5 zjOJONv|0(h${IK^iwJqR4Xxx3>GP>nPb-1? zaEjnYT1le6N38?Ag^zb;4!bB^((GK4pKWAdh}PVp;&R&H;WBqKo2A{5S{_+~P<81~ z^oreDiF0t~F)>_>UDs)1W}_GNzV+p_1cYGLIwkH8uZT8tX{R^W=?Y&<(xQ0?UAPnx zC&tu7pc{)6Sxl^T>*NSUY}w7Z+;vAtJewetwF|Vd5O7%N%8-Kh^CS?l_nDlANKs0d zG}bn|ptM9ikd&G3xzTz44nL|={ZNOpyR)?iXijN7TPvcRzjs!Qn}i86-(NN~3YPTQ z&D8sxLThP+9cjJYGF#)QXkJ5ohzd2KLy_O)QA&p&f8E1Zw9HSaXHPc{6eH12e! z-ZGBaw43&!4t|eR7{7n(3;P}R3_PuJ=B`}_^83dJCTrBw9~nH8&(j#rr&Up^!C?&? z8|Ss(n-===5b&425)vEdja0tPqcRuY#qj!)epAEpNTcJew$re;OXt~9n_8Q7y+QVK z6*%~bebM>~e&uF5=iBWF|7X=*i^e+rP;=S+n~Ip4Yh=xsVZV|7B9OrKTKF`yc(w`d zFJ_~su}RjQhA+F)g;)CIZFHsVp6ljDQl-zmtNBvYx2`5@IJb{xqae>W`FDCiQ&L6=-cd|VQA+rf(rUsvWnq3!{l9RcKXF~%g@!!6ymDH`*exW{x3 z78hL^S}7&;rPJRDC-$P&@p*Hpo|=}9j2{b@aQD&E2|0IQu_v#|7WW46c5hPGm`|`k zl2vn>Sd^@c9@%eFrg0aHlbKuWYnQ8bn3TU5)I_3_rxBAjao}X7Lqa(LFN)C5`b^ zre*8BM1y>;N3^CoYl(QanS+6wiFQLOV5`TdkTMo$vJ`+t)VWAKHTX@laIy*{)e_-x z5Y;UM3S4!^`vfII{%{H@QD&g4Upx%ne3{tmq`2|+(Pa~%uI z-MS`?dTr3lj}0Gq zK2~E)E+rjF3U;n|v{$@y)_Xxe#7>n70m*2{aC@Qr|IMM_px{cj$F zkkLfvh}cP*N@nchb}Ag5DNQ|W&TW~6tN z8eMG%i}sb#@sI2?mxhE2sX*9z0iR{xJt5z4qW0j(ketIIaBas&OV{_Q&h*HjZv0Sb z(0g<-3v46E%y)ga$kh!&2z?EF{C1b=cB)IG_p+EF-Y+rBg=36*v2%%wG(@V)w2P@& z0o!ZfOy8f_G9iI6v3Xa(UN=jhqJU$U4nIMwj0bjlSM#h9z)@-tZHswqIww--TBFzczp zpjX#{o`4o}mz^hqyziY9?p(DHoxS+Co0;(u_`Uv9jOBx>*(atC`Y*JeD!o|e?yv9C~$;H^va%^i+WvP zb!Ax0zv=+|b)HiuL|XHA1cYsf)5ZYtb$< z74m|wJb~}K;M6t89o!cENh62%o6^ z9|^}i%7u@|p06)bxu2Vb_`NQ%dWw+LFsQ@&7G>HS*F#uX<9Av2DD)>lu>r5V$qOmN zc(XEn3b^vylRCvT59QA(F7~{XgQuIPF(mL~^E?;vPJf;@5uDIQdQYR*iQ4A0znQD> zSJGd3?wzxBv0d<~)-PY;aEcEllt{cINOUlI86(UBGK1D?{g4SnLdWW<&hD?W1qvc2 z0`ralMZVXyZ{6oXiD-Zvg~M`R$;KDQkCD0h3=-Ovk0Dg50@F<% z`N{=o!fu{0EbfCfC7T`MQz-XfMq_l94bcqr$9BS_#G9uC-=)4V|KK+DFpKO7r*h^mF8SA9H_AH6QytKU z$rBLWd_H;{Z+9}uF&iugw_iLcV^=PfSAS!tc}GFyO=qD~fx`DE-+JQi_{#8gwWjBk zx*s^14rNZby-(bI&U|-rsbO5N$tq0r2T!)ziS_qF|=d+cccA*L%cI(}$Uej9$ zkFm$!qZ?-l3`g1j`0_9sLWFOo5Y@3~T+e>NyG

)gM_rN)1I`oV~+(%)g?KiT!rZiWrElN!lcjQ0JM=Fov( zh43}XiXG7lBGu-9qge5N7iI62rG#ISWIoQY8z!+S{T8xSrZPhhYagqzspQNFE`AwtnOv+z|51BYHN5Y07bIR4LDvtu`mH77?XRz9$BY|Fj-Vxp|TxNqg1 zLHomkEh5*?9ju%2w!ChJ&bLvGn+^(ko7Fx#N(`jFxpc{eRpqmf%d?uB^VTbnW$BvN z=&HlJqfm~zC8oUfd~Dk3E-a2ox!9$rcg4249AMZfm3TnHALGU)R>^Gs`Tn!eQ(GTO zpGsXUHr(4}T_b%p78u(hciYjwvxOH1nuq+o`6%}u%it<*OPN=M!{y2#Uj2t3LT<}b z66tOVe})O0dS^E`r-YbD4T9Ne4iVyNb9q(sKsc!vqkk?i2xbqpbVr>u?A@^9HJ{Ak7 z^te<*JWIlS z(ds{&lJA70)-?DM+HbKMlOKrtirn$_qb7q-Yh(z#!Ne4#_n@9|a3%M#E1z#Hfml%V zWiRK1VsW0ig#hA5IliOvE}%FsLpkH-F31q(9X`k5w zt~VO6MP9(F zN>s8ycvQTaprltVOYcWDU2R`)qPR7_Ot>)l6Ev0Ay#sUb#NE@E;n>Q6q!$a%X< z2i`q5{Y29uuxmB*Ow{HUP;)p|(+0T+z0*bBH7MFRnTjjUrL-lCNv@H=HSJ|AJVF_nr}yq=Im!M!R7Fk4 z&z_Rr@>EAkj3d~{oOV89pIT1%t&F~pBP|c*me&N!tQVOe#=s{kYr9U0)aW8VvQLpS zN+sbvb2m#eP2i);CY4kD*I-1O#o_N~SUH=n^ffkD;CvI4318Ie5mArOEQ)d+)DVN> zRNy?MkV=*^ZZ}g|7!jAhi6tG>*ct2FZUe_VwP*M)B$AqZKCgwZf1n!Y?m&mFvU$Wi zMdQ^v^h6hx?ysF?WQ+I$YFQ>jeGu+7TraN*$VaGyDQJk}&_;^9>|>bPL-G*G*Q5!c zCzb>}5#oF1Sr->h(II?`7QF-6iw1%%>15d0VeCJzXaVTl$@=9S{GO{SAQ0mMWpi*8T9E-)BViM*dLm4Gl>HcrTBLc?zRJ25bK~XjV^DcD}sL|zq z=!o=5&4@%21vCKVUGf_7B^ysX)I?cv{$)s|225~e;>?3B0Us4|lCy&pjz-{&zk9aU zIejTl^8^IYYEPmXRVdkeN~InMw3mvglw{MF?=KmqFF#zh8OTNC;A~%=G=YLyM7hwv z?&;VeYEtVYi{7-Fs@a&XZ>L@p**dl`t$AOOo#z<6>#%2yx?&HxNhW_{*5n7hh}g;F zk`{Vjf!#m*q5{V|M#Jd4O@5Xy<=0Rq2`zzmnZaZth-eR#@eI$tK&cN1rKE36wo{2Z zb*$_iOYx=DZg!UkERpFk;q2O*Gi8}p%niNA?$WVOie9Nu9?9safBc8+!BP6ml6ekN zGnk$i{b1eYM86#1$@3BbXLsXJ>WWN*^C#x!u%GkV6TMTIcR%f=!(;zXrjl2PG<~p2 zHa_Iq`joXjJA9Y#j8&YZ2C{Z|Z9man+if~68BdS;Ek&0WnrXCVY2na2&Z^`oFmKcH!SXokPIZwN_7;X^ zktPJY(K~dkpT1~Uq)mKw+OHC5SIuIjS&uxjwH6B9w?Bu@EVw+Q(a2f!nX(rbi`{E zoF&@Ss%(h4#W(j#tgbuw^Fw=d69d+@lcVl!NjiY9!mk%BF&mC+a<|&K=oJ9pc7UYO zP!y$f{Z`l?UEnNqKvt>7L9O>;)gB5mb`69O-Gu!!OpB#IZjq zD?m2wS&?7xUH$X50B;R99KUawRCFwy`87#sxb(7~dWzVgx#0l8sN?*u)NI>IEFFl58o+ zphf%LQ{g63dlnnb@on60is8e-_U#Z0C_xQX9Sc09J=E(fgym#+QNo6~1<}FeGzM9( z{}3V@OcjWT$Nt^!CCth6SsYtV z6|@Al0KYfJbxeTmbK{pZ0#J%X4369@6z<8k;Sx4}I2jdeFOO}f7KWE-lTth6oZcns zAmEMGI+B}&uJl6_(gwe3JoJmn!z9-?q7j_$k`p9&s%$|zw_Rs~89^@-b>A(yQM|m= zdGu;+FA0g(^95>U1sLOM_@X+PM{0nBjE{Br-w*%;e&2=K0g&>S_a?&Z_BzRG$5E75 zh+j1KZ;u$`wc%DqAPNz~L5h&}FjVQ+of~r<(uQBkT7f?l&W2~6(yIQcsC^m9Q|y4L z3pJLop{BCdvB|1~2j<;9GT@syV#2nCbX%w~Yh=;f$)hZv{qRWVL@4O>g(LB1HFf2$6 zMNm@{JvYl`t0bA4Al)|xYPU^Zbi^sj&e;)#razO6R>Fa|Fju5RS3cWTG78ozjLIGsdM;zMLzH7g z3d%6G=CU~bQ;KfkjG}#rp-;k|Ga6JD5Bxn!wHDP~JMXivh}@4HQJFD>Pr8&AH3pPA zWni;z-~F)Ab`l!PoEfS;Up*U3sxdT6ud_Ctum~b~h$hh_ZdCV$P{1?S6R;feR9a-L znjlxgrDJ*Pw_PKcW;}m>XJHba3=aqW1x7nbT^hGLp=~mT0i&?||ZkLqP%{Rit6%vy6nTe-!B; zV2Rsh+?hjL5GkrPMiu^#=Zp+?b`ET4e_eT`-z=gDNM9Ro%`asA&OsupWXrl98UjJF z%-5(;kFNmHEh%v<^=X<)Y|98^NbwI<+5Ir|$*dqn#rOWUn+5xVZ?sKP*3VH2l^yDp zNy<}K+QR5jE(s6iTwr=P=_XN;Pm~kKdVj)!p3F5$HS&D&6#Fz5GZ$YK4wv4Sl>E?F z3aUl9tb^$tNn$L~kmoe;zATbre}QKrN_`?$f{0p8&n|inm(3bUt$y6KRG#oPN|cJ1 z`3PP4!c=k)Zc1nCve!!Bd7_YzL}x5$qpNnt(AyOre0y27 z<{WpAfWHk|jA|D)qW!QpOTQY*wy-T*-8qf-JuS*ZB?&sHkE_@JT#!tg_qzz~V5fam zL$o@=+!gK=g;eRv=vi)~dGd!c<}cf;!JOyc?Fhjvdrt}h^F{qKTV8Kje@;BaAS3i0 zyGoe00(JKsS?gvND*Ktht8~Vst>?)wGRagx4UE+|^Bq!DtTHIUW_rjygmc$9(LZFF ze3#%bpizzaE}jhCp|UoHZlG8n#b9XK0c}E%=q?1Qi?Y>oka&L*4)0ejy z<2i#JH60zS9Qn7;RvvH}7j46Ym-ff71@un%37fqgh625Oe8k9mA|*LF-tBm}=}UGc zzK;%w|5iJfZd|cLB+%yELqASB)7pn+^KF6$d6I8*olBF_-umZ)BQs(yRo9!pJjh&i z+ds4gCbEh2sMmNx_KdCQ0>dq{Ep7EVS$!YL{YSs564Igbf zUvLu*X-DVS=mhHn{SR%rqXV1TMjWaVCuY*0H*le&Q)Yn{kitpJ%tIoPJ4^d8`kE| zbn}Uk)~u?nDrr_OmEz7-JT`VTt;ooiattuZ)>;YlVnvQlyL81j+^uX1_M^1;fd1sk zmKdLC&9h1AIODz24E5kh|AVv?7|6aKDgdsq^`&4;Fw`v_<3ZdDH`sOLcut5ZglI3Y z)}WuT0{Wc~!o$ON*XQHg+HbAS!OQ}k%_@OqzRB4+(xLBFoF@=*@$Hfk<(uJ$FMUH` z@0N;@ecambu|TqrY22%J4A@C#VVq-gB@*m*IZhE#1)g(?)*Yd`Wj5cO1!t#*R?TWj zKV9}20!!+h)|E$F!(%EEB8pw;_d~Y7IY>$TC0V_E0Ira)cnRx4z&-IqX~I}i!MX|u zWZTSgOkEjGy>cIlts-^Xuk0eT&p`{wuOMW4r^@21YuqV`8nddT35|M(`pmh=UWwYQ z`l8E!B3mf`u~@zr)gvd-c=s8N3;ouYhSMZ0+`}S4ZI;_r@%SL-CdH%-d%fak?^=do zS@vL^b&a__8gv69l7!AW(8#zA>3DR3NQ&5A?W}8u3g#%N*Wn~Iy?|oHQPhfGD>JGK z9b3w>`9%89>P}=K!Mv5NGpnC<2h;XDXA74(a<5V`N{0oqeqs;~yz1mH81*w$KZ``e z%;y%bcJr=*1@&&)nW+`ZRByR|axc~l&21pD8I(8B=#?@D189f~kqaVahFVu(6VX1J zh8CuO^D?SdDk2~T$mLwxBemy87vG?OOiOqycBAs+Q&9*v$D{9W>80~BQqC_-W*QCj zW>FdLnV@JLAM9{xzZx*7J%Gcy()##<%18QV;<%mm>LOgam{BP9VgJC;u)}%=h zQn|KJ8pXvCArBja50@scLWRBZyt1>tok0r2P>o}SEh3A=7T%!N;*iFf2K`GuLKSyN>`#)k6`5|gFvo4Bz8j}d>|WcRmlC{xOuXEc%ENRr=CLPucy6>n*0zXO>#K&!QD-aPmccfcjC@+x-+ zEXosBo`qlE>nEww*<(v1CRRq3%ca?*rGJ;&Y~Scc9jLLMs2n_=XXxjhJ0d3k-lcZ) z+;H|bBX8bJh>&D1 zP@oMWSwxeFSy_GAJNVQTPtADgoFGsOp?qT1eNK0k&bxHUGOJ|Fq596ToTsalc?RJF zaR_f>8SYQB+j$mK4j}MpxEHze=YoB!)ZnmrbvWA!Nb!ZL(?iwFM|N50KFIUdkbutq z%*h9ser6CQp!nnhky?Y#E2KD!o~z$ykH{4@&+||l7w+ZORgbYaA=!{TQ(H28mEtP7 zUDT}i+c&IIJQ@WotDGp_U#vyD)M~f*)r7TXP{l_nnYvY}qY+8p8g&{cS}nUBiJ0G( zJ$F~2_VOIcmA!%5$HE=v+SE z|0mO5|AkZG{JQ_&MoRqtnEwHW{EU7f5BWbkJMia={?AMPcfYXNEa9n8jG+-WecL2H z+O`uu58JoowA4fxwz>+(Z__5z+cxKZXueF~VOZ;ziVYV2U9Gi#&{N5kZ~JYfWb&~6 zxMA1NCGek1i)5GltjBPATmCljbU)YJcO~=b&*BqmI+-c7?bG;}{h`#kOtKdRUjAyr zn3(=KRr9Tlb3giVGe9;cEit%~b+j7lh;?Olzu(KgZ>wHcHuVOy&{*Q9J@ko2?iy?mue0xj2Jb)Vxc2(2x(6{vsMI)~O+9^RUO)M+d zALD2h;TI6dCnecR&__R_|EgdnYQw;a(%jRNQOgtpV)reFl#`AcXYbJg6sDV!Or-7W*fy^ioq6Ot!t9DmkK&+uL zfP=L`8tHZkWS%C`_k=+T#@bBlEfu?mx^E1Z0Mc^e)g~qyj%6gcaR6;WY7R2x9{St1SEm$F9HVeX zrGG<#kcgALf>g;QfTFcF?cC>AbJcqx&q`@3IdY&k^ktc@>3rOL4Hlox4c%aGNlTJtD0vir@rV0`C}2$bP&nHh@rXR zK4BKu2Y^8RLO+FIP--;GCrD9IA=W)R3|%N7K@o~H-z6+rP**-=(0-k_09ucErT!6x z`DiP1?67dg(IknUAyXG?RFi$yU%ycODco)GG31x)7#FN%pTO)={gX%F9y9RiH6MdW%-Y^zyW2N`G zNOa&Jv5FuOhK!P1zaxsUXOg{An<&!@!?001 zFyCPQp`baX6yEsIRSOhQ&qLP@F+Hodop~`~enPLjkyk-H%&OhhZK|l#JiI$l+t)4( zKKs^?h2a|jCz^gZTO)g5hV@@S&Lld-(WR~RQ+)8H2h5LOq3s4j0SluDMM_)*1<|0s z(LxJ`Ai`?St~M_FEEW> zH!1BnV299)OsAJNf@Danlh&TT>}IKPjb|@5$Fd2W&EOub(cb^^6?4S7{8!6b|5sJ+ zih*QT&w@~>PqMN|=^Qh>dfT&AaxntwZ<3YyXZ6r;lenSRkN?~N0acKtx=b4tPQSiOuZXgc0+)KBl*MU;|b08wsR!% zU#`_$7_7l0$n6v7iFuw3@nG(8-fyKs%yfxZB!9RQV(KvlO%Q|}AagE>iMHH2ZC8?R zWifI|p%bsu0N9ptGGp>m87z&;V410Jt73GH@TtTH`_3anmI=l_(4JIB@AmT+GCBjY zJ06oskskl14e0dAZRwX9O2QPcu3A5WgpWjG9^%z^sRZ{PM~(}}5zKNibE$tyXHm>- z{}dYlDv4NA2d!~5)#UYJUrjZ6KKuY=1ooOv-Yg8Vn>-XDx+gQESA1&!X$QbU2%@?q z1cB`r)_uE(qa2pr*JyGKiR-?!io_plk=d{Oci6gcyXJDiy+z!!t>F065kN0$-V}o|5Z7eS4Tnvzg9M#yvU7WN#-*_~PgMeG%{orsyN_Hd+Y2R_ z)k|g$A`xnb2`Pbyd=g0-SO*R3!#(r<@5OfU#EvTon@}=9@z-Ly{_xFc@P;2K^TNEl z0I<+q8&DJ|{T0G$La}VU?*lzFU3C{rz}5LHznN~vZOz&{>=0rY6*|4JSiB&7R>*N< znp;FnpwNqW-s|AG>h8u&+d%fsX7A3lL#au`GUR)2$9NmEg5k-rqSB@nSc^Voj-W6y zuW=%E78$EVe;TlC1M#`uV<4=k<9J3LaJEqoejJ$zoQhG zE-t?l`DF;xQDQ)HD&hW&K!4sr&e24$y{S$3ZZ%plwF;BQOKR;}w~%|DL|#M1zbs^6 z+BdmF)ukV2b~{mT!F)h>;(*q2!Kz)FTa~g`>nPMV|9y;#x^Rq+4w$Bi4pbD>$A@L_dZAim-`? zZ>=&wyj+(=Ewnx>p@$-ajEIX3n|31Ln*iExUq4DSc`OpV)m(hp`mmlJ@2h6!P^<5N z*F_5@_z4Zx-}e+#PyoJWh%94fGP7KE5C96@@dEaG12Ym}F!fU(fB#$No(&CP5x%ue z``r~v4tDBk5T&maJbOCSPtjuxiQ57CpML({p)7#F?I6Tu>b$yJM&59tm*G@uyOtBe!do-uY2nwlq6#ajR`UaB4_xv9>eVa24DZ(bm|4u||Q*;p-7DjxwD1{II$0Jds zn&2=iMLGgWNcV4Q%JbGIr5tO#S@P#AN4G5deW^Y6zd2%f*j;SkA!|TWfu9+HKgrI4 zaQ5o+id;$6@bhvb5Cctbctrf)Yp>@|In9^t)R=Sn(?1=5QkJ0XtP5hfgnQwENl zShVzz+T||$_it`t@gMDPZ8BvEC!=Dy>*&xR-B$aZnaZ^0?;B?|S080Bp-=m+&%K{X zJTT=rEy-YA;&n}Bgoaf&f?l^uf~~^u=0Dz{2mfuK3f$0SPg4MioC2rX}%%YSoZE8zjq#*rm(Ha^)rdnji?{U36GO-ZeR)tOeCEbme4;hWyP#kl6E1G zNgQE{lndB6H+gL&F>eUhM`on?zrU#j`fwy#K{OXz-nGDPXGWZV|9((EL=zD>(cVd0 z_chCmVkNIn_{Z(LFdXx#v=QteWkts;=OI&d#lJ6h>bR;r;3~Mr)@Pgks^=7#t*} zXtw|3BY<|!#9c?!HG$H;h6q_Z)%6|WM(w0+L?T9OQP8P>zegJG17n~`iTIw4&`*$v zI&6Dn4vhlTAjp$Wus0=1w5YWI{eng*cw-p&Y->g0w4+tn%V7RVBDF1Pqsul7q15Ag zC;1Cv+wmrHW3Y`E2h~nU3(!&-!HDo+}CT8SYtv(_W-V zBP%CbnjDDyX0>TSb}^Ixb|?$_==SpKI%FGHZrI{9fc(K92h}Im@FQ-Vp7nLaY0&qu z34vK;w)7~p*hIV4qRda8Va?7x$z}YrFE!{WH-y8=i*A!JH&eUI8oD#>huSQEEMgRm zbh4^!jWeSAinvfC_VG`CGLIFLVpZbmND{ByGWovh<8Mc1s=SQ5WXSx9g#T717^yh1jk9`Wf(x=XqM8-f%)EFsep+R6&g;0M=IXN` zzHWPAUi{CWHA~+vX`gmJGwlevMp4Sesy4~GwpiG@Lk%%5L@~eXizVlvT@9UfTW#9K zT@yFE6z$CoV(5bSLJ#pmvT@V4PM^Sa%ajN*K$uK~bw!VljjDpZBHzSqFEP9ekC;`E zQa32Uv~qt#Ex+Q+vq@8nX;+GKKcr0IxVwZMzuT03C0n^i$kZi^9vc%bk2#pSWm%T~ z^`!3=y$DnL@u7CDo@GRvrH;FLQf#^A%Br}fr4DMWH<*7Y^L{*PkxuL(!^5QSfEezu zq1BJSCI5S|NG)q7xtf&#H}s)*x?apbZI26z5wxC5TKGfm{ZL|)^e-@d=?R$Y0|~8( za_r^&ENo4e;svG|qCFnXYF)NP@N+c??c`H@i^3ayLG1@`kBY( zhohKzRQh1rZRRmBRW__yf8AZe5WaI)tDS%zy`f(N)iwD+9`2iZnjP15gv}iPJ}dGH zu?0(hkTsbt97@*M+a!zhK$VhIOOjuJ3ZLjT*Og3bqxPMd7oNU7qOqZ&IvuTamqSmUCDYQO z_MKr3f3QXM3|6U>)t-}as01e_qott$xcQIw_h?Hr$x=k|z+2HG=oUEt9`b>Y3QeoI zJt}6l;`FK{bvMdrR?$2Xbp{b7=?;gu;fYAc%kauheqB>F#O4-8h(Ro|9*dw%5j0DO)5<=QiSre zt_?2J1hh|sJ_SwZ2MNkc`VLc-cNkMcQXF^{!k34f`FZW||2tGQw-8zz=?f*Kq`?fv zXf%oR93+Ap;H!**Cu8`a@n-p850Zs^=j62C)y>XSVLPf}^Vy|i+77dCm+~v|Y1e2U zzk*T$Msd}U*bT&-w@g?|QO~_(HlR-5XLimhB~f2BP7|1DK`i+b8FCEZT>tSXG82L| zn3avkqrPt1d+{mGv;+5fYA3P8n|6QZnRVSM( zBpNH*L+HQ{ELtmw1jFL&-u>@Kj-X6Q0$-u*;NSr9SZWuPE{6>N@vga)NYt_9{`gDn zP!CHQSCbJGgo0=YrI&n7rvEhoBvVdoYeG6IUR2<_b8oM|n%Y?u=rWiss==yB_j-QpOxm`;h@mMd@ilkL})Lr`IJn4XJ9}o~9GsDp8o7 zjnoUc#~XqVXM{b^+Ox>33_Xl4F1}^2!nW1nXu0rBON;_%qf!#Gze(TvHkLVSVKPfc z%K4^B@HHkqU)~YBGzn!RxxkUc*fsUzvEmSaw8H5cU@}B0KwxCz>KY`GoNE2&QCXTm z;$lS%zJ?8byMPj8a1J|7jQWwZxCx(EUjc`v=)pfNSYc~YLoX4>xM7jR0obgT+s3)$;chI~gsFA?=E+98{sLC0LF-@-YNHtkM)`nQI*Y7)vTB2j zY=3_ykC2&0r_lFN_eE5_t7pz&d3CUxOL54ax5@L)S2px6_{Nr6DRWM!<`yomnEbu( z83P@&K7=xAxyKhSHz>TpvW)G`l0R70PcN2v_Gup*Yc|(nw~fL#yGO=P@}JdCQ`8a3 z&MLp~T4-4tr;zYE7VU%4Yk6Gf%eb!b?G-nwv;J1F>+dxmk_#RUJ3MaEJ!M60nkP~4 zsJF(5l#{`^hWycFSfn-%+FZMZL61ul3?LD!Kt|2C64R{)ufA9GK7WN^=b0=HjSsE~rMzEi<^}H*@(kuHEyksIM&R2F4-E&I zRWypAkdTwrp&MIzO(j1JTPPUICLUw^TUjIDRnP5#WQ?2~B_ymNJWMtu0Xv8W8vb;CT2J{v7?xJK-VPp?pq?7ykC*t)R=wQHJL!`S{H^9uVkC^-|wWJDV>S zEe^Ob_Q{_4dg;hd*8NPgd%iZoNHlZmczM!StfYCNgrfKci)l4*RO7wSZdI&jEXTmqHi zHSgbVY^u3=w(iAAgg}XRp4sP1K157lq5id=Pij5IFD|tD2Z#BGg!Fwf?NGH%TF04a zw6t@J?N-xsU#XW~G@80I;sf`vMq%l9JQTlRcavK}TpAgL zXCb^tU%3f$9c~NlnGmirzPknaN?#3=9$?5Z`Y3_h=vP^9mCuB@XbeB zi^i!iwJkk~4D-y~1EfK!+NRO1JI-&6pQN|LwnXDsieAGS0SS8_!_z4M${(>A32UK8?EzxuT*iT;z( z3})plJ-pA?ZZ4^7Zy};D8CBmibaCcT0Gv5^8CpL+)yV7c{wdCra4bBwiSl90M-BcE zW%rJr;n-a2`8=VRulH565lBgCQNySg*VhX~`LUg|AyQQvUZ&^TlPm+M3fonZ=X6mPIDKRuPWXAMA}Q(gcCs7E#Ohv zrm5}A@Gf;q!|0P?p9pt6l?9SG&SxZGRsnO^`)?-~EzB%$yAWsbzq{?Z~l#P}9mX+bd1g_G1B;P{u3 zWRn4^fAnz|M|V7kyu~VxCTHpuqeeS7hG>t|bn(1Uma>A^p^nbDijXH{UC%(!D}K zwoju{zIjz9Pl5t?bbrj%{+`0UACZ=HKyqtqUoTi9zAGQ4d(~z!NuC)GzovJ*$5isr z>)2~&OnOXz^vVHjN)q7X_~r#ey8GIAoFUkGUd5E&5-3DdW_l9%JbL8LIve-#f_Jt_ zlkexEEE2z$`+f_SUfYlRU4HTDpq!1~#<_@#Qx0;(gMoP;fIFsH_ zwZ=3RH|A1_(TW1znGE!9$$`?WOvO8oYb*C<=p?0iFD_WsbE5V~1s~i?P7c`5jTrJ% zi=ueee52kkz;JIN&pAQ(=U9t<*F#G(N3fB)>)hHM_|L!o*#Rp|4q+qDvrpg`DqWnO zNk7e_`!h~^NPSi-h*Uw8a_N<6Kikg@p~kd@-!U%5A3H>ajwIS`Ke79RFkNL~J#eN1 z?qjHPUR*-PDk`D)tP}xwy z81Z9&q-~wQZ|-re{tXY*?pW_^2#=G_hZc(bobHVHZs=bm5snE3 z_hO;4J(I7)#KZ^}VhPW+R|dx>d}YCEPDn8*WPdS#HFwkUbyLY?7c1w7-^GrbT{k|E zl#E=2*tM^U3Lxvee(dhXlB|}gmkj>f@ULhA>#W5`vS0vvIDau>q=t;Ib!AM9bqd-3 z6hJYqapKvwB$lsRx$Zj%4mXsT*)m5~vr9}27w90AQs~0wsW&I3%q&|3;NB` zMCu>Bj1)e%ibbChkFQ{&HpOONTq4isOiLk`YUMfy2wZLf77-h7lo(%6X2Vvd{WbM` z8~hb!wVEwhOpe`$*eXplmi+jai}Y1WX7Qg6f5P5KsZ7GBVn29U#H`kVwsq=l?^`XK zNS{O8`C&qbh7fq94O%?R{$~%zu-8ndBP`%90hY*5aGl|W1x7#q%oGf_#g9K;RQnlW z&GhzH)ZPF5<>bZrKX^gzeLauetGevCSB~P1W#7gx#k*Y+{ZRxDsl$J~M*sK&p=;_H zPU}!$-ixzunu_vcte7IFPQN^Rj>*AqYRA~e{Osk7t_y}k>FQIvGSj$|-4AxRPFcAE z7-I7cf19u0wko4)HS)0D>2Jc;w`eBQ(5)ZOkZGv2a z3x0WYaP1lX3ZbcDueT)SK^L z*6H^azxcJScCk}6Kfa7R6Z%qp6FH_b^B(X1@+gf2yWjihmTB@#vl+M68tci6a&g3N z{Wk3A`5%4;*6$PO!-abyz5N3(xqSCvi)Lb?xoRn3Yr3f2INM%n`%l`jc%4Z3Yu87w z|6jTzC6CQ1C8ZA0S_&id>@0Q(%Z}>ZWV3}`<&(8|8H!yUkR+ebAd=cQac_Hkkv3X8 zzP)E4%P|K=0E|b>ANto%sB?x|PC0RsB#MMllA-nqBc#~H7r^e_Sv@6wzbH#tw!siP zX-p26eHO6EMWmiYb@2wA8#jhQ$n71f|GR<=po%O^K}P9f(e`*bGDW6hJ09UgO1j9j zp7%CiZXaoY7SbJ^0%gw`a31Esk8_|EegfHx29p%pEuQfOZl$A)3D-7=P;W&&d$TT)l%(7T@ zWR>}$(jxkIwcO**;Few+)l+`lQcOJ54ZHsu0=d=TWfb|&alFWHTz;{_rp;;{7{)>D zG~I>Aw?_1-k!3R+E5>!!Y>1yE6O&NQ(}@1J7H>U)or}t)h6jwZ)1k|J@Ron?G2-oU=qa(BeS{XjCqWnyKF5-SFV zWlF_kyIshI5l8T@b8|^pS<>TH(2#jo20MUC2Gs99c3!y?pG?_|0YG-w6*#LRoKOMB z))pDmG6dOdXk`$UjK;MFF#%tEa&HT@bdBBE_;u7&a`};tl^gKNPb@ukHOFxL>*WH7 zeNox|wN>scb!n57bAL}0uf!R0VkVTTw2Ep-^nV{OnD}1s5bSL@%9IMVYGi+C7^qI2 z@Qgcm=7mdO@ffGPoV`*$HQiwh;E>T*H6yz*GRfZl9?8Ft&D@jcHlZH6$dom||W^2`QG3fpx_I*5F{r zJS{QsD#jIHeGHS}J+7?i0elzgc|M|}UzEmRgUHPtLe>o{3%{em&%3gq&LVe9-0mc& zp1Xd!8K-}&uZts3{<2qk5Sl(%D{6la8R-<^BLg5;ALk{AnN}wcJ_; z;rihHG>$h&vHCxIHSX4y92*ZQGUVZYJPdL}{j<}bcd_S}zE3gi8Tr~I ziunO?eyGx%A`7=q-BJOOf6Z!j6RzY@mG%~nAWI99c3Hlr(08p5fN-fMeg|-%FgzvG zx+tq~$GQLC9ld^pPuTZ|Fvn#mR=UV_AO;Q4fbYIQ^5tx(|z zC%#^;phVw$pwi->K>L!N;Dn!edSN2MC9+}g@<47K$Vk_IZ{yfw#t9_~+p+L$nx9@R z#cN=UV}~)B_Y>9g>$8O8h0vnsfVJ@%bC~SXSNM`HeLD)-=DG|g2t~uR#~>tG3hA<* z4~G4D<|F4cXjfbGYi(%a%;DwAh6I5((H9AH-Pk*G5RtwDB2nppMrmwst{3hvq<4al zNybg96PG7^1KToX&o{(BxWY*)ukyg|EL!|wb4bw+gN12$sB=sCwc?Z{@`>O*$?JR2 zt~DYGesW;T`3t%u(82`P*sw@_yXE>as+tvqk9}!AlkMFeuxiOzDqYr zuN@M>#6&?Zq+cyZ(`@x&q0`XoHcrxyF53$Lxg99N@Yk_CGsn9wMJ?ZvQJ_U&nbx)A zke?nQB2gXErK{NdM0H$G9UF+2mdzZ+S@33elh0D1?e6HQL|DU#BQ$R)aCO6KJN5H#f-RJMAVBp8 z>QK=WUnG44g?>cWLv#b#5UO(#avl7fBy1~>@}C2-Kb2;3VI3!ONmb zs_?p$ydV1)Q$V=xtX7DBvLGy9oH1I{sSWaF``M3A%Fn%?-w4T;D_|S}xCCO~H+gN> zIgDsOQH-7m<>BMI0nN4qG~p{y@aXlm6m23z32zSOr1CF-Wq%inbR9G?r2Z!eZ8eer zVgOcWL97&(UdpbhwwP4IH@U?2U^aob*wy&XQ;t1%li|=WZ5Em;BzZP$SgABIKA7PS z-Q!xTN`oL9oOlgD&aa_L%z|m1lOWwdS}6gKiwQZl3iWX}B$oP3UfZ+|_*lH(T#+Kj zGj>v>)<)+hrtl#ke;GlAmdTSYf}Ee(K!H}1W`LmQh1*-Ii72x4?@k)?7XsvK z3F`k0{;lpXjWJ%MsbhBEh0~}~&?fNOt)D=*vM$qLXo-GcpW7 z`?H^yjQRlGrPutpGEb<4LmOt>+#isz=T_>}xkc)QNP zcND!6$w9}meBRiKtiSJ8zFqv$paI+8t0$s$1dUIBA6z@FnD>w5m6Lm;EEgcJ`2Vab zek0%}?Hi~O3D z^{uWCKu8M6%%fYLO{vV0e!O?LYT(+jGNsXz>&!yl3mc}()aLPQHVn067^XO_XGl>? zn1liXOD_-d(h>@t*4Ks=Q|5Q6|8M?=aSyd=RP<|8-}&Lg8YtuXWKUbXKQgP{O!x+?a3Y9OW5pz;IqS1Vr z`+&ZxDA?p{DI2ghaVv(ZEr+SLud_}9Y7|P$H~@j`7}~G{v|6}S69ZlCDywp>n6sb! zcYzzzfhvQ&io`4pK@HOQcD?&e)c!$*=3oNs-iYVUslh#ZYLZT>IOF{WkPPqYoe;kA ze*Nit>v}rOE;Z4=txLN zQAGs)@vg?O*VyHIZO)M`5<@vwN__vkFs_$i9iNaQVuNwP{xG&uDlY(K($}(P2^s`W z!0+JH7LyZOTd7DzuZ^uXVQ7lKVq$Z@)28Kn@9HbCangbqghO^w{%Ecpx<`et_VsA> zzekMX+U#4ay^cdjhX0431~n8giqr*q&mTn;0$-73qE z`?up;GJMVWLWsH2S@uD`R`0K@ohZu~_hkNJ&}^IDoZ$?y?35)OjU5riK#ib}UKMq6eMm0T8f0mUI#643VvyB3y$WV}(C z06g@IKt)Ab)!}}610CVAARh}Ua!x|Pvjh`OuYm-N>iTY=TB)z+j`*NbGf#in4>U># z_r%ZA)(iSvCpWl z`e|`11Ejg@#CYe#Ezmt;5W#q)Hxa1D9OQI1Zj2WRZn%kWfDzjW1(Z*M8C-GhxaM22 z#GmMz;XHP{TLW2J|IG|v+S%DBew{-+uhO^oYr83?rE{_ zgXH0iAG15y<`TR7(>g3nxhc5vMH(^{I$;rsysMxcaKRc%{Rpji?vgW>DxpB_dvN&a$ z^xJ{sqd|?Z`gx5_0I^txYkrz9inX}J%Mkiy&%q>!kVjqQid|D8Z|!Qh=9&>=1&s66 z+N-N%%k>^mV+;N^7=ta06%xmggtFNTm6Pds-HHJKu;1jW zj@@j&+L2*qQced=V%{vP7;i}iwVs%*K1XTwOrs}vAm~jwhsZ~cTHvKptrBntzCuXi zgLGTKP+FdeWXezlstLZ-@H4I z9AgP68jw3BhT8@35bGQ)OwJ2eE{~|l0X^HIX7O%=3-*`LF5Jd*!#B@;qo&w0)&eyI zKf!|D>%WFfG-dHafB6qW&~SynLb1kzG`Wa)ao@(^XSd$p5=BW?IwW*)L|(DZ62boZ zbsDQMoqnc~>!nOiCB2rDJJLU6{K)fYC_r5MCC0nmd~x1`R%m7w-=qK68oz&7NTD{^t+_ zC|{f(u%^>%BoIUU)HP4O<4dHgsMD3VuZ{!q9?`SiBS||l1a{+Xq8l%a|1B$ff+nQ( z>N5YlQ(FCS`2H0g$n)?uKAb_Mn=ZyK0m#?M?j7NU!fY5B7X2PAi){Bx463lIC?KkofsK%A=AiVPAG#_I zn3sMo#+a5>@{zb%{ahlVL0+xAQJFJcNs(*-_dGq{thTORj0mg40VWf@5)(_w2}CLZ z;hO)exN8rGI^V->J=LCeyRd3IB(-gYDY6?$#m4F)!$fGvCD+`_HEVL~g4QXt88j-X zh}`e(j9W2?gkj_olF-Oqqg*EE{d)GCzt4G|^E_w%>QRs8_xpW+pUeBcpZDX{q+GJD zIg|ybbc+Ib!3`I7%@N)_eLVkO2H$Afn@7D`OUaCx@NB8bzo-66qFEc~&FO~0i8SSW zjQOpHYIAB5#<(WaYP4^|5;KTuqzbwklJU~dESI>PQzW%0Djd=4C$kaYmTQa6&{AD? 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 diff --git a/bedrock/analysis/a_matrix_time_series/plot_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/plot_ef_diagnostics.py new file mode 100644 index 00000000..a7dc9f31 --- /dev/null +++ b/bedrock/analysis/a_matrix_time_series/plot_ef_diagnostics.py @@ -0,0 +1,248 @@ +"""Phase 3 of Step 6: scatter + histogram plots comparing approach EFs vs each baseline. + +Reads ``ef_scatter_coords.parquet`` (Phase 2 output) and produces, for +each ``(baseline, ef_kind)`` pair, two figures: + +- ``ef_scatter_{baseline}_{ef_kind}.png`` — 2×2 grid of approach panels. + Per panel: linear-scale scatter of ``(x_baseline, y_approach)`` per + Cornerstone sector, ``y=x`` reference dashed in black. Top-left + annotation reports ``R²`` of ``y ~ x`` against the ``y=x`` line, ``p95`` + of ``|y - x| / |x|``, and the count of sectors with that quotient + exceeding ``SIGNIFICANT_PCT_THRESHOLD``. +- ``ef_pct_hist_{baseline}_{ef_kind}.png`` — 2×2 grid of approach panels. + Per panel: per-sector ``% diff = (y - x) / x × 100`` clipped to ±100%, + 60-bin histogram. Vertical zero line. Mirrors the + ``baseline_snapshot_comparison`` ``compare_B_Adom`` convention. + +vs CEDA (v0) panels: 4 candidates (``useeio``, ``summary_tables``, +``industry_price_index``, ``commodity_price_index``). +vs USEEIO panels: 3 candidates (``useeio`` is the comparator and is +hidden). + +Usage: + python -m bedrock.analysis.a_matrix_time_series.plot_ef_diagnostics +""" + +from __future__ import annotations + +import logging +import typing as ta + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +from matplotlib.axes import Axes +from matplotlib.figure import Figure + +from bedrock.analysis.a_matrix_time_series.compile_ef_diagnostics import ( + EF_SCATTER_COORDS_PATH, + SIGNIFICANT_PCT_THRESHOLD, +) +from bedrock.analysis.a_matrix_time_series.constants import PLOTS_DIR + +logger = logging.getLogger(__name__) + +PanelFn = ta.Callable[[Axes, pd.DataFrame, str], None] + +# Approach order (top-left → bottom-right in the 2×2 grid). Mirrors +# `summary_a_errors.py` and `key_sector_deep_dive.py`; consolidate per the +# redundancy cleanup plan. +APPROACH_ORDER: tuple[str, ...] = ( + "useeio", + "summary_tables", + "industry_price_index", + "commodity_price_index", +) +APPROACH_COLORS: dict[str, str] = { + "useeio": "#7f7f7f", + "ceda_default": "#bcbd22", + "summary_tables": "#1f77b4", + "industry_price_index": "#ff7f0e", + "commodity_price_index": "#2ca02c", +} +BASELINE_LABEL: dict[str, str] = {"ceda": "CEDA-US (v0)", "useeio": "USEEIO"} +EF_KIND_LABEL: dict[str, str] = {"N": "total EF (N)", "D": "direct EF (D)"} + +TITLE_FONTSIZE = 20 +HIST_PCT_CLIP = 100.0 +HIST_BINS = 60 + + +def _panel_stats(panel_df: pd.DataFrame) -> dict[str, float]: + """``R²`` against ``y=x``, ``p95`` of ``|y-x|/|x|``, and ``n_significant``. + + ``R²`` is the coefficient of determination of ``y`` against the ``y=x`` + reference (not an OLS fit), so values can go negative when ``y=x`` is + worse than predicting the mean of ``y``. + """ + df = panel_df[panel_df["x_baseline"].abs() > 0] + if len(df) < 2: + return {"r2": float("nan"), "p95": float("nan"), "n_sig": 0.0} + x = df["x_baseline"].to_numpy(dtype=float) + y = df["y_approach"].to_numpy(dtype=float) + ss_tot = float(((y - y.mean()) ** 2).sum()) + ss_res = float(((y - x) ** 2).sum()) + r2 = 1 - (ss_res / ss_tot) if ss_tot > 0 else float("nan") + perc = (df["y_approach"] - df["x_baseline"]).abs() / df["x_baseline"].abs() + return { + "r2": float(r2), + "p95": float(perc.quantile(0.95)), + "n_sig": float((perc > SIGNIFICANT_PCT_THRESHOLD).sum()), + } + + +def _scatter_panel(ax: Axes, panel_df: pd.DataFrame, approach: str) -> None: + color = APPROACH_COLORS.get(approach, "#000000") + sub = panel_df.dropna(subset=["x_baseline", "y_approach"]) + ax.scatter( + sub["x_baseline"], + sub["y_approach"], + marker="o", + color=color, + s=18, + alpha=0.55, + linewidths=0, + label=f"n={len(sub)}", + ) + if not sub.empty: + lo = float(min(sub["x_baseline"].min(), sub["y_approach"].min())) + hi = float(max(sub["x_baseline"].max(), sub["y_approach"].max())) + ax.plot( + [lo, hi], [lo, hi], color="black", linestyle="--", linewidth=0.7, alpha=0.5 + ) + + ax.grid(True, which="both", alpha=0.2) + + stats = _panel_stats(panel_df) + ax.text( + 0.04, + 0.96, + f"R²={stats['r2']:.3f}\np95={stats['p95']:.3f}\nn_sig={int(stats['n_sig'])}", + transform=ax.transAxes, + fontsize=10, + va="top", + ha="left", + bbox=dict( + boxstyle="round,pad=0.3", facecolor="white", alpha=0.85, edgecolor="0.7" + ), + ) + ax.set_title(approach, fontsize=TITLE_FONTSIZE, color="black") + ax.legend(loc="lower right", fontsize=9, frameon=False) + + +def _hist_panel(ax: Axes, panel_df: pd.DataFrame, approach: str) -> None: + color = APPROACH_COLORS.get(approach, "tab:blue") + df = panel_df[panel_df["x_baseline"].abs() > 0].dropna( + subset=["x_baseline", "y_approach"] + ) + if df.empty: + ax.text(0.5, 0.5, "no data", transform=ax.transAxes, ha="center", va="center") + ax.set_title(approach, fontsize=TITLE_FONTSIZE, color="black") + return + pct = ((df["y_approach"] - df["x_baseline"]) / df["x_baseline"].abs()).to_numpy( + dtype=float + ) * 100.0 + finite = pct[np.isfinite(pct)] + clipped = np.clip(finite, -HIST_PCT_CLIP, HIST_PCT_CLIP) + ax.hist(clipped, bins=HIST_BINS, color=color, alpha=0.85) + ax.axvline(0, color="k", lw=0.5) + ax.set_xlim(-HIST_PCT_CLIP, HIST_PCT_CLIP) + ax.grid(True, ls=":", alpha=0.3) + ax.text( + 0.04, + 0.96, + f"n={len(finite)}\nmedian={np.median(finite):.1f}%\np95(|·|)={np.quantile(np.abs(finite), 0.95):.1f}%", + transform=ax.transAxes, + fontsize=10, + va="top", + ha="left", + bbox=dict( + boxstyle="round,pad=0.3", facecolor="white", alpha=0.85, edgecolor="0.7" + ), + ) + ax.set_title(approach, fontsize=TITLE_FONTSIZE, color="black") + + +def _grid_2x2( + coords: pd.DataFrame, + baseline: str, + ef_kind: str, + panel_fn: PanelFn, + xlabel: str, + ylabel: str, + suptitle: str, +) -> Figure | None: + sub = coords[(coords["baseline"] == baseline) & (coords["ef_kind"] == ef_kind)] + approaches = [a for a in APPROACH_ORDER if a in sub["approach"].unique()] + if not approaches: + logger.warning("No approaches for baseline=%s ef_kind=%s", baseline, ef_kind) + return None + + fig, axes_grid = plt.subplots(2, 2, figsize=(11.0, 10.5)) + flat_axes = list(axes_grid.flat) + for ax, approach in zip(flat_axes, approaches): + panel_fn(ax, sub[sub["approach"] == approach], approach) + for ax in flat_axes[len(approaches) :]: + ax.axis("off") + + for ax in axes_grid[:, 0]: + ax.set_ylabel(ylabel, fontsize=11) + for ax in axes_grid[-1, :]: + ax.set_xlabel(xlabel, fontsize=11) + + fig.suptitle(suptitle, fontsize=14, y=1.0) + fig.tight_layout() + return fig + + +def main() -> None: + PLOTS_DIR.mkdir(parents=True, exist_ok=True) + if not EF_SCATTER_COORDS_PATH.exists(): + raise FileNotFoundError( + f"{EF_SCATTER_COORDS_PATH} not found — run " + "`compile_ef_diagnostics` first." + ) + coords = pd.read_parquet(EF_SCATTER_COORDS_PATH) + + for baseline in ("ceda", "useeio"): + for ef_kind in ("N", "D"): + kind_label = EF_KIND_LABEL[ef_kind] + base_label = BASELINE_LABEL[baseline] + + scatter_fig = _grid_2x2( + coords, + baseline, + ef_kind, + _scatter_panel, + xlabel=f"{base_label} {kind_label} (inflation-adjusted)", + ylabel=f"approach {kind_label}", + suptitle=f"{kind_label} per sector — approach vs {base_label}", + ) + if scatter_fig is not None: + out = PLOTS_DIR / f"ef_scatter_{baseline}_{ef_kind}.png" + scatter_fig.savefig(out, dpi=150, bbox_inches="tight") + plt.close(scatter_fig) + logger.info("Wrote %s", out) + + hist_fig = _grid_2x2( + coords, + baseline, + ef_kind, + _hist_panel, + xlabel=( + f"% diff = (approach − {base_label}) / {base_label} × 100 " + f"(clipped ±{int(HIST_PCT_CLIP)}%)" + ), + ylabel="sector count", + suptitle=f"{kind_label} per-sector % diff distribution — vs {base_label}", + ) + if hist_fig is not None: + out = PLOTS_DIR / f"ef_pct_hist_{baseline}_{ef_kind}.png" + hist_fig.savefig(out, dpi=150, bbox_inches="tight") + plt.close(hist_fig) + logger.info("Wrote %s", out) + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO, format="%(message)s") + main() From ddb35d70b0666e58717e3bbbfab2a5f91ef011a1 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Wed, 6 May 2026 09:13:27 -0700 Subject: [PATCH 14/25] feat(analysis): rebuild ef_run_index.csv from Drive folder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds rebuild_run_index_from_drive.py — lists Google Sheets in a diagnostics Drive folder and parses each title into (approach, baseline, sheet_id, year?, scenario?) rows for ef_run_index.csv. Closes the manual- flow gap: users who triggered diagnostics via the GH Actions UI can now auto-build the run index instead of hand-typing sheet IDs. Title regex handles both formats currently in use: Manual: [DATE, BASELINE based, A matrix with APPROACH] EFs diagnostics Dispatch: [DATE, YEAR, BASELINE based, A matrix with APPROACH, SCENARIO] EFs diagnostics Also rewords the FileNotFoundError in compile_ef_diagnostics.py to point at the new script as the auto-rebuild path, with hand-write as a fallback. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../compile_ef_diagnostics.py | 11 +- .../rebuild_run_index_from_drive.py | 214 ++++++++++++++++++ 2 files changed, 222 insertions(+), 3 deletions(-) create mode 100644 bedrock/analysis/a_matrix_time_series/rebuild_run_index_from_drive.py diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index 0602058e..dfd62fa3 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -141,9 +141,14 @@ def main() -> None: if not EF_RUN_INDEX_PATH.exists(): raise FileNotFoundError( - f"{EF_RUN_INDEX_PATH} not found — populate it by hand from the " - "Phase 1 diagnostics runs (one row per (approach, baseline) " - "Sheet)." + f"{EF_RUN_INDEX_PATH} not found.\n" + "Two ways to populate it:\n" + " (a) Auto-rebuild from existing Sheets in the diagnostics " + "Drive folder:\n" + " python -m bedrock.analysis.a_matrix_time_series." + "rebuild_run_index_from_drive --folder-id \n" + " (b) Hand-write a CSV with at least 3 columns " + "(approach, baseline, sheet_id), one row per Sheet." ) index_df = pd.read_csv(EF_RUN_INDEX_PATH) required = {"approach", "baseline", "sheet_id"} diff --git a/bedrock/analysis/a_matrix_time_series/rebuild_run_index_from_drive.py b/bedrock/analysis/a_matrix_time_series/rebuild_run_index_from_drive.py new file mode 100644 index 00000000..a85e3918 --- /dev/null +++ b/bedrock/analysis/a_matrix_time_series/rebuild_run_index_from_drive.py @@ -0,0 +1,214 @@ +"""Reconstruct ``ef_run_index.csv`` from existing Sheets in a Drive folder. + +For users who triggered EF diagnostics manually via the GH Actions workflow +(rather than via ``dispatch_ef_time_series.py``), this script lists every +Google Sheet in the diagnostics Drive folder, parses each title to recover +the run dimensions, and writes ``ef_run_index.csv`` with one row per Sheet. + +Sheet title formats supported: +- Manual single-cell: + ``[YYYY-MM-DD, BASELINE based, A matrix with APPROACH] EFs diagnostics`` +- Time-series dispatch (``dispatch_ef_time_series.py``): + ``[YYYY-MM-DD, YYYY, BASELINE based, A matrix with APPROACH, SCENARIO] EFs diagnostics`` + +Usage: + python -m bedrock.analysis.a_matrix_time_series.rebuild_run_index_from_drive \\ + --folder-id +""" + +from __future__ import annotations + +import argparse +import logging +import re +import typing as ta + +import google.auth +import pandas as pd +from googleapiclient.discovery import build + +from bedrock.analysis.a_matrix_time_series.constants import RESULTS_DIR + +logger = logging.getLogger(__name__) + +EF_RUN_INDEX_PATH = RESULTS_DIR / "ef_run_index.csv" + +# Output columns match what compile_ef_diagnostics.py + dispatch script +# already use; required = approach, baseline, sheet_id. +INDEX_COLUMNS: tuple[str, ...] = ( + "approach", + "baseline", + "sheet_id", + "sheet_title", + "created_at", + "scenario", + "year", +) + +# Title regex: +# prefix '[' then 1 or 2 leading date-like tokens (date + optional year) +# then 'BASELINE based, A matrix with APPROACH' and optional trailing ', SCENARIO' +# then '] EFs diagnostics' +TITLE_RE = re.compile( + r""" + ^\[ + (?P\d{4}-\d{2}-\d{2}) # YYYY-MM-DD + (?:,\s*(?P\d{4}))? # optional ', YYYY' (time-series cell) + ,\s*(?P[A-Za-z]+)\sbased + ,\s*A\smatrix\swith\s(?P[^,\]]+) + (?:,\s*(?P[^\]]+))? # optional ', SCENARIO' + \]\sEFs\sdiagnostics$ + """, + re.VERBOSE, +) + +# Maps the human-readable approach phrase to the canonical config key used +# in ef_run_index.csv. +APPROACH_BY_TEXT: dict[str, str] = { + "USEEIO method": "useeio", + "2017 benchmark A": "useeio", + "summary tables": "summary_tables", + "industry price index": "industry_price_index", + "commodity price index": "commodity_price_index", +} + +BASELINE_BY_TEXT: dict[str, str] = { + "CEDA": "ceda", + "USEEIO": "useeio", +} + + +def _drive_client() -> ta.Any: + """Build a read-only Drive API client.""" + credentials, _ = google.auth.default( + scopes=["https://www.googleapis.com/auth/drive.readonly"] + ) + return build("drive", "v3", credentials=credentials) + + +def _list_sheets_in_folder(folder_id: str) -> list[dict[str, str]]: + """List Google Sheets in the given Drive folder (non-trashed only). + + Returns one dict per Sheet with keys ``id``, ``name``, ``createdTime``. + """ + if not folder_id: + raise ValueError("folder_id is required") + client = _drive_client() + query = ( + f"'{folder_id}' in parents and trashed=false " + "and mimeType='application/vnd.google-apps.spreadsheet'" + ) + files: list[dict[str, str]] = [] + page_token: str | None = None + while True: + resp = ( + client.files() + .list( + q=query, + fields="nextPageToken, files(id, name, createdTime)", + pageSize=1000, + pageToken=page_token, + supportsAllDrives=True, + includeItemsFromAllDrives=True, + ) + .execute() + ) + files.extend(resp.get("files", [])) + page_token = resp.get("nextPageToken") + if not page_token: + break + return files + + +def _parse_title(title: str) -> dict[str, str] | None: + """Parse a Sheet title into run-index columns. Returns None if unparseable.""" + m = TITLE_RE.match(title) + if m is None: + return None + approach_text = m.group("approach_text").strip() + approach = APPROACH_BY_TEXT.get(approach_text) + if approach is None: + logger.warning("Unrecognized approach %r in title %r", approach_text, title) + return None + baseline_text = m.group("baseline").upper() + baseline = BASELINE_BY_TEXT.get(baseline_text) + if baseline is None: + logger.warning("Unrecognized baseline %r in title %r", baseline_text, title) + return None + return { + "approach": approach, + "baseline": baseline, + "sheet_title": title, + "scenario": (m.group("scenario") or "").strip(), + "year": m.group("year") or "", + } + + +def rebuild_index(folder_id: str, output_path: str | None = None) -> pd.DataFrame: + """Build ``ef_run_index.csv`` from Sheet titles in ``folder_id``. + + Returns the resulting DataFrame and writes it to ``output_path`` + (default: ``output/results/ef_run_index.csv``). + """ + out = output_path or str(EF_RUN_INDEX_PATH) + files = _list_sheets_in_folder(folder_id) + logger.info("Found %d Sheet(s) in folder %s", len(files), folder_id) + + rows: list[dict[str, str]] = [] + skipped: list[str] = [] + for f in files: + parsed = _parse_title(f["name"]) + if parsed is None: + skipped.append(f["name"]) + continue + rows.append( + { + "approach": parsed["approach"], + "baseline": parsed["baseline"], + "sheet_id": f["id"], + "sheet_title": parsed["sheet_title"], + "created_at": f.get("createdTime", ""), + "scenario": parsed["scenario"], + "year": parsed["year"], + } + ) + + df = pd.DataFrame(rows, columns=pd.Index(INDEX_COLUMNS)) + df = df.sort_values(["scenario", "approach", "year", "baseline"]).reset_index( + drop=True + ) + EF_RUN_INDEX_PATH.parent.mkdir(parents=True, exist_ok=True) + df.to_csv(out, index=False) + logger.info("Wrote %d row(s) to %s", len(df), out) + if skipped: + logger.warning( + "Skipped %d Sheet(s) with unparseable titles: %s", + len(skipped), + ", ".join(repr(t) for t in skipped[:5]) + + (" ..." if len(skipped) > 5 else ""), + ) + return df + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--folder-id", + required=True, + help=( + "Drive folder ID containing the diagnostics Sheets. Find it in " + "the Drive folder URL: drive.google.com/drive/folders/." + ), + ) + parser.add_argument( + "--output", + default=str(EF_RUN_INDEX_PATH), + help=f"Output CSV path (default: {EF_RUN_INDEX_PATH}).", + ) + args = parser.parse_args() + logging.basicConfig(level=logging.INFO, format="%(message)s") + rebuild_index(args.folder_id, args.output) + + +if __name__ == "__main__": + main() From 5b3d893cd7fc344d4e3e37ddbd731305035bfa3b Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 15:50:42 -0700 Subject: [PATCH 15/25] =?UTF-8?q?feat(analysis):=20step=207=20dispatch=20?= =?UTF-8?q?=E2=80=94=20workflow=20input=20+=20EF=20time-series=20dispatche?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/generate_diagnostics.yml | 9 +- .../compile_ef_diagnostics.py | 48 ++- .../dispatch_ef_time_series.py | 340 ++++++++++++++++++ bedrock/utils/config/usa_config.py | 3 +- .../utils/validation/generate_diagnostics.py | 12 + 5 files changed, 401 insertions(+), 11 deletions(-) create mode 100644 bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py diff --git a/.github/workflows/generate_diagnostics.yml b/.github/workflows/generate_diagnostics.yml index 5533a79f..73248c5d 100644 --- a/.github/workflows/generate_diagnostics.yml +++ b/.github/workflows/generate_diagnostics.yml @@ -22,6 +22,11 @@ on: required: false type: boolean default: false + model_base_year: + description: "Override model_base_year (e.g. 2019..2024). Leave empty to use the YAML's value." + required: false + type: string + default: "" env: FORCE_COLOR: 2 @@ -55,13 +60,15 @@ jobs: --config_name "${{ github.event.inputs.config_name }}" \ --git_branch "${{ github.ref_name }}" \ ${{ github.event.inputs.pr_url && format('--pr_url "{0}"', github.event.inputs.pr_url) || '' }} \ + ${{ github.event.inputs.model_base_year && format('--model_base_year {0}', github.event.inputs.model_base_year) || '' }} \ --useeio_baseline_pin_json bedrock/utils/snapshots/useeio_baseline_pin.json else uv run python bedrock/utils/validation/generate_diagnostics.py \ --sheet_id "${{ github.event.inputs.sheet_id }}" \ --config_name "${{ github.event.inputs.config_name }}" \ --git_branch "${{ github.ref_name }}" \ - ${{ github.event.inputs.pr_url && format('--pr_url "{0}"', github.event.inputs.pr_url) || '' }} + ${{ github.event.inputs.pr_url && format('--pr_url "{0}"', github.event.inputs.pr_url) || '' }} \ + ${{ github.event.inputs.model_base_year && format('--model_base_year {0}', github.event.inputs.model_base_year) || '' }} fi notify_slack_failure: diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index dfd62fa3..b930616d 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -156,6 +156,14 @@ def main() -> None: if missing: raise ValueError(f"{EF_RUN_INDEX_PATH} missing columns: {sorted(missing)}") + # `scenario` and `year` are optional. Step 6 runs lack them; Step 7 + # time-series dispatch populates both. Default to empty so the same + # script handles both schemas. + if "scenario" not in index_df.columns: + index_df["scenario"] = "" + if "year" not in index_df.columns: + index_df["year"] = "" + summaries_by_baseline: dict[str, list[pd.Series]] = {} scatter_chunks: list[pd.DataFrame] = [] per_pair_tables: dict[str, pd.DataFrame] = {} @@ -164,19 +172,41 @@ def main() -> None: approach = str(row["approach"]) baseline = str(row["baseline"]) sheet_id = str(row["sheet_id"]) - logger.info("Pulling tabs for approach=%s baseline=%s", approach, baseline) + scenario = str(row["scenario"]) if pd.notna(row["scenario"]) else "" + year = str(row["year"]) if pd.notna(row["year"]) else "" + cell_label = ", ".join( + f"{k}={v}" + for k, v in ( + ("scenario", scenario), + ("approach", approach), + ("year", year), + ("baseline", baseline), + ) + if v + ) + logger.info("Pulling tabs for %s", cell_label) joined = _read_pair(sheet_id) if joined.empty: - logger.warning( - "approach=%s baseline=%s returned empty data; skipping", - approach, - baseline, - ) + logger.warning("%s returned empty data; skipping", cell_label) continue - per_pair_tables[f"{approach}__vs_{baseline}"] = joined.reset_index() - summaries_by_baseline.setdefault(baseline, []).append( - _summarize(joined, approach) + # Build a deterministic 31-char-bounded tab name including any + # populated scenario/year prefix. + prefix = "_".join(p for p in (scenario, year) if p) + pair_key = ( + f"{prefix}_{approach}__vs_{baseline}" + if prefix + else f"{approach}__vs_{baseline}" ) + per_pair_tables[pair_key[:31]] = joined.reset_index() + + summary_row = _summarize(joined, approach) + # Stamp the optional dimensions onto the row so the summary tab is + # navigable in time-series mode. + if scenario: + summary_row["scenario"] = scenario + if year: + summary_row["year"] = year + summaries_by_baseline.setdefault(baseline, []).append(summary_row) scatter_chunks.append(_scatter_coords(joined, approach, baseline)) summaries: dict[str, pd.DataFrame] = { diff --git a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py new file mode 100644 index 00000000..55e9be00 --- /dev/null +++ b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py @@ -0,0 +1,340 @@ +"""Dispatch GitHub Actions diagnostics runs for the Step 7 EF time-series. + +Two scenarios: + +- ``isolate_a_matrix`` — vary only the A-matrix scaling methodology, hold + every other config knob to v0 defaults. Reuses the four Step 6 candidate + YAMLs. +- ``bundle_v0_2`` — full v0.2 release-candidate ensembles that bundle + A-matrix selection with every other v0.2 change. YAMLs TBD; populate + ``BUNDLE_V0_2_YAMLS`` when v0.2 is assembled. + +Per ``(scenario, approach, year)`` cell: + +1. Create a Sheet in the Drive folder ``EF_TIME_SERIES_DRIVE_FOLDER_ID`` with a + deterministic title. +2. Trigger the ``generate_diagnostics`` workflow via ``gh workflow run`` with + ``config_name``, ``model_base_year``, ``sheet_id``, and + ``use_useeio_baseline=false`` (CEDA-baseline only for this starting cut). +3. Append a row to ``output/results/ef_run_index.csv`` so the compile step has + a complete audit trail. + +The script is idempotent — already-recorded ``(scenario, approach, year)`` cells +are skipped, so re-running picks up only the unfilled cells. + +Usage: + python -m bedrock.analysis.a_matrix_time_series.dispatch_ef_time_series \\ + --git-ref main \\ + [--scenarios isolate_a_matrix,bundle_v0_2] \\ + [--years 2019,2020,2021,2022,2023] \\ + [--dry-run] +""" + +from __future__ import annotations + +import argparse +import datetime as dt +import logging +import subprocess + +import pandas as pd + +from bedrock.analysis.a_matrix_time_series.constants import RESULTS_DIR + +logger = logging.getLogger(__name__) + +# v0.3 Diagnostics Drive folder — same one Step 6 used. +EF_TIME_SERIES_DRIVE_FOLDER_ID = "1M2-Vopqfrx1vGcwoNi6wq55FmoELNV1s" + +EF_RUN_INDEX_PATH = RESULTS_DIR / "ef_run_index.csv" + +DEFAULT_YEARS: tuple[int, ...] = (2019, 2020, 2021, 2022, 2023) + +# `isolate_a_matrix`: candidate A-matrix methodologies, everything else held +# to v0 defaults. Reuses Step 6's YAMLs. +ISOLATE_A_MATRIX_YAMLS: dict[str, str] = { + "useeio": "2025_usa_cornerstone_A_useeio", + "summary_tables": "2025_usa_cornerstone_A_summary_tables", + "industry_price_index": "2025_usa_cornerstone_A_industry_price_index", + "commodity_price_index": "2025_usa_cornerstone_A_commodity_price_index", +} + +# `bundle_v0_2`: v0.2 full-model candidates that bundle A-matrix selection +# with every other v0.2 change (GHG methodology, schema, etc.). Populate +# when those YAMLs exist; until then, dispatching `bundle_v0_2` raises. +BUNDLE_V0_2_YAMLS: dict[str, str] = { + # "useeio": "", + # "summary_tables": "", + # "industry_price_index": "", + # "commodity_price_index": "", +} + +SCENARIO_YAMLS: dict[str, dict[str, str]] = { + "isolate_a_matrix": ISOLATE_A_MATRIX_YAMLS, + "bundle_v0_2": BUNDLE_V0_2_YAMLS, +} + +# Human-readable labels for sheet titles. `useeio` is renamed to make +# clear that the approach uses BEA 2017 detail benchmark A directly with +# no temporal adjustment — the same "2017 benchmark A" the USEEIO method +# applies. +APPROACH_LABELS: dict[str, str] = { + "useeio": "A matrix with 2017 benchmark A", + "summary_tables": "A matrix with summary tables", + "industry_price_index": "A matrix with industry price index", + "commodity_price_index": "A matrix with commodity price index", +} +BASELINE_LABELS: dict[str, str] = { + "ceda": "CEDA based", + "useeio": "USEEIO based", +} + +INDEX_COLUMNS = ( + "scenario", + "approach", + "year", + "baseline", + "config_name", + "sheet_id", + "sheet_title", + "useeio_box_ticked", + "git_ref", + "triggered_at", +) + + +def _drive_client(): # type: ignore[no-untyped-def] + """Return an authenticated Drive v3 client for the active ADC.""" + import google.auth # noqa: PLC0415 + import googleapiclient.discovery # noqa: PLC0415 + + creds, _ = google.auth.default(scopes=["https://www.googleapis.com/auth/drive"]) + return googleapiclient.discovery.build("drive", "v3", credentials=creds) + + +def _create_sheet(folder_id: str, title: str) -> str: + drive = _drive_client() + body = { + "name": title, + "mimeType": "application/vnd.google-apps.spreadsheet", + "parents": [folder_id], + } + file = ( + drive.files().create(body=body, fields="id", supportsAllDrives=True).execute() + ) + return str(file["id"]) + + +def _trigger_workflow( + *, + git_ref: str, + config_name: str, + sheet_id: str, + model_base_year: int, + use_useeio_baseline: bool, +) -> None: + cmd = [ + "gh", + "workflow", + "run", + "generate_diagnostics.yml", + "--ref", + git_ref, + "-f", + f"config_name={config_name}", + "-f", + f"sheet_id={sheet_id}", + "-f", + f"model_base_year={model_base_year}", + "-f", + f"use_useeio_baseline={'true' if use_useeio_baseline else 'false'}", + ] + subprocess.run(cmd, check=True) + + +def _load_index() -> pd.DataFrame: + if EF_RUN_INDEX_PATH.exists(): + df = pd.read_csv(EF_RUN_INDEX_PATH) + else: + df = pd.DataFrame(columns=list(INDEX_COLUMNS)) + # Backfill any columns this script needs that the CSV doesn't carry. + # The Step 6 CSV pre-dates `scenario` / `year` / `git_ref` etc.; we + # treat missing values as "not recorded by this dispatch." + for col in INDEX_COLUMNS: + if col not in df.columns: + df[col] = "" + return df + + +def _append_index_row(row: dict[str, object]) -> None: + df = _load_index() + df = pd.concat([df, pd.DataFrame([row])], ignore_index=True) + EF_RUN_INDEX_PATH.parent.mkdir(parents=True, exist_ok=True) + df.to_csv(EF_RUN_INDEX_PATH, index=False) + + +def _already_recorded( + df: pd.DataFrame, scenario: str, approach: str, year: int, baseline: str +) -> bool: + if df.empty: + return False + # `year` may be int or empty-string for legacy rows; coerce non-numeric + # entries to NaN so the equality compare safely returns False for those. + year_col = pd.to_numeric(df["year"], errors="coerce") + matches = df[ + (df["scenario"] == scenario) + & (df["approach"] == approach) + & (year_col == year) + & (df["baseline"] == baseline) + ] + return not matches.empty + + +def dispatch( + *, + git_ref: str, + scenarios: tuple[str, ...] = ("isolate_a_matrix",), + years: tuple[int, ...] = DEFAULT_YEARS, + use_useeio_baseline: bool = False, + dry_run: bool = False, +) -> None: + baseline_label = "useeio" if use_useeio_baseline else "ceda" + today = dt.datetime.utcnow().strftime("%Y-%m-%d") + + n_planned = 0 + n_skipped = 0 + n_dispatched = 0 + + for scenario in scenarios: + if scenario not in SCENARIO_YAMLS: + raise ValueError( + f"Unknown scenario {scenario!r}. Valid: " f"{sorted(SCENARIO_YAMLS)}" + ) + yamls = SCENARIO_YAMLS[scenario] + if not yamls: + raise ValueError( + f"Scenario {scenario!r} has no YAMLs configured — populate " + f"the corresponding mapping in this script before dispatching." + ) + for approach, config_name in yamls.items(): + for year in years: + n_planned += 1 + index_df = _load_index() + if _already_recorded( + index_df, scenario, approach, year, baseline_label + ): + logger.info( + "Skip already-recorded cell (%s, %s, %d, %s)", + scenario, + approach, + year, + baseline_label, + ) + n_skipped += 1 + continue + + approach_label = APPROACH_LABELS[approach] + baseline_text = BASELINE_LABELS[baseline_label] + title = ( + f"[{today}, {year}, {baseline_text}, " + f"{approach_label}, {scenario}] EFs diagnostics" + ) + + if dry_run: + logger.info("DRY-RUN would create sheet: %s", title) + logger.info( + "DRY-RUN would dispatch: config=%s year=%d use_useeio=%s", + config_name, + year, + use_useeio_baseline, + ) + n_dispatched += 1 + continue + + sheet_id = _create_sheet(EF_TIME_SERIES_DRIVE_FOLDER_ID, title) + logger.info( + "Created sheet %s for (%s, %s, %d, %s)", + sheet_id, + scenario, + approach, + year, + baseline_label, + ) + _trigger_workflow( + git_ref=git_ref, + config_name=config_name, + sheet_id=sheet_id, + model_base_year=year, + use_useeio_baseline=use_useeio_baseline, + ) + _append_index_row( + { + "scenario": scenario, + "approach": approach, + "year": year, + "baseline": baseline_label, + "config_name": config_name, + "sheet_id": sheet_id, + "sheet_title": title, + "useeio_box_ticked": str(use_useeio_baseline).lower(), + "git_ref": git_ref, + "triggered_at": dt.datetime.utcnow().isoformat() + "Z", + } + ) + n_dispatched += 1 + + logger.info( + "Done. planned=%d skipped=%d dispatched=%d", + n_planned, + n_skipped, + n_dispatched, + ) + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--git-ref", + required=True, + help="Git ref (branch or tag) to run the workflow against.", + ) + parser.add_argument( + "--scenarios", + default="isolate_a_matrix", + help=( + "Comma-separated scenarios to dispatch. Valid values: " + "'isolate_a_matrix', 'bundle_v0_2'." + ), + ) + parser.add_argument( + "--years", + default=",".join(str(y) for y in DEFAULT_YEARS), + help=f"Comma-separated years (default: {','.join(str(y) for y in DEFAULT_YEARS)}).", + ) + parser.add_argument( + "--use-useeio-baseline", + action="store_true", + help="Tick the USEEIO baseline box. Default is CEDA-only baseline.", + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="Print the plan without creating Sheets or triggering workflows.", + ) + args = parser.parse_args() + + scenarios = tuple(s.strip() for s in args.scenarios.split(",") if s.strip()) + years = tuple(int(y) for y in args.years.split(",") if y.strip()) + + logging.basicConfig(level=logging.INFO, format="%(message)s") + dispatch( + git_ref=args.git_ref, + scenarios=scenarios, + years=years, + use_useeio_baseline=args.use_useeio_baseline, + dry_run=args.dry_run, + ) + + +if __name__ == "__main__": + main() diff --git a/bedrock/utils/config/usa_config.py b/bedrock/utils/config/usa_config.py index 85b8cc2d..8bed5dc9 100644 --- a/bedrock/utils/config/usa_config.py +++ b/bedrock/utils/config/usa_config.py @@ -16,6 +16,7 @@ 'useeio_baseline_xlsx_gs_uri', 'useeio_baseline_xlsx_sha256', 'useeio_model_version_label', + 'model_base_year', } ) @@ -31,7 +32,7 @@ class USAConfig(BaseModel): ##### # Model base settings ##### - model_base_year: ta.Literal[2017, 2022, 2023, 2024] = 2023 + model_base_year: ta.Literal[2017, 2019, 2020, 2021, 2022, 2023, 2024] = 2023 bea_io_level: ta.Literal['detail', 'summary'] = 'detail' bea_io_scheme: ta.Literal[2017, 2022] = 2017 # documentation purposes price_type: ta.Literal['producer', 'purchaser'] = 'producer' diff --git a/bedrock/utils/validation/generate_diagnostics.py b/bedrock/utils/validation/generate_diagnostics.py index 8c412c10..01ab32db 100644 --- a/bedrock/utils/validation/generate_diagnostics.py +++ b/bedrock/utils/validation/generate_diagnostics.py @@ -49,6 +49,15 @@ '--diagnostics_baseline_source.' ), ) +@click.option( + '--model_base_year', + default=None, + type=int, + help=( + 'Override config model_base_year — used by time-series ' + 'dispatch to vary the year without forking config YAMLs.' + ), +) def generate_diagnostics( sheet_id: str, config_name: str, @@ -56,6 +65,7 @@ def generate_diagnostics( pr_url: str | None, diagnostics_baseline_source: str | None, useeio_baseline_pin_json: str | None, + model_base_year: int | None, ) -> None: total_start = time.time() overrides: dict[str, object] = {} @@ -69,6 +79,8 @@ def generate_diagnostics( overrides['diagnostics_baseline_source'] = 'gcs_useeio_xlsx' if diagnostics_baseline_source is not None: overrides['diagnostics_baseline_source'] = diagnostics_baseline_source + if model_base_year is not None: + overrides['model_base_year'] = model_base_year set_global_usa_config( config_name, diagnostics_cli_overrides=overrides if overrides else None, From c5191cdc1edfc7a05b43212f3d0bc05193ff286a Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 16:28:07 -0700 Subject: [PATCH 16/25] feat(diagnostics): wire usa_ghg_data_year override + bundle_v0_2 time-series dispatch Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/generate_diagnostics.yml | 19 +- .../dispatch_ef_time_series.py | 209 ++++++++++++++++-- bedrock/transform/allocation/derived.py | 31 ++- bedrock/utils/config/usa_config.py | 3 +- .../utils/validation/generate_diagnostics.py | 13 ++ 5 files changed, 254 insertions(+), 21 deletions(-) diff --git a/.github/workflows/generate_diagnostics.yml b/.github/workflows/generate_diagnostics.yml index 73248c5d..5681b8b4 100644 --- a/.github/workflows/generate_diagnostics.yml +++ b/.github/workflows/generate_diagnostics.yml @@ -27,10 +27,25 @@ on: required: false type: string default: "" + usa_ghg_data_year: + description: "Override usa_ghg_data_year (e.g. 2019..2024). Leave empty to use the YAML's value." + required: false + type: string + default: "" env: FORCE_COLOR: 2 +# Belt-and-suspenders against the Sheets-API write quota. The dispatcher +# in `bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py` +# polls for capacity client-side; this directive is the safety net +# preventing accidental parallel runs (e.g. UI-triggered ones) from +# overlapping. With `cancel-in-progress: false`, any third concurrent +# dispatch is dropped — the dispatcher's polling avoids that case. +concurrency: + group: generate_diagnostics + cancel-in-progress: false + jobs: diagnostics: runs-on: ubuntu-latest @@ -61,6 +76,7 @@ jobs: --git_branch "${{ github.ref_name }}" \ ${{ github.event.inputs.pr_url && format('--pr_url "{0}"', github.event.inputs.pr_url) || '' }} \ ${{ github.event.inputs.model_base_year && format('--model_base_year {0}', github.event.inputs.model_base_year) || '' }} \ + ${{ github.event.inputs.usa_ghg_data_year && format('--usa_ghg_data_year {0}', github.event.inputs.usa_ghg_data_year) || '' }} \ --useeio_baseline_pin_json bedrock/utils/snapshots/useeio_baseline_pin.json else uv run python bedrock/utils/validation/generate_diagnostics.py \ @@ -68,7 +84,8 @@ jobs: --config_name "${{ github.event.inputs.config_name }}" \ --git_branch "${{ github.ref_name }}" \ ${{ github.event.inputs.pr_url && format('--pr_url "{0}"', github.event.inputs.pr_url) || '' }} \ - ${{ github.event.inputs.model_base_year && format('--model_base_year {0}', github.event.inputs.model_base_year) || '' }} + ${{ github.event.inputs.model_base_year && format('--model_base_year {0}', github.event.inputs.model_base_year) || '' }} \ + ${{ github.event.inputs.usa_ghg_data_year && format('--usa_ghg_data_year {0}', github.event.inputs.usa_ghg_data_year) || '' }} fi notify_slack_failure: diff --git a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py index 55e9be00..dcf87143 100644 --- a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py +++ b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py @@ -34,8 +34,10 @@ import argparse import datetime as dt +import json import logging import subprocess +import time import pandas as pd @@ -59,14 +61,13 @@ "commodity_price_index": "2025_usa_cornerstone_A_commodity_price_index", } -# `bundle_v0_2`: v0.2 full-model candidates that bundle A-matrix selection -# with every other v0.2 change (GHG methodology, schema, etc.). Populate -# when those YAMLs exist; until then, dispatching `bundle_v0_2` raises. +# `bundle_v0_2`: full v0.2 release-candidate config. Single YAML — +# `2025_usa_cornerstone_full_model` carries all v0.2 flags (cornerstone +# 2026 schema, cornerstone GHG FBS, USEEIO B method, waste disagg). The +# `model_base_year` and `usa_ghg_data_year` overrides drive the time +# series; the YAML itself is year-agnostic. BUNDLE_V0_2_YAMLS: dict[str, str] = { - # "useeio": "", - # "summary_tables": "", - # "industry_price_index": "", - # "commodity_price_index": "", + "full_model": "2025_usa_cornerstone_full_model", } SCENARIO_YAMLS: dict[str, dict[str, str]] = { @@ -83,6 +84,7 @@ "summary_tables": "A matrix with summary tables", "industry_price_index": "A matrix with industry price index", "commodity_price_index": "A matrix with commodity price index", + "full_model": "full v0.2 model", } BASELINE_LABELS: dict[str, str] = { "ceda": "CEDA based", @@ -132,6 +134,7 @@ def _trigger_workflow( sheet_id: str, model_base_year: int, use_useeio_baseline: bool, + usa_ghg_data_year: int | None = None, ) -> None: cmd = [ "gh", @@ -149,9 +152,84 @@ def _trigger_workflow( "-f", f"use_useeio_baseline={'true' if use_useeio_baseline else 'false'}", ] + if usa_ghg_data_year is not None: + cmd += ["-f", f"usa_ghg_data_year={usa_ghg_data_year}"] subprocess.run(cmd, check=True) +def _busy_count(workflow: str = "generate_diagnostics") -> int: + """Number of `queued` + `in_progress` runs of the named workflow.""" + count = 0 + for status in ("queued", "in_progress"): + result = subprocess.run( + [ + "gh", + "run", + "list", + "--workflow", + f"{workflow}.yml", + "--status", + status, + "--limit", + "20", + "--json", + "databaseId", + ], + capture_output=True, + text=True, + check=True, + ) + count += len(json.loads(result.stdout)) + return count + + +def _wait_for_capacity( + *, + poll_interval: int = 15, + timeout: int = 1800, + workflow: str = "generate_diagnostics", +) -> None: + """Block until no `generate_diagnostics` run is queued or in progress. + + Combined with the workflow's `concurrency:` directive, this is the + primary serialization mechanism — guarantees we don't dispatch a new + run while one is still in flight (which would either get cancelled by + the directive or stack up against the Sheets API write quota). + """ + deadline = time.time() + timeout + while time.time() < deadline: + n = _busy_count(workflow) + if n == 0: + return + logger.info("Waiting for %d in-flight %s run(s) to clear...", n, workflow) + time.sleep(poll_interval) + raise TimeoutError( + f"{workflow} runs still busy after {timeout}s; aborting dispatch" + ) + + +def _throttle(mode: str) -> None: + """Apply the configured throttle between successive dispatches. + + Modes: + - ``poll``: block until the workflow has no queued or in-progress runs. + - ``sleep:N``: sleep N seconds (e.g. ``sleep:120``). + - ``none``: no throttle; useful only with a bumped Sheets API quota. + """ + if mode == "poll": + _wait_for_capacity() + elif mode.startswith("sleep:"): + seconds = int(mode.split(":", 1)[1]) + logger.info("Sleeping %ds before next dispatch...", seconds) + time.sleep(seconds) + elif mode == "none": + return + else: + raise ValueError( + f"Unknown throttle {mode!r}. Valid: 'poll', 'sleep:N', 'none'." + ) + + def _load_index() -> pd.DataFrame: if EF_RUN_INDEX_PATH.exists(): df = pd.read_csv(EF_RUN_INDEX_PATH) @@ -193,10 +271,11 @@ def _already_recorded( def dispatch( *, git_ref: str, - scenarios: tuple[str, ...] = ("isolate_a_matrix",), + scenarios: tuple[str, ...] = ("bundle_v0_2",), years: tuple[int, ...] = DEFAULT_YEARS, use_useeio_baseline: bool = False, dry_run: bool = False, + throttle: str = "poll", ) -> None: baseline_label = "useeio" if use_useeio_baseline else "ceda" today = dt.datetime.utcnow().strftime("%Y-%m-%d") @@ -251,6 +330,9 @@ def dispatch( n_dispatched += 1 continue + if n_dispatched > 0: + _throttle(throttle) + sheet_id = _create_sheet(EF_TIME_SERIES_DRIVE_FOLDER_ID, title) logger.info( "Created sheet %s for (%s, %s, %d, %s)", @@ -266,6 +348,7 @@ def dispatch( sheet_id=sheet_id, model_base_year=year, use_useeio_baseline=use_useeio_baseline, + usa_ghg_data_year=year, ) _append_index_row( { @@ -291,6 +374,73 @@ def dispatch( ) +def re_dispatch_from_csv( + *, + git_ref: str, + scenarios: tuple[str, ...] | None = None, + throttle: str = "poll", + dry_run: bool = False, +) -> None: + """Re-trigger workflow runs for cells already recorded in + ``ef_run_index.csv``. Used to recover from rate-limit batch failures — + re-uses the existing Sheets (no new ones created), so the audit trail + keeps the same `sheet_id`s. + + Successful runs that get re-triggered will overwrite their own data + with deterministic identical content; harmless but wastes a few + minutes of runner time. Filter with ``scenarios`` to scope down. + """ + df = _load_index() + if df.empty: + logger.info("No rows in %s; nothing to re-dispatch", EF_RUN_INDEX_PATH) + return + + # Re-dispatch only Step 7 rows (have non-empty scenario + year). + has_step7 = (df["scenario"].astype(str).str.strip() != "") & ( + df["year"].astype(str).str.strip() != "" + ) + df = df[has_step7].copy() + if scenarios: + df = df[df["scenario"].isin(scenarios)] + if df.empty: + logger.info("No matching rows to re-dispatch") + return + + logger.info("Re-dispatching %d cells from %s", len(df), EF_RUN_INDEX_PATH) + n_dispatched = 0 + for _, row in df.iterrows(): + if dry_run: + logger.info( + "DRY-RUN would re-dispatch sheet=%s config=%s year=%s", + row["sheet_id"], + row["config_name"], + row["year"], + ) + n_dispatched += 1 + continue + + if n_dispatched > 0: + _throttle(throttle) + + _trigger_workflow( + git_ref=git_ref, + config_name=str(row["config_name"]), + sheet_id=str(row["sheet_id"]), + model_base_year=int(float(row["year"])), + use_useeio_baseline=str(row["useeio_box_ticked"]).strip().lower() == "true", + usa_ghg_data_year=int(float(row["year"])), + ) + logger.info( + "Re-dispatched sheet %s (%s × %s)", + row["sheet_id"], + row["approach"], + row["year"], + ) + n_dispatched += 1 + + logger.info("Done. re-dispatched=%d", n_dispatched) + + def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( @@ -300,7 +450,7 @@ def main() -> None: ) parser.add_argument( "--scenarios", - default="isolate_a_matrix", + default="bundle_v0_2", help=( "Comma-separated scenarios to dispatch. Valid values: " "'isolate_a_matrix', 'bundle_v0_2'." @@ -321,19 +471,46 @@ def main() -> None: action="store_true", help="Print the plan without creating Sheets or triggering workflows.", ) + parser.add_argument( + "--throttle", + default="poll", + help=( + "How to space successive workflow triggers. 'poll' (default) " + "blocks until prior runs clear; 'sleep:N' sleeps N seconds; " + "'none' fires immediately (only safe with bumped Sheets API quota)." + ), + ) + parser.add_argument( + "--re-dispatch-from-csv", + action="store_true", + help=( + "Re-trigger workflows for cells already in ef_run_index.csv. " + "Used to recover from rate-limit batch failures — re-uses " + "existing Sheets, no new ones created." + ), + ) args = parser.parse_args() scenarios = tuple(s.strip() for s in args.scenarios.split(",") if s.strip()) years = tuple(int(y) for y in args.years.split(",") if y.strip()) logging.basicConfig(level=logging.INFO, format="%(message)s") - dispatch( - git_ref=args.git_ref, - scenarios=scenarios, - years=years, - use_useeio_baseline=args.use_useeio_baseline, - dry_run=args.dry_run, - ) + if args.re_dispatch_from_csv: + re_dispatch_from_csv( + git_ref=args.git_ref, + scenarios=scenarios, + throttle=args.throttle, + dry_run=args.dry_run, + ) + else: + dispatch( + git_ref=args.git_ref, + scenarios=scenarios, + years=years, + use_useeio_baseline=args.use_useeio_baseline, + dry_run=args.dry_run, + throttle=args.throttle, + ) if __name__ == "__main__": diff --git a/bedrock/transform/allocation/derived.py b/bedrock/transform/allocation/derived.py index 62aed3a2..dfccdb17 100644 --- a/bedrock/transform/allocation/derived.py +++ b/bedrock/transform/allocation/derived.py @@ -32,10 +32,35 @@ def _select_flowsa_ghg_method() -> str: - """Select FBS methodname from USA config (first match wins).""" + """Select FBS methodname from USA config (first match wins). + + The base `new_ghg_method` and CEDA fallback methods are parameterized on + `usa_ghg_data_year`. The variant FBSes (`*_coa_allocation`, `*_electricity`, + etc.) are 2023-only; if any of those flags is set with a non-2023 year we + raise here rather than failing later with an opaque "FBS not found". + """ usa = get_usa_config() + year = usa.usa_ghg_data_year + needs_2023 = ( + usa.update_ghg_coa_allocation + or usa.update_electricity_ghg_method + or usa.update_other_gases_ghg_method + or usa.update_ghg_attribution_method_for_ng_and_petrol_systems + or usa.update_flowsa_refrigerant_method + or usa.update_transportation_ghg_method + or usa.add_new_ghg_activities + or usa.update_enteric_fermentation_and_manure_management_ghg_method + or usa.update_liming_and_fertilizer_ghg_method + ) + if needs_2023 and year != 2023: + raise ValueError( + f'usa_ghg_data_year={year} is incompatible with the active ' + 'update_*_ghg_method flag — variant FBS methods only exist ' + 'for 2023. Either set usa_ghg_data_year=2023 or disable the ' + 'update_*_ghg_method flag.' + ) if usa.new_ghg_method: - return 'GHG_national_Cornerstone_2023' + return f'GHG_national_Cornerstone_{year}' if usa.use_ghg_national_2023_m2: return 'GHG_national_2023_m2' if usa.update_ghg_coa_allocation: @@ -56,7 +81,7 @@ def _select_flowsa_ghg_method() -> str: return 'GHG_national_Cornerstone_2023_ag_livestock' if usa.update_liming_and_fertilizer_ghg_method: return 'GHG_national_Cornerstone_2023_ag_soils' - return 'GHG_national_CEDA_2023' + return f'GHG_national_CEDA_{year}' def _build_mapping_with_allocations( diff --git a/bedrock/utils/config/usa_config.py b/bedrock/utils/config/usa_config.py index 8bed5dc9..05cd7296 100644 --- a/bedrock/utils/config/usa_config.py +++ b/bedrock/utils/config/usa_config.py @@ -17,6 +17,7 @@ 'useeio_baseline_xlsx_sha256', 'useeio_model_version_label', 'model_base_year', + 'usa_ghg_data_year', } ) @@ -47,7 +48,7 @@ class USAConfig(BaseModel): usa_io_data_year: ta.Literal[2017, 2022, 2023, 2024] = ( 2022 # CEDA's legacy USA IO data year ) - usa_ghg_data_year: ta.Literal[2023, 2024] = 2023 + usa_ghg_data_year: ta.Literal[2019, 2020, 2021, 2022, 2023, 2024] = 2023 ipcc_ar_version: ta.Literal['AR5', 'AR6'] = 'AR6' diff --git a/bedrock/utils/validation/generate_diagnostics.py b/bedrock/utils/validation/generate_diagnostics.py index 01ab32db..7dabc73d 100644 --- a/bedrock/utils/validation/generate_diagnostics.py +++ b/bedrock/utils/validation/generate_diagnostics.py @@ -58,6 +58,16 @@ 'dispatch to vary the year without forking config YAMLs.' ), ) +@click.option( + '--usa_ghg_data_year', + default=None, + type=int, + help=( + 'Override config usa_ghg_data_year — used by time-series ' + 'dispatch to vary the GHG inventory year alongside ' + 'model_base_year.' + ), +) def generate_diagnostics( sheet_id: str, config_name: str, @@ -66,6 +76,7 @@ def generate_diagnostics( diagnostics_baseline_source: str | None, useeio_baseline_pin_json: str | None, model_base_year: int | None, + usa_ghg_data_year: int | None, ) -> None: total_start = time.time() overrides: dict[str, object] = {} @@ -81,6 +92,8 @@ def generate_diagnostics( overrides['diagnostics_baseline_source'] = diagnostics_baseline_source if model_base_year is not None: overrides['model_base_year'] = model_base_year + if usa_ghg_data_year is not None: + overrides['usa_ghg_data_year'] = usa_ghg_data_year set_global_usa_config( config_name, diagnostics_cli_overrides=overrides if overrides else None, From ae41e3128452b8b1912945b0b4a1f38ce7e0e065 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 16:56:25 -0700 Subject: [PATCH 17/25] fix(diagnostics): bypass-flowsa FBS load + Sheet1 cleanup + dispatch race Co-Authored-By: Claude Opus 4.7 (1M context) --- .../dispatch_ef_time_series.py | 10 ++++ bedrock/transform/allocation/derived.py | 60 +++++++++++++++++-- bedrock/utils/io/gcp.py | 28 +++++++++ .../utils/validation/generate_diagnostics.py | 10 +++- 4 files changed, 102 insertions(+), 6 deletions(-) diff --git a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py index dcf87143..9c89977f 100644 --- a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py +++ b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py @@ -188,6 +188,7 @@ def _wait_for_capacity( poll_interval: int = 15, timeout: int = 1800, workflow: str = "generate_diagnostics", + initial_delay: int = 15, ) -> None: """Block until no `generate_diagnostics` run is queued or in progress. @@ -195,7 +196,16 @@ def _wait_for_capacity( primary serialization mechanism — guarantees we don't dispatch a new run while one is still in flight (which would either get cancelled by the directive or stack up against the Sheets API write quota). + + ``initial_delay`` blocks before the first poll so a just-triggered + workflow has time to register as ``queued``. Without it, the post- + dispatch visibility lag (~10–20s) lets ``_busy_count`` see 0 and we + fire the next dispatch immediately, which the workflow's + ``cancel-in-progress: false`` then resolves by killing the older + pending run. """ + if initial_delay: + time.sleep(initial_delay) deadline = time.time() + timeout while time.time() < deadline: n = _busy_count(workflow) diff --git a/bedrock/transform/allocation/derived.py b/bedrock/transform/allocation/derived.py index dfccdb17..44a2040d 100644 --- a/bedrock/transform/allocation/derived.py +++ b/bedrock/transform/allocation/derived.py @@ -325,6 +325,45 @@ def map_fbs_sectors_to_model_schema(fbs: pd.DataFrame) -> pd.DataFrame: return fbs3 +def _load_cornerstone_ghg_fbs_from_gcs(year: int) -> pd.DataFrame: + """Download a year-specific Cornerstone GHG FBS parquet from GCS. + + Bypasses ``getFlowBySector`` for the time-series case. The flowsa + regen path goes through `EPA_GHGI` loaders that are hard-capped at + `{2022, 2023}` (`bedrock/extract/allocation/epa.py:_get_epa_data_year`), + so years like 2019–2021 fail there. The pre-built FBS parquets in + ``gs://cornerstone-default/transform/output_data/`` cover 2019–2023 + already, so we load them directly. + + Picks the most-recently-uploaded parquet whose ``base_name`` matches + ``GHG_national_Cornerstone_`` so we follow the FBS regeneration + cadence without pinning the version/hash here. + """ + from bedrock.utils.io.gcp import ( # noqa: PLC0415 + download_gcs_file_if_not_exists, + list_bucket_files, + ) + + sub_bucket = "transform/output_data" + base_name = f"GHG_national_Cornerstone_{year}" + bucket_df = list_bucket_files(sub_bucket) + matches = bucket_df[ + (bucket_df["base_name"] == base_name) & (bucket_df["extension"] == ".parquet") + ].sort_values("created", ascending=False) + if matches.empty: + raise FileNotFoundError( + f"No FBS parquet found at gs://cornerstone-default/{sub_bucket}/ " + f"matching base_name={base_name!r}" + ) + filename = matches.iloc[0]["full_path"].rsplit("/", 1)[-1] + from bedrock.utils.config.settings import FBS_DIR # noqa: PLC0415 + + local_path = str(FBS_DIR / filename) + download_gcs_file_if_not_exists(filename, sub_bucket, local_path) + logger.info("Loaded cached FBS for %d from %s", year, filename) + return pd.read_parquet(local_path) + + def load_E_from_flowsa() -> pd.DataFrame: """Load E_usa (GHG × CEDA v7 sectors) from the CEDA FBS. @@ -352,12 +391,23 @@ def load_E_from_flowsa() -> pd.DataFrame: Only used when load_E_from_flowsa is True in USA config. """ - methodname = _select_flowsa_ghg_method() - if methodname == 'GHG_national_2023_m2': - # For m2, explicitly attempt remote FBS download before generation. - fbs = getFlowBySector(methodname=methodname, download_FBS_if_missing=True) + usa = get_usa_config() + if usa.new_ghg_method: + # Bypass flowsa regen for non-2023 years: the EPA loader behind + # `getFlowBySector` is hard-capped at {2022, 2023}, but the + # already-built FBS parquets exist on GCS at + # `transform/output_data/` for 2019–2023. Load the cached parquet + # directly so the year-Y diagnostics get year-Y GHG data. + fbs = _load_cornerstone_ghg_fbs_from_gcs(usa.usa_ghg_data_year) else: - fbs = getFlowBySector(methodname=methodname) + methodname = _select_flowsa_ghg_method() + if methodname == 'GHG_national_2023_m2': + # For m2, explicitly attempt remote FBS download before generation. + fbs = getFlowBySector( + methodname=methodname, download_FBS_if_missing=True + ) + else: + fbs = getFlowBySector(methodname=methodname) fbs = map_fbs_sectors_to_model_schema(fbs) diff --git a/bedrock/utils/io/gcp.py b/bedrock/utils/io/gcp.py index 99ca8c65..9385d02d 100644 --- a/bedrock/utils/io/gcp.py +++ b/bedrock/utils/io/gcp.py @@ -372,6 +372,34 @@ def update_sheet_tab( ).execute() +def delete_default_sheet1(sheet_id: str) -> None: + """Delete the default ``Sheet1`` tab if other tabs exist. + + Newly-created spreadsheets always have a ``Sheet1`` placeholder. + Diagnostics runs leave it behind; this helper removes it. No-op if + ``Sheet1`` doesn't exist or it's the only tab (Google Sheets requires + at least one tab per spreadsheet). + """ + client = __sheets_client() + metadata = client.spreadsheets().get(spreadsheetId=sheet_id).execute() + sheets = metadata.get("sheets", []) + sheet1 = next( + (s for s in sheets if s["properties"]["title"] == "Sheet1"), + None, + ) + if sheet1 is None: + return + if len(sheets) <= 1: + logger.info("Skipping Sheet1 deletion on %s: it's the only tab.", sheet_id) + return + sheet1_id = sheet1["properties"]["sheetId"] + client.spreadsheets().batchUpdate( + spreadsheetId=sheet_id, + body={"requests": [{"deleteSheet": {"sheetId": sheet1_id}}]}, + ).execute() + logger.info('deleted default Sheet1 from "%s"', sheet_id) + + def list_bucket_files(sub_bucket: str = "") -> pd.DataFrame: """ List all files in the GCS bucket and return a DataFrame diff --git a/bedrock/utils/validation/generate_diagnostics.py b/bedrock/utils/validation/generate_diagnostics.py index 7dabc73d..a754a989 100644 --- a/bedrock/utils/validation/generate_diagnostics.py +++ b/bedrock/utils/validation/generate_diagnostics.py @@ -14,7 +14,7 @@ GIT_PR_URL, ) from bedrock.utils.config.usa_config import get_usa_config, set_global_usa_config -from bedrock.utils.io.gcp import update_sheet_tab +from bedrock.utils.io.gcp import delete_default_sheet1, update_sheet_tab from bedrock.utils.snapshots.loader import resolve_snapshot_key logger = logging.getLogger(__name__) @@ -150,6 +150,14 @@ def generate_diagnostics( config_df, ) logger.info(f'[TIMING] Config summary update completed in {time.time() - t0:.1f}s') + + # Drop the placeholder Sheet1 that Google creates by default on every + # new spreadsheet — diagnostics runs leave it behind otherwise. + try: + delete_default_sheet1(sheet_id) + except Exception as e: # noqa: BLE001 + logger.warning('Sheet1 cleanup skipped (%s: %s)', type(e).__name__, e) + logger.info( f'[TIMING] Total diagnostics completed in {time.time() - total_start:.1f}s' ) From cbb04dd8533d75ccf4d6f933fec51684b0c667a8 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 17:02:47 -0700 Subject: [PATCH 18/25] fix(diagnostics): use download_gcs_file for FBS cache to avoid metadata-overwrite Co-Authored-By: Claude Opus 4.7 (1M context) --- bedrock/transform/allocation/derived.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/bedrock/transform/allocation/derived.py b/bedrock/transform/allocation/derived.py index 44a2040d..d2361a38 100644 --- a/bedrock/transform/allocation/derived.py +++ b/bedrock/transform/allocation/derived.py @@ -339,8 +339,11 @@ def _load_cornerstone_ghg_fbs_from_gcs(year: int) -> pd.DataFrame: ``GHG_national_Cornerstone_`` so we follow the FBS regeneration cadence without pinning the version/hash here. """ + import os # noqa: PLC0415 + + from bedrock.utils.config.settings import FBS_DIR # noqa: PLC0415 from bedrock.utils.io.gcp import ( # noqa: PLC0415 - download_gcs_file_if_not_exists, + download_gcs_file, list_bucket_files, ) @@ -356,10 +359,12 @@ def _load_cornerstone_ghg_fbs_from_gcs(year: int) -> pd.DataFrame: f"matching base_name={base_name!r}" ) filename = matches.iloc[0]["full_path"].rsplit("/", 1)[-1] - from bedrock.utils.config.settings import FBS_DIR # noqa: PLC0415 - local_path = str(FBS_DIR / filename) - download_gcs_file_if_not_exists(filename, sub_bucket, local_path) + # Use `download_gcs_file` rather than `_if_not_exists`: the latter + # downloads ALL files matching the parsed (base, version, hash) into + # the same `pth`, so the metadata JSON overwrites the parquet. + if not os.path.exists(local_path): + download_gcs_file(filename, sub_bucket, local_path) logger.info("Loaded cached FBS for %d from %s", year, filename) return pd.read_parquet(local_path) From 5dce39cd04acef1cce9dbeac3733e36bdb689f38 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 17:27:20 -0700 Subject: [PATCH 19/25] =?UTF-8?q?feat(diagnostics):=20bundle=5Fv0=5F2=20?= =?UTF-8?q?=3D=204=20A-matrix=20configs=20=C3=97=20full=20v0.2=20stack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- .../dispatch_ef_time_series.py | 15 +++++++++------ ...rstone_full_model_A_commodity_price_index.yaml | 11 +++++++++++ ...erstone_full_model_A_industry_price_index.yaml | 8 ++++++++ ...a_cornerstone_full_model_A_summary_tables.yaml | 8 ++++++++ .../2025_usa_cornerstone_full_model_A_useeio.yaml | 8 ++++++++ 5 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_commodity_price_index.yaml create mode 100644 bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_industry_price_index.yaml create mode 100644 bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_summary_tables.yaml create mode 100644 bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_useeio.yaml diff --git a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py index 9c89977f..e13fdd48 100644 --- a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py +++ b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py @@ -61,13 +61,16 @@ "commodity_price_index": "2025_usa_cornerstone_A_commodity_price_index", } -# `bundle_v0_2`: full v0.2 release-candidate config. Single YAML — -# `2025_usa_cornerstone_full_model` carries all v0.2 flags (cornerstone -# 2026 schema, cornerstone GHG FBS, USEEIO B method, waste disagg). The -# `model_base_year` and `usa_ghg_data_year` overrides drive the time -# series; the YAML itself is year-agnostic. +# `bundle_v0_2`: full v0.2 release-candidate ensembles. Each YAML carries +# the full v0.2 flag stack (cornerstone 2026 schema, cornerstone GHG FBS, +# USEEIO B method, waste disagg) PLUS one A-matrix scaling alternative. +# The `model_base_year` and `usa_ghg_data_year` overrides drive the time +# series; the YAMLs themselves are year-agnostic. BUNDLE_V0_2_YAMLS: dict[str, str] = { - "full_model": "2025_usa_cornerstone_full_model", + "useeio": "2025_usa_cornerstone_full_model_A_useeio", + "summary_tables": "2025_usa_cornerstone_full_model_A_summary_tables", + "industry_price_index": "2025_usa_cornerstone_full_model_A_industry_price_index", + "commodity_price_index": "2025_usa_cornerstone_full_model_A_commodity_price_index", } SCENARIO_YAMLS: dict[str, dict[str, str]] = { diff --git a/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_commodity_price_index.yaml b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_commodity_price_index.yaml new file mode 100644 index 00000000..2cee89b3 --- /dev/null +++ b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_commodity_price_index.yaml @@ -0,0 +1,11 @@ +# Full v0.2 model bundled with V-norm-derived commodity-price-index +# A-matrix scaling. A is inflated 2017 → target year using a V-norm- +# weighted commodity price ratio; V is itself inflated to model_base_year +# via apply_inflation_to_V. +use_cornerstone_2026_model_schema: True +load_E_from_flowsa: True +new_ghg_method: True +use_E_data_year_for_x_in_B: True +implement_waste_disaggregation: True +scale_a_matrix_with_commodity_price_index: True +apply_inflation_to_V: True diff --git a/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_industry_price_index.yaml b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_industry_price_index.yaml new file mode 100644 index 00000000..a0160375 --- /dev/null +++ b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_industry_price_index.yaml @@ -0,0 +1,8 @@ +# Full v0.2 model bundled with industry-price-index A-matrix scaling: +# A is inflated 2017 → target year via BEA industry price index. +use_cornerstone_2026_model_schema: True +load_E_from_flowsa: True +new_ghg_method: True +use_E_data_year_for_x_in_B: True +implement_waste_disaggregation: True +scale_a_matrix_with_industry_price_index: True diff --git a/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_summary_tables.yaml b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_summary_tables.yaml new file mode 100644 index 00000000..eba708f5 --- /dev/null +++ b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_summary_tables.yaml @@ -0,0 +1,8 @@ +# Full v0.2 model bundled with summary-tables A-matrix scaling: +# A is scaled 2017 → target year via BEA summary-table ratios. +use_cornerstone_2026_model_schema: True +load_E_from_flowsa: True +new_ghg_method: True +use_E_data_year_for_x_in_B: True +implement_waste_disaggregation: True +scale_a_matrix_with_summary_tables: True diff --git a/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_useeio.yaml b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_useeio.yaml new file mode 100644 index 00000000..8ffb2dc7 --- /dev/null +++ b/bedrock/utils/config/configs/2025_usa_cornerstone_full_model_A_useeio.yaml @@ -0,0 +1,8 @@ +# Full v0.2 model bundled with USEEIO A-matrix method: +# A is the BEA 2017 detail benchmark with no temporal scaling. +use_cornerstone_2026_model_schema: True +load_E_from_flowsa: True +new_ghg_method: True +use_E_data_year_for_x_in_B: True +implement_waste_disaggregation: True +scale_a_matrix_with_useeio_method: True From 772b7ec95ca89839b169cf0f078e2593e75ad5a1 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 18:41:36 -0700 Subject: [PATCH 20/25] feat(analysis): deflate D_new/N_new to common ref-year for time series Each diagnostics cell runs at model_base_year=Y so D_new/N_new are denominated in year-Y dollars. Cross-year comparison requires a single dollar reference; add D_new_ref/N_new_ref columns that apply inflation_adjust_ef_denom_to_new_base_year to land every cell on REFERENCE_DOLLAR_YEAR (2023). Step 6 single-year rows (empty year column) skip the step and behave unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../compile_ef_diagnostics.py | 61 +++++++++++++++++-- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index b930616d..72dec847 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -30,6 +30,7 @@ from __future__ import annotations import logging +import typing as ta import pandas as pd @@ -39,6 +40,9 @@ RESULTS_DIR, ) from bedrock.utils.io.gcp import read_sheet_tab, update_sheet_tab +from bedrock.utils.validation.diagnostics_helpers import ( + inflation_adjust_ef_denom_to_new_base_year, +) logger = logging.getLogger(__name__) @@ -49,6 +53,11 @@ # A row counts as "significantly different" when |perc_diff| exceeds this. SIGNIFICANT_PCT_THRESHOLD = 0.10 +# Time-series cells differ in `model_base_year`, so each cell's `D_new` / +# `N_new` lives in its own dollar year. Deflate them to this common reference +# so values are commensurable across years. +REFERENCE_DOLLAR_YEAR = 2023 + # Tab names produced by `calculate_ef_diagnostics.py` per run. Both # baseline modes (CEDA-only and USEEIO-checked) emit identical column # headers — confirmed via spot-check. @@ -74,7 +83,9 @@ def _coerce_numeric(df: pd.DataFrame, cols: tuple[str, ...]) -> pd.DataFrame: s = df[col].astype(str).str.strip() is_pct = s.str.endswith("%") cleaned = s.str.rstrip("%").str.replace(",", "", regex=False) - numeric = pd.to_numeric(cleaned, errors="coerce") + numeric = ta.cast( + "pd.Series", pd.to_numeric(cleaned, errors="coerce") + ) df[col] = numeric.mask(is_pct, numeric / 100) return df @@ -93,6 +104,34 @@ def _read_pair(sheet_id: str) -> pd.DataFrame: return n.join(d.drop(columns=drop_from_d), how="outer") +def _deflate_new_to_ref( + joined: pd.DataFrame, source_year: int, ref_year: int +) -> pd.DataFrame: + """Add ``D_new_ref`` / ``N_new_ref`` columns deflated to ``ref_year`` dollars. + + Each diagnostics cell is run with ``model_base_year=source_year``, so + ``D_new`` / ``N_new`` are denominated in ``source_year`` dollars. Time-series + plots over years require a common dollar reference; this multiplies by the + same per-sector price ratio used for baseline alignment. + """ + if source_year == ref_year: + if "D_new" in joined.columns: + joined["D_new_ref"] = joined["D_new"] + if "N_new" in joined.columns: + joined["N_new_ref"] = joined["N_new"] + return joined + for new_col, ref_col in (("D_new", "D_new_ref"), ("N_new", "N_new_ref")): + if new_col not in joined.columns: + continue + col_series = ta.cast("pd.Series", joined[new_col]).astype(float) + joined[ref_col] = inflation_adjust_ef_denom_to_new_base_year( + old_ef_vector=col_series, + new_base_year=ref_year, + old_base_year=source_year, + ) + return joined + + def _summarize(joined: pd.DataFrame, approach: str) -> pd.Series: n_perc = joined["N_perc_diff"].abs() d_perc = joined["D_perc_diff"].abs() @@ -130,8 +169,10 @@ def _scatter_coords(joined: pd.DataFrame, approach: str, baseline: str) -> pd.Da rows.append(chunk) if not rows: return pd.DataFrame() - return pd.concat(rows, ignore_index=True)[ - ["approach", "baseline", "ef_kind", "sector", "x_baseline", "y_approach"] + combined = ta.cast("pd.DataFrame", pd.concat(rows, ignore_index=True)) + return combined.loc[ + :, + ["approach", "baseline", "ef_kind", "sector", "x_baseline", "y_approach"], ] @@ -172,8 +213,14 @@ def main() -> None: approach = str(row["approach"]) baseline = str(row["baseline"]) sheet_id = str(row["sheet_id"]) - scenario = str(row["scenario"]) if pd.notna(row["scenario"]) else "" - year = str(row["year"]) if pd.notna(row["year"]) else "" + scenario = ( + str(row["scenario"]) + if ta.cast(bool, pd.notna(row["scenario"])) + else "" + ) + year = ( + str(row["year"]) if ta.cast(bool, pd.notna(row["year"])) else "" + ) cell_label = ", ".join( f"{k}={v}" for k, v in ( @@ -189,6 +236,10 @@ def main() -> None: if joined.empty: logger.warning("%s returned empty data; skipping", cell_label) continue + if year: + joined = _deflate_new_to_ref( + joined, source_year=int(year), ref_year=REFERENCE_DOLLAR_YEAR + ) # Build a deterministic 31-char-bounded tab name including any # populated scenario/year prefix. prefix = "_".join(p for p in (scenario, year) if p) From 3bbf67a3f36aaf756bbd3cf4fc2523a7e0207790 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 19:08:14 -0700 Subject: [PATCH 21/25] fix(diagnostics): retry _busy_count on transient gh subprocess failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dispatcher previously crashed mid-run when `gh run list` returned non-zero exit (transient API hiccup mid-batch). Now retries 3× per status with a 5s backoff and falls back to a "still busy" sentinel so the poll loop keeps spinning instead of unwinding the dispatch and losing the queue. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../dispatch_ef_time_series.py | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py index e13fdd48..fa0fec6c 100644 --- a/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py +++ b/bedrock/analysis/a_matrix_time_series/dispatch_ef_time_series.py @@ -161,28 +161,48 @@ def _trigger_workflow( def _busy_count(workflow: str = "generate_diagnostics") -> int: - """Number of `queued` + `in_progress` runs of the named workflow.""" + """Number of `queued` + `in_progress` runs of the named workflow. + + Retries each ``gh run list`` call on transient subprocess failures + (e.g. GitHub API hiccups). After exhausted retries, returns ``1`` to + signal "still busy" so the caller keeps polling rather than dispatching + blindly into an unknown queue state. + """ count = 0 for status in ("queued", "in_progress"): - result = subprocess.run( - [ - "gh", - "run", - "list", - "--workflow", - f"{workflow}.yml", - "--status", - status, - "--limit", - "20", - "--json", - "databaseId", - ], - capture_output=True, - text=True, - check=True, - ) - count += len(json.loads(result.stdout)) + for attempt in range(3): + try: + result = subprocess.run( + [ + "gh", + "run", + "list", + "--workflow", + f"{workflow}.yml", + "--status", + status, + "--limit", + "20", + "--json", + "databaseId", + ], + capture_output=True, + text=True, + check=True, + ) + count += len(json.loads(result.stdout)) + break + except subprocess.CalledProcessError as e: + stderr = (e.stderr or "").strip() + if attempt == 2: + logger.warning( + "gh run list failed for status=%s after 3 attempts: %s; " + "treating as busy and continuing poll loop", + status, + stderr or "(no stderr)", + ) + return 1 + time.sleep(5) return count From 1e99bcf31b9ad341927b666279b556fac0a124f0 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 22:11:24 -0700 Subject: [PATCH 22/25] feat(analysis): N time-series stability comparison across A-matrix methods --- .../compare_method_stability.py | 418 ++++++++++++++++++ .../compile_ef_diagnostics.py | 4 +- 2 files changed, 421 insertions(+), 1 deletion(-) create mode 100644 bedrock/analysis/a_matrix_time_series/compare_method_stability.py diff --git a/bedrock/analysis/a_matrix_time_series/compare_method_stability.py b/bedrock/analysis/a_matrix_time_series/compare_method_stability.py new file mode 100644 index 00000000..1b2a6f61 --- /dev/null +++ b/bedrock/analysis/a_matrix_time_series/compare_method_stability.py @@ -0,0 +1,418 @@ +"""Compare year-over-year stability of N across 3 A-matrix methods. + +Reads the per-pair tabs in ``ef_comparison.xlsx`` (produced by +``compile_ef_diagnostics.py`` after dispatching the time-series cells), +computes per-sector year-over-year (YoY) changes in ``N_new_ref`` (deflated +to 2023$), and rolls up to per-approach metrics. + +The ``useeio`` approach is excluded — it pins A to the 2017 detail benchmark +with no temporal scaling, so its N time series reflects only B/x drift and +does not represent a comparable method here. + +Per-approach metrics: +- ``mean_abs_yoy_pct`` — average |YoY %| across the 4 transitions + (2019→20, 20→21, 21→22, 22→23). The headline stability metric. +- ``max_abs_yoy_pct`` — biggest single-year swing (tail). +- ``total_drift_pct`` — ``N_2023 / N_2019 - 1``. End-to-end shift. + +Each metric is rolled up three ways: median (typical sector), p95 (tail), +and emissions-weighted (by ``mean_N``, the metric to optimize). + +Outputs: +- ``output/results/n_yoy_ranking.csv`` +- ``output/results/n_yoy_per_sector.csv`` +- ``output/plots/n_indexed_lines.png`` — top-K sectors, N indexed to + year-2019 = 100, faceted by method +- ``output/plots/n_yoy_distribution.png`` — boxplot of |YoY %| + distributions per method + +Usage: + python -m bedrock.analysis.a_matrix_time_series.compare_method_stability +""" + +from __future__ import annotations + +import logging +import re +import typing as ta +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd + +from bedrock.analysis.a_matrix_time_series.constants import ( + PLOTS_DIR, + RESULTS_DIR, +) + +logger = logging.getLogger(__name__) + +EF_COMPARISON_XLSX_PATH = RESULTS_DIR / "ef_comparison.xlsx" +YOY_RANKING_PATH = RESULTS_DIR / "n_yoy_ranking.csv" +YOY_PER_SECTOR_PATH = RESULTS_DIR / "n_yoy_per_sector.csv" +INDEXED_LINES_PLOT_PATH = PLOTS_DIR / "n_indexed_lines.png" +YOY_DISTRIBUTION_PLOT_PATH = PLOTS_DIR / "n_yoy_distribution.png" + +# `compile_ef_diagnostics.py` keys per-pair tabs as +# `{scenario}_{year}.0_{approach}__vs_{baseline}` truncated to 31 chars. +TAB_RE = re.compile( + r"^(?P[a-z0-9_]+?)_(?P\d{4})(?:\.0)?_(?P.+)$" +) +APPROACH_PREFIXES: tuple[tuple[str, str], ...] = ( + ("commodity_pr", "commodity_price_index"), + ("industry_pri", "industry_price_index"), + ("summary_tabl", "summary_tables"), + ("useeio", "useeio"), +) + +EXCLUDED_APPROACHES: frozenset[str] = frozenset({"useeio"}) + +YEARS: tuple[int, ...] = (2019, 2020, 2021, 2022, 2023) +YOY_TRANSITIONS: tuple[tuple[int, int], ...] = tuple( + (YEARS[i], YEARS[i + 1]) for i in range(len(YEARS) - 1) +) + +# Drop sectors with mean N below this percentile from non-weighted metrics +# to avoid YoY % blow-up from numerical noise on near-zero means. +MIN_MEAN_PERCENTILE = 5 + +# Cumulative-share threshold for the indexed line plot: include the smallest +# set of sectors whose cumulative |mean_N| reaches this fraction of the total. +# These are the lines that actually move corporate-footprint outcomes. +LINE_PLOT_CUMULATIVE_SHARE = 0.30 +# Hard ceiling so the plot stays readable even if the head is very long-tailed. +LINE_PLOT_MAX_SECTORS = 8 + + +def _parse_tab(tab: str) -> tuple[str, int, str] | None: + """Return ``(scenario, year, approach)`` for a time-series tab, else None.""" + m = TAB_RE.match(tab) + if m is None: + return None + rest = m.group("rest") + for prefix, approach in APPROACH_PREFIXES: + if rest.startswith(prefix): + return m.group("scenario"), int(m.group("year")), approach + return None + + +def _read_panel(xlsx_path: Path) -> pd.DataFrame: + """Long-format panel: ``(scenario, approach, year, sector, N_new_ref)``. + + Excludes the approaches in ``EXCLUDED_APPROACHES``. + """ + if not xlsx_path.exists(): + raise FileNotFoundError( + f"{xlsx_path} not found — run compile_ef_diagnostics.py first." + ) + xls = pd.ExcelFile(xlsx_path) + rows: list[pd.DataFrame] = [] + for tab in xls.sheet_names: + parsed = _parse_tab(tab) + if parsed is None: + continue + scenario, year, approach = parsed + if approach in EXCLUDED_APPROACHES: + continue + df = pd.read_excel(xls, sheet_name=tab) + if "N_new_ref" not in df.columns: + logger.warning( + "Tab %r missing N_new_ref — re-run compile after the deflation " + "step was added.", + tab, + ) + continue + sector_col = df.columns[0] + chunk = pd.DataFrame( + { + "scenario": scenario, + "approach": approach, + "year": year, + "sector": df[sector_col].astype(str), + "N_new_ref": pd.to_numeric(df["N_new_ref"], errors="coerce"), + } + ) + rows.append(chunk) + if not rows: + raise RuntimeError( + f"No time-series tabs found in {xlsx_path}; verify compile output." + ) + return pd.concat(rows, ignore_index=True) + + +def _yoy_per_sector(panel: pd.DataFrame) -> pd.DataFrame: + """Per ``(approach, sector)``: per-year N + YoY %s + aggregates.""" + wide = panel.pivot_table( + index=["approach", "sector"], + columns="year", + values="N_new_ref", + aggfunc="first", + ) + # Make sure every year-column we expect exists (NaN if a cell missing). + for y in YEARS: + if y not in wide.columns: + wide[y] = np.nan + wide = ta.cast("pd.DataFrame", wide[list(YEARS)]) + wide.columns = pd.Index([f"N_{y}" for y in YEARS]) + wide = wide.reset_index() + + # YoY % change for each transition. + yoy_cols: list[str] = [] + for y0, y1 in YOY_TRANSITIONS: + col = f"yoy_{y0}_{y1}" + prev = wide[f"N_{y0}"] + curr = wide[f"N_{y1}"] + wide[col] = (curr - prev) / prev.abs() + yoy_cols.append(col) + + abs_yoy = wide[yoy_cols].abs() + wide["mean_abs_yoy_pct"] = abs_yoy.mean(axis=1) + wide["max_abs_yoy_pct"] = abs_yoy.max(axis=1) + wide["total_drift_pct"] = ( + wide[f"N_{YEARS[-1]}"] - wide[f"N_{YEARS[0]}"] + ) / wide[f"N_{YEARS[0]}"].abs() + wide["abs_total_drift_pct"] = wide["total_drift_pct"].abs() + wide["mean_N"] = wide[[f"N_{y}" for y in YEARS]].mean(axis=1) + return wide + + +def _aggregate(per_sector: pd.DataFrame) -> pd.DataFrame: + """Per approach: median / p95 / emissions-weighted of each YoY metric.""" + metrics = ("mean_abs_yoy_pct", "max_abs_yoy_pct", "abs_total_drift_pct") + rows: list[dict[str, object]] = [] + for approach in sorted(per_sector["approach"].unique()): + grp = ta.cast( + "pd.DataFrame", per_sector[per_sector["approach"] == approach] + ) + cutoff = grp["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) + big = ta.cast("pd.DataFrame", grp[grp["mean_N"].abs() >= cutoff]) + weights = big["mean_N"].abs() + row: dict[str, object] = { + "approach": approach, + "n_sectors": int(len(grp)), + } + for metric in metrics: + values = big[metric] + row[f"{metric}__median"] = float(values.median()) + row[f"{metric}__p95"] = float(values.quantile(0.95)) + row[f"{metric}__weighted"] = float( + (values * weights).sum() / weights.sum() + if weights.sum() > 0 + else np.nan + ) + rows.append(row) + cols = ["approach", "n_sectors"] + [ + f"{m}__{r}" for m in metrics for r in ("median", "p95", "weighted") + ] + ranking = pd.DataFrame(rows, columns=pd.Index(cols)) + return ranking.sort_values("mean_abs_yoy_pct__weighted").reset_index(drop=True) + + +def _select_head_sectors( + per_sector: pd.DataFrame, + cumulative_share: float = LINE_PLOT_CUMULATIVE_SHARE, + max_sectors: int = LINE_PLOT_MAX_SECTORS, +) -> list[str]: + """Return the smallest set of sectors covering ``cumulative_share`` of total |mean_N|. + + Across approaches, take the per-sector ``|mean_N|`` averaged over methods, + sort descending, and accumulate until coverage hits the threshold (capped + by ``max_sectors``). These are the lines that actually move + corporate-footprint outcomes. + """ + avg_abs_mean = ( + per_sector.groupby("sector")["mean_N"].mean().abs().sort_values(ascending=False) + ) + total = float(avg_abs_mean.sum()) + if total <= 0: + return list(avg_abs_mean.head(max_sectors).index) + cum = avg_abs_mean.cumsum() / total + head = avg_abs_mean[cum <= cumulative_share] + # Always include the next sector that pushes us across the threshold. + if len(head) < len(avg_abs_mean): + head = avg_abs_mean.iloc[: len(head) + 1] + return list(head.head(max_sectors).index) + + +def _indexed_lines_plot( + panel: pd.DataFrame, + per_sector: pd.DataFrame, + out_path: Path, +) -> None: + """Head-sector indexed (2019=100) line plot, faceted by method.""" + approaches = sorted(panel["approach"].unique()) + head_sectors = _select_head_sectors(per_sector) + head_share = ( + per_sector[per_sector["sector"].isin(head_sectors)] + .groupby("sector")["mean_N"] + .mean() + .abs() + .sum() + / per_sector.groupby("sector")["mean_N"].mean().abs().sum() + ) + cmap = plt.get_cmap("tab10") + color_by_sector = {s: cmap(i % 10) for i, s in enumerate(head_sectors)} + + n = len(approaches) + fig, axes = plt.subplots(1, n, figsize=(5 * n, 5.5), sharey=True) + if n == 1: + axes = np.array([axes]) + for ax, approach in zip(axes, approaches): + sub = ta.cast( + "pd.DataFrame", + panel[ + (panel["approach"] == approach) + & panel["sector"].isin(head_sectors) + ], + ) + for sector in head_sectors: + sg = ta.cast( + "pd.DataFrame", sub[sub["sector"] == sector] + ).sort_values("year") + if sg.empty or sg["year"].min() != YEARS[0]: + continue + base = sg.loc[sg["year"] == YEARS[0], "N_new_ref"].iloc[0] + if base == 0 or pd.isna(base): + continue + indexed = sg["N_new_ref"] / base * 100 + ax.plot( + sg["year"], + indexed, + marker="o", + label=sector, + color=color_by_sector[sector], + ) + ax.axhline(100, color="black", linestyle=":", linewidth=1, alpha=0.6) + ax.set_title(approach, fontsize=14) + ax.set_xlabel("Year") + ax.set_xticks(list(YEARS)) + ax.set_xticklabels([str(y) for y in YEARS]) + ax.grid(alpha=0.3) + axes[0].set_ylabel("N indexed (2019 = 100)") + handles, labels = axes[0].get_legend_handles_labels() + fig.legend( + handles, + labels, + loc="center right", + fontsize=8, + bbox_to_anchor=(1.05, 0.5), + title="sector", + ) + fig.suptitle( + f"Head sectors covering {head_share:.0%} of |mean_N| " + f"(n={len(head_sectors)}), N rebased to 2019=100, by A-matrix method", + fontsize=14, + ) + fig.tight_layout() + out_path.parent.mkdir(parents=True, exist_ok=True) + fig.savefig(out_path, dpi=120, bbox_inches="tight") + plt.close(fig) + + +def _yoy_distribution_plot( + per_sector: pd.DataFrame, out_path: Path +) -> None: + """Boxplot of per-sector |YoY %| distributions, one box per (method, transition).""" + approaches = sorted(per_sector["approach"].unique()) + cutoff = per_sector["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) + big = ta.cast( + "pd.DataFrame", per_sector[per_sector["mean_N"].abs() >= cutoff] + ) + + fig, axes = plt.subplots(1, 2, figsize=(14, 5.5)) + # Left: boxplot of mean_abs_yoy_pct per method. + ax = axes[0] + data = [big.loc[big["approach"] == a, "mean_abs_yoy_pct"].dropna() for a in approaches] + ax.boxplot(data, tick_labels=approaches, showfliers=False) + ax.set_title("Per-sector mean |YoY %|", fontsize=13) + ax.set_ylabel("|YoY %| (lower = more stable)") + ax.grid(axis="y", alpha=0.3) + + # Right: per-transition |YoY %|, grouped boxes per method. + ax = axes[1] + transition_labels = [f"{y0}→{y1}" for y0, y1 in YOY_TRANSITIONS] + n_methods = len(approaches) + width = 0.8 / n_methods + for i, approach in enumerate(approaches): + sub = big[big["approach"] == approach] + per_transition = [ + sub[f"yoy_{y0}_{y1}"].abs().dropna() for y0, y1 in YOY_TRANSITIONS + ] + positions = [j + (i - (n_methods - 1) / 2) * width for j in range(len(YOY_TRANSITIONS))] + bp = ax.boxplot( + per_transition, + positions=positions, + widths=width * 0.9, + patch_artist=True, + showfliers=False, + ) + color = plt.get_cmap("tab10")(i) + for patch in bp["boxes"]: + patch.set_facecolor(color) + patch.set_alpha(0.6) + ax.plot([], [], color=color, label=approach, linewidth=8, alpha=0.6) + ax.set_xticks(range(len(YOY_TRANSITIONS))) + ax.set_xticklabels(transition_labels) + ax.set_title("|YoY %| per transition, by method", fontsize=13) + ax.set_ylabel("|YoY %|") + ax.legend(loc="upper right", fontsize=9) + ax.grid(axis="y", alpha=0.3) + + fig.suptitle( + "Year-over-year fluctuation in N across A-matrix methods", fontsize=15 + ) + fig.tight_layout() + out_path.parent.mkdir(parents=True, exist_ok=True) + fig.savefig(out_path, dpi=120, bbox_inches="tight") + plt.close(fig) + + +def _print_summary(ranking: pd.DataFrame, per_sector: pd.DataFrame) -> None: + print("\n=== YoY stability ranking (lower = more stable) ===") + cols_show = [ + "approach", + "mean_abs_yoy_pct__weighted", + "mean_abs_yoy_pct__median", + "max_abs_yoy_pct__weighted", + "abs_total_drift_pct__weighted", + ] + print(ranking[cols_show].round(4).to_string(index=False)) + + print("\n=== Top-5 most-fluctuating big-N sectors per method ===") + cutoff = per_sector["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) + big = ta.cast( + "pd.DataFrame", per_sector[per_sector["mean_N"].abs() >= cutoff] + ) + for approach in sorted(big["approach"].unique()): + grp = ta.cast("pd.DataFrame", big[big["approach"] == approach]) + worst = ta.cast( + "pd.DataFrame", grp.nlargest(n=5, columns="mean_abs_yoy_pct") + )[["sector", "mean_N", "mean_abs_yoy_pct", "max_abs_yoy_pct", "total_drift_pct"]] + print(f"\n[{approach}]") + print(worst.round(4).to_string(index=False)) + + +def main() -> None: + panel = _read_panel(EF_COMPARISON_XLSX_PATH) + per_sector = _yoy_per_sector(panel) + ranking = _aggregate(per_sector) + + RESULTS_DIR.mkdir(parents=True, exist_ok=True) + PLOTS_DIR.mkdir(parents=True, exist_ok=True) + + ranking.to_csv(YOY_RANKING_PATH, index=False) + per_sector.to_csv(YOY_PER_SECTOR_PATH, index=False) + _indexed_lines_plot(panel, per_sector, INDEXED_LINES_PLOT_PATH) + _yoy_distribution_plot(per_sector, YOY_DISTRIBUTION_PLOT_PATH) + + _print_summary(ranking, per_sector) + print(f"\nWrote: {YOY_RANKING_PATH}") + print(f"Wrote: {YOY_PER_SECTOR_PATH}") + print(f"Wrote: {INDEXED_LINES_PLOT_PATH}") + print(f"Wrote: {YOY_DISTRIBUTION_PLOT_PATH}") + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO, format="%(message)s") + main() diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index 0b5a48d3..61b9a095 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -228,7 +228,9 @@ def main() -> None: continue if year: joined = _deflate_new_to_ref( - joined, source_year=int(year), ref_year=REFERENCE_DOLLAR_YEAR + joined, + source_year=int(float(year)), + ref_year=REFERENCE_DOLLAR_YEAR, ) # Build a deterministic 31-char-bounded tab name including any # populated scenario/year prefix. From 627fb5bdb4bc834a4b2508f4ce804fdeb1893f93 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 22:26:22 -0700 Subject: [PATCH 23/25] fix(analysis): drop redundant ta.cast calls in compile script mypy flags ta.cast as redundant since pd.to_numeric/concat/__getitem__ return inferable types. The casts were added to placate Pyright, which isn't a CI check. Switching back to no-cast satisfies mypy + black; ruff unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../compile_ef_diagnostics.py | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index 72dec847..0b5a48d3 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -30,7 +30,6 @@ from __future__ import annotations import logging -import typing as ta import pandas as pd @@ -83,9 +82,7 @@ def _coerce_numeric(df: pd.DataFrame, cols: tuple[str, ...]) -> pd.DataFrame: s = df[col].astype(str).str.strip() is_pct = s.str.endswith("%") cleaned = s.str.rstrip("%").str.replace(",", "", regex=False) - numeric = ta.cast( - "pd.Series", pd.to_numeric(cleaned, errors="coerce") - ) + numeric = pd.to_numeric(cleaned, errors="coerce") df[col] = numeric.mask(is_pct, numeric / 100) return df @@ -123,9 +120,8 @@ def _deflate_new_to_ref( for new_col, ref_col in (("D_new", "D_new_ref"), ("N_new", "N_new_ref")): if new_col not in joined.columns: continue - col_series = ta.cast("pd.Series", joined[new_col]).astype(float) joined[ref_col] = inflation_adjust_ef_denom_to_new_base_year( - old_ef_vector=col_series, + old_ef_vector=joined[new_col].astype(float), new_base_year=ref_year, old_base_year=source_year, ) @@ -169,7 +165,7 @@ def _scatter_coords(joined: pd.DataFrame, approach: str, baseline: str) -> pd.Da rows.append(chunk) if not rows: return pd.DataFrame() - combined = ta.cast("pd.DataFrame", pd.concat(rows, ignore_index=True)) + combined = pd.concat(rows, ignore_index=True) return combined.loc[ :, ["approach", "baseline", "ef_kind", "sector", "x_baseline", "y_approach"], @@ -213,14 +209,8 @@ def main() -> None: approach = str(row["approach"]) baseline = str(row["baseline"]) sheet_id = str(row["sheet_id"]) - scenario = ( - str(row["scenario"]) - if ta.cast(bool, pd.notna(row["scenario"])) - else "" - ) - year = ( - str(row["year"]) if ta.cast(bool, pd.notna(row["year"])) else "" - ) + scenario = str(row["scenario"]) if pd.notna(row["scenario"]) else "" + year = str(row["year"]) if pd.notna(row["year"]) else "" cell_label = ", ".join( f"{k}={v}" for k, v in ( From 10ecba4504cf95c77f29a44c2364d370635a9b55 Mon Sep 17 00:00:00 2001 From: Mo Li Date: Tue, 5 May 2026 22:28:24 -0700 Subject: [PATCH 24/25] fix(analysis): drop redundant ta.cast calls + coerce sheet_names to str - Removed 6 redundant casts that mypy flagged. The casts placated Pyright but mypy infers the same types without them. - pd.ExcelFile.sheet_names is typed as list[int|str]; explicitly str() the tab name before passing to _parse_tab and pd.read_excel. - Apply black formatting. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../compare_method_stability.py | 78 +++++++++---------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/bedrock/analysis/a_matrix_time_series/compare_method_stability.py b/bedrock/analysis/a_matrix_time_series/compare_method_stability.py index 1b2a6f61..a3cec72b 100644 --- a/bedrock/analysis/a_matrix_time_series/compare_method_stability.py +++ b/bedrock/analysis/a_matrix_time_series/compare_method_stability.py @@ -34,7 +34,6 @@ import logging import re -import typing as ta from pathlib import Path import matplotlib.pyplot as plt @@ -56,9 +55,7 @@ # `compile_ef_diagnostics.py` keys per-pair tabs as # `{scenario}_{year}.0_{approach}__vs_{baseline}` truncated to 31 chars. -TAB_RE = re.compile( - r"^(?P[a-z0-9_]+?)_(?P\d{4})(?:\.0)?_(?P.+)$" -) +TAB_RE = re.compile(r"^(?P[a-z0-9_]+?)_(?P\d{4})(?:\.0)?_(?P.+)$") APPROACH_PREFIXES: tuple[tuple[str, str], ...] = ( ("commodity_pr", "commodity_price_index"), ("industry_pri", "industry_price_index"), @@ -109,18 +106,19 @@ def _read_panel(xlsx_path: Path) -> pd.DataFrame: xls = pd.ExcelFile(xlsx_path) rows: list[pd.DataFrame] = [] for tab in xls.sheet_names: - parsed = _parse_tab(tab) + tab_str = str(tab) + parsed = _parse_tab(tab_str) if parsed is None: continue scenario, year, approach = parsed if approach in EXCLUDED_APPROACHES: continue - df = pd.read_excel(xls, sheet_name=tab) + df = pd.read_excel(xls, sheet_name=tab_str) if "N_new_ref" not in df.columns: logger.warning( "Tab %r missing N_new_ref — re-run compile after the deflation " "step was added.", - tab, + tab_str, ) continue sector_col = df.columns[0] @@ -153,7 +151,7 @@ def _yoy_per_sector(panel: pd.DataFrame) -> pd.DataFrame: for y in YEARS: if y not in wide.columns: wide[y] = np.nan - wide = ta.cast("pd.DataFrame", wide[list(YEARS)]) + wide = wide[list(YEARS)] wide.columns = pd.Index([f"N_{y}" for y in YEARS]) wide = wide.reset_index() @@ -169,9 +167,9 @@ def _yoy_per_sector(panel: pd.DataFrame) -> pd.DataFrame: abs_yoy = wide[yoy_cols].abs() wide["mean_abs_yoy_pct"] = abs_yoy.mean(axis=1) wide["max_abs_yoy_pct"] = abs_yoy.max(axis=1) - wide["total_drift_pct"] = ( - wide[f"N_{YEARS[-1]}"] - wide[f"N_{YEARS[0]}"] - ) / wide[f"N_{YEARS[0]}"].abs() + wide["total_drift_pct"] = (wide[f"N_{YEARS[-1]}"] - wide[f"N_{YEARS[0]}"]) / wide[ + f"N_{YEARS[0]}" + ].abs() wide["abs_total_drift_pct"] = wide["total_drift_pct"].abs() wide["mean_N"] = wide[[f"N_{y}" for y in YEARS]].mean(axis=1) return wide @@ -182,11 +180,9 @@ def _aggregate(per_sector: pd.DataFrame) -> pd.DataFrame: metrics = ("mean_abs_yoy_pct", "max_abs_yoy_pct", "abs_total_drift_pct") rows: list[dict[str, object]] = [] for approach in sorted(per_sector["approach"].unique()): - grp = ta.cast( - "pd.DataFrame", per_sector[per_sector["approach"] == approach] - ) + grp = per_sector[per_sector["approach"] == approach] cutoff = grp["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) - big = ta.cast("pd.DataFrame", grp[grp["mean_N"].abs() >= cutoff]) + big = grp[grp["mean_N"].abs() >= cutoff] weights = big["mean_N"].abs() row: dict[str, object] = { "approach": approach, @@ -259,17 +255,11 @@ def _indexed_lines_plot( if n == 1: axes = np.array([axes]) for ax, approach in zip(axes, approaches): - sub = ta.cast( - "pd.DataFrame", - panel[ - (panel["approach"] == approach) - & panel["sector"].isin(head_sectors) - ], - ) + sub = panel[ + (panel["approach"] == approach) & panel["sector"].isin(head_sectors) + ] for sector in head_sectors: - sg = ta.cast( - "pd.DataFrame", sub[sub["sector"] == sector] - ).sort_values("year") + sg = sub[sub["sector"] == sector].sort_values("year") if sg.empty or sg["year"].min() != YEARS[0]: continue base = sg.loc[sg["year"] == YEARS[0], "N_new_ref"].iloc[0] @@ -310,20 +300,18 @@ def _indexed_lines_plot( plt.close(fig) -def _yoy_distribution_plot( - per_sector: pd.DataFrame, out_path: Path -) -> None: +def _yoy_distribution_plot(per_sector: pd.DataFrame, out_path: Path) -> None: """Boxplot of per-sector |YoY %| distributions, one box per (method, transition).""" approaches = sorted(per_sector["approach"].unique()) cutoff = per_sector["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) - big = ta.cast( - "pd.DataFrame", per_sector[per_sector["mean_N"].abs() >= cutoff] - ) + big = per_sector[per_sector["mean_N"].abs() >= cutoff] fig, axes = plt.subplots(1, 2, figsize=(14, 5.5)) # Left: boxplot of mean_abs_yoy_pct per method. ax = axes[0] - data = [big.loc[big["approach"] == a, "mean_abs_yoy_pct"].dropna() for a in approaches] + data = [ + big.loc[big["approach"] == a, "mean_abs_yoy_pct"].dropna() for a in approaches + ] ax.boxplot(data, tick_labels=approaches, showfliers=False) ax.set_title("Per-sector mean |YoY %|", fontsize=13) ax.set_ylabel("|YoY %| (lower = more stable)") @@ -339,7 +327,9 @@ def _yoy_distribution_plot( per_transition = [ sub[f"yoy_{y0}_{y1}"].abs().dropna() for y0, y1 in YOY_TRANSITIONS ] - positions = [j + (i - (n_methods - 1) / 2) * width for j in range(len(YOY_TRANSITIONS))] + positions = [ + j + (i - (n_methods - 1) / 2) * width for j in range(len(YOY_TRANSITIONS)) + ] bp = ax.boxplot( per_transition, positions=positions, @@ -359,9 +349,7 @@ def _yoy_distribution_plot( ax.legend(loc="upper right", fontsize=9) ax.grid(axis="y", alpha=0.3) - fig.suptitle( - "Year-over-year fluctuation in N across A-matrix methods", fontsize=15 - ) + fig.suptitle("Year-over-year fluctuation in N across A-matrix methods", fontsize=15) fig.tight_layout() out_path.parent.mkdir(parents=True, exist_ok=True) fig.savefig(out_path, dpi=120, bbox_inches="tight") @@ -381,14 +369,18 @@ def _print_summary(ranking: pd.DataFrame, per_sector: pd.DataFrame) -> None: print("\n=== Top-5 most-fluctuating big-N sectors per method ===") cutoff = per_sector["mean_N"].abs().quantile(MIN_MEAN_PERCENTILE / 100) - big = ta.cast( - "pd.DataFrame", per_sector[per_sector["mean_N"].abs() >= cutoff] - ) + big = per_sector[per_sector["mean_N"].abs() >= cutoff] for approach in sorted(big["approach"].unique()): - grp = ta.cast("pd.DataFrame", big[big["approach"] == approach]) - worst = ta.cast( - "pd.DataFrame", grp.nlargest(n=5, columns="mean_abs_yoy_pct") - )[["sector", "mean_N", "mean_abs_yoy_pct", "max_abs_yoy_pct", "total_drift_pct"]] + grp = big[big["approach"] == approach] + worst = grp.nlargest(n=5, columns="mean_abs_yoy_pct")[ + [ + "sector", + "mean_N", + "mean_abs_yoy_pct", + "max_abs_yoy_pct", + "total_drift_pct", + ] + ] print(f"\n[{approach}]") print(worst.round(4).to_string(index=False)) From 1a0b35c00b0c7684bec3d3b2844b3aedc02f7b86 Mon Sep 17 00:00:00 2001 From: WesIngwersen Date: Tue, 12 May 2026 16:53:48 -0400 Subject: [PATCH 25/25] wrap float for source_year in int() to fix error --- bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py index 0b5a48d3..e025e95b 100644 --- a/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py +++ b/bedrock/analysis/a_matrix_time_series/compile_ef_diagnostics.py @@ -228,7 +228,7 @@ def main() -> None: continue if year: joined = _deflate_new_to_ref( - joined, source_year=int(year), ref_year=REFERENCE_DOLLAR_YEAR + joined, source_year=int(float(year)), ref_year=REFERENCE_DOLLAR_YEAR ) # Build a deterministic 31-char-bounded tab name including any # populated scenario/year prefix.

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